@internetarchive/collection-browser 0.2.18 → 0.2.20-alpha.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 (64) hide show
  1. package/dist/src/app-root.d.ts +6 -0
  2. package/dist/src/app-root.js +94 -1
  3. package/dist/src/app-root.js.map +1 -1
  4. package/dist/src/collection-browser.d.ts +14 -1
  5. package/dist/src/collection-browser.js +133 -20
  6. package/dist/src/collection-browser.js.map +1 -1
  7. package/dist/src/collection-facets.d.ts +2 -0
  8. package/dist/src/collection-facets.js +9 -0
  9. package/dist/src/collection-facets.js.map +1 -1
  10. package/dist/src/models.d.ts +2 -0
  11. package/dist/src/models.js +8 -0
  12. package/dist/src/models.js.map +1 -1
  13. package/dist/src/tiles/grid/item-tile.d.ts +5 -2
  14. package/dist/src/tiles/grid/item-tile.js +28 -2
  15. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  16. package/dist/src/tiles/image-block.js +1 -1
  17. package/dist/src/tiles/image-block.js.map +1 -1
  18. package/dist/src/tiles/list/tile-list.d.ts +2 -0
  19. package/dist/src/tiles/list/tile-list.js +14 -1
  20. package/dist/src/tiles/list/tile-list.js.map +1 -1
  21. package/dist/src/tiles/text-snippet-block.d.ts +29 -0
  22. package/dist/src/tiles/text-snippet-block.js +128 -0
  23. package/dist/src/tiles/text-snippet-block.js.map +1 -0
  24. package/dist/src/tiles/tile-dispatcher.js +1 -0
  25. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  26. package/dist/src/utils/analytics-events.d.ts +18 -0
  27. package/dist/src/utils/analytics-events.js +21 -0
  28. package/dist/src/utils/analytics-events.js.map +1 -0
  29. package/dist/test/collection-browser.test.js +91 -5
  30. package/dist/test/collection-browser.test.js.map +1 -1
  31. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -0
  32. package/dist/test/mocks/mock-analytics-handler.js +16 -0
  33. package/dist/test/mocks/mock-analytics-handler.js.map +1 -0
  34. package/dist/test/mocks/mock-search-responses.d.ts +2 -1
  35. package/dist/test/mocks/mock-search-responses.js +27 -1
  36. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  37. package/dist/test/mocks/mock-search-service.js +6 -2
  38. package/dist/test/mocks/mock-search-service.js.map +1 -1
  39. package/dist/test/text-snippet-block.test.d.ts +1 -0
  40. package/dist/test/text-snippet-block.test.js +52 -0
  41. package/dist/test/text-snippet-block.test.js.map +1 -0
  42. package/dist/test/tiles/grid/item-tile.test.js +15 -0
  43. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  44. package/dist/test/tiles/list/tile-list.test.d.ts +1 -0
  45. package/dist/test/tiles/list/tile-list.test.js +42 -0
  46. package/dist/test/tiles/list/tile-list.test.js.map +1 -0
  47. package/package.json +4 -3
  48. package/src/app-root.ts +103 -2
  49. package/src/collection-browser.ts +153 -17
  50. package/src/collection-facets.ts +13 -1
  51. package/src/models.ts +10 -0
  52. package/src/tiles/grid/item-tile.ts +35 -2
  53. package/src/tiles/image-block.ts +1 -1
  54. package/src/tiles/list/tile-list.ts +14 -1
  55. package/src/tiles/text-snippet-block.ts +130 -0
  56. package/src/tiles/tile-dispatcher.ts +4 -0
  57. package/src/utils/analytics-events.ts +19 -0
  58. package/test/collection-browser.test.ts +131 -4
  59. package/test/mocks/mock-analytics-handler.ts +30 -0
  60. package/test/mocks/mock-search-responses.ts +34 -1
  61. package/test/mocks/mock-search-service.ts +10 -2
  62. package/test/text-snippet-block.test.ts +69 -0
  63. package/test/tiles/grid/item-tile.test.ts +19 -0
  64. package/test/tiles/list/tile-list.test.ts +51 -0
@@ -1,3 +1,4 @@
1
+ import { AnalyticsEvent } from '@internetarchive/analytics-manager';
1
2
  import { LitElement, PropertyValues } from 'lit';
2
3
  import '../src/collection-browser';
