@vaadin/grid 24.3.0-alpha1 → 24.3.0-alpha10
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/package.json +18 -13
- package/src/vaadin-grid-a11y-mixin.js +1 -1
- package/src/vaadin-grid-active-item-mixin.js +1 -0
- package/src/vaadin-grid-array-data-provider-mixin.js +14 -17
- package/src/vaadin-grid-column-group-mixin.d.ts +20 -0
- package/src/vaadin-grid-column-group-mixin.js +364 -0
- package/src/vaadin-grid-column-group.d.ts +4 -14
- package/src/vaadin-grid-column-group.js +5 -355
- package/src/vaadin-grid-column-mixin.d.ts +170 -0
- package/src/vaadin-grid-column-mixin.js +958 -0
- package/src/vaadin-grid-column.d.ts +11 -138
- package/src/vaadin-grid-column.js +5 -876
- package/src/vaadin-grid-data-provider-mixin.d.ts +6 -5
- package/src/vaadin-grid-data-provider-mixin.js +58 -11
- package/src/vaadin-grid-drag-and-drop-mixin.js +17 -5
- package/src/vaadin-grid-dynamic-columns-mixin.js +22 -17
- package/src/vaadin-grid-filter-column-mixin.d.ts +22 -0
- package/src/vaadin-grid-filter-column-mixin.js +106 -0
- package/src/vaadin-grid-filter-column.d.ts +9 -11
- package/src/vaadin-grid-filter-column.js +3 -90
- package/src/vaadin-grid-filter-element-mixin.d.ts +34 -0
- package/src/vaadin-grid-filter-element-mixin.js +108 -0
- package/src/vaadin-grid-filter-mixin.js +4 -4
- package/src/vaadin-grid-filter.d.ts +4 -21
- package/src/vaadin-grid-filter.js +5 -84
- package/src/vaadin-grid-helpers.js +94 -0
- package/src/vaadin-grid-keyboard-navigation-mixin.js +26 -6
- package/src/vaadin-grid-mixin.js +37 -46
- package/src/vaadin-grid-row-details-mixin.js +14 -8
- package/src/vaadin-grid-scroll-mixin.js +9 -3
- package/src/vaadin-grid-selection-column-base-mixin.js +12 -4
- package/src/vaadin-grid-selection-column-mixin.d.ts +24 -0
- package/src/vaadin-grid-selection-column-mixin.js +194 -0
- package/src/vaadin-grid-selection-column.d.ts +13 -17
- package/src/vaadin-grid-selection-column.js +4 -186
- package/src/vaadin-grid-selection-mixin.js +4 -3
- package/src/vaadin-grid-sort-column-mixin.d.ts +36 -0
- package/src/vaadin-grid-sort-column-mixin.js +101 -0
- package/src/vaadin-grid-sort-column.d.ts +8 -26
- package/src/vaadin-grid-sort-column.js +3 -87
- package/src/vaadin-grid-sorter-mixin.d.ts +44 -0
- package/src/vaadin-grid-sorter-mixin.js +200 -0
- package/src/vaadin-grid-sorter.d.ts +3 -32
- package/src/vaadin-grid-sorter.js +5 -181
- package/src/vaadin-grid-styles.js +341 -345
- package/src/vaadin-grid-styling-mixin.js +8 -2
- package/src/vaadin-grid-tree-column-mixin.d.ts +18 -0
- package/src/vaadin-grid-tree-column-mixin.js +99 -0
- package/src/vaadin-grid-tree-column.d.ts +9 -7
- package/src/vaadin-grid-tree-column.js +3 -82
- package/src/vaadin-grid-tree-toggle-mixin.d.ts +39 -0
- package/src/vaadin-grid-tree-toggle-mixin.js +153 -0
- package/src/vaadin-grid-tree-toggle.d.ts +4 -27
- package/src/vaadin-grid-tree-toggle.js +9 -141
- package/src/vaadin-grid.d.ts +3 -0
- package/src/vaadin-grid.js +7 -2
- package/theme/lumo/vaadin-grid-sorter-styles.js +1 -1
- package/theme/lumo/vaadin-grid-styles.js +15 -14
- package/theme/material/vaadin-grid-styles.js +15 -10
- package/web-types.json +331 -126
- package/web-types.lit.json +114 -58
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import type { Constructor } from '@open-wc/dedupe-mixin';
|
|
7
|
+
import type {
|
|
8
|
+
DataProvider,
|
|
9
|
+
DataProviderCallback,
|
|
10
|
+
} from '@vaadin/component-base/src/data-provider-controller/data-provider-controller.js';
|
|
7
11
|
import { GridSorterDirection } from './vaadin-grid-sorter.js';
|
|
8
12
|
|
|
9
13
|
export { GridSorterDirection };
|
|
@@ -18,7 +22,7 @@ export interface GridSorterDefinition {
|
|
|
18
22
|
direction: GridSorterDirection;
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
export type GridDataProviderCallback<TItem> =
|
|
25
|
+
export type GridDataProviderCallback<TItem> = DataProviderCallback<TItem>;
|
|
22
26
|
|
|
23
27
|
export type GridDataProviderParams<TItem> = {
|
|
24
28
|
page: number;
|
|
@@ -28,10 +32,7 @@ export type GridDataProviderParams<TItem> = {
|
|
|
28
32
|
parentItem?: TItem;
|
|
29
33
|
};
|
|
30
34
|
|
|
31
|
-
export type GridDataProvider<TItem> =
|
|
32
|
-
params: GridDataProviderParams<TItem>,
|
|
33
|
-
callback: GridDataProviderCallback<TItem>,
|
|
34
|
-
) => void;
|
|
35
|
+
export type GridDataProvider<TItem> = DataProvider<TItem, GridDataProviderParams<TItem>>;
|
|
35
36
|
|
|
36
37
|
export declare function DataProviderMixin<TItem, T extends Constructor<HTMLElement>>(
|
|
37
38
|
base: T,
|
|
@@ -24,6 +24,16 @@ export const DataProviderMixin = (superClass) =>
|
|
|
24
24
|
size: {
|
|
25
25
|
type: Number,
|
|
26
26
|
notify: true,
|
|
27
|
+
sync: true,
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @type {number}
|
|
32
|
+
* @protected
|
|
33
|
+
*/
|
|
34
|
+
_flatSize: {
|
|
35
|
+
type: Number,
|
|
36
|
+
sync: true,
|
|
27
37
|
},
|
|
28
38
|
|
|
29
39
|
/**
|
|
@@ -35,6 +45,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
35
45
|
type: Number,
|
|
36
46
|
value: 50,
|
|
37
47
|
observer: '_pageSizeChanged',
|
|
48
|
+
sync: true,
|
|
38
49
|
},
|
|
39
50
|
|
|
40
51
|
/**
|
|
@@ -64,6 +75,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
64
75
|
type: Object,
|
|
65
76
|
notify: true,
|
|
66
77
|
observer: '_dataProviderChanged',
|
|
78
|
+
sync: true,
|
|
67
79
|
},
|
|
68
80
|
|
|
69
81
|
/**
|
|
@@ -82,6 +94,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
82
94
|
_hasData: {
|
|
83
95
|
type: Boolean,
|
|
84
96
|
value: false,
|
|
97
|
+
sync: true,
|
|
85
98
|
},
|
|
86
99
|
|
|
87
100
|
/**
|
|
@@ -92,6 +105,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
92
105
|
type: String,
|
|
93
106
|
value: 'children',
|
|
94
107
|
observer: '__itemHasChildrenPathChanged',
|
|
108
|
+
sync: true,
|
|
95
109
|
},
|
|
96
110
|
|
|
97
111
|
/**
|
|
@@ -101,6 +115,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
101
115
|
itemIdPath: {
|
|
102
116
|
type: String,
|
|
103
117
|
value: null,
|
|
118
|
+
sync: true,
|
|
104
119
|
},
|
|
105
120
|
|
|
106
121
|
/**
|
|
@@ -111,6 +126,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
111
126
|
type: Object,
|
|
112
127
|
notify: true,
|
|
113
128
|
value: () => [],
|
|
129
|
+
sync: true,
|
|
114
130
|
},
|
|
115
131
|
|
|
116
132
|
/**
|
|
@@ -118,13 +134,13 @@ export const DataProviderMixin = (superClass) =>
|
|
|
118
134
|
*/
|
|
119
135
|
__expandedKeys: {
|
|
120
136
|
type: Object,
|
|
121
|
-
computed: '__computeExpandedKeys(itemIdPath, expandedItems
|
|
137
|
+
computed: '__computeExpandedKeys(itemIdPath, expandedItems)',
|
|
122
138
|
},
|
|
123
139
|
};
|
|
124
140
|
}
|
|
125
141
|
|
|
126
142
|
static get observers() {
|
|
127
|
-
return ['_sizeChanged(size)', '_expandedItemsChanged(expandedItems
|
|
143
|
+
return ['_sizeChanged(size)', '_expandedItemsChanged(expandedItems)'];
|
|
128
144
|
}
|
|
129
145
|
|
|
130
146
|
constructor() {
|
|
@@ -134,6 +150,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
134
150
|
this._dataProviderController = new DataProviderController(this, {
|
|
135
151
|
size: this.size,
|
|
136
152
|
pageSize: this.pageSize,
|
|
153
|
+
getItemId: this.getItemId.bind(this),
|
|
137
154
|
isExpanded: this._isExpanded.bind(this),
|
|
138
155
|
dataProvider: this.dataProvider ? this.dataProvider.bind(this) : null,
|
|
139
156
|
dataProviderParams: () => {
|
|
@@ -149,10 +166,28 @@ export const DataProviderMixin = (superClass) =>
|
|
|
149
166
|
this._dataProviderController.addEventListener('page-loaded', this._onDataProviderPageLoaded.bind(this));
|
|
150
167
|
}
|
|
151
168
|
|
|
169
|
+
/**
|
|
170
|
+
* @protected
|
|
171
|
+
* @deprecated since 24.3 and will be removed in Vaadin 25.
|
|
172
|
+
*/
|
|
173
|
+
get _cache() {
|
|
174
|
+
console.warn('<vaadin-grid> The `_cache` property is deprecated and will be removed in Vaadin 25.');
|
|
175
|
+
return this._dataProviderController.rootCache;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @protected
|
|
180
|
+
* @deprecated since 24.3 and will be removed in Vaadin 25.
|
|
181
|
+
*/
|
|
182
|
+
get _effectiveSize() {
|
|
183
|
+
console.warn('<vaadin-grid> The `_effectiveSize` property is deprecated and will be removed in Vaadin 25.');
|
|
184
|
+
return this._flatSize;
|
|
185
|
+
}
|
|
186
|
+
|
|
152
187
|
/** @private */
|
|
153
188
|
_sizeChanged(size) {
|
|
154
189
|
this._dataProviderController.setSize(size);
|
|
155
|
-
this.
|
|
190
|
+
this._flatSize = this._dataProviderController.flatSize;
|
|
156
191
|
}
|
|
157
192
|
|
|
158
193
|
/** @private */
|
|
@@ -170,7 +205,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
170
205
|
* @protected
|
|
171
206
|
*/
|
|
172
207
|
_getItem(index, el) {
|
|
173
|
-
if (index >= this.
|
|
208
|
+
if (index >= this._flatSize) {
|
|
174
209
|
return;
|
|
175
210
|
}
|
|
176
211
|
|
|
@@ -220,19 +255,19 @@ export const DataProviderMixin = (superClass) =>
|
|
|
220
255
|
* @protected
|
|
221
256
|
*/
|
|
222
257
|
_isExpanded(item) {
|
|
223
|
-
return this.__expandedKeys.has(this.getItemId(item));
|
|
258
|
+
return this.__expandedKeys && this.__expandedKeys.has(this.getItemId(item));
|
|
224
259
|
}
|
|
225
260
|
|
|
226
261
|
/** @private */
|
|
227
262
|
_expandedItemsChanged() {
|
|
228
|
-
this._dataProviderController.
|
|
229
|
-
this.
|
|
263
|
+
this._dataProviderController.recalculateFlatSize();
|
|
264
|
+
this._flatSize = this._dataProviderController.flatSize;
|
|
230
265
|
this.__updateVisibleRows();
|
|
231
266
|
}
|
|
232
267
|
|
|
233
268
|
/** @private */
|
|
234
269
|
__computeExpandedKeys(itemIdPath, expandedItems) {
|
|
235
|
-
const expanded = expandedItems
|
|
270
|
+
const expanded = expandedItems || [];
|
|
236
271
|
const expandedKeys = new Set();
|
|
237
272
|
expanded.forEach((item) => {
|
|
238
273
|
expandedKeys.add(this.getItemId(item));
|
|
@@ -271,6 +306,17 @@ export const DataProviderMixin = (superClass) =>
|
|
|
271
306
|
return level;
|
|
272
307
|
}
|
|
273
308
|
|
|
309
|
+
/**
|
|
310
|
+
* @param {number} page
|
|
311
|
+
* @param {ItemCache} cache
|
|
312
|
+
* @protected
|
|
313
|
+
* @deprecated since 24.3 and will be removed in Vaadin 25.
|
|
314
|
+
*/
|
|
315
|
+
_loadPage(page, cache) {
|
|
316
|
+
console.warn('<vaadin-grid> The `_loadPage` method is deprecated and will be removed in Vaadin 25.');
|
|
317
|
+
this._dataProviderController.__loadCachePage(cache, page);
|
|
318
|
+
}
|
|
319
|
+
|
|
274
320
|
/** @protected */
|
|
275
321
|
_onDataProviderPageRequested() {
|
|
276
322
|
this._setLoading(true);
|
|
@@ -279,7 +325,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
279
325
|
/** @protected */
|
|
280
326
|
_onDataProviderPageReceived() {
|
|
281
327
|
// With the new items added, update the cache size and the grid's effective size
|
|
282
|
-
this.
|
|
328
|
+
this._flatSize = this._dataProviderController.flatSize;
|
|
283
329
|
|
|
284
330
|
// After updating the cache, check if some of the expanded items should have sub-caches loaded
|
|
285
331
|
this._getRenderedRows().forEach((row) => {
|
|
@@ -303,6 +349,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
303
349
|
});
|
|
304
350
|
|
|
305
351
|
this.__scrollToPendingIndexes();
|
|
352
|
+
this.__dispatchPendingBodyCellFocus();
|
|
306
353
|
});
|
|
307
354
|
|
|
308
355
|
// If the grid is not loading anything, flush the debouncer immediately
|
|
@@ -319,7 +366,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
319
366
|
this._hasData = false;
|
|
320
367
|
this.__updateVisibleRows();
|
|
321
368
|
|
|
322
|
-
if (!this.
|
|
369
|
+
if (!this._flatSize) {
|
|
323
370
|
this._dataProviderController.loadFirstPage();
|
|
324
371
|
}
|
|
325
372
|
}
|
|
@@ -335,7 +382,7 @@ export const DataProviderMixin = (superClass) =>
|
|
|
335
382
|
|
|
336
383
|
/** @protected */
|
|
337
384
|
_checkSize() {
|
|
338
|
-
if (this.size === undefined && this.
|
|
385
|
+
if (this.size === undefined && this._flatSize === 0) {
|
|
339
386
|
console.warn(
|
|
340
387
|
'The <vaadin-grid> needs the total number of items in' +
|
|
341
388
|
' order to display rows, which you can specify either by setting' +
|
|
@@ -45,13 +45,19 @@ export const DragAndDropMixin = (superClass) =>
|
|
|
45
45
|
* @attr {between|on-top|on-top-or-between|on-grid} drop-mode
|
|
46
46
|
* @type {GridDropMode | null | undefined}
|
|
47
47
|
*/
|
|
48
|
-
dropMode:
|
|
48
|
+
dropMode: {
|
|
49
|
+
type: String,
|
|
50
|
+
sync: true,
|
|
51
|
+
},
|
|
49
52
|
|
|
50
53
|
/**
|
|
51
54
|
* Marks the grid's rows to be available for dragging.
|
|
52
55
|
* @attr {boolean} rows-draggable
|
|
53
56
|
*/
|
|
54
|
-
rowsDraggable:
|
|
57
|
+
rowsDraggable: {
|
|
58
|
+
type: Boolean,
|
|
59
|
+
sync: true,
|
|
60
|
+
},
|
|
55
61
|
|
|
56
62
|
/**
|
|
57
63
|
* A function that filters dragging of specific grid rows. The return value should be false
|
|
@@ -68,7 +74,10 @@ export const DragAndDropMixin = (superClass) =>
|
|
|
68
74
|
*
|
|
69
75
|
* @type {GridDragAndDropFilter | null | undefined}
|
|
70
76
|
*/
|
|
71
|
-
dragFilter:
|
|
77
|
+
dragFilter: {
|
|
78
|
+
type: Function,
|
|
79
|
+
sync: true,
|
|
80
|
+
},
|
|
72
81
|
|
|
73
82
|
/**
|
|
74
83
|
* A function that filters dropping on specific grid rows. The return value should be false
|
|
@@ -85,7 +94,10 @@ export const DragAndDropMixin = (superClass) =>
|
|
|
85
94
|
*
|
|
86
95
|
* @type {GridDragAndDropFilter | null | undefined}
|
|
87
96
|
*/
|
|
88
|
-
dropFilter:
|
|
97
|
+
dropFilter: {
|
|
98
|
+
type: Function,
|
|
99
|
+
sync: true,
|
|
100
|
+
},
|
|
89
101
|
|
|
90
102
|
/** @private */
|
|
91
103
|
__dndAutoScrollThreshold: {
|
|
@@ -211,7 +223,7 @@ export const DragAndDropMixin = (superClass) =>
|
|
|
211
223
|
|
|
212
224
|
let row = e.composedPath().find((node) => node.localName === 'tr');
|
|
213
225
|
|
|
214
|
-
if (!this.
|
|
226
|
+
if (!this._flatSize || this.dropMode === DropMode.ON_GRID) {
|
|
215
227
|
// The grid is empty or "on-grid" drop mode was used, always default to "empty"
|
|
216
228
|
this._dropLocation = DropLocation.EMPTY;
|
|
217
229
|
} else if (!row || row.parentNode !== this.$.items) {
|
|
@@ -3,11 +3,9 @@
|
|
|
3
3
|
* Copyright (c) 2016 - 2023 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
|
-
import { FlattenedNodesObserver } from '@polymer/polymer/lib/utils/flattened-nodes-observer.js';
|
|
7
|
-
import { PolymerElement } from '@polymer/polymer/polymer-element.js';
|
|
8
6
|
import { microTask, timeOut } from '@vaadin/component-base/src/async.js';
|
|
9
7
|
import { Debouncer } from '@vaadin/component-base/src/debounce.js';
|
|
10
|
-
import { updateCellState } from './vaadin-grid-helpers.js';
|
|
8
|
+
import { ColumnObserver, updateCellState } from './vaadin-grid-helpers.js';
|
|
11
9
|
|
|
12
10
|
function arrayEquals(arr1, arr2) {
|
|
13
11
|
if (!arr1 || !arr2 || arr1.length !== arr2.length) {
|
|
@@ -59,7 +57,7 @@ export const DynamicColumnsMixin = (superClass) =>
|
|
|
59
57
|
* @protected
|
|
60
58
|
*/
|
|
61
59
|
_getChildColumns(el) {
|
|
62
|
-
return
|
|
60
|
+
return ColumnObserver.getColumns(el);
|
|
63
61
|
}
|
|
64
62
|
|
|
65
63
|
/** @private */
|
|
@@ -78,7 +76,7 @@ export const DynamicColumnsMixin = (superClass) =>
|
|
|
78
76
|
|
|
79
77
|
/** @private */
|
|
80
78
|
_getColumnTree() {
|
|
81
|
-
const rootColumns =
|
|
79
|
+
const rootColumns = ColumnObserver.getColumns(this);
|
|
82
80
|
const columnTree = [rootColumns];
|
|
83
81
|
|
|
84
82
|
let c = rootColumns;
|
|
@@ -100,24 +98,31 @@ export const DynamicColumnsMixin = (superClass) =>
|
|
|
100
98
|
/** @protected */
|
|
101
99
|
_updateColumnTree() {
|
|
102
100
|
const columnTree = this._getColumnTree();
|
|
101
|
+
|
|
103
102
|
if (!arrayEquals(columnTree, this._columnTree)) {
|
|
103
|
+
// Request a synchronoys update for each column
|
|
104
|
+
columnTree.forEach((columnArray) => {
|
|
105
|
+
columnArray.forEach((column) => {
|
|
106
|
+
if (column.performUpdate) {
|
|
107
|
+
column.performUpdate();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
|
|
104
112
|
this._columnTree = columnTree;
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
115
|
|
|
108
116
|
/** @private */
|
|
109
117
|
_addNodeObserver() {
|
|
110
|
-
this._observer = new
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
this.__removeFilters(this._filters.filter(filterNotConnected));
|
|
119
|
-
this._debounceUpdateColumnTree();
|
|
120
|
-
}
|
|
118
|
+
this._observer = new ColumnObserver(this, (_addedColumns, removedColumns) => {
|
|
119
|
+
const allRemovedCells = removedColumns.flatMap((c) => c._allCells);
|
|
120
|
+
const filterNotConnected = (element) =>
|
|
121
|
+
allRemovedCells.filter((cell) => cell && cell._content.contains(element)).length;
|
|
122
|
+
|
|
123
|
+
this.__removeSorters(this._sorters.filter(filterNotConnected));
|
|
124
|
+
this.__removeFilters(this._filters.filter(filterNotConnected));
|
|
125
|
+
this._debounceUpdateColumnTree();
|
|
121
126
|
|
|
122
127
|
this._debouncerCheckImports = Debouncer.debounce(
|
|
123
128
|
this._debouncerCheckImports,
|
|
@@ -141,7 +146,7 @@ export const DynamicColumnsMixin = (superClass) =>
|
|
|
141
146
|
'vaadin-grid-sorter',
|
|
142
147
|
].forEach((elementName) => {
|
|
143
148
|
const element = this.querySelector(elementName);
|
|
144
|
-
if (element && !(
|
|
149
|
+
if (element && !customElements.get(elementName)) {
|
|
145
150
|
console.warn(`Make sure you have imported the required module for <${elementName}> element.`);
|
|
146
151
|
}
|
|
147
152
|
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (c) 2016 - 2023 Vaadin Ltd.
|
|
4
|
+
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
|
+
*/
|
|
6
|
+
import type { Constructor } from '@open-wc/dedupe-mixin';
|
|
7
|
+
|
|
8
|
+
export declare function GridFilterColumnMixin<T extends Constructor<HTMLElement>>(
|
|
9
|
+
superclass: T,
|
|
10
|
+
): Constructor<GridFilterColumnMixinClass> & T;
|
|
11
|
+
|
|
12
|
+
export declare class GridFilterColumnMixinClass {
|
|
13
|
+
/**
|
|
14
|
+
* Text to display as the label of the column filter text-field.
|
|
15
|
+
*/
|
|
16
|
+
header: string | null | undefined;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* JS Path of the property in the item used for filtering the data.
|
|
20
|
+
*/
|
|
21
|
+
path: string | null | undefined;
|
|
22
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (c) 2016 - 2023 Vaadin Ltd.
|
|
4
|
+
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @polymerMixin
|
|
9
|
+
*/
|
|
10
|
+
export const GridFilterColumnMixin = (superClass) =>
|
|
11
|
+
class extends superClass {
|
|
12
|
+
static get properties() {
|
|
13
|
+
return {
|
|
14
|
+
/**
|
|
15
|
+
* JS Path of the property in the item used for filtering the data.
|
|
16
|
+
*/
|
|
17
|
+
path: {
|
|
18
|
+
type: String,
|
|
19
|
+
sync: true,
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Text to display as the label of the column filter text-field.
|
|
24
|
+
*/
|
|
25
|
+
header: {
|
|
26
|
+
type: String,
|
|
27
|
+
sync: true,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static get observers() {
|
|
33
|
+
return ['_onHeaderRendererOrBindingChanged(_headerRenderer, _headerCell, path, header, _filterValue)'];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
constructor() {
|
|
37
|
+
super();
|
|
38
|
+
|
|
39
|
+
this.__boundOnFilterValueChanged = this.__onFilterValueChanged.bind(this);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Renders the grid filter with the custom text field to the header cell.
|
|
44
|
+
*
|
|
45
|
+
* @override
|
|
46
|
+
*/
|
|
47
|
+
_defaultHeaderRenderer(root, _column) {
|
|
48
|
+
let filter = root.firstElementChild;
|
|
49
|
+
let textField = filter ? filter.firstElementChild : undefined;
|
|
50
|
+
|
|
51
|
+
if (!filter) {
|
|
52
|
+
filter = document.createElement('vaadin-grid-filter');
|
|
53
|
+
textField = document.createElement('vaadin-text-field');
|
|
54
|
+
textField.setAttribute('theme', 'small');
|
|
55
|
+
textField.setAttribute('style', 'max-width: 100%;');
|
|
56
|
+
textField.setAttribute('focus-target', '');
|
|
57
|
+
textField.addEventListener('value-changed', this.__boundOnFilterValueChanged);
|
|
58
|
+
filter.appendChild(textField);
|
|
59
|
+
root.appendChild(filter);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
filter.path = this.path;
|
|
63
|
+
filter.value = this._filterValue;
|
|
64
|
+
|
|
65
|
+
textField.__rendererValue = this._filterValue;
|
|
66
|
+
textField.value = this._filterValue;
|
|
67
|
+
textField.label = this.__getHeader(this.header, this.path);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The filter column doesn't allow to use a custom header renderer
|
|
72
|
+
* to override the header cell content.
|
|
73
|
+
* It always renders the grid filter to the header cell.
|
|
74
|
+
*
|
|
75
|
+
* @override
|
|
76
|
+
*/
|
|
77
|
+
_computeHeaderRenderer() {
|
|
78
|
+
return this._defaultHeaderRenderer;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Updates the internal filter value once the filter text field is changed.
|
|
83
|
+
* The listener handles only user-fired events.
|
|
84
|
+
*
|
|
85
|
+
* @private
|
|
86
|
+
*/
|
|
87
|
+
__onFilterValueChanged(e) {
|
|
88
|
+
// Skip if the value is changed by the renderer.
|
|
89
|
+
if (e.detail.value === e.target.__rendererValue) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this._filterValue = e.detail.value;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** @private */
|
|
97
|
+
__getHeader(header, path) {
|
|
98
|
+
if (header) {
|
|
99
|
+
return header;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (path) {
|
|
103
|
+
return this._generateHeader(path);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
6
|
import type { GridDefaultItem } from './vaadin-grid.js';
|
|
7
|
-
import { GridColumn } from './vaadin-grid-column.js';
|
|
7
|
+
import type { GridColumn, GridColumnMixin } from './vaadin-grid-column.js';
|
|
8
|
+
import type { GridFilterColumnMixinClass } from './vaadin-grid-filter-column-mixin.js';
|
|
9
|
+
|
|
10
|
+
export * from './vaadin-grid-filter-column-mixin.js';
|
|
8
11
|
|
|
9
12
|
/**
|
|
10
13
|
* `<vaadin-grid-filter-column>` is a helper element for the `<vaadin-grid>`
|
|
@@ -19,17 +22,12 @@ import { GridColumn } from './vaadin-grid-column.js';
|
|
|
19
22
|
* ...
|
|
20
23
|
* ```
|
|
21
24
|
*/
|
|
22
|
-
declare class GridFilterColumn<TItem = GridDefaultItem> extends
|
|
23
|
-
/**
|
|
24
|
-
* Text to display as the label of the column filter text-field.
|
|
25
|
-
*/
|
|
26
|
-
header: string | null | undefined;
|
|
25
|
+
declare class GridFilterColumn<TItem = GridDefaultItem> extends HTMLElement {}
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
27
|
+
interface GridFilterColumn<TItem = GridDefaultItem>
|
|
28
|
+
extends GridFilterColumnMixinClass,
|
|
29
|
+
GridColumnMixin<TItem, GridColumn<TItem>>,
|
|
30
|
+
GridColumn<TItem> {}
|
|
33
31
|
|
|
34
32
|
declare global {
|
|
35
33
|
interface HTMLElementTagNameMap {
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import './vaadin-grid-filter.js';
|
|
7
7
|
import { defineCustomElement } from '@vaadin/component-base/src/define.js';
|
|
8
8
|
import { GridColumn } from './vaadin-grid-column.js';
|
|
9
|
+
import { GridFilterColumnMixin } from './vaadin-grid-filter-column-mixin.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* `<vaadin-grid-filter-column>` is a helper element for the `<vaadin-grid>`
|
|
@@ -22,100 +23,12 @@ import { GridColumn } from './vaadin-grid-column.js';
|
|
|
22
23
|
*
|
|
23
24
|
* @customElement
|
|
24
25
|
* @extends GridColumn
|
|
26
|
+
* @mixes GridFilterColumnMixin
|
|
25
27
|
*/
|
|
26
|
-
class GridFilterColumn extends GridColumn {
|
|
28
|
+
class GridFilterColumn extends GridFilterColumnMixin(GridColumn) {
|
|
27
29
|
static get is() {
|
|
28
30
|
return 'vaadin-grid-filter-column';
|
|
29
31
|
}
|
|
30
|
-
|
|
31
|
-
static get properties() {
|
|
32
|
-
return {
|
|
33
|
-
/**
|
|
34
|
-
* JS Path of the property in the item used for filtering the data.
|
|
35
|
-
*/
|
|
36
|
-
path: String,
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Text to display as the label of the column filter text-field.
|
|
40
|
-
*/
|
|
41
|
-
header: String,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
static get observers() {
|
|
46
|
-
return ['_onHeaderRendererOrBindingChanged(_headerRenderer, _headerCell, path, header, _filterValue)'];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
constructor() {
|
|
50
|
-
super();
|
|
51
|
-
|
|
52
|
-
this.__boundOnFilterValueChanged = this.__onFilterValueChanged.bind(this);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Renders the grid filter with the custom text field to the header cell.
|
|
57
|
-
*
|
|
58
|
-
* @override
|
|
59
|
-
*/
|
|
60
|
-
_defaultHeaderRenderer(root, _column) {
|
|
61
|
-
let filter = root.firstElementChild;
|
|
62
|
-
let textField = filter ? filter.firstElementChild : undefined;
|
|
63
|
-
|
|
64
|
-
if (!filter) {
|
|
65
|
-
filter = document.createElement('vaadin-grid-filter');
|
|
66
|
-
textField = document.createElement('vaadin-text-field');
|
|
67
|
-
textField.setAttribute('theme', 'small');
|
|
68
|
-
textField.setAttribute('style', 'max-width: 100%;');
|
|
69
|
-
textField.setAttribute('focus-target', '');
|
|
70
|
-
textField.addEventListener('value-changed', this.__boundOnFilterValueChanged);
|
|
71
|
-
filter.appendChild(textField);
|
|
72
|
-
root.appendChild(filter);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
filter.path = this.path;
|
|
76
|
-
filter.value = this._filterValue;
|
|
77
|
-
|
|
78
|
-
textField.__rendererValue = this._filterValue;
|
|
79
|
-
textField.value = this._filterValue;
|
|
80
|
-
textField.label = this.__getHeader(this.header, this.path);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* The filter column doesn't allow to use a custom header renderer
|
|
85
|
-
* to override the header cell content.
|
|
86
|
-
* It always renders the grid filter to the header cell.
|
|
87
|
-
*
|
|
88
|
-
* @override
|
|
89
|
-
*/
|
|
90
|
-
_computeHeaderRenderer() {
|
|
91
|
-
return this._defaultHeaderRenderer;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Updates the internal filter value once the filter text field is changed.
|
|
96
|
-
* The listener handles only user-fired events.
|
|
97
|
-
*
|
|
98
|
-
* @private
|
|
99
|
-
*/
|
|
100
|
-
__onFilterValueChanged(e) {
|
|
101
|
-
// Skip if the value is changed by the renderer.
|
|
102
|
-
if (e.detail.value === e.target.__rendererValue) {
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
this._filterValue = e.detail.value;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/** @private */
|
|
110
|
-
__getHeader(header, path) {
|
|
111
|
-
if (header) {
|
|
112
|
-
return header;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (path) {
|
|
116
|
-
return this._generateHeader(path);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
32
|
}
|
|
120
33
|
|
|
121
34
|
defineCustomElement(GridFilterColumn);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (c) 2016 - 2023 Vaadin Ltd.
|
|
4
|
+
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
|
+
*/
|
|
6
|
+
import type { Constructor } from '@open-wc/dedupe-mixin';
|
|
7
|
+
import type { ControllerMixinClass } from '@vaadin/component-base/src/controller-mixin.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Fired when the `value` property changes.
|
|
11
|
+
*/
|
|
12
|
+
export type GridFilterValueChangedEvent = CustomEvent<{ value: string }>;
|
|
13
|
+
|
|
14
|
+
export interface GridFilterCustomEventMap {
|
|
15
|
+
'value-changed': GridFilterValueChangedEvent;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface GridFilterEventMap extends HTMLElementEventMap, GridFilterCustomEventMap {}
|
|
19
|
+
|
|
20
|
+
export declare function GridFilterElementMixin<T extends Constructor<HTMLElement>>(
|
|
21
|
+
base: T,
|
|
22
|
+
): Constructor<ControllerMixinClass> & Constructor<GridFilterElementMixinClass> & T;
|
|
23
|
+
|
|
24
|
+
declare class GridFilterElementMixinClass {
|
|
25
|
+
/**
|
|
26
|
+
* JS Path of the property in the item used for filtering the data.
|
|
27
|
+
*/
|
|
28
|
+
path: string | null | undefined;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Current filter value.
|
|
32
|
+
*/
|
|
33
|
+
value: string | null | undefined;
|
|
34
|
+
}
|