@internetarchive/collection-browser 2.7.7 → 2.7.8-alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) 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 +13 -13
  6. package/dist/index.js +13 -13
  7. package/dist/src/app-root.d.ts +107 -99
  8. package/dist/src/app-root.js +539 -505
  9. package/dist/src/app-root.js.map +1 -1
  10. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  11. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  12. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  13. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  14. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  15. package/dist/src/assets/img/icons/chevron.js +2 -2
  16. package/dist/src/assets/img/icons/contract.d.ts +2 -2
  17. package/dist/src/assets/img/icons/contract.js +2 -2
  18. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  19. package/dist/src/assets/img/icons/empty-query.js +2 -2
  20. package/dist/src/assets/img/icons/expand.d.ts +2 -2
  21. package/dist/src/assets/img/icons/expand.js +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  23. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  24. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  25. package/dist/src/assets/img/icons/eye.js +2 -2
  26. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  27. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  28. package/dist/src/assets/img/icons/favorite-unfilled.d.ts +1 -1
  29. package/dist/src/assets/img/icons/favorite-unfilled.js +2 -2
  30. package/dist/src/assets/img/icons/filter.d.ts +2 -2
  31. package/dist/src/assets/img/icons/filter.js +2 -2
  32. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  33. package/dist/src/assets/img/icons/login-required.js +2 -2
  34. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  35. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  36. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  37. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  38. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  39. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  40. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  41. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  42. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  43. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  44. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  45. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  46. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  47. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  48. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  49. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  50. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -1
  51. package/dist/src/assets/img/icons/mediatype/search.js +2 -2
  52. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  53. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  54. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  55. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  56. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  57. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  58. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  59. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  60. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  61. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  62. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  63. package/dist/src/assets/img/icons/null-result.js +2 -2
  64. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  65. package/dist/src/assets/img/icons/restricted.js +2 -2
  66. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  67. package/dist/src/assets/img/icons/reviews.js +2 -2
  68. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  69. package/dist/src/assets/img/icons/upload.js +2 -2
  70. package/dist/src/assets/img/icons/views.d.ts +1 -1
  71. package/dist/src/assets/img/icons/views.js +2 -2
  72. package/dist/src/circular-activity-indicator.d.ts +5 -5
  73. package/dist/src/circular-activity-indicator.js +17 -17
  74. package/dist/src/collection-browser.d.ts +602 -582
  75. package/dist/src/collection-browser.js +1671 -1629
  76. package/dist/src/collection-browser.js.map +1 -1
  77. package/dist/src/collection-facets/facet-row.d.ts +30 -30
  78. package/dist/src/collection-facets/facet-row.js +118 -118
  79. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  80. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  81. package/dist/src/collection-facets/facets-template.d.ts +13 -13
  82. package/dist/src/collection-facets/facets-template.js +44 -44
  83. package/dist/src/collection-facets/more-facets-content.d.ts +106 -106
  84. package/dist/src/collection-facets/more-facets-content.js +407 -407
  85. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  86. package/dist/src/collection-facets/more-facets-pagination.js +196 -196
  87. package/dist/src/collection-facets/smart-facets/dedupe.d.ts +10 -10
  88. package/dist/src/collection-facets/smart-facets/dedupe.js +33 -33
  89. package/dist/src/collection-facets/smart-facets/heuristics/browser-language-heuristic.d.ts +5 -5
  90. package/dist/src/collection-facets/smart-facets/heuristics/browser-language-heuristic.js +23 -23
  91. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords-heuristic.d.ts +5 -5
  92. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords-heuristic.js +44 -44
  93. package/dist/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.d.ts +5 -5
  94. package/dist/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.js +172 -172
  95. package/dist/src/collection-facets/smart-facets/models.d.ts +26 -26
  96. package/dist/src/collection-facets/smart-facets/models.js +1 -1
  97. package/dist/src/collection-facets/smart-facets/smart-facet-bar.d.ts +31 -31
  98. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +240 -240
  99. package/dist/src/collection-facets/smart-facets/smart-facet-button.d.ts +11 -11
  100. package/dist/src/collection-facets/smart-facets/smart-facet-button.js +86 -86
  101. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.d.ts +16 -16
  102. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +100 -100
  103. package/dist/src/collection-facets/smart-facets/smart-facet-equals.d.ts +2 -2
  104. package/dist/src/collection-facets/smart-facets/smart-facet-equals.js +12 -12
  105. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.d.ts +5 -5
  106. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js +15 -15
  107. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  108. package/dist/src/collection-facets/toggle-switch.js +94 -94
  109. package/dist/src/collection-facets.d.ts +103 -103
  110. package/dist/src/collection-facets.js +522 -522
  111. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +245 -241
  112. package/dist/src/data-source/collection-browser-data-source-interface.js +1 -1
  113. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -1
  114. package/dist/src/data-source/collection-browser-data-source.d.ts +377 -373
  115. package/dist/src/data-source/collection-browser-data-source.js +995 -982
  116. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  117. package/dist/src/data-source/collection-browser-query-state.d.ts +44 -43
  118. package/dist/src/data-source/collection-browser-query-state.js +1 -1
  119. package/dist/src/data-source/collection-browser-query-state.js.map +1 -1
  120. package/dist/src/data-source/models.d.ts +28 -28
  121. package/dist/src/data-source/models.js +8 -8
  122. package/dist/src/empty-placeholder.d.ts +23 -23
  123. package/dist/src/empty-placeholder.js +79 -79
  124. package/dist/src/expanded-date-picker.d.ts +43 -43
  125. package/dist/src/expanded-date-picker.js +109 -109
  126. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  127. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  128. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  129. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  130. package/dist/src/manage/manage-bar.d.ts +58 -35
  131. package/dist/src/manage/manage-bar.js +174 -80
  132. package/dist/src/manage/manage-bar.js.map +1 -1
  133. package/dist/src/manage/remove-items-modal-content.d.ts +9 -0
  134. package/dist/src/manage/remove-items-modal-content.js +104 -0
  135. package/dist/src/manage/remove-items-modal-content.js.map +1 -0
  136. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  137. package/dist/src/mediatype/mediatype-config.js +91 -91
  138. package/dist/src/models.d.ts +228 -219
  139. package/dist/src/models.js +401 -401
  140. package/dist/src/models.js.map +1 -1
  141. package/dist/src/restoration-state-handler.d.ts +70 -70
  142. package/dist/src/restoration-state-handler.js +363 -363
  143. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  144. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  145. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  146. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  147. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  148. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  149. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  150. package/dist/src/sort-filter-bar/img/list.js +2 -2
  151. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  152. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  153. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  154. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  155. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  156. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  157. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  158. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  159. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  160. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  161. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +223 -223
  162. package/dist/src/sort-filter-bar/sort-filter-bar.js +697 -697
  163. package/dist/src/styles/ia-button.d.ts +2 -2
  164. package/dist/src/styles/ia-button.js +17 -17
  165. package/dist/src/styles/item-image-styles.d.ts +8 -8
  166. package/dist/src/styles/item-image-styles.js +9 -9
  167. package/dist/src/styles/sr-only.d.ts +1 -1
  168. package/dist/src/styles/sr-only.js +2 -2
  169. package/dist/src/tiles/base-tile-component.d.ts +19 -19
  170. package/dist/src/tiles/base-tile-component.js +64 -64
  171. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  172. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  173. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  174. package/dist/src/tiles/grid/account-tile.js +72 -72
  175. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  176. package/dist/src/tiles/grid/collection-tile.js +80 -80
  177. package/dist/src/tiles/grid/item-tile.d.ts +34 -34
  178. package/dist/src/tiles/grid/item-tile.js +158 -158
  179. package/dist/src/tiles/grid/search-tile.d.ts +10 -10
  180. package/dist/src/tiles/grid/search-tile.js +51 -51
  181. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  182. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  183. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  184. package/dist/src/tiles/grid/tile-stats.js +53 -53
  185. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  186. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  187. package/dist/src/tiles/hover/tile-hover-pane.d.ts +18 -18
  188. package/dist/src/tiles/hover/tile-hover-pane.js +69 -69
  189. package/dist/src/tiles/image-block.d.ts +18 -18
  190. package/dist/src/tiles/image-block.js +89 -89
  191. package/dist/src/tiles/item-image.d.ts +39 -39
  192. package/dist/src/tiles/item-image.js +154 -154
  193. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  194. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  195. package/dist/src/tiles/list/tile-list-compact.d.ts +19 -19
  196. package/dist/src/tiles/list/tile-list-compact.js +122 -122
  197. package/dist/src/tiles/list/tile-list.d.ts +54 -54
  198. package/dist/src/tiles/list/tile-list.js +323 -323
  199. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  200. package/dist/src/tiles/mediatype-icon.js +47 -47
  201. package/dist/src/tiles/overlay/icon-overlay.d.ts +8 -8
  202. package/dist/src/tiles/overlay/icon-overlay.js +25 -25
  203. package/dist/src/tiles/overlay/text-overlay.d.ts +9 -9
  204. package/dist/src/tiles/overlay/text-overlay.js +31 -31
  205. package/dist/src/tiles/review-block.d.ts +12 -12
  206. package/dist/src/tiles/review-block.js +56 -56
  207. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  208. package/dist/src/tiles/text-snippet-block.js +73 -73
  209. package/dist/src/tiles/tile-dispatcher.d.ts +64 -64
  210. package/dist/src/tiles/tile-dispatcher.js +230 -230
  211. package/dist/src/tiles/tile-display-value-provider.d.ts +47 -47
  212. package/dist/src/tiles/tile-display-value-provider.js +94 -94
  213. package/dist/src/utils/analytics-events.d.ts +28 -28
  214. package/dist/src/utils/analytics-events.js +30 -30
  215. package/dist/src/utils/array-equals.d.ts +4 -4
  216. package/dist/src/utils/array-equals.js +10 -10
  217. package/dist/src/utils/collapse-repeated-quotes.d.ts +11 -11
  218. package/dist/src/utils/collapse-repeated-quotes.js +13 -13
  219. package/dist/src/utils/facet-utils.d.ts +83 -83
  220. package/dist/src/utils/facet-utils.js +145 -145
  221. package/dist/src/utils/format-count.d.ts +7 -7
  222. package/dist/src/utils/format-count.js +76 -76
  223. package/dist/src/utils/format-date.d.ts +2 -2
  224. package/dist/src/utils/format-date.js +27 -27
  225. package/dist/src/utils/format-unit-size.d.ts +2 -2
  226. package/dist/src/utils/format-unit-size.js +33 -33
  227. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  228. package/dist/src/utils/local-date-from-utc.js +15 -15
  229. package/dist/src/utils/log.d.ts +7 -7
  230. package/dist/src/utils/log.js +15 -15
  231. package/dist/src/utils/resolve-mediatype.d.ts +8 -8
  232. package/dist/src/utils/resolve-mediatype.js +23 -23
  233. package/dist/src/utils/sha1.d.ts +2 -2
  234. package/dist/src/utils/sha1.js +8 -8
  235. package/dist/test/collection-browser.test.d.ts +1 -1
  236. package/dist/test/collection-browser.test.js +1309 -1293
  237. package/dist/test/collection-browser.test.js.map +1 -1
  238. package/dist/test/collection-facets/facet-row.test.d.ts +1 -1
  239. package/dist/test/collection-facets/facet-row.test.js +227 -227
  240. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  241. package/dist/test/collection-facets/facets-template.test.js +91 -91
  242. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  243. package/dist/test/collection-facets/more-facets-content.test.js +141 -141
  244. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  245. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  246. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  247. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  248. package/dist/test/collection-facets.test.d.ts +2 -2
  249. package/dist/test/collection-facets.test.js +690 -690
  250. package/dist/test/data-source/collection-browser-data-source.test.d.ts +1 -1
  251. package/dist/test/data-source/collection-browser-data-source.test.js +89 -89
  252. package/dist/test/empty-placeholder.test.d.ts +1 -1
  253. package/dist/test/empty-placeholder.test.js +63 -63
  254. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  255. package/dist/test/expanded-date-picker.test.js +95 -95
  256. package/dist/test/icon-overlay.test.d.ts +1 -1
  257. package/dist/test/icon-overlay.test.js +24 -24
  258. package/dist/test/image-block.test.d.ts +1 -1
  259. package/dist/test/image-block.test.js +107 -107
  260. package/dist/test/item-image.test.d.ts +1 -1
  261. package/dist/test/item-image.test.js +85 -85
  262. package/dist/test/manage/manage-bar.test.d.ts +2 -1
  263. package/dist/test/manage/manage-bar.test.js +106 -91
  264. package/dist/test/manage/manage-bar.test.js.map +1 -1
  265. package/dist/test/manage/remove-items-modal-content.test.d.ts +1 -0
  266. package/dist/test/manage/remove-items-modal-content.test.js +66 -0
  267. package/dist/test/manage/remove-items-modal-content.test.js.map +1 -0
  268. package/dist/test/mediatype-config.test.d.ts +1 -1
  269. package/dist/test/mediatype-config.test.js +16 -16
  270. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  271. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  272. package/dist/test/mocks/mock-search-responses.d.ts +25 -25
  273. package/dist/test/mocks/mock-search-responses.js +942 -942
  274. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  275. package/dist/test/mocks/mock-search-service.js +54 -54
  276. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  277. package/dist/test/restoration-state-handler.test.js +270 -270
  278. package/dist/test/review-block.test.d.ts +1 -1
  279. package/dist/test/review-block.test.js +44 -44
  280. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  281. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  282. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  283. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  284. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  285. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +426 -426
  286. package/dist/test/text-overlay.test.d.ts +1 -1
  287. package/dist/test/text-overlay.test.js +38 -38
  288. package/dist/test/text-snippet-block.test.d.ts +1 -1
  289. package/dist/test/text-snippet-block.test.js +57 -57
  290. package/dist/test/tile-stats.test.d.ts +1 -1
  291. package/dist/test/tile-stats.test.js +81 -81
  292. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  293. package/dist/test/tiles/grid/account-tile.test.js +76 -76
  294. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  295. package/dist/test/tiles/grid/collection-tile.test.js +73 -73
  296. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  297. package/dist/test/tiles/grid/item-tile.test.js +312 -312
  298. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -1
  299. package/dist/test/tiles/grid/search-tile.test.js +51 -51
  300. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  301. package/dist/test/tiles/hover/hover-pane-controller.test.js +259 -259
  302. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  303. package/dist/test/tiles/hover/tile-hover-pane.test.js +56 -56
  304. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  305. package/dist/test/tiles/list/tile-list-compact.test.js +143 -143
  306. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  307. package/dist/test/tiles/list/tile-list.test.js +297 -297
  308. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  309. package/dist/test/tiles/tile-dispatcher.test.js +100 -100
  310. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  311. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  312. package/dist/test/utils/array-equals.test.d.ts +1 -1
  313. package/dist/test/utils/array-equals.test.js +26 -26
  314. package/dist/test/utils/format-count.test.d.ts +1 -1
  315. package/dist/test/utils/format-count.test.js +23 -23
  316. package/dist/test/utils/format-date.test.d.ts +1 -1
  317. package/dist/test/utils/format-date.test.js +30 -30
  318. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  319. package/dist/test/utils/format-unit-size.test.js +17 -17
  320. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  321. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  322. package/local.archive.org.cert +86 -86
  323. package/local.archive.org.key +27 -27
  324. package/package.json +1 -1
  325. package/renovate.json +6 -6
  326. package/src/app-root.ts +38 -4
  327. package/src/collection-browser.ts +66 -17
  328. package/src/data-source/collection-browser-data-source-interface.ts +5 -0
  329. package/src/data-source/collection-browser-data-source.ts +14 -0
  330. package/src/data-source/collection-browser-query-state.ts +1 -0
  331. package/src/manage/manage-bar.ts +120 -24
  332. package/src/manage/remove-items-modal-content.ts +102 -0
  333. package/src/models.ts +10 -0
  334. package/test/collection-browser.test.ts +23 -0
  335. package/test/manage/manage-bar.test.ts +41 -18
  336. package/test/manage/remove-items-modal-content.test.ts +82 -0
  337. package/web-dev-server.config.mjs +30 -30
  338. package/web-test-runner.config.mjs +41 -41
