@internetarchive/collection-browser 3.3.2 → 3.3.3

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 (532) 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 +684 -0
  127. package/dist/src/collection-browser.js +2567 -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 +265 -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 +872 -0
  191. package/dist/src/collection-facets.js.map +1 -0
  192. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +261 -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 +400 -0
  196. package/dist/src/data-source/collection-browser-data-source.js +1103 -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 +49 -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 +32 -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 +302 -0
  226. package/dist/src/models.js +511 -0
  227. package/dist/src/models.js.map +1 -0
  228. package/dist/src/restoration-state-handler.d.ts +75 -0
  229. package/dist/src/restoration-state-handler.js +403 -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 +1711 -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 +375 -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 +2829 -2829
  508. package/src/collection-facets/more-facets-content.ts +639 -639
  509. package/src/collection-facets.ts +994 -995
  510. package/src/data-source/collection-browser-data-source.ts +1401 -1401
  511. package/src/data-source/collection-browser-query-state.ts +65 -65
  512. package/src/data-source/models.ts +43 -43
  513. package/src/tiles/base-tile-component.ts +65 -65
  514. package/src/tiles/grid/account-tile.ts +113 -113
  515. package/src/tiles/grid/collection-tile.ts +163 -163
  516. package/src/tiles/grid/item-tile.ts +340 -340
  517. package/src/tiles/hover/hover-pane-controller.ts +613 -517
  518. package/src/tiles/hover/tile-hover-pane.ts +184 -180
  519. package/src/tiles/list/tile-list-compact.ts +239 -239
  520. package/src/tiles/list/tile-list.ts +700 -700
  521. package/src/tiles/tile-dispatcher.ts +517 -490
  522. package/src/utils/format-date.ts +62 -62
  523. package/test/collection-browser.test.ts +2403 -2403
  524. package/test/tiles/grid/item-tile.test.ts +520 -520
  525. package/test/tiles/hover/hover-pane-controller.test.ts +418 -353
  526. package/test/tiles/list/tile-list-compact.test.ts +282 -282
  527. package/test/tiles/list/tile-list.test.ts +552 -552
  528. package/test/tiles/tile-dispatcher.test.ts +283 -187
  529. package/test/utils/format-date.test.ts +89 -89
  530. package/tsconfig.json +20 -20
  531. package/web-dev-server.config.mjs +30 -30
  532. package/web-test-runner.config.mjs +41 -41
