@internetarchive/collection-browser 1.13.0-alpha2 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +26 -26
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.js +9 -9
  11. package/dist/src/app-root.d.ts +64 -54
  12. package/dist/src/app-root.js +320 -293
  13. package/dist/src/app-root.js.map +1 -1
  14. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  15. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  16. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  17. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  18. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  19. package/dist/src/assets/img/icons/chevron.js +2 -2
  20. package/dist/src/assets/img/icons/contract.d.ts +2 -2
  21. package/dist/src/assets/img/icons/contract.js +2 -2
  22. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  23. package/dist/src/assets/img/icons/empty-query.js +2 -2
  24. package/dist/src/assets/img/icons/expand.d.ts +2 -2
  25. package/dist/src/assets/img/icons/expand.js +2 -2
  26. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  27. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  28. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  29. package/dist/src/assets/img/icons/eye.js +2 -2
  30. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  31. package/dist/src/assets/img/icons/favorite-filled.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/software.d.ts +1 -1
  51. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  52. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  53. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  54. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  55. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  56. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  57. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  58. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  59. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  60. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  61. package/dist/src/assets/img/icons/null-result.js +2 -2
  62. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  63. package/dist/src/assets/img/icons/restricted.js +2 -2
  64. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  65. package/dist/src/assets/img/icons/reviews.js +2 -2
  66. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  67. package/dist/src/assets/img/icons/upload.js +2 -2
  68. package/dist/src/assets/img/icons/views.d.ts +1 -1
  69. package/dist/src/assets/img/icons/views.js +2 -2
  70. package/dist/src/circular-activity-indicator.d.ts +5 -5
  71. package/dist/src/circular-activity-indicator.js +17 -17
  72. package/dist/src/collection-browser.d.ts +522 -473
  73. package/dist/src/collection-browser.js +1846 -1697
  74. package/dist/src/collection-browser.js.map +1 -1
  75. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  76. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  77. package/dist/src/collection-facets/facets-template.d.ts +20 -20
  78. package/dist/src/collection-facets/facets-template.js +152 -152
  79. package/dist/src/collection-facets/more-facets-content.d.ts +77 -77
  80. package/dist/src/collection-facets/more-facets-content.js +359 -359
  81. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  82. package/dist/src/collection-facets/more-facets-pagination.js +196 -196
  83. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  84. package/dist/src/collection-facets/toggle-switch.js +94 -94
  85. package/dist/src/collection-facets.d.ts +104 -103
  86. package/dist/src/collection-facets.js +511 -498
  87. package/dist/src/collection-facets.js.map +1 -1
  88. package/dist/src/empty-placeholder.d.ts +23 -23
  89. package/dist/src/empty-placeholder.js +74 -74
  90. package/dist/src/expanded-date-picker.d.ts +43 -43
  91. package/dist/src/expanded-date-picker.js +109 -109
  92. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  93. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  94. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  95. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  96. package/dist/src/manage/manage-bar.d.ts +26 -0
  97. package/dist/src/manage/manage-bar.js +147 -0
  98. package/dist/src/manage/manage-bar.js.map +1 -0
  99. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  100. package/dist/src/mediatype/mediatype-config.js +85 -85
  101. package/dist/src/models.d.ts +164 -163
  102. package/dist/src/models.js +269 -269
  103. package/dist/src/models.js.map +1 -1
  104. package/dist/src/restoration-state-handler.d.ts +70 -70
  105. package/dist/src/restoration-state-handler.js +355 -355
  106. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  107. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  108. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  109. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  110. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  111. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  112. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  113. package/dist/src/sort-filter-bar/img/list.js +2 -2
  114. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  115. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  116. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  117. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  118. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  119. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  120. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  121. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  122. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  123. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  124. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +208 -208
  125. package/dist/src/sort-filter-bar/sort-filter-bar.js +637 -637
  126. package/dist/src/styles/item-image-styles.d.ts +8 -8
  127. package/dist/src/styles/item-image-styles.js +9 -9
  128. package/dist/src/styles/sr-only.d.ts +1 -1
  129. package/dist/src/styles/sr-only.js +2 -2
  130. package/dist/src/tiles/base-tile-component.d.ts +18 -18
  131. package/dist/src/tiles/base-tile-component.js +59 -59
  132. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  133. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  134. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  135. package/dist/src/tiles/grid/account-tile.js +72 -72
  136. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  137. package/dist/src/tiles/grid/collection-tile.js +80 -80
  138. package/dist/src/tiles/grid/item-tile.d.ts +27 -27
  139. package/dist/src/tiles/grid/item-tile.js +134 -134
  140. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  141. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  142. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  143. package/dist/src/tiles/grid/tile-stats.js +48 -48
  144. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  145. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  146. package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
  147. package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
  148. package/dist/src/tiles/image-block.d.ts +17 -17
  149. package/dist/src/tiles/image-block.js +72 -72
  150. package/dist/src/tiles/item-image.d.ts +35 -35
  151. package/dist/src/tiles/item-image.js +117 -117
  152. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  153. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  154. package/dist/src/tiles/list/tile-list-compact.d.ts +15 -15
  155. package/dist/src/tiles/list/tile-list-compact.js +114 -114
  156. package/dist/src/tiles/list/tile-list.d.ts +46 -46
  157. package/dist/src/tiles/list/tile-list.js +298 -298
  158. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  159. package/dist/src/tiles/mediatype-icon.js +47 -47
  160. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  161. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  162. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  163. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  164. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  165. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  166. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  167. package/dist/src/tiles/text-snippet-block.js +73 -73
  168. package/dist/src/tiles/tile-dispatcher.d.ts +63 -50
  169. package/dist/src/tiles/tile-dispatcher.js +255 -187
  170. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  171. package/dist/src/tiles/tile-display-value-provider.d.ts +43 -43
  172. package/dist/src/tiles/tile-display-value-provider.js +80 -80
  173. package/dist/src/utils/analytics-events.d.ts +25 -25
  174. package/dist/src/utils/analytics-events.js +27 -27
  175. package/dist/src/utils/array-equals.d.ts +4 -4
  176. package/dist/src/utils/array-equals.js +10 -10
  177. package/dist/src/utils/format-count.d.ts +7 -7
  178. package/dist/src/utils/format-count.js +76 -76
  179. package/dist/src/utils/format-date.d.ts +2 -2
  180. package/dist/src/utils/format-date.js +25 -25
  181. package/dist/src/utils/format-unit-size.d.ts +2 -2
  182. package/dist/src/utils/format-unit-size.js +33 -33
  183. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  184. package/dist/src/utils/local-date-from-utc.js +15 -15
  185. package/dist/src/utils/sha1.d.ts +2 -2
  186. package/dist/src/utils/sha1.js +8 -8
  187. package/dist/test/collection-browser.test.d.ts +1 -1
  188. package/dist/test/collection-browser.test.js +1122 -979
  189. package/dist/test/collection-browser.test.js.map +1 -1
  190. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  191. package/dist/test/collection-facets/facets-template.test.js +134 -134
  192. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  193. package/dist/test/collection-facets/more-facets-content.test.js +133 -133
  194. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  195. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  196. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  197. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  198. package/dist/test/collection-facets.test.d.ts +2 -2
  199. package/dist/test/collection-facets.test.js +682 -682
  200. package/dist/test/empty-placeholder.test.d.ts +1 -1
  201. package/dist/test/empty-placeholder.test.js +63 -63
  202. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  203. package/dist/test/expanded-date-picker.test.js +95 -95
  204. package/dist/test/icon-overlay.test.d.ts +1 -1
  205. package/dist/test/icon-overlay.test.js +24 -24
  206. package/dist/test/image-block.test.d.ts +1 -1
  207. package/dist/test/image-block.test.js +48 -48
  208. package/dist/test/item-image.test.d.ts +1 -1
  209. package/dist/test/item-image.test.js +86 -84
  210. package/dist/test/item-image.test.js.map +1 -1
  211. package/dist/test/manage/manage-bar.test.d.ts +1 -0
  212. package/dist/test/manage/manage-bar.test.js +73 -0
  213. package/dist/test/manage/manage-bar.test.js.map +1 -0
  214. package/dist/test/mediatype-config.test.d.ts +1 -1
  215. package/dist/test/mediatype-config.test.js +16 -16
  216. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  217. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  218. package/dist/test/mocks/mock-collection-name-cache.d.ts +9 -9
  219. package/dist/test/mocks/mock-collection-name-cache.js +17 -17
  220. package/dist/test/mocks/mock-search-responses.d.ts +21 -21
  221. package/dist/test/mocks/mock-search-responses.js +709 -707
  222. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  223. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  224. package/dist/test/mocks/mock-search-service.js +50 -50
  225. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  226. package/dist/test/restoration-state-handler.test.js +270 -270
  227. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  228. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  229. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  230. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  231. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  232. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +378 -378
  233. package/dist/test/text-overlay.test.d.ts +1 -1
  234. package/dist/test/text-overlay.test.js +48 -48
  235. package/dist/test/text-snippet-block.test.d.ts +1 -1
  236. package/dist/test/text-snippet-block.test.js +57 -57
  237. package/dist/test/tile-stats.test.d.ts +1 -1
  238. package/dist/test/tile-stats.test.js +33 -33
  239. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  240. package/dist/test/tiles/grid/account-tile.test.js +76 -76
  241. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  242. package/dist/test/tiles/grid/collection-tile.test.js +73 -73
  243. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  244. package/dist/test/tiles/grid/item-tile.test.js +254 -254
  245. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  246. package/dist/test/tiles/hover/hover-pane-controller.test.js +258 -257
  247. package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -1
  248. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  249. package/dist/test/tiles/hover/tile-hover-pane.test.js +13 -13
  250. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  251. package/dist/test/tiles/list/tile-list-compact.test.js +143 -143
  252. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  253. package/dist/test/tiles/list/tile-list.test.js +242 -242
  254. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  255. package/dist/test/tiles/tile-dispatcher.test.js +107 -67
  256. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
  257. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  258. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  259. package/dist/test/utils/array-equals.test.d.ts +1 -1
  260. package/dist/test/utils/array-equals.test.js +26 -26
  261. package/dist/test/utils/format-count.test.d.ts +1 -1
  262. package/dist/test/utils/format-count.test.js +23 -23
  263. package/dist/test/utils/format-date.test.d.ts +1 -1
  264. package/dist/test/utils/format-date.test.js +17 -17
  265. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  266. package/dist/test/utils/format-unit-size.test.js +17 -17
  267. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  268. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  269. package/local.archive.org.cert +86 -86
  270. package/local.archive.org.key +27 -27
  271. package/package.json +2 -2
  272. package/renovate.json +6 -6
  273. package/src/app-root.ts +29 -0
  274. package/src/collection-browser.ts +197 -23
  275. package/src/collection-facets.ts +13 -1
  276. package/src/manage/manage-bar.ts +151 -0
  277. package/src/models.ts +1 -0
  278. package/src/tiles/tile-dispatcher.ts +71 -5
  279. package/test/collection-browser.test.ts +198 -1
  280. package/test/item-image.test.ts +2 -0
  281. package/test/manage/manage-bar.test.ts +107 -0
  282. package/test/mocks/mock-search-responses.ts +2 -0
  283. package/test/tiles/hover/hover-pane-controller.test.ts +1 -0
  284. package/test/tiles/tile-dispatcher.test.ts +52 -0
  285. package/tsconfig.json +21 -21
  286. package/web-dev-server.config.mjs +30 -30
  287. package/web-test-runner.config.mjs +41 -41
