@visactor/vtable-plugins 1.23.3-alpha.0 → 1.24.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/auto-fill/index.d.ts +3 -2
- package/cjs/auto-fill/index.js.map +1 -1
- package/cjs/auto-fill/series-converters.d.ts +3 -3
- package/cjs/auto-fill/series-converters.js.map +1 -1
- package/cjs/contextmenu/handle-menu-helper.js +1 -2
- package/cjs/contextmenu/index.js +2 -1
- package/cjs/excel-edit-cell-keyboard.d.ts +4 -2
- package/cjs/excel-edit-cell-keyboard.js.map +1 -1
- package/cjs/filter/filter-engine.js +5 -1
- package/cjs/filter/filter-engine.js.map +1 -1
- package/cjs/filter/filter-state-manager.d.ts +6 -1
- package/cjs/filter/filter-state-manager.js +81 -0
- package/cjs/filter/filter-state-manager.js.map +1 -1
- package/cjs/filter/filter-toolbar.d.ts +2 -0
- package/cjs/filter/filter-toolbar.js +23 -3
- package/cjs/filter/filter-toolbar.js.map +1 -1
- package/cjs/filter/filter.d.ts +4 -2
- package/cjs/filter/filter.js +32 -10
- package/cjs/filter/filter.js.map +1 -1
- package/cjs/filter/index.js +2 -1
- package/cjs/filter/types.d.ts +3 -0
- package/cjs/filter/types.js.map +1 -1
- package/cjs/filter/value-filter.js +11 -41
- package/cjs/filter/value-filter.js.map +1 -1
- package/cjs/filter/value-filter.syncSingleStateFromTableData.backup.d.ts +46 -0
- package/cjs/filter/value-filter.syncSingleStateFromTableData.backup.js +247 -0
- package/cjs/filter/value-filter.syncSingleStateFromTableData.backup.js.map +1 -0
- package/cjs/history/formula.d.ts +40 -0
- package/cjs/history/formula.js +112 -0
- package/cjs/history/formula.js.map +1 -0
- package/cjs/history/history-plugin.d.ts +88 -0
- package/cjs/history/history-plugin.js +699 -0
- package/cjs/history/history-plugin.js.map +1 -0
- package/cjs/history/index.d.ts +3 -0
- package/cjs/history/index.js +24 -0
- package/cjs/history/index.js.map +1 -0
- package/cjs/history/replay.d.ts +9 -0
- package/cjs/history/replay.js +268 -0
- package/cjs/history/replay.js.map +1 -0
- package/cjs/history/sheet-key.d.ts +9 -0
- package/cjs/history/sheet-key.js +44 -0
- package/cjs/history/sheet-key.js.map +1 -0
- package/cjs/history/snapshot.d.ts +15 -0
- package/cjs/history/snapshot.js +78 -0
- package/cjs/history/snapshot.js.map +1 -0
- package/cjs/history/types.d.ts +105 -0
- package/cjs/history/types.js +6 -0
- package/cjs/history/types.js.map +1 -0
- package/cjs/history-plugin.d.ts +1 -0
- package/cjs/history-plugin.js +21 -0
- package/cjs/history-plugin.js.map +1 -0
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +2 -1
- package/cjs/index.js.map +1 -1
- package/cjs/master-detail-plugin/checkbox.js +1 -1
- package/cjs/master-detail-plugin/config.js +1 -1
- package/cjs/master-detail-plugin/core.js +1 -1
- package/cjs/master-detail-plugin/events.js +1 -1
- package/cjs/master-detail-plugin/types.d.ts +1 -1
- package/cjs/master-detail-plugin/types.js.map +1 -1
- package/cjs/rotate-table.d.ts +7 -6
- package/cjs/rotate-table.js +12 -13
- package/cjs/rotate-table.js.map +1 -1
- package/cjs/row-series.js +2 -1
- package/cjs/table-export/util/pagination.js.map +1 -1
- package/cjs/wps-fill-handle.d.ts +4 -2
- package/cjs/wps-fill-handle.js.map +1 -1
- package/dist/vtable-plugins.js +1903 -81
- package/dist/vtable-plugins.min.js +3 -3
- package/es/auto-fill/index.d.ts +3 -2
- package/es/auto-fill/index.js.map +1 -1
- package/es/auto-fill/series-converters.d.ts +3 -3
- package/es/auto-fill/series-converters.js.map +1 -1
- package/es/contextmenu/handle-menu-helper.js +1 -2
- package/es/contextmenu/index.js +2 -1
- package/es/excel-edit-cell-keyboard.d.ts +4 -2
- package/es/excel-edit-cell-keyboard.js.map +1 -1
- package/es/filter/filter-engine.js +5 -1
- package/es/filter/filter-engine.js.map +1 -1
- package/es/filter/filter-state-manager.d.ts +6 -1
- package/es/filter/filter-state-manager.js +81 -0
- package/es/filter/filter-state-manager.js.map +1 -1
- package/es/filter/filter-toolbar.d.ts +2 -0
- package/es/filter/filter-toolbar.js +23 -3
- package/es/filter/filter-toolbar.js.map +1 -1
- package/es/filter/filter.d.ts +4 -2
- package/es/filter/filter.js +32 -10
- package/es/filter/filter.js.map +1 -1
- package/es/filter/index.js +2 -1
- package/es/filter/types.d.ts +3 -0
- package/es/filter/types.js.map +1 -1
- package/es/filter/value-filter.js +12 -41
- package/es/filter/value-filter.js.map +1 -1
- package/es/filter/value-filter.syncSingleStateFromTableData.backup.d.ts +46 -0
- package/es/filter/value-filter.syncSingleStateFromTableData.backup.js +242 -0
- package/es/filter/value-filter.syncSingleStateFromTableData.backup.js.map +1 -0
- package/es/history/formula.d.ts +40 -0
- package/es/history/formula.js +103 -0
- package/es/history/formula.js.map +1 -0
- package/es/history/history-plugin.d.ts +88 -0
- package/es/history/history-plugin.js +698 -0
- package/es/history/history-plugin.js.map +1 -0
- package/es/history/index.d.ts +3 -0
- package/es/history/index.js +4 -0
- package/es/history/index.js.map +1 -0
- package/es/history/replay.d.ts +9 -0
- package/es/history/replay.js +260 -0
- package/es/history/replay.js.map +1 -0
- package/es/history/sheet-key.d.ts +9 -0
- package/es/history/sheet-key.js +38 -0
- package/es/history/sheet-key.js.map +1 -0
- package/es/history/snapshot.d.ts +15 -0
- package/es/history/snapshot.js +71 -0
- package/es/history/snapshot.js.map +1 -0
- package/es/history/types.d.ts +105 -0
- package/es/history/types.js +2 -0
- package/es/history/types.js.map +1 -0
- package/es/history-plugin.d.ts +1 -0
- package/es/history-plugin.js +2 -0
- package/es/history-plugin.js.map +1 -0
- package/es/index.d.ts +1 -0
- package/es/index.js +2 -0
- package/es/index.js.map +1 -1
- package/es/master-detail-plugin/checkbox.js +1 -1
- package/es/master-detail-plugin/config.js +1 -1
- package/es/master-detail-plugin/core.js +1 -1
- package/es/master-detail-plugin/events.js +1 -1
- package/es/master-detail-plugin/types.d.ts +1 -1
- package/es/master-detail-plugin/types.js.map +1 -1
- package/es/rotate-table.d.ts +7 -6
- package/es/rotate-table.js +2 -3
- package/es/rotate-table.js.map +1 -1
- package/es/row-series.js +2 -1
- package/es/table-export/util/pagination.js.map +1 -1
- package/es/wps-fill-handle.d.ts +4 -2
- package/es/wps-fill-handle.js.map +1 -1
- package/package.json +10 -8
- package/cjs/auto-fill/__tests__/formula-integration.test.d.ts +0 -23
- package/cjs/auto-fill/__tests__/formula-integration.test.js +0 -61
- package/cjs/auto-fill/__tests__/formula-integration.test.js.map +0 -1
- package/es/auto-fill/__tests__/formula-integration.test.d.ts +0 -23
- package/es/auto-fill/__tests__/formula-integration.test.js +0 -54
- package/es/auto-fill/__tests__/formula-integration.test.js.map +0 -1
package/cjs/auto-fill/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { pluginsDefinition, ListTable, BaseTableAPI } from '@visactor/vtable';
|
|
2
|
-
import
|
|
2
|
+
import { TABLE_EVENT_TYPE } from '@visactor/vtable';
|
|
3
|
+
type TableEventType = typeof TABLE_EVENT_TYPE[keyof typeof TABLE_EVENT_TYPE];
|
|
3
4
|
export * from './formula-integration';
|
|
4
5
|
export * from './types';
|
|
5
6
|
export * from './rules';
|
|
@@ -19,5 +20,5 @@ export declare class AutoFillPlugin implements pluginsDefinition.IVTablePlugin {
|
|
|
19
20
|
constructor(options?: IAutoFillPluginOptions);
|
|
20
21
|
run(...args: [{
|
|
21
22
|
direction: string;
|
|
22
|
-
},
|
|
23
|
+
}, TableEventType | TableEventType[], BaseTableAPI]): void;
|
|
23
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auto-fill/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,6CAAoD;
|
|
1
|
+
{"version":3,"sources":["../src/auto-fill/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,6CAAoD;AAGpD,2DAAsD;AACtD,wDAAsC;AACtC,0CAAwB;AACxB,0CAAwB;AAkDxB,MAAa,cAAc;IAUzB,YAAY,OAAgC;QAT5C,OAAE,GAAG,WAAW,CAAC;QACjB,SAAI,GAAG,WAAW,CAAC;QACnB,YAAO,GAAG;YACR,yBAAgB,CAAC,qBAAqB;YACtC,yBAAgB,CAAC,oBAAoB;YACrC,yBAAgB,CAAC,oBAAoB;SACtC,CAAC;QAIA,IAAI,CAAC,eAAe,GAAG,IAAI,mCAAe,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IACD,GAAG,CAAC,GAAG,IAA8E;;QAEnF,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,yBAAgB,CAAC,qBAAqB,EAAE;YACtD,MAAM,CAAC,EAAC,AAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,KAAkB,CAAC;YAChC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,MAAA,IAAI,CAAC,KAAK,0CAAE,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9E;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,yBAAgB,CAAC,oBAAoB,EAAE;YAE5D,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAA,IAAI,CAAC,KAAK,0CAAE,qBAAqB,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;SACvF;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,yBAAgB,CAAC,oBAAoB,EAAE;YAC5D,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;SACtC;IACH,CAAC;CACF;AA5BD,wCA4BC","file":"index.js","sourcesContent":["import type { pluginsDefinition, ListTable, BaseTableAPI } from '@visactor/vtable';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\n// 从 TABLE_EVENT_TYPE 常量对象推导出事件值的联合类型,避免依赖 vtable 内部类型路径。\ntype TableEventType = typeof TABLE_EVENT_TYPE[keyof typeof TABLE_EVENT_TYPE];\nimport { AutoFillManager } from './auto-fill-manager';\nexport * from './formula-integration';\nexport * from './types';\nexport * from './rules';\n/**\n * 自动填充插件\n */\nexport interface IAutoFillPluginOptions {\n /**\n * 填充模式\n * 'copy': 复制填充\n * 'series': 序列填充\n * 不填写则开启自动填充菜单\n */\n fillMode?: 'copy' | 'series';\n /**\n * 快速填充模式\n * 'copy': 复制填充\n * 'series': 序列填充\n * 不填写则开启自动填充菜单\n */\n fastFillMode?: 'copy' | 'series';\n /**\n * 自定义公式检测函数\n * 用于判断单元格是否包含公式\n * @param col 列索引\n * @param row 行索引\n * @param cellData 单元格数据\n * @param table 表格实例\n * @returns 是否为公式\n */\n isFormulaCell?: (col: number, row: number, cellData: any, table: ListTable) => boolean;\n /**\n * 自定义公式获取函数\n * 用于获取单元格的公式字符串\n * @param col 列索引\n * @param row 行索引\n * @param cellData 单元格数据\n * @param table 表格实例\n * @returns 公式字符串,如果没有公式则返回undefined\n */\n getCellFormula?: (col: number, row: number, cellData: any, table: ListTable) => string | undefined;\n /**\n * 自定义公式设置函数\n * 用于设置单元格的公式\n * @param col 列索引\n * @param row 行索引\n * @param formula 公式字符串\n * @param table 表格实例\n */\n setCellFormula?: (col: number, row: number, formula: string, table: ListTable) => void;\n}\n\nexport class AutoFillPlugin implements pluginsDefinition.IVTablePlugin {\n id = `auto-fill`;\n name = 'Auto Fill';\n runTime = [\n TABLE_EVENT_TYPE.MOUSEDOWN_FILL_HANDLE,\n TABLE_EVENT_TYPE.DRAG_FILL_HANDLE_END,\n TABLE_EVENT_TYPE.DBLCLICK_FILL_HANDLE\n ];\n table: ListTable;\n private autoFillManager: AutoFillManager;\n constructor(options?: IAutoFillPluginOptions) {\n this.autoFillManager = new AutoFillManager(options);\n }\n run(...args: [{ direction: string }, TableEventType | TableEventType[], BaseTableAPI]) {\n // start drag\n if (args[1] === TABLE_EVENT_TYPE.MOUSEDOWN_FILL_HANDLE) {\n const [, , table] = args;\n this.table = table as ListTable;\n this.autoFillManager.setTable(this.table);\n this.autoFillManager.handleStartDrag(this.table?.getSelectedCellRanges()[0]);\n } else if (args[1] === TABLE_EVENT_TYPE.DRAG_FILL_HANDLE_END) {\n // end drag\n const [{ direction }] = args;\n this.autoFillManager.handleEndDrag(this.table?.getSelectedCellRanges()[0], direction);\n } else if (args[1] === TABLE_EVENT_TYPE.DBLCLICK_FILL_HANDLE) {\n this.autoFillManager.handleDbClick();\n }\n }\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export interface IConverter {
|
|
2
2
|
key: string;
|
|
3
|
-
detect(value: any)
|
|
4
|
-
toNumber(value: any)
|
|
3
|
+
detect: (value: any) => boolean;
|
|
4
|
+
toNumber: (value: any) => {
|
|
5
5
|
v: number;
|
|
6
6
|
meta?: any;
|
|
7
7
|
};
|
|
8
|
-
fromNumber(num: number, meta?: any)
|
|
8
|
+
fromNumber: (num: number, meta?: any) => any;
|
|
9
9
|
}
|
|
10
10
|
export declare class DateConverter implements IConverter {
|
|
11
11
|
key: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auto-fill/series-converters.ts"],"names":[],"mappings":";;;AAAA,uCAAiF;AAoBjF,MAAa,aAAa;IAA1B;QACE,QAAG,GAAG,MAAM,CAAC;QACL,aAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAGhC,gBAAW,GAAqB;YACtC,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,YAAY,EAAE;YACxD,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,UAAU,EAAE;YAC1D,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,YAAY,EAAE;YAC1D,EAAE,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAE,UAAU,EAAE;YAC5D,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,YAAY,EAAE;YAC1D;gBACE,OAAO,EAAE,6BAA6B;gBACtC,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;oBACzD,IAAI,CAAC,KAAK;
|
|
1
|
+
{"version":3,"sources":["../src/auto-fill/series-converters.ts"],"names":[],"mappings":"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","file":"series-converters.js","sourcesContent":["import { parse, isValid, differenceInDays, addDays, format } from './utils/date';\n\n// 通用转换器接口\nexport interface IConverter {\n key: string; // 转换器标识\n detect: (value: any) => boolean; // 检测值是否可被当前转换器处理\n toNumber: (value: any) => { v: number; meta?: any }; // 转换为数字\n fromNumber: (num: number, meta?: any) => any; // 从数字转换回来\n}\n\n// 日期格式规则\ninterface DateFormatRule {\n pattern: RegExp;\n format: string;\n parser?: (value: string) => Date;\n}\n\n/**\n * 日期转换器 - 实现IConverter接口\n */\nexport class DateConverter implements IConverter {\n key = 'date'; // 标识为日期转换器\n private baseDate = new Date(1900, 0, 1);\n\n // 日期格式规则\n private dateFormats: DateFormatRule[] = [\n { pattern: /^\\d{4}-\\d{2}-\\d{2}$/, format: 'yyyy-MM-dd' },\n { pattern: /^\\d{4}-\\d{1,2}-\\d{1,2}$/, format: 'yyyy-M-d' },\n { pattern: /^\\d{4}\\/\\d{2}\\/\\d{2}$/, format: 'yyyy/MM/dd' },\n { pattern: /^\\d{4}\\/\\d{1,2}\\/\\d{1,2}$/, format: 'yyyy/M/d' },\n { pattern: /^\\d{2}\\/\\d{2}\\/\\d{4}$/, format: 'MM/dd/yyyy' },\n {\n pattern: /^\\d{4}年\\d{1,2}月\\d{1,2}(日)?$/,\n format: 'yyyy年M月d日',\n parser: (value: string) => {\n const match = value.match(/(\\d{4})年(\\d{1,2})月(\\d{1,2})/);\n if (!match) {\n throw new Error('无效的中文日期格式');\n }\n return new Date(+match[1], +match[2] - 1, +match[3]);\n }\n }\n ];\n\n // 检测是否为日期\n detect(value: any): boolean {\n if (value instanceof Date) {\n return !isNaN(value.getTime());\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n const str = value.trim();\n const matchedFormat = this.dateFormats.find(rule => rule.pattern.test(str));\n\n if (matchedFormat) {\n try {\n const date = matchedFormat.parser ? matchedFormat.parser(str) : parse(str, matchedFormat.format, new Date());\n return isValid(date);\n } catch {\n return false;\n }\n }\n\n return false;\n }\n\n // 转换为数字(日偏移量)\n toNumber(value: Date | string): { v: number; meta?: string } {\n let date: Date;\n let formatMeta: string | undefined;\n\n if (value instanceof Date) {\n if (!isValid(value)) {\n throw new Error('无效的日期对象');\n }\n date = value;\n formatMeta = 'yyyy-MM-dd';\n } else {\n const str = value.trim();\n const matchedFormat = this.dateFormats.find(rule => rule.pattern.test(str));\n\n if (!matchedFormat) {\n throw new Error(`不支持的日期格式: ${str}`);\n }\n\n date = matchedFormat.parser ? matchedFormat.parser(str) : parse(str, matchedFormat.format, new Date());\n\n if (!isValid(date)) {\n throw new Error(`无效的日期值: ${str}`);\n }\n formatMeta = matchedFormat.format;\n }\n\n return {\n v: differenceInDays(date, this.baseDate),\n meta: formatMeta\n };\n }\n\n // 从数字转换回日期\n fromNumber(daysOffset: number, meta?: string): string {\n const targetDate = addDays(this.baseDate, daysOffset);\n targetDate.setHours(0, 0, 0, 0);\n\n return format(targetDate, meta || 'yyyy-MM-dd');\n }\n}\n\n/**\n * 转换器管理器 - 用于统一管理和获取转换器\n */\nexport class ConverterManager {\n private converters: IConverter[] = [];\n\n // 注册转换器\n register(converter: IConverter): void {\n this.converters.push(converter);\n }\n\n // 根据值自动获取合适的转换器\n getConverter(value: any): IConverter | null {\n return this.converters.find(converter => converter.detect(value)) || null;\n }\n\n // 根据key获取转换器\n getConverterByKey(key: string): IConverter | null {\n return this.converters.find(converter => converter.key === key) || null;\n }\n}\n\n// 初始化示例\nexport const converterManager = new ConverterManager();\nconverterManager.register(new DateConverter());\n"]}
|
package/cjs/contextmenu/index.js
CHANGED
|
@@ -18,4 +18,5 @@ var __createBinding = this && this.__createBinding || (Object.create ? function(
|
|
|
18
18
|
Object.defineProperty(exports, "__esModule", {
|
|
19
19
|
value: !0
|
|
20
20
|
}), __exportStar(require("./menu-manager"), exports), __exportStar(require("./styles"), exports),
|
|
21
|
-
__exportStar(require("./types"), exports);
|
|
21
|
+
__exportStar(require("./types"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ListTable, BaseTableAPI, pluginsDefinition } from '@visactor/vtable';
|
|
2
|
-
import
|
|
2
|
+
import { TABLE_EVENT_TYPE } from '@visactor/vtable';
|
|
3
|
+
type TableEventType = typeof TABLE_EVENT_TYPE[keyof typeof TABLE_EVENT_TYPE];
|
|
3
4
|
import type { EventArg } from './types';
|
|
4
5
|
export declare enum ExcelEditCellKeyboardResponse {
|
|
5
6
|
ENTER = "enter",
|
|
@@ -26,7 +27,7 @@ export declare class ExcelEditCellKeyboardPlugin implements pluginsDefinition.IV
|
|
|
26
27
|
responseKeyboard: ExcelEditCellKeyboardResponse[];
|
|
27
28
|
batchCallChangeCellValuesApi: boolean;
|
|
28
29
|
constructor(pluginOptions?: IExcelEditCellKeyboardPluginOptions);
|
|
29
|
-
run(...args: [EventArg,
|
|
30
|
+
run(...args: [EventArg, TableEventType | TableEventType[], BaseTableAPI]): void;
|
|
30
31
|
bindEvent(): void;
|
|
31
32
|
handleKeyDown(event: KeyboardEvent): void;
|
|
32
33
|
isExcelShortcutKey(event: KeyboardEvent): boolean;
|
|
@@ -35,3 +36,4 @@ export declare class ExcelEditCellKeyboardPlugin implements pluginsDefinition.IV
|
|
|
35
36
|
addResponseKeyboard(responseKeyboard: ExcelEditCellKeyboardResponse[]): void;
|
|
36
37
|
release(): void;
|
|
37
38
|
}
|
|
39
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/excel-edit-cell-keyboard.ts"],"names":[],"mappings":"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","file":"excel-edit-cell-keyboard.js","sourcesContent":["import type { ListTable, BaseTableAPI, TYPES, pluginsDefinition } from '@visactor/vtable';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nimport type { TableEvents } from '@visactor/vtable/src/core/TABLE_EVENT_TYPE';\nimport type { EventArg } from './types';\nimport type { IEditor } from '@visactor/vtable-editors';\nexport enum ExcelEditCellKeyboardResponse {\n ENTER = 'enter',\n TAB = 'tab',\n ARROW_LEFT = 'arrowLeft',\n ARROW_RIGHT = 'arrowRight',\n ARROW_DOWN = 'arrowDown',\n ARROW_UP = 'arrowUp',\n DELETE = 'delete',\n BACKSPACE = 'backspace'\n}\n//备用 插件配置项 目前感觉都走默认逻辑就行\nexport type IExcelEditCellKeyboardPluginOptions = {\n id?: string;\n /** 该插件响应的键盘事件列表 */\n responseKeyboard?: ExcelEditCellKeyboardResponse[];\n /** 删除能力是否只应用到可编辑单元格 */\n deleteWorkOnEditableCell?: boolean;\n /** 删除范围时通过 changeCellValuesByRanges 批量更新,从而聚合成一次 change_cell_values 事件 */\n batchCallChangeCellValuesApi?: boolean;\n // keyDown_before?: (event: KeyboardEvent) => void;\n // keyDown_after?: (event: KeyboardEvent) => void;\n};\n\nexport class ExcelEditCellKeyboardPlugin implements pluginsDefinition.IVTablePlugin {\n id = `excel-edit-cell-keyboard`;\n name = 'Excel Edit Cell Keyboard';\n runTime = [TABLE_EVENT_TYPE.INITIALIZED];\n table: ListTable;\n pluginOptions: IExcelEditCellKeyboardPluginOptions;\n responseKeyboard: ExcelEditCellKeyboardResponse[];\n batchCallChangeCellValuesApi: boolean;\n constructor(pluginOptions?: IExcelEditCellKeyboardPluginOptions) {\n this.id = pluginOptions?.id ?? this.id;\n this.pluginOptions = pluginOptions;\n this.responseKeyboard = pluginOptions?.responseKeyboard ?? [\n ExcelEditCellKeyboardResponse.ENTER,\n ExcelEditCellKeyboardResponse.TAB,\n ExcelEditCellKeyboardResponse.ARROW_LEFT,\n ExcelEditCellKeyboardResponse.ARROW_RIGHT,\n ExcelEditCellKeyboardResponse.ARROW_DOWN,\n ExcelEditCellKeyboardResponse.ARROW_UP,\n ExcelEditCellKeyboardResponse.DELETE,\n ExcelEditCellKeyboardResponse.BACKSPACE\n ];\n\n this.batchCallChangeCellValuesApi = pluginOptions?.batchCallChangeCellValuesApi ?? false;\n\n this.bindEvent();\n }\n run(...args: [EventArg, TableEvents[keyof TableEvents] | TableEvents[keyof TableEvents][], BaseTableAPI]) {\n const table: BaseTableAPI = args[2];\n this.table = table as ListTable;\n }\n\n bindEvent() {\n //监听document全局的keydown事件 捕获阶段监听 可以及时阻止事件传播和默认行为\n document.addEventListener('keydown', this.handleKeyDown.bind(this), true);\n // this.table.on('selected_cell', () => {\n // this.updateHighlight();\n // });\n\n // this.table.on('selected_clear', () => {\n // this.clearHighlight();\n // });\n\n // this.table.on('mousemove_table', () => {\n // if (this.table.stateManager.select.selecting) {\n // this.updateHighlight();\n // }\n // });\n }\n handleKeyDown(event: KeyboardEvent) {\n // this.pluginOptions?.keyDown_before?.(event);\n if (this.table?.editorManager && this.isExcelShortcutKey(event)) {\n const eventKey = event.key.toLowerCase() as ExcelEditCellKeyboardResponse;\n //判断是键盘触发编辑单元格的情况下,那么在编辑状态中切换方向需要选中下一个继续编辑\n if (this.table.editorManager.editingEditor && this.table.editorManager.beginTriggerEditCellMode === 'keydown') {\n const { col, row } = this.table.editorManager.editCell;\n if (eventKey !== ExcelEditCellKeyboardResponse.BACKSPACE && eventKey !== ExcelEditCellKeyboardResponse.DELETE) {\n this.table.editorManager.completeEdit();\n } else {\n //如果输入了删除或退格键,应正常删除输入框内容\n return;\n }\n this.table.getElement().focus();\n if (!event.shiftKey && !event.ctrlKey && !event.metaKey) {\n //有这些配合键,则不进行选中下一个单元格的行为 执行vtable内部逻辑\n if (eventKey === ExcelEditCellKeyboardResponse.ENTER) {\n this.table.selectCell(col, row + 1);\n } else if (eventKey === ExcelEditCellKeyboardResponse.TAB) {\n this.table.selectCell(col + 1, row);\n } else if (eventKey === ExcelEditCellKeyboardResponse.ARROW_LEFT) {\n this.table.selectCell(col - 1, row);\n } else if (eventKey === ExcelEditCellKeyboardResponse.ARROW_RIGHT) {\n this.table.selectCell(col + 1, row);\n } else if (eventKey === ExcelEditCellKeyboardResponse.ARROW_DOWN) {\n this.table.selectCell(col, row + 1);\n } else if (eventKey === ExcelEditCellKeyboardResponse.ARROW_UP) {\n this.table.selectCell(col, row - 1);\n }\n // 阻止事件传播和默认行为\n event.stopPropagation();\n event.preventDefault();\n }\n } else {\n const { col, row } = this.table.stateManager.select.cellPos;\n if (\n this.table.editorManager.editingEditor &&\n (eventKey === ExcelEditCellKeyboardResponse.ENTER || eventKey === ExcelEditCellKeyboardResponse.TAB)\n ) {\n this.table.editorManager.completeEdit();\n this.table.getElement().focus();\n if (eventKey === ExcelEditCellKeyboardResponse.ENTER) {\n this.table.selectCell(col, row + 1);\n } else if (eventKey === ExcelEditCellKeyboardResponse.TAB) {\n this.table.selectCell(col + 1, row);\n }\n // 阻止事件传播和默认行为\n event.stopPropagation();\n event.preventDefault();\n } else if (\n !this.table.editorManager.editingEditor &&\n (eventKey === ExcelEditCellKeyboardResponse.DELETE || eventKey === ExcelEditCellKeyboardResponse.BACKSPACE)\n ) {\n //响应删除键,删除\n const selectCells = this.table.getSelectedCellInfos();\n if (\n selectCells?.length > 0 &&\n (document.activeElement === this.table.getElement() ||\n Object.values(this.table.editorManager.cacheLastSelectedCellEditor || {}).some(\n // 处理情况:没有开始编辑但编辑器及编辑输入框已经存在的情况下(editCellTrigger为keydown)判断当前激活的是cacheLastSelectedCellEditor中的input也应该响应删除单元格\n (editor: IEditor) => editor.getInputElement?.() === document.activeElement\n ))\n ) {\n // 如果选中的是范围,则删除范围内的所有单元格\n deleteSelectRange(\n selectCells,\n this.table,\n this.pluginOptions?.deleteWorkOnEditableCell ?? true,\n this.batchCallChangeCellValuesApi\n );\n // 阻止事件传播和默认行为\n event.stopPropagation();\n event.preventDefault();\n }\n }\n }\n }\n // this.pluginOptions?.keyDown_after?.apply(this, [event]);\n }\n // 判断event的keyCode是否是excel的快捷键\n isExcelShortcutKey(event: KeyboardEvent) {\n return this.responseKeyboard.includes(event.key.toLowerCase() as ExcelEditCellKeyboardResponse);\n }\n setResponseKeyboard(responseKeyboard: ExcelEditCellKeyboardResponse[]) {\n this.responseKeyboard = responseKeyboard;\n }\n deleteResponseKeyboard(responseKeyboard: ExcelEditCellKeyboardResponse[]) {\n this.responseKeyboard = this.responseKeyboard.filter(key => !responseKeyboard.includes(key));\n }\n addResponseKeyboard(responseKeyboard: ExcelEditCellKeyboardResponse[]) {\n this.responseKeyboard = [...this.responseKeyboard, ...responseKeyboard];\n }\n release() {\n document.removeEventListener('keydown', this.handleKeyDown, true);\n }\n}\n//将选中单元格的值设置为空\nfunction deleteSelectRange(\n selectCells: TYPES.CellInfo[][],\n tableInstance: ListTable,\n workOnEditableCell: boolean = false,\n batchCallChangeCellValuesApi: boolean = false\n) {\n if (batchCallChangeCellValuesApi) {\n const ranges = tableInstance.stateManager.select.ranges;\n if (ranges?.length) {\n tableInstance.changeCellValuesByRanges(ranges, '', workOnEditableCell, true);\n }\n return;\n }\n\n for (let i = 0; i < selectCells.length; i++) {\n for (let j = 0; j < selectCells[i].length; j++) {\n tableInstance.changeCellValue(selectCells[i][j].col, selectCells[i][j].row, '', workOnEditableCell);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/excel-edit-cell-keyboard.ts"],"names":[],"mappings":"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","file":"excel-edit-cell-keyboard.js","sourcesContent":["import type { ListTable, BaseTableAPI, TYPES, pluginsDefinition } from '@visactor/vtable';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\n// 从 TABLE_EVENT_TYPE 常量对象推导出事件值的联合类型,避免依赖 vtable 内部类型路径。\ntype TableEventType = typeof TABLE_EVENT_TYPE[keyof typeof TABLE_EVENT_TYPE];\nimport type { EventArg } from './types';\nimport type { IEditor } from '@visactor/vtable-editors';\nexport enum ExcelEditCellKeyboardResponse {\n ENTER = 'enter',\n TAB = 'tab',\n ARROW_LEFT = 'arrowLeft',\n ARROW_RIGHT = 'arrowRight',\n ARROW_DOWN = 'arrowDown',\n ARROW_UP = 'arrowUp',\n DELETE = 'delete',\n BACKSPACE = 'backspace'\n}\n//备用 插件配置项 目前感觉都走默认逻辑就行\nexport type IExcelEditCellKeyboardPluginOptions = {\n id?: string;\n /** 该插件响应的键盘事件列表 */\n responseKeyboard?: ExcelEditCellKeyboardResponse[];\n /** 删除能力是否只应用到可编辑单元格 */\n deleteWorkOnEditableCell?: boolean;\n /** 删除范围时通过 changeCellValuesByRanges 批量更新,从而聚合成一次 change_cell_values 事件 */\n batchCallChangeCellValuesApi?: boolean;\n // keyDown_before?: (event: KeyboardEvent) => void;\n // keyDown_after?: (event: KeyboardEvent) => void;\n};\n\nexport class ExcelEditCellKeyboardPlugin implements pluginsDefinition.IVTablePlugin {\n id = `excel-edit-cell-keyboard`;\n name = 'Excel Edit Cell Keyboard';\n runTime = [TABLE_EVENT_TYPE.INITIALIZED];\n table: ListTable;\n pluginOptions: IExcelEditCellKeyboardPluginOptions;\n responseKeyboard: ExcelEditCellKeyboardResponse[];\n batchCallChangeCellValuesApi: boolean;\n constructor(pluginOptions?: IExcelEditCellKeyboardPluginOptions) {\n this.id = pluginOptions?.id ?? this.id;\n this.pluginOptions = pluginOptions;\n this.responseKeyboard = pluginOptions?.responseKeyboard ?? [\n ExcelEditCellKeyboardResponse.ENTER,\n ExcelEditCellKeyboardResponse.TAB,\n ExcelEditCellKeyboardResponse.ARROW_LEFT,\n ExcelEditCellKeyboardResponse.ARROW_RIGHT,\n ExcelEditCellKeyboardResponse.ARROW_DOWN,\n ExcelEditCellKeyboardResponse.ARROW_UP,\n ExcelEditCellKeyboardResponse.DELETE,\n ExcelEditCellKeyboardResponse.BACKSPACE\n ];\n\n this.batchCallChangeCellValuesApi = pluginOptions?.batchCallChangeCellValuesApi ?? false;\n\n this.bindEvent();\n }\n run(...args: [EventArg, TableEventType | TableEventType[], BaseTableAPI]) {\n const table: BaseTableAPI = args[2];\n this.table = table as ListTable;\n }\n\n bindEvent() {\n //监听document全局的keydown事件 捕获阶段监听 可以及时阻止事件传播和默认行为\n document.addEventListener('keydown', this.handleKeyDown.bind(this), true);\n // this.table.on('selected_cell', () => {\n // this.updateHighlight();\n // });\n\n // this.table.on('selected_clear', () => {\n // this.clearHighlight();\n // });\n\n // this.table.on('mousemove_table', () => {\n // if (this.table.stateManager.select.selecting) {\n // this.updateHighlight();\n // }\n // });\n }\n handleKeyDown(event: KeyboardEvent) {\n // this.pluginOptions?.keyDown_before?.(event);\n if (this.table?.editorManager && this.isExcelShortcutKey(event)) {\n const eventKey = event.key.toLowerCase() as ExcelEditCellKeyboardResponse;\n //判断是键盘触发编辑单元格的情况下,那么在编辑状态中切换方向需要选中下一个继续编辑\n if (this.table.editorManager.editingEditor && this.table.editorManager.beginTriggerEditCellMode === 'keydown') {\n const { col, row } = this.table.editorManager.editCell;\n if (eventKey !== ExcelEditCellKeyboardResponse.BACKSPACE && eventKey !== ExcelEditCellKeyboardResponse.DELETE) {\n this.table.editorManager.completeEdit();\n } else {\n //如果输入了删除或退格键,应正常删除输入框内容\n return;\n }\n this.table.getElement().focus();\n if (!event.shiftKey && !event.ctrlKey && !event.metaKey) {\n //有这些配合键,则不进行选中下一个单元格的行为 执行vtable内部逻辑\n if (eventKey === ExcelEditCellKeyboardResponse.ENTER) {\n this.table.selectCell(col, row + 1);\n } else if (eventKey === ExcelEditCellKeyboardResponse.TAB) {\n this.table.selectCell(col + 1, row);\n } else if (eventKey === ExcelEditCellKeyboardResponse.ARROW_LEFT) {\n this.table.selectCell(col - 1, row);\n } else if (eventKey === ExcelEditCellKeyboardResponse.ARROW_RIGHT) {\n this.table.selectCell(col + 1, row);\n } else if (eventKey === ExcelEditCellKeyboardResponse.ARROW_DOWN) {\n this.table.selectCell(col, row + 1);\n } else if (eventKey === ExcelEditCellKeyboardResponse.ARROW_UP) {\n this.table.selectCell(col, row - 1);\n }\n // 阻止事件传播和默认行为\n event.stopPropagation();\n event.preventDefault();\n }\n } else {\n const { col, row } = this.table.stateManager.select.cellPos;\n if (\n this.table.editorManager.editingEditor &&\n (eventKey === ExcelEditCellKeyboardResponse.ENTER || eventKey === ExcelEditCellKeyboardResponse.TAB)\n ) {\n this.table.editorManager.completeEdit();\n this.table.getElement().focus();\n if (eventKey === ExcelEditCellKeyboardResponse.ENTER) {\n this.table.selectCell(col, row + 1);\n } else if (eventKey === ExcelEditCellKeyboardResponse.TAB) {\n this.table.selectCell(col + 1, row);\n }\n // 阻止事件传播和默认行为\n event.stopPropagation();\n event.preventDefault();\n } else if (\n !this.table.editorManager.editingEditor &&\n (eventKey === ExcelEditCellKeyboardResponse.DELETE || eventKey === ExcelEditCellKeyboardResponse.BACKSPACE)\n ) {\n //响应删除键,删除\n const selectCells = this.table.getSelectedCellInfos();\n if (\n selectCells?.length > 0 &&\n (document.activeElement === this.table.getElement() ||\n Object.values(this.table.editorManager.cacheLastSelectedCellEditor || {}).some(\n // 处理情况:没有开始编辑但编辑器及编辑输入框已经存在的情况下(editCellTrigger为keydown)判断当前激活的是cacheLastSelectedCellEditor中的input也应该响应删除单元格\n (editor: IEditor) => editor.getInputElement?.() === document.activeElement\n ))\n ) {\n // 如果选中的是范围,则删除范围内的所有单元格\n deleteSelectRange(\n selectCells,\n this.table,\n this.pluginOptions?.deleteWorkOnEditableCell ?? true,\n this.batchCallChangeCellValuesApi\n );\n // 阻止事件传播和默认行为\n event.stopPropagation();\n event.preventDefault();\n }\n }\n }\n }\n // this.pluginOptions?.keyDown_after?.apply(this, [event]);\n }\n // 判断event的keyCode是否是excel的快捷键\n isExcelShortcutKey(event: KeyboardEvent) {\n return this.responseKeyboard.includes(event.key.toLowerCase() as ExcelEditCellKeyboardResponse);\n }\n setResponseKeyboard(responseKeyboard: ExcelEditCellKeyboardResponse[]) {\n this.responseKeyboard = responseKeyboard;\n }\n deleteResponseKeyboard(responseKeyboard: ExcelEditCellKeyboardResponse[]) {\n this.responseKeyboard = this.responseKeyboard.filter(key => !responseKeyboard.includes(key));\n }\n addResponseKeyboard(responseKeyboard: ExcelEditCellKeyboardResponse[]) {\n this.responseKeyboard = [...this.responseKeyboard, ...responseKeyboard];\n }\n release() {\n document.removeEventListener('keydown', this.handleKeyDown, true);\n }\n}\n//将选中单元格的值设置为空\nfunction deleteSelectRange(\n selectCells: TYPES.CellInfo[][],\n tableInstance: ListTable,\n workOnEditableCell: boolean = false,\n batchCallChangeCellValuesApi: boolean = false\n) {\n if (batchCallChangeCellValuesApi) {\n const ranges = tableInstance.stateManager.select.ranges;\n if (ranges?.length) {\n tableInstance.changeCellValuesByRanges(ranges, '', workOnEditableCell, true);\n }\n return;\n }\n\n for (let i = 0; i < selectCells.length; i++) {\n for (let j = 0; j < selectCells[i].length; j++) {\n tableInstance.changeCellValue(selectCells[i][j].col, selectCells[i][j].row, '', workOnEditableCell);\n }\n }\n}\n"]}
|
|
@@ -24,7 +24,11 @@ class FilterEngine {
|
|
|
24
24
|
}
|
|
25
25
|
})), table.updateFilterRules([ ...this.filterFuncRule, ...this.filterValueRule ], {
|
|
26
26
|
clearRowHeightCache: !1,
|
|
27
|
-
onFilterRecordsEnd: null === (_a = this.pluginOptions) || void 0 === _a ? void 0 : _a.onFilterRecordsEnd
|
|
27
|
+
onFilterRecordsEnd: (null === (_a = this.pluginOptions) || void 0 === _a ? void 0 : _a.onFilterRecordsEnd) ? records => {
|
|
28
|
+
var _a, _b;
|
|
29
|
+
return null === (_b = (_a = this.pluginOptions).onFilterRecordsEnd) || void 0 === _b || _b.call(_a, records),
|
|
30
|
+
records;
|
|
31
|
+
} : void 0
|
|
28
32
|
});
|
|
29
33
|
}
|
|
30
34
|
createFilterFunction(filter) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filter/filter-engine.ts"],"names":[],"mappings":"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","file":"filter-engine.js","sourcesContent":["import type { ListTable, PivotTable, TYPES } from '@visactor/vtable';\nimport type { FilterState, FilterConfig, FilterOptions } from './types';\n\n/**\n * 筛选引擎,用于进行实际的筛选操作\n */\nexport class FilterEngine {\n filterFuncRule: (TYPES.FilterFuncRule & { fieldId?: string })[] = [];\n filterValueRule: TYPES.FilterValueRule[] = [];\n\n private pluginOptions: FilterOptions;\n\n constructor(filterPluginOptions: FilterOptions) {\n this.pluginOptions = filterPluginOptions;\n }\n\n applyFilter(state: FilterState, table: ListTable | PivotTable) {\n const { filters } = state;\n this.filterFuncRule = [];\n this.filterValueRule = [];\n\n filters.forEach((filter, field) => {\n if (!filter.enable) {\n return;\n }\n\n if (filter.type === 'byValue') {\n this.filterValueRule.push({\n filterKey: String(filter.field),\n filteredValues: filter.values\n });\n } else if (filter.type === 'byCondition') {\n // 为条件筛选生成过滤函数\n const filterFunc = this.createFilterFunction(filter);\n this.filterFuncRule.push({\n filterFunc,\n fieldId: String(filter.field)\n });\n }\n });\n\n table.updateFilterRules([...this.filterFuncRule, ...this.filterValueRule], {\n clearRowHeightCache: false,\n onFilterRecordsEnd: this.pluginOptions?.onFilterRecordsEnd\n });\n }\n\n /**\n * 根据筛选配置创建筛选函数\n */\n private createFilterFunction(filter: FilterConfig): (record: any) => boolean {\n const { field, operator, condition } = filter;\n\n // 如果没有操作符或条件,返回一个总是通过的函数\n if (!operator || condition === undefined) {\n return () => true;\n }\n\n return (record: any) => {\n const value = record[field];\n\n if (value === null || value === undefined) {\n return false;\n }\n\n // 根据操作符生成对应的比较逻辑\n switch (operator) {\n case 'equals':\n return this.compareValues(value, condition) === 0;\n case 'notEquals':\n return this.compareValues(value, condition) !== 0;\n case 'greaterThan':\n return this.compareValues(value, condition) > 0;\n case 'lessThan':\n return this.compareValues(value, condition) < 0;\n case 'greaterThanOrEqual':\n return this.compareValues(value, condition) >= 0;\n case 'lessThanOrEqual':\n return this.compareValues(value, condition) <= 0;\n case 'between':\n // 范围条件需要是数组形式 [min, max]\n if (Array.isArray(condition) && condition.length === 2) {\n return this.compareValues(value, condition[0]) >= 0 && this.compareValues(value, condition[1]) <= 0;\n }\n return true;\n case 'notBetween':\n // 范围条件需要是数组形式 [min, max]\n if (Array.isArray(condition) && condition.length === 2) {\n return this.compareValues(value, condition[0]) < 0 || this.compareValues(value, condition[1]) > 0;\n }\n return true;\n case 'contains':\n return String(value).toLowerCase().includes(String(condition).toLowerCase());\n case 'notContains':\n return !String(value).toLowerCase().includes(String(condition).toLowerCase());\n case 'startsWith':\n return String(value).toLowerCase().startsWith(String(condition).toLowerCase());\n case 'notStartsWith':\n return !String(value).toLowerCase().startsWith(String(condition).toLowerCase());\n case 'endsWith':\n return String(value).toLowerCase().endsWith(String(condition).toLowerCase());\n case 'notEndsWith':\n return !String(value).toLowerCase().endsWith(String(condition).toLowerCase());\n case 'isChecked':\n return Boolean(value) === true;\n case 'isUnchecked':\n return Boolean(value) === false;\n default:\n return true;\n }\n };\n }\n\n /**\n * 比较两个值\n * 返回: -1 (value < condition), 0 (value === condition), 1 (value > condition)\n */\n private compareValues(value: any, condition: any): number {\n if (typeof value === 'number' && typeof condition === 'number') {\n return value === condition ? 0 : value > condition ? 1 : -1;\n }\n\n if (typeof value === 'boolean' && typeof condition === 'boolean') {\n return value === condition ? 0 : -1;\n }\n\n // 进入字符串比较\n const valueStr = String(value).toLowerCase();\n const conditionStr = String(condition).toLowerCase();\n\n // 如果两个字符串都能正确转换成数字, 则仍然按数字比较\n if (!isNaN(Number(valueStr)) && !isNaN(Number(conditionStr))) {\n return Number(valueStr) === Number(conditionStr) ? 0 : Number(valueStr) > Number(conditionStr) ? 1 : -1;\n }\n return valueStr === conditionStr ? 0 : valueStr > conditionStr ? 1 : -1;\n }\n\n clearAllFilter(table: ListTable | PivotTable) {\n this.filterFuncRule = [];\n this.filterValueRule = [];\n table.updateFilterRules([]);\n }\n\n clearFilter(table: ListTable | PivotTable, fieldId: string | number) {\n this.filterValueRule = this.filterValueRule.filter(rule => rule.filterKey !== fieldId);\n this.filterFuncRule = this.filterFuncRule.filter(rule => rule.fieldId !== fieldId);\n\n table.updateFilterRules([...this.filterFuncRule, ...this.filterValueRule]);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/filter/filter-engine.ts"],"names":[],"mappings":"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","file":"filter-engine.js","sourcesContent":["import type { ListTable, PivotTable, TYPES } from '@visactor/vtable';\nimport type { FilterState, FilterConfig, FilterOptions } from './types';\n\n/**\n * 筛选引擎,用于进行实际的筛选操作\n */\nexport class FilterEngine {\n filterFuncRule: (TYPES.FilterFuncRule & { fieldId?: string })[] = [];\n filterValueRule: TYPES.FilterValueRule[] = [];\n\n private pluginOptions: FilterOptions;\n\n constructor(filterPluginOptions: FilterOptions) {\n this.pluginOptions = filterPluginOptions;\n }\n\n applyFilter(state: FilterState, table: ListTable | PivotTable) {\n const { filters } = state;\n this.filterFuncRule = [];\n this.filterValueRule = [];\n\n filters.forEach((filter, field) => {\n if (!filter.enable) {\n return;\n }\n\n if (filter.type === 'byValue') {\n this.filterValueRule.push({\n filterKey: String(filter.field),\n filteredValues: filter.values\n });\n } else if (filter.type === 'byCondition') {\n // 为条件筛选生成过滤函数\n const filterFunc = this.createFilterFunction(filter);\n this.filterFuncRule.push({\n filterFunc,\n fieldId: String(filter.field)\n });\n }\n });\n\n table.updateFilterRules([...this.filterFuncRule, ...this.filterValueRule], {\n clearRowHeightCache: false,\n onFilterRecordsEnd: this.pluginOptions?.onFilterRecordsEnd\n ? (records: any[]) => {\n this.pluginOptions.onFilterRecordsEnd?.(records);\n return records;\n }\n : undefined\n } as any);\n }\n\n /**\n * 根据筛选配置创建筛选函数\n */\n private createFilterFunction(filter: FilterConfig): (record: any) => boolean {\n const { field, operator, condition } = filter;\n\n // 如果没有操作符或条件,返回一个总是通过的函数\n if (!operator || condition === undefined) {\n return () => true;\n }\n\n return (record: any) => {\n const value = record[field];\n\n if (value === null || value === undefined) {\n return false;\n }\n\n // 根据操作符生成对应的比较逻辑\n switch (operator) {\n case 'equals':\n return this.compareValues(value, condition) === 0;\n case 'notEquals':\n return this.compareValues(value, condition) !== 0;\n case 'greaterThan':\n return this.compareValues(value, condition) > 0;\n case 'lessThan':\n return this.compareValues(value, condition) < 0;\n case 'greaterThanOrEqual':\n return this.compareValues(value, condition) >= 0;\n case 'lessThanOrEqual':\n return this.compareValues(value, condition) <= 0;\n case 'between':\n // 范围条件需要是数组形式 [min, max]\n if (Array.isArray(condition) && condition.length === 2) {\n return this.compareValues(value, condition[0]) >= 0 && this.compareValues(value, condition[1]) <= 0;\n }\n return true;\n case 'notBetween':\n // 范围条件需要是数组形式 [min, max]\n if (Array.isArray(condition) && condition.length === 2) {\n return this.compareValues(value, condition[0]) < 0 || this.compareValues(value, condition[1]) > 0;\n }\n return true;\n case 'contains':\n return String(value).toLowerCase().includes(String(condition).toLowerCase());\n case 'notContains':\n return !String(value).toLowerCase().includes(String(condition).toLowerCase());\n case 'startsWith':\n return String(value).toLowerCase().startsWith(String(condition).toLowerCase());\n case 'notStartsWith':\n return !String(value).toLowerCase().startsWith(String(condition).toLowerCase());\n case 'endsWith':\n return String(value).toLowerCase().endsWith(String(condition).toLowerCase());\n case 'notEndsWith':\n return !String(value).toLowerCase().endsWith(String(condition).toLowerCase());\n case 'isChecked':\n return Boolean(value) === true;\n case 'isUnchecked':\n return Boolean(value) === false;\n default:\n return true;\n }\n };\n }\n\n /**\n * 比较两个值\n * 返回: -1 (value < condition), 0 (value === condition), 1 (value > condition)\n */\n private compareValues(value: any, condition: any): number {\n if (typeof value === 'number' && typeof condition === 'number') {\n return value === condition ? 0 : value > condition ? 1 : -1;\n }\n\n if (typeof value === 'boolean' && typeof condition === 'boolean') {\n return value === condition ? 0 : -1;\n }\n\n // 进入字符串比较\n const valueStr = String(value).toLowerCase();\n const conditionStr = String(condition).toLowerCase();\n\n // 如果两个字符串都能正确转换成数字, 则仍然按数字比较\n if (!isNaN(Number(valueStr)) && !isNaN(Number(conditionStr))) {\n return Number(valueStr) === Number(conditionStr) ? 0 : Number(valueStr) > Number(conditionStr) ? 1 : -1;\n }\n return valueStr === conditionStr ? 0 : valueStr > conditionStr ? 1 : -1;\n }\n\n clearAllFilter(table: ListTable | PivotTable) {\n this.filterFuncRule = [];\n this.filterValueRule = [];\n table.updateFilterRules([]);\n }\n\n clearFilter(table: ListTable | PivotTable, fieldId: string | number) {\n this.filterValueRule = this.filterValueRule.filter(rule => rule.filterKey !== fieldId);\n this.filterFuncRule = this.filterFuncRule.filter(rule => rule.fieldId !== fieldId);\n\n table.updateFilterRules([...this.filterFuncRule, ...this.filterValueRule]);\n }\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ListTable, PivotTable } from '@visactor/vtable';
|
|
2
|
-
import type { FilterState, FilterAction, FilterConfig, FilterListener } from './types';
|
|
2
|
+
import type { FilterState, FilterAction, FilterConfig, FilterListener, FilterStateSnapshot } from './types';
|
|
3
|
+
import { FilterActionType } from './types';
|
|
3
4
|
import type { FilterEngine } from './filter-engine';
|
|
4
5
|
export declare class FilterStateManager {
|
|
5
6
|
private state;
|
|
@@ -10,6 +11,10 @@ export declare class FilterStateManager {
|
|
|
10
11
|
getFilterState(fieldId?: string | number): FilterConfig;
|
|
11
12
|
getActiveFilterFields(): (string | number)[];
|
|
12
13
|
getAllFilterStates(): FilterState;
|
|
14
|
+
getSnapshot(): FilterStateSnapshot;
|
|
15
|
+
applySnapshot(snapshot: FilterStateSnapshot, actionType?: FilterActionType): void;
|
|
16
|
+
shiftFieldsOnAddColumns(columnIndex: number, columnCount: number): void;
|
|
17
|
+
shiftFieldsOnDeleteColumns(deleteColIndexs: number[]): void;
|
|
13
18
|
reapplyCurrentFilters(): void;
|
|
14
19
|
dispatch(action: FilterAction): void;
|
|
15
20
|
subscribe(listener: FilterListener): () => void;
|
|
@@ -24,6 +24,87 @@ class FilterStateManager {
|
|
|
24
24
|
getAllFilterStates() {
|
|
25
25
|
return this.state;
|
|
26
26
|
}
|
|
27
|
+
getSnapshot() {
|
|
28
|
+
const filters = [];
|
|
29
|
+
return this.state.filters.forEach((v => {
|
|
30
|
+
const next = Object.assign({}, v);
|
|
31
|
+
next && "byValue" === next.type && Array.isArray(next.values) && (next.values = next.values.slice().sort(((a, b) => String(a).localeCompare(String(b))))),
|
|
32
|
+
next && Array.isArray(next.condition) && next.condition.length > 2 && (next.condition = next.condition.slice()),
|
|
33
|
+
filters.push(next);
|
|
34
|
+
})), filters.sort(((a, b) => String(a.field).localeCompare(String(b.field)))), {
|
|
35
|
+
filters: filters
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
applySnapshot(snapshot, actionType = types_1.FilterActionType.APPLY_FILTERS) {
|
|
39
|
+
var _a;
|
|
40
|
+
const next = new Map;
|
|
41
|
+
(null !== (_a = null == snapshot ? void 0 : snapshot.filters) && void 0 !== _a ? _a : []).forEach((cfg => {
|
|
42
|
+
if (!cfg) return;
|
|
43
|
+
const cloned = Object.assign({}, cfg);
|
|
44
|
+
cloned && "byValue" === cloned.type && Array.isArray(cloned.values) && (cloned.values = cloned.values.slice()),
|
|
45
|
+
cloned && Array.isArray(cloned.condition) && (cloned.condition = cloned.condition.slice()),
|
|
46
|
+
next.set(cloned.field, cloned);
|
|
47
|
+
})), this.state = Object.assign(Object.assign({}, this.state), {
|
|
48
|
+
filters: next
|
|
49
|
+
}), this.applyFilters(), this.notifyListeners({
|
|
50
|
+
type: actionType,
|
|
51
|
+
payload: {
|
|
52
|
+
fromSnapshot: !0
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
shiftFieldsOnAddColumns(columnIndex, columnCount) {
|
|
57
|
+
if (!Number.isFinite(columnIndex) || !Number.isFinite(columnCount) || columnCount <= 0) return;
|
|
58
|
+
const next = new Map;
|
|
59
|
+
this.state.filters.forEach(((cfg, key) => {
|
|
60
|
+
let newKey = key;
|
|
61
|
+
const cloned = Object.assign({}, cfg);
|
|
62
|
+
"number" == typeof newKey && newKey >= columnIndex && (newKey += columnCount), "number" == typeof cloned.field && cloned.field >= columnIndex && (cloned.field = cloned.field + columnCount),
|
|
63
|
+
cloned && "byValue" === cloned.type && Array.isArray(cloned.values) && (cloned.values = cloned.values.slice()),
|
|
64
|
+
cloned && Array.isArray(cloned.condition) && (cloned.condition = cloned.condition.slice()),
|
|
65
|
+
next.set(newKey, cloned);
|
|
66
|
+
})), this.state = Object.assign(Object.assign({}, this.state), {
|
|
67
|
+
filters: next
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
shiftFieldsOnDeleteColumns(deleteColIndexs) {
|
|
71
|
+
if (!Array.isArray(deleteColIndexs) || 0 === deleteColIndexs.length) return;
|
|
72
|
+
const deleteIndexNums = deleteColIndexs.slice().filter((n => Number.isFinite(n))).sort(((a, b) => a - b)).map(((idx, i) => idx - i)), next = new Map;
|
|
73
|
+
this.state.filters.forEach(((cfg, key) => {
|
|
74
|
+
let newKey = key;
|
|
75
|
+
const cloned = Object.assign({}, cfg);
|
|
76
|
+
let removed = !1;
|
|
77
|
+
if ("number" == typeof newKey) {
|
|
78
|
+
let k = newKey;
|
|
79
|
+
for (let i = 0; i < deleteIndexNums.length; i++) {
|
|
80
|
+
const d = deleteIndexNums[i];
|
|
81
|
+
if (k === d) {
|
|
82
|
+
removed = !0;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
k > d && (k -= 1);
|
|
86
|
+
}
|
|
87
|
+
newKey = k;
|
|
88
|
+
}
|
|
89
|
+
if ("number" == typeof cloned.field) {
|
|
90
|
+
let f = cloned.field;
|
|
91
|
+
for (let i = 0; i < deleteIndexNums.length; i++) {
|
|
92
|
+
const d = deleteIndexNums[i];
|
|
93
|
+
if (f === d) {
|
|
94
|
+
removed = !0;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
f > d && (f -= 1);
|
|
98
|
+
}
|
|
99
|
+
cloned.field = f;
|
|
100
|
+
}
|
|
101
|
+
removed || (cloned && "byValue" === cloned.type && Array.isArray(cloned.values) && (cloned.values = cloned.values.slice()),
|
|
102
|
+
cloned && Array.isArray(cloned.condition) && (cloned.condition = cloned.condition.slice()),
|
|
103
|
+
next.set(newKey, cloned));
|
|
104
|
+
})), this.state = Object.assign(Object.assign({}, this.state), {
|
|
105
|
+
filters: next
|
|
106
|
+
});
|
|
107
|
+
}
|
|
27
108
|
reapplyCurrentFilters() {
|
|
28
109
|
this.getActiveFilterFields().length > 0 && this.applyFilters();
|
|
29
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filter/filter-state-manager.ts"],"names":[],"mappings":"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","file":"filter-state-manager.js","sourcesContent":["import type { ListTable, PivotTable } from '@visactor/vtable';\nimport type { FilterState, FilterAction, FilterConfig, FilterListener } from './types';\nimport { FilterActionType } from './types';\nimport type { FilterEngine } from './filter-engine';\n\n/**\n * 筛选状态管理器,用于管理筛选状态\n */\nexport class FilterStateManager {\n private state: FilterState;\n private engine: FilterEngine;\n private listeners: Array<FilterListener> = [];\n\n private table: ListTable | PivotTable;\n\n constructor(table: ListTable | PivotTable, engine: FilterEngine) {\n this.state = {\n filters: new Map()\n };\n this.engine = engine;\n this.table = table;\n }\n\n getFilterState(fieldId?: string | number): FilterConfig {\n return this.state.filters.get(fieldId);\n }\n\n /**\n * 获取所有激活的筛选字段\n */\n getActiveFilterFields(): (string | number)[] {\n const activeFields: (string | number)[] = [];\n this.state.filters.forEach((config, field) => {\n if (config.enable) {\n activeFields.push(field);\n }\n });\n return activeFields;\n }\n\n /**\n * 获取所有筛选状态\n */\n getAllFilterStates(): FilterState {\n return this.state;\n }\n\n /**\n * 公共方法:重新应用当前所有激活的筛选状态\n * 用于在表格配置更新后恢复筛选显示\n */\n reapplyCurrentFilters(): void {\n const activeFields = this.getActiveFilterFields();\n if (activeFields.length > 0) {\n this.applyFilters();\n }\n }\n\n dispatch(action: FilterAction) {\n this.state = this.reduce(this.state, action);\n if (this.shouldApplyFilter(action)) {\n this.applyFilters();\n }\n this.notifyListeners(action);\n }\n\n subscribe(listener: FilterListener): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners(action: FilterAction): void {\n this.listeners.forEach(listener => listener(this.state, action));\n }\n\n private reduce(state: FilterState, action: FilterAction): FilterState {\n const { type, payload } = action;\n const newFilter = new Map(state.filters);\n switch (type) {\n case FilterActionType.ADD_FILTER:\n if (payload.shouldKeepUnrelatedState) {\n newFilter.set(payload.field, { ...newFilter.get(payload.field), ...payload });\n } else {\n newFilter.set(payload.field, payload);\n }\n break;\n case FilterActionType.REMOVE_FILTER:\n if (payload.shouldKeepUnrelatedState && payload.type === 'byValue') {\n delete newFilter.get(payload.field).values;\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: false });\n } else if (payload.shouldKeepUnrelatedState && payload.type === 'byCondition') {\n delete newFilter.get(payload.field).condition;\n delete newFilter.get(payload.field).operator;\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: false });\n } else {\n newFilter.delete(payload.field);\n }\n\n break;\n case FilterActionType.UPDATE_FILTER:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), ...payload });\n break;\n case FilterActionType.ENABLE_FILTER:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: true });\n break;\n case FilterActionType.DISABLE_FILTER:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: false });\n break;\n case FilterActionType.CLEAR_ALL_FILTERS:\n newFilter.clear();\n break;\n case FilterActionType.APPLY_FILTERS:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), ...payload, enable: true });\n break;\n }\n\n return { ...state, filters: newFilter };\n }\n\n private applyFilters() {\n this.engine.applyFilter(this.state, this.table);\n }\n\n private shouldApplyFilter(action: FilterAction) {\n const shouldApplyActions = [\n FilterActionType.REMOVE_FILTER,\n FilterActionType.ENABLE_FILTER,\n FilterActionType.DISABLE_FILTER,\n FilterActionType.CLEAR_ALL_FILTERS,\n FilterActionType.APPLY_FILTERS\n ];\n return shouldApplyActions.includes(action.type);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/filter/filter-state-manager.ts"],"names":[],"mappings":"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","file":"filter-state-manager.js","sourcesContent":["import type { ListTable, PivotTable } from '@visactor/vtable';\nimport type { FilterState, FilterAction, FilterConfig, FilterListener, FilterStateSnapshot } from './types';\nimport { FilterActionType } from './types';\nimport type { FilterEngine } from './filter-engine';\n\n/**\n * 筛选状态管理器,用于管理筛选状态\n */\nexport class FilterStateManager {\n private state: FilterState;\n private engine: FilterEngine;\n private listeners: Array<FilterListener> = [];\n\n private table: ListTable | PivotTable;\n\n constructor(table: ListTable | PivotTable, engine: FilterEngine) {\n this.state = {\n filters: new Map()\n };\n this.engine = engine;\n this.table = table;\n }\n\n getFilterState(fieldId?: string | number): FilterConfig {\n return this.state.filters.get(fieldId);\n }\n\n /**\n * 获取所有激活的筛选字段\n */\n getActiveFilterFields(): (string | number)[] {\n const activeFields: (string | number)[] = [];\n this.state.filters.forEach((config, field) => {\n if (config.enable) {\n activeFields.push(field);\n }\n });\n return activeFields;\n }\n\n /**\n * 获取所有筛选状态\n */\n getAllFilterStates(): FilterState {\n return this.state;\n }\n\n /**\n * 生成可序列化的筛选快照,用于撤销/恢复或跨实例回放。\n * - 只保留声明式配置(byValue 的 values、byCondition 的 operator/condition 等),不包含运行时函数。\n * - 对 byValue 的 values 做排序,避免因为用户勾选顺序不同导致快照 diff 抖动。\n * - 对 filters 按 field 排序,保证快照稳定。\n */\n getSnapshot(): FilterStateSnapshot {\n const filters: FilterConfig[] = [];\n this.state.filters.forEach(v => {\n const next: any = { ...v };\n if (next && next.type === 'byValue' && Array.isArray(next.values)) {\n next.values = next.values.slice().sort((a: any, b: any) => String(a).localeCompare(String(b)));\n }\n if (next && Array.isArray(next.condition) && next.condition.length > 2) {\n next.condition = next.condition.slice();\n }\n filters.push(next);\n });\n filters.sort((a, b) => String(a.field).localeCompare(String(b.field)));\n return { filters };\n }\n\n /**\n * 从快照恢复筛选状态并立即重新应用筛选。\n * 典型用途:HistoryPlugin 回放(undo/redo)时恢复筛选配置。\n */\n applySnapshot(snapshot: FilterStateSnapshot, actionType: FilterActionType = FilterActionType.APPLY_FILTERS): void {\n const next = new Map<string | number, FilterConfig>();\n (snapshot?.filters ?? []).forEach(cfg => {\n if (!cfg) {\n return;\n }\n const cloned: any = { ...cfg };\n if (cloned && cloned.type === 'byValue' && Array.isArray(cloned.values)) {\n cloned.values = cloned.values.slice();\n }\n if (cloned && Array.isArray(cloned.condition)) {\n cloned.condition = cloned.condition.slice();\n }\n next.set(cloned.field, cloned);\n });\n this.state = { ...this.state, filters: next };\n this.applyFilters();\n this.notifyListeners({ type: actionType, payload: { fromSnapshot: true } } as any);\n }\n\n /**\n * 列插入后修正筛选配置中的 field。\n * 背景:ListTable.addColumns(..., isMaintainArrayData=true) 会重排 columns[i].field=i,\n * 此时 FilterStateManager 里如果存的是数字 field(数组 records 场景),需要同步 +columnCount,\n * 否则旧筛选会错位应用到新列,表现为“全部被过滤掉/筛选异常”。\n */\n shiftFieldsOnAddColumns(columnIndex: number, columnCount: number): void {\n if (!Number.isFinite(columnIndex) || !Number.isFinite(columnCount) || columnCount <= 0) {\n return;\n }\n const next = new Map<string | number, FilterConfig>();\n this.state.filters.forEach((cfg, key) => {\n let newKey: string | number = key;\n const cloned: any = { ...cfg };\n if (typeof newKey === 'number' && newKey >= columnIndex) {\n newKey = newKey + columnCount;\n }\n if (typeof cloned.field === 'number' && cloned.field >= columnIndex) {\n cloned.field = cloned.field + columnCount;\n }\n if (cloned && cloned.type === 'byValue' && Array.isArray(cloned.values)) {\n cloned.values = cloned.values.slice();\n }\n if (cloned && Array.isArray(cloned.condition)) {\n cloned.condition = cloned.condition.slice();\n }\n next.set(newKey, cloned);\n });\n this.state = { ...this.state, filters: next };\n }\n\n /**\n * 列删除后修正筛选配置中的 field。\n * - 命中被删除列的筛选项会被移除(否则将引用无效列)。\n * - 删除多列时按升序依次“前移”,与 ListTable.deleteColumns 的维护逻辑一致。\n */\n shiftFieldsOnDeleteColumns(deleteColIndexs: number[]): void {\n if (!Array.isArray(deleteColIndexs) || deleteColIndexs.length === 0) {\n return;\n }\n const sorted = deleteColIndexs\n .slice()\n .filter(n => Number.isFinite(n))\n .sort((a, b) => a - b);\n const deleteIndexNums = sorted.map((idx, i) => idx - i);\n\n const next = new Map<string | number, FilterConfig>();\n this.state.filters.forEach((cfg, key) => {\n let newKey: string | number = key;\n const cloned: any = { ...cfg };\n let removed = false;\n if (typeof newKey === 'number') {\n let k = newKey;\n for (let i = 0; i < deleteIndexNums.length; i++) {\n const d = deleteIndexNums[i];\n if (k === d) {\n removed = true;\n break;\n }\n if (k > d) {\n k -= 1;\n }\n }\n newKey = k;\n }\n if (typeof cloned.field === 'number') {\n let f = cloned.field;\n for (let i = 0; i < deleteIndexNums.length; i++) {\n const d = deleteIndexNums[i];\n if (f === d) {\n removed = true;\n break;\n }\n if (f > d) {\n f -= 1;\n }\n }\n cloned.field = f;\n }\n if (removed) {\n return;\n }\n if (cloned && cloned.type === 'byValue' && Array.isArray(cloned.values)) {\n cloned.values = cloned.values.slice();\n }\n if (cloned && Array.isArray(cloned.condition)) {\n cloned.condition = cloned.condition.slice();\n }\n next.set(newKey, cloned);\n });\n this.state = { ...this.state, filters: next };\n }\n\n /**\n * 公共方法:重新应用当前所有激活的筛选状态\n * 用于在表格配置更新后恢复筛选显示\n */\n reapplyCurrentFilters(): void {\n const activeFields = this.getActiveFilterFields();\n if (activeFields.length > 0) {\n this.applyFilters();\n }\n }\n\n dispatch(action: FilterAction) {\n this.state = this.reduce(this.state, action);\n if (this.shouldApplyFilter(action)) {\n this.applyFilters();\n }\n this.notifyListeners(action);\n }\n\n subscribe(listener: FilterListener): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners(action: FilterAction): void {\n this.listeners.forEach(listener => listener(this.state, action));\n }\n\n private reduce(state: FilterState, action: FilterAction): FilterState {\n const { type, payload } = action;\n const newFilter = new Map(state.filters);\n switch (type) {\n case FilterActionType.ADD_FILTER:\n if (payload.shouldKeepUnrelatedState) {\n newFilter.set(payload.field, { ...newFilter.get(payload.field), ...payload });\n } else {\n newFilter.set(payload.field, payload);\n }\n break;\n case FilterActionType.REMOVE_FILTER:\n if (payload.shouldKeepUnrelatedState && payload.type === 'byValue') {\n delete newFilter.get(payload.field).values;\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: false });\n } else if (payload.shouldKeepUnrelatedState && payload.type === 'byCondition') {\n delete newFilter.get(payload.field).condition;\n delete newFilter.get(payload.field).operator;\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: false });\n } else {\n newFilter.delete(payload.field);\n }\n\n break;\n case FilterActionType.UPDATE_FILTER:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), ...payload });\n break;\n case FilterActionType.ENABLE_FILTER:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: true });\n break;\n case FilterActionType.DISABLE_FILTER:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: false });\n break;\n case FilterActionType.CLEAR_ALL_FILTERS:\n newFilter.clear();\n break;\n case FilterActionType.APPLY_FILTERS:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), ...payload, enable: true });\n break;\n }\n\n return { ...state, filters: newFilter };\n }\n\n private applyFilters() {\n this.engine.applyFilter(this.state, this.table);\n }\n\n private shouldApplyFilter(action: FilterAction) {\n const shouldApplyActions = [\n FilterActionType.REMOVE_FILTER,\n FilterActionType.ENABLE_FILTER,\n FilterActionType.DISABLE_FILTER,\n FilterActionType.CLEAR_ALL_FILTERS,\n FilterActionType.APPLY_FILTERS\n ];\n return shouldApplyActions.includes(action.type);\n }\n}\n"]}
|
|
@@ -24,11 +24,13 @@ export declare class FilterToolbar {
|
|
|
24
24
|
private clearFilterOptionLink;
|
|
25
25
|
private cancelFilterButton;
|
|
26
26
|
private applyFilterButton;
|
|
27
|
+
private pluginId;
|
|
27
28
|
constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager, pluginOptions: FilterOptions);
|
|
28
29
|
private onTabSwitch;
|
|
29
30
|
private updateSelectedField;
|
|
30
31
|
private applyFilter;
|
|
31
32
|
private clearFilter;
|
|
33
|
+
private recordHistory;
|
|
32
34
|
private updateClearFilterButtonState;
|
|
33
35
|
render(container: HTMLElement): void;
|
|
34
36
|
updateStyles(styles: FilterStyles): void;
|
|
@@ -8,6 +8,7 @@ const vtable_1 = require("@visactor/vtable"), value_filter_1 = require("./value-
|
|
|
8
8
|
|
|
9
9
|
class FilterToolbar {
|
|
10
10
|
constructor(table, filterStateManager, pluginOptions) {
|
|
11
|
+
var _a;
|
|
11
12
|
this.valueFilter = null, this.conditionFilter = null, this.activeTab = "byValue",
|
|
12
13
|
this.isVisible = !1, this.selectedField = null, this.filterModes = [], 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, {
|
|
@@ -16,7 +17,8 @@ class FilterToolbar {
|
|
|
16
17
|
});
|
|
17
18
|
}, this.table = table, this.filterStateManager = filterStateManager, this.valueFilter = new value_filter_1.ValueFilter(this.table, this.filterStateManager, pluginOptions),
|
|
18
19
|
this.conditionFilter = new condition_filter_1.ConditionFilter(this.table, this.filterStateManager, pluginOptions, this.hide),
|
|
19
|
-
this.pluginOptions = pluginOptions, this.
|
|
20
|
+
this.pluginOptions = pluginOptions, this.pluginId = null !== (_a = null == pluginOptions ? void 0 : pluginOptions.id) && void 0 !== _a ? _a : "filter",
|
|
21
|
+
this.filterMenuWidth = 300, this.filterStateManager.subscribe((state => {
|
|
20
22
|
this.isVisible && null !== this.selectedField && this.updateClearFilterButtonState(this.selectedField);
|
|
21
23
|
}));
|
|
22
24
|
}
|
|
@@ -39,6 +41,17 @@ class FilterToolbar {
|
|
|
39
41
|
this.valueFilter && this.valueFilter.clearFilter(field), this.conditionFilter && this.conditionFilter.clearFilter(field),
|
|
40
42
|
this.hide();
|
|
41
43
|
}
|
|
44
|
+
recordHistory(before, after) {
|
|
45
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
46
|
+
if (JSON.stringify(before) === JSON.stringify(after)) return;
|
|
47
|
+
const pm = this.table.pluginManager, history = null !== (_f = null !== (_d = null !== (_b = null === (_a = null == pm ? void 0 : pm.getPlugin) || void 0 === _a ? void 0 : _a.call(pm, "history-plugin")) && void 0 !== _b ? _b : null === (_c = null == pm ? void 0 : pm.getPluginByName) || void 0 === _c ? void 0 : _c.call(pm, "History")) && void 0 !== _d ? _d : null === (_e = null == pm ? void 0 : pm.getPlugin) || void 0 === _e ? void 0 : _e.call(pm, "history")) && void 0 !== _f ? _f : null === (_g = null == pm ? void 0 : pm.getPluginByName) || void 0 === _g ? void 0 : _g.call(pm, "history");
|
|
48
|
+
null === (_h = null == history ? void 0 : history.recordExternalCommand) || void 0 === _h || _h.call(history, {
|
|
49
|
+
type: "filter",
|
|
50
|
+
pluginId: this.pluginId,
|
|
51
|
+
oldSnapshot: before,
|
|
52
|
+
newSnapshot: after
|
|
53
|
+
});
|
|
54
|
+
}
|
|
42
55
|
updateClearFilterButtonState(field) {
|
|
43
56
|
const currentFilter = this.filterStateManager.getFilterState(field), hasActiveFilter = currentFilter && currentFilter.enable;
|
|
44
57
|
this.clearFilterOptionLink.style.display = "inline", this.clearFilterOptionLink.style.opacity = hasActiveFilter ? "1" : "0.5",
|
|
@@ -86,9 +99,16 @@ class FilterToolbar {
|
|
|
86
99
|
})), this.filterTabByCondition.addEventListener("click", (() => {
|
|
87
100
|
this.onTabSwitch("byCondition");
|
|
88
101
|
})), this.cancelFilterButton.addEventListener("click", (() => this.hide())), this.clearFilterOptionLink.addEventListener("click", (e => {
|
|
89
|
-
e.preventDefault()
|
|
102
|
+
e.preventDefault();
|
|
103
|
+
const before = this.filterStateManager.getSnapshot();
|
|
104
|
+
this.clearFilter(this.selectedField);
|
|
105
|
+
const after = this.filterStateManager.getSnapshot();
|
|
106
|
+
this.recordHistory(before, after);
|
|
90
107
|
})), this.applyFilterButton.addEventListener("click", (() => {
|
|
108
|
+
const before = this.filterStateManager.getSnapshot();
|
|
91
109
|
this.applyFilter(this.selectedField);
|
|
110
|
+
const after = this.filterStateManager.getSnapshot();
|
|
111
|
+
this.recordHistory(before, after);
|
|
92
112
|
})), document.addEventListener("click", (() => {
|
|
93
113
|
this.isVisible && this.hide();
|
|
94
114
|
})), this.filterMenu.addEventListener("click", (e => {
|
|
@@ -115,7 +135,7 @@ class FilterToolbar {
|
|
|
115
135
|
const field = this.table.internalProps.layoutMap.getHeaderField(col, row);
|
|
116
136
|
this.updateSelectedField(field);
|
|
117
137
|
const currentFilter = this.filterStateManager.getFilterState(field);
|
|
118
|
-
currentFilter && "byCondition" === currentFilter.type ? this.onTabSwitch("byCondition") : this.onTabSwitch("byValue"),
|
|
138
|
+
currentFilter && "byCondition" === currentFilter.type ? this.onTabSwitch("byCondition") : this.filterModes.includes("byValue") && this.onTabSwitch("byValue"),
|
|
119
139
|
this.updateClearFilterButtonState(field), setTimeout((() => {
|
|
120
140
|
this.isVisible = !0, this.table.fireListeners(vtable_1.TABLE_EVENT_TYPE.FILTER_MENU_SHOW, {
|
|
121
141
|
col: col,
|