@internetarchive/collection-browser 3.3.2 → 3.3.4-alpha-webdev7761.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 (543) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +27 -27
  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/.prettierignore +1 -1
  8. package/LICENSE +661 -661
  9. package/README.md +83 -83
  10. package/dist/index.d.ts +16 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/src/app-root.d.ts +105 -0
  13. package/dist/src/app-root.js +1076 -0
  14. package/dist/src/app-root.js.map +1 -0
  15. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -0
  16. package/dist/src/assets/img/icons/arrow-left.js +10 -0
  17. package/dist/src/assets/img/icons/arrow-left.js.map +1 -0
  18. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
  19. package/dist/src/assets/img/icons/arrow-right.js +10 -0
  20. package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
  21. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  22. package/dist/src/assets/img/icons/chevron.js +4 -0
  23. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  24. package/dist/src/assets/img/icons/close-circle-dark.d.ts +2 -0
  25. package/dist/src/assets/img/icons/close-circle-dark.js +5 -0
  26. package/dist/src/assets/img/icons/close-circle-dark.js.map +1 -0
  27. package/dist/src/assets/img/icons/contract.d.ts +2 -0
  28. package/dist/src/assets/img/icons/contract.js +9 -0
  29. package/dist/src/assets/img/icons/contract.js.map +1 -0
  30. package/dist/src/assets/img/icons/empty-query.d.ts +2 -0
  31. package/dist/src/assets/img/icons/empty-query.js +5 -0
  32. package/dist/src/assets/img/icons/empty-query.js.map +1 -0
  33. package/dist/src/assets/img/icons/expand.d.ts +2 -0
  34. package/dist/src/assets/img/icons/expand.js +9 -0
  35. package/dist/src/assets/img/icons/expand.js.map +1 -0
  36. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  37. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  38. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  39. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  40. package/dist/src/assets/img/icons/eye.js +5 -0
  41. package/dist/src/assets/img/icons/eye.js.map +1 -0
  42. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -0
  43. package/dist/src/assets/img/icons/favorite-filled.js +10 -0
  44. package/dist/src/assets/img/icons/favorite-filled.js.map +1 -0
  45. package/dist/src/assets/img/icons/favorite-unfilled.d.ts +1 -0
  46. package/dist/src/assets/img/icons/favorite-unfilled.js +9 -0
  47. package/dist/src/assets/img/icons/favorite-unfilled.js.map +1 -0
  48. package/dist/src/assets/img/icons/filter.d.ts +2 -0
  49. package/dist/src/assets/img/icons/filter.js +10 -0
  50. package/dist/src/assets/img/icons/filter.js.map +1 -0
  51. package/dist/src/assets/img/icons/login-required.d.ts +1 -0
  52. package/dist/src/assets/img/icons/login-required.js +18 -0
  53. package/dist/src/assets/img/icons/login-required.js.map +1 -0
  54. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -0
  55. package/dist/src/assets/img/icons/mediatype/account.js +14 -0
  56. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -0
  57. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -0
  58. package/dist/src/assets/img/icons/mediatype/audio.js +14 -0
  59. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -0
  60. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -0
  61. package/dist/src/assets/img/icons/mediatype/collection.js +12 -0
  62. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -0
  63. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  64. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  65. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  66. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -0
  67. package/dist/src/assets/img/icons/mediatype/etree.js +14 -0
  68. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -0
  69. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -0
  70. package/dist/src/assets/img/icons/mediatype/film.js +14 -0
  71. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -0
  72. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -0
  73. package/dist/src/assets/img/icons/mediatype/images.js +13 -0
  74. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -0
  75. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  76. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  77. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  78. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -0
  79. package/dist/src/assets/img/icons/mediatype/search.js +14 -0
  80. package/dist/src/assets/img/icons/mediatype/search.js.map +1 -0
  81. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -0
  82. package/dist/src/assets/img/icons/mediatype/software.js +13 -0
  83. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -0
  84. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -0
  85. package/dist/src/assets/img/icons/mediatype/texts.js +13 -0
  86. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -0
  87. package/dist/src/assets/img/icons/mediatype/tv-commercial.d.ts +1 -0
  88. package/dist/src/assets/img/icons/mediatype/tv-commercial.js +12 -0
  89. package/dist/src/assets/img/icons/mediatype/tv-commercial.js.map +1 -0
  90. package/dist/src/assets/img/icons/mediatype/tv-fact-check.d.ts +1 -0
  91. package/dist/src/assets/img/icons/mediatype/tv-fact-check.js +12 -0
  92. package/dist/src/assets/img/icons/mediatype/tv-fact-check.js.map +1 -0
  93. package/dist/src/assets/img/icons/mediatype/tv-quote.d.ts +1 -0
  94. package/dist/src/assets/img/icons/mediatype/tv-quote.js +12 -0
  95. package/dist/src/assets/img/icons/mediatype/tv-quote.js.map +1 -0
  96. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -0
  97. package/dist/src/assets/img/icons/mediatype/tv.js +14 -0
  98. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -0
  99. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -0
  100. package/dist/src/assets/img/icons/mediatype/video.js +14 -0
  101. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -0
  102. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -0
  103. package/dist/src/assets/img/icons/mediatype/web.js +13 -0
  104. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -0
  105. package/dist/src/assets/img/icons/null-result.d.ts +2 -0
  106. package/dist/src/assets/img/icons/null-result.js +5 -0
  107. package/dist/src/assets/img/icons/null-result.js.map +1 -0
  108. package/dist/src/assets/img/icons/quote.d.ts +1 -0
  109. package/dist/src/assets/img/icons/quote.js +7 -0
  110. package/dist/src/assets/img/icons/quote.js.map +1 -0
  111. package/dist/src/assets/img/icons/restricted.d.ts +1 -0
  112. package/dist/src/assets/img/icons/restricted.js +13 -0
  113. package/dist/src/assets/img/icons/restricted.js.map +1 -0
  114. package/dist/src/assets/img/icons/reviews.d.ts +1 -0
  115. package/dist/src/assets/img/icons/reviews.js +11 -0
  116. package/dist/src/assets/img/icons/reviews.js.map +1 -0
  117. package/dist/src/assets/img/icons/upload.d.ts +1 -0
  118. package/dist/src/assets/img/icons/upload.js +12 -0
  119. package/dist/src/assets/img/icons/upload.js.map +1 -0
  120. package/dist/src/assets/img/icons/views.d.ts +1 -0
  121. package/dist/src/assets/img/icons/views.js +11 -0
  122. package/dist/src/assets/img/icons/views.js.map +1 -0
  123. package/dist/src/circular-activity-indicator.d.ts +5 -0
  124. package/dist/src/circular-activity-indicator.js +66 -0
  125. package/dist/src/circular-activity-indicator.js.map +1 -0
  126. package/dist/src/collection-browser.d.ts +692 -0
  127. package/dist/src/collection-browser.js +2669 -0
  128. package/dist/src/collection-browser.js.map +1 -0
  129. package/dist/src/collection-facets/facet-row.d.ts +30 -0
  130. package/dist/src/collection-facets/facet-row.js +266 -0
  131. package/dist/src/collection-facets/facet-row.js.map +1 -0
  132. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -0
  133. package/dist/src/collection-facets/facet-tombstone-row.js +43 -0
  134. package/dist/src/collection-facets/facet-tombstone-row.js.map +1 -0
  135. package/dist/src/collection-facets/facets-template.d.ts +13 -0
  136. package/dist/src/collection-facets/facets-template.js +68 -0
  137. package/dist/src/collection-facets/facets-template.js.map +1 -0
  138. package/dist/src/collection-facets/models.d.ts +9 -0
  139. package/dist/src/collection-facets/models.js +10 -0
  140. package/dist/src/collection-facets/models.js.map +1 -0
  141. package/dist/src/collection-facets/more-facets-content.d.ts +109 -0
  142. package/dist/src/collection-facets/more-facets-content.js +547 -0
  143. package/dist/src/collection-facets/more-facets-content.js.map +1 -0
  144. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -0
  145. package/dist/src/collection-facets/more-facets-pagination.js +264 -0
  146. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -0
  147. package/dist/src/collection-facets/smart-facets/dedupe.d.ts +10 -0
  148. package/dist/src/collection-facets/smart-facets/dedupe.js +35 -0
  149. package/dist/src/collection-facets/smart-facets/dedupe.js.map +1 -0
  150. package/dist/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.d.ts +5 -0
  151. package/dist/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.js +24 -0
  152. package/dist/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.js.map +1 -0
  153. package/dist/src/collection-facets/smart-facets/heuristics/index.d.ts +3 -0
  154. package/dist/src/collection-facets/smart-facets/heuristics/index.js +4 -0
  155. package/dist/src/collection-facets/smart-facets/heuristics/index.js.map +1 -0
  156. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.d.ts +4 -0
  157. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.js +14 -0
  158. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.js.map +1 -0
  159. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.d.ts +6 -0
  160. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.js +68 -0
  161. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.js.map +1 -0
  162. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.d.ts +9 -0
  163. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.js +69 -0
  164. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.js.map +1 -0
  165. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.d.ts +21 -0
  166. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js +76 -0
  167. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js.map +1 -0
  168. package/dist/src/collection-facets/smart-facets/models.d.ts +30 -0
  169. package/dist/src/collection-facets/smart-facets/models.js +2 -0
  170. package/dist/src/collection-facets/smart-facets/models.js.map +1 -0
  171. package/dist/src/collection-facets/smart-facets/smart-facet-bar.d.ts +54 -0
  172. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +383 -0
  173. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -0
  174. package/dist/src/collection-facets/smart-facets/smart-facet-button.d.ts +11 -0
  175. package/dist/src/collection-facets/smart-facets/smart-facet-button.js +133 -0
  176. package/dist/src/collection-facets/smart-facets/smart-facet-button.js.map +1 -0
  177. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.d.ts +28 -0
  178. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +172 -0
  179. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -0
  180. package/dist/src/collection-facets/smart-facets/smart-facet-equals.d.ts +2 -0
  181. package/dist/src/collection-facets/smart-facets/smart-facet-equals.js +13 -0
  182. package/dist/src/collection-facets/smart-facets/smart-facet-equals.js.map +1 -0
  183. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.d.ts +5 -0
  184. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js +18 -0
  185. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js.map +1 -0
  186. package/dist/src/collection-facets/toggle-switch.d.ts +41 -0
  187. package/dist/src/collection-facets/toggle-switch.js +174 -0
  188. package/dist/src/collection-facets/toggle-switch.js.map +1 -0
  189. package/dist/src/collection-facets.d.ts +113 -0
  190. package/dist/src/collection-facets.js +884 -0
  191. package/dist/src/collection-facets.js.map +1 -0
  192. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +270 -0
  193. package/dist/src/data-source/collection-browser-data-source-interface.js +2 -0
  194. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -0
  195. package/dist/src/data-source/collection-browser-data-source.d.ts +418 -0
  196. package/dist/src/data-source/collection-browser-data-source.js +1121 -0
  197. package/dist/src/data-source/collection-browser-data-source.js.map +1 -0
  198. package/dist/src/data-source/collection-browser-query-state.d.ts +48 -0
  199. package/dist/src/data-source/collection-browser-query-state.js +2 -0
  200. package/dist/src/data-source/collection-browser-query-state.js.map +1 -0
  201. package/dist/src/data-source/models.d.ts +43 -0
  202. package/dist/src/data-source/models.js +9 -0
  203. package/dist/src/data-source/models.js.map +1 -0
  204. package/dist/src/empty-placeholder.d.ts +23 -0
  205. package/dist/src/empty-placeholder.js +165 -0
  206. package/dist/src/empty-placeholder.js.map +1 -0
  207. package/dist/src/expanded-date-picker.d.ts +50 -0
  208. package/dist/src/expanded-date-picker.js +182 -0
  209. package/dist/src/expanded-date-picker.js.map +1 -0
  210. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  211. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  212. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  213. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  214. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  215. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  216. package/dist/src/manage/manage-bar.d.ts +58 -0
  217. package/dist/src/manage/manage-bar.js +237 -0
  218. package/dist/src/manage/manage-bar.js.map +1 -0
  219. package/dist/src/manage/remove-items-modal-content.d.ts +9 -0
  220. package/dist/src/manage/remove-items-modal-content.js +104 -0
  221. package/dist/src/manage/remove-items-modal-content.js.map +1 -0
  222. package/dist/src/mediatype/mediatype-config.d.ts +11 -0
  223. package/dist/src/mediatype/mediatype-config.js +116 -0
  224. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  225. package/dist/src/models.d.ts +298 -0
  226. package/dist/src/models.js +507 -0
  227. package/dist/src/models.js.map +1 -0
  228. package/dist/src/restoration-state-handler.d.ts +74 -0
  229. package/dist/src/restoration-state-handler.js +397 -0
  230. package/dist/src/restoration-state-handler.js.map +1 -0
  231. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -0
  232. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +60 -0
  233. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js.map +1 -0
  234. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -0
  235. package/dist/src/sort-filter-bar/alpha-bar.js +241 -0
  236. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -0
  237. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  238. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  239. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  240. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  241. package/dist/src/sort-filter-bar/img/list.js +5 -0
  242. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  243. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -0
  244. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +15 -0
  245. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js.map +1 -0
  246. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -0
  247. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +17 -0
  248. package/dist/src/sort-filter-bar/img/sort-toggle-down.js.map +1 -0
  249. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -0
  250. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +17 -0
  251. package/dist/src/sort-filter-bar/img/sort-toggle-up.js.map +1 -0
  252. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  253. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  254. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  255. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  256. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  257. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  258. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +278 -0
  259. package/dist/src/sort-filter-bar/sort-filter-bar.js +1161 -0
  260. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -0
  261. package/dist/src/styles/ia-button.d.ts +2 -0
  262. package/dist/src/styles/ia-button.js +134 -0
  263. package/dist/src/styles/ia-button.js.map +1 -0
  264. package/dist/src/styles/item-image-styles.d.ts +8 -0
  265. package/dist/src/styles/item-image-styles.js +123 -0
  266. package/dist/src/styles/item-image-styles.js.map +1 -0
  267. package/dist/src/styles/sr-only.d.ts +1 -0
  268. package/dist/src/styles/sr-only.js +18 -0
  269. package/dist/src/styles/sr-only.js.map +1 -0
  270. package/dist/src/tiles/base-tile-component.d.ts +27 -0
  271. package/dist/src/tiles/base-tile-component.js +82 -0
  272. package/dist/src/tiles/base-tile-component.js.map +1 -0
  273. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  274. package/dist/src/tiles/collection-browser-loading-tile.js +29 -0
  275. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  276. package/dist/src/tiles/grid/account-tile.d.ts +18 -0
  277. package/dist/src/tiles/grid/account-tile.js +111 -0
  278. package/dist/src/tiles/grid/account-tile.js.map +1 -0
  279. package/dist/src/tiles/grid/collection-tile.d.ts +15 -0
  280. package/dist/src/tiles/grid/collection-tile.js +160 -0
  281. package/dist/src/tiles/grid/collection-tile.js.map +1 -0
  282. package/dist/src/tiles/grid/item-tile.d.ts +41 -0
  283. package/dist/src/tiles/grid/item-tile.js +321 -0
  284. package/dist/src/tiles/grid/item-tile.js.map +1 -0
  285. package/dist/src/tiles/grid/search-tile.d.ts +10 -0
  286. package/dist/src/tiles/grid/search-tile.js +95 -0
  287. package/dist/src/tiles/grid/search-tile.js.map +1 -0
  288. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -0
  289. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +128 -0
  290. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js.map +1 -0
  291. package/dist/src/tiles/grid/tile-stats.d.ts +58 -0
  292. package/dist/src/tiles/grid/tile-stats.js +204 -0
  293. package/dist/src/tiles/grid/tile-stats.js.map +1 -0
  294. package/dist/src/tiles/hover/hover-pane-controller.d.ts +228 -0
  295. package/dist/src/tiles/hover/hover-pane-controller.js +446 -0
  296. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -0
  297. package/dist/src/tiles/hover/tile-hover-pane.d.ts +20 -0
  298. package/dist/src/tiles/hover/tile-hover-pane.js +185 -0
  299. package/dist/src/tiles/hover/tile-hover-pane.js.map +1 -0
  300. package/dist/src/tiles/image-block.d.ts +19 -0
  301. package/dist/src/tiles/image-block.js +175 -0
  302. package/dist/src/tiles/image-block.js.map +1 -0
  303. package/dist/src/tiles/item-image.d.ts +40 -0
  304. package/dist/src/tiles/item-image.js +191 -0
  305. package/dist/src/tiles/item-image.js.map +1 -0
  306. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -0
  307. package/dist/src/tiles/list/tile-list-compact-header.js +85 -0
  308. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  309. package/dist/src/tiles/list/tile-list-compact.d.ts +19 -0
  310. package/dist/src/tiles/list/tile-list-compact.js +223 -0
  311. package/dist/src/tiles/list/tile-list-compact.js.map +1 -0
  312. package/dist/src/tiles/list/tile-list.d.ts +54 -0
  313. package/dist/src/tiles/list/tile-list.js +621 -0
  314. package/dist/src/tiles/list/tile-list.js.map +1 -0
  315. package/dist/src/tiles/models.d.ts +1 -0
  316. package/dist/src/tiles/models.js +2 -0
  317. package/dist/src/tiles/models.js.map +1 -0
  318. package/dist/src/tiles/overlay/icon-overlay.d.ts +8 -0
  319. package/dist/src/tiles/overlay/icon-overlay.js +55 -0
  320. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -0
  321. package/dist/src/tiles/overlay/text-overlay.d.ts +9 -0
  322. package/dist/src/tiles/overlay/text-overlay.js +74 -0
  323. package/dist/src/tiles/overlay/text-overlay.js.map +1 -0
  324. package/dist/src/tiles/review-block.d.ts +12 -0
  325. package/dist/src/tiles/review-block.js +134 -0
  326. package/dist/src/tiles/review-block.js.map +1 -0
  327. package/dist/src/tiles/text-snippet-block.d.ts +27 -0
  328. package/dist/src/tiles/text-snippet-block.js +132 -0
  329. package/dist/src/tiles/text-snippet-block.js.map +1 -0
  330. package/dist/src/tiles/tile-dispatcher.d.ts +71 -0
  331. package/dist/src/tiles/tile-dispatcher.js +472 -0
  332. package/dist/src/tiles/tile-dispatcher.js.map +1 -0
  333. package/dist/src/tiles/tile-display-value-provider.d.ts +47 -0
  334. package/dist/src/tiles/tile-display-value-provider.js +95 -0
  335. package/dist/src/tiles/tile-display-value-provider.js.map +1 -0
  336. package/dist/src/tiles/tile-mediatype-icon.d.ts +27 -0
  337. package/dist/src/tiles/tile-mediatype-icon.js +130 -0
  338. package/dist/src/tiles/tile-mediatype-icon.js.map +1 -0
  339. package/dist/src/utils/analytics-events.d.ts +28 -0
  340. package/dist/src/utils/analytics-events.js +31 -0
  341. package/dist/src/utils/analytics-events.js.map +1 -0
  342. package/dist/src/utils/array-equals.d.ts +4 -0
  343. package/dist/src/utils/array-equals.js +11 -0
  344. package/dist/src/utils/array-equals.js.map +1 -0
  345. package/dist/src/utils/collapse-repeated-quotes.d.ts +11 -0
  346. package/dist/src/utils/collapse-repeated-quotes.js +14 -0
  347. package/dist/src/utils/collapse-repeated-quotes.js.map +1 -0
  348. package/dist/src/utils/facet-utils.d.ts +83 -0
  349. package/dist/src/utils/facet-utils.js +152 -0
  350. package/dist/src/utils/facet-utils.js.map +1 -0
  351. package/dist/src/utils/format-count.d.ts +7 -0
  352. package/dist/src/utils/format-count.js +76 -0
  353. package/dist/src/utils/format-count.js.map +1 -0
  354. package/dist/src/utils/format-date.d.ts +16 -0
  355. package/dist/src/utils/format-date.js +33 -0
  356. package/dist/src/utils/format-date.js.map +1 -0
  357. package/dist/src/utils/format-unit-size.d.ts +2 -0
  358. package/dist/src/utils/format-unit-size.js +34 -0
  359. package/dist/src/utils/format-unit-size.js.map +1 -0
  360. package/dist/src/utils/local-date-from-utc.d.ts +9 -0
  361. package/dist/src/utils/local-date-from-utc.js +16 -0
  362. package/dist/src/utils/local-date-from-utc.js.map +1 -0
  363. package/dist/src/utils/log.d.ts +7 -0
  364. package/dist/src/utils/log.js +14 -0
  365. package/dist/src/utils/log.js.map +1 -0
  366. package/dist/src/utils/resolve-mediatype.d.ts +8 -0
  367. package/dist/src/utils/resolve-mediatype.js +24 -0
  368. package/dist/src/utils/resolve-mediatype.js.map +1 -0
  369. package/dist/src/utils/sha1.d.ts +2 -0
  370. package/dist/src/utils/sha1.js +9 -0
  371. package/dist/src/utils/sha1.js.map +1 -0
  372. package/dist/test/collection-browser.test.d.ts +1 -0
  373. package/dist/test/collection-browser.test.js +1721 -0
  374. package/dist/test/collection-browser.test.js.map +1 -0
  375. package/dist/test/collection-facets/facet-row.test.d.ts +1 -0
  376. package/dist/test/collection-facets/facet-row.test.js +274 -0
  377. package/dist/test/collection-facets/facet-row.test.js.map +1 -0
  378. package/dist/test/collection-facets/facets-template.test.d.ts +1 -0
  379. package/dist/test/collection-facets/facets-template.test.js +101 -0
  380. package/dist/test/collection-facets/facets-template.test.js.map +1 -0
  381. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -0
  382. package/dist/test/collection-facets/more-facets-content.test.js +169 -0
  383. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -0
  384. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -0
  385. package/dist/test/collection-facets/more-facets-pagination.test.js +132 -0
  386. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -0
  387. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -0
  388. package/dist/test/collection-facets/toggle-switch.test.js +96 -0
  389. package/dist/test/collection-facets/toggle-switch.test.js.map +1 -0
  390. package/dist/test/collection-facets.test.d.ts +2 -0
  391. package/dist/test/collection-facets.test.js +745 -0
  392. package/dist/test/collection-facets.test.js.map +1 -0
  393. package/dist/test/data-source/collection-browser-data-source.test.d.ts +1 -0
  394. package/dist/test/data-source/collection-browser-data-source.test.js +102 -0
  395. package/dist/test/data-source/collection-browser-data-source.test.js.map +1 -0
  396. package/dist/test/empty-placeholder.test.d.ts +1 -0
  397. package/dist/test/empty-placeholder.test.js +63 -0
  398. package/dist/test/empty-placeholder.test.js.map +1 -0
  399. package/dist/test/expanded-date-picker.test.d.ts +1 -0
  400. package/dist/test/expanded-date-picker.test.js +130 -0
  401. package/dist/test/expanded-date-picker.test.js.map +1 -0
  402. package/dist/test/icon-overlay.test.d.ts +1 -0
  403. package/dist/test/icon-overlay.test.js +30 -0
  404. package/dist/test/icon-overlay.test.js.map +1 -0
  405. package/dist/test/image-block.test.d.ts +1 -0
  406. package/dist/test/image-block.test.js +218 -0
  407. package/dist/test/image-block.test.js.map +1 -0
  408. package/dist/test/item-image.test.d.ts +1 -0
  409. package/dist/test/item-image.test.js +196 -0
  410. package/dist/test/item-image.test.js.map +1 -0
  411. package/dist/test/manage/manage-bar.test.d.ts +2 -0
  412. package/dist/test/manage/manage-bar.test.js +106 -0
  413. package/dist/test/manage/manage-bar.test.js.map +1 -0
  414. package/dist/test/manage/remove-items-modal-content.test.d.ts +1 -0
  415. package/dist/test/manage/remove-items-modal-content.test.js +65 -0
  416. package/dist/test/manage/remove-items-modal-content.test.js.map +1 -0
  417. package/dist/test/mediatype-config.test.d.ts +1 -0
  418. package/dist/test/mediatype-config.test.js +11 -0
  419. package/dist/test/mediatype-config.test.js.map +1 -0
  420. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -0
  421. package/dist/test/mocks/mock-analytics-handler.js +16 -0
  422. package/dist/test/mocks/mock-analytics-handler.js.map +1 -0
  423. package/dist/test/mocks/mock-search-responses.d.ts +31 -0
  424. package/dist/test/mocks/mock-search-responses.js +1241 -0
  425. package/dist/test/mocks/mock-search-responses.js.map +1 -0
  426. package/dist/test/mocks/mock-search-service.d.ts +16 -0
  427. package/dist/test/mocks/mock-search-service.js +65 -0
  428. package/dist/test/mocks/mock-search-service.js.map +1 -0
  429. package/dist/test/restoration-state-handler.test.d.ts +1 -0
  430. package/dist/test/restoration-state-handler.test.js +343 -0
  431. package/dist/test/restoration-state-handler.test.js.map +1 -0
  432. package/dist/test/review-block.test.d.ts +1 -0
  433. package/dist/test/review-block.test.js +48 -0
  434. package/dist/test/review-block.test.js.map +1 -0
  435. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -0
  436. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +13 -0
  437. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js.map +1 -0
  438. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -0
  439. package/dist/test/sort-filter-bar/alpha-bar.test.js +74 -0
  440. package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -0
  441. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -0
  442. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +609 -0
  443. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -0
  444. package/dist/test/text-overlay.test.d.ts +1 -0
  445. package/dist/test/text-overlay.test.js +42 -0
  446. package/dist/test/text-overlay.test.js.map +1 -0
  447. package/dist/test/text-snippet-block.test.d.ts +1 -0
  448. package/dist/test/text-snippet-block.test.js +63 -0
  449. package/dist/test/text-snippet-block.test.js.map +1 -0
  450. package/dist/test/tile-stats.test.d.ts +1 -0
  451. package/dist/test/tile-stats.test.js +128 -0
  452. package/dist/test/tile-stats.test.js.map +1 -0
  453. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -0
  454. package/dist/test/tiles/grid/account-tile.test.js +96 -0
  455. package/dist/test/tiles/grid/account-tile.test.js.map +1 -0
  456. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -0
  457. package/dist/test/tiles/grid/collection-tile.test.js +96 -0
  458. package/dist/test/tiles/grid/collection-tile.test.js.map +1 -0
  459. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -0
  460. package/dist/test/tiles/grid/item-tile.test.js +427 -0
  461. package/dist/test/tiles/grid/item-tile.test.js.map +1 -0
  462. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -0
  463. package/dist/test/tiles/grid/search-tile.test.js +66 -0
  464. package/dist/test/tiles/grid/search-tile.test.js.map +1 -0
  465. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -0
  466. package/dist/test/tiles/hover/hover-pane-controller.test.js +329 -0
  467. package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -0
  468. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -0
  469. package/dist/test/tiles/hover/tile-hover-pane.test.js +57 -0
  470. package/dist/test/tiles/hover/tile-hover-pane.test.js.map +1 -0
  471. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -0
  472. package/dist/test/tiles/list/tile-list-compact.test.js +251 -0
  473. package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -0
  474. package/dist/test/tiles/list/tile-list.test.d.ts +1 -0
  475. package/dist/test/tiles/list/tile-list.test.js +469 -0
  476. package/dist/test/tiles/list/tile-list.test.js.map +1 -0
  477. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -0
  478. package/dist/test/tiles/tile-dispatcher.test.js +231 -0
  479. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -0
  480. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -0
  481. package/dist/test/tiles/tile-display-value-provider.test.js +142 -0
  482. package/dist/test/tiles/tile-display-value-provider.test.js.map +1 -0
  483. package/dist/test/tiles/tile-mediatype-icon.test.d.ts +1 -0
  484. package/dist/test/tiles/tile-mediatype-icon.test.js +145 -0
  485. package/dist/test/tiles/tile-mediatype-icon.test.js.map +1 -0
  486. package/dist/test/utils/array-equals.test.d.ts +1 -0
  487. package/dist/test/utils/array-equals.test.js +27 -0
  488. package/dist/test/utils/array-equals.test.js.map +1 -0
  489. package/dist/test/utils/format-count.test.d.ts +1 -0
  490. package/dist/test/utils/format-count.test.js +24 -0
  491. package/dist/test/utils/format-count.test.js.map +1 -0
  492. package/dist/test/utils/format-date.test.d.ts +1 -0
  493. package/dist/test/utils/format-date.test.js +61 -0
  494. package/dist/test/utils/format-date.test.js.map +1 -0
  495. package/dist/test/utils/format-unit-size.test.d.ts +1 -0
  496. package/dist/test/utils/format-unit-size.test.js +18 -0
  497. package/dist/test/utils/format-unit-size.test.js.map +1 -0
  498. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -0
  499. package/dist/test/utils/local-date-from-utc.test.js +27 -0
  500. package/dist/test/utils/local-date-from-utc.test.js.map +1 -0
  501. package/eslint.config.mjs +53 -53
  502. package/index.html +24 -24
  503. package/local.archive.org.cert +86 -86
  504. package/local.archive.org.key +27 -27
  505. package/package.json +118 -117
  506. package/renovate.json +6 -6
  507. package/src/collection-browser.ts +2954 -2829
  508. package/src/collection-facets/facet-row.ts +299 -296
  509. package/src/collection-facets/models.ts +10 -10
  510. package/src/collection-facets/more-facets-content.ts +639 -639
  511. package/src/collection-facets.ts +1005 -995
  512. package/src/data-source/collection-browser-data-source-interface.ts +345 -333
  513. package/src/data-source/collection-browser-data-source.ts +1441 -1401
  514. package/src/data-source/collection-browser-query-state.ts +59 -65
  515. package/src/data-source/models.ts +56 -43
  516. package/src/manage/manage-bar.ts +247 -247
  517. package/src/models.ts +866 -870
  518. package/src/restoration-state-handler.ts +542 -544
  519. package/src/tiles/base-tile-component.ts +65 -65
  520. package/src/tiles/grid/account-tile.ts +113 -113
  521. package/src/tiles/grid/collection-tile.ts +163 -163
  522. package/src/tiles/grid/item-tile.ts +340 -340
  523. package/src/tiles/grid/search-tile.ts +90 -90
  524. package/src/tiles/grid/styles/tile-grid-shared-styles.ts +130 -130
  525. package/src/tiles/hover/hover-pane-controller.ts +613 -517
  526. package/src/tiles/hover/tile-hover-pane.ts +184 -180
  527. package/src/tiles/list/tile-list-compact.ts +239 -239
  528. package/src/tiles/list/tile-list.ts +700 -700
  529. package/src/tiles/tile-dispatcher.ts +517 -490
  530. package/src/utils/format-date.ts +62 -62
  531. package/test/collection-browser.test.ts +2413 -2403
  532. package/test/collection-facets/facet-row.test.ts +375 -375
  533. package/test/collection-facets.test.ts +928 -928
  534. package/test/restoration-state-handler.test.ts +480 -510
  535. package/test/tiles/grid/item-tile.test.ts +520 -520
  536. package/test/tiles/hover/hover-pane-controller.test.ts +418 -353
  537. package/test/tiles/list/tile-list-compact.test.ts +282 -282
  538. package/test/tiles/list/tile-list.test.ts +552 -552
  539. package/test/tiles/tile-dispatcher.test.ts +283 -187
  540. package/test/utils/format-date.test.ts +89 -89
  541. package/tsconfig.json +20 -20
  542. package/web-dev-server.config.mjs +30 -30
  543. package/web-test-runner.config.mjs +41 -41
