@internetarchive/collection-browser 1.14.9-alpha.2 → 1.14.9-alpha10

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 (291) hide show
  1. package/.editorconfig +29 -29
  2. package/.husky/pre-commit +4 -4
  3. package/LICENSE +661 -661
  4. package/README.md +83 -83
  5. package/dist/index.d.ts +9 -9
  6. package/dist/index.js +9 -9
  7. package/dist/src/app-root.d.ts +73 -72
  8. package/dist/src/app-root.js +501 -429
  9. package/dist/src/app-root.js.map +1 -1
  10. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  11. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  12. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  13. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  14. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  15. package/dist/src/assets/img/icons/chevron.js +2 -2
  16. package/dist/src/assets/img/icons/contract.d.ts +2 -2
  17. package/dist/src/assets/img/icons/contract.js +2 -2
  18. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  19. package/dist/src/assets/img/icons/empty-query.js +2 -2
  20. package/dist/src/assets/img/icons/expand.d.ts +2 -2
  21. package/dist/src/assets/img/icons/expand.js +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  23. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  24. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  25. package/dist/src/assets/img/icons/eye.js +2 -2
  26. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  27. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  28. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  29. package/dist/src/assets/img/icons/login-required.js +2 -2
  30. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  31. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  32. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  33. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  34. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  35. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  36. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  37. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  38. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  39. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  40. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  41. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  42. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  43. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  44. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  45. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  46. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -1
  47. package/dist/src/assets/img/icons/mediatype/search.js +2 -2
  48. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  49. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  50. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  51. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  52. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  53. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  54. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  55. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  56. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  57. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  58. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  59. package/dist/src/assets/img/icons/null-result.js +2 -2
  60. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  61. package/dist/src/assets/img/icons/restricted.js +2 -2
  62. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  63. package/dist/src/assets/img/icons/reviews.js +2 -2
  64. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  65. package/dist/src/assets/img/icons/upload.js +2 -2
  66. package/dist/src/assets/img/icons/views.d.ts +1 -1
  67. package/dist/src/assets/img/icons/views.js +2 -2
  68. package/dist/src/circular-activity-indicator.d.ts +5 -5
  69. package/dist/src/circular-activity-indicator.js +17 -17
  70. package/dist/src/collection-browser.d.ts +533 -533
  71. package/dist/src/collection-browser.js +1894 -1893
  72. package/dist/src/collection-browser.js.map +1 -1
  73. package/dist/src/collection-facets/facet-row.d.ts +30 -0
  74. package/dist/src/collection-facets/facet-row.js +245 -0
  75. package/dist/src/collection-facets/facet-row.js.map +1 -0
  76. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  77. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  78. package/dist/src/collection-facets/facets-template.d.ts +17 -20
  79. package/dist/src/collection-facets/facets-template.js +122 -264
  80. package/dist/src/collection-facets/facets-template.js.map +1 -1
  81. package/dist/src/collection-facets/more-facets-content.d.ts +77 -77
  82. package/dist/src/collection-facets/more-facets-content.js +359 -359
  83. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  84. package/dist/src/collection-facets/more-facets-pagination.js +196 -196
  85. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  86. package/dist/src/collection-facets/toggle-switch.js +94 -94
  87. package/dist/src/collection-facets.d.ts +104 -104
  88. package/dist/src/collection-facets.js +506 -506
  89. package/dist/src/empty-placeholder.d.ts +23 -23
  90. package/dist/src/empty-placeholder.js +74 -74
  91. package/dist/src/expanded-date-picker.d.ts +43 -43
  92. package/dist/src/expanded-date-picker.js +109 -109
  93. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  94. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  95. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  96. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  97. package/dist/src/manage/manage-bar.d.ts +26 -26
  98. package/dist/src/manage/manage-bar.js +53 -53
  99. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  100. package/dist/src/mediatype/mediatype-config.js +91 -91
  101. package/dist/src/models.d.ts +180 -164
  102. package/dist/src/models.js +269 -269
  103. package/dist/src/models.js.map +1 -1
  104. package/dist/src/restoration-state-handler.d.ts +70 -70
  105. package/dist/src/restoration-state-handler.js +355 -355
  106. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  107. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  108. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  109. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  110. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  111. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  112. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  113. package/dist/src/sort-filter-bar/img/list.js +2 -2
  114. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  115. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  116. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  117. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  118. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  119. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  120. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  121. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  122. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  123. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  124. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +208 -208
  125. package/dist/src/sort-filter-bar/sort-filter-bar.js +637 -637
  126. package/dist/src/styles/item-image-styles.d.ts +8 -8
  127. package/dist/src/styles/item-image-styles.js +9 -9
  128. package/dist/src/styles/sr-only.d.ts +1 -1
  129. package/dist/src/styles/sr-only.js +2 -2
  130. package/dist/src/tiles/base-tile-component.d.ts +19 -19
  131. package/dist/src/tiles/base-tile-component.js +63 -63
  132. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  133. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  134. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  135. package/dist/src/tiles/grid/account-tile.js +72 -72
  136. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  137. package/dist/src/tiles/grid/collection-tile.js +80 -80
  138. package/dist/src/tiles/grid/item-tile.d.ts +27 -27
  139. package/dist/src/tiles/grid/item-tile.js +134 -134
  140. package/dist/src/tiles/grid/search-tile.d.ts +10 -10
  141. package/dist/src/tiles/grid/search-tile.js +51 -51
  142. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  143. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  144. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  145. package/dist/src/tiles/grid/tile-stats.js +48 -48
  146. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  147. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  148. package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
  149. package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
  150. package/dist/src/tiles/image-block.d.ts +17 -17
  151. package/dist/src/tiles/image-block.js +73 -73
  152. package/dist/src/tiles/item-image.d.ts +36 -36
  153. package/dist/src/tiles/item-image.js +127 -127
  154. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  155. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  156. package/dist/src/tiles/list/tile-list-compact.d.ts +15 -15
  157. package/dist/src/tiles/list/tile-list-compact.js +114 -114
  158. package/dist/src/tiles/list/tile-list.d.ts +46 -46
  159. package/dist/src/tiles/list/tile-list.js +302 -302
  160. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  161. package/dist/src/tiles/mediatype-icon.js +47 -47
  162. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  163. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  164. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  165. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  166. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  167. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  168. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  169. package/dist/src/tiles/text-snippet-block.js +73 -73
  170. package/dist/src/tiles/tile-dispatcher.d.ts +64 -64
  171. package/dist/src/tiles/tile-dispatcher.js +231 -231
  172. package/dist/src/tiles/tile-display-value-provider.d.ts +43 -43
  173. package/dist/src/tiles/tile-display-value-provider.js +80 -80
  174. package/dist/src/utils/analytics-events.d.ts +25 -25
  175. package/dist/src/utils/analytics-events.js +27 -27
  176. package/dist/src/utils/array-equals.d.ts +4 -4
  177. package/dist/src/utils/array-equals.js +10 -10
  178. package/dist/src/utils/format-count.d.ts +7 -7
  179. package/dist/src/utils/format-count.js +76 -76
  180. package/dist/src/utils/format-date.d.ts +2 -2
  181. package/dist/src/utils/format-date.js +25 -25
  182. package/dist/src/utils/format-unit-size.d.ts +2 -2
  183. package/dist/src/utils/format-unit-size.js +33 -33
  184. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  185. package/dist/src/utils/local-date-from-utc.js +15 -15
  186. package/dist/src/utils/sha1.d.ts +2 -2
  187. package/dist/src/utils/sha1.js +8 -8
  188. package/dist/test/collection-browser.test.d.ts +1 -1
  189. package/dist/test/collection-browser.test.js +1130 -1098
  190. package/dist/test/collection-browser.test.js.map +1 -1
  191. package/dist/test/collection-facets/facet-row.test.d.ts +1 -0
  192. package/dist/test/collection-facets/facet-row.test.js +235 -0
  193. package/dist/test/collection-facets/facet-row.test.js.map +1 -0
  194. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  195. package/dist/test/collection-facets/facets-template.test.js +110 -141
  196. package/dist/test/collection-facets/facets-template.test.js.map +1 -1
  197. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  198. package/dist/test/collection-facets/more-facets-content.test.js +133 -133
  199. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  200. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  201. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  202. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  203. package/dist/test/collection-facets.test.d.ts +2 -2
  204. package/dist/test/collection-facets.test.js +651 -682
  205. package/dist/test/collection-facets.test.js.map +1 -1
  206. package/dist/test/empty-placeholder.test.d.ts +1 -1
  207. package/dist/test/empty-placeholder.test.js +63 -63
  208. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  209. package/dist/test/expanded-date-picker.test.js +95 -95
  210. package/dist/test/icon-overlay.test.d.ts +1 -1
  211. package/dist/test/icon-overlay.test.js +24 -24
  212. package/dist/test/image-block.test.d.ts +1 -1
  213. package/dist/test/image-block.test.js +48 -48
  214. package/dist/test/item-image.test.d.ts +1 -1
  215. package/dist/test/item-image.test.js +86 -86
  216. package/dist/test/manage/manage-bar.test.d.ts +1 -1
  217. package/dist/test/manage/manage-bar.test.js +72 -72
  218. package/dist/test/mediatype-config.test.d.ts +1 -1
  219. package/dist/test/mediatype-config.test.js +16 -16
  220. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  221. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  222. package/dist/test/mocks/mock-collection-name-cache.d.ts +9 -9
  223. package/dist/test/mocks/mock-collection-name-cache.js +17 -17
  224. package/dist/test/mocks/mock-search-responses.d.ts +21 -21
  225. package/dist/test/mocks/mock-search-responses.js +709 -709
  226. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  227. package/dist/test/mocks/mock-search-service.js +50 -50
  228. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  229. package/dist/test/restoration-state-handler.test.js +270 -270
  230. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  231. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  232. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  233. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  234. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  235. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +378 -378
  236. package/dist/test/text-overlay.test.d.ts +1 -1
  237. package/dist/test/text-overlay.test.js +48 -48
  238. package/dist/test/text-snippet-block.test.d.ts +1 -1
  239. package/dist/test/text-snippet-block.test.js +57 -57
  240. package/dist/test/tile-stats.test.d.ts +1 -1
  241. package/dist/test/tile-stats.test.js +33 -33
  242. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  243. package/dist/test/tiles/grid/account-tile.test.js +76 -76
  244. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  245. package/dist/test/tiles/grid/collection-tile.test.js +73 -73
  246. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  247. package/dist/test/tiles/grid/item-tile.test.js +254 -254
  248. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -1
  249. package/dist/test/tiles/grid/search-tile.test.js +51 -51
  250. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  251. package/dist/test/tiles/hover/hover-pane-controller.test.js +258 -258
  252. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  253. package/dist/test/tiles/hover/tile-hover-pane.test.js +13 -13
  254. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  255. package/dist/test/tiles/list/tile-list-compact.test.js +143 -143
  256. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  257. package/dist/test/tiles/list/tile-list.test.js +242 -242
  258. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  259. package/dist/test/tiles/tile-dispatcher.test.js +94 -94
  260. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  261. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  262. package/dist/test/utils/array-equals.test.d.ts +1 -1
  263. package/dist/test/utils/array-equals.test.js +26 -26
  264. package/dist/test/utils/format-count.test.d.ts +1 -1
  265. package/dist/test/utils/format-count.test.js +23 -23
  266. package/dist/test/utils/format-date.test.d.ts +1 -1
  267. package/dist/test/utils/format-date.test.js +17 -17
  268. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  269. package/dist/test/utils/format-unit-size.test.js +17 -17
  270. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  271. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  272. package/local.archive.org.cert +86 -86
  273. package/local.archive.org.key +27 -27
  274. package/package.json +2 -2
  275. package/renovate.json +6 -6
  276. package/src/app-root.ts +159 -82
  277. package/src/collection-browser.ts +25 -22
  278. package/src/collection-facets/facet-row.ts +274 -0
  279. package/src/collection-facets/facets-template.ts +49 -196
  280. package/src/models.ts +18 -2
  281. package/test/collection-browser.test.ts +36 -4
  282. package/test/collection-facets/facet-row.test.ts +328 -0
  283. package/test/collection-facets/facets-template.test.ts +72 -110
  284. package/test/collection-facets.test.ts +69 -101
  285. package/tsconfig.json +21 -21
  286. package/web-dev-server.config.mjs +30 -30
  287. package/web-test-runner.config.mjs +41 -41
  288. package/dist/src/selected-facets.d.ts +0 -67
  289. package/dist/src/selected-facets.js +0 -149
  290. package/dist/src/selected-facets.js.map +0 -1
  291. package/src/selected-facets.ts +0 -216
