@internetarchive/collection-browser 4.2.0-alpha-webdev8164.0 → 4.2.0-alpha-webdev8164.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/app-root.js +0 -4
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/collection-facets/more-facets-content.d.ts +10 -0
- package/dist/src/collection-facets/more-facets-content.js +118 -52
- package/dist/src/collection-facets/more-facets-content.js.map +1 -1
- package/dist/src/collection-facets/more-facets-pagination.js +2 -1
- package/dist/src/collection-facets/more-facets-pagination.js.map +1 -1
- package/dist/test/collection-facets/more-facets-content.test.js +50 -0
- package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
- package/package.json +1 -1
- package/src/app-root.ts +0 -4
- package/src/collection-facets/more-facets-content.ts +139 -58
- package/src/collection-facets/more-facets-pagination.ts +4 -1
- package/test/collection-facets/more-facets-content.test.ts +75 -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, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { when } from 'lit/directives/when.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 tvMoreFacetSort,\n} from '../models';\nimport type {\n CollectionTitles,\n PageSpecifierParams,\n TVChannelAliases,\n} from '../data-source/models';\nimport '@internetarchive/elements/ia-status-indicator/ia-status-indicator';\nimport './facets-template';\nimport {\n analyticsActions,\n analyticsCategories,\n} from '../utils/analytics-events';\nimport './toggle-switch';\nimport './more-facets-pagination';\nimport '@internetarchive/ia-clearable-text-input';\nimport arrowLeftIcon from '../assets/img/icons/arrow-left';\nimport arrowRightIcon from '../assets/img/icons/arrow-right';\nimport { srOnlyStyle } from '../styles/sr-only';\nimport {\n mergeSelectedFacets,\n sortBucketsBySelectionState,\n updateSelectedFacetBucket,\n} from '../utils/facet-utils';\nimport {\n MORE_FACETS__DEFAULT_PAGE_SIZE,\n MORE_FACETS__MAX_AGGREGATIONS,\n} from './models';\n\n/**\n * Threshold for switching from horizontal scroll to pagination.\n * If facet count >= this value, use pagination. Otherwise use horizontal scroll.\n */\nconst PAGINATION_THRESHOLD = 1000;\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: Array }) identifiers?: 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 @property({ type: Object })\n tvChannelAliases?: TVChannelAliases;\n\n /**\n * Maximum number of facets to show per page within the modal.\n */\n @property({ type: Number }) facetsPerPage = MORE_FACETS__DEFAULT_PAGE_SIZE;\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 * Text entered by the user to filter facet buckets.\n * Applied to bucket.key for case-insensitive matching.\n */\n @state() private filterText = '';\n\n /**\n * Current page number for pagination (when facet count >= PAGINATION_THRESHOLD).\n */\n @state() private pageNumber = 1;\n\n /**\n * Whether the component is narrow enough to warrant compact pagination.\n * Updated via a ResizeObserver-based container query approach.\n */\n @state() private isCompactView = false;\n\n /**\n * Whether the horizontal scroll is at the leftmost position.\n */\n @state() private atScrollStart = true;\n\n /**\n * Whether the horizontal scroll is at the rightmost position.\n */\n @state() private atScrollEnd = false;\n\n @query('ia-clearable-text-input')\n private filterInput!: HTMLElement;\n\n @query('.facets-content')\n private facetsContentEl!: HTMLElement;\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 // Reset to page 1 when filter text changes (only matters for pagination mode)\n if (changed.has('filterText')) {\n this.pageNumber = 1;\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 =\n this.searchType === SearchType.TV\n ? tvMoreFacetSort[this.facetKey as FacetOption]\n : defaultFacetSort[this.facetKey as FacetOption];\n\n this.updateSpecificFacets();\n }\n\n // Reset horizontal scroll when filter text changes (e.g., switching from\n // horizontal-scroll mode back to pagination mode)\n if (changed.has('filterText')) {\n const facetsContent = this.shadowRoot?.querySelector('.facets-content');\n if (facetsContent) {\n facetsContent.scrollLeft = 0;\n }\n }\n\n // Manage scroll listener for horizontal scroll mode arrows.\n // Only re-evaluate when properties that affect the displayed content change.\n if (\n changed.has('filterText') ||\n changed.has('aggregations') ||\n changed.has('facetKey') ||\n changed.has('sortedBy') ||\n changed.has('selectedFacets') ||\n changed.has('unappliedFacetChanges')\n ) {\n if (!this.usePagination) {\n this.attachScrollListener();\n // Refresh scroll state whenever content may have changed (e.g., filtering)\n requestAnimationFrame(() => this.updateScrollState());\n } else {\n this.removeScrollListener();\n }\n }\n }\n\n private resizeObserver?: ResizeObserver;\n\n firstUpdated(): void {\n this.setupEscapeListeners();\n this.setupCompactViewObserver();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.resizeObserver?.disconnect();\n this.removeScrollListener();\n }\n\n private scrollHandler = () => this.updateScrollState();\n\n private scrollListenerAttached = false;\n\n /**\n * Attaches a scroll event listener to the facets content element\n * to track horizontal scroll position for arrow button states.\n */\n private attachScrollListener(): void {\n if (this.scrollListenerAttached || !this.facetsContentEl) return;\n this.facetsContentEl.addEventListener('scroll', this.scrollHandler, {\n passive: true,\n });\n this.scrollListenerAttached = true;\n // Defer initial state check until after browser layout, so scrollWidth\n // reflects the actual content dimensions.\n requestAnimationFrame(() => this.updateScrollState());\n }\n\n private removeScrollListener(): void {\n if (!this.scrollListenerAttached || !this.facetsContentEl) return;\n this.facetsContentEl.removeEventListener('scroll', this.scrollHandler);\n this.scrollListenerAttached = false;\n }\n\n /**\n * Updates the scroll arrow disabled states based on current scroll position.\n */\n private updateScrollState(): void {\n const el = this.facetsContentEl;\n if (!el) return;\n this.atScrollStart = el.scrollLeft <= 0;\n this.atScrollEnd = el.scrollLeft + el.clientWidth >= el.scrollWidth - 1;\n }\n\n /**\n * Calculates the width of one column step (column width + gap) based on\n * the CSS multi-column layout of the scroll container.\n */\n private getColumnStep(): number {\n const el = this.facetsContentEl;\n if (!el) return 0;\n\n const facetRows = el.querySelector('.facet-rows') as HTMLElement;\n const styles = facetRows\n ? getComputedStyle(facetRows)\n : getComputedStyle(el);\n\n const columnCount = parseInt(styles.columnCount, 10) || 3;\n const columnGap = parseInt(styles.columnGap, 10) || 15;\n\n // Column width = (visible width - total gaps) / column count\n // Column step = column width + gap = (visible width + gap) / column count\n return (el.clientWidth + columnGap) / columnCount;\n }\n\n /**\n * Snaps a scroll target to the nearest column boundary.\n */\n private snapToColumn(target: number): number {\n const step = this.getColumnStep();\n if (step <= 0) return target;\n return Math.round(target / step) * step;\n }\n\n /**\n * Scrolls the facet content left by approximately one page, snapping to\n * the nearest column boundary.\n */\n private onScrollLeft(): void {\n const el = this.facetsContentEl;\n if (!el) return;\n const rawTarget = el.scrollLeft - el.clientWidth;\n const snapped = Math.max(0, this.snapToColumn(rawTarget));\n el.scrollTo({ left: snapped, behavior: 'smooth' });\n }\n\n /**\n * Scrolls the facet content right by approximately one page, snapping to\n * the nearest column boundary.\n */\n private onScrollRight(): void {\n const el = this.facetsContentEl;\n if (!el) return;\n const maxScroll = el.scrollWidth - el.clientWidth;\n const rawTarget = el.scrollLeft + el.clientWidth;\n const snapped = Math.min(maxScroll, this.snapToColumn(rawTarget));\n el.scrollTo({ left: snapped, behavior: 'smooth' });\n }\n\n /**\n * Sets up a ResizeObserver to toggle compact pagination based on component width.\n */\n private setupCompactViewObserver(): void {\n this.resizeObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n this.isCompactView = entry.contentRect.width <= 560;\n }\n });\n this.resizeObserver.observe(this);\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 = MORE_FACETS__MAX_AGGREGATIONS; // Only request the 10K highest-count facets\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n identifiers: this.identifiers,\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 * 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 = this.tvChannelAliases?.get(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 the facet group with buckets filtered by the current filter text.\n * Filters are applied to the full bucket list before pagination.\n */\n private get filteredFacetGroup(): FacetGroup | undefined {\n const { facetGroup, filterText } = this;\n if (!facetGroup) return undefined;\n\n // If no filter text, return the full group\n if (!filterText.trim()) {\n return facetGroup;\n }\n\n // Filter buckets by the text the user actually sees.\n // For collections, match against the displayed collection title (not the identifier).\n // For other facet types, match against the bucket key (which is also the display text).\n const lowerFilter = filterText.toLowerCase().trim();\n const filteredBuckets = facetGroup.buckets.filter(bucket => {\n const displayText = this.collectionTitles?.get(bucket.key) ?? bucket.key;\n return displayText.toLowerCase().includes(lowerFilter);\n });\n\n return {\n ...facetGroup,\n buckets: filteredBuckets,\n };\n }\n\n /**\n * Determines whether to use pagination based on the number of filtered facets.\n * Returns true if facet count >= PAGINATION_THRESHOLD, false otherwise.\n */\n private get usePagination(): boolean {\n const facetCount = this.filteredFacetGroup?.buckets.length ?? 0;\n return facetCount >= PAGINATION_THRESHOLD;\n }\n\n /**\n * Returns the facet group for the current page.\n * If using pagination (>= 1000 facets), slices to show only the current page.\n * Otherwise, returns all facets for horizontal scrolling.\n */\n private get facetGroupForCurrentPage(): FacetGroup | undefined {\n const filteredGroup = this.filteredFacetGroup;\n if (!filteredGroup) return undefined;\n\n // If facet count is below threshold, show all facets with horizontal scroll\n if (!this.usePagination) {\n return filteredGroup;\n }\n\n // Otherwise, use pagination - slice to current page\n const startIndex = (this.pageNumber - 1) * this.facetsPerPage;\n const endIndex = startIndex + this.facetsPerPage;\n const slicedBuckets = filteredGroup.buckets.slice(startIndex, endIndex);\n\n return {\n ...filteredGroup,\n buckets: slicedBuckets,\n };\n }\n\n private get moreFacetsTemplate(): TemplateResult {\n const facetGroup = this.facetGroupForCurrentPage;\n\n // Show empty state if filtering returned no results\n if (\n this.filterText.trim() &&\n (!facetGroup || facetGroup.buckets.length === 0)\n ) {\n return this.emptyFilterResultsTemplate;\n }\n\n return html`\n <facets-template\n .facetGroup=${facetGroup}\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`\n <ia-status-indicator\n class=\"facets-loader\"\n mode=\"loading\"\n ></ia-status-indicator>\n `;\n }\n\n private get emptyFilterResultsTemplate(): TemplateResult {\n return html`\n <div class=\"empty-results\">\n <p>${msg('No matching values found.')}</p>\n <p class=\"hint\">${msg('Try a different search term.')}</p>\n </div>\n `;\n }\n\n /**\n * Number of pages for pagination (only used when facet count >= PAGINATION_THRESHOLD).\n */\n private get paginationSize(): number {\n const filteredBuckets = this.filteredFacetGroup?.buckets ?? [];\n return Math.ceil(filteredBuckets.length / this.facetsPerPage);\n }\n\n /**\n * Template for pagination component.\n */\n private get facetsPaginationTemplate() {\n return html`<more-facets-pagination\n .size=${this.paginationSize}\n .currentPage=${this.pageNumber}\n .compact=${this.isCompactView}\n @pageNumberClicked=${this.pageNumberClicked}\n ></more-facets-pagination>`;\n }\n\n private get footerTemplate() {\n return html`\n ${when(this.usePagination, () => this.facetsPaginationTemplate)}\n <div class=\"footer\">\n <button class=\"btn btn-cancel\" type=\"button\" @click=${this.cancelClick}>\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\n private sortFacetAggregation(facetSortType: AggregationSortType) {\n this.sortedBy = facetSortType;\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy }),\n );\n }\n\n /**\n * Handler for filter input changes. Updates the filter text and triggers re-render.\n */\n private handleFilterInput(e: Event): void {\n const input = e.target as HTMLElement & { value: string };\n this.filterText = input.value;\n }\n\n /**\n * Handler for when the filter input is cleared via the clear button.\n */\n private handleFilterClear(): void {\n this.filterText = '';\n }\n\n /**\n * Handler for pagination page number clicks.\n * Only used when facet count >= PAGINATION_THRESHOLD.\n */\n private pageNumberClicked(e: CustomEvent<{ page: number }>) {\n this.pageNumber = e.detail.page;\n\n // Track page navigation in analytics\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.moreFacetsPageChange,\n label: `${this.pageNumber}`,\n });\n\n this.dispatchEvent(\n new CustomEvent('pageChanged', { detail: this.pageNumber }),\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\"> ${this.facetGroup?.title} </span>\n <span class=\"header-controls\">\n <span class=\"sort-controls\">\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 <span class=\"filter-controls\">\n <label class=\"filter-label\">${msg('Filter by:')}</label>\n <ia-clearable-text-input\n class=\"filter-input\"\n .value=${this.filterText}\n .placeholder=${msg('Search...')}\n .screenReaderLabel=${msg('Filter facets')}\n .clearButtonScreenReaderLabel=${msg('Clear filter')}\n @input=${this.handleFilterInput}\n @clear=${this.handleFilterClear}\n ></ia-clearable-text-input>\n </span>\n </span>`;\n }\n\n render() {\n const sectionClasses = classMap({\n 'pagination-mode': this.usePagination,\n 'horizontal-scroll-mode': !this.usePagination,\n });\n const contentClasses = classMap({\n 'facets-content': true,\n 'pagination-mode': this.usePagination,\n 'horizontal-scroll-mode': !this.usePagination,\n });\n\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <section id=\"more-facets\" class=${sectionClasses}>\n <div class=\"header-content\">${this.modalHeaderTemplate}</div>\n ${this.usePagination\n ? html`<div class=${contentClasses}>\n ${this.moreFacetsTemplate}\n </div>`\n : html`<div class=\"scroll-nav-container\">\n ${when(\n !this.atScrollStart || !this.atScrollEnd,\n () =>\n html`<button\n class=\"scroll-arrow scroll-left\"\n @click=${this.onScrollLeft}\n ?disabled=${this.atScrollStart}\n aria-label=\"Scroll facets left\"\n >\n ${arrowLeftIcon}\n </button>`,\n )}\n <div class=${contentClasses}>\n <div class=\"facets-horizontal-container\">\n ${this.moreFacetsTemplate}\n </div>\n </div>\n ${when(\n !this.atScrollStart || !this.atScrollEnd,\n () =>\n html`<button\n class=\"scroll-arrow scroll-right\"\n @click=${this.onScrollRight}\n ?disabled=${this.atScrollEnd}\n aria-label=\"Scroll facets right\"\n >\n ${arrowRightIcon}\n </button>`,\n )}\n </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 // Reset filter text\n this.filterText = '';\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 // Reset filter text\n this.filterText = '';\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 display: flex;\n flex-direction: column;\n max-height: calc(100vh - 16.5rem);\n padding: 10px;\n box-sizing: border-box;\n --facetsColumnCount: 3;\n }\n\n /* Both modes need a height constraint for proper column flow */\n section#more-facets.horizontal-scroll-mode,\n section#more-facets.pagination-mode {\n --facetsMaxHeight: 280px;\n }\n .header-content {\n flex-shrink: 0;\n }\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 .header-controls {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 20px;\n padding: 0 10px;\n }\n\n .sort-controls {\n display: inline-flex;\n align-items: center;\n white-space: nowrap;\n gap: 5px;\n }\n\n .sort-label {\n font-size: 1.3rem;\n }\n\n .sort-toggle {\n font-weight: normal;\n }\n\n .filter-controls {\n display: inline-flex;\n align-items: center;\n white-space: nowrap;\n }\n\n .filter-label {\n font-size: 1.3rem;\n }\n\n .filter-input {\n --input-height: 2.5rem;\n --input-font-size: 1.3rem;\n --input-border-radius: 4px;\n --input-padding: 4px 8px;\n --input-focused-border-color: ${modalSubmitButton};\n width: 150px;\n margin-left: 5px;\n }\n\n .empty-results {\n text-align: center;\n padding: 40px 20px;\n color: #666;\n }\n\n .empty-results .hint {\n margin-top: 10px;\n }\n\n .facets-content {\n font-size: 1.2rem;\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 10px;\n /* Force scrollbar to always be visible */\n scrollbar-width: thin; /* Firefox */\n scrollbar-color: #888 #f1f1f1; /* Firefox - thumb and track colors */\n }\n\n /* Horizontal scroll mode: horizontal scrolling only */\n .facets-content.horizontal-scroll-mode {\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n /* Webkit browsers scrollbar styling - always visible */\n .facets-content::-webkit-scrollbar {\n width: 12px; /* Vertical scrollbar width */\n height: 12px; /* Horizontal scrollbar height */\n }\n\n .facets-content::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 6px;\n }\n\n .facets-content::-webkit-scrollbar-thumb {\n background: #888;\n border-radius: 6px;\n min-height: 30px; /* Ensure thumb is always visible when scrolling is possible */\n }\n\n .facets-content::-webkit-scrollbar-thumb:hover {\n background: #555;\n }\n\n /* Force corner to match track color */\n .facets-content::-webkit-scrollbar-corner {\n background: #f1f1f1;\n }\n\n .facets-horizontal-container {\n display: inline-block;\n min-width: 100%;\n /* Allow natural width expansion based on content */\n width: fit-content;\n }\n\n .scroll-nav-container {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-height: 0;\n }\n\n .scroll-nav-container .facets-content {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .scroll-arrow {\n background: none;\n border: none;\n cursor: pointer;\n padding: 5px;\n flex-shrink: 0;\n }\n\n .scroll-arrow svg {\n height: 14px;\n fill: #2c2c2c;\n }\n\n .scroll-arrow:disabled {\n opacity: 0.3;\n cursor: default;\n }\n .facets-loader {\n --icon-width: 70px;\n margin-bottom: 20px;\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 font-family: inherit;\n }\n .btn-cancel {\n background-color: #2c2c2c;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n more-facets-pagination {\n flex-shrink: 0;\n }\n\n .footer {\n text-align: center;\n margin-top: 10px;\n flex-shrink: 0;\n }\n\n @media (max-width: 560px) {\n section#more-facets.horizontal-scroll-mode,\n section#more-facets.pagination-mode {\n --facetsColumnCount: 1; /* Single column on mobile */\n --facetsMaxHeight: none; /* Remove fixed height for vertical scrolling */\n }\n /* On mobile, always use vertical scrolling regardless of mode */\n .facets-content,\n .facets-content.horizontal-scroll-mode {\n overflow-y: auto;\n overflow-x: hidden;\n }\n .scroll-nav-container {\n display: contents; /* Remove wrapper from layout so section flex-column works */\n }\n .scroll-arrow {\n display: none;\n }\n .filter-input {\n width: 120px;\n --input-font-size: 1.2rem;\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, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { when } from 'lit/directives/when.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 tvMoreFacetSort,\n} from '../models';\nimport type {\n CollectionTitles,\n PageSpecifierParams,\n TVChannelAliases,\n} from '../data-source/models';\nimport '@internetarchive/elements/ia-status-indicator/ia-status-indicator';\nimport './facets-template';\nimport {\n analyticsActions,\n analyticsCategories,\n} from '../utils/analytics-events';\nimport './toggle-switch';\nimport './more-facets-pagination';\nimport '@internetarchive/ia-clearable-text-input';\nimport arrowLeftIcon from '../assets/img/icons/arrow-left';\nimport arrowRightIcon from '../assets/img/icons/arrow-right';\nimport { srOnlyStyle } from '../styles/sr-only';\nimport {\n mergeSelectedFacets,\n sortBucketsBySelectionState,\n updateSelectedFacetBucket,\n} from '../utils/facet-utils';\nimport {\n MORE_FACETS__DEFAULT_PAGE_SIZE,\n MORE_FACETS__MAX_AGGREGATIONS,\n} from './models';\n\n/**\n * Threshold for switching from horizontal scroll to pagination.\n * If facet count >= this value, use pagination. Otherwise use horizontal scroll.\n */\nconst PAGINATION_THRESHOLD = 1000;\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: Array }) identifiers?: 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 @property({ type: Object })\n tvChannelAliases?: TVChannelAliases;\n\n /**\n * Maximum number of facets to show per page within the modal.\n */\n @property({ type: Number }) facetsPerPage = MORE_FACETS__DEFAULT_PAGE_SIZE;\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 * Text entered by the user to filter facet buckets.\n * Applied to bucket.key for case-insensitive matching.\n */\n @state() private filterText = '';\n\n /**\n * Current page number for pagination (when facet count >= PAGINATION_THRESHOLD).\n */\n @state() private pageNumber = 1;\n\n /**\n * Whether the component is narrow enough to warrant compact pagination.\n * Updated via a ResizeObserver-based container query approach.\n */\n @state() private isCompactView = false;\n\n /**\n * Whether the horizontal scroll is at the leftmost position.\n */\n @state() private atScrollStart = true;\n\n /**\n * Whether the horizontal scroll is at the rightmost position.\n */\n @state() private atScrollEnd = true;\n\n @query('ia-clearable-text-input')\n private filterInput!: HTMLElement;\n\n @query('.facets-content')\n private facetsContentEl!: HTMLElement;\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 // Reset to page 1 when filter text changes (only matters for pagination mode)\n if (changed.has('filterText')) {\n this.pageNumber = 1;\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 =\n this.searchType === SearchType.TV\n ? tvMoreFacetSort[this.facetKey as FacetOption]\n : defaultFacetSort[this.facetKey as FacetOption];\n\n this.updateSpecificFacets();\n }\n\n // Reset horizontal scroll when filter text changes (e.g., switching from\n // horizontal-scroll mode back to pagination mode)\n if (changed.has('filterText')) {\n const facetsContent = this.shadowRoot?.querySelector('.facets-content');\n if (facetsContent) {\n facetsContent.scrollLeft = 0;\n }\n }\n\n // Manage scroll listener for horizontal scroll mode arrows.\n // Only re-evaluate when properties that affect the displayed content change.\n if (\n changed.has('filterText') ||\n changed.has('aggregations') ||\n changed.has('facetKey') ||\n changed.has('sortedBy') ||\n changed.has('selectedFacets') ||\n changed.has('unappliedFacetChanges')\n ) {\n if (!this.usePagination) {\n this.attachScrollListener();\n // Refresh scroll state whenever content may have changed (e.g., filtering)\n requestAnimationFrame(() => this.updateScrollState());\n } else {\n this.removeScrollListener();\n }\n }\n }\n\n private resizeObserver?: ResizeObserver;\n\n firstUpdated(): void {\n this.setupEscapeListeners();\n this.setupCompactViewObserver();\n this.constrainToScrollContainer();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.resizeObserver?.disconnect();\n this.removeScrollListener();\n document.removeEventListener('keydown', this.escapeHandler);\n }\n\n private scrollHandler = () => this.updateScrollState();\n\n private scrollListenerAttached = false;\n\n private scrollListenerTarget?: HTMLElement;\n\n /**\n * Attaches a scroll event listener to the facets content element\n * to track horizontal scroll position for arrow button states.\n */\n private attachScrollListener(): void {\n if (this.scrollListenerAttached || !this.facetsContentEl) return;\n this.scrollListenerTarget = this.facetsContentEl;\n this.scrollListenerTarget.addEventListener('scroll', this.scrollHandler, {\n passive: true,\n });\n this.scrollListenerAttached = true;\n // Defer initial state check until after browser layout, so scrollWidth\n // reflects the actual content dimensions.\n requestAnimationFrame(() => this.updateScrollState());\n }\n\n private removeScrollListener(): void {\n if (!this.scrollListenerAttached || !this.scrollListenerTarget) return;\n this.scrollListenerTarget.removeEventListener('scroll', this.scrollHandler);\n this.scrollListenerTarget = undefined;\n this.scrollListenerAttached = false;\n }\n\n /**\n * Updates the scroll arrow disabled states based on current scroll position.\n */\n private updateScrollState(): void {\n const el = this.facetsContentEl;\n if (!el) return;\n this.atScrollStart = el.scrollLeft <= 0;\n this.atScrollEnd = el.scrollLeft + el.clientWidth >= el.scrollWidth - 1;\n }\n\n /**\n * Calculates the width of one column step (column width + gap) based on\n * the CSS multi-column layout of the scroll container.\n */\n private getColumnStep(): number {\n const el = this.facetsContentEl;\n if (!el) return 0;\n\n const facetRows = el.querySelector('.facet-rows') as HTMLElement;\n const styles = facetRows\n ? getComputedStyle(facetRows)\n : getComputedStyle(el);\n\n const columnCount = parseInt(styles.columnCount, 10) || 3;\n const columnGap = parseInt(styles.columnGap, 10) || 15;\n\n // Column width = (visible width - total gaps) / column count\n // Column step = column width + gap = (visible width + gap) / column count\n return (el.clientWidth + columnGap) / columnCount;\n }\n\n /**\n * Snaps a scroll target to the nearest column boundary.\n */\n private snapToColumn(target: number): number {\n const step = this.getColumnStep();\n if (step <= 0) return target;\n return Math.round(target / step) * step;\n }\n\n /**\n * Scrolls the facet content left by approximately one page, snapping to\n * the nearest column boundary.\n */\n private onScrollLeft(): void {\n const el = this.facetsContentEl;\n if (!el) return;\n const rawTarget = el.scrollLeft - el.clientWidth;\n const snapped = Math.max(0, this.snapToColumn(rawTarget));\n el.scrollTo({ left: snapped, behavior: 'smooth' });\n }\n\n /**\n * Scrolls the facet content right by approximately one page, snapping to\n * the nearest column boundary.\n */\n private onScrollRight(): void {\n const el = this.facetsContentEl;\n if (!el) return;\n const maxScroll = el.scrollWidth - el.clientWidth;\n const rawTarget = el.scrollLeft + el.clientWidth;\n const snapped = Math.min(maxScroll, this.snapToColumn(rawTarget));\n el.scrollTo({ left: snapped, behavior: 'smooth' });\n }\n\n /**\n * Sets up a ResizeObserver to toggle compact pagination based on component width.\n */\n private setupCompactViewObserver(): void {\n this.resizeObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n const compact = entry.contentRect.width <= 560;\n if (this.isCompactView !== compact) this.isCompactView = compact;\n }\n });\n this.resizeObserver.observe(this);\n }\n\n /**\n * Constrains the section's max-height to fit within the nearest\n * scroll-container ancestor (e.g., the modal's content area).\n * This is a safety net for cases where the CSS max-height calculation\n * doesn't perfectly match the container's available space.\n */\n private constrainToScrollContainer(): void {\n requestAnimationFrame(() => {\n const section = this.shadowRoot?.querySelector(\n 'section#more-facets',\n ) as HTMLElement;\n if (!section) return;\n\n // Walk up from the assigned slot to find the nearest overflow container\n let el = this.assignedSlot?.parentElement;\n while (el) {\n const cs = getComputedStyle(el);\n if (\n cs.overflowY === 'auto' ||\n cs.overflowY === 'scroll' ||\n cs.overflowY === 'hidden'\n ) {\n const containerBottom = el.getBoundingClientRect().bottom;\n const sectionTop = section.getBoundingClientRect().top;\n const available = containerBottom - sectionTop;\n // Compare against the CSS max-height rather than actual height,\n // since content may not have loaded yet at firstUpdated time\n const computedMax = parseFloat(getComputedStyle(section).maxHeight);\n if (available > 0 && available < computedMax) {\n section.style.maxHeight = `${available}px`;\n }\n return;\n }\n el = el.parentElement;\n }\n });\n }\n\n /**\n * Close more facets modal on Escape click\n */\n private escapeHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') this.modalManager?.closeModal();\n };\n\n private setupEscapeListeners() {\n if (this.modalManager) {\n document.addEventListener('keydown', this.escapeHandler);\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 = MORE_FACETS__MAX_AGGREGATIONS; // Only request the 10K highest-count facets\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n identifiers: this.identifiers,\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 try {\n const results = await this.searchService?.search(params, this.searchType);\n this.aggregations = results?.success?.response.aggregations;\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 } finally {\n this.facetsLoading = false;\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 = this.tvChannelAliases?.get(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 =\n (this.facetKey === 'collection'\n ? this.collectionTitles?.get(value)\n : undefined) ?? 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 // using collection display titles where available.\n const facetBuckets: FacetBucket[] = sortedBuckets.map(bucket => {\n const bucketKeyStr = `${bucket.key}`;\n const displayText =\n (this.facetKey === 'collection'\n ? this.collectionTitles?.get(bucketKeyStr)\n : undefined) ?? bucketKeyStr;\n return {\n displayText,\n key: `${bucketKeyStr}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n\n // For collection facets sorted alphabetically, re-sort by display title\n // instead of the raw identifier used by getSortedBuckets.\n if (\n this.facetKey === 'collection' &&\n this.sortedBy === AggregationSortType.ALPHABETICAL\n ) {\n facetBuckets.sort((a, b) =>\n (a.displayText ?? a.key).localeCompare(b.displayText ?? b.key),\n );\n }\n\n return {\n title: facetGroupTitle,\n key: this.facetKey,\n buckets: facetBuckets,\n };\n }\n\n /**\n * Returns the facet group with buckets filtered by the current filter text.\n * Filters are applied to the full bucket list before pagination.\n */\n private get filteredFacetGroup(): FacetGroup | undefined {\n const { facetGroup, filterText } = this;\n if (!facetGroup) return undefined;\n\n // If no filter text, return the full group\n if (!filterText.trim()) {\n return facetGroup;\n }\n\n // Filter buckets by the text the user actually sees.\n // For collections, match against the displayed collection title (not the identifier).\n // For other facet types, match against the bucket key (which is also the display text).\n const lowerFilter = filterText.toLowerCase().trim();\n const filteredBuckets = facetGroup.buckets.filter(bucket => {\n const displayText = this.collectionTitles?.get(bucket.key) ?? bucket.key;\n return displayText.toLowerCase().includes(lowerFilter);\n });\n\n return {\n ...facetGroup,\n buckets: filteredBuckets,\n };\n }\n\n /**\n * Determines whether to use pagination based on the number of filtered facets.\n * Returns true if facet count >= PAGINATION_THRESHOLD, false otherwise.\n */\n private get usePagination(): boolean {\n const facetCount = this.filteredFacetGroup?.buckets.length ?? 0;\n return facetCount >= PAGINATION_THRESHOLD;\n }\n\n /**\n * Returns the facet group for the current page.\n * If using pagination (>= 1000 facets), slices to show only the current page.\n * Otherwise, returns all facets for horizontal scrolling.\n */\n private get facetGroupForCurrentPage(): FacetGroup | undefined {\n const filteredGroup = this.filteredFacetGroup;\n if (!filteredGroup) return undefined;\n\n // If facet count is below threshold, show all facets with horizontal scroll\n if (!this.usePagination) {\n return filteredGroup;\n }\n\n // Otherwise, use pagination - slice to current page\n const startIndex = (this.pageNumber - 1) * this.facetsPerPage;\n const endIndex = startIndex + this.facetsPerPage;\n const slicedBuckets = filteredGroup.buckets.slice(startIndex, endIndex);\n\n return {\n ...filteredGroup,\n buckets: slicedBuckets,\n };\n }\n\n private get moreFacetsTemplate(): TemplateResult {\n const facetGroup = this.facetGroupForCurrentPage;\n\n // Show empty state if filtering returned no results\n if (\n this.filterText.trim() &&\n (!facetGroup || facetGroup.buckets.length === 0)\n ) {\n return this.emptyFilterResultsTemplate;\n }\n\n return html`\n <facets-template\n .facetGroup=${facetGroup}\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`\n <ia-status-indicator\n class=\"facets-loader\"\n mode=\"loading\"\n ></ia-status-indicator>\n `;\n }\n\n private get emptyFilterResultsTemplate(): TemplateResult {\n return html`\n <div class=\"empty-results\">\n <p>${msg('No matching values found.')}</p>\n <p class=\"hint\">${msg('Try a different search term.')}</p>\n </div>\n `;\n }\n\n /**\n * Number of pages for pagination (only used when facet count >= PAGINATION_THRESHOLD).\n */\n private get paginationSize(): number {\n const filteredBuckets = this.filteredFacetGroup?.buckets ?? [];\n return Math.ceil(filteredBuckets.length / this.facetsPerPage);\n }\n\n /**\n * Template for pagination component.\n */\n private get facetsPaginationTemplate() {\n return html`<more-facets-pagination\n .size=${this.paginationSize}\n .currentPage=${this.pageNumber}\n .compact=${this.isCompactView}\n @pageNumberClicked=${this.pageNumberClicked}\n ></more-facets-pagination>`;\n }\n\n private get footerTemplate() {\n return html`\n ${when(this.usePagination, () => this.facetsPaginationTemplate)}\n <div class=\"footer\">\n <button class=\"btn btn-cancel\" type=\"button\" @click=${this.cancelClick}>\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\n private sortFacetAggregation(facetSortType: AggregationSortType) {\n this.sortedBy = facetSortType;\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy }),\n );\n }\n\n /**\n * Handler for filter input changes. Updates the filter text and triggers re-render.\n */\n private handleFilterInput(e: Event): void {\n const input = e.target as HTMLElement & { value: string };\n this.filterText = input.value;\n }\n\n /**\n * Handler for when the filter input is cleared via the clear button.\n */\n private handleFilterClear(): void {\n this.filterText = '';\n }\n\n /**\n * Handler for pagination page number clicks.\n * Only used when facet count >= PAGINATION_THRESHOLD.\n */\n private pageNumberClicked(e: CustomEvent<{ page: number }>) {\n this.pageNumber = e.detail.page;\n\n // Track page navigation in analytics\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.moreFacetsPageChange,\n label: `${this.pageNumber}`,\n });\n\n this.dispatchEvent(\n new CustomEvent('pageChanged', {\n detail: this.pageNumber,\n bubbles: true,\n composed: true,\n }),\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\"> ${this.facetGroup?.title} </span>\n <span class=\"header-controls\">\n <span class=\"sort-controls\">\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 <span class=\"filter-controls\">\n <label class=\"filter-label\">${msg('Filter by:')}</label>\n <ia-clearable-text-input\n class=\"filter-input\"\n .value=${this.filterText}\n .placeholder=${msg('Search...')}\n .screenReaderLabel=${msg('Filter facets')}\n .clearButtonScreenReaderLabel=${msg('Clear filter')}\n @input=${this.handleFilterInput}\n @clear=${this.handleFilterClear}\n ></ia-clearable-text-input>\n </span>\n </span>`;\n }\n\n private get horizontalScrollTemplate(): TemplateResult {\n const contentClasses = classMap({\n 'facets-content': true,\n 'horizontal-scroll-mode': true,\n });\n const showArrows = !this.atScrollStart || !this.atScrollEnd;\n\n return html`<div class=\"scroll-nav-container\">\n ${when(\n showArrows,\n () =>\n html`<button\n class=\"scroll-arrow scroll-left\"\n @click=${this.onScrollLeft}\n ?disabled=${this.atScrollStart}\n aria-label=\"Scroll facets left\"\n >\n ${arrowLeftIcon}\n </button>`,\n )}\n <div class=${contentClasses}>\n <div class=\"facets-horizontal-container\">\n ${this.moreFacetsTemplate}\n </div>\n </div>\n ${when(\n showArrows,\n () =>\n html`<button\n class=\"scroll-arrow scroll-right\"\n @click=${this.onScrollRight}\n ?disabled=${this.atScrollEnd}\n aria-label=\"Scroll facets right\"\n >\n ${arrowRightIcon}\n </button>`,\n )}\n </div>`;\n }\n\n render() {\n const sectionClasses = classMap({\n 'pagination-mode': this.usePagination,\n 'horizontal-scroll-mode': !this.usePagination,\n });\n const contentClasses = classMap({\n 'facets-content': true,\n 'pagination-mode': this.usePagination,\n });\n\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <section id=\"more-facets\" class=${sectionClasses}>\n <div class=\"header-content\">${this.modalHeaderTemplate}</div>\n ${this.usePagination\n ? html`<div class=${contentClasses}>\n ${this.moreFacetsTemplate}\n </div>`\n : this.horizontalScrollTemplate}\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 // Reset filter text\n this.filterText = '';\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 // Reset filter text\n this.filterText = '';\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 display: flex;\n flex-direction: column;\n max-height: calc(100vh - 16.5rem - var(--modalBottomMargin, 2.5rem));\n padding: 10px;\n box-sizing: border-box;\n --facetsColumnCount: 3;\n }\n\n /* Both modes need a height constraint for proper column flow */\n section#more-facets.horizontal-scroll-mode,\n section#more-facets.pagination-mode {\n --facetsMaxHeight: 280px;\n }\n .header-content {\n flex-shrink: 0;\n position: relative;\n z-index: 1;\n background: #fff;\n }\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 .header-controls {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px 20px;\n padding: 0 10px 8px;\n }\n\n .sort-controls {\n display: inline-flex;\n align-items: center;\n white-space: nowrap;\n gap: 5px;\n }\n\n .sort-label {\n font-size: 1.3rem;\n }\n\n .sort-toggle {\n font-weight: normal;\n }\n\n .filter-controls {\n display: inline-flex;\n align-items: center;\n white-space: nowrap;\n }\n\n .filter-label {\n font-size: 1.3rem;\n }\n\n .filter-input {\n --input-height: 2.5rem;\n --input-font-size: 1.3rem;\n --input-border-radius: 4px;\n --input-padding: 4px 8px;\n --input-focused-border-color: ${modalSubmitButton};\n width: 150px;\n margin-left: 5px;\n }\n\n .empty-results {\n text-align: center;\n padding: 40px 20px;\n color: #666;\n }\n\n .empty-results .hint {\n margin-top: 10px;\n }\n\n .facets-content {\n font-size: 1.2rem;\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 10px;\n /* Force scrollbar to always be visible */\n scrollbar-width: thin; /* Firefox */\n scrollbar-color: #888 #f1f1f1; /* Firefox - thumb and track colors */\n }\n\n /* Horizontal scroll mode: horizontal scrolling only */\n .facets-content.horizontal-scroll-mode {\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n /* Webkit browsers scrollbar styling - always visible */\n .facets-content::-webkit-scrollbar {\n width: 12px; /* Vertical scrollbar width */\n height: 12px; /* Horizontal scrollbar height */\n }\n\n .facets-content::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 6px;\n }\n\n .facets-content::-webkit-scrollbar-thumb {\n background: #888;\n border-radius: 6px;\n min-height: 30px; /* Ensure thumb is always visible when scrolling is possible */\n }\n\n .facets-content::-webkit-scrollbar-thumb:hover {\n background: #555;\n }\n\n /* Force corner to match track color */\n .facets-content::-webkit-scrollbar-corner {\n background: #f1f1f1;\n }\n\n .facets-horizontal-container {\n display: inline-block;\n min-width: 100%;\n /* Allow natural width expansion based on content */\n width: fit-content;\n }\n\n .scroll-nav-container {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-height: 0;\n }\n\n .scroll-nav-container .facets-content {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .scroll-arrow {\n background: none;\n border: none;\n cursor: pointer;\n padding: 5px;\n flex-shrink: 0;\n }\n\n .scroll-arrow svg {\n height: 14px;\n fill: #2c2c2c;\n }\n\n .scroll-arrow:disabled {\n opacity: 0.3;\n cursor: default;\n }\n .facets-loader {\n --icon-width: 70px;\n margin-bottom: 20px;\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 font-family: inherit;\n }\n .btn-cancel {\n background-color: #2c2c2c;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n more-facets-pagination {\n flex-shrink: 0;\n }\n\n .footer {\n text-align: center;\n margin-top: 10px;\n flex-shrink: 0;\n }\n\n @media (max-width: 560px) {\n section#more-facets.horizontal-scroll-mode,\n section#more-facets.pagination-mode {\n --facetsColumnCount: 1; /* Single column on mobile */\n --facetsMaxHeight: none; /* Remove fixed height for vertical scrolling */\n }\n /* On mobile, always use vertical scrolling regardless of mode */\n .facets-content,\n .facets-content.horizontal-scroll-mode {\n overflow-y: auto;\n overflow-x: hidden;\n }\n .scroll-nav-container {\n display: contents; /* Remove wrapper from layout so section flex-column works */\n }\n .scroll-arrow {\n display: none;\n }\n .filter-input {\n width: 120px;\n --input-font-size: 1.2rem;\n }\n }\n `,\n ];\n }\n}\n"]}
|
|
@@ -26,7 +26,8 @@ let MoreFacetsPagination = class MoreFacetsPagination extends LitElement {
|
|
|
26
26
|
changed.has('currentPage')) {
|
|
27
27
|
this.updatePages();
|
|
28
28
|
}
|
|
29
|
-
if (changed.has('currentPage')
|
|
29
|
+
if (changed.has('currentPage') &&
|
|
30
|
+
changed.get('currentPage') !== undefined) {
|
|
30
31
|
this.emitPageClick();
|
|
31
32
|
}
|
|
32
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"more-facets-pagination.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport arrowLeftIcon from '../assets/img/icons/arrow-left';\nimport arrowRightIcon from '../assets/img/icons/arrow-right';\nimport { srOnlyStyle } from '../styles/sr-only';\n\n@customElement('more-facets-pagination')\nexport class MoreFacetsPagination extends LitElement {\n /**\n * Total number of pages\n */\n @property({ type: Number }) size!: number;\n\n /**\n * Number of pages can be moved in back/forward\n */\n @property({ type: Number }) step = 2;\n\n @property({ type: Number }) currentPage: number = 1;\n\n /**\n * When true, shows a more compact set of page numbers\n * (only 1 neighbor on each side of the current page).\n */\n @property({ type: Boolean }) compact = false;\n\n @state() pages?: number[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override willUpdate(changed: Map<string, any>) {\n if (\n changed.has('size') ||\n changed.has('compact') ||\n changed.has('currentPage')\n ) {\n this.updatePages();\n }\n if (changed.has('currentPage')) {\n this.emitPageClick();\n }\n }\n\n /** creates `this.pages` array that notes which pages to draw\n * - `0` is elipses marker\n * - rule: selected page is centered between -2/+2 pages\n * - outlier: first page selected, show _1_ 2 3 ... N\n * - outlier: second page selected, show 1 _2_ 3 4 ... N\n * - outlier: last page selected, show 1 ... N-2 N-1 _N_\n * - outlier: if page count = 7, & selected is either [2, 3, 4, 5, 6], show all pages\n */\n updatePages() {\n this.pages = []; /* `0` is elipses marker */\n\n if (this.compact) {\n this.updatePagesCompact();\n return;\n }\n\n const paginatorMaxPagesToShow = 7;\n const atMinThreshold = this.size <= paginatorMaxPagesToShow;\n\n /** Display outliers */\n if (this.size <= 5) {\n // display all pages\n this.pages = [...Array(this.size).keys()].map(i => i + 1);\n return;\n }\n\n if (this.size === paginatorMaxPagesToShow) {\n // edge: 7 pages\n if (this.currentPage === 2) {\n this.pages = [1, 2, 3, 4, 0, this.size];\n return;\n }\n\n if (this.currentPage === this.size - 1) {\n this.pages = [1, 0, 4, 5, this.size - 1, this.size];\n return;\n }\n }\n\n if (this.currentPage === 1) {\n // first page\n this.pages = [1, 2, 3, 0, this.size];\n return;\n }\n\n if (this.currentPage === this.size) {\n // last page\n this.pages = [1, 0, this.size - 2, this.size - 1, this.size];\n return;\n }\n\n if (this.currentPage === this.size - 1) {\n // second last page\n this.pages = [\n 1,\n 0,\n this.size - 3,\n this.size - 2,\n this.size - 1,\n this.size,\n ];\n return;\n }\n\n if (\n atMinThreshold &&\n this.currentPage > 1 &&\n this.currentPage < paginatorMaxPagesToShow\n ) {\n this.pages = [...Array(this.size).keys()].map(i => i + 1);\n return;\n }\n\n /* The rest here calculates the range to display in \"page window\" */\n let startPage = this.currentPage - this.step;\n let endPage = this.currentPage + this.step;\n\n if (startPage <= 0) {\n endPage += -startPage + 1;\n startPage = 1;\n }\n\n if (endPage >= this.size) {\n startPage = Math.max(startPage - (endPage - this.size), 1);\n endPage = this.size;\n }\n\n if (startPage === 2) {\n endPage -= 1;\n }\n\n if (endPage === this.size - 1) {\n startPage += 1;\n }\n\n // create first page node\n this.createFirstNode(startPage);\n\n // create middle pages node\n this.createMiddelNode(startPage, endPage);\n\n // create last page node\n this.createLastNode(endPage);\n }\n\n private createFirstNode(startPage: number) {\n if (startPage > 1) {\n this.pages?.push(1);\n }\n if (startPage > 2) {\n this.pages?.push(0); // let's asssume 0 is for ellipsis template\n }\n }\n\n private createMiddelNode(startPage: number, endPage: number) {\n for (let page = startPage; page <= endPage; page += 1) {\n this.pages?.push(page);\n }\n }\n\n private createLastNode(endPage: number) {\n if (endPage < this.size - 1) {\n this.pages?.push(0); // let's asssume 0 is for ellipsis template\n }\n if (endPage < this.size) {\n this.pages?.push(this.size);\n }\n }\n\n /**\n * Compact page calculation: shows first, ..., prev, current, next, ..., last.\n * Only 1 neighbor on each side of the current page for minimal width.\n */\n private updatePagesCompact() {\n if (this.size <= 3) {\n this.pages = [...Array(this.size).keys()].map(i => i + 1);\n return;\n }\n\n const pages: number[] = [];\n\n // First page\n pages.push(1);\n\n // Ellipsis after first if current is far enough away\n if (this.currentPage > 3) {\n pages.push(0);\n }\n\n // Previous page (if not already shown as first)\n if (this.currentPage - 1 > 1) {\n pages.push(this.currentPage - 1);\n }\n\n // Current page (if not first or last)\n if (this.currentPage !== 1 && this.currentPage !== this.size) {\n pages.push(this.currentPage);\n }\n\n // Next page (if not already the last)\n if (this.currentPage + 1 < this.size) {\n pages.push(this.currentPage + 1);\n }\n\n // Ellipsis before last if current is far enough away\n if (this.currentPage < this.size - 2) {\n pages.push(0);\n }\n\n // Last page\n pages.push(this.size);\n\n this.pages = pages;\n }\n\n private get getEllipsisTemplate() {\n return html`<i class=\"ellipses\">...</i>`;\n }\n\n emitPageClick() {\n this.dispatchEvent(\n new CustomEvent('pageNumberClicked', {\n detail: { page: this.currentPage },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private onRewind() {\n this.currentPage -= 1;\n if (this.currentPage < 1) {\n this.currentPage = 1;\n }\n }\n\n private onForward() {\n this.currentPage += 1;\n if (this.currentPage > this.size) {\n this.currentPage = this.size;\n }\n }\n\n private onChange(page: number) {\n this.currentPage = page;\n }\n\n private getPageTemplate(page: number) {\n return html`\n <button\n @click=${() => this.onChange(page)}\n class=${this.currentPage === page ? 'current' : ''}\n data-page=${page}\n >\n ${page}\n </button>\n `;\n }\n\n private get getPagesTemplate(): TemplateResult | typeof nothing {\n if (!this.pages || !this.pages.length) {\n return nothing;\n }\n\n return html`\n ${this.pages?.map(\n page =>\n html`${page !== 0\n ? this.getPageTemplate(page)\n : this.getEllipsisTemplate}`,\n )}\n `;\n }\n\n render() {\n return html`\n <div class=\"facets-pagination\">\n <button class=\"arrow-icon rewind\" @click=${this.onRewind}>\n <span class=\"sr-only\">Rewind pagination:</span>\n ${arrowLeftIcon}\n </button>\n <div class=\"page-numbers\">${this.getPagesTemplate}</div>\n <button class=\"arrow-icon forward\" @click=${this.onForward}>\n <span class=\"sr-only\">Forward pagination:</span>\n ${arrowRightIcon}\n </button>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return [\n srOnlyStyle,\n css`\n .facets-pagination {\n user-select: none;\n margin-top: 10px;\n background-color: #eee;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n }\n .facets-pagination button {\n border: none;\n background: none;\n }\n .facets-pagination .arrow-icon {\n width: 2.5rem;\n vertical-align: middle;\n }\n .facets-pagination .arrow-icon svg {\n height: 14px;\n fill: #2c2c2c;\n }\n .facets-pagination button,\n .facets-pagination i {\n background: none;\n border: 0;\n cursor: pointer;\n border-radius: 4px;\n margin: 10px 5px;\n padding: 5px;\n font-size: 1.4rem;\n color: inherit;\n vertical-align: baseline;\n display: inline-block;\n min-width: 2.5rem;\n font-family: inherit;\n }\n .facets-pagination i {\n cursor: auto;\n display: inline;\n }\n .facets-pagination button.current {\n background: #2c2c2c;\n color: white;\n }\n .page-numbers {\n display: inline-block;\n }\n\n @media (max-width: 560px) {\n .facets-pagination button,\n .facets-pagination i {\n margin: 5px 2px;\n padding: 3px;\n min-width: 2rem;\n font-size: 1.2rem;\n }\n }\n `,\n ];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"more-facets-pagination.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport arrowLeftIcon from '../assets/img/icons/arrow-left';\nimport arrowRightIcon from '../assets/img/icons/arrow-right';\nimport { srOnlyStyle } from '../styles/sr-only';\n\n@customElement('more-facets-pagination')\nexport class MoreFacetsPagination extends LitElement {\n /**\n * Total number of pages\n */\n @property({ type: Number }) size!: number;\n\n /**\n * Number of pages can be moved in back/forward\n */\n @property({ type: Number }) step = 2;\n\n @property({ type: Number }) currentPage: number = 1;\n\n /**\n * When true, shows a more compact set of page numbers\n * (only 1 neighbor on each side of the current page).\n */\n @property({ type: Boolean }) compact = false;\n\n @state() pages?: number[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override willUpdate(changed: Map<string, any>) {\n if (\n changed.has('size') ||\n changed.has('compact') ||\n changed.has('currentPage')\n ) {\n this.updatePages();\n }\n if (\n changed.has('currentPage') &&\n changed.get('currentPage') !== undefined\n ) {\n this.emitPageClick();\n }\n }\n\n /** creates `this.pages` array that notes which pages to draw\n * - `0` is elipses marker\n * - rule: selected page is centered between -2/+2 pages\n * - outlier: first page selected, show _1_ 2 3 ... N\n * - outlier: second page selected, show 1 _2_ 3 4 ... N\n * - outlier: last page selected, show 1 ... N-2 N-1 _N_\n * - outlier: if page count = 7, & selected is either [2, 3, 4, 5, 6], show all pages\n */\n updatePages() {\n this.pages = []; /* `0` is elipses marker */\n\n if (this.compact) {\n this.updatePagesCompact();\n return;\n }\n\n const paginatorMaxPagesToShow = 7;\n const atMinThreshold = this.size <= paginatorMaxPagesToShow;\n\n /** Display outliers */\n if (this.size <= 5) {\n // display all pages\n this.pages = [...Array(this.size).keys()].map(i => i + 1);\n return;\n }\n\n if (this.size === paginatorMaxPagesToShow) {\n // edge: 7 pages\n if (this.currentPage === 2) {\n this.pages = [1, 2, 3, 4, 0, this.size];\n return;\n }\n\n if (this.currentPage === this.size - 1) {\n this.pages = [1, 0, 4, 5, this.size - 1, this.size];\n return;\n }\n }\n\n if (this.currentPage === 1) {\n // first page\n this.pages = [1, 2, 3, 0, this.size];\n return;\n }\n\n if (this.currentPage === this.size) {\n // last page\n this.pages = [1, 0, this.size - 2, this.size - 1, this.size];\n return;\n }\n\n if (this.currentPage === this.size - 1) {\n // second last page\n this.pages = [\n 1,\n 0,\n this.size - 3,\n this.size - 2,\n this.size - 1,\n this.size,\n ];\n return;\n }\n\n if (\n atMinThreshold &&\n this.currentPage > 1 &&\n this.currentPage < paginatorMaxPagesToShow\n ) {\n this.pages = [...Array(this.size).keys()].map(i => i + 1);\n return;\n }\n\n /* The rest here calculates the range to display in \"page window\" */\n let startPage = this.currentPage - this.step;\n let endPage = this.currentPage + this.step;\n\n if (startPage <= 0) {\n endPage += -startPage + 1;\n startPage = 1;\n }\n\n if (endPage >= this.size) {\n startPage = Math.max(startPage - (endPage - this.size), 1);\n endPage = this.size;\n }\n\n if (startPage === 2) {\n endPage -= 1;\n }\n\n if (endPage === this.size - 1) {\n startPage += 1;\n }\n\n // create first page node\n this.createFirstNode(startPage);\n\n // create middle pages node\n this.createMiddelNode(startPage, endPage);\n\n // create last page node\n this.createLastNode(endPage);\n }\n\n private createFirstNode(startPage: number) {\n if (startPage > 1) {\n this.pages?.push(1);\n }\n if (startPage > 2) {\n this.pages?.push(0); // let's asssume 0 is for ellipsis template\n }\n }\n\n private createMiddelNode(startPage: number, endPage: number) {\n for (let page = startPage; page <= endPage; page += 1) {\n this.pages?.push(page);\n }\n }\n\n private createLastNode(endPage: number) {\n if (endPage < this.size - 1) {\n this.pages?.push(0); // let's asssume 0 is for ellipsis template\n }\n if (endPage < this.size) {\n this.pages?.push(this.size);\n }\n }\n\n /**\n * Compact page calculation: shows first, ..., prev, current, next, ..., last.\n * Only 1 neighbor on each side of the current page for minimal width.\n */\n private updatePagesCompact() {\n if (this.size <= 3) {\n this.pages = [...Array(this.size).keys()].map(i => i + 1);\n return;\n }\n\n const pages: number[] = [];\n\n // First page\n pages.push(1);\n\n // Ellipsis after first if current is far enough away\n if (this.currentPage > 3) {\n pages.push(0);\n }\n\n // Previous page (if not already shown as first)\n if (this.currentPage - 1 > 1) {\n pages.push(this.currentPage - 1);\n }\n\n // Current page (if not first or last)\n if (this.currentPage !== 1 && this.currentPage !== this.size) {\n pages.push(this.currentPage);\n }\n\n // Next page (if not already the last)\n if (this.currentPage + 1 < this.size) {\n pages.push(this.currentPage + 1);\n }\n\n // Ellipsis before last if current is far enough away\n if (this.currentPage < this.size - 2) {\n pages.push(0);\n }\n\n // Last page\n pages.push(this.size);\n\n this.pages = pages;\n }\n\n private get getEllipsisTemplate() {\n return html`<i class=\"ellipses\">...</i>`;\n }\n\n emitPageClick() {\n this.dispatchEvent(\n new CustomEvent('pageNumberClicked', {\n detail: { page: this.currentPage },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private onRewind() {\n this.currentPage -= 1;\n if (this.currentPage < 1) {\n this.currentPage = 1;\n }\n }\n\n private onForward() {\n this.currentPage += 1;\n if (this.currentPage > this.size) {\n this.currentPage = this.size;\n }\n }\n\n private onChange(page: number) {\n this.currentPage = page;\n }\n\n private getPageTemplate(page: number) {\n return html`\n <button\n @click=${() => this.onChange(page)}\n class=${this.currentPage === page ? 'current' : ''}\n data-page=${page}\n >\n ${page}\n </button>\n `;\n }\n\n private get getPagesTemplate(): TemplateResult | typeof nothing {\n if (!this.pages || !this.pages.length) {\n return nothing;\n }\n\n return html`\n ${this.pages?.map(\n page =>\n html`${page !== 0\n ? this.getPageTemplate(page)\n : this.getEllipsisTemplate}`,\n )}\n `;\n }\n\n render() {\n return html`\n <div class=\"facets-pagination\">\n <button class=\"arrow-icon rewind\" @click=${this.onRewind}>\n <span class=\"sr-only\">Rewind pagination:</span>\n ${arrowLeftIcon}\n </button>\n <div class=\"page-numbers\">${this.getPagesTemplate}</div>\n <button class=\"arrow-icon forward\" @click=${this.onForward}>\n <span class=\"sr-only\">Forward pagination:</span>\n ${arrowRightIcon}\n </button>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return [\n srOnlyStyle,\n css`\n .facets-pagination {\n user-select: none;\n margin-top: 10px;\n background-color: #eee;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n }\n .facets-pagination button {\n border: none;\n background: none;\n }\n .facets-pagination .arrow-icon {\n width: 2.5rem;\n vertical-align: middle;\n }\n .facets-pagination .arrow-icon svg {\n height: 14px;\n fill: #2c2c2c;\n }\n .facets-pagination button,\n .facets-pagination i {\n background: none;\n border: 0;\n cursor: pointer;\n border-radius: 4px;\n margin: 10px 5px;\n padding: 5px;\n font-size: 1.4rem;\n color: inherit;\n vertical-align: baseline;\n display: inline-block;\n min-width: 2.5rem;\n font-family: inherit;\n }\n .facets-pagination i {\n cursor: auto;\n display: inline;\n }\n .facets-pagination button.current {\n background: #2c2c2c;\n color: white;\n }\n .page-numbers {\n display: inline-block;\n }\n\n @media (max-width: 560px) {\n .facets-pagination button,\n .facets-pagination i {\n margin: 5px 2px;\n padding: 3px;\n min-width: 2rem;\n font-size: 1.2rem;\n }\n }\n `,\n ];\n }\n}\n"]}
|
|
@@ -269,6 +269,56 @@ describe('More facets content', () => {
|
|
|
269
269
|
// Verify the filter was cleared
|
|
270
270
|
expect(clearableInput.value).to.equal('');
|
|
271
271
|
});
|
|
272
|
+
describe('Modal container height constraint', () => {
|
|
273
|
+
// Register a test wrapper element to simulate the modal's scroll container
|
|
274
|
+
if (!customElements.get('test-scroll-wrapper')) {
|
|
275
|
+
customElements.define('test-scroll-wrapper', class extends HTMLElement {
|
|
276
|
+
constructor() {
|
|
277
|
+
super();
|
|
278
|
+
this.attachShadow({ mode: 'open' });
|
|
279
|
+
this.shadowRoot.innerHTML = `
|
|
280
|
+
<style>
|
|
281
|
+
:host { display: block; }
|
|
282
|
+
.content { overflow-y: auto; max-height: 300px; }
|
|
283
|
+
</style>
|
|
284
|
+
<div class="content"><slot></slot></div>
|
|
285
|
+
`;
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
it('should constrain section height when inside a scroll container', async () => {
|
|
290
|
+
const el = await fixture(html `
|
|
291
|
+
<test-scroll-wrapper>
|
|
292
|
+
<more-facets-content></more-facets-content>
|
|
293
|
+
</test-scroll-wrapper>
|
|
294
|
+
`);
|
|
295
|
+
const mfc = el.querySelector('more-facets-content');
|
|
296
|
+
mfc.facetsLoading = false;
|
|
297
|
+
await mfc.updateComplete;
|
|
298
|
+
// Wait for the constrainToScrollContainer rAF callback
|
|
299
|
+
await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)));
|
|
300
|
+
const section = mfc.shadowRoot?.querySelector('section#more-facets');
|
|
301
|
+
// The section's inline max-height should be set when it would
|
|
302
|
+
// overflow the 300px scroll container
|
|
303
|
+
const sectionHeight = section.getBoundingClientRect().height;
|
|
304
|
+
const wrapper = el.shadowRoot?.querySelector('.content');
|
|
305
|
+
const wrapperBottom = wrapper.getBoundingClientRect().bottom;
|
|
306
|
+
const sectionTop = section.getBoundingClientRect().top;
|
|
307
|
+
const availableSpace = wrapperBottom - sectionTop;
|
|
308
|
+
// The section should not exceed the available space in the container
|
|
309
|
+
expect(sectionHeight).to.be.at.most(availableSpace + 1); // +1 for rounding
|
|
310
|
+
});
|
|
311
|
+
it('should not constrain section when no scroll container exists', async () => {
|
|
312
|
+
const el = await fixture(html `<more-facets-content></more-facets-content>`);
|
|
313
|
+
el.facetsLoading = false;
|
|
314
|
+
await el.updateComplete;
|
|
315
|
+
// Wait for the constrainToScrollContainer rAF callback
|
|
316
|
+
await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)));
|
|
317
|
+
const section = el.shadowRoot?.querySelector('section#more-facets');
|
|
318
|
+
// No inline max-height should be set when there's no scroll container
|
|
319
|
+
expect(section.style.maxHeight).to.equal('');
|
|
320
|
+
});
|
|
321
|
+
});
|
|
272
322
|
describe('Horizontal scroll navigation arrows', () => {
|
|
273
323
|
it('should use scroll-nav-container in horizontal scroll mode', async () => {
|
|
274
324
|
const searchService = new MockSearchService();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"more-facets-content.test.js","sourceRoot":"","sources":["../../../test/collection-facets/more-facets-content.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { aTimeout, expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { MoreFacetsContent } from '../../src/collection-facets/more-facets-content';\nimport '../../src/collection-facets/more-facets-content';\nimport { MockSearchService } from '../mocks/mock-search-service';\nimport { MockAnalyticsHandler } from '../mocks/mock-analytics-handler';\nimport type { FacetsTemplate } from '../../src/collection-facets/facets-template';\nimport {\n getDefaultSelectedFacets,\n type SelectedFacets,\n} from '../../src/models';\n\nconst selectedFacetsGroup = {\n title: 'Media Type',\n key: 'mediatype',\n buckets: [\n { displayText: 'audio', key: 'audio', count: 1001, state: 'none' },\n { displayText: 'movies', key: 'movies', count: 901, state: 'none' },\n { displayText: 'texts', key: 'texts', count: 2101, state: 'none' },\n { displayText: 'data', key: 'data', count: 230, state: 'none' },\n { displayText: 'web', key: 'web', count: 453, state: 'none' },\n ],\n};\n\nconst yearSelectedFacets: SelectedFacets = {\n mediatype: {},\n lending: {},\n year: {\n '2000': { key: '2000', count: 5, state: 'selected' },\n },\n subject: {},\n collection: {},\n creator: {},\n language: {},\n};\n\ndescribe('More facets content', () => {\n it('should render more facets template', async () => {\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content></more-facets-content>`,\n );\n\n el.facetsLoading = false;\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.facets-content')).to.exist;\n });\n\n it('should render more facets loader template', async () => {\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content></more-facets-content>`,\n );\n\n el.facetsLoading = true;\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.facets-loader')).to.exist;\n });\n\n it('should NOT render pagination when facet count < 1000', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets'; // Produces a response with 45 aggregations (< 1000)\n await el.updateComplete;\n await aTimeout(50); // Give it a moment to perform the (mock) search query after the initial update\n\n // Verify pagination component is NOT present (horizontal scroll mode)\n expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.not.exist;\n\n // Verify horizontal scroll mode CSS class is applied\n expect(\n el.shadowRoot?.querySelector('.facets-content.horizontal-scroll-mode'),\n ).to.exist;\n\n // Verify footer still exists with buttons\n expect(el.shadowRoot?.querySelector('.footer')).to.exist;\n expect(el.shadowRoot?.querySelector('.btn-cancel')).to.exist;\n expect(el.shadowRoot?.querySelector('.btn-submit')).to.exist;\n });\n\n it('query for more facets content using search service', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'collection';\n el.query = 'collection-aggregations';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal(\n 'collection-aggregations',\n );\n });\n\n it('queries for more facets using search service within a collection (no query)', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .pageSpecifierParams=${{\n pageType: 'collection_details',\n pageTarget: 'foobar',\n }}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.be.empty;\n expect(searchService.searchParams?.pageTarget).to.equal('foobar');\n });\n\n it('queries for more facets using search service within a collection (with query)', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .pageSpecifierParams=${{\n pageType: 'collection_details',\n pageTarget: 'foobar',\n }}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'title:hello';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('title:hello');\n expect(searchService.searchParams?.pageTarget).to.equal('foobar');\n });\n\n it('filter raw selectedFacets object', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${selectedFacetsGroup}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'collection';\n el.query = 'title:hello';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('title:hello');\n });\n\n it('combines selectedFacets and aggregationFacets and renders on modal', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'year'}\n .query=${'more-facets'}\n .searchService=${searchService}\n .selectedFacets=${yearSelectedFacets}\n ></more-facets-content>`,\n );\n\n const facetsTemplate = el.shadowRoot?.querySelector(\n 'facets-template',\n ) as FacetsTemplate;\n expect(facetsTemplate).to.exist;\n\n const { facetGroup } = facetsTemplate;\n expect(facetGroup?.key).to.equal('year');\n expect(facetGroup?.title).to.equal('Year');\n\n // First bucket is the one that was included in the selected facets\n const firstBucket = facetGroup?.buckets[0];\n expect(firstBucket?.key).to.equal('2000');\n expect(firstBucket?.count).to.equal(5);\n\n // Second bucket is the most recent year, since year facets default to descending order of year\n const secondBucket = facetGroup?.buckets[1];\n expect(secondBucket?.key).to.equal('2024');\n expect(secondBucket?.count).to.equal(5);\n });\n\n it('cancel button clicked event', async () => {\n const searchService = new MockSearchService();\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'collection'}\n .query=${'collection-aggregations'}\n .searchService=${searchService}\n .analyticsHandler=${mockAnalyticsHandler}\n ></more-facets-content>`,\n );\n\n // select cancel button\n const cancelButton = el.shadowRoot?.querySelector(\n '.footer > .btn-cancel',\n ) as HTMLButtonElement;\n expect(cancelButton).to.exist;\n cancelButton?.click();\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('closeMoreFacetsModal');\n expect(mockAnalyticsHandler.callLabel).to.equal('collection');\n });\n\n it('facet apply button clicked event', async () => {\n const searchService = new MockSearchService();\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'collection'}\n .query=${'collection-aggregations'}\n .searchService=${searchService}\n .analyticsHandler=${mockAnalyticsHandler}\n ></more-facets-content>`,\n );\n\n // select submit button\n const submitButton = el.shadowRoot?.querySelector(\n '.footer > .btn-submit',\n ) as HTMLButtonElement;\n expect(submitButton).to.exist;\n submitButton?.click();\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('applyMoreFacetsModal');\n expect(mockAnalyticsHandler.callLabel).to.equal('collection');\n });\n\n it('should have horizontal scrolling enabled', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets';\n await el.updateComplete;\n await aTimeout(50);\n\n const facetsContent = el.shadowRoot?.querySelector(\n '.facets-content',\n ) as HTMLElement;\n const styles = window.getComputedStyle(facetsContent);\n\n expect(styles.overflowX).to.equal('auto');\n expect(styles.overflowY).to.equal('hidden');\n });\n\n it('should have horizontal container wrapper', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets';\n await el.updateComplete;\n await aTimeout(50);\n\n const container = el.shadowRoot?.querySelector(\n '.facets-horizontal-container',\n );\n expect(container).to.exist;\n\n const facetsTemplate = container?.querySelector('facets-template');\n expect(facetsTemplate).to.exist;\n });\n\n it('should render pagination when facet count >= 1000', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${getDefaultSelectedFacets()}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'large-facets'; // Produces a response with 1100 aggregations (>= 1000)\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify pagination component IS present\n expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.exist;\n\n // Verify pagination mode CSS class is applied\n expect(el.shadowRoot?.querySelector('.facets-content.pagination-mode')).to\n .exist;\n\n // Verify horizontal container wrapper does NOT exist in pagination mode\n expect(el.shadowRoot?.querySelector('.facets-horizontal-container')).to.not\n .exist;\n });\n\n it('pagination page change should send analytics event', async () => {\n const searchService = new MockSearchService();\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${getDefaultSelectedFacets()}\n .analyticsHandler=${mockAnalyticsHandler}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'large-facets'; // Produces a response with 1100 aggregations (>= 1000)\n await el.updateComplete;\n await aTimeout(50);\n\n // Get the pagination component\n const pagination = el.shadowRoot?.querySelector(\n 'more-facets-pagination',\n ) as any;\n expect(pagination).to.exist;\n\n // Simulate clicking page 2\n pagination.currentPage = 2;\n await pagination.updateComplete;\n\n // Verify analytics event was sent\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('moreFacetsPageChange');\n expect(mockAnalyticsHandler.callLabel).to.equal('2');\n });\n\n it('should render clearable text input for filtering', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'year'}\n .query=${'more-facets'}\n .searchService=${searchService}\n .selectedFacets=${yearSelectedFacets}\n ></more-facets-content>`,\n );\n\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify the clearable text input component is present\n const clearableInput = el.shadowRoot?.querySelector(\n 'ia-clearable-text-input',\n ) as HTMLElement;\n expect(clearableInput).to.exist;\n });\n\n it('should clear filter text when clear event is dispatched', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'year'}\n .query=${'more-facets'}\n .searchService=${searchService}\n .selectedFacets=${yearSelectedFacets}\n ></more-facets-content>`,\n );\n\n await el.updateComplete;\n await aTimeout(50);\n\n // Simulate typing into the clearable input by dispatching input event\n const clearableInput = el.shadowRoot?.querySelector(\n 'ia-clearable-text-input',\n ) as HTMLElement & { value: string };\n expect(clearableInput).to.exist;\n\n clearableInput.value = 'test';\n clearableInput.dispatchEvent(new Event('input'));\n await el.updateComplete;\n\n // Dispatch clear event\n clearableInput.dispatchEvent(new CustomEvent('clear', { detail: 'test' }));\n await el.updateComplete;\n\n // Verify the filter was cleared\n expect(clearableInput.value).to.equal('');\n });\n\n describe('Horizontal scroll navigation arrows', () => {\n it('should use scroll-nav-container in horizontal scroll mode', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets'; // Produces < 1000 aggregations\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify scroll navigation container exists in horizontal scroll mode\n expect(el.shadowRoot?.querySelector('.scroll-nav-container')).to.exist;\n\n // Verify horizontal container and facets-content exist inside it\n expect(\n el.shadowRoot?.querySelector(\n '.scroll-nav-container .facets-content.horizontal-scroll-mode',\n ),\n ).to.exist;\n expect(\n el.shadowRoot?.querySelector(\n '.scroll-nav-container .facets-horizontal-container',\n ),\n ).to.exist;\n });\n\n it('should NOT show scroll arrows in pagination mode', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${getDefaultSelectedFacets()}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'large-facets'; // Produces >= 1000 aggregations\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify scroll navigation container does NOT exist\n expect(el.shadowRoot?.querySelector('.scroll-nav-container')).to.not\n .exist;\n expect(el.shadowRoot?.querySelector('.scroll-arrow')).to.not.exist;\n });\n\n it('should hide scroll arrows when content does not overflow', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets';\n await el.updateComplete;\n await aTimeout(50);\n\n // In test environment, there's no real layout so scrollWidth === clientWidth.\n // Arrows should be hidden when there's no horizontal overflow.\n expect(el.shadowRoot?.querySelector('.scroll-arrow')).to.not.exist;\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"more-facets-content.test.js","sourceRoot":"","sources":["../../../test/collection-facets/more-facets-content.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { aTimeout, expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { MoreFacetsContent } from '../../src/collection-facets/more-facets-content';\nimport '../../src/collection-facets/more-facets-content';\nimport { MockSearchService } from '../mocks/mock-search-service';\nimport { MockAnalyticsHandler } from '../mocks/mock-analytics-handler';\nimport type { FacetsTemplate } from '../../src/collection-facets/facets-template';\nimport {\n getDefaultSelectedFacets,\n type SelectedFacets,\n} from '../../src/models';\n\nconst selectedFacetsGroup = {\n title: 'Media Type',\n key: 'mediatype',\n buckets: [\n { displayText: 'audio', key: 'audio', count: 1001, state: 'none' },\n { displayText: 'movies', key: 'movies', count: 901, state: 'none' },\n { displayText: 'texts', key: 'texts', count: 2101, state: 'none' },\n { displayText: 'data', key: 'data', count: 230, state: 'none' },\n { displayText: 'web', key: 'web', count: 453, state: 'none' },\n ],\n};\n\nconst yearSelectedFacets: SelectedFacets = {\n mediatype: {},\n lending: {},\n year: {\n '2000': { key: '2000', count: 5, state: 'selected' },\n },\n subject: {},\n collection: {},\n creator: {},\n language: {},\n};\n\ndescribe('More facets content', () => {\n it('should render more facets template', async () => {\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content></more-facets-content>`,\n );\n\n el.facetsLoading = false;\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.facets-content')).to.exist;\n });\n\n it('should render more facets loader template', async () => {\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content></more-facets-content>`,\n );\n\n el.facetsLoading = true;\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.facets-loader')).to.exist;\n });\n\n it('should NOT render pagination when facet count < 1000', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets'; // Produces a response with 45 aggregations (< 1000)\n await el.updateComplete;\n await aTimeout(50); // Give it a moment to perform the (mock) search query after the initial update\n\n // Verify pagination component is NOT present (horizontal scroll mode)\n expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.not.exist;\n\n // Verify horizontal scroll mode CSS class is applied\n expect(\n el.shadowRoot?.querySelector('.facets-content.horizontal-scroll-mode'),\n ).to.exist;\n\n // Verify footer still exists with buttons\n expect(el.shadowRoot?.querySelector('.footer')).to.exist;\n expect(el.shadowRoot?.querySelector('.btn-cancel')).to.exist;\n expect(el.shadowRoot?.querySelector('.btn-submit')).to.exist;\n });\n\n it('query for more facets content using search service', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'collection';\n el.query = 'collection-aggregations';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal(\n 'collection-aggregations',\n );\n });\n\n it('queries for more facets using search service within a collection (no query)', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .pageSpecifierParams=${{\n pageType: 'collection_details',\n pageTarget: 'foobar',\n }}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.be.empty;\n expect(searchService.searchParams?.pageTarget).to.equal('foobar');\n });\n\n it('queries for more facets using search service within a collection (with query)', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .pageSpecifierParams=${{\n pageType: 'collection_details',\n pageTarget: 'foobar',\n }}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'title:hello';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('title:hello');\n expect(searchService.searchParams?.pageTarget).to.equal('foobar');\n });\n\n it('filter raw selectedFacets object', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${selectedFacetsGroup}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'collection';\n el.query = 'title:hello';\n await el.updateComplete;\n\n expect(searchService.searchParams?.query).to.equal('title:hello');\n });\n\n it('combines selectedFacets and aggregationFacets and renders on modal', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'year'}\n .query=${'more-facets'}\n .searchService=${searchService}\n .selectedFacets=${yearSelectedFacets}\n ></more-facets-content>`,\n );\n\n const facetsTemplate = el.shadowRoot?.querySelector(\n 'facets-template',\n ) as FacetsTemplate;\n expect(facetsTemplate).to.exist;\n\n const { facetGroup } = facetsTemplate;\n expect(facetGroup?.key).to.equal('year');\n expect(facetGroup?.title).to.equal('Year');\n\n // First bucket is the one that was included in the selected facets\n const firstBucket = facetGroup?.buckets[0];\n expect(firstBucket?.key).to.equal('2000');\n expect(firstBucket?.count).to.equal(5);\n\n // Second bucket is the most recent year, since year facets default to descending order of year\n const secondBucket = facetGroup?.buckets[1];\n expect(secondBucket?.key).to.equal('2024');\n expect(secondBucket?.count).to.equal(5);\n });\n\n it('cancel button clicked event', async () => {\n const searchService = new MockSearchService();\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'collection'}\n .query=${'collection-aggregations'}\n .searchService=${searchService}\n .analyticsHandler=${mockAnalyticsHandler}\n ></more-facets-content>`,\n );\n\n // select cancel button\n const cancelButton = el.shadowRoot?.querySelector(\n '.footer > .btn-cancel',\n ) as HTMLButtonElement;\n expect(cancelButton).to.exist;\n cancelButton?.click();\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('closeMoreFacetsModal');\n expect(mockAnalyticsHandler.callLabel).to.equal('collection');\n });\n\n it('facet apply button clicked event', async () => {\n const searchService = new MockSearchService();\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'collection'}\n .query=${'collection-aggregations'}\n .searchService=${searchService}\n .analyticsHandler=${mockAnalyticsHandler}\n ></more-facets-content>`,\n );\n\n // select submit button\n const submitButton = el.shadowRoot?.querySelector(\n '.footer > .btn-submit',\n ) as HTMLButtonElement;\n expect(submitButton).to.exist;\n submitButton?.click();\n\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('applyMoreFacetsModal');\n expect(mockAnalyticsHandler.callLabel).to.equal('collection');\n });\n\n it('should have horizontal scrolling enabled', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets';\n await el.updateComplete;\n await aTimeout(50);\n\n const facetsContent = el.shadowRoot?.querySelector(\n '.facets-content',\n ) as HTMLElement;\n const styles = window.getComputedStyle(facetsContent);\n\n expect(styles.overflowX).to.equal('auto');\n expect(styles.overflowY).to.equal('hidden');\n });\n\n it('should have horizontal container wrapper', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets';\n await el.updateComplete;\n await aTimeout(50);\n\n const container = el.shadowRoot?.querySelector(\n '.facets-horizontal-container',\n );\n expect(container).to.exist;\n\n const facetsTemplate = container?.querySelector('facets-template');\n expect(facetsTemplate).to.exist;\n });\n\n it('should render pagination when facet count >= 1000', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${getDefaultSelectedFacets()}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'large-facets'; // Produces a response with 1100 aggregations (>= 1000)\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify pagination component IS present\n expect(el.shadowRoot?.querySelector('more-facets-pagination')).to.exist;\n\n // Verify pagination mode CSS class is applied\n expect(el.shadowRoot?.querySelector('.facets-content.pagination-mode')).to\n .exist;\n\n // Verify horizontal container wrapper does NOT exist in pagination mode\n expect(el.shadowRoot?.querySelector('.facets-horizontal-container')).to.not\n .exist;\n });\n\n it('pagination page change should send analytics event', async () => {\n const searchService = new MockSearchService();\n const mockAnalyticsHandler = new MockAnalyticsHandler();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${getDefaultSelectedFacets()}\n .analyticsHandler=${mockAnalyticsHandler}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'large-facets'; // Produces a response with 1100 aggregations (>= 1000)\n await el.updateComplete;\n await aTimeout(50);\n\n // Get the pagination component\n const pagination = el.shadowRoot?.querySelector(\n 'more-facets-pagination',\n ) as any;\n expect(pagination).to.exist;\n\n // Simulate clicking page 2\n pagination.currentPage = 2;\n await pagination.updateComplete;\n\n // Verify analytics event was sent\n expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');\n expect(mockAnalyticsHandler.callAction).to.equal('moreFacetsPageChange');\n expect(mockAnalyticsHandler.callLabel).to.equal('2');\n });\n\n it('should render clearable text input for filtering', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'year'}\n .query=${'more-facets'}\n .searchService=${searchService}\n .selectedFacets=${yearSelectedFacets}\n ></more-facets-content>`,\n );\n\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify the clearable text input component is present\n const clearableInput = el.shadowRoot?.querySelector(\n 'ia-clearable-text-input',\n ) as HTMLElement;\n expect(clearableInput).to.exist;\n });\n\n it('should clear filter text when clear event is dispatched', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .facetKey=${'year'}\n .query=${'more-facets'}\n .searchService=${searchService}\n .selectedFacets=${yearSelectedFacets}\n ></more-facets-content>`,\n );\n\n await el.updateComplete;\n await aTimeout(50);\n\n // Simulate typing into the clearable input by dispatching input event\n const clearableInput = el.shadowRoot?.querySelector(\n 'ia-clearable-text-input',\n ) as HTMLElement & { value: string };\n expect(clearableInput).to.exist;\n\n clearableInput.value = 'test';\n clearableInput.dispatchEvent(new Event('input'));\n await el.updateComplete;\n\n // Dispatch clear event\n clearableInput.dispatchEvent(new CustomEvent('clear', { detail: 'test' }));\n await el.updateComplete;\n\n // Verify the filter was cleared\n expect(clearableInput.value).to.equal('');\n });\n\n describe('Modal container height constraint', () => {\n // Register a test wrapper element to simulate the modal's scroll container\n if (!customElements.get('test-scroll-wrapper')) {\n customElements.define(\n 'test-scroll-wrapper',\n class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n this.shadowRoot!.innerHTML = `\n <style>\n :host { display: block; }\n .content { overflow-y: auto; max-height: 300px; }\n </style>\n <div class=\"content\"><slot></slot></div>\n `;\n }\n },\n );\n }\n\n it('should constrain section height when inside a scroll container', async () => {\n const el = await fixture<MoreFacetsContent>(html`\n <test-scroll-wrapper>\n <more-facets-content></more-facets-content>\n </test-scroll-wrapper>\n `);\n\n const mfc = el.querySelector('more-facets-content') as MoreFacetsContent;\n mfc.facetsLoading = false;\n await mfc.updateComplete;\n\n // Wait for the constrainToScrollContainer rAF callback\n await new Promise(r =>\n requestAnimationFrame(() => requestAnimationFrame(r)),\n );\n\n const section = mfc.shadowRoot?.querySelector(\n 'section#more-facets',\n ) as HTMLElement;\n\n // The section's inline max-height should be set when it would\n // overflow the 300px scroll container\n const sectionHeight = section.getBoundingClientRect().height;\n const wrapper = el.shadowRoot?.querySelector('.content') as HTMLElement;\n const wrapperBottom = wrapper.getBoundingClientRect().bottom;\n const sectionTop = section.getBoundingClientRect().top;\n const availableSpace = wrapperBottom - sectionTop;\n\n // The section should not exceed the available space in the container\n expect(sectionHeight).to.be.at.most(availableSpace + 1); // +1 for rounding\n });\n\n it('should not constrain section when no scroll container exists', async () => {\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content></more-facets-content>`,\n );\n\n el.facetsLoading = false;\n await el.updateComplete;\n\n // Wait for the constrainToScrollContainer rAF callback\n await new Promise(r =>\n requestAnimationFrame(() => requestAnimationFrame(r)),\n );\n\n const section = el.shadowRoot?.querySelector(\n 'section#more-facets',\n ) as HTMLElement;\n\n // No inline max-height should be set when there's no scroll container\n expect(section.style.maxHeight).to.equal('');\n });\n });\n\n describe('Horizontal scroll navigation arrows', () => {\n it('should use scroll-nav-container in horizontal scroll mode', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets'; // Produces < 1000 aggregations\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify scroll navigation container exists in horizontal scroll mode\n expect(el.shadowRoot?.querySelector('.scroll-nav-container')).to.exist;\n\n // Verify horizontal container and facets-content exist inside it\n expect(\n el.shadowRoot?.querySelector(\n '.scroll-nav-container .facets-content.horizontal-scroll-mode',\n ),\n ).to.exist;\n expect(\n el.shadowRoot?.querySelector(\n '.scroll-nav-container .facets-horizontal-container',\n ),\n ).to.exist;\n });\n\n it('should NOT show scroll arrows in pagination mode', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n .selectedFacets=${getDefaultSelectedFacets()}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'subject';\n el.query = 'large-facets'; // Produces >= 1000 aggregations\n await el.updateComplete;\n await aTimeout(50);\n\n // Verify scroll navigation container does NOT exist\n expect(el.shadowRoot?.querySelector('.scroll-nav-container')).to.not\n .exist;\n expect(el.shadowRoot?.querySelector('.scroll-arrow')).to.not.exist;\n });\n\n it('should hide scroll arrows when content does not overflow', async () => {\n const searchService = new MockSearchService();\n\n const el = await fixture<MoreFacetsContent>(\n html`<more-facets-content\n .searchService=${searchService}\n ></more-facets-content>`,\n );\n\n el.facetKey = 'year';\n el.query = 'more-facets';\n await el.updateComplete;\n await aTimeout(50);\n\n // In test environment, there's no real layout so scrollWidth === clientWidth.\n // Arrows should be hidden when there's no horizontal overflow.\n expect(el.shadowRoot?.querySelector('.scroll-arrow')).to.not.exist;\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": "4.2.0-alpha-webdev8164.
|
|
6
|
+
"version": "4.2.0-alpha-webdev8164.2",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"module": "dist/index.js",
|
|
9
9
|
"scripts": {
|