// js/ui/reference-manager-ui.js // 参考文献管理UI (function(global) { 'use strict'; /** * 参考文献管理UI类 */ class ReferenceManagerUI { constructor() { this.currentDocumentId = null; this.references = []; this.filteredReferences = []; this.selectedReferences = new Set(); this.sortColumn = 'index'; this.sortDirection = 'asc'; } /** * 初始化UI */ initialize() { this.createManagerModal(); this.attachEventListeners(); console.log('[ReferenceManagerUI] Initialized.'); } /** * 创建管理界面模态框 */ createManagerModal() { const modal = document.createElement('div'); modal.id = 'reference-manager-modal'; modal.className = 'reference-modal'; modal.innerHTML = `
`; document.body.appendChild(modal); } /** * 创建编辑模态框 */ createEditModal() { const modal = document.createElement('div'); modal.id = 'reference-edit-modal'; modal.className = 'reference-modal'; modal.innerHTML = ` `; document.body.appendChild(modal); } /** * 绑定事件监听 */ attachEventListeners() { // 关闭按钮 document.addEventListener('click', (e) => { if (e.target.classList.contains('reference-modal-close') || e.target.id === 'ref-close-btn') { this.closeManager(); } }); // 提取文献 document.getElementById('ref-extract-btn')?.addEventListener('click', () => { this.extractReferences(); }); // 丰富元数据 document.getElementById('ref-enrich-doi-btn')?.addEventListener('click', () => { this.enrichMetadata(); }); // 配置元数据更新策略 document.getElementById('ref-enrich-config-btn')?.addEventListener('click', () => { this.showEnrichmentConfigModal(); }); // 添加文献 document.getElementById('ref-add-btn')?.addEventListener('click', () => { this.showEditModal(); }); // 导出 document.getElementById('ref-export-btn')?.addEventListener('click', () => { this.showExportMenu(); }); // 搜索 document.getElementById('ref-search-input')?.addEventListener('input', (e) => { this.filterReferences(e.target.value); }); // 筛选 document.getElementById('ref-filter-select')?.addEventListener('change', (e) => { this.applyFilter(e.target.value); }); // 全选 document.getElementById('ref-select-all')?.addEventListener('change', (e) => { this.toggleSelectAll(e.target.checked); }); // 批量删除 document.getElementById('ref-batch-delete-btn')?.addEventListener('click', () => { this.batchDelete(); }); // 表格排序 document.querySelectorAll('[data-sort]').forEach(th => { th.addEventListener('click', () => { this.sortTable(th.dataset.sort); }); }); } /** * 显示管理界面 * @param {string} documentId - 文档ID */ async show(documentId) { this.currentDocumentId = documentId; await this.loadReferences(); const modal = document.getElementById('reference-manager-modal'); if (modal) { modal.style.display = 'flex'; // 锁定背景滚动,避免模态框打开时页面抖动 this._prevBodyOverflow = document.body.style.overflow; document.body.style.overflow = 'hidden'; } } /** * 关闭管理界面 */ closeManager() { const modal = document.getElementById('reference-manager-modal'); if (modal) { modal.style.display = 'none'; } if (this._prevBodyOverflow !== undefined) { document.body.style.overflow = this._prevBodyOverflow; this._prevBodyOverflow = undefined; } } /** * 加载文献数据 */ async loadReferences() { if (!this.currentDocumentId) return; const data = await global.ReferenceStorage.loadReferences(this.currentDocumentId); if (data && data.references) { this.references = data.references; this.filteredReferences = [...this.references]; this.renderTable(); this.updateStats(); } } /** * 渲染表格 */ renderTable() { const tbody = document.getElementById('ref-table-body'); if (!tbody) return; if (this.filteredReferences.length === 0) { tbody.innerHTML = `