@@ -0,0 +1,328 @@
1
+ import { expect, fixture } from '@open-wc/testing';
2
+ import sinon from 'sinon';
3
+ import { html } from 'lit';
4
+ import type { FacetRow } from '../../src/collection-facets/facet-row';
5
+ import '../../src/collection-facets/facet-row';
6
+ import type { FacetState } from '../../src/models';
7
+ import { MockCollectionNameCache } from '../mocks/mock-collection-name-cache';
8
+
9
+ describe('Facet row', () => {
10
+ it('renders nothing if no bucket provided', async () => {
11
+ const el = await fixture<FacetRow>(
12
+ html`<facet-row .facetType=${'subject'}></facet-row>`
13
+ );
14
+
15
+ expect(el.shadowRoot?.querySelector('.facet-row-container')).not.to.exist;
16
+ });
17
+
18
+ it('renders nothing if no facet type provided', async () => {
19
+ const bucket = {
20
+ key: 'foo',
21
+ state: 'none' as FacetState,
22
+ count: 5,
23
+ };
24
+
25
+ const el = await fixture<FacetRow>(
26
+ html`<facet-row .bucket=${bucket}></facet-row>`
27
+ );
28
+
29
+ expect(el.shadowRoot?.querySelector('.facet-row-container')).not.to.exist;
30
+ });
31
+
32
+ it('renders provided bucket as facet row', async () => {
33
+ const bucket = {
34
+ key: 'foo',
35
+ state: 'none' as FacetState,
36
+ count: 5,
37
+ };
38
+
39
+ const el = await fixture<FacetRow>(
40
+ html`<facet-row .facetType=${'subject'} .bucket=${bucket}></facet-row>`
41
+ );
42
+
43
+ expect(el.shadowRoot?.querySelector('.facet-row-container')).to.exist;
44
+ expect(
45
+ el.shadowRoot?.querySelectorAll('input[type="checkbox"]')
46
+ ).to.have.length(2);
47
+ expect(el.shadowRoot?.querySelectorAll('label')).to.have.length(2);
48
+
49
+ expect(el.shadowRoot?.textContent?.trim()).to.match(/^foo\s*5$/);
50
+ });
51
+
52
+ it('renders locale-appropriate facet count', async () => {
53
+ const bucket = {
54
+ key: 'foo',
55
+ state: 'none' as FacetState,
56
+ count: 54321,
57
+ };
58
+
59
+ const el = await fixture<FacetRow>(
60
+ html`<facet-row .facetType=${'subject'} .bucket=${bucket}></facet-row>`
61
+ );
62
+
63
+ const facetCount = el.shadowRoot?.querySelector('.facet-count');
64
+ expect(facetCount?.textContent).to.equal('54,321');
65
+ });
66
+
67
+ it('renders selected facets with checked checkbox', async () => {
68
+ const bucket = {
69
+ key: 'foo',
70
+ state: 'selected' as FacetState,
71
+ count: 5,
72
+ };
73
+
74
+ const el = await fixture<FacetRow>(
75
+ html`<facet-row .facetType=${'subject'} .bucket=${bucket}></facet-row>`
76
+ );
77
+
78
+ // "Positive" checkbox is checked; "Negative" checkbox is not checked
79
+ const selectCheckbox = el.shadowRoot?.querySelector(
80
+ '.select-facet-checkbox'
81
+ ) as HTMLInputElement;
82
+ const hideCheckbox = el.shadowRoot?.querySelector(
83
+ '.hide-facet-checkbox'
84
+ ) as HTMLInputElement;
85
+ expect(selectCheckbox?.checked).to.be.true;
86
+ expect(hideCheckbox?.checked).to.be.false;
87
+
88
+ // Eye icon is not in its active state
89
+ expect(
90
+ el.shadowRoot?.querySelector('.hide-facet-icon')
91
+ ).to.exist.and.satisfy(
92
+ (icon: HTMLElement) => !icon.classList.contains('active')
93
+ );
94
+ });
95
+
96
+ it('renders hidden facets with closed eye icon', async () => {
97
+ const bucket = {
98
+ key: 'foo',
99
+ state: 'hidden' as FacetState,
100
+ count: 5,
101
+ };
102
+
103
+ const el = await fixture<FacetRow>(
104
+ html`<facet-row .facetType=${'subject'} .bucket=${bucket}></facet-row>`
105
+ );
106
+
107
+ // "Positive" checkbox is not checked; "Negative" checkbox is checked
108
+ const selectCheckbox = el.shadowRoot?.querySelector(
109
+ '.select-facet-checkbox'
110
+ ) as HTMLInputElement;
111
+ const hideCheckbox = el.shadowRoot?.querySelector(
112
+ '.hide-facet-checkbox'
113
+ ) as HTMLInputElement;
114
+ expect(selectCheckbox?.checked).to.be.false;
115
+ expect(hideCheckbox?.checked).to.be.true;
116
+
117
+ // Eye icon is in its "active" state
118
+ expect(
119
+ el.shadowRoot?.querySelector('.hide-facet-icon')
120
+ ).to.exist.and.satisfy((icon: HTMLElement) =>
121
+ icon.classList.contains('active')
122
+ );
123
+ });
124
+
125
+ it('renders collection facets as links', async () => {
126
+ const collectionNameCache = new MockCollectionNameCache();
127
+ const bucket = {
128
+ key: 'foo',
129
+ state: 'none' as FacetState,
130
+ count: 5,
131
+ };
132
+
133
+ const el = await fixture<FacetRow>(
134
+ html`<facet-row
135
+ .facetType=${'collection'}
136
+ .bucket=${bucket}
137
+ .collectionNameCache=${collectionNameCache}
138
+ ></facet-row>`
139
+ );
140
+
141
+ const collectionName = el.shadowRoot?.querySelector(
142
+ 'async-collection-name'
143
+ );
144
+ expect(collectionName?.parentElement).to.be.instanceOf(HTMLAnchorElement);
145
+ expect(collectionName?.parentElement?.getAttribute('href')).to.equal(
146
+ '/details/foo'
147
+ );
148
+ });
149
+
150
+ it('does not render non-collection facets as links', async () => {
151
+ const collectionNameCache = new MockCollectionNameCache();
152
+ const bucket = {
153
+ key: 'foo',
154
+ state: 'none' as FacetState,
155
+ count: 5,
156
+ };
157
+
158
+ const el = await fixture<FacetRow>(
159
+ html`<facet-row
160
+ .facetType=${'subject'}
161
+ .bucket=${bucket}
162
+ .collectionNameCache=${collectionNameCache}
163
+ ></facet-row>`
164
+ );
165
+
166
+ expect(el.shadowRoot?.querySelector('a:link')).not.to.exist;
167
+ });
168
+
169
+ it('emits event when facet checkbox is clicked', async () => {
170
+ const facetClickSpy = sinon.spy();
171
+ const bucket = {
172
+ key: 'foo',
173
+ state: 'none' as FacetState,
174
+ count: 5,
175
+ };
176
+
177
+ const el = await fixture<FacetRow>(
178
+ html`<facet-row
179
+ .facetType=${'subject'}
180
+ .bucket=${bucket}
181
+ @facetClick=${facetClickSpy}
182
+ ></facet-row>`
183
+ );
184
+
185
+ const positiveFacetCheck = el.shadowRoot?.querySelector(
186
+ '.select-facet-checkbox'
187
+ ) as HTMLInputElement;
188
+ expect(positiveFacetCheck).to.exist;
189
+ positiveFacetCheck.click();
190
+
191
+ expect(facetClickSpy.callCount).to.equal(1);
192
+ expect(facetClickSpy.lastCall.args[0]?.detail).to.deep.equal({
193
+ facetType: 'subject',
194
+ bucket,
195
+ negative: false,
196
+ });
197
+ });
198
+
199
+ it('emits event when facet checkbox is unchecked', async () => {
200
+ const facetClickSpy = sinon.spy();
201
+ const bucket = {
202
+ key: 'foo',
203
+ state: 'selected' as FacetState,
204
+ count: 5,
205
+ };
206
+
207
+ const el = await fixture<FacetRow>(
208
+ html`<facet-row
209
+ .facetType=${'subject'}
210
+ .bucket=${bucket}
211
+ @facetClick=${facetClickSpy}
212
+ ></facet-row>`
213
+ );
214
+
215
+ const positiveFacetCheck = el.shadowRoot?.querySelector(
216
+ '.select-facet-checkbox'
217
+ ) as HTMLInputElement;
218
+ expect(positiveFacetCheck).to.exist;
219
+ positiveFacetCheck.click();
220
+
221
+ expect(facetClickSpy.callCount).to.equal(1);
222
+ expect(facetClickSpy.lastCall.args[0]?.detail).to.deep.equal({
223
+ facetType: 'subject',
224
+ bucket,
225
+ negative: false,
226
+ });
227
+ });
228
+
229
+ it('emits event when facet negative icon is clicked', async () => {
230
+ const facetClickSpy = sinon.spy();
231
+ const bucket = {
232
+ key: 'foo',
233
+ state: 'none' as FacetState,
234
+ count: 5,
235
+ };
236
+
237
+ const el = await fixture<FacetRow>(
238
+ html`<facet-row
239
+ .facetType=${'subject'}
240
+ .bucket=${bucket}
241
+ @facetClick=${facetClickSpy}
242
+ ></facet-row>`
243
+ );
244
+
245
+ const negativeFacetIcon = el.shadowRoot?.querySelector(
246
+ '.hide-facet-icon'
247
+ ) as HTMLLabelElement;
248
+ expect(negativeFacetIcon).to.exist;
249
+ negativeFacetIcon.click();
250
+
251
+ expect(facetClickSpy.callCount).to.equal(1);
252
+ expect(facetClickSpy.lastCall.args[0]?.detail).to.deep.equal({
253
+ facetType: 'subject',
254
+ bucket,
255
+ negative: true,
256
+ });
257
+ });
258
+
259
+ it('emits event when facet negative icon is unchecked', async () => {
260
+ const facetClickSpy = sinon.spy();
261
+ const bucket = {
262
+ key: 'foo',
263
+ state: 'hidden' as FacetState,
264
+ count: 5,
265
+ };
266
+
267
+ const el = await fixture<FacetRow>(
268
+ html`<facet-row
269
+ .facetType=${'subject'}
270
+ .bucket=${bucket}
271
+ @facetClick=${facetClickSpy}
272
+ ></facet-row>`
273
+ );
274
+
275
+ const negativeFacetIcon = el.shadowRoot?.querySelector(
276
+ '.hide-facet-icon'
277
+ ) as HTMLLabelElement;
278
+ expect(negativeFacetIcon).to.exist;
279
+ negativeFacetIcon.click();
280
+
281
+ expect(facetClickSpy.callCount).to.equal(1);
282
+ expect(facetClickSpy.lastCall.args[0]?.detail).to.deep.equal({
283
+ facetType: 'subject',
284
+ bucket,
285
+ negative: true,
286
+ });
287
+ });
288
+
289
+ it('selects/deselects facet when label is clicked', async () => {
290
+ const facetClickSpy = sinon.spy();
291
+ const bucket = {
292
+ key: 'foo',
293
+ state: 'none' as FacetState,
294
+ count: 5,
295
+ };
296
+
297
+ const el = await fixture<FacetRow>(
298
+ html`<facet-row
299
+ .facetType=${'subject'}
300
+ .bucket=${bucket}
301
+ @facetClick=${facetClickSpy}
302
+ ></facet-row>`
303
+ );
304
+
305
+ const facetLabel = el.shadowRoot?.querySelector(
306
+ '.facet-info-display'
307
+ ) as HTMLLabelElement;
308
+ expect(facetLabel).to.exist;
309
+
310
+ // Select facet by clicking label
311
+ facetLabel.click();
312
+ expect(facetClickSpy.callCount).to.equal(1);
313
+ expect(facetClickSpy.lastCall.args[0]?.detail).to.deep.equal({
314
+ facetType: 'subject',
315
+ bucket,
316
+ negative: false,
317
+ });
318
+
319
+ // Deselect facet by clicking label
320
+ facetLabel.click();
321
+ expect(facetClickSpy.callCount).to.equal(2);
322
+ expect(facetClickSpy.lastCall.args[0]?.detail).to.deep.equal({
323
+ facetType: 'subject',
324
+ bucket,
325
+ negative: false,
326
+ });
327
+ });
328
+ });
@@ -3,9 +3,10 @@ import sinon from 'sinon';
3
3
  import { html } from 'lit';
