@internetarchive/collection-browser 2.13.1 → 2.13.2-alpha-webdev5427.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 (50) hide show
  1. package/dist/src/app-root.d.ts +1 -0
  2. package/dist/src/app-root.js +48 -2
  3. package/dist/src/app-root.js.map +1 -1
  4. package/dist/src/collection-browser.js +13 -4
  5. package/dist/src/collection-browser.js.map +1 -1
  6. package/dist/src/collection-facets/facet-row.js +7 -1
  7. package/dist/src/collection-facets/facet-row.js.map +1 -1
  8. package/dist/src/collection-facets/more-facets-content.d.ts +1 -0
  9. package/dist/src/collection-facets/more-facets-content.js +19 -4
  10. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  11. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +4 -3
  12. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
  13. package/dist/src/collection-facets.d.ts +3 -1
  14. package/dist/src/collection-facets.js +37 -7
  15. package/dist/src/collection-facets.js.map +1 -1
  16. package/dist/src/data-source/collection-browser-data-source.js +11 -11
  17. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  18. package/dist/src/expanded-date-picker.d.ts +1 -0
  19. package/dist/src/expanded-date-picker.js +7 -1
  20. package/dist/src/expanded-date-picker.js.map +1 -1
  21. package/dist/src/models.d.ts +23 -5
  22. package/dist/src/models.js +65 -3
  23. package/dist/src/models.js.map +1 -1
  24. package/dist/src/restoration-state-handler.js +8 -3
  25. package/dist/src/restoration-state-handler.js.map +1 -1
  26. package/dist/src/utils/facet-utils.js +8 -2
  27. package/dist/src/utils/facet-utils.js.map +1 -1
  28. package/dist/test/collection-facets.test.js +27 -0
  29. package/dist/test/collection-facets.test.js.map +1 -1
  30. package/dist/test/restoration-state-handler.test.js +17 -10
  31. package/dist/test/restoration-state-handler.test.js.map +1 -1
  32. package/dist/test/tiles/{mediatype-icon.test.js → tile-mediatype-icon.test.js} +1 -1
  33. package/dist/test/tiles/tile-mediatype-icon.test.js.map +1 -0
  34. package/package.json +1 -1
  35. package/src/app-root.ts +49 -2
  36. package/src/collection-browser.ts +16 -3
  37. package/src/collection-facets/facet-row.ts +8 -1
  38. package/src/collection-facets/more-facets-content.ts +21 -5
  39. package/src/collection-facets/smart-facets/smart-facet-bar.ts +2 -2
  40. package/src/collection-facets.ts +37 -8
  41. package/src/data-source/collection-browser-data-source.ts +18 -13
  42. package/src/expanded-date-picker.ts +5 -1
  43. package/src/models.ts +83 -10
  44. package/src/restoration-state-handler.ts +8 -1
  45. package/src/utils/facet-utils.ts +5 -3
  46. package/test/collection-facets.test.ts +33 -0
  47. package/test/restoration-state-handler.test.ts +10 -10
  48. package/dist/test/tiles/mediatype-icon.test.js.map +0 -1
  49. /package/dist/test/tiles/{mediatype-icon.test.d.ts → tile-mediatype-icon.test.d.ts} +0 -0
  50. /package/test/tiles/{mediatype-icon.test.ts → tile-mediatype-icon.test.ts} +0 -0
