@visactor/vtable-sheet 1.20.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 (231) hide show
  1. package/cjs/components/vtable-sheet.d.ts +78 -0
  2. package/cjs/components/vtable-sheet.js +474 -0
  3. package/cjs/components/vtable-sheet.js.map +1 -0
  4. package/cjs/core/WorkSheet.d.ts +69 -0
  5. package/cjs/core/WorkSheet.js +298 -0
  6. package/cjs/core/WorkSheet.js.map +1 -0
  7. package/cjs/core/table-plugins.d.ts +3 -0
  8. package/cjs/core/table-plugins.js +171 -0
  9. package/cjs/core/table-plugins.js.map +1 -0
  10. package/cjs/event/event-manager.d.ts +29 -0
  11. package/cjs/event/event-manager.js +71 -0
  12. package/cjs/event/event-manager.js.map +1 -0
  13. package/cjs/event/event-target.d.ts +12 -0
  14. package/cjs/event/event-target.js +50 -0
  15. package/cjs/event/event-target.js.map +1 -0
  16. package/cjs/formula/cell-highlight-manager.d.ts +29 -0
  17. package/cjs/formula/cell-highlight-manager.js +141 -0
  18. package/cjs/formula/cell-highlight-manager.js.map +1 -0
  19. package/cjs/formula/formula-autocomplete.d.ts +39 -0
  20. package/cjs/formula/formula-autocomplete.js +239 -0
  21. package/cjs/formula/formula-autocomplete.js.map +1 -0
  22. package/cjs/formula/formula-editor.d.ts +21 -0
  23. package/cjs/formula/formula-editor.js +162 -0
  24. package/cjs/formula/formula-editor.js.map +1 -0
  25. package/cjs/formula/formula-helper.d.ts +8 -0
  26. package/cjs/formula/formula-helper.js +66 -0
  27. package/cjs/formula/formula-helper.js.map +1 -0
  28. package/cjs/formula/formula-range-selector.d.ts +19 -0
  29. package/cjs/formula/formula-range-selector.js +201 -0
  30. package/cjs/formula/formula-range-selector.js.map +1 -0
  31. package/cjs/formula/formula-throttle.d.ts +10 -0
  32. package/cjs/formula/formula-throttle.js +39 -0
  33. package/cjs/formula/formula-throttle.js.map +1 -0
  34. package/cjs/formula/formula-ui-manager.d.ts +19 -0
  35. package/cjs/formula/formula-ui-manager.js +226 -0
  36. package/cjs/formula/formula-ui-manager.js.map +1 -0
  37. package/cjs/formula/index.d.ts +5 -0
  38. package/cjs/formula/index.js +23 -0
  39. package/cjs/formula/index.js.map +1 -0
  40. package/cjs/index.d.ts +6 -0
  41. package/cjs/index.js +50 -0
  42. package/cjs/index.js.map +1 -0
  43. package/cjs/managers/formula-manager.d.ts +82 -0
  44. package/cjs/managers/formula-manager.js +445 -0
  45. package/cjs/managers/formula-manager.js.map +1 -0
  46. package/cjs/managers/menu-manager.d.ts +12 -0
  47. package/cjs/managers/menu-manager.js +89 -0
  48. package/cjs/managers/menu-manager.js.map +1 -0
  49. package/cjs/managers/sheet-manager.d.ts +21 -0
  50. package/cjs/managers/sheet-manager.js +74 -0
  51. package/cjs/managers/sheet-manager.js.map +1 -0
  52. package/cjs/managers/tab-drag-manager.d.ts +24 -0
  53. package/cjs/managers/tab-drag-manager.js +121 -0
  54. package/cjs/managers/tab-drag-manager.js.map +1 -0
  55. package/cjs/sheet-helper.d.ts +16 -0
  56. package/cjs/sheet-helper.js +64 -0
  57. package/cjs/sheet-helper.js.map +1 -0
  58. package/cjs/styles/common.d.ts +1 -0
  59. package/cjs/styles/common.js +17 -0
  60. package/cjs/styles/common.js.map +1 -0
  61. package/cjs/styles/formula-autocomplete.d.ts +1 -0
  62. package/cjs/styles/formula-autocomplete.js +17 -0
  63. package/cjs/styles/formula-autocomplete.js.map +1 -0
  64. package/cjs/styles/formula-bar.d.ts +1 -0
  65. package/cjs/styles/formula-bar.js +17 -0
  66. package/cjs/styles/formula-bar.js.map +1 -0
  67. package/cjs/styles/menu.d.ts +1 -0
  68. package/cjs/styles/menu.js +17 -0
  69. package/cjs/styles/menu.js.map +1 -0
  70. package/cjs/styles/sheet-tab.d.ts +1 -0
  71. package/cjs/styles/sheet-tab.js +17 -0
  72. package/cjs/styles/sheet-tab.js.map +1 -0
  73. package/cjs/styles/sheet.d.ts +1 -0
  74. package/cjs/styles/sheet.js +17 -0
  75. package/cjs/styles/sheet.js.map +1 -0
  76. package/cjs/styles/style-manager.d.ts +1 -0
  77. package/cjs/styles/style-manager.js +15 -0
  78. package/cjs/styles/style-manager.js.map +1 -0
  79. package/cjs/test/formula-complete.test.d.ts +1 -0
  80. package/cjs/test/formula-complete.test.js +42 -0
  81. package/cjs/test/formula-complete.test.js.map +1 -0
  82. package/cjs/tools/env.d.ts +20 -0
  83. package/cjs/tools/env.js +59 -0
  84. package/cjs/tools/env.js.map +1 -0
  85. package/cjs/tools/index.d.ts +3 -0
  86. package/cjs/tools/index.js +16 -0
  87. package/cjs/tools/index.js.map +1 -0
  88. package/cjs/tools/ui/snackbar.d.ts +1 -0
  89. package/cjs/tools/ui/snackbar.js +20 -0
  90. package/cjs/tools/ui/snackbar.js.map +1 -0
  91. package/cjs/ts-types/base.d.ts +44 -0
  92. package/cjs/ts-types/base.js +14 -0
  93. package/cjs/ts-types/base.js.map +1 -0
  94. package/cjs/ts-types/event.d.ts +79 -0
  95. package/cjs/ts-types/event.js +6 -0
  96. package/cjs/ts-types/event.js.map +1 -0
  97. package/cjs/ts-types/events.d.ts +1 -0
  98. package/cjs/ts-types/events.js +3 -0
  99. package/cjs/ts-types/events.js.map +1 -0
  100. package/cjs/ts-types/filter.d.ts +58 -0
  101. package/cjs/ts-types/filter.js +16 -0
  102. package/cjs/ts-types/filter.js.map +1 -0
  103. package/cjs/ts-types/formula.d.ts +51 -0
  104. package/cjs/ts-types/formula.js +6 -0
  105. package/cjs/ts-types/formula.js.map +1 -0
  106. package/cjs/ts-types/index.d.ts +67 -0
  107. package/cjs/ts-types/index.js +37 -0
  108. package/cjs/ts-types/index.js.map +1 -0
  109. package/cjs/ts-types/sheet.d.ts +45 -0
  110. package/cjs/ts-types/sheet.js +6 -0
  111. package/cjs/ts-types/sheet.js.map +1 -0
  112. package/cjs/vtable.d.ts +1 -0
  113. package/cjs/vtable.js +35 -0
  114. package/cjs/vtable.js.map +1 -0
  115. package/dist/vtable-sheet.js +114494 -0
  116. package/dist/vtable-sheet.min.js +853 -0
  117. package/es/components/vtable-sheet.d.ts +78 -0
  118. package/es/components/vtable-sheet.js +462 -0
  119. package/es/components/vtable-sheet.js.map +1 -0
  120. package/es/core/WorkSheet.d.ts +69 -0
  121. package/es/core/WorkSheet.js +298 -0
  122. package/es/core/WorkSheet.js.map +1 -0
  123. package/es/core/table-plugins.d.ts +3 -0
  124. package/es/core/table-plugins.js +164 -0
  125. package/es/core/table-plugins.js.map +1 -0
  126. package/es/event/event-manager.d.ts +29 -0
  127. package/es/event/event-manager.js +63 -0
  128. package/es/event/event-manager.js.map +1 -0
  129. package/es/event/event-target.d.ts +12 -0
  130. package/es/event/event-target.js +42 -0
  131. package/es/event/event-target.js.map +1 -0
  132. package/es/formula/cell-highlight-manager.d.ts +29 -0
  133. package/es/formula/cell-highlight-manager.js +133 -0
  134. package/es/formula/cell-highlight-manager.js.map +1 -0
  135. package/es/formula/formula-autocomplete.d.ts +39 -0
  136. package/es/formula/formula-autocomplete.js +231 -0
  137. package/es/formula/formula-autocomplete.js.map +1 -0
  138. package/es/formula/formula-editor.d.ts +21 -0
  139. package/es/formula/formula-editor.js +135 -0
  140. package/es/formula/formula-editor.js.map +1 -0
  141. package/es/formula/formula-helper.d.ts +8 -0
  142. package/es/formula/formula-helper.js +60 -0
  143. package/es/formula/formula-helper.js.map +1 -0
  144. package/es/formula/formula-range-selector.d.ts +19 -0
  145. package/es/formula/formula-range-selector.js +195 -0
  146. package/es/formula/formula-range-selector.js.map +1 -0
  147. package/es/formula/formula-throttle.d.ts +10 -0
  148. package/es/formula/formula-throttle.js +31 -0
  149. package/es/formula/formula-throttle.js.map +1 -0
  150. package/es/formula/formula-ui-manager.d.ts +19 -0
  151. package/es/formula/formula-ui-manager.js +218 -0
  152. package/es/formula/formula-ui-manager.js.map +1 -0
  153. package/es/formula/index.d.ts +5 -0
  154. package/es/formula/index.js +10 -0
  155. package/es/formula/index.js.map +1 -0
  156. package/es/index.d.ts +6 -0
  157. package/es/index.js +13 -0
  158. package/es/index.js.map +1 -0
  159. package/es/managers/formula-manager.d.ts +82 -0
  160. package/es/managers/formula-manager.js +441 -0
  161. package/es/managers/formula-manager.js.map +1 -0
  162. package/es/managers/menu-manager.d.ts +12 -0
  163. package/es/managers/menu-manager.js +81 -0
  164. package/es/managers/menu-manager.js.map +1 -0
  165. package/es/managers/sheet-manager.d.ts +21 -0
  166. package/es/managers/sheet-manager.js +66 -0
  167. package/es/managers/sheet-manager.js.map +1 -0
  168. package/es/managers/tab-drag-manager.d.ts +24 -0
  169. package/es/managers/tab-drag-manager.js +113 -0
  170. package/es/managers/tab-drag-manager.js.map +1 -0
  171. package/es/sheet-helper.d.ts +16 -0
  172. package/es/sheet-helper.js +54 -0
  173. package/es/sheet-helper.js.map +1 -0
  174. package/es/styles/common.d.ts +1 -0
  175. package/es/styles/common.js +9 -0
  176. package/es/styles/common.js.map +1 -0
  177. package/es/styles/formula-autocomplete.d.ts +1 -0
  178. package/es/styles/formula-autocomplete.js +9 -0
  179. package/es/styles/formula-autocomplete.js.map +1 -0
  180. package/es/styles/formula-bar.d.ts +1 -0
  181. package/es/styles/formula-bar.js +9 -0
  182. package/es/styles/formula-bar.js.map +1 -0
  183. package/es/styles/menu.d.ts +1 -0
  184. package/es/styles/menu.js +9 -0
  185. package/es/styles/menu.js.map +1 -0
  186. package/es/styles/sheet-tab.d.ts +1 -0
  187. package/es/styles/sheet-tab.js +9 -0
  188. package/es/styles/sheet-tab.js.map +1 -0
  189. package/es/styles/sheet.d.ts +1 -0
  190. package/es/styles/sheet.js +9 -0
  191. package/es/styles/sheet.js.map +1 -0
  192. package/es/styles/style-manager.d.ts +1 -0
  193. package/es/styles/style-manager.js +17 -0
  194. package/es/styles/style-manager.js.map +1 -0
  195. package/es/test/formula-complete.test.d.ts +1 -0
  196. package/es/test/formula-complete.test.js +36 -0
  197. package/es/test/formula-complete.test.js.map +1 -0
  198. package/es/tools/env.d.ts +20 -0
  199. package/es/tools/env.js +53 -0
  200. package/es/tools/env.js.map +1 -0
  201. package/es/tools/index.d.ts +3 -0
  202. package/es/tools/index.js +9 -0
  203. package/es/tools/index.js.map +1 -0
  204. package/es/tools/ui/snackbar.d.ts +1 -0
  205. package/es/tools/ui/snackbar.js +14 -0
  206. package/es/tools/ui/snackbar.js.map +1 -0
  207. package/es/ts-types/base.d.ts +44 -0
  208. package/es/ts-types/base.js +14 -0
  209. package/es/ts-types/base.js.map +1 -0
  210. package/es/ts-types/event.d.ts +79 -0
  211. package/es/ts-types/event.js +2 -0
  212. package/es/ts-types/event.js.map +1 -0
  213. package/es/ts-types/events.d.ts +1 -0
  214. package/es/ts-types/events.js +3 -0
  215. package/es/ts-types/events.js.map +1 -0
  216. package/es/ts-types/filter.d.ts +58 -0
  217. package/es/ts-types/filter.js +16 -0
  218. package/es/ts-types/filter.js.map +1 -0
  219. package/es/ts-types/formula.d.ts +51 -0
  220. package/es/ts-types/formula.js +2 -0
  221. package/es/ts-types/formula.js.map +1 -0
  222. package/es/ts-types/index.d.ts +67 -0
  223. package/es/ts-types/index.js +14 -0
  224. package/es/ts-types/index.js.map +1 -0
  225. package/es/ts-types/sheet.d.ts +45 -0
  226. package/es/ts-types/sheet.js +2 -0
  227. package/es/ts-types/sheet.js.map +1 -0
  228. package/es/vtable.d.ts +1 -0
  229. package/es/vtable.js +2 -0
  230. package/es/vtable.js.map +1 -0
  231. package/package.json +120 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/managers/formula-manager.ts"],"names":[],"mappings":"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","file":"formula-manager.js","sourcesContent":["import type { SimpleCellAddress } from 'hyperformula';\nimport { HyperFormula, CellError } from 'hyperformula';\nimport type VTableSheet from '../components/vtable-sheet';\nimport type { FormulaCell, FormulaResult } from '../ts-types/formula';\nimport { FormulaRangeSelector } from '../formula/formula-range-selector';\nimport type { CellRange } from '../ts-types';\nimport { CellHighlightManager } from '../formula';\nimport type * as VTable from '@visactor/vtable';\n\n/**\n * 标准HyperFormula配置\n */\nconst DEFAULT_HYPERFORMULA_CONFIG = {\n licenseKey: 'gpl-v3',\n useColumnIndex: true,\n useArrayArithmetic: false,\n useStats: true,\n precisionRounding: 14,\n nullYear: 30,\n leapYear1900: false,\n smartRounding: true,\n functionPlugins: [] as any[],\n ignoreWhiteSpace: 'standard' as const,\n caseSensitive: false,\n parseDateTime: (): undefined => undefined,\n nullDate: { year: 1899, month: 12, day: 30 },\n dateFormats: ['DD/MM/YYYY', 'DD/MM/YY', 'YYYY-MM-DD'],\n timeFormats: ['hh:mm', 'hh:mm:ss.s']\n};\n\nexport class FormulaManager {\n /** Sheet实例 */\n sheet: VTableSheet;\n /** HyperFormula实例 */\n private hyperFormula: HyperFormula;\n /** 工作表映射 */\n private sheetMapping: Map<string, number> = new Map();\n /** 反向工作表映射 */\n private reverseSheetMapping: Map<number, string> = new Map();\n /** 是否已初始化 */\n private isInitialized = false;\n /** 下一个工作表ID */\n private nextSheetId = 0;\n /** 单元格高亮管理器 */\n cellHighlightManager: CellHighlightManager;\n /** 正在输入公式的单元格(如果是完整的公式 不做记录。没输入完整才记录)。为后面拖拽单元范围或者点击单元格选中计算范围逻辑做准备。 */\n _formulaWorkingOnCell: FormulaCell | null = null;\n /** 上一次被记录过的光标位置。 公式输入框中光标位置 */\n lastKnownCursorPosInFormulaInput: number | null = null;\n\n /** 公式范围选择器 */\n formulaRangeSelector: FormulaRangeSelector;\n /** 正在处理的单元格选区 */\n lastSelectionRangesOfHandling: CellRange[] = [];\n\n inputIsParamMode: {\n inParamMode: boolean;\n functionParamPosition: {\n start: number;\n end: number;\n } | null;\n } | null = null;\n\n inputingElement: HTMLInputElement | null = null;\n\n get formulaWorkingOnCell(): FormulaCell | null {\n return this._formulaWorkingOnCell;\n }\n set formulaWorkingOnCell(value: FormulaCell | null) {\n console.trace('set formulaWorkingOnCell', value);\n this._formulaWorkingOnCell = value;\n }\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n this.cellHighlightManager = new CellHighlightManager(sheet);\n this.formulaRangeSelector = new FormulaRangeSelector(this);\n this.initializeHyperFormula();\n }\n\n /**\n * 初始化HyperFormula实例\n */\n private initializeHyperFormula(): void {\n try {\n this.hyperFormula = HyperFormula.buildEmpty(DEFAULT_HYPERFORMULA_CONFIG);\n this.isInitialized = true;\n } catch (error) {\n console.error('Failed to initialize HyperFormula:', error);\n throw new Error('FormulaManager initialization failed');\n }\n }\n\n /**\n * 添加新工作表 - 正确的多表格支持\n * @param sheetKey 工作表键\n * @param normalizedData 工作表数据 需要规范处理过 且包含表头的数据 因为要输入给HyperFormula\n * @returns 工作表ID\n */\n addSheet(sheetKey: string, normalizedData?: any[][]): number {\n this.ensureInitialized();\n\n // 检查是否已存在\n if (this.sheetMapping.has(sheetKey)) {\n return this.sheetMapping.get(sheetKey)!;\n }\n\n try {\n let sheetId: number;\n\n // 创建第一个sheet\n if (this.sheetMapping.size === 0) {\n this.hyperFormula = HyperFormula.buildFromArray([['']], DEFAULT_HYPERFORMULA_CONFIG);\n sheetId = 0;\n\n // 获取 HyperFormula 自动创建的 sheet 名称并重命名为我们需要的名称\n const defaultSheetName = this.hyperFormula.getSheetName(0);\n if (defaultSheetName !== sheetKey) {\n try {\n // 重命名默认 sheet 为我们需要的名称\n (this.hyperFormula as any).renameSheet(0, sheetKey);\n } catch (e) {\n console.warn(`Could not rename default sheet from ${defaultSheetName} to ${sheetKey}:`, e);\n }\n }\n } else {\n // 后续sheet - 先检查这个名称是否已经存在于 HyperFormula 中\n try {\n // 尝试获取已存在的 sheet ID\n const existingSheetId = this.hyperFormula.getSheetId(sheetKey);\n if (existingSheetId !== undefined) {\n // 如果 HyperFormula 中已经有这个名称的 sheet,直接使用它\n sheetId = existingSheetId;\n } else {\n // 否则创建新的 sheet\n const sheetName = this.hyperFormula.addSheet(sheetKey);\n sheetId = this.hyperFormula.getSheetId(sheetName);\n }\n } catch (error) {\n // 如果获取 sheet ID 失败,说明不存在,创建新的\n const sheetName = this.hyperFormula.addSheet(sheetKey);\n sheetId = this.hyperFormula.getSheetId(sheetName);\n }\n }\n // 如果是有效数据,设置内容\n if (Array.isArray(normalizedData) && normalizedData.length > 0) {\n this.hyperFormula.setSheetContent(sheetId, normalizedData);\n }\n\n this.sheetMapping.set(sheetKey, sheetId);\n this.reverseSheetMapping.set(sheetId, sheetKey);\n this.nextSheetId = Math.max(this.nextSheetId, sheetId + 1);\n\n return sheetId;\n } catch (error) {\n console.error(`Failed to add sheet ${sheetKey}:`, error);\n throw new Error(`Failed to add sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 标准化工作表数据\n * @param data 工作表数据\n * @returns 标准化后的工作表数据\n */\n normalizeSheetData(data: any[][], tableInstance: VTable.ListTable): any[][] {\n try {\n //将columns中的title追加到data中\n const headerRows: any[][] = [];\n for (let i = 0; i < tableInstance.columnHeaderLevelCount; i++) {\n const headerRow: any[] = [];\n for (let j = 0; j < tableInstance.colCount; j++) {\n const cellValue = tableInstance.getCellValue(j, i);\n headerRow.push(cellValue);\n }\n headerRows.push(headerRow);\n }\n const dataCopy = JSON.parse(JSON.stringify(data));\n\n const toNormalizeData = tableInstance.columnHeaderLevelCount > 0 ? [...headerRows].concat(dataCopy) : dataCopy;\n\n if (!Array.isArray(toNormalizeData) || toNormalizeData.length === 0) {\n return [['']];\n }\n\n // 确保所有行都是数组,并转换数据类型\n const validData = toNormalizeData.filter(row => Array.isArray(row));\n if (validData.length === 0) {\n return [['']];\n }\n\n // 确保所有行都有相同的列数,并正确处理数据类型\n const maxCols = Math.max(...validData.map(row => row.length));\n return validData.map(row => {\n const normalizedRow = Array.isArray(row)\n ? row.map(cell => {\n if (typeof cell === 'string') {\n if (cell.startsWith('=')) {\n return cell; // 保持公式不变\n }\n const num = Number(cell);\n return !isNaN(num) ? num : cell;\n }\n return cell ?? '';\n })\n : [''];\n\n while (normalizedRow.length < maxCols) {\n normalizedRow.push('');\n }\n return normalizedRow;\n });\n } catch (error) {\n console.error('Failed to normalize sheet data:', error);\n return [['']];\n }\n }\n\n /**\n * 移除工作表\n * @param sheetKey 工作表键\n */\n removeSheet(sheetKey: string): void {\n const sheetId = this.sheetMapping.get(sheetKey);\n if (sheetId === undefined) {\n return;\n }\n\n try {\n // 不能删除最后一个sheet\n if (this.sheetMapping.size <= 1) {\n throw new Error('Cannot remove the last sheet');\n }\n\n this.hyperFormula.removeSheet(sheetId);\n this.sheetMapping.delete(sheetKey);\n this.reverseSheetMapping.delete(sheetId);\n } catch (error) {\n console.error(`Failed to remove sheet ${sheetKey}:`, error);\n throw new Error(`Failed to remove sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 重命名工作表\n * @param oldKey 旧工作表键\n * @param newKey 新工作表键\n */\n renameSheet(oldKey: string, newKey: string): void {\n const sheetId = this.sheetMapping.get(oldKey);\n if (sheetId === undefined) {\n throw new Error(`Sheet not found: ${oldKey}`);\n }\n\n try {\n // 使用HyperFormula的renameSheet API\n (this.hyperFormula as any).renameSheet(sheetId, newKey);\n\n // 更新内部映射\n this.sheetMapping.delete(oldKey);\n this.sheetMapping.set(newKey, sheetId);\n this.reverseSheetMapping.set(sheetId, newKey);\n } catch (error) {\n console.error(`Failed to rename sheet from ${oldKey} to ${newKey}:`, error);\n throw new Error(`Failed to rename sheet: ${oldKey}`);\n }\n }\n\n /**\n * 获取工作表ID\n * @param sheetKey 工作表键\n * @returns 工作表ID\n */\n private getSheetId(sheetKey: string): number {\n const sheetId = this.sheetMapping.get(sheetKey);\n if (sheetId === undefined) {\n // 自动创建新sheet\n return this.addSheet(sheetKey);\n }\n return sheetId;\n }\n\n /**\n * 获取是否有表头\n * @param sheetKey 工作表键\n * @returns 是否有表头\n */\n private getHasHeader(sheetKey: string): boolean {\n const sheetDefine = this.sheet.getSheetManager().getSheet(sheetKey);\n\n return sheetDefine?.showHeader ?? sheetDefine?.columns?.length > 0 ?? false;\n }\n\n /**\n * 设置单元格内容\n * @param cell 单元格\n * @param value 值\n */\n setCellContent(cell: FormulaCell, value: any): void {\n console.trace('setCellContent', cell, value);\n this.ensureInitialized();\n\n // 检查单元格参数有效性\n if (!cell || cell.sheet === undefined || cell.row === undefined || cell.col === undefined) {\n console.error('Invalid cell parameter:', cell);\n throw new Error('Invalid cell parameter for setCellContent');\n }\n\n // 检查单元格是否超出有效范围\n if (cell.row < 0 || cell.col < 0) {\n console.error('Cell coordinates out of bounds:', cell);\n throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);\n }\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n\n // 创建单元格地址对象\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n // 尝试处理特殊值\n let processedValue = value;\n\n // 处理空值\n if (processedValue === undefined || processedValue === null) {\n processedValue = '';\n }\n\n // 如果是字符串中的数字,尝试转换为数字类型\n if (typeof processedValue === 'string' && !processedValue.startsWith('=')) {\n const numericValue = Number(processedValue);\n if (!isNaN(numericValue) && processedValue.trim() !== '') {\n processedValue = numericValue;\n }\n }\n\n // 设置单元格内容\n this.hyperFormula.setCellContents(address, [[processedValue]]);\n // this.formulaWorkingOnCell = cell;\n } catch (error) {\n console.error('Failed to set cell content:', error);\n // 提供更详细的错误信息\n if (error instanceof Error) {\n throw new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}. ${error.message}`);\n } else {\n throw new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}`);\n }\n }\n }\n\n /**\n * 获取单元格值\n * @param cell 单元格\n * @returns 单元格值\n */\n getCellValue(cell: FormulaCell): FormulaResult {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n const value = this.hyperFormula.getCellValue(address);\n return {\n value,\n error: value instanceof CellError ? value : undefined\n };\n } catch (error) {\n console.error('Failed to get cell value:', error);\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n /**\n * 获取单元格公式\n * @param cell 单元格\n * @returns 单元格公式\n */\n getCellFormula(cell: FormulaCell): string | undefined {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n return this.hyperFormula.getCellFormula(address);\n } catch (error) {\n console.error('Failed to get cell formula:', error);\n return undefined;\n }\n }\n\n /**\n * 检查是否为公式单元格\n * @param cell 单元格\n * @returns 是否为公式单元格\n */\n isCellFormula(cell: FormulaCell): boolean {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n return this.hyperFormula.doesCellHaveFormula(address);\n } catch (error) {\n console.error('Failed to check if cell has formula:', error);\n return false;\n }\n }\n\n /**\n * 获取依赖此单元格的所有单元格\n * @param cell 单元格\n * @returns 依赖此单元格的所有单元格\n */\n getCellDependents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n const dependents = this.hyperFormula.getCellDependents(address);\n\n return dependents\n .filter((dep): dep is SimpleCellAddress => 'sheet' in dep && 'row' in dep && 'col' in dep)\n .map(dep => ({\n sheet: this.reverseSheetMapping.get(dep.sheet) || '',\n row: dep.row,\n col: dep.col\n }));\n } catch (error) {\n console.error('Failed to get cell dependents:', error);\n return [];\n }\n }\n\n /**\n * 获取此单元格依赖的所有单元格\n * @param cell 单元格\n * @returns 此单元格依赖的所有单元格\n */\n getCellPrecedents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(cell.sheet);\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n\n const precedents = (this.hyperFormula as any).getCellPrecedents(address);\n\n return precedents\n .filter((prec: any): prec is SimpleCellAddress => 'sheet' in prec && 'row' in prec && 'col' in prec)\n .map((prec: any) => ({\n sheet: this.reverseSheetMapping.get(prec.sheet) || '',\n row: prec.row,\n col: prec.col\n }));\n } catch (error) {\n console.error('Failed to get cell precedents:', error);\n return [];\n }\n }\n\n /**\n * 批量更新单元格\n * @param changes 更新内容\n */\n batchUpdate(changes: Array<{ cell: FormulaCell; value: any }>): void {\n this.ensureInitialized();\n\n try {\n (this.hyperFormula as any).batch(() => {\n changes.forEach(({ cell, value }) => {\n const sheetId = this.getSheetId(cell.sheet);\n const address: SimpleCellAddress = {\n sheet: sheetId,\n row: cell.row,\n col: cell.col\n };\n this.hyperFormula.setCellContents(address, [[value]]);\n });\n });\n } catch (error) {\n console.error('Failed to batch update cells:', error);\n throw new Error('Batch update failed');\n }\n }\n\n /**\n * 添加行\n * @param sheetKey 工作表键\n * @param rowIndex 行索引\n * @param numberOfRows 添加的行数\n */\n addRows(sheetKey: string, rowIndex: number, numberOfRows: number = 1): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n (this.hyperFormula as any).addRows(sheetId, [rowIndex, numberOfRows]);\n } catch (error) {\n console.error('Failed to add rows:', error);\n throw new Error(`Failed to add ${numberOfRows} rows at index ${rowIndex}`);\n }\n }\n\n /**\n * 删除行\n * @param sheetKey 工作表键\n * @param rowIndex 行索引\n * @param numberOfRows 删除的行数\n */\n removeRows(sheetKey: string, rowIndex: number, numberOfRows: number = 1): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n (this.hyperFormula as any).removeRows(sheetId, [rowIndex, numberOfRows]);\n } catch (error) {\n console.error('Failed to remove rows:', error);\n throw new Error(`Failed to remove ${numberOfRows} rows at index ${rowIndex}`);\n }\n }\n\n /**\n * 添加列\n * @param sheetKey 工作表键\n * @param columnIndex 列索引\n * @param numberOfColumns 添加的列数\n */\n addColumns(sheetKey: string, columnIndex: number, numberOfColumns: number = 1): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n (this.hyperFormula as any).addColumns(sheetId, [columnIndex, numberOfColumns]);\n } catch (error) {\n console.error('Failed to add columns:', error);\n throw new Error(`Failed to add ${numberOfColumns} columns at index ${columnIndex}`);\n }\n }\n\n /**\n * 删除列\n * @param sheetKey 工作表键\n * @param columnIndex 列索引\n * @param numberOfColumns 删除的列数\n */\n removeColumns(sheetKey: string, columnIndex: number, numberOfColumns: number = 1): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n (this.hyperFormula as any).removeColumns(sheetId, [columnIndex, numberOfColumns]);\n } catch (error) {\n console.error('Failed to remove columns:', error);\n throw new Error(`Failed to remove ${numberOfColumns} columns at index ${columnIndex}`);\n }\n }\n\n /**\n * 获取工作表序列化数据\n * @param sheetKey 工作表键\n * @returns 工作表序列化数据\n */\n getSheetSerialized(sheetKey: string): any[][] {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n return (this.hyperFormula as any).getSheetSerialized(sheetId);\n } catch (error) {\n console.error('Failed to get sheet serialized data:', error);\n return [[]];\n }\n }\n\n /**\n * 设置工作表内容\n * @param sheetKey 工作表键\n * @param normalizedData 工作表数据 需要规范处理过 且包含表头的数据\n */\n setSheetContent(sheetKey: string, normalizedData: any[][]): void {\n this.ensureInitialized();\n\n try {\n const sheetId = this.getSheetId(sheetKey);\n\n (this.hyperFormula as any).setSheetContent(sheetId, normalizedData);\n } catch (error) {\n console.error('Failed to set sheet content:', error);\n throw new Error(`Failed to set content for sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 检查循环引用\n * @returns 是否存在循环引用\n */\n hasCircularReference(): boolean {\n try {\n const stats = (this.hyperFormula as any).getStats();\n return stats && stats.dependencyGraph && stats.dependencyGraph.hasCircularReferences();\n } catch (error) {\n console.error('Failed to check circular reference:', error);\n return false;\n }\n }\n\n /**\n * 获取可用函数列表 - 静态列表\n * @returns 可用函数列表\n */\n getAvailableFunctions(): string[] {\n // 返回常用的Excel函数列表\n return [\n 'ABS',\n 'ACOS',\n 'AND',\n 'ASIN',\n 'ATAN',\n 'AVERAGE',\n 'CEILING',\n 'CONCATENATE',\n 'COS',\n 'COUNT',\n 'COUNTA',\n 'COUNTIF',\n 'COUNTIFS',\n 'DATE',\n 'DAY',\n 'FLOOR',\n 'IF',\n 'IFERROR',\n 'INDEX',\n 'LEFT',\n 'LEN',\n 'LOWER',\n 'MATCH',\n 'MAX',\n 'MID',\n 'MIN',\n 'MONTH',\n 'NOT',\n 'NOW',\n 'OR',\n 'RIGHT',\n 'ROUND',\n 'ROUNDDOWN',\n 'ROUNDUP',\n 'SIN',\n 'SUM',\n 'SUMIF',\n 'SUMIFS',\n 'TAN',\n 'TODAY',\n 'UPPER',\n 'VLOOKUP',\n 'YEAR'\n ];\n }\n\n /**\n * 验证公式语法\n * @param formula 公式\n * @returns 验证结果\n */\n validateFormula(formula: string): { isValid: boolean; error?: string } {\n try {\n // 使用HyperFormula的内置验证\n (this.hyperFormula as any).validateFormula(formula);\n return { isValid: true };\n } catch (error) {\n return {\n isValid: false,\n error: error instanceof Error ? error.message : 'Invalid formula syntax'\n };\n }\n }\n\n // /**\n // * 检查公式是否完整\n // * @param formula 公式字符串\n // * @returns 是否完整\n // */\n // isFormulaComplete(formula: string): boolean {\n // if (!formula || typeof formula !== 'string') {\n // return false;\n // }\n\n // // 如果不是公式,则认为是完整的\n // if (!formula.startsWith('=')) {\n // return true;\n // }\n\n // // 检查是否只有等号或等号加空格\n // if (formula.trim() === '=') {\n // return false;\n // }\n\n // try {\n // // 检查括号是否匹配\n // const openParenCount = (formula.match(/\\(/g) || []).length;\n // const closeParenCount = (formula.match(/\\)/g) || []).length;\n\n // // 检查引号是否匹配(简单检查)\n // const doubleQuoteCount = (formula.match(/\"/g) || []).length;\n // const singleQuoteCount = (formula.match(/'/g) || []).length;\n\n // // 检查括号和引号是否匹配\n // if (openParenCount !== closeParenCount || doubleQuoteCount % 2 !== 0 || singleQuoteCount % 2 !== 0) {\n // return false;\n // }\n\n // // 检查是否有未完成的函数参数,如 \"=SUM(A1,B2,)\" 这种情况\n // if (\n // formula.match(/\\([^)]*,\\s*\\)/) ||\n // formula.match(/,\\s*\\)/) ||\n // formula.match(/\\(\\s*\\)/) ||\n // formula.endsWith(',')\n // ) {\n // return false;\n // }\n\n // // 检查是否有连续的逗号,如 \"=SUM(A1,,B2)\" 这种情况\n // if (formula.match(/,,/)) {\n // return false;\n // }\n\n // // 检查是否以操作符结尾,如 \"=A1+\" 这种情况\n // if (formula.match(/[+\\-*/^&%<>=]$/)) {\n // return false;\n // }\n\n // // 尝试验证公式语法\n // const validationResult = this.validateFormula(formula);\n // return validationResult.isValid;\n // } catch (error) {\n // // 如果验证抛出异常,则公式不完整\n // return false;\n // }\n // }\n\n /**\n * 检查公式是否完整\n * @param formula 公式字符串\n * @returns 是否完整\n */\n isFormulaComplete(formula: string): boolean {\n if (!formula || typeof formula !== 'string') {\n return false;\n }\n\n // 如果不是公式,则认为是完整的\n if (!formula.startsWith('=')) {\n return true;\n }\n\n // 检查是否只有等号或等号加空格\n if (formula.trim() === '=') {\n return false;\n }\n\n try {\n // 检查括号是否匹配\n const openParenCount = (formula.match(/\\(/g) || []).length;\n const closeParenCount = (formula.match(/\\)/g) || []).length;\n\n // 检查引号是否匹配(简单检查)\n const doubleQuoteCount = (formula.match(/\"/g) || []).length;\n const singleQuoteCount = (formula.match(/'/g) || []).length;\n\n // 检查括号和引号是否匹配\n if (openParenCount !== closeParenCount || doubleQuoteCount % 2 !== 0 || singleQuoteCount % 2 !== 0) {\n return false;\n }\n\n // 检查是否有未完成的函数参数,如 \"=SUM(A1,B2,)\" 这种情况\n if (\n formula.match(/\\([^)]*,\\s*\\)/) ||\n formula.match(/,\\s*\\)/) ||\n formula.match(/\\(\\s*\\)/) ||\n formula.endsWith(',')\n ) {\n return false;\n }\n\n // 检查是否有连续的逗号,如 \"=SUM(A1,,B2)\" 这种情况\n if (formula.match(/,,/)) {\n return false;\n }\n\n // 检查是否以操作符结尾,如 \"=A1+\" 这种情况\n if (formula.match(/[+\\-*/^&%<>=]$/)) {\n return false;\n }\n\n // 检查比较运算符后是否缺少操作数,如 \"=IF(E1>,\" 或 \"=IF(A1=)\" 这种情况\n if (formula.match(/[<>=][<>=]?(?=[\\s,)])/)) {\n return false;\n }\n\n // 检查逻辑运算符后是否缺少操作数,如 \"=IF(AND(A1,)\" 这种情况\n if (formula.match(/\\b(AND|OR|NOT)\\((?=[\\s,)])/i)) {\n return false;\n }\n\n // 检查数学运算符后是否有操作数,如 \"=A1+*B1\" 这种情况\n if (formula.match(/[+\\-*/^&%][+\\-*/^&%]/)) {\n return false;\n }\n\n // 尝试验证公式语法\n const validationResult = this.validateFormula(formula);\n return validationResult.isValid;\n } catch (error) {\n // 如果验证抛出异常,则公式不完整\n return false;\n }\n }\n\n /**\n * 计算单个公式而不影响工作表\n * @param formula 公式\n * @returns 计算结果\n */\n calculateFormula(formula: string): { value: any; error?: string } {\n try {\n const result = (this.hyperFormula as any).calculateFormula(formula, 0);\n return {\n value: result,\n error: result instanceof CellError ? result.message : undefined\n };\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Calculation failed'\n };\n }\n }\n\n /**\n * 暂停自动计算\n * @returns 是否成功\n */\n suspendEvaluation(): void {\n try {\n (this.hyperFormula as any).suspendEvaluation();\n } catch (error) {\n console.error('Failed to suspend evaluation:', error);\n }\n }\n\n /**\n * 恢复自动计算\n */\n resumeEvaluation(): void {\n try {\n (this.hyperFormula as any).resumeEvaluation();\n } catch (error) {\n console.error('Failed to resume evaluation:', error);\n }\n }\n\n /**\n * 强制重新计算所有公式\n */\n rebuildAndRecalculate(): void {\n try {\n (this.hyperFormula as any).rebuildAndRecalculate();\n } catch (error) {\n console.error('Failed to rebuild and recalculate:', error);\n }\n }\n\n /**\n * 清空所有内容\n */\n clearContent(): void {\n try {\n this.release();\n this.initializeHyperFormula();\n } catch (error) {\n console.error('Failed to clear content:', error);\n }\n }\n\n /**\n * 销毁FormulaManager\n */\n release(): void {\n this.formulaRangeSelector?.release();\n this.cellHighlightManager?.release();\n try {\n if (this.hyperFormula) {\n (this.hyperFormula as any).destroy();\n }\n } catch (error) {\n console.error('Failed to destroy HyperFormula:', error);\n } finally {\n this.sheetMapping.clear();\n this.reverseSheetMapping.clear();\n this.isInitialized = false;\n this.nextSheetId = 0;\n this.formulaRangeSelector = null;\n this.cellHighlightManager = null;\n }\n }\n\n /**\n * 导出状态用于调试\n */\n exportState(): any {\n return {\n isInitialized: this.isInitialized,\n sheets: Array.from(this.sheetMapping.entries()),\n functions: this.getAvailableFunctions(),\n stats: this.isInitialized ? (this.hyperFormula as any).getStats() : null\n };\n }\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized) {\n throw new Error('FormulaManager not initialized');\n }\n }\n\n /**\n * 获取所有工作表信息\n */\n getAllSheets(): Array<{ key: string; id: number; name: string }> {\n const sheets: Array<{ key: string; id: number; name: string }> = [];\n\n for (const [key, id] of this.sheetMapping.entries()) {\n try {\n const name = (this.hyperFormula as any).getSheetName(id) || key;\n sheets.push({ key, id, name });\n } catch (error) {\n console.warn(`Failed to get name for sheet ${key}:`, error);\n sheets.push({ key, id, name: key });\n }\n }\n\n return sheets;\n }\n\n /**\n * 复制/移动单元格范围 - 简化版本\n * @param sourceSheet 源工作表\n * @param sourceRange 源范围\n * @param targetSheet 目标工作表\n * @param targetRow 目标行\n * @param targetCol 目标列\n */\n copyRange(\n sourceSheet: string,\n sourceRange: { startRow: number; startCol: number; endRow: number; endCol: number },\n targetSheet: string,\n targetRow: number,\n targetCol: number\n ): void {\n this.ensureInitialized();\n\n try {\n const sourceSheetId = this.getSheetId(sourceSheet);\n const targetSheetId = this.getSheetId(targetSheet);\n\n // 简单的数据复制实现\n for (let row = sourceRange.startRow; row <= sourceRange.endRow; row++) {\n for (let col = sourceRange.startCol; col <= sourceRange.endCol; col++) {\n const sourceCell = { sheet: sourceSheet, row, col };\n const targetCell = {\n sheet: targetSheet,\n row: targetRow + (row - sourceRange.startRow),\n col: targetCol + (col - sourceRange.startCol)\n };\n\n const value = this.getCellValue(sourceCell).value;\n if (value !== null && value !== undefined) {\n this.setCellContent(targetCell, value);\n }\n }\n }\n } catch (error) {\n console.error('Failed to copy range:', error);\n throw new Error('Failed to copy cell range');\n }\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type VTableSheet from '../components/vtable-sheet';
2
+ import { MainMenuItemKey } from '../ts-types/base';
3
+ export declare class MenuManager {
4
+ private sheet;
5
+ private menuContainer;
6
+ constructor(sheet: VTableSheet);
7
+ createMainMenu(): HTMLElement;
8
+ private createSubMenu;
9
+ private adjustSubMenuPosition;
10
+ private hideAllSubMenus;
11
+ handleMenuClick(menuKey: MainMenuItemKey): void;
12
+ }
@@ -0,0 +1,81 @@
1
+ import { MainMenuItemKey } from "../ts-types/base";
2
+
3
+ export class MenuManager {
4
+ constructor(sheet) {
5
+ this.sheet = sheet, this.createMainMenu();
6
+ }
7
+ createMainMenu() {
8
+ var _a, _b;
9
+ const menu = document.createElement("div");
10
+ menu.className = "vtable-sheet-main-menu", menu.style.position = "relative";
11
+ const menuButton = document.createElement("span");
12
+ menuButton.className = "vtable-sheet-main-menu-button", menuButton.innerHTML = '<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>',
13
+ menu.appendChild(menuButton);
14
+ const menuContainer = document.createElement("div");
15
+ menuContainer.className = "vtable-sheet-main-menu-container", menu.appendChild(menuContainer);
16
+ const menuItems = document.createElement("ul");
17
+ return menuItems.className = "vtable-sheet-main-menu-items", menuContainer.appendChild(menuItems),
18
+ null === (_b = null === (_a = this.sheet.getOptions().mainMenu) || void 0 === _a ? void 0 : _a.items) || void 0 === _b || _b.forEach((item => {
19
+ const li = document.createElement("li");
20
+ li.className = "vtable-sheet-main-menu-item", li.textContent = item.name, li.title = item.description || "",
21
+ item.items && (li.classList.add("vtable-sheet-main-menu-item-has-children"), li.onmouseenter = () => {
22
+ const subMenu = this.createSubMenu(item.items);
23
+ li.appendChild(subMenu);
24
+ }, li.onmouseleave = () => {
25
+ li.classList.remove("vtable-sheet-main-menu-item-has-children-hover"), li.querySelector(".vtable-sheet-main-menu-sub-menu") && li.removeChild(li.querySelector(".vtable-sheet-main-menu-sub-menu"));
26
+ }), li.addEventListener("click", (() => {
27
+ item.onClick ? item.onClick() : item.menuKey && this.handleMenuClick(item.menuKey);
28
+ })), menuItems.appendChild(li);
29
+ })), menuButton.addEventListener("click", (e => {
30
+ e.stopPropagation(), menuContainer.classList.toggle("active");
31
+ })), document.addEventListener("click", (e => {
32
+ menu.contains(e.target) || menuContainer.classList.remove("active");
33
+ })), this.menuContainer = menuContainer, menu;
34
+ }
35
+ createSubMenu(items) {
36
+ const subMenuContainer = document.createElement("div");
37
+ subMenuContainer.className = "vtable-sheet-submenu-container";
38
+ const subMenuList = document.createElement("ul");
39
+ return subMenuList.className = "vtable-sheet-main-menu-items", items.forEach((item => {
40
+ var _a;
41
+ const li = document.createElement("li");
42
+ li.className = "vtable-sheet-submenu-item", li.textContent = item.name, li.title = item.description || "",
43
+ li.addEventListener("click", (e => {
44
+ var _a;
45
+ e.stopPropagation(), item.menuKey ? this.handleMenuClick(item.menuKey) : null === (_a = item.onClick) || void 0 === _a || _a.call(item),
46
+ this.hideAllSubMenus();
47
+ })), (null === (_a = item.items) || void 0 === _a ? void 0 : _a.length) && (li.classList.add("vtable-sheet-main-menu-item-has-children"),
48
+ li.addEventListener("mouseenter", (() => {
49
+ this.hideAllSubMenus(li);
50
+ const nestedSubMenu = this.createSubMenu(item.items);
51
+ li.appendChild(nestedSubMenu), this.adjustSubMenuPosition(nestedSubMenu);
52
+ }))), subMenuList.appendChild(li);
53
+ })), subMenuContainer.appendChild(subMenuList), subMenuContainer;
54
+ }
55
+ adjustSubMenuPosition(subMenu) {
56
+ const rect = subMenu.getBoundingClientRect();
57
+ rect.right > window.innerWidth && (subMenu.style.left = "auto", subMenu.style.right = "100%"),
58
+ rect.bottom > window.innerHeight && (subMenu.style.top = "auto", subMenu.style.bottom = "0");
59
+ }
60
+ hideAllSubMenus(exceptElement) {
61
+ document.querySelectorAll(".vtable-sheet-submenu-container").forEach((menu => {
62
+ menu !== (null == exceptElement ? void 0 : exceptElement.closest(".vtable-sheet-submenu-container")) && menu.remove();
63
+ })), this.menuContainer.classList.remove("active");
64
+ }
65
+ handleMenuClick(menuKey) {
66
+ const tableInstance = this.sheet.getActiveSheet().tableInstance;
67
+ switch (menuKey) {
68
+ case MainMenuItemKey.IMPORT:
69
+ (null == tableInstance ? void 0 : tableInstance.importFile) && tableInstance.importFile();
70
+ break;
71
+
72
+ case MainMenuItemKey.EXPORT_CURRENT_SHEET_CSV:
73
+ (null == tableInstance ? void 0 : tableInstance.exportToCsv) && tableInstance.exportToCsv();
74
+ break;
75
+
76
+ case MainMenuItemKey.EXPORT_CURRENT_SHEET_XLSX:
77
+ (null == tableInstance ? void 0 : tableInstance.exportToExcel) && tableInstance.exportToExcel();
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=menu-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/managers/menu-manager.ts"],"names":[],"mappings":"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","file":"menu-manager.js","sourcesContent":["import type { ExcelImportPlugin, TableExportPlugin } from '@visactor/vtable-plugins';\nimport 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 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 document.addEventListener('click', e => {\n if (!menu.contains(e.target as Node)) {\n menuContainer.classList.remove('active');\n }\n });\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.menuKey) {\n this.handleMenuClick(item.menuKey);\n } else {\n item.onClick?.();\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 console.log('menuKey click', menuKey);\n const tableInstance = this.sheet.getActiveSheet().tableInstance;\n\n switch (menuKey) {\n case MainMenuItemKey.IMPORT:\n if ((tableInstance as any)?.importFile) {\n (tableInstance as any).importFile();\n } else {\n console.warn('Please configure ExcelImportPlugin in VTablePluginModules');\n }\n break;\n\n case MainMenuItemKey.EXPORT_CURRENT_SHEET_CSV:\n if ((tableInstance as any)?.exportToCsv) {\n (tableInstance as any).exportToCsv();\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n }\n break;\n case MainMenuItemKey.EXPORT_CURRENT_SHEET_XLSX:\n if ((tableInstance as any)?.exportToExcel) {\n (tableInstance as any).exportToExcel();\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n }\n break;\n default:\n break;\n }\n }\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { ISheetManager, IWorkSheetAPI } from '../ts-types/sheet';
2
+ import type { ISheetDefine } from '../ts-types';
3
+ export default class SheetManager implements ISheetManager {
4
+ _sheets: Map<string, ISheetDefine>;
5
+ _activeSheetKey: string;
6
+ constructor();
7
+ getActiveSheet(): ISheetDefine | null;
8
+ setActiveSheet(sheetKey: string): void;
9
+ addSheet(sheet: ISheetDefine): void;
10
+ removeSheet(sheetKey: string): string;
11
+ renameSheet(sheetKey: string, newTitle: string): void;
12
+ getAllSheets(): ISheetDefine[];
13
+ getSheet(sheetKey: string): ISheetDefine | null;
14
+ getSheetCount(): number;
15
+ getSheetAPI(sheetKey: string): IWorkSheetAPI | null;
16
+ onSheetChange(callback: (sheets: ISheetDefine[]) => void): void;
17
+ offSheetChange(callback: (sheets: ISheetDefine[]) => void): void;
18
+ onActiveSheetChange(callback: (sheet: ISheetDefine) => void): void;
19
+ offActiveSheetChange(callback: (sheet: ISheetDefine) => void): void;
20
+ reorderSheet(sourceKey: string, targetKey: string, position: 'left' | 'right'): void;
21
+ }
@@ -0,0 +1,66 @@
1
+ export default class SheetManager {
2
+ constructor() {
3
+ this._sheets = new Map, this._activeSheetKey = "";
4
+ }
5
+ getActiveSheet() {
6
+ if (!this._activeSheetKey || !this._sheets.has(this._activeSheetKey)) {
7
+ const firstSheet = this._sheets.values().next().value;
8
+ return firstSheet ? (this._activeSheetKey = firstSheet.sheetKey, firstSheet) : null;
9
+ }
10
+ return this._sheets.get(this._activeSheetKey);
11
+ }
12
+ setActiveSheet(sheetKey) {
13
+ if (!this._sheets.has(sheetKey)) throw new Error(`Sheet with key '${sheetKey}' not found`);
14
+ this._activeSheetKey = sheetKey;
15
+ for (const [key, sheet] of this._sheets.entries()) sheet.active = key === sheetKey;
16
+ }
17
+ addSheet(sheet) {
18
+ if (this._sheets.has(sheet.sheetKey)) throw new Error(`Sheet with key '${sheet.sheetKey}' already exists`);
19
+ this._sheets.set(sheet.sheetKey, sheet);
20
+ }
21
+ removeSheet(sheetKey) {
22
+ if (!this._sheets.has(sheetKey)) throw new Error(`Sheet with key '${sheetKey}' not found`);
23
+ if (sheetKey === this._activeSheetKey) {
24
+ let nextSheet = null;
25
+ for (const [key, sheet] of this._sheets.entries()) if (key !== sheetKey) {
26
+ nextSheet = sheet;
27
+ break;
28
+ }
29
+ nextSheet ? (this._activeSheetKey = nextSheet.sheetKey, nextSheet.active = !0) : this._activeSheetKey = "";
30
+ }
31
+ return this._sheets.delete(sheetKey), this._activeSheetKey;
32
+ }
33
+ renameSheet(sheetKey, newTitle) {
34
+ if (!this._sheets.has(sheetKey)) throw new Error(`Sheet with key '${sheetKey}' not found`);
35
+ this._sheets.get(sheetKey).sheetTitle = newTitle;
36
+ }
37
+ getAllSheets() {
38
+ return Array.from(this._sheets.values());
39
+ }
40
+ getSheet(sheetKey) {
41
+ return this._sheets.get(sheetKey) || null;
42
+ }
43
+ getSheetCount() {
44
+ return this._sheets.size;
45
+ }
46
+ getSheetAPI(sheetKey) {
47
+ return null;
48
+ }
49
+ onSheetChange(callback) {}
50
+ offSheetChange(callback) {}
51
+ onActiveSheetChange(callback) {}
52
+ offActiveSheetChange(callback) {}
53
+ reorderSheet(sourceKey, targetKey, position) {
54
+ if (sourceKey === targetKey) return;
55
+ if (!this._sheets.has(sourceKey)) throw new Error(`Source sheet '${sourceKey}' does not exist`);
56
+ if (!this._sheets.has(targetKey)) throw new Error(`Target sheet '${targetKey}' does not exist`);
57
+ const sheetsArray = Array.from(this._sheets.entries()), sourceIndex = sheetsArray.findIndex((([key]) => key === sourceKey)), targetIndex = sheetsArray.findIndex((([key]) => key === targetKey));
58
+ if (-1 === sourceIndex || -1 === targetIndex || sourceIndex === targetIndex) return;
59
+ let insertIndex = "left" === position ? targetIndex : targetIndex + 1;
60
+ sourceIndex < insertIndex && insertIndex--;
61
+ const [movedSheet] = sheetsArray.splice(sourceIndex, 1);
62
+ sheetsArray.splice(insertIndex, 0, movedSheet), this._sheets.clear(), sheetsArray.forEach((([key, sheet]) => {
63
+ this._sheets.set(key, sheet);
64
+ }));
65
+ }
66
+ }
@@ -0,0 +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';\n\nexport default class SheetManager implements ISheetManager {\n /** sheets集合 */\n _sheets: Map<string, ISheetDefine> = new Map();\n /** 当前活动sheet的key */\n _activeSheetKey: string = '';\n\n constructor() {\n // 初始化\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 // 添加sheet\n this._sheets.set(sheet.sheetKey, sheet);\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,需要选择新的活动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 this._activeSheetKey = nextSheet.sheetKey;\n nextSheet.active = true;\n } else {\n this._activeSheetKey = '';\n }\n }\n\n // 移除sheet\n this._sheets.delete(sheetKey);\n return this._activeSheetKey;\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 sheet.sheetTitle = newTitle;\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 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 let insertIndex = position === 'left' ? targetIndex : targetIndex + 1;\n // 调整索引\n if (sourceIndex < insertIndex) {\n insertIndex--;\n }\n // 重排序\n const [movedSheet] = sheetsArray.splice(sourceIndex, 1);\n sheetsArray.splice(insertIndex, 0, movedSheet);\n // 清空并重新添加\n this._sheets.clear();\n sheetsArray.forEach(([key, sheet]) => {\n this._sheets.set(key, sheet);\n });\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import type VTableSheet from '../components/vtable-sheet';
2
+ export default class SheetTabDragManager {
3
+ private sheet;
4
+ private dragState;
5
+ private insertIndicator;
6
+ private boundMouseMove;
7
+ private boundMouseUp;
8
+ constructor(sheet: VTableSheet);
9
+ handleTabMouseDown(e: MouseEvent, sheetKey: string): void;
10
+ handleGlobalMouseMove(e: MouseEvent): void;
11
+ handleGlobalMouseUp(e: MouseEvent): void;
12
+ startDragging(): void;
13
+ updateDragging(e: MouseEvent): void;
14
+ endDragging(e: MouseEvent): void;
15
+ createDragPreview(): void;
16
+ updateDragPreview(e: MouseEvent): void;
17
+ cleanupDragPreview(): void;
18
+ calculateDropZones(): void;
19
+ getDropZoneAt(x: number, y: number): typeof this.dragState.dropZones[0] | null;
20
+ showInsertIndicator(dropZone: typeof this.dragState.dropZones[0]): void;
21
+ hideInsertIndicator(): void;
22
+ performTabReorder(sourceKey: string, targetKey: string, position: 'left' | 'right'): void;
23
+ cleanupDragState(): void;
24
+ }
@@ -0,0 +1,113 @@
1
+ export default class SheetTabDragManager {
2
+ constructor(sheet) {
3
+ this.dragState = {
4
+ isDragging: !1,
5
+ draggedSheetKey: null,
6
+ draggedElement: null,
7
+ startX: 0,
8
+ startY: 0,
9
+ threshold: 5,
10
+ preview: null,
11
+ dropZones: []
12
+ }, this.insertIndicator = null, this.sheet = sheet, this.boundMouseMove = e => this.handleGlobalMouseMove(e),
13
+ this.boundMouseUp = e => this.handleGlobalMouseUp(e);
14
+ }
15
+ handleTabMouseDown(e, sheetKey) {
16
+ this.insertIndicator || (this.insertIndicator = this.sheet.getRootElement().querySelector(".vtable-sheet-insert-indicator")),
17
+ 0 === e.button && (e.preventDefault(), this.dragState.startX = e.clientX, this.dragState.startY = e.clientY,
18
+ this.dragState.draggedSheetKey = sheetKey, this.dragState.draggedElement = e.target,
19
+ document.addEventListener("mousemove", this.boundMouseMove), document.addEventListener("mouseup", this.boundMouseUp));
20
+ }
21
+ handleGlobalMouseMove(e) {
22
+ if (!this.dragState.draggedSheetKey || !this.dragState.draggedElement) return;
23
+ const deltaX = Math.abs(e.clientX - this.dragState.startX), deltaY = Math.abs(e.clientY - this.dragState.startY);
24
+ !this.dragState.isDragging && (deltaX > this.dragState.threshold || deltaY > this.dragState.threshold) && this.startDragging(),
25
+ this.dragState.isDragging && this.updateDragging(e);
26
+ }
27
+ handleGlobalMouseUp(e) {
28
+ this.dragState.isDragging && this.endDragging(e), this.cleanupDragState(), document.removeEventListener("mousemove", (e => this.handleGlobalMouseMove(e))),
29
+ document.removeEventListener("mouseup", (e => this.handleGlobalMouseUp(e)));
30
+ }
31
+ startDragging() {
32
+ this.dragState.draggedElement && this.dragState.draggedSheetKey && (this.dragState.isDragging = !0,
33
+ this.dragState.draggedElement.classList.add("dragging"), this.createDragPreview(),
34
+ this.calculateDropZones(), this.insertIndicator && (this.insertIndicator.style.display = "block"));
35
+ }
36
+ updateDragging(e) {
37
+ if (!this.dragState.isDragging) return;
38
+ this.updateDragPreview(e);
39
+ const dropZone = this.getDropZoneAt(e.clientX, e.clientY);
40
+ dropZone ? this.showInsertIndicator(dropZone) : this.hideInsertIndicator();
41
+ }
42
+ endDragging(e) {
43
+ if (!this.dragState.isDragging || !this.dragState.draggedSheetKey) return;
44
+ const dropZone = this.getDropZoneAt(e.clientX, e.clientY);
45
+ dropZone && dropZone.targetKey !== this.dragState.draggedSheetKey && this.performTabReorder(this.dragState.draggedSheetKey, dropZone.targetKey, dropZone.position),
46
+ this.hideInsertIndicator(), this.dragState.draggedElement && this.dragState.draggedElement.classList.remove("dragging");
47
+ }
48
+ createDragPreview() {
49
+ this.dragState.draggedElement && (this.dragState.preview = document.createElement("div"),
50
+ this.dragState.preview.className = "vtable-sheet-drag-preview", this.dragState.preview.innerHTML = `\n <span class="drag-preview-text">${this.dragState.draggedElement.textContent}</span>\n `,
51
+ document.body.appendChild(this.dragState.preview), this.dragState.draggedElement.style.cursor = "grabbing");
52
+ }
53
+ updateDragPreview(e) {
54
+ this.dragState.preview && (this.dragState.preview.style.left = e.clientX - this.dragState.preview.offsetWidth / 2 + "px",
55
+ this.dragState.preview.style.top = e.clientY - this.dragState.preview.offsetHeight / 2 + "px");
56
+ }
57
+ cleanupDragPreview() {
58
+ this.dragState.preview && (this.dragState.preview.remove(), this.dragState.preview = null),
59
+ this.dragState.draggedElement && (this.dragState.draggedElement.style.cursor = "");
60
+ }
61
+ calculateDropZones() {
62
+ var _a;
63
+ this.dragState.dropZones = [];
64
+ const tabsContainer = null === (_a = this.sheet.getSheetTabElement()) || void 0 === _a ? void 0 : _a.querySelector(".vtable-sheet-tabs-container");
65
+ if (!tabsContainer) return;
66
+ tabsContainer.querySelectorAll(".vtable-sheet-tab").forEach((tab => {
67
+ const sheetKey = tab.dataset.key;
68
+ sheetKey && sheetKey !== this.dragState.draggedSheetKey && (this.dragState.dropZones.push({
69
+ element: tab,
70
+ position: "left",
71
+ targetKey: sheetKey
72
+ }), this.dragState.dropZones.push({
73
+ element: tab,
74
+ position: "right",
75
+ targetKey: sheetKey
76
+ }));
77
+ }));
78
+ }
79
+ getDropZoneAt(x, y) {
80
+ for (const zone of this.dragState.dropZones) {
81
+ const rect = zone.element.getBoundingClientRect();
82
+ if (y < rect.top || y > rect.bottom) continue;
83
+ const midX = rect.left + rect.width / 2;
84
+ if ("left" === zone.position && x >= rect.left && x <= midX) return zone;
85
+ if ("right" === zone.position && x >= midX && x <= rect.right) return zone;
86
+ }
87
+ return null;
88
+ }
89
+ showInsertIndicator(dropZone) {
90
+ var _a;
91
+ if (!this.insertIndicator) return;
92
+ const rect = dropZone.element.getBoundingClientRect(), containerRect = null === (_a = this.sheet.getRootElement().querySelector(".vtable-sheet-tabs-container")) || void 0 === _a ? void 0 : _a.getBoundingClientRect();
93
+ if (!containerRect) return;
94
+ let indicatorX;
95
+ indicatorX = "left" === dropZone.position ? rect.left - containerRect.left - 4 : rect.right - containerRect.left - 4,
96
+ this.insertIndicator.style.left = `${indicatorX}px`, this.insertIndicator.style.display = "block";
97
+ }
98
+ hideInsertIndicator() {
99
+ this.insertIndicator && (this.insertIndicator.style.display = "none");
100
+ }
101
+ performTabReorder(sourceKey, targetKey, position) {
102
+ try {
103
+ this.sheet.getSheetManager().reorderSheet(sourceKey, targetKey, position), this.sheet.updateSheetTabs(),
104
+ this.sheet.updateSheetMenu();
105
+ } catch (error) {}
106
+ }
107
+ cleanupDragState() {
108
+ this.cleanupDragPreview(), this.dragState.isDragging = !1, this.dragState.draggedSheetKey = null,
109
+ this.dragState.draggedElement = null, this.dragState.dropZones = [], this.dragState.startX = 0,
110
+ this.dragState.startY = 0;
111
+ }
112
+ }
113
+ //# sourceMappingURL=tab-drag-manager.js.map
@@ -0,0 +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', (e: MouseEvent) => this.handleGlobalMouseMove(e));\n document.removeEventListener('mouseup', (e: MouseEvent) => this.handleGlobalMouseUp(e));\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"]}
@@ -0,0 +1,16 @@
1
+ import { SelectionMode } from './ts-types';
2
+ import type { SheetConstructorOptions } from './ts-types';
3
+ export declare function initOptions(options: SheetConstructorOptions): {
4
+ defaultRowHeight: number;
5
+ defaultColWidth: number;
6
+ showRowHeader: boolean;
7
+ showColHeader: boolean;
8
+ editable: boolean;
9
+ theme: string;
10
+ selectionMode: SelectionMode;
11
+ pixelRatio: number;
12
+ };
13
+ export declare function columnStringToIndex(colStr: string): number;
14
+ export declare function columnIndexToString(colIndex: number): string;
15
+ export declare function dataToRecords(data: any[][]): any[];
16
+ export declare function recordsToData(records: any[], columns: any[]): any[][];
@@ -0,0 +1,54 @@
1
+ import { SelectionMode } from "./ts-types";
2
+
3
+ export function initOptions(options) {
4
+ var _a, _b, _c, _d, _e, _f, _g;
5
+ return {
6
+ defaultRowHeight: null !== (_a = options.defaultRowHeight) && void 0 !== _a ? _a : 25,
7
+ defaultColWidth: null !== (_b = options.defaultColWidth) && void 0 !== _b ? _b : 100,
8
+ showRowHeader: null === (_c = options.showRowHeader) || void 0 === _c || _c,
9
+ showColHeader: null === (_d = options.showColHeader) || void 0 === _d || _d,
10
+ editable: null === (_e = options.editable) || void 0 === _e || _e,
11
+ theme: null !== (_f = options.theme) && void 0 !== _f ? _f : "light",
12
+ selectionMode: null !== (_g = options.selectionMode) && void 0 !== _g ? _g : SelectionMode.CELL,
13
+ pixelRatio: window.devicePixelRatio || 1
14
+ };
15
+ }
16
+
17
+ export function columnStringToIndex(colStr) {
18
+ let col = 0;
19
+ for (let i = 0; i < colStr.length; i++) col = 26 * col + (colStr.charCodeAt(i) - 64);
20
+ return col - 1;
21
+ }
22
+
23
+ export function columnIndexToString(colIndex) {
24
+ let colStr = "", tempCol = colIndex + 1;
25
+ do {
26
+ tempCol -= 1, colStr = String.fromCharCode(65 + tempCol % 26) + colStr, tempCol = Math.floor(tempCol / 26);
27
+ } while (tempCol > 0);
28
+ return colStr;
29
+ }
30
+
31
+ export function dataToRecords(data) {
32
+ if (!data || !data.length) return [];
33
+ const records = [], headerRow = data[0];
34
+ for (let i = 1; i < data.length; i++) {
35
+ const row = data[i], record = {};
36
+ for (let j = 0; j < row.length; j++) {
37
+ record[headerRow && j < headerRow.length ? headerRow[j] : j.toString()] = row[j];
38
+ }
39
+ records.push(record);
40
+ }
41
+ return records;
42
+ }
43
+
44
+ export function recordsToData(records, columns) {
45
+ if (!records || !records.length) return [];
46
+ const data = [], headerRow = columns.map((col => col.title || col.field));
47
+ data.push(headerRow);
48
+ for (const record of records) {
49
+ const row = columns.map((col => record[col.field]));
50
+ data.push(row);
51
+ }
52
+ return data;
53
+ }
54
+ //# sourceMappingURL=sheet-helper.js.map