@internetarchive/collection-browser 2.12.1-alpha-webdev5427.4 → 2.12.1-alpha-webdev5427.6

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.
@@ -29,6 +29,7 @@ export declare class MoreFacetsContent extends LitElement {
29
29
  */
30
30
  selectedFacets?: SelectedFacets;
31
31
  sortedBy: AggregationSortType;
32
+ isTvSearch: boolean;
32
33
  modalManager?: ModalManagerInterface;
33
34
  searchService?: SearchServiceInterface;
34
35
  analyticsHandler?: AnalyticsManagerInterface;
@@ -3,7 +3,7 @@ import { css, html, LitElement, nothing, } from 'lit';
3
3
  import { customElement, property, state } from 'lit/decorators.js';
4
4
  import { AggregationSortType, } from '@internetarchive/search-service';
5
5
  import { msg } from '@lit/localize';
6
- import { facetTitles, suppressedCollections, valueFacetSort, defaultFacetSort, getDefaultSelectedFacets, } from '../models';
6
+ import { facetTitles, suppressedCollections, valueFacetSort, defaultFacetSort, getDefaultSelectedFacets, tvChannelFacetLabels, } from '../models';
7
7
  import '@internetarchive/ia-activity-indicator';
8
8
  import './more-facets-pagination';
9
9
  import './facets-template';
@@ -24,6 +24,7 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
24
24
  */
25
25
  this.facetsLoading = true;
26
26
  this.sortedBy = AggregationSortType.COUNT;
27
+ this.isTvSearch = false;
27
28
  /**
28
29
  * An object holding any changes the patron has made to their facet selections
29
30
  * within the modal dialog but which they have not yet applied. These are
@@ -178,6 +179,17 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
178
179
  bucketsWithCount[index] = { ...unappliedBucket };
179
180
  }
180
181
  }
182
+ // For TV creator facets, uppercase the display text
183
+ if (this.facetKey === 'creator' && this.isTvSearch) {
184
+ bucketsWithCount.forEach(b => {
185
+ var _a, _b;
186
+ b.displayText = (_b = ((_a = b.displayText) !== null && _a !== void 0 ? _a : b.key)) === null || _b === void 0 ? void 0 : _b.toLocaleUpperCase();
187
+ const channelLabel = tvChannelFacetLabels[b.displayText];
188
+ if (channelLabel && channelLabel !== b.displayText) {
189
+ b.extraNote = `(${channelLabel})`;
190
+ }
191
+ });
192
+ }
181
193
  facetGroup.buckets = bucketsWithCount;
182
194
  return facetGroup;
183
195
  }
@@ -496,6 +508,9 @@ __decorate([
496
508
  __decorate([
497
509
  property({ type: Number })
498
510
  ], MoreFacetsContent.prototype, "sortedBy", void 0);
511
+ __decorate([
512
+ property({ type: Boolean })
513
+ ], MoreFacetsContent.prototype, "isTvSearch", void 0);
499
514
  __decorate([
500
515
  property({ type: Object })
501
516
  ], MoreFacetsContent.prototype, "modalManager", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"more-facets-content.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-content.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n PropertyValues,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport {\n Aggregation,\n Bucket,\n SearchServiceInterface,\n SearchParams,\n SearchType,\n AggregationSortType,\n FilterMap,\n PageType,\n} from '@internetarchive/search-service';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport { msg } from '@lit/localize';\nimport {\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n FacetOption,\n facetTitles,\n suppressedCollections,\n valueFacetSort,\n defaultFacetSort,\n getDefaultSelectedFacets,\n FacetEventDetails,\n} from '../models';\nimport type {\n CollectionTitles,\n PageSpecifierParams,\n} from '../data-source/models';\nimport '@internetarchive/ia-activity-indicator';\nimport './more-facets-pagination';\nimport './facets-template';\nimport {\n analyticsActions,\n analyticsCategories,\n} from '../utils/analytics-events';\nimport './toggle-switch';\nimport { srOnlyStyle } from '../styles/sr-only';\nimport {\n mergeSelectedFacets,\n sortBucketsBySelectionState,\n updateSelectedFacetBucket,\n} from '../utils/facet-utils';\n\n@customElement('more-facets-content')\nexport class MoreFacetsContent extends LitElement {\n @property({ type: String }) facetKey?: FacetOption;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Number }) searchType?: SearchType;\n\n @property({ type: Object }) pageSpecifierParams?: PageSpecifierParams;\n\n @property({ type: Object })\n collectionTitles?: CollectionTitles;\n\n /**\n * Maximum number of facets to show per page within the modal.\n */\n @property({ type: Number }) facetsPerPage = 35;\n\n /**\n * Whether we are waiting for facet data to load.\n * We begin with this set to true so that we show an initial loading indicator.\n */\n @property({ type: Boolean }) facetsLoading = true;\n\n /**\n * The set of pre-existing facet selections (including both selected & negated facets).\n */\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Number }) sortedBy: AggregationSortType =\n AggregationSortType.COUNT;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n /**\n * The full set of aggregations received from the search service\n */\n @state() private aggregations?: Record<string, Aggregation>;\n\n /**\n * A FacetGroup storing the full set of facet buckets to be shown on the dialog.\n */\n @state() private facetGroup?: FacetGroup;\n\n /**\n * An object holding any changes the patron has made to their facet selections\n * within the modal dialog but which they have not yet applied. These are\n * eventually merged into the existing `selectedFacets` when the patron applies\n * their changes, or discarded if they cancel/close the dialog.\n */\n @state() private unappliedFacetChanges: SelectedFacets =\n getDefaultSelectedFacets();\n\n /**\n * Which page of facets we are showing.\n */\n @state() private pageNumber = 1;\n\n willUpdate(changed: PropertyValues): void {\n if (\n changed.has('aggregations') ||\n changed.has('facetsPerPage') ||\n changed.has('sortedBy') ||\n changed.has('selectedFacets') ||\n changed.has('unappliedFacetChanges')\n ) {\n // Convert the merged selected facets & aggregations into a facet group, and\n // store it for reuse across pages.\n this.facetGroup = this.mergedFacets;\n }\n }\n\n updated(changed: PropertyValues): void {\n // If any of the search properties change, it triggers a facet fetch\n if (\n changed.has('facetKey') ||\n changed.has('query') ||\n changed.has('searchType') ||\n changed.has('filterMap')\n ) {\n this.facetsLoading = true;\n this.pageNumber = 1;\n this.sortedBy = defaultFacetSort[this.facetKey as FacetOption];\n\n this.updateSpecificFacets();\n }\n }\n\n firstUpdated(): void {\n this.setupEscapeListeners();\n }\n\n /**\n * Close more facets modal on Escape click\n */\n private setupEscapeListeners() {\n if (this.modalManager) {\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.modalManager?.closeModal();\n }\n });\n } else {\n document.removeEventListener('keydown', () => {});\n }\n }\n\n /**\n * Whether facet requests are for the search_results page type (either defaulted or explicitly).\n */\n private get isSearchResultsPage(): boolean {\n // Default page type is search_results when none is specified, so we check\n // for undefined as well.\n const pageType: PageType | undefined = this.pageSpecifierParams?.pageType;\n return pageType === undefined || pageType === 'search_results';\n }\n\n /**\n * Get specific facets data from search-service API based of currently query params\n * - this.aggregations - hold result of search service and being used for further processing.\n */\n async updateSpecificFacets(): Promise<void> {\n if (!this.facetKey) return; // Can't fetch facets if we don't know what type of facets we need!\n\n const trimmedQuery = this.query?.trim();\n if (!trimmedQuery && this.isSearchResultsPage) return; // The search page _requires_ a query\n\n const aggregations = {\n simpleParams: [this.facetKey],\n };\n const aggregationsSize = 65535; // todo - do we want to have all the records at once?\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n filters: this.filterMap,\n aggregations,\n aggregationsSize,\n rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?\n };\n\n const results = await this.searchService?.search(params, this.searchType);\n this.aggregations = results?.success?.response.aggregations;\n this.facetsLoading = false;\n\n const collectionTitles = results?.success?.response?.collectionTitles;\n if (collectionTitles) {\n for (const [id, title] of Object.entries(collectionTitles)) {\n this.collectionTitles?.set(id, title);\n }\n }\n }\n\n /**\n * Handler for page number changes from the pagination widget.\n */\n private pageNumberClicked(e: CustomEvent<{ page: number }>) {\n const page = e?.detail?.page;\n if (page) {\n this.pageNumber = Number(page);\n }\n\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.moreFacetsPageChange,\n label: `${this.pageNumber}`,\n });\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup | undefined {\n if (!this.facetKey || !this.selectedFacets) return undefined;\n\n const { selectedFacetGroup, aggregationFacetGroup } = this;\n\n // If we don't have any aggregations, then there is nothing to show yet\n if (!aggregationFacetGroup) return undefined;\n\n // Start with either the selected group if we have one, or the aggregate group otherwise\n const facetGroup = { ...(selectedFacetGroup ?? aggregationFacetGroup) };\n\n // Attach the counts to the selected buckets\n const bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregationFacetGroup.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 // Sort the buckets by selection state\n // We do this *prior* to considering unapplied selections, because we want the facets\n // to remain in position when they are selected/unselected, rather than re-sort themselves.\n sortBucketsBySelectionState(bucketsWithCount, this.sortedBy);\n\n // Append any additional buckets that were not selected\n aggregationFacetGroup.buckets.forEach(bucket => {\n const existingBucket = selectedFacetGroup?.buckets.find(\n b => b.key === bucket.key,\n );\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n\n // Apply any unapplied selections that appear on this page\n const unappliedBuckets = this.unappliedFacetChanges[this.facetKey];\n for (const [index, bucket] of bucketsWithCount.entries()) {\n const unappliedBucket = unappliedBuckets?.[bucket.key];\n if (unappliedBucket) {\n bucketsWithCount[index] = { ...unappliedBucket };\n }\n }\n facetGroup.buckets = bucketsWithCount;\n\n return facetGroup;\n }\n\n /**\n * Converts the selected facets for the current facet key to a `FacetGroup`,\n * which is easier to work with.\n */\n private get selectedFacetGroup(): FacetGroup | undefined {\n if (!this.selectedFacets || !this.facetKey) return undefined;\n\n const selectedFacetsForKey = this.selectedFacets[this.facetKey];\n if (!selectedFacetsForKey) return undefined;\n\n const facetGroupTitle = facetTitles[this.facetKey];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacetsForKey).map(\n ([value, data]) => {\n const displayText: string = value;\n return {\n displayText,\n key: value,\n count: data?.count,\n state: data?.state,\n };\n },\n );\n\n return {\n title: facetGroupTitle,\n key: this.facetKey,\n buckets,\n };\n }\n\n /**\n * Converts the raw `aggregations` for the current facet key to a `FacetGroup`,\n * which is easier to work with.\n */\n private get aggregationFacetGroup(): FacetGroup | undefined {\n if (!this.aggregations || !this.facetKey) return undefined;\n\n const currentAggregation = this.aggregations[this.facetKey];\n if (!currentAggregation) return undefined;\n\n const facetGroupTitle = facetTitles[this.facetKey];\n\n // Order the facets according to the current sort option\n let sortedBuckets = currentAggregation.getSortedBuckets(\n this.sortedBy,\n ) as Bucket[];\n\n if (this.facetKey === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n sortedBuckets = sortedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n }\n\n // Construct the array of facet buckets from the aggregation buckets\n const facetBuckets: FacetBucket[] = sortedBuckets.map(bucket => {\n const bucketKeyStr = `${bucket.key}`;\n return {\n displayText: `${bucketKeyStr}`,\n key: `${bucketKeyStr}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n\n return {\n title: facetGroupTitle,\n key: this.facetKey,\n buckets: facetBuckets,\n };\n }\n\n /**\n * Returns a FacetGroup representing only the current page of facet buckets to show.\n */\n private get facetGroupForCurrentPage(): FacetGroup | undefined {\n const { facetGroup } = this;\n if (!facetGroup) return undefined;\n\n // Slice out only the current page of facet buckets\n const firstBucketIndexOnPage = (this.pageNumber - 1) * this.facetsPerPage;\n const truncatedBuckets = facetGroup.buckets.slice(\n firstBucketIndexOnPage,\n firstBucketIndexOnPage + this.facetsPerPage,\n );\n\n return {\n ...facetGroup,\n buckets: truncatedBuckets,\n };\n }\n\n private get moreFacetsTemplate(): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${this.facetGroupForCurrentPage}\n .selectedFacets=${this.selectedFacets}\n .collectionTitles=${this.collectionTitles}\n @facetClick=${(e: CustomEvent<FacetEventDetails>) => {\n if (this.facetKey) {\n this.unappliedFacetChanges = updateSelectedFacetBucket(\n this.unappliedFacetChanges,\n this.facetKey,\n e.detail.bucket,\n );\n }\n }}\n ></facets-template>\n `;\n }\n\n private get loaderTemplate(): TemplateResult {\n return html`<div class=\"facets-loader\">\n <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>\n </div> `;\n }\n\n /**\n * How many pages of facets to show in the modal pagination widget\n */\n private get paginationSize(): number {\n if (!this.aggregations || !this.facetKey) return 0;\n\n // Calculate the appropriate number of pages to show in the modal pagination widget\n const length = this.aggregations[this.facetKey]?.buckets.length;\n return Math.ceil(length / this.facetsPerPage);\n }\n\n // render pagination if more then 1 page\n private get facetsPaginationTemplate() {\n return this.paginationSize > 1\n ? html`<more-facets-pagination\n .size=${this.paginationSize}\n .currentPage=${1}\n @pageNumberClicked=${this.pageNumberClicked}\n ></more-facets-pagination>`\n : nothing;\n }\n\n private get footerTemplate() {\n if (this.paginationSize > 0) {\n return html`${this.facetsPaginationTemplate}\n <div class=\"footer\">\n <button\n class=\"btn btn-cancel\"\n type=\"button\"\n @click=${this.cancelClick}\n >\n Cancel\n </button>\n <button\n class=\"btn btn-submit\"\n type=\"button\"\n @click=${this.applySearchFacetsClicked}\n >\n Apply filters\n </button>\n </div> `;\n }\n\n return nothing;\n }\n\n private sortFacetAggregation(facetSortType: AggregationSortType) {\n this.sortedBy = facetSortType;\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy }),\n );\n }\n\n private get modalHeaderTemplate(): TemplateResult {\n const facetSort =\n this.sortedBy ?? defaultFacetSort[this.facetKey as FacetOption];\n const defaultSwitchSide =\n facetSort === AggregationSortType.COUNT ? 'left' : 'right';\n\n return html`<span class=\"sr-only\">${msg('More facets for:')}</span>\n <span class=\"title\">\n ${this.facetGroup?.title}\n\n <label class=\"sort-label\">${msg('Sort by:')}</label>\n ${this.facetKey\n ? html`<toggle-switch\n class=\"sort-toggle\"\n leftValue=${AggregationSortType.COUNT}\n leftLabel=\"Count\"\n rightValue=${valueFacetSort[this.facetKey]}\n .rightLabel=${this.facetGroup?.title}\n side=${defaultSwitchSide}\n @change=${(e: CustomEvent<string>) => {\n this.sortFacetAggregation(\n Number(e.detail) as AggregationSortType,\n );\n }}\n ></toggle-switch>`\n : nothing}\n </span>`;\n }\n\n render() {\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <section id=\"more-facets\">\n <div class=\"header-content\">${this.modalHeaderTemplate}</div>\n <div class=\"facets-content\">${this.moreFacetsTemplate}</div>\n ${this.footerTemplate}\n </section>\n `}\n `;\n }\n\n private applySearchFacetsClicked() {\n const mergedSelections = mergeSelectedFacets(\n this.selectedFacets,\n this.unappliedFacetChanges,\n );\n\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: mergedSelections,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n\n // Reset the unapplied changes back to default, now that they have been applied\n this.unappliedFacetChanges = getDefaultSelectedFacets();\n\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: `${analyticsActions.applyMoreFacetsModal}`,\n label: `${this.facetKey}`,\n });\n }\n\n private cancelClick() {\n // Reset the unapplied changes back to default\n this.unappliedFacetChanges = getDefaultSelectedFacets();\n\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.closeMoreFacetsModal,\n label: `${this.facetKey}`,\n });\n }\n\n static get styles(): CSSResultGroup {\n const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;\n\n return [\n srOnlyStyle,\n css`\n section#more-facets {\n overflow: auto;\n padding: 10px; /* leaves room for scroll bar to appear without overlaying on content */\n --facetsColumnCount: 3;\n }\n .header-content .title {\n display: block;\n text-align: left;\n font-size: 1.8rem;\n padding: 0 10px;\n font-weight: bold;\n }\n\n .sort-label {\n margin-left: 20px;\n font-size: 1.3rem;\n }\n\n .sort-toggle {\n font-weight: normal;\n }\n\n .facets-content {\n font-size: 1.2rem;\n max-height: 300px;\n overflow: auto;\n padding: 10px;\n }\n .facets-loader {\n margin-bottom: 20px;\n width: 70px;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n .btn {\n border: none;\n padding: 10px;\n margin-bottom: 10px;\n width: auto;\n border-radius: 4px;\n cursor: pointer;\n }\n .btn-cancel {\n background-color: #2c2c2c;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n .footer {\n text-align: center;\n margin-top: 10px;\n }\n\n @media (max-width: 560px) {\n section#more-facets {\n max-height: 450px;\n --facetsColumnCount: 1;\n }\n .facets-content {\n overflow-y: auto;\n height: 300px;\n }\n }\n `,\n ];\n }\n}\n"]}
1
+ {"version":3,"file":"more-facets-content.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-content.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n PropertyValues,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport {\n Aggregation,\n Bucket,\n SearchServiceInterface,\n SearchParams,\n SearchType,\n AggregationSortType,\n FilterMap,\n PageType,\n} from '@internetarchive/search-service';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport { msg } from '@lit/localize';\nimport {\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n FacetOption,\n facetTitles,\n suppressedCollections,\n valueFacetSort,\n defaultFacetSort,\n getDefaultSelectedFacets,\n FacetEventDetails,\n tvChannelFacetLabels,\n} from '../models';\nimport type {\n CollectionTitles,\n PageSpecifierParams,\n} from '../data-source/models';\nimport '@internetarchive/ia-activity-indicator';\nimport './more-facets-pagination';\nimport './facets-template';\nimport {\n analyticsActions,\n analyticsCategories,\n} from '../utils/analytics-events';\nimport './toggle-switch';\nimport { srOnlyStyle } from '../styles/sr-only';\nimport {\n mergeSelectedFacets,\n sortBucketsBySelectionState,\n updateSelectedFacetBucket,\n} from '../utils/facet-utils';\n\n@customElement('more-facets-content')\nexport class MoreFacetsContent extends LitElement {\n @property({ type: String }) facetKey?: FacetOption;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Number }) searchType?: SearchType;\n\n @property({ type: Object }) pageSpecifierParams?: PageSpecifierParams;\n\n @property({ type: Object })\n collectionTitles?: CollectionTitles;\n\n /**\n * Maximum number of facets to show per page within the modal.\n */\n @property({ type: Number }) facetsPerPage = 35;\n\n /**\n * Whether we are waiting for facet data to load.\n * We begin with this set to true so that we show an initial loading indicator.\n */\n @property({ type: Boolean }) facetsLoading = true;\n\n /**\n * The set of pre-existing facet selections (including both selected & negated facets).\n */\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Number }) sortedBy: AggregationSortType =\n AggregationSortType.COUNT;\n\n @property({ type: Boolean }) isTvSearch = false;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n /**\n * The full set of aggregations received from the search service\n */\n @state() private aggregations?: Record<string, Aggregation>;\n\n /**\n * A FacetGroup storing the full set of facet buckets to be shown on the dialog.\n */\n @state() private facetGroup?: FacetGroup;\n\n /**\n * An object holding any changes the patron has made to their facet selections\n * within the modal dialog but which they have not yet applied. These are\n * eventually merged into the existing `selectedFacets` when the patron applies\n * their changes, or discarded if they cancel/close the dialog.\n */\n @state() private unappliedFacetChanges: SelectedFacets =\n getDefaultSelectedFacets();\n\n /**\n * Which page of facets we are showing.\n */\n @state() private pageNumber = 1;\n\n willUpdate(changed: PropertyValues): void {\n if (\n changed.has('aggregations') ||\n changed.has('facetsPerPage') ||\n changed.has('sortedBy') ||\n changed.has('selectedFacets') ||\n changed.has('unappliedFacetChanges')\n ) {\n // Convert the merged selected facets & aggregations into a facet group, and\n // store it for reuse across pages.\n this.facetGroup = this.mergedFacets;\n }\n }\n\n updated(changed: PropertyValues): void {\n // If any of the search properties change, it triggers a facet fetch\n if (\n changed.has('facetKey') ||\n changed.has('query') ||\n changed.has('searchType') ||\n changed.has('filterMap')\n ) {\n this.facetsLoading = true;\n this.pageNumber = 1;\n this.sortedBy = defaultFacetSort[this.facetKey as FacetOption];\n\n this.updateSpecificFacets();\n }\n }\n\n firstUpdated(): void {\n this.setupEscapeListeners();\n }\n\n /**\n * Close more facets modal on Escape click\n */\n private setupEscapeListeners() {\n if (this.modalManager) {\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.modalManager?.closeModal();\n }\n });\n } else {\n document.removeEventListener('keydown', () => {});\n }\n }\n\n /**\n * Whether facet requests are for the search_results page type (either defaulted or explicitly).\n */\n private get isSearchResultsPage(): boolean {\n // Default page type is search_results when none is specified, so we check\n // for undefined as well.\n const pageType: PageType | undefined = this.pageSpecifierParams?.pageType;\n return pageType === undefined || pageType === 'search_results';\n }\n\n /**\n * Get specific facets data from search-service API based of currently query params\n * - this.aggregations - hold result of search service and being used for further processing.\n */\n async updateSpecificFacets(): Promise<void> {\n if (!this.facetKey) return; // Can't fetch facets if we don't know what type of facets we need!\n\n const trimmedQuery = this.query?.trim();\n if (!trimmedQuery && this.isSearchResultsPage) return; // The search page _requires_ a query\n\n const aggregations = {\n simpleParams: [this.facetKey],\n };\n const aggregationsSize = 65535; // todo - do we want to have all the records at once?\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n filters: this.filterMap,\n aggregations,\n aggregationsSize,\n rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?\n };\n\n const results = await this.searchService?.search(params, this.searchType);\n this.aggregations = results?.success?.response.aggregations;\n this.facetsLoading = false;\n\n const collectionTitles = results?.success?.response?.collectionTitles;\n if (collectionTitles) {\n for (const [id, title] of Object.entries(collectionTitles)) {\n this.collectionTitles?.set(id, title);\n }\n }\n }\n\n /**\n * Handler for page number changes from the pagination widget.\n */\n private pageNumberClicked(e: CustomEvent<{ page: number }>) {\n const page = e?.detail?.page;\n if (page) {\n this.pageNumber = Number(page);\n }\n\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.moreFacetsPageChange,\n label: `${this.pageNumber}`,\n });\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup | undefined {\n if (!this.facetKey || !this.selectedFacets) return undefined;\n\n const { selectedFacetGroup, aggregationFacetGroup } = this;\n\n // If we don't have any aggregations, then there is nothing to show yet\n if (!aggregationFacetGroup) return undefined;\n\n // Start with either the selected group if we have one, or the aggregate group otherwise\n const facetGroup = { ...(selectedFacetGroup ?? aggregationFacetGroup) };\n\n // Attach the counts to the selected buckets\n const bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregationFacetGroup.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 // Sort the buckets by selection state\n // We do this *prior* to considering unapplied selections, because we want the facets\n // to remain in position when they are selected/unselected, rather than re-sort themselves.\n sortBucketsBySelectionState(bucketsWithCount, this.sortedBy);\n\n // Append any additional buckets that were not selected\n aggregationFacetGroup.buckets.forEach(bucket => {\n const existingBucket = selectedFacetGroup?.buckets.find(\n b => b.key === bucket.key,\n );\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n\n // Apply any unapplied selections that appear on this page\n const unappliedBuckets = this.unappliedFacetChanges[this.facetKey];\n for (const [index, bucket] of bucketsWithCount.entries()) {\n const unappliedBucket = unappliedBuckets?.[bucket.key];\n if (unappliedBucket) {\n bucketsWithCount[index] = { ...unappliedBucket };\n }\n }\n\n // For TV creator facets, uppercase the display text\n if (this.facetKey === 'creator' && this.isTvSearch) {\n bucketsWithCount.forEach(b => {\n b.displayText = (b.displayText ?? b.key)?.toLocaleUpperCase();\n\n const channelLabel = tvChannelFacetLabels[b.displayText];\n if (channelLabel && channelLabel !== b.displayText) {\n b.extraNote = `(${channelLabel})`;\n }\n });\n }\n\n facetGroup.buckets = bucketsWithCount;\n return facetGroup;\n }\n\n /**\n * Converts the selected facets for the current facet key to a `FacetGroup`,\n * which is easier to work with.\n */\n private get selectedFacetGroup(): FacetGroup | undefined {\n if (!this.selectedFacets || !this.facetKey) return undefined;\n\n const selectedFacetsForKey = this.selectedFacets[this.facetKey];\n if (!selectedFacetsForKey) return undefined;\n\n const facetGroupTitle = facetTitles[this.facetKey];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacetsForKey).map(\n ([value, data]) => {\n const displayText: string = value;\n return {\n displayText,\n key: value,\n count: data?.count,\n state: data?.state,\n };\n },\n );\n\n return {\n title: facetGroupTitle,\n key: this.facetKey,\n buckets,\n };\n }\n\n /**\n * Converts the raw `aggregations` for the current facet key to a `FacetGroup`,\n * which is easier to work with.\n */\n private get aggregationFacetGroup(): FacetGroup | undefined {\n if (!this.aggregations || !this.facetKey) return undefined;\n\n const currentAggregation = this.aggregations[this.facetKey];\n if (!currentAggregation) return undefined;\n\n const facetGroupTitle = facetTitles[this.facetKey];\n\n // Order the facets according to the current sort option\n let sortedBuckets = currentAggregation.getSortedBuckets(\n this.sortedBy,\n ) as Bucket[];\n\n if (this.facetKey === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n sortedBuckets = sortedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n }\n\n // Construct the array of facet buckets from the aggregation buckets\n const facetBuckets: FacetBucket[] = sortedBuckets.map(bucket => {\n const bucketKeyStr = `${bucket.key}`;\n return {\n displayText: `${bucketKeyStr}`,\n key: `${bucketKeyStr}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n\n return {\n title: facetGroupTitle,\n key: this.facetKey,\n buckets: facetBuckets,\n };\n }\n\n /**\n * Returns a FacetGroup representing only the current page of facet buckets to show.\n */\n private get facetGroupForCurrentPage(): FacetGroup | undefined {\n const { facetGroup } = this;\n if (!facetGroup) return undefined;\n\n // Slice out only the current page of facet buckets\n const firstBucketIndexOnPage = (this.pageNumber - 1) * this.facetsPerPage;\n const truncatedBuckets = facetGroup.buckets.slice(\n firstBucketIndexOnPage,\n firstBucketIndexOnPage + this.facetsPerPage,\n );\n\n return {\n ...facetGroup,\n buckets: truncatedBuckets,\n };\n }\n\n private get moreFacetsTemplate(): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${this.facetGroupForCurrentPage}\n .selectedFacets=${this.selectedFacets}\n .collectionTitles=${this.collectionTitles}\n @facetClick=${(e: CustomEvent<FacetEventDetails>) => {\n if (this.facetKey) {\n this.unappliedFacetChanges = updateSelectedFacetBucket(\n this.unappliedFacetChanges,\n this.facetKey,\n e.detail.bucket,\n );\n }\n }}\n ></facets-template>\n `;\n }\n\n private get loaderTemplate(): TemplateResult {\n return html`<div class=\"facets-loader\">\n <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>\n </div> `;\n }\n\n /**\n * How many pages of facets to show in the modal pagination widget\n */\n private get paginationSize(): number {\n if (!this.aggregations || !this.facetKey) return 0;\n\n // Calculate the appropriate number of pages to show in the modal pagination widget\n const length = this.aggregations[this.facetKey]?.buckets.length;\n return Math.ceil(length / this.facetsPerPage);\n }\n\n // render pagination if more then 1 page\n private get facetsPaginationTemplate() {\n return this.paginationSize > 1\n ? html`<more-facets-pagination\n .size=${this.paginationSize}\n .currentPage=${1}\n @pageNumberClicked=${this.pageNumberClicked}\n ></more-facets-pagination>`\n : nothing;\n }\n\n private get footerTemplate() {\n if (this.paginationSize > 0) {\n return html`${this.facetsPaginationTemplate}\n <div class=\"footer\">\n <button\n class=\"btn btn-cancel\"\n type=\"button\"\n @click=${this.cancelClick}\n >\n Cancel\n </button>\n <button\n class=\"btn btn-submit\"\n type=\"button\"\n @click=${this.applySearchFacetsClicked}\n >\n Apply filters\n </button>\n </div> `;\n }\n\n return nothing;\n }\n\n private sortFacetAggregation(facetSortType: AggregationSortType) {\n this.sortedBy = facetSortType;\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy }),\n );\n }\n\n private get modalHeaderTemplate(): TemplateResult {\n const facetSort =\n this.sortedBy ?? defaultFacetSort[this.facetKey as FacetOption];\n const defaultSwitchSide =\n facetSort === AggregationSortType.COUNT ? 'left' : 'right';\n\n return html`<span class=\"sr-only\">${msg('More facets for:')}</span>\n <span class=\"title\">\n ${this.facetGroup?.title}\n\n <label class=\"sort-label\">${msg('Sort by:')}</label>\n ${this.facetKey\n ? html`<toggle-switch\n class=\"sort-toggle\"\n leftValue=${AggregationSortType.COUNT}\n leftLabel=\"Count\"\n rightValue=${valueFacetSort[this.facetKey]}\n .rightLabel=${this.facetGroup?.title}\n side=${defaultSwitchSide}\n @change=${(e: CustomEvent<string>) => {\n this.sortFacetAggregation(\n Number(e.detail) as AggregationSortType,\n );\n }}\n ></toggle-switch>`\n : nothing}\n </span>`;\n }\n\n render() {\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <section id=\"more-facets\">\n <div class=\"header-content\">${this.modalHeaderTemplate}</div>\n <div class=\"facets-content\">${this.moreFacetsTemplate}</div>\n ${this.footerTemplate}\n </section>\n `}\n `;\n }\n\n private applySearchFacetsClicked() {\n const mergedSelections = mergeSelectedFacets(\n this.selectedFacets,\n this.unappliedFacetChanges,\n );\n\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: mergedSelections,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n\n // Reset the unapplied changes back to default, now that they have been applied\n this.unappliedFacetChanges = getDefaultSelectedFacets();\n\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: `${analyticsActions.applyMoreFacetsModal}`,\n label: `${this.facetKey}`,\n });\n }\n\n private cancelClick() {\n // Reset the unapplied changes back to default\n this.unappliedFacetChanges = getDefaultSelectedFacets();\n\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.closeMoreFacetsModal,\n label: `${this.facetKey}`,\n });\n }\n\n static get styles(): CSSResultGroup {\n const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;\n\n return [\n srOnlyStyle,\n css`\n section#more-facets {\n overflow: auto;\n padding: 10px; /* leaves room for scroll bar to appear without overlaying on content */\n --facetsColumnCount: 3;\n }\n .header-content .title {\n display: block;\n text-align: left;\n font-size: 1.8rem;\n padding: 0 10px;\n font-weight: bold;\n }\n\n .sort-label {\n margin-left: 20px;\n font-size: 1.3rem;\n }\n\n .sort-toggle {\n font-weight: normal;\n }\n\n .facets-content {\n font-size: 1.2rem;\n max-height: 300px;\n overflow: auto;\n padding: 10px;\n }\n .facets-loader {\n margin-bottom: 20px;\n width: 70px;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n .btn {\n border: none;\n padding: 10px;\n margin-bottom: 10px;\n width: auto;\n border-radius: 4px;\n cursor: pointer;\n }\n .btn-cancel {\n background-color: #2c2c2c;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n .footer {\n text-align: center;\n margin-top: 10px;\n }\n\n @media (max-width: 560px) {\n section#more-facets {\n max-height: 450px;\n --facetsColumnCount: 1;\n }\n .facets-content {\n overflow-y: auto;\n height: 300px;\n }\n }\n `,\n ];\n }\n}\n"]}
@@ -304,7 +304,7 @@ let CollectionFacets = class CollectionFacets extends LitElement {
304
304
  bucketsWithCount = bucketsWithCount.filter(bucket => lendingFacetKeysVisibility[bucket.key]);
305
305
  }
306
306
  // Sort the FacetBuckets so that selected and hidden buckets come before the rest
307
- sortBucketsBySelectionState(bucketsWithCount);
307
+ sortBucketsBySelectionState(bucketsWithCount, defaultFacetSort[facetKey]);
308
308
  // For mediatype facets, ensure the collection bucket is always shown if present
309
309
  if (facetKey === 'mediatype') {
310
310
  const collectionIndex = bucketsWithCount.findIndex(bucket => bucket.key === 'collection');
@@ -525,6 +525,7 @@ let CollectionFacets = class CollectionFacets extends LitElement {
525
525
  .collectionTitles=${this.collectionTitles}
526
526
  .selectedFacets=${this.selectedFacets}
527
527
  .sortedBy=${sortedBy}
528
+ .isTvSearch=${this.isTvSearch}
528
529
  @facetsChanged=${(e) => {
529
530
  const event = new CustomEvent('facetsChanged', {
530
531
  detail: e.detail,
@@ -1 +1 @@
1
- {"version":3,"file":"collection-facets.js","sourceRoot":"","sources":["../../src/collection-facets.ts"],"names":[],"mappings":"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","sourcesContent":["import {\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 { ref } from 'lit/directives/ref.js';\nimport { msg } from '@lit/localize';\nimport { classMap } from 'lit/directives/class-map.js';\nimport {\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 {\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 expandIcon from './assets/img/icons/expand';\nimport {\n FacetOption,\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n defaultFacetDisplayOrder,\n facetTitles,\n lendingFacetDisplayNames,\n lendingFacetKeysVisibility,\n LendingFacetKey,\n suppressedCollections,\n defaultFacetSort,\n FacetEventDetails,\n tvChannelFacetLabels,\n} from './models';\nimport type {\n CollectionTitles,\n PageSpecifierParams,\n} from './data-source/models';\nimport './collection-facets/more-facets-content';\nimport './collection-facets/facets-template';\nimport './collection-facets/facet-tombstone-row';\nimport './expanded-date-picker';\nimport {\n analyticsActions,\n analyticsCategories,\n} from './utils/analytics-events';\nimport { srOnlyStyle } from './styles/sr-only';\nimport { ExpandedDatePicker } from './expanded-date-picker';\nimport {\n sortBucketsBySelectionState,\n updateSelectedFacetBucket,\n} from './utils/facet-utils';\n\n@customElement('collection-facets')\nexport class CollectionFacets extends LitElement {\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: Number }) 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: Number }) contentWidth?: number;\n\n @property({ type: Boolean }) showHistogramDatePicker = false;\n\n @property({ type: Boolean }) allowExpandingDatePicker = false;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) pageSpecifierParams?: PageSpecifierParams;\n\n @property({ type: Array }) parentCollections: string[] = [];\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: String }) collectionPagePath: string = '/details/';\n\n @property({ type: Boolean }) isManageView = false;\n\n @property({ type: Boolean }) isTvSearch = false;\n\n @property({ type: Array }) facetDisplayOrder: FacetOption[] =\n defaultFacetDisplayOrder;\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 collectionTitles?: CollectionTitles;\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 program: false,\n person: false,\n sponsor: false,\n };\n\n /**\n * Maximum # of facet buckets to render per facet group\n */\n private allowedFacetCount = 6;\n\n render() {\n const containerClasses = classMap({\n loading: this.facetsLoading,\n managing: this.isManageView,\n });\n\n // Added data-testid for Playwright testing\n // Using facet-group class and aria-labels is not ideal for Playwright locator\n const datePickerLabelId = 'date-picker-label';\n return html`\n <div id=\"container\" class=${containerClasses}>\n ${this.showHistogramDatePicker &&\n (this.fullYearsHistogramAggregation || this.fullYearAggregationLoading)\n ? html`\n <section\n class=\"facet-group\"\n aria-labelledby=${datePickerLabelId}\n data-testid=\"facet-group-header-label-date-picker\"\n >\n <h3 id=${datePickerLabelId}>\n Year Published <span class=\"sr-only\">range filter</span>\n ${this.expandDatePickerBtnTemplate}\n </h3>\n ${this.histogramTemplate}\n </section>\n `\n : nothing}\n ${this.collectionPartOfTemplate}\n ${this.mergedFacets.map(facetGroup =>\n this.getFacetGroupTemplate(facetGroup),\n )}\n </div>\n `;\n }\n\n private get collectionPartOfTemplate(): TemplateResult | typeof nothing {\n // We only display the \"Part Of\" section on collection pages\n if (!this.parentCollections?.length) return nothing;\n\n // Added data-testid for Playwright testing\n // Using className and aria-labels is not ideal for Playwright locator\n const headingId = 'partof-heading';\n return html`\n <section\n class=\"facet-group partof-collections\"\n aria-labelledby=${headingId}\n data-testid=\"facet-group-partof-collections\"\n >\n <div class=\"facet-group-header\">\n <h3 id=${headingId}>${msg('Part Of')}</h3>\n </div>\n <ul>\n ${map(this.parentCollections, collxn => {\n const collectionURL = `${this.baseNavigationUrl}${this.collectionPagePath}${collxn}`;\n\n return html` <li>\n <a\n href=${collectionURL}\n data-id=${collxn}\n @click=${this.partOfCollectionClicked}\n >\n ${this.collectionTitles?.get(collxn) ?? collxn}\n </a>\n </li>`;\n })}\n </ul>\n </section>\n `;\n }\n\n private partOfCollectionClicked(e: Event): void {\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.partOfCollectionClicked,\n label: (e.target as HTMLElement).dataset.id,\n });\n }\n\n /**\n * Opens a modal dialog containing an enlarged version of the date picker.\n */\n private showDatePickerModal(): void {\n const { fullYearsHistogramAggregation } = this;\n const minDate = fullYearsHistogramAggregation?.first_bucket_key;\n const maxDate = fullYearsHistogramAggregation?.last_bucket_key;\n const buckets = fullYearsHistogramAggregation?.buckets as number[];\n const dateFormat = this.isTvSearch ? 'YYYY-MM' : 'YYYY';\n\n // Because the modal manager does not clear its DOM content after being closed,\n // it may try to render the exact same date picker template when it is reopened.\n // And because it isn't actually a descendent of this collection-facets component,\n // changes to the template defined here may not trigger a reactive update to the date\n // picker, resulting in it displaying a stale date range.\n // This ref callback ensures that every time the date picker modal is opened, it will\n // always propagate the most recent date range into the date picker regardless of\n // whether Lit thinks the update is necessary.\n const expandedDatePickerChanged = (elmt?: Element) => {\n if (elmt && elmt instanceof ExpandedDatePicker) {\n const expandedDatePicker = elmt as ExpandedDatePicker;\n expandedDatePicker.minSelectedDate = this.minSelectedDate;\n expandedDatePicker.maxSelectedDate = this.maxSelectedDate;\n }\n };\n\n const customModalContent = html`\n <expanded-date-picker\n ${ref(expandedDatePickerChanged)}\n .minDate=${minDate}\n .maxDate=${maxDate}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .dateFormat=${dateFormat}\n .buckets=${buckets}\n .modalManager=${this.modalManager}\n .analyticsHandler=${this.analyticsHandler}\n @histogramDateRangeApplied=${this.histogramDateRangeUpdated}\n @modalClosed=${this.handleExpandedDatePickerClosed}\n ></expanded-date-picker>\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`${msg('Select a date range')}`,\n });\n\n this.modalManager?.classList.add('expanded-date-picker');\n this.modalManager?.showModal({\n config,\n customModalContent,\n userClosedModalCallback: this.handleExpandedDatePickerClosed,\n });\n\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.histogramExpanded,\n label: window.location.href,\n });\n }\n\n private handleExpandedDatePickerClosed = (): void => {\n this.modalManager?.classList.remove('expanded-date-picker');\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 /**\n * Template for the \"Expand\" button to show the date picker modal, or\n * `nothing` if that button should currently not be shown.\n */\n private get expandDatePickerBtnTemplate(): TemplateResult | typeof nothing {\n return this.allowExpandingDatePicker && !this.facetsLoading\n ? html`<button\n class=\"expand-date-picker-btn\"\n aria-hidden=\"true\"\n @click=${this.showDatePickerModal}\n >\n ${expandIcon}\n </button>`\n : nothing;\n }\n\n private get histogramTemplate() {\n const { fullYearsHistogramAggregation } = this;\n const minDate = fullYearsHistogramAggregation?.first_bucket_key;\n const maxDate = fullYearsHistogramAggregation?.last_bucket_key;\n const dateFormat = this.isTvSearch ? 'YYYY-MM' : 'YYYY';\n return this.fullYearAggregationLoading\n ? html`<div class=\"histogram-loading-indicator\">&hellip;</div>` // Ellipsis block\n : html`\n <histogram-date-range\n class=${this.isTvSearch ? 'wide-inputs' : nothing}\n .minDate=${minDate}\n .maxDate=${maxDate}\n .minSelectedDate=${this.minSelectedDate ?? minDate}\n .maxSelectedDate=${this.maxSelectedDate ?? maxDate}\n .updateDelay=${100}\n .dateFormat=${dateFormat}\n missingDataMessage=\"...\"\n .width=${this.collapsableFacets && this.contentWidth\n ? this.contentWidth\n : 180}\n .bins=${fullYearsHistogramAggregation?.buckets as number[]}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n ></histogram-date-range>\n `;\n }\n\n /**\n * Dispatches a `histogramDateRangeUpdated` event with the date range copied from the\n * input event.\n *\n * Arrow function to ensure `this` is always bound to the current component.\n */\n private histogramDateRangeUpdated = (\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>,\n ): void => {\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 this.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 /**\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 // 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 // Sort the FacetBuckets so that selected and hidden buckets come before the rest\n sortBucketsBySelectionState(bucketsWithCount);\n\n // For mediatype facets, ensure the collection bucket is always shown if present\n if (facetKey === 'mediatype') {\n const collectionIndex = bucketsWithCount.findIndex(\n bucket => bucket.key === 'collection',\n );\n\n if (collectionIndex >= allowedFacetCount) {\n const [collectionBucket] = bucketsWithCount.splice(\n collectionIndex,\n 1,\n );\n\n // If we're showing lots of selected facets, ensure we're not cutting off the last one\n if (allowedFacetCount > this.allowedFacetCount) {\n allowedFacetCount += 1;\n }\n\n bucketsWithCount.splice(allowedFacetCount - 1, 0, collectionBucket);\n }\n }\n\n // For TV creator facets, uppercase the display text\n if (facetKey === 'creator' && this.isTvSearch) {\n bucketsWithCount.forEach(b => {\n b.displayText = (b.displayText ?? b.key)?.toLocaleUpperCase();\n\n const channelLabel = tvChannelFacetLabels[b.displayText];\n if (channelLabel && channelLabel !== b.displayText) {\n b.extraNote = `(${channelLabel})`;\n }\n });\n }\n\n // slice off how many items we want to show in page facet area\n facetGroup.buckets = bucketsWithCount.slice(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 // Added data-testid for Playwright testing\n // Using className and aria-labels is not ideal for Playwright locator\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 data-testid=${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\n class=\"facet-group-content ${isOpen ? 'open' : ''}\"\n data-testid=\"facet-group-content-${facetGroup.key}\"\n >\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 // Added data-testid for Playwright testing\n // Using the className is not ideal for Playwright locator\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 data-testid=\"more-link-btn\"\n >\n More...\n </button>`;\n }\n\n async showMoreFacetsModal(\n facetGroup: FacetGroup,\n sortedBy: AggregationSortType,\n ): Promise<void> {\n const customModalContent = html`\n <more-facets-content\n .analyticsHandler=${this.analyticsHandler}\n .facetKey=${facetGroup.key}\n .query=${this.query}\n .filterMap=${this.filterMap}\n .pageSpecifierParams=${this.pageSpecifierParams}\n .modalManager=${this.modalManager}\n .searchService=${this.searchService}\n .searchType=${this.searchType}\n .collectionTitles=${this.collectionTitles}\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 userClosedModalCallback: () => {\n this.modalManager?.classList.remove('more-search-facets');\n },\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 .collectionPagePath=${this.collectionPagePath}\n .facetGroup=${facetGroup}\n .selectedFacets=${this.selectedFacets}\n .collectionTitles=${this.collectionTitles}\n @facetClick=${(e: CustomEvent<FacetEventDetails>) => {\n this.selectedFacets = updateSelectedFacetBucket(\n this.selectedFacets,\n facetGroup.key,\n e.detail.bucket,\n true,\n );\n\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\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 a:link {\n text-decoration: none;\n color: var(--ia-theme-link-color, #4b64ff);\n }\n a:link:hover {\n text-decoration: underline;\n }\n\n #container.loading {\n opacity: 0.5;\n }\n\n #container.managing {\n opacity: 0.3;\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 .partof-collections ul {\n list-style-type: none;\n padding: 0;\n font-size: 1.2rem;\n }\n\n h3 {\n font-size: 1.4rem;\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 #date-picker-label {\n display: flex;\n justify-content: space-between;\n }\n\n .expand-date-picker-btn {\n margin: 0;\n padding: 0;\n border: 0;\n appearance: none;\n background: none;\n cursor: pointer;\n }\n\n .expand-date-picker-btn > svg {\n width: 14px;\n height: 14px;\n }\n\n .sorting-icon {\n height: 15px;\n cursor: pointer;\n }\n\n histogram-date-range.wide-inputs {\n --histogramDateRangeInputWidth: 4.8rem;\n }\n `,\n ];\n }\n}\n"]}
1
+ {"version":3,"file":"collection-facets.js","sourceRoot":"","sources":["../../src/collection-facets.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EACH,IAAI,EACJ,UAAU,EAEV,OAAO,GAER,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AASvD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,EACL,WAAW,GAEZ,MAAM,gCAAgC,CAAC;AAKxC,OAAO,WAAW,MAAM,4BAA4B,CAAC;AACrD,OAAO,UAAU,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAKL,wBAAwB,EACxB,WAAW,EACX,wBAAwB,EACxB,0BAA0B,EAE1B,qBAAqB,EACrB,gBAAgB,EAEhB,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAKlB,OAAO,yCAAyC,CAAC;AACjD,OAAO,qCAAqC,CAAC;AAC7C,OAAO,yCAAyC,CAAC;AACjD,OAAO,wBAAwB,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAGtB,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,UAAU;IAAzC;;QAawB,qBAAgB,GAAG,IAAI,CAAC;QAExB,kBAAa,GAAG,KAAK,CAAC;QAEtB,+BAA0B,GAAG,KAAK,CAAC;QAInC,sBAAiB,GAAG,KAAK,CAAC;QAI1B,4BAAuB,GAAG,KAAK,CAAC;QAEhC,6BAAwB,GAAG,KAAK,CAAC;QAMnC,sBAAiB,GAAa,EAAE,CAAC;QAMhC,uBAAkB,GAAW,WAAW,CAAC;QAExC,iBAAY,GAAG,KAAK,CAAC;QAErB,eAAU,GAAG,KAAK,CAAC;QAErB,sBAAiB,GAC1C,wBAAwB,CAAC;QAoBlB,eAAU,GAAiC;YAClD,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,KAAK;SACf,CAAC;QAEF;;WAEG;QACK,sBAAiB,GAAG,CAAC,CAAC;QAgJtB,mCAA8B,GAAG,GAAS,EAAE;;YAClD,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC9D,CAAC,CAAC;QA0DF;;;;;WAKG;QACK,8BAAyB,GAAG,CAClC,CAGE,EACI,EAAE;YACR,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,2BAA2B,EAAE;gBACzD,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;aAC7B,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC;IAygBJ,CAAC;IApuBC,MAAM;QACJ,MAAM,gBAAgB,GAAG,QAAQ,CAAC;YAChC,OAAO,EAAE,IAAI,CAAC,aAAa;YAC3B,QAAQ,EAAE,IAAI,CAAC,YAAY;SAC5B,CAAC,CAAC;QAEH,2CAA2C;QAC3C,8EAA8E;QAC9E,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;QAC9C,OAAO,IAAI,CAAA;kCACmB,gBAAgB;UACxC,IAAI,CAAC,uBAAuB;YAC9B,CAAC,IAAI,CAAC,6BAA6B,IAAI,IAAI,CAAC,0BAA0B,CAAC;YACrE,CAAC,CAAC,IAAI,CAAA;;;kCAGkB,iBAAiB;;;yBAG1B,iBAAiB;;oBAEtB,IAAI,CAAC,2BAA2B;;kBAElC,IAAI,CAAC,iBAAiB;;aAE3B;YACH,CAAC,CAAC,OAAO;UACT,IAAI,CAAC,wBAAwB;UAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CACnC,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CACvC;;KAEJ,CAAC;IACJ,CAAC;IAED,IAAY,wBAAwB;;QAClC,4DAA4D;QAC5D,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,iBAAiB,0CAAE,MAAM,CAAA;YAAE,OAAO,OAAO,CAAC;QAEpD,2CAA2C;QAC3C,sEAAsE;QACtE,MAAM,SAAS,GAAG,gBAAgB,CAAC;QACnC,OAAO,IAAI,CAAA;;;0BAGW,SAAS;;;;mBAIhB,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;;;YAGlC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,EAAE;;YACrC,MAAM,aAAa,GAAG,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,GAAG,MAAM,EAAE,CAAC;YAErF,OAAO,IAAI,CAAA;;uBAEA,aAAa;0BACV,MAAM;yBACP,IAAI,CAAC,uBAAuB;;kBAEnC,MAAA,MAAA,IAAI,CAAC,gBAAgB,0CAAE,GAAG,CAAC,MAAM,CAAC,mCAAI,MAAM;;kBAE5C,CAAC;QACT,CAAC,CAAC;;;KAGP,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAAC,CAAQ;;QACtC,MAAA,IAAI,CAAC,gBAAgB,0CAAE,SAAS,CAAC;YAC/B,QAAQ,EAAE,mBAAmB,CAAC,OAAO;YACrC,MAAM,EAAE,gBAAgB,CAAC,uBAAuB;YAChD,KAAK,EAAG,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAC,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,mBAAmB;;QACzB,MAAM,EAAE,6BAA6B,EAAE,GAAG,IAAI,CAAC;QAC/C,MAAM,OAAO,GAAG,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,gBAAgB,CAAC;QAChE,MAAM,OAAO,GAAG,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,eAAe,CAAC;QAC/D,MAAM,OAAO,GAAG,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,OAAmB,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAExD,+EAA+E;QAC/E,gFAAgF;QAChF,kFAAkF;QAClF,qFAAqF;QACrF,yDAAyD;QACzD,qFAAqF;QACrF,iFAAiF;QACjF,8CAA8C;QAC9C,MAAM,yBAAyB,GAAG,CAAC,IAAc,EAAE,EAAE;YACnD,IAAI,IAAI,IAAI,IAAI,YAAY,kBAAkB,EAAE,CAAC;gBAC/C,MAAM,kBAAkB,GAAG,IAA0B,CAAC;gBACtD,kBAAkB,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;gBAC1D,kBAAkB,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,IAAI,CAAA;;UAEzB,GAAG,CAAC,yBAAyB,CAAC;mBACrB,OAAO;mBACP,OAAO;2BACC,IAAI,CAAC,eAAe;2BACpB,IAAI,CAAC,eAAe;sBACzB,UAAU;mBACb,OAAO;wBACF,IAAI,CAAC,YAAY;4BACb,IAAI,CAAC,gBAAgB;qCACZ,IAAI,CAAC,yBAAyB;uBAC5C,IAAI,CAAC,8BAA8B;;KAErD,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;YAC7B,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,SAAS;YACtB,cAAc,EAAE,KAAK;YACrB,oBAAoB,EAAE,IAAI,EAAE,+BAA+B;YAC3D,KAAK,EAAE,IAAI,CAAA,GAAG,GAAG,CAAC,qBAAqB,CAAC,EAAE;SAC3C,CAAC,CAAC;QAEH,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACzD,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,CAAC;YAC3B,MAAM;YACN,kBAAkB;YAClB,uBAAuB,EAAE,IAAI,CAAC,8BAA8B;SAC7D,CAAC,CAAC;QAEH,MAAA,IAAI,CAAC,gBAAgB,0CAAE,SAAS,CAAC;YAC/B,QAAQ,EAAE,mBAAmB,CAAC,OAAO;YACrC,MAAM,EAAE,gBAAgB,CAAC,iBAAiB;YAC1C,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;SAC5B,CAAC,CAAC;IACL,CAAC;IAMD,OAAO,CAAC,OAAuB;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED,gCAAgC;IACxB,0BAA0B;QAChC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAiB,eAAe,EAAE;YAC7D,MAAM,EAAE,IAAI,CAAC,cAAc;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAY,2BAA2B;QACrC,OAAO,IAAI,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,aAAa;YACzD,CAAC,CAAC,IAAI,CAAA;;;mBAGO,IAAI,CAAC,mBAAmB;;YAE/B,UAAU;kBACJ;YACZ,CAAC,CAAC,OAAO,CAAC;IACd,CAAC;IAED,IAAY,iBAAiB;;QAC3B,MAAM,EAAE,6BAA6B,EAAE,GAAG,IAAI,CAAC;QAC/C,MAAM,OAAO,GAAG,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,gBAAgB,CAAC;QAChE,MAAM,OAAO,GAAG,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,eAAe,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,OAAO,IAAI,CAAC,0BAA0B;YACpC,CAAC,CAAC,IAAI,CAAA,yDAAyD,CAAC,iBAAiB;YACjF,CAAC,CAAC,IAAI,CAAA;;oBAEQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO;uBACtC,OAAO;uBACP,OAAO;+BACC,MAAA,IAAI,CAAC,eAAe,mCAAI,OAAO;+BAC/B,MAAA,IAAI,CAAC,eAAe,mCAAI,OAAO;2BACnC,GAAG;0BACJ,UAAU;;qBAEf,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,YAAY;gBAClD,CAAC,CAAC,IAAI,CAAC,YAAY;gBACnB,CAAC,CAAC,GAAG;oBACC,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,OAAmB;yCAC7B,IAAI,CAAC,yBAAyB;;SAE9D,CAAC;IACR,CAAC;IAqBD;;OAEG;IACH,IAAY,YAAY;QACtB,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;;YACxC,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACtD,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAChC,CAAC;YACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC1D,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAChC,CAAC;YAEF,iFAAiF;YACjF,IAAI,kBAAkB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC/C,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,wEAAwE;YACxE,IAAI,CAAC,mBAAmB;gBAAE,OAAO;YAEjC,8EAA8E;YAC9E,MAAM,UAAU,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,mBAAmB,CAAC;YAE7D,4CAA4C;YAC5C,IAAI,gBAAgB,GAClB,MAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBACvC,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CACrD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAC1B,CAAC;gBACF,OAAO,cAAc;oBACnB,CAAC,CAAC;wBACE,GAAG,MAAM;wBACT,KAAK,EAAE,cAAc,CAAC,KAAK;qBAC5B;oBACH,CAAC,CAAC,MAAM,CAAC;YACb,CAAC,CAAC,mCAAI,EAAE,CAAC;YAEX,uDAAuD;YACvD,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBAC3C,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxE,IAAI,cAAc;oBAAE,OAAO;gBAC3B,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH;;;;;eAKG;YACH,IAAI,iBAAiB,GAAG,MAAA,MAAM,CAAC,IAAI,CACjC,CAAC,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAc,KAAI,EAAE,CAC1C,0CAAE,MAAM,CAAC;YACV,IAAI,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC/C,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,8BAA8B;YAC5E,CAAC;YAED,gEAAgE;YAChE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CACxC,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,GAAsB,CAAC,CACpE,CAAC;YACJ,CAAC;YAED,iFAAiF;YACjF,2BAA2B,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE1E,gFAAgF;YAChF,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC7B,MAAM,eAAe,GAAG,gBAAgB,CAAC,SAAS,CAChD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,YAAY,CACtC,CAAC;gBAEF,IAAI,eAAe,IAAI,iBAAiB,EAAE,CAAC;oBACzC,MAAM,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAChD,eAAe,EACf,CAAC,CACF,CAAC;oBAEF,sFAAsF;oBACtF,IAAI,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBAC/C,iBAAiB,IAAI,CAAC,CAAC;oBACzB,CAAC;oBAED,gBAAgB,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAED,oDAAoD;YACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC9C,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;;oBAC3B,CAAC,CAAC,WAAW,GAAG,MAAA,CAAC,MAAA,CAAC,CAAC,WAAW,mCAAI,CAAC,CAAC,GAAG,CAAC,0CAAE,iBAAiB,EAAE,CAAC;oBAE9D,MAAM,YAAY,GAAG,oBAAoB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;oBACzD,IAAI,YAAY,IAAI,YAAY,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;wBACnD,CAAC,CAAC,SAAS,GAAG,IAAI,YAAY,GAAG,CAAC;oBACpC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,8DAA8D;YAC9D,UAAU,CAAC,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAElE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAY,mBAAmB;QAC7B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,WAAW,GAAiB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CACvE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,EAAE;YACxB,MAAM,MAAM,GAAG,GAAkB,CAAC;YAClC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAElC,MAAM,OAAO,GAAkB,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE;;gBACrB,IAAI,WAAW,GAAW,KAAK,CAAC;gBAChC,2DAA2D;gBAC3D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,WAAW;wBACT,MAAA,wBAAwB,CAAC,KAAwB,CAAC,mCAAI,KAAK,CAAC;gBAChE,CAAC;gBACD,OAAO;oBACL,WAAW;oBACX,GAAG,EAAE,KAAK;oBACV,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,KAAK,EAAE,SAAS,CAAC,KAAK;iBACvB,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,OAAO;gBACL,KAAK;gBACL,GAAG,EAAE,MAAM;gBACX,OAAO;aACR,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAY,sBAAsB;;QAChC,MAAM,WAAW,GAAiB,EAAE,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,MAAA,IAAI,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE;YACrE,4EAA4E;YAC5E,IAAI,GAAG,KAAK,gBAAgB;gBAAE,OAAO;YAErC,MAAM,MAAM,GAAG,GAAkB,CAAC;YAClC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,aAAa,GAAG,WAAW,CAAC,gBAAgB,CAC9C,gBAAgB,CAAC,MAAM,CAAC,CACb,CAAC;YAEd,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC5B,oFAAoF;gBACpF,aAAa,GAAG,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,CAAC,MAAM,CAAC,EAAE;;oBAC7C,MAAM,SAAS,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,0CAAE,QAAQ,EAAE,CAAC;oBAC1C,OAAO,CACL,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAC,MAAM,CAAC,CAAA,CACpE,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,YAAY,GAAkB,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;;gBAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC7B,IAAI,WAAW,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;gBAClC,kEAAkE;gBAClE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,WAAW;wBACT,MAAA,wBAAwB,CAAC,MAAM,CAAC,GAAsB,CAAC,mCACvD,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;gBACpB,CAAC;gBACD,OAAO;oBACL,WAAW;oBACX,GAAG,EAAE,GAAG,SAAS,EAAE;oBACnB,KAAK,EAAE,MAAM,CAAC,SAAS;oBACvB,KAAK,EAAE,MAAM;iBACd,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,KAAK,GAAe;gBACxB,KAAK;gBACL,GAAG,EAAE,MAAM;gBACX,OAAO,EAAE,YAAY;aACtB,CAAC;YACF,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACK,qBAAqB,CAC3B,UAAsB;QAEtB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAE3E,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAA;+BACK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,WAAW;KAC/D,CAAC;QAEF,MAAM,eAAe,GAAG,GAAG,EAAE;YAC3B,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7C,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC;QAClC,CAAC,CAAC;QAEF,2CAA2C;QAC3C,sEAAsE;QACtE,MAAM,QAAQ,GAAG,4BAA4B,UAAU,CAAC,GAAG,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAA;;6BAEc,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;0BACzC,QAAQ;sBACZ,QAAQ;;;;iBAIb,QAAQ;qBACJ,eAAe;qBACf,eAAe;;cAEtB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK;;;;;uCAKvC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;6CACd,UAAU,CAAC,GAAG;;YAE/C,IAAI,CAAC,aAAa;YAClB,CAAC,CAAC,IAAI,CAAC,8BAA8B,EAAE;YACvC,CAAC,CAAC,IAAI,CAAA;kBACA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;kBACjC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;eACxC;;;KAGV,CAAC;IACJ,CAAC;IAEO,8BAA8B;QACpC,6BAA6B;QAC7B,OAAO,IAAI,CAAA;QACP,GAAG,CACH,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EACnB,GAAG,EAAE,CAAC,IAAI,CAAA,6CAA6C,CACxD;KACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,oBAAoB,CAC1B,UAAsB;QAEtB,8CAA8C;QAC9C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,gDAAgD;QAChD,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,6EAA6E;QAC7E,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACpE,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,sEAAsE;QACtE,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAEnD,2CAA2C;QAC3C,0DAA0D;QAC1D,OAAO,IAAI,CAAA;;eAEA,GAAG,EAAE;;YACZ,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAChD,MAAA,IAAI,CAAC,gBAAgB,0CAAE,SAAS,CAAC;gBAC/B,QAAQ,EAAE,mBAAmB,CAAC,OAAO;gBACrC,MAAM,EAAE,gBAAgB,CAAC,mBAAmB;gBAC5C,KAAK,EAAE,UAAU,CAAC,GAAG;aACtB,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAC9D,CAAC;QACJ,CAAC;;;;cAIO,CAAC;IACb,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,UAAsB,EACtB,QAA6B;;QAE7B,MAAM,kBAAkB,GAAG,IAAI,CAAA;;4BAEP,IAAI,CAAC,gBAAgB;oBAC7B,UAAU,CAAC,GAAG;iBACjB,IAAI,CAAC,KAAK;qBACN,IAAI,CAAC,SAAS;+BACJ,IAAI,CAAC,mBAAmB;wBAC/B,IAAI,CAAC,YAAY;yBAChB,IAAI,CAAC,aAAa;sBACrB,IAAI,CAAC,UAAU;4BACT,IAAI,CAAC,gBAAgB;0BACvB,IAAI,CAAC,cAAc;oBACzB,QAAQ;sBACN,IAAI,CAAC,UAAU;yBACZ,CAAC,CAAc,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAiB,eAAe,EAAE;gBAC7D,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;;;KAGJ,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;YAC7B,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,SAAS;YACtB,cAAc,EAAE,KAAK;YACrB,oBAAoB,EAAE,IAAI,EAAE,+BAA+B;YAC3D,KAAK,EAAE,IAAI,CAAA,gBAAgB;SAC5B,CAAC,CAAC;QACH,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,CAAC;YAC3B,MAAM;YACN,kBAAkB;YAClB,uBAAuB,EAAE,GAAG,EAAE;;gBAC5B,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC5D,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,UAAsB;QAC7C,OAAO,IAAI,CAAA;;8BAEe,IAAI,CAAC,kBAAkB;sBAC/B,UAAU;0BACN,IAAI,CAAC,cAAc;4BACjB,IAAI,CAAC,gBAAgB;sBAC3B,CAAC,CAAiC,EAAE,EAAE;YAClD,IAAI,CAAC,cAAc,GAAG,yBAAyB,CAC7C,IAAI,CAAC,cAAc,EACnB,UAAU,CAAC,GAAG,EACd,CAAC,CAAC,MAAM,CAAC,MAAM,EACf,IAAI,CACL,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,WAAW,CAAiB,eAAe,EAAE;gBAC7D,MAAM,EAAE,IAAI,CAAC,cAAc;gBAC3B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;;KAEJ,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO;YACL,WAAW;YACX,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwHF;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAvzB6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDAAwC;AAEvC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAAyB;AAExB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDAA4C;AAE3C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uEAA6C;AAE5C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAA0B;AAEzB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAA0B;AAExB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0DAAyB;AAExB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;uDAAuB;AAEtB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oEAAoC;AAEpC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDAAiC;AAE/B;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;2DAA2B;AAE3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDAAuB;AAErB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;iEAAiC;AAEhC;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;kEAAkC;AAElC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CAAgB;AAEf;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6DAA2C;AAE3C;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;2DAAkC;AAEhC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDAAuB;AAEtB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2DAA4B;AAE3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4DAA0C;AAExC;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;sDAAsB;AAErB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oDAAoB;AAErB;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;2DACC;AAG3B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;sDACR;AAGrC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;wDACE;AAG/C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gEACY;AAGzD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;0DACA;AAG7C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;0DACA;AAG7C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;0DACT;AAE3B;IAAR,KAAK,EAAE;oDAWN;AA7ES,gBAAgB;IAD5B,aAAa,CAAC,mBAAmB,CAAC;GACtB,gBAAgB,CAwzB5B","sourcesContent":["import {\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 { ref } from 'lit/directives/ref.js';\nimport { msg } from '@lit/localize';\nimport { classMap } from 'lit/directives/class-map.js';\nimport {\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 {\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 expandIcon from './assets/img/icons/expand';\nimport {\n FacetOption,\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n defaultFacetDisplayOrder,\n facetTitles,\n lendingFacetDisplayNames,\n lendingFacetKeysVisibility,\n LendingFacetKey,\n suppressedCollections,\n defaultFacetSort,\n FacetEventDetails,\n tvChannelFacetLabels,\n} from './models';\nimport type {\n CollectionTitles,\n PageSpecifierParams,\n} from './data-source/models';\nimport './collection-facets/more-facets-content';\nimport './collection-facets/facets-template';\nimport './collection-facets/facet-tombstone-row';\nimport './expanded-date-picker';\nimport {\n analyticsActions,\n analyticsCategories,\n} from './utils/analytics-events';\nimport { srOnlyStyle } from './styles/sr-only';\nimport { ExpandedDatePicker } from './expanded-date-picker';\nimport {\n sortBucketsBySelectionState,\n updateSelectedFacetBucket,\n} from './utils/facet-utils';\n\n@customElement('collection-facets')\nexport class CollectionFacets extends LitElement {\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: Number }) 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: Number }) contentWidth?: number;\n\n @property({ type: Boolean }) showHistogramDatePicker = false;\n\n @property({ type: Boolean }) allowExpandingDatePicker = false;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) pageSpecifierParams?: PageSpecifierParams;\n\n @property({ type: Array }) parentCollections: string[] = [];\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: String }) collectionPagePath: string = '/details/';\n\n @property({ type: Boolean }) isManageView = false;\n\n @property({ type: Boolean }) isTvSearch = false;\n\n @property({ type: Array }) facetDisplayOrder: FacetOption[] =\n defaultFacetDisplayOrder;\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 collectionTitles?: CollectionTitles;\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 program: false,\n person: false,\n sponsor: false,\n };\n\n /**\n * Maximum # of facet buckets to render per facet group\n */\n private allowedFacetCount = 6;\n\n render() {\n const containerClasses = classMap({\n loading: this.facetsLoading,\n managing: this.isManageView,\n });\n\n // Added data-testid for Playwright testing\n // Using facet-group class and aria-labels is not ideal for Playwright locator\n const datePickerLabelId = 'date-picker-label';\n return html`\n <div id=\"container\" class=${containerClasses}>\n ${this.showHistogramDatePicker &&\n (this.fullYearsHistogramAggregation || this.fullYearAggregationLoading)\n ? html`\n <section\n class=\"facet-group\"\n aria-labelledby=${datePickerLabelId}\n data-testid=\"facet-group-header-label-date-picker\"\n >\n <h3 id=${datePickerLabelId}>\n Year Published <span class=\"sr-only\">range filter</span>\n ${this.expandDatePickerBtnTemplate}\n </h3>\n ${this.histogramTemplate}\n </section>\n `\n : nothing}\n ${this.collectionPartOfTemplate}\n ${this.mergedFacets.map(facetGroup =>\n this.getFacetGroupTemplate(facetGroup),\n )}\n </div>\n `;\n }\n\n private get collectionPartOfTemplate(): TemplateResult | typeof nothing {\n // We only display the \"Part Of\" section on collection pages\n if (!this.parentCollections?.length) return nothing;\n\n // Added data-testid for Playwright testing\n // Using className and aria-labels is not ideal for Playwright locator\n const headingId = 'partof-heading';\n return html`\n <section\n class=\"facet-group partof-collections\"\n aria-labelledby=${headingId}\n data-testid=\"facet-group-partof-collections\"\n >\n <div class=\"facet-group-header\">\n <h3 id=${headingId}>${msg('Part Of')}</h3>\n </div>\n <ul>\n ${map(this.parentCollections, collxn => {\n const collectionURL = `${this.baseNavigationUrl}${this.collectionPagePath}${collxn}`;\n\n return html` <li>\n <a\n href=${collectionURL}\n data-id=${collxn}\n @click=${this.partOfCollectionClicked}\n >\n ${this.collectionTitles?.get(collxn) ?? collxn}\n </a>\n </li>`;\n })}\n </ul>\n </section>\n `;\n }\n\n private partOfCollectionClicked(e: Event): void {\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.partOfCollectionClicked,\n label: (e.target as HTMLElement).dataset.id,\n });\n }\n\n /**\n * Opens a modal dialog containing an enlarged version of the date picker.\n */\n private showDatePickerModal(): void {\n const { fullYearsHistogramAggregation } = this;\n const minDate = fullYearsHistogramAggregation?.first_bucket_key;\n const maxDate = fullYearsHistogramAggregation?.last_bucket_key;\n const buckets = fullYearsHistogramAggregation?.buckets as number[];\n const dateFormat = this.isTvSearch ? 'YYYY-MM' : 'YYYY';\n\n // Because the modal manager does not clear its DOM content after being closed,\n // it may try to render the exact same date picker template when it is reopened.\n // And because it isn't actually a descendent of this collection-facets component,\n // changes to the template defined here may not trigger a reactive update to the date\n // picker, resulting in it displaying a stale date range.\n // This ref callback ensures that every time the date picker modal is opened, it will\n // always propagate the most recent date range into the date picker regardless of\n // whether Lit thinks the update is necessary.\n const expandedDatePickerChanged = (elmt?: Element) => {\n if (elmt && elmt instanceof ExpandedDatePicker) {\n const expandedDatePicker = elmt as ExpandedDatePicker;\n expandedDatePicker.minSelectedDate = this.minSelectedDate;\n expandedDatePicker.maxSelectedDate = this.maxSelectedDate;\n }\n };\n\n const customModalContent = html`\n <expanded-date-picker\n ${ref(expandedDatePickerChanged)}\n .minDate=${minDate}\n .maxDate=${maxDate}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .dateFormat=${dateFormat}\n .buckets=${buckets}\n .modalManager=${this.modalManager}\n .analyticsHandler=${this.analyticsHandler}\n @histogramDateRangeApplied=${this.histogramDateRangeUpdated}\n @modalClosed=${this.handleExpandedDatePickerClosed}\n ></expanded-date-picker>\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`${msg('Select a date range')}`,\n });\n\n this.modalManager?.classList.add('expanded-date-picker');\n this.modalManager?.showModal({\n config,\n customModalContent,\n userClosedModalCallback: this.handleExpandedDatePickerClosed,\n });\n\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.histogramExpanded,\n label: window.location.href,\n });\n }\n\n private handleExpandedDatePickerClosed = (): void => {\n this.modalManager?.classList.remove('expanded-date-picker');\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 /**\n * Template for the \"Expand\" button to show the date picker modal, or\n * `nothing` if that button should currently not be shown.\n */\n private get expandDatePickerBtnTemplate(): TemplateResult | typeof nothing {\n return this.allowExpandingDatePicker && !this.facetsLoading\n ? html`<button\n class=\"expand-date-picker-btn\"\n aria-hidden=\"true\"\n @click=${this.showDatePickerModal}\n >\n ${expandIcon}\n </button>`\n : nothing;\n }\n\n private get histogramTemplate() {\n const { fullYearsHistogramAggregation } = this;\n const minDate = fullYearsHistogramAggregation?.first_bucket_key;\n const maxDate = fullYearsHistogramAggregation?.last_bucket_key;\n const dateFormat = this.isTvSearch ? 'YYYY-MM' : 'YYYY';\n return this.fullYearAggregationLoading\n ? html`<div class=\"histogram-loading-indicator\">&hellip;</div>` // Ellipsis block\n : html`\n <histogram-date-range\n class=${this.isTvSearch ? 'wide-inputs' : nothing}\n .minDate=${minDate}\n .maxDate=${maxDate}\n .minSelectedDate=${this.minSelectedDate ?? minDate}\n .maxSelectedDate=${this.maxSelectedDate ?? maxDate}\n .updateDelay=${100}\n .dateFormat=${dateFormat}\n missingDataMessage=\"...\"\n .width=${this.collapsableFacets && this.contentWidth\n ? this.contentWidth\n : 180}\n .bins=${fullYearsHistogramAggregation?.buckets as number[]}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n ></histogram-date-range>\n `;\n }\n\n /**\n * Dispatches a `histogramDateRangeUpdated` event with the date range copied from the\n * input event.\n *\n * Arrow function to ensure `this` is always bound to the current component.\n */\n private histogramDateRangeUpdated = (\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>,\n ): void => {\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 this.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 /**\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 // 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 // Sort the FacetBuckets so that selected and hidden buckets come before the rest\n sortBucketsBySelectionState(bucketsWithCount, defaultFacetSort[facetKey]);\n\n // For mediatype facets, ensure the collection bucket is always shown if present\n if (facetKey === 'mediatype') {\n const collectionIndex = bucketsWithCount.findIndex(\n bucket => bucket.key === 'collection',\n );\n\n if (collectionIndex >= allowedFacetCount) {\n const [collectionBucket] = bucketsWithCount.splice(\n collectionIndex,\n 1,\n );\n\n // If we're showing lots of selected facets, ensure we're not cutting off the last one\n if (allowedFacetCount > this.allowedFacetCount) {\n allowedFacetCount += 1;\n }\n\n bucketsWithCount.splice(allowedFacetCount - 1, 0, collectionBucket);\n }\n }\n\n // For TV creator facets, uppercase the display text\n if (facetKey === 'creator' && this.isTvSearch) {\n bucketsWithCount.forEach(b => {\n b.displayText = (b.displayText ?? b.key)?.toLocaleUpperCase();\n\n const channelLabel = tvChannelFacetLabels[b.displayText];\n if (channelLabel && channelLabel !== b.displayText) {\n b.extraNote = `(${channelLabel})`;\n }\n });\n }\n\n // slice off how many items we want to show in page facet area\n facetGroup.buckets = bucketsWithCount.slice(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 // Added data-testid for Playwright testing\n // Using className and aria-labels is not ideal for Playwright locator\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 data-testid=${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\n class=\"facet-group-content ${isOpen ? 'open' : ''}\"\n data-testid=\"facet-group-content-${facetGroup.key}\"\n >\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 // Added data-testid for Playwright testing\n // Using the className is not ideal for Playwright locator\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 data-testid=\"more-link-btn\"\n >\n More...\n </button>`;\n }\n\n async showMoreFacetsModal(\n facetGroup: FacetGroup,\n sortedBy: AggregationSortType,\n ): Promise<void> {\n const customModalContent = html`\n <more-facets-content\n .analyticsHandler=${this.analyticsHandler}\n .facetKey=${facetGroup.key}\n .query=${this.query}\n .filterMap=${this.filterMap}\n .pageSpecifierParams=${this.pageSpecifierParams}\n .modalManager=${this.modalManager}\n .searchService=${this.searchService}\n .searchType=${this.searchType}\n .collectionTitles=${this.collectionTitles}\n .selectedFacets=${this.selectedFacets}\n .sortedBy=${sortedBy}\n .isTvSearch=${this.isTvSearch}\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 userClosedModalCallback: () => {\n this.modalManager?.classList.remove('more-search-facets');\n },\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 .collectionPagePath=${this.collectionPagePath}\n .facetGroup=${facetGroup}\n .selectedFacets=${this.selectedFacets}\n .collectionTitles=${this.collectionTitles}\n @facetClick=${(e: CustomEvent<FacetEventDetails>) => {\n this.selectedFacets = updateSelectedFacetBucket(\n this.selectedFacets,\n facetGroup.key,\n e.detail.bucket,\n true,\n );\n\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\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 a:link {\n text-decoration: none;\n color: var(--ia-theme-link-color, #4b64ff);\n }\n a:link:hover {\n text-decoration: underline;\n }\n\n #container.loading {\n opacity: 0.5;\n }\n\n #container.managing {\n opacity: 0.3;\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 .partof-collections ul {\n list-style-type: none;\n padding: 0;\n font-size: 1.2rem;\n }\n\n h3 {\n font-size: 1.4rem;\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 #date-picker-label {\n display: flex;\n justify-content: space-between;\n }\n\n .expand-date-picker-btn {\n margin: 0;\n padding: 0;\n border: 0;\n appearance: none;\n background: none;\n cursor: pointer;\n }\n\n .expand-date-picker-btn > svg {\n width: 14px;\n height: 14px;\n }\n\n .sorting-icon {\n height: 15px;\n cursor: pointer;\n }\n\n histogram-date-range.wide-inputs {\n --histogramDateRangeInputWidth: 4.8rem;\n }\n `,\n ];\n }\n}\n"]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "The Internet Archive Collection Browser.",
4
4
  "license": "AGPL-3.0-only",
5
5
  "author": "Internet Archive",
6
- "version": "2.12.1-alpha-webdev5427.4",
6
+ "version": "2.12.1-alpha-webdev5427.6",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
9
  "scripts": {
@@ -32,6 +32,7 @@ import {
32
32
  defaultFacetSort,
33
33
  getDefaultSelectedFacets,
34
34
  FacetEventDetails,
35
+ tvChannelFacetLabels,
35
36
  } from '../models';
36
37
  import type {
37
38
  CollectionTitles,
@@ -86,6 +87,8 @@ export class MoreFacetsContent extends LitElement {
86
87
  @property({ type: Number }) sortedBy: AggregationSortType =
87
88
  AggregationSortType.COUNT;
88
89
 
90
+ @property({ type: Boolean }) isTvSearch = false;
91
+
89
92
  @property({ type: Object }) modalManager?: ModalManagerInterface;
90
93
 
91
94
  @property({ type: Object }) searchService?: SearchServiceInterface;
@@ -278,8 +281,20 @@ export class MoreFacetsContent extends LitElement {
278
281
  bucketsWithCount[index] = { ...unappliedBucket };
279
282
  }
280
283
  }
281
- facetGroup.buckets = bucketsWithCount;
282
284
 
285
+ // For TV creator facets, uppercase the display text
286
+ if (this.facetKey === 'creator' && this.isTvSearch) {
287
+ bucketsWithCount.forEach(b => {
288
+ b.displayText = (b.displayText ?? b.key)?.toLocaleUpperCase();
289
+
290
+ const channelLabel = tvChannelFacetLabels[b.displayText];
291
+ if (channelLabel && channelLabel !== b.displayText) {
292
+ b.extraNote = `(${channelLabel})`;
293
+ }
294
+ });
295
+ }
296
+
297
+ facetGroup.buckets = bucketsWithCount;
283
298
  return facetGroup;
284
299
  }
285
300
 
@@ -439,7 +439,7 @@ export class CollectionFacets extends LitElement {
439
439
  }
440
440
 
441
441
  // Sort the FacetBuckets so that selected and hidden buckets come before the rest
442
- sortBucketsBySelectionState(bucketsWithCount);
442
+ sortBucketsBySelectionState(bucketsWithCount, defaultFacetSort[facetKey]);
443
443
 
444
444
  // For mediatype facets, ensure the collection bucket is always shown if present
445
445
  if (facetKey === 'mediatype') {
@@ -705,6 +705,7 @@ export class CollectionFacets extends LitElement {
705
705
  .collectionTitles=${this.collectionTitles}
706
706
  .selectedFacets=${this.selectedFacets}
707
707
  .sortedBy=${sortedBy}
708
+ .isTvSearch=${this.isTvSearch}
708
709
  @facetsChanged=${(e: CustomEvent) => {
709
710
  const event = new CustomEvent<SelectedFacets>('facetsChanged', {
710
711
  detail: e.detail,