@internetarchive/collection-browser 0.3.10-alpha.1 → 0.4.1

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 (254) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +26 -26
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.js +9 -9
  11. package/dist/src/app-root.d.ts +48 -48
  12. package/dist/src/app-root.js +258 -258
  13. package/dist/src/app-root.js.map +1 -1
  14. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  15. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  16. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  17. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  18. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  19. package/dist/src/assets/img/icons/chevron.js +2 -2
  20. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  21. package/dist/src/assets/img/icons/empty-query.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 +5 -17
  30. package/dist/src/assets/img/icons/login-required.js.map +1 -1
  31. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  32. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  33. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  34. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  35. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  36. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  37. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  38. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  39. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  40. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  41. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  42. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  43. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  44. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  45. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  55. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  56. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  57. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  58. package/dist/src/assets/img/icons/null-result.js +2 -2
  59. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  60. package/dist/src/assets/img/icons/restricted.js +3 -19
  61. package/dist/src/assets/img/icons/restricted.js.map +1 -1
  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 +315 -278
  71. package/dist/src/collection-browser.js +1275 -1119
  72. package/dist/src/collection-browser.js.map +1 -1
  73. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  74. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  75. package/dist/src/collection-facets/facets-template.d.ts +16 -16
  76. package/dist/src/collection-facets/facets-template.js +125 -125
  77. package/dist/src/collection-facets/more-facets-content.d.ts +77 -76
  78. package/dist/src/collection-facets/more-facets-content.js +357 -353
  79. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  80. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  81. package/dist/src/collection-facets/more-facets-pagination.js +192 -192
  82. package/dist/src/collection-facets.d.ts +78 -77
  83. package/dist/src/collection-facets.js +393 -389
  84. package/dist/src/collection-facets.js.map +1 -1
  85. package/dist/src/empty-placeholder.d.ts +11 -11
  86. package/dist/src/empty-placeholder.js +42 -42
  87. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  88. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  89. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  90. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  91. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  92. package/dist/src/mediatype/mediatype-config.js +85 -85
  93. package/dist/src/models.d.ts +112 -103
  94. package/dist/src/models.js +125 -117
  95. package/dist/src/models.js.map +1 -1
  96. package/dist/src/restoration-state-handler.d.ts +45 -46
  97. package/dist/src/restoration-state-handler.js +230 -230
  98. package/dist/src/restoration-state-handler.js.map +1 -1
  99. package/dist/src/sort-filter-bar/alpha-bar.d.ts +12 -9
  100. package/dist/src/sort-filter-bar/alpha-bar.js +69 -50
  101. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  102. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  103. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  104. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  105. package/dist/src/sort-filter-bar/img/list.js +2 -2
  106. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  107. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  108. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  109. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  110. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +108 -107
  111. package/dist/src/sort-filter-bar/sort-filter-bar.js +430 -423
  112. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  113. package/dist/src/styles/item-image-styles.d.ts +8 -8
  114. package/dist/src/styles/item-image-styles.js +12 -15
  115. package/dist/src/styles/item-image-styles.js.map +1 -1
  116. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  117. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  118. package/dist/src/tiles/grid/account-tile.d.ts +8 -8
  119. package/dist/src/tiles/grid/account-tile.js +20 -20
  120. package/dist/src/tiles/grid/collection-tile.d.ts +7 -7
  121. package/dist/src/tiles/grid/collection-tile.js +23 -23
  122. package/dist/src/tiles/grid/item-tile.d.ts +24 -24
  123. package/dist/src/tiles/grid/item-tile.js +89 -87
  124. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  125. package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
  126. package/dist/src/tiles/grid/tile-stats.js +40 -40
  127. package/dist/src/tiles/image-block.d.ts +17 -17
  128. package/dist/src/tiles/image-block.js +77 -69
  129. package/dist/src/tiles/image-block.js.map +1 -1
  130. package/dist/src/tiles/item-image.d.ts +31 -31
  131. package/dist/src/tiles/item-image.js +106 -106
  132. package/dist/src/tiles/list/account-label.d.ts +1 -1
  133. package/dist/src/tiles/list/account-label.js +6 -6
  134. package/dist/src/tiles/list/date-label.d.ts +1 -1
  135. package/dist/src/tiles/list/date-label.js +12 -12
  136. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
  137. package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
  138. package/dist/src/tiles/list/tile-list-compact.d.ts +21 -21
  139. package/dist/src/tiles/list/tile-list-compact.js +93 -93
  140. package/dist/src/tiles/list/tile-list.d.ts +50 -50
  141. package/dist/src/tiles/list/tile-list.js +276 -276
  142. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  143. package/dist/src/tiles/mediatype-icon.js +47 -47
  144. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -7
  145. package/dist/src/tiles/overlay/icon-overlay.js +63 -33
  146. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -1
  147. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -0
  148. package/dist/src/tiles/overlay/icon-text-overlay.js +83 -0
  149. package/dist/src/tiles/overlay/icon-text-overlay.js.map +1 -0
  150. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -8
  151. package/dist/src/tiles/overlay/text-overlay.js +63 -35
  152. package/dist/src/tiles/overlay/text-overlay.js.map +1 -1
  153. package/dist/src/tiles/text-snippet-block.d.ts +29 -29
  154. package/dist/src/tiles/text-snippet-block.js +81 -81
  155. package/dist/src/tiles/tile-dispatcher.d.ts +36 -36
  156. package/dist/src/tiles/tile-dispatcher.js +128 -128
  157. package/dist/src/utils/analytics-events.d.ts +22 -22
  158. package/dist/src/utils/analytics-events.js +24 -24
  159. package/dist/src/utils/format-count.d.ts +7 -7
  160. package/dist/src/utils/format-count.js +76 -76
  161. package/dist/src/utils/format-date.d.ts +2 -2
  162. package/dist/src/utils/format-date.js +23 -23
  163. package/dist/test/collection-browser.test.d.ts +1 -1
  164. package/dist/test/collection-browser.test.js +647 -575
  165. package/dist/test/collection-browser.test.js.map +1 -1
  166. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  167. package/dist/test/collection-facets/facets-template.test.js +62 -62
  168. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  169. package/dist/test/collection-facets/more-facets-content.test.js +114 -114
  170. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
  171. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  172. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  173. package/dist/test/collection-facets.test.d.ts +2 -2
  174. package/dist/test/collection-facets.test.js +544 -544
  175. package/dist/test/empty-placeholder.test.d.ts +1 -1
  176. package/dist/test/empty-placeholder.test.js +33 -33
  177. package/dist/test/icon-overlay.test.d.ts +1 -1
  178. package/dist/test/icon-overlay.test.js +24 -24
  179. package/dist/test/image-block.test.d.ts +1 -1
  180. package/dist/test/image-block.test.js +48 -48
  181. package/dist/test/item-image.test.d.ts +1 -1
  182. package/dist/test/item-image.test.js +80 -80
  183. package/dist/test/item-image.test.js.map +1 -1
  184. package/dist/test/mediatype-config.test.d.ts +1 -1
  185. package/dist/test/mediatype-config.test.js +16 -16
  186. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  187. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  188. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
  189. package/dist/test/mocks/mock-collection-name-cache.js +13 -13
  190. package/dist/test/mocks/mock-search-responses.d.ts +12 -10
  191. package/dist/test/mocks/mock-search-responses.js +341 -271
  192. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  193. package/dist/test/mocks/mock-search-service.d.ts +13 -13
  194. package/dist/test/mocks/mock-search-service.js +40 -36
  195. package/dist/test/mocks/mock-search-service.js.map +1 -1
  196. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  197. package/dist/test/restoration-state-handler.test.js +125 -126
  198. package/dist/test/restoration-state-handler.test.js.map +1 -1
  199. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -0
  200. package/dist/test/sort-filter-bar/alpha-bar.test.js +44 -0
  201. package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -0
  202. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  203. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +145 -113
  204. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
  205. package/dist/test/text-overlay.test.d.ts +1 -1
  206. package/dist/test/text-overlay.test.js +48 -41
  207. package/dist/test/text-overlay.test.js.map +1 -1
  208. package/dist/test/text-snippet-block.test.d.ts +1 -1
  209. package/dist/test/text-snippet-block.test.js +57 -57
  210. package/dist/test/tile-stats.test.d.ts +1 -1
  211. package/dist/test/tile-stats.test.js +33 -33
  212. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  213. package/dist/test/tiles/grid/item-tile.test.js +107 -107
  214. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  215. package/dist/test/tiles/list/tile-list-compact.test.js +92 -92
  216. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  217. package/dist/test/tiles/list/tile-list.test.js +123 -123
  218. package/dist/test/utils/format-count.test.d.ts +1 -1
  219. package/dist/test/utils/format-count.test.js +23 -23
  220. package/dist/test/utils/format-date.test.d.ts +1 -1
  221. package/dist/test/utils/format-date.test.js +17 -17
  222. package/index.html +24 -24
  223. package/local.archive.org.cert +86 -86
  224. package/local.archive.org.key +27 -27
  225. package/package.json +3 -3
  226. package/renovate.json +6 -6
  227. package/src/app-root.ts +1 -1
  228. package/src/assets/img/icons/login-required.ts +3 -15
  229. package/src/assets/img/icons/restricted.ts +1 -17
  230. package/src/collection-browser.ts +273 -57
  231. package/src/collection-facets/more-facets-content.ts +6 -2
  232. package/src/collection-facets.ts +6 -2
  233. package/src/models.ts +15 -0
  234. package/src/restoration-state-handler.ts +7 -5
  235. package/src/sort-filter-bar/alpha-bar.ts +26 -9
  236. package/src/sort-filter-bar/sort-filter-bar.ts +9 -0
  237. package/src/styles/item-image-styles.ts +3 -6
  238. package/src/tiles/grid/item-tile.ts +2 -0
  239. package/src/tiles/image-block.ts +8 -0
  240. package/src/tiles/overlay/icon-overlay.ts +33 -3
  241. package/src/tiles/overlay/icon-text-overlay.ts +75 -0
  242. package/src/tiles/overlay/text-overlay.ts +34 -7
  243. package/test/collection-browser.test.ts +90 -10
  244. package/test/collection-facets/more-facets-content.test.ts +2 -2
  245. package/test/item-image.test.ts +2 -2
  246. package/test/mocks/mock-search-responses.ts +78 -0
  247. package/test/mocks/mock-search-service.ts +6 -0
  248. package/test/restoration-state-handler.test.ts +0 -3
  249. package/test/sort-filter-bar/alpha-bar.test.ts +52 -0
  250. package/test/sort-filter-bar/sort-filter-bar.test.ts +44 -0
  251. package/test/text-overlay.test.ts +10 -3
  252. package/tsconfig.json +21 -21
  253. package/web-dev-server.config.mjs +30 -30
  254. package/web-test-runner.config.mjs +41 -41
