@internetarchive/collection-browser 0.0.1-alpha.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +8 -11
  2. package/demo/app-root.ts +30 -96
  3. package/dist/demo/app-root.d.ts +3 -5
  4. package/dist/demo/app-root.js +28 -87
  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/eye-closed.d.ts +2 -0
  13. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  14. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  15. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  16. package/dist/src/assets/img/icons/eye.js +5 -0
  17. package/dist/src/assets/img/icons/eye.js.map +1 -0
  18. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
  19. package/dist/src/assets/img/icons/mediatype/account.js +6 -4
  20. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
  21. package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
  22. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
  23. package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
  24. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
  25. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  26. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  27. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  28. package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
  29. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
  30. package/dist/src/assets/img/icons/mediatype/film.js +2 -1
  31. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
  32. package/dist/src/assets/img/icons/mediatype/images.js +9 -6
  33. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
  34. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  35. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  36. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  37. package/dist/src/assets/img/icons/mediatype/software.js +9 -6
  38. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
  39. package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
  40. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
  41. package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
  42. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
  43. package/dist/src/assets/img/icons/mediatype/video.js +10 -6
  44. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
  45. package/dist/src/assets/img/icons/mediatype/web.js +9 -6
  46. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
  47. package/dist/src/collection-browser.d.ts +57 -20
  48. package/dist/src/collection-browser.js +511 -128
  49. package/dist/src/collection-browser.js.map +1 -1
  50. package/dist/src/collection-facets.d.ts +27 -6
  51. package/dist/src/collection-facets.js +316 -100
  52. package/dist/src/collection-facets.js.map +1 -1
  53. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  54. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  55. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  56. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  57. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  58. package/dist/src/language-code-handler/language-code-mapping.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/models.d.ts +72 -13
  63. package/dist/src/models.js +57 -1
  64. package/dist/src/models.js.map +1 -1
  65. package/dist/src/restoration-state-handler.d.ts +38 -0
  66. package/dist/src/restoration-state-handler.js +204 -0
  67. package/dist/src/restoration-state-handler.js.map +1 -0
  68. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -2
  69. package/dist/src/sort-filter-bar/alpha-bar.js +12 -8
  70. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  71. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  72. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  73. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  74. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  75. package/dist/src/sort-filter-bar/img/list.js +5 -0
  76. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  77. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  78. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  79. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  80. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  81. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  82. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  83. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +74 -13
  84. package/dist/src/sort-filter-bar/sort-filter-bar.js +547 -172
  85. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  86. package/dist/src/tiles/{loading-tile.d.ts → collection-browser-loading-tile.d.ts} +1 -1
  87. package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
  88. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  89. package/dist/src/tiles/grid/account-tile.d.ts +1 -1
  90. package/dist/src/tiles/grid/account-tile.js +5 -5
  91. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  92. package/dist/src/tiles/grid/collection-tile.js +1 -2
  93. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  94. package/dist/src/tiles/grid/icons/views.d.ts +1 -1
  95. package/dist/src/tiles/grid/icons/views.js +2 -2
  96. package/dist/src/tiles/grid/icons/views.js.map +1 -1
  97. package/dist/src/tiles/grid/item-tile.d.ts +2 -2
  98. package/dist/src/tiles/grid/item-tile.js +58 -150
  99. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  100. package/dist/src/tiles/item-image.d.ts +19 -0
  101. package/dist/src/tiles/item-image.js +204 -0
  102. package/dist/src/tiles/item-image.js.map +1 -0
  103. package/dist/src/tiles/list/account-label.d.ts +1 -0
  104. package/dist/src/tiles/list/account-label.js +7 -0
  105. package/dist/src/tiles/list/account-label.js.map +1 -0
  106. package/dist/src/tiles/list/date-label.d.ts +1 -0
  107. package/dist/src/tiles/list/date-label.js +13 -0
  108. package/dist/src/tiles/list/date-label.js.map +1 -0
  109. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
  110. package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
  111. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  112. package/dist/src/tiles/list/tile-list-compact.d.ts +12 -0
  113. package/dist/src/tiles/list/tile-list-compact.js +203 -6
  114. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  115. package/dist/src/tiles/list/tile-list.d.ts +35 -10
  116. package/dist/src/tiles/list/tile-list.js +368 -104
  117. package/dist/src/tiles/list/tile-list.js.map +1 -1
  118. package/dist/src/{mediatype-icon.d.ts → tiles/mediatype-icon.d.ts} +2 -2
  119. package/dist/src/tiles/mediatype-icon.js +78 -0
  120. package/dist/src/tiles/mediatype-icon.js.map +1 -0
  121. package/dist/src/tiles/tile-dispatcher.d.ts +11 -4
  122. package/dist/src/tiles/tile-dispatcher.js +56 -19
  123. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  124. package/dist/src/utils/format-date.js +2 -2
  125. package/dist/src/utils/format-date.js.map +1 -1
  126. package/dist/test/collection-browser.test.d.ts +1 -0
  127. package/dist/test/collection-browser.test.js +16 -2
  128. package/dist/test/collection-browser.test.js.map +1 -1
  129. package/dist/test/{utils/format-string.test.d.ts → mediatype-config.test.d.ts} +0 -0
  130. package/dist/test/mediatype-config.test.js +17 -0
  131. package/dist/test/mediatype-config.test.js.map +1 -0
  132. package/dist/test/utils/format-date.test.js +1 -1
  133. package/dist/test/utils/format-date.test.js.map +1 -1
  134. package/index.ts +6 -0
  135. package/local.archive.org.cert +86 -0
  136. package/local.archive.org.key +27 -0
  137. package/package.json +9 -5
  138. package/src/assets/img/icons/chevron.ts +4 -0
  139. package/src/assets/img/icons/eye-closed.ts +5 -0
  140. package/src/assets/img/icons/eye.ts +5 -0
  141. package/src/assets/img/icons/mediatype/account.ts +6 -4
  142. package/src/assets/img/icons/mediatype/audio.ts +7 -4
  143. package/src/assets/img/icons/mediatype/collection.ts +7 -4
  144. package/src/assets/img/icons/mediatype/data.ts +15 -0
  145. package/src/assets/img/icons/mediatype/etree.ts +10 -5
  146. package/src/assets/img/icons/mediatype/film.ts +2 -1
  147. package/src/assets/img/icons/mediatype/images.ts +9 -6
  148. package/src/assets/img/icons/mediatype/radio.ts +15 -0
  149. package/src/assets/img/icons/mediatype/software.ts +9 -6
  150. package/src/assets/img/icons/mediatype/texts.ts +9 -6
  151. package/src/assets/img/icons/mediatype/tv.ts +10 -5
  152. package/src/assets/img/icons/mediatype/video.ts +10 -6
  153. package/src/assets/img/icons/mediatype/web.ts +9 -6
  154. package/src/collection-browser.ts +537 -123
  155. package/src/collection-facets.ts +352 -132
  156. package/src/language-code-handler/language-code-handler.ts +64 -0
  157. package/src/language-code-handler/language-code-mapping.ts +564 -0
  158. package/src/mediatype/mediatype-config.ts +86 -0
  159. package/src/models.ts +141 -13
  160. package/src/restoration-state-handler.ts +266 -0
  161. package/src/sort-filter-bar/alpha-bar.ts +12 -8
  162. package/src/sort-filter-bar/img/compact.ts +5 -0
  163. package/src/sort-filter-bar/img/list.ts +5 -0
  164. package/src/sort-filter-bar/img/sort-triangle.ts +5 -0
  165. package/src/sort-filter-bar/img/tile.ts +5 -0
  166. package/src/sort-filter-bar/sort-filter-bar.ts +604 -176
  167. package/src/tiles/collection-browser-loading-tile.ts +29 -0
  168. package/src/tiles/grid/account-tile.ts +1 -1
  169. package/src/tiles/grid/collection-tile.ts +1 -2
  170. package/src/tiles/grid/icons/views.ts +2 -2
  171. package/src/tiles/grid/item-tile.ts +57 -162
  172. package/src/tiles/item-image.ts +206 -0
  173. package/src/tiles/list/account-label.ts +6 -0
  174. package/src/tiles/list/date-label.ts +12 -0
  175. package/src/tiles/list/tile-list-compact-header.ts +77 -0
  176. package/src/tiles/list/tile-list-compact.ts +218 -0
  177. package/src/tiles/list/tile-list.ts +412 -107
  178. package/src/tiles/mediatype-icon.ts +75 -0
  179. package/src/tiles/tile-dispatcher.ts +66 -18
  180. package/src/utils/format-date.ts +2 -2
  181. package/test/collection-browser.test.ts +20 -1
  182. package/test/mediatype-config.test.ts +18 -0
  183. package/test/utils/format-date.test.ts +1 -1
  184. package/web-dev-server.config.mjs +3 -1
  185. package/dist/src/assets/img/icons/audio.d.ts +0 -1
  186. package/dist/src/assets/img/icons/audio.js +0 -9
  187. package/dist/src/assets/img/icons/audio.js.map +0 -1
  188. package/dist/src/assets/img/icons/collection.d.ts +0 -1
  189. package/dist/src/assets/img/icons/collection.js +0 -9
  190. package/dist/src/assets/img/icons/collection.js.map +0 -1
  191. package/dist/src/assets/img/icons/etree.d.ts +0 -1
  192. package/dist/src/assets/img/icons/etree.js +0 -9
  193. package/dist/src/assets/img/icons/etree.js.map +0 -1
  194. package/dist/src/assets/img/icons/images.d.ts +0 -1
  195. package/dist/src/assets/img/icons/images.js +0 -10
  196. package/dist/src/assets/img/icons/images.js.map +0 -1
  197. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
  198. package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
  199. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
  200. package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +0 -1
  201. package/dist/src/assets/img/icons/mediatype/livemusic.js +0 -7
  202. package/dist/src/assets/img/icons/mediatype/livemusic.js.map +0 -1
  203. package/dist/src/assets/img/icons/mediatype/photos.d.ts +0 -1
  204. package/dist/src/assets/img/icons/mediatype/photos.js +0 -7
  205. package/dist/src/assets/img/icons/mediatype/photos.js.map +0 -1
  206. package/dist/src/assets/img/icons/software.d.ts +0 -1
  207. package/dist/src/assets/img/icons/software.js +0 -10
  208. package/dist/src/assets/img/icons/software.js.map +0 -1
  209. package/dist/src/assets/img/icons/texts.d.ts +0 -1
  210. package/dist/src/assets/img/icons/texts.js +0 -10
  211. package/dist/src/assets/img/icons/texts.js.map +0 -1
  212. package/dist/src/assets/img/icons/tv.d.ts +0 -1
  213. package/dist/src/assets/img/icons/tv.js +0 -9
  214. package/dist/src/assets/img/icons/tv.js.map +0 -1
  215. package/dist/src/assets/img/icons/video.d.ts +0 -1
  216. package/dist/src/assets/img/icons/video.js +0 -10
  217. package/dist/src/assets/img/icons/video.js.map +0 -1
  218. package/dist/src/assets/img/icons/web.d.ts +0 -1
  219. package/dist/src/assets/img/icons/web.js +0 -10
  220. package/dist/src/assets/img/icons/web.js.map +0 -1
  221. package/dist/src/mediatype-icon.js +0 -89
  222. package/dist/src/mediatype-icon.js.map +0 -1
  223. package/dist/src/search-handler.d.ts +0 -11
  224. package/dist/src/search-handler.js +0 -34
  225. package/dist/src/search-handler.js.map +0 -1
  226. package/dist/src/tiles/list/tile-list-detail.d.ts +0 -7
  227. package/dist/src/tiles/list/tile-list-detail.js +0 -28
  228. package/dist/src/tiles/list/tile-list-detail.js.map +0 -1
  229. package/dist/src/tiles/loading-tile.js +0 -73
  230. package/dist/src/tiles/loading-tile.js.map +0 -1
  231. package/dist/src/utils/format-string.d.ts +0 -2
  232. package/dist/src/utils/format-string.js +0 -7
  233. package/dist/src/utils/format-string.js.map +0 -1
  234. package/dist/test/utils/format-string.test.js +0 -17
  235. package/dist/test/utils/format-string.test.js.map +0 -1
  236. package/src/assets/img/icons/mediatype/foo.svg +0 -5
  237. package/src/mediatype-icon.ts +0 -83
  238. package/src/tiles/loading-tile.ts +0 -70
