@internetarchive/collection-browser 0.3.3-alpha.4 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) 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 +43 -44
  12. package/dist/src/app-root.js +233 -242
  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 +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/software.d.ts +1 -1
  47. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  48. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  49. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  50. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  51. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  52. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  53. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  54. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  55. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  56. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  57. package/dist/src/assets/img/icons/null-result.js +2 -2
  58. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  59. package/dist/src/assets/img/icons/restricted.js +2 -2
  60. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  61. package/dist/src/assets/img/icons/reviews.js +2 -2
  62. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  63. package/dist/src/assets/img/icons/upload.js +2 -2
  64. package/dist/src/assets/img/icons/views.d.ts +1 -1
  65. package/dist/src/assets/img/icons/views.js +2 -2
  66. package/dist/src/circular-activity-indicator.d.ts +5 -5
  67. package/dist/src/circular-activity-indicator.js +17 -17
  68. package/dist/src/collection-browser.d.ts +247 -247
  69. package/dist/src/collection-browser.js +1055 -1073
  70. package/dist/src/collection-browser.js.map +1 -1
  71. package/dist/src/collection-facets/facets-template.d.ts +16 -16
  72. package/dist/src/collection-facets/facets-template.js +125 -125
  73. package/dist/src/collection-facets/more-facets-content.d.ts +76 -74
  74. package/dist/src/collection-facets/more-facets-content.js +349 -330
  75. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  76. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  77. package/dist/src/collection-facets/more-facets-pagination.js +192 -192
  78. package/dist/src/collection-facets.d.ts +75 -73
  79. package/dist/src/collection-facets.js +370 -359
  80. package/dist/src/collection-facets.js.map +1 -1
  81. package/dist/src/empty-placeholder.d.ts +11 -11
  82. package/dist/src/empty-placeholder.js +42 -42
  83. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  84. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  85. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  86. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  87. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  88. package/dist/src/mediatype/mediatype-config.js +85 -85
  89. package/dist/src/models.d.ts +97 -97
  90. package/dist/src/models.js +100 -100
  91. package/dist/src/restoration-state-handler.d.ts +45 -46
  92. package/dist/src/restoration-state-handler.js +220 -230
  93. package/dist/src/restoration-state-handler.js.map +1 -1
  94. package/dist/src/sort-filter-bar/alpha-bar.d.ts +9 -9
  95. package/dist/src/sort-filter-bar/alpha-bar.js +41 -41
  96. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  97. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  98. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  99. package/dist/src/sort-filter-bar/img/list.js +2 -2
  100. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  101. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  102. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  103. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  104. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +107 -107
  105. package/dist/src/sort-filter-bar/sort-filter-bar.js +423 -423
  106. package/dist/src/styles/item-image-styles.d.ts +8 -8
  107. package/dist/src/styles/item-image-styles.js +9 -9
  108. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  109. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  110. package/dist/src/tiles/grid/account-tile.d.ts +8 -8
  111. package/dist/src/tiles/grid/account-tile.js +20 -20
  112. package/dist/src/tiles/grid/collection-tile.d.ts +7 -7
  113. package/dist/src/tiles/grid/collection-tile.js +23 -23
  114. package/dist/src/tiles/grid/item-tile.d.ts +24 -24
  115. package/dist/src/tiles/grid/item-tile.js +87 -87
  116. package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
  117. package/dist/src/tiles/grid/tile-stats.js +35 -35
  118. package/dist/src/tiles/image-block.d.ts +17 -17
  119. package/dist/src/tiles/image-block.js +69 -69
  120. package/dist/src/tiles/item-image.d.ts +31 -31
  121. package/dist/src/tiles/item-image.js +103 -103
  122. package/dist/src/tiles/list/account-label.d.ts +1 -1
  123. package/dist/src/tiles/list/account-label.js +6 -6
  124. package/dist/src/tiles/list/date-label.d.ts +1 -1
  125. package/dist/src/tiles/list/date-label.js +12 -12
  126. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
  127. package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
  128. package/dist/src/tiles/list/tile-list-compact.d.ts +20 -20
  129. package/dist/src/tiles/list/tile-list-compact.js +87 -87
  130. package/dist/src/tiles/list/tile-list.d.ts +50 -50
  131. package/dist/src/tiles/list/tile-list.js +264 -264
  132. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  133. package/dist/src/tiles/mediatype-icon.js +47 -47
  134. package/dist/src/tiles/overlay/icon-overlay.d.ts +7 -7
  135. package/dist/src/tiles/overlay/icon-overlay.js +30 -30
  136. package/dist/src/tiles/overlay/text-overlay.d.ts +8 -8
  137. package/dist/src/tiles/overlay/text-overlay.js +31 -31
  138. package/dist/src/tiles/text-snippet-block.d.ts +29 -29
  139. package/dist/src/tiles/text-snippet-block.js +81 -81
  140. package/dist/src/tiles/tile-dispatcher.d.ts +36 -36
  141. package/dist/src/tiles/tile-dispatcher.js +128 -128
  142. package/dist/src/utils/analytics-events.d.ts +22 -18
  143. package/dist/src/utils/analytics-events.js +24 -20
  144. package/dist/src/utils/analytics-events.js.map +1 -1
  145. package/dist/src/utils/format-count.d.ts +7 -7
  146. package/dist/src/utils/format-count.js +76 -76
  147. package/dist/src/utils/format-date.d.ts +2 -2
  148. package/dist/src/utils/format-date.js +23 -23
  149. package/dist/test/collection-browser.test.d.ts +1 -1
  150. package/dist/test/collection-browser.test.js +330 -356
  151. package/dist/test/collection-browser.test.js.map +1 -1
  152. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  153. package/dist/test/collection-facets/facets-template.test.js +62 -62
  154. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  155. package/dist/test/collection-facets/more-facets-content.test.js +117 -92
  156. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
  157. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  158. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  159. package/dist/test/collection-facets.test.d.ts +2 -2
  160. package/dist/test/collection-facets.test.js +471 -421
  161. package/dist/test/collection-facets.test.js.map +1 -1
  162. package/dist/test/empty-placeholder.test.d.ts +1 -1
  163. package/dist/test/empty-placeholder.test.js +33 -33
  164. package/dist/test/icon-overlay.test.d.ts +1 -1
  165. package/dist/test/icon-overlay.test.js +24 -24
  166. package/dist/test/image-block.test.d.ts +1 -1
  167. package/dist/test/image-block.test.js +48 -48
  168. package/dist/test/item-image.test.d.ts +1 -1
  169. package/dist/test/item-image.test.js +56 -56
  170. package/dist/test/mediatype-config.test.d.ts +1 -1
  171. package/dist/test/mediatype-config.test.js +16 -16
  172. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  173. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  174. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
  175. package/dist/test/mocks/mock-collection-name-cache.js +13 -13
  176. package/dist/test/mocks/mock-search-responses.d.ts +5 -5
  177. package/dist/test/mocks/mock-search-responses.js +103 -103
  178. package/dist/test/mocks/mock-search-service.d.ts +13 -13
  179. package/dist/test/mocks/mock-search-service.js +25 -25
  180. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  181. package/dist/test/restoration-state-handler.test.js +117 -117
  182. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  183. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +113 -113
  184. package/dist/test/text-overlay.test.d.ts +1 -1
  185. package/dist/test/text-overlay.test.js +41 -41
  186. package/dist/test/text-snippet-block.test.d.ts +1 -1
  187. package/dist/test/text-snippet-block.test.js +57 -57
  188. package/dist/test/tile-stats.test.d.ts +1 -1
  189. package/dist/test/tile-stats.test.js +33 -33
  190. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  191. package/dist/test/tiles/grid/item-tile.test.js +107 -107
  192. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  193. package/dist/test/tiles/list/tile-list-compact.test.js +26 -26
  194. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  195. package/dist/test/tiles/list/tile-list.test.js +36 -36
  196. package/dist/test/utils/format-count.test.d.ts +1 -1
  197. package/dist/test/utils/format-count.test.js +23 -23
  198. package/dist/test/utils/format-date.test.d.ts +1 -1
  199. package/dist/test/utils/format-date.test.js +17 -17
  200. package/index.html +24 -24
  201. package/local.archive.org.cert +86 -86
  202. package/local.archive.org.key +27 -27
  203. package/package.json +115 -115
  204. package/renovate.json +6 -6
  205. package/src/app-root.ts +1 -12
  206. package/src/collection-browser.ts +7 -43
  207. package/src/collection-facets/more-facets-content.ts +27 -3
  208. package/src/collection-facets.ts +16 -1
  209. package/src/restoration-state-handler.ts +1 -19
  210. package/src/utils/analytics-events.ts +4 -0
  211. package/test/collection-browser.test.ts +2 -31
  212. package/test/collection-facets/more-facets-content.test.ts +42 -10
  213. package/test/collection-facets.test.ts +62 -1
  214. package/tsconfig.json +21 -21
  215. package/web-dev-server.config.mjs +30 -30
  216. package/web-test-runner.config.mjs +41 -41
