@internetarchive/collection-browser 0.2.21 → 0.2.22

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 (70) hide show
  1. package/dist/src/app-root.d.ts +1 -0
  2. package/dist/src/app-root.js +34 -4
  3. package/dist/src/app-root.js.map +1 -1
  4. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -0
  5. package/dist/src/assets/img/icons/arrow-left.js +10 -0
  6. package/dist/src/assets/img/icons/arrow-left.js.map +1 -0
  7. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
  8. package/dist/src/assets/img/icons/arrow-right.js +10 -0
  9. package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
  10. package/dist/src/collection-browser.d.ts +2 -0
  11. package/dist/src/collection-browser.js +10 -2
  12. package/dist/src/collection-browser.js.map +1 -1
  13. package/dist/src/collection-facets/facets-template.d.ts +16 -0
  14. package/dist/src/collection-facets/facets-template.js +266 -0
  15. package/dist/src/collection-facets/facets-template.js.map +1 -0
  16. package/dist/src/collection-facets/facets-util.d.ts +10 -0
  17. package/dist/src/collection-facets/facets-util.js +20 -0
  18. package/dist/src/collection-facets/facets-util.js.map +1 -0
  19. package/dist/src/collection-facets/more-facets-content.d.ts +83 -0
  20. package/dist/src/collection-facets/more-facets-content.js +475 -0
  21. package/dist/src/collection-facets/more-facets-content.js.map +1 -0
  22. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -0
  23. package/dist/src/collection-facets/more-facets-pagination.js +267 -0
  24. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -0
  25. package/dist/src/collection-facets.d.ts +19 -5
  26. package/dist/src/collection-facets.js +138 -239
  27. package/dist/src/collection-facets.js.map +1 -1
  28. package/dist/src/models.d.ts +4 -1
  29. package/dist/src/models.js +24 -0
  30. package/dist/src/models.js.map +1 -1
  31. package/dist/src/restoration-state-handler.js +5 -6
  32. package/dist/src/restoration-state-handler.js.map +1 -1
  33. package/dist/src/tiles/collection-browser-loading-tile.js +2 -5
  34. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -1
  35. package/dist/test/collection-browser.test.js +5 -3
  36. package/dist/test/collection-browser.test.js.map +1 -1
  37. package/dist/test/collection-facets/facets-template.test.d.ts +1 -0
  38. package/dist/test/collection-facets/facets-template.test.js +75 -0
  39. package/dist/test/collection-facets/facets-template.test.js.map +1 -0
  40. package/dist/test/collection-facets/facets-util.test.d.ts +1 -0
  41. package/dist/test/collection-facets/facets-util.test.js +13 -0
  42. package/dist/test/collection-facets/facets-util.test.js.map +1 -0
  43. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -0
  44. package/dist/test/collection-facets/more-facets-content.test.js +104 -0
  45. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -0
  46. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -0
  47. package/dist/test/collection-facets/more-facets-pagination.test.js +133 -0
  48. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -0
  49. package/dist/test/collection-facets.test.d.ts +1 -0
  50. package/dist/test/collection-facets.test.js +98 -33
  51. package/dist/test/collection-facets.test.js.map +1 -1
  52. package/package.json +11 -4
  53. package/src/app-root.ts +34 -4
  54. package/src/assets/img/icons/arrow-left.ts +10 -0
  55. package/src/assets/img/icons/arrow-right.ts +10 -0
  56. package/src/collection-browser.ts +9 -2
  57. package/src/collection-facets/facets-template.ts +284 -0
  58. package/src/collection-facets/facets-util.ts +22 -0
  59. package/src/collection-facets/more-facets-content.ts +529 -0
  60. package/src/collection-facets/more-facets-pagination.ts +297 -0
  61. package/src/collection-facets.ts +175 -261
  62. package/src/models.ts +28 -1
  63. package/src/restoration-state-handler.ts +7 -6
  64. package/src/tiles/collection-browser-loading-tile.ts +2 -5
  65. package/test/collection-browser.test.ts +6 -3
  66. package/test/collection-facets/facets-template.test.ts +103 -0
  67. package/test/collection-facets/facets-util.test.ts +18 -0
  68. package/test/collection-facets/more-facets-content.test.ts +146 -0
  69. package/test/collection-facets/more-facets-pagination.test.ts +202 -0
  70. package/test/collection-facets.test.ts +127 -44
