@internetarchive/collection-browser 3.5.2-alpha-webdev8164.0 → 3.5.2-webdev-8162.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +27 -27
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.prettierignore +1 -1
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/src/app-root.js +606 -606
  10. package/dist/src/app-root.js.map +1 -1
  11. package/dist/src/collection-facets/facets-template.js +23 -28
  12. package/dist/src/collection-facets/facets-template.js.map +1 -1
  13. package/dist/src/collection-facets/more-facets-content.d.ts +8 -34
  14. package/dist/src/collection-facets/more-facets-content.js +159 -358
  15. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  16. package/dist/src/tiles/grid/collection-tile.js +77 -77
  17. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  18. package/dist/src/tiles/grid/item-tile.js +137 -137
  19. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  20. package/dist/src/tiles/models.js.map +1 -1
  21. package/dist/src/tiles/tile-dispatcher.js +215 -215
  22. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  23. package/dist/test/collection-browser.test.js +1 -1
  24. package/dist/test/collection-browser.test.js.map +1 -1
  25. package/dist/test/collection-facets/more-facets-content.test.js +31 -137
  26. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
  27. package/eslint.config.mjs +53 -53
  28. package/index.html +24 -24
  29. package/local.archive.org.cert +86 -86
  30. package/local.archive.org.key +27 -27
  31. package/package.json +121 -119
  32. package/renovate.json +6 -6
  33. package/src/app-root.ts +1140 -1140
  34. package/src/collection-facets/facets-template.ts +83 -88
  35. package/src/collection-facets/more-facets-content.ts +642 -856
  36. package/src/tiles/grid/collection-tile.ts +163 -163
  37. package/src/tiles/grid/item-tile.ts +340 -340
  38. package/src/tiles/models.ts +1 -1
  39. package/src/tiles/tile-dispatcher.ts +517 -517
  40. package/test/collection-browser.test.ts +1 -1
  41. package/test/collection-facets/more-facets-content.test.ts +231 -378
  42. package/tsconfig.json +25 -25
  43. package/web-dev-server.config.mjs +30 -30
  44. package/web-test-runner.config.mjs +52 -41
  45. package/.husky/pre-commit +0 -4
@@ -3,7 +3,6 @@ import { html } from 'lit';
3
3
  import '../../src/collection-facets/more-facets-content';
4
4
  import { MockSearchService } from '../mocks/mock-search-service';
5
5
  import { MockAnalyticsHandler } from '../mocks/mock-analytics-handler';
