@internetarchive/collection-browser 0.2.17-alpha.0 → 0.2.20-alpha.0

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 (60) hide show
  1. package/dist/src/analytics/analytics-handler-interface.d.ts +25 -0
  2. package/dist/src/analytics/analytics-handler-interface.js +2 -0
  3. package/dist/src/analytics/analytics-handler-interface.js.map +1 -0
  4. package/dist/src/app-root.d.ts +5 -0
  5. package/dist/src/app-root.js +69 -0
  6. package/dist/src/app-root.js.map +1 -1
  7. package/dist/src/collection-browser.d.ts +3 -0
  8. package/dist/src/collection-browser.js +67 -21
  9. package/dist/src/collection-browser.js.map +1 -1
  10. package/dist/src/collection-facets.d.ts +3 -0
  11. package/dist/src/collection-facets.js +12 -0
  12. package/dist/src/collection-facets.js.map +1 -1
  13. package/dist/src/models.d.ts +1 -0
  14. package/dist/src/models.js.map +1 -1
  15. package/dist/src/tiles/grid/item-tile.d.ts +5 -2
  16. package/dist/src/tiles/grid/item-tile.js +28 -2
  17. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  18. package/dist/src/tiles/image-block.js +1 -1
  19. package/dist/src/tiles/image-block.js.map +1 -1
  20. package/dist/src/tiles/list/tile-list.d.ts +2 -0
  21. package/dist/src/tiles/list/tile-list.js +14 -1
  22. package/dist/src/tiles/list/tile-list.js.map +1 -1
  23. package/dist/src/tiles/text-snippet-block.d.ts +29 -0
  24. package/dist/src/tiles/text-snippet-block.js +128 -0
  25. package/dist/src/tiles/text-snippet-block.js.map +1 -0
  26. package/dist/src/utils/analytics-category-event.d.ts +14 -0
  27. package/dist/src/utils/analytics-category-event.js +15 -0
  28. package/dist/src/utils/analytics-category-event.js.map +1 -0
  29. package/dist/test/collection-browser.test.js +25 -1
  30. package/dist/test/collection-browser.test.js.map +1 -1
  31. package/dist/test/mocks/mock-search-responses.d.ts +2 -1
  32. package/dist/test/mocks/mock-search-responses.js +27 -1
  33. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  34. package/dist/test/mocks/mock-search-service.js +6 -2
  35. package/dist/test/mocks/mock-search-service.js.map +1 -1
  36. package/dist/test/text-snippet-block.test.d.ts +1 -0
  37. package/dist/test/text-snippet-block.test.js +52 -0
  38. package/dist/test/text-snippet-block.test.js.map +1 -0
  39. package/dist/test/tiles/grid/item-tile.test.js +15 -0
  40. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  41. package/dist/test/tiles/list/tile-list.test.d.ts +1 -0
  42. package/dist/test/tiles/list/tile-list.test.js +42 -0
  43. package/dist/test/tiles/list/tile-list.test.js.map +1 -0
  44. package/package.json +4 -3
  45. package/src/analytics/analytics-handler-interface.ts +28 -0
  46. package/src/app-root.ts +76 -0
  47. package/src/collection-browser.ts +69 -15
  48. package/src/collection-facets.ts +19 -0
  49. package/src/models.ts +1 -0
  50. package/src/tiles/grid/item-tile.ts +35 -2
  51. package/src/tiles/image-block.ts +1 -1
  52. package/src/tiles/list/tile-list.ts +14 -1
  53. package/src/tiles/text-snippet-block.ts +130 -0
  54. package/src/utils/analytics-category-event.ts +15 -0
  55. package/test/collection-browser.test.ts +39 -0
  56. package/test/mocks/mock-search-responses.ts +34 -1
  57. package/test/mocks/mock-search-service.ts +10 -2
  58. package/test/text-snippet-block.test.ts +69 -0
  59. package/test/tiles/grid/item-tile.test.ts +19 -0
  60. package/test/tiles/list/tile-list.test.ts +51 -0
