@digital-realty/ix-grid 1.3.10 → 1.3.12
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 +8 -0
- package/dist/IxGrid.js +56 -1
- package/dist/IxGrid.js.map +1 -1
- package/dist/ix-grid.min.js +2 -2
- package/dist/test/ix-grid.test.js +38 -1
- package/dist/test/ix-grid.test.js.map +1 -1
- package/package.json +3 -3
- package/src/IxGrid.ts +76 -1
- package/src/test/ix-grid.test.ts +60 -1
package/dist/IxGrid.d.ts
CHANGED
|
@@ -37,6 +37,9 @@ export interface FieldOperator {
|
|
|
37
37
|
columnField: string;
|
|
38
38
|
operator: FilterOperator;
|
|
39
39
|
}
|
|
40
|
+
export interface SessionStorageData {
|
|
41
|
+
pageSize?: number;
|
|
42
|
+
}
|
|
40
43
|
export declare class IxGrid extends LitElement {
|
|
41
44
|
static readonly styles: import("lit").CSSResult[];
|
|
42
45
|
private defaultPageSize;
|
|
@@ -82,11 +85,13 @@ export declare class IxGrid extends LitElement {
|
|
|
82
85
|
disableRemoveAllButton: boolean;
|
|
83
86
|
removeAllButtonLabel: string;
|
|
84
87
|
onRemoveAllButtonClick?: any;
|
|
88
|
+
sessionStorageKey: string | undefined;
|
|
85
89
|
useNewDatePicker: boolean;
|
|
86
90
|
private filters;
|
|
87
91
|
isColumnsReordering: boolean;
|
|
88
92
|
isExpanded: boolean;
|
|
89
93
|
displayColumns: Column[];
|
|
94
|
+
sessionStorageData: SessionStorageData | undefined;
|
|
90
95
|
private defaultFilterKeys;
|
|
91
96
|
private initialised;
|
|
92
97
|
get isPersistable(): boolean;
|
|
@@ -112,11 +117,14 @@ export declare class IxGrid extends LitElement {
|
|
|
112
117
|
connectedCallback(): void;
|
|
113
118
|
disconnectedCallback(): void;
|
|
114
119
|
private handlePopState;
|
|
120
|
+
private handleUnload;
|
|
115
121
|
private updateSearchParamsFromUri;
|
|
116
122
|
private rebuildFiltersFromUri;
|
|
117
123
|
private dispatchChangeEvent;
|
|
118
124
|
update(changedProperties: Map<string, any>): void;
|
|
119
125
|
firstUpdated(): void;
|
|
126
|
+
private getSessionStorageData;
|
|
127
|
+
private updateSessionStorage;
|
|
120
128
|
private checkLocalStorageUpdate;
|
|
121
129
|
buildQueryFromFilters(): {
|
|
122
130
|
[k: string]: string;
|
package/dist/IxGrid.js
CHANGED
|
@@ -59,17 +59,22 @@ export class IxGrid extends LitElement {
|
|
|
59
59
|
this.showRemoveAllButton = false;
|
|
60
60
|
this.disableRemoveAllButton = false;
|
|
61
61
|
this.removeAllButtonLabel = copy.removeAll;
|
|
62
|
+
this.sessionStorageKey = undefined;
|
|
62
63
|
this.useNewDatePicker = false;
|
|
63
64
|
this.filters = [];
|
|
64
65
|
this.isColumnsReordering = false;
|
|
65
66
|
this.isExpanded = false;
|
|
66
67
|
this.displayColumns = [];
|
|
68
|
+
this.sessionStorageData = undefined;
|
|
67
69
|
this.defaultFilterKeys = ['sort', 'order', 'page', 'size'];
|
|
68
70
|
this.initialised = false;
|
|
69
71
|
this.handlePopState = () => {
|
|
70
72
|
this.updateSearchParamsFromUri(true);
|
|
71
73
|
this.dispatchChangeEvent();
|
|
72
74
|
};
|
|
75
|
+
this.handleUnload = () => {
|
|
76
|
+
sessionStorage.removeItem(`urlPageSizeRead`);
|
|
77
|
+
};
|
|
73
78
|
this.dispatchChangeEvent = () => {
|
|
74
79
|
const filters = this.filters.reduce((columnFilters, { columnField, value }) => ({
|
|
75
80
|
...columnFilters,
|
|
@@ -244,6 +249,9 @@ export class IxGrid extends LitElement {
|
|
|
244
249
|
@updatePagination=${(e) => {
|
|
245
250
|
this.page = e.detail.page;
|
|
246
251
|
this.pageSize = e.detail.pageSize;
|
|
252
|
+
this.updateSessionStorage({
|
|
253
|
+
pageSize: this.pageSize,
|
|
254
|
+
});
|
|
247
255
|
this.updatePage();
|
|
248
256
|
}}
|
|
249
257
|
></ix-pagination>
|
|
@@ -291,13 +299,18 @@ export class IxGrid extends LitElement {
|
|
|
291
299
|
var _a;
|
|
292
300
|
(_a = super.connectedCallback) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
293
301
|
window.addEventListener('popstate', this.handlePopState);
|
|
302
|
+
window.addEventListener('beforeunload', this.handleUnload);
|
|
294
303
|
}
|
|
295
304
|
disconnectedCallback() {
|
|
296
305
|
var _a;
|
|
297
306
|
window.removeEventListener('popstate', this.handlePopState);
|
|
307
|
+
window.removeEventListener('beforeunload', this.handleUnload);
|
|
298
308
|
(_a = super.disconnectedCallback) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
299
309
|
}
|
|
300
310
|
updateSearchParamsFromUri(rebuildFiltersFromUri = false) {
|
|
311
|
+
// If the grid is not visible, do not update from search params
|
|
312
|
+
if (this.grid.getBoundingClientRect().width === 0)
|
|
313
|
+
return;
|
|
301
314
|
if (this.readParamsFromURL) {
|
|
302
315
|
const url = new URL(window.location.href);
|
|
303
316
|
const searchParams = new URLSearchParams(url.search);
|
|
@@ -314,7 +327,15 @@ export class IxGrid extends LitElement {
|
|
|
314
327
|
this.page = parseInt(page, 10) || this.defaultPage;
|
|
315
328
|
}
|
|
316
329
|
if (size) {
|
|
317
|
-
|
|
330
|
+
// update pageSize with url param only on load or refresh
|
|
331
|
+
// otherwise use session storage value
|
|
332
|
+
if (!this.getSessionStorageData() ||
|
|
333
|
+
(!sessionStorage.getItem(`urlPageSizeRead`) &&
|
|
334
|
+
this.grid.getBoundingClientRect().width > 0)) {
|
|
335
|
+
sessionStorage.setItem(`urlPageSizeRead`, true.toString());
|
|
336
|
+
this.pageSize = parseInt(size, 10) || this.defaultPageSize;
|
|
337
|
+
this.updateSessionStorage({ pageSize: this.pageSize });
|
|
338
|
+
}
|
|
318
339
|
}
|
|
319
340
|
if (rebuildFiltersFromUri) {
|
|
320
341
|
this.rebuildFiltersFromUri(searchParams);
|
|
@@ -342,11 +363,39 @@ export class IxGrid extends LitElement {
|
|
|
342
363
|
this.checkLocalStorageUpdate();
|
|
343
364
|
this.initialised = true;
|
|
344
365
|
}
|
|
366
|
+
if (changedProperties.has('sessionStorageData') &&
|
|
367
|
+
this.sessionStorageData) {
|
|
368
|
+
const newPageSize = this.sessionStorageData.pageSize || this.defaultPageSize;
|
|
369
|
+
if (this.pageSize !== newPageSize) {
|
|
370
|
+
this.pageSize = newPageSize;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
345
373
|
super.update(changedProperties);
|
|
346
374
|
}
|
|
347
375
|
firstUpdated() {
|
|
348
376
|
this.updateSearchParamsFromUri();
|
|
349
377
|
this.removeOldLocalStorageValues();
|
|
378
|
+
this.sessionStorageData = this.getSessionStorageData();
|
|
379
|
+
}
|
|
380
|
+
getSessionStorageData() {
|
|
381
|
+
if (this.sessionStorageKey) {
|
|
382
|
+
const sessionData = sessionStorage.getItem(`grid-${this.sessionStorageKey}`);
|
|
383
|
+
if (sessionData) {
|
|
384
|
+
return JSON.parse(sessionData);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
updateSessionStorage(data) {
|
|
390
|
+
const sessionData = this.getSessionStorageData() || {};
|
|
391
|
+
if (this.sessionStorageKey && data) {
|
|
392
|
+
const updatedData = {
|
|
393
|
+
...sessionData,
|
|
394
|
+
...data,
|
|
395
|
+
};
|
|
396
|
+
sessionStorage.setItem(`grid-${this.sessionStorageKey}`, JSON.stringify(updatedData));
|
|
397
|
+
this.sessionStorageData = updatedData;
|
|
398
|
+
}
|
|
350
399
|
}
|
|
351
400
|
checkLocalStorageUpdate() {
|
|
352
401
|
if (this.isPersistable) {
|
|
@@ -798,6 +847,9 @@ __decorate([
|
|
|
798
847
|
__decorate([
|
|
799
848
|
property({ type: Function })
|
|
800
849
|
], IxGrid.prototype, "onRemoveAllButtonClick", void 0);
|
|
850
|
+
__decorate([
|
|
851
|
+
property({ type: String, attribute: 'session-storage-key' })
|
|
852
|
+
], IxGrid.prototype, "sessionStorageKey", void 0);
|
|
801
853
|
__decorate([
|
|
802
854
|
property({ type: Boolean })
|
|
803
855
|
], IxGrid.prototype, "useNewDatePicker", void 0);
|
|
@@ -813,4 +865,7 @@ __decorate([
|
|
|
813
865
|
__decorate([
|
|
814
866
|
state()
|
|
815
867
|
], IxGrid.prototype, "displayColumns", void 0);
|
|
868
|
+
__decorate([
|
|
869
|
+
state()
|
|
870
|
+
], IxGrid.prototype, "sessionStorageData", void 0);
|
|
816
871
|
//# 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 '@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: Boolean, attribute: 'simple-pagination' })\n hasSimplePagination = false;\n\n @property({ type: String }) theme = 'no-border';\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 @property({ type: String }) hashedTableState: string = '';\n\n @property({ type: Boolean }) hideViewMoreLessButtonIcon = true;\n\n @property({ type: Boolean }) showAddButton = false;\n\n @property({ type: Boolean }) disableAddButton = false;\n\n @property({ type: Boolean, attribute: 'show-view-more' }) showViewMore =\n false;\n\n @property({ type: String }) addButtonLabel: string = copy.add;\n\n @property({ type: Function }) onAddButtonClick?: any;\n\n @property({ type: Boolean }) showRemoveAllButton = false;\n\n @property({ type: Boolean }) disableRemoveAllButton = false;\n\n @property({ type: String }) removeAllButtonLabel: string = copy.removeAll;\n\n @property({ type: Function }) onRemoveAllButtonClick?: any;\n\n @property({ type: Boolean }) useNewDatePicker = 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 defaultFilterKeys = ['sort', 'order', 'page', 'size'];\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, hidden, ...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 <slot name=\"filters\"><div class=\"empty\"></div></slot>\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 .useNewDatePicker=${this.useNewDatePicker}\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 renderAddNewButton() {\n if (!this.showAddButton) return nothing;\n\n return html`<ix-button\n name=\"add-new-button\"\n appearance=\"text\"\n has-icon\n ?disabled=${this.disableAddButton}\n @click=${() => this.onAddButtonClick()}\n >\n <ix-icon slot=\"icon\">add</ix-icon>\n <span>${this.addButtonLabel}</span>\n </ix-button>`;\n }\n\n renderViewMore() {\n if (!this.showViewMore) return nothing;\n\n return html` <div class=\"view-more\">\n <slot name=\"viewMore\"></slot>\n </div>`;\n }\n\n get showViewMoreLessButton() {\n return (\n !this.showViewMore &&\n this.rowLimit > 0 &&\n this.rows.length > this.rowLimit\n );\n }\n\n renderViewMoreLessButton() {\n if (!this.showViewMoreLessButton) return nothing;\n\n return html`\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 ${this.hideViewMoreLessButtonIcon\n ? nothing\n : html`<ix-icon slot=\"icon\"\n >${this.isExpanded ? 'remove' : 'add'}</ix-icon\n >`}\n </ix-button>\n `;\n }\n\n renderRemoveAllButton() {\n if (!this.showRemoveAllButton) return nothing;\n\n return html`<ix-button\n class=\"remove-all-button\"\n name=\"remove-all-button\"\n appearance=\"text\"\n ?disabled=${this.disableRemoveAllButton}\n @click=${() => this.onRemoveAllButtonClick()}\n >\n <span>${this.removeAllButtonLabel}</span>\n </ix-button>`;\n }\n\n private renderRowControls = () => {\n if (\n this.showAddButton === false &&\n this.showRemoveAllButton === false &&\n this.showViewMoreLessButton === false\n ) {\n return nothing;\n }\n\n return html` <div class=\"row-controls row-limit\">\n ${this.renderAddNewButton()} ${this.renderViewMoreLessButton()}\n ${this.renderRemoveAllButton()}\n </div>`;\n };\n\n private renderPaginationControls = () => {\n if (this.rowLimit > 0) {\n return nothing;\n }\n\n return html`\n <ix-pagination\n ?simple=${this.hasSimplePagination}\n class=\"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 `;\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 const displayRows =\n this.rowLimit > 0 && !this.isExpanded\n ? this.rows.slice(0, this.rowLimit)\n : this.rows;\n\n return html`<vaadin-grid\n class=${this.hideColumnHeaders ? 'hide-column-headers' : ''}\n .items=${columnDisplayed ? displayRows : []}\n all-rows-visible\n theme=${this.theme}\n .cellPartNameGenerator=${this.cellPartNameGenerator}\n @mouseup=${this.reorderColumnsFromTable}\n >\n ${this.renderColumns()}\n <div slot=\"empty-state\"><slot name=\"no-rows\"></slot></div>\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()} ${this.renderRowControls()}\n <div class=\"row-controls more-pagination\">\n ${this.renderViewMore()} ${this.renderPaginationControls()}\n </div>\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 interface SessionStorageData {\n pageSize?: number;\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: Boolean, attribute: 'simple-pagination' })\n hasSimplePagination = false;\n\n @property({ type: String }) theme = 'no-border';\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 @property({ type: String }) hashedTableState: string = '';\n\n @property({ type: Boolean }) hideViewMoreLessButtonIcon = true;\n\n @property({ type: Boolean }) showAddButton = false;\n\n @property({ type: Boolean }) disableAddButton = false;\n\n @property({ type: Boolean, attribute: 'show-view-more' }) showViewMore =\n false;\n\n @property({ type: String }) addButtonLabel: string = copy.add;\n\n @property({ type: Function }) onAddButtonClick?: any;\n\n @property({ type: Boolean }) showRemoveAllButton = false;\n\n @property({ type: Boolean }) disableRemoveAllButton = false;\n\n @property({ type: String }) removeAllButtonLabel: string = copy.removeAll;\n\n @property({ type: Function }) onRemoveAllButtonClick?: any;\n\n @property({ type: String, attribute: 'session-storage-key' })\n sessionStorageKey: string | undefined = undefined;\n\n @property({ type: Boolean }) useNewDatePicker = false;\n\n @state() private filters: Filter[] = [];\n\n @state() isColumnsReordering = false;\n\n @state() isExpanded = false;\n\n @state() displayColumns: Column[] = [];\n\n @state() sessionStorageData: SessionStorageData | undefined = undefined;\n\n private defaultFilterKeys = ['sort', 'order', 'page', 'size'];\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, hidden, ...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 window.addEventListener('beforeunload', this.handleUnload);\n }\n\n disconnectedCallback() {\n window.removeEventListener('popstate', this.handlePopState);\n window.removeEventListener('beforeunload', this.handleUnload);\n super.disconnectedCallback?.();\n }\n\n private handlePopState = () => {\n this.updateSearchParamsFromUri(true);\n this.dispatchChangeEvent();\n };\n\n private handleUnload = () => {\n sessionStorage.removeItem(`urlPageSizeRead`);\n };\n\n private updateSearchParamsFromUri(\n rebuildFiltersFromUri: boolean = false\n ): void {\n // If the grid is not visible, do not update from search params\n if (this.grid.getBoundingClientRect().width === 0) return;\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 // update pageSize with url param only on load or refresh\n // otherwise use session storage value\n if (\n !this.getSessionStorageData() ||\n (!sessionStorage.getItem(`urlPageSizeRead`) &&\n this.grid.getBoundingClientRect().width > 0)\n ) {\n sessionStorage.setItem(`urlPageSizeRead`, true.toString());\n this.pageSize = parseInt(size, 10) || this.defaultPageSize;\n this.updateSessionStorage({ pageSize: this.pageSize });\n }\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\n if (\n changedProperties.has('sessionStorageData') &&\n this.sessionStorageData\n ) {\n const newPageSize =\n this.sessionStorageData.pageSize || this.defaultPageSize;\n\n if (this.pageSize !== newPageSize) {\n this.pageSize = newPageSize;\n }\n }\n\n super.update(changedProperties);\n }\n\n firstUpdated() {\n this.updateSearchParamsFromUri();\n this.removeOldLocalStorageValues();\n this.sessionStorageData = this.getSessionStorageData();\n }\n\n private getSessionStorageData() {\n if (this.sessionStorageKey) {\n const sessionData = sessionStorage.getItem(\n `grid-${this.sessionStorageKey}`\n );\n\n if (sessionData) {\n return JSON.parse(sessionData);\n }\n }\n\n return undefined;\n }\n\n private updateSessionStorage(data: SessionStorageData) {\n const sessionData = this.getSessionStorageData() || {};\n\n if (this.sessionStorageKey && data) {\n const updatedData = {\n ...sessionData,\n ...data,\n };\n\n sessionStorage.setItem(\n `grid-${this.sessionStorageKey}`,\n JSON.stringify(updatedData)\n );\n this.sessionStorageData = updatedData;\n }\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 <slot name=\"filters\"><div class=\"empty\"></div></slot>\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 .useNewDatePicker=${this.useNewDatePicker}\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 renderAddNewButton() {\n if (!this.showAddButton) return nothing;\n\n return html`<ix-button\n name=\"add-new-button\"\n appearance=\"text\"\n has-icon\n ?disabled=${this.disableAddButton}\n @click=${() => this.onAddButtonClick()}\n >\n <ix-icon slot=\"icon\">add</ix-icon>\n <span>${this.addButtonLabel}</span>\n </ix-button>`;\n }\n\n renderViewMore() {\n if (!this.showViewMore) return nothing;\n\n return html` <div class=\"view-more\">\n <slot name=\"viewMore\"></slot>\n </div>`;\n }\n\n get showViewMoreLessButton() {\n return (\n !this.showViewMore &&\n this.rowLimit > 0 &&\n this.rows.length > this.rowLimit\n );\n }\n\n renderViewMoreLessButton() {\n if (!this.showViewMoreLessButton) return nothing;\n\n return html`\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 ${this.hideViewMoreLessButtonIcon\n ? nothing\n : html`<ix-icon slot=\"icon\"\n >${this.isExpanded ? 'remove' : 'add'}</ix-icon\n >`}\n </ix-button>\n `;\n }\n\n renderRemoveAllButton() {\n if (!this.showRemoveAllButton) return nothing;\n\n return html`<ix-button\n class=\"remove-all-button\"\n name=\"remove-all-button\"\n appearance=\"text\"\n ?disabled=${this.disableRemoveAllButton}\n @click=${() => this.onRemoveAllButtonClick()}\n >\n <span>${this.removeAllButtonLabel}</span>\n </ix-button>`;\n }\n\n private renderRowControls = () => {\n if (\n this.showAddButton === false &&\n this.showRemoveAllButton === false &&\n this.showViewMoreLessButton === false\n ) {\n return nothing;\n }\n\n return html` <div class=\"row-controls row-limit\">\n ${this.renderAddNewButton()} ${this.renderViewMoreLessButton()}\n ${this.renderRemoveAllButton()}\n </div>`;\n };\n\n private renderPaginationControls = () => {\n if (this.rowLimit > 0) {\n return nothing;\n }\n\n return html`\n <ix-pagination\n ?simple=${this.hasSimplePagination}\n class=\"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.updateSessionStorage({\n pageSize: this.pageSize,\n });\n this.updatePage();\n }}\n ></ix-pagination>\n `;\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 const displayRows =\n this.rowLimit > 0 && !this.isExpanded\n ? this.rows.slice(0, this.rowLimit)\n : this.rows;\n\n return html`<vaadin-grid\n class=${this.hideColumnHeaders ? 'hide-column-headers' : ''}\n .items=${columnDisplayed ? displayRows : []}\n all-rows-visible\n theme=${this.theme}\n .cellPartNameGenerator=${this.cellPartNameGenerator}\n @mouseup=${this.reorderColumnsFromTable}\n >\n ${this.renderColumns()}\n <div slot=\"empty-state\"><slot name=\"no-rows\"></slot></div>\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()} ${this.renderRowControls()}\n <div class=\"row-controls more-pagination\">\n ${this.renderViewMore()} ${this.renderPaginationControls()}\n </div>\n <slot name=\"footer\"></slot>\n </div>\n `;\n }\n}\n"]}
|
package/dist/ix-grid.min.js
CHANGED
|
@@ -10,7 +10,7 @@ import{__decorate}from"tslib";import"@digital-realty/grid";import{columnHeaderRe
|
|
|
10
10
|
#1456e0
|
|
11
11
|
);--md-filled-select-text-field-focus-active-indicator-color:var(
|
|
12
12
|
--md-filled-select-text-field-focus-trailing-icon-color
|
|
13
|
-
)}ix-select-option{--md-menu-item-selected-container-color:rgba(20, 86, 224, 0.1)}@media only screen and (max-width:600px){.pagination{justify-content:space-between}.pagination>div{gap:0}}`),IxPagination=class extends LitElement{constructor(){super(...arguments),this.recordCount=0,this.page=1,this.pageSize=10,this.pageSizes=[5,10,25,100],this.isSimple=!1}changePage(e){this.page+=e,this.updatePagination()}handlePageSizeSelection(e){var e=e.target,e=Number(e.value),t=(this.page-1)*this.pageSize+1,t=Math.ceil(t/e);this.updatePagination(t,e)}updatePagination(e=this.page,t=this.pageSize){this.dispatchEvent(new CustomEvent("updatePagination",{detail:{page:e,pageSize:t},bubbles:!0,composed:!0}))}render(){let e=1<this.page,t=this.recordCount>this.page*this.pageSize;return html`<div class="pagination ${this.isSimple?"simple":""}"><div ?hidden="${this.isSimple}"><p class="rows-per-page" data-testid="ix-pagination-rows-per-page">${copy.rowsPerPage}:</p><ix-select wide-menu menu-positioning="fixed" class="pagination__select-input" @request-selection="${this.handlePageSizeSelection}" selected-index="${this.pageSizes.indexOf(this.pageSize)}" filled>${this.pageSizes.map(e=>html`<ix-select-option class="select-option" value="${e}" ?selected="${e===this.pageSize}"><div slot="headline">${e}</div></ix-select-option>`)}</ix-select></div><div><p data-testid="ix-pagination-page-of-page">${0<this.recordCount?(this.page-1)*this.pageSize+1:0} - ${this.page*this.pageSize>this.recordCount?html`${this.recordCount}`:html`${this.page*this.pageSize}`} of ${0<this.recordCount?this.recordCount:0}</p><div class="pagination-nav"><ix-icon-button ?disabled="${!e}" @click="${()=>e&&this.changePage(-1)}" icon="chevron_left" data-testid="ix-pagination-prev"></ix-icon-button><ix-icon-button ?disabled="${!t}" @click="${()=>t&&this.changePage(1)}" icon="chevron_right" data-testid="ix-pagination-next"></ix-icon-button></div></div></div>`}};IxPagination.styles=[IxGridViewStyles,PaginationStyles],__decorate([property({type:Number})],IxPagination.prototype,"recordCount",void 0),__decorate([property({type:Number})],IxPagination.prototype,"page",void 0),__decorate([property({type:Number})],IxPagination.prototype,"pageSize",void 0),__decorate([property({type:Array})],IxPagination.prototype,"pageSizes",void 0),__decorate([property({type:Boolean,attribute:"simple"})],IxPagination.prototype,"isSimple",void 0),IxPagination=__decorate([customElement("ix-pagination")],IxPagination);class IxGrid extends LitElement{constructor(){super(...arguments),this.defaultPageSize=10,this.defaultPage=1,this.originalSearchParams=void 0,this.columnReorderingAllowed=!1,this.variantClass="",this.hasSimplePagination=!1,this.theme="no-border",this.columns=[],this.rows=[],this.defaultEmptyText="No data to display",this.sortedColumn="",this.sortDirection="",this.hideHeader=!1,this.hideFilters=!1,this.rowLimit=0,this.page=this.defaultPage,this.pageSize=this.defaultPageSize,this.pageSizes=[5,10,25,100],this.recordCount=0,this.localStorageID=void 0,this.showDownload=!0,this.isDownloading=!1,this.isLoading=!1,this.downloadMenuItems=[],this.addParamsToURL=!0,this.readParamsFromURL=!1,this.refreshDataOnColumnVisibilityChange=!0,this.filterValueChangeDebounceTime=300,this.hideColumnHeaders=!1,this.preservedQueryParamKeys=[],this.filterMaxDate=formatDate(new Date,"yyyy-MM-dd"),this.hashedTableState="",this.hideViewMoreLessButtonIcon=!0,this.showAddButton=!1,this.disableAddButton=!1,this.showViewMore=!1,this.addButtonLabel=copy.add,this.showRemoveAllButton=!1,this.disableRemoveAllButton=!1,this.removeAllButtonLabel=copy.removeAll,this.useNewDatePicker=!1,this.filters=[],this.isColumnsReordering=!1,this.isExpanded=!1,this.displayColumns=[],this.defaultFilterKeys=["sort","order","page","size"],this.initialised=!1,this.handlePopState=()=>{this.updateSearchParamsFromUri(!0),this.dispatchChangeEvent()},this.dispatchChangeEvent=()=>{var e=this.filters.reduce((e,{columnField:t,value:i})=>({...e,[t]:i}),{});this.dispatchEvent(new CustomEvent("change",{detail:{columnName:this.sortedColumn,sortOrder:this.sortDirection,page:this.page,pageSize:this.pageSize,filters:e,filtersOperators:this.filters.map(e=>({columnField:e.columnField,operator:e.operatorValue}))},bubbles:!0,composed:!0}))},this.renderColumnHeader=(e,t,i,r)=>{i=classMap({header:!0,frozen:!!e.frozenToEnd,first:0===i,last:i===r-1,border:!(null!=t&&t.frozenToEnd)});return html`<div @click="${()=>e.sortable&&this.handleSort(e.name)}" @keyDown="${()=>e.sortable&&this.handleSort(e.name)}" class="${i}"><span class="header-label">${e.header}</span> ${e.sortable?html`<ix-icon title="Sort" class="header-sort-icon">${"desc"===this.sortDirection&&this.sortedColumn===e.name?"arrow_upward":"arrow_downward"}</ix-icon>`:nothing}</div>`},this.columnRenderer=(e,t,i,r)=>{render(nothing,t);r=e.bodyRenderer(r.item,r,i);let o=r;i=!!e.maxWidth;let a="column-max-width-set";i&&(o=html`<div class="${a}" style="max-width:${e.maxWidth}">${r}</div>`),render(o,t),i&&requestAnimationFrame(()=>{let e,i=t.querySelector("."+a);if(i&&i.scrollWidth>i.clientWidth&&!i.querySelector(".custom-tooltip")&&null!=(e=i.textContent)&&e.trim()){let t=document.createElement("div");t.className="custom-tooltip",t.style.cssText=`
|
|
13
|
+
)}ix-select-option{--md-menu-item-selected-container-color:rgba(20, 86, 224, 0.1)}@media only screen and (max-width:600px){.pagination{justify-content:space-between}.pagination>div{gap:0}}`),IxPagination=class extends LitElement{constructor(){super(...arguments),this.recordCount=0,this.page=1,this.pageSize=10,this.pageSizes=[5,10,25,100],this.isSimple=!1}changePage(e){this.page+=e,this.updatePagination()}handlePageSizeSelection(e){var e=e.target,e=Number(e.value),t=(this.page-1)*this.pageSize+1,t=Math.ceil(t/e);this.updatePagination(t,e)}updatePagination(e=this.page,t=this.pageSize){this.dispatchEvent(new CustomEvent("updatePagination",{detail:{page:e,pageSize:t},bubbles:!0,composed:!0}))}render(){let e=1<this.page,t=this.recordCount>this.page*this.pageSize;return html`<div class="pagination ${this.isSimple?"simple":""}"><div ?hidden="${this.isSimple}"><p class="rows-per-page" data-testid="ix-pagination-rows-per-page">${copy.rowsPerPage}:</p><ix-select wide-menu menu-positioning="fixed" class="pagination__select-input" @request-selection="${this.handlePageSizeSelection}" selected-index="${this.pageSizes.indexOf(this.pageSize)}" filled>${this.pageSizes.map(e=>html`<ix-select-option class="select-option" value="${e}" ?selected="${e===this.pageSize}"><div slot="headline">${e}</div></ix-select-option>`)}</ix-select></div><div><p data-testid="ix-pagination-page-of-page">${0<this.recordCount?(this.page-1)*this.pageSize+1:0} - ${this.page*this.pageSize>this.recordCount?html`${this.recordCount}`:html`${this.page*this.pageSize}`} of ${0<this.recordCount?this.recordCount:0}</p><div class="pagination-nav"><ix-icon-button ?disabled="${!e}" @click="${()=>e&&this.changePage(-1)}" icon="chevron_left" data-testid="ix-pagination-prev"></ix-icon-button><ix-icon-button ?disabled="${!t}" @click="${()=>t&&this.changePage(1)}" icon="chevron_right" data-testid="ix-pagination-next"></ix-icon-button></div></div></div>`}};IxPagination.styles=[IxGridViewStyles,PaginationStyles],__decorate([property({type:Number})],IxPagination.prototype,"recordCount",void 0),__decorate([property({type:Number})],IxPagination.prototype,"page",void 0),__decorate([property({type:Number})],IxPagination.prototype,"pageSize",void 0),__decorate([property({type:Array})],IxPagination.prototype,"pageSizes",void 0),__decorate([property({type:Boolean,attribute:"simple"})],IxPagination.prototype,"isSimple",void 0),IxPagination=__decorate([customElement("ix-pagination")],IxPagination);class IxGrid extends LitElement{constructor(){super(...arguments),this.defaultPageSize=10,this.defaultPage=1,this.originalSearchParams=void 0,this.columnReorderingAllowed=!1,this.variantClass="",this.hasSimplePagination=!1,this.theme="no-border",this.columns=[],this.rows=[],this.defaultEmptyText="No data to display",this.sortedColumn="",this.sortDirection="",this.hideHeader=!1,this.hideFilters=!1,this.rowLimit=0,this.page=this.defaultPage,this.pageSize=this.defaultPageSize,this.pageSizes=[5,10,25,100],this.recordCount=0,this.localStorageID=void 0,this.showDownload=!0,this.isDownloading=!1,this.isLoading=!1,this.downloadMenuItems=[],this.addParamsToURL=!0,this.readParamsFromURL=!1,this.refreshDataOnColumnVisibilityChange=!0,this.filterValueChangeDebounceTime=300,this.hideColumnHeaders=!1,this.preservedQueryParamKeys=[],this.filterMaxDate=formatDate(new Date,"yyyy-MM-dd"),this.hashedTableState="",this.hideViewMoreLessButtonIcon=!0,this.showAddButton=!1,this.disableAddButton=!1,this.showViewMore=!1,this.addButtonLabel=copy.add,this.showRemoveAllButton=!1,this.disableRemoveAllButton=!1,this.removeAllButtonLabel=copy.removeAll,this.sessionStorageKey=void 0,this.useNewDatePicker=!1,this.filters=[],this.isColumnsReordering=!1,this.isExpanded=!1,this.displayColumns=[],this.sessionStorageData=void 0,this.defaultFilterKeys=["sort","order","page","size"],this.initialised=!1,this.handlePopState=()=>{this.updateSearchParamsFromUri(!0),this.dispatchChangeEvent()},this.handleUnload=()=>{sessionStorage.removeItem("urlPageSizeRead")},this.dispatchChangeEvent=()=>{var e=this.filters.reduce((e,{columnField:t,value:i})=>({...e,[t]:i}),{});this.dispatchEvent(new CustomEvent("change",{detail:{columnName:this.sortedColumn,sortOrder:this.sortDirection,page:this.page,pageSize:this.pageSize,filters:e,filtersOperators:this.filters.map(e=>({columnField:e.columnField,operator:e.operatorValue}))},bubbles:!0,composed:!0}))},this.renderColumnHeader=(e,t,i,r)=>{i=classMap({header:!0,frozen:!!e.frozenToEnd,first:0===i,last:i===r-1,border:!(null!=t&&t.frozenToEnd)});return html`<div @click="${()=>e.sortable&&this.handleSort(e.name)}" @keyDown="${()=>e.sortable&&this.handleSort(e.name)}" class="${i}"><span class="header-label">${e.header}</span> ${e.sortable?html`<ix-icon title="Sort" class="header-sort-icon">${"desc"===this.sortDirection&&this.sortedColumn===e.name?"arrow_upward":"arrow_downward"}</ix-icon>`:nothing}</div>`},this.columnRenderer=(e,t,i,r)=>{render(nothing,t);r=e.bodyRenderer(r.item,r,i);let o=r;i=!!e.maxWidth;let a="column-max-width-set";i&&(o=html`<div class="${a}" style="max-width:${e.maxWidth}">${r}</div>`),render(o,t),i&&requestAnimationFrame(()=>{let e,i=t.querySelector("."+a);if(i&&i.scrollWidth>i.clientWidth&&!i.querySelector(".custom-tooltip")&&null!=(e=i.textContent)&&e.trim()){let t=document.createElement("div");t.className="custom-tooltip",t.style.cssText=`
|
|
14
14
|
background-color: #092241;
|
|
15
15
|
font-size: 0.75rem;
|
|
16
16
|
color: white;
|
|
@@ -22,4 +22,4 @@ import{__decorate}from"tslib";import"@digital-realty/grid";import{columnHeaderRe
|
|
|
22
22
|
position: absolute;
|
|
23
23
|
z-index: 1000;
|
|
24
24
|
display: none;
|
|
25
|
-
`,t.textContent=i.textContent,i.addEventListener("mouseenter",()=>{t.style.display="flex";var e=i.getBoundingClientRect();t.style.left=e.left+"px",t.style.top=e.bottom+window.scrollY+4+"px",document.body.appendChild(t)}),i.addEventListener("mouseleave",()=>{t.remove()})}})},this.renderHeader=()=>html`<div class="grid-header"><slot name="header"><div class="empty"></div></slot>${this.hideFilters?nothing:html`<div class="grid-menu"><slot name="filters"><div class="empty"></div></slot><ix-grid-column-filter .columns="${this.arrangedColumns}" columnsLocalStorageKey="${ifDefined(this.columnsLocalStorageKey)}" @columnFilter="${e=>this.handleOnColumnFilter(e)}" @reorderColumns="${this.reorderColumnsFromFilter}" .columnReorderingAllowed="${this.columnReorderingAllowed}" .refreshDataOnColumnVisibilityChange="${this.refreshDataOnColumnVisibilityChange}" .requestGridUpdate="${()=>this.requestUpdate()}"></ix-grid-column-filter>${this.showDownload?html`<ix-grid-download-menu .items="${this.downloadMenuItems}" .isDownloading="${this.isDownloading}"></ix-grid-download-menu>`:nothing}<ix-grid-row-filter .columns="${this.displayColumns}" .filterValueChangeDebounceTime="${this.filterValueChangeDebounceTime}" .readParamsFromURL="${this.readParamsFromURL}" .maxDate="${this.filterMaxDate}" .useNewDatePicker="${this.useNewDatePicker}" @rowFilter="${e=>{this.filters=e.detail.filters,e.detail.resetPage&&(this.page=this.defaultPage),this.updatePage()}}"></ix-grid-row-filter></div>`}</div><div class="touch-edge"><slot name="under-header"></slot></div>`,this.renderRowControls=()=>!1===this.showAddButton&&!1===this.showRemoveAllButton&&!1===this.showViewMoreLessButton?nothing:html`<div class="row-controls row-limit">${this.renderAddNewButton()} ${this.renderViewMoreLessButton()} ${this.renderRemoveAllButton()}</div>`,this.renderPaginationControls=()=>0<this.rowLimit?nothing:html`<ix-pagination ?simple="${this.hasSimplePagination}" class="pagination" .page="${this.page}" .pageSize="${this.pageSize}" .pageSizes="${this.pageSizes}" .recordCount="${this.recordCount}" @updatePagination="${e=>{this.page=e.detail.page,this.pageSize=e.detail.pageSize,this.updatePage()}}"></ix-pagination>`}get isPersistable(){return!!this.localStorageID}get columnNames(){return this.columns.map(e=>e.name)}get columnsLocalStorageKey(){if(""===this.hashedTableState){var e=this.columns.map(({bodyRenderer:e,hidden:t,...i})=>i),i=JSON.stringify(e);let t=0;for(let e=0;e<i.length;e+=1)t=31*t+i.charCodeAt(e)>>>0;this.hashedTableState=t.toString(36)}return`ix-grid-${this.localStorageID}-${this.hashedTableState}-columns`}get arrangedColumns(){let e=[];return(e=0===(e=this.getColumnsToDisplayFromLocalStorage()).length?[...this.columns]:e).filter(e=>e).map(e=>({...e,width:e.width||void 0}))}connectedCallback(){var e;null!=(e=super.connectedCallback)&&e.call(this),window.addEventListener("popstate",this.handlePopState)}disconnectedCallback(){var e;window.removeEventListener("popstate",this.handlePopState),null!=(e=super.disconnectedCallback)&&e.call(this)}updateSearchParamsFromUri(e=!1){var t,i,r,o,a;this.readParamsFromURL&&(t=new URL(window.location.href),t=new URLSearchParams(t.search),[i,r,o,a]=this.defaultFilterKeys,i=t.get(i),r=t.get(r),o=t.get(o),a=t.get(a),i&&r&&(this.sortedColumn=i,this.sortDirection=r),o&&(this.page=parseInt(o,10)||this.defaultPage),a&&(this.pageSize=parseInt(a,10)||this.defaultPageSize),e)&&this.rebuildFiltersFromUri(t)}rebuildFiltersFromUri(e){var t,i,r=[];for([t,i]of e.entries()){var o=this.defaultFilterKeys.includes(t),[a,l]=t.split("_");!o&&a&&l&&r.push({columnField:a,operatorValue:l,value:i})}this.filters=r}update(e){!this.initialised&&0<this.columns.length&&(this.displayColumns=[...this.columns],this.checkLocalStorageUpdate(),this.initialised=!0),super.update(e)}firstUpdated(){this.updateSearchParamsFromUri(),this.removeOldLocalStorageValues()}checkLocalStorageUpdate(){if(this.isPersistable){let i=JSON.parse(localStorage.getItem(this.columnsLocalStorageKey)||"[]");if(0<i.length){let e=!1;i.length!==this.columns.length&&(e=!0);var t=this.columns.every(t=>i.some(e=>e.name===t.name))&&i.every(t=>this.columns.some(e=>e.name===t.name));(e=t?e:!0)&&this.setColumnsToLocalStorage(this.columns)}}}buildQueryFromFilters(){let t=new URLSearchParams;return this.filters.forEach(e=>{t.append(e.columnField+"_"+e.operatorValue,e.value)}),Object.fromEntries(t)}rebuildQueryFromMatchingQuerystringParams(){let i=new URLSearchParams;var e;return 0===this.preservedQueryParamKeys.length?{}:(e=new URL(window.location.href),new URLSearchParams(e.search).forEach((e,t)=>{this.preservedQueryParamKeys.includes(t)&&i.append(t,e)}),Object.fromEntries(i))}getColumnsToDisplayFromLocalStorage(){let e=[];var t;return e=this.isPersistable&&0<(t=JSON.parse(localStorage.getItem(this.columnsLocalStorageKey)||"[]")).length?this.mapColumnsWithPersistedSettings(t):e}mapColumnsWithPersistedSettings(o){let i=new Map(o.map(e=>[e.name,e]));var e=this.columns.map(e=>{var t=i.get(e.name);return t?{...e,hidden:t.hidden,frozenToEnd:t.frozenToEnd,width:t.width||void 0}:{...e}});return e.sort((t,i)=>{var e=o.findIndex(e=>e.name===t.name),r=o.findIndex(e=>e.name===i.name);return-1===e&&-1===r?0:-1===e?1:-1===r?-1:e-r}),e}removeOldLocalStorageValues(){var t=this.findMatchingLocalStorageKeys(`ix-grid-${this.localStorageID}-`,"-columns",this.hashedTableState);for(let e=0;e<=t.length;e+=1)localStorage.removeItem(t[e])}findMatchingLocalStorageKeys(t,i,e){var r=[],o=t+e+i;for(let e=0;e<localStorage.length;e+=1){var a=localStorage.key(e);a&&a.startsWith(t)&&a.endsWith(i)&&a!==o&&r.push(a)}return r}async updatePage(e=!0){var t,i;this.dispatchChangeEvent(),this.addParamsToURL&&e&&(e={sort:this.sortedColumn,order:this.sortDirection,page:this.page.toString(),size:this.pageSize.toString(),...this.buildQueryFromFilters(),...this.rebuildQueryFromMatchingQuerystringParams()},t=new URL(window.location.href),e=new URLSearchParams(e),this.originalSearchParams||this.saveOriginalSearchParams(e),i=new URLSearchParams([...null!=(i=this.originalSearchParams)?i:[],...e]),t.search=i.toString(),window.history.pushState(null,"",t.toString()))}saveOriginalSearchParams(e){var t=new URL(window.location.href);let i=new URLSearchParams(t.search);this.filters.forEach(e=>{i.delete(e.columnField+"_"+e.operatorValue)}),e.forEach((e,t)=>{i.delete(t)}),this.originalSearchParams=i}handleSort(e=""){this.sortedColumn!==e?this.sortDirection="asc":this.sortDirection="asc"===this.sortDirection?"desc":"asc",this.sortedColumn=e,this.updatePage()}setColumnsToLocalStorage(e){this.isPersistable&&localStorage.setItem(this.columnsLocalStorageKey,JSON.stringify(e))}async reorderColumnsFromTable(){var e=[...this.arrangedColumns],t=e.filter(e=>!0!==e.hidden),r=e.filter(e=>!0===e.hidden),e=e.filter(e=>!0===e.frozenToEnd);let o=[...t.filter(e=>!0!==(null==e?void 0:e.frozenToEnd)),...r.filter(e=>!0!==(null==e?void 0:e.frozenToEnd)),...e];t=Array.from((null==(t=null==(t=this.grid)?void 0:t.shadowRoot)?void 0:t.querySelectorAll("th"))||[]);if(t.length){let i=t.map((e,t)=>({id:t,flexPosition:Number(e.style.order)})).sort((e,t)=>e.flexPosition-t.flexPosition).map(e=>e.id);t=[];i.every((e,t)=>0===t||e>i[t-1])||(t=i.map(e=>o[e]),this.displayColumns=[...t.filter(e=>!0!==e.hidden&&!0!==(null==e?void 0:e.frozenToEnd)),...r.filter(e=>!0!==(null==e?void 0:e.frozenToEnd)),...e],this.isColumnsReordering=!0,await this.updateComplete,this.isColumnsReordering=!1,this.setColumnsToLocalStorage(this.displayColumns))}}async reorderColumnsFromFilter(e){this.displayColumns=[...e.detail.reorderedColumns],this.setColumnsToLocalStorage([...this.displayColumns]),this.isColumnsReordering=!0,await this.updateComplete,this.isColumnsReordering=!1}handleOnColumnFilter(e){e.detail.columns.forEach((e,t)=>{this.displayColumns[t]&&(this.displayColumns[t].hidden=null==e?void 0:e.hidden)}),this.displayColumns=[...this.displayColumns],this.updatePage(!1)}cellPartNameGenerator(e,t){let i="";return t.item.disabled&&(i+=" ix-disabled-cell"),i}renderAddNewButton(){return this.showAddButton?html`<ix-button name="add-new-button" appearance="text" has-icon ?disabled="${this.disableAddButton}" @click="${()=>this.onAddButtonClick()}"><ix-icon slot="icon">add</ix-icon><span>${this.addButtonLabel}</span></ix-button>`:nothing}renderViewMore(){return this.showViewMore?html`<div class="view-more"><slot name="viewMore"></slot></div>`:nothing}get showViewMoreLessButton(){return!this.showViewMore&&0<this.rowLimit&&this.rows.length>this.rowLimit}renderViewMoreLessButton(){return this.showViewMoreLessButton?html`<ix-button appearance="text" @click="${()=>{this.isExpanded=!this.isExpanded}}" has-icon>${this.isExpanded?copy.viewLess:copy.viewMore} ${this.hideViewMoreLessButtonIcon?nothing:html`<ix-icon slot="icon">${this.isExpanded?"remove":"add"}</ix-icon>`}</ix-button>`:nothing}renderRemoveAllButton(){return this.showRemoveAllButton?html`<ix-button class="remove-all-button" name="remove-all-button" appearance="text" ?disabled="${this.disableRemoveAllButton}" @click="${()=>this.onRemoveAllButtonClick()}"><span>${this.removeAllButtonLabel}</span></ix-button>`:nothing}renderColumns(){let t=[...this.arrangedColumns];return 0<t.length?html`${t.map((r,e)=>!0===r.hidden?nothing:html`<vaadin-grid-column ${columnHeaderRenderer(()=>this.renderColumnHeader(r,t[e+1],e,t.length),this.sortDirection)} .renderer="${(e,t,i)=>this.columnRenderer(r,e,t,i)}" resizable width="${ifDefined(r.width)}" min-width="${ifDefined(r.minWidth)}" .responsive="${r.responsive}" ?hidden="${r.hidden}" ?frozen-to-end="${r.frozenToEnd}" path="${r.name}" ?auto-width="${r.autoWidth}" flex-grow="${ifDefined(r.flexGrow)}"></vaadin-grid-column>`)}`:html`<vaadin-grid-column></vaadin-grid-column>`}renderLoading(){return html`<div class="progress-container" style="display:${this.isLoading?"":"none"}"><ix-progress .indeterminate="${!0}"></ix-progress></div>`}renderGrid(){var e,t;return this.isColumnsReordering?nothing:(e=this.displayColumns.find(e=>!0!==e.hidden),t=0<this.rowLimit&&!this.isExpanded?this.rows.slice(0,this.rowLimit):this.rows,html`<vaadin-grid class="${this.hideColumnHeaders?"hide-column-headers":""}" .items="${e?t:[]}" all-rows-visible theme="${this.theme}" .cellPartNameGenerator="${this.cellPartNameGenerator}" @mouseup="${this.reorderColumnsFromTable}">${this.renderColumns()}<div slot="empty-state"><slot name="no-rows"></slot></div></vaadin-grid>`)}render(){return html`<div class="${`grid-container ${this.isColumnsReordering?"columns-reordering":""} `+this.variantClass}">${this.hideHeader?nothing:this.renderHeader()} ${this.renderLoading()} ${this.renderGrid()} ${this.renderRowControls()}<div class="row-controls more-pagination">${this.renderViewMore()} ${this.renderPaginationControls()}</div><slot name="footer"></slot></div>`}}IxGrid.styles=[IxGridViewStyles],__decorate([query("vaadin-grid")],IxGrid.prototype,"grid",void 0),__decorate([property({type:Boolean,attribute:"column-reordering-allowed"})],IxGrid.prototype,"columnReorderingAllowed",void 0),__decorate([property({type:String})],IxGrid.prototype,"variantClass",void 0),__decorate([property({type:Boolean,attribute:"simple-pagination"})],IxGrid.prototype,"hasSimplePagination",void 0),__decorate([property({type:String})],IxGrid.prototype,"theme",void 0),__decorate([property({type:Array})],IxGrid.prototype,"columns",void 0),__decorate([property({type:Array})],IxGrid.prototype,"rows",void 0),__decorate([property({type:String})],IxGrid.prototype,"defaultEmptyText",void 0),__decorate([property({type:String})],IxGrid.prototype,"sortedColumn",void 0),__decorate([property({type:String})],IxGrid.prototype,"sortDirection",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"hideHeader",void 0),__decorate([property({type:Boolean,attribute:"hide-filters"})],IxGrid.prototype,"hideFilters",void 0),__decorate([property({type:Number})],IxGrid.prototype,"rowLimit",void 0),__decorate([property({type:Number})],IxGrid.prototype,"page",void 0),__decorate([property({type:Number})],IxGrid.prototype,"pageSize",void 0),__decorate([property({type:Array})],IxGrid.prototype,"pageSizes",void 0),__decorate([property({type:Number})],IxGrid.prototype,"recordCount",void 0),__decorate([property({type:String})],IxGrid.prototype,"localStorageID",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"showDownload",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"isDownloading",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"isLoading",void 0),__decorate([property({type:Array})],IxGrid.prototype,"downloadMenuItems",void 0),__decorate([property({type:Boolean,attribute:"add-params-to-url"})],IxGrid.prototype,"addParamsToURL",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"readParamsFromURL",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"refreshDataOnColumnVisibilityChange",void 0),__decorate([property({type:Number})],IxGrid.prototype,"filterValueChangeDebounceTime",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"hideColumnHeaders",void 0),__decorate([property({type:Array})],IxGrid.prototype,"preservedQueryParamKeys",void 0),__decorate([property({type:String})],IxGrid.prototype,"filterMaxDate",void 0),__decorate([property({type:String})],IxGrid.prototype,"hashedTableState",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"hideViewMoreLessButtonIcon",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"showAddButton",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"disableAddButton",void 0),__decorate([property({type:Boolean,attribute:"show-view-more"})],IxGrid.prototype,"showViewMore",void 0),__decorate([property({type:String})],IxGrid.prototype,"addButtonLabel",void 0),__decorate([property({type:Function})],IxGrid.prototype,"onAddButtonClick",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"showRemoveAllButton",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"disableRemoveAllButton",void 0),__decorate([property({type:String})],IxGrid.prototype,"removeAllButtonLabel",void 0),__decorate([property({type:Function})],IxGrid.prototype,"onRemoveAllButtonClick",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"useNewDatePicker",void 0),__decorate([state()],IxGrid.prototype,"filters",void 0),__decorate([state()],IxGrid.prototype,"isColumnsReordering",void 0),__decorate([state()],IxGrid.prototype,"isExpanded",void 0),__decorate([state()],IxGrid.prototype,"displayColumns",void 0),window.customElements.define("ix-grid",IxGrid);
|
|
25
|
+
`,t.textContent=i.textContent,i.addEventListener("mouseenter",()=>{t.style.display="flex";var e=i.getBoundingClientRect();t.style.left=e.left+"px",t.style.top=e.bottom+window.scrollY+4+"px",document.body.appendChild(t)}),i.addEventListener("mouseleave",()=>{t.remove()})}})},this.renderHeader=()=>html`<div class="grid-header"><slot name="header"><div class="empty"></div></slot>${this.hideFilters?nothing:html`<div class="grid-menu"><slot name="filters"><div class="empty"></div></slot><ix-grid-column-filter .columns="${this.arrangedColumns}" columnsLocalStorageKey="${ifDefined(this.columnsLocalStorageKey)}" @columnFilter="${e=>this.handleOnColumnFilter(e)}" @reorderColumns="${this.reorderColumnsFromFilter}" .columnReorderingAllowed="${this.columnReorderingAllowed}" .refreshDataOnColumnVisibilityChange="${this.refreshDataOnColumnVisibilityChange}" .requestGridUpdate="${()=>this.requestUpdate()}"></ix-grid-column-filter>${this.showDownload?html`<ix-grid-download-menu .items="${this.downloadMenuItems}" .isDownloading="${this.isDownloading}"></ix-grid-download-menu>`:nothing}<ix-grid-row-filter .columns="${this.displayColumns}" .filterValueChangeDebounceTime="${this.filterValueChangeDebounceTime}" .readParamsFromURL="${this.readParamsFromURL}" .maxDate="${this.filterMaxDate}" .useNewDatePicker="${this.useNewDatePicker}" @rowFilter="${e=>{this.filters=e.detail.filters,e.detail.resetPage&&(this.page=this.defaultPage),this.updatePage()}}"></ix-grid-row-filter></div>`}</div><div class="touch-edge"><slot name="under-header"></slot></div>`,this.renderRowControls=()=>!1===this.showAddButton&&!1===this.showRemoveAllButton&&!1===this.showViewMoreLessButton?nothing:html`<div class="row-controls row-limit">${this.renderAddNewButton()} ${this.renderViewMoreLessButton()} ${this.renderRemoveAllButton()}</div>`,this.renderPaginationControls=()=>0<this.rowLimit?nothing:html`<ix-pagination ?simple="${this.hasSimplePagination}" class="pagination" .page="${this.page}" .pageSize="${this.pageSize}" .pageSizes="${this.pageSizes}" .recordCount="${this.recordCount}" @updatePagination="${e=>{this.page=e.detail.page,this.pageSize=e.detail.pageSize,this.updateSessionStorage({pageSize:this.pageSize}),this.updatePage()}}"></ix-pagination>`}get isPersistable(){return!!this.localStorageID}get columnNames(){return this.columns.map(e=>e.name)}get columnsLocalStorageKey(){if(""===this.hashedTableState){var e=this.columns.map(({bodyRenderer:e,hidden:t,...i})=>i),i=JSON.stringify(e);let t=0;for(let e=0;e<i.length;e+=1)t=31*t+i.charCodeAt(e)>>>0;this.hashedTableState=t.toString(36)}return`ix-grid-${this.localStorageID}-${this.hashedTableState}-columns`}get arrangedColumns(){let e=[];return(e=0===(e=this.getColumnsToDisplayFromLocalStorage()).length?[...this.columns]:e).filter(e=>e).map(e=>({...e,width:e.width||void 0}))}connectedCallback(){var e;null!=(e=super.connectedCallback)&&e.call(this),window.addEventListener("popstate",this.handlePopState),window.addEventListener("beforeunload",this.handleUnload)}disconnectedCallback(){var e;window.removeEventListener("popstate",this.handlePopState),window.removeEventListener("beforeunload",this.handleUnload),null!=(e=super.disconnectedCallback)&&e.call(this)}updateSearchParamsFromUri(e=!1){var t,i,r,o,a;0!==this.grid.getBoundingClientRect().width&&this.readParamsFromURL&&(t=new URL(window.location.href),t=new URLSearchParams(t.search),[i,r,o,a]=this.defaultFilterKeys,i=t.get(i),r=t.get(r),o=t.get(o),a=t.get(a),i&&r&&(this.sortedColumn=i,this.sortDirection=r),o&&(this.page=parseInt(o,10)||this.defaultPage),a&&(!this.getSessionStorageData()||!sessionStorage.getItem("urlPageSizeRead")&&0<this.grid.getBoundingClientRect().width)&&(sessionStorage.setItem("urlPageSizeRead",(!0).toString()),this.pageSize=parseInt(a,10)||this.defaultPageSize,this.updateSessionStorage({pageSize:this.pageSize})),e)&&this.rebuildFiltersFromUri(t)}rebuildFiltersFromUri(e){var t,i,r=[];for([t,i]of e.entries()){var o=this.defaultFilterKeys.includes(t),[a,n]=t.split("_");!o&&a&&n&&r.push({columnField:a,operatorValue:n,value:i})}this.filters=r}update(e){var t;!this.initialised&&0<this.columns.length&&(this.displayColumns=[...this.columns],this.checkLocalStorageUpdate(),this.initialised=!0),e.has("sessionStorageData")&&this.sessionStorageData&&(t=this.sessionStorageData.pageSize||this.defaultPageSize,this.pageSize!==t)&&(this.pageSize=t),super.update(e)}firstUpdated(){this.updateSearchParamsFromUri(),this.removeOldLocalStorageValues(),this.sessionStorageData=this.getSessionStorageData()}getSessionStorageData(){if(this.sessionStorageKey){var e=sessionStorage.getItem("grid-"+this.sessionStorageKey);if(e)return JSON.parse(e)}}updateSessionStorage(e){var t=this.getSessionStorageData()||{};this.sessionStorageKey&&e&&(t={...t,...e},sessionStorage.setItem("grid-"+this.sessionStorageKey,JSON.stringify(t)),this.sessionStorageData=t)}checkLocalStorageUpdate(){if(this.isPersistable){let i=JSON.parse(localStorage.getItem(this.columnsLocalStorageKey)||"[]");if(0<i.length){let e=!1;i.length!==this.columns.length&&(e=!0);var t=this.columns.every(t=>i.some(e=>e.name===t.name))&&i.every(t=>this.columns.some(e=>e.name===t.name));(e=t?e:!0)&&this.setColumnsToLocalStorage(this.columns)}}}buildQueryFromFilters(){let t=new URLSearchParams;return this.filters.forEach(e=>{t.append(e.columnField+"_"+e.operatorValue,e.value)}),Object.fromEntries(t)}rebuildQueryFromMatchingQuerystringParams(){let i=new URLSearchParams;var e;return 0===this.preservedQueryParamKeys.length?{}:(e=new URL(window.location.href),new URLSearchParams(e.search).forEach((e,t)=>{this.preservedQueryParamKeys.includes(t)&&i.append(t,e)}),Object.fromEntries(i))}getColumnsToDisplayFromLocalStorage(){let e=[];var t;return e=this.isPersistable&&0<(t=JSON.parse(localStorage.getItem(this.columnsLocalStorageKey)||"[]")).length?this.mapColumnsWithPersistedSettings(t):e}mapColumnsWithPersistedSettings(o){let i=new Map(o.map(e=>[e.name,e]));var e=this.columns.map(e=>{var t=i.get(e.name);return t?{...e,hidden:t.hidden,frozenToEnd:t.frozenToEnd,width:t.width||void 0}:{...e}});return e.sort((t,i)=>{var e=o.findIndex(e=>e.name===t.name),r=o.findIndex(e=>e.name===i.name);return-1===e&&-1===r?0:-1===e?1:-1===r?-1:e-r}),e}removeOldLocalStorageValues(){var t=this.findMatchingLocalStorageKeys(`ix-grid-${this.localStorageID}-`,"-columns",this.hashedTableState);for(let e=0;e<=t.length;e+=1)localStorage.removeItem(t[e])}findMatchingLocalStorageKeys(t,i,e){var r=[],o=t+e+i;for(let e=0;e<localStorage.length;e+=1){var a=localStorage.key(e);a&&a.startsWith(t)&&a.endsWith(i)&&a!==o&&r.push(a)}return r}async updatePage(e=!0){var t,i;this.dispatchChangeEvent(),this.addParamsToURL&&e&&(e={sort:this.sortedColumn,order:this.sortDirection,page:this.page.toString(),size:this.pageSize.toString(),...this.buildQueryFromFilters(),...this.rebuildQueryFromMatchingQuerystringParams()},t=new URL(window.location.href),e=new URLSearchParams(e),this.originalSearchParams||this.saveOriginalSearchParams(e),i=new URLSearchParams([...null!=(i=this.originalSearchParams)?i:[],...e]),t.search=i.toString(),window.history.pushState(null,"",t.toString()))}saveOriginalSearchParams(e){var t=new URL(window.location.href);let i=new URLSearchParams(t.search);this.filters.forEach(e=>{i.delete(e.columnField+"_"+e.operatorValue)}),e.forEach((e,t)=>{i.delete(t)}),this.originalSearchParams=i}handleSort(e=""){this.sortedColumn!==e?this.sortDirection="asc":this.sortDirection="asc"===this.sortDirection?"desc":"asc",this.sortedColumn=e,this.updatePage()}setColumnsToLocalStorage(e){this.isPersistable&&localStorage.setItem(this.columnsLocalStorageKey,JSON.stringify(e))}async reorderColumnsFromTable(){var e=[...this.arrangedColumns],t=e.filter(e=>!0!==e.hidden),r=e.filter(e=>!0===e.hidden),e=e.filter(e=>!0===e.frozenToEnd);let o=[...t.filter(e=>!0!==(null==e?void 0:e.frozenToEnd)),...r.filter(e=>!0!==(null==e?void 0:e.frozenToEnd)),...e];t=Array.from((null==(t=null==(t=this.grid)?void 0:t.shadowRoot)?void 0:t.querySelectorAll("th"))||[]);if(t.length){let i=t.map((e,t)=>({id:t,flexPosition:Number(e.style.order)})).sort((e,t)=>e.flexPosition-t.flexPosition).map(e=>e.id);t=[];i.every((e,t)=>0===t||e>i[t-1])||(t=i.map(e=>o[e]),this.displayColumns=[...t.filter(e=>!0!==e.hidden&&!0!==(null==e?void 0:e.frozenToEnd)),...r.filter(e=>!0!==(null==e?void 0:e.frozenToEnd)),...e],this.isColumnsReordering=!0,await this.updateComplete,this.isColumnsReordering=!1,this.setColumnsToLocalStorage(this.displayColumns))}}async reorderColumnsFromFilter(e){this.displayColumns=[...e.detail.reorderedColumns],this.setColumnsToLocalStorage([...this.displayColumns]),this.isColumnsReordering=!0,await this.updateComplete,this.isColumnsReordering=!1}handleOnColumnFilter(e){e.detail.columns.forEach((e,t)=>{this.displayColumns[t]&&(this.displayColumns[t].hidden=null==e?void 0:e.hidden)}),this.displayColumns=[...this.displayColumns],this.updatePage(!1)}cellPartNameGenerator(e,t){let i="";return t.item.disabled&&(i+=" ix-disabled-cell"),i}renderAddNewButton(){return this.showAddButton?html`<ix-button name="add-new-button" appearance="text" has-icon ?disabled="${this.disableAddButton}" @click="${()=>this.onAddButtonClick()}"><ix-icon slot="icon">add</ix-icon><span>${this.addButtonLabel}</span></ix-button>`:nothing}renderViewMore(){return this.showViewMore?html`<div class="view-more"><slot name="viewMore"></slot></div>`:nothing}get showViewMoreLessButton(){return!this.showViewMore&&0<this.rowLimit&&this.rows.length>this.rowLimit}renderViewMoreLessButton(){return this.showViewMoreLessButton?html`<ix-button appearance="text" @click="${()=>{this.isExpanded=!this.isExpanded}}" has-icon>${this.isExpanded?copy.viewLess:copy.viewMore} ${this.hideViewMoreLessButtonIcon?nothing:html`<ix-icon slot="icon">${this.isExpanded?"remove":"add"}</ix-icon>`}</ix-button>`:nothing}renderRemoveAllButton(){return this.showRemoveAllButton?html`<ix-button class="remove-all-button" name="remove-all-button" appearance="text" ?disabled="${this.disableRemoveAllButton}" @click="${()=>this.onRemoveAllButtonClick()}"><span>${this.removeAllButtonLabel}</span></ix-button>`:nothing}renderColumns(){let t=[...this.arrangedColumns];return 0<t.length?html`${t.map((r,e)=>!0===r.hidden?nothing:html`<vaadin-grid-column ${columnHeaderRenderer(()=>this.renderColumnHeader(r,t[e+1],e,t.length),this.sortDirection)} .renderer="${(e,t,i)=>this.columnRenderer(r,e,t,i)}" resizable width="${ifDefined(r.width)}" min-width="${ifDefined(r.minWidth)}" .responsive="${r.responsive}" ?hidden="${r.hidden}" ?frozen-to-end="${r.frozenToEnd}" path="${r.name}" ?auto-width="${r.autoWidth}" flex-grow="${ifDefined(r.flexGrow)}"></vaadin-grid-column>`)}`:html`<vaadin-grid-column></vaadin-grid-column>`}renderLoading(){return html`<div class="progress-container" style="display:${this.isLoading?"":"none"}"><ix-progress .indeterminate="${!0}"></ix-progress></div>`}renderGrid(){var e,t;return this.isColumnsReordering?nothing:(e=this.displayColumns.find(e=>!0!==e.hidden),t=0<this.rowLimit&&!this.isExpanded?this.rows.slice(0,this.rowLimit):this.rows,html`<vaadin-grid class="${this.hideColumnHeaders?"hide-column-headers":""}" .items="${e?t:[]}" all-rows-visible theme="${this.theme}" .cellPartNameGenerator="${this.cellPartNameGenerator}" @mouseup="${this.reorderColumnsFromTable}">${this.renderColumns()}<div slot="empty-state"><slot name="no-rows"></slot></div></vaadin-grid>`)}render(){return html`<div class="${`grid-container ${this.isColumnsReordering?"columns-reordering":""} `+this.variantClass}">${this.hideHeader?nothing:this.renderHeader()} ${this.renderLoading()} ${this.renderGrid()} ${this.renderRowControls()}<div class="row-controls more-pagination">${this.renderViewMore()} ${this.renderPaginationControls()}</div><slot name="footer"></slot></div>`}}IxGrid.styles=[IxGridViewStyles],__decorate([query("vaadin-grid")],IxGrid.prototype,"grid",void 0),__decorate([property({type:Boolean,attribute:"column-reordering-allowed"})],IxGrid.prototype,"columnReorderingAllowed",void 0),__decorate([property({type:String})],IxGrid.prototype,"variantClass",void 0),__decorate([property({type:Boolean,attribute:"simple-pagination"})],IxGrid.prototype,"hasSimplePagination",void 0),__decorate([property({type:String})],IxGrid.prototype,"theme",void 0),__decorate([property({type:Array})],IxGrid.prototype,"columns",void 0),__decorate([property({type:Array})],IxGrid.prototype,"rows",void 0),__decorate([property({type:String})],IxGrid.prototype,"defaultEmptyText",void 0),__decorate([property({type:String})],IxGrid.prototype,"sortedColumn",void 0),__decorate([property({type:String})],IxGrid.prototype,"sortDirection",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"hideHeader",void 0),__decorate([property({type:Boolean,attribute:"hide-filters"})],IxGrid.prototype,"hideFilters",void 0),__decorate([property({type:Number})],IxGrid.prototype,"rowLimit",void 0),__decorate([property({type:Number})],IxGrid.prototype,"page",void 0),__decorate([property({type:Number})],IxGrid.prototype,"pageSize",void 0),__decorate([property({type:Array})],IxGrid.prototype,"pageSizes",void 0),__decorate([property({type:Number})],IxGrid.prototype,"recordCount",void 0),__decorate([property({type:String})],IxGrid.prototype,"localStorageID",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"showDownload",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"isDownloading",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"isLoading",void 0),__decorate([property({type:Array})],IxGrid.prototype,"downloadMenuItems",void 0),__decorate([property({type:Boolean,attribute:"add-params-to-url"})],IxGrid.prototype,"addParamsToURL",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"readParamsFromURL",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"refreshDataOnColumnVisibilityChange",void 0),__decorate([property({type:Number})],IxGrid.prototype,"filterValueChangeDebounceTime",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"hideColumnHeaders",void 0),__decorate([property({type:Array})],IxGrid.prototype,"preservedQueryParamKeys",void 0),__decorate([property({type:String})],IxGrid.prototype,"filterMaxDate",void 0),__decorate([property({type:String})],IxGrid.prototype,"hashedTableState",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"hideViewMoreLessButtonIcon",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"showAddButton",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"disableAddButton",void 0),__decorate([property({type:Boolean,attribute:"show-view-more"})],IxGrid.prototype,"showViewMore",void 0),__decorate([property({type:String})],IxGrid.prototype,"addButtonLabel",void 0),__decorate([property({type:Function})],IxGrid.prototype,"onAddButtonClick",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"showRemoveAllButton",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"disableRemoveAllButton",void 0),__decorate([property({type:String})],IxGrid.prototype,"removeAllButtonLabel",void 0),__decorate([property({type:Function})],IxGrid.prototype,"onRemoveAllButtonClick",void 0),__decorate([property({type:String,attribute:"session-storage-key"})],IxGrid.prototype,"sessionStorageKey",void 0),__decorate([property({type:Boolean})],IxGrid.prototype,"useNewDatePicker",void 0),__decorate([state()],IxGrid.prototype,"filters",void 0),__decorate([state()],IxGrid.prototype,"isColumnsReordering",void 0),__decorate([state()],IxGrid.prototype,"isExpanded",void 0),__decorate([state()],IxGrid.prototype,"displayColumns",void 0),__decorate([state()],IxGrid.prototype,"sessionStorageData",void 0),window.customElements.define("ix-grid",IxGrid);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable no-restricted-globals */
|
|
2
|
-
import { expect, fixture, oneEvent } from '@open-wc/testing';
|
|
2
|
+
import { elementUpdated, expect, fixture, oneEvent } from '@open-wc/testing';
|
|
3
3
|
import { html } from 'lit';
|
|
4
4
|
import { IxGridRowFilter } from '../components/IxGridRowFilter.js';
|
|
5
5
|
import '../ix-grid-no-rows.js';
|
|
@@ -38,7 +38,11 @@ const columns = [
|
|
|
38
38
|
filterOperators: ['equals', 'contains'],
|
|
39
39
|
},
|
|
40
40
|
];
|
|
41
|
+
const sessionStorageKey = 'test-session-key';
|
|
41
42
|
describe('IxGrid', () => {
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
sessionStorage.clear();
|
|
45
|
+
});
|
|
42
46
|
it('renders a grid', async () => {
|
|
43
47
|
const el = await fixture(html `<ix-grid></ix-grid>`);
|
|
44
48
|
expect(el).to.not.be.null;
|
|
@@ -75,6 +79,7 @@ describe('IxGrid', () => {
|
|
|
75
79
|
it('resets pagination upon filter change', async () => {
|
|
76
80
|
var _a, _b;
|
|
77
81
|
const el = await fixture(html `<ix-grid
|
|
82
|
+
session-storage-key=${sessionStorageKey}
|
|
78
83
|
.columns=${columns}
|
|
79
84
|
.rows=${rows}
|
|
80
85
|
></ix-grid>`);
|
|
@@ -103,7 +108,9 @@ describe('IxGrid', () => {
|
|
|
103
108
|
.columns=${columns}
|
|
104
109
|
.rows=${rows}
|
|
105
110
|
.readParamsFromURL=${true}
|
|
111
|
+
session-storage-key=${sessionStorageKey}
|
|
106
112
|
></ix-grid>`);
|
|
113
|
+
sessionStorage.removeItem(`urlPageSizeRead`);
|
|
107
114
|
const url = '?sort=lastName&order=asc&page=2&size=5';
|
|
108
115
|
history.pushState(null, '', `${location.pathname}${url}`);
|
|
109
116
|
el.firstUpdated();
|
|
@@ -112,6 +119,34 @@ describe('IxGrid', () => {
|
|
|
112
119
|
expect(el.sortedColumn).to.be.eq('lastName');
|
|
113
120
|
expect(el.sortDirection).to.be.eq('asc');
|
|
114
121
|
});
|
|
122
|
+
it('sessionStorage sets the URL', async () => {
|
|
123
|
+
sessionStorage.setItem(`grid-${sessionStorageKey}`, JSON.stringify({
|
|
124
|
+
pageSize: 25,
|
|
125
|
+
}));
|
|
126
|
+
const el = await fixture(html `<ix-grid
|
|
127
|
+
.columns=${columns}
|
|
128
|
+
.rows=${rows}
|
|
129
|
+
session-storage-key=${sessionStorageKey}
|
|
130
|
+
></ix-grid>`);
|
|
131
|
+
await elementUpdated(el);
|
|
132
|
+
expect(location.href).to.contain('size=25');
|
|
133
|
+
});
|
|
134
|
+
it('page and page size from URL sets sessionStorage', async () => {
|
|
135
|
+
sessionStorage.setItem(`grid-${sessionStorageKey}`, JSON.stringify({
|
|
136
|
+
pageSize: 10,
|
|
137
|
+
}));
|
|
138
|
+
const el = await fixture(html `<ix-grid
|
|
139
|
+
.columns=${columns}
|
|
140
|
+
.rows=${rows}
|
|
141
|
+
.readParamsFromURL=${true}
|
|
142
|
+
session-storage-key=${sessionStorageKey}
|
|
143
|
+
></ix-grid>`);
|
|
144
|
+
const url = '?sort=lastName&order=asc&page=2&size=25';
|
|
145
|
+
history.pushState(null, '', `${location.pathname}${url}`);
|
|
146
|
+
await elementUpdated(el);
|
|
147
|
+
const sessionData = JSON.parse(sessionStorage.getItem(`grid-${sessionStorageKey}`) || '{}');
|
|
148
|
+
expect(sessionData.pageSize).to.be.eq(25);
|
|
149
|
+
});
|
|
115
150
|
it('should set sort, order, page, page size and filters in the URL when addParamsToURL is set to true', async () => {
|
|
116
151
|
var _a, _b;
|
|
117
152
|
const columnsWithFilters = [
|
|
@@ -142,6 +177,7 @@ describe('IxGrid', () => {
|
|
|
142
177
|
const el = await fixture(html `<ix-grid
|
|
143
178
|
.columns=${columnsWithFilters}
|
|
144
179
|
.addParamsToURL=${true}
|
|
180
|
+
session-storage-key=${sessionStorageKey}
|
|
145
181
|
></ix-grid>`);
|
|
146
182
|
const rowFilter = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('ix-grid-row-filter');
|
|
147
183
|
rowFilter.dispatchEvent(new CustomEvent('rowFilter', {
|
|
@@ -193,6 +229,7 @@ describe('IxGrid', () => {
|
|
|
193
229
|
.rows=${[]}
|
|
194
230
|
.addParamsToURL=${true}
|
|
195
231
|
.preservedQueryParamKeys=${['userId', 'token']}
|
|
232
|
+
session-storage-key=${sessionStorageKey}
|
|
196
233
|
></ix-grid>
|
|
197
234
|
`);
|
|
198
235
|
await el.updateComplete;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ix-grid.test.js","sourceRoot":"","sources":["../../src/test/ix-grid.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { expect, fixture, oneEvent } from '@open-wc/testing';\nimport { html } from 'lit';\nimport { IxGrid } from '../IxGrid.js';\nimport { IxGridRowFilter } from '../components/IxGridRowFilter.js';\nimport '../ix-grid-no-rows.js';\nimport '../ix-grid.js';\n\nconst rows = [\n {\n name: 'one',\n },\n {\n name: 'two',\n },\n {\n name: 'three',\n },\n];\n\nconst columns = [\n {\n name: 'one',\n header: 'one',\n bodyRenderer: row => html` <span>${row.name}</span>`,\n filterable: true,\n filterOperators: ['equals'],\n },\n {\n name: 'two',\n header: 'one',\n bodyRenderer: row => html` <span>${row.name}</span>`,\n filterable: true,\n filterOperators: ['equals', 'contains'],\n },\n {\n name: 'three',\n header: 'one',\n bodyRenderer: row => html` <span>${row.name}</span>`,\n filterable: true,\n filterOperators: ['equals', 'contains'],\n },\n];\n\ndescribe('IxGrid', () => {\n it('renders a grid', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid></ix-grid>`);\n\n expect(el).to.not.be.null;\n });\n\n it('renders the correct number of rows', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n ></ix-grid>`);\n\n expect(rows.length).to.equal(3);\n\n expect(el).to.not.be.null;\n });\n\n it('renders no rows component state', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${[]}\n ><ix-grid-no-rows slot=\"no-rows\"></ix-grid-no-rows\n ></ix-grid>`);\n\n const noRows = el.shadowRoot?.querySelector('slot[name=\"no-rows\"]');\n expect(noRows).to.not.be.null;\n });\n\n it('renders an ix-grid-row-filter', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n .filterValueChangeDebounceTime=${1000}\n ></ix-grid>`);\n\n const rowFilter = el.shadowRoot?.querySelector('ix-grid-row-filter');\n expect(rowFilter).to.be.instanceOf(IxGridRowFilter);\n expect((<IxGridRowFilter>rowFilter).filterValueChangeDebounceTime).to.equal(\n 1000\n );\n });\n\n it('resets pagination upon filter change', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n ></ix-grid>`);\n\n const pagination = el.shadowRoot?.querySelector('ix-pagination');\n pagination!.dispatchEvent(\n new CustomEvent('updatePagination', {\n detail: {\n page: 2,\n pageSize: 10,\n },\n bubbles: true,\n composed: true,\n })\n );\n expect(el.page).to.equal(2);\n\n const rowFilter = el.shadowRoot?.querySelector('ix-grid-row-filter');\n rowFilter!.dispatchEvent(\n new CustomEvent('rowFilter', {\n detail: {\n resetPage: true,\n },\n bubbles: true,\n composed: true,\n })\n );\n expect(el.page).to.equal(1);\n });\n\n it('should read and set sort, order, page and page size from URL if readParamsFromURL is set to true', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n .readParamsFromURL=${true}\n ></ix-grid>`);\n\n const url = '?sort=lastName&order=asc&page=2&size=5';\n\n history.pushState(null, '', `${location.pathname}${url}`);\n el.firstUpdated();\n\n expect(el.page).to.be.eq(2);\n expect(el.pageSize).to.be.eq(5);\n expect(el.sortedColumn).to.be.eq('lastName');\n expect(el.sortDirection).to.be.eq('asc');\n });\n\n it('should set sort, order, page, page size and filters in the URL when addParamsToURL is set to true', async () => {\n const columnsWithFilters = [\n {\n name: 'firstName',\n header: 'First name',\n filterable: true,\n dataType: 'string',\n filterOperators: ['contains', 'equals'],\n },\n {\n name: 'lastName',\n header: 'Last Name',\n filterable: true,\n dataType: 'string',\n filterOperators: ['equals'],\n },\n {\n name: 'createdDate',\n header: 'Created Date',\n filterable: true,\n dataType: 'dateTime',\n filterOperators: ['equals'],\n },\n ];\n\n const existingSearchParams = '?realUsername=Earl&userAge=30';\n history.pushState(null, '', `${location.pathname}${existingSearchParams}`);\n\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columnsWithFilters}\n .addParamsToURL=${true}\n ></ix-grid>`);\n\n const rowFilter = el.shadowRoot?.querySelector('ix-grid-row-filter');\n rowFilter!.dispatchEvent(\n new CustomEvent('rowFilter', {\n detail: {\n filters: [\n {\n columnField: 'firstName',\n operatorValue: 'contains',\n value: 'test',\n },\n {\n columnField: 'createdDate',\n operatorValue: 'equals',\n value: '2024-10-10',\n },\n ],\n },\n bubbles: true,\n composed: true,\n })\n );\n\n el.sortedColumn = 'firstName';\n el.sortDirection = 'desc';\n\n const pagination = el.shadowRoot?.querySelector('ix-pagination');\n pagination!.dispatchEvent(\n new CustomEvent('updatePagination', {\n detail: {\n page: 3,\n pageSize: 5,\n },\n bubbles: true,\n composed: true,\n })\n );\n\n expect(location.search).to.be.eq(\n `${existingSearchParams}&sort=firstName&order=desc&page=3&size=5&firstName_contains=test&createdDate_equals=2024-10-10`\n );\n });\n\n describe('IxGrid updateSort', () => {\n it('should update URL with sort, order, page, pageSize, filters', async () => {\n history.replaceState(null, '', '/?userId=123&token=abc');\n\n const updateSortColumns = [\n {\n name: 'name',\n header: 'Name',\n filterable: true,\n filterOperators: ['contains'],\n sortable: true,\n },\n ];\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${updateSortColumns}\n .rows=${[]}\n .addParamsToURL=${true}\n .preservedQueryParamKeys=${['userId', 'token']}\n ></ix-grid>\n `);\n\n await el.updateComplete;\n await el.handleSort('name');\n\n const url = new URL(window.location.href);\n const { searchParams } = url;\n\n expect(searchParams.get('sort')).to.equal('name');\n expect(searchParams.get('order')).to.equal('asc');\n expect(searchParams.get('page')).to.equal('1');\n expect(searchParams.get('size')).to.equal('10');\n expect(searchParams.get('userId')).to.equal('123');\n expect(searchParams.get('token')).to.equal('abc');\n });\n });\n\n describe('IxGrid LocalStorage Persistence', () => {\n beforeEach(() => {\n localStorage.clear();\n });\n\n it('should reset localStorage value if columns length does not match', async () => {\n const tempEl = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n const localStorageKey = tempEl.columnsLocalStorageKey;\n\n // Simulating a user fully deleting and adding a fake column to their local storage\n localStorage.setItem(\n localStorageKey,\n JSON.stringify([{ name: 'six', header: 'six' }])\n );\n\n const el = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n await el.updateComplete;\n\n const storedColumns = JSON.parse(\n localStorage.getItem(el.columnsLocalStorageKey) || '[]'\n );\n expect(storedColumns.length).to.equal(columns.length);\n expect(storedColumns.map(c => c.name)).to.deep.equal(\n columns.map(c => c.name)\n );\n });\n\n it('should reset localStorage value if it contains a column that does not exist in the provided columns', async () => {\n const tempEl = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n const localStorageKey = tempEl.columnsLocalStorageKey;\n\n // Simulating a user adding an additional column to local storage\n localStorage.setItem(\n localStorageKey,\n JSON.stringify([\n ...columns,\n { name: 'nonexistent', header: 'Nonexistent' },\n ])\n );\n\n const el = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n await el.updateComplete;\n\n const storedColumns = JSON.parse(\n localStorage.getItem(el.columnsLocalStorageKey) || '[]'\n );\n expect(storedColumns.length).to.equal(columns.length);\n expect(storedColumns.map(c => c.name)).to.deep.equal(\n columns.map(c => c.name)\n );\n });\n\n it('should delete localStorage if a provided column does not exist in localStorage and not create new local storage', async () => {\n const initialColumns = columns.slice(0, -1);\n\n const tempEl = await fixture<IxGrid>(\n html`<ix-grid\n .columns=${initialColumns}\n localStorageID=\"testGrid\"\n ></ix-grid>`\n );\n const localStorageKey = tempEl.columnsLocalStorageKey;\n\n // Simulating a user deleting most columns from local storage\n localStorage.setItem(localStorageKey, JSON.stringify(initialColumns));\n\n const el = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n await el.updateComplete;\n\n expect(localStorage.getItem(el.columnsLocalStorageKey)).to.equal(null);\n });\n\n it('should reorder columns based on table header flex order', async () => {\n const el = await fixture<IxGrid>(\n html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n localStorageID=\"testGrid\"\n ></ix-grid>`\n );\n await el.updateComplete;\n\n const headerCells = el.grid.shadowRoot?.querySelectorAll('th');\n if (!headerCells || headerCells.length !== columns.length) {\n throw new Error(\n 'Table headers not found or do not match expected count'\n );\n }\n\n const orderMap = [2, 0, 1];\n headerCells.forEach((th, index) => {\n const thElement = th as HTMLElement;\n thElement.style.order = orderMap[index].toString();\n });\n\n await el.updateComplete;\n await el.reorderColumnsFromTable();\n\n const reorderedColumns = [columns[1], columns[2], columns[0]];\n const storedColumns = JSON.parse(\n localStorage.getItem(el.columnsLocalStorageKey) || '[]'\n );\n\n expect(storedColumns.map(c => c.name)).to.deep.equal(\n reorderedColumns.map(c => c.name)\n );\n });\n\n it('should reorder columns when a filter reorder event is triggered', async () => {\n const el = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n await el.updateComplete;\n\n const reorderedColumns = [columns[2], columns[0], columns[1]];\n const event = new CustomEvent('columnFilter', {\n detail: { reorderedColumns },\n bubbles: true,\n composed: true,\n });\n\n el.reorderColumnsFromFilter(event);\n await el.updateComplete;\n\n const storedColumns = JSON.parse(\n localStorage.getItem(el.columnsLocalStorageKey) || '[]'\n );\n expect(el.displayColumns.map(c => c.name)).to.deep.equal(\n reorderedColumns.map(c => c.name)\n );\n expect(storedColumns.map(c => c.name)).to.deep.equal(\n reorderedColumns.map(c => c.name)\n );\n });\n });\n\n describe('IxGrid handlePopState', () => {\n const handlePopStateColumns = [\n {\n name: 'customcolumnfilter',\n header: 'Custom',\n filterable: true,\n filterOperators: ['contains'],\n },\n {\n name: 'id',\n header: 'ID',\n filterable: true,\n filterOperators: ['equals'],\n },\n ];\n\n it('should handle empty sort/order/page/size in URL', async () => {\n history.replaceState(null, '', '/?sort=&order=&page=&size=');\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${handlePopStateColumns}\n .rows=${[]}\n .readParamsFromURL=${true}\n ></ix-grid>\n `);\n await el.updateComplete;\n\n const changeEventPromise = oneEvent(el, 'change');\n window.dispatchEvent(new PopStateEvent('popstate'));\n const event = await changeEventPromise;\n\n expect(el.sortedColumn).to.equal('');\n expect(el.sortDirection).to.equal('');\n expect(el.page).to.equal(1);\n expect(el.pageSize).to.equal(10);\n\n expect(event.detail.filters).to.deep.equal({});\n });\n\n it('should handle valid sort/order/page/size in URL', async () => {\n history.replaceState(null, '', '/?sort=id&order=desc&page=1&size=20');\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${handlePopStateColumns}\n .rows=${[]}\n .readParamsFromURL=${true}\n ></ix-grid>\n `);\n await el.updateComplete;\n\n const changeEventPromise = oneEvent(el, 'change');\n window.dispatchEvent(new PopStateEvent('popstate'));\n const event = await changeEventPromise;\n\n expect(el.sortedColumn).to.equal('id');\n expect(el.sortDirection).to.equal('desc');\n expect(el.page).to.equal(1);\n expect(el.pageSize).to.equal(20);\n\n expect(event.detail.filters).to.deep.equal({});\n });\n\n it('should update filters from URL with custom filter', async () => {\n history.replaceState(null, '', '/?customcolumnfilter_contains=foobar');\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${handlePopStateColumns}\n .rows=${[]}\n .readParamsFromURL=${true}\n ></ix-grid>\n `);\n await el.updateComplete;\n\n const changeEventPromise = oneEvent(el, 'change');\n window.dispatchEvent(new PopStateEvent('popstate'));\n const event = await changeEventPromise;\n\n expect(event.detail.filters).to.deep.equal({\n customcolumnfilter: 'foobar',\n });\n });\n\n it('should dispatch a change event with correct detail', async () => {\n history.replaceState(\n null,\n '',\n '/?sort=id&order=desc&page=1&size=20&customcolumnfilter_contains=foobar'\n );\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${handlePopStateColumns}\n .rows=${[]}\n .readParamsFromURL=${true}\n ></ix-grid>\n `);\n await el.updateComplete;\n\n const changeEventPromise = oneEvent(el, 'change');\n window.dispatchEvent(new PopStateEvent('popstate'));\n const event = await changeEventPromise;\n\n expect(event.detail).to.include({\n columnName: 'id',\n sortOrder: 'desc',\n page: 1,\n pageSize: 20,\n });\n\n expect(event.detail.filters).to.deep.equal({\n customcolumnfilter: 'foobar',\n });\n\n expect(event.detail.filtersOperators).to.deep.equal([\n {\n columnField: 'customcolumnfilter',\n operator: 'contains',\n },\n ]);\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"ix-grid.test.js","sourceRoot":"","sources":["../../src/test/ix-grid.test.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,uBAAuB,CAAC;AAC/B,OAAO,eAAe,CAAC;AAEvB,MAAM,IAAI,GAAG;IACX;QACE,IAAI,EAAE,KAAK;KACZ;IACD;QACE,IAAI,EAAE,KAAK;KACZ;IACD;QACE,IAAI,EAAE,OAAO;KACd;CACF,CAAC;AAEF,MAAM,OAAO,GAAG;IACd;QACE,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA,UAAU,GAAG,CAAC,IAAI,SAAS;QACpD,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,CAAC,QAAQ,CAAC;KAC5B;IACD;QACE,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA,UAAU,GAAG,CAAC,IAAI,SAAS;QACpD,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;KACxC;IACD;QACE,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA,UAAU,GAAG,CAAC,IAAI,SAAS;QACpD,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;KACxC;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAE7C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,UAAU,CAAC,GAAG,EAAE;QACd,cAAc,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA,qBAAqB,CAAC,CAAC;QAE5D,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;iBACxB,OAAO;cACV,IAAI;gBACF,CAAC,CAAC;QAEd,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEhC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;;QAC/C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;iBACxB,OAAO;cACV,EAAE;;gBAEA,CAAC,CAAC;QAEd,MAAM,MAAM,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;;QAC7C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;iBACxB,OAAO;cACV,IAAI;uCACqB,IAAI;gBAC3B,CAAC,CAAC;QAEd,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,CAAmB,SAAU,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,CACzE,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;;QACpD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;4BACb,iBAAiB;iBAC5B,OAAO;cACV,IAAI;gBACF,CAAC,CAAC;QAEd,MAAM,UAAU,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,eAAe,CAAC,CAAC;QACjE,UAAW,CAAC,aAAa,CACvB,IAAI,WAAW,CAAC,kBAAkB,EAAE;YAClC,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,EAAE;aACb;YACD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE5B,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACrE,SAAU,CAAC,aAAa,CACtB,IAAI,WAAW,CAAC,WAAW,EAAE;YAC3B,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI;aAChB;YACD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;QAChH,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;iBACxB,OAAO;cACV,IAAI;2BACS,IAAI;4BACH,iBAAiB;gBAC7B,CAAC,CAAC;QAEd,cAAc,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,wCAAwC,CAAC;QAErD,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,YAAY,EAAE,CAAC;QAElB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,cAAc,CAAC,OAAO,CACpB,QAAQ,iBAAiB,EAAE,EAC3B,IAAI,CAAC,SAAS,CAAC;YACb,QAAQ,EAAE,EAAE;SACb,CAAC,CACH,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;iBACxB,OAAO;cACV,IAAI;4BACU,iBAAiB;gBAC7B,CAAC,CAAC;QAEd,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;QAEzB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,cAAc,CAAC,OAAO,CACpB,QAAQ,iBAAiB,EAAE,EAC3B,IAAI,CAAC,SAAS,CAAC;YACb,QAAQ,EAAE,EAAE;SACb,CAAC,CACH,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;iBACxB,OAAO;cACV,IAAI;2BACS,IAAI;4BACH,iBAAiB;gBAC7B,CAAC,CAAC;QAEd,MAAM,GAAG,GAAG,yCAAyC,CAAC;QAEtD,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;QAC1D,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;QAEzB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,cAAc,CAAC,OAAO,CAAC,QAAQ,iBAAiB,EAAE,CAAC,IAAI,IAAI,CAC5D,CAAC;QAEF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mGAAmG,EAAE,KAAK,IAAI,EAAE;;QACjH,MAAM,kBAAkB,GAAG;YACzB;gBACE,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,YAAY;gBACpB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,QAAQ;gBAClB,eAAe,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;aACxC;YACD;gBACE,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,WAAW;gBACnB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,QAAQ;gBAClB,eAAe,EAAE,CAAC,QAAQ,CAAC;aAC5B;YACD;gBACE,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,cAAc;gBACtB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,UAAU;gBACpB,eAAe,EAAE,CAAC,QAAQ,CAAC;aAC5B;SACF,CAAC;QAEF,MAAM,oBAAoB,GAAG,+BAA+B,CAAC;QAC7D,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,QAAQ,GAAG,oBAAoB,EAAE,CAAC,CAAC;QAE3E,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;iBACxB,kBAAkB;wBACX,IAAI;4BACA,iBAAiB;gBAC7B,CAAC,CAAC;QAEd,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACrE,SAAU,CAAC,aAAa,CACtB,IAAI,WAAW,CAAC,WAAW,EAAE;YAC3B,MAAM,EAAE;gBACN,OAAO,EAAE;oBACP;wBACE,WAAW,EAAE,WAAW;wBACxB,aAAa,EAAE,UAAU;wBACzB,KAAK,EAAE,MAAM;qBACd;oBACD;wBACE,WAAW,EAAE,aAAa;wBAC1B,aAAa,EAAE,QAAQ;wBACvB,KAAK,EAAE,YAAY;qBACpB;iBACF;aACF;YACD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;QAEF,EAAE,CAAC,YAAY,GAAG,WAAW,CAAC;QAC9B,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC;QAE1B,MAAM,UAAU,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,eAAe,CAAC,CAAC;QACjE,UAAW,CAAC,aAAa,CACvB,IAAI,WAAW,CAAC,kBAAkB,EAAE;YAClC,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,CAAC;aACZ;YACD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAC9B,GAAG,oBAAoB,gGAAgG,CACxH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAEzD,MAAM,iBAAiB,GAAG;gBACxB;oBACE,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,MAAM;oBACd,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,CAAC,UAAU,CAAC;oBAC7B,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;YAEF,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;;qBAEtB,iBAAiB;kBACpB,EAAE;4BACQ,IAAI;qCACK,CAAC,QAAQ,EAAE,OAAO,CAAC;gCACxB,iBAAiB;;OAE1C,CAAC,CAAC;YAEH,MAAM,EAAE,CAAC,cAAc,CAAC;YACxB,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAE5B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;YAE7B,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,UAAU,CAAC,GAAG,EAAE;YACd,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YAChF,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,IAAI,CAAA,qBAAqB,OAAO,uCAAuC,CACxE,CAAC;YACF,MAAM,eAAe,GAAG,MAAM,CAAC,sBAAsB,CAAC;YAEtD,mFAAmF;YACnF,YAAY,CAAC,OAAO,CAClB,eAAe,EACf,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CACjD,CAAC;YAEF,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA,qBAAqB,OAAO,uCAAuC,CACxE,CAAC;YACF,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,IAAI,CACxD,CAAC;YACF,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAClD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACzB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qGAAqG,EAAE,KAAK,IAAI,EAAE;YACnH,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,IAAI,CAAA,qBAAqB,OAAO,uCAAuC,CACxE,CAAC;YACF,MAAM,eAAe,GAAG,MAAM,CAAC,sBAAsB,CAAC;YAEtD,iEAAiE;YACjE,YAAY,CAAC,OAAO,CAClB,eAAe,EACf,IAAI,CAAC,SAAS,CAAC;gBACb,GAAG,OAAO;gBACV,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE;aAC/C,CAAC,CACH,CAAC;YAEF,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA,qBAAqB,OAAO,uCAAuC,CACxE,CAAC;YACF,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,IAAI,CACxD,CAAC;YACF,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAClD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACzB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iHAAiH,EAAE,KAAK,IAAI,EAAE;YAC/H,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAE5C,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,IAAI,CAAA;qBACS,cAAc;;oBAEf,CACb,CAAC;YACF,MAAM,eAAe,GAAG,MAAM,CAAC,sBAAsB,CAAC;YAEtD,6DAA6D;YAC7D,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;YAEtE,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA,qBAAqB,OAAO,uCAAuC,CACxE,CAAC;YACF,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;;YACvE,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;qBACS,OAAO;kBACV,IAAI;;oBAEF,CACb,CAAC;YACF,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,WAAW,GAAG,MAAA,EAAE,CAAC,IAAI,CAAC,UAAU,0CAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE;gBACzD,MAAM,IAAI,KAAK,CACb,wDAAwD,CACzD,CAAC;aACH;YAED,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;gBAChC,MAAM,SAAS,GAAG,EAAiB,CAAC;gBACpC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,CAAC,cAAc,CAAC;YACxB,MAAM,EAAE,CAAC,uBAAuB,EAAE,CAAC;YAEnC,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,IAAI,CACxD,CAAC;YAEF,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAClD,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAClC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA,qBAAqB,OAAO,uCAAuC,CACxE,CAAC;YACF,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC5C,MAAM,EAAE,EAAE,gBAAgB,EAAE;gBAC5B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,IAAI,CACxD,CAAC;YACF,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CACtD,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAClC,CAAC;YACF,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAClD,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAClC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,MAAM,qBAAqB,GAAG;YAC5B;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,IAAI;gBAChB,eAAe,EAAE,CAAC,UAAU,CAAC;aAC9B;YACD;gBACE,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,IAAI;gBAChB,eAAe,EAAE,CAAC,QAAQ,CAAC;aAC5B;SACF,CAAC;QAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,4BAA4B,CAAC,CAAC;YAE7D,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;;qBAEtB,qBAAqB;kBACxB,EAAE;+BACW,IAAI;;OAE5B,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC;YAEvC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAEjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,qCAAqC,CAAC,CAAC;YAEtE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;;qBAEtB,qBAAqB;kBACxB,EAAE;+BACW,IAAI;;OAE5B,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC;YAEvC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAEjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,sCAAsC,CAAC,CAAC;YAEvE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;;qBAEtB,qBAAqB;kBACxB,EAAE;+BACW,IAAI;;OAE5B,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC;YAEvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBACzC,kBAAkB,EAAE,QAAQ;aAC7B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,OAAO,CAAC,YAAY,CAClB,IAAI,EACJ,EAAE,EACF,wEAAwE,CACzE,CAAC;YAEF,MAAM,EAAE,GAAG,MAAM,OAAO,CAAS,IAAI,CAAA;;qBAEtB,qBAAqB;kBACxB,EAAE;+BACW,IAAI;;OAE5B,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,cAAc,CAAC;YAExB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC;YAEvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;gBAC9B,UAAU,EAAE,IAAI;gBAChB,SAAS,EAAE,MAAM;gBACjB,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBACzC,kBAAkB,EAAE,QAAQ;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBAClD;oBACE,WAAW,EAAE,oBAAoB;oBACjC,QAAQ,EAAE,UAAU;iBACrB;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { elementUpdated, expect, fixture, oneEvent } from '@open-wc/testing';\nimport { html } from 'lit';\n\nimport { IxGrid } from '../IxGrid.js';\nimport { IxGridRowFilter } from '../components/IxGridRowFilter.js';\nimport '../ix-grid-no-rows.js';\nimport '../ix-grid.js';\n\nconst rows = [\n {\n name: 'one',\n },\n {\n name: 'two',\n },\n {\n name: 'three',\n },\n];\n\nconst columns = [\n {\n name: 'one',\n header: 'one',\n bodyRenderer: row => html` <span>${row.name}</span>`,\n filterable: true,\n filterOperators: ['equals'],\n },\n {\n name: 'two',\n header: 'one',\n bodyRenderer: row => html` <span>${row.name}</span>`,\n filterable: true,\n filterOperators: ['equals', 'contains'],\n },\n {\n name: 'three',\n header: 'one',\n bodyRenderer: row => html` <span>${row.name}</span>`,\n filterable: true,\n filterOperators: ['equals', 'contains'],\n },\n];\n\nconst sessionStorageKey = 'test-session-key';\n\ndescribe('IxGrid', () => {\n beforeEach(() => {\n sessionStorage.clear();\n });\n\n it('renders a grid', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid></ix-grid>`);\n\n expect(el).to.not.be.null;\n });\n\n it('renders the correct number of rows', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n ></ix-grid>`);\n\n expect(rows.length).to.equal(3);\n\n expect(el).to.not.be.null;\n });\n\n it('renders no rows component state', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${[]}\n ><ix-grid-no-rows slot=\"no-rows\"></ix-grid-no-rows\n ></ix-grid>`);\n\n const noRows = el.shadowRoot?.querySelector('slot[name=\"no-rows\"]');\n expect(noRows).to.not.be.null;\n });\n\n it('renders an ix-grid-row-filter', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n .filterValueChangeDebounceTime=${1000}\n ></ix-grid>`);\n\n const rowFilter = el.shadowRoot?.querySelector('ix-grid-row-filter');\n expect(rowFilter).to.be.instanceOf(IxGridRowFilter);\n expect((<IxGridRowFilter>rowFilter).filterValueChangeDebounceTime).to.equal(\n 1000\n );\n });\n\n it('resets pagination upon filter change', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n session-storage-key=${sessionStorageKey}\n .columns=${columns}\n .rows=${rows}\n ></ix-grid>`);\n\n const pagination = el.shadowRoot?.querySelector('ix-pagination');\n pagination!.dispatchEvent(\n new CustomEvent('updatePagination', {\n detail: {\n page: 2,\n pageSize: 10,\n },\n bubbles: true,\n composed: true,\n })\n );\n expect(el.page).to.equal(2);\n\n const rowFilter = el.shadowRoot?.querySelector('ix-grid-row-filter');\n rowFilter!.dispatchEvent(\n new CustomEvent('rowFilter', {\n detail: {\n resetPage: true,\n },\n bubbles: true,\n composed: true,\n })\n );\n expect(el.page).to.equal(1);\n });\n\n it('should read and set sort, order, page and page size from URL if readParamsFromURL is set to true', async () => {\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n .readParamsFromURL=${true}\n session-storage-key=${sessionStorageKey}\n ></ix-grid>`);\n\n sessionStorage.removeItem(`urlPageSizeRead`);\n\n const url = '?sort=lastName&order=asc&page=2&size=5';\n\n history.pushState(null, '', `${location.pathname}${url}`);\n el.firstUpdated();\n\n expect(el.page).to.be.eq(2);\n expect(el.pageSize).to.be.eq(5);\n expect(el.sortedColumn).to.be.eq('lastName');\n expect(el.sortDirection).to.be.eq('asc');\n });\n\n it('sessionStorage sets the URL', async () => {\n sessionStorage.setItem(\n `grid-${sessionStorageKey}`,\n JSON.stringify({\n pageSize: 25,\n })\n );\n\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n session-storage-key=${sessionStorageKey}\n ></ix-grid>`);\n\n await elementUpdated(el);\n\n expect(location.href).to.contain('size=25');\n });\n\n it('page and page size from URL sets sessionStorage', async () => {\n sessionStorage.setItem(\n `grid-${sessionStorageKey}`,\n JSON.stringify({\n pageSize: 10,\n })\n );\n\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n .readParamsFromURL=${true}\n session-storage-key=${sessionStorageKey}\n ></ix-grid>`);\n\n const url = '?sort=lastName&order=asc&page=2&size=25';\n\n history.pushState(null, '', `${location.pathname}${url}`);\n await elementUpdated(el);\n\n const sessionData = JSON.parse(\n sessionStorage.getItem(`grid-${sessionStorageKey}`) || '{}'\n );\n\n expect(sessionData.pageSize).to.be.eq(25);\n });\n\n it('should set sort, order, page, page size and filters in the URL when addParamsToURL is set to true', async () => {\n const columnsWithFilters = [\n {\n name: 'firstName',\n header: 'First name',\n filterable: true,\n dataType: 'string',\n filterOperators: ['contains', 'equals'],\n },\n {\n name: 'lastName',\n header: 'Last Name',\n filterable: true,\n dataType: 'string',\n filterOperators: ['equals'],\n },\n {\n name: 'createdDate',\n header: 'Created Date',\n filterable: true,\n dataType: 'dateTime',\n filterOperators: ['equals'],\n },\n ];\n\n const existingSearchParams = '?realUsername=Earl&userAge=30';\n history.pushState(null, '', `${location.pathname}${existingSearchParams}`);\n\n const el = await fixture<IxGrid>(html`<ix-grid\n .columns=${columnsWithFilters}\n .addParamsToURL=${true}\n session-storage-key=${sessionStorageKey}\n ></ix-grid>`);\n\n const rowFilter = el.shadowRoot?.querySelector('ix-grid-row-filter');\n rowFilter!.dispatchEvent(\n new CustomEvent('rowFilter', {\n detail: {\n filters: [\n {\n columnField: 'firstName',\n operatorValue: 'contains',\n value: 'test',\n },\n {\n columnField: 'createdDate',\n operatorValue: 'equals',\n value: '2024-10-10',\n },\n ],\n },\n bubbles: true,\n composed: true,\n })\n );\n\n el.sortedColumn = 'firstName';\n el.sortDirection = 'desc';\n\n const pagination = el.shadowRoot?.querySelector('ix-pagination');\n pagination!.dispatchEvent(\n new CustomEvent('updatePagination', {\n detail: {\n page: 3,\n pageSize: 5,\n },\n bubbles: true,\n composed: true,\n })\n );\n\n expect(location.search).to.be.eq(\n `${existingSearchParams}&sort=firstName&order=desc&page=3&size=5&firstName_contains=test&createdDate_equals=2024-10-10`\n );\n });\n\n describe('IxGrid updateSort', () => {\n it('should update URL with sort, order, page, pageSize, filters', async () => {\n history.replaceState(null, '', '/?userId=123&token=abc');\n\n const updateSortColumns = [\n {\n name: 'name',\n header: 'Name',\n filterable: true,\n filterOperators: ['contains'],\n sortable: true,\n },\n ];\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${updateSortColumns}\n .rows=${[]}\n .addParamsToURL=${true}\n .preservedQueryParamKeys=${['userId', 'token']}\n session-storage-key=${sessionStorageKey}\n ></ix-grid>\n `);\n\n await el.updateComplete;\n await el.handleSort('name');\n\n const url = new URL(window.location.href);\n const { searchParams } = url;\n\n expect(searchParams.get('sort')).to.equal('name');\n expect(searchParams.get('order')).to.equal('asc');\n expect(searchParams.get('page')).to.equal('1');\n expect(searchParams.get('size')).to.equal('10');\n expect(searchParams.get('userId')).to.equal('123');\n expect(searchParams.get('token')).to.equal('abc');\n });\n });\n\n describe('IxGrid LocalStorage Persistence', () => {\n beforeEach(() => {\n localStorage.clear();\n });\n\n it('should reset localStorage value if columns length does not match', async () => {\n const tempEl = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n const localStorageKey = tempEl.columnsLocalStorageKey;\n\n // Simulating a user fully deleting and adding a fake column to their local storage\n localStorage.setItem(\n localStorageKey,\n JSON.stringify([{ name: 'six', header: 'six' }])\n );\n\n const el = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n await el.updateComplete;\n\n const storedColumns = JSON.parse(\n localStorage.getItem(el.columnsLocalStorageKey) || '[]'\n );\n expect(storedColumns.length).to.equal(columns.length);\n expect(storedColumns.map(c => c.name)).to.deep.equal(\n columns.map(c => c.name)\n );\n });\n\n it('should reset localStorage value if it contains a column that does not exist in the provided columns', async () => {\n const tempEl = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n const localStorageKey = tempEl.columnsLocalStorageKey;\n\n // Simulating a user adding an additional column to local storage\n localStorage.setItem(\n localStorageKey,\n JSON.stringify([\n ...columns,\n { name: 'nonexistent', header: 'Nonexistent' },\n ])\n );\n\n const el = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n await el.updateComplete;\n\n const storedColumns = JSON.parse(\n localStorage.getItem(el.columnsLocalStorageKey) || '[]'\n );\n expect(storedColumns.length).to.equal(columns.length);\n expect(storedColumns.map(c => c.name)).to.deep.equal(\n columns.map(c => c.name)\n );\n });\n\n it('should delete localStorage if a provided column does not exist in localStorage and not create new local storage', async () => {\n const initialColumns = columns.slice(0, -1);\n\n const tempEl = await fixture<IxGrid>(\n html`<ix-grid\n .columns=${initialColumns}\n localStorageID=\"testGrid\"\n ></ix-grid>`\n );\n const localStorageKey = tempEl.columnsLocalStorageKey;\n\n // Simulating a user deleting most columns from local storage\n localStorage.setItem(localStorageKey, JSON.stringify(initialColumns));\n\n const el = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n await el.updateComplete;\n\n expect(localStorage.getItem(el.columnsLocalStorageKey)).to.equal(null);\n });\n\n it('should reorder columns based on table header flex order', async () => {\n const el = await fixture<IxGrid>(\n html`<ix-grid\n .columns=${columns}\n .rows=${rows}\n localStorageID=\"testGrid\"\n ></ix-grid>`\n );\n await el.updateComplete;\n\n const headerCells = el.grid.shadowRoot?.querySelectorAll('th');\n if (!headerCells || headerCells.length !== columns.length) {\n throw new Error(\n 'Table headers not found or do not match expected count'\n );\n }\n\n const orderMap = [2, 0, 1];\n headerCells.forEach((th, index) => {\n const thElement = th as HTMLElement;\n thElement.style.order = orderMap[index].toString();\n });\n\n await el.updateComplete;\n await el.reorderColumnsFromTable();\n\n const reorderedColumns = [columns[1], columns[2], columns[0]];\n const storedColumns = JSON.parse(\n localStorage.getItem(el.columnsLocalStorageKey) || '[]'\n );\n\n expect(storedColumns.map(c => c.name)).to.deep.equal(\n reorderedColumns.map(c => c.name)\n );\n });\n\n it('should reorder columns when a filter reorder event is triggered', async () => {\n const el = await fixture<IxGrid>(\n html`<ix-grid .columns=${columns} localStorageID=\"testGrid\"></ix-grid>`\n );\n await el.updateComplete;\n\n const reorderedColumns = [columns[2], columns[0], columns[1]];\n const event = new CustomEvent('columnFilter', {\n detail: { reorderedColumns },\n bubbles: true,\n composed: true,\n });\n\n el.reorderColumnsFromFilter(event);\n await el.updateComplete;\n\n const storedColumns = JSON.parse(\n localStorage.getItem(el.columnsLocalStorageKey) || '[]'\n );\n expect(el.displayColumns.map(c => c.name)).to.deep.equal(\n reorderedColumns.map(c => c.name)\n );\n expect(storedColumns.map(c => c.name)).to.deep.equal(\n reorderedColumns.map(c => c.name)\n );\n });\n });\n\n describe('IxGrid handlePopState', () => {\n const handlePopStateColumns = [\n {\n name: 'customcolumnfilter',\n header: 'Custom',\n filterable: true,\n filterOperators: ['contains'],\n },\n {\n name: 'id',\n header: 'ID',\n filterable: true,\n filterOperators: ['equals'],\n },\n ];\n\n it('should handle empty sort/order/page/size in URL', async () => {\n history.replaceState(null, '', '/?sort=&order=&page=&size=');\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${handlePopStateColumns}\n .rows=${[]}\n .readParamsFromURL=${true}\n ></ix-grid>\n `);\n await el.updateComplete;\n\n const changeEventPromise = oneEvent(el, 'change');\n window.dispatchEvent(new PopStateEvent('popstate'));\n const event = await changeEventPromise;\n\n expect(el.sortedColumn).to.equal('');\n expect(el.sortDirection).to.equal('');\n expect(el.page).to.equal(1);\n expect(el.pageSize).to.equal(10);\n\n expect(event.detail.filters).to.deep.equal({});\n });\n\n it('should handle valid sort/order/page/size in URL', async () => {\n history.replaceState(null, '', '/?sort=id&order=desc&page=1&size=20');\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${handlePopStateColumns}\n .rows=${[]}\n .readParamsFromURL=${true}\n ></ix-grid>\n `);\n await el.updateComplete;\n\n const changeEventPromise = oneEvent(el, 'change');\n window.dispatchEvent(new PopStateEvent('popstate'));\n const event = await changeEventPromise;\n\n expect(el.sortedColumn).to.equal('id');\n expect(el.sortDirection).to.equal('desc');\n expect(el.page).to.equal(1);\n expect(el.pageSize).to.equal(20);\n\n expect(event.detail.filters).to.deep.equal({});\n });\n\n it('should update filters from URL with custom filter', async () => {\n history.replaceState(null, '', '/?customcolumnfilter_contains=foobar');\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${handlePopStateColumns}\n .rows=${[]}\n .readParamsFromURL=${true}\n ></ix-grid>\n `);\n await el.updateComplete;\n\n const changeEventPromise = oneEvent(el, 'change');\n window.dispatchEvent(new PopStateEvent('popstate'));\n const event = await changeEventPromise;\n\n expect(event.detail.filters).to.deep.equal({\n customcolumnfilter: 'foobar',\n });\n });\n\n it('should dispatch a change event with correct detail', async () => {\n history.replaceState(\n null,\n '',\n '/?sort=id&order=desc&page=1&size=20&customcolumnfilter_contains=foobar'\n );\n\n const el = await fixture<IxGrid>(html`\n <ix-grid\n .columns=${handlePopStateColumns}\n .rows=${[]}\n .readParamsFromURL=${true}\n ></ix-grid>\n `);\n await el.updateComplete;\n\n const changeEventPromise = oneEvent(el, 'change');\n window.dispatchEvent(new PopStateEvent('popstate'));\n const event = await changeEventPromise;\n\n expect(event.detail).to.include({\n columnName: 'id',\n sortOrder: 'desc',\n page: 1,\n pageSize: 20,\n });\n\n expect(event.detail.filters).to.deep.equal({\n customcolumnfilter: 'foobar',\n });\n\n expect(event.detail.filtersOperators).to.deep.equal([\n {\n columnField: 'customcolumnfilter',\n operator: 'contains',\n },\n ]);\n });\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "Webcomponent ix-grid following open-wc recommendations",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Digital Realty",
|
|
6
|
-
"version": "1.3.
|
|
6
|
+
"version": "1.3.12",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"main": "dist/index.js",
|
|
9
9
|
"module": "dist/index.js",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@digital-realty/grid": "^1.1.2",
|
|
33
33
|
"@digital-realty/ix-button": "^3.4.3",
|
|
34
34
|
"@digital-realty/ix-date": "^1.2.2",
|
|
35
|
-
"@digital-realty/ix-date-next": "^1.1.
|
|
35
|
+
"@digital-realty/ix-date-next": "^1.1.7",
|
|
36
36
|
"@digital-realty/ix-icon": "^1.2.2",
|
|
37
37
|
"@digital-realty/ix-icon-button": "^1.2.2",
|
|
38
38
|
"@digital-realty/ix-menu": "^1.2.2",
|
|
@@ -113,5 +113,5 @@
|
|
|
113
113
|
"prettier --write"
|
|
114
114
|
]
|
|
115
115
|
},
|
|
116
|
-
"gitHead": "
|
|
116
|
+
"gitHead": "4e2dd87a8e6b0552c642099f84c46a77c718db87"
|
|
117
117
|
}
|
package/src/IxGrid.ts
CHANGED
|
@@ -57,6 +57,10 @@ export interface FieldOperator {
|
|
|
57
57
|
operator: FilterOperator;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
export interface SessionStorageData {
|
|
61
|
+
pageSize?: number;
|
|
62
|
+
}
|
|
63
|
+
|
|
60
64
|
export class IxGrid extends LitElement {
|
|
61
65
|
static readonly styles = [IxGridViewStyles];
|
|
62
66
|
|
|
@@ -155,6 +159,9 @@ export class IxGrid extends LitElement {
|
|
|
155
159
|
|
|
156
160
|
@property({ type: Function }) onRemoveAllButtonClick?: any;
|
|
157
161
|
|
|
162
|
+
@property({ type: String, attribute: 'session-storage-key' })
|
|
163
|
+
sessionStorageKey: string | undefined = undefined;
|
|
164
|
+
|
|
158
165
|
@property({ type: Boolean }) useNewDatePicker = false;
|
|
159
166
|
|
|
160
167
|
@state() private filters: Filter[] = [];
|
|
@@ -165,6 +172,8 @@ export class IxGrid extends LitElement {
|
|
|
165
172
|
|
|
166
173
|
@state() displayColumns: Column[] = [];
|
|
167
174
|
|
|
175
|
+
@state() sessionStorageData: SessionStorageData | undefined = undefined;
|
|
176
|
+
|
|
168
177
|
private defaultFilterKeys = ['sort', 'order', 'page', 'size'];
|
|
169
178
|
|
|
170
179
|
private initialised = false;
|
|
@@ -218,10 +227,12 @@ export class IxGrid extends LitElement {
|
|
|
218
227
|
connectedCallback() {
|
|
219
228
|
super.connectedCallback?.();
|
|
220
229
|
window.addEventListener('popstate', this.handlePopState);
|
|
230
|
+
window.addEventListener('beforeunload', this.handleUnload);
|
|
221
231
|
}
|
|
222
232
|
|
|
223
233
|
disconnectedCallback() {
|
|
224
234
|
window.removeEventListener('popstate', this.handlePopState);
|
|
235
|
+
window.removeEventListener('beforeunload', this.handleUnload);
|
|
225
236
|
super.disconnectedCallback?.();
|
|
226
237
|
}
|
|
227
238
|
|
|
@@ -230,9 +241,15 @@ export class IxGrid extends LitElement {
|
|
|
230
241
|
this.dispatchChangeEvent();
|
|
231
242
|
};
|
|
232
243
|
|
|
244
|
+
private handleUnload = () => {
|
|
245
|
+
sessionStorage.removeItem(`urlPageSizeRead`);
|
|
246
|
+
};
|
|
247
|
+
|
|
233
248
|
private updateSearchParamsFromUri(
|
|
234
249
|
rebuildFiltersFromUri: boolean = false
|
|
235
250
|
): void {
|
|
251
|
+
// If the grid is not visible, do not update from search params
|
|
252
|
+
if (this.grid.getBoundingClientRect().width === 0) return;
|
|
236
253
|
if (this.readParamsFromURL) {
|
|
237
254
|
const url = new URL(window.location.href);
|
|
238
255
|
const searchParams = new URLSearchParams(url.search);
|
|
@@ -252,7 +269,17 @@ export class IxGrid extends LitElement {
|
|
|
252
269
|
}
|
|
253
270
|
|
|
254
271
|
if (size) {
|
|
255
|
-
|
|
272
|
+
// update pageSize with url param only on load or refresh
|
|
273
|
+
// otherwise use session storage value
|
|
274
|
+
if (
|
|
275
|
+
!this.getSessionStorageData() ||
|
|
276
|
+
(!sessionStorage.getItem(`urlPageSizeRead`) &&
|
|
277
|
+
this.grid.getBoundingClientRect().width > 0)
|
|
278
|
+
) {
|
|
279
|
+
sessionStorage.setItem(`urlPageSizeRead`, true.toString());
|
|
280
|
+
this.pageSize = parseInt(size, 10) || this.defaultPageSize;
|
|
281
|
+
this.updateSessionStorage({ pageSize: this.pageSize });
|
|
282
|
+
}
|
|
256
283
|
}
|
|
257
284
|
|
|
258
285
|
if (rebuildFiltersFromUri) {
|
|
@@ -316,12 +343,57 @@ export class IxGrid extends LitElement {
|
|
|
316
343
|
this.checkLocalStorageUpdate();
|
|
317
344
|
this.initialised = true;
|
|
318
345
|
}
|
|
346
|
+
|
|
347
|
+
if (
|
|
348
|
+
changedProperties.has('sessionStorageData') &&
|
|
349
|
+
this.sessionStorageData
|
|
350
|
+
) {
|
|
351
|
+
const newPageSize =
|
|
352
|
+
this.sessionStorageData.pageSize || this.defaultPageSize;
|
|
353
|
+
|
|
354
|
+
if (this.pageSize !== newPageSize) {
|
|
355
|
+
this.pageSize = newPageSize;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
319
359
|
super.update(changedProperties);
|
|
320
360
|
}
|
|
321
361
|
|
|
322
362
|
firstUpdated() {
|
|
323
363
|
this.updateSearchParamsFromUri();
|
|
324
364
|
this.removeOldLocalStorageValues();
|
|
365
|
+
this.sessionStorageData = this.getSessionStorageData();
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
private getSessionStorageData() {
|
|
369
|
+
if (this.sessionStorageKey) {
|
|
370
|
+
const sessionData = sessionStorage.getItem(
|
|
371
|
+
`grid-${this.sessionStorageKey}`
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
if (sessionData) {
|
|
375
|
+
return JSON.parse(sessionData);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
private updateSessionStorage(data: SessionStorageData) {
|
|
383
|
+
const sessionData = this.getSessionStorageData() || {};
|
|
384
|
+
|
|
385
|
+
if (this.sessionStorageKey && data) {
|
|
386
|
+
const updatedData = {
|
|
387
|
+
...sessionData,
|
|
388
|
+
...data,
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
sessionStorage.setItem(
|
|
392
|
+
`grid-${this.sessionStorageKey}`,
|
|
393
|
+
JSON.stringify(updatedData)
|
|
394
|
+
);
|
|
395
|
+
this.sessionStorageData = updatedData;
|
|
396
|
+
}
|
|
325
397
|
}
|
|
326
398
|
|
|
327
399
|
private checkLocalStorageUpdate(): void {
|
|
@@ -851,6 +923,9 @@ export class IxGrid extends LitElement {
|
|
|
851
923
|
@updatePagination=${(e: CustomEvent) => {
|
|
852
924
|
this.page = e.detail.page;
|
|
853
925
|
this.pageSize = e.detail.pageSize;
|
|
926
|
+
this.updateSessionStorage({
|
|
927
|
+
pageSize: this.pageSize,
|
|
928
|
+
});
|
|
854
929
|
this.updatePage();
|
|
855
930
|
}}
|
|
856
931
|
></ix-pagination>
|
package/src/test/ix-grid.test.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-restricted-globals */
|
|
2
|
-
import { expect, fixture, oneEvent } from '@open-wc/testing';
|
|
2
|
+
import { elementUpdated, expect, fixture, oneEvent } from '@open-wc/testing';
|
|
3
3
|
import { html } from 'lit';
|
|
4
|
+
|
|
4
5
|
import { IxGrid } from '../IxGrid.js';
|
|
5
6
|
import { IxGridRowFilter } from '../components/IxGridRowFilter.js';
|
|
6
7
|
import '../ix-grid-no-rows.js';
|
|
@@ -42,7 +43,13 @@ const columns = [
|
|
|
42
43
|
},
|
|
43
44
|
];
|
|
44
45
|
|
|
46
|
+
const sessionStorageKey = 'test-session-key';
|
|
47
|
+
|
|
45
48
|
describe('IxGrid', () => {
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
sessionStorage.clear();
|
|
51
|
+
});
|
|
52
|
+
|
|
46
53
|
it('renders a grid', async () => {
|
|
47
54
|
const el = await fixture<IxGrid>(html`<ix-grid></ix-grid>`);
|
|
48
55
|
|
|
@@ -87,6 +94,7 @@ describe('IxGrid', () => {
|
|
|
87
94
|
|
|
88
95
|
it('resets pagination upon filter change', async () => {
|
|
89
96
|
const el = await fixture<IxGrid>(html`<ix-grid
|
|
97
|
+
session-storage-key=${sessionStorageKey}
|
|
90
98
|
.columns=${columns}
|
|
91
99
|
.rows=${rows}
|
|
92
100
|
></ix-grid>`);
|
|
@@ -122,8 +130,11 @@ describe('IxGrid', () => {
|
|
|
122
130
|
.columns=${columns}
|
|
123
131
|
.rows=${rows}
|
|
124
132
|
.readParamsFromURL=${true}
|
|
133
|
+
session-storage-key=${sessionStorageKey}
|
|
125
134
|
></ix-grid>`);
|
|
126
135
|
|
|
136
|
+
sessionStorage.removeItem(`urlPageSizeRead`);
|
|
137
|
+
|
|
127
138
|
const url = '?sort=lastName&order=asc&page=2&size=5';
|
|
128
139
|
|
|
129
140
|
history.pushState(null, '', `${location.pathname}${url}`);
|
|
@@ -135,6 +146,52 @@ describe('IxGrid', () => {
|
|
|
135
146
|
expect(el.sortDirection).to.be.eq('asc');
|
|
136
147
|
});
|
|
137
148
|
|
|
149
|
+
it('sessionStorage sets the URL', async () => {
|
|
150
|
+
sessionStorage.setItem(
|
|
151
|
+
`grid-${sessionStorageKey}`,
|
|
152
|
+
JSON.stringify({
|
|
153
|
+
pageSize: 25,
|
|
154
|
+
})
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
const el = await fixture<IxGrid>(html`<ix-grid
|
|
158
|
+
.columns=${columns}
|
|
159
|
+
.rows=${rows}
|
|
160
|
+
session-storage-key=${sessionStorageKey}
|
|
161
|
+
></ix-grid>`);
|
|
162
|
+
|
|
163
|
+
await elementUpdated(el);
|
|
164
|
+
|
|
165
|
+
expect(location.href).to.contain('size=25');
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('page and page size from URL sets sessionStorage', async () => {
|
|
169
|
+
sessionStorage.setItem(
|
|
170
|
+
`grid-${sessionStorageKey}`,
|
|
171
|
+
JSON.stringify({
|
|
172
|
+
pageSize: 10,
|
|
173
|
+
})
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
const el = await fixture<IxGrid>(html`<ix-grid
|
|
177
|
+
.columns=${columns}
|
|
178
|
+
.rows=${rows}
|
|
179
|
+
.readParamsFromURL=${true}
|
|
180
|
+
session-storage-key=${sessionStorageKey}
|
|
181
|
+
></ix-grid>`);
|
|
182
|
+
|
|
183
|
+
const url = '?sort=lastName&order=asc&page=2&size=25';
|
|
184
|
+
|
|
185
|
+
history.pushState(null, '', `${location.pathname}${url}`);
|
|
186
|
+
await elementUpdated(el);
|
|
187
|
+
|
|
188
|
+
const sessionData = JSON.parse(
|
|
189
|
+
sessionStorage.getItem(`grid-${sessionStorageKey}`) || '{}'
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
expect(sessionData.pageSize).to.be.eq(25);
|
|
193
|
+
});
|
|
194
|
+
|
|
138
195
|
it('should set sort, order, page, page size and filters in the URL when addParamsToURL is set to true', async () => {
|
|
139
196
|
const columnsWithFilters = [
|
|
140
197
|
{
|
|
@@ -166,6 +223,7 @@ describe('IxGrid', () => {
|
|
|
166
223
|
const el = await fixture<IxGrid>(html`<ix-grid
|
|
167
224
|
.columns=${columnsWithFilters}
|
|
168
225
|
.addParamsToURL=${true}
|
|
226
|
+
session-storage-key=${sessionStorageKey}
|
|
169
227
|
></ix-grid>`);
|
|
170
228
|
|
|
171
229
|
const rowFilter = el.shadowRoot?.querySelector('ix-grid-row-filter');
|
|
@@ -230,6 +288,7 @@ describe('IxGrid', () => {
|
|
|
230
288
|
.rows=${[]}
|
|
231
289
|
.addParamsToURL=${true}
|
|
232
290
|
.preservedQueryParamKeys=${['userId', 'token']}
|
|
291
|
+
session-storage-key=${sessionStorageKey}
|
|
233
292
|
></ix-grid>
|
|
234
293
|
`);
|
|
235
294
|
|