@internetarchive/collection-browser 4.2.0-alpha-webdev8164.3 → 4.2.1-alpha-webdev7004.0

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 (88) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/.editorconfig +29 -29
  3. package/.github/workflows/ci.yml +27 -27
  4. package/.github/workflows/gh-pages-main.yml +39 -39
  5. package/.github/workflows/npm-publish.yml +39 -39
  6. package/.github/workflows/pr-preview.yml +38 -38
  7. package/.husky/pre-commit +1 -1
  8. package/.prettierignore +1 -1
  9. package/LICENSE +661 -661
  10. package/README.md +83 -83
  11. package/dist/src/app-root.js +4 -0
  12. package/dist/src/app-root.js.map +1 -1
  13. package/dist/src/collection-browser.js +32 -27
  14. package/dist/src/collection-browser.js.map +1 -1
  15. package/dist/src/collection-facets/facets-template.js +0 -5
  16. package/dist/src/collection-facets/facets-template.js.map +1 -1
  17. package/dist/src/collection-facets/more-facets-content.d.ts +8 -106
  18. package/dist/src/collection-facets/more-facets-content.js +103 -612
  19. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  20. package/dist/src/collection-facets/more-facets-pagination.d.ts +3 -12
  21. package/dist/src/collection-facets/more-facets-pagination.js +9 -71
  22. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -1
  23. package/dist/src/collection-facets/toggle-switch.js +0 -1
  24. package/dist/src/collection-facets/toggle-switch.js.map +1 -1
  25. package/dist/src/collection-facets.js +9 -10
  26. package/dist/src/collection-facets.js.map +1 -1
  27. package/dist/src/data-source/collection-browser-data-source.d.ts +7 -0
  28. package/dist/src/data-source/collection-browser-data-source.js +27 -10
  29. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  30. package/dist/src/mediatype/mediatype-config.js +1 -1
  31. package/dist/src/mediatype/mediatype-config.js.map +1 -1
  32. package/dist/src/models.d.ts +12 -2
  33. package/dist/src/models.js +13 -8
  34. package/dist/src/models.js.map +1 -1
  35. package/dist/src/restoration-state-handler.js +9 -3
  36. package/dist/src/restoration-state-handler.js.map +1 -1
  37. package/dist/src/tiles/hover/hover-pane-controller.js +2 -1
  38. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
  39. package/dist/src/tiles/tile-dispatcher.d.ts +6 -0
  40. package/dist/src/tiles/tile-dispatcher.js +11 -3
  41. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  42. package/dist/test/collection-browser.test.js +72 -0
  43. package/dist/test/collection-browser.test.js.map +1 -1
  44. package/dist/test/collection-facets/more-facets-content.test.js +3 -212
  45. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
  46. package/dist/test/collection-facets/more-facets-pagination.test.js +3 -63
  47. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -1
  48. package/dist/test/data-source/collection-browser-data-source.test.js +52 -0
  49. package/dist/test/data-source/collection-browser-data-source.test.js.map +1 -1
  50. package/dist/test/mocks/mock-search-responses.d.ts +0 -5
  51. package/dist/test/mocks/mock-search-responses.js +0 -44
  52. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  53. package/dist/test/mocks/mock-search-service.js +1 -2
  54. package/dist/test/mocks/mock-search-service.js.map +1 -1
  55. package/dist/test/tiles/tile-dispatcher.test.js +14 -0
  56. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
  57. package/dist/test/tiles/tile-mediatype-icon.test.js +4 -4
  58. package/dist/test/tiles/tile-mediatype-icon.test.js.map +1 -1
  59. package/eslint.config.mjs +53 -53
  60. package/index.html +24 -24
  61. package/local.archive.org.cert +86 -86
  62. package/local.archive.org.key +27 -27
  63. package/package.json +120 -121
  64. package/renovate.json +6 -6
  65. package/src/app-root.ts +4 -0
  66. package/src/collection-browser.ts +43 -36
  67. package/src/collection-facets/facets-template.ts +0 -5
  68. package/src/collection-facets/more-facets-content.ts +113 -662
  69. package/src/collection-facets/more-facets-pagination.ts +10 -84
  70. package/src/collection-facets/toggle-switch.ts +0 -1
  71. package/src/collection-facets.ts +13 -10
  72. package/src/data-source/collection-browser-data-source.ts +31 -10
  73. package/src/mediatype/mediatype-config.ts +1 -1
  74. package/src/models.ts +30 -8
  75. package/src/restoration-state-handler.ts +7 -3
  76. package/src/tiles/hover/hover-pane-controller.ts +2 -1
  77. package/src/tiles/tile-dispatcher.ts +12 -3
  78. package/test/collection-browser.test.ts +105 -0
  79. package/test/collection-facets/more-facets-content.test.ts +4 -326
  80. package/test/collection-facets/more-facets-pagination.test.ts +3 -87
  81. package/test/data-source/collection-browser-data-source.test.ts +62 -0
  82. package/test/mocks/mock-search-responses.ts +0 -48
  83. package/test/mocks/mock-search-service.ts +0 -2
  84. package/test/tiles/tile-dispatcher.test.ts +17 -0
  85. package/test/tiles/tile-mediatype-icon.test.ts +4 -4
  86. package/tsconfig.json +25 -25
  87. package/web-dev-server.config.mjs +30 -30
  88. package/web-test-runner.config.mjs +52 -52