6
- import { Aggregation } from '@internetarchive/search-service';
7
6
  const selectedFacetsGroup = {
8
7
  title: 'Media Type',
9
8
  key: 'mediatype',
@@ -39,28 +38,21 @@ describe('More facets content', () => {
39
38
  await el.updateComplete;
40
39
  expect(el.shadowRoot?.querySelector('.facets-loader')).to.exist;
41
40
  });
42
- it('should NOT render pagination when facet count < 1000', async () => {
41
+ it('should render pagination for more facets', async () => {
43
42
  const searchService = new MockSearchService();
44
- const el = await fixture(html `<more-facets-content
45
- .searchService=${searchService}
43
+ const el = await fixture(html `<more-facets-content
44
+ .searchService=${searchService}
46
45
  ></more-facets-content>`);
47
46
  el.facetKey = 'year';
48
- el.query = 'more-facets'; // Produces a response with 45 aggregations (< 1000)
47
+ el.query = 'more-facets'; // Produces a response with 40+ aggregations for multiple pages
49
48
  await el.updateComplete;
50
49
  await aTimeout(50); // Give it a moment to perform the (mock) search query after the initial update
51
- // Verify pagination component is NOT present (horizontal scroll mode)
52
- expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.not.exist;
53
- // Verify horizontal scroll mode CSS class is applied
54
- expect(el.shadowRoot?.querySelector('.facets-content.horizontal-scroll-mode')).to.exist;
55
- // Verify footer still exists with buttons
56
- expect(el.shadowRoot?.querySelector('.footer')).to.exist;
57
- expect(el.shadowRoot?.querySelector('.btn-cancel')).to.exist;
58
- expect(el.shadowRoot?.querySelector('.btn-submit')).to.exist;
50
+ expect(el.shadowRoot?.querySelectorAll('more-facets-pagination')).to.exist;
59
51
  });
60
52
  it('query for more facets content using search service', async () => {
61
53
  const searchService = new MockSearchService();
62
- const el = await fixture(html `<more-facets-content
63
- .searchService=${searchService}
54
+ const el = await fixture(html `<more-facets-content
55
+ .searchService=${searchService}
64
56
  ></more-facets-content>`);
65
57
  el.facetKey = 'collection';
66
58
  el.query = 'collection-aggregations';
@@ -69,12 +61,12 @@ describe('More facets content', () => {
69
61
  });
70
62
  it('queries for more facets using search service within a collection (no query)', async () => {
71
63
  const searchService = new MockSearchService();
72
- const el = await fixture(html `<more-facets-content
73
- .searchService=${searchService}
64
+ const el = await fixture(html `<more-facets-content
65
+ .searchService=${searchService}
74
66
  .pageSpecifierParams=${{
75
67
  pageType: 'collection_details',
76
68
  pageTarget: 'foobar',
77
- }}
69
+ }}
78
70
  ></more-facets-content>`);
79
71
  el.facetKey = 'subject';
80
72
  await el.updateComplete;
@@ -83,12 +75,12 @@ describe('More facets content', () => {
83
75
  });
84
76
  it('queries for more facets using search service within a collection (with query)', async () => {
85
77
  const searchService = new MockSearchService();
86
- const el = await fixture(html `<more-facets-content
87
- .searchService=${searchService}
78
+ const el = await fixture(html `<more-facets-content
79
+ .searchService=${searchService}
88
80
  .pageSpecifierParams=${{
89
81
  pageType: 'collection_details',
90
82
  pageTarget: 'foobar',
91
- }}
83
+ }}
92
84
  ></more-facets-content>`);
93
85
  el.facetKey = 'subject';
94
86
  el.query = 'title:hello';
@@ -98,9 +90,9 @@ describe('More facets content', () => {
98
90
  });
99
91
  it('filter raw selectedFacets object', async () => {
100
92
  const searchService = new MockSearchService();
101
- const el = await fixture(html `<more-facets-content
102
- .searchService=${searchService}
103
- .selectedFacets=${selectedFacetsGroup}
93
+ const el = await fixture(html `<more-facets-content
94
+ .searchService=${searchService}
95
+ .selectedFacets=${selectedFacetsGroup}
104
96
  ></more-facets-content>`);
105
97
  el.facetKey = 'collection';
106
98
  el.query = 'title:hello';
@@ -109,11 +101,11 @@ describe('More facets content', () => {
109
101
  });
110
102
  it('combines selectedFacets and aggregationFacets and renders on modal', async () => {
111
103
  const searchService = new MockSearchService();
112
- const el = await fixture(html `<more-facets-content
113
- .facetKey=${'year'}
114
- .query=${'more-facets'}
115
- .searchService=${searchService}
116
- .selectedFacets=${yearSelectedFacets}
104
+ const el = await fixture(html `<more-facets-content
105
+ .facetKey=${'year'}
106
+ .query=${'more-facets'}
107
+ .searchService=${searchService}
108
+ .selectedFacets=${yearSelectedFacets}
117
109
  ></more-facets-content>`);
118
110
  const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
119
111
  expect(facetsTemplate).to.exist;
@@ -132,11 +124,11 @@ describe('More facets content', () => {
132
124
  it('cancel button clicked event', async () => {
133
125
  const searchService = new MockSearchService();
134
126
  const mockAnalyticsHandler = new MockAnalyticsHandler();
135
- const el = await fixture(html `<more-facets-content
136
- .facetKey=${'collection'}
137
- .query=${'collection-aggregations'}
138
- .searchService=${searchService}
139
- .analyticsHandler=${mockAnalyticsHandler}
127
+ const el = await fixture(html `<more-facets-content
128
+ .facetKey=${'collection'}
129
+ .query=${'collection-aggregations'}
130
+ .searchService=${searchService}
131
+ .analyticsHandler=${mockAnalyticsHandler}
140
132
  ></more-facets-content>`);
141
133
  // select cancel button
142
134
  const cancelButton = el.shadowRoot?.querySelector('.footer > .btn-cancel');
@@ -149,11 +141,11 @@ describe('More facets content', () => {
149
141
  it('facet apply button clicked event', async () => {
150
142
  const searchService = new MockSearchService();
151
143
  const mockAnalyticsHandler = new MockAnalyticsHandler();
152
- const el = await fixture(html `<more-facets-content
153
- .facetKey=${'collection'}
154
- .query=${'collection-aggregations'}
155
- .searchService=${searchService}
156
- .analyticsHandler=${mockAnalyticsHandler}
144
+ const el = await fixture(html `<more-facets-content
145
+ .facetKey=${'collection'}
146
+ .query=${'collection-aggregations'}
147
+ .searchService=${searchService}
148
+ .analyticsHandler=${mockAnalyticsHandler}
157
149
  ></more-facets-content>`);
158
150
  // select submit button
159
151
  const submitButton = el.shadowRoot?.querySelector('.footer > .btn-submit');
@@ -163,103 +155,5 @@ describe('More facets content', () => {
163
155
  expect(mockAnalyticsHandler.callAction).to.equal('applyMoreFacetsModal');
164
156
  expect(mockAnalyticsHandler.callLabel).to.equal('collection');
165
157
  });
166
- it('should have horizontal scrolling enabled', async () => {
167
- const searchService = new MockSearchService();
168
- const el = await fixture(html `<more-facets-content
169
- .searchService=${searchService}
170
- ></more-facets-content>`);
171
- el.facetKey = 'year';
172
- el.query = 'more-facets';
173
- await el.updateComplete;
174
- await aTimeout(50);
175
- const facetsContent = el.shadowRoot?.querySelector('.facets-content');
176
- const styles = window.getComputedStyle(facetsContent);
177
- expect(styles.overflowX).to.equal('auto');
178
- expect(styles.overflowY).to.equal('hidden');
179
- });
180
- it('should have horizontal container wrapper', async () => {
181
- const searchService = new MockSearchService();
182
- const el = await fixture(html `<more-facets-content
183
- .searchService=${searchService}
184
- ></more-facets-content>`);
185
- el.facetKey = 'year';
186
- el.query = 'more-facets';
187
- await el.updateComplete;
188
- await aTimeout(50);
189
- const container = el.shadowRoot?.querySelector('.facets-horizontal-container');
190
- expect(container).to.exist;
191
- const facetsTemplate = container?.querySelector('facets-template');
192
- expect(facetsTemplate).to.exist;
193
- });
194
- it('should render pagination when facet count >= 1000', async () => {
195
- // Manually create aggregations with 1000+ facets
196
- const buckets = [];
197
- for (let i = 0; i < 1000; i++) {
198
- buckets.push({ key: `value-${i}`, doc_count: i + 1 });
199
- }
200
- const el = await fixture(html `<more-facets-content
201
- .facetKey=${'subject'}
202
- .selectedFacets=${{
203
- mediatype: {},
204
- lending: {},
205
- year: {},
206
- subject: {},
207
- collection: {},
208
- creator: {},
209
- language: {},
210
- }}
211
- ></more-facets-content>`);
212
- // @ts-expect-error - accessing private property for testing
213
- el.aggregations = {
214
- subject: new Aggregation({ buckets }),
215
- };
216
- el.facetsLoading = false;
217
- await el.updateComplete;
218
- // Verify pagination component IS present
219
- expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.exist;
220
- // Verify pagination mode CSS class is applied
221
- expect(el.shadowRoot?.querySelector('.facets-content.pagination-mode')).to
222
- .exist;
223
- // Verify horizontal container wrapper does NOT exist in pagination mode
224
- expect(el.shadowRoot?.querySelector('.facets-horizontal-container')).to.not
225
- .exist;
226
- });
227
- it('pagination page change should send analytics event', async () => {
228
- const mockAnalyticsHandler = new MockAnalyticsHandler();
229
- // Manually create aggregations with 1000+ facets
230
- const buckets = [];
231
- for (let i = 0; i < 1000; i++) {
232
- buckets.push({ key: `value-${i}`, doc_count: i + 1 });
233
- }
234
- const el = await fixture(html `<more-facets-content
235
- .facetKey=${'subject'}
236
- .selectedFacets=${{
237
- mediatype: {},
238
- lending: {},
239
- year: {},
240
- subject: {},
241
- collection: {},
242
- creator: {},
243
- language: {},
244
- }}
245
- .analyticsHandler=${mockAnalyticsHandler}
246
- ></more-facets-content>`);
247
- // @ts-expect-error - accessing private property for testing
248
- el.aggregations = {
249
- subject: new Aggregation({ buckets }),
250
- };
251
- el.facetsLoading = false;
252
- await el.updateComplete;
253
- // Get the pagination component
254
- const pagination = el.shadowRoot?.querySelector('more-facets-pagination');
255
- expect(pagination).to.exist;
256
- // Simulate clicking page 2
257
- pagination.currentPage = 2;
258
- await pagination.updateComplete;
259
- // Verify analytics event was sent
260
- expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');
261
- expect(mockAnalyticsHandler.callAction).to.equal('moreFacetsPageChange');
262
- expect(mockAnalyticsHandler.callLabel).to.equal('2');
263
- });
264
158
  });
265
159
  //# sourceMappingURL=more-facets-content.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"more-facets-content.test.js","sourceRoot":"","sources":["../../../test/collection-facets/more-facets-content.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { aTimeout, expect, fixture } from '@open-wc/testing';\r\nimport { html } from 'lit';\r\nimport type { MoreFacetsContent } from '../../src/collection-facets/more-facets-content';\r\nimport '../../src/collection-facets/more-facets-content';\r\nimport { MockSearchService } from '../mocks/mock-search-service';\r\nimport { MockAnalyticsHandler } from '../mocks/mock-analytics-handler';\r\nimport type { FacetsTemplate } from '../../src/collection-facets/facets-template';\r\nimport type { SelectedFacets } from '../../src/models';\r\nimport { Aggregation, type Bucket } from '@internetarchive/search-service';\r\n\r\nconst selectedFacetsGroup = {\r\n title: 'Media Type',\r\n key: 'mediatype',\r\n buckets: [\r\n { displayText: 'audio', key: 'audio', count: 1001, state: 'none' },\r\n { displayText: 'movies', key: 'movies', count: 901, state: 'none' },\r\n { displayText: 'texts', key: 'texts', count: 2101, state: 'none' },\r\n { displayText: 'data', key: 'data', count: 230, state: 'none' },\r\n { displayText: 'web', key: 'web', count: 453, state: 'none' },\r\n ],\r\n};\r\n\r\nconst yearSelectedFacets: SelectedFacets = {\r\n mediatype: {},\r\n lending: {},\r\n year: {\r\n '2000': { key: '2000', count: 5, state: 'selected' },\r\n },\r\n subject: {},\r\n collection: {},\r\n creator: {},\r\n language: {},\r\n};\r\n\r\ndescribe('More facets content', () => {\r\n it('should render more facets template', async () => {\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content></more-facets-content>`,\r\n );\r\n\r\n el.facetsLoading = false;\r\n await el.updateComplete;\r\n\r\n expect(el.shadowRoot?.querySelector('.facets-content')).to.exist;\r\n });\r\n\r\n it('should render more facets loader template', async () => {\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content></more-facets-content>`,\r\n );\r\n\r\n el.facetsLoading = true;\r\n await el.updateComplete;\r\n\r\n expect(el.shadowRoot?.querySelector('.facets-loader')).to.exist;\r\n });\r\n\r\n it('should NOT render pagination when facet count < 1000', async () => {\r\n const searchService = new MockSearchService();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .searchService=${searchService}\r\n ></more-facets-content>`,\r\n );\r\n\r\n el.facetKey = 'year';\r\n el.query = 'more-facets'; // Produces a response with 45 aggregations (< 1000)\r\n await el.updateComplete;\r\n await aTimeout(50); // Give it a moment to perform the (mock) search query after the initial update\r\n\r\n // Verify pagination component is NOT present (horizontal scroll mode)\r\n expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.not.exist;\r\n\r\n // Verify horizontal scroll mode CSS class is applied\r\n expect(\r\n el.shadowRoot?.querySelector('.facets-content.horizontal-scroll-mode'),\r\n ).to.exist;\r\n\r\n // Verify footer still exists with buttons\r\n expect(el.shadowRoot?.querySelector('.footer')).to.exist;\r\n expect(el.shadowRoot?.querySelector('.btn-cancel')).to.exist;\r\n expect(el.shadowRoot?.querySelector('.btn-submit')).to.exist;\r\n });\r\n\r\n it('query for more facets content using search service', async () => {\r\n const searchService = new MockSearchService();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .searchService=${searchService}\r\n ></more-facets-content>`,\r\n );\r\n\r\n el.facetKey = 'collection';\r\n el.query = 'collection-aggregations';\r\n await el.updateComplete;\r\n\r\n expect(searchService.searchParams?.query).to.equal(\r\n 'collection-aggregations',\r\n );\r\n });\r\n\r\n it('queries for more facets using search service within a collection (no query)', async () => {\r\n const searchService = new MockSearchService();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .searchService=${searchService}\r\n .pageSpecifierParams=${{\r\n pageType: 'collection_details',\r\n pageTarget: 'foobar',\r\n }}\r\n ></more-facets-content>`,\r\n );\r\n\r\n el.facetKey = 'subject';\r\n await el.updateComplete;\r\n\r\n expect(searchService.searchParams?.query).to.be.empty;\r\n expect(searchService.searchParams?.pageTarget).to.equal('foobar');\r\n });\r\n\r\n it('queries for more facets using search service within a collection (with query)', async () => {\r\n const searchService = new MockSearchService();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .searchService=${searchService}\r\n .pageSpecifierParams=${{\r\n pageType: 'collection_details',\r\n pageTarget: 'foobar',\r\n }}\r\n ></more-facets-content>`,\r\n );\r\n\r\n el.facetKey = 'subject';\r\n el.query = 'title:hello';\r\n await el.updateComplete;\r\n\r\n expect(searchService.searchParams?.query).to.equal('title:hello');\r\n expect(searchService.searchParams?.pageTarget).to.equal('foobar');\r\n });\r\n\r\n it('filter raw selectedFacets object', async () => {\r\n const searchService = new MockSearchService();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .searchService=${searchService}\r\n .selectedFacets=${selectedFacetsGroup}\r\n ></more-facets-content>`,\r\n );\r\n\r\n el.facetKey = 'collection';\r\n el.query = 'title:hello';\r\n await el.updateComplete;\r\n\r\n expect(searchService.searchParams?.query).to.equal('title:hello');\r\n });\r\n\r\n it('combines selectedFacets and aggregationFacets and renders on modal', async () => {\r\n const searchService = new MockSearchService();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .facetKey=${'year'}\r\n .query=${'more-facets'}\r\n .searchService=${searchService}\r\n .selectedFacets=${yearSelectedFacets}\r\n ></more-facets-content>`,\r\n );\r\n\r\n const facetsTemplate = el.shadowRoot?.querySelector(\r\n 'facets-template',\r\n ) as FacetsTemplate;\r\n expect(facetsTemplate).to.exist;\r\n\r\n const { facetGroup } = facetsTemplate;\r\n expect(facetGroup?.key).to.equal('year');\r\n expect(facetGroup?.title).to.equal('Year');\r\n\r\n // First bucket is the one that was included in the selected facets\r\n const firstBucket = facetGroup?.buckets[0];\r\n expect(firstBucket?.key).to.equal('2000');\r\n expect(firstBucket?.count).to.equal(5);\r\n\r\n // Second bucket is the most recent year, since year facets default to descending order of year\r\n const secondBucket = facetGroup?.buckets[1];\r\n expect(secondBucket?.key).to.equal('2024');\r\n expect(secondBucket?.count).to.equal(5);\r\n });\r\n\r\n it('cancel button clicked event', async () => {\r\n const searchService = new MockSearchService();\r\n const mockAnalyticsHandler = new MockAnalyticsHandler();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .facetKey=${'collection'}\r\n .query=${'collection-aggregations'}\r\n .searchService=${searchService}\r\n .analyticsHandler=${mockAnalyticsHandler}\r\n ></more-facets-content>`,\r\n );\r\n\r\n // select cancel button\r\n const cancelButton = el.shadowRoot?.querySelector(\r\n '.footer > .btn-cancel',\r\n ) as HTMLButtonElement;\r\n expect(cancelButton).to.exist;\r\n cancelButton?.click();\r\n\r\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\r\n expect(mockAnalyticsHandler.callAction).to.equal('closeMoreFacetsModal');\r\n expect(mockAnalyticsHandler.callLabel).to.equal('collection');\r\n });\r\n\r\n it('facet apply button clicked event', async () => {\r\n const searchService = new MockSearchService();\r\n const mockAnalyticsHandler = new MockAnalyticsHandler();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .facetKey=${'collection'}\r\n .query=${'collection-aggregations'}\r\n .searchService=${searchService}\r\n .analyticsHandler=${mockAnalyticsHandler}\r\n ></more-facets-content>`,\r\n );\r\n\r\n // select submit button\r\n const submitButton = el.shadowRoot?.querySelector(\r\n '.footer > .btn-submit',\r\n ) as HTMLButtonElement;\r\n expect(submitButton).to.exist;\r\n submitButton?.click();\r\n\r\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\r\n expect(mockAnalyticsHandler.callAction).to.equal('applyMoreFacetsModal');\r\n expect(mockAnalyticsHandler.callLabel).to.equal('collection');\r\n });\r\n\r\n it('should have horizontal scrolling enabled', async () => {\r\n const searchService = new MockSearchService();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .searchService=${searchService}\r\n ></more-facets-content>`,\r\n );\r\n\r\n el.facetKey = 'year';\r\n el.query = 'more-facets';\r\n await el.updateComplete;\r\n await aTimeout(50);\r\n\r\n const facetsContent = el.shadowRoot?.querySelector(\r\n '.facets-content',\r\n ) as HTMLElement;\r\n const styles = window.getComputedStyle(facetsContent);\r\n\r\n expect(styles.overflowX).to.equal('auto');\r\n expect(styles.overflowY).to.equal('hidden');\r\n });\r\n\r\n it('should have horizontal container wrapper', async () => {\r\n const searchService = new MockSearchService();\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .searchService=${searchService}\r\n ></more-facets-content>`,\r\n );\r\n\r\n el.facetKey = 'year';\r\n el.query = 'more-facets';\r\n await el.updateComplete;\r\n await aTimeout(50);\r\n\r\n const container = el.shadowRoot?.querySelector(\r\n '.facets-horizontal-container',\r\n );\r\n expect(container).to.exist;\r\n\r\n const facetsTemplate = container?.querySelector('facets-template');\r\n expect(facetsTemplate).to.exist;\r\n });\r\n\r\n it('should render pagination when facet count >= 1000', async () => {\r\n // Manually create aggregations with 1000+ facets\r\n const buckets: Bucket[] = [];\r\n for (let i = 0; i < 1000; i++) {\r\n buckets.push({ key: `value-${i}`, doc_count: i + 1 });\r\n }\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .facetKey=${'subject'}\r\n .selectedFacets=${{\r\n mediatype: {},\r\n lending: {},\r\n year: {},\r\n subject: {},\r\n collection: {},\r\n creator: {},\r\n language: {},\r\n }}\r\n ></more-facets-content>`,\r\n );\r\n\r\n // @ts-expect-error - accessing private property for testing\r\n el.aggregations = {\r\n subject: new Aggregation({ buckets }),\r\n };\r\n el.facetsLoading = false;\r\n await el.updateComplete;\r\n\r\n // Verify pagination component IS present\r\n expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.exist;\r\n\r\n // Verify pagination mode CSS class is applied\r\n expect(el.shadowRoot?.querySelector('.facets-content.pagination-mode')).to\r\n .exist;\r\n\r\n // Verify horizontal container wrapper does NOT exist in pagination mode\r\n expect(el.shadowRoot?.querySelector('.facets-horizontal-container')).to.not\r\n .exist;\r\n });\r\n\r\n it('pagination page change should send analytics event', async () => {\r\n const mockAnalyticsHandler = new MockAnalyticsHandler();\r\n\r\n // Manually create aggregations with 1000+ facets\r\n const buckets: Bucket[] = [];\r\n for (let i = 0; i < 1000; i++) {\r\n buckets.push({ key: `value-${i}`, doc_count: i + 1 });\r\n }\r\n\r\n const el = await fixture<MoreFacetsContent>(\r\n html`<more-facets-content\r\n .facetKey=${'subject'}\r\n .selectedFacets=${{\r\n mediatype: {},\r\n lending: {},\r\n year: {},\r\n subject: {},\r\n collection: {},\r\n creator: {},\r\n language: {},\r\n }}\r\n .analyticsHandler=${mockAnalyticsHandler}\r\n ></more-facets-content>`,\r\n );\r\n\r\n // @ts-expect-error - accessing private property for testing\r\n el.aggregations = {\r\n subject: new Aggregation({ buckets }),\r\n };\r\n el.facetsLoading = false;\r\n await el.updateComplete;\r\n\r\n // Get the pagination component\r\n const pagination = el.shadowRoot?.querySelector(\r\n 'more-facets-pagination',\r\n ) as any;\r\n expect(pagination).to.exist;\r\n\r\n // Simulate clicking page 2\r\n pagination.currentPage = 2;\r\n await pagination.updateComplete;\r\n\r\n // Verify analytics event was sent\r\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\r\n expect(mockAnalyticsHandler.callAction).to.equal('moreFacetsPageChange');\r\n expect(mockAnalyticsHandler.callLabel).to.equal('2');\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"more-facets-content.test.js","sourceRoot":"","sources":["../../../test/collection-facets/more-facets-content.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { aTimeout, expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { MoreFacetsContent } from '../../src/collection-facets/more-facets-content';\nimport '../../src/collection-facets/more-facets-content';\nimport { MockSearchService } from '../mocks/mock-search-service';\nimport { MockAnalyticsHandler } from '../mocks/mock-analytics-handler';\nimport type { FacetsTemplate } from '../../src/collection-facets/facets-template';\nimport type { SelectedFacets } from '../../src/models';\n\nconst selectedFacetsGroup = {\n title: 'Media Type',\n key: 'mediatype',\n buckets: [\n { displayText: 'audio', key: 'audio', count: 1001, state: 'none' },\n { displayText: 'movies', key: 'movies', count: 901, state: 'none' },\n { displayText: 'texts', key: 'texts', count: 2101, state: 'none' },\n { displayText: 'data', key: 'data', count: 230, state: 'none' },\n { displayText: 'web', key: 'web', count: 453, state: 'none' },\n ],\n};\n\nconst yearSelectedFacets: SelectedFacets = {\n mediatype: {},\n lending: {},\n year: {\n '2000': { key: '2000', count: 5, state: 'selected' },\n },\n subject: {},\n collection: {},\n creator: {},\n language: {},\n};\n\ndescribe('More facets content', () => {\n it('should render more facets template', async () => {\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content></more-facets-content>`,\n );\n\n el.facetsLoading = false;\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.facets-content')).to.exist;\n });\n\n it('should render more facets loader template', async () => {\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content></more-facets-content>`,\n );\n\n el.facetsLoading = true;\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.facets-loader')).to.exist;\n });\n\n it('should render pagination for more facets', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets'; // Produces a response with 40+ aggregations for multiple pages\n await el.updateComplete;\n await aTimeout(50); // Give it a moment to perform the (mock) search query after the initial update\n\n expect(el.shadowRoot?.querySelectorAll('more-facets-pagination')).to.exist;\n });\n\n it('query for more facets content using search service', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'collection';\n el.query = 'collection-aggregations';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal(\n 'collection-aggregations',\n );\n });\n\n it('queries for more facets using search service within a collection (no query)', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .pageSpecifierParams=${{\n pageType: 'collection_details',\n pageTarget: 'foobar',\n }}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.be.empty;\n expect(searchService.searchParams?.pageTarget).to.equal('foobar');\n });\n\n it('queries for more facets using search service within a collection (with query)', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .pageSpecifierParams=${{\n pageType: 'collection_details',\n pageTarget: 'foobar',\n }}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'title:hello';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('title:hello');\n expect(searchService.searchParams?.pageTarget).to.equal('foobar');\n });\n\n it('filter raw selectedFacets object', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${selectedFacetsGroup}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'collection';\n el.query = 'title:hello';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('title:hello');\n });\n\n it('combines selectedFacets and aggregationFacets and renders on modal', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'year'}\n .query=${'more-facets'}\n .searchService=${searchService}\n .selectedFacets=${yearSelectedFacets}\n ></more-facets-content>`,\n );\n\n const facetsTemplate = el.shadowRoot?.querySelector(\n 'facets-template',\n ) as FacetsTemplate;\n expect(facetsTemplate).to.exist;\n\n const { facetGroup } = facetsTemplate;\n expect(facetGroup?.key).to.equal('year');\n expect(facetGroup?.title).to.equal('Year');\n\n // First bucket is the one that was included in the selected facets\n const firstBucket = facetGroup?.buckets[0];\n expect(firstBucket?.key).to.equal('2000');\n expect(firstBucket?.count).to.equal(5);\n\n // Second bucket is the most recent year, since year facets default to descending order of year\n const secondBucket = facetGroup?.buckets[1];\n expect(secondBucket?.key).to.equal('2024');\n expect(secondBucket?.count).to.equal(5);\n });\n\n it('cancel button clicked event', async () => {\n const searchService = new MockSearchService();\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'collection'}\n .query=${'collection-aggregations'}\n .searchService=${searchService}\n .analyticsHandler=${mockAnalyticsHandler}\n ></more-facets-content>`,\n );\n\n // select cancel button\n const cancelButton = el.shadowRoot?.querySelector(\n '.footer > .btn-cancel',\n ) as HTMLButtonElement;\n expect(cancelButton).to.exist;\n cancelButton?.click();\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('closeMoreFacetsModal');\n expect(mockAnalyticsHandler.callLabel).to.equal('collection');\n });\n\n it('facet apply button clicked event', async () => {\n const searchService = new MockSearchService();\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'collection'}\n .query=${'collection-aggregations'}\n .searchService=${searchService}\n .analyticsHandler=${mockAnalyticsHandler}\n ></more-facets-content>`,\n );\n\n // select submit button\n const submitButton = el.shadowRoot?.querySelector(\n '.footer > .btn-submit',\n ) as HTMLButtonElement;\n expect(submitButton).to.exist;\n submitButton?.click();\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('applyMoreFacetsModal');\n expect(mockAnalyticsHandler.callLabel).to.equal('collection');\n });\n});\n"]}
package/eslint.config.mjs CHANGED
@@ -1,53 +1,53 @@
1
- import typescriptEslint from '@typescript-eslint/eslint-plugin';
2
- import html from 'eslint-plugin-html';
3
- import tsParser from '@typescript-eslint/parser';
4
- import path from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
- import js from '@eslint/js';
7
- import { FlatCompat } from '@eslint/eslintrc';
8
-
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = path.dirname(__filename);
11
- const compat = new FlatCompat({
12
- baseDirectory: __dirname,
13
- recommendedConfig: js.configs.recommended,
14
- allConfig: js.configs.all,
15
- });
16
-
17
- export default [
18
- ...compat.extends('plugin:@typescript-eslint/recommended'),
19
- {
20
- plugins: {
21
- '@typescript-eslint': typescriptEslint,
22
- html,
23
- },
24
-
25
- languageOptions: {
26
- parser: tsParser,
27
- },
28
-
29
- settings: {
30
- 'import/resolver': {
31
- node: {
32
- extensions: ['.ts', '.tsx'],
33
- moduleDirectory: ['node_modules', 'src', 'demo'],
34
- },
35
- },
36
- },
37
-
38
- rules: {
39
- '@typescript-eslint/no-unsafe-function-type': 'warn',
40
- '@typescript-eslint/no-unused-vars': 'warn',
41
- '@typescript-eslint/no-explicit-any': 'warn',
42
- },
43
- },
44
- {
45
- ignores: ['**/*.js', '**/*.mjs', '**/*.d.ts'],
46
- },
47
- {
48
- files: ['**/*.test.ts'],
49
- rules: {
50
- '@typescript-eslint/no-unused-expressions': 'off',
51
- },
52
- },
53
- ];
1
+ import typescriptEslint from '@typescript-eslint/eslint-plugin';
2
+ import html from 'eslint-plugin-html';
3
+ import tsParser from '@typescript-eslint/parser';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import js from '@eslint/js';
7
+ import { FlatCompat } from '@eslint/eslintrc';
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ const compat = new FlatCompat({
12
+ baseDirectory: __dirname,
13
+ recommendedConfig: js.configs.recommended,
14
+ allConfig: js.configs.all,
15
+ });
16
+
17
+ export default [
18
+ ...compat.extends('plugin:@typescript-eslint/recommended'),
19
+ {
20
+ plugins: {
21
+ '@typescript-eslint': typescriptEslint,
22
+ html,
23
+ },
24
+
25
+ languageOptions: {
26
+ parser: tsParser,
27
+ },
28
+
29
+ settings: {
30
+ 'import/resolver': {
31
+ node: {
32
+ extensions: ['.ts', '.tsx'],
33
+ moduleDirectory: ['node_modules', 'src', 'demo'],
34
+ },
35
+ },
36
+ },
37
+
38
+ rules: {
39
+ '@typescript-eslint/no-unsafe-function-type': 'warn',
40
+ '@typescript-eslint/no-unused-vars': 'warn',
41
+ '@typescript-eslint/no-explicit-any': 'warn',
42
+ },
43
+ },
44
+ {
45
+ ignores: ['**/*.js', '**/*.mjs', '**/*.d.ts'],
46
+ },
47
+ {
48
+ files: ['**/*.test.ts'],
49
+ rules: {
50
+ '@typescript-eslint/no-unused-expressions': 'off',
51
+ },
52
+ },
53
+ ];
package/index.html CHANGED
@@ -1,24 +1,24 @@
1
- <!doctype html>
2
- <html lang="en-GB">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <style>
7
- html {
8
- font-size: 10px; /* This is to match petabox's base font size */
9
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
10
- }
11
-
12
- body {
13
- background: #F5F5F7;
14
- color: #2C2C2C;
15
- line-height: 1.42857143; /* Same as production */
16
- }
17
- </style>
18
-
19
- </head>
20
- <body>
21
- <app-root></app-root>
22
- <script type="module" src="./src/app-root"></script>
23
- </body>
24
- </html>
1
+ <!doctype html>
2
+ <html lang="en-GB">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ html {
8
+ font-size: 10px; /* This is to match petabox's base font size */
9
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
10
+ }
11
+
12
+ body {
13
+ background: #F5F5F7;
14
+ color: #2C2C2C;
15
+ line-height: 1.42857143; /* Same as production */
16
+ }
17
+ </style>
18
+
19
+ </head>
20
+ <body>
21
+ <app-root></app-root>
22
+ <script type="module" src="./src/app-root"></script>
23
+ </body>
24
+ </html>