@@ -0,0 +1,25 @@
1
+ import type { AnalyticsEvent } from '@internetarchive/analytics-manager';
2
+ export interface AnalyticsHandlerInterface {
3
+ /**
4
+ * A general purpose analytics ping that takes arbitrary key-value pairs
5
+ * and pings the analytics endpoint
6
+ *
7
+ * @param {Record<string, any>} values
8
+ */
9
+ sendPing(values: Record<string, any>): void;
10
+ /**
11
+ * Send a sampled event
12
+ *
13
+ * @param {options} AnalyticsEvent
14
+ */
15
+ sendEvent(options: AnalyticsEvent): void;
16
+ /**
17
+ * Send an unsampled event.
18
+ *
19
+ * **NOTE** Use sparingly as it can generate a lot of events
20
+ * and deplete our event budget.
21
+ *
22
+ * @param {options} AnalyticsEvent
23
+ */
24
+ sendEventNoSampling(options: AnalyticsEvent): void;
25
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analytics-handler-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-handler-interface.js","sourceRoot":"","sources":["../../../src/analytics/analytics-handler-interface.ts"],"names":[],"mappings":"","sourcesContent":["import type { AnalyticsEvent } from '@internetarchive/analytics-manager';\n\nexport interface AnalyticsHandlerInterface {\n /**\n * A general purpose analytics ping that takes arbitrary key-value pairs\n * and pings the analytics endpoint\n *\n * @param {Record<string, any>} values\n */\n sendPing(values: Record<string, any>): void;\n\n /**\n * Send a sampled event\n *\n * @param {options} AnalyticsEvent\n */\n sendEvent(options: AnalyticsEvent): void;\n\n /**\n * Send an unsampled event.\n *\n * **NOTE** Use sparingly as it can generate a lot of events\n * and deplete our event budget.\n *\n * @param {options} AnalyticsEvent\n */\n sendEventNoSampling(options: AnalyticsEvent): void;\n}\n"]}
@@ -12,9 +12,13 @@ export declare class AppRoot extends LitElement {
12
12
  private rowGap;
13
13
  private colGap;
14
14
  private loggedIn;
15
+ private actionBlob?;
15
16
  private baseQueryField;
16
17
  private pageNumberInput;
17
18
  private collectionBrowser;
19
+ private analyticsManager;
20
+ private analyticsHandler;
21
+ private sendAnalytics;
18
22
  private searchPressed;
19
23
  private changePagePressed;
20
24
  protected updated(changed: PropertyValues): void;
@@ -23,6 +27,7 @@ export declare class AppRoot extends LitElement {
23
27
  private baseQueryChanged;
24
28
  private loginChanged;
25
29
  private outlineChanged;
30
+ private snippetsChanged;
26
31
  private rowGapChanged;
27
32
  private colGapChanged;
28
33
  private widthChanged;
@@ -1,4 +1,5 @@
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';
@@ -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,
28
+ sendEvent: this.sendAnalytics,
29
+ sendEventNoSampling: this.sendAnalytics,
30
+ };
31
+ }
32
+ sendAnalytics(ae) {
33
+ var _a;
34
+ this.actionBlob = `{category: ${ae.category}, action: ${ae.action}, label: ${ae.label}}`;
35
+ console.log('actionBlob: ', this.actionBlob);
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,8 @@ let AppRoot = class AppRoot extends LitElement {
65
78
  <input type="submit" value="Go" />
66
79
  </form>
67
80
 
81
+ <h3>Last Event Captured:: ${this.actionBlob}</h3>
82
+
68
83
  <div id="cell-controls">
69
84
  <div id="cell-size-control">
70
85
  <div>
@@ -109,6 +124,14 @@ let AppRoot = class AppRoot extends LitElement {
109
124
  @click=${this.loginChanged}
110
125
  />
111
126
  </div>
127
+ <div>
128
+ <label for="show-dummy-snippets">Show dummy snippets:</label>
129
+ <input
130
+ type="checkbox"
131
+ id="show-dummy-snippets"
132
+ @click=${this.snippetsChanged}
133
+ />
134
+ </div>
112
135
  </div>
113
136
  <div id="cell-gap-control">
114
137
  <div>
@@ -150,6 +173,7 @@ let AppRoot = class AppRoot extends LitElement {
150
173
  .collectionNameCache=${this.collectionNameCache}
151
174
  .showHistogramDatePicker=${true}
152
175
  .loggedIn=${this.loggedIn}
176
+ .analyticsHandler=${this.analyticsHandler}
153
177
  @visiblePageChanged=${this.visiblePageChanged}
154
178
  @baseQueryChanged=${this.baseQueryChanged}
155
179
  >
@@ -178,6 +202,48 @@ let AppRoot = class AppRoot extends LitElement {
178
202
  this.collectionBrowser.style.removeProperty('--infiniteScrollerCellOutline');
179
203
  }
180
204
  }
205
+ async snippetsChanged(e) {
206
+ const target = e.target;
207
+ if (target.checked) {
208
+ // Decorate the default search service with a wrapper that adds
209
+ // dummy snippets to any successful searches
210
+ this.searchService = {
211
+ ...SearchService.default,
212
+ async search(params) {
213
+ var _a;
214
+ const result = await SearchService.default.search(params);
215
+ (_a = result.success) === null || _a === void 0 ? void 0 : _a.response.docs.forEach(doc => {
216
+ const metadata = doc.rawMetadata;
217
+ if (metadata) {
218
+ metadata.snippets = [
219
+ 'this is a text {{{snippet}}} block with potentially',
220
+ 'multiple {{{snippets}}} and such',
221
+ 'but the {{{snippet}}} block may be quite long perhaps',
222
+ 'depending on how many {{{snippet}}} matches there are',
223
+ 'there may be multiple lines of {{{snippets}}} to show',
224
+ 'but each {{{snippet}}} should be relatively short',
225
+ 'and {{{snippets}}} are each a {{{snippet}}} of text',
226
+ 'but every {{{snippet}}} might have multiple matches',
227
+ 'the {{{snippets}}} should be separated and surrounded by ellipses',
228
+ ];
229
+ }
230
+ });
231
+ return result;
232
+ },
233
+ };
234
+ }
235
+ else {
236
+ // Restore the default seach service
237
+ this.searchService = SearchService.default;
238
+ }
239
+ // Re-perform the current search to show/hide the snippets immediately
240
+ const oldQuery = this.searchQuery;
241
+ this.searchQuery = ''; // Should just reset to the placeholder
242
+ await this.updateComplete;
243
+ // For unclear reasons, Safari refuses to re-apply the old query until the next tick, hence:
244
+ await new Promise(res => setTimeout(res, 0));
245
+ this.searchQuery = oldQuery; // Re-apply the original query
246
+ }
181
247
  rowGapChanged(e) {
182
248
  const input = e.target;
183
249
  this.rowGap = parseFloat(input.value);
@@ -269,6 +335,9 @@ __decorate([
269
335
  __decorate([
270
336
  state()
271
337
  ], AppRoot.prototype, "loggedIn", void 0);
338
+ __decorate([
339
+ state()
340
+ ], AppRoot.prototype, "actionBlob", void 0);
272
341
  __decorate([
273
342
  query('#base-query-field')
274
343
  ], 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, query, state } from 'lit/decorators.js';\nimport { SharedResizeObserver } from '@internetarchive/shared-resize-observer';\nimport { CollectionNameCache } from '@internetarchive/collection-name-cache';\n\nimport type { AnalyticsHandlerInterface } from './analytics/analytics-handler-interface';\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 @state() private actionBlob?: string;\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: AnalyticsHandlerInterface = {\n sendPing: this.sendAnalytics,\n sendEvent: this.sendAnalytics,\n sendEventNoSampling: this.sendAnalytics,\n };\n\n private sendAnalytics(ae: AnalyticsEvent) {\n this.actionBlob = `{category: ${ae.category}, action: ${ae.action}, label: ${ae.label}}`;\n console.log('actionBlob: ', this.actionBlob);\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 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 <h3>Last Event Captured:: ${this.actionBlob}</h3>\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}\n"]}
@@ -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
@@ -93,6 +94,8 @@ export declare class CollectionBrowser extends LitElement implements InfiniteScr
93
94
  */
94
95
  private dataSource;
95
96
  private infiniteScroller;
97
+ private analyticsCategories;
98
+ private analyticsActions;
96
99
  /**
97
100
  * Go to the given page of results
98
101
  *
@@ -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-category-event';
18
19
  let CollectionBrowser = class CollectionBrowser extends LitElement {
19
20
  constructor() {
20
21
  super(...arguments);
@@ -77,6 +78,8 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
77
78
  * for the previous/next page, we'll fetch the next/previous page to populate it
78
79
  */
79
80
  this.dataSource = {};
81
+ this.analyticsCategories = analyticsCategories;
82
+ this.analyticsActions = analyticsActions;
80
83
  // we only want to scroll on the very first query change
81
84
  // so this keeps track of whether we've already set the initial query
82
85
  this.initialQueryChangeHappened = false;
@@ -181,7 +184,9 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
181
184
  ? this.totalResults.toLocaleString()
182
185
  : '-'}
183
186
  </span>
184
- <span id="big-results-label">Results</span>
187
+ <span id="big-results-label">
188
+ ${this.totalResults === 1 ? 'Result' : 'Results'}
189
+ </span>
185
190
  </div>
186
191
  </div>
187
192
  <div
@@ -212,18 +217,21 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
212
217
  ></infinite-scroller>`;
213
218
  }
214
219
  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>`;
220
+ return html `
221
+ <sort-filter-bar
222
+ .selectedSort=${this.selectedSort}
223
+ .sortDirection=${this.sortDirection}
224
+ .displayMode=${this.displayMode}
225
+ .selectedTitleFilter=${this.selectedTitleFilter}
226
+ .selectedCreatorFilter=${this.selectedCreatorFilter}
227
+ .resizeObserver=${this.resizeObserver}
228
+ @sortChanged=${this.userChangedSort}
229
+ @displayModeChanged=${this.displayModeChanged}
230
+ @titleLetterChanged=${this.titleLetterSelected}
231
+ @creatorLetterChanged=${this.creatorLetterSelected}
232
+ >
233
+ </sort-filter-bar>
234
+ `;
227
235
  }
228
236
  userChangedSort(e) {
229
237
  var _a;
@@ -236,6 +244,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
236
244
  this.currentPage = 1;
237
245
  }
238
246
  selectedSortChanged() {
247
+ var _a;
239
248
  if (this.selectedSort === 'relevance' || this.sortDirection === null) {
240
249
  this.sortParam = null;
241
250
  return;
@@ -244,19 +253,42 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
244
253
  if (!sortField)
245
254
  return;
246
255
  this.sortParam = { field: sortField, direction: this.sortDirection };
256
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
257
+ category: this.analyticsCategories.default,
258
+ action: this.analyticsActions.sortBy,
259
+ label: `${sortField} - ${this.sortDirection}`,
260
+ });
247
261
  }
248
262
  displayModeChanged(e) {
263
+ var _a;
249
264
  this.displayMode = e.detail.displayMode;
265
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
266
+ category: this.analyticsCategories.default,
267
+ action: this.analyticsActions.displayMode,
268
+ label: this.displayMode,
269
+ });
250
270
  }
251
271
  selectedTitleLetterChanged() {
272
+ var _a;
252
273
  this.titleQuery = this.selectedTitleFilter
253
274
  ? `firstTitle:${this.selectedTitleFilter}`
254
275
  : undefined;
276
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
277
+ category: this.analyticsCategories.default,
278
+ action: this.analyticsActions.sortByTitle,
279
+ label: `${this.titleQuery}`,
280
+ });
255
281
  }
