@digital-realty/ix-grid 1.2.34 → 1.2.36
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 +14 -3
- package/dist/IxGrid.js +139 -35
- package/dist/IxGrid.js.map +1 -1
- package/dist/components/IxGridRowFilter.d.ts +1 -0
- package/dist/components/IxGridRowFilter.js +6 -0
- package/dist/components/IxGridRowFilter.js.map +1 -1
- package/dist/grid-view-styles.js +6 -0
- package/dist/grid-view-styles.js.map +1 -1
- package/dist/ix-grid.min.js +14 -2
- package/dist/test/ix-grid.test.js +134 -2
- package/dist/test/ix-grid.test.js.map +1 -1
- package/package.json +2 -2
- package/src/IxGrid.ts +164 -44
- package/src/components/IxGridRowFilter.ts +7 -0
- package/src/grid-view-styles.ts +6 -0
- package/src/test/ix-grid.test.ts +165 -2
package/dist/IxGrid.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import '@digital-realty/ix-icon-button/ix-icon-button.js';
|
|
2
|
-
import '@digital-realty/ix-icon/ix-icon.js';
|
|
3
|
-
import '@digital-realty/ix-progress/ix-progress.js';
|
|
4
1
|
import '@digital-realty/grid';
|
|
5
2
|
import type { GridItemModel } from '@digital-realty/grid';
|
|
6
3
|
import { GridColumn } from '@digital-realty/grid/src/vaadin-grid-column.js';
|
|
4
|
+
import '@digital-realty/ix-icon-button/ix-icon-button.js';
|
|
5
|
+
import '@digital-realty/ix-icon/ix-icon.js';
|
|
6
|
+
import '@digital-realty/ix-progress/ix-progress.js';
|
|
7
7
|
import { LitElement, nothing } from 'lit';
|
|
8
8
|
import './components/IxGridColumnFilter.js';
|
|
9
9
|
import './components/IxGridDownloadMenu.js';
|
|
@@ -29,6 +29,7 @@ export interface Column {
|
|
|
29
29
|
filterOperators?: FilterOperator[];
|
|
30
30
|
autoWidth?: boolean;
|
|
31
31
|
minWidth?: string;
|
|
32
|
+
maxWidth?: string;
|
|
32
33
|
responsive?: [string, string][];
|
|
33
34
|
flexGrow?: number;
|
|
34
35
|
}
|
|
@@ -66,11 +67,13 @@ export declare class IxGrid extends LitElement {
|
|
|
66
67
|
refreshDataOnColumnVisibilityChange: boolean;
|
|
67
68
|
filterValueChangeDebounceTime: number;
|
|
68
69
|
hideColumnHeaders: boolean;
|
|
70
|
+
preservedQueryParamKeys: string[];
|
|
69
71
|
filterMaxDate?: string;
|
|
70
72
|
private filters;
|
|
71
73
|
isColumnsReordering: boolean;
|
|
72
74
|
isExpanded: boolean;
|
|
73
75
|
displayColumns: Column[];
|
|
76
|
+
private defaultFilterKeys;
|
|
74
77
|
private hashedTableState;
|
|
75
78
|
private initialised;
|
|
76
79
|
get isPersistable(): boolean;
|
|
@@ -89,15 +92,23 @@ export declare class IxGrid extends LitElement {
|
|
|
89
92
|
filterOperators?: FilterOperator[] | undefined;
|
|
90
93
|
autoWidth?: boolean | undefined;
|
|
91
94
|
minWidth?: string | undefined;
|
|
95
|
+
maxWidth?: string | undefined;
|
|
92
96
|
responsive?: [string, string][] | undefined;
|
|
93
97
|
flexGrow?: number | undefined;
|
|
94
98
|
}[];
|
|
99
|
+
connectedCallback(): void;
|
|
100
|
+
disconnectedCallback(): void;
|
|
101
|
+
private handlePopState;
|
|
102
|
+
private updateSearchParamsFromUri;
|
|
103
|
+
private rebuildFiltersFromUri;
|
|
104
|
+
private dispatchChangeEvent;
|
|
95
105
|
update(changedProperties: Map<string, any>): void;
|
|
96
106
|
firstUpdated(): void;
|
|
97
107
|
private checkLocalStorageUpdate;
|
|
98
108
|
buildQueryFromFilters(): {
|
|
99
109
|
[k: string]: string;
|
|
100
110
|
};
|
|
111
|
+
rebuildQueryFromMatchingQuerystringParams(): Record<string, string>;
|
|
101
112
|
private getColumnsToDisplayFromLocalStorage;
|
|
102
113
|
private mapColumnsWithPersistedSettings;
|
|
103
114
|
private removeOldLocalStorageValues;
|
package/dist/IxGrid.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
/* eslint-disable import/no-duplicates */
|
|
3
|
+
import '@digital-realty/grid';
|
|
4
|
+
import { columnHeaderRenderer } from '@digital-realty/grid/lit.js';
|
|
3
5
|
import '@digital-realty/ix-icon-button/ix-icon-button.js';
|
|
4
6
|
import '@digital-realty/ix-icon/ix-icon.js';
|
|
5
7
|
import '@digital-realty/ix-progress/ix-progress.js';
|
|
6
|
-
import '@digital-realty/grid';
|
|
7
|
-
import { columnHeaderRenderer } from '@digital-realty/grid/lit.js';
|
|
8
8
|
import { html, LitElement, nothing, render } from 'lit';
|
|
9
9
|
import { property, query, state } from 'lit/decorators.js';
|
|
10
10
|
import { classMap } from 'lit/directives/class-map.js';
|
|
@@ -46,13 +46,40 @@ export class IxGrid extends LitElement {
|
|
|
46
46
|
this.refreshDataOnColumnVisibilityChange = true;
|
|
47
47
|
this.filterValueChangeDebounceTime = 300;
|
|
48
48
|
this.hideColumnHeaders = false;
|
|
49
|
+
this.preservedQueryParamKeys = [];
|
|
49
50
|
this.filterMaxDate = formatDate(new Date(), 'yyyy-MM-dd');
|
|
50
51
|
this.filters = [];
|
|
51
52
|
this.isColumnsReordering = false;
|
|
52
53
|
this.isExpanded = false;
|
|
53
54
|
this.displayColumns = [];
|
|
55
|
+
this.defaultFilterKeys = ['sort', 'order', 'page', 'size'];
|
|
54
56
|
this.hashedTableState = '';
|
|
55
57
|
this.initialised = false;
|
|
58
|
+
this.handlePopState = () => {
|
|
59
|
+
this.updateSearchParamsFromUri(true);
|
|
60
|
+
this.dispatchChangeEvent();
|
|
61
|
+
};
|
|
62
|
+
this.dispatchChangeEvent = () => {
|
|
63
|
+
const filters = this.filters.reduce((columnFilters, { columnField, value }) => ({
|
|
64
|
+
...columnFilters,
|
|
65
|
+
[columnField]: value,
|
|
66
|
+
}), {});
|
|
67
|
+
this.dispatchEvent(new CustomEvent('change', {
|
|
68
|
+
detail: {
|
|
69
|
+
columnName: this.sortedColumn,
|
|
70
|
+
sortOrder: this.sortDirection,
|
|
71
|
+
page: this.page,
|
|
72
|
+
pageSize: this.pageSize,
|
|
73
|
+
filters,
|
|
74
|
+
filtersOperators: this.filters.map((f) => ({
|
|
75
|
+
columnField: f.columnField,
|
|
76
|
+
operator: f.operatorValue,
|
|
77
|
+
})),
|
|
78
|
+
},
|
|
79
|
+
bubbles: true,
|
|
80
|
+
composed: true,
|
|
81
|
+
}));
|
|
82
|
+
};
|
|
56
83
|
this.renderColumnHeader = (column, nextColumn, index, length) => {
|
|
57
84
|
const headerClasses = classMap({
|
|
58
85
|
header: true,
|
|
@@ -88,7 +115,53 @@ export class IxGrid extends LitElement {
|
|
|
88
115
|
*/
|
|
89
116
|
render(nothing, root);
|
|
90
117
|
const templateResult = column.bodyRenderer(model.item, model, columnElement);
|
|
91
|
-
|
|
118
|
+
let styledWrapper = templateResult;
|
|
119
|
+
const shouldApplyMaxWidth = !!column.maxWidth;
|
|
120
|
+
const maxWidthSetClass = 'column-max-width-set';
|
|
121
|
+
if (shouldApplyMaxWidth) {
|
|
122
|
+
styledWrapper = html `
|
|
123
|
+
<div class="${maxWidthSetClass}" style="max-width: ${column.maxWidth}">
|
|
124
|
+
${templateResult}
|
|
125
|
+
</div>
|
|
126
|
+
`;
|
|
127
|
+
}
|
|
128
|
+
render(styledWrapper, root);
|
|
129
|
+
if (shouldApplyMaxWidth) {
|
|
130
|
+
requestAnimationFrame(() => {
|
|
131
|
+
var _a;
|
|
132
|
+
const el = root.querySelector(`.${maxWidthSetClass}`);
|
|
133
|
+
if (el && el.scrollWidth > el.clientWidth) {
|
|
134
|
+
if (!el.querySelector('.custom-tooltip') && ((_a = el.textContent) === null || _a === void 0 ? void 0 : _a.trim())) {
|
|
135
|
+
const tooltip = document.createElement('div');
|
|
136
|
+
tooltip.className = 'custom-tooltip';
|
|
137
|
+
tooltip.style.cssText = `
|
|
138
|
+
background-color: #092241;
|
|
139
|
+
font-size: 0.75rem;
|
|
140
|
+
color: white;
|
|
141
|
+
text-align: left;
|
|
142
|
+
padding: 0.313rem 0.5rem;
|
|
143
|
+
border-radius: 0.188rem;
|
|
144
|
+
max-height: 31.25rem;
|
|
145
|
+
overflow: hidden;
|
|
146
|
+
position: absolute;
|
|
147
|
+
z-index: 1000;
|
|
148
|
+
display: none;
|
|
149
|
+
`;
|
|
150
|
+
tooltip.textContent = el.textContent;
|
|
151
|
+
el.addEventListener('mouseenter', () => {
|
|
152
|
+
tooltip.style.display = 'flex';
|
|
153
|
+
const rect = el.getBoundingClientRect();
|
|
154
|
+
tooltip.style.left = `${rect.left}px`;
|
|
155
|
+
tooltip.style.top = `${rect.bottom + window.scrollY + 4}px`;
|
|
156
|
+
document.body.appendChild(tooltip);
|
|
157
|
+
});
|
|
158
|
+
el.addEventListener('mouseleave', () => {
|
|
159
|
+
tooltip.remove();
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
92
165
|
};
|
|
93
166
|
this.renderHeader = () => html `
|
|
94
167
|
<div class="grid-header">
|
|
@@ -203,22 +276,25 @@ export class IxGrid extends LitElement {
|
|
|
203
276
|
width: !column.width ? undefined : column.width,
|
|
204
277
|
}));
|
|
205
278
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
this.initialised = true;
|
|
211
|
-
}
|
|
212
|
-
super.update(changedProperties);
|
|
279
|
+
connectedCallback() {
|
|
280
|
+
var _a;
|
|
281
|
+
(_a = super.connectedCallback) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
282
|
+
window.addEventListener('popstate', this.handlePopState);
|
|
213
283
|
}
|
|
214
|
-
|
|
284
|
+
disconnectedCallback() {
|
|
285
|
+
var _a;
|
|
286
|
+
window.removeEventListener('popstate', this.handlePopState);
|
|
287
|
+
(_a = super.disconnectedCallback) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
288
|
+
}
|
|
289
|
+
updateSearchParamsFromUri(rebuildFiltersFromUri = false) {
|
|
215
290
|
if (this.readParamsFromURL) {
|
|
216
291
|
const url = new URL(window.location.href);
|
|
217
292
|
const searchParams = new URLSearchParams(url.search);
|
|
218
|
-
const
|
|
219
|
-
const
|
|
220
|
-
const
|
|
221
|
-
const
|
|
293
|
+
const [sortKey, orderKey, pageKey, sizeKey] = this.defaultFilterKeys;
|
|
294
|
+
const sort = searchParams.get(sortKey);
|
|
295
|
+
const order = searchParams.get(orderKey);
|
|
296
|
+
const page = searchParams.get(pageKey);
|
|
297
|
+
const size = searchParams.get(sizeKey);
|
|
222
298
|
if (sort && order) {
|
|
223
299
|
this.sortedColumn = sort;
|
|
224
300
|
this.sortDirection = order;
|
|
@@ -229,7 +305,36 @@ export class IxGrid extends LitElement {
|
|
|
229
305
|
if (size) {
|
|
230
306
|
this.pageSize = parseInt(size, 10) || this.defaultPageSize;
|
|
231
307
|
}
|
|
308
|
+
if (rebuildFiltersFromUri) {
|
|
309
|
+
this.rebuildFiltersFromUri(searchParams);
|
|
310
|
+
}
|
|
232
311
|
}
|
|
312
|
+
}
|
|
313
|
+
rebuildFiltersFromUri(searchParams) {
|
|
314
|
+
const filters = [];
|
|
315
|
+
for (const [key, value] of searchParams.entries()) {
|
|
316
|
+
const isDefaultKey = this.defaultFilterKeys.includes(key);
|
|
317
|
+
const [columnField, operatorValue] = key.split('_');
|
|
318
|
+
if (!isDefaultKey && columnField && operatorValue) {
|
|
319
|
+
filters.push({
|
|
320
|
+
columnField,
|
|
321
|
+
operatorValue,
|
|
322
|
+
value,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
this.filters = filters;
|
|
327
|
+
}
|
|
328
|
+
update(changedProperties) {
|
|
329
|
+
if (!this.initialised && this.columns.length > 0) {
|
|
330
|
+
this.displayColumns = [...this.columns];
|
|
331
|
+
this.checkLocalStorageUpdate();
|
|
332
|
+
this.initialised = true;
|
|
333
|
+
}
|
|
334
|
+
super.update(changedProperties);
|
|
335
|
+
}
|
|
336
|
+
firstUpdated() {
|
|
337
|
+
this.updateSearchParamsFromUri();
|
|
233
338
|
this.removeOldLocalStorageValues();
|
|
234
339
|
}
|
|
235
340
|
checkLocalStorageUpdate() {
|
|
@@ -257,6 +362,19 @@ export class IxGrid extends LitElement {
|
|
|
257
362
|
});
|
|
258
363
|
return Object.fromEntries(params);
|
|
259
364
|
}
|
|
365
|
+
rebuildQueryFromMatchingQuerystringParams() {
|
|
366
|
+
const params = new URLSearchParams();
|
|
367
|
+
if (this.preservedQueryParamKeys.length === 0)
|
|
368
|
+
return {};
|
|
369
|
+
const url = new URL(window.location.href);
|
|
370
|
+
const originalSearchParams = new URLSearchParams(url.search);
|
|
371
|
+
originalSearchParams.forEach((value, key) => {
|
|
372
|
+
if (this.preservedQueryParamKeys.includes(key)) {
|
|
373
|
+
params.append(key, value);
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
return Object.fromEntries(params);
|
|
377
|
+
}
|
|
260
378
|
getColumnsToDisplayFromLocalStorage() {
|
|
261
379
|
let columnsToDisplay = [];
|
|
262
380
|
if (this.isPersistable) {
|
|
@@ -317,25 +435,7 @@ export class IxGrid extends LitElement {
|
|
|
317
435
|
}
|
|
318
436
|
async updatePage(refreshUrlParams = true) {
|
|
319
437
|
var _a;
|
|
320
|
-
|
|
321
|
-
...columnFilters,
|
|
322
|
-
[columnField]: value,
|
|
323
|
-
}), {});
|
|
324
|
-
this.dispatchEvent(new CustomEvent('change', {
|
|
325
|
-
detail: {
|
|
326
|
-
columnName: this.sortedColumn,
|
|
327
|
-
sortOrder: this.sortDirection,
|
|
328
|
-
page: this.page,
|
|
329
|
-
pageSize: this.pageSize,
|
|
330
|
-
filters,
|
|
331
|
-
filtersOperators: this.filters.map((f) => ({
|
|
332
|
-
columnField: f.columnField,
|
|
333
|
-
operator: f.operatorValue,
|
|
334
|
-
})),
|
|
335
|
-
},
|
|
336
|
-
bubbles: true,
|
|
337
|
-
composed: true,
|
|
338
|
-
}));
|
|
438
|
+
this.dispatchChangeEvent();
|
|
339
439
|
if (this.addParamsToURL && refreshUrlParams) {
|
|
340
440
|
const urlParams = {
|
|
341
441
|
sort: this.sortedColumn,
|
|
@@ -343,6 +443,7 @@ export class IxGrid extends LitElement {
|
|
|
343
443
|
page: this.page.toString(),
|
|
344
444
|
size: this.pageSize.toString(),
|
|
345
445
|
...this.buildQueryFromFilters(),
|
|
446
|
+
...this.rebuildQueryFromMatchingQuerystringParams(),
|
|
346
447
|
};
|
|
347
448
|
const url = new URL(window.location.href);
|
|
348
449
|
const gridSearchParams = new URLSearchParams(urlParams);
|
|
@@ -354,7 +455,7 @@ export class IxGrid extends LitElement {
|
|
|
354
455
|
...gridSearchParams,
|
|
355
456
|
]);
|
|
356
457
|
url.search = combinedParams.toString();
|
|
357
|
-
window.history.
|
|
458
|
+
window.history.pushState(null, '', url.toString());
|
|
358
459
|
}
|
|
359
460
|
}
|
|
360
461
|
saveOriginalSearchParams(gridSearchParams) {
|
|
@@ -585,6 +686,9 @@ __decorate([
|
|
|
585
686
|
__decorate([
|
|
586
687
|
property({ type: Boolean })
|
|
587
688
|
], IxGrid.prototype, "hideColumnHeaders", void 0);
|
|
689
|
+
__decorate([
|
|
690
|
+
property({ type: Array })
|
|
691
|
+
], IxGrid.prototype, "preservedQueryParamKeys", void 0);
|
|
588
692
|
__decorate([
|
|
589
693
|
property({ type: String })
|
|
590
694
|
], IxGrid.prototype, "filterMaxDate", void 0);
|
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 '@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 '@digital-realty/grid';\nimport type { GridItemModel } from '@digital-realty/grid';\nimport { columnHeaderRenderer } from '@digital-realty/grid/lit.js';\nimport { GridColumn } from '@digital-realty/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 { formatDate } from 'date-fns/format.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 minWidth?: string;\n responsive?: [string, string][];\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 @property({ type: String }) filterMaxDate?: string = formatDate(\n new Date(),\n 'yyyy-MM-dd'\n );\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 nextColumn: 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 border: !nextColumn?.frozenToEnd,\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.displayColumns = [...this.displayColumns];\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 .maxDate=${this.filterMaxDate}\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 return html`<vaadin-grid-column\n ${columnHeaderRenderer(\n () =>\n this.renderColumnHeader(\n column,\n arrangedColumnsInstance[id + 1],\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 min-width=${ifDefined(column.minWidth)}\n .responsive=${column.responsive}\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 renderGrid() {\n if (this.isColumnsReordering) {\n return nothing;\n }\n\n const columnDisplayed = this.displayColumns.find(\n (column: Column) => column.hidden !== true\n );\n\n if (this.rows.length === 0 || !columnDisplayed) {\n return html`<slot name=\"no-rows\"></slot>`;\n }\n\n return 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 }\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()} ${this.renderGrid()}\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/grid';\nimport type { GridItemModel } from '@digital-realty/grid';\nimport { columnHeaderRenderer } from '@digital-realty/grid/lit.js';\nimport { GridColumn } from '@digital-realty/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 { 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 { formatDate } from 'date-fns/format.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 minWidth?: string;\n maxWidth?: string;\n responsive?: [string, string][];\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 @property({ type: Array }) preservedQueryParamKeys: string[] = [];\n\n @property({ type: String }) filterMaxDate?: string = formatDate(\n new Date(),\n 'yyyy-MM-dd'\n );\n\n @state() private filters: Filter[] = [];\n\n @state() isColumnsReordering = false;\n\n @state() isExpanded = false;\n\n @state() displayColumns: Column[] = [];\n\n private defaultFilterKeys = ['sort', 'order', 'page', 'size'];\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 connectedCallback() {\n super.connectedCallback?.();\n window.addEventListener('popstate', this.handlePopState);\n }\n\n disconnectedCallback() {\n window.removeEventListener('popstate', this.handlePopState);\n super.disconnectedCallback?.();\n }\n\n private handlePopState = () => {\n this.updateSearchParamsFromUri(true);\n this.dispatchChangeEvent();\n };\n\n private updateSearchParamsFromUri(\n rebuildFiltersFromUri: boolean = false\n ): void {\n if (this.readParamsFromURL) {\n const url = new URL(window.location.href);\n const searchParams = new URLSearchParams(url.search);\n const [sortKey, orderKey, pageKey, sizeKey] = this.defaultFilterKeys;\n const sort = searchParams.get(sortKey);\n const order = searchParams.get(orderKey);\n const page = searchParams.get(pageKey);\n const size = searchParams.get(sizeKey);\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 if (rebuildFiltersFromUri) {\n this.rebuildFiltersFromUri(searchParams);\n }\n }\n }\n\n private rebuildFiltersFromUri(searchParams: URLSearchParams): void {\n const filters: Filter[] = [];\n\n for (const [key, value] of searchParams.entries()) {\n const isDefaultKey = this.defaultFilterKeys.includes(key);\n const [columnField, operatorValue] = key.split('_');\n\n if (!isDefaultKey && columnField && operatorValue) {\n filters.push({\n columnField,\n operatorValue,\n value,\n });\n }\n }\n\n this.filters = filters;\n }\n\n private dispatchChangeEvent = () => {\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\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 this.updateSearchParamsFromUri();\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 rebuildQueryFromMatchingQuerystringParams(): Record<string, string> {\n const params = new URLSearchParams();\n if (this.preservedQueryParamKeys.length === 0) return {};\n\n const url = new URL(window.location.href);\n const originalSearchParams = new URLSearchParams(url.search);\n originalSearchParams.forEach((value, key) => {\n if (this.preservedQueryParamKeys.includes(key)) {\n params.append(key, value);\n }\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 this.dispatchChangeEvent();\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 ...this.rebuildQueryFromMatchingQuerystringParams(),\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.pushState(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 nextColumn: 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 border: !nextColumn?.frozenToEnd,\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.displayColumns = [...this.displayColumns];\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 let styledWrapper = templateResult;\n const shouldApplyMaxWidth = !!column.maxWidth;\n const maxWidthSetClass = 'column-max-width-set';\n\n if (shouldApplyMaxWidth) {\n styledWrapper = html`\n <div class=\"${maxWidthSetClass}\" style=\"max-width: ${column.maxWidth}\">\n ${templateResult}\n </div>\n `;\n }\n\n render(styledWrapper, root);\n\n if (shouldApplyMaxWidth) {\n requestAnimationFrame(() => {\n const el = root.querySelector(`.${maxWidthSetClass}`) as HTMLElement;\n if (el && el.scrollWidth > el.clientWidth) {\n if (!el.querySelector('.custom-tooltip') && el.textContent?.trim()) {\n const tooltip = document.createElement('div');\n tooltip.className = 'custom-tooltip';\n tooltip.style.cssText = `\n background-color: #092241;\n font-size: 0.75rem;\n color: white;\n text-align: left;\n padding: 0.313rem 0.5rem;\n border-radius: 0.188rem;\n max-height: 31.25rem;\n overflow: hidden;\n position: absolute;\n z-index: 1000;\n display: none;\n `;\n\n tooltip.textContent = el.textContent;\n\n el.addEventListener('mouseenter', () => {\n tooltip.style.display = 'flex';\n const rect = el.getBoundingClientRect();\n tooltip.style.left = `${rect.left}px`;\n tooltip.style.top = `${rect.bottom + window.scrollY + 4}px`;\n document.body.appendChild(tooltip);\n });\n\n el.addEventListener('mouseleave', () => {\n tooltip.remove();\n });\n }\n }\n });\n }\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 .maxDate=${this.filterMaxDate}\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 return html`<vaadin-grid-column\n ${columnHeaderRenderer(\n () =>\n this.renderColumnHeader(\n column,\n arrangedColumnsInstance[id + 1],\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 min-width=${ifDefined(column.minWidth)}\n .responsive=${column.responsive}\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 renderGrid() {\n if (this.isColumnsReordering) {\n return nothing;\n }\n\n const columnDisplayed = this.displayColumns.find(\n (column: Column) => column.hidden !== true\n );\n\n if (this.rows.length === 0 || !columnDisplayed) {\n return html`<slot name=\"no-rows\"></slot>`;\n }\n\n return 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 }\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()} ${this.renderGrid()}\n ${this.rowLimit > 0\n ? this.renderRowLimitControls()\n : this.renderPaginationControls()}\n\n <slot name=\"footer\"></slot>\n </div>\n `;\n }\n}\n"]}
|
|
@@ -39,6 +39,7 @@ export declare class IxGridRowFilter extends LitElement {
|
|
|
39
39
|
addFilter(): void;
|
|
40
40
|
clearFilters(): void;
|
|
41
41
|
removeFilter(index: number): void;
|
|
42
|
+
private handlePopState;
|
|
42
43
|
private onfilterColumnChange;
|
|
43
44
|
private onfilterOperatorChange;
|
|
44
45
|
private onDatefilterValueChange;
|
|
@@ -32,6 +32,10 @@ let IxGridRowFilter = class IxGridRowFilter extends LitElement {
|
|
|
32
32
|
this.isDropdownVisible = false;
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
|
+
this.handlePopState = () => {
|
|
36
|
+
this.filters = this.parseFilterQueryString();
|
|
37
|
+
this.updateActiveFilters();
|
|
38
|
+
};
|
|
35
39
|
}
|
|
36
40
|
updateActiveFilters() {
|
|
37
41
|
this.activeFilters = this.filters.filter(filter => filter.value.length > 0);
|
|
@@ -39,10 +43,12 @@ let IxGridRowFilter = class IxGridRowFilter extends LitElement {
|
|
|
39
43
|
connectedCallback() {
|
|
40
44
|
super.connectedCallback();
|
|
41
45
|
document.addEventListener('click', this.closeOnOuterClick);
|
|
46
|
+
window.addEventListener('popstate', this.handlePopState);
|
|
42
47
|
}
|
|
43
48
|
disconnectedCallback() {
|
|
44
49
|
super.disconnectedCallback();
|
|
45
50
|
document.removeEventListener('click', this.closeOnOuterClick);
|
|
51
|
+
window.removeEventListener('popstate', this.handlePopState);
|
|
46
52
|
}
|
|
47
53
|
firstUpdated() {
|
|
48
54
|
this.filterableColumns = this.columns.filter(column => column.filterable);
|