@internetarchive/collection-browser 1.14.17-beta.5 → 1.14.18-alpha.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 (352) hide show
  1. package/.editorconfig +29 -29
  2. package/.husky/pre-commit +4 -4
  3. package/LICENSE +661 -661
  4. package/README.md +83 -83
  5. package/dist/index.d.ts +12 -11
  6. package/dist/index.js +12 -11
  7. package/dist/index.js.map +1 -1
  8. package/dist/src/app-root.d.ts +83 -83
  9. package/dist/src/app-root.js +438 -489
  10. package/dist/src/app-root.js.map +1 -1
  11. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  12. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  13. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  14. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  15. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  16. package/dist/src/assets/img/icons/chevron.js +2 -2
  17. package/dist/src/assets/img/icons/contract.d.ts +2 -2
  18. package/dist/src/assets/img/icons/contract.js +2 -2
  19. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  20. package/dist/src/assets/img/icons/empty-query.js +2 -2
  21. package/dist/src/assets/img/icons/expand.d.ts +2 -2
  22. package/dist/src/assets/img/icons/expand.js +2 -2
  23. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  24. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  25. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  26. package/dist/src/assets/img/icons/eye.js +2 -2
  27. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  28. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  29. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  30. package/dist/src/assets/img/icons/login-required.js +2 -2
  31. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  32. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  33. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  34. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  35. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  36. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  37. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  38. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  39. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  40. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  41. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  42. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  43. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  44. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  45. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/search.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  55. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  56. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  57. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  58. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  59. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  60. package/dist/src/assets/img/icons/null-result.js +2 -2
  61. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  62. package/dist/src/assets/img/icons/restricted.js +2 -2
  63. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  64. package/dist/src/assets/img/icons/reviews.js +2 -2
  65. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  66. package/dist/src/assets/img/icons/upload.js +2 -2
  67. package/dist/src/assets/img/icons/views.d.ts +1 -1
  68. package/dist/src/assets/img/icons/views.js +2 -2
  69. package/dist/src/circular-activity-indicator.d.ts +5 -5
  70. package/dist/src/circular-activity-indicator.js +17 -17
  71. package/dist/src/collection-browser.d.ts +384 -406
  72. package/dist/src/collection-browser.js +1342 -1363
  73. package/dist/src/collection-browser.js.map +1 -1
  74. package/dist/src/collection-facets/facet-row.d.ts +30 -30
  75. package/dist/src/collection-facets/facet-row.js +114 -114
  76. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  77. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  78. package/dist/src/collection-facets/facets-template.d.ts +17 -17
  79. package/dist/src/collection-facets/facets-template.js +114 -114
  80. package/dist/src/collection-facets/more-facets-content.d.ts +70 -70
  81. package/dist/src/collection-facets/more-facets-content.js +354 -369
  82. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  83. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  84. package/dist/src/collection-facets/more-facets-pagination.js +196 -196
  85. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  86. package/dist/src/collection-facets/toggle-switch.js +94 -94
  87. package/dist/src/collection-facets.d.ts +103 -103
  88. package/dist/src/collection-facets.js +513 -510
  89. package/dist/src/collection-facets.js.map +1 -1
  90. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +217 -0
  91. package/dist/src/data-source/collection-browser-data-source-interface.js +2 -0
  92. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -0
  93. package/dist/src/data-source/collection-browser-data-source.d.ts +352 -434
  94. package/dist/src/data-source/collection-browser-data-source.js +911 -800
  95. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  96. package/dist/src/data-source/collection-browser-query-state.d.ts +43 -0
  97. package/dist/src/data-source/collection-browser-query-state.js +2 -0
  98. package/dist/src/data-source/collection-browser-query-state.js.map +1 -0
  99. package/dist/src/data-source/models.d.ts +28 -62
  100. package/dist/src/data-source/models.js +8 -1
  101. package/dist/src/data-source/models.js.map +1 -1
  102. package/dist/src/empty-placeholder.d.ts +23 -23
  103. package/dist/src/empty-placeholder.js +74 -74
  104. package/dist/src/expanded-date-picker.d.ts +43 -43
  105. package/dist/src/expanded-date-picker.js +109 -109
  106. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  107. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  108. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  109. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  110. package/dist/src/manage/manage-bar.d.ts +26 -26
  111. package/dist/src/manage/manage-bar.js +53 -53
  112. package/dist/src/manage/manage-bar.js.map +1 -1
  113. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  114. package/dist/src/mediatype/mediatype-config.js +91 -91
  115. package/dist/src/models.d.ts +197 -180
  116. package/dist/src/models.js +380 -269
  117. package/dist/src/models.js.map +1 -1
  118. package/dist/src/restoration-state-handler.d.ts +70 -70
  119. package/dist/src/restoration-state-handler.js +355 -355
  120. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  121. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  122. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  123. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  124. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  125. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  126. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  127. package/dist/src/sort-filter-bar/img/list.js +2 -2
  128. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  129. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  130. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  131. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  132. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  133. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  134. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  135. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  136. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  137. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  138. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +210 -210
  139. package/dist/src/sort-filter-bar/sort-filter-bar.js +653 -652
  140. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  141. package/dist/src/styles/item-image-styles.d.ts +8 -8
  142. package/dist/src/styles/item-image-styles.js +9 -9
  143. package/dist/src/styles/sr-only.d.ts +1 -1
  144. package/dist/src/styles/sr-only.js +2 -2
  145. package/dist/src/tiles/base-tile-component.d.ts +19 -19
  146. package/dist/src/tiles/base-tile-component.js +63 -63
  147. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  148. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  149. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  150. package/dist/src/tiles/grid/account-tile.js +72 -72
  151. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  152. package/dist/src/tiles/grid/collection-tile.js +80 -80
  153. package/dist/src/tiles/grid/item-tile.d.ts +28 -27
  154. package/dist/src/tiles/grid/item-tile.js +162 -135
  155. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  156. package/dist/src/tiles/grid/search-tile.d.ts +10 -10
  157. package/dist/src/tiles/grid/search-tile.js +51 -51
  158. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  159. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  160. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  161. package/dist/src/tiles/grid/tile-stats.js +58 -53
  162. package/dist/src/tiles/grid/tile-stats.js.map +1 -1
  163. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  164. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  165. package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
  166. package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
  167. package/dist/src/tiles/image-block.d.ts +17 -17
  168. package/dist/src/tiles/image-block.js +73 -73
  169. package/dist/src/tiles/item-image.d.ts +39 -36
  170. package/dist/src/tiles/item-image.js +155 -127
  171. package/dist/src/tiles/item-image.js.map +1 -1
  172. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  173. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  174. package/dist/src/tiles/list/tile-list-compact.d.ts +15 -15
  175. package/dist/src/tiles/list/tile-list-compact.js +115 -115
  176. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  177. package/dist/src/tiles/list/tile-list.d.ts +47 -46
  178. package/dist/src/tiles/list/tile-list.js +327 -296
  179. package/dist/src/tiles/list/tile-list.js.map +1 -1
  180. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  181. package/dist/src/tiles/mediatype-icon.js +47 -47
  182. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  183. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  184. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  185. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  186. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  187. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  188. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  189. package/dist/src/tiles/text-snippet-block.js +73 -73
  190. package/dist/src/tiles/tile-dispatcher.d.ts +64 -64
  191. package/dist/src/tiles/tile-dispatcher.js +232 -231
  192. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  193. package/dist/src/tiles/tile-display-value-provider.d.ts +47 -43
  194. package/dist/src/tiles/tile-display-value-provider.js +94 -80
  195. package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
  196. package/dist/src/utils/analytics-events.d.ts +25 -25
  197. package/dist/src/utils/analytics-events.js +27 -27
  198. package/dist/src/utils/array-equals.d.ts +4 -4
  199. package/dist/src/utils/array-equals.js +10 -10
  200. package/dist/src/utils/collapse-repeated-quotes.d.ts +11 -0
  201. package/dist/src/utils/collapse-repeated-quotes.js +14 -0
  202. package/dist/src/utils/collapse-repeated-quotes.js.map +1 -0
  203. package/dist/src/utils/format-count.d.ts +7 -7
  204. package/dist/src/utils/format-count.js +76 -76
  205. package/dist/src/utils/format-date.d.ts +2 -2
  206. package/dist/src/utils/format-date.js +25 -25
  207. package/dist/src/utils/format-unit-size.d.ts +2 -2
  208. package/dist/src/utils/format-unit-size.js +33 -33
  209. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  210. package/dist/src/utils/local-date-from-utc.js +15 -15
  211. package/dist/src/utils/log.d.ts +7 -0
  212. package/dist/src/utils/log.js +16 -0
  213. package/dist/src/utils/log.js.map +1 -0
  214. package/dist/src/utils/resolve-mediatype.d.ts +8 -0
  215. package/dist/src/utils/resolve-mediatype.js +24 -0
  216. package/dist/src/utils/resolve-mediatype.js.map +1 -0
  217. package/dist/src/utils/sha1.d.ts +2 -2
  218. package/dist/src/utils/sha1.js +8 -8
  219. package/dist/test/collection-browser.test.d.ts +1 -1
  220. package/dist/test/collection-browser.test.js +1211 -1149
  221. package/dist/test/collection-browser.test.js.map +1 -1
  222. package/dist/test/collection-facets/facet-row.test.d.ts +1 -1
  223. package/dist/test/collection-facets/facet-row.test.js +203 -203
  224. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  225. package/dist/test/collection-facets/facets-template.test.js +105 -105
  226. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  227. package/dist/test/collection-facets/more-facets-content.test.js +133 -133
  228. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
  229. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  230. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  231. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  232. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  233. package/dist/test/collection-facets.test.d.ts +2 -2
  234. package/dist/test/collection-facets.test.js +653 -648
  235. package/dist/test/collection-facets.test.js.map +1 -1
  236. package/dist/test/data-source/collection-browser-data-source.test.d.ts +1 -0
  237. package/dist/test/data-source/collection-browser-data-source.test.js +80 -0
  238. package/dist/test/data-source/collection-browser-data-source.test.js.map +1 -0
  239. package/dist/test/empty-placeholder.test.d.ts +1 -1
  240. package/dist/test/empty-placeholder.test.js +63 -63
  241. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  242. package/dist/test/expanded-date-picker.test.js +95 -95
  243. package/dist/test/icon-overlay.test.d.ts +1 -1
  244. package/dist/test/icon-overlay.test.js +24 -24
  245. package/dist/test/image-block.test.d.ts +1 -1
  246. package/dist/test/image-block.test.js +48 -48
  247. package/dist/test/item-image.test.d.ts +1 -1
  248. package/dist/test/item-image.test.js +85 -86
  249. package/dist/test/item-image.test.js.map +1 -1
  250. package/dist/test/manage/manage-bar.test.d.ts +1 -1
  251. package/dist/test/manage/manage-bar.test.js +72 -72
  252. package/dist/test/mediatype-config.test.d.ts +1 -1
  253. package/dist/test/mediatype-config.test.js +16 -16
  254. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  255. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  256. package/dist/test/mocks/mock-search-responses.d.ts +24 -21
  257. package/dist/test/mocks/mock-search-responses.js +840 -709
  258. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  259. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  260. package/dist/test/mocks/mock-search-service.js +53 -50
  261. package/dist/test/mocks/mock-search-service.js.map +1 -1
  262. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  263. package/dist/test/restoration-state-handler.test.js +270 -270
  264. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  265. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  266. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  267. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  268. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  269. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +418 -418
  270. package/dist/test/text-overlay.test.d.ts +1 -1
  271. package/dist/test/text-overlay.test.js +48 -48
  272. package/dist/test/text-snippet-block.test.d.ts +1 -1
  273. package/dist/test/text-snippet-block.test.js +57 -57
  274. package/dist/test/tile-stats.test.d.ts +1 -1
  275. package/dist/test/tile-stats.test.js +95 -33
  276. package/dist/test/tile-stats.test.js.map +1 -1
  277. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  278. package/dist/test/tiles/grid/account-tile.test.js +76 -76
  279. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  280. package/dist/test/tiles/grid/collection-tile.test.js +73 -73
  281. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  282. package/dist/test/tiles/grid/item-tile.test.js +298 -254
  283. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  284. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -1
  285. package/dist/test/tiles/grid/search-tile.test.js +51 -51
  286. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  287. package/dist/test/tiles/hover/hover-pane-controller.test.js +259 -258
  288. package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -1
  289. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  290. package/dist/test/tiles/hover/tile-hover-pane.test.js +13 -13
  291. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  292. package/dist/test/tiles/list/tile-list-compact.test.js +143 -143
  293. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  294. package/dist/test/tiles/list/tile-list.test.js +283 -239
  295. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  296. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  297. package/dist/test/tiles/tile-dispatcher.test.js +106 -94
  298. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
  299. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  300. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  301. package/dist/test/utils/array-equals.test.d.ts +1 -1
  302. package/dist/test/utils/array-equals.test.js +26 -26
  303. package/dist/test/utils/format-count.test.d.ts +1 -1
  304. package/dist/test/utils/format-count.test.js +23 -23
  305. package/dist/test/utils/format-date.test.d.ts +1 -1
  306. package/dist/test/utils/format-date.test.js +17 -17
  307. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  308. package/dist/test/utils/format-unit-size.test.js +17 -17
  309. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  310. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  311. package/index.ts +3 -5
  312. package/local.archive.org.cert +86 -86
  313. package/local.archive.org.key +27 -27
  314. package/package.json +3 -4
  315. package/renovate.json +6 -6
  316. package/src/app-root.ts +30 -85
  317. package/src/collection-browser.ts +112 -139
  318. package/src/collection-facets/more-facets-content.ts +0 -19
  319. package/src/collection-facets.ts +6 -4
  320. package/src/data-source/collection-browser-data-source-interface.ts +272 -0
  321. package/src/data-source/collection-browser-data-source.ts +314 -379
  322. package/src/data-source/collection-browser-query-state.ts +54 -0
  323. package/src/data-source/models.ts +8 -45
  324. package/src/manage/manage-bar.ts +1 -1
  325. package/src/models.ts +164 -3
  326. package/src/sort-filter-bar/sort-filter-bar.ts +2 -1
  327. package/src/tiles/grid/item-tile.ts +36 -1
  328. package/src/tiles/grid/tile-stats.ts +12 -7
  329. package/src/tiles/item-image.ts +28 -0
  330. package/src/tiles/list/tile-list-compact.ts +1 -1
  331. package/src/tiles/list/tile-list.ts +43 -5
  332. package/src/tiles/tile-dispatcher.ts +2 -1
  333. package/src/tiles/tile-display-value-provider.ts +20 -2
  334. package/src/utils/collapse-repeated-quotes.ts +13 -0
  335. package/src/utils/log.ts +16 -0
  336. package/src/utils/resolve-mediatype.ts +26 -0
  337. package/test/collection-browser.test.ts +161 -50
  338. package/test/collection-facets/more-facets-content.test.ts +4 -2
  339. package/test/collection-facets.test.ts +5 -0
  340. package/test/data-source/collection-browser-data-source.test.ts +103 -0
  341. package/test/item-image.test.ts +34 -36
  342. package/test/mocks/mock-search-responses.ts +144 -0
  343. package/test/mocks/mock-search-service.ts +6 -0
  344. package/test/tile-stats.test.ts +104 -0
  345. package/test/tiles/grid/item-tile.test.ts +55 -0
  346. package/test/tiles/hover/hover-pane-controller.test.ts +19 -17
  347. package/test/tiles/list/tile-list.test.ts +55 -0
  348. package/test/tiles/tile-dispatcher.test.ts +13 -0
  349. package/tsconfig.json +21 -21
  350. package/web-dev-server.config.mjs +30 -30
  351. package/web-test-runner.config.mjs +41 -41
  352. package/types/sentry.d.ts +0 -1
