@internetarchive/collection-browser 2.5.2 → 2.6.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 (308) hide show
  1. package/.editorconfig +29 -29
  2. package/.husky/pre-commit +4 -4
  3. package/LICENSE +661 -661
  4. package/README.md +83 -83
  5. package/dist/index.d.ts +12 -12
  6. package/dist/index.js +12 -12
  7. package/dist/src/app-root.d.ts +91 -91
  8. package/dist/src/app-root.js +487 -487
  9. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  10. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  11. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  12. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  13. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  14. package/dist/src/assets/img/icons/chevron.js +2 -2
  15. package/dist/src/assets/img/icons/contract.d.ts +2 -2
  16. package/dist/src/assets/img/icons/contract.js +2 -2
  17. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  18. package/dist/src/assets/img/icons/empty-query.js +2 -2
  19. package/dist/src/assets/img/icons/expand.d.ts +2 -2
  20. package/dist/src/assets/img/icons/expand.js +2 -2
  21. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  23. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  24. package/dist/src/assets/img/icons/eye.js +2 -2
  25. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  26. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  27. package/dist/src/assets/img/icons/favorite-unfilled.d.ts +1 -1
  28. package/dist/src/assets/img/icons/favorite-unfilled.js +2 -2
  29. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  30. package/dist/src/assets/img/icons/login-required.js +2 -2
  31. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  32. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  33. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  34. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  35. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  36. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  37. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  38. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  39. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  40. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  41. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  42. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  43. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  44. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  45. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/search.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  55. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  56. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  57. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  58. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  59. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  60. package/dist/src/assets/img/icons/null-result.js +2 -2
  61. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  62. package/dist/src/assets/img/icons/restricted.js +2 -2
  63. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  64. package/dist/src/assets/img/icons/reviews.js +2 -2
  65. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  66. package/dist/src/assets/img/icons/upload.js +2 -2
  67. package/dist/src/assets/img/icons/views.d.ts +1 -1
  68. package/dist/src/assets/img/icons/views.js +2 -2
  69. package/dist/src/circular-activity-indicator.d.ts +5 -5
  70. package/dist/src/circular-activity-indicator.js +17 -17
  71. package/dist/src/collection-browser.d.ts +564 -564
  72. package/dist/src/collection-browser.js +1579 -1569
  73. package/dist/src/collection-browser.js.map +1 -1
  74. package/dist/src/collection-facets/facet-row.d.ts +30 -30
  75. package/dist/src/collection-facets/facet-row.js +120 -117
  76. package/dist/src/collection-facets/facet-row.js.map +1 -1
  77. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  78. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  79. package/dist/src/collection-facets/facets-template.d.ts +13 -13
  80. package/dist/src/collection-facets/facets-template.js +45 -43
  81. package/dist/src/collection-facets/facets-template.js.map +1 -1
  82. package/dist/src/collection-facets/more-facets-content.d.ts +106 -106
  83. package/dist/src/collection-facets/more-facets-content.js +407 -407
  84. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  85. package/dist/src/collection-facets/more-facets-pagination.js +196 -196
  86. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  87. package/dist/src/collection-facets/toggle-switch.js +94 -94
  88. package/dist/src/collection-facets.d.ts +103 -103
  89. package/dist/src/collection-facets.js +534 -516
  90. package/dist/src/collection-facets.js.map +1 -1
  91. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +241 -241
  92. package/dist/src/data-source/collection-browser-data-source-interface.js +1 -1
  93. package/dist/src/data-source/collection-browser-data-source.d.ts +378 -378
  94. package/dist/src/data-source/collection-browser-data-source.js +984 -985
  95. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  96. package/dist/src/data-source/collection-browser-query-state.d.ts +43 -43
  97. package/dist/src/data-source/collection-browser-query-state.js +1 -1
  98. package/dist/src/data-source/models.d.ts +28 -28
  99. package/dist/src/data-source/models.js +8 -8
  100. package/dist/src/empty-placeholder.d.ts +23 -23
  101. package/dist/src/empty-placeholder.js +92 -79
  102. package/dist/src/empty-placeholder.js.map +1 -1
  103. package/dist/src/expanded-date-picker.d.ts +43 -43
  104. package/dist/src/expanded-date-picker.js +109 -109
  105. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  106. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  107. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  108. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  109. package/dist/src/manage/manage-bar.d.ts +30 -30
  110. package/dist/src/manage/manage-bar.js +61 -61
  111. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  112. package/dist/src/mediatype/mediatype-config.js +91 -91
  113. package/dist/src/models.d.ts +211 -209
  114. package/dist/src/models.js +381 -381
  115. package/dist/src/models.js.map +1 -1
  116. package/dist/src/restoration-state-handler.d.ts +70 -70
  117. package/dist/src/restoration-state-handler.js +357 -357
  118. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  119. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  120. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  121. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  122. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  123. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  124. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  125. package/dist/src/sort-filter-bar/img/list.js +2 -2
  126. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  127. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  128. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  129. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  130. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  131. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  132. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  133. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  134. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  135. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  136. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +223 -222
  137. package/dist/src/sort-filter-bar/sort-filter-bar.js +700 -696
  138. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  139. package/dist/src/styles/ia-button.d.ts +2 -2
  140. package/dist/src/styles/ia-button.js +16 -16
  141. package/dist/src/styles/item-image-styles.d.ts +8 -8
  142. package/dist/src/styles/item-image-styles.js +9 -9
  143. package/dist/src/styles/sr-only.d.ts +1 -1
  144. package/dist/src/styles/sr-only.js +2 -2
  145. package/dist/src/tiles/base-tile-component.d.ts +19 -19
  146. package/dist/src/tiles/base-tile-component.js +63 -63
  147. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  148. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  149. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  150. package/dist/src/tiles/grid/account-tile.js +72 -72
  151. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  152. package/dist/src/tiles/grid/collection-tile.js +80 -80
  153. package/dist/src/tiles/grid/item-tile.d.ts +30 -30
  154. package/dist/src/tiles/grid/item-tile.js +149 -149
  155. package/dist/src/tiles/grid/search-tile.d.ts +10 -10
  156. package/dist/src/tiles/grid/search-tile.js +51 -51
  157. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  158. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  159. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  160. package/dist/src/tiles/grid/tile-stats.js +53 -53
  161. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  162. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  163. package/dist/src/tiles/hover/tile-hover-pane.d.ts +18 -18
  164. package/dist/src/tiles/hover/tile-hover-pane.js +69 -69
  165. package/dist/src/tiles/image-block.d.ts +17 -17
  166. package/dist/src/tiles/image-block.js +73 -73
  167. package/dist/src/tiles/item-image.d.ts +39 -39
  168. package/dist/src/tiles/item-image.js +154 -154
  169. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  170. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  171. package/dist/src/tiles/list/tile-list-compact.d.ts +15 -15
  172. package/dist/src/tiles/list/tile-list-compact.js +114 -114
  173. package/dist/src/tiles/list/tile-list.d.ts +50 -50
  174. package/dist/src/tiles/list/tile-list.js +315 -315
  175. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  176. package/dist/src/tiles/mediatype-icon.js +47 -47
  177. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  178. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  179. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  180. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  181. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  182. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  183. package/dist/src/tiles/review-block.d.ts +12 -12
  184. package/dist/src/tiles/review-block.js +56 -56
  185. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  186. package/dist/src/tiles/text-snippet-block.js +73 -73
  187. package/dist/src/tiles/tile-dispatcher.d.ts +64 -64
  188. package/dist/src/tiles/tile-dispatcher.js +229 -229
  189. package/dist/src/tiles/tile-display-value-provider.d.ts +47 -47
  190. package/dist/src/tiles/tile-display-value-provider.js +94 -94
  191. package/dist/src/utils/analytics-events.d.ts +28 -28
  192. package/dist/src/utils/analytics-events.js +30 -30
  193. package/dist/src/utils/array-equals.d.ts +4 -4
  194. package/dist/src/utils/array-equals.js +10 -10
  195. package/dist/src/utils/collapse-repeated-quotes.d.ts +11 -11
  196. package/dist/src/utils/collapse-repeated-quotes.js +13 -13
  197. package/dist/src/utils/facet-utils.d.ts +83 -83
  198. package/dist/src/utils/facet-utils.js +145 -145
  199. package/dist/src/utils/format-count.d.ts +7 -7
  200. package/dist/src/utils/format-count.js +76 -76
  201. package/dist/src/utils/format-date.d.ts +2 -2
  202. package/dist/src/utils/format-date.js +25 -25
  203. package/dist/src/utils/format-unit-size.d.ts +2 -2
  204. package/dist/src/utils/format-unit-size.js +33 -33
  205. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  206. package/dist/src/utils/local-date-from-utc.js +15 -15
  207. package/dist/src/utils/log.d.ts +7 -7
  208. package/dist/src/utils/log.js +15 -15
  209. package/dist/src/utils/resolve-mediatype.d.ts +8 -8
  210. package/dist/src/utils/resolve-mediatype.js +23 -23
  211. package/dist/src/utils/sha1.d.ts +2 -2
  212. package/dist/src/utils/sha1.js +8 -8
  213. package/dist/test/collection-browser.test.d.ts +1 -1
  214. package/dist/test/collection-browser.test.js +1294 -1294
  215. package/dist/test/collection-facets/facet-row.test.d.ts +1 -1
  216. package/dist/test/collection-facets/facet-row.test.js +227 -227
  217. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  218. package/dist/test/collection-facets/facets-template.test.js +91 -91
  219. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  220. package/dist/test/collection-facets/more-facets-content.test.js +141 -141
  221. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  222. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  223. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  224. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  225. package/dist/test/collection-facets.test.d.ts +2 -2
  226. package/dist/test/collection-facets.test.js +652 -652
  227. package/dist/test/data-source/collection-browser-data-source.test.d.ts +1 -1
  228. package/dist/test/data-source/collection-browser-data-source.test.js +89 -89
  229. package/dist/test/empty-placeholder.test.d.ts +1 -1
  230. package/dist/test/empty-placeholder.test.js +63 -63
  231. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  232. package/dist/test/expanded-date-picker.test.js +95 -95
  233. package/dist/test/icon-overlay.test.d.ts +1 -1
  234. package/dist/test/icon-overlay.test.js +24 -24
  235. package/dist/test/image-block.test.d.ts +1 -1
  236. package/dist/test/image-block.test.js +48 -48
  237. package/dist/test/item-image.test.d.ts +1 -1
  238. package/dist/test/item-image.test.js +85 -85
  239. package/dist/test/manage/manage-bar.test.d.ts +1 -1
  240. package/dist/test/manage/manage-bar.test.js +81 -81
  241. package/dist/test/mediatype-config.test.d.ts +1 -1
  242. package/dist/test/mediatype-config.test.js +16 -16
  243. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  244. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  245. package/dist/test/mocks/mock-search-responses.d.ts +25 -25
  246. package/dist/test/mocks/mock-search-responses.js +942 -942
  247. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  248. package/dist/test/mocks/mock-search-service.js +54 -54
  249. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  250. package/dist/test/restoration-state-handler.test.js +270 -270
  251. package/dist/test/review-block.test.d.ts +1 -1
  252. package/dist/test/review-block.test.js +44 -44
  253. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  254. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  255. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  256. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  257. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  258. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +426 -426
  259. package/dist/test/text-overlay.test.d.ts +1 -1
  260. package/dist/test/text-overlay.test.js +48 -48
  261. package/dist/test/text-snippet-block.test.d.ts +1 -1
  262. package/dist/test/text-snippet-block.test.js +57 -57
  263. package/dist/test/tile-stats.test.d.ts +1 -1
  264. package/dist/test/tile-stats.test.js +81 -81
  265. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  266. package/dist/test/tiles/grid/account-tile.test.js +76 -76
  267. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  268. package/dist/test/tiles/grid/collection-tile.test.js +73 -73
  269. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  270. package/dist/test/tiles/grid/item-tile.test.js +312 -312
  271. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -1
  272. package/dist/test/tiles/grid/search-tile.test.js +51 -51
  273. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  274. package/dist/test/tiles/hover/hover-pane-controller.test.js +259 -259
  275. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  276. package/dist/test/tiles/hover/tile-hover-pane.test.js +56 -56
  277. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  278. package/dist/test/tiles/list/tile-list-compact.test.js +143 -143
  279. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  280. package/dist/test/tiles/list/tile-list.test.js +297 -297
  281. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  282. package/dist/test/tiles/tile-dispatcher.test.js +100 -100
  283. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  284. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  285. package/dist/test/utils/array-equals.test.d.ts +1 -1
  286. package/dist/test/utils/array-equals.test.js +26 -26
  287. package/dist/test/utils/format-count.test.d.ts +1 -1
  288. package/dist/test/utils/format-count.test.js +23 -23
  289. package/dist/test/utils/format-date.test.d.ts +1 -1
  290. package/dist/test/utils/format-date.test.js +17 -17
  291. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  292. package/dist/test/utils/format-unit-size.test.js +17 -17
  293. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  294. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  295. package/local.archive.org.cert +86 -86
  296. package/local.archive.org.key +27 -27
  297. package/package.json +1 -1
  298. package/renovate.json +6 -6
  299. package/src/collection-browser.ts +26 -10
  300. package/src/collection-facets/facet-row.ts +3 -0
  301. package/src/collection-facets/facets-template.ts +3 -1
  302. package/src/collection-facets.ts +20 -2
  303. package/src/data-source/collection-browser-data-source.ts +1 -5
  304. package/src/empty-placeholder.ts +18 -5
  305. package/src/models.ts +8 -1
  306. package/src/sort-filter-bar/sort-filter-bar.ts +4 -0
  307. package/web-dev-server.config.mjs +30 -30
  308. package/web-test-runner.config.mjs +41 -41
