@digital-realty/ix-grid 1.3.9 → 1.3.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ix-grid-row-filter.test.js","sourceRoot":"","sources":["../../src/test/ix-grid-row-filter.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { aTimeout, elementUpdated, expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport sinon from 'sinon';\nimport { Filter, IxGridRowFilter } from '../components/IxGridRowFilter.js';\n\nconst columns = [\n {\n name: 'firstName',\n header: 'First name',\n filterable: true,\n filterOperators: ['contains', 'equals'],\n },\n {\n name: 'lastName',\n header: 'Last name',\n filterable: true,\n filterOperators: ['contains', 'equals'],\n },\n {\n name: 'middleName',\n header: 'Middle name',\n filterable: false,\n filterOperators: ['contains', 'equals'],\n },\n {\n name: 'email',\n header: 'Email',\n filterable: true,\n filterOperators: ['contains', 'equals'],\n },\n];\n\nconst filters: Filter[] = [\n {\n columnField: 'firstName',\n operatorValue: 'contains',\n value: 'John',\n },\n];\n\ndescribe('IxGridRowFilter', () => {\n it('should render the grid row filter', async () => {\n const el = await fixture(\n html`<ix-grid-row-filter .columns=${columns}></ix-grid-row-filter>`\n );\n\n expect(el).to.be.instanceOf(IxGridRowFilter);\n });\n\n it('renders and popluates the grid row filter', async () => {\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columns}\n .filters=${filters}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLInputElement;\n\n openMenu.click();\n\n await elementUpdated(el);\n\n const columnOptions = el.shadowRoot?.querySelectorAll(\n 'select[data-v=\"firstName\"] option'\n );\n\n expect(columnOptions?.length).to.equal(3);\n\n const filterOperatorInput = el.shadowRoot?.querySelector(\n 'select.filterOperatorInput'\n ) as HTMLSelectElement;\n\n filterOperatorInput.value = 'equals';\n\n filterOperatorInput.dispatchEvent(\n new Event('change', {\n bubbles: true,\n cancelable: true,\n })\n );\n\n await elementUpdated(el);\n\n const selectedOperator = filterOperatorInput.querySelector(\n 'option[selected]'\n ) as HTMLOptionElement;\n\n expect(selectedOperator?.value).to.equal('equals');\n });\n\n it('should debounce the filter input', async () => {\n const debounceTime = 100;\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columns}\n .filters=${filters}\n .filterValueChangeDebounceTime=${debounceTime}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLInputElement;\n\n openMenu.click();\n\n await elementUpdated(el);\n\n const filterInput = el.shadowRoot?.querySelector(\n 'div.filterValueField input'\n ) as HTMLInputElement;\n\n const debouncedOnFilterValueChangeSpy = sinon.spy(\n el,\n <any>'debouncedOnFilterValueChange'\n );\n const onFilterValueChangeSpy = sinon.spy(el, <any>'onfilterValueChange');\n\n for (let i = 0; i < 5; i += 1) {\n filterInput.dispatchEvent(\n new InputEvent('input', {\n bubbles: true,\n cancelable: true,\n composed: true,\n })\n );\n }\n expect(debouncedOnFilterValueChangeSpy).to.have.been.called;\n expect(onFilterValueChangeSpy).to.not.have.been.called;\n\n await aTimeout(debounceTime);\n\n expect(onFilterValueChangeSpy).to.have.been.calledOnce;\n });\n\n describe('Filter type input', () => {\n it('should render a string input control for non-supplied data type', async () => {\n const columnsWithDataType = [\n {\n name: 'firstName',\n header: 'First name',\n filterable: true,\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const filterInput = el.shadowRoot?.querySelector(\n 'div.filterValueField input'\n );\n expect(filterInput).to.exist;\n expect(filterInput).to.be.instanceOf(HTMLInputElement);\n });\n\n it('should render a string input control for string data type', async () => {\n const columnsWithDataType = [\n {\n name: 'firstName',\n header: 'First name',\n filterable: true,\n dataType: 'string',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const filterInput = el.shadowRoot?.querySelector(\n 'div.filterValueField input'\n );\n expect(filterInput).to.exist;\n expect(filterInput).to.be.instanceOf(HTMLInputElement);\n });\n\n it('should render a date input control for dateTime data type', async () => {\n const columnsWithDataType = [\n {\n name: 'createdDate',\n header: 'Created Date',\n filterable: true,\n dataType: 'dateTime',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const dateInput = el.shadowRoot?.querySelector(\n 'div.filterValueField ix-date'\n );\n expect(dateInput).to.exist;\n expect(dateInput).to.be.instanceOf(HTMLElement);\n });\n\n it('should render nothing when an unknown data type is used', async () => {\n const columnsWithDataType = [\n {\n name: 'unknownTypeField',\n header: 'Unknown Type',\n filterable: true,\n dataType: 'unknownType',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const inputField = el.shadowRoot?.querySelector(\n 'div.filterValueField input'\n );\n expect(inputField).to.be.null;\n });\n\n it('should build filter from URL when readParamsFromURL is True', async () => {\n const columnsWithDataType = [\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 el = (await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n .readParamsFromURL=${true}\n ></ix-grid-row-filter>`\n )) as any;\n\n const url = 'firstName_contains=John&createdDate_equals=2021-09-01';\n\n history.pushState(null, '', `${location.pathname}?${url}`);\n el.firstUpdated();\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const formFilters = el.shadowRoot?.querySelectorAll('.filter-form');\n\n const filter1Name = formFilters[0]\n .querySelector('.filterColumnField')\n .querySelector('select')\n .attributes.getNamedItem('data-v')?.value;\n const filter1Operator = formFilters[0]\n .querySelector('.filterOperatorField')\n .querySelector('select')\n .attributes.getNamedItem('data-v')?.value;\n const filter1Value = formFilters[0]\n .querySelector('.filterValueField')\n .querySelector('input').value;\n\n const filter2Name = formFilters[1]\n .querySelector('.filterColumnField')\n .querySelector('select')\n .attributes.getNamedItem('data-v')?.value;\n const filter2Operator = formFilters[1]\n .querySelector('.filterOperatorField')\n .querySelector('select')\n .attributes.getNamedItem('data-v')?.value;\n const filter2Value = formFilters[1]\n .querySelector('.filterValueField')\n .querySelector('ix-date').value;\n\n expect(formFilters.length).to.be.eq(2);\n expect(filter1Name).to.be.eq('firstName');\n expect(filter1Operator).to.be.eq('contains');\n expect(filter1Value).to.be.eq('John');\n expect(filter2Name).to.be.eq('createdDate');\n expect(filter2Operator).to.be.eq('equals');\n expect(filter2Value).to.be.eq('2021-09-01');\n });\n\n it('should use maxDate for date inputs if provided', async () => {\n const columnsWithDataType = [\n {\n name: 'dateField',\n header: 'Date Field',\n filterable: true,\n filterOperators: ['='],\n dataType: 'dateTime',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n .maxDate=${'2025-12-31'}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const dateInput = el.shadowRoot?.querySelector(\n 'div.filterValueField ix-date'\n );\n expect(dateInput).to.exist;\n expect(dateInput?.getAttribute('max')).to.equal('2025-12-31');\n });\n\n it('should fallback to default maxDate if maxDate is not provided', async () => {\n const columnsWithDataType = [\n {\n name: 'dateField',\n header: 'Date Field',\n filterable: true,\n filterOperators: ['='],\n dataType: 'dateTime',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const dateInput = el.shadowRoot?.querySelector(\n 'div.filterValueField ix-date'\n );\n expect(dateInput).to.exist;\n const today = new Date().toISOString().split('T')[0];\n expect(dateInput?.getAttribute('max')).to.equal(today);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"ix-grid-row-filter.test.js","sourceRoot":"","sources":["../../src/test/ix-grid-row-filter.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { aTimeout, elementUpdated, expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport sinon from 'sinon';\nimport { Filter, IxGridRowFilter } from '../components/IxGridRowFilter.js';\n\nconst columns = [\n {\n name: 'firstName',\n header: 'First name',\n filterable: true,\n filterOperators: ['contains', 'equals'],\n },\n {\n name: 'lastName',\n header: 'Last name',\n filterable: true,\n filterOperators: ['contains', 'equals'],\n },\n {\n name: 'middleName',\n header: 'Middle name',\n filterable: false,\n filterOperators: ['contains', 'equals'],\n },\n {\n name: 'email',\n header: 'Email',\n filterable: true,\n filterOperators: ['contains', 'equals'],\n },\n];\n\nconst filters: Filter[] = [\n {\n columnField: 'firstName',\n operatorValue: 'contains',\n value: 'John',\n },\n];\n\ndescribe('IxGridRowFilter', () => {\n it('should render the grid row filter', async () => {\n const el = await fixture(\n html`<ix-grid-row-filter .columns=${columns}></ix-grid-row-filter>`\n );\n\n expect(el).to.be.instanceOf(IxGridRowFilter);\n });\n\n it('renders and popluates the grid row filter', async () => {\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columns}\n .filters=${filters}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLInputElement;\n\n openMenu.click();\n\n await elementUpdated(el);\n\n const columnOptions = el.shadowRoot?.querySelectorAll(\n 'select[data-v=\"firstName\"] option'\n );\n\n expect(columnOptions?.length).to.equal(3);\n\n const filterOperatorInput = el.shadowRoot?.querySelector(\n 'select.filterOperatorInput'\n ) as HTMLSelectElement;\n\n filterOperatorInput.value = 'equals';\n\n filterOperatorInput.dispatchEvent(\n new Event('change', {\n bubbles: true,\n cancelable: true,\n })\n );\n\n await elementUpdated(el);\n\n const selectedOperator = filterOperatorInput.querySelector(\n 'option[selected]'\n ) as HTMLOptionElement;\n\n expect(selectedOperator?.value).to.equal('equals');\n });\n\n it('should debounce the filter input', async () => {\n const debounceTime = 100;\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columns}\n .filters=${filters}\n .filterValueChangeDebounceTime=${debounceTime}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLInputElement;\n\n openMenu.click();\n\n await elementUpdated(el);\n\n const filterInput = el.shadowRoot?.querySelector(\n 'div.filterValueField input'\n ) as HTMLInputElement;\n\n const debouncedOnFilterValueChangeSpy = sinon.spy(\n el,\n <any>'debouncedOnFilterValueChange'\n );\n const onFilterValueChangeSpy = sinon.spy(el, <any>'onfilterValueChange');\n\n for (let i = 0; i < 5; i += 1) {\n filterInput.dispatchEvent(\n new InputEvent('input', {\n bubbles: true,\n cancelable: true,\n composed: true,\n })\n );\n }\n expect(debouncedOnFilterValueChangeSpy).to.have.been.called;\n expect(onFilterValueChangeSpy).to.not.have.been.called;\n\n await aTimeout(debounceTime);\n\n expect(onFilterValueChangeSpy).to.have.been.calledOnce;\n });\n\n describe('Filter type input', () => {\n it('should render a string input control for non-supplied data type', async () => {\n const columnsWithDataType = [\n {\n name: 'firstName',\n header: 'First name',\n filterable: true,\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const filterInput = el.shadowRoot?.querySelector(\n 'div.filterValueField input'\n );\n expect(filterInput).to.exist;\n expect(filterInput).to.be.instanceOf(HTMLInputElement);\n });\n\n it('should render a string input control for string data type', async () => {\n const columnsWithDataType = [\n {\n name: 'firstName',\n header: 'First name',\n filterable: true,\n dataType: 'string',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const filterInput = el.shadowRoot?.querySelector(\n 'div.filterValueField input'\n );\n expect(filterInput).to.exist;\n expect(filterInput).to.be.instanceOf(HTMLInputElement);\n });\n\n it('should render a date input control for dateTime data type', async () => {\n const columnsWithDataType = [\n {\n name: 'createdDate',\n header: 'Created Date',\n filterable: true,\n dataType: 'dateTime',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const dateInput = el.shadowRoot?.querySelector(\n 'div.filterValueField ix-date'\n );\n expect(dateInput).to.exist;\n expect(dateInput).to.be.instanceOf(HTMLElement);\n });\n\n it('should render nothing when an unknown data type is used', async () => {\n const columnsWithDataType = [\n {\n name: 'unknownTypeField',\n header: 'Unknown Type',\n filterable: true,\n dataType: 'unknownType',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const inputField = el.shadowRoot?.querySelector(\n 'div.filterValueField input'\n );\n expect(inputField).to.be.null;\n });\n\n it('should build filter from URL when readParamsFromURL is True', async () => {\n const columnsWithDataType = [\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 el = (await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n .readParamsFromURL=${true}\n ></ix-grid-row-filter>`\n )) as any;\n\n const url = 'firstName_contains=John&createdDate_equals=2021-09-01';\n\n history.pushState(null, '', `${location.pathname}?${url}`);\n el.firstUpdated();\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const formFilters = el.shadowRoot?.querySelectorAll('.filter-form');\n\n const filter1Name = formFilters[0]\n .querySelector('.filterColumnField')\n .querySelector('select')\n .attributes.getNamedItem('data-v')?.value;\n const filter1Operator = formFilters[0]\n .querySelector('.filterOperatorField')\n .querySelector('select')\n .attributes.getNamedItem('data-v')?.value;\n const filter1Value = formFilters[0]\n .querySelector('.filterValueField')\n .querySelector('input').value;\n\n const filter2Name = formFilters[1]\n .querySelector('.filterColumnField')\n .querySelector('select')\n .attributes.getNamedItem('data-v')?.value;\n const filter2Operator = formFilters[1]\n .querySelector('.filterOperatorField')\n .querySelector('select')\n .attributes.getNamedItem('data-v')?.value;\n const filter2Value = formFilters[1]\n .querySelector('.filterValueField')\n .querySelector('ix-date').value;\n\n expect(formFilters.length).to.be.eq(2);\n expect(filter1Name).to.be.eq('firstName');\n expect(filter1Operator).to.be.eq('contains');\n expect(filter1Value).to.be.eq('John');\n expect(filter2Name).to.be.eq('createdDate');\n expect(filter2Operator).to.be.eq('equals');\n expect(filter2Value).to.be.eq('2021-09-01');\n });\n\n it('should use maxDate for date inputs if provided', async () => {\n const columnsWithDataType = [\n {\n name: 'dateField',\n header: 'Date Field',\n filterable: true,\n filterOperators: ['='],\n dataType: 'dateTime',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n .maxDate=${'2025-12-31'}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const dateInput = el.shadowRoot?.querySelector(\n 'div.filterValueField ix-date'\n );\n expect(dateInput).to.exist;\n expect(dateInput?.getAttribute('max')).to.equal('2025-12-31');\n });\n\n it('should fallback to default maxDate if maxDate is not provided', async () => {\n const columnsWithDataType = [\n {\n name: 'dateField',\n header: 'Date Field',\n filterable: true,\n filterOperators: ['='],\n dataType: 'dateTime',\n },\n ];\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const dateInput = el.shadowRoot?.querySelector(\n 'div.filterValueField ix-date'\n );\n expect(dateInput).to.exist;\n const today = new Date().toISOString().split('T')[0];\n expect(dateInput?.getAttribute('max')).to.equal(today);\n });\n\n it('should render ix-date-next if \"useNewDatePicker\" is true', async () => {\n const columnsWithDataType = [\n {\n name: 'dateField',\n header: 'Date Field',\n filterable: true,\n filterOperators: ['='],\n dataType: 'dateTime',\n },\n ];\n\n const el = await fixture(\n html`<ix-grid-row-filter\n .columns=${columnsWithDataType}\n .useNewDatePicker=${true}\n ></ix-grid-row-filter>`\n );\n\n const openMenu = el.shadowRoot?.querySelector(\n '.filter-button'\n ) as HTMLElement;\n openMenu?.click();\n await elementUpdated(el);\n\n const dateInput = el.shadowRoot?.querySelector(\n 'div.filterValueField ix-date-next'\n );\n expect(dateInput).to.exist;\n });\n });\n});\n"]}
@@ -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":"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","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.9",
6
+ "version": "1.3.11",
7
7
  "type": "module",
8
8
  "main": "dist/index.js",
9
9
  "module": "dist/index.js",
@@ -30,8 +30,9 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@digital-realty/grid": "^1.1.2",
33
- "@digital-realty/ix-button": "^3.4.2",
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.6",
35
36
  "@digital-realty/ix-icon": "^1.2.2",
36
37
  "@digital-realty/ix-icon-button": "^1.2.2",
37
38
  "@digital-realty/ix-menu": "^1.2.2",
@@ -112,5 +113,5 @@
112
113
  "prettier --write"
113
114
  ]
114
115
  },
115
- "gitHead": "e370cda9ea15770dbf3a247c5eb12e4294e76109"
116
+ "gitHead": "c3c75d912f2c2d41e7f9ea4ff7c250c021dfb586"
116
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,11 @@ 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
+
165
+ @property({ type: Boolean }) useNewDatePicker = false;
166
+
158
167
  @state() private filters: Filter[] = [];
159
168
 
160
169
  @state() isColumnsReordering = false;
@@ -163,6 +172,8 @@ export class IxGrid extends LitElement {
163
172
 
164
173
  @state() displayColumns: Column[] = [];
165
174
 
175
+ @state() sessionStorageData: SessionStorageData | undefined = undefined;
176
+
166
177
  private defaultFilterKeys = ['sort', 'order', 'page', 'size'];
167
178
 
168
179
  private initialised = false;
@@ -216,10 +227,12 @@ export class IxGrid extends LitElement {
216
227
  connectedCallback() {
217
228
  super.connectedCallback?.();
218
229
  window.addEventListener('popstate', this.handlePopState);
230
+ window.addEventListener('beforeunload', this.handleUnload);
219
231
  }
220
232
 
221
233
  disconnectedCallback() {
222
234
  window.removeEventListener('popstate', this.handlePopState);
235
+ window.removeEventListener('beforeunload', this.handleUnload);
223
236
  super.disconnectedCallback?.();
224
237
  }
225
238
 
@@ -228,9 +241,15 @@ export class IxGrid extends LitElement {
228
241
  this.dispatchChangeEvent();
229
242
  };
230
243
 
244
+ private handleUnload = () => {
245
+ sessionStorage.removeItem(`urlPageSizeRead`);
246
+ };
247
+
231
248
  private updateSearchParamsFromUri(
232
249
  rebuildFiltersFromUri: boolean = false
233
250
  ): void {
251
+ // If the grid is not visible, do not update from search params
252
+ if(this.grid.getBoundingClientRect().width === 0) return;
234
253
  if (this.readParamsFromURL) {
235
254
  const url = new URL(window.location.href);
236
255
  const searchParams = new URLSearchParams(url.search);
@@ -250,7 +269,17 @@ export class IxGrid extends LitElement {
250
269
  }
251
270
 
252
271
  if (size) {
253
- this.pageSize = parseInt(size, 10) || this.defaultPageSize;
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
+ }
254
283
  }
255
284
 
256
285
  if (rebuildFiltersFromUri) {
@@ -314,12 +343,57 @@ export class IxGrid extends LitElement {
314
343
  this.checkLocalStorageUpdate();
315
344
  this.initialised = true;
316
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
+
317
359
  super.update(changedProperties);
318
360
  }
319
361
 
320
362
  firstUpdated() {
321
363
  this.updateSearchParamsFromUri();
322
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
+ }
323
397
  }
324
398
 
325
399
  private checkLocalStorageUpdate(): void {
@@ -736,6 +810,7 @@ export class IxGrid extends LitElement {
736
810
  .filterValueChangeDebounceTime}
737
811
  .readParamsFromURL=${this.readParamsFromURL}
738
812
  .maxDate=${this.filterMaxDate}
813
+ .useNewDatePicker=${this.useNewDatePicker}
739
814
  @rowFilter=${(e: CustomEvent) => {
740
815
  this.filters = e.detail.filters;
741
816
  if (e.detail.resetPage) {
@@ -848,6 +923,9 @@ export class IxGrid extends LitElement {
848
923
  @updatePagination=${(e: CustomEvent) => {
849
924
  this.page = e.detail.page;
850
925
  this.pageSize = e.detail.pageSize;
926
+ this.updateSessionStorage({
927
+ pageSize: this.pageSize,
928
+ });
851
929
  this.updatePage();
852
930
  }}
853
931
  ></ix-pagination>
@@ -1,9 +1,10 @@
1
1
  import '@digital-realty/ix-button/ix-button.js';
2
2
  import '@digital-realty/ix-date/ix-date.js';
3
+ import '@digital-realty/ix-date-next/ix-date-next.js';
3
4
  import '@digital-realty/ix-icon-button/ix-icon-button.js';
4
5
  import '@digital-realty/ix-icon/ix-icon.js';
5
6
  import '@digital-realty/ix-select/ix-select.js';
6
- import { formatDate } from 'date-fns/format.js';
7
+ import { format, formatDate } from 'date-fns/format.js';
7
8
  import { LitElement, html, nothing } from 'lit';
8
9
  import { customElement, property, state } from 'lit/decorators.js';
9
10
  import { repeat } from 'lit/directives/repeat.js';
@@ -29,6 +30,8 @@ export class IxGridRowFilter extends LitElement {
29
30
 
30
31
  @property({ type: Boolean }) readParamsFromURL = false;
31
32
 
33
+ @property({ type: Boolean }) useNewDatePicker = false;
34
+
32
35
  @property({ type: String }) maxDate: string = formatDate(
33
36
  new Date(),
34
37
  'yyyy-MM-dd'
@@ -255,12 +258,19 @@ export class IxGridRowFilter extends LitElement {
255
258
  }
256
259
  return html` <p>${this.activeFilters.length} ${copy.activeFilter}</p>
257
260
  <ul>
258
- ${this.activeFilters.map(
259
- filter => html`<li>
261
+ ${this.activeFilters.map(filter => {
262
+ let displayValue = filter.value;
263
+
264
+ if (filter.dataType === 'dateTime' && this.useNewDatePicker) {
265
+ const date = this.shadowRoot?.querySelector(`ix-date-next`) as any;
266
+ displayValue = format(displayValue, date.format);
267
+ }
268
+
269
+ return html`<li>
260
270
  ${this.formatCamelCaseToEnglish(filter.columnField)}
261
- ${filter.operatorValue} ${filter.value}
262
- </li>`
263
- )}
271
+ ${filter.operatorValue} ${displayValue}
272
+ </li>`;
273
+ })}
264
274
  </ul>`;
265
275
  }
266
276
 
@@ -278,15 +288,26 @@ export class IxGridRowFilter extends LitElement {
278
288
  }
279
289
 
280
290
  private renderDateInput(value: any, index: number) {
281
- return html` <ix-date
282
- data-testid=${`filterValueInput-${index}`}
283
- .value=${value.value}
284
- max=${this.maxDate}
285
- name="${value.columnField}-valueDate"
286
- .errorText=${this.fromDateErrorText}
287
- .onChanged=${e => this.onDatefilterValueChange(index, e)}
288
- >
289
- </ix-date>`;
291
+ return this.useNewDatePicker
292
+ ? html`<ix-date-next
293
+ data-testid=${`filterValueInput-${index}`}
294
+ .value=${value.value}
295
+ max=${this.maxDate}
296
+ name="${value.columnField}-valueDate"
297
+ showCalendarOnMouseDown="true"
298
+ .errorText=${this.fromDateErrorText}
299
+ .onChanged=${e => this.onDatefilterValueChange(index, e)}
300
+ >
301
+ </ix-date-next>`
302
+ : html`<ix-date
303
+ data-testid=${`filterValueInput-${index}`}
304
+ .value=${value.value}
305
+ max=${this.maxDate}
306
+ name="${value.columnField}-valueDate"
307
+ .errorText=${this.fromDateErrorText}
308
+ .onChanged=${e => this.onDatefilterValueChange(index, e)}
309
+ >
310
+ </ix-date>`;
290
311
  }
291
312
 
292
313
  private renderFilterInputControl(value: any, index: number) {
@@ -160,8 +160,14 @@ export const IxGridRowFilterStyles = css`
160
160
  flex-direction: column;
161
161
  align-items: baseline;
162
162
  height: 54px;
163
- justify-content: flex-end;
163
+ justify-content: space-between;
164
164
  font-family: var(--text-default-font, sans-serif);
165
+ white-space: wrap;
166
+
167
+ ix-date-next,
168
+ ix-date {
169
+ margin-top: 10px;
170
+ }
165
171
  }
166
172
 
167
173
  option {