@@ -1,520 +1,520 @@
1
- import { expect, fixture } from '@open-wc/testing';
2
- import sinon from 'sinon';
3
- import { html } from 'lit';
4
- import type { ItemTile } from '../../../src/tiles/grid/item-tile';
5
-
6
- import '../../../src/tiles/grid/item-tile';
7
- import type { TileModel } from '../../../src/models';
8
-
9
- describe('Item Tile', () => {
10
- it('should render initial component', async () => {
11
- const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);
12
-
13
- const container = el.shadowRoot?.querySelector('.container');
14
- const tileDetails = el.shadowRoot?.querySelector('.tile-details');
15
- const itemInfo = el.shadowRoot?.querySelector('.item-info');
16
- const itemTitle = el.shadowRoot?.querySelector('#title');
17
- const imageBlock = el.shadowRoot?.querySelector('image-block');
18
-
19
- expect(container).to.exist;
20
- expect(tileDetails).to.exist;
21
- expect(itemInfo).to.exist;
22
- expect(imageBlock).to.exist;
23
- expect(itemTitle).to.exist;
24
- });
25
-
26
- it('should render with created-by element', async () => {
27
- const el = await fixture<ItemTile>(
28
- html`<item-tile .model=${{ creator: 'someone' }}></item-tile>`,
29
- );
30
-
31
- const container = el.shadowRoot?.querySelector('.container');
32
- const tileDetails = el.shadowRoot?.querySelector('.tile-details');
33
- const itemInfo = el.shadowRoot?.querySelector('.item-info');
34
- const createdBy = el.shadowRoot?.querySelector('.created-by');
35
- const truncatedCreatorText = createdBy?.querySelector('.truncated');
36
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
37
-
38
- expect(container).to.exist;
39
- expect(tileDetails).to.exist;
40
- expect(itemInfo).to.exist;
41
- expect(createdBy).to.exist;
42
- expect(truncatedCreatorText).to.exist;
43
- expect(dateSortedBy).to.not.exist;
44
- });
45
-
46
- it('should not render with created-by but date element', async () => {
47
- const el = await fixture<ItemTile>(
48
- html`<item-tile .model=${{ datePublished: new Date() }}></item-tile>`,
49
- );
50
-
51
- el.sortParam = {
52
- field: 'date',
53
- direction: 'desc',
54
- };
55
- await el.updateComplete;
56
-
57
- const createdBy = el.shadowRoot?.querySelector('.created-by');
58
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
59
-
60
- expect(createdBy).to.not.exist;
61
- expect(dateSortedBy).to.exist;
62
- });
63
-
64
- it('should not render with created-by but reviewdate element', async () => {
65
- const el = await fixture<ItemTile>(
66
- html`<item-tile .model=${{ dateReviewed: new Date() }}></item-tile>`,
67
- );
68
-
69
- el.sortParam = {
70
- field: 'reviewdate',
71
- direction: 'desc',
72
- };
73
- await el.updateComplete;
74
-
75
- const createdBy = el.shadowRoot?.querySelector('.created-by');
76
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
77
-
78
- expect(createdBy).to.not.exist;
79
- expect(dateSortedBy).to.exist;
80
- });
81
-
82
- it('should not render with created-by but publicdate element', async () => {
83
- const el = await fixture<ItemTile>(
84
- html`<item-tile .model=${{ dateArchived: new Date() }}></item-tile>`,
85
- );
86
-
87
- el.sortParam = {
88
- field: 'publicdate',
89
- direction: 'desc',
90
- };
91
- await el.updateComplete;
92
-
93
- const createdBy = el.shadowRoot?.querySelector('.created-by');
94
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
95
-
96
- expect(createdBy).to.not.exist;
97
- expect(dateSortedBy).to.exist;
98
- });
99
-
100
- it('should not render date-sorted-by element if date is not provided', async () => {
101
- const el = await fixture<ItemTile>(
102
- html`<item-tile .model=${{ dateArchived: undefined }}></item-tile>`,
103
- );
104
-
105
- el.sortParam = {
106
- field: 'publicdate',
107
- direction: 'desc',
108
- };
109
- await el.updateComplete;
110
-
111
- const createdBy = el.shadowRoot?.querySelector('.created-by');
112
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
113
-
114
- expect(createdBy).to.not.exist;
115
- expect(dateSortedBy).to.not.exist;
116
- });
117
-
118
- it('should render without created-by when sorting by a date field', async () => {
119
- const el = await fixture<ItemTile>(
120
- html`<item-tile .model=${{ dateAdded: new Date() }}></item-tile>`,
121
- );
122
-
123
- el.sortParam = {
124
- field: 'addeddate',
125
- direction: 'asc',
126
- };
127
- await el.updateComplete;
128
-
129
- const itemInfo = el.shadowRoot?.querySelector('.item-info');
130
- const createdBy = el.shadowRoot?.querySelector('.created-by');
131
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
132
-
133
- expect(itemInfo).to.exist;
134
- expect(createdBy).to.not.exist;
135
- expect(dateSortedBy).to.exist;
136
- });
137
-
138
- it('should render with created-by when sort field is not a date', async () => {
139
- const el = await fixture<ItemTile>(
140
- html`<item-tile .model=${{ creator: 'someone' }}></item-tile>`,
141
- );
142
-
143
- el.sortParam = {
144
- field: 'week',
145
- direction: 'asc',
146
- };
147
- await el.updateComplete;
148
-
149
- const itemInfo = el.shadowRoot?.querySelector('.item-info');
150
- const createdBy = el.shadowRoot?.querySelector('.created-by');
151
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
152
-
153
- expect(itemInfo).to.exist;
154
- expect(dateSortedBy).to.not.exist; // it should not exist because this is not a date sort
155
- expect(createdBy).to.exist;
156
- });
157
-
158
- it('should render published date when sorting by it', async () => {
159
- const model: Partial<TileModel> = {
160
- dateAdded: new Date(2010, 0, 2),
161
- dateArchived: new Date(2011, 0, 2),
162
- datePublished: new Date(2012, 0, 2),
163
- dateReviewed: new Date(2013, 0, 2),
164
- };
165
-
166
- const el = await fixture<ItemTile>(html`
167
- <item-tile
168
- .model=${model}
169
- .sortParam=${{ field: 'date', direction: 'desc' }}
170
- >
171
- </item-tile>
172
- `);
173
-
174
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
175
- expect(dateSortedBy).to.exist;
176
- expect(dateSortedBy?.textContent?.trim()).to.contain(
177
- 'published Jan 02, 2012',
178
- );
179
- });
180
-
181
- it('should render added date when sorting by it', async () => {
182
- const model: Partial<TileModel> = {
183
- dateAdded: new Date(2010, 0, 2),
184
- dateArchived: new Date(2011, 0, 2),
185
- datePublished: new Date(2012, 0, 2),
186
- dateReviewed: new Date(2013, 0, 2),
187
- };
188
-
189
- const el = await fixture<ItemTile>(html`
190
- <item-tile
191
- .model=${model}
192
- .sortParam=${{ field: 'addeddate', direction: 'desc' }}
193
- >
194
- </item-tile>
195
- `);
196
-
197
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
198
- expect(dateSortedBy).to.exist;
199
- expect(dateSortedBy?.textContent?.trim()).to.contain('added Jan 02, 2010');
200
- });
201
-
202
- it('should render archived date when sorting by it', async () => {
203
- const model: Partial<TileModel> = {
204
- dateAdded: new Date(2010, 0, 2),
205
- dateArchived: new Date(2011, 0, 2),
206
- datePublished: new Date(2012, 0, 2),
207
- dateReviewed: new Date(2013, 0, 2),
208
- };
209
-
210
- const el = await fixture<ItemTile>(html`
211
- <item-tile
212
- .model=${model}
213
- .sortParam=${{ field: 'publicdate', direction: 'desc' }}
214
- >
215
- </item-tile>
216
- `);
217
-
218
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
219
- expect(dateSortedBy).to.exist;
220
- expect(dateSortedBy?.textContent?.trim()).to.contain(
221
- 'archived Jan 02, 2011',
222
- );
223
- });
224
-
225
- it('should render reviewed date when sorting by it', async () => {
226
- const model: Partial<TileModel> = {
227
- dateAdded: new Date(2010, 0, 2),
228
- dateArchived: new Date(2011, 0, 2),
229
- datePublished: new Date(2012, 0, 2),
230
- dateReviewed: new Date(2013, 0, 2),
231
- };
232
-
233
- const el = await fixture<ItemTile>(html`
234
- <item-tile
235
- .model=${model}
236
- .sortParam=${{ field: 'reviewdate', direction: 'desc' }}
237
- >
238
- </item-tile>
239
- `);
240
-
241
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
242
- expect(dateSortedBy).to.exist;
243
- expect(dateSortedBy?.textContent?.trim()).to.contain(
244
- 'reviewed Jan 02, 2013',
245
- );
246
- });
247
-
248
- it('should only show the year for a date published of Jan 1 at midnight UTC', async () => {
249
- const model: Partial<TileModel> = {
250
- datePublished: new Date('2012-01-01T00:00:00Z'),
251
- };
252
-
253
- const el = await fixture<ItemTile>(html`
254
- <item-tile
255
- .model=${model}
256
- .sortParam=${{ field: 'date', direction: 'desc' }}
257
- >
258
- </item-tile>
259
- `);
260
-
261
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
262
- expect(dateSortedBy).to.exist;
263
- expect(dateSortedBy?.textContent?.trim()).to.equal('published 2012');
264
- });
265
-
266
- it('should show full date added/archived/reviewed, even on Jan 1 at midnight UTC', async () => {
267
- const model: Partial<TileModel> = {
268
- dateAdded: new Date(2010, 0, 1, 0, 0, 0, 0),
269
- dateArchived: new Date(2011, 0, 1, 0, 0, 0, 0),
270
- datePublished: new Date(2012, 0, 1, 0, 0, 0, 0),
271
- dateReviewed: new Date(2013, 0, 1, 0, 0, 0, 0),
272
- };
273
-
274
- const el = await fixture<ItemTile>(html`
275
- <item-tile
276
- .model=${model}
277
- .sortParam=${{ field: 'addeddate', direction: 'desc' }}
278
- >
279
- </item-tile>
280
- `);
281
-
282
- let dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
283
- expect(dateSortedBy).to.exist;
284
- expect(dateSortedBy?.textContent?.trim()).to.equal('added Jan 01, 2010');
285
-
286
- el.sortParam = { field: 'publicdate', direction: 'desc' };
287
- await el.updateComplete;
288
- dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
289
- expect(dateSortedBy).to.exist;
290
- expect(dateSortedBy?.textContent?.trim()).to.equal('archived Jan 01, 2011');
291
-
292
- el.sortParam = { field: 'reviewdate', direction: 'desc' };
293
- await el.updateComplete;
294
- dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
295
- expect(dateSortedBy).to.exist;
296
- expect(dateSortedBy?.textContent?.trim()).to.equal('reviewed Jan 01, 2013');
297
- });
298
-
299
- it('should display dates in UTC time zone by default', async () => {
300
- const model: Partial<TileModel> = {
301
- datePublished: new Date('2012-02-15T00:00:00Z'),
302
- };
303
-
304
- const el = await fixture<ItemTile>(html`
305
- <item-tile
306
- .model=${model}
307
- .sortParam=${{ field: 'date', direction: 'desc' }}
308
- >
309
- </item-tile>
310
- `);
311
-
312
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
313
- expect(dateSortedBy).to.exist;
314
- expect(dateSortedBy?.textContent?.trim()).to.equal(
315
- 'published Feb 15, 2012',
316
- );
317
- });
318
-
319
- it('should display dates in local time when useLocalTime option is true', async () => {
320
- // Expected behavior depends on the time zone offset where the testing occurs
321
- const offset = new Date().getTimezoneOffset();
322
- let datePublished, expected;
323
- if (offset > 0) {
324
- // Positive local time zone offsets have earlier local dates than UTC
325
- datePublished = new Date('2012-02-15T00:00:00Z');
326
- expected = 'published Feb 14, 2012';
327
- } else if (offset < 0) {
328
- // Negative local time zone offsets have later local dates than UTC
329
- datePublished = new Date('2012-02-15T23:59:59Z');
330
- expected = 'published Feb 16, 2012';
331
- } else {
332
- // Local time may just be UTC itself
333
- datePublished = new Date('2012-02-15T00:00:00Z');
334
- expected = 'published Feb 15, 2012';
335
- }
336
-
337
- const model: Partial<TileModel> = {
338
- datePublished,
339
- };
340
-
341
- const el = await fixture<ItemTile>(html`
342
- <item-tile
343
- useLocalTime
344
- .model=${model}
345
- .sortParam=${{ field: 'date', direction: 'desc' }}
346
- >
347
- </item-tile>
348
- `);
349
-
350
- const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
351
- expect(dateSortedBy).to.exist;
352
- expect(dateSortedBy?.textContent?.trim()).to.equal(expected);
353
- });
354
-
355
- it('should show the first creator matching the letter filter, if defined', async () => {
356
- const model: Partial<TileModel> = {
357
- creator: 'foo',
358
- creators: ['foo', 'bar', 'baz'],
359
- };
360
-
361
- const el = await fixture<ItemTile>(html`
362
- <item-tile .model=${model} .creatorFilter=${'B'}> </item-tile>
363
- `);
364
-
365
- const creator = el.shadowRoot?.querySelector('.created-by');
366
- expect(creator).to.exist;
367
- expect(creator?.textContent?.trim()).to.match(/by\s+bar/);
368
- });
369
-
370
- it('should render with snippet block when it has snippets', async () => {
371
- const el = await fixture<ItemTile>(html`
372
- <item-tile .model=${{ snippets: ['some {{{snippet}}} text'] }}>
373
- </item-tile>
374
- `);
375
-
376
- const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');
377
-
378
- expect(snippetBlock).to.exist;
379
- });
380
-
381
- it('should not render snippet block when no snippets are present', async () => {
382
- const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);
383
-
384
- const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');
385
-
386
- expect(snippetBlock).to.not.exist;
387
- });
388
-
389
- it('should render info button when showInfoButton flag is set', async () => {
390
- const el = await fixture<ItemTile>(html`
391
- <item-tile ?showInfoButton=${true}> </item-tile>
392
- `);
393
-
394
- const infoButton = el.shadowRoot?.querySelector('.info-button');
395
-
396
- expect(infoButton).to.exist;
397
- });
398
-
399
- it('should dispatch event when info button tapped', async () => {
400
- const infoButtonSpy = sinon.spy();
401
- const el = await fixture<ItemTile>(html`
402
- <item-tile ?showInfoButton=${true} @infoButtonPressed=${infoButtonSpy}>
403
- </item-tile>
404
- `);
405
-
406
- const infoButton = el.shadowRoot?.querySelector(
407
- '.info-button',
408
- ) as HTMLButtonElement;
409
- infoButton.click();
410
- await el.updateComplete;
411
-
412
- expect(infoButtonSpy.callCount).to.equal(1);
413
- });
414
-
415
- it('should render with volume/issue view', async () => {
416
- const el = await fixture<ItemTile>(html`
417
- <item-tile .model=${{ volume: '1', issue: 'Index' }}></item-tile>
418
- `);
419
-
420
- const volumeIssueBlock = el.shadowRoot?.querySelector('.volume-issue');
421
-
422
- expect(volumeIssueBlock).to.exist;
423
- });
424
-
425
- it('should render with volume/issue view to not render', async () => {
426
- const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);
427
-
428
- const volumeIssueBlock = el.shadowRoot?.querySelector('.volume-issue');
429
-
430
- expect(volumeIssueBlock).to.not.exist;
431
- });
432
-
433
- it('should render web capture date links if present', async () => {
434
- const captureDates = [
435
- new Date('2010-01-02T12:34:56Z'),
436
- new Date('2011-02-03T12:43:21Z'),
437
- ];
438
-
439
- const el = await fixture<ItemTile>(html`
440
- <item-tile
441
- .model=${{
442
- identifier: 'foo',
443
- title: 'https://example.com/',
444
- captureDates,
445
- }}
446
- ></item-tile>
447
- `);
448
-
449
- const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');
450
- expect(captureDatesUl, 'capture dates container').to.exist;
451
- expect(captureDatesUl?.children.length).to.equal(2);
452
-
453
- const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');
454
- expect(firstDateLink, 'first date link').to.exist;
455
- expect(firstDateLink?.getAttribute('href')).to.equal(
456
- 'https://web.archive.org/web/20100102123456/https%3A%2F%2Fexample.com%2F',
457
- );
458
- expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');
459
-
460
- const secondDateLink =
461
- captureDatesUl?.children[1]?.querySelector('a[href]');
462
- expect(secondDateLink, 'second date link').to.exist;
463
- expect(secondDateLink?.getAttribute('href')).to.equal(
464
- 'https://web.archive.org/web/20110203124321/https%3A%2F%2Fexample.com%2F',
465
- );
466
- expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');
467
- });
468
-
469
- it('should not render web captures if no title is present', async () => {
470
- const captureDates = [
471
- new Date('2010-01-02T12:34:56Z'),
472
- new Date('2011-02-03T12:43:21Z'),
473
- ];
474
-
475
- const el = await fixture<ItemTile>(html`
476
- <item-tile
477
- .model=${{
478
- identifier: 'foo',
479
- captureDates,
480
- }}
481
- ></item-tile>
482
- `);
483
-
484
- const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');
485
- expect(captureDatesUl).not.to.exist;
486
- });
487
-
488
- it('should render review snippet if present', async () => {
489
- const review = {
490
- title: 'Foo',
491
- body: 'foo bar baz',
492
- stars: 3,
493
- };
494
-
495
- const el = await fixture<ItemTile>(html`
496
- <item-tile
497
- .model=${{
498
- identifier: 'foo',
499
- review,
500
- }}
501
- ></item-tile>
502
- `);
503
-
504
- const reviewBlock = el.shadowRoot?.querySelector('review-block');
505
- expect(reviewBlock).to.exist;
506
- });
507
-
508
- it('should not render review snippet block when no review is present', async () => {
509
- const el = await fixture<ItemTile>(html`
510
- <item-tile
511
- .model=${{
512
- identifier: 'foo',
513
- }}
514
- ></item-tile>
515
- `);
516
-
517
- const reviewBlock = el.shadowRoot?.querySelector('review-block');
518
- expect(reviewBlock).not.to.exist;
519
- });
520
- });
1
+ import { expect, fixture } from '@open-wc/testing';
2
+ import sinon from 'sinon';
3
+ import { html } from 'lit';
4
+ import type { ItemTile } from '../../../src/tiles/grid/item-tile';
5
+
6
+ import '../../../src/tiles/grid/item-tile';
7
+ import type { TileModel } from '../../../src/models';
8
+
9
+ describe('Item Tile', () => {
10
+ it('should render initial component', async () => {
11
+ const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);
12
+
13
+ const container = el.shadowRoot?.querySelector('.container');
14
+ const tileDetails = el.shadowRoot?.querySelector('.tile-details');
15
+ const itemInfo = el.shadowRoot?.querySelector('.item-info');
16
+ const itemTitle = el.shadowRoot?.querySelector('#title');
17
+ const imageBlock = el.shadowRoot?.querySelector('image-block');
18
+
19
+ expect(container).to.exist;
20
+ expect(tileDetails).to.exist;
21
+ expect(itemInfo).to.exist;
22
+ expect(imageBlock).to.exist;
23
+ expect(itemTitle).to.exist;
24
+ });
25
+
26
+ it('should render with created-by element', async () => {
27
+ const el = await fixture<ItemTile>(
28
+ html`<item-tile .model=${{ creator: 'someone' }}></item-tile>`,
29
+ );
30
+
31
+ const container = el.shadowRoot?.querySelector('.container');
32
+ const tileDetails = el.shadowRoot?.querySelector('.tile-details');
33
+ const itemInfo = el.shadowRoot?.querySelector('.item-info');
34
+ const createdBy = el.shadowRoot?.querySelector('.created-by');
35
+ const truncatedCreatorText = createdBy?.querySelector('.truncated');
36
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
37
+
38
+ expect(container).to.exist;
39
+ expect(tileDetails).to.exist;
40
+ expect(itemInfo).to.exist;
41
+ expect(createdBy).to.exist;
42
+ expect(truncatedCreatorText).to.exist;
43
+ expect(dateSortedBy).to.not.exist;
44
+ });
45
+
46
+ it('should not render with created-by but date element', async () => {
47
+ const el = await fixture<ItemTile>(
48
+ html`<item-tile .model=${{ datePublished: new Date() }}></item-tile>`,
49
+ );
50
+
51
+ el.sortParam = {
52
+ field: 'date',
53
+ direction: 'desc',
54
+ };
55
+ await el.updateComplete;
56
+
57
+ const createdBy = el.shadowRoot?.querySelector('.created-by');
58
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
59
+
60
+ expect(createdBy).to.not.exist;
61
+ expect(dateSortedBy).to.exist;
62
+ });
63
+
64
+ it('should not render with created-by but reviewdate element', async () => {
65
+ const el = await fixture<ItemTile>(
66
+ html`<item-tile .model=${{ dateReviewed: new Date() }}></item-tile>`,
67
+ );
68
+
69
+ el.sortParam = {
70
+ field: 'reviewdate',
71
+ direction: 'desc',
72
+ };
73
+ await el.updateComplete;
74
+
75
+ const createdBy = el.shadowRoot?.querySelector('.created-by');
76
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
77
+
78
+ expect(createdBy).to.not.exist;
79
+ expect(dateSortedBy).to.exist;
80
+ });
81
+
82
+ it('should not render with created-by but publicdate element', async () => {
83
+ const el = await fixture<ItemTile>(
84
+ html`<item-tile .model=${{ dateArchived: new Date() }}></item-tile>`,
85
+ );
86
+
87
+ el.sortParam = {
88
+ field: 'publicdate',
89
+ direction: 'desc',
90
+ };
91
+ await el.updateComplete;
92
+
93
+ const createdBy = el.shadowRoot?.querySelector('.created-by');
94
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
95
+
96
+ expect(createdBy).to.not.exist;
97
+ expect(dateSortedBy).to.exist;
98
+ });
99
+
100
+ it('should not render date-sorted-by element if date is not provided', async () => {
101
+ const el = await fixture<ItemTile>(
102
+ html`<item-tile .model=${{ dateArchived: undefined }}></item-tile>`,
103
+ );
104
+
105
+ el.sortParam = {
106
+ field: 'publicdate',
107
+ direction: 'desc',
108
+ };
109
+ await el.updateComplete;
110
+
111
+ const createdBy = el.shadowRoot?.querySelector('.created-by');
112
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
113
+
114
+ expect(createdBy).to.not.exist;
115
+ expect(dateSortedBy).to.not.exist;
116
+ });
117
+
118
+ it('should render without created-by when sorting by a date field', async () => {
119
+ const el = await fixture<ItemTile>(
120
+ html`<item-tile .model=${{ dateAdded: new Date() }}></item-tile>`,
121
+ );
122
+
123
+ el.sortParam = {
124
+ field: 'addeddate',
125
+ direction: 'asc',
126
+ };
127
+ await el.updateComplete;
128
+
129
+ const itemInfo = el.shadowRoot?.querySelector('.item-info');
130
+ const createdBy = el.shadowRoot?.querySelector('.created-by');
131
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
132
+
133
+ expect(itemInfo).to.exist;
134
+ expect(createdBy).to.not.exist;
135
+ expect(dateSortedBy).to.exist;
136
+ });
137
+
138
+ it('should render with created-by when sort field is not a date', async () => {
139
+ const el = await fixture<ItemTile>(
140
+ html`<item-tile .model=${{ creator: 'someone' }}></item-tile>`,
141
+ );
142
+
143
+ el.sortParam = {
144
+ field: 'week',
145
+ direction: 'asc',
146
+ };
147
+ await el.updateComplete;
148
+
149
+ const itemInfo = el.shadowRoot?.querySelector('.item-info');
150
+ const createdBy = el.shadowRoot?.querySelector('.created-by');
151
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
152
+
153
+ expect(itemInfo).to.exist;
154
+ expect(dateSortedBy).to.not.exist; // it should not exist because this is not a date sort
155
+ expect(createdBy).to.exist;
156
+ });
157
+
158
+ it('should render published date when sorting by it', async () => {
159
+ const model: Partial<TileModel> = {
160
+ dateAdded: new Date(2010, 0, 2),
161
+ dateArchived: new Date(2011, 0, 2),
162
+ datePublished: new Date(2012, 0, 2),
163
+ dateReviewed: new Date(2013, 0, 2),
164
+ };
165
+
166
+ const el = await fixture<ItemTile>(html`
167
+ <item-tile
168
+ .model=${model}
169
+ .sortParam=${{ field: 'date', direction: 'desc' }}
170
+ >
171
+ </item-tile>
172
+ `);
173
+
174
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
175
+ expect(dateSortedBy).to.exist;
176
+ expect(dateSortedBy?.textContent?.trim()).to.contain(
177
+ 'published Jan 02, 2012',
178
+ );
179
+ });
180
+
181
+ it('should render added date when sorting by it', async () => {
182
+ const model: Partial<TileModel> = {
183
+ dateAdded: new Date(2010, 0, 2),
184
+ dateArchived: new Date(2011, 0, 2),
185
+ datePublished: new Date(2012, 0, 2),
186
+ dateReviewed: new Date(2013, 0, 2),
187
+ };
188
+
189
+ const el = await fixture<ItemTile>(html`
190
+ <item-tile
191
+ .model=${model}
192
+ .sortParam=${{ field: 'addeddate', direction: 'desc' }}
193
+ >
194
+ </item-tile>
195
+ `);
196
+
197
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
198
+ expect(dateSortedBy).to.exist;
199
+ expect(dateSortedBy?.textContent?.trim()).to.contain('added Jan 02, 2010');
200
+ });
201
+
202
+ it('should render archived date when sorting by it', async () => {
203
+ const model: Partial<TileModel> = {
204
+ dateAdded: new Date(2010, 0, 2),
205
+ dateArchived: new Date(2011, 0, 2),
206
+ datePublished: new Date(2012, 0, 2),
207
+ dateReviewed: new Date(2013, 0, 2),
208
+ };
209
+
210
+ const el = await fixture<ItemTile>(html`
211
+ <item-tile
212
+ .model=${model}
213
+ .sortParam=${{ field: 'publicdate', direction: 'desc' }}
214
+ >
215
+ </item-tile>
216
+ `);
217
+
218
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
219
+ expect(dateSortedBy).to.exist;
220
+ expect(dateSortedBy?.textContent?.trim()).to.contain(
221
+ 'archived Jan 02, 2011',
222
+ );
223
+ });
224
+
225
+ it('should render reviewed date when sorting by it', async () => {
226
+ const model: Partial<TileModel> = {
227
+ dateAdded: new Date(2010, 0, 2),
228
+ dateArchived: new Date(2011, 0, 2),
229
+ datePublished: new Date(2012, 0, 2),
230
+ dateReviewed: new Date(2013, 0, 2),
231
+ };
232
+
233
+ const el = await fixture<ItemTile>(html`
234
+ <item-tile
235
+ .model=${model}
236
+ .sortParam=${{ field: 'reviewdate', direction: 'desc' }}
237
+ >
238
+ </item-tile>
239
+ `);
240
+
241
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
242
+ expect(dateSortedBy).to.exist;
243
+ expect(dateSortedBy?.textContent?.trim()).to.contain(
244
+ 'reviewed Jan 02, 2013',
245
+ );
246
+ });
247
+
248
+ it('should only show the year for a date published of Jan 1 at midnight UTC', async () => {
249
+ const model: Partial<TileModel> = {
250
+ datePublished: new Date('2012-01-01T00:00:00Z'),
251
+ };
252
+
253
+ const el = await fixture<ItemTile>(html`
254
+ <item-tile
255
+ .model=${model}
256
+ .sortParam=${{ field: 'date', direction: 'desc' }}
257
+ >
258
+ </item-tile>
259
+ `);
260
+
261
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
262
+ expect(dateSortedBy).to.exist;
263
+ expect(dateSortedBy?.textContent?.trim()).to.equal('published 2012');
264
+ });
265
+
266
+ it('should show full date added/archived/reviewed, even on Jan 1 at midnight UTC', async () => {
267
+ const model: Partial<TileModel> = {
268
+ dateAdded: new Date(2010, 0, 1, 0, 0, 0, 0),
269
+ dateArchived: new Date(2011, 0, 1, 0, 0, 0, 0),
270
+ datePublished: new Date(2012, 0, 1, 0, 0, 0, 0),
271
+ dateReviewed: new Date(2013, 0, 1, 0, 0, 0, 0),
272
+ };
273
+
274
+ const el = await fixture<ItemTile>(html`
275
+ <item-tile
276
+ .model=${model}
277
+ .sortParam=${{ field: 'addeddate', direction: 'desc' }}
278
+ >
279
+ </item-tile>
280
+ `);
281
+
282
+ let dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
283
+ expect(dateSortedBy).to.exist;
284
+ expect(dateSortedBy?.textContent?.trim()).to.equal('added Jan 01, 2010');
285
+
286
+ el.sortParam = { field: 'publicdate', direction: 'desc' };
287
+ await el.updateComplete;
288
+ dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
289
+ expect(dateSortedBy).to.exist;
290
+ expect(dateSortedBy?.textContent?.trim()).to.equal('archived Jan 01, 2011');
291
+
292
+ el.sortParam = { field: 'reviewdate', direction: 'desc' };
293
+ await el.updateComplete;
294
+ dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
295
+ expect(dateSortedBy).to.exist;
296
+ expect(dateSortedBy?.textContent?.trim()).to.equal('reviewed Jan 01, 2013');
297
+ });
298
+
299
+ it('should display dates in UTC time zone by default', async () => {
300
+ const model: Partial<TileModel> = {
301
+ datePublished: new Date('2012-02-15T00:00:00Z'),
302
+ };
303
+
304
+ const el = await fixture<ItemTile>(html`
305
+ <item-tile
306
+ .model=${model}
307
+ .sortParam=${{ field: 'date', direction: 'desc' }}
308
+ >
309
+ </item-tile>
310
+ `);
311
+
312
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
313
+ expect(dateSortedBy).to.exist;
314
+ expect(dateSortedBy?.textContent?.trim()).to.equal(
315
+ 'published Feb 15, 2012',
316
+ );
317
+ });
318
+
319
+ it('should display dates in local time when useLocalTime option is true', async () => {
320
+ // Expected behavior depends on the time zone offset where the testing occurs
321
+ const offset = new Date().getTimezoneOffset();
322
+ let datePublished, expected;
323
+ if (offset > 0) {
324
+ // Positive local time zone offsets have earlier local dates than UTC
325
+ datePublished = new Date('2012-02-15T00:00:00Z');
326
+ expected = 'published Feb 14, 2012';
327
+ } else if (offset < 0) {
328
+ // Negative local time zone offsets have later local dates than UTC
329
+ datePublished = new Date('2012-02-15T23:59:59Z');
330
+ expected = 'published Feb 16, 2012';
331
+ } else {
332
+ // Local time may just be UTC itself
333
+ datePublished = new Date('2012-02-15T00:00:00Z');
334
+ expected = 'published Feb 15, 2012';
335
+ }
336
+
337
+ const model: Partial<TileModel> = {
338
+ datePublished,
339
+ };
340
+
341
+ const el = await fixture<ItemTile>(html`
342
+ <item-tile
343
+ useLocalTime
344
+ .model=${model}
345
+ .sortParam=${{ field: 'date', direction: 'desc' }}
346
+ >
347
+ </item-tile>
348
+ `);
349
+
350
+ const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');
351
+ expect(dateSortedBy).to.exist;
352
+ expect(dateSortedBy?.textContent?.trim()).to.equal(expected);
353
+ });
354
+
355
+ it('should show the first creator matching the letter filter, if defined', async () => {
356
+ const model: Partial<TileModel> = {
357
+ creator: 'foo',
358
+ creators: ['foo', 'bar', 'baz'],
359
+ };
360
+
361
+ const el = await fixture<ItemTile>(html`
362
+ <item-tile .model=${model} .creatorFilter=${'B'}> </item-tile>
363
+ `);
364
+
365
+ const creator = el.shadowRoot?.querySelector('.created-by');
366
+ expect(creator).to.exist;
367
+ expect(creator?.textContent?.trim()).to.match(/by\s+bar/);
368
+ });
369
+
370
+ it('should render with snippet block when it has snippets', async () => {
371
+ const el = await fixture<ItemTile>(html`
372
+ <item-tile .model=${{ snippets: ['some {{{snippet}}} text'] }}>
373
+ </item-tile>
374
+ `);
375
+
376
+ const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');
377
+
378
+ expect(snippetBlock).to.exist;
379
+ });
380
+
381
+ it('should not render snippet block when no snippets are present', async () => {
382
+ const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);
383
+
384
+ const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');
385
+
386
+ expect(snippetBlock).to.not.exist;
387
+ });
388
+
389
+ it('should render info button when showInfoButton flag is set', async () => {
390
+ const el = await fixture<ItemTile>(html`
391
+ <item-tile ?showInfoButton=${true}> </item-tile>
392
+ `);
393
+
394
+ const infoButton = el.shadowRoot?.querySelector('.info-button');
395
+
396
+ expect(infoButton).to.exist;
397
+ });
398
+
399
+ it('should dispatch event when info button tapped', async () => {
400
+ const infoButtonSpy = sinon.spy();
401
+ const el = await fixture<ItemTile>(html`
402
+ <item-tile ?showInfoButton=${true} @infoButtonPressed=${infoButtonSpy}>
403
+ </item-tile>
404
+ `);
405
+
406
+ const infoButton = el.shadowRoot?.querySelector(
407
+ '.info-button',
408
+ ) as HTMLButtonElement;
409
+ infoButton.click();
410
+ await el.updateComplete;
411
+
412
+ expect(infoButtonSpy.callCount).to.equal(1);
413
+ });
414
+
415
+ it('should render with volume/issue view', async () => {
416
+ const el = await fixture<ItemTile>(html`
417
+ <item-tile .model=${{ volume: '1', issue: 'Index' }}></item-tile>
418
+ `);
419
+
420
+ const volumeIssueBlock = el.shadowRoot?.querySelector('.volume-issue');
421
+
422
+ expect(volumeIssueBlock).to.exist;
423
+ });
424
+
425
+ it('should render with volume/issue view to not render', async () => {
426
+ const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);
427
+
428
+ const volumeIssueBlock = el.shadowRoot?.querySelector('.volume-issue');
429
+
430
+ expect(volumeIssueBlock).to.not.exist;
431
+ });
432
+
433
+ it('should render web capture date links if present', async () => {
434
+ const captureDates = [
435
+ new Date('2010-01-02T12:34:56Z'),
436
+ new Date('2011-02-03T12:43:21Z'),
437
+ ];
438
+
439
+ const el = await fixture<ItemTile>(html`
440
+ <item-tile
441
+ .model=${{
442
+ identifier: 'foo',
443
+ title: 'https://example.com/',
444
+ captureDates,
445
+ }}
446
+ ></item-tile>
447
+ `);
448
+
449
+ const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');
450
+ expect(captureDatesUl, 'capture dates container').to.exist;
451
+ expect(captureDatesUl?.children.length).to.equal(2);
452
+
453
+ const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');
454
+ expect(firstDateLink, 'first date link').to.exist;
455
+ expect(firstDateLink?.getAttribute('href')).to.equal(
456
+ 'https://web.archive.org/web/20100102123456/https%3A%2F%2Fexample.com%2F',
457
+ );
458
+ expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');
459
+
460
+ const secondDateLink =
461
+ captureDatesUl?.children[1]?.querySelector('a[href]');
462
+ expect(secondDateLink, 'second date link').to.exist;
463
+ expect(secondDateLink?.getAttribute('href')).to.equal(
464
+ 'https://web.archive.org/web/20110203124321/https%3A%2F%2Fexample.com%2F',
465
+ );
466
+ expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');
467
+ });
468
+
469
+ it('should not render web captures if no title is present', async () => {
470
+ const captureDates = [
471
+ new Date('2010-01-02T12:34:56Z'),
472
+ new Date('2011-02-03T12:43:21Z'),
473
+ ];
474
+
475
+ const el = await fixture<ItemTile>(html`
476
+ <item-tile
477
+ .model=${{
478
+ identifier: 'foo',
479
+ captureDates,
480
+ }}
481
+ ></item-tile>
482
+ `);
483
+
484
+ const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');
485
+ expect(captureDatesUl).not.to.exist;
486
+ });
487
+
488
+ it('should render review snippet if present', async () => {
489
+ const review = {
490
+ title: 'Foo',
491
+ body: 'foo bar baz',
492
+ stars: 3,
493
+ };
494
+
495
+ const el = await fixture<ItemTile>(html`
496
+ <item-tile
497
+ .model=${{
498
+ identifier: 'foo',
499
+ review,
500
+ }}
501
+ ></item-tile>
502
+ `);
503
+
504
+ const reviewBlock = el.shadowRoot?.querySelector('review-block');
505
+ expect(reviewBlock).to.exist;
506
+ });
507
+
508
+ it('should not render review snippet block when no review is present', async () => {
509
+ const el = await fixture<ItemTile>(html`
510
+ <item-tile
511
+ .model=${{
512
+ identifier: 'foo',
513
+ }}
514
+ ></item-tile>
515
+ `);
516
+
517
+ const reviewBlock = el.shadowRoot?.querySelector('review-block');
518
+ expect(reviewBlock).not.to.exist;
519
+ });
520
+ });