@visactor/vtable-sheet 1.22.13-alpha.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/cjs/components/sheet-tab-event-handler.js +1 -1
  2. package/cjs/components/sheet-tab-event-handler.js.map +1 -1
  3. package/cjs/components/vtable-sheet.d.ts +18 -12
  4. package/cjs/components/vtable-sheet.js +77 -48
  5. package/cjs/components/vtable-sheet.js.map +1 -1
  6. package/cjs/core/WorkSheet.d.ts +12 -7
  7. package/cjs/core/WorkSheet.js +38 -67
  8. package/cjs/core/WorkSheet.js.map +1 -1
  9. package/cjs/core/table-plugins.d.ts +1 -1
  10. package/cjs/core/table-plugins.js +45 -24
  11. package/cjs/core/table-plugins.js.map +1 -1
  12. package/cjs/event/base-event-manager.d.ts +21 -0
  13. package/cjs/event/base-event-manager.js +58 -0
  14. package/cjs/event/base-event-manager.js.map +1 -0
  15. package/cjs/event/dom-event-manager.d.ts +10 -0
  16. package/cjs/event/dom-event-manager.js +31 -0
  17. package/cjs/event/dom-event-manager.js.map +1 -0
  18. package/cjs/event/event-interfaces.d.ts +46 -0
  19. package/cjs/event/event-interfaces.js +6 -0
  20. package/cjs/event/event-interfaces.js.map +1 -0
  21. package/cjs/event/event-performance.d.ts +20 -0
  22. package/cjs/event/event-performance.js +94 -0
  23. package/cjs/event/event-performance.js.map +1 -0
  24. package/cjs/event/event-validator.d.ts +10 -0
  25. package/cjs/event/event-validator.js +78 -0
  26. package/cjs/event/event-validator.js.map +1 -0
  27. package/cjs/event/formula-event-utils.d.ts +30 -0
  28. package/cjs/event/formula-event-utils.js +69 -0
  29. package/cjs/event/formula-event-utils.js.map +1 -0
  30. package/cjs/event/index.d.ts +9 -0
  31. package/cjs/event/index.js +78 -0
  32. package/cjs/event/index.js.map +1 -0
  33. package/cjs/event/spreadsheet-event-manager.d.ts +27 -0
  34. package/cjs/event/spreadsheet-event-manager.js +143 -0
  35. package/cjs/event/spreadsheet-event-manager.js.map +1 -0
  36. package/cjs/event/table-event-relay.d.ts +30 -0
  37. package/cjs/event/table-event-relay.js +105 -0
  38. package/cjs/event/table-event-relay.js.map +1 -0
  39. package/cjs/event/vtable-sheet-event-bus.d.ts +23 -0
  40. package/cjs/event/vtable-sheet-event-bus.js +75 -0
  41. package/cjs/event/vtable-sheet-event-bus.js.map +1 -0
  42. package/cjs/event/worksheet-event-manager.d.ts +28 -0
  43. package/cjs/event/worksheet-event-manager.js +82 -0
  44. package/cjs/event/worksheet-event-manager.js.map +1 -0
  45. package/cjs/formula/formula-engine.js +7 -4
  46. package/cjs/formula/formula-engine.js.map +1 -1
  47. package/cjs/formula/formula-range-selector.d.ts +3 -3
  48. package/cjs/formula/formula-range-selector.js +4 -4
  49. package/cjs/formula/formula-range-selector.js.map +1 -1
  50. package/cjs/formula/index.js +1 -2
  51. package/cjs/index.d.ts +1 -1
  52. package/cjs/index.js +1 -1
  53. package/cjs/index.js.map +1 -1
  54. package/cjs/managers/formula-manager.d.ts +1 -0
  55. package/cjs/managers/formula-manager.js +33 -2
  56. package/cjs/managers/formula-manager.js.map +1 -1
  57. package/cjs/managers/menu-manager.d.ts +2 -0
  58. package/cjs/managers/menu-manager.js +32 -7
  59. package/cjs/managers/menu-manager.js.map +1 -1
  60. package/cjs/managers/sheet-manager.d.ts +4 -1
  61. package/cjs/managers/sheet-manager.js +40 -5
  62. package/cjs/managers/sheet-manager.js.map +1 -1
  63. package/cjs/managers/tab-drag-manager.js +2 -2
  64. package/cjs/managers/tab-drag-manager.js.map +1 -1
  65. package/cjs/sheet-helper.d.ts +11 -12
  66. package/cjs/sheet-helper.js +18 -23
  67. package/cjs/sheet-helper.js.map +1 -1
  68. package/cjs/styles/sheet-tab.js +2 -1
  69. package/cjs/ts-types/formula.js +1 -2
  70. package/cjs/ts-types/index.d.ts +1 -1
  71. package/cjs/ts-types/index.js +3 -3
  72. package/cjs/ts-types/index.js.map +1 -1
  73. package/cjs/ts-types/spreadsheet-events.d.ts +195 -0
  74. package/cjs/ts-types/spreadsheet-events.js +26 -0
  75. package/cjs/ts-types/spreadsheet-events.js.map +1 -0
  76. package/dist/vtable-sheet.js +1240 -366
  77. package/dist/vtable-sheet.min.js +1 -1
  78. package/es/components/sheet-tab-event-handler.js +1 -1
  79. package/es/components/sheet-tab-event-handler.js.map +1 -1
  80. package/es/components/vtable-sheet.d.ts +18 -12
  81. package/es/components/vtable-sheet.js +84 -51
  82. package/es/components/vtable-sheet.js.map +1 -1
  83. package/es/core/WorkSheet.d.ts +12 -7
  84. package/es/core/WorkSheet.js +38 -69
  85. package/es/core/WorkSheet.js.map +1 -1
  86. package/es/core/table-plugins.d.ts +1 -1
  87. package/es/core/table-plugins.js +45 -24
  88. package/es/core/table-plugins.js.map +1 -1
  89. package/es/event/base-event-manager.d.ts +21 -0
  90. package/es/event/base-event-manager.js +52 -0
  91. package/es/event/base-event-manager.js.map +1 -0
  92. package/es/event/dom-event-manager.d.ts +10 -0
  93. package/es/event/dom-event-manager.js +23 -0
  94. package/es/event/dom-event-manager.js.map +1 -0
  95. package/es/event/event-interfaces.d.ts +46 -0
  96. package/es/event/event-interfaces.js +2 -0
  97. package/es/event/event-interfaces.js.map +1 -0
  98. package/es/event/event-performance.d.ts +20 -0
  99. package/es/event/event-performance.js +86 -0
  100. package/es/event/event-performance.js.map +1 -0
  101. package/es/event/event-validator.d.ts +10 -0
  102. package/es/event/event-validator.js +70 -0
  103. package/es/event/event-validator.js.map +1 -0
  104. package/es/event/formula-event-utils.d.ts +30 -0
  105. package/es/event/formula-event-utils.js +61 -0
  106. package/es/event/formula-event-utils.js.map +1 -0
  107. package/es/event/index.d.ts +9 -0
  108. package/es/event/index.js +16 -0
  109. package/es/event/index.js.map +1 -0
  110. package/es/event/spreadsheet-event-manager.d.ts +27 -0
  111. package/es/event/spreadsheet-event-manager.js +137 -0
  112. package/es/event/spreadsheet-event-manager.js.map +1 -0
  113. package/es/event/table-event-relay.d.ts +30 -0
  114. package/es/event/table-event-relay.js +97 -0
  115. package/es/event/table-event-relay.js.map +1 -0
  116. package/es/event/vtable-sheet-event-bus.d.ts +23 -0
  117. package/es/event/vtable-sheet-event-bus.js +67 -0
  118. package/es/event/vtable-sheet-event-bus.js.map +1 -0
  119. package/es/event/worksheet-event-manager.d.ts +28 -0
  120. package/es/event/worksheet-event-manager.js +76 -0
  121. package/es/event/worksheet-event-manager.js.map +1 -0
  122. package/es/formula/formula-engine.js +7 -4
  123. package/es/formula/formula-engine.js.map +1 -1
  124. package/es/formula/formula-range-selector.d.ts +3 -3
  125. package/es/formula/formula-range-selector.js +5 -3
  126. package/es/formula/formula-range-selector.js.map +1 -1
  127. package/es/formula/index.js +1 -2
  128. package/es/index.d.ts +1 -1
  129. package/es/index.js +1 -1
  130. package/es/index.js.map +1 -1
  131. package/es/managers/formula-manager.d.ts +1 -0
  132. package/es/managers/formula-manager.js +33 -2
  133. package/es/managers/formula-manager.js.map +1 -1
  134. package/es/managers/menu-manager.d.ts +2 -0
  135. package/es/managers/menu-manager.js +32 -7
  136. package/es/managers/menu-manager.js.map +1 -1
  137. package/es/managers/sheet-manager.d.ts +4 -1
  138. package/es/managers/sheet-manager.js +39 -5
  139. package/es/managers/sheet-manager.js.map +1 -1
  140. package/es/managers/tab-drag-manager.js +2 -2
  141. package/es/managers/tab-drag-manager.js.map +1 -1
  142. package/es/sheet-helper.d.ts +11 -12
  143. package/es/sheet-helper.js +13 -16
  144. package/es/sheet-helper.js.map +1 -1
  145. package/es/styles/sheet-tab.js +2 -1
  146. package/es/ts-types/formula.js +1 -2
  147. package/es/ts-types/index.d.ts +1 -1
  148. package/es/ts-types/index.js +2 -2
  149. package/es/ts-types/index.js.map +1 -1
  150. package/es/ts-types/spreadsheet-events.d.ts +195 -0
  151. package/es/ts-types/spreadsheet-events.js +23 -0
  152. package/es/ts-types/spreadsheet-events.js.map +1 -0
  153. package/package.json +5 -5
  154. package/cjs/event/event-manager.d.ts +0 -28
  155. package/cjs/event/event-manager.js +0 -62
  156. package/cjs/event/event-manager.js.map +0 -1
  157. package/cjs/event/event-target.d.ts +0 -12
  158. package/cjs/event/event-target.js +0 -50
  159. package/cjs/event/event-target.js.map +0 -1
  160. package/cjs/ts-types/event.d.ts +0 -90
  161. package/cjs/ts-types/event.js +0 -11
  162. package/cjs/ts-types/event.js.map +0 -1
  163. package/cjs/ts-types/events.d.ts +0 -1
  164. package/cjs/ts-types/events.js +0 -1
  165. package/cjs/ts-types/events.js.map +0 -1
  166. package/es/event/event-manager.d.ts +0 -28
  167. package/es/event/event-manager.js +0 -54
  168. package/es/event/event-manager.js.map +0 -1
  169. package/es/event/event-target.d.ts +0 -12
  170. package/es/event/event-target.js +0 -42
  171. package/es/event/event-target.js.map +0 -1
  172. package/es/ts-types/event.d.ts +0 -90
  173. package/es/ts-types/event.js +0 -7
  174. package/es/ts-types/event.js.map +0 -1
  175. package/es/ts-types/events.d.ts +0 -1
  176. package/es/ts-types/events.js +0 -1
  177. package/es/ts-types/events.js.map +0 -1
