@internetarchive/collection-browser 0.2.15 → 0.2.16-alpha1

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 (250) hide show
  1. package/dist/index.d.ts +9 -0
  2. package/dist/index.js.map +1 -0
  3. package/dist/src/app-root.d.ts +33 -0
  4. package/dist/src/app-root.js +312 -0
  5. package/dist/src/app-root.js.map +1 -0
  6. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -0
  7. package/dist/src/assets/img/icons/arrow-left.js +10 -0
  8. package/dist/src/assets/img/icons/arrow-left.js.map +1 -0
  9. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
  10. package/dist/src/assets/img/icons/arrow-right.js +10 -0
  11. package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
  12. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  13. package/dist/src/assets/img/icons/chevron.js +4 -0
  14. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  15. package/dist/src/assets/img/icons/empty-query.d.ts +2 -0
  16. package/dist/src/assets/img/icons/empty-query.js +5 -0
  17. package/dist/src/assets/img/icons/empty-query.js.map +1 -0
  18. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  19. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  20. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  21. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  22. package/dist/src/assets/img/icons/eye.js +5 -0
  23. package/dist/src/assets/img/icons/eye.js.map +1 -0
  24. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -0
  25. package/dist/src/assets/img/icons/favorite-filled.js +11 -0
  26. package/dist/src/assets/img/icons/favorite-filled.js.map +1 -0
  27. package/dist/src/assets/img/icons/login-required.d.ts +1 -0
  28. package/dist/src/assets/img/icons/login-required.js +30 -0
  29. package/dist/src/assets/img/icons/login-required.js.map +1 -0
  30. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -0
  31. package/dist/src/assets/img/icons/mediatype/account.js +14 -0
  32. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -0
  33. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -0
  34. package/dist/src/assets/img/icons/mediatype/audio.js +14 -0
  35. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -0
  36. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -0
  37. package/dist/src/assets/img/icons/mediatype/collection.js +12 -0
  38. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -0
  39. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  40. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  41. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  42. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -0
  43. package/dist/src/assets/img/icons/mediatype/etree.js +14 -0
  44. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -0
  45. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -0
  46. package/dist/src/assets/img/icons/mediatype/film.js +14 -0
  47. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -0
  48. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -0
  49. package/dist/src/assets/img/icons/mediatype/images.js +13 -0
  50. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -0
  51. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  52. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  53. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  54. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -0
  55. package/dist/src/assets/img/icons/mediatype/software.js +13 -0
  56. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -0
  57. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -0
  58. package/dist/src/assets/img/icons/mediatype/texts.js +13 -0
  59. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -0
  60. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -0
  61. package/dist/src/assets/img/icons/mediatype/tv.js +14 -0
  62. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -0
  63. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -0
  64. package/dist/src/assets/img/icons/mediatype/video.js +14 -0
  65. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -0
  66. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -0
  67. package/dist/src/assets/img/icons/mediatype/web.js +13 -0
  68. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -0
  69. package/dist/src/assets/img/icons/null-result.d.ts +2 -0
  70. package/dist/src/assets/img/icons/null-result.js +5 -0
  71. package/dist/src/assets/img/icons/null-result.js.map +1 -0
  72. package/dist/src/assets/img/icons/restricted.d.ts +1 -0
  73. package/dist/src/assets/img/icons/restricted.js +29 -0
  74. package/dist/src/assets/img/icons/restricted.js.map +1 -0
  75. package/dist/src/assets/img/icons/reviews.d.ts +1 -0
  76. package/dist/src/assets/img/icons/reviews.js +11 -0
  77. package/dist/src/assets/img/icons/reviews.js.map +1 -0
  78. package/dist/src/assets/img/icons/upload.d.ts +1 -0
  79. package/dist/src/assets/img/icons/upload.js +12 -0
  80. package/dist/src/assets/img/icons/upload.js.map +1 -0
  81. package/dist/src/assets/img/icons/views.d.ts +1 -0
  82. package/dist/src/assets/img/icons/views.js +11 -0
  83. package/dist/src/assets/img/icons/views.js.map +1 -0
  84. package/dist/src/circular-activity-indicator.d.ts +5 -0
  85. package/dist/src/circular-activity-indicator.js +66 -0
  86. package/dist/src/circular-activity-indicator.js.map +1 -0
  87. package/dist/src/collection-browser.d.ts +216 -0
  88. package/dist/src/collection-browser.js +1249 -0
  89. package/dist/src/collection-browser.js.map +1 -0
  90. package/dist/src/collection-facets/more-facets-content.d.ts +56 -0
  91. package/dist/src/collection-facets/more-facets-content.js +374 -0
  92. package/dist/src/collection-facets/more-facets-content.js.map +1 -0
  93. package/dist/src/collection-facets/more-facets-pagination.d.ts +27 -0
  94. package/dist/src/collection-facets/more-facets-pagination.js +193 -0
  95. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -0
  96. package/dist/src/collection-facets.d.ts +80 -0
  97. package/dist/src/collection-facets.js +662 -0
  98. package/dist/src/collection-facets.js.map +1 -0
  99. package/dist/src/empty-placeholder.d.ts +11 -0
  100. package/dist/src/empty-placeholder.js +83 -0
  101. package/dist/src/empty-placeholder.js.map +1 -0
  102. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  103. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  104. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  105. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  106. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  107. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  108. package/dist/src/mediatype/mediatype-config.d.ts +3 -0
  109. package/dist/src/mediatype/mediatype-config.js +86 -0
  110. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  111. package/dist/src/models.d.ts +85 -0
  112. package/dist/src/models.js +62 -0
  113. package/dist/src/models.js.map +1 -0
  114. package/dist/src/restoration-state-handler.d.ts +38 -0
  115. package/dist/src/restoration-state-handler.js +204 -0
  116. package/dist/src/restoration-state-handler.js.map +1 -0
  117. package/dist/src/sort-filter-bar/alpha-bar.d.ts +9 -0
  118. package/dist/src/sort-filter-bar/alpha-bar.js +98 -0
  119. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -0
  120. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  121. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  122. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  123. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  124. package/dist/src/sort-filter-bar/img/list.js +5 -0
  125. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  126. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  127. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  128. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  129. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  130. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  131. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  132. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +107 -0
  133. package/dist/src/sort-filter-bar/sort-filter-bar.js +782 -0
  134. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -0
  135. package/dist/src/styles/item-image-styles.d.ts +8 -0
  136. package/dist/src/styles/item-image-styles.js +102 -0
  137. package/dist/src/styles/item-image-styles.js.map +1 -0
  138. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  139. package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
  140. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  141. package/dist/src/tiles/grid/account-tile.d.ts +8 -0
  142. package/dist/src/tiles/grid/account-tile.js +126 -0
  143. package/dist/src/tiles/grid/account-tile.js.map +1 -0
  144. package/dist/src/tiles/grid/collection-tile.d.ts +7 -0
  145. package/dist/src/tiles/grid/collection-tile.js +159 -0
  146. package/dist/src/tiles/grid/collection-tile.js.map +1 -0
  147. package/dist/src/tiles/grid/item-tile.d.ts +21 -0
  148. package/dist/src/tiles/grid/item-tile.js +183 -0
  149. package/dist/src/tiles/grid/item-tile.js.map +1 -0
  150. package/dist/src/tiles/grid/tile-stats.d.ts +10 -0
  151. package/dist/src/tiles/grid/tile-stats.js +134 -0
  152. package/dist/src/tiles/grid/tile-stats.js.map +1 -0
  153. package/dist/src/tiles/image-block.d.ts +17 -0
  154. package/dist/src/tiles/image-block.js +136 -0
  155. package/dist/src/tiles/image-block.js.map +1 -0
  156. package/dist/src/tiles/item-image.d.ts +31 -0
  157. package/dist/src/tiles/item-image.js +118 -0
  158. package/dist/src/tiles/item-image.js.map +1 -0
  159. package/dist/src/tiles/list/account-label.d.ts +1 -0
  160. package/dist/src/tiles/list/account-label.js +7 -0
  161. package/dist/src/tiles/list/account-label.js.map +1 -0
  162. package/dist/src/tiles/list/date-label.d.ts +1 -0
  163. package/dist/src/tiles/list/date-label.js +13 -0
  164. package/dist/src/tiles/list/date-label.js.map +1 -0
  165. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
  166. package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
  167. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  168. package/dist/src/tiles/list/tile-list-compact.d.ts +20 -0
  169. package/dist/src/tiles/list/tile-list-compact.js +180 -0
  170. package/dist/src/tiles/list/tile-list-compact.js.map +1 -0
  171. package/dist/src/tiles/list/tile-list.d.ts +48 -0
  172. package/dist/src/tiles/list/tile-list.js +455 -0
  173. package/dist/src/tiles/list/tile-list.js.map +1 -0
  174. package/dist/src/tiles/mediatype-icon.d.ts +9 -0
  175. package/dist/src/tiles/mediatype-icon.js +82 -0
  176. package/dist/src/tiles/mediatype-icon.js.map +1 -0
  177. package/dist/src/tiles/overlay/icon-overlay.d.ts +7 -0
  178. package/dist/src/tiles/overlay/icon-overlay.js +43 -0
  179. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -0
  180. package/dist/src/tiles/overlay/text-overlay.d.ts +8 -0
  181. package/dist/src/tiles/overlay/text-overlay.js +57 -0
  182. package/dist/src/tiles/overlay/text-overlay.js.map +1 -0
  183. package/dist/src/tiles/tile-dispatcher.d.ts +36 -0
  184. package/dist/src/tiles/tile-dispatcher.js +215 -0
  185. package/dist/src/tiles/tile-dispatcher.js.map +1 -0
  186. package/dist/src/utils/format-count.d.ts +7 -0
  187. package/dist/src/utils/format-count.js +76 -0
  188. package/dist/src/utils/format-count.js.map +1 -0
  189. package/dist/src/utils/format-date.d.ts +2 -0
  190. package/dist/src/utils/format-date.js +24 -0
  191. package/dist/src/utils/format-date.js.map +1 -0
  192. package/dist/test/collection-browser.test.d.ts +1 -0
  193. package/dist/test/collection-browser.test.js +82 -0
  194. package/dist/test/collection-browser.test.js.map +1 -0
  195. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -0
  196. package/dist/test/collection-facets/more-facets-content.test.js +75 -0
  197. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -0
  198. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -0
  199. package/dist/test/collection-facets/more-facets-pagination.test.js +38 -0
  200. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -0
  201. package/dist/test/empty-placeholder.test.d.ts +1 -0
  202. package/dist/test/empty-placeholder.test.js +34 -0
  203. package/dist/test/empty-placeholder.test.js.map +1 -0
  204. package/dist/test/icon-overlay.test.d.ts +1 -0
  205. package/dist/test/icon-overlay.test.js +31 -0
  206. package/dist/test/icon-overlay.test.js.map +1 -0
  207. package/dist/test/item-image.test.d.ts +1 -0
  208. package/dist/test/item-image.test.js +73 -0
  209. package/dist/test/item-image.test.js.map +1 -0
  210. package/dist/test/mediatype-config.test.d.ts +1 -0
  211. package/dist/test/mediatype-config.test.js +17 -0
  212. package/dist/test/mediatype-config.test.js.map +1 -0
  213. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -0
  214. package/dist/test/mocks/mock-collection-name-cache.js +14 -0
  215. package/dist/test/mocks/mock-collection-name-cache.js.map +1 -0
  216. package/dist/test/mocks/mock-search-responses.d.ts +3 -0
  217. package/dist/test/mocks/mock-search-responses.js +45 -0
  218. package/dist/test/mocks/mock-search-responses.js.map +1 -0
  219. package/dist/test/mocks/mock-search-service.d.ts +8 -0
  220. package/dist/test/mocks/mock-search-service.js +16 -0
  221. package/dist/test/mocks/mock-search-service.js.map +1 -0
  222. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -0
  223. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +122 -0
  224. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -0
  225. package/dist/test/text-overlay.test.d.ts +1 -0
  226. package/dist/test/text-overlay.test.js +48 -0
  227. package/dist/test/text-overlay.test.js.map +1 -0
  228. package/dist/test/tile-stats.test.d.ts +1 -0
  229. package/dist/test/tile-stats.test.js +42 -0
  230. package/dist/test/tile-stats.test.js.map +1 -0
  231. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -0
  232. package/dist/test/tiles/grid/item-tile.test.js +96 -0
  233. package/dist/test/tiles/grid/item-tile.test.js.map +1 -0
  234. package/dist/test/utils/format-count.test.d.ts +1 -0
  235. package/dist/test/utils/format-count.test.js +24 -0
  236. package/dist/test/utils/format-count.test.js.map +1 -0
  237. package/dist/test/utils/format-date.test.d.ts +1 -0
  238. package/dist/test/utils/format-date.test.js +18 -0
  239. package/dist/test/utils/format-date.test.js.map +1 -0
  240. package/package.json +3 -1
  241. package/src/app-root.ts +29 -2
  242. package/src/assets/img/icons/arrow-left.ts +10 -0
  243. package/src/assets/img/icons/arrow-right.ts +10 -0
  244. package/src/collection-browser.ts +6 -0
  245. package/src/collection-facets/more-facets-content.ts +393 -0
  246. package/src/collection-facets/more-facets-pagination.ts +201 -0
  247. package/src/collection-facets.ts +117 -1
  248. package/test/collection-facets/more-facets-content.test.ts +113 -0
  249. package/test/collection-facets/more-facets-pagination.test.ts +70 -0
  250. package/test/mocks/mock-search-responses.ts +13 -0