@@ -1211,7 +1211,8 @@ describe('Collection Browser', () => {
1211
1211
  await el.updateComplete;
1212
1212
 
1213
1213
  const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');
1214
- (infiniteScroller as InfiniteScroller).reload = infiniteScrollerRefreshSpy;
1214
+ (infiniteScroller as InfiniteScroller).refreshAllVisibleCells =
1215
+ infiniteScrollerRefreshSpy;
1215
1216
  expect(infiniteScrollerRefreshSpy.called).to.be.false;
1216
1217
  expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);
1217
1218
 
@@ -1462,4 +1463,200 @@ describe('Collection Browser', () => {
1462
1463
  expect(el.minSelectedDate).not.to.exist;
1463
1464
  expect(el.maxSelectedDate).not.to.exist;
1464
1465
  });
1466
+
1467
+ it('shows manage bar interface instead of sort bar when in manage view', async () => {
1468
+ const searchService = new MockSearchService();
1469
+ const el = await fixture<CollectionBrowser>(
1470
+ html`<collection-browser .searchService=${searchService}>
1471
+ </collection-browser>`
1472
+ );
1473
+
1474
+ el.baseQuery = 'foo';
1475
+ await el.updateComplete;
1476
+ await el.initialSearchComplete;
1477
+
1478
+ el.isManageView = true;
1479
+ await el.updateComplete;
1480
+
1481
+ expect(el.shadowRoot?.querySelector('manage-bar')).to.exist;
1482
+ expect(el.shadowRoot?.querySelector('sort-filter-bar')).not.to.exist;
1483
+
1484
+ el.isManageView = false;
1485
+ await el.updateComplete;
1486
+
1487
+ expect(el.shadowRoot?.querySelector('manage-bar')).not.to.exist;
1488
+ expect(el.shadowRoot?.querySelector('sort-filter-bar')).to.exist;
1489
+ });
1490
+
1491
+ it('switches to grid display mode when manage view activated', async () => {
1492
+ const searchService = new MockSearchService();
1493
+ const el = await fixture<CollectionBrowser>(
1494
+ html`<collection-browser
1495
+ .searchService=${searchService}
1496
+ .baseQuery=${'foo'}
1497
+ .displayMode=${'list-detail'}
1498
+ >
1499
+ </collection-browser>`
1500
+ );
1501
+
1502
+ el.isManageView = true;
1503
+ await el.updateComplete;
1504
+
1505
+ expect(el.displayMode).to.equal('grid');
1506
+ });
1507
+
1508
+ it('can remove all checked tiles', async () => {
1509
+ const searchService = new MockSearchService();
1510
+ const el = await fixture<CollectionBrowser>(
1511
+ html`<collection-browser
1512
+ .searchService=${searchService}
1513
+ .baseNavigationUrl=${''}
1514
+ >
1515
+ </collection-browser>`
1516
+ );
1517
+
1518
+ el.baseQuery = 'foo';
1519
+ el.pageSize = 1; // To hit the edge case of a page break while offsetting tiles
1520
+ await el.updateComplete;
1521
+ await el.initialSearchComplete;
1522
+
1523
+ el.isManageView = true;
1524
+ await el.updateComplete;
1525
+
1526
+ const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');
1527
+ expect(infiniteScroller).to.exist;
1528
+
1529
+ let tiles =
1530
+ infiniteScroller!.shadowRoot?.querySelectorAll('tile-dispatcher');
1531
+ expect(tiles).to.exist.and.have.length(2);
1532
+
1533
+ const firstTile = tiles![0] as TileDispatcher;
1534
+ const firstTileLink = firstTile.shadowRoot?.querySelector(
1535
+ 'a[href]'
1536
+ ) as HTMLAnchorElement;
1537
+ expect(firstTile.model?.identifier).to.equal('foo');
1538
+ expect(firstTileLink).to.exist;
1539
+
1540
+ // No effect if no tiles checked
1541
+ el.removeCheckedTiles();
1542
+ await el.updateComplete;
1543
+ tiles = infiniteScroller!.shadowRoot?.querySelectorAll('tile-dispatcher');
1544
+ expect(tiles).to.exist.and.have.length(2);
1545
+
1546
+ // Check the first tile
1547
+ firstTileLink!.click();
1548
+ expect(firstTile.model?.checked).to.be.true;
1549
+
1550
+ // Remove checked tiles and verify that we only kept the second tile
1551
+ el.removeCheckedTiles();
1552
+ await el.updateComplete;
1553
+ tiles = infiniteScroller!.shadowRoot?.querySelectorAll('tile-dispatcher');
1554
+ expect(tiles).to.exist.and.have.length(1);
1555
+ expect((tiles![0] as TileDispatcher).model?.identifier).to.equal('bar');
1556
+ });
1557
+
1558
+ it('can check/uncheck all tiles', async () => {
1559
+ const searchService = new MockSearchService();
1560
+ const el = await fixture<CollectionBrowser>(
1561
+ html`<collection-browser
1562
+ .searchService=${searchService}
1563
+ .baseNavigationUrl=${''}
1564
+ >
1565
+ </collection-browser>`
1566
+ );
1567
+
1568
+ el.baseQuery = 'foo';
1569
+ await el.updateComplete;
1570
+ await el.initialSearchComplete;
1571
+
1572
+ el.isManageView = true;
1573
+ await el.updateComplete;
1574
+
1575
+ expect(el.checkedTileModels.length).to.equal(0);
1576
+ expect(el.uncheckedTileModels.length).to.equal(2);
1577
+
1578
+ el.checkAllTiles();
1579
+ expect(el.checkedTileModels.length).to.equal(2);
1580
+ expect(el.uncheckedTileModels.length).to.equal(0);
1581
+
1582
+ el.uncheckAllTiles();
1583
+ expect(el.checkedTileModels.length).to.equal(0);
1584
+ expect(el.uncheckedTileModels.length).to.equal(2);
1585
+ });
1586
+
1587
+ it('emits event when item removal requested', async () => {
1588
+ const spy = sinon.spy();
1589
+ const searchService = new MockSearchService();
1590
+ const el = await fixture<CollectionBrowser>(
1591
+ html`<collection-browser
1592
+ .searchService=${searchService}
1593
+ .baseNavigationUrl=${''}
1594
+ @itemRemovalRequested=${spy}
1595
+ >
1596
+ </collection-browser>`
1597
+ );
1598
+
1599
+ el.baseQuery = 'foo';
1600
+ await el.updateComplete;
1601
+ await el.initialSearchComplete;
1602
+
1603
+ el.isManageView = true;
1604
+ await el.updateComplete;
1605
+
1606
+ const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');
1607
+ expect(infiniteScroller).to.exist;
1608
+
1609
+ const tiles =
1610
+ infiniteScroller!.shadowRoot?.querySelectorAll('tile-dispatcher');
1611
+ expect(tiles).to.exist.and.have.length(2);
1612
+
1613
+ const firstTile = tiles![0] as TileDispatcher;
1614
+ const firstTileLink = firstTile.shadowRoot?.querySelector(
1615
+ 'a[href]'
1616
+ ) as HTMLAnchorElement;
1617
+ expect(firstTile.model?.identifier).to.equal('foo');
1618
+ expect(firstTileLink).to.exist;
1619
+
1620
+ // Check the first tile
1621
+ firstTileLink!.click();
1622
+ await el.updateComplete;
1623
+
1624
+ const manageBar = el.shadowRoot?.querySelector('manage-bar');
1625
+ expect(manageBar).to.exist;
1626
+
1627
+ // Emit remove event from manage bar
1628
+ manageBar!.dispatchEvent(new CustomEvent('removeItems'));
1629
+
1630
+ await el.updateComplete;
1631
+ expect(spy.callCount).to.equal(1);
1632
+ expect(spy.args[0].length).to.equal(1);
1633
+ expect(spy.args[0][0]?.detail?.items?.[0]?.identifier).to.equal('foo');
1634
+ });
1635
+
1636
+ it('disables manage view when manage bar cancelled', async () => {
1637
+ const searchService = new MockSearchService();
1638
+ const el = await fixture<CollectionBrowser>(
1639
+ html`<collection-browser
1640
+ .searchService=${searchService}
1641
+ .baseNavigationUrl=${''}
1642
+ >
1643
+ </collection-browser>`
1644
+ );
1645
+
1646
+ el.baseQuery = 'foo';
1647
+ await el.updateComplete;
1648
+ await el.initialSearchComplete;
1649
+
1650
+ el.isManageView = true;
1651
+ await el.updateComplete;
1652
+
1653
+ const manageBar = el.shadowRoot?.querySelector('manage-bar');
1654
+ expect(manageBar).to.exist;
1655
+
1656
+ // Emit remove event from manage bar
1657
+ manageBar!.dispatchEvent(new CustomEvent('cancel'));
1658
+
1659
+ await el.updateComplete;
1660
+ expect(el.isManageView).to.be.false;
1661
+ });
1465
1662
  });