@@ -8,53 +8,38 @@ import {
8
8
  TemplateResult,
9
9
  } from 'lit';
10
10
  import { customElement, property, state } from 'lit/decorators.js';
11
- import { repeat } from 'lit/directives/repeat.js';
12
- import type { Aggregation, Bucket } from '@internetarchive/search-service';
11
+ import type {
12
+ Aggregation,
13
+ Bucket,
14
+ SearchServiceInterface,
15
+ } from '@internetarchive/search-service';
13
16
  import '@internetarchive/histogram-date-range';
14
17
  import '@internetarchive/feature-feedback';
15
18
  import '@internetarchive/collection-name-cache';
16
19
  import type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
17
- import eyeIcon from './assets/img/icons/eye';
18
- import eyeClosedIcon from './assets/img/icons/eye-closed';
20
+ import {
21
+ ModalConfig,
22
+ ModalManagerInterface,
23
+ } from '@internetarchive/modal-manager';
19
24
  import chevronIcon from './assets/img/icons/chevron';
20
25
  import {
21
26
  FacetOption,
22
27
  SelectedFacets,
23
28
  FacetGroup,
24
29
  FacetBucket,
25
- defaultSelectedFacets,
30
+ facetDisplayOrder,
31
+ facetTitles,
32
+ aggregationToFacetOption,
26
33
  } from './models';
27
34
  import type { LanguageCodeHandlerInterface } from './language-code-handler/language-code-handler';
28
-
29
- const facetDisplayOrder: FacetOption[] = [
30
- 'mediatype',
31
- 'year',
32
- 'subject',
33
- 'collection',
34
- 'creator',
35
- 'language',
36
- ];
37
-
38
- const aggregationToFacetOption: Record<string, FacetOption> = {
39
- subjectSorter: 'subject',
40
- mediatypeSorter: 'mediatype',
41
- languageSorter: 'language',
42
- creatorSorter: 'creator',
43
- collection: 'collection',
44
- year: 'year',
45
- };
46
-
47
- const facetTitles: Record<FacetOption, string> = {
48
- subject: 'Subject',
49
- mediatype: 'Media Type',
50
- language: 'Language',
51
- creator: 'Creator',
52
- collection: 'Collection',
53
- year: 'Year',
54
- };
35
+ import { getFacetOptionFromKey } from './collection-facets/facets-util';
36
+ import './collection-facets/more-facets-content';
37
+ import './collection-facets/facets-template';
55
38
 
56
39
  @customElement('collection-facets')
