@visactor/vtable-plugins 1.22.8-alpha.13 → 1.22.8

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.
Files changed (75) hide show
  1. package/cjs/excel-import/excel.d.ts +23 -0
  2. package/cjs/excel-import/excel.js +204 -0
  3. package/cjs/excel-import/excel.js.map +1 -0
  4. package/cjs/excel-import/index.d.ts +3 -0
  5. package/cjs/excel-import/index.js +39 -0
  6. package/cjs/excel-import/index.js.map +1 -0
  7. package/cjs/excel-import/types.d.ts +44 -0
  8. package/cjs/excel-import/types.js +6 -0
  9. package/cjs/excel-import/types.js.map +1 -0
  10. package/cjs/excel-import/vtable-sheet.d.ts +2 -0
  11. package/cjs/excel-import/vtable-sheet.js +31 -0
  12. package/cjs/excel-import/vtable-sheet.js.map +1 -0
  13. package/cjs/excel-import.d.ts +12 -22
  14. package/cjs/excel-import.js +107 -40
  15. package/cjs/excel-import.js.map +1 -1
  16. package/cjs/filter/filter-toolbar.d.ts +1 -0
  17. package/cjs/filter/filter-toolbar.js +5 -4
  18. package/cjs/filter/filter-toolbar.js.map +1 -1
  19. package/cjs/filter/index.js +1 -2
  20. package/cjs/filter/value-filter.js +1 -1
  21. package/cjs/filter/value-filter.js.map +1 -1
  22. package/cjs/master-detail-plugin/checkbox.js +1 -0
  23. package/cjs/master-detail-plugin/index.js +1 -1
  24. package/cjs/master-detail-plugin/subtable.js +1 -1
  25. package/cjs/master-detail-plugin/table-api-extensions.js +1 -1
  26. package/cjs/master-detail-plugin/types.js +1 -1
  27. package/cjs/table-export/excel/index.d.ts +4 -0
  28. package/cjs/table-export/excel/index.js +72 -36
  29. package/cjs/table-export/excel/index.js.map +1 -1
  30. package/cjs/table-export/index.d.ts +2 -2
  31. package/cjs/table-export/index.js +6 -1
  32. package/cjs/table-export/index.js.map +1 -1
  33. package/cjs/table-export.js +4 -1
  34. package/cjs/table-export.js.map +1 -1
  35. package/cjs/table-series-number.js +1 -0
  36. package/cjs/table-series-number.js.map +1 -1
  37. package/dist/vtable-plugins.js +591 -122
  38. package/dist/vtable-plugins.min.js +3 -3
  39. package/es/excel-import/excel.d.ts +23 -0
  40. package/es/excel-import/excel.js +190 -0
  41. package/es/excel-import/excel.js.map +1 -0
  42. package/es/excel-import/index.d.ts +3 -0
  43. package/es/excel-import/index.js +4 -0
  44. package/es/excel-import/index.js.map +1 -0
  45. package/es/excel-import/types.d.ts +44 -0
  46. package/es/excel-import/types.js +2 -0
  47. package/es/excel-import/types.js.map +1 -0
  48. package/es/excel-import/vtable-sheet.d.ts +2 -0
  49. package/es/excel-import/vtable-sheet.js +25 -0
  50. package/es/excel-import/vtable-sheet.js.map +1 -0
  51. package/es/excel-import.d.ts +12 -22
  52. package/es/excel-import.js +110 -40
  53. package/es/excel-import.js.map +1 -1
  54. package/es/filter/filter-toolbar.d.ts +1 -0
  55. package/es/filter/filter-toolbar.js +6 -4
  56. package/es/filter/filter-toolbar.js.map +1 -1
  57. package/es/filter/index.js +1 -2
  58. package/es/filter/value-filter.js +1 -1
  59. package/es/filter/value-filter.js.map +1 -1
  60. package/es/master-detail-plugin/checkbox.js +2 -1
  61. package/es/master-detail-plugin/index.js +1 -1
  62. package/es/master-detail-plugin/subtable.js +1 -1
  63. package/es/master-detail-plugin/table-api-extensions.js +1 -1
  64. package/es/master-detail-plugin/types.js +1 -1
  65. package/es/table-export/excel/index.d.ts +4 -0
  66. package/es/table-export/excel/index.js +69 -33
  67. package/es/table-export/excel/index.js.map +1 -1
  68. package/es/table-export/index.d.ts +2 -2
  69. package/es/table-export/index.js +2 -2
  70. package/es/table-export/index.js.map +1 -1
  71. package/es/table-export.js +5 -2
  72. package/es/table-export.js.map +1 -1
  73. package/es/table-series-number.js +1 -0
  74. package/es/table-series-number.js.map +1 -1
  75. package/package.json +8 -8
@@ -34,38 +34,114 @@ Object.defineProperty(exports, "__esModule", {
34
34
  value: !0
35
35
  }), exports.ExcelImportPlugin = void 0;
36
36
 
37
- const exceljs_1 = __importDefault(require("exceljs")), vtable_1 = require("@visactor/vtable");
37
+ const vtable_1 = require("@visactor/vtable"), exceljs_1 = __importDefault(require("exceljs")), excel_1 = require("./excel-import/excel"), vtable_sheet_1 = require("./excel-import/vtable-sheet");
38
38
 
