@visactor/vtable-sheet 1.23.3-alpha.0 → 1.24.0-alpha.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 (91) hide show
  1. package/cjs/components/sheet-tab-event-handler.js +2 -5
  2. package/cjs/components/sheet-tab-event-handler.js.map +1 -1
  3. package/cjs/components/vtable-sheet.d.ts +14 -0
  4. package/cjs/components/vtable-sheet.js +77 -55
  5. package/cjs/components/vtable-sheet.js.map +1 -1
  6. package/cjs/core/WorkSheet.js +4 -48
  7. package/cjs/core/WorkSheet.js.map +1 -1
  8. package/cjs/core/table-plugins.js +30 -2
  9. package/cjs/core/table-plugins.js.map +1 -1
  10. package/cjs/event/vtable-sheet-event-bus.js +2 -1
  11. package/cjs/formula/formula-editor.d.ts +1 -1
  12. package/cjs/formula/formula-editor.js +22 -5
  13. package/cjs/formula/formula-editor.js.map +1 -1
  14. package/cjs/formula/formula-engine.d.ts +1 -0
  15. package/cjs/formula/formula-engine.js +47 -16
  16. package/cjs/formula/formula-engine.js.map +1 -1
  17. package/cjs/formula/formula-paste-processor.js +1 -2
  18. package/cjs/formula/formula-range-selector.js +1 -5
  19. package/cjs/formula/formula-range-selector.js.map +1 -1
  20. package/cjs/formula/index.js +2 -1
  21. package/cjs/index.d.ts +1 -1
  22. package/cjs/index.js +1 -1
  23. package/cjs/index.js.map +1 -1
  24. package/cjs/managers/formula-manager.d.ts +3 -1
  25. package/cjs/managers/formula-manager.js +7 -5
  26. package/cjs/managers/formula-manager.js.map +1 -1
  27. package/cjs/managers/menu-manager.d.ts +7 -1
  28. package/cjs/managers/menu-manager.js +37 -4
  29. package/cjs/managers/menu-manager.js.map +1 -1
  30. package/cjs/managers/tab-drag-manager.d.ts +2 -2
  31. package/cjs/managers/tab-drag-manager.js +1 -2
  32. package/cjs/managers/tab-drag-manager.js.map +1 -1
  33. package/cjs/managers/workbook-history-manager.d.ts +53 -0
  34. package/cjs/managers/workbook-history-manager.js +294 -0
  35. package/cjs/managers/workbook-history-manager.js.map +1 -0
  36. package/cjs/styles/menu.js +1 -1
  37. package/cjs/styles/menu.js.map +1 -1
  38. package/cjs/test-shims/vtable-plugins.d.ts +5 -0
  39. package/cjs/test-shims/vtable-plugins.js +34 -0
  40. package/cjs/test-shims/vtable-plugins.js.map +1 -0
  41. package/cjs/ts-types/base.js +1 -2
  42. package/cjs/ts-types/formula.js +2 -1
  43. package/cjs/ts-types/index.d.ts +4 -0
  44. package/cjs/ts-types/index.js.map +1 -1
  45. package/dist/vtable-sheet.js +2566 -339
  46. package/dist/vtable-sheet.min.js +1 -1
  47. package/es/components/sheet-tab-event-handler.js +1 -4
  48. package/es/components/sheet-tab-event-handler.js.map +1 -1
  49. package/es/components/vtable-sheet.d.ts +14 -0
  50. package/es/components/vtable-sheet.js +76 -33
  51. package/es/components/vtable-sheet.js.map +1 -1
  52. package/es/core/WorkSheet.js +4 -48
  53. package/es/core/WorkSheet.js.map +1 -1
  54. package/es/core/table-plugins.js +31 -1
  55. package/es/core/table-plugins.js.map +1 -1
  56. package/es/event/vtable-sheet-event-bus.js +2 -1
  57. package/es/formula/formula-editor.d.ts +1 -1
  58. package/es/formula/formula-editor.js +19 -4
  59. package/es/formula/formula-editor.js.map +1 -1
  60. package/es/formula/formula-engine.d.ts +1 -0
  61. package/es/formula/formula-engine.js +47 -16
  62. package/es/formula/formula-engine.js.map +1 -1
  63. package/es/formula/formula-paste-processor.js +1 -2
  64. package/es/formula/formula-range-selector.js +1 -5
  65. package/es/formula/formula-range-selector.js.map +1 -1
  66. package/es/formula/index.js +2 -1
  67. package/es/index.d.ts +1 -1
  68. package/es/index.js +1 -1
  69. package/es/index.js.map +1 -1
  70. package/es/managers/formula-manager.d.ts +3 -1
  71. package/es/managers/formula-manager.js +7 -5
  72. package/es/managers/formula-manager.js.map +1 -1
  73. package/es/managers/menu-manager.d.ts +7 -1
  74. package/es/managers/menu-manager.js +37 -4
  75. package/es/managers/menu-manager.js.map +1 -1
  76. package/es/managers/tab-drag-manager.d.ts +2 -2
  77. package/es/managers/tab-drag-manager.js +1 -2
  78. package/es/managers/tab-drag-manager.js.map +1 -1
  79. package/es/managers/workbook-history-manager.d.ts +53 -0
  80. package/es/managers/workbook-history-manager.js +286 -0
  81. package/es/managers/workbook-history-manager.js.map +1 -0
  82. package/es/styles/menu.js +1 -1
  83. package/es/styles/menu.js.map +1 -1
  84. package/es/test-shims/vtable-plugins.d.ts +5 -0
  85. package/es/test-shims/vtable-plugins.js +6 -0
  86. package/es/test-shims/vtable-plugins.js.map +1 -0
  87. package/es/ts-types/base.js +1 -2
  88. package/es/ts-types/formula.js +2 -1
  89. package/es/ts-types/index.d.ts +4 -0
  90. package/es/ts-types/index.js.map +1 -1
  91. package/package.json +6 -6
