@internetarchive/collection-browser 2.7.7-alpha.2 → 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 (304) hide show
  1. package/.github/workflows/ci.yml +3 -3
  2. package/dist/index.js +2 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/app-root.d.ts +9 -1
  5. package/dist/src/app-root.js +40 -6
  6. package/dist/src/app-root.js.map +1 -1
  7. package/dist/src/assets/img/icons/arrow-left.d.ts +1 -1
  8. package/dist/src/assets/img/icons/arrow-right.d.ts +1 -1
  9. package/dist/src/assets/img/icons/chevron.d.ts +1 -1
  10. package/dist/src/assets/img/icons/contract.d.ts +1 -1
  11. package/dist/src/assets/img/icons/empty-query.d.ts +1 -1
  12. package/dist/src/assets/img/icons/expand.d.ts +1 -1
  13. package/dist/src/assets/img/icons/eye-closed.d.ts +1 -1
  14. package/dist/src/assets/img/icons/eye.d.ts +1 -1
  15. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  16. package/dist/src/assets/img/icons/favorite-unfilled.d.ts +1 -1
  17. package/dist/src/assets/img/icons/filter.d.ts +1 -1
  18. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  19. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  20. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  21. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  22. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  23. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  24. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  25. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  26. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  27. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -1
  28. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  29. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  30. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  31. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  32. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  33. package/dist/src/assets/img/icons/null-result.d.ts +1 -1
  34. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  35. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  36. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  37. package/dist/src/assets/img/icons/views.d.ts +1 -1
  38. package/dist/src/circular-activity-indicator.d.ts +1 -1
  39. package/dist/src/circular-activity-indicator.js.map +1 -1
  40. package/dist/src/collection-browser.d.ts +21 -1
  41. package/dist/src/collection-browser.js +60 -17
  42. package/dist/src/collection-browser.js.map +1 -1
  43. package/dist/src/collection-facets/facet-row.js.map +1 -1
  44. package/dist/src/collection-facets/facet-tombstone-row.d.ts +1 -1
  45. package/dist/src/collection-facets/facet-tombstone-row.js.map +1 -1
  46. package/dist/src/collection-facets/facets-template.js +5 -5
  47. package/dist/src/collection-facets/facets-template.js.map +1 -1
  48. package/dist/src/collection-facets/more-facets-content.d.ts +1 -1
  49. package/dist/src/collection-facets/more-facets-content.js +4 -2
  50. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  51. package/dist/src/collection-facets/more-facets-pagination.js +0 -1
  52. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -1
  53. package/dist/src/collection-facets/smart-facets/dedupe.js.map +1 -1
  54. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords-heuristic.js.map +1 -1
  55. package/dist/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.js +1 -1
  56. package/dist/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.js.map +1 -1
  57. package/dist/src/collection-facets/smart-facets/models.d.ts +2 -2
  58. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +4 -1
  59. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
  60. package/dist/src/collection-facets/smart-facets/smart-facet-button.d.ts +1 -1
  61. package/dist/src/collection-facets/smart-facets/smart-facet-button.js.map +1 -1
  62. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.d.ts +1 -1
  63. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -1
  64. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js.map +1 -1
  65. package/dist/src/collection-facets/toggle-switch.d.ts +2 -2
  66. package/dist/src/collection-facets/toggle-switch.js +2 -2
  67. package/dist/src/collection-facets/toggle-switch.js.map +1 -1
  68. package/dist/src/collection-facets.js +3 -2
  69. package/dist/src/collection-facets.js.map +1 -1
  70. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +4 -0
  71. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -1
  72. package/dist/src/data-source/collection-browser-data-source.d.ts +4 -0
  73. package/dist/src/data-source/collection-browser-data-source.js +22 -8
  74. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  75. package/dist/src/data-source/collection-browser-query-state.d.ts +1 -0
  76. package/dist/src/data-source/collection-browser-query-state.js.map +1 -1
  77. package/dist/src/data-source/models.d.ts +2 -2
  78. package/dist/src/empty-placeholder.d.ts +1 -1
  79. package/dist/src/empty-placeholder.js +11 -10
  80. package/dist/src/empty-placeholder.js.map +1 -1
  81. package/dist/src/expanded-date-picker.js.map +1 -1
  82. package/dist/src/language-code-handler/language-code-handler.js.map +1 -1
  83. package/dist/src/language-code-handler/language-code-mapping.js +86 -86
  84. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -1
  85. package/dist/src/manage/manage-bar.d.ts +32 -9
  86. package/dist/src/manage/manage-bar.js +121 -27
  87. package/dist/src/manage/manage-bar.js.map +1 -1
  88. package/dist/src/manage/remove-items-modal-content.d.ts +9 -0
  89. package/dist/src/manage/remove-items-modal-content.js +104 -0
  90. package/dist/src/manage/remove-items-modal-content.js.map +1 -0
  91. package/dist/src/mediatype/mediatype-config.js +0 -1
  92. package/dist/src/mediatype/mediatype-config.js.map +1 -1
  93. package/dist/src/models.d.ts +24 -15
  94. package/dist/src/models.js +3 -3
  95. package/dist/src/models.js.map +1 -1
  96. package/dist/src/restoration-state-handler.js +1 -0
  97. package/dist/src/restoration-state-handler.js.map +1 -1
  98. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +1 -1
  99. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js.map +1 -1
  100. package/dist/src/sort-filter-bar/alpha-bar.js +9 -9
  101. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  102. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  103. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  104. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  105. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  106. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  107. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  108. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  109. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +1 -1
  110. package/dist/src/sort-filter-bar/sort-filter-bar.js +2 -1
  111. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  112. package/dist/src/tiles/base-tile-component.js.map +1 -1
  113. package/dist/src/tiles/collection-browser-loading-tile.d.ts +1 -1
  114. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -1
  115. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  116. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  117. package/dist/src/tiles/grid/item-tile.js +3 -2
  118. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  119. package/dist/src/tiles/grid/search-tile.js.map +1 -1
  120. package/dist/src/tiles/grid/tile-stats.d.ts +1 -1
  121. package/dist/src/tiles/grid/tile-stats.js +2 -2
  122. package/dist/src/tiles/grid/tile-stats.js.map +1 -1
  123. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
  124. package/dist/src/tiles/hover/tile-hover-pane.d.ts +1 -1
  125. package/dist/src/tiles/hover/tile-hover-pane.js +1 -3
  126. package/dist/src/tiles/hover/tile-hover-pane.js.map +1 -1
  127. package/dist/src/tiles/image-block.d.ts +1 -1
  128. package/dist/src/tiles/image-block.js +1 -1
  129. package/dist/src/tiles/image-block.js.map +1 -1
  130. package/dist/src/tiles/item-image.d.ts +1 -1
  131. package/dist/src/tiles/item-image.js +2 -2
  132. package/dist/src/tiles/item-image.js.map +1 -1
  133. package/dist/src/tiles/list/tile-list-compact-header.d.ts +1 -1
  134. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
  135. package/dist/src/tiles/list/tile-list-compact.d.ts +1 -1
  136. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  137. package/dist/src/tiles/list/tile-list.js +6 -4
  138. package/dist/src/tiles/list/tile-list.js.map +1 -1
  139. package/dist/src/tiles/mediatype-icon.d.ts +1 -1
  140. package/dist/src/tiles/mediatype-icon.js.map +1 -1
  141. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -1
  142. package/dist/src/tiles/overlay/text-overlay.js.map +1 -1
  143. package/dist/src/tiles/review-block.js.map +1 -1
  144. package/dist/src/tiles/text-snippet-block.js.map +1 -1
  145. package/dist/src/tiles/tile-dispatcher.d.ts +1 -1
  146. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  147. package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
  148. package/dist/src/utils/facet-utils.js.map +1 -1
  149. package/dist/src/utils/format-count.d.ts +2 -2
  150. package/dist/src/utils/format-count.js +1 -0
  151. package/dist/src/utils/format-count.js.map +1 -1
  152. package/dist/src/utils/format-date.d.ts +1 -1
  153. package/dist/src/utils/format-date.js.map +1 -1
  154. package/dist/src/utils/format-unit-size.js.map +1 -1
  155. package/dist/src/utils/log.js +3 -1
  156. package/dist/src/utils/log.js.map +1 -1
  157. package/dist/src/utils/resolve-mediatype.js.map +1 -1
  158. package/dist/test/collection-browser.test.js +17 -2
  159. package/dist/test/collection-browser.test.js.map +1 -1
  160. package/dist/test/collection-facets/facet-row.test.js +1 -4
  161. package/dist/test/collection-facets/facet-row.test.js.map +1 -1
  162. package/dist/test/collection-facets/facets-template.test.js.map +1 -1
  163. package/dist/test/collection-facets/more-facets-content.test.js +1 -0
  164. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
  165. package/dist/test/collection-facets/more-facets-pagination.test.js +1 -0
  166. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -1
  167. package/dist/test/collection-facets/toggle-switch.test.js +3 -12
  168. package/dist/test/collection-facets/toggle-switch.test.js.map +1 -1
  169. package/dist/test/collection-facets.test.js +1 -0
  170. package/dist/test/collection-facets.test.js.map +1 -1
  171. package/dist/test/data-source/collection-browser-data-source.test.js.map +1 -1
  172. package/dist/test/empty-placeholder.test.js +1 -0
  173. package/dist/test/empty-placeholder.test.js.map +1 -1
  174. package/dist/test/expanded-date-picker.test.js.map +1 -1
  175. package/dist/test/icon-overlay.test.js +1 -0
  176. package/dist/test/icon-overlay.test.js.map +1 -1
  177. package/dist/test/image-block.test.js +1 -0
  178. package/dist/test/image-block.test.js.map +1 -1
  179. package/dist/test/item-image.test.js +1 -0
  180. package/dist/test/item-image.test.js.map +1 -1
  181. package/dist/test/manage/manage-bar.test.d.ts +1 -0
  182. package/dist/test/manage/manage-bar.test.js +26 -10
  183. package/dist/test/manage/manage-bar.test.js.map +1 -1
  184. package/dist/test/manage/remove-items-modal-content.test.d.ts +1 -0
  185. package/dist/test/manage/remove-items-modal-content.test.js +66 -0
  186. package/dist/test/manage/remove-items-modal-content.test.js.map +1 -0
  187. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  188. package/dist/test/mocks/mock-search-service.js.map +1 -1
  189. package/dist/test/restoration-state-handler.test.js.map +1 -1
  190. package/dist/test/review-block.test.js +1 -0
  191. package/dist/test/review-block.test.js.map +1 -1
  192. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js.map +1 -1
  193. package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -1
  194. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +1 -0
  195. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
  196. package/dist/test/text-overlay.test.js +1 -0
  197. package/dist/test/text-overlay.test.js.map +1 -1
  198. package/dist/test/text-snippet-block.test.js +1 -0
  199. package/dist/test/text-snippet-block.test.js.map +1 -1
  200. package/dist/test/tile-stats.test.js +23 -22
  201. package/dist/test/tile-stats.test.js.map +1 -1
  202. package/dist/test/tiles/grid/account-tile.test.js +1 -0
  203. package/dist/test/tiles/grid/account-tile.test.js.map +1 -1
  204. package/dist/test/tiles/grid/collection-tile.test.js +1 -0
  205. package/dist/test/tiles/grid/collection-tile.test.js.map +1 -1
  206. package/dist/test/tiles/grid/item-tile.test.js +1 -0
  207. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  208. package/dist/test/tiles/grid/search-tile.test.js +1 -0
  209. package/dist/test/tiles/grid/search-tile.test.js.map +1 -1
  210. package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -1
  211. package/dist/test/tiles/hover/tile-hover-pane.test.js.map +1 -1
  212. package/dist/test/tiles/list/tile-list-compact.test.js +1 -0
  213. package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -1
  214. package/dist/test/tiles/list/tile-list.test.js +1 -0
  215. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  216. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
  217. package/dist/test/utils/format-count.test.js.map +1 -1
  218. package/dist/test/utils/format-date.test.js.map +1 -1
  219. package/dist/test/utils/local-date-from-utc.test.js.map +1 -1
  220. package/index.html +3 -0
  221. package/package.json +38 -40
  222. package/src/app-root.ts +60 -25
  223. package/src/collection-browser.ts +101 -50
  224. package/src/collection-facets/facets-template.ts +6 -7
  225. package/src/collection-facets/more-facets-content.ts +13 -11
  226. package/src/collection-facets/more-facets-pagination.ts +2 -3
  227. package/src/collection-facets/smart-facets/dedupe.ts +2 -2
  228. package/src/collection-facets/smart-facets/heuristics/query-keywords-heuristic.ts +1 -1
  229. package/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.ts +6 -6
  230. package/src/collection-facets/smart-facets/smart-facet-bar.ts +8 -6
  231. package/src/collection-facets/smart-facets/smart-facet-button.ts +3 -5
  232. package/src/collection-facets/smart-facets/smart-facet-dropdown.ts +4 -4
  233. package/src/collection-facets/smart-facets/smart-facet-heuristics.ts +1 -1
  234. package/src/collection-facets/toggle-switch.ts +2 -2
  235. package/src/collection-facets.ts +19 -18
  236. package/src/data-source/collection-browser-data-source-interface.ts +6 -5
  237. package/src/data-source/collection-browser-data-source.ts +48 -37
  238. package/src/data-source/collection-browser-query-state.ts +1 -0
  239. package/src/empty-placeholder.ts +16 -19
  240. package/src/expanded-date-picker.ts +1 -1
  241. package/src/language-code-handler/language-code-handler.ts +1 -1
  242. package/src/manage/manage-bar.ts +132 -38
  243. package/src/manage/remove-items-modal-content.ts +102 -0
  244. package/src/mediatype/mediatype-config.ts +0 -1
  245. package/src/models.ts +13 -3
  246. package/src/restoration-state-handler.ts +15 -14
  247. package/src/sort-filter-bar/alpha-bar.ts +17 -16
  248. package/src/sort-filter-bar/sort-filter-bar.ts +15 -14
  249. package/src/tiles/grid/account-tile.ts +1 -1
  250. package/src/tiles/grid/collection-tile.ts +1 -1
  251. package/src/tiles/grid/item-tile.ts +9 -9
  252. package/src/tiles/grid/tile-stats.ts +4 -4
  253. package/src/tiles/hover/hover-pane-controller.ts +1 -1
  254. package/src/tiles/hover/tile-hover-pane.ts +2 -4
  255. package/src/tiles/item-image.ts +1 -1
  256. package/src/tiles/list/tile-list-compact.ts +2 -2
  257. package/src/tiles/list/tile-list.ts +24 -22
  258. package/src/tiles/tile-dispatcher.ts +5 -5
  259. package/src/tiles/tile-display-value-provider.ts +4 -4
  260. package/src/utils/facet-utils.ts +6 -6
  261. package/src/utils/format-count.ts +3 -2
  262. package/src/utils/format-date.ts +1 -1
  263. package/src/utils/format-unit-size.ts +1 -1
  264. package/src/utils/log.ts +3 -1
  265. package/test/collection-browser.test.ts +145 -123
  266. package/test/collection-facets/facet-row.test.ts +28 -31
  267. package/test/collection-facets/facets-template.test.ts +9 -9
  268. package/test/collection-facets/more-facets-content.test.ts +15 -14
  269. package/test/collection-facets/more-facets-pagination.test.ts +19 -18
  270. package/test/collection-facets/toggle-switch.test.ts +18 -28
  271. package/test/collection-facets.test.ts +37 -36
  272. package/test/data-source/collection-browser-data-source.test.ts +2 -2
  273. package/test/empty-placeholder.test.ts +7 -6
  274. package/test/expanded-date-picker.test.ts +18 -17
  275. package/test/icon-overlay.test.ts +1 -0
  276. package/test/image-block.test.ts +7 -6
  277. package/test/item-image.test.ts +1 -0
  278. package/test/manage/manage-bar.test.ts +52 -28
  279. package/test/manage/remove-items-modal-content.test.ts +82 -0
  280. package/test/mocks/mock-search-responses.ts +1 -2
  281. package/test/mocks/mock-search-service.ts +1 -1
  282. package/test/restoration-state-handler.test.ts +12 -12
  283. package/test/review-block.test.ts +2 -1
  284. package/test/sort-filter-bar/alpha-bar-tooltip.test.ts +1 -1
  285. package/test/sort-filter-bar/alpha-bar.test.ts +5 -5
  286. package/test/sort-filter-bar/sort-filter-bar.test.ts +39 -38
  287. package/test/text-overlay.test.ts +1 -0
  288. package/test/text-snippet-block.test.ts +6 -5
  289. package/test/tile-stats.test.ts +35 -26
  290. package/test/tiles/grid/account-tile.test.ts +3 -2
  291. package/test/tiles/grid/collection-tile.test.ts +4 -3
  292. package/test/tiles/grid/item-tile.test.ts +14 -13
  293. package/test/tiles/grid/search-tile.test.ts +2 -1
  294. package/test/tiles/hover/hover-pane-controller.test.ts +15 -15
  295. package/test/tiles/hover/tile-hover-pane.test.ts +5 -5
  296. package/test/tiles/list/tile-list-compact.test.ts +2 -1
  297. package/test/tiles/list/tile-list.test.ts +11 -10
  298. package/test/tiles/tile-dispatcher.test.ts +5 -5
  299. package/test/utils/format-count.test.ts +1 -1
  300. package/test/utils/format-date.test.ts +1 -1
  301. package/test/utils/local-date-from-utc.test.ts +1 -1
  302. package/tsconfig.json +1 -0
  303. package/.prettierignore +0 -1
  304. package/eslint.config.mjs +0 -53