@@ -0,0 +1,662 @@
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 { repeat } from 'lit/directives/repeat.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 eyeIcon from './assets/img/icons/eye';
11
+ import eyeClosedIcon from './assets/img/icons/eye-closed';
12
+ import chevronIcon from './assets/img/icons/chevron';
13
+ import { defaultSelectedFacets, } from './models';
14
+ import './collection-facets/more-facets-content';
15
+ const facetDisplayOrder = [
16
+ 'mediatype',
17
+ 'year',
18
+ 'subject',
19
+ 'collection',
20
+ 'creator',
21
+ 'language',
22
+ ];
23
+ const aggregationToFacetOption = {
24
+ subjectSorter: 'subject',
25
+ mediatypeSorter: 'mediatype',
26
+ languageSorter: 'language',
27
+ creatorSorter: 'creator',
28
+ collection: 'collection',
29
+ year: 'year',
30
+ };
31
+ const facetTitles = {
32
+ subject: 'Subject',
33
+ mediatype: 'Media Type',
34
+ language: 'Language',
35
+ creator: 'Creator',
36
+ collection: 'Collection',
37
+ year: 'Year',
38
+ };
39
+ let CollectionFacets = class CollectionFacets extends LitElement {
40
+ constructor() {
41
+ super(...arguments);
42
+ this.facetsLoading = false;
43
+ this.fullYearAggregationLoading = false;
44
+ this.collapsableFacets = false;
45
+ this.showHistogramDatePicker = false;
46
+ this.openFacets = {
47
+ subject: false,
48
+ mediatype: false,
49
+ language: false,
50
+ creator: false,
51
+ collection: false,
52
+ year: false,
53
+ };
54
+ /**
55
+ * If listed facets on page more then this number,
56
+ * - show the more link button just below the facets group
57
+ */
58
+ this.moreLinkEligibilityCount = 5;
59
+ }
60
+ render() {
61
+ return html `
62
+ <div id="container" class="${this.facetsLoading ? 'loading' : ''}">
63
+ ${this.showHistogramDatePicker && this.fullYearsHistogramAggregation
64
+ ? html `
65
+ <div class="facet-group">
66
+ <h1>Year Published <feature-feedback></feature-feedback></h1>
67
+ ${this.histogramTemplate}
68
+ </div>
69
+ `
70
+ : nothing}
71
+ ${this.mergedFacets.map(facetGroup => this.getFacetGroupTemplate(facetGroup))}
72
+ </div>
73
+ `;
74
+ }
75
+ updated(changed) {
76
+ if (changed.has('selectedFacets')) {
77
+ this.dispatchFacetsChangedEvent();
78
+ }
79
+ }
80
+ // TODO: want to fire analytics?
81
+ dispatchFacetsChangedEvent() {
82
+ const event = new CustomEvent('facetsChanged', {
83
+ detail: this.selectedFacets,
84
+ });
85
+ this.dispatchEvent(event);
86
+ }
87
+ get currentYearsHistogramAggregation() {
88
+ var _a;
89
+ return (_a = this.aggregations) === null || _a === void 0 ? void 0 : _a.year_histogram;
90
+ }
91
+ get histogramTemplate() {
92
+ const { fullYearsHistogramAggregation } = this;
93
+ return html `
94
+ <histogram-date-range
95
+ .minDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key}
96
+ .maxDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key}
97
+ .minSelectedDate=${this.minSelectedDate}
98
+ .maxSelectedDate=${this.maxSelectedDate}
99
+ .updateDelay=${100}
100
+ missingDataMessage="..."
101
+ .width=${180}
102
+ .bins=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.buckets}
103
+ @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
104
+ ></histogram-date-range>
105
+ `;
106
+ }
107
+ histogramDateRangeUpdated(e) {
108
+ const { minDate, maxDate } = e.detail;
109
+ const event = new CustomEvent('histogramDateRangeUpdated', {
110
+ detail: { minDate, maxDate },
111
+ });
112
+ this.dispatchEvent(event);
113
+ }
114
+ /**
115
+ * Combines the selected facets with the aggregations to create a single list of facets
116
+ */
117
+ get mergedFacets() {
118
+ const facetGroups = [];
119
+ facetDisplayOrder.forEach(facetKey => {
120
+ var _a;
121
+ const selectedFacetGroup = this.selectedFacetGroups.find(group => group.key === facetKey);
122
+ const aggregateFacetGroup = this.aggregationFacetGroups.find(group => group.key === facetKey);
123
+ // if the user selected a facet, but it's not in the aggregation, we add it as-is
124
+ if (selectedFacetGroup && !aggregateFacetGroup) {
125
+ facetGroups.push(selectedFacetGroup);
126
+ return;
127
+ }
128
+ // if we don't have an aggregate facet group, don't add this to the list
129
+ if (!aggregateFacetGroup)
130
+ return;
131
+ // start with either the selected group if we have one, or the aggregate group
132
+ const facetGroup = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : aggregateFacetGroup;
133
+ // attach the counts to the selected buckets
134
+ const bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
135
+ const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
136
+ return selectedBucket
137
+ ? {
138
+ ...bucket,
139
+ count: selectedBucket.count,
140
+ }
141
+ : bucket;
142
+ })) !== null && _a !== void 0 ? _a : [];
143
+ // append any additional buckets that were not selected
144
+ aggregateFacetGroup.buckets.forEach(bucket => {
145
+ const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);
146
+ if (existingBucket)
147
+ return;
148
+ bucketsWithCount.push(bucket);
149
+ });
150
+ facetGroup.buckets = bucketsWithCount.splice(0, 5);
151
+ facetGroups.push(facetGroup);
152
+ });
153
+ return facetGroups;
154
+ }
155
+ /**
156
+ * Converts the selected facets to a `FacetGroup` array,
157
+ * which is easier to work with
158
+ */
159
+ get selectedFacetGroups() {
160
+ if (!this.selectedFacets)
161
+ return [];
162
+ const facetGroups = Object.entries(this.selectedFacets).map(([key, selectedFacets]) => {
163
+ const option = key;
164
+ const title = facetTitles[option];
165
+ const buckets = Object.entries(selectedFacets).map(([value, facetState]) => {
166
+ var _a, _b;
167
+ let displayText = value;
168
+ // for selected languages, we store the language code instead of the
169
+ // display name, so look up the name from the mapping
170
+ if (option === 'language') {
171
+ displayText =
172
+ (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getLanguageNameFromCodeString(value)) !== null && _b !== void 0 ? _b : value;
173
+ }
174
+ return {
175
+ displayText,
176
+ key: value,
177
+ count: 0,
178
+ state: facetState,
179
+ };
180
+ });
181
+ return {
182
+ title,
183
+ key: option,
184
+ buckets,
185
+ };
186
+ });
187
+ return facetGroups;
188
+ }
189
+ /**
190
+ * Converts the raw `aggregations` to `FacetGroups`, which are easier to use
191
+ */
192
+ get aggregationFacetGroups() {
193
+ var _a;
194
+ const facetGroups = [];
195
+ Object.entries((_a = this.aggregations) !== null && _a !== void 0 ? _a : []).forEach(([key, buckets]) => {
196
+ // the year_histogram data is in a different format so can't be handled here
197
+ if (key === 'year_histogram')
198
+ return;
199
+ const option = this.getFacetOptionFromKey(key);
200
+ const title = facetTitles[option];
201
+ const castedBuckets = buckets.buckets;
202
+ const facetBuckets = castedBuckets.map(bucket => {
203
+ var _a, _b;
204
+ let bucketKey = bucket.key;
205
+ // for languages, we need to search by language code instead of the
206
+ // display name, which is what we get from the search engine result
207
+ if (option === 'language') {
208
+ // const languageCodeKey = languageToCodeMap[bucket.key];
209
+ bucketKey =
210
+ (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getCodeStringFromLanguageName(`${bucket.key}`)) !== null && _b !== void 0 ? _b : bucket.key;
211
+ // bucketKey = languageCodeKey ?? bucket.key;
212
+ }
213
+ return {
214
+ displayText: `${bucket.key}`,
215
+ key: `${bucketKey}`,
216
+ count: bucket.doc_count,
217
+ state: 'none',
218
+ };
219
+ });
220
+ const group = {
221
+ title,
222
+ key: option,
223
+ buckets: facetBuckets,
224
+ };
225
+ facetGroups.push(group);
226
+ });
227
+ return facetGroups;
228
+ }
229
+ /**
230
+ * Generate the template for a facet group with a header and the collapsible
231
+ * chevron for the mobile view
232
+ */
233
+ getFacetGroupTemplate(facetGroup) {
234
+ if (facetGroup.buckets.length === 0)
235
+ return nothing;
236
+ const { key } = facetGroup;
237
+ const isOpen = this.openFacets[key];
238
+ const collapser = html `
239
+ <span class="collapser ${isOpen ? 'open' : ''}"> ${chevronIcon} </span>
240
+ `;
241
+ return html `
242
+ <div class="facet-group ${this.collapsableFacets ? 'mobile' : ''}">
243
+ <h1
244
+ @click=${() => {
245
+ const newOpenFacets = { ...this.openFacets };
246
+ newOpenFacets[key] = !isOpen;
247
+ this.openFacets = newOpenFacets;
248
+ }}
249
+ @keyup=${() => {
250
+ const newOpenFacets = { ...this.openFacets };
251
+ newOpenFacets[key] = !isOpen;
252
+ this.openFacets = newOpenFacets;
253
+ }}
254
+ >
255
+ ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}
256
+ </h1>
257
+ <div class="facet-group-content ${isOpen ? 'open' : ''}">
258
+ ${this.getFacetTemplate(facetGroup)}
259
+ ${this.searchMoreFacetsLink(facetGroup)}
260
+ </div>
261
+ </div>
262
+ `;
263
+ }
264
+ /**
265
+ * Generate the More... link button just below the facets group
266
+ *
267
+ * TODO: want to fire analytics?
268
+ */
269
+ searchMoreFacetsLink(facetGroup) {
270
+ // don't render More... link if the number of facets is < this.moreLinkEligibilityCount
271
+ if (Object.keys(facetGroup.buckets).length < this.moreLinkEligibilityCount)
272
+ return nothing;
273
+ return html `<button
274
+ class="more-link"
275
+ @click=${() => {
276
+ this.showMoreFacetsModal(facetGroup);
277
+ }}
278
+ >
279
+ More...
280
+ </button>`;
281
+ }
282
+ async showMoreFacetsModal(facetGroup) {
283
+ var _a, _b;
284
+ const facetAggrKey = Object.keys(aggregationToFacetOption).find(value => aggregationToFacetOption[value] === facetGroup.key);
285
+ // TODO - lets move sr-only style into modal-manager component as well
286
+ const headline = html `
287
+ <span
288
+ style="display:block;text-align:left;font-size:1.8rem;padding:0 10px;"
289
+ >
290
+ <span
291
+ style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip: rect(0,0,0,0);border:0;"
292
+ >More facets for:
293
+ </span>
294
+ ${facetTitles[facetGroup.key]}
295
+ <img
296
+ src="https://archive.org/images/filter-count.png"
297
+ style="height: 1.5rem;vertical-align: baseline;"
298
+ alt=""
299
+ />
300
+ </span>
301
+ `;
302
+ const message = html `
303
+ <more-facets-content
304
+ @facetsChanged=${(e) => {
305
+ const event = new CustomEvent('facetsChanged', {
306
+ detail: e.detail,
307
+ bubbles: true,
308
+ composed: true,
309
+ });
310
+ this.dispatchEvent(event);
311
+ }}
312
+ .facetKey=${facetGroup.key}
313
+ .facetAggregationKey=${facetAggrKey}
314
+ .fullQuery=${this.fullQuery}
315
+ .modalManager=${this.modalManager}
316
+ .searchService=${this.searchService}
317
+ .collectionNameCache=${this.collectionNameCache}
318
+ .languageCodeHandler=${this.languageCodeHandler}
319
+ .selectedFacets=${this.selectedFacets}
320
+ >
321
+ </more-facets-content>
322
+ `;
323
+ const config = new ModalConfig({
324
+ bodyColor: '#fff',
325
+ headerColor: '#194880',
326
+ showHeaderLogo: false,
327
+ closeOnBackdropClick: true,
328
+ title: html `Select filters`,
329
+ headline,
330
+ message,
331
+ });
332
+ (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.add('more-search-facets');
333
+ (_b = this.modalManager) === null || _b === void 0 ? void 0 : _b.showModal({ config });
334
+ }
335
+ /**
336
+ * Generate the list template for each bucket in a facet group
337
+ */
338
+ getFacetTemplate(facetGroup) {
339
+ const bucketsNoFavorites = facetGroup.buckets.filter(bucket => bucket.key.startsWith('fav-') === false);
340
+ const bucketsMaxSix = bucketsNoFavorites.slice(0, 6);
341
+ return html `
342
+ <ul class="facet-list">
343
+ ${repeat(bucketsMaxSix, bucket => `${facetGroup.key}:${bucket.key}`, bucket => {
344
+ var _a, _b;
345
+ const showOnlyCheckboxId = `${facetGroup.key}:${bucket.key}-show-only`;
346
+ const negativeCheckboxId = `${facetGroup.key}:${bucket.key}-negative`;
347
+ // for collections, we need to asynchronously load the collection name
348
+ // so we use the `async-collection-name` widget and for the rest, we have
349
+ // a static value to use
350
+ const bucketTextDisplay = facetGroup.key !== 'collection'
351
+ ? html `${(_a = bucket.displayText) !== null && _a !== void 0 ? _a : bucket.key}`
352
+ : html `
353
+ <async-collection-name
354
+ .collectionNameCache=${this.collectionNameCache}
355
+ .identifier=${bucket.key}
356
+ placeholder="-"
357
+ ></async-collection-name>
358
+ `;
359
+ const facetHidden = bucket.state === 'hidden';
360
+ const facetSelected = bucket.state === 'selected';
361
+ const titleText = `${facetGroup.key}: ${(_b = bucket.displayText) !== null && _b !== void 0 ? _b : bucket.key}`;
362
+ const onlyShowText = facetSelected
363
+ ? `Show all ${facetGroup.key}s`
364
+ : `Only show ${titleText}`;
365
+ const hideText = `Hide ${titleText}`;
366
+ const unhideText = `Unhide ${titleText}`;
367
+ const showHideText = facetHidden ? unhideText : hideText;
368
+ return html `
369
+ <li>
370
+ <div class="facet-row">
371
+ <div class="facet-checkbox">
372
+ <input
373
+ type="checkbox"
374
+ .name=${facetGroup.key}
375
+ .value=${bucket.key}
376
+ @click=${(e) => {
377
+ this.facetClicked(e, bucket, false);
378
+ }}
379
+ .checked=${facetSelected}
380
+ class="select-facet-checkbox"
381
+ title=${onlyShowText}
382
+ id=${showOnlyCheckboxId}
383
+ />
384
+ <input
385
+ type="checkbox"
386
+ id=${negativeCheckboxId}
387
+ .name=${facetGroup.key}
388
+ .value=${bucket.key}
389
+ @click=${(e) => {
390
+ this.facetClicked(e, bucket, true);
391
+ }}
392
+ .checked=${facetHidden}
393
+ class="hide-facet-checkbox"
394
+ />
395
+ <label
396
+ for=${negativeCheckboxId}
397
+ class="hide-facet-icon${facetHidden ? ' active' : ''}"
398
+ title=${showHideText}
399
+ >
400
+ <span class="eye">${eyeIcon}</span>
401
+ <span class="eye-closed">${eyeClosedIcon}</span>
402
+ </label>
403
+ </div>
404
+
405
+ <label
406
+ for=${showOnlyCheckboxId}
407
+ class="facet-info-display"
408
+ title=${onlyShowText}
409
+ >
410
+ <div class="facet-title">${bucketTextDisplay}</div>
411
+ <div class="facet-count">${bucket.count}</div>
412
+ </label>
413
+ </div>
414
+ </li>
415
+ `;
416
+ })}
417
+ </ul>
418
+ `;
419
+ }
420
+ facetClicked(e, bucket, negative) {
421
+ const target = e.target;
422
+ const { checked, name, value } = target;
423
+ if (checked) {
424
+ this.facetChecked(name, value, negative);
425
+ }
426
+ else {
427
+ this.facetUnchecked(name, value);
428
+ }
429
+ }
430
+ facetChecked(key, value, negative) {
431
+ const { selectedFacets } = this;
432
+ let newFacets;
433
+ if (selectedFacets) {
434
+ newFacets = {
435
+ ...selectedFacets,
436
+ };
437
+ }
438
+ else {
439
+ newFacets = defaultSelectedFacets;
440
+ }
441
+ newFacets[key][value] = negative ? 'hidden' : 'selected';
442
+ this.selectedFacets = newFacets;
443
+ }
444
+ facetUnchecked(key, value) {
445
+ const { selectedFacets } = this;
446
+ let newFacets;
447
+ if (selectedFacets) {
448
+ newFacets = {
449
+ ...selectedFacets,
450
+ };
451
+ }
452
+ else {
453
+ newFacets = defaultSelectedFacets;
454
+ }
455
+ delete newFacets[key][value];
456
+ this.selectedFacets = newFacets;
457
+ }
458
+ /**
459
+ * Parse the aggregate key title into the human readable title
460
+ *
461
+ * Example: user_aggs__terms__field:mediatypeSorter__size:6 => Media Type
462
+ *
463
+ * @param key
464
+ * @returns
465
+ */
466
+ getFacetOptionFromKey(key) {
467
+ const parts = key.split('__');
468
+ const fieldNamePart = parts[2];
469
+ const fieldName = fieldNamePart.split(':')[1];
470
+ const facetMatch = Object.entries(aggregationToFacetOption).find(([key2]) => fieldName.includes(key2));
471
+ const option = facetMatch === null || facetMatch === void 0 ? void 0 : facetMatch[1];
472
+ if (!option)
473
+ throw new Error(`Could not find facet option for key: ${key}`);
474
+ return option;
475
+ }
476
+ static get styles() {
477
+ return css `
478
+ #container.loading {
479
+ opacity: 0.5;
480
+ }
481
+
482
+ .collapser {
483
+ display: inline-block;
484
+ cursor: pointer;
485
+ width: 10px;
486
+ height: 10px;
487
+ }
488
+
489
+ .collapser svg {
490
+ transition: transform 0.2s ease-in-out;
491
+ }
492
+
493
+ .collapser.open svg {
494
+ transform: rotate(90deg);
495
+ }
496
+
497
+ .facet-group {
498
+ margin-bottom: 2rem;
499
+ }
500
+
501
+ .facet-group h1 {
502
+ margin-bottom: 0.7rem;
503
+ }
504
+
505
+ .facet-group.mobile h1 {
506
+ cursor: pointer;
507
+ }
508
+
509
+ .facet-group-content {
510
+ transition: max-height 0.2s ease-in-out;
511
+ }
512
+
513
+ .facet-group.mobile .facet-group-content {
514
+ max-height: 0;
515
+ overflow: hidden;
516
+ }
517
+
518
+ .facet-group.mobile .facet-group-content.open {
519
+ max-height: 2000px;
520
+ }
521
+
522
+ h1 {
523
+ font-size: 1.4rem;
524
+ font-weight: 200;
525
+ border-bottom: 1px solid rgb(232, 232, 232);
526
+ padding-bottom: 3px;
527
+ margin: 0;
528
+ }
529
+
530
+ ul.facet-list {
531
+ list-style: none;
532
+ margin: 0;
533
+ padding: 0;
534
+ }
535
+
536
+ ul.facet-list li {
537
+ margin-bottom: 0.2rem;
538
+ }
539
+
540
+ .facet-checkbox {
541
+ margin-right: 0.5rem;
542
+ display: flex;
543
+ align-items: center;
544
+ }
545
+
546
+ .facet-row {
547
+ display: flex;
548
+ align-items: start;
549
+ font-weight: 500;
550
+ font-size: 1.2rem;
551
+ }
552
+
553
+ .facet-info-display {
554
+ display: flex;
555
+ flex: 1;
556
+ cursor: pointer;
557
+ }
558
+
559
+ .facet-title {
560
+ flex: 1;
561
+ }
562
+
563
+ .facet-count {
564
+ margin-left: 0.5rem;
565
+ }
566
+
567
+ .select-facet-checkbox {
568
+ cursor: pointer;
569
+ margin-right: 5px;
570
+ }
571
+
572
+ .hide-facet-checkbox {
573
+ display: none;
574
+ }
575
+
576
+ .hide-facet-icon {
577
+ width: 15px;
578
+ height: 15px;
579
+ cursor: pointer;
580
+ opacity: 0.3;
581
+ }
582
+ .hide-facet-icon:hover,
583
+ .active {
584
+ opacity: 1;
585
+ }
586
+ .hide-facet-icon:hover .eye,
587
+ .hide-facet-icon .eye-closed {
588
+ display: none;
589
+ }
590
+ .hide-facet-icon:hover .eye-closed,
591
+ .hide-facet-icon.active .eye-closed {
592
+ display: inline;
593
+ }
594
+ .hide-facet-icon.active .eye {
595
+ display: none;
596
+ }
597
+
598
+ .more-link {
599
+ font-size: 1.2rem;
600
+ text-decoration: none;
601
+ padding: 0px 4px;
602
+ background: inherit;
603
+ border: 0;
604
+ color: blue;
605
+ cursor: pointer;
606
+ }
607
+ .sorting-icon {
608
+ cursor: pointer;
609
+ }
610
+ `;
611
+ }
612
+ };
613
+ __decorate([
614
+ property({ type: Object })
615
+ ], CollectionFacets.prototype, "searchService", void 0);
616
+ __decorate([
617
+ property({ type: Object })
618
+ ], CollectionFacets.prototype, "aggregations", void 0);
619
+ __decorate([
620
+ property({ type: Object })
621
+ ], CollectionFacets.prototype, "fullYearsHistogramAggregation", void 0);
622
+ __decorate([
623
+ property({ type: String })
624
+ ], CollectionFacets.prototype, "minSelectedDate", void 0);
625
+ __decorate([
626
+ property({ type: String })
627
+ ], CollectionFacets.prototype, "maxSelectedDate", void 0);
628
+ __decorate([
629
+ property({ type: Boolean })
630
+ ], CollectionFacets.prototype, "facetsLoading", void 0);
631
+ __decorate([
632
+ property({ type: Boolean })
633
+ ], CollectionFacets.prototype, "fullYearAggregationLoading", void 0);
634
+ __decorate([
635
+ property({ type: Object })
636
+ ], CollectionFacets.prototype, "selectedFacets", void 0);
637
+ __decorate([
638
+ property({ type: Boolean })
639
+ ], CollectionFacets.prototype, "collapsableFacets", void 0);
640
+ __decorate([
641
+ property({ type: Boolean })
642
+ ], CollectionFacets.prototype, "showHistogramDatePicker", void 0);
643
+ __decorate([
644
+ property({ type: String })
645
+ ], CollectionFacets.prototype, "fullQuery", void 0);
646
+ __decorate([
647
+ property({ type: Object })
648
+ ], CollectionFacets.prototype, "modalManager", void 0);
649
+ __decorate([
650
+ property({ type: Object })
651
+ ], CollectionFacets.prototype, "languageCodeHandler", void 0);
652
+ __decorate([
653
+ property({ type: Object })
654
+ ], CollectionFacets.prototype, "collectionNameCache", void 0);
655
+ __decorate([
656
+ state()
657
+ ], CollectionFacets.prototype, "openFacets", void 0);
658
+ CollectionFacets = __decorate([
659
+ customElement('collection-facets')
660
+ ], CollectionFacets);
661
+ export { CollectionFacets };
662
+ //# sourceMappingURL=collection-facets.js.map