@internetarchive/collection-browser 2.7.5 → 2.7.6-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 (328) 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 +100 -95
  8. package/dist/src/app-root.js +532 -494
  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 +584 -578
  75. package/dist/src/collection-browser.js +1640 -1614
  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 +241 -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.d.ts +373 -373
  114. package/dist/src/data-source/collection-browser-data-source.js +982 -982
  115. package/dist/src/data-source/collection-browser-query-state.d.ts +43 -43
  116. package/dist/src/data-source/collection-browser-query-state.js +1 -1
  117. package/dist/src/data-source/models.d.ts +28 -28
  118. package/dist/src/data-source/models.js +8 -8
  119. package/dist/src/empty-placeholder.d.ts +23 -23
  120. package/dist/src/empty-placeholder.js +79 -79
  121. package/dist/src/expanded-date-picker.d.ts +43 -43
  122. package/dist/src/expanded-date-picker.js +109 -109
  123. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  124. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  125. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  126. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  127. package/dist/src/manage/manage-bar.d.ts +71 -30
  128. package/dist/src/manage/manage-bar.js +201 -83
  129. package/dist/src/manage/manage-bar.js.map +1 -1
  130. package/dist/src/manage/remove-items-modal-content.d.ts +13 -0
  131. package/dist/src/manage/remove-items-modal-content.js +104 -0
  132. package/dist/src/manage/remove-items-modal-content.js.map +1 -0
  133. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  134. package/dist/src/mediatype/mediatype-config.js +91 -91
  135. package/dist/src/models.d.ts +219 -219
  136. package/dist/src/models.js +401 -401
  137. package/dist/src/models.js.map +1 -1
  138. package/dist/src/restoration-state-handler.d.ts +70 -70
  139. package/dist/src/restoration-state-handler.js +363 -363
  140. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  141. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  142. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  143. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  144. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  145. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  146. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  147. package/dist/src/sort-filter-bar/img/list.js +2 -2
  148. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  149. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  150. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  151. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  152. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  153. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  154. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  155. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  156. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  157. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  158. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +223 -223
  159. package/dist/src/sort-filter-bar/sort-filter-bar.js +697 -697
  160. package/dist/src/styles/ia-button.d.ts +2 -2
  161. package/dist/src/styles/ia-button.js +51 -19
  162. package/dist/src/styles/ia-button.js.map +1 -1
  163. package/dist/src/styles/item-image-styles.d.ts +8 -8
  164. package/dist/src/styles/item-image-styles.js +9 -9
  165. package/dist/src/styles/sr-only.d.ts +1 -1
  166. package/dist/src/styles/sr-only.js +2 -2
  167. package/dist/src/tiles/base-tile-component.d.ts +19 -19
  168. package/dist/src/tiles/base-tile-component.js +64 -64
  169. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  170. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  171. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  172. package/dist/src/tiles/grid/account-tile.js +72 -72
  173. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  174. package/dist/src/tiles/grid/collection-tile.js +80 -80
  175. package/dist/src/tiles/grid/item-tile.d.ts +34 -34
  176. package/dist/src/tiles/grid/item-tile.js +158 -158
  177. package/dist/src/tiles/grid/search-tile.d.ts +10 -10
  178. package/dist/src/tiles/grid/search-tile.js +51 -51
  179. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  180. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  181. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  182. package/dist/src/tiles/grid/tile-stats.js +53 -53
  183. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  184. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  185. package/dist/src/tiles/hover/tile-hover-pane.d.ts +18 -18
  186. package/dist/src/tiles/hover/tile-hover-pane.js +69 -69
  187. package/dist/src/tiles/image-block.d.ts +18 -18
  188. package/dist/src/tiles/image-block.js +89 -89
  189. package/dist/src/tiles/item-image.d.ts +39 -39
  190. package/dist/src/tiles/item-image.js +154 -154
  191. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  192. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  193. package/dist/src/tiles/list/tile-list-compact.d.ts +19 -19
  194. package/dist/src/tiles/list/tile-list-compact.js +122 -122
  195. package/dist/src/tiles/list/tile-list.d.ts +54 -54
  196. package/dist/src/tiles/list/tile-list.js +323 -323
  197. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  198. package/dist/src/tiles/mediatype-icon.js +47 -47
  199. package/dist/src/tiles/overlay/icon-overlay.d.ts +8 -8
  200. package/dist/src/tiles/overlay/icon-overlay.js +25 -25
  201. package/dist/src/tiles/overlay/text-overlay.d.ts +9 -9
  202. package/dist/src/tiles/overlay/text-overlay.js +31 -31
  203. package/dist/src/tiles/review-block.d.ts +12 -12
  204. package/dist/src/tiles/review-block.js +56 -56
  205. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  206. package/dist/src/tiles/text-snippet-block.js +73 -73
  207. package/dist/src/tiles/tile-dispatcher.d.ts +64 -64
  208. package/dist/src/tiles/tile-dispatcher.js +230 -230
  209. package/dist/src/tiles/tile-display-value-provider.d.ts +47 -47
  210. package/dist/src/tiles/tile-display-value-provider.js +94 -94
  211. package/dist/src/utils/analytics-events.d.ts +28 -28
  212. package/dist/src/utils/analytics-events.js +30 -30
  213. package/dist/src/utils/array-equals.d.ts +4 -4
  214. package/dist/src/utils/array-equals.js +10 -10
  215. package/dist/src/utils/collapse-repeated-quotes.d.ts +11 -11
  216. package/dist/src/utils/collapse-repeated-quotes.js +13 -13
  217. package/dist/src/utils/facet-utils.d.ts +83 -83
  218. package/dist/src/utils/facet-utils.js +145 -145
  219. package/dist/src/utils/format-count.d.ts +7 -7
  220. package/dist/src/utils/format-count.js +76 -76
  221. package/dist/src/utils/format-date.d.ts +2 -2
  222. package/dist/src/utils/format-date.js +25 -25
  223. package/dist/src/utils/format-unit-size.d.ts +2 -2
  224. package/dist/src/utils/format-unit-size.js +33 -33
  225. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  226. package/dist/src/utils/local-date-from-utc.js +15 -15
  227. package/dist/src/utils/log.d.ts +7 -7
  228. package/dist/src/utils/log.js +15 -15
  229. package/dist/src/utils/resolve-mediatype.d.ts +8 -8
  230. package/dist/src/utils/resolve-mediatype.js +23 -23
  231. package/dist/src/utils/sha1.d.ts +2 -2
  232. package/dist/src/utils/sha1.js +8 -8
  233. package/dist/test/collection-browser.test.d.ts +1 -1
  234. package/dist/test/collection-browser.test.js +1293 -1293
  235. package/dist/test/collection-facets/facet-row.test.d.ts +1 -1
  236. package/dist/test/collection-facets/facet-row.test.js +227 -227
  237. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  238. package/dist/test/collection-facets/facets-template.test.js +91 -91
  239. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  240. package/dist/test/collection-facets/more-facets-content.test.js +141 -141
  241. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  242. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  243. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  244. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  245. package/dist/test/collection-facets.test.d.ts +2 -2
  246. package/dist/test/collection-facets.test.js +690 -690
  247. package/dist/test/data-source/collection-browser-data-source.test.d.ts +1 -1
  248. package/dist/test/data-source/collection-browser-data-source.test.js +89 -89
  249. package/dist/test/empty-placeholder.test.d.ts +1 -1
  250. package/dist/test/empty-placeholder.test.js +63 -63
  251. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  252. package/dist/test/expanded-date-picker.test.js +95 -95
  253. package/dist/test/icon-overlay.test.d.ts +1 -1
  254. package/dist/test/icon-overlay.test.js +24 -24
  255. package/dist/test/image-block.test.d.ts +1 -1
  256. package/dist/test/image-block.test.js +107 -107
  257. package/dist/test/item-image.test.d.ts +1 -1
  258. package/dist/test/item-image.test.js +85 -85
  259. package/dist/test/manage/manage-bar.test.d.ts +1 -1
  260. package/dist/test/manage/manage-bar.test.js +91 -81
  261. package/dist/test/manage/manage-bar.test.js.map +1 -1
  262. package/dist/test/mediatype-config.test.d.ts +1 -1
  263. package/dist/test/mediatype-config.test.js +16 -16
  264. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  265. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  266. package/dist/test/mocks/mock-search-responses.d.ts +25 -25
  267. package/dist/test/mocks/mock-search-responses.js +942 -942
  268. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  269. package/dist/test/mocks/mock-search-service.js +54 -54
  270. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  271. package/dist/test/restoration-state-handler.test.js +270 -270
  272. package/dist/test/review-block.test.d.ts +1 -1
  273. package/dist/test/review-block.test.js +44 -44
  274. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  275. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  276. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  277. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  278. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  279. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +426 -426
  280. package/dist/test/text-overlay.test.d.ts +1 -1
  281. package/dist/test/text-overlay.test.js +38 -38
  282. package/dist/test/text-snippet-block.test.d.ts +1 -1
  283. package/dist/test/text-snippet-block.test.js +57 -57
  284. package/dist/test/tile-stats.test.d.ts +1 -1
  285. package/dist/test/tile-stats.test.js +81 -81
  286. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  287. package/dist/test/tiles/grid/account-tile.test.js +76 -76
  288. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  289. package/dist/test/tiles/grid/collection-tile.test.js +73 -73
  290. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  291. package/dist/test/tiles/grid/item-tile.test.js +312 -312
  292. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -1
  293. package/dist/test/tiles/grid/search-tile.test.js +51 -51
  294. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  295. package/dist/test/tiles/hover/hover-pane-controller.test.js +259 -259
  296. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  297. package/dist/test/tiles/hover/tile-hover-pane.test.js +56 -56
  298. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  299. package/dist/test/tiles/list/tile-list-compact.test.js +143 -143
  300. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  301. package/dist/test/tiles/list/tile-list.test.js +297 -297
  302. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  303. package/dist/test/tiles/tile-dispatcher.test.js +100 -100
  304. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  305. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  306. package/dist/test/utils/array-equals.test.d.ts +1 -1
  307. package/dist/test/utils/array-equals.test.js +26 -26
  308. package/dist/test/utils/format-count.test.d.ts +1 -1
  309. package/dist/test/utils/format-count.test.js +23 -23
  310. package/dist/test/utils/format-date.test.d.ts +1 -1
  311. package/dist/test/utils/format-date.test.js +17 -17
  312. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  313. package/dist/test/utils/format-unit-size.test.js +17 -17
  314. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  315. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  316. package/local.archive.org.cert +86 -86
  317. package/local.archive.org.key +27 -27
  318. package/package.json +1 -1
  319. package/renovate.json +6 -6
  320. package/src/app-root.ts +38 -0
  321. package/src/collection-browser.ts +29 -5
  322. package/src/manage/manage-bar.ts +160 -24
  323. package/src/manage/remove-items-modal-content.ts +107 -0
  324. package/src/models.ts +2 -2
  325. package/src/styles/ia-button.ts +37 -5
  326. package/test/manage/manage-bar.test.ts +12 -0
  327. package/web-dev-server.config.mjs +30 -30
  328. package/web-test-runner.config.mjs +41 -41