@@ -20,6 +20,7 @@ import {
20
20
  } from '@internetarchive/search-service';
21
21
  import type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
22
22
  import type { ModalManagerInterface } from '@internetarchive/modal-manager';
23
+ import type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';
23
24
  import {
24
25
  SelectedFacets,
25
26
  FacetGroup,
@@ -31,12 +32,16 @@ import type { LanguageCodeHandlerInterface } from '../language-code-handler/lang
31
32
  import '@internetarchive/ia-activity-indicator/ia-activity-indicator';
32
33
  import './more-facets-pagination';
33
34
  import './facets-template';
35
+ import {
36
+ analyticsActions,
37
+ analyticsCategories,
38
+ } from '../utils/analytics-events';
34
39
 
35
40
  @customElement('more-facets-content')
36
41
  export class MoreFacetsContent extends LitElement {
37
- @property({ type: String }) facetKey?: string;
42
+ @property({ type: String }) facetKey?: FacetOption;
38
43
 
39
- @property({ type: String }) facetAggregationKey?: string;
44
+ @property({ type: String }) facetAggregationKey?: FacetOption;
40
45
 
41
46
  @property({ type: String }) fullQuery?: string;
42
47
 
@@ -54,7 +59,10 @@ export class MoreFacetsContent extends LitElement {
54
59
 
55
60
  @property({ type: Object }) selectedFacets?: SelectedFacets;
56
61
 
57
- @property({ type: String }) sortedBy = 'count'; // count | alpha
62
+ @property({ type: String }) sortedBy: 'count' | 'alpha' = 'count';
63
+
64
+ @property({ type: Object, attribute: false })
65
+ analyticsHandler?: AnalyticsManagerInterface;
58
66
 
59
67
  @state() aggregations?: Record<string, Aggregation>;
60
68
 
@@ -136,6 +144,12 @@ export class MoreFacetsContent extends LitElement {
136
144
  if (page) {
137
145
  this.pageNumber = Number(page);
138
146
  }
147
+
148
+ this.analyticsHandler?.sendEventNoSampling({
149
+ category: analyticsCategories.default,
150
+ action: analyticsActions.moreFacetsPageChange,
151
+ label: `${this.pageNumber}`,
152
+ });
139
153
  }
140
154
 
141
155
  /**
@@ -419,10 +433,20 @@ export class MoreFacetsContent extends LitElement {
419
433
  });
420
434
  this.dispatchEvent(event);
421
435
  this.modalManager?.closeModal();
436
+ this.analyticsHandler?.sendEventNoSampling({
437
+ category: analyticsCategories.default,
438
+ action: `${analyticsActions.applyMoreFacetsModal}`,
439
+ label: `${this.facetKey}`,
440
+ });
422
441
  }
423
442
 
424
443
  private cancelClick() {
425
444
  this.modalManager?.closeModal();
445
+ this.analyticsHandler?.sendEventNoSampling({
446
+ category: analyticsCategories.default,
447
+ action: analyticsActions.closeMoreFacetsModal,
448
+ label: `${this.facetKey}`,
449
+ });
426
450
  }
427
451
 
428
452
  static get styles(): CSSResultGroup {
@@ -22,6 +22,7 @@ import {
22
22
  ModalConfig,
23
23
  ModalManagerInterface,
24
24
  } from '@internetarchive/modal-manager';
25
+ import type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';
25
26
  import chevronIcon from './assets/img/icons/chevron';
26
27
  import {
27
28
  FacetOption,
@@ -37,6 +38,10 @@ import {
37
38
  import type { LanguageCodeHandlerInterface } from './language-code-handler/language-code-handler';
38
39
  import './collection-facets/more-facets-content';
39
40
  import './collection-facets/facets-template';
41
+ import {
42
+ analyticsActions,
43
+ analyticsCategories,
44
+ } from './utils/analytics-events';
40
45
 
41
46
  @customElement('collection-facets')
42
47
  export class CollectionFacets extends LitElement {
@@ -66,7 +71,11 @@ export class CollectionFacets extends LitElement {
66
71
 
67
72
  @property({ type: String }) fullQuery?: string;
68
73
 
69
- @property({ type: Object }) modalManager?: ModalManagerInterface;
74
+ @property({ type: Object, attribute: false })
75
+ modalManager?: ModalManagerInterface;
76
+
77
+ @property({ type: Object, attribute: false })
78
+ analyticsHandler?: AnalyticsManagerInterface;
70
79
 
71
80
  @property({ type: Object })
72
81
  languageCodeHandler?: LanguageCodeHandlerInterface;
@@ -429,6 +438,11 @@ export class CollectionFacets extends LitElement {
429
438
  class="more-link"
430
439
  @click=${() => {
431
440
  this.showMoreFacetsModal(facetGroup, 'count');
441
+ this.analyticsHandler?.sendEventNoSampling({
442
+ category: analyticsCategories.default,
443
+ action: analyticsActions.showMoreFacetsModal,
444
+ label: facetGroup.key,
445
+ });
432
446
  this.dispatchEvent(
433
447
  new CustomEvent('showMoreFacets', { detail: facetGroup.key })
434
448
  );
@@ -446,6 +460,7 @@ export class CollectionFacets extends LitElement {
446
460
 
447
461
  const customModalContent = html`
448
462
  <more-facets-content
463
+ .analyticsHandler=${this.analyticsHandler}
449
464
  .facetKey=${facetGroup.key}
450
465
  .facetAggregationKey=${facetAggrKey}
451
466
  .fullQuery=${this.fullQuery}
@@ -1,8 +1,4 @@
1
- import {
2
- SearchType,
3
- SortDirection,
4
- SortParam,
5
- } from '@internetarchive/search-service';
1
+ import type { SortDirection, SortParam } from '@internetarchive/search-service';
6
2
  import { getCookie, setCookie } from 'typescript-cookie';
7
3
  import {
8
4
  MetadataFieldToSortField,
@@ -18,7 +14,6 @@ import {
18
14
 
19
15
  export interface RestorationState {
20
16
  displayMode?: CollectionDisplayMode;
21
- searchType?: SearchType;
22
17
  sortParam?: SortParam;
23
18
  selectedSort?: SortField;
24
19
  sortDirection?: SortDirection;
@@ -92,20 +87,12 @@ export class RestorationStateHandler
92
87
  private persistQueryStateToUrl(state: RestorationState) {
93
88
  const url = new URL(window.location.href);
94
89
  const { searchParams } = url;
95
- searchParams.delete('sin');
96
90
  searchParams.delete('sort');
97
91
  searchParams.delete('query');
98
92
  searchParams.delete('page');
99
93
  searchParams.delete('and[]');
100
94
  searchParams.delete('not[]');
101
95
 
102
- if (state.searchType) {
103
- searchParams.set(
104
- 'sin',
105
- state.searchType === SearchType.FULLTEXT ? 'TXT' : ''
106
- );
107
- }
108
-
109
96
  if (state.sortParam) {
110
97
  const prefix = state.sortParam.direction === 'desc' ? '-' : '';
111
98
  searchParams.set('sort', `${prefix}${state.sortParam.field}`);
@@ -168,7 +155,6 @@ export class RestorationStateHandler
168
155
 
169
156
  private loadQueryStateFromUrl(): RestorationState {
170
157
  const url = new URL(window.location.href);
171
- const searchInside = url.searchParams.get('sin');
172
158
  const pageNumber = url.searchParams.get('page');
173
159
  const searchQuery = url.searchParams.get('query');
174
160
  const sortQuery = url.searchParams.get('sort');
@@ -187,10 +173,6 @@ export class RestorationStateHandler
187
173
  },
188
174
  };
189
175
 
190
- if (searchInside) {
191
- restorationState.searchType =
192
- searchInside === 'TXT' ? SearchType.FULLTEXT : undefined; // No explicit metadata sin
193
- }
194
176
  if (pageNumber) {
195
177
  const parsed = parseInt(pageNumber, 10);
196
178
  restorationState.currentPage = parsed;
@@ -16,4 +16,8 @@ export enum analyticsActions {
16
16
  facetNegativeDeselected = 'facetNegativeDeselected',
17
17
  histogramChanged = 'histogramChanged',
18
18
  resultSelected = 'resultSelected',
19
+ moreFacetsPageChange = 'moreFacetsPageChange',
20
+ showMoreFacetsModal = 'showMoreFacetsModal',
21
+ closeMoreFacetsModal = 'closeMoreFacetsModal',
22
+ applyMoreFacetsModal = 'applyMoreFacetsModal',
19
23
  }
@@ -18,21 +18,6 @@ import { MockAnalyticsHandler } from './mocks/mock-analytics-handler';
18
18
  import { analyticsCategories } from '../src/utils/analytics-events';
19
19
 
20
20
  describe('Collection Browser', () => {
21
- beforeEach(async () => {
22
- // Apparently query params set by one test can bleed into other tests.
23
- // Since collection browser restores its state from certain query params, we need
24
- // to clear these before each test to ensure they run in isolation from one another.
25
- const url = new URL(window.location.href);
26
- const { searchParams } = url;
27
- searchParams.delete('sin');
28
- searchParams.delete('sort');
29
- searchParams.delete('query');
30
- searchParams.delete('page');
31
- searchParams.delete('and[]');
32
- searchParams.delete('not[]');
33
- window.history.replaceState({}, '', url);
34
- });
35
-
36
21
  it('clear existing filter for facets & sort-bar', async () => {
37
22
  const el = await fixture<CollectionBrowser>(
38
23
  html`<collection-browser></collection-browser>`
@@ -385,11 +370,8 @@ describe('Collection Browser', () => {
385
370
  });
386
371
 
387
372
  it('sets sort properties when user changes sort', async () => {
388
- const searchService = new MockSearchService();
389
373
  const el = await fixture<CollectionBrowser>(
390
- html`<collection-browser
391
- .searchService=${searchService}
392
- ></collection-browser>`
374
+ html`<collection-browser></collection-browser>`
393
375
  );
394
376
 
395
377
  expect(el.selectedSort).to.equal(SortField.relevance);
@@ -415,17 +397,10 @@ describe('Collection Browser', () => {
415
397
  });
416
398
 
417
399
  it('scrolls to page', async () => {
418
- const searchService = new MockSearchService();
419
400
  const el = await fixture<CollectionBrowser>(
420
- html`<collection-browser
421
- .searchService=${searchService}
422
- ></collection-browser>`
401
+ html`<collection-browser></collection-browser>`
423
402
  );
424
403
 
425
- // Infinite scroller won't exist unless there's a base query
426
- el.baseQuery = 'collection:foo';
427
- await el.updateComplete;
428
-
429
404
  const infiniteScroller = el.shadowRoot?.querySelector(
430
405
  'infinite-scroller'
431
406
  ) as InfiniteScroller;
@@ -460,10 +435,6 @@ describe('Collection Browser', () => {
460
435
  );
461
436
  const infiniteScrollerRefreshSpy = sinon.spy();
462
437
 
463
- // Infinite scroller won't exist unless there's a base query
464
- el.baseQuery = 'collection:foo';
465
- await el.updateComplete;
466
-
467
438
  const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');
468
439
  (infiniteScroller as InfiniteScroller).reload = infiniteScrollerRefreshSpy;
469
440
  expect(infiniteScrollerRefreshSpy.called).to.be.false;
@@ -1,10 +1,11 @@
1
1
  /* eslint-disable import/no-duplicates */
2
- import { expect, fixture, oneEvent } from '@open-wc/testing';
2
+ import { expect, fixture } from '@open-wc/testing';
3
3
  import { html } from 'lit';
4
4
  import { Aggregation } from '@internetarchive/search-service';
5
5
  import type { MoreFacetsContent } from '../../src/collection-facets/more-facets-content';
6
6
  import '../../src/collection-facets/more-facets-content';
7
7
  import { MockSearchService } from '../mocks/mock-search-service';
8
+ import { MockAnalyticsHandler } from '../mocks/mock-analytics-handler';
8
9
 
9
10
  const selectedFacetsGroup = {
10
11
  title: 'Media Type',
@@ -126,21 +127,52 @@ describe('More facets content', () => {
126
127
  expect(bucket?.count).to.equal(5);
127
128
  });
128
129
 
129
- it('page number clicked event', async () => {
130
- const searchService = new MockSearchService();
130
+ it('cancel button clicked event', async () => {
131
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
131
132
 
132
133
  const el = await fixture<MoreFacetsContent>(
133
134
  html`<more-facets-content
134
- .searchService=${searchService}
135
+ .analyticsHandler=${mockAnalyticsHandler}
135
136
  ></more-facets-content>`
136
137
  );
137
138
 
138
- setTimeout(() =>
139
- el.dispatchEvent(
140
- new CustomEvent('pageNumberClicked', { detail: { page: 15 } })
141
- )
139
+ el.facetsLoading = false;
140
+ el.paginationSize = 5;
141
+ await el.updateComplete;
142
+
143
+ // select cancel button
144
+ const cancelButton = el.shadowRoot?.querySelector(
145
+ '.footer > .btn-cancel'
146
+ ) as HTMLButtonElement;
147
+ cancelButton?.click();
148
+
149
+ expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');
150
+ expect(mockAnalyticsHandler.callAction).to.equal('closeMoreFacetsModal');
151
+ expect(mockAnalyticsHandler.callLabel).to.equal('undefined');
152
+ });
153
+
154
+ it('facet apply button clicked event', async () => {
155
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
156
+
157
+ const el = await fixture<MoreFacetsContent>(
158
+ html`<more-facets-content
159
+ .analyticsHandler=${mockAnalyticsHandler}
160
+ ></more-facets-content>`
142
161
  );
143
- const { detail } = await oneEvent(el, 'pageNumberClicked');
144
- expect(detail?.page).to.equal(15);
162
+
163
+ el.facetsLoading = false;
164
+ el.paginationSize = 5;
165
+ el.facetKey = 'collection';
166
+ await el.updateComplete;
167
+
168
+ // select submit button
169
+ const submitButton = el.shadowRoot?.querySelector(
170
+ '.footer > .btn-submit'
171
+ ) as HTMLButtonElement;
172
+ submitButton?.click();
173
+
174
+ expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');
175
+ expect(mockAnalyticsHandler.callAction).to.equal('applyMoreFacetsModal');
176
+ expect(mockAnalyticsHandler.callLabel).to.equal('collection');
145
177
  });
146
178
  });
@@ -15,6 +15,7 @@ import {
15
15
  LanguageCodeHandler,
16
16
  LanguageCodeHandlerInterface,
17
17
  } from '../src/language-code-handler/language-code-handler';
18
+ import { MockAnalyticsHandler } from './mocks/mock-analytics-handler';
18
19
 
19
20
  describe('Collection Facets', () => {
20
21
  it('has loader', async () => {
@@ -60,7 +61,7 @@ describe('Collection Facets', () => {
60
61
  const titleFacetRow = titleFacetGroup
61
62
  ?.querySelector('facets-template')
62
63
  ?.shadowRoot?.querySelector('.facet-row');
63
- console.log(titleFacetGroup?.querySelector('facets-template'));
64
+
64
65
  expect(titleFacetRow?.textContent?.trim()).to.satisfy((text: string) =>
65
66
  /^foo\s*5$/.test(text)
66
67
  );
@@ -553,4 +554,64 @@ describe('Collection Facets', () => {
553
554
  expect(eventFacet).to.equal('subject' as FacetOption);
554
555
  });
555
556
  });
557
+
558
+ it('fire analytics on more link', async () => {
559
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
560
+
561
+ const el = await fixture<CollectionFacets>(
562
+ html`<collection-facets
563
+ .analyticsHandler=${mockAnalyticsHandler}
564
+ ></collection-facets>`
565
+ );
566
+ const aggs: Record<string, Aggregation> = {
567
+ subject: new Aggregation({
568
+ buckets: [
569
+ {
570
+ key: 'foo',
571
+ doc_count: 5,
572
+ },
573
+ {
574
+ key: 'fi',
575
+ doc_count: 5,
576
+ },
577
+ {
578
+ key: 'fum',
579
+ doc_count: 5,
580
+ },
581
+ {
582
+ key: 'flee',
583
+ doc_count: 5,
584
+ },
585
+ {
586
+ key: 'wheee',
587
+ doc_count: 5,
588
+ },
589
+ {
590
+ key: 'whooo',
591
+ doc_count: 5,
592
+ },
593
+ {
594
+ key: 'boop',
595
+ doc_count: 5,
596
+ },
597
+ ],
598
+ }),
599
+ };
600
+
601
+ el.aggregations = aggs;
602
+ await el.updateComplete;
603
+
604
+ const moreLink = el.shadowRoot?.querySelector(
605
+ '.more-link'
606
+ ) as HTMLButtonElement;
607
+
608
+ expect(moreLink).to.exist; // has link
609
+
610
+ moreLink?.click();
611
+ await el.updateComplete;
612
+
613
+ expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');
614
+ expect(mockAnalyticsHandler.callAction).to.equal('showMoreFacetsModal');
615
+ expect(mockAnalyticsHandler.callLabel).to.equal('subject');
616
+ });
556
617
  });
package/tsconfig.json CHANGED
@@ -1,21 +1,21 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2018",
4
- "module": "esnext",
5
- "moduleResolution": "node",
6
- "noEmitOnError": true,
7
- "lib": ["es2017", "dom"],
8
- "strict": true,
9
- "esModuleInterop": false,
10
- "allowSyntheticDefaultImports": true,
11
- "experimentalDecorators": true,
12
- "importHelpers": true,
13
- "outDir": "dist",
14
- "sourceMap": true,
15
- "inlineSources": true,
16
- "rootDir": "./",
17
- "declaration": true,
18
- "importsNotUsedAsValues": "error"
19
- },
20
- "include": ["src", "test", "index.ts", "types"],
21
- }
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es2018",
4
+ "module": "esnext",
5
+ "moduleResolution": "node",
6
+ "noEmitOnError": true,
7
+ "lib": ["es2017", "dom"],
8
+ "strict": true,
9
+ "esModuleInterop": false,
10
+ "allowSyntheticDefaultImports": true,
11
+ "experimentalDecorators": true,
12
+ "importHelpers": true,
13
+ "outDir": "dist",
14
+ "sourceMap": true,
15
+ "inlineSources": true,
16
+ "rootDir": "./",
17
+ "declaration": true,
18
+ "importsNotUsedAsValues": "error"
19
+ },
20
+ "include": ["src", "test", "index.ts", "types"],
21
+ }
@@ -1,30 +1,30 @@
1
- // import { hmrPlugin, presets } from '@open-wc/dev-server-hmr';
2
-
3
- /** Use Hot Module replacement by adding --hmr to the start command */
4
- const hmr = process.argv.includes('--hmr');
5
-
6
- export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
7
- nodeResolve: true,
8
- open: '/',
9
- watch: !hmr,
10
-
11
- /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
12
- // esbuildTarget: 'auto'
13
-
14
- /** Set appIndex to enable SPA routing */
15
- // appIndex: 'demo/index.html',
16
-
17
- /** Confgure bare import resolve plugin */
18
- // nodeResolve: {
19
- // exportConditions: ['browser', 'development']
20
- // },
21
-
22
- plugins: [
23
- /** Use Hot Module Replacement by uncommenting. Requires @open-wc/dev-server-hmr plugin */
24
- // hmr && hmrPlugin({ exclude: ['**/*/node_modules/**/*'], presets: [presets.litElement] }),
25
- ],
26
-
27
- http2: true,
28
- sslCert: './local.archive.org.cert',
29
- sslKey: './local.archive.org.key',
30
- });
1
+ // import { hmrPlugin, presets } from '@open-wc/dev-server-hmr';
2
+
3
+ /** Use Hot Module replacement by adding --hmr to the start command */
4
+ const hmr = process.argv.includes('--hmr');
5
+
6
+ export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
7
+ nodeResolve: true,
8
+ open: '/',
9
+ watch: !hmr,
10
+
11
+ /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
12
+ // esbuildTarget: 'auto'
13
+
14
+ /** Set appIndex to enable SPA routing */
15
+ // appIndex: 'demo/index.html',
16
+
17
+ /** Confgure bare import resolve plugin */
18
+ // nodeResolve: {
19
+ // exportConditions: ['browser', 'development']
20
+ // },
21
+
22
+ plugins: [
23
+ /** Use Hot Module Replacement by uncommenting. Requires @open-wc/dev-server-hmr plugin */
24
+ // hmr && hmrPlugin({ exclude: ['**/*/node_modules/**/*'], presets: [presets.litElement] }),
25
+ ],
26
+
27
+ http2: true,
28
+ sslCert: './local.archive.org.cert',
29
+ sslKey: './local.archive.org.key',
30
+ });
@@ -1,41 +1,41 @@
1
- // import { playwrightLauncher } from '@web/test-runner-playwright';
2
-
3
- const filteredLogs = ['Running in dev mode', 'lit-html is in dev mode'];
4
-
5
- export default /** @type {import("@web/test-runner").TestRunnerConfig} */ ({
6
- /** Test files to run */
7
- files: 'dist/test/**/*.test.js',
8
-
9
- /** Resolve bare module imports */
10
- nodeResolve: {
11
- exportConditions: ['browser', 'development'],
12
- },
13
-
14
- /** Filter out lit dev mode logs */
15
- filterBrowserLogs(log) {
16
- for (const arg of log.args) {
17
- if (typeof arg === 'string' && filteredLogs.some(l => arg.includes(l))) {
18
- return false;
19
- }
20
- }
21
- return true;
22
- },
23
-
24
- /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
25
- // esbuildTarget: 'auto',
26
-
27
- /** Amount of browsers to run concurrently */
28
- // concurrentBrowsers: 2,
29
-
30
- /** Amount of test files per browser to test concurrently */
31
- // concurrency: 1,
32
-
33
- /** Browsers to run tests on */
34
- // browsers: [
35
- // playwrightLauncher({ product: 'chromium' }),
36
- // playwrightLauncher({ product: 'firefox' }),
37
- // playwrightLauncher({ product: 'webkit' }),
38
- // ],
39
-
40
- // See documentation for all available options
41
- });
1
+ // import { playwrightLauncher } from '@web/test-runner-playwright';
2
+
3
+ const filteredLogs = ['Running in dev mode', 'lit-html is in dev mode'];
4
+
5
+ export default /** @type {import("@web/test-runner").TestRunnerConfig} */ ({
6
+ /** Test files to run */
7
+ files: 'dist/test/**/*.test.js',
8
+
9
+ /** Resolve bare module imports */
10
+ nodeResolve: {
11
+ exportConditions: ['browser', 'development'],
12
+ },
13
+
14
+ /** Filter out lit dev mode logs */
15
+ filterBrowserLogs(log) {
16
+ for (const arg of log.args) {
17
+ if (typeof arg === 'string' && filteredLogs.some(l => arg.includes(l))) {
18
+ return false;
19
+ }
20
+ }
21
+ return true;
22
+ },
23
+
24
+ /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
25
+ // esbuildTarget: 'auto',
26
+
27
+ /** Amount of browsers to run concurrently */
28
+ // concurrentBrowsers: 2,
29
+
30
+ /** Amount of test files per browser to test concurrently */
31
+ // concurrency: 1,
32
+
33
+ /** Browsers to run tests on */
34
+ // browsers: [
35
+ // playwrightLauncher({ product: 'chromium' }),
36
+ // playwrightLauncher({ product: 'firefox' }),
37
+ // playwrightLauncher({ product: 'webkit' }),
38
+ // ],
39
+
40
+ // See documentation for all available options
41
+ });