@visactor/vtable-sheet 1.22.13-alpha.1 → 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.
- package/cjs/components/sheet-tab-event-handler.js +1 -1
- package/cjs/components/sheet-tab-event-handler.js.map +1 -1
- package/cjs/components/vtable-sheet.d.ts +18 -12
- package/cjs/components/vtable-sheet.js +77 -48
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.d.ts +12 -7
- package/cjs/core/WorkSheet.js +38 -67
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.d.ts +1 -1
- package/cjs/core/table-plugins.js +45 -24
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/event/base-event-manager.d.ts +21 -0
- package/cjs/event/base-event-manager.js +58 -0
- package/cjs/event/base-event-manager.js.map +1 -0
- package/cjs/event/dom-event-manager.d.ts +10 -0
- package/cjs/event/dom-event-manager.js +31 -0
- package/cjs/event/dom-event-manager.js.map +1 -0
- package/cjs/event/event-interfaces.d.ts +46 -0
- package/cjs/event/event-interfaces.js +6 -0
- package/cjs/event/event-interfaces.js.map +1 -0
- package/cjs/event/event-performance.d.ts +20 -0
- package/cjs/event/event-performance.js +94 -0
- package/cjs/event/event-performance.js.map +1 -0
- package/cjs/event/event-validator.d.ts +10 -0
- package/cjs/event/event-validator.js +78 -0
- package/cjs/event/event-validator.js.map +1 -0
- package/cjs/event/formula-event-utils.d.ts +30 -0
- package/cjs/event/formula-event-utils.js +69 -0
- package/cjs/event/formula-event-utils.js.map +1 -0
- package/cjs/event/index.d.ts +9 -0
- package/cjs/event/index.js +78 -0
- package/cjs/event/index.js.map +1 -0
- package/cjs/event/spreadsheet-event-manager.d.ts +27 -0
- package/cjs/event/spreadsheet-event-manager.js +143 -0
- package/cjs/event/spreadsheet-event-manager.js.map +1 -0
- package/cjs/event/table-event-relay.d.ts +30 -0
- package/cjs/event/table-event-relay.js +105 -0
- package/cjs/event/table-event-relay.js.map +1 -0
- package/cjs/event/vtable-sheet-event-bus.d.ts +23 -0
- package/cjs/event/vtable-sheet-event-bus.js +75 -0
- package/cjs/event/vtable-sheet-event-bus.js.map +1 -0
- package/cjs/event/worksheet-event-manager.d.ts +28 -0
- package/cjs/event/worksheet-event-manager.js +82 -0
- package/cjs/event/worksheet-event-manager.js.map +1 -0
- package/cjs/formula/formula-engine.js +7 -4
- package/cjs/formula/formula-engine.js.map +1 -1
- package/cjs/formula/formula-range-selector.d.ts +3 -3
- package/cjs/formula/formula-range-selector.js +4 -4
- package/cjs/formula/formula-range-selector.js.map +1 -1
- package/cjs/formula/index.js +1 -2
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/managers/formula-manager.d.ts +1 -0
- package/cjs/managers/formula-manager.js +33 -2
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/managers/menu-manager.d.ts +2 -0
- package/cjs/managers/menu-manager.js +32 -7
- package/cjs/managers/menu-manager.js.map +1 -1
- package/cjs/managers/sheet-manager.d.ts +4 -1
- package/cjs/managers/sheet-manager.js +40 -5
- package/cjs/managers/sheet-manager.js.map +1 -1
- package/cjs/managers/tab-drag-manager.js +2 -2
- package/cjs/managers/tab-drag-manager.js.map +1 -1
- package/cjs/sheet-helper.d.ts +11 -12
- package/cjs/sheet-helper.js +18 -23
- package/cjs/sheet-helper.js.map +1 -1
- package/cjs/styles/sheet-tab.js +2 -1
- package/cjs/ts-types/formula.js +1 -2
- package/cjs/ts-types/index.d.ts +1 -1
- package/cjs/ts-types/index.js +3 -3
- package/cjs/ts-types/index.js.map +1 -1
- package/cjs/ts-types/spreadsheet-events.d.ts +195 -0
- package/cjs/ts-types/spreadsheet-events.js +26 -0
- package/cjs/ts-types/spreadsheet-events.js.map +1 -0
- package/dist/vtable-sheet.js +1240 -366
- package/dist/vtable-sheet.min.js +1 -1
- package/es/components/sheet-tab-event-handler.js +1 -1
- package/es/components/sheet-tab-event-handler.js.map +1 -1
- package/es/components/vtable-sheet.d.ts +18 -12
- package/es/components/vtable-sheet.js +84 -51
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.d.ts +12 -7
- package/es/core/WorkSheet.js +38 -69
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.d.ts +1 -1
- package/es/core/table-plugins.js +45 -24
- package/es/core/table-plugins.js.map +1 -1
- package/es/event/base-event-manager.d.ts +21 -0
- package/es/event/base-event-manager.js +52 -0
- package/es/event/base-event-manager.js.map +1 -0
- package/es/event/dom-event-manager.d.ts +10 -0
- package/es/event/dom-event-manager.js +23 -0
- package/es/event/dom-event-manager.js.map +1 -0
- package/es/event/event-interfaces.d.ts +46 -0
- package/es/event/event-interfaces.js +2 -0
- package/es/event/event-interfaces.js.map +1 -0
- package/es/event/event-performance.d.ts +20 -0
- package/es/event/event-performance.js +86 -0
- package/es/event/event-performance.js.map +1 -0
- package/es/event/event-validator.d.ts +10 -0
- package/es/event/event-validator.js +70 -0
- package/es/event/event-validator.js.map +1 -0
- package/es/event/formula-event-utils.d.ts +30 -0
- package/es/event/formula-event-utils.js +61 -0
- package/es/event/formula-event-utils.js.map +1 -0
- package/es/event/index.d.ts +9 -0
- package/es/event/index.js +16 -0
- package/es/event/index.js.map +1 -0
- package/es/event/spreadsheet-event-manager.d.ts +27 -0
- package/es/event/spreadsheet-event-manager.js +137 -0
- package/es/event/spreadsheet-event-manager.js.map +1 -0
- package/es/event/table-event-relay.d.ts +30 -0
- package/es/event/table-event-relay.js +97 -0
- package/es/event/table-event-relay.js.map +1 -0
- package/es/event/vtable-sheet-event-bus.d.ts +23 -0
- package/es/event/vtable-sheet-event-bus.js +67 -0
- package/es/event/vtable-sheet-event-bus.js.map +1 -0
- package/es/event/worksheet-event-manager.d.ts +28 -0
- package/es/event/worksheet-event-manager.js +76 -0
- package/es/event/worksheet-event-manager.js.map +1 -0
- package/es/formula/formula-engine.js +7 -4
- package/es/formula/formula-engine.js.map +1 -1
- package/es/formula/formula-range-selector.d.ts +3 -3
- package/es/formula/formula-range-selector.js +5 -3
- package/es/formula/formula-range-selector.js.map +1 -1
- package/es/formula/index.js +1 -2
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/managers/formula-manager.d.ts +1 -0
- package/es/managers/formula-manager.js +33 -2
- package/es/managers/formula-manager.js.map +1 -1
- package/es/managers/menu-manager.d.ts +2 -0
- package/es/managers/menu-manager.js +32 -7
- package/es/managers/menu-manager.js.map +1 -1
- package/es/managers/sheet-manager.d.ts +4 -1
- package/es/managers/sheet-manager.js +39 -5
- package/es/managers/sheet-manager.js.map +1 -1
- package/es/managers/tab-drag-manager.js +2 -2
- package/es/managers/tab-drag-manager.js.map +1 -1
- package/es/sheet-helper.d.ts +11 -12
- package/es/sheet-helper.js +13 -16
- package/es/sheet-helper.js.map +1 -1
- package/es/styles/sheet-tab.js +2 -1
- package/es/ts-types/formula.js +1 -2
- package/es/ts-types/index.d.ts +1 -1
- package/es/ts-types/index.js +2 -2
- package/es/ts-types/index.js.map +1 -1
- package/es/ts-types/spreadsheet-events.d.ts +195 -0
- package/es/ts-types/spreadsheet-events.js +23 -0
- package/es/ts-types/spreadsheet-events.js.map +1 -0
- package/package.json +7 -7
- package/cjs/event/event-manager.d.ts +0 -28
- package/cjs/event/event-manager.js +0 -62
- package/cjs/event/event-manager.js.map +0 -1
- package/cjs/event/event-target.d.ts +0 -12
- package/cjs/event/event-target.js +0 -50
- package/cjs/event/event-target.js.map +0 -1
- package/cjs/ts-types/event.d.ts +0 -90
- package/cjs/ts-types/event.js +0 -11
- package/cjs/ts-types/event.js.map +0 -1
- package/cjs/ts-types/events.d.ts +0 -1
- package/cjs/ts-types/events.js +0 -1
- package/cjs/ts-types/events.js.map +0 -1
- package/es/event/event-manager.d.ts +0 -28
- package/es/event/event-manager.js +0 -54
- package/es/event/event-manager.js.map +0 -1
- package/es/event/event-target.d.ts +0 -12
- package/es/event/event-target.js +0 -42
- package/es/event/event-target.js.map +0 -1
- package/es/ts-types/event.d.ts +0 -90
- package/es/ts-types/event.js +0 -7
- package/es/ts-types/event.js.map +0 -1
- package/es/ts-types/events.d.ts +0 -1
- package/es/ts-types/events.js +0 -1
- package/es/ts-types/events.js.map +0 -1
|
@@ -106,7 +106,7 @@ export class SheetTabEventHandler {
|
|
|
106
106
|
const div = document.createElement("div");
|
|
107
107
|
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>',
|
|
108
108
|
div.addEventListener("click", (e => {
|
|
109
|
-
|
|
109
|
+
this.vTableSheet.removeSheet(sheet.sheetKey), e.stopPropagation();
|
|
110
110
|
})), li.addEventListener("click", (() => this.vTableSheet.activateSheet(sheet.sheetKey))),
|
|
111
111
|
li.appendChild(div), menuContainer.appendChild(li);
|
|
112
112
|
})), 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
|
}
|
|
@@ -42,12 +42,10 @@ import * as VTable from "@visactor/vtable";
|
|
|
42
42
|
|
|
43
43
|
import { getTablePlugins } from "../core/table-plugins";
|
|
44
44
|
|
|
45
|
-
import {
|
|
45
|
+
import { DomEventManager } from "../event/dom-event-manager";
|
|
46
46
|
|
|
47
47
|
import { showSnackbar } from "../tools/ui/snackbar";
|
|
48
48
|
|
|
49
|
-
import { WorkSheetEventType } from "../ts-types";
|
|
50
|
-
|
|
51
49
|
import SheetTabDragManager from "../managers/tab-drag-manager";
|
|
52
50
|
|
|
53
51
|
import { FormulaAutocomplete } from "../formula/formula-autocomplete";
|
|
@@ -60,17 +58,25 @@ import { FormulaUIManager } from "../formula/formula-ui-manager";
|
|
|
60
58
|
|
|
61
59
|
import { SheetTabEventHandler } from "./sheet-tab-event-handler";
|
|
62
60
|
|
|
61
|
+
import { TableEventRelay } from "../event/table-event-relay";
|
|
62
|
+
|
|
63
|
+
import { SpreadSheetEventManager } from "../event/spreadsheet-event-manager";
|
|
64
|
+
|
|
65
|
+
import { VTableSheetEventBus } from "../event/vtable-sheet-event-bus";
|
|
66
|
+
|
|
63
67
|
VTable.register.editor("formula", formulaEditor);
|
|
64
68
|
|
|
65
69
|
export default class VTableSheet {
|
|
66
70
|
constructor(container, options) {
|
|
67
71
|
this.activeWorkSheet = null, this.workSheetInstances = new Map, this.formulaAutocomplete = null,
|
|
68
72
|
this.formulaBarElement = null, this.sheetTabElement = null, this.mainMenuElement = null,
|
|
69
|
-
this.container = container, this.options = this.mergeDefaultOptions(options), this.
|
|
70
|
-
this.
|
|
73
|
+
this.container = container, this.options = this.mergeDefaultOptions(options), this.eventBus = new VTableSheetEventBus,
|
|
74
|
+
this.sheetManager = new SheetManager(this.eventBus), this.formulaManager = new FormulaManager(this),
|
|
75
|
+
this.tableEventRelay = new TableEventRelay(this), this.eventManager = new DomEventManager(this),
|
|
71
76
|
this.dragManager = new SheetTabDragManager(this), this.menuManager = new MenuManager(this),
|
|
72
77
|
this.formulaUIManager = new FormulaUIManager(this), this.sheetTabEventHandler = new SheetTabEventHandler(this),
|
|
73
|
-
this.
|
|
78
|
+
this.spreadsheetEventManager = new SpreadSheetEventManager(this), this.initUI(),
|
|
79
|
+
this.initSheets(), this.resize();
|
|
74
80
|
}
|
|
75
81
|
mergeDefaultOptions(options) {
|
|
76
82
|
return Object.assign({
|
|
@@ -144,9 +150,7 @@ export default class VTableSheet {
|
|
|
144
150
|
var _a;
|
|
145
151
|
if (void 0 === tabsContainer && (tabsContainer = null === (_a = this.sheetTabElement) || void 0 === _a ? void 0 : _a.querySelector(".vtable-sheet-tabs-container")),
|
|
146
152
|
!tabsContainer) return;
|
|
147
|
-
tabsContainer.
|
|
148
|
-
tab.remove();
|
|
149
|
-
}));
|
|
153
|
+
tabsContainer.innerHTML = "";
|
|
150
154
|
this.sheetManager.getAllSheets().forEach(((sheet, index) => {
|
|
151
155
|
tabsContainer.appendChild(this.createSheetTabItem(sheet, index));
|
|
152
156
|
})), this._activeSheetTab();
|
|
@@ -174,14 +178,16 @@ export default class VTableSheet {
|
|
|
174
178
|
} else this._addNewSheet();
|
|
175
179
|
}
|
|
176
180
|
activateSheet(sheetKey) {
|
|
181
|
+
const previousActiveSheet = this.sheetManager.getActiveSheet(), previousSheetKey = null == previousActiveSheet ? void 0 : previousActiveSheet.sheetKey, previousSheetTitle = null == previousActiveSheet ? void 0 : previousActiveSheet.sheetTitle;
|
|
177
182
|
this.sheetManager.setActiveSheet(sheetKey);
|
|
178
183
|
const sheetDefine = this.sheetManager.getSheet(sheetKey);
|
|
179
184
|
if (sheetDefine) {
|
|
180
185
|
if (this.workSheetInstances.forEach((instance => {
|
|
181
|
-
instance.getElement().style.display = "none";
|
|
186
|
+
instance.getElement().style.display = "none", instance.tableInstance && this.tableEventRelay.unbindSheetEvents(instance.sheetKey, instance.tableInstance);
|
|
182
187
|
})), this.workSheetInstances.has(sheetKey)) {
|
|
183
188
|
const instance = this.workSheetInstances.get(sheetKey);
|
|
184
189
|
instance.getElement().style.display = "block", this.activeWorkSheet = instance,
|
|
190
|
+
instance.tableInstance && this.tableEventRelay.bindSheetEvents(instance.sheetKey, instance.tableInstance),
|
|
185
191
|
this.formulaManager.setActiveSheet(sheetKey), this._activeSheetTab(), this.sheetTabEventHandler.activeSheetMenuItem(),
|
|
186
192
|
this.restoreFilterState(instance, sheetDefine);
|
|
187
193
|
} else {
|
|
@@ -190,29 +196,17 @@ export default class VTableSheet {
|
|
|
190
196
|
this.formulaManager.setActiveSheet(sheetKey), this.updateSheetTabs(), this.updateSheetMenu(),
|
|
191
197
|
this.restoreFilterState(instance, sheetDefine);
|
|
192
198
|
}
|
|
193
|
-
this.updateFormulaBar()
|
|
199
|
+
this.updateFormulaBar(), this.spreadsheetEventManager.emitSheetActivated(sheetKey, sheetDefine.sheetTitle, previousSheetKey, previousSheetTitle),
|
|
200
|
+
previousSheetKey && previousSheetKey !== sheetKey && this.spreadsheetEventManager.emitSheetDeactivated(previousSheetKey, previousSheetTitle);
|
|
194
201
|
}
|
|
195
202
|
}
|
|
196
203
|
addSheet(sheet) {
|
|
197
204
|
this.sheetManager.addSheet(sheet), this.updateSheetTabs(), this.updateSheetMenu();
|
|
198
205
|
}
|
|
199
|
-
_selectExcelFile() {
|
|
200
|
-
return new Promise((resolve => {
|
|
201
|
-
const input = document.createElement("input");
|
|
202
|
-
input.type = "file", input.accept = ".xlsx,.xls", input.style.display = "none",
|
|
203
|
-
document.body.appendChild(input), input.addEventListener("change", (e => {
|
|
204
|
-
var _a;
|
|
205
|
-
const file = null === (_a = e.target.files) || void 0 === _a ? void 0 : _a[0];
|
|
206
|
-
document.body.removeChild(input), resolve(file || null);
|
|
207
|
-
})), input.addEventListener("cancel", (() => {
|
|
208
|
-
document.body.removeChild(input), resolve(null);
|
|
209
|
-
})), input.click();
|
|
210
|
-
}));
|
|
211
|
-
}
|
|
212
206
|
removeSheet(sheetKey) {
|
|
213
207
|
if (this.sheetManager.getSheetCount() <= 1) return void showSnackbar("至少保留一个工作表", 1300);
|
|
214
208
|
const instance = this.workSheetInstances.get(sheetKey);
|
|
215
|
-
instance && (instance.
|
|
209
|
+
instance && (instance.release(), this.workSheetInstances.delete(sheetKey));
|
|
216
210
|
const newActiveSheetKey = this.sheetManager.removeSheet(sheetKey);
|
|
217
211
|
newActiveSheetKey && this.activateSheet(newActiveSheetKey), this.updateSheetTabs(),
|
|
218
212
|
this.updateSheetMenu();
|
|
@@ -254,10 +248,6 @@ export default class VTableSheet {
|
|
|
254
248
|
customMergeCell: sheetDefine.cellMerge,
|
|
255
249
|
theme: (null === (_b = sheetDefine.theme) || void 0 === _b ? void 0 : _b.tableTheme) || (null === (_c = this.options.theme) || void 0 === _c ? void 0 : _c.tableTheme)
|
|
256
250
|
}));
|
|
257
|
-
sheet.on(WorkSheetEventType.CELL_CLICK, this.eventManager.handleCellClickBind),
|
|
258
|
-
sheet.on(WorkSheetEventType.CELL_VALUE_CHANGED, this.eventManager.handleCellValueChangedBind),
|
|
259
|
-
sheet.on(WorkSheetEventType.SELECTION_CHANGED, this.eventManager.handleSelectionChangedForRangeModeBind),
|
|
260
|
-
sheet.on(WorkSheetEventType.SELECTION_END, this.eventManager.handleSelectionChangedForRangeModeBind);
|
|
261
251
|
try {
|
|
262
252
|
const normalizedData = this.formulaManager.normalizeSheetData(sheetDefine.data, sheet.tableInstance);
|
|
263
253
|
this.formulaManager.addSheet(sheetDefine.sheetKey, normalizedData, sheetDefine.sheetTitle),
|
|
@@ -321,12 +311,36 @@ export default class VTableSheet {
|
|
|
321
311
|
getFormulaManager() {
|
|
322
312
|
return this.formulaManager;
|
|
323
313
|
}
|
|
314
|
+
getSpreadSheetEventManager() {
|
|
315
|
+
return this.spreadsheetEventManager;
|
|
316
|
+
}
|
|
317
|
+
getEventBus() {
|
|
318
|
+
return this.eventBus;
|
|
319
|
+
}
|
|
324
320
|
getSheetManager() {
|
|
325
321
|
return this.sheetManager;
|
|
326
322
|
}
|
|
327
323
|
getActiveSheet() {
|
|
328
324
|
return this.activeWorkSheet;
|
|
329
325
|
}
|
|
326
|
+
onTableEvent(type, callback) {
|
|
327
|
+
this.tableEventRelay.onTableEvent(type, callback);
|
|
328
|
+
}
|
|
329
|
+
offTableEvent(type, callback) {
|
|
330
|
+
this.tableEventRelay.offTableEvent(type, callback);
|
|
331
|
+
}
|
|
332
|
+
onSheetEvent(type, callback) {
|
|
333
|
+
this.spreadsheetEventManager.on(type, callback);
|
|
334
|
+
}
|
|
335
|
+
offSheetEvent(type, callback) {
|
|
336
|
+
this.spreadsheetEventManager.off(type, callback);
|
|
337
|
+
}
|
|
338
|
+
on(type, callback) {
|
|
339
|
+
this.onSheetEvent(type, callback);
|
|
340
|
+
}
|
|
341
|
+
off(type, callback) {
|
|
342
|
+
this.offSheetEvent(type, callback);
|
|
343
|
+
}
|
|
330
344
|
getSheetByName(sheetName) {
|
|
331
345
|
for (const [sheetKey, workSheet] of this.workSheetInstances) {
|
|
332
346
|
const sheetDefine = this.sheetManager.getSheet(sheetKey);
|
|
@@ -334,6 +348,9 @@ export default class VTableSheet {
|
|
|
334
348
|
}
|
|
335
349
|
return null;
|
|
336
350
|
}
|
|
351
|
+
getWorkSheetByKey(sheetKey) {
|
|
352
|
+
return this.workSheetInstances.get(sheetKey) || null;
|
|
353
|
+
}
|
|
337
354
|
saveToConfig() {
|
|
338
355
|
const sheets = [];
|
|
339
356
|
return this.sheetManager.getAllSheets().forEach((sheetDefine => {
|
|
@@ -385,8 +402,23 @@ export default class VTableSheet {
|
|
|
385
402
|
}
|
|
386
403
|
exportSheetToFile(fileType, allSheets = !0) {
|
|
387
404
|
var _a, _b;
|
|
388
|
-
|
|
389
|
-
|
|
405
|
+
try {
|
|
406
|
+
this.spreadsheetEventManager.emitExportStart(fileType, allSheets);
|
|
407
|
+
const sheet = this.getActiveSheet();
|
|
408
|
+
if (!sheet) throw new Error("No active sheet available for export");
|
|
409
|
+
let sheetCount = 0;
|
|
410
|
+
if ("csv" === fileType) {
|
|
411
|
+
if (!(null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.exportToCsv)) throw new Error("TableExportPlugin not configured for CSV export");
|
|
412
|
+
sheet.tableInstance.exportToCsv(), sheetCount = 1;
|
|
413
|
+
} else if (allSheets) this.exportAllSheetsToExcel(), sheetCount = this.sheetManager.getSheetCount(); else {
|
|
414
|
+
if (!(null === (_b = sheet.tableInstance) || void 0 === _b ? void 0 : _b.exportToExcel)) throw new Error("TableExportPlugin not configured for Excel export");
|
|
415
|
+
sheet.tableInstance.exportToExcel(), sheetCount = 1;
|
|
416
|
+
}
|
|
417
|
+
this.spreadsheetEventManager.emitExportCompleted(fileType, allSheets, sheetCount);
|
|
418
|
+
} catch (error) {
|
|
419
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
420
|
+
this.spreadsheetEventManager.emitExportError(fileType, allSheets, errorMessage);
|
|
421
|
+
}
|
|
390
422
|
}
|
|
391
423
|
exportAllSheetsToExcel() {
|
|
392
424
|
var _b;
|
|
@@ -408,15 +440,26 @@ export default class VTableSheet {
|
|
|
408
440
|
importFileToSheet(options = {
|
|
409
441
|
clearExisting: !0
|
|
410
442
|
}) {
|
|
411
|
-
var _a;
|
|
443
|
+
var _a, _b;
|
|
412
444
|
return __awaiter(this, void 0, void 0, (function*() {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
445
|
+
try {
|
|
446
|
+
let result;
|
|
447
|
+
if (this.spreadsheetEventManager.emitImportStart("xlsx"), null == this ? void 0 : this._importFile) result = yield this._importFile({
|
|
448
|
+
clearExisting: !1 !== (null == options ? void 0 : options.clearExisting)
|
|
449
|
+
}); else {
|
|
450
|
+
const sheet = this.getActiveSheet();
|
|
451
|
+
if (!sheet) throw new Error("No active sheet available for import");
|
|
452
|
+
if (!(null === (_a = sheet.tableInstance) || void 0 === _a ? void 0 : _a.importFile)) throw new Error("ExcelImportPlugin not configured");
|
|
453
|
+
result = yield sheet.tableInstance.importFile({
|
|
454
|
+
clearExisting: !1 !== (null == options ? void 0 : options.clearExisting)
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
const sheetCount = result && "sheets" in result && (null === (_b = result.sheets) || void 0 === _b ? void 0 : _b.length) || 0;
|
|
458
|
+
return this.spreadsheetEventManager.emitImportCompleted("xlsx", sheetCount), result;
|
|
459
|
+
} catch (error) {
|
|
460
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
461
|
+
throw this.spreadsheetEventManager.emitImportError("xlsx", errorMessage), error;
|
|
462
|
+
}
|
|
420
463
|
}));
|
|
421
464
|
}
|
|
422
465
|
getContainer() {
|
|
@@ -438,7 +481,9 @@ export default class VTableSheet {
|
|
|
438
481
|
return this.contentElement;
|
|
439
482
|
}
|
|
440
483
|
release() {
|
|
484
|
+
this.spreadsheetEventManager.emitDestroyed(), this.tableEventRelay.clearAllListeners(),
|
|
441
485
|
this.eventManager.release(), this.formulaManager.release(), this.formulaUIManager.release(),
|
|
486
|
+
this.spreadsheetEventManager.clearAllListeners(), this.menuManager && this.menuManager.release(),
|
|
442
487
|
this.sheetTabEventHandler.removeClickOutsideListener(), this.workSheetInstances.forEach((instance => {
|
|
443
488
|
instance.release();
|
|
444
489
|
})), this.rootElement && this.rootElement.parentNode && this.rootElement.parentNode.removeChild(this.rootElement),
|
|
@@ -455,17 +500,5 @@ export default class VTableSheet {
|
|
|
455
500
|
var _a;
|
|
456
501
|
null === (_a = this.getActiveSheet()) || void 0 === _a || _a.resize();
|
|
457
502
|
}
|
|
458
|
-
excludeEditCellFromSelection(range, editRow, editCol) {
|
|
459
|
-
const r = Object.assign({}, range), withinRow = r.startRow <= editRow && editRow <= r.endRow, withinCol = r.startCol <= editCol && editCol <= r.endCol;
|
|
460
|
-
if (!withinRow || !withinCol) return r;
|
|
461
|
-
const rowSpan = r.endRow - r.startRow, colSpan = r.endCol - r.startCol;
|
|
462
|
-
return 0 === rowSpan && 0 === colSpan && r.startRow === editRow && r.startCol === editCol ? {
|
|
463
|
-
startRow: -1,
|
|
464
|
-
startCol: -1,
|
|
465
|
-
endRow: -1,
|
|
466
|
-
endCol: -1
|
|
467
|
-
} : (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),
|
|
468
|
-
r);
|
|
469
|
-
}
|
|
470
503
|
}
|
|
471
504
|
//# sourceMappingURL=vtable-sheet.js.map
|