@internetarchive/collection-browser 2.7.12 → 2.7.13-alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +3 -3
  3. package/.github/workflows/gh-pages-main.yml +2 -2
  4. package/.github/workflows/pr-preview.yml +2 -2
  5. package/.husky/pre-commit +4 -4
  6. package/.prettierignore +1 -0
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +13 -13
  10. package/dist/index.js +11 -13
  11. package/dist/index.js.map +1 -1
  12. package/dist/src/app-root.d.ts +108 -107
  13. package/dist/src/app-root.js +541 -531
  14. package/dist/src/app-root.js.map +1 -1
  15. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  16. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  17. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  18. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  19. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  20. package/dist/src/assets/img/icons/chevron.js +2 -2
  21. package/dist/src/assets/img/icons/contract.d.ts +2 -2
  22. package/dist/src/assets/img/icons/contract.js +2 -2
  23. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  24. package/dist/src/assets/img/icons/empty-query.js +2 -2
  25. package/dist/src/assets/img/icons/expand.d.ts +2 -2
  26. package/dist/src/assets/img/icons/expand.js +2 -2
  27. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  28. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  29. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  30. package/dist/src/assets/img/icons/eye.js +2 -2
  31. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  32. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  33. package/dist/src/assets/img/icons/favorite-unfilled.d.ts +1 -1
  34. package/dist/src/assets/img/icons/favorite-unfilled.js +2 -2
  35. package/dist/src/assets/img/icons/filter.d.ts +2 -2
  36. package/dist/src/assets/img/icons/filter.js +2 -2
  37. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  38. package/dist/src/assets/img/icons/login-required.js +2 -2
  39. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  40. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  41. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  42. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  43. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  44. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  45. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  55. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -1
  56. package/dist/src/assets/img/icons/mediatype/search.js +2 -2
  57. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  58. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  59. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  60. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  61. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  62. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  63. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  64. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  65. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  66. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  67. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  68. package/dist/src/assets/img/icons/null-result.js +2 -2
  69. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  70. package/dist/src/assets/img/icons/restricted.js +2 -2
  71. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  72. package/dist/src/assets/img/icons/reviews.js +2 -2
  73. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  74. package/dist/src/assets/img/icons/upload.js +2 -2
  75. package/dist/src/assets/img/icons/views.d.ts +1 -1
  76. package/dist/src/assets/img/icons/views.js +2 -2
  77. package/dist/src/circular-activity-indicator.d.ts +5 -5
  78. package/dist/src/circular-activity-indicator.js +17 -17
  79. package/dist/src/circular-activity-indicator.js.map +1 -1
  80. package/dist/src/collection-browser.d.ts +611 -606
  81. package/dist/src/collection-browser.js +1688 -1679
  82. package/dist/src/collection-browser.js.map +1 -1
  83. package/dist/src/collection-facets/facet-row.d.ts +30 -30
  84. package/dist/src/collection-facets/facet-row.js +118 -118
  85. package/dist/src/collection-facets/facet-row.js.map +1 -1
  86. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  87. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  88. package/dist/src/collection-facets/facet-tombstone-row.js.map +1 -1
  89. package/dist/src/collection-facets/facets-template.d.ts +13 -13
  90. package/dist/src/collection-facets/facets-template.js +49 -49
  91. package/dist/src/collection-facets/facets-template.js.map +1 -1
  92. package/dist/src/collection-facets/more-facets-content.d.ts +106 -106
  93. package/dist/src/collection-facets/more-facets-content.js +406 -408
  94. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  95. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  96. package/dist/src/collection-facets/more-facets-pagination.js +197 -196
  97. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -1
  98. package/dist/src/collection-facets/smart-facets/dedupe.d.ts +10 -10
  99. package/dist/src/collection-facets/smart-facets/dedupe.js +33 -33
  100. package/dist/src/collection-facets/smart-facets/dedupe.js.map +1 -1
  101. package/dist/src/collection-facets/smart-facets/heuristics/browser-language-heuristic.d.ts +5 -5
  102. package/dist/src/collection-facets/smart-facets/heuristics/browser-language-heuristic.js +23 -23
  103. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords-heuristic.d.ts +5 -5
  104. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords-heuristic.js +44 -44
  105. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords-heuristic.js.map +1 -1
  106. package/dist/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.d.ts +5 -5
  107. package/dist/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.js +172 -172
  108. package/dist/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.js.map +1 -1
  109. package/dist/src/collection-facets/smart-facets/models.d.ts +26 -26
  110. package/dist/src/collection-facets/smart-facets/models.js +1 -1
  111. package/dist/src/collection-facets/smart-facets/smart-facet-bar.d.ts +31 -31
  112. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +237 -240
  113. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
  114. package/dist/src/collection-facets/smart-facets/smart-facet-button.d.ts +11 -11
  115. package/dist/src/collection-facets/smart-facets/smart-facet-button.js +86 -86
  116. package/dist/src/collection-facets/smart-facets/smart-facet-button.js.map +1 -1
  117. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.d.ts +16 -16
  118. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +100 -100
  119. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -1
  120. package/dist/src/collection-facets/smart-facets/smart-facet-equals.d.ts +2 -2
  121. package/dist/src/collection-facets/smart-facets/smart-facet-equals.js +12 -12
  122. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.d.ts +5 -5
  123. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js +15 -15
  124. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js.map +1 -1
  125. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  126. package/dist/src/collection-facets/toggle-switch.js +94 -94
  127. package/dist/src/collection-facets/toggle-switch.js.map +1 -1
  128. package/dist/src/collection-facets.d.ts +103 -103
  129. package/dist/src/collection-facets.js +521 -522
  130. package/dist/src/collection-facets.js.map +1 -1
  131. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +245 -245
  132. package/dist/src/data-source/collection-browser-data-source-interface.js +1 -1
  133. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -1
  134. package/dist/src/data-source/collection-browser-data-source.d.ts +377 -377
  135. package/dist/src/data-source/collection-browser-data-source.js +1003 -1001
  136. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  137. package/dist/src/data-source/collection-browser-query-state.d.ts +44 -44
  138. package/dist/src/data-source/collection-browser-query-state.js +1 -1
  139. package/dist/src/data-source/models.d.ts +28 -28
  140. package/dist/src/data-source/models.js +8 -8
  141. package/dist/src/empty-placeholder.d.ts +23 -23
  142. package/dist/src/empty-placeholder.js +87 -88
  143. package/dist/src/empty-placeholder.js.map +1 -1
  144. package/dist/src/expanded-date-picker.d.ts +43 -43
  145. package/dist/src/expanded-date-picker.js +109 -109
  146. package/dist/src/expanded-date-picker.js.map +1 -1
  147. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  148. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  149. package/dist/src/language-code-handler/language-code-handler.js.map +1 -1
  150. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  151. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  152. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -1
  153. package/dist/src/manage/manage-bar.d.ts +58 -58
  154. package/dist/src/manage/manage-bar.js +175 -175
  155. package/dist/src/manage/manage-bar.js.map +1 -1
  156. package/dist/src/manage/remove-items-modal-content.d.ts +9 -9
  157. package/dist/src/manage/remove-items-modal-content.js +34 -34
  158. package/dist/src/manage/remove-items-modal-content.js.map +1 -1
  159. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  160. package/dist/src/mediatype/mediatype-config.js +92 -91
  161. package/dist/src/mediatype/mediatype-config.js.map +1 -1
  162. package/dist/src/models.d.ts +228 -228
  163. package/dist/src/models.js +401 -401
  164. package/dist/src/models.js.map +1 -1
  165. package/dist/src/restoration-state-handler.d.ts +70 -70
  166. package/dist/src/restoration-state-handler.js +362 -363
  167. package/dist/src/restoration-state-handler.js.map +1 -1
  168. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  169. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  170. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js.map +1 -1
  171. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  172. package/dist/src/sort-filter-bar/alpha-bar.js +136 -136
  173. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  174. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  175. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  176. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  177. package/dist/src/sort-filter-bar/img/list.js +2 -2
  178. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  179. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  180. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  181. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  182. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  183. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  184. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  185. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  186. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  187. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  188. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +223 -223
  189. package/dist/src/sort-filter-bar/sort-filter-bar.js +696 -697
  190. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  191. package/dist/src/styles/ia-button.d.ts +2 -2
  192. package/dist/src/styles/ia-button.js +17 -17
  193. package/dist/src/styles/item-image-styles.d.ts +8 -8
  194. package/dist/src/styles/item-image-styles.js +9 -9
  195. package/dist/src/styles/sr-only.d.ts +1 -1
  196. package/dist/src/styles/sr-only.js +2 -2
  197. package/dist/src/tiles/base-tile-component.d.ts +19 -19
  198. package/dist/src/tiles/base-tile-component.js +64 -64
  199. package/dist/src/tiles/base-tile-component.js.map +1 -1
  200. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  201. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  202. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -1
  203. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  204. package/dist/src/tiles/grid/account-tile.js +72 -72
  205. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  206. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  207. package/dist/src/tiles/grid/collection-tile.js +80 -80
  208. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  209. package/dist/src/tiles/grid/item-tile.d.ts +34 -34
  210. package/dist/src/tiles/grid/item-tile.js +159 -160
  211. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  212. package/dist/src/tiles/grid/search-tile.d.ts +10 -10
  213. package/dist/src/tiles/grid/search-tile.js +51 -51
  214. package/dist/src/tiles/grid/search-tile.js.map +1 -1
  215. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  216. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  217. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  218. package/dist/src/tiles/grid/tile-stats.js +54 -54
  219. package/dist/src/tiles/grid/tile-stats.js.map +1 -1
  220. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  221. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  222. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
  223. package/dist/src/tiles/hover/tile-hover-pane.d.ts +18 -18
  224. package/dist/src/tiles/hover/tile-hover-pane.js +72 -70
  225. package/dist/src/tiles/hover/tile-hover-pane.js.map +1 -1
  226. package/dist/src/tiles/image-block.d.ts +18 -18
  227. package/dist/src/tiles/image-block.js +89 -89
  228. package/dist/src/tiles/image-block.js.map +1 -1
  229. package/dist/src/tiles/item-image.d.ts +39 -39
  230. package/dist/src/tiles/item-image.js +154 -154
  231. package/dist/src/tiles/item-image.js.map +1 -1
  232. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  233. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  234. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
  235. package/dist/src/tiles/list/tile-list-compact.d.ts +19 -19
  236. package/dist/src/tiles/list/tile-list-compact.js +122 -122
  237. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  238. package/dist/src/tiles/list/tile-list.d.ts +54 -54
  239. package/dist/src/tiles/list/tile-list.js +324 -326
  240. package/dist/src/tiles/list/tile-list.js.map +1 -1
  241. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  242. package/dist/src/tiles/mediatype-icon.js +47 -47
  243. package/dist/src/tiles/mediatype-icon.js.map +1 -1
  244. package/dist/src/tiles/overlay/icon-overlay.d.ts +8 -8
  245. package/dist/src/tiles/overlay/icon-overlay.js +25 -25
  246. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -1
  247. package/dist/src/tiles/overlay/text-overlay.d.ts +9 -9
  248. package/dist/src/tiles/overlay/text-overlay.js +31 -31
  249. package/dist/src/tiles/overlay/text-overlay.js.map +1 -1
  250. package/dist/src/tiles/review-block.d.ts +12 -12
  251. package/dist/src/tiles/review-block.js +56 -56
  252. package/dist/src/tiles/review-block.js.map +1 -1
  253. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  254. package/dist/src/tiles/text-snippet-block.js +73 -73
  255. package/dist/src/tiles/text-snippet-block.js.map +1 -1
  256. package/dist/src/tiles/tile-dispatcher.d.ts +64 -64
  257. package/dist/src/tiles/tile-dispatcher.js +230 -230
  258. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  259. package/dist/src/tiles/tile-display-value-provider.d.ts +47 -47
  260. package/dist/src/tiles/tile-display-value-provider.js +94 -94
  261. package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
  262. package/dist/src/utils/analytics-events.d.ts +28 -28
  263. package/dist/src/utils/analytics-events.js +30 -30
  264. package/dist/src/utils/array-equals.d.ts +4 -4
  265. package/dist/src/utils/array-equals.js +10 -10
  266. package/dist/src/utils/collapse-repeated-quotes.d.ts +11 -11
  267. package/dist/src/utils/collapse-repeated-quotes.js +13 -13
  268. package/dist/src/utils/facet-utils.d.ts +83 -83
  269. package/dist/src/utils/facet-utils.js +145 -145
  270. package/dist/src/utils/facet-utils.js.map +1 -1
  271. package/dist/src/utils/format-count.d.ts +7 -7
  272. package/dist/src/utils/format-count.js +75 -76
  273. package/dist/src/utils/format-count.js.map +1 -1
  274. package/dist/src/utils/format-date.d.ts +2 -2
  275. package/dist/src/utils/format-date.js +27 -27
  276. package/dist/src/utils/format-date.js.map +1 -1
  277. package/dist/src/utils/format-unit-size.d.ts +2 -2
  278. package/dist/src/utils/format-unit-size.js +33 -33
  279. package/dist/src/utils/format-unit-size.js.map +1 -1
  280. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  281. package/dist/src/utils/local-date-from-utc.js +15 -15
  282. package/dist/src/utils/log.d.ts +7 -7
  283. package/dist/src/utils/log.js +13 -15
  284. package/dist/src/utils/log.js.map +1 -1
  285. package/dist/src/utils/resolve-mediatype.d.ts +8 -8
  286. package/dist/src/utils/resolve-mediatype.js +23 -23
  287. package/dist/src/utils/resolve-mediatype.js.map +1 -1
  288. package/dist/src/utils/sha1.d.ts +2 -2
  289. package/dist/src/utils/sha1.js +8 -8
  290. package/dist/test/collection-browser.test.d.ts +1 -1
  291. package/dist/test/collection-browser.test.js +1309 -1308
  292. package/dist/test/collection-browser.test.js.map +1 -1
  293. package/dist/test/collection-facets/facet-row.test.d.ts +1 -1
  294. package/dist/test/collection-facets/facet-row.test.js +230 -227
  295. package/dist/test/collection-facets/facet-row.test.js.map +1 -1
  296. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  297. package/dist/test/collection-facets/facets-template.test.js +91 -91
  298. package/dist/test/collection-facets/facets-template.test.js.map +1 -1
  299. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  300. package/dist/test/collection-facets/more-facets-content.test.js +140 -141
  301. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
  302. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  303. package/dist/test/collection-facets/more-facets-pagination.test.js +116 -117
  304. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -1
  305. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  306. package/dist/test/collection-facets/toggle-switch.test.js +82 -73
  307. package/dist/test/collection-facets/toggle-switch.test.js.map +1 -1
  308. package/dist/test/collection-facets.test.d.ts +2 -2
  309. package/dist/test/collection-facets.test.js +692 -692
  310. package/dist/test/collection-facets.test.js.map +1 -1
  311. package/dist/test/data-source/collection-browser-data-source.test.d.ts +1 -1
  312. package/dist/test/data-source/collection-browser-data-source.test.js +89 -89
  313. package/dist/test/data-source/collection-browser-data-source.test.js.map +1 -1
  314. package/dist/test/empty-placeholder.test.d.ts +1 -1
  315. package/dist/test/empty-placeholder.test.js +62 -63
  316. package/dist/test/empty-placeholder.test.js.map +1 -1
  317. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  318. package/dist/test/expanded-date-picker.test.js +97 -96
  319. package/dist/test/expanded-date-picker.test.js.map +1 -1
  320. package/dist/test/icon-overlay.test.d.ts +1 -1
  321. package/dist/test/icon-overlay.test.js +23 -24
  322. package/dist/test/icon-overlay.test.js.map +1 -1
  323. package/dist/test/image-block.test.d.ts +1 -1
  324. package/dist/test/image-block.test.js +106 -107
  325. package/dist/test/image-block.test.js.map +1 -1
  326. package/dist/test/item-image.test.d.ts +1 -1
  327. package/dist/test/item-image.test.js +84 -85
  328. package/dist/test/item-image.test.js.map +1 -1
  329. package/dist/test/manage/manage-bar.test.d.ts +2 -2
  330. package/dist/test/manage/manage-bar.test.js +100 -101
  331. package/dist/test/manage/manage-bar.test.js.map +1 -1
  332. package/dist/test/manage/remove-items-modal-content.test.d.ts +1 -1
  333. package/dist/test/manage/remove-items-modal-content.test.js +44 -45
  334. package/dist/test/manage/remove-items-modal-content.test.js.map +1 -1
  335. package/dist/test/mediatype-config.test.d.ts +1 -1
  336. package/dist/test/mediatype-config.test.js +16 -16
  337. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  338. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  339. package/dist/test/mocks/mock-search-responses.d.ts +25 -25
  340. package/dist/test/mocks/mock-search-responses.js +942 -942
  341. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  342. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  343. package/dist/test/mocks/mock-search-service.js +54 -54
  344. package/dist/test/mocks/mock-search-service.js.map +1 -1
  345. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  346. package/dist/test/restoration-state-handler.test.js +270 -270
  347. package/dist/test/restoration-state-handler.test.js.map +1 -1
  348. package/dist/test/review-block.test.d.ts +1 -1
  349. package/dist/test/review-block.test.js +43 -44
  350. package/dist/test/review-block.test.js.map +1 -1
  351. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  352. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  353. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js.map +1 -1
  354. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  355. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  356. package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -1
  357. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  358. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +425 -426
  359. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
  360. package/dist/test/text-overlay.test.d.ts +1 -1
  361. package/dist/test/text-overlay.test.js +37 -38
  362. package/dist/test/text-overlay.test.js.map +1 -1
  363. package/dist/test/text-snippet-block.test.d.ts +1 -1
  364. package/dist/test/text-snippet-block.test.js +56 -57
  365. package/dist/test/text-snippet-block.test.js.map +1 -1
  366. package/dist/test/tile-stats.test.d.ts +1 -1
  367. package/dist/test/tile-stats.test.js +98 -99
  368. package/dist/test/tile-stats.test.js.map +1 -1
  369. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  370. package/dist/test/tiles/grid/account-tile.test.js +75 -76
  371. package/dist/test/tiles/grid/account-tile.test.js.map +1 -1
  372. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  373. package/dist/test/tiles/grid/collection-tile.test.js +72 -73
  374. package/dist/test/tiles/grid/collection-tile.test.js.map +1 -1
  375. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  376. package/dist/test/tiles/grid/item-tile.test.js +311 -312
  377. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  378. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -1
  379. package/dist/test/tiles/grid/search-tile.test.js +50 -51
  380. package/dist/test/tiles/grid/search-tile.test.js.map +1 -1
  381. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  382. package/dist/test/tiles/hover/hover-pane-controller.test.js +259 -259
  383. package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -1
  384. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  385. package/dist/test/tiles/hover/tile-hover-pane.test.js +56 -56
  386. package/dist/test/tiles/hover/tile-hover-pane.test.js.map +1 -1
  387. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  388. package/dist/test/tiles/list/tile-list-compact.test.js +142 -143
  389. package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -1
  390. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  391. package/dist/test/tiles/list/tile-list.test.js +296 -297
  392. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  393. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  394. package/dist/test/tiles/tile-dispatcher.test.js +100 -100
  395. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
  396. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  397. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  398. package/dist/test/utils/array-equals.test.d.ts +1 -1
  399. package/dist/test/utils/array-equals.test.js +26 -26
  400. package/dist/test/utils/format-count.test.d.ts +1 -1
  401. package/dist/test/utils/format-count.test.js +23 -23
  402. package/dist/test/utils/format-count.test.js.map +1 -1
  403. package/dist/test/utils/format-date.test.d.ts +1 -1
  404. package/dist/test/utils/format-date.test.js +30 -30
  405. package/dist/test/utils/format-date.test.js.map +1 -1
  406. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  407. package/dist/test/utils/format-unit-size.test.js +17 -17
  408. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  409. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  410. package/dist/test/utils/local-date-from-utc.test.js.map +1 -1
  411. package/eslint.config.mjs +53 -0
  412. package/index.html +0 -3
  413. package/local.archive.org.cert +86 -86
  414. package/local.archive.org.key +27 -27
  415. package/package.json +41 -39
  416. package/renovate.json +6 -6
  417. package/src/app-root.ts +33 -24
  418. package/src/collection-browser.ts +62 -53
  419. package/src/collection-facets/facets-template.ts +7 -6
  420. package/src/collection-facets/more-facets-content.ts +11 -13
  421. package/src/collection-facets/more-facets-pagination.ts +3 -2
  422. package/src/collection-facets/smart-facets/dedupe.ts +2 -2
  423. package/src/collection-facets/smart-facets/heuristics/query-keywords-heuristic.ts +1 -1
  424. package/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.ts +6 -6
  425. package/src/collection-facets/smart-facets/smart-facet-bar.ts +6 -8
  426. package/src/collection-facets/smart-facets/smart-facet-button.ts +5 -3
  427. package/src/collection-facets/smart-facets/smart-facet-dropdown.ts +4 -4
  428. package/src/collection-facets/smart-facets/smart-facet-heuristics.ts +1 -1
  429. package/src/collection-facets/toggle-switch.ts +2 -2
  430. package/src/collection-facets.ts +18 -19
  431. package/src/data-source/collection-browser-data-source-interface.ts +5 -1
  432. package/src/data-source/collection-browser-data-source.ts +42 -35
  433. package/src/empty-placeholder.ts +19 -16
  434. package/src/expanded-date-picker.ts +1 -1
  435. package/src/language-code-handler/language-code-handler.ts +1 -1
  436. package/src/manage/manage-bar.ts +23 -20
  437. package/src/manage/remove-items-modal-content.ts +2 -2
  438. package/src/mediatype/mediatype-config.ts +1 -0
  439. package/src/models.ts +3 -3
  440. package/src/restoration-state-handler.ts +14 -15
  441. package/src/sort-filter-bar/alpha-bar.ts +16 -17
  442. package/src/sort-filter-bar/sort-filter-bar.ts +14 -15
  443. package/src/tiles/grid/account-tile.ts +1 -1
  444. package/src/tiles/grid/collection-tile.ts +1 -1
  445. package/src/tiles/grid/item-tile.ts +9 -9
  446. package/src/tiles/grid/tile-stats.ts +4 -4
  447. package/src/tiles/hover/hover-pane-controller.ts +1 -1
  448. package/src/tiles/hover/tile-hover-pane.ts +4 -2
  449. package/src/tiles/item-image.ts +1 -1
  450. package/src/tiles/list/tile-list-compact.ts +2 -2
  451. package/src/tiles/list/tile-list.ts +22 -24
  452. package/src/tiles/tile-dispatcher.ts +5 -5
  453. package/src/tiles/tile-display-value-provider.ts +4 -4
  454. package/src/utils/facet-utils.ts +6 -6
  455. package/src/utils/format-count.ts +2 -3
  456. package/src/utils/format-date.ts +1 -1
  457. package/src/utils/format-unit-size.ts +1 -1
  458. package/src/utils/log.ts +1 -3
  459. package/test/collection-browser.test.ts +135 -134
  460. package/test/collection-facets/facet-row.test.ts +31 -28
  461. package/test/collection-facets/facets-template.test.ts +9 -9
  462. package/test/collection-facets/more-facets-content.test.ts +14 -15
  463. package/test/collection-facets/more-facets-pagination.test.ts +18 -19
  464. package/test/collection-facets/toggle-switch.test.ts +28 -18
  465. package/test/collection-facets.test.ts +46 -39
  466. package/test/data-source/collection-browser-data-source.test.ts +2 -2
  467. package/test/empty-placeholder.test.ts +6 -7
  468. package/test/expanded-date-picker.test.ts +25 -20
  469. package/test/icon-overlay.test.ts +0 -1
  470. package/test/image-block.test.ts +6 -7
  471. package/test/item-image.test.ts +0 -1
  472. package/test/manage/manage-bar.test.ts +19 -16
  473. package/test/manage/remove-items-modal-content.test.ts +4 -5
  474. package/test/mocks/mock-search-responses.ts +2 -1
  475. package/test/mocks/mock-search-service.ts +1 -1
  476. package/test/restoration-state-handler.test.ts +12 -12
  477. package/test/review-block.test.ts +1 -2
  478. package/test/sort-filter-bar/alpha-bar-tooltip.test.ts +1 -1
  479. package/test/sort-filter-bar/alpha-bar.test.ts +5 -5
  480. package/test/sort-filter-bar/sort-filter-bar.test.ts +38 -39
  481. package/test/text-overlay.test.ts +0 -1
  482. package/test/text-snippet-block.test.ts +5 -6
  483. package/test/tile-stats.test.ts +26 -35
  484. package/test/tiles/grid/account-tile.test.ts +2 -3
  485. package/test/tiles/grid/collection-tile.test.ts +3 -4
  486. package/test/tiles/grid/item-tile.test.ts +13 -14
  487. package/test/tiles/grid/search-tile.test.ts +1 -2
  488. package/test/tiles/hover/hover-pane-controller.test.ts +15 -15
  489. package/test/tiles/hover/tile-hover-pane.test.ts +5 -5
  490. package/test/tiles/list/tile-list-compact.test.ts +1 -2
  491. package/test/tiles/list/tile-list.test.ts +10 -11
  492. package/test/tiles/tile-dispatcher.test.ts +5 -5
  493. package/test/utils/format-count.test.ts +1 -1
  494. package/test/utils/format-date.test.ts +1 -1
  495. package/test/utils/local-date-from-utc.test.ts +1 -1
  496. package/tsconfig.json +0 -1
  497. package/web-dev-server.config.mjs +30 -30
  498. package/web-test-runner.config.mjs +41 -41
