@visactor/vtable-sheet 1.20.2-alpha.0 → 1.20.3

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.
@@ -320,5 +320,4 @@ class WorkSheet extends event_target_1.EventTarget {
320
320
  }
321
321
  }
322
322
 
323
- exports.WorkSheet = WorkSheet;
324
- //# sourceMappingURL=WorkSheet.js.map
323
+ exports.WorkSheet = WorkSheet;
@@ -31,6 +31,7 @@ export declare class FormulaAutocomplete {
31
31
  private getTypeLabel;
32
32
  private positionDropdown;
33
33
  private handleKeydown;
34
+ private scrollToSelectedItem;
34
35
  private selectItem;
35
36
  private show;
36
37
  private hide;
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  }), exports.FormulaAutocomplete = void 0;
6
6
 
7
+ const vtable_plugins_1 = require("@visactor/vtable-plugins");
8
+
7
9
  class FormulaAutocomplete {
8
10
  constructor(container, sheet) {
9
11
  this.dropdown = null, this.items = [], this.selectedIndex = -1, this.isVisible = !1,
@@ -15,9 +17,9 @@ class FormulaAutocomplete {
15
17
  }
16
18
  attachTo(input, onSelect, customPositioning) {
17
19
  this.inputElement = input, this.onSelectCallback = onSelect, this.customPositioning = customPositioning,
18
- input.addEventListener("input", this.handleInput.bind(this)), input.addEventListener("keydown", this.handleKeydown.bind(this)),
20
+ input.addEventListener("input", this.handleInput.bind(this)), input.addEventListener("keydown", this.handleKeydown.bind(this), !0),
19
21
  input.addEventListener("blur", (() => {
20
- setTimeout((() => this.hide()), 200);
22
+ setTimeout((() => this.hide()), 10);
21
23
  }));
22
24
  }
23
25
  handleInput(event) {
@@ -150,7 +152,7 @@ class FormulaAutocomplete {
150
152
  const descEl = document.createElement("div");
151
153
  descEl.className = "item-description", descEl.textContent = item.description, itemEl.appendChild(descEl);
152
154
  }
153
- itemEl.addEventListener("click", (() => this.selectItem(globalIndex))), itemEl.addEventListener("mouseenter", (() => {
155
+ itemEl.addEventListener("mousedown", (() => this.selectItem(globalIndex))), itemEl.addEventListener("mouseenter", (() => {
154
156
  this.selectedIndex = globalIndex, this.renderDropdown();
155
157
  })), this.dropdown.appendChild(itemEl);
156
158
  }));
@@ -194,21 +196,34 @@ class FormulaAutocomplete {
194
196
  if (this.isVisible) switch (event.key) {
195
197
  case "ArrowDown":
196
198
  event.preventDefault(), this.selectedIndex = Math.min(this.selectedIndex + 1, this.items.length - 1),
197
- this.renderDropdown();
199
+ this.renderDropdown(), this.scrollToSelectedItem();
198
200
  break;
199
201
 
200
202
  case "ArrowUp":
201
203
  event.preventDefault(), this.selectedIndex = Math.max(this.selectedIndex - 1, 0),
202
- this.renderDropdown();
204
+ this.renderDropdown(), this.scrollToSelectedItem();
203
205
  break;
204
206
 
205
207
  case "Enter":
206
- case "Tab":
207
208
  this.selectedIndex >= 0 && (event.preventDefault(), this.selectItem(this.selectedIndex));
208
209
  break;
209
210
 
210
211
  case "Escape":
211
- this.hide();
212
+ event.preventDefault(), this.hide(), this.inputElement && this.inputElement.focus();
213
+ break;
214
+
215
+ case "Tab":
216
+ this.selectedIndex >= 0 ? (event.preventDefault(), this.selectItem(this.selectedIndex)) : this.hide();
217
+ }
218
+ }
219
+ scrollToSelectedItem() {
220
+ if (!this.dropdown || this.selectedIndex < 0) return;
221
+ const items = this.dropdown.querySelectorAll(".vtable-formula-autocomplete-item");
222
+ if (items[this.selectedIndex]) {
223
+ items[this.selectedIndex].scrollIntoView({
224
+ behavior: "smooth",
225
+ block: "nearest"
226
+ });
212
227
  }
213
228
  }
214
229
  selectItem(index) {
@@ -219,15 +234,27 @@ class FormulaAutocomplete {
219
234
  this.inputElement.value = newValue;
220
235
  const newCursorPos = context.insertPosition + item.value.length + ("function" === item.type ? 1 : 0);
221
236
  this.inputElement.setSelectionRange(newCursorPos, newCursorPos);
237
+ const inputEvent = new Event("input", {
238
+ bubbles: !0
239
+ });
240
+ this.inputElement.dispatchEvent(inputEvent);
222
241
  }
223
- this.hide();
242
+ this.hide(), this.inputElement && setTimeout((() => {
243
+ this.inputElement.focus();
244
+ }), 50);
224
245
  }
225
246
  }
226
247
  show() {
227
- this.dropdown && this.items.length > 0 && (this.dropdown.style.display = "block",
228
- this.isVisible = !0, this.selectedIndex = 0, this.renderDropdown());
248
+ if (this.dropdown && this.items.length > 0) {
249
+ const excelEditCellKeyboardPlugin = this.sheet.getActiveSheet().tableInstance.pluginManager.getPlugin("excel-edit-cell-keyboard");
250
+ excelEditCellKeyboardPlugin && excelEditCellKeyboardPlugin.deleteResponseKeyboard([ vtable_plugins_1.ExcelEditCellKeyboardResponse.ARROW_DOWN, vtable_plugins_1.ExcelEditCellKeyboardResponse.ARROW_UP, vtable_plugins_1.ExcelEditCellKeyboardResponse.ENTER ]),
251
+ this.dropdown.style.display = "block", this.isVisible = !0, this.selectedIndex = 0,
252
+ this.renderDropdown();
253
+ }
229
254
  }
230
255
  hide() {
256
+ const excelEditCellKeyboardPlugin = this.sheet.getActiveSheet().tableInstance.pluginManager.getPlugin("excel-edit-cell-keyboard");
257
+ excelEditCellKeyboardPlugin && excelEditCellKeyboardPlugin.addResponseKeyboard([ vtable_plugins_1.ExcelEditCellKeyboardResponse.ARROW_DOWN, vtable_plugins_1.ExcelEditCellKeyboardResponse.ARROW_UP, vtable_plugins_1.ExcelEditCellKeyboardResponse.ENTER ]),
231
258
  this.dropdown && (this.dropdown.style.display = "none", this.isVisible = !1, this.selectedIndex = -1);
232
259
  }
233
260
  release() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula/formula-autocomplete.ts"],"names":[],"mappings":"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","file":"formula-autocomplete.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\n\ninterface AutocompleteItem {\n type: 'function' | 'cell' | 'range';\n value: string;\n label: string;\n description?: string;\n signature?: string;\n}\n\nexport class FormulaAutocomplete {\n private container: HTMLElement;\n private dropdown: HTMLElement | null = null;\n private items: AutocompleteItem[] = [];\n private selectedIndex: number = -1;\n private isVisible: boolean = false;\n private inputElement: HTMLInputElement | null = null;\n private sheet: VTableSheet;\n private onSelectCallback?: (item: AutocompleteItem) => void;\n\n private customPositioning?: () => void;\n\n constructor(container: HTMLElement, sheet: VTableSheet) {\n this.container = container;\n this.sheet = sheet;\n this.createDropdown();\n }\n\n /**\n * 创建下拉框元素\n */\n private createDropdown(): void {\n this.dropdown = document.createElement('div');\n this.dropdown.className = 'vtable-formula-autocomplete';\n this.dropdown.style.display = 'none';\n this.container.appendChild(this.dropdown);\n }\n\n /**\n * 绑定到输入框\n */\n attachTo(input: HTMLInputElement, onSelect?: (item: AutocompleteItem) => void, customPositioning?: () => void): void {\n this.inputElement = input;\n this.onSelectCallback = onSelect;\n this.customPositioning = customPositioning;\n\n // 绑定事件\n input.addEventListener('input', this.handleInput.bind(this));\n input.addEventListener('keydown', this.handleKeydown.bind(this));\n input.addEventListener('blur', () => {\n setTimeout(() => this.hide(), 200);\n });\n }\n\n /**\n * 处理输入事件\n */\n private handleInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = input.value;\n const cursorPos = input.selectionStart || 0;\n\n // 解析当前输入上下文\n const context = this.parseInputContext(value, cursorPos);\n\n if (context.shouldShowAutocomplete) {\n this.updateSuggestions(context);\n this.show();\n } else {\n this.hide();\n }\n }\n\n /**\n * 解析输入上下文\n */\n private parseInputContext(\n value: string,\n cursorPos: number\n ): {\n shouldShowAutocomplete: boolean;\n searchTerm: string;\n type: 'function' | 'cell' | 'all';\n insertPosition: number;\n } {\n // 如果不是公式,不显示\n if (!value.startsWith('=')) {\n return { shouldShowAutocomplete: false, searchTerm: '', type: 'all', insertPosition: 0 };\n }\n\n // 获取光标前的文本\n const textBeforeCursor = value.substring(1, cursorPos); // 去掉 '='\n\n // 查找最后一个函数或操作符\n const lastOperatorMatch = textBeforeCursor.match(/[\\+\\-\\*\\/\\(\\,\\s]([A-Za-z0-9]*)$/);\n\n if (lastOperatorMatch && lastOperatorMatch[1] !== '') {\n return {\n shouldShowAutocomplete: true,\n searchTerm: lastOperatorMatch[1],\n type: /^[A-Za-z]/.test(lastOperatorMatch[1]) ? 'function' : 'cell',\n insertPosition: cursorPos - lastOperatorMatch[1].length\n };\n }\n\n // 公式开始位置\n if (textBeforeCursor.match(/^[A-Za-z0-9]*$/)) {\n return {\n shouldShowAutocomplete: true,\n searchTerm: textBeforeCursor,\n type: 'all',\n insertPosition: 1\n };\n }\n\n return { shouldShowAutocomplete: false, searchTerm: '', type: 'all', insertPosition: 0 };\n }\n\n /**\n * 更新建议列表\n */\n private updateSuggestions(context: any): void {\n const { searchTerm, type } = context;\n this.items = [];\n\n // 获取函数列表\n if (type === 'function' || type === 'all') {\n const functions = this.sheet.formulaManager.getAvailableFunctions();\n const functionItems = functions\n .filter(fn => fn.toUpperCase().startsWith(searchTerm.toUpperCase()))\n .slice(0, 10) // 限制数量\n .map(fn => ({\n type: 'function' as const,\n value: fn,\n label: fn,\n description: this.getFunctionDescription(fn),\n signature: this.getFunctionSignature(fn)\n }));\n this.items.push(...functionItems);\n }\n\n // 添加单元格引用建议\n if (type === 'cell' || type === 'all') {\n const cellSuggestions = this.generateCellSuggestions(searchTerm);\n this.items.push(...cellSuggestions);\n }\n this.renderDropdown();\n }\n\n /**\n * 生成单元格引用建议\n */\n private generateCellSuggestions(searchTerm: string): AutocompleteItem[] {\n const suggestions: AutocompleteItem[] = [];\n\n // 如果是有效的部分单元格地址\n const cellMatch = searchTerm.match(/^([A-Za-z]*)([0-9]*)$/);\n if (cellMatch) {\n const [, colPart, rowPart] = cellMatch;\n\n // 生成列建议\n if (colPart && !rowPart) {\n // A -> A1, A2, A3...\n for (let row = 1; row <= 5; row++) {\n suggestions.push({\n type: 'cell',\n value: `${colPart.toUpperCase()}${row}`,\n label: `${colPart.toUpperCase()}${row}`,\n description: '单元格引用'\n });\n }\n }\n\n // 生成完整单元格建议\n if (colPart && rowPart) {\n const address = `${colPart.toUpperCase()}${rowPart}`;\n suggestions.push({\n type: 'cell',\n value: address,\n label: address,\n description: '单元格引用'\n });\n\n // 添加范围建议\n suggestions.push({\n type: 'range',\n value: `${address}:`,\n label: `${address}:...`,\n description: '开始选择范围'\n });\n }\n }\n\n return suggestions.slice(0, 5); // 限制建议数量\n }\n\n /**\n * 获取函数描述\n */\n private getFunctionDescription(functionName: string): string {\n const descriptions: Record<string, string> = {\n SUM: '计算数值总和',\n AVERAGE: '计算平均值',\n COUNT: '计数数值单元格',\n MAX: '返回最大值',\n MIN: '返回最小值',\n IF: '条件判断',\n VLOOKUP: '垂直查找',\n CONCATENATE: '连接文本'\n // ... 更多函数描述\n };\n return descriptions[functionName] || '';\n }\n\n /**\n * 获取函数签名\n */\n private getFunctionSignature(functionName: string): string {\n const signatures: Record<string, string> = {\n SUM: '(number1, [number2], ...)',\n AVERAGE: '(number1, [number2], ...)',\n COUNT: '(value1, [value2], ...)',\n MAX: '(number1, [number2], ...)',\n MIN: '(number1, [number2], ...)',\n IF: '(logical_test, value_if_true, value_if_false)',\n VLOOKUP: '(lookup_value, table_array, col_index_num, [range_lookup])',\n CONCATENATE: '(text1, [text2], ...)'\n // ... 更多函数签名\n };\n return signatures[functionName] || '()';\n }\n\n /**\n * 渲染下拉框\n */\n private renderDropdown(): void {\n if (!this.dropdown) {\n return;\n }\n\n this.dropdown.innerHTML = '';\n\n if (this.items.length === 0) {\n // 无结果提示\n const emptyEl = document.createElement('div');\n emptyEl.className = 'vtable-formula-autocomplete-empty';\n emptyEl.textContent = '没有匹配的函数';\n this.dropdown.appendChild(emptyEl);\n return;\n }\n\n // 按类型分组\n const groups = this.groupItems(this.items);\n\n groups.forEach(group => {\n // 添加分组标题\n if (groups.length > 1) {\n const groupEl = document.createElement('div');\n groupEl.className = 'vtable-formula-autocomplete-group';\n groupEl.textContent = this.getGroupTitle(group.type);\n this.dropdown.appendChild(groupEl);\n }\n\n // 渲染组内项目\n group.items.forEach((item, index) => {\n const globalIndex = this.items.indexOf(item);\n const itemEl = document.createElement('div');\n itemEl.className = 'vtable-formula-autocomplete-item';\n\n if (globalIndex === this.selectedIndex) {\n itemEl.classList.add('selected');\n }\n\n // 函数名和类型标签\n const nameEl = document.createElement('div');\n nameEl.className = 'item-name';\n\n const labelEl = document.createElement('span');\n labelEl.textContent = item.label;\n nameEl.appendChild(labelEl);\n\n const typeEl = document.createElement('span');\n typeEl.className = `item-type ${item.type}`;\n typeEl.textContent = this.getTypeLabel(item.type);\n nameEl.appendChild(typeEl);\n\n itemEl.appendChild(nameEl);\n\n // 函数签名\n if (item.signature) {\n const signatureEl = document.createElement('div');\n signatureEl.className = 'item-signature';\n signatureEl.textContent = item.signature;\n itemEl.appendChild(signatureEl);\n }\n\n // 描述\n if (item.description) {\n const descEl = document.createElement('div');\n descEl.className = 'item-description';\n descEl.textContent = item.description;\n itemEl.appendChild(descEl);\n }\n\n itemEl.addEventListener('click', () => this.selectItem(globalIndex));\n itemEl.addEventListener('mouseenter', () => {\n this.selectedIndex = globalIndex;\n this.renderDropdown();\n });\n\n this.dropdown.appendChild(itemEl);\n });\n });\n\n // 添加快捷键提示\n const footerEl = document.createElement('div');\n footerEl.className = 'vtable-formula-autocomplete-footer';\n footerEl.innerHTML = `\n <div class=\"shortcut\">\n <span class=\"key\">↑↓</span>\n <span>选择</span>\n </div>\n <div class=\"shortcut\">\n <span class=\"key\">Enter</span>\n <span>确认</span>\n </div>\n <div class=\"shortcut\">\n <span class=\"key\">Esc</span>\n <span>取消</span>\n </div>\n `;\n this.dropdown.appendChild(footerEl);\n\n this.positionDropdown();\n }\n\n /**\n * 对项目进行分组\n */\n private groupItems(items: AutocompleteItem[]): Array<{ type: string; items: AutocompleteItem[] }> {\n const groups: Record<string, AutocompleteItem[]> = {};\n\n items.forEach(item => {\n if (!groups[item.type]) {\n groups[item.type] = [];\n }\n groups[item.type].push(item);\n });\n\n // 按照优先级排序:function > cell > range\n const priority = ['function', 'cell', 'range'];\n return priority.filter(type => groups[type]).map(type => ({ type, items: groups[type] }));\n }\n\n /**\n * 获取分组标题\n */\n private getGroupTitle(type: string): string {\n const titles: Record<string, string> = {\n function: '函数',\n cell: '单元格',\n range: '范围'\n };\n return titles[type] || type;\n }\n\n /**\n * 获取类型标签\n */\n private getTypeLabel(type: string): string {\n const labels: Record<string, string> = {\n function: 'fx',\n cell: 'A1',\n range: 'A:B'\n };\n return labels[type] || type;\n }\n\n /**\n * 定位下拉框\n */\n private positionDropdown(): void {\n if (this.customPositioning) {\n this.customPositioning();\n return;\n }\n if (!this.dropdown || !this.inputElement) {\n return;\n }\n\n const inputRect = this.inputElement.getBoundingClientRect();\n const containerRect = this.container.getBoundingClientRect();\n\n this.dropdown.style.position = 'absolute';\n this.dropdown.style.left = `${inputRect.left - containerRect.left}px`;\n this.dropdown.style.top = `${inputRect.bottom - containerRect.top + 2}px`;\n this.dropdown.style.width = `${Math.max(300, inputRect.width)}px`;\n }\n\n /**\n * 处理键盘事件\n */\n private handleKeydown(event: KeyboardEvent): void {\n if (!this.isVisible) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.selectedIndex = Math.min(this.selectedIndex + 1, this.items.length - 1);\n this.renderDropdown();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.selectedIndex = Math.max(this.selectedIndex - 1, 0);\n this.renderDropdown();\n break;\n case 'Enter':\n if (this.selectedIndex >= 0) {\n event.preventDefault();\n this.selectItem(this.selectedIndex);\n }\n break;\n case 'Escape':\n this.hide();\n break;\n case 'Tab':\n if (this.selectedIndex >= 0) {\n event.preventDefault();\n this.selectItem(this.selectedIndex);\n }\n break;\n }\n }\n\n /**\n * 选择项目\n */\n private selectItem(index: number): void {\n const item = this.items[index];\n if (!item || !this.inputElement) {\n return;\n }\n\n if (this.onSelectCallback) {\n this.onSelectCallback(item);\n } else {\n // 默认插入行为\n const value = this.inputElement.value;\n const cursorPos = this.inputElement.selectionStart || 0;\n const context = this.parseInputContext(value, cursorPos);\n\n const newValue =\n value.substring(0, context.insertPosition) +\n item.value +\n (item.type === 'function' ? '(' : '') +\n value.substring(cursorPos);\n\n this.inputElement.value = newValue;\n\n // 设置光标位置\n const newCursorPos = context.insertPosition + item.value.length + (item.type === 'function' ? 1 : 0);\n this.inputElement.setSelectionRange(newCursorPos, newCursorPos);\n }\n\n this.hide();\n }\n\n /**\n * 显示下拉框\n */\n private show(): void {\n if (this.dropdown && this.items.length > 0) {\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n this.selectedIndex = 0;\n this.renderDropdown();\n }\n }\n\n /**\n * 隐藏下拉框\n */\n private hide(): void {\n if (this.dropdown) {\n this.dropdown.style.display = 'none';\n this.isVisible = false;\n this.selectedIndex = -1;\n }\n }\n\n /**\n * 销毁组件\n */\n release(): void {\n if (this.dropdown && this.dropdown.parentNode) {\n this.dropdown.parentNode.removeChild(this.dropdown);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/formula/formula-autocomplete.ts"],"names":[],"mappings":"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","file":"formula-autocomplete.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\nimport { ExcelEditCellKeyboardResponse } from '@visactor/vtable-plugins';\nimport type { ExcelEditCellKeyboardPlugin } from '@visactor/vtable-plugins';\n\ninterface AutocompleteItem {\n type: 'function' | 'cell' | 'range';\n value: string;\n label: string;\n description?: string;\n signature?: string;\n}\n\nexport class FormulaAutocomplete {\n private container: HTMLElement;\n private dropdown: HTMLElement | null = null;\n private items: AutocompleteItem[] = [];\n private selectedIndex: number = -1;\n private isVisible: boolean = false;\n private inputElement: HTMLInputElement | null = null;\n private sheet: VTableSheet;\n private onSelectCallback?: (item: AutocompleteItem) => void;\n\n private customPositioning?: () => void;\n\n constructor(container: HTMLElement, sheet: VTableSheet) {\n this.container = container;\n this.sheet = sheet;\n this.createDropdown();\n }\n\n /**\n * 创建下拉框元素\n */\n private createDropdown(): void {\n this.dropdown = document.createElement('div');\n this.dropdown.className = 'vtable-formula-autocomplete';\n this.dropdown.style.display = 'none';\n this.container.appendChild(this.dropdown);\n }\n\n /**\n * 绑定到输入框\n */\n attachTo(input: HTMLInputElement, onSelect?: (item: AutocompleteItem) => void, customPositioning?: () => void): void {\n this.inputElement = input;\n this.onSelectCallback = onSelect;\n this.customPositioning = customPositioning;\n\n // 绑定事件\n input.addEventListener('input', this.handleInput.bind(this));\n input.addEventListener('keydown', this.handleKeydown.bind(this), true);\n input.addEventListener('blur', () => {\n setTimeout(() => this.hide(), 10);\n });\n }\n\n /**\n * 处理输入事件\n */\n private handleInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = input.value;\n const cursorPos = input.selectionStart || 0;\n\n // 解析当前输入上下文\n const context = this.parseInputContext(value, cursorPos);\n\n if (context.shouldShowAutocomplete) {\n this.updateSuggestions(context);\n this.show();\n } else {\n this.hide();\n }\n }\n\n /**\n * 解析输入上下文\n */\n private parseInputContext(\n value: string,\n cursorPos: number\n ): {\n shouldShowAutocomplete: boolean;\n searchTerm: string;\n type: 'function' | 'cell' | 'all';\n insertPosition: number;\n } {\n // 如果不是公式,不显示\n if (!value.startsWith('=')) {\n return { shouldShowAutocomplete: false, searchTerm: '', type: 'all', insertPosition: 0 };\n }\n\n // 获取光标前的文本\n const textBeforeCursor = value.substring(1, cursorPos); // 去掉 '='\n\n // 查找最后一个函数或操作符\n const lastOperatorMatch = textBeforeCursor.match(/[\\+\\-\\*\\/\\(\\,\\s]([A-Za-z0-9]*)$/);\n\n if (lastOperatorMatch && lastOperatorMatch[1] !== '') {\n return {\n shouldShowAutocomplete: true,\n searchTerm: lastOperatorMatch[1],\n type: /^[A-Za-z]/.test(lastOperatorMatch[1]) ? 'function' : 'cell',\n insertPosition: cursorPos - lastOperatorMatch[1].length\n };\n }\n\n // 公式开始位置\n if (textBeforeCursor.match(/^[A-Za-z0-9]*$/)) {\n return {\n shouldShowAutocomplete: true,\n searchTerm: textBeforeCursor,\n type: 'all',\n insertPosition: 1\n };\n }\n\n return { shouldShowAutocomplete: false, searchTerm: '', type: 'all', insertPosition: 0 };\n }\n\n /**\n * 更新建议列表\n */\n private updateSuggestions(context: any): void {\n const { searchTerm, type } = context;\n this.items = [];\n\n // 获取函数列表\n if (type === 'function' || type === 'all') {\n const functions = this.sheet.formulaManager.getAvailableFunctions();\n const functionItems = functions\n .filter(fn => fn.toUpperCase().startsWith(searchTerm.toUpperCase()))\n .slice(0, 10) // 限制数量\n .map(fn => ({\n type: 'function' as const,\n value: fn,\n label: fn,\n description: this.getFunctionDescription(fn),\n signature: this.getFunctionSignature(fn)\n }));\n this.items.push(...functionItems);\n }\n\n // 添加单元格引用建议\n if (type === 'cell' || type === 'all') {\n const cellSuggestions = this.generateCellSuggestions(searchTerm);\n this.items.push(...cellSuggestions);\n }\n this.renderDropdown();\n }\n\n /**\n * 生成单元格引用建议\n */\n private generateCellSuggestions(searchTerm: string): AutocompleteItem[] {\n const suggestions: AutocompleteItem[] = [];\n\n // 如果是有效的部分单元格地址\n const cellMatch = searchTerm.match(/^([A-Za-z]*)([0-9]*)$/);\n if (cellMatch) {\n const [, colPart, rowPart] = cellMatch;\n\n // 生成列建议\n if (colPart && !rowPart) {\n // A -> A1, A2, A3...\n for (let row = 1; row <= 5; row++) {\n suggestions.push({\n type: 'cell',\n value: `${colPart.toUpperCase()}${row}`,\n label: `${colPart.toUpperCase()}${row}`,\n description: '单元格引用'\n });\n }\n }\n\n // 生成完整单元格建议\n if (colPart && rowPart) {\n const address = `${colPart.toUpperCase()}${rowPart}`;\n suggestions.push({\n type: 'cell',\n value: address,\n label: address,\n description: '单元格引用'\n });\n\n // 添加范围建议\n suggestions.push({\n type: 'range',\n value: `${address}:`,\n label: `${address}:...`,\n description: '开始选择范围'\n });\n }\n }\n\n return suggestions.slice(0, 5); // 限制建议数量\n }\n\n /**\n * 获取函数描述\n */\n private getFunctionDescription(functionName: string): string {\n const descriptions: Record<string, string> = {\n SUM: '计算数值总和',\n AVERAGE: '计算平均值',\n COUNT: '计数数值单元格',\n MAX: '返回最大值',\n MIN: '返回最小值',\n IF: '条件判断',\n VLOOKUP: '垂直查找',\n CONCATENATE: '连接文本'\n // ... 更多函数描述\n };\n return descriptions[functionName] || '';\n }\n\n /**\n * 获取函数签名\n */\n private getFunctionSignature(functionName: string): string {\n const signatures: Record<string, string> = {\n SUM: '(number1, [number2], ...)',\n AVERAGE: '(number1, [number2], ...)',\n COUNT: '(value1, [value2], ...)',\n MAX: '(number1, [number2], ...)',\n MIN: '(number1, [number2], ...)',\n IF: '(logical_test, value_if_true, value_if_false)',\n VLOOKUP: '(lookup_value, table_array, col_index_num, [range_lookup])',\n CONCATENATE: '(text1, [text2], ...)'\n // ... 更多函数签名\n };\n return signatures[functionName] || '()';\n }\n\n /**\n * 渲染下拉框\n */\n private renderDropdown(): void {\n if (!this.dropdown) {\n return;\n }\n\n this.dropdown.innerHTML = '';\n\n if (this.items.length === 0) {\n // 无结果提示\n const emptyEl = document.createElement('div');\n emptyEl.className = 'vtable-formula-autocomplete-empty';\n emptyEl.textContent = '没有匹配的函数';\n this.dropdown.appendChild(emptyEl);\n return;\n }\n\n // 按类型分组\n const groups = this.groupItems(this.items);\n\n groups.forEach(group => {\n // 添加分组标题\n if (groups.length > 1) {\n const groupEl = document.createElement('div');\n groupEl.className = 'vtable-formula-autocomplete-group';\n groupEl.textContent = this.getGroupTitle(group.type);\n this.dropdown.appendChild(groupEl);\n }\n\n // 渲染组内项目\n group.items.forEach((item, index) => {\n const globalIndex = this.items.indexOf(item);\n const itemEl = document.createElement('div');\n itemEl.className = 'vtable-formula-autocomplete-item';\n\n if (globalIndex === this.selectedIndex) {\n itemEl.classList.add('selected');\n }\n\n // 函数名和类型标签\n const nameEl = document.createElement('div');\n nameEl.className = 'item-name';\n\n const labelEl = document.createElement('span');\n labelEl.textContent = item.label;\n nameEl.appendChild(labelEl);\n\n const typeEl = document.createElement('span');\n typeEl.className = `item-type ${item.type}`;\n typeEl.textContent = this.getTypeLabel(item.type);\n nameEl.appendChild(typeEl);\n\n itemEl.appendChild(nameEl);\n\n // 函数签名\n if (item.signature) {\n const signatureEl = document.createElement('div');\n signatureEl.className = 'item-signature';\n signatureEl.textContent = item.signature;\n itemEl.appendChild(signatureEl);\n }\n\n // 描述\n if (item.description) {\n const descEl = document.createElement('div');\n descEl.className = 'item-description';\n descEl.textContent = item.description;\n itemEl.appendChild(descEl);\n }\n\n itemEl.addEventListener('mousedown', () => this.selectItem(globalIndex));\n itemEl.addEventListener('mouseenter', () => {\n this.selectedIndex = globalIndex;\n this.renderDropdown();\n });\n\n this.dropdown.appendChild(itemEl);\n });\n });\n\n // 添加快捷键提示\n const footerEl = document.createElement('div');\n footerEl.className = 'vtable-formula-autocomplete-footer';\n footerEl.innerHTML = `\n <div class=\"shortcut\">\n <span class=\"key\">↑↓</span>\n <span>选择</span>\n </div>\n <div class=\"shortcut\">\n <span class=\"key\">Enter</span>\n <span>确认</span>\n </div>\n <div class=\"shortcut\">\n <span class=\"key\">Esc</span>\n <span>取消</span>\n </div>\n `;\n this.dropdown.appendChild(footerEl);\n\n this.positionDropdown();\n }\n\n /**\n * 对项目进行分组\n */\n private groupItems(items: AutocompleteItem[]): Array<{ type: string; items: AutocompleteItem[] }> {\n const groups: Record<string, AutocompleteItem[]> = {};\n\n items.forEach(item => {\n if (!groups[item.type]) {\n groups[item.type] = [];\n }\n groups[item.type].push(item);\n });\n\n // 按照优先级排序:function > cell > range\n const priority = ['function', 'cell', 'range'];\n return priority.filter(type => groups[type]).map(type => ({ type, items: groups[type] }));\n }\n\n /**\n * 获取分组标题\n */\n private getGroupTitle(type: string): string {\n const titles: Record<string, string> = {\n function: '函数',\n cell: '单元格',\n range: '范围'\n };\n return titles[type] || type;\n }\n\n /**\n * 获取类型标签\n */\n private getTypeLabel(type: string): string {\n const labels: Record<string, string> = {\n function: 'fx',\n cell: 'A1',\n range: 'A:B'\n };\n return labels[type] || type;\n }\n\n /**\n * 定位下拉框\n */\n private positionDropdown(): void {\n if (this.customPositioning) {\n this.customPositioning();\n return;\n }\n if (!this.dropdown || !this.inputElement) {\n return;\n }\n\n const inputRect = this.inputElement.getBoundingClientRect();\n const containerRect = this.container.getBoundingClientRect();\n\n this.dropdown.style.position = 'absolute';\n this.dropdown.style.left = `${inputRect.left - containerRect.left}px`;\n this.dropdown.style.top = `${inputRect.bottom - containerRect.top + 2}px`;\n this.dropdown.style.width = `${Math.max(300, inputRect.width)}px`;\n }\n\n /**\n * 处理键盘事件\n */\n private handleKeydown(event: KeyboardEvent): void {\n if (!this.isVisible) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.selectedIndex = Math.min(this.selectedIndex + 1, this.items.length - 1);\n this.renderDropdown();\n this.scrollToSelectedItem();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.selectedIndex = Math.max(this.selectedIndex - 1, 0);\n this.renderDropdown();\n this.scrollToSelectedItem();\n break;\n case 'Enter':\n if (this.selectedIndex >= 0) {\n event.preventDefault();\n this.selectItem(this.selectedIndex);\n }\n break;\n case 'Escape':\n event.preventDefault();\n this.hide();\n // 确保输入框重新获得焦点\n if (this.inputElement) {\n this.inputElement.focus();\n }\n break;\n case 'Tab':\n if (this.selectedIndex >= 0) {\n event.preventDefault();\n this.selectItem(this.selectedIndex);\n } else {\n this.hide();\n }\n break;\n }\n }\n\n /**\n * 滚动到选中的项目\n */\n private scrollToSelectedItem(): void {\n if (!this.dropdown || this.selectedIndex < 0) {\n return;\n }\n\n const items = this.dropdown.querySelectorAll('.vtable-formula-autocomplete-item');\n if (items[this.selectedIndex]) {\n const selectedItem = items[this.selectedIndex] as HTMLElement;\n selectedItem.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest'\n });\n }\n }\n\n /**\n * 选择项目\n */\n private selectItem(index: number): void {\n const item = this.items[index];\n if (!item || !this.inputElement) {\n return;\n }\n\n if (this.onSelectCallback) {\n this.onSelectCallback(item);\n } else {\n // 默认插入行为\n const value = this.inputElement.value;\n const cursorPos = this.inputElement.selectionStart || 0;\n const context = this.parseInputContext(value, cursorPos);\n\n const newValue =\n value.substring(0, context.insertPosition) +\n item.value +\n (item.type === 'function' ? '(' : '') +\n value.substring(cursorPos);\n\n this.inputElement.value = newValue;\n\n // 设置光标位置\n const newCursorPos = context.insertPosition + item.value.length + (item.type === 'function' ? 1 : 0);\n this.inputElement.setSelectionRange(newCursorPos, newCursorPos);\n\n // 触发input事件以同步到其他组件\n const inputEvent = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(inputEvent);\n }\n\n this.hide();\n\n // 确保输入框重新获得焦点\n if (this.inputElement) {\n setTimeout(() => {\n this.inputElement.focus();\n }, 50);\n }\n }\n\n /**\n * 显示下拉框\n */\n private show(): void {\n if (this.dropdown && this.items.length > 0) {\n // 因为显示出公式列表后期望列表能响应enter、arrowDown、arrowUp等按键,但是和插件excel-edit-cell-keyboard冲突,单元格编辑状态中的话插件里面捕获了这些按键\n // 将table的plugins中excel-edit-cell-keyboard的响应键盘设置为空\n const excelEditCellKeyboardPlugin = this.sheet\n .getActiveSheet()\n .tableInstance.pluginManager.getPlugin('excel-edit-cell-keyboard') as ExcelEditCellKeyboardPlugin;\n if (excelEditCellKeyboardPlugin) {\n excelEditCellKeyboardPlugin.deleteResponseKeyboard([\n ExcelEditCellKeyboardResponse.ARROW_DOWN,\n ExcelEditCellKeyboardResponse.ARROW_UP,\n ExcelEditCellKeyboardResponse.ENTER\n ]);\n }\n\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n this.selectedIndex = 0;\n this.renderDropdown();\n }\n }\n\n /**\n * 隐藏下拉框\n */\n private hide(): void {\n const excelEditCellKeyboardPlugin = this.sheet\n .getActiveSheet()\n .tableInstance.pluginManager.getPlugin('excel-edit-cell-keyboard') as ExcelEditCellKeyboardPlugin;\n if (excelEditCellKeyboardPlugin) {\n // 将show的时候删除的键盘响应重新添加回来\n excelEditCellKeyboardPlugin.addResponseKeyboard([\n ExcelEditCellKeyboardResponse.ARROW_DOWN,\n ExcelEditCellKeyboardResponse.ARROW_UP,\n ExcelEditCellKeyboardResponse.ENTER\n ]);\n }\n if (this.dropdown) {\n this.dropdown.style.display = 'none';\n this.isVisible = false;\n this.selectedIndex = -1;\n }\n }\n\n /**\n * 销毁组件\n */\n release(): void {\n if (this.dropdown && this.dropdown.parentNode) {\n this.dropdown.parentNode.removeChild(this.dropdown);\n }\n }\n}\n"]}
@@ -11,6 +11,7 @@ export declare class FormulaInputEditor extends VTable_editors.InputEditor {
11
11
  createElement(): void;
12
12
  private handleFormulaInput;
13
13
  private initAutocomplete;
14
+ private handleAutocompleteSelect;
14
15
  onStart(context: EditContext<string>): void;
15
16
  beforeEnd(): void;
16
17
  onEnd(): void;
@@ -80,7 +80,9 @@ class FormulaInputEditor extends VTable_editors.InputEditor {
80
80
  this.formulaAutocomplete && (this.formulaAutocomplete.release(), this.formulaAutocomplete = null);
81
81
  const tableContainer = this.sheet.getContentElement();
82
82
  this.formulaAutocomplete = new formula_autocomplete_1.FormulaAutocomplete(tableContainer, this.sheet);
83
- this.formulaAutocomplete.attachTo(this.element, void 0, (() => {
83
+ this.formulaAutocomplete.attachTo(this.element, (item => {
84
+ this.handleAutocompleteSelect(item);
85
+ }), (() => {
84
86
  if (!this.formulaAutocomplete || !this.element) return;
85
87
  const inputRect = this.element.getBoundingClientRect(), containerRect = tableContainer.getBoundingClientRect(), windowHeight = window.innerHeight, relativeLeft = inputRect.left - containerRect.left, idealWidth = Math.max(300, inputRect.width);
86
88
  let relativeTop = inputRect.bottom - containerRect.top + 2;
@@ -96,6 +98,12 @@ class FormulaInputEditor extends VTable_editors.InputEditor {
96
98
  dropdown.style.boxShadow = "0 2px 8px rgba(0, 0, 0, 0.15)");
97
99
  }));
98
100
  }
101
+ handleAutocompleteSelect(item) {
102
+ if (!this.element || !this.sheet) return;
103
+ this.element.value = "=" + item.value, this.sheet.formulaUIManager.formulaInput.value = this.element.value;
104
+ const highlightManager = this.sheet.formulaManager.cellHighlightManager;
105
+ highlightManager && this.element.value.startsWith("=") && highlightManager.highlightFormulaCells(this.element.value);
106
+ }
99
107
  onStart(context) {
100
108
  var _a, _b;
101
109
  const formula = this.sheet.formulaManager.getCellFormula({
@@ -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(): HTMLElement {\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(this.element, undefined, customPositioning);\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(): HTMLElement {\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"]}
@@ -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
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.20.2-alpha.0";
5
+ export declare const version = "1.20.3";
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.20.2-alpha.0", (0, style_manager_1.importStyles)();
50
+ exports.version = "1.20.3", (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,gBAAgB,CAAC;AAExC,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.20.2-alpha.0\";\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,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.20.3\";\n// 导入样式\nimportStyles();\n/**\n * @namespace VTableSheet\n */\nexport { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };\n"]}