@visactor/vtable-plugins 1.22.4-alpha.11 → 1.22.4-alpha.13

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.
@@ -7,10 +7,10 @@ Object.defineProperty(exports, "__esModule", {
7
7
  const vutils_1 = require("@visactor/vutils"), types_1 = require("./types"), styles_1 = require("./styles");
8
8
 
9
9
  class ValueFilter {
10
- constructor(table, filterStateManager, styles) {
10
+ constructor(table, filterStateManager, pluginOptions) {
11
11
  this.uniqueKeys = new Map, this.displayToRawValueMap = new Map, this.valueFilterOptionList = new Map,
12
- this.table = table, this.filterStateManager = filterStateManager, this.styles = styles,
13
- this.filterStateManager.subscribe((state => {
12
+ this.table = table, this.filterStateManager = filterStateManager, this.pluginOptions = pluginOptions,
13
+ this.styles = pluginOptions.styles, this.filterStateManager.subscribe((state => {
14
14
  const filterState = state.filters.get(this.selectedField);
15
15
  filterState && "byValue" === filterState.type && this.updateUI(filterState);
16
16
  }));
@@ -40,8 +40,9 @@ class ValueFilter {
40
40
  for (let i = 0; i < recordsLength; i++) {
41
41
  let rawValue, displayValue;
42
42
  if (-1 !== targetCol) {
43
- const row = this.table.columnHeaderLevelCount + i;
44
- rawValue = records[i][fieldId];
43
+ const row = this.table.columnHeaderLevelCount + i, currentRecord = records[i];
44
+ if (null == currentRecord) continue;
45
+ rawValue = currentRecord[fieldId];
45
46
  const bodyInfo = this.table.internalProps.layoutMap.getBody(targetCol, row);
46
47
  displayValue = bodyInfo && "fieldFormat" in bodyInfo && bodyInfo.fieldFormat && "function" == typeof bodyInfo.fieldFormat ? bodyInfo.fieldFormat({
47
48
  [fieldId]: rawValue
@@ -139,9 +140,9 @@ class ValueFilter {
139
140
  }
140
141
  }
141
142
  initFilterStateFromTableData(fieldId) {
142
- var _a, _b;
143
- const filter = this.filterStateManager.getFilterState(fieldId);
144
- if (null == filter ? void 0 : filter.enable) {
143
+ var _a, _b, _c, _d;
144
+ const filter = this.filterStateManager.getFilterState(fieldId), isEnable = null == filter ? void 0 : filter.enable, syncCheckboxCheckedState = null === (_b = null === (_a = this.pluginOptions) || void 0 === _a ? void 0 : _a.syncCheckboxCheckedState) || void 0 === _b || _b;
145
+ if (isEnable) {
145
146
  const selectedRawValues = new Set, displayToRawMap = this.displayToRawValueMap.get(fieldId);
146
147
  let targetCol = -1;
147
148
  for (let col = 0; col < this.table.colCount; col++) {
@@ -165,7 +166,7 @@ class ValueFilter {
165
166
  rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;
166
167
  null != rawValue && selectedRawValues.add(rawValue);
167
168
  }
168
- !(0, vutils_1.arrayEqual)(filter.values, Array.from(selectedRawValues)) && this.filterStateManager.dispatch({
169
+ !(0, vutils_1.arrayEqual)(filter.values, Array.from(selectedRawValues)) && syncCheckboxCheckedState && this.filterStateManager.dispatch({
169
170
  type: types_1.FilterActionType.UPDATE_FILTER,
170
171
  payload: {
171
172
  field: fieldId,
@@ -173,7 +174,7 @@ class ValueFilter {
173
174
  }
174
175
  });
175
176
  } else {
176
- const availableRawValues = (null === (_b = null === (_a = this.uniqueKeys.get(fieldId)) || void 0 === _a ? void 0 : _a.filter((item => item.count > 0))) || void 0 === _b ? void 0 : _b.map((item => item.rawValue)).filter((v => null != v))) || [];
177
+ const availableRawValues = (null === (_d = null === (_c = this.uniqueKeys.get(fieldId)) || void 0 === _c ? void 0 : _c.filter((item => !syncCheckboxCheckedState || item.count > 0))) || void 0 === _d ? void 0 : _d.map((item => item.rawValue)).filter((v => null != v))) || [];
177
178
  this.filterStateManager.dispatch({
178
179
  type: types_1.FilterActionType.ADD_FILTER,
179
180
  payload: {
@@ -189,11 +190,8 @@ class ValueFilter {
189
190
  if (!filter) return;
190
191
  const selectedRawValues = filter.values || [], displayToRawMap = this.displayToRawValueMap.get(filter.field), optionDomList = this.valueFilterOptionList.get(filter.field);
191
192
  null == optionDomList || optionDomList.forEach((optionDom => {
192
- var _a, _b;
193
193
  const displayValue = optionDom.originalValue, rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;
194
194
  optionDom.checkbox.checked = selectedRawValues.some((v => v === rawValue));
195
- const count = (null === (_b = null === (_a = this.uniqueKeys.get(filter.field)) || void 0 === _a ? void 0 : _a.find((key => String(key.value) === optionDom.id))) || void 0 === _b ? void 0 : _b.count) || 0;
196
- optionDom.checkbox.disabled = 0 === count;
197
195
  }));
198
196
  }
199
197
  syncSelectAllWithFilterState(filter) {
@@ -249,6 +247,9 @@ class ValueFilter {
249
247
  this.filterByValuePanel.append(this.searchContainer, this.optionsContainer), container.appendChild(this.filterByValuePanel),
250
248
  this.bindEventForFilterByValue();
251
249
  }
250
+ updatePluginOptions(pluginOptions) {
251
+ this.pluginOptions = pluginOptions, this.styles = pluginOptions.styles, this.updateStyles(pluginOptions.styles);
252
+ }
252
253
  updateStyles(styles) {
253
254
  var _a;
254
255
  (0, styles_1.applyStyles)(this.filterByValuePanel, styles.filterPanel), (0, styles_1.applyStyles)(this.searchContainer, styles.searchContainer),
@@ -269,7 +270,7 @@ class ValueFilter {
269
270
  (0, styles_1.applyStyles)(label, this.styles.optionLabel);
270
271
  const checkbox = document.createElement("input");
271
272
  checkbox.type = "checkbox", checkbox.value = String(value), checkbox.checked = selectedRawValueSet.has(rawValue),
272
- checkbox.disabled = 0 === count, (0, styles_1.applyStyles)(checkbox, this.styles.checkbox);
273
+ (0, styles_1.applyStyles)(checkbox, this.styles.checkbox);
273
274
  const countSpan = document.createElement("span");
274
275
  countSpan.textContent = String(count), (0, styles_1.applyStyles)(countSpan, this.styles.countSpan),
275
276
  label.append(checkbox, ` ${rawValue}`), itemDiv.append(label, countSpan), this.filterItemsContainer.appendChild(itemDiv);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/filter/value-filter.ts"],"names":[],"mappings":"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","file":"value-filter.js","sourcesContent":["import type { ListTable, PivotTable } from '@visactor/vtable';\nimport { arrayEqual, isValid } from '@visactor/vutils';\nimport type { FilterConfig, ValueFilterOptionDom, FilterState, FilterStyles } from './types';\nimport { FilterActionType } from './types';\nimport type { FilterStateManager } from './filter-state-manager';\nimport { applyStyles } from './styles';\n\nexport class ValueFilter {\n private table: ListTable | PivotTable;\n private filterStateManager: FilterStateManager;\n private styles: FilterStyles;\n private uniqueKeys = new Map<string | number, Array<{ value: any; count: number; rawValue: any }>>();\n private displayToRawValueMap = new Map<string | number, Map<any, any>>();\n private selectedField: string | number;\n\n private valueFilterOptionList: Map<string | number, ValueFilterOptionDom[]> = new Map();\n\n private filterByValuePanel: HTMLElement;\n private searchContainer: HTMLElement;\n private optionsContainer: HTMLElement;\n private selectAllItemDiv: HTMLElement;\n private selectAllLabel: HTMLElement;\n private filterByValueSearchInput: HTMLInputElement;\n private selectAllCheckbox: HTMLInputElement;\n private filterItemsContainer: HTMLElement;\n\n constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager, styles: FilterStyles) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n this.styles = styles;\n\n this.filterStateManager.subscribe((state: FilterState) => {\n const filterState = state.filters.get(this.selectedField);\n if (filterState && filterState.type === 'byValue') {\n this.updateUI(filterState);\n }\n });\n }\n\n updateUI(filterState: FilterConfig): void {\n this.syncCheckboxesWithFilterState(filterState);\n this.syncSelectAllWithFilterState(filterState);\n }\n\n setSelectedField(fieldId: string | number): void {\n this.selectedField = fieldId;\n this.collectUniqueColumnValues(fieldId);\n }\n\n collectUniqueColumnValues(fieldId: string | number, forceCollect: boolean = false): void {\n // 如果已经收集过,直接返回\n if (this.uniqueKeys.has(fieldId) && !forceCollect) {\n return;\n }\n\n const displayToRawMap = new Map<any, any>(); // displayValue -> rawValue\n\n // 找到第一个匹配字段的列位置,用于获取格式化数据\n let targetCol = -1;\n for (let col = 0; col < this.table.colCount; col++) {\n for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) {\n if (!this.table.internalProps.layoutMap.isHeader(col, row)) {\n const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);\n if (bodyInfo && bodyInfo.field === fieldId) {\n targetCol = col;\n break;\n }\n }\n }\n if (targetCol !== -1) {\n break;\n }\n }\n\n // 从原始数据收集候选值(不计数,只收集唯一值)\n const records = this.table.internalProps.records;\n const recordsLength = records.length;\n\n for (let i = 0; i < recordsLength; i++) {\n let rawValue;\n let displayValue;\n if (targetCol !== -1) {\n const row = this.table.columnHeaderLevelCount + i;\n const currentRecord = records[i];\n // 获取原始数据\n rawValue = currentRecord[fieldId];\n // 获取格式化显示数据\n const bodyInfo = this.table.internalProps.layoutMap.getBody(targetCol, row);\n if (\n bodyInfo &&\n 'fieldFormat' in bodyInfo &&\n bodyInfo.fieldFormat &&\n typeof bodyInfo.fieldFormat === 'function'\n ) {\n displayValue = bodyInfo.fieldFormat({ [fieldId]: rawValue });\n } else {\n displayValue = rawValue;\n }\n } else {\n rawValue = records[i][fieldId];\n displayValue = rawValue;\n }\n\n if (rawValue !== undefined && rawValue !== null && !displayToRawMap.has(displayValue)) {\n displayToRawMap.set(displayValue, rawValue);\n if (this.displayToRawValueMap.has(fieldId) && !this.displayToRawValueMap.get(fieldId)?.has(displayValue)) {\n if (this.filterStateManager.getFilterState(fieldId)?.values?.length > 0) {\n this.filterStateManager.getFilterState(fieldId).values.push(rawValue);\n }\n }\n }\n }\n\n // 保存显示值到原始值的映射关系\n this.displayToRawValueMap.set(fieldId, displayToRawMap);\n\n // 转换为所需格式,包含显示值、计数和原始值(count = 0 占位,后续会更新)\n const uniqueValues = Array.from(displayToRawMap.entries()).map(([displayValue, rawValue]) => ({\n value: displayValue, // UI显示的格式化值\n count: 0, // 计数占位,后续会根据筛选状态动态计算\n rawValue: rawValue // 对应的原始值\n }));\n\n this.uniqueKeys.set(fieldId, uniqueValues);\n }\n\n /**\n * 更新候选值列表的计数(基于当前筛选状态选择数据源)\n * - 未筛选列:使用当前表格数据(dataSource)计算计数\n * - 已筛选列:使用原始数据(records)计算计数\n */\n private updateCandidateCounts(fieldId: string | number): void {\n const uniqueValues = this.uniqueKeys.get(fieldId);\n if (!uniqueValues) {\n return;\n }\n\n // 判断当前列是否已启用筛选\n const filter = this.filterStateManager.getFilterState(fieldId);\n const isFiltered = filter?.enable;\n\n // 根据筛选状态选择数据源\n const dataSource = isFiltered\n ? this.table.internalProps.records // 已筛选:使用原始数据\n : this.table.internalProps.dataSource; // 未筛选:使用当前表格数据\n\n // 找到第一个匹配字段的列位置,用于获取格式化数据\n let targetCol = -1;\n for (let col = 0; col < this.table.colCount; col++) {\n for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) {\n if (!this.table.internalProps.layoutMap.isHeader(col, row)) {\n const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);\n if (bodyInfo && bodyInfo.field === fieldId) {\n targetCol = col;\n break;\n }\n }\n }\n if (targetCol !== -1) {\n break;\n }\n }\n\n // 计算每个候选值的计数\n const dataLength = dataSource.length;\n const countMap = new Map<any, number>();\n\n for (let i = 0; i < dataLength; i++) {\n let displayValue;\n if (targetCol !== -1) {\n const row = this.table.columnHeaderLevelCount + i;\n if (row < this.table.rowCount) {\n displayValue = this.table.getCellValue(targetCol, row);\n }\n } else {\n displayValue = this.table.getFieldData(\n String(fieldId),\n targetCol !== -1 ? targetCol : 0,\n this.table.columnHeaderLevelCount + i\n );\n }\n\n if (displayValue !== undefined && displayValue !== null) {\n countMap.set(displayValue, (countMap.get(displayValue) || 0) + 1);\n }\n }\n\n // 更新计数\n uniqueValues.forEach(item => {\n item.count = countMap.get(item.value) || 0;\n });\n }\n\n private onValueSelect(fieldId: string | number, displayValue: any, selected: boolean): void {\n // 获取显示值对应的原始值\n const displayToRawMap = this.displayToRawValueMap.get(fieldId);\n const rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n\n // 更新筛选状态\n const filter = this.filterStateManager.getFilterState(fieldId);\n let updatedValues: any[];\n if (!filter) {\n updatedValues = selected ? [rawValue] : [];\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: updatedValues\n }\n });\n } else {\n updatedValues = selected\n ? [...(filter.values || []), rawValue]\n : (filter.values || []).filter(v => v !== rawValue);\n this.filterStateManager.dispatch({\n type: FilterActionType.UPDATE_FILTER,\n payload: {\n field: fieldId,\n values: updatedValues\n }\n });\n }\n }\n\n /**\n * 检查值在当前搜索关键词下是否可见\n */\n private isValueVisible(displayValue: any, keyword: string): boolean {\n if (!keyword) {\n return true;\n }\n\n const filterKeywords = keyword\n .toUpperCase()\n .split(' ')\n .filter(s => s);\n\n const txtValue = String(displayValue).toUpperCase();\n return filterKeywords.some(keyword => txtValue.includes(keyword));\n }\n\n private toggleSelectAll(fieldId: string | number, selected: boolean): void {\n // 获取当前可见的值进行全选/取消全选\n const currentKeyword = this.filterStateManager.getCurrentSearchKeyword(fieldId);\n const stableCandidates = this.filterStateManager.getStableCandidateValues(fieldId);\n const displayToRawMap = this.displayToRawValueMap.get(fieldId);\n\n // 找出当前可见的所有值\n const visibleRawValues = stableCandidates\n .filter(candidate => this.isValueVisible(candidate.value, currentKeyword))\n .map(candidate => (displayToRawMap ? displayToRawMap.get(candidate.value) : candidate.value));\n\n const filter = this.filterStateManager.getFilterState(fieldId);\n const currentValues = new Set(filter?.values || []);\n\n let updatedValues: any[];\n if (selected) {\n // 全选:将可见的值添加到当前选中值中\n updatedValues = Array.from(new Set([...currentValues, ...visibleRawValues]));\n } else {\n // 取消全选:从当前选中值中移除可见的值\n updatedValues = Array.from(currentValues).filter(value => !visibleRawValues.includes(value));\n }\n\n if (!filter) {\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: updatedValues,\n enable: true\n }\n });\n } else {\n this.filterStateManager.dispatch({\n type: FilterActionType.UPDATE_FILTER,\n payload: {\n field: fieldId,\n values: updatedValues\n }\n });\n }\n }\n\n private onSearch(fieldId: string | number, value: string): void {\n // 更新 FilterStateManager 中的搜索关键词\n this.filterStateManager.updateSearchKeyword(fieldId, value);\n\n // 更新UI显示\n const items = this.valueFilterOptionList.get(fieldId);\n const filterKeywords = value\n .toUpperCase()\n .split(' ')\n .filter(s => s);\n\n for (const item of items) {\n const txtValue = item.id.toUpperCase() || '';\n const match = filterKeywords.some(keyword => txtValue.includes(keyword));\n const isVisible = filterKeywords.length === 0 || match;\n\n item.itemContainer.style.display = isVisible ? 'flex' : 'none';\n }\n }\n\n /**\n * 根据当前表格中的数据,初始化或更新 filter 的被选状态\n * 如果筛选已启用(enable=true),收集当前显示的数据作为选中项\n * 如果筛选未启用,初始化为所有值都选中\n */\n private initFilterStateFromTableData(fieldId: string | number): void {\n const filter = this.filterStateManager.getFilterState(fieldId);\n const isEnable = filter?.enable;\n\n // 如果筛选已启用,使用当前显示的数据作为选中值\n if (isEnable) {\n const selectedRawValues = new Set();\n const displayToRawMap = this.displayToRawValueMap.get(fieldId);\n\n // 找到第一个匹配字段的列位置,用于获取格式化数据\n let targetCol = -1;\n for (let col = 0; col < this.table.colCount; col++) {\n for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) {\n if (!this.table.internalProps.layoutMap.isHeader(col, row)) {\n const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);\n if (bodyInfo && bodyInfo.field === fieldId) {\n targetCol = col;\n break;\n }\n }\n }\n if (targetCol !== -1) {\n break;\n }\n }\n\n // 收集当前显示的数据对应的原始值\n const dataSource = this.table.internalProps.dataSource;\n const currentLength = dataSource.length;\n\n for (let i = 0; i < currentLength; i++) {\n let displayValue;\n let rawValue;\n if (targetCol !== -1) {\n const row = this.table.columnHeaderLevelCount + i;\n if (row < this.table.rowCount) {\n // 获取格式化显示值\n displayValue = this.table.getCellValue(targetCol, row);\n // 通过映射获取对应的原始值\n rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n }\n } else {\n displayValue = this.table.getFieldData(\n String(fieldId),\n targetCol !== -1 ? targetCol : 0,\n this.table.columnHeaderLevelCount + i\n );\n rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n }\n\n if (rawValue !== undefined && rawValue !== null) {\n selectedRawValues.add(rawValue);\n }\n }\n\n const hasChanged = !arrayEqual(filter.values, Array.from(selectedRawValues));\n if (hasChanged) {\n this.filterStateManager.dispatch({\n type: FilterActionType.UPDATE_FILTER,\n payload: {\n field: fieldId,\n values: Array.from(selectedRawValues)\n }\n });\n }\n } else {\n // 如果筛选未启用,初始化为计数>0的值都选中(但不启用筛选)\n // 此处,不应该判断: 未开启filter时filter.values中仍然可能会被其他筛选器联动的数据\n // if (!filter) {\n const availableRawValues =\n this.uniqueKeys\n .get(fieldId)\n ?.filter(item => item.count > 0) // 只选中计数>0的值\n ?.map(item => item.rawValue)\n .filter(v => v !== undefined && v !== null) || [];\n\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: availableRawValues,\n enable: false // 初始状态为未启用\n }\n });\n // }\n }\n }\n\n /**\n * 根据 filter 的数据状态,更新 UI\n */\n private syncCheckboxesWithFilterState(filter: FilterConfig): void {\n if (!filter) {\n return;\n }\n const selectedRawValues = filter.values || [];\n const displayToRawMap = this.displayToRawValueMap.get(filter.field);\n const optionDomList = this.valueFilterOptionList.get(filter.field);\n\n optionDomList?.forEach(optionDom => {\n // optionDom.id 是显示值,需要转换为原始值进行比较\n const displayValue = optionDom.originalValue;\n const rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n\n // 检查原始值是否在选中的原始值列表中\n optionDom.checkbox.checked = selectedRawValues.some(v => v === rawValue);\n\n // 同步禁用状态:计数为0时禁用复选框\n const count = this.uniqueKeys.get(filter.field)?.find(key => String(key.value) === optionDom.id)?.count || 0;\n optionDom.checkbox.disabled = count === 0;\n });\n }\n\n /**\n * 根据 filter 的数据状态,更新 UI\n */\n private syncSelectAllWithFilterState(filter: FilterConfig): void {\n if (!filter || !filter.values) {\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = false;\n return;\n }\n\n const uniqueValuesCount = this.uniqueKeys.get(filter.field)?.length || 0;\n if (uniqueValuesCount === 0) {\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = false;\n } else if (filter.values.length === 0) {\n // 没有选中任何值\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = false;\n } else if (filter.values.length === uniqueValuesCount) {\n // 所有值都被选中\n this.selectAllCheckbox.checked = true;\n this.selectAllCheckbox.indeterminate = false;\n } else {\n // 部分值被选中\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = true;\n }\n }\n\n applyFilter(fieldId: string | number = this.selectedField): void {\n // 获取当前搜索过滤后可见的选中值\n // const visibleSelectedKeys = Array.from(this.filterStateManager.getVisibleSelectedValues(fieldId));\n\n // 业务侧期望: 搜索出来的结果作为原有筛选结果的增项,而不覆盖原有筛选结果\n const filter = this.filterStateManager.getFilterState(fieldId);\n const allSelectedValues = filter.values;\n if (allSelectedValues.length >= 0 && allSelectedValues.length < this.uniqueKeys.get(fieldId)?.length) {\n this.filterStateManager.dispatch({\n type: FilterActionType.APPLY_FILTERS,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: allSelectedValues,\n enable: true\n }\n });\n } else {\n this.filterStateManager.dispatch({\n type: FilterActionType.REMOVE_FILTER,\n payload: {\n field: fieldId\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 render(container: HTMLElement): void {\n // === 按值筛选的菜单内容 ===\n this.filterByValuePanel = document.createElement('div');\n applyStyles(this.filterByValuePanel, this.styles.filterPanel);\n\n // -- 搜索栏 ---\n this.searchContainer = document.createElement('div');\n applyStyles(this.searchContainer, this.styles.searchContainer);\n\n this.filterByValueSearchInput = document.createElement('input');\n this.filterByValueSearchInput.type = 'text';\n this.filterByValueSearchInput.placeholder = this.styles.searchInput?.placeholder || '可使用空格分隔多个关键词';\n applyStyles(this.filterByValueSearchInput, this.styles.searchInput);\n\n this.searchContainer.appendChild(this.filterByValueSearchInput);\n\n // --- 筛选选项 ---\n this.optionsContainer = document.createElement('div');\n applyStyles(this.optionsContainer, this.styles.optionsContainer);\n\n this.selectAllItemDiv = document.createElement('div');\n applyStyles(this.selectAllItemDiv, this.styles.optionItem);\n\n this.selectAllLabel = document.createElement('label');\n applyStyles(this.selectAllLabel, this.styles.optionLabel);\n\n this.selectAllCheckbox = document.createElement('input');\n this.selectAllCheckbox.type = 'checkbox';\n this.selectAllCheckbox.checked = true; // 默认全选\n applyStyles(this.selectAllCheckbox, this.styles.checkbox);\n\n this.selectAllLabel.append(this.selectAllCheckbox, ' 全选');\n this.selectAllItemDiv.appendChild(this.selectAllLabel);\n\n this.filterItemsContainer = document.createElement('div'); // 筛选条目的容器,后续应动态 appendChild\n\n this.optionsContainer.append(this.selectAllItemDiv, this.filterItemsContainer);\n this.filterByValuePanel.append(this.searchContainer, this.optionsContainer);\n\n container.appendChild(this.filterByValuePanel);\n\n this.bindEventForFilterByValue();\n }\n\n updateStyles(styles: FilterStyles): void {\n applyStyles(this.filterByValuePanel, styles.filterPanel);\n applyStyles(this.searchContainer, styles.searchContainer);\n this.filterByValueSearchInput.placeholder = styles.searchInput?.placeholder || '可使用空格分隔多个关键词';\n applyStyles(this.filterByValueSearchInput, styles.searchInput);\n applyStyles(this.optionsContainer, styles.optionsContainer);\n applyStyles(this.selectAllItemDiv, styles.optionItem);\n applyStyles(this.selectAllLabel, styles.optionLabel);\n applyStyles(this.selectAllCheckbox, styles.checkbox);\n }\n\n private renderFilterOptions(field: string | number): void {\n this.filterItemsContainer.innerHTML = '';\n this.valueFilterOptionList.delete(field);\n this.valueFilterOptionList.set(field, []);\n\n const selectedRawValues = this.filterStateManager.getFilterState(field)?.values || [];\n // 为了优化复杂度,将原始值转换为Set进行快速查找\n const selectedRawValueSet = new Set(selectedRawValues);\n\n const itemDomList: ValueFilterOptionDom[] = [];\n this.uniqueKeys.get(field)?.forEach(({ value, count, rawValue }) => {\n const itemDiv = document.createElement('div');\n applyStyles(itemDiv, this.styles.optionItem);\n itemDiv.style.display = 'flex';\n\n const label = document.createElement('label');\n applyStyles(label, this.styles.optionLabel);\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.value = String(value); // 显示值作为checkbox的value\n // 使用原始值进行选中状态判断,优化为O(1)复杂度\n checkbox.checked = selectedRawValueSet.has(rawValue);\n // 计数为0时禁用复选框(不可选中)\n checkbox.disabled = count === 0;\n applyStyles(checkbox, this.styles.checkbox);\n\n const countSpan = document.createElement('span');\n countSpan.textContent = String(count);\n applyStyles(countSpan, this.styles.countSpan);\n\n label.append(checkbox, ` ${rawValue}`); // UI显示原始值\n itemDiv.append(label, countSpan);\n this.filterItemsContainer.appendChild(itemDiv);\n\n const itemDom: ValueFilterOptionDom = {\n id: String(value), // 显示值作为id,用于UI交互\n originalValue: value,\n itemContainer: itemDiv,\n checkbox: checkbox,\n countSpan: countSpan\n };\n\n itemDomList.push(itemDom);\n });\n\n this.valueFilterOptionList.set(field, itemDomList);\n }\n\n bindEventForFilterByValue(): void {\n // 事件委托:搜索框的 keyup 事件\n this.filterByValuePanel.addEventListener('keyup', (event: KeyboardEvent) => {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.type === 'text') {\n const value = target.value;\n this.onSearch(this.selectedField, value);\n }\n });\n\n // 事件委托:复选框的 change 事件\n // 只改变UI状态,不更新筛选状态\n // 因为只有点击确认后,筛选状态才能落库\n this.filterByValuePanel.addEventListener('change', (event: Event) => {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.type === 'checkbox') {\n if (target === this.selectAllCheckbox) {\n this.valueFilterOptionList.get(this.selectedField).forEach(item => (item.checkbox.checked = target.checked));\n } else {\n this.updateCheckboxUI(this.selectedField);\n }\n }\n });\n }\n\n updateCheckboxUI(field: string | number): void {\n const checkedItem = this.valueFilterOptionList.get(field)?.filter(item => item.checkbox.checked);\n const uncheckedItem = this.valueFilterOptionList.get(field)?.filter(item => !item.checkbox.checked);\n if (!isValid(checkedItem) || !isValid(uncheckedItem)) {\n return;\n }\n if (checkedItem.length !== 0 && uncheckedItem.length !== 0) {\n this.selectAllCheckbox.indeterminate = true;\n } else {\n this.selectAllCheckbox.indeterminate = false;\n this.selectAllCheckbox.checked = uncheckedItem.length === 0;\n }\n }\n\n updateCheckboxState(field: string | number): void {\n const originalValues: any = this.valueFilterOptionList\n .get(field)\n ?.filter(item => item.checkbox.checked)\n .map(item => item.originalValue);\n // 获取显示值对应的原始值\n const displayToRawMap = this.displayToRawValueMap.get(field);\n const rawValues = originalValues.map((displayValue: any) => {\n return displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n });\n // 更新筛选状态\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: field,\n type: 'byValue',\n values: rawValues\n }\n });\n }\n\n show(): void {\n // 1. 收集候选值(来自原始数据)\n this.collectUniqueColumnValues(this.selectedField);\n\n // 2. 更新计数(根据筛选状态选择数据源)\n this.updateCandidateCounts(this.selectedField);\n\n // 3. 初始化筛选状态(必须在 renderFilterOptions 之前执行)\n this.initFilterStateFromTableData(this.selectedField);\n\n // 4. 初始化筛选菜单状态,确保候选值列表稳定,并清空搜索关键词\n const uniqueValues = this.uniqueKeys.get(this.selectedField);\n const displayToRawMap = this.displayToRawValueMap.get(this.selectedField);\n if (uniqueValues && displayToRawMap) {\n this.filterStateManager.initializeFilterMenuState(this.selectedField, uniqueValues, displayToRawMap);\n }\n\n // 5. 清空搜索框\n if (this.filterByValueSearchInput) {\n this.filterByValueSearchInput.value = '';\n }\n // 6. 渲染选项(此时状态已经初始化完成)\n this.renderFilterOptions(this.selectedField);\n // 7. 同步全选状态(必须放在render之后, 只有这样checkbox ui才能与state同步, 此时需要做的是同步全选状态)\n this.updateCheckboxUI(this.selectedField);\n this.filterByValuePanel.style.display = 'block';\n }\n\n hide(): void {\n this.filterByValuePanel.style.display = 'none';\n }\n\n clearSearchInputValue(): void {\n this.filterByValueSearchInput.value = '';\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/filter/value-filter.ts"],"names":[],"mappings":"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","file":"value-filter.js","sourcesContent":["import type { ListTable, PivotTable } from '@visactor/vtable';\nimport { arrayEqual, isValid } from '@visactor/vutils';\nimport type { FilterConfig, ValueFilterOptionDom, FilterState, FilterStyles, FilterOptions } from './types';\nimport { FilterActionType } from './types';\nimport type { FilterStateManager } from './filter-state-manager';\nimport { applyStyles } from './styles';\n\nexport class ValueFilter {\n private table: ListTable | PivotTable;\n private filterStateManager: FilterStateManager;\n private pluginOptions: FilterOptions;\n private styles: FilterStyles;\n private uniqueKeys = new Map<string | number, Array<{ value: any; count: number; rawValue: any }>>();\n private displayToRawValueMap = new Map<string | number, Map<any, any>>();\n private selectedField: string | number;\n\n private valueFilterOptionList: Map<string | number, ValueFilterOptionDom[]> = new Map();\n\n private filterByValuePanel: HTMLElement;\n private searchContainer: HTMLElement;\n private optionsContainer: HTMLElement;\n private selectAllItemDiv: HTMLElement;\n private selectAllLabel: HTMLElement;\n private filterByValueSearchInput: HTMLInputElement;\n private selectAllCheckbox: HTMLInputElement;\n private filterItemsContainer: HTMLElement;\n\n constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager, pluginOptions: FilterOptions) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n this.pluginOptions = pluginOptions;\n this.styles = pluginOptions.styles;\n\n this.filterStateManager.subscribe((state: FilterState) => {\n const filterState = state.filters.get(this.selectedField);\n if (filterState && filterState.type === 'byValue') {\n this.updateUI(filterState);\n }\n });\n }\n\n updateUI(filterState: FilterConfig): void {\n this.syncCheckboxesWithFilterState(filterState);\n this.syncSelectAllWithFilterState(filterState);\n }\n\n setSelectedField(fieldId: string | number): void {\n this.selectedField = fieldId;\n this.collectUniqueColumnValues(fieldId);\n }\n\n collectUniqueColumnValues(fieldId: string | number, forceCollect: boolean = false): void {\n // 如果已经收集过,直接返回\n if (this.uniqueKeys.has(fieldId) && !forceCollect) {\n return;\n }\n\n const displayToRawMap = new Map<any, any>(); // displayValue -> rawValue\n\n // 找到第一个匹配字段的列位置,用于获取格式化数据\n let targetCol = -1;\n for (let col = 0; col < this.table.colCount; col++) {\n for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) {\n if (!this.table.internalProps.layoutMap.isHeader(col, row)) {\n const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);\n if (bodyInfo && bodyInfo.field === fieldId) {\n targetCol = col;\n break;\n }\n }\n }\n if (targetCol !== -1) {\n break;\n }\n }\n\n // 从原始数据收集候选值(不计数,只收集唯一值)\n const records = this.table.internalProps.records;\n const recordsLength = records.length;\n\n for (let i = 0; i < recordsLength; i++) {\n let rawValue;\n let displayValue;\n if (targetCol !== -1) {\n const row = this.table.columnHeaderLevelCount + i;\n const currentRecord = records[i];\n // 空行不做处理\n if (currentRecord === null || currentRecord === undefined) {\n continue;\n }\n // 获取原始数据\n rawValue = currentRecord[fieldId];\n // 获取格式化显示数据\n const bodyInfo = this.table.internalProps.layoutMap.getBody(targetCol, row);\n if (\n bodyInfo &&\n 'fieldFormat' in bodyInfo &&\n bodyInfo.fieldFormat &&\n typeof bodyInfo.fieldFormat === 'function'\n ) {\n displayValue = bodyInfo.fieldFormat({ [fieldId]: rawValue });\n } else {\n displayValue = rawValue;\n }\n } else {\n rawValue = records[i][fieldId];\n displayValue = rawValue;\n }\n\n if (rawValue !== undefined && rawValue !== null && !displayToRawMap.has(displayValue)) {\n displayToRawMap.set(displayValue, rawValue);\n if (this.displayToRawValueMap.has(fieldId) && !this.displayToRawValueMap.get(fieldId)?.has(displayValue)) {\n if (this.filterStateManager.getFilterState(fieldId)?.values?.length > 0) {\n this.filterStateManager.getFilterState(fieldId).values.push(rawValue);\n }\n }\n }\n }\n\n // 保存显示值到原始值的映射关系\n this.displayToRawValueMap.set(fieldId, displayToRawMap);\n\n // 转换为所需格式,包含显示值、计数和原始值(count = 0 占位,后续会更新)\n const uniqueValues = Array.from(displayToRawMap.entries()).map(([displayValue, rawValue]) => ({\n value: displayValue, // UI显示的格式化值\n count: 0, // 计数占位,后续会根据筛选状态动态计算\n rawValue: rawValue // 对应的原始值\n }));\n\n this.uniqueKeys.set(fieldId, uniqueValues);\n }\n\n /**\n * 更新候选值列表的计数(基于当前筛选状态选择数据源)\n * - 未筛选列:使用当前表格数据(dataSource)计算计数\n * - 已筛选列:使用原始数据(records)计算计数\n */\n private updateCandidateCounts(fieldId: string | number): void {\n const uniqueValues = this.uniqueKeys.get(fieldId);\n if (!uniqueValues) {\n return;\n }\n\n // 判断当前列是否已启用筛选\n const filter = this.filterStateManager.getFilterState(fieldId);\n const isFiltered = filter?.enable;\n\n // 根据筛选状态选择数据源\n const dataSource = isFiltered\n ? this.table.internalProps.records // 已筛选:使用原始数据\n : this.table.internalProps.dataSource; // 未筛选:使用当前表格数据\n\n // 找到第一个匹配字段的列位置,用于获取格式化数据\n let targetCol = -1;\n for (let col = 0; col < this.table.colCount; col++) {\n for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) {\n if (!this.table.internalProps.layoutMap.isHeader(col, row)) {\n const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);\n if (bodyInfo && bodyInfo.field === fieldId) {\n targetCol = col;\n break;\n }\n }\n }\n if (targetCol !== -1) {\n break;\n }\n }\n\n // 计算每个候选值的计数\n const dataLength = dataSource.length;\n const countMap = new Map<any, number>();\n\n for (let i = 0; i < dataLength; i++) {\n let displayValue;\n if (targetCol !== -1) {\n const row = this.table.columnHeaderLevelCount + i;\n if (row < this.table.rowCount) {\n displayValue = this.table.getCellValue(targetCol, row);\n }\n } else {\n displayValue = this.table.getFieldData(\n String(fieldId),\n targetCol !== -1 ? targetCol : 0,\n this.table.columnHeaderLevelCount + i\n );\n }\n\n if (displayValue !== undefined && displayValue !== null) {\n countMap.set(displayValue, (countMap.get(displayValue) || 0) + 1);\n }\n }\n\n // 更新计数\n uniqueValues.forEach(item => {\n item.count = countMap.get(item.value) || 0;\n });\n }\n\n private onValueSelect(fieldId: string | number, displayValue: any, selected: boolean): void {\n // 获取显示值对应的原始值\n const displayToRawMap = this.displayToRawValueMap.get(fieldId);\n const rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n\n // 更新筛选状态\n const filter = this.filterStateManager.getFilterState(fieldId);\n let updatedValues: any[];\n if (!filter) {\n updatedValues = selected ? [rawValue] : [];\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: updatedValues\n }\n });\n } else {\n updatedValues = selected\n ? [...(filter.values || []), rawValue]\n : (filter.values || []).filter(v => v !== rawValue);\n this.filterStateManager.dispatch({\n type: FilterActionType.UPDATE_FILTER,\n payload: {\n field: fieldId,\n values: updatedValues\n }\n });\n }\n }\n\n /**\n * 检查值在当前搜索关键词下是否可见\n */\n private isValueVisible(displayValue: any, keyword: string): boolean {\n if (!keyword) {\n return true;\n }\n\n const filterKeywords = keyword\n .toUpperCase()\n .split(' ')\n .filter(s => s);\n\n const txtValue = String(displayValue).toUpperCase();\n return filterKeywords.some(keyword => txtValue.includes(keyword));\n }\n\n private toggleSelectAll(fieldId: string | number, selected: boolean): void {\n // 获取当前可见的值进行全选/取消全选\n const currentKeyword = this.filterStateManager.getCurrentSearchKeyword(fieldId);\n const stableCandidates = this.filterStateManager.getStableCandidateValues(fieldId);\n const displayToRawMap = this.displayToRawValueMap.get(fieldId);\n\n // 找出当前可见的所有值\n const visibleRawValues = stableCandidates\n .filter(candidate => this.isValueVisible(candidate.value, currentKeyword))\n .map(candidate => (displayToRawMap ? displayToRawMap.get(candidate.value) : candidate.value));\n\n const filter = this.filterStateManager.getFilterState(fieldId);\n const currentValues = new Set(filter?.values || []);\n\n let updatedValues: any[];\n if (selected) {\n // 全选:将可见的值添加到当前选中值中\n updatedValues = Array.from(new Set([...currentValues, ...visibleRawValues]));\n } else {\n // 取消全选:从当前选中值中移除可见的值\n updatedValues = Array.from(currentValues).filter(value => !visibleRawValues.includes(value));\n }\n\n if (!filter) {\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: updatedValues,\n enable: true\n }\n });\n } else {\n this.filterStateManager.dispatch({\n type: FilterActionType.UPDATE_FILTER,\n payload: {\n field: fieldId,\n values: updatedValues\n }\n });\n }\n }\n\n private onSearch(fieldId: string | number, value: string): void {\n // 更新 FilterStateManager 中的搜索关键词\n this.filterStateManager.updateSearchKeyword(fieldId, value);\n\n // 更新UI显示\n const items = this.valueFilterOptionList.get(fieldId);\n const filterKeywords = value\n .toUpperCase()\n .split(' ')\n .filter(s => s);\n\n for (const item of items) {\n const txtValue = item.id.toUpperCase() || '';\n const match = filterKeywords.some(keyword => txtValue.includes(keyword));\n const isVisible = filterKeywords.length === 0 || match;\n\n item.itemContainer.style.display = isVisible ? 'flex' : 'none';\n }\n }\n\n /**\n * 根据当前表格中的数据,初始化或更新 filter 的被选状态\n * 如果筛选已启用(enable=true),收集当前显示的数据作为选中项\n * 如果筛选未启用,初始化为所有值都选中\n */\n private initFilterStateFromTableData(fieldId: string | number): void {\n const filter = this.filterStateManager.getFilterState(fieldId);\n const isEnable = filter?.enable;\n const syncCheckboxCheckedState = this.pluginOptions?.syncCheckboxCheckedState ?? true;\n\n // 如果筛选已启用,使用当前显示的数据作为选中值\n if (isEnable) {\n const selectedRawValues = new Set();\n const displayToRawMap = this.displayToRawValueMap.get(fieldId);\n\n // 找到第一个匹配字段的列位置,用于获取格式化数据\n let targetCol = -1;\n for (let col = 0; col < this.table.colCount; col++) {\n for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) {\n if (!this.table.internalProps.layoutMap.isHeader(col, row)) {\n const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);\n if (bodyInfo && bodyInfo.field === fieldId) {\n targetCol = col;\n break;\n }\n }\n }\n if (targetCol !== -1) {\n break;\n }\n }\n\n // 收集当前显示的数据对应的原始值\n const dataSource = this.table.internalProps.dataSource;\n const currentLength = dataSource.length;\n\n for (let i = 0; i < currentLength; i++) {\n let displayValue;\n let rawValue;\n if (targetCol !== -1) {\n const row = this.table.columnHeaderLevelCount + i;\n if (row < this.table.rowCount) {\n // 获取格式化显示值\n displayValue = this.table.getCellValue(targetCol, row);\n // 通过映射获取对应的原始值\n rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n }\n } else {\n displayValue = this.table.getFieldData(\n String(fieldId),\n targetCol !== -1 ? targetCol : 0,\n this.table.columnHeaderLevelCount + i\n );\n rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n }\n\n if (rawValue !== undefined && rawValue !== null) {\n selectedRawValues.add(rawValue);\n }\n }\n\n const hasChanged = !arrayEqual(filter.values, Array.from(selectedRawValues));\n\n if (hasChanged && syncCheckboxCheckedState) {\n this.filterStateManager.dispatch({\n type: FilterActionType.UPDATE_FILTER,\n payload: {\n field: fieldId,\n values: Array.from(selectedRawValues)\n }\n });\n }\n } else {\n // 如果筛选未启用,初始化为计数>0的值都选中(但不启用筛选)\n // 此处,不应该判断: 未开启filter时filter.values中仍然可能会被其他筛选器联动的数据\n // if (!filter) {\n const availableRawValues =\n this.uniqueKeys\n .get(fieldId)\n\n ?.filter(item => !syncCheckboxCheckedState || item.count > 0) // 只选中计数>0的值\n ?.map(item => item.rawValue)\n .filter(v => v !== undefined && v !== null) || [];\n\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: availableRawValues,\n enable: false // 初始状态为未启用\n }\n });\n // }\n }\n }\n\n /**\n * 根据 filter 的数据状态,更新 UI\n */\n private syncCheckboxesWithFilterState(filter: FilterConfig): void {\n if (!filter) {\n return;\n }\n const selectedRawValues = filter.values || [];\n const displayToRawMap = this.displayToRawValueMap.get(filter.field);\n const optionDomList = this.valueFilterOptionList.get(filter.field);\n\n optionDomList?.forEach(optionDom => {\n // optionDom.id 是显示值,需要转换为原始值进行比较\n const displayValue = optionDom.originalValue;\n const rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n\n // 检查原始值是否在选中的原始值列表中\n optionDom.checkbox.checked = selectedRawValues.some(v => v === rawValue);\n\n // 同步禁用状态:计数为0时禁用复选框\n // const count = this.uniqueKeys.get(filter.field)?.find(key => String(key.value) === optionDom.id)?.count || 0;\n // optionDom.checkbox.disabled = count === 0;\n });\n }\n\n /**\n * 根据 filter 的数据状态,更新 UI\n */\n private syncSelectAllWithFilterState(filter: FilterConfig): void {\n if (!filter || !filter.values) {\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = false;\n return;\n }\n\n const uniqueValuesCount = this.uniqueKeys.get(filter.field)?.length || 0;\n if (uniqueValuesCount === 0) {\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = false;\n } else if (filter.values.length === 0) {\n // 没有选中任何值\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = false;\n } else if (filter.values.length === uniqueValuesCount) {\n // 所有值都被选中\n this.selectAllCheckbox.checked = true;\n this.selectAllCheckbox.indeterminate = false;\n } else {\n // 部分值被选中\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = true;\n }\n }\n\n applyFilter(fieldId: string | number = this.selectedField): void {\n // 获取当前搜索过滤后可见的选中值\n // const visibleSelectedKeys = Array.from(this.filterStateManager.getVisibleSelectedValues(fieldId));\n\n // 业务侧期望: 搜索出来的结果作为原有筛选结果的增项,而不覆盖原有筛选结果\n const filter = this.filterStateManager.getFilterState(fieldId);\n const allSelectedValues = filter.values;\n if (allSelectedValues.length >= 0 && allSelectedValues.length < this.uniqueKeys.get(fieldId)?.length) {\n this.filterStateManager.dispatch({\n type: FilterActionType.APPLY_FILTERS,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: allSelectedValues,\n enable: true\n }\n });\n } else {\n this.filterStateManager.dispatch({\n type: FilterActionType.REMOVE_FILTER,\n payload: {\n field: fieldId\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 render(container: HTMLElement): void {\n // === 按值筛选的菜单内容 ===\n this.filterByValuePanel = document.createElement('div');\n applyStyles(this.filterByValuePanel, this.styles.filterPanel);\n\n // -- 搜索栏 ---\n this.searchContainer = document.createElement('div');\n applyStyles(this.searchContainer, this.styles.searchContainer);\n\n this.filterByValueSearchInput = document.createElement('input');\n this.filterByValueSearchInput.type = 'text';\n this.filterByValueSearchInput.placeholder = this.styles.searchInput?.placeholder || '可使用空格分隔多个关键词';\n applyStyles(this.filterByValueSearchInput, this.styles.searchInput);\n\n this.searchContainer.appendChild(this.filterByValueSearchInput);\n\n // --- 筛选选项 ---\n this.optionsContainer = document.createElement('div');\n applyStyles(this.optionsContainer, this.styles.optionsContainer);\n\n this.selectAllItemDiv = document.createElement('div');\n applyStyles(this.selectAllItemDiv, this.styles.optionItem);\n\n this.selectAllLabel = document.createElement('label');\n applyStyles(this.selectAllLabel, this.styles.optionLabel);\n\n this.selectAllCheckbox = document.createElement('input');\n this.selectAllCheckbox.type = 'checkbox';\n this.selectAllCheckbox.checked = true; // 默认全选\n applyStyles(this.selectAllCheckbox, this.styles.checkbox);\n\n this.selectAllLabel.append(this.selectAllCheckbox, ' 全选');\n this.selectAllItemDiv.appendChild(this.selectAllLabel);\n\n this.filterItemsContainer = document.createElement('div'); // 筛选条目的容器,后续应动态 appendChild\n\n this.optionsContainer.append(this.selectAllItemDiv, this.filterItemsContainer);\n this.filterByValuePanel.append(this.searchContainer, this.optionsContainer);\n\n container.appendChild(this.filterByValuePanel);\n\n this.bindEventForFilterByValue();\n }\n\n /**\n * 更新插件选项\n * @param filterOptions 筛选选项\n */\n updatePluginOptions(pluginOptions: FilterOptions): void {\n this.pluginOptions = pluginOptions;\n this.styles = pluginOptions.styles;\n this.updateStyles(pluginOptions.styles);\n }\n\n updateStyles(styles: FilterStyles): void {\n applyStyles(this.filterByValuePanel, styles.filterPanel);\n applyStyles(this.searchContainer, styles.searchContainer);\n this.filterByValueSearchInput.placeholder = styles.searchInput?.placeholder || '可使用空格分隔多个关键词';\n applyStyles(this.filterByValueSearchInput, styles.searchInput);\n applyStyles(this.optionsContainer, styles.optionsContainer);\n applyStyles(this.selectAllItemDiv, styles.optionItem);\n applyStyles(this.selectAllLabel, styles.optionLabel);\n applyStyles(this.selectAllCheckbox, styles.checkbox);\n }\n\n private renderFilterOptions(field: string | number): void {\n this.filterItemsContainer.innerHTML = '';\n this.valueFilterOptionList.delete(field);\n this.valueFilterOptionList.set(field, []);\n\n const selectedRawValues = this.filterStateManager.getFilterState(field)?.values || [];\n // 为了优化复杂度,将原始值转换为Set进行快速查找\n const selectedRawValueSet = new Set(selectedRawValues);\n\n const itemDomList: ValueFilterOptionDom[] = [];\n\n this.uniqueKeys.get(field)?.forEach(({ value, count, rawValue }) => {\n const itemDiv = document.createElement('div');\n applyStyles(itemDiv, this.styles.optionItem);\n itemDiv.style.display = 'flex';\n\n const label = document.createElement('label');\n applyStyles(label, this.styles.optionLabel);\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.value = String(value); // 显示值作为checkbox的value\n // 使用原始值进行选中状态判断,优化为O(1)复杂度\n checkbox.checked = selectedRawValueSet.has(rawValue);\n // 计数为0时禁用复选框(不可选中)\n // checkbox.disabled = count === 0;\n applyStyles(checkbox, this.styles.checkbox);\n\n const countSpan = document.createElement('span');\n countSpan.textContent = String(count);\n applyStyles(countSpan, this.styles.countSpan);\n\n label.append(checkbox, ` ${rawValue}`); // UI显示原始值\n itemDiv.append(label, countSpan);\n this.filterItemsContainer.appendChild(itemDiv);\n\n const itemDom: ValueFilterOptionDom = {\n id: String(value), // 显示值作为id,用于UI交互\n originalValue: value,\n itemContainer: itemDiv,\n checkbox: checkbox,\n countSpan: countSpan\n };\n\n itemDomList.push(itemDom);\n });\n\n console.log('uniqueKeys----', itemDomList);\n\n this.valueFilterOptionList.set(field, itemDomList);\n }\n\n bindEventForFilterByValue(): void {\n // 事件委托:搜索框的 keyup 事件\n this.filterByValuePanel.addEventListener('keyup', (event: KeyboardEvent) => {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.type === 'text') {\n const value = target.value;\n this.onSearch(this.selectedField, value);\n }\n });\n\n // 事件委托:复选框的 change 事件\n // 只改变UI状态,不更新筛选状态\n // 因为只有点击确认后,筛选状态才能落库\n this.filterByValuePanel.addEventListener('change', (event: Event) => {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.type === 'checkbox') {\n if (target === this.selectAllCheckbox) {\n this.valueFilterOptionList.get(this.selectedField).forEach(item => (item.checkbox.checked = target.checked));\n } else {\n this.updateCheckboxUI(this.selectedField);\n }\n }\n });\n }\n\n updateCheckboxUI(field: string | number): void {\n const checkedItem = this.valueFilterOptionList.get(field)?.filter(item => item.checkbox.checked);\n const uncheckedItem = this.valueFilterOptionList.get(field)?.filter(item => !item.checkbox.checked);\n if (!isValid(checkedItem) || !isValid(uncheckedItem)) {\n return;\n }\n if (checkedItem.length !== 0 && uncheckedItem.length !== 0) {\n this.selectAllCheckbox.indeterminate = true;\n } else {\n this.selectAllCheckbox.indeterminate = false;\n this.selectAllCheckbox.checked = uncheckedItem.length === 0;\n }\n }\n\n updateCheckboxState(field: string | number): void {\n const originalValues: any = this.valueFilterOptionList\n .get(field)\n ?.filter(item => item.checkbox.checked)\n .map(item => item.originalValue);\n // 获取显示值对应的原始值\n const displayToRawMap = this.displayToRawValueMap.get(field);\n const rawValues = originalValues.map((displayValue: any) => {\n return displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n });\n // 更新筛选状态\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: field,\n type: 'byValue',\n values: rawValues\n }\n });\n }\n\n show(): void {\n // 1. 收集候选值(来自原始数据)\n this.collectUniqueColumnValues(this.selectedField);\n\n // 2. 更新计数(根据筛选状态选择数据源)\n this.updateCandidateCounts(this.selectedField);\n\n // 3. 初始化筛选状态(必须在 renderFilterOptions 之前执行)\n this.initFilterStateFromTableData(this.selectedField);\n\n // 4. 初始化筛选菜单状态,确保候选值列表稳定,并清空搜索关键词\n const uniqueValues = this.uniqueKeys.get(this.selectedField);\n const displayToRawMap = this.displayToRawValueMap.get(this.selectedField);\n if (uniqueValues && displayToRawMap) {\n console.log('uniqueValues', uniqueValues, displayToRawMap);\n this.filterStateManager.initializeFilterMenuState(this.selectedField, uniqueValues, displayToRawMap);\n }\n\n // 5. 清空搜索框\n if (this.filterByValueSearchInput) {\n this.filterByValueSearchInput.value = '';\n }\n // 6. 渲染选项(此时状态已经初始化完成)\n this.renderFilterOptions(this.selectedField);\n // 7. 同步全选状态(必须放在render之后, 只有这样checkbox ui才能与state同步, 此时需要做的是同步全选状态)\n this.updateCheckboxUI(this.selectedField);\n this.filterByValuePanel.style.display = 'block';\n }\n\n hide(): void {\n this.filterByValuePanel.style.display = 'none';\n }\n\n clearSearchInputValue(): void {\n this.filterByValueSearchInput.value = '';\n }\n}\n"]}
@@ -10362,6 +10362,7 @@ ${recordsStr}
10362
10362
  class ValueFilter {
10363
10363
  table;
10364
10364
  filterStateManager;
10365
+ pluginOptions;
10365
10366
  styles;
10366
10367
  uniqueKeys = new Map();
10367
10368
  displayToRawValueMap = new Map();
@@ -10375,10 +10376,11 @@ ${recordsStr}
10375
10376
  filterByValueSearchInput;
10376
10377
  selectAllCheckbox;
10377
10378
  filterItemsContainer;
10378
- constructor(table, filterStateManager, styles) {
10379
+ constructor(table, filterStateManager, pluginOptions) {
10379
10380
  this.table = table;
10380
10381
  this.filterStateManager = filterStateManager;
10381
- this.styles = styles;
10382
+ this.pluginOptions = pluginOptions;
10383
+ this.styles = pluginOptions.styles;
10382
10384
  this.filterStateManager.subscribe((state) => {
10383
10385
  const filterState = state.filters.get(this.selectedField);
10384
10386
  if (filterState && filterState.type === 'byValue') {
@@ -10422,6 +10424,9 @@ ${recordsStr}
10422
10424
  if (targetCol !== -1) {
10423
10425
  const row = this.table.columnHeaderLevelCount + i;
10424
10426
  const currentRecord = records[i];
10427
+ if (currentRecord === null || currentRecord === undefined) {
10428
+ continue;
10429
+ }
10425
10430
  rawValue = currentRecord[fieldId];
10426
10431
  const bodyInfo = this.table.internalProps.layoutMap.getBody(targetCol, row);
10427
10432
  if (bodyInfo &&
@@ -10595,6 +10600,7 @@ ${recordsStr}
10595
10600
  initFilterStateFromTableData(fieldId) {
10596
10601
  const filter = this.filterStateManager.getFilterState(fieldId);
10597
10602
  const isEnable = filter?.enable;
10603
+ const syncCheckboxCheckedState = this.pluginOptions?.syncCheckboxCheckedState ?? true;
10598
10604
  if (isEnable) {
10599
10605
  const selectedRawValues = new Set();
10600
10606
  const displayToRawMap = this.displayToRawValueMap.get(fieldId);
@@ -10634,7 +10640,7 @@ ${recordsStr}
10634
10640
  }
10635
10641
  }
10636
10642
  const hasChanged = !arrayEqual(filter.values, Array.from(selectedRawValues));
10637
- if (hasChanged) {
10643
+ if (hasChanged && syncCheckboxCheckedState) {
10638
10644
  this.filterStateManager.dispatch({
10639
10645
  type: exports.FilterActionType.UPDATE_FILTER,
10640
10646
  payload: {
@@ -10647,7 +10653,7 @@ ${recordsStr}
10647
10653
  else {
10648
10654
  const availableRawValues = this.uniqueKeys
10649
10655
  .get(fieldId)
10650
- ?.filter(item => item.count > 0)
10656
+ ?.filter(item => !syncCheckboxCheckedState || item.count > 0)
10651
10657
  ?.map(item => item.rawValue)
10652
10658
  .filter(v => v !== undefined && v !== null) || [];
10653
10659
  this.filterStateManager.dispatch({
@@ -10672,8 +10678,6 @@ ${recordsStr}
10672
10678
  const displayValue = optionDom.originalValue;
10673
10679
  const rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;
10674
10680
  optionDom.checkbox.checked = selectedRawValues.some(v => v === rawValue);
10675
- const count = this.uniqueKeys.get(filter.field)?.find(key => String(key.value) === optionDom.id)?.count || 0;
10676
- optionDom.checkbox.disabled = count === 0;
10677
10681
  });
10678
10682
  }
10679
10683
  syncSelectAllWithFilterState(filter) {
@@ -10760,6 +10764,11 @@ ${recordsStr}
10760
10764
  container.appendChild(this.filterByValuePanel);
10761
10765
  this.bindEventForFilterByValue();
10762
10766
  }
10767
+ updatePluginOptions(pluginOptions) {
10768
+ this.pluginOptions = pluginOptions;
10769
+ this.styles = pluginOptions.styles;
10770
+ this.updateStyles(pluginOptions.styles);
10771
+ }
10763
10772
  updateStyles(styles) {
10764
10773
  applyStyles(this.filterByValuePanel, styles.filterPanel);
10765
10774
  applyStyles(this.searchContainer, styles.searchContainer);
@@ -10787,7 +10796,6 @@ ${recordsStr}
10787
10796
  checkbox.type = 'checkbox';
10788
10797
  checkbox.value = String(value);
10789
10798
  checkbox.checked = selectedRawValueSet.has(rawValue);
10790
- checkbox.disabled = count === 0;
10791
10799
  applyStyles(checkbox, this.styles.checkbox);
10792
10800
  const countSpan = document.createElement('span');
10793
10801
  countSpan.textContent = String(count);
@@ -10936,11 +10944,11 @@ ${recordsStr}
10936
10944
  currentCategory = exports.FilterOperatorCategory.ALL;
10937
10945
  categories = [];
10938
10946
  operators = [];
10939
- constructor(table, filterStateManager, styles, conditionCategories) {
10947
+ constructor(table, filterStateManager, pluginOptions) {
10940
10948
  this.table = table;
10941
- this.styles = styles;
10949
+ this.styles = pluginOptions.styles;
10942
10950
  this.filterStateManager = filterStateManager;
10943
- this.categories = conditionCategories;
10951
+ this.categories = pluginOptions.conditionCategories;
10944
10952
  this.operators = operators;
10945
10953
  }
10946
10954
  setSelectedField(fieldId) {
@@ -11162,6 +11170,11 @@ ${recordsStr}
11162
11170
  this.updateOperatorOptions();
11163
11171
  this.bindEvents();
11164
11172
  }
11173
+ updatePluginOptions(filterOptions) {
11174
+ this.styles = filterOptions.styles;
11175
+ this.categories = filterOptions.conditionCategories;
11176
+ this.updateStyles(filterOptions.styles);
11177
+ }
11165
11178
  updateStyles(styles) {
11166
11179
  applyStyles(this.filterByConditionPanel, styles.filterPanel);
11167
11180
  applyStyles(this.conditionContainer, styles.conditionContainer);
@@ -11238,12 +11251,12 @@ ${recordsStr}
11238
11251
  clearFilterOptionLink;
11239
11252
  cancelFilterButton;
11240
11253
  applyFilterButton;
11241
- constructor(table, filterStateManager, styles, conditionCategories) {
11254
+ constructor(table, filterStateManager, pluginOptions) {
11242
11255
  this.table = table;
11243
11256
  this.filterStateManager = filterStateManager;
11244
- this.styles = styles;
11245
- this.valueFilter = new ValueFilter(this.table, this.filterStateManager, this.styles);
11246
- this.conditionFilter = new ConditionFilter(this.table, this.filterStateManager, this.styles, conditionCategories);
11257
+ this.styles = pluginOptions.styles;
11258
+ this.valueFilter = new ValueFilter(this.table, this.filterStateManager, pluginOptions);
11259
+ this.conditionFilter = new ConditionFilter(this.table, this.filterStateManager, pluginOptions);
11247
11260
  this.filterMenuWidth = 300;
11248
11261
  this.filterStateManager.subscribe(state => {
11249
11262
  if (this.isVisible && this.selectedField !== null) {
@@ -11251,6 +11264,10 @@ ${recordsStr}
11251
11264
  }
11252
11265
  });
11253
11266
  }
11267
+ updatePluginOptions(pluginOptions) {
11268
+ this.valueFilter.updatePluginOptions(pluginOptions);
11269
+ this.conditionFilter.updatePluginOptions(pluginOptions);
11270
+ }
11254
11271
  onTabSwitch(tab) {
11255
11272
  this.activeTab = tab;
11256
11273
  if (tab === 'byValue') {
@@ -20958,7 +20975,7 @@ ${recordsStr}
20958
20975
  initFilterPlugin(eventArgs) {
20959
20976
  this.filterEngine = new FilterEngine();
20960
20977
  this.filterStateManager = new FilterStateManager(this.table, this.filterEngine);
20961
- this.filterToolbar = new FilterToolbar(this.table, this.filterStateManager, this.pluginOptions.styles, this.pluginOptions.conditionCategories);
20978
+ this.filterToolbar = new FilterToolbar(this.table, this.filterStateManager, this.pluginOptions);
20962
20979
  this.columns = eventArgs.options.columns;
20963
20980
  this.filterToolbar.render(document.body);
20964
20981
  this.updateFilterIcons(this.columns);
@@ -21014,9 +21031,9 @@ ${recordsStr}
21014
21031
  }
21015
21032
  updatePluginOptions(pluginOptions) {
21016
21033
  this.pluginOptions = lodashExports.merge(this.pluginOptions, pluginOptions);
21034
+ this.filterToolbar.updatePluginOptions(this.pluginOptions);
21017
21035
  }
21018
21036
  update() {
21019
- this.filterToolbar.updateStyles(this.pluginOptions.styles);
21020
21037
  if (this.filterToolbar.valueFilter) {
21021
21038
  const allFields = this.table.columns.map(col => col.field);
21022
21039
  const valueFilter = this.filterToolbar.valueFilter;