@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.
@@ -5,10 +5,10 @@ import { FilterActionType } from "./types";
5
5
  import { applyStyles } from "./styles";
6
6
 
7
7
  export class ValueFilter {
8
- constructor(table, filterStateManager, styles) {
8
+ constructor(table, filterStateManager, pluginOptions) {
9
9
  this.uniqueKeys = new Map, this.displayToRawValueMap = new Map, this.valueFilterOptionList = new Map,
10
- this.table = table, this.filterStateManager = filterStateManager, this.styles = styles,
11
- this.filterStateManager.subscribe((state => {
10
+ this.table = table, this.filterStateManager = filterStateManager, this.pluginOptions = pluginOptions,
11
+ this.styles = pluginOptions.styles, this.filterStateManager.subscribe((state => {
12
12
  const filterState = state.filters.get(this.selectedField);
13
13
  filterState && "byValue" === filterState.type && this.updateUI(filterState);
14
14
  }));
@@ -38,8 +38,9 @@ export class ValueFilter {
38
38
  for (let i = 0; i < recordsLength; i++) {
39
39
  let rawValue, displayValue;
40
40
  if (-1 !== targetCol) {
41
- const row = this.table.columnHeaderLevelCount + i;
42
- rawValue = records[i][fieldId];
41
+ const row = this.table.columnHeaderLevelCount + i, currentRecord = records[i];
42
+ if (null == currentRecord) continue;
43
+ rawValue = currentRecord[fieldId];
43
44
  const bodyInfo = this.table.internalProps.layoutMap.getBody(targetCol, row);
44
45
  displayValue = bodyInfo && "fieldFormat" in bodyInfo && bodyInfo.fieldFormat && "function" == typeof bodyInfo.fieldFormat ? bodyInfo.fieldFormat({
45
46
  [fieldId]: rawValue
@@ -137,9 +138,9 @@ export class ValueFilter {
137
138
  }
138
139
  }
139
140
  initFilterStateFromTableData(fieldId) {
140
- var _a, _b;
141
- const filter = this.filterStateManager.getFilterState(fieldId);
142
- if (null == filter ? void 0 : filter.enable) {
141
+ var _a, _b, _c, _d;
142
+ 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;
143
+ if (isEnable) {
143
144
  const selectedRawValues = new Set, displayToRawMap = this.displayToRawValueMap.get(fieldId);
144
145
  let targetCol = -1;
145
146
  for (let col = 0; col < this.table.colCount; col++) {
@@ -163,7 +164,7 @@ export class ValueFilter {
163
164
  rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;
164
165
  null != rawValue && selectedRawValues.add(rawValue);
165
166
  }
166
- !arrayEqual(filter.values, Array.from(selectedRawValues)) && this.filterStateManager.dispatch({
167
+ !arrayEqual(filter.values, Array.from(selectedRawValues)) && syncCheckboxCheckedState && this.filterStateManager.dispatch({
167
168
  type: FilterActionType.UPDATE_FILTER,
168
169
  payload: {
169
170
  field: fieldId,
@@ -171,7 +172,7 @@ export class ValueFilter {
171
172
  }
172
173
  });
173
174
  } else {
174
- 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))) || [];
175
+ 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))) || [];
175
176
  this.filterStateManager.dispatch({
176
177
  type: FilterActionType.ADD_FILTER,
177
178
  payload: {
@@ -187,11 +188,8 @@ export class ValueFilter {
187
188
  if (!filter) return;
188
189
  const selectedRawValues = filter.values || [], displayToRawMap = this.displayToRawValueMap.get(filter.field), optionDomList = this.valueFilterOptionList.get(filter.field);
189
190
  null == optionDomList || optionDomList.forEach((optionDom => {
190
- var _a, _b;
191
191
  const displayValue = optionDom.originalValue, rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;
192
192
  optionDom.checkbox.checked = selectedRawValues.some((v => v === rawValue));
193
- 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;
194
- optionDom.checkbox.disabled = 0 === count;
195
193
  }));
196
194
  }
197
195
  syncSelectAllWithFilterState(filter) {
@@ -246,6 +244,9 @@ export class ValueFilter {
246
244
  this.filterByValuePanel.append(this.searchContainer, this.optionsContainer), container.appendChild(this.filterByValuePanel),
247
245
  this.bindEventForFilterByValue();
248
246
  }
247
+ updatePluginOptions(pluginOptions) {
248
+ this.pluginOptions = pluginOptions, this.styles = pluginOptions.styles, this.updateStyles(pluginOptions.styles);
249
+ }
249
250
  updateStyles(styles) {
250
251
  var _a;
251
252
  applyStyles(this.filterByValuePanel, styles.filterPanel), applyStyles(this.searchContainer, styles.searchContainer),
@@ -266,7 +267,7 @@ export class ValueFilter {
266
267
  applyStyles(label, this.styles.optionLabel);
267
268
  const checkbox = document.createElement("input");
268
269
  checkbox.type = "checkbox", checkbox.value = String(value), checkbox.checked = selectedRawValueSet.has(rawValue),
269
- checkbox.disabled = 0 === count, applyStyles(checkbox, this.styles.checkbox);
270
+ applyStyles(checkbox, this.styles.checkbox);
270
271
  const countSpan = document.createElement("span");
271
272
  countSpan.textContent = String(count), applyStyles(countSpan, this.styles.countSpan),
272
273
  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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vtable-plugins",
3
- "version": "1.22.4-alpha.11",
3
+ "version": "1.22.4-alpha.13",
4
4
  "description": "The search util of VTable",
5
5
  "author": {
6
6
  "name": "VisActor",
@@ -42,8 +42,8 @@
42
42
  "@types/file-saver": "2.0.7"
43
43
  },
44
44
  "peerDependencies": {
45
- "@visactor/vtable-gantt": "1.22.4-alpha.11",
46
- "@visactor/vtable": "1.22.4-alpha.11"
45
+ "@visactor/vtable-gantt": "1.22.4-alpha.13",
46
+ "@visactor/vtable": "1.22.4-alpha.13"
47
47
  },
48
48
  "peerDependenciesMeta": {
49
49
  "@visactor/vtable-gantt": {
@@ -53,9 +53,9 @@
53
53
  "devDependencies": {
54
54
  "cross-env": "^7.0.3",
55
55
  "increase-memory-limit": "^1.0.7",
56
- "@visactor/vtable": "1.22.4-alpha.11",
57
- "@visactor/vtable-editors": "1.22.4-alpha.11",
58
- "@visactor/vtable-gantt": "1.22.4-alpha.11",
56
+ "@visactor/vtable": "1.22.4-alpha.13",
57
+ "@visactor/vtable-editors": "1.22.4-alpha.13",
58
+ "@visactor/vtable-gantt": "1.22.4-alpha.13",
59
59
  "@visactor/vchart": "2.0.2",
60
60
  "@rushstack/eslint-patch": "~1.1.4",
61
61
  "react": "^18.0.0",