@@ -50,7 +50,7 @@ export class LanguageCodeHandler implements LanguageCodeHandlerInterface {
50
50
  /** @inheritdoc */
51
51
  getCodeStringFromLanguageName(languageName: string): string {
52
52
  const languageCodes = Object.keys(codeToLanguageMap).filter(
53
- code => codeToLanguageMap[code] === languageName,
53
+ code => codeToLanguageMap[code] === languageName
54
54
  );
55
55
  const stringifiedCodes = languageCodes?.join(this.delimeter);
56
56
  return stringifiedCodes;
@@ -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,41 +63,38 @@ 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,
69
- () =>
70
- html` <button
71
- class="ia-button link select-all-btn"
72
- @click=${this.selectAllClicked}
73
- >
74
- ${msg('Select all')}
75
- </button>`,
83
+ () => html` <button
84
+ class="ia-button link select-all-btn"
85
+ @click=${this.selectAllClicked}
86
+ >
87
+ ${msg('Select all')}
88
+ </button>`
76
89
  )}
77
90
  ${when(
78
91
  this.showUnselectAll,
79
- () =>
80
- html` <button
81
- class="ia-button link unselect-all-btn"
82
- @click=${this.unselectAllClicked}
83
- >
84
- ${msg('Unselect all')}
85
- </button>`,
92
+ () => html` <button
93
+ class="ia-button link unselect-all-btn"
94
+ @click=${this.unselectAllClicked}
95
+ >
96
+ ${msg('Unselect all')}
97
+ </button>`
86
98
  )}
