feat: Summary UI improvements + PDF fix - Swap short/long labels on summary length slider (RTL: long left, short right) - Remove 'تلخيص النص كاملاً' checkbox and button - Replace single export button with dropdown (TXT/DOCX/PDF) in summary - Hide format toolbar when on summary tab, show on writing tab - Fix PDF export freeze: use foreignObjectRendering:false + lower scale - Add loading toast during PDF export - Add summary DOCX and PDF export functions
18fcb1a | // Document management — UI wiring and initialization | |
| function initDocuments() { | |
| const importBtn = document.getElementById('doc-import-btn'); | |
| const importInput = document.getElementById('doc-import-input'); | |
| const exportTrigger = document.getElementById('doc-export-trigger'); | |
| const exportMenu = document.getElementById('doc-export-menu'); | |
| const mobileExportTrigger = document.getElementById('doc-mobile-export-trigger'); | |
| const exportSheet = document.getElementById('doc-export-sheet'); | |
| if (importBtn && importInput) { | |
| importBtn.addEventListener('click', () => importInput.click()); | |
| importInput.addEventListener('change', (e) => { | |
| const file = e.target.files && e.target.files[0]; | |
| if (file) handleImportFile(file); | |
| importInput.value = ''; | |
| }); | |
| } | |
| if (exportTrigger && exportMenu) { | |
| exportTrigger.addEventListener('click', (e) => { | |
| e.stopPropagation(); | |
| const open = exportMenu.classList.toggle('is-open'); | |
| exportTrigger.setAttribute('aria-expanded', open ? 'true' : 'false'); | |
| }); | |
| exportMenu.querySelectorAll('[data-export-format]').forEach((item) => { | |
| item.addEventListener('click', (e) => { | |
| e.stopPropagation(); | |
| const format = item.dataset.exportFormat; | |
| closeExportMenu(); | |
| if (format === 'txt') exportTxtFile(); | |
| else if (format === 'docx') exportDocxFile(); | |
| else if (format === 'pdf') exportPdfFile(); | |
| }); | |
| }); | |
| } | |
| // Summary export dropdown | |
| const summExportTrigger = document.getElementById('summary-export-trigger'); | |
| const summExportMenu = document.getElementById('summary-export-menu'); | |
| if (summExportTrigger && summExportMenu) { | |
| summExportTrigger.addEventListener('click', (e) => { | |
| e.stopPropagation(); | |
| const open = summExportMenu.classList.toggle('is-open'); | |
| summExportTrigger.setAttribute('aria-expanded', open ? 'true' : 'false'); | |
| }); | |
| } | |
| if (mobileExportTrigger && exportSheet) { | |
| mobileExportTrigger.addEventListener('click', () => { | |
| exportSheet.classList.add('open'); | |
| exportSheet.setAttribute('aria-hidden', 'false'); | |
| mobileExportTrigger.setAttribute('aria-expanded', 'true'); | |
| }); | |
| const backdrop = document.getElementById('doc-export-sheet-backdrop'); | |
| const closeBtn = document.getElementById('doc-export-sheet-close'); | |
| const close = () => { | |
| exportSheet.classList.remove('open'); | |
| exportSheet.setAttribute('aria-hidden', 'true'); | |
| mobileExportTrigger.setAttribute('aria-expanded', 'false'); | |
| }; | |
| if (backdrop) backdrop.addEventListener('click', close); | |
| if (closeBtn) closeBtn.addEventListener('click', close); | |
| exportSheet.querySelectorAll('[data-export-format]').forEach((item) => { | |
| item.addEventListener('click', () => { | |
| const format = item.dataset.exportFormat; | |
| close(); | |
| if (format === 'txt') exportTxtFile(); | |
| else if (format === 'docx') exportDocxFile(); | |
| else if (format === 'pdf') exportPdfFile(); | |
| }); | |
| }); | |
| } | |
| document.addEventListener('click', () => closeExportMenu()); | |
| document.addEventListener('keydown', (e) => { | |
| if (e.key === 'Escape') { | |
| closeExportMenu(); | |
| const sheet = document.getElementById('doc-export-sheet'); | |
| if (sheet && sheet.classList.contains('open')) { | |
| sheet.classList.remove('open'); | |
| sheet.setAttribute('aria-hidden', 'true'); | |
| const mobileTrigger = document.getElementById('doc-mobile-export-trigger'); | |
| if (mobileTrigger) mobileTrigger.setAttribute('aria-expanded', 'false'); | |
| } | |
| } | |
| }); | |
| const editor = getEditorElement(); | |
| if (editor) { | |
| editor.addEventListener('input', () => { | |
| updateExportButtonStates(); | |
| }); | |
| } | |
| updateExportButtonStates(); | |
| } | |
| function closeExportMenu() { | |
| const menu = document.getElementById('doc-export-menu'); | |
| const trigger = document.getElementById('doc-export-trigger'); | |
| if (menu) menu.classList.remove('is-open'); | |
| if (trigger) trigger.setAttribute('aria-expanded', 'false'); | |
| // Also close summary export menu | |
| const summMenu = document.getElementById('summary-export-menu'); | |
| const summTrigger = document.getElementById('summary-export-trigger'); | |
| if (summMenu) summMenu.classList.remove('is-open'); | |
| if (summTrigger) summTrigger.setAttribute('aria-expanded', 'false'); | |
| } | |