@@ -9,6 +9,7 @@ import '../src/tiles/item-image';
9
9
 
10
10
  const baseImageUrl = 'https://archive.org';
11
11
  const testBookModel: TileModel = {
12
+ checked: false,
12
13
  collections: [],
13
14
  commentCount: 0,
14
15
  creators: [],
@@ -26,6 +27,7 @@ const testBookModel: TileModel = {
26
27
  };
27
28
 
28
29
  const testAudioModel: TileModel = {
30
+ checked: false,
29
31
  collections: [],
30
32
  commentCount: 0,
31
33
  creators: [],
@@ -0,0 +1,107 @@
1
+ /* eslint-disable import/no-duplicates */
2
+ import { expect, fixture } from '@open-wc/testing';
3
+ import { html } from 'lit';
4
+ import Sinon from 'sinon';
5
+ import type { ManageBar } from '../../src/manage/manage-bar';
6
+
7
+ import '../../src/manage/manage-bar';
8
+
9
+ describe('Manage bar', () => {
10
+ it('renders basic component', async () => {
11
+ const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);
12
+
13
+ expect(el.shadowRoot?.querySelector('.manage-label')).to.exist;
14
+ expect(el.shadowRoot?.querySelector('.manage-buttons')).to.exist;
15
+ expect(el.shadowRoot?.querySelector('.cancel-btn')).to.exist;
16
+ expect(el.shadowRoot?.querySelector('.remove-btn')).to.exist;
17
+ });
18
+
19
+ it('can set the label', async () => {
20
+ const el = await fixture<ManageBar>(
21
+ html`<manage-bar label="foo bar"></manage-bar>`
22
+ );
23
+ expect(el.shadowRoot?.querySelector('.manage-label')?.textContent).to.equal(
24
+ 'foo bar'
25
+ );
26
+ });
27
+
28
+ it('does not include Select All/Unselect All buttons by default', async () => {
29
+ const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);
30
+ expect(el.shadowRoot?.querySelector('.select-all-btn')).not.to.exist;
31
+ expect(el.shadowRoot?.querySelector('.unselect-all-btn')).not.to.exist;
32
+ });
33
+
34
+ it('includes Select All button when requested', async () => {
35
+ const el = await fixture<ManageBar>(
36
+ html`<manage-bar showSelectAll></manage-bar>`
37
+ );
38
+ expect(el.shadowRoot?.querySelector('.select-all-btn')).to.exist;
39
+ });
40
+
41
+ it('includes Unselect All button when requested', async () => {
42
+ const el = await fixture<ManageBar>(
43
+ html`<manage-bar showUnselectAll></manage-bar>`
44
+ );
45
+ expect(el.shadowRoot?.querySelector('.unselect-all-btn')).to.exist;
46
+ });
47
+
48
+ it('emits event when Cancel button clicked', async () => {
49
+ const spy = Sinon.spy();
50
+ const el = await fixture<ManageBar>(
51
+ html`<manage-bar @cancel=${spy}></manage-bar>`
52
+ );
53
+
54
+ const cancelBtn = el.shadowRoot?.querySelector(
55
+ '.cancel-btn'
56
+ ) as HTMLButtonElement;
57
+ expect(cancelBtn).to.exist;
58
+
59
+ cancelBtn.click();
60
+ expect(spy.callCount).to.equal(1);
61
+ });
62
+
63
+ it('emits event when Remove Items button clicked', async () => {
64
+ const spy = Sinon.spy();
65
+ const el = await fixture<ManageBar>(
66
+ html`<manage-bar @removeItems=${spy}></manage-bar>`
67
+ );
68
+
69
+ const removeItemsBtn = el.shadowRoot?.querySelector(
70
+ '.remove-btn'
71
+ ) as HTMLButtonElement;
72
+ expect(removeItemsBtn).to.exist;
73
+
74
+ removeItemsBtn.click();
75
+ expect(spy.callCount).to.equal(1);
76
+ });
77
+
78
+ it('emits event when Select All button clicked', async () => {
79
+ const spy = Sinon.spy();
80
+ const el = await fixture<ManageBar>(
81
+ html`<manage-bar showSelectAll @selectAll=${spy}></manage-bar>`
82
+ );
83
+
84
+ const selectAllBtn = el.shadowRoot?.querySelector(
85
+ '.select-all-btn'
86
+ ) as HTMLButtonElement;
87
+ expect(selectAllBtn).to.exist;
88
+
89
+ selectAllBtn.click();
90
+ expect(spy.callCount).to.equal(1);
91
+ });
92
+
93
+ it('emits event when Unselect All button clicked', async () => {
94
+ const spy = Sinon.spy();
95
+ const el = await fixture<ManageBar>(
96
+ html`<manage-bar showUnselectAll @unselectAll=${spy}></manage-bar>`
97
+ );
98
+
99
+ const unselectAllBtn = el.shadowRoot?.querySelector(
100
+ '.unselect-all-btn'
101
+ ) as HTMLButtonElement;
102
+ expect(unselectAllBtn).to.exist;
103
+
104
+ unselectAllBtn.click();
105
+ expect(spy.callCount).to.equal(1);
106
+ });
107
+ });
@@ -489,12 +489,14 @@ export const getMockSuccessMultipleResults: () => Result<
489
489
  fields: {
490
490
  identifier: 'foo',
491
491
  collection: ['foo', 'bar'],
492
+ __href__: '/foo',
492
493
  },