57
40
  export class CollectionFacets extends LitElement {
41
+ @property({ type: Object }) searchService?: SearchServiceInterface;
42
+
58
43
  @property({ type: Object }) aggregations?: Record<string, Aggregation>;
59
44
 
60
45
  @property({ type: Object }) fullYearsHistogramAggregation?: Aggregation;
@@ -73,6 +58,10 @@ export class CollectionFacets extends LitElement {
73
58
 
74
59
  @property({ type: Boolean }) showHistogramDatePicker = false;
75
60
 
61
+ @property({ type: String }) fullQuery?: string;
62
+
63
+ @property({ type: Object }) modalManager?: ModalManagerInterface;
64
+
76
65
  @property({ type: Object })
77
66
  languageCodeHandler?: LanguageCodeHandlerInterface;
78
67
 
@@ -96,6 +85,12 @@ export class CollectionFacets extends LitElement {
96
85
  };
97
86
 
98
87
  @property({ type: Object, attribute: false })
88
+
89
+ /**
90
+ * render number of facet items
91
+ */
92
+ private allowedFacetCount = 6;
93
+
99
94
  render() {
100
95
  return html`
101
96
  <div id="container" class="${this.facetsLoading ? 'loading' : ''}">
@@ -120,6 +115,7 @@ export class CollectionFacets extends LitElement {
120
115
  }
121
116
  }
122
117
 
118
+ // TODO: want to fire analytics?
123
119
  private dispatchFacetsChangedEvent() {
124
120
  const event = new CustomEvent<SelectedFacets>('facetsChanged', {
125
121
  detail: this.selectedFacets,
@@ -207,7 +203,22 @@ export class CollectionFacets extends LitElement {
207
203
  if (existingBucket) return;
208
204
  bucketsWithCount.push(bucket);
209
205
  });
210
- facetGroup.buckets = bucketsWithCount.splice(0, 5);
206
+
207
+ /**
208
+ * render limited facet items on page facet area
209
+ *
210
+ * - by-default we are showing 6 items
211
+ * - additionally want to show all items (selected/suppressed) in page facet area
212
+ */
213
+ let allowedFacetCount = Object.keys(
214
+ (selectedFacetGroup?.buckets as []) || []
215
+ )?.length;
216
+ if (allowedFacetCount < this.allowedFacetCount) {
217
+ allowedFacetCount = this.allowedFacetCount; // splice start index from 0th
218
+ }
219
+
220
+ // splice how many items we want to show in page facet area
221
+ facetGroup.buckets = bucketsWithCount.splice(0, allowedFacetCount);
211
222
 
212
223
  facetGroups.push(facetGroup);
213
224
  });
@@ -228,7 +239,7 @@ export class CollectionFacets extends LitElement {
228
239
  const title = facetTitles[option];
229
240
 
230
241
  const buckets: FacetBucket[] = Object.entries(selectedFacets).map(
231
- ([value, facetState]) => {
242
+ ([value, facetData]) => {
232
243
  let displayText = value;
233
244
  // for selected languages, we store the language code instead of the
234
245
  // display name, so look up the name from the mapping
@@ -241,8 +252,8 @@ export class CollectionFacets extends LitElement {
241
252
  return {
242
253
  displayText,
243
254
  key: value,
244
- count: 0,
245
- state: facetState,
255
+ count: facetData.count,
256
+ state: facetData.state,
246
257
  };
247
258
  }
248
259
  );
@@ -266,9 +277,15 @@ export class CollectionFacets extends LitElement {
266
277
  Object.entries(this.aggregations ?? []).forEach(([key, buckets]) => {
267
278
  // the year_histogram data is in a different format so can't be handled here
268
279
  if (key === 'year_histogram') return;
269
- const option = this.getFacetOptionFromKey(key);
280
+ const option = getFacetOptionFromKey(key);
270
281
  const title = facetTitles[option];
271
282
  const castedBuckets = buckets.buckets as Bucket[];
283
+
284
+ // we are not showing fav- items in facets
285
+ castedBuckets?.filter(
286
+ bucket => bucket?.key?.toString()?.startsWith('fav-') === false
287
+ );
288
+
272
289
  const facetBuckets: FacetBucket[] = castedBuckets.map(bucket => {
273
290
  let bucketKey = bucket.key;
274
291
  // for languages, we need to search by language code instead of the
@@ -314,172 +331,127 @@ export class CollectionFacets extends LitElement {
314
331
 
315
332
  return html`
316
333
  <div class="facet-group ${this.collapsableFacets ? 'mobile' : ''}">
317
- <h1
318
- @click=${() => {
319
- const newOpenFacets = { ...this.openFacets };
320
- newOpenFacets[key] = !isOpen;
321
- this.openFacets = newOpenFacets;
322
- }}
323
- @keyup=${() => {
324
- const newOpenFacets = { ...this.openFacets };
325
- newOpenFacets[key] = !isOpen;
326
- this.openFacets = newOpenFacets;
327
- }}
328
- >
329
- ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}
330
- </h1>
334
+ <div class="facet-group-header">
335
+ <h1
336
+ @click=${() => {
337
+ const newOpenFacets = { ...this.openFacets };
338
+ newOpenFacets[key] = !isOpen;
339
+ this.openFacets = newOpenFacets;
340
+ }}
341
+ @keyup=${() => {
342
+ const newOpenFacets = { ...this.openFacets };
343
+ newOpenFacets[key] = !isOpen;
344
+ this.openFacets = newOpenFacets;
345
+ }}
346
+ >
347
+ ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}
348
+ </h1>
349
+ <input
350
+ class="sorting-icon"
351
+ type="image"
352
+ @click=${() => this.showMoreFacetsModal(facetGroup, 'alpha')}
353
+ src="https://archive.org/images/filter-count.png"
354
+ alt="Sort by alphabetically"
355
+ />
356
+ </div>
331
357
  <div class="facet-group-content ${isOpen ? 'open' : ''}">
332
358
  ${this.getFacetTemplate(facetGroup)}
359
+ ${this.searchMoreFacetsLink(facetGroup)}
333
360
  </div>
334
361
  </div>
335
362
  `;
336
363
  }
337
364
 
338
365
  /**
339
- * Generate the list template for each bucket in a facet group
366
+ * Generate the More... link button just below the facets group
367
+ *
368
+ * TODO: want to fire analytics?
340
369
  */
341
- private getFacetTemplate(facetGroup: FacetGroup): TemplateResult {
342
- const bucketsNoFavorites = facetGroup.buckets.filter(
343
- bucket => bucket.key.startsWith('fav-') === false
344
- );
345
- const bucketsMaxSix = bucketsNoFavorites.slice(0, 6);
346
-
347
- return html`
348
- <ul class="facet-list">
349
- ${repeat(
350
- bucketsMaxSix,
351
- bucket => `${facetGroup.key}:${bucket.key}`,
352
- bucket => {
353
- const showOnlyCheckboxId = `${facetGroup.key}:${bucket.key}-show-only`;
354
- const negativeCheckboxId = `${facetGroup.key}:${bucket.key}-negative`;
355
-
356
- // for collections, we need to asynchronously load the collection name
357
- // so we use the `async-collection-name` widget and for the rest, we have
358
- // a static value to use
359
- const bucketTextDisplay =
360
- facetGroup.key !== 'collection'
361
- ? html`${bucket.displayText ?? bucket.key}`
362
- : html`
363
- <a
364
- href="/details/${bucket.key}"
365
- title="Open collection in new tab"
366
- target="_blank"
367
- >
368
- <async-collection-name
369
- .collectionNameCache=${this.collectionNameCache}
370
- .identifier=${bucket.key}
371
- placeholder="-"
372
- ></async-collection-name>
373
- </a>
374
- `;
375
-
376
- const facetHidden = bucket.state === 'hidden';
377
- const facetSelected = bucket.state === 'selected';
378
-
379
- const titleText = `${facetGroup.key}: ${
380
- bucket.displayText ?? bucket.key
381
- }`;
382
- const onlyShowText = facetSelected
383
- ? `Show all ${facetGroup.key}s`
384
- : `Only show ${titleText}`;
385
- const hideText = `Hide ${titleText}`;
386
- const unhideText = `Unhide ${titleText}`;
387
- const showHideText = facetHidden ? unhideText : hideText;
388
-
389
- return html`
390
- <li>
391
- <div class="facet-row">
392
- <div class="facet-checkbox">
393
- <input
394
- type="checkbox"
395
- .name=${facetGroup.key}
396
- .value=${bucket.key}
397
- @click=${(e: Event) => {
398
- this.facetClicked(e, bucket, false);
399
- }}
400
- .checked=${facetSelected}
401
- class="select-facet-checkbox"
402
- title=${onlyShowText}
403
- id=${showOnlyCheckboxId}
404
- />
405
- <input
406
- type="checkbox"
407
- id=${negativeCheckboxId}
408
- .name=${facetGroup.key}
409
- .value=${bucket.key}
410
- @click=${(e: Event) => {
411
- this.facetClicked(e, bucket, true);
412
- }}
413
- .checked=${facetHidden}
414
- class="hide-facet-checkbox"
415
- />
416
- <label
417
- for=${negativeCheckboxId}
418
- class="hide-facet-icon${facetHidden ? ' active' : ''}"
419
- title=${showHideText}
420
- >
421
- <span class="eye">${eyeIcon}</span>
422
- <span class="eye-closed">${eyeClosedIcon}</span>
423
- </label>
424
- </div>
425
-
426
- <label
427
- for=${showOnlyCheckboxId}
428
- class="facet-info-display"
429
- title=${onlyShowText}
430
- >
431
- <div class="facet-title">${bucketTextDisplay}</div>
432
- <div class="facet-count">${bucket.count}</div>
433
- </label>
434
- </div>
435
- </li>
436
- `;
437
- }
438
- )}
439
- </ul>
440
- `;
370
+ private searchMoreFacetsLink(
371
+ facetGroup: FacetGroup
372
+ ): TemplateResult | typeof nothing {
373
+ // don't render More... link if the number of facets < this.allowedFacetCount
374
+ if (Object.keys(facetGroup.buckets).length < this.allowedFacetCount)
375
+ return nothing;
376
+
377
+ return html`<button
378
+ class="more-link"
379
+ @click=${() => {
380
+ this.showMoreFacetsModal(facetGroup, 'count');
381
+ this.dispatchEvent(
382
+ new CustomEvent('showMoreFacets', { detail: facetGroup.key })
383
+ );
384
+ }}
385
+ >
386
+ More...
387
+ </button>`;
441
388
  }
442
389
 
443
- private facetClicked(e: Event, bucket: FacetBucket, negative: boolean): void {
444
- const target = e.target as HTMLInputElement;
445
- const { checked, name, value } = target;
446
- if (checked) {
447
- this.facetChecked(name as FacetOption, value, negative);
448
- } else {
449
- this.facetUnchecked(name as FacetOption, value);
450
- }
390
+ async showMoreFacetsModal(
391
+ facetGroup: FacetGroup,
392
+ sortedBy: string
393
+ ): Promise<void> {
394
+ const facetAggrKey = Object.keys(aggregationToFacetOption).find(
395
+ value => aggregationToFacetOption[value] === facetGroup.key
396
+ );
451
397
 
452
- if (this.onFacetClick) {
453
- this.onFacetClick(name as FacetOption, checked, negative);
454
- }
455
- }
398
+ const customModalContent = html`
399
+ <more-facets-content
400
+ .facetKey=${facetGroup.key}
401
+ .facetAggregationKey=${facetAggrKey}
402
+ .fullQuery=${this.fullQuery}
403
+ .modalManager=${this.modalManager}
404
+ .searchService=${this.searchService}
405
+ .collectionNameCache=${this.collectionNameCache}
406
+ .languageCodeHandler=${this.languageCodeHandler}
407
+ .selectedFacets=${this.selectedFacets}
408
+ .sortedBy=${sortedBy}
409
+ @facetsChanged=${(e: CustomEvent) => {
410
+ const event = new CustomEvent<SelectedFacets>('facetsChanged', {
411
+ detail: e.detail,
412
+ bubbles: true,
413
+ composed: true,
414
+ });
415
+ this.dispatchEvent(event);
416
+ }}
417
+ >
418
+ </more-facets-content>
419
+ `;
456
420
 
457
- private facetChecked(key: FacetOption, value: string, negative: boolean) {
458
- const { selectedFacets } = this;
459
- let newFacets: SelectedFacets;
460
- if (selectedFacets) {
461
- newFacets = {
462
- ...selectedFacets,
463
- };
464
- } else {
465
- newFacets = defaultSelectedFacets;
466
- }
467
- newFacets[key][value] = negative ? 'hidden' : 'selected';
468
- this.selectedFacets = newFacets;
421
+ const config = new ModalConfig({
422
+ bodyColor: '#fff',
423
+ headerColor: '#194880',
424
+ showHeaderLogo: false,
425
+ closeOnBackdropClick: true, // TODO: want to fire analytics
426
+ title: html`Select filters`,
427
+ });
428
+ this.modalManager?.classList.add('more-search-facets');
429
+ this.modalManager?.showModal({
430
+ config,
431
+ customModalContent,
432
+ });
469
433
  }
470
434
 
471
- private facetUnchecked(key: FacetOption, value: string) {
472
- const { selectedFacets } = this;
473
- let newFacets: SelectedFacets;
474
- if (selectedFacets) {
475
- newFacets = {
476
- ...selectedFacets,
477
- };
478
- } else {
479
- newFacets = defaultSelectedFacets;
480
- }
481
- delete newFacets[key][value];
482
- this.selectedFacets = newFacets;
435
+ /**
436
+ * Generate the list template for each bucket in a facet group
437
+ */
438
+ private getFacetTemplate(facetGroup: FacetGroup): TemplateResult {
439
+ return html`
440
+ <facets-template
441
+ .facetGroup=${facetGroup}
442
+ .selectedFacets=${this.selectedFacets}
443
+ .renderOn=${'page'}
444
+ .collectionNameCache=${this.collectionNameCache}
445
+ @selectedFacetsChanged=${(e: CustomEvent) => {
446
+ const event = new CustomEvent<SelectedFacets>('facetsChanged', {
447
+ detail: e.detail,
448
+ bubbles: true,
449
+ composed: true,
450
+ });
451
+ this.dispatchEvent(event);
452
+ }}
453
+ ></facets-template>
454
+ `;
483
455
  }
484
456
 
485
457
  /**
@@ -535,6 +507,13 @@ export class CollectionFacets extends LitElement {
535
507
  cursor: pointer;
536
508
  }
537
509
 
510
+ .facet-group-header {
511
+ display: flex;
512
+ margin-bottom: 0.7rem;
513
+ justify-content: space-between;
514
+ border-bottom: 1px solid rgb(232, 232, 232);
515
+ }
516
+
538
517
  .facet-group-content {
539
518
  transition: max-height 0.2s ease-in-out;
540
519
  }
@@ -550,88 +529,23 @@ export class CollectionFacets extends LitElement {
550
529
 
551
530
  h1 {
552
531
  font-size: 1.4rem;
553
- font-weight: 200;
554
- border-bottom: 1px solid rgb(232, 232, 232);
532
+ font-weight: 200
555
533
  padding-bottom: 3px;
556
534
  margin: 0;
557
535
  }
558
536
 
559
- ul.facet-list {
560
- list-style: none;
561
- margin: 0;
562
- padding: 0;
563
- }
564
-
565
- ul.facet-list li {
566
- margin-bottom: 0.2rem;
567
- }
568
-
569
- .facet-checkbox {
570
- margin-right: 0.5rem;
571
- display: flex;
572
- align-items: center;
573
- }
574
-
575
- .facet-row {
576
- display: flex;
577
- align-items: start;
578
- font-weight: 500;
537
+ .more-link {
579
538
  font-size: 1.2rem;
580
- }
581
-
582
- .facet-info-display {
583
- display: flex;
584
- flex: 1;
585
- cursor: pointer;
586
- }
587
-
588
- .facet-title {
589
- flex: 1;
590
- }
591
-
592
- .facet-count {
593
- margin-left: 0.5rem;
594
- }
595
-
596
- .select-facet-checkbox {
539
+ text-decoration: none;
540
+ padding: 0;
541
+ background: inherit;
542
+ border: 0;
543
+ color: blue;
597
544
  cursor: pointer;
598
- margin-right: 5px;
599
- }
600
-
601
- .hide-facet-checkbox {
602
- display: none;
603
545
  }
604
-
605
- .hide-facet-icon {
606
- width: 15px;
546
+ .sorting-icon {
607
547
  height: 15px;
608
548
  cursor: pointer;
609
- opacity: 0.3;
610
- }
611
- .hide-facet-icon:hover,
612
- .active {
613
- opacity: 1;
614
- }
615
- .hide-facet-icon:hover .eye,
616
- .hide-facet-icon .eye-closed {
617
- display: none;
618
- }
619
- .hide-facet-icon:hover .eye-closed,
620
- .hide-facet-icon.active .eye-closed {
621
- display: inline;
622
- }
623
- .hide-facet-icon.active .eye {
624
- display: none;
625
- }
626
-
627
- a:link,
628
- a:visited {
629
- text-decoration: none;
630
- color: var(--ia-theme-link-color);
631
- }
632
-
633
- a:hover {
634
- text-decoration: underline;
635
549
  }
636
550
  `;
637
551
  }
