@digital-realty/ix-grid 1.1.29 → 1.2.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/dist/IxGrid.d.ts +20 -7
- package/dist/IxGrid.js +144 -48
- package/dist/IxGrid.js.map +1 -1
- package/dist/ix-grid.min.js +4 -4
- package/dist/test/ix-grid.test.js +77 -0
- package/dist/test/ix-grid.test.js.map +1 -1
- package/package.json +2 -2
- package/src/IxGrid.ts +207 -68
- package/src/test/ix-grid.test.ts +142 -0
package/dist/IxGrid.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { LitElement } from 'lit';
|
|
2
|
-
import '@vaadin/grid';
|
|
3
|
-
import { GridItemModel } from '@vaadin/grid';
|
|
4
|
-
import { GridColumn } from '@vaadin/grid/src/vaadin-grid-column.js';
|
|
5
1
|
import '@digital-realty/ix-icon-button/ix-icon-button.js';
|
|
6
2
|
import '@digital-realty/ix-icon/ix-icon.js';
|
|
7
3
|
import '@digital-realty/ix-progress/ix-progress.js';
|
|
8
|
-
import '
|
|
9
|
-
import '
|
|
4
|
+
import '@vaadin/grid';
|
|
5
|
+
import { GridItemModel } from '@vaadin/grid';
|
|
6
|
+
import { GridColumn } from '@vaadin/grid/src/vaadin-grid-column.js';
|
|
7
|
+
import { LitElement } from 'lit';
|
|
10
8
|
import './components/IxGridColumnFilter.js';
|
|
9
|
+
import './components/IxGridDownloadMenu.js';
|
|
11
10
|
import './components/IxGridRowFilter.js';
|
|
11
|
+
import './components/IxPagination.js';
|
|
12
12
|
import { IxGridDownloadMenuItemModel } from './models/IxGridDownloadMenuItemModel.js';
|
|
13
13
|
export interface Row {
|
|
14
14
|
[key: string]: unknown;
|
|
@@ -27,6 +27,8 @@ export interface Column {
|
|
|
27
27
|
frozenToEnd?: boolean;
|
|
28
28
|
dataType?: DataType;
|
|
29
29
|
filterOperators?: FilterOperator[];
|
|
30
|
+
autoWidth?: boolean;
|
|
31
|
+
flexGrow?: number;
|
|
30
32
|
}
|
|
31
33
|
export interface FieldOperator {
|
|
32
34
|
columnField: string;
|
|
@@ -40,7 +42,7 @@ export declare class IxGrid extends LitElement {
|
|
|
40
42
|
grid: HTMLElement;
|
|
41
43
|
columnReorderingAllowed: boolean;
|
|
42
44
|
variantClass: string;
|
|
43
|
-
columns: Column[];
|
|
45
|
+
readonly columns: Column[];
|
|
44
46
|
rows: Row[];
|
|
45
47
|
defaultEmptyText: string;
|
|
46
48
|
sortedColumn: string;
|
|
@@ -65,6 +67,9 @@ export declare class IxGrid extends LitElement {
|
|
|
65
67
|
private filters;
|
|
66
68
|
isColumnsReordering: boolean;
|
|
67
69
|
isExpanded: boolean;
|
|
70
|
+
displayColumns: Column[];
|
|
71
|
+
private hashedTableState;
|
|
72
|
+
private initialised;
|
|
68
73
|
get isPersistable(): boolean;
|
|
69
74
|
get columnNames(): string[];
|
|
70
75
|
get columnsLocalStorageKey(): string;
|
|
@@ -79,11 +84,19 @@ export declare class IxGrid extends LitElement {
|
|
|
79
84
|
frozenToEnd?: boolean | undefined;
|
|
80
85
|
dataType?: DataType | undefined;
|
|
81
86
|
filterOperators?: FilterOperator[] | undefined;
|
|
87
|
+
autoWidth?: boolean | undefined;
|
|
88
|
+
flexGrow?: number | undefined;
|
|
82
89
|
}[];
|
|
90
|
+
update(changedProperties: Map<string, any>): void;
|
|
83
91
|
firstUpdated(): void;
|
|
92
|
+
private checkLocalStorageUpdate;
|
|
84
93
|
buildQueryFromFilters(): {
|
|
85
94
|
[k: string]: string;
|
|
86
95
|
};
|
|
96
|
+
private getColumnsToDisplayFromLocalStorage;
|
|
97
|
+
private mapColumnsWithPersistedSettings;
|
|
98
|
+
private removeOldLocalStorageValues;
|
|
99
|
+
private findMatchingLocalStorageKeys;
|
|
87
100
|
private updatePage;
|
|
88
101
|
saveOriginalSearchParams(gridSearchParams: URLSearchParams): void;
|
|
89
102
|
handleSort(column?: string): void;
|
package/dist/IxGrid.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
/* eslint-disable import/no-duplicates */
|
|
3
|
-
import { html, LitElement, nothing, render } from 'lit';
|
|
4
|
-
import { property, state, query } from 'lit/decorators.js';
|
|
5
|
-
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
6
|
-
import { classMap } from 'lit/directives/class-map.js';
|
|
7
|
-
import '@vaadin/grid';
|
|
8
|
-
import { columnHeaderRenderer } from '@vaadin/grid/lit.js';
|
|
9
3
|
import '@digital-realty/ix-icon-button/ix-icon-button.js';
|
|
10
4
|
import '@digital-realty/ix-icon/ix-icon.js';
|
|
11
5
|
import '@digital-realty/ix-progress/ix-progress.js';
|
|
12
|
-
import '
|
|
13
|
-
import '
|
|
6
|
+
import '@vaadin/grid';
|
|
7
|
+
import { columnHeaderRenderer } from '@vaadin/grid/lit.js';
|
|
8
|
+
import { html, LitElement, nothing, render } from 'lit';
|
|
9
|
+
import { property, query, state } from 'lit/decorators.js';
|
|
10
|
+
import { classMap } from 'lit/directives/class-map.js';
|
|
11
|
+
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
14
12
|
import './components/IxGridColumnFilter.js';
|
|
13
|
+
import './components/IxGridDownloadMenu.js';
|
|
15
14
|
import './components/IxGridRowFilter.js';
|
|
15
|
+
import './components/IxPagination.js';
|
|
16
16
|
import { IxGridViewStyles } from './grid-view-styles.js';
|
|
17
17
|
import { copy } from './ix-grid-copy.js';
|
|
18
18
|
export class IxGrid extends LitElement {
|
|
@@ -48,6 +48,9 @@ export class IxGrid extends LitElement {
|
|
|
48
48
|
this.filters = [];
|
|
49
49
|
this.isColumnsReordering = false;
|
|
50
50
|
this.isExpanded = false;
|
|
51
|
+
this.displayColumns = [];
|
|
52
|
+
this.hashedTableState = '';
|
|
53
|
+
this.initialised = false;
|
|
51
54
|
this.renderColumnHeader = (column, index, length) => {
|
|
52
55
|
const headerClasses = classMap({
|
|
53
56
|
header: true,
|
|
@@ -107,7 +110,7 @@ export class IxGrid extends LitElement {
|
|
|
107
110
|
></ix-grid-download-menu>`
|
|
108
111
|
: nothing}
|
|
109
112
|
<ix-grid-row-filter
|
|
110
|
-
.columns=${this.
|
|
113
|
+
.columns=${this.displayColumns}
|
|
111
114
|
.filterValueChangeDebounceTime=${this
|
|
112
115
|
.filterValueChangeDebounceTime}
|
|
113
116
|
.readParamsFromURL=${this.readParamsFromURL}
|
|
@@ -168,35 +171,42 @@ export class IxGrid extends LitElement {
|
|
|
168
171
|
return this.columns.map((column) => column.name);
|
|
169
172
|
}
|
|
170
173
|
get columnsLocalStorageKey() {
|
|
171
|
-
|
|
174
|
+
if (this.hashedTableState === '') {
|
|
175
|
+
const columnsWithoutFunctions = this.columns.map(
|
|
176
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
177
|
+
({ bodyRenderer, ...rest }) => rest);
|
|
178
|
+
const serializedColumns = JSON.stringify(columnsWithoutFunctions);
|
|
179
|
+
let hash = 0;
|
|
180
|
+
for (let i = 0; i < serializedColumns.length; i += 1) {
|
|
181
|
+
// Update hash using prime number multiplier (31) for better distribution and ensure it doesn't exceed 32-bit integer
|
|
182
|
+
// eslint-disable-next-line no-bitwise
|
|
183
|
+
hash = (hash * 31 + serializedColumns.charCodeAt(i)) >>> 0;
|
|
184
|
+
}
|
|
185
|
+
// Convert the string to base36 for brevity
|
|
186
|
+
this.hashedTableState = hash.toString(36);
|
|
187
|
+
}
|
|
188
|
+
return `ix-grid-${this.localStorageID}-${this.hashedTableState}-columns`;
|
|
172
189
|
}
|
|
173
190
|
get arrangedColumns() {
|
|
174
|
-
let
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const column = this.columns.find((col) => col.name === c.name);
|
|
180
|
-
if (!column)
|
|
181
|
-
return;
|
|
182
|
-
// eslint-disable-next-line consistent-return
|
|
183
|
-
return {
|
|
184
|
-
...column,
|
|
185
|
-
hidden: c.hidden,
|
|
186
|
-
frozenToEnd: c.frozenToEnd,
|
|
187
|
-
width: !c.width ? undefined : c.width,
|
|
188
|
-
};
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
if (displayColumns.length === 0)
|
|
192
|
-
displayColumns = [...this.columns];
|
|
193
|
-
return displayColumns
|
|
191
|
+
let columnsToDisplay = [];
|
|
192
|
+
columnsToDisplay = this.getColumnsToDisplayFromLocalStorage();
|
|
193
|
+
if (columnsToDisplay.length === 0)
|
|
194
|
+
columnsToDisplay = [...this.columns];
|
|
195
|
+
return columnsToDisplay
|
|
194
196
|
.filter(col => col)
|
|
195
197
|
.map((column) => ({
|
|
196
198
|
...column,
|
|
197
199
|
width: !column.width ? undefined : column.width,
|
|
198
200
|
}));
|
|
199
201
|
}
|
|
202
|
+
update(changedProperties) {
|
|
203
|
+
if (!this.initialised && this.columns.length > 0) {
|
|
204
|
+
this.displayColumns = [...this.columns];
|
|
205
|
+
this.checkLocalStorageUpdate();
|
|
206
|
+
this.initialised = true;
|
|
207
|
+
}
|
|
208
|
+
super.update(changedProperties);
|
|
209
|
+
}
|
|
200
210
|
firstUpdated() {
|
|
201
211
|
if (this.readParamsFromURL) {
|
|
202
212
|
const url = new URL(window.location.href);
|
|
@@ -216,6 +226,25 @@ export class IxGrid extends LitElement {
|
|
|
216
226
|
this.pageSize = parseInt(size, 10) || this.defaultPageSize;
|
|
217
227
|
}
|
|
218
228
|
}
|
|
229
|
+
this.removeOldLocalStorageValues();
|
|
230
|
+
}
|
|
231
|
+
checkLocalStorageUpdate() {
|
|
232
|
+
if (this.isPersistable) {
|
|
233
|
+
const preservedColumns = JSON.parse(localStorage.getItem(this.columnsLocalStorageKey) || '[]');
|
|
234
|
+
if (preservedColumns.length > 0) {
|
|
235
|
+
let updateStorage = false;
|
|
236
|
+
// Scenarios where we should update appData with the latest display columns data
|
|
237
|
+
if (preservedColumns.length !== this.columns.length)
|
|
238
|
+
updateStorage = true;
|
|
239
|
+
const allColumnNamesFound = this.columns.every(column => preservedColumns.some(pc => pc.name === column.name)) &&
|
|
240
|
+
preservedColumns.every(pc => this.columns.some(column => column.name === pc.name));
|
|
241
|
+
if (!allColumnNamesFound)
|
|
242
|
+
updateStorage = true;
|
|
243
|
+
if (updateStorage) {
|
|
244
|
+
this.setColumnsToLocalStorage(this.columns);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
219
248
|
}
|
|
220
249
|
buildQueryFromFilters() {
|
|
221
250
|
const params = new URLSearchParams();
|
|
@@ -224,6 +253,64 @@ export class IxGrid extends LitElement {
|
|
|
224
253
|
});
|
|
225
254
|
return Object.fromEntries(params);
|
|
226
255
|
}
|
|
256
|
+
getColumnsToDisplayFromLocalStorage() {
|
|
257
|
+
let columnsToDisplay = [];
|
|
258
|
+
if (this.isPersistable) {
|
|
259
|
+
const preservedColumns = JSON.parse(localStorage.getItem(this.columnsLocalStorageKey) || '[]');
|
|
260
|
+
if (preservedColumns.length > 0) {
|
|
261
|
+
columnsToDisplay =
|
|
262
|
+
this.mapColumnsWithPersistedSettings(preservedColumns);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return columnsToDisplay;
|
|
266
|
+
}
|
|
267
|
+
mapColumnsWithPersistedSettings(preservedColumns) {
|
|
268
|
+
const preservedMap = new Map(preservedColumns.map(col => [col.name, col]));
|
|
269
|
+
const mappedColumns = this.columns.map(configuredColumn => {
|
|
270
|
+
const preservedColumn = preservedMap.get(configuredColumn.name);
|
|
271
|
+
if (!preservedColumn) {
|
|
272
|
+
return { ...configuredColumn };
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
...configuredColumn,
|
|
276
|
+
hidden: preservedColumn.hidden,
|
|
277
|
+
frozenToEnd: preservedColumn.frozenToEnd,
|
|
278
|
+
width: preservedColumn.width || undefined,
|
|
279
|
+
};
|
|
280
|
+
});
|
|
281
|
+
mappedColumns.sort((a, b) => {
|
|
282
|
+
const indexA = preservedColumns.findIndex(col => col.name === a.name);
|
|
283
|
+
const indexB = preservedColumns.findIndex(col => col.name === b.name);
|
|
284
|
+
if (indexA === -1 && indexB === -1)
|
|
285
|
+
return 0;
|
|
286
|
+
if (indexA === -1)
|
|
287
|
+
return 1;
|
|
288
|
+
if (indexB === -1)
|
|
289
|
+
return -1;
|
|
290
|
+
return indexA - indexB;
|
|
291
|
+
});
|
|
292
|
+
return mappedColumns;
|
|
293
|
+
}
|
|
294
|
+
removeOldLocalStorageValues() {
|
|
295
|
+
const oldKeys = this.findMatchingLocalStorageKeys(`ix-grid-${this.localStorageID}-`, '-columns', this.hashedTableState);
|
|
296
|
+
for (let i = 0; i <= oldKeys.length; i += 1) {
|
|
297
|
+
localStorage.removeItem(oldKeys[i]);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
findMatchingLocalStorageKeys(prefix, suffix, currentTableStateHash) {
|
|
301
|
+
const matchingKeys = [];
|
|
302
|
+
const currentKey = prefix + currentTableStateHash + suffix;
|
|
303
|
+
for (let i = 0; i < localStorage.length; i += 1) {
|
|
304
|
+
const key = localStorage.key(i);
|
|
305
|
+
if (key &&
|
|
306
|
+
key.startsWith(prefix) &&
|
|
307
|
+
key.endsWith(suffix) &&
|
|
308
|
+
key !== currentKey) {
|
|
309
|
+
matchingKeys.push(key);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return matchingKeys;
|
|
313
|
+
}
|
|
227
314
|
async updatePage(refreshUrlParams = true) {
|
|
228
315
|
var _a;
|
|
229
316
|
const filters = this.filters.reduce((columnFilters, { columnField, value }) => ({
|
|
@@ -294,9 +381,10 @@ export class IxGrid extends LitElement {
|
|
|
294
381
|
}
|
|
295
382
|
async reorderColumnsFromTable() {
|
|
296
383
|
var _a, _b;
|
|
297
|
-
const
|
|
298
|
-
const
|
|
299
|
-
const
|
|
384
|
+
const columns = [...this.arrangedColumns];
|
|
385
|
+
const visibleColumns = columns.filter((column) => column.hidden !== true);
|
|
386
|
+
const hiddenColumns = columns.filter((column) => column.hidden === true);
|
|
387
|
+
const frozenColumns = columns.filter((column) => column.frozenToEnd === true);
|
|
300
388
|
const allColumns = [
|
|
301
389
|
...visibleColumns.filter(column => (column === null || column === void 0 ? void 0 : column.frozenToEnd) !== true),
|
|
302
390
|
...hiddenColumns.filter(column => (column === null || column === void 0 ? void 0 : column.frozenToEnd) !== true),
|
|
@@ -313,7 +401,7 @@ export class IxGrid extends LitElement {
|
|
|
313
401
|
let reorderedColumns = [];
|
|
314
402
|
if (!columnsCorrectlyOrdered) {
|
|
315
403
|
reorderedColumns = columnOrder.map(id => allColumns[id]);
|
|
316
|
-
this.
|
|
404
|
+
this.displayColumns = [
|
|
317
405
|
...reorderedColumns.filter(column => column.hidden !== true && (column === null || column === void 0 ? void 0 : column.frozenToEnd) !== true),
|
|
318
406
|
...hiddenColumns.filter(column => (column === null || column === void 0 ? void 0 : column.frozenToEnd) !== true),
|
|
319
407
|
...frozenColumns,
|
|
@@ -321,20 +409,22 @@ export class IxGrid extends LitElement {
|
|
|
321
409
|
this.isColumnsReordering = true;
|
|
322
410
|
await this.updateComplete;
|
|
323
411
|
this.isColumnsReordering = false;
|
|
324
|
-
this.setColumnsToLocalStorage(this.
|
|
412
|
+
this.setColumnsToLocalStorage(this.displayColumns);
|
|
325
413
|
}
|
|
326
414
|
}
|
|
327
415
|
}
|
|
328
416
|
async reorderColumnsFromFilter(e) {
|
|
329
|
-
this.
|
|
330
|
-
this.setColumnsToLocalStorage([...this.
|
|
417
|
+
this.displayColumns = [...e.detail.reorderedColumns];
|
|
418
|
+
this.setColumnsToLocalStorage([...this.displayColumns]);
|
|
331
419
|
this.isColumnsReordering = true;
|
|
332
420
|
await this.updateComplete;
|
|
333
421
|
this.isColumnsReordering = false;
|
|
334
422
|
}
|
|
335
423
|
handleOnColumnFilter(e) {
|
|
336
424
|
e.detail.columns.forEach((column, id) => {
|
|
337
|
-
this.
|
|
425
|
+
if (!this.displayColumns[id])
|
|
426
|
+
return;
|
|
427
|
+
this.displayColumns[id].hidden = column === null || column === void 0 ? void 0 : column.hidden;
|
|
338
428
|
});
|
|
339
429
|
this.updatePage(false);
|
|
340
430
|
}
|
|
@@ -346,19 +436,22 @@ export class IxGrid extends LitElement {
|
|
|
346
436
|
return parts;
|
|
347
437
|
}
|
|
348
438
|
renderColumns() {
|
|
349
|
-
|
|
350
|
-
|
|
439
|
+
const arrangedColumnsInstance = [...this.arrangedColumns];
|
|
440
|
+
if (arrangedColumnsInstance.length > 0) {
|
|
441
|
+
return html `${arrangedColumnsInstance.map((column, id) => {
|
|
351
442
|
if (column.hidden === true)
|
|
352
443
|
return nothing;
|
|
353
444
|
return html `<vaadin-grid-column
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
445
|
+
${columnHeaderRenderer(() => this.renderColumnHeader(column, id, arrangedColumnsInstance.length), this.sortDirection)}
|
|
446
|
+
.renderer=${(root, columnElement, model) => this.columnRenderer(column, root, columnElement, model)}
|
|
447
|
+
resizable
|
|
448
|
+
width=${ifDefined(column.width)}
|
|
449
|
+
?hidden=${column.hidden}
|
|
450
|
+
?frozen-to-end=${column.frozenToEnd}
|
|
451
|
+
path=${column.name}
|
|
452
|
+
?auto-width=${column.autoWidth}
|
|
453
|
+
flex-grow=${ifDefined(column.flexGrow)}
|
|
454
|
+
></vaadin-grid-column>`;
|
|
362
455
|
})}`;
|
|
363
456
|
}
|
|
364
457
|
return html `<vaadin-grid-column></vaadin-grid-column>`;
|
|
@@ -490,4 +583,7 @@ __decorate([
|
|
|
490
583
|
__decorate([
|
|
491
584
|
state()
|
|
492
585
|
], IxGrid.prototype, "isExpanded", void 0);
|
|
586
|
+
__decorate([
|
|
587
|
+
state()
|
|
588
|
+
], IxGrid.prototype, "displayColumns", void 0);
|
|
493
589
|
//# sourceMappingURL=IxGrid.js.map
|
package/dist/IxGrid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IxGrid.js","sourceRoot":"","sources":["../src/IxGrid.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { html, LitElement, nothing, render } from 'lit';\nimport { property, state, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport '@vaadin/grid';\nimport { GridItemModel } from '@vaadin/grid';\nimport { columnHeaderRenderer } from '@vaadin/grid/lit.js';\nimport { GridColumn } from '@vaadin/grid/src/vaadin-grid-column.js';\nimport '@digital-realty/ix-icon-button/ix-icon-button.js';\nimport '@digital-realty/ix-icon/ix-icon.js';\nimport '@digital-realty/ix-progress/ix-progress.js';\nimport './components/IxGridDownloadMenu.js';\nimport './components/IxPagination.js';\nimport './components/IxGridColumnFilter.js';\nimport './components/IxGridRowFilter.js';\nimport type { Filter } from './components/IxGridRowFilter.js';\nimport { IxGridViewStyles } from './grid-view-styles.js';\nimport { copy } from './ix-grid-copy.js';\nimport { IxGridDownloadMenuItemModel } from './models/IxGridDownloadMenuItemModel.js';\n\nexport interface Row {\n [key: string]: unknown;\n}\n\nexport type FilterOperator = 'equals' | 'contains';\n\nexport type DataType = 'string' | 'dateTime';\n\nexport type BodyRenderer = (\n item: any,\n model: GridItemModel<any>,\n column: GridColumn\n) => any;\n\nexport interface Column {\n name: string;\n header: string;\n bodyRenderer: BodyRenderer;\n width?: string;\n sortable?: boolean;\n filterable?: boolean;\n hidden?: boolean;\n frozenToEnd?: boolean;\n dataType?: DataType;\n filterOperators?: FilterOperator[];\n}\n\nexport interface FieldOperator {\n columnField: string;\n operator: FilterOperator;\n}\n\nexport class IxGrid extends LitElement {\n static readonly styles = [IxGridViewStyles];\n\n private defaultPageSize = 10;\n\n private defaultPage = 1;\n\n private originalSearchParams: URLSearchParams | undefined = undefined;\n\n @query('vaadin-grid') grid!: HTMLElement;\n\n @property({ type: Boolean, attribute: 'column-reordering-allowed' })\n columnReorderingAllowed: boolean = false;\n\n @property({ type: String }) variantClass = '';\n\n @property({ type: Array }) columns: Column[] = [];\n\n @property({ type: Array }) rows: Row[] = [];\n\n @property({ type: String }) defaultEmptyText = 'No data to display';\n\n @property({ type: String }) sortedColumn = '';\n\n @property({ type: String }) sortDirection = '';\n\n @property({ type: Boolean }) hideHeader = false;\n\n @property({ type: Boolean, attribute: 'hide-filters' }) hideFilters = false;\n\n @property({ type: Number }) rowLimit: number = 0;\n\n @property({ type: Number }) page = this.defaultPage;\n\n @property({ type: Number }) pageSize = this.defaultPageSize;\n\n @property({ type: Array }) pageSizes: number[] = [5, 10, 25, 100];\n\n @property({ type: Number }) recordCount = 0;\n\n @property({ type: String }) localStorageID: string | undefined = undefined;\n\n @property({ type: Boolean }) showDownload = true;\n\n @property({ type: Boolean }) isDownloading = false;\n\n @property({ type: Boolean }) isLoading = false;\n\n @property({ type: Array }) downloadMenuItems: IxGridDownloadMenuItemModel[] =\n [];\n\n @property({ type: Boolean, attribute: 'add-params-to-url' }) addParamsToURL =\n true;\n\n @property({ type: Boolean }) readParamsFromURL = false;\n\n @property({ type: Boolean }) refreshDataOnColumnVisibilityChange: boolean =\n true;\n\n @property({ type: Number }) filterValueChangeDebounceTime: number = 300;\n\n @property({ type: Boolean }) hideColumnHeaders = false;\n\n @state() private filters: Filter[] = [];\n\n @state() isColumnsReordering = false;\n\n @state() isExpanded = false;\n\n get isPersistable() {\n if (this.localStorageID) return true;\n\n return false;\n }\n\n get columnNames() {\n return this.columns.map((column: Column) => column.name);\n }\n\n get columnsLocalStorageKey() {\n return `ix-grid-${this.localStorageID}-columns`;\n }\n\n get arrangedColumns() {\n let displayColumns: Column[] = [];\n\n if (this.isPersistable) {\n const preservedColumns = JSON.parse(\n localStorage.getItem(this.columnsLocalStorageKey) || '[]'\n );\n\n if (preservedColumns.length > 0)\n displayColumns = preservedColumns.map((c: Column) => {\n const column = this.columns.find(\n (col: Column) => col.name === c.name\n ) as Column;\n\n if (!column) return;\n\n // eslint-disable-next-line consistent-return\n return {\n ...column,\n hidden: c.hidden,\n frozenToEnd: c.frozenToEnd,\n width: !c.width ? undefined : c.width,\n };\n });\n }\n\n if (displayColumns.length === 0) displayColumns = [...this.columns];\n\n return displayColumns\n .filter(col => col)\n .map((column: Column) => ({\n ...column,\n width: !column.width ? undefined : column.width,\n }));\n }\n\n firstUpdated() {\n if (this.readParamsFromURL) {\n const url = new URL(window.location.href);\n const searchParams = new URLSearchParams(url.search);\n const sort = searchParams.get('sort');\n const order = searchParams.get('order');\n const page = searchParams.get('page');\n const size = searchParams.get('size');\n\n if (sort && order) {\n this.sortedColumn = sort;\n this.sortDirection = order;\n }\n\n if (page) {\n this.page = parseInt(page, 10) || this.defaultPage;\n }\n\n if (size) {\n this.pageSize = parseInt(size, 10) || this.defaultPageSize;\n }\n }\n }\n\n buildQueryFromFilters() {\n const params = new URLSearchParams();\n\n this.filters.forEach((f: Filter) => {\n params.append(`${f.columnField}_${f.operatorValue}`, f.value);\n });\n\n return Object.fromEntries(params);\n }\n\n private async updatePage(refreshUrlParams = true) {\n const filters = this.filters.reduce(\n (columnFilters: { [key: string]: string }, { columnField, value }) => ({\n ...columnFilters,\n [columnField]: value,\n }),\n {}\n );\n\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: {\n columnName: this.sortedColumn,\n sortOrder: this.sortDirection,\n page: this.page,\n pageSize: this.pageSize,\n filters,\n filtersOperators: this.filters.map(\n (f: Filter): FieldOperator => ({\n columnField: f.columnField,\n operator: <FilterOperator>f.operatorValue,\n })\n ),\n },\n bubbles: true,\n composed: true,\n })\n );\n\n if (this.addParamsToURL && refreshUrlParams) {\n const urlParams: { [key: string]: string } = {\n sort: this.sortedColumn,\n order: this.sortDirection,\n page: this.page.toString(),\n size: this.pageSize.toString(),\n ...this.buildQueryFromFilters(),\n };\n\n const url = new URL(window.location.href);\n const gridSearchParams = new URLSearchParams(urlParams);\n\n if (!this.originalSearchParams) {\n this.saveOriginalSearchParams(gridSearchParams);\n }\n\n const combinedParams = new URLSearchParams([\n ...(this.originalSearchParams ?? []),\n ...gridSearchParams,\n ]);\n url.search = combinedParams.toString();\n window.history.replaceState(null, '', url.toString());\n }\n }\n\n saveOriginalSearchParams(gridSearchParams: URLSearchParams) {\n const url = new URL(window.location.href);\n const originalSearchParams = new URLSearchParams(url.search);\n\n this.filters.forEach((f: Filter) => {\n originalSearchParams.delete(`${f.columnField}_${f.operatorValue}`);\n });\n\n gridSearchParams.forEach((value, key) => {\n originalSearchParams.delete(key);\n });\n\n this.originalSearchParams = originalSearchParams;\n }\n\n handleSort(column: string = '') {\n if (this.sortedColumn !== column) {\n this.sortDirection = 'asc';\n } else {\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n }\n this.sortedColumn = column;\n\n this.updatePage();\n }\n\n private renderColumnHeader = (\n column: Column,\n index: number,\n length: number\n ) => {\n const headerClasses = classMap({\n header: true,\n frozen: !!column.frozenToEnd,\n first: index === 0,\n last: index === length - 1,\n });\n\n return html`\n <div\n @click=${() => column.sortable && this.handleSort(column.name)}\n @keyDown=${() => column.sortable && this.handleSort(column.name)}\n class=${headerClasses}\n >\n <span class=\"header-label\">${column.header}</span>\n ${column.sortable\n ? html`<ix-icon title=\"Sort\" class=\"header-sort-icon\"\n >${this.sortDirection === 'desc' &&\n this.sortedColumn === column.name\n ? `arrow_upward`\n : `arrow_downward`}</ix-icon\n >`\n : nothing}\n </div>\n `;\n };\n\n setColumnsToLocalStorage(columns: Column[]) {\n if (this.isPersistable) {\n localStorage.setItem(\n this.columnsLocalStorageKey,\n JSON.stringify(columns)\n );\n }\n }\n\n async reorderColumnsFromTable() {\n const visibleColumns = this.arrangedColumns.filter(\n (column: Column) => column.hidden !== true\n );\n const hiddenColumns = this.arrangedColumns.filter(\n (column: Column) => column.hidden === true\n );\n const frozenColumns = this.arrangedColumns.filter(\n (column: Column) => column.frozenToEnd === true\n );\n\n const allColumns = [\n ...visibleColumns.filter(column => column?.frozenToEnd !== true),\n ...hiddenColumns.filter(column => column?.frozenToEnd !== true),\n ...frozenColumns,\n ];\n\n // calulate column order from table header flex order\n const headerNodes = Array.from(\n this.grid?.shadowRoot?.querySelectorAll('th') || []\n );\n if (headerNodes.length) {\n const columnOrder = headerNodes\n .map((el, id) => ({ id, flexPosition: Number(el.style.order) }))\n .sort((a, b) => a.flexPosition - b.flexPosition)\n .map(el => el.id);\n\n const columnsCorrectlyOrdered = columnOrder.every(\n (x, i) => i === 0 || x > columnOrder[i - 1]\n );\n let reorderedColumns: Column[] = [];\n if (!columnsCorrectlyOrdered) {\n reorderedColumns = columnOrder.map(id => allColumns[id]);\n this.columns = [\n ...reorderedColumns.filter(\n column => column.hidden !== true && column?.frozenToEnd !== true\n ),\n ...hiddenColumns.filter(column => column?.frozenToEnd !== true),\n ...frozenColumns,\n ];\n\n this.isColumnsReordering = true;\n await this.updateComplete;\n this.isColumnsReordering = false;\n\n this.setColumnsToLocalStorage(this.columns);\n }\n }\n }\n\n async reorderColumnsFromFilter(e: CustomEvent) {\n this.columns = [...e.detail.reorderedColumns];\n this.setColumnsToLocalStorage([...this.columns]);\n\n this.isColumnsReordering = true;\n await this.updateComplete;\n this.isColumnsReordering = false;\n }\n\n handleOnColumnFilter(e: CustomEvent) {\n e.detail.columns.forEach((column: Column, id: number) => {\n this.columns[id].hidden = column?.hidden;\n });\n this.updatePage(false);\n }\n\n cellPartNameGenerator(_column: Column, model: { item: Row }): string {\n let parts = '';\n if (model.item.disabled) {\n parts += ' ix-disabled-cell';\n }\n return parts;\n }\n\n private columnRenderer = (\n column: Column,\n root: HTMLElement,\n columnElement: GridColumn,\n model: any\n ) => {\n /*\n Due to a quirk of vaadin-grid, in order for the column cells to react to\n changes to bodyRenderer output, we must clear the contents of the cell\n before rendering the new content. Otherwise the new content will be\n appended to the existing content.\n */\n render(nothing, root);\n\n const templateResult = column.bodyRenderer(\n model.item,\n model,\n columnElement\n );\n\n render(templateResult, root);\n };\n\n private renderHeader = () => html`\n <div class=\"grid-header\">\n <slot name=\"header\"><div class=\"empty\"></div></slot>\n ${this.hideFilters\n ? nothing\n : html`<div class=\"grid-menu\">\n <ix-grid-column-filter\n .columns=${this.arrangedColumns}\n columnsLocalStorageKey=${ifDefined(this.columnsLocalStorageKey)}\n @columnFilter=${(e: CustomEvent) => this.handleOnColumnFilter(e)}\n @reorderColumns=${this.reorderColumnsFromFilter}\n .columnReorderingAllowed=${this.columnReorderingAllowed}\n .refreshDataOnColumnVisibilityChange=${this\n .refreshDataOnColumnVisibilityChange}\n .requestGridUpdate=${() => this.requestUpdate()}\n ></ix-grid-column-filter>\n ${this.showDownload\n ? html`<ix-grid-download-menu\n .items=${this.downloadMenuItems}\n .isDownloading=${this.isDownloading}\n ></ix-grid-download-menu>`\n : nothing}\n <ix-grid-row-filter\n .columns=${this.columns}\n .filterValueChangeDebounceTime=${this\n .filterValueChangeDebounceTime}\n .readParamsFromURL=${this.readParamsFromURL}\n @rowFilter=${(e: CustomEvent) => {\n this.filters = e.detail.filters;\n if (e.detail.resetPage) {\n this.page = this.defaultPage;\n }\n this.updatePage();\n }}\n ></ix-grid-row-filter>\n </div>`}\n </div>\n <div class=\"touch-edge\">\n <slot name=\"under-header\"></slot>\n </div>\n `;\n\n private renderRowLimitControls = () => {\n if (this.rows.length <= this.rowLimit) return nothing;\n\n return html`\n <div class=\"row-controls row-limit\">\n <ix-button\n appearance=\"text\"\n @click=${() => {\n this.isExpanded = !this.isExpanded;\n }}\n has-icon\n >\n ${this.isExpanded ? copy.viewLess : copy.viewMore}\n <ix-icon slot=\"icon\">${this.isExpanded ? 'remove' : 'add'}</ix-icon>\n </ix-button>\n </div>\n `;\n };\n\n private renderPaginationControls = () => html`\n <div class=\"row-controls pagination\">\n <ix-pagination\n .page=${this.page}\n .pageSize=${this.pageSize}\n .pageSizes=${this.pageSizes}\n .recordCount=${this.recordCount}\n @updatePagination=${(e: CustomEvent) => {\n this.page = e.detail.page;\n this.pageSize = e.detail.pageSize;\n this.updatePage();\n }}\n ></ix-pagination>\n </div>\n `;\n\n renderColumns() {\n if (this.arrangedColumns.length > 0) {\n return html`${this.arrangedColumns.map((column: Column, id: number) => {\n if (column.hidden === true) return nothing;\n\n return html`<vaadin-grid-column\n ${columnHeaderRenderer(\n () =>\n this.renderColumnHeader(column, id, this.arrangedColumns.length),\n this.sortDirection\n )}\n .renderer=${(\n root: HTMLElement,\n columnElement: GridColumn,\n model: any\n ) => this.columnRenderer(column, root, columnElement, model)}\n resizable\n width=${ifDefined(column.width)}\n ?hidden=${column.hidden}\n ?frozen-to-end=${column.frozenToEnd}\n path=${column.name}\n ></vaadin-grid-column>`;\n })}`;\n }\n\n return html`<vaadin-grid-column></vaadin-grid-column>`;\n }\n\n renderLoading() {\n return html` <div\n class=\"progress-container\"\n style=\"display: ${this.isLoading ? '' : 'none'}\"\n >\n <ix-progress .indeterminate=${true}></ix-progress>\n </div>`;\n }\n\n render() {\n return html`\n <div\n class=${`grid-container ${\n this.isColumnsReordering ? 'columns-reordering' : ''\n } ${this.variantClass}`}\n >\n ${this.hideHeader ? nothing : this.renderHeader()}\n ${this.renderLoading()}\n ${!this.isColumnsReordering\n ? html`<vaadin-grid\n class=${this.hideColumnHeaders ? 'hide-column-headers' : ''}\n .items=${this.rowLimit > 0 && !this.isExpanded\n ? this.rows.slice(0, this.rowLimit)\n : this.rows}\n all-rows-visible\n ?column-reordering-allowed=${this.columnReorderingAllowed}\n theme=\"no-border\"\n .cellPartNameGenerator=${this.cellPartNameGenerator}\n @mouseup=${this.reorderColumnsFromTable}\n >\n ${this.renderColumns()}\n </vaadin-grid>\n ${this.rows.length === 0 && !this.isColumnsReordering\n ? html`<slot name=\"no-rows\"></slot>`\n : nothing}`\n : nothing}\n ${this.rowLimit > 0\n ? this.renderRowLimitControls()\n : this.renderPaginationControls()}\n\n <slot name=\"footer\"></slot>\n </div>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IxGrid.js","sourceRoot":"","sources":["../src/IxGrid.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport '@digital-realty/ix-icon-button/ix-icon-button.js';\nimport '@digital-realty/ix-icon/ix-icon.js';\nimport '@digital-realty/ix-progress/ix-progress.js';\nimport '@vaadin/grid';\nimport { GridItemModel } from '@vaadin/grid';\nimport { columnHeaderRenderer } from '@vaadin/grid/lit.js';\nimport { GridColumn } from '@vaadin/grid/src/vaadin-grid-column.js';\nimport { html, LitElement, nothing, render } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport './components/IxGridColumnFilter.js';\nimport './components/IxGridDownloadMenu.js';\nimport './components/IxGridRowFilter.js';\nimport type { Filter } from './components/IxGridRowFilter.js';\nimport './components/IxPagination.js';\nimport { IxGridViewStyles } from './grid-view-styles.js';\nimport { copy } from './ix-grid-copy.js';\nimport { IxGridDownloadMenuItemModel } from './models/IxGridDownloadMenuItemModel.js';\n\nexport interface Row {\n [key: string]: unknown;\n}\n\nexport type FilterOperator = 'equals' | 'contains';\n\nexport type DataType = 'string' | 'dateTime';\n\nexport type BodyRenderer = (\n item: any,\n model: GridItemModel<any>,\n column: GridColumn\n) => any;\n\nexport interface Column {\n name: string;\n header: string;\n bodyRenderer: BodyRenderer;\n width?: string;\n sortable?: boolean;\n filterable?: boolean;\n hidden?: boolean;\n frozenToEnd?: boolean;\n dataType?: DataType;\n filterOperators?: FilterOperator[];\n autoWidth?: boolean;\n flexGrow?: number;\n}\n\nexport interface FieldOperator {\n columnField: string;\n operator: FilterOperator;\n}\n\nexport class IxGrid extends LitElement {\n static readonly styles = [IxGridViewStyles];\n\n private defaultPageSize = 10;\n\n private defaultPage = 1;\n\n private originalSearchParams: URLSearchParams | undefined = undefined;\n\n @query('vaadin-grid') grid!: HTMLElement;\n\n @property({ type: Boolean, attribute: 'column-reordering-allowed' })\n columnReorderingAllowed: boolean = false;\n\n @property({ type: String }) variantClass = '';\n\n @property({ type: Array }) readonly columns: Column[] = [];\n\n @property({ type: Array }) rows: Row[] = [];\n\n @property({ type: String }) defaultEmptyText = 'No data to display';\n\n @property({ type: String }) sortedColumn = '';\n\n @property({ type: String }) sortDirection = '';\n\n @property({ type: Boolean }) hideHeader = false;\n\n @property({ type: Boolean, attribute: 'hide-filters' }) hideFilters = false;\n\n @property({ type: Number }) rowLimit: number = 0;\n\n @property({ type: Number }) page = this.defaultPage;\n\n @property({ type: Number }) pageSize = this.defaultPageSize;\n\n @property({ type: Array }) pageSizes: number[] = [5, 10, 25, 100];\n\n @property({ type: Number }) recordCount = 0;\n\n @property({ type: String }) localStorageID: string | undefined = undefined;\n\n @property({ type: Boolean }) showDownload = true;\n\n @property({ type: Boolean }) isDownloading = false;\n\n @property({ type: Boolean }) isLoading = false;\n\n @property({ type: Array }) downloadMenuItems: IxGridDownloadMenuItemModel[] =\n [];\n\n @property({ type: Boolean, attribute: 'add-params-to-url' }) addParamsToURL =\n true;\n\n @property({ type: Boolean }) readParamsFromURL = false;\n\n @property({ type: Boolean }) refreshDataOnColumnVisibilityChange: boolean =\n true;\n\n @property({ type: Number }) filterValueChangeDebounceTime: number = 300;\n\n @property({ type: Boolean }) hideColumnHeaders = false;\n\n @state() private filters: Filter[] = [];\n\n @state() isColumnsReordering = false;\n\n @state() isExpanded = false;\n\n @state() displayColumns: Column[] = [];\n\n private hashedTableState: string = '';\n\n private initialised = false;\n\n get isPersistable() {\n if (this.localStorageID) return true;\n\n return false;\n }\n\n get columnNames() {\n return this.columns.map((column: Column) => column.name);\n }\n\n get columnsLocalStorageKey() {\n if (this.hashedTableState === '') {\n const columnsWithoutFunctions = this.columns.map(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ({ bodyRenderer, ...rest }) => rest\n );\n const serializedColumns = JSON.stringify(columnsWithoutFunctions);\n\n let hash = 0;\n for (let i = 0; i < serializedColumns.length; i += 1) {\n // Update hash using prime number multiplier (31) for better distribution and ensure it doesn't exceed 32-bit integer\n // eslint-disable-next-line no-bitwise\n hash = (hash * 31 + serializedColumns.charCodeAt(i)) >>> 0;\n }\n\n // Convert the string to base36 for brevity\n this.hashedTableState = hash.toString(36);\n }\n\n return `ix-grid-${this.localStorageID}-${this.hashedTableState}-columns`;\n }\n\n get arrangedColumns() {\n let columnsToDisplay: Column[] = [];\n columnsToDisplay = this.getColumnsToDisplayFromLocalStorage();\n\n if (columnsToDisplay.length === 0) columnsToDisplay = [...this.columns];\n\n return columnsToDisplay\n .filter(col => col)\n .map((column: Column) => ({\n ...column,\n width: !column.width ? undefined : column.width,\n }));\n }\n\n update(changedProperties: Map<string, any>) {\n if (!this.initialised && this.columns.length > 0) {\n this.displayColumns = [...this.columns];\n this.checkLocalStorageUpdate();\n this.initialised = true;\n }\n super.update(changedProperties);\n }\n\n firstUpdated() {\n if (this.readParamsFromURL) {\n const url = new URL(window.location.href);\n const searchParams = new URLSearchParams(url.search);\n const sort = searchParams.get('sort');\n const order = searchParams.get('order');\n const page = searchParams.get('page');\n const size = searchParams.get('size');\n\n if (sort && order) {\n this.sortedColumn = sort;\n this.sortDirection = order;\n }\n\n if (page) {\n this.page = parseInt(page, 10) || this.defaultPage;\n }\n\n if (size) {\n this.pageSize = parseInt(size, 10) || this.defaultPageSize;\n }\n }\n\n this.removeOldLocalStorageValues();\n }\n\n private checkLocalStorageUpdate(): void {\n if (this.isPersistable) {\n const preservedColumns = JSON.parse(\n localStorage.getItem(this.columnsLocalStorageKey) || '[]'\n );\n\n if (preservedColumns.length > 0) {\n let updateStorage = false;\n\n // Scenarios where we should update appData with the latest display columns data\n if (preservedColumns.length !== this.columns.length)\n updateStorage = true;\n const allColumnNamesFound =\n this.columns.every(column =>\n preservedColumns.some(pc => pc.name === column.name)\n ) &&\n preservedColumns.every(pc =>\n this.columns.some(column => column.name === pc.name)\n );\n if (!allColumnNamesFound) updateStorage = true;\n\n if (updateStorage) {\n this.setColumnsToLocalStorage(this.columns);\n }\n }\n }\n }\n\n buildQueryFromFilters() {\n const params = new URLSearchParams();\n\n this.filters.forEach((f: Filter) => {\n params.append(`${f.columnField}_${f.operatorValue}`, f.value);\n });\n\n return Object.fromEntries(params);\n }\n\n private getColumnsToDisplayFromLocalStorage(): Column[] {\n let columnsToDisplay: Column[] = [];\n if (this.isPersistable) {\n const preservedColumns = JSON.parse(\n localStorage.getItem(this.columnsLocalStorageKey) || '[]'\n );\n\n if (preservedColumns.length > 0) {\n columnsToDisplay =\n this.mapColumnsWithPersistedSettings(preservedColumns);\n }\n }\n\n return columnsToDisplay;\n }\n\n private mapColumnsWithPersistedSettings(\n preservedColumns: Column[]\n ): Column[] {\n const preservedMap = new Map(preservedColumns.map(col => [col.name, col]));\n\n const mappedColumns = this.columns.map(configuredColumn => {\n const preservedColumn = preservedMap.get(configuredColumn.name);\n\n if (!preservedColumn) {\n return { ...configuredColumn };\n }\n\n return {\n ...configuredColumn,\n hidden: preservedColumn.hidden,\n frozenToEnd: preservedColumn.frozenToEnd,\n width: preservedColumn.width || undefined,\n };\n });\n\n mappedColumns.sort((a, b) => {\n const indexA = preservedColumns.findIndex(col => col.name === a.name);\n const indexB = preservedColumns.findIndex(col => col.name === b.name);\n\n if (indexA === -1 && indexB === -1) return 0;\n if (indexA === -1) return 1;\n if (indexB === -1) return -1;\n\n return indexA - indexB;\n });\n\n return mappedColumns;\n }\n\n private removeOldLocalStorageValues() {\n const oldKeys = this.findMatchingLocalStorageKeys(\n `ix-grid-${this.localStorageID}-`,\n '-columns',\n this.hashedTableState\n );\n for (let i = 0; i <= oldKeys.length; i += 1) {\n localStorage.removeItem(oldKeys[i]);\n }\n }\n\n private findMatchingLocalStorageKeys(\n prefix: string,\n suffix: string,\n currentTableStateHash: string\n ): string[] {\n const matchingKeys: string[] = [];\n const currentKey = prefix + currentTableStateHash + suffix;\n\n for (let i = 0; i < localStorage.length; i += 1) {\n const key = localStorage.key(i);\n if (\n key &&\n key.startsWith(prefix) &&\n key.endsWith(suffix) &&\n key !== currentKey\n ) {\n matchingKeys.push(key);\n }\n }\n\n return matchingKeys;\n }\n\n private async updatePage(refreshUrlParams = true) {\n const filters = this.filters.reduce(\n (columnFilters: { [key: string]: string }, { columnField, value }) => ({\n ...columnFilters,\n [columnField]: value,\n }),\n {}\n );\n\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: {\n columnName: this.sortedColumn,\n sortOrder: this.sortDirection,\n page: this.page,\n pageSize: this.pageSize,\n filters,\n filtersOperators: this.filters.map(\n (f: Filter): FieldOperator => ({\n columnField: f.columnField,\n operator: <FilterOperator>f.operatorValue,\n })\n ),\n },\n bubbles: true,\n composed: true,\n })\n );\n\n if (this.addParamsToURL && refreshUrlParams) {\n const urlParams: { [key: string]: string } = {\n sort: this.sortedColumn,\n order: this.sortDirection,\n page: this.page.toString(),\n size: this.pageSize.toString(),\n ...this.buildQueryFromFilters(),\n };\n\n const url = new URL(window.location.href);\n const gridSearchParams = new URLSearchParams(urlParams);\n\n if (!this.originalSearchParams) {\n this.saveOriginalSearchParams(gridSearchParams);\n }\n\n const combinedParams = new URLSearchParams([\n ...(this.originalSearchParams ?? []),\n ...gridSearchParams,\n ]);\n url.search = combinedParams.toString();\n window.history.replaceState(null, '', url.toString());\n }\n }\n\n saveOriginalSearchParams(gridSearchParams: URLSearchParams) {\n const url = new URL(window.location.href);\n const originalSearchParams = new URLSearchParams(url.search);\n\n this.filters.forEach((f: Filter) => {\n originalSearchParams.delete(`${f.columnField}_${f.operatorValue}`);\n });\n\n gridSearchParams.forEach((value, key) => {\n originalSearchParams.delete(key);\n });\n\n this.originalSearchParams = originalSearchParams;\n }\n\n handleSort(column: string = '') {\n if (this.sortedColumn !== column) {\n this.sortDirection = 'asc';\n } else {\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n }\n this.sortedColumn = column;\n\n this.updatePage();\n }\n\n private renderColumnHeader = (\n column: Column,\n index: number,\n length: number\n ) => {\n const headerClasses = classMap({\n header: true,\n frozen: !!column.frozenToEnd,\n first: index === 0,\n last: index === length - 1,\n });\n\n return html`\n <div\n @click=${() => column.sortable && this.handleSort(column.name)}\n @keyDown=${() => column.sortable && this.handleSort(column.name)}\n class=${headerClasses}\n >\n <span class=\"header-label\">${column.header}</span>\n ${column.sortable\n ? html`<ix-icon title=\"Sort\" class=\"header-sort-icon\"\n >${this.sortDirection === 'desc' &&\n this.sortedColumn === column.name\n ? `arrow_upward`\n : `arrow_downward`}</ix-icon\n >`\n : nothing}\n </div>\n `;\n };\n\n setColumnsToLocalStorage(columns: Column[]) {\n if (this.isPersistable) {\n localStorage.setItem(\n this.columnsLocalStorageKey,\n JSON.stringify(columns)\n );\n }\n }\n\n async reorderColumnsFromTable() {\n const columns = [...this.arrangedColumns];\n const visibleColumns = columns.filter(\n (column: Column) => column.hidden !== true\n );\n const hiddenColumns = columns.filter(\n (column: Column) => column.hidden === true\n );\n const frozenColumns = columns.filter(\n (column: Column) => column.frozenToEnd === true\n );\n\n const allColumns = [\n ...visibleColumns.filter(column => column?.frozenToEnd !== true),\n ...hiddenColumns.filter(column => column?.frozenToEnd !== true),\n ...frozenColumns,\n ];\n\n // calulate column order from table header flex order\n const headerNodes = Array.from(\n this.grid?.shadowRoot?.querySelectorAll('th') || []\n );\n if (headerNodes.length) {\n const columnOrder = headerNodes\n .map((el, id) => ({ id, flexPosition: Number(el.style.order) }))\n .sort((a, b) => a.flexPosition - b.flexPosition)\n .map(el => el.id);\n\n const columnsCorrectlyOrdered = columnOrder.every(\n (x, i) => i === 0 || x > columnOrder[i - 1]\n );\n let reorderedColumns: Column[] = [];\n if (!columnsCorrectlyOrdered) {\n reorderedColumns = columnOrder.map(id => allColumns[id]);\n this.displayColumns = [\n ...reorderedColumns.filter(\n column => column.hidden !== true && column?.frozenToEnd !== true\n ),\n ...hiddenColumns.filter(column => column?.frozenToEnd !== true),\n ...frozenColumns,\n ];\n\n this.isColumnsReordering = true;\n await this.updateComplete;\n this.isColumnsReordering = false;\n\n this.setColumnsToLocalStorage(this.displayColumns);\n }\n }\n }\n\n async reorderColumnsFromFilter(e: CustomEvent) {\n this.displayColumns = [...e.detail.reorderedColumns];\n this.setColumnsToLocalStorage([...this.displayColumns]);\n\n this.isColumnsReordering = true;\n await this.updateComplete;\n this.isColumnsReordering = false;\n }\n\n handleOnColumnFilter(e: CustomEvent) {\n e.detail.columns.forEach((column: Column, id: number) => {\n if (!this.displayColumns[id]) return;\n this.displayColumns[id].hidden = column?.hidden;\n });\n this.updatePage(false);\n }\n\n cellPartNameGenerator(_column: Column, model: { item: Row }): string {\n let parts = '';\n if (model.item.disabled) {\n parts += ' ix-disabled-cell';\n }\n return parts;\n }\n\n private columnRenderer = (\n column: Column,\n root: HTMLElement,\n columnElement: GridColumn,\n model: any\n ) => {\n /*\n Due to a quirk of vaadin-grid, in order for the column cells to react to\n changes to bodyRenderer output, we must clear the contents of the cell\n before rendering the new content. Otherwise the new content will be\n appended to the existing content.\n */\n render(nothing, root);\n\n const templateResult = column.bodyRenderer(\n model.item,\n model,\n columnElement\n );\n\n render(templateResult, root);\n };\n\n private renderHeader = () => html`\n <div class=\"grid-header\">\n <slot name=\"header\"><div class=\"empty\"></div></slot>\n ${this.hideFilters\n ? nothing\n : html`<div class=\"grid-menu\">\n <ix-grid-column-filter\n .columns=${this.arrangedColumns}\n columnsLocalStorageKey=${ifDefined(this.columnsLocalStorageKey)}\n @columnFilter=${(e: CustomEvent) => this.handleOnColumnFilter(e)}\n @reorderColumns=${this.reorderColumnsFromFilter}\n .columnReorderingAllowed=${this.columnReorderingAllowed}\n .refreshDataOnColumnVisibilityChange=${this\n .refreshDataOnColumnVisibilityChange}\n .requestGridUpdate=${() => this.requestUpdate()}\n ></ix-grid-column-filter>\n ${this.showDownload\n ? html`<ix-grid-download-menu\n .items=${this.downloadMenuItems}\n .isDownloading=${this.isDownloading}\n ></ix-grid-download-menu>`\n : nothing}\n <ix-grid-row-filter\n .columns=${this.displayColumns}\n .filterValueChangeDebounceTime=${this\n .filterValueChangeDebounceTime}\n .readParamsFromURL=${this.readParamsFromURL}\n @rowFilter=${(e: CustomEvent) => {\n this.filters = e.detail.filters;\n if (e.detail.resetPage) {\n this.page = this.defaultPage;\n }\n this.updatePage();\n }}\n ></ix-grid-row-filter>\n </div>`}\n </div>\n <div class=\"touch-edge\">\n <slot name=\"under-header\"></slot>\n </div>\n `;\n\n private renderRowLimitControls = () => {\n if (this.rows.length <= this.rowLimit) return nothing;\n\n return html`\n <div class=\"row-controls row-limit\">\n <ix-button\n appearance=\"text\"\n @click=${() => {\n this.isExpanded = !this.isExpanded;\n }}\n has-icon\n >\n ${this.isExpanded ? copy.viewLess : copy.viewMore}\n <ix-icon slot=\"icon\">${this.isExpanded ? 'remove' : 'add'}</ix-icon>\n </ix-button>\n </div>\n `;\n };\n\n private renderPaginationControls = () => html`\n <div class=\"row-controls pagination\">\n <ix-pagination\n .page=${this.page}\n .pageSize=${this.pageSize}\n .pageSizes=${this.pageSizes}\n .recordCount=${this.recordCount}\n @updatePagination=${(e: CustomEvent) => {\n this.page = e.detail.page;\n this.pageSize = e.detail.pageSize;\n this.updatePage();\n }}\n ></ix-pagination>\n </div>\n `;\n\n renderColumns() {\n const arrangedColumnsInstance = [...this.arrangedColumns];\n\n if (arrangedColumnsInstance.length > 0) {\n return html`${arrangedColumnsInstance.map(\n (column: Column, id: number) => {\n if (column.hidden === true) return nothing;\n\n return html`<vaadin-grid-column\n ${columnHeaderRenderer(\n () =>\n this.renderColumnHeader(\n column,\n id,\n arrangedColumnsInstance.length\n ),\n this.sortDirection\n )}\n .renderer=${(\n root: HTMLElement,\n columnElement: GridColumn,\n model: any\n ) => this.columnRenderer(column, root, columnElement, model)}\n resizable\n width=${ifDefined(column.width)}\n ?hidden=${column.hidden}\n ?frozen-to-end=${column.frozenToEnd}\n path=${column.name}\n ?auto-width=${column.autoWidth}\n flex-grow=${ifDefined(column.flexGrow)}\n ></vaadin-grid-column>`;\n }\n )}`;\n }\n\n return html`<vaadin-grid-column></vaadin-grid-column>`;\n }\n\n renderLoading() {\n return html` <div\n class=\"progress-container\"\n style=\"display: ${this.isLoading ? '' : 'none'}\"\n >\n <ix-progress .indeterminate=${true}></ix-progress>\n </div>`;\n }\n\n render() {\n return html`\n <div\n class=${`grid-container ${\n this.isColumnsReordering ? 'columns-reordering' : ''\n } ${this.variantClass}`}\n >\n ${this.hideHeader ? nothing : this.renderHeader()}\n ${this.renderLoading()}\n ${!this.isColumnsReordering\n ? html`<vaadin-grid\n class=${this.hideColumnHeaders ? 'hide-column-headers' : ''}\n .items=${this.rowLimit > 0 && !this.isExpanded\n ? this.rows.slice(0, this.rowLimit)\n : this.rows}\n all-rows-visible\n ?column-reordering-allowed=${this.columnReorderingAllowed}\n theme=\"no-border\"\n .cellPartNameGenerator=${this.cellPartNameGenerator}\n @mouseup=${this.reorderColumnsFromTable}\n >\n ${this.renderColumns()}\n </vaadin-grid>\n ${this.rows.length === 0 && !this.isColumnsReordering\n ? html`<slot name=\"no-rows\"></slot>`\n : nothing}`\n : nothing}\n ${this.rowLimit > 0\n ? this.renderRowLimitControls()\n : this.renderPaginationControls()}\n\n <slot name=\"footer\"></slot>\n </div>\n `;\n }\n}\n"]}
|