@internetarchive/collection-browser 0.0.1-alpha.8 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +8 -11
  2. package/demo/app-root.ts +16 -92
  3. package/dist/demo/app-root.d.ts +3 -5
  4. package/dist/demo/app-root.js +13 -83
  5. package/dist/demo/app-root.js.map +1 -1
  6. package/dist/index.d.ts +6 -0
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  10. package/dist/src/assets/img/icons/chevron.js +4 -0
  11. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  12. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
  13. package/dist/src/assets/img/icons/mediatype/account.js +6 -4
  14. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
  15. package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
  16. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
  17. package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
  18. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
  19. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  20. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  21. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  22. package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
  23. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
  24. package/dist/src/assets/img/icons/mediatype/film.js +2 -1
  25. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
  26. package/dist/src/assets/img/icons/mediatype/images.js +9 -6
  27. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
  28. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  29. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  30. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  31. package/dist/src/assets/img/icons/mediatype/software.js +9 -6
  32. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
  33. package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
  34. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
  35. package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
  36. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
  37. package/dist/src/assets/img/icons/mediatype/video.js +10 -6
  38. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
  39. package/dist/src/assets/img/icons/mediatype/web.js +9 -6
  40. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
  41. package/dist/src/collection-browser.d.ts +53 -31
  42. package/dist/src/collection-browser.js +504 -166
  43. package/dist/src/collection-browser.js.map +1 -1
  44. package/dist/src/collection-facets.d.ts +28 -13
  45. package/dist/src/collection-facets.js +276 -160
  46. package/dist/src/collection-facets.js.map +1 -1
  47. package/dist/src/helpers.d.ts +1 -0
  48. package/dist/src/helpers.js +20 -0
  49. package/dist/src/helpers.js.map +1 -0
  50. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  51. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  52. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  53. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  54. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  55. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  56. package/dist/src/mediatype/mediatype-color.d.ts +3 -0
  57. package/dist/src/mediatype/mediatype-color.js +15 -0
  58. package/dist/src/mediatype/mediatype-color.js.map +1 -0
  59. package/dist/src/mediatype/mediatype-config.d.ts +3 -0
  60. package/dist/src/mediatype/mediatype-config.js +86 -0
  61. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  62. package/dist/src/mediatype/mediatype-display.d.ts +3 -0
  63. package/dist/src/mediatype/mediatype-display.js +86 -0
  64. package/dist/src/mediatype/mediatype-display.js.map +1 -0
  65. package/dist/src/mediatype/mediatype-icon.d.ts +10 -0
  66. package/dist/src/mediatype/mediatype-icon.js +105 -0
  67. package/dist/src/mediatype/mediatype-icon.js.map +1 -0
  68. package/dist/src/mediatype/mediatype-text.d.ts +3 -0
  69. package/dist/src/mediatype/mediatype-text.js +17 -0
  70. package/dist/src/mediatype/mediatype-text.js.map +1 -0
  71. package/dist/src/mediatype/mediatypeConfig.d.ts +3 -0
  72. package/dist/src/mediatype/mediatypeConfig.js +86 -0
  73. package/dist/src/mediatype/mediatypeConfig.js.map +1 -0
  74. package/dist/src/mediatype-icon.d.ts +2 -2
  75. package/dist/src/mediatype-icon.js +35 -46
  76. package/dist/src/mediatype-icon.js.map +1 -1
  77. package/dist/src/models.d.ts +72 -13
  78. package/dist/src/models.js +57 -1
  79. package/dist/src/models.js.map +1 -1
  80. package/dist/src/restoration-state-handler.d.ts +38 -0
  81. package/dist/src/restoration-state-handler.js +204 -0
  82. package/dist/src/restoration-state-handler.js.map +1 -0
  83. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -1
  84. package/dist/src/sort-filter-bar/alpha-bar.js +9 -2
  85. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  86. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  87. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  88. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  89. package/dist/src/sort-filter-bar/img/list.js +1 -1
  90. package/dist/src/sort-filter-bar/img/list.js.map +1 -1
  91. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  92. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  93. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  94. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +71 -14
  95. package/dist/src/sort-filter-bar/sort-filter-bar.js +499 -216
  96. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  97. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  98. package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
  99. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  100. package/dist/src/tiles/grid/account-tile.d.ts +1 -1
  101. package/dist/src/tiles/grid/account-tile.js +5 -5
  102. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  103. package/dist/src/tiles/grid/collection-tile.js +1 -2
  104. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  105. package/dist/src/tiles/grid/icons/views.d.ts +1 -1
  106. package/dist/src/tiles/grid/icons/views.js +2 -2
  107. package/dist/src/tiles/grid/icons/views.js.map +1 -1
  108. package/dist/src/tiles/grid/item-tile.d.ts +2 -2
  109. package/dist/src/tiles/grid/item-tile.js +58 -150
  110. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  111. package/dist/src/tiles/item-image.d.ts +21 -0
  112. package/dist/src/tiles/item-image.js +215 -0
  113. package/dist/src/tiles/item-image.js.map +1 -0
  114. package/dist/src/tiles/list/account-label.d.ts +1 -0
  115. package/dist/src/tiles/list/account-label.js +7 -0
  116. package/dist/src/tiles/list/account-label.js.map +1 -0
  117. package/dist/src/tiles/list/date-label.d.ts +1 -0
  118. package/dist/src/tiles/list/date-label.js +13 -0
  119. package/dist/src/tiles/list/date-label.js.map +1 -0
  120. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
  121. package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
  122. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  123. package/dist/src/tiles/list/tile-list-compact.d.ts +12 -0
  124. package/dist/src/tiles/list/tile-list-compact.js +203 -6
  125. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  126. package/dist/src/tiles/list/tile-list.d.ts +35 -10
  127. package/dist/src/tiles/list/tile-list.js +368 -104
  128. package/dist/src/tiles/list/tile-list.js.map +1 -1
  129. package/dist/src/tiles/loading-tile.js +1 -42
  130. package/dist/src/tiles/loading-tile.js.map +1 -1
  131. package/dist/src/tiles/mediatype-icon.d.ts +9 -0
  132. package/dist/src/tiles/mediatype-icon.js +78 -0
  133. package/dist/src/tiles/mediatype-icon.js.map +1 -0
  134. package/dist/src/tiles/tile-dispatcher.d.ts +11 -4
  135. package/dist/src/tiles/tile-dispatcher.js +56 -19
  136. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  137. package/dist/src/utils/format-date.js +2 -2
  138. package/dist/src/utils/format-date.js.map +1 -1
  139. package/dist/src/waveform-thumbnail.d.ts +7 -0
  140. package/dist/src/waveform-thumbnail.js +106 -0
  141. package/dist/src/waveform-thumbnail.js.map +1 -0
  142. package/dist/{demo/icon-provider-icon.d.ts → src/waveform-view.d.ts} +0 -0
  143. package/dist/src/waveform-view.js +2 -0
  144. package/dist/src/waveform-view.js.map +1 -0
  145. package/dist/src/your-webcomponent.d.ts +8 -0
  146. package/dist/src/your-webcomponent.js +38 -0
  147. package/dist/src/your-webcomponent.js.map +1 -0
  148. package/dist/test/collection-browser.test.d.ts +1 -0
  149. package/dist/test/collection-browser.test.js +16 -2
  150. package/dist/test/collection-browser.test.js.map +1 -1
  151. package/dist/test/mediatype-config.test.d.ts +1 -0
  152. package/dist/test/mediatype-config.test.js +17 -0
  153. package/dist/test/mediatype-config.test.js.map +1 -0
  154. package/dist/{src/assets/img/icons/eye-hidden.d.ts → test/mediatype-icon.test.d.ts} +0 -0
  155. package/dist/test/mediatype-icon.test.js +3 -0
  156. package/dist/test/mediatype-icon.test.js.map +1 -0
  157. package/dist/test/mediatypeConfig.test.d.ts +1 -0
  158. package/dist/test/mediatypeConfig.test.js +17 -0
  159. package/dist/test/mediatypeConfig.test.js.map +1 -0
  160. package/dist/test/utils/format-date.test.js +1 -1
  161. package/dist/test/utils/format-date.test.js.map +1 -1
  162. package/dist/test/your-webcomponent.test.d.ts +1 -0
  163. package/dist/test/your-webcomponent.test.js +23 -0
  164. package/dist/test/your-webcomponent.test.js.map +1 -0
  165. package/index.ts +6 -0
  166. package/local.archive.org.cert +86 -0
  167. package/local.archive.org.key +27 -0
  168. package/package.json +9 -5
  169. package/src/assets/img/icons/chevron.ts +4 -0
  170. package/src/assets/img/icons/mediatype/account.ts +6 -4
  171. package/src/assets/img/icons/mediatype/audio.ts +7 -4
  172. package/src/assets/img/icons/mediatype/collection.ts +7 -4
  173. package/src/assets/img/icons/mediatype/data.ts +15 -0
  174. package/src/assets/img/icons/mediatype/etree.ts +10 -5
  175. package/src/assets/img/icons/mediatype/film.ts +2 -1
  176. package/src/assets/img/icons/mediatype/images.ts +9 -6
  177. package/src/assets/img/icons/mediatype/radio.ts +15 -0
  178. package/src/assets/img/icons/mediatype/software.ts +9 -6
  179. package/src/assets/img/icons/mediatype/texts.ts +9 -6
  180. package/src/assets/img/icons/mediatype/tv.ts +10 -5
  181. package/src/assets/img/icons/mediatype/video.ts +10 -6
  182. package/src/assets/img/icons/mediatype/web.ts +9 -6
  183. package/src/collection-browser.ts +529 -163
  184. package/src/collection-facets.ts +307 -205
  185. package/src/language-code-handler/language-code-handler.ts +64 -0
  186. package/src/language-code-handler/language-code-mapping.ts +564 -0
  187. package/src/mediatype/mediatype-config.ts +86 -0
  188. package/src/models.ts +141 -13
  189. package/src/restoration-state-handler.ts +266 -0
  190. package/src/sort-filter-bar/alpha-bar.ts +9 -3
  191. package/src/sort-filter-bar/img/compact.ts +5 -0
  192. package/src/sort-filter-bar/img/list.ts +1 -1
  193. package/src/sort-filter-bar/img/tile.ts +5 -0
  194. package/src/sort-filter-bar/sort-filter-bar.ts +557 -225
  195. package/src/tiles/collection-browser-loading-tile.ts +29 -0
  196. package/src/tiles/grid/account-tile.ts +1 -1
  197. package/src/tiles/grid/collection-tile.ts +1 -2
  198. package/src/tiles/grid/icons/views.ts +2 -2
  199. package/src/tiles/grid/item-tile.ts +57 -162
  200. package/src/tiles/item-image.ts +218 -0
  201. package/src/tiles/list/account-label.ts +6 -0
  202. package/src/tiles/list/date-label.ts +12 -0
  203. package/src/tiles/list/tile-list-compact-header.ts +77 -0
  204. package/src/tiles/list/tile-list-compact.ts +218 -0
  205. package/src/tiles/list/tile-list.ts +412 -107
  206. package/src/tiles/mediatype-icon.ts +75 -0
  207. package/src/tiles/tile-dispatcher.ts +66 -18
  208. package/src/utils/format-date.ts +2 -2
  209. package/test/collection-browser.test.ts +20 -1
  210. package/test/mediatype-config.test.ts +18 -0
  211. package/test/utils/format-date.test.ts +1 -1
  212. package/web-dev-server.config.mjs +3 -1
  213. package/dist/demo/icon-provider/icon-provider-icon.d.ts +0 -10
  214. package/dist/demo/icon-provider/icon-provider-icon.js +0 -32
  215. package/dist/demo/icon-provider/icon-provider-icon.js.map +0 -1
  216. package/dist/demo/icon-provider/icon-provider.d.ts +0 -10
  217. package/dist/demo/icon-provider/icon-provider.js +0 -9
  218. package/dist/demo/icon-provider/icon-provider.js.map +0 -1
  219. package/dist/demo/icon-provider-icon.js +0 -2
  220. package/dist/demo/icon-provider-icon.js.map +0 -1
  221. package/dist/demo/icon-provider.d.ts +0 -10
  222. package/dist/demo/icon-provider.js +0 -12
  223. package/dist/demo/icon-provider.js.map +0 -1
  224. package/dist/src/assets/img/icons/audio.d.ts +0 -1
  225. package/dist/src/assets/img/icons/audio.js +0 -9
  226. package/dist/src/assets/img/icons/audio.js.map +0 -1
  227. package/dist/src/assets/img/icons/collection.d.ts +0 -1
  228. package/dist/src/assets/img/icons/collection.js +0 -9
  229. package/dist/src/assets/img/icons/collection.js.map +0 -1
  230. package/dist/src/assets/img/icons/etree.d.ts +0 -1
  231. package/dist/src/assets/img/icons/etree.js +0 -9
  232. package/dist/src/assets/img/icons/etree.js.map +0 -1
  233. package/dist/src/assets/img/icons/eye-hidden.js +0 -2
  234. package/dist/src/assets/img/icons/eye-hidden.js.map +0 -1
  235. package/dist/src/assets/img/icons/images.d.ts +0 -1
  236. package/dist/src/assets/img/icons/images.js +0 -10
  237. package/dist/src/assets/img/icons/images.js.map +0 -1
  238. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
  239. package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
  240. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
  241. package/dist/src/assets/img/icons/software.d.ts +0 -1
  242. package/dist/src/assets/img/icons/software.js +0 -10
  243. package/dist/src/assets/img/icons/software.js.map +0 -1
  244. package/dist/src/assets/img/icons/texts.d.ts +0 -1
  245. package/dist/src/assets/img/icons/texts.js +0 -10
  246. package/dist/src/assets/img/icons/texts.js.map +0 -1
  247. package/dist/src/assets/img/icons/tv.d.ts +0 -1
  248. package/dist/src/assets/img/icons/tv.js +0 -9
  249. package/dist/src/assets/img/icons/tv.js.map +0 -1
  250. package/dist/src/assets/img/icons/video.d.ts +0 -1
  251. package/dist/src/assets/img/icons/video.js +0 -10
  252. package/dist/src/assets/img/icons/video.js.map +0 -1
  253. package/dist/src/assets/img/icons/web.d.ts +0 -1
  254. package/dist/src/assets/img/icons/web.js +0 -10
  255. package/dist/src/assets/img/icons/web.js.map +0 -1
  256. package/dist/src/search-handler.d.ts +0 -11
  257. package/dist/src/search-handler.js +0 -34
  258. package/dist/src/search-handler.js.map +0 -1
  259. package/src/mediatype-icon.ts +0 -83
  260. package/src/sort-filter-bar/img/grid.ts +0 -5
  261. package/src/tiles/loading-tile.ts +0 -70
