@internetarchive/collection-browser 1.14.17-alpha.45 → 1.14.17-alpha.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/collection-browser.js +3 -3
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/data-source/collection-browser-data-source.js +4 -2
- package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
- package/dist/src/data-source/collection-browser-query-state.js.map +1 -1
- package/dist/src/models.js +1 -1
- package/dist/src/models.js.map +1 -1
- package/package.json +1 -1
- package/src/collection-browser.ts +1 -2
- package/src/data-source/collection-browser-data-source.ts +8 -5
- package/src/data-source/collection-browser-query-state.ts +0 -1
- package/src/models.ts +5 -2
|
@@ -773,7 +773,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
|
|
|
773
773
|
}));
|
|
774
774
|
}
|
|
775
775
|
async installDataSourceAndQueryState(dataSource, queryState) {
|
|
776
|
-
var _a;
|
|
776
|
+
var _a, _b;
|
|
777
777
|
console.log('installing in CB:', dataSource, queryState);
|
|
778
778
|
if (this.dataSource)
|
|
779
779
|
this.removeController(this.dataSource);
|
|
@@ -782,10 +782,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
|
|
|
782
782
|
this.baseQuery = queryState.baseQuery;
|
|
783
783
|
this.profileElement = queryState.profileElement;
|
|
784
784
|
this.searchType = queryState.searchType;
|
|
785
|
-
this.selectedFacets = queryState.selectedFacets;
|
|
785
|
+
this.selectedFacets = (_a = queryState.selectedFacets) !== null && _a !== void 0 ? _a : getDefaultSelectedFacets();
|
|
786
786
|
this.minSelectedDate = queryState.minSelectedDate;
|
|
787
787
|
this.maxSelectedDate = queryState.maxSelectedDate;
|
|
788
|
-
this.selectedSort = (
|
|
788
|
+
this.selectedSort = (_b = queryState.selectedSort) !== null && _b !== void 0 ? _b : SortField.default;
|
|
789
789
|
this.sortDirection = queryState.sortDirection;
|
|
790
790
|
this.selectedTitleFilter = queryState.selectedTitleFilter;
|
|
791
791
|
this.selectedCreatorFilter = queryState.selectedCreatorFilter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-browser.js","sourceRoot":"","sources":["../../src/collection-browser.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n html,\n css,\n LitElement,\n PropertyValues,\n TemplateResult,\n nothing,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { msg } from '@lit/localize';\n\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport type {\n InfiniteScroller,\n InfiniteScrollerCellProviderInterface,\n} from '@internetarchive/infinite-scroller';\nimport {\n AccountExtraInfo,\n CollectionExtraInfo,\n PageElementName,\n SearchServiceInterface,\n SearchType,\n SortDirection,\n SortParam,\n} from '@internetarchive/search-service';\nimport type {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport '@internetarchive/infinite-scroller';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport type { FeatureFeedbackServiceInterface } from '@internetarchive/feature-feedback';\nimport type { RecaptchaManagerInterface } from '@internetarchive/recaptcha-manager';\nimport './tiles/tile-dispatcher';\nimport './tiles/collection-browser-loading-tile';\nimport './sort-filter-bar/sort-filter-bar';\nimport './manage/manage-bar';\nimport './collection-facets';\nimport './circular-activity-indicator';\nimport {\n SelectedFacets,\n SortField,\n CollectionBrowserContext,\n getDefaultSelectedFacets,\n TileModel,\n CollectionDisplayMode,\n PrefixFilterType,\n PrefixFilterCounts,\n FacetEventDetails,\n sortOptionFromAPIString,\n SORT_OPTIONS,\n defaultProfileElementSorts,\n} from './models';\nimport {\n RestorationStateHandlerInterface,\n RestorationStateHandler,\n RestorationState,\n} from './restoration-state-handler';\nimport { CollectionBrowserDataSource } from './data-source/collection-browser-data-source';\nimport type {\n CollectionBrowserQueryState,\n CollectionBrowserSearchInterface,\n} from './data-source/collection-browser-query-state';\nimport chevronIcon from './assets/img/icons/chevron';\nimport type { PlaceholderType } from './empty-placeholder';\nimport './empty-placeholder';\n\nimport {\n analyticsActions,\n analyticsCategories,\n} from './utils/analytics-events';\nimport { srOnlyStyle } from './styles/sr-only';\nimport { sha1 } from './utils/sha1';\nimport type { CollectionFacets } from './collection-facets';\nimport type { ManageableItem } from './manage/manage-bar';\nimport { formatDate } from './utils/format-date';\nimport type { CollectionBrowserDataSourceInterface } from './data-source/collection-browser-data-source-interface';\n\n@customElement('collection-browser')\nexport class CollectionBrowser\n extends LitElement\n implements\n InfiniteScrollerCellProviderInterface,\n SharedResizeObserverResizeHandlerInterface,\n CollectionBrowserSearchInterface\n{\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: String }) baseImageUrl: string = 'https://archive.org';\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) searchType: SearchType = SearchType.METADATA;\n\n @property({ type: String }) withinCollection?: string;\n\n @property({ type: String }) withinProfile?: string;\n\n @property({ type: String }) profileElement?: PageElementName;\n\n @property({ type: String }) baseQuery?: string;\n\n @property({ type: String }) displayMode?: CollectionDisplayMode;\n\n @property({ type: Object }) defaultSortParam: SortParam | null = null;\n\n @property({ type: String }) selectedSort: SortField = SortField.default;\n\n @property({ type: String }) selectedTitleFilter: string | null = null;\n\n @property({ type: String }) selectedCreatorFilter: string | null = null;\n\n @property({ type: String }) sortDirection: SortDirection | null = null;\n\n @property({ type: Number }) pageSize = 50;\n\n @property({ type: Number }) currentPage?: number;\n\n @property({ type: String }) minSelectedDate?: string;\n\n @property({ type: String }) maxSelectedDate?: string;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Boolean }) showHistogramDatePicker = false;\n\n @property({ type: Boolean }) suppressPlaceholders = false;\n\n @property({ type: Boolean }) suppressResultCount = false;\n\n @property({ type: Boolean }) suppressURLQuery = false;\n\n @property({ type: Boolean }) suppressFacets = false;\n\n @property({ type: Boolean }) suppressSortBar = false;\n\n @property({ type: Boolean }) clearResultsOnEmptyQuery = false;\n\n @property({ type: String }) collectionPagePath: string = '/details/';\n\n /** describes where this component is being used */\n @property({ type: String, reflect: true }) searchContext: string =\n analyticsCategories.default;\n\n @property({ type: String }) pageContext: CollectionBrowserContext = 'search';\n\n @property({ type: Object })\n restorationStateHandler: RestorationStateHandlerInterface = new RestorationStateHandler(\n {\n context: this.pageContext,\n }\n );\n\n @property({ type: Number }) mobileBreakpoint = 600;\n\n @property({ type: Boolean }) loggedIn = false;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface = undefined;\n\n @property({ type: Object })\n featureFeedbackService?: FeatureFeedbackServiceInterface;\n\n @property({ type: Object }) recaptchaManager?: RecaptchaManagerInterface;\n\n /**\n * If item management UI active\n */\n @property({ type: Boolean }) isManageView = false;\n\n @property({ type: Boolean }) isLoansTab = false;\n\n /**\n * The results per page so we can paginate.\n *\n * This allows us to start in the middle of the search results and\n * fetch data before or after the current page. If we don't have a key\n * for the previous/next page, we'll fetch the next/previous page to populate it\n */\n @property({ type: Object }) dataSource: CollectionBrowserDataSourceInterface =\n new CollectionBrowserDataSource(this, this.pageSize);\n\n /**\n * The page that the consumer wants to load.\n */\n initialPageNumber = 1;\n\n /**\n * This the the number of pages that we want to show.\n *\n * The data isn't necessarily loaded for all of the pages, but this lets us\n * know how many cells we should render.\n */\n @state() private pagesToRender = this.initialPageNumber;\n\n /**\n * Whether the initial page fetch for a new query is currently in progress.\n */\n @state() private searchResultsLoading = false;\n\n @state() private facetsLoading = false;\n\n @state() private totalResults?: number;\n\n @state() private mobileView = false;\n\n @state() private mobileFacetsVisible = false;\n\n @state() private contentWidth?: number;\n\n @state() private defaultSortField: Exclude<SortField, SortField.default> =\n SortField.relevance;\n\n @state() private defaultSortDirection: SortDirection | null = null;\n\n @state() private placeholderType: PlaceholderType = null;\n\n @state() private prefixFilterCountMap: Partial<\n Record<PrefixFilterType, PrefixFilterCounts>\n > = {};\n\n @query('#content-container') private contentContainer!: HTMLDivElement;\n\n @query('#left-column') private leftColumn?: HTMLDivElement;\n\n @query('collection-facets') private collectionFacets?: CollectionFacets;\n\n @property({ type: Object, attribute: false })\n private analyticsHandler?: AnalyticsManagerInterface;\n\n /**\n * When we're animated scrolling to the page, we don't want to fetch\n * all of the pages as it scrolls so this lets us know if we're scrolling\n */\n private isScrollingToCell = false;\n\n /**\n * When page width resizes from desktop to mobile, set true to\n * disable expand/collapse transition when loading.\n */\n private isResizeToMobile = false;\n\n private leftColIntersectionObserver?: IntersectionObserver;\n\n private facetsIntersectionObserver?: IntersectionObserver;\n\n private placeholderCellTemplate = html`<collection-browser-loading-tile></collection-browser-loading-tile>`;\n\n constructor() {\n super();\n this.addController(this.dataSource);\n }\n\n private tileModelAtCellIndex(index: number): TileModel | undefined {\n const model = this.dataSource.getTileModelAt(index);\n /**\n * If we encounter a model we don't have yet and we're not in the middle of an\n * automated scroll, fetch the page and just return undefined.\n * The datasource will be updated once the page is loaded and the cell will be rendered.\n *\n * We disable it during the automated scroll since we don't want to fetch pages for intervening cells the\n * user may never see.\n */\n if (!model && !this.isScrollingToCell && this.dataSource.queryInitialized) {\n const pageNumber = Math.floor(index / this.pageSize) + 1;\n this.dataSource.fetchPage(pageNumber);\n }\n return model;\n }\n\n // this is the total number of tiles we expect if\n // the data returned is a full page worth\n // this is useful for putting in placeholders for the expected number of tiles\n private get estimatedTileCount(): number {\n return this.pagesToRender * this.pageSize;\n }\n\n /**\n * How many tiles to offset the data source by, to account for any removed tiles.\n */\n private tileModelOffset = 0;\n\n @query('infinite-scroller')\n private infiniteScroller!: InfiniteScroller;\n\n private sessionIdGenPromise?: Promise<string>;\n\n /**\n * Returns a promise resolving to a unique string that persists for the current browser session.\n * Used in generating unique IDs for search requests, so that multiple requests coming from the\n * same browser session can be identified.\n */\n async getSessionId(): Promise<string> {\n try {\n const storedSessionId = sessionStorage?.getItem('cb-session');\n if (storedSessionId) {\n return storedSessionId;\n }\n\n // If we enter this method a second time while a first session ID is already being generated,\n // ensure we produce the same ID from both calls instead of generating another one.\n if (this.sessionIdGenPromise) {\n return this.sessionIdGenPromise;\n }\n\n this.sessionIdGenPromise = sha1(Math.random().toString());\n const newSessionId = await this.sessionIdGenPromise;\n\n sessionStorage?.setItem('cb-session', newSessionId);\n return newSessionId;\n } catch (err) {\n // Either we can't generate the hash or we're restricted from accessing sessionStorage\n return '';\n }\n }\n\n /**\n * Go to the given page of results\n *\n * @param pageNumber\n */\n goToPage(pageNumber: number) {\n this.initialPageNumber = pageNumber;\n this.pagesToRender = pageNumber;\n return this.scrollToPage(pageNumber);\n }\n\n /**\n * Sets the state for whether the initial set of search results is loading in.\n */\n setSearchResultsLoading(loading: boolean): void {\n console.log('setting search results loading to', loading);\n this.searchResultsLoading = loading;\n }\n\n /**\n * Sets the state for whether facet data is loading in\n */\n setFacetsLoading(loading: boolean): void {\n console.log('setting facets loading to', loading);\n this.facetsLoading = loading;\n }\n\n /**\n * Sets the total number of results to be displayed for the current search\n */\n setTotalResultCount(totalResults: number): void {\n this.totalResults = totalResults;\n }\n\n /**\n * Clears all selected/negated facets, date ranges, and letter filters.\n *\n * By default, the current sort field/direction are not cleared,\n * but this can be overridden by setting the `sort` option to `true`.\n *\n * Similarly, it is possible to finely control what is cleared by\n * setting any of the `facets`, `dateRange`, or `letterFilters` flags\n * in the options object.\n */\n clearFilters({\n facets = true,\n dateRange = true,\n letterFilters = true,\n sort = false,\n } = {}): void {\n // Don't bother clearing facets if none are checked, so that we don't\n // trigger unnecessary update cycles.\n if (facets && this.hasCheckedFacets) {\n this.selectedFacets = getDefaultSelectedFacets();\n }\n\n if (dateRange) {\n this.minSelectedDate = undefined;\n this.maxSelectedDate = undefined;\n }\n\n if (letterFilters) {\n this.selectedTitleFilter = null;\n this.selectedCreatorFilter = null;\n }\n\n if (sort) {\n this.sortDirection = null;\n this.selectedSort = SortField.default;\n }\n }\n\n /**\n * Returns true if the current value of `this.selectedFacets` contains\n * any facet buckets than have been selected or negated, or false otherwise.\n */\n private get hasCheckedFacets(): boolean {\n if (!this.selectedFacets) return false;\n\n for (const facetGroup of Object.values(this.selectedFacets)) {\n for (const bucket of Object.values(facetGroup)) {\n if (bucket.state !== 'none') return true;\n }\n }\n\n return false;\n }\n\n /**\n * Returns true if there are any currently selected/negated facet buckets,\n * any selected date range, or any selected letter filters. False otherwise.\n *\n * Ignores sorting options.\n */\n private get hasActiveFilters(): boolean {\n return !!(\n this.hasCheckedFacets ||\n this.minSelectedDate ||\n this.maxSelectedDate ||\n this.selectedTitleFilter ||\n this.selectedCreatorFilter\n );\n }\n\n render() {\n this.setPlaceholderType();\n return html`\n <div\n id=\"content-container\"\n class=${this.mobileView ? 'mobile' : 'desktop'}\n >\n ${this.placeholderType\n ? this.emptyPlaceholderTemplate\n : this.collectionBrowserTemplate}\n </div>\n `;\n }\n\n private setPlaceholderType() {\n const hasQuery = !!this.baseQuery?.trim();\n const isCollection = !!this.withinCollection;\n const isProfile = !!this.withinProfile;\n const noResults =\n !this.searchResultsLoading &&\n (this.dataSource.size === 0 || !this.searchService);\n\n this.placeholderType = null;\n if (this.suppressPlaceholders) return;\n\n if (!hasQuery && !isCollection && !isProfile) {\n this.placeholderType = 'empty-query';\n } else if (noResults) {\n // Within a collection, no query + no results means the collection simply has no viewable items.\n // Otherwise, we must have a user query that produced 0 results.\n this.placeholderType =\n !hasQuery && isCollection ? 'empty-collection' : 'no-results';\n }\n\n if (this.dataSource.queryErrorMessage) {\n this.placeholderType =\n !hasQuery && isCollection ? 'collection-error' : 'query-error';\n }\n }\n\n private get emptyPlaceholderTemplate() {\n return html`\n <empty-placeholder\n .placeholderType=${this.placeholderType}\n ?isMobileView=${this.mobileView}\n ?isCollection=${!!this.withinCollection}\n .detailMessage=${this.dataSource.queryErrorMessage ?? ''}\n .baseNavigationUrl=${this.baseNavigationUrl}\n ></empty-placeholder>\n ${this.infiniteScrollerTemplate}\n `;\n }\n\n /**\n * Top-level template for rendering the left (facets) and right (results) columns.\n */\n private get collectionBrowserTemplate() {\n return html`\n <div id=\"left-column-scroll-sentinel\"></div>\n ${this.leftColumnTemplate} ${this.rightColumnTemplate}\n `;\n }\n\n /**\n * Template for either the mobile or desktop version of the left column, depending\n * on current component state.\n */\n private get leftColumnTemplate(): TemplateResult {\n if (this.mobileView) {\n return this.mobileLeftColumnTemplate;\n }\n return this.desktopLeftColumnTemplate;\n }\n\n /**\n * Template for the mobile version of the \"left column\" (which in this case, appears\n * *above* the search results rather than beside them), for rendering the\n * accordion-style facets.\n */\n private get mobileLeftColumnTemplate(): TemplateResult {\n return html`\n <div\n id=\"left-column\"\n class=\"column${this.isResizeToMobile ? ' preload' : ''}\"\n >\n ${this.facetTopViewSlot} ${this.resultsCountTemplate}\n <div id=\"facets-header-container\">${this.mobileFacetsTemplate}</div>\n </div>\n `;\n }\n\n /**\n * Template for the desktop version of the left column, displaying the facets sidebar.\n */\n private get desktopLeftColumnTemplate(): TemplateResult {\n return html`\n <div id=\"left-column\" class=\"column\">\n ${this.facetTopViewSlot}\n <div id=\"facets-header-container\">\n <h2 id=\"facets-header\" class=\"sr-only\">Filters</h2>\n ${this.resultsCountTemplate} ${this.clearFiltersBtnTemplate(false)}\n </div>\n <div id=\"facets-container\" aria-labelledby=\"facets-header\">\n ${this.facetsTemplate}\n <div id=\"facets-scroll-sentinel\"></div>\n </div>\n <div id=\"facets-bottom-fade\"></div>\n </div>\n `;\n }\n\n /**\n * Slot which is placed at top of the facets area for user-profile page\n * - mainly used to render userlists\n */\n private get facetTopViewSlot(): TemplateResult {\n return html`<div id=\"facet-top-view\">\n <slot name=\"facet-top-slot\"></slot>\n </div>`;\n }\n\n /**\n * Template for the \"X Results\" count at the top of the search results.\n * Changes to the \"Searching...\" label if the search results are still loading.\n */\n private get resultsCountTemplate(): TemplateResult | typeof nothing {\n if (this.suppressResultCount) return nothing;\n\n const shouldShowSearching =\n this.searchResultsLoading || this.totalResults === undefined;\n const resultsCount = this.totalResults?.toLocaleString();\n const resultsLabel = this.totalResults === 1 ? 'Result' : 'Results';\n\n return html`\n <div id=\"results-total\">\n <span id=\"big-results-count\">\n ${shouldShowSearching ? html`Searching…` : resultsCount}\n </span>\n <span id=\"big-results-label\">\n ${shouldShowSearching ? nothing : resultsLabel}\n </span>\n </div>\n `;\n }\n\n /**\n * Template for the right column of the collection browser, where the result\n * tiles and sort/filter bar are shown.\n */\n private get rightColumnTemplate(): TemplateResult {\n return html`\n <div id=\"right-column\" class=\"column\">\n <div id=\"cb-top-view\">\n <slot name=\"cb-top-slot\"></slot>\n </div>\n ${this.isManageView\n ? this.manageBarTemplate\n : this.sortFilterBarTemplate}\n <slot name=\"cb-results\"></slot>\n ${this.displayMode === `list-compact`\n ? this.listHeaderTemplate\n : nothing}\n ${this.infiniteScrollerTemplate}\n </div>\n `;\n }\n\n private get infiniteScrollerTemplate() {\n return html`<infinite-scroller\n class=${this.infiniteScrollerClasses}\n itemCount=${this.placeholderType ? 0 : nothing}\n ariaLandmarkLabel=\"Search results\"\n .cellProvider=${this}\n .placeholderCellTemplate=${this.placeholderCellTemplate}\n @scrollThresholdReached=${this.scrollThresholdReached}\n @visibleCellsChanged=${this.visibleCellsChanged}\n >${this.displayMode === 'grid'\n ? html`<slot name=\"result-last-tile\" slot=\"result-last-tile\"></slot>`\n : nothing}\n </infinite-scroller>`;\n }\n\n private get infiniteScrollerClasses() {\n return classMap({\n [this.displayMode ?? '']: !!this.displayMode,\n hidden: !!this.placeholderType,\n });\n }\n\n private get sortFilterBarTemplate(): TemplateResult | typeof nothing {\n if (this.suppressSortBar) return nothing;\n\n return html`\n <sort-filter-bar\n .defaultSortField=${this.defaultSortField}\n .defaultSortDirection=${this.defaultSortDirection}\n .selectedSort=${this.selectedSort}\n .sortDirection=${this.sortDirection}\n .showRelevance=${this.isRelevanceSortAvailable}\n .showDateFavorited=${this.withinCollection?.startsWith('fav-')}\n .displayMode=${this.displayMode}\n .selectedTitleFilter=${this.selectedTitleFilter}\n .selectedCreatorFilter=${this.selectedCreatorFilter}\n .prefixFilterCountMap=${this.dataSource.prefixFilterCountMap}\n .resizeObserver=${this.resizeObserver}\n @sortChanged=${this.userChangedSort}\n @displayModeChanged=${this.displayModeChanged}\n @titleLetterChanged=${this.titleLetterSelected}\n @creatorLetterChanged=${this.creatorLetterSelected}\n .showLoansTopBar=${this.isLoansTab}\n >\n <div slot=\"sortbar-left-slot\">\n <slot name=\"sortbar-left-slot\"></slot>\n </div>\n <slot\n name=\"loans-tab-filter-bar-options-slot\"\n slot=\"loans-tab-filter-bar-options-slot\"\n ></slot>\n </sort-filter-bar>\n `;\n }\n\n private get manageBarTemplate(): TemplateResult {\n return html`\n <manage-bar\n showSelectAll\n showUnselectAll\n @removeItems=${this.handleRemoveItems}\n @selectAll=${() => this.dataSource.checkAllTiles()}\n @unselectAll=${() => this.dataSource.uncheckAllTiles()}\n @cancel=${() => {\n this.isManageView = false;\n this.dataSource.uncheckAllTiles();\n }}\n ></manage-bar>\n `;\n }\n\n /**\n * Handler for when the user requests to remove all checked items via the manage bar.\n * Emits an `itemRemovalRequested` event with all checked tile models.\n */\n private handleRemoveItems(): void {\n this.dispatchEvent(\n new CustomEvent<{ items: ManageableItem[] }>('itemRemovalRequested', {\n detail: {\n items: this.dataSource.checkedTileModels.map(model => {\n const cloned = model.clone();\n cloned.dateStr = formatDate(model.datePublished, 'long');\n return cloned as ManageableItem;\n }),\n },\n })\n );\n }\n\n /**\n * Removes all tile models that are currently checked & adjusts the paging\n * of the data source to account for any new gaps in the data.\n */\n removeCheckedTiles(): void {\n this.dataSource.removeCheckedTiles();\n }\n\n private userChangedSort(\n e: CustomEvent<{\n selectedSort: SortField;\n sortDirection: SortDirection | null;\n }>\n ) {\n const { selectedSort, sortDirection } = e.detail;\n this.selectedSort = selectedSort;\n this.sortDirection = sortDirection;\n\n if ((this.currentPage ?? 1) > 1) {\n this.goToPage(1);\n }\n this.currentPage = 1;\n }\n\n private sendSortByAnalytics(prevSortDirection: SortDirection | null): void {\n const directionCleared = prevSortDirection && !this.sortDirection;\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.sortBy,\n label: `${this.selectedSort}${\n this.sortDirection || directionCleared ? `-${this.sortDirection}` : ''\n }`,\n });\n }\n\n private selectedSortChanged(): void {\n // Lazy-load the alphabet counts for title/creator sort bar as needed\n this.updatePrefixFiltersForCurrentSort();\n }\n\n get sortParam(): SortParam | null {\n const sortOption = SORT_OPTIONS[this.selectedSort];\n if (!sortOption?.handledBySearchService) {\n return null;\n }\n\n // If the sort option specified in the URL is unrecognized, we just use it as-is\n const urlSortParam = new URL(window.location.href).searchParams.get('sort');\n const sortField =\n sortOption.searchServiceKey ?? urlSortParam?.replace(/^-/, '');\n\n // If the sort direction is still null at this point, then we assume ascending\n // (i.e., it was unrecognized and had no directional flag)\n if (!this.sortDirection) this.sortDirection = 'asc';\n\n if (!sortField) return null;\n return { field: sortField, direction: this.sortDirection };\n }\n\n private displayModeChanged(\n e: CustomEvent<{ displayMode?: CollectionDisplayMode }>\n ): void {\n this.displayMode = e.detail.displayMode;\n\n if (this.displayMode) {\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.displayMode,\n label: this.displayMode,\n });\n }\n }\n\n /**\n * Returns a query clause identifying the currently selected title filter,\n * e.g., `firstTitle:X`.\n */\n private get titleQuery(): string | undefined {\n return this.selectedTitleFilter\n ? `firstTitle:${this.selectedTitleFilter}`\n : undefined;\n }\n\n /**\n * Returns a query clause identifying the currently selected creator filter,\n * e.g., `firstCreator:X`.\n */\n private get creatorQuery(): string | undefined {\n return this.selectedCreatorFilter\n ? `firstCreator:${this.selectedCreatorFilter}`\n : undefined;\n }\n\n /**\n * Send Analytics when sorting by title's first letter\n * labels: 'start-<ToLetter>' | 'clear-<FromLetter>' | '<FromLetter>-<ToLetter>'\n */\n private sendFilterByTitleAnalytics(prevSelectedLetter: string | null): void {\n if (!prevSelectedLetter && !this.selectedTitleFilter) {\n return;\n }\n const cleared = prevSelectedLetter && !this.selectedTitleFilter;\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.filterByTitle,\n label: cleared\n ? `clear-${prevSelectedLetter}`\n : `${prevSelectedLetter || 'start'}-${this.selectedTitleFilter}`,\n });\n }\n\n /**\n * Send Analytics when filtering by creator's first letter\n * labels: 'start-<ToLetter>' | 'clear-<FromLetter>' | '<FromLetter>-<ToLetter>'\n */\n private sendFilterByCreatorAnalytics(\n prevSelectedLetter: string | null\n ): void {\n if (!prevSelectedLetter && !this.selectedCreatorFilter) {\n return;\n }\n const cleared = prevSelectedLetter && !this.selectedCreatorFilter;\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.filterByCreator,\n label: cleared\n ? `clear-${prevSelectedLetter}`\n : `${prevSelectedLetter || 'start'}-${this.selectedCreatorFilter}`,\n });\n }\n\n /**\n * Handler for changes to which letter is selected in the title alphabet bar.\n */\n private titleLetterSelected(\n e: CustomEvent<{ selectedLetter: string | null }>\n ): void {\n this.selectedCreatorFilter = null;\n this.selectedTitleFilter = e.detail.selectedLetter;\n }\n\n /**\n * Handler for changes to which letter is selected in the creator alphabet bar.\n */\n private creatorLetterSelected(\n e: CustomEvent<{ selectedLetter: string | null }>\n ): void {\n this.selectedTitleFilter = null;\n this.selectedCreatorFilter = e.detail.selectedLetter;\n }\n\n /**\n * The full template for how the facets should be structured in mobile view,\n * including the collapsible container (with header) and the facets themselves.\n */\n private get mobileFacetsTemplate(): TemplateResult {\n const toggleFacetsVisible = () => {\n this.isResizeToMobile = false;\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n };\n\n return html`\n <details\n id=\"mobile-filter-collapse\"\n @click=${toggleFacetsVisible}\n @keyup=${toggleFacetsVisible}\n >\n <summary>\n <span class=\"collapser-icon\">${chevronIcon}</span>\n <h2>Filters</h2>\n ${this.clearFiltersBtnTemplate(true)}\n </summary>\n ${this.facetsTemplate}\n </details>\n `;\n }\n\n /**\n * The template for the facets component alone, without any surrounding wrappers.\n */\n private get facetsTemplate() {\n if (this.suppressFacets) {\n return html`\n <p class=\"facets-message\">\n ${msg('Facets are temporarily unavailable.')}\n </p>\n `;\n }\n\n return html`\n <collection-facets\n @facetsChanged=${this.facetsChanged}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n .collectionPagePath=${this.collectionPagePath}\n .parentCollections=${this.dataSource.parentCollections}\n .withinCollection=${this.withinCollection}\n .searchService=${this.searchService}\n .featureFeedbackService=${this.featureFeedbackService}\n .recaptchaManager=${this.recaptchaManager}\n .resizeObserver=${this.resizeObserver}\n .searchType=${this.searchType}\n .aggregations=${this.dataSource.aggregations}\n .fullYearsHistogramAggregation=${this.dataSource\n .yearHistogramAggregation}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .selectedFacets=${this.selectedFacets}\n .baseNavigationUrl=${this.baseNavigationUrl}\n .collectionTitles=${this.dataSource.collectionTitles}\n .showHistogramDatePicker=${this.showHistogramDatePicker}\n .allowExpandingDatePicker=${!this.mobileView}\n .contentWidth=${this.contentWidth}\n .query=${this.baseQuery}\n .filterMap=${this.dataSource.filterMap}\n .isManageView=${this.isManageView}\n .modalManager=${this.modalManager}\n ?collapsableFacets=${this.mobileView}\n ?facetsLoading=${this.facetsLoading}\n ?fullYearAggregationLoading=${this.facetsLoading}\n @facetClick=${this.facetClickHandler}\n .analyticsHandler=${this.analyticsHandler}\n >\n </collection-facets>\n `;\n }\n\n /**\n * The HTML template for the \"Clear all filters\" button, or `nothing` if no\n * filters are currently active.\n *\n * @param mobile Whether to style/shorten the button for mobile view\n */\n private clearFiltersBtnTemplate(\n mobile: boolean\n ): TemplateResult | typeof nothing {\n if (!this.hasActiveFilters) return nothing;\n\n const buttonClasses = classMap({\n 'clear-filters-btn': true,\n mobile,\n });\n\n const buttonText = mobile ? 'Clear all' : 'Clear all filters';\n\n return html`\n <div class=\"clear-filters-btn-row\">\n ${mobile\n ? html`<span class=\"clear-filters-btn-separator\"> </span>`\n : nothing}\n <button class=${buttonClasses} @click=${this.clearFilters}>\n ${buttonText}\n </button>\n </div>\n `;\n }\n\n private get loadingTemplate() {\n return html`\n <div class=\"loading-cover\">\n <circular-activity-indicator></circular-activity-indicator>\n </div>\n `;\n }\n\n private get listHeaderTemplate() {\n return html`\n <div id=\"list-header\">\n <tile-dispatcher\n .tileDisplayMode=${'list-header'}\n .resizeObserver=${this.resizeObserver}\n .sortParam=${this.sortParam}\n .defaultSortParam=${this.defaultSortParam}\n .mobileBreakpoint=${this.mobileBreakpoint}\n .loggedIn=${this.loggedIn}\n >\n </tile-dispatcher>\n </div>\n `;\n }\n\n private histogramDateRangeUpdated(\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>\n ) {\n const { minDate, maxDate } = e.detail;\n [this.minSelectedDate, this.maxSelectedDate] = [minDate, maxDate];\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.histogramChanged,\n label: this.dateRangeQueryClause,\n });\n }\n\n private get dateRangeQueryClause() {\n if (!this.minSelectedDate || !this.maxSelectedDate) {\n return undefined;\n }\n\n return `year:[${this.minSelectedDate} TO ${this.maxSelectedDate}]`;\n }\n\n /**\n * Emits an event indicating a change in whether the manage mode is shown.\n */\n private emitManageModeChangedEvent(): void {\n this.dispatchEvent(\n new CustomEvent<boolean>('manageModeChanged', {\n detail: this.isManageView,\n })\n );\n }\n\n async installDataSourceAndQueryState(\n dataSource: CollectionBrowserDataSourceInterface,\n queryState: CollectionBrowserQueryState\n ): Promise<void> {\n console.log('installing in CB:', dataSource, queryState);\n if (this.dataSource) this.removeController(this.dataSource);\n this.dataSource = dataSource;\n this.addController(this.dataSource);\n\n this.baseQuery = queryState.baseQuery;\n this.profileElement = queryState.profileElement;\n this.searchType = queryState.searchType;\n this.selectedFacets = queryState.selectedFacets;\n this.minSelectedDate = queryState.minSelectedDate;\n this.maxSelectedDate = queryState.maxSelectedDate;\n this.selectedSort = queryState.selectedSort ?? SortField.default;\n this.sortDirection = queryState.sortDirection;\n this.selectedTitleFilter = queryState.selectedTitleFilter;\n this.selectedCreatorFilter = queryState.selectedCreatorFilter;\n\n this.requestUpdate();\n await this.updateComplete;\n\n if (!this.searchResultsLoading) {\n this.setTotalResultCount(this.dataSource.totalResults);\n this.setTileCount(this.dataSource.size);\n this.refreshVisibleResults();\n }\n }\n\n firstUpdated(): void {\n this.setupStateRestorationObserver();\n this.restoreState();\n }\n\n updated(changed: PropertyValues) {\n console.log(\n '* CB UPDATED\\n',\n [...changed.entries()]\n .map(([k, v]) => `${String(k)}: ${v} => ${this[k as keyof this]}`)\n .join('\\n')\n );\n\n if (changed.has('placeholderType') && this.placeholderType === null) {\n if (!this.leftColIntersectionObserver) {\n this.setupLeftColumnScrollListeners();\n }\n if (!this.facetsIntersectionObserver) {\n this.setupFacetsScrollListeners();\n }\n this.updateLeftColumnHeight();\n }\n\n if (\n changed.has('displayMode') ||\n changed.has('baseNavigationUrl') ||\n changed.has('baseImageUrl') ||\n changed.has('loggedIn')\n ) {\n this.infiniteScroller?.reload();\n }\n\n if (\n changed.has('baseQuery') ||\n changed.has('searchType') ||\n changed.has('withinCollection')\n ) {\n // Unless this query/search type update is from the initial page load or the\n // result of hitting the back button,\n // we need to clear any existing filters since they may no longer be valid for\n // the new set of search results.\n if (!this.historyPopOccurred && this.initialQueryChangeHappened) {\n // Ordinarily, we leave the sort param unchanged between searches.\n // However, if we are changing the target collection itself, we want the sort cleared too,\n // since different collections may have different sorting options available.\n const shouldClearSort =\n changed.has('withinCollection') &&\n !changed.has('selectedSort') &&\n !changed.has('sortDirection');\n\n // Otherwise, only clear filters that haven't been simultaneously applied in this update\n this.clearFilters({\n sort: shouldClearSort,\n facets: !changed.has('selectedFacets'),\n dateRange: !(\n changed.has('minSelectedDate') || changed.has('maxSelectedDate')\n ),\n letterFilters: !(\n changed.has('selectedTitleFilter') ||\n changed.has('selectedCreatorFilter')\n ),\n });\n }\n }\n\n if (changed.has('profileElement')) {\n this.applyDefaultProfileSort();\n }\n\n if (changed.has('baseQuery')) {\n this.emitBaseQueryChanged();\n }\n if (changed.has('searchType')) {\n this.emitSearchTypeChanged();\n }\n\n if (changed.has('currentPage') || changed.has('displayMode')) {\n this.persistState();\n }\n\n if (\n changed.has('baseQuery') ||\n changed.has('minSelectedDate') ||\n changed.has('maxSelectedDate') ||\n changed.has('selectedFacets') ||\n changed.has('searchService') ||\n changed.has('withinCollection')\n ) {\n this.refreshLetterCounts();\n }\n\n if (changed.has('selectedSort') || changed.has('sortDirection')) {\n const prevSortDirection = changed.get('sortDirection') as SortDirection;\n this.sendSortByAnalytics(prevSortDirection);\n this.selectedSortChanged();\n }\n\n if (changed.has('selectedTitleFilter')) {\n this.sendFilterByTitleAnalytics(\n changed.get('selectedTitleFilter') as string\n );\n }\n if (changed.has('selectedCreatorFilter')) {\n this.sendFilterByCreatorAnalytics(\n changed.get('selectedCreatorFilter') as string\n );\n }\n\n if (\n changed.has('baseQuery') ||\n changed.has('searchType') ||\n changed.has('selectedTitleFilter') ||\n changed.has('selectedCreatorFilter') ||\n changed.has('minSelectedDate') ||\n changed.has('maxSelectedDate') ||\n changed.has('selectedSort') ||\n changed.has('sortDirection') ||\n changed.has('selectedFacets') ||\n changed.has('searchService') ||\n changed.has('withinCollection') ||\n changed.has('withinProfile') ||\n changed.has('profileElement')\n ) {\n this.handleQueryChange();\n }\n\n if (changed.has('searchResultsLoading')) {\n this.emitSearchResultsLoadingChanged();\n }\n\n if (\n changed.has('facetsLoading') &&\n this.facetsLoading &&\n this.collectionFacets\n ) {\n this.collectionFacets.moreLinksVisible =\n this.searchType !== SearchType.FULLTEXT;\n }\n\n if (changed.has('pagesToRender')) {\n if (!this.dataSource.endOfDataReached && this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\n }\n }\n\n if (changed.has('isManageView')) {\n if (this.isManageView) this.displayMode = 'grid';\n this.infiniteScroller?.refreshAllVisibleCells();\n this.emitManageModeChangedEvent();\n }\n\n if (changed.has('resizeObserver')) {\n const oldObserver = changed.get(\n 'resizeObserver'\n ) as SharedResizeObserverInterface;\n if (oldObserver) this.disconnectResizeObserver(oldObserver);\n this.setupResizeObserver();\n }\n }\n\n disconnectedCallback(): void {\n if (this.resizeObserver) {\n this.disconnectResizeObserver(this.resizeObserver);\n }\n if (this.boundNavigationHandler) {\n window.removeEventListener('popstate', this.boundNavigationHandler);\n }\n\n this.leftColIntersectionObserver?.disconnect();\n this.facetsIntersectionObserver?.disconnect();\n window.removeEventListener('resize', this.updateLeftColumnHeight);\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n const previousView = this.mobileView;\n if (entry.target === this.contentContainer) {\n this.contentWidth = entry.contentRect.width;\n this.mobileView =\n this.contentWidth > 0 && this.contentWidth < this.mobileBreakpoint;\n // If changing from desktop to mobile disable transition\n if (this.mobileView && !previousView) {\n this.isResizeToMobile = true;\n }\n }\n\n // Ensure the facet sidebar remains sized correctly\n this.updateLeftColumnHeight();\n }\n\n /**\n * Sets up listeners for events that may require updating the left column height.\n */\n private setupLeftColumnScrollListeners(): void {\n // We observe intersections between the left column's scroll sentinel and\n // the viewport, so that we can ensure the left column is always sized to\n // match the _available_ viewport height. This should generally be more\n // performant than listening to scroll events on the page or column.\n const leftColumnSentinel = this.shadowRoot?.querySelector(\n '#left-column-scroll-sentinel'\n );\n if (leftColumnSentinel) {\n this.leftColIntersectionObserver = new IntersectionObserver(\n this.updateLeftColumnHeight,\n {\n threshold: [...Array(101).keys()].map(n => n / 100), // Threshold every 1%\n }\n );\n this.leftColIntersectionObserver.observe(leftColumnSentinel);\n }\n\n // We also listen for window resize events, as they are not always captured\n // by the resize observer and can affect the desired height of the left column.\n window.addEventListener('resize', this.updateLeftColumnHeight);\n }\n\n /**\n * Sets up listeners to control whether the facet sidebar shows its bottom fade-out.\n * Note this uses a separate IntersectionObserver from the left column, because we\n * don't need granular intersection thresholds for this.\n */\n private setupFacetsScrollListeners(): void {\n const facetsSentinel = this.shadowRoot?.querySelector(\n '#facets-scroll-sentinel'\n );\n if (facetsSentinel) {\n this.facetsIntersectionObserver = new IntersectionObserver(\n this.updateFacetFadeOut\n );\n this.facetsIntersectionObserver.observe(facetsSentinel);\n }\n }\n\n /**\n * Updates the height of the left column according to its position on the page.\n * Arrow function ensures proper `this` binding.\n */\n private updateLeftColumnHeight = (): void => {\n if (this.mobileView) {\n this.leftColumn?.style?.removeProperty('height');\n } else {\n const clientTop = this.leftColumn?.getBoundingClientRect().top;\n this.leftColumn?.style?.setProperty(\n 'height',\n `${window.innerHeight - (clientTop ?? 0) - 3}px`\n );\n }\n };\n\n /**\n * Toggles whether the fade-out is visible at the bottom of the facets.\n * It should only be visible if the facets are not scrolled to the bottom.\n * Arrow function ensures proper `this` binding.\n */\n private updateFacetFadeOut = (entries: IntersectionObserverEntry[]): void => {\n const fadeElmt = this.shadowRoot?.getElementById('facets-bottom-fade');\n fadeElmt?.classList.toggle('hidden', entries?.[0]?.isIntersecting);\n };\n\n private emitBaseQueryChanged() {\n this.dispatchEvent(\n new CustomEvent<{ baseQuery?: string }>('baseQueryChanged', {\n detail: {\n baseQuery: this.baseQuery,\n },\n })\n );\n }\n\n private emitSearchTypeChanged() {\n this.dispatchEvent(\n new CustomEvent<SearchType>('searchTypeChanged', {\n detail: this.searchType,\n })\n );\n }\n\n emitQueryStateChanged() {\n console.log('emitting query state changed event');\n this.dispatchEvent(\n new CustomEvent<CollectionBrowserQueryState>('queryStateChanged', {\n detail: {\n baseQuery: this.baseQuery,\n withinCollection: this.withinCollection,\n withinProfile: this.withinProfile,\n profileElement: this.profileElement,\n searchType: this.searchType,\n selectedFacets: this.selectedFacets,\n minSelectedDate: this.minSelectedDate,\n maxSelectedDate: this.maxSelectedDate,\n selectedSort: this.selectedSort,\n sortDirection: this.sortDirection,\n selectedTitleFilter: this.selectedTitleFilter,\n selectedCreatorFilter: this.selectedCreatorFilter,\n },\n })\n );\n }\n\n emitEmptyResults() {\n this.dispatchEvent(new Event('emptyResults'));\n }\n\n private disconnectResizeObserver(\n resizeObserver: SharedResizeObserverInterface\n ) {\n resizeObserver.removeObserver({\n target: this.contentContainer,\n handler: this,\n });\n }\n\n private setupResizeObserver() {\n if (!this.resizeObserver) return;\n this.resizeObserver.addObserver({\n target: this.contentContainer,\n handler: this,\n });\n }\n\n /**\n * When the visible cells change from the infinite scroller, we want to emit\n * which page is currently visible so the consumer can update its UI or the URL\n *\n * @param e\n * @returns\n */\n private visibleCellsChanged(\n e: CustomEvent<{ visibleCellIndices: number[] }>\n ) {\n if (this.isScrollingToCell) return;\n const { visibleCellIndices } = e.detail;\n if (visibleCellIndices.length === 0) return;\n const lastVisibleCellIndex =\n visibleCellIndices[visibleCellIndices.length - 1];\n const lastVisibleCellPage =\n Math.floor(lastVisibleCellIndex / this.pageSize) + 1;\n if (this.currentPage !== lastVisibleCellPage) {\n this.currentPage = lastVisibleCellPage;\n }\n const event = new CustomEvent('visiblePageChanged', {\n detail: {\n pageNumber: lastVisibleCellPage,\n },\n });\n this.dispatchEvent(event);\n }\n\n // we only want to scroll on the very first query change\n // so this keeps track of whether we've already set the initial query\n private initialQueryChangeHappened = false;\n\n private historyPopOccurred = false;\n\n // this lets us store the query key so we know if it's actually changed or not\n private previousQueryKey?: string;\n\n /**\n * A Promise which, after each query change, resolves once the fetches for the initial\n * search have completed. Waits for *both* the hits and aggregations fetches to finish.\n *\n * Ensure you await this component's `updateComplete` promise before awaiting this\n * one, to ensure you do not await an obsolete promise from the previous update.\n */\n get initialSearchComplete(): Promise<boolean> {\n return this.dataSource.initialSearchComplete;\n }\n\n private async handleQueryChange() {\n // console.log(\n // 'CB: handling query change',\n // this.previousQueryKey,\n // this.dataSource.pageFetchQueryKey,\n // this.dataSource.canPerformSearch\n // );\n // only reset if the query has actually changed\n if (\n !this.searchService ||\n this.dataSource.pageFetchQueryKey === this.previousQueryKey\n )\n return;\n\n // If the new state prevents us from updating the search results, don't reset\n if (\n !this.dataSource.canPerformSearch &&\n !(this.clearResultsOnEmptyQuery && this.baseQuery === '')\n )\n return;\n\n console.log(\n 'CB will reset',\n this.baseQuery,\n JSON.stringify(this.selectedFacets)\n );\n this.previousQueryKey = this.dataSource.pageFetchQueryKey;\n // this.emitQueryStateChanged();\n\n this.tileModelOffset = 0;\n this.totalResults = undefined;\n this.pagesToRender =\n this.initialPageNumber === 1\n ? 2 // First two pages are batched into one request when starting from page 1\n : this.initialPageNumber;\n\n // Reset the infinite scroller's item count, so that it\n // shows tile placeholders until the new query's results load in\n if (this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\n this.infiniteScroller.reload();\n }\n\n if (this.withinCollection && this.baseQuery?.trim()) {\n this.defaultSortField = SortField.relevance;\n this.defaultSortDirection = null;\n }\n\n if (!this.initialQueryChangeHappened && this.initialPageNumber > 1) {\n this.scrollToPage(this.initialPageNumber);\n }\n this.initialQueryChangeHappened = true;\n\n // if the query changed as part of a window.history pop event, we don't want to\n // persist the state because it overwrites the forward history\n if (!this.historyPopOccurred) {\n this.persistState();\n }\n this.historyPopOccurred = false;\n\n // Fire the initial page and facets requests\n // await this.dataSource.handleQueryChange();\n }\n\n private setupStateRestorationObserver() {\n if (this.boundNavigationHandler) return;\n this.boundNavigationHandler = this.historyNavigationHandler.bind(this);\n // when the user navigates back, we want to update the UI to match the URL\n window.addEventListener('popstate', this.boundNavigationHandler);\n }\n\n private boundNavigationHandler?: () => void;\n\n private historyNavigationHandler() {\n this.historyPopOccurred = true;\n this.restoreState();\n }\n\n private restoreState() {\n const restorationState = this.restorationStateHandler.getRestorationState();\n this.displayMode = restorationState.displayMode;\n if (restorationState.searchType != null)\n this.searchType = restorationState.searchType;\n this.selectedSort = restorationState.selectedSort ?? SortField.default;\n this.sortDirection = restorationState.sortDirection ?? null;\n this.selectedTitleFilter = restorationState.selectedTitleFilter ?? null;\n this.selectedCreatorFilter = restorationState.selectedCreatorFilter ?? null;\n this.selectedFacets = restorationState.selectedFacets;\n if (!this.suppressURLQuery) this.baseQuery = restorationState.baseQuery;\n this.currentPage = restorationState.currentPage ?? 1;\n this.minSelectedDate = restorationState.minSelectedDate;\n this.maxSelectedDate = restorationState.maxSelectedDate;\n if (this.currentPage > 1) {\n this.goToPage(this.currentPage);\n }\n }\n\n private persistState() {\n const restorationState: RestorationState = {\n displayMode: this.displayMode,\n searchType: this.searchType,\n selectedSort: this.selectedSort,\n sortDirection: this.sortDirection ?? undefined,\n selectedFacets: this.selectedFacets ?? getDefaultSelectedFacets(),\n baseQuery: this.suppressURLQuery ? undefined : this.baseQuery,\n currentPage: this.currentPage,\n titleQuery: this.titleQuery,\n creatorQuery: this.creatorQuery,\n minSelectedDate: this.minSelectedDate,\n maxSelectedDate: this.maxSelectedDate,\n selectedTitleFilter: this.selectedTitleFilter ?? undefined,\n selectedCreatorFilter: this.selectedCreatorFilter ?? undefined,\n };\n this.restorationStateHandler.persistState(restorationState);\n }\n\n private emitSearchResultsLoadingChanged(): void {\n this.dispatchEvent(\n new CustomEvent<{ loading: boolean }>('searchResultsLoadingChanged', {\n detail: {\n loading: this.searchResultsLoading,\n },\n })\n );\n }\n\n facetsChanged(e: CustomEvent<SelectedFacets>) {\n this.selectedFacets = e.detail;\n }\n\n facetClickHandler({\n detail: { facetType, bucket, negative },\n }: CustomEvent<FacetEventDetails>): void {\n let action: analyticsActions;\n if (negative) {\n action =\n bucket.state !== 'none'\n ? analyticsActions.facetNegativeSelected\n : analyticsActions.facetNegativeDeselected;\n } else {\n action =\n bucket.state !== 'none'\n ? analyticsActions.facetSelected\n : analyticsActions.facetDeselected;\n }\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action,\n label: facetType,\n });\n }\n\n private scrollToPage(pageNumber: number): Promise<void> {\n return new Promise(resolve => {\n const cellIndexToScrollTo = this.pageSize * (pageNumber - 1);\n // without this setTimeout, Safari just pauses until the `fetchPage` is complete\n // then scrolls to the cell\n setTimeout(() => {\n this.isScrollingToCell = true;\n this.infiniteScroller?.scrollToCell(cellIndexToScrollTo, true);\n // This timeout is to give the scroll animation time to finish\n // then updating the infinite scroller once we're done scrolling\n // There's no scroll animation completion callback so we're\n // giving it 0.5s to finish.\n setTimeout(() => {\n this.isScrollingToCell = false;\n this.infiniteScroller?.refreshAllVisibleCells();\n resolve();\n }, 500);\n }, 0);\n });\n }\n\n /**\n * Whether sorting by relevance makes sense for the current state.\n * Currently equivalent to having a non-empty query.\n */\n private get isRelevanceSortAvailable(): boolean {\n return !!this.baseQuery?.trim();\n }\n\n /**\n * Sets the total number of tiles displayed in the infinite scroller.\n */\n setTileCount(count: number): void {\n console.log('Setting scroller tile count to', count);\n if (this.infiniteScroller) {\n this.infiniteScroller.itemCount = count;\n }\n }\n\n /**\n * Applies any default sort option for the current collection, by checking\n * for one in the collection's metadata. If none is found, defaults to sorting\n * descending by:\n * - Date Favorited for fav-* collections\n * - Weekly views for all other collections\n */\n applyDefaultCollectionSort(collectionInfo?: CollectionExtraInfo): void {\n if (this.baseQuery) {\n // If there's a query set, then we default to relevance sorting regardless of\n // the collection metadata-specified sort.\n this.defaultSortField = SortField.relevance;\n this.defaultSortDirection = null;\n return;\n }\n\n // Favorite collections sort on Date Favorited by default.\n // Other collections fall back to sorting on weekly views.\n const baseDefaultSort: string =\n collectionInfo?.public_metadata?.identifier?.startsWith('fav-')\n ? '-favoritedate'\n : '-week';\n\n // The collection metadata may override the default sorting with something else\n const metadataSort: string | undefined =\n collectionInfo?.public_metadata?.['sort-by'];\n\n // Prefer the metadata-specified sort if one exists\n const defaultSortToApply = metadataSort ?? baseDefaultSort;\n\n // Account for both -field and field:dir formats\n let [field, dir] = defaultSortToApply.split(':');\n if (field.startsWith('-')) {\n field = field.slice(1);\n dir = 'desc';\n } else if (!['asc', 'desc'].includes(dir)) {\n dir = 'asc';\n }\n\n const sortOption = sortOptionFromAPIString(field);\n const sortField = sortOption.field;\n if (sortField && sortField !== SortField.default) {\n this.defaultSortField = sortField;\n this.defaultSortDirection = dir as SortDirection;\n this.defaultSortParam = {\n field: this.defaultSortField,\n direction: this.defaultSortDirection,\n };\n }\n }\n\n /**\n * Applies the default sort option for the current profile element\n */\n applyDefaultProfileSort(): void {\n if (this.profileElement) {\n const defaultSortField = defaultProfileElementSorts[this.profileElement];\n this.defaultSortField = defaultSortField ?? SortField.weeklyview;\n } else {\n this.defaultSortField = SortField.weeklyview;\n }\n\n this.defaultSortDirection = 'desc';\n this.defaultSortParam = {\n field: this.defaultSortField,\n direction: this.defaultSortDirection,\n };\n }\n\n /**\n * This is useful for determining whether we need to reload the scroller.\n *\n * When the fetch completes, we need to reload the scroller if the cells for that\n * page are visible, but if the page is not currenlty visible, we don't need to reload\n */\n get currentVisiblePageNumbers(): number[] {\n const visibleCells = this.infiniteScroller?.getVisibleCellIndices() ?? [];\n const visiblePages = new Set<number>();\n visibleCells.forEach(cellIndex => {\n const visiblePage = Math.floor(cellIndex / this.pageSize) + 1;\n visiblePages.add(visiblePage);\n });\n return Array.from(visiblePages);\n }\n\n /**\n * Refreshes all visible result cells in the infinite scroller.\n */\n refreshVisibleResults(): void {\n this.infiniteScroller?.refreshAllVisibleCells();\n }\n\n /**\n * Fetches and caches the prefix filter counts for the current sort type,\n * provided it is one that permits prefix filtering. (If not, this does nothing).\n */\n private async updatePrefixFiltersForCurrentSort(): Promise<void> {\n if (['title', 'creator'].includes(this.selectedSort)) {\n const filterType = this.selectedSort as PrefixFilterType;\n if (!this.prefixFilterCountMap[filterType]) {\n this.dataSource.updatePrefixFilterCounts(filterType);\n }\n }\n }\n\n /**\n * Clears the cached letter counts for both title and creator, and\n * fetches a new set of counts for whichever of them is the currently\n * selected sort option (which may be neither).\n *\n * Call this whenever the counts are invalidated (e.g., by a query change).\n */\n private refreshLetterCounts(): void {\n if (Object.keys(this.prefixFilterCountMap).length > 0) {\n this.prefixFilterCountMap = {};\n }\n this.updatePrefixFiltersForCurrentSort();\n }\n\n /**\n * Callback when a result is selected\n */\n resultSelected(event: CustomEvent<TileModel>): void {\n if (this.isManageView) {\n // Checked/unchecked state change -- rerender to ensure it propagates\n // this.mapDataSource(model => ({ ...model }));\n const cellIndex = this.dataSource.indexOf(event.detail);\n if (cellIndex >= 0) this.infiniteScroller?.refreshCell(cellIndex);\n }\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.resultSelected,\n label: event.detail.mediatype,\n });\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.resultSelected,\n label: `page-${this.currentPage}`,\n });\n }\n\n cellForIndex(index: number): TemplateResult | undefined {\n const model = this.tileModelAtCellIndex(index);\n if (!model) return undefined;\n\n return html`\n <tile-dispatcher\n .collectionPagePath=${this.collectionPagePath}\n .baseNavigationUrl=${this.baseNavigationUrl}\n .baseImageUrl=${this.baseImageUrl}\n .model=${model}\n .tileDisplayMode=${this.displayMode}\n .resizeObserver=${this.resizeObserver}\n .collectionTitles=${this.dataSource.collectionTitles}\n .sortParam=${this.sortParam}\n .defaultSortParam=${this.defaultSortParam}\n .creatorFilter=${this.selectedCreatorFilter}\n .mobileBreakpoint=${this.mobileBreakpoint}\n .loggedIn=${this.loggedIn}\n .isManageView=${this.isManageView}\n ?enableHoverPane=${true}\n @resultSelected=${(e: CustomEvent) => this.resultSelected(e)}\n >\n </tile-dispatcher>\n `;\n }\n\n /**\n * When the user scrolls near to the bottom of the page, fetch the next page\n * increase the number of pages to render and start fetching data for the new page\n */\n private scrollThresholdReached() {\n if (!this.dataSource.endOfDataReached && this.dataSource.queryInitialized) {\n this.pagesToRender += 1;\n this.dataSource.fetchPage(this.pagesToRender);\n }\n }\n\n static get styles() {\n return [\n srOnlyStyle,\n css`\n :host {\n display: block;\n --leftColumnWidth: 18rem;\n --leftColumnPaddingRight: 2.5rem;\n }\n\n #facet-top-view {\n display: flex;\n }\n\n /**\n * When page width resizes from desktop to mobile, use this class to\n * disable expand/collapse transition when loading.\n */\n .preload * {\n transition: none !important;\n -webkit-transition: none !important;\n -moz-transition: none !important;\n -ms-transition: none !important;\n -o-transition: none !important;\n }\n\n #content-container {\n display: flex;\n }\n\n empty-placeholder {\n margin-top: var(--placeholderMarginTop, 0);\n }\n\n .collapser-icon {\n display: inline-block;\n }\n\n .collapser-icon svg {\n display: inline-block;\n width: 12px;\n height: 12px;\n transition: transform 0.2s ease-out;\n }\n\n #mobile-filter-collapse {\n width: 100%;\n }\n\n #mobile-filter-collapse > summary {\n cursor: pointer;\n list-style: none;\n }\n\n #mobile-filter-collapse[open] > summary {\n margin-bottom: 10px;\n }\n\n #mobile-filter-collapse h2 {\n display: inline-block;\n margin: 0;\n font-size: 2rem;\n }\n\n #mobile-filter-collapse[open] svg {\n transform: rotate(90deg);\n }\n\n #content-container.mobile {\n display: block;\n }\n\n .column {\n padding-top: 2rem;\n }\n\n #right-column {\n flex: 1;\n position: relative;\n border-left: 1px solid rgb(232, 232, 232);\n border-right: 1px solid rgb(232, 232, 232);\n padding-left: 1rem;\n padding-right: 1rem;\n margin-top: var(--rightColumnMarginTop, 0);\n background: #fff;\n }\n\n .mobile #right-column {\n border-left: none;\n padding: 5px 5px 0;\n }\n\n #left-column {\n width: var(--leftColumnWidth, 18rem);\n /* Prevents Safari from shrinking col at first draw */\n min-width: var(--leftColumnWidth, 18rem);\n /* Reduced padding by 0.2rem to add the invisible border in the rule below */\n padding-right: calc(var(--leftColumnPaddingRight, 2.5rem) - 0.2rem);\n border-right: 0.2rem solid transparent; /* Pads to the right of the scrollbar a bit */\n z-index: 1;\n }\n\n .desktop #left-column {\n top: 0;\n position: sticky;\n height: calc(100vh - 2rem);\n max-height: calc(100vh - 2rem);\n overflow-x: hidden;\n overflow-y: scroll;\n\n /*\n * Firefox doesn't support any of the -webkit-scrollbar stuff below, but\n * does at least give us a tiny bit of control over width & color.\n */\n scrollbar-width: thin;\n scrollbar-color: transparent transparent;\n }\n .desktop #left-column:hover {\n scrollbar-color: auto;\n }\n .desktop #left-column::-webkit-scrollbar {\n appearance: none;\n width: 6px;\n }\n .desktop #left-column::-webkit-scrollbar-button {\n height: 3px;\n background: transparent;\n }\n .desktop #left-column::-webkit-scrollbar-corner {\n background: transparent;\n }\n .desktop #left-column::-webkit-scrollbar-thumb {\n border-radius: 4px;\n }\n .desktop #left-column:hover::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.15);\n }\n .desktop #left-column:hover::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.2);\n }\n .desktop #left-column:hover::-webkit-scrollbar-thumb:active {\n background: rgba(0, 0, 0, 0.3);\n }\n\n #facets-bottom-fade {\n background: linear-gradient(\n to bottom,\n #f5f5f700 0%,\n #f5f5f7c0 50%,\n #f5f5f7 80%,\n #f5f5f7 100%\n );\n position: fixed;\n bottom: 0;\n height: 50px;\n /* Wide enough to cover the content, but leave the scrollbar uncovered */\n width: calc(\n var(--leftColumnWidth) + var(--leftColumnPaddingRight) - 10px\n );\n z-index: 2;\n pointer-events: none;\n transition: height 0.1s ease;\n }\n #facets-bottom-fade.hidden {\n height: 0;\n }\n\n .facets-message {\n font-size: 1.4rem;\n }\n\n .desktop #left-column-scroll-sentinel {\n width: 1px;\n height: 100vh;\n background: transparent;\n }\n\n .desktop #facets-scroll-sentinel {\n width: 1px;\n height: 1px;\n background: transparent;\n }\n\n #facets-header-container {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n }\n\n .desktop #facets-header-container {\n flex-wrap: wrap;\n }\n\n .mobile #left-column {\n width: 100%;\n padding: 0;\n }\n\n .clear-filters-btn-row {\n display: inline-block;\n }\n\n .desktop .clear-filters-btn-row {\n width: 100%;\n }\n\n .clear-filters-btn {\n display: inline-block;\n appearance: none;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n color: var(--ia-theme-link-color);\n font-size: 1.4rem;\n font-family: inherit;\n cursor: pointer;\n }\n\n .clear-filters-btn:hover {\n text-decoration: underline;\n }\n\n .clear-filters-btn-separator {\n display: inline-block;\n margin-left: 5px;\n border-left: 1px solid #2c2c2c;\n font-size: 1.4rem;\n line-height: 1.3rem;\n }\n\n #facets-container {\n position: relative;\n max-height: 0;\n transition: max-height 0.2s ease-in-out;\n z-index: 1;\n margin-top: 5rem;\n padding-bottom: 2rem;\n }\n\n .desktop #facets-container {\n width: 18rem;\n }\n\n .mobile #facets-container {\n overflow: hidden;\n padding-bottom: 0;\n padding-left: 10px;\n padding-right: 10px;\n }\n\n #facets-container.expanded {\n max-height: 2000px;\n }\n\n #results-total {\n display: flex;\n align-items: baseline;\n }\n\n .mobile #results-total {\n float: right;\n margin-bottom: 0;\n margin-right: 5px;\n }\n\n #big-results-count {\n font-size: 2.4rem;\n font-weight: 500;\n margin-right: 5px;\n }\n\n .mobile #big-results-count {\n font-size: 2rem;\n }\n\n #big-results-label {\n font-size: 1.4rem;\n font-weight: 200;\n }\n\n #list-header {\n max-height: 4.2rem;\n }\n\n .loading-cover {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n z-index: 1;\n padding-top: 50px;\n }\n\n circular-activity-indicator {\n width: 30px;\n height: 30px;\n }\n\n sort-filter-bar {\n display: block;\n margin-bottom: 4rem;\n }\n\n infinite-scroller {\n display: block;\n --infiniteScrollerRowGap: var(--collectionBrowserRowGap, 1.7rem);\n --infiniteScrollerColGap: var(--collectionBrowserColGap, 1.7rem);\n }\n\n infinite-scroller.list-compact {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 100%\n );\n --infiniteScrollerCellMinHeight: 45px; /* override infinite scroller component */\n --infiniteScrollerCellMaxHeight: 56px;\n --infiniteScrollerRowGap: 10px;\n }\n\n infinite-scroller.list-detail {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 100%\n );\n --infiniteScrollerCellMinHeight: var(\n --collectionBrowserCellMinHeight,\n 5rem\n );\n /*\n 30px in spec, compensating for a -4px margin\n to align title with top of item image\n src/tiles/list/tile-list.ts\n */\n --infiniteScrollerRowGap: 34px;\n }\n\n .mobile infinite-scroller.list-detail {\n --infiniteScrollerRowGap: 24px;\n }\n\n infinite-scroller.grid {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 17rem\n );\n --infiniteScrollerCellMaxWidth: var(\n --collectionBrowserCellMaxWidth,\n 1fr\n );\n }\n\n /* Allow tiles to shrink a bit further at smaller viewport widths */\n @media screen and (max-width: 880px) {\n infinite-scroller.grid {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 15rem\n );\n }\n }\n /* At very small widths, maintain a 2-tile layout as far as it can reasonably go */\n @media screen and (max-width: 360px) {\n infinite-scroller.grid {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 12rem\n );\n }\n }\n\n infinite-scroller.hidden {\n display: none;\n }\n `,\n ];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collection-browser.js","sourceRoot":"","sources":["../../src/collection-browser.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n html,\n css,\n LitElement,\n PropertyValues,\n TemplateResult,\n nothing,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { msg } from '@lit/localize';\n\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport type {\n InfiniteScroller,\n InfiniteScrollerCellProviderInterface,\n} from '@internetarchive/infinite-scroller';\nimport {\n CollectionExtraInfo,\n PageElementName,\n SearchServiceInterface,\n SearchType,\n SortDirection,\n SortParam,\n} from '@internetarchive/search-service';\nimport type {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport '@internetarchive/infinite-scroller';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport type { FeatureFeedbackServiceInterface } from '@internetarchive/feature-feedback';\nimport type { RecaptchaManagerInterface } from '@internetarchive/recaptcha-manager';\nimport './tiles/tile-dispatcher';\nimport './tiles/collection-browser-loading-tile';\nimport './sort-filter-bar/sort-filter-bar';\nimport './manage/manage-bar';\nimport './collection-facets';\nimport './circular-activity-indicator';\nimport {\n SelectedFacets,\n SortField,\n CollectionBrowserContext,\n getDefaultSelectedFacets,\n TileModel,\n CollectionDisplayMode,\n PrefixFilterType,\n PrefixFilterCounts,\n FacetEventDetails,\n sortOptionFromAPIString,\n SORT_OPTIONS,\n defaultProfileElementSorts,\n} from './models';\nimport {\n RestorationStateHandlerInterface,\n RestorationStateHandler,\n RestorationState,\n} from './restoration-state-handler';\nimport { CollectionBrowserDataSource } from './data-source/collection-browser-data-source';\nimport type {\n CollectionBrowserQueryState,\n CollectionBrowserSearchInterface,\n} from './data-source/collection-browser-query-state';\nimport chevronIcon from './assets/img/icons/chevron';\nimport type { PlaceholderType } from './empty-placeholder';\nimport './empty-placeholder';\n\nimport {\n analyticsActions,\n analyticsCategories,\n} from './utils/analytics-events';\nimport { srOnlyStyle } from './styles/sr-only';\nimport { sha1 } from './utils/sha1';\nimport type { CollectionFacets } from './collection-facets';\nimport type { ManageableItem } from './manage/manage-bar';\nimport { formatDate } from './utils/format-date';\nimport type { CollectionBrowserDataSourceInterface } from './data-source/collection-browser-data-source-interface';\n\n@customElement('collection-browser')\nexport class CollectionBrowser\n extends LitElement\n implements\n InfiniteScrollerCellProviderInterface,\n SharedResizeObserverResizeHandlerInterface,\n CollectionBrowserSearchInterface\n{\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: String }) baseImageUrl: string = 'https://archive.org';\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) searchType: SearchType = SearchType.METADATA;\n\n @property({ type: String }) withinCollection?: string;\n\n @property({ type: String }) withinProfile?: string;\n\n @property({ type: String }) profileElement?: PageElementName;\n\n @property({ type: String }) baseQuery?: string;\n\n @property({ type: String }) displayMode?: CollectionDisplayMode;\n\n @property({ type: Object }) defaultSortParam: SortParam | null = null;\n\n @property({ type: String }) selectedSort: SortField = SortField.default;\n\n @property({ type: String }) selectedTitleFilter: string | null = null;\n\n @property({ type: String }) selectedCreatorFilter: string | null = null;\n\n @property({ type: String }) sortDirection: SortDirection | null = null;\n\n @property({ type: Number }) pageSize = 50;\n\n @property({ type: Number }) currentPage?: number;\n\n @property({ type: String }) minSelectedDate?: string;\n\n @property({ type: String }) maxSelectedDate?: string;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Boolean }) showHistogramDatePicker = false;\n\n @property({ type: Boolean }) suppressPlaceholders = false;\n\n @property({ type: Boolean }) suppressResultCount = false;\n\n @property({ type: Boolean }) suppressURLQuery = false;\n\n @property({ type: Boolean }) suppressFacets = false;\n\n @property({ type: Boolean }) suppressSortBar = false;\n\n @property({ type: Boolean }) clearResultsOnEmptyQuery = false;\n\n @property({ type: String }) collectionPagePath: string = '/details/';\n\n /** describes where this component is being used */\n @property({ type: String, reflect: true }) searchContext: string =\n analyticsCategories.default;\n\n @property({ type: String }) pageContext: CollectionBrowserContext = 'search';\n\n @property({ type: Object })\n restorationStateHandler: RestorationStateHandlerInterface = new RestorationStateHandler(\n {\n context: this.pageContext,\n }\n );\n\n @property({ type: Number }) mobileBreakpoint = 600;\n\n @property({ type: Boolean }) loggedIn = false;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface = undefined;\n\n @property({ type: Object })\n featureFeedbackService?: FeatureFeedbackServiceInterface;\n\n @property({ type: Object }) recaptchaManager?: RecaptchaManagerInterface;\n\n /**\n * If item management UI active\n */\n @property({ type: Boolean }) isManageView = false;\n\n @property({ type: Boolean }) isLoansTab = false;\n\n /**\n * The results per page so we can paginate.\n *\n * This allows us to start in the middle of the search results and\n * fetch data before or after the current page. If we don't have a key\n * for the previous/next page, we'll fetch the next/previous page to populate it\n */\n @property({ type: Object }) dataSource: CollectionBrowserDataSourceInterface =\n new CollectionBrowserDataSource(this, this.pageSize);\n\n /**\n * The page that the consumer wants to load.\n */\n initialPageNumber = 1;\n\n /**\n * This the the number of pages that we want to show.\n *\n * The data isn't necessarily loaded for all of the pages, but this lets us\n * know how many cells we should render.\n */\n @state() private pagesToRender = this.initialPageNumber;\n\n /**\n * Whether the initial page fetch for a new query is currently in progress.\n */\n @state() private searchResultsLoading = false;\n\n @state() private facetsLoading = false;\n\n @state() private totalResults?: number;\n\n @state() private mobileView = false;\n\n @state() private mobileFacetsVisible = false;\n\n @state() private contentWidth?: number;\n\n @state() private defaultSortField: Exclude<SortField, SortField.default> =\n SortField.relevance;\n\n @state() private defaultSortDirection: SortDirection | null = null;\n\n @state() private placeholderType: PlaceholderType = null;\n\n @state() private prefixFilterCountMap: Partial<\n Record<PrefixFilterType, PrefixFilterCounts>\n > = {};\n\n @query('#content-container') private contentContainer!: HTMLDivElement;\n\n @query('#left-column') private leftColumn?: HTMLDivElement;\n\n @query('collection-facets') private collectionFacets?: CollectionFacets;\n\n @property({ type: Object, attribute: false })\n private analyticsHandler?: AnalyticsManagerInterface;\n\n /**\n * When we're animated scrolling to the page, we don't want to fetch\n * all of the pages as it scrolls so this lets us know if we're scrolling\n */\n private isScrollingToCell = false;\n\n /**\n * When page width resizes from desktop to mobile, set true to\n * disable expand/collapse transition when loading.\n */\n private isResizeToMobile = false;\n\n private leftColIntersectionObserver?: IntersectionObserver;\n\n private facetsIntersectionObserver?: IntersectionObserver;\n\n private placeholderCellTemplate = html`<collection-browser-loading-tile></collection-browser-loading-tile>`;\n\n constructor() {\n super();\n this.addController(this.dataSource);\n }\n\n private tileModelAtCellIndex(index: number): TileModel | undefined {\n const model = this.dataSource.getTileModelAt(index);\n /**\n * If we encounter a model we don't have yet and we're not in the middle of an\n * automated scroll, fetch the page and just return undefined.\n * The datasource will be updated once the page is loaded and the cell will be rendered.\n *\n * We disable it during the automated scroll since we don't want to fetch pages for intervening cells the\n * user may never see.\n */\n if (!model && !this.isScrollingToCell && this.dataSource.queryInitialized) {\n const pageNumber = Math.floor(index / this.pageSize) + 1;\n this.dataSource.fetchPage(pageNumber);\n }\n return model;\n }\n\n // this is the total number of tiles we expect if\n // the data returned is a full page worth\n // this is useful for putting in placeholders for the expected number of tiles\n private get estimatedTileCount(): number {\n return this.pagesToRender * this.pageSize;\n }\n\n /**\n * How many tiles to offset the data source by, to account for any removed tiles.\n */\n private tileModelOffset = 0;\n\n @query('infinite-scroller')\n private infiniteScroller!: InfiniteScroller;\n\n private sessionIdGenPromise?: Promise<string>;\n\n /**\n * Returns a promise resolving to a unique string that persists for the current browser session.\n * Used in generating unique IDs for search requests, so that multiple requests coming from the\n * same browser session can be identified.\n */\n async getSessionId(): Promise<string> {\n try {\n const storedSessionId = sessionStorage?.getItem('cb-session');\n if (storedSessionId) {\n return storedSessionId;\n }\n\n // If we enter this method a second time while a first session ID is already being generated,\n // ensure we produce the same ID from both calls instead of generating another one.\n if (this.sessionIdGenPromise) {\n return this.sessionIdGenPromise;\n }\n\n this.sessionIdGenPromise = sha1(Math.random().toString());\n const newSessionId = await this.sessionIdGenPromise;\n\n sessionStorage?.setItem('cb-session', newSessionId);\n return newSessionId;\n } catch (err) {\n // Either we can't generate the hash or we're restricted from accessing sessionStorage\n return '';\n }\n }\n\n /**\n * Go to the given page of results\n *\n * @param pageNumber\n */\n goToPage(pageNumber: number) {\n this.initialPageNumber = pageNumber;\n this.pagesToRender = pageNumber;\n return this.scrollToPage(pageNumber);\n }\n\n /**\n * Sets the state for whether the initial set of search results is loading in.\n */\n setSearchResultsLoading(loading: boolean): void {\n console.log('setting search results loading to', loading);\n this.searchResultsLoading = loading;\n }\n\n /**\n * Sets the state for whether facet data is loading in\n */\n setFacetsLoading(loading: boolean): void {\n console.log('setting facets loading to', loading);\n this.facetsLoading = loading;\n }\n\n /**\n * Sets the total number of results to be displayed for the current search\n */\n setTotalResultCount(totalResults: number): void {\n this.totalResults = totalResults;\n }\n\n /**\n * Clears all selected/negated facets, date ranges, and letter filters.\n *\n * By default, the current sort field/direction are not cleared,\n * but this can be overridden by setting the `sort` option to `true`.\n *\n * Similarly, it is possible to finely control what is cleared by\n * setting any of the `facets`, `dateRange`, or `letterFilters` flags\n * in the options object.\n */\n clearFilters({\n facets = true,\n dateRange = true,\n letterFilters = true,\n sort = false,\n } = {}): void {\n // Don't bother clearing facets if none are checked, so that we don't\n // trigger unnecessary update cycles.\n if (facets && this.hasCheckedFacets) {\n this.selectedFacets = getDefaultSelectedFacets();\n }\n\n if (dateRange) {\n this.minSelectedDate = undefined;\n this.maxSelectedDate = undefined;\n }\n\n if (letterFilters) {\n this.selectedTitleFilter = null;\n this.selectedCreatorFilter = null;\n }\n\n if (sort) {\n this.sortDirection = null;\n this.selectedSort = SortField.default;\n }\n }\n\n /**\n * Returns true if the current value of `this.selectedFacets` contains\n * any facet buckets than have been selected or negated, or false otherwise.\n */\n private get hasCheckedFacets(): boolean {\n if (!this.selectedFacets) return false;\n\n for (const facetGroup of Object.values(this.selectedFacets)) {\n for (const bucket of Object.values(facetGroup)) {\n if (bucket.state !== 'none') return true;\n }\n }\n\n return false;\n }\n\n /**\n * Returns true if there are any currently selected/negated facet buckets,\n * any selected date range, or any selected letter filters. False otherwise.\n *\n * Ignores sorting options.\n */\n private get hasActiveFilters(): boolean {\n return !!(\n this.hasCheckedFacets ||\n this.minSelectedDate ||\n this.maxSelectedDate ||\n this.selectedTitleFilter ||\n this.selectedCreatorFilter\n );\n }\n\n render() {\n this.setPlaceholderType();\n return html`\n <div\n id=\"content-container\"\n class=${this.mobileView ? 'mobile' : 'desktop'}\n >\n ${this.placeholderType\n ? this.emptyPlaceholderTemplate\n : this.collectionBrowserTemplate}\n </div>\n `;\n }\n\n private setPlaceholderType() {\n const hasQuery = !!this.baseQuery?.trim();\n const isCollection = !!this.withinCollection;\n const isProfile = !!this.withinProfile;\n const noResults =\n !this.searchResultsLoading &&\n (this.dataSource.size === 0 || !this.searchService);\n\n this.placeholderType = null;\n if (this.suppressPlaceholders) return;\n\n if (!hasQuery && !isCollection && !isProfile) {\n this.placeholderType = 'empty-query';\n } else if (noResults) {\n // Within a collection, no query + no results means the collection simply has no viewable items.\n // Otherwise, we must have a user query that produced 0 results.\n this.placeholderType =\n !hasQuery && isCollection ? 'empty-collection' : 'no-results';\n }\n\n if (this.dataSource.queryErrorMessage) {\n this.placeholderType =\n !hasQuery && isCollection ? 'collection-error' : 'query-error';\n }\n }\n\n private get emptyPlaceholderTemplate() {\n return html`\n <empty-placeholder\n .placeholderType=${this.placeholderType}\n ?isMobileView=${this.mobileView}\n ?isCollection=${!!this.withinCollection}\n .detailMessage=${this.dataSource.queryErrorMessage ?? ''}\n .baseNavigationUrl=${this.baseNavigationUrl}\n ></empty-placeholder>\n ${this.infiniteScrollerTemplate}\n `;\n }\n\n /**\n * Top-level template for rendering the left (facets) and right (results) columns.\n */\n private get collectionBrowserTemplate() {\n return html`\n <div id=\"left-column-scroll-sentinel\"></div>\n ${this.leftColumnTemplate} ${this.rightColumnTemplate}\n `;\n }\n\n /**\n * Template for either the mobile or desktop version of the left column, depending\n * on current component state.\n */\n private get leftColumnTemplate(): TemplateResult {\n if (this.mobileView) {\n return this.mobileLeftColumnTemplate;\n }\n return this.desktopLeftColumnTemplate;\n }\n\n /**\n * Template for the mobile version of the \"left column\" (which in this case, appears\n * *above* the search results rather than beside them), for rendering the\n * accordion-style facets.\n */\n private get mobileLeftColumnTemplate(): TemplateResult {\n return html`\n <div\n id=\"left-column\"\n class=\"column${this.isResizeToMobile ? ' preload' : ''}\"\n >\n ${this.facetTopViewSlot} ${this.resultsCountTemplate}\n <div id=\"facets-header-container\">${this.mobileFacetsTemplate}</div>\n </div>\n `;\n }\n\n /**\n * Template for the desktop version of the left column, displaying the facets sidebar.\n */\n private get desktopLeftColumnTemplate(): TemplateResult {\n return html`\n <div id=\"left-column\" class=\"column\">\n ${this.facetTopViewSlot}\n <div id=\"facets-header-container\">\n <h2 id=\"facets-header\" class=\"sr-only\">Filters</h2>\n ${this.resultsCountTemplate} ${this.clearFiltersBtnTemplate(false)}\n </div>\n <div id=\"facets-container\" aria-labelledby=\"facets-header\">\n ${this.facetsTemplate}\n <div id=\"facets-scroll-sentinel\"></div>\n </div>\n <div id=\"facets-bottom-fade\"></div>\n </div>\n `;\n }\n\n /**\n * Slot which is placed at top of the facets area for user-profile page\n * - mainly used to render userlists\n */\n private get facetTopViewSlot(): TemplateResult {\n return html`<div id=\"facet-top-view\">\n <slot name=\"facet-top-slot\"></slot>\n </div>`;\n }\n\n /**\n * Template for the \"X Results\" count at the top of the search results.\n * Changes to the \"Searching...\" label if the search results are still loading.\n */\n private get resultsCountTemplate(): TemplateResult | typeof nothing {\n if (this.suppressResultCount) return nothing;\n\n const shouldShowSearching =\n this.searchResultsLoading || this.totalResults === undefined;\n const resultsCount = this.totalResults?.toLocaleString();\n const resultsLabel = this.totalResults === 1 ? 'Result' : 'Results';\n\n return html`\n <div id=\"results-total\">\n <span id=\"big-results-count\">\n ${shouldShowSearching ? html`Searching…` : resultsCount}\n </span>\n <span id=\"big-results-label\">\n ${shouldShowSearching ? nothing : resultsLabel}\n </span>\n </div>\n `;\n }\n\n /**\n * Template for the right column of the collection browser, where the result\n * tiles and sort/filter bar are shown.\n */\n private get rightColumnTemplate(): TemplateResult {\n return html`\n <div id=\"right-column\" class=\"column\">\n <div id=\"cb-top-view\">\n <slot name=\"cb-top-slot\"></slot>\n </div>\n ${this.isManageView\n ? this.manageBarTemplate\n : this.sortFilterBarTemplate}\n <slot name=\"cb-results\"></slot>\n ${this.displayMode === `list-compact`\n ? this.listHeaderTemplate\n : nothing}\n ${this.infiniteScrollerTemplate}\n </div>\n `;\n }\n\n private get infiniteScrollerTemplate() {\n return html`<infinite-scroller\n class=${this.infiniteScrollerClasses}\n itemCount=${this.placeholderType ? 0 : nothing}\n ariaLandmarkLabel=\"Search results\"\n .cellProvider=${this}\n .placeholderCellTemplate=${this.placeholderCellTemplate}\n @scrollThresholdReached=${this.scrollThresholdReached}\n @visibleCellsChanged=${this.visibleCellsChanged}\n >${this.displayMode === 'grid'\n ? html`<slot name=\"result-last-tile\" slot=\"result-last-tile\"></slot>`\n : nothing}\n </infinite-scroller>`;\n }\n\n private get infiniteScrollerClasses() {\n return classMap({\n [this.displayMode ?? '']: !!this.displayMode,\n hidden: !!this.placeholderType,\n });\n }\n\n private get sortFilterBarTemplate(): TemplateResult | typeof nothing {\n if (this.suppressSortBar) return nothing;\n\n return html`\n <sort-filter-bar\n .defaultSortField=${this.defaultSortField}\n .defaultSortDirection=${this.defaultSortDirection}\n .selectedSort=${this.selectedSort}\n .sortDirection=${this.sortDirection}\n .showRelevance=${this.isRelevanceSortAvailable}\n .showDateFavorited=${this.withinCollection?.startsWith('fav-')}\n .displayMode=${this.displayMode}\n .selectedTitleFilter=${this.selectedTitleFilter}\n .selectedCreatorFilter=${this.selectedCreatorFilter}\n .prefixFilterCountMap=${this.dataSource.prefixFilterCountMap}\n .resizeObserver=${this.resizeObserver}\n @sortChanged=${this.userChangedSort}\n @displayModeChanged=${this.displayModeChanged}\n @titleLetterChanged=${this.titleLetterSelected}\n @creatorLetterChanged=${this.creatorLetterSelected}\n .showLoansTopBar=${this.isLoansTab}\n >\n <div slot=\"sortbar-left-slot\">\n <slot name=\"sortbar-left-slot\"></slot>\n </div>\n <slot\n name=\"loans-tab-filter-bar-options-slot\"\n slot=\"loans-tab-filter-bar-options-slot\"\n ></slot>\n </sort-filter-bar>\n `;\n }\n\n private get manageBarTemplate(): TemplateResult {\n return html`\n <manage-bar\n showSelectAll\n showUnselectAll\n @removeItems=${this.handleRemoveItems}\n @selectAll=${() => this.dataSource.checkAllTiles()}\n @unselectAll=${() => this.dataSource.uncheckAllTiles()}\n @cancel=${() => {\n this.isManageView = false;\n this.dataSource.uncheckAllTiles();\n }}\n ></manage-bar>\n `;\n }\n\n /**\n * Handler for when the user requests to remove all checked items via the manage bar.\n * Emits an `itemRemovalRequested` event with all checked tile models.\n */\n private handleRemoveItems(): void {\n this.dispatchEvent(\n new CustomEvent<{ items: ManageableItem[] }>('itemRemovalRequested', {\n detail: {\n items: this.dataSource.checkedTileModels.map(model => {\n const cloned = model.clone();\n cloned.dateStr = formatDate(model.datePublished, 'long');\n return cloned as ManageableItem;\n }),\n },\n })\n );\n }\n\n /**\n * Removes all tile models that are currently checked & adjusts the paging\n * of the data source to account for any new gaps in the data.\n */\n removeCheckedTiles(): void {\n this.dataSource.removeCheckedTiles();\n }\n\n private userChangedSort(\n e: CustomEvent<{\n selectedSort: SortField;\n sortDirection: SortDirection | null;\n }>\n ) {\n const { selectedSort, sortDirection } = e.detail;\n this.selectedSort = selectedSort;\n this.sortDirection = sortDirection;\n\n if ((this.currentPage ?? 1) > 1) {\n this.goToPage(1);\n }\n this.currentPage = 1;\n }\n\n private sendSortByAnalytics(prevSortDirection: SortDirection | null): void {\n const directionCleared = prevSortDirection && !this.sortDirection;\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.sortBy,\n label: `${this.selectedSort}${\n this.sortDirection || directionCleared ? `-${this.sortDirection}` : ''\n }`,\n });\n }\n\n private selectedSortChanged(): void {\n // Lazy-load the alphabet counts for title/creator sort bar as needed\n this.updatePrefixFiltersForCurrentSort();\n }\n\n get sortParam(): SortParam | null {\n const sortOption = SORT_OPTIONS[this.selectedSort];\n if (!sortOption?.handledBySearchService) {\n return null;\n }\n\n // If the sort option specified in the URL is unrecognized, we just use it as-is\n const urlSortParam = new URL(window.location.href).searchParams.get('sort');\n const sortField =\n sortOption.searchServiceKey ?? urlSortParam?.replace(/^-/, '');\n\n // If the sort direction is still null at this point, then we assume ascending\n // (i.e., it was unrecognized and had no directional flag)\n if (!this.sortDirection) this.sortDirection = 'asc';\n\n if (!sortField) return null;\n return { field: sortField, direction: this.sortDirection };\n }\n\n private displayModeChanged(\n e: CustomEvent<{ displayMode?: CollectionDisplayMode }>\n ): void {\n this.displayMode = e.detail.displayMode;\n\n if (this.displayMode) {\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.displayMode,\n label: this.displayMode,\n });\n }\n }\n\n /**\n * Returns a query clause identifying the currently selected title filter,\n * e.g., `firstTitle:X`.\n */\n private get titleQuery(): string | undefined {\n return this.selectedTitleFilter\n ? `firstTitle:${this.selectedTitleFilter}`\n : undefined;\n }\n\n /**\n * Returns a query clause identifying the currently selected creator filter,\n * e.g., `firstCreator:X`.\n */\n private get creatorQuery(): string | undefined {\n return this.selectedCreatorFilter\n ? `firstCreator:${this.selectedCreatorFilter}`\n : undefined;\n }\n\n /**\n * Send Analytics when sorting by title's first letter\n * labels: 'start-<ToLetter>' | 'clear-<FromLetter>' | '<FromLetter>-<ToLetter>'\n */\n private sendFilterByTitleAnalytics(prevSelectedLetter: string | null): void {\n if (!prevSelectedLetter && !this.selectedTitleFilter) {\n return;\n }\n const cleared = prevSelectedLetter && !this.selectedTitleFilter;\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.filterByTitle,\n label: cleared\n ? `clear-${prevSelectedLetter}`\n : `${prevSelectedLetter || 'start'}-${this.selectedTitleFilter}`,\n });\n }\n\n /**\n * Send Analytics when filtering by creator's first letter\n * labels: 'start-<ToLetter>' | 'clear-<FromLetter>' | '<FromLetter>-<ToLetter>'\n */\n private sendFilterByCreatorAnalytics(\n prevSelectedLetter: string | null\n ): void {\n if (!prevSelectedLetter && !this.selectedCreatorFilter) {\n return;\n }\n const cleared = prevSelectedLetter && !this.selectedCreatorFilter;\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.filterByCreator,\n label: cleared\n ? `clear-${prevSelectedLetter}`\n : `${prevSelectedLetter || 'start'}-${this.selectedCreatorFilter}`,\n });\n }\n\n /**\n * Handler for changes to which letter is selected in the title alphabet bar.\n */\n private titleLetterSelected(\n e: CustomEvent<{ selectedLetter: string | null }>\n ): void {\n this.selectedCreatorFilter = null;\n this.selectedTitleFilter = e.detail.selectedLetter;\n }\n\n /**\n * Handler for changes to which letter is selected in the creator alphabet bar.\n */\n private creatorLetterSelected(\n e: CustomEvent<{ selectedLetter: string | null }>\n ): void {\n this.selectedTitleFilter = null;\n this.selectedCreatorFilter = e.detail.selectedLetter;\n }\n\n /**\n * The full template for how the facets should be structured in mobile view,\n * including the collapsible container (with header) and the facets themselves.\n */\n private get mobileFacetsTemplate(): TemplateResult {\n const toggleFacetsVisible = () => {\n this.isResizeToMobile = false;\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n };\n\n return html`\n <details\n id=\"mobile-filter-collapse\"\n @click=${toggleFacetsVisible}\n @keyup=${toggleFacetsVisible}\n >\n <summary>\n <span class=\"collapser-icon\">${chevronIcon}</span>\n <h2>Filters</h2>\n ${this.clearFiltersBtnTemplate(true)}\n </summary>\n ${this.facetsTemplate}\n </details>\n `;\n }\n\n /**\n * The template for the facets component alone, without any surrounding wrappers.\n */\n private get facetsTemplate() {\n if (this.suppressFacets) {\n return html`\n <p class=\"facets-message\">\n ${msg('Facets are temporarily unavailable.')}\n </p>\n `;\n }\n\n return html`\n <collection-facets\n @facetsChanged=${this.facetsChanged}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n .collectionPagePath=${this.collectionPagePath}\n .parentCollections=${this.dataSource.parentCollections}\n .withinCollection=${this.withinCollection}\n .searchService=${this.searchService}\n .featureFeedbackService=${this.featureFeedbackService}\n .recaptchaManager=${this.recaptchaManager}\n .resizeObserver=${this.resizeObserver}\n .searchType=${this.searchType}\n .aggregations=${this.dataSource.aggregations}\n .fullYearsHistogramAggregation=${this.dataSource\n .yearHistogramAggregation}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .selectedFacets=${this.selectedFacets}\n .baseNavigationUrl=${this.baseNavigationUrl}\n .collectionTitles=${this.dataSource.collectionTitles}\n .showHistogramDatePicker=${this.showHistogramDatePicker}\n .allowExpandingDatePicker=${!this.mobileView}\n .contentWidth=${this.contentWidth}\n .query=${this.baseQuery}\n .filterMap=${this.dataSource.filterMap}\n .isManageView=${this.isManageView}\n .modalManager=${this.modalManager}\n ?collapsableFacets=${this.mobileView}\n ?facetsLoading=${this.facetsLoading}\n ?fullYearAggregationLoading=${this.facetsLoading}\n @facetClick=${this.facetClickHandler}\n .analyticsHandler=${this.analyticsHandler}\n >\n </collection-facets>\n `;\n }\n\n /**\n * The HTML template for the \"Clear all filters\" button, or `nothing` if no\n * filters are currently active.\n *\n * @param mobile Whether to style/shorten the button for mobile view\n */\n private clearFiltersBtnTemplate(\n mobile: boolean\n ): TemplateResult | typeof nothing {\n if (!this.hasActiveFilters) return nothing;\n\n const buttonClasses = classMap({\n 'clear-filters-btn': true,\n mobile,\n });\n\n const buttonText = mobile ? 'Clear all' : 'Clear all filters';\n\n return html`\n <div class=\"clear-filters-btn-row\">\n ${mobile\n ? html`<span class=\"clear-filters-btn-separator\"> </span>`\n : nothing}\n <button class=${buttonClasses} @click=${this.clearFilters}>\n ${buttonText}\n </button>\n </div>\n `;\n }\n\n private get loadingTemplate() {\n return html`\n <div class=\"loading-cover\">\n <circular-activity-indicator></circular-activity-indicator>\n </div>\n `;\n }\n\n private get listHeaderTemplate() {\n return html`\n <div id=\"list-header\">\n <tile-dispatcher\n .tileDisplayMode=${'list-header'}\n .resizeObserver=${this.resizeObserver}\n .sortParam=${this.sortParam}\n .defaultSortParam=${this.defaultSortParam}\n .mobileBreakpoint=${this.mobileBreakpoint}\n .loggedIn=${this.loggedIn}\n >\n </tile-dispatcher>\n </div>\n `;\n }\n\n private histogramDateRangeUpdated(\n e: CustomEvent<{\n minDate: string;\n maxDate: string;\n }>\n ) {\n const { minDate, maxDate } = e.detail;\n [this.minSelectedDate, this.maxSelectedDate] = [minDate, maxDate];\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.histogramChanged,\n label: this.dateRangeQueryClause,\n });\n }\n\n private get dateRangeQueryClause() {\n if (!this.minSelectedDate || !this.maxSelectedDate) {\n return undefined;\n }\n\n return `year:[${this.minSelectedDate} TO ${this.maxSelectedDate}]`;\n }\n\n /**\n * Emits an event indicating a change in whether the manage mode is shown.\n */\n private emitManageModeChangedEvent(): void {\n this.dispatchEvent(\n new CustomEvent<boolean>('manageModeChanged', {\n detail: this.isManageView,\n })\n );\n }\n\n async installDataSourceAndQueryState(\n dataSource: CollectionBrowserDataSourceInterface,\n queryState: CollectionBrowserQueryState\n ): Promise<void> {\n console.log('installing in CB:', dataSource, queryState);\n if (this.dataSource) this.removeController(this.dataSource);\n this.dataSource = dataSource;\n this.addController(this.dataSource);\n\n this.baseQuery = queryState.baseQuery;\n this.profileElement = queryState.profileElement;\n this.searchType = queryState.searchType;\n this.selectedFacets = queryState.selectedFacets ?? getDefaultSelectedFacets();\n this.minSelectedDate = queryState.minSelectedDate;\n this.maxSelectedDate = queryState.maxSelectedDate;\n this.selectedSort = queryState.selectedSort ?? SortField.default;\n this.sortDirection = queryState.sortDirection;\n this.selectedTitleFilter = queryState.selectedTitleFilter;\n this.selectedCreatorFilter = queryState.selectedCreatorFilter;\n\n this.requestUpdate();\n await this.updateComplete;\n\n if (!this.searchResultsLoading) {\n this.setTotalResultCount(this.dataSource.totalResults);\n this.setTileCount(this.dataSource.size);\n this.refreshVisibleResults();\n }\n }\n\n firstUpdated(): void {\n this.setupStateRestorationObserver();\n this.restoreState();\n }\n\n updated(changed: PropertyValues) {\n console.log(\n '* CB UPDATED\\n',\n [...changed.entries()]\n .map(([k, v]) => `${String(k)}: ${v} => ${this[k as keyof this]}`)\n .join('\\n')\n );\n\n if (changed.has('placeholderType') && this.placeholderType === null) {\n if (!this.leftColIntersectionObserver) {\n this.setupLeftColumnScrollListeners();\n }\n if (!this.facetsIntersectionObserver) {\n this.setupFacetsScrollListeners();\n }\n this.updateLeftColumnHeight();\n }\n\n if (\n changed.has('displayMode') ||\n changed.has('baseNavigationUrl') ||\n changed.has('baseImageUrl') ||\n changed.has('loggedIn')\n ) {\n this.infiniteScroller?.reload();\n }\n\n if (\n changed.has('baseQuery') ||\n changed.has('searchType') ||\n changed.has('withinCollection')\n ) {\n // Unless this query/search type update is from the initial page load or the\n // result of hitting the back button,\n // we need to clear any existing filters since they may no longer be valid for\n // the new set of search results.\n if (!this.historyPopOccurred && this.initialQueryChangeHappened) {\n // Ordinarily, we leave the sort param unchanged between searches.\n // However, if we are changing the target collection itself, we want the sort cleared too,\n // since different collections may have different sorting options available.\n const shouldClearSort =\n changed.has('withinCollection') &&\n !changed.has('selectedSort') &&\n !changed.has('sortDirection');\n\n // Otherwise, only clear filters that haven't been simultaneously applied in this update\n this.clearFilters({\n sort: shouldClearSort,\n facets: !changed.has('selectedFacets'),\n dateRange: !(\n changed.has('minSelectedDate') || changed.has('maxSelectedDate')\n ),\n letterFilters: !(\n changed.has('selectedTitleFilter') ||\n changed.has('selectedCreatorFilter')\n ),\n });\n }\n }\n\n if (changed.has('profileElement')) {\n this.applyDefaultProfileSort();\n }\n\n if (changed.has('baseQuery')) {\n this.emitBaseQueryChanged();\n }\n if (changed.has('searchType')) {\n this.emitSearchTypeChanged();\n }\n\n if (changed.has('currentPage') || changed.has('displayMode')) {\n this.persistState();\n }\n\n if (\n changed.has('baseQuery') ||\n changed.has('minSelectedDate') ||\n changed.has('maxSelectedDate') ||\n changed.has('selectedFacets') ||\n changed.has('searchService') ||\n changed.has('withinCollection')\n ) {\n this.refreshLetterCounts();\n }\n\n if (changed.has('selectedSort') || changed.has('sortDirection')) {\n const prevSortDirection = changed.get('sortDirection') as SortDirection;\n this.sendSortByAnalytics(prevSortDirection);\n this.selectedSortChanged();\n }\n\n if (changed.has('selectedTitleFilter')) {\n this.sendFilterByTitleAnalytics(\n changed.get('selectedTitleFilter') as string\n );\n }\n if (changed.has('selectedCreatorFilter')) {\n this.sendFilterByCreatorAnalytics(\n changed.get('selectedCreatorFilter') as string\n );\n }\n\n if (\n changed.has('baseQuery') ||\n changed.has('searchType') ||\n changed.has('selectedTitleFilter') ||\n changed.has('selectedCreatorFilter') ||\n changed.has('minSelectedDate') ||\n changed.has('maxSelectedDate') ||\n changed.has('selectedSort') ||\n changed.has('sortDirection') ||\n changed.has('selectedFacets') ||\n changed.has('searchService') ||\n changed.has('withinCollection') ||\n changed.has('withinProfile') ||\n changed.has('profileElement')\n ) {\n this.handleQueryChange();\n }\n\n if (changed.has('searchResultsLoading')) {\n this.emitSearchResultsLoadingChanged();\n }\n\n if (\n changed.has('facetsLoading') &&\n this.facetsLoading &&\n this.collectionFacets\n ) {\n this.collectionFacets.moreLinksVisible =\n this.searchType !== SearchType.FULLTEXT;\n }\n\n if (changed.has('pagesToRender')) {\n if (!this.dataSource.endOfDataReached && this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\n }\n }\n\n if (changed.has('isManageView')) {\n if (this.isManageView) this.displayMode = 'grid';\n this.infiniteScroller?.refreshAllVisibleCells();\n this.emitManageModeChangedEvent();\n }\n\n if (changed.has('resizeObserver')) {\n const oldObserver = changed.get(\n 'resizeObserver'\n ) as SharedResizeObserverInterface;\n if (oldObserver) this.disconnectResizeObserver(oldObserver);\n this.setupResizeObserver();\n }\n }\n\n disconnectedCallback(): void {\n if (this.resizeObserver) {\n this.disconnectResizeObserver(this.resizeObserver);\n }\n if (this.boundNavigationHandler) {\n window.removeEventListener('popstate', this.boundNavigationHandler);\n }\n\n this.leftColIntersectionObserver?.disconnect();\n this.facetsIntersectionObserver?.disconnect();\n window.removeEventListener('resize', this.updateLeftColumnHeight);\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n const previousView = this.mobileView;\n if (entry.target === this.contentContainer) {\n this.contentWidth = entry.contentRect.width;\n this.mobileView =\n this.contentWidth > 0 && this.contentWidth < this.mobileBreakpoint;\n // If changing from desktop to mobile disable transition\n if (this.mobileView && !previousView) {\n this.isResizeToMobile = true;\n }\n }\n\n // Ensure the facet sidebar remains sized correctly\n this.updateLeftColumnHeight();\n }\n\n /**\n * Sets up listeners for events that may require updating the left column height.\n */\n private setupLeftColumnScrollListeners(): void {\n // We observe intersections between the left column's scroll sentinel and\n // the viewport, so that we can ensure the left column is always sized to\n // match the _available_ viewport height. This should generally be more\n // performant than listening to scroll events on the page or column.\n const leftColumnSentinel = this.shadowRoot?.querySelector(\n '#left-column-scroll-sentinel'\n );\n if (leftColumnSentinel) {\n this.leftColIntersectionObserver = new IntersectionObserver(\n this.updateLeftColumnHeight,\n {\n threshold: [...Array(101).keys()].map(n => n / 100), // Threshold every 1%\n }\n );\n this.leftColIntersectionObserver.observe(leftColumnSentinel);\n }\n\n // We also listen for window resize events, as they are not always captured\n // by the resize observer and can affect the desired height of the left column.\n window.addEventListener('resize', this.updateLeftColumnHeight);\n }\n\n /**\n * Sets up listeners to control whether the facet sidebar shows its bottom fade-out.\n * Note this uses a separate IntersectionObserver from the left column, because we\n * don't need granular intersection thresholds for this.\n */\n private setupFacetsScrollListeners(): void {\n const facetsSentinel = this.shadowRoot?.querySelector(\n '#facets-scroll-sentinel'\n );\n if (facetsSentinel) {\n this.facetsIntersectionObserver = new IntersectionObserver(\n this.updateFacetFadeOut\n );\n this.facetsIntersectionObserver.observe(facetsSentinel);\n }\n }\n\n /**\n * Updates the height of the left column according to its position on the page.\n * Arrow function ensures proper `this` binding.\n */\n private updateLeftColumnHeight = (): void => {\n if (this.mobileView) {\n this.leftColumn?.style?.removeProperty('height');\n } else {\n const clientTop = this.leftColumn?.getBoundingClientRect().top;\n this.leftColumn?.style?.setProperty(\n 'height',\n `${window.innerHeight - (clientTop ?? 0) - 3}px`\n );\n }\n };\n\n /**\n * Toggles whether the fade-out is visible at the bottom of the facets.\n * It should only be visible if the facets are not scrolled to the bottom.\n * Arrow function ensures proper `this` binding.\n */\n private updateFacetFadeOut = (entries: IntersectionObserverEntry[]): void => {\n const fadeElmt = this.shadowRoot?.getElementById('facets-bottom-fade');\n fadeElmt?.classList.toggle('hidden', entries?.[0]?.isIntersecting);\n };\n\n private emitBaseQueryChanged() {\n this.dispatchEvent(\n new CustomEvent<{ baseQuery?: string }>('baseQueryChanged', {\n detail: {\n baseQuery: this.baseQuery,\n },\n })\n );\n }\n\n private emitSearchTypeChanged() {\n this.dispatchEvent(\n new CustomEvent<SearchType>('searchTypeChanged', {\n detail: this.searchType,\n })\n );\n }\n\n emitQueryStateChanged() {\n console.log('emitting query state changed event');\n this.dispatchEvent(\n new CustomEvent<CollectionBrowserQueryState>('queryStateChanged', {\n detail: {\n baseQuery: this.baseQuery,\n withinCollection: this.withinCollection,\n withinProfile: this.withinProfile,\n profileElement: this.profileElement,\n searchType: this.searchType,\n selectedFacets: this.selectedFacets,\n minSelectedDate: this.minSelectedDate,\n maxSelectedDate: this.maxSelectedDate,\n selectedSort: this.selectedSort,\n sortDirection: this.sortDirection,\n selectedTitleFilter: this.selectedTitleFilter,\n selectedCreatorFilter: this.selectedCreatorFilter,\n },\n })\n );\n }\n\n emitEmptyResults() {\n this.dispatchEvent(new Event('emptyResults'));\n }\n\n private disconnectResizeObserver(\n resizeObserver: SharedResizeObserverInterface\n ) {\n resizeObserver.removeObserver({\n target: this.contentContainer,\n handler: this,\n });\n }\n\n private setupResizeObserver() {\n if (!this.resizeObserver) return;\n this.resizeObserver.addObserver({\n target: this.contentContainer,\n handler: this,\n });\n }\n\n /**\n * When the visible cells change from the infinite scroller, we want to emit\n * which page is currently visible so the consumer can update its UI or the URL\n *\n * @param e\n * @returns\n */\n private visibleCellsChanged(\n e: CustomEvent<{ visibleCellIndices: number[] }>\n ) {\n if (this.isScrollingToCell) return;\n const { visibleCellIndices } = e.detail;\n if (visibleCellIndices.length === 0) return;\n const lastVisibleCellIndex =\n visibleCellIndices[visibleCellIndices.length - 1];\n const lastVisibleCellPage =\n Math.floor(lastVisibleCellIndex / this.pageSize) + 1;\n if (this.currentPage !== lastVisibleCellPage) {\n this.currentPage = lastVisibleCellPage;\n }\n const event = new CustomEvent('visiblePageChanged', {\n detail: {\n pageNumber: lastVisibleCellPage,\n },\n });\n this.dispatchEvent(event);\n }\n\n // we only want to scroll on the very first query change\n // so this keeps track of whether we've already set the initial query\n private initialQueryChangeHappened = false;\n\n private historyPopOccurred = false;\n\n // this lets us store the query key so we know if it's actually changed or not\n private previousQueryKey?: string;\n\n /**\n * A Promise which, after each query change, resolves once the fetches for the initial\n * search have completed. Waits for *both* the hits and aggregations fetches to finish.\n *\n * Ensure you await this component's `updateComplete` promise before awaiting this\n * one, to ensure you do not await an obsolete promise from the previous update.\n */\n get initialSearchComplete(): Promise<boolean> {\n return this.dataSource.initialSearchComplete;\n }\n\n private async handleQueryChange() {\n // console.log(\n // 'CB: handling query change',\n // this.previousQueryKey,\n // this.dataSource.pageFetchQueryKey,\n // this.dataSource.canPerformSearch\n // );\n // only reset if the query has actually changed\n if (\n !this.searchService ||\n this.dataSource.pageFetchQueryKey === this.previousQueryKey\n )\n return;\n\n // If the new state prevents us from updating the search results, don't reset\n if (\n !this.dataSource.canPerformSearch &&\n !(this.clearResultsOnEmptyQuery && this.baseQuery === '')\n )\n return;\n\n console.log(\n 'CB will reset',\n this.baseQuery,\n JSON.stringify(this.selectedFacets)\n );\n this.previousQueryKey = this.dataSource.pageFetchQueryKey;\n // this.emitQueryStateChanged();\n\n this.tileModelOffset = 0;\n this.totalResults = undefined;\n this.pagesToRender =\n this.initialPageNumber === 1\n ? 2 // First two pages are batched into one request when starting from page 1\n : this.initialPageNumber;\n\n // Reset the infinite scroller's item count, so that it\n // shows tile placeholders until the new query's results load in\n if (this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\n this.infiniteScroller.reload();\n }\n\n if (this.withinCollection && this.baseQuery?.trim()) {\n this.defaultSortField = SortField.relevance;\n this.defaultSortDirection = null;\n }\n\n if (!this.initialQueryChangeHappened && this.initialPageNumber > 1) {\n this.scrollToPage(this.initialPageNumber);\n }\n this.initialQueryChangeHappened = true;\n\n // if the query changed as part of a window.history pop event, we don't want to\n // persist the state because it overwrites the forward history\n if (!this.historyPopOccurred) {\n this.persistState();\n }\n this.historyPopOccurred = false;\n\n // Fire the initial page and facets requests\n // await this.dataSource.handleQueryChange();\n }\n\n private setupStateRestorationObserver() {\n if (this.boundNavigationHandler) return;\n this.boundNavigationHandler = this.historyNavigationHandler.bind(this);\n // when the user navigates back, we want to update the UI to match the URL\n window.addEventListener('popstate', this.boundNavigationHandler);\n }\n\n private boundNavigationHandler?: () => void;\n\n private historyNavigationHandler() {\n this.historyPopOccurred = true;\n this.restoreState();\n }\n\n private restoreState() {\n const restorationState = this.restorationStateHandler.getRestorationState();\n this.displayMode = restorationState.displayMode;\n if (restorationState.searchType != null)\n this.searchType = restorationState.searchType;\n this.selectedSort = restorationState.selectedSort ?? SortField.default;\n this.sortDirection = restorationState.sortDirection ?? null;\n this.selectedTitleFilter = restorationState.selectedTitleFilter ?? null;\n this.selectedCreatorFilter = restorationState.selectedCreatorFilter ?? null;\n this.selectedFacets = restorationState.selectedFacets;\n if (!this.suppressURLQuery) this.baseQuery = restorationState.baseQuery;\n this.currentPage = restorationState.currentPage ?? 1;\n this.minSelectedDate = restorationState.minSelectedDate;\n this.maxSelectedDate = restorationState.maxSelectedDate;\n if (this.currentPage > 1) {\n this.goToPage(this.currentPage);\n }\n }\n\n private persistState() {\n const restorationState: RestorationState = {\n displayMode: this.displayMode,\n searchType: this.searchType,\n selectedSort: this.selectedSort,\n sortDirection: this.sortDirection ?? undefined,\n selectedFacets: this.selectedFacets ?? getDefaultSelectedFacets(),\n baseQuery: this.suppressURLQuery ? undefined : this.baseQuery,\n currentPage: this.currentPage,\n titleQuery: this.titleQuery,\n creatorQuery: this.creatorQuery,\n minSelectedDate: this.minSelectedDate,\n maxSelectedDate: this.maxSelectedDate,\n selectedTitleFilter: this.selectedTitleFilter ?? undefined,\n selectedCreatorFilter: this.selectedCreatorFilter ?? undefined,\n };\n this.restorationStateHandler.persistState(restorationState);\n }\n\n private emitSearchResultsLoadingChanged(): void {\n this.dispatchEvent(\n new CustomEvent<{ loading: boolean }>('searchResultsLoadingChanged', {\n detail: {\n loading: this.searchResultsLoading,\n },\n })\n );\n }\n\n facetsChanged(e: CustomEvent<SelectedFacets>) {\n this.selectedFacets = e.detail;\n }\n\n facetClickHandler({\n detail: { facetType, bucket, negative },\n }: CustomEvent<FacetEventDetails>): void {\n let action: analyticsActions;\n if (negative) {\n action =\n bucket.state !== 'none'\n ? analyticsActions.facetNegativeSelected\n : analyticsActions.facetNegativeDeselected;\n } else {\n action =\n bucket.state !== 'none'\n ? analyticsActions.facetSelected\n : analyticsActions.facetDeselected;\n }\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action,\n label: facetType,\n });\n }\n\n private scrollToPage(pageNumber: number): Promise<void> {\n return new Promise(resolve => {\n const cellIndexToScrollTo = this.pageSize * (pageNumber - 1);\n // without this setTimeout, Safari just pauses until the `fetchPage` is complete\n // then scrolls to the cell\n setTimeout(() => {\n this.isScrollingToCell = true;\n this.infiniteScroller?.scrollToCell(cellIndexToScrollTo, true);\n // This timeout is to give the scroll animation time to finish\n // then updating the infinite scroller once we're done scrolling\n // There's no scroll animation completion callback so we're\n // giving it 0.5s to finish.\n setTimeout(() => {\n this.isScrollingToCell = false;\n this.infiniteScroller?.refreshAllVisibleCells();\n resolve();\n }, 500);\n }, 0);\n });\n }\n\n /**\n * Whether sorting by relevance makes sense for the current state.\n * Currently equivalent to having a non-empty query.\n */\n private get isRelevanceSortAvailable(): boolean {\n return !!this.baseQuery?.trim();\n }\n\n /**\n * Sets the total number of tiles displayed in the infinite scroller.\n */\n setTileCount(count: number): void {\n console.log('Setting scroller tile count to', count);\n if (this.infiniteScroller) {\n this.infiniteScroller.itemCount = count;\n }\n }\n\n /**\n * Applies any default sort option for the current collection, by checking\n * for one in the collection's metadata. If none is found, defaults to sorting\n * descending by:\n * - Date Favorited for fav-* collections\n * - Weekly views for all other collections\n */\n applyDefaultCollectionSort(collectionInfo?: CollectionExtraInfo): void {\n if (this.baseQuery) {\n // If there's a query set, then we default to relevance sorting regardless of\n // the collection metadata-specified sort.\n this.defaultSortField = SortField.relevance;\n this.defaultSortDirection = null;\n return;\n }\n\n // Favorite collections sort on Date Favorited by default.\n // Other collections fall back to sorting on weekly views.\n const baseDefaultSort: string =\n collectionInfo?.public_metadata?.identifier?.startsWith('fav-')\n ? '-favoritedate'\n : '-week';\n\n // The collection metadata may override the default sorting with something else\n const metadataSort: string | undefined =\n collectionInfo?.public_metadata?.['sort-by'];\n\n // Prefer the metadata-specified sort if one exists\n const defaultSortToApply = metadataSort ?? baseDefaultSort;\n\n // Account for both -field and field:dir formats\n let [field, dir] = defaultSortToApply.split(':');\n if (field.startsWith('-')) {\n field = field.slice(1);\n dir = 'desc';\n } else if (!['asc', 'desc'].includes(dir)) {\n dir = 'asc';\n }\n\n const sortOption = sortOptionFromAPIString(field);\n const sortField = sortOption.field;\n if (sortField && sortField !== SortField.default) {\n this.defaultSortField = sortField;\n this.defaultSortDirection = dir as SortDirection;\n this.defaultSortParam = {\n field: this.defaultSortField,\n direction: this.defaultSortDirection,\n };\n }\n }\n\n /**\n * Applies the default sort option for the current profile element\n */\n applyDefaultProfileSort(): void {\n if (this.profileElement) {\n const defaultSortField = defaultProfileElementSorts[this.profileElement];\n this.defaultSortField = defaultSortField ?? SortField.weeklyview;\n } else {\n this.defaultSortField = SortField.weeklyview;\n }\n\n this.defaultSortDirection = 'desc';\n this.defaultSortParam = {\n field: this.defaultSortField,\n direction: this.defaultSortDirection,\n };\n }\n\n /**\n * This is useful for determining whether we need to reload the scroller.\n *\n * When the fetch completes, we need to reload the scroller if the cells for that\n * page are visible, but if the page is not currenlty visible, we don't need to reload\n */\n get currentVisiblePageNumbers(): number[] {\n const visibleCells = this.infiniteScroller?.getVisibleCellIndices() ?? [];\n const visiblePages = new Set<number>();\n visibleCells.forEach(cellIndex => {\n const visiblePage = Math.floor(cellIndex / this.pageSize) + 1;\n visiblePages.add(visiblePage);\n });\n return Array.from(visiblePages);\n }\n\n /**\n * Refreshes all visible result cells in the infinite scroller.\n */\n refreshVisibleResults(): void {\n this.infiniteScroller?.refreshAllVisibleCells();\n }\n\n /**\n * Fetches and caches the prefix filter counts for the current sort type,\n * provided it is one that permits prefix filtering. (If not, this does nothing).\n */\n private async updatePrefixFiltersForCurrentSort(): Promise<void> {\n if (['title', 'creator'].includes(this.selectedSort)) {\n const filterType = this.selectedSort as PrefixFilterType;\n if (!this.prefixFilterCountMap[filterType]) {\n this.dataSource.updatePrefixFilterCounts(filterType);\n }\n }\n }\n\n /**\n * Clears the cached letter counts for both title and creator, and\n * fetches a new set of counts for whichever of them is the currently\n * selected sort option (which may be neither).\n *\n * Call this whenever the counts are invalidated (e.g., by a query change).\n */\n private refreshLetterCounts(): void {\n if (Object.keys(this.prefixFilterCountMap).length > 0) {\n this.prefixFilterCountMap = {};\n }\n this.updatePrefixFiltersForCurrentSort();\n }\n\n /**\n * Callback when a result is selected\n */\n resultSelected(event: CustomEvent<TileModel>): void {\n if (this.isManageView) {\n // Checked/unchecked state change -- rerender to ensure it propagates\n // this.mapDataSource(model => ({ ...model }));\n const cellIndex = this.dataSource.indexOf(event.detail);\n if (cellIndex >= 0) this.infiniteScroller?.refreshCell(cellIndex);\n }\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.resultSelected,\n label: event.detail.mediatype,\n });\n\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: analyticsActions.resultSelected,\n label: `page-${this.currentPage}`,\n });\n }\n\n cellForIndex(index: number): TemplateResult | undefined {\n const model = this.tileModelAtCellIndex(index);\n if (!model) return undefined;\n\n return html`\n <tile-dispatcher\n .collectionPagePath=${this.collectionPagePath}\n .baseNavigationUrl=${this.baseNavigationUrl}\n .baseImageUrl=${this.baseImageUrl}\n .model=${model}\n .tileDisplayMode=${this.displayMode}\n .resizeObserver=${this.resizeObserver}\n .collectionTitles=${this.dataSource.collectionTitles}\n .sortParam=${this.sortParam}\n .defaultSortParam=${this.defaultSortParam}\n .creatorFilter=${this.selectedCreatorFilter}\n .mobileBreakpoint=${this.mobileBreakpoint}\n .loggedIn=${this.loggedIn}\n .isManageView=${this.isManageView}\n ?enableHoverPane=${true}\n @resultSelected=${(e: CustomEvent) => this.resultSelected(e)}\n >\n </tile-dispatcher>\n `;\n }\n\n /**\n * When the user scrolls near to the bottom of the page, fetch the next page\n * increase the number of pages to render and start fetching data for the new page\n */\n private scrollThresholdReached() {\n if (!this.dataSource.endOfDataReached && this.dataSource.queryInitialized) {\n this.pagesToRender += 1;\n this.dataSource.fetchPage(this.pagesToRender);\n }\n }\n\n static get styles() {\n return [\n srOnlyStyle,\n css`\n :host {\n display: block;\n --leftColumnWidth: 18rem;\n --leftColumnPaddingRight: 2.5rem;\n }\n\n #facet-top-view {\n display: flex;\n }\n\n /**\n * When page width resizes from desktop to mobile, use this class to\n * disable expand/collapse transition when loading.\n */\n .preload * {\n transition: none !important;\n -webkit-transition: none !important;\n -moz-transition: none !important;\n -ms-transition: none !important;\n -o-transition: none !important;\n }\n\n #content-container {\n display: flex;\n }\n\n empty-placeholder {\n margin-top: var(--placeholderMarginTop, 0);\n }\n\n .collapser-icon {\n display: inline-block;\n }\n\n .collapser-icon svg {\n display: inline-block;\n width: 12px;\n height: 12px;\n transition: transform 0.2s ease-out;\n }\n\n #mobile-filter-collapse {\n width: 100%;\n }\n\n #mobile-filter-collapse > summary {\n cursor: pointer;\n list-style: none;\n }\n\n #mobile-filter-collapse[open] > summary {\n margin-bottom: 10px;\n }\n\n #mobile-filter-collapse h2 {\n display: inline-block;\n margin: 0;\n font-size: 2rem;\n }\n\n #mobile-filter-collapse[open] svg {\n transform: rotate(90deg);\n }\n\n #content-container.mobile {\n display: block;\n }\n\n .column {\n padding-top: 2rem;\n }\n\n #right-column {\n flex: 1;\n position: relative;\n border-left: 1px solid rgb(232, 232, 232);\n border-right: 1px solid rgb(232, 232, 232);\n padding-left: 1rem;\n padding-right: 1rem;\n margin-top: var(--rightColumnMarginTop, 0);\n background: #fff;\n }\n\n .mobile #right-column {\n border-left: none;\n padding: 5px 5px 0;\n }\n\n #left-column {\n width: var(--leftColumnWidth, 18rem);\n /* Prevents Safari from shrinking col at first draw */\n min-width: var(--leftColumnWidth, 18rem);\n /* Reduced padding by 0.2rem to add the invisible border in the rule below */\n padding-right: calc(var(--leftColumnPaddingRight, 2.5rem) - 0.2rem);\n border-right: 0.2rem solid transparent; /* Pads to the right of the scrollbar a bit */\n z-index: 1;\n }\n\n .desktop #left-column {\n top: 0;\n position: sticky;\n height: calc(100vh - 2rem);\n max-height: calc(100vh - 2rem);\n overflow-x: hidden;\n overflow-y: scroll;\n\n /*\n * Firefox doesn't support any of the -webkit-scrollbar stuff below, but\n * does at least give us a tiny bit of control over width & color.\n */\n scrollbar-width: thin;\n scrollbar-color: transparent transparent;\n }\n .desktop #left-column:hover {\n scrollbar-color: auto;\n }\n .desktop #left-column::-webkit-scrollbar {\n appearance: none;\n width: 6px;\n }\n .desktop #left-column::-webkit-scrollbar-button {\n height: 3px;\n background: transparent;\n }\n .desktop #left-column::-webkit-scrollbar-corner {\n background: transparent;\n }\n .desktop #left-column::-webkit-scrollbar-thumb {\n border-radius: 4px;\n }\n .desktop #left-column:hover::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.15);\n }\n .desktop #left-column:hover::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.2);\n }\n .desktop #left-column:hover::-webkit-scrollbar-thumb:active {\n background: rgba(0, 0, 0, 0.3);\n }\n\n #facets-bottom-fade {\n background: linear-gradient(\n to bottom,\n #f5f5f700 0%,\n #f5f5f7c0 50%,\n #f5f5f7 80%,\n #f5f5f7 100%\n );\n position: fixed;\n bottom: 0;\n height: 50px;\n /* Wide enough to cover the content, but leave the scrollbar uncovered */\n width: calc(\n var(--leftColumnWidth) + var(--leftColumnPaddingRight) - 10px\n );\n z-index: 2;\n pointer-events: none;\n transition: height 0.1s ease;\n }\n #facets-bottom-fade.hidden {\n height: 0;\n }\n\n .facets-message {\n font-size: 1.4rem;\n }\n\n .desktop #left-column-scroll-sentinel {\n width: 1px;\n height: 100vh;\n background: transparent;\n }\n\n .desktop #facets-scroll-sentinel {\n width: 1px;\n height: 1px;\n background: transparent;\n }\n\n #facets-header-container {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n }\n\n .desktop #facets-header-container {\n flex-wrap: wrap;\n }\n\n .mobile #left-column {\n width: 100%;\n padding: 0;\n }\n\n .clear-filters-btn-row {\n display: inline-block;\n }\n\n .desktop .clear-filters-btn-row {\n width: 100%;\n }\n\n .clear-filters-btn {\n display: inline-block;\n appearance: none;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n color: var(--ia-theme-link-color);\n font-size: 1.4rem;\n font-family: inherit;\n cursor: pointer;\n }\n\n .clear-filters-btn:hover {\n text-decoration: underline;\n }\n\n .clear-filters-btn-separator {\n display: inline-block;\n margin-left: 5px;\n border-left: 1px solid #2c2c2c;\n font-size: 1.4rem;\n line-height: 1.3rem;\n }\n\n #facets-container {\n position: relative;\n max-height: 0;\n transition: max-height 0.2s ease-in-out;\n z-index: 1;\n margin-top: 5rem;\n padding-bottom: 2rem;\n }\n\n .desktop #facets-container {\n width: 18rem;\n }\n\n .mobile #facets-container {\n overflow: hidden;\n padding-bottom: 0;\n padding-left: 10px;\n padding-right: 10px;\n }\n\n #facets-container.expanded {\n max-height: 2000px;\n }\n\n #results-total {\n display: flex;\n align-items: baseline;\n }\n\n .mobile #results-total {\n float: right;\n margin-bottom: 0;\n margin-right: 5px;\n }\n\n #big-results-count {\n font-size: 2.4rem;\n font-weight: 500;\n margin-right: 5px;\n }\n\n .mobile #big-results-count {\n font-size: 2rem;\n }\n\n #big-results-label {\n font-size: 1.4rem;\n font-weight: 200;\n }\n\n #list-header {\n max-height: 4.2rem;\n }\n\n .loading-cover {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n z-index: 1;\n padding-top: 50px;\n }\n\n circular-activity-indicator {\n width: 30px;\n height: 30px;\n }\n\n sort-filter-bar {\n display: block;\n margin-bottom: 4rem;\n }\n\n infinite-scroller {\n display: block;\n --infiniteScrollerRowGap: var(--collectionBrowserRowGap, 1.7rem);\n --infiniteScrollerColGap: var(--collectionBrowserColGap, 1.7rem);\n }\n\n infinite-scroller.list-compact {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 100%\n );\n --infiniteScrollerCellMinHeight: 45px; /* override infinite scroller component */\n --infiniteScrollerCellMaxHeight: 56px;\n --infiniteScrollerRowGap: 10px;\n }\n\n infinite-scroller.list-detail {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 100%\n );\n --infiniteScrollerCellMinHeight: var(\n --collectionBrowserCellMinHeight,\n 5rem\n );\n /*\n 30px in spec, compensating for a -4px margin\n to align title with top of item image\n src/tiles/list/tile-list.ts\n */\n --infiniteScrollerRowGap: 34px;\n }\n\n .mobile infinite-scroller.list-detail {\n --infiniteScrollerRowGap: 24px;\n }\n\n infinite-scroller.grid {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 17rem\n );\n --infiniteScrollerCellMaxWidth: var(\n --collectionBrowserCellMaxWidth,\n 1fr\n );\n }\n\n /* Allow tiles to shrink a bit further at smaller viewport widths */\n @media screen and (max-width: 880px) {\n infinite-scroller.grid {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 15rem\n );\n }\n }\n /* At very small widths, maintain a 2-tile layout as far as it can reasonably go */\n @media screen and (max-width: 360px) {\n infinite-scroller.grid {\n --infiniteScrollerCellMinWidth: var(\n --collectionBrowserCellMinWidth,\n 12rem\n );\n }\n }\n\n infinite-scroller.hidden {\n display: none;\n }\n `,\n ];\n }\n}\n"]}
|
|
@@ -697,10 +697,12 @@ export class CollectionBrowserDataSource {
|
|
|
697
697
|
if (this.host.withinProfile && this.host.defaultSortParam) {
|
|
698
698
|
const sortOption = SORT_OPTIONS[this.host.defaultSortParam.field];
|
|
699
699
|
if (sortOption.searchServiceKey) {
|
|
700
|
-
sortParams = [
|
|
700
|
+
sortParams = [
|
|
701
|
+
{
|
|
701
702
|
field: sortOption.searchServiceKey,
|
|
702
703
|
direction: 'desc',
|
|
703
|
-
}
|
|
704
|
+
},
|
|
705
|
+
];
|
|
704
706
|
}
|
|
705
707
|
}
|
|
706
708
|
const params = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-browser-data-source.js","sourceRoot":"","sources":["../../../src/data-source/collection-browser-data-source.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveControllerHost } from 'lit';\nimport {\n AccountExtraInfo,\n Aggregation,\n Bucket,\n CollectionExtraInfo,\n FilterConstraint,\n FilterMap,\n FilterMapBuilder,\n PageElementMap,\n SearchParams,\n SearchResult,\n SearchType,\n} from '@internetarchive/search-service';\nimport {\n prefixFilterAggregationKeys,\n type FacetBucket,\n type PrefixFilterType,\n TileModel,\n PrefixFilterCounts,\n RequestKind,\n SortField,\n SORT_OPTIONS,\n} from '../models';\nimport type { PageSpecifierParams } from './models';\nimport type { CollectionBrowserDataSourceInterface } from './collection-browser-data-source-interface';\nimport type { CollectionBrowserSearchInterface } from './collection-browser-query-state';\nimport { sha1 } from '../utils/sha1';\n\nexport class CollectionBrowserDataSource\n implements CollectionBrowserDataSourceInterface\n{\n private pages: Record<string, TileModel[]> = {};\n\n private offset = 0;\n\n private numTileModels = 0;\n\n /**\n * A set of fetch IDs that are valid for the current query state\n */\n private fetchesInProgress = new Set<string>();\n\n /**\n * A record of the query key used for the last search.\n * If this changes, we need to load new results.\n */\n private previousQueryKey: string = '';\n\n private searchResultsLoading = false;\n\n private facetsLoading = false;\n\n // TEMP for ease of debugging\n private id = Math.random();\n\n /**\n * @inheritdoc\n */\n totalResults = 0;\n\n /**\n * @inheritdoc\n */\n endOfDataReached = false;\n\n /**\n * @inheritdoc\n */\n queryInitialized = false;\n\n /**\n * @inheritdoc\n */\n aggregations?: Record<string, Aggregation>;\n\n /**\n * @inheritdoc\n */\n yearHistogramAggregation?: Aggregation;\n\n /**\n * @inheritdoc\n */\n collectionTitles = new Map<string, string>();\n\n /**\n * @inheritdoc\n */\n collectionExtraInfo?: CollectionExtraInfo;\n\n /**\n * @inheritdoc\n */\n accountExtraInfo?: AccountExtraInfo;\n\n /**\n * @inheritdoc\n */\n pageElements?: PageElementMap;\n\n /**\n * @inheritdoc\n */\n parentCollections?: string[] = [];\n\n /**\n * @inheritdoc\n */\n prefixFilterCountMap: Partial<Record<PrefixFilterType, PrefixFilterCounts>> =\n {};\n\n /**\n * @inheritdoc\n */\n queryErrorMessage?: string;\n\n /**\n * Internal property to store the `resolve` function for the most recent\n * `initialSearchComplete` promise, allowing us to resolve it at the appropriate time.\n */\n private _initialSearchCompleteResolver!: (val: boolean) => void;\n\n /**\n * Internal property to store the private value backing the `initialSearchComplete` getter.\n */\n private _initialSearchCompletePromise: Promise<boolean> = new Promise(res => {\n this._initialSearchCompleteResolver = res;\n });\n\n /**\n * @inheritdoc\n */\n get initialSearchComplete(): Promise<boolean> {\n return this._initialSearchCompletePromise;\n }\n\n // eslint-disable-next-line no-useless-constructor\n constructor(\n /** The host element to which this controller should attach listeners */\n private readonly host: ReactiveControllerHost &\n CollectionBrowserSearchInterface,\n /** Default size of result pages */\n private pageSize: number\n ) {\n // Just setting some property values\n }\n\n hostConnected(): void {\n console.log('hostConnected', this.id);\n this.setSearchResultsLoading(this.searchResultsLoading);\n this.setFacetsLoading(this.facetsLoading);\n }\n\n hostUpdate(): void {\n console.log(\n 'hostUpdate',\n this.id,\n this.previousQueryKey,\n this.pageFetchQueryKey\n );\n // This reactive controller hook is run whenever the host component (collection-browser) performs an update.\n // We check whether the host's state has changed in a way which should trigger a reset & new results fetch.\n\n // Only the currently-installed data source should react to the update\n if (!this.activeOnHost) return;\n\n // Copy loading states onto the host\n this.setSearchResultsLoading(this.searchResultsLoading);\n this.setFacetsLoading(this.facetsLoading);\n\n // Can't perform searches without a search service\n if (!this.host.searchService) return;\n\n // We should only reset if part of the full query state has changed\n const queryKeyChanged = this.pageFetchQueryKey !== this.previousQueryKey;\n console.log('query keys', this.pageFetchQueryKey, this.previousQueryKey);\n if (!queryKeyChanged) return;\n\n // We should only reset if either:\n // (a) our state permits a valid search, or\n // (b) we have a blank query that we want to show empty results for\n const shouldShowEmptyQueryResults =\n this.host.clearResultsOnEmptyQuery && this.host.baseQuery === '';\n if (!(this.canPerformSearch || shouldShowEmptyQueryResults)) return;\n\n if (this.activeOnHost) this.host.emitQueryStateChanged();\n this.handleQueryChange();\n }\n\n /**\n * Returns whether this data source is the one currently installed on the host component.\n */\n private get activeOnHost(): boolean {\n return this.host.dataSource === this;\n }\n\n /**\n * @inheritdoc\n */\n get size(): number {\n return this.numTileModels;\n }\n\n /**\n * @inheritdoc\n */\n reset(): void {\n console.log('resetting data source', this.id);\n this.pages = {};\n this.aggregations = {};\n this.yearHistogramAggregation = undefined;\n this.pageElements = undefined;\n this.parentCollections = [];\n this.prefixFilterCountMap = {};\n this.queryErrorMessage = undefined;\n\n this.offset = 0;\n this.numTileModels = 0;\n this.totalResults = 0;\n this.endOfDataReached = false;\n this.queryInitialized = false;\n\n // Invalidate any fetches in progress\n this.fetchesInProgress.clear();\n console.log('fetches cleared - size =', this.fetchesInProgress.size);\n\n if (this.activeOnHost) this.host.setTotalResultCount(0);\n this.requestHostUpdate();\n }\n\n /**\n * @inheritdoc\n */\n addPage(pageNum: number, pageTiles: TileModel[]): void {\n this.pages[pageNum] = pageTiles;\n this.numTileModels += pageTiles.length;\n this.requestHostUpdate();\n }\n\n /**\n * @inheritdoc\n */\n getPage(pageNum: number): TileModel[] {\n return this.pages[pageNum];\n }\n\n /**\n * @inheritdoc\n */\n getAllPages(): Record<string, TileModel[]> {\n return this.pages;\n }\n\n /**\n * @inheritdoc\n */\n hasPage(pageNum: number): boolean {\n return !!this.pages[pageNum];\n }\n\n /**\n * @inheritdoc\n */\n getTileModelAt(index: number): TileModel | undefined {\n const pageNum = Math.floor(index / this.pageSize) + 1;\n const indexOnPage = index % this.pageSize;\n return this.pages[pageNum]?.[indexOnPage];\n }\n\n /**\n * @inheritdoc\n */\n indexOf(tile: TileModel): number {\n return Object.values(this.pages).flat().indexOf(tile);\n }\n\n /**\n * @inheritdoc\n */\n setPageSize(pageSize: number): void {\n this.reset();\n this.pageSize = pageSize;\n }\n\n /**\n * @inheritdoc\n */\n async handleQueryChange(): Promise<void> {\n this.reset();\n\n // Reset the `initialSearchComplete` promise with a new value for the imminent search\n this._initialSearchCompletePromise = new Promise(res => {\n this._initialSearchCompleteResolver = res;\n });\n\n // Fire the initial page & facet requests\n this.queryInitialized = true;\n await Promise.all([\n this.doInitialPageFetch(),\n this.host.suppressFacets ? null : this.fetchFacets(),\n ]);\n\n // Resolve the `initialSearchComplete` promise for this search\n this._initialSearchCompleteResolver(true);\n }\n\n /**\n * @inheritdoc\n */\n map(\n callback: (model: TileModel, index: number, array: TileModel[]) => TileModel\n ): void {\n this.pages = Object.fromEntries(\n Object.entries(this.pages).map(([page, tileModels]) => [\n page,\n tileModels.map((model, index, array) =>\n model ? callback(model, index, array) : model\n ),\n ])\n );\n this.requestHostUpdate();\n this.refreshVisibleResults();\n }\n\n /**\n * @inheritdoc\n */\n checkAllTiles = (): void => {\n this.map(model => {\n const cloned = model.clone();\n cloned.checked = true;\n return cloned;\n });\n };\n\n /**\n * @inheritdoc\n */\n uncheckAllTiles = (): void => {\n this.map(model => {\n const cloned = model.clone();\n cloned.checked = false;\n return cloned;\n });\n };\n\n /**\n * @inheritdoc\n */\n removeCheckedTiles = (): void => {\n // To make sure our data source remains page-aligned, we will offset our data source by\n // the number of removed tiles, so that we can just add the offset when the infinite\n // scroller queries for cell contents.\n // This only matters while we're still viewing the same set of results. If the user changes\n // their query/filters/sort, then the data source is overwritten and the offset cleared.\n const { checkedTileModels, uncheckedTileModels } = this;\n const numChecked = checkedTileModels.length;\n if (numChecked === 0) return;\n this.offset += numChecked;\n const newPages: typeof this.pages = {};\n\n // Which page the remaining tile models start on, post-offset\n let offsetPageNumber = Math.floor(this.offset / this.pageSize) + 1;\n let indexOnPage = this.offset % this.pageSize;\n\n // Fill the pages up to that point with empty models\n for (let page = 1; page <= offsetPageNumber; page += 1) {\n const remainingHidden = this.offset - this.pageSize * (page - 1);\n const offsetCellsOnPage = Math.min(this.pageSize, remainingHidden);\n newPages[page] = Array(offsetCellsOnPage).fill(undefined);\n }\n\n // Shift all the remaining tiles into their new positions in the data source\n for (const model of uncheckedTileModels) {\n if (!newPages[offsetPageNumber]) newPages[offsetPageNumber] = [];\n newPages[offsetPageNumber].push(model);\n indexOnPage += 1;\n if (indexOnPage >= this.pageSize) {\n offsetPageNumber += 1;\n indexOnPage = 0;\n }\n }\n\n // Swap in the new pages\n this.pages = newPages;\n this.numTileModels -= numChecked;\n this.requestHostUpdate();\n this.refreshVisibleResults();\n };\n\n /**\n * @inheritdoc\n */\n get checkedTileModels(): TileModel[] {\n return this.getFilteredTileModels(model => model.checked);\n }\n\n /**\n * @inheritdoc\n */\n get uncheckedTileModels(): TileModel[] {\n return this.getFilteredTileModels(model => !model.checked);\n }\n\n /**\n * Returns a flattened, filtered array of all the tile models in the data source\n * for which the given predicate returns a truthy value.\n *\n * @param predicate A callback function to apply on each tile model, as with Array.filter\n * @returns A filtered array of tile models satisfying the predicate\n */\n private getFilteredTileModels(\n predicate: (model: TileModel, index: number, array: TileModel[]) => unknown\n ): TileModel[] {\n return Object.values(this.pages)\n .flat()\n .filter((model, index, array) =>\n model ? predicate(model, index, array) : false\n );\n }\n\n /**\n * @inheritdoc\n */\n get canPerformSearch(): boolean {\n if (!this.host.searchService) return false;\n\n const trimmedQuery = this.host.baseQuery?.trim();\n const hasNonEmptyQuery = !!trimmedQuery;\n const isCollectionSearch = !!this.host.withinCollection;\n const isProfileSearch = !!this.host.withinProfile;\n const hasProfileElement = !!this.host.profileElement;\n const isMetadataSearch = this.host.searchType === SearchType.METADATA;\n\n // Metadata searches within a collection/profile are allowed to have no query.\n // Otherwise, a non-empty query must be set.\n return (\n hasNonEmptyQuery ||\n (isCollectionSearch && isMetadataSearch) ||\n (isProfileSearch && hasProfileElement && isMetadataSearch)\n );\n }\n\n /**\n * Sets the state for whether the initial set of search results for the\n * current query is loading\n */\n private setSearchResultsLoading(loading: boolean): void {\n this.searchResultsLoading = loading;\n if (this.activeOnHost) {\n this.host.setSearchResultsLoading(loading);\n }\n }\n\n /**\n * Sets the state for whether the facets for a query is loading\n */\n private setFacetsLoading(loading: boolean): void {\n this.facetsLoading = loading;\n if (this.activeOnHost) {\n this.host.setFacetsLoading(loading);\n }\n }\n\n /**\n * Requests that the host perform an update, provided this data\n * source is actively installed on it.\n */\n private requestHostUpdate(): void {\n if (this.activeOnHost) {\n this.host.requestUpdate();\n }\n }\n\n /**\n * Requests that the host refresh its visible tiles, provided this\n * data source is actively installed on it.\n */\n private refreshVisibleResults(): void {\n if (this.activeOnHost) {\n this.host.refreshVisibleResults();\n }\n }\n\n /**\n * The query key is a string that uniquely identifies the current search.\n * It consists of:\n * - The current base query\n * - The current collection/profile target & page element\n * - The current search type\n * - Any currently-applied facets\n * - Any currently-applied date range\n * - Any currently-applied prefix filters\n * - The current sort options\n *\n * This lets us internally keep track of queries so we don't persist data that's\n * no longer relevant. Not meant to be human-readable.\n */\n get pageFetchQueryKey(): string {\n const profileKey = `pf;${this.host.withinProfile}--pe;${this.host.profileElement}`;\n const pageTarget = this.host.withinCollection ?? profileKey;\n const sortField = this.host.sortParam?.field ?? 'none';\n const sortDirection = this.host.sortParam?.direction ?? 'none';\n return `fq:${this.fullQuery}-pt:${pageTarget}-st:${this.host.searchType}-sf:${sortField}-sd:${sortDirection}`;\n }\n\n /**\n * Similar to `pageFetchQueryKey` above, but excludes sort fields since they\n * are not relevant in determining aggregation queries.\n */\n get facetFetchQueryKey(): string {\n const profileKey = `${this.host.withinProfile}--${this.host.profileElement}`;\n const pageTarget = this.host.withinCollection ?? profileKey;\n return `${this.fullQuery}-${pageTarget}-${this.host.searchType}`;\n }\n\n /**\n * Constructs a search service FilterMap object from the combination of\n * all the currently-applied filters. This includes any facets, letter\n * filters, and date range.\n */\n get filterMap(): FilterMap {\n const builder = new FilterMapBuilder();\n\n // Add the date range, if applicable\n if (this.host.minSelectedDate) {\n builder.addFilter(\n 'year',\n this.host.minSelectedDate,\n FilterConstraint.GREATER_OR_EQUAL\n );\n }\n if (this.host.maxSelectedDate) {\n builder.addFilter(\n 'year',\n this.host.maxSelectedDate,\n FilterConstraint.LESS_OR_EQUAL\n );\n }\n\n // Add any selected facets\n if (this.host.selectedFacets) {\n for (const [facetName, facetValues] of Object.entries(\n this.host.selectedFacets\n )) {\n const { name, values } = this.prepareFacetForFetch(\n facetName,\n facetValues\n );\n for (const [value, bucket] of Object.entries(values)) {\n let constraint;\n if (bucket.state === 'selected') {\n constraint = FilterConstraint.INCLUDE;\n } else if (bucket.state === 'hidden') {\n constraint = FilterConstraint.EXCLUDE;\n }\n\n if (constraint) {\n builder.addFilter(name, value, constraint);\n }\n }\n }\n }\n\n // Add any letter filters\n if (this.host.selectedTitleFilter) {\n builder.addFilter(\n 'firstTitle',\n this.host.selectedTitleFilter,\n FilterConstraint.INCLUDE\n );\n }\n if (this.host.selectedCreatorFilter) {\n builder.addFilter(\n 'firstCreator',\n this.host.selectedCreatorFilter,\n FilterConstraint.INCLUDE\n );\n }\n\n const filterMap = builder.build();\n return filterMap;\n }\n\n /**\n * Produces a compact unique ID for a search request that can help with debugging\n * on the backend by making related requests easier to trace through different services.\n * (e.g., tying the hits/aggregations requests for the same page back to a single hash).\n *\n * @param params The search service parameters for the request\n * @param kind The kind of request (hits-only, aggregations-only, or both)\n * @returns A Promise resolving to the uid to apply to the request\n */\n async requestUID(params: SearchParams, kind: RequestKind): Promise<string> {\n const paramsToHash = JSON.stringify({\n pageType: params.pageType,\n pageTarget: params.pageTarget,\n query: params.query,\n fields: params.fields,\n filters: params.filters,\n sort: params.sort,\n searchType: this.host.searchType,\n });\n\n const fullQueryHash = (await sha1(paramsToHash)).slice(0, 20); // First 80 bits of SHA-1 are plenty for this\n const sessionId = (await this.host.getSessionId()).slice(0, 20); // Likewise\n const page = params.page ?? 0;\n const kindPrefix = kind.charAt(0); // f = full, h = hits, a = aggregations\n const currentTime = Date.now();\n\n return `R:${fullQueryHash}-S:${sessionId}-P:${page}-K:${kindPrefix}-T:${currentTime}`;\n }\n\n /**\n * @inheritdoc\n */\n get pageSpecifierParams(): PageSpecifierParams | null {\n if (this.host.withinCollection) {\n return {\n pageType: 'collection_details',\n pageTarget: this.host.withinCollection,\n };\n }\n if (this.host.withinProfile) {\n return {\n pageType: 'account_details',\n pageTarget: this.host.withinProfile,\n pageElements: this.host.profileElement\n ? [this.host.profileElement]\n : [],\n };\n }\n return null;\n }\n\n /**\n * The full query, including year facets and date range clauses\n */\n private get fullQuery(): string | undefined {\n let fullQuery = this.host.baseQuery?.trim() ?? '';\n\n const { facetQuery, dateRangeQueryClause, sortFilterQueries } = this;\n\n if (facetQuery) {\n fullQuery += ` AND ${facetQuery}`;\n }\n if (dateRangeQueryClause) {\n fullQuery += ` AND ${dateRangeQueryClause}`;\n }\n if (sortFilterQueries) {\n fullQuery += ` AND ${sortFilterQueries}`;\n }\n return fullQuery.trim();\n }\n\n /**\n * Generates a query string representing the current set of applied facets\n *\n * Example: `mediatype:(\"collection\" OR \"audio\" OR -\"etree\") AND year:(\"2000\" OR \"2001\")`\n */\n private get facetQuery(): string | undefined {\n if (!this.host.selectedFacets) return undefined;\n const facetClauses = [];\n for (const [facetName, facetValues] of Object.entries(\n this.host.selectedFacets\n )) {\n facetClauses.push(this.buildFacetClause(facetName, facetValues));\n }\n return this.joinFacetClauses(facetClauses)?.trim();\n }\n\n private get dateRangeQueryClause(): string | undefined {\n if (!this.host.minSelectedDate || !this.host.maxSelectedDate) {\n return undefined;\n }\n\n return `year:[${this.host.minSelectedDate} TO ${this.host.maxSelectedDate}]`;\n }\n\n private get sortFilterQueries(): string {\n const queries = [this.titleQuery, this.creatorQuery];\n return queries.filter(q => q).join(' AND ');\n }\n\n /**\n * Returns a query clause identifying the currently selected title filter,\n * e.g., `firstTitle:X`.\n */\n private get titleQuery(): string | undefined {\n return this.host.selectedTitleFilter\n ? `firstTitle:${this.host.selectedTitleFilter}`\n : undefined;\n }\n\n /**\n * Returns a query clause identifying the currently selected creator filter,\n * e.g., `firstCreator:X`.\n */\n private get creatorQuery(): string | undefined {\n return this.host.selectedCreatorFilter\n ? `firstCreator:${this.host.selectedCreatorFilter}`\n : undefined;\n }\n\n /**\n * Builds an OR-joined facet clause for the given facet name and values.\n *\n * E.g., for name `subject` and values\n * `{ foo: { state: 'selected' }, bar: { state: 'hidden' } }`\n * this will produce the clause\n * `subject:(\"foo\" OR -\"bar\")`.\n *\n * @param facetName The facet type (e.g., 'collection')\n * @param facetValues The facet buckets, mapped by their keys\n */\n private buildFacetClause(\n facetName: string,\n facetValues: Record<string, FacetBucket>\n ): string {\n const { name: facetQueryName, values } = this.prepareFacetForFetch(\n facetName,\n facetValues\n );\n const facetEntries = Object.entries(values);\n if (facetEntries.length === 0) return '';\n\n const facetValuesArray: string[] = [];\n for (const [key, facetData] of facetEntries) {\n const plusMinusPrefix = facetData.state === 'hidden' ? '-' : '';\n facetValuesArray.push(`${plusMinusPrefix}\"${key}\"`);\n }\n\n const valueQuery = facetValuesArray.join(` OR `);\n return `${facetQueryName}:(${valueQuery})`;\n }\n\n /**\n * Handles some special pre-request normalization steps for certain facet types\n * that require them.\n *\n * @param facetName The name of the facet type (e.g., 'language')\n * @param facetValues An array of values for that facet type\n */\n private prepareFacetForFetch(\n facetName: string,\n facetValues: Record<string, FacetBucket>\n ): { name: string; values: Record<string, FacetBucket> } {\n // eslint-disable-next-line prefer-const\n let [normalizedName, normalizedValues] = [facetName, facetValues];\n\n // The full \"search engine\" name of the lending field is \"lending___status\"\n if (facetName === 'lending') {\n normalizedName = 'lending___status';\n }\n\n return {\n name: normalizedName,\n values: normalizedValues,\n };\n }\n\n /**\n * Takes an array of facet clauses, and combines them into a\n * full AND-joined facet query string. Empty clauses are ignored.\n */\n private joinFacetClauses(facetClauses: string[]): string | undefined {\n const nonEmptyFacetClauses = facetClauses.filter(\n clause => clause.length > 0\n );\n return nonEmptyFacetClauses.length > 0\n ? `(${nonEmptyFacetClauses.join(' AND ')})`\n : undefined;\n }\n\n /**\n * Fires a backend request to fetch a set of aggregations (representing UI facets) for\n * the current search state.\n */\n private async fetchFacets(): Promise<void> {\n console.log('fetchFacets', this.id, this.host.profileElement);\n const trimmedQuery = this.host.baseQuery?.trim();\n if (!this.canPerformSearch) return;\n console.log('will actually fetch facets');\n\n const { facetFetchQueryKey } = this;\n if (this.fetchesInProgress.has(facetFetchQueryKey)) return;\n this.fetchesInProgress.add(facetFetchQueryKey);\n\n const sortParams = this.host.sortParam ? [this.host.sortParam] : [];\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n rows: 0,\n filters: this.filterMap,\n // Fetch a few extra buckets beyond the 6 we show, in case some get suppressed\n aggregationsSize: 10,\n // Note: we don't need an aggregations param to fetch the default aggregations from the PPS.\n // The default aggregations for the search_results page type should be what we need here.\n };\n params.uid = await this.requestUID(\n { ...params, sort: sortParams },\n 'aggregations'\n );\n\n this.setFacetsLoading(true);\n const searchResponse = await this.host.searchService?.search(\n params,\n this.host.searchType\n );\n const success = searchResponse?.success;\n\n // This is checking to see if the query has changed since the data was fetched.\n // If so, we just want to discard this set of aggregations because they are\n // likely no longer valid for the newer query.\n const queryChangedSinceFetch =\n !this.fetchesInProgress.has(facetFetchQueryKey);\n this.fetchesInProgress.delete(facetFetchQueryKey);\n if (queryChangedSinceFetch) {\n console.log(\n 'facet query has changed since fetch, returning. new/old:',\n this.facetFetchQueryKey,\n facetFetchQueryKey\n );\n return;\n }\n\n if (!success) {\n const errorMsg = searchResponse?.error?.message;\n const detailMsg = searchResponse?.error?.details?.message;\n\n if (!errorMsg && !detailMsg) {\n // @ts-ignore: Property 'Sentry' does not exist on type 'Window & typeof globalThis'\n window?.Sentry?.captureMessage?.(\n 'Missing or malformed facet response from backend',\n 'error'\n );\n }\n\n this.setFacetsLoading(false);\n return;\n }\n\n const { aggregations, collectionTitles } = success.response;\n this.aggregations = aggregations;\n\n if (collectionTitles) {\n for (const [id, title] of Object.entries(collectionTitles)) {\n this.collectionTitles.set(id, title);\n }\n }\n\n this.yearHistogramAggregation =\n success?.response?.aggregations?.year_histogram;\n\n this.setFacetsLoading(false);\n this.requestHostUpdate();\n }\n\n /**\n * Performs the initial page fetch(es) for the current search state.\n */\n private async doInitialPageFetch(): Promise<void> {\n this.setSearchResultsLoading(true);\n // Try to batch 2 initial page requests when possible\n await this.fetchPage(this.host.initialPageNumber, 2);\n }\n\n /**\n * Fetches one or more pages of results and updates the data source.\n *\n * @param pageNumber The page number to fetch\n * @param numInitialPages If this is an initial page fetch (`pageNumber = 1`),\n * specifies how many pages to batch together in one request. Ignored\n * if `pageNumber != 1`, defaulting to a single page.\n */\n async fetchPage(pageNumber: number, numInitialPages = 1): Promise<void> {\n const trimmedQuery = this.host.baseQuery?.trim();\n if (!this.canPerformSearch) return;\n\n // if we already have data, don't fetch again\n if (this.hasPage(pageNumber)) return;\n\n if (this.endOfDataReached) return;\n\n // Batch multiple initial page requests together if needed (e.g., can request\n // pages 1 and 2 together in a single request).\n const numPages = pageNumber === 1 ? numInitialPages : 1;\n const numRows = this.pageSize * numPages;\n\n // if a fetch is already in progress for this query and page, don't fetch again\n const { pageFetchQueryKey } = this;\n const currentPageKey = `${pageFetchQueryKey}-p:${pageNumber}`;\n console.log(\n 'page fetch key',\n currentPageKey,\n this.fetchesInProgress.has(currentPageKey)\n );\n if (this.fetchesInProgress.has(currentPageKey)) return;\n // const pageFetches =\n // this.fetchesInProgress[pageFetchQueryKey] ?? new Set();\n // if (pageFetches.has(pageNumber)) return;\n\n for (let i = 0; i < numPages; i += 1) {\n this.fetchesInProgress.add(`${pageFetchQueryKey}-p:${pageNumber + i}`);\n }\n console.log(\n `fetchPage(${pageNumber})`,\n this.id,\n this.canPerformSearch,\n this.hasPage(pageNumber),\n this.endOfDataReached,\n this.host.baseQuery,\n JSON.stringify(this.host.selectedFacets),\n this.pageFetchQueryKey\n );\n this.previousQueryKey = pageFetchQueryKey;\n\n let sortParams = this.host.sortParam ? [this.host.sortParam] : [];\n // TODO eventually the PPS should handle these defaults natively\n if (this.host.withinProfile && this.host.defaultSortParam) {\n const sortOption = SORT_OPTIONS[this.host.defaultSortParam.field as SortField];\n if (sortOption.searchServiceKey) {\n sortParams = [{\n field: sortOption.searchServiceKey,\n direction: 'desc',\n }];\n }\n }\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n page: pageNumber,\n rows: numRows,\n sort: sortParams,\n filters: this.filterMap,\n aggregations: { omit: true },\n };\n params.uid = await this.requestUID(params, 'hits');\n\n console.log('=== FIRING PAGE REQUEST ===');\n const searchResponse = await this.host.searchService?.search(\n params,\n this.host.searchType\n );\n console.log('=== RECEIVED PAGE RESPONSE IN CB === ');\n const success = searchResponse?.success;\n\n // This is checking to see if the fetch has been invalidated since it was fired off.\n // If so, we just want to discard the response since it is for an obsolete query state.\n console.log(\n 'after page fetch key:',\n currentPageKey,\n this.fetchesInProgress.has(currentPageKey)\n );\n if (!this.fetchesInProgress.has(currentPageKey)) return;\n for (let i = 0; i < numPages; i += 1) {\n this.fetchesInProgress.delete(`${pageFetchQueryKey}-p:${pageNumber + i}`);\n }\n\n if (!success) {\n const errorMsg = searchResponse?.error?.message;\n const detailMsg = searchResponse?.error?.details?.message;\n\n this.queryErrorMessage = `${errorMsg ?? ''}${\n detailMsg ? `; ${detailMsg}` : ''\n }`;\n\n if (!this.queryErrorMessage) {\n this.queryErrorMessage = 'Missing or malformed response from backend';\n // @ts-ignore: Property 'Sentry' does not exist on type 'Window & typeof globalThis'\n window?.Sentry?.captureMessage?.(this.queryErrorMessage, 'error');\n }\n\n this.setSearchResultsLoading(false);\n this.requestHostUpdate();\n return;\n }\n\n this.totalResults = success.response.totalResults - this.offset;\n if (this.activeOnHost) {\n this.host.setTotalResultCount(this.totalResults);\n\n // display event to offshoot when result count is zero.\n if (this.totalResults === 0) {\n this.host.emitEmptyResults();\n }\n }\n\n if (this.host.withinCollection) {\n console.log(\n 'host is within collection, setting collection info:',\n success.response.collectionExtraInfo\n );\n this.collectionExtraInfo = success.response.collectionExtraInfo;\n\n // For collections, we want the UI to respect the default sort option\n // which can be specified in metadata, or otherwise assumed to be week:desc\n if (this.activeOnHost) {\n this.host.applyDefaultCollectionSort(this.collectionExtraInfo);\n }\n\n if (this.collectionExtraInfo) {\n this.parentCollections = [].concat(\n this.collectionExtraInfo.public_metadata?.collection ?? []\n );\n }\n } else if (this.host.withinProfile) {\n console.log(\n 'host is within profile, setting acct info:',\n success.response.accountExtraInfo,\n success.response.pageElements\n );\n this.accountExtraInfo = success.response.accountExtraInfo;\n this.pageElements = success.response.pageElements;\n } else {\n console.log(\n 'not within profile/collxn',\n this.host.withinCollection,\n this.host.withinProfile\n );\n }\n\n const { results, collectionTitles } = success.response;\n if (results && results.length > 0) {\n // Load any collection titles present on the response into the cache,\n // or queue up preload fetches for them if none were present.\n if (collectionTitles) {\n for (const [id, title] of Object.entries(collectionTitles)) {\n this.collectionTitles.set(id, title);\n }\n }\n\n // Update the data source for each returned page\n for (let i = 0; i < numPages; i += 1) {\n const pageStartIndex = this.pageSize * i;\n this.addTilesToDataSource(\n pageNumber + i,\n results.slice(pageStartIndex, pageStartIndex + this.pageSize)\n );\n }\n }\n\n // When we reach the end of the data, we can set the infinite scroller's\n // item count to the real total number of results (rather than the\n // temporary estimates based on pages rendered so far).\n const resultCountDiscrepancy = numRows - results.length;\n if (resultCountDiscrepancy > 0) {\n console.log('End of data reached');\n this.endOfDataReached = true;\n if (this.activeOnHost) this.host.setTileCount(this.totalResults);\n }\n\n this.setSearchResultsLoading(false);\n this.requestHostUpdate();\n }\n\n /**\n * Update the datasource from the fetch response\n *\n * @param pageNumber\n * @param results\n */\n private addTilesToDataSource(\n pageNumber: number,\n results: SearchResult[]\n ): void {\n const tiles: TileModel[] = [];\n results?.forEach(result => {\n if (!result.identifier) return;\n tiles.push(new TileModel(result));\n });\n this.addPage(pageNumber, tiles);\n const visiblePages = this.host.currentVisiblePageNumbers;\n const needsReload = visiblePages.includes(pageNumber);\n if (needsReload) {\n this.refreshVisibleResults();\n }\n }\n\n /**\n * Fetches the aggregation buckets for the given prefix filter type.\n */\n private async fetchPrefixFilterBuckets(\n filterType: PrefixFilterType\n ): Promise<Bucket[]> {\n const trimmedQuery = this.host.baseQuery?.trim();\n if (!this.canPerformSearch) return [];\n\n const filterAggregationKey = prefixFilterAggregationKeys[filterType];\n const sortParams = this.host.sortParam ? [this.host.sortParam] : [];\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n rows: 0,\n filters: this.filterMap,\n // Only fetch the firstTitle or firstCreator aggregation\n aggregations: { simpleParams: [filterAggregationKey] },\n // Fetch all 26 letter buckets\n aggregationsSize: 26,\n };\n params.uid = await this.requestUID(\n { ...params, sort: sortParams },\n 'aggregations'\n );\n\n const searchResponse = await this.host.searchService?.search(\n params,\n this.host.searchType\n );\n\n return (searchResponse?.success?.response?.aggregations?.[\n filterAggregationKey\n ]?.buckets ?? []) as Bucket[];\n }\n\n /**\n * Fetches and caches the prefix filter counts for the given filter type.\n */\n async updatePrefixFilterCounts(filterType: PrefixFilterType): Promise<void> {\n const { facetFetchQueryKey } = this;\n const buckets = await this.fetchPrefixFilterBuckets(filterType);\n\n // Don't update the filter counts for an outdated query (if it has been changed\n // since we sent the request)\n const queryChangedSinceFetch =\n facetFetchQueryKey !== this.facetFetchQueryKey;\n if (queryChangedSinceFetch) return;\n\n // Unpack the aggregation buckets into a simple map like { 'A': 50, 'B': 25, ... }\n this.prefixFilterCountMap = { ...this.prefixFilterCountMap }; // Clone the object to trigger an update\n this.prefixFilterCountMap[filterType] = buckets.reduce(\n (acc: Record<string, number>, bucket: Bucket) => {\n acc[(bucket.key as string).toUpperCase()] = bucket.doc_count;\n return acc;\n },\n {}\n );\n\n this.requestHostUpdate();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collection-browser-data-source.js","sourceRoot":"","sources":["../../../src/data-source/collection-browser-data-source.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveControllerHost } from 'lit';\nimport {\n AccountExtraInfo,\n Aggregation,\n Bucket,\n CollectionExtraInfo,\n FilterConstraint,\n FilterMap,\n FilterMapBuilder,\n PageElementMap,\n SearchParams,\n SearchResult,\n SearchType,\n} from '@internetarchive/search-service';\nimport {\n prefixFilterAggregationKeys,\n type FacetBucket,\n type PrefixFilterType,\n TileModel,\n PrefixFilterCounts,\n RequestKind,\n SortField,\n SORT_OPTIONS,\n} from '../models';\nimport type { PageSpecifierParams } from './models';\nimport type { CollectionBrowserDataSourceInterface } from './collection-browser-data-source-interface';\nimport type { CollectionBrowserSearchInterface } from './collection-browser-query-state';\nimport { sha1 } from '../utils/sha1';\n\nexport class CollectionBrowserDataSource\n implements CollectionBrowserDataSourceInterface\n{\n private pages: Record<string, TileModel[]> = {};\n\n private offset = 0;\n\n private numTileModels = 0;\n\n /**\n * A set of fetch IDs that are valid for the current query state\n */\n private fetchesInProgress = new Set<string>();\n\n /**\n * A record of the query key used for the last search.\n * If this changes, we need to load new results.\n */\n private previousQueryKey: string = '';\n\n private searchResultsLoading = false;\n\n private facetsLoading = false;\n\n // TEMP for ease of debugging\n private id = Math.random();\n\n /**\n * @inheritdoc\n */\n totalResults = 0;\n\n /**\n * @inheritdoc\n */\n endOfDataReached = false;\n\n /**\n * @inheritdoc\n */\n queryInitialized = false;\n\n /**\n * @inheritdoc\n */\n aggregations?: Record<string, Aggregation>;\n\n /**\n * @inheritdoc\n */\n yearHistogramAggregation?: Aggregation;\n\n /**\n * @inheritdoc\n */\n collectionTitles = new Map<string, string>();\n\n /**\n * @inheritdoc\n */\n collectionExtraInfo?: CollectionExtraInfo;\n\n /**\n * @inheritdoc\n */\n accountExtraInfo?: AccountExtraInfo;\n\n /**\n * @inheritdoc\n */\n pageElements?: PageElementMap;\n\n /**\n * @inheritdoc\n */\n parentCollections?: string[] = [];\n\n /**\n * @inheritdoc\n */\n prefixFilterCountMap: Partial<Record<PrefixFilterType, PrefixFilterCounts>> =\n {};\n\n /**\n * @inheritdoc\n */\n queryErrorMessage?: string;\n\n /**\n * Internal property to store the `resolve` function for the most recent\n * `initialSearchComplete` promise, allowing us to resolve it at the appropriate time.\n */\n private _initialSearchCompleteResolver!: (val: boolean) => void;\n\n /**\n * Internal property to store the private value backing the `initialSearchComplete` getter.\n */\n private _initialSearchCompletePromise: Promise<boolean> = new Promise(res => {\n this._initialSearchCompleteResolver = res;\n });\n\n /**\n * @inheritdoc\n */\n get initialSearchComplete(): Promise<boolean> {\n return this._initialSearchCompletePromise;\n }\n\n // eslint-disable-next-line no-useless-constructor\n constructor(\n /** The host element to which this controller should attach listeners */\n private readonly host: ReactiveControllerHost &\n CollectionBrowserSearchInterface,\n /** Default size of result pages */\n private pageSize: number\n ) {\n // Just setting some property values\n }\n\n hostConnected(): void {\n console.log('hostConnected', this.id);\n this.setSearchResultsLoading(this.searchResultsLoading);\n this.setFacetsLoading(this.facetsLoading);\n }\n\n hostUpdate(): void {\n console.log(\n 'hostUpdate',\n this.id,\n this.previousQueryKey,\n this.pageFetchQueryKey\n );\n // This reactive controller hook is run whenever the host component (collection-browser) performs an update.\n // We check whether the host's state has changed in a way which should trigger a reset & new results fetch.\n\n // Only the currently-installed data source should react to the update\n if (!this.activeOnHost) return;\n\n // Copy loading states onto the host\n this.setSearchResultsLoading(this.searchResultsLoading);\n this.setFacetsLoading(this.facetsLoading);\n\n // Can't perform searches without a search service\n if (!this.host.searchService) return;\n\n // We should only reset if part of the full query state has changed\n const queryKeyChanged = this.pageFetchQueryKey !== this.previousQueryKey;\n console.log('query keys', this.pageFetchQueryKey, this.previousQueryKey);\n if (!queryKeyChanged) return;\n\n // We should only reset if either:\n // (a) our state permits a valid search, or\n // (b) we have a blank query that we want to show empty results for\n const shouldShowEmptyQueryResults =\n this.host.clearResultsOnEmptyQuery && this.host.baseQuery === '';\n if (!(this.canPerformSearch || shouldShowEmptyQueryResults)) return;\n\n if (this.activeOnHost) this.host.emitQueryStateChanged();\n this.handleQueryChange();\n }\n\n /**\n * Returns whether this data source is the one currently installed on the host component.\n */\n private get activeOnHost(): boolean {\n return this.host.dataSource === this;\n }\n\n /**\n * @inheritdoc\n */\n get size(): number {\n return this.numTileModels;\n }\n\n /**\n * @inheritdoc\n */\n reset(): void {\n console.log('resetting data source', this.id);\n this.pages = {};\n this.aggregations = {};\n this.yearHistogramAggregation = undefined;\n this.pageElements = undefined;\n this.parentCollections = [];\n this.prefixFilterCountMap = {};\n this.queryErrorMessage = undefined;\n\n this.offset = 0;\n this.numTileModels = 0;\n this.totalResults = 0;\n this.endOfDataReached = false;\n this.queryInitialized = false;\n\n // Invalidate any fetches in progress\n this.fetchesInProgress.clear();\n console.log('fetches cleared - size =', this.fetchesInProgress.size);\n\n if (this.activeOnHost) this.host.setTotalResultCount(0);\n this.requestHostUpdate();\n }\n\n /**\n * @inheritdoc\n */\n addPage(pageNum: number, pageTiles: TileModel[]): void {\n this.pages[pageNum] = pageTiles;\n this.numTileModels += pageTiles.length;\n this.requestHostUpdate();\n }\n\n /**\n * @inheritdoc\n */\n getPage(pageNum: number): TileModel[] {\n return this.pages[pageNum];\n }\n\n /**\n * @inheritdoc\n */\n getAllPages(): Record<string, TileModel[]> {\n return this.pages;\n }\n\n /**\n * @inheritdoc\n */\n hasPage(pageNum: number): boolean {\n return !!this.pages[pageNum];\n }\n\n /**\n * @inheritdoc\n */\n getTileModelAt(index: number): TileModel | undefined {\n const pageNum = Math.floor(index / this.pageSize) + 1;\n const indexOnPage = index % this.pageSize;\n return this.pages[pageNum]?.[indexOnPage];\n }\n\n /**\n * @inheritdoc\n */\n indexOf(tile: TileModel): number {\n return Object.values(this.pages).flat().indexOf(tile);\n }\n\n /**\n * @inheritdoc\n */\n setPageSize(pageSize: number): void {\n this.reset();\n this.pageSize = pageSize;\n }\n\n /**\n * @inheritdoc\n */\n async handleQueryChange(): Promise<void> {\n this.reset();\n\n // Reset the `initialSearchComplete` promise with a new value for the imminent search\n this._initialSearchCompletePromise = new Promise(res => {\n this._initialSearchCompleteResolver = res;\n });\n\n // Fire the initial page & facet requests\n this.queryInitialized = true;\n await Promise.all([\n this.doInitialPageFetch(),\n this.host.suppressFacets ? null : this.fetchFacets(),\n ]);\n\n // Resolve the `initialSearchComplete` promise for this search\n this._initialSearchCompleteResolver(true);\n }\n\n /**\n * @inheritdoc\n */\n map(\n callback: (model: TileModel, index: number, array: TileModel[]) => TileModel\n ): void {\n this.pages = Object.fromEntries(\n Object.entries(this.pages).map(([page, tileModels]) => [\n page,\n tileModels.map((model, index, array) =>\n model ? callback(model, index, array) : model\n ),\n ])\n );\n this.requestHostUpdate();\n this.refreshVisibleResults();\n }\n\n /**\n * @inheritdoc\n */\n checkAllTiles = (): void => {\n this.map(model => {\n const cloned = model.clone();\n cloned.checked = true;\n return cloned;\n });\n };\n\n /**\n * @inheritdoc\n */\n uncheckAllTiles = (): void => {\n this.map(model => {\n const cloned = model.clone();\n cloned.checked = false;\n return cloned;\n });\n };\n\n /**\n * @inheritdoc\n */\n removeCheckedTiles = (): void => {\n // To make sure our data source remains page-aligned, we will offset our data source by\n // the number of removed tiles, so that we can just add the offset when the infinite\n // scroller queries for cell contents.\n // This only matters while we're still viewing the same set of results. If the user changes\n // their query/filters/sort, then the data source is overwritten and the offset cleared.\n const { checkedTileModels, uncheckedTileModels } = this;\n const numChecked = checkedTileModels.length;\n if (numChecked === 0) return;\n this.offset += numChecked;\n const newPages: typeof this.pages = {};\n\n // Which page the remaining tile models start on, post-offset\n let offsetPageNumber = Math.floor(this.offset / this.pageSize) + 1;\n let indexOnPage = this.offset % this.pageSize;\n\n // Fill the pages up to that point with empty models\n for (let page = 1; page <= offsetPageNumber; page += 1) {\n const remainingHidden = this.offset - this.pageSize * (page - 1);\n const offsetCellsOnPage = Math.min(this.pageSize, remainingHidden);\n newPages[page] = Array(offsetCellsOnPage).fill(undefined);\n }\n\n // Shift all the remaining tiles into their new positions in the data source\n for (const model of uncheckedTileModels) {\n if (!newPages[offsetPageNumber]) newPages[offsetPageNumber] = [];\n newPages[offsetPageNumber].push(model);\n indexOnPage += 1;\n if (indexOnPage >= this.pageSize) {\n offsetPageNumber += 1;\n indexOnPage = 0;\n }\n }\n\n // Swap in the new pages\n this.pages = newPages;\n this.numTileModels -= numChecked;\n this.requestHostUpdate();\n this.refreshVisibleResults();\n };\n\n /**\n * @inheritdoc\n */\n get checkedTileModels(): TileModel[] {\n return this.getFilteredTileModels(model => model.checked);\n }\n\n /**\n * @inheritdoc\n */\n get uncheckedTileModels(): TileModel[] {\n return this.getFilteredTileModels(model => !model.checked);\n }\n\n /**\n * Returns a flattened, filtered array of all the tile models in the data source\n * for which the given predicate returns a truthy value.\n *\n * @param predicate A callback function to apply on each tile model, as with Array.filter\n * @returns A filtered array of tile models satisfying the predicate\n */\n private getFilteredTileModels(\n predicate: (model: TileModel, index: number, array: TileModel[]) => unknown\n ): TileModel[] {\n return Object.values(this.pages)\n .flat()\n .filter((model, index, array) =>\n model ? predicate(model, index, array) : false\n );\n }\n\n /**\n * @inheritdoc\n */\n get canPerformSearch(): boolean {\n if (!this.host.searchService) return false;\n\n const trimmedQuery = this.host.baseQuery?.trim();\n const hasNonEmptyQuery = !!trimmedQuery;\n const isCollectionSearch = !!this.host.withinCollection;\n const isProfileSearch = !!this.host.withinProfile;\n const hasProfileElement = !!this.host.profileElement;\n const isMetadataSearch = this.host.searchType === SearchType.METADATA;\n\n // Metadata searches within a collection/profile are allowed to have no query.\n // Otherwise, a non-empty query must be set.\n return (\n hasNonEmptyQuery ||\n (isCollectionSearch && isMetadataSearch) ||\n (isProfileSearch && hasProfileElement && isMetadataSearch)\n );\n }\n\n /**\n * Sets the state for whether the initial set of search results for the\n * current query is loading\n */\n private setSearchResultsLoading(loading: boolean): void {\n this.searchResultsLoading = loading;\n if (this.activeOnHost) {\n this.host.setSearchResultsLoading(loading);\n }\n }\n\n /**\n * Sets the state for whether the facets for a query is loading\n */\n private setFacetsLoading(loading: boolean): void {\n this.facetsLoading = loading;\n if (this.activeOnHost) {\n this.host.setFacetsLoading(loading);\n }\n }\n\n /**\n * Requests that the host perform an update, provided this data\n * source is actively installed on it.\n */\n private requestHostUpdate(): void {\n if (this.activeOnHost) {\n this.host.requestUpdate();\n }\n }\n\n /**\n * Requests that the host refresh its visible tiles, provided this\n * data source is actively installed on it.\n */\n private refreshVisibleResults(): void {\n if (this.activeOnHost) {\n this.host.refreshVisibleResults();\n }\n }\n\n /**\n * The query key is a string that uniquely identifies the current search.\n * It consists of:\n * - The current base query\n * - The current collection/profile target & page element\n * - The current search type\n * - Any currently-applied facets\n * - Any currently-applied date range\n * - Any currently-applied prefix filters\n * - The current sort options\n *\n * This lets us internally keep track of queries so we don't persist data that's\n * no longer relevant. Not meant to be human-readable.\n */\n get pageFetchQueryKey(): string {\n const profileKey = `pf;${this.host.withinProfile}--pe;${this.host.profileElement}`;\n const pageTarget = this.host.withinCollection ?? profileKey;\n const sortField = this.host.sortParam?.field ?? 'none';\n const sortDirection = this.host.sortParam?.direction ?? 'none';\n return `fq:${this.fullQuery}-pt:${pageTarget}-st:${this.host.searchType}-sf:${sortField}-sd:${sortDirection}`;\n }\n\n /**\n * Similar to `pageFetchQueryKey` above, but excludes sort fields since they\n * are not relevant in determining aggregation queries.\n */\n get facetFetchQueryKey(): string {\n const profileKey = `${this.host.withinProfile}--${this.host.profileElement}`;\n const pageTarget = this.host.withinCollection ?? profileKey;\n return `${this.fullQuery}-${pageTarget}-${this.host.searchType}`;\n }\n\n /**\n * Constructs a search service FilterMap object from the combination of\n * all the currently-applied filters. This includes any facets, letter\n * filters, and date range.\n */\n get filterMap(): FilterMap {\n const builder = new FilterMapBuilder();\n\n // Add the date range, if applicable\n if (this.host.minSelectedDate) {\n builder.addFilter(\n 'year',\n this.host.minSelectedDate,\n FilterConstraint.GREATER_OR_EQUAL\n );\n }\n if (this.host.maxSelectedDate) {\n builder.addFilter(\n 'year',\n this.host.maxSelectedDate,\n FilterConstraint.LESS_OR_EQUAL\n );\n }\n\n // Add any selected facets\n if (this.host.selectedFacets) {\n for (const [facetName, facetValues] of Object.entries(\n this.host.selectedFacets\n )) {\n const { name, values } = this.prepareFacetForFetch(\n facetName,\n facetValues\n );\n for (const [value, bucket] of Object.entries(values)) {\n let constraint;\n if (bucket.state === 'selected') {\n constraint = FilterConstraint.INCLUDE;\n } else if (bucket.state === 'hidden') {\n constraint = FilterConstraint.EXCLUDE;\n }\n\n if (constraint) {\n builder.addFilter(name, value, constraint);\n }\n }\n }\n }\n\n // Add any letter filters\n if (this.host.selectedTitleFilter) {\n builder.addFilter(\n 'firstTitle',\n this.host.selectedTitleFilter,\n FilterConstraint.INCLUDE\n );\n }\n if (this.host.selectedCreatorFilter) {\n builder.addFilter(\n 'firstCreator',\n this.host.selectedCreatorFilter,\n FilterConstraint.INCLUDE\n );\n }\n\n const filterMap = builder.build();\n return filterMap;\n }\n\n /**\n * Produces a compact unique ID for a search request that can help with debugging\n * on the backend by making related requests easier to trace through different services.\n * (e.g., tying the hits/aggregations requests for the same page back to a single hash).\n *\n * @param params The search service parameters for the request\n * @param kind The kind of request (hits-only, aggregations-only, or both)\n * @returns A Promise resolving to the uid to apply to the request\n */\n async requestUID(params: SearchParams, kind: RequestKind): Promise<string> {\n const paramsToHash = JSON.stringify({\n pageType: params.pageType,\n pageTarget: params.pageTarget,\n query: params.query,\n fields: params.fields,\n filters: params.filters,\n sort: params.sort,\n searchType: this.host.searchType,\n });\n\n const fullQueryHash = (await sha1(paramsToHash)).slice(0, 20); // First 80 bits of SHA-1 are plenty for this\n const sessionId = (await this.host.getSessionId()).slice(0, 20); // Likewise\n const page = params.page ?? 0;\n const kindPrefix = kind.charAt(0); // f = full, h = hits, a = aggregations\n const currentTime = Date.now();\n\n return `R:${fullQueryHash}-S:${sessionId}-P:${page}-K:${kindPrefix}-T:${currentTime}`;\n }\n\n /**\n * @inheritdoc\n */\n get pageSpecifierParams(): PageSpecifierParams | null {\n if (this.host.withinCollection) {\n return {\n pageType: 'collection_details',\n pageTarget: this.host.withinCollection,\n };\n }\n if (this.host.withinProfile) {\n return {\n pageType: 'account_details',\n pageTarget: this.host.withinProfile,\n pageElements: this.host.profileElement\n ? [this.host.profileElement]\n : [],\n };\n }\n return null;\n }\n\n /**\n * The full query, including year facets and date range clauses\n */\n private get fullQuery(): string | undefined {\n let fullQuery = this.host.baseQuery?.trim() ?? '';\n\n const { facetQuery, dateRangeQueryClause, sortFilterQueries } = this;\n\n if (facetQuery) {\n fullQuery += ` AND ${facetQuery}`;\n }\n if (dateRangeQueryClause) {\n fullQuery += ` AND ${dateRangeQueryClause}`;\n }\n if (sortFilterQueries) {\n fullQuery += ` AND ${sortFilterQueries}`;\n }\n return fullQuery.trim();\n }\n\n /**\n * Generates a query string representing the current set of applied facets\n *\n * Example: `mediatype:(\"collection\" OR \"audio\" OR -\"etree\") AND year:(\"2000\" OR \"2001\")`\n */\n private get facetQuery(): string | undefined {\n if (!this.host.selectedFacets) return undefined;\n const facetClauses = [];\n for (const [facetName, facetValues] of Object.entries(\n this.host.selectedFacets\n )) {\n facetClauses.push(this.buildFacetClause(facetName, facetValues));\n }\n return this.joinFacetClauses(facetClauses)?.trim();\n }\n\n private get dateRangeQueryClause(): string | undefined {\n if (!this.host.minSelectedDate || !this.host.maxSelectedDate) {\n return undefined;\n }\n\n return `year:[${this.host.minSelectedDate} TO ${this.host.maxSelectedDate}]`;\n }\n\n private get sortFilterQueries(): string {\n const queries = [this.titleQuery, this.creatorQuery];\n return queries.filter(q => q).join(' AND ');\n }\n\n /**\n * Returns a query clause identifying the currently selected title filter,\n * e.g., `firstTitle:X`.\n */\n private get titleQuery(): string | undefined {\n return this.host.selectedTitleFilter\n ? `firstTitle:${this.host.selectedTitleFilter}`\n : undefined;\n }\n\n /**\n * Returns a query clause identifying the currently selected creator filter,\n * e.g., `firstCreator:X`.\n */\n private get creatorQuery(): string | undefined {\n return this.host.selectedCreatorFilter\n ? `firstCreator:${this.host.selectedCreatorFilter}`\n : undefined;\n }\n\n /**\n * Builds an OR-joined facet clause for the given facet name and values.\n *\n * E.g., for name `subject` and values\n * `{ foo: { state: 'selected' }, bar: { state: 'hidden' } }`\n * this will produce the clause\n * `subject:(\"foo\" OR -\"bar\")`.\n *\n * @param facetName The facet type (e.g., 'collection')\n * @param facetValues The facet buckets, mapped by their keys\n */\n private buildFacetClause(\n facetName: string,\n facetValues: Record<string, FacetBucket>\n ): string {\n const { name: facetQueryName, values } = this.prepareFacetForFetch(\n facetName,\n facetValues\n );\n const facetEntries = Object.entries(values);\n if (facetEntries.length === 0) return '';\n\n const facetValuesArray: string[] = [];\n for (const [key, facetData] of facetEntries) {\n const plusMinusPrefix = facetData.state === 'hidden' ? '-' : '';\n facetValuesArray.push(`${plusMinusPrefix}\"${key}\"`);\n }\n\n const valueQuery = facetValuesArray.join(` OR `);\n return `${facetQueryName}:(${valueQuery})`;\n }\n\n /**\n * Handles some special pre-request normalization steps for certain facet types\n * that require them.\n *\n * @param facetName The name of the facet type (e.g., 'language')\n * @param facetValues An array of values for that facet type\n */\n private prepareFacetForFetch(\n facetName: string,\n facetValues: Record<string, FacetBucket>\n ): { name: string; values: Record<string, FacetBucket> } {\n // eslint-disable-next-line prefer-const\n let [normalizedName, normalizedValues] = [facetName, facetValues];\n\n // The full \"search engine\" name of the lending field is \"lending___status\"\n if (facetName === 'lending') {\n normalizedName = 'lending___status';\n }\n\n return {\n name: normalizedName,\n values: normalizedValues,\n };\n }\n\n /**\n * Takes an array of facet clauses, and combines them into a\n * full AND-joined facet query string. Empty clauses are ignored.\n */\n private joinFacetClauses(facetClauses: string[]): string | undefined {\n const nonEmptyFacetClauses = facetClauses.filter(\n clause => clause.length > 0\n );\n return nonEmptyFacetClauses.length > 0\n ? `(${nonEmptyFacetClauses.join(' AND ')})`\n : undefined;\n }\n\n /**\n * Fires a backend request to fetch a set of aggregations (representing UI facets) for\n * the current search state.\n */\n private async fetchFacets(): Promise<void> {\n console.log('fetchFacets', this.id, this.host.profileElement);\n const trimmedQuery = this.host.baseQuery?.trim();\n if (!this.canPerformSearch) return;\n console.log('will actually fetch facets');\n\n const { facetFetchQueryKey } = this;\n if (this.fetchesInProgress.has(facetFetchQueryKey)) return;\n this.fetchesInProgress.add(facetFetchQueryKey);\n\n const sortParams = this.host.sortParam ? [this.host.sortParam] : [];\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n rows: 0,\n filters: this.filterMap,\n // Fetch a few extra buckets beyond the 6 we show, in case some get suppressed\n aggregationsSize: 10,\n // Note: we don't need an aggregations param to fetch the default aggregations from the PPS.\n // The default aggregations for the search_results page type should be what we need here.\n };\n params.uid = await this.requestUID(\n { ...params, sort: sortParams },\n 'aggregations'\n );\n\n this.setFacetsLoading(true);\n const searchResponse = await this.host.searchService?.search(\n params,\n this.host.searchType\n );\n const success = searchResponse?.success;\n\n // This is checking to see if the query has changed since the data was fetched.\n // If so, we just want to discard this set of aggregations because they are\n // likely no longer valid for the newer query.\n const queryChangedSinceFetch =\n !this.fetchesInProgress.has(facetFetchQueryKey);\n this.fetchesInProgress.delete(facetFetchQueryKey);\n if (queryChangedSinceFetch) {\n console.log(\n 'facet query has changed since fetch, returning. new/old:',\n this.facetFetchQueryKey,\n facetFetchQueryKey\n );\n return;\n }\n\n if (!success) {\n const errorMsg = searchResponse?.error?.message;\n const detailMsg = searchResponse?.error?.details?.message;\n\n if (!errorMsg && !detailMsg) {\n // @ts-ignore: Property 'Sentry' does not exist on type 'Window & typeof globalThis'\n window?.Sentry?.captureMessage?.(\n 'Missing or malformed facet response from backend',\n 'error'\n );\n }\n\n this.setFacetsLoading(false);\n return;\n }\n\n const { aggregations, collectionTitles } = success.response;\n this.aggregations = aggregations;\n\n if (collectionTitles) {\n for (const [id, title] of Object.entries(collectionTitles)) {\n this.collectionTitles.set(id, title);\n }\n }\n\n this.yearHistogramAggregation =\n success?.response?.aggregations?.year_histogram;\n\n this.setFacetsLoading(false);\n this.requestHostUpdate();\n }\n\n /**\n * Performs the initial page fetch(es) for the current search state.\n */\n private async doInitialPageFetch(): Promise<void> {\n this.setSearchResultsLoading(true);\n // Try to batch 2 initial page requests when possible\n await this.fetchPage(this.host.initialPageNumber, 2);\n }\n\n /**\n * Fetches one or more pages of results and updates the data source.\n *\n * @param pageNumber The page number to fetch\n * @param numInitialPages If this is an initial page fetch (`pageNumber = 1`),\n * specifies how many pages to batch together in one request. Ignored\n * if `pageNumber != 1`, defaulting to a single page.\n */\n async fetchPage(pageNumber: number, numInitialPages = 1): Promise<void> {\n const trimmedQuery = this.host.baseQuery?.trim();\n if (!this.canPerformSearch) return;\n\n // if we already have data, don't fetch again\n if (this.hasPage(pageNumber)) return;\n\n if (this.endOfDataReached) return;\n\n // Batch multiple initial page requests together if needed (e.g., can request\n // pages 1 and 2 together in a single request).\n const numPages = pageNumber === 1 ? numInitialPages : 1;\n const numRows = this.pageSize * numPages;\n\n // if a fetch is already in progress for this query and page, don't fetch again\n const { pageFetchQueryKey } = this;\n const currentPageKey = `${pageFetchQueryKey}-p:${pageNumber}`;\n console.log(\n 'page fetch key',\n currentPageKey,\n this.fetchesInProgress.has(currentPageKey)\n );\n if (this.fetchesInProgress.has(currentPageKey)) return;\n // const pageFetches =\n // this.fetchesInProgress[pageFetchQueryKey] ?? new Set();\n // if (pageFetches.has(pageNumber)) return;\n\n for (let i = 0; i < numPages; i += 1) {\n this.fetchesInProgress.add(`${pageFetchQueryKey}-p:${pageNumber + i}`);\n }\n console.log(\n `fetchPage(${pageNumber})`,\n this.id,\n this.canPerformSearch,\n this.hasPage(pageNumber),\n this.endOfDataReached,\n this.host.baseQuery,\n JSON.stringify(this.host.selectedFacets),\n this.pageFetchQueryKey\n );\n this.previousQueryKey = pageFetchQueryKey;\n\n let sortParams = this.host.sortParam ? [this.host.sortParam] : [];\n // TODO eventually the PPS should handle these defaults natively\n if (this.host.withinProfile && this.host.defaultSortParam) {\n const sortOption =\n SORT_OPTIONS[this.host.defaultSortParam.field as SortField];\n if (sortOption.searchServiceKey) {\n sortParams = [\n {\n field: sortOption.searchServiceKey,\n direction: 'desc',\n },\n ];\n }\n }\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n page: pageNumber,\n rows: numRows,\n sort: sortParams,\n filters: this.filterMap,\n aggregations: { omit: true },\n };\n params.uid = await this.requestUID(params, 'hits');\n\n console.log('=== FIRING PAGE REQUEST ===');\n const searchResponse = await this.host.searchService?.search(\n params,\n this.host.searchType\n );\n console.log('=== RECEIVED PAGE RESPONSE IN CB === ');\n const success = searchResponse?.success;\n\n // This is checking to see if the fetch has been invalidated since it was fired off.\n // If so, we just want to discard the response since it is for an obsolete query state.\n console.log(\n 'after page fetch key:',\n currentPageKey,\n this.fetchesInProgress.has(currentPageKey)\n );\n if (!this.fetchesInProgress.has(currentPageKey)) return;\n for (let i = 0; i < numPages; i += 1) {\n this.fetchesInProgress.delete(`${pageFetchQueryKey}-p:${pageNumber + i}`);\n }\n\n if (!success) {\n const errorMsg = searchResponse?.error?.message;\n const detailMsg = searchResponse?.error?.details?.message;\n\n this.queryErrorMessage = `${errorMsg ?? ''}${\n detailMsg ? `; ${detailMsg}` : ''\n }`;\n\n if (!this.queryErrorMessage) {\n this.queryErrorMessage = 'Missing or malformed response from backend';\n // @ts-ignore: Property 'Sentry' does not exist on type 'Window & typeof globalThis'\n window?.Sentry?.captureMessage?.(this.queryErrorMessage, 'error');\n }\n\n this.setSearchResultsLoading(false);\n this.requestHostUpdate();\n return;\n }\n\n this.totalResults = success.response.totalResults - this.offset;\n if (this.activeOnHost) {\n this.host.setTotalResultCount(this.totalResults);\n\n // display event to offshoot when result count is zero.\n if (this.totalResults === 0) {\n this.host.emitEmptyResults();\n }\n }\n\n if (this.host.withinCollection) {\n console.log(\n 'host is within collection, setting collection info:',\n success.response.collectionExtraInfo\n );\n this.collectionExtraInfo = success.response.collectionExtraInfo;\n\n // For collections, we want the UI to respect the default sort option\n // which can be specified in metadata, or otherwise assumed to be week:desc\n if (this.activeOnHost) {\n this.host.applyDefaultCollectionSort(this.collectionExtraInfo);\n }\n\n if (this.collectionExtraInfo) {\n this.parentCollections = [].concat(\n this.collectionExtraInfo.public_metadata?.collection ?? []\n );\n }\n } else if (this.host.withinProfile) {\n console.log(\n 'host is within profile, setting acct info:',\n success.response.accountExtraInfo,\n success.response.pageElements\n );\n this.accountExtraInfo = success.response.accountExtraInfo;\n this.pageElements = success.response.pageElements;\n } else {\n console.log(\n 'not within profile/collxn',\n this.host.withinCollection,\n this.host.withinProfile\n );\n }\n\n const { results, collectionTitles } = success.response;\n if (results && results.length > 0) {\n // Load any collection titles present on the response into the cache,\n // or queue up preload fetches for them if none were present.\n if (collectionTitles) {\n for (const [id, title] of Object.entries(collectionTitles)) {\n this.collectionTitles.set(id, title);\n }\n }\n\n // Update the data source for each returned page\n for (let i = 0; i < numPages; i += 1) {\n const pageStartIndex = this.pageSize * i;\n this.addTilesToDataSource(\n pageNumber + i,\n results.slice(pageStartIndex, pageStartIndex + this.pageSize)\n );\n }\n }\n\n // When we reach the end of the data, we can set the infinite scroller's\n // item count to the real total number of results (rather than the\n // temporary estimates based on pages rendered so far).\n const resultCountDiscrepancy = numRows - results.length;\n if (resultCountDiscrepancy > 0) {\n console.log('End of data reached');\n this.endOfDataReached = true;\n if (this.activeOnHost) this.host.setTileCount(this.totalResults);\n }\n\n this.setSearchResultsLoading(false);\n this.requestHostUpdate();\n }\n\n /**\n * Update the datasource from the fetch response\n *\n * @param pageNumber\n * @param results\n */\n private addTilesToDataSource(\n pageNumber: number,\n results: SearchResult[]\n ): void {\n const tiles: TileModel[] = [];\n results?.forEach(result => {\n if (!result.identifier) return;\n tiles.push(new TileModel(result));\n });\n this.addPage(pageNumber, tiles);\n const visiblePages = this.host.currentVisiblePageNumbers;\n const needsReload = visiblePages.includes(pageNumber);\n if (needsReload) {\n this.refreshVisibleResults();\n }\n }\n\n /**\n * Fetches the aggregation buckets for the given prefix filter type.\n */\n private async fetchPrefixFilterBuckets(\n filterType: PrefixFilterType\n ): Promise<Bucket[]> {\n const trimmedQuery = this.host.baseQuery?.trim();\n if (!this.canPerformSearch) return [];\n\n const filterAggregationKey = prefixFilterAggregationKeys[filterType];\n const sortParams = this.host.sortParam ? [this.host.sortParam] : [];\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n rows: 0,\n filters: this.filterMap,\n // Only fetch the firstTitle or firstCreator aggregation\n aggregations: { simpleParams: [filterAggregationKey] },\n // Fetch all 26 letter buckets\n aggregationsSize: 26,\n };\n params.uid = await this.requestUID(\n { ...params, sort: sortParams },\n 'aggregations'\n );\n\n const searchResponse = await this.host.searchService?.search(\n params,\n this.host.searchType\n );\n\n return (searchResponse?.success?.response?.aggregations?.[\n filterAggregationKey\n ]?.buckets ?? []) as Bucket[];\n }\n\n /**\n * Fetches and caches the prefix filter counts for the given filter type.\n */\n async updatePrefixFilterCounts(filterType: PrefixFilterType): Promise<void> {\n const { facetFetchQueryKey } = this;\n const buckets = await this.fetchPrefixFilterBuckets(filterType);\n\n // Don't update the filter counts for an outdated query (if it has been changed\n // since we sent the request)\n const queryChangedSinceFetch =\n facetFetchQueryKey !== this.facetFetchQueryKey;\n if (queryChangedSinceFetch) return;\n\n // Unpack the aggregation buckets into a simple map like { 'A': 50, 'B': 25, ... }\n this.prefixFilterCountMap = { ...this.prefixFilterCountMap }; // Clone the object to trigger an update\n this.prefixFilterCountMap[filterType] = buckets.reduce(\n (acc: Record<string, number>, bucket: Bucket) => {\n acc[(bucket.key as string).toUpperCase()] = bucket.doc_count;\n return acc;\n },\n {}\n );\n\n this.requestHostUpdate();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-browser-query-state.js","sourceRoot":"","sources":["../../../src/data-source/collection-browser-query-state.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n
|
|
1
|
+
{"version":3,"file":"collection-browser-query-state.js","sourceRoot":"","sources":["../../../src/data-source/collection-browser-query-state.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n CollectionExtraInfo,\n PageElementName,\n SearchServiceInterface,\n SearchType,\n SortDirection,\n SortParam,\n} from '@internetarchive/search-service';\nimport type { SelectedFacets, SortField } from '../models';\nimport type { CollectionBrowserDataSourceInterface } from './collection-browser-data-source-interface';\n\n/**\n * Properties of collection browser that affect the overall search query\n */\nexport interface CollectionBrowserQueryState {\n baseQuery?: string;\n withinCollection?: string;\n withinProfile?: string;\n profileElement?: PageElementName;\n searchType: SearchType;\n selectedFacets?: SelectedFacets;\n minSelectedDate?: string;\n maxSelectedDate?: string;\n selectedTitleFilter: string | null;\n selectedCreatorFilter: string | null;\n selectedSort?: SortField;\n sortDirection: SortDirection | null;\n}\n\n/**\n * Interface representing search-related state and operations required by the\n * data source on its host component.\n */\nexport interface CollectionBrowserSearchInterface\n extends CollectionBrowserQueryState {\n searchService?: SearchServiceInterface;\n readonly sortParam: SortParam | null;\n readonly defaultSortParam: SortParam | null;\n readonly suppressFacets?: boolean;\n readonly initialPageNumber: number;\n readonly currentVisiblePageNumbers: number[];\n readonly clearResultsOnEmptyQuery?: boolean;\n readonly dataSource?: CollectionBrowserDataSourceInterface;\n\n getSessionId(): Promise<string>;\n setSearchResultsLoading(loading: boolean): void;\n setFacetsLoading(loading: boolean): void;\n setTotalResultCount(count: number): void;\n setTileCount(count: number): void;\n applyDefaultCollectionSort(collectionInfo?: CollectionExtraInfo): void;\n emitEmptyResults(): void;\n emitQueryStateChanged(): void;\n refreshVisibleResults(): void;\n}\n"]}
|
package/dist/src/models.js
CHANGED
|
@@ -279,7 +279,7 @@ export const defaultProfileElementSorts = {
|
|
|
279
279
|
uploads: SortField.datearchived,
|
|
280
280
|
reviews: SortField.datereviewed,
|
|
281
281
|
collections: SortField.datearchived,
|
|
282
|
-
|
|
282
|
+
web_archives: SortField.datearchived,
|
|
283
283
|
};
|
|
284
284
|
/**
|
|
285
285
|
* A map from prefix filter types to the corresponding aggregation keys
|
package/dist/src/models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediaType } from '@internetarchive/field-parsers';\nimport {\n AggregationSortType,\n SearchResult,\n SortDirection,\n} from '@internetarchive/search-service';\nimport { collapseRepeatedQuotes } from './utils/collapse-repeated-quotes';\nimport { resolveMediatype } from './utils/resolve-mediatype';\n\n/**\n * Flags that can affect the visibility of content on a tile\n */\ninterface TileFlags {\n loginRequired: boolean;\n contentWarning: boolean;\n}\n\n/**\n * Class for converting & storing raw search results in the correct format for UI tiles.\n */\nexport class TileModel {\n averageRating?: number;\n\n captureDates?: Date[]; // List of capture dates for a URL, used on profile Web Archives tiles\n\n checked: boolean; // Whether this tile is currently checked for item management functions\n\n collectionIdentifier?: string;\n\n collectionName?: string;\n\n collectionFilesCount: number;\n\n collections: string[];\n\n collectionSize: number;\n\n commentCount: number;\n\n creator?: string;\n\n creators: string[];\n\n dateStr?: string; // A string representation of the publication date, used strictly for passing preformatted dates to the parent\n\n dateAdded?: Date; // Date added to public search (software-defined) [from: addeddate]\n\n dateArchived?: Date; // Date archived (software-defined) item created on archive.org [from: publicdate]\n\n datePublished?: Date; // Date work published in the world (user-defined) [from: date]\n\n dateReviewed?: Date; // Date reviewed (user-created) most recent review [from: reviewdate]\n\n description?: string;\n\n favCount: number;\n\n href?: string;\n\n identifier?: string;\n\n issue?: string;\n\n itemCount: number;\n\n mediatype: MediaType;\n\n source?: string;\n\n snippets?: string[];\n\n subjects: string[];\n\n title: string;\n\n viewCount?: number;\n\n volume?: string;\n\n weeklyViewCount?: number;\n\n loginRequired: boolean;\n\n contentWarning: boolean;\n\n constructor(result: SearchResult) {\n const flags = this.getFlags(result);\n\n this.averageRating = result.avg_rating?.value;\n this.captureDates = result.capture_dates?.values;\n this.checked = false;\n this.collections = result.collection?.values ?? [];\n this.collectionFilesCount = result.collection_files_count?.value ?? 0;\n this.collectionSize = result.collection_size?.value ?? 0;\n this.commentCount = result.num_reviews?.value ?? 0;\n this.creator = result.creator?.value;\n this.creators = result.creator?.values ?? [];\n this.dateAdded = result.addeddate?.value;\n this.dateArchived = result.publicdate?.value;\n this.datePublished = result.date?.value;\n this.dateReviewed = result.reviewdate?.value;\n this.description = result.description?.values.join('\\n');\n this.favCount = result.num_favorites?.value ?? 0;\n this.href = collapseRepeatedQuotes(result.__href__?.value);\n this.identifier = result.identifier;\n this.issue = result.issue?.value;\n this.itemCount = result.item_count?.value ?? 0;\n this.mediatype = resolveMediatype(result);\n this.snippets = result.highlight?.values ?? [];\n this.source = result.source?.value;\n this.subjects = result.subject?.values ?? [];\n this.title = result.title?.value ?? '';\n this.volume = result.volume?.value;\n this.viewCount = result.downloads?.value;\n this.weeklyViewCount = result.week?.value;\n this.loginRequired = flags.loginRequired;\n this.contentWarning = flags.contentWarning;\n }\n\n /**\n * Copies the contents of this TileModel onto a new instance\n */\n clone(): TileModel {\n const cloned = new TileModel({});\n cloned.averageRating = this.averageRating;\n cloned.captureDates = this.captureDates;\n cloned.checked = this.checked;\n cloned.collections = this.collections;\n cloned.collectionFilesCount = this.collectionFilesCount;\n cloned.collectionSize = this.collectionSize;\n cloned.commentCount = this.commentCount;\n cloned.creator = this.creator;\n cloned.creators = this.creators;\n cloned.dateStr = this.dateStr;\n cloned.dateAdded = this.dateAdded;\n cloned.dateArchived = this.dateArchived;\n cloned.datePublished = this.datePublished;\n cloned.dateReviewed = this.dateReviewed;\n cloned.description = this.description;\n cloned.favCount = this.favCount;\n cloned.href = this.href;\n cloned.identifier = this.identifier;\n cloned.issue = this.issue;\n cloned.itemCount = this.itemCount;\n cloned.mediatype = this.mediatype;\n cloned.snippets = this.snippets;\n cloned.source = this.source;\n cloned.subjects = this.subjects;\n cloned.title = this.title;\n cloned.volume = this.volume;\n cloned.viewCount = this.viewCount;\n cloned.weeklyViewCount = this.weeklyViewCount;\n cloned.loginRequired = this.loginRequired;\n cloned.contentWarning = this.contentWarning;\n return cloned;\n }\n\n /**\n * Determines the appropriate tile flags for the given search result\n * (login required and/or content warning)\n */\n private getFlags(result: SearchResult): TileFlags {\n const flags: TileFlags = {\n loginRequired: false,\n contentWarning: false,\n };\n\n // Check if item and item in \"modifying\" collection, setting above flags\n if (\n result.collection?.values.length &&\n result.mediatype?.value !== 'collection'\n ) {\n for (const collection of result.collection?.values ?? []) {\n if (collection === 'loggedin') {\n flags.loginRequired = true;\n if (flags.contentWarning) break;\n }\n if (collection === 'no-preview') {\n flags.contentWarning = true;\n if (flags.loginRequired) break;\n }\n }\n }\n\n return flags;\n }\n}\n\nexport type RequestKind = 'full' | 'hits' | 'aggregations';\n\nexport type CollectionDisplayMode = 'grid' | 'list-compact' | 'list-detail';\n\nexport type TileDisplayMode =\n | 'grid'\n | 'list-compact'\n | 'list-detail'\n | 'list-header';\n\n/**\n * This is mainly used to set the cookies for the collection display mode.\n *\n * It allows the user to set different modes for different contexts (collection page, search page, etc).\n */\nexport type CollectionBrowserContext = 'collection' | 'search';\n\n/**\n * The sort fields shown in the sort filter bar\n */\nexport enum SortField {\n 'default' = 'default',\n 'unrecognized' = 'unrecognized',\n 'relevance' = 'relevance',\n 'alltimeview' = 'alltimeview',\n 'weeklyview' = 'weeklyview',\n 'title' = 'title',\n 'date' = 'date',\n 'datearchived' = 'datearchived',\n 'datereviewed' = 'datereviewed',\n 'dateadded' = 'dateadded',\n 'datefavorited' = 'datefavorited',\n 'creator' = 'creator',\n}\n\nexport interface SortOption {\n /**\n * The SortField enum member corresponding to this option.\n */\n field: SortField;\n\n /**\n * The default sort direction to apply when this sort option is first selected.\n */\n defaultSortDirection: SortDirection | null;\n\n /**\n * Whether this sort option allows its sort direction to be changed from the default.\n */\n canSetDirection: boolean;\n\n /**\n * Whether this sort option may appear in the sort bar.\n */\n shownInSortBar: boolean;\n\n /**\n * Whether this sort option should be saved to the URL.\n * If false, then no `sort` param will be added to the URL when this sort option\n * is selected.\n */\n shownInURL: boolean;\n\n /**\n * Whether this sort option is passed to the search service.\n * If false, then no sort param will be passed to the search service at all when\n * this sort option is selected.\n */\n handledBySearchService: boolean;\n\n /**\n * The string identifying this sort field to the search service & backend API.\n */\n searchServiceKey?: string;\n\n /**\n * The human-readable name to use for this option in the sort bar (if applicable).\n */\n displayName: string;\n\n /**\n * A list of URL param keys that should be mapped to this sort option.\n * E.g., both `title` and `titleSorter` in the URL map to the `SortField.title` option.\n */\n urlNames: (string | null | undefined)[];\n}\n\nexport const SORT_OPTIONS: Record<SortField, SortOption> = {\n // Default sort is the case where the user has not specified a sort option via the sort bar or URL.\n // In these cases, we defer to whatever sort the backend chooses.\n // For the search page, the default is always relevance sort.\n // For collection pages _without a query_, the default is usually weekly views, but this can be\n // overridden by the collection's `sort-by` metadata entry. If a query _is_ specified, then the\n // default is again relevance sort.\n // For fav-* collections only, the default is instead sorting by date favorited.\n [SortField.default]: {\n field: SortField.default,\n defaultSortDirection: null,\n canSetDirection: false,\n shownInSortBar: false,\n shownInURL: false,\n handledBySearchService: false, // We rely on the PPS default sort handling in these cases\n displayName: '',\n urlNames: ['', null, undefined], // Empty or nullish sort params result in default sorting\n },\n // Unrecognized sort is the case where the user has specified a sort in the URL, but it is not\n // one of the options listed in this map. We still want these unrecognized sorts to be applied\n // when searching, but they are not displayed in the sort bar and we do not actively manage\n // their URL param beyond flipping the direction as needed.\n [SortField.unrecognized]: {\n field: SortField.unrecognized,\n defaultSortDirection: null,\n canSetDirection: true,\n shownInSortBar: false,\n shownInURL: false,\n handledBySearchService: true, // The unrecognized sort param is passed along as-is\n displayName: '',\n urlNames: [],\n },\n // Relevance sort is unique in that it does not produce a URL param when it is set.\n // It is only available when there is a user-specified query that relevancy can be scored against.\n // Therefore, it does not appear as a sort bar option when browsing a collection with no query set.\n [SortField.relevance]: {\n field: SortField.relevance,\n defaultSortDirection: null,\n canSetDirection: false,\n shownInSortBar: true,\n shownInURL: false,\n handledBySearchService: false,\n displayName: 'Relevance',\n urlNames: ['_score'],\n },\n [SortField.alltimeview]: {\n field: SortField.alltimeview,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'downloads',\n displayName: 'All-time views',\n urlNames: ['downloads'],\n },\n [SortField.weeklyview]: {\n field: SortField.weeklyview,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'week',\n displayName: 'Weekly views',\n urlNames: ['week'],\n },\n [SortField.title]: {\n field: SortField.title,\n defaultSortDirection: 'asc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'titleSorter',\n displayName: 'Title',\n urlNames: ['title', 'titleSorter'],\n },\n [SortField.date]: {\n field: SortField.date,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'date',\n displayName: 'Date published',\n urlNames: ['date'],\n },\n [SortField.datearchived]: {\n field: SortField.datearchived,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'publicdate',\n displayName: 'Date archived',\n urlNames: ['publicdate'],\n },\n [SortField.datereviewed]: {\n field: SortField.datereviewed,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'reviewdate',\n displayName: 'Date reviewed',\n urlNames: ['reviewdate'],\n },\n [SortField.dateadded]: {\n field: SortField.dateadded,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'addeddate',\n displayName: 'Date added',\n urlNames: ['addeddate'],\n },\n [SortField.datefavorited]: {\n field: SortField.datefavorited,\n defaultSortDirection: 'desc',\n canSetDirection: false,\n shownInSortBar: true, // But only when viewing fav-* collections\n shownInURL: false,\n handledBySearchService: false,\n searchServiceKey: 'favoritedate',\n displayName: 'Date favorited',\n urlNames: ['favoritedate'],\n },\n [SortField.creator]: {\n field: SortField.creator,\n defaultSortDirection: 'asc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'creatorSorter',\n displayName: 'Creator',\n urlNames: ['creator', 'creatorSorter'],\n },\n};\n\n/**\n * Returns the SortOption corresponding to the given API sort name, or\n * the \"unrecognized\" SortOption if none matches.\n */\nexport function sortOptionFromAPIString(sortName?: string | null): SortOption {\n return (\n Object.values(SORT_OPTIONS).find(opt =>\n opt.urlNames.some(name => sortName === name)\n ) ?? SORT_OPTIONS[SortField.unrecognized]\n );\n}\n\nexport const defaultProfileElementSorts: Record<string, Exclude<SortField, SortField.default>> = {\n uploads: SortField.datearchived,\n reviews: SortField.datereviewed,\n collections: SortField.datearchived,\n 'web-archive': SortField.datearchived,\n};\n\n/** A union of the fields that permit prefix filtering (e.g., alphabetical filtering) */\nexport type PrefixFilterType = 'title' | 'creator';\n\n/** A map from prefixes (e.g., initial letters) to the number of items matching that prefix */\nexport type PrefixFilterCounts = Record<string, number>;\n\n/**\n * A map from prefix filter types to the corresponding aggregation keys\n * that are needed to fetch the filter counts from the backend.\n */\nexport const prefixFilterAggregationKeys: Record<PrefixFilterType, string> = {\n title: 'firstTitle',\n creator: 'firstCreator',\n};\n\n/**\n * Union of the facet types that are available in the sidebar.\n */\nexport type FacetOption =\n | 'subject'\n | 'lending'\n | 'mediatype'\n | 'language'\n | 'creator'\n | 'collection'\n | 'year';\n\nexport type SelectedFacetState = 'selected' | 'hidden';\n\nexport type FacetState = SelectedFacetState | 'none';\n\nexport interface FacetBucket {\n // for some facets, we augment the key with a display value\n displayText?: string;\n key: string;\n count: number;\n state: FacetState;\n}\n\nexport interface FacetGroup {\n title: string;\n key: FacetOption;\n buckets: FacetBucket[];\n}\n\n/**\n * Information about a user interaction event on a facet.\n */\nexport type FacetEventDetails = {\n /**\n * The type of facet that was interacted with (e.g., 'mediatype', 'language', ...).\n */\n facetType: FacetOption;\n /**\n * The bucket corresponding to the facet that was interacted with, including the\n * updated state of the facet after the interaction.\n */\n bucket: FacetBucket;\n /**\n * Whether the interaction occurred on a negative facet.\n */\n negative: boolean;\n};\n\nexport type FacetValue = string;\n\nexport type SelectedFacets = Record<\n FacetOption,\n Record<FacetValue, FacetBucket>\n>;\n\nexport const getDefaultSelectedFacets = (): SelectedFacets => ({\n subject: {},\n lending: {},\n mediatype: {},\n language: {},\n creator: {},\n collection: {},\n year: {},\n});\n\nexport const facetDisplayOrder: FacetOption[] = [\n 'mediatype',\n 'lending',\n 'year',\n 'subject',\n 'collection',\n 'creator',\n 'language',\n];\n\nexport const facetTitles: Record<FacetOption, string> = {\n subject: 'Subject',\n lending: 'Availability',\n mediatype: 'Media Type',\n language: 'Language',\n creator: 'Creator',\n collection: 'Collection',\n year: 'Year',\n};\n\n/**\n * The default sort type to use for each facet type\n */\nexport const defaultFacetSort: Record<FacetOption, AggregationSortType> = {\n subject: AggregationSortType.COUNT,\n lending: AggregationSortType.COUNT,\n mediatype: AggregationSortType.COUNT,\n language: AggregationSortType.COUNT,\n creator: AggregationSortType.COUNT,\n collection: AggregationSortType.COUNT,\n year: AggregationSortType.NUMERIC,\n};\n\n/**\n * The sort type corresponding to facet bucket values, for each facet type\n * (i.e., the opposite of \"sort by count\" for that type).\n */\nexport const valueFacetSort: Record<FacetOption, AggregationSortType> = {\n subject: AggregationSortType.ALPHABETICAL,\n lending: AggregationSortType.ALPHABETICAL,\n mediatype: AggregationSortType.ALPHABETICAL,\n language: AggregationSortType.ALPHABETICAL,\n creator: AggregationSortType.ALPHABETICAL,\n collection: AggregationSortType.ALPHABETICAL,\n year: AggregationSortType.NUMERIC,\n};\n\nexport type LendingFacetKey =\n | 'is_lendable'\n | 'is_borrowable'\n | 'available_to_borrow'\n | 'is_browsable'\n | 'available_to_browse'\n | 'is_readable'\n | 'available_to_waitlist';\n\n/**\n * Maps valid lending keys to whether they should be visible in the facet sidebar\n */\nexport const lendingFacetKeysVisibility: Record<LendingFacetKey, boolean> = {\n is_lendable: true,\n is_borrowable: false,\n available_to_borrow: true,\n is_browsable: false,\n available_to_browse: false,\n is_readable: true,\n available_to_waitlist: false,\n};\n\n/**\n * Maps valid, visible lending keys to their facet sidebar display text\n */\nexport const lendingFacetDisplayNames: Partial<\n Record<LendingFacetKey, string>\n> = {\n is_lendable: 'Lending Library',\n available_to_borrow: 'Borrow 14 Days',\n is_readable: 'Always Available',\n};\n\n/**\n * A record of which admin-only collections should be suppressed from being displayed\n * as facets or in an item's list of collections.\n */\nexport const suppressedCollections: Record<string, boolean> = {\n deemphasize: true,\n community: true,\n stream_only: true,\n samples_only: true,\n test_collection: true,\n printdisabled: true,\n 'openlibrary-ol': true,\n nationalemergencylibrary: true,\n china: true,\n americana: true,\n toronto: true,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MediaType } from '@internetarchive/field-parsers';\nimport {\n AggregationSortType,\n SearchResult,\n SortDirection,\n} from '@internetarchive/search-service';\nimport { collapseRepeatedQuotes } from './utils/collapse-repeated-quotes';\nimport { resolveMediatype } from './utils/resolve-mediatype';\n\n/**\n * Flags that can affect the visibility of content on a tile\n */\ninterface TileFlags {\n loginRequired: boolean;\n contentWarning: boolean;\n}\n\n/**\n * Class for converting & storing raw search results in the correct format for UI tiles.\n */\nexport class TileModel {\n averageRating?: number;\n\n captureDates?: Date[]; // List of capture dates for a URL, used on profile Web Archives tiles\n\n checked: boolean; // Whether this tile is currently checked for item management functions\n\n collectionIdentifier?: string;\n\n collectionName?: string;\n\n collectionFilesCount: number;\n\n collections: string[];\n\n collectionSize: number;\n\n commentCount: number;\n\n creator?: string;\n\n creators: string[];\n\n dateStr?: string; // A string representation of the publication date, used strictly for passing preformatted dates to the parent\n\n dateAdded?: Date; // Date added to public search (software-defined) [from: addeddate]\n\n dateArchived?: Date; // Date archived (software-defined) item created on archive.org [from: publicdate]\n\n datePublished?: Date; // Date work published in the world (user-defined) [from: date]\n\n dateReviewed?: Date; // Date reviewed (user-created) most recent review [from: reviewdate]\n\n description?: string;\n\n favCount: number;\n\n href?: string;\n\n identifier?: string;\n\n issue?: string;\n\n itemCount: number;\n\n mediatype: MediaType;\n\n source?: string;\n\n snippets?: string[];\n\n subjects: string[];\n\n title: string;\n\n viewCount?: number;\n\n volume?: string;\n\n weeklyViewCount?: number;\n\n loginRequired: boolean;\n\n contentWarning: boolean;\n\n constructor(result: SearchResult) {\n const flags = this.getFlags(result);\n\n this.averageRating = result.avg_rating?.value;\n this.captureDates = result.capture_dates?.values;\n this.checked = false;\n this.collections = result.collection?.values ?? [];\n this.collectionFilesCount = result.collection_files_count?.value ?? 0;\n this.collectionSize = result.collection_size?.value ?? 0;\n this.commentCount = result.num_reviews?.value ?? 0;\n this.creator = result.creator?.value;\n this.creators = result.creator?.values ?? [];\n this.dateAdded = result.addeddate?.value;\n this.dateArchived = result.publicdate?.value;\n this.datePublished = result.date?.value;\n this.dateReviewed = result.reviewdate?.value;\n this.description = result.description?.values.join('\\n');\n this.favCount = result.num_favorites?.value ?? 0;\n this.href = collapseRepeatedQuotes(result.__href__?.value);\n this.identifier = result.identifier;\n this.issue = result.issue?.value;\n this.itemCount = result.item_count?.value ?? 0;\n this.mediatype = resolveMediatype(result);\n this.snippets = result.highlight?.values ?? [];\n this.source = result.source?.value;\n this.subjects = result.subject?.values ?? [];\n this.title = result.title?.value ?? '';\n this.volume = result.volume?.value;\n this.viewCount = result.downloads?.value;\n this.weeklyViewCount = result.week?.value;\n this.loginRequired = flags.loginRequired;\n this.contentWarning = flags.contentWarning;\n }\n\n /**\n * Copies the contents of this TileModel onto a new instance\n */\n clone(): TileModel {\n const cloned = new TileModel({});\n cloned.averageRating = this.averageRating;\n cloned.captureDates = this.captureDates;\n cloned.checked = this.checked;\n cloned.collections = this.collections;\n cloned.collectionFilesCount = this.collectionFilesCount;\n cloned.collectionSize = this.collectionSize;\n cloned.commentCount = this.commentCount;\n cloned.creator = this.creator;\n cloned.creators = this.creators;\n cloned.dateStr = this.dateStr;\n cloned.dateAdded = this.dateAdded;\n cloned.dateArchived = this.dateArchived;\n cloned.datePublished = this.datePublished;\n cloned.dateReviewed = this.dateReviewed;\n cloned.description = this.description;\n cloned.favCount = this.favCount;\n cloned.href = this.href;\n cloned.identifier = this.identifier;\n cloned.issue = this.issue;\n cloned.itemCount = this.itemCount;\n cloned.mediatype = this.mediatype;\n cloned.snippets = this.snippets;\n cloned.source = this.source;\n cloned.subjects = this.subjects;\n cloned.title = this.title;\n cloned.volume = this.volume;\n cloned.viewCount = this.viewCount;\n cloned.weeklyViewCount = this.weeklyViewCount;\n cloned.loginRequired = this.loginRequired;\n cloned.contentWarning = this.contentWarning;\n return cloned;\n }\n\n /**\n * Determines the appropriate tile flags for the given search result\n * (login required and/or content warning)\n */\n private getFlags(result: SearchResult): TileFlags {\n const flags: TileFlags = {\n loginRequired: false,\n contentWarning: false,\n };\n\n // Check if item and item in \"modifying\" collection, setting above flags\n if (\n result.collection?.values.length &&\n result.mediatype?.value !== 'collection'\n ) {\n for (const collection of result.collection?.values ?? []) {\n if (collection === 'loggedin') {\n flags.loginRequired = true;\n if (flags.contentWarning) break;\n }\n if (collection === 'no-preview') {\n flags.contentWarning = true;\n if (flags.loginRequired) break;\n }\n }\n }\n\n return flags;\n }\n}\n\nexport type RequestKind = 'full' | 'hits' | 'aggregations';\n\nexport type CollectionDisplayMode = 'grid' | 'list-compact' | 'list-detail';\n\nexport type TileDisplayMode =\n | 'grid'\n | 'list-compact'\n | 'list-detail'\n | 'list-header';\n\n/**\n * This is mainly used to set the cookies for the collection display mode.\n *\n * It allows the user to set different modes for different contexts (collection page, search page, etc).\n */\nexport type CollectionBrowserContext = 'collection' | 'search';\n\n/**\n * The sort fields shown in the sort filter bar\n */\nexport enum SortField {\n 'default' = 'default',\n 'unrecognized' = 'unrecognized',\n 'relevance' = 'relevance',\n 'alltimeview' = 'alltimeview',\n 'weeklyview' = 'weeklyview',\n 'title' = 'title',\n 'date' = 'date',\n 'datearchived' = 'datearchived',\n 'datereviewed' = 'datereviewed',\n 'dateadded' = 'dateadded',\n 'datefavorited' = 'datefavorited',\n 'creator' = 'creator',\n}\n\nexport interface SortOption {\n /**\n * The SortField enum member corresponding to this option.\n */\n field: SortField;\n\n /**\n * The default sort direction to apply when this sort option is first selected.\n */\n defaultSortDirection: SortDirection | null;\n\n /**\n * Whether this sort option allows its sort direction to be changed from the default.\n */\n canSetDirection: boolean;\n\n /**\n * Whether this sort option may appear in the sort bar.\n */\n shownInSortBar: boolean;\n\n /**\n * Whether this sort option should be saved to the URL.\n * If false, then no `sort` param will be added to the URL when this sort option\n * is selected.\n */\n shownInURL: boolean;\n\n /**\n * Whether this sort option is passed to the search service.\n * If false, then no sort param will be passed to the search service at all when\n * this sort option is selected.\n */\n handledBySearchService: boolean;\n\n /**\n * The string identifying this sort field to the search service & backend API.\n */\n searchServiceKey?: string;\n\n /**\n * The human-readable name to use for this option in the sort bar (if applicable).\n */\n displayName: string;\n\n /**\n * A list of URL param keys that should be mapped to this sort option.\n * E.g., both `title` and `titleSorter` in the URL map to the `SortField.title` option.\n */\n urlNames: (string | null | undefined)[];\n}\n\nexport const SORT_OPTIONS: Record<SortField, SortOption> = {\n // Default sort is the case where the user has not specified a sort option via the sort bar or URL.\n // In these cases, we defer to whatever sort the backend chooses.\n // For the search page, the default is always relevance sort.\n // For collection pages _without a query_, the default is usually weekly views, but this can be\n // overridden by the collection's `sort-by` metadata entry. If a query _is_ specified, then the\n // default is again relevance sort.\n // For fav-* collections only, the default is instead sorting by date favorited.\n [SortField.default]: {\n field: SortField.default,\n defaultSortDirection: null,\n canSetDirection: false,\n shownInSortBar: false,\n shownInURL: false,\n handledBySearchService: false, // We rely on the PPS default sort handling in these cases\n displayName: '',\n urlNames: ['', null, undefined], // Empty or nullish sort params result in default sorting\n },\n // Unrecognized sort is the case where the user has specified a sort in the URL, but it is not\n // one of the options listed in this map. We still want these unrecognized sorts to be applied\n // when searching, but they are not displayed in the sort bar and we do not actively manage\n // their URL param beyond flipping the direction as needed.\n [SortField.unrecognized]: {\n field: SortField.unrecognized,\n defaultSortDirection: null,\n canSetDirection: true,\n shownInSortBar: false,\n shownInURL: false,\n handledBySearchService: true, // The unrecognized sort param is passed along as-is\n displayName: '',\n urlNames: [],\n },\n // Relevance sort is unique in that it does not produce a URL param when it is set.\n // It is only available when there is a user-specified query that relevancy can be scored against.\n // Therefore, it does not appear as a sort bar option when browsing a collection with no query set.\n [SortField.relevance]: {\n field: SortField.relevance,\n defaultSortDirection: null,\n canSetDirection: false,\n shownInSortBar: true,\n shownInURL: false,\n handledBySearchService: false,\n displayName: 'Relevance',\n urlNames: ['_score'],\n },\n [SortField.alltimeview]: {\n field: SortField.alltimeview,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'downloads',\n displayName: 'All-time views',\n urlNames: ['downloads'],\n },\n [SortField.weeklyview]: {\n field: SortField.weeklyview,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'week',\n displayName: 'Weekly views',\n urlNames: ['week'],\n },\n [SortField.title]: {\n field: SortField.title,\n defaultSortDirection: 'asc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'titleSorter',\n displayName: 'Title',\n urlNames: ['title', 'titleSorter'],\n },\n [SortField.date]: {\n field: SortField.date,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'date',\n displayName: 'Date published',\n urlNames: ['date'],\n },\n [SortField.datearchived]: {\n field: SortField.datearchived,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'publicdate',\n displayName: 'Date archived',\n urlNames: ['publicdate'],\n },\n [SortField.datereviewed]: {\n field: SortField.datereviewed,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'reviewdate',\n displayName: 'Date reviewed',\n urlNames: ['reviewdate'],\n },\n [SortField.dateadded]: {\n field: SortField.dateadded,\n defaultSortDirection: 'desc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'addeddate',\n displayName: 'Date added',\n urlNames: ['addeddate'],\n },\n [SortField.datefavorited]: {\n field: SortField.datefavorited,\n defaultSortDirection: 'desc',\n canSetDirection: false,\n shownInSortBar: true, // But only when viewing fav-* collections\n shownInURL: false,\n handledBySearchService: false,\n searchServiceKey: 'favoritedate',\n displayName: 'Date favorited',\n urlNames: ['favoritedate'],\n },\n [SortField.creator]: {\n field: SortField.creator,\n defaultSortDirection: 'asc',\n canSetDirection: true,\n shownInSortBar: true,\n shownInURL: true,\n handledBySearchService: true,\n searchServiceKey: 'creatorSorter',\n displayName: 'Creator',\n urlNames: ['creator', 'creatorSorter'],\n },\n};\n\n/**\n * Returns the SortOption corresponding to the given API sort name, or\n * the \"unrecognized\" SortOption if none matches.\n */\nexport function sortOptionFromAPIString(sortName?: string | null): SortOption {\n return (\n Object.values(SORT_OPTIONS).find(opt =>\n opt.urlNames.some(name => sortName === name)\n ) ?? SORT_OPTIONS[SortField.unrecognized]\n );\n}\n\nexport const defaultProfileElementSorts: Record<\n string,\n Exclude<SortField, SortField.default>\n> = {\n uploads: SortField.datearchived,\n reviews: SortField.datereviewed,\n collections: SortField.datearchived,\n web_archives: SortField.datearchived,\n};\n\n/** A union of the fields that permit prefix filtering (e.g., alphabetical filtering) */\nexport type PrefixFilterType = 'title' | 'creator';\n\n/** A map from prefixes (e.g., initial letters) to the number of items matching that prefix */\nexport type PrefixFilterCounts = Record<string, number>;\n\n/**\n * A map from prefix filter types to the corresponding aggregation keys\n * that are needed to fetch the filter counts from the backend.\n */\nexport const prefixFilterAggregationKeys: Record<PrefixFilterType, string> = {\n title: 'firstTitle',\n creator: 'firstCreator',\n};\n\n/**\n * Union of the facet types that are available in the sidebar.\n */\nexport type FacetOption =\n | 'subject'\n | 'lending'\n | 'mediatype'\n | 'language'\n | 'creator'\n | 'collection'\n | 'year';\n\nexport type SelectedFacetState = 'selected' | 'hidden';\n\nexport type FacetState = SelectedFacetState | 'none';\n\nexport interface FacetBucket {\n // for some facets, we augment the key with a display value\n displayText?: string;\n key: string;\n count: number;\n state: FacetState;\n}\n\nexport interface FacetGroup {\n title: string;\n key: FacetOption;\n buckets: FacetBucket[];\n}\n\n/**\n * Information about a user interaction event on a facet.\n */\nexport type FacetEventDetails = {\n /**\n * The type of facet that was interacted with (e.g., 'mediatype', 'language', ...).\n */\n facetType: FacetOption;\n /**\n * The bucket corresponding to the facet that was interacted with, including the\n * updated state of the facet after the interaction.\n */\n bucket: FacetBucket;\n /**\n * Whether the interaction occurred on a negative facet.\n */\n negative: boolean;\n};\n\nexport type FacetValue = string;\n\nexport type SelectedFacets = Record<\n FacetOption,\n Record<FacetValue, FacetBucket>\n>;\n\nexport const getDefaultSelectedFacets = (): SelectedFacets => ({\n subject: {},\n lending: {},\n mediatype: {},\n language: {},\n creator: {},\n collection: {},\n year: {},\n});\n\nexport const facetDisplayOrder: FacetOption[] = [\n 'mediatype',\n 'lending',\n 'year',\n 'subject',\n 'collection',\n 'creator',\n 'language',\n];\n\nexport const facetTitles: Record<FacetOption, string> = {\n subject: 'Subject',\n lending: 'Availability',\n mediatype: 'Media Type',\n language: 'Language',\n creator: 'Creator',\n collection: 'Collection',\n year: 'Year',\n};\n\n/**\n * The default sort type to use for each facet type\n */\nexport const defaultFacetSort: Record<FacetOption, AggregationSortType> = {\n subject: AggregationSortType.COUNT,\n lending: AggregationSortType.COUNT,\n mediatype: AggregationSortType.COUNT,\n language: AggregationSortType.COUNT,\n creator: AggregationSortType.COUNT,\n collection: AggregationSortType.COUNT,\n year: AggregationSortType.NUMERIC,\n};\n\n/**\n * The sort type corresponding to facet bucket values, for each facet type\n * (i.e., the opposite of \"sort by count\" for that type).\n */\nexport const valueFacetSort: Record<FacetOption, AggregationSortType> = {\n subject: AggregationSortType.ALPHABETICAL,\n lending: AggregationSortType.ALPHABETICAL,\n mediatype: AggregationSortType.ALPHABETICAL,\n language: AggregationSortType.ALPHABETICAL,\n creator: AggregationSortType.ALPHABETICAL,\n collection: AggregationSortType.ALPHABETICAL,\n year: AggregationSortType.NUMERIC,\n};\n\nexport type LendingFacetKey =\n | 'is_lendable'\n | 'is_borrowable'\n | 'available_to_borrow'\n | 'is_browsable'\n | 'available_to_browse'\n | 'is_readable'\n | 'available_to_waitlist';\n\n/**\n * Maps valid lending keys to whether they should be visible in the facet sidebar\n */\nexport const lendingFacetKeysVisibility: Record<LendingFacetKey, boolean> = {\n is_lendable: true,\n is_borrowable: false,\n available_to_borrow: true,\n is_browsable: false,\n available_to_browse: false,\n is_readable: true,\n available_to_waitlist: false,\n};\n\n/**\n * Maps valid, visible lending keys to their facet sidebar display text\n */\nexport const lendingFacetDisplayNames: Partial<\n Record<LendingFacetKey, string>\n> = {\n is_lendable: 'Lending Library',\n available_to_borrow: 'Borrow 14 Days',\n is_readable: 'Always Available',\n};\n\n/**\n * A record of which admin-only collections should be suppressed from being displayed\n * as facets or in an item's list of collections.\n */\nexport const suppressedCollections: Record<string, boolean> = {\n deemphasize: true,\n community: true,\n stream_only: true,\n samples_only: true,\n test_collection: true,\n printdisabled: true,\n 'openlibrary-ol': true,\n nationalemergencylibrary: true,\n china: true,\n americana: true,\n toronto: true,\n};\n"]}
|
package/package.json
CHANGED
|
@@ -17,7 +17,6 @@ import type {
|
|
|
17
17
|
InfiniteScrollerCellProviderInterface,
|
|
18
18
|
} from '@internetarchive/infinite-scroller';
|
|
19
19
|
import {
|
|
20
|
-
AccountExtraInfo,
|
|
21
20
|
CollectionExtraInfo,
|
|
22
21
|
PageElementName,
|
|
23
22
|
SearchServiceInterface,
|
|
@@ -1007,7 +1006,7 @@ export class CollectionBrowser
|
|
|
1007
1006
|
this.baseQuery = queryState.baseQuery;
|
|
1008
1007
|
this.profileElement = queryState.profileElement;
|
|
1009
1008
|
this.searchType = queryState.searchType;
|
|
1010
|
-
this.selectedFacets = queryState.selectedFacets;
|
|
1009
|
+
this.selectedFacets = queryState.selectedFacets ?? getDefaultSelectedFacets();
|
|
1011
1010
|
this.minSelectedDate = queryState.minSelectedDate;
|
|
1012
1011
|
this.maxSelectedDate = queryState.maxSelectedDate;
|
|
1013
1012
|
this.selectedSort = queryState.selectedSort ?? SortField.default;
|
|
@@ -919,12 +919,15 @@ export class CollectionBrowserDataSource
|
|
|
919
919
|
let sortParams = this.host.sortParam ? [this.host.sortParam] : [];
|
|
920
920
|
// TODO eventually the PPS should handle these defaults natively
|
|
921
921
|
if (this.host.withinProfile && this.host.defaultSortParam) {
|
|
922
|
-
const sortOption =
|
|
922
|
+
const sortOption =
|
|
923
|
+
SORT_OPTIONS[this.host.defaultSortParam.field as SortField];
|
|
923
924
|
if (sortOption.searchServiceKey) {
|
|
924
|
-
sortParams = [
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
925
|
+
sortParams = [
|
|
926
|
+
{
|
|
927
|
+
field: sortOption.searchServiceKey,
|
|
928
|
+
direction: 'desc',
|
|
929
|
+
},
|
|
930
|
+
];
|
|
928
931
|
}
|
|
929
932
|
}
|
|
930
933
|
|
package/src/models.ts
CHANGED
|
@@ -431,11 +431,14 @@ export function sortOptionFromAPIString(sortName?: string | null): SortOption {
|
|
|
431
431
|
);
|
|
432
432
|
}
|
|
433
433
|
|
|
434
|
-
export const defaultProfileElementSorts: Record<
|
|
434
|
+
export const defaultProfileElementSorts: Record<
|
|
435
|
+
string,
|
|
436
|
+
Exclude<SortField, SortField.default>
|
|
437
|
+
> = {
|
|
435
438
|
uploads: SortField.datearchived,
|
|
436
439
|
reviews: SortField.datereviewed,
|
|
437
440
|
collections: SortField.datearchived,
|
|
438
|
-
|
|
441
|
+
web_archives: SortField.datearchived,
|
|
439
442
|
};
|
|
440
443
|
|
|
441
444
|
/** A union of the fields that permit prefix filtering (e.g., alphabetical filtering) */
|