87
99
  </div>
88
100
  </div>
@@ -94,12 +106,12 @@ export class ManageBar extends LitElement {
94
106
  this.dispatchEvent(new CustomEvent('cancel'));
95
107
  }
96
108
 
97
- private removeClicked(): void {
109
+ private removeItemsClicked(): void {
98
110
  this.dispatchEvent(new CustomEvent('removeItems'));
99
111
  }
100
112
 
101
- private itemsManagerClicked(): void {
102
- this.dispatchEvent(new CustomEvent('itemsManager'));
113
+ private manageItemsClicked(): void {
114
+ this.dispatchEvent(new CustomEvent('manageItems'));
103
115
  }
104
116
 
105
117
  private selectAllClicked(): void {
@@ -110,6 +122,88 @@ export class ManageBar extends LitElement {
110
122
  this.dispatchEvent(new CustomEvent('unselectAll'));
111
123
  }
112
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
+
113
207
  static get styles(): CSSResultGroup {
114
208
  return css`
115
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
+ }
@@ -13,7 +13,6 @@ import { videoIcon } from '../assets/img/icons/mediatype/video';
13
13
  import { webIcon } from '../assets/img/icons/mediatype/web';
14
14
  import { searchIcon } from '../assets/img/icons/mediatype/search';
15
15
 
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
16
  export const mediatypeConfig: { [key: string]: any } = {
18
17
  account: {
19
18
  color: '#000000',
package/src/models.ts CHANGED
@@ -125,7 +125,7 @@ export class TileModel {
125
125
  this.description = result.description?.values.join('\n');
126
126
  this.favCount = result.num_favorites?.value ?? 0;
127
127
  this.href = collapseRepeatedQuotes(
128
- result.review?.__href__ ?? result.__href__?.value,
128
+ result.review?.__href__ ?? result.__href__?.value
129
129
  );
130
130
  this.identifier = TileModel.cleanIdentifier(result.identifier);
131
131
  this.issue = result.issue?.value;
@@ -212,7 +212,7 @@ export class TileModel {
212
212
  }
213
213
 
214
214
  private static cleanIdentifier(
215
- identifier: string | undefined,
215
+ identifier: string | undefined
216
216
  ): string | undefined {
217
217
  // Some identifiers (e.g., from Whisper) represent documents rather than items, and
218
218
  // are suffixed with values that need to be stripped. Those values are separated
@@ -463,7 +463,7 @@ export const SORT_OPTIONS: Record<SortField, SortOption> = {
463
463
  export function sortOptionFromAPIString(sortName?: string | null): SortOption {
464
464
  return (
465
465
  Object.values(SORT_OPTIONS).find(opt =>
466
- opt.urlNames.some(name => sortName === name),
466
+ opt.urlNames.some(name => sortName === name)
467
467
  ) ?? SORT_OPTIONS[SortField.unrecognized]
468
468
  );
469
469
  }
@@ -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
+ }
@@ -87,7 +87,7 @@ export class RestorationStateHandler
87
87
 
88
88
  private persistQueryStateToUrl(
89
89
  state: RestorationState,
90
- forceReplace = false,
90
+ forceReplace = false
91
91
  ) {
92
92
  const url = new URL(window.location.href);
93
93
  const oldParams = new URLSearchParams(url.searchParams);
@@ -145,9 +145,10 @@ export class RestorationStateHandler
145
145
 
146
146
  if (state.selectedFacets) {
147
147
  for (const [facetName, facetValues] of Object.entries(
148
- state.selectedFacets,
148
+ state.selectedFacets
149
149
  )) {
150
150
  const facetEntries = Object.entries(facetValues);
151
+ // eslint-disable-next-line no-continue
151
152
  if (facetEntries.length === 0) continue;
152
153
  for (const [key, data] of facetEntries) {
153
154
  const notValue = data.state === 'hidden';
@@ -164,7 +165,7 @@ export class RestorationStateHandler
164
165
  if (state.minSelectedDate && state.maxSelectedDate) {
165
166
  newParams.append(
166
167
  'and[]',
167
- `year:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`,
168
+ `year:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`
168
169
  );
169
170
  }
170
171
 
@@ -220,7 +221,7 @@ export class RestorationStateHandler
220
221
  facets: state.selectedFacets,
221
222
  },
222
223
  '',
223
- url,
224
+ url
224
225
  );
225
226
  }
226
227
 
@@ -317,18 +318,18 @@ export class RestorationStateHandler
317
318
  if (minDate && maxDate) {
318
319
  restorationState.minSelectedDate = minDate.substring(
319
320
  1,
320
- minDate.length,
321
+ minDate.length
321
322
  );
322
323
  restorationState.maxSelectedDate = maxDate.substring(
323
324
  0,
324
- maxDate.length - 1,
325
+ maxDate.length - 1
325
326
  );
326
327
  } else {
327
328
  this.setSelectedFacetState(
328
329
  restorationState.selectedFacets,
329
330
  field as FacetOption,
330
331
  value,
331
- 'selected',
332
+ 'selected'
332
333
  );
333
334
  }
334
335
  break;
@@ -344,7 +345,7 @@ export class RestorationStateHandler
344
345
  restorationState.selectedFacets,
345
346
  field as FacetOption,
346
347
  value,
347
- 'selected',
348
+ 'selected'
348
349
  );
349
350
  }
350
351
  });
@@ -357,7 +358,7 @@ export class RestorationStateHandler
357
358
  restorationState.selectedFacets,
358
359
  field as FacetOption,
359
360
  value,
360
- 'hidden',
361
+ 'hidden'
361
362
  );
362
363
  });
363
364
  }
@@ -407,13 +408,13 @@ export class RestorationStateHandler
407
408
  private paramsMatch(
408
409
  searchParams1: URLSearchParams,
409
410
  searchParams2: URLSearchParams,
410
- keys: string[],
411
+ keys: string[]
411
412
  ): boolean {
412
413
  return keys.every(key =>
413
414
  arrayEquals(
414
415
  searchParams1.getAll(key).sort(),
415
- searchParams2.getAll(key).sort(),
416
- ),
416
+ searchParams2.getAll(key).sort()
417
+ )
417
418
  );
418
419
  }
419
420
 
@@ -422,7 +423,7 @@ export class RestorationStateHandler
422
423
  * when loading state from the URL.
423
424
  */
424
425
  private removeRecognizedParams(
425
- searchParams: URLSearchParams,
426
+ searchParams: URLSearchParams
426
427
  ): URLSearchParams {
427
428
  // Remove all of our standard params
428
429
  searchParams.delete('query');
@@ -463,7 +464,7 @@ export class RestorationStateHandler
463
464
  selectedFacets: SelectedFacets,
464
465
  field: FacetOption,
465
466
  value: string,
466
- state: FacetState,
467
+ state: FacetState
467
468
  ): void {
468
469
  const facet = selectedFacets[field];
469
470
  if (!facet) return; // Unrecognized facet group, ignore it.
@@ -33,18 +33,19 @@ export class AlphaBar extends LitElement {
33
33
  <section id="container" aria-label=${this.ariaLandmarkLabel ?? nothing}>
34
34
  <ul>
35
35
  ${this.alphabet.map(
36
- letter => html`
37
- <li
38
- class=${letter === this.selectedUppercaseLetter
39
- ? 'selected'
40
- : nothing}
41
- @mousemove=${this.handleMouseMove}
42
- @mouseleave=${this.handleMouseLeave}
43
- >
44
- ${this.letterButtonTemplate(letter)}
45
- ${this.tooltipTemplate(letter)}
46
- </li>
47
- `,
36
+ letter =>
37
+ html`
38
+ <li
39
+ class=${letter === this.selectedUppercaseLetter
40
+ ? 'selected'
41
+ : nothing}
42
+ @mousemove=${this.handleMouseMove}
43
+ @mouseleave=${this.handleMouseLeave}
44
+ >
45
+ ${this.letterButtonTemplate(letter)}
46
+ ${this.tooltipTemplate(letter)}
47
+ </li>
48
+ `
48
49
  )}
49
50
  </ul>
50
51
  </section>
@@ -86,7 +87,7 @@ export class AlphaBar extends LitElement {
86
87
  this.dispatchEvent(
87
88
  new CustomEvent('letterChanged', {
88
89
  detail: { selectedLetter: this.selectedUppercaseLetter },
89
- }),
90
+ })
90
91
  );
91
92
  }
92
93
 
@@ -126,10 +127,10 @@ export class AlphaBar extends LitElement {
126
127
  // (but not including any scrollbar).
127
128
  const bodyStyle = getComputedStyle(document.body);
128
129
  const bodyMarginLeft = parseFloat(
129
- bodyStyle.getPropertyValue('margin-left'),
130
+ bodyStyle.getPropertyValue('margin-left')
130
131
  );
131
132
  const bodyMarginRight = parseFloat(
132
- bodyStyle.getPropertyValue('margin-right'),
133
+ bodyStyle.getPropertyValue('margin-right')
133
134
  );
134
135
  const bodyWidthWithMargin =
135
136
  document.body.clientWidth + bodyMarginLeft + bodyMarginRight;
@@ -154,7 +155,7 @@ export class AlphaBar extends LitElement {
154
155
  left -= overflowAmt;
155
156
  this.tooltip.style.setProperty(
156
157
  '--tooltipArrowOffset',
157
- `${overflowAmt}px`,
158
+ `${overflowAmt}px`
158
159
  );
159
160
  }
160
161
 
@@ -228,7 +228,7 @@ export class SortFilterBar
228
228
 
229
229
  if (changed.has('resizeObserver') || changed.has('enableSortOptionsSlot')) {
230
230
  const oldObserver = changed.get(
231
- 'resizeObserver',
231
+ 'resizeObserver'
232
232
  ) as SharedResizeObserverInterface;
233
233
  if (oldObserver) this.disconnectResizeObserver(oldObserver);
234
234
  this.setupResizeObserver();
@@ -239,12 +239,12 @@ export class SortFilterBar
239
239
  if (this.dropdownBackdropVisible) {
240
240
  document.addEventListener(
241
241
  'keydown',
242
- this.boundSortBarSelectorEscapeListener,
242
+ this.boundSortBarSelectorEscapeListener
243
243
  );
244
244
  } else {
245
245
  document.removeEventListener(
246
246
  'keydown',
247
- this.boundSortBarSelectorEscapeListener,
247
+ this.boundSortBarSelectorEscapeListener
248
248
  );
249
249
  }
250
250
  }
@@ -267,7 +267,7 @@ export class SortFilterBar
267
267
  }
268
268
 
269
269
  private disconnectResizeObserver(
270
- resizeObserver: SharedResizeObserverInterface,
270
+ resizeObserver: SharedResizeObserverInterface
271
271
  ) {
272
272
  if (this.sortSelectorContainer) {
273
273
  resizeObserver.removeObserver({
@@ -430,7 +430,7 @@ export class SortFilterBar
430
430
  .filter(opt => opt.shownInSortBar)
431
431
  .filter(opt => this.showRelevance || opt.field !== SortField.relevance)
432
432
  .filter(
433
- opt => this.showDateFavorited || opt.field !== SortField.datefavorited,
433
+ opt => this.showDateFavorited || opt.field !== SortField.datefavorited
434
434
  );
435
435
 
436
436
  return html`
@@ -439,11 +439,12 @@ export class SortFilterBar
439
439
  class=${this.mobileSelectorVisible ? 'visible' : 'hidden'}
440
440
  >
441
441
  ${this.getSortDropdown({
442
- displayName: html`${SORT_OPTIONS[this.finalizedSortField].displayName}`,
442
+ displayName: html`${SORT_OPTIONS[this.finalizedSortField]
443
+ .displayName}`,
443
444
  id: 'mobile-dropdown',
444
445
  selected: true,
445
446
  dropdownOptions: displayedOptions.map(opt =>
446
- this.getDropdownOption(opt.field),
447
+ this.getDropdownOption(opt.field)
447
448
  ),
448
449
  selectedOption: this.finalizedSortField,
449
450
  onOptionSelected: this.mobileSortChanged,
@@ -451,7 +452,7 @@ export class SortFilterBar
451
452
  this.dropdownBackdropVisible = this.mobileDropdown.open;
452
453
  this.mobileDropdown.classList.toggle(
453
454
  'open',
454
- this.mobileDropdown.open,
455
+ this.mobileDropdown.open
455
456
  );
456
457
  },
457
458
  })}
@@ -478,7 +479,7 @@ export class SortFilterBar
478
479
  displayName?: TemplateResult;
479
480
  selected?: boolean;
480
481
  onClick?: (e: Event) => void;
481
- },
482
+ }
482
483
  ): TemplateResult {
483
484
  const isSelected =
484
485
  options?.selected ?? this.finalizedSortField === sortField;
@@ -758,7 +759,7 @@ export class SortFilterBar
758
759
  /** Toggles the current sort direction between 'asc' and 'desc' */
759
760
  private toggleSortDirection() {
760
761
  this.setSortDirection(
761
- this.finalizedSortDirection === 'desc' ? 'asc' : 'desc',
762
+ this.finalizedSortDirection === 'desc' ? 'asc' : 'desc'
762
763
  );
763
764
  }
764
765
 
@@ -895,14 +896,14 @@ export class SortFilterBar
895
896
  }
