@visactor/vtable-search 1.26.1-alpha.0 → 1.26.2-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/search-component/search-component.d.ts +5 -0
- package/cjs/search-component/search-component.js +104 -76
- package/cjs/search-component/search-component.js.map +1 -1
- package/dist/vtable-search.js +125 -77
- package/dist/vtable-search.min.js +1 -1
- package/es/search-component/search-component.d.ts +5 -0
- package/es/search-component/search-component.js +104 -76
- package/es/search-component/search-component.js.map +1 -1
- package/package.json +4 -4
|
@@ -61,6 +61,11 @@ export declare class SearchComponent {
|
|
|
61
61
|
treeIndex: number;
|
|
62
62
|
scrollOption: ITableAnimationOption;
|
|
63
63
|
constructor(option: SearchComponentOption);
|
|
64
|
+
private getHeaderOffset;
|
|
65
|
+
private getHeaderCellAddressByField;
|
|
66
|
+
private getTreeCol;
|
|
67
|
+
private getVisibleTreeCell;
|
|
68
|
+
private clearRenderedCellStyles;
|
|
64
69
|
search(str: string): {
|
|
65
70
|
index: number;
|
|
66
71
|
results: {
|
|
@@ -33,40 +33,93 @@ class SearchComponent {
|
|
|
33
33
|
}, this.enableViewportScroll = option.enableViewportScroll || !1, this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle),
|
|
34
34
|
this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle);
|
|
35
35
|
}
|
|
36
|
+
getHeaderOffset() {
|
|
37
|
+
let offset = 0;
|
|
38
|
+
for (;this.table.isHeader(0, offset); ) offset++;
|
|
39
|
+
return offset;
|
|
40
|
+
}
|
|
41
|
+
getHeaderCellAddressByField(field) {
|
|
42
|
+
var _a, _b;
|
|
43
|
+
const layoutMap = null === (_a = this.table.internalProps) || void 0 === _a ? void 0 : _a.layoutMap;
|
|
44
|
+
return null === (_b = null == layoutMap ? void 0 : layoutMap.getHeaderCellAddressByField) || void 0 === _b ? void 0 : _b.call(layoutMap, field);
|
|
45
|
+
}
|
|
46
|
+
getTreeCol() {
|
|
47
|
+
var _a, _b, _c;
|
|
48
|
+
const treeColumn = null === (_c = null === (_b = null === (_a = this.table) || void 0 === _a ? void 0 : _a.options) || void 0 === _b ? void 0 : _b.columns) || void 0 === _c ? void 0 : _c.find((c => null == c ? void 0 : c.tree)), field = null == treeColumn ? void 0 : treeColumn.field;
|
|
49
|
+
if ("string" == typeof field && field) {
|
|
50
|
+
const addr = this.getHeaderCellAddressByField(field);
|
|
51
|
+
if (addr && "number" == typeof addr.col) return addr.col;
|
|
52
|
+
}
|
|
53
|
+
return this.treeIndex;
|
|
54
|
+
}
|
|
55
|
+
getVisibleTreeCell(resultItem) {
|
|
56
|
+
if (!resultItem.indexNumber) return;
|
|
57
|
+
const rawIndex = this.getBodyRowIndexByRecordIndex(resultItem.indexNumber);
|
|
58
|
+
return rawIndex < 0 ? void 0 : {
|
|
59
|
+
col: "number" == typeof resultItem.col ? resultItem.col : this.getTreeCol(),
|
|
60
|
+
row: rawIndex + this.getHeaderOffset()
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
clearRenderedCellStyles() {
|
|
64
|
+
const plugin = this.table.customCellStylePlugin, cellsToRefresh = [];
|
|
65
|
+
Array.from((null == plugin ? void 0 : plugin.customCellStyleArrangement) || []).forEach((item => {
|
|
66
|
+
const cellPosition = null == item ? void 0 : item.cellPosition;
|
|
67
|
+
"number" == typeof (null == cellPosition ? void 0 : cellPosition.col) && "number" == typeof (null == cellPosition ? void 0 : cellPosition.row) && cellsToRefresh.push({
|
|
68
|
+
col: cellPosition.col,
|
|
69
|
+
row: cellPosition.row
|
|
70
|
+
});
|
|
71
|
+
})), plugin.clearCustomCellStyleArrangement(), cellsToRefresh.forEach((({col: col, row: row}) => {
|
|
72
|
+
this.table.scenegraph.updateCellContent(col, row, !0);
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
36
75
|
search(str) {
|
|
76
|
+
var _a;
|
|
37
77
|
if (this.clear(), this.queryStr = str, !str) return {
|
|
38
78
|
index: 0,
|
|
39
79
|
results: this.queryResult
|
|
40
80
|
};
|
|
41
81
|
if (this.isTree = this.table.options.columns.some((item => item.tree)), this.treeIndex = this.isTree ? this.table.options.columns.findIndex((item => item.tree)) : 0,
|
|
42
82
|
this.isTree) {
|
|
43
|
-
const
|
|
83
|
+
const treeCol = this.getTreeCol(), walk = (nodes, path) => {
|
|
44
84
|
nodes.forEach(((item, idx) => {
|
|
45
|
-
const currentPath = [ ...path, idx ];
|
|
46
|
-
|
|
85
|
+
const currentPath = [ ...path, idx ], searchFields = Array.isArray(this.fieldsToSearch) && this.fieldsToSearch.length > 0 ? this.fieldsToSearch : Object.keys(item);
|
|
86
|
+
let hitAnyField = !1;
|
|
87
|
+
searchFields.forEach((field => {
|
|
88
|
+
var _a, _b, _c, _d;
|
|
89
|
+
const value = null == item ? void 0 : item[field];
|
|
90
|
+
if (!(0, vutils_1.isValid)(value)) return;
|
|
91
|
+
const col = null !== (_b = null === (_a = this.getHeaderCellAddressByField(field)) || void 0 === _a ? void 0 : _a.col) && void 0 !== _b ? _b : treeCol;
|
|
92
|
+
this.queryMethod(this.queryStr, value, {
|
|
93
|
+
col: col,
|
|
94
|
+
row: 0,
|
|
95
|
+
table: this.table
|
|
96
|
+
}) && (hitAnyField = !0, this.queryResult.push({
|
|
97
|
+
indexNumber: currentPath,
|
|
98
|
+
col: col,
|
|
99
|
+
value: null !== (_d = null === (_c = null == value ? void 0 : value.toString) || void 0 === _c ? void 0 : _c.call(value)) && void 0 !== _d ? _d : String(value)
|
|
100
|
+
}));
|
|
101
|
+
})), !hitAnyField && this.treeQueryMethod && this.treeQueryMethod(this.queryStr, item, this.fieldsToSearch, {
|
|
47
102
|
table: this.table
|
|
48
103
|
}) && this.queryResult.push({
|
|
49
104
|
indexNumber: currentPath,
|
|
50
|
-
|
|
51
|
-
start: {
|
|
52
|
-
row: null,
|
|
53
|
-
col: 0
|
|
54
|
-
},
|
|
55
|
-
end: {
|
|
56
|
-
row: null,
|
|
57
|
-
col: colEnd
|
|
58
|
-
}
|
|
59
|
-
}
|
|
105
|
+
col: treeCol
|
|
60
106
|
}), item.children && Array.isArray(item.children) && item.children.length > 0 && walk(item.children, currentPath);
|
|
61
107
|
}));
|
|
62
108
|
};
|
|
63
|
-
|
|
64
|
-
|
|
109
|
+
walk(this.table.records, []);
|
|
110
|
+
const dedup = new Set;
|
|
111
|
+
return this.queryResult = this.queryResult.filter((r => {
|
|
112
|
+
var _a;
|
|
113
|
+
const key = `${(r.indexNumber || []).join(".")}:${null !== (_a = r.col) && void 0 !== _a ? _a : ""}`;
|
|
114
|
+
return !dedup.has(key) && (dedup.add(key), !0);
|
|
115
|
+
})), this.currentIndex = this.queryResult.length > 0 ? 0 : -1, this.queryResult.length > 0 && this.jumpToCell({
|
|
116
|
+
IndexNumber: this.queryResult[0].indexNumber,
|
|
117
|
+
col: null !== (_a = this.queryResult[0].col) && void 0 !== _a ? _a : treeCol
|
|
65
118
|
}), this.callback && this.callback({
|
|
66
119
|
queryStr: this.queryStr,
|
|
67
120
|
results: this.queryResult
|
|
68
|
-
}, this.table), this.updateCellStyle(),
|
|
69
|
-
index: 0,
|
|
121
|
+
}, this.table), this.updateCellStyle(), {
|
|
122
|
+
index: this.currentIndex >= 0 ? this.currentIndex : 0,
|
|
70
123
|
results: this.queryResult
|
|
71
124
|
};
|
|
72
125
|
}
|
|
@@ -116,20 +169,26 @@ class SearchComponent {
|
|
|
116
169
|
}, highlight ? customStyleId : null);
|
|
117
170
|
}
|
|
118
171
|
updateCellStyle(highlight = !0) {
|
|
119
|
-
if (!highlight) return this.table.
|
|
120
|
-
(this.queryResult || []).forEach((resultItem => {
|
|
121
|
-
this.table.scenegraph.updateCellContent(resultItem.col, resultItem.row);
|
|
122
|
-
})), void this.table.scenegraph.updateNextFrame();
|
|
172
|
+
if (!highlight) return this.clearRenderedCellStyles(), void this.table.scenegraph.updateNextFrame();
|
|
123
173
|
if (this.queryResult) if (this.table.hasCustomCellStyle(HighlightStyleId) || this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle),
|
|
124
174
|
this.table.hasCustomCellStyle(FocusHighlightStyleId) || this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle),
|
|
125
|
-
this.isTree) {
|
|
126
|
-
|
|
127
|
-
let i = 0;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
175
|
+
this.clearRenderedCellStyles(), this.isTree) {
|
|
176
|
+
if (!this.queryResult.length) return void this.table.scenegraph.updateNextFrame();
|
|
177
|
+
for (let i = 0; i < this.queryResult.length; i++) {
|
|
178
|
+
const cell = this.getVisibleTreeCell(this.queryResult[i]);
|
|
179
|
+
cell && (this.table.customCellStylePlugin.addCustomCellStyleArrangement({
|
|
180
|
+
col: cell.col,
|
|
181
|
+
row: cell.row
|
|
182
|
+
}, HighlightStyleId), this.table.scenegraph.updateCellContent(cell.col, cell.row, !0));
|
|
183
|
+
}
|
|
184
|
+
if (this.currentIndex >= 0 && this.currentIndex < this.queryResult.length) {
|
|
185
|
+
const cell = this.getVisibleTreeCell(this.queryResult[this.currentIndex]);
|
|
186
|
+
cell && (this.table.customCellStylePlugin.addCustomCellStyleArrangement({
|
|
187
|
+
col: cell.col,
|
|
188
|
+
row: cell.row
|
|
189
|
+
}, FocusHighlightStyleId), this.table.scenegraph.updateCellContent(cell.col, cell.row, !0));
|
|
190
|
+
}
|
|
191
|
+
this.table.scenegraph.updateNextFrame();
|
|
133
192
|
} else {
|
|
134
193
|
for (let i = 0; i < this.queryResult.length; i++) this.table.customCellStylePlugin.addCustomCellStyleArrangement({
|
|
135
194
|
col: this.queryResult[i].col,
|
|
@@ -144,29 +203,12 @@ class SearchComponent {
|
|
|
144
203
|
results: this.queryResult
|
|
145
204
|
};
|
|
146
205
|
if (this.isTree) {
|
|
147
|
-
if (-1 !== this.currentIndex) {
|
|
148
|
-
const {range: range, indexNumber: indexNumber} = this.queryResult[this.currentIndex];
|
|
149
|
-
if (range) {
|
|
150
|
-
let i = 0;
|
|
151
|
-
for (;this.table.isHeader(0, i); ) i++;
|
|
152
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
153
|
-
range.start.row = row, range.end.row = row, this.arrangeCustomCellStyle({
|
|
154
|
-
range: range
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
206
|
this.currentIndex++, this.currentIndex >= this.queryResult.length && (this.currentIndex = 0);
|
|
159
|
-
const {
|
|
160
|
-
|
|
161
|
-
IndexNumber: indexNumber
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
for (;this.table.isHeader(0, i); ) i++;
|
|
165
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
166
|
-
range.start.row = row, range.end.row = row, this.arrangeCustomCellStyle({
|
|
167
|
-
range: range
|
|
168
|
-
}, !0, FocusHighlightStyleId);
|
|
169
|
-
}
|
|
207
|
+
const {indexNumber: indexNumber, col: col} = this.queryResult[this.currentIndex];
|
|
208
|
+
this.jumpToCell({
|
|
209
|
+
IndexNumber: indexNumber,
|
|
210
|
+
col: col
|
|
211
|
+
}), this.updateCellStyle();
|
|
170
212
|
} else {
|
|
171
213
|
-1 !== this.currentIndex && this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]),
|
|
172
214
|
this.currentIndex++, this.currentIndex >= this.queryResult.length && (this.currentIndex = 0);
|
|
@@ -188,29 +230,12 @@ class SearchComponent {
|
|
|
188
230
|
results: this.queryResult
|
|
189
231
|
};
|
|
190
232
|
if (this.isTree) {
|
|
191
|
-
if (-1 !== this.currentIndex) {
|
|
192
|
-
const {range: range, indexNumber: indexNumber} = this.queryResult[this.currentIndex];
|
|
193
|
-
if (range) {
|
|
194
|
-
let i = 0;
|
|
195
|
-
for (;this.table.isHeader(0, i); ) i++;
|
|
196
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
197
|
-
range.start.row = row, range.end.row = row, this.arrangeCustomCellStyle({
|
|
198
|
-
range: range
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
233
|
this.currentIndex--, this.currentIndex < 0 && (this.currentIndex = this.queryResult.length - 1);
|
|
203
|
-
const {
|
|
204
|
-
|
|
205
|
-
IndexNumber: indexNumber
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
for (;this.table.isHeader(0, i); ) i++;
|
|
209
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
210
|
-
range.start.row = row, range.end.row = row, this.arrangeCustomCellStyle({
|
|
211
|
-
range: range
|
|
212
|
-
}, !0, FocusHighlightStyleId);
|
|
213
|
-
}
|
|
234
|
+
const {indexNumber: indexNumber, col: col} = this.queryResult[this.currentIndex];
|
|
235
|
+
this.jumpToCell({
|
|
236
|
+
IndexNumber: indexNumber,
|
|
237
|
+
col: col
|
|
238
|
+
}), this.updateCellStyle();
|
|
214
239
|
} else {
|
|
215
240
|
-1 !== this.currentIndex && this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]),
|
|
216
241
|
this.currentIndex--, this.currentIndex < 0 && (this.currentIndex = this.queryResult.length - 1);
|
|
@@ -237,10 +262,13 @@ class SearchComponent {
|
|
|
237
262
|
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
238
263
|
"expand" !== this.table.getHierarchyState(this.treeIndex, row) && this.table.toggleHierarchyState(this.treeIndex, row);
|
|
239
264
|
}
|
|
240
|
-
const finalRow = this.getBodyRowIndexByRecordIndex(indexNumbers) + i;
|
|
241
|
-
this.table.
|
|
265
|
+
const finalRow = this.getBodyRowIndexByRecordIndex(indexNumbers) + i, targetCol = "number" == typeof params.col ? params.col : this.getTreeCol();
|
|
266
|
+
this.table.scrollToCell({
|
|
267
|
+
row: finalRow,
|
|
268
|
+
col: targetCol
|
|
269
|
+
}, this.scrollOption), this.enableViewportScroll && scrollVTableCellIntoView(this.table, {
|
|
242
270
|
row: finalRow,
|
|
243
|
-
col:
|
|
271
|
+
col: targetCol
|
|
244
272
|
});
|
|
245
273
|
} else {
|
|
246
274
|
const {col: col, row: row} = params, {rowStart: rowStart, rowEnd: rowEnd} = this.table.getBodyVisibleRowRange(), {colStart: colStart, colEnd: colEnd} = this.table.getBodyVisibleColRange();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["search-component/search-component.ts"],"names":[],"mappings":"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","file":"search-component.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport type { ITableAnimationOption } from '@visactor/vtable/src/ts-types';\nimport type { EasingType } from '@visactor/vtable/src/vrender';\nimport { isValid } from '@visactor/vutils';\ntype IVTable = VTable.ListTable | VTable.PivotTable | VTable.PivotChart;\n\nexport type QueryResult = {\n queryStr: string;\n results: {\n col?: number;\n row?: number;\n value?: string;\n indexNumber?: number[];\n }[];\n};\n\nexport type SearchComponentOption = {\n table: IVTable;\n autoJump?: boolean;\n skipHeader?: boolean;\n highlightCellStyle?: VTable.TYPES.CellStyle;\n /**\n * @deprecated use focusHighlightCellStyle instead\n */\n focuseHighlightCellStyle?: VTable.TYPES.CellStyle;\n focusHighlightCellStyle?: VTable.TYPES.CellStyle;\n queryMethod?: (queryStr: string, value: string, option?: { col: number; row: number; table: IVTable }) => boolean;\n treeQueryMethod?: (queryStr: string, node: any, fieldsToSearch?: string[], option?: { table: IVTable }) => boolean;\n fieldsToSearch?: string[];\n scrollOption?: ITableAnimationOption;\n /**\n * 当开启时,搜索结果会自动滚动到视口范围内\n * @since 1.22.4\n */\n enableViewportScroll?: boolean;\n callback?: (queryResult: QueryResult, table: IVTable) => void;\n};\n\nconst HighlightStyleId = '__search_component_highlight';\nconst FocusHighlightStyleId = '__search_component_focus';\n\nconst defaultHighlightCellStyle: Partial<VTable.TYPES.CellStyle> = {\n bgColor: 'rgba(255, 255, 0, 0.2)'\n};\n\nconst defaultFocusHighlightCellStyle: Partial<VTable.TYPES.CellStyle> = {\n bgColor: 'rgba(255, 155, 0, 0.2)'\n};\n\nfunction defaultQueryMethod(queryStr: string, value: string) {\n return isValid(queryStr) && isValid(value) && value.toString().includes(queryStr);\n}\nfunction defaultTreeQueryMethod(queryStr: string, node: any, fieldsToSearch?: string[]) {\n if (!isValid(queryStr)) {\n return false;\n }\n\n // 如果没有传 fieldsToSearch,则用 node 的全部 key\n const searchFields = Array.isArray(fieldsToSearch) && fieldsToSearch.length > 0 ? fieldsToSearch : Object.keys(node);\n\n return searchFields.some(field => isValid(node?.[field]) && node[field].toString().includes(queryStr));\n}\nexport class SearchComponent {\n table: IVTable;\n skipHeader: boolean;\n autoJump: boolean;\n highlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n focuseHighlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n focusHighlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n queryMethod: (queryStr: string, value: string, option: { col: number; row: number; table: IVTable }) => boolean;\n treeQueryMethod: (queryStr: string, node: any, fieldsToSearch?: string[], option?: { table: IVTable }) => boolean;\n fieldsToSearch: string[];\n enableViewportScroll?: boolean;\n callback?: (queryResult: QueryResult, table: IVTable) => void;\n\n queryStr: string;\n queryResult: {\n col?: number;\n row?: number;\n range?: VTable.TYPES.CellRange;\n value?: string;\n indexNumber?: number[];\n }[];\n\n currentIndex: number;\n isTree: boolean;\n treeIndex: number;\n scrollOption: ITableAnimationOption;\n\n constructor(option: SearchComponentOption) {\n this.table = option.table;\n this.autoJump = option.autoJump || false;\n this.skipHeader = option.skipHeader || false;\n this.highlightCellStyle = option.highlightCellStyle || defaultHighlightCellStyle;\n this.focusHighlightCellStyle =\n // 兼容兜底处理,修复拼写错误的问题\n option.focusHighlightCellStyle || option.focuseHighlightCellStyle || defaultFocusHighlightCellStyle;\n this.queryMethod = option.queryMethod || defaultQueryMethod;\n this.treeQueryMethod = option.treeQueryMethod || defaultTreeQueryMethod;\n this.fieldsToSearch = option.fieldsToSearch || [];\n this.isTree = false;\n this.treeIndex = 0;\n this.callback = option.callback;\n this.scrollOption =\n option.scrollOption || ({ duration: 900, easing: 'quartIn' as EasingType } as ITableAnimationOption);\n this.enableViewportScroll = option.enableViewportScroll || false;\n this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle as any);\n this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle as any);\n }\n\n search(str: string) {\n this.clear();\n this.queryStr = str;\n\n if (!str) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n this.isTree = this.table.options.columns.some((item: any) => item.tree);\n this.treeIndex = this.isTree ? this.table.options.columns.findIndex((item: any) => item.tree) : 0;\n if (this.isTree) {\n // 如果传入单一节点也能处理\n const colEnd = this.table.colCount;\n const walk = (nodes: any[], path: number[]) => {\n nodes.forEach((item: any, idx: number) => {\n const currentPath = [...path, idx]; // 当前节点的完整路径\n\n // 保持你的 treeQueryMethod 调用方式(this 上下文来自定义环境)\n if (this.treeQueryMethod(this.queryStr, item, this.fieldsToSearch, { table: this.table })) {\n this.queryResult.push({\n indexNumber: currentPath,\n range: {\n start: { row: null, col: 0 },\n end: { row: null, col: colEnd }\n }\n });\n }\n\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\n walk(item.children, currentPath);\n }\n });\n };\n\n walk(this.table.records, []);\n if (this.queryResult.length > 0) {\n this.jumpToCell({ IndexNumber: this.queryResult[0].indexNumber });\n }\n\n if (this.callback) {\n this.callback(\n {\n queryStr: this.queryStr,\n results: this.queryResult\n },\n this.table\n );\n }\n this.updateCellStyle();\n\n // if (this.autoJump) {\n // return this.next();\n // }\n this.currentIndex = 0;\n\n return {\n index: 0,\n results: this.queryResult\n };\n }\n for (let row = 0; row < this.table.rowCount; row++) {\n for (let col = 0; col < this.table.colCount; col++) {\n if (this.skipHeader && this.table.isHeader(col, row)) {\n continue;\n }\n const value = this.table.getCellValue(col, row);\n if (this.queryMethod(this.queryStr, value, { col, row, table: this.table })) {\n // deal merge cell\n const mergeCell = this.table.getCellRange(col, row);\n if (mergeCell.start.col !== mergeCell.end.col || mergeCell.start.row !== mergeCell.end.row) {\n // find is cell already in queryResult\n let isIn = false;\n for (let i = this.queryResult.length - 1; i >= 0; i--) {\n if (this.queryResult[i].col === mergeCell.start.col && this.queryResult[i].row === mergeCell.start.row) {\n isIn = true;\n break;\n }\n }\n if (!isIn) {\n this.queryResult.push({\n col: mergeCell.start.col,\n row: mergeCell.start.row,\n range: mergeCell,\n value\n });\n }\n } else {\n this.queryResult.push({\n col,\n row,\n value\n });\n }\n }\n }\n }\n this.updateCellStyle();\n\n if (this.callback) {\n this.callback(\n {\n queryStr: this.queryStr,\n results: this.queryResult\n },\n this.table\n );\n }\n\n if (this.autoJump) {\n return this.next();\n }\n return {\n index: 0,\n results: this.queryResult\n };\n }\n\n /**\n * @description: 为查询结果项设置自定义单元格样式\n * @param {(typeof this.queryResult)[number]} resultItem 查询结果项\n * @param {boolean} highlight 是否高亮\n * @param {string} customStyleId 自定义样式ID\n */\n arrangeCustomCellStyle(\n resultItem: typeof this.queryResult[number],\n highlight: boolean = true,\n customStyleId: string = HighlightStyleId\n ) {\n const { col, row, range } = resultItem;\n this.table.arrangeCustomCellStyle(\n range\n ? { range }\n : {\n row,\n col\n },\n highlight ? customStyleId : null\n );\n }\n\n updateCellStyle(highlight: boolean = true) {\n if (!highlight) {\n // (this.queryResult || []).forEach(resultItem => {\n // this.arrangeCustomCellStyle(resultItem, highlight);\n // });\n this.table.customCellStylePlugin.clearCustomCellStyleArrangement();\n (this.queryResult || []).forEach(resultItem => {\n this.table.scenegraph.updateCellContent(resultItem.col, resultItem.row);\n });\n this.table.scenegraph.updateNextFrame();\n return;\n }\n if (!this.queryResult) {\n return;\n }\n\n if (!this.table.hasCustomCellStyle(HighlightStyleId)) {\n this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle as any);\n }\n if (!this.table.hasCustomCellStyle(FocusHighlightStyleId)) {\n this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle as any);\n }\n if (this.isTree) {\n const { range, indexNumber } = this.queryResult[0];\n\n let i = 0;\n\n // 如果是表头就往下偏移\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n\n this.arrangeCustomCellStyle(\n {\n range\n },\n highlight,\n FocusHighlightStyleId\n );\n } else {\n // for (let i = 0; i < this.queryResult.length; i++) {\n // this.arrangeCustomCellStyle(this.queryResult[i], highlight);\n // }\n for (let i = 0; i < this.queryResult.length; i++) {\n this.table.customCellStylePlugin.addCustomCellStyleArrangement(\n {\n col: this.queryResult[i].col,\n row: this.queryResult[i].row\n },\n HighlightStyleId\n );\n this.table.scenegraph.updateCellContent(this.queryResult[i].col, this.queryResult[i].row, true);\n }\n this.table.scenegraph.updateNextFrame();\n }\n }\n\n next() {\n if (!this.queryResult.length) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n if (this.isTree) {\n if (this.currentIndex !== -1) {\n const { range, indexNumber } = this.queryResult[this.currentIndex];\n\n if (range) {\n let i = 0;\n\n // 如果是表头就往下偏移\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n this.arrangeCustomCellStyle({ range });\n }\n }\n\n this.currentIndex++;\n if (this.currentIndex >= this.queryResult.length) {\n this.currentIndex = 0;\n }\n const { range, indexNumber } = this.queryResult[this.currentIndex];\n this.jumpToCell({ IndexNumber: indexNumber });\n\n if (range) {\n let i = 0;\n\n // 如果是表头就往下偏移\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n this.arrangeCustomCellStyle(\n {\n range\n },\n true,\n FocusHighlightStyleId\n );\n }\n } else {\n if (this.currentIndex !== -1) {\n // reset last focus\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]);\n }\n this.currentIndex++;\n if (this.currentIndex >= this.queryResult.length) {\n this.currentIndex = 0;\n }\n const { col, row } = this.queryResult[this.currentIndex];\n\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex], true, FocusHighlightStyleId);\n\n this.jumpToCell({ col, row });\n }\n\n return {\n index: this.currentIndex,\n results: this.queryResult\n };\n }\n\n prev() {\n if (!this.queryResult.length) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n\n if (this.isTree) {\n // 先取消当前高亮\n if (this.currentIndex !== -1) {\n const { range, indexNumber } = this.queryResult[this.currentIndex];\n if (range) {\n let i = 0;\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n this.arrangeCustomCellStyle({ range });\n }\n }\n\n // 索引向前\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.queryResult.length - 1;\n }\n\n // 焦点样式\n const { range, indexNumber } = this.queryResult[this.currentIndex];\n this.jumpToCell({ IndexNumber: indexNumber });\n\n if (range) {\n let i = 0;\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n this.arrangeCustomCellStyle({ range }, true, FocusHighlightStyleId);\n }\n } else {\n // 普通表格处理\n if (this.currentIndex !== -1) {\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]);\n }\n\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.queryResult.length - 1;\n }\n\n const { col, row } = this.queryResult[this.currentIndex];\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex], true, FocusHighlightStyleId);\n this.jumpToCell({ col, row });\n }\n\n return {\n index: this.currentIndex,\n results: this.queryResult\n };\n }\n\n jumpToCell(params: { col?: number; row?: number; IndexNumber?: number[] }) {\n if (this.isTree) {\n const { IndexNumber } = params;\n const indexNumbers = [...IndexNumber];\n\n const tmp = [...indexNumbers];\n let tmpNumber = 0;\n let i = 0;\n\n // 展开树形结构的父节点\n while (tmpNumber < tmp.length - 1) {\n tmpNumber++;\n const indexNumber = indexNumbers.slice(0, tmpNumber);\n\n // 跳过表头行\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n\n const hierarchyState = this.table.getHierarchyState(this.treeIndex, row);\n if (hierarchyState !== 'expand') {\n this.table.toggleHierarchyState(this.treeIndex, row);\n }\n }\n\n const finalRow = this.getBodyRowIndexByRecordIndex(indexNumbers) + i;\n\n // 根据配置决定是否滚动表格\n this.table.scrollToRow(finalRow, this.scrollOption);\n\n // 根据配置决定是否滚动页面\n if (this.enableViewportScroll) {\n scrollVTableCellIntoView(this.table, { row: finalRow, col: this.treeIndex });\n }\n } else {\n const { col, row } = params;\n const { rowStart, rowEnd } = this.table.getBodyVisibleRowRange();\n const { colStart, colEnd } = this.table.getBodyVisibleColRange();\n\n // 检查单元格是否在表格可视范围内\n const isInTableView = !(row <= rowStart || row >= rowEnd || col <= colStart || col >= colEnd);\n\n // 根据配置决定是否滚动表格\n if (!isInTableView) {\n this.table.scrollToCell({ col, row });\n }\n\n // 根据配置决定是否滚动页面\n if (this.enableViewportScroll) {\n scrollVTableCellIntoView(this.table, { row, col });\n }\n }\n }\n getBodyRowIndexByRecordIndex(index: number | number[]): number {\n if (Array.isArray(index) && index.length === 1) {\n index = index[0];\n }\n return this.table.dataSource.getTableIndex(index);\n }\n clear() {\n // reset highlight cell style\n this.updateCellStyle(false);\n this.queryStr = '';\n this.queryResult = [];\n this.currentIndex = -1;\n }\n}\n\nfunction scrollVTableCellIntoView(table: IVTable, cellInfo: { row: number; col: number }): void {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n return;\n }\n\n const tableEl = table.getElement?.() || table.container;\n if (!tableEl) {\n return;\n }\n\n // 获取单元格在表格中的位置信息\n const cellRect = table.getCellRect(cellInfo.col, cellInfo.row);\n if (!cellRect) {\n return;\n }\n\n // 查找最近的可滚动父容器\n let scrollContainer: Element | null = tableEl.parentElement;\n while (scrollContainer) {\n const computedStyle = getComputedStyle(scrollContainer);\n const hasScroll = /(auto|scroll|overlay)/.test(computedStyle.overflowY);\n const canScroll = scrollContainer.scrollHeight > scrollContainer.clientHeight;\n\n if (hasScroll && canScroll) {\n break;\n }\n\n // 向上查找父元素,包括 Shadow DOM 情况\n scrollContainer = scrollContainer.parentElement || (scrollContainer.getRootNode?.() as ShadowRoot)?.host || null;\n }\n\n // 如果没找到可滚动容器,使用 document\n if (!scrollContainer) {\n scrollContainer = document.scrollingElement || document.documentElement;\n }\n\n const scrollContainerEl = scrollContainer as HTMLElement;\n\n // 计算单元格在滚动容器中的绝对位置\n const tableRect = tableEl.getBoundingClientRect();\n const containerRect = scrollContainerEl.getBoundingClientRect();\n\n // 表格相对于滚动容器的位置\n const tableOffsetTop = tableRect.top - containerRect.top + scrollContainerEl.scrollTop;\n\n // 单元格在滚动容器中的绝对位置\n const cellTop = tableOffsetTop + cellRect.top;\n const cellBottom = cellTop + cellRect.height;\n const containerHeight = scrollContainerEl.clientHeight;\n const scrollTop = scrollContainerEl.scrollTop;\n\n // 检查单元格是否完全可见\n const isFullyVisible = cellTop >= scrollTop && cellBottom <= scrollTop + containerHeight;\n\n if (!isFullyVisible) {\n // 计算新的滚动位置\n let newScrollTop: number;\n\n if (cellTop < scrollTop) {\n // 单元格在上方,滚动到单元格顶部\n newScrollTop = cellTop;\n } else {\n // 单元格在下方,滚动到单元格底部对齐容器底部\n newScrollTop = cellBottom - containerHeight;\n }\n\n // 确保滚动位置不小于 0\n scrollContainerEl.scrollTop = Math.max(0, newScrollTop);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["search-component/search-component.ts"],"names":[],"mappings":"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","file":"search-component.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport type { ITableAnimationOption } from '@visactor/vtable/src/ts-types';\nimport type { EasingType } from '@visactor/vtable/src/vrender';\nimport { isValid } from '@visactor/vutils';\ntype IVTable = VTable.ListTable | VTable.PivotTable | VTable.PivotChart;\n\nexport type QueryResult = {\n queryStr: string;\n results: {\n col?: number;\n row?: number;\n value?: string;\n indexNumber?: number[];\n }[];\n};\n\nexport type SearchComponentOption = {\n table: IVTable;\n autoJump?: boolean;\n skipHeader?: boolean;\n highlightCellStyle?: VTable.TYPES.CellStyle;\n /**\n * @deprecated use focusHighlightCellStyle instead\n */\n focuseHighlightCellStyle?: VTable.TYPES.CellStyle;\n focusHighlightCellStyle?: VTable.TYPES.CellStyle;\n queryMethod?: (queryStr: string, value: string, option?: { col: number; row: number; table: IVTable }) => boolean;\n treeQueryMethod?: (queryStr: string, node: any, fieldsToSearch?: string[], option?: { table: IVTable }) => boolean;\n fieldsToSearch?: string[];\n scrollOption?: ITableAnimationOption;\n /**\n * 当开启时,搜索结果会自动滚动到视口范围内\n * @since 1.22.4\n */\n enableViewportScroll?: boolean;\n callback?: (queryResult: QueryResult, table: IVTable) => void;\n};\n\nconst HighlightStyleId = '__search_component_highlight';\nconst FocusHighlightStyleId = '__search_component_focus';\n\nconst defaultHighlightCellStyle: Partial<VTable.TYPES.CellStyle> = {\n bgColor: 'rgba(255, 255, 0, 0.2)'\n};\n\nconst defaultFocusHighlightCellStyle: Partial<VTable.TYPES.CellStyle> = {\n bgColor: 'rgba(255, 155, 0, 0.2)'\n};\n\nfunction defaultQueryMethod(queryStr: string, value: string) {\n return isValid(queryStr) && isValid(value) && value.toString().includes(queryStr);\n}\nfunction defaultTreeQueryMethod(queryStr: string, node: any, fieldsToSearch?: string[]) {\n if (!isValid(queryStr)) {\n return false;\n }\n\n // 如果没有传 fieldsToSearch,则用 node 的全部 key\n const searchFields = Array.isArray(fieldsToSearch) && fieldsToSearch.length > 0 ? fieldsToSearch : Object.keys(node);\n\n return searchFields.some(field => isValid(node?.[field]) && node[field].toString().includes(queryStr));\n}\nexport class SearchComponent {\n table: IVTable;\n skipHeader: boolean;\n autoJump: boolean;\n highlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n focuseHighlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n focusHighlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n queryMethod: (queryStr: string, value: string, option: { col: number; row: number; table: IVTable }) => boolean;\n treeQueryMethod: (queryStr: string, node: any, fieldsToSearch?: string[], option?: { table: IVTable }) => boolean;\n fieldsToSearch: string[];\n enableViewportScroll?: boolean;\n callback?: (queryResult: QueryResult, table: IVTable) => void;\n\n queryStr: string;\n queryResult: {\n col?: number;\n row?: number;\n range?: VTable.TYPES.CellRange;\n value?: string;\n indexNumber?: number[];\n }[];\n\n currentIndex: number;\n isTree: boolean;\n treeIndex: number;\n scrollOption: ITableAnimationOption;\n\n constructor(option: SearchComponentOption) {\n this.table = option.table;\n this.autoJump = option.autoJump || false;\n this.skipHeader = option.skipHeader || false;\n this.highlightCellStyle = option.highlightCellStyle || defaultHighlightCellStyle;\n this.focusHighlightCellStyle =\n // 兼容兜底处理,修复拼写错误的问题\n option.focusHighlightCellStyle || option.focuseHighlightCellStyle || defaultFocusHighlightCellStyle;\n this.queryMethod = option.queryMethod || defaultQueryMethod;\n this.treeQueryMethod = option.treeQueryMethod || defaultTreeQueryMethod;\n this.fieldsToSearch = option.fieldsToSearch || [];\n this.isTree = false;\n this.treeIndex = 0;\n this.callback = option.callback;\n this.scrollOption =\n option.scrollOption || ({ duration: 900, easing: 'quartIn' as EasingType } as ITableAnimationOption);\n this.enableViewportScroll = option.enableViewportScroll || false;\n this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle as any);\n this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle as any);\n }\n\n private getHeaderOffset(): number {\n let offset = 0;\n while (this.table.isHeader(0, offset)) {\n offset++;\n }\n return offset;\n }\n\n private getHeaderCellAddressByField(field: string): { col: number; row: number } | undefined {\n // PivotTable/ListTable share internal layoutMap API but it's not exposed on the public type.\n const layoutMap = (this.table as any).internalProps?.layoutMap;\n return layoutMap?.getHeaderCellAddressByField?.(field);\n }\n\n private getTreeCol(): number {\n const treeColumn = (this.table as any)?.options?.columns?.find((c: any) => c?.tree);\n const field = treeColumn?.field;\n if (typeof field === 'string' && field) {\n const addr = this.getHeaderCellAddressByField(field);\n if (addr && typeof addr.col === 'number') {\n return addr.col;\n }\n }\n // Fallback to previous behavior.\n return this.treeIndex;\n }\n\n private getVisibleTreeCell(resultItem: typeof this.queryResult[number]): { col: number; row: number } | undefined {\n if (!resultItem.indexNumber) {\n return undefined;\n }\n const rawIndex = this.getBodyRowIndexByRecordIndex(resultItem.indexNumber);\n if (rawIndex < 0) {\n return undefined;\n }\n return {\n col: typeof resultItem.col === 'number' ? resultItem.col : this.getTreeCol(),\n row: rawIndex + this.getHeaderOffset()\n };\n }\n\n private clearRenderedCellStyles() {\n const plugin = this.table.customCellStylePlugin;\n const cellsToRefresh: { col: number; row: number }[] = [];\n const arrangements = Array.from((plugin as any)?.customCellStyleArrangement || []);\n\n arrangements.forEach((item: any) => {\n const cellPosition = item?.cellPosition;\n if (typeof cellPosition?.col === 'number' && typeof cellPosition?.row === 'number') {\n cellsToRefresh.push({\n col: cellPosition.col,\n row: cellPosition.row\n });\n }\n });\n\n plugin.clearCustomCellStyleArrangement();\n cellsToRefresh.forEach(({ col, row }) => {\n this.table.scenegraph.updateCellContent(col, row, true);\n });\n }\n\n search(str: string) {\n this.clear();\n this.queryStr = str;\n\n if (!str) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n this.isTree = this.table.options.columns.some((item: any) => item.tree);\n this.treeIndex = this.isTree ? this.table.options.columns.findIndex((item: any) => item.tree) : 0;\n if (this.isTree) {\n // 如果传入单一节点也能处理\n const treeCol = this.getTreeCol();\n const walk = (nodes: any[], path: number[]) => {\n nodes.forEach((item: any, idx: number) => {\n const currentPath = [...path, idx]; // 当前节点的完整路径\n\n // 为了做到“单元格级别高亮”,优先按字段匹配并映射到具体列。\n const searchFields =\n Array.isArray(this.fieldsToSearch) && this.fieldsToSearch.length > 0\n ? this.fieldsToSearch\n : Object.keys(item);\n\n let hitAnyField = false;\n searchFields.forEach(field => {\n const value = item?.[field];\n if (!isValid(value)) {\n return;\n }\n const col = this.getHeaderCellAddressByField(field)?.col ?? treeCol;\n // row 在树形场景下要在展开后才能准确计算,这里传 0 仅用于自定义 queryMethod 的兼容参数。\n if (this.queryMethod(this.queryStr, value, { col, row: 0, table: this.table })) {\n hitAnyField = true;\n this.queryResult.push({\n indexNumber: currentPath,\n col,\n value: value?.toString?.() ?? String(value)\n });\n }\n });\n\n // 兼容旧用法:如果用户自定义 treeQueryMethod 命中但字段级别未命中,则至少高亮树列。\n if (\n !hitAnyField &&\n this.treeQueryMethod &&\n this.treeQueryMethod(this.queryStr, item, this.fieldsToSearch, { table: this.table })\n ) {\n this.queryResult.push({\n indexNumber: currentPath,\n col: treeCol\n });\n }\n\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\n walk(item.children, currentPath);\n }\n });\n };\n\n walk(this.table.records, []);\n // 同一节点同一列可能被多次命中(例如 fieldsToSearch 未限制且字段值重复),做一次简单去重\n const dedup = new Set<string>();\n this.queryResult = this.queryResult.filter(r => {\n const key = `${(r.indexNumber || []).join('.')}:${r.col ?? ''}`;\n if (dedup.has(key)) {\n return false;\n }\n dedup.add(key);\n return true;\n });\n\n this.currentIndex = this.queryResult.length > 0 ? 0 : -1;\n\n if (this.queryResult.length > 0) {\n this.jumpToCell({ IndexNumber: this.queryResult[0].indexNumber, col: this.queryResult[0].col ?? treeCol });\n }\n\n if (this.callback) {\n this.callback(\n {\n queryStr: this.queryStr,\n results: this.queryResult\n },\n this.table\n );\n }\n this.updateCellStyle();\n\n return {\n index: this.currentIndex >= 0 ? this.currentIndex : 0,\n results: this.queryResult\n };\n }\n for (let row = 0; row < this.table.rowCount; row++) {\n for (let col = 0; col < this.table.colCount; col++) {\n if (this.skipHeader && this.table.isHeader(col, row)) {\n continue;\n }\n const value = this.table.getCellValue(col, row);\n if (this.queryMethod(this.queryStr, value, { col, row, table: this.table })) {\n // deal merge cell\n const mergeCell = this.table.getCellRange(col, row);\n if (mergeCell.start.col !== mergeCell.end.col || mergeCell.start.row !== mergeCell.end.row) {\n // find is cell already in queryResult\n let isIn = false;\n for (let i = this.queryResult.length - 1; i >= 0; i--) {\n if (this.queryResult[i].col === mergeCell.start.col && this.queryResult[i].row === mergeCell.start.row) {\n isIn = true;\n break;\n }\n }\n if (!isIn) {\n this.queryResult.push({\n col: mergeCell.start.col,\n row: mergeCell.start.row,\n range: mergeCell,\n value\n });\n }\n } else {\n this.queryResult.push({\n col,\n row,\n value\n });\n }\n }\n }\n }\n this.updateCellStyle();\n\n if (this.callback) {\n this.callback(\n {\n queryStr: this.queryStr,\n results: this.queryResult\n },\n this.table\n );\n }\n\n if (this.autoJump) {\n return this.next();\n }\n return {\n index: 0,\n results: this.queryResult\n };\n }\n\n /**\n * @description: 为查询结果项设置自定义单元格样式\n * @param {(typeof this.queryResult)[number]} resultItem 查询结果项\n * @param {boolean} highlight 是否高亮\n * @param {string} customStyleId 自定义样式ID\n */\n arrangeCustomCellStyle(\n resultItem: typeof this.queryResult[number],\n highlight: boolean = true,\n customStyleId: string = HighlightStyleId\n ) {\n const { col, row, range } = resultItem;\n this.table.arrangeCustomCellStyle(\n range\n ? { range }\n : {\n row,\n col\n },\n highlight ? customStyleId : null\n );\n }\n\n updateCellStyle(highlight: boolean = true) {\n if (!highlight) {\n this.clearRenderedCellStyles();\n this.table.scenegraph.updateNextFrame();\n return;\n }\n if (!this.queryResult) {\n return;\n }\n\n if (!this.table.hasCustomCellStyle(HighlightStyleId)) {\n this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle as any);\n }\n if (!this.table.hasCustomCellStyle(FocusHighlightStyleId)) {\n this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle as any);\n }\n\n this.clearRenderedCellStyles();\n\n if (this.isTree) {\n if (!this.queryResult.length) {\n this.table.scenegraph.updateNextFrame();\n return;\n }\n\n // 先为所有命中节点打普通高亮\n for (let i = 0; i < this.queryResult.length; i++) {\n const cell = this.getVisibleTreeCell(this.queryResult[i]);\n if (!cell) {\n continue;\n }\n this.table.customCellStylePlugin.addCustomCellStyleArrangement(\n {\n col: cell.col,\n row: cell.row\n },\n HighlightStyleId\n );\n this.table.scenegraph.updateCellContent(cell.col, cell.row, true);\n }\n\n // 再为当前索引打焦点高亮\n if (this.currentIndex >= 0 && this.currentIndex < this.queryResult.length) {\n const cell = this.getVisibleTreeCell(this.queryResult[this.currentIndex]);\n if (cell) {\n this.table.customCellStylePlugin.addCustomCellStyleArrangement(\n {\n col: cell.col,\n row: cell.row\n },\n FocusHighlightStyleId\n );\n this.table.scenegraph.updateCellContent(cell.col, cell.row, true);\n }\n }\n\n this.table.scenegraph.updateNextFrame();\n } else {\n for (let i = 0; i < this.queryResult.length; i++) {\n this.table.customCellStylePlugin.addCustomCellStyleArrangement(\n {\n col: this.queryResult[i].col,\n row: this.queryResult[i].row\n },\n HighlightStyleId\n );\n this.table.scenegraph.updateCellContent(this.queryResult[i].col, this.queryResult[i].row, true);\n }\n this.table.scenegraph.updateNextFrame();\n }\n }\n\n next() {\n if (!this.queryResult.length) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n if (this.isTree) {\n this.currentIndex++;\n if (this.currentIndex >= this.queryResult.length) {\n this.currentIndex = 0;\n }\n const { indexNumber, col } = this.queryResult[this.currentIndex];\n this.jumpToCell({ IndexNumber: indexNumber, col });\n this.updateCellStyle();\n } else {\n if (this.currentIndex !== -1) {\n // reset last focus\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]);\n }\n this.currentIndex++;\n if (this.currentIndex >= this.queryResult.length) {\n this.currentIndex = 0;\n }\n const { col, row } = this.queryResult[this.currentIndex];\n\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex], true, FocusHighlightStyleId);\n\n this.jumpToCell({ col, row });\n }\n\n return {\n index: this.currentIndex,\n results: this.queryResult\n };\n }\n\n prev() {\n if (!this.queryResult.length) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n\n if (this.isTree) {\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.queryResult.length - 1;\n }\n\n const { indexNumber, col } = this.queryResult[this.currentIndex];\n this.jumpToCell({ IndexNumber: indexNumber, col });\n this.updateCellStyle();\n } else {\n // 普通表格处理\n if (this.currentIndex !== -1) {\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]);\n }\n\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.queryResult.length - 1;\n }\n\n const { col, row } = this.queryResult[this.currentIndex];\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex], true, FocusHighlightStyleId);\n this.jumpToCell({ col, row });\n }\n\n return {\n index: this.currentIndex,\n results: this.queryResult\n };\n }\n\n jumpToCell(params: { col?: number; row?: number; IndexNumber?: number[] }) {\n if (this.isTree) {\n const { IndexNumber } = params;\n const indexNumbers = [...IndexNumber];\n\n const tmp = [...indexNumbers];\n let tmpNumber = 0;\n let i = 0;\n\n // 展开树形结构的父节点\n while (tmpNumber < tmp.length - 1) {\n tmpNumber++;\n const indexNumber = indexNumbers.slice(0, tmpNumber);\n\n // 跳过表头行\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n\n const hierarchyState = this.table.getHierarchyState(this.treeIndex, row);\n if (hierarchyState !== 'expand') {\n this.table.toggleHierarchyState(this.treeIndex, row);\n }\n }\n\n const finalRow = this.getBodyRowIndexByRecordIndex(indexNumbers) + i;\n\n // 根据配置决定是否滚动表格\n const targetCol = typeof params.col === 'number' ? params.col : this.getTreeCol();\n this.table.scrollToCell({ row: finalRow, col: targetCol }, this.scrollOption);\n\n // 根据配置决定是否滚动页面\n if (this.enableViewportScroll) {\n scrollVTableCellIntoView(this.table, { row: finalRow, col: targetCol });\n }\n } else {\n const { col, row } = params;\n const { rowStart, rowEnd } = this.table.getBodyVisibleRowRange();\n const { colStart, colEnd } = this.table.getBodyVisibleColRange();\n\n // 检查单元格是否在表格可视范围内\n const isInTableView = !(row <= rowStart || row >= rowEnd || col <= colStart || col >= colEnd);\n\n // 根据配置决定是否滚动表格\n if (!isInTableView) {\n this.table.scrollToCell({ col, row });\n }\n\n // 根据配置决定是否滚动页面\n if (this.enableViewportScroll) {\n scrollVTableCellIntoView(this.table, { row, col });\n }\n }\n }\n getBodyRowIndexByRecordIndex(index: number | number[]): number {\n if (Array.isArray(index) && index.length === 1) {\n index = index[0];\n }\n return this.table.dataSource.getTableIndex(index);\n }\n clear() {\n // reset highlight cell style\n this.updateCellStyle(false);\n this.queryStr = '';\n this.queryResult = [];\n this.currentIndex = -1;\n }\n}\n\nfunction scrollVTableCellIntoView(table: IVTable, cellInfo: { row: number; col: number }): void {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n return;\n }\n\n const tableEl = table.getElement?.() || table.container;\n if (!tableEl) {\n return;\n }\n\n // 获取单元格在表格中的位置信息\n const cellRect = table.getCellRect(cellInfo.col, cellInfo.row);\n if (!cellRect) {\n return;\n }\n\n // 查找最近的可滚动父容器\n let scrollContainer: Element | null = tableEl.parentElement;\n while (scrollContainer) {\n const computedStyle = getComputedStyle(scrollContainer);\n const hasScroll = /(auto|scroll|overlay)/.test(computedStyle.overflowY);\n const canScroll = scrollContainer.scrollHeight > scrollContainer.clientHeight;\n\n if (hasScroll && canScroll) {\n break;\n }\n\n // 向上查找父元素,包括 Shadow DOM 情况\n scrollContainer = scrollContainer.parentElement || (scrollContainer.getRootNode?.() as ShadowRoot)?.host || null;\n }\n\n // 如果没找到可滚动容器,使用 document\n if (!scrollContainer) {\n scrollContainer = document.scrollingElement || document.documentElement;\n }\n\n const scrollContainerEl = scrollContainer as HTMLElement;\n\n // 计算单元格在滚动容器中的绝对位置\n const tableRect = tableEl.getBoundingClientRect();\n const containerRect = scrollContainerEl.getBoundingClientRect();\n\n // 表格相对于滚动容器的位置\n const tableOffsetTop = tableRect.top - containerRect.top + scrollContainerEl.scrollTop;\n\n // 单元格在滚动容器中的绝对位置\n const cellTop = tableOffsetTop + cellRect.top;\n const cellBottom = cellTop + cellRect.height;\n const containerHeight = scrollContainerEl.clientHeight;\n const scrollTop = scrollContainerEl.scrollTop;\n\n // 检查单元格是否完全可见\n const isFullyVisible = cellTop >= scrollTop && cellBottom <= scrollTop + containerHeight;\n\n if (!isFullyVisible) {\n // 计算新的滚动位置\n let newScrollTop: number;\n\n if (cellTop < scrollTop) {\n // 单元格在上方,滚动到单元格顶部\n newScrollTop = cellTop;\n } else {\n // 单元格在下方,滚动到单元格底部对齐容器底部\n newScrollTop = cellBottom - containerHeight;\n }\n\n // 确保滚动位置不小于 0\n scrollContainerEl.scrollTop = Math.max(0, newScrollTop);\n }\n}\n"]}
|
package/dist/vtable-search.js
CHANGED
|
@@ -62,6 +62,59 @@
|
|
|
62
62
|
this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle);
|
|
63
63
|
this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle);
|
|
64
64
|
}
|
|
65
|
+
getHeaderOffset() {
|
|
66
|
+
let offset = 0;
|
|
67
|
+
while (this.table.isHeader(0, offset)) {
|
|
68
|
+
offset++;
|
|
69
|
+
}
|
|
70
|
+
return offset;
|
|
71
|
+
}
|
|
72
|
+
getHeaderCellAddressByField(field) {
|
|
73
|
+
const layoutMap = this.table.internalProps?.layoutMap;
|
|
74
|
+
return layoutMap?.getHeaderCellAddressByField?.(field);
|
|
75
|
+
}
|
|
76
|
+
getTreeCol() {
|
|
77
|
+
const treeColumn = this.table?.options?.columns?.find((c) => c?.tree);
|
|
78
|
+
const field = treeColumn?.field;
|
|
79
|
+
if (typeof field === 'string' && field) {
|
|
80
|
+
const addr = this.getHeaderCellAddressByField(field);
|
|
81
|
+
if (addr && typeof addr.col === 'number') {
|
|
82
|
+
return addr.col;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return this.treeIndex;
|
|
86
|
+
}
|
|
87
|
+
getVisibleTreeCell(resultItem) {
|
|
88
|
+
if (!resultItem.indexNumber) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
const rawIndex = this.getBodyRowIndexByRecordIndex(resultItem.indexNumber);
|
|
92
|
+
if (rawIndex < 0) {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
col: typeof resultItem.col === 'number' ? resultItem.col : this.getTreeCol(),
|
|
97
|
+
row: rawIndex + this.getHeaderOffset()
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
clearRenderedCellStyles() {
|
|
101
|
+
const plugin = this.table.customCellStylePlugin;
|
|
102
|
+
const cellsToRefresh = [];
|
|
103
|
+
const arrangements = Array.from(plugin?.customCellStyleArrangement || []);
|
|
104
|
+
arrangements.forEach((item) => {
|
|
105
|
+
const cellPosition = item?.cellPosition;
|
|
106
|
+
if (typeof cellPosition?.col === 'number' && typeof cellPosition?.row === 'number') {
|
|
107
|
+
cellsToRefresh.push({
|
|
108
|
+
col: cellPosition.col,
|
|
109
|
+
row: cellPosition.row
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
plugin.clearCustomCellStyleArrangement();
|
|
114
|
+
cellsToRefresh.forEach(({ col, row }) => {
|
|
115
|
+
this.table.scenegraph.updateCellContent(col, row, true);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
65
118
|
search(str) {
|
|
66
119
|
this.clear();
|
|
67
120
|
this.queryStr = str;
|
|
@@ -74,17 +127,35 @@
|
|
|
74
127
|
this.isTree = this.table.options.columns.some((item) => item.tree);
|
|
75
128
|
this.treeIndex = this.isTree ? this.table.options.columns.findIndex((item) => item.tree) : 0;
|
|
76
129
|
if (this.isTree) {
|
|
77
|
-
const
|
|
130
|
+
const treeCol = this.getTreeCol();
|
|
78
131
|
const walk = (nodes, path) => {
|
|
79
132
|
nodes.forEach((item, idx) => {
|
|
80
133
|
const currentPath = [...path, idx];
|
|
81
|
-
|
|
134
|
+
const searchFields = Array.isArray(this.fieldsToSearch) && this.fieldsToSearch.length > 0
|
|
135
|
+
? this.fieldsToSearch
|
|
136
|
+
: Object.keys(item);
|
|
137
|
+
let hitAnyField = false;
|
|
138
|
+
searchFields.forEach(field => {
|
|
139
|
+
const value = item?.[field];
|
|
140
|
+
if (!isValid$1(value)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const col = this.getHeaderCellAddressByField(field)?.col ?? treeCol;
|
|
144
|
+
if (this.queryMethod(this.queryStr, value, { col, row: 0, table: this.table })) {
|
|
145
|
+
hitAnyField = true;
|
|
146
|
+
this.queryResult.push({
|
|
147
|
+
indexNumber: currentPath,
|
|
148
|
+
col,
|
|
149
|
+
value: value?.toString?.() ?? String(value)
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
if (!hitAnyField &&
|
|
154
|
+
this.treeQueryMethod &&
|
|
155
|
+
this.treeQueryMethod(this.queryStr, item, this.fieldsToSearch, { table: this.table })) {
|
|
82
156
|
this.queryResult.push({
|
|
83
157
|
indexNumber: currentPath,
|
|
84
|
-
|
|
85
|
-
start: { row: null, col: 0 },
|
|
86
|
-
end: { row: null, col: colEnd }
|
|
87
|
-
}
|
|
158
|
+
col: treeCol
|
|
88
159
|
});
|
|
89
160
|
}
|
|
90
161
|
if (item.children && Array.isArray(item.children) && item.children.length > 0) {
|
|
@@ -93,8 +164,18 @@
|
|
|
93
164
|
});
|
|
94
165
|
};
|
|
95
166
|
walk(this.table.records, []);
|
|
167
|
+
const dedup = new Set();
|
|
168
|
+
this.queryResult = this.queryResult.filter(r => {
|
|
169
|
+
const key = `${(r.indexNumber || []).join('.')}:${r.col ?? ''}`;
|
|
170
|
+
if (dedup.has(key)) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
dedup.add(key);
|
|
174
|
+
return true;
|
|
175
|
+
});
|
|
176
|
+
this.currentIndex = this.queryResult.length > 0 ? 0 : -1;
|
|
96
177
|
if (this.queryResult.length > 0) {
|
|
97
|
-
this.jumpToCell({ IndexNumber: this.queryResult[0].indexNumber });
|
|
178
|
+
this.jumpToCell({ IndexNumber: this.queryResult[0].indexNumber, col: this.queryResult[0].col ?? treeCol });
|
|
98
179
|
}
|
|
99
180
|
if (this.callback) {
|
|
100
181
|
this.callback({
|
|
@@ -103,9 +184,8 @@
|
|
|
103
184
|
}, this.table);
|
|
104
185
|
}
|
|
105
186
|
this.updateCellStyle();
|
|
106
|
-
this.currentIndex = 0;
|
|
107
187
|
return {
|
|
108
|
-
index: 0,
|
|
188
|
+
index: this.currentIndex >= 0 ? this.currentIndex : 0,
|
|
109
189
|
results: this.queryResult
|
|
110
190
|
};
|
|
111
191
|
}
|
|
@@ -170,10 +250,7 @@
|
|
|
170
250
|
}
|
|
171
251
|
updateCellStyle(highlight = true) {
|
|
172
252
|
if (!highlight) {
|
|
173
|
-
this.
|
|
174
|
-
(this.queryResult || []).forEach(resultItem => {
|
|
175
|
-
this.table.scenegraph.updateCellContent(resultItem.col, resultItem.row);
|
|
176
|
-
});
|
|
253
|
+
this.clearRenderedCellStyles();
|
|
177
254
|
this.table.scenegraph.updateNextFrame();
|
|
178
255
|
return;
|
|
179
256
|
}
|
|
@@ -186,18 +263,34 @@
|
|
|
186
263
|
if (!this.table.hasCustomCellStyle(FocusHighlightStyleId)) {
|
|
187
264
|
this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle);
|
|
188
265
|
}
|
|
266
|
+
this.clearRenderedCellStyles();
|
|
189
267
|
if (this.isTree) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
i++;
|
|
268
|
+
if (!this.queryResult.length) {
|
|
269
|
+
this.table.scenegraph.updateNextFrame();
|
|
270
|
+
return;
|
|
194
271
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
272
|
+
for (let i = 0; i < this.queryResult.length; i++) {
|
|
273
|
+
const cell = this.getVisibleTreeCell(this.queryResult[i]);
|
|
274
|
+
if (!cell) {
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
this.table.customCellStylePlugin.addCustomCellStyleArrangement({
|
|
278
|
+
col: cell.col,
|
|
279
|
+
row: cell.row
|
|
280
|
+
}, HighlightStyleId);
|
|
281
|
+
this.table.scenegraph.updateCellContent(cell.col, cell.row, true);
|
|
282
|
+
}
|
|
283
|
+
if (this.currentIndex >= 0 && this.currentIndex < this.queryResult.length) {
|
|
284
|
+
const cell = this.getVisibleTreeCell(this.queryResult[this.currentIndex]);
|
|
285
|
+
if (cell) {
|
|
286
|
+
this.table.customCellStylePlugin.addCustomCellStyleArrangement({
|
|
287
|
+
col: cell.col,
|
|
288
|
+
row: cell.row
|
|
289
|
+
}, FocusHighlightStyleId);
|
|
290
|
+
this.table.scenegraph.updateCellContent(cell.col, cell.row, true);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
this.table.scenegraph.updateNextFrame();
|
|
201
294
|
}
|
|
202
295
|
else {
|
|
203
296
|
for (let i = 0; i < this.queryResult.length; i++) {
|
|
@@ -218,37 +311,13 @@
|
|
|
218
311
|
};
|
|
219
312
|
}
|
|
220
313
|
if (this.isTree) {
|
|
221
|
-
if (this.currentIndex !== -1) {
|
|
222
|
-
const { range, indexNumber } = this.queryResult[this.currentIndex];
|
|
223
|
-
if (range) {
|
|
224
|
-
let i = 0;
|
|
225
|
-
while (this.table.isHeader(0, i)) {
|
|
226
|
-
i++;
|
|
227
|
-
}
|
|
228
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
229
|
-
range.start.row = row;
|
|
230
|
-
range.end.row = row;
|
|
231
|
-
this.arrangeCustomCellStyle({ range });
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
314
|
this.currentIndex++;
|
|
235
315
|
if (this.currentIndex >= this.queryResult.length) {
|
|
236
316
|
this.currentIndex = 0;
|
|
237
317
|
}
|
|
238
|
-
const {
|
|
239
|
-
this.jumpToCell({ IndexNumber: indexNumber });
|
|
240
|
-
|
|
241
|
-
let i = 0;
|
|
242
|
-
while (this.table.isHeader(0, i)) {
|
|
243
|
-
i++;
|
|
244
|
-
}
|
|
245
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
246
|
-
range.start.row = row;
|
|
247
|
-
range.end.row = row;
|
|
248
|
-
this.arrangeCustomCellStyle({
|
|
249
|
-
range
|
|
250
|
-
}, true, FocusHighlightStyleId);
|
|
251
|
-
}
|
|
318
|
+
const { indexNumber, col } = this.queryResult[this.currentIndex];
|
|
319
|
+
this.jumpToCell({ IndexNumber: indexNumber, col });
|
|
320
|
+
this.updateCellStyle();
|
|
252
321
|
}
|
|
253
322
|
else {
|
|
254
323
|
if (this.currentIndex !== -1) {
|
|
@@ -275,35 +344,13 @@
|
|
|
275
344
|
};
|
|
276
345
|
}
|
|
277
346
|
if (this.isTree) {
|
|
278
|
-
if (this.currentIndex !== -1) {
|
|
279
|
-
const { range, indexNumber } = this.queryResult[this.currentIndex];
|
|
280
|
-
if (range) {
|
|
281
|
-
let i = 0;
|
|
282
|
-
while (this.table.isHeader(0, i)) {
|
|
283
|
-
i++;
|
|
284
|
-
}
|
|
285
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
286
|
-
range.start.row = row;
|
|
287
|
-
range.end.row = row;
|
|
288
|
-
this.arrangeCustomCellStyle({ range });
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
347
|
this.currentIndex--;
|
|
292
348
|
if (this.currentIndex < 0) {
|
|
293
349
|
this.currentIndex = this.queryResult.length - 1;
|
|
294
350
|
}
|
|
295
|
-
const {
|
|
296
|
-
this.jumpToCell({ IndexNumber: indexNumber });
|
|
297
|
-
|
|
298
|
-
let i = 0;
|
|
299
|
-
while (this.table.isHeader(0, i)) {
|
|
300
|
-
i++;
|
|
301
|
-
}
|
|
302
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
303
|
-
range.start.row = row;
|
|
304
|
-
range.end.row = row;
|
|
305
|
-
this.arrangeCustomCellStyle({ range }, true, FocusHighlightStyleId);
|
|
306
|
-
}
|
|
351
|
+
const { indexNumber, col } = this.queryResult[this.currentIndex];
|
|
352
|
+
this.jumpToCell({ IndexNumber: indexNumber, col });
|
|
353
|
+
this.updateCellStyle();
|
|
307
354
|
}
|
|
308
355
|
else {
|
|
309
356
|
if (this.currentIndex !== -1) {
|
|
@@ -342,9 +389,10 @@
|
|
|
342
389
|
}
|
|
343
390
|
}
|
|
344
391
|
const finalRow = this.getBodyRowIndexByRecordIndex(indexNumbers) + i;
|
|
345
|
-
|
|
392
|
+
const targetCol = typeof params.col === 'number' ? params.col : this.getTreeCol();
|
|
393
|
+
this.table.scrollToCell({ row: finalRow, col: targetCol }, this.scrollOption);
|
|
346
394
|
if (this.enableViewportScroll) {
|
|
347
|
-
scrollVTableCellIntoView(this.table, { row: finalRow, col:
|
|
395
|
+
scrollVTableCellIntoView(this.table, { row: finalRow, col: targetCol });
|
|
348
396
|
}
|
|
349
397
|
}
|
|
350
398
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).VTable=e.VTable||{},e.VTable.search={}))}(this,(function(e){"use strict";var t=e=>null!=e;const
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).VTable=e.VTable||{},e.VTable.search={}))}(this,(function(e){"use strict";var t=e=>null!=e;const l="__search_component_highlight",r="__search_component_focus",s={bgColor:"rgba(255, 255, 0, 0.2)"},i={bgColor:"rgba(255, 155, 0, 0.2)"};function o(e,l){return t(e)&&t(l)&&l.toString().includes(e)}function n(e,l,r){if(!t(e))return!1;return(Array.isArray(r)&&r.length>0?r:Object.keys(l)).some((r=>t(l?.[r])&&l[r].toString().includes(e)))}function h(e,t){if("undefined"==typeof document||"undefined"==typeof window)return;const l=e.getElement?.()||e.container;if(!l)return;const r=e.getCellRect(t.col,t.row);if(!r)return;let s=l.parentElement;for(;s;){const e=getComputedStyle(s),t=/(auto|scroll|overlay)/.test(e.overflowY),l=s.scrollHeight>s.clientHeight;if(t&&l)break;s=s.parentElement||s.getRootNode?.()?.host||null}s||(s=document.scrollingElement||document.documentElement);const i=s,o=l.getBoundingClientRect(),n=i.getBoundingClientRect(),h=o.top-n.top+i.scrollTop+r.top,u=h+r.height,c=i.clientHeight,a=i.scrollTop;if(!(h>=a&&u<=a+c)){let e;e=h<a?h:u-c,i.scrollTop=Math.max(0,e)}}e.SearchComponent=class{table;skipHeader;autoJump;highlightCellStyle;focuseHighlightCellStyle;focusHighlightCellStyle;queryMethod;treeQueryMethod;fieldsToSearch;enableViewportScroll;callback;queryStr;queryResult;currentIndex;isTree;treeIndex;scrollOption;constructor(e){this.table=e.table,this.autoJump=e.autoJump||!1,this.skipHeader=e.skipHeader||!1,this.highlightCellStyle=e.highlightCellStyle||s,this.focusHighlightCellStyle=e.focusHighlightCellStyle||e.focuseHighlightCellStyle||i,this.queryMethod=e.queryMethod||o,this.treeQueryMethod=e.treeQueryMethod||n,this.fieldsToSearch=e.fieldsToSearch||[],this.isTree=!1,this.treeIndex=0,this.callback=e.callback,this.scrollOption=e.scrollOption||{duration:900,easing:"quartIn"},this.enableViewportScroll=e.enableViewportScroll||!1,this.table.registerCustomCellStyle(l,this.highlightCellStyle),this.table.registerCustomCellStyle(r,this.focusHighlightCellStyle)}getHeaderOffset(){let e=0;for(;this.table.isHeader(0,e);)e++;return e}getHeaderCellAddressByField(e){const t=this.table.internalProps?.layoutMap;return t?.getHeaderCellAddressByField?.(e)}getTreeCol(){const e=this.table?.options?.columns?.find((e=>e?.tree)),t=e?.field;if("string"==typeof t&&t){const e=this.getHeaderCellAddressByField(t);if(e&&"number"==typeof e.col)return e.col}return this.treeIndex}getVisibleTreeCell(e){if(!e.indexNumber)return;const t=this.getBodyRowIndexByRecordIndex(e.indexNumber);return t<0?void 0:{col:"number"==typeof e.col?e.col:this.getTreeCol(),row:t+this.getHeaderOffset()}}clearRenderedCellStyles(){const e=this.table.customCellStylePlugin,t=[];Array.from(e?.customCellStyleArrangement||[]).forEach((e=>{const l=e?.cellPosition;"number"==typeof l?.col&&"number"==typeof l?.row&&t.push({col:l.col,row:l.row})})),e.clearCustomCellStyleArrangement(),t.forEach((({col:e,row:t})=>{this.table.scenegraph.updateCellContent(e,t,!0)}))}search(e){if(this.clear(),this.queryStr=e,!e)return{index:0,results:this.queryResult};if(this.isTree=this.table.options.columns.some((e=>e.tree)),this.treeIndex=this.isTree?this.table.options.columns.findIndex((e=>e.tree)):0,this.isTree){const e=this.getTreeCol(),l=(r,s)=>{r.forEach(((r,i)=>{const o=[...s,i],n=Array.isArray(this.fieldsToSearch)&&this.fieldsToSearch.length>0?this.fieldsToSearch:Object.keys(r);let h=!1;n.forEach((l=>{const s=r?.[l];if(!t(s))return;const i=this.getHeaderCellAddressByField(l)?.col??e;this.queryMethod(this.queryStr,s,{col:i,row:0,table:this.table})&&(h=!0,this.queryResult.push({indexNumber:o,col:i,value:s?.toString?.()??String(s)}))})),!h&&this.treeQueryMethod&&this.treeQueryMethod(this.queryStr,r,this.fieldsToSearch,{table:this.table})&&this.queryResult.push({indexNumber:o,col:e}),r.children&&Array.isArray(r.children)&&r.children.length>0&&l(r.children,o)}))};l(this.table.records,[]);const r=new Set;return this.queryResult=this.queryResult.filter((e=>{const t=`${(e.indexNumber||[]).join(".")}:${e.col??""}`;return!r.has(t)&&(r.add(t),!0)})),this.currentIndex=this.queryResult.length>0?0:-1,this.queryResult.length>0&&this.jumpToCell({IndexNumber:this.queryResult[0].indexNumber,col:this.queryResult[0].col??e}),this.callback&&this.callback({queryStr:this.queryStr,results:this.queryResult},this.table),this.updateCellStyle(),{index:this.currentIndex>=0?this.currentIndex:0,results:this.queryResult}}for(let e=0;e<this.table.rowCount;e++)for(let t=0;t<this.table.colCount;t++){if(this.skipHeader&&this.table.isHeader(t,e))continue;const l=this.table.getCellValue(t,e);if(this.queryMethod(this.queryStr,l,{col:t,row:e,table:this.table})){const r=this.table.getCellRange(t,e);if(r.start.col!==r.end.col||r.start.row!==r.end.row){let e=!1;for(let t=this.queryResult.length-1;t>=0;t--)if(this.queryResult[t].col===r.start.col&&this.queryResult[t].row===r.start.row){e=!0;break}e||this.queryResult.push({col:r.start.col,row:r.start.row,range:r,value:l})}else this.queryResult.push({col:t,row:e,value:l})}}return this.updateCellStyle(),this.callback&&this.callback({queryStr:this.queryStr,results:this.queryResult},this.table),this.autoJump?this.next():{index:0,results:this.queryResult}}arrangeCustomCellStyle(e,t=!0,r=l){const{col:s,row:i,range:o}=e;this.table.arrangeCustomCellStyle(o?{range:o}:{row:i,col:s},t?r:null)}updateCellStyle(e=!0){if(!e)return this.clearRenderedCellStyles(),void this.table.scenegraph.updateNextFrame();if(this.queryResult)if(this.table.hasCustomCellStyle(l)||this.table.registerCustomCellStyle(l,this.highlightCellStyle),this.table.hasCustomCellStyle(r)||this.table.registerCustomCellStyle(r,this.focusHighlightCellStyle),this.clearRenderedCellStyles(),this.isTree){if(!this.queryResult.length)return void this.table.scenegraph.updateNextFrame();for(let e=0;e<this.queryResult.length;e++){const t=this.getVisibleTreeCell(this.queryResult[e]);t&&(this.table.customCellStylePlugin.addCustomCellStyleArrangement({col:t.col,row:t.row},l),this.table.scenegraph.updateCellContent(t.col,t.row,!0))}if(this.currentIndex>=0&&this.currentIndex<this.queryResult.length){const e=this.getVisibleTreeCell(this.queryResult[this.currentIndex]);e&&(this.table.customCellStylePlugin.addCustomCellStyleArrangement({col:e.col,row:e.row},r),this.table.scenegraph.updateCellContent(e.col,e.row,!0))}this.table.scenegraph.updateNextFrame()}else{for(let e=0;e<this.queryResult.length;e++)this.table.customCellStylePlugin.addCustomCellStyleArrangement({col:this.queryResult[e].col,row:this.queryResult[e].row},l),this.table.scenegraph.updateCellContent(this.queryResult[e].col,this.queryResult[e].row,!0);this.table.scenegraph.updateNextFrame()}}next(){if(!this.queryResult.length)return{index:0,results:this.queryResult};if(this.isTree){this.currentIndex++,this.currentIndex>=this.queryResult.length&&(this.currentIndex=0);const{indexNumber:e,col:t}=this.queryResult[this.currentIndex];this.jumpToCell({IndexNumber:e,col:t}),this.updateCellStyle()}else{-1!==this.currentIndex&&this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]),this.currentIndex++,this.currentIndex>=this.queryResult.length&&(this.currentIndex=0);const{col:e,row:t}=this.queryResult[this.currentIndex];this.arrangeCustomCellStyle(this.queryResult[this.currentIndex],!0,r),this.jumpToCell({col:e,row:t})}return{index:this.currentIndex,results:this.queryResult}}prev(){if(!this.queryResult.length)return{index:0,results:this.queryResult};if(this.isTree){this.currentIndex--,this.currentIndex<0&&(this.currentIndex=this.queryResult.length-1);const{indexNumber:e,col:t}=this.queryResult[this.currentIndex];this.jumpToCell({IndexNumber:e,col:t}),this.updateCellStyle()}else{-1!==this.currentIndex&&this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]),this.currentIndex--,this.currentIndex<0&&(this.currentIndex=this.queryResult.length-1);const{col:e,row:t}=this.queryResult[this.currentIndex];this.arrangeCustomCellStyle(this.queryResult[this.currentIndex],!0,r),this.jumpToCell({col:e,row:t})}return{index:this.currentIndex,results:this.queryResult}}jumpToCell(e){if(this.isTree){const{IndexNumber:t}=e,l=[...t],r=[...l];let s=0,i=0;for(;s<r.length-1;){s++;const e=l.slice(0,s);for(;this.table.isHeader(0,i);)i++;const t=this.getBodyRowIndexByRecordIndex(e)+i;"expand"!==this.table.getHierarchyState(this.treeIndex,t)&&this.table.toggleHierarchyState(this.treeIndex,t)}const o=this.getBodyRowIndexByRecordIndex(l)+i,n="number"==typeof e.col?e.col:this.getTreeCol();this.table.scrollToCell({row:o,col:n},this.scrollOption),this.enableViewportScroll&&h(this.table,{row:o,col:n})}else{const{col:t,row:l}=e,{rowStart:r,rowEnd:s}=this.table.getBodyVisibleRowRange(),{colStart:i,colEnd:o}=this.table.getBodyVisibleColRange();!(l<=r||l>=s||t<=i||t>=o)||this.table.scrollToCell({col:t,row:l}),this.enableViewportScroll&&h(this.table,{row:l,col:t})}}getBodyRowIndexByRecordIndex(e){return Array.isArray(e)&&1===e.length&&(e=e[0]),this.table.dataSource.getTableIndex(e)}clear(){this.updateCellStyle(!1),this.queryStr="",this.queryResult=[],this.currentIndex=-1}}}));
|
|
@@ -61,6 +61,11 @@ export declare class SearchComponent {
|
|
|
61
61
|
treeIndex: number;
|
|
62
62
|
scrollOption: ITableAnimationOption;
|
|
63
63
|
constructor(option: SearchComponentOption);
|
|
64
|
+
private getHeaderOffset;
|
|
65
|
+
private getHeaderCellAddressByField;
|
|
66
|
+
private getTreeCol;
|
|
67
|
+
private getVisibleTreeCell;
|
|
68
|
+
private clearRenderedCellStyles;
|
|
64
69
|
search(str: string): {
|
|
65
70
|
index: number;
|
|
66
71
|
results: {
|
|
@@ -28,40 +28,93 @@ export class SearchComponent {
|
|
|
28
28
|
}, this.enableViewportScroll = option.enableViewportScroll || !1, this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle),
|
|
29
29
|
this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle);
|
|
30
30
|
}
|
|
31
|
+
getHeaderOffset() {
|
|
32
|
+
let offset = 0;
|
|
33
|
+
for (;this.table.isHeader(0, offset); ) offset++;
|
|
34
|
+
return offset;
|
|
35
|
+
}
|
|
36
|
+
getHeaderCellAddressByField(field) {
|
|
37
|
+
var _a, _b;
|
|
38
|
+
const layoutMap = null === (_a = this.table.internalProps) || void 0 === _a ? void 0 : _a.layoutMap;
|
|
39
|
+
return null === (_b = null == layoutMap ? void 0 : layoutMap.getHeaderCellAddressByField) || void 0 === _b ? void 0 : _b.call(layoutMap, field);
|
|
40
|
+
}
|
|
41
|
+
getTreeCol() {
|
|
42
|
+
var _a, _b, _c;
|
|
43
|
+
const treeColumn = null === (_c = null === (_b = null === (_a = this.table) || void 0 === _a ? void 0 : _a.options) || void 0 === _b ? void 0 : _b.columns) || void 0 === _c ? void 0 : _c.find((c => null == c ? void 0 : c.tree)), field = null == treeColumn ? void 0 : treeColumn.field;
|
|
44
|
+
if ("string" == typeof field && field) {
|
|
45
|
+
const addr = this.getHeaderCellAddressByField(field);
|
|
46
|
+
if (addr && "number" == typeof addr.col) return addr.col;
|
|
47
|
+
}
|
|
48
|
+
return this.treeIndex;
|
|
49
|
+
}
|
|
50
|
+
getVisibleTreeCell(resultItem) {
|
|
51
|
+
if (!resultItem.indexNumber) return;
|
|
52
|
+
const rawIndex = this.getBodyRowIndexByRecordIndex(resultItem.indexNumber);
|
|
53
|
+
return rawIndex < 0 ? void 0 : {
|
|
54
|
+
col: "number" == typeof resultItem.col ? resultItem.col : this.getTreeCol(),
|
|
55
|
+
row: rawIndex + this.getHeaderOffset()
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
clearRenderedCellStyles() {
|
|
59
|
+
const plugin = this.table.customCellStylePlugin, cellsToRefresh = [];
|
|
60
|
+
Array.from((null == plugin ? void 0 : plugin.customCellStyleArrangement) || []).forEach((item => {
|
|
61
|
+
const cellPosition = null == item ? void 0 : item.cellPosition;
|
|
62
|
+
"number" == typeof (null == cellPosition ? void 0 : cellPosition.col) && "number" == typeof (null == cellPosition ? void 0 : cellPosition.row) && cellsToRefresh.push({
|
|
63
|
+
col: cellPosition.col,
|
|
64
|
+
row: cellPosition.row
|
|
65
|
+
});
|
|
66
|
+
})), plugin.clearCustomCellStyleArrangement(), cellsToRefresh.forEach((({col: col, row: row}) => {
|
|
67
|
+
this.table.scenegraph.updateCellContent(col, row, !0);
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
31
70
|
search(str) {
|
|
71
|
+
var _a;
|
|
32
72
|
if (this.clear(), this.queryStr = str, !str) return {
|
|
33
73
|
index: 0,
|
|
34
74
|
results: this.queryResult
|
|
35
75
|
};
|
|
36
76
|
if (this.isTree = this.table.options.columns.some((item => item.tree)), this.treeIndex = this.isTree ? this.table.options.columns.findIndex((item => item.tree)) : 0,
|
|
37
77
|
this.isTree) {
|
|
38
|
-
const
|
|
78
|
+
const treeCol = this.getTreeCol(), walk = (nodes, path) => {
|
|
39
79
|
nodes.forEach(((item, idx) => {
|
|
40
|
-
const currentPath = [ ...path, idx ];
|
|
41
|
-
|
|
80
|
+
const currentPath = [ ...path, idx ], searchFields = Array.isArray(this.fieldsToSearch) && this.fieldsToSearch.length > 0 ? this.fieldsToSearch : Object.keys(item);
|
|
81
|
+
let hitAnyField = !1;
|
|
82
|
+
searchFields.forEach((field => {
|
|
83
|
+
var _a, _b, _c, _d;
|
|
84
|
+
const value = null == item ? void 0 : item[field];
|
|
85
|
+
if (!isValid(value)) return;
|
|
86
|
+
const col = null !== (_b = null === (_a = this.getHeaderCellAddressByField(field)) || void 0 === _a ? void 0 : _a.col) && void 0 !== _b ? _b : treeCol;
|
|
87
|
+
this.queryMethod(this.queryStr, value, {
|
|
88
|
+
col: col,
|
|
89
|
+
row: 0,
|
|
90
|
+
table: this.table
|
|
91
|
+
}) && (hitAnyField = !0, this.queryResult.push({
|
|
92
|
+
indexNumber: currentPath,
|
|
93
|
+
col: col,
|
|
94
|
+
value: null !== (_d = null === (_c = null == value ? void 0 : value.toString) || void 0 === _c ? void 0 : _c.call(value)) && void 0 !== _d ? _d : String(value)
|
|
95
|
+
}));
|
|
96
|
+
})), !hitAnyField && this.treeQueryMethod && this.treeQueryMethod(this.queryStr, item, this.fieldsToSearch, {
|
|
42
97
|
table: this.table
|
|
43
98
|
}) && this.queryResult.push({
|
|
44
99
|
indexNumber: currentPath,
|
|
45
|
-
|
|
46
|
-
start: {
|
|
47
|
-
row: null,
|
|
48
|
-
col: 0
|
|
49
|
-
},
|
|
50
|
-
end: {
|
|
51
|
-
row: null,
|
|
52
|
-
col: colEnd
|
|
53
|
-
}
|
|
54
|
-
}
|
|
100
|
+
col: treeCol
|
|
55
101
|
}), item.children && Array.isArray(item.children) && item.children.length > 0 && walk(item.children, currentPath);
|
|
56
102
|
}));
|
|
57
103
|
};
|
|
58
|
-
|
|
59
|
-
|
|
104
|
+
walk(this.table.records, []);
|
|
105
|
+
const dedup = new Set;
|
|
106
|
+
return this.queryResult = this.queryResult.filter((r => {
|
|
107
|
+
var _a;
|
|
108
|
+
const key = `${(r.indexNumber || []).join(".")}:${null !== (_a = r.col) && void 0 !== _a ? _a : ""}`;
|
|
109
|
+
return !dedup.has(key) && (dedup.add(key), !0);
|
|
110
|
+
})), this.currentIndex = this.queryResult.length > 0 ? 0 : -1, this.queryResult.length > 0 && this.jumpToCell({
|
|
111
|
+
IndexNumber: this.queryResult[0].indexNumber,
|
|
112
|
+
col: null !== (_a = this.queryResult[0].col) && void 0 !== _a ? _a : treeCol
|
|
60
113
|
}), this.callback && this.callback({
|
|
61
114
|
queryStr: this.queryStr,
|
|
62
115
|
results: this.queryResult
|
|
63
|
-
}, this.table), this.updateCellStyle(),
|
|
64
|
-
index: 0,
|
|
116
|
+
}, this.table), this.updateCellStyle(), {
|
|
117
|
+
index: this.currentIndex >= 0 ? this.currentIndex : 0,
|
|
65
118
|
results: this.queryResult
|
|
66
119
|
};
|
|
67
120
|
}
|
|
@@ -111,20 +164,26 @@ export class SearchComponent {
|
|
|
111
164
|
}, highlight ? customStyleId : null);
|
|
112
165
|
}
|
|
113
166
|
updateCellStyle(highlight = !0) {
|
|
114
|
-
if (!highlight) return this.table.
|
|
115
|
-
(this.queryResult || []).forEach((resultItem => {
|
|
116
|
-
this.table.scenegraph.updateCellContent(resultItem.col, resultItem.row);
|
|
117
|
-
})), void this.table.scenegraph.updateNextFrame();
|
|
167
|
+
if (!highlight) return this.clearRenderedCellStyles(), void this.table.scenegraph.updateNextFrame();
|
|
118
168
|
if (this.queryResult) if (this.table.hasCustomCellStyle(HighlightStyleId) || this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle),
|
|
119
169
|
this.table.hasCustomCellStyle(FocusHighlightStyleId) || this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle),
|
|
120
|
-
this.isTree) {
|
|
121
|
-
|
|
122
|
-
let i = 0;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
170
|
+
this.clearRenderedCellStyles(), this.isTree) {
|
|
171
|
+
if (!this.queryResult.length) return void this.table.scenegraph.updateNextFrame();
|
|
172
|
+
for (let i = 0; i < this.queryResult.length; i++) {
|
|
173
|
+
const cell = this.getVisibleTreeCell(this.queryResult[i]);
|
|
174
|
+
cell && (this.table.customCellStylePlugin.addCustomCellStyleArrangement({
|
|
175
|
+
col: cell.col,
|
|
176
|
+
row: cell.row
|
|
177
|
+
}, HighlightStyleId), this.table.scenegraph.updateCellContent(cell.col, cell.row, !0));
|
|
178
|
+
}
|
|
179
|
+
if (this.currentIndex >= 0 && this.currentIndex < this.queryResult.length) {
|
|
180
|
+
const cell = this.getVisibleTreeCell(this.queryResult[this.currentIndex]);
|
|
181
|
+
cell && (this.table.customCellStylePlugin.addCustomCellStyleArrangement({
|
|
182
|
+
col: cell.col,
|
|
183
|
+
row: cell.row
|
|
184
|
+
}, FocusHighlightStyleId), this.table.scenegraph.updateCellContent(cell.col, cell.row, !0));
|
|
185
|
+
}
|
|
186
|
+
this.table.scenegraph.updateNextFrame();
|
|
128
187
|
} else {
|
|
129
188
|
for (let i = 0; i < this.queryResult.length; i++) this.table.customCellStylePlugin.addCustomCellStyleArrangement({
|
|
130
189
|
col: this.queryResult[i].col,
|
|
@@ -139,29 +198,12 @@ export class SearchComponent {
|
|
|
139
198
|
results: this.queryResult
|
|
140
199
|
};
|
|
141
200
|
if (this.isTree) {
|
|
142
|
-
if (-1 !== this.currentIndex) {
|
|
143
|
-
const {range: range, indexNumber: indexNumber} = this.queryResult[this.currentIndex];
|
|
144
|
-
if (range) {
|
|
145
|
-
let i = 0;
|
|
146
|
-
for (;this.table.isHeader(0, i); ) i++;
|
|
147
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
148
|
-
range.start.row = row, range.end.row = row, this.arrangeCustomCellStyle({
|
|
149
|
-
range: range
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
201
|
this.currentIndex++, this.currentIndex >= this.queryResult.length && (this.currentIndex = 0);
|
|
154
|
-
const {
|
|
155
|
-
|
|
156
|
-
IndexNumber: indexNumber
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
for (;this.table.isHeader(0, i); ) i++;
|
|
160
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
161
|
-
range.start.row = row, range.end.row = row, this.arrangeCustomCellStyle({
|
|
162
|
-
range: range
|
|
163
|
-
}, !0, FocusHighlightStyleId);
|
|
164
|
-
}
|
|
202
|
+
const {indexNumber: indexNumber, col: col} = this.queryResult[this.currentIndex];
|
|
203
|
+
this.jumpToCell({
|
|
204
|
+
IndexNumber: indexNumber,
|
|
205
|
+
col: col
|
|
206
|
+
}), this.updateCellStyle();
|
|
165
207
|
} else {
|
|
166
208
|
-1 !== this.currentIndex && this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]),
|
|
167
209
|
this.currentIndex++, this.currentIndex >= this.queryResult.length && (this.currentIndex = 0);
|
|
@@ -183,29 +225,12 @@ export class SearchComponent {
|
|
|
183
225
|
results: this.queryResult
|
|
184
226
|
};
|
|
185
227
|
if (this.isTree) {
|
|
186
|
-
if (-1 !== this.currentIndex) {
|
|
187
|
-
const {range: range, indexNumber: indexNumber} = this.queryResult[this.currentIndex];
|
|
188
|
-
if (range) {
|
|
189
|
-
let i = 0;
|
|
190
|
-
for (;this.table.isHeader(0, i); ) i++;
|
|
191
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
192
|
-
range.start.row = row, range.end.row = row, this.arrangeCustomCellStyle({
|
|
193
|
-
range: range
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
228
|
this.currentIndex--, this.currentIndex < 0 && (this.currentIndex = this.queryResult.length - 1);
|
|
198
|
-
const {
|
|
199
|
-
|
|
200
|
-
IndexNumber: indexNumber
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
for (;this.table.isHeader(0, i); ) i++;
|
|
204
|
-
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
205
|
-
range.start.row = row, range.end.row = row, this.arrangeCustomCellStyle({
|
|
206
|
-
range: range
|
|
207
|
-
}, !0, FocusHighlightStyleId);
|
|
208
|
-
}
|
|
229
|
+
const {indexNumber: indexNumber, col: col} = this.queryResult[this.currentIndex];
|
|
230
|
+
this.jumpToCell({
|
|
231
|
+
IndexNumber: indexNumber,
|
|
232
|
+
col: col
|
|
233
|
+
}), this.updateCellStyle();
|
|
209
234
|
} else {
|
|
210
235
|
-1 !== this.currentIndex && this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]),
|
|
211
236
|
this.currentIndex--, this.currentIndex < 0 && (this.currentIndex = this.queryResult.length - 1);
|
|
@@ -232,10 +257,13 @@ export class SearchComponent {
|
|
|
232
257
|
const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;
|
|
233
258
|
"expand" !== this.table.getHierarchyState(this.treeIndex, row) && this.table.toggleHierarchyState(this.treeIndex, row);
|
|
234
259
|
}
|
|
235
|
-
const finalRow = this.getBodyRowIndexByRecordIndex(indexNumbers) + i;
|
|
236
|
-
this.table.
|
|
260
|
+
const finalRow = this.getBodyRowIndexByRecordIndex(indexNumbers) + i, targetCol = "number" == typeof params.col ? params.col : this.getTreeCol();
|
|
261
|
+
this.table.scrollToCell({
|
|
262
|
+
row: finalRow,
|
|
263
|
+
col: targetCol
|
|
264
|
+
}, this.scrollOption), this.enableViewportScroll && scrollVTableCellIntoView(this.table, {
|
|
237
265
|
row: finalRow,
|
|
238
|
-
col:
|
|
266
|
+
col: targetCol
|
|
239
267
|
});
|
|
240
268
|
} else {
|
|
241
269
|
const {col: col, row: row} = params, {rowStart: rowStart, rowEnd: rowEnd} = this.table.getBodyVisibleRowRange(), {colStart: colStart, colEnd: colEnd} = this.table.getBodyVisibleColRange();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["search-component/search-component.ts"],"names":[],"mappings":"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","file":"search-component.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport type { ITableAnimationOption } from '@visactor/vtable/src/ts-types';\nimport type { EasingType } from '@visactor/vtable/src/vrender';\nimport { isValid } from '@visactor/vutils';\ntype IVTable = VTable.ListTable | VTable.PivotTable | VTable.PivotChart;\n\nexport type QueryResult = {\n queryStr: string;\n results: {\n col?: number;\n row?: number;\n value?: string;\n indexNumber?: number[];\n }[];\n};\n\nexport type SearchComponentOption = {\n table: IVTable;\n autoJump?: boolean;\n skipHeader?: boolean;\n highlightCellStyle?: VTable.TYPES.CellStyle;\n /**\n * @deprecated use focusHighlightCellStyle instead\n */\n focuseHighlightCellStyle?: VTable.TYPES.CellStyle;\n focusHighlightCellStyle?: VTable.TYPES.CellStyle;\n queryMethod?: (queryStr: string, value: string, option?: { col: number; row: number; table: IVTable }) => boolean;\n treeQueryMethod?: (queryStr: string, node: any, fieldsToSearch?: string[], option?: { table: IVTable }) => boolean;\n fieldsToSearch?: string[];\n scrollOption?: ITableAnimationOption;\n /**\n * 当开启时,搜索结果会自动滚动到视口范围内\n * @since 1.22.4\n */\n enableViewportScroll?: boolean;\n callback?: (queryResult: QueryResult, table: IVTable) => void;\n};\n\nconst HighlightStyleId = '__search_component_highlight';\nconst FocusHighlightStyleId = '__search_component_focus';\n\nconst defaultHighlightCellStyle: Partial<VTable.TYPES.CellStyle> = {\n bgColor: 'rgba(255, 255, 0, 0.2)'\n};\n\nconst defaultFocusHighlightCellStyle: Partial<VTable.TYPES.CellStyle> = {\n bgColor: 'rgba(255, 155, 0, 0.2)'\n};\n\nfunction defaultQueryMethod(queryStr: string, value: string) {\n return isValid(queryStr) && isValid(value) && value.toString().includes(queryStr);\n}\nfunction defaultTreeQueryMethod(queryStr: string, node: any, fieldsToSearch?: string[]) {\n if (!isValid(queryStr)) {\n return false;\n }\n\n // 如果没有传 fieldsToSearch,则用 node 的全部 key\n const searchFields = Array.isArray(fieldsToSearch) && fieldsToSearch.length > 0 ? fieldsToSearch : Object.keys(node);\n\n return searchFields.some(field => isValid(node?.[field]) && node[field].toString().includes(queryStr));\n}\nexport class SearchComponent {\n table: IVTable;\n skipHeader: boolean;\n autoJump: boolean;\n highlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n focuseHighlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n focusHighlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n queryMethod: (queryStr: string, value: string, option: { col: number; row: number; table: IVTable }) => boolean;\n treeQueryMethod: (queryStr: string, node: any, fieldsToSearch?: string[], option?: { table: IVTable }) => boolean;\n fieldsToSearch: string[];\n enableViewportScroll?: boolean;\n callback?: (queryResult: QueryResult, table: IVTable) => void;\n\n queryStr: string;\n queryResult: {\n col?: number;\n row?: number;\n range?: VTable.TYPES.CellRange;\n value?: string;\n indexNumber?: number[];\n }[];\n\n currentIndex: number;\n isTree: boolean;\n treeIndex: number;\n scrollOption: ITableAnimationOption;\n\n constructor(option: SearchComponentOption) {\n this.table = option.table;\n this.autoJump = option.autoJump || false;\n this.skipHeader = option.skipHeader || false;\n this.highlightCellStyle = option.highlightCellStyle || defaultHighlightCellStyle;\n this.focusHighlightCellStyle =\n // 兼容兜底处理,修复拼写错误的问题\n option.focusHighlightCellStyle || option.focuseHighlightCellStyle || defaultFocusHighlightCellStyle;\n this.queryMethod = option.queryMethod || defaultQueryMethod;\n this.treeQueryMethod = option.treeQueryMethod || defaultTreeQueryMethod;\n this.fieldsToSearch = option.fieldsToSearch || [];\n this.isTree = false;\n this.treeIndex = 0;\n this.callback = option.callback;\n this.scrollOption =\n option.scrollOption || ({ duration: 900, easing: 'quartIn' as EasingType } as ITableAnimationOption);\n this.enableViewportScroll = option.enableViewportScroll || false;\n this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle as any);\n this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle as any);\n }\n\n search(str: string) {\n this.clear();\n this.queryStr = str;\n\n if (!str) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n this.isTree = this.table.options.columns.some((item: any) => item.tree);\n this.treeIndex = this.isTree ? this.table.options.columns.findIndex((item: any) => item.tree) : 0;\n if (this.isTree) {\n // 如果传入单一节点也能处理\n const colEnd = this.table.colCount;\n const walk = (nodes: any[], path: number[]) => {\n nodes.forEach((item: any, idx: number) => {\n const currentPath = [...path, idx]; // 当前节点的完整路径\n\n // 保持你的 treeQueryMethod 调用方式(this 上下文来自定义环境)\n if (this.treeQueryMethod(this.queryStr, item, this.fieldsToSearch, { table: this.table })) {\n this.queryResult.push({\n indexNumber: currentPath,\n range: {\n start: { row: null, col: 0 },\n end: { row: null, col: colEnd }\n }\n });\n }\n\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\n walk(item.children, currentPath);\n }\n });\n };\n\n walk(this.table.records, []);\n if (this.queryResult.length > 0) {\n this.jumpToCell({ IndexNumber: this.queryResult[0].indexNumber });\n }\n\n if (this.callback) {\n this.callback(\n {\n queryStr: this.queryStr,\n results: this.queryResult\n },\n this.table\n );\n }\n this.updateCellStyle();\n\n // if (this.autoJump) {\n // return this.next();\n // }\n this.currentIndex = 0;\n\n return {\n index: 0,\n results: this.queryResult\n };\n }\n for (let row = 0; row < this.table.rowCount; row++) {\n for (let col = 0; col < this.table.colCount; col++) {\n if (this.skipHeader && this.table.isHeader(col, row)) {\n continue;\n }\n const value = this.table.getCellValue(col, row);\n if (this.queryMethod(this.queryStr, value, { col, row, table: this.table })) {\n // deal merge cell\n const mergeCell = this.table.getCellRange(col, row);\n if (mergeCell.start.col !== mergeCell.end.col || mergeCell.start.row !== mergeCell.end.row) {\n // find is cell already in queryResult\n let isIn = false;\n for (let i = this.queryResult.length - 1; i >= 0; i--) {\n if (this.queryResult[i].col === mergeCell.start.col && this.queryResult[i].row === mergeCell.start.row) {\n isIn = true;\n break;\n }\n }\n if (!isIn) {\n this.queryResult.push({\n col: mergeCell.start.col,\n row: mergeCell.start.row,\n range: mergeCell,\n value\n });\n }\n } else {\n this.queryResult.push({\n col,\n row,\n value\n });\n }\n }\n }\n }\n this.updateCellStyle();\n\n if (this.callback) {\n this.callback(\n {\n queryStr: this.queryStr,\n results: this.queryResult\n },\n this.table\n );\n }\n\n if (this.autoJump) {\n return this.next();\n }\n return {\n index: 0,\n results: this.queryResult\n };\n }\n\n /**\n * @description: 为查询结果项设置自定义单元格样式\n * @param {(typeof this.queryResult)[number]} resultItem 查询结果项\n * @param {boolean} highlight 是否高亮\n * @param {string} customStyleId 自定义样式ID\n */\n arrangeCustomCellStyle(\n resultItem: typeof this.queryResult[number],\n highlight: boolean = true,\n customStyleId: string = HighlightStyleId\n ) {\n const { col, row, range } = resultItem;\n this.table.arrangeCustomCellStyle(\n range\n ? { range }\n : {\n row,\n col\n },\n highlight ? customStyleId : null\n );\n }\n\n updateCellStyle(highlight: boolean = true) {\n if (!highlight) {\n // (this.queryResult || []).forEach(resultItem => {\n // this.arrangeCustomCellStyle(resultItem, highlight);\n // });\n this.table.customCellStylePlugin.clearCustomCellStyleArrangement();\n (this.queryResult || []).forEach(resultItem => {\n this.table.scenegraph.updateCellContent(resultItem.col, resultItem.row);\n });\n this.table.scenegraph.updateNextFrame();\n return;\n }\n if (!this.queryResult) {\n return;\n }\n\n if (!this.table.hasCustomCellStyle(HighlightStyleId)) {\n this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle as any);\n }\n if (!this.table.hasCustomCellStyle(FocusHighlightStyleId)) {\n this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle as any);\n }\n if (this.isTree) {\n const { range, indexNumber } = this.queryResult[0];\n\n let i = 0;\n\n // 如果是表头就往下偏移\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n\n this.arrangeCustomCellStyle(\n {\n range\n },\n highlight,\n FocusHighlightStyleId\n );\n } else {\n // for (let i = 0; i < this.queryResult.length; i++) {\n // this.arrangeCustomCellStyle(this.queryResult[i], highlight);\n // }\n for (let i = 0; i < this.queryResult.length; i++) {\n this.table.customCellStylePlugin.addCustomCellStyleArrangement(\n {\n col: this.queryResult[i].col,\n row: this.queryResult[i].row\n },\n HighlightStyleId\n );\n this.table.scenegraph.updateCellContent(this.queryResult[i].col, this.queryResult[i].row, true);\n }\n this.table.scenegraph.updateNextFrame();\n }\n }\n\n next() {\n if (!this.queryResult.length) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n if (this.isTree) {\n if (this.currentIndex !== -1) {\n const { range, indexNumber } = this.queryResult[this.currentIndex];\n\n if (range) {\n let i = 0;\n\n // 如果是表头就往下偏移\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n this.arrangeCustomCellStyle({ range });\n }\n }\n\n this.currentIndex++;\n if (this.currentIndex >= this.queryResult.length) {\n this.currentIndex = 0;\n }\n const { range, indexNumber } = this.queryResult[this.currentIndex];\n this.jumpToCell({ IndexNumber: indexNumber });\n\n if (range) {\n let i = 0;\n\n // 如果是表头就往下偏移\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n this.arrangeCustomCellStyle(\n {\n range\n },\n true,\n FocusHighlightStyleId\n );\n }\n } else {\n if (this.currentIndex !== -1) {\n // reset last focus\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]);\n }\n this.currentIndex++;\n if (this.currentIndex >= this.queryResult.length) {\n this.currentIndex = 0;\n }\n const { col, row } = this.queryResult[this.currentIndex];\n\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex], true, FocusHighlightStyleId);\n\n this.jumpToCell({ col, row });\n }\n\n return {\n index: this.currentIndex,\n results: this.queryResult\n };\n }\n\n prev() {\n if (!this.queryResult.length) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n\n if (this.isTree) {\n // 先取消当前高亮\n if (this.currentIndex !== -1) {\n const { range, indexNumber } = this.queryResult[this.currentIndex];\n if (range) {\n let i = 0;\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n this.arrangeCustomCellStyle({ range });\n }\n }\n\n // 索引向前\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.queryResult.length - 1;\n }\n\n // 焦点样式\n const { range, indexNumber } = this.queryResult[this.currentIndex];\n this.jumpToCell({ IndexNumber: indexNumber });\n\n if (range) {\n let i = 0;\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n range.start.row = row;\n range.end.row = row;\n this.arrangeCustomCellStyle({ range }, true, FocusHighlightStyleId);\n }\n } else {\n // 普通表格处理\n if (this.currentIndex !== -1) {\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]);\n }\n\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.queryResult.length - 1;\n }\n\n const { col, row } = this.queryResult[this.currentIndex];\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex], true, FocusHighlightStyleId);\n this.jumpToCell({ col, row });\n }\n\n return {\n index: this.currentIndex,\n results: this.queryResult\n };\n }\n\n jumpToCell(params: { col?: number; row?: number; IndexNumber?: number[] }) {\n if (this.isTree) {\n const { IndexNumber } = params;\n const indexNumbers = [...IndexNumber];\n\n const tmp = [...indexNumbers];\n let tmpNumber = 0;\n let i = 0;\n\n // 展开树形结构的父节点\n while (tmpNumber < tmp.length - 1) {\n tmpNumber++;\n const indexNumber = indexNumbers.slice(0, tmpNumber);\n\n // 跳过表头行\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n\n const hierarchyState = this.table.getHierarchyState(this.treeIndex, row);\n if (hierarchyState !== 'expand') {\n this.table.toggleHierarchyState(this.treeIndex, row);\n }\n }\n\n const finalRow = this.getBodyRowIndexByRecordIndex(indexNumbers) + i;\n\n // 根据配置决定是否滚动表格\n this.table.scrollToRow(finalRow, this.scrollOption);\n\n // 根据配置决定是否滚动页面\n if (this.enableViewportScroll) {\n scrollVTableCellIntoView(this.table, { row: finalRow, col: this.treeIndex });\n }\n } else {\n const { col, row } = params;\n const { rowStart, rowEnd } = this.table.getBodyVisibleRowRange();\n const { colStart, colEnd } = this.table.getBodyVisibleColRange();\n\n // 检查单元格是否在表格可视范围内\n const isInTableView = !(row <= rowStart || row >= rowEnd || col <= colStart || col >= colEnd);\n\n // 根据配置决定是否滚动表格\n if (!isInTableView) {\n this.table.scrollToCell({ col, row });\n }\n\n // 根据配置决定是否滚动页面\n if (this.enableViewportScroll) {\n scrollVTableCellIntoView(this.table, { row, col });\n }\n }\n }\n getBodyRowIndexByRecordIndex(index: number | number[]): number {\n if (Array.isArray(index) && index.length === 1) {\n index = index[0];\n }\n return this.table.dataSource.getTableIndex(index);\n }\n clear() {\n // reset highlight cell style\n this.updateCellStyle(false);\n this.queryStr = '';\n this.queryResult = [];\n this.currentIndex = -1;\n }\n}\n\nfunction scrollVTableCellIntoView(table: IVTable, cellInfo: { row: number; col: number }): void {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n return;\n }\n\n const tableEl = table.getElement?.() || table.container;\n if (!tableEl) {\n return;\n }\n\n // 获取单元格在表格中的位置信息\n const cellRect = table.getCellRect(cellInfo.col, cellInfo.row);\n if (!cellRect) {\n return;\n }\n\n // 查找最近的可滚动父容器\n let scrollContainer: Element | null = tableEl.parentElement;\n while (scrollContainer) {\n const computedStyle = getComputedStyle(scrollContainer);\n const hasScroll = /(auto|scroll|overlay)/.test(computedStyle.overflowY);\n const canScroll = scrollContainer.scrollHeight > scrollContainer.clientHeight;\n\n if (hasScroll && canScroll) {\n break;\n }\n\n // 向上查找父元素,包括 Shadow DOM 情况\n scrollContainer = scrollContainer.parentElement || (scrollContainer.getRootNode?.() as ShadowRoot)?.host || null;\n }\n\n // 如果没找到可滚动容器,使用 document\n if (!scrollContainer) {\n scrollContainer = document.scrollingElement || document.documentElement;\n }\n\n const scrollContainerEl = scrollContainer as HTMLElement;\n\n // 计算单元格在滚动容器中的绝对位置\n const tableRect = tableEl.getBoundingClientRect();\n const containerRect = scrollContainerEl.getBoundingClientRect();\n\n // 表格相对于滚动容器的位置\n const tableOffsetTop = tableRect.top - containerRect.top + scrollContainerEl.scrollTop;\n\n // 单元格在滚动容器中的绝对位置\n const cellTop = tableOffsetTop + cellRect.top;\n const cellBottom = cellTop + cellRect.height;\n const containerHeight = scrollContainerEl.clientHeight;\n const scrollTop = scrollContainerEl.scrollTop;\n\n // 检查单元格是否完全可见\n const isFullyVisible = cellTop >= scrollTop && cellBottom <= scrollTop + containerHeight;\n\n if (!isFullyVisible) {\n // 计算新的滚动位置\n let newScrollTop: number;\n\n if (cellTop < scrollTop) {\n // 单元格在上方,滚动到单元格顶部\n newScrollTop = cellTop;\n } else {\n // 单元格在下方,滚动到单元格底部对齐容器底部\n newScrollTop = cellBottom - containerHeight;\n }\n\n // 确保滚动位置不小于 0\n scrollContainerEl.scrollTop = Math.max(0, newScrollTop);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["search-component/search-component.ts"],"names":[],"mappings":"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","file":"search-component.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport type { ITableAnimationOption } from '@visactor/vtable/src/ts-types';\nimport type { EasingType } from '@visactor/vtable/src/vrender';\nimport { isValid } from '@visactor/vutils';\ntype IVTable = VTable.ListTable | VTable.PivotTable | VTable.PivotChart;\n\nexport type QueryResult = {\n queryStr: string;\n results: {\n col?: number;\n row?: number;\n value?: string;\n indexNumber?: number[];\n }[];\n};\n\nexport type SearchComponentOption = {\n table: IVTable;\n autoJump?: boolean;\n skipHeader?: boolean;\n highlightCellStyle?: VTable.TYPES.CellStyle;\n /**\n * @deprecated use focusHighlightCellStyle instead\n */\n focuseHighlightCellStyle?: VTable.TYPES.CellStyle;\n focusHighlightCellStyle?: VTable.TYPES.CellStyle;\n queryMethod?: (queryStr: string, value: string, option?: { col: number; row: number; table: IVTable }) => boolean;\n treeQueryMethod?: (queryStr: string, node: any, fieldsToSearch?: string[], option?: { table: IVTable }) => boolean;\n fieldsToSearch?: string[];\n scrollOption?: ITableAnimationOption;\n /**\n * 当开启时,搜索结果会自动滚动到视口范围内\n * @since 1.22.4\n */\n enableViewportScroll?: boolean;\n callback?: (queryResult: QueryResult, table: IVTable) => void;\n};\n\nconst HighlightStyleId = '__search_component_highlight';\nconst FocusHighlightStyleId = '__search_component_focus';\n\nconst defaultHighlightCellStyle: Partial<VTable.TYPES.CellStyle> = {\n bgColor: 'rgba(255, 255, 0, 0.2)'\n};\n\nconst defaultFocusHighlightCellStyle: Partial<VTable.TYPES.CellStyle> = {\n bgColor: 'rgba(255, 155, 0, 0.2)'\n};\n\nfunction defaultQueryMethod(queryStr: string, value: string) {\n return isValid(queryStr) && isValid(value) && value.toString().includes(queryStr);\n}\nfunction defaultTreeQueryMethod(queryStr: string, node: any, fieldsToSearch?: string[]) {\n if (!isValid(queryStr)) {\n return false;\n }\n\n // 如果没有传 fieldsToSearch,则用 node 的全部 key\n const searchFields = Array.isArray(fieldsToSearch) && fieldsToSearch.length > 0 ? fieldsToSearch : Object.keys(node);\n\n return searchFields.some(field => isValid(node?.[field]) && node[field].toString().includes(queryStr));\n}\nexport class SearchComponent {\n table: IVTable;\n skipHeader: boolean;\n autoJump: boolean;\n highlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n focuseHighlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n focusHighlightCellStyle: Partial<VTable.TYPES.CellStyle>;\n queryMethod: (queryStr: string, value: string, option: { col: number; row: number; table: IVTable }) => boolean;\n treeQueryMethod: (queryStr: string, node: any, fieldsToSearch?: string[], option?: { table: IVTable }) => boolean;\n fieldsToSearch: string[];\n enableViewportScroll?: boolean;\n callback?: (queryResult: QueryResult, table: IVTable) => void;\n\n queryStr: string;\n queryResult: {\n col?: number;\n row?: number;\n range?: VTable.TYPES.CellRange;\n value?: string;\n indexNumber?: number[];\n }[];\n\n currentIndex: number;\n isTree: boolean;\n treeIndex: number;\n scrollOption: ITableAnimationOption;\n\n constructor(option: SearchComponentOption) {\n this.table = option.table;\n this.autoJump = option.autoJump || false;\n this.skipHeader = option.skipHeader || false;\n this.highlightCellStyle = option.highlightCellStyle || defaultHighlightCellStyle;\n this.focusHighlightCellStyle =\n // 兼容兜底处理,修复拼写错误的问题\n option.focusHighlightCellStyle || option.focuseHighlightCellStyle || defaultFocusHighlightCellStyle;\n this.queryMethod = option.queryMethod || defaultQueryMethod;\n this.treeQueryMethod = option.treeQueryMethod || defaultTreeQueryMethod;\n this.fieldsToSearch = option.fieldsToSearch || [];\n this.isTree = false;\n this.treeIndex = 0;\n this.callback = option.callback;\n this.scrollOption =\n option.scrollOption || ({ duration: 900, easing: 'quartIn' as EasingType } as ITableAnimationOption);\n this.enableViewportScroll = option.enableViewportScroll || false;\n this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle as any);\n this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle as any);\n }\n\n private getHeaderOffset(): number {\n let offset = 0;\n while (this.table.isHeader(0, offset)) {\n offset++;\n }\n return offset;\n }\n\n private getHeaderCellAddressByField(field: string): { col: number; row: number } | undefined {\n // PivotTable/ListTable share internal layoutMap API but it's not exposed on the public type.\n const layoutMap = (this.table as any).internalProps?.layoutMap;\n return layoutMap?.getHeaderCellAddressByField?.(field);\n }\n\n private getTreeCol(): number {\n const treeColumn = (this.table as any)?.options?.columns?.find((c: any) => c?.tree);\n const field = treeColumn?.field;\n if (typeof field === 'string' && field) {\n const addr = this.getHeaderCellAddressByField(field);\n if (addr && typeof addr.col === 'number') {\n return addr.col;\n }\n }\n // Fallback to previous behavior.\n return this.treeIndex;\n }\n\n private getVisibleTreeCell(resultItem: typeof this.queryResult[number]): { col: number; row: number } | undefined {\n if (!resultItem.indexNumber) {\n return undefined;\n }\n const rawIndex = this.getBodyRowIndexByRecordIndex(resultItem.indexNumber);\n if (rawIndex < 0) {\n return undefined;\n }\n return {\n col: typeof resultItem.col === 'number' ? resultItem.col : this.getTreeCol(),\n row: rawIndex + this.getHeaderOffset()\n };\n }\n\n private clearRenderedCellStyles() {\n const plugin = this.table.customCellStylePlugin;\n const cellsToRefresh: { col: number; row: number }[] = [];\n const arrangements = Array.from((plugin as any)?.customCellStyleArrangement || []);\n\n arrangements.forEach((item: any) => {\n const cellPosition = item?.cellPosition;\n if (typeof cellPosition?.col === 'number' && typeof cellPosition?.row === 'number') {\n cellsToRefresh.push({\n col: cellPosition.col,\n row: cellPosition.row\n });\n }\n });\n\n plugin.clearCustomCellStyleArrangement();\n cellsToRefresh.forEach(({ col, row }) => {\n this.table.scenegraph.updateCellContent(col, row, true);\n });\n }\n\n search(str: string) {\n this.clear();\n this.queryStr = str;\n\n if (!str) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n this.isTree = this.table.options.columns.some((item: any) => item.tree);\n this.treeIndex = this.isTree ? this.table.options.columns.findIndex((item: any) => item.tree) : 0;\n if (this.isTree) {\n // 如果传入单一节点也能处理\n const treeCol = this.getTreeCol();\n const walk = (nodes: any[], path: number[]) => {\n nodes.forEach((item: any, idx: number) => {\n const currentPath = [...path, idx]; // 当前节点的完整路径\n\n // 为了做到“单元格级别高亮”,优先按字段匹配并映射到具体列。\n const searchFields =\n Array.isArray(this.fieldsToSearch) && this.fieldsToSearch.length > 0\n ? this.fieldsToSearch\n : Object.keys(item);\n\n let hitAnyField = false;\n searchFields.forEach(field => {\n const value = item?.[field];\n if (!isValid(value)) {\n return;\n }\n const col = this.getHeaderCellAddressByField(field)?.col ?? treeCol;\n // row 在树形场景下要在展开后才能准确计算,这里传 0 仅用于自定义 queryMethod 的兼容参数。\n if (this.queryMethod(this.queryStr, value, { col, row: 0, table: this.table })) {\n hitAnyField = true;\n this.queryResult.push({\n indexNumber: currentPath,\n col,\n value: value?.toString?.() ?? String(value)\n });\n }\n });\n\n // 兼容旧用法:如果用户自定义 treeQueryMethod 命中但字段级别未命中,则至少高亮树列。\n if (\n !hitAnyField &&\n this.treeQueryMethod &&\n this.treeQueryMethod(this.queryStr, item, this.fieldsToSearch, { table: this.table })\n ) {\n this.queryResult.push({\n indexNumber: currentPath,\n col: treeCol\n });\n }\n\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\n walk(item.children, currentPath);\n }\n });\n };\n\n walk(this.table.records, []);\n // 同一节点同一列可能被多次命中(例如 fieldsToSearch 未限制且字段值重复),做一次简单去重\n const dedup = new Set<string>();\n this.queryResult = this.queryResult.filter(r => {\n const key = `${(r.indexNumber || []).join('.')}:${r.col ?? ''}`;\n if (dedup.has(key)) {\n return false;\n }\n dedup.add(key);\n return true;\n });\n\n this.currentIndex = this.queryResult.length > 0 ? 0 : -1;\n\n if (this.queryResult.length > 0) {\n this.jumpToCell({ IndexNumber: this.queryResult[0].indexNumber, col: this.queryResult[0].col ?? treeCol });\n }\n\n if (this.callback) {\n this.callback(\n {\n queryStr: this.queryStr,\n results: this.queryResult\n },\n this.table\n );\n }\n this.updateCellStyle();\n\n return {\n index: this.currentIndex >= 0 ? this.currentIndex : 0,\n results: this.queryResult\n };\n }\n for (let row = 0; row < this.table.rowCount; row++) {\n for (let col = 0; col < this.table.colCount; col++) {\n if (this.skipHeader && this.table.isHeader(col, row)) {\n continue;\n }\n const value = this.table.getCellValue(col, row);\n if (this.queryMethod(this.queryStr, value, { col, row, table: this.table })) {\n // deal merge cell\n const mergeCell = this.table.getCellRange(col, row);\n if (mergeCell.start.col !== mergeCell.end.col || mergeCell.start.row !== mergeCell.end.row) {\n // find is cell already in queryResult\n let isIn = false;\n for (let i = this.queryResult.length - 1; i >= 0; i--) {\n if (this.queryResult[i].col === mergeCell.start.col && this.queryResult[i].row === mergeCell.start.row) {\n isIn = true;\n break;\n }\n }\n if (!isIn) {\n this.queryResult.push({\n col: mergeCell.start.col,\n row: mergeCell.start.row,\n range: mergeCell,\n value\n });\n }\n } else {\n this.queryResult.push({\n col,\n row,\n value\n });\n }\n }\n }\n }\n this.updateCellStyle();\n\n if (this.callback) {\n this.callback(\n {\n queryStr: this.queryStr,\n results: this.queryResult\n },\n this.table\n );\n }\n\n if (this.autoJump) {\n return this.next();\n }\n return {\n index: 0,\n results: this.queryResult\n };\n }\n\n /**\n * @description: 为查询结果项设置自定义单元格样式\n * @param {(typeof this.queryResult)[number]} resultItem 查询结果项\n * @param {boolean} highlight 是否高亮\n * @param {string} customStyleId 自定义样式ID\n */\n arrangeCustomCellStyle(\n resultItem: typeof this.queryResult[number],\n highlight: boolean = true,\n customStyleId: string = HighlightStyleId\n ) {\n const { col, row, range } = resultItem;\n this.table.arrangeCustomCellStyle(\n range\n ? { range }\n : {\n row,\n col\n },\n highlight ? customStyleId : null\n );\n }\n\n updateCellStyle(highlight: boolean = true) {\n if (!highlight) {\n this.clearRenderedCellStyles();\n this.table.scenegraph.updateNextFrame();\n return;\n }\n if (!this.queryResult) {\n return;\n }\n\n if (!this.table.hasCustomCellStyle(HighlightStyleId)) {\n this.table.registerCustomCellStyle(HighlightStyleId, this.highlightCellStyle as any);\n }\n if (!this.table.hasCustomCellStyle(FocusHighlightStyleId)) {\n this.table.registerCustomCellStyle(FocusHighlightStyleId, this.focusHighlightCellStyle as any);\n }\n\n this.clearRenderedCellStyles();\n\n if (this.isTree) {\n if (!this.queryResult.length) {\n this.table.scenegraph.updateNextFrame();\n return;\n }\n\n // 先为所有命中节点打普通高亮\n for (let i = 0; i < this.queryResult.length; i++) {\n const cell = this.getVisibleTreeCell(this.queryResult[i]);\n if (!cell) {\n continue;\n }\n this.table.customCellStylePlugin.addCustomCellStyleArrangement(\n {\n col: cell.col,\n row: cell.row\n },\n HighlightStyleId\n );\n this.table.scenegraph.updateCellContent(cell.col, cell.row, true);\n }\n\n // 再为当前索引打焦点高亮\n if (this.currentIndex >= 0 && this.currentIndex < this.queryResult.length) {\n const cell = this.getVisibleTreeCell(this.queryResult[this.currentIndex]);\n if (cell) {\n this.table.customCellStylePlugin.addCustomCellStyleArrangement(\n {\n col: cell.col,\n row: cell.row\n },\n FocusHighlightStyleId\n );\n this.table.scenegraph.updateCellContent(cell.col, cell.row, true);\n }\n }\n\n this.table.scenegraph.updateNextFrame();\n } else {\n for (let i = 0; i < this.queryResult.length; i++) {\n this.table.customCellStylePlugin.addCustomCellStyleArrangement(\n {\n col: this.queryResult[i].col,\n row: this.queryResult[i].row\n },\n HighlightStyleId\n );\n this.table.scenegraph.updateCellContent(this.queryResult[i].col, this.queryResult[i].row, true);\n }\n this.table.scenegraph.updateNextFrame();\n }\n }\n\n next() {\n if (!this.queryResult.length) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n if (this.isTree) {\n this.currentIndex++;\n if (this.currentIndex >= this.queryResult.length) {\n this.currentIndex = 0;\n }\n const { indexNumber, col } = this.queryResult[this.currentIndex];\n this.jumpToCell({ IndexNumber: indexNumber, col });\n this.updateCellStyle();\n } else {\n if (this.currentIndex !== -1) {\n // reset last focus\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]);\n }\n this.currentIndex++;\n if (this.currentIndex >= this.queryResult.length) {\n this.currentIndex = 0;\n }\n const { col, row } = this.queryResult[this.currentIndex];\n\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex], true, FocusHighlightStyleId);\n\n this.jumpToCell({ col, row });\n }\n\n return {\n index: this.currentIndex,\n results: this.queryResult\n };\n }\n\n prev() {\n if (!this.queryResult.length) {\n return {\n index: 0,\n results: this.queryResult\n };\n }\n\n if (this.isTree) {\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.queryResult.length - 1;\n }\n\n const { indexNumber, col } = this.queryResult[this.currentIndex];\n this.jumpToCell({ IndexNumber: indexNumber, col });\n this.updateCellStyle();\n } else {\n // 普通表格处理\n if (this.currentIndex !== -1) {\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex]);\n }\n\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.queryResult.length - 1;\n }\n\n const { col, row } = this.queryResult[this.currentIndex];\n this.arrangeCustomCellStyle(this.queryResult[this.currentIndex], true, FocusHighlightStyleId);\n this.jumpToCell({ col, row });\n }\n\n return {\n index: this.currentIndex,\n results: this.queryResult\n };\n }\n\n jumpToCell(params: { col?: number; row?: number; IndexNumber?: number[] }) {\n if (this.isTree) {\n const { IndexNumber } = params;\n const indexNumbers = [...IndexNumber];\n\n const tmp = [...indexNumbers];\n let tmpNumber = 0;\n let i = 0;\n\n // 展开树形结构的父节点\n while (tmpNumber < tmp.length - 1) {\n tmpNumber++;\n const indexNumber = indexNumbers.slice(0, tmpNumber);\n\n // 跳过表头行\n while (this.table.isHeader(0, i)) {\n i++;\n }\n const row = this.getBodyRowIndexByRecordIndex(indexNumber) + i;\n\n const hierarchyState = this.table.getHierarchyState(this.treeIndex, row);\n if (hierarchyState !== 'expand') {\n this.table.toggleHierarchyState(this.treeIndex, row);\n }\n }\n\n const finalRow = this.getBodyRowIndexByRecordIndex(indexNumbers) + i;\n\n // 根据配置决定是否滚动表格\n const targetCol = typeof params.col === 'number' ? params.col : this.getTreeCol();\n this.table.scrollToCell({ row: finalRow, col: targetCol }, this.scrollOption);\n\n // 根据配置决定是否滚动页面\n if (this.enableViewportScroll) {\n scrollVTableCellIntoView(this.table, { row: finalRow, col: targetCol });\n }\n } else {\n const { col, row } = params;\n const { rowStart, rowEnd } = this.table.getBodyVisibleRowRange();\n const { colStart, colEnd } = this.table.getBodyVisibleColRange();\n\n // 检查单元格是否在表格可视范围内\n const isInTableView = !(row <= rowStart || row >= rowEnd || col <= colStart || col >= colEnd);\n\n // 根据配置决定是否滚动表格\n if (!isInTableView) {\n this.table.scrollToCell({ col, row });\n }\n\n // 根据配置决定是否滚动页面\n if (this.enableViewportScroll) {\n scrollVTableCellIntoView(this.table, { row, col });\n }\n }\n }\n getBodyRowIndexByRecordIndex(index: number | number[]): number {\n if (Array.isArray(index) && index.length === 1) {\n index = index[0];\n }\n return this.table.dataSource.getTableIndex(index);\n }\n clear() {\n // reset highlight cell style\n this.updateCellStyle(false);\n this.queryStr = '';\n this.queryResult = [];\n this.currentIndex = -1;\n }\n}\n\nfunction scrollVTableCellIntoView(table: IVTable, cellInfo: { row: number; col: number }): void {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n return;\n }\n\n const tableEl = table.getElement?.() || table.container;\n if (!tableEl) {\n return;\n }\n\n // 获取单元格在表格中的位置信息\n const cellRect = table.getCellRect(cellInfo.col, cellInfo.row);\n if (!cellRect) {\n return;\n }\n\n // 查找最近的可滚动父容器\n let scrollContainer: Element | null = tableEl.parentElement;\n while (scrollContainer) {\n const computedStyle = getComputedStyle(scrollContainer);\n const hasScroll = /(auto|scroll|overlay)/.test(computedStyle.overflowY);\n const canScroll = scrollContainer.scrollHeight > scrollContainer.clientHeight;\n\n if (hasScroll && canScroll) {\n break;\n }\n\n // 向上查找父元素,包括 Shadow DOM 情况\n scrollContainer = scrollContainer.parentElement || (scrollContainer.getRootNode?.() as ShadowRoot)?.host || null;\n }\n\n // 如果没找到可滚动容器,使用 document\n if (!scrollContainer) {\n scrollContainer = document.scrollingElement || document.documentElement;\n }\n\n const scrollContainerEl = scrollContainer as HTMLElement;\n\n // 计算单元格在滚动容器中的绝对位置\n const tableRect = tableEl.getBoundingClientRect();\n const containerRect = scrollContainerEl.getBoundingClientRect();\n\n // 表格相对于滚动容器的位置\n const tableOffsetTop = tableRect.top - containerRect.top + scrollContainerEl.scrollTop;\n\n // 单元格在滚动容器中的绝对位置\n const cellTop = tableOffsetTop + cellRect.top;\n const cellBottom = cellTop + cellRect.height;\n const containerHeight = scrollContainerEl.clientHeight;\n const scrollTop = scrollContainerEl.scrollTop;\n\n // 检查单元格是否完全可见\n const isFullyVisible = cellTop >= scrollTop && cellBottom <= scrollTop + containerHeight;\n\n if (!isFullyVisible) {\n // 计算新的滚动位置\n let newScrollTop: number;\n\n if (cellTop < scrollTop) {\n // 单元格在上方,滚动到单元格顶部\n newScrollTop = cellTop;\n } else {\n // 单元格在下方,滚动到单元格底部对齐容器底部\n newScrollTop = cellBottom - containerHeight;\n }\n\n // 确保滚动位置不小于 0\n scrollContainerEl.scrollTop = Math.max(0, newScrollTop);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visactor/vtable-search",
|
|
3
|
-
"version": "1.26.
|
|
3
|
+
"version": "1.26.2-alpha.1",
|
|
4
4
|
"description": "The search util of VTable",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "VisActor",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"access": "public"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@visactor/vtable": "1.26.
|
|
34
|
+
"@visactor/vtable": "1.26.2-alpha.1",
|
|
35
35
|
"@visactor/vutils": "~1.0.17"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
@@ -79,8 +79,8 @@
|
|
|
79
79
|
"@types/react-is": "^17.0.3",
|
|
80
80
|
"rollup-plugin-node-resolve": "5.2.0",
|
|
81
81
|
"@internal/bundler": "0.0.1",
|
|
82
|
-
"@internal/
|
|
83
|
-
"@internal/
|
|
82
|
+
"@internal/eslint-config": "0.0.1",
|
|
83
|
+
"@internal/ts-config": "0.0.1"
|
|
84
84
|
},
|
|
85
85
|
"scripts": {
|
|
86
86
|
"start": "vite ./demo",
|