@@ -41,6 +41,7 @@ export function forEachFacetBucket(selectedFacets, fn) {
41
41
  * the `'none'` state in place.
42
42
  */
43
43
  export function updateSelectedFacetBucket(selectedFacets, facetType, bucket, omitNoneState = false) {
44
+ var _a;
44
45
  const defaultedSelectedFacets = selectedFacets !== null && selectedFacets !== void 0 ? selectedFacets : getDefaultSelectedFacets();
45
46
  const newFacets = {
46
47
  ...defaultedSelectedFacets,
@@ -50,7 +51,7 @@ export function updateSelectedFacetBucket(selectedFacets, facetType, bucket, omi
50
51
  },
51
52
  };
52
53
  if (omitNoneState && bucket.state === 'none') {
53
- delete newFacets[facetType][bucket.key];
54
+ (_a = newFacets[facetType]) === null || _a === void 0 ? true : delete _a[bucket.key];
54
55
  }
55
56
  return newFacets;
56
57
  }
@@ -68,6 +69,8 @@ export function updateSelectedFacetBucket(selectedFacets, facetType, bucket, omi
68
69
  export function cloneSelectedFacets(selectedFacets) {
69
70
  const cloneResult = getDefaultSelectedFacets();
70
71
  forEachFacetBucket(selectedFacets, (facetType, bucketKey, bucket) => {
72
+ if (!cloneResult[facetType])
73
+ cloneResult[facetType] = {};
71
74
  cloneResult[facetType][bucketKey] = bucket;
72
75
  });
73
76
  return cloneResult;
@@ -95,12 +98,15 @@ export function cloneSelectedFacets(selectedFacets) {
95
98
  export function mergeSelectedFacets(destination, source) {
96
99
  const mergeResult = cloneSelectedFacets(destination);
97
100
  forEachFacetBucket(source, (facetType, bucketKey, bucket) => {
101
+ if (!mergeResult[facetType])
102
+ mergeResult[facetType] = {};
98
103
  mergeResult[facetType][bucketKey] = bucket;
99
104
  });
100
105
  // Normalize any 'none' states on the result (from either source or destination)
101
106
  forEachFacetBucket(mergeResult, (facetType, bucketKey, bucket) => {
107
+ var _a;
102
108
  if (bucket.state === 'none') {
103
- delete mergeResult[facetType][bucketKey];
109
+ (_a = mergeResult[facetType]) === null || _a === void 0 ? true : delete _a[bucketKey];
104
110
  }
105
111
  });
106
112
  return mergeResult;
@@ -1 +1 @@
1
- {"version":3,"file":"facet-utils.js","sourceRoot":"","sources":["../../../src/utils/facet-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AggregationSortType } from '@internetarchive/search-service';\nimport {\n FacetOption,\n getDefaultSelectedFacets,\n type FacetBucket,\n type SelectedFacets,\n} from '../models';\n\n// This file contains several helper functions designed to make working immutably\n// with SelectedFacet objects and FacetGroups cleaner & easier.\n\n/**\n * Calls the given function for each FacetBucket specified in the given SelectedFacets\n * object. The function is always called with the facet type, bucket key, bucket object,\n * and the given SelectedFacets object.\n *\n * @param selectedFacets The SelectedFacets object whose buckets should be iterated over\n * @param fn The function to apply to each facet bucket.\n *\n * @example\n * forEachFacetBucket(\n * myFacets,\n * (facetType, bucketKey, bucket) => {\n * if (facetType === 'collection' && bucket.state === 'hidden') {\n * console.log(`Excluding any results in the ${bucketKey} collection`);\n * }\n * }\n * );\n */\nexport function forEachFacetBucket(\n selectedFacets: SelectedFacets | undefined,\n fn: (\n facetType: FacetOption,\n bucketKey: string,\n bucket: FacetBucket,\n selectedFacets: SelectedFacets,\n ) => unknown,\n): void {\n if (!selectedFacets) return;\n for (const [facetType, facetBuckets] of Object.entries(selectedFacets)) {\n for (const [bucketKey, bucket] of Object.entries(facetBuckets)) {\n fn(facetType as FacetOption, bucketKey, bucket, selectedFacets);\n }\n }\n}\n\n/**\n * Returns a new SelectedFacets object having only the specified bucket changed to\n * reflect its new provided value. The bucket key is determined from the provided\n * `bucket` itself.\n * @param selectedFacets The SelectedFacets object to produce an updated clone of\n * @param facetType The type of facet to be modified (e.g., 'mediatype', 'subject', ...)\n * @param bucket The new bucket that should be present on the result\n * @param omitNoneState If set to true, the returned object will omit the given\n * bucket entirely if it is updated to state `'none'`. Default is false, which leaves\n * the `'none'` state in place.\n */\nexport function updateSelectedFacetBucket(\n selectedFacets: SelectedFacets | undefined,\n facetType: FacetOption,\n bucket: FacetBucket,\n omitNoneState = false,\n): SelectedFacets {\n const defaultedSelectedFacets = selectedFacets ?? getDefaultSelectedFacets();\n const newFacets = {\n ...defaultedSelectedFacets,\n [facetType]: {\n ...defaultedSelectedFacets[facetType],\n [bucket.key]: bucket,\n },\n };\n\n if (omitNoneState && bucket.state === 'none') {\n delete newFacets[facetType][bucket.key];\n }\n\n return newFacets;\n}\n\n/**\n * Creates a clone of the given SelectedFacets object.\n *\n * Note that the underlying FacetBucket objects are not deep-cloned -- they will\n * be references to the same objects as in the input. However, the objects\n * containing the FacetBuckets for each FacetOption are created anew.\n *\n * If the provided argument is undefined, returns an empty SelectedFacets object.\n *\n * @param selectedFacets The SelectedFacets object to be cloned\n */\nexport function cloneSelectedFacets(\n selectedFacets: SelectedFacets | undefined,\n): SelectedFacets {\n const cloneResult = getDefaultSelectedFacets();\n forEachFacetBucket(selectedFacets, (facetType, bucketKey, bucket) => {\n cloneResult[facetType][bucketKey] = bucket;\n });\n return cloneResult;\n}\n\n/**\n * Creates a new SelectedFacets object representing a merge of the `source` facets object\n * into the `destination` facets object. Any facets existing in `source` take precedence\n * over those in `destination` in the event of conflicts.\n *\n * The resulting SelectedFacets object is normalized to omit any facet buckets whose\n * state is `'none'` in the merged result. Consequently, any facets buckets with state\n * `'none'` in `source` will always be absent from the end result. Likewise, any facet\n * buckets with state `'none'` in `destination` will be absent _unless_ they are also\n * present in `source` with a state of `'selected'` or `'hidden'` (in which case `source`\n * takes precedence as usual).\n *\n * @param source The source of the new facets to merge in. Any facet buckets existing in\n * this `source` object will take precedence over those in `destination` having the same\n * key, if they exist in both. Any facet buckets that are _not_ present in `source` will\n * remain unmodified from their state in `destination`, if they are present there at all.\n * @param destination The destination onto which facets should be merged. Note that this\n * object is _not_ re-used for the return value, but it is conceptually the \"existing base\"\n * onto which the source facets are merged.\n */\nexport function mergeSelectedFacets(\n destination: SelectedFacets | undefined,\n source: SelectedFacets | undefined,\n): SelectedFacets {\n const mergeResult = cloneSelectedFacets(destination);\n forEachFacetBucket(source, (facetType, bucketKey, bucket) => {\n mergeResult[facetType][bucketKey] = bucket;\n });\n\n // Normalize any 'none' states on the result (from either source or destination)\n forEachFacetBucket(mergeResult, (facetType, bucketKey, bucket) => {\n if (bucket.state === 'none') {\n delete mergeResult[facetType][bucketKey];\n }\n });\n\n return mergeResult;\n}\n\n/**\n * Defines the order of states in which to display SelectedFacets buckets\n */\nconst BUCKET_STATE_ORDER = ['selected', 'hidden', 'none'];\n\n/**\n * Sorts the provided FacetBuckets so that:\n * - Any selected items come first\n * - Any hidden items come after all the selected items\n * - Any unselected / unhidden items come last\n *\n * Within each of the above groups, the buckets will be sorted according to\n * the provided sort type, or by their bucket count by default.\n *\n * The sort is performed in-place using `Array.sort`, so the return value is\n * a reference to the same array that was passed in, only sorted.\n *\n * @param buckets The array of facet buckets to sort\n * @param sort (Optional) How buckets within each state group should be sorted.\n * Defaults to `AggregationSortType.COUNT` (i.e., descending by bucket count).\n */\nexport function sortBucketsBySelectionState(\n buckets: FacetBucket[],\n sort = AggregationSortType.COUNT,\n) {\n return buckets.sort((a, b) => {\n const aStateIndex = BUCKET_STATE_ORDER.indexOf(a.state);\n const bStateIndex = BUCKET_STATE_ORDER.indexOf(b.state);\n const stateDiff = aStateIndex - bStateIndex; // Sort bucket states primarily in the order defined by BUCKET_STATE_ORDER\n\n let secondaryDiff;\n if (sort === AggregationSortType.ALPHABETICAL) {\n secondaryDiff = a.key.localeCompare(b.key); // Ascending alphabetically by bucket key\n } else if (sort === AggregationSortType.NUMERIC) {\n secondaryDiff = Number(b.key) - Number(a.key); // Descending numerically by bucket key\n } else {\n secondaryDiff = b.count - a.count; // Descending by bucket count\n }\n\n return stateDiff || secondaryDiff; // Primary sort on state, secondary sort on the given sort type (defaulting to descending count)\n });\n}\n"]}
1
+ {"version":3,"file":"facet-utils.js","sourceRoot":"","sources":["../../../src/utils/facet-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AggregationSortType } from '@internetarchive/search-service';\nimport {\n FacetOption,\n getDefaultSelectedFacets,\n type FacetBucket,\n type SelectedFacets,\n} from '../models';\n\n// This file contains several helper functions designed to make working immutably\n// with SelectedFacet objects and FacetGroups cleaner & easier.\n\n/**\n * Calls the given function for each FacetBucket specified in the given SelectedFacets\n * object. The function is always called with the facet type, bucket key, bucket object,\n * and the given SelectedFacets object.\n *\n * @param selectedFacets The SelectedFacets object whose buckets should be iterated over\n * @param fn The function to apply to each facet bucket.\n *\n * @example\n * forEachFacetBucket(\n * myFacets,\n * (facetType, bucketKey, bucket) => {\n * if (facetType === 'collection' && bucket.state === 'hidden') {\n * console.log(`Excluding any results in the ${bucketKey} collection`);\n * }\n * }\n * );\n */\nexport function forEachFacetBucket(\n selectedFacets: SelectedFacets | undefined,\n fn: (\n facetType: FacetOption,\n bucketKey: string,\n bucket: FacetBucket,\n selectedFacets: SelectedFacets,\n ) => unknown,\n): void {\n if (!selectedFacets) return;\n for (const [facetType, facetBuckets] of Object.entries(selectedFacets)) {\n for (const [bucketKey, bucket] of Object.entries(facetBuckets)) {\n fn(facetType as FacetOption, bucketKey, bucket, selectedFacets);\n }\n }\n}\n\n/**\n * Returns a new SelectedFacets object having only the specified bucket changed to\n * reflect its new provided value. The bucket key is determined from the provided\n * `bucket` itself.\n * @param selectedFacets The SelectedFacets object to produce an updated clone of\n * @param facetType The type of facet to be modified (e.g., 'mediatype', 'subject', ...)\n * @param bucket The new bucket that should be present on the result\n * @param omitNoneState If set to true, the returned object will omit the given\n * bucket entirely if it is updated to state `'none'`. Default is false, which leaves\n * the `'none'` state in place.\n */\nexport function updateSelectedFacetBucket(\n selectedFacets: SelectedFacets | undefined,\n facetType: FacetOption,\n bucket: FacetBucket,\n omitNoneState = false,\n): SelectedFacets {\n const defaultedSelectedFacets = selectedFacets ?? getDefaultSelectedFacets();\n const newFacets: SelectedFacets = {\n ...defaultedSelectedFacets,\n [facetType]: {\n ...defaultedSelectedFacets[facetType],\n [bucket.key]: bucket,\n },\n };\n\n if (omitNoneState && bucket.state === 'none') {\n delete newFacets[facetType]?.[bucket.key];\n }\n\n return newFacets;\n}\n\n/**\n * Creates a clone of the given SelectedFacets object.\n *\n * Note that the underlying FacetBucket objects are not deep-cloned -- they will\n * be references to the same objects as in the input. However, the objects\n * containing the FacetBuckets for each FacetOption are created anew.\n *\n * If the provided argument is undefined, returns an empty SelectedFacets object.\n *\n * @param selectedFacets The SelectedFacets object to be cloned\n */\nexport function cloneSelectedFacets(\n selectedFacets: SelectedFacets | undefined,\n): SelectedFacets {\n const cloneResult = getDefaultSelectedFacets();\n forEachFacetBucket(selectedFacets, (facetType, bucketKey, bucket) => {\n if (!cloneResult[facetType]) cloneResult[facetType] = {};\n cloneResult[facetType][bucketKey] = bucket;\n });\n return cloneResult;\n}\n\n/**\n * Creates a new SelectedFacets object representing a merge of the `source` facets object\n * into the `destination` facets object. Any facets existing in `source` take precedence\n * over those in `destination` in the event of conflicts.\n *\n * The resulting SelectedFacets object is normalized to omit any facet buckets whose\n * state is `'none'` in the merged result. Consequently, any facets buckets with state\n * `'none'` in `source` will always be absent from the end result. Likewise, any facet\n * buckets with state `'none'` in `destination` will be absent _unless_ they are also\n * present in `source` with a state of `'selected'` or `'hidden'` (in which case `source`\n * takes precedence as usual).\n *\n * @param source The source of the new facets to merge in. Any facet buckets existing in\n * this `source` object will take precedence over those in `destination` having the same\n * key, if they exist in both. Any facet buckets that are _not_ present in `source` will\n * remain unmodified from their state in `destination`, if they are present there at all.\n * @param destination The destination onto which facets should be merged. Note that this\n * object is _not_ re-used for the return value, but it is conceptually the \"existing base\"\n * onto which the source facets are merged.\n */\nexport function mergeSelectedFacets(\n destination: SelectedFacets | undefined,\n source: SelectedFacets | undefined,\n): SelectedFacets {\n const mergeResult = cloneSelectedFacets(destination);\n forEachFacetBucket(source, (facetType, bucketKey, bucket) => {\n if (!mergeResult[facetType]) mergeResult[facetType] = {};\n mergeResult[facetType][bucketKey] = bucket;\n });\n\n // Normalize any 'none' states on the result (from either source or destination)\n forEachFacetBucket(mergeResult, (facetType, bucketKey, bucket) => {\n if (bucket.state === 'none') {\n delete mergeResult[facetType]?.[bucketKey];\n }\n });\n\n return mergeResult;\n}\n\n/**\n * Defines the order of states in which to display SelectedFacets buckets\n */\nconst BUCKET_STATE_ORDER = ['selected', 'hidden', 'none'];\n\n/**\n * Sorts the provided FacetBuckets so that:\n * - Any selected items come first\n * - Any hidden items come after all the selected items\n * - Any unselected / unhidden items come last\n *\n * Within each of the above groups, the buckets will be sorted according to\n * the provided sort type, or by their bucket count by default.\n *\n * The sort is performed in-place using `Array.sort`, so the return value is\n * a reference to the same array that was passed in, only sorted.\n *\n * @param buckets The array of facet buckets to sort\n * @param sort (Optional) How buckets within each state group should be sorted.\n * Defaults to `AggregationSortType.COUNT` (i.e., descending by bucket count).\n */\nexport function sortBucketsBySelectionState(\n buckets: FacetBucket[],\n sort = AggregationSortType.COUNT,\n) {\n return buckets.sort((a, b) => {\n const aStateIndex = BUCKET_STATE_ORDER.indexOf(a.state);\n const bStateIndex = BUCKET_STATE_ORDER.indexOf(b.state);\n const stateDiff = aStateIndex - bStateIndex; // Sort bucket states primarily in the order defined by BUCKET_STATE_ORDER\n\n let secondaryDiff;\n if (sort === AggregationSortType.ALPHABETICAL) {\n secondaryDiff = a.key.localeCompare(b.key); // Ascending alphabetically by bucket key\n } else if (sort === AggregationSortType.NUMERIC) {\n secondaryDiff = Number(b.key) - Number(a.key); // Descending numerically by bucket key\n } else {\n secondaryDiff = b.count - a.count; // Descending by bucket count\n }\n\n return stateDiff || secondaryDiff; // Primary sort on state, secondary sort on the given sort type (defaulting to descending count)\n });\n}\n"]}
@@ -503,6 +503,33 @@ describe('Collection Facets', () => {
503
503
  expect(facetRows === null || facetRows === void 0 ? void 0 : facetRows.length).to.equal(8);
504
504
  expect((_d = (_c = facetRows === null || facetRows === void 0 ? void 0 : facetRows[7]) === null || _c === void 0 ? void 0 : _c.bucket) === null || _d === void 0 ? void 0 : _d.key).to.equal('collection');
505
505
  });
506
+ it('uses specified facet display order', async () => {
507
+ var _a;
508
+ const el = await fixture(html `<collection-facets
509
+ .facetDisplayOrder=${['language', 'creator']}
510
+ ></collection-facets>`);
511
+ const aggs = {
512
+ mediatype: new Aggregation({
513
+ buckets: [{ key: 'texts', doc_count: 5 }],
514
+ }),
515
+ collection: new Aggregation({
516
+ buckets: [{ key: 'foo', doc_count: 10 }],
517
+ }),
518
+ creator: new Aggregation({
519
+ buckets: [{ key: 'bar', doc_count: 15 }],
520
+ }),
521
+ language: new Aggregation({
522
+ buckets: [{ key: 'baz', doc_count: 20 }],
523
+ }),
524
+ };
525
+ el.aggregations = aggs;
526
+ await el.updateComplete;
527
+ const facetHeaders = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.facet-group-header');
528
+ // The only two facet groups should be Language and Creator (in that order)
529
+ expect(facetHeaders === null || facetHeaders === void 0 ? void 0 : facetHeaders.length).to.equal(2);
530
+ expect(facetHeaders === null || facetHeaders === void 0 ? void 0 : facetHeaders[0].textContent).to.contain('Language');
531
+ expect(facetHeaders === null || facetHeaders === void 0 ? void 0 : facetHeaders[1].textContent).to.contain('Creator');
532
+ });
506
533
  describe('More Facets', () => {
507
534
  it('Does not render < allowedFacetCount', async () => {
508
535
  var _a;
@@ -1 +1 @@
1
- {"version":3,"file":"collection-facets.test.js","sourceRoot":"","sources":["../../test/collection-facets.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport sinon from 'sinon';\nimport { html } from 'lit';\nimport { Aggregation } from '@internetarchive/search-service';\nimport {\n ModalManager,\n ModalManagerInterface,\n} from '@internetarchive/modal-manager';\nimport type { CollectionFacets } from '../src/collection-facets';\nimport '@internetarchive/modal-manager';\nimport '../src/collection-facets';\nimport {\n FacetOption,\n // SelectedFacets, Used in lending tests (disabled)\n getDefaultSelectedFacets,\n} from '../src/models';\nimport { MockAnalyticsHandler } from './mocks/mock-analytics-handler';\nimport type { FacetRow } from '../src/collection-facets/facet-row';\n// import type { FacetsTemplate } from '../src/collection-facets/facets-template'; Used in lending tests (disabled)\n\ndescribe('Collection Facets', () => {\n it('has loader', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets ?facetsLoading=${true}></collection-facets>`,\n );\n\n expect(\n el.shadowRoot?.querySelector('#container')?.classList.contains('loading'),\n ).to.be.true;\n\n el.facetsLoading = false;\n await el.updateComplete;\n\n expect(\n el.shadowRoot?.querySelector('#container')?.classList.contains('loading'),\n ).to.be.false;\n });\n\n it('renders a date picker loading placeholder when date picker enabled', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = true;\n el.showHistogramDatePicker = true;\n await el.updateComplete;\n\n const histogramLoader = el.shadowRoot?.querySelector(\n '.histogram-loading-indicator',\n );\n expect(histogramLoader).to.exist;\n });\n\n it('does not render a date picker loading placeholder when date picker disabled', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = true;\n el.showHistogramDatePicker = false;\n await el.updateComplete;\n\n const histogramLoader = el.shadowRoot?.querySelector(\n '.histogram-loading-indicator',\n );\n expect(histogramLoader).to.be.null;\n });\n\n it('renders the date picker when enabled with data present', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const histogram = el.shadowRoot?.querySelector('histogram-date-range');\n expect(histogram).to.exist;\n });\n\n it('does not render the date picker when disabled', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = false;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const histogram = el.shadowRoot?.querySelector('histogram-date-range');\n expect(histogram).to.be.null;\n });\n\n it('renders button to expand the date picker when allowed', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.allowExpandingDatePicker = true;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const expandBtn = el.shadowRoot?.querySelector('.expand-date-picker-btn');\n expect(expandBtn).to.exist;\n });\n\n it('does not render button to expand the date picker when disallowed', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.allowExpandingDatePicker = false;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const expandBtn = el.shadowRoot?.querySelector('.expand-date-picker-btn');\n expect(expandBtn).to.be.null;\n });\n\n it('opens modal when date picker expand button clicked', async () => {\n const modalManager = await fixture<ModalManager>(\n html`<modal-manager></modal-manager>`,\n );\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .modalManager=${modalManager}\n ></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.allowExpandingDatePicker = true;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const expandBtn = el.shadowRoot?.querySelector(\n '.expand-date-picker-btn',\n ) as HTMLButtonElement;\n expect(expandBtn).to.exist;\n\n const showModalSpy = sinon.spy(\n el.modalManager as ModalManagerInterface,\n 'showModal',\n );\n\n // Click the expand button to open the modal\n expandBtn?.click();\n await el.updateComplete;\n\n expect(showModalSpy.callCount).to.equal(1);\n expect(el.modalManager?.classList.contains('expanded-date-picker')).to.be\n .true;\n });\n\n it('renders aggregations as facets', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');\n expect(facetGroups?.length).to.equal(1);\n\n const titleFacetGroup = facetGroups?.[0];\n const facetGroupHeader = titleFacetGroup?.querySelector('h3');\n // Every facet group header has an invisible \" filters\" suffix for screen-readers\n expect(\n facetGroupHeader?.querySelector('span.sr-only')?.textContent?.trim(),\n ).to.equal('filters');\n // Ignoring the screen-reader suffix, we should be left with only the readable, capitalized title\n expect(\n facetGroupHeader?.textContent?.trim().replace(/\\s*filters$/, ''),\n ).to.equal('Subject');\n\n const titleFacetRow = titleFacetGroup\n ?.querySelector('facets-template')\n ?.shadowRoot?.querySelector('facet-row') as FacetRow;\n await titleFacetRow.updateComplete;\n\n expect(titleFacetRow?.shadowRoot?.textContent?.trim()).to.satisfy(\n (text: string) => /^foo\\s*5$/.test(text),\n );\n });\n\n it('renders multiple aggregation types', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n ],\n }),\n mediatype: new Aggregation({\n buckets: [\n {\n key: 'bar',\n doc_count: 10,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');\n expect(facetGroups?.length).to.equal(2);\n });\n\n it('does not render suppressed collection facets', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n collection: new Aggregation({\n buckets: [\n {\n key: 'deemphasize',\n doc_count: 5,\n },\n {\n key: 'community',\n doc_count: 5,\n },\n {\n key: 'foo',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const collectionFacets = el.shadowRoot\n ?.querySelector('facets-template')\n ?.shadowRoot?.querySelectorAll('facet-row') as ArrayLike<FacetRow>;\n expect(collectionFacets?.length).to.equal(1);\n\n // The first (and only) collection link should be for 'foo'\n expect(collectionFacets[0].bucket?.key).to.equal('foo');\n });\n\n // Lending tests disabled because lending facet disabled\n // it('renders lending facets with human-readable names', async () => {\n // const el = await fixture<CollectionFacets>(\n // html`<collection-facets></collection-facets>`\n // );\n\n // const aggs: Record<string, Aggregation> = {\n // lending: new Aggregation({\n // buckets: [\n // {\n // key: 'is_lendable',\n // doc_count: 3,\n // },\n // {\n // key: 'available_to_borrow',\n // doc_count: 2,\n // },\n // {\n // key: 'is_readable',\n // doc_count: 1,\n // },\n // ],\n // }),\n // };\n\n // el.aggregations = aggs;\n // await el.updateComplete;\n\n // const facetsTemplate = el.shadowRoot?.querySelector(\n // 'facets-template'\n // ) as FacetsTemplate;\n // await facetsTemplate?.updateComplete;\n\n // const lendingFacets = facetsTemplate?.shadowRoot?.querySelectorAll(\n // 'facet-row'\n // ) as ArrayLike<FacetRow>;\n // expect(lendingFacets?.length).to.equal(3);\n\n // expect(lendingFacets[0].shadowRoot?.textContent?.trim()).to.match(\n // /^Lending Library\\s*3$/\n // );\n // expect(lendingFacets[1].shadowRoot?.textContent?.trim()).to.match(\n // /^Borrow 14 Days\\s*2$/\n // );\n // expect(lendingFacets[2].shadowRoot?.textContent?.trim()).to.match(\n // /^Always Available\\s*1$/\n // );\n // });\n\n // it('renders selected/negative lending facets with human-readable names', async () => {\n // const el = await fixture<CollectionFacets>(\n // html`<collection-facets></collection-facets>`\n // );\n\n // const selectedFacets: SelectedFacets = {\n // subject: {},\n // lending: {\n // is_lendable: {\n // key: 'is_lendable',\n // count: 5,\n // state: 'selected',\n // },\n // available_to_borrow: {\n // key: 'available_to_borrow',\n // count: 4,\n // state: 'selected',\n // },\n // is_readable: {\n // key: 'is_readable',\n // count: 3,\n // state: 'hidden',\n // },\n // },\n // mediatype: {},\n // language: {},\n // creator: {},\n // collection: {},\n // year: {},\n // };\n\n // el.selectedFacets = selectedFacets;\n // await el.updateComplete;\n\n // const facetsTemplate = el.shadowRoot?.querySelector(\n // 'facets-template'\n // ) as FacetsTemplate;\n // await facetsTemplate?.updateComplete;\n\n // const lendingFacets = facetsTemplate?.shadowRoot?.querySelectorAll(\n // 'facet-row'\n // ) as ArrayLike<FacetRow>;\n // expect(lendingFacets?.length).to.equal(3);\n\n // expect(lendingFacets[0].shadowRoot?.textContent?.trim()).to.match(\n // /^Lending Library\\s*5$/\n // );\n // expect(lendingFacets[1].shadowRoot?.textContent?.trim()).to.match(\n // /^Borrow 14 Days\\s*4$/\n // );\n // expect(lendingFacets[2].shadowRoot?.textContent?.trim()).to.match(\n // /^Always Available\\s*3$/\n // );\n // });\n\n // it('only renders lending facets for is_lendable, available_to_borrow, and is_readable', async () => {\n // const el = await fixture<CollectionFacets>(\n // html`<collection-facets></collection-facets>`\n // );\n\n // const aggs: Record<string, Aggregation> = {\n // lending: new Aggregation({\n // buckets: [\n // {\n // key: 'is_lendable',\n // doc_count: 5,\n // },\n // {\n // key: 'is_borrowable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_borrow',\n // doc_count: 5,\n // },\n // {\n // key: 'is_browsable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_browse',\n // doc_count: 5,\n // },\n // {\n // key: 'is_readable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_waitlist',\n // doc_count: 5,\n // },\n // ],\n // }),\n // };\n\n // el.aggregations = aggs;\n // await el.updateComplete;\n\n // const facetsTemplate = el.shadowRoot?.querySelector(\n // 'facets-template'\n // ) as FacetsTemplate;\n // await facetsTemplate?.updateComplete;\n // await new Promise(res => {\n // setTimeout(res, 100);\n // });\n\n // const lendingFacets = facetsTemplate?.shadowRoot?.querySelectorAll(\n // 'facet-row'\n // ) as ArrayLike<FacetRow>;\n // expect(lendingFacets?.length).to.equal(3);\n\n // expect(lendingFacets[0].shadowRoot?.textContent?.trim()).to.match(\n // /^Lending Library\\s*5$/\n // );\n // expect(lendingFacets[1].shadowRoot?.textContent?.trim()).to.match(\n // /^Borrow 14 Days\\s*5$/\n // );\n // expect(lendingFacets[2].shadowRoot?.textContent?.trim()).to.match(\n // /^Always Available\\s*4$/\n // );\n // });\n\n // it('does not render a More... link for lending facets', async () => {\n // const el = await fixture<CollectionFacets>(\n // html`<collection-facets></collection-facets>`\n // );\n\n // const aggs: Record<string, Aggregation> = {\n // lending: new Aggregation({\n // buckets: [\n // {\n // key: 'is_lendable',\n // doc_count: 5,\n // },\n // {\n // key: 'is_borrowable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_borrow',\n // doc_count: 5,\n // },\n // {\n // key: 'is_browsable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_browse',\n // doc_count: 5,\n // },\n // {\n // key: 'is_readable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_waitlist',\n // doc_count: 5,\n // },\n // ],\n // }),\n // };\n\n // el.aggregations = aggs;\n // await el.updateComplete;\n\n // const moreLink = el.shadowRoot?.querySelector('.more-link');\n // expect(moreLink).not.to.exist;\n // });\n\n it('always renders the mediatype:collection facet when present', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n mediatype: new Aggregation({\n buckets: [\n {\n key: 'texts',\n doc_count: 10000,\n },\n {\n key: 'image',\n doc_count: 9000,\n },\n {\n key: 'audio',\n doc_count: 8000,\n },\n {\n key: 'movies',\n doc_count: 7000,\n },\n {\n key: 'software',\n doc_count: 6000,\n },\n {\n key: 'data',\n doc_count: 5000,\n },\n {\n key: 'etree',\n doc_count: 4000,\n },\n {\n key: 'collection',\n doc_count: 1,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const facetsTemplate = el.shadowRoot?.querySelector('facets-template');\n const facetRows = facetsTemplate?.shadowRoot?.querySelectorAll(\n 'facet-row',\n ) as ArrayLike<FacetRow>;\n expect(facetRows?.length).to.equal(6);\n expect(facetRows?.[5]?.bucket?.key).to.equal('collection');\n });\n\n it('renders the mediatype:collection facet even when >=6 other mediatypes are selected', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n mediatype: new Aggregation({\n buckets: [\n {\n key: 'texts',\n doc_count: 10000,\n },\n {\n key: 'image',\n doc_count: 9000,\n },\n {\n key: 'audio',\n doc_count: 8000,\n },\n {\n key: 'movies',\n doc_count: 7000,\n },\n {\n key: 'software',\n doc_count: 6000,\n },\n {\n key: 'data',\n doc_count: 5000,\n },\n {\n key: 'etree',\n doc_count: 4000,\n },\n {\n key: 'collection',\n doc_count: 1,\n },\n ],\n }),\n };\n\n const selectedFacets = getDefaultSelectedFacets();\n selectedFacets.mediatype = {\n texts: { key: 'texts', count: 10000, state: 'selected' },\n image: { key: 'image', count: 9000, state: 'selected' },\n audio: { key: 'audio', count: 8000, state: 'selected' },\n movies: { key: 'movies', count: 7000, state: 'selected' },\n software: { key: 'software', count: 6000, state: 'selected' },\n data: { key: 'data', count: 5000, state: 'selected' },\n etree: { key: 'etree', count: 4000, state: 'selected' },\n };\n\n el.aggregations = aggs;\n el.selectedFacets = selectedFacets;\n await el.updateComplete;\n\n const facetsTemplate = el.shadowRoot?.querySelector('facets-template');\n const facetRows = facetsTemplate?.shadowRoot?.querySelectorAll(\n 'facet-row',\n ) as ArrayLike<FacetRow>;\n expect(facetRows?.length).to.equal(8);\n expect(facetRows?.[7]?.bucket?.key).to.equal('collection');\n });\n\n describe('More Facets', () => {\n it('Does not render < allowedFacetCount', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const moreLink = el.shadowRoot?.querySelector('.more-link');\n expect(moreLink).to.be.null;\n });\n\n it('Render More Facets', async () => {\n const modalManager = await fixture<ModalManager>(\n html`<modal-manager></modal-manager>`,\n );\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .modalManager=${modalManager}\n ></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n {\n key: 'fi',\n doc_count: 5,\n },\n {\n key: 'fum',\n doc_count: 5,\n },\n {\n key: 'flee',\n doc_count: 5,\n },\n {\n key: 'wheee',\n doc_count: 5,\n },\n {\n key: 'whooo',\n doc_count: 5,\n },\n {\n key: 'boop',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n let eventCaught = false;\n let eventFacet = '';\n el.addEventListener('showMoreFacets', e => {\n eventFacet = (e as CustomEvent).detail;\n eventCaught = true;\n });\n\n const moreLink = el.shadowRoot?.querySelector(\n '.more-link',\n ) as HTMLButtonElement;\n expect(moreLink).to.exist; // has link\n\n const showModalSpy = sinon.spy(\n el.modalManager as ModalManagerInterface,\n 'showModal',\n );\n // let's pop up modal\n moreLink?.click();\n await el.updateComplete;\n\n expect(showModalSpy.callCount).to.equal(1);\n expect(el.modalManager?.classList.contains('more-search-facets')).to.be\n .true;\n expect(eventCaught).to.be.true;\n expect(eventFacet).to.equal('subject' as FacetOption);\n });\n });\n\n it('fire analytics on more link', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .analyticsHandler=${mockAnalyticsHandler}\n ></collection-facets>`,\n );\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n {\n key: 'fi',\n doc_count: 5,\n },\n {\n key: 'fum',\n doc_count: 5,\n },\n {\n key: 'flee',\n doc_count: 5,\n },\n {\n key: 'wheee',\n doc_count: 5,\n },\n {\n key: 'whooo',\n doc_count: 5,\n },\n {\n key: 'boop',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const moreLink = el.shadowRoot?.querySelector(\n '.more-link',\n ) as HTMLButtonElement;\n\n expect(moreLink).to.exist; // has link\n\n moreLink?.click();\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('showMoreFacetsModal');\n expect(mockAnalyticsHandler.callLabel).to.equal('subject');\n });\n\n it('includes Part Of section for collections', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .baseNavigationUrl=${''}\n .withinCollection=${'foo'}\n .parentCollections=${['bar', 'baz']}\n .collectionTitles=${new Map([\n ['foo', 'foo-name'],\n ['bar', 'bar-name'],\n ['baz', 'baz-name'],\n ])}\n ></collection-facets>`,\n );\n\n const partOfSection = el.shadowRoot?.querySelector('.partof-collections');\n expect(partOfSection).to.exist;\n\n const partOfLinks = partOfSection?.querySelectorAll('a[href]');\n expect(partOfLinks?.length).to.equal(2);\n\n expect(partOfLinks?.[0]?.textContent?.trim()).to.equal('bar-name');\n expect(partOfLinks?.[0]?.getAttribute('href')).to.equal('/details/bar');\n expect(partOfLinks?.[1]?.textContent?.trim()).to.equal('baz-name');\n expect(partOfLinks?.[1]?.getAttribute('href')).to.equal('/details/baz');\n });\n\n it('does not include Part Of section without parent collections', async () => {\n // No parentCollections prop\n const el = await fixture<CollectionFacets>(\n html`<collection-facets .withinCollection=${'foo'}></collection-facets>`,\n );\n\n const partOfSection = el.shadowRoot?.querySelector('.partof-collections');\n expect(partOfSection).not.to.exist;\n });\n\n it('fires analytics on expanding date picker', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .analyticsHandler=${mockAnalyticsHandler}\n ></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.allowExpandingDatePicker = true;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const expandBtn = el.shadowRoot?.querySelector(\n '.expand-date-picker-btn',\n ) as HTMLButtonElement;\n expect(expandBtn).to.exist;\n\n // Click the expand button to open the modal\n expandBtn?.click();\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('histogramExpanded');\n expect(mockAnalyticsHandler.callLabel).to.equal(window.location.href);\n });\n\n it('fires analytics on clicking Part Of collection link', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .baseNavigationUrl=${''}\n .withinCollection=${'foo'}\n .parentCollections=${['bar']}\n .analyticsHandler=${mockAnalyticsHandler}\n ></collection-facets>`,\n );\n\n const partOfLinks = el.shadowRoot?.querySelectorAll(\n '.partof-collections a[href]',\n );\n expect(partOfLinks?.length).to.equal(1);\n\n // Click the expand button to open the modal\n const link = partOfLinks?.[0] as HTMLAnchorElement;\n link?.addEventListener('click', e => e.preventDefault());\n link?.click();\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('partOfCollectionClicked');\n expect(mockAnalyticsHandler.callLabel).to.equal('bar');\n });\n});\n"]}
1
+ {"version":3,"file":"collection-facets.test.js","sourceRoot":"","sources":["../../test/collection-facets.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport sinon from 'sinon';\nimport { html } from 'lit';\nimport { Aggregation } from '@internetarchive/search-service';\nimport {\n ModalManager,\n ModalManagerInterface,\n} from '@internetarchive/modal-manager';\nimport type { CollectionFacets } from '../src/collection-facets';\nimport '@internetarchive/modal-manager';\nimport '../src/collection-facets';\nimport {\n FacetOption,\n // SelectedFacets, Used in lending tests (disabled)\n getDefaultSelectedFacets,\n} from '../src/models';\nimport { MockAnalyticsHandler } from './mocks/mock-analytics-handler';\nimport type { FacetRow } from '../src/collection-facets/facet-row';\n// import type { FacetsTemplate } from '../src/collection-facets/facets-template'; Used in lending tests (disabled)\n\ndescribe('Collection Facets', () => {\n it('has loader', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets ?facetsLoading=${true}></collection-facets>`,\n );\n\n expect(\n el.shadowRoot?.querySelector('#container')?.classList.contains('loading'),\n ).to.be.true;\n\n el.facetsLoading = false;\n await el.updateComplete;\n\n expect(\n el.shadowRoot?.querySelector('#container')?.classList.contains('loading'),\n ).to.be.false;\n });\n\n it('renders a date picker loading placeholder when date picker enabled', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = true;\n el.showHistogramDatePicker = true;\n await el.updateComplete;\n\n const histogramLoader = el.shadowRoot?.querySelector(\n '.histogram-loading-indicator',\n );\n expect(histogramLoader).to.exist;\n });\n\n it('does not render a date picker loading placeholder when date picker disabled', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = true;\n el.showHistogramDatePicker = false;\n await el.updateComplete;\n\n const histogramLoader = el.shadowRoot?.querySelector(\n '.histogram-loading-indicator',\n );\n expect(histogramLoader).to.be.null;\n });\n\n it('renders the date picker when enabled with data present', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const histogram = el.shadowRoot?.querySelector('histogram-date-range');\n expect(histogram).to.exist;\n });\n\n it('does not render the date picker when disabled', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = false;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const histogram = el.shadowRoot?.querySelector('histogram-date-range');\n expect(histogram).to.be.null;\n });\n\n it('renders button to expand the date picker when allowed', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.allowExpandingDatePicker = true;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const expandBtn = el.shadowRoot?.querySelector('.expand-date-picker-btn');\n expect(expandBtn).to.exist;\n });\n\n it('does not render button to expand the date picker when disallowed', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.allowExpandingDatePicker = false;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const expandBtn = el.shadowRoot?.querySelector('.expand-date-picker-btn');\n expect(expandBtn).to.be.null;\n });\n\n it('opens modal when date picker expand button clicked', async () => {\n const modalManager = await fixture<ModalManager>(\n html`<modal-manager></modal-manager>`,\n );\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .modalManager=${modalManager}\n ></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.allowExpandingDatePicker = true;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const expandBtn = el.shadowRoot?.querySelector(\n '.expand-date-picker-btn',\n ) as HTMLButtonElement;\n expect(expandBtn).to.exist;\n\n const showModalSpy = sinon.spy(\n el.modalManager as ModalManagerInterface,\n 'showModal',\n );\n\n // Click the expand button to open the modal\n expandBtn?.click();\n await el.updateComplete;\n\n expect(showModalSpy.callCount).to.equal(1);\n expect(el.modalManager?.classList.contains('expanded-date-picker')).to.be\n .true;\n });\n\n it('renders aggregations as facets', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');\n expect(facetGroups?.length).to.equal(1);\n\n const titleFacetGroup = facetGroups?.[0];\n const facetGroupHeader = titleFacetGroup?.querySelector('h3');\n // Every facet group header has an invisible \" filters\" suffix for screen-readers\n expect(\n facetGroupHeader?.querySelector('span.sr-only')?.textContent?.trim(),\n ).to.equal('filters');\n // Ignoring the screen-reader suffix, we should be left with only the readable, capitalized title\n expect(\n facetGroupHeader?.textContent?.trim().replace(/\\s*filters$/, ''),\n ).to.equal('Subject');\n\n const titleFacetRow = titleFacetGroup\n ?.querySelector('facets-template')\n ?.shadowRoot?.querySelector('facet-row') as FacetRow;\n await titleFacetRow.updateComplete;\n\n expect(titleFacetRow?.shadowRoot?.textContent?.trim()).to.satisfy(\n (text: string) => /^foo\\s*5$/.test(text),\n );\n });\n\n it('renders multiple aggregation types', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n ],\n }),\n mediatype: new Aggregation({\n buckets: [\n {\n key: 'bar',\n doc_count: 10,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');\n expect(facetGroups?.length).to.equal(2);\n });\n\n it('does not render suppressed collection facets', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n collection: new Aggregation({\n buckets: [\n {\n key: 'deemphasize',\n doc_count: 5,\n },\n {\n key: 'community',\n doc_count: 5,\n },\n {\n key: 'foo',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const collectionFacets = el.shadowRoot\n ?.querySelector('facets-template')\n ?.shadowRoot?.querySelectorAll('facet-row') as ArrayLike<FacetRow>;\n expect(collectionFacets?.length).to.equal(1);\n\n // The first (and only) collection link should be for 'foo'\n expect(collectionFacets[0].bucket?.key).to.equal('foo');\n });\n\n // Lending tests disabled because lending facet disabled\n // it('renders lending facets with human-readable names', async () => {\n // const el = await fixture<CollectionFacets>(\n // html`<collection-facets></collection-facets>`\n // );\n\n // const aggs: Record<string, Aggregation> = {\n // lending: new Aggregation({\n // buckets: [\n // {\n // key: 'is_lendable',\n // doc_count: 3,\n // },\n // {\n // key: 'available_to_borrow',\n // doc_count: 2,\n // },\n // {\n // key: 'is_readable',\n // doc_count: 1,\n // },\n // ],\n // }),\n // };\n\n // el.aggregations = aggs;\n // await el.updateComplete;\n\n // const facetsTemplate = el.shadowRoot?.querySelector(\n // 'facets-template'\n // ) as FacetsTemplate;\n // await facetsTemplate?.updateComplete;\n\n // const lendingFacets = facetsTemplate?.shadowRoot?.querySelectorAll(\n // 'facet-row'\n // ) as ArrayLike<FacetRow>;\n // expect(lendingFacets?.length).to.equal(3);\n\n // expect(lendingFacets[0].shadowRoot?.textContent?.trim()).to.match(\n // /^Lending Library\\s*3$/\n // );\n // expect(lendingFacets[1].shadowRoot?.textContent?.trim()).to.match(\n // /^Borrow 14 Days\\s*2$/\n // );\n // expect(lendingFacets[2].shadowRoot?.textContent?.trim()).to.match(\n // /^Always Available\\s*1$/\n // );\n // });\n\n // it('renders selected/negative lending facets with human-readable names', async () => {\n // const el = await fixture<CollectionFacets>(\n // html`<collection-facets></collection-facets>`\n // );\n\n // const selectedFacets: SelectedFacets = {\n // subject: {},\n // lending: {\n // is_lendable: {\n // key: 'is_lendable',\n // count: 5,\n // state: 'selected',\n // },\n // available_to_borrow: {\n // key: 'available_to_borrow',\n // count: 4,\n // state: 'selected',\n // },\n // is_readable: {\n // key: 'is_readable',\n // count: 3,\n // state: 'hidden',\n // },\n // },\n // mediatype: {},\n // language: {},\n // creator: {},\n // collection: {},\n // year: {},\n // };\n\n // el.selectedFacets = selectedFacets;\n // await el.updateComplete;\n\n // const facetsTemplate = el.shadowRoot?.querySelector(\n // 'facets-template'\n // ) as FacetsTemplate;\n // await facetsTemplate?.updateComplete;\n\n // const lendingFacets = facetsTemplate?.shadowRoot?.querySelectorAll(\n // 'facet-row'\n // ) as ArrayLike<FacetRow>;\n // expect(lendingFacets?.length).to.equal(3);\n\n // expect(lendingFacets[0].shadowRoot?.textContent?.trim()).to.match(\n // /^Lending Library\\s*5$/\n // );\n // expect(lendingFacets[1].shadowRoot?.textContent?.trim()).to.match(\n // /^Borrow 14 Days\\s*4$/\n // );\n // expect(lendingFacets[2].shadowRoot?.textContent?.trim()).to.match(\n // /^Always Available\\s*3$/\n // );\n // });\n\n // it('only renders lending facets for is_lendable, available_to_borrow, and is_readable', async () => {\n // const el = await fixture<CollectionFacets>(\n // html`<collection-facets></collection-facets>`\n // );\n\n // const aggs: Record<string, Aggregation> = {\n // lending: new Aggregation({\n // buckets: [\n // {\n // key: 'is_lendable',\n // doc_count: 5,\n // },\n // {\n // key: 'is_borrowable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_borrow',\n // doc_count: 5,\n // },\n // {\n // key: 'is_browsable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_browse',\n // doc_count: 5,\n // },\n // {\n // key: 'is_readable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_waitlist',\n // doc_count: 5,\n // },\n // ],\n // }),\n // };\n\n // el.aggregations = aggs;\n // await el.updateComplete;\n\n // const facetsTemplate = el.shadowRoot?.querySelector(\n // 'facets-template'\n // ) as FacetsTemplate;\n // await facetsTemplate?.updateComplete;\n // await new Promise(res => {\n // setTimeout(res, 100);\n // });\n\n // const lendingFacets = facetsTemplate?.shadowRoot?.querySelectorAll(\n // 'facet-row'\n // ) as ArrayLike<FacetRow>;\n // expect(lendingFacets?.length).to.equal(3);\n\n // expect(lendingFacets[0].shadowRoot?.textContent?.trim()).to.match(\n // /^Lending Library\\s*5$/\n // );\n // expect(lendingFacets[1].shadowRoot?.textContent?.trim()).to.match(\n // /^Borrow 14 Days\\s*5$/\n // );\n // expect(lendingFacets[2].shadowRoot?.textContent?.trim()).to.match(\n // /^Always Available\\s*4$/\n // );\n // });\n\n // it('does not render a More... link for lending facets', async () => {\n // const el = await fixture<CollectionFacets>(\n // html`<collection-facets></collection-facets>`\n // );\n\n // const aggs: Record<string, Aggregation> = {\n // lending: new Aggregation({\n // buckets: [\n // {\n // key: 'is_lendable',\n // doc_count: 5,\n // },\n // {\n // key: 'is_borrowable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_borrow',\n // doc_count: 5,\n // },\n // {\n // key: 'is_browsable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_browse',\n // doc_count: 5,\n // },\n // {\n // key: 'is_readable',\n // doc_count: 4,\n // },\n // {\n // key: 'available_to_waitlist',\n // doc_count: 5,\n // },\n // ],\n // }),\n // };\n\n // el.aggregations = aggs;\n // await el.updateComplete;\n\n // const moreLink = el.shadowRoot?.querySelector('.more-link');\n // expect(moreLink).not.to.exist;\n // });\n\n it('always renders the mediatype:collection facet when present', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n mediatype: new Aggregation({\n buckets: [\n {\n key: 'texts',\n doc_count: 10000,\n },\n {\n key: 'image',\n doc_count: 9000,\n },\n {\n key: 'audio',\n doc_count: 8000,\n },\n {\n key: 'movies',\n doc_count: 7000,\n },\n {\n key: 'software',\n doc_count: 6000,\n },\n {\n key: 'data',\n doc_count: 5000,\n },\n {\n key: 'etree',\n doc_count: 4000,\n },\n {\n key: 'collection',\n doc_count: 1,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const facetsTemplate = el.shadowRoot?.querySelector('facets-template');\n const facetRows = facetsTemplate?.shadowRoot?.querySelectorAll(\n 'facet-row',\n ) as ArrayLike<FacetRow>;\n expect(facetRows?.length).to.equal(6);\n expect(facetRows?.[5]?.bucket?.key).to.equal('collection');\n });\n\n it('renders the mediatype:collection facet even when >=6 other mediatypes are selected', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n mediatype: new Aggregation({\n buckets: [\n {\n key: 'texts',\n doc_count: 10000,\n },\n {\n key: 'image',\n doc_count: 9000,\n },\n {\n key: 'audio',\n doc_count: 8000,\n },\n {\n key: 'movies',\n doc_count: 7000,\n },\n {\n key: 'software',\n doc_count: 6000,\n },\n {\n key: 'data',\n doc_count: 5000,\n },\n {\n key: 'etree',\n doc_count: 4000,\n },\n {\n key: 'collection',\n doc_count: 1,\n },\n ],\n }),\n };\n\n const selectedFacets = getDefaultSelectedFacets();\n selectedFacets.mediatype = {\n texts: { key: 'texts', count: 10000, state: 'selected' },\n image: { key: 'image', count: 9000, state: 'selected' },\n audio: { key: 'audio', count: 8000, state: 'selected' },\n movies: { key: 'movies', count: 7000, state: 'selected' },\n software: { key: 'software', count: 6000, state: 'selected' },\n data: { key: 'data', count: 5000, state: 'selected' },\n etree: { key: 'etree', count: 4000, state: 'selected' },\n };\n\n el.aggregations = aggs;\n el.selectedFacets = selectedFacets;\n await el.updateComplete;\n\n const facetsTemplate = el.shadowRoot?.querySelector('facets-template');\n const facetRows = facetsTemplate?.shadowRoot?.querySelectorAll(\n 'facet-row',\n ) as ArrayLike<FacetRow>;\n expect(facetRows?.length).to.equal(8);\n expect(facetRows?.[7]?.bucket?.key).to.equal('collection');\n });\n\n it('uses specified facet display order', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .facetDisplayOrder=${['language', 'creator'] as FacetOption[]}\n ></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n mediatype: new Aggregation({\n buckets: [{ key: 'texts', doc_count: 5 }],\n }),\n collection: new Aggregation({\n buckets: [{ key: 'foo', doc_count: 10 }],\n }),\n creator: new Aggregation({\n buckets: [{ key: 'bar', doc_count: 15 }],\n }),\n language: new Aggregation({\n buckets: [{ key: 'baz', doc_count: 20 }],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const facetHeaders = el.shadowRoot?.querySelectorAll('.facet-group-header');\n\n // The only two facet groups should be Language and Creator (in that order)\n expect(facetHeaders?.length).to.equal(2);\n expect(facetHeaders?.[0].textContent).to.contain('Language');\n expect(facetHeaders?.[1].textContent).to.contain('Creator');\n });\n\n describe('More Facets', () => {\n it('Does not render < allowedFacetCount', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const moreLink = el.shadowRoot?.querySelector('.more-link');\n expect(moreLink).to.be.null;\n });\n\n it('Render More Facets', async () => {\n const modalManager = await fixture<ModalManager>(\n html`<modal-manager></modal-manager>`,\n );\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .modalManager=${modalManager}\n ></collection-facets>`,\n );\n\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n {\n key: 'fi',\n doc_count: 5,\n },\n {\n key: 'fum',\n doc_count: 5,\n },\n {\n key: 'flee',\n doc_count: 5,\n },\n {\n key: 'wheee',\n doc_count: 5,\n },\n {\n key: 'whooo',\n doc_count: 5,\n },\n {\n key: 'boop',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n let eventCaught = false;\n let eventFacet = '';\n el.addEventListener('showMoreFacets', e => {\n eventFacet = (e as CustomEvent).detail;\n eventCaught = true;\n });\n\n const moreLink = el.shadowRoot?.querySelector(\n '.more-link',\n ) as HTMLButtonElement;\n expect(moreLink).to.exist; // has link\n\n const showModalSpy = sinon.spy(\n el.modalManager as ModalManagerInterface,\n 'showModal',\n );\n // let's pop up modal\n moreLink?.click();\n await el.updateComplete;\n\n expect(showModalSpy.callCount).to.equal(1);\n expect(el.modalManager?.classList.contains('more-search-facets')).to.be\n .true;\n expect(eventCaught).to.be.true;\n expect(eventFacet).to.equal('subject' as FacetOption);\n });\n });\n\n it('fire analytics on more link', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .analyticsHandler=${mockAnalyticsHandler}\n ></collection-facets>`,\n );\n const aggs: Record<string, Aggregation> = {\n subject: new Aggregation({\n buckets: [\n {\n key: 'foo',\n doc_count: 5,\n },\n {\n key: 'fi',\n doc_count: 5,\n },\n {\n key: 'fum',\n doc_count: 5,\n },\n {\n key: 'flee',\n doc_count: 5,\n },\n {\n key: 'wheee',\n doc_count: 5,\n },\n {\n key: 'whooo',\n doc_count: 5,\n },\n {\n key: 'boop',\n doc_count: 5,\n },\n ],\n }),\n };\n\n el.aggregations = aggs;\n await el.updateComplete;\n\n const moreLink = el.shadowRoot?.querySelector(\n '.more-link',\n ) as HTMLButtonElement;\n\n expect(moreLink).to.exist; // has link\n\n moreLink?.click();\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('showMoreFacetsModal');\n expect(mockAnalyticsHandler.callLabel).to.equal('subject');\n });\n\n it('includes Part Of section for collections', async () => {\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .baseNavigationUrl=${''}\n .withinCollection=${'foo'}\n .parentCollections=${['bar', 'baz']}\n .collectionTitles=${new Map([\n ['foo', 'foo-name'],\n ['bar', 'bar-name'],\n ['baz', 'baz-name'],\n ])}\n ></collection-facets>`,\n );\n\n const partOfSection = el.shadowRoot?.querySelector('.partof-collections');\n expect(partOfSection).to.exist;\n\n const partOfLinks = partOfSection?.querySelectorAll('a[href]');\n expect(partOfLinks?.length).to.equal(2);\n\n expect(partOfLinks?.[0]?.textContent?.trim()).to.equal('bar-name');\n expect(partOfLinks?.[0]?.getAttribute('href')).to.equal('/details/bar');\n expect(partOfLinks?.[1]?.textContent?.trim()).to.equal('baz-name');\n expect(partOfLinks?.[1]?.getAttribute('href')).to.equal('/details/baz');\n });\n\n it('does not include Part Of section without parent collections', async () => {\n // No parentCollections prop\n const el = await fixture<CollectionFacets>(\n html`<collection-facets .withinCollection=${'foo'}></collection-facets>`,\n );\n\n const partOfSection = el.shadowRoot?.querySelector('.partof-collections');\n expect(partOfSection).not.to.exist;\n });\n\n it('fires analytics on expanding date picker', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .analyticsHandler=${mockAnalyticsHandler}\n ></collection-facets>`,\n );\n\n el.fullYearAggregationLoading = false;\n el.showHistogramDatePicker = true;\n el.allowExpandingDatePicker = true;\n el.fullYearsHistogramAggregation = new Aggregation({\n buckets: [1, 2, 3],\n first_bucket_key: 0,\n last_bucket_key: 2,\n });\n await el.updateComplete;\n\n const expandBtn = el.shadowRoot?.querySelector(\n '.expand-date-picker-btn',\n ) as HTMLButtonElement;\n expect(expandBtn).to.exist;\n\n // Click the expand button to open the modal\n expandBtn?.click();\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('histogramExpanded');\n expect(mockAnalyticsHandler.callLabel).to.equal(window.location.href);\n });\n\n it('fires analytics on clicking Part Of collection link', async () => {\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<CollectionFacets>(\n html`<collection-facets\n .baseNavigationUrl=${''}\n .withinCollection=${'foo'}\n .parentCollections=${['bar']}\n .analyticsHandler=${mockAnalyticsHandler}\n ></collection-facets>`,\n );\n\n const partOfLinks = el.shadowRoot?.querySelectorAll(\n '.partof-collections a[href]',\n );\n expect(partOfLinks?.length).to.equal(1);\n\n // Click the expand button to open the modal\n const link = partOfLinks?.[0] as HTMLAnchorElement;\n link?.addEventListener('click', e => e.preventDefault());\n link?.click();\n await el.updateComplete;\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('partOfCollectionClicked');\n expect(mockAnalyticsHandler.callLabel).to.equal('bar');\n });\n});\n"]}
@@ -68,12 +68,13 @@ describe('Restoration state handler', () => {
68
68
  expect(restorationState.currentPage).to.equal(42);
69
69
  });
70
70
  it('should restore selected year facets from URL', async () => {
71
+ var _a;
71
72
  const handler = new RestorationStateHandler({ context: 'search' });
72
73
  const url = new URL(window.location.href);
73
74
  url.search = '?and[]=year:"2018"';
74
75
  window.history.replaceState({ path: url.href }, '', url.href);
75
76
  const restorationState = handler.getRestorationState();
76
- expect(restorationState.selectedFacets.year['2018'].state).to.equal('selected');
77
+ expect((_a = restorationState.selectedFacets.year) === null || _a === void 0 ? void 0 : _a['2018'].state).to.equal('selected');
77
78
  });
78
79
  it('should ignore unrecognized facet types in URL', async () => {
79
80
  const handler = new RestorationStateHandler({ context: 'search' });
@@ -109,56 +110,62 @@ describe('Restoration state handler', () => {
109
110
  expect(restorationState.selectedTitleFilter).to.equal('F');
110
111
  });
111
112
  it('should restore other selected facets from URL', async () => {
113
+ var _a;
112
114
  const handler = new RestorationStateHandler({ context: 'search' });
113
115
  const url = new URL(window.location.href);
114
116
  url.search = '?and[]=subject:"foo"';
115
117
  window.history.replaceState({ path: url.href }, '', url.href);
116
118
  const restorationState = handler.getRestorationState();
117
- expect(restorationState.selectedFacets.subject.foo.state).to.equal('selected');
119
+ expect((_a = restorationState.selectedFacets.subject) === null || _a === void 0 ? void 0 : _a.foo.state).to.equal('selected');
118
120
  });
119
121
  it('should restore negative facets from URL', async () => {
122
+ var _a;
120
123
  const handler = new RestorationStateHandler({ context: 'search' });
121
124
  const url = new URL(window.location.href);
122
125
  url.search = '?not[]=year:2018';
123
126
  window.history.replaceState({ path: url.href }, '', url.href);
124
127
  const restorationState = handler.getRestorationState();
125
- expect(restorationState.selectedFacets.year['2018'].state).to.equal('hidden');
128
+ expect((_a = restorationState.selectedFacets.year) === null || _a === void 0 ? void 0 : _a['2018'].state).to.equal('hidden');
126
129
  });
127
130
  it('should restore multiple selected/negative facets from URL', async () => {
131
+ var _a, _b, _c, _d;
128
132
  const handler = new RestorationStateHandler({ context: 'search' });
129
133
  const url = new URL(window.location.href);
130
134
  url.search =
131
135
  '?and[]=collection:"foo"&and[]=collection:"bar"&not[]=collection:"baz"&not[]=collection:"boop"';
132
136
  window.history.replaceState({ path: url.href }, '', url.href);
133
137
  const restorationState = handler.getRestorationState();
134
- expect(restorationState.selectedFacets.collection.foo.state).to.equal('selected');
135
- expect(restorationState.selectedFacets.collection.bar.state).to.equal('selected');
136
- expect(restorationState.selectedFacets.collection.baz.state).to.equal('hidden');
137
- expect(restorationState.selectedFacets.collection.boop.state).to.equal('hidden');
138
+ expect((_a = restorationState.selectedFacets.collection) === null || _a === void 0 ? void 0 : _a.foo.state).to.equal('selected');
139
+ expect((_b = restorationState.selectedFacets.collection) === null || _b === void 0 ? void 0 : _b.bar.state).to.equal('selected');
140
+ expect((_c = restorationState.selectedFacets.collection) === null || _c === void 0 ? void 0 : _c.baz.state).to.equal('hidden');
141
+ expect((_d = restorationState.selectedFacets.collection) === null || _d === void 0 ? void 0 : _d.boop.state).to.equal('hidden');
138
142
  });
139
143
  it('negative facets take precedence if both present in URL', async () => {
144
+ var _a;
140
145
  const handler = new RestorationStateHandler({ context: 'search' });
141
146
  const url = new URL(window.location.href);
142
147
  url.search = '?and[]=collection:"foo"&not[]=collection:"foo"';
143
148
  window.history.replaceState({ path: url.href }, '', url.href);
144
149
  const restorationState = handler.getRestorationState();
145
- expect(restorationState.selectedFacets.collection.foo.state).to.equal('hidden');
150
+ expect((_a = restorationState.selectedFacets.collection) === null || _a === void 0 ? void 0 : _a.foo.state).to.equal('hidden');
146
151
  });
147
152
  it('should restore selected facets with numbers in the square brackets', async () => {
153
+ var _a;
148
154
  const handler = new RestorationStateHandler({ context: 'search' });
149
155
  const url = new URL(window.location.href);
150
156
  url.search = '?and[12]=subject:"foo"';
151
157
  window.history.replaceState({ path: url.href }, '', url.href);
152
158
  const restorationState = handler.getRestorationState();
153
- expect(restorationState.selectedFacets.subject.foo.state).to.equal('selected');
159
+ expect((_a = restorationState.selectedFacets.subject) === null || _a === void 0 ? void 0 : _a.foo.state).to.equal('selected');
154
160
  });
155
161
  it('should restore negative facets with numbers in the square brackets', async () => {
162
+ var _a;
156
163
  const handler = new RestorationStateHandler({ context: 'search' });
157
164
  const url = new URL(window.location.href);
158
165
  url.search = '?not[12]=year:2018';
159
166
  window.history.replaceState({ path: url.href }, '', url.href);
160
167
  const restorationState = handler.getRestorationState();
161
- expect(restorationState.selectedFacets.year['2018'].state).to.equal('hidden');
168
+ expect((_a = restorationState.selectedFacets.year) === null || _a === void 0 ? void 0 : _a['2018'].state).to.equal('hidden');
162
169
  });
163
170
  it('should restore sort from URL (space format)', async () => {
164
171
  const handler = new RestorationStateHandler({ context: 'search' });