@internetarchive/collection-browser 0.3.5-alpha.1 → 0.3.6

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 (236) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +26 -26
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.js +9 -9
  11. package/dist/src/app-root.d.ts +47 -43
  12. package/dist/src/app-root.js +331 -285
  13. package/dist/src/app-root.js.map +1 -1
  14. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  15. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  16. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  17. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  18. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  19. package/dist/src/assets/img/icons/chevron.js +2 -2
  20. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  21. package/dist/src/assets/img/icons/empty-query.js +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  23. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  24. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  25. package/dist/src/assets/img/icons/eye.js +2 -2
  26. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  27. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  28. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  29. package/dist/src/assets/img/icons/login-required.js +2 -2
  30. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  31. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  32. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  33. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  34. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  35. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  36. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  37. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  38. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  39. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  40. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  41. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  42. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  43. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  44. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  45. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  46. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  47. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  48. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  49. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  50. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  51. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  52. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  53. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  54. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  55. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  56. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  57. package/dist/src/assets/img/icons/null-result.js +2 -2
  58. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  59. package/dist/src/assets/img/icons/restricted.js +2 -2
  60. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  61. package/dist/src/assets/img/icons/reviews.js +2 -2
  62. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  63. package/dist/src/assets/img/icons/upload.js +2 -2
  64. package/dist/src/assets/img/icons/views.d.ts +1 -1
  65. package/dist/src/assets/img/icons/views.js +2 -2
  66. package/dist/src/circular-activity-indicator.d.ts +5 -5
  67. package/dist/src/circular-activity-indicator.js +17 -17
  68. package/dist/src/collection-browser.d.ts +246 -245
  69. package/dist/src/collection-browser.js +1370 -1359
  70. package/dist/src/collection-browser.js.map +1 -1
  71. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  72. package/dist/src/collection-facets/facet-tombstone-row.js +42 -42
  73. package/dist/src/collection-facets/facet-tombstone-row.js.map +1 -1
  74. package/dist/src/collection-facets/facets-template.d.ts +16 -16
  75. package/dist/src/collection-facets/facets-template.js +130 -128
  76. package/dist/src/collection-facets/facets-template.js.map +1 -1
  77. package/dist/src/collection-facets/more-facets-content.d.ts +76 -76
  78. package/dist/src/collection-facets/more-facets-content.js +353 -353
  79. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  80. package/dist/src/collection-facets/more-facets-pagination.js +192 -192
  81. package/dist/src/collection-facets.d.ts +77 -77
  82. package/dist/src/collection-facets.js +551 -551
  83. package/dist/src/collection-facets.js.map +1 -1
  84. package/dist/src/empty-placeholder.d.ts +11 -11
  85. package/dist/src/empty-placeholder.js +42 -42
  86. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  87. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  88. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  89. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  90. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  91. package/dist/src/mediatype/mediatype-config.js +85 -85
  92. package/dist/src/models.d.ts +103 -102
  93. package/dist/src/models.js +117 -117
  94. package/dist/src/models.js.map +1 -1
  95. package/dist/src/restoration-state-handler.d.ts +46 -45
  96. package/dist/src/restoration-state-handler.js +230 -220
  97. package/dist/src/restoration-state-handler.js.map +1 -1
  98. package/dist/src/sort-filter-bar/alpha-bar.d.ts +9 -9
  99. package/dist/src/sort-filter-bar/alpha-bar.js +41 -41
  100. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  101. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  102. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  103. package/dist/src/sort-filter-bar/img/list.js +2 -2
  104. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  105. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  106. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  107. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  108. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +107 -107
  109. package/dist/src/sort-filter-bar/sort-filter-bar.js +423 -423
  110. package/dist/src/styles/item-image-styles.d.ts +8 -8
  111. package/dist/src/styles/item-image-styles.js +9 -9
  112. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  113. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  114. package/dist/src/tiles/grid/account-tile.d.ts +8 -8
  115. package/dist/src/tiles/grid/account-tile.js +20 -20
  116. package/dist/src/tiles/grid/collection-tile.d.ts +7 -7
  117. package/dist/src/tiles/grid/collection-tile.js +23 -23
  118. package/dist/src/tiles/grid/item-tile.d.ts +24 -24
  119. package/dist/src/tiles/grid/item-tile.js +87 -87
  120. package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
  121. package/dist/src/tiles/grid/tile-stats.js +46 -40
  122. package/dist/src/tiles/grid/tile-stats.js.map +1 -1
  123. package/dist/src/tiles/image-block.d.ts +17 -17
  124. package/dist/src/tiles/image-block.js +69 -69
  125. package/dist/src/tiles/item-image.d.ts +31 -31
  126. package/dist/src/tiles/item-image.js +103 -103
  127. package/dist/src/tiles/list/account-label.d.ts +1 -1
  128. package/dist/src/tiles/list/account-label.js +6 -6
  129. package/dist/src/tiles/list/date-label.d.ts +1 -1
  130. package/dist/src/tiles/list/date-label.js +12 -12
  131. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
  132. package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
  133. package/dist/src/tiles/list/tile-list-compact.d.ts +21 -20
  134. package/dist/src/tiles/list/tile-list-compact.js +94 -90
  135. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  136. package/dist/src/tiles/list/tile-list.d.ts +50 -50
  137. package/dist/src/tiles/list/tile-list.js +271 -268
  138. package/dist/src/tiles/list/tile-list.js.map +1 -1
  139. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  140. package/dist/src/tiles/mediatype-icon.js +49 -47
  141. package/dist/src/tiles/mediatype-icon.js.map +1 -1
  142. package/dist/src/tiles/overlay/icon-overlay.d.ts +7 -7
  143. package/dist/src/tiles/overlay/icon-overlay.js +30 -30
  144. package/dist/src/tiles/overlay/text-overlay.d.ts +8 -8
  145. package/dist/src/tiles/overlay/text-overlay.js +31 -31
  146. package/dist/src/tiles/text-snippet-block.d.ts +29 -29
  147. package/dist/src/tiles/text-snippet-block.js +81 -81
  148. package/dist/src/tiles/tile-dispatcher.d.ts +36 -36
  149. package/dist/src/tiles/tile-dispatcher.js +128 -128
  150. package/dist/src/utils/analytics-events.d.ts +22 -22
  151. package/dist/src/utils/analytics-events.js +24 -24
  152. package/dist/src/utils/format-count.d.ts +7 -7
  153. package/dist/src/utils/format-count.js +76 -76
  154. package/dist/src/utils/format-date.d.ts +2 -2
  155. package/dist/src/utils/format-date.js +23 -23
  156. package/dist/test/collection-browser.test.d.ts +1 -1
  157. package/dist/test/collection-browser.test.js +481 -415
  158. package/dist/test/collection-browser.test.js.map +1 -1
  159. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  160. package/dist/test/collection-facets/facets-template.test.js +62 -62
  161. package/dist/test/collection-facets/facets-template.test.js.map +1 -1
  162. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  163. package/dist/test/collection-facets/more-facets-content.test.js +114 -114
  164. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  165. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  166. package/dist/test/collection-facets.test.d.ts +2 -2
  167. package/dist/test/collection-facets.test.js +498 -498
  168. package/dist/test/empty-placeholder.test.d.ts +1 -1
  169. package/dist/test/empty-placeholder.test.js +33 -33
  170. package/dist/test/icon-overlay.test.d.ts +1 -1
  171. package/dist/test/icon-overlay.test.js +24 -24
  172. package/dist/test/image-block.test.d.ts +1 -1
  173. package/dist/test/image-block.test.js +48 -48
  174. package/dist/test/item-image.test.d.ts +1 -1
  175. package/dist/test/item-image.test.js +56 -56
  176. package/dist/test/mediatype-config.test.d.ts +1 -1
  177. package/dist/test/mediatype-config.test.js +16 -16
  178. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  179. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  180. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
  181. package/dist/test/mocks/mock-collection-name-cache.js +13 -13
  182. package/dist/test/mocks/mock-search-responses.d.ts +8 -8
  183. package/dist/test/mocks/mock-search-responses.js +198 -198
  184. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  185. package/dist/test/mocks/mock-search-service.d.ts +13 -13
  186. package/dist/test/mocks/mock-search-service.js +32 -32
  187. package/dist/test/mocks/mock-search-service.js.map +1 -1
  188. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  189. package/dist/test/restoration-state-handler.test.js +126 -117
  190. package/dist/test/restoration-state-handler.test.js.map +1 -1
  191. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  192. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +113 -113
  193. package/dist/test/text-overlay.test.d.ts +1 -1
  194. package/dist/test/text-overlay.test.js +41 -41
  195. package/dist/test/text-snippet-block.test.d.ts +1 -1
  196. package/dist/test/text-snippet-block.test.js +57 -57
  197. package/dist/test/tile-stats.test.d.ts +1 -1
  198. package/dist/test/tile-stats.test.js +33 -33
  199. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  200. package/dist/test/tiles/grid/item-tile.test.js +107 -107
  201. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  202. package/dist/test/tiles/list/tile-list-compact.test.js +125 -26
  203. package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -1
  204. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  205. package/dist/test/tiles/list/tile-list.test.js +79 -47
  206. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  207. package/dist/test/utils/format-count.test.d.ts +1 -1
  208. package/dist/test/utils/format-count.test.js +23 -23
  209. package/dist/test/utils/format-date.test.d.ts +1 -1
  210. package/dist/test/utils/format-date.test.js +17 -17
  211. package/index.html +24 -24
  212. package/local.archive.org.cert +86 -86
  213. package/local.archive.org.key +27 -27
  214. package/package.json +115 -115
  215. package/renovate.json +6 -6
  216. package/src/app-root.ts +104 -55
  217. package/src/collection-browser.ts +1503 -1488
  218. package/src/collection-facets/facet-tombstone-row.ts +40 -40
  219. package/src/collection-facets/facets-template.ts +5 -3
  220. package/src/collection-facets.ts +635 -635
  221. package/src/models.ts +1 -0
  222. package/src/restoration-state-handler.ts +19 -1
  223. package/src/tiles/grid/tile-stats.ts +18 -5
  224. package/src/tiles/list/tile-list-compact.ts +7 -3
  225. package/src/tiles/list/tile-list.ts +6 -1
  226. package/src/tiles/mediatype-icon.ts +2 -0
  227. package/test/collection-browser.test.ts +679 -599
  228. package/test/collection-facets/facets-template.test.ts +5 -3
  229. package/test/mocks/mock-search-responses.ts +226 -226
  230. package/test/mocks/mock-search-service.ts +61 -61
  231. package/test/restoration-state-handler.test.ts +12 -0
  232. package/test/tiles/list/tile-list-compact.test.ts +110 -0
  233. package/test/tiles/list/tile-list.test.ts +36 -0
  234. package/tsconfig.json +21 -21
  235. package/web-dev-server.config.mjs +30 -30
  236. package/web-test-runner.config.mjs +41 -41