@@ -1,111 +1,120 @@
1
- import { __decorate } from "tslib";
2
- /* eslint-disable import/no-duplicates */
3
- import { css, html, LitElement, nothing, } from 'lit';
4
- import { customElement, property, state } from 'lit/decorators.js';
5
- import { map } from 'lit/directives/map.js';
6
- import { ref } from 'lit/directives/ref.js';
7
- import { msg } from '@lit/localize';
8
- import { classMap } from 'lit/directives/class-map.js';
9
- import '@internetarchive/histogram-date-range';
10
- import '@internetarchive/feature-feedback';
11
- import { ModalConfig, } from '@internetarchive/modal-manager';
12
- import chevronIcon from './assets/img/icons/chevron';
13
- import expandIcon from './assets/img/icons/expand';
14
- import { facetDisplayOrder, facetTitles, lendingFacetDisplayNames, lendingFacetKeysVisibility, suppressedCollections, defaultFacetSort, } from './models';
15
- import './collection-facets/more-facets-content';
16
- import './collection-facets/facets-template';
17
- import './collection-facets/facet-tombstone-row';
18
- import './expanded-date-picker';
19
- import { analyticsActions, analyticsCategories, } from './utils/analytics-events';
20
- import { srOnlyStyle } from './styles/sr-only';
21
- import { ExpandedDatePicker } from './expanded-date-picker';
22
- import { sortBucketsBySelectionState, updateSelectedFacetBucket, } from './utils/facet-utils';
23
- let CollectionFacets = class CollectionFacets extends LitElement {
24
- constructor() {
25
- super(...arguments);
26
- this.moreLinksVisible = true;
27
- this.facetsLoading = false;
28
- this.fullYearAggregationLoading = false;
29
- this.collapsableFacets = false;
30
- this.showHistogramDatePicker = false;
31
- this.allowExpandingDatePicker = false;
32
- this.parentCollections = [];
33
- this.collectionPagePath = '/details/';
34
- this.isManageView = false;
35
- this.openFacets = {
36
- subject: false,
37
- lending: false,
38
- mediatype: false,
39
- language: false,
40
- creator: false,
41
- collection: false,
42
- year: false,
43
- };
44
- /**
45
- * Maximum # of facet buckets to render per facet group
46
- */
47
- this.allowedFacetCount = 6;
48
- this.handleExpandedDatePickerClosed = () => {
49
- var _a;
50
- (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.remove('expanded-date-picker');
51
- };
52
- /**
53
- * Dispatches a `histogramDateRangeUpdated` event with the date range copied from the
54
- * input event.
55
- *
56
- * Arrow function to ensure `this` is always bound to the current component.
57
- */
58
- this.histogramDateRangeUpdated = (e) => {
59
- const { minDate, maxDate } = e.detail;
60
- const event = new CustomEvent('histogramDateRangeUpdated', {
61
- detail: { minDate, maxDate },
62
- });
63
- this.dispatchEvent(event);
64
- };
65
- }
66
- render() {
67
- const containerClasses = classMap({
68
- loading: this.facetsLoading,
69
- managing: this.isManageView,
70
- });
71
- const datePickerLabelId = 'date-picker-label';
1
+ import { __decorate } from "tslib";
2
+ /* eslint-disable import/no-duplicates */
3
+ import { css, html, LitElement, nothing, } from 'lit';
4
+ import { customElement, property, state } from 'lit/decorators.js';
5
+ import { map } from 'lit/directives/map.js';
6
+ import { ref } from 'lit/directives/ref.js';
7
+ import { msg } from '@lit/localize';
8
+ import { classMap } from 'lit/directives/class-map.js';
9
+ import '@internetarchive/histogram-date-range';
10
+ import '@internetarchive/feature-feedback';
11
+ import { ModalConfig, } from '@internetarchive/modal-manager';
12
+ import chevronIcon from './assets/img/icons/chevron';
13
+ import expandIcon from './assets/img/icons/expand';
14
+ import { facetDisplayOrder, facetTitles, lendingFacetDisplayNames, lendingFacetKeysVisibility, suppressedCollections, defaultFacetSort, } from './models';
15
+ import './collection-facets/more-facets-content';
16
+ import './collection-facets/facets-template';
17
+ import './collection-facets/facet-tombstone-row';
18
+ import './expanded-date-picker';
19
+ import { analyticsActions, analyticsCategories, } from './utils/analytics-events';
20
+ import { srOnlyStyle } from './styles/sr-only';
21
+ import { ExpandedDatePicker } from './expanded-date-picker';
22
+ import { sortBucketsBySelectionState, updateSelectedFacetBucket, } from './utils/facet-utils';
23
+ let CollectionFacets = class CollectionFacets extends LitElement {
24
+ constructor() {
25
+ super(...arguments);
26
+ this.moreLinksVisible = true;
27
+ this.facetsLoading = false;
28
+ this.fullYearAggregationLoading = false;
29
+ this.collapsableFacets = false;
30
+ this.showHistogramDatePicker = false;
31
+ this.allowExpandingDatePicker = false;
32
+ this.parentCollections = [];
33
+ this.collectionPagePath = '/details/';
34
+ this.isManageView = false;
35
+ this.openFacets = {
36
+ subject: false,
37
+ lending: false,
38
+ mediatype: false,
39
+ language: false,
40
+ creator: false,
41
+ collection: false,
42
+ year: false,
43
+ };
44
+ /**
45
+ * Maximum # of facet buckets to render per facet group
46
+ */
47
+ this.allowedFacetCount = 6;
48
+ this.handleExpandedDatePickerClosed = () => {
49
+ var _a;
50
+ (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.remove('expanded-date-picker');
51
+ };
52
+ /**
53
+ * Dispatches a `histogramDateRangeUpdated` event with the date range copied from the
54
+ * input event.
55
+ *
56
+ * Arrow function to ensure `this` is always bound to the current component.
57
+ */
58
+ this.histogramDateRangeUpdated = (e) => {
59
+ const { minDate, maxDate } = e.detail;
60
+ const event = new CustomEvent('histogramDateRangeUpdated', {
61
+ detail: { minDate, maxDate },
62
+ });
63
+ this.dispatchEvent(event);
64
+ };
65
+ }
66
+ render() {
67
+ const containerClasses = classMap({
68
+ loading: this.facetsLoading,
69
+ managing: this.isManageView,
70
+ });
71
+ // Added data-testid for Playwright testing
72
+ // Using facet-group class and aria-labels is not ideal for Playwright locator
73
+ const datePickerLabelId = 'date-picker-label';
72
74
  return html `
73
75
  <div id="container" class=${containerClasses}>
74
- ${this.showHistogramDatePicker &&
75
- (this.fullYearsHistogramAggregation || this.fullYearAggregationLoading)
76
+ ${this.showHistogramDatePicker &&
77
+ (this.fullYearsHistogramAggregation || this.fullYearAggregationLoading)
76
78
  ? html `
77
- <section class="facet-group" aria-labelledby=${datePickerLabelId}>
79
+ <section
80
+ class="facet-group"
81
+ aria-labelledby=${datePickerLabelId}
82
+ data-testid="facet-group-header-label-date-picker"
83
+ >
78
84
  <h3 id=${datePickerLabelId}>
79
85
  Year Published <span class="sr-only">range filter</span>
80
86
  ${this.expandDatePickerBtnTemplate}
81
87
  </h3>
82
88
  ${this.histogramTemplate}
83
89
  </section>
84
- `
90
+ `
85
91
  : nothing}
86
92
  ${this.collectionPartOfTemplate}
87
93
  ${this.mergedFacets.map(facetGroup => this.getFacetGroupTemplate(facetGroup))}
88
94
  </div>
89
- `;
90
- }
91
- get collectionPartOfTemplate() {
92
- var _a;
93
- // We only display the "Part Of" section on collection pages
94
- if (!((_a = this.parentCollections) === null || _a === void 0 ? void 0 : _a.length))
95
- return nothing;
96
- const headingId = 'partof-heading';
95
+ `;
96
+ }
97
+ get collectionPartOfTemplate() {
98
+ var _a;
99
+ // We only display the "Part Of" section on collection pages
100
+ if (!((_a = this.parentCollections) === null || _a === void 0 ? void 0 : _a.length))
101
+ return nothing;
102
+ // Added data-testid for Playwright testing
103
+ // Using className and aria-labels is not ideal for Playwright locator
104
+ const headingId = 'partof-heading';
97
105
  return html `
98
106
  <section
99
107
  class="facet-group partof-collections"
100
108
  aria-labelledby=${headingId}
109
+ data-testid="facet-group-partof-collections"
101
110
  >
102
111
  <div class="facet-group-header">
103
112
  <h3 id=${headingId}>${msg('Part Of')}</h3>
104
113
  </div>
105
114
  <ul>
106
- ${map(this.parentCollections, collxn => {
107
- var _a, _b;
108
- const collectionURL = `${this.baseNavigationUrl}${this.collectionPagePath}${collxn}`;
115
+ ${map(this.parentCollections, collxn => {
116
+ var _a, _b;
117
+ const collectionURL = `${this.baseNavigationUrl}${this.collectionPagePath}${collxn}`;
109
118
  return html ` <li>
110
119
  <a
111
120
  href=${collectionURL}
@@ -114,44 +123,44 @@ let CollectionFacets = class CollectionFacets extends LitElement {
114
123
  >
115
124
  ${(_b = (_a = this.collectionTitles) === null || _a === void 0 ? void 0 : _a.get(collxn)) !== null && _b !== void 0 ? _b : collxn}
116
125
  </a>
117
- </li>`;
126
+ </li>`;
118
127
  })}
119
128
  </ul>
120
129
  </section>
121
- `;
122
- }
123
- partOfCollectionClicked(e) {
124
- var _a;
125
- (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEvent({
126
- category: analyticsCategories.default,
127
- action: analyticsActions.partOfCollectionClicked,
128
- label: e.target.dataset.id,
129
- });
130
- }
131
- /**
132
- * Opens a modal dialog containing an enlarged version of the date picker.
133
- */
134
- showDatePickerModal() {
135
- var _a, _b, _c;
136
- const { fullYearsHistogramAggregation } = this;
137
- const minDate = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key;
138
- const maxDate = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key;
139
- const buckets = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.buckets;
140
- // Because the modal manager does not clear its DOM content after being closed,
141
- // it may try to render the exact same date picker template when it is reopened.
142
- // And because it isn't actually a descendent of this collection-facets component,
143
- // changes to the template defined here may not trigger a reactive update to the date
144
- // picker, resulting in it displaying a stale date range.
145
- // This ref callback ensures that every time the date picker modal is opened, it will
146
- // always propagate the most recent date range into the date picker regardless of
147
- // whether Lit thinks the update is necessary.
148
- const expandedDatePickerChanged = (elmt) => {
149
- if (elmt && elmt instanceof ExpandedDatePicker) {
150
- const expandedDatePicker = elmt;
151
- expandedDatePicker.minSelectedDate = this.minSelectedDate;
152
- expandedDatePicker.maxSelectedDate = this.maxSelectedDate;
153
- }
154
- };
130
+ `;
131
+ }
132
+ partOfCollectionClicked(e) {
133
+ var _a;
134
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEvent({
135
+ category: analyticsCategories.default,
136
+ action: analyticsActions.partOfCollectionClicked,
137
+ label: e.target.dataset.id,
138
+ });
139
+ }
140
+ /**
141
+ * Opens a modal dialog containing an enlarged version of the date picker.
142
+ */
143
+ showDatePickerModal() {
144
+ var _a, _b, _c;
145
+ const { fullYearsHistogramAggregation } = this;
146
+ const minDate = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key;
147
+ const maxDate = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key;
148
+ const buckets = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.buckets;
149
+ // Because the modal manager does not clear its DOM content after being closed,
150
+ // it may try to render the exact same date picker template when it is reopened.
151
+ // And because it isn't actually a descendent of this collection-facets component,
152
+ // changes to the template defined here may not trigger a reactive update to the date
153
+ // picker, resulting in it displaying a stale date range.
154
+ // This ref callback ensures that every time the date picker modal is opened, it will
155
+ // always propagate the most recent date range into the date picker regardless of
156
+ // whether Lit thinks the update is necessary.
157
+ const expandedDatePickerChanged = (elmt) => {
158
+ if (elmt && elmt instanceof ExpandedDatePicker) {
159
+ const expandedDatePicker = elmt;
160
+ expandedDatePicker.minSelectedDate = this.minSelectedDate;
161
+ expandedDatePicker.maxSelectedDate = this.maxSelectedDate;
162
+ }
163
+ };
155
164
  const customModalContent = html `
156
165
  <expanded-date-picker
157
166
  ${ref(expandedDatePickerChanged)}
@@ -165,60 +174,60 @@ let CollectionFacets = class CollectionFacets extends LitElement {
165
174
  @histogramDateRangeApplied=${this.histogramDateRangeUpdated}
166
175
  @modalClosed=${this.handleExpandedDatePickerClosed}
167
176
  ></expanded-date-picker>
168
- `;
169
- const config = new ModalConfig({
170
- bodyColor: '#fff',
171
- headerColor: '#194880',
172
- showHeaderLogo: false,
173
- closeOnBackdropClick: true,
174
- title: html `Select a date range`,
175
- });
176
- (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.add('expanded-date-picker');
177
- (_b = this.modalManager) === null || _b === void 0 ? void 0 : _b.showModal({
178
- config,
179
- customModalContent,
180
- userClosedModalCallback: this.handleExpandedDatePickerClosed,
181
- });
182
- (_c = this.analyticsHandler) === null || _c === void 0 ? void 0 : _c.sendEvent({
183
- category: analyticsCategories.default,
184
- action: analyticsActions.histogramExpanded,
185
- label: window.location.href,
186
- });
187
- }
188
- updated(changed) {
189
- if (changed.has('selectedFacets')) {
190
- this.dispatchFacetsChangedEvent();
191
- }
192
- }
193
- // TODO: want to fire analytics?
194
- dispatchFacetsChangedEvent() {
195
- const event = new CustomEvent('facetsChanged', {
196
- detail: this.selectedFacets,
197
- });
198
- this.dispatchEvent(event);
199
- }
200
- /**
201
- * Template for the "Expand" button to show the date picker modal, or
202
- * `nothing` if that button should currently not be shown.
203
- */
204
- get expandDatePickerBtnTemplate() {
205
- return this.allowExpandingDatePicker && !this.facetsLoading
177
+ `;
178
+ const config = new ModalConfig({
179
+ bodyColor: '#fff',
180
+ headerColor: '#194880',
181
+ showHeaderLogo: false,
182
+ closeOnBackdropClick: true,
183
+ title: html `Select a date range`,
184
+ });
185
+ (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.add('expanded-date-picker');
186
+ (_b = this.modalManager) === null || _b === void 0 ? void 0 : _b.showModal({
187
+ config,
188
+ customModalContent,
189
+ userClosedModalCallback: this.handleExpandedDatePickerClosed,
190
+ });
191
+ (_c = this.analyticsHandler) === null || _c === void 0 ? void 0 : _c.sendEvent({
192
+ category: analyticsCategories.default,
193
+ action: analyticsActions.histogramExpanded,
194
+ label: window.location.href,
195
+ });
196
+ }
197
+ updated(changed) {
198
+ if (changed.has('selectedFacets')) {
199
+ this.dispatchFacetsChangedEvent();
200
+ }
201
+ }
202
+ // TODO: want to fire analytics?
203
+ dispatchFacetsChangedEvent() {
204
+ const event = new CustomEvent('facetsChanged', {
205
+ detail: this.selectedFacets,
206
+ });
207
+ this.dispatchEvent(event);
208
+ }
209
+ /**
210
+ * Template for the "Expand" button to show the date picker modal, or
211
+ * `nothing` if that button should currently not be shown.
212
+ */
213
+ get expandDatePickerBtnTemplate() {
214
+ return this.allowExpandingDatePicker && !this.facetsLoading
206
215
  ? html `<button
207
216
  class="expand-date-picker-btn"
208
217
  aria-hidden="true"
209
218
  @click=${this.showDatePickerModal}
210
219
  >
211
220
  ${expandIcon}
212
- </button>`
213
- : nothing;
214
- }
215
- get histogramTemplate() {
216
- var _a, _b;
217
- const { fullYearsHistogramAggregation } = this;
218
- const minDate = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key;
219
- const maxDate = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key;
220
- return this.fullYearAggregationLoading
221
- ? html `<div class="histogram-loading-indicator">&hellip;</div>` // Ellipsis block
221
+ </button>`
222
+ : nothing;
223
+ }
224
+ get histogramTemplate() {
225
+ var _a, _b;
226
+ const { fullYearsHistogramAggregation } = this;
227
+ const minDate = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key;
228
+ const maxDate = fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key;
229
+ return this.fullYearAggregationLoading
230
+ ? html `<div class="histogram-loading-indicator">&hellip;</div>` // Ellipsis block
222
231
  : html `
223
232
  <histogram-date-range
224
233
  .minDate=${minDate}
@@ -227,187 +236,190 @@ let CollectionFacets = class CollectionFacets extends LitElement {
227
236
  .maxSelectedDate=${(_b = this.maxSelectedDate) !== null && _b !== void 0 ? _b : maxDate}
228
237
  .updateDelay=${100}
229
238
  missingDataMessage="..."
230
- .width=${this.collapsableFacets && this.contentWidth
231
- ? this.contentWidth
239
+ .width=${this.collapsableFacets && this.contentWidth
240
+ ? this.contentWidth
232
241
  : 180}
233
242
  .bins=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.buckets}
234
243
  @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
235
244
  ></histogram-date-range>
236
- `;
237
- }
238
- /**
239
- * Combines the selected facets with the aggregations to create a single list of facets
240
- */
241
- get mergedFacets() {
242
- const facetGroups = [];
243
- facetDisplayOrder.forEach(facetKey => {
244
- var _a, _b;
245
- const selectedFacetGroup = this.selectedFacetGroups.find(group => group.key === facetKey);
246
- const aggregateFacetGroup = this.aggregationFacetGroups.find(group => group.key === facetKey);
247
- // if the user selected a facet, but it's not in the aggregation, we add it as-is
248
- if (selectedFacetGroup && !aggregateFacetGroup) {
249
- facetGroups.push(selectedFacetGroup);
250
- return;
251
- }
252
- // if we don't have an aggregate facet group, don't add this to the list
253
- if (!aggregateFacetGroup)
254
- return;
255
- // start with either the selected group if we have one, or the aggregate group
256
- const facetGroup = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : aggregateFacetGroup;
257
- // attach the counts to the selected buckets
258
- let bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
259
- const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
260
- return selectedBucket
261
- ? {
262
- ...bucket,
263
- count: selectedBucket.count,
264
- }
265
- : bucket;
266
- })) !== null && _a !== void 0 ? _a : [];
267
- // append any additional buckets that were not selected
268
- aggregateFacetGroup.buckets.forEach(bucket => {
269
- const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);
270
- if (existingBucket)
271
- return;
272
- bucketsWithCount.push(bucket);
273
- });
274
- /**
275
- * render limited facet items on page facet area
276
- *
277
- * - by-default we are showing 6 items
278
- * - additionally want to show all items (selected/suppressed) in page facet area
279
- */
280
- let allowedFacetCount = (_b = Object.keys((selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets) || [])) === null || _b === void 0 ? void 0 : _b.length;
281
- if (allowedFacetCount < this.allowedFacetCount) {
282
- allowedFacetCount = this.allowedFacetCount; // splice start index from 0th
283
- }
284
- // For lending facets, only include a specific subset of buckets
285
- if (facetKey === 'lending') {
286
- bucketsWithCount = bucketsWithCount.filter(bucket => lendingFacetKeysVisibility[bucket.key]);
287
- }
288
- // Sort the FacetBuckets so that selected and hidden buckets come before the rest
289
- sortBucketsBySelectionState(bucketsWithCount);
290
- // For mediatype facets, ensure the collection bucket is always shown if present
291
- if (facetKey === 'mediatype') {
292
- const collectionIndex = bucketsWithCount.findIndex(bucket => bucket.key === 'collection');
293
- if (collectionIndex >= allowedFacetCount) {
294
- const [collectionBucket] = bucketsWithCount.splice(collectionIndex, 1);
295
- // If we're showing lots of selected facets, ensure we're not cutting off the last one
296
- if (allowedFacetCount > this.allowedFacetCount) {
297
- allowedFacetCount += 1;
298
- }
299
- bucketsWithCount.splice(allowedFacetCount - 1, 0, collectionBucket);
300
- }
301
- }
302
- // slice off how many items we want to show in page facet area
303
- facetGroup.buckets = bucketsWithCount.slice(0, allowedFacetCount);
304
- facetGroups.push(facetGroup);
305
- });
306
- return facetGroups;
307
- }
308
- /**
309
- * Converts the selected facets to a `FacetGroup` array,
310
- * which is easier to work with
311
- */
312
- get selectedFacetGroups() {
313
- if (!this.selectedFacets)
314
- return [];
315
- const facetGroups = Object.entries(this.selectedFacets).map(([key, selectedFacets]) => {
316
- const option = key;
317
- const title = facetTitles[option];
318
- const buckets = Object.entries(selectedFacets).map(([value, facetData]) => {
319
- var _a;
320
- let displayText = value;
321
- // for lending facets, convert the key to a readable format
322
- if (option === 'lending') {
323
- displayText =
324
- (_a = lendingFacetDisplayNames[value]) !== null && _a !== void 0 ? _a : value;
325
- }
326
- return {
327
- displayText,
328
- key: value,
329
- count: facetData.count,
330
- state: facetData.state,
331
- };
332
- });
333
- return {
334
- title,
335
- key: option,
336
- buckets,
337
- };
338
- });
339
- return facetGroups;
340
- }
341
- /**
342
- * Converts the raw `aggregations` to `FacetGroups`, which are easier to use
343
- */
344
- get aggregationFacetGroups() {
345
- var _a;
346
- const facetGroups = [];
347
- Object.entries((_a = this.aggregations) !== null && _a !== void 0 ? _a : []).forEach(([key, aggregation]) => {
348
- // the year_histogram data is in a different format so can't be handled here
349
- if (key === 'year_histogram')
350
- return;
351
- const option = key;
352
- const title = facetTitles[option];
353
- if (!title)
354
- return;
355
- let castedBuckets = aggregation.getSortedBuckets(defaultFacetSort[option]);
356
- if (option === 'collection') {
357
- // we are not showing fav- collections or certain deemphasized collections in facets
358
- castedBuckets = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.filter(bucket => {
359
- var _a;
360
- const bucketKey = (_a = bucket === null || bucket === void 0 ? void 0 : bucket.key) === null || _a === void 0 ? void 0 : _a.toString();
361
- return (!suppressedCollections[bucketKey] && !(bucketKey === null || bucketKey === void 0 ? void 0 : bucketKey.startsWith('fav-')));
362
- });
363
- }
364
- const facetBuckets = castedBuckets.map(bucket => {
365
- var _a;
366
- const bucketKey = bucket.key;
367
- let displayText = `${bucket.key}`;
368
- // for lending facets, convert the bucket key to a readable format
369
- if (option === 'lending') {
370
- displayText =
371
- (_a = lendingFacetDisplayNames[bucket.key]) !== null && _a !== void 0 ? _a : `${bucket.key}`;
372
- }
373
- return {
374
- displayText,
375
- key: `${bucketKey}`,
376
- count: bucket.doc_count,
377
- state: 'none',
378
- };
379
- });
380
- const group = {
381
- title,
382
- key: option,
383
- buckets: facetBuckets,
384
- };
385
- facetGroups.push(group);
386
- });
387
- return facetGroups;
388
- }
389
- /**
390
- * Generate the template for a facet group with a header and the collapsible
391
- * chevron for the mobile view
392
- */
393
- getFacetGroupTemplate(facetGroup) {
394
- if (!this.facetsLoading && facetGroup.buckets.length === 0)
395
- return nothing;
396
- const { key } = facetGroup;
397
- const isOpen = this.openFacets[key];
245
+ `;
246
+ }
247
+ /**
248
+ * Combines the selected facets with the aggregations to create a single list of facets
249
+ */
250
+ get mergedFacets() {
251
+ const facetGroups = [];
252
+ facetDisplayOrder.forEach(facetKey => {
253
+ var _a, _b;
254
+ const selectedFacetGroup = this.selectedFacetGroups.find(group => group.key === facetKey);
255
+ const aggregateFacetGroup = this.aggregationFacetGroups.find(group => group.key === facetKey);
256
+ // if the user selected a facet, but it's not in the aggregation, we add it as-is
257
+ if (selectedFacetGroup && !aggregateFacetGroup) {
258
+ facetGroups.push(selectedFacetGroup);
259
+ return;
260
+ }
261
+ // if we don't have an aggregate facet group, don't add this to the list
262
+ if (!aggregateFacetGroup)
263
+ return;
264
+ // start with either the selected group if we have one, or the aggregate group
265
+ const facetGroup = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : aggregateFacetGroup;
266
+ // attach the counts to the selected buckets
267
+ let bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
268
+ const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
269
+ return selectedBucket
270
+ ? {
271
+ ...bucket,
272
+ count: selectedBucket.count,
273
+ }
274
+ : bucket;
275
+ })) !== null && _a !== void 0 ? _a : [];
276
+ // append any additional buckets that were not selected
277
+ aggregateFacetGroup.buckets.forEach(bucket => {
278
+ const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);
279
+ if (existingBucket)
280
+ return;
281
+ bucketsWithCount.push(bucket);
282
+ });
283
+ /**
284
+ * render limited facet items on page facet area
285
+ *
286
+ * - by-default we are showing 6 items
287
+ * - additionally want to show all items (selected/suppressed) in page facet area
288
+ */
289
+ let allowedFacetCount = (_b = Object.keys((selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets) || [])) === null || _b === void 0 ? void 0 : _b.length;
290
+ if (allowedFacetCount < this.allowedFacetCount) {
291
+ allowedFacetCount = this.allowedFacetCount; // splice start index from 0th
292
+ }
293
+ // For lending facets, only include a specific subset of buckets
294
+ if (facetKey === 'lending') {
295
+ bucketsWithCount = bucketsWithCount.filter(bucket => lendingFacetKeysVisibility[bucket.key]);
296
+ }
297
+ // Sort the FacetBuckets so that selected and hidden buckets come before the rest
298
+ sortBucketsBySelectionState(bucketsWithCount);
299
+ // For mediatype facets, ensure the collection bucket is always shown if present
300
+ if (facetKey === 'mediatype') {
301
+ const collectionIndex = bucketsWithCount.findIndex(bucket => bucket.key === 'collection');
302
+ if (collectionIndex >= allowedFacetCount) {
303
+ const [collectionBucket] = bucketsWithCount.splice(collectionIndex, 1);
304
+ // If we're showing lots of selected facets, ensure we're not cutting off the last one
305
+ if (allowedFacetCount > this.allowedFacetCount) {
306
+ allowedFacetCount += 1;
307
+ }
308
+ bucketsWithCount.splice(allowedFacetCount - 1, 0, collectionBucket);
309
+ }
310
+ }
311
+ // slice off how many items we want to show in page facet area
312
+ facetGroup.buckets = bucketsWithCount.slice(0, allowedFacetCount);
313
+ facetGroups.push(facetGroup);
314
+ });
315
+ return facetGroups;
316
+ }
317
+ /**
318
+ * Converts the selected facets to a `FacetGroup` array,
319
+ * which is easier to work with
320
+ */
321
+ get selectedFacetGroups() {
322
+ if (!this.selectedFacets)
323
+ return [];
324
+ const facetGroups = Object.entries(this.selectedFacets).map(([key, selectedFacets]) => {
325
+ const option = key;
326
+ const title = facetTitles[option];
327
+ const buckets = Object.entries(selectedFacets).map(([value, facetData]) => {
328
+ var _a;
329
+ let displayText = value;
330
+ // for lending facets, convert the key to a readable format
331
+ if (option === 'lending') {
332
+ displayText =
333
+ (_a = lendingFacetDisplayNames[value]) !== null && _a !== void 0 ? _a : value;
334
+ }
335
+ return {
336
+ displayText,
337
+ key: value,
338
+ count: facetData.count,
339
+ state: facetData.state,
340
+ };
341
+ });
342
+ return {
343
+ title,
344
+ key: option,
345
+ buckets,
346
+ };
347
+ });
348
+ return facetGroups;
349
+ }
350
+ /**
351
+ * Converts the raw `aggregations` to `FacetGroups`, which are easier to use
352
+ */
353
+ get aggregationFacetGroups() {
354
+ var _a;
355
+ const facetGroups = [];
356
+ Object.entries((_a = this.aggregations) !== null && _a !== void 0 ? _a : []).forEach(([key, aggregation]) => {
357
+ // the year_histogram data is in a different format so can't be handled here
358
+ if (key === 'year_histogram')
359
+ return;
360
+ const option = key;
361
+ const title = facetTitles[option];
362
+ if (!title)
363
+ return;
364
+ let castedBuckets = aggregation.getSortedBuckets(defaultFacetSort[option]);
365
+ if (option === 'collection') {
366
+ // we are not showing fav- collections or certain deemphasized collections in facets
367
+ castedBuckets = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.filter(bucket => {
368
+ var _a;
369
+ const bucketKey = (_a = bucket === null || bucket === void 0 ? void 0 : bucket.key) === null || _a === void 0 ? void 0 : _a.toString();
370
+ return (!suppressedCollections[bucketKey] && !(bucketKey === null || bucketKey === void 0 ? void 0 : bucketKey.startsWith('fav-')));
371
+ });
372
+ }
373
+ const facetBuckets = castedBuckets.map(bucket => {
374
+ var _a;
375
+ const bucketKey = bucket.key;
376
+ let displayText = `${bucket.key}`;
377
+ // for lending facets, convert the bucket key to a readable format
378
+ if (option === 'lending') {
379
+ displayText =
380
+ (_a = lendingFacetDisplayNames[bucket.key]) !== null && _a !== void 0 ? _a : `${bucket.key}`;
381
+ }
382
+ return {
383
+ displayText,
384
+ key: `${bucketKey}`,
385
+ count: bucket.doc_count,
386
+ state: 'none',
387
+ };
388
+ });
389
+ const group = {
390
+ title,
391
+ key: option,
392
+ buckets: facetBuckets,
393
+ };
394
+ facetGroups.push(group);
395
+ });
396
+ return facetGroups;
397
+ }
398
+ /**
399
+ * Generate the template for a facet group with a header and the collapsible
400
+ * chevron for the mobile view
401
+ */
402
+ getFacetGroupTemplate(facetGroup) {
403
+ if (!this.facetsLoading && facetGroup.buckets.length === 0)
404
+ return nothing;
405
+ const { key } = facetGroup;
406
+ const isOpen = this.openFacets[key];
398
407
  const collapser = html `
399
408
  <span class="collapser ${isOpen ? 'open' : ''}"> ${chevronIcon} </span>
400
- `;
401
- const toggleCollapsed = () => {
402
- const newOpenFacets = { ...this.openFacets };
403
- newOpenFacets[key] = !isOpen;
404
- this.openFacets = newOpenFacets;
405
- };
406
- const headerId = `facet-group-header-label-${facetGroup.key}`;
409
+ `;
410
+ const toggleCollapsed = () => {
411
+ const newOpenFacets = { ...this.openFacets };
412
+ newOpenFacets[key] = !isOpen;
413
+ this.openFacets = newOpenFacets;
414
+ };
415
+ // Added data-testid for Playwright testing
416
+ // Using className and aria-labels is not ideal for Playwright locator
417
+ const headerId = `facet-group-header-label-${facetGroup.key}`;
407
418
  return html `
408
419
  <section
409
420
  class="facet-group ${this.collapsableFacets ? 'mobile' : ''}"
410
421
  aria-labelledby=${headerId}
422
+ data-testid=${headerId}
411
423
  >
412
424
  <div class="facet-group-header">
413
425
  <h3
@@ -419,61 +431,67 @@ let CollectionFacets = class CollectionFacets extends LitElement {
419
431
  <span class="sr-only">filters</span>
420
432
  </h3>
421
433
  </div>
422
- <div class="facet-group-content ${isOpen ? 'open' : ''}">
423
- ${this.facetsLoading
424
- ? this.getTombstoneFacetGroupTemplate()
434
+ <div
435
+ class="facet-group-content ${isOpen ? 'open' : ''}"
436
+ data-testid="facet-group-content-${facetGroup.key}"
437
+ >
438
+ ${this.facetsLoading
439
+ ? this.getTombstoneFacetGroupTemplate()
425
440
  : html `
426
441
  ${this.getFacetTemplate(facetGroup)}
427
442
  ${this.searchMoreFacetsLink(facetGroup)}
428
443
  `}
429
444
  </div>
430
445
  </section>
431
- `;
432
- }
433
- getTombstoneFacetGroupTemplate() {
434
- // Render five tombstone rows
446
+ `;
447
+ }
448
+ getTombstoneFacetGroupTemplate() {
449
+ // Render five tombstone rows
435
450
  return html `
436
451
  ${map(Array(5).fill(null), () => html `<facet-tombstone-row></facet-tombstone-row>`)}
437
- `;
438
- }
439
- /**
440
- * Generate the More... link button just below the facets group
441
- *
442
- * TODO: want to fire analytics?
443
- */
444
- searchMoreFacetsLink(facetGroup) {
445
- // Don't render More... links for FTS searches
446
- if (!this.moreLinksVisible) {
447
- return nothing;
448
- }
449
- // Don't render More... links for lending facets
450
- if (facetGroup.key === 'lending') {
451
- return nothing;
452
- }
453
- // Don't render More... link if the number of facets < this.allowedFacetCount
454
- if (Object.keys(facetGroup.buckets).length < this.allowedFacetCount) {
455
- return nothing;
456
- }
457
- // We sort years in numeric order by default, rather than bucket count
458
- const facetSort = defaultFacetSort[facetGroup.key];
452
+ `;
453
+ }
454
+ /**
455
+ * Generate the More... link button just below the facets group
456
+ *
457
+ * TODO: want to fire analytics?
458
+ */
459
+ searchMoreFacetsLink(facetGroup) {
460
+ // Don't render More... links for FTS searches
461
+ if (!this.moreLinksVisible) {
462
+ return nothing;
463
+ }
464
+ // Don't render More... links for lending facets
465
+ if (facetGroup.key === 'lending') {
466
+ return nothing;
467
+ }
468
+ // Don't render More... link if the number of facets < this.allowedFacetCount
469
+ if (Object.keys(facetGroup.buckets).length < this.allowedFacetCount) {
470
+ return nothing;
471
+ }
472
+ // We sort years in numeric order by default, rather than bucket count
473
+ const facetSort = defaultFacetSort[facetGroup.key];
474
+ // Added data-testid for Playwright testing
475
+ // Using the className is not ideal for Playwright locator
459
476
  return html `<button
460
477
  class="more-link"
461
- @click=${() => {
462
- var _a;
463
- this.showMoreFacetsModal(facetGroup, facetSort);
464
- (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEvent({
465
- category: analyticsCategories.default,
466
- action: analyticsActions.showMoreFacetsModal,
467
- label: facetGroup.key,
468
- });
469
- this.dispatchEvent(new CustomEvent('showMoreFacets', { detail: facetGroup.key }));
478
+ @click=${() => {
479
+ var _a;
480
+ this.showMoreFacetsModal(facetGroup, facetSort);
481
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEvent({
482
+ category: analyticsCategories.default,
483
+ action: analyticsActions.showMoreFacetsModal,
484
+ label: facetGroup.key,
485
+ });
486
+ this.dispatchEvent(new CustomEvent('showMoreFacets', { detail: facetGroup.key }));
470
487
  }}
488
+ data-testid="more-link-btn"
471
489
  >
472
490
  More...
473
- </button>`;
474
- }
475
- async showMoreFacetsModal(facetGroup, sortedBy) {
476
- var _a, _b;
491
+ </button>`;
492
+ }
493
+ async showMoreFacetsModal(facetGroup, sortedBy) {
494
+ var _a, _b;
477
495
  const customModalContent = html `
478
496
  <more-facets-content
479
497
  .analyticsHandler=${this.analyticsHandler}
@@ -487,59 +505,59 @@ let CollectionFacets = class CollectionFacets extends LitElement {
487
505
  .collectionTitles=${this.collectionTitles}
488
506
  .selectedFacets=${this.selectedFacets}
489
507
  .sortedBy=${sortedBy}
490
- @facetsChanged=${(e) => {
491
- const event = new CustomEvent('facetsChanged', {
492
- detail: e.detail,
493
- bubbles: true,
494
- composed: true,
495
- });
496
- this.dispatchEvent(event);
508
+ @facetsChanged=${(e) => {
509
+ const event = new CustomEvent('facetsChanged', {
510
+ detail: e.detail,
511
+ bubbles: true,
512
+ composed: true,
513
+ });
514
+ this.dispatchEvent(event);
497
515
  }}
498
516
  >
499
517
  </more-facets-content>
500
- `;
501
- const config = new ModalConfig({
502
- bodyColor: '#fff',
503
- headerColor: '#194880',
504
- showHeaderLogo: false,
505
- closeOnBackdropClick: true,
506
- title: html `Select filters`,
507
- });
508
- (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.add('more-search-facets');
509
- (_b = this.modalManager) === null || _b === void 0 ? void 0 : _b.showModal({
510
- config,
511
- customModalContent,
512
- userClosedModalCallback: () => {
513
- var _a;
514
- (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.remove('more-search-facets');
515
- },
516
- });
517
- }
518
- /**
519
- * Generate the list template for each bucket in a facet group
520
- */
521
- getFacetTemplate(facetGroup) {
518
+ `;
519
+ const config = new ModalConfig({
520
+ bodyColor: '#fff',
521
+ headerColor: '#194880',
522
+ showHeaderLogo: false,
523
+ closeOnBackdropClick: true,
524
+ title: html `Select filters`,
525
+ });
526
+ (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.add('more-search-facets');
527
+ (_b = this.modalManager) === null || _b === void 0 ? void 0 : _b.showModal({
528
+ config,
529
+ customModalContent,
530
+ userClosedModalCallback: () => {
531
+ var _a;
532
+ (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.classList.remove('more-search-facets');
533
+ },
534
+ });
535
+ }
536
+ /**
537
+ * Generate the list template for each bucket in a facet group
538
+ */
539
+ getFacetTemplate(facetGroup) {
522
540
  return html `
523
541
  <facets-template
524
542
  .collectionPagePath=${this.collectionPagePath}
525
543
  .facetGroup=${facetGroup}
526
544
  .selectedFacets=${this.selectedFacets}
527
545
  .collectionTitles=${this.collectionTitles}
528
- @facetClick=${(e) => {
529
- this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, facetGroup.key, e.detail.bucket, true);
530
- const event = new CustomEvent('facetsChanged', {
531
- detail: this.selectedFacets,
532
- bubbles: true,
533
- composed: true,
534
- });
535
- this.dispatchEvent(event);
546
+ @facetClick=${(e) => {
547
+ this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, facetGroup.key, e.detail.bucket, true);
548
+ const event = new CustomEvent('facetsChanged', {
549
+ detail: this.selectedFacets,
550
+ bubbles: true,
551
+ composed: true,
552
+ });
553
+ this.dispatchEvent(event);
536
554
  }}
537
555
  ></facets-template>
538
- `;
539
- }
540
- static get styles() {
541
- return [
542
- srOnlyStyle,
556
+ `;
557
+ }
558
+ static get styles() {
559
+ return [
560
+ srOnlyStyle,
543
561
  css `
544
562
  a:link {
545
563
  text-decoration: none;
@@ -658,96 +676,96 @@ let CollectionFacets = class CollectionFacets extends LitElement {
658
676
  height: 15px;
659
677
  cursor: pointer;
660
678
  }
661
- `,
662
- ];
663
- }
664
- };
665
- __decorate([
666
- property({ type: Object })
667
- ], CollectionFacets.prototype, "searchService", void 0);
668
- __decorate([
669
- property({ type: String })
670
- ], CollectionFacets.prototype, "searchType", void 0);
671
- __decorate([
672
- property({ type: Object })
673
- ], CollectionFacets.prototype, "aggregations", void 0);
674
- __decorate([
675
- property({ type: Object })
676
- ], CollectionFacets.prototype, "fullYearsHistogramAggregation", void 0);
677
- __decorate([
678
- property({ type: String })
679
- ], CollectionFacets.prototype, "minSelectedDate", void 0);
680
- __decorate([
681
- property({ type: String })
682
- ], CollectionFacets.prototype, "maxSelectedDate", void 0);
683
- __decorate([
684
- property({ type: Boolean })
685
- ], CollectionFacets.prototype, "moreLinksVisible", void 0);
686
- __decorate([
687
- property({ type: Boolean })
688
- ], CollectionFacets.prototype, "facetsLoading", void 0);
689
- __decorate([
690
- property({ type: Boolean })
691
- ], CollectionFacets.prototype, "fullYearAggregationLoading", void 0);
692
- __decorate([
693
- property({ type: Object })
694
- ], CollectionFacets.prototype, "selectedFacets", void 0);
695
- __decorate([
696
- property({ type: Boolean })
697
- ], CollectionFacets.prototype, "collapsableFacets", void 0);
698
- __decorate([
699
- property({ type: Number })
700
- ], CollectionFacets.prototype, "contentWidth", void 0);
701
- __decorate([
702
- property({ type: Boolean })
703
- ], CollectionFacets.prototype, "showHistogramDatePicker", void 0);
704
- __decorate([
705
- property({ type: Boolean })
706
- ], CollectionFacets.prototype, "allowExpandingDatePicker", void 0);
707
- __decorate([
708
- property({ type: String })
709
- ], CollectionFacets.prototype, "query", void 0);
710
- __decorate([
711
- property({ type: Object })
712
- ], CollectionFacets.prototype, "pageSpecifierParams", void 0);
713
- __decorate([
714
- property({ type: Array })
715
- ], CollectionFacets.prototype, "parentCollections", void 0);
716
- __decorate([
717
- property({ type: Object })
718
- ], CollectionFacets.prototype, "filterMap", void 0);
719
- __decorate([
720
- property({ type: String })
721
- ], CollectionFacets.prototype, "baseNavigationUrl", void 0);
722
- __decorate([
723
- property({ type: String })
724
- ], CollectionFacets.prototype, "collectionPagePath", void 0);
725
- __decorate([
726
- property({ type: Boolean })
727
- ], CollectionFacets.prototype, "isManageView", void 0);
728
- __decorate([
729
- property({ type: Object, attribute: false })
730
- ], CollectionFacets.prototype, "modalManager", void 0);
731
- __decorate([
732
- property({ type: Object, attribute: false })
733
- ], CollectionFacets.prototype, "resizeObserver", void 0);
734
- __decorate([
735
- property({ type: Object, attribute: false })
736
- ], CollectionFacets.prototype, "featureFeedbackService", void 0);
737
- __decorate([
738
- property({ type: Object, attribute: false })
739
- ], CollectionFacets.prototype, "recaptchaManager", void 0);
740
- __decorate([
741
- property({ type: Object, attribute: false })
742
- ], CollectionFacets.prototype, "analyticsHandler", void 0);
743
- __decorate([
744
- property({ type: Object, attribute: false })
745
- ], CollectionFacets.prototype, "collectionTitles", void 0);
746
- __decorate([
747
- state()
748
- ], CollectionFacets.prototype, "openFacets", void 0);
749
- CollectionFacets = __decorate([
750
- customElement('collection-facets')
751
- ], CollectionFacets);
752
- export { CollectionFacets };
679
+ `,
680
+ ];
681
+ }
682
+ };
683
+ __decorate([
684
+ property({ type: Object })
685
+ ], CollectionFacets.prototype, "searchService", void 0);
686
+ __decorate([
687
+ property({ type: String })
688
+ ], CollectionFacets.prototype, "searchType", void 0);
689
+ __decorate([
690
+ property({ type: Object })
691
+ ], CollectionFacets.prototype, "aggregations", void 0);
692
+ __decorate([
693
+ property({ type: Object })
694
+ ], CollectionFacets.prototype, "fullYearsHistogramAggregation", void 0);
695
+ __decorate([
696
+ property({ type: String })
697
+ ], CollectionFacets.prototype, "minSelectedDate", void 0);
698
+ __decorate([
699
+ property({ type: String })
700
+ ], CollectionFacets.prototype, "maxSelectedDate", void 0);
701
+ __decorate([
702
+ property({ type: Boolean })
703
+ ], CollectionFacets.prototype, "moreLinksVisible", void 0);
704
+ __decorate([
705
+ property({ type: Boolean })
706
+ ], CollectionFacets.prototype, "facetsLoading", void 0);
707
+ __decorate([
708
+ property({ type: Boolean })
709
+ ], CollectionFacets.prototype, "fullYearAggregationLoading", void 0);
710
+ __decorate([
711
+ property({ type: Object })
712
+ ], CollectionFacets.prototype, "selectedFacets", void 0);
713
+ __decorate([
714
+ property({ type: Boolean })
715
+ ], CollectionFacets.prototype, "collapsableFacets", void 0);
716
+ __decorate([
717
+ property({ type: Number })
718
+ ], CollectionFacets.prototype, "contentWidth", void 0);
719
+ __decorate([
720
+ property({ type: Boolean })
721
+ ], CollectionFacets.prototype, "showHistogramDatePicker", void 0);
722
+ __decorate([
723
+ property({ type: Boolean })
724
+ ], CollectionFacets.prototype, "allowExpandingDatePicker", void 0);
725
+ __decorate([
726
+ property({ type: String })
727
+ ], CollectionFacets.prototype, "query", void 0);
728
+ __decorate([
729
+ property({ type: Object })
730
+ ], CollectionFacets.prototype, "pageSpecifierParams", void 0);
731
+ __decorate([
732
+ property({ type: Array })
733
+ ], CollectionFacets.prototype, "parentCollections", void 0);
734
+ __decorate([
735
+ property({ type: Object })
736
+ ], CollectionFacets.prototype, "filterMap", void 0);
737
+ __decorate([
738
+ property({ type: String })
739
+ ], CollectionFacets.prototype, "baseNavigationUrl", void 0);
740
+ __decorate([
741
+ property({ type: String })
742
+ ], CollectionFacets.prototype, "collectionPagePath", void 0);
743
+ __decorate([
744
+ property({ type: Boolean })
745
+ ], CollectionFacets.prototype, "isManageView", void 0);
746
+ __decorate([
747
+ property({ type: Object, attribute: false })
748
+ ], CollectionFacets.prototype, "modalManager", void 0);
749
+ __decorate([
750
+ property({ type: Object, attribute: false })
751
+ ], CollectionFacets.prototype, "resizeObserver", void 0);
752
+ __decorate([
753
+ property({ type: Object, attribute: false })
754
+ ], CollectionFacets.prototype, "featureFeedbackService", void 0);
755
+ __decorate([
756
+ property({ type: Object, attribute: false })
757
+ ], CollectionFacets.prototype, "recaptchaManager", void 0);
758
+ __decorate([
759
+ property({ type: Object, attribute: false })
760
+ ], CollectionFacets.prototype, "analyticsHandler", void 0);
761
+ __decorate([
762
+ property({ type: Object, attribute: false })
763
+ ], CollectionFacets.prototype, "collectionTitles", void 0);
764
+ __decorate([
765
+ state()
766
+ ], CollectionFacets.prototype, "openFacets", void 0);
767
+ CollectionFacets = __decorate([
768
+ customElement('collection-facets')
769
+ ], CollectionFacets);
770
+ export { CollectionFacets };
753
771
  //# sourceMappingURL=collection-facets.js.map