@@ -1,83 +1,83 @@
1
- import { AggregationSortType } from '@internetarchive/search-service';
2
- import { FacetOption, type FacetBucket, type SelectedFacets } from '../models';
3
- /**
4
- * Calls the given function for each FacetBucket specified in the given SelectedFacets
5
- * object. The function is always called with the facet type, bucket key, bucket object,
6
- * and the given SelectedFacets object.
7
- *
8
- * @param selectedFacets The SelectedFacets object whose buckets should be iterated over
9
- * @param fn The function to apply to each facet bucket.
10
- *
11
- * @example
12
- * forEachFacetBucket(
13
- * myFacets,
14
- * (facetType, bucketKey, bucket) => {
15
- * if (facetType === 'collection' && bucket.state === 'hidden') {
16
- * console.log(`Excluding any results in the ${bucketKey} collection`);
17
- * }
18
- * }
19
- * );
20
- */
21
- export declare function forEachFacetBucket(selectedFacets: SelectedFacets | undefined, fn: (facetType: FacetOption, bucketKey: string, bucket: FacetBucket, selectedFacets: SelectedFacets) => unknown): void;
22
- /**
23
- * Returns a new SelectedFacets object having only the specified bucket changed to
24
- * reflect its new provided value. The bucket key is determined from the provided
25
- * `bucket` itself.
26
- * @param selectedFacets The SelectedFacets object to produce an updated clone of
27
- * @param facetType The type of facet to be modified (e.g., 'mediatype', 'subject', ...)
28
- * @param bucket The new bucket that should be present on the result
29
- * @param omitNoneState If set to true, the returned object will omit the given
30
- * bucket entirely if it is updated to state `'none'`. Default is false, which leaves
31
- * the `'none'` state in place.
32
- */
33
- export declare function updateSelectedFacetBucket(selectedFacets: SelectedFacets | undefined, facetType: FacetOption, bucket: FacetBucket, omitNoneState?: boolean): SelectedFacets;
34
- /**
35
- * Creates a clone of the given SelectedFacets object.
36
- *
37
- * Note that the underlying FacetBucket objects are not deep-cloned -- they will
38
- * be references to the same objects as in the input. However, the objects
39
- * containing the FacetBuckets for each FacetOption are created anew.
40
- *
41
- * If the provided argument is undefined, returns an empty SelectedFacets object.
42
- *
43
- * @param selectedFacets The SelectedFacets object to be cloned
44
- */
45
- export declare function cloneSelectedFacets(selectedFacets: SelectedFacets | undefined): SelectedFacets;
46
- /**
47
- * Creates a new SelectedFacets object representing a merge of the `source` facets object
48
- * into the `destination` facets object. Any facets existing in `source` take precedence
49
- * over those in `destination` in the event of conflicts.
50
- *
51
- * The resulting SelectedFacets object is normalized to omit any facet buckets whose
52
- * state is `'none'` in the merged result. Consequently, any facets buckets with state
53
- * `'none'` in `source` will always be absent from the end result. Likewise, any facet
54
- * buckets with state `'none'` in `destination` will be absent _unless_ they are also
55
- * present in `source` with a state of `'selected'` or `'hidden'` (in which case `source`
56
- * takes precedence as usual).
57
- *
58
- * @param source The source of the new facets to merge in. Any facet buckets existing in
59
- * this `source` object will take precedence over those in `destination` having the same
60
- * key, if they exist in both. Any facet buckets that are _not_ present in `source` will
61
- * remain unmodified from their state in `destination`, if they are present there at all.
62
- * @param destination The destination onto which facets should be merged. Note that this
63
- * object is _not_ re-used for the return value, but it is conceptually the "existing base"
64
- * onto which the source facets are merged.
65
- */
66
- export declare function mergeSelectedFacets(destination: SelectedFacets | undefined, source: SelectedFacets | undefined): SelectedFacets;
67
- /**
68
- * Sorts the provided FacetBuckets so that:
69
- * - Any selected items come first
70
- * - Any hidden items come after all the selected items
71
- * - Any unselected / unhidden items come last
72
- *
73
- * Within each of the above groups, the buckets will be sorted according to
74
- * the provided sort type, or by their bucket count by default.
75
- *
76
- * The sort is performed in-place using `Array.sort`, so the return value is
77
- * a reference to the same array that was passed in, only sorted.
78
- *
79
- * @param buckets The array of facet buckets to sort
80
- * @param sort (Optional) How buckets within each state group should be sorted.
81
- * Defaults to `AggregationSortType.COUNT` (i.e., descending by bucket count).
82
- */
83
- export declare function sortBucketsBySelectionState(buckets: FacetBucket[], sort?: AggregationSortType): FacetBucket[];
1
+ import { AggregationSortType } from '@internetarchive/search-service';
2
+ import { FacetOption, type FacetBucket, type SelectedFacets } from '../models';
3
+ /**
4
+ * Calls the given function for each FacetBucket specified in the given SelectedFacets
5
+ * object. The function is always called with the facet type, bucket key, bucket object,
6
+ * and the given SelectedFacets object.
7
+ *
8
+ * @param selectedFacets The SelectedFacets object whose buckets should be iterated over
9
+ * @param fn The function to apply to each facet bucket.
10
+ *
11
+ * @example
12
+ * forEachFacetBucket(
13
+ * myFacets,
14
+ * (facetType, bucketKey, bucket) => {
15
+ * if (facetType === 'collection' && bucket.state === 'hidden') {
16
+ * console.log(`Excluding any results in the ${bucketKey} collection`);
17
+ * }
18
+ * }
19
+ * );
20
+ */
21
+ export declare function forEachFacetBucket(selectedFacets: SelectedFacets | undefined, fn: (facetType: FacetOption, bucketKey: string, bucket: FacetBucket, selectedFacets: SelectedFacets) => unknown): void;
22
+ /**
23
+ * Returns a new SelectedFacets object having only the specified bucket changed to
24
+ * reflect its new provided value. The bucket key is determined from the provided
25
+ * `bucket` itself.
26
+ * @param selectedFacets The SelectedFacets object to produce an updated clone of
27
+ * @param facetType The type of facet to be modified (e.g., 'mediatype', 'subject', ...)
28
+ * @param bucket The new bucket that should be present on the result
29
+ * @param omitNoneState If set to true, the returned object will omit the given
30
+ * bucket entirely if it is updated to state `'none'`. Default is false, which leaves
31
+ * the `'none'` state in place.
32
+ */
33
+ export declare function updateSelectedFacetBucket(selectedFacets: SelectedFacets | undefined, facetType: FacetOption, bucket: FacetBucket, omitNoneState?: boolean): SelectedFacets;
34
+ /**
35
+ * Creates a clone of the given SelectedFacets object.
36
+ *
37
+ * Note that the underlying FacetBucket objects are not deep-cloned -- they will
38
+ * be references to the same objects as in the input. However, the objects
39
+ * containing the FacetBuckets for each FacetOption are created anew.
40
+ *
41
+ * If the provided argument is undefined, returns an empty SelectedFacets object.
42
+ *
43
+ * @param selectedFacets The SelectedFacets object to be cloned
44
+ */
45
+ export declare function cloneSelectedFacets(selectedFacets: SelectedFacets | undefined): SelectedFacets;
46
+ /**
47
+ * Creates a new SelectedFacets object representing a merge of the `source` facets object
48
+ * into the `destination` facets object. Any facets existing in `source` take precedence
49
+ * over those in `destination` in the event of conflicts.
50
+ *
51
+ * The resulting SelectedFacets object is normalized to omit any facet buckets whose
52
+ * state is `'none'` in the merged result. Consequently, any facets buckets with state
53
+ * `'none'` in `source` will always be absent from the end result. Likewise, any facet
54
+ * buckets with state `'none'` in `destination` will be absent _unless_ they are also
55
+ * present in `source` with a state of `'selected'` or `'hidden'` (in which case `source`
56
+ * takes precedence as usual).
57
+ *
58
+ * @param source The source of the new facets to merge in. Any facet buckets existing in
59
+ * this `source` object will take precedence over those in `destination` having the same
60
+ * key, if they exist in both. Any facet buckets that are _not_ present in `source` will
61
+ * remain unmodified from their state in `destination`, if they are present there at all.
62
+ * @param destination The destination onto which facets should be merged. Note that this
63
+ * object is _not_ re-used for the return value, but it is conceptually the "existing base"
64
+ * onto which the source facets are merged.
65
+ */
66
+ export declare function mergeSelectedFacets(destination: SelectedFacets | undefined, source: SelectedFacets | undefined): SelectedFacets;
67
+ /**
68
+ * Sorts the provided FacetBuckets so that:
69
+ * - Any selected items come first
70
+ * - Any hidden items come after all the selected items
71
+ * - Any unselected / unhidden items come last
72
+ *
73
+ * Within each of the above groups, the buckets will be sorted according to
74
+ * the provided sort type, or by their bucket count by default.
75
+ *
76
+ * The sort is performed in-place using `Array.sort`, so the return value is
77
+ * a reference to the same array that was passed in, only sorted.
78
+ *
79
+ * @param buckets The array of facet buckets to sort
80
+ * @param sort (Optional) How buckets within each state group should be sorted.
81
+ * Defaults to `AggregationSortType.COUNT` (i.e., descending by bucket count).
82
+ */
83
+ export declare function sortBucketsBySelectionState(buckets: FacetBucket[], sort?: AggregationSortType): FacetBucket[];
@@ -1,146 +1,146 @@
1
- import { AggregationSortType } from '@internetarchive/search-service';
2
- import { getDefaultSelectedFacets, } from '../models';
3
- // This file contains several helper functions designed to make working immutably
4
- // with SelectedFacet objects and FacetGroups cleaner & easier.
5
- /**
6
- * Calls the given function for each FacetBucket specified in the given SelectedFacets
7
- * object. The function is always called with the facet type, bucket key, bucket object,
8
- * and the given SelectedFacets object.
9
- *
10
- * @param selectedFacets The SelectedFacets object whose buckets should be iterated over
11
- * @param fn The function to apply to each facet bucket.
12
- *
13
- * @example
14
- * forEachFacetBucket(
15
- * myFacets,
16
- * (facetType, bucketKey, bucket) => {
17
- * if (facetType === 'collection' && bucket.state === 'hidden') {
18
- * console.log(`Excluding any results in the ${bucketKey} collection`);
19
- * }
20
- * }
21
- * );
22
- */
23
- export function forEachFacetBucket(selectedFacets, fn) {
24
- if (!selectedFacets)
25
- return;
26
- for (const [facetType, facetBuckets] of Object.entries(selectedFacets)) {
27
- for (const [bucketKey, bucket] of Object.entries(facetBuckets)) {
28
- fn(facetType, bucketKey, bucket, selectedFacets);
29
- }
30
- }
31
- }
32
- /**
33
- * Returns a new SelectedFacets object having only the specified bucket changed to
34
- * reflect its new provided value. The bucket key is determined from the provided
35
- * `bucket` itself.
36
- * @param selectedFacets The SelectedFacets object to produce an updated clone of
37
- * @param facetType The type of facet to be modified (e.g., 'mediatype', 'subject', ...)
38
- * @param bucket The new bucket that should be present on the result
39
- * @param omitNoneState If set to true, the returned object will omit the given
40
- * bucket entirely if it is updated to state `'none'`. Default is false, which leaves
41
- * the `'none'` state in place.
42
- */
43
- export function updateSelectedFacetBucket(selectedFacets, facetType, bucket, omitNoneState = false) {
44
- const defaultedSelectedFacets = selectedFacets !== null && selectedFacets !== void 0 ? selectedFacets : getDefaultSelectedFacets();
45
- const newFacets = {
46
- ...defaultedSelectedFacets,
47
- [facetType]: {
48
- ...defaultedSelectedFacets[facetType],
49
- [bucket.key]: bucket,
50
- },
51
- };
52
- if (omitNoneState && bucket.state === 'none') {
53
- delete newFacets[facetType][bucket.key];
54
- }
55
- return newFacets;
56
- }
57
- /**
58
- * Creates a clone of the given SelectedFacets object.
59
- *
60
- * Note that the underlying FacetBucket objects are not deep-cloned -- they will
61
- * be references to the same objects as in the input. However, the objects
62
- * containing the FacetBuckets for each FacetOption are created anew.
63
- *
64
- * If the provided argument is undefined, returns an empty SelectedFacets object.
65
- *
66
- * @param selectedFacets The SelectedFacets object to be cloned
67
- */
68
- export function cloneSelectedFacets(selectedFacets) {
69
- const cloneResult = getDefaultSelectedFacets();
70
- forEachFacetBucket(selectedFacets, (facetType, bucketKey, bucket) => {
71
- cloneResult[facetType][bucketKey] = bucket;
72
- });
73
- return cloneResult;
74
- }
75
- /**
76
- * Creates a new SelectedFacets object representing a merge of the `source` facets object
77
- * into the `destination` facets object. Any facets existing in `source` take precedence
78
- * over those in `destination` in the event of conflicts.
79
- *
80
- * The resulting SelectedFacets object is normalized to omit any facet buckets whose
81
- * state is `'none'` in the merged result. Consequently, any facets buckets with state
82
- * `'none'` in `source` will always be absent from the end result. Likewise, any facet
83
- * buckets with state `'none'` in `destination` will be absent _unless_ they are also
84
- * present in `source` with a state of `'selected'` or `'hidden'` (in which case `source`
85
- * takes precedence as usual).
86
- *
87
- * @param source The source of the new facets to merge in. Any facet buckets existing in
88
- * this `source` object will take precedence over those in `destination` having the same
89
- * key, if they exist in both. Any facet buckets that are _not_ present in `source` will
90
- * remain unmodified from their state in `destination`, if they are present there at all.
91
- * @param destination The destination onto which facets should be merged. Note that this
92
- * object is _not_ re-used for the return value, but it is conceptually the "existing base"
93
- * onto which the source facets are merged.
94
- */
95
- export function mergeSelectedFacets(destination, source) {
96
- const mergeResult = cloneSelectedFacets(destination);
97
- forEachFacetBucket(source, (facetType, bucketKey, bucket) => {
98
- mergeResult[facetType][bucketKey] = bucket;
99
- });
100
- // Normalize any 'none' states on the result (from either source or destination)
101
- forEachFacetBucket(mergeResult, (facetType, bucketKey, bucket) => {
102
- if (bucket.state === 'none') {
103
- delete mergeResult[facetType][bucketKey];
104
- }
105
- });
106
- return mergeResult;
107
- }
108
- /**
109
- * Defines the order of states in which to display SelectedFacets buckets
110
- */
111
- const BUCKET_STATE_ORDER = ['selected', 'hidden', 'none'];
112
- /**
113
- * Sorts the provided FacetBuckets so that:
114
- * - Any selected items come first
115
- * - Any hidden items come after all the selected items
116
- * - Any unselected / unhidden items come last
117
- *
118
- * Within each of the above groups, the buckets will be sorted according to
119
- * the provided sort type, or by their bucket count by default.
120
- *
121
- * The sort is performed in-place using `Array.sort`, so the return value is
122
- * a reference to the same array that was passed in, only sorted.
123
- *
124
- * @param buckets The array of facet buckets to sort
125
- * @param sort (Optional) How buckets within each state group should be sorted.
126
- * Defaults to `AggregationSortType.COUNT` (i.e., descending by bucket count).
127
- */
128
- export function sortBucketsBySelectionState(buckets, sort = AggregationSortType.COUNT) {
129
- return buckets.sort((a, b) => {
130
- const aStateIndex = BUCKET_STATE_ORDER.indexOf(a.state);
131
- const bStateIndex = BUCKET_STATE_ORDER.indexOf(b.state);
132
- const stateDiff = aStateIndex - bStateIndex; // Sort bucket states primarily in the order defined by BUCKET_STATE_ORDER
133
- let secondaryDiff;
134
- if (sort === AggregationSortType.ALPHABETICAL) {
135
- secondaryDiff = a.key.localeCompare(b.key); // Ascending alphabetically by bucket key
136
- }
137
- else if (sort === AggregationSortType.NUMERIC) {
138
- secondaryDiff = Number(b.key) - Number(a.key); // Descending numerically by bucket key
139
- }
140
- else {
141
- secondaryDiff = b.count - a.count; // Descending by bucket count
142
- }
143
- return stateDiff || secondaryDiff; // Primary sort on state, secondary sort on the given sort type (defaulting to descending count)
144
- });
145
- }
1
+ import { AggregationSortType } from '@internetarchive/search-service';
2
+ import { getDefaultSelectedFacets, } from '../models';
3
+ // This file contains several helper functions designed to make working immutably
4
+ // with SelectedFacet objects and FacetGroups cleaner & easier.
5
+ /**
6
+ * Calls the given function for each FacetBucket specified in the given SelectedFacets
7
+ * object. The function is always called with the facet type, bucket key, bucket object,
8
+ * and the given SelectedFacets object.
9
+ *
10
+ * @param selectedFacets The SelectedFacets object whose buckets should be iterated over
11
+ * @param fn The function to apply to each facet bucket.
12
+ *
13
+ * @example
14
+ * forEachFacetBucket(
15
+ * myFacets,
16
+ * (facetType, bucketKey, bucket) => {
17
+ * if (facetType === 'collection' && bucket.state === 'hidden') {
18
+ * console.log(`Excluding any results in the ${bucketKey} collection`);
19
+ * }
20
+ * }
21
+ * );
22
+ */
23
+ export function forEachFacetBucket(selectedFacets, fn) {
24
+ if (!selectedFacets)
25
+ return;
26
+ for (const [facetType, facetBuckets] of Object.entries(selectedFacets)) {
27
+ for (const [bucketKey, bucket] of Object.entries(facetBuckets)) {
28
+ fn(facetType, bucketKey, bucket, selectedFacets);
29
+ }
30
+ }
31
+ }
32
+ /**
33
+ * Returns a new SelectedFacets object having only the specified bucket changed to
34
+ * reflect its new provided value. The bucket key is determined from the provided
35
+ * `bucket` itself.
36
+ * @param selectedFacets The SelectedFacets object to produce an updated clone of
37
+ * @param facetType The type of facet to be modified (e.g., 'mediatype', 'subject', ...)
38
+ * @param bucket The new bucket that should be present on the result
39
+ * @param omitNoneState If set to true, the returned object will omit the given
40
+ * bucket entirely if it is updated to state `'none'`. Default is false, which leaves
41
+ * the `'none'` state in place.
42
+ */
43
+ export function updateSelectedFacetBucket(selectedFacets, facetType, bucket, omitNoneState = false) {
44
+ const defaultedSelectedFacets = selectedFacets !== null && selectedFacets !== void 0 ? selectedFacets : getDefaultSelectedFacets();
45
+ const newFacets = {
46
+ ...defaultedSelectedFacets,
47
+ [facetType]: {
48
+ ...defaultedSelectedFacets[facetType],
49
+ [bucket.key]: bucket,
50
+ },
51
+ };
52
+ if (omitNoneState && bucket.state === 'none') {
53
+ delete newFacets[facetType][bucket.key];
54
+ }
55
+ return newFacets;
56
+ }
57
+ /**
58
+ * Creates a clone of the given SelectedFacets object.
59
+ *
60
+ * Note that the underlying FacetBucket objects are not deep-cloned -- they will
61
+ * be references to the same objects as in the input. However, the objects
62
+ * containing the FacetBuckets for each FacetOption are created anew.
63
+ *
64
+ * If the provided argument is undefined, returns an empty SelectedFacets object.
65
+ *
66
+ * @param selectedFacets The SelectedFacets object to be cloned
67
+ */
68
+ export function cloneSelectedFacets(selectedFacets) {
69
+ const cloneResult = getDefaultSelectedFacets();
70
+ forEachFacetBucket(selectedFacets, (facetType, bucketKey, bucket) => {
71
+ cloneResult[facetType][bucketKey] = bucket;
72
+ });
73
+ return cloneResult;
74
+ }
75
+ /**
76
+ * Creates a new SelectedFacets object representing a merge of the `source` facets object
77
+ * into the `destination` facets object. Any facets existing in `source` take precedence
78
+ * over those in `destination` in the event of conflicts.
79
+ *
80
+ * The resulting SelectedFacets object is normalized to omit any facet buckets whose
81
+ * state is `'none'` in the merged result. Consequently, any facets buckets with state
82
+ * `'none'` in `source` will always be absent from the end result. Likewise, any facet
83
+ * buckets with state `'none'` in `destination` will be absent _unless_ they are also
84
+ * present in `source` with a state of `'selected'` or `'hidden'` (in which case `source`
85
+ * takes precedence as usual).
86
+ *
87
+ * @param source The source of the new facets to merge in. Any facet buckets existing in
88
+ * this `source` object will take precedence over those in `destination` having the same
89
+ * key, if they exist in both. Any facet buckets that are _not_ present in `source` will
90
+ * remain unmodified from their state in `destination`, if they are present there at all.
91
+ * @param destination The destination onto which facets should be merged. Note that this
92
+ * object is _not_ re-used for the return value, but it is conceptually the "existing base"
93
+ * onto which the source facets are merged.
94
+ */
95
+ export function mergeSelectedFacets(destination, source) {
96
+ const mergeResult = cloneSelectedFacets(destination);
97
+ forEachFacetBucket(source, (facetType, bucketKey, bucket) => {
98
+ mergeResult[facetType][bucketKey] = bucket;
99
+ });
100
+ // Normalize any 'none' states on the result (from either source or destination)
101
+ forEachFacetBucket(mergeResult, (facetType, bucketKey, bucket) => {
102
+ if (bucket.state === 'none') {
103
+ delete mergeResult[facetType][bucketKey];
104
+ }
105
+ });
106
+ return mergeResult;
107
+ }
108
+ /**
109
+ * Defines the order of states in which to display SelectedFacets buckets
110
+ */
111
+ const BUCKET_STATE_ORDER = ['selected', 'hidden', 'none'];
112
+ /**
113
+ * Sorts the provided FacetBuckets so that:
114
+ * - Any selected items come first
115
+ * - Any hidden items come after all the selected items
116
+ * - Any unselected / unhidden items come last
117
+ *
118
+ * Within each of the above groups, the buckets will be sorted according to
119
+ * the provided sort type, or by their bucket count by default.
120
+ *
121
+ * The sort is performed in-place using `Array.sort`, so the return value is
122
+ * a reference to the same array that was passed in, only sorted.
123
+ *
124
+ * @param buckets The array of facet buckets to sort
125
+ * @param sort (Optional) How buckets within each state group should be sorted.
126
+ * Defaults to `AggregationSortType.COUNT` (i.e., descending by bucket count).
127
+ */
128
+ export function sortBucketsBySelectionState(buckets, sort = AggregationSortType.COUNT) {
129
+ return buckets.sort((a, b) => {
130
+ const aStateIndex = BUCKET_STATE_ORDER.indexOf(a.state);
131
+ const bStateIndex = BUCKET_STATE_ORDER.indexOf(b.state);
132
+ const stateDiff = aStateIndex - bStateIndex; // Sort bucket states primarily in the order defined by BUCKET_STATE_ORDER
133
+ let secondaryDiff;
134
+ if (sort === AggregationSortType.ALPHABETICAL) {
135
+ secondaryDiff = a.key.localeCompare(b.key); // Ascending alphabetically by bucket key
136
+ }
137
+ else if (sort === AggregationSortType.NUMERIC) {
138
+ secondaryDiff = Number(b.key) - Number(a.key); // Descending numerically by bucket key
139
+ }
140
+ else {
141
+ secondaryDiff = b.count - a.count; // Descending by bucket count
142
+ }
143
+ return stateDiff || secondaryDiff; // Primary sort on state, secondary sort on the given sort type (defaulting to descending count)
144
+ });
145
+ }
146
146
  //# sourceMappingURL=facet-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"facet-utils.js","sourceRoot":"","sources":["../../../src/utils/facet-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AggregationSortType } from '@internetarchive/search-service';\nimport {\n FacetOption,\n getDefaultSelectedFacets,\n type FacetBucket,\n type SelectedFacets,\n} from '../models';\n\n// This file contains several helper functions designed to make working immutably\n// with SelectedFacet objects and FacetGroups cleaner & easier.\n\n/**\n * Calls the given function for each FacetBucket specified in the given SelectedFacets\n * object. The function is always called with the facet type, bucket key, bucket object,\n * and the given SelectedFacets object.\n *\n * @param selectedFacets The SelectedFacets object whose buckets should be iterated over\n * @param fn The function to apply to each facet bucket.\n *\n * @example\n * forEachFacetBucket(\n * myFacets,\n * (facetType, bucketKey, bucket) => {\n * if (facetType === 'collection' && bucket.state === 'hidden') {\n * console.log(`Excluding any results in the ${bucketKey} collection`);\n * }\n * }\n * );\n */\nexport function forEachFacetBucket(\n selectedFacets: SelectedFacets | undefined,\n fn: (\n facetType: FacetOption,\n bucketKey: string,\n bucket: FacetBucket,\n selectedFacets: SelectedFacets\n ) => unknown\n): void {\n if (!selectedFacets) return;\n for (const [facetType, facetBuckets] of Object.entries(selectedFacets)) {\n for (const [bucketKey, bucket] of Object.entries(facetBuckets)) {\n fn(facetType as FacetOption, bucketKey, bucket, selectedFacets);\n }\n }\n}\n\n/**\n * Returns a new SelectedFacets object having only the specified bucket changed to\n * reflect its new provided value. The bucket key is determined from the provided\n * `bucket` itself.\n * @param selectedFacets The SelectedFacets object to produce an updated clone of\n * @param facetType The type of facet to be modified (e.g., 'mediatype', 'subject', ...)\n * @param bucket The new bucket that should be present on the result\n * @param omitNoneState If set to true, the returned object will omit the given\n * bucket entirely if it is updated to state `'none'`. Default is false, which leaves\n * the `'none'` state in place.\n */\nexport function updateSelectedFacetBucket(\n selectedFacets: SelectedFacets | undefined,\n facetType: FacetOption,\n bucket: FacetBucket,\n omitNoneState = false\n): SelectedFacets {\n const defaultedSelectedFacets = selectedFacets ?? getDefaultSelectedFacets();\n const newFacets = {\n ...defaultedSelectedFacets,\n [facetType]: {\n ...defaultedSelectedFacets[facetType],\n [bucket.key]: bucket,\n },\n };\n\n if (omitNoneState && bucket.state === 'none') {\n delete newFacets[facetType][bucket.key];\n }\n\n return newFacets;\n}\n\n/**\n * Creates a clone of the given SelectedFacets object.\n *\n * Note that the underlying FacetBucket objects are not deep-cloned -- they will\n * be references to the same objects as in the input. However, the objects\n * containing the FacetBuckets for each FacetOption are created anew.\n *\n * If the provided argument is undefined, returns an empty SelectedFacets object.\n *\n * @param selectedFacets The SelectedFacets object to be cloned\n */\nexport function cloneSelectedFacets(\n selectedFacets: SelectedFacets | undefined\n): SelectedFacets {\n const cloneResult = getDefaultSelectedFacets();\n forEachFacetBucket(selectedFacets, (facetType, bucketKey, bucket) => {\n cloneResult[facetType][bucketKey] = bucket;\n });\n return cloneResult;\n}\n\n/**\n * Creates a new SelectedFacets object representing a merge of the `source` facets object\n * into the `destination` facets object. Any facets existing in `source` take precedence\n * over those in `destination` in the event of conflicts.\n *\n * The resulting SelectedFacets object is normalized to omit any facet buckets whose\n * state is `'none'` in the merged result. Consequently, any facets buckets with state\n * `'none'` in `source` will always be absent from the end result. Likewise, any facet\n * buckets with state `'none'` in `destination` will be absent _unless_ they are also\n * present in `source` with a state of `'selected'` or `'hidden'` (in which case `source`\n * takes precedence as usual).\n *\n * @param source The source of the new facets to merge in. Any facet buckets existing in\n * this `source` object will take precedence over those in `destination` having the same\n * key, if they exist in both. Any facet buckets that are _not_ present in `source` will\n * remain unmodified from their state in `destination`, if they are present there at all.\n * @param destination The destination onto which facets should be merged. Note that this\n * object is _not_ re-used for the return value, but it is conceptually the \"existing base\"\n * onto which the source facets are merged.\n */\nexport function mergeSelectedFacets(\n destination: SelectedFacets | undefined,\n source: SelectedFacets | undefined\n): SelectedFacets {\n const mergeResult = cloneSelectedFacets(destination);\n forEachFacetBucket(source, (facetType, bucketKey, bucket) => {\n mergeResult[facetType][bucketKey] = bucket;\n });\n\n // Normalize any 'none' states on the result (from either source or destination)\n forEachFacetBucket(mergeResult, (facetType, bucketKey, bucket) => {\n if (bucket.state === 'none') {\n delete mergeResult[facetType][bucketKey];\n }\n });\n\n return mergeResult;\n}\n\n/**\n * Defines the order of states in which to display SelectedFacets buckets\n */\nconst BUCKET_STATE_ORDER = ['selected', 'hidden', 'none'];\n\n/**\n * Sorts the provided FacetBuckets so that:\n * - Any selected items come first\n * - Any hidden items come after all the selected items\n * - Any unselected / unhidden items come last\n *\n * Within each of the above groups, the buckets will be sorted according to\n * the provided sort type, or by their bucket count by default.\n *\n * The sort is performed in-place using `Array.sort`, so the return value is\n * a reference to the same array that was passed in, only sorted.\n *\n * @param buckets The array of facet buckets to sort\n * @param sort (Optional) How buckets within each state group should be sorted.\n * Defaults to `AggregationSortType.COUNT` (i.e., descending by bucket count).\n */\nexport function sortBucketsBySelectionState(\n buckets: FacetBucket[],\n sort = AggregationSortType.COUNT\n) {\n return buckets.sort((a, b) => {\n const aStateIndex = BUCKET_STATE_ORDER.indexOf(a.state);\n const bStateIndex = BUCKET_STATE_ORDER.indexOf(b.state);\n const stateDiff = aStateIndex - bStateIndex; // Sort bucket states primarily in the order defined by BUCKET_STATE_ORDER\n\n let secondaryDiff;\n if (sort === AggregationSortType.ALPHABETICAL) {\n secondaryDiff = a.key.localeCompare(b.key); // Ascending alphabetically by bucket key\n } else if (sort === AggregationSortType.NUMERIC) {\n secondaryDiff = Number(b.key) - Number(a.key); // Descending numerically by bucket key\n } else {\n secondaryDiff = b.count - a.count; // Descending by bucket count\n }\n\n return stateDiff || secondaryDiff; // Primary sort on state, secondary sort on the given sort type (defaulting to descending count)\n });\n}\n"]}