256
282
  selectedCreatorLetterChanged() {
283
+ var _a;
257
284
  this.creatorQuery = this.selectedCreatorFilter
258
285
  ? `firstCreator:${this.selectedCreatorFilter}`
259
286
  : undefined;
287
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
288
+ category: this.analyticsCategories.default,
289
+ action: this.analyticsActions.sortByCreator,
290
+ label: `${this.creatorQuery}`,
291
+ });
260
292
  }
261
293
  titleLetterSelected(e) {
262
294
  this.selectedCreatorFilter = null;
@@ -307,7 +339,11 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
307
339
  ?collapsableFacets=${this.mobileView}
308
340
  ?facetsLoading=${this.facetDataLoading}
309
341
  ?fullYearAggregationLoading=${this.fullYearAggregationLoading}
310
- ></collection-facets>
342
+ .analyticsHandler=${this.analyticsHandler}
343
+ .analyticsCategories=${this.analyticsCategories}
344
+ .analyticsActions=${this.analyticsActions}
345
+ >
346
+ </collection-facets>
311
347
  `;
312
348
  }
313
349
  get loadingTemplate() {
@@ -347,8 +383,14 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
347
383
  `;
348
384
  }
349
385
  histogramDateRangeUpdated(e) {
386
+ var _a;
350
387
  const { minDate, maxDate } = e.detail;
351
388
  this.dateRangeQueryClause = `year:[${minDate} TO ${maxDate}]`;
389
+ (_a = this.analyticsHandler) === null || _a === void 0 ? void 0 : _a.sendEventNoSampling({
390
+ category: this.analyticsCategories.default,
391
+ action: this.analyticsActions.histogramChanged,
392
+ label: this.dateRangeQueryClause,
393
+ });
352
394
  }