@@ -1,8 +1,20 @@
1
1
  import { msg } from '@lit/localize';
2
- import { LitElement, html, css, TemplateResult, CSSResultGroup } from 'lit';
2
+ import {
3
+ LitElement,
4
+ html,
5
+ css,
6
+ TemplateResult,
7
+ CSSResultGroup,
8
+ PropertyValues,
9
+ } from 'lit';
3
10
  import { customElement, property } from 'lit/decorators.js';
4
11
  import { when } from 'lit/directives/when.js';
12
+ import {
13
+ ModalConfig,
14
+ type ModalManagerInterface,
15
+ } from '@internetarchive/modal-manager';
5
16
  import iaButtonStyle from '../styles/ia-button';
17
+ import './remove-items-modal-content';
6
18
 
7
19
  export interface ManageableItem {
8
20
  identifier: string;
@@ -17,6 +29,26 @@ export class ManageBar extends LitElement {
17
29
  */
18
30
  @property({ type: String }) label = msg('Select items to remove');
19
31
 
32
+ /**
33
+ * Specifies the context in which the collection browser is being used
34
+ */
35
+ @property({ type: String }) activeTabId?: string;
36
+
37
+ /**
38
+ * The shared modal manager component for displaying modal dialogs on this page
39
+ */
40
+ @property({ type: Object }) modalManager?: ModalManagerInterface;
41
+
42
+ /**
43
+ * Array of items that have been selected for management
44
+ */
45
+ @property({ type: Object }) selectedItems: Array<ManageableItem> = [];
46
+
47
+ /**
48
+ * Item removal failure message, if any
49
+ */
50
+ @property({ type: String }) itemRemovalFailed = '';
51
+
20
52
  /**
21
53
  * Whether to show the "Select All" button (default false)
22
54
  */
@@ -27,11 +59,22 @@ export class ManageBar extends LitElement {
27
59
  */
28
60
  @property({ type: Boolean }) showUnselectAll = false;
29
61
 
62
+ /**
63
+ * Whether to show "Item Manager the items" button (default false)
64
+ */
65
+ @property({ type: Boolean }) showManageButton = false;
66
+
30
67
  /**
31
68
  * Whether to active delete button for selectable items
32
69
  */
33
70
  @property({ type: Boolean }) removeAllowed = false;
34
71
 
72
+ updated(changed: PropertyValues): void {
73
+ if (changed.has('itemRemovalFailed') && this.itemRemovalFailed !== '') {
74
+ this.showRemoveItemsErrorModal();
75
+ }
76
+ }
77
+
35
78
  render(): TemplateResult {
36
79
  return html`
37
80
  <div class="manage-container">
@@ -43,15 +86,25 @@ export class ManageBar extends LitElement {
43
86
  <button
44
87
  class="ia-button danger"
45
88
  ?disabled=${!this.removeAllowed}
46
- @click=${this.removeClicked}
89
+ @click=${this.showRemoveItemsModal}
47
90
  >
48
91
  ${msg('Remove selected items')}
49
92
  </button>
93
+ ${when(
94
+ this.showManageButton,
95
+ () => html` <button
96
+ class="ia-button warning"
97
+ ?disabled=${!this.removeAllowed}
98
+ @click=${this.manageItemsClicked}
99
+ >
100
+ ${msg('Item Manager the items')}
101
+ </button>`
102
+ )}
50
103
  <div class="selection-buttons">
51
104
  ${when(
52
105
  this.showSelectAll,
53
106
  () => html` <button
54
- class="link-styled select-all-btn"
107
+ class="ia-button link select-all-btn"
55
108
  @click=${this.selectAllClicked}
56
109
  >
57
110
  ${msg('Select all')}
@@ -60,7 +113,7 @@ export class ManageBar extends LitElement {
60
113
  ${when(
61
114
  this.showUnselectAll,
62
115
  () => html` <button
63
- class="link-styled unselect-all-btn"
116
+ class="ia-button link unselect-all-btn"
64
117
  @click=${this.unselectAllClicked}
65
118
  >
66
119
  ${msg('Unselect all')}
@@ -76,10 +129,19 @@ export class ManageBar extends LitElement {
76
129
  this.dispatchEvent(new CustomEvent('cancel'));
77
130
  }
78
131
 
79
- private removeClicked(): void {
132
+ /**
133
+ * Shows a modal dialog confirming the list of items to be removed
134
+ * @param items Which items to list in the modal
135
+ */
136
+ private removeItemsClicked(): void {
137
+ this.showRemoveItemsProcessingModal();
80
138
  this.dispatchEvent(new CustomEvent('removeItems'));
81
139
  }
82
140
 
141
+ private manageItemsClicked(): void {
142
+ this.dispatchEvent(new CustomEvent('manageItems'));
143
+ }
144
+
83
145
  private selectAllClicked(): void {
84
146
  this.dispatchEvent(new CustomEvent('selectAll'));
85
147
  }
@@ -88,6 +150,93 @@ export class ManageBar extends LitElement {
88
150
  this.dispatchEvent(new CustomEvent('unselectAll'));
89
151
  }
90
152
 
153
+ /**
154
+ * Shows a modal dialog confirming the list of items to be removed
155
+ * @param items Which items to list in the modal
156
+ */
157
+ private showRemoveItemsModal(): void {
158
+ const delayMessage =
159
+ this.activeTabId === 'uploads'
160
+ ? msg(
161
+ 'Note: it may take a few minutes for these items to stop appearing in your uploads list.'
162
+ )
163
+ : undefined;
164
+
165
+ const customModalContent = html`
166
+ <remove-items-modal-content
167
+ .items=${this.selectedItems}
168
+ .message=${delayMessage}
169
+ @confirm=${() => this.removeItemsClicked()}
170
+ ></remove-items-modal-content>
171
+ `;
172
+
173
+ const config = new ModalConfig({
174
+ showProcessingIndicator: false,
175
+ processingImageMode: 'processing',
176
+ bodyColor: '#fff',
177
+ headerColor: '#194880',
178
+ showHeaderLogo: false,
179
+ closeOnBackdropClick: true,
180
+ title: html`${msg('Are you sure you want to remove these items?')}`,
181
+ });
182
+
183
+ this.modalManager?.classList.add('remove-items');
184
+ this.modalManager?.showModal({
185
+ config,
186
+ customModalContent,
187
+ userClosedModalCallback: () => {
188
+ this.modalManager?.classList.remove('remove-items');
189
+ },
190
+ });
191
+ }
192
+
193
+ /**
194
+ * Shows a modal dialog indicating that item removal is being processed
195
+ */
196
+ private showRemoveItemsProcessingModal(): void {
197
+ const config = new ModalConfig({
198
+ showProcessingIndicator: true,
199
+ processingImageMode: 'processing',
200
+ bodyColor: '#fff',
201
+ headerColor: '#194880',
202
+ showHeaderLogo: false,
203
+ closeOnBackdropClick: true,
204
+ title: html`${msg('Removing selected items...')}`,
205
+ });
206
+
207
+ this.modalManager?.classList.add('remove-items');
208
+ this.modalManager?.showModal({
209
+ config,
210
+ userClosedModalCallback: () => {
211
+ this.modalManager?.classList.remove('remove-items');
212
+ },
213
+ });
214
+ }
215
+
216
+ /**
217
+ * Shows a modal dialog indicating that an error occurred while removing items
218
+ */
219
+ private showRemoveItemsErrorModal(): void {
220
+ const config = new ModalConfig({
221
+ showProcessingIndicator: false,
222
+ processingImageMode: 'processing',
223
+ bodyColor: '#fff',
224
+ headerColor: '#691916',
225
+ showHeaderLogo: false,
226
+ closeOnBackdropClick: true,
227
+ title: html`${msg('Error: unable to remove items')}`,
228
+ message: html`${msg(this.itemRemovalFailed)}`,
229
+ });
230
+
231
+ this.modalManager?.classList.add('remove-items');
232
+ this.modalManager?.showModal({
233
+ config,
234
+ userClosedModalCallback: () => {
235
+ this.modalManager?.classList.remove('remove-items');
236
+ },
237
+ });
238
+ }
239
+
91
240
  static get styles(): CSSResultGroup {
92
241
  return css`
93
242
  ${iaButtonStyle}
@@ -108,33 +257,20 @@ export class ManageBar extends LitElement {
108
257
 
109
258
  .manage-buttons {
110
259
  display: flex;
260
+ flex-wrap: wrap;
111
261
  align-items: center;
112
262
  column-gap: 5px;
113
263
  }
114
264
 
265
+ .selection-buttons {
266
+ display: inherit;
267
+ }
268
+
115
269
  .ia-button,
116
270
  button {
117
271
  padding: 6px 12px;
118
272
  font-size: 1.4rem;
119
- }
120
-
121
- .ia-button.danger:disabled {
122
- opacity: 0.5;
123
- }
124
-
125
- button.link-styled {
126
- margin: 0;
127
- padding: 6px;
128
- border: 0;
129
- appearance: none;
130
- background: none;
131
- color: var(--ia-theme-link-color, #4b64ff);
132
- font: inherit;
133
- text-decoration: none;
134
- cursor: pointer;
135
- }
136
- button.link-styled:hover {
137
- text-decoration: underline;
273
+ margin: 3px 0;
138
274
  }
139
275
  `;
140
276
  }
@@ -0,0 +1,107 @@
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
+
6
+ export interface ManageableItem {
7
+ identifier: string;
8
+ title?: string;
9
+ date?: string;
10
+ }
11
+
12
+ @customElement('remove-items-modal-content')
13
+ export class RemoveItemsModalContent extends LitElement {
14
+ @property({ type: Object }) items: ManageableItem[] = [];
15
+
16
+ @property({ type: String }) message?: string;
17
+
18
+ render(): TemplateResult {
19
+ return html`
20
+ <ul>
21
+ ${map(
22
+ this.items,
23
+ ({ title, date }) => html`
24
+ <li>
25
+ <span class="item-title">${title ?? '[untitled]'}</span>
26
+ <span class="item-date">${date ?? ''}</span>
27
+ </li>
28
+ `
29
+ )}
30
+ </ul>
31
+ ${this.message ? html`<p class="message">${this.message}</p>` : nothing}
32
+ <div class="button-bar">
33
+ <button class="remove-items-btn" @click=${this.removeItemsBtnClicked}>
34
+ ${msg('Remove items')}
35
+ </button>
36
+ </div>
37
+ `;
38
+ }
39
+
40
+ private removeItemsBtnClicked(): void {
41
+ this.dispatchEvent(
42
+ new CustomEvent<{ items: ManageableItem[] }>('confirm', {
43
+ detail: {
44
+ items: this.items,
45
+ },
46
+ })
47
+ );
48
+ }
49
+
50
+ static get styles(): CSSResult {
51
+ return css`
52
+ ul {
53
+ margin: 0;
54
+ padding: 0 10px;
55
+ font-size: 1.4rem;
56
+ list-style-type: none;
57
+ max-height: min(400px, 40vh);
58
+ overflow-y: auto;
59
+ }
60
+
61
+ li {
62
+ display: flex;
63
+ justify-content: space-between;
64
+ padding: 2px 0;
65
+ }
66
+ li:not(:last-of-type) {
67
+ border-bottom: 1px solid rgb(232, 232, 232);
68
+ }
69
+
70
+ .item-title {
71
+ word-break: break-word;
72
+ }
73
+
74
+ .item-date {
75
+ white-space: nowrap;
76
+ }
77
+
78
+ .message {
79
+ font-size: 1.4rem;
80
+ padding: 5px 10px;
81
+ }
82
+
83
+ .button-bar {
84
+ display: flex;
85
+ justify-content: center;
86
+ margin: 10px 5px;
87
+ }
88
+
89
+ .remove-items-btn {
90
+ margin-bottom: 10px;
91
+ padding: 10px;
92
+ border: 1px solid var(--primaryErrorCTABorder, #d43f3a);
93
+ border-radius: 4px;
94
+ color: white;
95
+ background: var(--primaryErrorCTAFill, #d9534f);
96
+ appearance: none;
97
+ cursor: pointer;
98
+ }
99
+ .remove-items-btn:hover {
100
+ background: rgba(var(--primaryErrorCTAFillRGB, 229, 28, 38), 0.9);
101
+ }
102
+ .remove-items-btn:active {
103
+ background: rgba(var(--primaryErrorCTAFillRGB, 229, 28, 38), 0.7);
104
+ }
105
+ `;
106
+ }
107
+ }
package/src/models.ts CHANGED
@@ -236,9 +236,9 @@ export type TileDisplayMode =
236
236
  /**
237
237
  * This is mainly used to set the cookies for the collection display mode.
238
238
  *
239
- * It allows the user to set different modes for different contexts (collection page, search page, etc).
239
+ * It allows the user to set different modes for different contexts (collection page, search page, profile page etc).
240
240
  */
241
- export type CollectionBrowserContext = 'collection' | 'search';
241
+ export type CollectionBrowserContext = 'collection' | 'search' | 'profile';
242
242
 
243
243
  /**
244
244
  * The sort fields shown in the sort filter bar
@@ -16,8 +16,9 @@ const darkButtonFillColor = css`var(--secondaryCTAFill, #333)`;
16
16
  const darkButtonFillColorRGB = css`var(--secondaryCTAFillRGB, 51, 51, 51)`; // RBG format of --secondaryCTAFill
17
17
  const darkButtonBorderColor = css`var(--primaryCTABorder, #979797)`;
18
18
 
19
- const warningButtonBGColor = css`#ee8950`;
20
- const warningButtonBorderColor = css`#ec7939`;
19
+ const warningButtonFillColor = css`var(---primaryWarningFill, #ee8950)`;
20
+ const warningButtonFillColorRGB = css`var(--primaryWarningFillRGB, 238, 137, 80)`; // RBG format of --primaryWarningFill
21
+ const warningButtonBorderColor = css`var(--primaryWarningBorder, #ec7939)`;
21
22
 
22
23
  export default css`
23
24
  .ia-button {
@@ -58,9 +59,12 @@ export default css`
58
59
  .ia-button.transparent {
59
60
  background-color: transparent;
60
61
  }
61
- .ia-button.warning {
62
- background-color: ${warningButtonBGColor}
63
- border-color: ${warningButtonBorderColor};
62
+
63
+ .ia-button.primary:disabled,
64
+ .ia-button.danger:disabled,
65
+ .ia-button.warning:disabled,
66
+ .ia-button.dark:disabled {
67
+ opacity: 0.5;
64
68
  }
65
69
 
66
70
  .ia-button.primary {
@@ -91,6 +95,20 @@ export default css`
91
95
  background-color: rgba(${dangerButtonFillColorRGB}, 0.7);
92
96
  }
93
97
 
98
+ .ia-button.warning {
99
+ background-color: ${warningButtonFillColor};
100
+ border-color: ${warningButtonBorderColor};
101
+ }
102
+ .ia-button.warning:hover {
103
+ background-color: rgba(${warningButtonFillColorRGB}, 0.9);
104
+ }
105
+ .ia-button.warning:focus-visible {
106
+ background-color: rgba(${warningButtonFillColorRGB}, 0.8);
107
+ }
108
+ .ia-button.warning:active {
109
+ background-color: rgba(${warningButtonFillColorRGB}, 0.7);
110
+ }
111
+
94
112
  .ia-button.dark {
95
113
  background-color: ${darkButtonFillColor};
96
114
  border-color: ${darkButtonBorderColor};
@@ -104,4 +122,18 @@ export default css`
104
122
  .ia-button.dark:active {
105
123
  background-color: rgba(${darkButtonFillColorRGB}, 0.7);
106
124
  }
125
+
126
+ .ia-button.link {
127
+ margin: 0;
128
+ padding: 6px;
129
+ border: 0;
130
+ appearance: none;
131
+ background: none;
132
+ color: var(--ia-theme-link-color, #4b64ff);
133
+ text-decoration: none;
134
+ cursor: pointer;
135
+ }
136
+ .ia-button.link:hover {
137
+ text-decoration: underline;
138
+ }
107
139
  `;
@@ -31,6 +31,18 @@ describe('Manage bar', () => {
31
31
  expect(el.shadowRoot?.querySelector('.unselect-all-btn')).not.to.exist;
32
32
  });
33
33
 
34
+ it('does not render item manager button except /search/ page', async () => {
35
+ const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);
36
+ expect(el.shadowRoot?.querySelector('.ia-button.warning')).not.to.exist;
37
+ });
38
+
39
+ it('render item manager button for /search/ page', async () => {
40
+ const el = await fixture<ManageBar>(
41
+ html`<manage-bar .pageContext=${'search'}></manage-bar>`
42
+ );
43
+ expect(el.shadowRoot?.querySelector('.ia-button.warning')).to.exist;
44
+ });
45
+
34
46
  it('includes Select All button when requested', async () => {
35
47
  const el = await fixture<ManageBar>(
36
48
  html`<manage-bar showSelectAll></manage-bar>`
@@ -1,30 +1,30 @@
1
- // import { hmrPlugin, presets } from '@open-wc/dev-server-hmr';
2
-
3
- /** Use Hot Module replacement by adding --hmr to the start command */
4
- const hmr = process.argv.includes('--hmr');
5
-
6
- export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
7
- nodeResolve: true,
8
- open: '/',
9
- watch: !hmr,
10
-
11
- /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
12
- // esbuildTarget: 'auto'
13
-
14
- /** Set appIndex to enable SPA routing */
15
- // appIndex: 'demo/index.html',
16
-
17
- /** Confgure bare import resolve plugin */
18
- // nodeResolve: {
19
- // exportConditions: ['browser', 'development']
20
- // },
21
-
22
- plugins: [
23
- /** Use Hot Module Replacement by uncommenting. Requires @open-wc/dev-server-hmr plugin */
24
- // hmr && hmrPlugin({ exclude: ['**/*/node_modules/**/*'], presets: [presets.litElement] }),
25
- ],
26
-
27
- http2: true,
28
- sslCert: './local.archive.org.cert',
29
- sslKey: './local.archive.org.key',
30
- });
1
+ // import { hmrPlugin, presets } from '@open-wc/dev-server-hmr';
2
+
3
+ /** Use Hot Module replacement by adding --hmr to the start command */
4
+ const hmr = process.argv.includes('--hmr');
5
+
6
+ export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
7
+ nodeResolve: true,
8
+ open: '/',
9
+ watch: !hmr,
10
+
11
+ /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
12
+ // esbuildTarget: 'auto'
13
+
14
+ /** Set appIndex to enable SPA routing */
15
+ // appIndex: 'demo/index.html',
16
+
17
+ /** Confgure bare import resolve plugin */
18
+ // nodeResolve: {
19
+ // exportConditions: ['browser', 'development']
20
+ // },
21
+
22
+ plugins: [
23
+ /** Use Hot Module Replacement by uncommenting. Requires @open-wc/dev-server-hmr plugin */
24
+ // hmr && hmrPlugin({ exclude: ['**/*/node_modules/**/*'], presets: [presets.litElement] }),
25
+ ],
26
+
27
+ http2: true,
28
+ sslCert: './local.archive.org.cert',
29
+ sslKey: './local.archive.org.key',
30
+ });
@@ -1,41 +1,41 @@
1
- // import { playwrightLauncher } from '@web/test-runner-playwright';
2
-
3
- const filteredLogs = ['Running in dev mode', 'lit-html is in dev mode'];
4
-
5
- export default /** @type {import("@web/test-runner").TestRunnerConfig} */ ({
6
- /** Test files to run */
7
- files: 'dist/test/**/*.test.js',
8
-
9
- /** Resolve bare module imports */
10
- nodeResolve: {
11
- exportConditions: ['browser', 'development'],
12
- },
13
-
14
- /** Filter out lit dev mode logs */
15
- filterBrowserLogs(log) {
16
- for (const arg of log.args) {
17
- if (typeof arg === 'string' && filteredLogs.some(l => arg.includes(l))) {
18
- return false;
19
- }
20
- }
21
- return true;
22
- },
23
-
24
- /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
25
- // esbuildTarget: 'auto',
26
-
27
- /** Amount of browsers to run concurrently */
28
- // concurrentBrowsers: 2,
29
-
30
- /** Amount of test files per browser to test concurrently */
31
- // concurrency: 1,
32
-
33
- /** Browsers to run tests on */
34
- // browsers: [
35
- // playwrightLauncher({ product: 'chromium' }),
36
- // playwrightLauncher({ product: 'firefox' }),
37
- // playwrightLauncher({ product: 'webkit' }),
38
- // ],
39
-
40
- // See documentation for all available options
41
- });
1
+ // import { playwrightLauncher } from '@web/test-runner-playwright';
2
+
3
+ const filteredLogs = ['Running in dev mode', 'lit-html is in dev mode'];
4
+
5
+ export default /** @type {import("@web/test-runner").TestRunnerConfig} */ ({
6
+ /** Test files to run */
7
+ files: 'dist/test/**/*.test.js',
8
+
9
+ /** Resolve bare module imports */
10
+ nodeResolve: {
11
+ exportConditions: ['browser', 'development'],
12
+ },
13
+
14
+ /** Filter out lit dev mode logs */
15
+ filterBrowserLogs(log) {
16
+ for (const arg of log.args) {
17
+ if (typeof arg === 'string' && filteredLogs.some(l => arg.includes(l))) {
18
+ return false;
19
+ }
20
+ }
21
+ return true;
22
+ },
23
+
24
+ /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
25
+ // esbuildTarget: 'auto',
26
+
27
+ /** Amount of browsers to run concurrently */
28
+ // concurrentBrowsers: 2,
29
+
30
+ /** Amount of test files per browser to test concurrently */
31
+ // concurrency: 1,
32
+
33
+ /** Browsers to run tests on */
34
+ // browsers: [
35
+ // playwrightLauncher({ product: 'chromium' }),
36
+ // playwrightLauncher({ product: 'firefox' }),
37
+ // playwrightLauncher({ product: 'webkit' }),
38
+ // ],
39
+
40
+ // See documentation for all available options
41
+ });