@@ -38,15 +38,12 @@ class SheetTabEventHandler {
38
38
  targetTab.addEventListener("blur", onBlur), targetTab.addEventListener("keydown", onKeyDown);
39
39
  }
40
40
  renameSheet(sheetKey, newTitle) {
41
- var _a;
42
41
  if (!this.vTableSheet.getSheetManager().getSheet(sheetKey)) return !1;
43
42
  const error = (0, tools_1.checkTabTitle)(newTitle);
44
43
  if (error) return (0, snackbar_1.showSnackbar)(error, 1300), !1;
45
44
  return this.vTableSheet.getSheetManager().getAllSheets().find((s => s.sheetKey !== sheetKey && s.sheetTitle.toLowerCase() === newTitle.toLowerCase())) ? ((0,
46
- snackbar_1.showSnackbar)("工作表名称已存在,请重新输入", 1300), !1) : (this.vTableSheet.getSheetManager().renameSheet(sheetKey, newTitle),
47
- null === (_a = this.vTableSheet.workSheetInstances.get(sheetKey)) || void 0 === _a || _a.setTitle(newTitle),
48
- this.vTableSheet.getFormulaManager().updateSheetTitle(sheetKey, newTitle), this.vTableSheet.updateSheetTabs(),
49
- this.vTableSheet.updateSheetMenu(), !0);
45
+ snackbar_1.showSnackbar)("工作表名称已存在,请重新输入", 1300), !1) : (this.vTableSheet.renameSheet(sheetKey, newTitle),
46
+ !0);
50
47
  }