@@ -1,9 +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';
9
+ import eyeIcon from './assets/img/icons/eye';
10
+ import eyeClosedIcon from './assets/img/icons/eye-closed';
11
+ import chevronIcon from './assets/img/icons/chevron';
12
+ import { defaultSelectedFacets, } from './models';
7
13
  const facetDisplayOrder = [
8
14
  'mediatype',
9
15
  'year',
@@ -31,50 +37,57 @@ const facetTitles = {
31
37
  let CollectionFacets = class CollectionFacets extends LitElement {
32
38
  constructor() {
33
39
  super(...arguments);
34
- this.selectedFacets = {};
35
40
  this.facetsLoading = false;
36
41
  this.fullYearAggregationLoading = false;
37
- }
38
- get hydratedSelectedFacets() {
39
- const { selectedFacets } = this;
40
- const hydratedSelectedFacets = {};
41
- Object.entries(selectedFacets).forEach(([key]) => {
42
- const values = hydratedSelectedFacets[key];
43
- const title = facetTitles[key];
44
- hydratedSelectedFacets[title] = values || [];
45
- delete hydratedSelectedFacets[key];
46
- });
47
- 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
+ };
48
52
  }
49
53
  render() {
50
54
  return html `
51
55
  <div id="container" class="${this.facetsLoading ? 'loading' : ''}">
52
- <div class="facet-group">
53
- <h1>Year Published <feature-feedback></feature-feedback></h1>
54
- ${this.histogramTemplate}
55
- </div>
56
-
57
- ${this.mergedFacets.map(facetGroup => html `
56
+ ${this.showHistogramDatePicker && this.fullYearsHistogramAggregation
57
+ ? html `
58
58
  <div class="facet-group">
59
- <h1>${facetGroup.title}</h1>
60
- ${this.getFacetTemplate(facetGroup)}
59
+ <h1>Year Published <feature-feedback></feature-feedback></h1>
60
+ ${this.histogramTemplate}
61
61
  </div>
62
- `)}
62
+ `
63
+ : nothing}
64
+ ${this.mergedFacets.map(facetGroup => this.getFacetGroupTemplate(facetGroup))}
63
65
  </div>
64
66
  `;
65
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
+ }
66
79
  get currentYearsHistogramAggregation() {
67
80
  var _a;
68
81
  return (_a = this.aggregations) === null || _a === void 0 ? void 0 : _a.year_histogram;
69
82
  }
70
83
  get histogramTemplate() {
71
- const { currentYearsHistogramAggregation, fullYearsHistogramAggregation } = this;
84
+ const { fullYearsHistogramAggregation } = this;
72
85
  return html `
73
86
  <histogram-date-range
74
87
  .minDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key}
75
88
  .maxDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key}
76
- .minSelectedDate=${currentYearsHistogramAggregation === null || currentYearsHistogramAggregation === void 0 ? void 0 : currentYearsHistogramAggregation.first_bucket_key}
77
- .maxSelectedDate=${currentYearsHistogramAggregation === null || currentYearsHistogramAggregation === void 0 ? void 0 : currentYearsHistogramAggregation.last_bucket_key}
89
+ .minSelectedDate=${this.minSelectedDate}
90
+ .maxSelectedDate=${this.maxSelectedDate}
78
91
  .updateDelay=${100}
79
92
  missingDataMessage="..."
80
93
  .width=${180}
@@ -112,13 +125,12 @@ let CollectionFacets = class CollectionFacets extends LitElement {
112
125
  // attach the counts to the selected buckets
113
126
  const bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
114
127
  const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
115
- if (selectedBucket) {
116
- return {
128
+ return selectedBucket
129
+ ? {
117
130
  ...bucket,
118
131
  count: selectedBucket.count,
119
- };
120
- }
121
- return bucket;
132
+ }
133
+ : bucket;
122
134
  })) !== null && _a !== void 0 ? _a : [];
123
135
  // append any additional buckets that were not selected
124
136
  aggregateFacetGroup.buckets.forEach(bucket => {
@@ -128,31 +140,43 @@ let CollectionFacets = class CollectionFacets extends LitElement {
128
140
  bucketsWithCount.push(bucket);
129
141
  });
130
142
  facetGroup.buckets = bucketsWithCount.splice(0, 5);
131
- if (facetGroup.buckets.length === 0)
132
- return;
133
143
  facetGroups.push(facetGroup);
134
144
  });
135
145
  return facetGroups;
136
146
  }
137
147
  /**
138
- * 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
139
150
  */
140
151
  get selectedFacetGroups() {
141
- const selectedFacetGroups = [];
142
- Object.entries(this.selectedFacets).forEach(([key, buckets]) => {
143
- const title = facetTitles[key];
144
- const group = {
145
- title,
146
- key,
147
- buckets: buckets.map(bucket => ({
148
- 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,
149
169
  count: 0,
150
- selected: true,
151
- })),
170
+ state: facetState,
171
+ };
172
+ });
173
+ return {
174
+ title,
175
+ key: option,
176
+ buckets,
152
177
  };
153
- selectedFacetGroups.push(group);
154
178
  });
155
- return selectedFacetGroups;
179
+ return facetGroups;
156
180
  }
157
181
  /**
158
182
  * Converts the raw `aggregations` to `FacetGroups`, which are easier to use
@@ -161,15 +185,30 @@ let CollectionFacets = class CollectionFacets extends LitElement {
161
185
  var _a;
162
186
  const facetGroups = [];
163
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
164
189
  if (key === 'year_histogram')
165
190
  return;
166
191
  const option = this.getFacetOptionFromKey(key);
167
192
  const title = facetTitles[option];
168
- const facetBuckets = buckets.buckets.map(bucket => ({
169
- key: `${bucket.key}`,
170
- count: bucket.doc_count,
171
- selected: false,
172
- }));
193
+ const castedBuckets = buckets.buckets;
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
+ });
173
212
  const group = {
174
213
  title,
175
214
  key: option,
@@ -179,68 +218,161 @@ let CollectionFacets = class CollectionFacets extends LitElement {
179
218
  });
180
219
  return facetGroups;
181
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
+ */
182
258
  getFacetTemplate(facetGroup) {
259
+ const bucketsNoFavorites = facetGroup.buckets.filter(bucket => bucket.key.startsWith('fav-') === false);
260
+ const bucketsMaxSix = bucketsNoFavorites.slice(0, 6);
183
261
  return html `
184
262
  <ul class="facet-list">
185
- ${repeat(facetGroup.buckets, bucket => `${facetGroup.key}:${bucket.key}`, bucket => html `
186
- <li>
187
- <label class="facet-row">
188
- <div class="facet-checkbox">
189
- <input
190
- type="checkbox"
191
- .name=${facetGroup.key}
192
- .value=${bucket.key}
193
- @click=${this.facetToggled}
194
- ?checked=${bucket.selected}
195
- />
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;
288
+ return html `
289
+ <li>
290
+ <div class="facet-row">
291
+ <div class="facet-checkbox">
292
+ <input
293
+ type="checkbox"
294
+ .name=${facetGroup.key}
295
+ .value=${bucket.key}
296
+ @click=${(e) => {
297
+ this.facetClicked(e, bucket, false);
298
+ }}
299
+ .checked=${facetSelected}
300
+ class="select-facet-checkbox"
301
+ title=${onlyShowText}
302
+ id=${showOnlyCheckboxId}
303
+ />
304
+ <input
305
+ type="checkbox"
306
+ id=${negativeCheckboxId}
307
+ .name=${facetGroup.key}
308
+ .value=${bucket.key}
309
+ @click=${(e) => {
310
+ this.facetClicked(e, bucket, true);
311
+ }}
312
+ .checked=${facetHidden}
313
+ class="hide-facet-checkbox"
314
+ />
315
+ <label
316
+ for=${negativeCheckboxId}
317
+ class="hide-facet-icon"
318
+ title=${showHideText}
319
+ >
320
+ ${facetHidden ? eyeClosedIcon : eyeIcon}
321
+ </label>
322
+ </div>
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>
196
332
  </div>
197
- <div class="facet-title">${bucket.key}</div>
198
- <div class="facet-count">${bucket.count}</div>
199
- </label>
200
- </li>
201
- `)}
333
+ </li>
334
+ `;
335
+ })}
202
336
  </ul>
203
337
  `;
204
338
  }
205
- facetChecked(name, value) {
206
- const { selectedFacets } = this;
207
- const facetClone = { ...selectedFacets };
208
- const currentFacetValues = facetClone[name];
209
- if (currentFacetValues) {
210
- currentFacetValues.push(value);
211
- facetClone[name] = currentFacetValues;
339
+ facetClicked(e, bucket, negative) {
340
+ const target = e.target;
341
+ const { checked, name, value } = target;
342
+ if (checked) {
343
+ this.facetChecked(name, value, negative);
212
344
  }
213
345
  else {
214
- facetClone[name] = [value];
346
+ this.facetUnchecked(name, value);
215
347
  }
216
- this.selectedFacets = facetClone;
217
348
  }
218
- facetUnchecked(name, value) {
349
+ facetChecked(key, value, negative) {
219
350
  const { selectedFacets } = this;
220
- const facetClone = { ...selectedFacets };
221
- let currentFacetValues = selectedFacets[name];
222
- if (currentFacetValues) {
223
- currentFacetValues = currentFacetValues.filter(el => el !== value);
224
- facetClone[name] = currentFacetValues;
225
- if (currentFacetValues.length === 0) {
226
- delete facetClone[name];
227
- }
351
+ let newFacets;
352
+ if (selectedFacets) {
353
+ newFacets = {
354
+ ...selectedFacets,
355
+ };
228
356
  }
229
- this.selectedFacets = facetClone;
357
+ else {
358
+ newFacets = defaultSelectedFacets;
359
+ }
360
+ newFacets[key][value] = negative ? 'hidden' : 'selected';
361
+ this.selectedFacets = newFacets;
230
362
  }
231
- facetToggled(e) {
232
- const target = e.target;
233
- const { checked, name, value } = target;
234
- if (checked) {
235
- this.facetChecked(name, value);
363
+ facetUnchecked(key, value) {
364
+ const { selectedFacets } = this;
365
+ let newFacets;
366
+ if (selectedFacets) {
367
+ newFacets = {
368
+ ...selectedFacets,
369
+ };
236
370
  }
237
371
  else {
238
- this.facetUnchecked(name, value);
372
+ newFacets = defaultSelectedFacets;
239
373
  }
240
- const event = new CustomEvent('facetsChanged', {
241
- detail: this.selectedFacets,
242
- });
243
- this.dispatchEvent(event);
374
+ delete newFacets[key][value];
375
+ this.selectedFacets = newFacets;
244
376
  }
245
377
  /**
246
378
  * Parse the aggregate key title into the human readable title
@@ -266,12 +398,52 @@ let CollectionFacets = class CollectionFacets extends LitElement {
266
398
  opacity: 0.5;
267
399
  }
268
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
+
269
441
  h1 {
270
442
  font-size: 1.4rem;
271
443
  font-weight: 200;
272
444
  border-bottom: 1px solid rgb(232, 232, 232);
273
445
  padding-bottom: 3px;
274
- margin: 24px 0 14px 0;
446
+ margin: 0;
275
447
  }
276
448
 
277
449
  ul.facet-list {
@@ -286,15 +458,23 @@ let CollectionFacets = class CollectionFacets extends LitElement {
286
458
 
287
459
  .facet-checkbox {
288
460
  margin-right: 0.5rem;
461
+ display: flex;
462
+ align-items: center;
289
463
  }
290
464
 
291
465
  .facet-row {
292
466
  display: flex;
293
- align-items: center;
467
+ align-items: start;
294
468
  font-weight: 500;
295
469
  font-size: 1.2rem;
296
470
  }
297
471
 
472
+ .facet-info-display {
473
+ display: flex;
474
+ flex: 1;
475
+ cursor: pointer;
476
+ }
477
+
298
478
  .facet-title {
299
479
  flex: 1;
300
480
  }
@@ -302,6 +482,21 @@ let CollectionFacets = class CollectionFacets extends LitElement {
302
482
  .facet-count {
303
483
  margin-left: 0.5rem;
304
484
  }
485
+
486
+ .select-facet-checkbox {
487
+ cursor: pointer;
488
+ margin-right: 5px;
489
+ }
490
+
491
+ .hide-facet-checkbox {
492
+ display: none;
493
+ }
494
+
495
+ .hide-facet-icon {
496
+ width: 15px;
497
+ height: 15px;
498
+ cursor: pointer;
499
+ }
305
500
  `;
306
501
  }
307
502
  };
@@ -312,14 +507,35 @@ __decorate([
312
507
  property({ type: Object })
313
508
  ], CollectionFacets.prototype, "fullYearsHistogramAggregation", void 0);
314
509
  __decorate([
315
- property({ type: Object })
316
- ], CollectionFacets.prototype, "selectedFacets", void 0);
510
+ property({ type: String })
511
+ ], CollectionFacets.prototype, "minSelectedDate", void 0);
512
+ __decorate([
513
+ property({ type: String })
514
+ ], CollectionFacets.prototype, "maxSelectedDate", void 0);
317
515
  __decorate([
318
516
  property({ type: Boolean })
319
517
  ], CollectionFacets.prototype, "facetsLoading", void 0);
320
518
  __decorate([
321
519
  property({ type: Boolean })
322
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);
323
539
  CollectionFacets = __decorate([
324
540
  customElement('collection-facets')
325
541
  ], CollectionFacets);