package/src/models.ts CHANGED
@@ -148,7 +148,7 @@ export type FacetValue = string;
148
148
 
149
149
  export type SelectedFacets = Record<
150
150
  FacetOption,
151
- Record<FacetValue, SelectedFacetState>
151
+ Record<FacetValue, FacetBucket>
152
152
  >;
153
153
 
154
154
  export const defaultSelectedFacets: SelectedFacets = {
@@ -159,3 +159,30 @@ export const defaultSelectedFacets: SelectedFacets = {
159
159
  collection: {},
160
160
  year: {},
161
161
  };
162
+
163
+ export const facetDisplayOrder: FacetOption[] = [
164
+ 'mediatype',
165
+ 'year',
166
+ 'subject',
167
+ 'collection',
168
+ 'creator',
169
+ 'language',
170
+ ];
171
+
172
+ export const aggregationToFacetOption: Record<string, FacetOption> = {
173
+ subjectSorter: 'subject',
174
+ mediatypeSorter: 'mediatype',
175
+ languageSorter: 'language',
176
+ creatorSorter: 'creator',
177
+ collection: 'collection',
178
+ year: 'year',
179
+ };
180
+
181
+ export const facetTitles: Record<FacetOption, string> = {
182
+ subject: 'Subject',
183
+ mediatype: 'Media Type',
184
+ language: 'Language',
185
+ creator: 'Creator',
186
+ collection: 'Collection',
187
+ year: 'Year',
188
+ };
@@ -115,8 +115,8 @@ export class RestorationStateHandler
115
115
  const facetEntries = Object.entries(facetValues);
116
116
  // eslint-disable-next-line no-continue
117
117
  if (facetEntries.length === 0) continue;
118
- for (const [key, facetState] of facetEntries) {
119
- const notValue = facetState === 'hidden';
118
+ for (const [key, data] of facetEntries) {
119
+ const notValue = data.state === 'hidden';
120
120
  const paramValue = `${facetName}:"${key}"`;
121
121
  if (notValue) {
122
122
  searchParams.append('not[]', paramValue);
@@ -228,7 +228,7 @@ export class RestorationStateHandler
228
228
  } else {
229
229
  restorationState.selectedFacets[field as FacetOption][
230
230
  unQuotedValue
231
- ] = 'selected';
231
+ ].state = 'selected';
232
232
  }
233
233
  break;
234
234
  }
@@ -241,7 +241,7 @@ export class RestorationStateHandler
241
241
  default:
242
242
  restorationState.selectedFacets[field as FacetOption][
243
243
  unQuotedValue
244
- ] = 'selected';
244
+ ].state = 'selected';
245
245
  }
