@internetarchive/collection-browser 0.4.14-alpha.6 → 0.4.14-alpha.7

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.
@@ -1265,7 +1265,7 @@ CollectionBrowser.styles = css `
1265
1265
 
1266
1266
  .mobile #right-column {
1267
1267
  border-left: none;
1268
- padding: 0;
1268
+ padding: 5px 5px 0;
1269
1269
  }
1270
1270
 
1271
1271
  #left-column {
@@ -1297,6 +1297,7 @@ CollectionBrowser.styles = css `
1297
1297
  #mobile-header-container {
1298
1298
  display: flex;
1299
1299
  justify-content: space-between;
1300
+ align-items: center;
1300
1301
  }
1301
1302
 
1302
1303
  #facets-container {
@@ -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';\n\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport type {\n InfiniteScroller,\n InfiniteScrollerCellProviderInterface,\n} from '@internetarchive/infinite-scroller';\nimport {\n Aggregation,\n Bucket,\n FilterConstraint,\n FilterMap,\n FilterMapBuilder,\n SearchParams,\n SearchResult,\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 { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\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 './collection-facets';\nimport './circular-activity-indicator';\nimport './sort-filter-bar/sort-filter-bar';\nimport {\n SelectedFacets,\n SortField,\n SortFieldToMetadataField,\n CollectionBrowserContext,\n getDefaultSelectedFacets,\n TileModel,\n CollectionDisplayMode,\n FacetBucket,\n PrefixFilterType,\n PrefixFilterCounts,\n prefixFilterAggregationKeys,\n FacetOption,\n} from './models';\nimport {\n RestorationStateHandlerInterface,\n RestorationStateHandler,\n RestorationState,\n} from './restoration-state-handler';\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';\n\n@customElement('collection-browser')\nexport class CollectionBrowser\n extends LitElement\n implements\n InfiniteScrollerCellProviderInterface,\n SharedResizeObserverResizeHandlerInterface\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 }) baseQuery?: string;\n\n @property({ type: String }) displayMode?: CollectionDisplayMode;\n\n @property({ type: Object }) sortParam: SortParam | null = null;\n\n @property({ type: String }) selectedSort: SortField = SortField.relevance;\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: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: String }) titleQuery?: string;\n\n @property({ type: String }) creatorQuery?: string;\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 /** describes where this component is being used */\n @property({ type: String, reflect: true }) searchContext: string =\n analyticsCategories.default;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\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 }) 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 /**\n * The page that the consumer wants to load.\n */\n private 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 @state() private searchResultsLoading = false;\n\n @state() private facetsLoading = false;\n\n @state() private fullYearAggregationLoading = false;\n\n @state() private aggregations?: Record<string, Aggregation>;\n\n @state() private fullYearsHistogramAggregation: Aggregation | undefined;\n\n @state() private totalResults?: number;\n\n @state() private queryErrorMessage?: string;\n\n @state() private mobileView = false;\n\n @state() private mobileFacetsVisible = false;\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 @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 we've reached the end of the data, stop trying to fetch more\n */\n private endOfDataReached = 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 placeholderCellTemplate = html`<collection-browser-loading-tile></collection-browser-loading-tile>`;\n\n private tileModelAtCellIndex(index: number): TileModel | undefined {\n const pageNumber = Math.floor(index / this.pageSize) + 1;\n const itemIndex = index % this.pageSize;\n const model = this.dataSource[pageNumber]?.[itemIndex];\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 may fetch pages for cells the\n * user may never see.\n */\n if (!model && !this.isScrollingToCell) {\n this.fetchPage(pageNumber);\n }\n return model;\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 // 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 * 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 private dataSource: Record<string, TileModel[]> = {};\n\n @query('infinite-scroller')\n private infiniteScroller!: InfiniteScroller;\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 * 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 this.titleQuery = undefined;\n this.creatorQuery = undefined;\n }\n\n if (sort) {\n this.sortParam = null;\n this.sortDirection = null;\n this.selectedSort = SortField.relevance;\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 * Manually requests to perform a search, which will only be executed if one of\n * the query, the search type, or the sort has changed.\n */\n requestSearch() {\n this.handleQueryChange();\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 this.placeholderType = null;\n if (!this.baseQuery) {\n this.placeholderType = 'empty-query';\n }\n\n if (\n (!this.searchResultsLoading && this.totalResults === 0) ||\n !this.searchService\n ) {\n this.placeholderType = 'null-result';\n }\n\n if (this.queryErrorMessage) {\n this.placeholderType = 'query-error';\n }\n }\n\n private get emptyPlaceholderTemplate() {\n return html`\n <empty-placeholder\n .placeholderType=${this.placeholderType}\n ?isMobileView=${this.mobileView}\n .detailMessage=${this.queryErrorMessage ?? ''}\n .baseNavigationUrl=${this.baseNavigationUrl}\n ></empty-placeholder>\n ${this.infiniteScrollerTemplate}\n `;\n }\n\n private get collectionBrowserTemplate() {\n const shouldShowSearching =\n this.searchResultsLoading || this.totalResults === undefined;\n const resultsCount = this.totalResults?.toLocaleString();\n const resultsLabel = this.totalResults === 1 ? 'Result' : 'Results';\n return html`<div\n id=\"left-column\"\n class=\"column${this.isResizeToMobile ? ' preload' : ''}\"\n >\n <div id=\"mobile-header-container\">\n ${this.mobileView ? this.mobileFacetsTemplate : nothing}\n <div id=\"results-total\">\n <span id=\"big-results-count\">\n ${shouldShowSearching ? html`Searching&hellip;` : resultsCount}\n </span>\n <span id=\"big-results-label\">\n ${shouldShowSearching ? nothing : resultsLabel}\n </span>\n </div>\n </div>\n <div\n id=\"facets-container\"\n class=${!this.mobileView || this.mobileFacetsVisible\n ? 'expanded'\n : ''}\n >\n ${this.facetsTemplate}\n </div>\n </div>\n <div id=\"right-column\" class=\"column\">\n ${this.sortFilterBarTemplate}\n ${this.displayMode === `list-compact`\n ? this.listHeaderTemplate\n : nothing}\n ${this.infiniteScrollerTemplate}\n </div>`;\n }\n\n private get infiniteScrollerTemplate() {\n return html`<infinite-scroller\n class=${this.infiniteScrollerClasses}\n itemCount=${this.placeholderType ? 0 : nothing}\n .cellProvider=${this}\n .placeholderCellTemplate=${this.placeholderCellTemplate}\n @scrollThresholdReached=${this.scrollThresholdReached}\n @visibleCellsChanged=${this.visibleCellsChanged}\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() {\n return html`\n <sort-filter-bar\n .selectedSort=${this.selectedSort}\n .sortDirection=${this.sortDirection}\n .displayMode=${this.displayMode}\n .selectedTitleFilter=${this.selectedTitleFilter}\n .selectedCreatorFilter=${this.selectedCreatorFilter}\n .prefixFilterCountMap=${this.prefixFilterCountMap}\n .resizeObserver=${this.resizeObserver}\n @sortChanged=${this.userChangedSort}\n @displayModeChanged=${this.displayModeChanged}\n @titleLetterChanged=${this.titleLetterSelected}\n @creatorLetterChanged=${this.creatorLetterSelected}\n >\n </sort-filter-bar>\n `;\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 if (this.selectedSort === 'relevance') {\n this.sortParam = null;\n return;\n }\n const sortField = SortFieldToMetadataField[this.selectedSort];\n if (!this.sortDirection) this.sortDirection = 'desc';\n\n if (!sortField) return;\n this.sortParam = { field: sortField, direction: this.sortDirection };\n\n // Lazy-load the alphabet counts for title/creator sort bar as needed\n this.updatePrefixFiltersForCurrentSort();\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 /** 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 private selectedTitleLetterChanged(): void {\n this.titleQuery = this.selectedTitleFilter\n ? `firstTitle:${this.selectedTitleFilter}`\n : undefined;\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 private selectedCreatorLetterChanged(): void {\n this.creatorQuery = this.selectedCreatorFilter\n ? `firstCreator:${this.selectedCreatorFilter}`\n : undefined;\n }\n\n private titleLetterSelected(\n e: CustomEvent<{ selectedLetter: string | null }>\n ): void {\n this.selectedCreatorFilter = null;\n this.selectedTitleFilter = e.detail.selectedLetter;\n this.selectedTitleLetterChanged();\n }\n\n private creatorLetterSelected(\n e: CustomEvent<{ selectedLetter: string | null }>\n ): void {\n this.selectedTitleFilter = null;\n this.selectedCreatorFilter = e.detail.selectedLetter;\n this.selectedCreatorLetterChanged();\n }\n\n private get mobileFacetsTemplate() {\n return html`\n <div id=\"mobile-filter-collapse\">\n <h1\n @click=${() => {\n this.isResizeToMobile = false;\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n }}\n @keyup=${() => {\n this.isResizeToMobile = false;\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n }}\n >\n <span class=\"collapser ${this.mobileFacetsVisible ? 'open' : ''}\">\n ${chevronIcon}\n </span>\n Filters\n </h1>\n </div>\n `;\n }\n\n private get facetsTemplate() {\n return html`\n <collection-facets\n @facetsChanged=${this.facetsChanged}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n .searchService=${this.searchService}\n .featureFeedbackService=${this.featureFeedbackService}\n .recaptchaManager=${this.recaptchaManager}\n .resizeObserver=${this.resizeObserver}\n .searchType=${this.searchType}\n .aggregations=${this.aggregations}\n .fullYearsHistogramAggregation=${this.fullYearsHistogramAggregation}\n .moreLinksVisible=${this.searchType !== SearchType.FULLTEXT}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .selectedFacets=${this.selectedFacets}\n .collectionNameCache=${this.collectionNameCache}\n .showHistogramDatePicker=${this.showHistogramDatePicker}\n .query=${this.filteredQuery}\n .filterMap=${this.filterMap}\n .modalManager=${this.modalManager}\n ?collapsableFacets=${this.mobileView}\n ?facetsLoading=${this.facetsLoading}\n ?fullYearAggregationLoading=${this.facetsLoading}\n .onFacetClick=${this.facetClickHandler}\n .analyticsHandler=${this.analyticsHandler}\n >\n </collection-facets>\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 .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 firstUpdated(): void {\n this.setupStateRestorationObserver();\n this.restoreState();\n }\n\n updated(changed: PropertyValues) {\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 (changed.has('baseQuery') || changed.has('searchType')) {\n // Unless this query/search type update is the 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) {\n // Only clear filters that haven't been simultaneously applied in this update\n this.clearFilters({\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('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 ) {\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 this.selectedTitleLetterChanged();\n }\n if (changed.has('selectedCreatorFilter')) {\n this.sendFilterByCreatorAnalytics(\n changed.get('selectedCreatorFilter') as string\n );\n this.selectedCreatorLetterChanged();\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('sortParam') ||\n changed.has('selectedFacets') ||\n changed.has('searchService')\n ) {\n this.handleQueryChange();\n }\n\n if (changed.has('pagesToRender')) {\n if (!this.endOfDataReached && this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\n }\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\n handleResize(entry: ResizeObserverEntry): void {\n const previousView = this.mobileView;\n if (entry.target === this.contentContainer) {\n this.mobileView = entry.contentRect.width < this.mobileBreakpoint;\n // If changing from desktop to mobile disable transition\n if (this.mobileView && !previousView) {\n this.isResizeToMobile = true;\n }\n }\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 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 private async handleQueryChange() {\n // only reset if the query has actually changed\n if (!this.searchService || this.pageFetchQueryKey === this.previousQueryKey)\n return;\n this.previousQueryKey = this.pageFetchQueryKey;\n\n this.dataSource = {};\n this.totalResults = undefined;\n this.aggregations = undefined;\n this.fullYearsHistogramAggregation = undefined;\n this.pageFetchesInProgress = {};\n this.endOfDataReached = false;\n this.pagesToRender = this.initialPageNumber;\n this.queryErrorMessage = undefined;\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 this.infiniteScroller?.reload();\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 await Promise.all([this.doInitialPageFetch(), this.fetchFacets()]);\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.relevance;\n this.sortDirection = restorationState.sortDirection ?? null;\n this.selectedTitleFilter = restorationState.selectedTitleFilter ?? null;\n this.selectedCreatorFilter = restorationState.selectedCreatorFilter ?? null;\n this.selectedFacets = restorationState.selectedFacets;\n 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 sortParam: this.sortParam ?? undefined,\n selectedSort: this.selectedSort,\n sortDirection: this.sortDirection ?? undefined,\n selectedFacets: this.selectedFacets ?? getDefaultSelectedFacets(),\n baseQuery: 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 async doInitialPageFetch() {\n this.searchResultsLoading = true;\n await this.fetchPage(this.initialPageNumber);\n this.searchResultsLoading = false;\n }\n\n private get filterMap(): FilterMap {\n const builder = new FilterMapBuilder();\n\n // Add the date range, if applicable\n if (this.minSelectedDate) {\n builder.addFilter(\n 'year',\n this.minSelectedDate,\n FilterConstraint.GREATER_OR_EQUAL\n );\n }\n if (this.maxSelectedDate) {\n builder.addFilter(\n 'year',\n this.maxSelectedDate,\n FilterConstraint.LESS_OR_EQUAL\n );\n }\n\n // Add any selected facets\n if (this.selectedFacets) {\n for (const [facetName, facetValues] of Object.entries(\n this.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 const filterMap = builder.build();\n return filterMap;\n }\n\n /** The base query joined with any title/creator letter filters */\n private get filteredQuery(): string | undefined {\n if (!this.baseQuery) return undefined;\n let filteredQuery = this.baseQuery;\n\n const { sortFilterQueries } = this;\n if (sortFilterQueries) {\n filteredQuery += ` AND ${sortFilterQueries}`;\n }\n\n return filteredQuery;\n }\n\n /** The full query, including year facets and date range clauses */\n private get fullQuery(): string | undefined {\n if (!this.baseQuery) return undefined;\n let fullQuery = this.baseQuery;\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;\n }\n\n /** The full query without any title/creator letter filters */\n private get fullQueryWithoutAlphaFilters(): string | undefined {\n if (!this.baseQuery) return undefined;\n let fullQuery = this.baseQuery;\n\n const { facetQuery, dateRangeQueryClause } = this;\n\n if (facetQuery) {\n fullQuery += ` AND ${facetQuery}`;\n }\n if (dateRangeQueryClause) {\n fullQuery += ` AND ${dateRangeQueryClause}`;\n }\n return fullQuery;\n }\n\n /**\n * Generates a query string for the given 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.selectedFacets) return undefined;\n const facetClauses = [];\n for (const [facetName, facetValues] of Object.entries(\n this.selectedFacets\n )) {\n facetClauses.push(this.buildFacetClause(facetName, facetValues));\n }\n return this.joinFacetClauses(facetClauses);\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 facetsChanged(e: CustomEvent<SelectedFacets>) {\n this.selectedFacets = e.detail;\n }\n\n facetClickHandler(\n name: FacetOption,\n facetSelected: boolean,\n negative: boolean\n ): void {\n if (negative) {\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: facetSelected\n ? analyticsActions.facetNegativeSelected\n : analyticsActions.facetNegativeDeselected,\n label: name,\n });\n } else {\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: facetSelected\n ? analyticsActions.facetSelected\n : analyticsActions.facetDeselected,\n label: name,\n });\n }\n }\n\n private async fetchFacets() {\n if (!this.filteredQuery) return;\n\n const params: SearchParams = {\n query: this.filteredQuery,\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\n this.facetsLoading = true;\n const results = await this.searchService?.search(params, this.searchType);\n this.facetsLoading = false;\n\n this.aggregations = results?.success?.response.aggregations;\n\n this.fullYearsHistogramAggregation =\n results?.success?.response?.aggregations?.year_histogram ??\n results?.success?.response?.aggregations?.['year-histogram']; // Temp fix until PPS FTS key is fixed to use underscore\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?.reload();\n resolve();\n }, 500);\n }, 0);\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 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 keep track of queries so we don't persist data that's\n * no longer relevant.\n */\n private get pageFetchQueryKey() {\n return `${this.fullQuery}-${this.searchType}-${this.sortParam?.field}-${this.sortParam?.direction}`;\n }\n\n // this maps the query to the pages being fetched for that query\n private pageFetchesInProgress: Record<string, Set<number>> = {};\n\n async fetchPage(pageNumber: number) {\n if (!this.filteredQuery) return;\n\n // if we already have data, don't fetch again\n if (this.dataSource[pageNumber]) return;\n\n if (this.endOfDataReached) return;\n\n // if a fetch is already in progress for this query and page, don't fetch again\n const { pageFetchQueryKey } = this;\n const pageFetches =\n this.pageFetchesInProgress[pageFetchQueryKey] ?? new Set();\n if (pageFetches.has(pageNumber)) return;\n pageFetches.add(pageNumber);\n this.pageFetchesInProgress[pageFetchQueryKey] = pageFetches;\n\n const sortParams = this.sortParam ? [this.sortParam] : [];\n const params: SearchParams = {\n query: this.filteredQuery,\n page: pageNumber,\n rows: this.pageSize,\n sort: sortParams,\n filters: this.filterMap,\n aggregations: { omit: true },\n };\n const searchResponse = await this.searchService?.search(\n params,\n this.searchType\n );\n const success = searchResponse?.success;\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 return;\n }\n\n this.totalResults = success.response.totalResults;\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 the data since there should be a new query\n // right behind it\n const searchQuery = success.request.clientParameters.user_query;\n const searchSort = success.request.clientParameters.sort;\n let sortChanged = false;\n if (!searchSort || searchSort.length === 0) {\n // if we went from no sort to sort, the sort has changed\n if (this.sortParam) {\n sortChanged = true;\n }\n } else {\n // check if the sort has changed\n for (const sortType of searchSort) {\n const [field, direction] = sortType.split(':');\n if (\n field !== this.sortParam?.field ||\n direction !== this.sortParam?.direction\n ) {\n sortChanged = true;\n break;\n }\n }\n }\n const queryChangedSinceFetch =\n searchQuery !== this.filteredQuery || sortChanged;\n if (queryChangedSinceFetch) return;\n\n const { results } = success.response;\n if (results && results.length > 0) {\n this.preloadCollectionNames(results);\n this.updateDataSource(pageNumber, results);\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 if (results.length < this.pageSize) {\n this.endOfDataReached = true;\n if (this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.totalResults;\n }\n }\n this.pageFetchesInProgress[pageFetchQueryKey]?.delete(pageNumber);\n this.searchResultsLoading = false;\n }\n\n private preloadCollectionNames(results: SearchResult[]) {\n const collectionIds = results\n .map(result => result.collection?.values)\n .flat();\n const collectionIdsArray = Array.from(new Set(collectionIds)) as string[];\n this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);\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 private 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 * Update the datasource from the fetch response\n *\n * @param pageNumber\n * @param results\n */\n private updateDataSource(pageNumber: number, results: SearchResult[]) {\n // copy our existing datasource so when we set it below, it gets set\n // instead of modifying the existing dataSource since object changes\n // don't trigger a re-render\n const datasource = { ...this.dataSource };\n const tiles: TileModel[] = [];\n results?.forEach(result => {\n if (!result.identifier) return;\n\n let loginRequired = false;\n let contentWarning = false;\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 loginRequired = true;\n if (contentWarning) break;\n }\n if (collection === 'no-preview') {\n contentWarning = true;\n if (loginRequired) break;\n }\n }\n }\n\n tiles.push({\n averageRating: result.avg_rating?.value,\n collections: result.collection?.values ?? [],\n collectionFilesCount: result.collection_files_count?.value ?? 0,\n collectionSize: result.collection_size?.value ?? 0,\n commentCount: result.num_reviews?.value ?? 0,\n creator: result.creator?.value,\n creators: result.creator?.values ?? [],\n dateAdded: result.addeddate?.value,\n dateArchived: result.publicdate?.value,\n datePublished: result.date?.value,\n dateReviewed: result.reviewdate?.value,\n description: result.description?.values.join('\\n'),\n favCount: result.num_favorites?.value ?? 0,\n href: result.__href__?.value,\n identifier: result.identifier,\n issue: result.issue?.value,\n itemCount: result.item_count?.value ?? 0,\n mediatype: result.mediatype?.value ?? 'data',\n snippets: result.highlight?.values ?? [],\n source: result.source?.value,\n subjects: result.subject?.values ?? [],\n title: result.title?.value ?? '',\n volume: result.volume?.value,\n viewCount: result.downloads?.value ?? 0,\n weeklyViewCount: result.week?.value,\n loginRequired,\n contentWarning,\n });\n });\n datasource[pageNumber] = tiles;\n this.dataSource = datasource;\n const visiblePages = this.currentVisiblePageNumbers;\n const needsReload = visiblePages.includes(pageNumber);\n if (needsReload) {\n this.infiniteScroller?.reload();\n }\n }\n\n /** Fetches the aggregation buckets for the given prefix filter type. */\n private async fetchPrefixFilterBuckets(\n filterType: PrefixFilterType\n ): Promise<Bucket[]> {\n if (!this.fullQueryWithoutAlphaFilters) return [];\n\n const filterAggregationKey = prefixFilterAggregationKeys[filterType];\n const params: SearchParams = {\n query: this.fullQueryWithoutAlphaFilters,\n rows: 0,\n // Only fetch the firstTitle or firstCreator aggregation\n aggregations: { simpleParams: [filterAggregationKey] },\n // Fetch all 26 letter buckets\n aggregationsSize: 26,\n };\n\n const searchResponse = await this.searchService?.search(\n params,\n this.searchType\n );\n\n return (searchResponse?.success?.response?.aggregations?.[\n filterAggregationKey\n ]?.buckets ?? []) as Bucket[];\n }\n\n /** Fetches and caches the prefix filter counts for the given filter type. */\n private async updatePrefixFilterCounts(\n filterType: PrefixFilterType\n ): Promise<void> {\n const buckets = await this.fetchPrefixFilterBuckets(filterType);\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\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.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 this.prefixFilterCountMap = {};\n this.updatePrefixFiltersForCurrentSort();\n }\n\n /**\n * Callback when a result is selected\n */\n resultSelected(event: CustomEvent<TileModel>): void {\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 .baseNavigationUrl=${this.baseNavigationUrl}\n .baseImageUrl=${this.baseImageUrl}\n .model=${model}\n .tileDisplayMode=${this.displayMode}\n .resizeObserver=${this.resizeObserver}\n .collectionNameCache=${this.collectionNameCache}\n .sortParam=${this.sortParam}\n .mobileBreakpoint=${this.mobileBreakpoint}\n .loggedIn=${this.loggedIn}\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.endOfDataReached) {\n this.pagesToRender += 1;\n this.fetchPage(this.pagesToRender);\n }\n }\n\n static styles = css`\n :host {\n display: block;\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 .collapser {\n display: inline-block;\n }\n\n .collapser svg {\n width: 10px;\n height: 10px;\n transition: transform 0.2s ease-out;\n }\n\n .collapser.open svg {\n transform: rotate(90deg);\n }\n\n #mobile-filter-collapse h1 {\n cursor: pointer;\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 background: #fff;\n }\n\n .mobile #right-column {\n border-left: none;\n padding: 0;\n }\n\n #left-column {\n width: 18rem;\n min-width: 18rem; /* Prevents Safari from shrinking col at first draw */\n padding-right: 12px;\n padding-right: 2.5rem;\n z-index: 1;\n }\n\n .desktop #left-column::-webkit-scrollbar {\n display: none;\n }\n\n .mobile #left-column {\n width: 100%;\n padding: 0;\n }\n\n .desktop #left-column {\n top: 0;\n position: sticky;\n max-height: 100vh;\n overflow: scroll;\n -ms-overflow-style: none; /* hide scrollbar IE and Edge */\n scrollbar-width: none; /* hide scrollbar Firefox */\n }\n\n #mobile-header-container {\n display: flex;\n justify-content: space-between;\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 padding-bottom: 2rem;\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 margin-bottom: 5rem;\n }\n\n .mobile #results-total {\n margin-bottom: 0;\n }\n\n #big-results-count {\n font-size: 2.4rem;\n font-weight: 500;\n margin-right: 5px;\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: 34px; /* override infinite scroller component */\n --infiniteScrollerCellMaxHeight: 56px;\n --infiniteScrollerRowGap: 0px;\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(--collectionBrowserCellMaxWidth, 1fr);\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"]}
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';\n\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport type {\n InfiniteScroller,\n InfiniteScrollerCellProviderInterface,\n} from '@internetarchive/infinite-scroller';\nimport {\n Aggregation,\n Bucket,\n FilterConstraint,\n FilterMap,\n FilterMapBuilder,\n SearchParams,\n SearchResult,\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 { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\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 './collection-facets';\nimport './circular-activity-indicator';\nimport './sort-filter-bar/sort-filter-bar';\nimport {\n SelectedFacets,\n SortField,\n SortFieldToMetadataField,\n CollectionBrowserContext,\n getDefaultSelectedFacets,\n TileModel,\n CollectionDisplayMode,\n FacetBucket,\n PrefixFilterType,\n PrefixFilterCounts,\n prefixFilterAggregationKeys,\n FacetOption,\n} from './models';\nimport {\n RestorationStateHandlerInterface,\n RestorationStateHandler,\n RestorationState,\n} from './restoration-state-handler';\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';\n\n@customElement('collection-browser')\nexport class CollectionBrowser\n extends LitElement\n implements\n InfiniteScrollerCellProviderInterface,\n SharedResizeObserverResizeHandlerInterface\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 }) baseQuery?: string;\n\n @property({ type: String }) displayMode?: CollectionDisplayMode;\n\n @property({ type: Object }) sortParam: SortParam | null = null;\n\n @property({ type: String }) selectedSort: SortField = SortField.relevance;\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: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: String }) titleQuery?: string;\n\n @property({ type: String }) creatorQuery?: string;\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 /** describes where this component is being used */\n @property({ type: String, reflect: true }) searchContext: string =\n analyticsCategories.default;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\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 }) 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 /**\n * The page that the consumer wants to load.\n */\n private 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 @state() private searchResultsLoading = false;\n\n @state() private facetsLoading = false;\n\n @state() private fullYearAggregationLoading = false;\n\n @state() private aggregations?: Record<string, Aggregation>;\n\n @state() private fullYearsHistogramAggregation: Aggregation | undefined;\n\n @state() private totalResults?: number;\n\n @state() private queryErrorMessage?: string;\n\n @state() private mobileView = false;\n\n @state() private mobileFacetsVisible = false;\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 @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 we've reached the end of the data, stop trying to fetch more\n */\n private endOfDataReached = 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 placeholderCellTemplate = html`<collection-browser-loading-tile></collection-browser-loading-tile>`;\n\n private tileModelAtCellIndex(index: number): TileModel | undefined {\n const pageNumber = Math.floor(index / this.pageSize) + 1;\n const itemIndex = index % this.pageSize;\n const model = this.dataSource[pageNumber]?.[itemIndex];\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 may fetch pages for cells the\n * user may never see.\n */\n if (!model && !this.isScrollingToCell) {\n this.fetchPage(pageNumber);\n }\n return model;\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 // 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 * 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 private dataSource: Record<string, TileModel[]> = {};\n\n @query('infinite-scroller')\n private infiniteScroller!: InfiniteScroller;\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 * 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 this.titleQuery = undefined;\n this.creatorQuery = undefined;\n }\n\n if (sort) {\n this.sortParam = null;\n this.sortDirection = null;\n this.selectedSort = SortField.relevance;\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 * Manually requests to perform a search, which will only be executed if one of\n * the query, the search type, or the sort has changed.\n */\n requestSearch() {\n this.handleQueryChange();\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 this.placeholderType = null;\n if (!this.baseQuery) {\n this.placeholderType = 'empty-query';\n }\n\n if (\n (!this.searchResultsLoading && this.totalResults === 0) ||\n !this.searchService\n ) {\n this.placeholderType = 'null-result';\n }\n\n if (this.queryErrorMessage) {\n this.placeholderType = 'query-error';\n }\n }\n\n private get emptyPlaceholderTemplate() {\n return html`\n <empty-placeholder\n .placeholderType=${this.placeholderType}\n ?isMobileView=${this.mobileView}\n .detailMessage=${this.queryErrorMessage ?? ''}\n .baseNavigationUrl=${this.baseNavigationUrl}\n ></empty-placeholder>\n ${this.infiniteScrollerTemplate}\n `;\n }\n\n private get collectionBrowserTemplate() {\n const shouldShowSearching =\n this.searchResultsLoading || this.totalResults === undefined;\n const resultsCount = this.totalResults?.toLocaleString();\n const resultsLabel = this.totalResults === 1 ? 'Result' : 'Results';\n return html`<div\n id=\"left-column\"\n class=\"column${this.isResizeToMobile ? ' preload' : ''}\"\n >\n <div id=\"mobile-header-container\">\n ${this.mobileView ? this.mobileFacetsTemplate : nothing}\n <div id=\"results-total\">\n <span id=\"big-results-count\">\n ${shouldShowSearching ? html`Searching&hellip;` : resultsCount}\n </span>\n <span id=\"big-results-label\">\n ${shouldShowSearching ? nothing : resultsLabel}\n </span>\n </div>\n </div>\n <div\n id=\"facets-container\"\n class=${!this.mobileView || this.mobileFacetsVisible\n ? 'expanded'\n : ''}\n >\n ${this.facetsTemplate}\n </div>\n </div>\n <div id=\"right-column\" class=\"column\">\n ${this.sortFilterBarTemplate}\n ${this.displayMode === `list-compact`\n ? this.listHeaderTemplate\n : nothing}\n ${this.infiniteScrollerTemplate}\n </div>`;\n }\n\n private get infiniteScrollerTemplate() {\n return html`<infinite-scroller\n class=${this.infiniteScrollerClasses}\n itemCount=${this.placeholderType ? 0 : nothing}\n .cellProvider=${this}\n .placeholderCellTemplate=${this.placeholderCellTemplate}\n @scrollThresholdReached=${this.scrollThresholdReached}\n @visibleCellsChanged=${this.visibleCellsChanged}\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() {\n return html`\n <sort-filter-bar\n .selectedSort=${this.selectedSort}\n .sortDirection=${this.sortDirection}\n .displayMode=${this.displayMode}\n .selectedTitleFilter=${this.selectedTitleFilter}\n .selectedCreatorFilter=${this.selectedCreatorFilter}\n .prefixFilterCountMap=${this.prefixFilterCountMap}\n .resizeObserver=${this.resizeObserver}\n @sortChanged=${this.userChangedSort}\n @displayModeChanged=${this.displayModeChanged}\n @titleLetterChanged=${this.titleLetterSelected}\n @creatorLetterChanged=${this.creatorLetterSelected}\n >\n </sort-filter-bar>\n `;\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 if (this.selectedSort === 'relevance') {\n this.sortParam = null;\n return;\n }\n const sortField = SortFieldToMetadataField[this.selectedSort];\n if (!this.sortDirection) this.sortDirection = 'desc';\n\n if (!sortField) return;\n this.sortParam = { field: sortField, direction: this.sortDirection };\n\n // Lazy-load the alphabet counts for title/creator sort bar as needed\n this.updatePrefixFiltersForCurrentSort();\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 /** 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 private selectedTitleLetterChanged(): void {\n this.titleQuery = this.selectedTitleFilter\n ? `firstTitle:${this.selectedTitleFilter}`\n : undefined;\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 private selectedCreatorLetterChanged(): void {\n this.creatorQuery = this.selectedCreatorFilter\n ? `firstCreator:${this.selectedCreatorFilter}`\n : undefined;\n }\n\n private titleLetterSelected(\n e: CustomEvent<{ selectedLetter: string | null }>\n ): void {\n this.selectedCreatorFilter = null;\n this.selectedTitleFilter = e.detail.selectedLetter;\n this.selectedTitleLetterChanged();\n }\n\n private creatorLetterSelected(\n e: CustomEvent<{ selectedLetter: string | null }>\n ): void {\n this.selectedTitleFilter = null;\n this.selectedCreatorFilter = e.detail.selectedLetter;\n this.selectedCreatorLetterChanged();\n }\n\n private get mobileFacetsTemplate() {\n return html`\n <div id=\"mobile-filter-collapse\">\n <h1\n @click=${() => {\n this.isResizeToMobile = false;\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n }}\n @keyup=${() => {\n this.isResizeToMobile = false;\n this.mobileFacetsVisible = !this.mobileFacetsVisible;\n }}\n >\n <span class=\"collapser ${this.mobileFacetsVisible ? 'open' : ''}\">\n ${chevronIcon}\n </span>\n Filters\n </h1>\n </div>\n `;\n }\n\n private get facetsTemplate() {\n return html`\n <collection-facets\n @facetsChanged=${this.facetsChanged}\n @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}\n .searchService=${this.searchService}\n .featureFeedbackService=${this.featureFeedbackService}\n .recaptchaManager=${this.recaptchaManager}\n .resizeObserver=${this.resizeObserver}\n .searchType=${this.searchType}\n .aggregations=${this.aggregations}\n .fullYearsHistogramAggregation=${this.fullYearsHistogramAggregation}\n .moreLinksVisible=${this.searchType !== SearchType.FULLTEXT}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .selectedFacets=${this.selectedFacets}\n .collectionNameCache=${this.collectionNameCache}\n .showHistogramDatePicker=${this.showHistogramDatePicker}\n .query=${this.filteredQuery}\n .filterMap=${this.filterMap}\n .modalManager=${this.modalManager}\n ?collapsableFacets=${this.mobileView}\n ?facetsLoading=${this.facetsLoading}\n ?fullYearAggregationLoading=${this.facetsLoading}\n .onFacetClick=${this.facetClickHandler}\n .analyticsHandler=${this.analyticsHandler}\n >\n </collection-facets>\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 .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 firstUpdated(): void {\n this.setupStateRestorationObserver();\n this.restoreState();\n }\n\n updated(changed: PropertyValues) {\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 (changed.has('baseQuery') || changed.has('searchType')) {\n // Unless this query/search type update is the 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) {\n // Only clear filters that haven't been simultaneously applied in this update\n this.clearFilters({\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('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 ) {\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 this.selectedTitleLetterChanged();\n }\n if (changed.has('selectedCreatorFilter')) {\n this.sendFilterByCreatorAnalytics(\n changed.get('selectedCreatorFilter') as string\n );\n this.selectedCreatorLetterChanged();\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('sortParam') ||\n changed.has('selectedFacets') ||\n changed.has('searchService')\n ) {\n this.handleQueryChange();\n }\n\n if (changed.has('pagesToRender')) {\n if (!this.endOfDataReached && this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\n }\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\n handleResize(entry: ResizeObserverEntry): void {\n const previousView = this.mobileView;\n if (entry.target === this.contentContainer) {\n this.mobileView = entry.contentRect.width < this.mobileBreakpoint;\n // If changing from desktop to mobile disable transition\n if (this.mobileView && !previousView) {\n this.isResizeToMobile = true;\n }\n }\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 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 private async handleQueryChange() {\n // only reset if the query has actually changed\n if (!this.searchService || this.pageFetchQueryKey === this.previousQueryKey)\n return;\n this.previousQueryKey = this.pageFetchQueryKey;\n\n this.dataSource = {};\n this.totalResults = undefined;\n this.aggregations = undefined;\n this.fullYearsHistogramAggregation = undefined;\n this.pageFetchesInProgress = {};\n this.endOfDataReached = false;\n this.pagesToRender = this.initialPageNumber;\n this.queryErrorMessage = undefined;\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 this.infiniteScroller?.reload();\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 await Promise.all([this.doInitialPageFetch(), this.fetchFacets()]);\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.relevance;\n this.sortDirection = restorationState.sortDirection ?? null;\n this.selectedTitleFilter = restorationState.selectedTitleFilter ?? null;\n this.selectedCreatorFilter = restorationState.selectedCreatorFilter ?? null;\n this.selectedFacets = restorationState.selectedFacets;\n 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 sortParam: this.sortParam ?? undefined,\n selectedSort: this.selectedSort,\n sortDirection: this.sortDirection ?? undefined,\n selectedFacets: this.selectedFacets ?? getDefaultSelectedFacets(),\n baseQuery: 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 async doInitialPageFetch() {\n this.searchResultsLoading = true;\n await this.fetchPage(this.initialPageNumber);\n this.searchResultsLoading = false;\n }\n\n private get filterMap(): FilterMap {\n const builder = new FilterMapBuilder();\n\n // Add the date range, if applicable\n if (this.minSelectedDate) {\n builder.addFilter(\n 'year',\n this.minSelectedDate,\n FilterConstraint.GREATER_OR_EQUAL\n );\n }\n if (this.maxSelectedDate) {\n builder.addFilter(\n 'year',\n this.maxSelectedDate,\n FilterConstraint.LESS_OR_EQUAL\n );\n }\n\n // Add any selected facets\n if (this.selectedFacets) {\n for (const [facetName, facetValues] of Object.entries(\n this.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 const filterMap = builder.build();\n return filterMap;\n }\n\n /** The base query joined with any title/creator letter filters */\n private get filteredQuery(): string | undefined {\n if (!this.baseQuery) return undefined;\n let filteredQuery = this.baseQuery;\n\n const { sortFilterQueries } = this;\n if (sortFilterQueries) {\n filteredQuery += ` AND ${sortFilterQueries}`;\n }\n\n return filteredQuery;\n }\n\n /** The full query, including year facets and date range clauses */\n private get fullQuery(): string | undefined {\n if (!this.baseQuery) return undefined;\n let fullQuery = this.baseQuery;\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;\n }\n\n /** The full query without any title/creator letter filters */\n private get fullQueryWithoutAlphaFilters(): string | undefined {\n if (!this.baseQuery) return undefined;\n let fullQuery = this.baseQuery;\n\n const { facetQuery, dateRangeQueryClause } = this;\n\n if (facetQuery) {\n fullQuery += ` AND ${facetQuery}`;\n }\n if (dateRangeQueryClause) {\n fullQuery += ` AND ${dateRangeQueryClause}`;\n }\n return fullQuery;\n }\n\n /**\n * Generates a query string for the given 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.selectedFacets) return undefined;\n const facetClauses = [];\n for (const [facetName, facetValues] of Object.entries(\n this.selectedFacets\n )) {\n facetClauses.push(this.buildFacetClause(facetName, facetValues));\n }\n return this.joinFacetClauses(facetClauses);\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 facetsChanged(e: CustomEvent<SelectedFacets>) {\n this.selectedFacets = e.detail;\n }\n\n facetClickHandler(\n name: FacetOption,\n facetSelected: boolean,\n negative: boolean\n ): void {\n if (negative) {\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: facetSelected\n ? analyticsActions.facetNegativeSelected\n : analyticsActions.facetNegativeDeselected,\n label: name,\n });\n } else {\n this.analyticsHandler?.sendEvent({\n category: this.searchContext,\n action: facetSelected\n ? analyticsActions.facetSelected\n : analyticsActions.facetDeselected,\n label: name,\n });\n }\n }\n\n private async fetchFacets() {\n if (!this.filteredQuery) return;\n\n const params: SearchParams = {\n query: this.filteredQuery,\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\n this.facetsLoading = true;\n const results = await this.searchService?.search(params, this.searchType);\n this.facetsLoading = false;\n\n this.aggregations = results?.success?.response.aggregations;\n\n this.fullYearsHistogramAggregation =\n results?.success?.response?.aggregations?.year_histogram ??\n results?.success?.response?.aggregations?.['year-histogram']; // Temp fix until PPS FTS key is fixed to use underscore\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?.reload();\n resolve();\n }, 500);\n }, 0);\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 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 keep track of queries so we don't persist data that's\n * no longer relevant.\n */\n private get pageFetchQueryKey() {\n return `${this.fullQuery}-${this.searchType}-${this.sortParam?.field}-${this.sortParam?.direction}`;\n }\n\n // this maps the query to the pages being fetched for that query\n private pageFetchesInProgress: Record<string, Set<number>> = {};\n\n async fetchPage(pageNumber: number) {\n if (!this.filteredQuery) return;\n\n // if we already have data, don't fetch again\n if (this.dataSource[pageNumber]) return;\n\n if (this.endOfDataReached) return;\n\n // if a fetch is already in progress for this query and page, don't fetch again\n const { pageFetchQueryKey } = this;\n const pageFetches =\n this.pageFetchesInProgress[pageFetchQueryKey] ?? new Set();\n if (pageFetches.has(pageNumber)) return;\n pageFetches.add(pageNumber);\n this.pageFetchesInProgress[pageFetchQueryKey] = pageFetches;\n\n const sortParams = this.sortParam ? [this.sortParam] : [];\n const params: SearchParams = {\n query: this.filteredQuery,\n page: pageNumber,\n rows: this.pageSize,\n sort: sortParams,\n filters: this.filterMap,\n aggregations: { omit: true },\n };\n const searchResponse = await this.searchService?.search(\n params,\n this.searchType\n );\n const success = searchResponse?.success;\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 return;\n }\n\n this.totalResults = success.response.totalResults;\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 the data since there should be a new query\n // right behind it\n const searchQuery = success.request.clientParameters.user_query;\n const searchSort = success.request.clientParameters.sort;\n let sortChanged = false;\n if (!searchSort || searchSort.length === 0) {\n // if we went from no sort to sort, the sort has changed\n if (this.sortParam) {\n sortChanged = true;\n }\n } else {\n // check if the sort has changed\n for (const sortType of searchSort) {\n const [field, direction] = sortType.split(':');\n if (\n field !== this.sortParam?.field ||\n direction !== this.sortParam?.direction\n ) {\n sortChanged = true;\n break;\n }\n }\n }\n const queryChangedSinceFetch =\n searchQuery !== this.filteredQuery || sortChanged;\n if (queryChangedSinceFetch) return;\n\n const { results } = success.response;\n if (results && results.length > 0) {\n this.preloadCollectionNames(results);\n this.updateDataSource(pageNumber, results);\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 if (results.length < this.pageSize) {\n this.endOfDataReached = true;\n if (this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.totalResults;\n }\n }\n this.pageFetchesInProgress[pageFetchQueryKey]?.delete(pageNumber);\n this.searchResultsLoading = false;\n }\n\n private preloadCollectionNames(results: SearchResult[]) {\n const collectionIds = results\n .map(result => result.collection?.values)\n .flat();\n const collectionIdsArray = Array.from(new Set(collectionIds)) as string[];\n this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);\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 private 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 * Update the datasource from the fetch response\n *\n * @param pageNumber\n * @param results\n */\n private updateDataSource(pageNumber: number, results: SearchResult[]) {\n // copy our existing datasource so when we set it below, it gets set\n // instead of modifying the existing dataSource since object changes\n // don't trigger a re-render\n const datasource = { ...this.dataSource };\n const tiles: TileModel[] = [];\n results?.forEach(result => {\n if (!result.identifier) return;\n\n let loginRequired = false;\n let contentWarning = false;\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 loginRequired = true;\n if (contentWarning) break;\n }\n if (collection === 'no-preview') {\n contentWarning = true;\n if (loginRequired) break;\n }\n }\n }\n\n tiles.push({\n averageRating: result.avg_rating?.value,\n collections: result.collection?.values ?? [],\n collectionFilesCount: result.collection_files_count?.value ?? 0,\n collectionSize: result.collection_size?.value ?? 0,\n commentCount: result.num_reviews?.value ?? 0,\n creator: result.creator?.value,\n creators: result.creator?.values ?? [],\n dateAdded: result.addeddate?.value,\n dateArchived: result.publicdate?.value,\n datePublished: result.date?.value,\n dateReviewed: result.reviewdate?.value,\n description: result.description?.values.join('\\n'),\n favCount: result.num_favorites?.value ?? 0,\n href: result.__href__?.value,\n identifier: result.identifier,\n issue: result.issue?.value,\n itemCount: result.item_count?.value ?? 0,\n mediatype: result.mediatype?.value ?? 'data',\n snippets: result.highlight?.values ?? [],\n source: result.source?.value,\n subjects: result.subject?.values ?? [],\n title: result.title?.value ?? '',\n volume: result.volume?.value,\n viewCount: result.downloads?.value ?? 0,\n weeklyViewCount: result.week?.value,\n loginRequired,\n contentWarning,\n });\n });\n datasource[pageNumber] = tiles;\n this.dataSource = datasource;\n const visiblePages = this.currentVisiblePageNumbers;\n const needsReload = visiblePages.includes(pageNumber);\n if (needsReload) {\n this.infiniteScroller?.reload();\n }\n }\n\n /** Fetches the aggregation buckets for the given prefix filter type. */\n private async fetchPrefixFilterBuckets(\n filterType: PrefixFilterType\n ): Promise<Bucket[]> {\n if (!this.fullQueryWithoutAlphaFilters) return [];\n\n const filterAggregationKey = prefixFilterAggregationKeys[filterType];\n const params: SearchParams = {\n query: this.fullQueryWithoutAlphaFilters,\n rows: 0,\n // Only fetch the firstTitle or firstCreator aggregation\n aggregations: { simpleParams: [filterAggregationKey] },\n // Fetch all 26 letter buckets\n aggregationsSize: 26,\n };\n\n const searchResponse = await this.searchService?.search(\n params,\n this.searchType\n );\n\n return (searchResponse?.success?.response?.aggregations?.[\n filterAggregationKey\n ]?.buckets ?? []) as Bucket[];\n }\n\n /** Fetches and caches the prefix filter counts for the given filter type. */\n private async updatePrefixFilterCounts(\n filterType: PrefixFilterType\n ): Promise<void> {\n const buckets = await this.fetchPrefixFilterBuckets(filterType);\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\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.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 this.prefixFilterCountMap = {};\n this.updatePrefixFiltersForCurrentSort();\n }\n\n /**\n * Callback when a result is selected\n */\n resultSelected(event: CustomEvent<TileModel>): void {\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 .baseNavigationUrl=${this.baseNavigationUrl}\n .baseImageUrl=${this.baseImageUrl}\n .model=${model}\n .tileDisplayMode=${this.displayMode}\n .resizeObserver=${this.resizeObserver}\n .collectionNameCache=${this.collectionNameCache}\n .sortParam=${this.sortParam}\n .mobileBreakpoint=${this.mobileBreakpoint}\n .loggedIn=${this.loggedIn}\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.endOfDataReached) {\n this.pagesToRender += 1;\n this.fetchPage(this.pagesToRender);\n }\n }\n\n static styles = css`\n :host {\n display: block;\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 .collapser {\n display: inline-block;\n }\n\n .collapser svg {\n width: 10px;\n height: 10px;\n transition: transform 0.2s ease-out;\n }\n\n .collapser.open svg {\n transform: rotate(90deg);\n }\n\n #mobile-filter-collapse h1 {\n cursor: pointer;\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 background: #fff;\n }\n\n .mobile #right-column {\n border-left: none;\n padding: 5px 5px 0;\n }\n\n #left-column {\n width: 18rem;\n min-width: 18rem; /* Prevents Safari from shrinking col at first draw */\n padding-right: 12px;\n padding-right: 2.5rem;\n z-index: 1;\n }\n\n .desktop #left-column::-webkit-scrollbar {\n display: none;\n }\n\n .mobile #left-column {\n width: 100%;\n padding: 0;\n }\n\n .desktop #left-column {\n top: 0;\n position: sticky;\n max-height: 100vh;\n overflow: scroll;\n -ms-overflow-style: none; /* hide scrollbar IE and Edge */\n scrollbar-width: none; /* hide scrollbar Firefox */\n }\n\n #mobile-header-container {\n display: flex;\n justify-content: space-between;\n align-items: center;\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 padding-bottom: 2rem;\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 margin-bottom: 5rem;\n }\n\n .mobile #results-total {\n margin-bottom: 0;\n }\n\n #big-results-count {\n font-size: 2.4rem;\n font-weight: 500;\n margin-right: 5px;\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: 34px; /* override infinite scroller component */\n --infiniteScrollerCellMaxHeight: 56px;\n --infiniteScrollerRowGap: 0px;\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(--collectionBrowserCellMaxWidth, 1fr);\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"]}
@@ -48,12 +48,18 @@ export class RestorationStateHandler {
48
48
  const url = new URL(window.location.href);
49
49
  const oldParams = new URLSearchParams(url.searchParams);
50
50
  const newParams = this.removeRecognizedParams(url.searchParams);
51
+ let replaceEmptySin = false;
51
52
  if (state.baseQuery) {
52
53
  newParams.set('query', state.baseQuery);
53
54
  }
54
55
  if (state.searchType === SearchType.FULLTEXT) {
55
56
  newParams.set('sin', 'TXT');
56
57
  }
58
+ if (oldParams.get('sin') === '') {
59
+ // Treat empty sin the same as no sin at all
60
+ oldParams.delete('sin');
61
+ replaceEmptySin = true;
62
+ }
57
63
  if (state.currentPage) {
58
64
  if (state.currentPage > 1) {
59
65
  newParams.set('page', state.currentPage.toString());
@@ -107,9 +113,13 @@ export class RestorationStateHandler {
107
113
  ]);
108
114
  if (nonQueryParamsMatch &&
109
115
  this.paramsMatch(oldParams, newParams, ['query'])) {
110
- // For page number, we want to replace the page state when it changes,
111
- // not push a new history entry. If it hasn't changed, then we're done.
112
- if (this.paramsMatch(oldParams, newParams, ['page'])) {
116
+ if (replaceEmptySin) {
117
+ // Get rid of any empty sin param
118
+ newParams.delete('sin');
119
+ }
120
+ else if (this.paramsMatch(oldParams, newParams, ['page'])) {
121
+ // For page number, we want to replace the page state when it changes,
122
+ // not push a new history entry. If it hasn't changed, then we're done.
113
123
  return;
114
124
  }
115
125
  historyMethod = 'replaceState';
@@ -1 +1 @@
1
- {"version":3,"file":"restoration-state-handler.js","sourceRoot":"","sources":["../../src/restoration-state-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,GAGX,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EASL,mBAAmB,EAEnB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAwBnD,MAAM,OAAO,uBAAuB;IAWlC,YAAY,OAA8C;QANlD,iBAAY,GAAG,cAAc,CAAC;QAE9B,qBAAgB,GAAG,EAAE,CAAC;QAEtB,eAAU,GAAG,GAAG,CAAC;QAGvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,KAAuB;QAClC,IAAI,KAAK,CAAC,WAAW;YAAE,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzE,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,mBAAmB;QACjB,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACxD,gBAAgB,CAAC,WAAW,GAAG,WAAW,CAAC;QAC3C,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEO,yBAAyB,CAAC,WAAkC;QAClE,MAAM,SAAS,GAAG,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7D,SAAS,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE;YAC3C,MAAM,EAAE,IAAI,CAAC,YAAY;YACzB,OAAO,EAAE,IAAI,CAAC,gBAAgB;YAC9B,IAAI,EAAE,IAAI,CAAC,UAAU;SACtB,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,WAAW,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,SAAS,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE;YACrD,MAAM,EAAE,IAAI,CAAC,YAAY;YACzB,OAAO,EAAE,IAAI,CAAC,gBAAgB;YAC9B,IAAI,EAAE,IAAI,CAAC,UAAU;SACtB,CAAC,CAAC;IACL,CAAC;IAEO,4BAA4B;QAClC,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACpE,IAAI,YAAY,KAAK,aAAa;YAAE,OAAO,aAAa,CAAC;QACzD,OAAO,cAAc,CAAC;IACxB,CAAC;IAEO,sBAAsB,CAAC,KAAuB;;QACpD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAEhE,IAAI,KAAK,CAAC,SAAS,EAAE;YACnB,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACzC;QAED,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC,QAAQ,EAAE;YAC5C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC7B;QAED,IAAI,KAAK,CAAC,WAAW,EAAE;YACrB,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE;gBACzB,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;aACrD;iBAAM;gBACL,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;aAC1B;SACF;QAED,IAAI,KAAK,CAAC,SAAS,EAAE;YACnB,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,iBAAiB,GACrB,uBAAuB,CAAC,KAAK,CAAC,SAAS,CAAC,KAA0B,CAAC,CAAC;YACtE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,iBAAiB,EAAE,CAAC,CAAC;SACxD;QAED,IAAI,KAAK,CAAC,cAAc,EAAE;YACxB,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CACnD,KAAK,CAAC,cAAc,CACrB,EAAE;gBACD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACjD,uCAAuC;gBACvC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACxC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,YAAY,EAAE;oBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC;oBACzC,MAAM,UAAU,GAAG,GAAG,SAAS,KAAK,GAAG,GAAG,CAAC;oBAC3C,IAAI,QAAQ,EAAE;wBACZ,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;qBACvC;yBAAM;wBACL,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;qBACvC;iBACF;aACF;SACF;QAED,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,EAAE;YAClD,SAAS,CAAC,MAAM,CACd,OAAO,EACP,SAAS,KAAK,CAAC,eAAe,OAAO,KAAK,CAAC,eAAe,GAAG,CAC9D,CAAC;SACH;QAED,IAAI,KAAK,CAAC,UAAU,EAAE;YACpB,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;SAC7C;QAED,IAAI,KAAK,CAAC,YAAY,EAAE;YACtB,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;SAC/C;QAED,8EAA8E;QAC9E,4DAA4D;QAC5D,gFAAgF;QAChF,mDAAmD;QACnD,IAAI,aAAa,GAAiC,WAAW,CAAC;QAC9D,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE;YACjE,KAAK;YACL,MAAM;YACN,OAAO;YACP,OAAO;SACR,CAAC,CAAC;QAEH,IACE,mBAAmB;YACnB,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,EACjD;YACA,sEAAsE;YACtE,uEAAuE;YACvE,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE;gBACpD,OAAO;aACR;YACD,aAAa,GAAG,cAAc,CAAC;SAChC;aAAM,IAAI,mBAAmB,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;YAChE,2EAA2E;YAC3E,gCAAgC;YAChC,aAAa,GAAG,cAAc,CAAC;SAChC;QAED,MAAA,MAAA,MAAM,CAAC,OAAO,EAAC,aAAa,CAAC,mDAC3B;YACE,KAAK,EAAE,KAAK,CAAC,SAAS;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,IAAI,EAAE,KAAK,CAAC,WAAW;YACvB,IAAI,EAAE,KAAK,CAAC,SAAS;YACrB,OAAO,EAAE,KAAK,CAAC,eAAe;YAC9B,OAAO,EAAE,KAAK,CAAC,eAAe;YAC9B,MAAM,EAAE,KAAK,CAAC,cAAc;SAC7B,EACD,EAAE,EACF,GAAG,CACJ,CAAC;IACJ,CAAC;IAEO,qBAAqB;;QAC3B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnD,kFAAkF;QAClF,8EAA8E;QAC9E,iFAAiF;QACjF,eAAe;QACf,MAAM,iBAAiB,GACrB,MAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAqB;YACzC,cAAc,EAAE,wBAAwB,EAAE;SAC3C,CAAC;QAEF,IAAI,WAAW,EAAE;YACf,gBAAgB,CAAC,SAAS,GAAG,WAAW,CAAC;SAC1C;aAAM,IAAI,iBAAiB,EAAE;YAC5B,gBAAgB,CAAC,SAAS,GAAG,iBAAiB,CAAC;SAChD;QAED,IAAI,YAAY,EAAE;YAChB,gBAAgB,CAAC,UAAU;gBACzB,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;SACtE;QAED,IAAI,UAAU,EAAE;YACd,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACxC,gBAAgB,CAAC,WAAW,GAAG,MAAM,CAAC;SACvC;aAAM;YACL,gBAAgB,CAAC,WAAW,GAAG,CAAC,CAAC;SAClC;QAED,IAAI,SAAS,EAAE;YACb,gEAAgE;YAChE,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,QAAQ,EAAE;gBACZ,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAChD,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAqB,CAAC,CAAC;gBAEjE,IAAI,aAAa,EAAE;oBACjB,gBAAgB,CAAC,YAAY,GAAG,aAAa,CAAC;iBAC/C;gBACD,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE;oBAC/C,gBAAgB,CAAC,aAAa,GAAG,SAA0B,CAAC;iBAC7D;aACF;iBAAM;gBACL,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;oBACrC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;oBACpB,CAAC,CAAC,SAAS,CAAC;gBAEd,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAqB,CAAC,CAAC;gBACjE,IAAI,aAAa,EAAE;oBACjB,gBAAgB,CAAC,YAAY,GAAG,aAAa,CAAC;oBAC9C,gBAAgB,CAAC,aAAa,GAAG,SAA0B,CAAC;iBAC7D;aACF;SACF;QAED,IAAI,SAAS,EAAE;YACb,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACtB,wCAAwC;gBACxC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAEpC,kFAAkF;gBAClF,gFAAgF;gBAChF,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAErC,QAAQ,KAAK,EAAE;oBACb,KAAK,MAAM,CAAC,CAAC;wBACX,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBAC/C,mDAAmD;wBACnD,+DAA+D;wBAC/D,uEAAuE;wBACvE,+BAA+B;wBAC/B,IAAI,OAAO,IAAI,OAAO,EAAE;4BACtB,gBAAgB,CAAC,eAAe,GAAG,OAAO,CAAC,SAAS,CAClD,CAAC,EACD,OAAO,CAAC,MAAM,CACf,CAAC;4BACF,gBAAgB,CAAC,eAAe,GAAG,OAAO,CAAC,SAAS,CAClD,CAAC,EACD,OAAO,CAAC,MAAM,GAAG,CAAC,CACnB,CAAC;yBACH;6BAAM;4BACL,IAAI,CAAC,qBAAqB,CACxB,gBAAgB,CAAC,cAAc,EAC/B,KAAoB,EACpB,KAAK,EACL,UAAU,CACX,CAAC;yBACH;wBACD,MAAM;qBACP;oBACD,KAAK,YAAY;wBACf,gBAAgB,CAAC,mBAAmB,GAAG,KAAK,CAAC;wBAC7C,MAAM;oBACR,KAAK,cAAc;wBACjB,gBAAgB,CAAC,qBAAqB,GAAG,KAAK,CAAC;wBAC/C,MAAM;oBACR;wBACE,IAAI,CAAC,qBAAqB,CACxB,gBAAgB,CAAC,cAAc,EAC/B,KAAoB,EACpB,KAAK,EACL,UAAU,CACX,CAAC;iBACL;YACH,CAAC,CAAC,CAAC;SACJ;QAED,IAAI,SAAS,EAAE;YACb,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACtB,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,CAAC,qBAAqB,CACxB,gBAAgB,CAAC,cAAc,EAC/B,KAAoB,EACpB,KAAK,EACL,QAAQ,CACT,CAAC;YACJ,CAAC,CAAC,CAAC;SACJ;QAED,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,2DAA2D;IACnD,WAAW,CAAC,KAAa;QAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAChD,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SAC7C;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACK,WAAW,CACjB,aAA8B,EAC9B,aAA8B,EAC9B,IAAc;QAEd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CACtB,WAAW,CACT,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAChC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CACjC,CACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,sBAAsB,CAC5B,YAA6B;QAE7B,oCAAoC;QACpC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE7B,kFAAkF;QAClF,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE9B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,YAA6B;QAClD,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACK,qBAAqB,CAC3B,cAA8B,EAC9B,KAAkB,EAClB,KAAa,EACb,KAAiB;;QAEjB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,uCAAuC;QAE3D,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAA,KAAK,CAAC,aAAa,qCAAnB,KAAK,CAAC,aAAa,IAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAC;QACtD,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;IACrC,CAAC;IAED,iFAAiF;IACzE,gBAAgB,CAAC,GAAW;QAClC,OAAO;YACL,GAAG;YACH,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,MAAM;SACd,CAAC;IACJ,CAAC;CACF","sourcesContent":["import {\n SearchType,\n SortDirection,\n SortParam,\n} from '@internetarchive/search-service';\nimport { getCookie, setCookie } from 'typescript-cookie';\nimport {\n MetadataSortField,\n FacetOption,\n CollectionBrowserContext,\n CollectionDisplayMode,\n SelectedFacets,\n SortField,\n FacetBucket,\n FacetState,\n URLFieldToSortField,\n URLSortField,\n getDefaultSelectedFacets,\n MetadataFieldToURLField,\n} from './models';\nimport { arrayEquals } from './utils/array-equals';\n\nexport interface RestorationState {\n displayMode?: CollectionDisplayMode;\n searchType?: SearchType;\n sortParam?: SortParam;\n selectedSort?: SortField;\n sortDirection?: SortDirection;\n selectedFacets: SelectedFacets;\n baseQuery?: string;\n currentPage?: number;\n titleQuery?: string;\n creatorQuery?: string;\n minSelectedDate?: string;\n maxSelectedDate?: string;\n selectedTitleFilter?: string;\n selectedCreatorFilter?: string;\n}\n\nexport interface RestorationStateHandlerInterface {\n persistState(state: RestorationState): void;\n getRestorationState(): RestorationState;\n}\n\nexport class RestorationStateHandler\n implements RestorationStateHandlerInterface\n{\n private context: CollectionBrowserContext;\n\n private cookieDomain = '.archive.org';\n\n private cookieExpiration = 30;\n\n private cookiePath = '/';\n\n constructor(options: { context: CollectionBrowserContext }) {\n this.context = options.context;\n }\n\n persistState(state: RestorationState): void {\n if (state.displayMode) this.persistViewStateToCookies(state.displayMode);\n this.persistQueryStateToUrl(state);\n }\n\n getRestorationState(): RestorationState {\n const restorationState = this.loadQueryStateFromUrl();\n const displayMode = this.loadTileViewStateFromCookies();\n restorationState.displayMode = displayMode;\n return restorationState;\n }\n\n private persistViewStateToCookies(displayMode: CollectionDisplayMode) {\n const gridState = displayMode === 'grid' ? 'tiles' : 'lists';\n setCookie(`view-${this.context}`, gridState, {\n domain: this.cookieDomain,\n expires: this.cookieExpiration,\n path: this.cookiePath,\n });\n const detailsState = displayMode === 'list-detail' ? 'showdetails' : '';\n setCookie(`showdetails-${this.context}`, detailsState, {\n domain: this.cookieDomain,\n expires: this.cookieExpiration,\n path: this.cookiePath,\n });\n }\n\n private loadTileViewStateFromCookies(): CollectionDisplayMode {\n const viewState = getCookie(`view-${this.context}`);\n const detailsState = getCookie(`showdetails-${this.context}`);\n if (viewState === 'tiles' || viewState === undefined) return 'grid';\n if (detailsState === 'showdetails') return 'list-detail';\n return 'list-compact';\n }\n\n private persistQueryStateToUrl(state: RestorationState) {\n const url = new URL(window.location.href);\n const oldParams = new URLSearchParams(url.searchParams);\n const newParams = this.removeRecognizedParams(url.searchParams);\n\n if (state.baseQuery) {\n newParams.set('query', state.baseQuery);\n }\n\n if (state.searchType === SearchType.FULLTEXT) {\n newParams.set('sin', 'TXT');\n }\n\n if (state.currentPage) {\n if (state.currentPage > 1) {\n newParams.set('page', state.currentPage.toString());\n } else {\n newParams.delete('page');\n }\n }\n\n if (state.sortParam) {\n const prefix = state.sortParam.direction === 'desc' ? '-' : '';\n const readableSortField =\n MetadataFieldToURLField[state.sortParam.field as MetadataSortField];\n newParams.set('sort', `${prefix}${readableSortField}`);\n }\n\n if (state.selectedFacets) {\n for (const [facetName, facetValues] of Object.entries(\n state.selectedFacets\n )) {\n const facetEntries = Object.entries(facetValues);\n // eslint-disable-next-line no-continue\n if (facetEntries.length === 0) continue;\n for (const [key, data] of facetEntries) {\n const notValue = data.state === 'hidden';\n const paramValue = `${facetName}:\"${key}\"`;\n if (notValue) {\n newParams.append('not[]', paramValue);\n } else {\n newParams.append('and[]', paramValue);\n }\n }\n }\n }\n\n if (state.minSelectedDate && state.maxSelectedDate) {\n newParams.append(\n 'and[]',\n `year:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`\n );\n }\n\n if (state.titleQuery) {\n newParams.append('and[]', state.titleQuery);\n }\n\n if (state.creatorQuery) {\n newParams.append('and[]', state.creatorQuery);\n }\n\n // Ensure we aren't pushing consecutive identical states to the history stack.\n // - If the state has changed, we push a new history entry.\n // - If only the page number has changed, we replace the current history entry.\n // - If the state hasn't changed, then do nothing.\n let historyMethod: 'pushState' | 'replaceState' = 'pushState';\n const nonQueryParamsMatch = this.paramsMatch(oldParams, newParams, [\n 'sin',\n 'sort',\n 'and[]',\n 'not[]',\n ]);\n\n if (\n nonQueryParamsMatch &&\n this.paramsMatch(oldParams, newParams, ['query'])\n ) {\n // For page number, we want to replace the page state when it changes,\n // not push a new history entry. If it hasn't changed, then we're done.\n if (this.paramsMatch(oldParams, newParams, ['page'])) {\n return;\n }\n historyMethod = 'replaceState';\n } else if (nonQueryParamsMatch && this.hasLegacyParam(oldParams)) {\n // Similarly, if the only non-matching param was a legacy query param, then\n // we just want to overwrite it.\n historyMethod = 'replaceState';\n }\n\n window.history[historyMethod]?.(\n {\n query: state.baseQuery,\n searchType: state.searchType,\n page: state.currentPage,\n sort: state.sortParam,\n minDate: state.minSelectedDate,\n maxDate: state.maxSelectedDate,\n facets: state.selectedFacets,\n },\n '',\n url\n );\n }\n\n private loadQueryStateFromUrl(): RestorationState {\n const url = new URL(window.location.href);\n const searchInside = url.searchParams.get('sin');\n const pageNumber = url.searchParams.get('page');\n const searchQuery = url.searchParams.get('query');\n const sortQuery = url.searchParams.get('sort');\n const facetAnds = url.searchParams.getAll('and[]');\n const facetNots = url.searchParams.getAll('not[]');\n\n // Legacy search allowed `q` and `search` params for the query, so in the interest\n // of backwards-compatibility with old bookmarks, we recognize those here too.\n // (However, they still get upgraded to a `query` param when we persist our state\n // to the URL).\n const legacySearchQuery =\n url.searchParams.get('q') ?? url.searchParams.get('search');\n\n const restorationState: RestorationState = {\n selectedFacets: getDefaultSelectedFacets(),\n };\n\n if (searchQuery) {\n restorationState.baseQuery = searchQuery;\n } else if (legacySearchQuery) {\n restorationState.baseQuery = legacySearchQuery;\n }\n\n if (searchInside) {\n restorationState.searchType =\n searchInside === 'TXT' ? SearchType.FULLTEXT : SearchType.METADATA;\n }\n\n if (pageNumber) {\n const parsed = parseInt(pageNumber, 10);\n restorationState.currentPage = parsed;\n } else {\n restorationState.currentPage = 1;\n }\n\n if (sortQuery) {\n // check for two different sort formats: `date desc` and `-date`\n const hasSpace = sortQuery.indexOf(' ') > -1;\n if (hasSpace) {\n const [field, direction] = sortQuery.split(' ');\n const metadataField = URLFieldToSortField[field as URLSortField];\n\n if (metadataField) {\n restorationState.selectedSort = metadataField;\n }\n if (direction === 'desc' || direction === 'asc') {\n restorationState.sortDirection = direction as SortDirection;\n }\n } else {\n const direction = sortQuery.startsWith('-') ? 'desc' : 'asc';\n const field = sortQuery.startsWith('-')\n ? sortQuery.slice(1)\n : sortQuery;\n\n const metadataField = URLFieldToSortField[field as URLSortField];\n if (metadataField) {\n restorationState.selectedSort = metadataField;\n restorationState.sortDirection = direction as SortDirection;\n }\n }\n }\n\n if (facetAnds) {\n facetAnds.forEach(and => {\n // eslint-disable-next-line prefer-const\n let [field, value] = and.split(':');\n\n // Legacy search allowed and[] fields like 'creatorSorter', 'languageSorter', etc.\n // which we want to normalize to 'creator', 'language', etc. if redirected here.\n field = field.replace(/Sorter$/, '');\n\n switch (field) {\n case 'year': {\n const [minDate, maxDate] = value.split(' TO ');\n // we have two potential ways of filtering by date:\n // the range with \"date TO date\" or the single date with \"date\"\n // this is checking for the range case and if we don't have those, fall\n // back to the single date case\n if (minDate && maxDate) {\n restorationState.minSelectedDate = minDate.substring(\n 1,\n minDate.length\n );\n restorationState.maxSelectedDate = maxDate.substring(\n 0,\n maxDate.length - 1\n );\n } else {\n this.setSelectedFacetState(\n restorationState.selectedFacets,\n field as FacetOption,\n value,\n 'selected'\n );\n }\n break;\n }\n case 'firstTitle':\n restorationState.selectedTitleFilter = value;\n break;\n case 'firstCreator':\n restorationState.selectedCreatorFilter = value;\n break;\n default:\n this.setSelectedFacetState(\n restorationState.selectedFacets,\n field as FacetOption,\n value,\n 'selected'\n );\n }\n });\n }\n\n if (facetNots) {\n facetNots.forEach(not => {\n const [field, value] = not.split(':');\n this.setSelectedFacetState(\n restorationState.selectedFacets,\n field as FacetOption,\n value,\n 'hidden'\n );\n });\n }\n\n return restorationState;\n }\n\n // remove optional opening and closing quotes from a string\n private stripQuotes(value: string): string {\n if (value.startsWith('\"') && value.endsWith('\"')) {\n return value.substring(1, value.length - 1);\n }\n\n return value;\n }\n\n /**\n * Returns whether the two given URLSearchParams objects have\n * identical values for all of the given param keys. If either\n * object contains more than one value for a given key, then\n * all of the values for that key must match (disregarding order).\n */\n private paramsMatch(\n searchParams1: URLSearchParams,\n searchParams2: URLSearchParams,\n keys: string[]\n ): boolean {\n return keys.every(key =>\n arrayEquals(\n searchParams1.getAll(key).sort(),\n searchParams2.getAll(key).sort()\n )\n );\n }\n\n /**\n * Deletes any params from the given URLSearchParams object that are recognized\n * when loading state from the URL.\n */\n private removeRecognizedParams(\n searchParams: URLSearchParams\n ): URLSearchParams {\n // Remove all of our standard params\n searchParams.delete('query');\n searchParams.delete('sin');\n searchParams.delete('page');\n searchParams.delete('sort');\n searchParams.delete('and[]');\n searchParams.delete('not[]');\n\n // Also remove some legacy params that should have been upgraded to the ones above\n searchParams.delete('q');\n searchParams.delete('search');\n\n return searchParams;\n }\n\n /**\n * Returns whether the given URLSearchParams object contains a param that is\n * only recognized as a holdover from legacy search, and should not be\n * persisted to the URL.\n */\n private hasLegacyParam(searchParams: URLSearchParams): boolean {\n return searchParams.has('q') || searchParams.has('search');\n }\n\n /**\n * Sets the facet state for the given field & value to the given state,\n * creating any previously-undefined buckets as needed.\n */\n private setSelectedFacetState(\n selectedFacets: SelectedFacets,\n field: FacetOption,\n value: string,\n state: FacetState\n ): void {\n const facet = selectedFacets[field];\n if (!facet) return; // Unrecognized facet group, ignore it.\n\n const unQuotedValue = this.stripQuotes(value);\n facet[unQuotedValue] ??= this.getDefaultBucket(value);\n facet[unQuotedValue].state = state;\n }\n\n /** Returns a default bucket with the given key, count of 0, and state 'none'. */\n private getDefaultBucket(key: string): FacetBucket {\n return {\n key,\n count: 0,\n state: 'none',\n };\n }\n}\n"]}
1
+ {"version":3,"file":"restoration-state-handler.js","sourceRoot":"","sources":["../../src/restoration-state-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SearchType,\n SortDirection,\n SortParam,\n} from '@internetarchive/search-service';\nimport { getCookie, setCookie } from 'typescript-cookie';\nimport {\n MetadataSortField,\n FacetOption,\n CollectionBrowserContext,\n CollectionDisplayMode,\n SelectedFacets,\n SortField,\n FacetBucket,\n FacetState,\n URLFieldToSortField,\n URLSortField,\n getDefaultSelectedFacets,\n MetadataFieldToURLField,\n} from './models';\nimport { arrayEquals } from './utils/array-equals';\n\nexport interface RestorationState {\n displayMode?: CollectionDisplayMode;\n searchType?: SearchType;\n sortParam?: SortParam;\n selectedSort?: SortField;\n sortDirection?: SortDirection;\n selectedFacets: SelectedFacets;\n baseQuery?: string;\n currentPage?: number;\n titleQuery?: string;\n creatorQuery?: string;\n minSelectedDate?: string;\n maxSelectedDate?: string;\n selectedTitleFilter?: string;\n selectedCreatorFilter?: string;\n}\n\nexport interface RestorationStateHandlerInterface {\n persistState(state: RestorationState): void;\n getRestorationState(): RestorationState;\n}\n\nexport class RestorationStateHandler\n implements RestorationStateHandlerInterface\n{\n private context: CollectionBrowserContext;\n\n private cookieDomain = '.archive.org';\n\n private cookieExpiration = 30;\n\n private cookiePath = '/';\n\n constructor(options: { context: CollectionBrowserContext }) {\n this.context = options.context;\n }\n\n persistState(state: RestorationState): void {\n if (state.displayMode) this.persistViewStateToCookies(state.displayMode);\n this.persistQueryStateToUrl(state);\n }\n\n getRestorationState(): RestorationState {\n const restorationState = this.loadQueryStateFromUrl();\n const displayMode = this.loadTileViewStateFromCookies();\n restorationState.displayMode = displayMode;\n return restorationState;\n }\n\n private persistViewStateToCookies(displayMode: CollectionDisplayMode) {\n const gridState = displayMode === 'grid' ? 'tiles' : 'lists';\n setCookie(`view-${this.context}`, gridState, {\n domain: this.cookieDomain,\n expires: this.cookieExpiration,\n path: this.cookiePath,\n });\n const detailsState = displayMode === 'list-detail' ? 'showdetails' : '';\n setCookie(`showdetails-${this.context}`, detailsState, {\n domain: this.cookieDomain,\n expires: this.cookieExpiration,\n path: this.cookiePath,\n });\n }\n\n private loadTileViewStateFromCookies(): CollectionDisplayMode {\n const viewState = getCookie(`view-${this.context}`);\n const detailsState = getCookie(`showdetails-${this.context}`);\n if (viewState === 'tiles' || viewState === undefined) return 'grid';\n if (detailsState === 'showdetails') return 'list-detail';\n return 'list-compact';\n }\n\n private persistQueryStateToUrl(state: RestorationState) {\n const url = new URL(window.location.href);\n const oldParams = new URLSearchParams(url.searchParams);\n const newParams = this.removeRecognizedParams(url.searchParams);\n\n let replaceEmptySin = false;\n\n if (state.baseQuery) {\n newParams.set('query', state.baseQuery);\n }\n\n if (state.searchType === SearchType.FULLTEXT) {\n newParams.set('sin', 'TXT');\n }\n if (oldParams.get('sin') === '') {\n // Treat empty sin the same as no sin at all\n oldParams.delete('sin');\n replaceEmptySin = true;\n }\n\n if (state.currentPage) {\n if (state.currentPage > 1) {\n newParams.set('page', state.currentPage.toString());\n } else {\n newParams.delete('page');\n }\n }\n\n if (state.sortParam) {\n const prefix = state.sortParam.direction === 'desc' ? '-' : '';\n const readableSortField =\n MetadataFieldToURLField[state.sortParam.field as MetadataSortField];\n newParams.set('sort', `${prefix}${readableSortField}`);\n }\n\n if (state.selectedFacets) {\n for (const [facetName, facetValues] of Object.entries(\n state.selectedFacets\n )) {\n const facetEntries = Object.entries(facetValues);\n // eslint-disable-next-line no-continue\n if (facetEntries.length === 0) continue;\n for (const [key, data] of facetEntries) {\n const notValue = data.state === 'hidden';\n const paramValue = `${facetName}:\"${key}\"`;\n if (notValue) {\n newParams.append('not[]', paramValue);\n } else {\n newParams.append('and[]', paramValue);\n }\n }\n }\n }\n\n if (state.minSelectedDate && state.maxSelectedDate) {\n newParams.append(\n 'and[]',\n `year:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`\n );\n }\n\n if (state.titleQuery) {\n newParams.append('and[]', state.titleQuery);\n }\n\n if (state.creatorQuery) {\n newParams.append('and[]', state.creatorQuery);\n }\n\n // Ensure we aren't pushing consecutive identical states to the history stack.\n // - If the state has changed, we push a new history entry.\n // - If only the page number has changed, we replace the current history entry.\n // - If the state hasn't changed, then do nothing.\n let historyMethod: 'pushState' | 'replaceState' = 'pushState';\n const nonQueryParamsMatch = this.paramsMatch(oldParams, newParams, [\n 'sin',\n 'sort',\n 'and[]',\n 'not[]',\n ]);\n\n if (\n nonQueryParamsMatch &&\n this.paramsMatch(oldParams, newParams, ['query'])\n ) {\n if (replaceEmptySin) {\n // Get rid of any empty sin param\n newParams.delete('sin');\n } else if (this.paramsMatch(oldParams, newParams, ['page'])) {\n // For page number, we want to replace the page state when it changes,\n // not push a new history entry. If it hasn't changed, then we're done.\n return;\n }\n historyMethod = 'replaceState';\n } else if (nonQueryParamsMatch && this.hasLegacyParam(oldParams)) {\n // Similarly, if the only non-matching param was a legacy query param, then\n // we just want to overwrite it.\n historyMethod = 'replaceState';\n }\n\n window.history[historyMethod]?.(\n {\n query: state.baseQuery,\n searchType: state.searchType,\n page: state.currentPage,\n sort: state.sortParam,\n minDate: state.minSelectedDate,\n maxDate: state.maxSelectedDate,\n facets: state.selectedFacets,\n },\n '',\n url\n );\n }\n\n private loadQueryStateFromUrl(): RestorationState {\n const url = new URL(window.location.href);\n const searchInside = url.searchParams.get('sin');\n const pageNumber = url.searchParams.get('page');\n const searchQuery = url.searchParams.get('query');\n const sortQuery = url.searchParams.get('sort');\n const facetAnds = url.searchParams.getAll('and[]');\n const facetNots = url.searchParams.getAll('not[]');\n\n // Legacy search allowed `q` and `search` params for the query, so in the interest\n // of backwards-compatibility with old bookmarks, we recognize those here too.\n // (However, they still get upgraded to a `query` param when we persist our state\n // to the URL).\n const legacySearchQuery =\n url.searchParams.get('q') ?? url.searchParams.get('search');\n\n const restorationState: RestorationState = {\n selectedFacets: getDefaultSelectedFacets(),\n };\n\n if (searchQuery) {\n restorationState.baseQuery = searchQuery;\n } else if (legacySearchQuery) {\n restorationState.baseQuery = legacySearchQuery;\n }\n\n if (searchInside) {\n restorationState.searchType =\n searchInside === 'TXT' ? SearchType.FULLTEXT : SearchType.METADATA;\n }\n\n if (pageNumber) {\n const parsed = parseInt(pageNumber, 10);\n restorationState.currentPage = parsed;\n } else {\n restorationState.currentPage = 1;\n }\n\n if (sortQuery) {\n // check for two different sort formats: `date desc` and `-date`\n const hasSpace = sortQuery.indexOf(' ') > -1;\n if (hasSpace) {\n const [field, direction] = sortQuery.split(' ');\n const metadataField = URLFieldToSortField[field as URLSortField];\n\n if (metadataField) {\n restorationState.selectedSort = metadataField;\n }\n if (direction === 'desc' || direction === 'asc') {\n restorationState.sortDirection = direction as SortDirection;\n }\n } else {\n const direction = sortQuery.startsWith('-') ? 'desc' : 'asc';\n const field = sortQuery.startsWith('-')\n ? sortQuery.slice(1)\n : sortQuery;\n\n const metadataField = URLFieldToSortField[field as URLSortField];\n if (metadataField) {\n restorationState.selectedSort = metadataField;\n restorationState.sortDirection = direction as SortDirection;\n }\n }\n }\n\n if (facetAnds) {\n facetAnds.forEach(and => {\n // eslint-disable-next-line prefer-const\n let [field, value] = and.split(':');\n\n // Legacy search allowed and[] fields like 'creatorSorter', 'languageSorter', etc.\n // which we want to normalize to 'creator', 'language', etc. if redirected here.\n field = field.replace(/Sorter$/, '');\n\n switch (field) {\n case 'year': {\n const [minDate, maxDate] = value.split(' TO ');\n // we have two potential ways of filtering by date:\n // the range with \"date TO date\" or the single date with \"date\"\n // this is checking for the range case and if we don't have those, fall\n // back to the single date case\n if (minDate && maxDate) {\n restorationState.minSelectedDate = minDate.substring(\n 1,\n minDate.length\n );\n restorationState.maxSelectedDate = maxDate.substring(\n 0,\n maxDate.length - 1\n );\n } else {\n this.setSelectedFacetState(\n restorationState.selectedFacets,\n field as FacetOption,\n value,\n 'selected'\n );\n }\n break;\n }\n case 'firstTitle':\n restorationState.selectedTitleFilter = value;\n break;\n case 'firstCreator':\n restorationState.selectedCreatorFilter = value;\n break;\n default:\n this.setSelectedFacetState(\n restorationState.selectedFacets,\n field as FacetOption,\n value,\n 'selected'\n );\n }\n });\n }\n\n if (facetNots) {\n facetNots.forEach(not => {\n const [field, value] = not.split(':');\n this.setSelectedFacetState(\n restorationState.selectedFacets,\n field as FacetOption,\n value,\n 'hidden'\n );\n });\n }\n\n return restorationState;\n }\n\n // remove optional opening and closing quotes from a string\n private stripQuotes(value: string): string {\n if (value.startsWith('\"') && value.endsWith('\"')) {\n return value.substring(1, value.length - 1);\n }\n\n return value;\n }\n\n /**\n * Returns whether the two given URLSearchParams objects have\n * identical values for all of the given param keys. If either\n * object contains more than one value for a given key, then\n * all of the values for that key must match (disregarding order).\n */\n private paramsMatch(\n searchParams1: URLSearchParams,\n searchParams2: URLSearchParams,\n keys: string[]\n ): boolean {\n return keys.every(key =>\n arrayEquals(\n searchParams1.getAll(key).sort(),\n searchParams2.getAll(key).sort()\n )\n );\n }\n\n /**\n * Deletes any params from the given URLSearchParams object that are recognized\n * when loading state from the URL.\n */\n private removeRecognizedParams(\n searchParams: URLSearchParams\n ): URLSearchParams {\n // Remove all of our standard params\n searchParams.delete('query');\n searchParams.delete('sin');\n searchParams.delete('page');\n searchParams.delete('sort');\n searchParams.delete('and[]');\n searchParams.delete('not[]');\n\n // Also remove some legacy params that should have been upgraded to the ones above\n searchParams.delete('q');\n searchParams.delete('search');\n\n return searchParams;\n }\n\n /**\n * Returns whether the given URLSearchParams object contains a param that is\n * only recognized as a holdover from legacy search, and should not be\n * persisted to the URL.\n */\n private hasLegacyParam(searchParams: URLSearchParams): boolean {\n return searchParams.has('q') || searchParams.has('search');\n }\n\n /**\n * Sets the facet state for the given field & value to the given state,\n * creating any previously-undefined buckets as needed.\n */\n private setSelectedFacetState(\n selectedFacets: SelectedFacets,\n field: FacetOption,\n value: string,\n state: FacetState\n ): void {\n const facet = selectedFacets[field];\n if (!facet) return; // Unrecognized facet group, ignore it.\n\n const unQuotedValue = this.stripQuotes(value);\n facet[unQuotedValue] ??= this.getDefaultBucket(value);\n facet[unQuotedValue].state = state;\n }\n\n /** Returns a default bucket with the given key, count of 0, and state 'none'. */\n private getDefaultBucket(key: string): FacetBucket {\n return {\n key,\n count: 0,\n state: 'none',\n };\n }\n}\n"]}
@@ -171,5 +171,13 @@ describe('Restoration state handler', () => {
171
171
  handler.persistState(restorationState);
172
172
  expect(window.location.search).to.equal('?query=foo');
173
173
  });
174
+ it('should remove empty sin param', async () => {
175
+ const url = new URL(window.location.href);
176
+ url.search = '?sin=';
177
+ window.history.replaceState({ path: url.href }, '', url.href);
178
+ const handler = new RestorationStateHandler({ context: 'search' });
179
+ handler.persistState({ selectedFacets: getDefaultSelectedFacets() });
180
+ expect(window.location.search).to.equal('');
181
+ });
174
182
  });
175
183
  //# sourceMappingURL=restoration-state-handler.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"restoration-state-handler.test.js","sourceRoot":"","sources":["../../test/restoration-state-handler.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { SearchType } from '@internetarchive/search-service';\nimport { expect } from '@open-wc/testing';\nimport { getDefaultSelectedFacets } from '../src/models';\nimport { RestorationStateHandler } from '../src/restoration-state-handler';\n\ndescribe('Restoration state handler', () => {\n it('should restore query from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?query=boop';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('boop');\n });\n\n it('should restore metadata search type from URL without valid sin', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.METADATA);\n });\n\n it('should restore full text search type from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=TXT';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('should restore page number from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?page=42';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.currentPage).to.equal(42);\n });\n\n it('should restore selected year facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year['2018'].state).to.equal(\n 'selected'\n );\n });\n\n it('should ignore unrecognized facet types in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=foo:\"bar\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets).to.deep.equal(\n getDefaultSelectedFacets()\n );\n });\n\n it('should restore selected date range facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018+TO+2021\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.minSelectedDate).to.equal('2018');\n expect(restorationState.maxSelectedDate).to.equal('2021');\n });\n\n it('should restore creator filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstCreator:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedCreatorFilter).to.equal('F');\n });\n\n it('should restore title filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstTitle:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedTitleFilter).to.equal('F');\n });\n\n it('should restore other selected facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=subject:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.subject.foo.state).to.equal(\n 'selected'\n );\n });\n\n it('should restore negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?not[]=year:2018';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year['2018'].state).to.equal(\n 'hidden'\n );\n });\n\n it('should restore multiple selected/negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search =\n '?and[]=collection:\"foo\"&and[]=collection:\"bar\"&not[]=collection:\"baz\"&not[]=collection:\"boop\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n\n expect(restorationState.selectedFacets.collection.foo.state).to.equal(\n 'selected'\n );\n expect(restorationState.selectedFacets.collection.bar.state).to.equal(\n 'selected'\n );\n\n expect(restorationState.selectedFacets.collection.baz.state).to.equal(\n 'hidden'\n );\n expect(restorationState.selectedFacets.collection.boop.state).to.equal(\n 'hidden'\n );\n });\n\n it('negative facets take precedence if both present in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=collection:\"foo\"&not[]=collection:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.collection.foo.state).to.equal(\n 'hidden'\n );\n });\n\n it('should restore sort from URL (space format)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date+desc';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, desc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=-date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, asc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('asc');\n });\n\n it('should not save current page state to the URL for page 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 1,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.be.empty;\n });\n\n it('should save current page state to the URL when page > 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 2,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?page=2');\n });\n\n it('should upgrade legacy search params to new ones', async () => {\n const url = new URL(window.location.href);\n url.search = '?q=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('foo');\n\n handler.persistState(restorationState);\n expect(window.location.search).to.equal('?query=foo');\n });\n});\n"]}
1
+ {"version":3,"file":"restoration-state-handler.test.js","sourceRoot":"","sources":["../../test/restoration-state-handler.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,aAAa,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,oBAAoB,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CACjE,UAAU,CACX,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,kBAAkB,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CACnD,wBAAwB,EAAE,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,4BAA4B,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,uBAAuB,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,qBAAqB,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,sBAAsB,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAChE,UAAU,CACX,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,kBAAkB,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CACjE,QAAQ,CACT,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM;YACR,+FAA+F,CAAC;QAClG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAEvD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CACnE,UAAU,CACX,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CACnE,UAAU,CACX,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CACnE,QAAQ,CACT,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CACpE,QAAQ,CACT,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,gDAAgD,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CACnE,QAAQ,CACT,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,iBAAiB,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,aAAa,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,YAAY,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,YAAY,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,wBAAwB,EAAE;SAC3C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,YAAY,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,wBAAwB,EAAE;SAC3C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEnD,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC;QACrB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnE,OAAO,CAAC,YAAY,CAAC,EAAE,cAAc,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { SearchType } from '@internetarchive/search-service';\nimport { expect } from '@open-wc/testing';\nimport { getDefaultSelectedFacets } from '../src/models';\nimport { RestorationStateHandler } from '../src/restoration-state-handler';\n\ndescribe('Restoration state handler', () => {\n it('should restore query from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?query=boop';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('boop');\n });\n\n it('should restore metadata search type from URL without valid sin', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.METADATA);\n });\n\n it('should restore full text search type from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=TXT';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('should restore page number from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?page=42';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.currentPage).to.equal(42);\n });\n\n it('should restore selected year facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year['2018'].state).to.equal(\n 'selected'\n );\n });\n\n it('should ignore unrecognized facet types in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=foo:\"bar\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets).to.deep.equal(\n getDefaultSelectedFacets()\n );\n });\n\n it('should restore selected date range facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018+TO+2021\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.minSelectedDate).to.equal('2018');\n expect(restorationState.maxSelectedDate).to.equal('2021');\n });\n\n it('should restore creator filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstCreator:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedCreatorFilter).to.equal('F');\n });\n\n it('should restore title filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstTitle:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedTitleFilter).to.equal('F');\n });\n\n it('should restore other selected facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=subject:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.subject.foo.state).to.equal(\n 'selected'\n );\n });\n\n it('should restore negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?not[]=year:2018';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year['2018'].state).to.equal(\n 'hidden'\n );\n });\n\n it('should restore multiple selected/negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search =\n '?and[]=collection:\"foo\"&and[]=collection:\"bar\"&not[]=collection:\"baz\"&not[]=collection:\"boop\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n\n expect(restorationState.selectedFacets.collection.foo.state).to.equal(\n 'selected'\n );\n expect(restorationState.selectedFacets.collection.bar.state).to.equal(\n 'selected'\n );\n\n expect(restorationState.selectedFacets.collection.baz.state).to.equal(\n 'hidden'\n );\n expect(restorationState.selectedFacets.collection.boop.state).to.equal(\n 'hidden'\n );\n });\n\n it('negative facets take precedence if both present in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=collection:\"foo\"&not[]=collection:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.collection.foo.state).to.equal(\n 'hidden'\n );\n });\n\n it('should restore sort from URL (space format)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date+desc';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, desc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=-date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, asc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('asc');\n });\n\n it('should not save current page state to the URL for page 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 1,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.be.empty;\n });\n\n it('should save current page state to the URL when page > 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 2,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?page=2');\n });\n\n it('should upgrade legacy search params to new ones', async () => {\n const url = new URL(window.location.href);\n url.search = '?q=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('foo');\n\n handler.persistState(restorationState);\n expect(window.location.search).to.equal('?query=foo');\n });\n\n it('should remove empty sin param', async () => {\n const url = new URL(window.location.href);\n url.search = '?sin=';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n\n handler.persistState({ selectedFacets: getDefaultSelectedFacets() });\n expect(window.location.search).to.equal('');\n });\n});\n"]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "The Internet Archive Collection Browser.",
4
4
  "license": "AGPL-3.0-only",
5
5
  "author": "Internet Archive",
6
- "version": "0.4.14-alpha.6",
6
+ "version": "0.4.14-alpha.7",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
9
  "scripts": {
@@ -1602,7 +1602,7 @@ export class CollectionBrowser
1602
1602
 
1603
1603
  .mobile #right-column {
1604
1604
  border-left: none;
1605
- padding: 0;
1605
+ padding: 5px 5px 0;
1606
1606
  }
1607
1607
 
1608
1608
  #left-column {
@@ -1634,6 +1634,7 @@ export class CollectionBrowser
1634
1634
  #mobile-header-container {
1635
1635
  display: flex;
1636
1636
  justify-content: space-between;
1637
+ align-items: center;
1637
1638
  }
1638
1639
 
1639
1640
  #facets-container {
@@ -97,6 +97,8 @@ export class RestorationStateHandler
97
97
  const oldParams = new URLSearchParams(url.searchParams);
98
98
  const newParams = this.removeRecognizedParams(url.searchParams);
99
99
 
100
+ let replaceEmptySin = false;
101
+
100
102
  if (state.baseQuery) {
101
103
  newParams.set('query', state.baseQuery);
102
104
  }
@@ -104,6 +106,11 @@ export class RestorationStateHandler
104
106
  if (state.searchType === SearchType.FULLTEXT) {
105
107
  newParams.set('sin', 'TXT');
106
108
  }
109
+ if (oldParams.get('sin') === '') {
110
+ // Treat empty sin the same as no sin at all
111
+ oldParams.delete('sin');
112
+ replaceEmptySin = true;
113
+ }
107
114
 
108
115
  if (state.currentPage) {
109
116
  if (state.currentPage > 1) {
@@ -170,9 +177,12 @@ export class RestorationStateHandler
170
177
  nonQueryParamsMatch &&
171
178
  this.paramsMatch(oldParams, newParams, ['query'])
172
179
  ) {
173
- // For page number, we want to replace the page state when it changes,
174
- // not push a new history entry. If it hasn't changed, then we're done.
175
- if (this.paramsMatch(oldParams, newParams, ['page'])) {
180
+ if (replaceEmptySin) {
181
+ // Get rid of any empty sin param
182
+ newParams.delete('sin');
183
+ } else if (this.paramsMatch(oldParams, newParams, ['page'])) {
184
+ // For page number, we want to replace the page state when it changes,
185
+ // not push a new history entry. If it hasn't changed, then we're done.
176
186
  return;
177
187
  }
178
188
  historyMethod = 'replaceState';
@@ -248,4 +248,15 @@ describe('Restoration state handler', () => {
248
248
  handler.persistState(restorationState);
249
249
  expect(window.location.search).to.equal('?query=foo');
250
250
  });
251
+
252
+ it('should remove empty sin param', async () => {
253
+ const url = new URL(window.location.href);
254
+ url.search = '?sin=';
255
+ window.history.replaceState({ path: url.href }, '', url.href);
256
+
257
+ const handler = new RestorationStateHandler({ context: 'search' });
258
+
259
+ handler.persistState({ selectedFacets: getDefaultSelectedFacets() });
260
+ expect(window.location.search).to.equal('');
261
+ });
251
262
  });