@@ -1,552 +1,552 @@
1
- import { __decorate } from "tslib";
2
- /* eslint-disable import/no-duplicates */
3
- import { css, html, LitElement, nothing, } from 'lit';
4
- import { customElement, property, state } from 'lit/decorators.js';
5
- import { map } from 'lit/directives/map.js';
6
- import '@internetarchive/histogram-date-range';
7
- import '@internetarchive/feature-feedback';
8
- import '@internetarchive/collection-name-cache';
9
- import { ModalConfig, } from '@internetarchive/modal-manager';
10
- import chevronIcon from './assets/img/icons/chevron';
11
- import { facetDisplayOrder, facetTitles, lendingFacetDisplayNames, lendingFacetKeysVisibility, suppressedCollections, } from './models';
12
- import './collection-facets/more-facets-content';
13
- import './collection-facets/facets-template';
14
- import './collection-facets/facet-tombstone-row';
15
- import { analyticsActions, analyticsCategories, } from './utils/analytics-events';
16
- let CollectionFacets = class CollectionFacets extends LitElement {
17
- constructor() {
18
- super(...arguments);
19
- this.moreLinksVisible = true;
20
- this.facetsLoading = false;
21
- this.fullYearAggregationLoading = false;
22
- this.collapsableFacets = false;
23
- this.showHistogramDatePicker = false;
24
- this.openFacets = {
25
- subject: false,
26
- lending: false,
27
- mediatype: false,
28
- language: false,
29
- creator: false,
30
- collection: false,
31
- year: false,
32
- };
33
- this.allowedFacetCount = 6;
34
- }
35
- render() {
36
- return html `
37
- <div id="container" class="${this.facetsLoading ? 'loading' : ''}">
38
- ${(this.showHistogramDatePicker &&
39
- this.fullYearsHistogramAggregation) ||
40
- this.fullYearAggregationLoading
41
- ? html `
42
- <div class="facet-group">
43
- <h1>Year Published <feature-feedback></feature-feedback></h1>
44
- ${this.histogramTemplate}
45
- </div>
46
- `
47
- : nothing}
48
- ${this.mergedFacets.map(facetGroup => this.getFacetGroupTemplate(facetGroup))}
49
- </div>
50
- `;
51
- }
52
- updated(changed) {
53
- if (changed.has('selectedFacets')) {
54
- this.dispatchFacetsChangedEvent();
55
- }
56
- }
57
- // TODO: want to fire analytics?
58
- dispatchFacetsChangedEvent() {
59
- const event = new CustomEvent('facetsChanged', {
60
- detail: this.selectedFacets,
61
- });
62
- this.dispatchEvent(event);
63
- }
64
- get currentYearsHistogramAggregation() {
65
- var _a;
66
- return (_a = this.aggregations) === null || _a === void 0 ? void 0 : _a.year_histogram;
67
- }
68
- get histogramTemplate() {
69
- const { fullYearsHistogramAggregation } = this;
70
- return this.fullYearAggregationLoading
71
- ? html `<div class="histogram-loading-indicator">&hellip;</div>` // Ellipsis block
72
- : html `
73
- <histogram-date-range
74
- .minDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key}
75
- .maxDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key}
76
- .minSelectedDate=${this.minSelectedDate}
77
- .maxSelectedDate=${this.maxSelectedDate}
78
- .updateDelay=${100}
79
- missingDataMessage="..."
80
- .width=${180}
81
- .bins=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.buckets}
82
- @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
83
- ></histogram-date-range>
84
- `;
85
- }
86
- histogramDateRangeUpdated(e) {
87
- const { minDate, maxDate } = e.detail;
88
- const event = new CustomEvent('histogramDateRangeUpdated', {
89
- detail: { minDate, maxDate },
90
- });
91
- this.dispatchEvent(event);
92
- }
93
- /**
94
- * Combines the selected facets with the aggregations to create a single list of facets
95
- */
96
- get mergedFacets() {
97
- const facetGroups = [];
98
- facetDisplayOrder.forEach(facetKey => {
99
- var _a, _b;
100
- const selectedFacetGroup = this.selectedFacetGroups.find(group => group.key === facetKey);
101
- const aggregateFacetGroup = this.aggregationFacetGroups.find(group => group.key === facetKey);
102
- // if the user selected a facet, but it's not in the aggregation, we add it as-is
103
- if (selectedFacetGroup && !aggregateFacetGroup) {
104
- facetGroups.push(selectedFacetGroup);
105
- return;
106
- }
107
- // if we don't have an aggregate facet group, don't add this to the list
108
- if (!aggregateFacetGroup)
109
- return;
110
- // start with either the selected group if we have one, or the aggregate group
111
- const facetGroup = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : aggregateFacetGroup;
112
- // attach the counts to the selected buckets
113
- let bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
114
- const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
115
- return selectedBucket
116
- ? {
117
- ...bucket,
118
- count: selectedBucket.count,
119
- }
120
- : bucket;
121
- })) !== null && _a !== void 0 ? _a : [];
122
- // append any additional buckets that were not selected
123
- aggregateFacetGroup.buckets.forEach(bucket => {
124
- const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);
125
- if (existingBucket)
126
- return;
127
- bucketsWithCount.push(bucket);
128
- });
129
- // For lending facets, only include a specific subset of buckets
130
- if (facetKey === 'lending') {
131
- bucketsWithCount = bucketsWithCount.filter(bucket => lendingFacetKeysVisibility[bucket.key]);
132
- }
133
- /**
134
- * render limited facet items on page facet area
135
- *
136
- * - by-default we are showing 6 items
137
- * - additionally want to show all items (selected/suppressed) in page facet area
138
- */
139
- let allowedFacetCount = (_b = Object.keys((selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets) || [])) === null || _b === void 0 ? void 0 : _b.length;
140
- if (allowedFacetCount < this.allowedFacetCount) {
141
- allowedFacetCount = this.allowedFacetCount; // splice start index from 0th
142
- }
143
- // splice how many items we want to show in page facet area
144
- facetGroup.buckets = bucketsWithCount.splice(0, allowedFacetCount);
145
- facetGroups.push(facetGroup);
146
- });
147
- return facetGroups;
148
- }
149
- /**
150
- * Converts the selected facets to a `FacetGroup` array,
151
- * which is easier to work with
152
- */
153
- get selectedFacetGroups() {
154
- if (!this.selectedFacets)
155
- return [];
156
- const facetGroups = Object.entries(this.selectedFacets).map(([key, selectedFacets]) => {
157
- const option = key;
158
- const title = facetTitles[option];
159
- const buckets = Object.entries(selectedFacets).map(([value, facetData]) => {
160
- var _a, _b, _c;
161
- let displayText = value;
162
- // for selected languages, we store the language code instead of the
163
- // display name, so look up the name from the mapping
164
- if (option === 'language') {
165
- displayText =
166
- (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getLanguageNameFromCodeString(value)) !== null && _b !== void 0 ? _b : value;
167
- }
168
- // for lending facets, convert the key to a readable format
169
- if (option === 'lending') {
170
- displayText =
171
- (_c = lendingFacetDisplayNames[value]) !== null && _c !== void 0 ? _c : value;
172
- }
173
- return {
174
- displayText,
175
- key: value,
176
- count: facetData.count,
177
- state: facetData.state,
178
- };
179
- });
180
- return {
181
- title,
182
- key: option,
183
- buckets,
184
- };
185
- });
186
- return facetGroups;
187
- }
188
- /**
189
- * Converts the raw `aggregations` to `FacetGroups`, which are easier to use
190
- */
191
- get aggregationFacetGroups() {
192
- var _a;
193
- const facetGroups = [];
194
- Object.entries((_a = this.aggregations) !== null && _a !== void 0 ? _a : []).forEach(([key, buckets]) => {
195
- // the year_histogram data is in a different format so can't be handled here
196
- if (key === 'year_histogram')
197
- return;
198
- const option = key;
199
- const title = facetTitles[option];
200
- if (!title)
201
- return;
202
- let castedBuckets = buckets.buckets;
203
- if (option === 'collection') {
204
- // we are not showing fav- collections or certain deemphasized collections in facets
205
- castedBuckets = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.filter(bucket => {
206
- var _a;
207
- const bucketKey = (_a = bucket === null || bucket === void 0 ? void 0 : bucket.key) === null || _a === void 0 ? void 0 : _a.toString();
208
- return (!suppressedCollections[bucketKey] && !(bucketKey === null || bucketKey === void 0 ? void 0 : bucketKey.startsWith('fav-')));
209
- });
210
- }
211
- const facetBuckets = castedBuckets.map(bucket => {
212
- var _a, _b, _c;
213
- let bucketKey = bucket.key;
214
- let displayText = `${bucket.key}`;
215
- // for languages, we need to search by language code instead of the
216
- // display name, which is what we get from the search engine result
217
- if (option === 'language') {
218
- // const languageCodeKey = languageToCodeMap[bucket.key];
219
- bucketKey =
220
- (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getCodeStringFromLanguageName(`${bucket.key}`)) !== null && _b !== void 0 ? _b : bucket.key;
221
- // bucketKey = languageCodeKey ?? bucket.key;
222
- }
223
- // for lending facets, convert the bucket key to a readable format
224
- if (option === 'lending') {
225
- displayText =
226
- (_c = lendingFacetDisplayNames[bucket.key]) !== null && _c !== void 0 ? _c : `${bucket.key}`;
227
- }
228
- return {
229
- displayText,
230
- key: `${bucketKey}`,
231
- count: bucket.doc_count,
232
- state: 'none',
233
- };
234
- });
235
- const group = {
236
- title,
237
- key: option,
238
- buckets: facetBuckets,
239
- };
240
- facetGroups.push(group);
241
- });
242
- return facetGroups;
243
- }
244
- /**
245
- * Generate the template for a facet group with a header and the collapsible
246
- * chevron for the mobile view
247
- */
248
- getFacetGroupTemplate(facetGroup) {
249
- if (!this.facetsLoading && facetGroup.buckets.length === 0)
250
- return nothing;
251
- const { key } = facetGroup;
252
- const isOpen = this.openFacets[key];
253
- const collapser = html `
254
- <span class="collapser ${isOpen ? 'open' : ''}"> ${chevronIcon} </span>
255
- `;
256
- return html `
257
- <div class="facet-group ${this.collapsableFacets ? 'mobile' : ''}">
258
- <div class="facet-group-header">
259
- <h1
260
- @click=${() => {
261
- const newOpenFacets = { ...this.openFacets };
262
- newOpenFacets[key] = !isOpen;
263
- this.openFacets = newOpenFacets;
264
- }}
265
- @keyup=${() => {
266
- const newOpenFacets = { ...this.openFacets };
267
- newOpenFacets[key] = !isOpen;
268
- this.openFacets = newOpenFacets;
269
- }}
270
- >
271
- ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}
272
- </h1>
273
- ${this.facetsLoading
274
- ? nothing
275
- : this.moreFacetsSortingIcon(facetGroup)}
276
- </div>
277
- <div class="facet-group-content ${isOpen ? 'open' : ''}">
278
- ${this.facetsLoading
279
- ? this.getTombstoneFacetGroupTemplate()
280
- : html `
281
- ${this.getFacetTemplate(facetGroup)}
282
- ${this.searchMoreFacetsLink(facetGroup)}
283
- `}
284
- </div>
285
- </div>
286
- `;
287
- }
288
- getTombstoneFacetGroupTemplate() {
289
- // Render five tombstone rows
290
- return html `
291
- ${map(Array(5).fill(null), () => html `<facet-tombstone-row></facet-tombstone-row>`)}
292
- `;
293
- }
294
- moreFacetsSortingIcon(facetGroup) {
295
- // Display the sorting icon for every facet group except lending
296
- return facetGroup.key === 'lending'
297
- ? nothing
298
- : html `
299
- <input
300
- class="sorting-icon"
301
- type="image"
302
- @click=${() => this.showMoreFacetsModal(facetGroup, 'alpha')}
303
- src="https://archive.org/images/filter-count.png"
304
- alt="Sort alphabetically"
305
- />
306
- `;
307
- }
308
- /**
309
- * Generate the More... link button just below the facets group
310
- *
311
- * TODO: want to fire analytics?
312
- */
313
- searchMoreFacetsLink(facetGroup) {
314
- // Don't render More... links for FTS searches
315
- if (!this.moreLinksVisible) {
316
- return nothing;
317
- }
318
- // Don't render More... links for lending facets
319
- if (facetGroup.key === 'lending') {
320
- return nothing;
321
- }
322
- // Don't render More... link if the number of facets < this.allowedFacetCount
323
- if (Object.keys(facetGroup.buckets).length < this.allowedFacetCount) {
324
- return nothing;
325
- }
326
- return html `<button
327
- class="more-link"
328
- @click=${() => {
329
- var _a;
330
- this.showMoreFacetsModal(facetGroup, 'count');
331
- (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
332
- category: analyticsCategories.default,
333
- action: analyticsActions.showMoreFacetsModal,
334
- label: facetGroup.key,
335
- });
336
- this.dispatchEvent(new CustomEvent('showMoreFacets', { detail: facetGroup.key }));
337
- }}
338
- >
339
- More...
340
- </button>`;
341
- }
342
- async showMoreFacetsModal(facetGroup, sortedBy) {
343
- var _a, _b;
344
- const facetAggrKey = facetGroup.key;
345
- const customModalContent = html `
346
- <more-facets-content
347
- .analyticsHandler=${this.analyticsHandler}
348
- .facetKey=${facetGroup.key}
349
- .facetAggregationKey=${facetAggrKey}
350
- .fullQuery=${this.fullQuery}
351
- .modalManager=${this.modalManager}
352
- .searchService=${this.searchService}
353
- .searchType=${this.searchType}
354
- .collectionNameCache=${this.collectionNameCache}
355
- .languageCodeHandler=${this.languageCodeHandler}
356
- .selectedFacets=${this.selectedFacets}
357
- .sortedBy=${sortedBy}
358
- @facetsChanged=${(e) => {
359
- const event = new CustomEvent('facetsChanged', {
360
- detail: e.detail,
361
- bubbles: true,
362
- composed: true,
363
- });
364
- this.dispatchEvent(event);
365
- }}
366
- >
367
- </more-facets-content>
368
- `;
369
- const config = new ModalConfig({
370
- bodyColor: '#fff',
371
- headerColor: '#194880',
372
- showHeaderLogo: false,
373
- closeOnBackdropClick: true,
374
- title: html `Select filters`,
375
- });
376
- (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.add('more-search-facets');
377
- (_b = this.modalManager) === null || _b === void 0 ? void 0 : _b.showModal({
378
- config,
379
- customModalContent,
380
- });
381
- }
382
- /**
383
- * Generate the list template for each bucket in a facet group
384
- */
385
- getFacetTemplate(facetGroup) {
386
- return html `
387
- <facets-template
388
- .facetGroup=${facetGroup}
389
- .selectedFacets=${this.selectedFacets}
390
- .renderOn=${'page'}
391
- .collectionNameCache=${this.collectionNameCache}
392
- @selectedFacetsChanged=${(e) => {
393
- const event = new CustomEvent('facetsChanged', {
394
- detail: e.detail,
395
- bubbles: true,
396
- composed: true,
397
- });
398
- this.dispatchEvent(event);
399
- }}
400
- ></facets-template>
401
- `;
402
- }
403
- static get styles() {
404
- return css `
405
- #container.loading {
406
- opacity: 0.5;
407
- }
408
-
409
- .histogram-loading-indicator {
410
- width: 100%;
411
- height: 2.25rem;
412
- margin-top: 1.75rem;
413
- font-size: 1.4rem;
414
- text-align: center;
415
- }
416
-
417
- .collapser {
418
- display: inline-block;
419
- cursor: pointer;
420
- width: 10px;
421
- height: 10px;
422
- }
423
-
424
- .collapser svg {
425
- transition: transform 0.2s ease-in-out;
426
- }
427
-
428
- .collapser.open svg {
429
- transform: rotate(90deg);
430
- }
431
-
432
- .facet-group {
433
- margin-bottom: 2rem;
434
- }
435
-
436
- .facet-group h1 {
437
- margin-bottom: 0.7rem;
438
- }
439
-
440
- .facet-group.mobile h1 {
441
- cursor: pointer;
442
- }
443
-
444
- .facet-group-header {
445
- display: flex;
446
- margin-bottom: 0.7rem;
447
- justify-content: space-between;
448
- border-bottom: 1px solid rgb(232, 232, 232);
449
- }
450
-
451
- .facet-group-content {
452
- transition: max-height 0.2s ease-in-out;
453
- }
454
-
455
- .facet-group.mobile .facet-group-content {
456
- max-height: 0;
457
- overflow: hidden;
458
- }
459
-
460
- .facet-group.mobile .facet-group-content.open {
461
- max-height: 2000px;
462
- }
463
-
464
- h1 {
465
- font-size: 1.4rem;
466
- font-weight: 200
467
- padding-bottom: 3px;
468
- margin: 0;
469
- }
470
-
471
- .more-link {
472
- font-size: 1.2rem;
473
- text-decoration: none;
474
- padding: 0;
475
- background: inherit;
476
- border: 0;
477
- color: var(--ia-theme-link-color, #4b64ff);
478
- cursor: pointer;
479
- }
480
-
481
- .sorting-icon {
482
- height: 15px;
483
- cursor: pointer;
484
- }
485
- `;
486
- }
487
- };
488
- __decorate([
489
- property({ type: Object })
490
- ], CollectionFacets.prototype, "searchService", void 0);
491
- __decorate([
492
- property({ type: String })
493
- ], CollectionFacets.prototype, "searchType", void 0);
494
- __decorate([
495
- property({ type: Object })
496
- ], CollectionFacets.prototype, "aggregations", void 0);
497
- __decorate([
498
- property({ type: Object })
499
- ], CollectionFacets.prototype, "fullYearsHistogramAggregation", void 0);
500
- __decorate([
501
- property({ type: String })
502
- ], CollectionFacets.prototype, "minSelectedDate", void 0);
503
- __decorate([
504
- property({ type: String })
505
- ], CollectionFacets.prototype, "maxSelectedDate", void 0);
506
- __decorate([
507
- property({ type: Boolean })
508
- ], CollectionFacets.prototype, "moreLinksVisible", void 0);
509
- __decorate([
510
- property({ type: Boolean })
511
- ], CollectionFacets.prototype, "facetsLoading", void 0);
512
- __decorate([
513
- property({ type: Boolean })
514
- ], CollectionFacets.prototype, "fullYearAggregationLoading", void 0);
515
- __decorate([
516
- property({ type: Object })
517
- ], CollectionFacets.prototype, "selectedFacets", void 0);
518
- __decorate([
519
- property({ type: Boolean })
520
- ], CollectionFacets.prototype, "collapsableFacets", void 0);
521
- __decorate([
522
- property({ type: Boolean })
523
- ], CollectionFacets.prototype, "showHistogramDatePicker", void 0);
524
- __decorate([
525
- property({ type: String })
526
- ], CollectionFacets.prototype, "fullQuery", void 0);
527
- __decorate([
528
- property({ type: Object, attribute: false })
529
- ], CollectionFacets.prototype, "modalManager", void 0);
530
- __decorate([
531
- property({ type: Object, attribute: false })
532
- ], CollectionFacets.prototype, "analyticsHandler", void 0);
533
- __decorate([
534
- property({ type: Object })
535
- ], CollectionFacets.prototype, "languageCodeHandler", void 0);
536
- __decorate([
537
- property({ type: Object })
538
- ], CollectionFacets.prototype, "collectionNameCache", void 0);
539
- __decorate([
540
- property({ type: Function })
541
- ], CollectionFacets.prototype, "onFacetClick", void 0);
542
- __decorate([
543
- state()
544
- ], CollectionFacets.prototype, "openFacets", void 0);
545
- __decorate([
546
- property({ type: Object, attribute: false })
547
- ], CollectionFacets.prototype, "allowedFacetCount", void 0);
548
- CollectionFacets = __decorate([
549
- customElement('collection-facets')
550
- ], CollectionFacets);
551
- export { CollectionFacets };
1
+ import { __decorate } from "tslib";
2
+ /* eslint-disable import/no-duplicates */
3
+ import { css, html, LitElement, nothing, } from 'lit';
4
+ import { customElement, property, state } from 'lit/decorators.js';
5
+ import { map } from 'lit/directives/map.js';
6
+ import '@internetarchive/histogram-date-range';
7
+ import '@internetarchive/feature-feedback';
8
+ import '@internetarchive/collection-name-cache';
9
+ import { ModalConfig, } from '@internetarchive/modal-manager';
10
+ import chevronIcon from './assets/img/icons/chevron';
11
+ import { facetDisplayOrder, facetTitles, lendingFacetDisplayNames, lendingFacetKeysVisibility, suppressedCollections, } from './models';
12
+ import './collection-facets/more-facets-content';
13
+ import './collection-facets/facets-template';
14
+ import './collection-facets/facet-tombstone-row';
15
+ import { analyticsActions, analyticsCategories, } from './utils/analytics-events';
16
+ let CollectionFacets = class CollectionFacets extends LitElement {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.moreLinksVisible = true;
20
+ this.facetsLoading = false;
21
+ this.fullYearAggregationLoading = false;
22
+ this.collapsableFacets = false;
23
+ this.showHistogramDatePicker = false;
24
+ this.openFacets = {
25
+ subject: false,
26
+ lending: false,
27
+ mediatype: false,
28
+ language: false,
29
+ creator: false,
30
+ collection: false,
31
+ year: false,
32
+ };
33
+ this.allowedFacetCount = 6;
34
+ }
35
+ render() {
36
+ return html `
37
+ <div id="container" class="${this.facetsLoading ? 'loading' : ''}">
38
+ ${(this.showHistogramDatePicker &&
39
+ this.fullYearsHistogramAggregation) ||
40
+ this.fullYearAggregationLoading
41
+ ? html `
42
+ <div class="facet-group">
43
+ <h1>Year Published <feature-feedback></feature-feedback></h1>
44
+ ${this.histogramTemplate}
45
+ </div>
46
+ `
47
+ : nothing}
48
+ ${this.mergedFacets.map(facetGroup => this.getFacetGroupTemplate(facetGroup))}
49
+ </div>
50
+ `;
51
+ }
52
+ updated(changed) {
53
+ if (changed.has('selectedFacets')) {
54
+ this.dispatchFacetsChangedEvent();
55
+ }
56
+ }
57
+ // TODO: want to fire analytics?
58
+ dispatchFacetsChangedEvent() {
59
+ const event = new CustomEvent('facetsChanged', {
60
+ detail: this.selectedFacets,
61
+ });
62
+ this.dispatchEvent(event);
63
+ }
64
+ get currentYearsHistogramAggregation() {
65
+ var _a;
66
+ return (_a = this.aggregations) === null || _a === void 0 ? void 0 : _a.year_histogram;
67
+ }
68
+ get histogramTemplate() {
69
+ const { fullYearsHistogramAggregation } = this;
70
+ return this.fullYearAggregationLoading
71
+ ? html `<div class="histogram-loading-indicator">&hellip;</div>` // Ellipsis block
72
+ : html `
73
+ <histogram-date-range
74
+ .minDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key}
75
+ .maxDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key}
76
+ .minSelectedDate=${this.minSelectedDate}
77
+ .maxSelectedDate=${this.maxSelectedDate}
78
+ .updateDelay=${100}
79
+ missingDataMessage="..."
80
+ .width=${180}
81
+ .bins=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.buckets}
82
+ @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
83
+ ></histogram-date-range>
84
+ `;
85
+ }
86
+ histogramDateRangeUpdated(e) {
87
+ const { minDate, maxDate } = e.detail;
88
+ const event = new CustomEvent('histogramDateRangeUpdated', {
89
+ detail: { minDate, maxDate },
90
+ });
91
+ this.dispatchEvent(event);
92
+ }
93
+ /**
94
+ * Combines the selected facets with the aggregations to create a single list of facets
95
+ */
96
+ get mergedFacets() {
97
+ const facetGroups = [];
98
+ facetDisplayOrder.forEach(facetKey => {
99
+ var _a, _b;
100
+ const selectedFacetGroup = this.selectedFacetGroups.find(group => group.key === facetKey);
101
+ const aggregateFacetGroup = this.aggregationFacetGroups.find(group => group.key === facetKey);
102
+ // if the user selected a facet, but it's not in the aggregation, we add it as-is
103
+ if (selectedFacetGroup && !aggregateFacetGroup) {
104
+ facetGroups.push(selectedFacetGroup);
105
+ return;
106
+ }
107
+ // if we don't have an aggregate facet group, don't add this to the list
108
+ if (!aggregateFacetGroup)
109
+ return;
110
+ // start with either the selected group if we have one, or the aggregate group
111
+ const facetGroup = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : aggregateFacetGroup;
112
+ // attach the counts to the selected buckets
113
+ let bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
114
+ const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
115
+ return selectedBucket
116
+ ? {
117
+ ...bucket,
118
+ count: selectedBucket.count,
119
+ }
120
+ : bucket;
121
+ })) !== null && _a !== void 0 ? _a : [];
122
+ // append any additional buckets that were not selected
123
+ aggregateFacetGroup.buckets.forEach(bucket => {
124
+ const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);
125
+ if (existingBucket)
126
+ return;
127
+ bucketsWithCount.push(bucket);
128
+ });
129
+ // For lending facets, only include a specific subset of buckets
130
+ if (facetKey === 'lending') {
131
+ bucketsWithCount = bucketsWithCount.filter(bucket => lendingFacetKeysVisibility[bucket.key]);
132
+ }
133
+ /**
134
+ * render limited facet items on page facet area
135
+ *
136
+ * - by-default we are showing 6 items
137
+ * - additionally want to show all items (selected/suppressed) in page facet area
138
+ */
139
+ let allowedFacetCount = (_b = Object.keys((selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets) || [])) === null || _b === void 0 ? void 0 : _b.length;
140
+ if (allowedFacetCount < this.allowedFacetCount) {
141
+ allowedFacetCount = this.allowedFacetCount; // splice start index from 0th
142
+ }
143
+ // splice how many items we want to show in page facet area
144
+ facetGroup.buckets = bucketsWithCount.splice(0, allowedFacetCount);
145
+ facetGroups.push(facetGroup);
146
+ });
147
+ return facetGroups;
148
+ }
149
+ /**
150
+ * Converts the selected facets to a `FacetGroup` array,
151
+ * which is easier to work with
152
+ */
153
+ get selectedFacetGroups() {
154
+ if (!this.selectedFacets)
155
+ return [];
156
+ const facetGroups = Object.entries(this.selectedFacets).map(([key, selectedFacets]) => {
157
+ const option = key;
158
+ const title = facetTitles[option];
159
+ const buckets = Object.entries(selectedFacets).map(([value, facetData]) => {
160
+ var _a, _b, _c;
161
+ let displayText = value;
162
+ // for selected languages, we store the language code instead of the
163
+ // display name, so look up the name from the mapping
164
+ if (option === 'language') {
165
+ displayText =
166
+ (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getLanguageNameFromCodeString(value)) !== null && _b !== void 0 ? _b : value;
167
+ }
168
+ // for lending facets, convert the key to a readable format
169
+ if (option === 'lending') {
170
+ displayText =
171
+ (_c = lendingFacetDisplayNames[value]) !== null && _c !== void 0 ? _c : value;
172
+ }
173
+ return {
174
+ displayText,
175
+ key: value,
176
+ count: facetData.count,
177
+ state: facetData.state,
178
+ };
179
+ });
180
+ return {
181
+ title,
182
+ key: option,
183
+ buckets,
184
+ };
185
+ });
186
+ return facetGroups;
187
+ }
188
+ /**
189
+ * Converts the raw `aggregations` to `FacetGroups`, which are easier to use
190
+ */
191
+ get aggregationFacetGroups() {
192
+ var _a;
193
+ const facetGroups = [];
194
+ Object.entries((_a = this.aggregations) !== null && _a !== void 0 ? _a : []).forEach(([key, buckets]) => {
195
+ // the year_histogram data is in a different format so can't be handled here
196
+ if (key === 'year_histogram')
197
+ return;
198
+ const option = key;
199
+ const title = facetTitles[option];
200
+ if (!title)
201
+ return;
202
+ let castedBuckets = buckets.buckets;
203
+ if (option === 'collection') {
204
+ // we are not showing fav- collections or certain deemphasized collections in facets
205
+ castedBuckets = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.filter(bucket => {
206
+ var _a;
207
+ const bucketKey = (_a = bucket === null || bucket === void 0 ? void 0 : bucket.key) === null || _a === void 0 ? void 0 : _a.toString();
208
+ return (!suppressedCollections[bucketKey] && !(bucketKey === null || bucketKey === void 0 ? void 0 : bucketKey.startsWith('fav-')));
209
+ });
210
+ }
211
+ const facetBuckets = castedBuckets.map(bucket => {
212
+ var _a, _b, _c;
213
+ let bucketKey = bucket.key;
214
+ let displayText = `${bucket.key}`;
215
+ // for languages, we need to search by language code instead of the
216
+ // display name, which is what we get from the search engine result
217
+ if (option === 'language') {
218
+ // const languageCodeKey = languageToCodeMap[bucket.key];
219
+ bucketKey =
220
+ (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getCodeStringFromLanguageName(`${bucket.key}`)) !== null && _b !== void 0 ? _b : bucket.key;
221
+ // bucketKey = languageCodeKey ?? bucket.key;
222
+ }
223
+ // for lending facets, convert the bucket key to a readable format
224
+ if (option === 'lending') {
225
+ displayText =
226
+ (_c = lendingFacetDisplayNames[bucket.key]) !== null && _c !== void 0 ? _c : `${bucket.key}`;
227
+ }
228
+ return {
229
+ displayText,
230
+ key: `${bucketKey}`,
231
+ count: bucket.doc_count,
232
+ state: 'none',
233
+ };
234
+ });
235
+ const group = {
236
+ title,
237
+ key: option,
238
+ buckets: facetBuckets,
239
+ };
240
+ facetGroups.push(group);
241
+ });
242
+ return facetGroups;
243
+ }
244
+ /**
245
+ * Generate the template for a facet group with a header and the collapsible
246
+ * chevron for the mobile view
247
+ */
248
+ getFacetGroupTemplate(facetGroup) {
249
+ if (!this.facetsLoading && facetGroup.buckets.length === 0)
250
+ return nothing;
251
+ const { key } = facetGroup;
252
+ const isOpen = this.openFacets[key];
253
+ const collapser = html `
254
+ <span class="collapser ${isOpen ? 'open' : ''}"> ${chevronIcon} </span>
255
+ `;
256
+ return html `
257
+ <div class="facet-group ${this.collapsableFacets ? 'mobile' : ''}">
258
+ <div class="facet-group-header">
259
+ <h1
260
+ @click=${() => {
261
+ const newOpenFacets = { ...this.openFacets };
262
+ newOpenFacets[key] = !isOpen;
263
+ this.openFacets = newOpenFacets;
264
+ }}
265
+ @keyup=${() => {
266
+ const newOpenFacets = { ...this.openFacets };
267
+ newOpenFacets[key] = !isOpen;
268
+ this.openFacets = newOpenFacets;
269
+ }}
270
+ >
271
+ ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}
272
+ </h1>
273
+ ${this.facetsLoading
274
+ ? nothing
275
+ : this.moreFacetsSortingIcon(facetGroup)}
276
+ </div>
277
+ <div class="facet-group-content ${isOpen ? 'open' : ''}">
278
+ ${this.facetsLoading
279
+ ? this.getTombstoneFacetGroupTemplate()
280
+ : html `
281
+ ${this.getFacetTemplate(facetGroup)}
282
+ ${this.searchMoreFacetsLink(facetGroup)}
283
+ `}
284
+ </div>
285
+ </div>
286
+ `;
287
+ }
288
+ getTombstoneFacetGroupTemplate() {
289
+ // Render five tombstone rows
290
+ return html `
291
+ ${map(Array(5).fill(null), () => html `<facet-tombstone-row></facet-tombstone-row>`)}
292
+ `;
293
+ }
294
+ moreFacetsSortingIcon(facetGroup) {
295
+ // Display the sorting icon for every facet group except lending
296
+ return facetGroup.key === 'lending'
297
+ ? nothing
298
+ : html `
299
+ <input
300
+ class="sorting-icon"
301
+ type="image"
302
+ @click=${() => this.showMoreFacetsModal(facetGroup, 'alpha')}
303
+ src="https://archive.org/images/filter-count.png"
304
+ alt="Sort alphabetically"
305
+ />
306
+ `;
307
+ }
308
+ /**
309
+ * Generate the More... link button just below the facets group
310
+ *
311
+ * TODO: want to fire analytics?
312
+ */
313
+ searchMoreFacetsLink(facetGroup) {
314
+ // Don't render More... links for FTS searches
315
+ if (!this.moreLinksVisible) {
316
+ return nothing;
317
+ }
318
+ // Don't render More... links for lending facets
319
+ if (facetGroup.key === 'lending') {
320
+ return nothing;
321
+ }
322
+ // Don't render More... link if the number of facets < this.allowedFacetCount
323
+ if (Object.keys(facetGroup.buckets).length < this.allowedFacetCount) {
324
+ return nothing;
325
+ }
326
+ return html `<button
327
+ class="more-link"
328
+ @click=${() => {
329
+ var _a;
330
+ this.showMoreFacetsModal(facetGroup, 'count');
331
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
332
+ category: analyticsCategories.default,
333
+ action: analyticsActions.showMoreFacetsModal,
334
+ label: facetGroup.key,
335
+ });
336
+ this.dispatchEvent(new CustomEvent('showMoreFacets', { detail: facetGroup.key }));
337
+ }}
338
+ >
339
+ More...
340
+ </button>`;
341
+ }
342
+ async showMoreFacetsModal(facetGroup, sortedBy) {
343
+ var _a, _b;
344
+ const facetAggrKey = facetGroup.key;
345
+ const customModalContent = html `
346
+ <more-facets-content
347
+ .analyticsHandler=${this.analyticsHandler}
348
+ .facetKey=${facetGroup.key}
349
+ .facetAggregationKey=${facetAggrKey}
350
+ .fullQuery=${this.fullQuery}
351
+ .modalManager=${this.modalManager}
352
+ .searchService=${this.searchService}
353
+ .searchType=${this.searchType}
354
+ .collectionNameCache=${this.collectionNameCache}
355
+ .languageCodeHandler=${this.languageCodeHandler}
356
+ .selectedFacets=${this.selectedFacets}
357
+ .sortedBy=${sortedBy}
358
+ @facetsChanged=${(e) => {
359
+ const event = new CustomEvent('facetsChanged', {
360
+ detail: e.detail,
361
+ bubbles: true,
362
+ composed: true,
363
+ });
364
+ this.dispatchEvent(event);
365
+ }}
366
+ >
367
+ </more-facets-content>
368
+ `;
369
+ const config = new ModalConfig({
370
+ bodyColor: '#fff',
371
+ headerColor: '#194880',
372
+ showHeaderLogo: false,
373
+ closeOnBackdropClick: true,
374
+ title: html `Select filters`,
375
+ });
376
+ (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.add('more-search-facets');
377
+ (_b = this.modalManager) === null || _b === void 0 ? void 0 : _b.showModal({
378
+ config,
379
+ customModalContent,
380
+ });
381
+ }
382
+ /**
383
+ * Generate the list template for each bucket in a facet group
384
+ */
385
+ getFacetTemplate(facetGroup) {
386
+ return html `
387
+ <facets-template
388
+ .facetGroup=${facetGroup}
389
+ .selectedFacets=${this.selectedFacets}
390
+ .renderOn=${'page'}
391
+ .collectionNameCache=${this.collectionNameCache}
392
+ @selectedFacetsChanged=${(e) => {
393
+ const event = new CustomEvent('facetsChanged', {
394
+ detail: e.detail,
395
+ bubbles: true,
396
+ composed: true,
397
+ });
398
+ this.dispatchEvent(event);
399
+ }}
400
+ ></facets-template>
401
+ `;
402
+ }
403
+ static get styles() {
404
+ return css `
405
+ #container.loading {
406
+ opacity: 0.5;
407
+ }
408
+
409
+ .histogram-loading-indicator {
410
+ width: 100%;
411
+ height: 2.25rem;
412
+ margin-top: 1.75rem;
413
+ font-size: 1.4rem;
414
+ text-align: center;
415
+ }
416
+
417
+ .collapser {
418
+ display: inline-block;
419
+ cursor: pointer;
420
+ width: 10px;
421
+ height: 10px;
422
+ }
423
+
424
+ .collapser svg {
425
+ transition: transform 0.2s ease-in-out;
426
+ }
427
+
428
+ .collapser.open svg {
429
+ transform: rotate(90deg);
430
+ }
431
+
432
+ .facet-group {
433
+ margin-bottom: 2rem;
434
+ }
435
+
436
+ .facet-group h1 {
437
+ margin-bottom: 0.7rem;
438
+ }
439
+
440
+ .facet-group.mobile h1 {
441
+ cursor: pointer;
442
+ }
443
+
444
+ .facet-group-header {
445
+ display: flex;
446
+ margin-bottom: 0.7rem;
447
+ justify-content: space-between;
448
+ border-bottom: 1px solid rgb(232, 232, 232);
449
+ }
450
+
451
+ .facet-group-content {
452
+ transition: max-height 0.2s ease-in-out;
453
+ }
454
+
455
+ .facet-group.mobile .facet-group-content {
456
+ max-height: 0;
457
+ overflow: hidden;
458
+ }
459
+
460
+ .facet-group.mobile .facet-group-content.open {
461
+ max-height: 2000px;
462
+ }
463
+
464
+ h1 {
465
+ font-size: 1.4rem;
466
+ font-weight: 200
467
+ padding-bottom: 3px;
468
+ margin: 0;
469
+ }
470
+
471
+ .more-link {
472
+ font-size: 1.2rem;
473
+ text-decoration: none;
474
+ padding: 0;
475
+ background: inherit;
476
+ border: 0;
477
+ color: var(--ia-theme-link-color, #4b64ff);
478
+ cursor: pointer;
479
+ }
480
+
481
+ .sorting-icon {
482
+ height: 15px;
483
+ cursor: pointer;
484
+ }
485
+ `;
486
+ }
487
+ };
488
+ __decorate([
489
+ property({ type: Object })
490
+ ], CollectionFacets.prototype, "searchService", void 0);
491
+ __decorate([
492
+ property({ type: String })
493
+ ], CollectionFacets.prototype, "searchType", void 0);
494
+ __decorate([
495
+ property({ type: Object })
496
+ ], CollectionFacets.prototype, "aggregations", void 0);
497
+ __decorate([
498
+ property({ type: Object })
499
+ ], CollectionFacets.prototype, "fullYearsHistogramAggregation", void 0);
500
+ __decorate([
501
+ property({ type: String })
502
+ ], CollectionFacets.prototype, "minSelectedDate", void 0);
503
+ __decorate([
504
+ property({ type: String })
505
+ ], CollectionFacets.prototype, "maxSelectedDate", void 0);
506
+ __decorate([
507
+ property({ type: Boolean })
508
+ ], CollectionFacets.prototype, "moreLinksVisible", void 0);
509
+ __decorate([
510
+ property({ type: Boolean })
511
+ ], CollectionFacets.prototype, "facetsLoading", void 0);
512
+ __decorate([
513
+ property({ type: Boolean })
514
+ ], CollectionFacets.prototype, "fullYearAggregationLoading", void 0);
515
+ __decorate([
516
+ property({ type: Object })
517
+ ], CollectionFacets.prototype, "selectedFacets", void 0);
518
+ __decorate([
519
+ property({ type: Boolean })
520
+ ], CollectionFacets.prototype, "collapsableFacets", void 0);
521
+ __decorate([
522
+ property({ type: Boolean })
523
+ ], CollectionFacets.prototype, "showHistogramDatePicker", void 0);
524
+ __decorate([
525
+ property({ type: String })
526
+ ], CollectionFacets.prototype, "fullQuery", void 0);
527
+ __decorate([
528
+ property({ type: Object, attribute: false })
529
+ ], CollectionFacets.prototype, "modalManager", void 0);
530
+ __decorate([
531
+ property({ type: Object, attribute: false })
532
+ ], CollectionFacets.prototype, "analyticsHandler", void 0);
533
+ __decorate([
534
+ property({ type: Object })
535
+ ], CollectionFacets.prototype, "languageCodeHandler", void 0);
536
+ __decorate([
537
+ property({ type: Object })
538
+ ], CollectionFacets.prototype, "collectionNameCache", void 0);
539
+ __decorate([
540
+ property({ type: Function })
541
+ ], CollectionFacets.prototype, "onFacetClick", void 0);
542
+ __decorate([
543
+ state()
544
+ ], CollectionFacets.prototype, "openFacets", void 0);
545
+ __decorate([
546
+ property({ type: Object, attribute: false })
547
+ ], CollectionFacets.prototype, "allowedFacetCount", void 0);
548
+ CollectionFacets = __decorate([
549
+ customElement('collection-facets')
550
+ ], CollectionFacets);
551
+ export { CollectionFacets };
552
552
  //# sourceMappingURL=collection-facets.js.map