3
4
  export declare class AppRoot extends LitElement {
@@ -12,9 +13,13 @@ export declare class AppRoot extends LitElement {
12
13
  private rowGap;
13
14
  private colGap;
14
15
  private loggedIn;
16
+ latestAction?: AnalyticsEvent;
15
17
  private baseQueryField;
16
18
  private pageNumberInput;
17
19
  private collectionBrowser;
20
+ private analyticsManager;
21
+ private analyticsHandler;
22
+ private sendAnalytics;
18
23
  private searchPressed;
19
24
  private changePagePressed;
20
25
  protected updated(changed: PropertyValues): void;
@@ -23,6 +28,7 @@ export declare class AppRoot extends LitElement {
23
28
  private baseQueryChanged;
24
29
  private loginChanged;
25
30
  private outlineChanged;
31
+ private snippetsChanged;
26
32
  private rowGapChanged;
27
33
  private colGapChanged;
28
34
  private widthChanged;
@@ -1,8 +1,9 @@
1
1
  import { __decorate } from "tslib";
2
+ import { AnalyticsManager, } from '@internetarchive/analytics-manager';
2
3
  import { SearchService } from '@internetarchive/search-service';
3
4
  import { LocalCache } from '@internetarchive/local-cache';
4
5
  import { html, css, LitElement } from 'lit';
5
- import { customElement, query, state } from 'lit/decorators.js';
6
+ import { customElement, property, query, state } from 'lit/decorators.js';
6
7
  import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
7
8
  import { CollectionNameCache } from '@internetarchive/collection-name-cache';
8
9
  import '../src/collection-browser';
@@ -21,6 +22,18 @@ let AppRoot = class AppRoot extends LitElement {
21
22
  this.rowGap = 1.7;
22
23
  this.colGap = 1.7;
23
24
  this.loggedIn = false;
25
+ this.analyticsManager = new AnalyticsManager();
26
+ this.analyticsHandler = {
27
+ sendPing: this.sendAnalytics.bind(this),
28
+ sendEvent: this.sendAnalytics.bind(this),
29
+ sendEventNoSampling: this.sendAnalytics.bind(this),
30
+ };
31
+ }
32
+ sendAnalytics(ae) {
33
+ var _a;
34
+ console.log('Analytics Received ----', ae);
35
+ this.latestAction = ae;
36
+ (_a = this.analyticsManager) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling(ae);
24
37
  }
25
38
  searchPressed(e) {
26
39
  var _a, _b;
@@ -65,6 +78,22 @@ let AppRoot = class AppRoot extends LitElement {
65
78
  <input type="submit" value="Go" />
66
79
  </form>
67
80
 
81
+ <div id="last-event">
82
+ <button
83
+ @click=${() => {
84
+ var _a;
85
+ const details = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.getElementById('latest-event-details');
86
+ details === null || details === void 0 ? void 0 : details.classList.toggle('hidden');
87
+ }}
88
+ >
89
+ Last Event Captured
90
+ </button>
91
+ <pre id="latest-event-details">
92
+ ${JSON.stringify(this.latestAction, null, 2)}
93
+ </pre
94
+ >
95
+ </div>
96
+
68
97
  <div id="cell-controls">
69
98
  <div id="cell-size-control">
70
99
  <div>
@@ -109,6 +138,14 @@ let AppRoot = class AppRoot extends LitElement {
109
138
  @click=${this.loginChanged}
110
139
  />
111
140
  </div>
141
+ <div>
142
+ <label for="show-dummy-snippets">Show dummy snippets:</label>
143
+ <input
144
+ type="checkbox"
145
+ id="show-dummy-snippets"
146
+ @click=${this.snippetsChanged}
147
+ />
148
+ </div>
112
149
  </div>
113
150
  <div id="cell-gap-control">
114
151
  <div>
@@ -150,6 +187,7 @@ let AppRoot = class AppRoot extends LitElement {
150
187
  .collectionNameCache=${this.collectionNameCache}
151
188
  .showHistogramDatePicker=${true}
152
189
  .loggedIn=${this.loggedIn}
190
+ .analyticsHandler=${this.analyticsHandler}
153
191
  @visiblePageChanged=${this.visiblePageChanged}
154
192
  @baseQueryChanged=${this.baseQueryChanged}
155
193
  >
@@ -178,6 +216,48 @@ let AppRoot = class AppRoot extends LitElement {
178
216
  this.collectionBrowser.style.removeProperty('--infiniteScrollerCellOutline');
179
217
  }
180
218
  }
219
+ async snippetsChanged(e) {
220
+ const target = e.target;
221
+ if (target.checked) {
222
+ // Decorate the default search service with a wrapper that adds
223
+ // dummy snippets to any successful searches
224
+ this.searchService = {
225
+ ...SearchService.default,
226
+ async search(params) {
227
+ var _a;
228
+ const result = await SearchService.default.search(params);
229
+ (_a = result.success) === null || _a === void 0 ? void 0 : _a.response.docs.forEach(doc => {
230
+ const metadata = doc.rawMetadata;
231
+ if (metadata) {
232
+ metadata.snippets = [
233
+ 'this is a text {{{snippet}}} block with potentially',
234
+ 'multiple {{{snippets}}} and such',
235
+ 'but the {{{snippet}}} block may be quite long perhaps',
236
+ 'depending on how many {{{snippet}}} matches there are',
237
+ 'there may be multiple lines of {{{snippets}}} to show',
238
+ 'but each {{{snippet}}} should be relatively short',
239
+ 'and {{{snippets}}} are each a {{{snippet}}} of text',
240
+ 'but every {{{snippet}}} might have multiple matches',
241
+ 'the {{{snippets}}} should be separated and surrounded by ellipses',
242
+ ];
243
+ }
244
+ });
245
+ return result;
246
+ },
247
+ };
248
+ }
249
+ else {
250
+ // Restore the default seach service
251
+ this.searchService = SearchService.default;
252
+ }
253
+ // Re-perform the current search to show/hide the snippets immediately
254
+ const oldQuery = this.searchQuery;
255
+ this.searchQuery = ''; // Should just reset to the placeholder
256
+ await this.updateComplete;
257
+ // For unclear reasons, Safari refuses to re-apply the old query until the next tick, hence:
258
+ await new Promise(res => setTimeout(res, 0));
259
+ this.searchQuery = oldQuery; // Re-apply the original query
260
+ }
181
261
  rowGapChanged(e) {
182
262
  const input = e.target;
183
263
  this.rowGap = parseFloat(input.value);
@@ -247,6 +327,16 @@ AppRoot.styles = css `
247
327
  #cell-gap-control {
248
328
  margin-left: 1rem;
249
329
  }
330
+
331
+ #last-event {
332
+ background-color: aliceblue;
333
+ padding: 5px;
334
+ margin: 5px auto;
335
+ }
336
+
337
+ .hidden {
338
+ display: none;
339
+ }
250
340
  `;
251
341
  __decorate([
252
342
  state()
@@ -269,6 +359,9 @@ __decorate([
269
359
  __decorate([
270
360
  state()
271
361
  ], AppRoot.prototype, "loggedIn", void 0);
362
+ __decorate([
363
+ property({ type: Object, reflect: false })
364
+ ], AppRoot.prototype, "latestAction", void 0);
272
365
  __decorate([
273
366
  query('#base-query-field')
274
367
  ], AppRoot.prototype, "baseQueryField", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"app-root.js","sourceRoot":"","sources":["../../src/app-root.ts"],"names":[],"mappings":"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","sourcesContent":["import { SearchService } from '@internetarchive/search-service';\nimport { LocalCache } from '@internetarchive/local-cache';\nimport { html, css, LitElement, PropertyValues } from 'lit';\nimport { customElement, query, state } from 'lit/decorators.js';\nimport { SharedResizeObserver } from '@internetarchive/shared-resize-observer';\nimport { CollectionNameCache } from '@internetarchive/collection-name-cache';\nimport type { CollectionBrowser } from '../src/collection-browser';\nimport '../src/collection-browser';\n\n@customElement('app-root')\nexport class AppRoot extends LitElement {\n private searchService = SearchService.default;\n\n private resizeObserver = new SharedResizeObserver();\n\n private localCache = new LocalCache();\n\n private collectionNameCache = new CollectionNameCache({\n searchService: this.searchService,\n localCache: this.localCache,\n });\n\n @state() private currentPage?: number;\n\n @state() private searchQuery?: string;\n\n @state() private cellWidth: number = 18;\n\n @state() private cellHeight: number = 29;\n\n @state() private rowGap: number = 1.7;\n\n @state() private colGap: number = 1.7;\n\n @state() private loggedIn: boolean = false;\n\n @query('#base-query-field') private baseQueryField!: HTMLInputElement;\n\n @query('#page-number-input') private pageNumberInput!: HTMLInputElement;\n\n @query('collection-browser') private collectionBrowser!: CollectionBrowser;\n\n private searchPressed(e: Event) {\n e.preventDefault();\n this.searchQuery = this.baseQueryField.value;\n if ((this.currentPage ?? 1) > 1) {\n this.collectionBrowser.goToPage(this.currentPage ?? 1);\n }\n }\n\n private changePagePressed(e: Event) {\n e.preventDefault();\n this.currentPage = this.pageNumberInput.valueAsNumber;\n this.collectionBrowser.goToPage(this.currentPage);\n }\n\n protected updated(changed: PropertyValues): void {\n if (changed.has('currentPage') && this.currentPage) {\n this.pageNumberInput.value = this.currentPage.toString();\n }\n\n if (changed.has('searchQuery')) {\n this.queryUpdated();\n }\n }\n\n private queryUpdated() {\n this.collectionBrowser.baseQuery = this.searchQuery;\n }\n\n render() {\n return html`\n <div id=\"dev-tools\">\n <form @submit=${this.searchPressed}>\n Query:\n <input\n type=\"text\"\n id=\"base-query-field\"\n .value=${this.searchQuery ?? ''}\n />\n <input type=\"submit\" value=\"Search\" />\n </form>\n\n <form @submit=${this.changePagePressed}>\n Page: <input type=\"number\" value=\"1\" id=\"page-number-input\" />\n <input type=\"submit\" value=\"Go\" />\n </form>\n\n <div id=\"cell-controls\">\n <div id=\"cell-size-control\">\n <div>\n <label for=\"cell-width-slider\">Minimum cell width:</label>\n <input\n type=\"range\"\n min=\"10\"\n max=\"100\"\n value=\"18\"\n step=\"0.1\"\n id=\"cell-width-slider\"\n @input=${this.widthChanged}\n />\n <span>${this.cellWidth}rem</span>\n </div>\n <div>\n <label for=\"cell-height-slider\">Cell height:</label>\n <input\n type=\"range\"\n min=\"10\"\n max=\"100\"\n value=\"29\"\n step=\"0.1\"\n id=\"cell-height-slider\"\n @input=${this.heightChanged}\n />\n <span>${this.cellHeight}rem</span>\n </div>\n <div>\n <label for=\"show-outline-check\">Show outlines:</label>\n <input\n type=\"checkbox\"\n id=\"show-outline-check\"\n @click=${this.outlineChanged}\n />\n </div>\n <div>\n <label for=\"simulate-login\">Simulate Login:</label>\n <input\n type=\"checkbox\"\n id=\"simulate-login\"\n @click=${this.loginChanged}\n />\n </div>\n </div>\n <div id=\"cell-gap-control\">\n <div>\n <label for=\"cell-row-gap-slider\">Row gap:</label>\n <input\n type=\"range\"\n min=\"0\"\n max=\"5\"\n value=\"1.7\"\n step=\"0.1\"\n id=\"cell-row-gap-slider\"\n @input=${this.rowGapChanged}\n />\n <span>${this.rowGap}rem</span>\n </div>\n <div>\n <label for=\"cell-col-gap-slider\">Col gap:</label>\n <input\n type=\"range\"\n min=\"0\"\n max=\"5\"\n value=\"1.7\"\n step=\"0.1\"\n id=\"cell-col-gap-slider\"\n @input=${this.colGapChanged}\n />\n <span>${this.colGap}rem</span>\n </div>\n </div>\n </div>\n </div>\n\n <div id=\"collection-browser-container\">\n <collection-browser\n .baseNavigationUrl=${'https://archive.org'}\n .baseImageUrl=${'https://archive.org'}\n .searchService=${this.searchService}\n .resizeObserver=${this.resizeObserver}\n .collectionNameCache=${this.collectionNameCache}\n .showHistogramDatePicker=${true}\n .loggedIn=${this.loggedIn}\n @visiblePageChanged=${this.visiblePageChanged}\n @baseQueryChanged=${this.baseQueryChanged}\n >\n </collection-browser>\n </div>\n `;\n }\n\n private baseQueryChanged(e: CustomEvent<{ baseQuery?: string }>) {\n this.searchQuery = e.detail.baseQuery;\n }\n\n private loginChanged(e: Event) {\n const target = e.target as HTMLInputElement;\n if (target.checked) {\n this.loggedIn = true;\n } else {\n this.loggedIn = false;\n }\n }\n\n private outlineChanged(e: Event) {\n const target = e.target as HTMLInputElement;\n if (target.checked) {\n this.collectionBrowser.style.setProperty(\n '--infiniteScrollerCellOutline',\n '1px solid #33D1FF'\n );\n } else {\n this.collectionBrowser.style.removeProperty(\n '--infiniteScrollerCellOutline'\n );\n }\n }\n\n private rowGapChanged(e: Event) {\n const input = e.target as HTMLInputElement;\n this.rowGap = parseFloat(input.value);\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserRowGap',\n `${input.value}rem`\n );\n }\n\n private colGapChanged(e: Event) {\n const input = e.target as HTMLInputElement;\n this.colGap = parseFloat(input.value);\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserColGap',\n `${input.value}rem`\n );\n }\n\n private widthChanged(e: Event) {\n const input = e.target as HTMLInputElement;\n this.cellWidth = parseFloat(input.value);\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserCellMinWidth',\n `${input.value}rem`\n );\n }\n\n private heightChanged(e: Event) {\n const input = e.target as HTMLInputElement;\n this.cellHeight = parseFloat(input.value);\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserCellMinHeight',\n `${input.value}rem`\n );\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserCellMaxHeight',\n `${input.value}rem`\n );\n }\n\n private visiblePageChanged(e: CustomEvent<{ pageNumber: number }>) {\n const { pageNumber } = e.detail;\n if (pageNumber === this.currentPage) return;\n this.currentPage = pageNumber;\n }\n\n static styles = css`\n :host {\n display: block;\n }\n\n input,\n button {\n font-size: 1.6rem;\n }\n\n collection-browser {\n margin-top: 30rem;\n }\n\n #base-query-field {\n width: 300px;\n }\n\n #dev-tools {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 10;\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n padding: 0.5rem 1rem;\n border: 1px solid black;\n }\n\n #cell-controls {\n display: flex;\n }\n\n #cell-controls label {\n display: inline-block;\n width: 10rem;\n }\n\n #cell-gap-control {\n margin-left: 1rem;\n }\n `;\n}\n"]}
1
+ {"version":3,"file":"app-root.js","sourceRoot":"","sources":["../../src/app-root.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AnalyticsEvent,\n AnalyticsManager,\n} from '@internetarchive/analytics-manager';\nimport { SearchService } from '@internetarchive/search-service';\nimport { LocalCache } from '@internetarchive/local-cache';\nimport { html, css, LitElement, PropertyValues } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { SharedResizeObserver } from '@internetarchive/shared-resize-observer';\nimport { CollectionNameCache } from '@internetarchive/collection-name-cache';\n\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport type { CollectionBrowser } from '../src/collection-browser';\n\nimport '../src/collection-browser';\n\n@customElement('app-root')\nexport class AppRoot extends LitElement {\n private searchService = SearchService.default;\n\n private resizeObserver = new SharedResizeObserver();\n\n private localCache = new LocalCache();\n\n private collectionNameCache = new CollectionNameCache({\n searchService: this.searchService,\n localCache: this.localCache,\n });\n\n @state() private currentPage?: number;\n\n @state() private searchQuery?: string;\n\n @state() private cellWidth: number = 18;\n\n @state() private cellHeight: number = 29;\n\n @state() private rowGap: number = 1.7;\n\n @state() private colGap: number = 1.7;\n\n @state() private loggedIn: boolean = false;\n\n @property({ type: Object, reflect: false }) latestAction?: AnalyticsEvent;\n\n @query('#base-query-field') private baseQueryField!: HTMLInputElement;\n\n @query('#page-number-input') private pageNumberInput!: HTMLInputElement;\n\n @query('collection-browser') private collectionBrowser!: CollectionBrowser;\n\n private analyticsManager = new AnalyticsManager();\n\n private analyticsHandler: AnalyticsManagerInterface = {\n sendPing: this.sendAnalytics.bind(this),\n sendEvent: this.sendAnalytics.bind(this),\n sendEventNoSampling: this.sendAnalytics.bind(this),\n };\n\n private sendAnalytics(ae: AnalyticsEvent) {\n console.log('Analytics Received ----', ae);\n this.latestAction = ae;\n this.analyticsManager?.sendEventNoSampling(ae);\n }\n\n private searchPressed(e: Event) {\n e.preventDefault();\n this.searchQuery = this.baseQueryField.value;\n if ((this.currentPage ?? 1) > 1) {\n this.collectionBrowser.goToPage(this.currentPage ?? 1);\n }\n }\n\n private changePagePressed(e: Event) {\n e.preventDefault();\n this.currentPage = this.pageNumberInput.valueAsNumber;\n this.collectionBrowser.goToPage(this.currentPage);\n }\n\n protected override updated(changed: PropertyValues): void {\n if (changed.has('currentPage') && this.currentPage) {\n this.pageNumberInput.value = this.currentPage.toString();\n }\n\n if (changed.has('searchQuery')) {\n this.queryUpdated();\n }\n }\n\n private queryUpdated() {\n this.collectionBrowser.baseQuery = this.searchQuery;\n }\n\n render() {\n return html`\n <div id=\"dev-tools\">\n <form @submit=${this.searchPressed}>\n Query:\n <input\n type=\"text\"\n id=\"base-query-field\"\n .value=${this.searchQuery ?? ''}\n />\n <input type=\"submit\" value=\"Search\" />\n </form>\n\n <form @submit=${this.changePagePressed}>\n Page: <input type=\"number\" value=\"1\" id=\"page-number-input\" />\n <input type=\"submit\" value=\"Go\" />\n </form>\n\n <div id=\"last-event\">\n <button\n @click=${() => {\n const details = this.shadowRoot?.getElementById(\n 'latest-event-details'\n );\n details?.classList.toggle('hidden');\n }}\n >\n Last Event Captured\n </button>\n <pre id=\"latest-event-details\">\n ${JSON.stringify(this.latestAction, null, 2)}\n </pre\n >\n </div>\n\n <div id=\"cell-controls\">\n <div id=\"cell-size-control\">\n <div>\n <label for=\"cell-width-slider\">Minimum cell width:</label>\n <input\n type=\"range\"\n min=\"10\"\n max=\"100\"\n value=\"18\"\n step=\"0.1\"\n id=\"cell-width-slider\"\n @input=${this.widthChanged}\n />\n <span>${this.cellWidth}rem</span>\n </div>\n <div>\n <label for=\"cell-height-slider\">Cell height:</label>\n <input\n type=\"range\"\n min=\"10\"\n max=\"100\"\n value=\"29\"\n step=\"0.1\"\n id=\"cell-height-slider\"\n @input=${this.heightChanged}\n />\n <span>${this.cellHeight}rem</span>\n </div>\n <div>\n <label for=\"show-outline-check\">Show outlines:</label>\n <input\n type=\"checkbox\"\n id=\"show-outline-check\"\n @click=${this.outlineChanged}\n />\n </div>\n <div>\n <label for=\"simulate-login\">Simulate Login:</label>\n <input\n type=\"checkbox\"\n id=\"simulate-login\"\n @click=${this.loginChanged}\n />\n </div>\n <div>\n <label for=\"show-dummy-snippets\">Show dummy snippets:</label>\n <input\n type=\"checkbox\"\n id=\"show-dummy-snippets\"\n @click=${this.snippetsChanged}\n />\n </div>\n </div>\n <div id=\"cell-gap-control\">\n <div>\n <label for=\"cell-row-gap-slider\">Row gap:</label>\n <input\n type=\"range\"\n min=\"0\"\n max=\"5\"\n value=\"1.7\"\n step=\"0.1\"\n id=\"cell-row-gap-slider\"\n @input=${this.rowGapChanged}\n />\n <span>${this.rowGap}rem</span>\n </div>\n <div>\n <label for=\"cell-col-gap-slider\">Col gap:</label>\n <input\n type=\"range\"\n min=\"0\"\n max=\"5\"\n value=\"1.7\"\n step=\"0.1\"\n id=\"cell-col-gap-slider\"\n @input=${this.colGapChanged}\n />\n <span>${this.colGap}rem</span>\n </div>\n </div>\n </div>\n </div>\n\n <div id=\"collection-browser-container\">\n <collection-browser\n .baseNavigationUrl=${'https://archive.org'}\n .baseImageUrl=${'https://archive.org'}\n .searchService=${this.searchService}\n .resizeObserver=${this.resizeObserver}\n .collectionNameCache=${this.collectionNameCache}\n .showHistogramDatePicker=${true}\n .loggedIn=${this.loggedIn}\n .analyticsHandler=${this.analyticsHandler}\n @visiblePageChanged=${this.visiblePageChanged}\n @baseQueryChanged=${this.baseQueryChanged}\n >\n </collection-browser>\n </div>\n `;\n }\n\n private baseQueryChanged(e: CustomEvent<{ baseQuery?: string }>) {\n this.searchQuery = e.detail.baseQuery;\n }\n\n private loginChanged(e: Event) {\n const target = e.target as HTMLInputElement;\n if (target.checked) {\n this.loggedIn = true;\n } else {\n this.loggedIn = false;\n }\n }\n\n private outlineChanged(e: Event) {\n const target = e.target as HTMLInputElement;\n if (target.checked) {\n this.collectionBrowser.style.setProperty(\n '--infiniteScrollerCellOutline',\n '1px solid #33D1FF'\n );\n } else {\n this.collectionBrowser.style.removeProperty(\n '--infiniteScrollerCellOutline'\n );\n }\n }\n\n private async snippetsChanged(e: Event) {\n const target = e.target as HTMLInputElement;\n if (target.checked) {\n // Decorate the default search service with a wrapper that adds\n // dummy snippets to any successful searches\n this.searchService = {\n ...SearchService.default,\n async search(params) {\n const result = await SearchService.default.search(params);\n result.success?.response.docs.forEach(doc => {\n const metadata = doc.rawMetadata;\n if (metadata) {\n metadata.snippets = [\n 'this is a text {{{snippet}}} block with potentially',\n 'multiple {{{snippets}}} and such',\n 'but the {{{snippet}}} block may be quite long perhaps',\n 'depending on how many {{{snippet}}} matches there are',\n 'there may be multiple lines of {{{snippets}}} to show',\n 'but each {{{snippet}}} should be relatively short',\n 'and {{{snippets}}} are each a {{{snippet}}} of text',\n 'but every {{{snippet}}} might have multiple matches',\n 'the {{{snippets}}} should be separated and surrounded by ellipses',\n ];\n }\n });\n return result;\n },\n };\n } else {\n // Restore the default seach service\n this.searchService = SearchService.default;\n }\n\n // Re-perform the current search to show/hide the snippets immediately\n const oldQuery = this.searchQuery;\n this.searchQuery = ''; // Should just reset to the placeholder\n await this.updateComplete;\n // For unclear reasons, Safari refuses to re-apply the old query until the next tick, hence:\n await new Promise(res => setTimeout(res, 0));\n this.searchQuery = oldQuery; // Re-apply the original query\n }\n\n private rowGapChanged(e: Event) {\n const input = e.target as HTMLInputElement;\n this.rowGap = parseFloat(input.value);\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserRowGap',\n `${input.value}rem`\n );\n }\n\n private colGapChanged(e: Event) {\n const input = e.target as HTMLInputElement;\n this.colGap = parseFloat(input.value);\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserColGap',\n `${input.value}rem`\n );\n }\n\n private widthChanged(e: Event) {\n const input = e.target as HTMLInputElement;\n this.cellWidth = parseFloat(input.value);\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserCellMinWidth',\n `${input.value}rem`\n );\n }\n\n private heightChanged(e: Event) {\n const input = e.target as HTMLInputElement;\n this.cellHeight = parseFloat(input.value);\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserCellMinHeight',\n `${input.value}rem`\n );\n this.collectionBrowser.style.setProperty(\n '--collectionBrowserCellMaxHeight',\n `${input.value}rem`\n );\n }\n\n private visiblePageChanged(e: CustomEvent<{ pageNumber: number }>) {\n const { pageNumber } = e.detail;\n if (pageNumber === this.currentPage) return;\n this.currentPage = pageNumber;\n }\n\n static styles = css`\n :host {\n display: block;\n }\n\n input,\n button {\n font-size: 1.6rem;\n }\n\n collection-browser {\n margin-top: 30rem;\n }\n\n #base-query-field {\n width: 300px;\n }\n\n #dev-tools {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 10;\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n padding: 0.5rem 1rem;\n border: 1px solid black;\n }\n\n #cell-controls {\n display: flex;\n }\n\n #cell-controls label {\n display: inline-block;\n width: 10rem;\n }\n\n #cell-gap-control {\n margin-left: 1rem;\n }\n\n #last-event {\n background-color: aliceblue;\n padding: 5px;\n margin: 5px auto;\n }\n\n .hidden {\n display: none;\n }\n `;\n}\n"]}
@@ -10,7 +10,7 @@ import './sort-filter-bar/sort-filter-bar';
10
10
  import './collection-facets';
11
11
  import './circular-activity-indicator';
12
12
  import './sort-filter-bar/sort-filter-bar';
13
- import { SelectedFacets, SortField, CollectionBrowserContext, CollectionDisplayMode } from './models';
13
+ import { SelectedFacets, SortField, CollectionBrowserContext, TileModel, CollectionDisplayMode, FacetOption } from './models';
14
14
  import { RestorationStateHandlerInterface } from './restoration-state-handler';
15
15
  import './empty-placeholder';
16
16
  export declare class CollectionBrowser extends LitElement implements InfiniteScrollerCellProviderInterface, SharedResizeObserverResizeHandlerInterface {
@@ -65,6 +65,7 @@ export declare class CollectionBrowser extends LitElement implements InfiniteScr
65
65
  private placeholderType;
66
66
  private contentContainer;
67
67
  private languageCodeHandler;
68
+ private analyticsHandler?;
68
69
  /**
69
70
  * When we're animated scrolling to the page, we don't want to fetch
70
71
  * all of the pages as it scrolls so this lets us know if we're scrolling
@@ -107,9 +108,18 @@ export declare class CollectionBrowser extends LitElement implements InfiniteScr
107
108
  private get infiniteScrollerTemplate();
108
109
  private get sortFilterBarTemplate();
109
110
  private userChangedSort;
111
+ private sendSortByAnaltyics;
110
112
  private selectedSortChanged;
111
113
  private displayModeChanged;
114
+ /** Send Analytics when sorting by title's first letter
115
+ * labels: 'start-<ToLetter>' | 'clear-<FromLetter>' | '<FromLetter>-<ToLetter>'
116
+ * */
117
+ private sendFilterByTitleAnalytics;
112
118
  private selectedTitleLetterChanged;
119
+ /** Send Analytics when filtering by creator's first letter
120
+ * labels: 'start-<ToLetter>' | 'clear-<FromLetter>' | '<FromLetter>-<ToLetter>'
121
+ * */
122
+ private sendFilterByCreatorAnalytics;
113
123
  private selectedCreatorLetterChanged;
114
124
  private titleLetterSelected;
115
125
  private creatorLetterSelected;
@@ -154,6 +164,7 @@ export declare class CollectionBrowser extends LitElement implements InfiniteScr
154
164
  */
155
165
  private get facetQuery();
156
166
  facetsChanged(e: CustomEvent<SelectedFacets>): void;
167
+ facetClickHandler(name: FacetOption, facetSelected: boolean, negative: boolean): void;
157
168
  private fetchFacets;
158
169
  /**
159
170
  * If we haven't changed the query, we don't need to fetch the full year histogram
@@ -204,6 +215,8 @@ export declare class CollectionBrowser extends LitElement implements InfiniteScr
204
215
  */
205
216
  private updateDataSource;
206
217
  private etreeTitle;
218
+ /** callback when a result is selected */
219
+ resultSelected(event: CustomEvent<TileModel>): void;
207
220
  cellForIndex(index: number): TemplateResult | undefined;
208
221
  /**
209
222
  * When the user scrolls near to the bottom of the page, fetch the next page
@@ -15,6 +15,7 @@ import { RestorationStateHandler, } from './restoration-state-handler';
15
15
  import chevronIcon from './assets/img/icons/chevron';
16
16
  import { LanguageCodeHandler } from './language-code-handler/language-code-handler';
17
17
  import './empty-placeholder';
18
+ import { analyticsActions, analyticsCategories, } from './utils/analytics-events';
18
19
  let CollectionBrowser = class CollectionBrowser extends LitElement {
19
20
  constructor() {
20
21
  super(...arguments);
@@ -181,7 +182,9 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
181
182
  ? this.totalResults.toLocaleString()
182
183
  : '-'}
183
184
  </span>
184
- <span id="big-results-label">Results</span>
185
+ <span id="big-results-label">
186
+ ${this.totalResults === 1 ? 'Result' : 'Results'}
187
+ </span>
185
188
  </div>
186
189
  </div>
187
190
  <div
@@ -212,18 +215,21 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
212
215
  ></infinite-scroller>`;
213
216
  }
214
217
  get sortFilterBarTemplate() {
215
- return html `<sort-filter-bar
216
- .selectedSort=${this.selectedSort}
217
- .sortDirection=${this.sortDirection}
218
- .displayMode=${this.displayMode}
219
- .selectedTitleFilter=${this.selectedTitleFilter}
220
- .selectedCreatorFilter=${this.selectedCreatorFilter}
221
- .resizeObserver=${this.resizeObserver}
222
- @sortChanged=${this.userChangedSort}
223
- @displayModeChanged=${this.displayModeChanged}
224
- @titleLetterChanged=${this.titleLetterSelected}
225
- @creatorLetterChanged=${this.creatorLetterSelected}
226
- ></sort-filter-bar>`;
218
+ return html `
219
+ <sort-filter-bar
220
+ .selectedSort=${this.selectedSort}
221
+ .sortDirection=${this.sortDirection}
222
+ .displayMode=${this.displayMode}
223
+ .selectedTitleFilter=${this.selectedTitleFilter}
224
+ .selectedCreatorFilter=${this.selectedCreatorFilter}
225
+ .resizeObserver=${this.resizeObserver}
226
+ @sortChanged=${this.userChangedSort}
227
+ @displayModeChanged=${this.displayModeChanged}
228
+ @titleLetterChanged=${this.titleLetterSelected}
229
+ @creatorLetterChanged=${this.creatorLetterSelected}
230
+ >
231
+ </sort-filter-bar>
232
+ `;
227
233
  }
228
234
  userChangedSort(e) {
229
235
  var _a;
@@ -235,6 +241,15 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
235
241
  }
236
242
  this.currentPage = 1;
237
243
  }
244
+ sendSortByAnaltyics(prevSortDirection) {
245
+ var _a;
246
+ const directionCleared = prevSortDirection && !this.sortDirection;
247
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
248
+ category: analyticsCategories.default,
249
+ action: analyticsActions.sortBy,
250
+ label: `${this.selectedSort}${this.sortDirection || directionCleared ? `-${this.sortDirection}` : ''}`,
251
+ });
252
+ }
238
253
  selectedSortChanged() {
239
254
  if (this.selectedSort === 'relevance' || this.sortDirection === null) {
240
255
  this.sortParam = null;
@@ -246,13 +261,55 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
246
261
  this.sortParam = { field: sortField, direction: this.sortDirection };
247
262
  }
248
263
  displayModeChanged(e) {
264
+ var _a;
249
265
  this.displayMode = e.detail.displayMode;
266
+ if (this.displayMode) {
267
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
268
+ category: analyticsCategories.default,
269
+ action: analyticsActions.displayMode,
270
+ label: this.displayMode,
271
+ });
272
+ }
273
+ }
274
+ /** Send Analytics when sorting by title's first letter
275
+ * labels: 'start-<ToLetter>' | 'clear-<FromLetter>' | '<FromLetter>-<ToLetter>'
276
+ * */
277
+ sendFilterByTitleAnalytics(prevSelectedLetter) {
278
+ var _a;
279
+ if (!prevSelectedLetter && !this.selectedTitleFilter) {
280
+ return;
281
+ }
282
+ const cleared = prevSelectedLetter && this.selectedTitleFilter === null;
283
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
284
+ category: analyticsCategories.default,
285
+ action: analyticsActions.filterByTitle,
286
+ label: cleared
287
+ ? `clear-${prevSelectedLetter}`
288
+ : `${prevSelectedLetter || 'start'}-${this.selectedTitleFilter}`,
289
+ });
250
290
  }
251
291
  selectedTitleLetterChanged() {
252
292
  this.titleQuery = this.selectedTitleFilter
253
293
  ? `firstTitle:${this.selectedTitleFilter}`
254
294
  : undefined;
255
295
  }
296
+ /** Send Analytics when filtering by creator's first letter
297
+ * labels: 'start-<ToLetter>' | 'clear-<FromLetter>' | '<FromLetter>-<ToLetter>'
298
+ * */
299
+ sendFilterByCreatorAnalytics(prevSelectedLetter) {
300
+ var _a;
301
+ if (!prevSelectedLetter && !this.selectedCreatorFilter) {
302
+ return;
303
+ }
304
+ const cleared = prevSelectedLetter && this.selectedCreatorFilter === null;
305
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
306
+ category: analyticsCategories.default,
307
+ action: analyticsActions.filterByCreator,
308
+ label: cleared
309
+ ? `clear-${prevSelectedLetter}`
310
+ : `${prevSelectedLetter || 'start'}-${this.selectedCreatorFilter}`,
311
+ });
312
+ }
256
313
  selectedCreatorLetterChanged() {
257
314
  this.creatorQuery = this.selectedCreatorFilter
258
315
  ? `firstCreator:${this.selectedCreatorFilter}`
@@ -307,7 +364,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
307
364
  ?collapsableFacets=${this.mobileView}
308
365
  ?facetsLoading=${this.facetDataLoading}
309
366
  ?fullYearAggregationLoading=${this.fullYearAggregationLoading}
310
- ></collection-facets>
367
+ .onFacetClick=${this.facetClickHandler}
368
+ .analyticsHandler=${this.analyticsHandler}
369
+ >
370
+ </collection-facets>
311
371
  `;
312
372
  }
313
373
  get loadingTemplate() {
@@ -347,8 +407,16 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
347
407
  `;
348
408
  }
349
409
  histogramDateRangeUpdated(e) {
410
+ var _a;
350
411
  const { minDate, maxDate } = e.detail;
351
412
  this.dateRangeQueryClause = `year:[${minDate} TO ${maxDate}]`;
413
+ if (this.dateRangeQueryClause) {
414
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
415
+ category: analyticsCategories.default,
416
+ action: analyticsActions.histogramChanged,
417
+ label: this.dateRangeQueryClause,
418
+ });
419
+ }
352
420
  }
353
421
  firstUpdated() {
354
422
  this.setupStateRestorationObserver();
@@ -378,12 +446,16 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
378
446
  this.handleQueryChange();
379
447
  }
380
448
  if (changed.has('selectedSort') || changed.has('sortDirection')) {
449
+ const prevSortDirection = changed.get('sortDirection');
450
+ this.sendSortByAnaltyics(prevSortDirection);
381
451
  this.selectedSortChanged();
382
452
  }
383
453
  if (changed.has('selectedTitleFilter')) {
454
+ this.sendFilterByTitleAnalytics(changed.get('selectedTitleFilter'));
384
455
  this.selectedTitleLetterChanged();
385
456
  }
386
457
  if (changed.has('selectedCreatorFilter')) {
458
+ this.sendFilterByCreatorAnalytics(changed.get('selectedCreatorFilter'));
387
459
  this.selectedCreatorLetterChanged();
388
460
  }
389
461
  if (changed.has('pagesToRender')) {
@@ -574,6 +646,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
574
646
  if (!this.selectedFacets)
575
647
  return undefined;
576
648
  const facetQuery = [];
649
+ // console.log('selectedFacets: ', this.selectedFacets);
577
650
  for (const [facetName, facetValues] of Object.entries(this.selectedFacets)) {
578
651
  const facetEntries = Object.entries(facetValues);
579
652
  // eslint-disable-next-line no-continue
@@ -600,6 +673,27 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
600
673
  facetsChanged(e) {
601
674
  this.selectedFacets = e.detail;
602
675
  }
676
+ facetClickHandler(name, facetSelected, negative) {
677
+ var _a, _b;
678
+ if (negative) {
679
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
680
+ category: analyticsCategories.default,
681
+ action: facetSelected
682
+ ? analyticsActions.facetNegativeSelected
683
+ : analyticsActions.facetNegativeDeselected,
684
+ label: name,
685
+ });
686
+ }
687
+ else {
688
+ (_b = this.analyticsHandler) === null || _b === void 0 ? void 0 : _b.sendEventNoSampling({
689
+ category: analyticsCategories.default,
690
+ action: facetSelected
691
+ ? analyticsActions.facetSelected
692
+ : analyticsActions.facetDeselected,
693
+ label: name,
694
+ });
695
+ }
696
+ }
603
697
  async fetchFacets() {
604
698
  var _a, _b;
605
699
  if (!this.fullQuery)
@@ -834,7 +928,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
834
928
  const datasource = { ...this.dataSource };
835
929
  const tiles = [];
836
930
  docs === null || docs === void 0 ? void 0 : docs.forEach(doc => {
837
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7;
931
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9;
838
932
  if (!doc.identifier)
839
933
  return;
840
934
  let loginRequired = false;
@@ -871,11 +965,12 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
871
965
  issue: (_u = doc.issue) === null || _u === void 0 ? void 0 : _u.value,
872
966
  itemCount: (_w = (_v = doc.item_count) === null || _v === void 0 ? void 0 : _v.value) !== null && _w !== void 0 ? _w : 0,
873
967
  mediatype: (_y = (_x = doc.mediatype) === null || _x === void 0 ? void 0 : _x.value) !== null && _y !== void 0 ? _y : 'data',
874
- source: (_z = doc.source) === null || _z === void 0 ? void 0 : _z.value,
875
- subjects: (_1 = (_0 = doc.subject) === null || _0 === void 0 ? void 0 : _0.values) !== null && _1 !== void 0 ? _1 : [],
876
- title: this.etreeTitle((_2 = doc.title) === null || _2 === void 0 ? void 0 : _2.value, (_3 = doc.mediatype) === null || _3 === void 0 ? void 0 : _3.value, (_4 = doc.collection) === null || _4 === void 0 ? void 0 : _4.values),
877
- volume: (_5 = doc.volume) === null || _5 === void 0 ? void 0 : _5.value,
878
- viewCount: (_7 = (_6 = doc.downloads) === null || _6 === void 0 ? void 0 : _6.value) !== null && _7 !== void 0 ? _7 : 0,
968
+ snippets: (_0 = (_z = doc.snippets) === null || _z === void 0 ? void 0 : _z.values) !== null && _0 !== void 0 ? _0 : [],
969
+ source: (_1 = doc.source) === null || _1 === void 0 ? void 0 : _1.value,
970
+ subjects: (_3 = (_2 = doc.subject) === null || _2 === void 0 ? void 0 : _2.values) !== null && _3 !== void 0 ? _3 : [],
971
+ title: this.etreeTitle((_4 = doc.title) === null || _4 === void 0 ? void 0 : _4.value, (_5 = doc.mediatype) === null || _5 === void 0 ? void 0 : _5.value, (_6 = doc.collection) === null || _6 === void 0 ? void 0 : _6.values),
972
+ volume: (_7 = doc.volume) === null || _7 === void 0 ? void 0 : _7.value,
973
+ viewCount: (_9 = (_8 = doc.downloads) === null || _8 === void 0 ? void 0 : _8.value) !== null && _9 !== void 0 ? _9 : 0,
879
974
  loginRequired,
880
975
  contentWarning,
881
976
  });
@@ -905,6 +1000,20 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
905
1000
  }
906
1001
  return title !== null && title !== void 0 ? title : '';
907
1002
  }
1003
+ /** callback when a result is selected */
1004
+ resultSelected(event) {
1005
+ var _a, _b;
1006
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
1007
+ category: analyticsCategories.default,
1008
+ action: analyticsActions.resultSelected,
1009
+ label: event.detail.mediatype === 'collection' ? 'collection' : 'item',
1010
+ });
1011
+ (_b = this.analyticsHandler) === null || _b === void 0 ? void 0 : _b.sendEventNoSampling({
1012
+ category: analyticsCategories.default,
1013
+ action: analyticsActions.resultSelected,
1014
+ label: `page-${this.currentPage}`,
1015
+ });
1016
+ }
908
1017
  cellForIndex(index) {
909
1018
  const model = this.tileModelAtCellIndex(index);
910
1019
  if (!model)
@@ -920,6 +1029,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
920
1029
  .sortParam=${this.sortParam}
921
1030
  .mobileBreakpoint=${this.mobileBreakpoint}
922
1031
  .loggedIn=${this.loggedIn}
1032
+ @resultSelected=${(e) => this.resultSelected(e)}
923
1033
  >
924
1034
  </tile-dispatcher>
925
1035
  `;
@@ -1250,6 +1360,9 @@ __decorate([
1250
1360
  __decorate([
1251
1361
  query('#content-container')
1252
1362
  ], CollectionBrowser.prototype, "contentContainer", void 0);
1363
+ __decorate([
1364
+ property({ type: Object, attribute: false })
1365
+ ], CollectionBrowser.prototype, "analyticsHandler", void 0);
1253
1366
  __decorate([
1254
1367
  query('infinite-scroller')
1255
1368
  ], CollectionBrowser.prototype, "infiniteScroller", void 0);