@visactor/vtable-sheet 1.22.9 → 1.22.10-alpha.1

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.
@@ -134,7 +134,7 @@ class FormulaInputEditor extends VTable_editors.InputEditor {
134
134
  const highlightManager = this.sheet.formulaManager.cellHighlightManager;
135
135
  highlightManager && highlightManager.clearHighlights();
136
136
  }
137
- this.eventHandlers.forEach((({type: type, handler: handler}) => {
137
+ this.element && this.eventHandlers.forEach((({type: type, handler: handler}) => {
138
138
  this.element.removeEventListener(type, handler);
139
139
  })), super.onEnd();
140
140
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula/formula-editor.ts"],"names":[],"mappings":"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","file":"formula-editor.js","sourcesContent":["import * as VTable_editors from '@visactor/vtable-editors';\nimport { FormulaAutocomplete } from './formula-autocomplete';\nimport type VTableSheet from '../components/vtable-sheet';\nimport type { EditContext } from '@visactor/vtable-editors';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\nexport class FormulaInputEditor extends VTable_editors.InputEditor {\n private formulaAutocomplete: FormulaAutocomplete | null = null;\n private sheet: VTableSheet | null = null;\n // 定义存储事件处理函数的数组\n private eventHandlers: Array<{ type: string; handler: EventListener }> = [];\n /**\n * 设置 Sheet 实例\n */\n setSheet(sheet: VTableSheet): void {\n this.sheet = sheet;\n }\n getInputElement(): HTMLInputElement {\n return this.element;\n }\n targetIsOnEditor(target: HTMLElement): boolean {\n return target === this.element || target === this.sheet.formulaUIManager.formulaInput;\n }\n /**\n * 创建编辑器元素\n * 重写父类方法以添加自动补全功能\n */\n createElement(): void {\n super.createElement();\n\n if (this.element && this.sheet) {\n const events = ['click', 'mouseup', 'keyup', 'select', 'input', 'focus'];\n events.forEach(eventType => {\n const handler = (e: Event) => {\n const cursorPos = this.element.selectionStart;\n if (cursorPos !== null && cursorPos !== undefined) {\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput = cursorPos;\n this.sheet.formulaManager.inputingElement = this.element;\n }\n };\n\n this.element.addEventListener(eventType, handler);\n this.eventHandlers.push({ type: eventType, handler });\n });\n\n // 添加输入事件监听\n const inputHandler = (e: Event) => {\n this.handleFormulaInput(e);\n };\n this.element.addEventListener('input', inputHandler);\n this.eventHandlers.push({ type: 'input', handler: inputHandler });\n\n // 延迟初始化自动补全\n setTimeout(() => {\n this.initAutocomplete();\n }, 50);\n }\n }\n\n /**\n * 处理公式输入\n */\n private handleFormulaInput(event: Event): void {\n if (!this.sheet || !this.element) {\n return;\n }\n\n const value = this.element.value;\n // 同步内容到顶部输入栏\n this.sheet.formulaUIManager.formulaInput.value = value;\n // const inputEvent = new Event('input', { bubbles: true });\n // Object.defineProperty(inputEvent, 'isFormulaInsertion', { value: true });\n // this.sheet.formulaUIManager.formulaInput.dispatchEvent(inputEvent);\n // 获取高亮管理器\n const highlightManager = this.sheet.formulaManager.cellHighlightManager;\n\n if (highlightManager) {\n if (value.startsWith('=')) {\n highlightManager.highlightFormulaCells(value);\n } else {\n highlightManager.clearHighlights();\n }\n }\n }\n\n /**\n * 初始化自动补全\n */\n private initAutocomplete(): void {\n if (!this.sheet || !this.element) {\n return;\n }\n\n // 清理之前的实例\n if (this.formulaAutocomplete) {\n this.formulaAutocomplete.release();\n this.formulaAutocomplete = null;\n }\n\n const tableContainer = this.sheet.getContentElement();\n\n this.formulaAutocomplete = new FormulaAutocomplete(tableContainer, this.sheet);\n\n // 自定义定位逻辑\n const customPositioning = () => {\n if (!this.formulaAutocomplete || !this.element) {\n return;\n }\n\n // 获取编辑器元素和容器的位置信息\n const inputRect = this.element.getBoundingClientRect();\n const containerRect = tableContainer.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n\n // 计算相对于表格容器的位置\n const relativeLeft = inputRect.left - containerRect.left;\n\n // 计算下拉框的最大高度和理想宽度\n const maxDropdownHeight = 250; // 最大高度限制\n const idealWidth = Math.max(300, inputRect.width); // 理想宽度\n\n // 计算下拉框在下方显示时的顶部位置\n let relativeTop = inputRect.bottom - containerRect.top + 2;\n\n // 检查是否有足够空间在下方显示下拉框\n const spaceBelow = windowHeight - inputRect.bottom;\n const spaceAbove = inputRect.top;\n\n // 判断应该将下拉框放在输入框的上方还是下方\n if (spaceBelow < maxDropdownHeight && spaceAbove > spaceBelow) {\n // 空间不足且上方空间更大,则放在上方\n relativeTop = inputRect.top - containerRect.top - maxDropdownHeight - 2;\n }\n\n // 确保下拉框不会超出容器底部\n const bottomOverflow = relativeTop + maxDropdownHeight - containerRect.height;\n if (bottomOverflow > 0) {\n relativeTop = Math.max(0, relativeTop - bottomOverflow);\n }\n\n // 确保下拉框不会超出容器顶部\n if (relativeTop < 0) {\n relativeTop = 0;\n }\n\n // 设置下拉框位置和样式\n const dropdown = (this.formulaAutocomplete as any).dropdown;\n if (dropdown) {\n dropdown.style.position = 'absolute';\n dropdown.style.left = `${Math.max(0, relativeLeft)}px`;\n dropdown.style.top = `${relativeTop}px`;\n dropdown.style.width = `${idealWidth}px`;\n dropdown.style.maxHeight = `${maxDropdownHeight}px`;\n dropdown.style.overflowY = 'auto';\n dropdown.style.zIndex = '10000';\n dropdown.style.boxShadow = '0 2px 8px rgba(0, 0, 0, 0.15)';\n }\n };\n\n // 附加自动补全到输入框\n this.formulaAutocomplete.attachTo(\n this.element,\n item => {\n // 当选择项目时的回调函数\n this.handleAutocompleteSelect(item);\n },\n customPositioning\n );\n }\n\n /**\n * 处理自动补全选择\n */\n private handleAutocompleteSelect(item: any): void {\n if (!this.element || !this.sheet) {\n return;\n }\n this.element.value = '=' + item.value;\n // 同步内容到顶部输入栏\n this.sheet.formulaUIManager.formulaInput.value = this.element.value;\n\n // 触发高亮更新\n const highlightManager = this.sheet.formulaManager.cellHighlightManager;\n if (highlightManager && this.element.value.startsWith('=')) {\n highlightManager.highlightFormulaCells(this.element.value);\n }\n }\n\n /**\n * 开始编辑\n * 重写父类方法\n */\n onStart(context: EditContext<string>): void {\n // 获取公式\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: this.sheet.getActiveSheet()?.getKey() || '',\n row: context.row,\n col: context.col\n });\n if (formula) {\n context.value = formula;\n }\n super.onStart(context);\n this.sheet.formulaManager.inputingElement = this.element;\n // 如果是公式,显示公式而不是计算结果\n if (this.sheet && typeof context.value === 'string') {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: this.sheet.getActiveSheet()?.getKey() || '',\n row: context.row,\n col: context.col\n });\n\n if (formula) {\n this.setValue(formula);\n // 触发高亮\n const highlightManager = this.sheet.formulaManager.cellHighlightManager;\n if (highlightManager) {\n highlightManager.highlightFormulaCells(formula);\n }\n }\n }\n }\n beforeEnd(): void {\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n /**\n * 结束编辑\n * 重写父类方法以清理自动补全\n */\n onEnd(): void {\n if (this.formulaAutocomplete) {\n this.formulaAutocomplete.release();\n this.formulaAutocomplete = null;\n }\n if (this.sheet) {\n const highlightManager = this.sheet.formulaManager.cellHighlightManager;\n if (highlightManager) {\n highlightManager.clearHighlights();\n }\n }\n //解绑所有事件\n // 解绑事件(在需要解绑的地方)\n this.eventHandlers.forEach(({ type, handler }) => {\n this.element.removeEventListener(type, handler);\n });\n super.onEnd();\n }\n\n /**\n * 获取编辑器的值\n */\n getValue(): string {\n return this.element?.value || '';\n }\n\n validateValue(\n newValue?: any,\n oldValue?: any,\n position?: VTable_editors.CellAddress,\n table?: any,\n isClickOnTable?: boolean\n ): boolean | VTable_editors.ValidateEnum {\n // 判断点击到表格其他单元格,且输入了公式,则检查公式是否完整\n if (isClickOnTable && newValue && newValue.startsWith('=')) {\n // 如果有sheet实例,使用FormulaManager检查公式完整性\n if (this.sheet) {\n const formulaInput = this.element;\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (this.sheet.formulaManager.inputIsParamMode.inParamMode) {\n // // 如果公式不完整,不退出编辑状态 TODO 这里不应该只判断完整性,如这种情况下按住ctrl连续点选 =SUM(H5) 这种情况应该允许继续编辑输入点选单元格范围\n // if (!formulaManager.isFormulaComplete(newValue)) {\n\n this.sheet.formulaManager.formulaWorkingOnCell = this.sheet.getActiveSheet()?.editingCell;\n\n return VTable_editors.ValidateEnum.validateNotExit;\n }\n return VTable_editors.ValidateEnum.validateExit;\n }\n // 如果没有sheet实例,使用简单的括号匹配检查\n const openParenCount = (newValue.match(/\\(/g) || []).length;\n const closeParenCount = (newValue.match(/\\)/g) || []).length;\n if (openParenCount !== closeParenCount) {\n return VTable_editors.ValidateEnum.validateNotExit;\n }\n }\n return true;\n }\n\n /**\n * 将选中的单元格范围转换为公式引用字符串\n * 例如:A1:B3\n */\n private getCellRangeString(range: {\n start: { col: number; row: number };\n end: { col: number; row: number };\n }): string {\n if (!range || !range.start || !range.end) {\n return '';\n }\n\n // 将列索引转换为字母表示(0->A, 1->B, 等)\n const colToLetter = (col: number): string => {\n let letter = '';\n while (col >= 0) {\n letter = String.fromCharCode(65 + (col % 26)) + letter;\n col = Math.floor(col / 26) - 1;\n }\n return letter;\n };\n\n const startCol = colToLetter(range.start.col);\n const startRow = range.start.row + 1; // 行索引从1开始\n const endCol = colToLetter(range.end.col);\n const endRow = range.end.row + 1;\n\n // 如果是单个单元格\n if (startCol === endCol && startRow === endRow) {\n return `${startCol}${startRow}`;\n }\n\n // 如果是范围\n return `${startCol}${startRow}:${endCol}${endRow}`;\n }\n}\n\nexport const formulaEditor = new FormulaInputEditor();\n"]}
1
+ {"version":3,"sources":["../src/formula/formula-editor.ts"],"names":[],"mappings":"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","file":"formula-editor.js","sourcesContent":["import * as VTable_editors from '@visactor/vtable-editors';\nimport { FormulaAutocomplete } from './formula-autocomplete';\nimport type VTableSheet from '../components/vtable-sheet';\nimport type { EditContext } from '@visactor/vtable-editors';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\nexport class FormulaInputEditor extends VTable_editors.InputEditor {\n private formulaAutocomplete: FormulaAutocomplete | null = null;\n private sheet: VTableSheet | null = null;\n // 定义存储事件处理函数的数组\n private eventHandlers: Array<{ type: string; handler: EventListener }> = [];\n /**\n * 设置 Sheet 实例\n */\n setSheet(sheet: VTableSheet): void {\n this.sheet = sheet;\n }\n getInputElement(): HTMLInputElement {\n return this.element;\n }\n targetIsOnEditor(target: HTMLElement): boolean {\n return target === this.element || target === this.sheet.formulaUIManager.formulaInput;\n }\n /**\n * 创建编辑器元素\n * 重写父类方法以添加自动补全功能\n */\n createElement(): void {\n super.createElement();\n\n if (this.element && this.sheet) {\n const events = ['click', 'mouseup', 'keyup', 'select', 'input', 'focus'];\n events.forEach(eventType => {\n const handler = (e: Event) => {\n const cursorPos = this.element.selectionStart;\n if (cursorPos !== null && cursorPos !== undefined) {\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput = cursorPos;\n this.sheet.formulaManager.inputingElement = this.element;\n }\n };\n\n this.element.addEventListener(eventType, handler);\n this.eventHandlers.push({ type: eventType, handler });\n });\n\n // 添加输入事件监听\n const inputHandler = (e: Event) => {\n this.handleFormulaInput(e);\n };\n this.element.addEventListener('input', inputHandler);\n this.eventHandlers.push({ type: 'input', handler: inputHandler });\n\n // 延迟初始化自动补全\n setTimeout(() => {\n this.initAutocomplete();\n }, 50);\n }\n }\n\n /**\n * 处理公式输入\n */\n private handleFormulaInput(event: Event): void {\n if (!this.sheet || !this.element) {\n return;\n }\n\n const value = this.element.value;\n // 同步内容到顶部输入栏\n this.sheet.formulaUIManager.formulaInput.value = value;\n // const inputEvent = new Event('input', { bubbles: true });\n // Object.defineProperty(inputEvent, 'isFormulaInsertion', { value: true });\n // this.sheet.formulaUIManager.formulaInput.dispatchEvent(inputEvent);\n // 获取高亮管理器\n const highlightManager = this.sheet.formulaManager.cellHighlightManager;\n\n if (highlightManager) {\n if (value.startsWith('=')) {\n highlightManager.highlightFormulaCells(value);\n } else {\n highlightManager.clearHighlights();\n }\n }\n }\n\n /**\n * 初始化自动补全\n */\n private initAutocomplete(): void {\n if (!this.sheet || !this.element) {\n return;\n }\n\n // 清理之前的实例\n if (this.formulaAutocomplete) {\n this.formulaAutocomplete.release();\n this.formulaAutocomplete = null;\n }\n\n const tableContainer = this.sheet.getContentElement();\n\n this.formulaAutocomplete = new FormulaAutocomplete(tableContainer, this.sheet);\n\n // 自定义定位逻辑\n const customPositioning = () => {\n if (!this.formulaAutocomplete || !this.element) {\n return;\n }\n\n // 获取编辑器元素和容器的位置信息\n const inputRect = this.element.getBoundingClientRect();\n const containerRect = tableContainer.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n\n // 计算相对于表格容器的位置\n const relativeLeft = inputRect.left - containerRect.left;\n\n // 计算下拉框的最大高度和理想宽度\n const maxDropdownHeight = 250; // 最大高度限制\n const idealWidth = Math.max(300, inputRect.width); // 理想宽度\n\n // 计算下拉框在下方显示时的顶部位置\n let relativeTop = inputRect.bottom - containerRect.top + 2;\n\n // 检查是否有足够空间在下方显示下拉框\n const spaceBelow = windowHeight - inputRect.bottom;\n const spaceAbove = inputRect.top;\n\n // 判断应该将下拉框放在输入框的上方还是下方\n if (spaceBelow < maxDropdownHeight && spaceAbove > spaceBelow) {\n // 空间不足且上方空间更大,则放在上方\n relativeTop = inputRect.top - containerRect.top - maxDropdownHeight - 2;\n }\n\n // 确保下拉框不会超出容器底部\n const bottomOverflow = relativeTop + maxDropdownHeight - containerRect.height;\n if (bottomOverflow > 0) {\n relativeTop = Math.max(0, relativeTop - bottomOverflow);\n }\n\n // 确保下拉框不会超出容器顶部\n if (relativeTop < 0) {\n relativeTop = 0;\n }\n\n // 设置下拉框位置和样式\n const dropdown = (this.formulaAutocomplete as any).dropdown;\n if (dropdown) {\n dropdown.style.position = 'absolute';\n dropdown.style.left = `${Math.max(0, relativeLeft)}px`;\n dropdown.style.top = `${relativeTop}px`;\n dropdown.style.width = `${idealWidth}px`;\n dropdown.style.maxHeight = `${maxDropdownHeight}px`;\n dropdown.style.overflowY = 'auto';\n dropdown.style.zIndex = '10000';\n dropdown.style.boxShadow = '0 2px 8px rgba(0, 0, 0, 0.15)';\n }\n };\n\n // 附加自动补全到输入框\n this.formulaAutocomplete.attachTo(\n this.element,\n item => {\n // 当选择项目时的回调函数\n this.handleAutocompleteSelect(item);\n },\n customPositioning\n );\n }\n\n /**\n * 处理自动补全选择\n */\n private handleAutocompleteSelect(item: any): void {\n if (!this.element || !this.sheet) {\n return;\n }\n this.element.value = '=' + item.value;\n // 同步内容到顶部输入栏\n this.sheet.formulaUIManager.formulaInput.value = this.element.value;\n\n // 触发高亮更新\n const highlightManager = this.sheet.formulaManager.cellHighlightManager;\n if (highlightManager && this.element.value.startsWith('=')) {\n highlightManager.highlightFormulaCells(this.element.value);\n }\n }\n\n /**\n * 开始编辑\n * 重写父类方法\n */\n onStart(context: EditContext<string>): void {\n // 获取公式\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: this.sheet.getActiveSheet()?.getKey() || '',\n row: context.row,\n col: context.col\n });\n if (formula) {\n context.value = formula;\n }\n super.onStart(context);\n this.sheet.formulaManager.inputingElement = this.element;\n // 如果是公式,显示公式而不是计算结果\n if (this.sheet && typeof context.value === 'string') {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: this.sheet.getActiveSheet()?.getKey() || '',\n row: context.row,\n col: context.col\n });\n\n if (formula) {\n this.setValue(formula);\n // 触发高亮\n const highlightManager = this.sheet.formulaManager.cellHighlightManager;\n if (highlightManager) {\n highlightManager.highlightFormulaCells(formula);\n }\n }\n }\n }\n beforeEnd(): void {\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n /**\n * 结束编辑\n * 重写父类方法以清理自动补全\n */\n onEnd(): void {\n if (this.formulaAutocomplete) {\n this.formulaAutocomplete.release();\n this.formulaAutocomplete = null;\n }\n if (this.sheet) {\n const highlightManager = this.sheet.formulaManager.cellHighlightManager;\n if (highlightManager) {\n highlightManager.clearHighlights();\n }\n }\n //解绑所有事件\n // 解绑事件(在需要解绑的地方)\n this.element &&\n this.eventHandlers.forEach(({ type, handler }) => {\n this.element.removeEventListener(type, handler);\n });\n super.onEnd();\n }\n\n /**\n * 获取编辑器的值\n */\n getValue(): string {\n return this.element?.value || '';\n }\n\n validateValue(\n newValue?: any,\n oldValue?: any,\n position?: VTable_editors.CellAddress,\n table?: any,\n isClickOnTable?: boolean\n ): boolean | VTable_editors.ValidateEnum {\n // 判断点击到表格其他单元格,且输入了公式,则检查公式是否完整\n if (isClickOnTable && newValue && newValue.startsWith('=')) {\n // 如果有sheet实例,使用FormulaManager检查公式完整性\n if (this.sheet) {\n const formulaInput = this.element;\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (this.sheet.formulaManager.inputIsParamMode.inParamMode) {\n // // 如果公式不完整,不退出编辑状态 TODO 这里不应该只判断完整性,如这种情况下按住ctrl连续点选 =SUM(H5) 这种情况应该允许继续编辑输入点选单元格范围\n // if (!formulaManager.isFormulaComplete(newValue)) {\n\n this.sheet.formulaManager.formulaWorkingOnCell = this.sheet.getActiveSheet()?.editingCell;\n\n return VTable_editors.ValidateEnum.validateNotExit;\n }\n return VTable_editors.ValidateEnum.validateExit;\n }\n // 如果没有sheet实例,使用简单的括号匹配检查\n const openParenCount = (newValue.match(/\\(/g) || []).length;\n const closeParenCount = (newValue.match(/\\)/g) || []).length;\n if (openParenCount !== closeParenCount) {\n return VTable_editors.ValidateEnum.validateNotExit;\n }\n }\n return true;\n }\n\n /**\n * 将选中的单元格范围转换为公式引用字符串\n * 例如:A1:B3\n */\n private getCellRangeString(range: {\n start: { col: number; row: number };\n end: { col: number; row: number };\n }): string {\n if (!range || !range.start || !range.end) {\n return '';\n }\n\n // 将列索引转换为字母表示(0->A, 1->B, 等)\n const colToLetter = (col: number): string => {\n let letter = '';\n while (col >= 0) {\n letter = String.fromCharCode(65 + (col % 26)) + letter;\n col = Math.floor(col / 26) - 1;\n }\n return letter;\n };\n\n const startCol = colToLetter(range.start.col);\n const startRow = range.start.row + 1; // 行索引从1开始\n const endCol = colToLetter(range.end.col);\n const endRow = range.end.row + 1;\n\n // 如果是单个单元格\n if (startCol === endCol && startRow === endRow) {\n return `${startCol}${startRow}`;\n }\n\n // 如果是范围\n return `${startCol}${startRow}:${endCol}${endRow}`;\n }\n}\n\nexport const formulaEditor = new FormulaInputEditor();\n"]}
package/cjs/index.d.ts CHANGED
@@ -2,5 +2,5 @@ import VTableSheet from './components/vtable-sheet';
2
2
  import type { ISheetDefine, IVTableSheetOptions } from './ts-types';
3
3
  import * as TYPES from './ts-types';
4
4
  import * as VTable from './vtable';
5
- export declare const version = "1.22.9";
5
+ export declare const version = "1.22.10-alpha.1";
6
6
  export { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };
package/cjs/index.js CHANGED
@@ -47,4 +47,4 @@ exports.VTable = VTable;
47
47
 
48
48
  const style_manager_1 = require("./styles/style-manager");
49
49
 
50
- exports.version = "1.22.9", (0, style_manager_1.importStyles)();
50
+ exports.version = "1.22.10-alpha.1", (0, style_manager_1.importStyles)();
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6EAAoD;AAW3C,sBAXF,sBAAW,CAWE;AATpB,kDAAoC;AASd,sBAAK;AAR3B,iDAAmC;AAQN,wBAAM;AAPnC,0DAAsD;AACzC,QAAA,OAAO,GAAG,QAAQ,CAAC;AAEhC,IAAA,4BAAY,GAAE,CAAC","file":"index.js","sourcesContent":["import VTableSheet from './components/vtable-sheet';\nimport type { ISheetDefine, IVTableSheetOptions } from './ts-types';\nimport * as TYPES from './ts-types';\nimport * as VTable from './vtable';\nimport { importStyles } from './styles/style-manager';\nexport const version = \"1.22.9\";\n// 导入样式\nimportStyles();\n/**\n * @namespace VTableSheet\n */\nexport { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6EAAoD;AAW3C,sBAXF,sBAAW,CAWE;AATpB,kDAAoC;AASd,sBAAK;AAR3B,iDAAmC;AAQN,wBAAM;AAPnC,0DAAsD;AACzC,QAAA,OAAO,GAAG,iBAAiB,CAAC;AAEzC,IAAA,4BAAY,GAAE,CAAC","file":"index.js","sourcesContent":["import VTableSheet from './components/vtable-sheet';\nimport type { ISheetDefine, IVTableSheetOptions } from './ts-types';\nimport * as TYPES from './ts-types';\nimport * as VTable from './vtable';\nimport { importStyles } from './styles/style-manager';\nexport const version = \"1.22.10-alpha.1\";\n// 导入样式\nimportStyles();\n/**\n * @namespace VTableSheet\n */\nexport { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };\n"]}
@@ -2922,25 +2922,48 @@
2922
2922
 
2923
2923
  class InputEditor {
2924
2924
  constructor(editorConfig) {
2925
- this.editorType = "Input", this.editorConfig = editorConfig;
2925
+ this.editorType = "Input", this.eventHandlers = [], this.editorConfig = editorConfig;
2926
2926
  }
2927
2927
  getInputElement() {
2928
2928
  return this.element;
2929
2929
  }
2930
2930
  createElement() {
2931
2931
  var _a;
2932
+ this.eventHandlers = [];
2932
2933
  const input = document.createElement("input");
2933
- input.setAttribute("type", "text"), (null === (_a = this.editorConfig) || void 0 === _a ? void 0 : _a.readonly) && input.setAttribute("readonly", `${this.editorConfig.readonly}`), input.style.position = "absolute", input.style.padding = "4px", input.style.width = "100%", input.style.boxSizing = "border-box", input.style.backgroundColor = "#FFFFFF", input.style.borderRadius = "0px", input.style.border = "2px solid #d9d9d9", input.addEventListener("focus", () => {
2934
+ input.setAttribute("type", "text"), (null === (_a = this.editorConfig) || void 0 === _a ? void 0 : _a.readonly) && input.setAttribute("readonly", `${this.editorConfig.readonly}`), input.style.position = "absolute", input.style.padding = "4px", input.style.width = "100%", input.style.boxSizing = "border-box", input.style.backgroundColor = "#FFFFFF", input.style.borderRadius = "0px", input.style.border = "2px solid #d9d9d9";
2935
+ const focusHandler = () => {
2934
2936
  input.style.borderColor = "#4A90E2", input.style.outline = "none";
2935
- }), input.addEventListener("blur", e => {
2936
- if (input.style.borderColor = "#d9d9d9", this.table && "0" === this.element.style.opacity) {
2937
+ };
2938
+ input.addEventListener("focus", focusHandler), this.eventHandlers.push({
2939
+ type: "focus",
2940
+ handler: focusHandler
2941
+ });
2942
+ const blurHandler = e => {
2943
+ if (input.style.borderColor = "#d9d9d9", this.table && this.element && "0" === this.element.style.opacity) {
2937
2944
  const selectCell = this.table.stateManager.select.cellPos;
2938
2945
  selectCell.col === this.col && selectCell.row === this.row || this.onEnd();
2939
2946
  }
2940
- }), this.element = input, this.container.appendChild(input), input.addEventListener("keydown", e => {
2941
- "a" === e.key && (e.ctrlKey || e.metaKey) && e.stopPropagation();
2942
- }), input.addEventListener("wheel", e => {
2947
+ };
2948
+ input.addEventListener("blur", blurHandler), this.eventHandlers.push({
2949
+ type: "blur",
2950
+ handler: blurHandler
2951
+ }), this.element = input, this.container.appendChild(input);
2952
+ const keydownHandler = e => {
2953
+ var _a;
2954
+ const keyboardEvent = e;
2955
+ "a" === keyboardEvent.key && (keyboardEvent.ctrlKey || keyboardEvent.metaKey) && (null === (_a = this.table.editorManager) || void 0 === _a ? void 0 : _a.editingEditor) && keyboardEvent.stopPropagation();
2956
+ };
2957
+ input.addEventListener("keydown", keydownHandler), this.eventHandlers.push({
2958
+ type: "keydown",
2959
+ handler: keydownHandler
2960
+ });
2961
+ const wheelHandler = e => {
2943
2962
  e.preventDefault();
2963
+ };
2964
+ input.addEventListener("wheel", wheelHandler), this.eventHandlers.push({
2965
+ type: "wheel",
2966
+ handler: wheelHandler
2944
2967
  });
2945
2968
  }
2946
2969
  setValue(value) {
@@ -2958,7 +2981,7 @@
2958
2981
  }) {
2959
2982
  this.container = container, this.table = table, this.col = col, this.row = row;
2960
2983
  const selectCell = this.table.stateManager.select.cellPos;
2961
- selectCell.col === this.col && selectCell.row === this.row && (this.element || this.createElement(), this.element.style.opacity = "0", this.element.style.pointerEvents = "none", (null == referencePosition ? void 0 : referencePosition.rect) && this.adjustPosition(referencePosition.rect), this.element.focus());
2984
+ selectCell.col === this.col && selectCell.row === this.row && (this.element ? container.contains(this.element) || (this.element.parentElement.removeChild(this.element), this.container.appendChild(this.element)) : this.createElement(), this.element.style.opacity = "0", this.element.style.pointerEvents = "none", (null == referencePosition ? void 0 : referencePosition.rect) && this.adjustPosition(referencePosition.rect), this.element.focus());
2962
2985
  }
2963
2986
  onStart({
2964
2987
  value: value,
@@ -2969,7 +2992,7 @@
2969
2992
  col: col,
2970
2993
  row: row
2971
2994
  }) {
2972
- this.container = container, this.successCallback = endEdit, this.table = table, this.col = col, this.row = row, this.element || (this.createElement(), (null == referencePosition ? void 0 : referencePosition.rect) && this.adjustPosition(referencePosition.rect)), null != value && this.setValue(value), this.element.style.opacity = "1", this.element.style.pointerEvents = "auto", this.element.focus();
2995
+ this.container = container, this.successCallback = endEdit, this.table = table, this.col = col, this.row = row, this.element ? container.contains(this.element) || (this.element.parentElement.removeChild(this.element), this.container.appendChild(this.element)) : (this.createElement(), (null == referencePosition ? void 0 : referencePosition.rect) && this.adjustPosition(referencePosition.rect)), null != value && this.setValue(value), this.element.style.opacity = "1", this.element.style.pointerEvents = "auto", this.element.focus();
2973
2996
  }
2974
2997
  adjustPosition(rect) {
2975
2998
  const top = rect.top - 1,
@@ -2980,8 +3003,21 @@
2980
3003
  }
2981
3004
  endEditing() {}
2982
3005
  onEnd() {
2983
- var _a;
2984
- (null === (_a = this.container) || void 0 === _a ? void 0 : _a.contains(this.element)) && (this.container.removeChild(this.element), this.element = void 0);
3006
+ if (!this.element) return;
3007
+ const element = this.element;
3008
+ this.eventHandlers.forEach(({
3009
+ type: type,
3010
+ handler: handler
3011
+ }) => {
3012
+ element.removeEventListener(type, handler);
3013
+ }), this.eventHandlers = [];
3014
+ const parentNode = element.parentNode;
3015
+ if (parentNode) try {
3016
+ parentNode.removeChild(element);
3017
+ } catch (error) {
3018
+ if (error instanceof Error && "NotFoundError" !== error.name) throw error;
3019
+ }
3020
+ this.element = void 0;
2985
3021
  }
2986
3022
  isEditorElement(target) {
2987
3023
  return target === this.element;
@@ -59981,7 +60017,7 @@
59981
60017
  }
59982
60018
  constructor(container, options = {}) {
59983
60019
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z;
59984
- if (super(), this.showFrozenIcon = !0, this.version = "1.22.9", this.id = `VTable${Date.now()}`, this.isReleased = !1, this._chartEventMap = {}, this.throttleInvalidate = throttle2(this.render.bind(this), 200), "node" === Env$1.mode ? (options = container, container = null) : container instanceof HTMLElement || (options = container, container = container.container ? container.container : null), !container && "node" !== options.mode && !options.canvas) throw new Error("vtable's container is undefined");
60020
+ if (super(), this.showFrozenIcon = !0, this.version = "1.22.10-alpha.1", this.id = `VTable${Date.now()}`, this.isReleased = !1, this._chartEventMap = {}, this.throttleInvalidate = throttle2(this.render.bind(this), 200), "node" === Env$1.mode ? (options = container, container = null) : container instanceof HTMLElement || (options = container, container = container.container ? container.container : null), !container && "node" !== options.mode && !options.canvas) throw new Error("vtable's container is undefined");
59985
60021
  this.pluginManager = new PluginManager(this, options), this.fireListeners(TABLE_EVENT_TYPE.BEFORE_INIT, {
59986
60022
  options: options,
59987
60023
  container: container
@@ -65060,6 +65096,10 @@
65060
65096
  var _a, _b;
65061
65097
  const lastSelectedCellEditor = this.editorManager.cacheLastSelectedCellEditor[`${col}-${row}`];
65062
65098
  if (lastSelectedCellEditor) return lastSelectedCellEditor;
65099
+ Object.values(this.editorManager.cacheLastSelectedCellEditor).forEach(editor => {
65100
+ var _a;
65101
+ return null === (_a = editor.onEnd) || void 0 === _a ? void 0 : _a.call(editor);
65102
+ }), this.editorManager.cacheLastSelectedCellEditor = {};
65063
65103
  const define = this.getBodyColumnDefine(col, row);
65064
65104
  let editor = this.isHeader(col, row) ? null !== (_a = null == define ? void 0 : define.headerEditor) && void 0 !== _a ? _a : this.options.headerEditor : null !== (_b = null == define ? void 0 : define.editor) && void 0 !== _b ? _b : this.options.editor;
65065
65105
  if ("function" == typeof editor) {
@@ -65071,7 +65111,7 @@
65071
65111
  table: this
65072
65112
  });
65073
65113
  }
65074
- return "string" == typeof editor && (editor = get(editor)), this.editorManager.cacheLastSelectedCellEditor = {}, this.editorManager.cacheLastSelectedCellEditor[`${col}-${row}`] = editor, editor;
65114
+ return "string" == typeof editor && (editor = get(editor)), this.editorManager.cacheLastSelectedCellEditor[`${col}-${row}`] = editor, editor;
65075
65115
  }
65076
65116
  isHasEditorDefine(col, row) {
65077
65117
  var _a, _b;
@@ -69373,7 +69413,10 @@
69373
69413
  if (!this.table.editorManager.editingEditor || eventKey !== ExcelEditCellKeyboardResponse.ENTER && eventKey !== ExcelEditCellKeyboardResponse.TAB) {
69374
69414
  if (!this.table.editorManager.editingEditor && (eventKey === ExcelEditCellKeyboardResponse.DELETE || eventKey === ExcelEditCellKeyboardResponse.BACKSPACE)) {
69375
69415
  const selectCells = this.table.getSelectedCellInfos();
69376
- (null == selectCells ? void 0 : selectCells.length) > 0 && document.activeElement === this.table.getElement() && (deleteSelectRange(selectCells, this.table, null === (_c = null === (_b = this.pluginOptions) || void 0 === _b ? void 0 : _b.deleteWorkOnEditableCell) || void 0 === _c || _c), event.stopPropagation(), event.preventDefault());
69416
+ (null == selectCells ? void 0 : selectCells.length) > 0 && (document.activeElement === this.table.getElement() || Object.values(this.table.editorManager.cacheLastSelectedCellEditor || {}).some(editor => {
69417
+ var _a;
69418
+ return (null === (_a = editor.getInputElement) || void 0 === _a ? void 0 : _a.call(editor)) === document.activeElement;
69419
+ })) && (deleteSelectRange(selectCells, this.table, null === (_c = null === (_b = this.pluginOptions) || void 0 === _b ? void 0 : _b.deleteWorkOnEditableCell) || void 0 === _c || _c), event.stopPropagation(), event.preventDefault());
69377
69420
  }
69378
69421
  } else this.table.editorManager.completeEdit(), this.table.getElement().focus(), eventKey === ExcelEditCellKeyboardResponse.ENTER ? this.table.selectCell(col, row + 1) : eventKey === ExcelEditCellKeyboardResponse.TAB && this.table.selectCell(col + 1, row), event.stopPropagation(), event.preventDefault();
69379
69422
  }
@@ -84424,9 +84467,10 @@
84424
84467
  highlightManager.clearHighlights();
84425
84468
  }
84426
84469
  }
84427
- this.eventHandlers.forEach(({ type, handler }) => {
84428
- this.element.removeEventListener(type, handler);
84429
- });
84470
+ this.element &&
84471
+ this.eventHandlers.forEach(({ type, handler }) => {
84472
+ this.element.removeEventListener(type, handler);
84473
+ });
84430
84474
  super.onEnd();
84431
84475
  }
84432
84476
  getValue() {
@@ -90959,7 +91003,7 @@
90959
91003
  importStyle();
90960
91004
  }
90961
91005
 
90962
- const version = "1.22.9";
91006
+ const version = "1.22.10-alpha.1";
90963
91007
  importStyles();
90964
91008
 
90965
91009
  exports.TYPES = index;