@visactor/vtable-sheet 1.20.0-alpha.3 → 1.20.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 (78) hide show
  1. package/README.md +173 -0
  2. package/cjs/components/vtable-sheet.d.ts +2 -0
  3. package/cjs/components/vtable-sheet.js +45 -13
  4. package/cjs/components/vtable-sheet.js.map +1 -1
  5. package/cjs/core/WorkSheet.d.ts +1 -0
  6. package/cjs/core/WorkSheet.js +32 -7
  7. package/cjs/core/WorkSheet.js.map +1 -1
  8. package/cjs/core/table-plugins.js.map +1 -1
  9. package/cjs/event/event-manager.d.ts +7 -8
  10. package/cjs/event/event-manager.js +2 -11
  11. package/cjs/event/event-manager.js.map +1 -1
  12. package/cjs/formula/formula-autocomplete.js.map +1 -1
  13. package/cjs/formula/formula-editor.js.map +1 -1
  14. package/cjs/formula/formula-engine.d.ts +102 -0
  15. package/cjs/formula/formula-engine.js +1028 -0
  16. package/cjs/formula/formula-engine.js.map +1 -0
  17. package/cjs/formula/formula-helper.js +1 -1
  18. package/cjs/formula/formula-helper.js.map +1 -1
  19. package/cjs/formula/formula-range-selector.d.ts +5 -2
  20. package/cjs/formula/formula-range-selector.js +70 -15
  21. package/cjs/formula/formula-range-selector.js.map +1 -1
  22. package/cjs/formula/formula-ui-manager.js +7 -4
  23. package/cjs/formula/formula-ui-manager.js.map +1 -1
  24. package/cjs/formula/index.js +1 -2
  25. package/cjs/index.d.ts +1 -1
  26. package/cjs/index.js +1 -1
  27. package/cjs/index.js.map +1 -1
  28. package/cjs/managers/formula-manager.d.ts +19 -16
  29. package/cjs/managers/formula-manager.js +71 -183
  30. package/cjs/managers/formula-manager.js.map +1 -1
  31. package/cjs/managers/menu-manager.js.map +1 -1
  32. package/cjs/tools/env.js.map +1 -1
  33. package/cjs/ts-types/event.d.ts +77 -68
  34. package/cjs/ts-types/event.js +6 -1
  35. package/cjs/ts-types/event.js.map +1 -1
  36. package/dist/vtable-sheet.js +73155 -109724
  37. package/dist/vtable-sheet.min.js +1 -853
  38. package/es/components/vtable-sheet.d.ts +2 -0
  39. package/es/components/vtable-sheet.js +46 -12
  40. package/es/components/vtable-sheet.js.map +1 -1
  41. package/es/core/WorkSheet.d.ts +1 -0
  42. package/es/core/WorkSheet.js +32 -5
  43. package/es/core/WorkSheet.js.map +1 -1
  44. package/es/core/table-plugins.js.map +1 -1
  45. package/es/event/event-manager.d.ts +7 -8
  46. package/es/event/event-manager.js +2 -11
  47. package/es/event/event-manager.js.map +1 -1
  48. package/es/formula/formula-autocomplete.js.map +1 -1
  49. package/es/formula/formula-editor.js.map +1 -1
  50. package/es/formula/formula-engine.d.ts +102 -0
  51. package/es/formula/formula-engine.js +1020 -0
  52. package/es/formula/formula-engine.js.map +1 -0
  53. package/es/formula/formula-helper.js +1 -1
  54. package/es/formula/formula-helper.js.map +1 -1
  55. package/es/formula/formula-range-selector.d.ts +5 -2
  56. package/es/formula/formula-range-selector.js +70 -15
  57. package/es/formula/formula-range-selector.js.map +1 -1
  58. package/es/formula/formula-ui-manager.js +7 -4
  59. package/es/formula/formula-ui-manager.js.map +1 -1
  60. package/es/formula/index.js +1 -2
  61. package/es/index.d.ts +1 -1
  62. package/es/index.js +1 -1
  63. package/es/index.js.map +1 -1
  64. package/es/managers/formula-manager.d.ts +19 -16
  65. package/es/managers/formula-manager.js +72 -184
  66. package/es/managers/formula-manager.js.map +1 -1
  67. package/es/managers/menu-manager.js.map +1 -1
  68. package/es/tools/env.js.map +1 -1
  69. package/es/ts-types/event.d.ts +77 -68
  70. package/es/ts-types/event.js +6 -1
  71. package/es/ts-types/event.js.map +1 -1
  72. package/package.json +6 -7
  73. package/cjs/test/formula-complete.test.d.ts +0 -1
  74. package/cjs/test/formula-complete.test.js +0 -42
  75. package/cjs/test/formula-complete.test.js.map +0 -1
  76. package/es/test/formula-complete.test.d.ts +0 -1
  77. package/es/test/formula-complete.test.js +0 -36
  78. package/es/test/formula-complete.test.js.map +0 -1