51
48
  getSheetTabElementByKey(sheetKey) {
52
49
  var _a;
@@ -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\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 if (this.vTableSheet.getOptions()?.showSheetTab === false) {\n return;\n }\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.renameSheet(sheetKey, newTitle);\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 if (this.vTableSheet.getOptions()?.showSheetTab === false) {\n return;\n }\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"]}
@@ -8,6 +8,7 @@ import { FormulaUIManager } from '../formula/formula-ui-manager';
8
8
  import type { VTableSheetEventType } from '../ts-types/spreadsheet-events';
9
9
  import { SpreadSheetEventManager } from '../event/spreadsheet-event-manager';
10
10
  import { VTableSheetEventBus } from '../event/vtable-sheet-event-bus';
11
+ import { WorkbookHistoryManager } from '../managers/workbook-history-manager';
11
12
  export default class VTableSheet {
12
13
  private container;
13
14
  private options;
@@ -26,13 +27,16 @@ export default class VTableSheet {
26
27
  private formulaBarElement;
27
28
  private sheetTabElement;
28
29
  private mainMenuElement;
30
+ private undoRedoElement;
29
31
  private contentElement;
30
32
  private dragManager;
31
33
  private sheetTabEventHandler;
34
+ private workbookHistoryManager;
32
35
  constructor(container: HTMLElement, options: IVTableSheetOptions);
33
36
  private mergeDefaultOptions;
34
37
  private initFormulaAutocomplete;
35
38
  private initUI;
39
+ private renderTopLeftControls;
36
40
  private createSheetTab;
37
41
  private _activeSheetTab;
38
42
  updateSheetTabs(tabsContainer?: HTMLElement): void;
@@ -55,7 +59,17 @@ export default class VTableSheet {
55
59
  getSpreadSheetEventManager(): SpreadSheetEventManager;
56
60
  getEventBus(): VTableSheetEventBus;
57
61
  getSheetManager(): SheetManager;
62
+ getWorkbookHistoryManager(): WorkbookHistoryManager;
58
63
  getActiveSheet(): WorkSheet | null;
64
+ getWorkSheetInstance(sheetKey: string): WorkSheet | undefined;
65
+ setWorkSheetInstance(sheetKey: string, instance: WorkSheet): void;
66
+ deleteWorkSheetInstance(sheetKey: string): void;
67
+ renameSheet(sheetKey: string, newTitle: string): void;
68
+ reorderSheet(sourceKey: string, targetKey: string, position: 'left' | 'right'): void;
69
+ undo(): void;
70
+ redo(): void;
71
+ startHistoryTransaction(): void;
72
+ endHistoryTransaction(): void;
59
73
  onTableEvent<K extends keyof TableEventHandlersEventArgumentMap>(type: K, callback: (event: TableEventHandlersEventArgumentMap[K] & {
60
74
  sheetKey: string;
61
75
  }) => void): void;
@@ -1,29 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
4
- void 0 === k2 && (k2 = k);
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
7
- enumerable: !0,
8
- get: function() {
9
- return m[k];
10
- }
11
- }), Object.defineProperty(o, k2, desc);
12
- } : function(o, m, k, k2) {
13
- void 0 === k2 && (k2 = k), o[k2] = m[k];
14
- }), __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function(o, v) {
15
- Object.defineProperty(o, "default", {
16
- enumerable: !0,
17
- value: v
18
- });
19
- } : function(o, v) {
20
- o.default = v;
21
- }), __importStar = this && this.__importStar || function(mod) {
22
- if (mod && mod.__esModule) return mod;
23
- var result = {};
24
- if (null != mod) for (var k in mod) "default" !== k && Object.prototype.hasOwnProperty.call(mod, k) && __createBinding(result, mod, k);
25
- return __setModuleDefault(result, mod), result;
26
- }, __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
3
+ var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
27
4
  return new (P || (P = Promise))((function(resolve, reject) {
28
5
  function fulfilled(value) {
29
6
  try {
@@ -65,21 +42,21 @@ Object.defineProperty(exports, "__esModule", {
65
42
  value: !0
66
43
  });
67
44
 
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"), sheet_helper_1 = require("../sheet-helper"), themes_1 = require("@visactor/vtable/es/themes");
69
-
70
- VTable.register.editor("formula", formula_editor_1.formulaEditor);
45
+ const formula_manager_1 = require("../managers/formula-manager"), sheet_manager_1 = __importDefault(require("../managers/sheet-manager")), WorkSheet_1 = require("../core/WorkSheet"), 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"), sheet_helper_1 = require("../sheet-helper"), themes_1 = require("@visactor/vtable/es/themes"), workbook_history_manager_1 = require("../managers/workbook-history-manager");
71
46
 
72
47
  class VTableSheet {
73
48
  constructor(container, options) {
74
49
  this.activeWorkSheet = null, this.workSheetInstances = new Map, this.formulaAutocomplete = null,
75
50
  this.formulaBarElement = null, this.sheetTabElement = null, this.mainMenuElement = null,
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),
79
- this.dragManager = new tab_drag_manager_1.default(this), this.menuManager = new menu_manager_1.MenuManager(this),
51
+ this.undoRedoElement = null, this.container = container, this.options = this.mergeDefaultOptions(options),
52
+ this.eventBus = new vtable_sheet_event_bus_1.VTableSheetEventBus, this.sheetManager = new sheet_manager_1.default(this.eventBus),
53
+ this.formulaManager = new formula_manager_1.FormulaManager(this), this.tableEventRelay = new table_event_relay_1.TableEventRelay(this),
54
+ this.eventManager = new dom_event_manager_1.DomEventManager(this), this.dragManager = new tab_drag_manager_1.default(this),
80
55
  this.formulaUIManager = new formula_ui_manager_1.FormulaUIManager(this), this.sheetTabEventHandler = new sheet_tab_event_handler_1.SheetTabEventHandler(this),
81
56
  this.spreadsheetEventManager = new spreadsheet_event_manager_1.SpreadSheetEventManager(this),
82
- this.initUI(), this.initSheets(), this.resize();
57
+ this.workbookHistoryManager = new workbook_history_manager_1.WorkbookHistoryManager(this),
58
+ this.menuManager = new menu_manager_1.MenuManager(this), this.initUI(), this.workbookHistoryManager.suspend(),
59
+ this.initSheets(), this.workbookHistoryManager.resume(), this.resize();
83
60
  }
84
61
  mergeDefaultOptions(options) {
85
62
  return Object.assign({
@@ -96,18 +73,26 @@ class VTableSheet {
96
73
  this.formulaAutocomplete.attachTo(formulaInput));
97
74
  }
98
75
  initUI() {
99
- var _a;
100
76
  this.rootElement = document.createElement("div"), this.rootElement.className = "vtable-sheet-container",
101
77
  this.container.appendChild(this.rootElement);
102
78
  const topContainer = document.createElement("div");
103
79
  topContainer.className = "vtable-sheet-top-container", this.rootElement.appendChild(topContainer),
104
- (null === (_a = this.options.mainMenu) || void 0 === _a ? void 0 : _a.show) && (this.mainMenuElement = this.menuManager.createMainMenu(),
105
- topContainer.appendChild(this.mainMenuElement)), this.options.showFormulaBar && (this.formulaBarElement = this.formulaUIManager.createFormulaBar(),
80
+ this.renderTopLeftControls(topContainer), this.options.showFormulaBar && (this.formulaBarElement = this.formulaUIManager.createFormulaBar(),
106
81
  topContainer.appendChild(this.formulaBarElement), this.initFormulaAutocomplete()),
107
82
  this.contentElement = document.createElement("div"), this.contentElement.className = "vtable-sheet-content",
108
83
  this.rootElement.appendChild(this.contentElement), this.options.showSheetTab && (this.sheetTabElement = this.createSheetTab(),
109
84
  this.rootElement.appendChild(this.sheetTabElement));
110
85
  }
86
+ renderTopLeftControls(topContainer) {
87
+ var _a, _b, _c, _d, _e;
88
+ (null === (_a = this.mainMenuElement) || void 0 === _a ? void 0 : _a.parentElement) && (this.mainMenuElement.parentElement.removeChild(this.mainMenuElement),
89
+ this.mainMenuElement = null), (null === (_b = this.undoRedoElement) || void 0 === _b ? void 0 : _b.parentElement) && (this.undoRedoElement.parentElement.removeChild(this.undoRedoElement),
90
+ this.undoRedoElement = null), this.menuManager.release();
91
+ const showMainMenu = !!(null === (_c = this.options.mainMenu) || void 0 === _c ? void 0 : _c.show), showUndoRedo = null === (_e = null === (_d = this.options.undoRedo) || void 0 === _d ? void 0 : _d.show) || void 0 === _e || _e;
92
+ if (showMainMenu) return this.mainMenuElement = this.menuManager.createMainMenu(),
93
+ void (topContainer.firstChild ? topContainer.insertBefore(this.mainMenuElement, topContainer.firstChild) : topContainer.appendChild(this.mainMenuElement));
94
+ showUndoRedo && (this.undoRedoElement = this.menuManager.createUndoRedoOnly(), topContainer.firstChild ? topContainer.insertBefore(this.undoRedoElement, topContainer.firstChild) : topContainer.appendChild(this.undoRedoElement));
95
+ }
111
96
  createSheetTab() {
112
97
  const sheetTab = document.createElement("div");
113
98
  sheetTab.className = "vtable-sheet-tab-bar";
@@ -205,15 +190,13 @@ class VTableSheet {
205
190
  }
206
191
  }
207
192
  addSheet(sheet) {
208
- this.sheetManager.addSheet(sheet), this.updateSheetTabs(), this.updateSheetMenu();
193
+ this.workbookHistoryManager.addSheet({
194
+ sheet: sheet,
195
+ activate: !1
196
+ });
209
197
  }
210
198
  removeSheet(sheetKey) {
211
- if (this.sheetManager.getSheetCount() <= 1) return void (0, snackbar_1.showSnackbar)("至少保留一个工作表", 1300);
212
- const instance = this.workSheetInstances.get(sheetKey);
213
- instance && (instance.release(), this.workSheetInstances.delete(sheetKey));
214
- const newActiveSheetKey = this.sheetManager.removeSheet(sheetKey);
215
- newActiveSheetKey && this.activateSheet(newActiveSheetKey), this.updateSheetTabs(),
216
- this.updateSheetMenu();
199
+ this.sheetManager.getSheetCount() <= 1 ? (0, snackbar_1.showSnackbar)("至少保留一个工作表", 1300) : this.workbookHistoryManager.removeSheet(sheetKey);
217
200
  }
218
201
  getSheetCount() {
219
202
  return this.sheetManager.getSheetCount();
@@ -226,10 +209,9 @@ class VTableSheet {
226
209
  }
227
210
  createWorkSheetInstance(sheetDefine) {
228
211
  var _a, _b, _c;
229
- formula_editor_1.formulaEditor.setSheet(this);
230
212
  const contentWidth = this.contentElement.clientWidth, contentHeight = this.contentElement.clientHeight;
231
213
  sheetDefine.dragOrder = null !== (_a = sheetDefine.dragOrder) && void 0 !== _a ? _a : this.options.dragOrder;
232
- const sheet = new WorkSheet_1.WorkSheet(this, Object.assign(Object.assign({}, sheetDefine), {
214
+ const formulaEditor = (0, formula_editor_1.createFormulaEditor)(), sheet = new WorkSheet_1.WorkSheet(this, Object.assign(Object.assign({}, sheetDefine), {
233
215
  container: this.contentElement,
234
216
  width: contentWidth,
235
217
  height: contentHeight,
@@ -237,8 +219,8 @@ class VTableSheet {
237
219
  defaultColWidth: this.options.defaultColWidth,
238
220
  dragOrder: sheetDefine.dragOrder,
239
221
  plugins: (0, table_plugins_1.getTablePlugins)(sheetDefine, this.options, this),
240
- headerEditor: "formula",
241
- editor: "formula",
222
+ headerEditor: formulaEditor,
223
+ editor: formulaEditor,
242
224
  select: {
243
225
  makeSelectCellVisible: !1
244
226
  },
@@ -246,6 +228,7 @@ class VTableSheet {
246
228
  customMergeCell: sheetDefine.cellMerge,
247
229
  theme: (null === (_b = sheetDefine.theme) || void 0 === _b ? void 0 : _b.tableTheme) || (null === (_c = this.options.theme) || void 0 === _c ? void 0 : _c.tableTheme)
248
230
  }));
231
+ formulaEditor.setSheet(this);
249
232
  try {
250
233
  const normalizedData = sheetDefine.data ? this.formulaManager.normalizeSheetData(sheetDefine.data, sheet.tableInstance) : [];
251
234
  this.formulaManager.addSheet(sheetDefine.sheetKey, normalizedData, sheetDefine.sheetTitle),
@@ -300,7 +283,10 @@ class VTableSheet {
300
283
  rowCount: 100,
301
284
  data: []
302
285
  };
303
- this.sheetManager.addSheet(newSheet), this.activateSheet(key);
286
+ this.workbookHistoryManager.addSheet({
287
+ sheet: newSheet,
288
+ activate: !0
289
+ });
304
290
  }
305
291
  updateFormulaBar() {
306
292
  this.formulaUIManager.updateFormulaBar();
@@ -317,9 +303,39 @@ class VTableSheet {
317
303
  getSheetManager() {
318
304
  return this.sheetManager;
319
305
  }
306
+ getWorkbookHistoryManager() {
307
+ return this.workbookHistoryManager;
308
+ }
320
309
  getActiveSheet() {
321
310
  return this.activeWorkSheet;
322
311
  }
312
+ getWorkSheetInstance(sheetKey) {
313
+ return this.workSheetInstances.get(sheetKey);
314
+ }
315
+ setWorkSheetInstance(sheetKey, instance) {
316
+ this.workSheetInstances.set(sheetKey, instance);
317
+ }
318
+ deleteWorkSheetInstance(sheetKey) {
319
+ this.workSheetInstances.delete(sheetKey);
320
+ }
321
+ renameSheet(sheetKey, newTitle) {
322
+ this.workbookHistoryManager.renameSheet(sheetKey, newTitle);
323
+ }
324
+ reorderSheet(sourceKey, targetKey, position) {
325
+ this.workbookHistoryManager.reorderSheet(sourceKey, targetKey, position);
326
+ }
327
+ undo() {
328
+ this.workbookHistoryManager.undo();
329
+ }
330
+ redo() {
331
+ this.workbookHistoryManager.redo();
332
+ }
333
+ startHistoryTransaction() {
334
+ this.workbookHistoryManager.startTransaction();
335
+ }
336
+ endHistoryTransaction() {
337
+ this.workbookHistoryManager.endTransaction();
338
+ }
323
339
  onTableEvent(type, callback) {
324
340
  this.tableEventRelay.onTableEvent(type, callback);
325
341
  }
@@ -398,16 +414,22 @@ class VTableSheet {
398
414
  });
399
415
  }
400
416
  updateMainMenu(mainMenu) {
401
- this.options.mainMenu = mainMenu, this.menuManager.updateMainMenu(mainMenu);
417
+ this.options.mainMenu = mainMenu;
418
+ const topContainer = this.rootElement.querySelector(".vtable-sheet-top-container");
419
+ topContainer && this.renderTopLeftControls(topContainer);
402
420
  }
403
421
  updateOption(options) {
404
422
  var _a, _b;
405
423
  if (!options) return;
406
- void 0 !== options.mainMenu && this.updateMainMenu(options.mainMenu);
407
- const pluginModulesChanged = (0, sheet_helper_1.pluginIsChanged)(this.options.VTablePluginModules, options.VTablePluginModules), tableThemeChanged = (0,
424
+ const hasMainMenu = void 0 !== options.mainMenu, hasUndoRedo = void 0 !== options.undoRedo, pluginModulesChanged = (0,
425
+ sheet_helper_1.pluginIsChanged)(this.options.VTablePluginModules, options.VTablePluginModules), tableThemeChanged = (0,
408
426
  themes_1.tableThemeIsChanged)(null === (_a = this.options.theme) || void 0 === _a ? void 0 : _a.tableTheme, null === (_b = options.theme) || void 0 === _b ? void 0 : _b.tableTheme), {sheets: sheets} = options;
409
427
  __rest(options, [ "sheets" ]);
410
- this.options = Object.assign(Object.assign({}, this.options), options), (Array.isArray(options.sheets) || pluginModulesChanged || tableThemeChanged) && this.updateSheets(options);
428
+ if (this.options = Object.assign(Object.assign({}, this.options), options), hasMainMenu || hasUndoRedo) {
429
+ const topContainer = this.rootElement.querySelector(".vtable-sheet-top-container");
430
+ topContainer && this.renderTopLeftControls(topContainer);
431
+ }
432
+ (Array.isArray(options.sheets) || pluginModulesChanged || tableThemeChanged) && this.updateSheets(options);
411
433
  }
412
434
  updateSheets(options) {
413
435
  const nextSheets = options.sheets || [], prevSheets = this.sheetManager.getAllSheets(), prevMap = new Map;
@@ -439,7 +461,7 @@ class VTableSheet {
439
461
  const newInstance = this.createWorkSheetInstance(next_sheetDefine);
440
462
  return void this.workSheetInstances.set(next_sheetDefine.sheetKey, newInstance);
441
463
  }
442
- const sheetOption = {
464
+ const formulaEditor = (0, formula_editor_1.createFormulaEditor)(), sheetOption = {
443
465
  sheetTitle: next_sheetDefine.sheetTitle,
444
466
  sheetKey: next_sheetDefine.sheetKey,
445
467
  showHeader: next_sheetDefine.showHeader,
@@ -454,8 +476,8 @@ class VTableSheet {
454
476
  defaultColWidth: this.options.defaultColWidth,
455
477
  dragOrder: next_sheetDefine.dragOrder,
456
478
  plugins: (0, table_plugins_1.getTablePlugins)(next_sheetDefine, this.options, this),
457
- headerEditor: "formula",
458
- editor: "formula",
479
+ headerEditor: formulaEditor,
480
+ editor: formulaEditor,
459
481
  select: {
460
482
  makeSelectCellVisible: !1
461
483
  },
@@ -465,7 +487,7 @@ class VTableSheet {
465
487
  data: next_sheetDefine.data,
466
488
  columns: next_sheetDefine.columns
467
489
  };
468
- instance.updateSheetOption(sheetOption);
490
+ formulaEditor.setSheet(this), instance.updateSheetOption(sheetOption);
469
491
  }));
470
492
  try {
471
493
  this.formulaManager.rebuildFormulas(nextSheets), nextSheets.forEach((sheetDefine => {