1
+ {"version":3,"file":"facet-utils.js","sourceRoot":"","sources":["../../../src/utils/facet-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AggregationSortType } from '@internetarchive/search-service';\nimport {\n FacetOption,\n getDefaultSelectedFacets,\n type FacetBucket,\n type SelectedFacets,\n} from '../models';\n\n// This file contains several helper functions designed to make working immutably\n// with SelectedFacet objects and FacetGroups cleaner & easier.\n\n/**\n * Calls the given function for each FacetBucket specified in the given SelectedFacets\n * object. The function is always called with the facet type, bucket key, bucket object,\n * and the given SelectedFacets object.\n *\n * @param selectedFacets The SelectedFacets object whose buckets should be iterated over\n * @param fn The function to apply to each facet bucket.\n *\n * @example\n * forEachFacetBucket(\n * myFacets,\n * (facetType, bucketKey, bucket) => {\n * if (facetType === 'collection' && bucket.state === 'hidden') {\n * console.log(`Excluding any results in the ${bucketKey} collection`);\n * }\n * }\n * );\n */\nexport function forEachFacetBucket(\n selectedFacets: SelectedFacets | undefined,\n fn: (\n facetType: FacetOption,\n bucketKey: string,\n bucket: FacetBucket,\n selectedFacets: SelectedFacets,\n ) => unknown,\n): void {\n if (!selectedFacets) return;\n for (const [facetType, facetBuckets] of Object.entries(selectedFacets)) {\n for (const [bucketKey, bucket] of Object.entries(facetBuckets)) {\n fn(facetType as FacetOption, bucketKey, bucket, selectedFacets);\n }\n }\n}\n\n/**\n * Returns a new SelectedFacets object having only the specified bucket changed to\n * reflect its new provided value. The bucket key is determined from the provided\n * `bucket` itself.\n * @param selectedFacets The SelectedFacets object to produce an updated clone of\n * @param facetType The type of facet to be modified (e.g., 'mediatype', 'subject', ...)\n * @param bucket The new bucket that should be present on the result\n * @param omitNoneState If set to true, the returned object will omit the given\n * bucket entirely if it is updated to state `'none'`. Default is false, which leaves\n * the `'none'` state in place.\n */\nexport function updateSelectedFacetBucket(\n selectedFacets: SelectedFacets | undefined,\n facetType: FacetOption,\n bucket: FacetBucket,\n omitNoneState = false,\n): SelectedFacets {\n const defaultedSelectedFacets = selectedFacets ?? getDefaultSelectedFacets();\n const newFacets = {\n ...defaultedSelectedFacets,\n [facetType]: {\n ...defaultedSelectedFacets[facetType],\n [bucket.key]: bucket,\n },\n };\n\n if (omitNoneState && bucket.state === 'none') {\n delete newFacets[facetType][bucket.key];\n }\n\n return newFacets;\n}\n\n/**\n * Creates a clone of the given SelectedFacets object.\n *\n * Note that the underlying FacetBucket objects are not deep-cloned -- they will\n * be references to the same objects as in the input. However, the objects\n * containing the FacetBuckets for each FacetOption are created anew.\n *\n * If the provided argument is undefined, returns an empty SelectedFacets object.\n *\n * @param selectedFacets The SelectedFacets object to be cloned\n */\nexport function cloneSelectedFacets(\n selectedFacets: SelectedFacets | undefined,\n): SelectedFacets {\n const cloneResult = getDefaultSelectedFacets();\n forEachFacetBucket(selectedFacets, (facetType, bucketKey, bucket) => {\n cloneResult[facetType][bucketKey] = bucket;\n });\n return cloneResult;\n}\n\n/**\n * Creates a new SelectedFacets object representing a merge of the `source` facets object\n * into the `destination` facets object. Any facets existing in `source` take precedence\n * over those in `destination` in the event of conflicts.\n *\n * The resulting SelectedFacets object is normalized to omit any facet buckets whose\n * state is `'none'` in the merged result. Consequently, any facets buckets with state\n * `'none'` in `source` will always be absent from the end result. Likewise, any facet\n * buckets with state `'none'` in `destination` will be absent _unless_ they are also\n * present in `source` with a state of `'selected'` or `'hidden'` (in which case `source`\n * takes precedence as usual).\n *\n * @param source The source of the new facets to merge in. Any facet buckets existing in\n * this `source` object will take precedence over those in `destination` having the same\n * key, if they exist in both. Any facet buckets that are _not_ present in `source` will\n * remain unmodified from their state in `destination`, if they are present there at all.\n * @param destination The destination onto which facets should be merged. Note that this\n * object is _not_ re-used for the return value, but it is conceptually the \"existing base\"\n * onto which the source facets are merged.\n */\nexport function mergeSelectedFacets(\n destination: SelectedFacets | undefined,\n source: SelectedFacets | undefined,\n): SelectedFacets {\n const mergeResult = cloneSelectedFacets(destination);\n forEachFacetBucket(source, (facetType, bucketKey, bucket) => {\n mergeResult[facetType][bucketKey] = bucket;\n });\n\n // Normalize any 'none' states on the result (from either source or destination)\n forEachFacetBucket(mergeResult, (facetType, bucketKey, bucket) => {\n if (bucket.state === 'none') {\n delete mergeResult[facetType][bucketKey];\n }\n });\n\n return mergeResult;\n}\n\n/**\n * Defines the order of states in which to display SelectedFacets buckets\n */\nconst BUCKET_STATE_ORDER = ['selected', 'hidden', 'none'];\n\n/**\n * Sorts the provided FacetBuckets so that:\n * - Any selected items come first\n * - Any hidden items come after all the selected items\n * - Any unselected / unhidden items come last\n *\n * Within each of the above groups, the buckets will be sorted according to\n * the provided sort type, or by their bucket count by default.\n *\n * The sort is performed in-place using `Array.sort`, so the return value is\n * a reference to the same array that was passed in, only sorted.\n *\n * @param buckets The array of facet buckets to sort\n * @param sort (Optional) How buckets within each state group should be sorted.\n * Defaults to `AggregationSortType.COUNT` (i.e., descending by bucket count).\n */\nexport function sortBucketsBySelectionState(\n buckets: FacetBucket[],\n sort = AggregationSortType.COUNT,\n) {\n return buckets.sort((a, b) => {\n const aStateIndex = BUCKET_STATE_ORDER.indexOf(a.state);\n const bStateIndex = BUCKET_STATE_ORDER.indexOf(b.state);\n const stateDiff = aStateIndex - bStateIndex; // Sort bucket states primarily in the order defined by BUCKET_STATE_ORDER\n\n let secondaryDiff;\n if (sort === AggregationSortType.ALPHABETICAL) {\n secondaryDiff = a.key.localeCompare(b.key); // Ascending alphabetically by bucket key\n } else if (sort === AggregationSortType.NUMERIC) {\n secondaryDiff = Number(b.key) - Number(a.key); // Descending numerically by bucket key\n } else {\n secondaryDiff = b.count - a.count; // Descending by bucket count\n }\n\n return stateDiff || secondaryDiff; // Primary sort on state, secondary sort on the given sort type (defaulting to descending count)\n });\n}\n"]}
@@ -1,7 +1,7 @@
1
- export declare type NumberFormat = 'short' | 'long';
2
- export declare type LabelFormat = 'short' | 'long';
3
- /**
4
- * Format a "count" number into short "icon" or longer text string.
5
- * For positive numbers only.
6
- */
7
- export declare function formatCount(count: number | undefined, numberFormat?: NumberFormat, labelFormat?: LabelFormat, locale?: string): string;
1
+ export type NumberFormat = 'short' | 'long';
2
+ export type LabelFormat = 'short' | 'long';
3
+ /**
4
+ * Format a "count" number into short "icon" or longer text string.
5
+ * For positive numbers only.
6
+ */
7
+ export declare function formatCount(count: number | undefined, numberFormat?: NumberFormat, labelFormat?: LabelFormat, locale?: string): string;