@visactor/vtable-sheet 1.20.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/vtable-sheet.d.ts +78 -0
- package/cjs/components/vtable-sheet.js +474 -0
- package/cjs/components/vtable-sheet.js.map +1 -0
- package/cjs/core/WorkSheet.d.ts +69 -0
- package/cjs/core/WorkSheet.js +298 -0
- package/cjs/core/WorkSheet.js.map +1 -0
- package/cjs/core/table-plugins.d.ts +3 -0
- package/cjs/core/table-plugins.js +171 -0
- package/cjs/core/table-plugins.js.map +1 -0
- package/cjs/event/event-manager.d.ts +29 -0
- package/cjs/event/event-manager.js +71 -0
- package/cjs/event/event-manager.js.map +1 -0
- package/cjs/event/event-target.d.ts +12 -0
- package/cjs/event/event-target.js +50 -0
- package/cjs/event/event-target.js.map +1 -0
- package/cjs/formula/cell-highlight-manager.d.ts +29 -0
- package/cjs/formula/cell-highlight-manager.js +141 -0
- package/cjs/formula/cell-highlight-manager.js.map +1 -0
- package/cjs/formula/formula-autocomplete.d.ts +39 -0
- package/cjs/formula/formula-autocomplete.js +239 -0
- package/cjs/formula/formula-autocomplete.js.map +1 -0
- package/cjs/formula/formula-editor.d.ts +21 -0
- package/cjs/formula/formula-editor.js +162 -0
- package/cjs/formula/formula-editor.js.map +1 -0
- package/cjs/formula/formula-helper.d.ts +8 -0
- package/cjs/formula/formula-helper.js +66 -0
- package/cjs/formula/formula-helper.js.map +1 -0
- package/cjs/formula/formula-range-selector.d.ts +19 -0
- package/cjs/formula/formula-range-selector.js +201 -0
- package/cjs/formula/formula-range-selector.js.map +1 -0
- package/cjs/formula/formula-throttle.d.ts +10 -0
- package/cjs/formula/formula-throttle.js +39 -0
- package/cjs/formula/formula-throttle.js.map +1 -0
- package/cjs/formula/formula-ui-manager.d.ts +19 -0
- package/cjs/formula/formula-ui-manager.js +226 -0
- package/cjs/formula/formula-ui-manager.js.map +1 -0
- package/cjs/formula/index.d.ts +5 -0
- package/cjs/formula/index.js +23 -0
- package/cjs/formula/index.js.map +1 -0
- package/cjs/index.d.ts +6 -0
- package/cjs/index.js +50 -0
- package/cjs/index.js.map +1 -0
- package/cjs/managers/formula-manager.d.ts +82 -0
- package/cjs/managers/formula-manager.js +445 -0
- package/cjs/managers/formula-manager.js.map +1 -0
- package/cjs/managers/menu-manager.d.ts +12 -0
- package/cjs/managers/menu-manager.js +89 -0
- package/cjs/managers/menu-manager.js.map +1 -0
- package/cjs/managers/sheet-manager.d.ts +21 -0
- package/cjs/managers/sheet-manager.js +74 -0
- package/cjs/managers/sheet-manager.js.map +1 -0
- package/cjs/managers/tab-drag-manager.d.ts +24 -0
- package/cjs/managers/tab-drag-manager.js +121 -0
- package/cjs/managers/tab-drag-manager.js.map +1 -0
- package/cjs/sheet-helper.d.ts +16 -0
- package/cjs/sheet-helper.js +64 -0
- package/cjs/sheet-helper.js.map +1 -0
- package/cjs/styles/common.d.ts +1 -0
- package/cjs/styles/common.js +17 -0
- package/cjs/styles/common.js.map +1 -0
- package/cjs/styles/formula-autocomplete.d.ts +1 -0
- package/cjs/styles/formula-autocomplete.js +17 -0
- package/cjs/styles/formula-autocomplete.js.map +1 -0
- package/cjs/styles/formula-bar.d.ts +1 -0
- package/cjs/styles/formula-bar.js +17 -0
- package/cjs/styles/formula-bar.js.map +1 -0
- package/cjs/styles/menu.d.ts +1 -0
- package/cjs/styles/menu.js +17 -0
- package/cjs/styles/menu.js.map +1 -0
- package/cjs/styles/sheet-tab.d.ts +1 -0
- package/cjs/styles/sheet-tab.js +17 -0
- package/cjs/styles/sheet-tab.js.map +1 -0
- package/cjs/styles/sheet.d.ts +1 -0
- package/cjs/styles/sheet.js +17 -0
- package/cjs/styles/sheet.js.map +1 -0
- package/cjs/styles/style-manager.d.ts +1 -0
- package/cjs/styles/style-manager.js +15 -0
- package/cjs/styles/style-manager.js.map +1 -0
- package/cjs/test/formula-complete.test.d.ts +1 -0
- package/cjs/test/formula-complete.test.js +42 -0
- package/cjs/test/formula-complete.test.js.map +1 -0
- package/cjs/tools/env.d.ts +20 -0
- package/cjs/tools/env.js +59 -0
- package/cjs/tools/env.js.map +1 -0
- package/cjs/tools/index.d.ts +3 -0
- package/cjs/tools/index.js +16 -0
- package/cjs/tools/index.js.map +1 -0
- package/cjs/tools/ui/snackbar.d.ts +1 -0
- package/cjs/tools/ui/snackbar.js +20 -0
- package/cjs/tools/ui/snackbar.js.map +1 -0
- package/cjs/ts-types/base.d.ts +44 -0
- package/cjs/ts-types/base.js +14 -0
- package/cjs/ts-types/base.js.map +1 -0
- package/cjs/ts-types/event.d.ts +79 -0
- package/cjs/ts-types/event.js +6 -0
- package/cjs/ts-types/event.js.map +1 -0
- package/cjs/ts-types/events.d.ts +1 -0
- package/cjs/ts-types/events.js +3 -0
- package/cjs/ts-types/events.js.map +1 -0
- package/cjs/ts-types/filter.d.ts +58 -0
- package/cjs/ts-types/filter.js +16 -0
- package/cjs/ts-types/filter.js.map +1 -0
- package/cjs/ts-types/formula.d.ts +51 -0
- package/cjs/ts-types/formula.js +6 -0
- package/cjs/ts-types/formula.js.map +1 -0
- package/cjs/ts-types/index.d.ts +67 -0
- package/cjs/ts-types/index.js +37 -0
- package/cjs/ts-types/index.js.map +1 -0
- package/cjs/ts-types/sheet.d.ts +45 -0
- package/cjs/ts-types/sheet.js +6 -0
- package/cjs/ts-types/sheet.js.map +1 -0
- package/cjs/vtable.d.ts +1 -0
- package/cjs/vtable.js +35 -0
- package/cjs/vtable.js.map +1 -0
- package/dist/vtable-sheet.js +114494 -0
- package/dist/vtable-sheet.min.js +853 -0
- package/es/components/vtable-sheet.d.ts +78 -0
- package/es/components/vtable-sheet.js +462 -0
- package/es/components/vtable-sheet.js.map +1 -0
- package/es/core/WorkSheet.d.ts +69 -0
- package/es/core/WorkSheet.js +298 -0
- package/es/core/WorkSheet.js.map +1 -0
- package/es/core/table-plugins.d.ts +3 -0
- package/es/core/table-plugins.js +164 -0
- package/es/core/table-plugins.js.map +1 -0
- package/es/event/event-manager.d.ts +29 -0
- package/es/event/event-manager.js +63 -0
- package/es/event/event-manager.js.map +1 -0
- package/es/event/event-target.d.ts +12 -0
- package/es/event/event-target.js +42 -0
- package/es/event/event-target.js.map +1 -0
- package/es/formula/cell-highlight-manager.d.ts +29 -0
- package/es/formula/cell-highlight-manager.js +133 -0
- package/es/formula/cell-highlight-manager.js.map +1 -0
- package/es/formula/formula-autocomplete.d.ts +39 -0
- package/es/formula/formula-autocomplete.js +231 -0
- package/es/formula/formula-autocomplete.js.map +1 -0
- package/es/formula/formula-editor.d.ts +21 -0
- package/es/formula/formula-editor.js +135 -0
- package/es/formula/formula-editor.js.map +1 -0
- package/es/formula/formula-helper.d.ts +8 -0
- package/es/formula/formula-helper.js +60 -0
- package/es/formula/formula-helper.js.map +1 -0
- package/es/formula/formula-range-selector.d.ts +19 -0
- package/es/formula/formula-range-selector.js +195 -0
- package/es/formula/formula-range-selector.js.map +1 -0
- package/es/formula/formula-throttle.d.ts +10 -0
- package/es/formula/formula-throttle.js +31 -0
- package/es/formula/formula-throttle.js.map +1 -0
- package/es/formula/formula-ui-manager.d.ts +19 -0
- package/es/formula/formula-ui-manager.js +218 -0
- package/es/formula/formula-ui-manager.js.map +1 -0
- package/es/formula/index.d.ts +5 -0
- package/es/formula/index.js +10 -0
- package/es/formula/index.js.map +1 -0
- package/es/index.d.ts +6 -0
- package/es/index.js +13 -0
- package/es/index.js.map +1 -0
- package/es/managers/formula-manager.d.ts +82 -0
- package/es/managers/formula-manager.js +441 -0
- package/es/managers/formula-manager.js.map +1 -0
- package/es/managers/menu-manager.d.ts +12 -0
- package/es/managers/menu-manager.js +81 -0
- package/es/managers/menu-manager.js.map +1 -0
- package/es/managers/sheet-manager.d.ts +21 -0
- package/es/managers/sheet-manager.js +66 -0
- package/es/managers/sheet-manager.js.map +1 -0
- package/es/managers/tab-drag-manager.d.ts +24 -0
- package/es/managers/tab-drag-manager.js +113 -0
- package/es/managers/tab-drag-manager.js.map +1 -0
- package/es/sheet-helper.d.ts +16 -0
- package/es/sheet-helper.js +54 -0
- package/es/sheet-helper.js.map +1 -0
- package/es/styles/common.d.ts +1 -0
- package/es/styles/common.js +9 -0
- package/es/styles/common.js.map +1 -0
- package/es/styles/formula-autocomplete.d.ts +1 -0
- package/es/styles/formula-autocomplete.js +9 -0
- package/es/styles/formula-autocomplete.js.map +1 -0
- package/es/styles/formula-bar.d.ts +1 -0
- package/es/styles/formula-bar.js +9 -0
- package/es/styles/formula-bar.js.map +1 -0
- package/es/styles/menu.d.ts +1 -0
- package/es/styles/menu.js +9 -0
- package/es/styles/menu.js.map +1 -0
- package/es/styles/sheet-tab.d.ts +1 -0
- package/es/styles/sheet-tab.js +9 -0
- package/es/styles/sheet-tab.js.map +1 -0
- package/es/styles/sheet.d.ts +1 -0
- package/es/styles/sheet.js +9 -0
- package/es/styles/sheet.js.map +1 -0
- package/es/styles/style-manager.d.ts +1 -0
- package/es/styles/style-manager.js +17 -0
- package/es/styles/style-manager.js.map +1 -0
- package/es/test/formula-complete.test.d.ts +1 -0
- package/es/test/formula-complete.test.js +36 -0
- package/es/test/formula-complete.test.js.map +1 -0
- package/es/tools/env.d.ts +20 -0
- package/es/tools/env.js +53 -0
- package/es/tools/env.js.map +1 -0
- package/es/tools/index.d.ts +3 -0
- package/es/tools/index.js +9 -0
- package/es/tools/index.js.map +1 -0
- package/es/tools/ui/snackbar.d.ts +1 -0
- package/es/tools/ui/snackbar.js +14 -0
- package/es/tools/ui/snackbar.js.map +1 -0
- package/es/ts-types/base.d.ts +44 -0
- package/es/ts-types/base.js +14 -0
- package/es/ts-types/base.js.map +1 -0
- package/es/ts-types/event.d.ts +79 -0
- package/es/ts-types/event.js +2 -0
- package/es/ts-types/event.js.map +1 -0
- package/es/ts-types/events.d.ts +1 -0
- package/es/ts-types/events.js +3 -0
- package/es/ts-types/events.js.map +1 -0
- package/es/ts-types/filter.d.ts +58 -0
- package/es/ts-types/filter.js +16 -0
- package/es/ts-types/filter.js.map +1 -0
- package/es/ts-types/formula.d.ts +51 -0
- package/es/ts-types/formula.js +2 -0
- package/es/ts-types/formula.js.map +1 -0
- package/es/ts-types/index.d.ts +67 -0
- package/es/ts-types/index.js +14 -0
- package/es/ts-types/index.js.map +1 -0
- package/es/ts-types/sheet.d.ts +45 -0
- package/es/ts-types/sheet.js +2 -0
- package/es/ts-types/sheet.js.map +1 -0
- package/es/vtable.d.ts +1 -0
- package/es/vtable.js +2 -0
- package/es/vtable.js.map +1 -0
- package/package.json +120 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.MenuManager = void 0;
|
|
6
|
+
|
|
7
|
+
const base_1 = require("../ts-types/base");
|
|
8
|
+
|
|
9
|
+
class MenuManager {
|
|
10
|
+
constructor(sheet) {
|
|
11
|
+
this.sheet = sheet, this.createMainMenu();
|
|
12
|
+
}
|
|
13
|
+
createMainMenu() {
|
|
14
|
+
var _a, _b;
|
|
15
|
+
const menu = document.createElement("div");
|
|
16
|
+
menu.className = "vtable-sheet-main-menu", menu.style.position = "relative";
|
|
17
|
+
const menuButton = document.createElement("span");
|
|
18
|
+
menuButton.className = "vtable-sheet-main-menu-button", menuButton.innerHTML = '<svg t="1754379519717" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1496" width="24" height="24"><path d="M510.435876 67.959811c-245.428735 0-444.382996 198.954261-444.382996 444.373787 0 245.420549 198.954261 444.373787 444.382996 444.373787 245.410316 0 444.372763-198.953238 444.372763-444.373787C954.807616 266.914072 755.846192 67.959811 510.435876 67.959811zM510.435876 901.156184c-214.743876 0-388.831796-174.08792-388.831796-388.822586 0-214.743876 174.088944-388.831796 388.831796-388.831796 214.732619 0 388.822586 174.08792 388.822586 388.831796C899.257439 727.068264 725.167472 901.156184 510.435876 901.156184zM666.028561 329.355193 337.411171 329.355193c-15.117302 0-27.384697 15.60235-27.384697 34.844599 0 19.259646 12.267395 34.861996 27.384697 34.861996l328.618413 0c15.124466 0 27.375487-15.60235 27.375487-34.861996C693.404048 344.957543 681.15405 329.355193 666.028561 329.355193zM666.028561 486.191194 337.411171 486.191194c-15.117302 0-27.384697 15.601326-27.384697 34.852786 0 19.25146 12.267395 34.853809 27.384697 34.853809l328.618413 0c15.124466 0 27.375487-15.601326 27.375487-34.853809C693.404048 501.792521 681.15405 486.191194 666.028561 486.191194zM666.028561 625.604384 337.411171 625.604384c-15.117302 0-27.384697 15.60235-27.384697 34.845623 0 19.25146 12.267395 34.861996 27.384697 34.861996l328.618413 0c15.124466 0 27.375487-15.611559 27.375487-34.861996C693.404048 641.206734 681.15405 625.604384 666.028561 625.604384z" fill="#8a8a8a" p-id="1497"></path></svg>',
|
|
19
|
+
menu.appendChild(menuButton);
|
|
20
|
+
const menuContainer = document.createElement("div");
|
|
21
|
+
menuContainer.className = "vtable-sheet-main-menu-container", menu.appendChild(menuContainer);
|
|
22
|
+
const menuItems = document.createElement("ul");
|
|
23
|
+
return menuItems.className = "vtable-sheet-main-menu-items", menuContainer.appendChild(menuItems),
|
|
24
|
+
null === (_b = null === (_a = this.sheet.getOptions().mainMenu) || void 0 === _a ? void 0 : _a.items) || void 0 === _b || _b.forEach((item => {
|
|
25
|
+
const li = document.createElement("li");
|
|
26
|
+
li.className = "vtable-sheet-main-menu-item", li.textContent = item.name, li.title = item.description || "",
|
|
27
|
+
item.items && (li.classList.add("vtable-sheet-main-menu-item-has-children"), li.onmouseenter = () => {
|
|
28
|
+
const subMenu = this.createSubMenu(item.items);
|
|
29
|
+
li.appendChild(subMenu);
|
|
30
|
+
}, li.onmouseleave = () => {
|
|
31
|
+
li.classList.remove("vtable-sheet-main-menu-item-has-children-hover"), li.querySelector(".vtable-sheet-main-menu-sub-menu") && li.removeChild(li.querySelector(".vtable-sheet-main-menu-sub-menu"));
|
|
32
|
+
}), li.addEventListener("click", (() => {
|
|
33
|
+
item.onClick ? item.onClick() : item.menuKey && this.handleMenuClick(item.menuKey);
|
|
34
|
+
})), menuItems.appendChild(li);
|
|
35
|
+
})), menuButton.addEventListener("click", (e => {
|
|
36
|
+
e.stopPropagation(), menuContainer.classList.toggle("active");
|
|
37
|
+
})), document.addEventListener("click", (e => {
|
|
38
|
+
menu.contains(e.target) || menuContainer.classList.remove("active");
|
|
39
|
+
})), this.menuContainer = menuContainer, menu;
|
|
40
|
+
}
|
|
41
|
+
createSubMenu(items) {
|
|
42
|
+
const subMenuContainer = document.createElement("div");
|
|
43
|
+
subMenuContainer.className = "vtable-sheet-submenu-container";
|
|
44
|
+
const subMenuList = document.createElement("ul");
|
|
45
|
+
return subMenuList.className = "vtable-sheet-main-menu-items", items.forEach((item => {
|
|
46
|
+
var _a;
|
|
47
|
+
const li = document.createElement("li");
|
|
48
|
+
li.className = "vtable-sheet-submenu-item", li.textContent = item.name, li.title = item.description || "",
|
|
49
|
+
li.addEventListener("click", (e => {
|
|
50
|
+
var _a;
|
|
51
|
+
e.stopPropagation(), item.menuKey ? this.handleMenuClick(item.menuKey) : null === (_a = item.onClick) || void 0 === _a || _a.call(item),
|
|
52
|
+
this.hideAllSubMenus();
|
|
53
|
+
})), (null === (_a = item.items) || void 0 === _a ? void 0 : _a.length) && (li.classList.add("vtable-sheet-main-menu-item-has-children"),
|
|
54
|
+
li.addEventListener("mouseenter", (() => {
|
|
55
|
+
this.hideAllSubMenus(li);
|
|
56
|
+
const nestedSubMenu = this.createSubMenu(item.items);
|
|
57
|
+
li.appendChild(nestedSubMenu), this.adjustSubMenuPosition(nestedSubMenu);
|
|
58
|
+
}))), subMenuList.appendChild(li);
|
|
59
|
+
})), subMenuContainer.appendChild(subMenuList), subMenuContainer;
|
|
60
|
+
}
|
|
61
|
+
adjustSubMenuPosition(subMenu) {
|
|
62
|
+
const rect = subMenu.getBoundingClientRect();
|
|
63
|
+
rect.right > window.innerWidth && (subMenu.style.left = "auto", subMenu.style.right = "100%"),
|
|
64
|
+
rect.bottom > window.innerHeight && (subMenu.style.top = "auto", subMenu.style.bottom = "0");
|
|
65
|
+
}
|
|
66
|
+
hideAllSubMenus(exceptElement) {
|
|
67
|
+
document.querySelectorAll(".vtable-sheet-submenu-container").forEach((menu => {
|
|
68
|
+
menu !== (null == exceptElement ? void 0 : exceptElement.closest(".vtable-sheet-submenu-container")) && menu.remove();
|
|
69
|
+
})), this.menuContainer.classList.remove("active");
|
|
70
|
+
}
|
|
71
|
+
handleMenuClick(menuKey) {
|
|
72
|
+
const tableInstance = this.sheet.getActiveSheet().tableInstance;
|
|
73
|
+
switch (menuKey) {
|
|
74
|
+
case base_1.MainMenuItemKey.IMPORT:
|
|
75
|
+
(null == tableInstance ? void 0 : tableInstance.importFile) && tableInstance.importFile();
|
|
76
|
+
break;
|
|
77
|
+
|
|
78
|
+
case base_1.MainMenuItemKey.EXPORT_CURRENT_SHEET_CSV:
|
|
79
|
+
(null == tableInstance ? void 0 : tableInstance.exportToCsv) && tableInstance.exportToCsv();
|
|
80
|
+
break;
|
|
81
|
+
|
|
82
|
+
case base_1.MainMenuItemKey.EXPORT_CURRENT_SHEET_XLSX:
|
|
83
|
+
(null == tableInstance ? void 0 : tableInstance.exportToExcel) && tableInstance.exportToExcel();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
exports.MenuManager = MenuManager;
|
|
89
|
+
//# sourceMappingURL=menu-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/managers/menu-manager.ts"],"names":[],"mappings":"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","file":"menu-manager.js","sourcesContent":["import type { ExcelImportPlugin, TableExportPlugin } from '@visactor/vtable-plugins';\nimport type VTableSheet from '../components/vtable-sheet';\nimport type { MainMenuItem } from '../ts-types/base';\nimport { MainMenuItemKey } from '../ts-types/base';\n\nexport class MenuManager {\n private sheet: VTableSheet;\n private menuContainer: HTMLElement;\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n this.createMainMenu();\n }\n\n createMainMenu(): HTMLElement {\n const menuIcon = `<svg t=\"1754379519717\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1496\" width=\"24\" height=\"24\"><path d=\"M510.435876 67.959811c-245.428735 0-444.382996 198.954261-444.382996 444.373787 0 245.420549 198.954261 444.373787 444.382996 444.373787 245.410316 0 444.372763-198.953238 444.372763-444.373787C954.807616 266.914072 755.846192 67.959811 510.435876 67.959811zM510.435876 901.156184c-214.743876 0-388.831796-174.08792-388.831796-388.822586 0-214.743876 174.088944-388.831796 388.831796-388.831796 214.732619 0 388.822586 174.08792 388.822586 388.831796C899.257439 727.068264 725.167472 901.156184 510.435876 901.156184zM666.028561 329.355193 337.411171 329.355193c-15.117302 0-27.384697 15.60235-27.384697 34.844599 0 19.259646 12.267395 34.861996 27.384697 34.861996l328.618413 0c15.124466 0 27.375487-15.60235 27.375487-34.861996C693.404048 344.957543 681.15405 329.355193 666.028561 329.355193zM666.028561 486.191194 337.411171 486.191194c-15.117302 0-27.384697 15.601326-27.384697 34.852786 0 19.25146 12.267395 34.853809 27.384697 34.853809l328.618413 0c15.124466 0 27.375487-15.601326 27.375487-34.853809C693.404048 501.792521 681.15405 486.191194 666.028561 486.191194zM666.028561 625.604384 337.411171 625.604384c-15.117302 0-27.384697 15.60235-27.384697 34.845623 0 19.25146 12.267395 34.861996 27.384697 34.861996l328.618413 0c15.124466 0 27.375487-15.611559 27.375487-34.861996C693.404048 641.206734 681.15405 625.604384 666.028561 625.604384z\" fill=\"#8a8a8a\" p-id=\"1497\"></path></svg>`;\n // const menuIcon = `<svg t=\"1754379884941\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"><path d=\"M41.79704403125004 158.46048700694445l588.8681891302084 0 0 117.0003645451389-588.8681891302084 0 0-117.0003645451389Z\" p-id=\"5684\" fill=\"#8a8a8a\"></path><path d=\"M41.79704403124998 394.9996354548611l588.8681891302086 0 0 117.0003645451389-588.8681891302086 0 0-117.0003645451389Z\" p-id=\"5685\" fill=\"#8a8a8a\"></path><path d=\"M41.79704403124998 629.4749666302083l588.8681891302084 0 0 117.0003645451389-588.8681891302084 0 0-117.0003645451389Z\" p-id=\"5686\" fill=\"#8a8a8a\"></path><path d=\"M831.596434 638.445854 642.224412 384.604518 1023.977999 384.604518Z\" p-id=\"5687\" fill=\"#8a8a8a\"></path></svg>`;\n const menu = document.createElement('div');\n menu.className = 'vtable-sheet-main-menu';\n menu.style.position = 'relative'; // 关键:为子菜单提供定位基准\n\n // 菜单按钮\n const menuButton = document.createElement('span');\n menuButton.className = 'vtable-sheet-main-menu-button';\n menuButton.innerHTML = menuIcon;\n menu.appendChild(menuButton);\n\n // 菜单项容器(直接作为 menu 的子元素)\n const menuContainer = document.createElement('div');\n menuContainer.className = 'vtable-sheet-main-menu-container';\n menu.appendChild(menuContainer); // 挂载到 menu 内部\n\n // 菜单项列表\n const menuItems = document.createElement('ul');\n menuItems.className = 'vtable-sheet-main-menu-items';\n menuContainer.appendChild(menuItems);\n\n // 动态生成菜单项\n this.sheet.getOptions().mainMenu?.items?.forEach(item => {\n const li = document.createElement('li');\n li.className = 'vtable-sheet-main-menu-item';\n li.textContent = item.name;\n li.title = item.description || ''; //title提示\n if (item.items) {\n li.classList.add('vtable-sheet-main-menu-item-has-children');\n li.onmouseenter = () => {\n const subMenu = this.createSubMenu(item.items);\n li.appendChild(subMenu);\n };\n li.onmouseleave = () => {\n li.classList.remove('vtable-sheet-main-menu-item-has-children-hover');\n if (li.querySelector('.vtable-sheet-main-menu-sub-menu')) {\n li.removeChild(li.querySelector('.vtable-sheet-main-menu-sub-menu'));\n }\n };\n }\n li.addEventListener('click', () => {\n if (item.onClick) {\n item.onClick();\n return;\n }\n if (item.menuKey) {\n this.handleMenuClick(item.menuKey);\n }\n });\n menuItems.appendChild(li);\n });\n\n // 点击事件逻辑\n menuButton.addEventListener('click', e => {\n e.stopPropagation();\n menuContainer.classList.toggle('active');\n });\n\n // 点击外部关闭菜单\n document.addEventListener('click', e => {\n if (!menu.contains(e.target as Node)) {\n menuContainer.classList.remove('active');\n }\n });\n this.menuContainer = menuContainer;\n return menu;\n }\n //TODO 需要重新逻辑,需要支持多级菜单\n private createSubMenu(items: MainMenuItem[]): HTMLElement {\n // 创建子菜单容器\n const subMenuContainer = document.createElement('div');\n subMenuContainer.className = 'vtable-sheet-submenu-container';\n\n // 创建子菜单列表\n const subMenuList = document.createElement('ul');\n subMenuList.className = 'vtable-sheet-main-menu-items';\n\n // 动态生成子菜单项\n items.forEach(item => {\n const li = document.createElement('li');\n li.className = 'vtable-sheet-submenu-item';\n li.textContent = item.name;\n li.title = item.description || '';\n\n // 绑定点击事件\n li.addEventListener('click', e => {\n e.stopPropagation();\n if (item.menuKey) {\n this.handleMenuClick(item.menuKey);\n } else {\n item.onClick?.();\n }\n this.hideAllSubMenus(); // 点击后关闭所有子菜单\n });\n\n // 如果有嵌套子菜单\n if (item.items?.length) {\n // li.classList.add('has-submenu');\n li.classList.add('vtable-sheet-main-menu-item-has-children');\n // const arrowIcon = document.createElement('span');\n // arrowIcon.className = 'submenu-arrow';\n // arrowIcon.innerHTML = '▶';\n // li.appendChild(arrowIcon);\n\n // 鼠标悬停显示嵌套子菜单\n li.addEventListener('mouseenter', () => {\n this.hideAllSubMenus(li); // 先关闭其他子菜单\n const nestedSubMenu = this.createSubMenu(item.items);\n li.appendChild(nestedSubMenu);\n this.adjustSubMenuPosition(nestedSubMenu); // 调整定位\n });\n }\n\n subMenuList.appendChild(li);\n });\n\n subMenuContainer.appendChild(subMenuList);\n return subMenuContainer;\n }\n\n // 调整子菜单定位(避免超出视口)\n private adjustSubMenuPosition(subMenu: HTMLElement) {\n const rect = subMenu.getBoundingClientRect();\n if (rect.right > window.innerWidth) {\n subMenu.style.left = 'auto';\n subMenu.style.right = '100%'; // 改为向左展开\n }\n if (rect.bottom > window.innerHeight) {\n subMenu.style.top = 'auto';\n subMenu.style.bottom = '0'; // 向上对齐\n }\n }\n\n // 关闭所有子菜单(保留当前激活项)并隐藏主菜单\n private hideAllSubMenus(exceptElement?: HTMLElement) {\n document.querySelectorAll('.vtable-sheet-submenu-container').forEach(menu => {\n if (menu !== exceptElement?.closest('.vtable-sheet-submenu-container')) {\n menu.remove();\n }\n });\n this.menuContainer.classList.remove('active');\n }\n handleMenuClick(menuKey: MainMenuItemKey) {\n console.log('menuKey click', menuKey);\n const tableInstance = this.sheet.getActiveSheet().tableInstance;\n\n switch (menuKey) {\n case MainMenuItemKey.IMPORT:\n if ((tableInstance as any)?.importFile) {\n (tableInstance as any).importFile();\n } else {\n console.warn('Please configure ExcelImportPlugin in VTablePluginModules');\n }\n break;\n\n case MainMenuItemKey.EXPORT_CURRENT_SHEET_CSV:\n if ((tableInstance as any)?.exportToCsv) {\n (tableInstance as any).exportToCsv();\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n }\n break;\n case MainMenuItemKey.EXPORT_CURRENT_SHEET_XLSX:\n if ((tableInstance as any)?.exportToExcel) {\n (tableInstance as any).exportToExcel();\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n }\n break;\n default:\n break;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ISheetManager, IWorkSheetAPI } from '../ts-types/sheet';
|
|
2
|
+
import type { ISheetDefine } from '../ts-types';
|
|
3
|
+
export default class SheetManager implements ISheetManager {
|
|
4
|
+
_sheets: Map<string, ISheetDefine>;
|
|
5
|
+
_activeSheetKey: string;
|
|
6
|
+
constructor();
|
|
7
|
+
getActiveSheet(): ISheetDefine | null;
|
|
8
|
+
setActiveSheet(sheetKey: string): void;
|
|
9
|
+
addSheet(sheet: ISheetDefine): void;
|
|
10
|
+
removeSheet(sheetKey: string): string;
|
|
11
|
+
renameSheet(sheetKey: string, newTitle: string): void;
|
|
12
|
+
getAllSheets(): ISheetDefine[];
|
|
13
|
+
getSheet(sheetKey: string): ISheetDefine | null;
|
|
14
|
+
getSheetCount(): number;
|
|
15
|
+
getSheetAPI(sheetKey: string): IWorkSheetAPI | null;
|
|
16
|
+
onSheetChange(callback: (sheets: ISheetDefine[]) => void): void;
|
|
17
|
+
offSheetChange(callback: (sheets: ISheetDefine[]) => void): void;
|
|
18
|
+
onActiveSheetChange(callback: (sheet: ISheetDefine) => void): void;
|
|
19
|
+
offActiveSheetChange(callback: (sheet: ISheetDefine) => void): void;
|
|
20
|
+
reorderSheet(sourceKey: string, targetKey: string, position: 'left' | 'right'): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
class SheetManager {
|
|
8
|
+
constructor() {
|
|
9
|
+
this._sheets = new Map, this._activeSheetKey = "";
|
|
10
|
+
}
|
|
11
|
+
getActiveSheet() {
|
|
12
|
+
if (!this._activeSheetKey || !this._sheets.has(this._activeSheetKey)) {
|
|
13
|
+
const firstSheet = this._sheets.values().next().value;
|
|
14
|
+
return firstSheet ? (this._activeSheetKey = firstSheet.sheetKey, firstSheet) : null;
|
|
15
|
+
}
|
|
16
|
+
return this._sheets.get(this._activeSheetKey);
|
|
17
|
+
}
|
|
18
|
+
setActiveSheet(sheetKey) {
|
|
19
|
+
if (!this._sheets.has(sheetKey)) throw new Error(`Sheet with key '${sheetKey}' not found`);
|
|
20
|
+
this._activeSheetKey = sheetKey;
|
|
21
|
+
for (const [key, sheet] of this._sheets.entries()) sheet.active = key === sheetKey;
|
|
22
|
+
}
|
|
23
|
+
addSheet(sheet) {
|
|
24
|
+
if (this._sheets.has(sheet.sheetKey)) throw new Error(`Sheet with key '${sheet.sheetKey}' already exists`);
|
|
25
|
+
this._sheets.set(sheet.sheetKey, sheet);
|
|
26
|
+
}
|
|
27
|
+
removeSheet(sheetKey) {
|
|
28
|
+
if (!this._sheets.has(sheetKey)) throw new Error(`Sheet with key '${sheetKey}' not found`);
|
|
29
|
+
if (sheetKey === this._activeSheetKey) {
|
|
30
|
+
let nextSheet = null;
|
|
31
|
+
for (const [key, sheet] of this._sheets.entries()) if (key !== sheetKey) {
|
|
32
|
+
nextSheet = sheet;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
nextSheet ? (this._activeSheetKey = nextSheet.sheetKey, nextSheet.active = !0) : this._activeSheetKey = "";
|
|
36
|
+
}
|
|
37
|
+
return this._sheets.delete(sheetKey), this._activeSheetKey;
|
|
38
|
+
}
|
|
39
|
+
renameSheet(sheetKey, newTitle) {
|
|
40
|
+
if (!this._sheets.has(sheetKey)) throw new Error(`Sheet with key '${sheetKey}' not found`);
|
|
41
|
+
this._sheets.get(sheetKey).sheetTitle = newTitle;
|
|
42
|
+
}
|
|
43
|
+
getAllSheets() {
|
|
44
|
+
return Array.from(this._sheets.values());
|
|
45
|
+
}
|
|
46
|
+
getSheet(sheetKey) {
|
|
47
|
+
return this._sheets.get(sheetKey) || null;
|
|
48
|
+
}
|
|
49
|
+
getSheetCount() {
|
|
50
|
+
return this._sheets.size;
|
|
51
|
+
}
|
|
52
|
+
getSheetAPI(sheetKey) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
onSheetChange(callback) {}
|
|
56
|
+
offSheetChange(callback) {}
|
|
57
|
+
onActiveSheetChange(callback) {}
|
|
58
|
+
offActiveSheetChange(callback) {}
|
|
59
|
+
reorderSheet(sourceKey, targetKey, position) {
|
|
60
|
+
if (sourceKey === targetKey) return;
|
|
61
|
+
if (!this._sheets.has(sourceKey)) throw new Error(`Source sheet '${sourceKey}' does not exist`);
|
|
62
|
+
if (!this._sheets.has(targetKey)) throw new Error(`Target sheet '${targetKey}' does not exist`);
|
|
63
|
+
const sheetsArray = Array.from(this._sheets.entries()), sourceIndex = sheetsArray.findIndex((([key]) => key === sourceKey)), targetIndex = sheetsArray.findIndex((([key]) => key === targetKey));
|
|
64
|
+
if (-1 === sourceIndex || -1 === targetIndex || sourceIndex === targetIndex) return;
|
|
65
|
+
let insertIndex = "left" === position ? targetIndex : targetIndex + 1;
|
|
66
|
+
sourceIndex < insertIndex && insertIndex--;
|
|
67
|
+
const [movedSheet] = sheetsArray.splice(sourceIndex, 1);
|
|
68
|
+
sheetsArray.splice(insertIndex, 0, movedSheet), this._sheets.clear(), sheetsArray.forEach((([key, sheet]) => {
|
|
69
|
+
this._sheets.set(key, sheet);
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
exports.default = SheetManager;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/managers/sheet-manager.ts"],"names":[],"mappings":"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","file":"sheet-manager.js","sourcesContent":["import type { ISheetManager, IWorkSheetAPI } from '../ts-types/sheet';\nimport type { ISheetDefine } from '../ts-types';\n\nexport default class SheetManager implements ISheetManager {\n /** sheets集合 */\n _sheets: Map<string, ISheetDefine> = new Map();\n /** 当前活动sheet的key */\n _activeSheetKey: string = '';\n\n constructor() {\n // 初始化\n }\n\n /**\n * 获取当前活动sheet\n */\n getActiveSheet(): ISheetDefine | null {\n // 如果没有活动sheet,返回第一个sheet\n if (!this._activeSheetKey || !this._sheets.has(this._activeSheetKey)) {\n const firstSheet = this._sheets.values().next().value;\n if (firstSheet) {\n this._activeSheetKey = firstSheet.sheetKey;\n return firstSheet;\n }\n\n // 如果没有任何sheet,返回null而不是抛出错误\n return null;\n }\n\n return this._sheets.get(this._activeSheetKey)!;\n }\n\n /**\n * 设置活动sheet\n * @param sheetKey 要设置为活动sheet的sheet的key\n */\n setActiveSheet(sheetKey: string): void {\n if (!this._sheets.has(sheetKey)) {\n throw new Error(`Sheet with key '${sheetKey}' not found`);\n }\n\n this._activeSheetKey = sheetKey;\n\n // 更新所有sheet的active状态\n for (const [key, sheet] of this._sheets.entries()) {\n sheet.active = key === sheetKey;\n }\n }\n\n /**\n * 添加sheet\n * @param sheet 要添加的sheet\n */\n addSheet(sheet: ISheetDefine): void {\n // 检查key是否已存在\n if (this._sheets.has(sheet.sheetKey)) {\n throw new Error(`Sheet with key '${sheet.sheetKey}' already exists`);\n }\n\n // 添加sheet\n this._sheets.set(sheet.sheetKey, sheet);\n }\n\n /**\n * 移除sheet\n * @param sheetKey 要移除的sheet的key\n * @returns 新的活动sheet的key\n */\n removeSheet(sheetKey: string): string {\n // 检查key是否存在\n if (!this._sheets.has(sheetKey)) {\n throw new Error(`Sheet with key '${sheetKey}' not found`);\n }\n\n // 如果要移除的是当前活动sheet,需要选择新的活动sheet\n if (sheetKey === this._activeSheetKey) {\n // 查找其他sheet\n let nextSheet: ISheetDefine | null = null;\n\n for (const [key, sheet] of this._sheets.entries()) {\n if (key !== sheetKey) {\n nextSheet = sheet;\n break;\n }\n }\n\n // 如果有其他sheet,将其设为活动sheet\n if (nextSheet) {\n this._activeSheetKey = nextSheet.sheetKey;\n nextSheet.active = true;\n } else {\n this._activeSheetKey = '';\n }\n }\n\n // 移除sheet\n this._sheets.delete(sheetKey);\n return this._activeSheetKey;\n }\n\n /**\n * 重命名sheet\n * @param sheetKey 要重命名的sheet的key\n * @param newTitle 新的标题\n */\n renameSheet(sheetKey: string, newTitle: string): void {\n // 检查key是否存在\n if (!this._sheets.has(sheetKey)) {\n throw new Error(`Sheet with key '${sheetKey}' not found`);\n }\n\n // 更新标题\n const sheet = this._sheets.get(sheetKey)!;\n sheet.sheetTitle = newTitle;\n }\n\n /**\n * 获取所有sheet\n * @returns 所有sheet\n */\n getAllSheets(): ISheetDefine[] {\n return Array.from(this._sheets.values());\n }\n\n /**\n * 获取指定sheet\n * @param sheetKey 要获取的sheet的key\n * @returns 指定sheet\n */\n getSheet(sheetKey: string): ISheetDefine | null {\n return this._sheets.get(sheetKey) || null;\n }\n\n /**\n * 获取sheet数量\n * @returns sheet数量\n */\n getSheetCount(): number {\n return this._sheets.size;\n }\n\n /**\n * 获取sheet API\n * @param sheetKey 要获取的sheet的key\n * @returns sheet API\n */\n getSheetAPI(sheetKey: string): IWorkSheetAPI | null {\n // TODO: Implement sheet API\n return null;\n }\n\n /**\n * 监听sheet变化\n * @param callback 回调函数\n */\n onSheetChange(callback: (sheets: ISheetDefine[]) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 移除sheet变化监听\n * @param callback 回调函数\n */\n offSheetChange(callback: (sheets: ISheetDefine[]) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 监听活动sheet变化\n * @param callback 回调函数\n */\n onActiveSheetChange(callback: (sheet: ISheetDefine) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 移除活动sheet变化监听\n * @param callback 回调函数\n */\n offActiveSheetChange(callback: (sheet: ISheetDefine) => void): void {\n // TODO: Implement event handling\n }\n\n /**\n * 移动sheet的位置\n * @param sourceKey 源sheet的key\n * @param targetKey 目标sheet的key\n */\n reorderSheet(sourceKey: string, targetKey: string, position: 'left' | 'right'): void {\n if (sourceKey === targetKey) {\n console.warn('Source and target sheet keys cannot be the same');\n return;\n }\n if (!this._sheets.has(sourceKey)) {\n throw new Error(`Source sheet '${sourceKey}' does not exist`);\n }\n if (!this._sheets.has(targetKey)) {\n throw new Error(`Target sheet '${targetKey}' does not exist`);\n }\n // 计算索引\n const sheetsArray = Array.from(this._sheets.entries());\n const sourceIndex = sheetsArray.findIndex(([key]) => key === sourceKey);\n const targetIndex = sheetsArray.findIndex(([key]) => key === targetKey);\n if (sourceIndex === -1 || targetIndex === -1 || sourceIndex === targetIndex) {\n return;\n }\n // 计算插入位置\n let insertIndex = position === 'left' ? targetIndex : targetIndex + 1;\n // 调整索引\n if (sourceIndex < insertIndex) {\n insertIndex--;\n }\n // 重排序\n const [movedSheet] = sheetsArray.splice(sourceIndex, 1);\n sheetsArray.splice(insertIndex, 0, movedSheet);\n // 清空并重新添加\n this._sheets.clear();\n sheetsArray.forEach(([key, sheet]) => {\n this._sheets.set(key, sheet);\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type VTableSheet from '../components/vtable-sheet';
|
|
2
|
+
export default class SheetTabDragManager {
|
|
3
|
+
private sheet;
|
|
4
|
+
private dragState;
|
|
5
|
+
private insertIndicator;
|
|
6
|
+
private boundMouseMove;
|
|
7
|
+
private boundMouseUp;
|
|
8
|
+
constructor(sheet: VTableSheet);
|
|
9
|
+
handleTabMouseDown(e: MouseEvent, sheetKey: string): void;
|
|
10
|
+
handleGlobalMouseMove(e: MouseEvent): void;
|
|
11
|
+
handleGlobalMouseUp(e: MouseEvent): void;
|
|
12
|
+
startDragging(): void;
|
|
13
|
+
updateDragging(e: MouseEvent): void;
|
|
14
|
+
endDragging(e: MouseEvent): void;
|
|
15
|
+
createDragPreview(): void;
|
|
16
|
+
updateDragPreview(e: MouseEvent): void;
|
|
17
|
+
cleanupDragPreview(): void;
|
|
18
|
+
calculateDropZones(): void;
|
|
19
|
+
getDropZoneAt(x: number, y: number): typeof this.dragState.dropZones[0] | null;
|
|
20
|
+
showInsertIndicator(dropZone: typeof this.dragState.dropZones[0]): void;
|
|
21
|
+
hideInsertIndicator(): void;
|
|
22
|
+
performTabReorder(sourceKey: string, targetKey: string, position: 'left' | 'right'): void;
|
|
23
|
+
cleanupDragState(): void;
|
|
24
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
class SheetTabDragManager {
|
|
8
|
+
constructor(sheet) {
|
|
9
|
+
this.dragState = {
|
|
10
|
+
isDragging: !1,
|
|
11
|
+
draggedSheetKey: null,
|
|
12
|
+
draggedElement: null,
|
|
13
|
+
startX: 0,
|
|
14
|
+
startY: 0,
|
|
15
|
+
threshold: 5,
|
|
16
|
+
preview: null,
|
|
17
|
+
dropZones: []
|
|
18
|
+
}, this.insertIndicator = null, this.sheet = sheet, this.boundMouseMove = e => this.handleGlobalMouseMove(e),
|
|
19
|
+
this.boundMouseUp = e => this.handleGlobalMouseUp(e);
|
|
20
|
+
}
|
|
21
|
+
handleTabMouseDown(e, sheetKey) {
|
|
22
|
+
this.insertIndicator || (this.insertIndicator = this.sheet.getRootElement().querySelector(".vtable-sheet-insert-indicator")),
|
|
23
|
+
0 === e.button && (e.preventDefault(), this.dragState.startX = e.clientX, this.dragState.startY = e.clientY,
|
|
24
|
+
this.dragState.draggedSheetKey = sheetKey, this.dragState.draggedElement = e.target,
|
|
25
|
+
document.addEventListener("mousemove", this.boundMouseMove), document.addEventListener("mouseup", this.boundMouseUp));
|
|
26
|
+
}
|
|
27
|
+
handleGlobalMouseMove(e) {
|
|
28
|
+
if (!this.dragState.draggedSheetKey || !this.dragState.draggedElement) return;
|
|
29
|
+
const deltaX = Math.abs(e.clientX - this.dragState.startX), deltaY = Math.abs(e.clientY - this.dragState.startY);
|
|
30
|
+
!this.dragState.isDragging && (deltaX > this.dragState.threshold || deltaY > this.dragState.threshold) && this.startDragging(),
|
|
31
|
+
this.dragState.isDragging && this.updateDragging(e);
|
|
32
|
+
}
|
|
33
|
+
handleGlobalMouseUp(e) {
|
|
34
|
+
this.dragState.isDragging && this.endDragging(e), this.cleanupDragState(), document.removeEventListener("mousemove", (e => this.handleGlobalMouseMove(e))),
|
|
35
|
+
document.removeEventListener("mouseup", (e => this.handleGlobalMouseUp(e)));
|
|
36
|
+
}
|
|
37
|
+
startDragging() {
|
|
38
|
+
this.dragState.draggedElement && this.dragState.draggedSheetKey && (this.dragState.isDragging = !0,
|
|
39
|
+
this.dragState.draggedElement.classList.add("dragging"), this.createDragPreview(),
|
|
40
|
+
this.calculateDropZones(), this.insertIndicator && (this.insertIndicator.style.display = "block"));
|
|
41
|
+
}
|
|
42
|
+
updateDragging(e) {
|
|
43
|
+
if (!this.dragState.isDragging) return;
|
|
44
|
+
this.updateDragPreview(e);
|
|
45
|
+
const dropZone = this.getDropZoneAt(e.clientX, e.clientY);
|
|
46
|
+
dropZone ? this.showInsertIndicator(dropZone) : this.hideInsertIndicator();
|
|
47
|
+
}
|
|
48
|
+
endDragging(e) {
|
|
49
|
+
if (!this.dragState.isDragging || !this.dragState.draggedSheetKey) return;
|
|
50
|
+
const dropZone = this.getDropZoneAt(e.clientX, e.clientY);
|
|
51
|
+
dropZone && dropZone.targetKey !== this.dragState.draggedSheetKey && this.performTabReorder(this.dragState.draggedSheetKey, dropZone.targetKey, dropZone.position),
|
|
52
|
+
this.hideInsertIndicator(), this.dragState.draggedElement && this.dragState.draggedElement.classList.remove("dragging");
|
|
53
|
+
}
|
|
54
|
+
createDragPreview() {
|
|
55
|
+
this.dragState.draggedElement && (this.dragState.preview = document.createElement("div"),
|
|
56
|
+
this.dragState.preview.className = "vtable-sheet-drag-preview", this.dragState.preview.innerHTML = `\n <span class="drag-preview-text">${this.dragState.draggedElement.textContent}</span>\n `,
|
|
57
|
+
document.body.appendChild(this.dragState.preview), this.dragState.draggedElement.style.cursor = "grabbing");
|
|
58
|
+
}
|
|
59
|
+
updateDragPreview(e) {
|
|
60
|
+
this.dragState.preview && (this.dragState.preview.style.left = e.clientX - this.dragState.preview.offsetWidth / 2 + "px",
|
|
61
|
+
this.dragState.preview.style.top = e.clientY - this.dragState.preview.offsetHeight / 2 + "px");
|
|
62
|
+
}
|
|
63
|
+
cleanupDragPreview() {
|
|
64
|
+
this.dragState.preview && (this.dragState.preview.remove(), this.dragState.preview = null),
|
|
65
|
+
this.dragState.draggedElement && (this.dragState.draggedElement.style.cursor = "");
|
|
66
|
+
}
|
|
67
|
+
calculateDropZones() {
|
|
68
|
+
var _a;
|
|
69
|
+
this.dragState.dropZones = [];
|
|
70
|
+
const tabsContainer = null === (_a = this.sheet.getSheetTabElement()) || void 0 === _a ? void 0 : _a.querySelector(".vtable-sheet-tabs-container");
|
|
71
|
+
if (!tabsContainer) return;
|
|
72
|
+
tabsContainer.querySelectorAll(".vtable-sheet-tab").forEach((tab => {
|
|
73
|
+
const sheetKey = tab.dataset.key;
|
|
74
|
+
sheetKey && sheetKey !== this.dragState.draggedSheetKey && (this.dragState.dropZones.push({
|
|
75
|
+
element: tab,
|
|
76
|
+
position: "left",
|
|
77
|
+
targetKey: sheetKey
|
|
78
|
+
}), this.dragState.dropZones.push({
|
|
79
|
+
element: tab,
|
|
80
|
+
position: "right",
|
|
81
|
+
targetKey: sheetKey
|
|
82
|
+
}));
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
getDropZoneAt(x, y) {
|
|
86
|
+
for (const zone of this.dragState.dropZones) {
|
|
87
|
+
const rect = zone.element.getBoundingClientRect();
|
|
88
|
+
if (y < rect.top || y > rect.bottom) continue;
|
|
89
|
+
const midX = rect.left + rect.width / 2;
|
|
90
|
+
if ("left" === zone.position && x >= rect.left && x <= midX) return zone;
|
|
91
|
+
if ("right" === zone.position && x >= midX && x <= rect.right) return zone;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
showInsertIndicator(dropZone) {
|
|
96
|
+
var _a;
|
|
97
|
+
if (!this.insertIndicator) return;
|
|
98
|
+
const rect = dropZone.element.getBoundingClientRect(), containerRect = null === (_a = this.sheet.getRootElement().querySelector(".vtable-sheet-tabs-container")) || void 0 === _a ? void 0 : _a.getBoundingClientRect();
|
|
99
|
+
if (!containerRect) return;
|
|
100
|
+
let indicatorX;
|
|
101
|
+
indicatorX = "left" === dropZone.position ? rect.left - containerRect.left - 4 : rect.right - containerRect.left - 4,
|
|
102
|
+
this.insertIndicator.style.left = `${indicatorX}px`, this.insertIndicator.style.display = "block";
|
|
103
|
+
}
|
|
104
|
+
hideInsertIndicator() {
|
|
105
|
+
this.insertIndicator && (this.insertIndicator.style.display = "none");
|
|
106
|
+
}
|
|
107
|
+
performTabReorder(sourceKey, targetKey, position) {
|
|
108
|
+
try {
|
|
109
|
+
this.sheet.getSheetManager().reorderSheet(sourceKey, targetKey, position), this.sheet.updateSheetTabs(),
|
|
110
|
+
this.sheet.updateSheetMenu();
|
|
111
|
+
} catch (error) {}
|
|
112
|
+
}
|
|
113
|
+
cleanupDragState() {
|
|
114
|
+
this.cleanupDragPreview(), this.dragState.isDragging = !1, this.dragState.draggedSheetKey = null,
|
|
115
|
+
this.dragState.draggedElement = null, this.dragState.dropZones = [], this.dragState.startX = 0,
|
|
116
|
+
this.dragState.startY = 0;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
exports.default = SheetTabDragManager;
|
|
121
|
+
//# sourceMappingURL=tab-drag-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/managers/tab-drag-manager.ts"],"names":[],"mappings":"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","file":"tab-drag-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\n\n// 拖拽状态接口\ninterface DragState {\n isDragging: boolean;\n draggedSheetKey: string | null;\n draggedElement: HTMLElement | null;\n startX: number;\n startY: number;\n threshold: number;\n preview: HTMLElement | null;\n dropZones: Array<{\n element: HTMLElement;\n position: 'left' | 'right';\n targetKey: string;\n }>;\n}\n\nexport default class SheetTabDragManager {\n // 依赖的VTableSheet实例\n private sheet: VTableSheet;\n // 拖拽状态\n private dragState: DragState = {\n isDragging: false,\n draggedSheetKey: null,\n draggedElement: null,\n startX: 0,\n startY: 0,\n threshold: 5,\n preview: null,\n dropZones: []\n };\n // 插入指示器\n private insertIndicator: HTMLElement | null = null;\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n // 绑定this上下文并存储函数引用\n this.boundMouseMove = e => this.handleGlobalMouseMove(e);\n this.boundMouseUp = e => this.handleGlobalMouseUp(e);\n }\n\n /**\n * 处理tab鼠标按下事件\n */\n handleTabMouseDown(e: MouseEvent, sheetKey: string): void {\n if (!this.insertIndicator) {\n this.insertIndicator = this.sheet.getRootElement().querySelector('.vtable-sheet-insert-indicator') as HTMLElement;\n }\n if (e.button !== 0) {\n return;\n }\n e.preventDefault();\n // 记录拖拽开始位置\n this.dragState.startX = e.clientX;\n this.dragState.startY = e.clientY;\n this.dragState.draggedSheetKey = sheetKey;\n this.dragState.draggedElement = e.target as HTMLElement;\n\n // 全局鼠标事件监听\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n }\n\n /**\n * 处理全局鼠标移动事件\n *\n */\n handleGlobalMouseMove(e: MouseEvent): void {\n if (!this.dragState.draggedSheetKey || !this.dragState.draggedElement) {\n return;\n }\n const deltaX = Math.abs(e.clientX - this.dragState.startX);\n const deltaY = Math.abs(e.clientY - this.dragState.startY);\n // 判断是否超过拖拽阈值\n if (!this.dragState.isDragging && (deltaX > this.dragState.threshold || deltaY > this.dragState.threshold)) {\n this.startDragging();\n }\n if (this.dragState.isDragging) {\n this.updateDragging(e);\n }\n }\n\n /**\n * 处理全局鼠标抬起事件\n */\n handleGlobalMouseUp(e: MouseEvent): void {\n if (this.dragState.isDragging) {\n this.endDragging(e);\n }\n // 清理拖拽状态\n this.cleanupDragState();\n // 移除全局事件监听\n document.removeEventListener('mousemove', (e: MouseEvent) => this.handleGlobalMouseMove(e));\n document.removeEventListener('mouseup', (e: MouseEvent) => this.handleGlobalMouseUp(e));\n }\n\n /**\n * 开始拖拽\n */\n startDragging(): void {\n if (!this.dragState.draggedElement || !this.dragState.draggedSheetKey) {\n return;\n }\n this.dragState.isDragging = true;\n this.dragState.draggedElement.classList.add('dragging');\n // 创建拖拽预览\n this.createDragPreview();\n // 计算放置区域\n this.calculateDropZones();\n if (this.insertIndicator) {\n this.insertIndicator.style.display = 'block';\n }\n }\n\n /**\n * 更新拖拽状态\n */\n updateDragging(e: MouseEvent): void {\n if (!this.dragState.isDragging) {\n return;\n }\n // 更新拖拽预览位置\n this.updateDragPreview(e);\n // 检测当前鼠标位置对应的放置区域\n const dropZone = this.getDropZoneAt(e.clientX, e.clientY);\n if (dropZone) {\n this.showInsertIndicator(dropZone);\n } else {\n this.hideInsertIndicator();\n }\n }\n\n /**\n * 结束拖拽\n */\n endDragging(e: MouseEvent): void {\n if (!this.dragState.isDragging || !this.dragState.draggedSheetKey) {\n return;\n }\n // 检查是否有有效的放置目标\n const dropZone = this.getDropZoneAt(e.clientX, e.clientY);\n if (dropZone && dropZone.targetKey !== this.dragState.draggedSheetKey) {\n // 执行拖拽排序\n this.performTabReorder(this.dragState.draggedSheetKey, dropZone.targetKey, dropZone.position);\n }\n this.hideInsertIndicator();\n if (this.dragState.draggedElement) {\n this.dragState.draggedElement.classList.remove('dragging');\n }\n }\n\n /**\n * 创建拖拽预览\n */\n createDragPreview(): void {\n if (!this.dragState.draggedElement) {\n return;\n }\n // 创建拖拽预览元素\n this.dragState.preview = document.createElement('div');\n this.dragState.preview.className = 'vtable-sheet-drag-preview';\n this.dragState.preview.innerHTML = `\n <span class=\"drag-preview-text\">${this.dragState.draggedElement.textContent}</span>\n `;\n document.body.appendChild(this.dragState.preview);\n this.dragState.draggedElement.style.cursor = 'grabbing';\n }\n\n /**\n * 更新拖拽预览位置\n */\n updateDragPreview(e: MouseEvent): void {\n if (!this.dragState.preview) {\n return;\n }\n this.dragState.preview.style.left = `${e.clientX - this.dragState.preview.offsetWidth / 2}px`;\n this.dragState.preview.style.top = `${e.clientY - this.dragState.preview.offsetHeight / 2}px`;\n }\n\n /**\n * 清理拖拽预览\n */\n cleanupDragPreview(): void {\n // 移除拖拽预览元素\n if (this.dragState.preview) {\n this.dragState.preview.remove();\n this.dragState.preview = null;\n }\n if (this.dragState.draggedElement) {\n this.dragState.draggedElement.style.cursor = '';\n }\n }\n\n /**\n * 计算放置区域\n */\n calculateDropZones(): void {\n this.dragState.dropZones = [];\n const tabsContainer = this.sheet.getSheetTabElement()?.querySelector('.vtable-sheet-tabs-container') as HTMLElement;\n if (!tabsContainer) {\n return;\n }\n const tabs = tabsContainer.querySelectorAll('.vtable-sheet-tab') as NodeListOf<HTMLElement>;\n tabs.forEach(tab => {\n const sheetKey = tab.dataset.key;\n if (!sheetKey || sheetKey === this.dragState.draggedSheetKey) {\n return;\n }\n // 左侧放置区域\n this.dragState.dropZones.push({\n element: tab,\n position: 'left',\n targetKey: sheetKey\n });\n\n // 右侧放置区域\n this.dragState.dropZones.push({\n element: tab,\n position: 'right',\n targetKey: sheetKey\n });\n });\n }\n\n /**\n * 获取指定位置的放置区域\n */\n getDropZoneAt(x: number, y: number): typeof this.dragState.dropZones[0] | null {\n for (const zone of this.dragState.dropZones) {\n const rect = zone.element.getBoundingClientRect();\n\n // 检查Y坐标是否在tab范围内\n if (y < rect.top || y > rect.bottom) {\n continue;\n }\n const midX = rect.left + rect.width / 2;\n if (zone.position === 'left' && x >= rect.left && x <= midX) {\n return zone;\n } else if (zone.position === 'right' && x >= midX && x <= rect.right) {\n return zone;\n }\n }\n\n return null;\n }\n\n /**\n * 显示插入指示器\n */\n showInsertIndicator(dropZone: typeof this.dragState.dropZones[0]): void {\n if (!this.insertIndicator) {\n return;\n }\n const rect = dropZone.element.getBoundingClientRect();\n const containerRect = this.sheet\n .getRootElement()\n .querySelector('.vtable-sheet-tabs-container')\n ?.getBoundingClientRect();\n if (!containerRect) {\n return;\n }\n let indicatorX: number;\n if (dropZone.position === 'left') {\n indicatorX = rect.left - containerRect.left - 4;\n } else {\n indicatorX = rect.right - containerRect.left - 4;\n }\n this.insertIndicator.style.left = `${indicatorX}px`;\n this.insertIndicator.style.display = 'block';\n }\n\n /**\n * 隐藏插入指示器\n */\n hideInsertIndicator(): void {\n if (this.insertIndicator) {\n this.insertIndicator.style.display = 'none';\n }\n }\n\n /**\n * 执行tab排序\n * @param sourceKey 源tab的key\n * @param targetKey 目标tab的key\n * @param position 插入位置 左侧或右侧\n */\n performTabReorder(sourceKey: string, targetKey: string, position: 'left' | 'right'): void {\n try {\n this.sheet.getSheetManager().reorderSheet(sourceKey, targetKey, position);\n // 更新UI\n this.sheet.updateSheetTabs();\n this.sheet.updateSheetMenu();\n } catch (error) {\n console.error('Tab reorder failed:', error);\n }\n }\n\n /**\n * 清理拖拽状态\n */\n cleanupDragState(): void {\n this.cleanupDragPreview();\n // 重置拖拽状态\n this.dragState.isDragging = false;\n this.dragState.draggedSheetKey = null;\n this.dragState.draggedElement = null;\n this.dragState.dropZones = [];\n this.dragState.startX = 0;\n this.dragState.startY = 0;\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SelectionMode } from './ts-types';
|
|
2
|
+
import type { SheetConstructorOptions } from './ts-types';
|
|
3
|
+
export declare function initOptions(options: SheetConstructorOptions): {
|
|
4
|
+
defaultRowHeight: number;
|
|
5
|
+
defaultColWidth: number;
|
|
6
|
+
showRowHeader: boolean;
|
|
7
|
+
showColHeader: boolean;
|
|
8
|
+
editable: boolean;
|
|
9
|
+
theme: string;
|
|
10
|
+
selectionMode: SelectionMode;
|
|
11
|
+
pixelRatio: number;
|
|
12
|
+
};
|
|
13
|
+
export declare function columnStringToIndex(colStr: string): number;
|
|
14
|
+
export declare function columnIndexToString(colIndex: number): string;
|
|
15
|
+
export declare function dataToRecords(data: any[][]): any[];
|
|
16
|
+
export declare function recordsToData(records: any[], columns: any[]): any[][];
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.recordsToData = exports.dataToRecords = exports.columnIndexToString = exports.columnStringToIndex = exports.initOptions = void 0;
|
|
6
|
+
|
|
7
|
+
const ts_types_1 = require("./ts-types");
|
|
8
|
+
|
|
9
|
+
function initOptions(options) {
|
|
10
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
11
|
+
return {
|
|
12
|
+
defaultRowHeight: null !== (_a = options.defaultRowHeight) && void 0 !== _a ? _a : 25,
|
|
13
|
+
defaultColWidth: null !== (_b = options.defaultColWidth) && void 0 !== _b ? _b : 100,
|
|
14
|
+
showRowHeader: null === (_c = options.showRowHeader) || void 0 === _c || _c,
|
|
15
|
+
showColHeader: null === (_d = options.showColHeader) || void 0 === _d || _d,
|
|
16
|
+
editable: null === (_e = options.editable) || void 0 === _e || _e,
|
|
17
|
+
theme: null !== (_f = options.theme) && void 0 !== _f ? _f : "light",
|
|
18
|
+
selectionMode: null !== (_g = options.selectionMode) && void 0 !== _g ? _g : ts_types_1.SelectionMode.CELL,
|
|
19
|
+
pixelRatio: window.devicePixelRatio || 1
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function columnStringToIndex(colStr) {
|
|
24
|
+
let col = 0;
|
|
25
|
+
for (let i = 0; i < colStr.length; i++) col = 26 * col + (colStr.charCodeAt(i) - 64);
|
|
26
|
+
return col - 1;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function columnIndexToString(colIndex) {
|
|
30
|
+
let colStr = "", tempCol = colIndex + 1;
|
|
31
|
+
do {
|
|
32
|
+
tempCol -= 1, colStr = String.fromCharCode(65 + tempCol % 26) + colStr, tempCol = Math.floor(tempCol / 26);
|
|
33
|
+
} while (tempCol > 0);
|
|
34
|
+
return colStr;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function dataToRecords(data) {
|
|
38
|
+
if (!data || !data.length) return [];
|
|
39
|
+
const records = [], headerRow = data[0];
|
|
40
|
+
for (let i = 1; i < data.length; i++) {
|
|
41
|
+
const row = data[i], record = {};
|
|
42
|
+
for (let j = 0; j < row.length; j++) {
|
|
43
|
+
record[headerRow && j < headerRow.length ? headerRow[j] : j.toString()] = row[j];
|
|
44
|
+
}
|
|
45
|
+
records.push(record);
|
|
46
|
+
}
|
|
47
|
+
return records;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function recordsToData(records, columns) {
|
|
51
|
+
if (!records || !records.length) return [];
|
|
52
|
+
const data = [], headerRow = columns.map((col => col.title || col.field));
|
|
53
|
+
data.push(headerRow);
|
|
54
|
+
for (const record of records) {
|
|
55
|
+
const row = columns.map((col => record[col.field]));
|
|
56
|
+
data.push(row);
|
|
57
|
+
}
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
exports.initOptions = initOptions, exports.columnStringToIndex = columnStringToIndex,
|
|
62
|
+
exports.columnIndexToString = columnIndexToString, exports.dataToRecords = dataToRecords,
|
|
63
|
+
exports.recordsToData = recordsToData;
|
|
64
|
+
//# sourceMappingURL=sheet-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sheet-helper.ts"],"names":[],"mappings":"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","file":"sheet-helper.js","sourcesContent":["import { SelectionMode } from './ts-types';\nimport type { SheetConstructorOptions } from './ts-types';\n\n/**\n * Initialize options with defaults for the Sheet component\n * @param options User provided options\n * @returns Parsed options with defaults applied\n */\nexport function initOptions(options: SheetConstructorOptions): {\n defaultRowHeight: number;\n defaultColWidth: number;\n showRowHeader: boolean;\n showColHeader: boolean;\n editable: boolean;\n theme: string;\n selectionMode: SelectionMode;\n pixelRatio: number;\n} {\n return {\n defaultRowHeight: options.defaultRowHeight ?? 25,\n defaultColWidth: options.defaultColWidth ?? 100,\n showRowHeader: options.showRowHeader ?? true,\n showColHeader: options.showColHeader ?? true,\n editable: options.editable ?? true,\n theme: options.theme ?? 'light',\n selectionMode: options.selectionMode ?? SelectionMode.CELL,\n pixelRatio: window.devicePixelRatio || 1\n };\n}\n\n/**\n * Convert A1 notation to column index (0-based)\n * @param colStr Column string (e.g., 'A', 'B', 'AA')\n * @returns Column index (0-based)\n */\nexport function columnStringToIndex(colStr: string): number {\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n return col - 1;\n}\n\n/**\n * Convert column index to A1 notation string\n * @param colIndex Column index (0-based)\n * @returns Column string (e.g., 'A', 'B', 'AA')\n */\nexport function columnIndexToString(colIndex: number): string {\n let colStr = '';\n let tempCol = colIndex + 1;\n\n do {\n tempCol -= 1;\n colStr = String.fromCharCode(65 + (tempCol % 26)) + colStr;\n tempCol = Math.floor(tempCol / 26);\n } while (tempCol > 0);\n\n return colStr;\n}\n\n/**\n * Convert sheet data to VTable records format\n * @param data Sheet data (2D array)\n * @returns VTable records format\n */\nexport function dataToRecords(data: any[][]): any[] {\n if (!data || !data.length) {\n return [];\n }\n\n const records = [];\n const headerRow = data[0];\n\n // Skip header row if it exists\n for (let i = 1; i < data.length; i++) {\n const row = data[i];\n const record: Record<string, any> = {};\n\n for (let j = 0; j < row.length; j++) {\n // Use header row values as field names if available, otherwise use column index\n const fieldName = headerRow && j < headerRow.length ? headerRow[j] : j.toString();\n record[fieldName] = row[j];\n }\n\n records.push(record);\n }\n\n return records;\n}\n\n/**\n * Convert VTable records format to sheet data (2D array)\n * @param records VTable records\n * @param columns VTable columns definition\n * @returns Sheet data (2D array)\n */\nexport function recordsToData(records: any[], columns: any[]): any[][] {\n if (!records || !records.length) {\n return [];\n }\n\n const data: any[][] = [];\n\n // Add header row based on column definitions\n const headerRow = columns.map(col => col.title || col.field);\n data.push(headerRow);\n\n // Add data rows\n for (const record of records) {\n const row = columns.map(col => record[col.field]);\n data.push(row);\n }\n\n return data;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyle(): void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.importStyle = void 0;
|
|
6
|
+
|
|
7
|
+
const env_1 = require("../tools/env");
|
|
8
|
+
|
|
9
|
+
function importStyle() {
|
|
10
|
+
if ("node" === env_1.Env.mode) return;
|
|
11
|
+
const styleElement = document.createElement("style");
|
|
12
|
+
styleElement.id = "vtable-sheet-common-styleSheet", styleElement.textContent = "\n/* 通用样式和变量 */\n:root {\n --border-color: #e0e0e0;\n --primary-color: #1a73e8;\n --hover-color: #f5f5f5;\n --active-color: #e8f0fe;\n --text-color: #333;\n --gray-text: #666;\n --light-gray: #f8f8f8;\n --toolbar-height: 28px;\n --tab-height: 28px;\n\n /* 基础颜色 */\n --primary-color-light: #e8f0fe;\n --secondary-color: #4285f4;\n --success-color: #1e8e3e;\n --warning-color: #ffa000;\n --danger-color: #d93025;\n --info-color: #1a73e8;\n\n /* 中性色 */\n --black: #000;\n --gray-900: #212121;\n --gray-800: #424242;\n --gray-700: #616161;\n --gray-600: #757575;\n --gray-500: #9e9e9e;\n --gray-400: #bdbdbd;\n --gray-300: #e0e0e0;\n --gray-200: #eeeeee;\n --gray-100: #f5f5f5;\n --gray-50: #fafafa;\n --white: #fff;\n\n /* 文本颜色 */\n --text-primary: var(--gray-900);\n --text-secondary: var(--gray-700);\n --text-tertiary: var(--gray-500);\n --text-disabled: var(--gray-400);\n --text-inverse: var(--white);\n\n /* 边框颜色 */\n --border-color-light: var(--gray-200);\n --border-color-dark: var(--gray-400);\n\n /* 背景颜色 */\n --bg-default: var(--white);\n --bg-secondary: var(--gray-100);\n --bg-tertiary: var(--gray-200);\n --bg-selected: var(--primary-color-light);\n --bg-hover: var(--gray-100);\n\n /* 阴影 */\n --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);\n --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\n --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);\n\n /* 尺寸 */\n --formula-bar-height: 30px;\n --icon-size-small: 16px;\n --icon-size-medium: 20px;\n --icon-size-large: 24px;\n\n /* 字体 */\n --font-family-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', \n Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n --font-family-mono: 'Roboto Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n\n /* 间距 */\n --spacing-xs: 4px;\n --spacing-sm: 8px;\n --spacing-md: 12px;\n --spacing-lg: 16px;\n --spacing-xl: 24px;\n\n /* 边框圆角 */\n --border-radius-sm: 2px;\n --border-radius-md: 4px;\n --border-radius-lg: 8px;\n --border-radius-full: 999px;\n\n /* 过渡时间 */\n --transition-fast: 0.1s;\n --transition-normal: 0.2s;\n --transition-slow: 0.3s;\n}\n\n/* 统一的文本与选择 */\n.vtable-sheet-noselect {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.vtable-sheet-allow-select {\n -webkit-touch-callout: text;\n -webkit-user-select: text;\n -khtml-user-select: text;\n -moz-user-select: text;\n -ms-user-select: text;\n user-select: text;\n}\n\n/* 通用样式 */\n.vtable-sheet-flex {\n display: flex;\n}\n\n.vtable-sheet-flex-center {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vtable-sheet-flex-between {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.vtable-sheet-flex-end {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.vtable-sheet-flex-column {\n display: flex;\n flex-direction: column;\n}\n\n.vtable-sheet-flex-1 {\n flex: 1;\n}\n\n.vtable-sheet-flex-grow-0 {\n flex-grow: 0;\n}\n\n.vtable-sheet-flex-shrink-0 {\n flex-shrink: 0;\n}\n\n.vtable-sheet-hidden {\n display: none !important;\n}\n\n.vtable-sheet-invisible {\n visibility: hidden !important;\n}\n\n.vtable-sheet-ellipsis {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 图标样式 */\n.vtable-sheet-icon {\n width: var(--icon-size-medium);\n height: var(--icon-size-medium);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--gray-700);\n}\n\n.vtable-sheet-icon-sm {\n width: var(--icon-size-small);\n height: var(--icon-size-small);\n}\n\n.vtable-sheet-icon-lg {\n width: var(--icon-size-large);\n height: var(--icon-size-large);\n}\n\n/* 按钮样式 */\n.vtable-sheet-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n border: 1px solid var(--border-color);\n background-color: var(--bg-default);\n color: var(--text-secondary);\n border-radius: var(--border-radius-sm);\n cursor: pointer;\n transition: all var(--transition-normal);\n font-family: var(--font-family-sans);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.vtable-sheet-button:hover {\n background-color: var(--bg-hover);\n}\n\n.vtable-sheet-button:active {\n background-color: var(--bg-tertiary);\n}\n\n.vtable-sheet-button-primary {\n background-color: var(--primary-color);\n color: var(--white);\n border-color: var(--primary-color);\n}\n\n.vtable-sheet-button-primary:hover {\n background-color: var(--secondary-color);\n border-color: var(--secondary-color);\n}\n\n.vtable-sheet-button-icon {\n padding: var(--spacing-xs);\n border: none;\n background: transparent;\n}\n\n.vtable-sheet-button-icon:hover {\n background-color: var(--bg-hover);\n}\n\n/* 工具提示 */\n.vtable-sheet-tooltip {\n position: relative;\n}\n\n.vtable-sheet-tooltip::after {\n content: attr(data-tooltip);\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n padding: 4px 8px;\n background-color: var(--gray-900);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: opacity var(--transition-normal), visibility var(--transition-normal);\n z-index: 1000;\n}\n\n.vtable-sheet-tooltip:hover::after {\n opacity: 1;\n visibility: visible;\n}\n\n/* 输入框样式 */\n.vtable-sheet-input {\n padding: var(--spacing-xs) var(--spacing-sm);\n border: 1px solid var(--border-color);\n border-radius: var(--border-radius-sm);\n font-family: var(--font-family-sans);\n font-size: 13px;\n outline: none;\n transition: border-color var(--transition-normal);\n}\n\n.vtable-sheet-input:focus {\n border-color: var(--primary-color);\n}\n\n/* 动画和过渡 */\n.vtable-sheet-fade-in {\n animation: vtable-sheet-fade-in var(--transition-normal) ease-in-out;\n}\n\n@keyframes vtable-sheet-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n.vtable-sheet-fade-out {\n animation: vtable-sheet-fade-out var(--transition-normal) ease-in-out;\n}\n\n@keyframes vtable-sheet-fade-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n\n/* 滚动条样式 */\n.vtable-sheet-scrollbar {\n scrollbar-width: thin;\n scrollbar-color: var(--gray-400) transparent;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-thumb {\n background-color: var(--gray-400);\n border-radius: 4px;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-thumb:hover {\n background-color: var(--gray-500);\n} \n",
|
|
13
|
+
document.head.appendChild(styleElement);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.importStyle = importStyle;
|
|
17
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/common.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AAEnC,SAAgB,WAAW;IACzB,IAAI,SAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,gCAAgC,CAAC;IACnD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiU5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AA1UD,kCA0UC","file":"common.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-common-styleSheet';\n styleElement.textContent = `\n/* 通用样式和变量 */\n:root {\n --border-color: #e0e0e0;\n --primary-color: #1a73e8;\n --hover-color: #f5f5f5;\n --active-color: #e8f0fe;\n --text-color: #333;\n --gray-text: #666;\n --light-gray: #f8f8f8;\n --toolbar-height: 28px;\n --tab-height: 28px;\n\n /* 基础颜色 */\n --primary-color-light: #e8f0fe;\n --secondary-color: #4285f4;\n --success-color: #1e8e3e;\n --warning-color: #ffa000;\n --danger-color: #d93025;\n --info-color: #1a73e8;\n\n /* 中性色 */\n --black: #000;\n --gray-900: #212121;\n --gray-800: #424242;\n --gray-700: #616161;\n --gray-600: #757575;\n --gray-500: #9e9e9e;\n --gray-400: #bdbdbd;\n --gray-300: #e0e0e0;\n --gray-200: #eeeeee;\n --gray-100: #f5f5f5;\n --gray-50: #fafafa;\n --white: #fff;\n\n /* 文本颜色 */\n --text-primary: var(--gray-900);\n --text-secondary: var(--gray-700);\n --text-tertiary: var(--gray-500);\n --text-disabled: var(--gray-400);\n --text-inverse: var(--white);\n\n /* 边框颜色 */\n --border-color-light: var(--gray-200);\n --border-color-dark: var(--gray-400);\n\n /* 背景颜色 */\n --bg-default: var(--white);\n --bg-secondary: var(--gray-100);\n --bg-tertiary: var(--gray-200);\n --bg-selected: var(--primary-color-light);\n --bg-hover: var(--gray-100);\n\n /* 阴影 */\n --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);\n --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\n --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);\n\n /* 尺寸 */\n --formula-bar-height: 30px;\n --icon-size-small: 16px;\n --icon-size-medium: 20px;\n --icon-size-large: 24px;\n\n /* 字体 */\n --font-family-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', \n Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n --font-family-mono: 'Roboto Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n\n /* 间距 */\n --spacing-xs: 4px;\n --spacing-sm: 8px;\n --spacing-md: 12px;\n --spacing-lg: 16px;\n --spacing-xl: 24px;\n\n /* 边框圆角 */\n --border-radius-sm: 2px;\n --border-radius-md: 4px;\n --border-radius-lg: 8px;\n --border-radius-full: 999px;\n\n /* 过渡时间 */\n --transition-fast: 0.1s;\n --transition-normal: 0.2s;\n --transition-slow: 0.3s;\n}\n\n/* 统一的文本与选择 */\n.vtable-sheet-noselect {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.vtable-sheet-allow-select {\n -webkit-touch-callout: text;\n -webkit-user-select: text;\n -khtml-user-select: text;\n -moz-user-select: text;\n -ms-user-select: text;\n user-select: text;\n}\n\n/* 通用样式 */\n.vtable-sheet-flex {\n display: flex;\n}\n\n.vtable-sheet-flex-center {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vtable-sheet-flex-between {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.vtable-sheet-flex-end {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.vtable-sheet-flex-column {\n display: flex;\n flex-direction: column;\n}\n\n.vtable-sheet-flex-1 {\n flex: 1;\n}\n\n.vtable-sheet-flex-grow-0 {\n flex-grow: 0;\n}\n\n.vtable-sheet-flex-shrink-0 {\n flex-shrink: 0;\n}\n\n.vtable-sheet-hidden {\n display: none !important;\n}\n\n.vtable-sheet-invisible {\n visibility: hidden !important;\n}\n\n.vtable-sheet-ellipsis {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 图标样式 */\n.vtable-sheet-icon {\n width: var(--icon-size-medium);\n height: var(--icon-size-medium);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--gray-700);\n}\n\n.vtable-sheet-icon-sm {\n width: var(--icon-size-small);\n height: var(--icon-size-small);\n}\n\n.vtable-sheet-icon-lg {\n width: var(--icon-size-large);\n height: var(--icon-size-large);\n}\n\n/* 按钮样式 */\n.vtable-sheet-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n border: 1px solid var(--border-color);\n background-color: var(--bg-default);\n color: var(--text-secondary);\n border-radius: var(--border-radius-sm);\n cursor: pointer;\n transition: all var(--transition-normal);\n font-family: var(--font-family-sans);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.vtable-sheet-button:hover {\n background-color: var(--bg-hover);\n}\n\n.vtable-sheet-button:active {\n background-color: var(--bg-tertiary);\n}\n\n.vtable-sheet-button-primary {\n background-color: var(--primary-color);\n color: var(--white);\n border-color: var(--primary-color);\n}\n\n.vtable-sheet-button-primary:hover {\n background-color: var(--secondary-color);\n border-color: var(--secondary-color);\n}\n\n.vtable-sheet-button-icon {\n padding: var(--spacing-xs);\n border: none;\n background: transparent;\n}\n\n.vtable-sheet-button-icon:hover {\n background-color: var(--bg-hover);\n}\n\n/* 工具提示 */\n.vtable-sheet-tooltip {\n position: relative;\n}\n\n.vtable-sheet-tooltip::after {\n content: attr(data-tooltip);\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n padding: 4px 8px;\n background-color: var(--gray-900);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: opacity var(--transition-normal), visibility var(--transition-normal);\n z-index: 1000;\n}\n\n.vtable-sheet-tooltip:hover::after {\n opacity: 1;\n visibility: visible;\n}\n\n/* 输入框样式 */\n.vtable-sheet-input {\n padding: var(--spacing-xs) var(--spacing-sm);\n border: 1px solid var(--border-color);\n border-radius: var(--border-radius-sm);\n font-family: var(--font-family-sans);\n font-size: 13px;\n outline: none;\n transition: border-color var(--transition-normal);\n}\n\n.vtable-sheet-input:focus {\n border-color: var(--primary-color);\n}\n\n/* 动画和过渡 */\n.vtable-sheet-fade-in {\n animation: vtable-sheet-fade-in var(--transition-normal) ease-in-out;\n}\n\n@keyframes vtable-sheet-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n.vtable-sheet-fade-out {\n animation: vtable-sheet-fade-out var(--transition-normal) ease-in-out;\n}\n\n@keyframes vtable-sheet-fade-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n\n/* 滚动条样式 */\n.vtable-sheet-scrollbar {\n scrollbar-width: thin;\n scrollbar-color: var(--gray-400) transparent;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-thumb {\n background-color: var(--gray-400);\n border-radius: 4px;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-thumb:hover {\n background-color: var(--gray-500);\n} \n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyle(): void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.importStyle = void 0;
|
|
6
|
+
|
|
7
|
+
const env_1 = require("../tools/env");
|
|
8
|
+
|
|
9
|
+
function importStyle() {
|
|
10
|
+
if ("node" === env_1.Env.mode) return;
|
|
11
|
+
const styleElement = document.createElement("style");
|
|
12
|
+
styleElement.id = "vtable-sheet-formula-autocomplete-styleSheet", styleElement.textContent = "\n/* 公式自动补全容器 */\n.vtable-formula-autocomplete {\n position: absolute;\n background: #ffffff;\n border: 1px solid #d9d9d9;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n max-height: 320px;\n overflow-y: auto;\n z-index: 1050;\n font-size: 13px;\n min-width: 300px;\n}\n\n/* 自动补全项 */\n.vtable-formula-autocomplete-item {\n padding: 8px 12px;\n cursor: pointer;\n transition: background-color 0.2s;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.vtable-formula-autocomplete-item:not(:last-child) {\n border-bottom: 1px solid #f0f0f0;\n}\n\n.vtable-formula-autocomplete-item:hover {\n background-color: #f5f7fa;\n}\n\n.vtable-formula-autocomplete-item.selected {\n background-color: #e6f7ff;\n}\n\n/* 函数名称 */\n.vtable-formula-autocomplete-item .item-name {\n font-weight: 600;\n color: #1890ff;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* 函数类型标签 */\n.vtable-formula-autocomplete-item .item-type {\n display: inline-flex;\n align-items: center;\n padding: 0 6px;\n height: 18px;\n background: #f0f0f0;\n border-radius: 2px;\n font-size: 11px;\n color: #666;\n font-weight: normal;\n}\n\n.vtable-formula-autocomplete-item .item-type.function {\n background: #e6f7ff;\n color: #1890ff;\n}\n\n.vtable-formula-autocomplete-item .item-type.cell {\n background: #f6ffed;\n color: #52c41a;\n}\n\n.vtable-formula-autocomplete-item .item-type.range {\n background: #fff7e6;\n color: #fa8c16;\n}\n\n/* 函数签名 */\n.vtable-formula-autocomplete-item .item-signature {\n font-size: 12px;\n color: #595959;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n margin-left: 2px;\n}\n\n/* 函数描述 */\n.vtable-formula-autocomplete-item .item-description {\n font-size: 12px;\n color: #8c8c8c;\n line-height: 1.4;\n margin-top: 2px;\n}\n\n/* 无结果提示 */\n.vtable-formula-autocomplete-empty {\n padding: 20px;\n text-align: center;\n color: #999;\n font-size: 13px;\n}\n\n/* 滚动条样式 */\n.vtable-formula-autocomplete::-webkit-scrollbar {\n width: 6px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-track {\n background: #f0f0f0;\n border-radius: 3px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-thumb {\n background: #bfbfbf;\n border-radius: 3px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-thumb:hover {\n background: #999;\n}\n\n/* 分组标题 */\n.vtable-formula-autocomplete-group {\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 600;\n color: #999;\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n/* 快捷键提示 */\n.vtable-formula-autocomplete-footer {\n padding: 8px 12px;\n background: #fafafa;\n border-top: 1px solid #f0f0f0;\n font-size: 11px;\n color: #999;\n display: flex;\n gap: 16px;\n position: sticky;\n bottom: 0;\n}\n\n.vtable-formula-autocomplete-footer .shortcut {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.vtable-formula-autocomplete-footer .key {\n display: inline-block;\n padding: 2px 6px;\n background: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 10px;\n color: #666;\n}\n\n.vtable-formula-autocomplete {\n z-index: 10000 !important;\n}\n\n.vtable-editor-container input {\n font-family: inherit;\n}\n",
|
|
13
|
+
document.head.appendChild(styleElement);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.importStyle = importStyle;
|
|
17
|
+
//# sourceMappingURL=formula-autocomplete.js.map
|