@@ -1,1253 +1,1315 @@
1
- /* eslint-disable import/no-duplicates */
2
- import { aTimeout, expect, fixture } from '@open-wc/testing';
3
- import { html } from 'lit';
4
- import sinon from 'sinon';
5
- import { FilterConstraint, SearchType } from '@internetarchive/search-service';
6
- import '../src/collection-browser';
7
- import { getDefaultSelectedFacets, SortField, } from '../src/models';
8
- import { MockSearchService } from './mocks/mock-search-service';
9
- import { MockAnalyticsHandler } from './mocks/mock-analytics-handler';
10
- import { analyticsCategories } from '../src/utils/analytics-events';
11
- /**
12
- * Wait for the next tick of the event loop.
13
- *
14
- * This is necessary in some of the tests because certain collection browser
15
- * updates take more than one tick to render (e.g., date picker & query changes).
16
- * These delays are non-ideal and should eventually be investigated and fixed,
17
- * but they are minor enough that waiting for the next tick is a reasonable
18
- * testing solution for now.
19
- */
20
- const nextTick = () => aTimeout(0);
21
- describe('Collection Browser', () => {
22
- beforeEach(async () => {
23
- // Apparently query params set by one test can bleed into other tests.
24
- // Since collection browser restores its state from certain query params, we need
25
- // to clear these before each test to ensure they run in isolation from one another.
26
- const url = new URL(window.location.href);
27
- const { searchParams } = url;
28
- searchParams.delete('sin');
29
- searchParams.delete('sort');
30
- searchParams.delete('query');
31
- searchParams.delete('page');
32
- searchParams.delete('and[]');
33
- searchParams.delete('not[]');
34
- window.history.replaceState({}, '', url);
35
- });
36
- it('clears selected facets when requested', async () => {
37
- const selectedFacets = getDefaultSelectedFacets();
38
- selectedFacets.creator.foo = { count: 1, key: 'foo', state: 'selected' };
39
- const el = await fixture(html `<collection-browser></collection-browser>`);
40
- el.selectedFacets = selectedFacets;
41
- await el.updateComplete;
42
- el.clearFilters(); // By default, sort is not cleared
43
- expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());
44
- });
45
- it('clears existing filters but not sort by default', async () => {
46
- const el = await fixture(html `<collection-browser></collection-browser>`);
47
- el.selectedSort = 'title';
48
- el.sortDirection = 'asc';
49
- await el.updateComplete;
50
- el.clearFilters(); // By default, sort is not cleared
51
- expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());
52
- expect(el.selectedSort).to.equal('title');
53
- expect(el.sortDirection).to.equal('asc');
54
- expect(el.sortParam).to.deep.equal({
55
- field: 'titleSorter',
56
- direction: 'asc',
57
- });
58
- expect(el.selectedCreatorFilter).to.be.null;
59
- expect(el.selectedTitleFilter).to.be.null;
60
- });
61
- it('clears existing filters for facets & sort via option', async () => {
62
- const el = await fixture(html `<collection-browser></collection-browser>`);
63
- el.selectedSort = 'title';
64
- await el.updateComplete;
65
- el.clearFilters({ sort: true }); // Sort is reset too due to the option
66
- expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());
67
- expect(el.selectedSort).to.equal(SortField.default);
68
- expect(el.sortDirection).to.be.null;
69
- expect(el.sortParam).to.be.null;
70
- expect(el.selectedCreatorFilter).to.be.null;
71
- expect(el.selectedTitleFilter).to.be.null;
72
- });
73
- it('filterBy creator with analytics', async () => {
74
- const mockAnalyticsHandler = new MockAnalyticsHandler();
1
+ /* eslint-disable import/no-duplicates */
2
+ import { aTimeout, expect, fixture } from '@open-wc/testing';
3
+ import { html } from 'lit';
4
+ import sinon from 'sinon';
5
+ import { FilterConstraint, SearchType } from '@internetarchive/search-service';
6
+ import '../src/collection-browser';
7
+ import { getDefaultSelectedFacets, SortField, } from '../src/models';
8
+ import { MockSearchService } from './mocks/mock-search-service';
9
+ import { MockAnalyticsHandler } from './mocks/mock-analytics-handler';
10
+ import { analyticsCategories } from '../src/utils/analytics-events';
11
+ /**
12
+ * Wait for the next tick of the event loop.
13
+ *
14
+ * This is necessary in some of the tests because certain collection browser
15
+ * updates take more than one tick to render (e.g., date picker & query changes).
16
+ * These delays are non-ideal and should eventually be investigated and fixed,
17
+ * but they are minor enough that waiting for the next tick is a reasonable
18
+ * testing solution for now.
19
+ */
20
+ const nextTick = () => aTimeout(0);
21
+ describe('Collection Browser', () => {
22
+ beforeEach(async () => {
23
+ // Apparently query params set by one test can bleed into other tests.
24
+ // Since collection browser restores its state from certain query params, we need
25
+ // to clear these before each test to ensure they run in isolation from one another.
26
+ const url = new URL(window.location.href);
27
+ const { searchParams } = url;
28
+ searchParams.delete('sin');
29
+ searchParams.delete('sort');
30
+ searchParams.delete('query');
31
+ searchParams.delete('page');
32
+ searchParams.delete('and[]');
33
+ searchParams.delete('not[]');
34
+ window.history.replaceState({}, '', url);
35
+ });
36
+ it('clears selected facets when requested', async () => {
37
+ const selectedFacets = getDefaultSelectedFacets();
38
+ selectedFacets.creator.foo = { count: 1, key: 'foo', state: 'selected' };
39
+ const el = await fixture(html `<collection-browser></collection-browser>`);
40
+ el.selectedFacets = selectedFacets;
41
+ await el.updateComplete;
42
+ el.clearFilters(); // By default, sort is not cleared
43
+ expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());
44
+ });
45
+ it('clears existing filters but not sort by default', async () => {
46
+ const el = await fixture(html `<collection-browser></collection-browser>`);
47
+ el.selectedSort = 'title';
48
+ el.sortDirection = 'asc';
49
+ await el.updateComplete;
50
+ el.clearFilters(); // By default, sort is not cleared
51
+ expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());
52
+ expect(el.selectedSort).to.equal('title');
53
+ expect(el.sortDirection).to.equal('asc');
54
+ expect(el.sortParam).to.deep.equal({
55
+ field: 'titleSorter',
56
+ direction: 'asc',
57
+ });
58
+ expect(el.selectedCreatorFilter).to.be.null;
59
+ expect(el.selectedTitleFilter).to.be.null;
60
+ });
61
+ it('clears existing filters for facets & sort via option', async () => {
62
+ const el = await fixture(html `<collection-browser></collection-browser>`);
63
+ el.selectedSort = 'title';
64
+ await el.updateComplete;
65
+ el.clearFilters({ sort: true }); // Sort is reset too due to the option
66
+ expect(el.selectedFacets).to.deep.equal(getDefaultSelectedFacets());
67
+ expect(el.selectedSort).to.equal(SortField.default);
68
+ expect(el.sortDirection).to.be.null;
69
+ expect(el.sortParam).to.be.null;
70
+ expect(el.selectedCreatorFilter).to.be.null;
71
+ expect(el.selectedTitleFilter).to.be.null;
72
+ });
73
+ it('filterBy creator with analytics', async () => {
74
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
75
75
  const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
76
- </collection-browser>`);
77
- el.searchContext = 'betaSearchService';
78
- el.selectedSort = 'creator';
79
- el.sortDirection = 'asc';
80
- el.selectedCreatorFilter = 'A';
81
- await el.updateComplete;
82
- expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
83
- expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
84
- expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
85
- el.clearFilters();
86
- await el.updateComplete;
87
- expect(el.selectedTitleFilter).to.be.null;
88
- expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
89
- expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
90
- expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
91
- });
92
- it('filterBy title with analytics', async () => {
93
- const mockAnalyticsHandler = new MockAnalyticsHandler();
76
+ </collection-browser>`);
77
+ el.searchContext = 'betaSearchService';
78
+ el.selectedSort = 'creator';
79
+ el.sortDirection = 'asc';
80
+ el.selectedCreatorFilter = 'A';
81
+ await el.updateComplete;
82
+ expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
83
+ expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
84
+ expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
85
+ el.clearFilters();
86
+ await el.updateComplete;
87
+ expect(el.selectedTitleFilter).to.be.null;
88
+ expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
89
+ expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
90
+ expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
91
+ });
92
+ it('filterBy title with analytics', async () => {
93
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
94
94
  const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
95
- </collection-browser>`);
96
- el.searchContext = 'beta-search-service';
97
- el.selectedSort = 'title';
98
- el.sortDirection = 'asc';
99
- el.selectedTitleFilter = 'A';
100
- await el.updateComplete;
101
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
102
- expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
103
- expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
104
- el.clearFilters();
105
- await el.updateComplete;
106
- expect(el.selectedTitleFilter).to.be.null;
107
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
108
- expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
109
- expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
110
- });
111
- it('selected facets with analytics - not negative facets', async () => {
112
- const mockAnalyticsHandler = new MockAnalyticsHandler();
113
- const mediaTypeBucket = { count: 123, state: 'selected' };
114
- const mockedSelectedFacets = {
115
- subject: {},
116
- lending: {},
117
- mediatype: { data: mediaTypeBucket },
118
- language: {},
119
- creator: {},
120
- collection: {},
121
- year: {},
122
- };
95
+ </collection-browser>`);
96
+ el.searchContext = 'beta-search-service';
97
+ el.selectedSort = 'title';
98
+ el.sortDirection = 'asc';
99
+ el.selectedTitleFilter = 'A';
100
+ await el.updateComplete;
101
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
102
+ expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
103
+ expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
104
+ el.clearFilters();
105
+ await el.updateComplete;
106
+ expect(el.selectedTitleFilter).to.be.null;
107
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
108
+ expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
109
+ expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
110
+ });
111
+ it('selected facets with analytics - not negative facets', async () => {
112
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
113
+ const mediaTypeBucket = { count: 123, state: 'selected' };
114
+ const mockedSelectedFacets = {
115
+ subject: {},
116
+ lending: {},
117
+ mediatype: { data: mediaTypeBucket },
118
+ language: {},
119
+ creator: {},
120
+ collection: {},
121
+ year: {},
122
+ };
123
123
  const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
124
- </collection-browser>`);
125
- el.searchContext = 'search-service';
126
- el.selectedFacets = mockedSelectedFacets;
127
- await el.updateComplete;
128
- el.facetClickHandler(new CustomEvent('facetClick', {
129
- detail: {
130
- facetType: 'mediatype',
131
- bucket: {
132
- key: '',
133
- state: 'selected',
134
- count: 123,
135
- },
136
- negative: false,
137
- },
138
- }));
139
- expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
140
- expect(mockAnalyticsHandler.callAction).to.equal('facetSelected');
141
- expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
142
- el.facetClickHandler(new CustomEvent('facetClick', {
143
- detail: {
144
- facetType: 'mediatype',
145
- bucket: {
146
- key: '',
147
- state: 'none',
148
- count: 123,
149
- },
150
- negative: false,
151
- },
152
- }));
153
- expect(el.selectedFacets).to.equal(mockedSelectedFacets);
154
- expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
155
- expect(mockAnalyticsHandler.callAction).to.equal('facetDeselected');
156
- expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
157
- });
158
- it('selected facets with analytics - negative facets', async () => {
159
- const mockAnalyticsHandler = new MockAnalyticsHandler();
160
- const mediaTypeBucket = { count: 123, state: 'selected' };
161
- const mockedSelectedFacets = {
162
- subject: {},
163
- lending: {},
164
- mediatype: { data: mediaTypeBucket },
165
- language: {},
166
- creator: {},
167
- collection: {},
168
- year: {},
169
- };
124
+ </collection-browser>`);
125
+ el.searchContext = 'search-service';
126
+ el.selectedFacets = mockedSelectedFacets;
127
+ await el.updateComplete;
128
+ el.facetClickHandler(new CustomEvent('facetClick', {
129
+ detail: {
130
+ facetType: 'mediatype',
131
+ bucket: {
132
+ key: '',
133
+ state: 'selected',
134
+ count: 123,
135
+ },
136
+ negative: false,
137
+ },
138
+ }));
139
+ expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
140
+ expect(mockAnalyticsHandler.callAction).to.equal('facetSelected');
141
+ expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
142
+ el.facetClickHandler(new CustomEvent('facetClick', {
143
+ detail: {
144
+ facetType: 'mediatype',
145
+ bucket: {
146
+ key: '',
147
+ state: 'none',
148
+ count: 123,
149
+ },
150
+ negative: false,
151
+ },
152
+ }));
153
+ expect(el.selectedFacets).to.equal(mockedSelectedFacets);
154
+ expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
155
+ expect(mockAnalyticsHandler.callAction).to.equal('facetDeselected');
156
+ expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
157
+ });
158
+ it('selected facets with analytics - negative facets', async () => {
159
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
160
+ const mediaTypeBucket = { count: 123, state: 'selected' };
161
+ const mockedSelectedFacets = {
162
+ subject: {},
163
+ lending: {},
164
+ mediatype: { data: mediaTypeBucket },
165
+ language: {},
166
+ creator: {},
167
+ collection: {},
168
+ year: {},
169
+ };
170
170
  const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
171
- </collection-browser>`);
172
- el.searchContext = 'beta-search-service';
173
- el.selectedFacets = mockedSelectedFacets;
174
- await el.updateComplete;
175
- el.facetClickHandler(new CustomEvent('facetClick', {
176
- detail: {
177
- facetType: 'mediatype',
178
- bucket: {
179
- key: '',
180
- state: 'hidden',
181
- count: 123,
182
- },
183
- negative: true,
184
- },
185
- }));
186
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
187
- expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeSelected');
188
- expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
189
- el.facetClickHandler(new CustomEvent('facetClick', {
190
- detail: {
191
- facetType: 'mediatype',
192
- bucket: {
193
- key: '',
194
- state: 'none',
195
- count: 123,
196
- },
197
- negative: true,
198
- },
199
- }));
200
- expect(el.selectedFacets).to.equal(mockedSelectedFacets);
201
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
202
- expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeDeselected');
203
- expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
204
- });
205
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
206
- // SKIPPING FOR NOW TO GET CI GREEN.
207
- // this one has placeholder type issue
208
- it.skip('should render with a sort bar, facets, and infinite scroller', async () => {
209
- var _a, _b, _c;
210
- const searchService = new MockSearchService();
171
+ </collection-browser>`);
172
+ el.searchContext = 'beta-search-service';
173
+ el.selectedFacets = mockedSelectedFacets;
174
+ await el.updateComplete;
175
+ el.facetClickHandler(new CustomEvent('facetClick', {
176
+ detail: {
177
+ facetType: 'mediatype',
178
+ bucket: {
179
+ key: '',
180
+ state: 'hidden',
181
+ count: 123,
182
+ },
183
+ negative: true,
184
+ },
185
+ }));
186
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
187
+ expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeSelected');
188
+ expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
189
+ el.facetClickHandler(new CustomEvent('facetClick', {
190
+ detail: {
191
+ facetType: 'mediatype',
192
+ bucket: {
193
+ key: '',
194
+ state: 'none',
195
+ count: 123,
196
+ },
197
+ negative: true,
198
+ },
199
+ }));
200
+ expect(el.selectedFacets).to.equal(mockedSelectedFacets);
201
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
202
+ expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeDeselected');
203
+ expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
204
+ });
205
+ it('should render with a sort bar, facets, and infinite scroller', async () => {
206
+ var _a, _b, _c;
207
+ const searchService = new MockSearchService();
211
208
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
212
- </collection-browser>`);
213
- el.baseQuery = 'hello';
214
- await el.updateComplete;
215
- const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
216
- const sortBar = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('sort-filter-bar');
217
- const infiniteScroller = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('infinite-scroller');
218
- expect(facets, 'facets').to.exist;
219
- expect(sortBar, 'sort bar').to.exist;
220
- expect(infiniteScroller, 'infinite scroller').to.exist;
221
- });
222
- it('queries the search service when given a base query', async () => {
223
- var _a, _b, _c;
224
- const searchService = new MockSearchService();
209
+ </collection-browser>`);
210
+ el.baseQuery = 'hello';
211
+ await el.updateComplete;
212
+ await nextTick();
213
+ const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
214
+ const sortBar = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('sort-filter-bar');
215
+ const infiniteScroller = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('infinite-scroller');
216
+ expect(facets, 'facets').to.exist;
217
+ expect(sortBar, 'sort bar').to.exist;
218
+ expect(infiniteScroller, 'infinite scroller').to.exist;
219
+ });
220
+ it('queries the search service when given a base query', async () => {
221
+ var _a, _b, _c;
222
+ const searchService = new MockSearchService();
225
223
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
226
- </collection-browser>`);
227
- el.baseQuery = 'collection:foo';
228
- await el.updateComplete;
229
- await el.initialSearchComplete;
230
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
231
- expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
232
- });
233
- it('queries the search service with a metadata search', async () => {
234
- var _a, _b, _c;
235
- const searchService = new MockSearchService();
224
+ </collection-browser>`);
225
+ el.baseQuery = 'collection:foo';
226
+ await el.updateComplete;
227
+ await el.initialSearchComplete;
228
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
229
+ expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
230
+ });
231
+ it('queries the search service with a metadata search', async () => {
232
+ var _a, _b, _c;
233
+ const searchService = new MockSearchService();
236
234
  const el = await fixture(html ` <collection-browser .searchService=${searchService}>
237
- </collection-browser>`);
238
- el.searchType = SearchType.METADATA;
239
- await el.updateComplete;
240
- el.baseQuery = 'collection:foo';
241
- await el.updateComplete;
242
- await el.initialSearchComplete;
243
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
244
- expect(searchService.searchType).to.equal(SearchType.METADATA);
245
- expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
246
- });
247
- it('can change search type', async () => {
248
- const searchService = new MockSearchService();
235
+ </collection-browser>`);
236
+ el.searchType = SearchType.METADATA;
237
+ await el.updateComplete;
238
+ el.baseQuery = 'collection:foo';
239
+ await el.updateComplete;
240
+ await el.initialSearchComplete;
241
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
242
+ expect(searchService.searchType).to.equal(SearchType.METADATA);
243
+ expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
244
+ });
245
+ it('can change search type', async () => {
246
+ const searchService = new MockSearchService();
249
247
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
250
- </collection-browser>`);
251
- el.baseQuery = 'collection:foo';
252
- await el.updateComplete;
253
- el.searchType = SearchType.FULLTEXT;
254
- await el.updateComplete;
255
- await el.initialSearchComplete;
256
- expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
257
- });
258
- it('queries the search service with a fulltext search', async () => {
259
- var _a, _b, _c;
260
- const searchService = new MockSearchService();
248
+ </collection-browser>`);
249
+ el.baseQuery = 'collection:foo';
250
+ await el.updateComplete;
251
+ el.searchType = SearchType.FULLTEXT;
252
+ await el.updateComplete;
253
+ await el.initialSearchComplete;
254
+ expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
255
+ });
256
+ it('queries the search service with a fulltext search', async () => {
257
+ var _a, _b, _c;
258
+ const searchService = new MockSearchService();
261
259
  const el = await fixture(html ` <collection-browser .searchService=${searchService}>
262
- </collection-browser>`);
263
- el.searchType = SearchType.FULLTEXT;
264
- await el.updateComplete;
265
- el.baseQuery = 'collection:foo';
266
- await el.updateComplete;
267
- await nextTick();
268
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
269
- expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
270
- expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
271
- });
272
- it('queries the search service with facets selected/negated', async () => {
273
- var _a, _b;
274
- const searchService = new MockSearchService();
275
- const selectedFacets = {
276
- subject: {
277
- foo: {
278
- key: 'foo',
279
- count: 1,
280
- state: 'selected',
281
- },
282
- bar: {
283
- key: 'bar',
284
- count: 2,
285
- state: 'hidden',
286
- },
287
- },
288
- lending: {},
289
- mediatype: {},
290
- language: {
291
- en: {
292
- key: 'en',
293
- count: 1,
294
- state: 'selected',
295
- },
296
- },
297
- creator: {},
298
- collection: {},
299
- year: {},
300
- };
260
+ </collection-browser>`);
261
+ el.searchType = SearchType.FULLTEXT;
262
+ await el.updateComplete;
263
+ el.baseQuery = 'collection:foo';
264
+ await el.updateComplete;
265
+ await nextTick();
266
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
267
+ expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
268
+ expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
269
+ });
270
+ it('queries the search service with facets selected/negated', async () => {
271
+ var _a, _b;
272
+ const searchService = new MockSearchService();
273
+ const selectedFacets = {
274
+ subject: {
275
+ foo: {
276
+ key: 'foo',
277
+ count: 1,
278
+ state: 'selected',
279
+ },
280
+ bar: {
281
+ key: 'bar',
282
+ count: 2,
283
+ state: 'hidden',
284
+ },
285
+ },
286
+ lending: {},
287
+ mediatype: {},
288
+ language: {
289
+ en: {
290
+ key: 'en',
291
+ count: 1,
292
+ state: 'selected',
293
+ },
294
+ },
295
+ creator: {},
296
+ collection: {},
297
+ year: {},
298
+ };
301
299
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
302
- </collection-browser>`);
303
- el.baseQuery = 'collection:foo';
304
- el.selectedFacets = selectedFacets;
305
- await el.updateComplete;
306
- await el.initialSearchComplete;
307
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
308
- expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
309
- subject: {
310
- foo: 'inc',
311
- bar: 'exc',
312
- },
313
- language: {
314
- en: 'inc',
315
- },
316
- });
317
- });
318
- it('fails gracefully if no search service provided', async () => {
319
- var _a;
320
- const el = await fixture(html `<collection-browser></collection-browser>`);
321
- el.baseQuery = 'collection:foo';
322
- await el.updateComplete;
323
- // This shouldn't throw an error
324
- expect(el.dataSource.fetchPage(3)).to.exist;
325
- // Should continue showing the empty placeholder
326
- expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder')).to.exist;
327
- });
328
- it('restores search type from URL param', async () => {
329
- // Add a sin=TXT param to the URL
330
- const url = new URL(window.location.href);
331
- url.searchParams.append('sin', 'TXT');
332
- window.history.replaceState({}, '', url);
333
- const searchService = new MockSearchService();
300
+ </collection-browser>`);
301
+ el.baseQuery = 'collection:foo';
302
+ el.selectedFacets = selectedFacets;
303
+ await el.updateComplete;
304
+ await el.initialSearchComplete;
305
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
306
+ expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
307
+ subject: {
308
+ foo: 'inc',
309
+ bar: 'exc',
310
+ },
311
+ language: {
312
+ en: 'inc',
313
+ },
314
+ });
315
+ });
316
+ it('fails gracefully if no search service provided', async () => {
317
+ var _a;
318
+ const el = await fixture(html `<collection-browser></collection-browser>`);
319
+ el.baseQuery = 'collection:foo';
320
+ await el.updateComplete;
321
+ // This shouldn't throw an error
322
+ expect(el.dataSource.fetchPage(3)).to.exist;
323
+ // Should continue showing the empty placeholder
324
+ expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder')).to.exist;
325
+ });
326
+ it('restores search type from URL param', async () => {
327
+ // Add a sin=TXT param to the URL
328
+ const url = new URL(window.location.href);
329
+ url.searchParams.append('sin', 'TXT');
330
+ window.history.replaceState({}, '', url);
331
+ const searchService = new MockSearchService();
334
332
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
335
- </collection-browser>`);
336
- expect(el.searchType).to.equal(SearchType.FULLTEXT);
337
- });
338
- it('applies loggedin flag to tile models if needed', async () => {
339
- var _a;
340
- const searchService = new MockSearchService();
333
+ </collection-browser>`);
334
+ expect(el.searchType).to.equal(SearchType.FULLTEXT);
335
+ });
336
+ it('can construct tile models with many fields present', async () => {
337
+ const searchService = new MockSearchService();
341
338
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
342
- </collection-browser>`);
343
- el.baseQuery = 'loggedin';
344
- await el.updateComplete;
345
- await el.initialSearchComplete;
346
- const cellTemplate = el.cellForIndex(0);
347
- expect(cellTemplate).to.exist;
348
- const cell = await fixture(cellTemplate);
349
- expect(cell).to.exist;
350
- expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
351
- });
352
- it('applies no-preview flag to tile models if needed', async () => {
353
- var _a;
354
- const searchService = new MockSearchService();
339
+ </collection-browser>`);
340
+ el.baseQuery = 'many-fields';
341
+ await el.updateComplete;
342
+ await el.initialSearchComplete;
343
+ const cellTemplate = el.cellForIndex(0);
344
+ expect(cellTemplate).to.exist;
345
+ const cell = await fixture(cellTemplate);
346
+ expect(cell).to.exist;
347
+ });
348
+ it('emits empty results event when search fetches no results', async () => {
349
+ const searchService = new MockSearchService();
350
+ const emptyResultsSpy = sinon.spy();
351
+ const el = await fixture(html `<collection-browser
352
+ .searchService=${searchService}
353
+ @emptyResults=${emptyResultsSpy}
354
+ >
355
+ </collection-browser>`);
356
+ el.baseQuery = 'no-results';
357
+ await el.updateComplete;
358
+ await el.initialSearchComplete;
359
+ expect(emptyResultsSpy.callCount).to.equal(1);
360
+ });
361
+ it('applies loggedin flag to tile models if needed', async () => {
362
+ var _a;
363
+ const searchService = new MockSearchService();
355
364
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
356
- </collection-browser>`);
357
- el.baseQuery = 'no-preview';
358
- await el.updateComplete;
359
- await el.initialSearchComplete;
360
- const cellTemplate = el.cellForIndex(0);
361
- expect(cellTemplate).to.exist;
362
- const cell = await fixture(cellTemplate);
363
- expect(cell).to.exist;
364
- expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.contentWarning).to.be.true;
365
- });
366
- it('both loggedin and no-preview flags can be set simultaneously', async () => {
367
- var _a, _b;
368
- const searchService = new MockSearchService();
365
+ </collection-browser>`);
366
+ el.baseQuery = 'loggedin';
367
+ await el.updateComplete;
368
+ await el.initialSearchComplete;
369
+ const cellTemplate = el.cellForIndex(0);
370
+ expect(cellTemplate).to.exist;
371
+ const cell = await fixture(cellTemplate);
372
+ expect(cell).to.exist;
373
+ expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
374
+ });
375
+ it('applies no-preview flag to tile models if needed', async () => {
376
+ var _a;
377
+ const searchService = new MockSearchService();
369
378
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
370
- </collection-browser>`);
371
- el.baseQuery = 'loggedin-no-preview';
372
- await el.updateComplete;
373
- await el.initialSearchComplete;
374
- const cellTemplate = el.cellForIndex(0);
375
- expect(cellTemplate).to.exist;
376
- const cell = await fixture(cellTemplate);
377
- expect(cell).to.exist;
378
- expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
379
- expect((_b = cell.model) === null || _b === void 0 ? void 0 : _b.contentWarning).to.be.true;
380
- });
381
- it('joins full description array into a single string with line breaks', async () => {
382
- var _a;
383
- const searchService = new MockSearchService();
379
+ </collection-browser>`);
380
+ el.baseQuery = 'no-preview';
381
+ await el.updateComplete;
382
+ await el.initialSearchComplete;
383
+ const cellTemplate = el.cellForIndex(0);
384
+ expect(cellTemplate).to.exist;
385
+ const cell = await fixture(cellTemplate);
386
+ expect(cell).to.exist;
387
+ expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.contentWarning).to.be.true;
388
+ });
389
+ it('both loggedin and no-preview flags can be set simultaneously', async () => {
390
+ var _a, _b;
391
+ const searchService = new MockSearchService();
384
392
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
385
- </collection-browser>`);
386
- // This query receives an array description like ['line1', 'line2']
387
- el.baseQuery = 'multi-line-description';
388
- await el.updateComplete;
389
- await el.initialSearchComplete;
390
- const cellTemplate = el.cellForIndex(0);
391
- expect(cellTemplate).to.exist;
392
- const cell = await fixture(cellTemplate);
393
- expect(cell).to.exist;
394
- // Actual model description should be joined
395
- expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.description).to.equal('line1\nline2');
396
- });
397
- it('can change search type', async () => {
398
- var _a;
399
- const searchService = new MockSearchService();
393
+ </collection-browser>`);
394
+ el.baseQuery = 'loggedin-no-preview';
395
+ await el.updateComplete;
396
+ await el.initialSearchComplete;
397
+ const cellTemplate = el.cellForIndex(0);
398
+ expect(cellTemplate).to.exist;
399
+ const cell = await fixture(cellTemplate);
400
+ expect(cell).to.exist;
401
+ expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
402
+ expect((_b = cell.model) === null || _b === void 0 ? void 0 : _b.contentWarning).to.be.true;
403
+ });
404
+ it('joins full description array into a single string with line breaks', async () => {
405
+ var _a;
406
+ const searchService = new MockSearchService();
407
+ const el = await fixture(html `<collection-browser .searchService=${searchService}>
408
+ </collection-browser>`);
409
+ // This query receives an array description like ['line1', 'line2']
410
+ el.baseQuery = 'multi-line-description';
411
+ await el.updateComplete;
412
+ await el.initialSearchComplete;
413
+ const cellTemplate = el.cellForIndex(0);
414
+ expect(cellTemplate).to.exist;
415
+ const cell = await fixture(cellTemplate);
416
+ expect(cell).to.exist;
417
+ // Actual model description should be joined
418
+ expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.description).to.equal('line1\nline2');
419
+ });
420
+ it('can change search type', async () => {
421
+ var _a;
422
+ const searchService = new MockSearchService();
400
423
  const el = await fixture(html `<collection-browser
401
424
  .searchService=${searchService}
402
425
  .searchType=${SearchType.METADATA}
403
- ></collection-browser>`);
404
- el.baseQuery = 'collection:foo';
405
- el.searchType = SearchType.FULLTEXT;
406
- await el.updateComplete;
407
- await el.initialSearchComplete;
408
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
409
- expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
410
- });
411
- it('trims queries of leading/trailing whitespace', async () => {
412
- var _a;
413
- const searchService = new MockSearchService();
426
+ ></collection-browser>`);
427
+ el.baseQuery = 'collection:foo';
428
+ el.searchType = SearchType.FULLTEXT;
429
+ await el.updateComplete;
430
+ await el.initialSearchComplete;
431
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
432
+ expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
433
+ });
434
+ it('trims queries of leading/trailing whitespace', async () => {
435
+ var _a;
436
+ const searchService = new MockSearchService();
414
437
  const el = await fixture(html `<collection-browser
415
438
  .searchService=${searchService}
416
- ></collection-browser>`);
417
- el.baseQuery = ' collection:foo ';
418
- await el.updateComplete;
419
- await el.initialSearchComplete;
420
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
421
- });
422
- it('shows error message when error response received', async () => {
423
- var _a, _b;
424
- const searchService = new MockSearchService();
439
+ ></collection-browser>`);
440
+ el.baseQuery = ' collection:foo ';
441
+ await el.updateComplete;
442
+ await el.initialSearchComplete;
443
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
444
+ });
445
+ it('shows error message when error response received', async () => {
446
+ var _a, _b;
447
+ const searchService = new MockSearchService();
425
448
  const el = await fixture(html `<collection-browser
426
449
  .searchService=${searchService}
427
- ></collection-browser>`);
428
- el.baseQuery = 'error';
429
- await el.updateComplete;
430
- await el.initialSearchComplete;
431
- const errorPlaceholder = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder');
432
- const errorDetails = (_b = errorPlaceholder === null || errorPlaceholder === void 0 ? void 0 : errorPlaceholder.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.error-details');
433
- expect(errorDetails).to.exist;
434
- expect(errorDetails.textContent).to.contain('foo');
435
- });
436
- it('shows error message when error response received for a collection', async () => {
437
- var _a, _b;
438
- const searchService = new MockSearchService();
450
+ ></collection-browser>`);
451
+ el.baseQuery = 'error';
452
+ await el.updateComplete;
453
+ await el.initialSearchComplete;
454
+ const errorPlaceholder = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder');
455
+ const errorDetails = (_b = errorPlaceholder === null || errorPlaceholder === void 0 ? void 0 : errorPlaceholder.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.error-details');
456
+ expect(errorDetails).to.exist;
457
+ expect(errorDetails.textContent).to.contain('foo');
458
+ });
459
+ it('shows error message when error response received for a collection', async () => {
460
+ var _a, _b;
461
+ const searchService = new MockSearchService();
439
462
  const el = await fixture(html `<collection-browser
440
463
  .searchService=${searchService}
441
- ></collection-browser>`);
442
- el.withinCollection = 'error';
443
- await el.updateComplete;
444
- await el.initialSearchComplete;
445
- const errorPlaceholder = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder');
446
- const errorDetails = (_b = errorPlaceholder === null || errorPlaceholder === void 0 ? void 0 : errorPlaceholder.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.error-details');
447
- expect(errorDetails).to.exist;
448
- expect(errorDetails.textContent).to.contain('foo');
449
- });
450
- it('reports malformed response errors to Sentry', async () => {
451
- const sentrySpy = sinon.spy();
452
- window.Sentry = { captureMessage: sentrySpy };
453
- const searchService = new MockSearchService();
464
+ ></collection-browser>`);
465
+ el.withinCollection = 'error';
466
+ await el.updateComplete;
467
+ await el.initialSearchComplete;
468
+ const errorPlaceholder = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder');
469
+ const errorDetails = (_b = errorPlaceholder === null || errorPlaceholder === void 0 ? void 0 : errorPlaceholder.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.error-details');
470
+ expect(errorDetails).to.exist;
471
+ expect(errorDetails.textContent).to.contain('foo');
472
+ });
473
+ it('reports malformed response errors to Sentry', async () => {
474
+ const sentrySpy = sinon.spy();
475
+ window.Sentry = { captureMessage: sentrySpy };
476
+ const searchService = new MockSearchService();
454
477
  const el = await fixture(html `<collection-browser
455
478
  .searchService=${searchService}
456
- ></collection-browser>`);
457
- el.baseQuery = 'malformed';
458
- await el.updateComplete;
459
- await el.initialSearchComplete;
460
- expect(sentrySpy.callCount).to.be.greaterThanOrEqual(1);
461
- });
462
- it('adds collection names to cache when present on response', async () => {
463
- const searchService = new MockSearchService();
479
+ ></collection-browser>`);
480
+ el.baseQuery = 'malformed';
481
+ await el.updateComplete;
482
+ await el.initialSearchComplete;
483
+ expect(sentrySpy.callCount).to.be.greaterThanOrEqual(1);
484
+ });
485
+ it('adds collection names to cache when present on response', async () => {
486
+ const searchService = new MockSearchService();
464
487
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
465
- </collection-browser>`);
466
- el.baseQuery = 'collection-titles';
467
- await el.updateComplete;
468
- await el.initialSearchComplete;
469
- expect(el.dataSource.collectionTitles.get('foo')).to.equal('Foo Collection');
470
- expect(el.dataSource.collectionTitles.get('bar')).to.equal('Bar Collection');
471
- expect(el.dataSource.collectionTitles.get('baz')).to.equal('Baz Collection');
472
- expect(el.dataSource.collectionTitles.get('boop')).to.equal('Boop Collection');
473
- });
474
- it('keeps search results from fetch if no change to query or sort param', async () => {
475
- const resultsSpy = sinon.spy();
476
- const searchService = new MockSearchService({
477
- asyncResponse: true,
478
- resultsSpy,
479
- });
488
+ </collection-browser>`);
489
+ el.baseQuery = 'collection-titles';
490
+ await el.updateComplete;
491
+ await el.initialSearchComplete;
492
+ expect(el.dataSource.collectionTitles.get('foo')).to.equal('Foo Collection');
493
+ expect(el.dataSource.collectionTitles.get('bar')).to.equal('Bar Collection');
494
+ expect(el.dataSource.collectionTitles.get('baz')).to.equal('Baz Collection');
495
+ expect(el.dataSource.collectionTitles.get('boop')).to.equal('Boop Collection');
496
+ });
497
+ it('keeps search results from fetch if no change to query or sort param', async () => {
498
+ const resultsSpy = sinon.spy();
499
+ const searchService = new MockSearchService({
500
+ asyncResponse: true,
501
+ resultsSpy,
502
+ });
480
503
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
481
- </collection-browser>`);
482
- el.baseQuery = 'with-sort';
483
- el.selectedSort = SortField.date;
484
- el.sortDirection = 'asc';
485
- await el.updateComplete;
486
- await el.dataSource.fetchPage(3);
487
- // If there is no change to the query or sort param during the fetch, the results
488
- // should be read.
489
- expect(resultsSpy.callCount).to.be.greaterThanOrEqual(1);
490
- });
491
- it('discards obsolete search results if sort params changed before arrival', async () => {
492
- const resultsSpy = sinon.spy();
493
- const searchService = new MockSearchService({
494
- asyncResponse: true,
495
- resultsSpy,
496
- });
504
+ </collection-browser>`);
505
+ el.baseQuery = 'with-sort';
506
+ el.selectedSort = SortField.date;
507
+ el.sortDirection = 'asc';
508
+ await el.updateComplete;
509
+ await el.dataSource.fetchPage(3);
510
+ // If there is no change to the query or sort param during the fetch, the results
511
+ // should be read.
512
+ expect(resultsSpy.callCount).to.be.greaterThanOrEqual(1);
513
+ });
514
+ it('discards obsolete search results if sort params changed before arrival', async () => {
515
+ const resultsSpy = sinon.spy();
516
+ const searchService = new MockSearchService({
517
+ asyncResponse: true,
518
+ resultsSpy,
519
+ });
497
520
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
498
- </collection-browser>`);
499
- el.baseQuery = 'with-sort';
500
- el.selectedSort = SortField.date;
501
- el.sortDirection = 'asc';
502
- await el.updateComplete;
503
- // We want to spy exclusively on the first set of results, not the second
504
- searchService.asyncResponse = false;
505
- searchService.resultsSpy = () => { };
506
- el.sortDirection = 'desc';
507
- await el.updateComplete;
508
- await el.initialSearchComplete;
509
- // If the different sort param causes the results to be discarded,
510
- // the first results array should never be read.
511
- expect(resultsSpy.callCount).to.equal(0);
512
- });
513
- it('discards obsolete search results if sort param added before arrival', async () => {
514
- const resultsSpy = sinon.spy();
515
- const searchService = new MockSearchService({
516
- asyncResponse: true,
517
- resultsSpy,
518
- });
521
+ </collection-browser>`);
522
+ el.baseQuery = 'with-sort';
523
+ el.selectedSort = SortField.date;
524
+ el.sortDirection = 'asc';
525
+ await el.updateComplete;
526
+ // We want to spy exclusively on the first set of results, not the second
527
+ searchService.asyncResponse = false;
528
+ searchService.resultsSpy = () => { };
529
+ el.sortDirection = 'desc';
530
+ await el.updateComplete;
531
+ await el.initialSearchComplete;
532
+ // If the different sort param causes the results to be discarded,
533
+ // the first results array should never be read.
534
+ expect(resultsSpy.callCount).to.equal(0);
535
+ });
536
+ it('discards obsolete search results if sort param added before arrival', async () => {
537
+ const resultsSpy = sinon.spy();
538
+ const searchService = new MockSearchService({
539
+ asyncResponse: true,
540
+ resultsSpy,
541
+ });
519
542
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
520
- </collection-browser>`);
521
- el.baseQuery = 'single-result';
522
- await el.updateComplete;
523
- // We want to spy exclusively on the first set of results, not the second
524
- searchService.asyncResponse = false;
525
- searchService.resultsSpy = () => { };
526
- el.selectedSort = SortField.date;
527
- el.sortDirection = 'asc';
528
- await el.updateComplete;
529
- await el.initialSearchComplete;
530
- // If the different sort param causes the results to be discarded,
531
- // the first results array should never be read.
532
- expect(resultsSpy.callCount).to.equal(0);
533
- });
534
- it('discards obsolete search results if sort param cleared before arrival', async () => {
535
- const resultsSpy = sinon.spy();
536
- const searchService = new MockSearchService({
537
- asyncResponse: true,
538
- resultsSpy,
539
- });
543
+ </collection-browser>`);
544
+ el.baseQuery = 'single-result';
545
+ await el.updateComplete;
546
+ // We want to spy exclusively on the first set of results, not the second
547
+ searchService.asyncResponse = false;
548
+ searchService.resultsSpy = () => { };
549
+ el.selectedSort = SortField.date;
550
+ el.sortDirection = 'asc';
551
+ await el.updateComplete;
552
+ await el.initialSearchComplete;
553
+ // If the different sort param causes the results to be discarded,
554
+ // the first results array should never be read.
555
+ expect(resultsSpy.callCount).to.equal(0);
556
+ });
557
+ it('discards obsolete search results if sort param cleared before arrival', async () => {
558
+ const resultsSpy = sinon.spy();
559
+ const searchService = new MockSearchService({
560
+ asyncResponse: true,
561
+ resultsSpy,
562
+ });
540
563
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
541
- </collection-browser>`);
542
- el.baseQuery = 'with-sort';
543
- el.selectedSort = SortField.date;
544
- el.sortDirection = 'asc';
545
- await el.updateComplete;
546
- // We want to spy exclusively on the first set of results, not the second
547
- searchService.asyncResponse = false;
548
- searchService.resultsSpy = () => { };
549
- el.selectedSort = SortField.default;
550
- await el.updateComplete;
551
- await el.initialSearchComplete;
552
- // If the different sort param causes the results to be discarded,
553
- // the first results array should never be read.
554
- expect(resultsSpy.callCount).to.equal(0);
555
- });
556
- it('sets sort properties when user changes sort', async () => {
557
- var _a, _b, _c, _d;
558
- const searchService = new MockSearchService();
559
- const el = await fixture(html `<collection-browser
560
- .searchService=${searchService}
561
- .suppressPlaceholders=${true}
562
- >
563
- </collection-browser>`);
564
- expect(el.selectedSort).to.equal(SortField.default);
565
- el.baseQuery = 'foo';
566
- await el.updateComplete;
567
- const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#content-container sort-filter-bar');
568
- const sortSelector = (_b = sortBar === null || sortBar === void 0 ? void 0 : sortBar.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#desktop-sort-selector');
569
- expect(sortSelector, 'sort bar').to.exist;
570
- // Click the title sorter
571
- (_d = (_c = [...sortSelector === null || sortSelector === void 0 ? void 0 : sortSelector.children] // tsc doesn't know children is iterable
572
- .find(child => { var _a; return ((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === 'Title'; })) === null || _c === void 0 ? void 0 : _c.querySelector('button')) === null || _d === void 0 ? void 0 : _d.click();
573
- await el.updateComplete;
574
- expect(el.selectedSort).to.equal(SortField.title);
575
- });
576
- it('sets sort filter properties when user selects title filter', async () => {
577
- var _a, _b, _c, _d;
578
- const searchService = new MockSearchService();
564
+ </collection-browser>`);
565
+ el.baseQuery = 'with-sort';
566
+ el.selectedSort = SortField.date;
567
+ el.sortDirection = 'asc';
568
+ await el.updateComplete;
569
+ // We want to spy exclusively on the first set of results, not the second
570
+ searchService.asyncResponse = false;
571
+ searchService.resultsSpy = () => { };
572
+ el.selectedSort = SortField.default;
573
+ await el.updateComplete;
574
+ await el.initialSearchComplete;
575
+ // If the different sort param causes the results to be discarded,
576
+ // the first results array should never be read.
577
+ expect(resultsSpy.callCount).to.equal(0);
578
+ });
579
+ it('sets sort properties when user changes sort', async () => {
580
+ var _a, _b, _c, _d;
581
+ const searchService = new MockSearchService();
579
582
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
580
- </collection-browser>`);
581
- el.baseQuery = 'first-title';
582
- el.selectedSort = 'title';
583
- el.sortDirection = 'asc';
584
- el.selectedTitleFilter = 'X';
585
- await el.updateComplete;
586
- await el.initialSearchComplete;
587
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-title');
588
- expect((_d = (_c = (_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters) === null || _c === void 0 ? void 0 : _c.firstTitle) === null || _d === void 0 ? void 0 : _d.X).to.equal(FilterConstraint.INCLUDE);
589
- });
590
- it('sets sort filter properties when user selects creator filter', async () => {
591
- var _a, _b, _c, _d;
592
- const searchService = new MockSearchService();
583
+ </collection-browser>`);
584
+ expect(el.selectedSort).to.equal(SortField.default);
585
+ el.baseQuery = 'foo';
586
+ await el.updateComplete;
587
+ await nextTick();
588
+ const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#content-container sort-filter-bar');
589
+ const sortSelector = (_b = sortBar === null || sortBar === void 0 ? void 0 : sortBar.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#desktop-sort-selector');
590
+ expect(sortSelector, 'sort bar').to.exist;
591
+ // Click the title sorter
592
+ (_d = (_c = [...sortSelector === null || sortSelector === void 0 ? void 0 : sortSelector.children] // tsc doesn't know children is iterable
593
+ .find(child => { var _a; return ((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === 'Title'; })) === null || _c === void 0 ? void 0 : _c.querySelector('button')) === null || _d === void 0 ? void 0 : _d.click();
594
+ await el.updateComplete;
595
+ expect(el.selectedSort).to.equal(SortField.title);
596
+ });
597
+ it('sets sort filter properties when user selects title filter', async () => {
598
+ var _a, _b, _c, _d;
599
+ const searchService = new MockSearchService();
593
600
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
594
- </collection-browser>`);
595
- el.baseQuery = 'first-creator';
596
- el.selectedSort = 'creator';
597
- el.sortDirection = 'asc';
598
- el.selectedCreatorFilter = 'X';
599
- await el.updateComplete;
600
- await el.initialSearchComplete;
601
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator');
602
- expect((_d = (_c = (_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters) === null || _c === void 0 ? void 0 : _c.firstCreator) === null || _d === void 0 ? void 0 : _d.X).to.equal(FilterConstraint.INCLUDE);
603
- });
604
- it('sets sort filter properties simultaneous with facets and date range', async () => {
605
- var _a, _b;
606
- const searchService = new MockSearchService();
607
- const selectedFacets = {
608
- collection: { foo: { key: 'foo', state: 'selected', count: 1 } },
609
- creator: {},
610
- language: {},
611
- lending: {},
612
- mediatype: {},
613
- subject: {},
614
- year: {},
615
- };
601
+ </collection-browser>`);
602
+ el.baseQuery = 'first-title';
603
+ el.selectedSort = 'title';
604
+ el.sortDirection = 'asc';
605
+ el.selectedTitleFilter = 'X';
606
+ await el.updateComplete;
607
+ await el.initialSearchComplete;
608
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-title');
609
+ expect((_d = (_c = (_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters) === null || _c === void 0 ? void 0 : _c.firstTitle) === null || _d === void 0 ? void 0 : _d.X).to.equal(FilterConstraint.INCLUDE);
610
+ });
611
+ it('sets sort filter properties when user selects creator filter', async () => {
612
+ var _a, _b, _c, _d;
613
+ const searchService = new MockSearchService();
616
614
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
617
- </collection-browser>`);
618
- el.baseQuery = 'first-creator';
619
- el.selectedSort = 'creator';
620
- el.selectedFacets = selectedFacets;
621
- el.minSelectedDate = '1950';
622
- el.maxSelectedDate = '1970';
623
- el.sortDirection = 'asc';
624
- el.selectedCreatorFilter = 'X';
625
- await el.updateComplete;
626
- await el.initialSearchComplete;
627
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator');
628
- expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
629
- collection: {
630
- foo: 'inc',
631
- },
632
- year: {
633
- '1950': 'gte',
634
- '1970': 'lte',
635
- },
636
- firstCreator: {
637
- X: 'inc',
638
- },
639
- });
640
- });
641
- it('resets letter filters when query changes', async () => {
642
- var _a, _b, _c, _d, _e, _f, _g;
643
- const searchService = new MockSearchService();
615
+ </collection-browser>`);
616
+ el.baseQuery = 'first-creator';
617
+ el.selectedSort = 'creator';
618
+ el.sortDirection = 'asc';
619
+ el.selectedCreatorFilter = 'X';
620
+ await el.updateComplete;
621
+ await el.initialSearchComplete;
622
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator');
623
+ expect((_d = (_c = (_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters) === null || _c === void 0 ? void 0 : _c.firstCreator) === null || _d === void 0 ? void 0 : _d.X).to.equal(FilterConstraint.INCLUDE);
624
+ });
625
+ it('sets sort filter properties simultaneous with facets and date range', async () => {
626
+ var _a, _b;
627
+ const searchService = new MockSearchService();
628
+ const selectedFacets = {
629
+ collection: { foo: { key: 'foo', state: 'selected', count: 1 } },
630
+ creator: {},
631
+ language: {},
632
+ lending: {},
633
+ mediatype: {},
634
+ subject: {},
635
+ year: {},
636
+ };
644
637
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
645
- </collection-browser>`);
646
- el.baseQuery = 'first-creator';
647
- el.selectedSort = 'creator';
648
- el.sortDirection = 'asc';
649
- el.selectedCreatorFilter = 'X';
650
- await el.updateComplete;
651
- await el.initialSearchComplete;
652
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator');
653
- expect((_d = (_c = (_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters) === null || _c === void 0 ? void 0 : _c.firstCreator) === null || _d === void 0 ? void 0 : _d.X).to.equal(FilterConstraint.INCLUDE);
654
- el.baseQuery = 'collection:foo';
655
- await el.updateComplete;
656
- await el.initialSearchComplete;
657
- expect((_e = searchService.searchParams) === null || _e === void 0 ? void 0 : _e.query).to.equal('collection:foo');
658
- expect((_g = (_f = searchService.searchParams) === null || _f === void 0 ? void 0 : _f.filters) === null || _g === void 0 ? void 0 : _g.firstCreator).not.to.exist;
659
- });
660
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
661
- // SKIPPING FOR NOW TO GET CI GREEN.
662
- it.skip('sets date range query when date picker selection changed', async () => {
663
- var _a, _b, _c;
664
- const searchService = new MockSearchService();
638
+ </collection-browser>`);
639
+ el.baseQuery = 'first-creator';
640
+ el.selectedSort = 'creator';
641
+ el.selectedFacets = selectedFacets;
642
+ el.minSelectedDate = '1950';
643
+ el.maxSelectedDate = '1970';
644
+ el.sortDirection = 'asc';
645
+ el.selectedCreatorFilter = 'X';
646
+ await el.updateComplete;
647
+ await el.initialSearchComplete;
648
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator');
649
+ expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
650
+ collection: {
651
+ foo: 'inc',
652
+ },
653
+ year: {
654
+ '1950': 'gte',
655
+ '1970': 'lte',
656
+ },
657
+ firstCreator: {
658
+ X: 'inc',
659
+ },
660
+ });
661
+ });
662
+ it('resets letter filters when query changes', async () => {
663
+ var _a, _b, _c, _d, _e, _f, _g;
664
+ const searchService = new MockSearchService();
665
665
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
666
- </collection-browser>`);
667
- el.baseQuery = 'years'; // Includes year_histogram aggregation in response
668
- el.showHistogramDatePicker = true;
669
- await el.updateComplete;
670
- const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
671
- await (facets === null || facets === void 0 ? void 0 : facets.updateComplete);
672
- // Wait for the date picker to be rendered (which may take until the next tick)
673
- await nextTick();
674
- const histogram = (_b = facets === null || facets === void 0 ? void 0 : facets.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('histogram-date-range');
675
- expect(histogram, 'histogram exists').to.exist;
676
- // Enter a new min date into the date picker
677
- const minDateInput = (_c = histogram.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#date-min');
678
- const pressEnterEvent = new KeyboardEvent('keyup', {
679
- key: 'Enter',
680
- });
681
- minDateInput.value = '1960';
682
- minDateInput.dispatchEvent(pressEnterEvent);
683
- // Wait for the histogram's update delay
684
- await aTimeout(histogram.updateDelay + 50);
685
- // Ensure that the histogram change propagated to the collection browser's
686
- // date query correctly.
687
- await el.updateComplete;
688
- expect(el.minSelectedDate).to.equal('1960');
689
- expect(el.maxSelectedDate).to.equal('2000');
690
- });
691
- it('emits event when loading state changes', async () => {
692
- var _a, _b, _c, _d;
693
- const spy = sinon.spy();
694
- const searchService = new MockSearchService();
666
+ </collection-browser>`);
667
+ el.baseQuery = 'first-creator';
668
+ el.selectedSort = 'creator';
669
+ el.sortDirection = 'asc';
670
+ el.selectedCreatorFilter = 'X';
671
+ await el.updateComplete;
672
+ await nextTick();
673
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator');
674
+ expect((_d = (_c = (_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters) === null || _c === void 0 ? void 0 : _c.firstCreator) === null || _d === void 0 ? void 0 : _d.X).to.equal(FilterConstraint.INCLUDE);
675
+ el.baseQuery = 'collection:foo';
676
+ await el.updateComplete;
677
+ await nextTick();
678
+ expect((_e = searchService.searchParams) === null || _e === void 0 ? void 0 : _e.query).to.equal('collection:foo');
679
+ expect((_g = (_f = searchService.searchParams) === null || _f === void 0 ? void 0 : _f.filters) === null || _g === void 0 ? void 0 : _g.firstCreator).not.to.exist;
680
+ });
681
+ it('sets date range query when date picker selection changed', async () => {
682
+ var _a, _b, _c;
683
+ const searchService = new MockSearchService();
695
684
  const el = await fixture(html `<collection-browser
696
685
  .searchService=${searchService}
697
- ></collection-browser>`);
698
- el.baseQuery = 'collection:foo';
699
- el.addEventListener('searchResultsLoadingChanged', spy);
700
- await el.updateComplete;
701
- await el.initialSearchComplete;
702
- // Should initially emit loading=true, then later emit loading=false
703
- expect(spy.callCount).to.equal(2);
704
- expect((_b = (_a = spy.firstCall.firstArg) === null || _a === void 0 ? void 0 : _a.detail) === null || _b === void 0 ? void 0 : _b.loading).to.equal(true);
705
- expect((_d = (_c = spy.secondCall.firstArg) === null || _c === void 0 ? void 0 : _c.detail) === null || _d === void 0 ? void 0 : _d.loading).to.equal(false);
706
- });
707
- it('collapses extra set of quotes around href field', async () => {
708
- var _a, _b, _c, _d;
709
- const searchService = new MockSearchService();
686
+ .suppressPlaceholders=${true}
687
+ >
688
+ </collection-browser>`);
689
+ el.baseQuery = 'years'; // Includes year_histogram aggregation in response
690
+ el.showHistogramDatePicker = true;
691
+ await el.updateComplete;
692
+ const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
693
+ await (facets === null || facets === void 0 ? void 0 : facets.updateComplete);
694
+ // Wait for the date picker to be rendered (which may take until the next tick)
695
+ await nextTick();
696
+ const histogram = (_b = facets === null || facets === void 0 ? void 0 : facets.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('histogram-date-range');
697
+ expect(histogram, 'histogram exists').to.exist;
698
+ // Enter a new min date into the date picker
699
+ const minDateInput = (_c = histogram.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#date-min');
700
+ const pressEnterEvent = new KeyboardEvent('keyup', {
701
+ key: 'Enter',
702
+ });
703
+ minDateInput.value = '1960';
704
+ minDateInput.dispatchEvent(pressEnterEvent);
705
+ // Wait for the histogram's update delay
706
+ await aTimeout(histogram.updateDelay + 50);
707
+ // Ensure that the histogram change propagated to the collection browser's
708
+ // date query correctly.
709
+ await el.updateComplete;
710
+ expect(el.minSelectedDate).to.equal('1960');
711
+ expect(el.maxSelectedDate).to.equal('2000');
712
+ });
713
+ it('emits event when loading state changes', async () => {
714
+ var _a, _b, _c, _d;
715
+ const spy = sinon.spy();
716
+ const searchService = new MockSearchService();
717
+ const el = await fixture(html `<collection-browser
718
+ .searchService=${searchService}
719
+ ></collection-browser>`);
720
+ el.baseQuery = 'collection:foo';
721
+ el.addEventListener('searchResultsLoadingChanged', spy);
722
+ await el.updateComplete;
723
+ await el.initialSearchComplete;
724
+ // Should initially emit loading=true, then later emit loading=false
725
+ expect(spy.callCount).to.equal(2);
726
+ expect((_b = (_a = spy.firstCall.firstArg) === null || _a === void 0 ? void 0 : _a.detail) === null || _b === void 0 ? void 0 : _b.loading).to.equal(true);
727
+ expect((_d = (_c = spy.secondCall.firstArg) === null || _c === void 0 ? void 0 : _c.detail) === null || _d === void 0 ? void 0 : _d.loading).to.equal(false);
728
+ });
729
+ it('collapses extra set of quotes around href field', async () => {
730
+ var _a, _b, _c, _d;
731
+ const searchService = new MockSearchService();
710
732
  const el = await fixture(html `<collection-browser
711
733
  .searchService=${searchService}
712
734
  .baseNavigationUrl=${''}
713
- ></collection-browser>`);
714
- el.baseQuery = 'extra-quoted-href';
715
- await el.updateComplete;
716
- await el.initialSearchComplete;
717
- await el.updateComplete;
718
- await aTimeout(50);
719
- const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
720
- expect(infiniteScroller).to.exist;
721
- const firstResult = (_b = infiniteScroller.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('tile-dispatcher');
722
- expect(firstResult).to.exist;
723
- // Original href q param starts/ends with %22%22, but should be collapsed to %22 before render
724
- expect((_d = (_c = firstResult.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]')) === null || _d === void 0 ? void 0 : _d.getAttribute('href')).to.equal('/details/foo?q=%22quoted+query%22');
725
- });
726
- it('sets default sort from collection metadata', async () => {
727
- var _a;
728
- const searchService = new MockSearchService();
735
+ ></collection-browser>`);
736
+ el.baseQuery = 'extra-quoted-href';
737
+ await el.updateComplete;
738
+ await el.initialSearchComplete;
739
+ await el.updateComplete;
740
+ await aTimeout(50);
741
+ const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
742
+ expect(infiniteScroller).to.exist;
743
+ const firstResult = (_b = infiniteScroller.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('tile-dispatcher');
744
+ expect(firstResult).to.exist;
745
+ // Original href q param starts/ends with %22%22, but should be collapsed to %22 before render
746
+ expect((_d = (_c = firstResult.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]')) === null || _d === void 0 ? void 0 : _d.getAttribute('href')).to.equal('/details/foo?q=%22quoted+query%22');
747
+ });
748
+ it('sets default sort from collection metadata', async () => {
749
+ var _a;
750
+ const searchService = new MockSearchService();
729
751
  const el = await fixture(html `<collection-browser
730
752
  .searchService=${searchService}
731
753
  .baseNavigationUrl=${''}
732
- ></collection-browser>`);
733
- el.withinCollection = 'default-sort';
734
- await el.updateComplete;
735
- await el.initialSearchComplete;
736
- await el.updateComplete;
737
- await aTimeout(50);
738
- const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
739
- expect(sortBar).to.exist;
740
- expect(sortBar.defaultSortField).to.equal(SortField.title);
741
- expect(sortBar.defaultSortDirection).to.equal('asc');
742
- expect(sortBar.selectedSort).to.equal(SortField.default);
743
- expect(sortBar.sortDirection).to.be.null;
744
- });
745
- it('sets default sort from collection metadata in "-field" format', async () => {
746
- var _a;
747
- const searchService = new MockSearchService();
754
+ ></collection-browser>`);
755
+ el.withinCollection = 'default-sort';
756
+ await el.updateComplete;
757
+ await el.initialSearchComplete;
758
+ await el.updateComplete;
759
+ await aTimeout(50);
760
+ const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
761
+ expect(sortBar).to.exist;
762
+ expect(sortBar.defaultSortField).to.equal(SortField.title);
763
+ expect(sortBar.defaultSortDirection).to.equal('asc');
764
+ expect(sortBar.selectedSort).to.equal(SortField.default);
765
+ expect(sortBar.sortDirection).to.be.null;
766
+ });
767
+ it('sets default sort from collection metadata in "-field" format', async () => {
768
+ var _a;
769
+ const searchService = new MockSearchService();
748
770
  const el = await fixture(html `<collection-browser
749
771
  .searchService=${searchService}
750
772
  .baseNavigationUrl=${''}
751
- ></collection-browser>`);
752
- el.withinCollection = 'default-sort-concise';
753
- await el.updateComplete;
754
- await el.initialSearchComplete;
755
- await el.updateComplete;
756
- await aTimeout(50);
757
- const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
758
- expect(sortBar).to.exist;
759
- expect(sortBar.defaultSortField).to.equal(SortField.dateadded);
760
- expect(sortBar.defaultSortDirection).to.equal('desc');
761
- expect(sortBar.selectedSort).to.equal(SortField.default);
762
- expect(sortBar.sortDirection).to.be.null;
763
- });
764
- it('uses relevance sort as default when a query is set', async () => {
765
- var _a;
766
- const searchService = new MockSearchService();
773
+ ></collection-browser>`);
774
+ el.withinCollection = 'default-sort-concise';
775
+ await el.updateComplete;
776
+ await el.initialSearchComplete;
777
+ await el.updateComplete;
778
+ await aTimeout(50);
779
+ const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
780
+ expect(sortBar).to.exist;
781
+ expect(sortBar.defaultSortField).to.equal(SortField.dateadded);
782
+ expect(sortBar.defaultSortDirection).to.equal('desc');
783
+ expect(sortBar.selectedSort).to.equal(SortField.default);
784
+ expect(sortBar.sortDirection).to.be.null;
785
+ });
786
+ it('falls back to weekly views default sorting on profiles when tab not set', async () => {
787
+ const el = await fixture(html `<collection-browser
788
+ .withinProfile=${'@foobar'}
789
+ ></collection-browser>`);
790
+ el.applyDefaultProfileSort();
791
+ expect(el.defaultSortParam).to.deep.equal({
792
+ field: SortField.weeklyview,
793
+ direction: 'desc',
794
+ });
795
+ });
796
+ it('uses relevance sort as default when a query is set', async () => {
797
+ var _a;
798
+ const searchService = new MockSearchService();
767
799
  const el = await fixture(html `<collection-browser
768
800
  .searchService=${searchService}
769
801
  .baseNavigationUrl=${''}
770
- ></collection-browser>`);
771
- el.withinCollection = 'default-sort';
772
- el.baseQuery = 'default-sort';
773
- await el.updateComplete;
774
- await el.initialSearchComplete;
775
- await el.updateComplete;
776
- await aTimeout(50);
777
- const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
778
- expect(sortBar).to.exist;
779
- expect(sortBar.defaultSortField).to.equal(SortField.relevance);
780
- expect(sortBar.defaultSortDirection).to.be.null;
781
- expect(sortBar.selectedSort).to.equal(SortField.default);
782
- expect(sortBar.sortDirection).to.be.null;
783
- });
784
- it('uses date favorited sort as default when targeting fav- collection', async () => {
785
- var _a;
786
- const searchService = new MockSearchService();
802
+ ></collection-browser>`);
803
+ el.withinCollection = 'default-sort';
804
+ el.baseQuery = 'default-sort';
805
+ await el.updateComplete;
806
+ await el.initialSearchComplete;
807
+ await el.updateComplete;
808
+ await aTimeout(50);
809
+ const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
810
+ expect(sortBar).to.exist;
811
+ expect(sortBar.defaultSortField).to.equal(SortField.relevance);
812
+ expect(sortBar.defaultSortDirection).to.be.null;
813
+ expect(sortBar.selectedSort).to.equal(SortField.default);
814
+ expect(sortBar.sortDirection).to.be.null;
815
+ });
816
+ it('uses date favorited sort as default when targeting fav- collection', async () => {
817
+ var _a;
818
+ const searchService = new MockSearchService();
787
819
  const el = await fixture(html `<collection-browser
788
820
  .searchService=${searchService}
789
821
  .baseNavigationUrl=${''}
790
- ></collection-browser>`);
791
- el.withinCollection = 'fav-sort';
792
- await el.updateComplete;
793
- await el.initialSearchComplete;
794
- await el.updateComplete;
795
- await aTimeout(50);
796
- const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
797
- expect(sortBar).to.exist;
798
- expect(sortBar.defaultSortField).to.equal(SortField.datefavorited);
799
- expect(sortBar.defaultSortDirection).to.equal('desc');
800
- expect(sortBar.selectedSort).to.equal(SortField.default);
801
- expect(sortBar.sortDirection).to.be.null;
802
- });
803
- it('scrolls to page', async () => {
804
- var _a;
805
- const searchService = new MockSearchService();
822
+ ></collection-browser>`);
823
+ el.withinCollection = 'fav-sort';
824
+ await el.updateComplete;
825
+ await el.initialSearchComplete;
826
+ await el.updateComplete;
827
+ await aTimeout(50);
828
+ const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
829
+ expect(sortBar).to.exist;
830
+ expect(sortBar.defaultSortField).to.equal(SortField.datefavorited);
831
+ expect(sortBar.defaultSortDirection).to.equal('desc');
832
+ expect(sortBar.selectedSort).to.equal(SortField.default);
833
+ expect(sortBar.sortDirection).to.be.null;
834
+ });
835
+ it('scrolls to page', async () => {
836
+ var _a;
837
+ const searchService = new MockSearchService();
806
838
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
807
- </collection-browser>`);
808
- // Infinite scroller won't exist unless there's a base query.
809
- // First ensure that we don't throw errors when it doesn't exist.
810
- await el.goToPage(1);
811
- // And make sure it correctly calls scrollToCell when the
812
- // infinite scroller does exist.
813
- el.baseQuery = 'collection:foo';
814
- await el.updateComplete;
815
- const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
816
- expect(infiniteScroller).to.exist;
817
- const oldScrollToCell = infiniteScroller.scrollToCell;
818
- const spy = sinon.spy();
819
- infiniteScroller.scrollToCell = spy;
820
- await el.goToPage(1);
821
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
822
- // COMMENTING OUT FOR NOW TO GET CI GREEN.
823
- // expect(spy.callCount, 'scroll to page fires once').to.equal(1);
824
- infiniteScroller.scrollToCell = oldScrollToCell;
825
- });
826
- it('shows mobile facets in mobile view', async () => {
827
- var _a, _b;
828
- const searchService = new MockSearchService();
839
+ </collection-browser>`);
840
+ // Infinite scroller won't exist unless there's a base query.
841
+ // First ensure that we don't throw errors when it doesn't exist.
842
+ await el.goToPage(1);
843
+ // And make sure it correctly calls scrollToCell when the
844
+ // infinite scroller does exist.
845
+ el.baseQuery = 'collection:foo';
846
+ await el.updateComplete;
847
+ await nextTick();
848
+ const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
849
+ expect(infiniteScroller).to.exist;
850
+ const oldScrollToCell = infiniteScroller.scrollToCell;
851
+ const spy = sinon.spy();
852
+ infiniteScroller.scrollToCell = spy;
853
+ await el.goToPage(1);
854
+ expect(spy.callCount, 'scroll to page fires once').to.equal(1);
855
+ infiniteScroller.scrollToCell = oldScrollToCell;
856
+ });
857
+ it('shows mobile facets in mobile view', async () => {
858
+ var _a, _b;
859
+ const searchService = new MockSearchService();
829
860
  const el = await fixture(html `<collection-browser
830
861
  .searchService=${searchService}
831
862
  .mobileBreakpoint=${9999}
832
- ></collection-browser>`);
833
- el.baseQuery = 'collection:foo';
834
- await el.updateComplete;
835
- const contentContainer = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#content-container');
836
- el.handleResize({
837
- target: contentContainer,
838
- contentRect: contentContainer.getBoundingClientRect(),
839
- borderBoxSize: [],
840
- contentBoxSize: [],
841
- devicePixelContentBoxSize: [],
842
- });
843
- await el.updateComplete;
844
- const mobileFacets = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#mobile-filter-collapse');
845
- expect(mobileFacets).to.exist;
846
- });
847
- it('sets parent collections to prop when searching a collection', async () => {
848
- const searchService = new MockSearchService();
863
+ ></collection-browser>`);
864
+ el.baseQuery = 'collection:foo';
865
+ await el.updateComplete;
866
+ const contentContainer = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#content-container');
867
+ el.handleResize({
868
+ target: contentContainer,
869
+ contentRect: contentContainer.getBoundingClientRect(),
870
+ borderBoxSize: [],
871
+ contentBoxSize: [],
872
+ devicePixelContentBoxSize: [],
873
+ });
874
+ await el.updateComplete;
875
+ const mobileFacets = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#mobile-filter-collapse');
876
+ expect(mobileFacets).to.exist;
877
+ });
878
+ it('sets parent collections to prop when searching a collection', async () => {
879
+ const searchService = new MockSearchService();
849
880
  const el = await fixture(html `<collection-browser
850
881
  .searchService=${searchService}
851
882
  .withinCollection=${'fake'}
852
- ></collection-browser>`);
853
- el.baseQuery = 'parent-collections';
854
- await el.updateComplete;
855
- await el.initialSearchComplete;
856
- await aTimeout(0);
857
- expect(el.dataSource.parentCollections).to.deep.equal(['foo', 'bar']);
858
- });
859
- it('refreshes when certain properties change - with some analytics event sampling', async () => {
860
- var _a;
861
- const mockAnalyticsHandler = new MockAnalyticsHandler();
862
- const searchService = new MockSearchService();
883
+ ></collection-browser>`);
884
+ el.baseQuery = 'parent-collections';
885
+ await el.updateComplete;
886
+ await el.initialSearchComplete;
887
+ await aTimeout(0);
888
+ expect(el.dataSource.parentCollections).to.deep.equal(['foo', 'bar']);
889
+ });
890
+ it('refreshes when certain properties change - with some analytics event sampling', async () => {
891
+ var _a;
892
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
893
+ const searchService = new MockSearchService();
863
894
  const el = await fixture(html `<collection-browser
864
895
  .analyticsHandler=${mockAnalyticsHandler}
865
896
  .searchService=${searchService}
866
- ></collection-browser>`);
867
- const infiniteScrollerRefreshSpy = sinon.spy();
868
- // Infinite scroller won't exist unless there's a base query
869
- el.baseQuery = 'collection:foo';
870
- await el.updateComplete;
871
- const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
872
- infiniteScroller.reload = infiniteScrollerRefreshSpy;
873
- expect(infiniteScrollerRefreshSpy.called).to.be.false;
874
- expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);
875
- // testing: `loggedIn`
876
- el.loggedIn = true;
877
- await el.updateComplete;
878
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
879
- // COMMENTING OUT FOR NOW TO GET CI GREEN.
880
- // expect(infiniteScrollerRefreshSpy.called, 'Infinite Scroller Refresh').to.be.true;
881
- // expect(infiniteScrollerRefreshSpy.callCount, 'Infinite Scroller Refresh call count').to.equal(1);
882
- el.loggedIn = false;
883
- await el.updateComplete;
884
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
885
- // COMMENTING OUT FOR NOW TO GET CI GREEN.
886
- // expect(infiniteScrollerRefreshSpy.callCount, '2nd Infinite Scroller Refresh').to.equal(2);
887
- // testing: `displayMode`
888
- el.displayMode = 'list-compact';
889
- el.searchContext = 'beta-search';
890
- await el.updateComplete;
891
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
892
- // COMMENTING OUT FOR NOW TO GET CI GREEN.
893
- // expect(infiniteScrollerRefreshSpy.callCount, '3rd Infinite Scroller Refresh').to.equal(3);
894
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
895
- expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
896
- expect(mockAnalyticsHandler.callLabel).to.equal('list-compact');
897
- el.displayMode = 'list-detail';
898
- await el.updateComplete;
899
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
900
- // COMMENTING OUT FOR NOW TO GET CI GREEN.
901
- // expect(infiniteScrollerRefreshSpy.callCount, '4th Infinite Scroller Refresh').to.equal(4);
902
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
903
- expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
904
- expect(mockAnalyticsHandler.callLabel).to.equal('list-detail');
905
- // testing: `baseNavigationUrl`
906
- el.baseNavigationUrl = 'https://funtestsite.com';
907
- await el.updateComplete;
908
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
909
- // COMMENTING OUT FOR NOW TO GET CI GREEN.
910
- // expect(infiniteScrollerRefreshSpy.callCount, '5th Infinite Scroller Refresh').to.equal(5);
911
- // testing: `baseImageUrl`
912
- el.baseImageUrl = 'https://funtestsiteforimages.com';
913
- await el.updateComplete;
914
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
915
- // COMMENTING OUT FOR NOW TO GET CI GREEN.
916
- // expect(infiniteScrollerRefreshSpy.callCount, '6th Infinite Scroller Refresh').to.equal(6);
917
- });
918
- it('query the search service for single result', async () => {
919
- var _a, _b;
920
- const searchService = new MockSearchService();
897
+ ></collection-browser>`);
898
+ const infiniteScrollerRefreshSpy = sinon.spy();
899
+ // Infinite scroller won't exist unless there's a base query
900
+ el.baseQuery = 'collection:foo';
901
+ await el.updateComplete;
902
+ await nextTick();
903
+ const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
904
+ infiniteScroller.reload = infiniteScrollerRefreshSpy;
905
+ expect(infiniteScrollerRefreshSpy.called).to.be.false;
906
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);
907
+ // testing: `loggedIn`
908
+ el.loggedIn = true;
909
+ await el.updateComplete;
910
+ expect(infiniteScrollerRefreshSpy.called, 'Infinite Scroller Refresh').to.be
911
+ .true;
912
+ expect(infiniteScrollerRefreshSpy.callCount, 'Infinite Scroller Refresh call count').to.equal(1);
913
+ el.loggedIn = false;
914
+ await el.updateComplete;
915
+ expect(infiniteScrollerRefreshSpy.callCount, '2nd Infinite Scroller Refresh').to.equal(2);
916
+ // testing: `displayMode`
917
+ el.displayMode = 'list-compact';
918
+ el.searchContext = 'beta-search';
919
+ await el.updateComplete;
920
+ expect(infiniteScrollerRefreshSpy.callCount, '3rd Infinite Scroller Refresh').to.equal(3);
921
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
922
+ expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
923
+ expect(mockAnalyticsHandler.callLabel).to.equal('list-compact');
924
+ el.displayMode = 'list-detail';
925
+ await el.updateComplete;
926
+ expect(infiniteScrollerRefreshSpy.callCount, '4th Infinite Scroller Refresh').to.equal(4);
927
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
928
+ expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
929
+ expect(mockAnalyticsHandler.callLabel).to.equal('list-detail');
930
+ // testing: `baseNavigationUrl`
931
+ el.baseNavigationUrl = 'https://funtestsite.com';
932
+ await el.updateComplete;
933
+ expect(infiniteScrollerRefreshSpy.callCount, '5th Infinite Scroller Refresh').to.equal(5);
934
+ // testing: `baseImageUrl`
935
+ el.baseImageUrl = 'https://funtestsiteforimages.com';
936
+ await el.updateComplete;
937
+ expect(infiniteScrollerRefreshSpy.callCount, '6th Infinite Scroller Refresh').to.equal(6);
938
+ });
939
+ it('query the search service for single result', async () => {
940
+ var _a, _b;
941
+ const searchService = new MockSearchService();
921
942
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
922
- </collection-browser>`);
923
- el.baseQuery = 'single-result';
924
- await el.updateComplete;
925
- await el.initialSearchComplete;
926
- expect((_b = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#big-results-label')) === null || _b === void 0 ? void 0 : _b.textContent).to.contains('Result');
927
- });
928
- it('`searchContext` prop helps describe where component is being used', async () => {
929
- const el = await fixture(html `<collection-browser></collection-browser>`);
930
- expect(el.searchContext).to.equal(analyticsCategories.default);
931
- el.searchContext = 'unicorn-search';
932
- await el.updateComplete;
933
- expect(el.searchContext).to.equal('unicorn-search');
934
- // property is reflected as attribute
935
- expect(el.getAttribute('searchcontext')).to.equal('unicorn-search');
936
- });
937
- it('respects the initial set of URL parameters for a general search', async () => {
938
- var _a, _b, _c, _d, _e, _f;
939
- const url = new URL(window.location.href);
940
- const { searchParams } = url;
941
- searchParams.set('query', 'foo');
942
- searchParams.set('sin', 'TXT');
943
- searchParams.set('sort', 'title');
944
- searchParams.append('not[]', 'mediatype:"data"');
945
- searchParams.append('and[]', 'subject:"baz"');
946
- searchParams.append('and[]', 'firstTitle:X');
947
- searchParams.append('and[]', 'year:[2000 TO 2010]');
948
- window.history.replaceState({}, '', url);
949
- const searchService = new MockSearchService();
943
+ </collection-browser>`);
944
+ el.baseQuery = 'single-result';
945
+ await el.updateComplete;
946
+ await el.initialSearchComplete;
947
+ expect((_b = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#big-results-label')) === null || _b === void 0 ? void 0 : _b.textContent).to.contains('Result');
948
+ });
949
+ it('`searchContext` prop helps describe where component is being used', async () => {
950
+ const el = await fixture(html `<collection-browser></collection-browser>`);
951
+ expect(el.searchContext).to.equal(analyticsCategories.default);
952
+ el.searchContext = 'unicorn-search';
953
+ await el.updateComplete;
954
+ expect(el.searchContext).to.equal('unicorn-search');
955
+ // property is reflected as attribute
956
+ expect(el.getAttribute('searchcontext')).to.equal('unicorn-search');
957
+ });
958
+ it('respects the initial set of URL parameters for a general search', async () => {
959
+ var _a, _b, _c, _d, _e, _f;
960
+ const url = new URL(window.location.href);
961
+ const { searchParams } = url;
962
+ searchParams.set('query', 'foo');
963
+ searchParams.set('sin', 'TXT');
964
+ searchParams.set('sort', 'title');
965
+ searchParams.append('not[]', 'mediatype:"data"');
966
+ searchParams.append('and[]', 'subject:"baz"');
967
+ searchParams.append('and[]', 'firstTitle:X');
968
+ searchParams.append('and[]', 'year:[2000 TO 2010]');
969
+ window.history.replaceState({}, '', url);
970
+ const searchService = new MockSearchService();
950
971
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
951
- </collection-browser>`);
952
- await el.initialSearchComplete;
953
- await el.updateComplete;
954
- expect(el.baseQuery).to.equal('foo');
955
- expect(el.searchType).to.equal(SearchType.FULLTEXT);
956
- expect(el.selectedSort).to.equal(SortField.title);
957
- expect((_c = (_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.state).to.equal('hidden');
958
- expect((_f = (_e = (_d = el.selectedFacets) === null || _d === void 0 ? void 0 : _d.subject) === null || _e === void 0 ? void 0 : _e.baz) === null || _f === void 0 ? void 0 : _f.state).to.equal('selected');
959
- expect(el.selectedTitleFilter).to.equal('X');
960
- expect(el.minSelectedDate).to.equal('2000');
961
- expect(el.maxSelectedDate).to.equal('2010');
962
- });
963
- it('respects the initial set of URL parameters within a collection', async () => {
964
- var _a, _b, _c, _d, _e, _f;
965
- const url = new URL(window.location.href);
966
- const { searchParams } = url;
967
- searchParams.set('query', 'foo');
968
- searchParams.set('sin', 'TXT');
969
- searchParams.set('sort', 'title');
970
- searchParams.append('not[]', 'mediatype:"data"');
971
- searchParams.append('and[]', 'subject:"baz"');
972
- searchParams.append('and[]', 'firstTitle:X');
973
- searchParams.append('and[]', 'year:[2000 TO 2010]');
974
- window.history.replaceState({}, '', url);
975
- const searchService = new MockSearchService();
972
+ </collection-browser>`);
973
+ await el.initialSearchComplete;
974
+ await el.updateComplete;
975
+ expect(el.baseQuery).to.equal('foo');
976
+ expect(el.searchType).to.equal(SearchType.FULLTEXT);
977
+ expect(el.selectedSort).to.equal(SortField.title);
978
+ expect((_c = (_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.state).to.equal('hidden');
979
+ expect((_f = (_e = (_d = el.selectedFacets) === null || _d === void 0 ? void 0 : _d.subject) === null || _e === void 0 ? void 0 : _e.baz) === null || _f === void 0 ? void 0 : _f.state).to.equal('selected');
980
+ expect(el.selectedTitleFilter).to.equal('X');
981
+ expect(el.minSelectedDate).to.equal('2000');
982
+ expect(el.maxSelectedDate).to.equal('2010');
983
+ });
984
+ it('respects the initial set of URL parameters within a collection', async () => {
985
+ var _a, _b, _c, _d, _e, _f;
986
+ const url = new URL(window.location.href);
987
+ const { searchParams } = url;
988
+ searchParams.set('query', 'foo');
989
+ searchParams.set('sin', 'TXT');
990
+ searchParams.set('sort', 'title');
991
+ searchParams.append('not[]', 'mediatype:"data"');
992
+ searchParams.append('and[]', 'subject:"baz"');
993
+ searchParams.append('and[]', 'firstTitle:X');
994
+ searchParams.append('and[]', 'year:[2000 TO 2010]');
995
+ window.history.replaceState({}, '', url);
996
+ const searchService = new MockSearchService();
976
997
  const el = await fixture(html `<collection-browser
977
998
  .searchService=${searchService}
978
999
  .withinCollection=${'foobar'}
979
1000
  >
980
- </collection-browser>`);
981
- await el.initialSearchComplete;
982
- await el.updateComplete;
983
- expect(el.withinCollection).to.equal('foobar');
984
- expect(el.baseQuery).to.equal('foo');
985
- expect(el.searchType).to.equal(SearchType.FULLTEXT);
986
- expect(el.selectedSort).to.equal(SortField.title);
987
- expect((_c = (_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.state).to.equal('hidden');
988
- expect((_f = (_e = (_d = el.selectedFacets) === null || _d === void 0 ? void 0 : _d.subject) === null || _e === void 0 ? void 0 : _e.baz) === null || _f === void 0 ? void 0 : _f.state).to.equal('selected');
989
- expect(el.selectedTitleFilter).to.equal('X');
990
- expect(el.minSelectedDate).to.equal('2000');
991
- expect(el.maxSelectedDate).to.equal('2010');
992
- });
993
- it('clears filters except sort when query changes for a general search', async () => {
994
- var _a, _b, _c, _d;
995
- const url = new URL(window.location.href);
996
- const { searchParams } = url;
997
- searchParams.set('query', 'foo');
998
- searchParams.set('sin', 'TXT');
999
- searchParams.set('sort', 'title');
1000
- searchParams.append('not[]', 'mediatype:"data"');
1001
- searchParams.append('and[]', 'subject:"baz"');
1002
- searchParams.append('and[]', 'firstTitle:X');
1003
- searchParams.append('and[]', 'year:[2000 TO 2010]');
1004
- window.history.replaceState({}, '', url);
1005
- const searchService = new MockSearchService();
1001
+ </collection-browser>`);
1002
+ await el.initialSearchComplete;
1003
+ await el.updateComplete;
1004
+ expect(el.withinCollection).to.equal('foobar');
1005
+ expect(el.baseQuery).to.equal('foo');
1006
+ expect(el.searchType).to.equal(SearchType.FULLTEXT);
1007
+ expect(el.selectedSort).to.equal(SortField.title);
1008
+ expect((_c = (_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.state).to.equal('hidden');
1009
+ expect((_f = (_e = (_d = el.selectedFacets) === null || _d === void 0 ? void 0 : _d.subject) === null || _e === void 0 ? void 0 : _e.baz) === null || _f === void 0 ? void 0 : _f.state).to.equal('selected');
1010
+ expect(el.selectedTitleFilter).to.equal('X');
1011
+ expect(el.minSelectedDate).to.equal('2000');
1012
+ expect(el.maxSelectedDate).to.equal('2010');
1013
+ });
1014
+ it('respects the initial set of URL parameters within a profile page', async () => {
1015
+ var _a, _b, _c, _d, _e, _f;
1016
+ const url = new URL(window.location.href);
1017
+ const { searchParams } = url;
1018
+ searchParams.set('query', 'foo');
1019
+ searchParams.append('not[]', 'mediatype:"data"');
1020
+ searchParams.append('and[]', 'subject:"baz"');
1021
+ searchParams.append('and[]', 'firstTitle:X');
1022
+ searchParams.append('and[]', 'year:[2000 TO 2010]');
1023
+ window.history.replaceState({}, '', url);
1024
+ const searchService = new MockSearchService();
1025
+ const el = await fixture(html `<collection-browser
1026
+ .searchService=${searchService}
1027
+ .withinProfile=${'@foobar'}
1028
+ .profileElement=${'uploads'}
1029
+ >
1030
+ </collection-browser>`);
1031
+ await el.initialSearchComplete;
1032
+ await el.updateComplete;
1033
+ expect(el.withinProfile).to.equal('@foobar');
1034
+ expect(el.profileElement).to.equal('uploads');
1035
+ expect(el.baseQuery).to.equal('foo');
1036
+ expect(el.searchType).to.equal(SearchType.METADATA);
1037
+ expect((_c = (_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.state).to.equal('hidden');
1038
+ expect((_f = (_e = (_d = el.selectedFacets) === null || _d === void 0 ? void 0 : _d.subject) === null || _e === void 0 ? void 0 : _e.baz) === null || _f === void 0 ? void 0 : _f.state).to.equal('selected');
1039
+ expect(el.selectedTitleFilter).to.equal('X');
1040
+ expect(el.minSelectedDate).to.equal('2000');
1041
+ expect(el.maxSelectedDate).to.equal('2010');
1042
+ });
1043
+ it('clears filters except sort when query changes for a general search', async () => {
1044
+ var _a, _b, _c, _d;
1045
+ const url = new URL(window.location.href);
1046
+ const { searchParams } = url;
1047
+ searchParams.set('query', 'foo');
1048
+ searchParams.set('sin', 'TXT');
1049
+ searchParams.set('sort', 'title');
1050
+ searchParams.append('not[]', 'mediatype:"data"');
1051
+ searchParams.append('and[]', 'subject:"baz"');
1052
+ searchParams.append('and[]', 'firstTitle:X');
1053
+ searchParams.append('and[]', 'year:[2000 TO 2010]');
1054
+ window.history.replaceState({}, '', url);
1055
+ const searchService = new MockSearchService();
1006
1056
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
1007
- </collection-browser>`);
1008
- await el.initialSearchComplete;
1009
- await el.updateComplete;
1010
- el.baseQuery = 'bar';
1011
- await el.updateComplete;
1012
- expect(el.baseQuery).to.equal('bar');
1013
- expect(el.searchType).to.equal(SearchType.FULLTEXT);
1014
- expect(el.selectedSort).to.equal(SortField.title);
1015
- expect((_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data).not.to.exist;
1016
- expect((_d = (_c = el.selectedFacets) === null || _c === void 0 ? void 0 : _c.subject) === null || _d === void 0 ? void 0 : _d.baz).not.to.exist;
1017
- expect(el.selectedTitleFilter).not.to.exist;
1018
- expect(el.minSelectedDate).not.to.exist;
1019
- expect(el.maxSelectedDate).not.to.exist;
1020
- });
1021
- it('clears filters except sort when query changes within a collection', async () => {
1022
- var _a, _b, _c, _d;
1023
- const url = new URL(window.location.href);
1024
- const { searchParams } = url;
1025
- searchParams.set('query', 'foo');
1026
- searchParams.set('sin', 'TXT');
1027
- searchParams.set('sort', 'title');
1028
- searchParams.append('not[]', 'mediatype:"data"');
1029
- searchParams.append('and[]', 'subject:"baz"');
1030
- searchParams.append('and[]', 'firstTitle:X');
1031
- searchParams.append('and[]', 'year:[2000 TO 2010]');
1032
- window.history.replaceState({}, '', url);
1033
- const searchService = new MockSearchService();
1057
+ </collection-browser>`);
1058
+ await el.initialSearchComplete;
1059
+ await el.updateComplete;
1060
+ el.baseQuery = 'bar';
1061
+ await el.updateComplete;
1062
+ expect(el.baseQuery).to.equal('bar');
1063
+ expect(el.searchType).to.equal(SearchType.FULLTEXT);
1064
+ expect(el.selectedSort).to.equal(SortField.title);
1065
+ expect((_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data).not.to.exist;
1066
+ expect((_d = (_c = el.selectedFacets) === null || _c === void 0 ? void 0 : _c.subject) === null || _d === void 0 ? void 0 : _d.baz).not.to.exist;
1067
+ expect(el.selectedTitleFilter).not.to.exist;
1068
+ expect(el.minSelectedDate).not.to.exist;
1069
+ expect(el.maxSelectedDate).not.to.exist;
1070
+ });
1071
+ it('clears filters except sort when query changes within a collection', async () => {
1072
+ var _a, _b, _c, _d;
1073
+ const url = new URL(window.location.href);
1074
+ const { searchParams } = url;
1075
+ searchParams.set('query', 'foo');
1076
+ searchParams.set('sin', 'TXT');
1077
+ searchParams.set('sort', 'title');
1078
+ searchParams.append('not[]', 'mediatype:"data"');
1079
+ searchParams.append('and[]', 'subject:"baz"');
1080
+ searchParams.append('and[]', 'firstTitle:X');
1081
+ searchParams.append('and[]', 'year:[2000 TO 2010]');
1082
+ window.history.replaceState({}, '', url);
1083
+ const searchService = new MockSearchService();
1034
1084
  const el = await fixture(html `<collection-browser
1035
1085
  .searchService=${searchService}
1036
1086
  .withinCollection=${'foobar'}
1037
1087
  >
1038
- </collection-browser>`);
1039
- await el.initialSearchComplete;
1040
- await el.updateComplete;
1041
- el.baseQuery = 'bar';
1042
- await el.updateComplete;
1043
- expect(el.withinCollection).to.equal('foobar');
1044
- expect(el.baseQuery).to.equal('bar');
1045
- expect(el.searchType).to.equal(SearchType.FULLTEXT);
1046
- expect(el.selectedSort).to.equal(SortField.title);
1047
- expect((_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data).not.to.exist;
1048
- expect((_d = (_c = el.selectedFacets) === null || _c === void 0 ? void 0 : _c.subject) === null || _d === void 0 ? void 0 : _d.baz).not.to.exist;
1049
- expect(el.selectedTitleFilter).not.to.exist;
1050
- expect(el.minSelectedDate).not.to.exist;
1051
- expect(el.maxSelectedDate).not.to.exist;
1052
- });
1053
- it('clears filters *including* sort when target collection changes', async () => {
1054
- var _a, _b, _c, _d;
1055
- const url = new URL(window.location.href);
1056
- const { searchParams } = url;
1057
- searchParams.set('query', 'foo');
1058
- searchParams.set('sin', 'TXT');
1059
- searchParams.set('sort', 'title');
1060
- searchParams.append('not[]', 'mediatype:"data"');
1061
- searchParams.append('and[]', 'subject:"baz"');
1062
- searchParams.append('and[]', 'firstTitle:X');
1063
- searchParams.append('and[]', 'year:[2000 TO 2010]');
1064
- window.history.replaceState({}, '', url);
1065
- const searchService = new MockSearchService();
1088
+ </collection-browser>`);
1089
+ el.baseQuery = 'bar';
1090
+ await el.updateComplete;
1091
+ expect(el.withinCollection).to.equal('foobar');
1092
+ expect(el.baseQuery).to.equal('bar');
1093
+ expect(el.searchType).to.equal(SearchType.FULLTEXT);
1094
+ expect(el.selectedSort).to.equal(SortField.title);
1095
+ expect((_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data).not.to.exist;
1096
+ expect((_d = (_c = el.selectedFacets) === null || _c === void 0 ? void 0 : _c.subject) === null || _d === void 0 ? void 0 : _d.baz).not.to.exist;
1097
+ expect(el.selectedTitleFilter).not.to.exist;
1098
+ expect(el.minSelectedDate).not.to.exist;
1099
+ expect(el.maxSelectedDate).not.to.exist;
1100
+ });
1101
+ it('clears filters *including* sort when target collection changes', async () => {
1102
+ var _a, _b, _c, _d;
1103
+ const url = new URL(window.location.href);
1104
+ const { searchParams } = url;
1105
+ searchParams.set('query', 'foo');
1106
+ searchParams.set('sin', 'TXT');
1107
+ searchParams.set('sort', 'title');
1108
+ searchParams.append('not[]', 'mediatype:"data"');
1109
+ searchParams.append('and[]', 'subject:"baz"');
1110
+ searchParams.append('and[]', 'firstTitle:X');
1111
+ searchParams.append('and[]', 'year:[2000 TO 2010]');
1112
+ window.history.replaceState({}, '', url);
1113
+ const searchService = new MockSearchService();
1066
1114
  const el = await fixture(html `<collection-browser
1067
1115
  .searchService=${searchService}
1068
1116
  .withinCollection=${'foobar'}
1069
1117
  >
1070
- </collection-browser>`);
1071
- await el.initialSearchComplete;
1072
- await el.updateComplete;
1073
- el.withinCollection = 'bar';
1074
- await el.updateComplete;
1075
- expect(el.withinCollection).to.equal('bar');
1076
- expect(el.baseQuery).to.equal('foo');
1077
- expect(el.searchType).to.equal(SearchType.FULLTEXT);
1078
- expect(el.selectedSort).to.equal(SortField.default);
1079
- expect((_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data).not.to.exist;
1080
- expect((_d = (_c = el.selectedFacets) === null || _c === void 0 ? void 0 : _c.subject) === null || _d === void 0 ? void 0 : _d.baz).not.to.exist;
1081
- expect(el.selectedTitleFilter).not.to.exist;
1082
- expect(el.minSelectedDate).not.to.exist;
1083
- expect(el.maxSelectedDate).not.to.exist;
1084
- });
1085
- it('shows temporarily unavailable message when facets suppressed', async () => {
1086
- var _a, _b;
1087
- const searchService = new MockSearchService();
1118
+ </collection-browser>`);
1119
+ el.withinCollection = 'bar';
1120
+ await el.updateComplete;
1121
+ expect(el.withinCollection).to.equal('bar');
1122
+ expect(el.baseQuery).to.equal('foo');
1123
+ expect(el.searchType).to.equal(SearchType.FULLTEXT);
1124
+ expect(el.selectedSort).to.equal(SortField.default);
1125
+ expect((_b = (_a = el.selectedFacets) === null || _a === void 0 ? void 0 : _a.mediatype) === null || _b === void 0 ? void 0 : _b.data).not.to.exist;
1126
+ expect((_d = (_c = el.selectedFacets) === null || _c === void 0 ? void 0 : _c.subject) === null || _d === void 0 ? void 0 : _d.baz).not.to.exist;
1127
+ expect(el.selectedTitleFilter).not.to.exist;
1128
+ expect(el.minSelectedDate).not.to.exist;
1129
+ expect(el.maxSelectedDate).not.to.exist;
1130
+ });
1131
+ it('correctly retrieves web archive hits', async () => {
1132
+ var _a, _b, _c;
1133
+ const searchService = new MockSearchService();
1134
+ const el = await fixture(html `<collection-browser
1135
+ .searchService=${searchService}
1136
+ .withinProfile=${'@foo'}
1137
+ .profileElement=${'web_archives'}
1138
+ >
1139
+ </collection-browser>`);
1140
+ el.baseQuery = 'web-archive';
1141
+ await el.updateComplete;
1142
+ await el.initialSearchComplete;
1143
+ await nextTick();
1144
+ console.log('\n\n*****\n\n*****\n\n', el.dataSource.getAllPages(), '\n\n*****\n\n*****\n\n');
1145
+ expect(el.dataSource.totalResults, 'total results').to.equal(1);
1146
+ expect((_a = el.dataSource.getTileModelAt(0)) === null || _a === void 0 ? void 0 : _a.title).to.equal('https://example.com');
1147
+ expect((_c = (_b = el.dataSource.getTileModelAt(0)) === null || _b === void 0 ? void 0 : _b.captureDates) === null || _c === void 0 ? void 0 : _c.length, 'capture dates').to.equal(1);
1148
+ });
1149
+ it('shows temporarily unavailable message when facets suppressed', async () => {
1150
+ var _a, _b;
1151
+ const searchService = new MockSearchService();
1088
1152
  const el = await fixture(html `<collection-browser .searchService=${searchService} suppressFacets>
1089
- </collection-browser>`);
1090
- el.baseQuery = 'foo';
1091
- await el.updateComplete;
1092
- await el.initialSearchComplete;
1093
- const facetsMsg = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.facets-message');
1094
- expect(facetsMsg).to.exist;
1095
- expect((_b = facetsMsg === null || facetsMsg === void 0 ? void 0 : facetsMsg.textContent) === null || _b === void 0 ? void 0 : _b.trim()).to.equal('Facets are temporarily unavailable.');
1096
- });
1097
- it('shows manage bar interface instead of sort bar when in manage view', async () => {
1098
- var _a, _b, _c, _d;
1099
- const searchService = new MockSearchService();
1153
+ </collection-browser>`);
1154
+ el.baseQuery = 'foo';
1155
+ await el.updateComplete;
1156
+ await el.initialSearchComplete;
1157
+ const facetsMsg = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.facets-message');
1158
+ expect(facetsMsg).to.exist;
1159
+ expect((_b = facetsMsg === null || facetsMsg === void 0 ? void 0 : facetsMsg.textContent) === null || _b === void 0 ? void 0 : _b.trim()).to.equal('Facets are temporarily unavailable.');
1160
+ });
1161
+ it('shows manage bar interface instead of sort bar when in manage view', async () => {
1162
+ var _a, _b, _c, _d;
1163
+ const searchService = new MockSearchService();
1100
1164
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
1101
- </collection-browser>`);
1102
- el.baseQuery = 'foo';
1103
- await el.updateComplete;
1104
- await el.initialSearchComplete;
1105
- el.isManageView = true;
1106
- await el.updateComplete;
1107
- expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('manage-bar')).to.exist;
1108
- expect((_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('sort-filter-bar')).not.to.exist;
1109
- el.isManageView = false;
1110
- await el.updateComplete;
1111
- expect((_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('manage-bar')).not.to.exist;
1112
- expect((_d = el.shadowRoot) === null || _d === void 0 ? void 0 : _d.querySelector('sort-filter-bar')).to.exist;
1113
- });
1114
- it('switches to grid display mode when manage view activated', async () => {
1115
- const searchService = new MockSearchService();
1165
+ </collection-browser>`);
1166
+ el.baseQuery = 'foo';
1167
+ await el.updateComplete;
1168
+ await el.initialSearchComplete;
1169
+ el.isManageView = true;
1170
+ await el.updateComplete;
1171
+ expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('manage-bar')).to.exist;
1172
+ expect((_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('sort-filter-bar')).not.to.exist;
1173
+ el.isManageView = false;
1174
+ await el.updateComplete;
1175
+ expect((_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('manage-bar')).not.to.exist;
1176
+ expect((_d = el.shadowRoot) === null || _d === void 0 ? void 0 : _d.querySelector('sort-filter-bar')).to.exist;
1177
+ });
1178
+ it('switches to grid display mode when manage view activated', async () => {
1179
+ const searchService = new MockSearchService();
1116
1180
  const el = await fixture(html `<collection-browser
1117
1181
  .searchService=${searchService}
1118
1182
  .baseQuery=${'foo'}
1119
1183
  .displayMode=${'list-detail'}
1120
1184
  >
1121
- </collection-browser>`);
1122
- el.isManageView = true;
1123
- await el.updateComplete;
1124
- expect(el.displayMode).to.equal('grid');
1125
- });
1126
- it('can remove all checked tiles', async () => {
1127
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1128
- const searchService = new MockSearchService();
1185
+ </collection-browser>`);
1186
+ el.isManageView = true;
1187
+ await el.updateComplete;
1188
+ expect(el.displayMode).to.equal('grid');
1189
+ });
1190
+ it('can remove all checked tiles', async () => {
1191
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1192
+ const searchService = new MockSearchService();
1129
1193
  const el = await fixture(html `<collection-browser
1130
1194
  .searchService=${searchService}
1131
1195
  .baseNavigationUrl=${''}
1132
1196
  >
1133
- </collection-browser>`);
1134
- el.baseQuery = 'foo';
1135
- el.pageSize = 1; // To hit the edge case of a page break while offsetting tiles
1136
- await el.updateComplete;
1137
- await el.initialSearchComplete;
1138
- el.isManageView = true;
1139
- await el.updateComplete;
1140
- const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
1141
- expect(infiniteScroller).to.exist;
1142
- let tiles = (_b = infiniteScroller.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('tile-dispatcher');
1143
- expect(tiles).to.exist;
1144
- expect(tiles === null || tiles === void 0 ? void 0 : tiles.length).to.equal(2);
1145
- const firstTile = tiles[0];
1146
- const firstTileLink = (_c = firstTile.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]');
1147
- expect((_d = firstTile.model) === null || _d === void 0 ? void 0 : _d.identifier).to.equal('foo');
1148
- expect(firstTileLink).to.exist;
1149
- // No effect if no tiles checked
1150
- el.removeCheckedTiles();
1151
- await el.updateComplete;
1152
- tiles = (_e = infiniteScroller.shadowRoot) === null || _e === void 0 ? void 0 : _e.querySelectorAll('tile-dispatcher');
1153
- expect(tiles).to.exist;
1154
- expect(tiles === null || tiles === void 0 ? void 0 : tiles.length).to.equal(2);
1155
- // Check the first tile
1156
- firstTileLink.click();
1157
- expect((_f = firstTile.model) === null || _f === void 0 ? void 0 : _f.checked).to.be.true;
1158
- // Remove checked tiles and verify that we only kept the second tile
1159
- el.removeCheckedTiles();
1160
- await el.updateComplete;
1161
- expect((_g = el === null || el === void 0 ? void 0 : el.dataSource) === null || _g === void 0 ? void 0 : _g.size, 'data source count').to.equal(1);
1162
- tiles = (_j = (_h = el.shadowRoot) === null || _h === void 0 ? void 0 : _h.querySelector('infinite-scroller').shadowRoot) === null || _j === void 0 ? void 0 : _j.querySelectorAll('tile-dispatcher');
1163
- expect(tiles).to.exist;
1164
- // TODO: FIX THIS AS IT BROKE IN MAIN REFACTOR. (WEBDEV-6081 @latonv)
1165
- // COMMENTING OUT FOR NOW TO GET CI GREEN.
1166
- // expect(tiles!.length, 'tile count after `el.removeCheckedTiles()`').to.equal(1);
1167
- });
1168
- it('can check/uncheck all tiles', async () => {
1169
- const searchService = new MockSearchService();
1197
+ </collection-browser>`);
1198
+ el.baseQuery = 'foo';
1199
+ el.pageSize = 1; // To hit the edge case of a page break while offsetting tiles
1200
+ await el.updateComplete;
1201
+ await el.initialSearchComplete;
1202
+ el.isManageView = true;
1203
+ await el.updateComplete;
1204
+ const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
1205
+ expect(infiniteScroller).to.exist;
1206
+ let tiles = (_b = infiniteScroller.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('tile-dispatcher');
1207
+ expect(tiles).to.exist;
1208
+ expect(tiles === null || tiles === void 0 ? void 0 : tiles.length).to.equal(2);
1209
+ const firstTile = tiles[0];
1210
+ const firstTileLink = (_c = firstTile.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]');
1211
+ expect((_d = firstTile.model) === null || _d === void 0 ? void 0 : _d.identifier).to.equal('foo');
1212
+ expect(firstTileLink).to.exist;
1213
+ // No effect if no tiles checked
1214
+ el.removeCheckedTiles();
1215
+ await el.updateComplete;
1216
+ tiles = (_e = infiniteScroller.shadowRoot) === null || _e === void 0 ? void 0 : _e.querySelectorAll('tile-dispatcher');
1217
+ expect(tiles).to.exist;
1218
+ expect(tiles === null || tiles === void 0 ? void 0 : tiles.length).to.equal(2);
1219
+ // Check the first tile
1220
+ firstTileLink.click();
1221
+ expect((_f = firstTile.model) === null || _f === void 0 ? void 0 : _f.checked).to.be.true;
1222
+ // Remove checked tiles and verify that we only kept the second tile
1223
+ el.removeCheckedTiles();
1224
+ await el.updateComplete;
1225
+ expect((_g = el === null || el === void 0 ? void 0 : el.dataSource) === null || _g === void 0 ? void 0 : _g.size, 'data source count').to.equal(1);
1226
+ tiles = (_j = (_h = el.shadowRoot) === null || _h === void 0 ? void 0 : _h.querySelector('infinite-scroller').shadowRoot) === null || _j === void 0 ? void 0 : _j.querySelectorAll('tile-dispatcher');
1227
+ expect(tiles).to.exist;
1228
+ expect(tiles.length, 'tile count after `el.removeCheckedTiles()`').to.equal(1);
1229
+ });
1230
+ it('can check/uncheck all tiles', async () => {
1231
+ const searchService = new MockSearchService();
1170
1232
  const el = await fixture(html `<collection-browser
1171
1233
  .searchService=${searchService}
1172
1234
  .baseNavigationUrl=${''}
1173
1235
  >
1174
- </collection-browser>`);
1175
- el.baseQuery = 'foo';
1176
- await el.updateComplete;
1177
- await el.initialSearchComplete;
1178
- el.isManageView = true;
1179
- await el.updateComplete;
1180
- expect(el.dataSource.checkedTileModels.length).to.equal(0);
1181
- expect(el.dataSource.uncheckedTileModels.length).to.equal(2);
1182
- el.dataSource.checkAllTiles();
1183
- expect(el.dataSource.checkedTileModels.length).to.equal(2);
1184
- expect(el.dataSource.uncheckedTileModels.length).to.equal(0);
1185
- el.dataSource.uncheckAllTiles();
1186
- expect(el.dataSource.checkedTileModels.length).to.equal(0);
1187
- expect(el.dataSource.uncheckedTileModels.length).to.equal(2);
1188
- });
1189
- it('emits event when item removal requested', async () => {
1190
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1191
- const spy = sinon.spy();
1192
- const searchService = new MockSearchService();
1236
+ </collection-browser>`);
1237
+ el.baseQuery = 'foo';
1238
+ await el.updateComplete;
1239
+ await el.initialSearchComplete;
1240
+ el.isManageView = true;
1241
+ await el.updateComplete;
1242
+ expect(el.dataSource.checkedTileModels.length).to.equal(0);
1243
+ expect(el.dataSource.uncheckedTileModels.length).to.equal(2);
1244
+ el.dataSource.checkAllTiles();
1245
+ expect(el.dataSource.checkedTileModels.length).to.equal(2);
1246
+ expect(el.dataSource.uncheckedTileModels.length).to.equal(0);
1247
+ el.dataSource.uncheckAllTiles();
1248
+ expect(el.dataSource.checkedTileModels.length).to.equal(0);
1249
+ expect(el.dataSource.uncheckedTileModels.length).to.equal(2);
1250
+ });
1251
+ it('emits event when item removal requested', async () => {
1252
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1253
+ const spy = sinon.spy();
1254
+ const searchService = new MockSearchService();
1193
1255
  const el = await fixture(html `<collection-browser
1194
1256
  .searchService=${searchService}
1195
1257
  .baseNavigationUrl=${''}
1196
1258
  @itemRemovalRequested=${spy}
1197
1259
  >
1198
- </collection-browser>`);
1199
- el.baseQuery = 'foo';
1200
- await el.updateComplete;
1201
- await el.initialSearchComplete;
1202
- el.isManageView = true;
1203
- await el.updateComplete;
1204
- const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
1205
- expect(infiniteScroller).to.exist;
1206
- const tiles = (_b = infiniteScroller.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('tile-dispatcher');
1207
- expect(tiles).to.exist.and.have.length(2);
1208
- const firstTile = tiles[0];
1209
- const firstTileLink = (_c = firstTile.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]');
1210
- expect((_d = firstTile.model) === null || _d === void 0 ? void 0 : _d.identifier).to.equal('foo');
1211
- expect(firstTileLink).to.exist;
1212
- // Check the first tile
1213
- firstTileLink.click();
1214
- await el.updateComplete;
1215
- const manageBar = (_e = el.shadowRoot) === null || _e === void 0 ? void 0 : _e.querySelector('manage-bar');
1216
- expect(manageBar).to.exist;
1217
- // Emit remove event from manage bar
1218
- manageBar.dispatchEvent(new CustomEvent('removeItems'));
1219
- await el.updateComplete;
1220
- expect(spy.callCount).to.equal(1);
1221
- expect(spy.args[0].length).to.equal(1);
1222
- expect((_j = (_h = (_g = (_f = spy.args[0][0]) === null || _f === void 0 ? void 0 : _f.detail) === null || _g === void 0 ? void 0 : _g.items) === null || _h === void 0 ? void 0 : _h[0]) === null || _j === void 0 ? void 0 : _j.identifier).to.equal('foo');
1223
- });
1224
- it('disables manage view when manage bar cancelled', async () => {
1225
- var _a;
1226
- const searchService = new MockSearchService();
1260
+ </collection-browser>`);
1261
+ el.baseQuery = 'foo';
1262
+ await el.updateComplete;
1263
+ await el.initialSearchComplete;
1264
+ el.isManageView = true;
1265
+ await el.updateComplete;
1266
+ const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
1267
+ expect(infiniteScroller).to.exist;
1268
+ const tiles = (_b = infiniteScroller.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('tile-dispatcher');
1269
+ expect(tiles).to.exist.and.have.length(2);
1270
+ const firstTile = tiles[0];
1271
+ const firstTileLink = (_c = firstTile.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]');
1272
+ expect((_d = firstTile.model) === null || _d === void 0 ? void 0 : _d.identifier).to.equal('foo');
1273
+ expect(firstTileLink).to.exist;
1274
+ // Check the first tile
1275
+ firstTileLink.click();
1276
+ await el.updateComplete;
1277
+ const manageBar = (_e = el.shadowRoot) === null || _e === void 0 ? void 0 : _e.querySelector('manage-bar');
1278
+ expect(manageBar).to.exist;
1279
+ // Emit remove event from manage bar
1280
+ manageBar.dispatchEvent(new CustomEvent('removeItems'));
1281
+ await el.updateComplete;
1282
+ expect(spy.callCount).to.equal(1);
1283
+ expect(spy.args[0].length).to.equal(1);
1284
+ expect((_j = (_h = (_g = (_f = spy.args[0][0]) === null || _f === void 0 ? void 0 : _f.detail) === null || _g === void 0 ? void 0 : _g.items) === null || _h === void 0 ? void 0 : _h[0]) === null || _j === void 0 ? void 0 : _j.identifier).to.equal('foo');
1285
+ });
1286
+ it('disables manage view when manage bar cancelled', async () => {
1287
+ var _a;
1288
+ const searchService = new MockSearchService();
1227
1289
  const el = await fixture(html `<collection-browser
1228
1290
  .searchService=${searchService}
1229
1291
  .baseNavigationUrl=${''}
1230
1292
  >
1231
- </collection-browser>`);
1232
- el.baseQuery = 'foo';
1233
- await el.updateComplete;
1234
- await el.initialSearchComplete;
1235
- el.isManageView = true;
1236
- await el.updateComplete;
1237
- const manageBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('manage-bar');
1238
- expect(manageBar).to.exist;
1239
- // Emit remove event from manage bar
1240
- manageBar.dispatchEvent(new CustomEvent('cancel'));
1241
- await el.updateComplete;
1242
- expect(el.isManageView).to.be.false;
1243
- });
1244
- it('loans-tab sort-filter-bar', async () => {
1245
- var _a;
1293
+ </collection-browser>`);
1294
+ el.baseQuery = 'foo';
1295
+ await el.updateComplete;
1296
+ await el.initialSearchComplete;
1297
+ el.isManageView = true;
1298
+ await el.updateComplete;
1299
+ const manageBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('manage-bar');
1300
+ expect(manageBar).to.exist;
1301
+ // Emit remove event from manage bar
1302
+ manageBar.dispatchEvent(new CustomEvent('cancel'));
1303
+ await el.updateComplete;
1304
+ expect(el.isManageView).to.be.false;
1305
+ });
1306
+ it('loans-tab sort-filter-bar', async () => {
1307
+ var _a;
1246
1308
  const el = await fixture(html `<collection-browser .baseNavigationUrl=${''} .isLoansTab=${true}>
1247
- </collection-browser>`);
1248
- const loansTabSlot = (_a = el === null || el === void 0 ? void 0 : el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot');
1249
- expect(el.isLoansTab).to.equal(true);
1250
- expect(loansTabSlot).to.exist;
1251
- });
1252
- });
1309
+ </collection-browser>`);
1310
+ const loansTabSlot = (_a = el === null || el === void 0 ? void 0 : el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot');
1311
+ expect(el.isLoansTab).to.equal(true);
1312
+ expect(loansTabSlot).to.exist;
1313
+ });
1314
+ });
1253
1315
  //# sourceMappingURL=collection-browser.test.js.map