@internetarchive/collection-browser 3.3.2 → 3.3.4-alpha-webdev7761.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (543) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +27 -27
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/.prettierignore +1 -1
  8. package/LICENSE +661 -661
  9. package/README.md +83 -83
  10. package/dist/index.d.ts +16 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/src/app-root.d.ts +105 -0
  13. package/dist/src/app-root.js +1076 -0
  14. package/dist/src/app-root.js.map +1 -0
  15. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -0
  16. package/dist/src/assets/img/icons/arrow-left.js +10 -0
  17. package/dist/src/assets/img/icons/arrow-left.js.map +1 -0
  18. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
  19. package/dist/src/assets/img/icons/arrow-right.js +10 -0
  20. package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
  21. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  22. package/dist/src/assets/img/icons/chevron.js +4 -0
  23. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  24. package/dist/src/assets/img/icons/close-circle-dark.d.ts +2 -0
  25. package/dist/src/assets/img/icons/close-circle-dark.js +5 -0
  26. package/dist/src/assets/img/icons/close-circle-dark.js.map +1 -0
  27. package/dist/src/assets/img/icons/contract.d.ts +2 -0
  28. package/dist/src/assets/img/icons/contract.js +9 -0
  29. package/dist/src/assets/img/icons/contract.js.map +1 -0
  30. package/dist/src/assets/img/icons/empty-query.d.ts +2 -0
  31. package/dist/src/assets/img/icons/empty-query.js +5 -0
  32. package/dist/src/assets/img/icons/empty-query.js.map +1 -0
  33. package/dist/src/assets/img/icons/expand.d.ts +2 -0
  34. package/dist/src/assets/img/icons/expand.js +9 -0
  35. package/dist/src/assets/img/icons/expand.js.map +1 -0
  36. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  37. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  38. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  39. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  40. package/dist/src/assets/img/icons/eye.js +5 -0
  41. package/dist/src/assets/img/icons/eye.js.map +1 -0
  42. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -0
  43. package/dist/src/assets/img/icons/favorite-filled.js +10 -0
  44. package/dist/src/assets/img/icons/favorite-filled.js.map +1 -0
  45. package/dist/src/assets/img/icons/favorite-unfilled.d.ts +1 -0
  46. package/dist/src/assets/img/icons/favorite-unfilled.js +9 -0
  47. package/dist/src/assets/img/icons/favorite-unfilled.js.map +1 -0
  48. package/dist/src/assets/img/icons/filter.d.ts +2 -0
  49. package/dist/src/assets/img/icons/filter.js +10 -0
  50. package/dist/src/assets/img/icons/filter.js.map +1 -0
  51. package/dist/src/assets/img/icons/login-required.d.ts +1 -0
  52. package/dist/src/assets/img/icons/login-required.js +18 -0
  53. package/dist/src/assets/img/icons/login-required.js.map +1 -0
  54. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -0
  55. package/dist/src/assets/img/icons/mediatype/account.js +14 -0
  56. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -0
  57. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -0
  58. package/dist/src/assets/img/icons/mediatype/audio.js +14 -0
  59. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -0
  60. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -0
  61. package/dist/src/assets/img/icons/mediatype/collection.js +12 -0
  62. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -0
  63. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  64. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  65. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  66. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -0
  67. package/dist/src/assets/img/icons/mediatype/etree.js +14 -0
  68. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -0
  69. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -0
  70. package/dist/src/assets/img/icons/mediatype/film.js +14 -0
  71. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -0
  72. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -0
  73. package/dist/src/assets/img/icons/mediatype/images.js +13 -0
  74. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -0
  75. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  76. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  77. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  78. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -0
  79. package/dist/src/assets/img/icons/mediatype/search.js +14 -0
  80. package/dist/src/assets/img/icons/mediatype/search.js.map +1 -0
  81. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -0
  82. package/dist/src/assets/img/icons/mediatype/software.js +13 -0
  83. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -0
  84. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -0
  85. package/dist/src/assets/img/icons/mediatype/texts.js +13 -0
  86. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -0
  87. package/dist/src/assets/img/icons/mediatype/tv-commercial.d.ts +1 -0
  88. package/dist/src/assets/img/icons/mediatype/tv-commercial.js +12 -0
  89. package/dist/src/assets/img/icons/mediatype/tv-commercial.js.map +1 -0
  90. package/dist/src/assets/img/icons/mediatype/tv-fact-check.d.ts +1 -0
  91. package/dist/src/assets/img/icons/mediatype/tv-fact-check.js +12 -0
  92. package/dist/src/assets/img/icons/mediatype/tv-fact-check.js.map +1 -0
  93. package/dist/src/assets/img/icons/mediatype/tv-quote.d.ts +1 -0
  94. package/dist/src/assets/img/icons/mediatype/tv-quote.js +12 -0
  95. package/dist/src/assets/img/icons/mediatype/tv-quote.js.map +1 -0
  96. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -0
  97. package/dist/src/assets/img/icons/mediatype/tv.js +14 -0
  98. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -0
  99. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -0
  100. package/dist/src/assets/img/icons/mediatype/video.js +14 -0
  101. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -0
  102. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -0
  103. package/dist/src/assets/img/icons/mediatype/web.js +13 -0
  104. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -0
  105. package/dist/src/assets/img/icons/null-result.d.ts +2 -0
  106. package/dist/src/assets/img/icons/null-result.js +5 -0
  107. package/dist/src/assets/img/icons/null-result.js.map +1 -0
  108. package/dist/src/assets/img/icons/quote.d.ts +1 -0
  109. package/dist/src/assets/img/icons/quote.js +7 -0
  110. package/dist/src/assets/img/icons/quote.js.map +1 -0
  111. package/dist/src/assets/img/icons/restricted.d.ts +1 -0
  112. package/dist/src/assets/img/icons/restricted.js +13 -0
  113. package/dist/src/assets/img/icons/restricted.js.map +1 -0
  114. package/dist/src/assets/img/icons/reviews.d.ts +1 -0
  115. package/dist/src/assets/img/icons/reviews.js +11 -0
  116. package/dist/src/assets/img/icons/reviews.js.map +1 -0
  117. package/dist/src/assets/img/icons/upload.d.ts +1 -0
  118. package/dist/src/assets/img/icons/upload.js +12 -0
  119. package/dist/src/assets/img/icons/upload.js.map +1 -0
  120. package/dist/src/assets/img/icons/views.d.ts +1 -0
  121. package/dist/src/assets/img/icons/views.js +11 -0
  122. package/dist/src/assets/img/icons/views.js.map +1 -0
  123. package/dist/src/circular-activity-indicator.d.ts +5 -0
  124. package/dist/src/circular-activity-indicator.js +66 -0
  125. package/dist/src/circular-activity-indicator.js.map +1 -0
  126. package/dist/src/collection-browser.d.ts +692 -0
  127. package/dist/src/collection-browser.js +2669 -0
  128. package/dist/src/collection-browser.js.map +1 -0
  129. package/dist/src/collection-facets/facet-row.d.ts +30 -0
  130. package/dist/src/collection-facets/facet-row.js +266 -0
  131. package/dist/src/collection-facets/facet-row.js.map +1 -0
  132. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -0
  133. package/dist/src/collection-facets/facet-tombstone-row.js +43 -0
  134. package/dist/src/collection-facets/facet-tombstone-row.js.map +1 -0
  135. package/dist/src/collection-facets/facets-template.d.ts +13 -0
  136. package/dist/src/collection-facets/facets-template.js +68 -0
  137. package/dist/src/collection-facets/facets-template.js.map +1 -0
  138. package/dist/src/collection-facets/models.d.ts +9 -0
  139. package/dist/src/collection-facets/models.js +10 -0
  140. package/dist/src/collection-facets/models.js.map +1 -0
  141. package/dist/src/collection-facets/more-facets-content.d.ts +109 -0
  142. package/dist/src/collection-facets/more-facets-content.js +547 -0
  143. package/dist/src/collection-facets/more-facets-content.js.map +1 -0
  144. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -0
  145. package/dist/src/collection-facets/more-facets-pagination.js +264 -0
  146. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -0
  147. package/dist/src/collection-facets/smart-facets/dedupe.d.ts +10 -0
  148. package/dist/src/collection-facets/smart-facets/dedupe.js +35 -0
  149. package/dist/src/collection-facets/smart-facets/dedupe.js.map +1 -0
  150. package/dist/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.d.ts +5 -0
  151. package/dist/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.js +24 -0
  152. package/dist/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.js.map +1 -0
  153. package/dist/src/collection-facets/smart-facets/heuristics/index.d.ts +3 -0
  154. package/dist/src/collection-facets/smart-facets/heuristics/index.js +4 -0
  155. package/dist/src/collection-facets/smart-facets/heuristics/index.js.map +1 -0
  156. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.d.ts +4 -0
  157. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.js +14 -0
  158. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.js.map +1 -0
  159. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.d.ts +6 -0
  160. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.js +68 -0
  161. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.js.map +1 -0
  162. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.d.ts +9 -0
  163. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.js +69 -0
  164. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.js.map +1 -0
  165. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.d.ts +21 -0
  166. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js +76 -0
  167. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js.map +1 -0
  168. package/dist/src/collection-facets/smart-facets/models.d.ts +30 -0
  169. package/dist/src/collection-facets/smart-facets/models.js +2 -0
  170. package/dist/src/collection-facets/smart-facets/models.js.map +1 -0
  171. package/dist/src/collection-facets/smart-facets/smart-facet-bar.d.ts +54 -0
  172. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +383 -0
  173. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -0
  174. package/dist/src/collection-facets/smart-facets/smart-facet-button.d.ts +11 -0
  175. package/dist/src/collection-facets/smart-facets/smart-facet-button.js +133 -0
  176. package/dist/src/collection-facets/smart-facets/smart-facet-button.js.map +1 -0
  177. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.d.ts +28 -0
  178. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +172 -0
  179. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -0
  180. package/dist/src/collection-facets/smart-facets/smart-facet-equals.d.ts +2 -0
  181. package/dist/src/collection-facets/smart-facets/smart-facet-equals.js +13 -0
  182. package/dist/src/collection-facets/smart-facets/smart-facet-equals.js.map +1 -0
  183. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.d.ts +5 -0
  184. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js +18 -0
  185. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js.map +1 -0
  186. package/dist/src/collection-facets/toggle-switch.d.ts +41 -0
  187. package/dist/src/collection-facets/toggle-switch.js +174 -0
  188. package/dist/src/collection-facets/toggle-switch.js.map +1 -0
  189. package/dist/src/collection-facets.d.ts +113 -0
  190. package/dist/src/collection-facets.js +884 -0
  191. package/dist/src/collection-facets.js.map +1 -0
  192. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +270 -0
  193. package/dist/src/data-source/collection-browser-data-source-interface.js +2 -0
  194. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -0
  195. package/dist/src/data-source/collection-browser-data-source.d.ts +418 -0
  196. package/dist/src/data-source/collection-browser-data-source.js +1121 -0
  197. package/dist/src/data-source/collection-browser-data-source.js.map +1 -0
  198. package/dist/src/data-source/collection-browser-query-state.d.ts +48 -0
  199. package/dist/src/data-source/collection-browser-query-state.js +2 -0
  200. package/dist/src/data-source/collection-browser-query-state.js.map +1 -0
  201. package/dist/src/data-source/models.d.ts +43 -0
  202. package/dist/src/data-source/models.js +9 -0
  203. package/dist/src/data-source/models.js.map +1 -0
  204. package/dist/src/empty-placeholder.d.ts +23 -0
  205. package/dist/src/empty-placeholder.js +165 -0
  206. package/dist/src/empty-placeholder.js.map +1 -0
  207. package/dist/src/expanded-date-picker.d.ts +50 -0
  208. package/dist/src/expanded-date-picker.js +182 -0
  209. package/dist/src/expanded-date-picker.js.map +1 -0
  210. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  211. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  212. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  213. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  214. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  215. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  216. package/dist/src/manage/manage-bar.d.ts +58 -0
  217. package/dist/src/manage/manage-bar.js +237 -0
  218. package/dist/src/manage/manage-bar.js.map +1 -0
  219. package/dist/src/manage/remove-items-modal-content.d.ts +9 -0
  220. package/dist/src/manage/remove-items-modal-content.js +104 -0
  221. package/dist/src/manage/remove-items-modal-content.js.map +1 -0
  222. package/dist/src/mediatype/mediatype-config.d.ts +11 -0
  223. package/dist/src/mediatype/mediatype-config.js +116 -0
  224. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  225. package/dist/src/models.d.ts +298 -0
  226. package/dist/src/models.js +507 -0
  227. package/dist/src/models.js.map +1 -0
  228. package/dist/src/restoration-state-handler.d.ts +74 -0
  229. package/dist/src/restoration-state-handler.js +397 -0
  230. package/dist/src/restoration-state-handler.js.map +1 -0
  231. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -0
  232. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +60 -0
  233. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js.map +1 -0
  234. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -0
  235. package/dist/src/sort-filter-bar/alpha-bar.js +241 -0
  236. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -0
  237. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  238. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  239. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  240. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  241. package/dist/src/sort-filter-bar/img/list.js +5 -0
  242. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  243. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -0
  244. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +15 -0
  245. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js.map +1 -0
  246. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -0
  247. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +17 -0
  248. package/dist/src/sort-filter-bar/img/sort-toggle-down.js.map +1 -0
  249. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -0
  250. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +17 -0
  251. package/dist/src/sort-filter-bar/img/sort-toggle-up.js.map +1 -0
  252. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  253. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  254. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  255. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  256. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  257. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  258. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +278 -0
  259. package/dist/src/sort-filter-bar/sort-filter-bar.js +1161 -0
  260. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -0
  261. package/dist/src/styles/ia-button.d.ts +2 -0
  262. package/dist/src/styles/ia-button.js +134 -0
  263. package/dist/src/styles/ia-button.js.map +1 -0
  264. package/dist/src/styles/item-image-styles.d.ts +8 -0
  265. package/dist/src/styles/item-image-styles.js +123 -0
  266. package/dist/src/styles/item-image-styles.js.map +1 -0
  267. package/dist/src/styles/sr-only.d.ts +1 -0
  268. package/dist/src/styles/sr-only.js +18 -0
  269. package/dist/src/styles/sr-only.js.map +1 -0
  270. package/dist/src/tiles/base-tile-component.d.ts +27 -0
  271. package/dist/src/tiles/base-tile-component.js +82 -0
  272. package/dist/src/tiles/base-tile-component.js.map +1 -0
  273. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  274. package/dist/src/tiles/collection-browser-loading-tile.js +29 -0
  275. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  276. package/dist/src/tiles/grid/account-tile.d.ts +18 -0
  277. package/dist/src/tiles/grid/account-tile.js +111 -0
  278. package/dist/src/tiles/grid/account-tile.js.map +1 -0
  279. package/dist/src/tiles/grid/collection-tile.d.ts +15 -0
  280. package/dist/src/tiles/grid/collection-tile.js +160 -0
  281. package/dist/src/tiles/grid/collection-tile.js.map +1 -0
  282. package/dist/src/tiles/grid/item-tile.d.ts +41 -0
  283. package/dist/src/tiles/grid/item-tile.js +321 -0
  284. package/dist/src/tiles/grid/item-tile.js.map +1 -0
  285. package/dist/src/tiles/grid/search-tile.d.ts +10 -0
  286. package/dist/src/tiles/grid/search-tile.js +95 -0
  287. package/dist/src/tiles/grid/search-tile.js.map +1 -0
  288. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -0
  289. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +128 -0
  290. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js.map +1 -0
  291. package/dist/src/tiles/grid/tile-stats.d.ts +58 -0
  292. package/dist/src/tiles/grid/tile-stats.js +204 -0
  293. package/dist/src/tiles/grid/tile-stats.js.map +1 -0
  294. package/dist/src/tiles/hover/hover-pane-controller.d.ts +228 -0
  295. package/dist/src/tiles/hover/hover-pane-controller.js +446 -0
  296. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -0
  297. package/dist/src/tiles/hover/tile-hover-pane.d.ts +20 -0
  298. package/dist/src/tiles/hover/tile-hover-pane.js +185 -0
  299. package/dist/src/tiles/hover/tile-hover-pane.js.map +1 -0
  300. package/dist/src/tiles/image-block.d.ts +19 -0
  301. package/dist/src/tiles/image-block.js +175 -0
  302. package/dist/src/tiles/image-block.js.map +1 -0
  303. package/dist/src/tiles/item-image.d.ts +40 -0
  304. package/dist/src/tiles/item-image.js +191 -0
  305. package/dist/src/tiles/item-image.js.map +1 -0
  306. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -0
  307. package/dist/src/tiles/list/tile-list-compact-header.js +85 -0
  308. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  309. package/dist/src/tiles/list/tile-list-compact.d.ts +19 -0
  310. package/dist/src/tiles/list/tile-list-compact.js +223 -0
  311. package/dist/src/tiles/list/tile-list-compact.js.map +1 -0
  312. package/dist/src/tiles/list/tile-list.d.ts +54 -0
  313. package/dist/src/tiles/list/tile-list.js +621 -0
  314. package/dist/src/tiles/list/tile-list.js.map +1 -0
  315. package/dist/src/tiles/models.d.ts +1 -0
  316. package/dist/src/tiles/models.js +2 -0
  317. package/dist/src/tiles/models.js.map +1 -0
  318. package/dist/src/tiles/overlay/icon-overlay.d.ts +8 -0
  319. package/dist/src/tiles/overlay/icon-overlay.js +55 -0
  320. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -0
  321. package/dist/src/tiles/overlay/text-overlay.d.ts +9 -0
  322. package/dist/src/tiles/overlay/text-overlay.js +74 -0
  323. package/dist/src/tiles/overlay/text-overlay.js.map +1 -0
  324. package/dist/src/tiles/review-block.d.ts +12 -0
  325. package/dist/src/tiles/review-block.js +134 -0
  326. package/dist/src/tiles/review-block.js.map +1 -0
  327. package/dist/src/tiles/text-snippet-block.d.ts +27 -0
  328. package/dist/src/tiles/text-snippet-block.js +132 -0
  329. package/dist/src/tiles/text-snippet-block.js.map +1 -0
  330. package/dist/src/tiles/tile-dispatcher.d.ts +71 -0
  331. package/dist/src/tiles/tile-dispatcher.js +472 -0
  332. package/dist/src/tiles/tile-dispatcher.js.map +1 -0
  333. package/dist/src/tiles/tile-display-value-provider.d.ts +47 -0
  334. package/dist/src/tiles/tile-display-value-provider.js +95 -0
  335. package/dist/src/tiles/tile-display-value-provider.js.map +1 -0
  336. package/dist/src/tiles/tile-mediatype-icon.d.ts +27 -0
  337. package/dist/src/tiles/tile-mediatype-icon.js +130 -0
  338. package/dist/src/tiles/tile-mediatype-icon.js.map +1 -0
  339. package/dist/src/utils/analytics-events.d.ts +28 -0
  340. package/dist/src/utils/analytics-events.js +31 -0
  341. package/dist/src/utils/analytics-events.js.map +1 -0
  342. package/dist/src/utils/array-equals.d.ts +4 -0
  343. package/dist/src/utils/array-equals.js +11 -0
  344. package/dist/src/utils/array-equals.js.map +1 -0
  345. package/dist/src/utils/collapse-repeated-quotes.d.ts +11 -0
  346. package/dist/src/utils/collapse-repeated-quotes.js +14 -0
  347. package/dist/src/utils/collapse-repeated-quotes.js.map +1 -0
  348. package/dist/src/utils/facet-utils.d.ts +83 -0
  349. package/dist/src/utils/facet-utils.js +152 -0
  350. package/dist/src/utils/facet-utils.js.map +1 -0
  351. package/dist/src/utils/format-count.d.ts +7 -0
  352. package/dist/src/utils/format-count.js +76 -0
  353. package/dist/src/utils/format-count.js.map +1 -0
  354. package/dist/src/utils/format-date.d.ts +16 -0
  355. package/dist/src/utils/format-date.js +33 -0
  356. package/dist/src/utils/format-date.js.map +1 -0
  357. package/dist/src/utils/format-unit-size.d.ts +2 -0
  358. package/dist/src/utils/format-unit-size.js +34 -0
  359. package/dist/src/utils/format-unit-size.js.map +1 -0
  360. package/dist/src/utils/local-date-from-utc.d.ts +9 -0
  361. package/dist/src/utils/local-date-from-utc.js +16 -0
  362. package/dist/src/utils/local-date-from-utc.js.map +1 -0
  363. package/dist/src/utils/log.d.ts +7 -0
  364. package/dist/src/utils/log.js +14 -0
  365. package/dist/src/utils/log.js.map +1 -0
  366. package/dist/src/utils/resolve-mediatype.d.ts +8 -0
  367. package/dist/src/utils/resolve-mediatype.js +24 -0
  368. package/dist/src/utils/resolve-mediatype.js.map +1 -0
  369. package/dist/src/utils/sha1.d.ts +2 -0
  370. package/dist/src/utils/sha1.js +9 -0
  371. package/dist/src/utils/sha1.js.map +1 -0
  372. package/dist/test/collection-browser.test.d.ts +1 -0
  373. package/dist/test/collection-browser.test.js +1721 -0
  374. package/dist/test/collection-browser.test.js.map +1 -0
  375. package/dist/test/collection-facets/facet-row.test.d.ts +1 -0
  376. package/dist/test/collection-facets/facet-row.test.js +274 -0
  377. package/dist/test/collection-facets/facet-row.test.js.map +1 -0
  378. package/dist/test/collection-facets/facets-template.test.d.ts +1 -0
  379. package/dist/test/collection-facets/facets-template.test.js +101 -0
  380. package/dist/test/collection-facets/facets-template.test.js.map +1 -0
  381. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -0
  382. package/dist/test/collection-facets/more-facets-content.test.js +169 -0
  383. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -0
  384. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -0
  385. package/dist/test/collection-facets/more-facets-pagination.test.js +132 -0
  386. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -0
  387. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -0
  388. package/dist/test/collection-facets/toggle-switch.test.js +96 -0
  389. package/dist/test/collection-facets/toggle-switch.test.js.map +1 -0
  390. package/dist/test/collection-facets.test.d.ts +2 -0
  391. package/dist/test/collection-facets.test.js +745 -0
  392. package/dist/test/collection-facets.test.js.map +1 -0
  393. package/dist/test/data-source/collection-browser-data-source.test.d.ts +1 -0
  394. package/dist/test/data-source/collection-browser-data-source.test.js +102 -0
  395. package/dist/test/data-source/collection-browser-data-source.test.js.map +1 -0
  396. package/dist/test/empty-placeholder.test.d.ts +1 -0
  397. package/dist/test/empty-placeholder.test.js +63 -0
  398. package/dist/test/empty-placeholder.test.js.map +1 -0
  399. package/dist/test/expanded-date-picker.test.d.ts +1 -0
  400. package/dist/test/expanded-date-picker.test.js +130 -0
  401. package/dist/test/expanded-date-picker.test.js.map +1 -0
  402. package/dist/test/icon-overlay.test.d.ts +1 -0
  403. package/dist/test/icon-overlay.test.js +30 -0
  404. package/dist/test/icon-overlay.test.js.map +1 -0
  405. package/dist/test/image-block.test.d.ts +1 -0
  406. package/dist/test/image-block.test.js +218 -0
  407. package/dist/test/image-block.test.js.map +1 -0
  408. package/dist/test/item-image.test.d.ts +1 -0
  409. package/dist/test/item-image.test.js +196 -0
  410. package/dist/test/item-image.test.js.map +1 -0
  411. package/dist/test/manage/manage-bar.test.d.ts +2 -0
  412. package/dist/test/manage/manage-bar.test.js +106 -0
  413. package/dist/test/manage/manage-bar.test.js.map +1 -0
  414. package/dist/test/manage/remove-items-modal-content.test.d.ts +1 -0
  415. package/dist/test/manage/remove-items-modal-content.test.js +65 -0
  416. package/dist/test/manage/remove-items-modal-content.test.js.map +1 -0
  417. package/dist/test/mediatype-config.test.d.ts +1 -0
  418. package/dist/test/mediatype-config.test.js +11 -0
  419. package/dist/test/mediatype-config.test.js.map +1 -0
  420. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -0
  421. package/dist/test/mocks/mock-analytics-handler.js +16 -0
  422. package/dist/test/mocks/mock-analytics-handler.js.map +1 -0
  423. package/dist/test/mocks/mock-search-responses.d.ts +31 -0
  424. package/dist/test/mocks/mock-search-responses.js +1241 -0
  425. package/dist/test/mocks/mock-search-responses.js.map +1 -0
  426. package/dist/test/mocks/mock-search-service.d.ts +16 -0
  427. package/dist/test/mocks/mock-search-service.js +65 -0
  428. package/dist/test/mocks/mock-search-service.js.map +1 -0
  429. package/dist/test/restoration-state-handler.test.d.ts +1 -0
  430. package/dist/test/restoration-state-handler.test.js +343 -0
  431. package/dist/test/restoration-state-handler.test.js.map +1 -0
  432. package/dist/test/review-block.test.d.ts +1 -0
  433. package/dist/test/review-block.test.js +48 -0
  434. package/dist/test/review-block.test.js.map +1 -0
  435. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -0
  436. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +13 -0
  437. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js.map +1 -0
  438. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -0
  439. package/dist/test/sort-filter-bar/alpha-bar.test.js +74 -0
  440. package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -0
  441. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -0
  442. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +609 -0
  443. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -0
  444. package/dist/test/text-overlay.test.d.ts +1 -0
  445. package/dist/test/text-overlay.test.js +42 -0
  446. package/dist/test/text-overlay.test.js.map +1 -0
  447. package/dist/test/text-snippet-block.test.d.ts +1 -0
  448. package/dist/test/text-snippet-block.test.js +63 -0
  449. package/dist/test/text-snippet-block.test.js.map +1 -0
  450. package/dist/test/tile-stats.test.d.ts +1 -0
  451. package/dist/test/tile-stats.test.js +128 -0
  452. package/dist/test/tile-stats.test.js.map +1 -0
  453. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -0
  454. package/dist/test/tiles/grid/account-tile.test.js +96 -0
  455. package/dist/test/tiles/grid/account-tile.test.js.map +1 -0
  456. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -0
  457. package/dist/test/tiles/grid/collection-tile.test.js +96 -0
  458. package/dist/test/tiles/grid/collection-tile.test.js.map +1 -0
  459. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -0
  460. package/dist/test/tiles/grid/item-tile.test.js +427 -0
  461. package/dist/test/tiles/grid/item-tile.test.js.map +1 -0
  462. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -0
  463. package/dist/test/tiles/grid/search-tile.test.js +66 -0
  464. package/dist/test/tiles/grid/search-tile.test.js.map +1 -0
  465. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -0
  466. package/dist/test/tiles/hover/hover-pane-controller.test.js +329 -0
  467. package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -0
  468. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -0
  469. package/dist/test/tiles/hover/tile-hover-pane.test.js +57 -0
  470. package/dist/test/tiles/hover/tile-hover-pane.test.js.map +1 -0
  471. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -0
  472. package/dist/test/tiles/list/tile-list-compact.test.js +251 -0
  473. package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -0
  474. package/dist/test/tiles/list/tile-list.test.d.ts +1 -0
  475. package/dist/test/tiles/list/tile-list.test.js +469 -0
  476. package/dist/test/tiles/list/tile-list.test.js.map +1 -0
  477. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -0
  478. package/dist/test/tiles/tile-dispatcher.test.js +231 -0
  479. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -0
  480. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -0
  481. package/dist/test/tiles/tile-display-value-provider.test.js +142 -0
  482. package/dist/test/tiles/tile-display-value-provider.test.js.map +1 -0
  483. package/dist/test/tiles/tile-mediatype-icon.test.d.ts +1 -0
  484. package/dist/test/tiles/tile-mediatype-icon.test.js +145 -0
  485. package/dist/test/tiles/tile-mediatype-icon.test.js.map +1 -0
  486. package/dist/test/utils/array-equals.test.d.ts +1 -0
  487. package/dist/test/utils/array-equals.test.js +27 -0
  488. package/dist/test/utils/array-equals.test.js.map +1 -0
  489. package/dist/test/utils/format-count.test.d.ts +1 -0
  490. package/dist/test/utils/format-count.test.js +24 -0
  491. package/dist/test/utils/format-count.test.js.map +1 -0
  492. package/dist/test/utils/format-date.test.d.ts +1 -0
  493. package/dist/test/utils/format-date.test.js +61 -0
  494. package/dist/test/utils/format-date.test.js.map +1 -0
  495. package/dist/test/utils/format-unit-size.test.d.ts +1 -0
  496. package/dist/test/utils/format-unit-size.test.js +18 -0
  497. package/dist/test/utils/format-unit-size.test.js.map +1 -0
  498. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -0
  499. package/dist/test/utils/local-date-from-utc.test.js +27 -0
  500. package/dist/test/utils/local-date-from-utc.test.js.map +1 -0
  501. package/eslint.config.mjs +53 -53
  502. package/index.html +24 -24
  503. package/local.archive.org.cert +86 -86
  504. package/local.archive.org.key +27 -27
  505. package/package.json +118 -117
  506. package/renovate.json +6 -6
  507. package/src/collection-browser.ts +2954 -2829
  508. package/src/collection-facets/facet-row.ts +299 -296
  509. package/src/collection-facets/models.ts +10 -10
  510. package/src/collection-facets/more-facets-content.ts +639 -639
  511. package/src/collection-facets.ts +1005 -995
  512. package/src/data-source/collection-browser-data-source-interface.ts +345 -333
  513. package/src/data-source/collection-browser-data-source.ts +1441 -1401
  514. package/src/data-source/collection-browser-query-state.ts +59 -65
  515. package/src/data-source/models.ts +56 -43
  516. package/src/manage/manage-bar.ts +247 -247
  517. package/src/models.ts +866 -870
  518. package/src/restoration-state-handler.ts +542 -544
  519. package/src/tiles/base-tile-component.ts +65 -65
  520. package/src/tiles/grid/account-tile.ts +113 -113
  521. package/src/tiles/grid/collection-tile.ts +163 -163
  522. package/src/tiles/grid/item-tile.ts +340 -340
  523. package/src/tiles/grid/search-tile.ts +90 -90
  524. package/src/tiles/grid/styles/tile-grid-shared-styles.ts +130 -130
  525. package/src/tiles/hover/hover-pane-controller.ts +613 -517
  526. package/src/tiles/hover/tile-hover-pane.ts +184 -180
  527. package/src/tiles/list/tile-list-compact.ts +239 -239
  528. package/src/tiles/list/tile-list.ts +700 -700
  529. package/src/tiles/tile-dispatcher.ts +517 -490
  530. package/src/utils/format-date.ts +62 -62
  531. package/test/collection-browser.test.ts +2413 -2403
  532. package/test/collection-facets/facet-row.test.ts +375 -375
  533. package/test/collection-facets.test.ts +928 -928
  534. package/test/restoration-state-handler.test.ts +480 -510
  535. package/test/tiles/grid/item-tile.test.ts +520 -520
  536. package/test/tiles/hover/hover-pane-controller.test.ts +418 -353
  537. package/test/tiles/list/tile-list-compact.test.ts +282 -282
  538. package/test/tiles/list/tile-list.test.ts +552 -552
  539. package/test/tiles/tile-dispatcher.test.ts +283 -187
  540. package/test/utils/format-date.test.ts +89 -89
  541. package/tsconfig.json +20 -20
  542. package/web-dev-server.config.mjs +30 -30
  543. package/web-test-runner.config.mjs +41 -41