39
39
  class ExcelImportPlugin {
40
40
  constructor(options) {
41
41
  this.id = "excel-import-plugin", this.name = "ExcelImportPlugin", this.runTime = [ vtable_1.TABLE_EVENT_TYPE.INITIALIZED ],
42
- this._tableInstance = null, this.options = Object.assign({
42
+ this.table = null, this.options = Object.assign({
43
43
  autoTable: !0,
44
44
  autoColumns: !0,
45
45
  delimiter: ",",
46
46
  exportData: !1,
47
47
  batchSize: 1e3,
48
48
  enableBatchProcessing: !0,
49
- asyncDelay: 5
49
+ asyncDelay: 5,
50
+ importAllSheets: !1,
51
+ clearExisting: !0
50
52
  }, options), (null == options ? void 0 : options.id) && (this.id = options.id);
51
53
  }
52
54
  run(...args) {
53
- const tableInstance = args[2];
54
- this._tableInstance = tableInstance, this._tableInstance.importFile = () => {
55
+ if (args[1] === vtable_1.TABLE_EVENT_TYPE.INITIALIZED && (this.table = args[2],
56
+ this.table.importFile = () => {
55
57
  this.import("file");
56
- };
58
+ }, this.table.__vtableSheet)) {
59
+ const vtableSheet = this.table.__vtableSheet;
60
+ vtableSheet._importFile || (vtableSheet._importFile = options => __awaiter(this, void 0, void 0, (function*() {
61
+ const mergedOptions = Object.assign(Object.assign({}, this.options), options);
62
+ return this._importFileFromDialogForVTableSheet(vtableSheet, mergedOptions);
63
+ })));
64
+ }
57
65
  }
58
- release() {
59
- this._tableInstance = null;
66
+ _importFile(options) {
67
+ return __awaiter(this, void 0, void 0, (function*() {
68
+ if (!this.table) throw new Error("表格实例不存在或已销毁,无法导入数据!");
69
+ const mergedOptions = Object.assign(Object.assign({}, this.options), options);
70
+ if (this._detectVTableSheet(this.table)) return this._importMultipleSheetsFromFileDialog(Object.assign(Object.assign({}, mergedOptions), {
71
+ importAllSheets: !0
72
+ }));
73
+ throw new Error("ListTable 单 sheet 导入功能需要进一步重构");
74
+ }));
75
+ }
76
+ _selectFile(accept = ".xlsx,.xls,.csv,.txt,.json,.html,.htm") {
77
+ return new Promise(((resolve, reject) => {
78
+ const input = document.createElement("input");
79
+ input.type = "file", input.accept = accept, input.style.display = "none", document.body.appendChild(input),
80
+ input.addEventListener("change", (() => {
81
+ var _a;
82
+ try {
83
+ const file = null === (_a = input.files) || void 0 === _a ? void 0 : _a[0];
84
+ if (!file) return document.body.removeChild(input), void reject(new Error("未选择文件"));
85
+ input.value = "", document.body.removeChild(input), resolve(file);
86
+ } catch (error) {
87
+ document.body.removeChild(input), reject(error);
88
+ }
89
+ })), input.click();
90
+ }));
60
91
  }
61
- importFile() {
92
+ _importFileFromDialogForVTableSheet(vtableSheetInstance, options) {
62
93
  return __awaiter(this, void 0, void 0, (function*() {
63
- return this.import("file");
94
+ try {
95
+ const file = yield this._selectFile(".xlsx,.xls,.csv,.txt"), fileExtension = this._getFileExtension(file.name).toLowerCase();
96
+ let result;
97
+ if ("csv" === fileExtension || "txt" === fileExtension) result = yield (0, excel_1.importCsvFile)(file, options); else {
98
+ if ("xlsx" !== fileExtension && "xls" !== fileExtension) throw new Error("不支持的文件类型,仅支持 Excel (.xlsx, .xls) 和 CSV (.csv, .txt)");
99
+ result = yield (0, excel_1.importExcelMultipleSheets)(file, options);
100
+ }
101
+ return !1 !== options.autoTable && result.sheets.length > 0 && (0, vtable_sheet_1.applyImportToVTableSheet)(vtableSheetInstance, result, options),
102
+ result;
103
+ } catch (error) {
104
+ throw error;
105
+ }
64
106
  }));
65
107
  }
108
+ _importMultipleSheetsFromFileDialog(options) {
109
+ return __awaiter(this, void 0, void 0, (function*() {
110
+ try {
111
+ const file = yield this._selectFile(".xlsx,.xls,.csv,.txt"), fileExtension = this._getFileExtension(file.name).toLowerCase();
112
+ let result;
113
+ if ("csv" === fileExtension || "txt" === fileExtension) result = yield (0, excel_1.importCsvFile)(file, options); else {
114
+ if ("xlsx" !== fileExtension && "xls" !== fileExtension) throw new Error("不支持的文件类型,仅支持 Excel (.xlsx, .xls) 和 CSV (.csv, .txt)");
115
+ result = yield (0, excel_1.importExcelMultipleSheets)(file, options);
116
+ }
117
+ if (!1 !== options.autoTable && this.table && this._detectVTableSheet(this.table)) {
118
+ const vtableSheet = this.table.__vtableSheet;
119
+ vtableSheet && (0, vtable_sheet_1.applyImportToVTableSheet)(vtableSheet, result, options);
120
+ }
121
+ return result;
122
+ } catch (error) {
123
+ throw error;
124
+ }
125
+ }));
126
+ }
127
+ _detectVTableSheet(instance) {
128
+ const inst = instance;
129
+ return !!(inst && "function" == typeof inst.updateOption && inst.options && "object" == typeof inst.options && null !== inst.options && Array.isArray(inst.options.sheets));
130
+ }
131
+ _getFileExtension(filename) {
132
+ const parts = filename.split(".");
133
+ return parts.length > 1 ? parts[parts.length - 1] : "";
134
+ }
135
+ release() {
136
+ this.table && (delete this.table.importFile, this.table = null);
137
+ }
66
138
  import(type, source, options) {
67
139
  return __awaiter(this, void 0, void 0, (function*() {
140
+ if (!this.table) throw new Error("表格实例不存在或已销毁,无法导入数据!");
68
141
  const mergedOptions = Object.assign(Object.assign({}, this.options), options);
142
+ if (this._detectVTableSheet(this.table) && "file" === type) return this._importMultipleSheetsFromFileDialog(Object.assign(Object.assign({}, mergedOptions), {
143
+ importAllSheets: !0
144
+ }));
69
145
  if ("file" === type) return this._importFromFileDialog(mergedOptions);
70
146
  if ("string" == typeof source) return this._importFromString(type, source, mergedOptions);
71
147
  if (Array.isArray(source) || "object" == typeof source) {
@@ -77,25 +153,11 @@ class ExcelImportPlugin {
77
153
  }
78
154
  _importFromFileDialog(options) {
79
155
  return __awaiter(this, void 0, void 0, (function*() {
80
- return new Promise(((resolve, reject) => {
81
- if (!this._tableInstance) return void reject(new Error("表格实例不存在或已销毁,无法导入数据!"));
82
- const input = document.createElement("input");
83
- input.type = "file", input.style.display = "none", document.body.appendChild(input),
84
- input.addEventListener("change", (e => __awaiter(this, void 0, void 0, (function*() {
85
- var _a;
86
- try {
87
- const file = null === (_a = e.target.files) || void 0 === _a ? void 0 : _a[0];
88
- if (!file) return document.body.removeChild(input), void reject(new Error("未选择文件"));
89
- const result = yield this._parseFile(file, options);
90
- options.autoTable && this._tableInstance && (options.autoColumns && this._tableInstance.updateOption(Object.assign({}, this._tableInstance.options, {
91
- columns: result.columns
92
- })), this._tableInstance.setRecords(result.records)), input.value = "", document.body.removeChild(input),
93
- resolve(result);
94
- } catch (error) {
95
- document.body.removeChild(input), reject(error);
96
- }
97
- })))), input.click();
98
- }));
156
+ if (!this.table) throw new Error("表格实例不存在或已销毁,无法导入数据!");
157
+ const file = yield this._selectFile(), result = yield this._parseFile(file, options);
158
+ return options.autoTable && this.table && (options.autoColumns && this.table.updateOption(Object.assign({}, this.table.options, {
159
+ columns: result.columns
160
+ })), this.table.setRecords(result.records)), result;
99
161
  }));
100
162
  }
101
163
  _importFromString(type, data, options) {
@@ -117,20 +179,20 @@ class ExcelImportPlugin {
117
179
  default:
118
180
  throw new Error(`不支持的导入类型: ${type}`);
119
181
  }
120
- return options.autoTable && this._tableInstance && (options.autoColumns && this._tableInstance.updateOption({
182
+ return options.autoTable && this.table && (options.autoColumns && this.table.updateOption({
121
183
  columns: result.columns,
122
184
  plugins: [ this ]
123
- }), this._tableInstance.setRecords(result.records)), result;
185
+ }), this.table.setRecords(result.records)), result;
124
186
  }));
125
187
  }
126
188
  _importFromData(type, data, options) {
127
189
  return __awaiter(this, void 0, void 0, (function*() {
128
190
  let result;
129
191
  if ("json" !== type) throw new Error(`不支持的数据类型: ${type}`);
130
- return result = yield this._parseJSONData(data, options), options.autoTable && this._tableInstance && (options.autoColumns && this._tableInstance.updateOption({
192
+ return result = yield this._parseJSONData(data, options), options.autoTable && this.table && (options.autoColumns && this.table.updateOption({
131
193
  columns: result.columns,
132
194
  plugins: [ this ]
133
- }), this._tableInstance.setRecords(result.records)), result;
195
+ }), this.table.setRecords(result.records)), result;
134
196
  }));
135
197
  }
136
198
  _parseFile(file, options) {
@@ -156,10 +218,6 @@ class ExcelImportPlugin {
156
218
  }
157
219
  }));
158
220
  }
159
- _getFileExtension(filename) {
160
- const parts = filename.split(".");
161
- return parts.length > 1 ? parts[parts.length - 1] : "";
162
- }
163
221
  _parseExcelFile(file, options) {
164
222
  return __awaiter(this, void 0, void 0, (function*() {
165
223
  const mergedOptions = Object.assign(Object.assign({}, this.options), options);
@@ -281,14 +339,23 @@ class ExcelImportPlugin {
281
339
  }
282
340
  _parseCSVString(text, options) {
283
341
  return __awaiter(this, void 0, void 0, (function*() {
284
- const lines = text.split("\n").filter((line => line.trim()));
342
+ const delimiter = options.delimiter || ",", lines = text.split(/\r?\n/).filter((line => line.trim().length > 0));
285
343
  if (0 === lines.length) throw new Error("CSV文件为空");
286
- const delimiter = options.delimiter || ",", parseCSVLine = line => line.split(delimiter).map((cell => cell.trim().replace(/^"|"$/g, ""))), headerRows = lines.slice(0, 1).map(parseCSVLine), dataRows = lines.slice(1), columns = this._buildColumnsFromHeaders(headerRows), records = [];
344
+ const parseCSVLine = line => {
345
+ const result = [];
346
+ let current = "", inQuotes = !1;
347
+ for (let i = 0; i < line.length; i++) {
348
+ const char = line[i], nextChar = line[i + 1];
349
+ '"' === char ? inQuotes && '"' === nextChar ? (current += '"', i++) : inQuotes = !inQuotes : char !== delimiter || inQuotes ? current += char : (result.push(current.trim()),
350
+ current = "");
351
+ }
352
+ return result.push(current.trim()), result;
353
+ }, headerRows = lines.slice(0, 1).map((line => parseCSVLine(line).map((cell => String(cell || ""))))), dataRows = lines.slice(1), columns = this._buildColumnsFromHeaders(headerRows), records = [];
287
354
  return yield this._processBatchRecords(dataRows, options, (batch => __awaiter(this, void 0, void 0, (function*() {
288
355
  const batchRecords = batch.map((line => {
289
356
  const parsedRow = parseCSVLine(line), record = {};
290
357
  return parsedRow.forEach(((cell, i) => {
291
- record[`col${i}`] = cell || "";
358
+ record[`col${i}`] = null != cell ? cell : "";
292
359
  })), record;
293
360
  }));
294
361
  records.push(...batchRecords);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/excel-import.ts"],"names":[],"mappings":"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","file":"excel-import.js","sourcesContent":["import ExcelJS from 'exceljs';\r\nimport type { ListTable, ColumnsDefine, ColumnDefine } from '@visactor/vtable';\r\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\r\nimport type { pluginsDefinition } from '@visactor/vtable';\r\n// 数据导入结果类型\r\nexport interface ImportResult {\r\n columns: ColumnsDefine;\r\n records: Record<string, unknown>[];\r\n}\r\n\r\nexport interface ExcelImportOptions {\r\n id?: string;\r\n headerRowCount?: number; // 指定头的层数,不指定会使用detectHeaderRowCount来自动判断,但是只有excel才有\r\n exportData?: boolean; // 是否导出JavaScript对象字面量格式文件\r\n autoTable?: boolean; // 是否自动替换表格数据\r\n autoColumns?: boolean; // 是否自动生成列配置\r\n delimiter?: string; // CSV分隔符,默认逗号\r\n batchSize?: number; // 批处理大小,默认1000行\r\n enableBatchProcessing?: boolean; // 是否启用分批处理,默认true\r\n asyncDelay?: number; // 异步处理延迟时间(ms),默认5ms\r\n}\r\n\r\nexport class ExcelImportPlugin implements pluginsDefinition.IVTablePlugin {\r\n id: string = `excel-import-plugin`;\r\n name = 'ExcelImportPlugin';\r\n runTime = [TABLE_EVENT_TYPE.INITIALIZED];\r\n private options: ExcelImportOptions;\r\n private _tableInstance: ListTable | null = null;\r\n constructor(options?: ExcelImportOptions) {\r\n this.options = {\r\n autoTable: true,\r\n autoColumns: true,\r\n delimiter: ',',\r\n exportData: false,\r\n batchSize: 1000,\r\n enableBatchProcessing: true,\r\n asyncDelay: 5,\r\n ...options\r\n };\r\n if (options?.id) {\r\n this.id = options.id;\r\n }\r\n }\r\n\r\n run(...args: [unknown, unknown, ListTable]) {\r\n const tableInstance = args[2];\r\n this._tableInstance = tableInstance;\r\n (this._tableInstance as any).importFile = () => {\r\n this.import('file');\r\n };\r\n }\r\n\r\n release() {\r\n this._tableInstance = null;\r\n }\r\n /**\r\n * 调用导入文件接口\r\n * @returns Promise<ImportResult>\r\n */\r\n async importFile(): Promise<ImportResult> {\r\n return this.import('file');\r\n }\r\n\r\n /**\r\n * @param type 导入类型: \"file\" | \"csv\" | \"json\" | \"html\"\r\n * @param source 数据源: 文件选择器 | 字符串数据\r\n * @param options 导入选项\r\n * @returns Promise<ImportResult>\r\n */\r\n async import(\r\n type: 'file' | 'csv' | 'json' | 'html',\r\n source?: string | object,\r\n options?: Partial<ExcelImportOptions>\r\n ): Promise<ImportResult> {\r\n const mergedOptions = { ...this.options, ...options };\r\n\r\n if (type === 'file') {\r\n return this._importFromFileDialog(mergedOptions);\r\n }\r\n if (typeof source === 'string') {\r\n return this._importFromString(type as 'csv' | 'json' | 'html', source, mergedOptions);\r\n }\r\n if (Array.isArray(source) || typeof source === 'object') {\r\n if (type !== 'json') {\r\n throw new Error('只有JSON格式支持从对象导入');\r\n }\r\n return this._importFromData('json', source, mergedOptions);\r\n }\r\n throw new Error('Invalid import source');\r\n }\r\n\r\n /**\r\n * 从文件对话框导入\r\n */\r\n private async _importFromFileDialog(options: ExcelImportOptions): Promise<ImportResult> {\r\n return new Promise((resolve, reject) => {\r\n if (!this._tableInstance) {\r\n reject(new Error('表格实例不存在或已销毁,无法导入数据!'));\r\n return;\r\n }\r\n\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n document.body.appendChild(input);\r\n\r\n input.addEventListener('change', async e => {\r\n try {\r\n const file = (e.target as HTMLInputElement).files?.[0];\r\n if (!file) {\r\n document.body.removeChild(input);\r\n reject(new Error('未选择文件'));\r\n return;\r\n }\r\n\r\n const result = await this._parseFile(file, options);\r\n\r\n // 根据配置决定是否自动更新表格\r\n if (options.autoTable && this._tableInstance) {\r\n if (options.autoColumns) {\r\n this._tableInstance.updateOption(\r\n Object.assign({}, this._tableInstance.options, {\r\n columns: result.columns\r\n })\r\n );\r\n }\r\n this._tableInstance.setRecords(result.records);\r\n }\r\n\r\n // 清理\r\n input.value = '';\r\n document.body.removeChild(input);\r\n\r\n resolve(result);\r\n } catch (error) {\r\n document.body.removeChild(input);\r\n reject(error);\r\n }\r\n });\r\n\r\n input.click();\r\n });\r\n }\r\n\r\n /**\r\n * 从字符串数据导入\r\n */\r\n private async _importFromString(\r\n type: 'csv' | 'json' | 'html',\r\n data: string,\r\n options: ExcelImportOptions\r\n ): Promise<ImportResult> {\r\n let result: ImportResult;\r\n\r\n switch (type) {\r\n case 'csv':\r\n result = await this._parseCSVString(data, options);\r\n break;\r\n case 'json':\r\n result = await this._parseJSONString(data, options);\r\n break;\r\n case 'html':\r\n result = await this._parseHTMLString(data, options);\r\n break;\r\n default:\r\n throw new Error(`不支持的导入类型: ${type}`);\r\n }\r\n\r\n // 自动更新表格\r\n if (options.autoTable && this._tableInstance) {\r\n if (options.autoColumns) {\r\n this._tableInstance.updateOption({\r\n columns: result.columns,\r\n plugins: [this]\r\n });\r\n }\r\n this._tableInstance.setRecords(result.records);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 从数据对象导入\r\n */\r\n private async _importFromData(\r\n type: 'json',\r\n data: unknown[] | object,\r\n options: ExcelImportOptions\r\n ): Promise<ImportResult> {\r\n let result: ImportResult;\r\n\r\n if (type === 'json') {\r\n result = await this._parseJSONData(data, options);\r\n } else {\r\n throw new Error(`不支持的数据类型: ${type}`);\r\n }\r\n\r\n // 自动更新表格\r\n if (options.autoTable && this._tableInstance) {\r\n if (options.autoColumns) {\r\n this._tableInstance.updateOption({\r\n columns: result.columns,\r\n plugins: [this]\r\n });\r\n }\r\n this._tableInstance.setRecords(result.records);\r\n }\r\n\r\n return result;\r\n }\r\n /**\r\n * 根据文件类型解析文件\r\n */\r\n private async _parseFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\r\n const mergedOptions = { ...this.options, ...options };\r\n const fileExtension = this._getFileExtension(file.name).toLowerCase();\r\n\r\n switch (fileExtension) {\r\n case 'xlsx':\r\n case 'xls':\r\n return await this._parseExcelFile(file, mergedOptions);\r\n case 'csv':\r\n return await this._parseCsvFile(file, mergedOptions);\r\n case 'json':\r\n return await this._parseJsonFile(file, mergedOptions);\r\n case 'html':\r\n case 'htm':\r\n return await this._parseHtmlFile(file, mergedOptions);\r\n default:\r\n throw new Error(`不支持的文件类型: ${fileExtension}`);\r\n }\r\n }\r\n\r\n /**\r\n * 获取文件扩展名\r\n */\r\n private _getFileExtension(filename: string): string {\r\n const parts = filename.split('.');\r\n return parts.length > 1 ? parts[parts.length - 1] : '';\r\n }\r\n /**\r\n * 解析Excel文件\r\n */\r\n private async _parseExcelFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\r\n const mergedOptions = { ...this.options, ...options };\r\n return await ExcelImportPlugin.importExcelToVTableData(file, mergedOptions);\r\n }\r\n\r\n /**\r\n * 解析CSV文件\r\n */\r\n private async _parseCsvFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\r\n const mergedOptions = { ...this.options, ...options };\r\n const text = await file.text();\r\n return this._parseCSVString(text, mergedOptions);\r\n }\r\n\r\n /**\r\n * 解析JSON文件\r\n */\r\n private async _parseJsonFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\r\n const mergedOptions = { ...this.options, ...options };\r\n const text = await file.text();\r\n return this._parseJSONString(text, mergedOptions);\r\n }\r\n\r\n /**\r\n * 解析HTML表格文件\r\n */\r\n private async _parseHtmlFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\r\n const mergedOptions = { ...this.options, ...options };\r\n const text = await file.text();\r\n return this._parseHTMLString(text, mergedOptions);\r\n }\r\n\r\n /**\r\n * 从表头行构建列配置\r\n */\r\n private _buildColumnsFromHeaders(headerRows: string[][]): ColumnsDefine {\r\n if (headerRows.length === 1) {\r\n return headerRows[0].map((title, index) => ({\r\n field: `col${index}`,\r\n title: title || `列${index + 1}`,\r\n cellType: 'text' as const,\r\n headerType: 'text' as const\r\n }));\r\n }\r\n return ExcelImportPlugin.buildColumns(headerRows);\r\n }\r\n\r\n static async importExcelToVTableData(file: File, options?: ExcelImportOptions) {\r\n const workbook = new ExcelJS.Workbook();\r\n await workbook.xlsx.load(await file.arrayBuffer());\r\n const worksheet = workbook.worksheets[0];\r\n if (!worksheet) {\r\n throw new Error('Excel 文件无有效工作表');\r\n }\r\n const detectedHeaderRows = options?.headerRowCount ?? this.detectHeaderRowCount(worksheet);\r\n const headerRows = [];\r\n for (let i = 1; i <= detectedHeaderRows; i++) {\r\n const row = worksheet.getRow(i);\r\n headerRows.push(Array.prototype.slice.call(row.values, 1));\r\n }\r\n const columns = ExcelImportPlugin.buildColumns(headerRows);\r\n const records: Record<string, unknown>[] = [];\r\n const dataRows: unknown[][] = [];\r\n worksheet.eachRow((row, rowNumber) => {\r\n if (rowNumber <= detectedHeaderRows) {\r\n return;\r\n }\r\n const cells = Array.prototype.slice.call(row.values, 1);\r\n dataRows.push(cells);\r\n });\r\n\r\n // 分批处理数据行,提升大文件性能\r\n const batchSize = options?.batchSize || 1000;\r\n const enableBatch = options?.enableBatchProcessing !== false && dataRows.length > batchSize;\r\n if (enableBatch) {\r\n for (let i = 0; i < dataRows.length; i += batchSize) {\r\n const batch = dataRows.slice(i, i + batchSize);\r\n const batchRecords = batch.map(cells => {\r\n const record: Record<string, unknown> = {};\r\n cells.forEach((cell: unknown, j: number) => {\r\n record[`col${j}`] = cell;\r\n });\r\n return record;\r\n });\r\n records.push(...batchRecords);\r\n if (i + batchSize < dataRows.length) {\r\n await new Promise(resolve => setTimeout(resolve, options?.asyncDelay || 5));\r\n }\r\n }\r\n } else {\r\n // 小文件直接处理\r\n dataRows.forEach(cells => {\r\n const record: Record<string, unknown> = {};\r\n cells.forEach((cell: unknown, i: number) => {\r\n record[`col${i}`] = cell;\r\n });\r\n records.push(record);\r\n });\r\n }\r\n if (options?.exportData) {\r\n // 导出为JavaScript对象字面量格式\r\n const jsContent = ExcelImportPlugin._generateJavaScriptExport(columns, records);\r\n const blob = new Blob([jsContent], { type: 'text/javascript' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = 'vtable-data.js';\r\n document.body.appendChild(a);\r\n a.click();\r\n setTimeout(() => {\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }, 100);\r\n }\r\n return { columns, records };\r\n }\r\n\r\n private static detectHeaderRowCount(worksheet: any): number {\r\n let rowIndex = 1;\r\n let headerRowCount = 1;\r\n while (true) {\r\n const row = worksheet.getRow(rowIndex);\r\n const cells = Array.prototype.slice.call(row.values, 1);\r\n let hasConsecutive = false;\r\n for (let i = 1; i < cells.length; i++) {\r\n if (cells[i] !== undefined && cells[i] !== '' && cells[i] === cells[i - 1]) {\r\n hasConsecutive = true;\r\n break;\r\n }\r\n }\r\n if (hasConsecutive) {\r\n headerRowCount++;\r\n rowIndex++;\r\n } else {\r\n break;\r\n }\r\n }\r\n return headerRowCount;\r\n }\r\n\r\n private static buildColumns(headerRows: unknown[][], colStart = 0, colEnd?: number, level = 0): ColumnsDefine {\r\n const row = headerRows[level] as unknown[];\r\n const columns: ColumnsDefine = [];\r\n colEnd = colEnd ?? row.length;\r\n let i = colStart;\r\n while (i < colEnd) {\r\n const title = String(row[i] || `列${i + 1}`);\r\n let span = 1;\r\n while (i + span < colEnd && row[i + span] === title) {\r\n span++;\r\n }\r\n if (level < headerRows.length - 1) {\r\n const subColumns = ExcelImportPlugin.buildColumns(headerRows, i, i + span, level + 1);\r\n if (subColumns.length === 1) {\r\n columns.push(subColumns[0]);\r\n } else {\r\n columns.push({\r\n title,\r\n columns: subColumns,\r\n hideColumnsSubHeader: false\r\n });\r\n }\r\n } else {\r\n columns.push({\r\n field: `col${i}`,\r\n title,\r\n cellType: 'text' as const,\r\n headerType: 'text' as const\r\n });\r\n }\r\n i += span;\r\n }\r\n return columns;\r\n }\r\n\r\n /**\r\n * 解析CSV字符串\r\n */\r\n private async _parseCSVString(text: string, options: ExcelImportOptions): Promise<ImportResult> {\r\n const lines = text.split('\\n').filter(line => line.trim());\r\n\r\n if (lines.length === 0) {\r\n throw new Error('CSV文件为空');\r\n }\r\n\r\n // 解析CSV行(支持自定义分隔符)\r\n const delimiter = options.delimiter || ',';\r\n const parseCSVLine = (line: string): string[] => {\r\n return line.split(delimiter).map(cell => cell.trim().replace(/^\"|\"$/g, ''));\r\n };\r\n\r\n const headerRowCount = 1;\r\n const headerRows = lines.slice(0, headerRowCount).map(parseCSVLine);\r\n const dataRows = lines.slice(headerRowCount);\r\n\r\n const columns = this._buildColumnsFromHeaders(headerRows);\r\n const records: Record<string, unknown>[] = [];\r\n\r\n await this._processBatchRecords(dataRows, options, async (batch: string[]) => {\r\n const batchRecords = batch.map(line => {\r\n const parsedRow = parseCSVLine(line);\r\n const record: Record<string, unknown> = {};\r\n parsedRow.forEach((cell, i) => {\r\n record[`col${i}`] = cell || '';\r\n });\r\n return record;\r\n });\r\n records.push(...batchRecords);\r\n });\r\n if (options.exportData) {\r\n this._exportToJS(columns, records);\r\n }\r\n\r\n return { columns, records };\r\n }\r\n\r\n /**\r\n * 解析JSON字符串\r\n */\r\n private async _parseJSONString(text: string, options: ExcelImportOptions): Promise<ImportResult> {\r\n let jsonData;\r\n\r\n try {\r\n jsonData = JSON.parse(text);\r\n } catch (error) {\r\n throw new Error('JSON文件格式错误');\r\n }\r\n\r\n const result = await this._parseJSONData(jsonData, options);\r\n if (options.exportData) {\r\n this._exportToJS(result.columns, result.records);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 解析HTML字符串\r\n */\r\n private async _parseHTMLString(text: string, options: ExcelImportOptions): Promise<ImportResult> {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(text, 'text/html');\r\n const table = doc.querySelector('table');\r\n\r\n if (!table) {\r\n throw new Error('HTML文件中未找到表格');\r\n }\r\n\r\n const rows = Array.from(table.querySelectorAll('tr'));\r\n if (rows.length === 0) {\r\n throw new Error('表格中没有数据行');\r\n }\r\n\r\n const headerRowCount = 1;\r\n const headerRows = rows\r\n .slice(0, headerRowCount)\r\n .map(row => Array.from(row.querySelectorAll('th, td')).map(cell => cell.textContent?.trim() || ''));\r\n const dataRows = rows.slice(headerRowCount);\r\n\r\n const columns = this._buildColumnsFromHeaders(headerRows);\r\n const records: Record<string, unknown>[] = [];\r\n\r\n // 分批处理数据行\r\n await this._processBatchRecords(dataRows, options, async (batch: Element[]) => {\r\n const batchRecords = batch.map(row => {\r\n const cells = Array.from(row.querySelectorAll('td')).map(cell => cell.textContent?.trim() || '');\r\n const record: Record<string, unknown> = {};\r\n cells.forEach((cell, i) => {\r\n record[`col${i}`] = cell || '';\r\n });\r\n return record;\r\n });\r\n records.push(...batchRecords);\r\n });\r\n\r\n // 如果启用了导出功能,则导出为JS文件\r\n if (options.exportData) {\r\n this._exportToJS(columns, records);\r\n }\r\n\r\n return { columns, records };\r\n }\r\n\r\n /**\r\n * 解析JSON数据对象\r\n */\r\n private async _parseJSONData(jsonData: unknown[] | object, options: ExcelImportOptions): Promise<ImportResult> {\r\n let result: ImportResult;\r\n\r\n // 如果JSON直接包含columns和records\r\n if (\r\n typeof jsonData === 'object' &&\r\n !Array.isArray(jsonData) &&\r\n jsonData &&\r\n 'columns' in jsonData &&\r\n 'records' in jsonData\r\n ) {\r\n const data = jsonData as { columns: ColumnsDefine; records: Record<string, unknown>[] };\r\n const records: Record<string, unknown>[] = [];\r\n await this._processBatchRecords(data.records, options, async (batch: Record<string, unknown>[]) => {\r\n const batchRecords = batch.map(record => ({ ...record }));\r\n records.push(...batchRecords);\r\n });\r\n result = {\r\n columns: data.columns,\r\n records: records\r\n };\r\n } else if (Array.isArray(jsonData) && jsonData.length > 0) {\r\n const firstRecord = jsonData[0] as Record<string, unknown>;\r\n const columns: ColumnsDefine = Object.keys(firstRecord).map(key => ({\r\n field: key,\r\n title: key,\r\n cellType: 'text' as const,\r\n headerType: 'text' as const\r\n }));\r\n\r\n const records: Record<string, unknown>[] = [];\r\n await this._processBatchRecords(\r\n jsonData as Record<string, unknown>[],\r\n options,\r\n async (batch: Record<string, unknown>[]) => {\r\n const batchRecords = batch.map(record => ({ ...record }));\r\n records.push(...batchRecords);\r\n }\r\n );\r\n\r\n result = { columns, records };\r\n } else {\r\n throw new Error('不支持的JSON格式');\r\n }\r\n\r\n if (options.exportData) {\r\n this._exportToJS(result.columns, result.records);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 生成JavaScript对象字面量格式的导出内容\r\n */\r\n private static _generateJavaScriptExport(columns: ColumnsDefine, records: Record<string, unknown>[]): string {\r\n // 格式化值,确保正确的缩进\r\n const formatValue = (value: unknown, indent: string = ''): string => {\r\n if (value === null || value === undefined) {\r\n return 'null';\r\n }\r\n if (typeof value === 'string') {\r\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\r\n }\r\n if (typeof value === 'number' || typeof value === 'boolean') {\r\n return String(value);\r\n }\r\n if (Array.isArray(value)) {\r\n if (value.length === 0) {\r\n return '[]';\r\n }\r\n const items = value.map(item => formatValue(item, indent + ' ')).join(', ');\r\n return `[${items}]`;\r\n }\r\n if (typeof value === 'object') {\r\n const props = Object.entries(value)\r\n .map(([key, val]) => `${indent} ${key}: ${formatValue(val, indent + ' ')}`)\r\n .join(',\\n');\r\n return `{\\n${props}\\n${indent}}`;\r\n }\r\n return String(value);\r\n };\r\n\r\n // 格式化记录对象\r\n const formatRecord = (record: unknown): string => {\r\n const props = Object.entries(record)\r\n .map(([key, value]) => ` ${key}: ${formatValue(value)}`)\r\n .join(',\\n');\r\n return ` {\\n${props}\\n }`;\r\n };\r\n\r\n // 格式化列对象(支持嵌套列)\r\n const formatColumn = (column: unknown, baseIndent: string = ' '): string => {\r\n const props = Object.entries(column)\r\n .map(([key, value]) => {\r\n if (key === 'columns' && Array.isArray(value)) {\r\n // 递归处理嵌套列,增加缩进\r\n const nestedColumns = value.map(col => formatColumn(col, baseIndent + ' ')).join(',\\n');\r\n return `${baseIndent} ${key}: [\\n${nestedColumns}\\n${baseIndent} ]`;\r\n }\r\n return `${baseIndent} ${key}: ${formatValue(value)}`;\r\n })\r\n .join(',\\n');\r\n return `${baseIndent}{\\n${props}\\n${baseIndent}}`;\r\n };\r\n\r\n const columnsStr = columns.map(col => formatColumn(col)).join(',\\n');\r\n const recordsStr = records.map(formatRecord).join(',\\n');\r\n\r\n return `// VTable 数据导出 - JavaScript 对象字面量格式\r\n// 生成时间: ${new Date().toLocaleString()}\r\n\r\nconst vtableData = {\r\n columns: [\r\n${columnsStr}\r\n ],\r\n records: [\r\n${recordsStr}\r\n ]\r\n};\r\n`;\r\n }\r\n\r\n /**\r\n * 导出数据为JavaScript对象字面量格式\r\n */\r\n private _exportToJS(columns: ColumnDefine[], records: Record<string, unknown>[]): void {\r\n const jsContent = ExcelImportPlugin._generateJavaScriptExport(columns, records);\r\n const blob = new Blob([jsContent], { type: 'text/javascript' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = 'vtable-data.js';\r\n document.body.appendChild(a);\r\n a.click();\r\n setTimeout(() => {\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * 分批处理大数据记录,避免UI阻塞\r\n */\r\n private async _processBatchRecords<T>(\r\n records: T[],\r\n options: ExcelImportOptions,\r\n processor: (batch: T[], batchIndex: number) => Promise<void> | void\r\n ): Promise<void> {\r\n if (!options.enableBatchProcessing || records.length <= (options.batchSize || 1000)) {\r\n // 小数据量直接处理\r\n await processor(records, 0);\r\n return;\r\n }\r\n\r\n const batchSize = options.batchSize || 1000;\r\n const totalBatches = Math.ceil(records.length / batchSize);\r\n for (let i = 0; i < totalBatches; i++) {\r\n const start = i * batchSize;\r\n const end = Math.min(start + batchSize, records.length);\r\n const batch = records.slice(start, end);\r\n await processor(batch, i);\r\n // 让出控制权给浏览器,避免长时间阻塞UI\r\n if (i < totalBatches - 1) {\r\n await new Promise(resolve => setTimeout(resolve, options.asyncDelay || 5));\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/excel-import.ts"],"names":[],"mappings":"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","file":"excel-import.js","sourcesContent":["import type { ListTable, pluginsDefinition, ColumnsDefine } from '@visactor/vtable';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nimport ExcelJS from 'exceljs';\nimport { importExcelMultipleSheets, importCsvFile } from './excel-import/excel';\nimport { applyImportToVTableSheet } from './excel-import/vtable-sheet';\nimport type { ExcelImportOptions, ImportResult, MultiSheetImportResult } from './excel-import/types';\n\nexport type { ExcelImportOptions, ImportResult, MultiSheetImportResult, SheetData } from './excel-import/types';\n\n/**\n * Excel 导入插件\n * 提供 Excel 文件导入功能,支持单 sheet 和多 sheet 导入\n */\nexport class ExcelImportPlugin implements pluginsDefinition.IVTablePlugin {\n id: string = `excel-import-plugin`;\n name = 'ExcelImportPlugin';\n runTime = [TABLE_EVENT_TYPE.INITIALIZED];\n private options: ExcelImportOptions;\n private table: ListTable | null = null;\n\n constructor(options?: ExcelImportOptions) {\n this.options = {\n autoTable: true,\n autoColumns: true,\n delimiter: ',',\n exportData: false,\n batchSize: 1000,\n enableBatchProcessing: true,\n asyncDelay: 5,\n importAllSheets: false, // 默认不导入所有 sheets\n clearExisting: true, // 默认替换模式\n ...options\n };\n if (options?.id) {\n this.id = options.id;\n }\n }\n\n /**\n * 插件初始化方法\n * @param args 插件参数\n */\n run(...args: any[]) {\n const runTime = args[1];\n if (runTime === TABLE_EVENT_TYPE.INITIALIZED) {\n this.table = args[2];\n\n // 为表格实例添加 importFile 方法\n (this.table as any).importFile = () => {\n this.import('file');\n };\n\n // 如果是 VTableSheet,给 VTableSheet 实例添加导入方法\n if ((this.table as any).__vtableSheet) {\n const vtableSheet = (this.table as any).__vtableSheet;\n if (!(vtableSheet as any)._importFile) {\n // 绑定文件选择并导入的方法\n (vtableSheet as any)._importFile = async (options?: Partial<ExcelImportOptions>) => {\n const mergedOptions = { ...this.options, ...options };\n return this._importFileFromDialogForVTableSheet(vtableSheet, mergedOptions);\n };\n }\n }\n }\n }\n\n /**\n * 导入文件(自动检测类型)\n * @param options 导入选项\n * @returns Promise<ImportResult | MultiSheetImportResult>\n */\n private async _importFile(options?: Partial<ExcelImportOptions>): Promise<ImportResult | MultiSheetImportResult> {\n if (!this.table) {\n throw new Error('表格实例不存在或已销毁,无法导入数据!');\n }\n\n const mergedOptions = { ...this.options, ...options };\n const isVTableSheet = this._detectVTableSheet(this.table);\n\n if (isVTableSheet) {\n // VTableSheet 使用多 sheet 导入\n return this._importMultipleSheetsFromFileDialog({\n ...mergedOptions,\n importAllSheets: true\n });\n }\n // ListTable 使用单 sheet 导入(保留原有逻辑)\n // TODO: 可以进一步重构,将单 sheet 导入逻辑也拆分出去\n throw new Error('ListTable 单 sheet 导入功能需要进一步重构');\n }\n\n /**\n * 打开文件选择对话框并获取文件(公共方法)\n * @param accept 接受的文件类型\n * @returns Promise<File>\n */\n private _selectFile(accept: string = '.xlsx,.xls,.csv,.txt,.json,.html,.htm'): Promise<File> {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n input.addEventListener('change', () => {\n try {\n const file = (input as HTMLInputElement).files?.[0];\n if (!file) {\n document.body.removeChild(input);\n reject(new Error('未选择文件'));\n return;\n }\n\n // 清理\n input.value = '';\n document.body.removeChild(input);\n\n resolve(file);\n } catch (error) {\n document.body.removeChild(input);\n reject(error);\n }\n });\n\n input.click();\n });\n }\n\n /**\n * 从文件对话框导入文件到 VTableSheet(支持 Excel 和 CSV)\n * @param vtableSheetInstance VTableSheet 实例\n * @param options 导入选项\n * @returns Promise<MultiSheetImportResult>\n */\n private async _importFileFromDialogForVTableSheet(\n vtableSheetInstance: any,\n options: ExcelImportOptions\n ): Promise<MultiSheetImportResult> {\n try {\n const file = await this._selectFile('.xlsx,.xls,.csv,.txt');\n const fileExtension = this._getFileExtension(file.name).toLowerCase();\n let result: MultiSheetImportResult;\n\n if (fileExtension === 'csv' || fileExtension === 'txt') {\n result = await importCsvFile(file, options);\n } else if (fileExtension === 'xlsx' || fileExtension === 'xls') {\n result = await importExcelMultipleSheets(file, options);\n } else {\n throw new Error('不支持的文件类型,仅支持 Excel (.xlsx, .xls) 和 CSV (.csv, .txt)');\n }\n\n // 自动应用导入结果到 VTableSheet\n if (options.autoTable !== false && result.sheets.length > 0) {\n applyImportToVTableSheet(vtableSheetInstance, result, options);\n }\n\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * 从文件对话框导入(多个sheet)- 用于 VTableSheet\n */\n private async _importMultipleSheetsFromFileDialog(options: ExcelImportOptions): Promise<MultiSheetImportResult> {\n try {\n const file = await this._selectFile('.xlsx,.xls,.csv,.txt');\n const fileExtension = this._getFileExtension(file.name).toLowerCase();\n let result: MultiSheetImportResult;\n\n if (fileExtension === 'csv' || fileExtension === 'txt') {\n result = await importCsvFile(file, options);\n } else if (fileExtension === 'xlsx' || fileExtension === 'xls') {\n result = await importExcelMultipleSheets(file, options);\n } else {\n throw new Error('不支持的文件类型,仅支持 Excel (.xlsx, .xls) 和 CSV (.csv, .txt)');\n }\n\n // 如果是 VTableSheet 且 autoTable 为 true,自动应用导入结果\n if (options.autoTable !== false && this.table && this._detectVTableSheet(this.table)) {\n const vtableSheet = (this.table as any).__vtableSheet;\n if (vtableSheet) {\n applyImportToVTableSheet(vtableSheet, result, options);\n }\n }\n\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * 检测是否为 VTable-sheet 实例\n */\n private _detectVTableSheet(instance: ListTable): boolean {\n // 通过检查实例的特征来判断是否为 VTable-sheet\n const inst = instance as unknown as Record<string, unknown>;\n return !!(\n inst &&\n typeof inst.updateOption === 'function' &&\n inst.options &&\n typeof inst.options === 'object' &&\n inst.options !== null &&\n Array.isArray((inst.options as Record<string, unknown>).sheets)\n );\n }\n\n /**\n * 获取文件扩展名\n */\n private _getFileExtension(filename: string): string {\n const parts = filename.split('.');\n return parts.length > 1 ? parts[parts.length - 1] : '';\n }\n\n /**\n * 插件销毁方法\n * 清理挂载到表格实例的方法\n */\n release() {\n if (this.table) {\n delete (this.table as any).importFile;\n this.table = null;\n }\n }\n\n /**\n * 统一的导入方法(用于 ListTable)\n * @param type 导入类型: \"file\" | \"csv\" | \"json\" | \"html\"\n * @param source 数据源: 文件选择器 | 字符串数据 | 对象数据\n * @param options 导入选项\n * @returns Promise<ImportResult>\n */\n async import(\n type: 'file' | 'csv' | 'json' | 'html',\n source?: string | object,\n options?: Partial<ExcelImportOptions>\n ): Promise<ImportResult | MultiSheetImportResult> {\n if (!this.table) {\n throw new Error('表格实例不存在或已销毁,无法导入数据!');\n }\n\n const mergedOptions = { ...this.options, ...options };\n const isVTableSheet = this._detectVTableSheet(this.table);\n\n // VTableSheet 使用多 sheet 导入逻辑\n if (isVTableSheet && type === 'file') {\n return this._importMultipleSheetsFromFileDialog({\n ...mergedOptions,\n importAllSheets: true\n });\n }\n\n // ListTable 使用单 sheet 导入逻辑\n if (type === 'file') {\n return this._importFromFileDialog(mergedOptions);\n }\n if (typeof source === 'string') {\n return this._importFromString(type as 'csv' | 'json' | 'html', source, mergedOptions);\n }\n if (Array.isArray(source) || typeof source === 'object') {\n if (type !== 'json') {\n throw new Error('只有JSON格式支持从对象导入');\n }\n return this._importFromData('json', source, mergedOptions);\n }\n throw new Error('Invalid import source');\n }\n\n /**\n * 从文件对话框导入(用于 ListTable)\n */\n private async _importFromFileDialog(options: ExcelImportOptions): Promise<ImportResult> {\n if (!this.table) {\n throw new Error('表格实例不存在或已销毁,无法导入数据!');\n }\n\n const file = await this._selectFile();\n const result = await this._parseFile(file, options);\n\n // 根据配置决定是否自动更新表格\n if (options.autoTable && this.table) {\n if (options.autoColumns) {\n this.table.updateOption(\n Object.assign({}, this.table.options, {\n columns: result.columns\n })\n );\n }\n this.table.setRecords(result.records);\n }\n\n return result;\n }\n\n /**\n * 从字符串数据导入\n */\n private async _importFromString(\n type: 'csv' | 'json' | 'html',\n data: string,\n options: ExcelImportOptions\n ): Promise<ImportResult> {\n let result: ImportResult;\n\n switch (type) {\n case 'csv':\n result = await this._parseCSVString(data, options);\n break;\n case 'json':\n result = await this._parseJSONString(data, options);\n break;\n case 'html':\n result = await this._parseHTMLString(data, options);\n break;\n default:\n throw new Error(`不支持的导入类型: ${type}`);\n }\n\n // 自动更新表格\n if (options.autoTable && this.table) {\n if (options.autoColumns) {\n this.table.updateOption({\n columns: result.columns,\n plugins: [this]\n });\n }\n this.table.setRecords(result.records);\n }\n\n return result;\n }\n\n /**\n * 从数据对象导入\n */\n private async _importFromData(\n type: 'json',\n data: unknown[] | object,\n options: ExcelImportOptions\n ): Promise<ImportResult> {\n let result: ImportResult;\n\n if (type === 'json') {\n result = await this._parseJSONData(data, options);\n } else {\n throw new Error(`不支持的数据类型: ${type}`);\n }\n\n // 自动更新表格\n if (options.autoTable && this.table) {\n if (options.autoColumns) {\n this.table.updateOption({\n columns: result.columns,\n plugins: [this]\n });\n }\n this.table.setRecords(result.records);\n }\n\n return result;\n }\n /**\n * 根据文件类型解析文件\n */\n private async _parseFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\n const mergedOptions = { ...this.options, ...options };\n const fileExtension = this._getFileExtension(file.name).toLowerCase();\n\n switch (fileExtension) {\n case 'xlsx':\n case 'xls':\n return await this._parseExcelFile(file, mergedOptions);\n case 'csv':\n return await this._parseCsvFile(file, mergedOptions);\n case 'json':\n return await this._parseJsonFile(file, mergedOptions);\n case 'html':\n case 'htm':\n return await this._parseHtmlFile(file, mergedOptions);\n default:\n throw new Error(`不支持的文件类型: ${fileExtension}`);\n }\n }\n\n /**\n * 解析Excel文件\n */\n private async _parseExcelFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\n const mergedOptions = { ...this.options, ...options };\n return await ExcelImportPlugin.importExcelToVTableData(file, mergedOptions);\n }\n\n /**\n * 解析CSV文件\n */\n private async _parseCsvFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\n const mergedOptions = { ...this.options, ...options };\n const text = await file.text();\n return this._parseCSVString(text, mergedOptions);\n }\n\n /**\n * 解析JSON文件\n */\n private async _parseJsonFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\n const mergedOptions = { ...this.options, ...options };\n const text = await file.text();\n return this._parseJSONString(text, mergedOptions);\n }\n\n /**\n * 解析HTML表格文件\n */\n private async _parseHtmlFile(file: File, options?: ExcelImportOptions): Promise<ImportResult> {\n const mergedOptions = { ...this.options, ...options };\n const text = await file.text();\n return this._parseHTMLString(text, mergedOptions);\n }\n\n /**\n * 从表头行构建列配置\n */\n private _buildColumnsFromHeaders(headerRows: string[][]): ColumnsDefine {\n if (headerRows.length === 1) {\n return headerRows[0].map((title, index) => ({\n field: `col${index}`,\n title: title || `列${index + 1}`,\n cellType: 'text' as const,\n headerType: 'text' as const\n }));\n }\n return ExcelImportPlugin.buildColumns(headerRows);\n }\n\n static async importExcelToVTableData(file: File, options?: ExcelImportOptions) {\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(await file.arrayBuffer());\n const worksheet = workbook.worksheets[0];\n if (!worksheet) {\n throw new Error('Excel 文件无有效工作表');\n }\n const detectedHeaderRows = options?.headerRowCount ?? this.detectHeaderRowCount(worksheet);\n const headerRows = [];\n for (let i = 1; i <= detectedHeaderRows; i++) {\n const row = worksheet.getRow(i);\n headerRows.push(Array.prototype.slice.call(row.values, 1));\n }\n const columns = ExcelImportPlugin.buildColumns(headerRows);\n const records: Record<string, unknown>[] = [];\n const dataRows: unknown[][] = [];\n worksheet.eachRow((row, rowNumber) => {\n if (rowNumber <= detectedHeaderRows) {\n return;\n }\n const cells = Array.prototype.slice.call(row.values, 1);\n dataRows.push(cells);\n });\n\n // 分批处理数据行,提升大文件性能\n const batchSize = options?.batchSize || 1000;\n const enableBatch = options?.enableBatchProcessing !== false && dataRows.length > batchSize;\n if (enableBatch) {\n for (let i = 0; i < dataRows.length; i += batchSize) {\n const batch = dataRows.slice(i, i + batchSize);\n const batchRecords = batch.map(cells => {\n const record: Record<string, unknown> = {};\n cells.forEach((cell: unknown, j: number) => {\n record[`col${j}`] = cell;\n });\n return record;\n });\n records.push(...batchRecords);\n if (i + batchSize < dataRows.length) {\n await new Promise(resolve => setTimeout(resolve, options?.asyncDelay || 5));\n }\n }\n } else {\n // 小文件直接处理\n dataRows.forEach(cells => {\n const record: Record<string, unknown> = {};\n cells.forEach((cell: unknown, i: number) => {\n record[`col${i}`] = cell;\n });\n records.push(record);\n });\n }\n if (options?.exportData) {\n // 导出为JavaScript对象字面量格式\n const jsContent = ExcelImportPlugin._generateJavaScriptExport(columns, records);\n const blob = new Blob([jsContent], { type: 'text/javascript' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'vtable-data.js';\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }, 100);\n }\n return { columns, records };\n }\n\n private static detectHeaderRowCount(worksheet: any): number {\n let rowIndex = 1;\n let headerRowCount = 1;\n while (true) {\n const row = worksheet.getRow(rowIndex);\n const cells = Array.prototype.slice.call(row.values, 1);\n let hasConsecutive = false;\n for (let i = 1; i < cells.length; i++) {\n if (cells[i] !== undefined && cells[i] !== '' && cells[i] === cells[i - 1]) {\n hasConsecutive = true;\n break;\n }\n }\n if (hasConsecutive) {\n headerRowCount++;\n rowIndex++;\n } else {\n break;\n }\n }\n return headerRowCount;\n }\n\n private static buildColumns(headerRows: unknown[][], colStart = 0, colEnd?: number, level = 0): ColumnsDefine {\n const row = headerRows[level] as unknown[];\n const columns: ColumnsDefine = [];\n colEnd = colEnd ?? row.length;\n let i = colStart;\n while (i < colEnd) {\n const title = String(row[i] || `列${i + 1}`);\n let span = 1;\n while (i + span < colEnd && row[i + span] === title) {\n span++;\n }\n if (level < headerRows.length - 1) {\n const subColumns = ExcelImportPlugin.buildColumns(headerRows, i, i + span, level + 1);\n if (subColumns.length === 1) {\n columns.push(subColumns[0]);\n } else {\n columns.push({\n title,\n columns: subColumns,\n hideColumnsSubHeader: false\n });\n }\n } else {\n columns.push({\n field: `col${i}`,\n title,\n cellType: 'text' as const,\n headerType: 'text' as const\n });\n }\n i += span;\n }\n return columns;\n }\n\n /**\n * 解析CSV字符串(使用与 excel.ts 相同的解析逻辑)\n */\n private async _parseCSVString(text: string, options: ExcelImportOptions): Promise<ImportResult> {\n const delimiter = options.delimiter || ',';\n const lines = text.split(/\\r?\\n/).filter(line => line.trim().length > 0);\n\n if (lines.length === 0) {\n throw new Error('CSV文件为空');\n }\n\n // 使用与 excel.ts 相同的 CSV 行解析逻辑\n const parseCSVLine = (line: string): unknown[] => {\n const result: unknown[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n const nextChar = line[i + 1];\n\n if (char === '\"') {\n if (inQuotes && nextChar === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (char === delimiter && !inQuotes) {\n result.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n result.push(current.trim());\n return result;\n };\n\n const headerRowCount = 1;\n const headerRows = lines.slice(0, headerRowCount).map(line => parseCSVLine(line).map(cell => String(cell || '')));\n const dataRows = lines.slice(headerRowCount);\n\n const columns = this._buildColumnsFromHeaders(headerRows);\n const records: Record<string, unknown>[] = [];\n\n await this._processBatchRecords(dataRows, options, async (batch: string[]) => {\n const batchRecords = batch.map(line => {\n const parsedRow = parseCSVLine(line);\n const record: Record<string, unknown> = {};\n parsedRow.forEach((cell, i) => {\n record[`col${i}`] = cell ?? '';\n });\n return record;\n });\n records.push(...batchRecords);\n });\n\n if (options.exportData) {\n this._exportToJS(columns, records);\n }\n\n return { columns, records };\n }\n\n /**\n * 解析JSON字符串\n */\n private async _parseJSONString(text: string, options: ExcelImportOptions): Promise<ImportResult> {\n let jsonData;\n\n try {\n jsonData = JSON.parse(text);\n } catch (error) {\n throw new Error('JSON文件格式错误');\n }\n\n const result = await this._parseJSONData(jsonData, options);\n if (options.exportData) {\n this._exportToJS(result.columns, result.records);\n }\n\n return result;\n }\n\n /**\n * 解析HTML字符串\n */\n private async _parseHTMLString(text: string, options: ExcelImportOptions): Promise<ImportResult> {\n const parser = new DOMParser();\n const doc = parser.parseFromString(text, 'text/html');\n const table = doc.querySelector('table');\n\n if (!table) {\n throw new Error('HTML文件中未找到表格');\n }\n\n const rows = Array.from(table.querySelectorAll('tr'));\n if (rows.length === 0) {\n throw new Error('表格中没有数据行');\n }\n\n const headerRowCount = 1;\n const headerRows = rows\n .slice(0, headerRowCount)\n .map(row => Array.from(row.querySelectorAll('th, td')).map(cell => cell.textContent?.trim() || ''));\n const dataRows = rows.slice(headerRowCount);\n\n const columns = this._buildColumnsFromHeaders(headerRows);\n const records: Record<string, unknown>[] = [];\n\n // 分批处理数据行\n await this._processBatchRecords(dataRows, options, async (batch: Element[]) => {\n const batchRecords = batch.map(row => {\n const cells = Array.from(row.querySelectorAll('td')).map(cell => cell.textContent?.trim() || '');\n const record: Record<string, unknown> = {};\n cells.forEach((cell, i) => {\n record[`col${i}`] = cell || '';\n });\n return record;\n });\n records.push(...batchRecords);\n });\n\n // 如果启用了导出功能,则导出为JS文件\n if (options.exportData) {\n this._exportToJS(columns, records);\n }\n\n return { columns, records };\n }\n\n /**\n * 解析JSON数据对象\n */\n private async _parseJSONData(jsonData: unknown[] | object, options: ExcelImportOptions): Promise<ImportResult> {\n let result: ImportResult;\n\n // 如果JSON直接包含columns和records\n if (\n typeof jsonData === 'object' &&\n !Array.isArray(jsonData) &&\n jsonData &&\n 'columns' in jsonData &&\n 'records' in jsonData\n ) {\n const data = jsonData as { columns: ColumnsDefine; records: Record<string, unknown>[] };\n const records: Record<string, unknown>[] = [];\n await this._processBatchRecords(data.records, options, async (batch: Record<string, unknown>[]) => {\n const batchRecords = batch.map(record => ({ ...record }));\n records.push(...batchRecords);\n });\n result = {\n columns: data.columns,\n records: records\n };\n } else if (Array.isArray(jsonData) && jsonData.length > 0) {\n const firstRecord = jsonData[0] as Record<string, unknown>;\n const columns: ColumnsDefine = Object.keys(firstRecord).map(key => ({\n field: key,\n title: key,\n cellType: 'text' as const,\n headerType: 'text' as const\n }));\n\n const records: Record<string, unknown>[] = [];\n await this._processBatchRecords(\n jsonData as Record<string, unknown>[],\n options,\n async (batch: Record<string, unknown>[]) => {\n const batchRecords = batch.map(record => ({ ...record }));\n records.push(...batchRecords);\n }\n );\n\n result = { columns, records };\n } else {\n throw new Error('不支持的JSON格式');\n }\n\n if (options.exportData) {\n this._exportToJS(result.columns, result.records);\n }\n\n return result;\n }\n\n /**\n * 生成JavaScript对象字面量格式的导出内容\n */\n private static _generateJavaScriptExport(columns: ColumnsDefine, records: Record<string, unknown>[]): string {\n // 格式化值,确保正确的缩进\n const formatValue = (value: unknown, indent: string = ''): string => {\n if (value === null || value === undefined) {\n return 'null';\n }\n if (typeof value === 'string') {\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '[]';\n }\n const items = value.map(item => formatValue(item, indent + ' ')).join(', ');\n return `[${items}]`;\n }\n if (typeof value === 'object') {\n const props = Object.entries(value)\n .map(([key, val]) => `${indent} ${key}: ${formatValue(val, indent + ' ')}`)\n .join(',\\n');\n return `{\\n${props}\\n${indent}}`;\n }\n return String(value);\n };\n\n // 格式化记录对象\n const formatRecord = (record: unknown): string => {\n const props = Object.entries(record)\n .map(([key, value]) => ` ${key}: ${formatValue(value)}`)\n .join(',\\n');\n return ` {\\n${props}\\n }`;\n };\n\n // 格式化列对象(支持嵌套列)\n const formatColumn = (column: unknown, baseIndent: string = ' '): string => {\n const props = Object.entries(column)\n .map(([key, value]) => {\n if (key === 'columns' && Array.isArray(value)) {\n // 递归处理嵌套列,增加缩进\n const nestedColumns = value.map(col => formatColumn(col, baseIndent + ' ')).join(',\\n');\n return `${baseIndent} ${key}: [\\n${nestedColumns}\\n${baseIndent} ]`;\n }\n return `${baseIndent} ${key}: ${formatValue(value)}`;\n })\n .join(',\\n');\n return `${baseIndent}{\\n${props}\\n${baseIndent}}`;\n };\n\n const columnsStr = columns.map(col => formatColumn(col)).join(',\\n');\n const recordsStr = records.map(formatRecord).join(',\\n');\n\n return `// VTable 数据导出 - JavaScript 对象字面量格式\n// 生成时间: ${new Date().toLocaleString()}\n\nconst vtableData = {\n columns: [\n${columnsStr}\n ],\n records: [\n${recordsStr}\n ]\n};\n`;\n }\n\n /**\n * 导出数据为JavaScript对象字面量格式\n */\n private _exportToJS(columns: ColumnsDefine, records: Record<string, unknown>[]): void {\n const jsContent = ExcelImportPlugin._generateJavaScriptExport(columns, records);\n const blob = new Blob([jsContent], { type: 'text/javascript' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'vtable-data.js';\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }, 100);\n }\n\n /**\n * 分批处理大数据记录,避免UI阻塞\n */\n private async _processBatchRecords<T>(\n records: T[],\n options: ExcelImportOptions,\n processor: (batch: T[], batchIndex: number) => Promise<void> | void\n ): Promise<void> {\n if (!options.enableBatchProcessing || records.length <= (options.batchSize || 1000)) {\n // 小数据量直接处理\n await processor(records, 0);\n return;\n }\n\n const batchSize = options.batchSize || 1000;\n const totalBatches = Math.ceil(records.length / batchSize);\n for (let i = 0; i < totalBatches; i++) {\n const start = i * batchSize;\n const end = Math.min(start + batchSize, records.length);\n const batch = records.slice(start, end);\n await processor(batch, i);\n // 让出控制权给浏览器,避免长时间阻塞UI\n if (i < totalBatches - 1) {\n await new Promise(resolve => setTimeout(resolve, options.asyncDelay || 5));\n }\n }\n }\n}\n"]}
@@ -24,6 +24,7 @@ export declare class FilterToolbar {
24
24
  private clearFilterOptionLink;
25
25
  private cancelFilterButton;
26
26
  private applyFilterButton;
27
+ private activeType;
27
28
  constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager, pluginOptions: FilterOptions);
28
29
  private onTabSwitch;
29
30
  private updateSelectedField;
@@ -9,7 +9,8 @@ const vtable_1 = require("@visactor/vtable"), value_filter_1 = require("./value-
9
9
  class FilterToolbar {
10
10
  constructor(table, filterStateManager, pluginOptions) {
11
11
  this.valueFilter = null, this.conditionFilter = null, this.activeTab = "byValue",
12
- this.isVisible = !1, this.selectedField = null, this.filterModes = [], this.hide = (currentCol, currentRow) => {
12
+ this.isVisible = !1, this.selectedField = null, this.filterModes = [], this.activeType = "byValue",
13
+ this.hide = (currentCol, currentRow) => {
13
14
  this.filterMenu.style.display = "none", this.isVisible = !1, this.table.fireListeners(vtable_1.TABLE_EVENT_TYPE.FILTER_MENU_HIDE, {
14
15
  col: null != currentCol ? currentCol : this.currentCol,
15
16
  row: null != currentRow ? currentRow : this.currentRow
@@ -76,13 +77,13 @@ class FilterToolbar {
76
77
  (0, styles_1.applyStyles)(this.filterTabByValue, styles.tabStyle(!0)), (0, styles_1.applyStyles)(this.footerContainer, styles.footerContainer),
77
78
  (0, styles_1.applyStyles)(this.clearFilterOptionLink, styles.clearLink), (0, styles_1.applyStyles)(this.cancelFilterButton, styles.footerButton(!1)),
78
79
  (0, styles_1.applyStyles)(this.applyFilterButton, styles.footerButton(!0)), this.valueFilter.updateStyles(styles),
79
- this.conditionFilter.updateStyles(styles);
80
+ this.conditionFilter.updateStyles(styles), "byCondition" === this.activeType ? this.onTabSwitch("byCondition") : this.onTabSwitch("byValue");
80
81
  }
81
82
  attachEventListeners() {
82
83
  this.filterTabByValue.addEventListener("click", (() => {
83
- this.onTabSwitch("byValue");
84
+ this.activeType = "byValue", this.onTabSwitch("byValue");
84
85
  })), this.filterTabByCondition.addEventListener("click", (() => {
85
- this.onTabSwitch("byCondition");
86
+ this.activeType = "byCondition", this.onTabSwitch("byCondition");
86
87
  })), this.cancelFilterButton.addEventListener("click", (() => this.hide())), this.clearFilterOptionLink.addEventListener("click", (e => {
87
88
  e.preventDefault(), this.clearFilter(this.selectedField);
88
89
  })), this.applyFilterButton.addEventListener("click", (() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/filter/filter-toolbar.ts"],"names":[],"mappings":"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","file":"filter-toolbar.js","sourcesContent":["import { TABLE_EVENT_TYPE, type ListTable, type PivotTable } from '@visactor/vtable';\nimport type { FilterStateManager } from './filter-state-manager';\nimport { ValueFilter } from './value-filter';\nimport { ConditionFilter } from './condition-filter';\nimport { applyStyles, filterStyles } from './styles';\nimport type { FilterMode, FilterOptions, FilterStyles } from './types';\n\n/**\n * 筛选工具栏,管理按值和按条件筛选组件\n */\nexport class FilterToolbar {\n table: ListTable | PivotTable;\n filterStateManager: FilterStateManager;\n pluginOptions: FilterOptions;\n valueFilter: ValueFilter | null = null;\n conditionFilter: ConditionFilter | null = null;\n activeTab: 'byValue' | 'byCondition' = 'byValue';\n isVisible: boolean = false;\n selectedField: string | number | null = null;\n filterModes: FilterMode[] = [];\n\n private filterMenu: HTMLElement;\n private filterTabsContainer: HTMLElement;\n private filterMenuWidth: number;\n private currentCol?: number | null;\n private currentRow?: number | null;\n private filterTabByValue: HTMLButtonElement;\n private filterTabByCondition: HTMLButtonElement;\n private footerContainer: HTMLElement;\n private clearFilterOptionLink: HTMLAnchorElement;\n private cancelFilterButton: HTMLButtonElement;\n private applyFilterButton: HTMLButtonElement;\n\n constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager, pluginOptions: FilterOptions) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n this.valueFilter = new ValueFilter(this.table, this.filterStateManager, pluginOptions);\n this.conditionFilter = new ConditionFilter(this.table, this.filterStateManager, pluginOptions, this.hide);\n this.pluginOptions = pluginOptions;\n\n this.filterMenuWidth = 300; // 待优化,可能需要自适应内容的宽度\n\n // 监听筛选状态变化,更新清除筛选按钮状态\n this.filterStateManager.subscribe(state => {\n if (this.isVisible && this.selectedField !== null) {\n this.updateClearFilterButtonState(this.selectedField);\n }\n });\n }\n\n private onTabSwitch(tab: 'byValue' | 'byCondition'): void {\n this.activeTab = tab;\n if (tab === 'byValue') {\n this.valueFilter.show();\n this.conditionFilter.hide();\n } else {\n this.conditionFilter.show();\n this.valueFilter.hide();\n }\n\n const isValueTab = tab === 'byValue';\n applyStyles(this.filterTabByValue, filterStyles.tabStyle(isValueTab));\n applyStyles(this.filterTabByCondition, filterStyles.tabStyle(!isValueTab));\n }\n\n private updateSelectedField(field: string | number): void {\n this.selectedField = field;\n // 通知筛选组件更新选中字段\n if (this.valueFilter) {\n this.valueFilter.setSelectedField(field);\n }\n if (this.conditionFilter) {\n this.conditionFilter.setSelectedField(field);\n }\n }\n\n private applyFilter(field: string | number): void {\n if (this.activeTab === 'byValue') {\n this.valueFilter.applyFilter(field);\n } else if (this.activeTab === 'byCondition') {\n this.conditionFilter.applyFilter(field);\n }\n this.hide();\n }\n\n private clearFilter(field: string | number): void {\n if (this.valueFilter) {\n this.valueFilter.clearFilter(field);\n }\n if (this.conditionFilter) {\n this.conditionFilter.clearFilter(field);\n }\n this.hide();\n }\n\n /**\n * 更新清除筛选按钮的状态\n */\n private updateClearFilterButtonState(field: string | number): void {\n const currentFilter = this.filterStateManager.getFilterState(field);\n const hasActiveFilter = currentFilter && currentFilter.enable;\n\n this.clearFilterOptionLink.style.display = 'inline';\n this.clearFilterOptionLink.style.opacity = hasActiveFilter ? '1' : '0.5';\n this.clearFilterOptionLink.style.pointerEvents = hasActiveFilter ? 'auto' : 'none';\n this.clearFilterOptionLink.style.cursor = hasActiveFilter ? 'pointer' : 'not-allowed';\n }\n\n render(container: HTMLElement): void {\n const filterStyles = this.pluginOptions.styles || {};\n // === 主容器 ===\n this.filterMenu = document.createElement('div');\n this.filterMenu.classList.add('vtable-filter-menu');\n applyStyles(this.filterMenu, filterStyles.filterMenu);\n this.filterMenu.style.width = `${this.filterMenuWidth}px`;\n\n // === 筛选 Tab ===\n this.filterTabsContainer = document.createElement('div');\n applyStyles(this.filterTabsContainer, filterStyles.tabsContainer);\n\n this.filterTabByValue = document.createElement('button');\n this.filterTabByValue.innerText = '按值筛选';\n applyStyles(this.filterTabByValue, filterStyles.tabStyle(true));\n\n this.filterTabByCondition = document.createElement('button');\n this.filterTabByCondition.innerText = '按条件筛选';\n applyStyles(this.filterTabByCondition, filterStyles.tabStyle(false));\n\n this.filterTabsContainer.append(this.filterTabByValue, this.filterTabByCondition);\n\n // === 页脚(清除、取消、确定 筛选按钮) ===\n this.footerContainer = document.createElement('div');\n applyStyles(this.footerContainer, filterStyles.footerContainer);\n\n this.clearFilterOptionLink = document.createElement('a');\n this.clearFilterOptionLink.href = '#';\n this.clearFilterOptionLink.innerText = '清除筛选';\n applyStyles(this.clearFilterOptionLink, filterStyles.clearLink);\n\n const footerButtons = document.createElement('div');\n this.cancelFilterButton = document.createElement('button');\n this.cancelFilterButton.innerText = '取消';\n applyStyles(this.cancelFilterButton, filterStyles.footerButton(false));\n\n this.applyFilterButton = document.createElement('button');\n this.applyFilterButton.innerText = '确认';\n applyStyles(this.applyFilterButton, filterStyles.footerButton(true));\n\n footerButtons.append(this.cancelFilterButton, this.applyFilterButton);\n this.footerContainer.append(this.clearFilterOptionLink, footerButtons);\n\n // --- 筛选器头部 Tab ---\n this.filterMenu.append(this.filterTabsContainer);\n\n // --- 筛选器内容 ---\n this.valueFilter.render(this.filterMenu);\n this.conditionFilter.render(this.filterMenu);\n\n // --- 筛选器页脚 ---\n this.filterMenu.append(this.footerContainer);\n\n container.appendChild(this.filterMenu); // 将筛选器添加到 DOM 中\n this.attachEventListeners();\n }\n\n updateStyles(styles: FilterStyles) {\n const realDisplay = (this.filterMenu.style.display ?? styles.filterMenu.display) || 'none';\n applyStyles(this.filterMenu, { ...styles.filterMenu, display: realDisplay });\n applyStyles(this.filterTabsContainer, styles.tabsContainer);\n applyStyles(this.filterTabByValue, styles.tabStyle(true));\n applyStyles(this.footerContainer, styles.footerContainer);\n applyStyles(this.clearFilterOptionLink, styles.clearLink);\n applyStyles(this.cancelFilterButton, styles.footerButton(false));\n applyStyles(this.applyFilterButton, styles.footerButton(true));\n this.valueFilter.updateStyles(styles);\n this.conditionFilter.updateStyles(styles);\n }\n\n attachEventListeners() {\n // 按值筛选/按条件筛选的事件监听\n this.filterTabByValue.addEventListener('click', () => {\n this.onTabSwitch('byValue');\n });\n\n this.filterTabByCondition.addEventListener('click', () => {\n this.onTabSwitch('byCondition');\n });\n\n this.cancelFilterButton.addEventListener('click', () => this.hide());\n\n this.clearFilterOptionLink.addEventListener('click', e => {\n e.preventDefault();\n this.clearFilter(this.selectedField);\n });\n\n this.applyFilterButton.addEventListener('click', () => {\n this.applyFilter(this.selectedField);\n });\n\n // 点击空白处整个筛选菜单可消失\n document.addEventListener('click', () => {\n if (this.isVisible) {\n this.hide();\n }\n });\n\n this.filterMenu.addEventListener('click', e => {\n e.stopPropagation();\n });\n }\n\n adjustMenuPosition(\n col?: number | null,\n row?: number | null,\n providedLeft?: number | null,\n providedTop?: number | null\n ) {\n if (typeof providedLeft === 'number' && typeof providedTop === 'number') {\n this.filterMenu.style.display = this.isVisible ? 'block' : 'none';\n this.filterMenu.style.left = `${providedLeft}px`;\n this.filterMenu.style.top = `${providedTop}px`;\n return;\n }\n\n // 明晰的参数 > 记忆的数字\n const effectiveCol = typeof col === 'number' ? col : this.currentCol;\n const effectiveRow = typeof row === 'number' ? row : this.currentRow;\n\n if (typeof effectiveCol !== 'number' || typeof effectiveRow !== 'number') {\n return;\n }\n\n this.currentCol = effectiveCol;\n this.currentRow = effectiveRow;\n\n let left: number = 0;\n let top: number = 0;\n\n const canvasBounds = this.table.canvas.getBoundingClientRect();\n const cell = this.table.getCellRelativeRect(effectiveCol, effectiveRow);\n\n const filterMenuWidth = this.filterMenuWidth;\n // 最高高度预估值\n // TODO: 需要获取精确高度\n const filterMenuHeight = 380;\n\n if (cell.right < this.filterMenuWidth) {\n // 无法把筛选菜单完整地显示在左侧,那么显示在右侧\n left = cell.left + canvasBounds.left;\n top = cell.bottom + canvasBounds.top;\n } else {\n // 筛选菜单默认显示在左侧\n left = cell.right + canvasBounds.left - this.filterMenuWidth;\n top = cell.bottom + canvasBounds.top;\n }\n\n // 确保筛选菜单不会超出窗口边界\n left = Math.max(0, Math.min(window.innerWidth - filterMenuWidth, left));\n top = Math.max(0, Math.min(window.innerHeight - filterMenuHeight, top));\n\n this.filterMenu.style.display = this.isVisible ? 'block' : 'none';\n this.filterMenu.style.left = `${left}px`;\n this.filterMenu.style.top = `${top}px`;\n }\n\n show(col: number, row: number, filterModes: FilterMode[]): void {\n this.valueFilter.clearSearchInputValue();\n this.filterModes = filterModes;\n if (!this.filterModes.includes('byValue')) {\n this.filterTabByValue.style.display = 'none';\n this.onTabSwitch('byCondition');\n } else if (!this.filterModes.includes('byCondition')) {\n this.filterTabByCondition.style.display = 'none';\n this.onTabSwitch('byValue');\n }\n\n this.adjustMenuPosition(col, row);\n this.filterMenu.style.display = 'block';\n\n const field = this.table.internalProps.layoutMap.getHeaderField(col, row) as string | number;\n this.updateSelectedField(field);\n\n // 根据当前筛选配置自动选择正确的筛选标签页\n const currentFilter = this.filterStateManager.getFilterState(field);\n if (currentFilter && currentFilter.type === 'byCondition') {\n this.onTabSwitch('byCondition');\n } else {\n this.onTabSwitch('byValue');\n }\n\n // 更新清除筛选按钮状态\n this.updateClearFilterButtonState(field);\n\n // 确保在事件冒泡完成后才设置 isVisible 为 true\n setTimeout(() => {\n this.isVisible = true;\n this.table.fireListeners(TABLE_EVENT_TYPE.FILTER_MENU_SHOW, {\n col: col,\n row: row\n });\n }, 0);\n }\n\n hide = (currentCol?: number, currentRow?: number): void => {\n this.filterMenu.style.display = 'none';\n this.isVisible = false;\n this.table.fireListeners(TABLE_EVENT_TYPE.FILTER_MENU_HIDE, {\n col: currentCol ?? this.currentCol,\n row: currentRow ?? this.currentRow\n });\n };\n\n destroy() {\n this.valueFilter.destroy();\n this.filterMenu.remove();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/filter/filter-toolbar.ts"],"names":[],"mappings":"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","file":"filter-toolbar.js","sourcesContent":["import { TABLE_EVENT_TYPE, type ListTable, type PivotTable } from '@visactor/vtable';\nimport type { FilterStateManager } from './filter-state-manager';\nimport { ValueFilter } from './value-filter';\nimport { ConditionFilter } from './condition-filter';\nimport { applyStyles, filterStyles } from './styles';\nimport type { FilterMode, FilterOptions, FilterStyles } from './types';\n\n/**\n * 筛选工具栏,管理按值和按条件筛选组件\n */\nexport class FilterToolbar {\n table: ListTable | PivotTable;\n filterStateManager: FilterStateManager;\n pluginOptions: FilterOptions;\n valueFilter: ValueFilter | null = null;\n conditionFilter: ConditionFilter | null = null;\n activeTab: 'byValue' | 'byCondition' = 'byValue';\n isVisible: boolean = false;\n selectedField: string | number | null = null;\n filterModes: FilterMode[] = [];\n\n private filterMenu: HTMLElement;\n private filterTabsContainer: HTMLElement;\n private filterMenuWidth: number;\n private currentCol?: number | null;\n private currentRow?: number | null;\n private filterTabByValue: HTMLButtonElement;\n private filterTabByCondition: HTMLButtonElement;\n private footerContainer: HTMLElement;\n private clearFilterOptionLink: HTMLAnchorElement;\n private cancelFilterButton: HTMLButtonElement;\n private applyFilterButton: HTMLButtonElement;\n\n private activeType: 'byValue' | 'byCondition' = 'byValue';\n\n constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager, pluginOptions: FilterOptions) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n this.valueFilter = new ValueFilter(this.table, this.filterStateManager, pluginOptions);\n this.conditionFilter = new ConditionFilter(this.table, this.filterStateManager, pluginOptions, this.hide);\n this.pluginOptions = pluginOptions;\n\n this.filterMenuWidth = 300; // 待优化,可能需要自适应内容的宽度\n\n // 监听筛选状态变化,更新清除筛选按钮状态\n this.filterStateManager.subscribe(state => {\n if (this.isVisible && this.selectedField !== null) {\n this.updateClearFilterButtonState(this.selectedField);\n }\n });\n }\n\n private onTabSwitch(tab: 'byValue' | 'byCondition'): void {\n this.activeTab = tab;\n if (tab === 'byValue') {\n this.valueFilter.show();\n this.conditionFilter.hide();\n } else {\n this.conditionFilter.show();\n this.valueFilter.hide();\n }\n\n const isValueTab = tab === 'byValue';\n applyStyles(this.filterTabByValue, filterStyles.tabStyle(isValueTab));\n applyStyles(this.filterTabByCondition, filterStyles.tabStyle(!isValueTab));\n }\n\n private updateSelectedField(field: string | number): void {\n this.selectedField = field;\n // 通知筛选组件更新选中字段\n if (this.valueFilter) {\n this.valueFilter.setSelectedField(field);\n }\n if (this.conditionFilter) {\n this.conditionFilter.setSelectedField(field);\n }\n }\n\n private applyFilter(field: string | number): void {\n if (this.activeTab === 'byValue') {\n this.valueFilter.applyFilter(field);\n } else if (this.activeTab === 'byCondition') {\n this.conditionFilter.applyFilter(field);\n }\n this.hide();\n }\n\n private clearFilter(field: string | number): void {\n if (this.valueFilter) {\n this.valueFilter.clearFilter(field);\n }\n if (this.conditionFilter) {\n this.conditionFilter.clearFilter(field);\n }\n this.hide();\n }\n\n /**\n * 更新清除筛选按钮的状态\n */\n private updateClearFilterButtonState(field: string | number): void {\n const currentFilter = this.filterStateManager.getFilterState(field);\n const hasActiveFilter = currentFilter && currentFilter.enable;\n\n this.clearFilterOptionLink.style.display = 'inline';\n this.clearFilterOptionLink.style.opacity = hasActiveFilter ? '1' : '0.5';\n this.clearFilterOptionLink.style.pointerEvents = hasActiveFilter ? 'auto' : 'none';\n this.clearFilterOptionLink.style.cursor = hasActiveFilter ? 'pointer' : 'not-allowed';\n }\n\n render(container: HTMLElement): void {\n const filterStyles = this.pluginOptions.styles || {};\n // === 主容器 ===\n this.filterMenu = document.createElement('div');\n this.filterMenu.classList.add('vtable-filter-menu');\n applyStyles(this.filterMenu, filterStyles.filterMenu);\n this.filterMenu.style.width = `${this.filterMenuWidth}px`;\n\n // === 筛选 Tab ===\n this.filterTabsContainer = document.createElement('div');\n applyStyles(this.filterTabsContainer, filterStyles.tabsContainer);\n\n this.filterTabByValue = document.createElement('button');\n this.filterTabByValue.innerText = '按值筛选';\n applyStyles(this.filterTabByValue, filterStyles.tabStyle(true));\n\n this.filterTabByCondition = document.createElement('button');\n this.filterTabByCondition.innerText = '按条件筛选';\n applyStyles(this.filterTabByCondition, filterStyles.tabStyle(false));\n\n this.filterTabsContainer.append(this.filterTabByValue, this.filterTabByCondition);\n\n // === 页脚(清除、取消、确定 筛选按钮) ===\n this.footerContainer = document.createElement('div');\n applyStyles(this.footerContainer, filterStyles.footerContainer);\n\n this.clearFilterOptionLink = document.createElement('a');\n this.clearFilterOptionLink.href = '#';\n this.clearFilterOptionLink.innerText = '清除筛选';\n applyStyles(this.clearFilterOptionLink, filterStyles.clearLink);\n\n const footerButtons = document.createElement('div');\n this.cancelFilterButton = document.createElement('button');\n this.cancelFilterButton.innerText = '取消';\n applyStyles(this.cancelFilterButton, filterStyles.footerButton(false));\n\n this.applyFilterButton = document.createElement('button');\n this.applyFilterButton.innerText = '确认';\n applyStyles(this.applyFilterButton, filterStyles.footerButton(true));\n\n footerButtons.append(this.cancelFilterButton, this.applyFilterButton);\n this.footerContainer.append(this.clearFilterOptionLink, footerButtons);\n\n // --- 筛选器头部 Tab ---\n this.filterMenu.append(this.filterTabsContainer);\n\n // --- 筛选器内容 ---\n this.valueFilter.render(this.filterMenu);\n this.conditionFilter.render(this.filterMenu);\n\n // --- 筛选器页脚 ---\n this.filterMenu.append(this.footerContainer);\n\n container.appendChild(this.filterMenu); // 将筛选器添加到 DOM 中\n this.attachEventListeners();\n }\n\n updateStyles(styles: FilterStyles) {\n const realDisplay = (this.filterMenu.style.display ?? styles.filterMenu.display) || 'none';\n applyStyles(this.filterMenu, { ...styles.filterMenu, display: realDisplay });\n applyStyles(this.filterTabsContainer, styles.tabsContainer);\n applyStyles(this.filterTabByValue, styles.tabStyle(true));\n applyStyles(this.footerContainer, styles.footerContainer);\n applyStyles(this.clearFilterOptionLink, styles.clearLink);\n applyStyles(this.cancelFilterButton, styles.footerButton(false));\n applyStyles(this.applyFilterButton, styles.footerButton(true));\n this.valueFilter.updateStyles(styles);\n this.conditionFilter.updateStyles(styles);\n\n // 面板处于显示状态, 更新了样式, 则需要手动控制tab显隐\n // 面板显示按值筛选或按条件筛选\n if (this.activeType === 'byCondition') {\n this.onTabSwitch('byCondition');\n } else {\n this.onTabSwitch('byValue');\n }\n }\n\n attachEventListeners() {\n // 按值筛选/按条件筛选的事件监听\n this.filterTabByValue.addEventListener('click', () => {\n this.activeType = 'byValue';\n this.onTabSwitch('byValue');\n });\n\n this.filterTabByCondition.addEventListener('click', () => {\n this.activeType = 'byCondition';\n this.onTabSwitch('byCondition');\n });\n\n this.cancelFilterButton.addEventListener('click', () => this.hide());\n\n this.clearFilterOptionLink.addEventListener('click', e => {\n e.preventDefault();\n this.clearFilter(this.selectedField);\n });\n\n this.applyFilterButton.addEventListener('click', () => {\n this.applyFilter(this.selectedField);\n });\n\n // 点击空白处整个筛选菜单可消失\n document.addEventListener('click', () => {\n if (this.isVisible) {\n this.hide();\n }\n });\n\n this.filterMenu.addEventListener('click', e => {\n e.stopPropagation();\n });\n }\n\n adjustMenuPosition(\n col?: number | null,\n row?: number | null,\n providedLeft?: number | null,\n providedTop?: number | null\n ) {\n if (typeof providedLeft === 'number' && typeof providedTop === 'number') {\n this.filterMenu.style.display = this.isVisible ? 'block' : 'none';\n this.filterMenu.style.left = `${providedLeft}px`;\n this.filterMenu.style.top = `${providedTop}px`;\n return;\n }\n\n // 明晰的参数 > 记忆的数字\n const effectiveCol = typeof col === 'number' ? col : this.currentCol;\n const effectiveRow = typeof row === 'number' ? row : this.currentRow;\n\n if (typeof effectiveCol !== 'number' || typeof effectiveRow !== 'number') {\n return;\n }\n\n this.currentCol = effectiveCol;\n this.currentRow = effectiveRow;\n\n let left: number = 0;\n let top: number = 0;\n\n const canvasBounds = this.table.canvas.getBoundingClientRect();\n const cell = this.table.getCellRelativeRect(effectiveCol, effectiveRow);\n\n const filterMenuWidth = this.filterMenuWidth;\n // 最高高度预估值\n // TODO: 需要获取精确高度\n const filterMenuHeight = 380;\n\n if (cell.right < this.filterMenuWidth) {\n // 无法把筛选菜单完整地显示在左侧,那么显示在右侧\n left = cell.left + canvasBounds.left;\n top = cell.bottom + canvasBounds.top;\n } else {\n // 筛选菜单默认显示在左侧\n left = cell.right + canvasBounds.left - this.filterMenuWidth;\n top = cell.bottom + canvasBounds.top;\n }\n\n // 确保筛选菜单不会超出窗口边界\n left = Math.max(0, Math.min(window.innerWidth - filterMenuWidth, left));\n top = Math.max(0, Math.min(window.innerHeight - filterMenuHeight, top));\n\n this.filterMenu.style.display = this.isVisible ? 'block' : 'none';\n this.filterMenu.style.left = `${left}px`;\n this.filterMenu.style.top = `${top}px`;\n }\n\n show(col: number, row: number, filterModes: FilterMode[]): void {\n this.valueFilter.clearSearchInputValue();\n this.filterModes = filterModes;\n if (!this.filterModes.includes('byValue')) {\n this.filterTabByValue.style.display = 'none';\n this.onTabSwitch('byCondition');\n } else if (!this.filterModes.includes('byCondition')) {\n this.filterTabByCondition.style.display = 'none';\n this.onTabSwitch('byValue');\n }\n\n this.adjustMenuPosition(col, row);\n this.filterMenu.style.display = 'block';\n\n const field = this.table.internalProps.layoutMap.getHeaderField(col, row) as string | number;\n this.updateSelectedField(field);\n\n // 根据当前筛选配置自动选择正确的筛选标签页\n const currentFilter = this.filterStateManager.getFilterState(field);\n if (currentFilter && currentFilter.type === 'byCondition') {\n this.onTabSwitch('byCondition');\n } else {\n this.onTabSwitch('byValue');\n }\n\n // 更新清除筛选按钮状态\n this.updateClearFilterButtonState(field);\n\n // 确保在事件冒泡完成后才设置 isVisible 为 true\n setTimeout(() => {\n this.isVisible = true;\n this.table.fireListeners(TABLE_EVENT_TYPE.FILTER_MENU_SHOW, {\n col: col,\n row: row\n });\n }, 0);\n }\n\n hide = (currentCol?: number, currentRow?: number): void => {\n this.filterMenu.style.display = 'none';\n this.isVisible = false;\n this.table.fireListeners(TABLE_EVENT_TYPE.FILTER_MENU_HIDE, {\n col: currentCol ?? this.currentCol,\n row: currentRow ?? this.currentRow\n });\n };\n\n destroy() {\n this.valueFilter.destroy();\n this.filterMenu.remove();\n }\n}\n"]}
@@ -62,5 +62,4 @@ Object.defineProperty(exports, "FilterToolbar", {
62
62
  get: function() {
63
63
  return filter_toolbar_1.FilterToolbar;
64
64
  }
65
- }), __exportStar(require("./types"), exports), __exportStar(require("./filter"), exports);
66
- //# sourceMappingURL=index.js.map
65
+ }), __exportStar(require("./types"), exports), __exportStar(require("./filter"), exports);