@internetarchive/collection-browser 0.4.18-alpha.6 → 0.4.18
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/collection-browser.d.ts +1 -8
- package/dist/src/collection-browser.js +291 -318
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/facets-template.js +0 -2
- package/dist/src/collection-facets/facets-template.js.map +1 -1
- package/dist/src/collection-facets/more-facets-content.js +70 -63
- package/dist/src/collection-facets/more-facets-content.js.map +1 -1
- package/dist/src/collection-facets/more-facets-pagination.js +55 -49
- package/dist/src/collection-facets/more-facets-pagination.js.map +1 -1
- package/dist/src/collection-facets/toggle-switch.js +56 -46
- package/dist/src/collection-facets/toggle-switch.js.map +1 -1
- package/dist/src/collection-facets.d.ts +1 -1
- package/dist/src/collection-facets.js +84 -94
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -2
- package/dist/src/sort-filter-bar/alpha-bar.js +25 -33
- package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +1 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.js +186 -198
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/tiles/grid/account-tile.js +1 -1
- package/dist/src/tiles/grid/account-tile.js.map +1 -1
- package/dist/src/tiles/grid/collection-tile.js +2 -2
- package/dist/src/tiles/grid/collection-tile.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.js +2 -2
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +15 -5
- package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js.map +1 -1
- package/dist/src/tiles/grid/tile-stats.js +65 -58
- package/dist/src/tiles/grid/tile-stats.js.map +1 -1
- package/dist/src/tiles/tile-dispatcher.js +2 -3
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/test/collection-facets.test.js +5 -8
- package/dist/test/collection-facets.test.js.map +1 -1
- package/dist/test/sort-filter-bar/alpha-bar.test.js +12 -12
- package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js +2 -2
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
- package/package.json +5 -5
- package/src/collection-browser.ts +293 -321
- package/src/collection-facets/facets-template.ts +0 -2
- package/src/collection-facets/more-facets-content.ts +70 -63
- package/src/collection-facets/more-facets-pagination.ts +55 -49
- package/src/collection-facets/toggle-switch.ts +61 -51
- package/src/collection-facets.ts +85 -96
- package/src/sort-filter-bar/alpha-bar.ts +18 -26
- package/src/sort-filter-bar/sort-filter-bar.ts +186 -200
- package/src/tiles/grid/account-tile.ts +1 -1
- package/src/tiles/grid/collection-tile.ts +2 -2
- package/src/tiles/grid/item-tile.ts +2 -2
- package/src/tiles/grid/styles/tile-grid-shared-styles.ts +15 -5
- package/src/tiles/grid/tile-stats.ts +73 -66
- package/src/tiles/tile-dispatcher.ts +0 -1
- package/test/collection-facets.test.ts +2 -10
- package/test/sort-filter-bar/alpha-bar.test.ts +12 -16
- package/test/sort-filter-bar/sort-filter-bar.test.ts +2 -2
- package/dist/src/styles/sr-only.d.ts +0 -1
- package/dist/src/styles/sr-only.js +0 -18
- package/dist/src/styles/sr-only.js.map +0 -1
- package/src/styles/sr-only.ts +0 -18
|
@@ -13,7 +13,6 @@ import './collection-facets/more-facets-content';
|
|
|
13
13
|
import './collection-facets/facets-template';
|
|
14
14
|
import './collection-facets/facet-tombstone-row';
|
|
15
15
|
import { analyticsActions, analyticsCategories, } from './utils/analytics-events';
|
|
16
|
-
import { srOnlyStyle } from './styles/sr-only';
|
|
17
16
|
let CollectionFacets = class CollectionFacets extends LitElement {
|
|
18
17
|
constructor() {
|
|
19
18
|
super(...arguments);
|
|
@@ -37,18 +36,15 @@ let CollectionFacets = class CollectionFacets extends LitElement {
|
|
|
37
36
|
this.allowedFacetCount = 6;
|
|
38
37
|
}
|
|
39
38
|
render() {
|
|
40
|
-
const datePickerLabelId = 'date-picker-label';
|
|
41
39
|
return html `
|
|
42
40
|
<div id="container" class="${this.facetsLoading ? 'loading' : ''}">
|
|
43
41
|
${this.showHistogramDatePicker &&
|
|
44
42
|
(this.fullYearsHistogramAggregation || this.fullYearAggregationLoading)
|
|
45
43
|
? html `
|
|
46
|
-
<
|
|
47
|
-
<
|
|
48
|
-
Year Published <span class="sr-only">range filter</span>
|
|
49
|
-
</h3>
|
|
44
|
+
<div class="facet-group">
|
|
45
|
+
<h1>Year Published</h1>
|
|
50
46
|
${this.histogramTemplate}
|
|
51
|
-
</
|
|
47
|
+
</div>
|
|
52
48
|
`
|
|
53
49
|
: nothing}
|
|
54
50
|
${this.mergedFacets.map(facetGroup => this.getFacetGroupTemplate(facetGroup))}
|
|
@@ -245,26 +241,23 @@ let CollectionFacets = class CollectionFacets extends LitElement {
|
|
|
245
241
|
const collapser = html `
|
|
246
242
|
<span class="collapser ${isOpen ? 'open' : ''}"> ${chevronIcon} </span>
|
|
247
243
|
`;
|
|
248
|
-
|
|
244
|
+
return html `
|
|
245
|
+
<div class="facet-group ${this.collapsableFacets ? 'mobile' : ''}">
|
|
246
|
+
<div class="facet-group-header">
|
|
247
|
+
<h1
|
|
248
|
+
@click=${() => {
|
|
249
249
|
const newOpenFacets = { ...this.openFacets };
|
|
250
250
|
newOpenFacets[key] = !isOpen;
|
|
251
251
|
this.openFacets = newOpenFacets;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
>
|
|
259
|
-
<div class="facet-group-header">
|
|
260
|
-
<h3
|
|
261
|
-
id=${headerId}
|
|
262
|
-
@click=${toggleCollapsed}
|
|
263
|
-
@keyup=${toggleCollapsed}
|
|
252
|
+
}}
|
|
253
|
+
@keyup=${() => {
|
|
254
|
+
const newOpenFacets = { ...this.openFacets };
|
|
255
|
+
newOpenFacets[key] = !isOpen;
|
|
256
|
+
this.openFacets = newOpenFacets;
|
|
257
|
+
}}
|
|
264
258
|
>
|
|
265
259
|
${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}
|
|
266
|
-
|
|
267
|
-
</h3>
|
|
260
|
+
</h1>
|
|
268
261
|
</div>
|
|
269
262
|
<div class="facet-group-content ${isOpen ? 'open' : ''}">
|
|
270
263
|
${this.facetsLoading
|
|
@@ -274,7 +267,7 @@ let CollectionFacets = class CollectionFacets extends LitElement {
|
|
|
274
267
|
${this.searchMoreFacetsLink(facetGroup)}
|
|
275
268
|
`}
|
|
276
269
|
</div>
|
|
277
|
-
</
|
|
270
|
+
</div>
|
|
278
271
|
`;
|
|
279
272
|
}
|
|
280
273
|
getTombstoneFacetGroupTemplate() {
|
|
@@ -381,91 +374,88 @@ let CollectionFacets = class CollectionFacets extends LitElement {
|
|
|
381
374
|
`;
|
|
382
375
|
}
|
|
383
376
|
static get styles() {
|
|
384
|
-
return
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
opacity: 0.5;
|
|
389
|
-
}
|
|
377
|
+
return css `
|
|
378
|
+
#container.loading {
|
|
379
|
+
opacity: 0.5;
|
|
380
|
+
}
|
|
390
381
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
382
|
+
.histogram-loading-indicator {
|
|
383
|
+
width: 100%;
|
|
384
|
+
height: 2.25rem;
|
|
385
|
+
margin-top: 1.75rem;
|
|
386
|
+
font-size: 1.4rem;
|
|
387
|
+
text-align: center;
|
|
388
|
+
}
|
|
398
389
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
390
|
+
.collapser {
|
|
391
|
+
display: inline-block;
|
|
392
|
+
cursor: pointer;
|
|
393
|
+
width: 10px;
|
|
394
|
+
height: 10px;
|
|
395
|
+
}
|
|
405
396
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
397
|
+
.collapser svg {
|
|
398
|
+
transition: transform 0.2s ease-in-out;
|
|
399
|
+
}
|
|
409
400
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
401
|
+
.collapser.open svg {
|
|
402
|
+
transform: rotate(90deg);
|
|
403
|
+
}
|
|
413
404
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
405
|
+
.facet-group:not(:last-child) {
|
|
406
|
+
margin-bottom: 2rem;
|
|
407
|
+
}
|
|
417
408
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
409
|
+
.facet-group h1 {
|
|
410
|
+
margin-bottom: 0.7rem;
|
|
411
|
+
}
|
|
421
412
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
413
|
+
.facet-group.mobile h1 {
|
|
414
|
+
cursor: pointer;
|
|
415
|
+
}
|
|
425
416
|
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
417
|
+
.facet-group-header {
|
|
418
|
+
display: flex;
|
|
419
|
+
margin-bottom: 0.7rem;
|
|
420
|
+
justify-content: space-between;
|
|
421
|
+
border-bottom: 1px solid rgb(232, 232, 232);
|
|
422
|
+
}
|
|
432
423
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
424
|
+
.facet-group-content {
|
|
425
|
+
transition: max-height 0.2s ease-in-out;
|
|
426
|
+
}
|
|
436
427
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
428
|
+
.facet-group.mobile .facet-group-content {
|
|
429
|
+
max-height: 0;
|
|
430
|
+
overflow: hidden;
|
|
431
|
+
}
|
|
441
432
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
433
|
+
.facet-group.mobile .facet-group-content.open {
|
|
434
|
+
max-height: 2000px;
|
|
435
|
+
}
|
|
445
436
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
437
|
+
h1 {
|
|
438
|
+
font-size: 1.4rem;
|
|
439
|
+
font-weight: 200
|
|
440
|
+
padding-bottom: 3px;
|
|
441
|
+
margin: 0;
|
|
442
|
+
}
|
|
452
443
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
444
|
+
.more-link {
|
|
445
|
+
font-size: 1.2rem;
|
|
446
|
+
text-decoration: none;
|
|
447
|
+
padding: 0;
|
|
448
|
+
background: inherit;
|
|
449
|
+
border: 0;
|
|
450
|
+
color: var(--ia-theme-link-color, #4b64ff);
|
|
451
|
+
cursor: pointer;
|
|
452
|
+
}
|
|
462
453
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
];
|
|
454
|
+
.sorting-icon {
|
|
455
|
+
height: 15px;
|
|
456
|
+
cursor: pointer;
|
|
457
|
+
}
|
|
458
|
+
`;
|
|
469
459
|
}
|
|
470
460
|
};
|
|
471
461
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-facets.js","sourceRoot":"","sources":["../../src/collection-facets.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n css,\n html,\n LitElement,\n PropertyValues,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { map } from 'lit/directives/map.js';\nimport type {\n Aggregation,\n AggregationSortType,\n Bucket,\n FilterMap,\n SearchServiceInterface,\n SearchType,\n} from '@internetarchive/search-service';\nimport '@internetarchive/histogram-date-range';\nimport '@internetarchive/feature-feedback';\nimport '@internetarchive/collection-name-cache';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport {\n ModalConfig,\n ModalManagerInterface,\n} from '@internetarchive/modal-manager';\nimport type { FeatureFeedbackServiceInterface } from '@internetarchive/feature-feedback';\nimport type { RecaptchaManagerInterface } from '@internetarchive/recaptcha-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport type { SharedResizeObserverInterface } from '@internetarchive/shared-resize-observer';\nimport chevronIcon from './assets/img/icons/chevron';\nimport {\n FacetOption,\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n facetDisplayOrder,\n facetTitles,\n lendingFacetDisplayNames,\n lendingFacetKeysVisibility,\n LendingFacetKey,\n suppressedCollections,\n defaultFacetSort,\n} from './models';\nimport './collection-facets/more-facets-content';\nimport './collection-facets/facets-template';\nimport './collection-facets/facet-tombstone-row';\nimport {\n analyticsActions,\n analyticsCategories,\n} from './utils/analytics-events';\nimport { srOnlyStyle } from './styles/sr-only';\n\n@customElement('collection-facets')\nexport class CollectionFacets extends LitElement {\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) searchType?: SearchType;\n\n @property({ type: Object }) aggregations?: Record<string, Aggregation>;\n\n @property({ type: Object }) fullYearsHistogramAggregation?: Aggregation;\n\n @property({ type: String }) minSelectedDate?: string;\n\n @property({ type: String }) maxSelectedDate?: string;\n\n @property({ type: Boolean }) moreLinksVisible = true;\n\n @property({ type: Boolean }) facetsLoading = false;\n\n @property({ type: Boolean }) fullYearAggregationLoading = false;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Boolean }) collapsableFacets = false;\n\n @property({ type: Boolean }) showHistogramDatePicker = false;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Object, attribute: false })\n modalManager?: ModalManagerInterface;\n\n @property({ type: Object, attribute: false })\n resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object, attribute: false })\n featureFeedbackService?: FeatureFeedbackServiceInterface;\n\n @property({ type: Object, attribute: false })\n recaptchaManager?: RecaptchaManagerInterface;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n @property({ type: Object, attribute: false })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @state() openFacets: Record<FacetOption, boolean> = {\n subject: false,\n lending: false,\n mediatype: false,\n language: false,\n creator: false,\n collection: false,\n year: false,\n };\n\n /**\n * Maximum # of facet buckets to render per facet group\n */\n private allowedFacetCount = 6;\n\n render() {\n const datePickerLabelId = 'date-picker-label';\n return html`\n <div id=\"container\" class=\"${this.facetsLoading ? 'loading' : ''}\">\n ${this.showHistogramDatePicker &&\n (this.fullYearsHistogramAggregation || this.fullYearAggregationLoading)\n ? html`\n <section class=\"facet-group\" aria-labelledby=${datePickerLabelId}>\n <h3 id=${datePickerLabelId}>\n Year Published <span class=\"sr-only\">range filter</span>\n </h3>\n ${this.histogramTemplate}\n </section>\n `\n : nothing}\n ${this.mergedFacets.map(facetGroup =>\n this.getFacetGroupTemplate(facetGroup)\n )}\n </div>\n `;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('selectedFacets')) {\n this.dispatchFacetsChangedEvent();\n }\n }\n\n // TODO: want to fire analytics?\n private dispatchFacetsChangedEvent() {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n });\n this.dispatchEvent(event);\n }\n\n private get currentYearsHistogramAggregation(): Aggregation | undefined {\n return this.aggregations?.year_histogram;\n }\n\n private get histogramTemplate() {\n const { fullYearsHistogramAggregation } = this;\n return this.fullYearAggregationLoading\n ? html`<div class=\"histogram-loading-indicator\">…</div>` // Ellipsis block\n : html`\n <histogram-date-range\n .minDate=${fullYearsHistogramAggregation?.first_bucket_key}\n .maxDate=${fullYearsHistogramAggregation?.last_bucket_key}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .updateDelay=${100}\n missingDataMessage=\"...\"\n .width=${180}\n .bins=${fullYearsHistogramAggregation?.buckets as number[]}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n ></histogram-date-range>\n `;\n }\n\n private histogramDateRangeUpdated(\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>\n ) {\n const { minDate, maxDate } = e.detail;\n const event = new CustomEvent('histogramDateRangeUpdated', {\n detail: { minDate, maxDate },\n });\n this.dispatchEvent(event);\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n\n facetDisplayOrder.forEach(facetKey => {\n const selectedFacetGroup = this.selectedFacetGroups.find(\n group => group.key === facetKey\n );\n const aggregateFacetGroup = this.aggregationFacetGroups.find(\n group => group.key === facetKey\n );\n\n // if the user selected a facet, but it's not in the aggregation, we add it as-is\n if (selectedFacetGroup && !aggregateFacetGroup) {\n facetGroups.push(selectedFacetGroup);\n return;\n }\n\n // if we don't have an aggregate facet group, don't add this to the list\n if (!aggregateFacetGroup) return;\n\n // start with either the selected group if we have one, or the aggregate group\n const facetGroup = selectedFacetGroup ?? aggregateFacetGroup;\n\n // attach the counts to the selected buckets\n let bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregateFacetGroup.buckets.find(\n b => b.key === bucket.key\n );\n return selectedBucket\n ? {\n ...bucket,\n count: selectedBucket.count,\n }\n : bucket;\n }) ?? [];\n\n // append any additional buckets that were not selected\n aggregateFacetGroup.buckets.forEach(bucket => {\n const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n\n // For lending facets, only include a specific subset of buckets\n if (facetKey === 'lending') {\n bucketsWithCount = bucketsWithCount.filter(\n bucket => lendingFacetKeysVisibility[bucket.key as LendingFacetKey]\n );\n }\n\n /**\n * render limited facet items on page facet area\n *\n * - by-default we are showing 6 items\n * - additionally want to show all items (selected/suppressed) in page facet area\n */\n let allowedFacetCount = Object.keys(\n (selectedFacetGroup?.buckets as []) || []\n )?.length;\n if (allowedFacetCount < this.allowedFacetCount) {\n allowedFacetCount = this.allowedFacetCount; // splice start index from 0th\n }\n\n // splice how many items we want to show in page facet area\n facetGroup.buckets = bucketsWithCount.splice(0, allowedFacetCount);\n\n facetGroups.push(facetGroup);\n });\n\n return facetGroups;\n }\n\n /**\n * Converts the selected facets to a `FacetGroup` array,\n * which is easier to work with\n */\n private get selectedFacetGroups(): FacetGroup[] {\n if (!this.selectedFacets) return [];\n\n const facetGroups: FacetGroup[] = Object.entries(this.selectedFacets).map(\n ([key, selectedFacets]) => {\n const option = key as FacetOption;\n const title = facetTitles[option];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacets).map(\n ([value, facetData]) => {\n let displayText: string = value;\n // for lending facets, convert the key to a readable format\n if (option === 'lending') {\n displayText =\n lendingFacetDisplayNames[value as LendingFacetKey] ?? value;\n }\n return {\n displayText,\n key: value,\n count: facetData.count,\n state: facetData.state,\n };\n }\n );\n\n return {\n title,\n key: option,\n buckets,\n };\n }\n );\n\n return facetGroups;\n }\n\n /**\n * Converts the raw `aggregations` to `FacetGroups`, which are easier to use\n */\n private get aggregationFacetGroups(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n Object.entries(this.aggregations ?? []).forEach(([key, aggregation]) => {\n // the year_histogram data is in a different format so can't be handled here\n if (key === 'year_histogram') return;\n\n const option = key as FacetOption;\n const title = facetTitles[option];\n if (!title) return;\n\n let castedBuckets = aggregation.getSortedBuckets(\n defaultFacetSort[option]\n ) as Bucket[];\n\n if (option === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n castedBuckets = castedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n }\n\n const facetBuckets: FacetBucket[] = castedBuckets.map(bucket => {\n const bucketKey = bucket.key;\n let displayText = `${bucket.key}`;\n // for lending facets, convert the bucket key to a readable format\n if (option === 'lending') {\n displayText =\n lendingFacetDisplayNames[bucket.key as LendingFacetKey] ??\n `${bucket.key}`;\n }\n return {\n displayText,\n key: `${bucketKey}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n const group: FacetGroup = {\n title,\n key: option,\n buckets: facetBuckets,\n };\n facetGroups.push(group);\n });\n return facetGroups;\n }\n\n /**\n * Generate the template for a facet group with a header and the collapsible\n * chevron for the mobile view\n */\n private getFacetGroupTemplate(\n facetGroup: FacetGroup\n ): TemplateResult | typeof nothing {\n if (!this.facetsLoading && facetGroup.buckets.length === 0) return nothing;\n\n const { key } = facetGroup;\n const isOpen = this.openFacets[key];\n const collapser = html`\n <span class=\"collapser ${isOpen ? 'open' : ''}\"> ${chevronIcon} </span>\n `;\n\n const toggleCollapsed = () => {\n const newOpenFacets = { ...this.openFacets };\n newOpenFacets[key] = !isOpen;\n this.openFacets = newOpenFacets;\n };\n\n const headerId = `facet-group-header-label-${facetGroup.key}`;\n return html`\n <section\n class=\"facet-group ${this.collapsableFacets ? 'mobile' : ''}\"\n aria-labelledby=${headerId}\n >\n <div class=\"facet-group-header\">\n <h3\n id=${headerId}\n @click=${toggleCollapsed}\n @keyup=${toggleCollapsed}\n >\n ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}\n <span class=\"sr-only\">filters</span>\n </h3>\n </div>\n <div class=\"facet-group-content ${isOpen ? 'open' : ''}\">\n ${this.facetsLoading\n ? this.getTombstoneFacetGroupTemplate()\n : html`\n ${this.getFacetTemplate(facetGroup)}\n ${this.searchMoreFacetsLink(facetGroup)}\n `}\n </div>\n </section>\n `;\n }\n\n private getTombstoneFacetGroupTemplate(): TemplateResult {\n // Render five tombstone rows\n return html`\n ${map(\n Array(5).fill(null),\n () => html`<facet-tombstone-row></facet-tombstone-row>`\n )}\n `;\n }\n\n /**\n * Generate the More... link button just below the facets group\n *\n * TODO: want to fire analytics?\n */\n private searchMoreFacetsLink(\n facetGroup: FacetGroup\n ): TemplateResult | typeof nothing {\n // Don't render More... links for FTS searches\n if (!this.moreLinksVisible) {\n return nothing;\n }\n\n // Don't render More... links for lending facets\n if (facetGroup.key === 'lending') {\n return nothing;\n }\n\n // Don't render More... link if the number of facets < this.allowedFacetCount\n if (Object.keys(facetGroup.buckets).length < this.allowedFacetCount) {\n return nothing;\n }\n\n // We sort years in numeric order by default, rather than bucket count\n const facetSort = defaultFacetSort[facetGroup.key];\n\n return html`<button\n class=\"more-link\"\n @click=${() => {\n this.showMoreFacetsModal(facetGroup, facetSort);\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.showMoreFacetsModal,\n label: facetGroup.key,\n });\n this.dispatchEvent(\n new CustomEvent('showMoreFacets', { detail: facetGroup.key })\n );\n }}\n >\n More...\n </button>`;\n }\n\n async showMoreFacetsModal(\n facetGroup: FacetGroup,\n sortedBy: AggregationSortType\n ): Promise<void> {\n const facetAggrKey = facetGroup.key;\n\n const customModalContent = html`\n <more-facets-content\n .analyticsHandler=${this.analyticsHandler}\n .facetKey=${facetGroup.key}\n .facetAggregationKey=${facetAggrKey}\n .query=${this.query}\n .filterMap=${this.filterMap}\n .modalManager=${this.modalManager}\n .searchService=${this.searchService}\n .searchType=${this.searchType}\n .collectionNameCache=${this.collectionNameCache}\n .selectedFacets=${this.selectedFacets}\n .sortedBy=${sortedBy}\n @facetsChanged=${(e: CustomEvent) => {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: e.detail,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }}\n >\n </more-facets-content>\n `;\n\n const config = new ModalConfig({\n bodyColor: '#fff',\n headerColor: '#194880',\n showHeaderLogo: false,\n closeOnBackdropClick: true, // TODO: want to fire analytics\n title: html`Select filters`,\n });\n this.modalManager?.classList.add('more-search-facets');\n this.modalManager?.showModal({\n config,\n customModalContent,\n });\n }\n\n /**\n * Generate the list template for each bucket in a facet group\n */\n private getFacetTemplate(facetGroup: FacetGroup): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${facetGroup}\n .selectedFacets=${this.selectedFacets}\n .renderOn=${'page'}\n .collectionNameCache=${this.collectionNameCache}\n @selectedFacetsChanged=${(e: CustomEvent) => {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: e.detail,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }}\n ></facets-template>\n `;\n }\n\n static get styles() {\n return [\n srOnlyStyle,\n css`\n #container.loading {\n opacity: 0.5;\n }\n\n .histogram-loading-indicator {\n width: 100%;\n height: 2.25rem;\n margin-top: 1.75rem;\n font-size: 1.4rem;\n text-align: center;\n }\n\n .collapser {\n display: inline-block;\n cursor: pointer;\n width: 10px;\n height: 10px;\n }\n\n .collapser svg {\n transition: transform 0.2s ease-in-out;\n }\n\n .collapser.open svg {\n transform: rotate(90deg);\n }\n\n .facet-group:not(:last-child) {\n margin-bottom: 2rem;\n }\n\n .facet-group h3 {\n margin-bottom: 0.7rem;\n }\n\n .facet-group.mobile h3 {\n cursor: pointer;\n }\n\n .facet-group-header {\n display: flex;\n margin-bottom: 0.7rem;\n justify-content: space-between;\n border-bottom: 1px solid rgb(232, 232, 232);\n }\n\n .facet-group-content {\n transition: max-height 0.2s ease-in-out;\n }\n\n .facet-group.mobile .facet-group-content {\n max-height: 0;\n overflow: hidden;\n }\n\n .facet-group.mobile .facet-group-content.open {\n max-height: 2000px;\n }\n\n h3 {\n font-size: 1.4rem;\n font-weight: 200\n padding-bottom: 3px;\n margin: 0;\n }\n\n .more-link {\n font-size: 1.2rem;\n text-decoration: none;\n padding: 0;\n background: inherit;\n border: 0;\n color: var(--ia-theme-link-color, #4b64ff);\n cursor: pointer;\n }\n\n .sorting-icon {\n height: 15px;\n cursor: pointer;\n }\n `,\n ];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collection-facets.js","sourceRoot":"","sources":["../../src/collection-facets.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n css,\n html,\n LitElement,\n PropertyValues,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { map } from 'lit/directives/map.js';\nimport type {\n Aggregation,\n AggregationSortType,\n Bucket,\n FilterMap,\n SearchServiceInterface,\n SearchType,\n} from '@internetarchive/search-service';\nimport '@internetarchive/histogram-date-range';\nimport '@internetarchive/feature-feedback';\nimport '@internetarchive/collection-name-cache';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport {\n ModalConfig,\n ModalManagerInterface,\n} from '@internetarchive/modal-manager';\nimport type { FeatureFeedbackServiceInterface } from '@internetarchive/feature-feedback';\nimport type { RecaptchaManagerInterface } from '@internetarchive/recaptcha-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport type { SharedResizeObserverInterface } from '@internetarchive/shared-resize-observer';\nimport chevronIcon from './assets/img/icons/chevron';\nimport {\n FacetOption,\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n facetDisplayOrder,\n facetTitles,\n lendingFacetDisplayNames,\n lendingFacetKeysVisibility,\n LendingFacetKey,\n suppressedCollections,\n defaultFacetSort,\n} from './models';\nimport './collection-facets/more-facets-content';\nimport './collection-facets/facets-template';\nimport './collection-facets/facet-tombstone-row';\nimport {\n analyticsActions,\n analyticsCategories,\n} from './utils/analytics-events';\n\n@customElement('collection-facets')\nexport class CollectionFacets extends LitElement {\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) searchType?: SearchType;\n\n @property({ type: Object }) aggregations?: Record<string, Aggregation>;\n\n @property({ type: Object }) fullYearsHistogramAggregation?: Aggregation;\n\n @property({ type: String }) minSelectedDate?: string;\n\n @property({ type: String }) maxSelectedDate?: string;\n\n @property({ type: Boolean }) moreLinksVisible = true;\n\n @property({ type: Boolean }) facetsLoading = false;\n\n @property({ type: Boolean }) fullYearAggregationLoading = false;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Boolean }) collapsableFacets = false;\n\n @property({ type: Boolean }) showHistogramDatePicker = false;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Object, attribute: false })\n modalManager?: ModalManagerInterface;\n\n @property({ type: Object, attribute: false })\n resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object, attribute: false })\n featureFeedbackService?: FeatureFeedbackServiceInterface;\n\n @property({ type: Object, attribute: false })\n recaptchaManager?: RecaptchaManagerInterface;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n @property({ type: Object, attribute: false })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @state() openFacets: Record<FacetOption, boolean> = {\n subject: false,\n lending: false,\n mediatype: false,\n language: false,\n creator: false,\n collection: false,\n year: false,\n };\n\n /**\n * Maximum # of facet buckets to render per facet group\n */\n private allowedFacetCount = 6;\n\n render() {\n return html`\n <div id=\"container\" class=\"${this.facetsLoading ? 'loading' : ''}\">\n ${this.showHistogramDatePicker &&\n (this.fullYearsHistogramAggregation || this.fullYearAggregationLoading)\n ? html`\n <div class=\"facet-group\">\n <h1>Year Published</h1>\n ${this.histogramTemplate}\n </div>\n `\n : nothing}\n ${this.mergedFacets.map(facetGroup =>\n this.getFacetGroupTemplate(facetGroup)\n )}\n </div>\n `;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('selectedFacets')) {\n this.dispatchFacetsChangedEvent();\n }\n }\n\n // TODO: want to fire analytics?\n private dispatchFacetsChangedEvent() {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n });\n this.dispatchEvent(event);\n }\n\n private get currentYearsHistogramAggregation(): Aggregation | undefined {\n return this.aggregations?.year_histogram;\n }\n\n private get histogramTemplate() {\n const { fullYearsHistogramAggregation } = this;\n return this.fullYearAggregationLoading\n ? html`<div class=\"histogram-loading-indicator\">…</div>` // Ellipsis block\n : html`\n <histogram-date-range\n .minDate=${fullYearsHistogramAggregation?.first_bucket_key}\n .maxDate=${fullYearsHistogramAggregation?.last_bucket_key}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .updateDelay=${100}\n missingDataMessage=\"...\"\n .width=${180}\n .bins=${fullYearsHistogramAggregation?.buckets as number[]}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n ></histogram-date-range>\n `;\n }\n\n private histogramDateRangeUpdated(\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>\n ) {\n const { minDate, maxDate } = e.detail;\n const event = new CustomEvent('histogramDateRangeUpdated', {\n detail: { minDate, maxDate },\n });\n this.dispatchEvent(event);\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n\n facetDisplayOrder.forEach(facetKey => {\n const selectedFacetGroup = this.selectedFacetGroups.find(\n group => group.key === facetKey\n );\n const aggregateFacetGroup = this.aggregationFacetGroups.find(\n group => group.key === facetKey\n );\n\n // if the user selected a facet, but it's not in the aggregation, we add it as-is\n if (selectedFacetGroup && !aggregateFacetGroup) {\n facetGroups.push(selectedFacetGroup);\n return;\n }\n\n // if we don't have an aggregate facet group, don't add this to the list\n if (!aggregateFacetGroup) return;\n\n // start with either the selected group if we have one, or the aggregate group\n const facetGroup = selectedFacetGroup ?? aggregateFacetGroup;\n\n // attach the counts to the selected buckets\n let bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregateFacetGroup.buckets.find(\n b => b.key === bucket.key\n );\n return selectedBucket\n ? {\n ...bucket,\n count: selectedBucket.count,\n }\n : bucket;\n }) ?? [];\n\n // append any additional buckets that were not selected\n aggregateFacetGroup.buckets.forEach(bucket => {\n const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n\n // For lending facets, only include a specific subset of buckets\n if (facetKey === 'lending') {\n bucketsWithCount = bucketsWithCount.filter(\n bucket => lendingFacetKeysVisibility[bucket.key as LendingFacetKey]\n );\n }\n\n /**\n * render limited facet items on page facet area\n *\n * - by-default we are showing 6 items\n * - additionally want to show all items (selected/suppressed) in page facet area\n */\n let allowedFacetCount = Object.keys(\n (selectedFacetGroup?.buckets as []) || []\n )?.length;\n if (allowedFacetCount < this.allowedFacetCount) {\n allowedFacetCount = this.allowedFacetCount; // splice start index from 0th\n }\n\n // splice how many items we want to show in page facet area\n facetGroup.buckets = bucketsWithCount.splice(0, allowedFacetCount);\n\n facetGroups.push(facetGroup);\n });\n\n return facetGroups;\n }\n\n /**\n * Converts the selected facets to a `FacetGroup` array,\n * which is easier to work with\n */\n private get selectedFacetGroups(): FacetGroup[] {\n if (!this.selectedFacets) return [];\n\n const facetGroups: FacetGroup[] = Object.entries(this.selectedFacets).map(\n ([key, selectedFacets]) => {\n const option = key as FacetOption;\n const title = facetTitles[option];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacets).map(\n ([value, facetData]) => {\n let displayText: string = value;\n // for lending facets, convert the key to a readable format\n if (option === 'lending') {\n displayText =\n lendingFacetDisplayNames[value as LendingFacetKey] ?? value;\n }\n return {\n displayText,\n key: value,\n count: facetData.count,\n state: facetData.state,\n };\n }\n );\n\n return {\n title,\n key: option,\n buckets,\n };\n }\n );\n\n return facetGroups;\n }\n\n /**\n * Converts the raw `aggregations` to `FacetGroups`, which are easier to use\n */\n private get aggregationFacetGroups(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n Object.entries(this.aggregations ?? []).forEach(([key, aggregation]) => {\n // the year_histogram data is in a different format so can't be handled here\n if (key === 'year_histogram') return;\n\n const option = key as FacetOption;\n const title = facetTitles[option];\n if (!title) return;\n\n let castedBuckets = aggregation.getSortedBuckets(\n defaultFacetSort[option]\n ) as Bucket[];\n\n if (option === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n castedBuckets = castedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n }\n\n const facetBuckets: FacetBucket[] = castedBuckets.map(bucket => {\n const bucketKey = bucket.key;\n let displayText = `${bucket.key}`;\n // for lending facets, convert the bucket key to a readable format\n if (option === 'lending') {\n displayText =\n lendingFacetDisplayNames[bucket.key as LendingFacetKey] ??\n `${bucket.key}`;\n }\n return {\n displayText,\n key: `${bucketKey}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n const group: FacetGroup = {\n title,\n key: option,\n buckets: facetBuckets,\n };\n facetGroups.push(group);\n });\n return facetGroups;\n }\n\n /**\n * Generate the template for a facet group with a header and the collapsible\n * chevron for the mobile view\n */\n private getFacetGroupTemplate(\n facetGroup: FacetGroup\n ): TemplateResult | typeof nothing {\n if (!this.facetsLoading && facetGroup.buckets.length === 0) return nothing;\n\n const { key } = facetGroup;\n const isOpen = this.openFacets[key];\n const collapser = html`\n <span class=\"collapser ${isOpen ? 'open' : ''}\"> ${chevronIcon} </span>\n `;\n\n return html`\n <div class=\"facet-group ${this.collapsableFacets ? 'mobile' : ''}\">\n <div class=\"facet-group-header\">\n <h1\n @click=${() => {\n const newOpenFacets = { ...this.openFacets };\n newOpenFacets[key] = !isOpen;\n this.openFacets = newOpenFacets;\n }}\n @keyup=${() => {\n const newOpenFacets = { ...this.openFacets };\n newOpenFacets[key] = !isOpen;\n this.openFacets = newOpenFacets;\n }}\n >\n ${this.collapsableFacets ? collapser : nothing} ${facetGroup.title}\n </h1>\n </div>\n <div class=\"facet-group-content ${isOpen ? 'open' : ''}\">\n ${this.facetsLoading\n ? this.getTombstoneFacetGroupTemplate()\n : html`\n ${this.getFacetTemplate(facetGroup)}\n ${this.searchMoreFacetsLink(facetGroup)}\n `}\n </div>\n </div>\n `;\n }\n\n private getTombstoneFacetGroupTemplate(): TemplateResult {\n // Render five tombstone rows\n return html`\n ${map(\n Array(5).fill(null),\n () => html`<facet-tombstone-row></facet-tombstone-row>`\n )}\n `;\n }\n\n /**\n * Generate the More... link button just below the facets group\n *\n * TODO: want to fire analytics?\n */\n private searchMoreFacetsLink(\n facetGroup: FacetGroup\n ): TemplateResult | typeof nothing {\n // Don't render More... links for FTS searches\n if (!this.moreLinksVisible) {\n return nothing;\n }\n\n // Don't render More... links for lending facets\n if (facetGroup.key === 'lending') {\n return nothing;\n }\n\n // Don't render More... link if the number of facets < this.allowedFacetCount\n if (Object.keys(facetGroup.buckets).length < this.allowedFacetCount) {\n return nothing;\n }\n\n // We sort years in numeric order by default, rather than bucket count\n const facetSort = defaultFacetSort[facetGroup.key];\n\n return html`<button\n class=\"more-link\"\n @click=${() => {\n this.showMoreFacetsModal(facetGroup, facetSort);\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.showMoreFacetsModal,\n label: facetGroup.key,\n });\n this.dispatchEvent(\n new CustomEvent('showMoreFacets', { detail: facetGroup.key })\n );\n }}\n >\n More...\n </button>`;\n }\n\n async showMoreFacetsModal(\n facetGroup: FacetGroup,\n sortedBy: AggregationSortType\n ): Promise<void> {\n const facetAggrKey = facetGroup.key;\n\n const customModalContent = html`\n <more-facets-content\n .analyticsHandler=${this.analyticsHandler}\n .facetKey=${facetGroup.key}\n .facetAggregationKey=${facetAggrKey}\n .query=${this.query}\n .filterMap=${this.filterMap}\n .modalManager=${this.modalManager}\n .searchService=${this.searchService}\n .searchType=${this.searchType}\n .collectionNameCache=${this.collectionNameCache}\n .selectedFacets=${this.selectedFacets}\n .sortedBy=${sortedBy}\n @facetsChanged=${(e: CustomEvent) => {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: e.detail,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }}\n >\n </more-facets-content>\n `;\n\n const config = new ModalConfig({\n bodyColor: '#fff',\n headerColor: '#194880',\n showHeaderLogo: false,\n closeOnBackdropClick: true, // TODO: want to fire analytics\n title: html`Select filters`,\n });\n this.modalManager?.classList.add('more-search-facets');\n this.modalManager?.showModal({\n config,\n customModalContent,\n });\n }\n\n /**\n * Generate the list template for each bucket in a facet group\n */\n private getFacetTemplate(facetGroup: FacetGroup): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${facetGroup}\n .selectedFacets=${this.selectedFacets}\n .renderOn=${'page'}\n .collectionNameCache=${this.collectionNameCache}\n @selectedFacetsChanged=${(e: CustomEvent) => {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: e.detail,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n }}\n ></facets-template>\n `;\n }\n\n static get styles() {\n return css`\n #container.loading {\n opacity: 0.5;\n }\n\n .histogram-loading-indicator {\n width: 100%;\n height: 2.25rem;\n margin-top: 1.75rem;\n font-size: 1.4rem;\n text-align: center;\n }\n\n .collapser {\n display: inline-block;\n cursor: pointer;\n width: 10px;\n height: 10px;\n }\n\n .collapser svg {\n transition: transform 0.2s ease-in-out;\n }\n\n .collapser.open svg {\n transform: rotate(90deg);\n }\n\n .facet-group:not(:last-child) {\n margin-bottom: 2rem;\n }\n\n .facet-group h1 {\n margin-bottom: 0.7rem;\n }\n\n .facet-group.mobile h1 {\n cursor: pointer;\n }\n\n .facet-group-header {\n display: flex;\n margin-bottom: 0.7rem;\n justify-content: space-between;\n border-bottom: 1px solid rgb(232, 232, 232);\n }\n\n .facet-group-content {\n transition: max-height 0.2s ease-in-out;\n }\n\n .facet-group.mobile .facet-group-content {\n max-height: 0;\n overflow: hidden;\n }\n\n .facet-group.mobile .facet-group-content.open {\n max-height: 2000px;\n }\n\n h1 {\n font-size: 1.4rem;\n font-weight: 200\n padding-bottom: 3px;\n margin: 0;\n }\n\n .more-link {\n font-size: 1.2rem;\n text-decoration: none;\n padding: 0;\n background: inherit;\n border: 0;\n color: var(--ia-theme-link-color, #4b64ff);\n cursor: pointer;\n }\n\n .sorting-icon {\n height: 15px;\n cursor: pointer;\n }\n `;\n }\n}\n"]}
|
|
@@ -4,14 +4,13 @@ import './alpha-bar-tooltip';
|
|
|
4
4
|
export declare class AlphaBar extends LitElement {
|
|
5
5
|
selectedLetter: string | null;
|
|
6
6
|
letterCounts?: PrefixFilterCounts;
|
|
7
|
-
ariaLandmarkLabel?: string;
|
|
8
7
|
private tooltipShown;
|
|
9
8
|
private hoveredLetter?;
|
|
10
9
|
private tooltip?;
|
|
11
10
|
private readonly alphabet;
|
|
12
11
|
private get selectedUppercaseLetter();
|
|
13
12
|
render(): TemplateResult<1>;
|
|
14
|
-
private
|
|
13
|
+
private letterLinkTemplate;
|
|
15
14
|
private tooltipTemplate;
|
|
16
15
|
private letterClicked;
|
|
17
16
|
private handleMouseMove;
|
|
@@ -14,39 +14,41 @@ let AlphaBar = class AlphaBar extends LitElement {
|
|
|
14
14
|
return (_a = this.selectedLetter) === null || _a === void 0 ? void 0 : _a.toUpperCase();
|
|
15
15
|
}
|
|
16
16
|
render() {
|
|
17
|
-
var _a;
|
|
18
17
|
return html `
|
|
19
|
-
<
|
|
18
|
+
<div id="container">
|
|
20
19
|
<ul>
|
|
21
|
-
${this.alphabet.map(letter =>
|
|
20
|
+
${this.alphabet.map(letter => {
|
|
21
|
+
var _a;
|
|
22
|
+
return html `
|
|
22
23
|
<li
|
|
23
24
|
class=${letter === this.selectedUppercaseLetter
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
? 'selected'
|
|
26
|
+
: nothing}
|
|
26
27
|
@mousemove=${this.handleMouseMove}
|
|
27
28
|
@mouseleave=${this.handleMouseLeave}
|
|
28
29
|
>
|
|
29
|
-
${this.
|
|
30
|
+
${((_a = this.letterCounts) === null || _a === void 0 ? void 0 : _a[letter])
|
|
31
|
+
? this.letterLinkTemplate(letter)
|
|
32
|
+
: html `<span>${letter}</span>`}
|
|
30
33
|
${this.tooltipTemplate(letter)}
|
|
31
34
|
</li>
|
|
32
|
-
|
|
35
|
+
`;
|
|
36
|
+
})}
|
|
33
37
|
</ul>
|
|
34
|
-
</
|
|
38
|
+
</div>
|
|
35
39
|
`;
|
|
36
40
|
}
|
|
37
|
-
|
|
38
|
-
var _a, _b, _c;
|
|
39
|
-
const ariaLabel = `${letter}: ${(_b = (_a = this.letterCounts) === null || _a === void 0 ? void 0 : _a[letter]) !== null && _b !== void 0 ? _b : 0} results`;
|
|
41
|
+
letterLinkTemplate(letter) {
|
|
40
42
|
return html `
|
|
41
|
-
<
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
<a
|
|
44
|
+
href="#"
|
|
45
|
+
@click=${(e) => {
|
|
46
|
+
e.preventDefault();
|
|
45
47
|
this.letterClicked(letter);
|
|
46
48
|
}}
|
|
47
49
|
>
|
|
48
50
|
${letter}
|
|
49
|
-
</
|
|
51
|
+
</a>
|
|
50
52
|
`;
|
|
51
53
|
}
|
|
52
54
|
tooltipTemplate(letter) {
|
|
@@ -156,31 +158,25 @@ AlphaBar.styles = css `
|
|
|
156
158
|
border-radius: 4px;
|
|
157
159
|
}
|
|
158
160
|
|
|
159
|
-
li:hover:not(.selected)
|
|
161
|
+
li:hover:not(.selected) a {
|
|
160
162
|
background-color: #c0c0c0;
|
|
161
163
|
}
|
|
162
164
|
|
|
163
|
-
|
|
165
|
+
a,
|
|
166
|
+
span {
|
|
164
167
|
display: flex;
|
|
165
168
|
justify-content: center;
|
|
166
169
|
align-items: center;
|
|
167
170
|
aspect-ratio: 1 / 1;
|
|
168
171
|
}
|
|
169
172
|
|
|
170
|
-
|
|
171
|
-
width: 100%;
|
|
172
|
-
height: 100%;
|
|
173
|
+
a {
|
|
173
174
|
color: #333;
|
|
174
|
-
|
|
175
|
-
background: none;
|
|
176
|
-
border: none;
|
|
175
|
+
text-decoration: none;
|
|
177
176
|
border-radius: 4px;
|
|
178
|
-
font-family: inherit;
|
|
179
|
-
font-size: inherit;
|
|
180
|
-
cursor: pointer;
|
|
181
177
|
}
|
|
182
178
|
|
|
183
|
-
|
|
179
|
+
span {
|
|
184
180
|
color: #aaa;
|
|
185
181
|
cursor: default;
|
|
186
182
|
}
|
|
@@ -189,7 +185,7 @@ AlphaBar.styles = css `
|
|
|
189
185
|
background-color: #2c2c2c;
|
|
190
186
|
}
|
|
191
187
|
|
|
192
|
-
.selected
|
|
188
|
+
.selected a {
|
|
193
189
|
color: white;
|
|
194
190
|
}
|
|
195
191
|
|
|
@@ -198,7 +194,6 @@ AlphaBar.styles = css `
|
|
|
198
194
|
top: 100%;
|
|
199
195
|
left: -9999px;
|
|
200
196
|
margin-top: 3px;
|
|
201
|
-
z-index: 1;
|
|
202
197
|
|
|
203
198
|
opacity: 0;
|
|
204
199
|
transition: opacity 0.2s ease;
|
|
@@ -222,9 +217,6 @@ __decorate([
|
|
|
222
217
|
__decorate([
|
|
223
218
|
property({ type: Object })
|
|
224
219
|
], AlphaBar.prototype, "letterCounts", void 0);
|
|
225
|
-
__decorate([
|
|
226
|
-
property({ type: String })
|
|
227
|
-
], AlphaBar.prototype, "ariaLandmarkLabel", void 0);
|
|
228
220
|
__decorate([
|
|
229
221
|
state()
|
|
230
222
|
], AlphaBar.prototype, "tooltipShown", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha-bar.js","sourceRoot":"","sources":["../../../src/sort-filter-bar/alpha-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css, nothing, TemplateResult } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport type { PrefixFilterCounts } from '../models';\n\nimport './alpha-bar-tooltip';\nimport type { AlphaBarTooltip } from './alpha-bar-tooltip';\n\n@customElement('alpha-bar')\nexport class AlphaBar extends LitElement {\n @property({ type: String }) selectedLetter: string | null = null;\n\n @property({ type: Object }) letterCounts?: PrefixFilterCounts;\n\n @property({ type: String }) ariaLandmarkLabel?: string;\n\n @state()\n private tooltipShown: boolean = false;\n\n @state()\n private hoveredLetter?: string;\n\n @query('alpha-bar-tooltip')\n private tooltip?: AlphaBarTooltip;\n\n private readonly alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');\n\n private get selectedUppercaseLetter(): string | undefined {\n return this.selectedLetter?.toUpperCase();\n }\n\n render() {\n return html`\n <section id=\"container\" aria-label=${this.ariaLandmarkLabel ?? nothing}>\n <ul>\n ${this.alphabet.map(\n letter =>\n html`\n <li\n class=${letter === this.selectedUppercaseLetter\n ? 'selected'\n : nothing}\n @mousemove=${this.handleMouseMove}\n @mouseleave=${this.handleMouseLeave}\n >\n ${this.letterButtonTemplate(letter)}\n ${this.tooltipTemplate(letter)}\n </li>\n `\n )}\n </ul>\n </section>\n `;\n }\n\n private letterButtonTemplate(letter: string) {\n const ariaLabel = `${letter}: ${this.letterCounts?.[letter] ?? 0} results`;\n return html`\n <button\n aria-label=${ariaLabel}\n ?disabled=${!this.letterCounts?.[letter]}\n @click=${() => {\n this.letterClicked(letter);\n }}\n >\n ${letter}\n </button>\n `;\n }\n\n private tooltipTemplate(letter: string): TemplateResult | typeof nothing {\n if (this.hoveredLetter !== letter) return nothing;\n\n return this.tooltipShown\n ? html`<alpha-bar-tooltip\n data-letter=${letter}\n .numResults=${this.letterCounts?.[this.hoveredLetter] ?? 0}\n ></alpha-bar-tooltip>`\n : nothing;\n }\n\n private letterClicked(letter: string) {\n if (letter === this.selectedUppercaseLetter) {\n this.selectedLetter = null;\n } else {\n this.selectedLetter = letter;\n }\n this.dispatchEvent(\n new CustomEvent('letterChanged', {\n detail: { selectedLetter: this.selectedUppercaseLetter },\n })\n );\n }\n\n private async handleMouseMove(e: MouseEvent) {\n const target = e.target as HTMLLIElement;\n if (target && !this.tooltipShown) {\n const targetLetter = target.textContent?.trim() ?? undefined;\n this.tooltipShown = true;\n this.hoveredLetter = targetLetter;\n\n await this.updateComplete;\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n if (this.tooltip && this.tooltip.dataset.letter === targetLetter) {\n this.positionTooltip(target);\n }\n }\n }\n\n private handleMouseLeave() {\n this.tooltipShown = false;\n this.hoveredLetter = undefined;\n }\n\n private positionTooltip(targetElmt: HTMLElement) {\n if (!this.tooltip) return;\n\n // Basic positioning is just to center the whole tooltip on the letter box.\n const tooltipWidth = this.tooltip.clientWidth;\n const letterWidth = targetElmt.clientWidth;\n let left = letterWidth / 2 - tooltipWidth / 2;\n\n // But we also need to ensure the tooltip doesn't flow outside the viewport.\n // First, calculate the full width of the document body, including margins\n // (but not including any scrollbar).\n const bodyStyle = getComputedStyle(document.body);\n const bodyMarginLeft = parseFloat(\n bodyStyle.getPropertyValue('margin-left')\n );\n const bodyMarginRight = parseFloat(\n bodyStyle.getPropertyValue('margin-right')\n );\n const bodyWidthWithMargin =\n document.body.clientWidth + bodyMarginLeft + bodyMarginRight;\n\n // Calculate the positions of the tooltip's left/right edges, and determine\n // how much they overflow the viewport by (if at all).\n const targetRect = targetElmt.getBoundingClientRect();\n const tooltipLeft = targetRect.left + left;\n const tooltipRight = tooltipLeft + tooltipWidth;\n const offset = 1; // How many pixels the tooltip must be offset from the left/right edges\n let overflowAmt;\n if (tooltipLeft < offset) {\n // Tooltip overflows left edge of viewport\n overflowAmt = tooltipLeft - offset;\n } else if (tooltipRight > bodyWidthWithMargin - offset) {\n // Tooltip overflows right edge of viewport\n overflowAmt = tooltipRight - bodyWidthWithMargin + offset;\n }\n\n // Apply any needed adjustment to the tooltip and its arrow to keep it in the viewport\n if (overflowAmt) {\n left -= overflowAmt;\n this.tooltip.style.setProperty(\n '--tooltipArrowOffset',\n `${overflowAmt}px`\n );\n }\n\n this.tooltip.style.left = `${left}px`;\n this.tooltip.classList.add('fade-in');\n }\n\n static styles = css`\n h1 {\n font-size: 1.2rem;\n }\n\n #container {\n background-color: #ddd;\n color: #333;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5);\n }\n\n ul {\n list-style: none;\n display: flex;\n margin: 0;\n padding: 0.5rem 1rem;\n justify-content: space-between;\n }\n\n ul li {\n position: relative;\n flex: 1;\n text-align: center;\n max-width: 2.5rem;\n border-radius: 4px;\n }\n\n li:hover:not(.selected) button:not(:disabled) {\n background-color: #c0c0c0;\n }\n\n button {\n display: flex;\n justify-content: center;\n align-items: center;\n aspect-ratio: 1 / 1;\n }\n\n button {\n width: 100%;\n height: 100%;\n color: #333;\n appearance: none;\n background: none;\n border: none;\n border-radius: 4px;\n font-family: inherit;\n font-size: inherit;\n cursor: pointer;\n }\n\n button:disabled {\n color: #aaa;\n cursor: default;\n }\n\n .selected {\n background-color: #2c2c2c;\n }\n\n .selected button {\n color: white;\n }\n\n alpha-bar-tooltip {\n position: absolute;\n top: 100%;\n left: -9999px;\n margin-top: 3px;\n z-index: 1;\n\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n alpha-bar-tooltip.fade-in {\n opacity: 1;\n }\n\n /* Make alphabet bar a 2-row container in small screen widths */\n @media screen and (max-width: 768px) {\n ul {\n display: grid;\n grid-template-columns: repeat(13, 1fr);\n }\n }\n `;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"alpha-bar.js","sourceRoot":"","sources":["../../../src/sort-filter-bar/alpha-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css, nothing, TemplateResult } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport type { PrefixFilterCounts } from '../models';\n\nimport './alpha-bar-tooltip';\nimport type { AlphaBarTooltip } from './alpha-bar-tooltip';\n\n@customElement('alpha-bar')\nexport class AlphaBar extends LitElement {\n @property({ type: String }) selectedLetter: string | null = null;\n\n @property({ type: Object }) letterCounts?: PrefixFilterCounts;\n\n @state()\n private tooltipShown: boolean = false;\n\n @state()\n private hoveredLetter?: string;\n\n @query('alpha-bar-tooltip')\n private tooltip?: AlphaBarTooltip;\n\n private readonly alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');\n\n private get selectedUppercaseLetter(): string | undefined {\n return this.selectedLetter?.toUpperCase();\n }\n\n render() {\n return html`\n <div id=\"container\">\n <ul>\n ${this.alphabet.map(\n letter =>\n html`\n <li\n class=${letter === this.selectedUppercaseLetter\n ? 'selected'\n : nothing}\n @mousemove=${this.handleMouseMove}\n @mouseleave=${this.handleMouseLeave}\n >\n ${this.letterCounts?.[letter]\n ? this.letterLinkTemplate(letter)\n : html`<span>${letter}</span>`}\n ${this.tooltipTemplate(letter)}\n </li>\n `\n )}\n </ul>\n </div>\n `;\n }\n\n private letterLinkTemplate(letter: string) {\n return html`\n <a\n href=\"#\"\n @click=${(e: Event) => {\n e.preventDefault();\n this.letterClicked(letter);\n }}\n >\n ${letter}\n </a>\n `;\n }\n\n private tooltipTemplate(letter: string): TemplateResult | typeof nothing {\n if (this.hoveredLetter !== letter) return nothing;\n\n return this.tooltipShown\n ? html`<alpha-bar-tooltip\n data-letter=${letter}\n .numResults=${this.letterCounts?.[this.hoveredLetter] ?? 0}\n ></alpha-bar-tooltip>`\n : nothing;\n }\n\n private letterClicked(letter: string) {\n if (letter === this.selectedUppercaseLetter) {\n this.selectedLetter = null;\n } else {\n this.selectedLetter = letter;\n }\n this.dispatchEvent(\n new CustomEvent('letterChanged', {\n detail: { selectedLetter: this.selectedUppercaseLetter },\n })\n );\n }\n\n private async handleMouseMove(e: MouseEvent) {\n const target = e.target as HTMLLIElement;\n if (target && !this.tooltipShown) {\n const targetLetter = target.textContent?.trim() ?? undefined;\n this.tooltipShown = true;\n this.hoveredLetter = targetLetter;\n\n await this.updateComplete;\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n if (this.tooltip && this.tooltip.dataset.letter === targetLetter) {\n this.positionTooltip(target);\n }\n }\n }\n\n private handleMouseLeave() {\n this.tooltipShown = false;\n this.hoveredLetter = undefined;\n }\n\n private positionTooltip(targetElmt: HTMLElement) {\n if (!this.tooltip) return;\n\n // Basic positioning is just to center the whole tooltip on the letter box.\n const tooltipWidth = this.tooltip.clientWidth;\n const letterWidth = targetElmt.clientWidth;\n let left = letterWidth / 2 - tooltipWidth / 2;\n\n // But we also need to ensure the tooltip doesn't flow outside the viewport.\n // First, calculate the full width of the document body, including margins\n // (but not including any scrollbar).\n const bodyStyle = getComputedStyle(document.body);\n const bodyMarginLeft = parseFloat(\n bodyStyle.getPropertyValue('margin-left')\n );\n const bodyMarginRight = parseFloat(\n bodyStyle.getPropertyValue('margin-right')\n );\n const bodyWidthWithMargin =\n document.body.clientWidth + bodyMarginLeft + bodyMarginRight;\n\n // Calculate the positions of the tooltip's left/right edges, and determine\n // how much they overflow the viewport by (if at all).\n const targetRect = targetElmt.getBoundingClientRect();\n const tooltipLeft = targetRect.left + left;\n const tooltipRight = tooltipLeft + tooltipWidth;\n const offset = 1; // How many pixels the tooltip must be offset from the left/right edges\n let overflowAmt;\n if (tooltipLeft < offset) {\n // Tooltip overflows left edge of viewport\n overflowAmt = tooltipLeft - offset;\n } else if (tooltipRight > bodyWidthWithMargin - offset) {\n // Tooltip overflows right edge of viewport\n overflowAmt = tooltipRight - bodyWidthWithMargin + offset;\n }\n\n // Apply any needed adjustment to the tooltip and its arrow to keep it in the viewport\n if (overflowAmt) {\n left -= overflowAmt;\n this.tooltip.style.setProperty(\n '--tooltipArrowOffset',\n `${overflowAmt}px`\n );\n }\n\n this.tooltip.style.left = `${left}px`;\n this.tooltip.classList.add('fade-in');\n }\n\n static styles = css`\n h1 {\n font-size: 1.2rem;\n }\n\n #container {\n background-color: #ddd;\n color: #333;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5);\n }\n\n ul {\n list-style: none;\n display: flex;\n margin: 0;\n padding: 0.5rem 1rem;\n justify-content: space-between;\n }\n\n ul li {\n position: relative;\n flex: 1;\n text-align: center;\n max-width: 2.5rem;\n border-radius: 4px;\n }\n\n li:hover:not(.selected) a {\n background-color: #c0c0c0;\n }\n\n a,\n span {\n display: flex;\n justify-content: center;\n align-items: center;\n aspect-ratio: 1 / 1;\n }\n\n a {\n color: #333;\n text-decoration: none;\n border-radius: 4px;\n }\n\n span {\n color: #aaa;\n cursor: default;\n }\n\n .selected {\n background-color: #2c2c2c;\n }\n\n .selected a {\n color: white;\n }\n\n alpha-bar-tooltip {\n position: absolute;\n top: 100%;\n left: -9999px;\n margin-top: 3px;\n\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n alpha-bar-tooltip.fade-in {\n opacity: 1;\n }\n\n /* Make alphabet bar a 2-row container in small screen widths */\n @media screen and (max-width: 768px) {\n ul {\n display: grid;\n grid-template-columns: repeat(13, 1fr);\n }\n }\n `;\n}\n"]}
|
|
@@ -185,6 +185,6 @@ export declare class SortFilterBar extends LitElement implements SharedResizeObs
|
|
|
185
185
|
private emitCreatorLetterChangedEvent;
|
|
186
186
|
private displayModeChanged;
|
|
187
187
|
private emitSortChangedEvent;
|
|
188
|
-
static
|
|
188
|
+
static styles: import("lit").CSSResult;
|
|
189
189
|
}
|
|
190
190
|
export {};
|