896
897
 
897
898
  private titleLetterChanged(
898
- e: CustomEvent<{ selectedLetter: string | undefined }>,
899
+ e: CustomEvent<{ selectedLetter: string | undefined }>
899
900
  ) {
900
901
  this.selectedTitleFilter = e.detail.selectedLetter ?? null;
901
902
  this.emitTitleLetterChangedEvent();
902
903
  }
903
904
 
904
905
  private creatorLetterChanged(
905
- e: CustomEvent<{ selectedLetter: string | undefined }>,
906
+ e: CustomEvent<{ selectedLetter: string | undefined }>
906
907
  ) {
907
908
  this.selectedCreatorFilter = e.detail.selectedLetter ?? null;
908
909
  this.emitCreatorLetterChangedEvent();
@@ -913,7 +914,7 @@ export class SortFilterBar
913
914
  'titleLetterChanged',
914
915
  {
915
916
  detail: { selectedLetter: this.selectedTitleFilter },
916
- },
917
+ }
917
918
  );
918
919
  this.dispatchEvent(event);
919
920
  }
@@ -923,7 +924,7 @@ export class SortFilterBar
923
924
  'creatorLetterChanged',
924
925
  {
925
926
  detail: { selectedLetter: this.selectedCreatorFilter },
926
- },
927
+ }
927
928
  );
928
929
  this.dispatchEvent(event);
929
930
  }
@@ -87,7 +87,7 @@ export class AccountTile extends BaseTileComponent {
87
87
  e.preventDefault();
88
88
  const event = new CustomEvent<{ x: number; y: number }>(
89
89
  'infoButtonPressed',
90
- { detail: { x: e.clientX, y: e.clientY } },
90
+ { detail: { x: e.clientX, y: e.clientY } }
91
91
  );
92
92
  this.dispatchEvent(event);
93
93
  }