@@ -1,11 +1,15 @@
1
1
  import { __decorate } from "tslib";
2
- import { css, html, LitElement } from 'lit';
3
- import { customElement, property } from 'lit/decorators.js';
2
+ /* eslint-disable import/no-duplicates */
3
+ import { css, html, LitElement, nothing, } from 'lit';
4
+ import { customElement, property, state } from 'lit/decorators.js';
4
5
  import { repeat } from 'lit/directives/repeat.js';
5
6
  import '@internetarchive/histogram-date-range';
6
7
  import '@internetarchive/feature-feedback';
8
+ import '@internetarchive/collection-name-cache';
7
9
  import eyeIcon from './assets/img/icons/eye';
8
10
  import eyeClosedIcon from './assets/img/icons/eye-closed';
11
+ import chevronIcon from './assets/img/icons/chevron';
12
+ import { defaultSelectedFacets, } from './models';
9
13
  const facetDisplayOrder = [
10
14
  'mediatype',
11
15
  'year',
@@ -33,51 +37,57 @@ const facetTitles = {
33
37
  let CollectionFacets = class CollectionFacets extends LitElement {
34
38
  constructor() {
35
39
  super(...arguments);
36
- this.selectedFacets = {};
37
- this.hiddenFacets = {};
38
40
  this.facetsLoading = false;
39
41
  this.fullYearAggregationLoading = false;
40
- }
41
- get hydratedSelectedFacets() {
42
- const { selectedFacets } = this;
43
- const hydratedSelectedFacets = {};
44
- Object.entries(selectedFacets).forEach(([key]) => {
45
- const values = hydratedSelectedFacets[key];
46
- const title = facetTitles[key];
47
- hydratedSelectedFacets[title] = values || [];
48
- delete hydratedSelectedFacets[key];
49
- });
50
- return hydratedSelectedFacets;
42
+ this.collapsableFacets = false;
43
+ this.showHistogramDatePicker = false;
44
+ this.openFacets = {
45
+ subject: false,
46
+ mediatype: false,
47
+ language: false,
48
+ creator: false,
49
+ collection: false,
50
+ year: false,
51
+ };
51
52
  }
52
53
  render() {
53
54
  return html `
54
55
  <div id="container" class="${this.facetsLoading ? 'loading' : ''}">
55
- <div class="facet-group">
56
- <h1>Year Published <feature-feedback></feature-feedback></h1>
57
- ${this.histogramTemplate}
58
- </div>
59
-
60
- ${this.mergedFacets.map(facetGroup => html `
56
+ ${this.showHistogramDatePicker && this.fullYearsHistogramAggregation
57
+ ? html `
61
58
  <div class="facet-group">
62
- <h1>${facetGroup.title}</h1>
63
- ${this.getFacetTemplate(facetGroup)}
59
+ <h1>Year Published <feature-feedback></feature-feedback></h1>
60
+ ${this.histogramTemplate}
64
61
  </div>
65
- `)}
62
+ `
63
+ : nothing}
64
+ ${this.mergedFacets.map(facetGroup => this.getFacetGroupTemplate(facetGroup))}
66
65
  </div>
67
66
  `;
68
67
  }
68
+ updated(changed) {
69
+ if (changed.has('selectedFacets')) {
70
+ this.dispatchFacetsChangedEvent();
71
+ }
72
+ }
73
+ dispatchFacetsChangedEvent() {
74
+ const event = new CustomEvent('facetsChanged', {
75
+ detail: this.selectedFacets,
76
+ });
77
+ this.dispatchEvent(event);
78
+ }
69
79
  get currentYearsHistogramAggregation() {
70
80
  var _a;
71
81
  return (_a = this.aggregations) === null || _a === void 0 ? void 0 : _a.year_histogram;
72
82
  }
73
83
  get histogramTemplate() {
74
- const { currentYearsHistogramAggregation, fullYearsHistogramAggregation } = this;
84
+ const { fullYearsHistogramAggregation } = this;
75
85
  return html `
76
86
  <histogram-date-range
77
87
  .minDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key}
78
88
  .maxDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key}
79
- .minSelectedDate=${currentYearsHistogramAggregation === null || currentYearsHistogramAggregation === void 0 ? void 0 : currentYearsHistogramAggregation.first_bucket_key}
80
- .maxSelectedDate=${currentYearsHistogramAggregation === null || currentYearsHistogramAggregation === void 0 ? void 0 : currentYearsHistogramAggregation.last_bucket_key}
89
+ .minSelectedDate=${this.minSelectedDate}
90
+ .maxSelectedDate=${this.maxSelectedDate}
81
91
  .updateDelay=${100}
82
92
  missingDataMessage="..."
83
93
  .width=${180}
@@ -94,49 +104,34 @@ let CollectionFacets = class CollectionFacets extends LitElement {
94
104
  this.dispatchEvent(event);
95
105
  }
96
106
  /**
97
- * Combines the selected and hidden facets with the aggregations to create a single list of facets
107
+ * Combines the selected facets with the aggregations to create a single list of facets
98
108
  */
99
109
  get mergedFacets() {
100
110
  const facetGroups = [];
101
111
  facetDisplayOrder.forEach(facetKey => {
102
- var _a, _b, _c;
112
+ var _a;
103
113
  const selectedFacetGroup = this.selectedFacetGroups.find(group => group.key === facetKey);
104
- const hiddenFacetGroup = this.hiddenFacetGroups.find(group => group.key === facetKey);
105
114
  const aggregateFacetGroup = this.aggregationFacetGroups.find(group => group.key === facetKey);
106
115
  // if the user selected a facet, but it's not in the aggregation, we add it as-is
107
116
  if (selectedFacetGroup && !aggregateFacetGroup) {
108
117
  facetGroups.push(selectedFacetGroup);
109
118
  return;
110
119
  }
111
- if (hiddenFacetGroup && !aggregateFacetGroup) {
112
- facetGroups.push(hiddenFacetGroup);
113
- return;
114
- }
115
120
  // if we don't have an aggregate facet group, don't add this to the list
116
121
  if (!aggregateFacetGroup)
117
122
  return;
118
123
  // start with either the selected group if we have one, or the aggregate group
119
- const facetGroup = (_a = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : hiddenFacetGroup) !== null && _a !== void 0 ? _a : aggregateFacetGroup;
124
+ const facetGroup = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : aggregateFacetGroup;
120
125
  // attach the counts to the selected buckets
121
- const bucketsWithCount = (_c = (_b = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
126
+ const bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
122
127
  const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
123
- if (selectedBucket) {
124
- return {
128
+ return selectedBucket
129
+ ? {
125
130
  ...bucket,
126
131
  count: selectedBucket.count,
127
- };
128
- }
129
- return bucket;
130
- })) !== null && _b !== void 0 ? _b : hiddenFacetGroup === null || hiddenFacetGroup === void 0 ? void 0 : hiddenFacetGroup.buckets.map(bucket => {
131
- const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
132
- if (selectedBucket) {
133
- return {
134
- ...bucket,
135
- count: selectedBucket.count,
136
- };
137
- }
138
- return bucket;
139
- })) !== null && _c !== void 0 ? _c : [];
132
+ }
133
+ : bucket;
134
+ })) !== null && _a !== void 0 ? _a : [];
140
135
  // append any additional buckets that were not selected
141
136
  aggregateFacetGroup.buckets.forEach(bucket => {
142
137
  const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);
@@ -145,35 +140,41 @@ let CollectionFacets = class CollectionFacets extends LitElement {
145
140
  bucketsWithCount.push(bucket);
146
141
  });
147
142
  facetGroup.buckets = bucketsWithCount.splice(0, 5);
148
- // if (facetGroup.buckets.length === 0) return;
149
143
  facetGroups.push(facetGroup);
150
144
  });
151
145
  return facetGroups;
152
146
  }
153
147
  /**
154
- * Converts the raw `selectedFacets` to `FacetGroups`, which are easier to use
148
+ * Converts the selected facets to a `FacetGroup` array,
149
+ * which is easier to work with
155
150
  */
156
151
  get selectedFacetGroups() {
157
- return this.getFacetGroups(this.selectedFacets, false);
158
- }
159
- get hiddenFacetGroups() {
160
- return this.getFacetGroups(this.hiddenFacets, true);
161
- }
162
- getFacetGroups(facets, hidden) {
163
- const facetGroups = [];
164
- Object.entries(facets).forEach(([key, buckets]) => {
165
- const title = facetTitles[key];
166
- const group = {
167
- title,
168
- key,
169
- buckets: buckets.map(bucket => ({
170
- key: bucket,
152
+ if (!this.selectedFacets)
153
+ return [];
154
+ const facetGroups = Object.entries(this.selectedFacets).map(([key, selectedFacets]) => {
155
+ const option = key;
156
+ const title = facetTitles[option];
157
+ const buckets = Object.entries(selectedFacets).map(([value, facetState]) => {
158
+ var _a, _b;
159
+ let displayText = value;
160
+ // for selected languages, we store the language code instead of the
161
+ // display name, so look up the name from the mapping
162
+ if (option === 'language') {
163
+ displayText =
164
+ (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getLanguageNameFromCodeString(value)) !== null && _b !== void 0 ? _b : value;
165
+ }
166
+ return {
167
+ displayText,
168
+ key: value,
171
169
  count: 0,
172
- selected: !hidden,
173
- hidden,
174
- })),
170
+ state: facetState,
171
+ };
172
+ });
173
+ return {
174
+ title,
175
+ key: option,
176
+ buckets,
175
177
  };
176
- facetGroups.push(group);
177
178
  });
178
179
  return facetGroups;
179
180
  }
@@ -184,17 +185,30 @@ let CollectionFacets = class CollectionFacets extends LitElement {
184
185
  var _a;
185
186
  const facetGroups = [];
186
187
  Object.entries((_a = this.aggregations) !== null && _a !== void 0 ? _a : []).forEach(([key, buckets]) => {
188
+ // the year_histogram data is in a different format so can't be handled here
187
189
  if (key === 'year_histogram')
188
190
  return;
189
191
  const option = this.getFacetOptionFromKey(key);
190
192
  const title = facetTitles[option];
191
193
  const castedBuckets = buckets.buckets;
192
- const facetBuckets = castedBuckets.map(bucket => ({
193
- key: `${bucket.key}`,
194
- count: bucket.doc_count,
195
- selected: false,
196
- hidden: false,
197
- }));
194
+ const facetBuckets = castedBuckets.map(bucket => {
195
+ var _a, _b;
196
+ let bucketKey = bucket.key;
197
+ // for languages, we need to search by language code instead of the
198
+ // display name, which is what we get from the search engine result
199
+ if (option === 'language') {
200
+ // const languageCodeKey = languageToCodeMap[bucket.key];
201
+ bucketKey =
202
+ (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getCodeStringFromLanguageName(`${bucket.key}`)) !== null && _b !== void 0 ? _b : bucket.key;
203
+ // bucketKey = languageCodeKey ?? bucket.key;
204
+ }
205
+ return {
206
+ displayText: `${bucket.key}`,
207
+ key: `${bucketKey}`,
208
+ count: bucket.doc_count,
209
+ state: 'none',
210
+ };
211
+ });
198
212
  const group = {
199
213
  title,
200
214
  key: option,
@@ -204,124 +218,161 @@ let CollectionFacets = class CollectionFacets extends LitElement {
204
218
  });
205
219
  return facetGroups;
206
220
  }
221
+ /**
222
+ * Generate the template for a facet group with a header and the collapsible
223
+ * chevron for the mobile view
224
+ */
225
+ getFacetGroupTemplate(facetGroup) {
226
+ if (facetGroup.buckets.length === 0)
227
+ return nothing;
228
+ const { key } = facetGroup;
229
+ const isOpen = this.openFacets[key];
230
+ const collapser = html `
231
+ <span class="collapser ${isOpen ? 'open' : ''}"> ${chevronIcon} </span>
232
+ `;
233
+ return html `
234
+ <div class="facet-group ${this.collapsableFacets ? 'mobile' : ''}">
235
+ <h1
236
+ @click=${() => {
237
+ const newOpenFacets = { ...this.openFacets };
238
+ newOpenFacets[key] = !isOpen;
239
+ this.openFacets = newOpenFacets;
240
+ }}
241
+ @keyup=${() => {
242
+ const newOpenFacets = { ...this.openFacets };
243
+ newOpenFacets[key] = !isOpen;
244
+ this.openFacets = newOpenFacets;
245
+ }}
246
+ >
247
+ ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}
248
+ </h1>
249
+ <div class="facet-group-content ${isOpen ? 'open' : ''}">
250
+ ${this.getFacetTemplate(facetGroup)}
251
+ </div>
252
+ </div>
253
+ `;
254
+ }
255
+ /**
256
+ * Generate the list template for each bucket in a facet group
257
+ */
207
258
  getFacetTemplate(facetGroup) {
259
+ const bucketsNoFavorites = facetGroup.buckets.filter(bucket => bucket.key.startsWith('fav-') === false);
260
+ const bucketsMaxSix = bucketsNoFavorites.slice(0, 6);
208
261
  return html `
209
262
  <ul class="facet-list">
210
- ${repeat(facetGroup.buckets, bucket => `${facetGroup.key}:${bucket.key}`, bucket => {
211
- const hiddenCheckboxId = `${facetGroup.key}:${bucket.key}-hidden`;
263
+ ${repeat(bucketsMaxSix, bucket => `${facetGroup.key}:${bucket.key}`, bucket => {
264
+ var _a, _b;
265
+ const showOnlyCheckboxId = `${facetGroup.key}:${bucket.key}-show-only`;
266
+ const negativeCheckboxId = `${facetGroup.key}:${bucket.key}-negative`;
267
+ // for collections, we need to asynchronously load the collection name
268
+ // so we use the `async-collection-name` widget and for the rest, we have
269
+ // a static value to use
270
+ const bucketTextDisplay = facetGroup.key !== 'collection'
271
+ ? html `${(_a = bucket.displayText) !== null && _a !== void 0 ? _a : bucket.key}`
272
+ : html `
273
+ <async-collection-name
274
+ .collectionNameCache=${this.collectionNameCache}
275
+ .identifier=${bucket.key}
276
+ placeholder="-"
277
+ ></async-collection-name>
278
+ `;
279
+ const facetHidden = bucket.state === 'hidden';
280
+ const facetSelected = bucket.state === 'selected';
281
+ const titleText = `${facetGroup.key}: ${(_b = bucket.displayText) !== null && _b !== void 0 ? _b : bucket.key}`;
282
+ const onlyShowText = facetSelected
283
+ ? `Show all ${facetGroup.key}s`
284
+ : `Only show ${titleText}`;
285
+ const hideText = `Hide ${titleText}`;
286
+ const unhideText = `Unhide ${titleText}`;
287
+ const showHideText = facetHidden ? unhideText : hideText;
212
288
  return html `
213
289
  <li>
214
- <label class="facet-row">
290
+ <div class="facet-row">
215
291
  <div class="facet-checkbox">
216
292
  <input
217
293
  type="checkbox"
218
294
  .name=${facetGroup.key}
219
295
  .value=${bucket.key}
220
- @click=${this.facetToggled}
221
- ?checked=${bucket.selected}
296
+ @click=${(e) => {
297
+ this.facetClicked(e, bucket, false);
298
+ }}
299
+ .checked=${facetSelected}
222
300
  class="select-facet-checkbox"
301
+ title=${onlyShowText}
302
+ id=${showOnlyCheckboxId}
223
303
  />
224
304
  <input
225
305
  type="checkbox"
226
- id=${hiddenCheckboxId}
306
+ id=${negativeCheckboxId}
227
307
  .name=${facetGroup.key}
228
308
  .value=${bucket.key}
229
- @click=${this.hideFacetToggled}
230
- ?checked=${bucket.hidden}
309
+ @click=${(e) => {
310
+ this.facetClicked(e, bucket, true);
311
+ }}
312
+ .checked=${facetHidden}
231
313
  class="hide-facet-checkbox"
232
314
  />
233
- <label for=${hiddenCheckboxId} class="hide-facet-icon">
234
- ${bucket.hidden ? eyeClosedIcon : eyeIcon}
315
+ <label
316
+ for=${negativeCheckboxId}
317
+ class="hide-facet-icon"
318
+ title=${showHideText}
319
+ >
320
+ ${facetHidden ? eyeClosedIcon : eyeIcon}
235
321
  </label>
236
322
  </div>
237
- <div class="facet-title">${bucket.key}</div>
238
- <div class="facet-count">${bucket.count}</div>
239
- </label>
323
+
324
+ <label
325
+ for=${showOnlyCheckboxId}
326
+ class="facet-info-display"
327
+ title=${onlyShowText}
328
+ >
329
+ <div class="facet-title">${bucketTextDisplay}</div>
330
+ <div class="facet-count">${bucket.count}</div>
331
+ </label>
332
+ </div>
240
333
  </li>
241
334
  `;
242
335
  })}
243
336
  </ul>
244
337
  `;
245
338
  }
246
- facetChecked(name, value) {
247
- const { selectedFacets } = this;
248
- const facetClone = { ...selectedFacets };
249
- const currentFacetValues = facetClone[name];
250
- if (currentFacetValues) {
251
- currentFacetValues.push(value);
252
- facetClone[name] = currentFacetValues;
253
- }
254
- else {
255
- facetClone[name] = [value];
256
- }
257
- this.selectedFacets = facetClone;
258
- }
259
- facetUnchecked(name, value) {
260
- const { selectedFacets } = this;
261
- const facetClone = { ...selectedFacets };
262
- let currentFacetValues = selectedFacets[name];
263
- if (currentFacetValues) {
264
- currentFacetValues = currentFacetValues.filter(el => el !== value);
265
- facetClone[name] = currentFacetValues;
266
- if (currentFacetValues.length === 0) {
267
- delete facetClone[name];
268
- }
269
- }
270
- this.selectedFacets = facetClone;
271
- }
272
- facetToggled(e) {
339
+ facetClicked(e, bucket, negative) {
273
340
  const target = e.target;
274
341
  const { checked, name, value } = target;
275
342
  if (checked) {
276
- this.facetChecked(name, value);
343
+ this.facetChecked(name, value, negative);
277
344
  }
278
345
  else {
279
346
  this.facetUnchecked(name, value);
280
347
  }
281
- const event = new CustomEvent('facetsChanged', {
282
- detail: this.selectedFacets,
283
- });
284
- this.dispatchEvent(event);
285
348
  }
286
- hideFacetToggled(e) {
287
- const target = e.target;
288
- const { checked, name, value } = target;
289
- if (checked) {
290
- this.facetHidden(name, value);
349
+ facetChecked(key, value, negative) {
350
+ const { selectedFacets } = this;
351
+ let newFacets;
352
+ if (selectedFacets) {
353
+ newFacets = {
354
+ ...selectedFacets,
355
+ };
291
356
  }
292
357
  else {
293
- this.facetUnhidden(name, value);
358
+ newFacets = defaultSelectedFacets;
294
359
  }
295
- const event = new CustomEvent('hiddenFacetsChanged', {
296
- detail: this.hiddenFacets,
297
- });
298
- this.dispatchEvent(event);
360
+ newFacets[key][value] = negative ? 'hidden' : 'selected';
361
+ this.selectedFacets = newFacets;
299
362
  }
300
- facetHidden(name, value) {
301
- const { hiddenFacets } = this;
302
- const facetClone = { ...hiddenFacets };
303
- const currentFacetValues = facetClone[name];
304
- if (currentFacetValues) {
305
- currentFacetValues.push(value);
306
- facetClone[name] = currentFacetValues;
363
+ facetUnchecked(key, value) {
364
+ const { selectedFacets } = this;
365
+ let newFacets;
366
+ if (selectedFacets) {
367
+ newFacets = {
368
+ ...selectedFacets,
369
+ };
307
370
  }
308
371
  else {
309
- facetClone[name] = [value];
372
+ newFacets = defaultSelectedFacets;
310
373
  }
311
- this.hiddenFacets = facetClone;
312
- }
313
- facetUnhidden(name, value) {
314
- const { hiddenFacets } = this;
315
- const facetClone = { ...hiddenFacets };
316
- let currentFacetValues = hiddenFacets[name];
317
- if (currentFacetValues) {
318
- currentFacetValues = currentFacetValues.filter(el => el !== value);
319
- facetClone[name] = currentFacetValues;
320
- if (currentFacetValues.length === 0) {
321
- delete facetClone[name];
322
- }
323
- }
324
- this.hiddenFacets = facetClone;
374
+ delete newFacets[key][value];
375
+ this.selectedFacets = newFacets;
325
376
  }
326
377
  /**
327
378
  * Parse the aggregate key title into the human readable title
@@ -347,12 +398,52 @@ let CollectionFacets = class CollectionFacets extends LitElement {
347
398
  opacity: 0.5;
348
399
  }
349
400
 
401
+ .collapser {
402
+ display: inline-block;
403
+ cursor: pointer;
404
+ width: 10px;
405
+ height: 10px;
406
+ }
407
+
408
+ .collapser svg {
409
+ transition: transform 0.2s ease-in-out;
410
+ }
411
+
412
+ .collapser.open svg {
413
+ transform: rotate(90deg);
414
+ }
415
+
416
+ .facet-group {
417
+ margin-bottom: 2rem;
418
+ }
419
+
420
+ .facet-group h1 {
421
+ margin-bottom: 0.7rem;
422
+ }
423
+
424
+ .facet-group.mobile h1 {
425
+ cursor: pointer;
426
+ }
427
+
428
+ .facet-group-content {
429
+ transition: max-height 0.2s ease-in-out;
430
+ }
431
+
432
+ .facet-group.mobile .facet-group-content {
433
+ max-height: 0;
434
+ overflow: hidden;
435
+ }
436
+
437
+ .facet-group.mobile .facet-group-content.open {
438
+ max-height: 2000px;
439
+ }
440
+
350
441
  h1 {
351
442
  font-size: 1.4rem;
352
443
  font-weight: 200;
353
444
  border-bottom: 1px solid rgb(232, 232, 232);
354
445
  padding-bottom: 3px;
355
- margin: 24px 0 14px 0;
446
+ margin: 0;
356
447
  }
357
448
 
358
449
  ul.facet-list {
@@ -373,11 +464,17 @@ let CollectionFacets = class CollectionFacets extends LitElement {
373
464
 
374
465
  .facet-row {
375
466
  display: flex;
376
- align-items: center;
467
+ align-items: start;
377
468
  font-weight: 500;
378
469
  font-size: 1.2rem;
379
470
  }
380
471
 
472
+ .facet-info-display {
473
+ display: flex;
474
+ flex: 1;
475
+ cursor: pointer;
476
+ }
477
+
381
478
  .facet-title {
382
479
  flex: 1;
383
480
  }
@@ -387,6 +484,7 @@ let CollectionFacets = class CollectionFacets extends LitElement {
387
484
  }
388
485
 
389
486
  .select-facet-checkbox {
487
+ cursor: pointer;
390
488
  margin-right: 5px;
391
489
  }
392
490
 
@@ -409,17 +507,35 @@ __decorate([
409
507
  property({ type: Object })
410
508
  ], CollectionFacets.prototype, "fullYearsHistogramAggregation", void 0);
411
509
  __decorate([
412
- property({ type: Object })
413
- ], CollectionFacets.prototype, "selectedFacets", void 0);
510
+ property({ type: String })
511
+ ], CollectionFacets.prototype, "minSelectedDate", void 0);
414
512
  __decorate([
415
- property({ type: Object })
416
- ], CollectionFacets.prototype, "hiddenFacets", void 0);
513
+ property({ type: String })
514
+ ], CollectionFacets.prototype, "maxSelectedDate", void 0);
417
515
  __decorate([
418
516
  property({ type: Boolean })
419
517
  ], CollectionFacets.prototype, "facetsLoading", void 0);
420
518
  __decorate([
421
519
  property({ type: Boolean })
422
520
  ], CollectionFacets.prototype, "fullYearAggregationLoading", void 0);
521
+ __decorate([
522
+ property({ type: Object })
523
+ ], CollectionFacets.prototype, "selectedFacets", void 0);
524
+ __decorate([
525
+ property({ type: Boolean })
526
+ ], CollectionFacets.prototype, "collapsableFacets", void 0);
527
+ __decorate([
528
+ property({ type: Boolean })
529
+ ], CollectionFacets.prototype, "showHistogramDatePicker", void 0);
530
+ __decorate([
531
+ property({ type: Object })
532
+ ], CollectionFacets.prototype, "languageCodeHandler", void 0);
533
+ __decorate([
534
+ property({ type: Object })
535
+ ], CollectionFacets.prototype, "collectionNameCache", void 0);
536
+ __decorate([
537
+ state()
538
+ ], CollectionFacets.prototype, "openFacets", void 0);
423
539
  CollectionFacets = __decorate([
424
540
  customElement('collection-facets')
425
541
  ], CollectionFacets);