@@ -1,510 +1,480 @@
1
- import { SearchType } from '@internetarchive/search-service';
2
- import { expect } from '@open-wc/testing';
3
- import { SortField, getDefaultSelectedFacets } from '../src/models';
4
- import { RestorationStateHandler } from '../src/restoration-state-handler';
5
-
6
- describe('Restoration state handler', () => {
7
- it('should restore query from URL', async () => {
8
- const handler = new RestorationStateHandler({ context: 'search' });
9
-
10
- const url = new URL(window.location.href);
11
- url.search = '?query=boop';
12
- window.history.replaceState({ path: url.href }, '', url.href);
13
-
14
- const restorationState = handler.getRestorationState();
15
- expect(restorationState.baseQuery).to.equal('boop');
16
- });
17
-
18
- it('should restore default search type from URL without valid sin', async () => {
19
- const handler = new RestorationStateHandler({ context: 'search' });
20
-
21
- const url = new URL(window.location.href);
22
- url.search = '?sin=foo';
23
- window.history.replaceState({ path: url.href }, '', url.href);
24
-
25
- const restorationState = handler.getRestorationState();
26
- expect(restorationState.searchType).to.equal(SearchType.DEFAULT);
27
- });
28
-
29
- it('should restore default search type if sin explicitly empty in URL', async () => {
30
- const handler = new RestorationStateHandler({ context: 'search' });
31
-
32
- const url = new URL(window.location.href);
33
- url.search = '?sin=';
34
- window.history.replaceState({ path: url.href }, '', url.href);
35
-
36
- const restorationState = handler.getRestorationState();
37
- expect(restorationState.searchType).to.equal(SearchType.DEFAULT);
38
- });
39
-
40
- it('should restore full text search type from URL', async () => {
41
- const handler = new RestorationStateHandler({ context: 'search' });
42
-
43
- const url = new URL(window.location.href);
44
- url.search = '?sin=TXT';
45
- window.history.replaceState({ path: url.href }, '', url.href);
46
-
47
- const restorationState = handler.getRestorationState();
48
- expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);
49
- });
50
-
51
- it('should restore radio search type from URL', async () => {
52
- const handler = new RestorationStateHandler({ context: 'search' });
53
-
54
- const url = new URL(window.location.href);
55
- url.search = '?sin=RADIO';
56
- window.history.replaceState({ path: url.href }, '', url.href);
57
-
58
- const restorationState = handler.getRestorationState();
59
- expect(restorationState.searchType).to.equal(SearchType.RADIO);
60
- });
61
-
62
- it('should restore TV search type from URL', async () => {
63
- const handler = new RestorationStateHandler({ context: 'search' });
64
-
65
- const url = new URL(window.location.href);
66
- url.search = '?sin=TV';
67
- window.history.replaceState({ path: url.href }, '', url.href);
68
-
69
- const restorationState = handler.getRestorationState();
70
- expect(restorationState.searchType).to.equal(SearchType.TV);
71
- });
72
-
73
- it('should restore metadata search type from URL', async () => {
74
- const handler = new RestorationStateHandler({ context: 'search' });
75
-
76
- const url = new URL(window.location.href);
77
- url.search = '?sin=MD';
78
- window.history.replaceState({ path: url.href }, '', url.href);
79
-
80
- const restorationState = handler.getRestorationState();
81
- expect(restorationState.searchType).to.equal(SearchType.METADATA);
82
- });
83
-
84
- it('should restore page number from URL', async () => {
85
- const handler = new RestorationStateHandler({ context: 'search' });
86
-
87
- const url = new URL(window.location.href);
88
- url.search = '?page=42';
89
- window.history.replaceState({ path: url.href }, '', url.href);
90
-
91
- const restorationState = handler.getRestorationState();
92
- expect(restorationState.currentPage).to.equal(42);
93
- });
94
-
95
- it('should restore selected year facets from URL', async () => {
96
- const handler = new RestorationStateHandler({ context: 'search' });
97
-
98
- const url = new URL(window.location.href);
99
- url.search = '?and[]=year:"2018"';
100
- window.history.replaceState({ path: url.href }, '', url.href);
101
-
102
- const restorationState = handler.getRestorationState();
103
- expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(
104
- 'selected',
105
- );
106
- });
107
-
108
- it('should ignore unrecognized facet types in URL', async () => {
109
- const handler = new RestorationStateHandler({ context: 'search' });
110
-
111
- const url = new URL(window.location.href);
112
- url.search = '?and[]=foo:"bar"';
113
- window.history.replaceState({ path: url.href }, '', url.href);
114
-
115
- const restorationState = handler.getRestorationState();
116
- expect(restorationState.selectedFacets).to.deep.equal(
117
- getDefaultSelectedFacets(),
118
- );
119
- });
120
-
121
- it('should restore selected date range facets from URL', async () => {
122
- const handler = new RestorationStateHandler({ context: 'search' });
123
-
124
- const url = new URL(window.location.href);
125
- url.search = '?and[]=year:"2018+TO+2021"';
126
- window.history.replaceState({ path: url.href }, '', url.href);
127
-
128
- const restorationState = handler.getRestorationState();
129
- expect(restorationState.minSelectedDate).to.equal('2018');
130
- expect(restorationState.maxSelectedDate).to.equal('2021');
131
- });
132
-
133
- it('should restore creator filter from URL', async () => {
134
- const handler = new RestorationStateHandler({ context: 'search' });
135
-
136
- const url = new URL(window.location.href);
137
- url.search = '?and[]=firstCreator:F';
138
- window.history.replaceState({ path: url.href }, '', url.href);
139
-
140
- const restorationState = handler.getRestorationState();
141
- expect(restorationState.selectedCreatorFilter).to.equal('F');
142
- });
143
-
144
- it('should restore title filter from URL', async () => {
145
- const handler = new RestorationStateHandler({ context: 'search' });
146
-
147
- const url = new URL(window.location.href);
148
- url.search = '?and[]=firstTitle:F';
149
- window.history.replaceState({ path: url.href }, '', url.href);
150
-
151
- const restorationState = handler.getRestorationState();
152
- expect(restorationState.selectedTitleFilter).to.equal('F');
153
- });
154
-
155
- it('should restore other selected facets from URL', async () => {
156
- const handler = new RestorationStateHandler({ context: 'search' });
157
-
158
- const url = new URL(window.location.href);
159
- url.search = '?and[]=subject:"foo"';
160
- window.history.replaceState({ path: url.href }, '', url.href);
161
-
162
- const restorationState = handler.getRestorationState();
163
- expect(restorationState.selectedFacets.subject?.foo.state).to.equal(
164
- 'selected',
165
- );
166
- });
167
-
168
- it('should restore negative facets from URL', async () => {
169
- const handler = new RestorationStateHandler({ context: 'search' });
170
-
171
- const url = new URL(window.location.href);
172
- url.search = '?not[]=year:2018';
173
- window.history.replaceState({ path: url.href }, '', url.href);
174
-
175
- const restorationState = handler.getRestorationState();
176
- expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(
177
- 'hidden',
178
- );
179
- });
180
-
181
- it('should restore multiple selected/negative facets from URL', async () => {
182
- const handler = new RestorationStateHandler({ context: 'search' });
183
-
184
- const url = new URL(window.location.href);
185
- url.search =
186
- '?and[]=collection:"foo"&and[]=collection:"bar"&not[]=collection:"baz"&not[]=collection:"boop"';
187
- window.history.replaceState({ path: url.href }, '', url.href);
188
-
189
- const restorationState = handler.getRestorationState();
190
-
191
- expect(restorationState.selectedFacets.collection?.foo.state).to.equal(
192
- 'selected',
193
- );
194
- expect(restorationState.selectedFacets.collection?.bar.state).to.equal(
195
- 'selected',
196
- );
197
-
198
- expect(restorationState.selectedFacets.collection?.baz.state).to.equal(
199
- 'hidden',
200
- );
201
- expect(restorationState.selectedFacets.collection?.boop.state).to.equal(
202
- 'hidden',
203
- );
204
- });
205
-
206
- it('negative facets take precedence if both present in URL', async () => {
207
- const handler = new RestorationStateHandler({ context: 'search' });
208
-
209
- const url = new URL(window.location.href);
210
- url.search = '?and[]=collection:"foo"&not[]=collection:"foo"';
211
- window.history.replaceState({ path: url.href }, '', url.href);
212
-
213
- const restorationState = handler.getRestorationState();
214
- expect(restorationState.selectedFacets.collection?.foo.state).to.equal(
215
- 'hidden',
216
- );
217
- });
218
-
219
- it('should restore selected facets with numbers in the square brackets', async () => {
220
- const handler = new RestorationStateHandler({ context: 'search' });
221
-
222
- const url = new URL(window.location.href);
223
- url.search = '?and[12]=subject:"foo"';
224
- window.history.replaceState({ path: url.href }, '', url.href);
225
-
226
- const restorationState = handler.getRestorationState();
227
- expect(restorationState.selectedFacets.subject?.foo.state).to.equal(
228
- 'selected',
229
- );
230
- });
231
-
232
- it('should restore negative facets with numbers in the square brackets', async () => {
233
- const handler = new RestorationStateHandler({ context: 'search' });
234
-
235
- const url = new URL(window.location.href);
236
- url.search = '?not[12]=year:2018';
237
- window.history.replaceState({ path: url.href }, '', url.href);
238
-
239
- const restorationState = handler.getRestorationState();
240
- expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(
241
- 'hidden',
242
- );
243
- });
244
-
245
- it('should restore any TV clip filters from URL', async () => {
246
- const handler = new RestorationStateHandler({ context: 'search' });
247
- const url = new URL(window.location.href);
248
-
249
- // Commercials
250
- url.search = '?only_commercials=1';
251
- window.history.replaceState({ path: url.href }, '', url.href);
252
- const commercialsRestorationState = handler.getRestorationState();
253
- expect(commercialsRestorationState.tvClipFilter).to.equal('commercials');
254
-
255
- // Fact checks
256
- url.search = '?only_factchecks=1';
257
- window.history.replaceState({ path: url.href }, '', url.href);
258
- const factchecksRestorationState = handler.getRestorationState();
259
- expect(factchecksRestorationState.tvClipFilter).to.equal('factchecks');
260
-
261
- // Quotes
262
- url.search = '?only_quotes=1';
263
- window.history.replaceState({ path: url.href }, '', url.href);
264
- const quotesRestorationState = handler.getRestorationState();
265
- expect(quotesRestorationState.tvClipFilter).to.equal('quotes');
266
-
267
- // No filter param
268
- url.search = '';
269
- window.history.replaceState({ path: url.href }, '', url.href);
270
- const unfilteredRestorationState = handler.getRestorationState();
271
- expect(unfilteredRestorationState.tvClipFilter).not.to.exist;
272
- });
273
-
274
- it('should restore sort from URL (space format)', async () => {
275
- const handler = new RestorationStateHandler({ context: 'search' });
276
-
277
- const url = new URL(window.location.href);
278
- url.search = '?sort=date+desc';
279
- window.history.replaceState({ path: url.href }, '', url.href);
280
-
281
- const restorationState = handler.getRestorationState();
282
- expect(restorationState.selectedSort).to.equal('date');
283
- expect(restorationState.sortDirection).to.equal('desc');
284
- });
285
-
286
- it('should restore sort from URL (prefix format, desc)', async () => {
287
- const handler = new RestorationStateHandler({ context: 'search' });
288
-
289
- const url = new URL(window.location.href);
290
- url.search = '?sort=-date';
291
- window.history.replaceState({ path: url.href }, '', url.href);
292
-
293
- const restorationState = handler.getRestorationState();
294
- expect(restorationState.selectedSort).to.equal('date');
295
- expect(restorationState.sortDirection).to.equal('desc');
296
- });
297
-
298
- it('should restore sort from URL (prefix format, asc)', async () => {
299
- const handler = new RestorationStateHandler({ context: 'search' });
300
-
301
- const url = new URL(window.location.href);
302
- url.search = '?sort=date';
303
- window.history.replaceState({ path: url.href }, '', url.href);
304
-
305
- const restorationState = handler.getRestorationState();
306
- expect(restorationState.selectedSort).to.equal('date');
307
- expect(restorationState.sortDirection).to.equal('asc');
308
- });
309
-
310
- it('should restore sort from URL (space format)', async () => {
311
- const handler = new RestorationStateHandler({ context: 'search' });
312
-
313
- const url = new URL(window.location.href);
314
- url.search = '?sort=foo+desc';
315
- window.history.replaceState({ path: url.href }, '', url.href);
316
-
317
- const restorationState = handler.getRestorationState();
318
- expect(restorationState.selectedSort).to.equal('unrecognized');
319
- expect(restorationState.sortDirection).to.equal('desc');
320
- });
321
-
322
- it('should restore unrecognized sort from URL (prefix format)', async () => {
323
- const handler = new RestorationStateHandler({ context: 'search' });
324
-
325
- const url = new URL(window.location.href);
326
- url.search = '?sort=-foo';
327
- window.history.replaceState({ path: url.href }, '', url.href);
328
-
329
- const restorationState = handler.getRestorationState();
330
- expect(restorationState.selectedSort).to.equal('unrecognized');
331
- expect(restorationState.sortDirection).to.equal('desc');
332
- });
333
-
334
- it('should save direction to URL even for unrecognized sort fields', async () => {
335
- const url = new URL(window.location.href);
336
- url.search = '?sort=foo';
337
- window.history.replaceState({ path: url.href }, '', url.href);
338
-
339
- const handler = new RestorationStateHandler({ context: 'search' });
340
- handler.persistState({
341
- selectedSort: SortField.unrecognized,
342
- sortDirection: 'desc',
343
- selectedFacets: getDefaultSelectedFacets(),
344
- });
345
-
346
- expect(window.location.search).to.equal('?sort=-foo');
347
- });
348
-
349
- it('should keep existing direction for unrecognized sort fields when unspecified in state', async () => {
350
- const url = new URL(window.location.href);
351
- url.search = '?sort=foo+desc';
352
- window.history.replaceState({ path: url.href }, '', url.href);
353
-
354
- const handler = new RestorationStateHandler({ context: 'search' });
355
- handler.persistState({
356
- selectedSort: SortField.unrecognized,
357
- selectedFacets: getDefaultSelectedFacets(),
358
- });
359
-
360
- expect(window.location.search).to.equal('?sort=-foo');
361
- });
362
-
363
- it('should just ignore unrecognized sort fields w/ unknown formats', async () => {
364
- const url = new URL(window.location.href);
365
- url.search = '?sort=+foo';
366
- window.history.replaceState({ path: url.href }, '', url.href);
367
-
368
- const handler = new RestorationStateHandler({ context: 'search' });
369
- handler.persistState({
370
- selectedSort: SortField.unrecognized,
371
- selectedFacets: getDefaultSelectedFacets(),
372
- });
373
-
374
- expect(window.location.search).to.equal('?sort=+foo');
375
- });
376
-
377
- it('should not save current page state to the URL for page 1', async () => {
378
- const url = new URL(window.location.href);
379
- url.search = '';
380
- window.history.replaceState({ path: url.href }, '', url.href);
381
-
382
- const handler = new RestorationStateHandler({ context: 'search' });
383
- handler.persistState({
384
- currentPage: 1,
385
- selectedFacets: getDefaultSelectedFacets(),
386
- });
387
-
388
- expect(window.location.search).to.be.empty;
389
- });
390
-
391
- it('should save current page state to the URL when page > 1', async () => {
392
- const url = new URL(window.location.href);
393
- url.search = '';
394
- window.history.replaceState({ path: url.href }, '', url.href);
395
-
396
- const handler = new RestorationStateHandler({ context: 'search' });
397
- handler.persistState({
398
- currentPage: 2,
399
- selectedFacets: getDefaultSelectedFacets(),
400
- });
401
-
402
- expect(window.location.search).to.equal('?page=2');
403
- });
404
-
405
- it('should persist TV clip filter types to the URL', async () => {
406
- const url = new URL(window.location.href);
407
- url.search = '';
408
- window.history.replaceState({ path: url.href }, '', url.href);
409
-
410
- // Commercials
411
- const handler = new RestorationStateHandler({ context: 'search' });
412
- handler.persistState({
413
- tvClipFilter: 'commercials',
414
- selectedFacets: getDefaultSelectedFacets(),
415
- });
416
- expect(window.location.search).to.equal('?only_commercials=1');
417
-
418
- // Fact checks
419
- window.history.replaceState({ path: url.href }, '', url.href);
420
- handler.persistState({
421
- tvClipFilter: 'factchecks',
422
- selectedFacets: getDefaultSelectedFacets(),
423
- });
424
- expect(window.location.search).to.equal('?only_factchecks=1');
425
-
426
- // Quotes
427
- window.history.replaceState({ path: url.href }, '', url.href);
428
- handler.persistState({
429
- tvClipFilter: 'quotes',
430
- selectedFacets: getDefaultSelectedFacets(),
431
- });
432
- expect(window.location.search).to.equal('?only_quotes=1');
433
-
434
- // Unfiltered
435
- window.history.replaceState({ path: url.href }, '', url.href);
436
- handler.persistState({
437
- tvClipFilter: 'all',
438
- selectedFacets: getDefaultSelectedFacets(),
439
- });
440
- expect(window.location.search).to.equal('');
441
- });
442
-
443
- it('should upgrade legacy search params to new ones', async () => {
444
- const url = new URL(window.location.href);
445
- url.search = '?q=foo';
446
- window.history.replaceState({ path: url.href }, '', url.href);
447
-
448
- const handler = new RestorationStateHandler({ context: 'search' });
449
- const restorationState = handler.getRestorationState();
450
- expect(restorationState.baseQuery).to.equal('foo');
451
-
452
- handler.persistState(restorationState);
453
- expect(window.location.search).to.equal('?query=foo');
454
- });
455
-
456
- it('should remove empty sin param', async () => {
457
- const url = new URL(window.location.href);
458
- url.search = '?sin=';
459
- window.history.replaceState({ path: url.href }, '', url.href);
460
-
461
- const handler = new RestorationStateHandler({ context: 'search' });
462
-
463
- handler.persistState({ selectedFacets: getDefaultSelectedFacets() });
464
- expect(window.location.search).to.equal('');
465
- });
466
-
467
- it('should persist metadata search type only when option is true', async () => {
468
- const url = new URL(window.location.href);
469
- url.search = '?sin=';
470
- window.history.replaceState({ path: url.href }, '', url.href);
471
-
472
- const handler = new RestorationStateHandler({ context: 'search' });
473
-
474
- handler.persistState(
475
- {
476
- selectedFacets: getDefaultSelectedFacets(),
477
- searchType: SearchType.METADATA,
478
- },
479
- { persistMetadataSearchType: false },
480
- );
481
- expect(window.location.search).to.equal('');
482
-
483
- handler.persistState(
484
- {
485
- selectedFacets: getDefaultSelectedFacets(),
486
- searchType: SearchType.METADATA,
487
- },
488
- { persistMetadataSearchType: true },
489
- );
490
- expect(window.location.search).to.equal('?sin=MD');
491
- });
492
-
493
- it('round trip load/persist should erase numbers in square brackets', async () => {
494
- const handler = new RestorationStateHandler({ context: 'search' });
495
-
496
- const url = new URL(window.location.href);
497
- url.search = '?and[0]=subject:"foo"';
498
- window.history.replaceState({ path: url.href }, '', url.href);
499
-
500
- // Load state from the URL and immediately persist it back to the URL
501
- const restorationState = handler.getRestorationState();
502
- handler.persistState(restorationState);
503
-
504
- // Ensure the new URL includes the "normalized" facet parameter and not the numbered one
505
- expect(decodeURIComponent(window.location.search)).to.include(
506
- 'and[]=subject:"foo"',
507
- );
508
- expect(new URL(window.location.href).searchParams.get('and[0]')).to.be.null;
509
- });
510
- });
1
+ import { SearchType } from '@internetarchive/search-service';
2
+ import { expect } from '@open-wc/testing';
3
+ import { SortField, getDefaultSelectedFacets } from '../src/models';
4
+ import { RestorationStateHandler } from '../src/restoration-state-handler';
5
+
6
+ describe('Restoration state handler', () => {
7
+ it('should restore query from URL', async () => {
8
+ const handler = new RestorationStateHandler({ context: 'search' });
9
+
10
+ const url = new URL(window.location.href);
11
+ url.search = '?query=boop';
12
+ window.history.replaceState({ path: url.href }, '', url.href);
13
+
14
+ const restorationState = handler.getRestorationState();
15
+ expect(restorationState.baseQuery).to.equal('boop');
16
+ });
17
+
18
+ it('should restore default search type from URL without valid sin', async () => {
19
+ const handler = new RestorationStateHandler({ context: 'search' });
20
+
21
+ const url = new URL(window.location.href);
22
+ url.search = '?sin=foo';
23
+ window.history.replaceState({ path: url.href }, '', url.href);
24
+
25
+ const restorationState = handler.getRestorationState();
26
+ expect(restorationState.searchType).to.equal(SearchType.DEFAULT);
27
+ });
28
+
29
+ it('should restore default search type if sin explicitly empty in URL', async () => {
30
+ const handler = new RestorationStateHandler({ context: 'search' });
31
+
32
+ const url = new URL(window.location.href);
33
+ url.search = '?sin=';
34
+ window.history.replaceState({ path: url.href }, '', url.href);
35
+
36
+ const restorationState = handler.getRestorationState();
37
+ expect(restorationState.searchType).to.equal(SearchType.DEFAULT);
38
+ });
39
+
40
+ it('should restore full text search type from URL', async () => {
41
+ const handler = new RestorationStateHandler({ context: 'search' });
42
+
43
+ const url = new URL(window.location.href);
44
+ url.search = '?sin=TXT';
45
+ window.history.replaceState({ path: url.href }, '', url.href);
46
+
47
+ const restorationState = handler.getRestorationState();
48
+ expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);
49
+ });
50
+
51
+ it('should restore radio search type from URL', async () => {
52
+ const handler = new RestorationStateHandler({ context: 'search' });
53
+
54
+ const url = new URL(window.location.href);
55
+ url.search = '?sin=RADIO';
56
+ window.history.replaceState({ path: url.href }, '', url.href);
57
+
58
+ const restorationState = handler.getRestorationState();
59
+ expect(restorationState.searchType).to.equal(SearchType.RADIO);
60
+ });
61
+
62
+ it('should restore TV search type from URL', async () => {
63
+ const handler = new RestorationStateHandler({ context: 'search' });
64
+
65
+ const url = new URL(window.location.href);
66
+ url.search = '?sin=TV';
67
+ window.history.replaceState({ path: url.href }, '', url.href);
68
+
69
+ const restorationState = handler.getRestorationState();
70
+ expect(restorationState.searchType).to.equal(SearchType.TV);
71
+ });
72
+
73
+ it('should restore metadata search type from URL', async () => {
74
+ const handler = new RestorationStateHandler({ context: 'search' });
75
+
76
+ const url = new URL(window.location.href);
77
+ url.search = '?sin=MD';
78
+ window.history.replaceState({ path: url.href }, '', url.href);
79
+
80
+ const restorationState = handler.getRestorationState();
81
+ expect(restorationState.searchType).to.equal(SearchType.METADATA);
82
+ });
83
+
84
+ it('should restore page number from URL', async () => {
85
+ const handler = new RestorationStateHandler({ context: 'search' });
86
+
87
+ const url = new URL(window.location.href);
88
+ url.search = '?page=42';
89
+ window.history.replaceState({ path: url.href }, '', url.href);
90
+
91
+ const restorationState = handler.getRestorationState();
92
+ expect(restorationState.currentPage).to.equal(42);
93
+ });
94
+
95
+ it('should restore selected year facets from URL', async () => {
96
+ const handler = new RestorationStateHandler({ context: 'search' });
97
+
98
+ const url = new URL(window.location.href);
99
+ url.search = '?and[]=year:"2018"';
100
+ window.history.replaceState({ path: url.href }, '', url.href);
101
+
102
+ const restorationState = handler.getRestorationState();
103
+ expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(
104
+ 'selected',
105
+ );
106
+ });
107
+
108
+ it('should ignore unrecognized facet types in URL', async () => {
109
+ const handler = new RestorationStateHandler({ context: 'search' });
110
+
111
+ const url = new URL(window.location.href);
112
+ url.search = '?and[]=foo:"bar"';
113
+ window.history.replaceState({ path: url.href }, '', url.href);
114
+
115
+ const restorationState = handler.getRestorationState();
116
+ expect(restorationState.selectedFacets).to.deep.equal(
117
+ getDefaultSelectedFacets(),
118
+ );
119
+ });
120
+
121
+ it('should restore selected date range facets from URL', async () => {
122
+ const handler = new RestorationStateHandler({ context: 'search' });
123
+
124
+ const url = new URL(window.location.href);
125
+ url.search = '?and[]=year:"2018+TO+2021"';
126
+ window.history.replaceState({ path: url.href }, '', url.href);
127
+
128
+ const restorationState = handler.getRestorationState();
129
+ expect(restorationState.minSelectedDate).to.equal('2018');
130
+ expect(restorationState.maxSelectedDate).to.equal('2021');
131
+ });
132
+
133
+ it('should restore creator filter from URL', async () => {
134
+ const handler = new RestorationStateHandler({ context: 'search' });
135
+
136
+ const url = new URL(window.location.href);
137
+ url.search = '?and[]=firstCreator:F';
138
+ window.history.replaceState({ path: url.href }, '', url.href);
139
+
140
+ const restorationState = handler.getRestorationState();
141
+ expect(restorationState.selectedCreatorFilter).to.equal('F');
142
+ });
143
+
144
+ it('should restore title filter from URL', async () => {
145
+ const handler = new RestorationStateHandler({ context: 'search' });
146
+
147
+ const url = new URL(window.location.href);
148
+ url.search = '?and[]=firstTitle:F';
149
+ window.history.replaceState({ path: url.href }, '', url.href);
150
+
151
+ const restorationState = handler.getRestorationState();
152
+ expect(restorationState.selectedTitleFilter).to.equal('F');
153
+ });
154
+
155
+ it('should restore other selected facets from URL', async () => {
156
+ const handler = new RestorationStateHandler({ context: 'search' });
157
+
158
+ const url = new URL(window.location.href);
159
+ url.search = '?and[]=subject:"foo"';
160
+ window.history.replaceState({ path: url.href }, '', url.href);
161
+
162
+ const restorationState = handler.getRestorationState();
163
+ expect(restorationState.selectedFacets.subject?.foo.state).to.equal(
164
+ 'selected',
165
+ );
166
+ });
167
+
168
+ it('should restore negative facets from URL', async () => {
169
+ const handler = new RestorationStateHandler({ context: 'search' });
170
+
171
+ const url = new URL(window.location.href);
172
+ url.search = '?not[]=year:2018';
173
+ window.history.replaceState({ path: url.href }, '', url.href);
174
+
175
+ const restorationState = handler.getRestorationState();
176
+ expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(
177
+ 'hidden',
178
+ );
179
+ });
180
+
181
+ it('should restore multiple selected/negative facets from URL', async () => {
182
+ const handler = new RestorationStateHandler({ context: 'search' });
183
+
184
+ const url = new URL(window.location.href);
185
+ url.search =
186
+ '?and[]=collection:"foo"&and[]=collection:"bar"&not[]=collection:"baz"&not[]=collection:"boop"';
187
+ window.history.replaceState({ path: url.href }, '', url.href);
188
+
189
+ const restorationState = handler.getRestorationState();
190
+
191
+ expect(restorationState.selectedFacets.collection?.foo.state).to.equal(
192
+ 'selected',
193
+ );
194
+ expect(restorationState.selectedFacets.collection?.bar.state).to.equal(
195
+ 'selected',
196
+ );
197
+
198
+ expect(restorationState.selectedFacets.collection?.baz.state).to.equal(
199
+ 'hidden',
200
+ );
201
+ expect(restorationState.selectedFacets.collection?.boop.state).to.equal(
202
+ 'hidden',
203
+ );
204
+ });
205
+
206
+ it('negative facets take precedence if both present in URL', async () => {
207
+ const handler = new RestorationStateHandler({ context: 'search' });
208
+
209
+ const url = new URL(window.location.href);
210
+ url.search = '?and[]=collection:"foo"&not[]=collection:"foo"';
211
+ window.history.replaceState({ path: url.href }, '', url.href);
212
+
213
+ const restorationState = handler.getRestorationState();
214
+ expect(restorationState.selectedFacets.collection?.foo.state).to.equal(
215
+ 'hidden',
216
+ );
217
+ });
218
+
219
+ it('should restore selected facets with numbers in the square brackets', async () => {
220
+ const handler = new RestorationStateHandler({ context: 'search' });
221
+
222
+ const url = new URL(window.location.href);
223
+ url.search = '?and[12]=subject:"foo"';
224
+ window.history.replaceState({ path: url.href }, '', url.href);
225
+
226
+ const restorationState = handler.getRestorationState();
227
+ expect(restorationState.selectedFacets.subject?.foo.state).to.equal(
228
+ 'selected',
229
+ );
230
+ });
231
+
232
+ it('should restore negative facets with numbers in the square brackets', async () => {
233
+ const handler = new RestorationStateHandler({ context: 'search' });
234
+
235
+ const url = new URL(window.location.href);
236
+ url.search = '?not[12]=year:2018';
237
+ window.history.replaceState({ path: url.href }, '', url.href);
238
+
239
+ const restorationState = handler.getRestorationState();
240
+ expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(
241
+ 'hidden',
242
+ );
243
+ });
244
+
245
+ it('should restore any TV clip filters from URL', async () => {
246
+ const handler = new RestorationStateHandler({ context: 'search' });
247
+ const url = new URL(window.location.href);
248
+
249
+ // Commercials
250
+ url.search = '?only_commercials=1';
251
+ window.history.replaceState({ path: url.href }, '', url.href);
252
+ const commercialsRestorationState = handler.getRestorationState();
253
+ expect(
254
+ commercialsRestorationState.selectedFacets.clip_type?.commercial.state,
255
+ ).to.equal('selected');
256
+
257
+ // Fact checks
258
+ url.search = '?only_factchecks=1';
259
+ window.history.replaceState({ path: url.href }, '', url.href);
260
+ const factchecksRestorationState = handler.getRestorationState();
261
+ expect(
262
+ factchecksRestorationState.selectedFacets.clip_type?.['fact check'].state,
263
+ ).to.equal('selected');
264
+
265
+ // Quotes
266
+ url.search = '?only_quotes=1';
267
+ window.history.replaceState({ path: url.href }, '', url.href);
268
+ const quotesRestorationState = handler.getRestorationState();
269
+ expect(
270
+ quotesRestorationState.selectedFacets.clip_type?.quote.state,
271
+ ).to.equal('selected');
272
+
273
+ // No filter param
274
+ url.search = '';
275
+ window.history.replaceState({ path: url.href }, '', url.href);
276
+ const unfilteredRestorationState = handler.getRestorationState();
277
+ expect(unfilteredRestorationState.selectedFacets.clip_type).to.deep.equal(
278
+ {},
279
+ );
280
+ });
281
+
282
+ it('should restore sort from URL (space format)', async () => {
283
+ const handler = new RestorationStateHandler({ context: 'search' });
284
+
285
+ const url = new URL(window.location.href);
286
+ url.search = '?sort=date+desc';
287
+ window.history.replaceState({ path: url.href }, '', url.href);
288
+
289
+ const restorationState = handler.getRestorationState();
290
+ expect(restorationState.selectedSort).to.equal('date');
291
+ expect(restorationState.sortDirection).to.equal('desc');
292
+ });
293
+
294
+ it('should restore sort from URL (prefix format, desc)', async () => {
295
+ const handler = new RestorationStateHandler({ context: 'search' });
296
+
297
+ const url = new URL(window.location.href);
298
+ url.search = '?sort=-date';
299
+ window.history.replaceState({ path: url.href }, '', url.href);
300
+
301
+ const restorationState = handler.getRestorationState();
302
+ expect(restorationState.selectedSort).to.equal('date');
303
+ expect(restorationState.sortDirection).to.equal('desc');
304
+ });
305
+
306
+ it('should restore sort from URL (prefix format, asc)', async () => {
307
+ const handler = new RestorationStateHandler({ context: 'search' });
308
+
309
+ const url = new URL(window.location.href);
310
+ url.search = '?sort=date';
311
+ window.history.replaceState({ path: url.href }, '', url.href);
312
+
313
+ const restorationState = handler.getRestorationState();
314
+ expect(restorationState.selectedSort).to.equal('date');
315
+ expect(restorationState.sortDirection).to.equal('asc');
316
+ });
317
+
318
+ it('should restore sort from URL (space format)', async () => {
319
+ const handler = new RestorationStateHandler({ context: 'search' });
320
+
321
+ const url = new URL(window.location.href);
322
+ url.search = '?sort=foo+desc';
323
+ window.history.replaceState({ path: url.href }, '', url.href);
324
+
325
+ const restorationState = handler.getRestorationState();
326
+ expect(restorationState.selectedSort).to.equal('unrecognized');
327
+ expect(restorationState.sortDirection).to.equal('desc');
328
+ });
329
+
330
+ it('should restore unrecognized sort from URL (prefix format)', async () => {
331
+ const handler = new RestorationStateHandler({ context: 'search' });
332
+
333
+ const url = new URL(window.location.href);
334
+ url.search = '?sort=-foo';
335
+ window.history.replaceState({ path: url.href }, '', url.href);
336
+
337
+ const restorationState = handler.getRestorationState();
338
+ expect(restorationState.selectedSort).to.equal('unrecognized');
339
+ expect(restorationState.sortDirection).to.equal('desc');
340
+ });
341
+
342
+ it('should save direction to URL even for unrecognized sort fields', async () => {
343
+ const url = new URL(window.location.href);
344
+ url.search = '?sort=foo';
345
+ window.history.replaceState({ path: url.href }, '', url.href);
346
+
347
+ const handler = new RestorationStateHandler({ context: 'search' });
348
+ handler.persistState({
349
+ selectedSort: SortField.unrecognized,
350
+ sortDirection: 'desc',
351
+ selectedFacets: getDefaultSelectedFacets(),
352
+ });
353
+
354
+ expect(window.location.search).to.equal('?sort=-foo');
355
+ });
356
+
357
+ it('should keep existing direction for unrecognized sort fields when unspecified in state', async () => {
358
+ const url = new URL(window.location.href);
359
+ url.search = '?sort=foo+desc';
360
+ window.history.replaceState({ path: url.href }, '', url.href);
361
+
362
+ const handler = new RestorationStateHandler({ context: 'search' });
363
+ handler.persistState({
364
+ selectedSort: SortField.unrecognized,
365
+ selectedFacets: getDefaultSelectedFacets(),
366
+ });
367
+
368
+ expect(window.location.search).to.equal('?sort=-foo');
369
+ });
370
+
371
+ it('should just ignore unrecognized sort fields w/ unknown formats', async () => {
372
+ const url = new URL(window.location.href);
373
+ url.search = '?sort=+foo';
374
+ window.history.replaceState({ path: url.href }, '', url.href);
375
+
376
+ const handler = new RestorationStateHandler({ context: 'search' });
377
+ handler.persistState({
378
+ selectedSort: SortField.unrecognized,
379
+ selectedFacets: getDefaultSelectedFacets(),
380
+ });
381
+
382
+ expect(window.location.search).to.equal('?sort=+foo');
383
+ });
384
+
385
+ it('should not save current page state to the URL for page 1', async () => {
386
+ const url = new URL(window.location.href);
387
+ url.search = '';
388
+ window.history.replaceState({ path: url.href }, '', url.href);
389
+
390
+ const handler = new RestorationStateHandler({ context: 'search' });
391
+ handler.persistState({
392
+ currentPage: 1,
393
+ selectedFacets: getDefaultSelectedFacets(),
394
+ });
395
+
396
+ expect(window.location.search).to.be.empty;
397
+ });
398
+
399
+ it('should save current page state to the URL when page > 1', async () => {
400
+ const url = new URL(window.location.href);
401
+ url.search = '';
402
+ window.history.replaceState({ path: url.href }, '', url.href);
403
+
404
+ const handler = new RestorationStateHandler({ context: 'search' });
405
+ handler.persistState({
406
+ currentPage: 2,
407
+ selectedFacets: getDefaultSelectedFacets(),
408
+ });
409
+
410
+ expect(window.location.search).to.equal('?page=2');
411
+ });
412
+
413
+ it('should upgrade legacy search params to new ones', async () => {
414
+ const url = new URL(window.location.href);
415
+ url.search = '?q=foo';
416
+ window.history.replaceState({ path: url.href }, '', url.href);
417
+
418
+ const handler = new RestorationStateHandler({ context: 'search' });
419
+ const restorationState = handler.getRestorationState();
420
+ expect(restorationState.baseQuery).to.equal('foo');
421
+
422
+ handler.persistState(restorationState);
423
+ expect(window.location.search).to.equal('?query=foo');
424
+ });
425
+
426
+ it('should remove empty sin param', async () => {
427
+ const url = new URL(window.location.href);
428
+ url.search = '?sin=';
429
+ window.history.replaceState({ path: url.href }, '', url.href);
430
+
431
+ const handler = new RestorationStateHandler({ context: 'search' });
432
+
433
+ handler.persistState({ selectedFacets: getDefaultSelectedFacets() });
434
+ expect(window.location.search).to.equal('');
435
+ });
436
+
437
+ it('should persist metadata search type only when option is true', async () => {
438
+ const url = new URL(window.location.href);
439
+ url.search = '?sin=';
440
+ window.history.replaceState({ path: url.href }, '', url.href);
441
+
442
+ const handler = new RestorationStateHandler({ context: 'search' });
443
+
444
+ handler.persistState(
445
+ {
446
+ selectedFacets: getDefaultSelectedFacets(),
447
+ searchType: SearchType.METADATA,
448
+ },
449
+ { persistMetadataSearchType: false },
450
+ );
451
+ expect(window.location.search).to.equal('');
452
+
453
+ handler.persistState(
454
+ {
455
+ selectedFacets: getDefaultSelectedFacets(),
456
+ searchType: SearchType.METADATA,
457
+ },
458
+ { persistMetadataSearchType: true },
459
+ );
460
+ expect(window.location.search).to.equal('?sin=MD');
461
+ });
462
+
463
+ it('round trip load/persist should erase numbers in square brackets', async () => {
464
+ const handler = new RestorationStateHandler({ context: 'search' });
465
+
466
+ const url = new URL(window.location.href);
467
+ url.search = '?and[0]=subject:"foo"';
468
+ window.history.replaceState({ path: url.href }, '', url.href);
469
+
470
+ // Load state from the URL and immediately persist it back to the URL
471
+ const restorationState = handler.getRestorationState();
472
+ handler.persistState(restorationState);
473
+
474
+ // Ensure the new URL includes the "normalized" facet parameter and not the numbered one
475
+ expect(decodeURIComponent(window.location.search)).to.include(
476
+ 'and[]=subject:"foo"',
477
+ );
478
+ expect(new URL(window.location.href).searchParams.get('and[0]')).to.be.null;
479
+ });
480
+ });