@internetarchive/collection-browser 0.4.3-alpha.3 → 0.4.3-alpha.5

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.
@@ -146,7 +146,6 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
146
146
  * the query, the search type, or the sort has changed.
147
147
  */
148
148
  requestSearch() {
149
- console.log('handling query change by request');
150
149
  this.handleQueryChange();
151
150
  }
152
151
  render() {
@@ -432,12 +431,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
432
431
  }
433
432
  firstUpdated() {
434
433
  this.setupStateRestorationObserver();
435
- console.log('first updated - restoring state');
436
434
  this.restoreState();
437
435
  }
438
436
  updated(changed) {
439
437
  var _a;
440
- console.log('updated', changed);
441
438
  if (changed.has('displayMode') ||
442
439
  changed.has('baseNavigationUrl') ||
443
440
  changed.has('baseImageUrl') ||
@@ -445,15 +442,12 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
445
442
  (_a = this.infiniteScroller) === null || _a === void 0 ? void 0 : _a.reload();
446
443
  }
447
444
  if (changed.has('baseQuery')) {
448
- console.log('base query changed', changed.get('baseQuery'), this.baseQuery);
449
445
  this.emitBaseQueryChanged();
450
446
  }
451
447
  if (changed.has('searchType')) {
452
- console.log('search type changed', changed.get('searchType'), this.searchType);
453
448
  this.emitSearchTypeChanged();
454
449
  }
455
450
  if (changed.has('currentPage') || changed.has('displayMode')) {
456
- console.log('current page or display mode changed', changed.get('currentPage'), this.currentPage, changed.get('displayMode'), this.displayMode);
457
451
  this.persistState();
458
452
  }
459
453
  if (changed.has('baseQuery') ||
@@ -462,8 +456,8 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
462
456
  changed.has('minSelectedDate') ||
463
457
  changed.has('maxSelectedDate') ||
464
458
  changed.has('sortParam') ||
465
- changed.has('selectedFacets')) {
466
- console.log('handling query change', changed, this.baseQuery, this.sortParam);
459
+ changed.has('selectedFacets') ||
460
+ changed.has('searchService')) {
467
461
  this.handleQueryChange();
468
462
  }
469
463
  if (changed.has('baseQuery') ||
@@ -568,7 +562,6 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
568
562
  }
569
563
  async handleQueryChange() {
570
564
  var _a;
571
- console.log('handleQueryChange', this.pageFetchQueryKey, this.previousQueryKey);
572
565
  // only reset if the query has actually changed
573
566
  if (!this.searchService || this.pageFetchQueryKey === this.previousQueryKey)
574
567
  return;
@@ -654,7 +647,6 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
654
647
  this.restorationStateHandler.persistState(restorationState);
655
648
  }
656
649
  async doInitialPageFetch() {
657
- console.log('doInitialPageFetch');
658
650
  this.searchResultsLoading = true;
659
651
  await this.fetchPage(this.initialPageNumber);
660
652
  this.searchResultsLoading = false;
@@ -880,10 +872,8 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
880
872
  }
881
873
  async fetchFacets() {
882
874
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
883
- console.log('maybe fetch facets', this.filteredQuery);
884
875
  if (!this.filteredQuery)
885
876
  return;
886
- console.log('fetching facets');
887
877
  const params = {
888
878
  query: this.filteredQuery,
889
879
  rows: 0,
@@ -992,7 +982,6 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
992
982
  }
993
983
  async fetchPage(pageNumber) {
994
984
  var _a, _b, _c, _d, _e;
995
- console.log('maybe fetch page', pageNumber, this.filteredQuery);
996
985
  if (!this.filteredQuery)
997
986
  return;
998
987
  // if we already have data, don't fetch again
@@ -1007,7 +996,6 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1007
996
  return;
1008
997
  pageFetches.add(pageNumber);
1009
998
  this.pageFetchesInProgress[pageFetchQueryKey] = pageFetches;
1010
- console.log('fetching page', pageNumber);
1011
999
  const sortParams = this.sortParam ? [this.sortParam] : [];
1012
1000
  const params = {
1013
1001
  query: this.filteredQuery,
@@ -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 { ifDefined } from 'lit/directives/if-defined.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 './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 defaultSelectedFacets,\n TileModel,\n CollectionDisplayMode,\n FacetOption,\n FacetBucket,\n PrefixFilterType,\n PrefixFilterCounts,\n prefixFilterAggregationKeys,\n} from './models';\nimport {\n RestorationStateHandlerInterface,\n RestorationStateHandler,\n RestorationState,\n} from './restoration-state-handler';\nimport chevronIcon from './assets/img/icons/chevron';\nimport { LanguageCodeHandler } from './language-code-handler/language-code-handler';\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;\n\n @property({ type: String }) sortDirection?: SortDirection;\n\n @property({ type: String }) selectedSort: SortField = SortField.relevance;\n\n @property({ type: String }) selectedTitleFilter?: string;\n\n @property({ type: String }) selectedCreatorFilter?: string;\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 /**\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 /**\n * The search type of the previous search (i.e., the currently displayed\n * search results), which may differ from the one that is currently selected\n * to be used for the next search.\n */\n @state() private previousSearchType?: SearchType;\n\n @state() private totalResults?: number;\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 private languageCodeHandler = new LanguageCodeHandler();\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 // this is the actual number of tiles in the datasource,\n // which is useful for removing excess placeholder tiles\n // once we reached the end of the data\n private get actualTileCount(): number {\n return Object.keys(this.dataSource).reduce(\n (acc, page) => acc + this.dataSource[page].length,\n 0\n );\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 this.scrollToPage(pageNumber);\n }\n\n clearFilters() {\n this.selectedFacets = defaultSelectedFacets;\n this.sortParam = undefined;\n this.sortDirection = undefined;\n this.selectedTitleFilter = undefined;\n this.selectedCreatorFilter = undefined;\n this.titleQuery = undefined;\n this.creatorQuery = undefined;\n this.selectedSort = SortField.relevance;\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 console.log('handling query change by request');\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\n private get emptyPlaceholderTemplate() {\n return html`\n <empty-placeholder\n .placeholderType=${this.placeholderType}\n ?isMobileView=${this.mobileView}\n ></empty-placeholder>\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=\"${ifDefined(this.displayMode)}\"\n .cellProvider=${this}\n .placeholderCellTemplate=${this.placeholderCellTemplate}\n @scrollThresholdReached=${this.scrollThresholdReached}\n @visibleCellsChanged=${this.visibleCellsChanged}\n ></infinite-scroller>`;\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;\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): 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 = undefined;\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 this.requestUpdate();\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 ) {\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): 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(prevSelectedLetter?: string): 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(e: CustomEvent<{ selectedLetter: string }>) {\n this.selectedCreatorFilter = undefined;\n this.selectedTitleFilter = e.detail.selectedLetter;\n }\n\n private creatorLetterSelected(e: CustomEvent<{ selectedLetter: string }>) {\n this.selectedTitleFilter = undefined;\n this.selectedCreatorFilter = e.detail.selectedLetter;\n }\n\n private get facetDataLoading(): boolean {\n return this.facetsLoading || this.fullYearAggregationLoading;\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 .searchType=${this.searchType}\n .aggregations=${this.aggregations}\n .fullYearsHistogramAggregation=${this.fullYearsHistogramAggregation}\n .moreLinksVisible=${this.previousSearchType !== SearchType.FULLTEXT}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .selectedFacets=${this.selectedFacets}\n .collectionNameCache=${this.collectionNameCache}\n .languageCodeHandler=${this.languageCodeHandler}\n .showHistogramDatePicker=${this.showHistogramDatePicker}\n .query=${this.filteredQuery}\n .filterMap=${this.filterMap}\n .modalManager=${this.modalManager}\n ?collapsableFacets=${this.mobileView}\n ?facetsLoading=${this.facetDataLoading}\n ?fullYearAggregationLoading=${this.fullYearAggregationLoading}\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 console.log('first updated - restoring state');\n this.restoreState();\n }\n\n updated(changed: PropertyValues) {\n console.log('updated', changed);\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 if (changed.has('baseQuery')) {\n console.log(\n 'base query changed',\n changed.get('baseQuery'),\n this.baseQuery\n );\n this.emitBaseQueryChanged();\n }\n if (changed.has('searchType')) {\n console.log(\n 'search type changed',\n changed.get('searchType'),\n this.searchType\n );\n this.emitSearchTypeChanged();\n }\n if (changed.has('currentPage') || changed.has('displayMode')) {\n console.log(\n 'current page or display mode changed',\n changed.get('currentPage'),\n this.currentPage,\n changed.get('displayMode'),\n this.displayMode\n );\n this.persistState();\n }\n if (\n changed.has('baseQuery') ||\n changed.has('titleQuery') ||\n changed.has('creatorQuery') ||\n changed.has('minSelectedDate') ||\n changed.has('maxSelectedDate') ||\n changed.has('sortParam') ||\n changed.has('selectedFacets')\n ) {\n console.log(\n 'handling query change',\n changed,\n this.baseQuery,\n this.sortParam\n );\n this.handleQueryChange();\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 if (changed.has('selectedSort') || changed.has('sortDirection')) {\n const prevSortDirection = changed.get('sortDirection') as SortDirection;\n this.sendSortByAnalytics(prevSortDirection);\n this.selectedSortChanged();\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 if (changed.has('pagesToRender')) {\n if (!this.endOfDataReached && this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\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 console.log(\n 'handleQueryChange',\n this.pageFetchQueryKey,\n this.previousQueryKey\n );\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\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 this.historyPopOccurred = false;\n }\n\n await Promise.all([\n this.doInitialPageFetch(),\n this.fetchFacets(),\n // Only fetch histogram data separately if we need it b/c of date filters\n this.shouldRequestYearHistogram && this.fetchFullYearHistogram(),\n ]);\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;\n this.selectedTitleFilter = restorationState.selectedTitleFilter;\n this.selectedCreatorFilter = restorationState.selectedCreatorFilter;\n this.selectedFacets = restorationState.selectedFacets;\n this.baseQuery = restorationState.baseQuery;\n this.titleQuery = restorationState.titleQuery;\n this.creatorQuery = restorationState.creatorQuery;\n this.sortParam = restorationState.sortParam;\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 ?? defaultSelectedFacets,\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 console.log('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\n // TEMP: At present, the backend search engine incorrectly returns 0 results if\n // the _first_ language filter contains a space, so let's try to avoid that if possible.\n if (filterMap.language) {\n for (const [value, constraint] of Object.entries(filterMap.language)) {\n if (value.includes(' ')) {\n // Delete and re-add this filter to make it the last one on the parent object\n // (Technically this isn't in the standard, but most browser impls output\n // object keys in the order they were added.)\n delete filterMap.language[value];\n filterMap.language[value] = constraint;\n } else {\n // As soon as we reach one without a space, we're done\n break;\n }\n }\n }\n\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 /** The full query without any year facets or date range clauses */\n private get fullQueryWithoutDates(): string | undefined {\n if (!this.baseQuery) return undefined;\n let fullQuery = this.baseQuery;\n\n const { facetQueryWithoutYear, sortFilterQueries } = this;\n\n if (facetQueryWithoutYear) {\n fullQuery += ` AND ${facetQueryWithoutYear}`;\n }\n if (sortFilterQueries) {\n fullQuery += ` AND ${sortFilterQueries}`;\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 * Generates a query string for the currently selected facets, excluding 'year' facets.\n *\n * Example: `mediatype:(\"collection\" OR \"audio\" OR -\"etree\") AND subject:(\"foo\" OR -\"bar\")`\n */\n private get facetQueryWithoutYear(): string | undefined {\n if (!this.selectedFacets) return undefined;\n const facetClauses = [];\n for (const [facetName, facetValues] of Object.entries(\n this.selectedFacets\n )) {\n if (facetName !== 'year') {\n facetClauses.push(this.buildFacetClause(facetName, facetValues));\n }\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 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 // Language codes like \"en-US|en-GB|en\" need to be broken apart into individual values\n if (facetName === 'language') {\n normalizedValues = {};\n for (const [facetValue, facetData] of Object.entries(facetValues)) {\n const languages =\n this.languageCodeHandler.getCodeArrayFromCodeString(facetValue);\n for (const lang of languages) {\n normalizedValues[lang] = { ...facetData };\n }\n }\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 console.log('maybe fetch facets', this.filteredQuery);\n if (!this.filteredQuery) return;\n\n console.log('fetching facets');\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 this.previousSearchType = this.searchType;\n const results = await this.searchService?.search(params, this.searchType);\n this.facetsLoading = false;\n\n this.aggregations = results?.success?.response.aggregations;\n\n // If we're not fetching year histogram data separately, set it from the newly-fetched aggregations\n if (!this.shouldRequestYearHistogram) {\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\n /**\n * If we haven't changed the query, we don't need to fetch the full year histogram\n *\n * @private\n * @type {string}\n * @memberof CollectionBrowser\n */\n private previousFullQueryNoDate?: string;\n\n /**\n * The query key is a string that uniquely identifies the current query\n * without the date range.\n *\n * If this doesn't change, we don't need to re-fetch the histogram date range\n */\n private get fullQueryNoDateKey() {\n return `${this.fullQueryWithoutDates}-${this.searchType}-${this.sortParam?.field}-${this.sortParam?.direction}`;\n }\n\n /**\n * This method is similar to fetching the facets above,\n * but only fetching the year histogram. There is a subtle difference\n * in how you have to fetch the year histogram where you can't use the\n * advanced JSON syntax like the other aggregations. It's a special\n * case that @ximm put it place.\n */\n private async fetchFullYearHistogram(): Promise<void> {\n const { fullQueryNoDateKey } = this;\n if (\n !this.fullQueryWithoutDates ||\n fullQueryNoDateKey === this.previousFullQueryNoDate\n ) {\n return;\n }\n this.previousFullQueryNoDate = fullQueryNoDateKey;\n\n const aggregations = {\n simpleParams: ['year'],\n };\n\n const params = {\n query: this.fullQueryWithoutDates,\n aggregations,\n rows: 0,\n };\n\n this.fullYearAggregationLoading = true;\n const results = await this.searchService?.search(params, this.searchType);\n this.fullYearAggregationLoading = false;\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 /**\n * We only want to send a separate request for the year_histogram data\n * if (a) the date picker component is enabled and (b) there is a year facet or date-range filter applied.\n *\n * Otherwise, we should just be using the histogram data supplied by the \"normal\" facet request.\n */\n private get shouldRequestYearHistogram() {\n const datePickerEnabled = this.showHistogramDatePicker;\n const hasDateRange = !!this.dateRangeQueryClause;\n const hasYearFacet =\n Object.keys(this.selectedFacets?.year ?? {}).length > 0;\n return datePickerEnabled && (hasDateRange || hasYearFacet);\n }\n\n private scrollToPage(pageNumber: number) {\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 }, 500);\n }, 0);\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 console.log('maybe fetch page', pageNumber, this.filteredQuery);\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 console.log('fetching page', pageNumber);\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) return;\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 this.infiniteScroller.itemCount = this.totalResults;\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 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 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: this.etreeTitle(\n result.title?.value,\n result.mediatype?.value,\n result.collection?.values\n ),\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 * Convert etree titles\n * \"[Creator] Live at [Place] on [Date]\" => \"[Date]: [Place]\"\n *\n * Todo: Check collection(s) for etree, need to get as array.\n * Current search-service only returns first collection as string.\n */\n private etreeTitle(\n title: string | undefined,\n mediatype: string | undefined,\n collections: string[] | undefined\n ): string {\n if (mediatype === 'etree' || collections?.includes('etree')) {\n const regex = /^(.*) Live at (.*) on (\\d\\d\\d\\d-\\d\\d-\\d\\d)$/;\n const newTitle = title?.replace(regex, '$3: $2');\n if (newTitle) {\n return `${newTitle}`;\n }\n }\n return title ?? '';\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 @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 padding-left: 1rem;\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 }\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 }\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 18rem\n );\n --infiniteScrollerCellMaxWidth: var(--collectionBrowserCellMaxWidth, 1fr);\n --infiniteScrollerCellMinHeight: var(\n --collectionBrowserCellMinHeight,\n 29rem\n );\n --infiniteScrollerCellMaxHeight: var(\n --collectionBrowserCellMaxHeight,\n 29rem\n );\n }\n `;\n}\n"]}
1
+ {"version":3,"file":"collection-browser.js","sourceRoot":"","sources":["../../src/collection-browser.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport {\n html,\n css,\n LitElement,\n PropertyValues,\n TemplateResult,\n nothing,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.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 './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 defaultSelectedFacets,\n TileModel,\n CollectionDisplayMode,\n FacetOption,\n FacetBucket,\n PrefixFilterType,\n PrefixFilterCounts,\n prefixFilterAggregationKeys,\n} from './models';\nimport {\n RestorationStateHandlerInterface,\n RestorationStateHandler,\n RestorationState,\n} from './restoration-state-handler';\nimport chevronIcon from './assets/img/icons/chevron';\nimport { LanguageCodeHandler } from './language-code-handler/language-code-handler';\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;\n\n @property({ type: String }) sortDirection?: SortDirection;\n\n @property({ type: String }) selectedSort: SortField = SortField.relevance;\n\n @property({ type: String }) selectedTitleFilter?: string;\n\n @property({ type: String }) selectedCreatorFilter?: string;\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 /**\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 /**\n * The search type of the previous search (i.e., the currently displayed\n * search results), which may differ from the one that is currently selected\n * to be used for the next search.\n */\n @state() private previousSearchType?: SearchType;\n\n @state() private totalResults?: number;\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 private languageCodeHandler = new LanguageCodeHandler();\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 // this is the actual number of tiles in the datasource,\n // which is useful for removing excess placeholder tiles\n // once we reached the end of the data\n private get actualTileCount(): number {\n return Object.keys(this.dataSource).reduce(\n (acc, page) => acc + this.dataSource[page].length,\n 0\n );\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 this.scrollToPage(pageNumber);\n }\n\n clearFilters() {\n this.selectedFacets = defaultSelectedFacets;\n this.sortParam = undefined;\n this.sortDirection = undefined;\n this.selectedTitleFilter = undefined;\n this.selectedCreatorFilter = undefined;\n this.titleQuery = undefined;\n this.creatorQuery = undefined;\n this.selectedSort = SortField.relevance;\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\n private get emptyPlaceholderTemplate() {\n return html`\n <empty-placeholder\n .placeholderType=${this.placeholderType}\n ?isMobileView=${this.mobileView}\n ></empty-placeholder>\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=\"${ifDefined(this.displayMode)}\"\n .cellProvider=${this}\n .placeholderCellTemplate=${this.placeholderCellTemplate}\n @scrollThresholdReached=${this.scrollThresholdReached}\n @visibleCellsChanged=${this.visibleCellsChanged}\n ></infinite-scroller>`;\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;\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): 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 = undefined;\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 this.requestUpdate();\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 ) {\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): 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(prevSelectedLetter?: string): 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(e: CustomEvent<{ selectedLetter: string }>) {\n this.selectedCreatorFilter = undefined;\n this.selectedTitleFilter = e.detail.selectedLetter;\n }\n\n private creatorLetterSelected(e: CustomEvent<{ selectedLetter: string }>) {\n this.selectedTitleFilter = undefined;\n this.selectedCreatorFilter = e.detail.selectedLetter;\n }\n\n private get facetDataLoading(): boolean {\n return this.facetsLoading || this.fullYearAggregationLoading;\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 .searchType=${this.searchType}\n .aggregations=${this.aggregations}\n .fullYearsHistogramAggregation=${this.fullYearsHistogramAggregation}\n .moreLinksVisible=${this.previousSearchType !== SearchType.FULLTEXT}\n .minSelectedDate=${this.minSelectedDate}\n .maxSelectedDate=${this.maxSelectedDate}\n .selectedFacets=${this.selectedFacets}\n .collectionNameCache=${this.collectionNameCache}\n .languageCodeHandler=${this.languageCodeHandler}\n .showHistogramDatePicker=${this.showHistogramDatePicker}\n .query=${this.filteredQuery}\n .filterMap=${this.filterMap}\n .modalManager=${this.modalManager}\n ?collapsableFacets=${this.mobileView}\n ?facetsLoading=${this.facetDataLoading}\n ?fullYearAggregationLoading=${this.fullYearAggregationLoading}\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 if (changed.has('baseQuery')) {\n this.emitBaseQueryChanged();\n }\n if (changed.has('searchType')) {\n this.emitSearchTypeChanged();\n }\n if (changed.has('currentPage') || changed.has('displayMode')) {\n this.persistState();\n }\n if (\n changed.has('baseQuery') ||\n changed.has('titleQuery') ||\n changed.has('creatorQuery') ||\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 if (\n changed.has('baseQuery') ||\n changed.has('minSelectedDate') ||\n changed.has('maxSelectedDate') ||\n changed.has('selectedFacets')\n ) {\n this.refreshLetterCounts();\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 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 if (changed.has('pagesToRender')) {\n if (!this.endOfDataReached && this.infiniteScroller) {\n this.infiniteScroller.itemCount = this.estimatedTileCount;\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\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 this.historyPopOccurred = false;\n }\n\n await Promise.all([\n this.doInitialPageFetch(),\n this.fetchFacets(),\n // Only fetch histogram data separately if we need it b/c of date filters\n this.shouldRequestYearHistogram && this.fetchFullYearHistogram(),\n ]);\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;\n this.selectedTitleFilter = restorationState.selectedTitleFilter;\n this.selectedCreatorFilter = restorationState.selectedCreatorFilter;\n this.selectedFacets = restorationState.selectedFacets;\n this.baseQuery = restorationState.baseQuery;\n this.titleQuery = restorationState.titleQuery;\n this.creatorQuery = restorationState.creatorQuery;\n this.sortParam = restorationState.sortParam;\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 ?? defaultSelectedFacets,\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\n // TEMP: At present, the backend search engine incorrectly returns 0 results if\n // the _first_ language filter contains a space, so let's try to avoid that if possible.\n if (filterMap.language) {\n for (const [value, constraint] of Object.entries(filterMap.language)) {\n if (value.includes(' ')) {\n // Delete and re-add this filter to make it the last one on the parent object\n // (Technically this isn't in the standard, but most browser impls output\n // object keys in the order they were added.)\n delete filterMap.language[value];\n filterMap.language[value] = constraint;\n } else {\n // As soon as we reach one without a space, we're done\n break;\n }\n }\n }\n\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 /** The full query without any year facets or date range clauses */\n private get fullQueryWithoutDates(): string | undefined {\n if (!this.baseQuery) return undefined;\n let fullQuery = this.baseQuery;\n\n const { facetQueryWithoutYear, sortFilterQueries } = this;\n\n if (facetQueryWithoutYear) {\n fullQuery += ` AND ${facetQueryWithoutYear}`;\n }\n if (sortFilterQueries) {\n fullQuery += ` AND ${sortFilterQueries}`;\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 * Generates a query string for the currently selected facets, excluding 'year' facets.\n *\n * Example: `mediatype:(\"collection\" OR \"audio\" OR -\"etree\") AND subject:(\"foo\" OR -\"bar\")`\n */\n private get facetQueryWithoutYear(): string | undefined {\n if (!this.selectedFacets) return undefined;\n const facetClauses = [];\n for (const [facetName, facetValues] of Object.entries(\n this.selectedFacets\n )) {\n if (facetName !== 'year') {\n facetClauses.push(this.buildFacetClause(facetName, facetValues));\n }\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 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 // Language codes like \"en-US|en-GB|en\" need to be broken apart into individual values\n if (facetName === 'language') {\n normalizedValues = {};\n for (const [facetValue, facetData] of Object.entries(facetValues)) {\n const languages =\n this.languageCodeHandler.getCodeArrayFromCodeString(facetValue);\n for (const lang of languages) {\n normalizedValues[lang] = { ...facetData };\n }\n }\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 this.previousSearchType = this.searchType;\n const results = await this.searchService?.search(params, this.searchType);\n this.facetsLoading = false;\n\n this.aggregations = results?.success?.response.aggregations;\n\n // If we're not fetching year histogram data separately, set it from the newly-fetched aggregations\n if (!this.shouldRequestYearHistogram) {\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\n /**\n * If we haven't changed the query, we don't need to fetch the full year histogram\n *\n * @private\n * @type {string}\n * @memberof CollectionBrowser\n */\n private previousFullQueryNoDate?: string;\n\n /**\n * The query key is a string that uniquely identifies the current query\n * without the date range.\n *\n * If this doesn't change, we don't need to re-fetch the histogram date range\n */\n private get fullQueryNoDateKey() {\n return `${this.fullQueryWithoutDates}-${this.searchType}-${this.sortParam?.field}-${this.sortParam?.direction}`;\n }\n\n /**\n * This method is similar to fetching the facets above,\n * but only fetching the year histogram. There is a subtle difference\n * in how you have to fetch the year histogram where you can't use the\n * advanced JSON syntax like the other aggregations. It's a special\n * case that @ximm put it place.\n */\n private async fetchFullYearHistogram(): Promise<void> {\n const { fullQueryNoDateKey } = this;\n if (\n !this.fullQueryWithoutDates ||\n fullQueryNoDateKey === this.previousFullQueryNoDate\n ) {\n return;\n }\n this.previousFullQueryNoDate = fullQueryNoDateKey;\n\n const aggregations = {\n simpleParams: ['year'],\n };\n\n const params = {\n query: this.fullQueryWithoutDates,\n aggregations,\n rows: 0,\n };\n\n this.fullYearAggregationLoading = true;\n const results = await this.searchService?.search(params, this.searchType);\n this.fullYearAggregationLoading = false;\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 /**\n * We only want to send a separate request for the year_histogram data\n * if (a) the date picker component is enabled and (b) there is a year facet or date-range filter applied.\n *\n * Otherwise, we should just be using the histogram data supplied by the \"normal\" facet request.\n */\n private get shouldRequestYearHistogram() {\n const datePickerEnabled = this.showHistogramDatePicker;\n const hasDateRange = !!this.dateRangeQueryClause;\n const hasYearFacet =\n Object.keys(this.selectedFacets?.year ?? {}).length > 0;\n return datePickerEnabled && (hasDateRange || hasYearFacet);\n }\n\n private scrollToPage(pageNumber: number) {\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 }, 500);\n }, 0);\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) return;\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 this.infiniteScroller.itemCount = this.totalResults;\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 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 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: this.etreeTitle(\n result.title?.value,\n result.mediatype?.value,\n result.collection?.values\n ),\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 * Convert etree titles\n * \"[Creator] Live at [Place] on [Date]\" => \"[Date]: [Place]\"\n *\n * Todo: Check collection(s) for etree, need to get as array.\n * Current search-service only returns first collection as string.\n */\n private etreeTitle(\n title: string | undefined,\n mediatype: string | undefined,\n collections: string[] | undefined\n ): string {\n if (mediatype === 'etree' || collections?.includes('etree')) {\n const regex = /^(.*) Live at (.*) on (\\d\\d\\d\\d-\\d\\d-\\d\\d)$/;\n const newTitle = title?.replace(regex, '$3: $2');\n if (newTitle) {\n return `${newTitle}`;\n }\n }\n return title ?? '';\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 @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 padding-left: 1rem;\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 }\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 }\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 18rem\n );\n --infiniteScrollerCellMaxWidth: var(--collectionBrowserCellMaxWidth, 1fr);\n --infiniteScrollerCellMinHeight: var(\n --collectionBrowserCellMinHeight,\n 29rem\n );\n --infiniteScrollerCellMaxHeight: var(\n --collectionBrowserCellMaxHeight,\n 29rem\n );\n }\n `;\n}\n"]}
@@ -44,7 +44,6 @@ export class RestorationStateHandler {
44
44
  return 'list-compact';
45
45
  }
46
46
  persistQueryStateToUrl(state) {
47
- console.log('persistQueryStateToUrl', state);
48
47
  const url = new URL(window.location.href);
49
48
  const { searchParams } = url;
50
49
  const oldParams = new URLSearchParams(searchParams);
@@ -100,15 +99,12 @@ export class RestorationStateHandler {
100
99
  searchParams.append('and[]', state.creatorQuery);
101
100
  }
102
101
  // Ensure we aren't pushing an identical state to the stack
103
- console.log('old params', oldParams.toString());
104
- console.log('new params', searchParams.toString());
105
102
  if (oldParams.get('query') === searchParams.get('query') &&
106
103
  oldParams.get('sin') === searchParams.get('sin') &&
107
104
  oldParams.get('page') === searchParams.get('page') &&
108
105
  oldParams.get('sort') === searchParams.get('sort') &&
109
106
  arrayEquals(oldParams.getAll('and[]').sort(), searchParams.getAll('and[]').sort()) &&
110
107
  arrayEquals(oldParams.getAll('not[]').sort(), searchParams.getAll('not[]').sort())) {
111
- console.log('Ignoring identical params');
112
108
  return;
113
109
  }
114
110
  window.history.pushState({
@@ -122,7 +118,6 @@ export class RestorationStateHandler {
122
118
  }, '', url);
123
119
  }
124
120
  loadQueryStateFromUrl() {
125
- console.log('loadQueryStateFromUrl', window.location.href);
126
121
  const url = new URL(window.location.href);
127
122
  const searchInside = url.searchParams.get('sin');
128
123
  const pageNumber = url.searchParams.get('page');
@@ -1 +1 @@
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 MetadataFieldToSortField,\n MetadataSortField,\n FacetOption,\n CollectionBrowserContext,\n CollectionDisplayMode,\n SelectedFacets,\n SortField,\n FacetBucket,\n FacetState,\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 console.log('persistQueryStateToUrl', state);\n const url = new URL(window.location.href);\n const { searchParams } = url;\n const oldParams = new URLSearchParams(searchParams);\n\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 if (state.baseQuery) {\n searchParams.set('query', state.baseQuery);\n }\n\n if (state.searchType) {\n searchParams.set(\n 'sin',\n state.searchType === SearchType.FULLTEXT ? 'TXT' : ''\n );\n }\n\n if (state.currentPage) {\n if (state.currentPage > 1) {\n searchParams.set('page', state.currentPage.toString());\n } else {\n searchParams.delete('page');\n }\n }\n\n if (state.sortParam) {\n const prefix = state.sortParam.direction === 'desc' ? '-' : '';\n searchParams.set('sort', `${prefix}${state.sortParam.field}`);\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 searchParams.append('not[]', paramValue);\n } else {\n searchParams.append('and[]', paramValue);\n }\n }\n }\n }\n\n if (state.minSelectedDate && state.maxSelectedDate) {\n searchParams.append(\n 'and[]',\n `year:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`\n );\n }\n\n if (state.titleQuery) {\n searchParams.append('and[]', state.titleQuery);\n }\n\n if (state.creatorQuery) {\n searchParams.append('and[]', state.creatorQuery);\n }\n\n // Ensure we aren't pushing an identical state to the stack\n console.log('old params', oldParams.toString());\n console.log('new params', searchParams.toString());\n if (\n oldParams.get('query') === searchParams.get('query') &&\n oldParams.get('sin') === searchParams.get('sin') &&\n oldParams.get('page') === searchParams.get('page') &&\n oldParams.get('sort') === searchParams.get('sort') &&\n arrayEquals(\n oldParams.getAll('and[]').sort(),\n searchParams.getAll('and[]').sort()\n ) &&\n arrayEquals(\n oldParams.getAll('not[]').sort(),\n searchParams.getAll('not[]').sort()\n )\n ) {\n console.log('Ignoring identical params');\n return;\n }\n\n window.history.pushState(\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 console.log('loadQueryStateFromUrl', window.location.href);\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 const restorationState: RestorationState = {\n selectedFacets: {\n subject: {},\n lending: {},\n creator: {},\n mediatype: {},\n language: {},\n collection: {},\n year: {},\n },\n };\n\n if (searchInside) {\n restorationState.searchType =\n searchInside === 'TXT' ? SearchType.FULLTEXT : SearchType.METADATA;\n }\n if (pageNumber) {\n const parsed = parseInt(pageNumber, 10);\n restorationState.currentPage = parsed;\n } else {\n restorationState.currentPage = 1;\n }\n if (searchQuery) {\n restorationState.baseQuery = searchQuery;\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 =\n MetadataFieldToSortField[field as MetadataSortField];\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 sortDirection = sortQuery.startsWith('-') ? 'desc' : 'asc';\n const sortField = sortQuery.startsWith('-')\n ? sortQuery.slice(1)\n : sortQuery;\n const metadataField =\n MetadataFieldToSortField[sortField as MetadataSortField];\n if (metadataField) restorationState.selectedSort = metadataField;\n restorationState.sortDirection = sortDirection as SortDirection;\n }\n }\n if (facetAnds) {\n facetAnds.forEach(and => {\n const [field, value] = and.split(':');\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 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 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 return value;\n }\n\n private selectedFacetStatesEqual(\n facets1: SelectedFacets,\n facets2: SelectedFacets\n ): boolean {\n if (facets1 === facets2) return true;\n\n // We can assume they both have the same top-level entries (the allowable facet fields)\n for (const [key, values] of Object.entries(facets1)) {\n const facetField = key as keyof SelectedFacets;\n\n // They must have the same number of bucket entries for each field\n const bucketEntries1 = Object.entries(values);\n const bucketEntries2 = Object.entries(facets2[facetField]);\n if (bucketEntries1.length !== bucketEntries2.length) return false;\n\n // And since they have the same length, we just ensure every bucket state from the\n // first object matches a corresponding bucket state in the second object.\n // If the corresponding bucket doesn't exist or has a different state, we're done.\n for (const [value, bucket] of bucketEntries1) {\n if (bucket.state !== facets2[facetField][value]?.state) return false;\n }\n }\n\n return true;\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 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 MetadataFieldToSortField,\n MetadataSortField,\n FacetOption,\n CollectionBrowserContext,\n CollectionDisplayMode,\n SelectedFacets,\n SortField,\n FacetBucket,\n FacetState,\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 { searchParams } = url;\n const oldParams = new URLSearchParams(searchParams);\n\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 if (state.baseQuery) {\n searchParams.set('query', state.baseQuery);\n }\n\n if (state.searchType) {\n searchParams.set(\n 'sin',\n state.searchType === SearchType.FULLTEXT ? 'TXT' : ''\n );\n }\n\n if (state.currentPage) {\n if (state.currentPage > 1) {\n searchParams.set('page', state.currentPage.toString());\n } else {\n searchParams.delete('page');\n }\n }\n\n if (state.sortParam) {\n const prefix = state.sortParam.direction === 'desc' ? '-' : '';\n searchParams.set('sort', `${prefix}${state.sortParam.field}`);\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 searchParams.append('not[]', paramValue);\n } else {\n searchParams.append('and[]', paramValue);\n }\n }\n }\n }\n\n if (state.minSelectedDate && state.maxSelectedDate) {\n searchParams.append(\n 'and[]',\n `year:[${state.minSelectedDate} TO ${state.maxSelectedDate}]`\n );\n }\n\n if (state.titleQuery) {\n searchParams.append('and[]', state.titleQuery);\n }\n\n if (state.creatorQuery) {\n searchParams.append('and[]', state.creatorQuery);\n }\n\n // Ensure we aren't pushing an identical state to the stack\n if (\n oldParams.get('query') === searchParams.get('query') &&\n oldParams.get('sin') === searchParams.get('sin') &&\n oldParams.get('page') === searchParams.get('page') &&\n oldParams.get('sort') === searchParams.get('sort') &&\n arrayEquals(\n oldParams.getAll('and[]').sort(),\n searchParams.getAll('and[]').sort()\n ) &&\n arrayEquals(\n oldParams.getAll('not[]').sort(),\n searchParams.getAll('not[]').sort()\n )\n ) {\n return;\n }\n\n window.history.pushState(\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 const restorationState: RestorationState = {\n selectedFacets: {\n subject: {},\n lending: {},\n creator: {},\n mediatype: {},\n language: {},\n collection: {},\n year: {},\n },\n };\n\n if (searchInside) {\n restorationState.searchType =\n searchInside === 'TXT' ? SearchType.FULLTEXT : SearchType.METADATA;\n }\n if (pageNumber) {\n const parsed = parseInt(pageNumber, 10);\n restorationState.currentPage = parsed;\n } else {\n restorationState.currentPage = 1;\n }\n if (searchQuery) {\n restorationState.baseQuery = searchQuery;\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 =\n MetadataFieldToSortField[field as MetadataSortField];\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 sortDirection = sortQuery.startsWith('-') ? 'desc' : 'asc';\n const sortField = sortQuery.startsWith('-')\n ? sortQuery.slice(1)\n : sortQuery;\n const metadataField =\n MetadataFieldToSortField[sortField as MetadataSortField];\n if (metadataField) restorationState.selectedSort = metadataField;\n restorationState.sortDirection = sortDirection as SortDirection;\n }\n }\n if (facetAnds) {\n facetAnds.forEach(and => {\n const [field, value] = and.split(':');\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 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 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 return value;\n }\n\n private selectedFacetStatesEqual(\n facets1: SelectedFacets,\n facets2: SelectedFacets\n ): boolean {\n if (facets1 === facets2) return true;\n\n // We can assume they both have the same top-level entries (the allowable facet fields)\n for (const [key, values] of Object.entries(facets1)) {\n const facetField = key as keyof SelectedFacets;\n\n // They must have the same number of bucket entries for each field\n const bucketEntries1 = Object.entries(values);\n const bucketEntries2 = Object.entries(facets2[facetField]);\n if (bucketEntries1.length !== bucketEntries2.length) return false;\n\n // And since they have the same length, we just ensure every bucket state from the\n // first object matches a corresponding bucket state in the second object.\n // If the corresponding bucket doesn't exist or has a different state, we're done.\n for (const [value, bucket] of bucketEntries1) {\n if (bucket.state !== facets2[facetField][value]?.state) return false;\n }\n }\n\n return true;\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 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"]}
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.3-alpha.3",
6
+ "version": "0.4.3-alpha.5",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
9
  "scripts": {
@@ -291,7 +291,6 @@ export class CollectionBrowser
291
291
  * the query, the search type, or the sort has changed.
292
292
  */
293
293
  requestSearch() {
294
- console.log('handling query change by request');
295
294
  this.handleQueryChange();
296
295
  }
297
296
 
@@ -619,12 +618,10 @@ export class CollectionBrowser
619
618
 
620
619
  firstUpdated(): void {
621
620
  this.setupStateRestorationObserver();
622
- console.log('first updated - restoring state');
623
621
  this.restoreState();
624
622
  }
625
623
 
626
624
  updated(changed: PropertyValues) {
627
- console.log('updated', changed);
628
625
  if (
629
626
  changed.has('displayMode') ||
630
627
  changed.has('baseNavigationUrl') ||
@@ -634,29 +631,12 @@ export class CollectionBrowser
634
631
  this.infiniteScroller?.reload();
635
632
  }
636
633
  if (changed.has('baseQuery')) {
637
- console.log(
638
- 'base query changed',
639
- changed.get('baseQuery'),
640
- this.baseQuery
641
- );
642
634
  this.emitBaseQueryChanged();
643
635
  }
644
636
  if (changed.has('searchType')) {
645
- console.log(
646
- 'search type changed',
647
- changed.get('searchType'),
648
- this.searchType
649
- );
650
637
  this.emitSearchTypeChanged();
651
638
  }
652
639
  if (changed.has('currentPage') || changed.has('displayMode')) {
653
- console.log(
654
- 'current page or display mode changed',
655
- changed.get('currentPage'),
656
- this.currentPage,
657
- changed.get('displayMode'),
658
- this.displayMode
659
- );
660
640
  this.persistState();
661
641
  }
662
642
  if (
@@ -666,14 +646,9 @@ export class CollectionBrowser
666
646
  changed.has('minSelectedDate') ||
667
647
  changed.has('maxSelectedDate') ||
668
648
  changed.has('sortParam') ||
669
- changed.has('selectedFacets')
649
+ changed.has('selectedFacets') ||
650
+ changed.has('searchService')
670
651
  ) {
671
- console.log(
672
- 'handling query change',
673
- changed,
674
- this.baseQuery,
675
- this.sortParam
676
- );
677
652
  this.handleQueryChange();
678
653
  }
679
654
  if (
@@ -808,11 +783,6 @@ export class CollectionBrowser
808
783
  private previousQueryKey?: string;
809
784
 
810
785
  private async handleQueryChange() {
811
- console.log(
812
- 'handleQueryChange',
813
- this.pageFetchQueryKey,
814
- this.previousQueryKey
815
- );
816
786
  // only reset if the query has actually changed
817
787
  if (!this.searchService || this.pageFetchQueryKey === this.previousQueryKey)
818
788
  return;
@@ -907,7 +877,6 @@ export class CollectionBrowser
907
877
  }
908
878
 
909
879
  private async doInitialPageFetch() {
910
- console.log('doInitialPageFetch');
911
880
  this.searchResultsLoading = true;
912
881
  await this.fetchPage(this.initialPageNumber);
913
882
  this.searchResultsLoading = false;
@@ -1186,10 +1155,8 @@ export class CollectionBrowser
1186
1155
  }
1187
1156
 
1188
1157
  private async fetchFacets() {
1189
- console.log('maybe fetch facets', this.filteredQuery);
1190
1158
  if (!this.filteredQuery) return;
1191
1159
 
1192
- console.log('fetching facets');
1193
1160
  const params: SearchParams = {
1194
1161
  query: this.filteredQuery,
1195
1162
  rows: 0,
@@ -1323,7 +1290,6 @@ export class CollectionBrowser
1323
1290
  private pageFetchesInProgress: Record<string, Set<number>> = {};
1324
1291
 
1325
1292
  async fetchPage(pageNumber: number) {
1326
- console.log('maybe fetch page', pageNumber, this.filteredQuery);
1327
1293
  if (!this.filteredQuery) return;
1328
1294
 
1329
1295
  // if we already have data, don't fetch again
@@ -1338,7 +1304,6 @@ export class CollectionBrowser
1338
1304
  if (pageFetches.has(pageNumber)) return;
1339
1305
  pageFetches.add(pageNumber);
1340
1306
  this.pageFetchesInProgress[pageFetchQueryKey] = pageFetches;
1341
- console.log('fetching page', pageNumber);
1342
1307
 
1343
1308
  const sortParams = this.sortParam ? [this.sortParam] : [];
1344
1309
  const params: SearchParams = {
@@ -90,7 +90,6 @@ export class RestorationStateHandler
90
90
  }
91
91
 
92
92
  private persistQueryStateToUrl(state: RestorationState) {
93
- console.log('persistQueryStateToUrl', state);
94
93
  const url = new URL(window.location.href);
95
94
  const { searchParams } = url;
96
95
  const oldParams = new URLSearchParams(searchParams);
@@ -161,8 +160,6 @@ export class RestorationStateHandler
161
160
  }
162
161
 
163
162
  // Ensure we aren't pushing an identical state to the stack
164
- console.log('old params', oldParams.toString());
165
- console.log('new params', searchParams.toString());
166
163
  if (
167
164
  oldParams.get('query') === searchParams.get('query') &&
168
165
  oldParams.get('sin') === searchParams.get('sin') &&
@@ -177,7 +174,6 @@ export class RestorationStateHandler
177
174
  searchParams.getAll('not[]').sort()
178
175
  )
179
176
  ) {
180
- console.log('Ignoring identical params');
181
177
  return;
182
178
  }
183
179
 
@@ -197,7 +193,6 @@ export class RestorationStateHandler
197
193
  }
198
194
 
199
195
  private loadQueryStateFromUrl(): RestorationState {
200
- console.log('loadQueryStateFromUrl', window.location.href);
201
196
  const url = new URL(window.location.href);
202
197
  const searchInside = url.searchParams.get('sin');
203
198
  const pageNumber = url.searchParams.get('page');