@@ -1,621 +1,693 @@
1
- /* eslint-disable import/no-duplicates */
2
- import { expect, fixture } from '@open-wc/testing';
3
- import { html } from 'lit';
4
- import sinon from 'sinon';
5
- import { SearchType } from '@internetarchive/search-service';
6
- import '../src/collection-browser';
7
- import { defaultSelectedFacets, SortField, } from '../src/models';
8
- import { MockSearchService } from './mocks/mock-search-service';
9
- import { MockCollectionNameCache } from './mocks/mock-collection-name-cache';
10
- import { MockAnalyticsHandler } from './mocks/mock-analytics-handler';
11
- import { analyticsCategories } from '../src/utils/analytics-events';
12
- describe('Collection Browser', () => {
13
- beforeEach(async () => {
14
- // Apparently query params set by one test can bleed into other tests.
15
- // Since collection browser restores its state from certain query params, we need
16
- // to clear these before each test to ensure they run in isolation from one another.
17
- const url = new URL(window.location.href);
18
- const { searchParams } = url;
19
- searchParams.delete('sin');
20
- searchParams.delete('sort');
21
- searchParams.delete('query');
22
- searchParams.delete('page');
23
- searchParams.delete('and[]');
24
- searchParams.delete('not[]');
25
- window.history.replaceState({}, '', url);
26
- });
27
- it('clear existing filter for facets & sort-bar', async () => {
28
- const el = await fixture(html `<collection-browser></collection-browser>`);
29
- el.selectedSort = 'title';
30
- await el.updateComplete;
31
- el.clearFilters();
32
- expect(el.selectedFacets).to.equal(defaultSelectedFacets);
33
- expect(el.selectedSort).to.equal('relevance');
34
- expect(el.sortDirection).to.null;
35
- expect(el.sortParam).to.null;
36
- expect(el.selectedCreatorFilter).to.null;
37
- expect(el.selectedTitleFilter).to.null;
38
- });
39
- it('filterBy creator with analytics', async () => {
40
- const mockAnalyticsHandler = new MockAnalyticsHandler();
1
+ /* eslint-disable import/no-duplicates */
2
+ import { expect, fixture } from '@open-wc/testing';
3
+ import { html } from 'lit';
4
+ import sinon from 'sinon';
5
+ import { SearchType } from '@internetarchive/search-service';
6
+ import '../src/collection-browser';
7
+ import { defaultSelectedFacets, SortField, } from '../src/models';
8
+ import { MockSearchService } from './mocks/mock-search-service';
9
+ import { MockCollectionNameCache } from './mocks/mock-collection-name-cache';
10
+ import { MockAnalyticsHandler } from './mocks/mock-analytics-handler';
11
+ import { analyticsCategories } from '../src/utils/analytics-events';
12
+ /**
13
+ * Wait for the next tick of the event loop.
14
+ *
15
+ * This is necessary in some of the tests because certain collection browser
16
+ * updates take more than one tick to render (e.g., date picker & query changes).
17
+ * These delays are non-ideal and should eventually be investigated and fixed,
18
+ * but they are minor enough that waiting for the next tick is a reasonable
19
+ * testing solution for now.
20
+ */
21
+ const nextTick = () => new Promise(resolve => {
22
+ setTimeout(resolve, 0);
23
+ });
24
+ describe('Collection Browser', () => {
25
+ beforeEach(async () => {
26
+ // Apparently query params set by one test can bleed into other tests.
27
+ // Since collection browser restores its state from certain query params, we need
28
+ // to clear these before each test to ensure they run in isolation from one another.
29
+ const url = new URL(window.location.href);
30
+ const { searchParams } = url;
31
+ searchParams.delete('sin');
32
+ searchParams.delete('sort');
33
+ searchParams.delete('query');
34
+ searchParams.delete('page');
35
+ searchParams.delete('and[]');
36
+ searchParams.delete('not[]');
37
+ window.history.replaceState({}, '', url);
38
+ });
39
+ it('clear existing filter for facets & sort-bar', async () => {
40
+ const el = await fixture(html `<collection-browser></collection-browser>`);
41
+ el.selectedSort = 'title';
42
+ await el.updateComplete;
43
+ el.clearFilters();
44
+ expect(el.selectedFacets).to.equal(defaultSelectedFacets);
45
+ expect(el.selectedSort).to.equal('relevance');
46
+ expect(el.sortDirection).to.null;
47
+ expect(el.sortParam).to.null;
48
+ expect(el.selectedCreatorFilter).to.null;
49
+ expect(el.selectedTitleFilter).to.null;
50
+ });
51
+ it('filterBy creator with analytics', async () => {
52
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
41
53
  const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
42
- </collection-browser>`);
43
- el.searchContext = 'betaSearchService';
44
- el.selectedCreatorFilter = 'A';
45
- await el.updateComplete;
46
- expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
47
- expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
48
- expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
49
- el.clearFilters();
50
- await el.updateComplete;
51
- expect(el.selectedTitleFilter).to.null;
52
- expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
53
- expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
54
- expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
55
- });
56
- it('filterBy title with analytics', async () => {
57
- const mockAnalyticsHandler = new MockAnalyticsHandler();
54
+ </collection-browser>`);
55
+ el.searchContext = 'betaSearchService';
56
+ el.selectedSort = 'creator';
57
+ el.sortDirection = 'asc';
58
+ el.selectedCreatorFilter = 'A';
59
+ await el.updateComplete;
60
+ expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
61
+ expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
62
+ expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
63
+ el.clearFilters();
64
+ await el.updateComplete;
65
+ expect(el.selectedTitleFilter).to.null;
66
+ expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
67
+ expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
68
+ expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
69
+ });
70
+ it('filterBy title with analytics', async () => {
71
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
58
72
  const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
59
- </collection-browser>`);
60
- el.searchContext = 'beta-search-service';
61
- el.selectedSort = 'title';
62
- el.selectedTitleFilter = 'A';
63
- await el.updateComplete;
64
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
65
- expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
66
- expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
67
- el.clearFilters();
68
- await el.updateComplete;
69
- expect(el.selectedTitleFilter).to.null;
70
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
71
- expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
72
- expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
73
- });
74
- it('selected facets with analytics - not negative facets', async () => {
75
- const mockAnalyticsHandler = new MockAnalyticsHandler();
76
- const mediaTypeBucket = { count: 123, state: 'selected' };
77
- const mockedSelectedFacets = {
78
- subject: {},
79
- lending: {},
80
- mediatype: { data: mediaTypeBucket },
81
- language: {},
82
- creator: {},
83
- collection: {},
84
- year: {},
85
- };
73
+ </collection-browser>`);
74
+ el.searchContext = 'beta-search-service';
75
+ el.selectedSort = 'title';
76
+ el.sortDirection = 'asc';
77
+ el.selectedTitleFilter = 'A';
78
+ await el.updateComplete;
79
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
80
+ expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
81
+ expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
82
+ el.clearFilters();
83
+ await el.updateComplete;
84
+ expect(el.selectedTitleFilter).to.null;
85
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
86
+ expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
87
+ expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
88
+ });
89
+ it('selected facets with analytics - not negative facets', async () => {
90
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
91
+ const mediaTypeBucket = { count: 123, state: 'selected' };
92
+ const mockedSelectedFacets = {
93
+ subject: {},
94
+ lending: {},
95
+ mediatype: { data: mediaTypeBucket },
96
+ language: {},
97
+ creator: {},
98
+ collection: {},
99
+ year: {},
100
+ };
86
101
  const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
87
- </collection-browser>`);
88
- el.searchContext = 'search-service';
89
- el.selectedFacets = mockedSelectedFacets;
90
- await el.updateComplete;
91
- el.facetClickHandler('mediatype', true, false);
92
- expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
93
- expect(mockAnalyticsHandler.callAction).to.equal('facetSelected');
94
- expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
95
- el.facetClickHandler('mediatype', false, false);
96
- expect(el.selectedFacets).to.equal(mockedSelectedFacets);
97
- expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
98
- expect(mockAnalyticsHandler.callAction).to.equal('facetDeselected');
99
- expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
100
- });
101
- it('selected facets with analytics - negative facets', async () => {
102
- const mockAnalyticsHandler = new MockAnalyticsHandler();
103
- const mediaTypeBucket = { count: 123, state: 'selected' };
104
- const mockedSelectedFacets = {
105
- subject: {},
106
- lending: {},
107
- mediatype: { data: mediaTypeBucket },
108
- language: {},
109
- creator: {},
110
- collection: {},
111
- year: {},
112
- };
102
+ </collection-browser>`);
103
+ el.searchContext = 'search-service';
104
+ el.selectedFacets = mockedSelectedFacets;
105
+ await el.updateComplete;
106
+ el.facetClickHandler('mediatype', true, false);
107
+ expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
108
+ expect(mockAnalyticsHandler.callAction).to.equal('facetSelected');
109
+ expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
110
+ el.facetClickHandler('mediatype', false, false);
111
+ expect(el.selectedFacets).to.equal(mockedSelectedFacets);
112
+ expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
113
+ expect(mockAnalyticsHandler.callAction).to.equal('facetDeselected');
114
+ expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
115
+ });
116
+ it('selected facets with analytics - negative facets', async () => {
117
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
118
+ const mediaTypeBucket = { count: 123, state: 'selected' };
119
+ const mockedSelectedFacets = {
120
+ subject: {},
121
+ lending: {},
122
+ mediatype: { data: mediaTypeBucket },
123
+ language: {},
124
+ creator: {},
125
+ collection: {},
126
+ year: {},
127
+ };
113
128
  const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
114
- </collection-browser>`);
115
- el.searchContext = 'beta-search-service';
116
- el.selectedFacets = mockedSelectedFacets;
117
- await el.updateComplete;
118
- el.facetClickHandler('mediatype', true, true);
119
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
120
- expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeSelected');
121
- expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
122
- el.facetClickHandler('mediatype', false, true);
123
- expect(el.selectedFacets).to.equal(mockedSelectedFacets);
124
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
125
- expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeDeselected');
126
- expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
127
- });
128
- it('should render with a sort bar, facets, and infinite scroller', async () => {
129
- var _a, _b, _c;
130
- const searchService = new MockSearchService();
129
+ </collection-browser>`);
130
+ el.searchContext = 'beta-search-service';
131
+ el.selectedFacets = mockedSelectedFacets;
132
+ await el.updateComplete;
133
+ el.facetClickHandler('mediatype', true, true);
134
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
135
+ expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeSelected');
136
+ expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
137
+ el.facetClickHandler('mediatype', false, true);
138
+ expect(el.selectedFacets).to.equal(mockedSelectedFacets);
139
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
140
+ expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeDeselected');
141
+ expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
142
+ });
143
+ it('should render with a sort bar, facets, and infinite scroller', async () => {
144
+ var _a, _b, _c;
145
+ const searchService = new MockSearchService();
131
146
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
132
- </collection-browser>`);
133
- el.baseQuery = 'hello';
134
- await el.updateComplete;
135
- const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
136
- const sortBar = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('sort-filter-bar');
137
- const infiniteScroller = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('infinite-scroller');
138
- expect(facets).to.exist;
139
- expect(sortBar).to.exist;
140
- expect(infiniteScroller).to.exist;
141
- });
142
- it('queries the search service when given a base query', async () => {
143
- var _a, _b, _c;
144
- const searchService = new MockSearchService();
147
+ </collection-browser>`);
148
+ el.baseQuery = 'hello';
149
+ await el.updateComplete;
150
+ const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
151
+ const sortBar = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('sort-filter-bar');
152
+ const infiniteScroller = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('infinite-scroller');
153
+ expect(facets).to.exist;
154
+ expect(sortBar).to.exist;
155
+ expect(infiniteScroller).to.exist;
156
+ });
157
+ it('queries the search service when given a base query', async () => {
158
+ var _a, _b, _c;
159
+ const searchService = new MockSearchService();
145
160
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
146
- </collection-browser>`);
147
- el.baseQuery = 'collection:foo';
148
- await el.updateComplete;
149
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
150
- expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
151
- });
152
- it('queries the search service with a metadata search', async () => {
153
- var _a, _b, _c;
154
- const searchService = new MockSearchService();
161
+ </collection-browser>`);
162
+ el.baseQuery = 'collection:foo';
163
+ await el.updateComplete;
164
+ await nextTick();
165
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
166
+ expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
167
+ });
168
+ it('queries the search service with a metadata search', async () => {
169
+ var _a, _b, _c;
170
+ const searchService = new MockSearchService();
155
171
  const el = await fixture(html ` <collection-browser
156
172
  .searchService=${searchService}
157
173
  .searchType=${SearchType.METADATA}
158
174
  >
159
- </collection-browser>`);
160
- el.baseQuery = 'collection:foo';
161
- await el.updateComplete;
162
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
163
- expect(searchService.searchType).to.equal(SearchType.METADATA);
164
- expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
165
- });
166
- it('queries the search service with a fulltext search', async () => {
167
- var _a, _b, _c;
168
- const searchService = new MockSearchService();
175
+ </collection-browser>`);
176
+ el.baseQuery = 'collection:foo';
177
+ await el.updateComplete;
178
+ await nextTick();
179
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
180
+ expect(searchService.searchType).to.equal(SearchType.METADATA);
181
+ expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
182
+ });
183
+ it('queries the search service with a fulltext search', async () => {
184
+ var _a, _b, _c;
185
+ const searchService = new MockSearchService();
169
186
  const el = await fixture(html ` <collection-browser
170
187
  .searchService=${searchService}
171
188
  .searchType=${SearchType.FULLTEXT}
172
189
  >
173
- </collection-browser>`);
174
- el.baseQuery = 'collection:foo';
175
- await el.updateComplete;
176
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
177
- expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
178
- expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
179
- });
180
- it('queries the search service with facets selected/negated', async () => {
181
- var _a;
182
- const searchService = new MockSearchService();
183
- const selectedFacets = {
184
- subject: {
185
- foo: {
186
- key: 'foo',
187
- count: 1,
188
- state: 'selected',
189
- },
190
- bar: {
191
- key: 'bar',
192
- count: 2,
193
- state: 'hidden',
194
- },
195
- },
196
- lending: {},
197
- mediatype: {},
198
- language: {
199
- en: {
200
- key: 'en',
201
- count: 1,
202
- state: 'selected',
203
- },
204
- },
205
- creator: {},
206
- collection: {},
207
- year: {},
208
- };
190
+ </collection-browser>`);
191
+ el.baseQuery = 'collection:foo';
192
+ await el.updateComplete;
193
+ await nextTick();
194
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
195
+ expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
196
+ expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
197
+ });
198
+ it('queries the search service with facets selected/negated', async () => {
199
+ var _a, _b;
200
+ const searchService = new MockSearchService();
201
+ const selectedFacets = {
202
+ subject: {
203
+ foo: {
204
+ key: 'foo',
205
+ count: 1,
206
+ state: 'selected',
207
+ },
208
+ bar: {
209
+ key: 'bar',
210
+ count: 2,
211
+ state: 'hidden',
212
+ },
213
+ },
214
+ lending: {},
215
+ mediatype: {},
216
+ language: {
217
+ en: {
218
+ key: 'en',
219
+ count: 1,
220
+ state: 'selected',
221
+ },
222
+ },
223
+ creator: {},
224
+ collection: {},
225
+ year: {},
226
+ };
209
227
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
210
- </collection-browser>`);
211
- el.baseQuery = 'collection:foo';
212
- el.selectedFacets = selectedFacets;
213
- await el.updateComplete;
214
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo AND (subject:("foo" OR -"bar") AND language:("en"))');
215
- });
216
- it('fires a separate date histogram query when year facets are applied', async () => {
217
- var _a, _b, _c;
218
- const searchService = new MockSearchService();
219
- const selectedFacets = {
220
- subject: {},
221
- lending: {},
222
- mediatype: {},
223
- language: {},
224
- creator: {},
225
- collection: {},
226
- year: {
227
- '2000': {
228
- key: '2000',
229
- state: 'selected',
230
- count: 123,
231
- },
232
- },
233
- };
228
+ </collection-browser>`);
229
+ el.baseQuery = 'collection:foo';
230
+ el.selectedFacets = selectedFacets;
231
+ await el.updateComplete;
232
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
233
+ expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
234
+ subject: {
235
+ foo: 'inc',
236
+ bar: 'exc',
237
+ },
238
+ language: {
239
+ en: 'inc',
240
+ },
241
+ });
242
+ });
243
+ it('fires a separate date histogram query when year facets are applied', async () => {
244
+ var _a, _b, _c;
245
+ const searchService = new MockSearchService();
246
+ const selectedFacets = {
247
+ subject: {},
248
+ lending: {},
249
+ mediatype: {},
250
+ language: {},
251
+ creator: {},
252
+ collection: {},
253
+ year: {
254
+ '2000': {
255
+ key: '2000',
256
+ state: 'selected',
257
+ count: 123,
258
+ },
259
+ },
260
+ };
234
261
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
235
- </collection-browser>`);
236
- el.baseQuery = 'collection:foo';
237
- el.showHistogramDatePicker = true;
238
- el.selectedFacets = selectedFacets;
239
- await el.updateComplete;
240
- expect((_b = (_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.aggregations) === null || _b === void 0 ? void 0 : _b.simpleParams).to.deep.equal(['year']); // Explicitly requests year aggregations
241
- expect((_c = searchService.searchParams) === null || _c === void 0 ? void 0 : _c.query).to.equal('collection:foo' // No date clause on query
242
- );
243
- });
244
- it('fires a separate date histogram query when a date range is applied', async () => {
245
- var _a, _b, _c;
246
- const searchService = new MockSearchService();
262
+ </collection-browser>`);
263
+ el.baseQuery = 'collection:foo';
264
+ el.showHistogramDatePicker = true;
265
+ el.selectedFacets = selectedFacets;
266
+ await el.updateComplete;
267
+ expect((_b = (_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.aggregations) === null || _b === void 0 ? void 0 : _b.simpleParams).to.deep.equal(['year']); // Explicitly requests year aggregations
268
+ expect((_c = searchService.searchParams) === null || _c === void 0 ? void 0 : _c.query).to.equal('collection:foo' // No date clause on query
269
+ );
270
+ });
271
+ it('fires a separate date histogram query when a date range is applied', async () => {
272
+ var _a, _b, _c;
273
+ const searchService = new MockSearchService();
247
274
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
248
- </collection-browser>`);
249
- el.baseQuery = 'collection:foo';
250
- el.showHistogramDatePicker = true;
251
- el.dateRangeQueryClause = 'year:[1995 TO 2005]';
252
- await el.updateComplete;
253
- expect((_b = (_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.aggregations) === null || _b === void 0 ? void 0 : _b.simpleParams).to.deep.equal(['year']); // Explicitly requests year aggregations
254
- expect((_c = searchService.searchParams) === null || _c === void 0 ? void 0 : _c.query).to.equal('collection:foo' // No date clause on query
255
- );
256
- });
257
- it('does not fire a separate date histogram query when no date filters are applied', async () => {
258
- var _a, _b;
259
- const searchService = new MockSearchService();
275
+ </collection-browser>`);
276
+ el.baseQuery = 'collection:foo';
277
+ el.showHistogramDatePicker = true;
278
+ el.minSelectedDate = '1995';
279
+ el.maxSelectedDate = '2005';
280
+ await el.updateComplete;
281
+ expect((_b = (_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.aggregations) === null || _b === void 0 ? void 0 : _b.simpleParams).to.deep.equal(['year']); // Explicitly requests year aggregations
282
+ expect((_c = searchService.searchParams) === null || _c === void 0 ? void 0 : _c.query).to.equal('collection:foo' // No date clause on query
283
+ );
284
+ });
285
+ it('does not fire a separate date histogram query when no date filters are applied', async () => {
286
+ var _a, _b;
287
+ const searchService = new MockSearchService();
260
288
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
261
- </collection-browser>`);
262
- el.baseQuery = 'collection:foo';
263
- el.showHistogramDatePicker = true;
264
- await el.updateComplete;
265
- expect((_b = (_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.aggregations) === null || _b === void 0 ? void 0 : _b.simpleParams).to.satisfy((aggTypes) => !aggTypes || !aggTypes.includes('year') // Not requesting year aggregations explicitly
266
- );
267
- });
268
- it('does not fire a separate date histogram query when date picker is disabled', async () => {
269
- var _a, _b;
270
- const searchService = new MockSearchService();
289
+ </collection-browser>`);
290
+ el.baseQuery = 'collection:foo';
291
+ el.showHistogramDatePicker = true;
292
+ await el.updateComplete;
293
+ expect((_b = (_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.aggregations) === null || _b === void 0 ? void 0 : _b.simpleParams).to.satisfy((aggTypes) => !aggTypes || !aggTypes.includes('year') // Not requesting year aggregations explicitly
294
+ );
295
+ });
296
+ it('does not fire a separate date histogram query when date picker is disabled', async () => {
297
+ var _a, _b;
298
+ const searchService = new MockSearchService();
271
299
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
272
- </collection-browser>`);
273
- el.baseQuery = 'collection:foo';
274
- el.showHistogramDatePicker = false;
275
- el.dateRangeQueryClause = 'year:[1995 TO 2005]';
276
- await el.updateComplete;
277
- expect((_b = (_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.aggregations) === null || _b === void 0 ? void 0 : _b.simpleParams).to.satisfy((aggTypes) => !aggTypes || !aggTypes.includes('year') // Not requesting year aggregations explicitly
278
- );
279
- });
280
- it('fails gracefully if no search service provided', async () => {
281
- var _a;
282
- const el = await fixture(html `<collection-browser></collection-browser>`);
283
- el.baseQuery = 'collection:foo';
284
- await el.updateComplete;
285
- // This shouldn't throw an error
286
- expect(el.fetchPage(2)).to.exist;
287
- // Should continue showing the empty placeholder
288
- expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder')).to.exist;
289
- });
290
- it('restores search type from URL param', async () => {
291
- // Add a sin=TXT param to the URL
292
- const url = new URL(window.location.href);
293
- url.searchParams.append('sin', 'TXT');
294
- window.history.replaceState({}, '', url);
295
- const searchService = new MockSearchService();
300
+ </collection-browser>`);
301
+ el.baseQuery = 'collection:foo';
302
+ el.showHistogramDatePicker = false;
303
+ el.minSelectedDate = '1995';
304
+ el.maxSelectedDate = '2005';
305
+ await el.updateComplete;
306
+ expect((_b = (_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.aggregations) === null || _b === void 0 ? void 0 : _b.simpleParams).to.satisfy((aggTypes) => !aggTypes || !aggTypes.includes('year') // Not requesting year aggregations explicitly
307
+ );
308
+ });
309
+ it('fails gracefully if no search service provided', async () => {
310
+ var _a;
311
+ const el = await fixture(html `<collection-browser></collection-browser>`);
312
+ el.baseQuery = 'collection:foo';
313
+ await el.updateComplete;
314
+ // This shouldn't throw an error
315
+ expect(el.fetchPage(2)).to.exist;
316
+ // Should continue showing the empty placeholder
317
+ expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder')).to.exist;
318
+ });
319
+ it('restores search type from URL param', async () => {
320
+ // Add a sin=TXT param to the URL
321
+ const url = new URL(window.location.href);
322
+ url.searchParams.append('sin', 'TXT');
323
+ window.history.replaceState({}, '', url);
324
+ const searchService = new MockSearchService();
296
325
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
297
- </collection-browser>`);
298
- expect(el.searchType).to.equal(SearchType.FULLTEXT);
299
- });
300
- it('applies loggedin flag to tile models if needed', async () => {
301
- var _a;
302
- const searchService = new MockSearchService();
326
+ </collection-browser>`);
327
+ expect(el.searchType).to.equal(SearchType.FULLTEXT);
328
+ });
329
+ it('applies loggedin flag to tile models if needed', async () => {
330
+ var _a;
331
+ const searchService = new MockSearchService();
303
332
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
304
- </collection-browser>`);
305
- el.baseQuery = 'loggedin';
306
- await el.updateComplete;
307
- const cellTemplate = el.cellForIndex(0);
308
- expect(cellTemplate).to.exist;
309
- const cell = await fixture(cellTemplate);
310
- expect(cell).to.exist;
311
- expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
312
- });
313
- it('applies no-preview flag to tile models if needed', async () => {
314
- var _a;
315
- const searchService = new MockSearchService();
333
+ </collection-browser>`);
334
+ el.baseQuery = 'loggedin';
335
+ await el.updateComplete;
336
+ const cellTemplate = el.cellForIndex(0);
337
+ expect(cellTemplate).to.exist;
338
+ const cell = await fixture(cellTemplate);
339
+ expect(cell).to.exist;
340
+ expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
341
+ });
342
+ it('applies no-preview flag to tile models if needed', async () => {
343
+ var _a;
344
+ const searchService = new MockSearchService();
316
345
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
317
- </collection-browser>`);
318
- el.baseQuery = 'no-preview';
319
- await el.updateComplete;
320
- const cellTemplate = el.cellForIndex(0);
321
- expect(cellTemplate).to.exist;
322
- const cell = await fixture(cellTemplate);
323
- expect(cell).to.exist;
324
- expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.contentWarning).to.be.true;
325
- });
326
- it('both loggedin and no-preview flags can be set simultaneously', async () => {
327
- var _a, _b;
328
- const searchService = new MockSearchService();
346
+ </collection-browser>`);
347
+ el.baseQuery = 'no-preview';
348
+ await el.updateComplete;
349
+ const cellTemplate = el.cellForIndex(0);
350
+ expect(cellTemplate).to.exist;
351
+ const cell = await fixture(cellTemplate);
352
+ expect(cell).to.exist;
353
+ expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.contentWarning).to.be.true;
354
+ });
355
+ it('both loggedin and no-preview flags can be set simultaneously', async () => {
356
+ var _a, _b;
357
+ const searchService = new MockSearchService();
329
358
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
330
- </collection-browser>`);
331
- el.baseQuery = 'loggedin-no-preview';
332
- await el.updateComplete;
333
- const cellTemplate = el.cellForIndex(0);
334
- expect(cellTemplate).to.exist;
335
- const cell = await fixture(cellTemplate);
336
- expect(cell).to.exist;
337
- expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
338
- expect((_b = cell.model) === null || _b === void 0 ? void 0 : _b.contentWarning).to.be.true;
339
- });
340
- it('joins full description array into a single string with line breaks', async () => {
341
- var _a;
342
- const searchService = new MockSearchService();
359
+ </collection-browser>`);
360
+ el.baseQuery = 'loggedin-no-preview';
361
+ await el.updateComplete;
362
+ const cellTemplate = el.cellForIndex(0);
363
+ expect(cellTemplate).to.exist;
364
+ const cell = await fixture(cellTemplate);
365
+ expect(cell).to.exist;
366
+ expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
367
+ expect((_b = cell.model) === null || _b === void 0 ? void 0 : _b.contentWarning).to.be.true;
368
+ });
369
+ it('joins full description array into a single string with line breaks', async () => {
370
+ var _a;
371
+ const searchService = new MockSearchService();
343
372
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
344
- </collection-browser>`);
345
- // This query receives an array description like ['line1', 'line2']
346
- el.baseQuery = 'multi-line-description';
347
- await el.updateComplete;
348
- const cellTemplate = el.cellForIndex(0);
349
- expect(cellTemplate).to.exist;
350
- const cell = await fixture(cellTemplate);
351
- expect(cell).to.exist;
352
- // Actual model description should be joined
353
- expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.description).to.equal('line1\nline2');
354
- });
355
- it('can search on demand if only search type has changed', async () => {
356
- const searchService = new MockSearchService();
373
+ </collection-browser>`);
374
+ // This query receives an array description like ['line1', 'line2']
375
+ el.baseQuery = 'multi-line-description';
376
+ await el.updateComplete;
377
+ const cellTemplate = el.cellForIndex(0);
378
+ expect(cellTemplate).to.exist;
379
+ const cell = await fixture(cellTemplate);
380
+ expect(cell).to.exist;
381
+ // Actual model description should be joined
382
+ expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.description).to.equal('line1\nline2');
383
+ });
384
+ it('can search on demand if only search type has changed', async () => {
385
+ const searchService = new MockSearchService();
357
386
  const el = await fixture(html `<collection-browser
358
387
  .searchService=${searchService}
359
388
  .searchType=${SearchType.METADATA}
360
- ></collection-browser>`);
361
- el.baseQuery = 'collection:foo';
362
- await el.updateComplete;
363
- el.searchType = SearchType.FULLTEXT;
364
- await el.updateComplete;
365
- // Haven't performed the search yet
366
- expect(searchService.searchType).to.equal(SearchType.METADATA);
367
- el.requestSearch();
368
- expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
369
- });
370
- it('queries for collection names after a fetch', async () => {
371
- const searchService = new MockSearchService();
372
- const collectionNameCache = new MockCollectionNameCache();
389
+ ></collection-browser>`);
390
+ el.baseQuery = 'collection:foo';
391
+ await el.updateComplete;
392
+ el.searchType = SearchType.FULLTEXT;
393
+ await el.updateComplete;
394
+ // Haven't performed the search yet
395
+ expect(searchService.searchType).to.equal(SearchType.METADATA);
396
+ el.requestSearch();
397
+ expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
398
+ });
399
+ it('queries for collection names after a fetch', async () => {
400
+ const searchService = new MockSearchService();
401
+ const collectionNameCache = new MockCollectionNameCache();
373
402
  const el = await fixture(html `<collection-browser
374
403
  .searchService=${searchService}
375
404
  .collectionNameCache=${collectionNameCache}
376
405
  >
377
- </collection-browser>`);
378
- el.baseQuery = 'collection:foo';
379
- await el.updateComplete;
380
- expect(collectionNameCache.preloadIdentifiersRequested).to.deep.equal([
381
- 'foo',
382
- 'bar',
383
- 'baz',
384
- 'boop',
385
- ]);
386
- });
387
- it('keeps search results from fetch if no change to query or sort param', async () => {
388
- const resultsSpy = sinon.spy();
389
- const searchService = new MockSearchService({
390
- asyncResponse: true,
391
- resultsSpy,
392
- });
406
+ </collection-browser>`);
407
+ el.baseQuery = 'collection:foo';
408
+ await el.updateComplete;
409
+ expect(collectionNameCache.preloadIdentifiersRequested).to.deep.equal([
410
+ 'foo',
411
+ 'bar',
412
+ 'baz',
413
+ 'boop',
414
+ ]);
415
+ });
416
+ it('keeps search results from fetch if no change to query or sort param', async () => {
417
+ const resultsSpy = sinon.spy();
418
+ const searchService = new MockSearchService({
419
+ asyncResponse: true,
420
+ resultsSpy,
421
+ });
393
422
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
394
- </collection-browser>`);
395
- el.baseQuery = 'with-sort';
396
- el.sortParam = { field: 'foo', direction: 'asc' };
397
- await el.updateComplete;
398
- await el.fetchPage(2);
399
- // If there is no change to the query or sort param during the fetch, the results
400
- // should be read.
401
- expect(resultsSpy.callCount).to.be.greaterThanOrEqual(1);
402
- });
403
- it('discards obsolete search results if sort params changed before arrival', async () => {
404
- const resultsSpy = sinon.spy();
405
- const searchService = new MockSearchService({
406
- asyncResponse: true,
407
- resultsSpy,
408
- });
423
+ </collection-browser>`);
424
+ el.baseQuery = 'with-sort';
425
+ el.sortParam = { field: 'foo', direction: 'asc' };
426
+ await el.updateComplete;
427
+ await el.fetchPage(2);
428
+ // If there is no change to the query or sort param during the fetch, the results
429
+ // should be read.
430
+ expect(resultsSpy.callCount).to.be.greaterThanOrEqual(1);
431
+ });
432
+ it('discards obsolete search results if sort params changed before arrival', async () => {
433
+ const resultsSpy = sinon.spy();
434
+ const searchService = new MockSearchService({
435
+ asyncResponse: true,
436
+ resultsSpy,
437
+ });
409
438
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
410
- </collection-browser>`);
411
- el.baseQuery = 'with-sort';
412
- el.sortParam = { field: 'foo', direction: 'asc' };
413
- await el.updateComplete;
414
- const fetchPromise = el.fetchPage(2);
415
- el.sortParam = { field: 'foo', direction: 'desc' };
416
- await fetchPromise;
417
- // If the different sort param causes the results to be discarded,
418
- // the results array should never be read.
419
- expect(resultsSpy.callCount).to.equal(0);
420
- });
421
- it('discards obsolete search results if sort param added before arrival', async () => {
422
- const resultsSpy = sinon.spy();
423
- const searchService = new MockSearchService({
424
- asyncResponse: true,
425
- resultsSpy,
426
- });
439
+ </collection-browser>`);
440
+ el.baseQuery = 'with-sort';
441
+ el.sortParam = { field: 'foo', direction: 'asc' };
442
+ await el.updateComplete;
443
+ const fetchPromise = el.fetchPage(2);
444
+ el.sortParam = { field: 'foo', direction: 'desc' };
445
+ await fetchPromise;
446
+ // If the different sort param causes the results to be discarded,
447
+ // the results array should never be read.
448
+ expect(resultsSpy.callCount).to.equal(0);
449
+ });
450
+ it('discards obsolete search results if sort param added before arrival', async () => {
451
+ const resultsSpy = sinon.spy();
452
+ const searchService = new MockSearchService({
453
+ asyncResponse: true,
454
+ resultsSpy,
455
+ });
427
456
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
428
- </collection-browser>`);
429
- el.baseQuery = 'single-result';
430
- await el.updateComplete;
431
- const fetchPromise = el.fetchPage(2);
432
- el.sortParam = { field: 'foo', direction: 'asc' };
433
- await fetchPromise;
434
- // If the different sort param causes the results to be discarded,
435
- // the results array should never be read.
436
- expect(resultsSpy.callCount).to.equal(0);
437
- });
438
- it('discards obsolete search results if sort param cleared before arrival', async () => {
439
- const resultsSpy = sinon.spy();
440
- const searchService = new MockSearchService({
441
- asyncResponse: true,
442
- resultsSpy,
443
- });
457
+ </collection-browser>`);
458
+ el.baseQuery = 'single-result';
459
+ await el.updateComplete;
460
+ const fetchPromise = el.fetchPage(2);
461
+ el.sortParam = { field: 'foo', direction: 'asc' };
462
+ await fetchPromise;
463
+ // If the different sort param causes the results to be discarded,
464
+ // the results array should never be read.
465
+ expect(resultsSpy.callCount).to.equal(0);
466
+ });
467
+ it('discards obsolete search results if sort param cleared before arrival', async () => {
468
+ const resultsSpy = sinon.spy();
469
+ const searchService = new MockSearchService({
470
+ asyncResponse: true,
471
+ resultsSpy,
472
+ });
444
473
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
445
- </collection-browser>`);
446
- el.baseQuery = 'with-sort';
447
- await el.updateComplete;
448
- const fetchPromise = el.fetchPage(2);
449
- el.sortParam = null;
450
- await fetchPromise;
451
- // If the different sort param causes the results to be discarded,
452
- // the results array should never be read.
453
- expect(resultsSpy.callCount).to.equal(0);
454
- });
455
- it('sets sort properties when user changes sort', async () => {
456
- var _a, _b, _c, _d;
457
- const searchService = new MockSearchService();
474
+ </collection-browser>`);
475
+ el.baseQuery = 'with-sort';
476
+ await el.updateComplete;
477
+ const fetchPromise = el.fetchPage(2);
478
+ el.sortParam = null;
479
+ await fetchPromise;
480
+ // If the different sort param causes the results to be discarded,
481
+ // the results array should never be read.
482
+ expect(resultsSpy.callCount).to.equal(0);
483
+ });
484
+ it('sets sort properties when user changes sort', async () => {
485
+ var _a, _b, _c, _d;
486
+ const searchService = new MockSearchService();
458
487
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
459
- </collection-browser>`);
460
- expect(el.selectedSort).to.equal(SortField.relevance);
461
- el.baseQuery = 'foo';
462
- await el.updateComplete;
463
- const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
464
- const sortSelector = (_b = sortBar === null || sortBar === void 0 ? void 0 : sortBar.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#desktop-sort-selector');
465
- expect(sortSelector).to.exist;
466
- // Click the title sorter
467
- (_d = (_c = [...sortSelector === null || sortSelector === void 0 ? void 0 : sortSelector.children] // tsc doesn't know children is iterable
468
- .find(child => { var _a; return ((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === 'Title'; })) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]')) === null || _d === void 0 ? void 0 : _d.click();
469
- await el.updateComplete;
470
- expect(el.selectedSort).to.equal(SortField.title);
471
- });
472
- it('sets sort filter properties when user selects title filter', async () => {
473
- var _a;
474
- const searchService = new MockSearchService();
488
+ </collection-browser>`);
489
+ expect(el.selectedSort).to.equal(SortField.relevance);
490
+ el.baseQuery = 'foo';
491
+ await el.updateComplete;
492
+ const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
493
+ const sortSelector = (_b = sortBar === null || sortBar === void 0 ? void 0 : sortBar.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#desktop-sort-selector');
494
+ expect(sortSelector).to.exist;
495
+ // Click the title sorter
496
+ (_d = (_c = [...sortSelector === null || sortSelector === void 0 ? void 0 : sortSelector.children] // tsc doesn't know children is iterable
497
+ .find(child => { var _a; return ((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === 'Title'; })) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]')) === null || _d === void 0 ? void 0 : _d.click();
498
+ await el.updateComplete;
499
+ expect(el.selectedSort).to.equal(SortField.title);
500
+ });
501
+ it('sets sort filter properties when user selects title filter', async () => {
502
+ var _a;
503
+ const searchService = new MockSearchService();
475
504
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
476
- </collection-browser>`);
477
- el.baseQuery = 'collection:foo';
478
- el.selectedTitleFilter = 'X';
479
- await el.updateComplete;
480
- // Wait an extra tick
481
- await new Promise(res => {
482
- setTimeout(res, 0);
483
- });
484
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo AND firstTitle:X');
485
- });
486
- it('sets sort filter properties when user selects creator filter', async () => {
487
- var _a;
488
- const searchService = new MockSearchService();
505
+ </collection-browser>`);
506
+ el.baseQuery = 'first-title';
507
+ el.selectedSort = 'title';
508
+ el.sortDirection = 'asc';
509
+ el.selectedTitleFilter = 'X';
510
+ await el.updateComplete;
511
+ // Wait an extra tick
512
+ await new Promise(res => {
513
+ setTimeout(res, 0);
514
+ });
515
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-title AND firstTitle:X');
516
+ });
517
+ it('sets sort filter properties when user selects creator filter', async () => {
518
+ var _a;
519
+ const searchService = new MockSearchService();
489
520
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
490
- </collection-browser>`);
491
- el.baseQuery = 'collection:foo';
492
- el.selectedCreatorFilter = 'X';
493
- await el.updateComplete;
494
- // Wait an extra tick
495
- await new Promise(res => {
496
- setTimeout(res, 0);
497
- });
498
- expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo AND firstCreator:X');
499
- });
500
- it('sets date range query when date picker selection changed', async () => {
501
- var _a, _b, _c;
502
- const searchService = new MockSearchService();
521
+ </collection-browser>`);
522
+ el.baseQuery = 'first-creator';
523
+ el.selectedSort = 'creator';
524
+ el.sortDirection = 'asc';
525
+ el.selectedCreatorFilter = 'X';
526
+ await el.updateComplete;
527
+ // Wait an extra tick
528
+ await new Promise(res => {
529
+ setTimeout(res, 0);
530
+ });
531
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator AND firstCreator:X');
532
+ });
533
+ it('sets sort filter properties simultaneous with facets and date range', async () => {
534
+ var _a, _b;
535
+ const searchService = new MockSearchService();
536
+ const selectedFacets = {
537
+ collection: { foo: { key: 'foo', state: 'selected', count: 1 } },
538
+ creator: {},
539
+ language: {},
540
+ lending: {},
541
+ mediatype: {},
542
+ subject: {},
543
+ year: {},
544
+ };
503
545
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
504
- </collection-browser>`);
505
- el.baseQuery = 'years'; // Includes year_histogram aggregation in response
506
- el.showHistogramDatePicker = true;
507
- await el.updateComplete;
508
- const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
509
- await (facets === null || facets === void 0 ? void 0 : facets.updateComplete);
510
- // Wait for the date picker to be rendered (which may take until the next tick)
511
- await new Promise(res => {
512
- setTimeout(res, 0);
513
- });
514
- const histogram = (_b = facets === null || facets === void 0 ? void 0 : facets.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('histogram-date-range');
515
- expect(histogram).to.exist;
516
- // Enter a new min date into the date picker
517
- const minDateInput = (_c = histogram.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#date-min');
518
- const pressEnterEvent = new KeyboardEvent('keyup', {
519
- key: 'Enter',
520
- });
521
- minDateInput.value = '1960';
522
- minDateInput.dispatchEvent(pressEnterEvent);
523
- // Wait for the histogram's update delay
524
- await new Promise(res => {
525
- setTimeout(res, histogram.updateDelay + 50);
526
- });
527
- // Ensure that the histogram change propagated to the collection browser's
528
- // date query correctly.
529
- await el.updateComplete;
530
- expect(el.dateRangeQueryClause).to.equal('year:[1960 TO 2000]');
531
- });
532
- it('scrolls to page', async () => {
533
- var _a;
534
- const searchService = new MockSearchService();
546
+ </collection-browser>`);
547
+ el.baseQuery = 'first-creator';
548
+ el.selectedSort = 'creator';
549
+ el.selectedFacets = selectedFacets;
550
+ el.minSelectedDate = '1950';
551
+ el.maxSelectedDate = '1970';
552
+ el.sortDirection = 'asc';
553
+ el.selectedCreatorFilter = 'X';
554
+ await el.updateComplete;
555
+ // Wait an extra tick
556
+ await new Promise(res => {
557
+ setTimeout(res, 0);
558
+ });
559
+ expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator AND firstCreator:X');
560
+ expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
561
+ collection: {
562
+ foo: 'inc',
563
+ },
564
+ year: {
565
+ '1950': 'gte',
566
+ '1970': 'lte',
567
+ },
568
+ });
569
+ });
570
+ it('sets date range query when date picker selection changed', async () => {
571
+ var _a, _b, _c;
572
+ const searchService = new MockSearchService();
535
573
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
536
- </collection-browser>`);
537
- // Infinite scroller won't exist unless there's a base query
538
- el.baseQuery = 'collection:foo';
539
- await el.updateComplete;
540
- const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
541
- expect(infiniteScroller).to.exist;
542
- const oldScrollToCell = infiniteScroller.scrollToCell;
543
- const spy = sinon.spy();
544
- infiniteScroller.scrollToCell = spy;
545
- el.goToPage(1);
546
- // Give it a second to scroll
547
- await new Promise(res => {
548
- setTimeout(res, 1000);
549
- });
550
- expect(spy.callCount).to.equal(1);
551
- infiniteScroller.scrollToCell = oldScrollToCell;
552
- });
553
- it('refreshes when certain properties change - with some analytics event sampling', async () => {
554
- var _a;
555
- const mockAnalyticsHandler = new MockAnalyticsHandler();
556
- const searchService = new MockSearchService();
557
- const collectionNameCache = new MockCollectionNameCache();
574
+ </collection-browser>`);
575
+ el.baseQuery = 'years'; // Includes year_histogram aggregation in response
576
+ el.showHistogramDatePicker = true;
577
+ await el.updateComplete;
578
+ const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
579
+ await (facets === null || facets === void 0 ? void 0 : facets.updateComplete);
580
+ // Wait for the date picker to be rendered (which may take until the next tick)
581
+ await new Promise(res => {
582
+ setTimeout(res, 0);
583
+ });
584
+ const histogram = (_b = facets === null || facets === void 0 ? void 0 : facets.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('histogram-date-range');
585
+ expect(histogram).to.exist;
586
+ // Enter a new min date into the date picker
587
+ const minDateInput = (_c = histogram.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#date-min');
588
+ const pressEnterEvent = new KeyboardEvent('keyup', {
589
+ key: 'Enter',
590
+ });
591
+ minDateInput.value = '1960';
592
+ minDateInput.dispatchEvent(pressEnterEvent);
593
+ // Wait for the histogram's update delay
594
+ await new Promise(res => {
595
+ setTimeout(res, histogram.updateDelay + 50);
596
+ });
597
+ // Ensure that the histogram change propagated to the collection browser's
598
+ // date query correctly.
599
+ await el.updateComplete;
600
+ expect(el.minSelectedDate).to.equal('1960');
601
+ expect(el.maxSelectedDate).to.equal('2000');
602
+ });
603
+ it('scrolls to page', async () => {
604
+ var _a;
605
+ const searchService = new MockSearchService();
606
+ const el = await fixture(html `<collection-browser .searchService=${searchService}>
607
+ </collection-browser>`);
608
+ // Infinite scroller won't exist unless there's a base query
609
+ el.baseQuery = 'collection:foo';
610
+ await el.updateComplete;
611
+ const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
612
+ expect(infiniteScroller).to.exist;
613
+ const oldScrollToCell = infiniteScroller.scrollToCell;
614
+ const spy = sinon.spy();
615
+ infiniteScroller.scrollToCell = spy;
616
+ el.goToPage(1);
617
+ // Give it a second to scroll
618
+ await new Promise(res => {
619
+ setTimeout(res, 1000);
620
+ });
621
+ expect(spy.callCount).to.equal(1);
622
+ infiniteScroller.scrollToCell = oldScrollToCell;
623
+ });
624
+ it('refreshes when certain properties change - with some analytics event sampling', async () => {
625
+ var _a;
626
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
627
+ const searchService = new MockSearchService();
628
+ const collectionNameCache = new MockCollectionNameCache();
558
629
  const el = await fixture(html `<collection-browser
559
630
  .analyticsHandler=${mockAnalyticsHandler}
560
631
  .searchService=${searchService}
561
632
  .collectionNameCache=${collectionNameCache}
562
- ></collection-browser>`);
563
- const infiniteScrollerRefreshSpy = sinon.spy();
564
- // Infinite scroller won't exist unless there's a base query
565
- el.baseQuery = 'collection:foo';
566
- await el.updateComplete;
567
- const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
568
- infiniteScroller.reload = infiniteScrollerRefreshSpy;
569
- expect(infiniteScrollerRefreshSpy.called).to.be.false;
570
- expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);
571
- // testing: `loggedIn`
572
- el.loggedIn = true;
573
- await el.updateComplete;
574
- expect(infiniteScrollerRefreshSpy.called).to.be.true;
575
- expect(infiniteScrollerRefreshSpy.callCount).to.equal(1);
576
- el.loggedIn = false;
577
- await el.updateComplete;
578
- expect(infiniteScrollerRefreshSpy.callCount).to.equal(2);
579
- // testing: `displayMode`
580
- el.displayMode = 'list-compact';
581
- el.searchContext = 'beta-search';
582
- await el.updateComplete;
583
- expect(infiniteScrollerRefreshSpy.callCount).to.equal(3);
584
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
585
- expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
586
- expect(mockAnalyticsHandler.callLabel).to.equal('list-compact');
587
- el.displayMode = 'list-detail';
588
- await el.updateComplete;
589
- expect(infiniteScrollerRefreshSpy.callCount).to.equal(4);
590
- expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
591
- expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
592
- expect(mockAnalyticsHandler.callLabel).to.equal('list-detail');
593
- // testing: `baseNavigationUrl`
594
- el.baseNavigationUrl = 'https://funtestsite.com';
595
- await el.updateComplete;
596
- expect(infiniteScrollerRefreshSpy.callCount).to.equal(5);
597
- // testing: `baseImageUrl`
598
- el.baseImageUrl = 'https://funtestsiteforimages.com';
599
- await el.updateComplete;
600
- expect(infiniteScrollerRefreshSpy.callCount).to.equal(6);
601
- });
602
- it('query the search service for single result', async () => {
603
- var _a, _b;
604
- const searchService = new MockSearchService();
633
+ ></collection-browser>`);
634
+ const infiniteScrollerRefreshSpy = sinon.spy();
635
+ // Infinite scroller won't exist unless there's a base query
636
+ el.baseQuery = 'collection:foo';
637
+ await el.updateComplete;
638
+ const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
639
+ infiniteScroller.reload = infiniteScrollerRefreshSpy;
640
+ expect(infiniteScrollerRefreshSpy.called).to.be.false;
641
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);
642
+ // testing: `loggedIn`
643
+ el.loggedIn = true;
644
+ await el.updateComplete;
645
+ expect(infiniteScrollerRefreshSpy.called).to.be.true;
646
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(1);
647
+ el.loggedIn = false;
648
+ await el.updateComplete;
649
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(2);
650
+ // testing: `displayMode`
651
+ el.displayMode = 'list-compact';
652
+ el.searchContext = 'beta-search';
653
+ await el.updateComplete;
654
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(3);
655
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
656
+ expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
657
+ expect(mockAnalyticsHandler.callLabel).to.equal('list-compact');
658
+ el.displayMode = 'list-detail';
659
+ await el.updateComplete;
660
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(4);
661
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
662
+ expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
663
+ expect(mockAnalyticsHandler.callLabel).to.equal('list-detail');
664
+ // testing: `baseNavigationUrl`
665
+ el.baseNavigationUrl = 'https://funtestsite.com';
666
+ await el.updateComplete;
667
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(5);
668
+ // testing: `baseImageUrl`
669
+ el.baseImageUrl = 'https://funtestsiteforimages.com';
670
+ await el.updateComplete;
671
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(6);
672
+ });
673
+ it('query the search service for single result', async () => {
674
+ var _a, _b;
675
+ const searchService = new MockSearchService();
605
676
  const el = await fixture(html `<collection-browser .searchService=${searchService}>
606
- </collection-browser>`);
607
- el.baseQuery = 'single-result';
608
- await el.updateComplete;
609
- expect((_b = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#big-results-label')) === null || _b === void 0 ? void 0 : _b.textContent).to.contains('Result');
610
- });
611
- it('`searchContext` prop helps describe where component is being used', async () => {
612
- const el = await fixture(html `<collection-browser></collection-browser>`);
613
- expect(el.searchContext).to.equal(analyticsCategories.default);
614
- el.searchContext = 'unicorn-search';
615
- await el.updateComplete;
616
- expect(el.searchContext).to.equal('unicorn-search');
617
- // property is reflected as attribute
618
- expect(el.getAttribute('searchcontext')).to.equal('unicorn-search');
619
- });
620
- });
677
+ </collection-browser>`);
678
+ el.baseQuery = 'single-result';
679
+ await el.updateComplete;
680
+ await nextTick();
681
+ expect((_b = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#big-results-label')) === null || _b === void 0 ? void 0 : _b.textContent).to.contains('Result');
682
+ });
683
+ it('`searchContext` prop helps describe where component is being used', async () => {
684
+ const el = await fixture(html `<collection-browser></collection-browser>`);
685
+ expect(el.searchContext).to.equal(analyticsCategories.default);
686
+ el.searchContext = 'unicorn-search';
687
+ await el.updateComplete;
688
+ expect(el.searchContext).to.equal('unicorn-search');
689
+ // property is reflected as attribute
690
+ expect(el.getAttribute('searchcontext')).to.equal('unicorn-search');
691
+ });
692
+ });
621
693
  //# sourceMappingURL=collection-browser.test.js.map