4
4
  import type { FacetsTemplate } from '../../src/collection-facets/facets-template';
5
5
  import '../../src/collection-facets/facets-template';
6
- import { getDefaultSelectedFacets, FacetEventDetails } from '../../src/models';
6
+ import type { FacetRow } from '../../src/collection-facets/facet-row';
7
+ import type { FacetGroup } from '../../src/models';
7
8
 
8
- const facetGroup = {
9
+ const facetGroup: FacetGroup = {
9
10
  title: 'Media Type',
10
11
  key: 'mediatype',
11
12
  buckets: [
@@ -24,7 +25,7 @@ describe('Render facets', () => {
24
25
  );
25
26
  await el.updateComplete;
26
27
 
27
- expect(el.shadowRoot?.querySelector('.facet-row')).to.exist;
28
+ expect(el.shadowRoot?.querySelector('facet-row')).to.exist;
28
29
  });
29
30
 
30
31
  it('facets render on page', async () => {
@@ -34,7 +35,6 @@ describe('Render facets', () => {
34
35
  .renderOn=${'page'}
35
36
  ></facets-template>`
36
37
  );
37
- await el.updateComplete;
38
38
 
39
39
  expect(el.shadowRoot?.querySelector('.facets-on-page')).to.exist;
40
40
  });
@@ -46,158 +46,120 @@ describe('Render facets', () => {
46
46
  .renderOn=${'modal'}
47
47
  ></facets-template>`
48
48
  );
49
- await el.updateComplete;
50
49
 
51
50
  expect(el.shadowRoot?.querySelector('.facets-on-modal')).to.exist;
52
51
  });
53
52
 
54
- it('find facet-title and facet-count for particular facet group', async () => {
53
+ it('applies correct bucket values to facet row', async () => {
55
54
  const el = await fixture<FacetsTemplate>(
56
55
  html`<facets-template .facetGroup=${facetGroup}></facets-template>`
57
56
  );
58
- await el.updateComplete;
59
57
 
60
- const facetInfo = el.shadowRoot?.querySelector('.facet-info-display');
61
- expect(facetInfo?.querySelector('.facet-title')?.textContent).to.equal(
62
- 'audio'
63
- );
64
- expect(
65
- facetInfo?.querySelector('.facet-count')?.textContent?.trim()
66
- ).to.equal('1,001');
67
- });
58
+ const facetRows = el.shadowRoot?.querySelectorAll('facet-row');
59
+ expect(facetRows?.length).to.equal(facetGroup.buckets.length);
68
60
 
69
- it('find the hidden facet item', async () => {
70
- const selectedFacets = { ...facetGroup };
71
- selectedFacets.buckets[2].state = 'hidden'; // hide 'texts' mediatype
61
+ facetRows?.forEach((elmt, i) => {
62
+ const facetRow = elmt as FacetRow;
63
+ expect(facetRow).to.exist;
64
+ expect(facetRow.bucket).to.equal(facetGroup.buckets[i]);
65
+ expect(facetRow.facetType).to.equal(facetGroup.key);
66
+ });
67
+ });
72
68
 
69
+ it('emits facet click and change events when a facet is selected/deselected', async () => {
70
+ const facetClickSpy = sinon.spy();
71
+ const facetChangeSpy = sinon.spy();
73
72
  const el = await fixture<FacetsTemplate>(
74
73
  html`<facets-template
75
74
  .facetGroup=${facetGroup}
76
- .selectedFacets=${selectedFacets}
75
+ @facetClick=${facetClickSpy}
76
+ @selectedFacetsChanged=${facetChangeSpy}
77
77
  ></facets-template>`
78
78
  );
79
- await el.updateComplete;
80
-
81
- const hiddenFacet = el.shadowRoot?.querySelectorAll('.hide-facet-icon')[0];
82
79
 
83
- // check title attribute for 'texts' mediatype
84
- expect(hiddenFacet?.getAttribute('title')).equal('Unhide mediatype: texts');
85
- });
86
-
87
- it('find the selected facet item', async () => {
88
- const selectedFacets = { ...facetGroup };
89
- selectedFacets.buckets[1].state = 'selected'; // select 'movies' mediatype
80
+ const facetRow = el.shadowRoot?.querySelector('facet-row') as FacetRow;
81
+ expect(facetRow).to.exist;
90
82
 
91
- const el = await fixture<FacetsTemplate>(
92
- html`<facets-template
93
- .facetGroup=${facetGroup}
94
- .selectedFacets=${selectedFacets}
95
- ></facets-template>`
96
- );
97
- await el.updateComplete;
83
+ const facetSelectCheck = facetRow.shadowRoot?.querySelector(
84
+ '.select-facet-checkbox'
85
+ ) as HTMLInputElement;
86
+ expect(facetSelectCheck).to.exist;
98
87
 
99
- const selectedFacet =
100
- el.shadowRoot?.querySelectorAll('.hide-facet-icon')[0];
88
+ facetSelectCheck.click();
89
+ expect(facetClickSpy.callCount).to.equal(1);
90
+ expect(facetChangeSpy.callCount).to.equal(1);
91
+ expect(facetRow.bucket?.state).to.equal('selected');
101
92
 
102
- // check title attribute for 'movies' mediatype
103
- expect(selectedFacet?.getAttribute('title')).equal(
104
- 'Hide mediatype: movies'
105
- );
93
+ facetSelectCheck.click();
94
+ expect(facetClickSpy.callCount).to.equal(2);
95
+ expect(facetChangeSpy.callCount).to.equal(2);
96
+ expect(facetRow.bucket?.state).to.equal('none');
106
97
  });
107
98
 
108
- it('emits facetClick events for normal facets', async () => {
99
+ it('emits facet click and change events when a facet is negated/un-negated', async () => {
109
100
  const facetClickSpy = sinon.spy();
110
- const mediatypeGroup = {
111
- title: 'Media Type',
112
- key: 'mediatype',
113
- buckets: [
114
- { displayText: 'audio', key: 'audio', count: 42, state: 'none' },
115
- ],
116
- };
117
- const selectedFacets = getDefaultSelectedFacets();
101
+ const facetChangeSpy = sinon.spy();
118
102
  const el = await fixture<FacetsTemplate>(
119
103
  html`<facets-template
120
- .facetGroup=${mediatypeGroup}
121
- .selectedFacets=${selectedFacets}
104
+ .facetGroup=${facetGroup}
122
105
  @facetClick=${facetClickSpy}
106
+ @selectedFacetsChanged=${facetChangeSpy}
123
107
  ></facets-template>`
124
108
  );
125
109
 
126
- const checkbox = el.shadowRoot?.querySelector(
127
- '.select-facet-checkbox'
110
+ const facetRow = el.shadowRoot?.querySelector('facet-row') as FacetRow;
111
+ expect(facetRow).to.exist;
112
+
113
+ const facetNegateCheck = facetRow.shadowRoot?.querySelector(
114
+ '.hide-facet-checkbox'
128
115
  ) as HTMLInputElement;
129
- expect(checkbox).to.exist;
116
+ expect(facetNegateCheck).to.exist;
130
117
 
131
- // Select it
132
- checkbox.click();
133
- await el.updateComplete;
118
+ facetNegateCheck.click();
134
119
  expect(facetClickSpy.callCount).to.equal(1);
120
+ expect(facetChangeSpy.callCount).to.equal(1);
121
+ expect(facetRow.bucket?.state).to.equal('hidden');
135
122
 
136
- const selectEvent = facetClickSpy
137
- .args[0][0] as CustomEvent<FacetEventDetails>;
138
- expect(selectEvent).to.exist;
139
- expect(selectEvent?.detail?.key).to.equal('mediatype');
140
- expect(selectEvent?.detail?.state).to.equal('selected');
141
- expect(selectEvent?.detail?.negative).to.be.false;
142
-
143
- // Unselect it
144
- checkbox.click();
145
- await el.updateComplete;
123
+ facetNegateCheck.click();
146
124
  expect(facetClickSpy.callCount).to.equal(2);
147
-
148
- const unselectEvent = facetClickSpy
149
- .args[1][0] as CustomEvent<FacetEventDetails>;
150
- expect(unselectEvent).to.exist;
151
- expect(unselectEvent?.detail?.key).to.equal('mediatype');
152
- expect(unselectEvent?.detail?.state).to.equal('none');
153
- expect(unselectEvent?.detail?.negative).to.be.false;
125
+ expect(facetChangeSpy.callCount).to.equal(2);
126
+ expect(facetRow.bucket?.state).to.equal('none');
154
127
  });
155
128
 
156
- it('emits facetClick events for negative facets', async () => {
129
+ it('emits facet click and change events when a pre-selected facet is deselected', async () => {
157
130
  const facetClickSpy = sinon.spy();
158
- const mediatypeGroup = {
159
- title: 'Media Type',
160
- key: 'mediatype',
161
- buckets: [
162
- { displayText: 'audio', key: 'audio', count: 42, state: 'none' },
163
- ],
164
- };
165
- const selectedFacets = getDefaultSelectedFacets();
131
+ const facetChangeSpy = sinon.spy();
132
+ const facetGroupWithSelection = { ...facetGroup };
133
+ facetGroupWithSelection.buckets = [
134
+ { ...facetGroup.buckets[0], state: 'selected' },
135
+ ...facetGroup.buckets.slice(1),
136
+ ];
137
+
166
138
  const el = await fixture<FacetsTemplate>(
167
139
  html`<facets-template
168
- .facetGroup=${mediatypeGroup}
169
- .selectedFacets=${selectedFacets}
140
+ .facetGroup=${facetGroupWithSelection}
170
141
  @facetClick=${facetClickSpy}
142
+ @selectedFacetsChanged=${facetChangeSpy}
171
143
  ></facets-template>`
172
144
  );
173
145
 
174
- const checkbox = el.shadowRoot?.querySelector(
175
- '.hide-facet-checkbox'
146
+ const facetRow = el.shadowRoot?.querySelector('facet-row') as FacetRow;
147
+ expect(facetRow).to.exist;
148
+
149
+ const facetSelectCheck = facetRow.shadowRoot?.querySelector(
150
+ '.select-facet-checkbox'
176
151
  ) as HTMLInputElement;
177
- expect(checkbox).to.exist;
152
+ expect(facetSelectCheck).to.exist;
153
+ expect(facetSelectCheck.checked).to.be.true;
178
154
 
179
- // Select it
180
- checkbox.click();
181
- await el.updateComplete;
155
+ facetSelectCheck.click();
182
156
  expect(facetClickSpy.callCount).to.equal(1);
157
+ expect(facetChangeSpy.callCount).to.equal(1);
158
+ expect(facetRow.bucket?.state).to.equal('none');
183
159
 
184
- const selectEvent = facetClickSpy
185
- .args[0][0] as CustomEvent<FacetEventDetails>;
186
- expect(selectEvent).to.exist;
187
- expect(selectEvent?.detail?.key).to.equal('mediatype');
188
- expect(selectEvent?.detail?.state).to.equal('hidden');
189
- expect(selectEvent?.detail?.negative).to.be.true;
190
-
191
- // Unselect it
192
- checkbox.click();
193
- await el.updateComplete;
160
+ facetSelectCheck.click();
194
161
  expect(facetClickSpy.callCount).to.equal(2);
195
-
196
- const unselectEvent = facetClickSpy
197
- .args[1][0] as CustomEvent<FacetEventDetails>;
198
- expect(unselectEvent).to.exist;
199
- expect(unselectEvent?.detail?.key).to.equal('mediatype');
200
- expect(unselectEvent?.detail?.state).to.equal('none');
201
- expect(unselectEvent?.detail?.negative).to.be.true;
162
+ expect(facetChangeSpy.callCount).to.equal(2);
163
+ expect(facetRow.bucket?.state).to.equal('selected');
202
164
  });
203
165
  });