@visactor/vtable-sheet 1.22.6-alpha.3 → 1.22.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/vtable-sheet.js +1 -1
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.d.ts +8 -3
- package/cjs/core/WorkSheet.js +80 -10
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.d.ts +1 -1
- package/cjs/core/table-plugins.js +47 -3
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/formula/formula-paste-processor.d.ts +31 -0
- package/cjs/formula/formula-paste-processor.js +72 -0
- package/cjs/formula/formula-paste-processor.js.map +1 -0
- package/cjs/formula/formula-range-selector.js +3 -3
- package/cjs/formula/formula-range-selector.js.map +1 -1
- package/cjs/formula/formula-reference-adjustor.d.ts +29 -0
- package/cjs/formula/formula-reference-adjustor.js +107 -0
- package/cjs/formula/formula-reference-adjustor.js.map +1 -0
- package/cjs/formula/formula-ui-manager.js +13 -12
- package/cjs/formula/formula-ui-manager.js.map +1 -1
- package/cjs/formula/index.d.ts +4 -0
- package/cjs/formula/index.js +21 -3
- package/cjs/formula/index.js.map +1 -1
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/managers/formula-manager.d.ts +2 -2
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/tools/index.js +1 -2
- package/cjs/ts-types/event.js +2 -1
- package/cjs/ts-types/formula.d.ts +16 -11
- package/cjs/ts-types/formula.js.map +1 -1
- package/cjs/ts-types/sheet.d.ts +2 -2
- package/cjs/ts-types/sheet.js.map +1 -1
- package/dist/vtable-sheet.js +1080 -448
- package/dist/vtable-sheet.min.js +1 -1
- package/es/components/vtable-sheet.js +1 -1
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.d.ts +8 -3
- package/es/core/WorkSheet.js +81 -9
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.d.ts +1 -1
- package/es/core/table-plugins.js +47 -3
- package/es/core/table-plugins.js.map +1 -1
- package/es/formula/formula-paste-processor.d.ts +31 -0
- package/es/formula/formula-paste-processor.js +64 -0
- package/es/formula/formula-paste-processor.js.map +1 -0
- package/es/formula/formula-range-selector.js +3 -3
- package/es/formula/formula-range-selector.js.map +1 -1
- package/es/formula/formula-reference-adjustor.d.ts +29 -0
- package/es/formula/formula-reference-adjustor.js +101 -0
- package/es/formula/formula-reference-adjustor.js.map +1 -0
- package/es/formula/formula-ui-manager.js +13 -12
- package/es/formula/formula-ui-manager.js.map +1 -1
- package/es/formula/index.d.ts +4 -0
- package/es/formula/index.js +4 -0
- package/es/formula/index.js.map +1 -1
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/managers/formula-manager.d.ts +2 -2
- package/es/managers/formula-manager.js.map +1 -1
- package/es/tools/index.js +1 -2
- package/es/ts-types/event.js +2 -1
- package/es/ts-types/formula.d.ts +16 -11
- package/es/ts-types/formula.js.map +1 -1
- package/es/ts-types/sheet.d.ts +2 -2
- package/es/ts-types/sheet.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/formula/formula-range-selector.ts"],"names":[],"mappings":"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","file":"formula-range-selector.js","sourcesContent":["/**\n * 公式范围选择器\n * 实现Excel风格的公式输入体验:用户输入\"=sum(\"后,选择单元格范围自动插入A1引用\n */\n\nimport { FormulaThrottle } from './formula-throttle';\nimport type { FormulaManager } from '../managers/formula-manager';\nimport type { CellRange, CellValueChangedEvent, FormulaCell } from '../ts-types';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\nexport interface FunctionParamPosition {\n start: number;\n end: number;\n}\n\nexport class FormulaRangeSelector {\n private formulaManager: FormulaManager;\n constructor(formulaManager: FormulaManager) {\n this.formulaManager = formulaManager;\n }\n\n /**\n * 将选择范围转换为A1格式\n * @param selections 选择范围数组\n * @param addressFromCoord 坐标转地址函数\n * @returns A1格式字符串\n */\n selectionsToA1Notation(selections: any[], addressFromCoord: (row: number, col: number) => string): string {\n if (!selections || selections.length === 0) {\n return '';\n }\n\n const ranges: string[] = [];\n\n for (const range of selections) {\n const startAddr = addressFromCoord(range.startRow, range.startCol);\n const endAddr = addressFromCoord(range.endRow, range.endCol);\n\n // 如果是单个单元格(start和end相同)\n if (range.startRow === range.endRow && range.startCol === range.endCol) {\n ranges.push(startAddr);\n } else {\n // 如果是范围,使用冒号分隔\n ranges.push(`${startAddr}:${endAddr}`);\n }\n }\n\n return ranges.join(',');\n }\n\n insertA1ReferenceInFunction(formulaInput: HTMLInputElement, a1Notation: string, isCtrlAddSelection: boolean): void {\n if (!this.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n const currentValue = formulaInput.value;\n const cursorPos = this.formulaManager.lastKnownCursorPosInFormulaInput;\n\n // 找到当前光标所处的参数位置\n const argPosition = this.findCurrentArgumentPosition(currentValue, cursorPos);\n\n // 在函数参数位置插入或替换A1引用\n let newValue;\n\n if (argPosition) {\n if (isCtrlAddSelection) {\n // Ctrl模式:追加而非替换\n const currentArg = currentValue.substring(argPosition.start, argPosition.end).trim();\n\n if (currentArg) {\n // 如果当前参数不为空,追加逗号和新引用\n newValue =\n currentValue.slice(0, argPosition.end) +\n (currentValue[argPosition.end - 1] === ',' ? ' ' : ', ') +\n a1Notation +\n currentValue.slice(argPosition.end);\n } else {\n // 如果当前参数为空,直接插入新引用\n newValue = currentValue.slice(0, argPosition.start) + a1Notation + currentValue.slice(argPosition.end);\n }\n } else {\n // 替换模式:完全替换当前参数\n newValue = currentValue.slice(0, argPosition.start) + a1Notation + currentValue.slice(argPosition.end);\n }\n } else {\n // 防止newValue未定义\n newValue = currentValue;\n }\n\n formulaInput.value = newValue;\n // 首先设置公式内容\n this.formulaManager.setCellContent(\n {\n sheet: this.formulaManager.sheet.getActiveSheet().getKey(),\n row: this.formulaManager.sheet.getActiveSheet().editingCell.row,\n col: this.formulaManager.sheet.getActiveSheet().editingCell.col\n },\n newValue\n );\n // 设置光标位置到插入内容之后\n const newCursorPos = isCtrlAddSelection\n ? this.formulaManager.lastKnownCursorPosInFormulaInput + (newValue.length - currentValue.length)\n : argPosition\n ? argPosition.start + a1Notation.length\n : cursorPos;\n\n formulaInput.setSelectionRange(newCursorPos, newCursorPos);\n setTimeout(() => {\n // 确保光标位置在可视区域内\n this.ensureCursorVisible(formulaInput, newCursorPos);\n });\n // 更新函数参数位置\n this.formulaManager.inputIsParamMode.functionParamPosition = {\n start: newCursorPos,\n end: newCursorPos\n };\n\n // 触发输入事件以更新高亮\n const inputEvent = new Event('input', { bubbles: true });\n Object.defineProperty(inputEvent, 'isFormulaInsertion', { value: true });\n formulaInput.dispatchEvent(inputEvent);\n }\n /**\n * 找到光标所在的参数位置\n * @param formula 公式文本\n * @param cursorPos 光标位置\n * @returns 参数的起始和结束位置\n */\n private findCurrentArgumentPosition(formula: string, cursorPos: number): { start: number; end: number } | null {\n // 首先检查光标是否在操作符后面\n if (cursorPos > 1 && cursorPos <= formula.length) {\n const prevChar = formula[cursorPos - 1];\n if (['+', '-', '*', '/', '=', '>', '<', '&', '|', '^'].includes(prevChar)) {\n // 光标在操作符后面,将光标位置视为参数的起始和结束位置\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n }\n\n // 检查公式是否包含括号\n if (!formula.includes('(')) {\n return null;\n }\n\n // 从后向前查找最接近光标的左括号\n let lastOpenParenBeforeCursor = -1;\n let nestLevel = 0;\n let inQuote = false;\n\n // 第一阶段:找到光标所在的函数调用\n for (let i = 0; i < cursorPos; i++) {\n const char = formula[i];\n\n // 处理引号内的内容\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n\n // 如果在引号内,忽略所有特殊字符\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n lastOpenParenBeforeCursor = i;\n } else if (char === ')') {\n nestLevel--;\n }\n }\n\n // 如果没有找到左括号或者光标不在任何括号内\n if (lastOpenParenBeforeCursor === -1 || nestLevel <= 0) {\n // 检查是否在公式开始位置\n if (formula.startsWith('=') && cursorPos === 1) {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n return null;\n }\n\n // 特殊处理:光标恰好在左括号后面\n if (cursorPos === lastOpenParenBeforeCursor + 1) {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n // 特殊处理:光标在逗号后面\n if (cursorPos > 0 && formula[cursorPos - 1] === ',') {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n // 找到当前参数的起始位置\n let argumentStart = lastOpenParenBeforeCursor + 1;\n let argumentEnd = cursorPos;\n\n // 重置状态\n nestLevel = 1; // 从左括号开始,嵌套级别为1\n inQuote = false;\n\n // 从找到的左括号位置向光标方向扫描,找到当前参数的起始位置\n for (let i = argumentStart; i < cursorPos; i++) {\n const char = formula[i];\n\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n } else if (char === ')') {\n nestLevel--;\n if (nestLevel === 0) {\n // 如果回到了函数最外层,则这个右括号后面的内容不再是当前函数的参数\n break;\n }\n } else if (char === ',' && nestLevel === 1) {\n // 如果是当前函数层级的参数分隔符,更新参数开始位置\n argumentStart = i + 1;\n }\n }\n\n // 重置状态,准备从光标位置向后扫描\n nestLevel = 0;\n inQuote = false;\n\n // 重新计算光标位置的嵌套级别\n for (let i = 0; i < cursorPos; i++) {\n if (formula[i] === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (formula[i] === '(') {\n nestLevel++;\n }\n if (formula[i] === ')') {\n nestLevel--;\n }\n }\n\n // 从光标位置向后查找参数结束位置\n argumentEnd = formula.length;\n for (let i = cursorPos; i < formula.length; i++) {\n const char = formula[i];\n\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n } else if (char === ')') {\n nestLevel--;\n // 如果回到了当前函数的右括号\n if (nestLevel === 0) {\n argumentEnd = i;\n break;\n }\n } else if (char === ',' && nestLevel === 1) {\n // 找到下一个同级参数的分隔符\n argumentEnd = i;\n break;\n }\n }\n\n // 处理空参数的情况\n const paramContentBefore = formula.substring(argumentStart, cursorPos).trim();\n const paramContentAfter = formula.substring(cursorPos, argumentEnd).trim();\n\n if (paramContentBefore === '' && cursorPos === argumentStart) {\n // 光标在参数起始位置,且参数为空\n return {\n start: argumentStart,\n end: argumentStart\n };\n }\n\n if (paramContentAfter === '' && cursorPos < argumentEnd) {\n // 光标后面到结束位置都是空白\n argumentEnd = cursorPos;\n }\n\n return {\n start: argumentStart,\n end: argumentEnd\n };\n }\n /**\n * 处理单元格选择变化\n * @param selections 当前选择范围\n * @param formulaInput 公式输入框\n * @param addressFromCoord 坐标转地址函数\n */\n private handleSelectionChanged(\n selections: CellRange[],\n formulaInput: HTMLInputElement,\n isCtrlAddSelection: boolean,\n addressFromCoord: (row: number, col: number) => string\n ): void {\n if (!this.formulaManager.inputIsParamMode.inParamMode || !selections || selections.length === 0) {\n return;\n }\n\n const a1Notation = this.selectionsToA1Notation(selections, addressFromCoord);\n if (a1Notation) {\n this.insertA1ReferenceInFunction(formulaInput, a1Notation, isCtrlAddSelection);\n }\n }\n\n /**\n * 处理单元格值变更事件\n * @param event 事件\n */\n handleCellValueChanged(event: CellValueChangedEvent): void {\n const activeWorkSheet = this.formulaManager.sheet.getActiveSheet();\n const formulaManager = this.formulaManager.sheet.formulaManager;\n\n if (!activeWorkSheet || this.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n try {\n // 检查新输入的值是否为公式\n const newValue = event.newValue;\n if (typeof newValue === 'string' && newValue.startsWith('=') && newValue.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(event.row, event.col);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(newValue)) {\n console.warn('Circular reference detected:', newValue, 'contains', currentCellAddress);\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, '#CYCLE!', true, false);\n this.formulaManager.formulaWorkingOnCell = null;\n return;\n }\n\n // 首先设置公式内容\n formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n },\n newValue\n );\n\n // 获取计算结果\n const result = formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n // // 检查当前单元格是否正在编辑(是否在公式栏中编辑)\n // const formulaInput = this.formulaManager.inputingElement;\n // const isEditing = document.activeElement === formulaInput;\n\n // 更新单元格显示 - 如果正在编辑则显示公式,否则显示计算结果\n // activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, isEditing ? newValue : result.value);\n // 不触发事件,避免无限循环 - 我们将在updateDependentCellsCascade中处理所有依赖\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, result.value, false, false);\n this.formulaManager.formulaWorkingOnCell = null;\n } catch (error) {\n console.warn('Formula processing error:', error);\n // 显示错误状态\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, '#ERROR!', true, false);\n this.formulaManager.formulaWorkingOnCell = null;\n }\n } else {\n // 非公式值,同步到FormulaEngine (MIT兼容)\n formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n },\n newValue\n );\n\n // 检查是否需要级联更新依赖单元格\n const needImmediateUpdate = this.hasFormulaDependents({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n\n if (needImmediateUpdate) {\n // 使用FormulaEngine的依赖管理进行级联更新 (MIT兼容)\n this.updateDependentCellsCascade(activeWorkSheet, formulaManager, {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n }\n }\n\n // 使用FormulaThrottle来优化公式重新计算\n const formulaThrottle = FormulaThrottle.getInstance();\n\n // 判断是否需要立即更新(检查是否有依赖该单元格的公式)\n const needImmediateUpdate = this.hasFormulaDependents({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n\n if (needImmediateUpdate) {\n // 使用FormulaEngine的依赖管理进行级联更新 (MIT兼容)\n this.updateDependentCellsCascade(activeWorkSheet, formulaManager, {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n // 立即执行完整重新计算\n formulaThrottle.immediateRebuildAndRecalculate(formulaManager);\n } else {\n // 使用节流方式进行公式计算(用于没有依赖的情况)\n formulaThrottle.throttledRebuildAndRecalculate(formulaManager);\n }\n\n // // 如果当前编辑的单元格就是选中的单元格,更新 fx 输入框\n // const selection = this.activeWorkSheet.getSelection();\n // if (selection && selection.startRow === event.row && selection.startCol === event.col) {\n // this.updateFormulaBar();\n // }\n } catch (error) {\n console.error('Error in handleCellValueChanged:', error);\n }\n }\n\n /**\n * 处理范围选择模式下的单元格选中事件\n */\n handleSelectionChangedForRangeMode(event: any): void {\n const activeWorkSheet = this.formulaManager.sheet.getActiveSheet();\n const formulaWorkingOnCell = this.formulaManager.formulaWorkingOnCell;\n const formulaManager = this.formulaManager.sheet.formulaManager;\n if (!activeWorkSheet || !formulaWorkingOnCell) {\n return;\n }\n\n // const formulaInput = this.formulaInput;\n const formulaInput = this.formulaManager.inputingElement;\n // if (!formulaInput || this.formulaManager.isUpdatingFromFormula) {\n // return;\n // }\n // TODO 尝试全部去掉isUpdatingFromFormula的判断和赋值\n if (!formulaInput) {\n return;\n }\n\n // 不依赖 event.type 字符串,selection-end 已在上层绑定,这里直接处理\n\n this.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (!this.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n if (document.activeElement !== formulaInput) {\n formulaInput.focus();\n }\n\n // 获取所有选择范围(支持Ctrl/Cmd多选)\n const selections = activeWorkSheet.getMultipleSelections();\n const todoSelection = selections[selections.length - 1];\n let isCtrlAddSelection = false;\n if (selections?.length > formulaManager.lastSelectionRangesOfHandling?.length) {\n isCtrlAddSelection = true;\n }\n formulaManager.lastSelectionRangesOfHandling = selections;\n if (!selections || selections.length === 0) {\n return;\n }\n\n // 排除当前编辑单元格,避免形成自引用导致 #CYCLE!\n const editCell = formulaManager.formulaWorkingOnCell;\n // const safeSelections = selections\n // .map(selection => this.excludeEditCellFromSelection(selection, editCell?.row || 0, editCell?.col || 0))\n // .filter(selection => selection.startRow >= 0 && selection.startCol >= 0); // 过滤掉无效选择\n const safeSelections = this.formulaManager.sheet.excludeEditCellFromSelection(\n todoSelection,\n editCell?.row || 0,\n editCell?.col || 0\n );\n\n this.handleSelectionChanged([safeSelections], formulaInput, isCtrlAddSelection, (row: number, col: number) =>\n activeWorkSheet!.addressFromCoord(row, col)\n );\n\n // 写入后不再刷新公式栏,以免覆盖刚插入的引用\n }\n\n /**\n * 检查单元格是否有公式依赖\n * @param cell 单元格\n * @returns 是否有公式依赖\n */\n private hasFormulaDependents(cell: FormulaCell): boolean {\n try {\n const dependents = this.formulaManager.getCellDependents(cell);\n return dependents.length > 0;\n } catch (error) {\n console.warn('Error checking formula dependents:', error);\n return false;\n }\n }\n\n /**\n * 使用FormulaEngine的依赖管理进行级联更新 (MIT兼容)\n * @param activeWorkSheet 当前工作表\n * @param formulaManager 公式管理器\n * @param changedCell 发生变化的单元格\n */\n private updateDependentCellsCascade(\n activeWorkSheet: any,\n formulaManager: FormulaManager,\n changedCell: FormulaCell\n ): void {\n try {\n // 获取所有依赖该单元格的单元格(包括间接依赖)\n const allDependents = this.getAllDependentsRecursive(formulaManager, changedCell);\n\n if (allDependents.length === 0) {\n return;\n }\n\n // 按依赖顺序排序(确保依赖项先被更新)\n const sortedDependents = this.sortCellsByDependencyOrder(formulaManager, allDependents);\n\n // 批量更新所有依赖单元格\n for (const dependent of sortedDependents) {\n const result = formulaManager.getCellValue(dependent);\n if (result && activeWorkSheet) {\n // 更新单元格显示值,但不触发事件(避免无限循环)\n activeWorkSheet.tableInstance?.changeCellValue(\n dependent.col,\n dependent.row,\n result.value,\n false, // workOnEditableCell: allow editing any cell\n false // triggerEvent: don't fire events to avoid infinite loops\n );\n }\n }\n } catch (error) {\n console.error('Error in updateDependentCellsCascade:', error);\n }\n }\n\n /**\n * 递归获取所有依赖单元格(包括间接依赖)\n * @param formulaManager 公式管理器\n * @param cell 起始单元格\n * @param visited 已访问的单元格(防止循环)\n * @returns 所有依赖单元格\n */\n private getAllDependentsRecursive(\n formulaManager: FormulaManager,\n cell: FormulaCell,\n visited: Set<string> = new Set()\n ): FormulaCell[] {\n const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;\n\n // 防止循环依赖\n if (visited.has(cellKey)) {\n return [];\n }\n visited.add(cellKey);\n\n const directDependents = formulaManager.getCellDependents(cell);\n let allDependents: FormulaCell[] = [...directDependents];\n\n // 递归获取间接依赖\n for (const dependent of directDependents) {\n const indirectDependents = this.getAllDependentsRecursive(formulaManager, dependent, visited);\n allDependents = allDependents.concat(indirectDependents);\n }\n\n return allDependents;\n }\n\n /**\n * 按依赖顺序对单元格进行排序\n * @param formulaManager 公式管理器\n * @param cells 要排序的单元格\n * @returns 排序后的单元格\n */\n private sortCellsByDependencyOrder(formulaManager: FormulaManager, cells: FormulaCell[]): FormulaCell[] {\n // 创建一个依赖图\n const dependencyGraph = new Map<string, Set<string>>();\n\n // 为每个单元格构建依赖关系\n for (const cell of cells) {\n const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;\n const precedents = formulaManager.getCellPrecedents(cell);\n\n const dependencies = new Set<string>();\n for (const precedent of precedents) {\n const precedentKey = `${precedent.sheet}!${precedent.row},${precedent.col}`;\n dependencies.add(precedentKey);\n }\n\n dependencyGraph.set(cellKey, dependencies);\n }\n\n // 使用拓扑排序确保依赖项先被处理\n const sorted: FormulaCell[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (cell: FormulaCell) => {\n const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;\n\n if (visited.has(cellKey)) {\n return;\n }\n\n if (visiting.has(cellKey)) {\n // 检测到循环依赖,跳过\n console.warn('Circular dependency detected:', cellKey);\n return;\n }\n\n visiting.add(cellKey);\n\n // 先访问依赖项\n const dependencies = dependencyGraph.get(cellKey) || new Set();\n for (const depKey of Array.from(dependencies)) {\n const depCell = cells.find(c => `${c.sheet}!${c.row},${c.col}` === depKey);\n if (depCell) {\n visit(depCell);\n }\n }\n\n visiting.delete(cellKey);\n visited.add(cellKey);\n sorted.push(cell);\n };\n\n // 对所有单元格进行排序\n for (const cell of cells) {\n if (!visited.has(`${cell.sheet}!${cell.row},${cell.col}`)) {\n visit(cell);\n }\n }\n\n return sorted;\n }\n\n /**\n * 确保光标位置在输入框的可视区域内\n * @param input 输入框元素\n * @param cursorPos 光标位置\n */\n private ensureCursorVisible(input: HTMLInputElement, cursorPos: number): void {\n // 创建一个临时元素来计算光标位置\n const tempSpan = document.createElement('span');\n const inputStyle = window.getComputedStyle(input);\n\n // 复制输入框的样式到临时元素\n tempSpan.style.font = inputStyle.font;\n tempSpan.style.letterSpacing = inputStyle.letterSpacing;\n tempSpan.style.position = 'absolute';\n tempSpan.style.visibility = 'hidden';\n tempSpan.style.whiteSpace = 'pre';\n\n // 设置文本内容为光标位置前的文本\n tempSpan.textContent = input.value.substring(0, cursorPos);\n document.body.appendChild(tempSpan);\n\n // 计算光标位置\n const cursorOffset = tempSpan.offsetWidth;\n document.body.removeChild(tempSpan);\n\n // 计算可视区域\n const inputScrollLeft = input.scrollLeft;\n const inputWidth = input.clientWidth;\n const paddingLeft = parseFloat(inputStyle.paddingLeft);\n const paddingRight = parseFloat(inputStyle.paddingRight);\n const visibleWidth = inputWidth - paddingLeft - paddingRight;\n\n // 调整滚动位置确保光标可见\n if (cursorOffset < inputScrollLeft + paddingLeft) {\n // 光标在可视区域左侧\n input.scrollLeft = Math.max(0, cursorOffset - paddingLeft);\n } else if (cursorOffset > inputScrollLeft + visibleWidth) {\n // 光标在可视区域右侧\n input.scrollLeft = cursorOffset - visibleWidth + paddingRight;\n }\n }\n\n release(): void {\n //do nothing\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/formula/formula-range-selector.ts"],"names":[],"mappings":"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","file":"formula-range-selector.js","sourcesContent":["/**\n * 公式范围选择器\n * 实现Excel风格的公式输入体验:用户输入\"=sum(\"后,选择单元格范围自动插入A1引用\n */\n\nimport { FormulaThrottle } from './formula-throttle';\nimport type { FormulaManager } from '../managers/formula-manager';\nimport type { CellRange, CellValueChangedEvent, FormulaCell } from '../ts-types';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\nexport interface FunctionParamPosition {\n start: number;\n end: number;\n}\n\nexport class FormulaRangeSelector {\n private formulaManager: FormulaManager;\n constructor(formulaManager: FormulaManager) {\n this.formulaManager = formulaManager;\n }\n\n /**\n * 将选择范围转换为A1格式\n * @param selections 选择范围数组\n * @param addressFromCoord 坐标转地址函数\n * @returns A1格式字符串\n */\n selectionsToA1Notation(selections: any[], addressFromCoord: (row: number, col: number) => string): string {\n if (!selections || selections.length === 0) {\n return '';\n }\n\n const ranges: string[] = [];\n\n for (const range of selections) {\n const startAddr = addressFromCoord(range.startCol, range.startRow);\n const endAddr = addressFromCoord(range.endCol, range.endRow);\n\n // 如果是单个单元格(start和end相同)\n if (range.startRow === range.endRow && range.startCol === range.endCol) {\n ranges.push(startAddr);\n } else {\n // 如果是范围,使用冒号分隔\n ranges.push(`${startAddr}:${endAddr}`);\n }\n }\n\n return ranges.join(',');\n }\n\n insertA1ReferenceInFunction(formulaInput: HTMLInputElement, a1Notation: string, isCtrlAddSelection: boolean): void {\n if (!this.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n const currentValue = formulaInput.value;\n const cursorPos = this.formulaManager.lastKnownCursorPosInFormulaInput;\n\n // 找到当前光标所处的参数位置\n const argPosition = this.findCurrentArgumentPosition(currentValue, cursorPos);\n\n // 在函数参数位置插入或替换A1引用\n let newValue;\n\n if (argPosition) {\n if (isCtrlAddSelection) {\n // Ctrl模式:追加而非替换\n const currentArg = currentValue.substring(argPosition.start, argPosition.end).trim();\n\n if (currentArg) {\n // 如果当前参数不为空,追加逗号和新引用\n newValue =\n currentValue.slice(0, argPosition.end) +\n (currentValue[argPosition.end - 1] === ',' ? ' ' : ', ') +\n a1Notation +\n currentValue.slice(argPosition.end);\n } else {\n // 如果当前参数为空,直接插入新引用\n newValue = currentValue.slice(0, argPosition.start) + a1Notation + currentValue.slice(argPosition.end);\n }\n } else {\n // 替换模式:完全替换当前参数\n newValue = currentValue.slice(0, argPosition.start) + a1Notation + currentValue.slice(argPosition.end);\n }\n } else {\n // 防止newValue未定义\n newValue = currentValue;\n }\n\n formulaInput.value = newValue;\n // 首先设置公式内容\n this.formulaManager.setCellContent(\n {\n sheet: this.formulaManager.sheet.getActiveSheet().getKey(),\n row: this.formulaManager.sheet.getActiveSheet().editingCell.row,\n col: this.formulaManager.sheet.getActiveSheet().editingCell.col\n },\n newValue\n );\n // 设置光标位置到插入内容之后\n const newCursorPos = isCtrlAddSelection\n ? this.formulaManager.lastKnownCursorPosInFormulaInput + (newValue.length - currentValue.length)\n : argPosition\n ? argPosition.start + a1Notation.length\n : cursorPos;\n\n formulaInput.setSelectionRange(newCursorPos, newCursorPos);\n setTimeout(() => {\n // 确保光标位置在可视区域内\n this.ensureCursorVisible(formulaInput, newCursorPos);\n });\n // 更新函数参数位置\n this.formulaManager.inputIsParamMode.functionParamPosition = {\n start: newCursorPos,\n end: newCursorPos\n };\n\n // 触发输入事件以更新高亮\n const inputEvent = new Event('input', { bubbles: true });\n Object.defineProperty(inputEvent, 'isFormulaInsertion', { value: true });\n formulaInput.dispatchEvent(inputEvent);\n }\n /**\n * 找到光标所在的参数位置\n * @param formula 公式文本\n * @param cursorPos 光标位置\n * @returns 参数的起始和结束位置\n */\n private findCurrentArgumentPosition(formula: string, cursorPos: number): { start: number; end: number } | null {\n // 首先检查光标是否在操作符后面\n if (cursorPos > 1 && cursorPos <= formula.length) {\n const prevChar = formula[cursorPos - 1];\n if (['+', '-', '*', '/', '=', '>', '<', '&', '|', '^'].includes(prevChar)) {\n // 光标在操作符后面,将光标位置视为参数的起始和结束位置\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n }\n\n // 检查公式是否包含括号\n if (!formula.includes('(')) {\n return null;\n }\n\n // 从后向前查找最接近光标的左括号\n let lastOpenParenBeforeCursor = -1;\n let nestLevel = 0;\n let inQuote = false;\n\n // 第一阶段:找到光标所在的函数调用\n for (let i = 0; i < cursorPos; i++) {\n const char = formula[i];\n\n // 处理引号内的内容\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n\n // 如果在引号内,忽略所有特殊字符\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n lastOpenParenBeforeCursor = i;\n } else if (char === ')') {\n nestLevel--;\n }\n }\n\n // 如果没有找到左括号或者光标不在任何括号内\n if (lastOpenParenBeforeCursor === -1 || nestLevel <= 0) {\n // 检查是否在公式开始位置\n if (formula.startsWith('=') && cursorPos === 1) {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n return null;\n }\n\n // 特殊处理:光标恰好在左括号后面\n if (cursorPos === lastOpenParenBeforeCursor + 1) {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n // 特殊处理:光标在逗号后面\n if (cursorPos > 0 && formula[cursorPos - 1] === ',') {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n // 找到当前参数的起始位置\n let argumentStart = lastOpenParenBeforeCursor + 1;\n let argumentEnd = cursorPos;\n\n // 重置状态\n nestLevel = 1; // 从左括号开始,嵌套级别为1\n inQuote = false;\n\n // 从找到的左括号位置向光标方向扫描,找到当前参数的起始位置\n for (let i = argumentStart; i < cursorPos; i++) {\n const char = formula[i];\n\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n } else if (char === ')') {\n nestLevel--;\n if (nestLevel === 0) {\n // 如果回到了函数最外层,则这个右括号后面的内容不再是当前函数的参数\n break;\n }\n } else if (char === ',' && nestLevel === 1) {\n // 如果是当前函数层级的参数分隔符,更新参数开始位置\n argumentStart = i + 1;\n }\n }\n\n // 重置状态,准备从光标位置向后扫描\n nestLevel = 0;\n inQuote = false;\n\n // 重新计算光标位置的嵌套级别\n for (let i = 0; i < cursorPos; i++) {\n if (formula[i] === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (formula[i] === '(') {\n nestLevel++;\n }\n if (formula[i] === ')') {\n nestLevel--;\n }\n }\n\n // 从光标位置向后查找参数结束位置\n argumentEnd = formula.length;\n for (let i = cursorPos; i < formula.length; i++) {\n const char = formula[i];\n\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n } else if (char === ')') {\n nestLevel--;\n // 如果回到了当前函数的右括号\n if (nestLevel === 0) {\n argumentEnd = i;\n break;\n }\n } else if (char === ',' && nestLevel === 1) {\n // 找到下一个同级参数的分隔符\n argumentEnd = i;\n break;\n }\n }\n\n // 处理空参数的情况\n const paramContentBefore = formula.substring(argumentStart, cursorPos).trim();\n const paramContentAfter = formula.substring(cursorPos, argumentEnd).trim();\n\n if (paramContentBefore === '' && cursorPos === argumentStart) {\n // 光标在参数起始位置,且参数为空\n return {\n start: argumentStart,\n end: argumentStart\n };\n }\n\n if (paramContentAfter === '' && cursorPos < argumentEnd) {\n // 光标后面到结束位置都是空白\n argumentEnd = cursorPos;\n }\n\n return {\n start: argumentStart,\n end: argumentEnd\n };\n }\n /**\n * 处理单元格选择变化\n * @param selections 当前选择范围\n * @param formulaInput 公式输入框\n * @param addressFromCoord 坐标转地址函数\n */\n private handleSelectionChanged(\n selections: CellRange[],\n formulaInput: HTMLInputElement,\n isCtrlAddSelection: boolean,\n addressFromCoord: (row: number, col: number) => string\n ): void {\n if (!this.formulaManager.inputIsParamMode.inParamMode || !selections || selections.length === 0) {\n return;\n }\n\n const a1Notation = this.selectionsToA1Notation(selections, addressFromCoord);\n if (a1Notation) {\n this.insertA1ReferenceInFunction(formulaInput, a1Notation, isCtrlAddSelection);\n }\n }\n\n /**\n * 处理单元格值变更事件\n * @param event 事件\n */\n handleCellValueChanged(event: CellValueChangedEvent): void {\n const activeWorkSheet = this.formulaManager.sheet.getActiveSheet();\n const formulaManager = this.formulaManager.sheet.formulaManager;\n\n if (!activeWorkSheet || this.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n try {\n // 检查新输入的值是否为公式\n const newValue = event.newValue;\n if (typeof newValue === 'string' && newValue.startsWith('=') && newValue.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(event.col, event.row);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(newValue)) {\n console.warn('Circular reference detected:', newValue, 'contains', currentCellAddress);\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, '#CYCLE!', true, false);\n this.formulaManager.formulaWorkingOnCell = null;\n return;\n }\n\n // 首先设置公式内容\n formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n },\n newValue\n );\n\n // 获取计算结果\n const result = formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n // // 检查当前单元格是否正在编辑(是否在公式栏中编辑)\n // const formulaInput = this.formulaManager.inputingElement;\n // const isEditing = document.activeElement === formulaInput;\n\n // 更新单元格显示 - 如果正在编辑则显示公式,否则显示计算结果\n // activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, isEditing ? newValue : result.value);\n // 不触发事件,避免无限循环 - 我们将在updateDependentCellsCascade中处理所有依赖\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, result.value, false, false);\n this.formulaManager.formulaWorkingOnCell = null;\n } catch (error) {\n console.warn('Formula processing error:', error);\n // 显示错误状态\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, '#ERROR!', true, false);\n this.formulaManager.formulaWorkingOnCell = null;\n }\n } else {\n // 非公式值,同步到FormulaEngine (MIT兼容)\n formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n },\n newValue\n );\n\n // 检查是否需要级联更新依赖单元格\n const needImmediateUpdate = this.hasFormulaDependents({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n\n if (needImmediateUpdate) {\n // 使用FormulaEngine的依赖管理进行级联更新 (MIT兼容)\n this.updateDependentCellsCascade(activeWorkSheet, formulaManager, {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n }\n }\n\n // 使用FormulaThrottle来优化公式重新计算\n const formulaThrottle = FormulaThrottle.getInstance();\n\n // 判断是否需要立即更新(检查是否有依赖该单元格的公式)\n const needImmediateUpdate = this.hasFormulaDependents({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n\n if (needImmediateUpdate) {\n // 使用FormulaEngine的依赖管理进行级联更新 (MIT兼容)\n this.updateDependentCellsCascade(activeWorkSheet, formulaManager, {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n // 立即执行完整重新计算\n formulaThrottle.immediateRebuildAndRecalculate(formulaManager);\n } else {\n // 使用节流方式进行公式计算(用于没有依赖的情况)\n formulaThrottle.throttledRebuildAndRecalculate(formulaManager);\n }\n\n // // 如果当前编辑的单元格就是选中的单元格,更新 fx 输入框\n // const selection = this.activeWorkSheet.getSelection();\n // if (selection && selection.startRow === event.row && selection.startCol === event.col) {\n // this.updateFormulaBar();\n // }\n } catch (error) {\n console.error('Error in handleCellValueChanged:', error);\n }\n }\n\n /**\n * 处理范围选择模式下的单元格选中事件\n */\n handleSelectionChangedForRangeMode(event: any): void {\n const activeWorkSheet = this.formulaManager.sheet.getActiveSheet();\n const formulaWorkingOnCell = this.formulaManager.formulaWorkingOnCell;\n const formulaManager = this.formulaManager.sheet.formulaManager;\n if (!activeWorkSheet || !formulaWorkingOnCell) {\n return;\n }\n\n // const formulaInput = this.formulaInput;\n const formulaInput = this.formulaManager.inputingElement;\n // if (!formulaInput || this.formulaManager.isUpdatingFromFormula) {\n // return;\n // }\n // TODO 尝试全部去掉isUpdatingFromFormula的判断和赋值\n if (!formulaInput) {\n return;\n }\n\n // 不依赖 event.type 字符串,selection-end 已在上层绑定,这里直接处理\n\n this.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (!this.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n if (document.activeElement !== formulaInput) {\n formulaInput.focus();\n }\n\n // 获取所有选择范围(支持Ctrl/Cmd多选)\n const selections = activeWorkSheet.getMultipleSelections();\n const todoSelection = selections[selections.length - 1];\n let isCtrlAddSelection = false;\n if (selections?.length > formulaManager.lastSelectionRangesOfHandling?.length) {\n isCtrlAddSelection = true;\n }\n formulaManager.lastSelectionRangesOfHandling = selections;\n if (!selections || selections.length === 0) {\n return;\n }\n\n // 排除当前编辑单元格,避免形成自引用导致 #CYCLE!\n const editCell = formulaManager.formulaWorkingOnCell;\n // const safeSelections = selections\n // .map(selection => this.excludeEditCellFromSelection(selection, editCell?.row || 0, editCell?.col || 0))\n // .filter(selection => selection.startRow >= 0 && selection.startCol >= 0); // 过滤掉无效选择\n const safeSelections = this.formulaManager.sheet.excludeEditCellFromSelection(\n todoSelection,\n editCell?.row || 0,\n editCell?.col || 0\n );\n\n this.handleSelectionChanged([safeSelections], formulaInput, isCtrlAddSelection, (col: number, row: number) =>\n activeWorkSheet!.addressFromCoord(col, row)\n );\n\n // 写入后不再刷新公式栏,以免覆盖刚插入的引用\n }\n\n /**\n * 检查单元格是否有公式依赖\n * @param cell 单元格\n * @returns 是否有公式依赖\n */\n private hasFormulaDependents(cell: FormulaCell): boolean {\n try {\n const dependents = this.formulaManager.getCellDependents(cell);\n return dependents.length > 0;\n } catch (error) {\n console.warn('Error checking formula dependents:', error);\n return false;\n }\n }\n\n /**\n * 使用FormulaEngine的依赖管理进行级联更新 (MIT兼容)\n * @param activeWorkSheet 当前工作表\n * @param formulaManager 公式管理器\n * @param changedCell 发生变化的单元格\n */\n private updateDependentCellsCascade(\n activeWorkSheet: any,\n formulaManager: FormulaManager,\n changedCell: FormulaCell\n ): void {\n try {\n // 获取所有依赖该单元格的单元格(包括间接依赖)\n const allDependents = this.getAllDependentsRecursive(formulaManager, changedCell);\n\n if (allDependents.length === 0) {\n return;\n }\n\n // 按依赖顺序排序(确保依赖项先被更新)\n const sortedDependents = this.sortCellsByDependencyOrder(formulaManager, allDependents);\n\n // 批量更新所有依赖单元格\n for (const dependent of sortedDependents) {\n const result = formulaManager.getCellValue(dependent);\n if (result && activeWorkSheet) {\n // 更新单元格显示值,但不触发事件(避免无限循环)\n activeWorkSheet.tableInstance?.changeCellValue(\n dependent.col,\n dependent.row,\n result.value,\n false, // workOnEditableCell: allow editing any cell\n false // triggerEvent: don't fire events to avoid infinite loops\n );\n }\n }\n } catch (error) {\n console.error('Error in updateDependentCellsCascade:', error);\n }\n }\n\n /**\n * 递归获取所有依赖单元格(包括间接依赖)\n * @param formulaManager 公式管理器\n * @param cell 起始单元格\n * @param visited 已访问的单元格(防止循环)\n * @returns 所有依赖单元格\n */\n private getAllDependentsRecursive(\n formulaManager: FormulaManager,\n cell: FormulaCell,\n visited: Set<string> = new Set()\n ): FormulaCell[] {\n const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;\n\n // 防止循环依赖\n if (visited.has(cellKey)) {\n return [];\n }\n visited.add(cellKey);\n\n const directDependents = formulaManager.getCellDependents(cell);\n let allDependents: FormulaCell[] = [...directDependents];\n\n // 递归获取间接依赖\n for (const dependent of directDependents) {\n const indirectDependents = this.getAllDependentsRecursive(formulaManager, dependent, visited);\n allDependents = allDependents.concat(indirectDependents);\n }\n\n return allDependents;\n }\n\n /**\n * 按依赖顺序对单元格进行排序\n * @param formulaManager 公式管理器\n * @param cells 要排序的单元格\n * @returns 排序后的单元格\n */\n private sortCellsByDependencyOrder(formulaManager: FormulaManager, cells: FormulaCell[]): FormulaCell[] {\n // 创建一个依赖图\n const dependencyGraph = new Map<string, Set<string>>();\n\n // 为每个单元格构建依赖关系\n for (const cell of cells) {\n const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;\n const precedents = formulaManager.getCellPrecedents(cell);\n\n const dependencies = new Set<string>();\n for (const precedent of precedents) {\n const precedentKey = `${precedent.sheet}!${precedent.row},${precedent.col}`;\n dependencies.add(precedentKey);\n }\n\n dependencyGraph.set(cellKey, dependencies);\n }\n\n // 使用拓扑排序确保依赖项先被处理\n const sorted: FormulaCell[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (cell: FormulaCell) => {\n const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;\n\n if (visited.has(cellKey)) {\n return;\n }\n\n if (visiting.has(cellKey)) {\n // 检测到循环依赖,跳过\n console.warn('Circular dependency detected:', cellKey);\n return;\n }\n\n visiting.add(cellKey);\n\n // 先访问依赖项\n const dependencies = dependencyGraph.get(cellKey) || new Set();\n for (const depKey of Array.from(dependencies)) {\n const depCell = cells.find(c => `${c.sheet}!${c.row},${c.col}` === depKey);\n if (depCell) {\n visit(depCell);\n }\n }\n\n visiting.delete(cellKey);\n visited.add(cellKey);\n sorted.push(cell);\n };\n\n // 对所有单元格进行排序\n for (const cell of cells) {\n if (!visited.has(`${cell.sheet}!${cell.row},${cell.col}`)) {\n visit(cell);\n }\n }\n\n return sorted;\n }\n\n /**\n * 确保光标位置在输入框的可视区域内\n * @param input 输入框元素\n * @param cursorPos 光标位置\n */\n private ensureCursorVisible(input: HTMLInputElement, cursorPos: number): void {\n // 创建一个临时元素来计算光标位置\n const tempSpan = document.createElement('span');\n const inputStyle = window.getComputedStyle(input);\n\n // 复制输入框的样式到临时元素\n tempSpan.style.font = inputStyle.font;\n tempSpan.style.letterSpacing = inputStyle.letterSpacing;\n tempSpan.style.position = 'absolute';\n tempSpan.style.visibility = 'hidden';\n tempSpan.style.whiteSpace = 'pre';\n\n // 设置文本内容为光标位置前的文本\n tempSpan.textContent = input.value.substring(0, cursorPos);\n document.body.appendChild(tempSpan);\n\n // 计算光标位置\n const cursorOffset = tempSpan.offsetWidth;\n document.body.removeChild(tempSpan);\n\n // 计算可视区域\n const inputScrollLeft = input.scrollLeft;\n const inputWidth = input.clientWidth;\n const paddingLeft = parseFloat(inputStyle.paddingLeft);\n const paddingRight = parseFloat(inputStyle.paddingRight);\n const visibleWidth = inputWidth - paddingLeft - paddingRight;\n\n // 调整滚动位置确保光标可见\n if (cursorOffset < inputScrollLeft + paddingLeft) {\n // 光标在可视区域左侧\n input.scrollLeft = Math.max(0, cursorOffset - paddingLeft);\n } else if (cursorOffset > inputScrollLeft + visibleWidth) {\n // 光标在可视区域右侧\n input.scrollLeft = cursorOffset - visibleWidth + paddingRight;\n }\n }\n\n release(): void {\n //do nothing\n }\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface CellReference {
|
|
2
|
+
type: 'absolute' | 'relative' | 'mixed_row' | 'mixed_col';
|
|
3
|
+
col: number;
|
|
4
|
+
row: number;
|
|
5
|
+
originalColRef: string;
|
|
6
|
+
originalRowRef: string;
|
|
7
|
+
fullReference: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ReferenceOffset {
|
|
10
|
+
colOffset: number;
|
|
11
|
+
rowOffset: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class FormulaReferenceAdjustor {
|
|
14
|
+
private static readonly CELL_REF_REGEX;
|
|
15
|
+
private static readonly SINGLE_CELL_REGEX;
|
|
16
|
+
static parseCellReference(ref: string): CellReference | null;
|
|
17
|
+
static columnToNumber(col: string): number;
|
|
18
|
+
static numberToColumn(num: number): string;
|
|
19
|
+
static adjustCellReference(ref: CellReference, offset: ReferenceOffset): string;
|
|
20
|
+
static adjustFormulaReferences(formula: string | number, colOffset: number, rowOffset: number): string | number;
|
|
21
|
+
static isFormula(value: any): boolean;
|
|
22
|
+
static extractReferences(formula: string): CellReference[];
|
|
23
|
+
static getFormulaReferenceBounds(formula: string): {
|
|
24
|
+
minCol: number;
|
|
25
|
+
maxCol: number;
|
|
26
|
+
minRow: number;
|
|
27
|
+
maxRow: number;
|
|
28
|
+
} | null;
|
|
29
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.FormulaReferenceAdjustor = void 0;
|
|
6
|
+
|
|
7
|
+
class FormulaReferenceAdjustor {
|
|
8
|
+
static parseCellReference(ref) {
|
|
9
|
+
const match = ref.match(this.SINGLE_CELL_REGEX);
|
|
10
|
+
if (!match) return null;
|
|
11
|
+
const [, colAbsolute, colStr, rowAbsolute, rowStr] = match;
|
|
12
|
+
let type;
|
|
13
|
+
return type = colAbsolute && rowAbsolute ? "absolute" : colAbsolute && !rowAbsolute ? "mixed_col" : !colAbsolute && rowAbsolute ? "mixed_row" : "relative",
|
|
14
|
+
{
|
|
15
|
+
type: type,
|
|
16
|
+
col: this.columnToNumber(colStr),
|
|
17
|
+
row: parseInt(rowStr, 10) - 1,
|
|
18
|
+
originalColRef: colAbsolute + colStr,
|
|
19
|
+
originalRowRef: rowAbsolute + rowStr,
|
|
20
|
+
fullReference: ref
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
static columnToNumber(col) {
|
|
24
|
+
let result = 0;
|
|
25
|
+
for (let i = 0; i < col.length; i++) result = 26 * result + (col.charCodeAt(i) - "A".charCodeAt(0) + 1);
|
|
26
|
+
return result - 1;
|
|
27
|
+
}
|
|
28
|
+
static numberToColumn(num) {
|
|
29
|
+
let result = "", n = num + 1;
|
|
30
|
+
for (;n > 0; ) n--, result = String.fromCharCode("A".charCodeAt(0) + n % 26) + result,
|
|
31
|
+
n = Math.floor(n / 26);
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
static adjustCellReference(ref, offset) {
|
|
35
|
+
let newCol = ref.col, newRow = ref.row;
|
|
36
|
+
switch (ref.type) {
|
|
37
|
+
case "relative":
|
|
38
|
+
newCol += offset.colOffset, newRow += offset.rowOffset;
|
|
39
|
+
break;
|
|
40
|
+
|
|
41
|
+
case "mixed_row":
|
|
42
|
+
newCol += offset.colOffset, newRow = ref.row;
|
|
43
|
+
break;
|
|
44
|
+
|
|
45
|
+
case "mixed_col":
|
|
46
|
+
newCol = ref.col, newRow += offset.rowOffset;
|
|
47
|
+
break;
|
|
48
|
+
|
|
49
|
+
case "absolute":
|
|
50
|
+
newCol = ref.col, newRow = ref.row;
|
|
51
|
+
}
|
|
52
|
+
newCol < 0 && (newCol = 0), newRow < 0 && (newRow = 0);
|
|
53
|
+
let result = "";
|
|
54
|
+
return "absolute" !== ref.type && "mixed_col" !== ref.type || (result += "$"), result += this.numberToColumn(newCol),
|
|
55
|
+
"absolute" !== ref.type && "mixed_row" !== ref.type || (result += "$"), result += newRow + 1,
|
|
56
|
+
result;
|
|
57
|
+
}
|
|
58
|
+
static adjustFormulaReferences(formula, colOffset, rowOffset) {
|
|
59
|
+
const offset = {
|
|
60
|
+
colOffset: colOffset,
|
|
61
|
+
rowOffset: rowOffset
|
|
62
|
+
};
|
|
63
|
+
return "string" == typeof formula ? formula.replace(this.CELL_REF_REGEX, (match => {
|
|
64
|
+
if (match.includes(":")) {
|
|
65
|
+
const parts = match.split(":"), startRef = this.parseCellReference(parts[0]), endRef = this.parseCellReference(parts[1]);
|
|
66
|
+
if (startRef && endRef) {
|
|
67
|
+
return `${this.adjustCellReference(startRef, offset)}:${this.adjustCellReference(endRef, offset)}`;
|
|
68
|
+
}
|
|
69
|
+
return match;
|
|
70
|
+
}
|
|
71
|
+
const ref = this.parseCellReference(match);
|
|
72
|
+
return ref ? this.adjustCellReference(ref, offset) : match;
|
|
73
|
+
})) : formula;
|
|
74
|
+
}
|
|
75
|
+
static isFormula(value) {
|
|
76
|
+
return "string" == typeof value && value.startsWith("=");
|
|
77
|
+
}
|
|
78
|
+
static extractReferences(formula) {
|
|
79
|
+
const references = [], matches = formula.match(this.CELL_REF_REGEX);
|
|
80
|
+
return matches && matches.forEach((match => {
|
|
81
|
+
if (match.includes(":")) {
|
|
82
|
+
const parts = match.split(":"), startRef = this.parseCellReference(parts[0]), endRef = this.parseCellReference(parts[1]);
|
|
83
|
+
startRef && references.push(startRef), endRef && references.push(endRef);
|
|
84
|
+
} else {
|
|
85
|
+
const ref = this.parseCellReference(match);
|
|
86
|
+
ref && references.push(ref);
|
|
87
|
+
}
|
|
88
|
+
})), references;
|
|
89
|
+
}
|
|
90
|
+
static getFormulaReferenceBounds(formula) {
|
|
91
|
+
const references = this.extractReferences(formula);
|
|
92
|
+
if (0 === references.length) return null;
|
|
93
|
+
let minCol = 1 / 0, maxCol = -1 / 0, minRow = 1 / 0, maxRow = -1 / 0;
|
|
94
|
+
return references.forEach((ref => {
|
|
95
|
+
minCol = Math.min(minCol, ref.col), maxCol = Math.max(maxCol, ref.col), minRow = Math.min(minRow, ref.row),
|
|
96
|
+
maxRow = Math.max(maxRow, ref.row);
|
|
97
|
+
})), {
|
|
98
|
+
minCol: minCol,
|
|
99
|
+
maxCol: maxCol,
|
|
100
|
+
minRow: minRow,
|
|
101
|
+
maxRow: maxRow
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
exports.FormulaReferenceAdjustor = FormulaReferenceAdjustor, FormulaReferenceAdjustor.CELL_REF_REGEX = /(\$?[A-Z]+\$?\d+(?::\$?[A-Z]+\$?\d+)?)/gi,
|
|
107
|
+
FormulaReferenceAdjustor.SINGLE_CELL_REGEX = /(\$?)([A-Z]+)(\$?)(\d+)/i;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/formula/formula-reference-adjustor.ts"],"names":[],"mappings":"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","file":"formula-reference-adjustor.js","sourcesContent":["/**\n * 公式引用调整器 - 实现Excel风格的公式复制粘贴功能\n * 处理公式中单元格引用的相对调整\n */\n\nexport interface CellReference {\n type: 'absolute' | 'relative' | 'mixed_row' | 'mixed_col';\n col: number; // 0-based column index\n row: number; // 0-based row index\n originalColRef: string; // 原始列引用,如 \"A\", \"$B\"\n originalRowRef: string; // 原始行引用,如 \"1\", \"$2\"\n fullReference: string; // 完整引用,如 \"A1\", \"$B$2\", \"A$1\"\n}\n\nexport interface ReferenceOffset {\n colOffset: number;\n rowOffset: number;\n}\n\nexport class FormulaReferenceAdjustor {\n private static readonly CELL_REF_REGEX = /(\\$?[A-Z]+\\$?\\d+(?::\\$?[A-Z]+\\$?\\d+)?)/gi;\n private static readonly SINGLE_CELL_REGEX = /(\\$?)([A-Z]+)(\\$?)(\\d+)/i;\n\n /**\n * 解析单元格引用\n */\n static parseCellReference(ref: string): CellReference | null {\n const match = ref.match(this.SINGLE_CELL_REGEX);\n if (!match) {\n return null;\n }\n\n const [, colAbsolute, colStr, rowAbsolute, rowStr] = match;\n const col = this.columnToNumber(colStr);\n const row = parseInt(rowStr, 10) - 1; // Convert to 0-based\n\n let type: CellReference['type'];\n if (colAbsolute && rowAbsolute) {\n type = 'absolute';\n } else if (colAbsolute && !rowAbsolute) {\n type = 'mixed_col';\n } else if (!colAbsolute && rowAbsolute) {\n type = 'mixed_row';\n } else {\n type = 'relative';\n }\n\n return {\n type,\n col,\n row,\n originalColRef: colAbsolute + colStr,\n originalRowRef: rowAbsolute + rowStr,\n fullReference: ref\n };\n }\n\n /**\n * 将列字母转换为数字 (A -> 0, B -> 1, ..., Z -> 25, AA -> 26, etc.)\n */\n static columnToNumber(col: string): number {\n let result = 0;\n for (let i = 0; i < col.length; i++) {\n result = result * 26 + (col.charCodeAt(i) - 'A'.charCodeAt(0) + 1);\n }\n return result - 1; // Convert to 0-based\n }\n\n /**\n * 将数字转换为列字母 (0 -> A, 1 -> B, ..., 25 -> Z, 26 -> AA, etc.)\n */\n static numberToColumn(num: number): string {\n let result = '';\n let n = num + 1; // Convert to 1-based\n while (n > 0) {\n n--;\n result = String.fromCharCode('A'.charCodeAt(0) + (n % 26)) + result;\n n = Math.floor(n / 26);\n }\n return result;\n }\n\n /**\n * 调整单元格引用\n */\n static adjustCellReference(ref: CellReference, offset: ReferenceOffset): string {\n let newCol = ref.col;\n let newRow = ref.row;\n\n switch (ref.type) {\n case 'relative':\n newCol += offset.colOffset;\n newRow += offset.rowOffset;\n break;\n case 'mixed_row':\n // 行绝对,列相对\n newCol += offset.colOffset;\n newRow = ref.row; // 行绝对引用,不改变\n break;\n case 'mixed_col':\n // 列绝对,行相对\n newCol = ref.col; // 列绝对引用,不改变\n newRow += offset.rowOffset;\n break;\n case 'absolute':\n // 绝对引用,不改变任何值\n newCol = ref.col;\n newRow = ref.row;\n break;\n }\n\n // 确保坐标在有效范围内\n if (newCol < 0) {\n newCol = 0;\n }\n if (newRow < 0) {\n newRow = 0;\n }\n\n // 构建新的引用字符串\n let result = '';\n if (ref.type === 'absolute' || ref.type === 'mixed_col') {\n result += '$';\n }\n result += this.numberToColumn(newCol);\n if (ref.type === 'absolute' || ref.type === 'mixed_row') {\n result += '$';\n }\n result += newRow + 1; // Convert back to 1-based\n\n return result;\n }\n\n /**\n * 调整公式中的引用\n * @param formula 原始公式\n * @param colOffset 列位移(目标列 - 源列)\n * @param rowOffset 行位移(目标行 - 源行)\n */\n static adjustFormulaReferences(formula: string | number, colOffset: number, rowOffset: number): string | number {\n const offset = {\n colOffset: colOffset,\n rowOffset: rowOffset\n };\n\n return typeof formula === 'string'\n ? formula.replace(this.CELL_REF_REGEX, match => {\n // 处理范围引用(如 A1:B2)\n if (match.includes(':')) {\n const parts = match.split(':');\n const startRef = this.parseCellReference(parts[0]);\n const endRef = this.parseCellReference(parts[1]);\n\n if (startRef && endRef) {\n const newStart = this.adjustCellReference(startRef, offset);\n const newEnd = this.adjustCellReference(endRef, offset);\n return `${newStart}:${newEnd}`;\n }\n return match; // 如果解析失败,保持原样\n }\n\n // 处理单个单元格引用\n const ref = this.parseCellReference(match);\n if (ref) {\n return this.adjustCellReference(ref, offset);\n }\n return match; // 如果解析失败,保持原样\n })\n : formula;\n }\n\n /**\n * 检查是否为公式\n */\n static isFormula(value: any): boolean {\n return typeof value === 'string' && value.startsWith('=');\n }\n\n /**\n * 提取公式中的引用\n */\n static extractReferences(formula: string): CellReference[] {\n const references: CellReference[] = [];\n const matches = formula.match(this.CELL_REF_REGEX);\n\n if (matches) {\n matches.forEach(match => {\n // 处理范围引用\n if (match.includes(':')) {\n const parts = match.split(':');\n const startRef = this.parseCellReference(parts[0]);\n const endRef = this.parseCellReference(parts[1]);\n\n if (startRef) {\n references.push(startRef);\n }\n if (endRef) {\n references.push(endRef);\n }\n } else {\n const ref = this.parseCellReference(match);\n if (ref) {\n references.push(ref);\n }\n }\n });\n }\n\n return references;\n }\n\n /**\n * 获取公式中的引用范围\n */\n static getFormulaReferenceBounds(formula: string): {\n minCol: number;\n maxCol: number;\n minRow: number;\n maxRow: number;\n } | null {\n const references = this.extractReferences(formula);\n if (references.length === 0) {\n return null;\n }\n\n let minCol = Infinity;\n let maxCol = -Infinity;\n let minRow = Infinity;\n let maxRow = -Infinity;\n\n references.forEach(ref => {\n minCol = Math.min(minCol, ref.col);\n maxCol = Math.max(maxCol, ref.col);\n minRow = Math.min(minRow, ref.row);\n maxRow = Math.max(maxRow, ref.row);\n });\n\n return {\n minCol,\n maxCol,\n minRow,\n maxRow\n };\n }\n}\n"]}
|
|
@@ -99,8 +99,8 @@ class FormulaUIManager {
|
|
|
99
99
|
if (!selection) return;
|
|
100
100
|
const value = formulaInput.value;
|
|
101
101
|
if (value.startsWith("=") && value.length > 1) try {
|
|
102
|
-
const currentCellAddress = activeWorkSheet.addressFromCoord(selection.
|
|
103
|
-
if (new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`).test(value)) return activeWorkSheet.setCellValue(selection.
|
|
102
|
+
const currentCellAddress = activeWorkSheet.addressFromCoord(selection.col, selection.row);
|
|
103
|
+
if (new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`).test(value)) return activeWorkSheet.setCellValue(selection.col, selection.row, "#CYCLE!"),
|
|
104
104
|
null === (_a = activeWorkSheet.tableInstance) || void 0 === _a || _a.changeCellValue(selection.col, selection.row, "#CYCLE!"),
|
|
105
105
|
formulaInput.value = "", void formulaInput.blur();
|
|
106
106
|
this.sheet.formulaManager.setCellContent({
|
|
@@ -113,10 +113,10 @@ class FormulaUIManager {
|
|
|
113
113
|
row: selection.row,
|
|
114
114
|
col: selection.col
|
|
115
115
|
});
|
|
116
|
-
activeWorkSheet.setCellValue(selection.
|
|
116
|
+
activeWorkSheet.setCellValue(selection.col, selection.row, result.value);
|
|
117
117
|
} catch (error) {
|
|
118
|
-
activeWorkSheet.setCellValue(selection.
|
|
119
|
-
} else activeWorkSheet.setCellValue(selection.
|
|
118
|
+
activeWorkSheet.setCellValue(selection.col, selection.row, "#ERROR!");
|
|
119
|
+
} else activeWorkSheet.setCellValue(selection.col, selection.row, value);
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
updateFormulaBar() {
|
|
@@ -128,7 +128,7 @@ class FormulaUIManager {
|
|
|
128
128
|
const rowCount = activeWorkSheet.getRowCount(), colCount = activeWorkSheet.getColumnCount();
|
|
129
129
|
if (selection.startRow < 0 || selection.startRow >= rowCount || selection.startCol < 0 || selection.startCol >= colCount) return void this.clearFormula();
|
|
130
130
|
const cellAddressBox = this.formulaBarElement.querySelector(".vtable-sheet-cell-address");
|
|
131
|
-
cellAddressBox && (cellAddressBox.textContent = activeWorkSheet.addressFromCoord(selection.
|
|
131
|
+
cellAddressBox && (cellAddressBox.textContent = activeWorkSheet.addressFromCoord(selection.startCol, selection.startRow));
|
|
132
132
|
const formulaInput = this.formulaInput;
|
|
133
133
|
if (formulaInput) {
|
|
134
134
|
if (this.sheet.formulaManager.inputIsParamMode = (0, formula_helper_1.detectFunctionParameterPosition)(formulaInput.value, this.sheet.formulaManager.lastKnownCursorPosInFormulaInput),
|
|
@@ -144,7 +144,7 @@ class FormulaUIManager {
|
|
|
144
144
|
const displayFormula = formula.startsWith("=") ? formula : "=" + formula;
|
|
145
145
|
formulaInput.value = displayFormula;
|
|
146
146
|
} else {
|
|
147
|
-
const cellValue = activeWorkSheet.getCellValue(selection.
|
|
147
|
+
const cellValue = activeWorkSheet.getCellValue(selection.startCol, selection.startRow);
|
|
148
148
|
formulaInput.value = null != cellValue ? String(cellValue) : "";
|
|
149
149
|
}
|
|
150
150
|
} catch (e) {
|
|
@@ -186,8 +186,8 @@ class FormulaUIManager {
|
|
|
186
186
|
if (!editingCell) return;
|
|
187
187
|
const value = input.value;
|
|
188
188
|
if (value.startsWith("=") && value.length > 1) try {
|
|
189
|
-
const currentCellAddress = activeWorkSheet.addressFromCoord(editingCell.
|
|
190
|
-
if (new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`).test(value)) return activeWorkSheet.setCellValue(editingCell.
|
|
189
|
+
const currentCellAddress = activeWorkSheet.addressFromCoord(editingCell.col, editingCell.row);
|
|
190
|
+
if (new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`).test(value)) return activeWorkSheet.setCellValue(editingCell.col, editingCell.row, "#CYCLE!"),
|
|
191
191
|
null === (_a = activeWorkSheet.tableInstance) || void 0 === _a || _a.changeCellValue(editingCell.col, editingCell.row, "#CYCLE!"),
|
|
192
192
|
this.sheet.formulaManager.formulaWorkingOnCell = null, input.value = "", void input.blur();
|
|
193
193
|
this.sheet.formulaManager.setCellContent({
|
|
@@ -206,9 +206,9 @@ class FormulaUIManager {
|
|
|
206
206
|
this.sheet.formulaManager.cellHighlightManager.clearHighlights(), activeWorkSheet.tableInstance.selectCell(editingCell.col, editingCell.row);
|
|
207
207
|
}), 0);
|
|
208
208
|
} catch (error) {
|
|
209
|
-
activeWorkSheet.setCellValue(editingCell.
|
|
209
|
+
activeWorkSheet.setCellValue(editingCell.col, editingCell.row, "#ERROR!"), null === (_c = activeWorkSheet.tableInstance) || void 0 === _c || _c.changeCellValue(editingCell.col, editingCell.row, "#ERROR!"),
|
|
210
210
|
this.sheet.formulaManager.formulaWorkingOnCell = null;
|
|
211
|
-
} else activeWorkSheet.setCellValue(editingCell.
|
|
211
|
+
} else activeWorkSheet.setCellValue(editingCell.col, editingCell.row, value), null === (_d = activeWorkSheet.tableInstance) || void 0 === _d || _d.changeCellValue(editingCell.col, editingCell.row, value),
|
|
212
212
|
this.sheet.formulaManager.formulaWorkingOnCell = null;
|
|
213
213
|
this.isEnterKeyPressed = !0, event.preventDefault(), event.stopPropagation();
|
|
214
214
|
}
|
|
@@ -225,4 +225,5 @@ class FormulaUIManager {
|
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
|
|
228
|
-
exports.FormulaUIManager = FormulaUIManager;
|
|
228
|
+
exports.FormulaUIManager = FormulaUIManager;
|
|
229
|
+
//# sourceMappingURL=formula-ui-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/formula/formula-ui-manager.ts"],"names":[],"mappings":"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","file":"formula-ui-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\n/**\n * 公式UI管理器\n * 封装公式编辑、显示等UI相关功能\n */\nexport class FormulaUIManager {\n private sheet: VTableSheet;\n private formulaBarElement: HTMLElement | null = null;\n formulaInput: HTMLInputElement | null = null;\n isFormulaBarShowingResult = false;\n\n private isEnterKeyPressed = false;\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n }\n\n /**\n * 创建公式栏\n */\n createFormulaBar(): HTMLElement {\n // SVG图标常量\n const cancelIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 ' +\n '6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>' +\n '</svg>';\n const confirmIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/>' +\n '</svg>';\n\n const formulaBar = document.createElement('div');\n formulaBar.className = 'vtable-sheet-formula-bar';\n\n // 创建单元格地址显示\n const cellAddressBox = document.createElement('div');\n cellAddressBox.className = 'vtable-sheet-cell-address';\n cellAddressBox.textContent = '';\n formulaBar.appendChild(cellAddressBox);\n\n // 创建fx标志\n const formulaIcon = document.createElement('div');\n formulaIcon.className = 'vtable-sheet-formula-icon';\n formulaIcon.textContent = 'fx';\n formulaIcon.title = '插入函数';\n formulaBar.appendChild(formulaIcon);\n\n // 创建公式输入框\n const formulaInput = document.createElement('input');\n this.formulaInput = formulaInput;\n formulaInput.className = 'vtable-sheet-formula-input';\n formulaInput.placeholder = '输入公式...';\n // 光标有可能被改变的事件监听。 用于记录光标位置。\n const events = ['click', 'mouseup', 'keyup', 'select', 'input', 'focus'];\n events.forEach(eventType => {\n formulaInput.addEventListener(eventType, e => {\n const cursorPos = formulaInput.selectionStart;\n if (cursorPos !== null && cursorPos !== undefined) {\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput = cursorPos;\n this.sheet.formulaManager.inputingElement = formulaInput;\n }\n });\n });\n formulaInput.addEventListener('input', e => this.handleFormulaInput(e));\n formulaInput.addEventListener('keydown', e => this.handleFormulaKeydown(e));\n formulaInput.addEventListener('focus', () => {\n this.activateFormulaBar();\n // 当获得焦点时,显示公式而不是计算值\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (activeWorkSheet) {\n const editingCell = activeWorkSheet.editingCell;\n if (editingCell && !this.sheet.formulaManager.formulaWorkingOnCell) {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: editingCell.sheet,\n row: editingCell.row,\n col: editingCell.col\n });\n if (formula) {\n this.sheet.formulaManager.formulaWorkingOnCell = editingCell;\n // 显示公式\n const displayFormula = formula.startsWith('=') ? formula : `=${formula}`;\n formulaInput.value = displayFormula;\n // 触发高亮\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(displayFormula);\n\n // const formulaIfCorrect = this.sheet.formulaManager.isFormulaComplete(formulaInput.value);\n // if (formulaIfCorrect) {\n // this.sheet.formulaManager.formulaWorkingOnCell = null;\n // } else {\n // this.sheet.formulaManager.formulaWorkingOnCell = activeWorkSheet.editingCell;\n // }\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n }\n }\n }\n });\n\n formulaInput.addEventListener('blur', () => {\n if (this.sheet.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n this.deactivateFormulaBar();\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n // 当失去焦点时,如果没有确认修改,恢复显示计算值\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (activeWorkSheet) {\n const selection = activeWorkSheet.getSelection();\n if (selection) {\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: selection.startRow,\n col: selection.startCol\n });\n activeWorkSheet.tableInstance?.changeCellValue(\n selection.startCol,\n selection.startRow,\n result.error ? '#ERROR!' : result.value\n );\n }\n }\n });\n\n formulaBar.appendChild(formulaInput);\n\n // 创建操作按钮容器\n const formulaActions = document.createElement('div');\n formulaActions.className = 'vtable-sheet-formula-actions';\n\n // 创建取消按钮\n const cancelButton = document.createElement('button');\n cancelButton.className = 'vtable-sheet-formula-button vtable-sheet-formula-cancel';\n cancelButton.innerHTML = cancelIcon;\n cancelButton.title = '取消';\n cancelButton.addEventListener('click', () => this.cancelFormulaEdit());\n formulaActions.appendChild(cancelButton);\n\n // 创建确认按钮\n const confirmButton = document.createElement('button');\n confirmButton.className = 'vtable-sheet-formula-button vtable-sheet-formula-confirm';\n confirmButton.innerHTML = confirmIcon;\n confirmButton.title = '确认';\n confirmButton.addEventListener('click', () => this.confirmFormulaEdit());\n formulaActions.appendChild(confirmButton);\n\n formulaBar.appendChild(formulaActions);\n this.formulaBarElement = formulaBar;\n\n return formulaBar;\n }\n\n /**\n * 激活公式栏\n */\n activateFormulaBar(): void {\n const formulaBar = this.formulaBarElement;\n if (formulaBar) {\n formulaBar.classList.add('active');\n }\n }\n\n /**\n * 取消激活公式栏\n */\n deactivateFormulaBar(): void {\n const formulaBar = this.formulaBarElement;\n if (formulaBar) {\n formulaBar.classList.remove('active');\n }\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n }\n\n /**\n * 取消公式编辑\n */\n cancelFormulaEdit(): void {\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n this.updateFormulaBar(); // 重置为原始值\n }\n }\n\n /**\n * 确认公式编辑\n */\n confirmFormulaEdit(): void {\n const formulaInput = this.formulaInput;\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (formulaInput && activeWorkSheet) {\n const selection = activeWorkSheet.editingCell;\n if (!selection) {\n return;\n }\n\n const value = formulaInput.value;\n\n // 应用与按Enter键相同的逻辑\n if (value.startsWith('=') && value.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(selection.row, selection.col);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(value)) {\n console.warn('Circular reference detected:', value, 'contains', currentCellAddress);\n activeWorkSheet.setCellValue(selection.row, selection.col, '#CYCLE!');\n activeWorkSheet.tableInstance?.changeCellValue(selection.col, selection.row, '#CYCLE!');\n formulaInput.value = '';\n formulaInput.blur();\n return;\n }\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: selection.row,\n col: selection.col\n },\n value\n );\n\n // 获取计算结果\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: selection.row,\n col: selection.col\n });\n\n activeWorkSheet.setCellValue(selection.row, selection.col, result.value);\n } catch (error) {\n console.warn('Formula confirmation error:', error);\n // 显示错误状态\n activeWorkSheet.setCellValue(selection.row, selection.col, '#ERROR!');\n }\n } else {\n activeWorkSheet.setCellValue(selection.row, selection.col, value);\n }\n }\n }\n\n /**\n * 更新公式栏\n */\n updateFormulaBar(): void {\n if (!this.formulaBarElement) {\n return;\n }\n\n // 如果没有活动的sheet或者没有选中的单元格,则清空公式栏\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n this.clearFormula();\n return;\n }\n\n const selection = activeWorkSheet.getSelection();\n if (!selection) {\n this.clearFormula();\n return;\n }\n\n try {\n // 边界检查\n const rowCount = activeWorkSheet.getRowCount();\n const colCount = activeWorkSheet.getColumnCount();\n\n if (\n selection.startRow < 0 ||\n selection.startRow >= rowCount ||\n selection.startCol < 0 ||\n selection.startCol >= colCount\n ) {\n this.clearFormula();\n return;\n }\n\n // 更新单元格地址\n const cellAddressBox = this.formulaBarElement.querySelector('.vtable-sheet-cell-address');\n if (cellAddressBox) {\n cellAddressBox.textContent = activeWorkSheet.addressFromCoord(selection.startRow, selection.startCol);\n }\n\n // 更新公式输入框\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n // 检查是否在函数参数模式下,如果是则不覆盖公式输入框内容\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (this.sheet.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n // 如果公式栏正在显示计算结果,不覆盖内容\n if (this.isFormulaBarShowingResult) {\n return;\n }\n\n try {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: activeWorkSheet.getKey(),\n row: selection.startRow,\n col: selection.startCol\n });\n\n if (formula) {\n const displayFormula = formula.startsWith('=') ? formula : '=' + formula;\n formulaInput.value = displayFormula;\n } else {\n const cellValue = activeWorkSheet.getCellValue(selection.startRow, selection.startCol);\n formulaInput.value = cellValue !== undefined && cellValue !== null ? String(cellValue) : '';\n }\n } catch (e) {\n console.warn('Error updating formula input:', e);\n formulaInput.value = '';\n }\n }\n } catch (e) {\n console.error('Error in updateFormulaBar:', e);\n this.clearFormula();\n }\n }\n\n /**\n * 处理公式输入\n * @param event 事件\n */\n private handleFormulaInput(event: Event): void {\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n return;\n }\n const editingCell = activeWorkSheet.editingCell;\n if (!editingCell) {\n return;\n }\n const input = event.target as HTMLInputElement;\n const value = input.value;\n //如果编辑器不存在,则开启编辑单元格\n if (!this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor) {\n this.sheet.getActiveSheet().tableInstance.startEditCell(editingCell.col, editingCell.row, value);\n }\n //将值同步到编辑器输入框\n const editingEditor = this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor;\n if (editingEditor && 'getInputElement' in editingEditor && typeof editingEditor.getInputElement === 'function') {\n const inputElement = editingEditor.getInputElement() as HTMLInputElement;\n if (inputElement) {\n inputElement.value = value;\n input.focus();\n }\n }\n\n // 如果是公式,高亮引用的单元格\n if (value.startsWith('=')) {\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value);\n }\n // 如果是公式插入事件,不进行公式计算\n if ((event as any).isFormulaInsertion) {\n return;\n }\n // 检测函数参数位置\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n\n // 如果是公式,高亮引用的单元格\n if (value.startsWith('=')) {\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value);\n // 开始新的公式输入,重置标志\n this.isFormulaBarShowingResult = false;\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n },\n value\n );\n } else {\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n }\n\n // //当前input框内是否为公式,并且检查公式的完整性。如果不是完整的,那么不退出编辑状态,且等待用户输入其他内容,或者等待用户进行框选点选单元格设定计算选取\n // const formulaIfCorrect = this.sheet.formulaManager.isFormulaComplete(value);\n // if (formulaIfCorrect) {\n // this.sheet.formulaManager.formulaWorkingOnCell = null;\n // } else {\n this.sheet.formulaManager.formulaWorkingOnCell = activeWorkSheet.editingCell;\n // }\n }\n\n /**\n * 处理公式输入框键盘事件\n * @param event 事件\n */\n private handleFormulaKeydown(event: KeyboardEvent): void {\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n return;\n }\n\n const input = event.target as HTMLInputElement;\n\n if (event.key === 'Enter') {\n const editingCell = activeWorkSheet.editingCell;\n if (!editingCell) {\n return;\n }\n\n const value = input.value;\n\n if (value.startsWith('=') && value.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(editingCell.row, editingCell.col);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(value)) {\n console.warn('Circular reference detected:', value, 'contains', currentCellAddress);\n activeWorkSheet.setCellValue(editingCell.row, editingCell.col, '#CYCLE!');\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, '#CYCLE!');\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n input.value = '';\n input.blur();\n return;\n }\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n },\n value\n );\n\n // 计算结果并仅写入结果展示(不写入公式文本到单元格显示)\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n });\n\n activeWorkSheet.tableInstance?.changeCellValue(\n editingCell.col,\n editingCell.row,\n result.error ? '#ERROR!' : result.value\n );\n\n // // 在公式栏中显示计算结果\n // input.value = result.error ? '#ERROR!' : String(result.value);\n this.isFormulaBarShowingResult = true;\n input.blur();\n setTimeout(() => {\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n activeWorkSheet.tableInstance.clearSelected();\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n activeWorkSheet.tableInstance.selectCell(editingCell.col, editingCell.row);\n }, 0);\n } catch (error) {\n console.warn('Formula evaluation error:', error);\n // 显示错误状态\n activeWorkSheet.setCellValue(editingCell.row, editingCell.col, '#ERROR!');\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, '#ERROR!');\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n } else {\n // 普通值,直接设置\n activeWorkSheet.setCellValue(editingCell.row, editingCell.col, value);\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, value);\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n\n // 不自动移动到下一行,保持当前位置\n this.isEnterKeyPressed = true;\n\n // 阻止默认行为\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n /**\n * 清除单元格地址和公式输入框\n */\n clearFormula(): void {\n const cellAddressBox = this.formulaBarElement?.querySelector('.vtable-sheet-cell-address');\n if (cellAddressBox) {\n cellAddressBox.textContent = '';\n }\n\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n formulaInput.value = '';\n }\n }\n\n release(): void {\n this.formulaBarElement = null;\n this.formulaInput = null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/formula/formula-ui-manager.ts"],"names":[],"mappings":";;;AACA,qDAAmE;AAMnE,MAAa,gBAAgB;IAQ3B,YAAY,KAAkB;QANtB,sBAAiB,GAAuB,IAAI,CAAC;QACrD,iBAAY,GAA4B,IAAI,CAAC;QAC7C,8BAAyB,GAAG,KAAK,CAAC;QAE1B,sBAAiB,GAAG,KAAK,CAAC;QAGhC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAKD,gBAAgB;QAEd,MAAM,UAAU,GACd,kDAAkD;YAClD,wFAAwF;YACxF,iDAAiD;YACjD,QAAQ,CAAC;QACX,MAAM,WAAW,GACf,kDAAkD;YAClD,mFAAmF;YACnF,QAAQ,CAAC;QAEX,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACjD,UAAU,CAAC,SAAS,GAAG,0BAA0B,CAAC;QAGlD,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrD,cAAc,CAAC,SAAS,GAAG,2BAA2B,CAAC;QACvD,cAAc,CAAC,WAAW,GAAG,EAAE,CAAC;QAChC,UAAU,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAGvC,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,WAAW,CAAC,SAAS,GAAG,2BAA2B,CAAC;QACpD,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;QAC/B,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC;QAC3B,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAGpC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,YAAY,CAAC,SAAS,GAAG,4BAA4B,CAAC;QACtD,YAAY,CAAC,WAAW,GAAG,SAAS,CAAC;QAErC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACzB,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE;gBAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,cAAc,CAAC;gBAC9C,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE;oBACjD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gCAAgC,GAAG,SAAS,CAAC;oBACvE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,GAAG,YAAY,CAAC;iBAC1D;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAC1C,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YACpD,IAAI,eAAe,EAAE;gBACnB,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC;gBAChD,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,EAAE;oBAClE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;wBACvD,KAAK,EAAE,WAAW,CAAC,KAAK;wBACxB,GAAG,EAAE,WAAW,CAAC,GAAG;wBACpB,GAAG,EAAE,WAAW,CAAC,GAAG;qBACrB,CAAC,CAAC;oBACH,IAAI,OAAO,EAAE;wBACX,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,GAAG,WAAW,CAAC;wBAE7D,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;wBACzE,YAAY,CAAC,KAAK,GAAG,cAAc,CAAC;wBAEpC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;wBAQrF,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,GAAG,IAAA,gDAA+B,EAC1E,YAAY,CAAC,KAAK,EAClB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gCAAgC,CAC3D,CAAC;qBACH;iBACF;aACF;QACH,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;;YACzC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,EAAE;gBAClD,OAAO;aACR;YAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;YAEjE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YACpD,IAAI,eAAe,EAAE;gBACnB,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,CAAC;gBACjD,IAAI,SAAS,EAAE;oBACb,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC;wBACpD,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE;wBAC/B,GAAG,EAAE,SAAS,CAAC,QAAQ;wBACvB,GAAG,EAAE,SAAS,CAAC,QAAQ;qBACxB,CAAC,CAAC;oBACH,MAAA,eAAe,CAAC,aAAa,0CAAE,eAAe,CAC5C,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,QAAQ,EAClB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACxC,CAAC;iBACH;aACF;QACH,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAGrC,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrD,cAAc,CAAC,SAAS,GAAG,8BAA8B,CAAC;QAG1D,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACtD,YAAY,CAAC,SAAS,GAAG,yDAAyD,CAAC;QACnF,YAAY,CAAC,SAAS,GAAG,UAAU,CAAC;QACpC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC;QAC1B,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACvE,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAGzC,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvD,aAAa,CAAC,SAAS,GAAG,0DAA0D,CAAC;QACrF,aAAa,CAAC,SAAS,GAAG,WAAW,CAAC;QACtC,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC;QAC3B,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACzE,cAAc,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAE1C,UAAU,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACvC,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;QAEpC,OAAO,UAAU,CAAC;IACpB,CAAC;IAKD,kBAAkB;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC1C,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;SACpC;IACH,CAAC;IAKD,oBAAoB;QAClB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC1C,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SACvC;QACD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;IACnE,CAAC;IAKD,iBAAiB;QACf,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,gBAAgB,EAAE,CAAC;SACzB;IACH,CAAC;IAKD,kBAAkB;;QAChB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QACpD,IAAI,YAAY,IAAI,eAAe,EAAE;YACnC,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,CAAC;YAC9C,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO;aACR;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;YAGjC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7C,IAAI;oBAEF,MAAM,kBAAkB,GAAG,eAAe,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;oBAE1F,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,mBAAmB,kBAAkB,kBAAkB,CAAC,CAAC;oBACtF,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;wBACzB,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;wBACpF,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;wBACtE,MAAA,eAAe,CAAC,aAAa,0CAAE,eAAe,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;wBACxF,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC;wBACxB,YAAY,CAAC,IAAI,EAAE,CAAC;wBACpB,OAAO;qBACR;oBAGD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CACtC;wBACE,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE;wBAC/B,GAAG,EAAE,SAAS,CAAC,GAAG;wBAClB,GAAG,EAAE,SAAS,CAAC,GAAG;qBACnB,EACD,KAAK,CACN,CAAC;oBAGF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC;wBACpD,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE;wBAC/B,GAAG,EAAE,SAAS,CAAC,GAAG;wBAClB,GAAG,EAAE,SAAS,CAAC,GAAG;qBACnB,CAAC,CAAC;oBAEH,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;iBAC1E;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;oBAEnD,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;iBACvE;aACF;iBAAM;gBACL,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;aACnE;SACF;IACH,CAAC;IAKD,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC3B,OAAO;SACR;QAGD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QACpD,IAAI,CAAC,eAAe,EAAE;YACpB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;SACR;QAED,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS,EAAE;YACd,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;SACR;QAED,IAAI;YAEF,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,EAAE,CAAC;YAElD,IACE,SAAS,CAAC,QAAQ,GAAG,CAAC;gBACtB,SAAS,CAAC,QAAQ,IAAI,QAAQ;gBAC9B,SAAS,CAAC,QAAQ,GAAG,CAAC;gBACtB,SAAS,CAAC,QAAQ,IAAI,QAAQ,EAC9B;gBACA,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,OAAO;aACR;YAGD,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC;YAC1F,IAAI,cAAc,EAAE;gBAClB,cAAc,CAAC,WAAW,GAAG,eAAe,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;aACvG;YAGD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,IAAI,YAAY,EAAE;gBAEhB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,GAAG,IAAA,gDAA+B,EAC1E,YAAY,CAAC,KAAK,EAClB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gCAAgC,CAC3D,CAAC;gBACF,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,WAAW,EAAE;oBAC1D,OAAO;iBACR;gBAGD,IAAI,IAAI,CAAC,yBAAyB,EAAE;oBAClC,OAAO;iBACR;gBAED,IAAI;oBACF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;wBACvD,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE;wBAC/B,GAAG,EAAE,SAAS,CAAC,QAAQ;wBACvB,GAAG,EAAE,SAAS,CAAC,QAAQ;qBACxB,CAAC,CAAC;oBAEH,IAAI,OAAO,EAAE;wBACX,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC;wBACzE,YAAY,CAAC,KAAK,GAAG,cAAc,CAAC;qBACrC;yBAAM;wBACL,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;wBACvF,YAAY,CAAC,KAAK,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC7F;iBACF;gBAAC,OAAO,CAAC,EAAE;oBACV,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;oBACjD,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC;iBACzB;aACF;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;IACH,CAAC;IAMO,kBAAkB,CAAC,KAAY;QACrC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QACpD,IAAI,CAAC,eAAe,EAAE;YACpB,OAAO;SACR;QACD,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC;QAChD,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;SACR;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAE1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,EAAE;YAC1E,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAClG;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC;QAC5F,IAAI,aAAa,IAAI,iBAAiB,IAAI,aAAa,IAAI,OAAO,aAAa,CAAC,eAAe,KAAK,UAAU,EAAE;YAC9G,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAsB,CAAC;YACzE,IAAI,YAAY,EAAE;gBAChB,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;gBAC3B,KAAK,CAAC,KAAK,EAAE,CAAC;aACf;SACF;QAGD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACzB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;SAC7E;QAED,IAAK,KAAa,CAAC,kBAAkB,EAAE;YACrC,OAAO;SACR;QAED,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,GAAG,IAAA,gDAA+B,EAC1E,KAAK,EACL,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gCAAgC,CAC3D,CAAC;QAGF,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACzB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAE5E,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;YAGvC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CACtC;gBACE,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE;gBAC/B,GAAG,EAAE,WAAW,CAAC,GAAG;gBACpB,GAAG,EAAE,WAAW,CAAC,GAAG;aACrB,EACD,KAAK,CACN,CAAC;SACH;aAAM;YACL,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;SAClE;QAOD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,GAAG,eAAe,CAAC,WAAW,CAAC;IAE/E,CAAC;IAMO,oBAAoB,CAAC,KAAoB;;QAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QACpD,IAAI,CAAC,eAAe,EAAE;YACpB,OAAO;SACR;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAE/C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACzB,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC;YAChD,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO;aACR;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAE1B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7C,IAAI;oBAEF,MAAM,kBAAkB,GAAG,eAAe,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;oBAE9F,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,mBAAmB,kBAAkB,kBAAkB,CAAC,CAAC;oBACtF,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;wBACzB,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;wBACpF,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;wBAC1E,MAAA,eAAe,CAAC,aAAa,0CAAE,eAAe,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;wBAC5F,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,GAAG,IAAI,CAAC;wBACtD,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;wBACjB,KAAK,CAAC,IAAI,EAAE,CAAC;wBACb,OAAO;qBACR;oBAGD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CACtC;wBACE,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE;wBAC/B,GAAG,EAAE,WAAW,CAAC,GAAG;wBACpB,GAAG,EAAE,WAAW,CAAC,GAAG;qBACrB,EACD,KAAK,CACN,CAAC;oBAGF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC;wBACpD,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE;wBAC/B,GAAG,EAAE,WAAW,CAAC,GAAG;wBACpB,GAAG,EAAE,WAAW,CAAC,GAAG;qBACrB,CAAC,CAAC;oBAEH,MAAA,eAAe,CAAC,aAAa,0CAAE,eAAe,CAC5C,WAAW,CAAC,GAAG,EACf,WAAW,CAAC,GAAG,EACf,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACxC,CAAC;oBAIF,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;oBACtC,KAAK,CAAC,IAAI,EAAE,CAAC;oBACb,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,GAAG,IAAI,CAAC;wBACtD,eAAe,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;wBAC9C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;wBACjE,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;oBAC7E,CAAC,EAAE,CAAC,CAAC,CAAC;iBACP;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;oBAEjD,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBAC1E,MAAA,eAAe,CAAC,aAAa,0CAAE,eAAe,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBAC5F,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,GAAG,IAAI,CAAC;iBACvD;aACF;iBAAM;gBAEL,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACtE,MAAA,eAAe,CAAC,aAAa,0CAAE,eAAe,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACxF,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,GAAG,IAAI,CAAC;aACvD;YAGD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAG9B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;SACzB;IACH,CAAC;IAKD,YAAY;;QACV,MAAM,cAAc,GAAG,MAAA,IAAI,CAAC,iBAAiB,0CAAE,aAAa,CAAC,4BAA4B,CAAC,CAAC;QAC3F,IAAI,cAAc,EAAE;YAClB,cAAc,CAAC,WAAW,GAAG,EAAE,CAAC;SACjC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,YAAY,EAAE;YAChB,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC;SACzB;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;CACF;AA1fD,4CA0fC","file":"formula-ui-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\n/**\n * 公式UI管理器\n * 封装公式编辑、显示等UI相关功能\n */\nexport class FormulaUIManager {\n private sheet: VTableSheet;\n private formulaBarElement: HTMLElement | null = null;\n formulaInput: HTMLInputElement | null = null;\n isFormulaBarShowingResult = false;\n\n private isEnterKeyPressed = false;\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n }\n\n /**\n * 创建公式栏\n */\n createFormulaBar(): HTMLElement {\n // SVG图标常量\n const cancelIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 ' +\n '6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>' +\n '</svg>';\n const confirmIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/>' +\n '</svg>';\n\n const formulaBar = document.createElement('div');\n formulaBar.className = 'vtable-sheet-formula-bar';\n\n // 创建单元格地址显示\n const cellAddressBox = document.createElement('div');\n cellAddressBox.className = 'vtable-sheet-cell-address';\n cellAddressBox.textContent = '';\n formulaBar.appendChild(cellAddressBox);\n\n // 创建fx标志\n const formulaIcon = document.createElement('div');\n formulaIcon.className = 'vtable-sheet-formula-icon';\n formulaIcon.textContent = 'fx';\n formulaIcon.title = '插入函数';\n formulaBar.appendChild(formulaIcon);\n\n // 创建公式输入框\n const formulaInput = document.createElement('input');\n this.formulaInput = formulaInput;\n formulaInput.className = 'vtable-sheet-formula-input';\n formulaInput.placeholder = '输入公式...';\n // 光标有可能被改变的事件监听。 用于记录光标位置。\n const events = ['click', 'mouseup', 'keyup', 'select', 'input', 'focus'];\n events.forEach(eventType => {\n formulaInput.addEventListener(eventType, e => {\n const cursorPos = formulaInput.selectionStart;\n if (cursorPos !== null && cursorPos !== undefined) {\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput = cursorPos;\n this.sheet.formulaManager.inputingElement = formulaInput;\n }\n });\n });\n formulaInput.addEventListener('input', e => this.handleFormulaInput(e));\n formulaInput.addEventListener('keydown', e => this.handleFormulaKeydown(e));\n formulaInput.addEventListener('focus', () => {\n this.activateFormulaBar();\n // 当获得焦点时,显示公式而不是计算值\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (activeWorkSheet) {\n const editingCell = activeWorkSheet.editingCell;\n if (editingCell && !this.sheet.formulaManager.formulaWorkingOnCell) {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: editingCell.sheet,\n row: editingCell.row,\n col: editingCell.col\n });\n if (formula) {\n this.sheet.formulaManager.formulaWorkingOnCell = editingCell;\n // 显示公式\n const displayFormula = formula.startsWith('=') ? formula : `=${formula}`;\n formulaInput.value = displayFormula;\n // 触发高亮\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(displayFormula);\n\n // const formulaIfCorrect = this.sheet.formulaManager.isFormulaComplete(formulaInput.value);\n // if (formulaIfCorrect) {\n // this.sheet.formulaManager.formulaWorkingOnCell = null;\n // } else {\n // this.sheet.formulaManager.formulaWorkingOnCell = activeWorkSheet.editingCell;\n // }\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n }\n }\n }\n });\n\n formulaInput.addEventListener('blur', () => {\n if (this.sheet.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n this.deactivateFormulaBar();\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n // 当失去焦点时,如果没有确认修改,恢复显示计算值\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (activeWorkSheet) {\n const selection = activeWorkSheet.getSelection();\n if (selection) {\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: selection.startRow,\n col: selection.startCol\n });\n activeWorkSheet.tableInstance?.changeCellValue(\n selection.startCol,\n selection.startRow,\n result.error ? '#ERROR!' : result.value\n );\n }\n }\n });\n\n formulaBar.appendChild(formulaInput);\n\n // 创建操作按钮容器\n const formulaActions = document.createElement('div');\n formulaActions.className = 'vtable-sheet-formula-actions';\n\n // 创建取消按钮\n const cancelButton = document.createElement('button');\n cancelButton.className = 'vtable-sheet-formula-button vtable-sheet-formula-cancel';\n cancelButton.innerHTML = cancelIcon;\n cancelButton.title = '取消';\n cancelButton.addEventListener('click', () => this.cancelFormulaEdit());\n formulaActions.appendChild(cancelButton);\n\n // 创建确认按钮\n const confirmButton = document.createElement('button');\n confirmButton.className = 'vtable-sheet-formula-button vtable-sheet-formula-confirm';\n confirmButton.innerHTML = confirmIcon;\n confirmButton.title = '确认';\n confirmButton.addEventListener('click', () => this.confirmFormulaEdit());\n formulaActions.appendChild(confirmButton);\n\n formulaBar.appendChild(formulaActions);\n this.formulaBarElement = formulaBar;\n\n return formulaBar;\n }\n\n /**\n * 激活公式栏\n */\n activateFormulaBar(): void {\n const formulaBar = this.formulaBarElement;\n if (formulaBar) {\n formulaBar.classList.add('active');\n }\n }\n\n /**\n * 取消激活公式栏\n */\n deactivateFormulaBar(): void {\n const formulaBar = this.formulaBarElement;\n if (formulaBar) {\n formulaBar.classList.remove('active');\n }\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n }\n\n /**\n * 取消公式编辑\n */\n cancelFormulaEdit(): void {\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n this.updateFormulaBar(); // 重置为原始值\n }\n }\n\n /**\n * 确认公式编辑\n */\n confirmFormulaEdit(): void {\n const formulaInput = this.formulaInput;\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (formulaInput && activeWorkSheet) {\n const selection = activeWorkSheet.editingCell;\n if (!selection) {\n return;\n }\n\n const value = formulaInput.value;\n\n // 应用与按Enter键相同的逻辑\n if (value.startsWith('=') && value.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(selection.col, selection.row);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(value)) {\n console.warn('Circular reference detected:', value, 'contains', currentCellAddress);\n activeWorkSheet.setCellValue(selection.col, selection.row, '#CYCLE!');\n activeWorkSheet.tableInstance?.changeCellValue(selection.col, selection.row, '#CYCLE!');\n formulaInput.value = '';\n formulaInput.blur();\n return;\n }\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: selection.row,\n col: selection.col\n },\n value\n );\n\n // 获取计算结果\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: selection.row,\n col: selection.col\n });\n\n activeWorkSheet.setCellValue(selection.col, selection.row, result.value);\n } catch (error) {\n console.warn('Formula confirmation error:', error);\n // 显示错误状态\n activeWorkSheet.setCellValue(selection.col, selection.row, '#ERROR!');\n }\n } else {\n activeWorkSheet.setCellValue(selection.col, selection.row, value);\n }\n }\n }\n\n /**\n * 更新公式栏\n */\n updateFormulaBar(): void {\n if (!this.formulaBarElement) {\n return;\n }\n\n // 如果没有活动的sheet或者没有选中的单元格,则清空公式栏\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n this.clearFormula();\n return;\n }\n\n const selection = activeWorkSheet.getSelection();\n if (!selection) {\n this.clearFormula();\n return;\n }\n\n try {\n // 边界检查\n const rowCount = activeWorkSheet.getRowCount();\n const colCount = activeWorkSheet.getColumnCount();\n\n if (\n selection.startRow < 0 ||\n selection.startRow >= rowCount ||\n selection.startCol < 0 ||\n selection.startCol >= colCount\n ) {\n this.clearFormula();\n return;\n }\n\n // 更新单元格地址\n const cellAddressBox = this.formulaBarElement.querySelector('.vtable-sheet-cell-address');\n if (cellAddressBox) {\n cellAddressBox.textContent = activeWorkSheet.addressFromCoord(selection.startCol, selection.startRow);\n }\n\n // 更新公式输入框\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n // 检查是否在函数参数模式下,如果是则不覆盖公式输入框内容\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (this.sheet.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n // 如果公式栏正在显示计算结果,不覆盖内容\n if (this.isFormulaBarShowingResult) {\n return;\n }\n\n try {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: activeWorkSheet.getKey(),\n row: selection.startRow,\n col: selection.startCol\n });\n\n if (formula) {\n const displayFormula = formula.startsWith('=') ? formula : '=' + formula;\n formulaInput.value = displayFormula;\n } else {\n const cellValue = activeWorkSheet.getCellValue(selection.startCol, selection.startRow);\n formulaInput.value = cellValue !== undefined && cellValue !== null ? String(cellValue) : '';\n }\n } catch (e) {\n console.warn('Error updating formula input:', e);\n formulaInput.value = '';\n }\n }\n } catch (e) {\n console.error('Error in updateFormulaBar:', e);\n this.clearFormula();\n }\n }\n\n /**\n * 处理公式输入\n * @param event 事件\n */\n private handleFormulaInput(event: Event): void {\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n return;\n }\n const editingCell = activeWorkSheet.editingCell;\n if (!editingCell) {\n return;\n }\n const input = event.target as HTMLInputElement;\n const value = input.value;\n //如果编辑器不存在,则开启编辑单元格\n if (!this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor) {\n this.sheet.getActiveSheet().tableInstance.startEditCell(editingCell.col, editingCell.row, value);\n }\n //将值同步到编辑器输入框\n const editingEditor = this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor;\n if (editingEditor && 'getInputElement' in editingEditor && typeof editingEditor.getInputElement === 'function') {\n const inputElement = editingEditor.getInputElement() as HTMLInputElement;\n if (inputElement) {\n inputElement.value = value;\n input.focus();\n }\n }\n\n // 如果是公式,高亮引用的单元格\n if (value.startsWith('=')) {\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value);\n }\n // 如果是公式插入事件,不进行公式计算\n if ((event as any).isFormulaInsertion) {\n return;\n }\n // 检测函数参数位置\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n\n // 如果是公式,高亮引用的单元格\n if (value.startsWith('=')) {\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value);\n // 开始新的公式输入,重置标志\n this.isFormulaBarShowingResult = false;\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n },\n value\n );\n } else {\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n }\n\n // //当前input框内是否为公式,并且检查公式的完整性。如果不是完整的,那么不退出编辑状态,且等待用户输入其他内容,或者等待用户进行框选点选单元格设定计算选取\n // const formulaIfCorrect = this.sheet.formulaManager.isFormulaComplete(value);\n // if (formulaIfCorrect) {\n // this.sheet.formulaManager.formulaWorkingOnCell = null;\n // } else {\n this.sheet.formulaManager.formulaWorkingOnCell = activeWorkSheet.editingCell;\n // }\n }\n\n /**\n * 处理公式输入框键盘事件\n * @param event 事件\n */\n private handleFormulaKeydown(event: KeyboardEvent): void {\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n return;\n }\n\n const input = event.target as HTMLInputElement;\n\n if (event.key === 'Enter') {\n const editingCell = activeWorkSheet.editingCell;\n if (!editingCell) {\n return;\n }\n\n const value = input.value;\n\n if (value.startsWith('=') && value.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(editingCell.col, editingCell.row);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(value)) {\n console.warn('Circular reference detected:', value, 'contains', currentCellAddress);\n activeWorkSheet.setCellValue(editingCell.col, editingCell.row, '#CYCLE!');\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, '#CYCLE!');\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n input.value = '';\n input.blur();\n return;\n }\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n },\n value\n );\n\n // 计算结果并仅写入结果展示(不写入公式文本到单元格显示)\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n });\n\n activeWorkSheet.tableInstance?.changeCellValue(\n editingCell.col,\n editingCell.row,\n result.error ? '#ERROR!' : result.value\n );\n\n // // 在公式栏中显示计算结果\n // input.value = result.error ? '#ERROR!' : String(result.value);\n this.isFormulaBarShowingResult = true;\n input.blur();\n setTimeout(() => {\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n activeWorkSheet.tableInstance.clearSelected();\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n activeWorkSheet.tableInstance.selectCell(editingCell.col, editingCell.row);\n }, 0);\n } catch (error) {\n console.warn('Formula evaluation error:', error);\n // 显示错误状态\n activeWorkSheet.setCellValue(editingCell.col, editingCell.row, '#ERROR!');\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, '#ERROR!');\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n } else {\n // 普通值,直接设置\n activeWorkSheet.setCellValue(editingCell.col, editingCell.row, value);\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, value);\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n\n // 不自动移动到下一行,保持当前位置\n this.isEnterKeyPressed = true;\n\n // 阻止默认行为\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n /**\n * 清除单元格地址和公式输入框\n */\n clearFormula(): void {\n const cellAddressBox = this.formulaBarElement?.querySelector('.vtable-sheet-cell-address');\n if (cellAddressBox) {\n cellAddressBox.textContent = '';\n }\n\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n formulaInput.value = '';\n }\n }\n\n release(): void {\n this.formulaBarElement = null;\n this.formulaInput = null;\n }\n}\n"]}
|
package/cjs/formula/index.d.ts
CHANGED
|
@@ -3,3 +3,7 @@ export * from './formula-autocomplete';
|
|
|
3
3
|
export * from './formula-range-selector';
|
|
4
4
|
export * from './formula-ui-manager';
|
|
5
5
|
export * from './cell-highlight-manager';
|
|
6
|
+
export { FormulaReferenceAdjustor } from './formula-reference-adjustor';
|
|
7
|
+
export { FormulaPasteProcessor } from './formula-paste-processor';
|
|
8
|
+
export type { CellReference, ReferenceOffset } from './formula-reference-adjustor';
|
|
9
|
+
export type { FormulaPasteContext } from './formula-paste-processor';
|