353
395
  firstUpdated() {
354
396
  this.setupStateRestorationObserver();
@@ -834,7 +876,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
834
876
  const datasource = { ...this.dataSource };
835
877
  const tiles = [];
836
878
  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;
879
+ 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
880
  if (!doc.identifier)
839
881
  return;
840
882
  let loginRequired = false;
@@ -871,11 +913,12 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
871
913
  issue: (_u = doc.issue) === null || _u === void 0 ? void 0 : _u.value,
872
914
  itemCount: (_w = (_v = doc.item_count) === null || _v === void 0 ? void 0 : _v.value) !== null && _w !== void 0 ? _w : 0,
873
915
  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,
916
+ snippets: (_0 = (_z = doc.snippets) === null || _z === void 0 ? void 0 : _z.values) !== null && _0 !== void 0 ? _0 : [],
917
+ source: (_1 = doc.source) === null || _1 === void 0 ? void 0 : _1.value,
918
+ subjects: (_3 = (_2 = doc.subject) === null || _2 === void 0 ? void 0 : _2.values) !== null && _3 !== void 0 ? _3 : [],
919
+ 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),
920
+ volume: (_7 = doc.volume) === null || _7 === void 0 ? void 0 : _7.value,
921
+ viewCount: (_9 = (_8 = doc.downloads) === null || _8 === void 0 ? void 0 : _8.value) !== null && _9 !== void 0 ? _9 : 0,
879
922
  loginRequired,
880
923
  contentWarning,
881
924
  });
@@ -998,7 +1041,7 @@ CollectionBrowser.styles = css `
998
1041
  padding-right: 1rem;
999
1042
  }
1000
1043
 
1001
- #left-column::-webkit-scrollbar {
1044
+ .desktop #left-column::-webkit-scrollbar {
1002
1045
  display: none;
1003
1046
  }
1004
1047
 
@@ -1250,6 +1293,9 @@ __decorate([
1250
1293
  __decorate([
1251
1294
  query('#content-container')
1252
1295
  ], CollectionBrowser.prototype, "contentContainer", void 0);
1296
+ __decorate([
1297
+ property({ type: Object, attribute: false })
1298
+ ], CollectionBrowser.prototype, "analyticsHandler", void 0);
1253
1299
  __decorate([
1254
1300
  query('infinite-scroller')
1255
1301
  ], CollectionBrowser.prototype, "infiniteScroller", void 0);