@toolbox-web/grid 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -41
- package/all.js +1045 -935
- package/all.js.map +1 -1
- package/index.js +39 -33
- package/index.js.map +1 -1
- package/lib/core/grid.d.ts +12 -2
- package/lib/core/grid.d.ts.map +1 -1
- package/lib/core/internal/header.d.ts.map +1 -1
- package/lib/core/internal/keyboard.d.ts.map +1 -1
- package/lib/core/types.d.ts +34 -1
- package/lib/core/types.d.ts.map +1 -1
- package/lib/plugins/clipboard/index.js.map +1 -1
- package/lib/plugins/column-virtualization/index.js.map +1 -1
- package/lib/plugins/context-menu/index.js.map +1 -1
- package/lib/plugins/editing/EditingPlugin.d.ts.map +1 -1
- package/lib/plugins/editing/index.js +155 -145
- package/lib/plugins/editing/index.js.map +1 -1
- package/lib/plugins/export/index.js.map +1 -1
- package/lib/plugins/filtering/FilteringPlugin.d.ts +31 -0
- package/lib/plugins/filtering/FilteringPlugin.d.ts.map +1 -1
- package/lib/plugins/filtering/filter-model.d.ts +30 -3
- package/lib/plugins/filtering/filter-model.d.ts.map +1 -1
- package/lib/plugins/filtering/index.d.ts +1 -0
- package/lib/plugins/filtering/index.d.ts.map +1 -1
- package/lib/plugins/filtering/index.js +471 -361
- package/lib/plugins/filtering/index.js.map +1 -1
- package/lib/plugins/filtering/types.d.ts +32 -0
- package/lib/plugins/filtering/types.d.ts.map +1 -1
- package/lib/plugins/grouping-columns/index.js.map +1 -1
- package/lib/plugins/grouping-rows/index.js.map +1 -1
- package/lib/plugins/master-detail/index.js.map +1 -1
- package/lib/plugins/multi-sort/MultiSortPlugin.d.ts +4 -0
- package/lib/plugins/multi-sort/MultiSortPlugin.d.ts.map +1 -1
- package/lib/plugins/multi-sort/index.js +49 -39
- package/lib/plugins/multi-sort/index.js.map +1 -1
- package/lib/plugins/pinned-columns/index.js.map +1 -1
- package/lib/plugins/pinned-rows/index.js.map +1 -1
- package/lib/plugins/pivot/index.js.map +1 -1
- package/lib/plugins/print/index.js.map +1 -1
- package/lib/plugins/reorder/index.js +81 -78
- package/lib/plugins/reorder/index.js.map +1 -1
- package/lib/plugins/responsive/index.js +58 -55
- package/lib/plugins/responsive/index.js.map +1 -1
- package/lib/plugins/row-reorder/index.js +5 -2
- package/lib/plugins/row-reorder/index.js.map +1 -1
- package/lib/plugins/selection/index.js.map +1 -1
- package/lib/plugins/server-side/index.js.map +1 -1
- package/lib/plugins/tree/index.js.map +1 -1
- package/lib/plugins/undo-redo/index.js.map +1 -1
- package/lib/plugins/visibility/index.js.map +1 -1
- package/package.json +1 -1
- package/umd/grid.all.umd.js +29 -29
- package/umd/grid.all.umd.js.map +1 -1
- package/umd/grid.umd.js +2 -2
- package/umd/grid.umd.js.map +1 -1
- package/umd/plugins/editing.umd.js +1 -1
- package/umd/plugins/editing.umd.js.map +1 -1
- package/umd/plugins/filtering.umd.js +1 -1
- package/umd/plugins/filtering.umd.js.map +1 -1
- package/umd/plugins/multi-sort.umd.js +1 -1
- package/umd/plugins/multi-sort.umd.js.map +1 -1
|
@@ -71,6 +71,24 @@ import { FilterConfig, FilterModel } from './types';
|
|
|
71
71
|
* grid.rows = data;
|
|
72
72
|
* ```
|
|
73
73
|
*
|
|
74
|
+
* @example Column Formatters in Filter Panel
|
|
75
|
+
* When a column defines a `format` function, the built-in set filter panel
|
|
76
|
+
* displays formatted labels instead of raw values. Search within the panel
|
|
77
|
+
* also matches against the formatted text.
|
|
78
|
+
* ```ts
|
|
79
|
+
* grid.gridConfig = {
|
|
80
|
+
* columns: [
|
|
81
|
+
* {
|
|
82
|
+
* field: 'price',
|
|
83
|
+
* filterable: true,
|
|
84
|
+
* format: (value) => `$${Number(value).toFixed(2)}`,
|
|
85
|
+
* // Filter checkboxes show "$9.99" instead of "9.99"
|
|
86
|
+
* },
|
|
87
|
+
* ],
|
|
88
|
+
* plugins: [new FilteringPlugin()],
|
|
89
|
+
* };
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
74
92
|
* @example Server-Side Filtering with Async Handlers
|
|
75
93
|
* ```ts
|
|
76
94
|
* new FilteringPlugin({
|
|
@@ -117,6 +135,11 @@ export declare class FilteringPlugin extends BaseGridPlugin<FilterConfig> {
|
|
|
117
135
|
* Check if a specific column is filterable, respecting both grid-level and column-level settings.
|
|
118
136
|
*/
|
|
119
137
|
private isColumnFilterable;
|
|
138
|
+
/**
|
|
139
|
+
* Build a map of field → filterValue extractor for columns that have one.
|
|
140
|
+
* Used to pass array-aware value extraction to the pure filter functions.
|
|
141
|
+
*/
|
|
142
|
+
private getFilterValues;
|
|
120
143
|
private filters;
|
|
121
144
|
private cachedResult;
|
|
122
145
|
private cacheKey;
|
|
@@ -137,6 +160,13 @@ export declare class FilteringPlugin extends BaseGridPlugin<FilterConfig> {
|
|
|
137
160
|
* Reads --tbw-filter-item-height from the panel element.
|
|
138
161
|
*/
|
|
139
162
|
private getListItemHeight;
|
|
163
|
+
/**
|
|
164
|
+
* Compute the inclusion (selected) map from the current filters and excluded values.
|
|
165
|
+
* For set filters this is: uniqueValues \ excludedValues.
|
|
166
|
+
* Only includes entries for fields that have a set filter.
|
|
167
|
+
* Uses a single-pass batch extraction to avoid iterating sourceRows per field.
|
|
168
|
+
*/
|
|
169
|
+
private computeSelected;
|
|
140
170
|
/**
|
|
141
171
|
* Sync excludedValues map from a filter model (for set filters).
|
|
142
172
|
*/
|
|
@@ -199,6 +229,7 @@ export declare class FilteringPlugin extends BaseGridPlugin<FilterConfig> {
|
|
|
199
229
|
/**
|
|
200
230
|
* Get unique values for a field (for set filter dropdowns).
|
|
201
231
|
* Uses sourceRows to include all values regardless of current filter.
|
|
232
|
+
* When a column has `filterValue`, individual extracted values are returned.
|
|
202
233
|
*/
|
|
203
234
|
getUniqueValues(field: string): unknown[];
|
|
204
235
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilteringPlugin.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/filtering/FilteringPlugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAExH,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKlE,OAAO,KAAK,EAAsB,YAAY,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAC;AAEhG
|
|
1
|
+
{"version":3,"file":"FilteringPlugin.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/filtering/FilteringPlugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { FilterModel } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Sentinel value used in set-filter unique values to represent rows with
|
|
4
|
+
* no value (null, undefined, empty array via filterValue extractor).
|
|
5
|
+
* Exported so server-side implementations can use the same constant.
|
|
6
|
+
*/
|
|
7
|
+
export declare const BLANK_FILTER_VALUE = "(Blank)";
|
|
2
8
|
/**
|
|
3
9
|
* Check if a single row matches a filter condition.
|
|
4
10
|
*
|
|
5
11
|
* @param row - The row data object
|
|
6
12
|
* @param filter - The filter to apply
|
|
7
13
|
* @param caseSensitive - Whether text comparisons are case sensitive
|
|
14
|
+
* @param filterValue - Optional extractor for complex cell values (arrays, objects)
|
|
8
15
|
* @returns True if the row matches the filter
|
|
9
16
|
*/
|
|
10
|
-
export declare function matchesFilter(row: Record<string, unknown>, filter: FilterModel, caseSensitive?: boolean): boolean;
|
|
17
|
+
export declare function matchesFilter(row: Record<string, unknown>, filter: FilterModel, caseSensitive?: boolean, filterValue?: (value: unknown, row: Record<string, unknown>) => unknown | unknown[]): boolean;
|
|
11
18
|
/**
|
|
12
19
|
* Filter rows based on multiple filter conditions (AND logic).
|
|
13
20
|
* All filters must match for a row to be included.
|
|
@@ -15,9 +22,10 @@ export declare function matchesFilter(row: Record<string, unknown>, filter: Filt
|
|
|
15
22
|
* @param rows - The rows to filter
|
|
16
23
|
* @param filters - Array of filters to apply
|
|
17
24
|
* @param caseSensitive - Whether text comparisons are case sensitive
|
|
25
|
+
* @param filterValues - Optional map of field → value extractor for complex columns
|
|
18
26
|
* @returns Filtered rows
|
|
19
27
|
*/
|
|
20
|
-
export declare function filterRows<T extends Record<string, unknown>>(rows: T[], filters: FilterModel[], caseSensitive?: boolean): T[];
|
|
28
|
+
export declare function filterRows<T extends Record<string, unknown>>(rows: T[], filters: FilterModel[], caseSensitive?: boolean, filterValues?: Map<string, (value: unknown, row: T) => unknown | unknown[]>): T[];
|
|
21
29
|
/**
|
|
22
30
|
* Compute a cache key for a set of filters.
|
|
23
31
|
* Used for memoization of filter results.
|
|
@@ -30,9 +38,28 @@ export declare function computeFilterCacheKey(filters: FilterModel[]): string;
|
|
|
30
38
|
* Extract unique values from a field across all rows.
|
|
31
39
|
* Useful for populating "set" filter dropdowns.
|
|
32
40
|
*
|
|
41
|
+
* When `filterValue` is provided, the extractor is called for each row's cell value.
|
|
42
|
+
* If it returns an array, each element is added individually (flattened).
|
|
43
|
+
* This enables complex-valued cells (e.g., arrays of objects) to expose
|
|
44
|
+
* their individual filterable values.
|
|
45
|
+
*
|
|
33
46
|
* @param rows - The rows to extract values from
|
|
34
47
|
* @param field - The field name
|
|
48
|
+
* @param filterValue - Optional extractor for complex cell values
|
|
35
49
|
* @returns Sorted array of unique non-null values
|
|
36
50
|
*/
|
|
37
|
-
export declare function getUniqueValues<T extends Record<string, unknown>>(rows: T[], field: string): unknown[];
|
|
51
|
+
export declare function getUniqueValues<T extends Record<string, unknown>>(rows: T[], field: string, filterValue?: (value: unknown, row: T) => unknown | unknown[]): unknown[];
|
|
52
|
+
/**
|
|
53
|
+
* Extract unique values for multiple fields in a single pass through the rows.
|
|
54
|
+
* This is more efficient than calling `getUniqueValues` N times when
|
|
55
|
+
* computing derived state for several set filters at once.
|
|
56
|
+
*
|
|
57
|
+
* @param rows - The rows to extract values from
|
|
58
|
+
* @param fields - Array of { field, filterValue? } descriptors
|
|
59
|
+
* @returns Map of field → sorted unique values (same contract as `getUniqueValues`)
|
|
60
|
+
*/
|
|
61
|
+
export declare function getUniqueValuesBatch<T extends Record<string, unknown>>(rows: T[], fields: {
|
|
62
|
+
field: string;
|
|
63
|
+
filterValue?: (value: unknown, row: T) => unknown | unknown[];
|
|
64
|
+
}[]): Map<string, unknown[]>;
|
|
38
65
|
//# sourceMappingURL=filter-model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-model.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/filtering/filter-model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"filter-model.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/filtering/filter-model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAe5C;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,EAAE,WAAW,EACnB,aAAa,UAAQ,EACrB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAAG,OAAO,EAAE,GAClF,OAAO,CA4FT;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,IAAI,EAAE,CAAC,EAAE,EACT,OAAO,EAAE,WAAW,EAAE,EACtB,aAAa,UAAQ,EACrB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,EAAE,CAAC,GAC1E,CAAC,EAAE,CAcL;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CASpE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,IAAI,EAAE,CAAC,EAAE,EACT,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,EAAE,GAC5D,OAAO,EAAE,CAqCX;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,IAAI,EAAE,CAAC,EAAE,EACT,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,EAAE,CAAA;CAAE,EAAE,GACzF,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CA2CxB"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @module Plugins/Filtering
|
|
6
6
|
*/
|
|
7
|
+
export { BLANK_FILTER_VALUE, getUniqueValuesBatch } from './filter-model';
|
|
7
8
|
export { FilteringPlugin } from './FilteringPlugin';
|
|
8
9
|
export type { FilterChangeDetail, FilterConfig, FilterModel, FilterOperator, FilterPanelParams, FilterPanelRenderer, FilterParams, FilterType, } from './types';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/filtering/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/filtering/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAC"}
|