@@ -1 +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"]}
1
+ {"version":3,"sources":["../src/managers/formula-manager.ts"],"names":[],"mappings":"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","file":"formula-manager.js","sourcesContent":["import { FormulaEngine } from '../formula/formula-engine';\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 * 标准FormulaEngine配置 (MIT兼容)\n */\nconst DEFAULT_FORMULA_ENGINE_CONFIG = {\n precisionRounding: 14,\n caseSensitive: false,\n ignoreWhiteSpace: 'standard' as const,\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 /** FormulaEngine实例 */\n private formulaEngine: FormulaEngine;\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 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.initializeFormulaEngine();\n }\n\n /**\n * 初始化FormulaEngine实例\n */\n private initializeFormulaEngine(): void {\n try {\n this.formulaEngine = new FormulaEngine(DEFAULT_FORMULA_ENGINE_CONFIG);\n this.isInitialized = true;\n } catch (error) {\n console.error('Failed to initialize FormulaEngine:', error);\n throw new Error('FormulaManager initialization failed');\n }\n }\n\n /**\n * 添加新工作表 - 正确的多表格支持 (MIT兼容)\n * @param sheetKey 工作表键\n * @param normalizedData 工作表数据 需要规范处理过 且包含表头的数据 因为要输入给FormulaEngine\n * @returns 工作表ID\n */\n addSheet(sheetKey: string, normalizedData?: unknown[][]): number {\n this.ensureInitialized();\n\n // 检查是否已存在\n if (this.sheetMapping.has(sheetKey)) {\n const existingId = this.sheetMapping.get(sheetKey);\n if (existingId !== undefined) {\n return existingId;\n }\n }\n\n try {\n // 记录添加前的数量\n const wasFirstSheet = this.sheetMapping.size === 0;\n\n // 使用FormulaEngine创建工作表\n const sheetId = this.formulaEngine.addSheet(sheetKey, normalizedData);\n\n this.sheetMapping.set(sheetKey, sheetId);\n this.reverseSheetMapping.set(sheetId, sheetKey);\n this.nextSheetId = Math.max(this.nextSheetId, sheetId + 1);\n\n // 如果是第一个工作表,设置为活动工作表\n if (wasFirstSheet) {\n this.formulaEngine.setActiveSheet(sheetKey);\n }\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: unknown[][], tableInstance: VTable.ListTable): unknown[][] {\n try {\n //将columns中的title追加到data中\n const headerRows: unknown[][] = [];\n for (let i = 0; i < tableInstance.columnHeaderLevelCount; i++) {\n const headerRow: unknown[] = [];\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 * 移除工作表 (MIT兼容)\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.formulaEngine.removeSheet(sheetKey);\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 * 重命名工作表 (MIT兼容)\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 // 使用FormulaEngine的renameSheet API\n this.formulaEngine.renameSheet(oldKey, 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 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 * 设置单元格内容 (MIT兼容)\n * @param cell 单元格\n * @param value 值\n */\n setCellContent(cell: FormulaCell, value: unknown): void {\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 // 使用FormulaEngine设置单元格内容\n this.formulaEngine.setCellContent(cell, value);\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 * 获取单元格值 (MIT兼容)\n * @param cell 单元格\n * @returns 单元格值\n */\n getCellValue(cell: FormulaCell): FormulaResult {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取单元格值\n return this.formulaEngine.getCellValue(cell);\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 * 获取单元格公式 (MIT兼容)\n * @param cell 单元格\n * @returns 单元格公式\n */\n getCellFormula(cell: FormulaCell): string | undefined {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取单元格公式\n return this.formulaEngine.getCellFormula(cell);\n } catch (error) {\n console.error('Failed to get cell formula:', error);\n return undefined;\n }\n }\n\n /**\n * 检查是否为公式单元格 (MIT兼容)\n * @param cell 单元格\n * @returns 是否为公式单元格\n */\n isCellFormula(cell: FormulaCell): boolean {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine检查是否为公式单元格\n return this.formulaEngine.isCellFormula(cell);\n } catch (error) {\n console.error('Failed to check if cell has formula:', error);\n return false;\n }\n }\n\n /**\n * 获取依赖此单元格的所有单元格(包括范围依赖)(MIT兼容)\n * @param cell 单元格\n * @returns 依赖此单元格的所有单元格\n */\n getCellDependents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取依赖单元格\n return this.formulaEngine.getCellDependents(cell);\n } catch (error) {\n console.error('Failed to get cell dependents:', error);\n return [];\n }\n }\n\n /**\n * 获取此单元格依赖的所有单元格 (MIT兼容)\n * @param cell 单元格\n * @returns 此单元格依赖的所有单元格\n */\n getCellPrecedents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取前置单元格\n return this.formulaEngine.getCellPrecedents(cell);\n } catch (error) {\n console.error('Failed to get cell precedents:', error);\n return [];\n }\n }\n\n /**\n * 批量更新单元格 (MIT兼容)\n * @param changes 更新内容\n */\n batchUpdate(changes: Array<{ cell: FormulaCell; value: unknown }>): void {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine批量更新单元格\n for (const { cell, value } of changes) {\n this.formulaEngine.setCellContent(cell, value);\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 * 添加行 (MIT兼容 - 简化实现)\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 // 简化实现:在指定位置插入空行\n console.warn(\n `addRows operation not fully implemented in MIT version. \n Inserting ${numberOfRows} empty rows at index ${rowIndex}`\n );\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 * 删除行 (MIT兼容 - 简化实现)\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 // 简化实现:删除指定位置的行\n console.warn(\n `removeRows operation not fully implemented in MIT version. Removing ${numberOfRows} rows at index ${rowIndex}`\n );\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 * 添加列 (MIT兼容 - 简化实现)\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 // 简化实现:在指定位置插入空列\n console.warn(\n `addColumns operation not fully implemented in MIT version. \n Inserting ${numberOfColumns} empty columns at index ${columnIndex}`\n );\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 * 删除列 (MIT兼容 - 简化实现)\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 // 简化实现:删除指定位置的列\n console.warn(\n `removeColumns operation not fully implemented in MIT version. \n Removing ${numberOfColumns} columns at index ${columnIndex}`\n );\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 * 获取工作表序列化数据 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @returns 工作表序列化数据\n */\n getSheetSerialized(sheetKey: string): unknown[][] {\n this.ensureInitialized();\n\n try {\n // 简化实现:返回空数组,实际实现需要获取工作表数据\n console.warn(`getSheetSerialized operation not fully implemented in MIT version for sheet ${sheetKey}`);\n return [[]];\n } catch (error) {\n console.error('Failed to get sheet serialized data:', error);\n return [[]];\n }\n }\n\n /**\n * 根据依赖关系对公式进行排序 (MIT兼容)\n * @param sheetKey 工作表键\n * @param formulas 公式数据 (A1表示法的单元格引用 -> 公式内容)\n * @returns 排序后的公式条目数组\n */\n sortFormulasByDependency(sheetKey: string, formulas: Record<string, string>): [string, string][] {\n try {\n // 使用FormulaEngine的依赖排序功能\n return this.formulaEngine.sortFormulasByDependency(sheetKey, formulas);\n } catch (error) {\n // 如果排序失败,返回原始顺序\n return Object.entries(formulas);\n }\n }\n\n /**\n * 设置工作表内容 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @param normalizedData 工作表数据 需要规范处理过 且包含表头的数据\n */\n setSheetContent(sheetKey: string, _normalizedData: unknown[][]): void {\n this.ensureInitialized();\n\n try {\n // 简化实现:通过逐个设置单元格来设置工作表内容\n console.warn(`setSheetContent operation not fully implemented in MIT version for sheet ${sheetKey}`);\n // 这里可以逐个设置单元格内容\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 * 检查循环引用 (MIT兼容 - 简化实现)\n * @returns 是否存在循环引用\n */\n hasCircularReference(): boolean {\n try {\n // 简化实现:FormulaEngine内部处理循环引用检测\n console.warn('Circular reference detection not fully implemented in MIT version');\n return false;\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 * 验证公式语法 (MIT兼容)\n * @param formula 公式\n * @returns 验证结果\n */\n validateFormula(formula: string): { isValid: boolean; error?: string } {\n try {\n // 使用FormulaEngine验证公式\n return this.formulaEngine.validateFormula(formula);\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 * 计算单个公式而不影响工作表 (MIT兼容)\n * @param formula 公式\n * @returns 计算结果\n */\n calculateFormula(formula: string): { value: unknown; error?: string } {\n try {\n // 使用FormulaEngine计算公式\n return this.formulaEngine.calculateFormula(formula);\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Calculation failed'\n };\n }\n }\n\n /**\n * 暂停自动计算 (MIT兼容 - 简化实现)\n * @returns 是否成功\n */\n suspendEvaluation(): void {\n try {\n // 简化实现:FormulaEngine不支持暂停计算\n console.warn('suspendEvaluation operation not supported in MIT version');\n } catch (error) {\n console.error('Failed to suspend evaluation:', error);\n }\n }\n\n /**\n * 恢复自动计算 (MIT兼容 - 简化实现)\n */\n resumeEvaluation(): void {\n try {\n // 简化实现:FormulaEngine不支持恢复计算\n console.warn('resumeEvaluation operation not supported in MIT version');\n } catch (error) {\n console.error('Failed to resume evaluation:', error);\n }\n }\n\n /**\n * 强制重新计算所有公式 (MIT兼容 - 简化实现)\n */\n rebuildAndRecalculate(): void {\n try {\n // 简化实现:FormulaEngine自动处理重新计算\n console.warn('rebuildAndRecalculate operation not required in MIT version');\n } catch (error) {\n console.error('Failed to rebuild and recalculate:', error);\n }\n }\n\n /**\n * 清空所有内容 (MIT兼容)\n */\n clearContent(): void {\n try {\n this.release();\n this.initializeFormulaEngine();\n } catch (error) {\n console.error('Failed to clear content:', error);\n }\n }\n\n /**\n * 销毁FormulaManager (MIT兼容)\n */\n release(): void {\n this.formulaRangeSelector?.release();\n this.cellHighlightManager?.release();\n try {\n if (this.formulaEngine) {\n this.formulaEngine.release();\n }\n } catch (error) {\n console.error('Failed to destroy FormulaEngine:', 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 * 导出状态用于调试 (MIT兼容)\n */\n exportState(): Record<string, unknown> {\n return {\n isInitialized: this.isInitialized,\n sheets: Array.from(this.sheetMapping.entries()),\n functions: this.getAvailableFunctions(),\n stats: null // FormulaEngine不提供统计信息\n };\n }\n\n /**\n * 导出指定工作表中的所有公式 (MIT兼容)\n * @param sheetKey 工作表键\n * @returns 公式数据 (A1表示法的单元格引用 -> 公式内容)\n */\n exportFormulas(sheetKey: string): Record<string, string> {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine导出公式\n return this.formulaEngine.exportFormulas(sheetKey);\n } catch (error) {\n console.error(`Failed to export formulas for sheet ${sheetKey}:`, error);\n return {};\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 * 获取所有工作表信息 (MIT兼容)\n */\n getAllSheets(): Array<{ key: string; id: number; name: string }> {\n try {\n // 使用FormulaEngine获取所有工作表\n return this.formulaEngine.getAllSheets();\n } catch (error) {\n console.error('Failed to get all sheets:', error);\n return [];\n }\n }\n\n /**\n * 设置活动工作表 (MIT兼容)\n * @param sheetKey 工作表键\n */\n setActiveSheet(sheetKey: string): void {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine设置活动工作表\n this.formulaEngine.setActiveSheet(sheetKey);\n } catch (error) {\n console.error(`Failed to set active sheet ${sheetKey}:`, error);\n throw new Error(`Failed to set active sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 获取活动工作表 (MIT兼容)\n */\n getActiveSheet(): string | null {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取活动工作表\n return this.formulaEngine.getActiveSheet();\n } catch (error) {\n console.error('Failed to get active sheet:', error);\n return null;\n }\n }\n\n /**\n * 复制/移动单元格范围 - 简化版本 (MIT兼容)\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 // 简单的数据复制实现\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"]}
@@ -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 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"]}
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 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 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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/env.ts"],"names":[],"mappings":"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","file":"env.js","sourcesContent":["export type EnvMode = 'browser' | 'node' | 'worker' | 'miniApp' | 'desktop-miniApp';\nexport type LooseFunction = (...args: any) => any;\n\nexport class Env {\n static _mode: EnvMode;\n public static get mode() {\n if (!Env._mode) {\n Env._mode = defaultMode();\n }\n return Env._mode;\n }\n public static set mode(mode: EnvMode) {\n Env._mode = mode;\n }\n\n static dpr = 0;\n\n static CreateCanvas?: LooseFunction;\n\n static LoadImage?: LooseFunction;\n\n static RequestAnimationFrame?: LooseFunction;\n\n static CancelAnimationFrame?: LooseFunction;\n\n static RegisterCreateCanvas(func: LooseFunction) {\n Env.CreateCanvas = func;\n }\n\n static RegisterLoadImage(func: LooseFunction) {\n Env.LoadImage = func;\n }\n\n static GetCreateCanvasFunc(): LooseFunction | undefined {\n if (Env.CreateCanvas) {\n return Env.CreateCanvas;\n }\n if (Env.mode === 'worker') {\n return (width = 200, height = 200) => new OffscreenCanvas(width, height);\n }\n return undefined;\n }\n\n static RegisterRequestAnimationFrame(func: LooseFunction) {\n Env.RequestAnimationFrame = func();\n }\n\n static GetRequestAnimationFrame() {\n if (Env.RequestAnimationFrame) {\n return Env.RequestAnimationFrame;\n }\n return undefined;\n }\n\n static RegisterCancelAnimationFrame(func: LooseFunction) {\n Env.CancelAnimationFrame = func();\n }\n\n static GetCancelAnimationFrame() {\n if (Env.CancelAnimationFrame) {\n return Env.CancelAnimationFrame;\n }\n return undefined;\n }\n}\n\n/**\n *\n * 这个默认的判断方法并不能区分出不同的环境,所以这里采用是否判断\n * 满足条件为 'browser',不满足则为 'node'\n */\nfunction defaultMode(): EnvMode {\n let mode: EnvMode = 'browser';\n try {\n if ((window as any).type === 'node') {\n mode = 'node';\n } else if (typeof window !== 'undefined' && !window.performance) {\n mode = 'miniApp';\n } else if (typeof window === 'undefined') {\n mode = 'node';\n }\n } catch (err) {\n mode = 'node';\n }\n return mode;\n}\n/**\n * 清空页面上的所有文本选择,使用多种兼容性方法\n */\nexport function clearPageSelection(): void {\n try {\n const selection = window.getSelection();\n if (selection) {\n // 方法1: removeAllRanges() - 标准方法,最广泛支持\n if (typeof selection.removeAllRanges === 'function') {\n selection.removeAllRanges();\n console.log('使用 removeAllRanges() 清空selection');\n return;\n }\n\n // 方法2: empty() - IE 和一些旧浏览器\n if (typeof (selection as any).empty === 'function') {\n (selection as any).empty();\n console.log('使用 empty() 清空selection');\n return;\n }\n\n // 方法3: collapse() - 备用方法\n if (typeof selection.collapse === 'function') {\n selection.collapse(document.body, 0);\n console.log('使用 collapse() 清空selection');\n return;\n }\n\n console.warn('无法清空selection:不支持的浏览器');\n }\n } catch (error) {\n console.warn('清空selection时出错:', error);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/tools/env.ts"],"names":[],"mappings":"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","file":"env.js","sourcesContent":["export type EnvMode = 'browser' | 'node' | 'worker' | 'miniApp' | 'desktop-miniApp';\nexport type LooseFunction = (...args: any) => any;\n\nexport class Env {\n static _mode: EnvMode;\n public static get mode() {\n if (!Env._mode) {\n Env._mode = defaultMode();\n }\n return Env._mode;\n }\n public static set mode(mode: EnvMode) {\n Env._mode = mode;\n }\n\n static dpr = 0;\n\n static CreateCanvas?: LooseFunction;\n\n static LoadImage?: LooseFunction;\n\n static RequestAnimationFrame?: LooseFunction;\n\n static CancelAnimationFrame?: LooseFunction;\n\n static RegisterCreateCanvas(func: LooseFunction) {\n Env.CreateCanvas = func;\n }\n\n static RegisterLoadImage(func: LooseFunction) {\n Env.LoadImage = func;\n }\n\n static GetCreateCanvasFunc(): LooseFunction | undefined {\n if (Env.CreateCanvas) {\n return Env.CreateCanvas;\n }\n if (Env.mode === 'worker') {\n return (width = 200, height = 200) => new OffscreenCanvas(width, height);\n }\n return undefined;\n }\n\n static RegisterRequestAnimationFrame(func: LooseFunction) {\n Env.RequestAnimationFrame = func();\n }\n\n static GetRequestAnimationFrame() {\n if (Env.RequestAnimationFrame) {\n return Env.RequestAnimationFrame;\n }\n return undefined;\n }\n\n static RegisterCancelAnimationFrame(func: LooseFunction) {\n Env.CancelAnimationFrame = func();\n }\n\n static GetCancelAnimationFrame() {\n if (Env.CancelAnimationFrame) {\n return Env.CancelAnimationFrame;\n }\n return undefined;\n }\n}\n\n/**\n *\n * 这个默认的判断方法并不能区分出不同的环境,所以这里采用是否判断\n * 满足条件为 'browser',不满足则为 'node'\n */\nfunction defaultMode(): EnvMode {\n let mode: EnvMode = 'browser';\n try {\n if ((window as any).type === 'node') {\n mode = 'node';\n } else if (typeof window !== 'undefined' && !window.performance) {\n mode = 'miniApp';\n } else if (typeof window === 'undefined') {\n mode = 'node';\n }\n } catch (err) {\n mode = 'node';\n }\n return mode;\n}\n/**\n * 清空页面上的所有文本选择,使用多种兼容性方法\n */\nexport function clearPageSelection(): void {\n try {\n const selection = window.getSelection();\n if (selection) {\n // 方法1: removeAllRanges() - 标准方法,最广泛支持\n if (typeof selection.removeAllRanges === 'function') {\n selection.removeAllRanges();\n return;\n }\n\n // 方法2: empty() - IE 和一些旧浏览器\n if (typeof (selection as any).empty === 'function') {\n (selection as any).empty();\n return;\n }\n\n // 方法3: collapse() - 备用方法\n if (typeof selection.collapse === 'function') {\n selection.collapse(document.body, 0);\n return;\n }\n\n console.warn('无法清空selection:不支持的浏览器');\n }\n } catch (error) {\n console.warn('清空selection时出错:', error);\n }\n}\n"]}
@@ -1,66 +1,83 @@
1
- import type { CellCoord, CellRange, CellValue } from './base';
1
+ import type { CellValue } from './base';
2
+ export declare enum WorkSheetEventType {
3
+ CELL_CLICK = "cell-click",
4
+ CELL_VALUE_CHANGED = "cell-value-changed",
5
+ SELECTION_CHANGED = "selection-changed",
6
+ SELECTION_END = "selection-end"
7
+ }
2
8
  export type EventHandler = (...args: any[]) => void;
3
- export interface IEventMap {
4
- 'cell:selected': {
5
- coord: CellCoord;
6
- };
7
- 'cell:deselected': {
8
- coord: CellCoord;
9
- };
10
- 'cell:changed': {
11
- coord: CellCoord;
9
+ export interface CellClickEvent {
10
+ row: number;
11
+ col: number;
12
+ value?: CellValue;
13
+ cellElement?: HTMLElement;
14
+ originalEvent?: MouseEvent | KeyboardEvent;
15
+ }
16
+ export interface CellValueChangedEvent {
17
+ row: number;
18
+ col: number;
19
+ newValue: CellValue;
20
+ oldValue: CellValue;
21
+ cellElement?: HTMLElement;
22
+ isUserAction?: boolean;
23
+ isFormulaCalculation?: boolean;
24
+ }
25
+ export interface SelectionChangedEvent {
26
+ ranges?: Array<{
27
+ start: {
28
+ row: number;
29
+ col: number;
30
+ };
31
+ end: {
32
+ row: number;
33
+ col: number;
34
+ };
35
+ }>;
36
+ cells?: Array<Array<{
37
+ row: number;
38
+ col: number;
39
+ value?: CellValue;
40
+ }>>;
41
+ originalEvent?: MouseEvent | KeyboardEvent;
42
+ }
43
+ export interface EditStartEvent {
44
+ row: number;
45
+ col: number;
46
+ value: CellValue;
47
+ editorElement?: HTMLElement;
48
+ }
49
+ export interface EditEndEvent {
50
+ row: number;
51
+ col: number;
52
+ oldValue: CellValue;
53
+ newValue: CellValue;
54
+ isCancelled?: boolean;
55
+ }
56
+ export interface SheetResizedEvent {
57
+ width: number;
58
+ height: number;
59
+ oldWidth?: number;
60
+ oldHeight?: number;
61
+ }
62
+ export interface DataChangedEvent {
63
+ changes: Array<{
64
+ row: number;
65
+ col: number;
12
66
  oldValue: CellValue;
13
67
  newValue: CellValue;
14
- };
15
- 'cell:editing': {
16
- coord: CellCoord;
17
- };
18
- 'cell:edited': {
19
- coord: CellCoord;
20
- value: CellValue;
21
- };
22
- 'selection:changed': {
23
- range: CellRange;
24
- };
25
- 'selection:start': {
26
- coord: CellCoord;
27
- };
28
- 'selection:end': {
29
- range: CellRange;
30
- };
31
- 'sheet:ready': void;
32
- 'sheet:destroyed': void;
33
- 'sheet:resized': {
34
- width: number;
35
- height: number;
36
- };
37
- 'sheet:focused': void;
38
- 'sheet:blurred': void;
39
- 'data:changed': {
40
- changes: Array<{
41
- coord: CellCoord;
42
- oldValue: CellValue;
43
- newValue: CellValue;
44
- }>;
45
- };
46
- 'data:loaded': void;
47
- 'data:sorted': {
48
- columnKey: string;
49
- direction: 'asc' | 'desc';
50
- };
51
- 'data:filtered': {
52
- filters: Array<{
53
- columnKey: string;
54
- value: any;
55
- }>;
56
- };
57
- 'toolbar:action': {
58
- actionId: string;
59
- };
60
- 'toolbar:stateChanged': {
61
- actionId: string;
62
- enabled: boolean;
63
- };
68
+ }>;
69
+ isUserAction?: boolean;
70
+ }
71
+ export interface DataSortedEvent {
72
+ field: string;
73
+ order: 'asc' | 'desc' | null;
74
+ orderFn?: Function;
75
+ }
76
+ export interface IEventMap {
77
+ [WorkSheetEventType.CELL_CLICK]: CellClickEvent;
78
+ [WorkSheetEventType.CELL_VALUE_CHANGED]: CellValueChangedEvent;
79
+ [WorkSheetEventType.SELECTION_CHANGED]: SelectionChangedEvent;
80
+ [WorkSheetEventType.SELECTION_END]: SelectionChangedEvent;
64
81
  }
65
82
  export interface IEventManager {
66
83
  on: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;
@@ -69,11 +86,3 @@ export interface IEventManager {
69
86
  once: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;
70
87
  removeAllListeners: () => void;
71
88
  }
72
- export interface CellValueChangedEvent {
73
- row: number;
74
- col: number;
75
- newValue: CellValue;
76
- oldValue: CellValue;
77
- }
78
- export type CellSelectedEvent = IEventMap['cell:selected'];
79
- export type SelectionChangedEvent = IEventMap['selection:changed'];
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
2
 
3
+ var WorkSheetEventType;
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: !0
5
- });
7
+ }), exports.WorkSheetEventType = void 0, function(WorkSheetEventType) {
8
+ WorkSheetEventType.CELL_CLICK = "cell-click", WorkSheetEventType.CELL_VALUE_CHANGED = "cell-value-changed",
9
+ WorkSheetEventType.SELECTION_CHANGED = "selection-changed", WorkSheetEventType.SELECTION_END = "selection-end";
10
+ }(WorkSheetEventType = exports.WorkSheetEventType || (exports.WorkSheetEventType = {}));
6
11
  //# sourceMappingURL=event.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ts-types/event.ts"],"names":[],"mappings":"","file":"event.js","sourcesContent":["import type { CellCoord, CellRange, CellValue } from './base';\n\n/** 事件处理器类型 */\nexport type EventHandler = (...args: any[]) => void;\n\n/** 事件映射表 */\nexport interface IEventMap {\n // 单元格事件\n 'cell:selected': { coord: CellCoord };\n 'cell:deselected': { coord: CellCoord };\n 'cell:changed': { coord: CellCoord; oldValue: CellValue; newValue: CellValue };\n 'cell:editing': { coord: CellCoord };\n 'cell:edited': { coord: CellCoord; value: CellValue };\n\n // 选择事件\n 'selection:changed': { range: CellRange };\n 'selection:start': { coord: CellCoord };\n 'selection:end': { range: CellRange };\n\n // Sheet事件\n 'sheet:ready': void;\n 'sheet:destroyed': void;\n 'sheet:resized': { width: number; height: number };\n 'sheet:focused': void;\n 'sheet:blurred': void;\n\n // 数据事件\n 'data:changed': { changes: Array<{ coord: CellCoord; oldValue: CellValue; newValue: CellValue }> };\n 'data:loaded': void;\n 'data:sorted': { columnKey: string; direction: 'asc' | 'desc' };\n 'data:filtered': { filters: Array<{ columnKey: string; value: any }> };\n\n // 工具栏事件\n 'toolbar:action': { actionId: string };\n 'toolbar:stateChanged': { actionId: string; enabled: boolean };\n}\n\n/** 事件管理器接口 */\nexport interface IEventManager {\n /** 注册事件监听器 */\n on: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 移除事件监听器 */\n off: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 触发事件 */\n emit: <K extends keyof IEventMap>(event: K, payload: IEventMap[K]) => void;\n\n /** 一次性事件监听器 */\n once: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 移除所有事件监听器 */\n removeAllListeners: () => void;\n}\n\nexport interface CellValueChangedEvent {\n /** 行索引 */\n row: number;\n /** 列索引 */\n col: number;\n /** 新值 */\n newValue: CellValue;\n /** 旧值 */\n oldValue: CellValue;\n}\n\nexport type CellSelectedEvent = IEventMap['cell:selected'];\nexport type SelectionChangedEvent = IEventMap['selection:changed'];\n"]}
1
+ {"version":3,"sources":["../src/ts-types/event.ts"],"names":[],"mappings":";;;AAqBA,IAAY,kBAwBX;AAxBD,WAAY,kBAAkB;IAE5B,+CAAyB,CAAA;IACzB,+DAAyC,CAAA;IAGzC,6DAAuC,CAAA;IACvC,qDAA+B,CAAA;AAiBjC,CAAC,EAxBW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAwB7B","file":"event.js","sourcesContent":["import type { CellCoord, CellRange, CellValue } from './base';\n\n/**\n * 工作表事件类型枚举\n *\n * @description 定义了VTableSheet组件支持的所有事件类型。\n * 使用枚举可以提供更好的类型提示和代码补全功能。\n *\n * @example\n * ```typescript\n * // 注册单元格选择事件\n * sheet.on(WorkSheetEventType.CELL_CLICK, (event) => {\n * console.log(`选中单元格: 行${event.row}, 列${event.col}`);\n * });\n *\n * // 注册单元格值变化事件\n * sheet.on(WorkSheetEventType.CELL_VALUE_CHANGED, (event) => {\n * console.log(`单元格值变化: 从 ${event.oldValue} 变为 ${event.newValue}`);\n * });\n * ```\n */\nexport enum WorkSheetEventType {\n // 单元格事件\n CELL_CLICK = 'cell-click',\n CELL_VALUE_CHANGED = 'cell-value-changed',\n\n // 选择范围事件\n SELECTION_CHANGED = 'selection-changed',\n SELECTION_END = 'selection-end'\n\n // // 工作表状态事件\n // SHEET_READY = 'sheet-ready',\n // SHEET_DESTROYED = 'sheet-destroyed',\n // SHEET_RESIZED = 'sheet-resized',\n\n // // 编辑相关事件\n // EDIT_START = 'edit-start',\n // EDIT_END = 'edit-end',\n // EDIT_CANCEL = 'edit-cancel',\n\n // // 数据事件\n // DATA_CHANGED = 'data-changed',\n // DATA_LOADED = 'data-loaded',\n // DATA_SORTED = 'data-sorted',\n // DATA_FILTERED = 'data-filtered'\n}\n\n/** 事件处理器类型 */\nexport type EventHandler = (...args: any[]) => void;\n\n/**\n * 单元格选择事件参数\n *\n * @description 在用户选中单元格时触发。包含被选中单元格的行列信息、值和原始事件对象。\n *\n * @event WorkSheetEventType.CELL_CLICK\n * @example\n * ```typescript\n * sheet.on(WorkSheetEventType.CELL_CLICK, (event: CellClickEvent) => {\n * console.log(`选中单元格: 行${event.row}, 列${event.col}, 值: ${event.value}`);\n * });\n * ```\n */\nexport interface CellClickEvent {\n /** 行索引 */\n row: number;\n /** 列索引 */\n col: number;\n /** 单元格内容 */\n value?: CellValue;\n /** 单元格DOM元素 */\n cellElement?: HTMLElement;\n /** 原始事件对象 */\n originalEvent?: MouseEvent | KeyboardEvent;\n}\n\n/**\n * 单元格值变更事件参数\n *\n * @description 在单元格值被修改时触发。包含被修改单元格的行列信息、旧值、新值等信息。\n * 可通过isUserAction判断是否由用户操作触发,通过isFormulaCalculation判断是否由公式计算触发。\n *\n * @event WorkSheetEventType.CELL_VALUE_CHANGED\n * @example\n * ```typescript\n * sheet.on(WorkSheetEventType.CELL_VALUE_CHANGED, (event: CellValueChangedEvent) => {\n * console.log(`单元格值变化: 行${event.row}, 列${event.col}, 从 ${event.oldValue} 变为 ${event.newValue}`);\n * });\n * ```\n */\nexport interface CellValueChangedEvent {\n /** 行索引 */\n row: number;\n /** 列索引 */\n col: number;\n /** 新值 */\n newValue: CellValue;\n /** 旧值 */\n oldValue: CellValue;\n /** 单元格DOM元素 */\n cellElement?: HTMLElement;\n /** 是否由用户操作引起 */\n isUserAction?: boolean;\n /** 是否由公式计算引起 */\n isFormulaCalculation?: boolean;\n}\n\n/**\n * 选择范围变更事件参数\n *\n * @description 在选择范围变化时触发。包含选择区域信息、选中的单元格数组和原始事件对象。\n *\n * @event WorkSheetEventType.SELECTION_CHANGED\n * @event WorkSheetEventType.SELECTION_END\n * @example\n * ```typescript\n * sheet.on(WorkSheetEventType.SELECTION_CHANGED, (event: SelectionChangedEvent) => {\n * if (event.ranges && event.ranges.length > 0) {\n * const range = event.ranges[0];\n * console.log(`选择区域: 从 (${range.start.row}, ${range.start.col}) 到 (${range.end.row}, ${range.end.col})`);\n * }\n * });\n * ```\n */\nexport interface SelectionChangedEvent {\n /** 选择区域 */\n ranges?: Array<{\n start: {\n row: number;\n col: number;\n };\n end: {\n row: number;\n col: number;\n };\n }>;\n /** 选择的单元格数据 */\n cells?: Array<\n Array<{\n row: number;\n col: number;\n value?: CellValue;\n }>\n >;\n /** 原始事件对象 */\n originalEvent?: MouseEvent | KeyboardEvent;\n}\n\n/**\n * 编辑开始事件参数\n *\n * @description 在用户开始编辑单元格时触发。包含编辑的单元格信息和当前值。\n *\n * @event WorkSheetEventType.EDIT_START\n * @example\n * ```typescript\n * sheet.on(WorkSheetEventType.EDIT_START, (event: EditStartEvent) => {\n * console.log(`开始编辑单元格: 行${event.row}, 列${event.col}, 当前值: ${event.value}`);\n * });\n * ```\n */\nexport interface EditStartEvent {\n /** 行索引 */\n row: number;\n /** 列索引 */\n col: number;\n /** 当前值 */\n value: CellValue;\n /** 编辑器元素 */\n editorElement?: HTMLElement;\n}\n\n/**\n * 编辑结束事件参数\n *\n * @description 在用户完成单元格编辑时触发。包含编辑的单元格信息、旧值和新值。\n * 可通过isCancelled判断编辑是否被取消。\n *\n * @event WorkSheetEventType.EDIT_END\n * @event WorkSheetEventType.EDIT_CANCEL\n * @example\n * ```typescript\n * sheet.on(WorkSheetEventType.EDIT_END, (event: EditEndEvent) => {\n * console.log(`完成编辑单元格: 行${event.row}, 列${event.col}, 从 ${event.oldValue} 变为 ${event.newValue}`);\n * });\n * ```\n */\nexport interface EditEndEvent {\n /** 行索引 */\n row: number;\n /** 列索引 */\n col: number;\n /** 旧值 */\n oldValue: CellValue;\n /** 新值 */\n newValue: CellValue;\n /** 是否被取消 */\n isCancelled?: boolean;\n}\n\n/**\n * 工作表尺寸变更事件参数\n *\n * @description 在工作表尺寸变化时触发,如窗口调整。包含新的宽度和高度信息。\n *\n * @event WorkSheetEventType.SHEET_RESIZED\n * @example\n * ```typescript\n * sheet.on(WorkSheetEventType.SHEET_RESIZED, (event: SheetResizedEvent) => {\n * console.log(`工作表尺寸变化: 新宽度 ${event.width}, 新高度 ${event.height}`);\n * });\n * ```\n */\nexport interface SheetResizedEvent {\n /** 新宽度 */\n width: number;\n /** 新高度 */\n height: number;\n /** 旧宽度 */\n oldWidth?: number;\n /** 旧高度 */\n oldHeight?: number;\n}\n\n/**\n * 数据变更事件参数\n *\n * @description 在表格数据发生批量变更时触发。包含所有变更的单元格信息。\n * 可通过isUserAction判断是否由用户操作触发。\n *\n * @event WorkSheetEventType.DATA_CHANGED\n * @example\n * ```typescript\n * sheet.on(WorkSheetEventType.DATA_CHANGED, (event: DataChangedEvent) => {\n * console.log(`数据变化: 变更了 ${event.changes.length} 个单元格`);\n * event.changes.forEach(change => {\n * console.log(` 行${change.row}, 列${change.col}: ${change.oldValue} -> ${change.newValue}`);\n * });\n * });\n * ```\n */\nexport interface DataChangedEvent {\n /** 变更内容 */\n changes: Array<{\n row: number;\n col: number;\n oldValue: CellValue;\n newValue: CellValue;\n }>;\n /** 是否由用户操作引起 */\n isUserAction?: boolean;\n}\n\n/**\n * 数据排序事件参数\n *\n * @description 在表格数据排序时触发。包含排序的列和排序方向信息。\n *\n * @event WorkSheetEventType.DATA_SORTED\n * @example\n * ```typescript\n * sheet.on(WorkSheetEventType.DATA_SORTED, (event: DataSortedEvent) => {\n * console.log(`数据排序: 列 ${event.field}, 方向 ${event.order}`);\n * });\n * ```\n */\nexport interface DataSortedEvent {\n /** 排序的列 */\n field: string;\n /** 排序方向 */\n order: 'asc' | 'desc' | null;\n /** 排序函数 */\n orderFn?: Function;\n}\n\n/** 事件映射表 */\nexport interface IEventMap {\n // 使用枚举作为键\n [WorkSheetEventType.CELL_CLICK]: CellClickEvent;\n [WorkSheetEventType.CELL_VALUE_CHANGED]: CellValueChangedEvent;\n [WorkSheetEventType.SELECTION_CHANGED]: SelectionChangedEvent;\n [WorkSheetEventType.SELECTION_END]: SelectionChangedEvent;\n // [WorkSheetEventType.SHEET_READY]: void;\n // [WorkSheetEventType.SHEET_DESTROYED]: void;\n // [WorkSheetEventType.SHEET_RESIZED]: SheetResizedEvent;\n // [WorkSheetEventType.EDIT_START]: EditStartEvent;\n // [WorkSheetEventType.EDIT_END]: EditEndEvent;\n // [WorkSheetEventType.EDIT_CANCEL]: EditStartEvent;\n // [WorkSheetEventType.DATA_CHANGED]: DataChangedEvent;\n // [WorkSheetEventType.DATA_LOADED]: void;\n // [WorkSheetEventType.DATA_SORTED]: DataSortedEvent;\n // [WorkSheetEventType.DATA_FILTERED]: DataFilteredEvent;\n}\n\n/**\n * 事件管理器接口\n *\n * @description 管理VTableSheet的事件注册、触发和移除。\n * 支持使用WorkSheetEventType枚举或字符串字面量作为事件类型。\n *\n * @example\n * ```typescript\n * // 注册事件监听器\n * sheet.on(WorkSheetEventType.CELL_CLICK, (event) => {\n * console.log(`选中单元格: 行${event.row}, 列${event.col}`);\n * });\n *\n * // 移除事件监听器\n * sheet.off(WorkSheetEventType.CELL_CLICK, handler);\n *\n * // 一次性事件监听器\n * sheet.once(WorkSheetEventType.CELL_VALUE_CHANGED, (event) => {\n * console.log(`单元格值已变更`);\n * });\n * ```\n */\nexport interface IEventManager {\n /** 注册事件监听器 */\n on: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 移除事件监听器 */\n off: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 触发事件 */\n emit: <K extends keyof IEventMap>(event: K, payload: IEventMap[K]) => void;\n\n /** 一次性事件监听器 */\n once: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 移除所有事件监听器 */\n removeAllListeners: () => void;\n}\n"]}