493
494
  }),
494
495
  new ItemHit({
495
496
  fields: {
496
497
  identifier: 'bar',
497
498
  collection: ['baz', 'boop'],
499
+ __href__: '/bar',
498
500
  },
499
501
  }),
500
502
  ],
@@ -35,6 +35,7 @@ class HostElement extends LitElement implements HoverPaneProviderInterface {
35
35
  getHoverPaneProps(): HoverPaneProperties {
36
36
  return {
37
37
  model: {
38
+ checked: false,
38
39
  collectionFilesCount: 1,
39
40
  collections: ['foo', 'bar'],
40
41
  collectionSize: 1,
@@ -1,5 +1,6 @@
1
1
  import { aTimeout, expect, fixture } from '@open-wc/testing';
2
2
  import { html } from 'lit';
3
+ import sinon from 'sinon';
3
4
  import type { TileDispatcher } from '../../src/tiles/tile-dispatcher';
4
5
 
5
6
  import '../../src/tiles/tile-dispatcher';
@@ -67,6 +68,57 @@ describe('Tile Dispatcher', () => {
67
68
  expect(compactListTile).to.exist;
68
69
  });
69
70
 
71
+ it('should open item in new tab when right-clicked in manage mode', async () => {
72
+ const oldWindowOpen = window.open;
73
+ const spy = sinon.spy();
74
+ window.open = spy;
75
+
76
+ const el = await fixture<TileDispatcher>(html`
77
+ <tile-dispatcher
78
+ isManageView
79
+ .model=${{ identifier: 'foo', href: '/foo' }}
80
+ .baseNavigationUrl=${''}
81
+ >
82
+ </tile-dispatcher>
83
+ `);
84
+
85
+ const tileLink = el.shadowRoot?.querySelector(
86
+ 'a[href]'
87
+ ) as HTMLAnchorElement;
88
+ expect(tileLink).to.exist;
89
+
90
+ tileLink.dispatchEvent(new Event('contextmenu'));
91
+ await el.updateComplete;
92
+
93
+ expect(spy.callCount).to.equal(1);
94
+ expect(spy.args[0][0]).to.equal('/foo');
95
+ expect(spy.args[0][1]).to.equal('_blank');
96
+
97
+ window.open = oldWindowOpen;
98
+ });
99
+
100
+ it('should toggle model checked state when manage check clicked', async () => {
101
+ const el = await fixture<TileDispatcher>(html`
102
+ <tile-dispatcher
103
+ isManageView
104
+ .model=${{ identifier: 'foo', href: '/foo' }}
105
+ .tileDisplayMode=${'grid'}
106
+ ></tile-dispatcher>
107
+ `);
108
+
109
+ const manageCheck = el.shadowRoot?.querySelector(
110
+ '.manage-check > input[type="checkbox"]'
111
+ ) as HTMLButtonElement;
112
+
113
+ manageCheck.click();
114
+ await el.updateComplete;
115
+ expect(el.model?.checked).to.be.true;
116
+
117
+ manageCheck.click();
118
+ await el.updateComplete;
119
+ expect(el.model?.checked).to.be.false;
120
+ });
121
+
70
122
  it('should return hover pane props', async () => {
71
123
  const el = await fixture<TileDispatcher>(html`
72
124
  <tile-dispatcher .model=${{ identifier: 'foo' }}> </tile-dispatcher>
package/tsconfig.json CHANGED
@@ -1,21 +1,21 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2018",
4
- "module": "esnext",
5
- "moduleResolution": "node",
6
- "noEmitOnError": true,
7
- "lib": ["es2017", "dom"],
8
- "strict": true,
9
- "esModuleInterop": false,
10
- "allowSyntheticDefaultImports": true,
11
- "experimentalDecorators": true,
12
- "importHelpers": true,
13
- "outDir": "dist",
14
- "sourceMap": true,
15
- "inlineSources": true,
16
- "rootDir": "./",
17
- "declaration": true,
18
- "importsNotUsedAsValues": "error"
19
- },
20
- "include": ["src", "test", "index.ts", "types"],
21
- }
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es2018",
4
+ "module": "esnext",
5
+ "moduleResolution": "node",
6
+ "noEmitOnError": true,
7
+ "lib": ["es2017", "dom"],
8
+ "strict": true,
9
+ "esModuleInterop": false,
10
+ "allowSyntheticDefaultImports": true,
11
+ "experimentalDecorators": true,
12
+ "importHelpers": true,
13
+ "outDir": "dist",
14
+ "sourceMap": true,
15
+ "inlineSources": true,
16
+ "rootDir": "./",
17
+ "declaration": true,
18
+ "importsNotUsedAsValues": "error"
19
+ },
20
+ "include": ["src", "test", "index.ts", "types"],
21
+ }
@@ -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
+ });