@@ -57,7 +57,6 @@ import type {
57
57
  } from './data-source/collection-browser-query-state';
58
58
  import { FACETLESS_PAGE_ELEMENTS } from './data-source/models';
59
59
  import type { CollectionFacets } from './collection-facets';
60
- import type { ManageableItem } from './manage/manage-bar';
61
60
  import type { CollectionBrowserDataSourceInterface } from './data-source/collection-browser-data-source-interface';
62
61
  import {
63
62
  analyticsActions,
@@ -66,9 +65,9 @@ import {
66
65
  import chevronIcon from './assets/img/icons/chevron';
67
66
  import { srOnlyStyle } from './styles/sr-only';
68
67
  import { sha1 } from './utils/sha1';
69
- import { formatDate } from './utils/format-date';
70
68
  import { log } from './utils/log';
71
69
  import type { PlaceholderType } from './empty-placeholder';
70
+ import type { ManageBar } from './manage/manage-bar';
72
71
 
73
72
  import './empty-placeholder';
74
73
  import './tiles/tile-dispatcher';
@@ -263,6 +262,12 @@ export class CollectionBrowser
263
262
  @property({ type: Object }) dataSource: CollectionBrowserDataSourceInterface =
264
263
  new CollectionBrowserDataSource(this, this.pageSize);
265
264
 
265
+ /**
266
+ * The maximum number of pages we will load when a privileged user clicks
267
+ * the "Manage" button on the search page. Limited to 15 pages.
268
+ */
269
+ maxPagesToManage = 15;
270
+
266
271
  /**
267
272
  * The page that the consumer wants to load.
268
273
  */
@@ -299,6 +304,8 @@ export class CollectionBrowser
299
304
 
300
305
  @query('collection-facets') private collectionFacets?: CollectionFacets;
301
306
 
307
+ @query('manage-bar') private manageBar?: ManageBar;
308
+
302
309
  @property({ type: Object, attribute: false })
303
310
  analyticsHandler?: AnalyticsManagerInterface;
304
311
 
@@ -774,20 +781,29 @@ export class CollectionBrowser
774
781
  * showing the management view. This generally replaces the sort bar when present.
775
782
  */
776
783
  private get manageBarTemplate(): TemplateResult {
784
+ const manageViewModalMsg =
785
+ this.profileElement === 'uploads'
786
+ ? 'Note: it may take a few minutes for these items to stop appearing in your uploads list.'
787
+ : nothing;
788
+
777
789
  return html`
778
790
  <manage-bar
779
791
  .label=${this.manageViewLabel}
780
- .pageContext=${this.pageContext}
792
+ .modalManager=${this.modalManager}
793
+ .selectedItems=${this.dataSource.checkedTileModels}
794
+ .manageViewModalMsg=${manageViewModalMsg}
781
795
  showSelectAll
782
796
  showUnselectAll
797
+ ?showItemManageButton=${this.pageContext === 'search'}
783
798
  ?removeAllowed=${this.dataSource.checkedTileModels.length !== 0}
784
799
  @removeItems=${this.handleRemoveItems}
785
- @itemsManager=${this.handleItemsManager}
800
+ @manageItems=${this.handleManageItems}
786
801
  @selectAll=${() => this.dataSource.checkAllTiles()}
787
802
  @unselectAll=${() => this.dataSource.uncheckAllTiles()}
788
803
  @cancel=${() => {
789
804
  this.isManageView = false;
790
805
  this.dataSource.uncheckAllTiles();
806
+ if (this.searchResultsLoading) this.dataSource.resetPages();
791
807
  }}
792
808
  ></manage-bar>
793
809
  `;
@@ -799,13 +815,11 @@ export class CollectionBrowser
799
815
  */
800
816
  private handleRemoveItems(): void {
801
817
  this.dispatchEvent(
802
- new CustomEvent<{ items: ManageableItem[] }>('itemRemovalRequested', {
818
+ new CustomEvent<{ items: String[] }>('itemRemovalRequested', {
803
819
  detail: {
804
- items: this.dataSource.checkedTileModels.map(model => {
805
- const cloned = model.clone();
806
- cloned.dateStr = formatDate(model.datePublished, 'long');
807
- return cloned as ManageableItem;
808
- }),
820
+ items: this.dataSource.checkedTileModels.map(model =>
821
+ model?.identifier ? model.identifier : ''
822
+ ),
809
823
  },
810
824
  })
811
825
  );
@@ -814,19 +828,32 @@ export class CollectionBrowser
814
828
  /**
815
829
  * Handler when user request to bulk edit from /search/ page
816
830
  */
817
- private handleItemsManager(): void {
831
+ private handleManageItems(): void {
818
832
  this.dispatchEvent(
819
- new CustomEvent('itemManagerRequested', {
833
+ new CustomEvent<{ items: String[] }>('itemManagerRequested', {
820
834
  detail: {
821
- items: this.dataSource.checkedTileModels
822
- .map(item => item.identifier)
823
- .filter(Boolean)
824
- .join(','),
835
+ items: this.dataSource.checkedTileModels.map(model =>
836
+ model?.identifier ? model.identifier : ''
837
+ ),
825
838
  },
826
839
  })
827
840
  );
828
841
  }
829
842
 
843
+ /**
844
+ * Handler to show processing modal while removing item
845
+ */
846
+ showRemoveItemsProcessingModal(): void {
847
+ this.manageBar?.showRemoveItemsProcessingModal();
848
+ }
849
+
850
+ /**
851
+ * Handler to show error modal when item removal failed
852
+ */
853
+ showRemoveItemsErrorModal(): void {
854
+ this.manageBar?.showRemoveItemsErrorModal();
855
+ }
856
+
830
857
  /**
831
858
  * Removes all tile models that are currently checked & adjusts the paging
832
859
  * of the data source to account for any new gaps in the data.
@@ -1430,7 +1457,11 @@ export class CollectionBrowser
1430
1457
  }
1431
1458
 
1432
1459
  if (changed.has('isManageView')) {
1433
- if (this.isManageView) this.displayMode = 'grid';
1460
+ if (this.isManageView) {
1461
+ this.displayMode = 'grid';
1462
+ this.fetchManagableSearchResults();
1463
+ } else if (this.pageContext === 'search') this.infiniteScroller?.reload();
1464
+
1434
1465
  this.infiniteScroller?.refreshAllVisibleCells();
1435
1466
  this.emitManageModeChangedEvent();
1436
1467
  }
@@ -2066,6 +2097,24 @@ export class CollectionBrowser
2066
2097
  }
2067
2098
  }
2068
2099
 
2100
+ /**
2101
+ * Fetches search results for privileged users when in manage view
2102
+ * If total results exceed the threshold, partially resets the datasource pages
2103
+ * and fetches the first page with a limit based on the threshold
2104
+ */
2105
+ private fetchManagableSearchResults(): void {
2106
+ const maxAllowedResults = this.maxPagesToManage * this.pageSize;
2107
+ if (
2108
+ this.pageContext === 'search' &&
2109
+ this.dataSource.totalResults > maxAllowedResults &&
2110
+ !this.searchResultsLoading
2111
+ ) {
2112
+ this.dataSource.resetPages();
2113
+ this.dataSource.fetchPage(1, this.maxPagesToManage); // will fetch 750 results
2114
+ this.infiniteScroller?.reload();
2115
+ }
2116
+ }
2117
+
2069
2118
  static get styles() {
2070
2119
  return [
2071
2120
  srOnlyStyle,
@@ -155,6 +155,11 @@ export interface CollectionBrowserDataSourceInterface
155
155
  */
156
156
  reset(): void;
157
157
 
158
+ /**
159
+ * Resets the data source to its pages.
160
+ */
161
+ resetPages(): void;
162
+
158
163
  /**
159
164
  * Adds the given page of tile models to the data source.
160
165
  * If the given page number already exists, that page will be overwritten.
@@ -246,6 +246,19 @@ export class CollectionBrowserDataSource
246
246
  this.requestHostUpdate();
247
247
  }
248
248
 
249
+ /**
250
+ * @inheritdoc
251
+ */
252
+ resetPages(): void {
253
+ if (Object.keys(this.pages).length !== this.host.maxPagesToManage) {
254
+ this.pages = {};
255
+ }
256
+
257
+ // Invalidate any fetches in progress
258
+ this.fetchesInProgress.clear();
259
+ this.requestHostUpdate();
260
+ }
261
+
249
262
  /**
250
263
  * @inheritdoc
251
264
  */
@@ -433,6 +446,7 @@ export class CollectionBrowserDataSource
433
446
  map(
434
447
  callback: (model: TileModel, index: number, array: TileModel[]) => TileModel
435
448
  ): void {
449
+ if (!Object.keys(this.pages).length) return;
436
450
  this.pages = Object.fromEntries(
437
451
  Object.entries(this.pages).map(([page, tileModels]) => [
438
452
  page,
@@ -38,6 +38,7 @@ export interface CollectionBrowserSearchInterface
38
38
  readonly defaultSortField: SortField | null;
39
39
  readonly facetLoadStrategy: FacetLoadStrategy;
40
40
  readonly initialPageNumber: number;
41
+ readonly maxPagesToManage: number;
41
42
  readonly currentVisiblePageNumbers: number[];
42
43
  readonly clearResultsOnEmptyQuery?: boolean;
43
44
  readonly dataSource?: CollectionBrowserDataSourceInterface;
@@ -2,13 +2,13 @@ import { msg } from '@lit/localize';
2
2
  import { LitElement, html, css, TemplateResult, CSSResultGroup } from 'lit';
3
3
  import { customElement, property } from 'lit/decorators.js';
4
4
  import { when } from 'lit/directives/when.js';
5
+ import {
6
+ ModalConfig,
7
+ type ModalManagerInterface,
8
+ } from '@internetarchive/modal-manager';
9
+ import type { ManageableItem } from '../models';
5
10
  import iaButtonStyle from '../styles/ia-button';
6
-
7
- export interface ManageableItem {
8
- identifier: string;
9
- title?: string;
10
- dateStr?: string;
11
- }
11
+ import './remove-items-modal-content';
12
12
 
13
13
  @customElement('manage-bar')
14
14
  export class ManageBar extends LitElement {
@@ -18,9 +18,19 @@ export class ManageBar extends LitElement {
18
18
  @property({ type: String }) label = msg('Select items to remove');
19
19
 
20
20
  /**
21
- * Specifies the context in which the collection browser is being used
21
+ * The shared modal manager component for displaying modal dialogs on this page
22
22
  */
23
- @property({ type: String }) pageContext?: string;
23
+ @property({ type: Object }) modalManager?: ModalManagerInterface;
24
+
25
+ /**
26
+ * Array of items that have been selected for management
27
+ */
28
+ @property({ type: Object }) selectedItems: Array<ManageableItem> = [];
29
+
30
+ /**
31
+ * Message shows as note in the modal when removing items
32
+ */
33
+ @property({ type: String }) manageViewModalMsg?: string;
24
34
 
25
35
  /**
26
36
  * Whether to show the "Select All" button (default false)
@@ -32,6 +42,11 @@ export class ManageBar extends LitElement {
32
42
  */
33
43
  @property({ type: Boolean }) showUnselectAll = false;
34
44
 
45
+ /**
46
+ * Whether to show "Item Manager the items" button (default false)
47
+ */
48
+ @property({ type: Boolean }) showItemManageButton = false;
49
+
35
50
  /**
36
51
  * Whether to active delete button for selectable items
37
52
  */
@@ -48,21 +63,20 @@ export class ManageBar extends LitElement {
48
63
  <button
49
64
  class="ia-button danger"
50
65
  ?disabled=${!this.removeAllowed}
51
- @click=${this.removeClicked}
66
+ @click=${this.showRemoveItemsModal}
52
67
  >
53
- ${msg('Remove selected items')}
68
+ ${msg('Remove selected items')} (${this.selectedItems.length})
54
69
  </button>
55
- ${this.pageContext === 'search'
56
- ? html`
57
- <button
58
- class="ia-button warning"
59
- ?disabled=${!this.removeAllowed}
60
- @click=${this.itemsManagerClicked}
61
- >
62
- ${msg('Item Manager the items')}
63
- </button>
64
- `
65
- : ''}
70
+ ${when(
71
+ this.showItemManageButton,
72
+ () => html` <button
73
+ class="ia-button warning"
74
+ ?disabled=${!this.removeAllowed}
75
+ @click=${this.manageItemsClicked}
76
+ >
77
+ ${msg('Item Manager the items')} (${this.selectedItems.length})
78
+ </button>`
79
+ )}
66
80
  <div class="selection-buttons">
67
81
  ${when(
68
82
  this.showSelectAll,
@@ -92,12 +106,12 @@ export class ManageBar extends LitElement {
92
106
  this.dispatchEvent(new CustomEvent('cancel'));
93
107
  }
94
108
 
95
- private removeClicked(): void {
109
+ private removeItemsClicked(): void {
96
110
  this.dispatchEvent(new CustomEvent('removeItems'));
97
111
  }
98
112
 
99
- private itemsManagerClicked(): void {
100
- this.dispatchEvent(new CustomEvent('itemsManager'));
113
+ private manageItemsClicked(): void {
114
+ this.dispatchEvent(new CustomEvent('manageItems'));
101
115
  }
102
116
 
103
117
  private selectAllClicked(): void {
@@ -108,6 +122,88 @@ export class ManageBar extends LitElement {
108
122
  this.dispatchEvent(new CustomEvent('unselectAll'));
109
123
  }
110
124
 
125
+ /**
126
+ * Shows a modal dialog confirming the list of items to be removed
127
+ * @param items Which items to list in the modal
128
+ */
129
+ private showRemoveItemsModal(): void {
130
+ const customModalContent = html`
131
+ <remove-items-modal-content
132
+ .items=${this.selectedItems}
133
+ .message=${this.manageViewModalMsg}
134
+ @confirm=${() => this.removeItemsClicked()}
135
+ ></remove-items-modal-content>
136
+ `;
137
+
138
+ const config = new ModalConfig({
139
+ showProcessingIndicator: false,
140
+ processingImageMode: 'processing',
141
+ bodyColor: '#fff',
142
+ headerColor: '#194880',
143
+ showHeaderLogo: false,
144
+ closeOnBackdropClick: true,
145
+ title: html`${msg('Are you sure you want to remove these items?')}`,
146
+ });
147
+
148
+ this.modalManager?.classList.add('remove-items');
149
+ this.modalManager?.showModal({
150
+ config,
151
+ customModalContent,
152
+ userClosedModalCallback: () => {
153
+ this.modalManager?.classList.remove('remove-items');
154
+ },
155
+ });
156
+ }
157
+
158
+ /**
159
+ * Shows a modal dialog indicating that item removal is being processed
160
+ */
161
+ showRemoveItemsProcessingModal(): void {
162
+ const config = new ModalConfig({
163
+ showProcessingIndicator: true,
164
+ processingImageMode: 'processing',
165
+ bodyColor: '#fff',
166
+ headerColor: '#194880',
167
+ showHeaderLogo: false,
168
+ closeOnBackdropClick: true,
169
+ title: html`${msg('Removing selected items...')}`,
170
+ });
171
+
172
+ this.modalManager?.classList.add('remove-items');
173
+ this.modalManager?.showModal({
174
+ config,
175
+ userClosedModalCallback: () => {
176
+ this.modalManager?.classList.remove('remove-items');
177
+ },
178
+ });
179
+ }
180
+
181
+ /**
182
+ * Shows a modal dialog indicating that an error occurred while removing items
183
+ */
184
+ showRemoveItemsErrorModal(): void {
185
+ const config = new ModalConfig({
186
+ showProcessingIndicator: false,
187
+ processingImageMode: 'processing',
188
+ bodyColor: '#fff',
189
+ headerColor: '#691916',
190
+ showHeaderLogo: false,
191
+ closeOnBackdropClick: true,
192
+ title: html`${msg('Error: unable to remove items')}`,
193
+ message: html`${msg(
194
+ 'An error occurred while removing items. Please try again in a few minutes.'
195
+ )}`,
196
+ });
197
+
198
+ this.modalManager?.classList.add('remove-items');
199
+ this.modalManager?.showModal({
200
+ config,
201
+ userClosedModalCallback: () => {
202
+ this.modalManager?.classList.remove('remove-items');
203
+ },
204
+ });
205
+ }
206
+
111
207
  static get styles(): CSSResultGroup {
112
208
  return css`
113
209
  ${iaButtonStyle}
@@ -0,0 +1,102 @@
1
+ import { LitElement, html, css, nothing, TemplateResult, CSSResult } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+ import { msg } from '@lit/localize';
4
+ import { map } from 'lit/directives/map.js';
5
+ import type { ManageableItem } from '../models';
6
+
7
+ @customElement('remove-items-modal-content')
8
+ export class RemoveItemsModalContent extends LitElement {
9
+ @property({ type: Object }) items: ManageableItem[] = [];
10
+
11
+ @property({ type: String }) message?: string;
12
+
13
+ render(): TemplateResult {
14
+ return html`
15
+ <ul>
16
+ ${map(
17
+ this.items,
18
+ ({ title, date }) => html`
19
+ <li>
20
+ <span class="item-title">${title ?? '[untitled]'}</span>
21
+ <span class="item-date">${date ?? ''}</span>
22
+ </li>
23
+ `
24
+ )}
25
+ </ul>
26
+ ${this.message ? html`<p class="message">${this.message}</p>` : nothing}
27
+ <div class="button-bar">
28
+ <button class="remove-items-btn" @click=${this.removeItemsBtnClicked}>
29
+ ${msg('Remove items')}
30
+ </button>
31
+ </div>
32
+ `;
33
+ }
34
+
35
+ private removeItemsBtnClicked(): void {
36
+ this.dispatchEvent(
37
+ new CustomEvent<{ items: ManageableItem[] }>('confirm', {
38
+ detail: {
39
+ items: this.items,
40
+ },
41
+ })
42
+ );
43
+ }
44
+
45
+ static get styles(): CSSResult {
46
+ return css`
47
+ ul {
48
+ margin: 0;
49
+ padding: 0 10px;
50
+ font-size: 1.4rem;
51
+ list-style-type: none;
52
+ max-height: min(400px, 40vh);
53
+ overflow-y: auto;
54
+ }
55
+
56
+ li {
57
+ display: flex;
58
+ justify-content: space-between;
59
+ padding: 2px 0;
60
+ }
61
+ li:not(:last-of-type) {
62
+ border-bottom: 1px solid rgb(232, 232, 232);
63
+ }
64
+
65
+ .item-title {
66
+ word-break: break-word;
67
+ }
68
+
69
+ .item-date {
70
+ white-space: nowrap;
71
+ }
72
+
73
+ .message {
74
+ font-size: 1.4rem;
75
+ padding: 5px 10px;
76
+ }
77
+
78
+ .button-bar {
79
+ display: flex;
80
+ justify-content: center;
81
+ margin: 10px 5px;
82
+ }
83
+
84
+ .remove-items-btn {
85
+ margin-bottom: 10px;
86
+ padding: 10px;
87
+ border: 1px solid var(--primaryErrorCTABorder, #d43f3a);
88
+ border-radius: 4px;
89
+ color: white;
90
+ background: var(--primaryErrorCTAFill, #d9534f);
91
+ appearance: none;
92
+ cursor: pointer;
93
+ }
94
+ .remove-items-btn:hover {
95
+ background: rgba(var(--primaryErrorCTAFillRGB, 229, 28, 38), 0.9);
96
+ }
97
+ .remove-items-btn:active {
98
+ background: rgba(var(--primaryErrorCTAFillRGB, 229, 28, 38), 0.7);
99
+ }
100
+ `;
101
+ }
102
+ }
package/src/models.ts CHANGED
@@ -675,3 +675,13 @@ export const suppressedCollections: Record<string, boolean> = {
675
675
  americana: true,
676
676
  toronto: true,
677
677
  };
678
+
679
+ /**
680
+ * A record of manageable item
681
+ */
682
+ export interface ManageableItem {
683
+ identifier: string;
684
+ title?: string;
685
+ dateStr?: string;
686
+ date?: string;
687
+ }
@@ -2001,4 +2001,27 @@ describe('Collection Browser', () => {
2001
2001
  const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');
2002
2002
  expect(infiniteScroller).not.to.exist;
2003
2003
  });
2004
+
2005
+ it('fetch larger result on search page for admin user to manage items', async () => {
2006
+ const resultsSpy = sinon.spy();
2007
+ const searchService = new MockSearchService({
2008
+ asyncResponse: true,
2009
+ resultsSpy,
2010
+ });
2011
+
2012
+ const el = await fixture<CollectionBrowser>(
2013
+ html`<collection-browser .searchService=${searchService}>
2014
+ </collection-browser>`
2015
+ );
2016
+
2017
+ const numberOfPages = 15;
2018
+
2019
+ el.baseQuery = 'jack';
2020
+ el.isManageView = true;
2021
+ await el.dataSource.fetchPage(1, numberOfPages);
2022
+ await el.updateComplete;
2023
+
2024
+ const initialResults = el.dataSource.getAllPages();
2025
+ expect(Object.keys(initialResults).length).to.deep.equal(numberOfPages);
2026
+ });
2004
2027
  });
@@ -2,9 +2,14 @@
2
2
  import { expect, fixture } from '@open-wc/testing';
3
3
  import { html } from 'lit';
4
4
  import Sinon from 'sinon';
5
- import type { ManageBar } from '../../src/manage/manage-bar';
6
-
7
5
  import '../../src/manage/manage-bar';
6
+ import {
7
+ ModalManager,
8
+ ModalManagerInterface,
9
+ } from '@internetarchive/modal-manager';
10
+ import '@internetarchive/modal-manager';
11
+ import { msg } from '@lit/localize';
12
+ import type { ManageBar } from '../../src/manage/manage-bar';
8
13
 
9
14
  describe('Manage bar', () => {
10
15
  it('renders basic component', async () => {
@@ -38,7 +43,7 @@ describe('Manage bar', () => {
38
43
 
39
44
  it('render item manager button for /search/ page', async () => {
40
45
  const el = await fixture<ManageBar>(
41
- html`<manage-bar .pageContext=${'search'}></manage-bar>`
46
+ html`<manage-bar showItemManageButton></manage-bar>`
42
47
  );
43
48
  expect(el.shadowRoot?.querySelector('.ia-button.warning')).to.exist;
44
49
  });
@@ -84,21 +89,6 @@ describe('Manage bar', () => {
84
89
  expect(spy.callCount).to.equal(1);
85
90
  });
86
91
 
87
- it('emits event when Remove Items button clicked', async () => {
88
- const spy = Sinon.spy();
89
- const el = await fixture<ManageBar>(
90
- html`<manage-bar @removeItems=${spy} removeAllowed></manage-bar>`
91
- );
92
-
93
- const removeItemsBtn = el.shadowRoot?.querySelector(
94
- '.ia-button.danger'
95
- ) as HTMLButtonElement;
96
- expect(removeItemsBtn).to.exist;
97
-
98
- removeItemsBtn.click();
99
- expect(spy.callCount).to.equal(1);
100
- });
101
-
102
92
  it('emits event when Select All button clicked', async () => {
103
93
  const spy = Sinon.spy();
104
94
  const el = await fixture<ManageBar>(
@@ -128,4 +118,37 @@ describe('Manage bar', () => {
128
118
  unselectAllBtn.click();
129
119
  expect(spy.callCount).to.equal(1);
130
120
  });
121
+
122
+ it('opens the remove items modal when showRemoveItemsModal is clicked', async () => {
123
+ const el = await fixture<ManageBar>(html`
124
+ <manage-bar
125
+ .modalManager=${new ModalManager()}
126
+ .selectedItems=${[{ identifier: '1', title: 'Item 1' }]}
127
+ removeAllowed
128
+ ></manage-bar>
129
+ `);
130
+ await el.updateComplete;
131
+
132
+ const removeButton = el.shadowRoot?.querySelector(
133
+ '.ia-button.danger'
134
+ ) as HTMLButtonElement;
135
+ expect(removeButton).to.exist;
136
+
137
+ const showModalSpy = Sinon.spy(
138
+ el.modalManager as ModalManagerInterface,
139
+ 'showModal'
140
+ );
141
+
142
+ await el.updateComplete;
143
+ removeButton?.click();
144
+
145
+ console.log(showModalSpy.args[0][0].config.title?.values[0]);
146
+
147
+ expect(showModalSpy.callCount).to.equal(1);
148
+ expect(el.modalManager?.classList.contains('remove-items')).to.be;
149
+ expect(showModalSpy.args[0][0].config.title?.values[0]).to.equal(
150
+ msg('Are you sure you want to remove these items?')
151
+ );
152
+ expect(showModalSpy.args[0][0].customModalContent).to.exist;
153
+ });
131
154
  });