@visactor/vtable-sheet 1.23.1-alpha.2 → 1.23.2
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 +3 -2
- package/cjs/components/sheet-tab-event-handler.js.map +1 -1
- package/cjs/components/vtable-sheet.d.ts +4 -1
- package/cjs/components/vtable-sheet.js +115 -17
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.d.ts +3 -1
- package/cjs/core/WorkSheet.js +45 -21
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.d.ts +5 -0
- package/cjs/core/table-plugins.js +10 -9
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/event/table-event-relay.js +1 -0
- package/cjs/event/table-event-relay.js.map +1 -1
- package/cjs/formula/formula-engine.js +0 -1
- package/cjs/formula/formula-engine.js.map +1 -1
- package/cjs/index.d.ts +3 -3
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/managers/formula-manager.d.ts +3 -1
- package/cjs/managers/formula-manager.js +39 -15
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/managers/menu-manager.d.ts +2 -0
- package/cjs/managers/menu-manager.js +3 -0
- package/cjs/managers/menu-manager.js.map +1 -1
- package/cjs/managers/sheet-manager.d.ts +1 -0
- package/cjs/managers/sheet-manager.js +7 -0
- package/cjs/managers/sheet-manager.js.map +1 -1
- package/cjs/managers/tab-drag-manager.d.ts +2 -2
- package/cjs/managers/tab-drag-manager.js.map +1 -1
- package/cjs/sheet-helper.d.ts +2 -0
- package/cjs/sheet-helper.js +15 -3
- package/cjs/sheet-helper.js.map +1 -1
- package/cjs/ts-types/index.d.ts +2 -1
- package/cjs/ts-types/index.js.map +1 -1
- package/cjs/ts-types/sheet.d.ts +12 -7
- package/cjs/ts-types/sheet.js.map +1 -1
- package/dist/vtable-sheet.js +867 -225
- package/dist/vtable-sheet.min.js +1 -1
- package/es/components/sheet-tab-event-handler.js +3 -2
- package/es/components/sheet-tab-event-handler.js.map +1 -1
- package/es/components/vtable-sheet.d.ts +4 -1
- package/es/components/vtable-sheet.js +117 -16
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.d.ts +3 -1
- package/es/core/WorkSheet.js +44 -21
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.d.ts +5 -0
- package/es/core/table-plugins.js +8 -7
- package/es/core/table-plugins.js.map +1 -1
- package/es/event/table-event-relay.js +1 -0
- package/es/event/table-event-relay.js.map +1 -1
- package/es/formula/formula-engine.js +0 -1
- package/es/formula/formula-engine.js.map +1 -1
- package/es/index.d.ts +3 -3
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/managers/formula-manager.d.ts +3 -1
- package/es/managers/formula-manager.js +39 -15
- package/es/managers/formula-manager.js.map +1 -1
- package/es/managers/menu-manager.d.ts +2 -0
- package/es/managers/menu-manager.js +3 -0
- package/es/managers/menu-manager.js.map +1 -1
- package/es/managers/sheet-manager.d.ts +1 -0
- package/es/managers/sheet-manager.js +7 -0
- package/es/managers/sheet-manager.js.map +1 -1
- package/es/managers/tab-drag-manager.d.ts +2 -2
- package/es/managers/tab-drag-manager.js.map +1 -1
- package/es/sheet-helper.d.ts +2 -0
- package/es/sheet-helper.js +11 -0
- package/es/sheet-helper.js.map +1 -1
- package/es/ts-types/index.d.ts +2 -1
- package/es/ts-types/index.js.map +1 -1
- package/es/ts-types/sheet.d.ts +12 -7
- package/es/ts-types/sheet.js.map +1 -1
- package/package.json +8 -7
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type VTableSheet from '../components/vtable-sheet';
|
|
2
|
+
import type { IVTableSheetOptions } from '../ts-types';
|
|
2
3
|
import { MainMenuItemKey } from '../ts-types/base';
|
|
3
4
|
export declare class MenuManager {
|
|
4
5
|
private sheet;
|
|
@@ -11,4 +12,5 @@ export declare class MenuManager {
|
|
|
11
12
|
private hideAllSubMenus;
|
|
12
13
|
handleMenuClick(menuKey: MainMenuItemKey): void;
|
|
13
14
|
release(): void;
|
|
15
|
+
updateMainMenu(mainMenu: IVTableSheetOptions['mainMenu']): void;
|
|
14
16
|
}
|
|
@@ -112,6 +112,9 @@ class MenuManager {
|
|
|
112
112
|
this.clickOutsideHandler && (document.removeEventListener("click", this.clickOutsideHandler),
|
|
113
113
|
this.clickOutsideHandler = null);
|
|
114
114
|
}
|
|
115
|
+
updateMainMenu(mainMenu) {
|
|
116
|
+
this.release(), this.createMainMenu();
|
|
117
|
+
}
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
exports.MenuManager = MenuManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/managers/menu-manager.ts"],"names":[],"mappings":"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","file":"menu-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\nimport type { MainMenuItem } from '../ts-types/base';\nimport { MainMenuItemKey } from '../ts-types/base';\n\nexport class MenuManager {\n private sheet: VTableSheet;\n private menuContainer: HTMLElement;\n private clickOutsideHandler: (e: MouseEvent) => void;\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n this.createMainMenu();\n }\n\n createMainMenu(): HTMLElement {\n const menuIcon = `<svg t=\"1754379519717\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1496\" width=\"24\" height=\"24\"><path d=\"M510.435876 67.959811c-245.428735 0-444.382996 198.954261-444.382996 444.373787 0 245.420549 198.954261 444.373787 444.382996 444.373787 245.410316 0 444.372763-198.953238 444.372763-444.373787C954.807616 266.914072 755.846192 67.959811 510.435876 67.959811zM510.435876 901.156184c-214.743876 0-388.831796-174.08792-388.831796-388.822586 0-214.743876 174.088944-388.831796 388.831796-388.831796 214.732619 0 388.822586 174.08792 388.822586 388.831796C899.257439 727.068264 725.167472 901.156184 510.435876 901.156184zM666.028561 329.355193 337.411171 329.355193c-15.117302 0-27.384697 15.60235-27.384697 34.844599 0 19.259646 12.267395 34.861996 27.384697 34.861996l328.618413 0c15.124466 0 27.375487-15.60235 27.375487-34.861996C693.404048 344.957543 681.15405 329.355193 666.028561 329.355193zM666.028561 486.191194 337.411171 486.191194c-15.117302 0-27.384697 15.601326-27.384697 34.852786 0 19.25146 12.267395 34.853809 27.384697 34.853809l328.618413 0c15.124466 0 27.375487-15.601326 27.375487-34.853809C693.404048 501.792521 681.15405 486.191194 666.028561 486.191194zM666.028561 625.604384 337.411171 625.604384c-15.117302 0-27.384697 15.60235-27.384697 34.845623 0 19.25146 12.267395 34.861996 27.384697 34.861996l328.618413 0c15.124466 0 27.375487-15.611559 27.375487-34.861996C693.404048 641.206734 681.15405 625.604384 666.028561 625.604384z\" fill=\"#8a8a8a\" p-id=\"1497\"></path></svg>`;\n // const menuIcon = `<svg t=\"1754379884941\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"><path d=\"M41.79704403125004 158.46048700694445l588.8681891302084 0 0 117.0003645451389-588.8681891302084 0 0-117.0003645451389Z\" p-id=\"5684\" fill=\"#8a8a8a\"></path><path d=\"M41.79704403124998 394.9996354548611l588.8681891302086 0 0 117.0003645451389-588.8681891302086 0 0-117.0003645451389Z\" p-id=\"5685\" fill=\"#8a8a8a\"></path><path d=\"M41.79704403124998 629.4749666302083l588.8681891302084 0 0 117.0003645451389-588.8681891302084 0 0-117.0003645451389Z\" p-id=\"5686\" fill=\"#8a8a8a\"></path><path d=\"M831.596434 638.445854 642.224412 384.604518 1023.977999 384.604518Z\" p-id=\"5687\" fill=\"#8a8a8a\"></path></svg>`;\n const menu = document.createElement('div');\n menu.className = 'vtable-sheet-main-menu';\n menu.style.position = 'relative'; // 关键:为子菜单提供定位基准\n\n // 菜单按钮\n const menuButton = document.createElement('span');\n menuButton.className = 'vtable-sheet-main-menu-button';\n menuButton.innerHTML = menuIcon;\n menu.appendChild(menuButton);\n\n // 菜单项容器(直接作为 menu 的子元素)\n const menuContainer = document.createElement('div');\n menuContainer.className = 'vtable-sheet-main-menu-container';\n menu.appendChild(menuContainer); // 挂载到 menu 内部\n\n // 菜单项列表\n const menuItems = document.createElement('ul');\n menuItems.className = 'vtable-sheet-main-menu-items';\n menuContainer.appendChild(menuItems);\n\n // 动态生成菜单项\n this.sheet.getOptions().mainMenu?.items?.forEach(item => {\n const li = document.createElement('li');\n li.className = 'vtable-sheet-main-menu-item';\n li.textContent = item.name;\n li.title = item.description || ''; //title提示\n if (item.items) {\n li.classList.add('vtable-sheet-main-menu-item-has-children');\n li.onmouseenter = () => {\n const subMenu = this.createSubMenu(item.items);\n li.appendChild(subMenu);\n };\n li.onmouseleave = () => {\n li.classList.remove('vtable-sheet-main-menu-item-has-children-hover');\n if (li.querySelector('.vtable-sheet-main-menu-sub-menu')) {\n li.removeChild(li.querySelector('.vtable-sheet-main-menu-sub-menu'));\n }\n };\n }\n li.addEventListener('click', () => {\n if (item.onClick) {\n item.onClick();\n return;\n }\n if (item.menuKey) {\n this.handleMenuClick(item.menuKey);\n }\n });\n menuItems.appendChild(li);\n });\n\n // 点击事件逻辑\n menuButton.addEventListener('click', e => {\n e.stopPropagation();\n menuContainer.classList.toggle('active');\n });\n\n // 点击外部关闭菜单\n this.clickOutsideHandler = (e: MouseEvent) => {\n if (!menu.contains(e.target as Node)) {\n menuContainer.classList.remove('active');\n }\n };\n document.addEventListener('click', this.clickOutsideHandler);\n this.menuContainer = menuContainer;\n return menu;\n }\n //TODO 需要重新逻辑,需要支持多级菜单\n private createSubMenu(items: MainMenuItem[]): HTMLElement {\n // 创建子菜单容器\n const subMenuContainer = document.createElement('div');\n subMenuContainer.className = 'vtable-sheet-submenu-container';\n\n // 创建子菜单列表\n const subMenuList = document.createElement('ul');\n subMenuList.className = 'vtable-sheet-main-menu-items';\n\n // 动态生成子菜单项\n items.forEach(item => {\n const li = document.createElement('li');\n li.className = 'vtable-sheet-submenu-item';\n li.textContent = item.name;\n li.title = item.description || '';\n\n // 绑定点击事件\n li.addEventListener('click', e => {\n e.stopPropagation();\n if (item.onClick) {\n item.onClick();\n } else if (item.menuKey) {\n this.handleMenuClick(item.menuKey);\n }\n this.hideAllSubMenus(); // 点击后关闭所有子菜单\n });\n\n // 如果有嵌套子菜单\n if (item.items?.length) {\n // li.classList.add('has-submenu');\n li.classList.add('vtable-sheet-main-menu-item-has-children');\n // const arrowIcon = document.createElement('span');\n // arrowIcon.className = 'submenu-arrow';\n // arrowIcon.innerHTML = '▶';\n // li.appendChild(arrowIcon);\n\n // 鼠标悬停显示嵌套子菜单\n li.addEventListener('mouseenter', () => {\n this.hideAllSubMenus(li); // 先关闭其他子菜单\n const nestedSubMenu = this.createSubMenu(item.items);\n li.appendChild(nestedSubMenu);\n this.adjustSubMenuPosition(nestedSubMenu); // 调整定位\n });\n }\n\n subMenuList.appendChild(li);\n });\n\n subMenuContainer.appendChild(subMenuList);\n return subMenuContainer;\n }\n\n // 调整子菜单定位(避免超出视口)\n private adjustSubMenuPosition(subMenu: HTMLElement) {\n const rect = subMenu.getBoundingClientRect();\n if (rect.right > window.innerWidth) {\n subMenu.style.left = 'auto';\n subMenu.style.right = '100%'; // 改为向左展开\n }\n if (rect.bottom > window.innerHeight) {\n subMenu.style.top = 'auto';\n subMenu.style.bottom = '0'; // 向上对齐\n }\n }\n\n // 关闭所有子菜单(保留当前激活项)并隐藏主菜单\n private hideAllSubMenus(exceptElement?: HTMLElement) {\n document.querySelectorAll('.vtable-sheet-submenu-container').forEach(menu => {\n if (menu !== exceptElement?.closest('.vtable-sheet-submenu-container')) {\n menu.remove();\n }\n });\n this.menuContainer.classList.remove('active');\n }\n handleMenuClick(menuKey: MainMenuItemKey) {\n const tableInstance = this.sheet.getActiveSheet().tableInstance;\n const eventManager = this.sheet.getSpreadSheetEventManager();\n\n switch (menuKey) {\n case MainMenuItemKey.IMPORT:\n if (this.sheet.importFileToSheet) {\n this.sheet.importFileToSheet();\n }\n break;\n\n case MainMenuItemKey.EXPORT_CURRENT_SHEET_CSV:\n try {\n // 触发导出开始事件\n eventManager.emitExportStart('csv', false);\n\n if ((tableInstance as any)?.exportToCsv) {\n (tableInstance as any).exportToCsv();\n // 触发导出完成事件\n eventManager.emitExportCompleted('csv', false, 1);\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n // 触发导出失败事件\n eventManager.emitExportError('csv', false, 'TableExportPlugin not configured');\n }\n } catch (error) {\n // 触发导出失败事件\n const errorMessage = error instanceof Error ? error.message : String(error);\n eventManager.emitExportError('csv', false, errorMessage);\n console.warn('Export to CSV failed:', errorMessage);\n }\n break;\n\n case MainMenuItemKey.EXPORT_CURRENT_SHEET_XLSX:\n try {\n // 触发导出开始事件\n eventManager.emitExportStart('xlsx', false);\n\n if ((tableInstance as any)?.exportToExcel) {\n (tableInstance as any).exportToExcel();\n // 触发导出完成事件\n eventManager.emitExportCompleted('xlsx', false, 1);\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n // 触发导出失败事件\n eventManager.emitExportError('xlsx', false, 'TableExportPlugin not configured');\n }\n } catch (error) {\n // 触发导出失败事件\n const errorMessage = error instanceof Error ? error.message : String(error);\n eventManager.emitExportError('xlsx', false, errorMessage);\n console.warn('Export to Excel failed:', errorMessage);\n }\n break;\n\n case MainMenuItemKey.EXPORT_ALL_SHEETS_XLSX:\n try {\n // 触发导出开始事件\n eventManager.emitExportStart('xlsx', true);\n\n // 多 sheet 导出走 vtable-plugins 的导出工具,不依赖向 tableInstance 注入 exportToExcel\n if (this.sheet.exportAllSheetsToExcel) {\n this.sheet.exportAllSheetsToExcel();\n // 触发导出完成事件\n const sheetCount = this.sheet.getSheetCount();\n eventManager.emitExportCompleted('xlsx', true, sheetCount);\n } else {\n console.warn('Export all sheets method not available');\n // 触发导出失败事件\n eventManager.emitExportError('xlsx', true, 'Export all sheets method not available');\n }\n } catch (error) {\n // 触发导出失败事件\n const errorMessage = error instanceof Error ? error.message : String(error);\n eventManager.emitExportError('xlsx', true, errorMessage);\n console.warn('Export all sheets failed:', errorMessage);\n }\n break;\n\n default:\n break;\n }\n }\n\n /**\n * 清理菜单管理器,移除全局事件监听器\n */\n release(): void {\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/managers/menu-manager.ts"],"names":[],"mappings":"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","file":"menu-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\nimport type { IVTableSheetOptions } from '../ts-types';\nimport type { MainMenuItem } from '../ts-types/base';\nimport { MainMenuItemKey } from '../ts-types/base';\n\nexport class MenuManager {\n private sheet: VTableSheet;\n private menuContainer: HTMLElement;\n private clickOutsideHandler: (e: MouseEvent) => void;\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n this.createMainMenu();\n }\n\n createMainMenu(): HTMLElement {\n const menuIcon = `<svg t=\"1754379519717\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1496\" width=\"24\" height=\"24\"><path d=\"M510.435876 67.959811c-245.428735 0-444.382996 198.954261-444.382996 444.373787 0 245.420549 198.954261 444.373787 444.382996 444.373787 245.410316 0 444.372763-198.953238 444.372763-444.373787C954.807616 266.914072 755.846192 67.959811 510.435876 67.959811zM510.435876 901.156184c-214.743876 0-388.831796-174.08792-388.831796-388.822586 0-214.743876 174.088944-388.831796 388.831796-388.831796 214.732619 0 388.822586 174.08792 388.822586 388.831796C899.257439 727.068264 725.167472 901.156184 510.435876 901.156184zM666.028561 329.355193 337.411171 329.355193c-15.117302 0-27.384697 15.60235-27.384697 34.844599 0 19.259646 12.267395 34.861996 27.384697 34.861996l328.618413 0c15.124466 0 27.375487-15.60235 27.375487-34.861996C693.404048 344.957543 681.15405 329.355193 666.028561 329.355193zM666.028561 486.191194 337.411171 486.191194c-15.117302 0-27.384697 15.601326-27.384697 34.852786 0 19.25146 12.267395 34.853809 27.384697 34.853809l328.618413 0c15.124466 0 27.375487-15.601326 27.375487-34.853809C693.404048 501.792521 681.15405 486.191194 666.028561 486.191194zM666.028561 625.604384 337.411171 625.604384c-15.117302 0-27.384697 15.60235-27.384697 34.845623 0 19.25146 12.267395 34.861996 27.384697 34.861996l328.618413 0c15.124466 0 27.375487-15.611559 27.375487-34.861996C693.404048 641.206734 681.15405 625.604384 666.028561 625.604384z\" fill=\"#8a8a8a\" p-id=\"1497\"></path></svg>`;\n // const menuIcon = `<svg t=\"1754379884941\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"><path d=\"M41.79704403125004 158.46048700694445l588.8681891302084 0 0 117.0003645451389-588.8681891302084 0 0-117.0003645451389Z\" p-id=\"5684\" fill=\"#8a8a8a\"></path><path d=\"M41.79704403124998 394.9996354548611l588.8681891302086 0 0 117.0003645451389-588.8681891302086 0 0-117.0003645451389Z\" p-id=\"5685\" fill=\"#8a8a8a\"></path><path d=\"M41.79704403124998 629.4749666302083l588.8681891302084 0 0 117.0003645451389-588.8681891302084 0 0-117.0003645451389Z\" p-id=\"5686\" fill=\"#8a8a8a\"></path><path d=\"M831.596434 638.445854 642.224412 384.604518 1023.977999 384.604518Z\" p-id=\"5687\" fill=\"#8a8a8a\"></path></svg>`;\n const menu = document.createElement('div');\n menu.className = 'vtable-sheet-main-menu';\n menu.style.position = 'relative'; // 关键:为子菜单提供定位基准\n\n // 菜单按钮\n const menuButton = document.createElement('span');\n menuButton.className = 'vtable-sheet-main-menu-button';\n menuButton.innerHTML = menuIcon;\n menu.appendChild(menuButton);\n\n // 菜单项容器(直接作为 menu 的子元素)\n const menuContainer = document.createElement('div');\n menuContainer.className = 'vtable-sheet-main-menu-container';\n menu.appendChild(menuContainer); // 挂载到 menu 内部\n\n // 菜单项列表\n const menuItems = document.createElement('ul');\n menuItems.className = 'vtable-sheet-main-menu-items';\n menuContainer.appendChild(menuItems);\n\n // 动态生成菜单项\n this.sheet.getOptions().mainMenu?.items?.forEach(item => {\n const li = document.createElement('li');\n li.className = 'vtable-sheet-main-menu-item';\n li.textContent = item.name;\n li.title = item.description || ''; //title提示\n if (item.items) {\n li.classList.add('vtable-sheet-main-menu-item-has-children');\n li.onmouseenter = () => {\n const subMenu = this.createSubMenu(item.items);\n li.appendChild(subMenu);\n };\n li.onmouseleave = () => {\n li.classList.remove('vtable-sheet-main-menu-item-has-children-hover');\n if (li.querySelector('.vtable-sheet-main-menu-sub-menu')) {\n li.removeChild(li.querySelector('.vtable-sheet-main-menu-sub-menu'));\n }\n };\n }\n li.addEventListener('click', () => {\n if (item.onClick) {\n item.onClick();\n return;\n }\n if (item.menuKey) {\n this.handleMenuClick(item.menuKey);\n }\n });\n menuItems.appendChild(li);\n });\n\n // 点击事件逻辑\n menuButton.addEventListener('click', e => {\n e.stopPropagation();\n menuContainer.classList.toggle('active');\n });\n\n // 点击外部关闭菜单\n this.clickOutsideHandler = (e: MouseEvent) => {\n if (!menu.contains(e.target as Node)) {\n menuContainer.classList.remove('active');\n }\n };\n document.addEventListener('click', this.clickOutsideHandler);\n this.menuContainer = menuContainer;\n return menu;\n }\n //TODO 需要重新逻辑,需要支持多级菜单\n private createSubMenu(items: MainMenuItem[]): HTMLElement {\n // 创建子菜单容器\n const subMenuContainer = document.createElement('div');\n subMenuContainer.className = 'vtable-sheet-submenu-container';\n\n // 创建子菜单列表\n const subMenuList = document.createElement('ul');\n subMenuList.className = 'vtable-sheet-main-menu-items';\n\n // 动态生成子菜单项\n items.forEach(item => {\n const li = document.createElement('li');\n li.className = 'vtable-sheet-submenu-item';\n li.textContent = item.name;\n li.title = item.description || '';\n\n // 绑定点击事件\n li.addEventListener('click', e => {\n e.stopPropagation();\n if (item.onClick) {\n item.onClick();\n } else if (item.menuKey) {\n this.handleMenuClick(item.menuKey);\n }\n this.hideAllSubMenus(); // 点击后关闭所有子菜单\n });\n\n // 如果有嵌套子菜单\n if (item.items?.length) {\n // li.classList.add('has-submenu');\n li.classList.add('vtable-sheet-main-menu-item-has-children');\n // const arrowIcon = document.createElement('span');\n // arrowIcon.className = 'submenu-arrow';\n // arrowIcon.innerHTML = '▶';\n // li.appendChild(arrowIcon);\n\n // 鼠标悬停显示嵌套子菜单\n li.addEventListener('mouseenter', () => {\n this.hideAllSubMenus(li); // 先关闭其他子菜单\n const nestedSubMenu = this.createSubMenu(item.items);\n li.appendChild(nestedSubMenu);\n this.adjustSubMenuPosition(nestedSubMenu); // 调整定位\n });\n }\n\n subMenuList.appendChild(li);\n });\n\n subMenuContainer.appendChild(subMenuList);\n return subMenuContainer;\n }\n\n // 调整子菜单定位(避免超出视口)\n private adjustSubMenuPosition(subMenu: HTMLElement) {\n const rect = subMenu.getBoundingClientRect();\n if (rect.right > window.innerWidth) {\n subMenu.style.left = 'auto';\n subMenu.style.right = '100%'; // 改为向左展开\n }\n if (rect.bottom > window.innerHeight) {\n subMenu.style.top = 'auto';\n subMenu.style.bottom = '0'; // 向上对齐\n }\n }\n\n // 关闭所有子菜单(保留当前激活项)并隐藏主菜单\n private hideAllSubMenus(exceptElement?: HTMLElement) {\n document.querySelectorAll('.vtable-sheet-submenu-container').forEach(menu => {\n if (menu !== exceptElement?.closest('.vtable-sheet-submenu-container')) {\n menu.remove();\n }\n });\n this.menuContainer.classList.remove('active');\n }\n handleMenuClick(menuKey: MainMenuItemKey) {\n const tableInstance = this.sheet.getActiveSheet().tableInstance;\n const eventManager = this.sheet.getSpreadSheetEventManager();\n\n switch (menuKey) {\n case MainMenuItemKey.IMPORT:\n if (this.sheet.importFileToSheet) {\n this.sheet.importFileToSheet();\n }\n break;\n\n case MainMenuItemKey.EXPORT_CURRENT_SHEET_CSV:\n try {\n // 触发导出开始事件\n eventManager.emitExportStart('csv', false);\n\n if ((tableInstance as any)?.exportToCsv) {\n (tableInstance as any).exportToCsv();\n // 触发导出完成事件\n eventManager.emitExportCompleted('csv', false, 1);\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n // 触发导出失败事件\n eventManager.emitExportError('csv', false, 'TableExportPlugin not configured');\n }\n } catch (error) {\n // 触发导出失败事件\n const errorMessage = error instanceof Error ? error.message : String(error);\n eventManager.emitExportError('csv', false, errorMessage);\n console.warn('Export to CSV failed:', errorMessage);\n }\n break;\n\n case MainMenuItemKey.EXPORT_CURRENT_SHEET_XLSX:\n try {\n // 触发导出开始事件\n eventManager.emitExportStart('xlsx', false);\n\n if ((tableInstance as any)?.exportToExcel) {\n (tableInstance as any).exportToExcel();\n // 触发导出完成事件\n eventManager.emitExportCompleted('xlsx', false, 1);\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n // 触发导出失败事件\n eventManager.emitExportError('xlsx', false, 'TableExportPlugin not configured');\n }\n } catch (error) {\n // 触发导出失败事件\n const errorMessage = error instanceof Error ? error.message : String(error);\n eventManager.emitExportError('xlsx', false, errorMessage);\n console.warn('Export to Excel failed:', errorMessage);\n }\n break;\n\n case MainMenuItemKey.EXPORT_ALL_SHEETS_XLSX:\n try {\n // 触发导出开始事件\n eventManager.emitExportStart('xlsx', true);\n\n // 多 sheet 导出走 vtable-plugins 的导出工具,不依赖向 tableInstance 注入 exportToExcel\n if (this.sheet.exportAllSheetsToExcel) {\n this.sheet.exportAllSheetsToExcel();\n // 触发导出完成事件\n const sheetCount = this.sheet.getSheetCount();\n eventManager.emitExportCompleted('xlsx', true, sheetCount);\n } else {\n console.warn('Export all sheets method not available');\n // 触发导出失败事件\n eventManager.emitExportError('xlsx', true, 'Export all sheets method not available');\n }\n } catch (error) {\n // 触发导出失败事件\n const errorMessage = error instanceof Error ? error.message : String(error);\n eventManager.emitExportError('xlsx', true, errorMessage);\n console.warn('Export all sheets failed:', errorMessage);\n }\n break;\n\n default:\n break;\n }\n }\n\n /**\n * 清理菜单管理器,移除全局事件监听器\n */\n release(): void {\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n }\n updateMainMenu(mainMenu: IVTableSheetOptions['mainMenu']): void {\n this.release();\n this.createMainMenu();\n }\n}\n"]}
|
|
@@ -13,6 +13,7 @@ export default class SheetManager implements ISheetManager {
|
|
|
13
13
|
removeSheet(sheetKey: string): string;
|
|
14
14
|
renameSheet(sheetKey: string, newTitle: string): void;
|
|
15
15
|
getAllSheets(): ISheetDefine[];
|
|
16
|
+
sortSheets(sheets: ISheetDefine[]): void;
|
|
16
17
|
getSheet(sheetKey: string): ISheetDefine | null;
|
|
17
18
|
getSheetCount(): number;
|
|
18
19
|
getSheetAPI(sheetKey: string): IWorkSheetAPI | null;
|
|
@@ -72,6 +72,13 @@ class SheetManager {
|
|
|
72
72
|
getAllSheets() {
|
|
73
73
|
return Array.from(this._sheets.values());
|
|
74
74
|
}
|
|
75
|
+
sortSheets(sheets) {
|
|
76
|
+
const sheetsArray = Array.from(this._sheets.entries());
|
|
77
|
+
sheetsArray.sort((([keyA], [keyB]) => sheets.findIndex((s => s.sheetKey === keyA)) - sheets.findIndex((s => s.sheetKey === keyB)))),
|
|
78
|
+
this._sheets.clear(), sheetsArray.forEach((([key, sheet]) => {
|
|
79
|
+
this._sheets.set(key, sheet);
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
75
82
|
getSheet(sheetKey) {
|
|
76
83
|
return this._sheets.get(sheetKey) || null;
|
|
77
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/managers/sheet-manager.ts"],"names":[],"mappings":"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","file":"sheet-manager.js","sourcesContent":["import type { ISheetManager, IWorkSheetAPI } from '../ts-types/sheet';\nimport type { ISheetDefine } from '../ts-types';\nimport { VTableSheetEventType } from '../ts-types/spreadsheet-events';\nimport type {\n SheetAddedEvent,\n SheetRemovedEvent,\n SheetRenamedEvent,\n SheetMovedEvent\n} from '../ts-types/spreadsheet-events';\nimport type { VTableSheetEventBus } from '../event/vtable-sheet-event-bus';\n\nexport default class SheetManager implements ISheetManager {\n /** sheets集合 */\n _sheets: Map<string, ISheetDefine> = new Map();\n /** 当前活动sheet的key */\n _activeSheetKey: string = '';\n /** 事件总线 */\n private eventBus: VTableSheetEventBus;\n\n constructor(eventBus: VTableSheetEventBus) {\n this.eventBus = eventBus;\n }\n\n /**\n * 获取事件总线\n */\n getEventBus(): VTableSheetEventBus {\n return this.eventBus;\n }\n\n /**\n * 获取当前活动sheet\n */\n getActiveSheet(): ISheetDefine | null {\n // 如果没有活动sheet,返回第一个sheet\n if (!this._activeSheetKey || !this._sheets.has(this._activeSheetKey)) {\n const firstSheet = this._sheets.values().next().value;\n if (firstSheet) {\n this._activeSheetKey = firstSheet.sheetKey;\n return firstSheet;\n }\n\n // 如果没有任何sheet,返回null而不是抛出错误\n return null;\n }\n\n return this._sheets.get(this._activeSheetKey)!;\n }\n\n /**\n * 设置活动sheet\n * @param sheetKey 要设置为活动sheet的sheet的key\n */\n setActiveSheet(sheetKey: string): void {\n if (!this._sheets.has(sheetKey)) {\n throw new Error(`Sheet with key '${sheetKey}' not found`);\n }\n\n this._activeSheetKey = sheetKey;\n\n // 更新所有sheet的active状态\n for (const [key, sheet] of this._sheets.entries()) {\n sheet.active = key === sheetKey;\n }\n }\n\n /**\n * 添加sheet\n * @param sheet 要添加的sheet\n */\n addSheet(sheet: ISheetDefine): void {\n // 检查key是否已存在\n if (this._sheets.has(sheet.sheetKey)) {\n throw new Error(`Sheet with key '${sheet.sheetKey}' already exists`);\n }\n\n const index = this._sheets.size;\n\n // 添加sheet\n this._sheets.set(sheet.sheetKey, sheet);\n\n // 触发工作表添加事件(电子表格级别)\n const event: SheetAddedEvent = {\n sheetKey: sheet.sheetKey,\n sheetTitle: sheet.sheetTitle,\n index\n };\n this.eventBus.emit(VTableSheetEventType.SHEET_ADDED, event);\n }\n\n /**\n * 移除sheet\n * @param sheetKey 要移除的sheet的key\n * @returns 新的活动sheet的key\n */\n removeSheet(sheetKey: string): string {\n // 检查key是否存在\n if (!this._sheets.has(sheetKey)) {\n throw new Error(`Sheet with key '${sheetKey}' not found`);\n }\n\n // 获取要删除的sheet信息\n const sheetToRemove = this._sheets.get(sheetKey)!;\n const allSheets = Array.from(this._sheets.values());\n const index = allSheets.findIndex(sheet => sheet.sheetKey === sheetKey);\n let willReplaceSheetKey;\n // 如果要移除的是当前活动sheet,需要选择新的活动sheet\n if (sheetKey === this._activeSheetKey) {\n // 查找其他sheet\n let nextSheet: ISheetDefine | null = null;\n\n for (const [key, sheet] of this._sheets.entries()) {\n if (key !== sheetKey) {\n nextSheet = sheet;\n break;\n }\n }\n\n // 如果有其他sheet,将其设为活动sheet\n if (nextSheet) {\n willReplaceSheetKey = nextSheet.sheetKey;\n nextSheet.active = true;\n } else {\n this._activeSheetKey = '';\n willReplaceSheetKey = '';\n }\n this._activeSheetKey = willReplaceSheetKey;\n }\n\n // 移除sheet\n this._sheets.delete(sheetKey);\n\n // 触发工作表移除事件(电子表格级别)\n const event: SheetRemovedEvent = {\n sheetKey: sheetToRemove.sheetKey,\n sheetTitle: sheetToRemove.sheetTitle,\n index\n };\n this.eventBus.emit(VTableSheetEventType.SHEET_REMOVED, event);\n\n return willReplaceSheetKey;\n }\n\n /**\n * 重命名sheet\n * @param sheetKey 要重命名的sheet的key\n * @param newTitle 新的标题\n */\n renameSheet(sheetKey: string, newTitle: string): void {\n // 检查key是否存在\n if (!this._sheets.has(sheetKey)) {\n throw new Error(`Sheet with key '${sheetKey}' not found`);\n }\n\n // 获取旧标题\n const sheet = this._sheets.get(sheetKey)!;\n const oldTitle = sheet.sheetTitle;\n\n // 更新标题\n sheet.sheetTitle = newTitle;\n\n // 触发工作表重命名事件(电子表格级别)\n const event: SheetRenamedEvent = {\n sheetKey,\n oldTitle,\n newTitle\n };\n this.eventBus.emit(VTableSheetEventType.SHEET_RENAMED, event);\n }\n\n /**\n * 获取所有sheet\n * @returns 所有sheet\n */\n getAllSheets(): ISheetDefine[] {\n return Array.from(this._sheets.values());\n }\n\n /**\n * 获取指定sheet\n * @param sheetKey 要获取的sheet的key\n * @returns 指定sheet\n */\n getSheet(sheetKey: string): ISheetDefine | null {\n return this._sheets.get(sheetKey) || null;\n }\n\n /**\n * 获取sheet数量\n * @returns sheet数量\n */\n getSheetCount(): number {\n return this._sheets.size;\n }\n\n /**\n * 获取sheet API\n * @param sheetKey 要获取的sheet的key\n * @returns sheet API\n */\n getSheetAPI(sheetKey: string): IWorkSheetAPI | null {\n // TODO: Implement sheet API\n return null;\n }\n\n /**\n * 监听sheet变化\n * @param callback 回调函数\n */\n onSheetChange(callback: (sheets: ISheetDefine[]) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 移除sheet变化监听\n * @param callback 回调函数\n */\n offSheetChange(callback: (sheets: ISheetDefine[]) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 监听活动sheet变化\n * @param callback 回调函数\n */\n onActiveSheetChange(callback: (sheet: ISheetDefine) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 移除活动sheet变化监听\n * @param callback 回调函数\n */\n offActiveSheetChange(callback: (sheet: ISheetDefine) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 移动sheet的位置\n * @param sourceKey 源sheet的key\n * @param targetKey 目标sheet的key\n */\n reorderSheet(sourceKey: string, targetKey: string, position: 'left' | 'right'): void {\n if (sourceKey === targetKey) {\n console.warn('Source and target sheet keys cannot be the same');\n return;\n }\n if (!this._sheets.has(sourceKey)) {\n throw new Error(`Source sheet '${sourceKey}' does not exist`);\n }\n if (!this._sheets.has(targetKey)) {\n throw new Error(`Target sheet '${targetKey}' does not exist`);\n }\n\n // 获取移动前的索引\n const sheetsArray = Array.from(this._sheets.entries());\n const sourceIndex = sheetsArray.findIndex(([key]) => key === sourceKey);\n const targetIndex = sheetsArray.findIndex(([key]) => key === targetKey);\n if (sourceIndex === -1 || targetIndex === -1 || sourceIndex === targetIndex) {\n return;\n }\n\n // 计算插入位置\n let insertIndex = position === 'left' ? targetIndex : targetIndex + 1;\n // 调整索引\n if (sourceIndex < insertIndex) {\n insertIndex--;\n }\n\n // 重排序\n const [movedSheet] = sheetsArray.splice(sourceIndex, 1);\n sheetsArray.splice(insertIndex, 0, movedSheet);\n\n // 清空并重新添加\n this._sheets.clear();\n sheetsArray.forEach(([key, sheet]) => {\n this._sheets.set(key, sheet);\n });\n\n // 触发工作表移动事件(电子表格级别)\n const event: SheetMovedEvent = {\n sheetKey: sourceKey,\n fromIndex: sourceIndex,\n toIndex: insertIndex\n };\n this.eventBus.emit(VTableSheetEventType.SHEET_MOVED, event);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/managers/sheet-manager.ts"],"names":[],"mappings":"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","file":"sheet-manager.js","sourcesContent":["import type { ISheetManager, IWorkSheetAPI } from '../ts-types/sheet';\nimport type { ISheetDefine } from '../ts-types';\nimport { VTableSheetEventType } from '../ts-types/spreadsheet-events';\nimport type {\n SheetAddedEvent,\n SheetRemovedEvent,\n SheetRenamedEvent,\n SheetMovedEvent\n} from '../ts-types/spreadsheet-events';\nimport type { VTableSheetEventBus } from '../event/vtable-sheet-event-bus';\n\nexport default class SheetManager implements ISheetManager {\n /** sheets集合 */\n _sheets: Map<string, ISheetDefine> = new Map();\n /** 当前活动sheet的key */\n _activeSheetKey: string = '';\n /** 事件总线 */\n private eventBus: VTableSheetEventBus;\n\n constructor(eventBus: VTableSheetEventBus) {\n this.eventBus = eventBus;\n }\n\n /**\n * 获取事件总线\n */\n getEventBus(): VTableSheetEventBus {\n return this.eventBus;\n }\n\n /**\n * 获取当前活动sheet\n */\n getActiveSheet(): ISheetDefine | null {\n // 如果没有活动sheet,返回第一个sheet\n if (!this._activeSheetKey || !this._sheets.has(this._activeSheetKey)) {\n const firstSheet = this._sheets.values().next().value;\n if (firstSheet) {\n this._activeSheetKey = firstSheet.sheetKey;\n return firstSheet;\n }\n\n // 如果没有任何sheet,返回null而不是抛出错误\n return null;\n }\n\n return this._sheets.get(this._activeSheetKey)!;\n }\n\n /**\n * 设置活动sheet\n * @param sheetKey 要设置为活动sheet的sheet的key\n */\n setActiveSheet(sheetKey: string): void {\n if (!this._sheets.has(sheetKey)) {\n throw new Error(`Sheet with key '${sheetKey}' not found`);\n }\n\n this._activeSheetKey = sheetKey;\n\n // 更新所有sheet的active状态\n for (const [key, sheet] of this._sheets.entries()) {\n sheet.active = key === sheetKey;\n }\n }\n\n /**\n * 添加sheet\n * @param sheet 要添加的sheet\n */\n addSheet(sheet: ISheetDefine): void {\n // 检查key是否已存在\n if (this._sheets.has(sheet.sheetKey)) {\n throw new Error(`Sheet with key '${sheet.sheetKey}' already exists`);\n }\n\n const index = this._sheets.size;\n\n // 添加sheet\n this._sheets.set(sheet.sheetKey, sheet);\n\n // 触发工作表添加事件(电子表格级别)\n const event: SheetAddedEvent = {\n sheetKey: sheet.sheetKey,\n sheetTitle: sheet.sheetTitle,\n index\n };\n this.eventBus.emit(VTableSheetEventType.SHEET_ADDED, event);\n }\n\n /**\n * 移除sheet\n * @param sheetKey 要移除的sheet的key\n * @returns 新的活动sheet的key\n */\n removeSheet(sheetKey: string): string {\n // 检查key是否存在\n if (!this._sheets.has(sheetKey)) {\n throw new Error(`Sheet with key '${sheetKey}' not found`);\n }\n\n // 获取要删除的sheet信息\n const sheetToRemove = this._sheets.get(sheetKey)!;\n const allSheets = Array.from(this._sheets.values());\n const index = allSheets.findIndex(sheet => sheet.sheetKey === sheetKey);\n let willReplaceSheetKey;\n // 如果要移除的是当前活动sheet,需要选择新的活动sheet\n if (sheetKey === this._activeSheetKey) {\n // 查找其他sheet\n let nextSheet: ISheetDefine | null = null;\n\n for (const [key, sheet] of this._sheets.entries()) {\n if (key !== sheetKey) {\n nextSheet = sheet;\n break;\n }\n }\n\n // 如果有其他sheet,将其设为活动sheet\n if (nextSheet) {\n willReplaceSheetKey = nextSheet.sheetKey;\n nextSheet.active = true;\n } else {\n this._activeSheetKey = '';\n willReplaceSheetKey = '';\n }\n this._activeSheetKey = willReplaceSheetKey;\n }\n\n // 移除sheet\n this._sheets.delete(sheetKey);\n\n // 触发工作表移除事件(电子表格级别)\n const event: SheetRemovedEvent = {\n sheetKey: sheetToRemove.sheetKey,\n sheetTitle: sheetToRemove.sheetTitle,\n index\n };\n this.eventBus.emit(VTableSheetEventType.SHEET_REMOVED, event);\n\n return willReplaceSheetKey;\n }\n\n /**\n * 重命名sheet\n * @param sheetKey 要重命名的sheet的key\n * @param newTitle 新的标题\n */\n renameSheet(sheetKey: string, newTitle: string): void {\n // 检查key是否存在\n if (!this._sheets.has(sheetKey)) {\n throw new Error(`Sheet with key '${sheetKey}' not found`);\n }\n\n // 获取旧标题\n const sheet = this._sheets.get(sheetKey)!;\n const oldTitle = sheet.sheetTitle;\n\n // 更新标题\n sheet.sheetTitle = newTitle;\n\n // 触发工作表重命名事件(电子表格级别)\n const event: SheetRenamedEvent = {\n sheetKey,\n oldTitle,\n newTitle\n };\n this.eventBus.emit(VTableSheetEventType.SHEET_RENAMED, event);\n }\n\n /**\n * 获取所有sheet\n * @returns 所有sheet\n */\n getAllSheets(): ISheetDefine[] {\n return Array.from(this._sheets.values());\n }\n /**\n * 根据配置中的sheets顺序排序sheet\n * @param sheets 要排序的sheet\n */\n sortSheets(sheets: ISheetDefine[]) {\n // 将 Map 转换为数组并排序\n const sheetsArray = Array.from(this._sheets.entries());\n sheetsArray.sort(([keyA], [keyB]) => {\n const aIndex = sheets.findIndex(s => s.sheetKey === keyA);\n const bIndex = sheets.findIndex(s => s.sheetKey === keyB);\n return aIndex - bIndex;\n });\n\n // 清空并重新构建 Map\n this._sheets.clear();\n sheetsArray.forEach(([key, sheet]) => {\n this._sheets.set(key, sheet);\n });\n }\n\n /**\n * 获取指定sheet\n * @param sheetKey 要获取的sheet的key\n * @returns 指定sheet\n */\n getSheet(sheetKey: string): ISheetDefine | null {\n return this._sheets.get(sheetKey) || null;\n }\n\n /**\n * 获取sheet数量\n * @returns sheet数量\n */\n getSheetCount(): number {\n return this._sheets.size;\n }\n\n /**\n * 获取sheet API\n * @param sheetKey 要获取的sheet的key\n * @returns sheet API\n */\n getSheetAPI(sheetKey: string): IWorkSheetAPI | null {\n // TODO: Implement sheet API\n return null;\n }\n\n /**\n * 监听sheet变化\n * @param callback 回调函数\n */\n onSheetChange(callback: (sheets: ISheetDefine[]) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 移除sheet变化监听\n * @param callback 回调函数\n */\n offSheetChange(callback: (sheets: ISheetDefine[]) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 监听活动sheet变化\n * @param callback 回调函数\n */\n onActiveSheetChange(callback: (sheet: ISheetDefine) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 移除活动sheet变化监听\n * @param callback 回调函数\n */\n offActiveSheetChange(callback: (sheet: ISheetDefine) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 移动sheet的位置\n * @param sourceKey 源sheet的key\n * @param targetKey 目标sheet的key\n */\n reorderSheet(sourceKey: string, targetKey: string, position: 'left' | 'right'): void {\n if (sourceKey === targetKey) {\n console.warn('Source and target sheet keys cannot be the same');\n return;\n }\n if (!this._sheets.has(sourceKey)) {\n throw new Error(`Source sheet '${sourceKey}' does not exist`);\n }\n if (!this._sheets.has(targetKey)) {\n throw new Error(`Target sheet '${targetKey}' does not exist`);\n }\n\n // 获取移动前的索引\n const sheetsArray = Array.from(this._sheets.entries());\n const sourceIndex = sheetsArray.findIndex(([key]) => key === sourceKey);\n const targetIndex = sheetsArray.findIndex(([key]) => key === targetKey);\n if (sourceIndex === -1 || targetIndex === -1 || sourceIndex === targetIndex) {\n return;\n }\n\n // 计算插入位置\n let insertIndex = position === 'left' ? targetIndex : targetIndex + 1;\n // 调整索引\n if (sourceIndex < insertIndex) {\n insertIndex--;\n }\n\n // 重排序\n const [movedSheet] = sheetsArray.splice(sourceIndex, 1);\n sheetsArray.splice(insertIndex, 0, movedSheet);\n\n // 清空并重新添加\n this._sheets.clear();\n sheetsArray.forEach(([key, sheet]) => {\n this._sheets.set(key, sheet);\n });\n\n // 触发工作表移动事件(电子表格级别)\n const event: SheetMovedEvent = {\n sheetKey: sourceKey,\n fromIndex: sourceIndex,\n toIndex: insertIndex\n };\n this.eventBus.emit(VTableSheetEventType.SHEET_MOVED, event);\n }\n}\n"]}
|
|
@@ -16,8 +16,8 @@ export default class SheetTabDragManager {
|
|
|
16
16
|
updateDragPreview(e: MouseEvent): void;
|
|
17
17
|
cleanupDragPreview(): void;
|
|
18
18
|
calculateDropZones(): void;
|
|
19
|
-
getDropZoneAt(x: number, y: number): typeof this.dragState.dropZones[0] | null;
|
|
20
|
-
showInsertIndicator(dropZone: typeof this.dragState.dropZones[0]): void;
|
|
19
|
+
getDropZoneAt(x: number, y: number): (typeof this.dragState.dropZones)[0] | null;
|
|
20
|
+
showInsertIndicator(dropZone: (typeof this.dragState.dropZones)[0]): void;
|
|
21
21
|
hideInsertIndicator(): void;
|
|
22
22
|
performTabReorder(sourceKey: string, targetKey: string, position: 'left' | 'right'): void;
|
|
23
23
|
cleanupDragState(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/managers/tab-drag-manager.ts"],"names":[],"mappings":"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","file":"tab-drag-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\n\n// 拖拽状态接口\ninterface DragState {\n isDragging: boolean;\n draggedSheetKey: string | null;\n draggedElement: HTMLElement | null;\n startX: number;\n startY: number;\n threshold: number;\n preview: HTMLElement | null;\n dropZones: Array<{\n element: HTMLElement;\n position: 'left' | 'right';\n targetKey: string;\n }>;\n}\n\nexport default class SheetTabDragManager {\n // 依赖的VTableSheet实例\n private sheet: VTableSheet;\n // 拖拽状态\n private dragState: DragState = {\n isDragging: false,\n draggedSheetKey: null,\n draggedElement: null,\n startX: 0,\n startY: 0,\n threshold: 5,\n preview: null,\n dropZones: []\n };\n // 插入指示器\n private insertIndicator: HTMLElement | null = null;\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n // 绑定this上下文并存储函数引用\n this.boundMouseMove = e => this.handleGlobalMouseMove(e);\n this.boundMouseUp = e => this.handleGlobalMouseUp(e);\n }\n\n /**\n * 处理tab鼠标按下事件\n */\n handleTabMouseDown(e: MouseEvent, sheetKey: string): void {\n if (!this.insertIndicator) {\n this.insertIndicator = this.sheet.getRootElement().querySelector('.vtable-sheet-insert-indicator') as HTMLElement;\n }\n if (e.button !== 0) {\n return;\n }\n e.preventDefault();\n // 记录拖拽开始位置\n this.dragState.startX = e.clientX;\n this.dragState.startY = e.clientY;\n this.dragState.draggedSheetKey = sheetKey;\n this.dragState.draggedElement = e.target as HTMLElement;\n\n // 全局鼠标事件监听\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n }\n\n /**\n * 处理全局鼠标移动事件\n *\n */\n handleGlobalMouseMove(e: MouseEvent): void {\n if (!this.dragState.draggedSheetKey || !this.dragState.draggedElement) {\n return;\n }\n const deltaX = Math.abs(e.clientX - this.dragState.startX);\n const deltaY = Math.abs(e.clientY - this.dragState.startY);\n // 判断是否超过拖拽阈值\n if (!this.dragState.isDragging && (deltaX > this.dragState.threshold || deltaY > this.dragState.threshold)) {\n this.startDragging();\n }\n if (this.dragState.isDragging) {\n this.updateDragging(e);\n }\n }\n\n /**\n * 处理全局鼠标抬起事件\n */\n handleGlobalMouseUp(e: MouseEvent): void {\n if (this.dragState.isDragging) {\n this.endDragging(e);\n }\n // 清理拖拽状态\n this.cleanupDragState();\n // 移除全局事件监听\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n }\n\n /**\n * 开始拖拽\n */\n startDragging(): void {\n if (!this.dragState.draggedElement || !this.dragState.draggedSheetKey) {\n return;\n }\n this.dragState.isDragging = true;\n this.dragState.draggedElement.classList.add('dragging');\n // 创建拖拽预览\n this.createDragPreview();\n // 计算放置区域\n this.calculateDropZones();\n if (this.insertIndicator) {\n this.insertIndicator.style.display = 'block';\n }\n }\n\n /**\n * 更新拖拽状态\n */\n updateDragging(e: MouseEvent): void {\n if (!this.dragState.isDragging) {\n return;\n }\n // 更新拖拽预览位置\n this.updateDragPreview(e);\n // 检测当前鼠标位置对应的放置区域\n const dropZone = this.getDropZoneAt(e.clientX, e.clientY);\n if (dropZone) {\n this.showInsertIndicator(dropZone);\n } else {\n this.hideInsertIndicator();\n }\n }\n\n /**\n * 结束拖拽\n */\n endDragging(e: MouseEvent): void {\n if (!this.dragState.isDragging || !this.dragState.draggedSheetKey) {\n return;\n }\n // 检查是否有有效的放置目标\n const dropZone = this.getDropZoneAt(e.clientX, e.clientY);\n if (dropZone && dropZone.targetKey !== this.dragState.draggedSheetKey) {\n // 执行拖拽排序\n this.performTabReorder(this.dragState.draggedSheetKey, dropZone.targetKey, dropZone.position);\n }\n this.hideInsertIndicator();\n if (this.dragState.draggedElement) {\n this.dragState.draggedElement.classList.remove('dragging');\n }\n }\n\n /**\n * 创建拖拽预览\n */\n createDragPreview(): void {\n if (!this.dragState.draggedElement) {\n return;\n }\n // 创建拖拽预览元素\n this.dragState.preview = document.createElement('div');\n this.dragState.preview.className = 'vtable-sheet-drag-preview';\n this.dragState.preview.innerHTML = `\n <span class=\"drag-preview-text\">${this.dragState.draggedElement.textContent}</span>\n `;\n document.body.appendChild(this.dragState.preview);\n this.dragState.draggedElement.style.cursor = 'grabbing';\n }\n\n /**\n * 更新拖拽预览位置\n */\n updateDragPreview(e: MouseEvent): void {\n if (!this.dragState.preview) {\n return;\n }\n this.dragState.preview.style.left = `${e.clientX - this.dragState.preview.offsetWidth / 2}px`;\n this.dragState.preview.style.top = `${e.clientY - this.dragState.preview.offsetHeight / 2}px`;\n }\n\n /**\n * 清理拖拽预览\n */\n cleanupDragPreview(): void {\n // 移除拖拽预览元素\n if (this.dragState.preview) {\n this.dragState.preview.remove();\n this.dragState.preview = null;\n }\n if (this.dragState.draggedElement) {\n this.dragState.draggedElement.style.cursor = '';\n }\n }\n\n /**\n * 计算放置区域\n */\n calculateDropZones(): void {\n this.dragState.dropZones = [];\n const tabsContainer = this.sheet.getSheetTabElement()?.querySelector('.vtable-sheet-tabs-container') as HTMLElement;\n if (!tabsContainer) {\n return;\n }\n const tabs = tabsContainer.querySelectorAll('.vtable-sheet-tab') as NodeListOf<HTMLElement>;\n tabs.forEach(tab => {\n const sheetKey = tab.dataset.key;\n if (!sheetKey || sheetKey === this.dragState.draggedSheetKey) {\n return;\n }\n // 左侧放置区域\n this.dragState.dropZones.push({\n element: tab,\n position: 'left',\n targetKey: sheetKey\n });\n\n // 右侧放置区域\n this.dragState.dropZones.push({\n element: tab,\n position: 'right',\n targetKey: sheetKey\n });\n });\n }\n\n /**\n * 获取指定位置的放置区域\n */\n getDropZoneAt(x: number, y: number): typeof this.dragState.dropZones[0] | null {\n for (const zone of this.dragState.dropZones) {\n const rect = zone.element.getBoundingClientRect();\n\n // 检查Y坐标是否在tab范围内\n if (y < rect.top || y > rect.bottom) {\n continue;\n }\n const midX = rect.left + rect.width / 2;\n if (zone.position === 'left' && x >= rect.left && x <= midX) {\n return zone;\n } else if (zone.position === 'right' && x >= midX && x <= rect.right) {\n return zone;\n }\n }\n\n return null;\n }\n\n /**\n * 显示插入指示器\n */\n showInsertIndicator(dropZone: typeof this.dragState.dropZones[0]): void {\n if (!this.insertIndicator) {\n return;\n }\n const rect = dropZone.element.getBoundingClientRect();\n const containerRect = this.sheet\n .getRootElement()\n .querySelector('.vtable-sheet-tabs-container')\n ?.getBoundingClientRect();\n if (!containerRect) {\n return;\n }\n let indicatorX: number;\n if (dropZone.position === 'left') {\n indicatorX = rect.left - containerRect.left - 4;\n } else {\n indicatorX = rect.right - containerRect.left - 4;\n }\n this.insertIndicator.style.left = `${indicatorX}px`;\n this.insertIndicator.style.display = 'block';\n }\n\n /**\n * 隐藏插入指示器\n */\n hideInsertIndicator(): void {\n if (this.insertIndicator) {\n this.insertIndicator.style.display = 'none';\n }\n }\n\n /**\n * 执行tab排序\n * @param sourceKey 源tab的key\n * @param targetKey 目标tab的key\n * @param position 插入位置 左侧或右侧\n */\n performTabReorder(sourceKey: string, targetKey: string, position: 'left' | 'right'): void {\n try {\n this.sheet.getSheetManager().reorderSheet(sourceKey, targetKey, position);\n // 更新UI\n this.sheet.updateSheetTabs();\n this.sheet.updateSheetMenu();\n } catch (error) {\n console.error('Tab reorder failed:', error);\n }\n }\n\n /**\n * 清理拖拽状态\n */\n cleanupDragState(): void {\n this.cleanupDragPreview();\n // 重置拖拽状态\n this.dragState.isDragging = false;\n this.dragState.draggedSheetKey = null;\n this.dragState.draggedElement = null;\n this.dragState.dropZones = [];\n this.dragState.startX = 0;\n this.dragState.startY = 0;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/managers/tab-drag-manager.ts"],"names":[],"mappings":"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","file":"tab-drag-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\n\n// 拖拽状态接口\ninterface DragState {\n isDragging: boolean;\n draggedSheetKey: string | null;\n draggedElement: HTMLElement | null;\n startX: number;\n startY: number;\n threshold: number;\n preview: HTMLElement | null;\n dropZones: Array<{\n element: HTMLElement;\n position: 'left' | 'right';\n targetKey: string;\n }>;\n}\n\nexport default class SheetTabDragManager {\n // 依赖的VTableSheet实例\n private sheet: VTableSheet;\n // 拖拽状态\n private dragState: DragState = {\n isDragging: false,\n draggedSheetKey: null,\n draggedElement: null,\n startX: 0,\n startY: 0,\n threshold: 5,\n preview: null,\n dropZones: []\n };\n // 插入指示器\n private insertIndicator: HTMLElement | null = null;\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n // 绑定this上下文并存储函数引用\n this.boundMouseMove = e => this.handleGlobalMouseMove(e);\n this.boundMouseUp = e => this.handleGlobalMouseUp(e);\n }\n\n /**\n * 处理tab鼠标按下事件\n */\n handleTabMouseDown(e: MouseEvent, sheetKey: string): void {\n if (!this.insertIndicator) {\n this.insertIndicator = this.sheet.getRootElement().querySelector('.vtable-sheet-insert-indicator') as HTMLElement;\n }\n if (e.button !== 0) {\n return;\n }\n e.preventDefault();\n // 记录拖拽开始位置\n this.dragState.startX = e.clientX;\n this.dragState.startY = e.clientY;\n this.dragState.draggedSheetKey = sheetKey;\n this.dragState.draggedElement = e.target as HTMLElement;\n\n // 全局鼠标事件监听\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n }\n\n /**\n * 处理全局鼠标移动事件\n *\n */\n handleGlobalMouseMove(e: MouseEvent): void {\n if (!this.dragState.draggedSheetKey || !this.dragState.draggedElement) {\n return;\n }\n const deltaX = Math.abs(e.clientX - this.dragState.startX);\n const deltaY = Math.abs(e.clientY - this.dragState.startY);\n // 判断是否超过拖拽阈值\n if (!this.dragState.isDragging && (deltaX > this.dragState.threshold || deltaY > this.dragState.threshold)) {\n this.startDragging();\n }\n if (this.dragState.isDragging) {\n this.updateDragging(e);\n }\n }\n\n /**\n * 处理全局鼠标抬起事件\n */\n handleGlobalMouseUp(e: MouseEvent): void {\n if (this.dragState.isDragging) {\n this.endDragging(e);\n }\n // 清理拖拽状态\n this.cleanupDragState();\n // 移除全局事件监听\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n }\n\n /**\n * 开始拖拽\n */\n startDragging(): void {\n if (!this.dragState.draggedElement || !this.dragState.draggedSheetKey) {\n return;\n }\n this.dragState.isDragging = true;\n this.dragState.draggedElement.classList.add('dragging');\n // 创建拖拽预览\n this.createDragPreview();\n // 计算放置区域\n this.calculateDropZones();\n if (this.insertIndicator) {\n this.insertIndicator.style.display = 'block';\n }\n }\n\n /**\n * 更新拖拽状态\n */\n updateDragging(e: MouseEvent): void {\n if (!this.dragState.isDragging) {\n return;\n }\n // 更新拖拽预览位置\n this.updateDragPreview(e);\n // 检测当前鼠标位置对应的放置区域\n const dropZone = this.getDropZoneAt(e.clientX, e.clientY);\n if (dropZone) {\n this.showInsertIndicator(dropZone);\n } else {\n this.hideInsertIndicator();\n }\n }\n\n /**\n * 结束拖拽\n */\n endDragging(e: MouseEvent): void {\n if (!this.dragState.isDragging || !this.dragState.draggedSheetKey) {\n return;\n }\n // 检查是否有有效的放置目标\n const dropZone = this.getDropZoneAt(e.clientX, e.clientY);\n if (dropZone && dropZone.targetKey !== this.dragState.draggedSheetKey) {\n // 执行拖拽排序\n this.performTabReorder(this.dragState.draggedSheetKey, dropZone.targetKey, dropZone.position);\n }\n this.hideInsertIndicator();\n if (this.dragState.draggedElement) {\n this.dragState.draggedElement.classList.remove('dragging');\n }\n }\n\n /**\n * 创建拖拽预览\n */\n createDragPreview(): void {\n if (!this.dragState.draggedElement) {\n return;\n }\n // 创建拖拽预览元素\n this.dragState.preview = document.createElement('div');\n this.dragState.preview.className = 'vtable-sheet-drag-preview';\n this.dragState.preview.innerHTML = `\n <span class=\"drag-preview-text\">${this.dragState.draggedElement.textContent}</span>\n `;\n document.body.appendChild(this.dragState.preview);\n this.dragState.draggedElement.style.cursor = 'grabbing';\n }\n\n /**\n * 更新拖拽预览位置\n */\n updateDragPreview(e: MouseEvent): void {\n if (!this.dragState.preview) {\n return;\n }\n this.dragState.preview.style.left = `${e.clientX - this.dragState.preview.offsetWidth / 2}px`;\n this.dragState.preview.style.top = `${e.clientY - this.dragState.preview.offsetHeight / 2}px`;\n }\n\n /**\n * 清理拖拽预览\n */\n cleanupDragPreview(): void {\n // 移除拖拽预览元素\n if (this.dragState.preview) {\n this.dragState.preview.remove();\n this.dragState.preview = null;\n }\n if (this.dragState.draggedElement) {\n this.dragState.draggedElement.style.cursor = '';\n }\n }\n\n /**\n * 计算放置区域\n */\n calculateDropZones(): void {\n this.dragState.dropZones = [];\n const tabsContainer = this.sheet.getSheetTabElement()?.querySelector('.vtable-sheet-tabs-container') as HTMLElement;\n if (!tabsContainer) {\n return;\n }\n const tabs = tabsContainer.querySelectorAll('.vtable-sheet-tab') as NodeListOf<HTMLElement>;\n tabs.forEach(tab => {\n const sheetKey = tab.dataset.key;\n if (!sheetKey || sheetKey === this.dragState.draggedSheetKey) {\n return;\n }\n // 左侧放置区域\n this.dragState.dropZones.push({\n element: tab,\n position: 'left',\n targetKey: sheetKey\n });\n\n // 右侧放置区域\n this.dragState.dropZones.push({\n element: tab,\n position: 'right',\n targetKey: sheetKey\n });\n });\n }\n\n /**\n * 获取指定位置的放置区域\n */\n getDropZoneAt(x: number, y: number): (typeof this.dragState.dropZones)[0] | null {\n for (const zone of this.dragState.dropZones) {\n const rect = zone.element.getBoundingClientRect();\n\n // 检查Y坐标是否在tab范围内\n if (y < rect.top || y > rect.bottom) {\n continue;\n }\n const midX = rect.left + rect.width / 2;\n if (zone.position === 'left' && x >= rect.left && x <= midX) {\n return zone;\n } else if (zone.position === 'right' && x >= midX && x <= rect.right) {\n return zone;\n }\n }\n\n return null;\n }\n\n /**\n * 显示插入指示器\n */\n showInsertIndicator(dropZone: (typeof this.dragState.dropZones)[0]): void {\n if (!this.insertIndicator) {\n return;\n }\n const rect = dropZone.element.getBoundingClientRect();\n const containerRect = this.sheet\n .getRootElement()\n .querySelector('.vtable-sheet-tabs-container')\n ?.getBoundingClientRect();\n if (!containerRect) {\n return;\n }\n let indicatorX: number;\n if (dropZone.position === 'left') {\n indicatorX = rect.left - containerRect.left - 4;\n } else {\n indicatorX = rect.right - containerRect.left - 4;\n }\n this.insertIndicator.style.left = `${indicatorX}px`;\n this.insertIndicator.style.display = 'block';\n }\n\n /**\n * 隐藏插入指示器\n */\n hideInsertIndicator(): void {\n if (this.insertIndicator) {\n this.insertIndicator.style.display = 'none';\n }\n }\n\n /**\n * 执行tab排序\n * @param sourceKey 源tab的key\n * @param targetKey 目标tab的key\n * @param position 插入位置 左侧或右侧\n */\n performTabReorder(sourceKey: string, targetKey: string, position: 'left' | 'right'): void {\n try {\n this.sheet.getSheetManager().reorderSheet(sourceKey, targetKey, position);\n // 更新UI\n this.sheet.updateSheetTabs();\n this.sheet.updateSheetMenu();\n } catch (error) {\n console.error('Tab reorder failed:', error);\n }\n }\n\n /**\n * 清理拖拽状态\n */\n cleanupDragState(): void {\n this.cleanupDragPreview();\n // 重置拖拽状态\n this.dragState.isDragging = false;\n this.dragState.draggedSheetKey = null;\n this.dragState.draggedElement = null;\n this.dragState.dropZones = [];\n this.dragState.startX = 0;\n this.dragState.startY = 0;\n }\n}\n"]}
|
package/cjs/sheet-helper.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { IVTableSheetOptions } from '.';
|
|
1
2
|
export declare function columnStringToIndex(colStr: string): number;
|
|
2
3
|
export declare function columnIndexToString(colIndex: number): string;
|
|
3
4
|
export declare function dataToRecords(data: any[][]): any[];
|
|
@@ -13,3 +14,4 @@ export declare function excludeEditCellFromSelection(range: {
|
|
|
13
14
|
endRow: number;
|
|
14
15
|
endCol: number;
|
|
15
16
|
};
|
|
17
|
+
export declare function pluginIsChanged(prevPlugins: IVTableSheetOptions['VTablePluginModules'] | undefined, newPlugins: IVTableSheetOptions['VTablePluginModules'] | undefined): boolean;
|
package/cjs/sheet-helper.js
CHANGED
|
@@ -51,9 +51,21 @@ function excludeEditCellFromSelection(range, editRow, editCol) {
|
|
|
51
51
|
r);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
function pluginIsChanged(prevPlugins, newPlugins) {
|
|
55
|
+
return !(!prevPlugins && !newPlugins) && (!(prevPlugins || !newPlugins) || (!(!prevPlugins || newPlugins) || prevPlugins.some(((prevPlugin, index) => {
|
|
56
|
+
const newPlugin = newPlugins[index];
|
|
57
|
+
return newPlugin.module !== prevPlugin.module || pluginOptionsIsChanged(newPlugin.moduleOptions, prevPlugin.moduleOptions);
|
|
58
|
+
}))));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function pluginOptionsIsChanged(prevPluginOptions, newPluginOptions) {
|
|
62
|
+
return !(!prevPluginOptions && !newPluginOptions) && (!(prevPluginOptions || !newPluginOptions) || (!(!prevPluginOptions || newPluginOptions) || JSON.stringify(prevPluginOptions) !== JSON.stringify(newPluginOptions)));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=sheet-helper.js.map
|
|
54
66
|
Object.defineProperty(exports, "__esModule", {
|
|
55
67
|
value: !0
|
|
56
|
-
}), exports.excludeEditCellFromSelection = exports.recordsToData = exports.dataToRecords = exports.columnIndexToString = exports.columnStringToIndex = void 0,
|
|
68
|
+
}), exports.pluginIsChanged = exports.excludeEditCellFromSelection = exports.recordsToData = exports.dataToRecords = exports.columnIndexToString = exports.columnStringToIndex = void 0,
|
|
57
69
|
exports.columnStringToIndex = columnStringToIndex, exports.columnIndexToString = columnIndexToString,
|
|
58
|
-
exports.dataToRecords = dataToRecords, exports.recordsToData = recordsToData, exports.excludeEditCellFromSelection = excludeEditCellFromSelection
|
|
59
|
-
|
|
70
|
+
exports.dataToRecords = dataToRecords, exports.recordsToData = recordsToData, exports.excludeEditCellFromSelection = excludeEditCellFromSelection,
|
|
71
|
+
exports.pluginIsChanged = pluginIsChanged;
|
package/cjs/sheet-helper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sheet-helper.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"sources":["../src/sheet-helper.ts"],"names":[],"mappings":"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","file":"sheet-helper.js","sourcesContent":["import type { IVTableSheetOptions } from '.';\n\n/**\n * Convert A1 notation to column index (0-based)\n * @param colStr Column string (e.g., 'A', 'B', 'AA')\n * @returns Column index (0-based)\n */\nexport function columnStringToIndex(colStr: string): number {\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n return col - 1;\n}\n\n/**\n * Convert column index to A1 notation string\n * @param colIndex Column index (0-based)\n * @returns Column string (e.g., 'A', 'B', 'AA')\n */\nexport function columnIndexToString(colIndex: number): string {\n let colStr = '';\n let tempCol = colIndex + 1;\n\n do {\n tempCol -= 1;\n colStr = String.fromCharCode(65 + (tempCol % 26)) + colStr;\n tempCol = Math.floor(tempCol / 26);\n } while (tempCol > 0);\n\n return colStr;\n}\n\n/**\n * Convert sheet data to VTable records format\n * @param data Sheet data (2D array)\n * @returns VTable records format\n */\nexport function dataToRecords(data: any[][]): any[] {\n if (!data || !data.length) {\n return [];\n }\n\n const records = [];\n const headerRow = data[0];\n\n // Skip header row if it exists\n for (let i = 1; i < data.length; i++) {\n const row = data[i];\n const record: Record<string, any> = {};\n\n for (let j = 0; j < row.length; j++) {\n // Use header row values as field names if available, otherwise use column index\n const fieldName = headerRow && j < headerRow.length ? headerRow[j] : j.toString();\n record[fieldName] = row[j];\n }\n\n records.push(record);\n }\n\n return records;\n}\n\n/**\n * Convert VTable records format to sheet data (2D array)\n * @param records VTable records\n * @param columns VTable columns definition\n * @returns Sheet data (2D array)\n */\nexport function recordsToData(records: any[], columns: any[]): any[][] {\n if (!records || !records.length) {\n return [];\n }\n\n const data: any[][] = [];\n\n // Add header row based on column definitions\n const headerRow = columns.map(col => col.title || col.field);\n data.push(headerRow);\n\n // Add data rows\n for (const record of records) {\n const row = columns.map(col => record[col.field]);\n data.push(row);\n }\n\n return data;\n}\n\n/**\n * 若所选范围包含当前正在编辑的单元格,自动排除该单元格以避免 #CYCLE!\n */\nexport function excludeEditCellFromSelection(\n range: { startRow: number; startCol: number; endRow: number; endCol: number },\n editRow: number,\n editCol: number\n) {\n const r = { ...range };\n const withinRow = r.startRow <= editRow && editRow <= r.endRow;\n const withinCol = r.startCol <= editCol && editCol <= r.endCol;\n if (!withinRow || !withinCol) {\n return r;\n }\n\n const rowSpan = r.endRow - r.startRow;\n const colSpan = r.endCol - r.startCol;\n\n // 如果选择范围就是编辑单元格本身,返回空范围(表示无效选择)\n if (rowSpan === 0 && colSpan === 0 && r.startRow === editRow && r.startCol === editCol) {\n return { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n }\n\n if (rowSpan >= colSpan) {\n // 优先在行方向上排除编辑单元格\n if (editRow === r.startRow && r.startRow < r.endRow) {\n r.startRow += 1;\n } else if (editRow === r.endRow && r.startRow < r.endRow) {\n r.endRow -= 1;\n } else if (r.startRow < r.endRow) {\n r.startRow += 1;\n } // 中间,默认从起点缩一格\n } else {\n // 优先在列方向上排除编辑单元格\n if (editCol === r.startCol && r.startCol < r.endCol) {\n r.startCol += 1;\n } else if (editCol === r.endCol && r.startCol < r.endCol) {\n r.endCol -= 1;\n } else if (r.startCol < r.endCol) {\n r.startCol += 1;\n }\n }\n return r;\n}\n\nexport function pluginIsChanged(\n prevPlugins: IVTableSheetOptions['VTablePluginModules'] | undefined,\n newPlugins: IVTableSheetOptions['VTablePluginModules'] | undefined\n): boolean {\n if (!prevPlugins && !newPlugins) {\n return false;\n }\n if (!prevPlugins && newPlugins) {\n return true;\n }\n if (prevPlugins && !newPlugins) {\n return true;\n }\n return prevPlugins.some((prevPlugin, index) => {\n const newPlugin = newPlugins[index];\n return (\n newPlugin.module !== prevPlugin.module ||\n pluginOptionsIsChanged(newPlugin.moduleOptions, prevPlugin.moduleOptions)\n );\n });\n}\n\nfunction pluginOptionsIsChanged(prevPluginOptions: any | undefined, newPluginOptions: any | undefined): boolean {\n if (!prevPluginOptions && !newPluginOptions) {\n return false;\n }\n if (!prevPluginOptions && newPluginOptions) {\n return true;\n }\n if (prevPluginOptions && !newPluginOptions) {\n return true;\n }\n return JSON.stringify(prevPluginOptions) !== JSON.stringify(newPluginOptions);\n}\n"]}
|
package/cjs/ts-types/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export interface IFilterConfig {
|
|
|
9
9
|
filterModes?: ('byValue' | 'byCondition')[];
|
|
10
10
|
}
|
|
11
11
|
export interface IColumnDefine extends Omit<ColumnDefine, 'field'> {
|
|
12
|
+
field?: string | number;
|
|
12
13
|
filter?: boolean;
|
|
13
14
|
}
|
|
14
15
|
export interface ISheetDefine {
|
|
@@ -56,7 +57,6 @@ export interface IThemeDefine {
|
|
|
56
57
|
}
|
|
57
58
|
export interface IVTableSheetOptions {
|
|
58
59
|
sheets: ISheetDefine[];
|
|
59
|
-
showToolbar?: boolean;
|
|
60
60
|
showFormulaBar?: boolean;
|
|
61
61
|
showSheetTab?: boolean;
|
|
62
62
|
VTablePluginModules?: {
|
|
@@ -76,6 +76,7 @@ export interface IVTableSheetOptions {
|
|
|
76
76
|
enableDragRowOrder?: boolean;
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
|
+
export type IVTableSheetUpdateOptions = Partial<IVTableSheetOptions>;
|
|
79
80
|
export * from './base';
|
|
80
81
|
export * from './formula';
|
|
81
82
|
export * from './filter';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ts-types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,6CAAgF;AAKzD,4FALL,cAAW,OAKK;AAAzB,6FALgC,eAAY,OAKhC;
|
|
1
|
+
{"version":3,"sources":["../src/ts-types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,6CAAgF;AAKzD,4FALL,cAAW,OAKK;AAAzB,6FALgC,eAAY,OAKhC;AA4HrB,yCAAuB;AACvB,4CAA0B;AAC1B,2CAAyB;AACzB,0CAAwB;AACxB,uDAAqC","file":"index.js","sourcesContent":["import type { ColumnDefine } from '@visactor/vtable';\nimport { TYPES as VTableTypes, themes as VTableThemes } from '@visactor/vtable';\nimport type { CellValue, MainMenuItem } from './base';\nimport type { IFilterState } from './filter';\nimport type { TableSeriesNumberOptions, ImportResult } from '@visactor/vtable-plugins';\nimport type { SortState } from '@visactor/vtable/es/ts-types';\nexport { VTableThemes, VTableTypes, ImportResult };\n/** 筛选配置 */\nexport interface IFilterConfig {\n /** 指定筛选器支持的筛选模式(按值、按条件、或两者) */\n filterModes?: ('byValue' | 'byCondition')[];\n}\n\n/** 扩展的列定义,添加筛选相关配置;field 可选,构建 ListTable 时由 WorkSheet 按列索引填充 */\nexport interface IColumnDefine extends Omit<ColumnDefine, 'field'> {\n /** 列字段,可选;未指定时由 WorkSheet 按列索引填充 */\n field?: string | number;\n /** 是否启用筛选功能 */\n filter?: boolean;\n}\n\n/** Sheet定义 */\nexport interface ISheetDefine {\n /** 标题 */\n sheetTitle: string;\n /** 唯一标识 */\n sheetKey: string;\n /** 列数 */\n columnCount?: number;\n /** 行数 */\n rowCount?: number;\n /** 表头定义 */\n columns?: IColumnDefine[];\n /** 数据 */\n data?: (CellValue[] | null)[];\n /** 是否是当前活动sheet TODO 是不是放到外层更好*/\n active?: boolean;\n cellMerge?: VTableTypes.CustomMergeCellArray;\n /** 冻结行数 */\n frozenRowCount?: number;\n /** 冻结列数 */\n frozenColCount?: number;\n /** 是否显示表头 */\n showHeader?: boolean;\n /** 是否将第一行作为表头 */\n firstRowAsHeader?: boolean;\n /** 公式定义 */\n formulas?: Record<string, string>;\n /** 筛选配置 - 支持简单布尔值或详细配置对象 */\n filter?: boolean | IFilterConfig;\n /** 筛选状态 - 保存当前的筛选条件和状态 */\n filterState?: IFilterState;\n /** 排序状态 */\n sortState?: SortState[] | SortState | null;\n /** 主题 */\n theme?: IThemeDefine;\n /** 列宽配置 */\n columnWidthConfig?: {\n key: string | number;\n width: number;\n }[];\n /** 行高配置 */\n rowHeightConfig?: {\n key: number;\n height: number;\n }[];\n dragOrder?: {\n enableDragColumnOrder?: boolean;\n enableDragRowOrder?: boolean;\n };\n}\nexport interface IThemeDefine {\n rowSeriesNumberCellStyle?: TableSeriesNumberOptions['rowSeriesNumberCellStyle'];\n colSeriesNumberCellStyle?: TableSeriesNumberOptions['colSeriesNumberCellStyle'];\n /** TODO 表格以外部分的主题 */\n menuStyle?: {\n fontFamily?: string;\n fontSize?: number;\n color?: string;\n padding?: number[];\n bgColor?: string;\n };\n tableTheme: VTableThemes.ITableThemeDefine;\n}\n/** VTableSheet配置 */\nexport interface IVTableSheetOptions {\n /** Sheet列表 */\n sheets: ISheetDefine[];\n /** 是否显示公式栏 */\n showFormulaBar?: boolean;\n /** 是否显示sheet切换栏 */\n showSheetTab?: boolean;\n /** 插件 */\n VTablePluginModules?: {\n module: any;\n moduleOptions?: any;\n /** vtable-sheet逻辑中使用到的插件,可以通过这个配置来禁用掉 */\n disabled?: boolean;\n }[];\n\n /** 主菜单 */\n mainMenu?: {\n /** 是否显示 */\n show?: boolean;\n /** 菜单项 */\n items?: MainMenuItem[];\n };\n /** 主题 */\n theme?: IThemeDefine;\n /** 默认行高 */\n defaultRowHeight?: number;\n /** 默认列宽 */\n defaultColWidth?: number;\n /** 拖拽列顺序和行顺序配置 如果sheets中单独配置过,这个配置会被忽略*/\n dragOrder?: {\n enableDragColumnOrder?: boolean;\n enableDragRowOrder?: boolean;\n };\n}\n\n/**\n * VTableSheet 更新配置\n *\n * 用于 VTableSheet.updateOption 的增量更新场景。\n * - 所有字段均为可选;\n * - 未显式声明的字段不会被修改;\n * - 部分字段在调用时会被广播到所有已存在的 WorkSheet。\n */\nexport type IVTableSheetUpdateOptions = Partial<IVTableSheetOptions>;\n\nexport * from './base';\nexport * from './formula';\nexport * from './filter';\nexport * from './sheet';\nexport * from './spreadsheet-events';\n"]}
|
package/cjs/ts-types/sheet.d.ts
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
|
-
import type { IColumnDefine, ISheetDefine } from './index';
|
|
1
|
+
import type { IColumnDefine, IFilterConfig, IFilterState, ISheetDefine } from './index';
|
|
2
2
|
import type { CellCoord, CellRange, CellValue } from './base';
|
|
3
3
|
import type { ListTableConstructorOptions } from '@visactor/vtable';
|
|
4
|
-
export interface IWorkSheetOptions extends Omit<ListTableConstructorOptions, 'records' | 'columns'> {
|
|
4
|
+
export interface IWorkSheetOptions extends Omit<ListTableConstructorOptions, 'records' | 'columns' | 'dragOrder'> {
|
|
5
5
|
sheetKey: string;
|
|
6
6
|
sheetTitle: string;
|
|
7
|
-
container
|
|
7
|
+
container?: HTMLElement;
|
|
8
|
+
width?: number;
|
|
9
|
+
height?: number;
|
|
8
10
|
data?: any[][];
|
|
9
11
|
showHeader?: boolean;
|
|
10
12
|
firstRowAsHeader?: boolean;
|
|
11
|
-
filter?: boolean;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
filter?: boolean | IFilterConfig;
|
|
14
|
+
filterState?: IFilterState;
|
|
15
|
+
columns?: IColumnDefine[];
|
|
16
|
+
dragOrder?: {
|
|
17
|
+
enableDragColumnOrder?: boolean;
|
|
18
|
+
enableDragRowOrder?: boolean;
|
|
19
|
+
};
|
|
15
20
|
}
|
|
16
21
|
export interface IWorkSheetAPI {
|
|
17
22
|
getCellValue: (col: number, row: number) => CellValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ts-types/sheet.ts"],"names":[],"mappings":"","file":"sheet.js","sourcesContent":["import type { IColumnDefine, IFilterConfig, ISheetDefine } from './index';\nimport type { CellCoord, CellRange, CellValue } from './base';\nimport type { ListTableConstructorOptions } from '@visactor/vtable';\n\n/** Sheet构造选项 */\nexport interface IWorkSheetOptions extends Omit<ListTableConstructorOptions, 'records' | 'columns'> {\n /** Sheet的唯一标识 */\n sheetKey: string;\n /** Sheet的标题 */\n sheetTitle: string;\n /** 容器元素 */\n container
|
|
1
|
+
{"version":3,"sources":["../src/ts-types/sheet.ts"],"names":[],"mappings":"","file":"sheet.js","sourcesContent":["import type { IColumnDefine, IFilterConfig, IFilterState, ISheetDefine } from './index';\nimport type { CellCoord, CellRange, CellValue } from './base';\nimport type { ListTableConstructorOptions } from '@visactor/vtable';\n\n/** Sheet构造选项 */\nexport interface IWorkSheetOptions extends Omit<ListTableConstructorOptions, 'records' | 'columns' | 'dragOrder'> {\n /** Sheet的唯一标识 */\n sheetKey: string;\n /** Sheet的标题 */\n sheetTitle: string;\n /** 容器元素 */\n container?: HTMLElement;\n width?: number;\n height?: number;\n /** 数据 */\n data?: any[][];\n /** 是否显示表头 */\n showHeader?: boolean;\n /** 是否将data中第一行作为表头。如果设置为true,则获取到的getData()将不包含data中的第一行 */\n firstRowAsHeader?: boolean;\n /** 筛选配置 */\n filter?: boolean | IFilterConfig;\n\n filterState?: IFilterState;\n /** 列定义 */\n columns?: IColumnDefine[];\n dragOrder?: {\n enableDragColumnOrder?: boolean;\n enableDragRowOrder?: boolean;\n };\n}\n\n/** Sheet API 接口 */\nexport interface IWorkSheetAPI {\n /** 获取单元格值 */\n getCellValue: (col: number, row: number) => CellValue;\n\n /** 设置单元格值 */\n setCellValue: (col: number, row: number, value: CellValue) => void;\n\n /** 根据地址获取单元格 */\n getCellByAddress: (address: string) => { coord: CellCoord; value: CellValue };\n\n /** 根据坐标获取地址 */\n addressFromCoord: (coord: CellCoord) => string;\n\n /** 根据地址获取坐标 */\n coordFromAddress: (address: string) => CellCoord;\n /** 获取当前选择 */\n getSelection: () => CellRange | null;\n\n /** 获取数据 */\n getData: () => CellValue[][];\n\n /** 获取行数 */\n getRowCount: () => number;\n\n /** 获取列数 */\n getColumnCount: () => number;\n}\n\n/** Sheet管理器接口 */\nexport interface ISheetManager {\n /** 获取当前活动sheet */\n getActiveSheet: () => ISheetDefine | null;\n\n /** 设置活动sheet */\n setActiveSheet: (sheetKey: string) => void;\n\n /** 添加sheet */\n addSheet: (sheet: ISheetDefine) => void;\n\n /** 移除sheet */\n removeSheet: (sheetKey: string) => void;\n\n /** 重命名sheet */\n renameSheet: (sheetKey: string, newTitle: string) => void;\n\n /** 获取所有sheet */\n getAllSheets: () => ISheetDefine[];\n\n /** 获取指定sheet */\n getSheet: (sheetKey: string) => ISheetDefine | null;\n\n /** 获取sheet数量 */\n getSheetCount: () => number;\n\n /** 获取sheet API */\n getSheetAPI: (sheetKey: string) => IWorkSheetAPI | null;\n\n /** 监听sheet变化 */\n onSheetChange: (callback: (sheets: ISheetDefine[]) => void) => void;\n\n /** 移除sheet变化监听 */\n offSheetChange: (callback: (sheets: ISheetDefine[]) => void) => void;\n\n /** 监听活动sheet变化 */\n onActiveSheetChange: (callback: (sheet: ISheetDefine) => void) => void;\n\n /** 移除活动sheet变化监听 */\n offActiveSheetChange: (callback: (sheet: ISheetDefine) => void) => void;\n}\n"]}
|