@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/formula-autocomplete.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,8CAA8C,CAAC;IACjE,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyK5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAlLD,kCAkLC","file":"formula-autocomplete.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-formula-autocomplete-styleSheet';\n 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`;\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-bar-styleSheet", styleElement.textContent = "\n /* 公式栏样式 */\n.vtable-sheet-formula-bar {\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n position: relative;\n z-index: 10;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n flex-grow: 1; /* 占据剩余宽度 */\n height: 100%; /* 确保高度填满父容器 */\n \n}\n\n/* 单元格地址显示 */\n.vtable-sheet-cell-address {\n width: 60px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n color: #333;\n height: 100%;\n border: 1px solid #e0e0e0;\n font-size: 13px;\n}\n\n/* fx图标 */\n.vtable-sheet-formula-icon {\n font-weight: normal;\n font-style: italic;\n margin: 0 8px;\n font-size: 14px;\n color: #666;\n font-family: 'Roboto Mono', monospace;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* 公式输入框 */\n.vtable-sheet-formula-input {\n flex: 1;\n padding: 0 8px;\n border: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n outline: none;\n font-size: 13px;\n height: 100%;\n color: #333;\n background-color: transparent;\n}\n\n.vtable-sheet-formula-input:focus {\n outline: none;\n}\n\n/* 公式操作按钮容器 */\n.vtable-sheet-formula-actions {\n flex: 0;\n display: flex;\n align-items: right;\n height: 100%;\n width: 100px;\n padding: 0 4px;\n border-left: 1px solid #e0e0e0;\n}\n\n/* 公式操作按钮 */\n.vtable-sheet-formula-button {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n border-radius: 2px;\n transition: all 0.2s;\n}\n\n/* 取消按钮 */\n.vtable-sheet-formula-cancel:hover {\n color: #d93025;\n background-color: #f8f8f8;\n}\n\n/* 确认按钮 */\n.vtable-sheet-formula-confirm:hover {\n color: #1e8e3e;\n background-color: #f8f8f8;\n}\n\n/* 其他按钮样式 - 当有更多功能时使用 */\n.vtable-sheet-formula-more {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n}\n\n.vtable-sheet-formula-more:hover {\n color: #1a73e8;\n}\n\n/* 取消之前不需要的工具栏样式 */\n.vtable-sheet-toolbar,\n.vtable-sheet-toolbar-group {\n display: none;\n} \n",
|
|
13
|
+
document.head.appendChild(styleElement);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.importStyle = importStyle;
|
|
17
|
+
//# sourceMappingURL=formula-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/formula-bar.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,qCAAqC,CAAC;IACxD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiI5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AA1ID,kCA0IC","file":"formula-bar.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-formula-bar-styleSheet';\n styleElement.textContent = `\n /* 公式栏样式 */\n.vtable-sheet-formula-bar {\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n position: relative;\n z-index: 10;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n flex-grow: 1; /* 占据剩余宽度 */\n height: 100%; /* 确保高度填满父容器 */\n \n}\n\n/* 单元格地址显示 */\n.vtable-sheet-cell-address {\n width: 60px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n color: #333;\n height: 100%;\n border: 1px solid #e0e0e0;\n font-size: 13px;\n}\n\n/* fx图标 */\n.vtable-sheet-formula-icon {\n font-weight: normal;\n font-style: italic;\n margin: 0 8px;\n font-size: 14px;\n color: #666;\n font-family: 'Roboto Mono', monospace;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* 公式输入框 */\n.vtable-sheet-formula-input {\n flex: 1;\n padding: 0 8px;\n border: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n outline: none;\n font-size: 13px;\n height: 100%;\n color: #333;\n background-color: transparent;\n}\n\n.vtable-sheet-formula-input:focus {\n outline: none;\n}\n\n/* 公式操作按钮容器 */\n.vtable-sheet-formula-actions {\n flex: 0;\n display: flex;\n align-items: right;\n height: 100%;\n width: 100px;\n padding: 0 4px;\n border-left: 1px solid #e0e0e0;\n}\n\n/* 公式操作按钮 */\n.vtable-sheet-formula-button {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n border-radius: 2px;\n transition: all 0.2s;\n}\n\n/* 取消按钮 */\n.vtable-sheet-formula-cancel:hover {\n color: #d93025;\n background-color: #f8f8f8;\n}\n\n/* 确认按钮 */\n.vtable-sheet-formula-confirm:hover {\n color: #1e8e3e;\n background-color: #f8f8f8;\n}\n\n/* 其他按钮样式 - 当有更多功能时使用 */\n.vtable-sheet-formula-more {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n}\n\n.vtable-sheet-formula-more:hover {\n color: #1a73e8;\n}\n\n/* 取消之前不需要的工具栏样式 */\n.vtable-sheet-toolbar,\n.vtable-sheet-toolbar-group {\n display: none;\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-menu-styleSheet", styleElement.textContent = "\n.vtable-sheet-main-menu {\n display: flex;\n flex-direction: row;\n align-items: center;\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n width: 50px;\n /* 内容居中 */\n justify-content: center;\n flex-shrink: 0; /* 防止菜单被压缩 */\n}\n.vtable-sheet-main-menu:hover {\n background-color: #f0f0f0;\n}\n\n.vtable-sheet-main-menu-button {\n display: flex;\n align-items: center;\n padding: 0 8px;\n cursor: pointer;\n height: 30px;\n}\n\n/* 菜单项容器 */\n.vtable-sheet-main-menu-container {\n position: absolute;\n top: 100%; /* 显示在按钮下方 */\n left: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 100;\n display: none;\n}\n\n.vtable-sheet-main-menu-container.active {\n display: block;\n}\n\n/* 菜单项列表(ul) */\n.vtable-sheet-main-menu-items {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n min-width: 80px;\n /* 删除以下两行 */\n /* max-height: 300px; */\n /* overflow-y: hidden; */\n}\n\n/* 当内容超出时显示滚动条 */\n.vtable-sheet-main-menu-items.scrollable {\n overflow-y: auto;\n}\n\n/* 单个菜单项(li) */\n.vtable-sheet-main-menu-item {\n padding: 6px 12px;\n margin: 0; /* 清除默认外边距 */\n line-height: 1.5; /* 统一行高 */\n cursor: pointer;\n white-space: nowrap;\n color: #333; /* 文字颜色 */\n font-size: 12px; /* 字体大小 */\n transition: background 0.2s; /* 悬停动画 */\n \n /* 禁用文本选中 */\n user-select: none;\n -webkit-user-select: none;\n}\n\n/* 悬停和激活状态 */\n.vtable-sheet-main-menu-item:hover,\n.vtable-sheet-main-menu-item:focus {\n background-color: #f5f5f5; /* 浅灰色背景 */\n}\n\n.vtable-sheet-main-menu-item:active {\n background-color: #e0e0e0; /* 点击时深灰色 */\n}\n\n/* 分隔线(可选) */\n.vtable-sheet-main-menu-item.divider {\n border-top: 1px solid #e0e0e0;\n margin: 4px 0;\n padding: 0;\n height: 1px;\n cursor: default;\n}\n\n.vtable-sheet-main-menu-item-has-children {\n position: relative;\n}\n\n.vtable-sheet-main-menu-item-has-children::after {\n content: '>';\n position: absolute;\n right: 0px;\n top: 50%;\n transform: translateY(-50%);\n margin-right: 10px;\n}\n/* 子菜单容器 */\n.vtable-sheet-submenu-container {\n position: absolute;\n left: 100%; /* 默认向右展开 */\n top: 0;\n min-width: 120px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 200; /* 高于主菜单 */\n display: none;\n}\n\n/* 激活时显示 */\n.vtable-sheet-main-menu-item:hover .vtable-sheet-submenu-container {\n display: block;\n}\n\n/* 子菜单项 */\n.vtable-sheet-submenu-item {\n position: relative; /* 为箭头定位 */\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.vtable-sheet-submenu-item:hover {\n background: #f5f5f5;\n}\n\n/* 嵌套子菜单箭头 */\n.submenu-arrow {\n position: absolute;\n right: 8px;\n font-size: 10px;\n color: #999;\n}\n\n/* 响应式调整 */\n@media (max-width: 768px) {\n .vtable-sheet-submenu-container {\n left: auto !important;\n right: 100%; /* 小屏幕改为向左展开 */\n }\n}\n",
|
|
13
|
+
document.head.appendChild(styleElement);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.importStyle = importStyle;
|
|
17
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/menu.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,8BAA8B,CAAC;IACjD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0J5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAnKD,kCAmKC","file":"menu.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-menu-styleSheet';\n styleElement.textContent = `\n.vtable-sheet-main-menu {\n display: flex;\n flex-direction: row;\n align-items: center;\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n width: 50px;\n /* 内容居中 */\n justify-content: center;\n flex-shrink: 0; /* 防止菜单被压缩 */\n}\n.vtable-sheet-main-menu:hover {\n background-color: #f0f0f0;\n}\n\n.vtable-sheet-main-menu-button {\n display: flex;\n align-items: center;\n padding: 0 8px;\n cursor: pointer;\n height: 30px;\n}\n\n/* 菜单项容器 */\n.vtable-sheet-main-menu-container {\n position: absolute;\n top: 100%; /* 显示在按钮下方 */\n left: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 100;\n display: none;\n}\n\n.vtable-sheet-main-menu-container.active {\n display: block;\n}\n\n/* 菜单项列表(ul) */\n.vtable-sheet-main-menu-items {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n min-width: 80px;\n /* 删除以下两行 */\n /* max-height: 300px; */\n /* overflow-y: hidden; */\n}\n\n/* 当内容超出时显示滚动条 */\n.vtable-sheet-main-menu-items.scrollable {\n overflow-y: auto;\n}\n\n/* 单个菜单项(li) */\n.vtable-sheet-main-menu-item {\n padding: 6px 12px;\n margin: 0; /* 清除默认外边距 */\n line-height: 1.5; /* 统一行高 */\n cursor: pointer;\n white-space: nowrap;\n color: #333; /* 文字颜色 */\n font-size: 12px; /* 字体大小 */\n transition: background 0.2s; /* 悬停动画 */\n \n /* 禁用文本选中 */\n user-select: none;\n -webkit-user-select: none;\n}\n\n/* 悬停和激活状态 */\n.vtable-sheet-main-menu-item:hover,\n.vtable-sheet-main-menu-item:focus {\n background-color: #f5f5f5; /* 浅灰色背景 */\n}\n\n.vtable-sheet-main-menu-item:active {\n background-color: #e0e0e0; /* 点击时深灰色 */\n}\n\n/* 分隔线(可选) */\n.vtable-sheet-main-menu-item.divider {\n border-top: 1px solid #e0e0e0;\n margin: 4px 0;\n padding: 0;\n height: 1px;\n cursor: default;\n}\n\n.vtable-sheet-main-menu-item-has-children {\n position: relative;\n}\n\n.vtable-sheet-main-menu-item-has-children::after {\n content: '>';\n position: absolute;\n right: 0px;\n top: 50%;\n transform: translateY(-50%);\n margin-right: 10px;\n}\n/* 子菜单容器 */\n.vtable-sheet-submenu-container {\n position: absolute;\n left: 100%; /* 默认向右展开 */\n top: 0;\n min-width: 120px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 200; /* 高于主菜单 */\n display: none;\n}\n\n/* 激活时显示 */\n.vtable-sheet-main-menu-item:hover .vtable-sheet-submenu-container {\n display: block;\n}\n\n/* 子菜单项 */\n.vtable-sheet-submenu-item {\n position: relative; /* 为箭头定位 */\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.vtable-sheet-submenu-item:hover {\n background: #f5f5f5;\n}\n\n/* 嵌套子菜单箭头 */\n.submenu-arrow {\n position: absolute;\n right: 8px;\n font-size: 10px;\n color: #999;\n}\n\n/* 响应式调整 */\n@media (max-width: 768px) {\n .vtable-sheet-submenu-container {\n left: auto !important;\n right: 100%; /* 小屏幕改为向左展开 */\n }\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-sheet-tab-styleSheet", styleElement.textContent = "\n/* Sheet标签栏样式 */\n.vtable-sheet-tab-bar {\n height: 32px;\n padding: 0;\n border-top: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #f8f8f8;\n position: relative;\n box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);\n z-index: 10;\n width: 100%;\n}\n/* sheet列表样式 */\n.vtable-sheet-menu-list {\n position: absolute;\n right: 0;\n top: -175px;\n height: 174px;\n min-width: 140px;\n background-color: #f8f8f8;\n border: 1px solid #e0e0e0;\n box-sizing: content-box;\n border-radius: 4px;\n display: none;\n margin: 0;\n padding: 0 2px 0 2px;\n box-sizing: border-box;\n list-style: none;\n overflow-y: auto;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar {\n width: 4px;\n margin: 0;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-thumb {\n background-color: #e0e0e0;\n border-radius: 3px;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-track {\n background-color: transparent;\n}\n\n.vtable-sheet-menu-list.active {\n display: block;\n}\n/* sheet列表项样式 */\n.vtable-sheet-menu-item {\n display: flex;\n align-items: center;\n /* justify-content: space-between; */\n cursor: pointer;\n text-align: center;\n border-radius: 4px;\n height: 32px;\n line-height: 32px;\n margin: 2px 0;\n padding: 0 8px;\n background-color: #f8f8f840;\n max-width: 150px;\n overflow-x: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n}\n\n.vtable-sheet-menu-item:hover {\n background-color: #e0e0e0;\n}\n.vtable-sheet-menu-item.active {\n color: #1a73e8;\n}\n\n.vtable-sheet-menu-item-title {\n flex: 40px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Sheet标签容器 */\n.vtable-sheet-tabs-container {\n display: flex;\n flex: 1;\n flex-wrap: nowrap;\n /* 超出容器宽度时显示横向滚动条 */\n overflow-x: auto;\n overflow-y: visible; /* 允许Y方向溢出,确保三角标志显示 */\n height: 100%;\n /* 隐藏滚动条样式(可选,如需自定义滚动条可保留原生或用伪元素美化) */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n/* 隐藏滚动条但保留功能 */\n.vtable-sheet-tabs-container::-webkit-scrollbar {\n display: none;\n}\n\n/* 单个sheet标签 */\n.vtable-sheet-tab {\n width: auto;\n /* 禁止标签压缩,保持内容撑开的宽度 */\n flex-shrink: 0;\n padding: 4px 12px;\n line-height: 24px;\n text-align: center;\n cursor: grab;\n border-right: 1px solid #e0e0e0;\n white-space: nowrap;\n color: #333;\n transition: background 0.1s;\n user-select: none;\n}\n\n.vtable-sheet-tab:hover {\n background-color: #f5f5f5;\n}\n\n.vtable-sheet-tab.active {\n color: #1a73e8;\n background-color: #fff;\n border-top: 2px solid #1a73e8;\n z-index: 2;\n}\n/* 编辑状态样式 */\n.vtable-sheet-tab[contenteditable='true'] {\n outline: inherit !important; /* 移除聚焦时的轮廓线 */\n border-right: 1px solid #e0e0e0;\n cursor: text;\n color: #333;\n}\n.vtable-sheet-tab[contenteditable='true']::selection {\n background-color: #2563eb33; /* 浅蓝色半透明背景(示例) */\n}\n\n/* 兼容 Firefox */\n.vtable-sheet-tab[contenteditable='true']::-moz-selection {\n background-color: #2563eb33;\n}\n\n/* 拖拽中的tab样式 */\n.vtable-sheet-tab.dragging {\n opacity: 0.7;\n transform: scale(1.02);\n background-color: #f0f5ff;\n cursor: grabbing !important;\n z-index: 100;\n position: relative;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n\n/* 拖拽预览样式 */\n.vtable-sheet-drag-preview {\n position: fixed;\n z-index: 10000;\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.95);\n border: 1px solid #1890ff;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n opacity: 0.9;\n pointer-events: none;\n white-space: nowrap;\n font-size: 12px;\n line-height: 20px;\n color: #333;\n user-select: none;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 插入位置指示器 */\n.vtable-sheet-insert-indicator {\n position: absolute;\n top: -4px;\n left: -5px;\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 6px solid black;\n z-index: inherit;\n}\n\n/* 添加sheet按钮 */\n.vtable-sheet-add-button {\n margin: 0 8px;\n padding: 0;\n background: #f8f8f8;\n border: none;\n cursor: pointer;\n font-size: 18px;\n transition: all 0.2s;\n height: 24px;\n width: 24px;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.vtable-sheet-add-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* Sheet导航按钮容器 */\n.vtable-sheet-nav-buttons {\n display: flex;\n height: 100%;\n align-items: center;\n padding: 0 4px;\n background-color: #f8f8f8;\n flex-shrink: 0;\n}\n\n/* Sheet滚动控制按钮 */\n.vtable-sheet-scroll-button {\n width: 24px;\n height: 24px;\n background: none;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n margin: 0 2px;\n padding: 0;\n border-radius: 50%;\n}\n\n.vtable-sheet-scroll-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 渐变阴影,提示可以滚动 */\n.vtable-sheet-fade-left,\n.vtable-sheet-fade-right {\n position: absolute;\n top: 0;\n height: 100%;\n width: 20px;\n pointer-events: none;\n z-index: 3;\n}\n\n.vtable-sheet-fade-left {\n left: 0;\n background: linear-gradient(to right, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n.vtable-sheet-fade-right {\n right: 0;\n background: linear-gradient(to left, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n/* Sheet菜单按钮 */\n.vtable-sheet-menu-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin: 0 4px;\n color: #666;\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 50%;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.vtable-sheet-menu-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 底部功能区 */\n.vtable-sheet-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n height: var(--toolbar-height);\n border-top: 1px solid var(--border-color);\n background-color: var(--light-gray);\n}\n\n/* 底部左侧按钮组 */\n.vtable-sheet-footer-left {\n display: flex;\n align-items: center;\n}\n\n/* 底部右侧按钮组 */\n.vtable-sheet-footer-right {\n display: flex;\n align-items: center;\n}\n\n/* 删除工作表按钮 */\n.vtable-sheet-menu-delete-button {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n line-height: 24px;\n color: #666;\n cursor: pointer;\n border: none;\n border-radius: 4px;\n user-select: none;\n}\n.vtable-sheet-menu-delete-button:hover {\n color: #000000;\n background-color: #eaeaea;\n}\n",
|
|
13
|
+
document.head.appendChild(styleElement);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.importStyle = importStyle;
|
|
17
|
+
//# sourceMappingURL=sheet-tab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/sheet-tab.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,mCAAmC,CAAC;IACtD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsU5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AA/UD,kCA+UC","file":"sheet-tab.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-sheet-tab-styleSheet';\n styleElement.textContent = `\n/* Sheet标签栏样式 */\n.vtable-sheet-tab-bar {\n height: 32px;\n padding: 0;\n border-top: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #f8f8f8;\n position: relative;\n box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);\n z-index: 10;\n width: 100%;\n}\n/* sheet列表样式 */\n.vtable-sheet-menu-list {\n position: absolute;\n right: 0;\n top: -175px;\n height: 174px;\n min-width: 140px;\n background-color: #f8f8f8;\n border: 1px solid #e0e0e0;\n box-sizing: content-box;\n border-radius: 4px;\n display: none;\n margin: 0;\n padding: 0 2px 0 2px;\n box-sizing: border-box;\n list-style: none;\n overflow-y: auto;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar {\n width: 4px;\n margin: 0;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-thumb {\n background-color: #e0e0e0;\n border-radius: 3px;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-track {\n background-color: transparent;\n}\n\n.vtable-sheet-menu-list.active {\n display: block;\n}\n/* sheet列表项样式 */\n.vtable-sheet-menu-item {\n display: flex;\n align-items: center;\n /* justify-content: space-between; */\n cursor: pointer;\n text-align: center;\n border-radius: 4px;\n height: 32px;\n line-height: 32px;\n margin: 2px 0;\n padding: 0 8px;\n background-color: #f8f8f840;\n max-width: 150px;\n overflow-x: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n}\n\n.vtable-sheet-menu-item:hover {\n background-color: #e0e0e0;\n}\n.vtable-sheet-menu-item.active {\n color: #1a73e8;\n}\n\n.vtable-sheet-menu-item-title {\n flex: 40px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Sheet标签容器 */\n.vtable-sheet-tabs-container {\n display: flex;\n flex: 1;\n flex-wrap: nowrap;\n /* 超出容器宽度时显示横向滚动条 */\n overflow-x: auto;\n overflow-y: visible; /* 允许Y方向溢出,确保三角标志显示 */\n height: 100%;\n /* 隐藏滚动条样式(可选,如需自定义滚动条可保留原生或用伪元素美化) */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n/* 隐藏滚动条但保留功能 */\n.vtable-sheet-tabs-container::-webkit-scrollbar {\n display: none;\n}\n\n/* 单个sheet标签 */\n.vtable-sheet-tab {\n width: auto;\n /* 禁止标签压缩,保持内容撑开的宽度 */\n flex-shrink: 0;\n padding: 4px 12px;\n line-height: 24px;\n text-align: center;\n cursor: grab;\n border-right: 1px solid #e0e0e0;\n white-space: nowrap;\n color: #333;\n transition: background 0.1s;\n user-select: none;\n}\n\n.vtable-sheet-tab:hover {\n background-color: #f5f5f5;\n}\n\n.vtable-sheet-tab.active {\n color: #1a73e8;\n background-color: #fff;\n border-top: 2px solid #1a73e8;\n z-index: 2;\n}\n/* 编辑状态样式 */\n.vtable-sheet-tab[contenteditable='true'] {\n outline: inherit !important; /* 移除聚焦时的轮廓线 */\n border-right: 1px solid #e0e0e0;\n cursor: text;\n color: #333;\n}\n.vtable-sheet-tab[contenteditable='true']::selection {\n background-color: #2563eb33; /* 浅蓝色半透明背景(示例) */\n}\n\n/* 兼容 Firefox */\n.vtable-sheet-tab[contenteditable='true']::-moz-selection {\n background-color: #2563eb33;\n}\n\n/* 拖拽中的tab样式 */\n.vtable-sheet-tab.dragging {\n opacity: 0.7;\n transform: scale(1.02);\n background-color: #f0f5ff;\n cursor: grabbing !important;\n z-index: 100;\n position: relative;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n\n/* 拖拽预览样式 */\n.vtable-sheet-drag-preview {\n position: fixed;\n z-index: 10000;\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.95);\n border: 1px solid #1890ff;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n opacity: 0.9;\n pointer-events: none;\n white-space: nowrap;\n font-size: 12px;\n line-height: 20px;\n color: #333;\n user-select: none;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 插入位置指示器 */\n.vtable-sheet-insert-indicator {\n position: absolute;\n top: -4px;\n left: -5px;\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 6px solid black;\n z-index: inherit;\n}\n\n/* 添加sheet按钮 */\n.vtable-sheet-add-button {\n margin: 0 8px;\n padding: 0;\n background: #f8f8f8;\n border: none;\n cursor: pointer;\n font-size: 18px;\n transition: all 0.2s;\n height: 24px;\n width: 24px;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.vtable-sheet-add-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* Sheet导航按钮容器 */\n.vtable-sheet-nav-buttons {\n display: flex;\n height: 100%;\n align-items: center;\n padding: 0 4px;\n background-color: #f8f8f8;\n flex-shrink: 0;\n}\n\n/* Sheet滚动控制按钮 */\n.vtable-sheet-scroll-button {\n width: 24px;\n height: 24px;\n background: none;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n margin: 0 2px;\n padding: 0;\n border-radius: 50%;\n}\n\n.vtable-sheet-scroll-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 渐变阴影,提示可以滚动 */\n.vtable-sheet-fade-left,\n.vtable-sheet-fade-right {\n position: absolute;\n top: 0;\n height: 100%;\n width: 20px;\n pointer-events: none;\n z-index: 3;\n}\n\n.vtable-sheet-fade-left {\n left: 0;\n background: linear-gradient(to right, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n.vtable-sheet-fade-right {\n right: 0;\n background: linear-gradient(to left, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n/* Sheet菜单按钮 */\n.vtable-sheet-menu-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin: 0 4px;\n color: #666;\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 50%;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.vtable-sheet-menu-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 底部功能区 */\n.vtable-sheet-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n height: var(--toolbar-height);\n border-top: 1px solid var(--border-color);\n background-color: var(--light-gray);\n}\n\n/* 底部左侧按钮组 */\n.vtable-sheet-footer-left {\n display: flex;\n align-items: center;\n}\n\n/* 底部右侧按钮组 */\n.vtable-sheet-footer-right {\n display: flex;\n align-items: center;\n}\n\n/* 删除工作表按钮 */\n.vtable-sheet-menu-delete-button {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n line-height: 24px;\n color: #666;\n cursor: pointer;\n border: none;\n border-radius: 4px;\n user-select: none;\n}\n.vtable-sheet-menu-delete-button:hover {\n color: #000000;\n background-color: #eaeaea;\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-sheet-styleSheet", styleElement.textContent = "\n/* Sheet容器样式 */\n.vtable-sheet-container {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: var(--bg-default);\n font-family: var(--font-family-sans);\n color: var(--text-primary);\n overflow: hidden;\n}\n\n.vtable-sheet-top-container {\n height: 30px;\n padding: 0;\n border: 1px solid #e0e0e0;\n display: flex;\n align-items: center; /* 确保子元素垂直居中 */\n}\n\n/* 主内容区域 */\n.vtable-sheet-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n\n\n/* VTable 容器 */\n.vtable-sheet-table {\n flex: 1;\n position: relative;\n overflow: hidden;\n background-color: var(--bg-default);\n}\n\n/* 表格加载动画 */\n.vtable-sheet-loading {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.7);\n z-index: 100;\n}\n\n.vtable-sheet-loading-spinner {\n width: 40px;\n height: 40px;\n border: 3px solid var(--gray-200);\n border-top-color: var(--primary-color);\n border-radius: 50%;\n animation: vtable-sheet-spinner 0.8s linear infinite;\n}\n\n@keyframes vtable-sheet-spinner {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* 状态提示 */\n.vtable-sheet-status {\n position: absolute;\n bottom: 8px;\n right: 8px;\n padding: 4px 8px;\n background-color: var(--gray-800);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n opacity: 0.8;\n z-index: 50;\n transition: opacity 0.2s;\n}\n\n.vtable-sheet-status:hover {\n opacity: 1;\n}\n\n.vtable-sheet-snackbar-message {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n padding: 12px 24px;\n background-color: #333;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n z-index: 1000;\n white-space: nowrap;\n}\n\n.vtable-sheet-snackbar-message.show {\n opacity: 1;\n}\n\n/* 选择区域高亮 */\n.vtable-sheet-selection-highlight {\n position: absolute;\n border: 2px solid var(--primary-color);\n background-color: rgba(26, 115, 232, 0.1);\n pointer-events: none;\n z-index: 10;\n}\n\n/* 辅助区域 */\n.vtable-sheet-helper-area {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 20;\n}\n\n/* 调整尺寸标记 */\n.vtable-sheet-resize-marker {\n position: absolute;\n background-color: var(--primary-color);\n z-index: 25;\n}\n\n.vtable-sheet-resize-marker.horizontal {\n height: 2px;\n left: 0;\n right: 0;\n}\n\n.vtable-sheet-resize-marker.vertical {\n width: 2px;\n top: 0;\n bottom: 0;\n}\n\n.vtable-sheet-error {\n padding: 16px;\n color: #d93025;\n text-align: center;\n}\n\n/* 隐藏底部功能区 */\n.vtable-sheet-footer {\n display: none;\n}\n\n",
|
|
13
|
+
document.head.appendChild(styleElement);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.importStyle = importStyle;
|
|
17
|
+
//# sourceMappingURL=sheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/sheet.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,+BAA+B,CAAC;IAClD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8J5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAvKD,kCAuKC","file":"sheet.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-sheet-styleSheet';\n styleElement.textContent = `\n/* Sheet容器样式 */\n.vtable-sheet-container {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: var(--bg-default);\n font-family: var(--font-family-sans);\n color: var(--text-primary);\n overflow: hidden;\n}\n\n.vtable-sheet-top-container {\n height: 30px;\n padding: 0;\n border: 1px solid #e0e0e0;\n display: flex;\n align-items: center; /* 确保子元素垂直居中 */\n}\n\n/* 主内容区域 */\n.vtable-sheet-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n\n\n/* VTable 容器 */\n.vtable-sheet-table {\n flex: 1;\n position: relative;\n overflow: hidden;\n background-color: var(--bg-default);\n}\n\n/* 表格加载动画 */\n.vtable-sheet-loading {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.7);\n z-index: 100;\n}\n\n.vtable-sheet-loading-spinner {\n width: 40px;\n height: 40px;\n border: 3px solid var(--gray-200);\n border-top-color: var(--primary-color);\n border-radius: 50%;\n animation: vtable-sheet-spinner 0.8s linear infinite;\n}\n\n@keyframes vtable-sheet-spinner {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* 状态提示 */\n.vtable-sheet-status {\n position: absolute;\n bottom: 8px;\n right: 8px;\n padding: 4px 8px;\n background-color: var(--gray-800);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n opacity: 0.8;\n z-index: 50;\n transition: opacity 0.2s;\n}\n\n.vtable-sheet-status:hover {\n opacity: 1;\n}\n\n.vtable-sheet-snackbar-message {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n padding: 12px 24px;\n background-color: #333;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n z-index: 1000;\n white-space: nowrap;\n}\n\n.vtable-sheet-snackbar-message.show {\n opacity: 1;\n}\n\n/* 选择区域高亮 */\n.vtable-sheet-selection-highlight {\n position: absolute;\n border: 2px solid var(--primary-color);\n background-color: rgba(26, 115, 232, 0.1);\n pointer-events: none;\n z-index: 10;\n}\n\n/* 辅助区域 */\n.vtable-sheet-helper-area {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 20;\n}\n\n/* 调整尺寸标记 */\n.vtable-sheet-resize-marker {\n position: absolute;\n background-color: var(--primary-color);\n z-index: 25;\n}\n\n.vtable-sheet-resize-marker.horizontal {\n height: 2px;\n left: 0;\n right: 0;\n}\n\n.vtable-sheet-resize-marker.vertical {\n width: 2px;\n top: 0;\n bottom: 0;\n}\n\n.vtable-sheet-error {\n padding: 16px;\n color: #d93025;\n text-align: center;\n}\n\n/* 隐藏底部功能区 */\n.vtable-sheet-footer {\n display: none;\n}\n\n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyles(): void;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.importStyles = void 0;
|
|
6
|
+
|
|
7
|
+
const sheet_1 = require("./sheet"), sheet_tab_1 = require("./sheet-tab"), menu_1 = require("./menu"), formula_bar_1 = require("./formula-bar"), common_1 = require("./common"), formula_autocomplete_1 = require("./formula-autocomplete");
|
|
8
|
+
|
|
9
|
+
function importStyles() {
|
|
10
|
+
(0, common_1.importStyle)(), (0, sheet_1.importStyle)(), (0, sheet_tab_1.importStyle)(),
|
|
11
|
+
(0, menu_1.importStyle)(), (0, formula_bar_1.importStyle)(), (0, formula_autocomplete_1.importStyle)();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.importStyles = importStyles;
|
|
15
|
+
//# sourceMappingURL=style-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/style-manager.ts"],"names":[],"mappings":";;;AAAA,mCAA0D;AAC1D,2CAAiE;AACjE,iCAAwD;AACxD,+CAAqE;AACrE,qCAA4D;AAC5D,iEAAuF;AAEvF,SAAgB,YAAY;IAC1B,IAAA,oBAAiB,GAAE,CAAC;IACpB,IAAA,mBAAgB,GAAE,CAAC;IACnB,IAAA,uBAAmB,GAAE,CAAC;IACtB,IAAA,kBAAe,GAAE,CAAC;IAClB,IAAA,yBAAqB,GAAE,CAAC;IACxB,IAAA,kCAA8B,GAAE,CAAC;AACnC,CAAC;AAPD,oCAOC","file":"style-manager.js","sourcesContent":["import { importStyle as importSheetStyle } from './sheet';\nimport { importStyle as importSheetTabStyle } from './sheet-tab';\nimport { importStyle as importMenuStyle } from './menu';\nimport { importStyle as importFormulaBarStyle } from './formula-bar';\nimport { importStyle as importCommonStyle } from './common';\nimport { importStyle as importFormulaAutocompleteStyle } from './formula-autocomplete';\n\nexport function importStyles() {\n importCommonStyle();\n importSheetStyle();\n importSheetTabStyle();\n importMenuStyle();\n importFormulaBarStyle();\n importFormulaAutocompleteStyle();\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
const formula_manager_1 = require("../managers/formula-manager");
|
|
8
|
+
|
|
9
|
+
describe("FormulaManager.isFormulaComplete", (() => {
|
|
10
|
+
let formulaManager;
|
|
11
|
+
const mockSheet = {
|
|
12
|
+
getActiveSheet: jest.fn().mockReturnValue({
|
|
13
|
+
getKey: jest.fn().mockReturnValue("Sheet1")
|
|
14
|
+
})
|
|
15
|
+
};
|
|
16
|
+
beforeEach((() => {
|
|
17
|
+
formulaManager = new formula_manager_1.FormulaManager(mockSheet);
|
|
18
|
+
})), test("非公式输入应该返回true", (() => {
|
|
19
|
+
expect(formulaManager.isFormulaComplete("123")).toBe(!0), expect(formulaManager.isFormulaComplete("abc")).toBe(!0),
|
|
20
|
+
expect(formulaManager.isFormulaComplete("")).toBe(!1);
|
|
21
|
+
})), test("完整的公式应该返回true", (() => {
|
|
22
|
+
expect(formulaManager.isFormulaComplete("=A1")).toBe(!0), expect(formulaManager.isFormulaComplete("=SUM(A1:B10)")).toBe(!0),
|
|
23
|
+
expect(formulaManager.isFormulaComplete("=A1+B2")).toBe(!0), expect(formulaManager.isFormulaComplete('=IF(A1>10,"大于10","小于等于10")')).toBe(!0);
|
|
24
|
+
})), test("未完成的公式应该返回false", (() => {
|
|
25
|
+
expect(formulaManager.isFormulaComplete("=SUM(")).toBe(!1), expect(formulaManager.isFormulaComplete("=A1+")).toBe(!1);
|
|
26
|
+
})), test("只有等号的公式应该返回false", (() => {
|
|
27
|
+
expect(formulaManager.isFormulaComplete("=")).toBe(!1), expect(formulaManager.isFormulaComplete("= ")).toBe(!1),
|
|
28
|
+
expect(formulaManager.isFormulaComplete("= ")).toBe(!1);
|
|
29
|
+
})), test("括号不匹配的公式应该返回false", (() => {
|
|
30
|
+
expect(formulaManager.isFormulaComplete("=SUM(A1:B10")).toBe(!1), expect(formulaManager.isFormulaComplete('=IF(A1>10,"大于10"')).toBe(!1);
|
|
31
|
+
})), test("引号不匹配的公式应该返回false", (() => {
|
|
32
|
+
expect(formulaManager.isFormulaComplete('=IF(A1>10,"大于10)')).toBe(!1), expect(formulaManager.isFormulaComplete('=CONCATENATE("Hello)')).toBe(!1);
|
|
33
|
+
})), test("参数不完整的公式应该返回false", (() => {
|
|
34
|
+
expect(formulaManager.isFormulaComplete("=SUM(A1,)")).toBe(!1), expect(formulaManager.isFormulaComplete("=SUM(A1,B2,)")).toBe(!1),
|
|
35
|
+
expect(formulaManager.isFormulaComplete("=SUM()")).toBe(!1), expect(formulaManager.isFormulaComplete("=AVERAGE(,)")).toBe(!1);
|
|
36
|
+
})), test("连续逗号的公式应该返回false", (() => {
|
|
37
|
+
expect(formulaManager.isFormulaComplete("=SUM(A1,,B2)")).toBe(!1), expect(formulaManager.isFormulaComplete('=CONCATENATE("Hello",,"World")')).toBe(!1);
|
|
38
|
+
})), test("以逗号结尾的公式应该返回false", (() => {
|
|
39
|
+
expect(formulaManager.isFormulaComplete("=SUM(A1,")).toBe(!1), expect(formulaManager.isFormulaComplete('=CONCATENATE("Hello",')).toBe(!1);
|
|
40
|
+
}));
|
|
41
|
+
}));
|
|
42
|
+
//# sourceMappingURL=formula-complete.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/test/formula-complete.test.ts"],"names":[],"mappings":"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","file":"formula-complete.test.js","sourcesContent":["import { FormulaManager } from '../managers/formula-manager';\nimport type VTableSheet from '../components/vtable-sheet';\n\ndescribe('FormulaManager.isFormulaComplete', () => {\n let formulaManager: FormulaManager;\n\n // 创建一个模拟的VTableSheet实例\n const mockSheet = {\n getActiveSheet: jest.fn().mockReturnValue({\n getKey: jest.fn().mockReturnValue('Sheet1')\n })\n } as unknown as VTableSheet;\n\n beforeEach(() => {\n formulaManager = new FormulaManager(mockSheet);\n });\n\n test('非公式输入应该返回true', () => {\n expect(formulaManager.isFormulaComplete('123')).toBe(true);\n expect(formulaManager.isFormulaComplete('abc')).toBe(true);\n expect(formulaManager.isFormulaComplete('')).toBe(false); // 空字符串特殊处理为false\n });\n\n test('完整的公式应该返回true', () => {\n expect(formulaManager.isFormulaComplete('=A1')).toBe(true);\n expect(formulaManager.isFormulaComplete('=SUM(A1:B10)')).toBe(true);\n expect(formulaManager.isFormulaComplete('=A1+B2')).toBe(true);\n expect(formulaManager.isFormulaComplete('=IF(A1>10,\"大于10\",\"小于等于10\")')).toBe(true);\n });\n\n test('未完成的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(')).toBe(false);\n expect(formulaManager.isFormulaComplete('=A1+')).toBe(false);\n });\n\n test('只有等号的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=')).toBe(false);\n expect(formulaManager.isFormulaComplete('= ')).toBe(false);\n expect(formulaManager.isFormulaComplete('= ')).toBe(false);\n });\n\n test('括号不匹配的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1:B10')).toBe(false);\n expect(formulaManager.isFormulaComplete('=IF(A1>10,\"大于10\"')).toBe(false);\n });\n\n test('引号不匹配的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=IF(A1>10,\"大于10)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=CONCATENATE(\"Hello)')).toBe(false);\n });\n\n test('参数不完整的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1,)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=SUM(A1,B2,)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=SUM()')).toBe(false);\n expect(formulaManager.isFormulaComplete('=AVERAGE(,)')).toBe(false);\n });\n\n test('连续逗号的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1,,B2)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=CONCATENATE(\"Hello\",,\"World\")')).toBe(false);\n });\n\n test('以逗号结尾的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1,')).toBe(false);\n expect(formulaManager.isFormulaComplete('=CONCATENATE(\"Hello\",')).toBe(false);\n });\n});\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type EnvMode = 'browser' | 'node' | 'worker' | 'miniApp' | 'desktop-miniApp';
|
|
2
|
+
export type LooseFunction = (...args: any) => any;
|
|
3
|
+
export declare class Env {
|
|
4
|
+
static _mode: EnvMode;
|
|
5
|
+
static get mode(): EnvMode;
|
|
6
|
+
static set mode(mode: EnvMode);
|
|
7
|
+
static dpr: number;
|
|
8
|
+
static CreateCanvas?: LooseFunction;
|
|
9
|
+
static LoadImage?: LooseFunction;
|
|
10
|
+
static RequestAnimationFrame?: LooseFunction;
|
|
11
|
+
static CancelAnimationFrame?: LooseFunction;
|
|
12
|
+
static RegisterCreateCanvas(func: LooseFunction): void;
|
|
13
|
+
static RegisterLoadImage(func: LooseFunction): void;
|
|
14
|
+
static GetCreateCanvasFunc(): LooseFunction | undefined;
|
|
15
|
+
static RegisterRequestAnimationFrame(func: LooseFunction): void;
|
|
16
|
+
static GetRequestAnimationFrame(): LooseFunction;
|
|
17
|
+
static RegisterCancelAnimationFrame(func: LooseFunction): void;
|
|
18
|
+
static GetCancelAnimationFrame(): LooseFunction;
|
|
19
|
+
}
|
|
20
|
+
export declare function clearPageSelection(): void;
|
package/cjs/tools/env.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.clearPageSelection = exports.Env = void 0;
|
|
6
|
+
|
|
7
|
+
class Env {
|
|
8
|
+
static get mode() {
|
|
9
|
+
return Env._mode || (Env._mode = defaultMode()), Env._mode;
|
|
10
|
+
}
|
|
11
|
+
static set mode(mode) {
|
|
12
|
+
Env._mode = mode;
|
|
13
|
+
}
|
|
14
|
+
static RegisterCreateCanvas(func) {
|
|
15
|
+
Env.CreateCanvas = func;
|
|
16
|
+
}
|
|
17
|
+
static RegisterLoadImage(func) {
|
|
18
|
+
Env.LoadImage = func;
|
|
19
|
+
}
|
|
20
|
+
static GetCreateCanvasFunc() {
|
|
21
|
+
return Env.CreateCanvas ? Env.CreateCanvas : "worker" === Env.mode ? (width = 200, height = 200) => new OffscreenCanvas(width, height) : void 0;
|
|
22
|
+
}
|
|
23
|
+
static RegisterRequestAnimationFrame(func) {
|
|
24
|
+
Env.RequestAnimationFrame = func();
|
|
25
|
+
}
|
|
26
|
+
static GetRequestAnimationFrame() {
|
|
27
|
+
if (Env.RequestAnimationFrame) return Env.RequestAnimationFrame;
|
|
28
|
+
}
|
|
29
|
+
static RegisterCancelAnimationFrame(func) {
|
|
30
|
+
Env.CancelAnimationFrame = func();
|
|
31
|
+
}
|
|
32
|
+
static GetCancelAnimationFrame() {
|
|
33
|
+
if (Env.CancelAnimationFrame) return Env.CancelAnimationFrame;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function defaultMode() {
|
|
38
|
+
let mode = "browser";
|
|
39
|
+
try {
|
|
40
|
+
"node" === window.type ? mode = "node" : "undefined" == typeof window || window.performance ? "undefined" == typeof window && (mode = "node") : mode = "miniApp";
|
|
41
|
+
} catch (err) {
|
|
42
|
+
mode = "node";
|
|
43
|
+
}
|
|
44
|
+
return mode;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function clearPageSelection() {
|
|
48
|
+
try {
|
|
49
|
+
const selection = window.getSelection();
|
|
50
|
+
if (selection) {
|
|
51
|
+
if ("function" == typeof selection.removeAllRanges) return void selection.removeAllRanges();
|
|
52
|
+
if ("function" == typeof selection.empty) return void selection.empty();
|
|
53
|
+
if ("function" == typeof selection.collapse) return void selection.collapse(document.body, 0);
|
|
54
|
+
}
|
|
55
|
+
} catch (error) {}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.Env = Env, Env.dpr = 0, exports.clearPageSelection = clearPageSelection;
|
|
59
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/env.ts"],"names":[],"mappings":";;;AAGA,MAAa,GAAG;IAEP,MAAM,KAAK,IAAI;QACpB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YACd,GAAG,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC;SAC3B;QACD,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IACM,MAAM,KAAK,IAAI,CAAC,IAAa;QAClC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;IACnB,CAAC;IAYD,MAAM,CAAC,oBAAoB,CAAC,IAAmB;QAC7C,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,IAAmB;QAC1C,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,mBAAmB;QACxB,IAAI,GAAG,CAAC,YAAY,EAAE;YACpB,OAAO,GAAG,CAAC,YAAY,CAAC;SACzB;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YACzB,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SAC1E;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,6BAA6B,CAAC,IAAmB;QACtD,GAAG,CAAC,qBAAqB,GAAG,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,wBAAwB;QAC7B,IAAI,GAAG,CAAC,qBAAqB,EAAE;YAC7B,OAAO,GAAG,CAAC,qBAAqB,CAAC;SAClC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,4BAA4B,CAAC,IAAmB;QACrD,GAAG,CAAC,oBAAoB,GAAG,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,uBAAuB;QAC5B,IAAI,GAAG,CAAC,oBAAoB,EAAE;YAC5B,OAAO,GAAG,CAAC,oBAAoB,CAAC;SACjC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;;AA5DH,kBA6DC;AAjDQ,OAAG,GAAG,CAAC,CAAC;AAwDjB,SAAS,WAAW;IAClB,IAAI,IAAI,GAAY,SAAS,CAAC;IAC9B,IAAI;QACF,IAAK,MAAc,CAAC,IAAI,KAAK,MAAM,EAAE;YACnC,IAAI,GAAG,MAAM,CAAC;SACf;aAAM,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;YAC/D,IAAI,GAAG,SAAS,CAAC;SAClB;aAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YACxC,IAAI,GAAG,MAAM,CAAC;SACf;KACF;IAAC,OAAO,GAAG,EAAE;QACZ,IAAI,GAAG,MAAM,CAAC;KACf;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAID,SAAgB,kBAAkB;IAChC,IAAI;QACF,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACxC,IAAI,SAAS,EAAE;YAEb,IAAI,OAAO,SAAS,CAAC,eAAe,KAAK,UAAU,EAAE;gBACnD,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;gBAChD,OAAO;aACR;YAGD,IAAI,OAAQ,SAAiB,CAAC,KAAK,KAAK,UAAU,EAAE;gBACjD,SAAiB,CAAC,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBACtC,OAAO;aACR;YAGD,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE;gBAC5C,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBACzC,OAAO;aACR;YAED,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;SACvC;KACF;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;KACxC;AACH,CAAC;AA9BD,gDA8BC","file":"env.js","sourcesContent":["export type EnvMode = 'browser' | 'node' | 'worker' | 'miniApp' | 'desktop-miniApp';\nexport type LooseFunction = (...args: any) => any;\n\nexport class Env {\n static _mode: EnvMode;\n public static get mode() {\n if (!Env._mode) {\n Env._mode = defaultMode();\n }\n return Env._mode;\n }\n public static set mode(mode: EnvMode) {\n Env._mode = mode;\n }\n\n static dpr = 0;\n\n static CreateCanvas?: LooseFunction;\n\n static LoadImage?: LooseFunction;\n\n static RequestAnimationFrame?: LooseFunction;\n\n static CancelAnimationFrame?: LooseFunction;\n\n static RegisterCreateCanvas(func: LooseFunction) {\n Env.CreateCanvas = func;\n }\n\n static RegisterLoadImage(func: LooseFunction) {\n Env.LoadImage = func;\n }\n\n static GetCreateCanvasFunc(): LooseFunction | undefined {\n if (Env.CreateCanvas) {\n return Env.CreateCanvas;\n }\n if (Env.mode === 'worker') {\n return (width = 200, height = 200) => new OffscreenCanvas(width, height);\n }\n return undefined;\n }\n\n static RegisterRequestAnimationFrame(func: LooseFunction) {\n Env.RequestAnimationFrame = func();\n }\n\n static GetRequestAnimationFrame() {\n if (Env.RequestAnimationFrame) {\n return Env.RequestAnimationFrame;\n }\n return undefined;\n }\n\n static RegisterCancelAnimationFrame(func: LooseFunction) {\n Env.CancelAnimationFrame = func();\n }\n\n static GetCancelAnimationFrame() {\n if (Env.CancelAnimationFrame) {\n return Env.CancelAnimationFrame;\n }\n return undefined;\n }\n}\n\n/**\n *\n * 这个默认的判断方法并不能区分出不同的环境,所以这里采用是否判断\n * 满足条件为 'browser',不满足则为 'node'\n */\nfunction defaultMode(): EnvMode {\n let mode: EnvMode = 'browser';\n try {\n if ((window as any).type === 'node') {\n mode = 'node';\n } else if (typeof window !== 'undefined' && !window.performance) {\n mode = 'miniApp';\n } else if (typeof window === 'undefined') {\n mode = 'node';\n }\n } catch (err) {\n mode = 'node';\n }\n return mode;\n}\n/**\n * 清空页面上的所有文本选择,使用多种兼容性方法\n */\nexport function clearPageSelection(): void {\n try {\n const selection = window.getSelection();\n if (selection) {\n // 方法1: removeAllRanges() - 标准方法,最广泛支持\n if (typeof selection.removeAllRanges === 'function') {\n selection.removeAllRanges();\n console.log('使用 removeAllRanges() 清空selection');\n return;\n }\n\n // 方法2: empty() - IE 和一些旧浏览器\n if (typeof (selection as any).empty === 'function') {\n (selection as any).empty();\n console.log('使用 empty() 清空selection');\n return;\n }\n\n // 方法3: collapse() - 备用方法\n if (typeof selection.collapse === 'function') {\n selection.collapse(document.body, 0);\n console.log('使用 collapse() 清空selection');\n return;\n }\n\n console.warn('无法清空selection:不支持的浏览器');\n }\n } catch (error) {\n console.warn('清空selection时出错:', error);\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function checkTabTitle(newTitle) {
|
|
4
|
+
return newTitle ? newTitle.length > 100 ? "工作表名称不能超过100个字符" : /[\\/:*?"<>|]/.test(newTitle) ? "工作表名称不能包含特殊字符,如/ \\ ? * [ ] : |" : null : "工作表名称不能为空";
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function isPropertyWritable(obj, prop) {
|
|
8
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
9
|
+
return !!descriptor && (!!descriptor.set || !0 === descriptor.writable);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
Object.defineProperty(exports, "__esModule", {
|
|
13
|
+
value: !0
|
|
14
|
+
}), exports.isPropertyWritable = exports.checkTabTitle = void 0, exports.checkTabTitle = checkTabTitle,
|
|
15
|
+
exports.isPropertyWritable = isPropertyWritable;
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/index.ts"],"names":[],"mappings":";;;AAUA,SAAgB,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,WAAW,CAAC;KACpB;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;QACzB,OAAO,iBAAiB,CAAC;KAC1B;IAED,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACjC,OAAO,iCAAiC,CAAC;KAC1C;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAbD,sCAaC;AAGD,SAAgB,kBAAkB,CAAC,GAAQ,EAAE,IAAqB;IAChE,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,EAAE;QAEf,OAAO,KAAK,CAAC;KACd;IAGD,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC1D,CAAC;AATD,gDASC","file":"index.js","sourcesContent":["/**\n * 工具函数导出\n * @namespace tools\n */\n\n// 暂时没有导出的工具函数\nexport {};\n/**\n * 检查工作表名称\n */\nexport function checkTabTitle(newTitle: string): string | null {\n if (!newTitle) {\n return '工作表名称不能为空';\n }\n if (newTitle.length > 100) {\n return '工作表名称不能超过100个字符';\n }\n // 检查是否包含特殊字符,如/ \\ ? * [ ] : |\n if (/[\\\\/:*?\"<>|]/.test(newTitle)) {\n return '工作表名称不能包含特殊字符,如/ \\\\ ? * [ ] : |';\n }\n // 其他规则待补充...\n return null;\n}\n\n/** 判断对象的属性是否可写 */\nexport function isPropertyWritable(obj: any, prop: string | number) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (!descriptor) {\n // 属性不存在\n return false;\n }\n\n // 检查是否有 setter 方法或 writable 属性为 true\n return !!descriptor.set || descriptor.writable === true;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function showSnackbar(message: string, duration?: number): void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function showSnackbar(message, duration = 3e3) {
|
|
4
|
+
const snackbarId = `snackbar-${Date.now()}`;
|
|
5
|
+
if (document.getElementById(snackbarId)) return;
|
|
6
|
+
const snackbar = document.createElement("div");
|
|
7
|
+
snackbar.id = snackbarId, snackbar.className = "vtable-sheet-snackbar-message",
|
|
8
|
+
snackbar.textContent = message, document.body.appendChild(snackbar), setTimeout((() => {
|
|
9
|
+
snackbar.classList.add("show");
|
|
10
|
+
}), 10), setTimeout((() => {
|
|
11
|
+
snackbar.classList.remove("show"), snackbar.addEventListener("transitionend", (function handler() {
|
|
12
|
+
snackbar.removeEventListener("transitionend", handler), document.body.contains(snackbar) && document.body.removeChild(snackbar);
|
|
13
|
+
}));
|
|
14
|
+
}), duration);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
Object.defineProperty(exports, "__esModule", {
|
|
18
|
+
value: !0
|
|
19
|
+
}), exports.showSnackbar = void 0, exports.showSnackbar = showSnackbar;
|
|
20
|
+
//# sourceMappingURL=snackbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/ui/snackbar.ts"],"names":[],"mappings":";;;AAKA,SAAgB,YAAY,CAAC,OAAe,EAAE,QAAQ,GAAG,IAAI;IAC3D,MAAM,UAAU,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC5C,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;QACvC,OAAO;KACR;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,GAAG,UAAU,CAAC;IACzB,QAAQ,CAAC,SAAS,GAAG,+BAA+B,CAAC;IACrD,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC;IAE/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAElC,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,SAAS,OAAO;YACzD,QAAQ,CAAC,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBACpC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;aACrC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;AA1BD,oCA0BC","file":"snackbar.js","sourcesContent":["/**\n * 显示Snackbar消息\n * @param message - 要显示的消息内容\n * @param duration - 显示时长(毫秒),默认3000ms\n */\nexport function showSnackbar(message: string, duration = 3000): void {\n const snackbarId = `snackbar-${Date.now()}`;\n if (document.getElementById(snackbarId)) {\n return;\n }\n const snackbar = document.createElement('div');\n snackbar.id = snackbarId;\n snackbar.className = 'vtable-sheet-snackbar-message';\n snackbar.textContent = message;\n\n document.body.appendChild(snackbar);\n setTimeout(() => {\n snackbar.classList.add('show');\n }, 10);\n\n // 自动隐藏\n setTimeout(() => {\n snackbar.classList.remove('show');\n // 过渡结束后移除DOM\n snackbar.addEventListener('transitionend', function handler() {\n snackbar.removeEventListener('transitionend', handler);\n if (document.body.contains(snackbar)) {\n document.body.removeChild(snackbar);\n }\n });\n }, duration);\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface CellCoord {
|
|
2
|
+
row: number;
|
|
3
|
+
col: number;
|
|
4
|
+
}
|
|
5
|
+
export interface CellRange {
|
|
6
|
+
startRow: number;
|
|
7
|
+
startCol: number;
|
|
8
|
+
endRow: number;
|
|
9
|
+
endCol: number;
|
|
10
|
+
}
|
|
11
|
+
export declare enum SelectionMode {
|
|
12
|
+
CELL = "cell",
|
|
13
|
+
ROW = "row",
|
|
14
|
+
COLUMN = "column",
|
|
15
|
+
RANGE = "range"
|
|
16
|
+
}
|
|
17
|
+
export interface IStyle {
|
|
18
|
+
[key: string]: string | number | boolean | undefined;
|
|
19
|
+
}
|
|
20
|
+
export type CellValue = string | number | boolean | null | undefined;
|
|
21
|
+
export interface CellAddress extends CellCoord {
|
|
22
|
+
sheetId: string;
|
|
23
|
+
}
|
|
24
|
+
export interface IToolbarItem {
|
|
25
|
+
id: string;
|
|
26
|
+
icon?: string;
|
|
27
|
+
text?: string;
|
|
28
|
+
tooltip?: string;
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
visible?: boolean;
|
|
31
|
+
onClick?: () => void;
|
|
32
|
+
}
|
|
33
|
+
export declare enum MainMenuItemKey {
|
|
34
|
+
IMPORT = "import",
|
|
35
|
+
EXPORT_CURRENT_SHEET_CSV = "export-current-sheet-csv",
|
|
36
|
+
EXPORT_CURRENT_SHEET_XLSX = "export-current-sheet-xlsx"
|
|
37
|
+
}
|
|
38
|
+
export interface MainMenuItem {
|
|
39
|
+
name: string;
|
|
40
|
+
menuKey?: MainMenuItemKey;
|
|
41
|
+
description?: string;
|
|
42
|
+
onClick?: () => void;
|
|
43
|
+
items?: MainMenuItem[];
|
|
44
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var SelectionMode, MainMenuItemKey;
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: !0
|
|
7
|
+
}), exports.MainMenuItemKey = exports.SelectionMode = void 0, function(SelectionMode) {
|
|
8
|
+
SelectionMode.CELL = "cell", SelectionMode.ROW = "row", SelectionMode.COLUMN = "column",
|
|
9
|
+
SelectionMode.RANGE = "range";
|
|
10
|
+
}(SelectionMode = exports.SelectionMode || (exports.SelectionMode = {})), function(MainMenuItemKey) {
|
|
11
|
+
MainMenuItemKey.IMPORT = "import", MainMenuItemKey.EXPORT_CURRENT_SHEET_CSV = "export-current-sheet-csv",
|
|
12
|
+
MainMenuItemKey.EXPORT_CURRENT_SHEET_XLSX = "export-current-sheet-xlsx";
|
|
13
|
+
}(MainMenuItemKey = exports.MainMenuItemKey || (exports.MainMenuItemKey = {}));
|
|
14
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ts-types/base.ts"],"names":[],"mappings":";;;AAmBA,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,4BAAW,CAAA;IACX,kCAAiB,CAAA;IACjB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAKxB;AA0BD,IAAY,eAOX;AAPD,WAAY,eAAe;IAEzB,oCAAiB,CAAA;IAEjB,wEAAqD,CAAA;IAErD,0EAAuD,CAAA;AACzD,CAAC,EAPW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAO1B","file":"base.js","sourcesContent":["/**\n * 基础类型定义\n */\n\n/** 单元格坐标 */\nexport interface CellCoord {\n row: number;\n col: number;\n}\n\n/** 单元格范围 */\nexport interface CellRange {\n startRow: number;\n startCol: number;\n endRow: number;\n endCol: number;\n}\n\n/** 选择模式 */\nexport enum SelectionMode {\n CELL = 'cell',\n ROW = 'row',\n COLUMN = 'column',\n RANGE = 'range'\n}\n\n/** 通用样式定义 */\nexport interface IStyle {\n [key: string]: string | number | boolean | undefined;\n}\n\n/** 单元格值类型 */\nexport type CellValue = string | number | boolean | null | undefined;\n\n/** 单元格地址 */\nexport interface CellAddress extends CellCoord {\n sheetId: string;\n}\n\n/** 工具栏项配置 */\nexport interface IToolbarItem {\n id: string;\n icon?: string;\n text?: string;\n tooltip?: string;\n disabled?: boolean;\n visible?: boolean;\n onClick?: () => void;\n}\n\nexport enum MainMenuItemKey {\n /** 需要插件支持,请在plugins中配置 ExcelImportPlugin */\n IMPORT = 'import',\n /** 需要插件支持,请在plugins中配置 TableExportPlugin */\n EXPORT_CURRENT_SHEET_CSV = 'export-current-sheet-csv',\n /** 需要插件支持,请在plugins中配置 TableExportPlugin */\n EXPORT_CURRENT_SHEET_XLSX = 'export-current-sheet-xlsx'\n}\nexport interface MainMenuItem {\n /** 菜单项名称 */\n name: string;\n /** 菜单项唯一标识,如果配置了menuKey,点击菜单项时,会匹配内置逻辑(目前仅支持导入导出相关功能,且需要配置VTablePluginModules来启用) */\n menuKey?: MainMenuItemKey;\n /** 菜单项描述 */\n description?: string;\n /** 菜单项点击回调 */\n onClick?: () => void;\n /** 子菜单项 */\n items?: MainMenuItem[];\n}\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { CellCoord, CellRange, CellValue } from './base';
|
|
2
|
+
export type EventHandler = (...args: any[]) => void;
|
|
3
|
+
export interface IEventMap {
|
|
4
|
+
'cell:selected': {
|
|
5
|
+
coord: CellCoord;
|
|
6
|
+
};
|
|
7
|
+
'cell:deselected': {
|
|
8
|
+
coord: CellCoord;
|
|
9
|
+
};
|
|
10
|
+
'cell:changed': {
|
|
11
|
+
coord: CellCoord;
|
|
12
|
+
oldValue: CellValue;
|
|
13
|
+
newValue: CellValue;
|
|
14
|
+
};
|
|
15
|
+
'cell:editing': {
|
|
16
|
+
coord: CellCoord;
|
|
17
|
+
};
|
|
18
|
+
'cell:edited': {
|
|
19
|
+
coord: CellCoord;
|
|
20
|
+
value: CellValue;
|
|
21
|
+
};
|
|
22
|
+
'selection:changed': {
|
|
23
|
+
range: CellRange;
|
|
24
|
+
};
|
|
25
|
+
'selection:start': {
|
|
26
|
+
coord: CellCoord;
|
|
27
|
+
};
|
|
28
|
+
'selection:end': {
|
|
29
|
+
range: CellRange;
|
|
30
|
+
};
|
|
31
|
+
'sheet:ready': void;
|
|
32
|
+
'sheet:destroyed': void;
|
|
33
|
+
'sheet:resized': {
|
|
34
|
+
width: number;
|
|
35
|
+
height: number;
|
|
36
|
+
};
|
|
37
|
+
'sheet:focused': void;
|
|
38
|
+
'sheet:blurred': void;
|
|
39
|
+
'data:changed': {
|
|
40
|
+
changes: Array<{
|
|
41
|
+
coord: CellCoord;
|
|
42
|
+
oldValue: CellValue;
|
|
43
|
+
newValue: CellValue;
|
|
44
|
+
}>;
|
|
45
|
+
};
|
|
46
|
+
'data:loaded': void;
|
|
47
|
+
'data:sorted': {
|
|
48
|
+
columnKey: string;
|
|
49
|
+
direction: 'asc' | 'desc';
|
|
50
|
+
};
|
|
51
|
+
'data:filtered': {
|
|
52
|
+
filters: Array<{
|
|
53
|
+
columnKey: string;
|
|
54
|
+
value: any;
|
|
55
|
+
}>;
|
|
56
|
+
};
|
|
57
|
+
'toolbar:action': {
|
|
58
|
+
actionId: string;
|
|
59
|
+
};
|
|
60
|
+
'toolbar:stateChanged': {
|
|
61
|
+
actionId: string;
|
|
62
|
+
enabled: boolean;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export interface IEventManager {
|
|
66
|
+
on: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;
|
|
67
|
+
off: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;
|
|
68
|
+
emit: <K extends keyof IEventMap>(event: K, payload: IEventMap[K]) => void;
|
|
69
|
+
once: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;
|
|
70
|
+
removeAllListeners: () => void;
|
|
71
|
+
}
|
|
72
|
+
export interface CellValueChangedEvent {
|
|
73
|
+
row: number;
|
|
74
|
+
col: number;
|
|
75
|
+
newValue: CellValue;
|
|
76
|
+
oldValue: CellValue;
|
|
77
|
+
}
|
|
78
|
+
export type CellSelectedEvent = IEventMap['cell:selected'];
|
|
79
|
+
export type SelectionChangedEvent = IEventMap['selection:changed'];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ts-types/event.ts"],"names":[],"mappings":"","file":"event.js","sourcesContent":["import type { CellCoord, CellRange, CellValue } from './base';\n\n/** 事件处理器类型 */\nexport type EventHandler = (...args: any[]) => void;\n\n/** 事件映射表 */\nexport interface IEventMap {\n // 单元格事件\n 'cell:selected': { coord: CellCoord };\n 'cell:deselected': { coord: CellCoord };\n 'cell:changed': { coord: CellCoord; oldValue: CellValue; newValue: CellValue };\n 'cell:editing': { coord: CellCoord };\n 'cell:edited': { coord: CellCoord; value: CellValue };\n\n // 选择事件\n 'selection:changed': { range: CellRange };\n 'selection:start': { coord: CellCoord };\n 'selection:end': { range: CellRange };\n\n // Sheet事件\n 'sheet:ready': void;\n 'sheet:destroyed': void;\n 'sheet:resized': { width: number; height: number };\n 'sheet:focused': void;\n 'sheet:blurred': void;\n\n // 数据事件\n 'data:changed': { changes: Array<{ coord: CellCoord; oldValue: CellValue; newValue: CellValue }> };\n 'data:loaded': void;\n 'data:sorted': { columnKey: string; direction: 'asc' | 'desc' };\n 'data:filtered': { filters: Array<{ columnKey: string; value: any }> };\n\n // 工具栏事件\n 'toolbar:action': { actionId: string };\n 'toolbar:stateChanged': { actionId: string; enabled: boolean };\n}\n\n/** 事件管理器接口 */\nexport interface IEventManager {\n /** 注册事件监听器 */\n on: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 移除事件监听器 */\n off: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 触发事件 */\n emit: <K extends keyof IEventMap>(event: K, payload: IEventMap[K]) => void;\n\n /** 一次性事件监听器 */\n once: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 移除所有事件监听器 */\n removeAllListeners: () => void;\n}\n\nexport interface CellValueChangedEvent {\n /** 行索引 */\n row: number;\n /** 列索引 */\n col: number;\n /** 新值 */\n newValue: CellValue;\n /** 旧值 */\n oldValue: CellValue;\n}\n\nexport type CellSelectedEvent = IEventMap['cell:selected'];\nexport type SelectionChangedEvent = IEventMap['selection:changed'];\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ts-types/events.ts"],"names":[],"mappings":"","file":"events.js","sourcesContent":[""]}
|