@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.
- package/dist/src/app-root.d.ts +1 -0
- package/dist/src/app-root.js +34 -4
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/assets/img/icons/arrow-left.d.ts +2 -0
- package/dist/src/assets/img/icons/arrow-left.js +10 -0
- package/dist/src/assets/img/icons/arrow-left.js.map +1 -0
- package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
- package/dist/src/assets/img/icons/arrow-right.js +10 -0
- package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
- package/dist/src/collection-browser.d.ts +2 -0
- package/dist/src/collection-browser.js +10 -2
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/facets-template.d.ts +16 -0
- package/dist/src/collection-facets/facets-template.js +266 -0
- package/dist/src/collection-facets/facets-template.js.map +1 -0
- package/dist/src/collection-facets/facets-util.d.ts +10 -0
- package/dist/src/collection-facets/facets-util.js +20 -0
- package/dist/src/collection-facets/facets-util.js.map +1 -0
- package/dist/src/collection-facets/more-facets-content.d.ts +83 -0
- package/dist/src/collection-facets/more-facets-content.js +475 -0
- package/dist/src/collection-facets/more-facets-content.js.map +1 -0
- package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -0
- package/dist/src/collection-facets/more-facets-pagination.js +267 -0
- package/dist/src/collection-facets/more-facets-pagination.js.map +1 -0
- package/dist/src/collection-facets.d.ts +19 -5
- package/dist/src/collection-facets.js +138 -239
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/models.d.ts +4 -1
- package/dist/src/models.js +24 -0
- package/dist/src/models.js.map +1 -1
- package/dist/src/restoration-state-handler.js +5 -6
- package/dist/src/restoration-state-handler.js.map +1 -1
- package/dist/src/tiles/collection-browser-loading-tile.js +2 -5
- package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -1
- package/dist/test/collection-browser.test.js +5 -3
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/collection-facets/facets-template.test.d.ts +1 -0
- package/dist/test/collection-facets/facets-template.test.js +75 -0
- package/dist/test/collection-facets/facets-template.test.js.map +1 -0
- package/dist/test/collection-facets/facets-util.test.d.ts +1 -0
- package/dist/test/collection-facets/facets-util.test.js +13 -0
- package/dist/test/collection-facets/facets-util.test.js.map +1 -0
- package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -0
- package/dist/test/collection-facets/more-facets-content.test.js +104 -0
- package/dist/test/collection-facets/more-facets-content.test.js.map +1 -0
- package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -0
- package/dist/test/collection-facets/more-facets-pagination.test.js +133 -0
- package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -0
- package/dist/test/collection-facets.test.d.ts +1 -0
- package/dist/test/collection-facets.test.js +98 -33
- package/dist/test/collection-facets.test.js.map +1 -1
- package/package.json +11 -4
- package/src/app-root.ts +34 -4
- package/src/assets/img/icons/arrow-left.ts +10 -0
- package/src/assets/img/icons/arrow-right.ts +10 -0
- package/src/collection-browser.ts +9 -2
- package/src/collection-facets/facets-template.ts +284 -0
- package/src/collection-facets/facets-util.ts +22 -0
- package/src/collection-facets/more-facets-content.ts +529 -0
- package/src/collection-facets/more-facets-pagination.ts +297 -0
- package/src/collection-facets.ts +175 -261
- package/src/models.ts +28 -1
- package/src/restoration-state-handler.ts +7 -6
- package/src/tiles/collection-browser-loading-tile.ts +2 -5
- package/test/collection-browser.test.ts +6 -3
- package/test/collection-facets/facets-template.test.ts +103 -0
- package/test/collection-facets/facets-util.test.ts +18 -0
- package/test/collection-facets/more-facets-content.test.ts +146 -0
- package/test/collection-facets/more-facets-pagination.test.ts +202 -0
- package/test/collection-facets.test.ts +127 -44
package/src/collection-facets.ts
CHANGED
|
@@ -8,53 +8,38 @@ import {
|
|
|
8
8
|
TemplateResult,
|
|
9
9
|
} from 'lit';
|
|
10
10
|
import { customElement, property, state } from 'lit/decorators.js';
|
|
11
|
-
import {
|
|
12
|
-
|
|
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
|
|
18
|
-
|
|
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
|
-
|
|
30
|
+
facetDisplayOrder,
|
|
31
|
+
facetTitles,
|
|
32
|
+
aggregationToFacetOption,
|
|
26
33
|
} from './models';
|
|
27
34
|
import type { LanguageCodeHandlerInterface } from './language-code-handler/language-code-handler';
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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,
|
|
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:
|
|
245
|
-
state:
|
|
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 =
|
|
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
|
-
<
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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
|
|
366
|
+
* Generate the More... link button just below the facets group
|
|
367
|
+
*
|
|
368
|
+
* TODO: want to fire analytics?
|
|
340
369
|
*/
|
|
341
|
-
private
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
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
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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
|
-
|
|
453
|
-
|
|
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
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
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
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
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
|
-
|
|
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
|
-
|
|
583
|
-
|
|
584
|
-
|
|
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,
|
|
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,
|
|
119
|
-
const notValue =
|
|
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][
|
|
253
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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('
|
|
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
|
|