@@ -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 { getDefaultSelectedFacets, } from '../../src/models';
7
6
  const selectedFacetsGroup = {
8
7
  title: 'Media Type',
9
8
  key: 'mediatype',
@@ -39,23 +38,16 @@ 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
43
  const el = await fixture(html `<more-facets-content
45
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();
@@ -163,206 +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
- const searchService = new MockSearchService();
196
- const el = await fixture(html `<more-facets-content
197
- .searchService=${searchService}
198
- .selectedFacets=${getDefaultSelectedFacets()}
199
- ></more-facets-content>`);
200
- el.facetKey = 'subject';
201
- el.query = 'large-facets'; // Produces a response with 1100 aggregations (>= 1000)
202
- await el.updateComplete;
203
- await aTimeout(50);
204
- // Verify pagination component IS present
205
- expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.exist;
206
- // Verify pagination mode CSS class is applied
207
- expect(el.shadowRoot?.querySelector('.facets-content.pagination-mode')).to
208
- .exist;
209
- // Verify horizontal container wrapper does NOT exist in pagination mode
210
- expect(el.shadowRoot?.querySelector('.facets-horizontal-container')).to.not
211
- .exist;
212
- });
213
- it('pagination page change should send analytics event', async () => {
214
- const searchService = new MockSearchService();
215
- const mockAnalyticsHandler = new MockAnalyticsHandler();
216
- const el = await fixture(html `<more-facets-content
217
- .searchService=${searchService}
218
- .selectedFacets=${getDefaultSelectedFacets()}
219
- .analyticsHandler=${mockAnalyticsHandler}
220
- ></more-facets-content>`);
221
- el.facetKey = 'subject';
222
- el.query = 'large-facets'; // Produces a response with 1100 aggregations (>= 1000)
223
- await el.updateComplete;
224
- await aTimeout(50);
225
- // Get the pagination component
226
- const pagination = el.shadowRoot?.querySelector('more-facets-pagination');
227
- expect(pagination).to.exist;
228
- // Simulate clicking page 2
229
- pagination.currentPage = 2;
230
- await pagination.updateComplete;
231
- // Verify analytics event was sent
232
- expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');
233
- expect(mockAnalyticsHandler.callAction).to.equal('moreFacetsPageChange');
234
- expect(mockAnalyticsHandler.callLabel).to.equal('2');
235
- });
236
- it('should render clearable text input for filtering', async () => {
237
- const searchService = new MockSearchService();
238
- const el = await fixture(html `<more-facets-content
239
- .facetKey=${'year'}
240
- .query=${'more-facets'}
241
- .searchService=${searchService}
242
- .selectedFacets=${yearSelectedFacets}
243
- ></more-facets-content>`);
244
- await el.updateComplete;
245
- await aTimeout(50);
246
- // Verify the clearable text input component is present
247
- const clearableInput = el.shadowRoot?.querySelector('ia-clearable-text-input');
248
- expect(clearableInput).to.exist;
249
- });
250
- it('should clear filter text when clear event is dispatched', async () => {
251
- const searchService = new MockSearchService();
252
- const el = await fixture(html `<more-facets-content
253
- .facetKey=${'year'}
254
- .query=${'more-facets'}
255
- .searchService=${searchService}
256
- .selectedFacets=${yearSelectedFacets}
257
- ></more-facets-content>`);
258
- await el.updateComplete;
259
- await aTimeout(50);
260
- // Simulate typing into the clearable input by dispatching input event
261
- const clearableInput = el.shadowRoot?.querySelector('ia-clearable-text-input');
262
- expect(clearableInput).to.exist;
263
- clearableInput.value = 'test';
264
- clearableInput.dispatchEvent(new Event('input'));
265
- await el.updateComplete;
266
- // Dispatch clear event
267
- clearableInput.dispatchEvent(new CustomEvent('clear', { detail: 'test' }));
268
- await el.updateComplete;
269
- // Verify the filter was cleared
270
- expect(clearableInput.value).to.equal('');
271
- });
272
- describe('Modal container height constraint', () => {
273
- // Register a test wrapper element to simulate the modal's scroll container
274
- if (!customElements.get('test-scroll-wrapper')) {
275
- customElements.define('test-scroll-wrapper', class extends HTMLElement {
276
- constructor() {
277
- super();
278
- this.attachShadow({ mode: 'open' });
279
- this.shadowRoot.innerHTML = `
280
- <style>
281
- :host { display: block; }
282
- .content { overflow-y: auto; max-height: 300px; }
283
- </style>
284
- <div class="content"><slot></slot></div>
285
- `;
286
- }
287
- });
288
- }
289
- it('should constrain section height when inside a scroll container', async () => {
290
- const el = await fixture(html `
291
- <test-scroll-wrapper>
292
- <more-facets-content></more-facets-content>
293
- </test-scroll-wrapper>
294
- `);
295
- const mfc = el.querySelector('more-facets-content');
296
- mfc.facetsLoading = false;
297
- await mfc.updateComplete;
298
- // Wait for the constrainToScrollContainer rAF callback
299
- await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)));
300
- const section = mfc.shadowRoot?.querySelector('section#more-facets');
301
- // The section's inline max-height should be set when it would
302
- // overflow the 300px scroll container
303
- const sectionHeight = section.getBoundingClientRect().height;
304
- const wrapper = el.shadowRoot?.querySelector('.content');
305
- const wrapperBottom = wrapper.getBoundingClientRect().bottom;
306
- const sectionTop = section.getBoundingClientRect().top;
307
- const availableSpace = wrapperBottom - sectionTop;
308
- // The section should not exceed the available space in the container
309
- expect(sectionHeight).to.be.at.most(availableSpace + 1); // +1 for rounding
310
- });
311
- it('should not constrain section when no scroll container exists', async () => {
312
- const el = await fixture(html `<more-facets-content></more-facets-content>`);
313
- el.facetsLoading = false;
314
- await el.updateComplete;
315
- // Wait for the constrainToScrollContainer rAF callback
316
- await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)));
317
- const section = el.shadowRoot?.querySelector('section#more-facets');
318
- // No inline max-height should be set when there's no scroll container
319
- expect(section.style.maxHeight).to.equal('');
320
- });
321
- });
322
- describe('Horizontal scroll navigation arrows', () => {
323
- it('should use scroll-nav-container in horizontal scroll mode', async () => {
324
- const searchService = new MockSearchService();
325
- const el = await fixture(html `<more-facets-content
326
- .searchService=${searchService}
327
- ></more-facets-content>`);
328
- el.facetKey = 'year';
329
- el.query = 'more-facets'; // Produces < 1000 aggregations
330
- await el.updateComplete;
331
- await aTimeout(50);
332
- // Verify scroll navigation container exists in horizontal scroll mode
333
- expect(el.shadowRoot?.querySelector('.scroll-nav-container')).to.exist;
334
- // Verify horizontal container and facets-content exist inside it
335
- expect(el.shadowRoot?.querySelector('.scroll-nav-container .facets-content.horizontal-scroll-mode')).to.exist;
336
- expect(el.shadowRoot?.querySelector('.scroll-nav-container .facets-horizontal-container')).to.exist;
337
- });
338
- it('should NOT show scroll arrows in pagination mode', async () => {
339
- const searchService = new MockSearchService();
340
- const el = await fixture(html `<more-facets-content
341
- .searchService=${searchService}
342
- .selectedFacets=${getDefaultSelectedFacets()}
343
- ></more-facets-content>`);
344
- el.facetKey = 'subject';
345
- el.query = 'large-facets'; // Produces >= 1000 aggregations
346
- await el.updateComplete;
347
- await aTimeout(50);
348
- // Verify scroll navigation container does NOT exist
349
- expect(el.shadowRoot?.querySelector('.scroll-nav-container')).to.not
350
- .exist;
351
- expect(el.shadowRoot?.querySelector('.scroll-arrow')).to.not.exist;
352
- });
353
- it('should hide scroll arrows when content does not overflow', async () => {
354
- const searchService = new MockSearchService();
355
- const el = await fixture(html `<more-facets-content
356
- .searchService=${searchService}
357
- ></more-facets-content>`);
358
- el.facetKey = 'year';
359
- el.query = 'more-facets';
360
- await el.updateComplete;
361
- await aTimeout(50);
362
- // In test environment, there's no real layout so scrollWidth === clientWidth.
363
- // Arrows should be hidden when there's no horizontal overflow.
364
- expect(el.shadowRoot?.querySelector('.scroll-arrow')).to.not.exist;
365
- });
366
- });
367
158
  });
368
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';\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 {\n getDefaultSelectedFacets,\n type SelectedFacets,\n} 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 NOT render pagination when facet count < 1000', 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 45 aggregations (< 1000)\n await el.updateComplete;\n await aTimeout(50); // Give it a moment to perform the (mock) search query after the initial update\n\n // Verify pagination component is NOT present (horizontal scroll mode)\n expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.not.exist;\n\n // Verify horizontal scroll mode CSS class is applied\n expect(\n el.shadowRoot?.querySelector('.facets-content.horizontal-scroll-mode'),\n ).to.exist;\n\n // Verify footer still exists with buttons\n expect(el.shadowRoot?.querySelector('.footer')).to.exist;\n expect(el.shadowRoot?.querySelector('.btn-cancel')).to.exist;\n expect(el.shadowRoot?.querySelector('.btn-submit')).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 it('should have horizontal scrolling enabled', 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';\n await el.updateComplete;\n await aTimeout(50);\n\n const facetsContent = el.shadowRoot?.querySelector(\n '.facets-content',\n ) as HTMLElement;\n const styles = window.getComputedStyle(facetsContent);\n\n expect(styles.overflowX).to.equal('auto');\n expect(styles.overflowY).to.equal('hidden');\n });\n\n it('should have horizontal container wrapper', 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';\n await el.updateComplete;\n await aTimeout(50);\n\n const container = el.shadowRoot?.querySelector(\n '.facets-horizontal-container',\n );\n expect(container).to.exist;\n\n const facetsTemplate = container?.querySelector('facets-template');\n expect(facetsTemplate).to.exist;\n });\n\n it('should render pagination when facet count >= 1000', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${getDefaultSelectedFacets()}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'large-facets'; // Produces a response with 1100 aggregations (>= 1000)\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify pagination component IS present\n expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.exist;\n\n // Verify pagination mode CSS class is applied\n expect(el.shadowRoot?.querySelector('.facets-content.pagination-mode')).to\n .exist;\n\n // Verify horizontal container wrapper does NOT exist in pagination mode\n expect(el.shadowRoot?.querySelector('.facets-horizontal-container')).to.not\n .exist;\n });\n\n it('pagination page change should send analytics 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 .searchService=${searchService}\n .selectedFacets=${getDefaultSelectedFacets()}\n .analyticsHandler=${mockAnalyticsHandler}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'large-facets'; // Produces a response with 1100 aggregations (>= 1000)\n await el.updateComplete;\n await aTimeout(50);\n\n // Get the pagination component\n const pagination = el.shadowRoot?.querySelector(\n 'more-facets-pagination',\n ) as any;\n expect(pagination).to.exist;\n\n // Simulate clicking page 2\n pagination.currentPage = 2;\n await pagination.updateComplete;\n\n // Verify analytics event was sent\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('moreFacetsPageChange');\n expect(mockAnalyticsHandler.callLabel).to.equal('2');\n });\n\n it('should render clearable text input for filtering', 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 await el.updateComplete;\n await aTimeout(50);\n\n // Verify the clearable text input component is present\n const clearableInput = el.shadowRoot?.querySelector(\n 'ia-clearable-text-input',\n ) as HTMLElement;\n expect(clearableInput).to.exist;\n });\n\n it('should clear filter text when clear event is dispatched', 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 await el.updateComplete;\n await aTimeout(50);\n\n // Simulate typing into the clearable input by dispatching input event\n const clearableInput = el.shadowRoot?.querySelector(\n 'ia-clearable-text-input',\n ) as HTMLElement & { value: string };\n expect(clearableInput).to.exist;\n\n clearableInput.value = 'test';\n clearableInput.dispatchEvent(new Event('input'));\n await el.updateComplete;\n\n // Dispatch clear event\n clearableInput.dispatchEvent(new CustomEvent('clear', { detail: 'test' }));\n await el.updateComplete;\n\n // Verify the filter was cleared\n expect(clearableInput.value).to.equal('');\n });\n\n describe('Modal container height constraint', () => {\n // Register a test wrapper element to simulate the modal's scroll container\n if (!customElements.get('test-scroll-wrapper')) {\n customElements.define(\n 'test-scroll-wrapper',\n class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n this.shadowRoot!.innerHTML = `\n <style>\n :host { display: block; }\n .content { overflow-y: auto; max-height: 300px; }\n </style>\n <div class=\"content\"><slot></slot></div>\n `;\n }\n },\n );\n }\n\n it('should constrain section height when inside a scroll container', async () => {\n const el = await fixture<MoreFacetsContent>(html`\n <test-scroll-wrapper>\n <more-facets-content></more-facets-content>\n </test-scroll-wrapper>\n `);\n\n const mfc = el.querySelector('more-facets-content') as MoreFacetsContent;\n mfc.facetsLoading = false;\n await mfc.updateComplete;\n\n // Wait for the constrainToScrollContainer rAF callback\n await new Promise(r =>\n requestAnimationFrame(() => requestAnimationFrame(r)),\n );\n\n const section = mfc.shadowRoot?.querySelector(\n 'section#more-facets',\n ) as HTMLElement;\n\n // The section's inline max-height should be set when it would\n // overflow the 300px scroll container\n const sectionHeight = section.getBoundingClientRect().height;\n const wrapper = el.shadowRoot?.querySelector('.content') as HTMLElement;\n const wrapperBottom = wrapper.getBoundingClientRect().bottom;\n const sectionTop = section.getBoundingClientRect().top;\n const availableSpace = wrapperBottom - sectionTop;\n\n // The section should not exceed the available space in the container\n expect(sectionHeight).to.be.at.most(availableSpace + 1); // +1 for rounding\n });\n\n it('should not constrain section when no scroll container exists', 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 // Wait for the constrainToScrollContainer rAF callback\n await new Promise(r =>\n requestAnimationFrame(() => requestAnimationFrame(r)),\n );\n\n const section = el.shadowRoot?.querySelector(\n 'section#more-facets',\n ) as HTMLElement;\n\n // No inline max-height should be set when there's no scroll container\n expect(section.style.maxHeight).to.equal('');\n });\n });\n\n describe('Horizontal scroll navigation arrows', () => {\n it('should use scroll-nav-container in horizontal scroll mode', 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 < 1000 aggregations\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify scroll navigation container exists in horizontal scroll mode\n expect(el.shadowRoot?.querySelector('.scroll-nav-container')).to.exist;\n\n // Verify horizontal container and facets-content exist inside it\n expect(\n el.shadowRoot?.querySelector(\n '.scroll-nav-container .facets-content.horizontal-scroll-mode',\n ),\n ).to.exist;\n expect(\n el.shadowRoot?.querySelector(\n '.scroll-nav-container .facets-horizontal-container',\n ),\n ).to.exist;\n });\n\n it('should NOT show scroll arrows in pagination mode', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${getDefaultSelectedFacets()}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'large-facets'; // Produces >= 1000 aggregations\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify scroll navigation container does NOT exist\n expect(el.shadowRoot?.querySelector('.scroll-nav-container')).to.not\n .exist;\n expect(el.shadowRoot?.querySelector('.scroll-arrow')).to.not.exist;\n });\n\n it('should hide scroll arrows when content does not overflow', 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';\n await el.updateComplete;\n await aTimeout(50);\n\n // In test environment, there's no real layout so scrollWidth === clientWidth.\n // Arrows should be hidden when there's no horizontal overflow.\n expect(el.shadowRoot?.querySelector('.scroll-arrow')).to.not.exist;\n });\n });\n});\n"]}
1
+ {"version":3,"file":"more-facets-content.test.js","sourceRoot":"","sources":["../../../test/collection-facets/more-facets-content.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B,OAAO,iDAAiD,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAIvE,MAAM,mBAAmB,GAAG;IAC1B,KAAK,EAAE,YAAY;IACnB,GAAG,EAAE,WAAW;IAChB,OAAO,EAAE;QACP,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;QAClE,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;QACnE,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;QAClE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;QAC/D,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;KAC9D;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAmB;IACzC,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;IACX,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;KACrD;IACD,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;IACd,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA,6CAA6C,CAClD,CAAC;QAEF,EAAE,CAAC,aAAa,GAAG,KAAK,CAAC;QACzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA,6CAA6C,CAClD,CAAC;QAEF,EAAE,CAAC,aAAa,GAAG,IAAI,CAAC;QACxB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE9C,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;yBACe,aAAa;8BACR,CACzB,CAAC;QAEF,EAAE,CAAC,QAAQ,GAAG,MAAM,CAAC;QACrB,EAAE,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,+DAA+D;QACzF,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,+EAA+E;QAEnG,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE9C,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;yBACe,aAAa;8BACR,CACzB,CAAC;QAEF,EAAE,CAAC,QAAQ,GAAG,YAAY,CAAC;QAC3B,EAAE,CAAC,KAAK,GAAG,yBAAyB,CAAC;QACrC,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAChD,yBAAyB,CAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE9C,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;yBACe,aAAa;+BACP;YACrB,QAAQ,EAAE,oBAAoB;YAC9B,UAAU,EAAE,QAAQ;SACrB;8BACqB,CACzB,CAAC;QAEF,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC;QACxB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACtD,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE9C,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;yBACe,aAAa;+BACP;YACrB,QAAQ,EAAE,oBAAoB;YAC9B,UAAU,EAAE,QAAQ;SACrB;8BACqB,CACzB,CAAC;QAEF,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC;QACxB,EAAE,CAAC,KAAK,GAAG,aAAa,CAAC;QACzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE9C,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;yBACe,aAAa;0BACZ,mBAAmB;8BACf,CACzB,CAAC;QAEF,EAAE,CAAC,QAAQ,GAAG,YAAY,CAAC;QAC3B,EAAE,CAAC,KAAK,GAAG,aAAa,CAAC;QACzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE9C,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;oBACU,MAAM;iBACT,aAAa;yBACL,aAAa;0BACZ,kBAAkB;8BACd,CACzB,CAAC;QAEF,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,EAAE,aAAa,CACjD,iBAAiB,CACA,CAAC;QACpB,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAEhC,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC;QACtC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE3C,mEAAmE;QACnE,MAAM,WAAW,GAAG,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEvC,+FAA+F;QAC/F,MAAM,YAAY,GAAG,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAC9C,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAExD,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;oBACU,YAAY;iBACf,yBAAyB;yBACjB,aAAa;4BACV,oBAAoB;8BAClB,CACzB,CAAC;QAEF,uBAAuB;QACvB,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,EAAE,aAAa,CAC/C,uBAAuB,CACH,CAAC;QACvB,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC9B,YAAY,EAAE,KAAK,EAAE,CAAC;QAEtB,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACzE,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzE,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAC9C,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAExD,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;oBACU,YAAY;iBACf,yBAAyB;yBACjB,aAAa;4BACV,oBAAoB;8BAClB,CACzB,CAAC;QAEF,uBAAuB;QACvB,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,EAAE,aAAa,CAC/C,uBAAuB,CACH,CAAC;QACvB,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC9B,YAAY,EAAE,KAAK,EAAE,CAAC;QAEtB,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACzE,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzE,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","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"]}
@@ -67,7 +67,7 @@ describe('More facets pagination', () => {
67
67
  expect(el.currentPage).to.equal(2); // confirm current page
68
68
  const fake1 = sinon.fake();
69
69
  const fake2 = sinon.fake();
70
- el.updatePages = fake1;
70
+ el.observePageCount = fake1;
71
71
  el.emitPageClick = fake2;
72
72
  // select first page button
73
73
  const pageButton = el.shadowRoot?.querySelector('.page-numbers > button');
@@ -91,7 +91,7 @@ describe('More facets pagination', () => {
91
91
  expect(el.currentPage).to.equal(2); // confirm current page
92
92
  const fake1 = sinon.fake();
93
93
  const fake2 = sinon.fake();
94
- el.updatePages = fake1;
94
+ el.observePageCount = fake1;
95
95
  el.emitPageClick = fake2;
96
96
  // select first page button
97
97
  const rewindButton = el.shadowRoot?.querySelector('.facets-pagination > button.rewind');
@@ -111,7 +111,7 @@ describe('More facets pagination', () => {
111
111
  expect(el.currentPage).to.equal(5); // confirm current page
112
112
  const fake1 = sinon.fake();
113
113
  const fake2 = sinon.fake();
114
- el.updatePages = fake1;
114
+ el.observePageCount = fake1;
115
115
  el.emitPageClick = fake2;
116
116
  // select first page button
117
117
  const forwardButton = el.shadowRoot?.querySelector('.facets-pagination > button.forward');
@@ -122,65 +122,5 @@ describe('More facets pagination', () => {
122
122
  expect(el.currentPage).to.equal(6); // brings us forward 1 page
123
123
  });
124
124
  });
125
- describe('Compact mode', () => {
126
- it('shows all pages when size <= 3', async () => {
127
- const el = await fixture(html `<more-facets-pagination
128
- .size=${3}
129
- .compact=${true}
130
- ></more-facets-pagination>`);
131
- await el.updateComplete;
132
- expect(el.pages).to.deep.equal([1, 2, 3]);
133
- });
134
- it('shows first, prev, current, next, ..., last for middle page', async () => {
135
- const el = await fixture(html `<more-facets-pagination
136
- .size=${20}
137
- .currentPage=${10}
138
- .compact=${true}
139
- ></more-facets-pagination>`);
140
- await el.updateComplete;
141
- // first, ..., prev, current, next, ..., last
142
- expect(el.pages).to.deep.equal([1, 0, 9, 10, 11, 0, 20]);
143
- });
144
- it('shows correct pages when on page 1', async () => {
145
- const el = await fixture(html `<more-facets-pagination
146
- .size=${20}
147
- .currentPage=${1}
148
- .compact=${true}
149
- ></more-facets-pagination>`);
150
- await el.updateComplete;
151
- // first (current), next, ..., last
152
- expect(el.pages).to.deep.equal([1, 2, 0, 20]);
153
- });
154
- it('shows correct pages when on last page', async () => {
155
- const el = await fixture(html `<more-facets-pagination
156
- .size=${20}
157
- .currentPage=${20}
158
- .compact=${true}
159
- ></more-facets-pagination>`);
160
- await el.updateComplete;
161
- // first, ..., prev, last (current)
162
- expect(el.pages).to.deep.equal([1, 0, 19, 20]);
163
- });
164
- it('shows correct pages when on page 2', async () => {
165
- const el = await fixture(html `<more-facets-pagination
166
- .size=${20}
167
- .currentPage=${2}
168
- .compact=${true}
169
- ></more-facets-pagination>`);
170
- await el.updateComplete;
171
- // first, current, next, ..., last
172
- expect(el.pages).to.deep.equal([1, 2, 3, 0, 20]);
173
- });
174
- it('shows correct pages when on second-to-last page', async () => {
175
- const el = await fixture(html `<more-facets-pagination
176
- .size=${20}
177
- .currentPage=${19}
178
- .compact=${true}
179
- ></more-facets-pagination>`);
180
- await el.updateComplete;
181
- // first, ..., prev, current, last
182
- expect(el.pages).to.deep.equal([1, 0, 18, 19, 20]);
183
- });
184
- });
185
125
  });
186
126
  //# sourceMappingURL=more-facets-pagination.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"more-facets-pagination.test.js","sourceRoot":"","sources":["../../../test/collection-facets/more-facets-pagination.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, oneEvent } from '@open-wc/testing';\nimport { html } from 'lit';\nimport sinon from 'sinon';\nimport '../../src/collection-facets/more-facets-pagination';\nimport type { MoreFacetsPagination } from '../../src/collection-facets/more-facets-pagination';\n\nafterEach(() => {\n sinon.restore();\n});\n\ndescribe('More facets pagination', () => {\n describe('5 pages or less', () => {\n it('shows all pages', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination .size=${5}></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n const pageButtons = el.shadowRoot?.querySelectorAll(\n 'button[data-page]',\n ) as NodeList;\n expect(pageButtons.length).to.greaterThan(0);\n\n pageButtons.forEach((button, index) => {\n expect(button.textContent).to.contain(index + 1);\n });\n });\n });\n\n it('should render pagination template', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination .size=${10}></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.facets-pagination')).to.exist;\n expect(el.shadowRoot?.querySelector('.arrow-icon')).to.exist;\n });\n\n it('should render page numbers', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination .size=${3}></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n const pageNumberElement = el.shadowRoot?.querySelector('.page-numbers');\n expect(pageNumberElement).to.exist;\n expect(pageNumberElement?.querySelectorAll('button').length).to.equal(3);\n });\n\n it('check current page and total pages', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${4}\n .currentPage=${2}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n const pageNumberElement = el.shadowRoot?.querySelector('.page-numbers');\n expect(pageNumberElement).to.exist;\n expect(\n pageNumberElement\n ?.querySelectorAll('button')[1]\n .classList.contains('current'),\n ).to.be.true;\n expect(el.pages?.length).to.equal(4);\n });\n\n it('get page numbers based of size and currentPage', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${4}\n .currentPage=${2}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n expect(el.pages?.length).to.equal(4);\n });\n\n describe('Selecting a page', () => {\n it('fires event', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n setTimeout(() =>\n el.dispatchEvent(\n new CustomEvent('pageNumberClicked', { detail: { page: 15 } }),\n ),\n );\n const { detail } = await oneEvent(el, 'pageNumberClicked');\n expect(detail?.page).to.equal(15);\n });\n it('sets off side effects with `onChange`', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${'10'}\n .currentPage=${2}\n ></more-facets-pagination>`,\n );\n\n expect(el.currentPage).to.equal(2); // confirm current page\n\n const fake1 = sinon.fake();\n const fake2 = sinon.fake();\n el.updatePages = fake1;\n el.emitPageClick = fake2;\n\n // select first page button\n const pageButton = el.shadowRoot?.querySelector(\n '.page-numbers > button',\n ) as HTMLButtonElement;\n // confirm button isn't selected\n expect(pageButton.classList.contains('current')).to.be.false;\n pageButton.click();\n\n await el.updateComplete;\n\n expect(fake1.callCount).to.equal(1);\n expect(fake2.callCount).to.equal(1);\n expect(el.currentPage).to.equal(1); // brings us back to currentPage\n // confirm button is selected\n expect(pageButton.classList.contains('current')).to.be.true;\n });\n });\n\n describe('Using Arrows', () => {\n it('going backwards', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${'10'}\n .currentPage=${2}\n ></more-facets-pagination>`,\n );\n\n expect(el.currentPage).to.equal(2); // confirm current page\n\n const fake1 = sinon.fake();\n const fake2 = sinon.fake();\n el.updatePages = fake1;\n el.emitPageClick = fake2;\n\n // select first page button\n const rewindButton = el.shadowRoot?.querySelector(\n '.facets-pagination > button.rewind',\n ) as HTMLButtonElement;\n rewindButton.click();\n\n await el.updateComplete;\n\n expect(fake1.callCount).to.equal(1);\n expect(fake2.callCount).to.equal(1);\n expect(el.currentPage).to.equal(1); // brings us back 1 page\n // confirm button is selected\n expect(\n (\n el.shadowRoot?.querySelector(\n '.page-numbers > button[data-page=\"1\"]',\n ) as HTMLButtonElement\n ).classList.contains('current'),\n ).to.be.true;\n });\n\n it('going forwards', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${'10'}\n .currentPage=${5}\n ></more-facets-pagination>`,\n );\n\n expect(el.currentPage).to.equal(5); // confirm current page\n\n const fake1 = sinon.fake();\n const fake2 = sinon.fake();\n el.updatePages = fake1;\n el.emitPageClick = fake2;\n\n // select first page button\n const forwardButton = el.shadowRoot?.querySelector(\n '.facets-pagination > button.forward',\n ) as HTMLButtonElement;\n forwardButton.click();\n\n await el.updateComplete;\n\n expect(fake1.callCount).to.equal(1);\n expect(fake2.callCount).to.equal(1);\n expect(el.currentPage).to.equal(6); // brings us forward 1 page\n });\n });\n\n describe('Compact mode', () => {\n it('shows all pages when size <= 3', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${3}\n .compact=${true}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n expect(el.pages).to.deep.equal([1, 2, 3]);\n });\n\n it('shows first, prev, current, next, ..., last for middle page', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${20}\n .currentPage=${10}\n .compact=${true}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n // first, ..., prev, current, next, ..., last\n expect(el.pages).to.deep.equal([1, 0, 9, 10, 11, 0, 20]);\n });\n\n it('shows correct pages when on page 1', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${20}\n .currentPage=${1}\n .compact=${true}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n // first (current), next, ..., last\n expect(el.pages).to.deep.equal([1, 2, 0, 20]);\n });\n\n it('shows correct pages when on last page', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${20}\n .currentPage=${20}\n .compact=${true}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n // first, ..., prev, last (current)\n expect(el.pages).to.deep.equal([1, 0, 19, 20]);\n });\n\n it('shows correct pages when on page 2', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${20}\n .currentPage=${2}\n .compact=${true}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n // first, current, next, ..., last\n expect(el.pages).to.deep.equal([1, 2, 3, 0, 20]);\n });\n\n it('shows correct pages when on second-to-last page', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${20}\n .currentPage=${19}\n .compact=${true}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n // first, ..., prev, current, last\n expect(el.pages).to.deep.equal([1, 0, 18, 19, 20]);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"more-facets-pagination.test.js","sourceRoot":"","sources":["../../../test/collection-facets/more-facets-pagination.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, oneEvent } from '@open-wc/testing';\nimport { html } from 'lit';\nimport sinon from 'sinon';\nimport '../../src/collection-facets/more-facets-pagination';\nimport type { MoreFacetsPagination } from '../../src/collection-facets/more-facets-pagination';\n\nafterEach(() => {\n sinon.restore();\n});\n\ndescribe('More facets pagination', () => {\n describe('5 pages or less', () => {\n it('shows all pages', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination .size=${5}></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n const pageButtons = el.shadowRoot?.querySelectorAll(\n 'button[data-page]',\n ) as NodeList;\n expect(pageButtons.length).to.greaterThan(0);\n\n pageButtons.forEach((button, index) => {\n expect(button.textContent).to.contain(index + 1);\n });\n });\n });\n\n it('should render pagination template', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination .size=${10}></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.facets-pagination')).to.exist;\n expect(el.shadowRoot?.querySelector('.arrow-icon')).to.exist;\n });\n\n it('should render page numbers', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination .size=${3}></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n const pageNumberElement = el.shadowRoot?.querySelector('.page-numbers');\n expect(pageNumberElement).to.exist;\n expect(pageNumberElement?.querySelectorAll('button').length).to.equal(3);\n });\n\n it('check current page and total pages', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${4}\n .currentPage=${2}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n const pageNumberElement = el.shadowRoot?.querySelector('.page-numbers');\n expect(pageNumberElement).to.exist;\n expect(\n pageNumberElement\n ?.querySelectorAll('button')[1]\n .classList.contains('current'),\n ).to.be.true;\n expect(el.pages?.length).to.equal(4);\n });\n\n it('get page numbers based of size and currentPage', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${4}\n .currentPage=${2}\n ></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n expect(el.pages?.length).to.equal(4);\n });\n\n describe('Selecting a page', () => {\n it('fires event', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination></more-facets-pagination>`,\n );\n\n await el.updateComplete;\n\n setTimeout(() =>\n el.dispatchEvent(\n new CustomEvent('pageNumberClicked', { detail: { page: 15 } }),\n ),\n );\n const { detail } = await oneEvent(el, 'pageNumberClicked');\n expect(detail?.page).to.equal(15);\n });\n it('sets off side effects with `onChange`', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${'10'}\n .currentPage=${2}\n ></more-facets-pagination>`,\n );\n\n expect(el.currentPage).to.equal(2); // confirm current page\n\n const fake1 = sinon.fake();\n const fake2 = sinon.fake();\n el.observePageCount = fake1;\n el.emitPageClick = fake2;\n\n // select first page button\n const pageButton = el.shadowRoot?.querySelector(\n '.page-numbers > button',\n ) as HTMLButtonElement;\n // confirm button isn't selected\n expect(pageButton.classList.contains('current')).to.be.false;\n pageButton.click();\n\n await el.updateComplete;\n\n expect(fake1.callCount).to.equal(1);\n expect(fake2.callCount).to.equal(1);\n expect(el.currentPage).to.equal(1); // brings us back to currentPage\n // confirm button is selected\n expect(pageButton.classList.contains('current')).to.be.true;\n });\n });\n\n describe('Using Arrows', () => {\n it('going backwards', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${'10'}\n .currentPage=${2}\n ></more-facets-pagination>`,\n );\n\n expect(el.currentPage).to.equal(2); // confirm current page\n\n const fake1 = sinon.fake();\n const fake2 = sinon.fake();\n el.observePageCount = fake1;\n el.emitPageClick = fake2;\n\n // select first page button\n const rewindButton = el.shadowRoot?.querySelector(\n '.facets-pagination > button.rewind',\n ) as HTMLButtonElement;\n rewindButton.click();\n\n await el.updateComplete;\n\n expect(fake1.callCount).to.equal(1);\n expect(fake2.callCount).to.equal(1);\n expect(el.currentPage).to.equal(1); // brings us back 1 page\n // confirm button is selected\n expect(\n (\n el.shadowRoot?.querySelector(\n '.page-numbers > button[data-page=\"1\"]',\n ) as HTMLButtonElement\n ).classList.contains('current'),\n ).to.be.true;\n });\n\n it('going forwards', async () => {\n const el = await fixture<MoreFacetsPagination>(\n html`<more-facets-pagination\n .size=${'10'}\n .currentPage=${5}\n ></more-facets-pagination>`,\n );\n\n expect(el.currentPage).to.equal(5); // confirm current page\n\n const fake1 = sinon.fake();\n const fake2 = sinon.fake();\n el.observePageCount = fake1;\n el.emitPageClick = fake2;\n\n // select first page button\n const forwardButton = el.shadowRoot?.querySelector(\n '.facets-pagination > button.forward',\n ) as HTMLButtonElement;\n forwardButton.click();\n\n await el.updateComplete;\n\n expect(fake1.callCount).to.equal(1);\n expect(fake2.callCount).to.equal(1);\n expect(el.currentPage).to.equal(6); // brings us forward 1 page\n });\n });\n});\n"]}
@@ -98,5 +98,57 @@ describe('Collection Browser Data Source', () => {
98
98
  dataSource.refreshLetterCounts();
99
99
  expect(dataSource.prefixFilterCountMap).to.deep.equal({});
100
100
  });
101
+ describe('empty FTS query in collection falls back to metadata search', () => {
102
+ it('allows search with empty query and FTS in a collection', async () => {
103
+ const searchService = new MockSearchService();
104
+ host.searchService = searchService;
105
+ host.withinCollection = 'test-collection';
106
+ host.searchType = SearchType.FULLTEXT;
107
+ host.baseQuery = '';
108
+ await host.updateComplete;
109
+ const dataSource = new CollectionBrowserDataSource(host);
110
+ host.addController(dataSource);
111
+ expect(dataSource.canPerformSearch).to.be.true;
112
+ host.removeController(dataSource);
113
+ });
114
+ it('uses metadata search type for fetch when FTS query is empty in a collection', async () => {
115
+ const searchService = new MockSearchService();
116
+ host.searchService = searchService;
117
+ host.withinCollection = 'test-collection';
118
+ host.searchType = SearchType.FULLTEXT;
119
+ host.baseQuery = '';
120
+ await host.updateComplete;
121
+ const dataSource = new CollectionBrowserDataSource(host);
122
+ host.addController(dataSource);
123
+ await dataSource.fetchPage(1);
124
+ expect(searchService.searchType).to.equal(SearchType.METADATA);
125
+ host.removeController(dataSource);
126
+ });
127
+ it('uses FTS search type for fetch when FTS query is non-empty in a collection', async () => {
128
+ const searchService = new MockSearchService();
129
+ host.searchService = searchService;
130
+ host.withinCollection = 'test-collection';
131
+ host.searchType = SearchType.FULLTEXT;
132
+ host.baseQuery = 'some query';
133
+ await host.updateComplete;
134
+ const dataSource = new CollectionBrowserDataSource(host);
135
+ host.addController(dataSource);
136
+ await dataSource.fetchPage(1);
137
+ expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
138
+ host.removeController(dataSource);
139
+ });
140
+ it('does not allow search with empty FTS query outside a collection', async () => {
141
+ const searchService = new MockSearchService();
142
+ host.searchService = searchService;
143
+ host.withinCollection = undefined;
144
+ host.searchType = SearchType.FULLTEXT;
145
+ host.baseQuery = '';
146
+ await host.updateComplete;
147
+ const dataSource = new CollectionBrowserDataSource(host);
148
+ host.addController(dataSource);
149
+ expect(dataSource.canPerformSearch).to.be.false;
150
+ host.removeController(dataSource);
151
+ });
152
+ });
101
153
  });
102
154
  //# sourceMappingURL=collection-browser-data-source.test.js.map