246
246
  });
247
247
  }
@@ -249,8 +249,9 @@ export class RestorationStateHandler
249
249
  facetNots.forEach(not => {
250
250
  const [field, value] = not.split(':');
251
251
  const unQuotedValue = this.stripQuotes(value);
252
- restorationState.selectedFacets[field as FacetOption][unQuotedValue] =
253
- 'hidden';
252
+ restorationState.selectedFacets[field as FacetOption][
253
+ unQuotedValue
254
+ ].state = 'hidden';
254
255
  });
255
256
  }
256
257
  return restorationState;
@@ -15,11 +15,8 @@ export class CollectionBrowserLoadingTile extends LitElement {
15
15
  }
16
16
 
17
17
  #container {
18
- background: linear-gradient(
19
- to right,
20
- rgba(25, 69, 154, 0.1),
21
- rgb(105, 161, 234, 0.2)
22
- );
18
+ background: linear-gradient(to right bottom, #dddddd, #d8d8d8);
19
+ border-radius: var(--collectionTileCornerRadius, 4px);
23
20
  background-size: 100% 100%;
24
21
  display: block;
25
22
  height: 100%;
@@ -7,6 +7,7 @@ import type { CollectionBrowser } from '../src/collection-browser';
7
7
  import '../src/collection-browser';
8
8
  import {
9
9
  defaultSelectedFacets,
10
+ FacetBucket,
10
11
  SelectedFacets,
11
12
  SortField,
12
13
  } from '../src/models';
@@ -84,9 +85,10 @@ describe('Collection Browser', () => {
84
85
 
85
86
  it('selected facets with analytics - not negative facets', async () => {
86
87
  const mockAnalyticsHandler = new MockAnalyticsHandler();
88
+ const mediaTypeBucket = { count: 123, state: 'selected' } as FacetBucket;
87
89
  const mockedSelectedFacets: SelectedFacets = {
88
90
  subject: {},
89
- mediatype: { data: 'selected' },
91
+ mediatype: { data: mediaTypeBucket },
90
92
  language: {},
91
93
  creator: {},
92
94
  collection: {},
@@ -116,9 +118,10 @@ describe('Collection Browser', () => {
116
118
 
117
119
  it('selected facets with analytics - negative facets', async () => {
118
120
  const mockAnalyticsHandler = new MockAnalyticsHandler();
121
+ const mediaTypeBucket = { count: 123, state: 'selected' } as FacetBucket;
119
122
  const mockedSelectedFacets: SelectedFacets = {
120
123
  subject: {},
121
- mediatype: { data: 'selected' },
124
+ mediatype: { data: mediaTypeBucket },
122
125
  language: {},
123
126
  creator: {},
124
127
  collection: {},
@@ -244,7 +247,7 @@ describe('Collection Browser', () => {
244
247
  await el.updateComplete;
245
248
  expect(infiniteScrollerRefreshSpy.callCount).to.equal(4);
246
249
 
247
- expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');
250
+ expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
248
251
  expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
249
252
  expect(mockAnalyticsHandler.callLabel).to.equal('list-detail');
250
253