@@ -111,7 +111,7 @@ class SheetTabEventHandler {
111
111
  const div = document.createElement("div");
112
112
  div.className = "vtable-sheet-menu-delete-button", div.innerHTML = '<svg class="x-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>',
113
113
  div.addEventListener("click", (e => {
114
- e.stopPropagation(), this.vTableSheet.removeSheet(sheet.sheetKey);
114
+ this.vTableSheet.removeSheet(sheet.sheetKey), e.stopPropagation();
115
115
  })), li.addEventListener("click", (() => this.vTableSheet.activateSheet(sheet.sheetKey))),
116
116
  li.appendChild(div), menuContainer.appendChild(li);
117
117
  })), this.activeSheetMenuItem(), setTimeout((() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/sheet-tab-event-handler.ts"],"names":[],"mappings":"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","file":"sheet-tab-event-handler.js","sourcesContent":["import type VTableSheet from './vtable-sheet';\nimport { showSnackbar } from '../tools/ui/snackbar';\nimport { checkTabTitle } from '../tools';\n\n/**\n * Sheet Tab Event Handler\n * 专门处理sheet标签页相关的事件逻辑\n */\nexport class SheetTabEventHandler {\n private vTableSheet: VTableSheet;\n\n constructor(vTableSheet: VTableSheet) {\n this.vTableSheet = vTableSheet;\n }\n\n /**\n * 处理sheet标签双击事件\n * 双击sheet标签后,将标签设为可编辑状态。输入完成后进行重命名。\n * @param sheetKey 工作表key\n * @param originalTitle 原始名称\n */\n handleSheetTabDblClick(sheetKey: string, originalTitle: string): void {\n const targetTab = this.getSheetTabElementByKey(sheetKey);\n if (!targetTab) {\n return;\n }\n // 将原文本节点设为可编辑\n targetTab.setAttribute('contenteditable', 'true');\n targetTab.setAttribute('spellcheck', 'false');\n targetTab.classList.add('editing'); // 添加编辑状态样式\n // 选中所有文本\n const range = document.createRange();\n range.selectNodeContents(targetTab);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n const onBlur = () => {\n finishInput(true);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n finishInput(true);\n } else if (e.key === 'Escape') {\n finishInput(false);\n }\n };\n const finishInput = (commit: boolean) => {\n targetTab.removeEventListener('blur', onBlur);\n targetTab.removeEventListener('keydown', onKeyDown);\n targetTab.classList.remove('editing');\n targetTab.setAttribute('contenteditable', 'false');\n const newTitle = targetTab.textContent?.trim();\n if (!commit || newTitle === originalTitle || !this.renameSheet(sheetKey, newTitle)) {\n targetTab.textContent = originalTitle;\n return;\n }\n };\n targetTab.addEventListener('blur', onBlur);\n targetTab.addEventListener('keydown', onKeyDown);\n }\n\n /**\n * 重命名sheet\n * @param sheetKey 工作表key\n * @param newTitle 新名称\n * @returns 是否成功\n */\n private renameSheet(sheetKey: string, newTitle: string): boolean {\n const sheet = this.vTableSheet.getSheetManager().getSheet(sheetKey);\n if (!sheet) {\n return false;\n }\n const error = checkTabTitle(newTitle);\n if (error) {\n showSnackbar(error, 1300);\n return false;\n }\n const isExist = this.vTableSheet\n .getSheetManager()\n .getAllSheets()\n .find(s => s.sheetKey !== sheetKey && s.sheetTitle.toLowerCase() === newTitle.toLowerCase());\n if (isExist) {\n showSnackbar('工作表名称已存在,请重新输入', 1300);\n return false;\n }\n this.vTableSheet.getSheetManager().renameSheet(sheetKey, newTitle);\n this.vTableSheet.workSheetInstances.get(sheetKey)?.setTitle(newTitle);\n\n // 更新公式引擎中的工作表标题映射\n this.vTableSheet.getFormulaManager().updateSheetTitle(sheetKey, newTitle);\n\n this.vTableSheet.updateSheetTabs();\n this.vTableSheet.updateSheetMenu();\n return true;\n }\n\n /**\n * 获取指定sheetKey的标签元素\n */\n private getSheetTabElementByKey(sheetKey: string): HTMLElement | null {\n const tabsContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-tabs-container') as HTMLElement;\n return tabsContainer?.querySelector(`.vtable-sheet-tab[data-key=\"${sheetKey}\"]`) as HTMLElement;\n }\n\n /**\n * 激活sheet标签并滚动到可见区域\n */\n activeSheetTab(): void {\n const tabs = this.vTableSheet\n .getSheetTabElement()\n ?.querySelectorAll('.vtable-sheet-tab') as NodeListOf<HTMLElement>;\n let activeTab: HTMLElement | null = null;\n tabs.forEach(tab => {\n tab.classList.remove('active');\n if (tab.dataset.key === this.vTableSheet.getActiveSheet()?.getKey()) {\n tab.classList.add('active');\n activeTab = tab;\n }\n });\n // 确保激活的标签可见\n setTimeout(() => {\n if (activeTab) {\n activeTab.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 更新渐变效果\n * @param tabsContainer 标签容器\n * @param fadeLeft 左侧渐变效果\n * @param fadeRight 右侧渐变效果\n */\n updateFadeEffects(tabsContainer: HTMLElement, fadeLeft: HTMLElement, fadeRight: HTMLElement): void {\n // 显示/隐藏左侧渐变\n if (tabsContainer.scrollLeft > 10) {\n fadeLeft.style.display = 'block';\n } else {\n fadeLeft.style.display = 'none';\n }\n\n // 显示/隐藏右侧渐变\n const maxScroll = tabsContainer.scrollWidth - tabsContainer.clientWidth;\n if (tabsContainer.scrollLeft < maxScroll - 10) {\n fadeRight.style.display = 'block';\n } else {\n fadeRight.style.display = 'none';\n }\n }\n\n /**\n * 滚动sheet标签\n * @param direction 滚动方向\n * @param tabsContainer 标签容器\n */\n scrollSheetTabs(direction: 'left' | 'right', tabsContainer: HTMLElement): void {\n const scrollAmount = 200; // 每次滚动的像素数\n const currentScroll = tabsContainer.scrollLeft;\n\n if (direction === 'left') {\n tabsContainer.scrollTo({\n left: Math.max(0, currentScroll - scrollAmount),\n behavior: 'smooth'\n });\n } else {\n tabsContainer.scrollTo({\n left: currentScroll + scrollAmount,\n behavior: 'smooth'\n });\n }\n }\n\n /**\n * 滚动以确保标签可见\n * @param tab 标签\n * @param container 容器\n */\n scrollTabIntoView(tab: HTMLElement, container: HTMLElement): void {\n const tabRect = tab.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n\n if (tabRect.left < containerRect.left) {\n // 标签在可见区域左侧\n container.scrollLeft += tabRect.left - containerRect.left - 10;\n } else if (tabRect.right > containerRect.right) {\n // 标签在可见区域右侧\n container.scrollLeft += tabRect.right - containerRect.right + 10;\n }\n }\n\n /**\n * 显示工作表菜单\n */\n toggleSheetMenu(event: MouseEvent): void {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.classList.toggle('active');\n\n // 如果菜单被打开,添加点击外部关闭的监听器\n if (menuContainer.classList.contains('active')) {\n this.addClickOutsideListener();\n } else {\n this.removeClickOutsideListener();\n }\n }\n\n /**\n * 添加点击外部关闭菜单的监听器\n */\n private clickOutsideHandler = (event: MouseEvent): void => {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n const menuButton = this.vTableSheet.getSheetTabElement()?.querySelector('.vtable-sheet-menu-button') as HTMLElement;\n\n // 如果点击的不是菜单容器和菜单按钮,则关闭菜单\n if (\n menuContainer &&\n menuButton &&\n !menuContainer.contains(event.target as Node) &&\n !menuButton.contains(event.target as Node)\n ) {\n menuContainer.classList.remove('active');\n this.removeClickOutsideListener();\n }\n };\n\n /**\n * 添加点击外部监听器\n */\n addClickOutsideListener(): void {\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n /**\n * 移除点击外部监听器\n */\n removeClickOutsideListener(): void {\n document.removeEventListener('click', this.clickOutsideHandler);\n }\n\n /**\n * 更新sheet列表\n */\n updateSheetMenu(): void {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.innerHTML = '';\n const sheets = this.vTableSheet.getSheetManager().getAllSheets();\n sheets.forEach(sheet => {\n // li\n const li = document.createElement('li');\n li.className = 'vtable-sheet-menu-item';\n li.dataset.key = sheet.sheetKey;\n // title\n const title = document.createElement('span');\n title.className = 'vtable-sheet-menu-item-title';\n title.innerText = sheet.sheetTitle;\n li.appendChild(title);\n // delete button\n const div = document.createElement('div');\n div.className = 'vtable-sheet-menu-delete-button';\n div.innerHTML =\n '<svg class=\"x-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">' +\n '<path d=\"M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '<path d=\"M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '</svg>';\n div.addEventListener('click', e => {\n e.stopPropagation();\n this.vTableSheet.removeSheet(sheet.sheetKey);\n });\n li.addEventListener('click', () => this.vTableSheet.activateSheet(sheet.sheetKey));\n li.appendChild(div);\n menuContainer.appendChild(li);\n });\n this.activeSheetMenuItem();\n // 确保激活的标签可见\n setTimeout(() => {\n const activeItem = menuContainer.querySelector('.vtable-sheet-main-menu-item.active');\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 激活sheet菜单项并滚动到可见区域\n */\n activeSheetMenuItem(): void {\n const menuItems = this.vTableSheet\n .getSheetTabElement()\n ?.querySelectorAll('.vtable-sheet-main-menu-item') as NodeListOf<HTMLElement>;\n let activeItem: HTMLElement | null = null;\n menuItems.forEach(item => {\n item.classList.remove('active');\n if (item.dataset.key === this.vTableSheet.getActiveSheet()?.getKey()) {\n item.classList.add('active');\n activeItem = item;\n }\n });\n setTimeout(() => {\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/components/sheet-tab-event-handler.ts"],"names":[],"mappings":"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","file":"sheet-tab-event-handler.js","sourcesContent":["import type VTableSheet from './vtable-sheet';\nimport { showSnackbar } from '../tools/ui/snackbar';\nimport { checkTabTitle } from '../tools';\n\n/**\n * Sheet Tab Event Handler\n * 专门处理sheet标签页相关的事件逻辑\n */\nexport class SheetTabEventHandler {\n private vTableSheet: VTableSheet;\n\n constructor(vTableSheet: VTableSheet) {\n this.vTableSheet = vTableSheet;\n }\n\n /**\n * 处理sheet标签双击事件\n * 双击sheet标签后,将标签设为可编辑状态。输入完成后进行重命名。\n * @param sheetKey 工作表key\n * @param originalTitle 原始名称\n */\n handleSheetTabDblClick(sheetKey: string, originalTitle: string): void {\n const targetTab = this.getSheetTabElementByKey(sheetKey);\n if (!targetTab) {\n return;\n }\n // 将原文本节点设为可编辑\n targetTab.setAttribute('contenteditable', 'true');\n targetTab.setAttribute('spellcheck', 'false');\n targetTab.classList.add('editing'); // 添加编辑状态样式\n // 选中所有文本\n const range = document.createRange();\n range.selectNodeContents(targetTab);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n const onBlur = () => {\n finishInput(true);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n finishInput(true);\n } else if (e.key === 'Escape') {\n finishInput(false);\n }\n };\n const finishInput = (commit: boolean) => {\n targetTab.removeEventListener('blur', onBlur);\n targetTab.removeEventListener('keydown', onKeyDown);\n targetTab.classList.remove('editing');\n targetTab.setAttribute('contenteditable', 'false');\n const newTitle = targetTab.textContent?.trim();\n if (!commit || newTitle === originalTitle || !this.renameSheet(sheetKey, newTitle)) {\n targetTab.textContent = originalTitle;\n return;\n }\n };\n targetTab.addEventListener('blur', onBlur);\n targetTab.addEventListener('keydown', onKeyDown);\n }\n\n /**\n * 重命名sheet\n * @param sheetKey 工作表key\n * @param newTitle 新名称\n * @returns 是否成功\n */\n private renameSheet(sheetKey: string, newTitle: string): boolean {\n const sheet = this.vTableSheet.getSheetManager().getSheet(sheetKey);\n if (!sheet) {\n return false;\n }\n const error = checkTabTitle(newTitle);\n if (error) {\n showSnackbar(error, 1300);\n return false;\n }\n const isExist = this.vTableSheet\n .getSheetManager()\n .getAllSheets()\n .find(s => s.sheetKey !== sheetKey && s.sheetTitle.toLowerCase() === newTitle.toLowerCase());\n if (isExist) {\n showSnackbar('工作表名称已存在,请重新输入', 1300);\n return false;\n }\n\n this.vTableSheet.getSheetManager().renameSheet(sheetKey, newTitle);\n this.vTableSheet.workSheetInstances.get(sheetKey)?.setTitle(newTitle);\n\n // 更新公式引擎中的工作表标题映射\n this.vTableSheet.getFormulaManager().updateSheetTitle(sheetKey, newTitle);\n\n this.vTableSheet.updateSheetTabs();\n this.vTableSheet.updateSheetMenu();\n return true;\n }\n\n /**\n * 获取指定sheetKey的标签元素\n */\n private getSheetTabElementByKey(sheetKey: string): HTMLElement | null {\n const tabsContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-tabs-container') as HTMLElement;\n return tabsContainer?.querySelector(`.vtable-sheet-tab[data-key=\"${sheetKey}\"]`) as HTMLElement;\n }\n\n /**\n * 激活sheet标签并滚动到可见区域\n */\n activeSheetTab(): void {\n const tabs = this.vTableSheet\n .getSheetTabElement()\n ?.querySelectorAll('.vtable-sheet-tab') as NodeListOf<HTMLElement>;\n let activeTab: HTMLElement | null = null;\n tabs.forEach(tab => {\n tab.classList.remove('active');\n if (tab.dataset.key === this.vTableSheet.getActiveSheet()?.getKey()) {\n tab.classList.add('active');\n activeTab = tab;\n }\n });\n // 确保激活的标签可见\n setTimeout(() => {\n if (activeTab) {\n activeTab.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 更新渐变效果\n * @param tabsContainer 标签容器\n * @param fadeLeft 左侧渐变效果\n * @param fadeRight 右侧渐变效果\n */\n updateFadeEffects(tabsContainer: HTMLElement, fadeLeft: HTMLElement, fadeRight: HTMLElement): void {\n // 显示/隐藏左侧渐变\n if (tabsContainer.scrollLeft > 10) {\n fadeLeft.style.display = 'block';\n } else {\n fadeLeft.style.display = 'none';\n }\n\n // 显示/隐藏右侧渐变\n const maxScroll = tabsContainer.scrollWidth - tabsContainer.clientWidth;\n if (tabsContainer.scrollLeft < maxScroll - 10) {\n fadeRight.style.display = 'block';\n } else {\n fadeRight.style.display = 'none';\n }\n }\n\n /**\n * 滚动sheet标签\n * @param direction 滚动方向\n * @param tabsContainer 标签容器\n */\n scrollSheetTabs(direction: 'left' | 'right', tabsContainer: HTMLElement): void {\n const scrollAmount = 200; // 每次滚动的像素数\n const currentScroll = tabsContainer.scrollLeft;\n\n if (direction === 'left') {\n tabsContainer.scrollTo({\n left: Math.max(0, currentScroll - scrollAmount),\n behavior: 'smooth'\n });\n } else {\n tabsContainer.scrollTo({\n left: currentScroll + scrollAmount,\n behavior: 'smooth'\n });\n }\n }\n\n /**\n * 滚动以确保标签可见\n * @param tab 标签\n * @param container 容器\n */\n scrollTabIntoView(tab: HTMLElement, container: HTMLElement): void {\n const tabRect = tab.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n\n if (tabRect.left < containerRect.left) {\n // 标签在可见区域左侧\n container.scrollLeft += tabRect.left - containerRect.left - 10;\n } else if (tabRect.right > containerRect.right) {\n // 标签在可见区域右侧\n container.scrollLeft += tabRect.right - containerRect.right + 10;\n }\n }\n\n /**\n * 显示工作表菜单\n */\n toggleSheetMenu(event: MouseEvent): void {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.classList.toggle('active');\n\n // 如果菜单被打开,添加点击外部关闭的监听器\n if (menuContainer.classList.contains('active')) {\n this.addClickOutsideListener();\n } else {\n this.removeClickOutsideListener();\n }\n }\n\n /**\n * 添加点击外部关闭菜单的监听器\n */\n private clickOutsideHandler = (event: MouseEvent): void => {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n const menuButton = this.vTableSheet.getSheetTabElement()?.querySelector('.vtable-sheet-menu-button') as HTMLElement;\n\n // 如果点击的不是菜单容器和菜单按钮,则关闭菜单\n if (\n menuContainer &&\n menuButton &&\n !menuContainer.contains(event.target as Node) &&\n !menuButton.contains(event.target as Node)\n ) {\n menuContainer.classList.remove('active');\n this.removeClickOutsideListener();\n }\n };\n\n /**\n * 添加点击外部监听器\n */\n addClickOutsideListener(): void {\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n /**\n * 移除点击外部监听器\n */\n removeClickOutsideListener(): void {\n document.removeEventListener('click', this.clickOutsideHandler);\n }\n\n /**\n * 更新sheet列表\n */\n updateSheetMenu(): void {\n const menuContainer = this.vTableSheet\n .getSheetTabElement()\n ?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.innerHTML = '';\n const sheets = this.vTableSheet.getSheetManager().getAllSheets();\n sheets.forEach(sheet => {\n // li\n const li = document.createElement('li');\n li.className = 'vtable-sheet-menu-item';\n li.dataset.key = sheet.sheetKey;\n // title\n const title = document.createElement('span');\n title.className = 'vtable-sheet-menu-item-title';\n title.innerText = sheet.sheetTitle;\n li.appendChild(title);\n // delete button\n const div = document.createElement('div');\n div.className = 'vtable-sheet-menu-delete-button';\n div.innerHTML =\n '<svg class=\"x-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">' +\n '<path d=\"M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '<path d=\"M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '</svg>';\n div.addEventListener('click', e => {\n this.vTableSheet.removeSheet(sheet.sheetKey);\n e.stopPropagation();\n });\n li.addEventListener('click', () => this.vTableSheet.activateSheet(sheet.sheetKey));\n li.appendChild(div);\n menuContainer.appendChild(li);\n });\n this.activeSheetMenuItem();\n // 确保激活的标签可见\n setTimeout(() => {\n const activeItem = menuContainer.querySelector('.vtable-sheet-main-menu-item.active');\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 激活sheet菜单项并滚动到可见区域\n */\n activeSheetMenuItem(): void {\n const menuItems = this.vTableSheet\n .getSheetTabElement()\n ?.querySelectorAll('.vtable-sheet-main-menu-item') as NodeListOf<HTMLElement>;\n let activeItem: HTMLElement | null = null;\n menuItems.forEach(item => {\n item.classList.remove('active');\n if (item.dataset.key === this.vTableSheet.getActiveSheet()?.getKey()) {\n item.classList.add('active');\n activeItem = item;\n }\n });\n setTimeout(() => {\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n}\n"]}
@@ -3,7 +3,11 @@ import SheetManager from '../managers/sheet-manager';
3
3
  import { WorkSheet } from '../core/WorkSheet';
4
4
  import type { IVTableSheetOptions, ISheetDefine } from '../ts-types';
5
5
  import type { MultiSheetImportResult } from '@visactor/vtable-plugins/src/excel-import/types';
6
+ import type { TableEventHandlersEventArgumentMap } from '@visactor/vtable/es/ts-types/events';
6
7
  import { FormulaUIManager } from '../formula/formula-ui-manager';
8
+ import type { VTableSheetEventType } from '../ts-types/spreadsheet-events';
9
+ import { SpreadSheetEventManager } from '../event/spreadsheet-event-manager';
10
+ import { VTableSheetEventBus } from '../event/vtable-sheet-event-bus';
7
11
  export default class VTableSheet {
8
12
  private container;
9
13
  private options;
@@ -14,6 +18,9 @@ export default class VTableSheet {
14
18
  private activeWorkSheet;
15
19
  workSheetInstances: Map<string, WorkSheet>;
16
20
  private formulaAutocomplete;
21
+ private tableEventRelay;
22
+ private spreadsheetEventManager;
23
+ private eventBus;
17
24
  formulaUIManager: FormulaUIManager;
18
25
  private rootElement;
19
26
  private formulaBarElement;
@@ -34,7 +41,6 @@ export default class VTableSheet {
34
41
  private initSheets;
35
42
  activateSheet(sheetKey: string): void;
36
43
  addSheet(sheet: ISheetDefine): void;
37
- private _selectExcelFile;
38
44
  removeSheet(sheetKey: string): void;
39
45
  getSheetCount(): number;
40
46
  getSheet(sheetKey: string): ISheetDefine | null;
@@ -46,9 +52,20 @@ export default class VTableSheet {
46
52
  private _addNewSheet;
47
53
  private updateFormulaBar;
48
54
  getFormulaManager(): FormulaManager;
55
+ getSpreadSheetEventManager(): SpreadSheetEventManager;
56
+ getEventBus(): VTableSheetEventBus;
49
57
  getSheetManager(): SheetManager;
50
58
  getActiveSheet(): WorkSheet | null;
59
+ onTableEvent<K extends keyof TableEventHandlersEventArgumentMap>(type: K, callback: (event: TableEventHandlersEventArgumentMap[K] & {
60
+ sheetKey: string;
61
+ }) => void): void;
62
+ offTableEvent(type: string, callback?: (...args: any[]) => void): void;
63
+ onSheetEvent(type: string, callback: (event: any) => void): void;
64
+ offSheetEvent(type: string, callback?: (event: any) => void): void;
65
+ on(type: VTableSheetEventType, callback: (event: any) => void): void;
66
+ off(type: VTableSheetEventType, callback?: (event: any) => void): void;
51
67
  getSheetByName(sheetName: string): WorkSheet | null;
68
+ getWorkSheetByKey(sheetKey: string): WorkSheet | null;
52
69
  saveToConfig(): IVTableSheetOptions;
53
70
  exportSheetToFile(fileType: 'csv' | 'xlsx', allSheets?: boolean): void;
54
71
  exportAllSheetsToExcel(): void;
@@ -66,15 +83,4 @@ export default class VTableSheet {
66
83
  exportData(sheetKey: string): any[][];
67
84
  exportAllData(): any[][];
68
85
  resize(): void;
69
- excludeEditCellFromSelection(range: {
70
- startRow: number;
71
- startCol: number;
72
- endRow: number;
73
- endCol: number;
74
- }, editRow: number, editCol: number): {
75
- startRow: number;
76
- startCol: number;
77
- endRow: number;
78
- endCol: number;
79
- };
80
86
  }
@@ -65,7 +65,7 @@ Object.defineProperty(exports, "__esModule", {
65
65
  value: !0
66
66
  });
67
67
 
68
- const formula_manager_1 = require("../managers/formula-manager"), sheet_manager_1 = __importDefault(require("../managers/sheet-manager")), WorkSheet_1 = require("../core/WorkSheet"), VTable = __importStar(require("@visactor/vtable")), table_plugins_1 = require("../core/table-plugins"), event_manager_1 = require("../event/event-manager"), snackbar_1 = require("../tools/ui/snackbar"), ts_types_1 = require("../ts-types"), tab_drag_manager_1 = __importDefault(require("../managers/tab-drag-manager")), formula_autocomplete_1 = require("../formula/formula-autocomplete"), formula_editor_1 = require("../formula/formula-editor"), menu_manager_1 = require("../managers/menu-manager"), formula_ui_manager_1 = require("../formula/formula-ui-manager"), sheet_tab_event_handler_1 = require("./sheet-tab-event-handler");
68
+ const formula_manager_1 = require("../managers/formula-manager"), sheet_manager_1 = __importDefault(require("../managers/sheet-manager")), WorkSheet_1 = require("../core/WorkSheet"), VTable = __importStar(require("@visactor/vtable")), table_plugins_1 = require("../core/table-plugins"), dom_event_manager_1 = require("../event/dom-event-manager"), snackbar_1 = require("../tools/ui/snackbar"), tab_drag_manager_1 = __importDefault(require("../managers/tab-drag-manager")), formula_autocomplete_1 = require("../formula/formula-autocomplete"), formula_editor_1 = require("../formula/formula-editor"), menu_manager_1 = require("../managers/menu-manager"), formula_ui_manager_1 = require("../formula/formula-ui-manager"), sheet_tab_event_handler_1 = require("./sheet-tab-event-handler"), table_event_relay_1 = require("../event/table-event-relay"), spreadsheet_event_manager_1 = require("../event/spreadsheet-event-manager"), vtable_sheet_event_bus_1 = require("../event/vtable-sheet-event-bus");
69
69
 
70
70
  VTable.register.editor("formula", formula_editor_1.formulaEditor);
71
71
 
@@ -73,10 +73,12 @@ class VTableSheet {
73
73
  constructor(container, options) {
74
74
  this.activeWorkSheet = null, this.workSheetInstances = new Map, this.formulaAutocomplete = null,
75
75
  this.formulaBarElement = null, this.sheetTabElement = null, this.mainMenuElement = null,
76
- this.container = container, this.options = this.mergeDefaultOptions(options), this.sheetManager = new sheet_manager_1.default,
77
- this.formulaManager = new formula_manager_1.FormulaManager(this), this.eventManager = new event_manager_1.EventManager(this),
76
+ this.container = container, this.options = this.mergeDefaultOptions(options), this.eventBus = new vtable_sheet_event_bus_1.VTableSheetEventBus,
77
+ this.sheetManager = new sheet_manager_1.default(this.eventBus), this.formulaManager = new formula_manager_1.FormulaManager(this),
78
+ this.tableEventRelay = new table_event_relay_1.TableEventRelay(this), this.eventManager = new dom_event_manager_1.DomEventManager(this),
78
79
  this.dragManager = new tab_drag_manager_1.default(this), this.menuManager = new menu_manager_1.MenuManager(this),
79
80
  this.formulaUIManager = new formula_ui_manager_1.FormulaUIManager(this), this.sheetTabEventHandler = new sheet_tab_event_handler_1.SheetTabEventHandler(this),
81
+ this.spreadsheetEventManager = new spreadsheet_event_manager_1.SpreadSheetEventManager(this),
80
82
  this.initUI(), this.initSheets(), this.resize();
81
83
  }
82
84
  mergeDefaultOptions(options) {
@@ -151,9 +153,7 @@ class VTableSheet {
151
153
  var _a;
152
154
  if (void 0 === tabsContainer && (tabsContainer = null === (_a = this.sheetTabElement) || void 0 === _a ? void 0 : _a.querySelector(".vtable-sheet-tabs-container")),
153
155
  !tabsContainer) return;
154
- tabsContainer.querySelectorAll(".vtable-sheet-tab").forEach((tab => {
155
- tab.remove();
156
- }));
156
+ tabsContainer.innerHTML = "";
157
157
  this.sheetManager.getAllSheets().forEach(((sheet, index) => {
158
158
  tabsContainer.appendChild(this.createSheetTabItem(sheet, index));
159
159
  })), this._activeSheetTab();
@@ -181,14 +181,16 @@ class VTableSheet {
181
181
  } else this._addNewSheet();
182
182
  }
183
183
  activateSheet(sheetKey) {
184
+ const previousActiveSheet = this.sheetManager.getActiveSheet(), previousSheetKey = null == previousActiveSheet ? void 0 : previousActiveSheet.sheetKey, previousSheetTitle = null == previousActiveSheet ? void 0 : previousActiveSheet.sheetTitle;
184
185
  this.sheetManager.setActiveSheet(sheetKey);
185
186
  const sheetDefine = this.sheetManager.getSheet(sheetKey);
186
187
  if (sheetDefine) {
187
188
  if (this.workSheetInstances.forEach((instance => {
188
- instance.getElement().style.display = "none";
189
+ instance.getElement().style.display = "none", instance.tableInstance && this.tableEventRelay.unbindSheetEvents(instance.sheetKey, instance.tableInstance);
189
190
  })), this.workSheetInstances.has(sheetKey)) {
190
191
  const instance = this.workSheetInstances.get(sheetKey);
191
192
  instance.getElement().style.display = "block", this.activeWorkSheet = instance,
193
+ instance.tableInstance && this.tableEventRelay.bindSheetEvents(instance.sheetKey, instance.tableInstance),
192
194
  this.formulaManager.setActiveSheet(sheetKey), this._activeSheetTab(), this.sheetTabEventHandler.activeSheetMenuItem(),
193
195
  this.restoreFilterState(instance, sheetDefine);
194
196
  } else {
@@ -197,29 +199,17 @@ class VTableSheet {
197
199
  this.formulaManager.setActiveSheet(sheetKey), this.updateSheetTabs(), this.updateSheetMenu(),
198
200
  this.restoreFilterState(instance, sheetDefine);
199
201
  }
200
- this.updateFormulaBar();
202
+ this.updateFormulaBar(), this.spreadsheetEventManager.emitSheetActivated(sheetKey, sheetDefine.sheetTitle, previousSheetKey, previousSheetTitle),
203
+ previousSheetKey && previousSheetKey !== sheetKey && this.spreadsheetEventManager.emitSheetDeactivated(previousSheetKey, previousSheetTitle);
201
204
  }
202
205
  }
203
206
  addSheet(sheet) {
204
207
  this.sheetManager.addSheet(sheet), this.updateSheetTabs(), this.updateSheetMenu();
205
208
  }
206
- _selectExcelFile() {
207
- return new Promise((resolve => {
208
- const input = document.createElement("input");
209
- input.type = "file", input.accept = ".xlsx,.xls", input.style.display = "none",
210
- document.body.appendChild(input), input.addEventListener("change", (e => {
211
- var _a;
212
- const file = null === (_a = e.target.files) || void 0 === _a ? void 0 : _a[0];
213
- document.body.removeChild(input), resolve(file || null);
214
- })), input.addEventListener("cancel", (() => {
215
- document.body.removeChild(input), resolve(null);
216
- })), input.click();
217
- }));
218
- }
219
209
  removeSheet(sheetKey) {
220
210
  if (this.sheetManager.getSheetCount() <= 1) return void (0, snackbar_1.showSnackbar)("至少保留一个工作表", 1300);
221
211
  const instance = this.workSheetInstances.get(sheetKey);
222
- instance && (instance.getElement().remove(), this.workSheetInstances.delete(sheetKey));
212
+ instance && (instance.release(), this.workSheetInstances.delete(sheetKey));
223
213
  const newActiveSheetKey = this.sheetManager.removeSheet(sheetKey);
224
214
  newActiveSheetKey && this.activateSheet(newActiveSheetKey), this.updateSheetTabs(),
225
215
  this.updateSheetMenu();
@@ -261,10 +251,6 @@ class VTableSheet {
261
251
  customMergeCell: sheetDefine.cellMerge,
262
252
  theme: (null === (_b = sheetDefine.theme) || void 0 === _b ? void 0 : _b.tableTheme) || (null === (_c = this.options.theme) || void 0 === _c ? void 0 : _c.tableTheme)
263
253
  }));
264
- sheet.on(ts_types_1.WorkSheetEventType.CELL_CLICK, this.eventManager.handleCellClickBind),
265
- sheet.on(ts_types_1.WorkSheetEventType.CELL_VALUE_CHANGED, this.eventManager.handleCellValueChangedBind),
266
- sheet.on(ts_types_1.WorkSheetEventType.SELECTION_CHANGED, this.eventManager.handleSelectionChangedForRangeModeBind),
267
- sheet.on(ts_types_1.WorkSheetEventType.SELECTION_END, this.eventManager.handleSelectionChangedForRangeModeBind);
268
254
  try {
269
255
  const normalizedData = this.formulaManager.normalizeSheetData(sheetDefine.data, sheet.tableInstance);
270
256
  this.formulaManager.addSheet(sheetDefine.sheetKey, normalizedData, sheetDefine.sheetTitle),
@@ -328,12 +314,36 @@ class VTableSheet {
328
314
  getFormulaManager() {
329
315
  return this.formulaManager;
330
316
  }
317
+ getSpreadSheetEventManager() {
318
+ return this.spreadsheetEventManager;
319
+ }
320
+ getEventBus() {
321
+ return this.eventBus;
322
+ }
331
323
  getSheetManager() {
332
324
  return this.sheetManager;
333
325
  }
334
326
  getActiveSheet() {
335
327
  return this.activeWorkSheet;
336
328
  }
329
+ onTableEvent(type, callback) {
330
+ this.tableEventRelay.onTableEvent(type, callback);
331
+ }
332
+ offTableEvent(type, callback) {
333
+ this.tableEventRelay.offTableEvent(type, callback);
334
+ }
335
+ onSheetEvent(type, callback) {
336
+ this.spreadsheetEventManager.on(type, callback);
337
+ }
338
+ offSheetEvent(type, callback) {
339
+ this.spreadsheetEventManager.off(type, callback);
340
+ }
341
+ on(type, callback) {
342
+ this.onSheetEvent(type, callback);
343
+ }
344
+ off(type, callback) {
345
+ this.offSheetEvent(type, callback);
346
+ }
337
347
  getSheetByName(sheetName) {
338
348
  for (const [sheetKey, workSheet] of this.workSheetInstances) {
339
349
  const sheetDefine = this.sheetManager.getSheet(sheetKey);
@@ -341,6 +351,9 @@ class VTableSheet {
341
351
  }
342
352
  return null;
343
353
  }
354
+ getWorkSheetByKey(sheetKey) {
355
+ return this.workSheetInstances.get(sheetKey) || null;
356
+ }
344
357
  saveToConfig() {
345
358
  const sheets = [];
346
359
  return this.sheetManager.getAllSheets().forEach((sheetDefine => {
@@ -392,8 +405,23 @@ class VTableSheet {
392
405
  }
393
406
  exportSheetToFile(fileType, allSheets = !0) {
394
407
  var _a, _b;
395
- const sheet = this.getActiveSheet();
396
- sheet && ("csv" === fileType ? (null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.exportToCsv) && sheet.tableInstance.exportToCsv() : allSheets ? this.exportAllSheetsToExcel() : (null === (_b = sheet.tableInstance) || void 0 === _b ? void 0 : _b.exportToExcel) && sheet.tableInstance.exportToExcel());
408
+ try {
409
+ this.spreadsheetEventManager.emitExportStart(fileType, allSheets);
410
+ const sheet = this.getActiveSheet();
411
+ if (!sheet) throw new Error("No active sheet available for export");
412
+ let sheetCount = 0;
413
+ if ("csv" === fileType) {
414
+ if (!(null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.exportToCsv)) throw new Error("TableExportPlugin not configured for CSV export");
415
+ sheet.tableInstance.exportToCsv(), sheetCount = 1;
416
+ } else if (allSheets) this.exportAllSheetsToExcel(), sheetCount = this.sheetManager.getSheetCount(); else {
417
+ if (!(null === (_b = sheet.tableInstance) || void 0 === _b ? void 0 : _b.exportToExcel)) throw new Error("TableExportPlugin not configured for Excel export");
418
+ sheet.tableInstance.exportToExcel(), sheetCount = 1;
419
+ }
420
+ this.spreadsheetEventManager.emitExportCompleted(fileType, allSheets, sheetCount);
421
+ } catch (error) {
422
+ const errorMessage = error instanceof Error ? error.message : String(error);
423
+ this.spreadsheetEventManager.emitExportError(fileType, allSheets, errorMessage);
424
+ }
397
425
  }
398
426
  exportAllSheetsToExcel() {
399
427
  var _b;
@@ -415,15 +443,26 @@ class VTableSheet {
415
443
  importFileToSheet(options = {
416
444
  clearExisting: !0
417
445
  }) {
418
- var _a;
446
+ var _a, _b;
419
447
  return __awaiter(this, void 0, void 0, (function*() {
420
- if (null == this ? void 0 : this._importFile) return yield this._importFile({
421
- clearExisting: !1 !== (null == options ? void 0 : options.clearExisting)
422
- });
423
- const sheet = this.getActiveSheet();
424
- return sheet && (null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.importFile) ? yield sheet.tableInstance.importFile({
425
- clearExisting: !1 !== (null == options ? void 0 : options.clearExisting)
426
- }) : void 0;
448
+ try {
449
+ let result;
450
+ if (this.spreadsheetEventManager.emitImportStart("xlsx"), null == this ? void 0 : this._importFile) result = yield this._importFile({
451
+ clearExisting: !1 !== (null == options ? void 0 : options.clearExisting)
452
+ }); else {
453
+ const sheet = this.getActiveSheet();
454
+ if (!sheet) throw new Error("No active sheet available for import");
455
+ if (!(null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.importFile)) throw new Error("ExcelImportPlugin not configured");
456
+ result = yield sheet.tableInstance.importFile({
457
+ clearExisting: !1 !== (null == options ? void 0 : options.clearExisting)
458
+ });
459
+ }
460
+ const sheetCount = result && "sheets" in result && (null === (_b = result.sheets) || void 0 === _b ? void 0 : _b.length) || 0;
461
+ return this.spreadsheetEventManager.emitImportCompleted("xlsx", sheetCount), result;
462
+ } catch (error) {
463
+ const errorMessage = error instanceof Error ? error.message : String(error);
464
+ throw this.spreadsheetEventManager.emitImportError("xlsx", errorMessage), error;
465
+ }
427
466
  }));
428
467
  }
429
468
  getContainer() {
@@ -445,7 +484,9 @@ class VTableSheet {
445
484
  return this.contentElement;
446
485
  }
447
486
  release() {
487
+ this.spreadsheetEventManager.emitDestroyed(), this.tableEventRelay.clearAllListeners(),
448
488
  this.eventManager.release(), this.formulaManager.release(), this.formulaUIManager.release(),
489
+ this.spreadsheetEventManager.clearAllListeners(), this.menuManager && this.menuManager.release(),
449
490
  this.sheetTabEventHandler.removeClickOutsideListener(), this.workSheetInstances.forEach((instance => {
450
491
  instance.release();
451
492
  })), this.rootElement && this.rootElement.parentNode && this.rootElement.parentNode.removeChild(this.rootElement),
@@ -462,18 +503,6 @@ class VTableSheet {
462
503
  var _a;
463
504
  null === (_a = this.getActiveSheet()) || void 0 === _a || _a.resize();
464
505
  }
465
- excludeEditCellFromSelection(range, editRow, editCol) {
466
- const r = Object.assign({}, range), withinRow = r.startRow <= editRow && editRow <= r.endRow, withinCol = r.startCol <= editCol && editCol <= r.endCol;
467
- if (!withinRow || !withinCol) return r;
468
- const rowSpan = r.endRow - r.startRow, colSpan = r.endCol - r.startCol;
469
- return 0 === rowSpan && 0 === colSpan && r.startRow === editRow && r.startCol === editCol ? {
470
- startRow: -1,
471
- startCol: -1,
472
- endRow: -1,
473
- endCol: -1
474
- } : (rowSpan >= colSpan ? editRow === r.startRow && r.startRow < r.endRow ? r.startRow += 1 : editRow === r.endRow && r.startRow < r.endRow ? r.endRow -= 1 : r.startRow < r.endRow && (r.startRow += 1) : editCol === r.startCol && r.startCol < r.endCol ? r.startCol += 1 : editCol === r.endCol && r.startCol < r.endCol ? r.endCol -= 1 : r.startCol < r.endCol && (r.startCol += 1),
475
- r);
476
- }
477
506
  }
478
507
 
479
508
  exports.default = VTableSheet;