@visactor/vtable-plugins 1.19.9-alpha.2 → 1.20.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/cjs/add-row-column.d.ts +2 -2
- package/cjs/add-row-column.js +3 -3
- package/cjs/add-row-column.js.map +1 -1
- package/cjs/auto-fill/auto-fill-helper.d.ts +23 -0
- package/cjs/auto-fill/auto-fill-helper.js +83 -0
- package/cjs/auto-fill/auto-fill-helper.js.map +1 -0
- package/cjs/auto-fill/auto-fill-manager.d.ts +26 -0
- package/cjs/auto-fill/auto-fill-manager.js +244 -0
- package/cjs/auto-fill/auto-fill-manager.js.map +1 -0
- package/cjs/auto-fill/auto-fill-services.d.ts +12 -0
- package/cjs/auto-fill/auto-fill-services.js +27 -0
- package/cjs/auto-fill/auto-fill-services.js.map +1 -0
- package/cjs/auto-fill/date-tools.d.ts +5 -0
- package/cjs/auto-fill/date-tools.js +37 -0
- package/cjs/auto-fill/date-tools.js.map +1 -0
- package/cjs/auto-fill/index.d.ts +21 -0
- package/cjs/auto-fill/index.js +52 -0
- package/cjs/auto-fill/index.js.map +1 -0
- package/cjs/auto-fill/rules.d.ts +10 -0
- package/cjs/auto-fill/rules.js +196 -0
- package/cjs/auto-fill/rules.js.map +1 -0
- package/cjs/auto-fill/series-converters.d.ts +27 -0
- package/cjs/auto-fill/series-converters.js +90 -0
- package/cjs/auto-fill/series-converters.js.map +1 -0
- package/cjs/auto-fill/types.d.ts +67 -0
- package/cjs/auto-fill/types.js +20 -0
- package/cjs/auto-fill/types.js.map +1 -0
- package/cjs/auto-fill/utils/date.d.ts +5 -0
- package/cjs/auto-fill/utils/date.js +76 -0
- package/cjs/auto-fill/utils/date.js.map +1 -0
- package/cjs/auto-fill/utils/fill.d.ts +82 -0
- package/cjs/auto-fill/utils/fill.js +361 -0
- package/cjs/auto-fill/utils/fill.js.map +1 -0
- package/cjs/carousel-animation.d.ts +1 -1
- package/cjs/carousel-animation.js.map +1 -1
- package/cjs/column-series.js +1 -1
- package/cjs/column-series.js.map +1 -1
- package/cjs/context-menu.d.ts +34 -0
- package/cjs/context-menu.js +157 -0
- package/cjs/context-menu.js.map +1 -0
- package/cjs/contextmenu/handle-menu-helper.d.ts +23 -0
- package/cjs/contextmenu/handle-menu-helper.js +107 -0
- package/cjs/contextmenu/handle-menu-helper.js.map +1 -0
- package/cjs/contextmenu/index.d.ts +3 -0
- package/cjs/contextmenu/index.js +22 -0
- package/cjs/contextmenu/index.js.map +1 -0
- package/cjs/contextmenu/menu-manager.d.ts +27 -0
- package/cjs/contextmenu/menu-manager.js +139 -0
- package/cjs/contextmenu/menu-manager.js.map +1 -0
- package/cjs/contextmenu/styles.d.ts +106 -0
- package/cjs/contextmenu/styles.js +195 -0
- package/cjs/contextmenu/styles.js.map +1 -0
- package/cjs/contextmenu/types.d.ts +69 -0
- package/cjs/contextmenu/types.js +122 -0
- package/cjs/contextmenu/types.js.map +1 -0
- package/cjs/excel-edit-cell-keyboard.js +2 -2
- package/cjs/excel-edit-cell-keyboard.js.map +1 -1
- package/cjs/excel-import.js +8 -8
- package/cjs/excel-import.js.map +1 -1
- package/cjs/fillHandleUtils/autoFillHandle.js.map +1 -1
- package/cjs/fillHandleUtils/translateRowObj.js.map +1 -1
- package/cjs/filter/condition-filter.d.ts +30 -0
- package/cjs/filter/condition-filter.js +271 -0
- package/cjs/filter/condition-filter.js.map +1 -0
- package/cjs/filter/filter-engine.d.ts +13 -0
- package/cjs/filter/filter-engine.js +102 -0
- package/cjs/filter/filter-engine.js.map +1 -0
- package/cjs/filter/filter-state-manager.d.ts +21 -0
- package/cjs/filter/filter-state-manager.js +102 -0
- package/cjs/filter/filter-state-manager.js.map +1 -0
- package/cjs/filter/filter-toolbar.d.ts +31 -0
- package/cjs/filter/filter-toolbar.js +98 -0
- package/cjs/filter/filter-toolbar.js.map +1 -0
- package/cjs/filter/filter.d.ts +26 -0
- package/cjs/filter/filter.js +150 -0
- package/cjs/filter/filter.js.map +1 -0
- package/cjs/filter/index.d.ts +7 -0
- package/cjs/filter/index.js +66 -0
- package/cjs/filter/index.js.map +1 -0
- package/cjs/filter/styles.d.ts +126 -0
- package/cjs/filter/styles.js +145 -0
- package/cjs/filter/styles.js.map +1 -0
- package/cjs/filter/types.d.ts +55 -0
- package/cjs/filter/types.js +18 -0
- package/cjs/filter/types.js.map +1 -0
- package/cjs/filter/value-filter.d.ts +31 -0
- package/cjs/filter/value-filter.js +280 -0
- package/cjs/filter/value-filter.js.map +1 -0
- package/cjs/focus-highlight.js +1 -1
- package/cjs/focus-highlight.js.map +1 -1
- package/cjs/gantt-export-image.js.map +1 -1
- package/cjs/header-highlight.js.map +1 -1
- package/cjs/highlight-header-when-select-cell.d.ts +1 -2
- package/cjs/highlight-header-when-select-cell.js +1 -1
- package/cjs/highlight-header-when-select-cell.js.map +1 -1
- package/cjs/index.d.ts +4 -0
- package/cjs/index.js +3 -1
- package/cjs/index.js.map +1 -1
- package/cjs/invert-highlight.js.map +1 -1
- package/cjs/paste-add-row-column.d.ts +1 -0
- package/cjs/paste-add-row-column.js +3 -2
- package/cjs/paste-add-row-column.js.map +1 -1
- package/cjs/rotate-table.js +1 -1
- package/cjs/rotate-table.js.map +1 -1
- package/cjs/row-series.js +1 -1
- package/cjs/row-series.js.map +1 -1
- package/cjs/table-carousel-animation.js +2 -3
- package/cjs/table-carousel-animation.js.map +1 -1
- package/cjs/table-export/csv/index.js +1 -1
- package/cjs/table-export/csv/index.js.map +1 -1
- package/cjs/table-export/excel/index.js +0 -1
- package/cjs/table-export/excel/index.js.map +1 -1
- package/cjs/table-export/excel/style.js.map +1 -1
- package/cjs/table-export/index.js.map +1 -1
- package/cjs/table-export/util/color.js.map +1 -1
- package/cjs/table-export/util/download.js.map +1 -1
- package/cjs/table-export/util/encode.js.map +1 -1
- package/cjs/table-export/util/indent.js.map +1 -1
- package/cjs/table-export/util/pagination.js.map +1 -1
- package/cjs/table-export/util/promise.js.map +1 -1
- package/cjs/table-export/util/type.js +1 -1
- package/cjs/table-export/util/type.js.map +1 -1
- package/cjs/table-export.js +1 -2
- package/cjs/table-export.js.map +1 -1
- package/cjs/table-series-number.d.ts +41 -0
- package/cjs/table-series-number.js +261 -0
- package/cjs/table-series-number.js.map +1 -0
- package/cjs/types.d.ts +1 -0
- package/cjs/types.js +17 -1
- package/cjs/types.js.map +1 -1
- package/cjs/wps-fill-handle.js +1 -1
- package/cjs/wps-fill-handle.js.map +1 -1
- package/dist/vtable-plugins.js +7594 -1492
- package/dist/vtable-plugins.min.js +14 -14
- package/es/add-row-column.d.ts +2 -2
- package/es/add-row-column.js +3 -3
- package/es/add-row-column.js.map +1 -1
- package/es/auto-fill/auto-fill-helper.d.ts +23 -0
- package/es/auto-fill/auto-fill-helper.js +75 -0
- package/es/auto-fill/auto-fill-helper.js.map +1 -0
- package/es/auto-fill/auto-fill-manager.d.ts +26 -0
- package/es/auto-fill/auto-fill-manager.js +218 -0
- package/es/auto-fill/auto-fill-manager.js.map +1 -0
- package/es/auto-fill/auto-fill-services.d.ts +12 -0
- package/es/auto-fill/auto-fill-services.js +19 -0
- package/es/auto-fill/auto-fill-services.js.map +1 -0
- package/es/auto-fill/date-tools.d.ts +5 -0
- package/es/auto-fill/date-tools.js +29 -0
- package/es/auto-fill/date-tools.js.map +1 -0
- package/es/auto-fill/index.d.ts +21 -0
- package/es/auto-fill/index.js +21 -0
- package/es/auto-fill/index.js.map +1 -0
- package/es/auto-fill/rules.d.ts +10 -0
- package/es/auto-fill/rules.js +203 -0
- package/es/auto-fill/rules.js.map +1 -0
- package/es/auto-fill/series-converters.d.ts +27 -0
- package/es/auto-fill/series-converters.js +83 -0
- package/es/auto-fill/series-converters.js.map +1 -0
- package/es/auto-fill/types.d.ts +67 -0
- package/es/auto-fill/types.js +27 -0
- package/es/auto-fill/types.js.map +1 -0
- package/es/auto-fill/utils/date.d.ts +5 -0
- package/es/auto-fill/utils/date.js +68 -0
- package/es/auto-fill/utils/date.js.map +1 -0
- package/es/auto-fill/utils/fill.d.ts +82 -0
- package/es/auto-fill/utils/fill.js +347 -0
- package/es/auto-fill/utils/fill.js.map +1 -0
- package/es/carousel-animation.d.ts +1 -1
- package/es/carousel-animation.js.map +1 -1
- package/es/column-series.js +1 -1
- package/es/column-series.js.map +1 -1
- package/es/context-menu.d.ts +34 -0
- package/es/context-menu.js +129 -0
- package/es/context-menu.js.map +1 -0
- package/es/contextmenu/handle-menu-helper.d.ts +23 -0
- package/es/contextmenu/handle-menu-helper.js +99 -0
- package/es/contextmenu/handle-menu-helper.js.map +1 -0
- package/es/contextmenu/index.d.ts +3 -0
- package/es/contextmenu/index.js +6 -0
- package/es/contextmenu/index.js.map +1 -0
- package/es/contextmenu/menu-manager.d.ts +27 -0
- package/es/contextmenu/menu-manager.js +130 -0
- package/es/contextmenu/menu-manager.js.map +1 -0
- package/es/contextmenu/styles.d.ts +106 -0
- package/es/contextmenu/styles.js +197 -0
- package/es/contextmenu/styles.js.map +1 -0
- package/es/contextmenu/types.d.ts +69 -0
- package/es/contextmenu/types.js +121 -0
- package/es/contextmenu/types.js.map +1 -0
- package/es/excel-edit-cell-keyboard.js +2 -2
- package/es/excel-edit-cell-keyboard.js.map +1 -1
- package/es/excel-import.js +8 -8
- package/es/excel-import.js.map +1 -1
- package/es/fillHandleUtils/autoFillHandle.js.map +1 -1
- package/es/fillHandleUtils/translateRowObj.js.map +1 -1
- package/es/filter/condition-filter.d.ts +30 -0
- package/es/filter/condition-filter.js +262 -0
- package/es/filter/condition-filter.js.map +1 -0
- package/es/filter/filter-engine.d.ts +13 -0
- package/es/filter/filter-engine.js +94 -0
- package/es/filter/filter-engine.js.map +1 -0
- package/es/filter/filter-state-manager.d.ts +21 -0
- package/es/filter/filter-state-manager.js +94 -0
- package/es/filter/filter-state-manager.js.map +1 -0
- package/es/filter/filter-toolbar.d.ts +31 -0
- package/es/filter/filter-toolbar.js +90 -0
- package/es/filter/filter-toolbar.js.map +1 -0
- package/es/filter/filter.d.ts +26 -0
- package/es/filter/filter.js +125 -0
- package/es/filter/filter.js.map +1 -0
- package/es/filter/index.d.ts +7 -0
- package/es/filter/index.js +14 -0
- package/es/filter/index.js.map +1 -0
- package/es/filter/styles.d.ts +126 -0
- package/es/filter/styles.js +140 -0
- package/es/filter/styles.js.map +1 -0
- package/es/filter/types.d.ts +55 -0
- package/es/filter/types.js +17 -0
- package/es/filter/types.js.map +1 -0
- package/es/filter/value-filter.d.ts +31 -0
- package/es/filter/value-filter.js +275 -0
- package/es/filter/value-filter.js.map +1 -0
- package/es/focus-highlight.js +1 -1
- package/es/focus-highlight.js.map +1 -1
- package/es/gantt-export-image.js.map +1 -1
- package/es/header-highlight.js.map +1 -1
- package/es/highlight-header-when-select-cell.d.ts +1 -2
- package/es/highlight-header-when-select-cell.js +1 -1
- package/es/highlight-header-when-select-cell.js.map +1 -1
- package/es/index.d.ts +4 -0
- package/es/index.js +8 -0
- package/es/index.js.map +1 -1
- package/es/invert-highlight.js.map +1 -1
- package/es/paste-add-row-column.d.ts +1 -0
- package/es/paste-add-row-column.js +3 -2
- package/es/paste-add-row-column.js.map +1 -1
- package/es/rotate-table.js +1 -1
- package/es/rotate-table.js.map +1 -1
- package/es/row-series.js +1 -1
- package/es/row-series.js.map +1 -1
- package/es/table-carousel-animation.js +3 -3
- package/es/table-carousel-animation.js.map +1 -1
- package/es/table-export/csv/index.js +1 -1
- package/es/table-export/csv/index.js.map +1 -1
- package/es/table-export/excel/index.js +1 -2
- package/es/table-export/excel/index.js.map +1 -1
- package/es/table-export/excel/style.js.map +1 -1
- package/es/table-export/index.js.map +1 -1
- package/es/table-export/util/color.js.map +1 -1
- package/es/table-export/util/download.js.map +1 -1
- package/es/table-export/util/encode.js.map +1 -1
- package/es/table-export/util/indent.js.map +1 -1
- package/es/table-export/util/pagination.js.map +1 -1
- package/es/table-export/util/promise.js.map +1 -1
- package/es/table-export/util/type.js +1 -1
- package/es/table-export/util/type.js.map +1 -1
- package/es/table-export.js +1 -2
- package/es/table-export.js.map +1 -1
- package/es/table-series-number.d.ts +41 -0
- package/es/table-series-number.js +253 -0
- package/es/table-series-number.js.map +1 -0
- package/es/types.d.ts +1 -0
- package/es/types.js +2 -1
- package/es/types.js.map +1 -1
- package/es/wps-fill-handle.js +1 -1
- package/es/wps-fill-handle.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { applyStyles, filterStyles, createElement } from "./styles";
|
|
2
|
+
|
|
3
|
+
import { FilterActionType, FilterOperatorCategory } from "./types";
|
|
4
|
+
|
|
5
|
+
export class ConditionFilter {
|
|
6
|
+
constructor(table, filterStateManager) {
|
|
7
|
+
this.currentCategory = FilterOperatorCategory.ALL, this.operators = [ {
|
|
8
|
+
value: "equals",
|
|
9
|
+
label: "等于",
|
|
10
|
+
category: FilterOperatorCategory.ALL
|
|
11
|
+
}, {
|
|
12
|
+
value: "notEquals",
|
|
13
|
+
label: "不等于",
|
|
14
|
+
category: FilterOperatorCategory.ALL
|
|
15
|
+
}, {
|
|
16
|
+
value: "equals",
|
|
17
|
+
label: "等于",
|
|
18
|
+
category: FilterOperatorCategory.NUMBER
|
|
19
|
+
}, {
|
|
20
|
+
value: "notEquals",
|
|
21
|
+
label: "不等于",
|
|
22
|
+
category: FilterOperatorCategory.NUMBER
|
|
23
|
+
}, {
|
|
24
|
+
value: "greaterThan",
|
|
25
|
+
label: "大于",
|
|
26
|
+
category: FilterOperatorCategory.NUMBER
|
|
27
|
+
}, {
|
|
28
|
+
value: "lessThan",
|
|
29
|
+
label: "小于",
|
|
30
|
+
category: FilterOperatorCategory.NUMBER
|
|
31
|
+
}, {
|
|
32
|
+
value: "greaterThanOrEqual",
|
|
33
|
+
label: "大于等于",
|
|
34
|
+
category: FilterOperatorCategory.NUMBER
|
|
35
|
+
}, {
|
|
36
|
+
value: "lessThanOrEqual",
|
|
37
|
+
label: "小于等于",
|
|
38
|
+
category: FilterOperatorCategory.NUMBER
|
|
39
|
+
}, {
|
|
40
|
+
value: "between",
|
|
41
|
+
label: "介于",
|
|
42
|
+
category: FilterOperatorCategory.NUMBER
|
|
43
|
+
}, {
|
|
44
|
+
value: "notBetween",
|
|
45
|
+
label: "不介于",
|
|
46
|
+
category: FilterOperatorCategory.NUMBER
|
|
47
|
+
}, {
|
|
48
|
+
value: "equals",
|
|
49
|
+
label: "等于",
|
|
50
|
+
category: FilterOperatorCategory.TEXT
|
|
51
|
+
}, {
|
|
52
|
+
value: "notEquals",
|
|
53
|
+
label: "不等于",
|
|
54
|
+
category: FilterOperatorCategory.TEXT
|
|
55
|
+
}, {
|
|
56
|
+
value: "contains",
|
|
57
|
+
label: "包含",
|
|
58
|
+
category: FilterOperatorCategory.TEXT
|
|
59
|
+
}, {
|
|
60
|
+
value: "notContains",
|
|
61
|
+
label: "不包含",
|
|
62
|
+
category: FilterOperatorCategory.TEXT
|
|
63
|
+
}, {
|
|
64
|
+
value: "startsWith",
|
|
65
|
+
label: "开头是",
|
|
66
|
+
category: FilterOperatorCategory.TEXT
|
|
67
|
+
}, {
|
|
68
|
+
value: "notStartsWith",
|
|
69
|
+
label: "开头不是",
|
|
70
|
+
category: FilterOperatorCategory.TEXT
|
|
71
|
+
}, {
|
|
72
|
+
value: "endsWith",
|
|
73
|
+
label: "结尾是",
|
|
74
|
+
category: FilterOperatorCategory.TEXT
|
|
75
|
+
}, {
|
|
76
|
+
value: "notEndsWith",
|
|
77
|
+
label: "结尾不是",
|
|
78
|
+
category: FilterOperatorCategory.TEXT
|
|
79
|
+
}, {
|
|
80
|
+
value: "equals",
|
|
81
|
+
label: "等于",
|
|
82
|
+
category: FilterOperatorCategory.COLOR
|
|
83
|
+
}, {
|
|
84
|
+
value: "notEquals",
|
|
85
|
+
label: "不等于",
|
|
86
|
+
category: FilterOperatorCategory.COLOR
|
|
87
|
+
}, {
|
|
88
|
+
value: "isChecked",
|
|
89
|
+
label: "已选中",
|
|
90
|
+
category: FilterOperatorCategory.CHECKBOX
|
|
91
|
+
}, {
|
|
92
|
+
value: "isUnchecked",
|
|
93
|
+
label: "未选中",
|
|
94
|
+
category: FilterOperatorCategory.CHECKBOX
|
|
95
|
+
}, {
|
|
96
|
+
value: "isChecked",
|
|
97
|
+
label: "已选中",
|
|
98
|
+
category: FilterOperatorCategory.RADIO
|
|
99
|
+
}, {
|
|
100
|
+
value: "isUnchecked",
|
|
101
|
+
label: "未选中",
|
|
102
|
+
category: FilterOperatorCategory.RADIO
|
|
103
|
+
} ], this.categories = [ {
|
|
104
|
+
value: FilterOperatorCategory.ALL,
|
|
105
|
+
label: "全部"
|
|
106
|
+
}, {
|
|
107
|
+
value: FilterOperatorCategory.TEXT,
|
|
108
|
+
label: "文本"
|
|
109
|
+
}, {
|
|
110
|
+
value: FilterOperatorCategory.NUMBER,
|
|
111
|
+
label: "数值"
|
|
112
|
+
}, {
|
|
113
|
+
value: FilterOperatorCategory.COLOR,
|
|
114
|
+
label: "颜色"
|
|
115
|
+
}, {
|
|
116
|
+
value: FilterOperatorCategory.CHECKBOX,
|
|
117
|
+
label: "复选框"
|
|
118
|
+
}, {
|
|
119
|
+
value: FilterOperatorCategory.RADIO,
|
|
120
|
+
label: "单选框"
|
|
121
|
+
} ], this.table = table, this.filterStateManager = filterStateManager;
|
|
122
|
+
}
|
|
123
|
+
setSelectedField(fieldId) {
|
|
124
|
+
this.selectedField = fieldId, this.updateOperatorOptions(), this.loadCurrentFilterState();
|
|
125
|
+
}
|
|
126
|
+
updateOperatorOptions() {
|
|
127
|
+
if (!this.operatorSelect) return;
|
|
128
|
+
let filteredOperators;
|
|
129
|
+
if (this.operatorSelect.innerHTML = "", this.currentCategory === FilterOperatorCategory.ALL) {
|
|
130
|
+
const uniqueOperators = new Map;
|
|
131
|
+
this.operators.forEach((op => {
|
|
132
|
+
uniqueOperators.has(op.value) || uniqueOperators.set(op.value, op);
|
|
133
|
+
})), filteredOperators = Array.from(uniqueOperators.values());
|
|
134
|
+
} else filteredOperators = this.operators.filter((op => op.category === this.currentCategory));
|
|
135
|
+
filteredOperators.forEach((op => {
|
|
136
|
+
const option = document.createElement("option");
|
|
137
|
+
option.value = op.value, option.textContent = op.label, this.operatorSelect.appendChild(option);
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
handleCategoryChange() {
|
|
141
|
+
this.categorySelect && (this.currentCategory = this.categorySelect.value, this.updateOperatorOptions(),
|
|
142
|
+
this.syncUIState());
|
|
143
|
+
}
|
|
144
|
+
loadCurrentFilterState() {
|
|
145
|
+
const filter = this.filterStateManager.getFilterState(this.selectedField);
|
|
146
|
+
filter && "byCondition" === filter.type ? (filter.operator && this.operatorSelect && (this.operatorSelect.value = filter.operator),
|
|
147
|
+
void 0 !== filter.condition && this.valueInput && (Array.isArray(filter.condition) ? (this.valueInput.value = String(filter.condition[0]),
|
|
148
|
+
this.valueInputMax && (this.valueInputMax.value = String(filter.condition[1]))) : (this.valueInput.value = String(filter.condition),
|
|
149
|
+
this.valueInputMax && (this.valueInputMax.value = ""))), this.syncUIState()) : this.reset();
|
|
150
|
+
}
|
|
151
|
+
reset() {
|
|
152
|
+
this.operatorSelect && (this.operatorSelect.selectedIndex = 0), this.valueInput && (this.valueInput.value = "",
|
|
153
|
+
this.valueInput.placeholder = "请输入筛选值"), this.valueInputMax && (this.valueInputMax.value = ""),
|
|
154
|
+
this.currentCategory = FilterOperatorCategory.ALL, this.categorySelect && (this.categorySelect.value = FilterOperatorCategory.ALL),
|
|
155
|
+
this.updateOperatorOptions(), this.syncUIState();
|
|
156
|
+
}
|
|
157
|
+
syncUIState() {
|
|
158
|
+
if (!this.operatorSelect || !this.valueInput) return;
|
|
159
|
+
const selectedOperator = this.operatorSelect.value, andLabel = this.valueInput.nextElementSibling;
|
|
160
|
+
this.isRangeOperator(selectedOperator) ? (this.valueInput.placeholder = "最小值", this.valueInputMax && (this.valueInputMax.style.display = "inline-block"),
|
|
161
|
+
andLabel && (andLabel.style.display = "inline-block")) : (this.valueInput.placeholder = "请输入筛选值",
|
|
162
|
+
this.valueInputMax && (this.valueInputMax.style.display = "none"), andLabel && (andLabel.style.display = "none"));
|
|
163
|
+
}
|
|
164
|
+
isBooleanOperator(operator) {
|
|
165
|
+
return [ "isChecked", "isUnchecked" ].includes(operator);
|
|
166
|
+
}
|
|
167
|
+
isRangeOperator(operator) {
|
|
168
|
+
return "between" === operator || "notBetween" === operator;
|
|
169
|
+
}
|
|
170
|
+
applyFilter(fieldId = this.selectedField) {
|
|
171
|
+
var _a, _b;
|
|
172
|
+
if (!this.operatorSelect || !this.valueInput) return;
|
|
173
|
+
const operator = null === (_a = this.operatorSelect) || void 0 === _a ? void 0 : _a.value;
|
|
174
|
+
let conditionValue = null === (_b = this.valueInput) || void 0 === _b ? void 0 : _b.value;
|
|
175
|
+
if (this.currentCategory !== FilterOperatorCategory.NUMBER || (conditionValue = parseFloat(conditionValue),
|
|
176
|
+
!isNaN(conditionValue))) {
|
|
177
|
+
if (this.isRangeOperator(operator)) {
|
|
178
|
+
const minValue = conditionValue;
|
|
179
|
+
let maxValue = this.valueInputMax.value.trim();
|
|
180
|
+
if (this.currentCategory === FilterOperatorCategory.NUMBER) {
|
|
181
|
+
const numMaxValue = parseFloat(maxValue);
|
|
182
|
+
if (isNaN(numMaxValue)) return;
|
|
183
|
+
maxValue = numMaxValue;
|
|
184
|
+
}
|
|
185
|
+
conditionValue = [ minValue, maxValue ];
|
|
186
|
+
}
|
|
187
|
+
conditionValue || !1 === conditionValue || 0 === conditionValue || this.isBooleanOperator(operator) ? (this.filterStateManager.dispatch({
|
|
188
|
+
type: FilterActionType.APPLY_FILTERS,
|
|
189
|
+
payload: {
|
|
190
|
+
field: fieldId,
|
|
191
|
+
type: "byCondition",
|
|
192
|
+
operator: operator,
|
|
193
|
+
condition: conditionValue,
|
|
194
|
+
enable: !0
|
|
195
|
+
}
|
|
196
|
+
}), this.hide()) : this.clearFilter(fieldId);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
clearFilter(fieldId) {
|
|
200
|
+
this.filterStateManager.dispatch({
|
|
201
|
+
type: FilterActionType.REMOVE_FILTER,
|
|
202
|
+
payload: {
|
|
203
|
+
field: fieldId
|
|
204
|
+
}
|
|
205
|
+
}), this.hide();
|
|
206
|
+
}
|
|
207
|
+
render(container) {
|
|
208
|
+
this.filterByConditionPanel = document.createElement("div"), applyStyles(this.filterByConditionPanel, filterStyles.filterPanel);
|
|
209
|
+
const conditionContainer = document.createElement("div");
|
|
210
|
+
applyStyles(conditionContainer, filterStyles.conditionContainer);
|
|
211
|
+
const categoryLabel = createElement("label", {}, [ "筛选类型:" ]);
|
|
212
|
+
applyStyles(categoryLabel, filterStyles.formLabel), this.categorySelect = createElement("select"),
|
|
213
|
+
applyStyles(this.categorySelect, filterStyles.operatorSelect), this.categories.forEach((category => {
|
|
214
|
+
const option = document.createElement("option");
|
|
215
|
+
option.value = category.value, option.textContent = category.label, this.categorySelect.appendChild(option);
|
|
216
|
+
}));
|
|
217
|
+
const operatorLabel = createElement("label", {}, [ "筛选条件:" ]);
|
|
218
|
+
applyStyles(operatorLabel, filterStyles.formLabel), this.operatorSelect = createElement("select"),
|
|
219
|
+
applyStyles(this.operatorSelect, filterStyles.operatorSelect);
|
|
220
|
+
const valueLabel = createElement("label", {}, [ "筛选值:" ]);
|
|
221
|
+
applyStyles(valueLabel, filterStyles.formLabel);
|
|
222
|
+
const rangeInputContainer = createElement("div");
|
|
223
|
+
applyStyles(rangeInputContainer, filterStyles.rangeInputContainer), this.valueInput = createElement("input", {
|
|
224
|
+
type: "text",
|
|
225
|
+
placeholder: "请输入筛选值"
|
|
226
|
+
}), applyStyles(this.valueInput, filterStyles.searchInput);
|
|
227
|
+
const andLabel = createElement("span", {}, [ "和" ]);
|
|
228
|
+
applyStyles(andLabel, filterStyles.addLabel), andLabel.style.display = "none", this.valueInputMax = createElement("input", {
|
|
229
|
+
type: "text",
|
|
230
|
+
placeholder: "最大值"
|
|
231
|
+
}), applyStyles(this.valueInputMax, filterStyles.searchInput), this.valueInputMax.style.display = "none",
|
|
232
|
+
rangeInputContainer.appendChild(this.valueInput), rangeInputContainer.appendChild(andLabel),
|
|
233
|
+
rangeInputContainer.appendChild(this.valueInputMax), conditionContainer.appendChild(categoryLabel),
|
|
234
|
+
conditionContainer.appendChild(this.categorySelect), conditionContainer.appendChild(operatorLabel),
|
|
235
|
+
conditionContainer.appendChild(this.operatorSelect), conditionContainer.appendChild(valueLabel),
|
|
236
|
+
conditionContainer.appendChild(rangeInputContainer), this.filterByConditionPanel.appendChild(conditionContainer),
|
|
237
|
+
container.appendChild(this.filterByConditionPanel), this.hide(), this.updateOperatorOptions(),
|
|
238
|
+
this.bindEvents();
|
|
239
|
+
}
|
|
240
|
+
bindEvents() {
|
|
241
|
+
this.valueInput.addEventListener("keypress", (event => {
|
|
242
|
+
"Enter" === event.key && this.applyFilter();
|
|
243
|
+
})), this.valueInputMax.addEventListener("keypress", (event => {
|
|
244
|
+
"Enter" === event.key && this.applyFilter();
|
|
245
|
+
})), this.categorySelect.addEventListener("change", (() => {
|
|
246
|
+
this.handleCategoryChange();
|
|
247
|
+
})), this.operatorSelect.addEventListener("change", (() => {
|
|
248
|
+
const selectedOperator = this.operatorSelect.value, andLabel = this.valueInput.nextElementSibling;
|
|
249
|
+
this.isRangeOperator(selectedOperator) ? (this.valueInput.placeholder = "最小值", this.valueInputMax.style.display = "inline-block",
|
|
250
|
+
andLabel.style.display = "inline-block") : (this.valueInput.placeholder = "请输入筛选值",
|
|
251
|
+
this.valueInputMax.style.display = "none", andLabel.style.display = "none");
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
254
|
+
show() {
|
|
255
|
+
this.filterByConditionPanel && (this.filterByConditionPanel.style.display = "block",
|
|
256
|
+
this.loadCurrentFilterState());
|
|
257
|
+
}
|
|
258
|
+
hide() {
|
|
259
|
+
this.filterByConditionPanel && (this.filterByConditionPanel.style.display = "none");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=condition-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/filter/condition-filter.ts"],"names":[],"mappings":"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","file":"condition-filter.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport type { FilterStateManager } from './filter-state-manager';\nimport { applyStyles, filterStyles, createElement } from './styles';\nimport type { FilterOperator, OperatorOption } from './types';\nimport { FilterActionType, FilterOperatorCategory } from './types';\n\n/**\n * 按条件筛选组件\n */\nexport class ConditionFilter {\n private table: VTable.ListTable | VTable.PivotTable;\n private filterStateManager: FilterStateManager;\n private filterByConditionPanel: HTMLElement;\n private selectedField: string | number;\n private operatorSelect: HTMLSelectElement;\n private valueInput: HTMLInputElement;\n private valueInputMax: HTMLInputElement;\n private categorySelect: HTMLSelectElement;\n private currentCategory: FilterOperatorCategory = FilterOperatorCategory.ALL;\n\n // 按分类组织的操作符选项\n private operators: OperatorOption[] = [\n // 通用操作符 (全部分类中显示)\n { value: 'equals', label: '等于', category: FilterOperatorCategory.ALL },\n { value: 'notEquals', label: '不等于', category: FilterOperatorCategory.ALL },\n\n // 数值操作符\n { value: 'equals', label: '等于', category: FilterOperatorCategory.NUMBER },\n { value: 'notEquals', label: '不等于', category: FilterOperatorCategory.NUMBER },\n { value: 'greaterThan', label: '大于', category: FilterOperatorCategory.NUMBER },\n { value: 'lessThan', label: '小于', category: FilterOperatorCategory.NUMBER },\n { value: 'greaterThanOrEqual', label: '大于等于', category: FilterOperatorCategory.NUMBER },\n { value: 'lessThanOrEqual', label: '小于等于', category: FilterOperatorCategory.NUMBER },\n { value: 'between', label: '介于', category: FilterOperatorCategory.NUMBER },\n { value: 'notBetween', label: '不介于', category: FilterOperatorCategory.NUMBER },\n\n // 文本操作符\n { value: 'equals', label: '等于', category: FilterOperatorCategory.TEXT },\n { value: 'notEquals', label: '不等于', category: FilterOperatorCategory.TEXT },\n { value: 'contains', label: '包含', category: FilterOperatorCategory.TEXT },\n { value: 'notContains', label: '不包含', category: FilterOperatorCategory.TEXT },\n { value: 'startsWith', label: '开头是', category: FilterOperatorCategory.TEXT },\n { value: 'notStartsWith', label: '开头不是', category: FilterOperatorCategory.TEXT },\n { value: 'endsWith', label: '结尾是', category: FilterOperatorCategory.TEXT },\n { value: 'notEndsWith', label: '结尾不是', category: FilterOperatorCategory.TEXT },\n\n // 颜色操作符\n { value: 'equals', label: '等于', category: FilterOperatorCategory.COLOR },\n { value: 'notEquals', label: '不等于', category: FilterOperatorCategory.COLOR },\n\n // 复选框操作符\n { value: 'isChecked', label: '已选中', category: FilterOperatorCategory.CHECKBOX },\n { value: 'isUnchecked', label: '未选中', category: FilterOperatorCategory.CHECKBOX },\n\n // 单选框操作符\n { value: 'isChecked', label: '已选中', category: FilterOperatorCategory.RADIO },\n { value: 'isUnchecked', label: '未选中', category: FilterOperatorCategory.RADIO }\n ];\n\n // 分类下拉选项\n private categories = [\n { value: FilterOperatorCategory.ALL, label: '全部' },\n { value: FilterOperatorCategory.TEXT, label: '文本' },\n { value: FilterOperatorCategory.NUMBER, label: '数值' },\n { value: FilterOperatorCategory.COLOR, label: '颜色' },\n { value: FilterOperatorCategory.CHECKBOX, label: '复选框' },\n { value: FilterOperatorCategory.RADIO, label: '单选框' }\n ];\n\n constructor(table: VTable.ListTable | VTable.PivotTable, filterStateManager: FilterStateManager) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n }\n\n setSelectedField(fieldId: string | number): void {\n this.selectedField = fieldId;\n this.updateOperatorOptions();\n this.loadCurrentFilterState();\n }\n\n /**\n * 更新操作符下拉选项\n */\n private updateOperatorOptions(): void {\n if (!this.operatorSelect) {\n return;\n }\n this.operatorSelect.innerHTML = '';\n let filteredOperators: OperatorOption[];\n\n if (this.currentCategory === FilterOperatorCategory.ALL) {\n // 当选择\"全部\"时,收集所有不重复的操作符\n const uniqueOperators = new Map<string, OperatorOption>();\n this.operators.forEach(op => {\n if (!uniqueOperators.has(op.value)) {\n uniqueOperators.set(op.value, op);\n }\n });\n filteredOperators = Array.from(uniqueOperators.values());\n } else {\n // 其他类别正常筛选\n filteredOperators = this.operators.filter(op => op.category === this.currentCategory);\n }\n\n // 添加新选项\n filteredOperators.forEach(op => {\n const option = document.createElement('option');\n option.value = op.value;\n option.textContent = op.label;\n this.operatorSelect.appendChild(option);\n });\n }\n\n private handleCategoryChange(): void {\n if (!this.categorySelect) {\n return;\n }\n\n this.currentCategory = this.categorySelect.value as FilterOperatorCategory;\n this.updateOperatorOptions();\n\n // 分类切换后也需要同步UI状态\n this.syncUIState();\n }\n\n /**\n * 加载当前的筛选状态\n */\n private loadCurrentFilterState(): void {\n const filter = this.filterStateManager.getFilterState(this.selectedField);\n\n if (filter && filter.type === 'byCondition') {\n // 设置操作符\n if (filter.operator && this.operatorSelect) {\n this.operatorSelect.value = filter.operator;\n }\n\n // 设置条件值\n if (filter.condition !== undefined && this.valueInput) {\n if (Array.isArray(filter.condition)) {\n this.valueInput.value = String(filter.condition[0]);\n if (this.valueInputMax) {\n this.valueInputMax.value = String(filter.condition[1]);\n }\n } else {\n this.valueInput.value = String(filter.condition);\n if (this.valueInputMax) {\n this.valueInputMax.value = '';\n }\n }\n }\n\n // 同步UI状态:根据当前操作符显示/隐藏范围输入框\n this.syncUIState();\n } else {\n // 重置为默认值\n this.reset();\n }\n }\n\n /**\n * 重置筛选条件到默认状态\n */\n reset(): void {\n // 重置操作符选择\n if (this.operatorSelect) {\n this.operatorSelect.selectedIndex = 0;\n }\n\n // 重置所有输入框\n if (this.valueInput) {\n this.valueInput.value = '';\n this.valueInput.placeholder = '请输入筛选值';\n }\n\n if (this.valueInputMax) {\n this.valueInputMax.value = '';\n }\n\n // 重置分类选择\n this.currentCategory = FilterOperatorCategory.ALL;\n if (this.categorySelect) {\n this.categorySelect.value = FilterOperatorCategory.ALL;\n }\n\n // 更新操作符选项\n this.updateOperatorOptions();\n\n // 同步UI状态\n this.syncUIState();\n }\n\n /**\n * 同步UI状态:根据当前选择的操作符调整UI显示\n */\n private syncUIState(): void {\n if (!this.operatorSelect || !this.valueInput) {\n return;\n }\n\n const selectedOperator = this.operatorSelect.value as FilterOperator;\n const andLabel = this.valueInput.nextElementSibling as HTMLElement;\n\n if (this.isRangeOperator(selectedOperator)) {\n // 显示范围输入相关UI\n this.valueInput.placeholder = '最小值';\n if (this.valueInputMax) {\n this.valueInputMax.style.display = 'inline-block';\n }\n if (andLabel) {\n andLabel.style.display = 'inline-block';\n }\n } else {\n // 隐藏范围输入相关UI\n this.valueInput.placeholder = '请输入筛选值';\n if (this.valueInputMax) {\n this.valueInputMax.style.display = 'none';\n }\n if (andLabel) {\n andLabel.style.display = 'none';\n }\n }\n }\n\n private isBooleanOperator(operator: FilterOperator): boolean {\n const booleanCondition = ['isChecked', 'isUnchecked'];\n return booleanCondition.includes(operator);\n }\n\n private isRangeOperator(operator: FilterOperator): boolean {\n return operator === 'between' || operator === 'notBetween';\n }\n\n /**\n * 应用筛选条件\n */\n applyFilter(fieldId: string | number = this.selectedField): void {\n if (!this.operatorSelect || !this.valueInput) {\n return;\n }\n\n const operator = this.operatorSelect?.value as FilterOperator;\n let conditionValue: any = this.valueInput?.value;\n\n // 根据所选操作符和分类尝试转换输入值\n if (this.currentCategory === FilterOperatorCategory.NUMBER) {\n conditionValue = parseFloat(conditionValue);\n if (isNaN(conditionValue)) {\n console.warn('请输入有效的数字');\n return;\n }\n }\n\n // 处理范围操作符的双值输入\n if (this.isRangeOperator(operator)) {\n const minValue = conditionValue;\n let maxValue: string | number = this.valueInputMax.value.trim();\n\n // 尝试将最大值也转换为数字\n if (this.currentCategory === FilterOperatorCategory.NUMBER) {\n const numMaxValue = parseFloat(maxValue);\n if (!isNaN(numMaxValue)) {\n maxValue = numMaxValue;\n } else {\n console.warn('请输入有效的最大值');\n return;\n }\n }\n\n // 使用数组形式传递范围值\n conditionValue = [minValue, maxValue];\n }\n\n if (!conditionValue && conditionValue !== false && conditionValue !== 0 && !this.isBooleanOperator(operator)) {\n this.clearFilter(fieldId);\n return;\n }\n\n // TODO:处理单元格颜色和字体颜色的筛选\n\n this.filterStateManager.dispatch({\n type: FilterActionType.APPLY_FILTERS,\n payload: {\n field: fieldId,\n type: 'byCondition',\n operator,\n condition: conditionValue,\n enable: true\n }\n });\n\n this.hide();\n }\n\n /**\n * 清除筛选\n */\n clearFilter(fieldId: string | number): void {\n this.filterStateManager.dispatch({\n type: FilterActionType.REMOVE_FILTER,\n payload: {\n field: fieldId\n }\n });\n\n this.hide();\n }\n\n /**\n * 渲染条件筛选面板\n */\n render(container: HTMLElement): void {\n // 按条件筛选面板\n this.filterByConditionPanel = document.createElement('div');\n applyStyles(this.filterByConditionPanel, filterStyles.filterPanel);\n\n // 条件选择区域\n const conditionContainer = document.createElement('div');\n applyStyles(conditionContainer, filterStyles.conditionContainer);\n\n // 分类选择下拉框\n const categoryLabel = createElement('label', {}, ['筛选类型:']);\n applyStyles(categoryLabel, filterStyles.formLabel);\n\n this.categorySelect = createElement('select') as HTMLSelectElement;\n applyStyles(this.categorySelect, filterStyles.operatorSelect);\n\n // 添加分类选项\n this.categories.forEach(category => {\n const option = document.createElement('option');\n option.value = category.value;\n option.textContent = category.label;\n this.categorySelect.appendChild(option);\n });\n\n // 操作符选择下拉框\n const operatorLabel = createElement('label', {}, ['筛选条件:']);\n applyStyles(operatorLabel, filterStyles.formLabel);\n\n this.operatorSelect = createElement('select') as HTMLSelectElement;\n applyStyles(this.operatorSelect, filterStyles.operatorSelect);\n\n // 条件值输入框\n const valueLabel = createElement('label', {}, ['筛选值:']);\n applyStyles(valueLabel, filterStyles.formLabel);\n\n // 一个容器来包装两个输入框和\"和\"字\n const rangeInputContainer = createElement('div');\n applyStyles(rangeInputContainer, filterStyles.rangeInputContainer);\n\n this.valueInput = createElement('input', {\n type: 'text',\n placeholder: '请输入筛选值'\n }) as HTMLInputElement;\n applyStyles(this.valueInput, filterStyles.searchInput);\n\n // \"和\"字标签\n const andLabel = createElement('span', {}, ['和']);\n applyStyles(andLabel, filterStyles.addLabel);\n andLabel.style.display = 'none'; // 默认隐藏\n\n // 范围筛选的最大值输入框\n this.valueInputMax = createElement('input', {\n type: 'text',\n placeholder: '最大值'\n }) as HTMLInputElement;\n applyStyles(this.valueInputMax, filterStyles.searchInput);\n this.valueInputMax.style.display = 'none'; // 默认隐藏\n\n // 将输入框和\"和\"字添加到容器中\n rangeInputContainer.appendChild(this.valueInput);\n rangeInputContainer.appendChild(andLabel);\n rangeInputContainer.appendChild(this.valueInputMax);\n\n // 将元素添加到容器中\n conditionContainer.appendChild(categoryLabel);\n conditionContainer.appendChild(this.categorySelect);\n conditionContainer.appendChild(operatorLabel);\n conditionContainer.appendChild(this.operatorSelect);\n conditionContainer.appendChild(valueLabel);\n conditionContainer.appendChild(rangeInputContainer);\n\n this.filterByConditionPanel.appendChild(conditionContainer);\n container.appendChild(this.filterByConditionPanel);\n\n // 默认隐藏\n this.hide();\n\n // 初始化操作符选项\n this.updateOperatorOptions();\n this.bindEvents();\n }\n\n /**\n * 绑定事件\n */\n private bindEvents(): void {\n // 输入框回车事件\n this.valueInput.addEventListener('keypress', event => {\n if (event.key === 'Enter') {\n this.applyFilter();\n }\n });\n\n // 最大值输入框回车事件\n this.valueInputMax.addEventListener('keypress', event => {\n if (event.key === 'Enter') {\n this.applyFilter();\n }\n });\n\n // 分类切换事件\n this.categorySelect.addEventListener('change', () => {\n this.handleCategoryChange();\n });\n\n // 操作符切换事件\n this.operatorSelect.addEventListener('change', () => {\n const selectedOperator = this.operatorSelect.value as FilterOperator;\n const andLabel = this.valueInput.nextElementSibling as HTMLElement;\n\n if (this.isRangeOperator(selectedOperator)) {\n this.valueInput.placeholder = '最小值';\n this.valueInputMax.style.display = 'inline-block';\n andLabel.style.display = 'inline-block';\n } else {\n this.valueInput.placeholder = '请输入筛选值';\n this.valueInputMax.style.display = 'none';\n andLabel.style.display = 'none';\n }\n });\n }\n\n /**\n * 显示筛选面板\n */\n show(): void {\n if (this.filterByConditionPanel) {\n this.filterByConditionPanel.style.display = 'block';\n this.loadCurrentFilterState();\n }\n }\n\n /**\n * 隐藏筛选面板\n */\n hide(): void {\n if (this.filterByConditionPanel) {\n this.filterByConditionPanel.style.display = 'none';\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type * as VTable from '@visactor/vtable';
|
|
2
|
+
import type { FilterState } from './types';
|
|
3
|
+
export declare class FilterEngine {
|
|
4
|
+
filterFuncRule: (VTable.TYPES.FilterFuncRule & {
|
|
5
|
+
fieldId?: string;
|
|
6
|
+
})[];
|
|
7
|
+
filterValueRule: VTable.TYPES.FilterValueRule[];
|
|
8
|
+
applyFilter(state: FilterState, table: VTable.ListTable | VTable.PivotTable): void;
|
|
9
|
+
private createFilterFunction;
|
|
10
|
+
private compareValues;
|
|
11
|
+
clearAllFilter(table: VTable.ListTable | VTable.PivotTable): void;
|
|
12
|
+
clearFilter(table: VTable.ListTable | VTable.PivotTable, fieldId: string | number): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export class FilterEngine {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.filterFuncRule = [], this.filterValueRule = [];
|
|
4
|
+
}
|
|
5
|
+
applyFilter(state, table) {
|
|
6
|
+
const {filters: filters} = state;
|
|
7
|
+
this.filterFuncRule = [], this.filterValueRule = [], filters.forEach(((filter, field) => {
|
|
8
|
+
if (filter.enable) if ("byValue" === filter.type) this.filterValueRule.push({
|
|
9
|
+
filterKey: String(filter.field),
|
|
10
|
+
filteredValues: filter.values
|
|
11
|
+
}); else if ("byCondition" === filter.type) {
|
|
12
|
+
const filterFunc = this.createFilterFunction(filter);
|
|
13
|
+
this.filterFuncRule.push({
|
|
14
|
+
filterFunc: filterFunc,
|
|
15
|
+
fieldId: String(filter.field)
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
})), table.updateFilterRules([ ...this.filterFuncRule, ...this.filterValueRule ]);
|
|
19
|
+
}
|
|
20
|
+
createFilterFunction(filter) {
|
|
21
|
+
const {field: field, operator: operator, condition: condition} = filter;
|
|
22
|
+
return operator && void 0 !== condition ? record => {
|
|
23
|
+
const value = record[field];
|
|
24
|
+
if (null == value) return !1;
|
|
25
|
+
switch (operator) {
|
|
26
|
+
case "equals":
|
|
27
|
+
return 0 === this.compareValues(value, condition);
|
|
28
|
+
|
|
29
|
+
case "notEquals":
|
|
30
|
+
return 0 !== this.compareValues(value, condition);
|
|
31
|
+
|
|
32
|
+
case "greaterThan":
|
|
33
|
+
return this.compareValues(value, condition) > 0;
|
|
34
|
+
|
|
35
|
+
case "lessThan":
|
|
36
|
+
return this.compareValues(value, condition) < 0;
|
|
37
|
+
|
|
38
|
+
case "greaterThanOrEqual":
|
|
39
|
+
return this.compareValues(value, condition) >= 0;
|
|
40
|
+
|
|
41
|
+
case "lessThanOrEqual":
|
|
42
|
+
return this.compareValues(value, condition) <= 0;
|
|
43
|
+
|
|
44
|
+
case "between":
|
|
45
|
+
return !Array.isArray(condition) || 2 !== condition.length || this.compareValues(value, condition[0]) >= 0 && this.compareValues(value, condition[1]) <= 0;
|
|
46
|
+
|
|
47
|
+
case "notBetween":
|
|
48
|
+
return !Array.isArray(condition) || 2 !== condition.length || (this.compareValues(value, condition[0]) < 0 || this.compareValues(value, condition[1]) > 0);
|
|
49
|
+
|
|
50
|
+
case "contains":
|
|
51
|
+
return String(value).toLowerCase().includes(String(condition).toLowerCase());
|
|
52
|
+
|
|
53
|
+
case "notContains":
|
|
54
|
+
return !String(value).toLowerCase().includes(String(condition).toLowerCase());
|
|
55
|
+
|
|
56
|
+
case "startsWith":
|
|
57
|
+
return String(value).toLowerCase().startsWith(String(condition).toLowerCase());
|
|
58
|
+
|
|
59
|
+
case "notStartsWith":
|
|
60
|
+
return !String(value).toLowerCase().startsWith(String(condition).toLowerCase());
|
|
61
|
+
|
|
62
|
+
case "endsWith":
|
|
63
|
+
return String(value).toLowerCase().endsWith(String(condition).toLowerCase());
|
|
64
|
+
|
|
65
|
+
case "notEndsWith":
|
|
66
|
+
return !String(value).toLowerCase().endsWith(String(condition).toLowerCase());
|
|
67
|
+
|
|
68
|
+
case "isChecked":
|
|
69
|
+
return !0 === Boolean(value);
|
|
70
|
+
|
|
71
|
+
case "isUnchecked":
|
|
72
|
+
return !1 === Boolean(value);
|
|
73
|
+
|
|
74
|
+
default:
|
|
75
|
+
return !0;
|
|
76
|
+
}
|
|
77
|
+
} : () => !0;
|
|
78
|
+
}
|
|
79
|
+
compareValues(value, condition) {
|
|
80
|
+
if ("number" == typeof value && "number" == typeof condition) return value === condition ? 0 : value > condition ? 1 : -1;
|
|
81
|
+
if ("boolean" == typeof value && "boolean" == typeof condition) return value === condition ? 0 : -1;
|
|
82
|
+
const valueStr = String(value).toLowerCase(), conditionStr = String(condition).toLowerCase();
|
|
83
|
+
return valueStr === conditionStr ? 0 : valueStr > conditionStr ? 1 : -1;
|
|
84
|
+
}
|
|
85
|
+
clearAllFilter(table) {
|
|
86
|
+
this.filterFuncRule = [], this.filterValueRule = [], table.updateFilterRules([]);
|
|
87
|
+
}
|
|
88
|
+
clearFilter(table, fieldId) {
|
|
89
|
+
this.filterValueRule = this.filterValueRule.filter((rule => rule.filterKey !== fieldId)),
|
|
90
|
+
this.filterFuncRule = this.filterFuncRule.filter((rule => rule.fieldId !== fieldId)),
|
|
91
|
+
table.updateFilterRules([ ...this.filterFuncRule, ...this.filterValueRule ]);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=filter-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/filter/filter-engine.ts"],"names":[],"mappings":"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","file":"filter-engine.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport type { FilterState, FilterOperator, FilterConfig } from './types';\n\n/**\n * 筛选引擎,用于进行实际的筛选操作\n */\nexport class FilterEngine {\n filterFuncRule: (VTable.TYPES.FilterFuncRule & { fieldId?: string })[] = [];\n filterValueRule: VTable.TYPES.FilterValueRule[] = [];\n\n applyFilter(state: FilterState, table: VTable.ListTable | VTable.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 }\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 const valueStr = String(value).toLowerCase();\n const conditionStr = String(condition).toLowerCase();\n return valueStr === conditionStr ? 0 : valueStr > conditionStr ? 1 : -1;\n }\n\n clearAllFilter(table: VTable.ListTable | VTable.PivotTable) {\n this.filterFuncRule = [];\n this.filterValueRule = [];\n table.updateFilterRules([]);\n }\n\n clearFilter(table: VTable.ListTable | VTable.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"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type * as VTable from '@visactor/vtable';
|
|
2
|
+
import type { FilterState, FilterAction, FilterConfig } from './types';
|
|
3
|
+
import type { FilterEngine } from './filter-engine';
|
|
4
|
+
export declare class FilterStateManager {
|
|
5
|
+
private state;
|
|
6
|
+
private engine;
|
|
7
|
+
private listeners;
|
|
8
|
+
private table;
|
|
9
|
+
constructor(table: VTable.ListTable | VTable.PivotTable, engine: FilterEngine);
|
|
10
|
+
getFilterState(fieldId?: string | number): FilterConfig;
|
|
11
|
+
getActiveFilterFields(): (string | number)[];
|
|
12
|
+
getAllFilterStates(): FilterState;
|
|
13
|
+
reapplyCurrentFilters(): void;
|
|
14
|
+
dispatch(action: FilterAction): void;
|
|
15
|
+
subscribe(listener: (state: FilterState) => void): () => void;
|
|
16
|
+
private notifyListeners;
|
|
17
|
+
private reduce;
|
|
18
|
+
private applyFilters;
|
|
19
|
+
private updateColumnIcons;
|
|
20
|
+
private shouldApplyFilter;
|
|
21
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { FilterActionType } from "./types";
|
|
2
|
+
|
|
3
|
+
export class FilterStateManager {
|
|
4
|
+
constructor(table, engine) {
|
|
5
|
+
this.listeners = [], this.state = {
|
|
6
|
+
filters: new Map
|
|
7
|
+
}, this.engine = engine, this.table = table;
|
|
8
|
+
}
|
|
9
|
+
getFilterState(fieldId) {
|
|
10
|
+
return this.state.filters.get(fieldId);
|
|
11
|
+
}
|
|
12
|
+
getActiveFilterFields() {
|
|
13
|
+
const activeFields = [];
|
|
14
|
+
return this.state.filters.forEach(((config, field) => {
|
|
15
|
+
config.enable && activeFields.push(field);
|
|
16
|
+
})), activeFields;
|
|
17
|
+
}
|
|
18
|
+
getAllFilterStates() {
|
|
19
|
+
return this.state;
|
|
20
|
+
}
|
|
21
|
+
reapplyCurrentFilters() {
|
|
22
|
+
this.getActiveFilterFields().length > 0 && this.applyFilters();
|
|
23
|
+
}
|
|
24
|
+
dispatch(action) {
|
|
25
|
+
this.state = this.reduce(this.state, action), this.shouldApplyFilter(action) && this.applyFilters(),
|
|
26
|
+
this.notifyListeners();
|
|
27
|
+
}
|
|
28
|
+
subscribe(listener) {
|
|
29
|
+
return this.listeners.push(listener), () => {
|
|
30
|
+
this.listeners = this.listeners.filter((l => l !== listener));
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
notifyListeners() {
|
|
34
|
+
this.listeners.forEach((listener => listener(this.state)));
|
|
35
|
+
}
|
|
36
|
+
reduce(state, action) {
|
|
37
|
+
const {type: type, payload: payload} = action, newFilter = new Map(state.filters);
|
|
38
|
+
switch (type) {
|
|
39
|
+
case FilterActionType.ADD_FILTER:
|
|
40
|
+
newFilter.set(payload.field, payload);
|
|
41
|
+
break;
|
|
42
|
+
|
|
43
|
+
case FilterActionType.REMOVE_FILTER:
|
|
44
|
+
newFilter.delete(payload.field);
|
|
45
|
+
break;
|
|
46
|
+
|
|
47
|
+
case FilterActionType.UPDATE_FILTER:
|
|
48
|
+
newFilter.set(payload.field, Object.assign(Object.assign({}, newFilter.get(payload.field)), payload));
|
|
49
|
+
break;
|
|
50
|
+
|
|
51
|
+
case FilterActionType.ENABLE_FILTER:
|
|
52
|
+
newFilter.set(payload.field, Object.assign(Object.assign({}, newFilter.get(payload.field)), {
|
|
53
|
+
enable: !0
|
|
54
|
+
}));
|
|
55
|
+
break;
|
|
56
|
+
|
|
57
|
+
case FilterActionType.DISABLE_FILTER:
|
|
58
|
+
newFilter.set(payload.field, Object.assign(Object.assign({}, newFilter.get(payload.field)), {
|
|
59
|
+
enable: !1
|
|
60
|
+
}));
|
|
61
|
+
break;
|
|
62
|
+
|
|
63
|
+
case FilterActionType.CLEAR_ALL_FILTERS:
|
|
64
|
+
newFilter.clear();
|
|
65
|
+
break;
|
|
66
|
+
|
|
67
|
+
case FilterActionType.APPLY_FILTERS:
|
|
68
|
+
newFilter.set(payload.field, Object.assign(Object.assign(Object.assign({}, newFilter.get(payload.field)), payload), {
|
|
69
|
+
enable: !0
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
return Object.assign(Object.assign({}, state), {
|
|
73
|
+
filters: newFilter
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
applyFilters() {
|
|
77
|
+
this.engine.applyFilter(this.state, this.table), this.updateColumnIcons();
|
|
78
|
+
}
|
|
79
|
+
updateColumnIcons() {
|
|
80
|
+
const columns = this.table.columns;
|
|
81
|
+
if (!columns) return;
|
|
82
|
+
const plugin = this.table.pluginManager.getPluginByName("Filter");
|
|
83
|
+
if (!plugin || !plugin.pluginOptions) return;
|
|
84
|
+
const filterIcon = plugin.pluginOptions.filterIcon, filteringIcon = plugin.pluginOptions.filteringIcon;
|
|
85
|
+
columns.forEach(((col, index) => {
|
|
86
|
+
const field = col.field, filterConfig = this.state.filters.get(field);
|
|
87
|
+
!plugin.shouldEnableFilterForColumn || plugin.shouldEnableFilterForColumn(index, col) ? filterConfig && filterConfig.enable ? col.headerIcon = filteringIcon : col.headerIcon = filterIcon : col.headerIcon !== filterIcon && col.headerIcon !== filteringIcon || delete col.headerIcon;
|
|
88
|
+
})), this.table.updateColumns(columns);
|
|
89
|
+
}
|
|
90
|
+
shouldApplyFilter(action) {
|
|
91
|
+
return [ FilterActionType.REMOVE_FILTER, FilterActionType.ENABLE_FILTER, FilterActionType.DISABLE_FILTER, FilterActionType.CLEAR_ALL_FILTERS, FilterActionType.APPLY_FILTERS ].includes(action.type) || action.payload.enable;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=filter-state-manager.js.map
|
|
@@ -0,0 +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 * as VTable from '@visactor/vtable';\nimport type { FilterState, FilterAction, FilterConfig } from './types';\nimport { FilterActionType } from './types';\nimport type { FilterEngine } from './filter-engine';\nimport type { FilterPlugin } from '../filter';\n\n/**\n * 筛选状态管理器,用于管理筛选状态\n */\nexport class FilterStateManager {\n private state: FilterState;\n private engine: FilterEngine;\n private listeners: Array<(state: FilterState) => void> = [];\n\n private table: VTable.ListTable | VTable.PivotTable;\n\n constructor(table: VTable.ListTable | VTable.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();\n }\n\n subscribe(listener: (state: FilterState) => void): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners(): void {\n this.listeners.forEach(listener => listener(this.state));\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 newFilter.set(payload.field, payload);\n break;\n case FilterActionType.REMOVE_FILTER:\n newFilter.delete(payload.field);\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 this.updateColumnIcons();\n }\n\n /**\n * 更新列图标状态\n */\n private updateColumnIcons() {\n const columns = (this.table as VTable.ListTable).columns;\n if (!columns) {\n return;\n }\n\n const plugin = this.table.pluginManager.getPluginByName('Filter') as FilterPlugin;\n if (!plugin || !plugin.pluginOptions) {\n return;\n }\n\n const filterIcon = plugin.pluginOptions.filterIcon;\n const filteringIcon = plugin.pluginOptions.filteringIcon;\n\n // 遍历所有列,更新图标\n columns.forEach((col: VTable.ColumnDefine, index: number) => {\n const field = col.field as string;\n const filterConfig = this.state.filters.get(field);\n\n // 首先检查这一列是否应该启用筛选功能\n const shouldEnableFilter = plugin.shouldEnableFilterForColumn\n ? plugin.shouldEnableFilterForColumn(index, col)\n : true;\n\n if (shouldEnableFilter) {\n // 如果该列有激活的筛选,则使用filteringIcon\n if (filterConfig && filterConfig.enable) {\n col.headerIcon = filteringIcon;\n } else {\n col.headerIcon = filterIcon;\n }\n } else {\n // 如果不应该启用筛选,则移除筛选图标\n if (col.headerIcon === filterIcon || col.headerIcon === filteringIcon) {\n delete col.headerIcon;\n }\n }\n });\n\n // 更新表格列定义\n (this.table as VTable.ListTable).updateColumns(columns);\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) || action.payload.enable;\n }\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type * as VTable from '@visactor/vtable';
|
|
2
|
+
import type { FilterStateManager } from './filter-state-manager';
|
|
3
|
+
import { ValueFilter } from './value-filter';
|
|
4
|
+
import { ConditionFilter } from './condition-filter';
|
|
5
|
+
import { FilterMode } from './types';
|
|
6
|
+
export declare class FilterToolbar {
|
|
7
|
+
table: VTable.ListTable | VTable.PivotTable;
|
|
8
|
+
filterStateManager: FilterStateManager;
|
|
9
|
+
valueFilter: ValueFilter | null;
|
|
10
|
+
conditionFilter: ConditionFilter | null;
|
|
11
|
+
activeTab: 'byValue' | 'byCondition';
|
|
12
|
+
isVisible: boolean;
|
|
13
|
+
selectedField: string | number | null;
|
|
14
|
+
filterModes: FilterMode[];
|
|
15
|
+
private filterMenu;
|
|
16
|
+
private filterMenuWidth;
|
|
17
|
+
private filterTabByValue;
|
|
18
|
+
private filterTabByCondition;
|
|
19
|
+
private clearFilterOptionLink;
|
|
20
|
+
private cancelFilterButton;
|
|
21
|
+
private applyFilterButton;
|
|
22
|
+
constructor(table: VTable.ListTable | VTable.PivotTable, filterStateManager: FilterStateManager);
|
|
23
|
+
private onTabSwitch;
|
|
24
|
+
private updateSelectedField;
|
|
25
|
+
private applyFilter;
|
|
26
|
+
private clearFilter;
|
|
27
|
+
render(container: HTMLElement): void;
|
|
28
|
+
attachEventListeners(): void;
|
|
29
|
+
show(col: number, row: number, filterModes: FilterMode[]): void;
|
|
30
|
+
hide(): void;
|
|
31
|
+
}
|