@@ -1,552 +1,552 @@
1
- import { expect, fixture } from '@open-wc/testing';
2
- import { html } from 'lit';
3
- import type { TileList } from '../../../src/tiles/list/tile-list';
4
-
5
- import '../../../src/tiles/list/tile-list';
6
- import type { TileModel } from '../../../src/models';
7
-
8
- describe('List Tile', () => {
9
- it('should render initial component', async () => {
10
- const el = await fixture<TileList>(
11
- html`<tile-list .model=${{}}></tile-list>`,
12
- );
13
-
14
- const listContainer = el.shadowRoot?.querySelector('#list-line');
15
- const itemTitle = el.shadowRoot?.querySelector('#title');
16
- const imageBlock = el.shadowRoot?.querySelector('image-block');
17
-
18
- expect(listContainer).to.exist;
19
- expect(itemTitle).to.exist;
20
- expect(imageBlock).to.exist;
21
- });
22
-
23
- it('should render the mobile template if below mobile breakpoint', async () => {
24
- const el = await fixture<TileList>(html`
25
- <tile-list .mobileBreakpoint=${500} .currentWidth=${400}> </tile-list>
26
- `);
27
-
28
- const listContainer = el.shadowRoot?.getElementById('list-line');
29
- const topLine = el.shadowRoot?.getElementById('list-line-top');
30
- const bottomLine = el.shadowRoot?.getElementById('list-line-bottom');
31
-
32
- expect(listContainer).to.exist;
33
- expect(listContainer?.classList.contains('mobile')).to.be.true;
34
- expect(topLine).to.exist;
35
- expect(bottomLine).to.exist;
36
- });
37
-
38
- it('should render title link with model href if provided', async () => {
39
- const el = await fixture<TileList>(html`
40
- <tile-list
41
- .baseNavigationUrl=${''}
42
- .model=${{ title: 'foo', href: '/foo/bar' }}
43
- ></tile-list>
44
- `);
45
-
46
- const title = el.shadowRoot?.querySelector('#title > a');
47
-
48
- expect(title).to.exist;
49
- expect(title?.getAttribute('href')).to.equal('/foo/bar');
50
- });
51
-
52
- it('should add title to image link if provided', async () => {
53
- const el = await fixture<TileList>(html`
54
- <tile-list
55
- .baseNavigationUrl=${''}
56
- .model=${{ title: 'foo', href: '/foo/bar' }}
57
- ></tile-list>
58
- `);
59
-
60
- const imageLink = el.shadowRoot?.querySelector('#image-link');
61
-
62
- expect(imageLink).to.exist;
63
- expect(imageLink?.getAttribute('title')).to.equal('View foo');
64
- });
65
-
66
- it('should render with creator element but not dates', async () => {
67
- const el = await fixture<TileList>(html`
68
- <tile-list .model=${{ creators: ['someone'] }}></tile-list>
69
- `);
70
-
71
- const creator = el.shadowRoot?.querySelector('#creator');
72
- const datesLine = el.shadowRoot?.querySelector('#dates-line');
73
-
74
- expect(creator).to.exist;
75
- expect(datesLine?.children.length).to.equal(0);
76
- });
77
-
78
- it('should render with snippet block when it has snippets', async () => {
79
- const el = await fixture<TileList>(html`
80
- <tile-list .model=${{ snippets: ['some {{{snippet}}} text'] }}>
81
- </tile-list>
82
- `);
83
-
84
- const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');
85
-
86
- expect(snippetBlock).to.exist;
87
- });
88
-
89
- it('should not render snippet block when no snippets are present', async () => {
90
- const el = await fixture<TileList>(html`<tile-list></tile-list>`);
91
-
92
- const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');
93
-
94
- expect(snippetBlock).to.not.exist;
95
- });
96
-
97
- it('should not render suppressed collections', async () => {
98
- const el = await fixture<TileList>(html`
99
- <tile-list
100
- .model=${{ collections: ['deemphasize', 'community', 'foo'] }}
101
- .baseNavigationUrl=${'base'}
102
- >
103
- </tile-list>
104
- `);
105
-
106
- const collectionsRow = el.shadowRoot?.getElementById('collections');
107
- expect(collectionsRow).to.exist;
108
-
109
- const collectionLinks = collectionsRow?.querySelectorAll('a[href]');
110
- expect(collectionLinks?.length).to.equal(1);
111
- expect(collectionLinks?.item(0).getAttribute('href')).to.equal(
112
- 'base/details/foo',
113
- );
114
- });
115
-
116
- it('should not render fav- collections', async () => {
117
- const el = await fixture<TileList>(html`
118
- <tile-list
119
- .model=${{ collections: ['fav-foo', 'bar'] }}
120
- .baseNavigationUrl=${'base'}
121
- >
122
- </tile-list>
123
- `);
124
-
125
- const collectionsRow = el.shadowRoot?.getElementById('collections');
126
- expect(collectionsRow).to.exist;
127
-
128
- const collectionLinks = collectionsRow?.querySelectorAll('a[href]');
129
- expect(collectionLinks?.length).to.equal(1);
130
- expect(collectionLinks?.item(0).getAttribute('href')).to.equal(
131
- 'base/details/bar',
132
- );
133
- });
134
-
135
- it('should render weekly views when sorting by week', async () => {
136
- const el = await fixture<TileList>(html`
137
- <tile-list
138
- .model=${{ viewCount: 50, weeklyViewCount: 10 }}
139
- .sortParam=${{ field: 'week', direction: 'desc' }}
140
- >
141
- </tile-list>
142
- `);
143
-
144
- const viewsRow = el.shadowRoot?.getElementById('views-line');
145
- expect(viewsRow).to.exist;
146
- expect(viewsRow?.textContent?.trim()).to.equal('Views: 10');
147
- });
148
-
149
- it('should render published date when sorting by it', async () => {
150
- const model: Partial<TileModel> = {
151
- dateAdded: new Date(2010, 0, 2),
152
- dateArchived: new Date(2011, 0, 2),
153
- datePublished: new Date(2012, 0, 2),
154
- dateReviewed: new Date(2013, 0, 2),
155
- };
156
-
157
- const el = await fixture<TileList>(html`
158
- <tile-list
159
- .model=${model}
160
- .sortParam=${{ field: 'date', direction: 'desc' }}
161
- >
162
- </tile-list>
163
- `);
164
-
165
- const dateRow = el.shadowRoot?.getElementById('dates-line');
166
- expect(dateRow).to.exist;
167
- expect(dateRow?.textContent?.trim()).to.contain('Published: Jan 02, 2012');
168
- });
169
-
170
- it('should render added date when sorting by it', async () => {
171
- const model: Partial<TileModel> = {
172
- dateAdded: new Date(2010, 0, 2),
173
- dateArchived: new Date(2011, 0, 2),
174
- datePublished: new Date(2012, 0, 2),
175
- dateReviewed: new Date(2013, 0, 2),
176
- };
177
-
178
- const el = await fixture<TileList>(html`
179
- <tile-list
180
- .model=${model}
181
- .sortParam=${{ field: 'addeddate', direction: 'desc' }}
182
- >
183
- </tile-list>
184
- `);
185
-
186
- const dateRow = el.shadowRoot?.getElementById('dates-line');
187
- expect(dateRow).to.exist;
188
- expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 02, 2010');
189
- });
190
-
191
- it('should render archived date when sorting by it', async () => {
192
- const model: Partial<TileModel> = {
193
- dateAdded: new Date(2010, 0, 2),
194
- dateArchived: new Date(2011, 0, 2),
195
- datePublished: new Date(2012, 0, 2),
196
- dateReviewed: new Date(2013, 0, 2),
197
- };
198
-
199
- const el = await fixture<TileList>(html`
200
- <tile-list
201
- .model=${model}
202
- .sortParam=${{ field: 'publicdate', direction: 'desc' }}
203
- >
204
- </tile-list>
205
- `);
206
-
207
- const dateRow = el.shadowRoot?.getElementById('dates-line');
208
- expect(dateRow).to.exist;
209
- expect(dateRow?.textContent?.trim()).to.contain('Archived: Jan 02, 2011');
210
- });
211
-
212
- it('should render reviewed date when sorting by it', async () => {
213
- const model: Partial<TileModel> = {
214
- dateAdded: new Date(2010, 0, 2),
215
- dateArchived: new Date(2011, 0, 2),
216
- datePublished: new Date(2012, 0, 2),
217
- dateReviewed: new Date(2013, 0, 2),
218
- };
219
-
220
- const el = await fixture<TileList>(html`
221
- <tile-list
222
- .model=${model}
223
- .sortParam=${{ field: 'reviewdate', direction: 'desc' }}
224
- >
225
- </tile-list>
226
- `);
227
-
228
- const dateRow = el.shadowRoot?.getElementById('dates-line');
229
- expect(dateRow).to.exist;
230
- expect(dateRow?.textContent?.trim()).to.contain('Reviewed: Jan 02, 2013');
231
- });
232
-
233
- it('should only show the year for a date published of Jan 1 at midnight UTC', async () => {
234
- const model: Partial<TileModel> = {
235
- datePublished: new Date('2012-01-01T00:00:00Z'),
236
- };
237
-
238
- const el = await fixture<TileList>(html`
239
- <tile-list
240
- .model=${model}
241
- .sortParam=${{ field: 'date', direction: 'desc' }}
242
- >
243
- </tile-list>
244
- `);
245
-
246
- const dateRow = el.shadowRoot?.getElementById('dates-line');
247
- expect(dateRow).to.exist;
248
- expect(dateRow?.textContent?.trim()).to.contain('Published: 2012');
249
- });
250
-
251
- it('should show full date added/archived/reviewed, even on Jan 1 at midnight UTC', async () => {
252
- const model: Partial<TileModel> = {
253
- dateAdded: new Date(2010, 0, 1, 0, 0, 0, 0),
254
- dateArchived: new Date(2011, 0, 1, 0, 0, 0, 0),
255
- datePublished: new Date(2012, 0, 1, 0, 0, 0, 0),
256
- dateReviewed: new Date(2013, 0, 1, 0, 0, 0, 0),
257
- };
258
-
259
- const el = await fixture<TileList>(html`
260
- <tile-list
261
- .model=${model}
262
- .sortParam=${{ field: 'addeddate', direction: 'desc' }}
263
- >
264
- </tile-list>
265
- `);
266
-
267
- let dateRow = el.shadowRoot?.getElementById('dates-line');
268
- expect(dateRow).to.exist;
269
- expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 01, 2010');
270
-
271
- el.sortParam = { field: 'publicdate', direction: 'desc' };
272
- await el.updateComplete;
273
- dateRow = el.shadowRoot?.getElementById('dates-line');
274
- expect(dateRow).to.exist;
275
- expect(dateRow?.textContent?.trim()).to.contain('Archived: Jan 01, 2011');
276
-
277
- el.sortParam = { field: 'reviewdate', direction: 'desc' };
278
- await el.updateComplete;
279
- dateRow = el.shadowRoot?.getElementById('dates-line');
280
- expect(dateRow).to.exist;
281
- expect(dateRow?.textContent?.trim()).to.contain('Reviewed: Jan 01, 2013');
282
- });
283
-
284
- it('should display dates in UTC time zone by default', async () => {
285
- const model: Partial<TileModel> = {
286
- datePublished: new Date('2012-02-15T00:00:00Z'),
287
- };
288
-
289
- const el = await fixture<TileList>(html`
290
- <tile-list
291
- .model=${model}
292
- .sortParam=${{ field: 'date', direction: 'desc' }}
293
- >
294
- </tile-list>
295
- `);
296
-
297
- const dateRow = el.shadowRoot?.getElementById('dates-line');
298
- expect(dateRow).to.exist;
299
- expect(dateRow?.textContent?.trim()).to.contain('Published: Feb 15, 2012');
300
- });
301
-
302
- it('should display dates in local time when useLocalTime option is true', async () => {
303
- // Expected behavior depends on the time zone offset where the testing occurs
304
- const offset = new Date().getTimezoneOffset();
305
- let datePublished, expected;
306
- if (offset > 0) {
307
- // Positive local time zone offsets have earlier local dates than UTC
308
- datePublished = new Date('2012-02-15T00:00:00Z');
309
- expected = 'Published: Feb 14, 2012';
310
- } else if (offset < 0) {
311
- // Negative local time zone offsets have later local dates than UTC
312
- datePublished = new Date('2012-02-15T23:59:59Z');
313
- expected = 'Published: Feb 16, 2012';
314
- } else {
315
- // Local time may just be UTC itself
316
- datePublished = new Date('2012-02-15T00:00:00Z');
317
- expected = 'Published: Feb 15, 2012';
318
- }
319
-
320
- const model: Partial<TileModel> = {
321
- datePublished,
322
- };
323
-
324
- const el = await fixture<TileList>(html`
325
- <tile-list
326
- useLocalTime
327
- .model=${model}
328
- .sortParam=${{ field: 'date', direction: 'desc' }}
329
- >
330
- </tile-list>
331
- `);
332
-
333
- const dateRow = el.shadowRoot?.getElementById('dates-line');
334
- expect(dateRow).to.exist;
335
-
336
- expect(dateRow?.textContent?.trim()).to.contain(expected);
337
- });
338
-
339
- it('should render links to /search pages (not search.php) for subject, creator, and source', async () => {
340
- const model: Partial<TileModel> = {
341
- subjects: ['foo'],
342
- creators: ['bar'],
343
- source: 'baz',
344
- };
345
-
346
- const el = await fixture<TileList>(html`
347
- <tile-list .model=${model}></tile-list>
348
- `);
349
-
350
- const subjectLink = el.shadowRoot?.querySelector('#topics a[href]');
351
- expect(subjectLink).to.exist;
352
- expect(subjectLink?.getAttribute('href')).to.equal(
353
- `/search?query=${encodeURIComponent('subject:"foo"')}`,
354
- );
355
-
356
- const creatorLink = el.shadowRoot?.querySelector('#creator a[href]');
357
- expect(creatorLink).to.exist;
358
- expect(creatorLink?.getAttribute('href')).to.equal(
359
- `/search?query=${encodeURIComponent('creator:"bar"')}`,
360
- );
361
-
362
- const sourceLink = el.shadowRoot?.querySelector('#source a[href]');
363
- expect(sourceLink).to.exist;
364
- expect(sourceLink?.getAttribute('href')).to.equal(
365
- `/search?query=${encodeURIComponent('source:"baz"')}`,
366
- );
367
- });
368
-
369
- it('should render multi-line descriptions with spaces b/w lines', async () => {
370
- const el = await fixture<TileList>(html`
371
- <tile-list .model=${{ description: 'line1\nline2' }}> </tile-list>
372
- `);
373
-
374
- const descriptionBlock = el.shadowRoot?.getElementById('description');
375
- expect(descriptionBlock).to.exist;
376
- expect(descriptionBlock?.textContent?.trim()).to.equal('line1 line2'); // line break replaced by space
377
- });
378
-
379
- it('should render mediatype icon as link to corresponding mediatype collection details', async () => {
380
- const model: Partial<TileModel> = {
381
- mediatype: 'texts',
382
- };
383
-
384
- const el = await fixture<TileList>(html`
385
- <tile-list
386
- .baseNavigationUrl=${'https://archive.org'}
387
- .model=${model}
388
- ></tile-list>
389
- `);
390
-
391
- const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');
392
- expect(mediatypeLink).to.exist;
393
- expect(mediatypeLink?.getAttribute('href')).to.equal(
394
- `https://archive.org/details/texts`,
395
- );
396
- expect(mediatypeLink?.getAttribute('title')).to.equal('See more: texts');
397
- });
398
-
399
- it('should render mediatype icon as link even with empty baseNavigationUrl', async () => {
400
- const model: Partial<TileModel> = {
401
- mediatype: 'texts',
402
- };
403
-
404
- const el = await fixture<TileList>(html`
405
- <tile-list .baseNavigationUrl=${''} .model=${model}></tile-list>
406
- `);
407
-
408
- const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');
409
- expect(mediatypeLink).to.exist;
410
- expect(mediatypeLink?.getAttribute('href')).to.equal(`/details/texts`);
411
- });
412
-
413
- it('should render collection mediatype icon as link to search page', async () => {
414
- const model: Partial<TileModel> = {
415
- mediatype: 'collection',
416
- };
417
-
418
- const el = await fixture<TileList>(html`
419
- <tile-list
420
- .baseNavigationUrl=${'https://archive.org'}
421
- .model=${model}
422
- ></tile-list>
423
- `);
424
-
425
- const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');
426
- expect(mediatypeLink).to.exist;
427
- expect(mediatypeLink?.getAttribute('href')).to.equal(
428
- `https://archive.org/search?query=mediatype:collection&sort=-downloads`,
429
- );
430
- });
431
-
432
- it('should not render account mediatype icon as link', async () => {
433
- const model: Partial<TileModel> = {
434
- mediatype: 'account',
435
- };
436
-
437
- const el = await fixture<TileList>(html`
438
- <tile-list
439
- .baseNavigationUrl=${'https://archive.org'}
440
- .model=${model}
441
- ></tile-list>
442
- `);
443
-
444
- const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');
445
- expect(mediatypeLink).to.exist;
446
- expect(mediatypeLink?.getAttribute('href')).not.to.exist;
447
- });
448
-
449
- it('should render date added for accounts', async () => {
450
- const el = await fixture<TileList>(html`
451
- <tile-list
452
- .model=${{
453
- mediatype: 'account',
454
- dateAdded: new Date('2015-05-05T00:00:00'),
455
- }}
456
- >
457
- </tile-list>
458
- `);
459
-
460
- const creatorBlock = el.shadowRoot?.getElementById('creator');
461
- expect(creatorBlock).to.exist;
462
- expect(creatorBlock?.textContent?.trim()).to.equal('Archivist since 2015');
463
- });
464
-
465
- it('should render web capture date links if present', async () => {
466
- const captureDates = [
467
- new Date('2010-01-02T12:34:56Z'),
468
- new Date('2011-02-03T12:43:21Z'),
469
- ];
470
-
471
- const el = await fixture<TileList>(html`
472
- <tile-list
473
- .model=${{
474
- identifier: 'foo',
475
- title: 'https://example.com/',
476
- captureDates,
477
- }}
478
- ></tile-list>
479
- `);
480
-
481
- const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');
482
- expect(captureDatesUl, 'capture dates container').to.exist;
483
- expect(captureDatesUl?.children.length).to.equal(2);
484
-
485
- const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');
486
- expect(firstDateLink, 'first date link').to.exist;
487
- expect(firstDateLink?.getAttribute('href')).to.equal(
488
- 'https://web.archive.org/web/20100102123456/https%3A%2F%2Fexample.com%2F',
489
- );
490
- expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');
491
-
492
- const secondDateLink =
493
- captureDatesUl?.children[1]?.querySelector('a[href]');
494
- expect(secondDateLink, 'second date link').to.exist;
495
- expect(secondDateLink?.getAttribute('href')).to.equal(
496
- 'https://web.archive.org/web/20110203124321/https%3A%2F%2Fexample.com%2F',
497
- );
498
- expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');
499
- });
500
-
501
- it('should not render web captures if no title is present', async () => {
502
- const captureDates = [
503
- new Date('2010-01-02T12:34:56Z'),
504
- new Date('2011-02-03T12:43:21Z'),
505
- ];
506
-
507
- const el = await fixture<TileList>(html`
508
- <tile-list
509
- .model=${{
510
- identifier: 'foo',
511
- captureDates,
512
- }}
513
- ></tile-list>
514
- `);
515
-
516
- const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');
517
- expect(captureDatesUl).not.to.exist;
518
- });
519
-
520
- it('should render review snippet if present', async () => {
521
- const review = {
522
- title: 'Foo',
523
- body: 'foo bar baz',
524
- stars: 3,
525
- };
526
-
527
- const el = await fixture<TileList>(html`
528
- <tile-list
529
- .model=${{
530
- identifier: 'foo',
531
- review,
532
- }}
533
- ></tile-list>
534
- `);
535
-
536
- const reviewBlock = el.shadowRoot?.querySelector('review-block');
537
- expect(reviewBlock).to.exist;
538
- });
539
-
540
- it('should not render review snippet block when no review is present', async () => {
541
- const el = await fixture<TileList>(html`
542
- <tile-list
543
- .model=${{
544
- identifier: 'foo',
545
- }}
546
- ></tile-list>
547
- `);
548
-
549
- const reviewBlock = el.shadowRoot?.querySelector('review-block');
550
- expect(reviewBlock).not.to.exist;
551
- });
552
- });
1
+ import { expect, fixture } from '@open-wc/testing';
2
+ import { html } from 'lit';
3
+ import type { TileList } from '../../../src/tiles/list/tile-list';
4
+
5
+ import '../../../src/tiles/list/tile-list';
6
+ import type { TileModel } from '../../../src/models';
7
+
8
+ describe('List Tile', () => {
9
+ it('should render initial component', async () => {
10
+ const el = await fixture<TileList>(
11
+ html`<tile-list .model=${{}}></tile-list>`,
12
+ );
13
+
14
+ const listContainer = el.shadowRoot?.querySelector('#list-line');
15
+ const itemTitle = el.shadowRoot?.querySelector('#title');
16
+ const imageBlock = el.shadowRoot?.querySelector('image-block');
17
+
18
+ expect(listContainer).to.exist;
19
+ expect(itemTitle).to.exist;
20
+ expect(imageBlock).to.exist;
21
+ });
22
+
23
+ it('should render the mobile template if below mobile breakpoint', async () => {
24
+ const el = await fixture<TileList>(html`
25
+ <tile-list .mobileBreakpoint=${500} .currentWidth=${400}> </tile-list>
26
+ `);
27
+
28
+ const listContainer = el.shadowRoot?.getElementById('list-line');
29
+ const topLine = el.shadowRoot?.getElementById('list-line-top');
30
+ const bottomLine = el.shadowRoot?.getElementById('list-line-bottom');
31
+
32
+ expect(listContainer).to.exist;
33
+ expect(listContainer?.classList.contains('mobile')).to.be.true;
34
+ expect(topLine).to.exist;
35
+ expect(bottomLine).to.exist;
36
+ });
37
+
38
+ it('should render title link with model href if provided', async () => {
39
+ const el = await fixture<TileList>(html`
40
+ <tile-list
41
+ .baseNavigationUrl=${''}
42
+ .model=${{ title: 'foo', href: '/foo/bar' }}
43
+ ></tile-list>
44
+ `);
45
+
46
+ const title = el.shadowRoot?.querySelector('#title > a');
47
+
48
+ expect(title).to.exist;
49
+ expect(title?.getAttribute('href')).to.equal('/foo/bar');
50
+ });
51
+
52
+ it('should add title to image link if provided', async () => {
53
+ const el = await fixture<TileList>(html`
54
+ <tile-list
55
+ .baseNavigationUrl=${''}
56
+ .model=${{ title: 'foo', href: '/foo/bar' }}
57
+ ></tile-list>
58
+ `);
59
+
60
+ const imageLink = el.shadowRoot?.querySelector('#image-link');
61
+
62
+ expect(imageLink).to.exist;
63
+ expect(imageLink?.getAttribute('title')).to.equal('View foo');
64
+ });
65
+
66
+ it('should render with creator element but not dates', async () => {
67
+ const el = await fixture<TileList>(html`
68
+ <tile-list .model=${{ creators: ['someone'] }}></tile-list>
69
+ `);
70
+
71
+ const creator = el.shadowRoot?.querySelector('#creator');
72
+ const datesLine = el.shadowRoot?.querySelector('#dates-line');
73
+
74
+ expect(creator).to.exist;
75
+ expect(datesLine?.children.length).to.equal(0);
76
+ });
77
+
78
+ it('should render with snippet block when it has snippets', async () => {
79
+ const el = await fixture<TileList>(html`
80
+ <tile-list .model=${{ snippets: ['some {{{snippet}}} text'] }}>
81
+ </tile-list>
82
+ `);
83
+
84
+ const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');
85
+
86
+ expect(snippetBlock).to.exist;
87
+ });
88
+
89
+ it('should not render snippet block when no snippets are present', async () => {
90
+ const el = await fixture<TileList>(html`<tile-list></tile-list>`);
91
+
92
+ const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');
93
+
94
+ expect(snippetBlock).to.not.exist;
95
+ });
96
+
97
+ it('should not render suppressed collections', async () => {
98
+ const el = await fixture<TileList>(html`
99
+ <tile-list
100
+ .model=${{ collections: ['deemphasize', 'community', 'foo'] }}
101
+ .baseNavigationUrl=${'base'}
102
+ >
103
+ </tile-list>
104
+ `);
105
+
106
+ const collectionsRow = el.shadowRoot?.getElementById('collections');
107
+ expect(collectionsRow).to.exist;
108
+
109
+ const collectionLinks = collectionsRow?.querySelectorAll('a[href]');
110
+ expect(collectionLinks?.length).to.equal(1);
111
+ expect(collectionLinks?.item(0).getAttribute('href')).to.equal(
112
+ 'base/details/foo',
113
+ );
114
+ });
115
+
116
+ it('should not render fav- collections', async () => {
117
+ const el = await fixture<TileList>(html`
118
+ <tile-list
119
+ .model=${{ collections: ['fav-foo', 'bar'] }}
120
+ .baseNavigationUrl=${'base'}
121
+ >
122
+ </tile-list>
123
+ `);
124
+
125
+ const collectionsRow = el.shadowRoot?.getElementById('collections');
126
+ expect(collectionsRow).to.exist;
127
+
128
+ const collectionLinks = collectionsRow?.querySelectorAll('a[href]');
129
+ expect(collectionLinks?.length).to.equal(1);
130
+ expect(collectionLinks?.item(0).getAttribute('href')).to.equal(
131
+ 'base/details/bar',
132
+ );
133
+ });
134
+
135
+ it('should render weekly views when sorting by week', async () => {
136
+ const el = await fixture<TileList>(html`
137
+ <tile-list
138
+ .model=${{ viewCount: 50, weeklyViewCount: 10 }}
139
+ .sortParam=${{ field: 'week', direction: 'desc' }}
140
+ >
141
+ </tile-list>
142
+ `);
143
+
144
+ const viewsRow = el.shadowRoot?.getElementById('views-line');
145
+ expect(viewsRow).to.exist;
146
+ expect(viewsRow?.textContent?.trim()).to.equal('Views: 10');
147
+ });
148
+
149
+ it('should render published date when sorting by it', async () => {
150
+ const model: Partial<TileModel> = {
151
+ dateAdded: new Date(2010, 0, 2),
152
+ dateArchived: new Date(2011, 0, 2),
153
+ datePublished: new Date(2012, 0, 2),
154
+ dateReviewed: new Date(2013, 0, 2),
155
+ };
156
+
157
+ const el = await fixture<TileList>(html`
158
+ <tile-list
159
+ .model=${model}
160
+ .sortParam=${{ field: 'date', direction: 'desc' }}
161
+ >
162
+ </tile-list>
163
+ `);
164
+
165
+ const dateRow = el.shadowRoot?.getElementById('dates-line');
166
+ expect(dateRow).to.exist;
167
+ expect(dateRow?.textContent?.trim()).to.contain('Published: Jan 02, 2012');
168
+ });
169
+
170
+ it('should render added date when sorting by it', async () => {
171
+ const model: Partial<TileModel> = {
172
+ dateAdded: new Date(2010, 0, 2),
173
+ dateArchived: new Date(2011, 0, 2),
174
+ datePublished: new Date(2012, 0, 2),
175
+ dateReviewed: new Date(2013, 0, 2),
176
+ };
177
+
178
+ const el = await fixture<TileList>(html`
179
+ <tile-list
180
+ .model=${model}
181
+ .sortParam=${{ field: 'addeddate', direction: 'desc' }}
182
+ >
183
+ </tile-list>
184
+ `);
185
+
186
+ const dateRow = el.shadowRoot?.getElementById('dates-line');
187
+ expect(dateRow).to.exist;
188
+ expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 02, 2010');
189
+ });
190
+
191
+ it('should render archived date when sorting by it', async () => {
192
+ const model: Partial<TileModel> = {
193
+ dateAdded: new Date(2010, 0, 2),
194
+ dateArchived: new Date(2011, 0, 2),
195
+ datePublished: new Date(2012, 0, 2),
196
+ dateReviewed: new Date(2013, 0, 2),
197
+ };
198
+
199
+ const el = await fixture<TileList>(html`
200
+ <tile-list
201
+ .model=${model}
202
+ .sortParam=${{ field: 'publicdate', direction: 'desc' }}
203
+ >
204
+ </tile-list>
205
+ `);
206
+
207
+ const dateRow = el.shadowRoot?.getElementById('dates-line');
208
+ expect(dateRow).to.exist;
209
+ expect(dateRow?.textContent?.trim()).to.contain('Archived: Jan 02, 2011');
210
+ });
211
+
212
+ it('should render reviewed date when sorting by it', async () => {
213
+ const model: Partial<TileModel> = {
214
+ dateAdded: new Date(2010, 0, 2),
215
+ dateArchived: new Date(2011, 0, 2),
216
+ datePublished: new Date(2012, 0, 2),
217
+ dateReviewed: new Date(2013, 0, 2),
218
+ };
219
+
220
+ const el = await fixture<TileList>(html`
221
+ <tile-list
222
+ .model=${model}
223
+ .sortParam=${{ field: 'reviewdate', direction: 'desc' }}
224
+ >
225
+ </tile-list>
226
+ `);
227
+
228
+ const dateRow = el.shadowRoot?.getElementById('dates-line');
229
+ expect(dateRow).to.exist;
230
+ expect(dateRow?.textContent?.trim()).to.contain('Reviewed: Jan 02, 2013');
231
+ });
232
+
233
+ it('should only show the year for a date published of Jan 1 at midnight UTC', async () => {
234
+ const model: Partial<TileModel> = {
235
+ datePublished: new Date('2012-01-01T00:00:00Z'),
236
+ };
237
+
238
+ const el = await fixture<TileList>(html`
239
+ <tile-list
240
+ .model=${model}
241
+ .sortParam=${{ field: 'date', direction: 'desc' }}
242
+ >
243
+ </tile-list>
244
+ `);
245
+
246
+ const dateRow = el.shadowRoot?.getElementById('dates-line');
247
+ expect(dateRow).to.exist;
248
+ expect(dateRow?.textContent?.trim()).to.contain('Published: 2012');
249
+ });
250
+
251
+ it('should show full date added/archived/reviewed, even on Jan 1 at midnight UTC', async () => {
252
+ const model: Partial<TileModel> = {
253
+ dateAdded: new Date(2010, 0, 1, 0, 0, 0, 0),
254
+ dateArchived: new Date(2011, 0, 1, 0, 0, 0, 0),
255
+ datePublished: new Date(2012, 0, 1, 0, 0, 0, 0),
256
+ dateReviewed: new Date(2013, 0, 1, 0, 0, 0, 0),
257
+ };
258
+
259
+ const el = await fixture<TileList>(html`
260
+ <tile-list
261
+ .model=${model}
262
+ .sortParam=${{ field: 'addeddate', direction: 'desc' }}
263
+ >
264
+ </tile-list>
265
+ `);
266
+
267
+ let dateRow = el.shadowRoot?.getElementById('dates-line');
268
+ expect(dateRow).to.exist;
269
+ expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 01, 2010');
270
+
271
+ el.sortParam = { field: 'publicdate', direction: 'desc' };
272
+ await el.updateComplete;
273
+ dateRow = el.shadowRoot?.getElementById('dates-line');
274
+ expect(dateRow).to.exist;
275
+ expect(dateRow?.textContent?.trim()).to.contain('Archived: Jan 01, 2011');
276
+
277
+ el.sortParam = { field: 'reviewdate', direction: 'desc' };
278
+ await el.updateComplete;
279
+ dateRow = el.shadowRoot?.getElementById('dates-line');
280
+ expect(dateRow).to.exist;
281
+ expect(dateRow?.textContent?.trim()).to.contain('Reviewed: Jan 01, 2013');
282
+ });
283
+
284
+ it('should display dates in UTC time zone by default', async () => {
285
+ const model: Partial<TileModel> = {
286
+ datePublished: new Date('2012-02-15T00:00:00Z'),
287
+ };
288
+
289
+ const el = await fixture<TileList>(html`
290
+ <tile-list
291
+ .model=${model}
292
+ .sortParam=${{ field: 'date', direction: 'desc' }}
293
+ >
294
+ </tile-list>
295
+ `);
296
+
297
+ const dateRow = el.shadowRoot?.getElementById('dates-line');
298
+ expect(dateRow).to.exist;
299
+ expect(dateRow?.textContent?.trim()).to.contain('Published: Feb 15, 2012');
300
+ });
301
+
302
+ it('should display dates in local time when useLocalTime option is true', async () => {
303
+ // Expected behavior depends on the time zone offset where the testing occurs
304
+ const offset = new Date().getTimezoneOffset();
305
+ let datePublished, expected;
306
+ if (offset > 0) {
307
+ // Positive local time zone offsets have earlier local dates than UTC
308
+ datePublished = new Date('2012-02-15T00:00:00Z');
309
+ expected = 'Published: Feb 14, 2012';
310
+ } else if (offset < 0) {
311
+ // Negative local time zone offsets have later local dates than UTC
312
+ datePublished = new Date('2012-02-15T23:59:59Z');
313
+ expected = 'Published: Feb 16, 2012';
314
+ } else {
315
+ // Local time may just be UTC itself
316
+ datePublished = new Date('2012-02-15T00:00:00Z');
317
+ expected = 'Published: Feb 15, 2012';
318
+ }
319
+
320
+ const model: Partial<TileModel> = {
321
+ datePublished,
322
+ };
323
+
324
+ const el = await fixture<TileList>(html`
325
+ <tile-list
326
+ useLocalTime
327
+ .model=${model}
328
+ .sortParam=${{ field: 'date', direction: 'desc' }}
329
+ >
330
+ </tile-list>
331
+ `);
332
+
333
+ const dateRow = el.shadowRoot?.getElementById('dates-line');
334
+ expect(dateRow).to.exist;
335
+
336
+ expect(dateRow?.textContent?.trim()).to.contain(expected);
337
+ });
338
+
339
+ it('should render links to /search pages (not search.php) for subject, creator, and source', async () => {
340
+ const model: Partial<TileModel> = {
341
+ subjects: ['foo'],
342
+ creators: ['bar'],
343
+ source: 'baz',
344
+ };
345
+
346
+ const el = await fixture<TileList>(html`
347
+ <tile-list .model=${model}></tile-list>
348
+ `);
349
+
350
+ const subjectLink = el.shadowRoot?.querySelector('#topics a[href]');
351
+ expect(subjectLink).to.exist;
352
+ expect(subjectLink?.getAttribute('href')).to.equal(
353
+ `/search?query=${encodeURIComponent('subject:"foo"')}`,
354
+ );
355
+
356
+ const creatorLink = el.shadowRoot?.querySelector('#creator a[href]');
357
+ expect(creatorLink).to.exist;
358
+ expect(creatorLink?.getAttribute('href')).to.equal(
359
+ `/search?query=${encodeURIComponent('creator:"bar"')}`,
360
+ );
361
+
362
+ const sourceLink = el.shadowRoot?.querySelector('#source a[href]');
363
+ expect(sourceLink).to.exist;
364
+ expect(sourceLink?.getAttribute('href')).to.equal(
365
+ `/search?query=${encodeURIComponent('source:"baz"')}`,
366
+ );
367
+ });
368
+
369
+ it('should render multi-line descriptions with spaces b/w lines', async () => {
370
+ const el = await fixture<TileList>(html`
371
+ <tile-list .model=${{ description: 'line1\nline2' }}> </tile-list>
372
+ `);
373
+
374
+ const descriptionBlock = el.shadowRoot?.getElementById('description');
375
+ expect(descriptionBlock).to.exist;
376
+ expect(descriptionBlock?.textContent?.trim()).to.equal('line1 line2'); // line break replaced by space
377
+ });
378
+
379
+ it('should render mediatype icon as link to corresponding mediatype collection details', async () => {
380
+ const model: Partial<TileModel> = {
381
+ mediatype: 'texts',
382
+ };
383
+
384
+ const el = await fixture<TileList>(html`
385
+ <tile-list
386
+ .baseNavigationUrl=${'https://archive.org'}
387
+ .model=${model}
388
+ ></tile-list>
389
+ `);
390
+
391
+ const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');
392
+ expect(mediatypeLink).to.exist;
393
+ expect(mediatypeLink?.getAttribute('href')).to.equal(
394
+ `https://archive.org/details/texts`,
395
+ );
396
+ expect(mediatypeLink?.getAttribute('title')).to.equal('See more: texts');
397
+ });
398
+
399
+ it('should render mediatype icon as link even with empty baseNavigationUrl', async () => {
400
+ const model: Partial<TileModel> = {
401
+ mediatype: 'texts',
402
+ };
403
+
404
+ const el = await fixture<TileList>(html`
405
+ <tile-list .baseNavigationUrl=${''} .model=${model}></tile-list>
406
+ `);
407
+
408
+ const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');
409
+ expect(mediatypeLink).to.exist;
410
+ expect(mediatypeLink?.getAttribute('href')).to.equal(`/details/texts`);
411
+ });
412
+
413
+ it('should render collection mediatype icon as link to search page', async () => {
414
+ const model: Partial<TileModel> = {
415
+ mediatype: 'collection',
416
+ };
417
+
418
+ const el = await fixture<TileList>(html`
419
+ <tile-list
420
+ .baseNavigationUrl=${'https://archive.org'}
421
+ .model=${model}
422
+ ></tile-list>
423
+ `);
424
+
425
+ const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');
426
+ expect(mediatypeLink).to.exist;
427
+ expect(mediatypeLink?.getAttribute('href')).to.equal(
428
+ `https://archive.org/search?query=mediatype:collection&sort=-downloads`,
429
+ );
430
+ });
431
+
432
+ it('should not render account mediatype icon as link', async () => {
433
+ const model: Partial<TileModel> = {
434
+ mediatype: 'account',
435
+ };
436
+
437
+ const el = await fixture<TileList>(html`
438
+ <tile-list
439
+ .baseNavigationUrl=${'https://archive.org'}
440
+ .model=${model}
441
+ ></tile-list>
442
+ `);
443
+
444
+ const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');
445
+ expect(mediatypeLink).to.exist;
446
+ expect(mediatypeLink?.getAttribute('href')).not.to.exist;
447
+ });
448
+
449
+ it('should render date added for accounts', async () => {
450
+ const el = await fixture<TileList>(html`
451
+ <tile-list
452
+ .model=${{
453
+ mediatype: 'account',
454
+ dateAdded: new Date('2015-05-05T00:00:00'),
455
+ }}
456
+ >
457
+ </tile-list>
458
+ `);
459
+
460
+ const creatorBlock = el.shadowRoot?.getElementById('creator');
461
+ expect(creatorBlock).to.exist;
462
+ expect(creatorBlock?.textContent?.trim()).to.equal('Archivist since 2015');
463
+ });
464
+
465
+ it('should render web capture date links if present', async () => {
466
+ const captureDates = [
467
+ new Date('2010-01-02T12:34:56Z'),
468
+ new Date('2011-02-03T12:43:21Z'),
469
+ ];
470
+
471
+ const el = await fixture<TileList>(html`
472
+ <tile-list
473
+ .model=${{
474
+ identifier: 'foo',
475
+ title: 'https://example.com/',
476
+ captureDates,
477
+ }}
478
+ ></tile-list>
479
+ `);
480
+
481
+ const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');
482
+ expect(captureDatesUl, 'capture dates container').to.exist;
483
+ expect(captureDatesUl?.children.length).to.equal(2);
484
+
485
+ const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');
486
+ expect(firstDateLink, 'first date link').to.exist;
487
+ expect(firstDateLink?.getAttribute('href')).to.equal(
488
+ 'https://web.archive.org/web/20100102123456/https%3A%2F%2Fexample.com%2F',
489
+ );
490
+ expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');
491
+
492
+ const secondDateLink =
493
+ captureDatesUl?.children[1]?.querySelector('a[href]');
494
+ expect(secondDateLink, 'second date link').to.exist;
495
+ expect(secondDateLink?.getAttribute('href')).to.equal(
496
+ 'https://web.archive.org/web/20110203124321/https%3A%2F%2Fexample.com%2F',
497
+ );
498
+ expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');
499
+ });
500
+
501
+ it('should not render web captures if no title is present', async () => {
502
+ const captureDates = [
503
+ new Date('2010-01-02T12:34:56Z'),
504
+ new Date('2011-02-03T12:43:21Z'),
505
+ ];
506
+
507
+ const el = await fixture<TileList>(html`
508
+ <tile-list
509
+ .model=${{
510
+ identifier: 'foo',
511
+ captureDates,
512
+ }}
513
+ ></tile-list>
514
+ `);
515
+
516
+ const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');
517
+ expect(captureDatesUl).not.to.exist;
518
+ });
519
+
520
+ it('should render review snippet if present', async () => {
521
+ const review = {
522
+ title: 'Foo',
523
+ body: 'foo bar baz',
524
+ stars: 3,
525
+ };
526
+
527
+ const el = await fixture<TileList>(html`
528
+ <tile-list
529
+ .model=${{
530
+ identifier: 'foo',
531
+ review,
532
+ }}
533
+ ></tile-list>
534
+ `);
535
+
536
+ const reviewBlock = el.shadowRoot?.querySelector('review-block');
537
+ expect(reviewBlock).to.exist;
538
+ });
539
+
540
+ it('should not render review snippet block when no review is present', async () => {
541
+ const el = await fixture<TileList>(html`
542
+ <tile-list
543
+ .model=${{
544
+ identifier: 'foo',
545
+ }}
546
+ ></tile-list>
547
+ `);
548
+
549
+ const reviewBlock = el.shadowRoot?.querySelector('review-block');
550
+ expect(reviewBlock).not.to.exist;
551
+ });
552
+ });