@internetarchive/collection-browser 3.3.4-alpha-webdev7761.0 → 3.3.4-alpha-webdev7761.1

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.
@@ -23,7 +23,7 @@ import './manage/manage-bar';
23
23
  import './collection-facets';
24
24
  import './circular-activity-indicator';
25
25
  import './collection-facets/smart-facets/smart-facet-bar';
26
- import { mergeSelectedFacets, updateSelectedFacetBucket, } from './utils/facet-utils';
26
+ import { updateSelectedFacetBucket, } from './utils/facet-utils';
27
27
  let CollectionBrowser = class CollectionBrowser extends LitElement {
28
28
  constructor() {
29
29
  super();
@@ -186,6 +186,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
186
186
  this.placeholderCellTemplate = html `<collection-browser-loading-tile></collection-browser-loading-tile>`;
187
187
  this.selectedTVNetwork = undefined;
188
188
  this.selectedTVShow = undefined;
189
+ this.shouldPopulateShows = false;
189
190
  /**
190
191
  * Updates the height of the left column according to its position on the page.
191
192
  * Arrow function ensures proper `this` binding.
@@ -361,32 +362,32 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
361
362
  this.setPlaceholderType();
362
363
  }
363
364
  render() {
364
- return html `
365
+ return html `
365
366
  ${this.showSmartFacetBar && this.placeholderType === null
366
- ? html `<smart-facet-bar
367
- .query=${this.baseQuery}
368
- .aggregations=${this.dataSource.aggregations}
369
- .selectedFacets=${this.selectedFacets}
370
- .collectionTitles=${this.dataSource.collectionTitles}
371
- .filterToggleShown=${!this.mobileView}
372
- .filterToggleActive=${this.facetPaneVisible}
373
- .label=${this.smartFacetBarLabel}
374
- @facetsChanged=${this.facetsChanged}
367
+ ? html `<smart-facet-bar
368
+ .query=${this.baseQuery}
369
+ .aggregations=${this.dataSource.aggregations}
370
+ .selectedFacets=${this.selectedFacets}
371
+ .collectionTitles=${this.dataSource.collectionTitles}
372
+ .filterToggleShown=${!this.mobileView}
373
+ .filterToggleActive=${this.facetPaneVisible}
374
+ .label=${this.smartFacetBarLabel}
375
+ @facetsChanged=${this.facetsChanged}
375
376
  @filtersToggled=${() => {
376
377
  this.facetPaneVisible = !this.facetPaneVisible;
377
378
  this.emitFacetPaneVisibilityChanged();
378
- }}
379
+ }}
379
380
  ></smart-facet-bar>`
380
- : nothing}
381
-
382
- <div
383
- id="content-container"
384
- class=${this.mobileView ? 'mobile' : 'desktop'}
385
- >
381
+ : nothing}
382
+
383
+ <div
384
+ id="content-container"
385
+ class=${this.mobileView ? 'mobile' : 'desktop'}
386
+ >
386
387
  ${this.placeholderType
387
388
  ? this.emptyPlaceholderTemplate
388
- : this.collectionBrowserTemplate}
389
- </div>
389
+ : this.collectionBrowserTemplate}
390
+ </div>
390
391
  `;
391
392
  }
392
393
  /**
@@ -432,23 +433,23 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
432
433
  */
433
434
  get emptyPlaceholderTemplate() {
434
435
  var _a;
435
- return html `
436
- <empty-placeholder
437
- .placeholderType=${this.placeholderType}
438
- ?isMobileView=${this.mobileView}
439
- ?isCollection=${!!this.withinCollection}
440
- .detailMessage=${(_a = this.dataSource.queryErrorMessage) !== null && _a !== void 0 ? _a : ''}
441
- .baseNavigationUrl=${this.baseNavigationUrl}
442
- ></empty-placeholder>
436
+ return html `
437
+ <empty-placeholder
438
+ .placeholderType=${this.placeholderType}
439
+ ?isMobileView=${this.mobileView}
440
+ ?isCollection=${!!this.withinCollection}
441
+ .detailMessage=${(_a = this.dataSource.queryErrorMessage) !== null && _a !== void 0 ? _a : ''}
442
+ .baseNavigationUrl=${this.baseNavigationUrl}
443
+ ></empty-placeholder>
443
444
  `;
444
445
  }
445
446
  /**
446
447
  * Top-level template for rendering the left (facets) and right (results) columns.
447
448
  */
448
449
  get collectionBrowserTemplate() {
449
- return html `
450
- <div id="left-column-scroll-sentinel"></div>
451
- ${this.leftColumnTemplate} ${this.rightColumnTemplate}
450
+ return html `
451
+ <div id="left-column-scroll-sentinel"></div>
452
+ ${this.leftColumnTemplate} ${this.rightColumnTemplate}
452
453
  `;
453
454
  }
454
455
  /**
@@ -467,33 +468,33 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
467
468
  * accordion-style facets.
468
469
  */
469
470
  get mobileLeftColumnTemplate() {
470
- return html `
471
- <div
472
- id="left-column"
473
- class="column${this.isResizeToMobile ? ' preload' : ''}"
474
- >
475
- ${this.facetTopViewSlot} ${this.resultsCountTemplate}
476
- <div id="facets-header-container">${this.mobileFacetsTemplate}</div>
477
- </div>
471
+ return html `
472
+ <div
473
+ id="left-column"
474
+ class="column${this.isResizeToMobile ? ' preload' : ''}"
475
+ >
476
+ ${this.facetTopViewSlot} ${this.resultsCountTemplate}
477
+ <div id="facets-header-container">${this.mobileFacetsTemplate}</div>
478
+ </div>
478
479
  `;
479
480
  }
480
481
  /**
481
482
  * Template for the desktop version of the left column, displaying the facets sidebar.
482
483
  */
483
484
  get desktopLeftColumnTemplate() {
484
- return html `
485
- <div id="left-column" class="column" ?hidden=${!this.facetPaneVisible}>
486
- ${this.facetTopViewSlot}
487
- <div id="facets-header-container">
488
- <h2 id="facets-header" class="sr-only">${msg('Filters')}</h2>
489
- ${this.resultsCountTemplate} ${this.clearFiltersBtnTemplate(false)}
490
- </div>
491
- <div id="facets-container" aria-labelledby="facets-header">
492
- ${this.facetsTemplate}
493
- <div id="facets-scroll-sentinel"></div>
494
- </div>
495
- <div id="facets-bottom-fade"></div>
496
- </div>
485
+ return html `
486
+ <div id="left-column" class="column" ?hidden=${!this.facetPaneVisible}>
487
+ ${this.facetTopViewSlot}
488
+ <div id="facets-header-container">
489
+ <h2 id="facets-header" class="sr-only">${msg('Filters')}</h2>
490
+ ${this.resultsCountTemplate} ${this.clearFiltersBtnTemplate(false)}
491
+ </div>
492
+ <div id="facets-container" aria-labelledby="facets-header">
493
+ ${this.facetsTemplate}
494
+ <div id="facets-scroll-sentinel"></div>
495
+ </div>
496
+ <div id="facets-bottom-fade"></div>
497
+ </div>
497
498
  `;
498
499
  }
499
500
  /**
@@ -501,8 +502,8 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
501
502
  * - mainly used to render userlists
502
503
  */
503
504
  get facetTopViewSlot() {
504
- return html `<div id="facet-top-view">
505
- <slot name="facet-top-slot"></slot>
505
+ return html `<div id="facet-top-view">
506
+ <slot name="facet-top-slot"></slot>
506
507
  </div>`;
507
508
  }
508
509
  /**
@@ -517,15 +518,15 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
517
518
  const resultsCount = (_a = this.totalResults) === null || _a === void 0 ? void 0 : _a.toLocaleString();
518
519
  const resultsLabel = this.totalResults === 1 ? 'Result' : 'Results';
519
520
  // Added data-testid for Playwright testing
520
- return html `
521
- <div id="results-total" data-testid="results-total">
522
- <span id="big-results-count">
523
- ${shouldShowSearching ? html `Searching&hellip;` : resultsCount}
524
- </span>
525
- <span id="big-results-label">
526
- ${shouldShowSearching ? nothing : resultsLabel}
527
- </span>
528
- </div>
521
+ return html `
522
+ <div id="results-total" data-testid="results-total">
523
+ <span id="big-results-count">
524
+ ${shouldShowSearching ? html `Searching&hellip;` : resultsCount}
525
+ </span>
526
+ <span id="big-results-label">
527
+ ${shouldShowSearching ? nothing : resultsLabel}
528
+ </span>
529
+ </div>
529
530
  `;
530
531
  }
531
532
  /**
@@ -538,45 +539,45 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
538
539
  'full-width': !this.facetPaneVisible,
539
540
  'smart-results-spacing': !!this.showSmartResults,
540
541
  });
541
- return html `
542
- <div id="right-column" class=${rightColumnClasses}>
542
+ return html `
543
+ <div id="right-column" class=${rightColumnClasses}>
543
544
  ${this.showSmartResults
544
545
  ? html `<slot name="smart-results"></slot>`
545
- : nothing}
546
- <section id="results">
547
- <h2 class="results-section-heading">
548
- <slot name="results-heading"></slot>
549
- </h2>
550
- <div id="cb-top-view">
551
- <slot name="cb-top-slot"></slot>
552
- </div>
546
+ : nothing}
547
+ <section id="results">
548
+ <h2 class="results-section-heading">
549
+ <slot name="results-heading"></slot>
550
+ </h2>
551
+ <div id="cb-top-view">
552
+ <slot name="cb-top-slot"></slot>
553
+ </div>
553
554
  ${this.isManageView
554
555
  ? this.manageBarTemplate
555
- : this.sortFilterBarTemplate}
556
- <slot name="cb-results"></slot>
556
+ : this.sortFilterBarTemplate}
557
+ <slot name="cb-results"></slot>
557
558
  ${this.displayMode === `list-compact` && this.totalResults
558
559
  ? this.listHeaderTemplate
559
- : nothing}
560
- ${this.suppressResultTiles ? nothing : this.infiniteScrollerTemplate}
561
- </section>
562
- </div>
560
+ : nothing}
561
+ ${this.suppressResultTiles ? nothing : this.infiniteScrollerTemplate}
562
+ </section>
563
+ </div>
563
564
  `;
564
565
  }
565
566
  /**
566
567
  * Template for the infinite scroller widget that contains the result tiles.
567
568
  */
568
569
  get infiniteScrollerTemplate() {
569
- return html `<infinite-scroller
570
- class=${this.infiniteScrollerClasses}
571
- itemCount=${this.placeholderType ? 0 : nothing}
572
- ariaLandmarkLabel="Search results"
573
- .cellProvider=${this}
574
- .placeholderCellTemplate=${this.placeholderCellTemplate}
575
- @scrollThresholdReached=${this.scrollThresholdReached}
576
- @visibleCellsChanged=${this.visibleCellsChanged}
570
+ return html `<infinite-scroller
571
+ class=${this.infiniteScrollerClasses}
572
+ itemCount=${this.placeholderType ? 0 : nothing}
573
+ ariaLandmarkLabel="Search results"
574
+ .cellProvider=${this}
575
+ .placeholderCellTemplate=${this.placeholderCellTemplate}
576
+ @scrollThresholdReached=${this.scrollThresholdReached}
577
+ @visibleCellsChanged=${this.visibleCellsChanged}
577
578
  >${this.displayMode === 'grid'
578
579
  ? html `<slot name="result-last-tile" slot="result-last-tile"></slot>`
579
- : nothing}
580
+ : nothing}
580
581
  </infinite-scroller>`;
581
582
  }
582
583
  /**
@@ -617,32 +618,32 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
617
618
  }
618
619
  // We only show relevance sort if a search query is currently defined
619
620
  sortFieldAvailability.relevance = this.isRelevanceSortAvailable;
620
- return html `
621
- <sort-filter-bar
622
- .defaultSortField=${this.defaultSortField}
623
- .defaultSortDirection=${this.defaultSortDirection}
624
- .defaultViewSort=${defaultViewSort}
625
- .defaultDateSort=${defaultDateSort}
626
- .selectedSort=${this.selectedSort}
627
- .sortDirection=${this.sortDirection}
628
- .sortFieldAvailability=${sortFieldAvailability}
629
- .displayMode=${this.displayMode}
630
- .selectedTitleFilter=${this.selectedTitleFilter}
631
- .selectedCreatorFilter=${this.selectedCreatorFilter}
632
- .prefixFilterCountMap=${this.dataSource.prefixFilterCountMap}
633
- .resizeObserver=${this.resizeObserver}
634
- .enableSortOptionsSlot=${this.enableSortOptionsSlot}
635
- .suppressDisplayModes=${this.suppressDisplayModes}
636
- @sortChanged=${this.userChangedSort}
637
- @displayModeChanged=${this.displayModeChanged}
638
- @titleLetterChanged=${this.titleLetterSelected}
639
- @creatorLetterChanged=${this.creatorLetterSelected}
640
- >
641
- ${this.tileBlurCheckboxTemplate}
642
- <slot name="sort-options-left" slot="sort-options-left"></slot>
643
- <slot name="sort-options" slot="sort-options"></slot>
644
- <slot name="sort-options-right" slot="sort-options-right"></slot>
645
- </sort-filter-bar>
621
+ return html `
622
+ <sort-filter-bar
623
+ .defaultSortField=${this.defaultSortField}
624
+ .defaultSortDirection=${this.defaultSortDirection}
625
+ .defaultViewSort=${defaultViewSort}
626
+ .defaultDateSort=${defaultDateSort}
627
+ .selectedSort=${this.selectedSort}
628
+ .sortDirection=${this.sortDirection}
629
+ .sortFieldAvailability=${sortFieldAvailability}
630
+ .displayMode=${this.displayMode}
631
+ .selectedTitleFilter=${this.selectedTitleFilter}
632
+ .selectedCreatorFilter=${this.selectedCreatorFilter}
633
+ .prefixFilterCountMap=${this.dataSource.prefixFilterCountMap}
634
+ .resizeObserver=${this.resizeObserver}
635
+ .enableSortOptionsSlot=${this.enableSortOptionsSlot}
636
+ .suppressDisplayModes=${this.suppressDisplayModes}
637
+ @sortChanged=${this.userChangedSort}
638
+ @displayModeChanged=${this.displayModeChanged}
639
+ @titleLetterChanged=${this.titleLetterSelected}
640
+ @creatorLetterChanged=${this.creatorLetterSelected}
641
+ >
642
+ ${this.tileBlurCheckboxTemplate}
643
+ <slot name="sort-options-left" slot="sort-options-left"></slot>
644
+ <slot name="sort-options" slot="sort-options"></slot>
645
+ <slot name="sort-options-right" slot="sort-options-right"></slot>
646
+ </sort-filter-bar>
646
647
  `;
647
648
  }
648
649
  /**
@@ -654,20 +655,20 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
654
655
  // Only show the checkbox for @archive.org users
655
656
  if (!((_a = this.dataSource.sessionContext) === null || _a === void 0 ? void 0 : _a.is_archive_user))
656
657
  return nothing;
657
- return html `
658
- <label
659
- id="tile-blur-label"
660
- for="tile-blur-check"
661
- slot="sort-options-right"
662
- >
663
- ${msg('Blurring')}
664
- <input
665
- id="tile-blur-check"
666
- type="checkbox"
667
- ?checked=${!this.shouldSuppressTileBlurring}
668
- @change=${this.tileBlurCheckboxChanged}
669
- />
670
- </label>
658
+ return html `
659
+ <label
660
+ id="tile-blur-label"
661
+ for="tile-blur-check"
662
+ slot="sort-options-right"
663
+ >
664
+ ${msg('Blurring')}
665
+ <input
666
+ id="tile-blur-check"
667
+ type="checkbox"
668
+ ?checked=${!this.shouldSuppressTileBlurring}
669
+ @change=${this.tileBlurCheckboxChanged}
670
+ />
671
+ </label>
671
672
  `;
672
673
  }
673
674
  /**
@@ -693,27 +694,27 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
693
694
  * showing the management view. This generally replaces the sort bar when present.
694
695
  */
695
696
  get manageBarTemplate() {
696
- return html `
697
- <manage-bar
698
- .label=${this.manageViewLabel}
699
- .modalManager=${this.modalManager}
700
- .selectedItems=${this.dataSource.checkedTileModels}
701
- .manageViewModalMsg=${this.manageViewModalMsg}
702
- showSelectAll
703
- showUnselectAll
704
- ?showItemManageButton=${this.pageContext === 'search'}
705
- ?removeAllowed=${this.dataSource.checkedTileModels.length !== 0}
706
- @removeItems=${this.handleRemoveItems}
707
- @manageItems=${this.handleManageItems}
708
- @selectAll=${() => this.dataSource.checkAllTiles()}
709
- @unselectAll=${() => this.dataSource.uncheckAllTiles()}
697
+ return html `
698
+ <manage-bar
699
+ .label=${this.manageViewLabel}
700
+ .modalManager=${this.modalManager}
701
+ .selectedItems=${this.dataSource.checkedTileModels}
702
+ .manageViewModalMsg=${this.manageViewModalMsg}
703
+ showSelectAll
704
+ showUnselectAll
705
+ ?showItemManageButton=${this.pageContext === 'search'}
706
+ ?removeAllowed=${this.dataSource.checkedTileModels.length !== 0}
707
+ @removeItems=${this.handleRemoveItems}
708
+ @manageItems=${this.handleManageItems}
709
+ @selectAll=${() => this.dataSource.checkAllTiles()}
710
+ @unselectAll=${() => this.dataSource.uncheckAllTiles()}
710
711
  @cancel=${() => {
711
712
  this.isManageView = false;
712
713
  this.dataSource.uncheckAllTiles();
713
714
  if (this.searchResultsLoading)
714
715
  this.dataSource.resetPages();
715
- }}
716
- ></manage-bar>
716
+ }}
717
+ ></manage-bar>
717
718
  `;
718
719
  }
719
720
  /**
@@ -961,15 +962,15 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
961
962
  label: target.open ? 'open' : 'closed',
962
963
  });
963
964
  };
964
- return html `
965
- <details id="mobile-filter-collapse" @toggle=${toggleFacetsVisible}>
966
- <summary>
967
- <span class="collapser-icon">${chevronIcon}</span>
968
- <h2>${msg('Filters')}</h2>
969
- ${this.clearFiltersBtnTemplate(true)}
970
- </summary>
971
- ${this.facetsTemplate}
972
- </details>
965
+ return html `
966
+ <details id="mobile-filter-collapse" @toggle=${toggleFacetsVisible}>
967
+ <summary>
968
+ <span class="collapser-icon">${chevronIcon}</span>
969
+ <h2>${msg('Filters')}</h2>
970
+ ${this.clearFiltersBtnTemplate(true)}
971
+ </summary>
972
+ ${this.facetsTemplate}
973
+ </details>
973
974
  `;
974
975
  }
975
976
  async networksDropdownClicked() {
@@ -982,41 +983,59 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
982
983
  var _a, _b;
983
984
  (_a = this.tvShowsDropdown) === null || _a === void 0 ? void 0 : _a.classList.add('loading');
984
985
  await this.dataSource.populateTVChannelMaps();
986
+ // Delay for a single tick so that the loading indicator will be rendered
987
+ // while the dropdown options are being added
988
+ await new Promise(res => setTimeout(res, 0));
989
+ this.shouldPopulateShows = true;
990
+ await this.updateComplete;
985
991
  (_b = this.tvShowsDropdown) === null || _b === void 0 ? void 0 : _b.classList.remove('loading');
986
992
  }
987
993
  async networksDropdownChanged() {
988
- var _a;
989
- if (((_a = this.tvNetworksDropdown) === null || _a === void 0 ? void 0 : _a.selectedIndex) === 0) {
990
- this.selectedTVNetwork = undefined;
991
- return;
992
- }
993
- this.selectedTVNetwork = this.tvNetworksDropdown.selectedOptions[0].value;
994
- let newNetworkFacets = getDefaultSelectedFacets();
995
- for (const [channel, network,] of this.dataSource.tvChannelMaps.channelToNetwork.entries()) {
996
- if (network === this.selectedTVNetwork) {
997
- newNetworkFacets = updateSelectedFacetBucket(newNetworkFacets, 'creator', {
994
+ const previousNetwork = this.selectedTVNetwork;
995
+ this.selectedTVNetwork =
996
+ this.tvNetworksDropdown.selectedOptions[0].value || undefined;
997
+ const entries = this.dataSource.tvChannelMaps.channelToNetwork.entries();
998
+ for (const [channel, network] of entries) {
999
+ if (network === previousNetwork) {
1000
+ // Remove any previously-applied network filter
1001
+ const removedBucket = {
1002
+ key: channel.toLowerCase(),
1003
+ count: 0,
1004
+ state: 'none',
1005
+ };
1006
+ this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, 'creator', removedBucket, true);
1007
+ }
1008
+ else if (network === this.selectedTVNetwork) {
1009
+ const newBucket = {
998
1010
  key: channel.toLowerCase(),
999
1011
  count: 0,
1000
1012
  state: 'selected',
1001
- });
1013
+ };
1014
+ this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, 'creator', newBucket);
1002
1015
  }
1003
1016
  }
1004
- log(newNetworkFacets);
1005
- this.selectedFacets = mergeSelectedFacets(this.selectedFacets, newNetworkFacets);
1006
- log(this.selectedFacets);
1007
1017
  }
1008
1018
  async showsDropdownChanged() {
1009
- var _a;
1010
- if (((_a = this.tvShowsDropdown) === null || _a === void 0 ? void 0 : _a.selectedIndex) === 0) {
1011
- this.selectedTVShow = undefined;
1012
- return;
1019
+ const previousShow = this.selectedTVShow;
1020
+ this.selectedTVShow =
1021
+ this.tvShowsDropdown.selectedOptions[0].value || undefined;
1022
+ // Remove any previously-applied shows filter
1023
+ if (previousShow !== undefined) {
1024
+ const removedBucket = {
1025
+ key: previousShow,
1026
+ count: 0,
1027
+ state: 'none',
1028
+ };
1029
+ this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, 'program', removedBucket, true);
1030
+ }
1031
+ if (this.selectedTVShow) {
1032
+ const newBucket = {
1033
+ key: this.selectedTVShow,
1034
+ count: 0,
1035
+ state: 'selected',
1036
+ };
1037
+ this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, 'program', newBucket);
1013
1038
  }
1014
- this.selectedTVShow = this.tvShowsDropdown.selectedOptions[0].value;
1015
- this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, 'program', {
1016
- key: this.selectedTVShow,
1017
- count: 0,
1018
- state: 'selected',
1019
- });
1020
1039
  }
1021
1040
  get tvDropdownFiltersTemplate() {
1022
1041
  if (this.searchType !== SearchType.TV)
@@ -1032,27 +1051,35 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1032
1051
  }
1033
1052
  const shows = showEntries.map(([show]) => show);
1034
1053
  log('end filters template preprocess', Date.now());
1035
- return html `
1036
- <div id="tv-filters" slot="facets-top">
1037
- <select
1038
- id="tv-networks"
1039
- class="tv-filter-dropdown"
1040
- @click=${this.networksDropdownClicked}
1041
- @change=${this.networksDropdownChanged}
1042
- >
1043
- <option selected value="">${msg('Filter by Network')}</option>
1044
- ${map(networks, n => html `<option>${n}</option>`)}
1045
- </select>
1046
- <select
1047
- id="tv-shows"
1048
- class="tv-filter-dropdown"
1049
- @click=${this.showsDropdownClicked}
1050
- @change=${this.showsDropdownChanged}
1051
- >
1052
- <option selected value="">${msg('Filter by Show')}</option>
1053
- ${map(shows, s => html `<option>${s}</option>`)}
1054
- </select>
1055
- </div>
1054
+ return html `
1055
+ <div id="tv-filters" slot="facets-top">
1056
+ <div class="tv-filter-dropdown-wrap">
1057
+ <select
1058
+ id="tv-networks"
1059
+ class="tv-filter-dropdown"
1060
+ @click=${this.networksDropdownClicked}
1061
+ @change=${this.networksDropdownChanged}
1062
+ >
1063
+ <option selected value="">${msg('Filter by Network')}</option>
1064
+ ${map(networks, n => html `<option>${n}</option>`)}
1065
+ </select>
1066
+ <img src="https://archive.org/images/loading.gif" />
1067
+ </div>
1068
+ <div class="tv-filter-dropdown-wrap">
1069
+ <select
1070
+ id="tv-shows"
1071
+ class="tv-filter-dropdown"
1072
+ @click=${this.showsDropdownClicked}
1073
+ @change=${this.showsDropdownChanged}
1074
+ >
1075
+ <option selected value="">${msg('Filter by Show')}</option>
1076
+ ${this.shouldPopulateShows
1077
+ ? map(shows, s => html `<option>${s}</option>`)
1078
+ : nothing}
1079
+ </select>
1080
+ <img src="https://archive.org/images/loading.gif" />
1081
+ </div>
1082
+ </div>
1056
1083
  `;
1057
1084
  }
1058
1085
  /**
@@ -1062,10 +1089,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1062
1089
  if (FACETLESS_PAGE_ELEMENTS.includes(this.profileElement))
1063
1090
  return nothing;
1064
1091
  if (this.facetLoadStrategy === 'off') {
1065
- return html `
1066
- <p class="facets-message">
1067
- ${msg('Facets are temporarily unavailable.')}
1068
- </p>
1092
+ return html `
1093
+ <p class="facets-message">
1094
+ ${msg('Facets are temporarily unavailable.')}
1095
+ </p>
1069
1096
  `;
1070
1097
  }
1071
1098
  // We switch to TV facet ordering & date picker if we are in a TV collection or showing TV search results
@@ -1074,46 +1101,46 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1074
1101
  const facetDisplayOrder = shouldUseTvInterface
1075
1102
  ? tvFacetDisplayOrder
1076
1103
  : defaultFacetDisplayOrder;
1077
- const facets = html `
1078
- <collection-facets
1079
- .collectionPagePath=${this.collectionPagePath}
1080
- .parentCollections=${this.dataSource.parentCollections}
1081
- .pageSpecifierParams=${this.dataSource.pageSpecifierParams}
1082
- .searchService=${this.searchService}
1083
- .featureFeedbackService=${this.featureFeedbackService}
1084
- .recaptchaManager=${this.recaptchaManager}
1085
- .resizeObserver=${this.resizeObserver}
1086
- .searchType=${this.searchType}
1087
- .aggregations=${this.dataSource.aggregations}
1088
- .histogramAggregation=${this.dataSource.histogramAggregation}
1089
- .minSelectedDate=${this.minSelectedDate}
1090
- .maxSelectedDate=${this.maxSelectedDate}
1091
- .selectedFacets=${this.selectedFacets}
1092
- .baseNavigationUrl=${this.baseNavigationUrl}
1093
- .collectionTitles=${this.dataSource.collectionTitles}
1094
- .tvChannelAliases=${this.dataSource.tvChannelAliases}
1095
- .showHistogramDatePicker=${this.showHistogramDatePicker}
1096
- .allowExpandingDatePicker=${!this.mobileView}
1097
- .allowDatePickerMonths=${shouldUseTvInterface}
1098
- .contentWidth=${this.contentWidth}
1099
- .query=${this.baseQuery}
1100
- .identifiers=${this.identifiers}
1101
- .filterMap=${this.dataSource.filterMap}
1102
- .isManageView=${this.isManageView}
1103
- .modalManager=${this.modalManager}
1104
- .analyticsHandler=${this.analyticsHandler}
1105
- .facetDisplayOrder=${facetDisplayOrder}
1106
- .isTvSearch=${shouldUseTvInterface}
1107
- ?collapsableFacets=${this.mobileView}
1108
- ?facetsLoading=${this.facetsLoading}
1109
- ?histogramAggregationLoading=${this.facetsLoading}
1110
- ?suppressMediatypeFacets=${this.suppressMediatypeFacets}
1111
- @facetClick=${this.facetClickHandler}
1112
- @facetsChanged=${this.facetsChanged}
1113
- @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
1114
- >
1115
- ${this.tvDropdownFiltersTemplate}
1116
- </collection-facets>
1104
+ const facets = html `
1105
+ <collection-facets
1106
+ .collectionPagePath=${this.collectionPagePath}
1107
+ .parentCollections=${this.dataSource.parentCollections}
1108
+ .pageSpecifierParams=${this.dataSource.pageSpecifierParams}
1109
+ .searchService=${this.searchService}
1110
+ .featureFeedbackService=${this.featureFeedbackService}
1111
+ .recaptchaManager=${this.recaptchaManager}
1112
+ .resizeObserver=${this.resizeObserver}
1113
+ .searchType=${this.searchType}
1114
+ .aggregations=${this.dataSource.aggregations}
1115
+ .histogramAggregation=${this.dataSource.histogramAggregation}
1116
+ .minSelectedDate=${this.minSelectedDate}
1117
+ .maxSelectedDate=${this.maxSelectedDate}
1118
+ .selectedFacets=${this.selectedFacets}
1119
+ .baseNavigationUrl=${this.baseNavigationUrl}
1120
+ .collectionTitles=${this.dataSource.collectionTitles}
1121
+ .tvChannelAliases=${this.dataSource.tvChannelAliases}
1122
+ .showHistogramDatePicker=${this.showHistogramDatePicker}
1123
+ .allowExpandingDatePicker=${!this.mobileView}
1124
+ .allowDatePickerMonths=${shouldUseTvInterface}
1125
+ .contentWidth=${this.contentWidth}
1126
+ .query=${this.baseQuery}
1127
+ .identifiers=${this.identifiers}
1128
+ .filterMap=${this.dataSource.filterMap}
1129
+ .isManageView=${this.isManageView}
1130
+ .modalManager=${this.modalManager}
1131
+ .analyticsHandler=${this.analyticsHandler}
1132
+ .facetDisplayOrder=${facetDisplayOrder}
1133
+ .isTvSearch=${shouldUseTvInterface}
1134
+ ?collapsableFacets=${this.mobileView}
1135
+ ?facetsLoading=${this.facetsLoading}
1136
+ ?histogramAggregationLoading=${this.facetsLoading}
1137
+ ?suppressMediatypeFacets=${this.suppressMediatypeFacets}
1138
+ @facetClick=${this.facetClickHandler}
1139
+ @facetsChanged=${this.facetsChanged}
1140
+ @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
1141
+ >
1142
+ ${this.tvDropdownFiltersTemplate}
1143
+ </collection-facets>
1117
1144
  `;
1118
1145
  // If we are using one of the opt-in facet load strategies, we may need to wrap the
1119
1146
  // desktop view facets in a <details> widget so that patrons can opt into loading them.
@@ -1121,20 +1148,20 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1121
1148
  const showDesktopOptInWidget = this.facetLoadStrategy === 'opt-in' ||
1122
1149
  (this.facetLoadStrategy === 'opt-in-or-login' && !this.loggedIn);
1123
1150
  if (showDesktopOptInWidget && !this.mobileView) {
1124
- return html `
1125
- <details
1126
- class="desktop-facets-dropdown"
1151
+ return html `
1152
+ <details
1153
+ class="desktop-facets-dropdown"
1127
1154
  @toggle=${(e) => {
1128
1155
  const target = e.target;
1129
1156
  this.collapsibleFacetsVisible = target.open;
1130
- }}
1131
- >
1132
- <summary>
1133
- <span class="collapser-icon">${chevronIcon}</span>
1134
- <h2>${msg('Filters')}</h2>
1135
- </summary>
1136
- ${facets}
1137
- </details>
1157
+ }}
1158
+ >
1159
+ <summary>
1160
+ <span class="collapser-icon">${chevronIcon}</span>
1161
+ <h2>${msg('Filters')}</h2>
1162
+ </summary>
1163
+ ${facets}
1164
+ </details>
1138
1165
  `;
1139
1166
  }
1140
1167
  // Otherwise, just render the facets component bare
@@ -1154,34 +1181,34 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1154
1181
  mobile,
1155
1182
  });
1156
1183
  const buttonText = mobile ? 'Clear all' : 'Clear all filters';
1157
- return html `
1158
- <div class="clear-filters-btn-row">
1184
+ return html `
1185
+ <div class="clear-filters-btn-row">
1159
1186
  ${mobile
1160
1187
  ? html `<span class="clear-filters-btn-separator">&nbsp;</span>`
1161
- : nothing}
1162
- <button class=${buttonClasses} @click=${this.clearFilters}>
1163
- ${buttonText}
1164
- </button>
1165
- </div>
1188
+ : nothing}
1189
+ <button class=${buttonClasses} @click=${this.clearFilters}>
1190
+ ${buttonText}
1191
+ </button>
1192
+ </div>
1166
1193
  `;
1167
1194
  }
1168
1195
  /**
1169
1196
  * Template for the table header content that appears atop the compact list view.
1170
1197
  */
1171
1198
  get listHeaderTemplate() {
1172
- return html `
1173
- <div id="list-header">
1174
- <tile-dispatcher
1175
- .tileDisplayMode=${'list-header'}
1176
- .resizeObserver=${this.resizeObserver}
1177
- .sortParam=${this.sortParam}
1178
- .defaultSortParam=${this.defaultSortParam}
1179
- .mobileBreakpoint=${this.mobileBreakpoint}
1180
- .loggedIn=${this.loggedIn}
1181
- .suppressBlurring=${this.shouldSuppressTileBlurring}
1182
- >
1183
- </tile-dispatcher>
1184
- </div>
1199
+ return html `
1200
+ <div id="list-header">
1201
+ <tile-dispatcher
1202
+ .tileDisplayMode=${'list-header'}
1203
+ .resizeObserver=${this.resizeObserver}
1204
+ .sortParam=${this.sortParam}
1205
+ .defaultSortParam=${this.defaultSortParam}
1206
+ .mobileBreakpoint=${this.mobileBreakpoint}
1207
+ .loggedIn=${this.loggedIn}
1208
+ .suppressBlurring=${this.shouldSuppressTileBlurring}
1209
+ >
1210
+ </tile-dispatcher>
1211
+ </div>
1185
1212
  `;
1186
1213
  }
1187
1214
  /**
@@ -1937,28 +1964,28 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1937
1964
  const isRadioSearch = this.searchType === SearchType.RADIO;
1938
1965
  const { isTVCollection, isRadioCollection } = this;
1939
1966
  const shouldUseLocalTime = isTVSearch || isRadioSearch || isTVCollection || isRadioCollection;
1940
- return html `
1941
- <tile-dispatcher
1942
- .collectionPagePath=${this.collectionPagePath}
1943
- .baseNavigationUrl=${this.baseNavigationUrl}
1944
- .baseImageUrl=${this.baseImageUrl}
1945
- .model=${model}
1946
- .tileDisplayMode=${this.displayMode}
1947
- .resizeObserver=${this.resizeObserver}
1948
- .collectionTitles=${this.dataSource.collectionTitles}
1949
- .sortParam=${this.sortParam}
1950
- .defaultSortParam=${this.defaultSortParam}
1951
- .creatorFilter=${this.selectedCreatorFilter}
1952
- .mobileBreakpoint=${this.mobileBreakpoint}
1953
- .loggedIn=${this.loggedIn}
1954
- .suppressBlurring=${this.shouldSuppressTileBlurring}
1955
- .isManageView=${this.isManageView}
1956
- ?showTvClips=${isTVSearch || isTVCollection}
1957
- ?enableHoverPane=${true}
1958
- ?useLocalTime=${shouldUseLocalTime}
1959
- @resultSelected=${(e) => this.resultSelected(e)}
1960
- >
1961
- </tile-dispatcher>
1967
+ return html `
1968
+ <tile-dispatcher
1969
+ .collectionPagePath=${this.collectionPagePath}
1970
+ .baseNavigationUrl=${this.baseNavigationUrl}
1971
+ .baseImageUrl=${this.baseImageUrl}
1972
+ .model=${model}
1973
+ .tileDisplayMode=${this.displayMode}
1974
+ .resizeObserver=${this.resizeObserver}
1975
+ .collectionTitles=${this.dataSource.collectionTitles}
1976
+ .sortParam=${this.sortParam}
1977
+ .defaultSortParam=${this.defaultSortParam}
1978
+ .creatorFilter=${this.selectedCreatorFilter}
1979
+ .mobileBreakpoint=${this.mobileBreakpoint}
1980
+ .loggedIn=${this.loggedIn}
1981
+ .suppressBlurring=${this.shouldSuppressTileBlurring}
1982
+ .isManageView=${this.isManageView}
1983
+ ?showTvClips=${isTVSearch || isTVCollection}
1984
+ ?enableHoverPane=${true}
1985
+ ?useLocalTime=${shouldUseLocalTime}
1986
+ @resultSelected=${(e) => this.resultSelected(e)}
1987
+ >
1988
+ </tile-dispatcher>
1962
1989
  `;
1963
1990
  }
1964
1991
  /**
@@ -1994,451 +2021,466 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1994
2021
  static get styles() {
1995
2022
  return [
1996
2023
  srOnlyStyle,
1997
- css `
1998
- :host {
1999
- display: block;
2000
- --leftColumnWidth: 18rem;
2001
- --leftColumnPaddingTop: 2rem;
2002
- --leftColumnPaddingRight: 2.5rem;
2003
- }
2004
-
2005
- #facet-top-view {
2006
- display: flex;
2007
- }
2008
-
2009
- /**
2010
- * When page width resizes from desktop to mobile, use this class to
2011
- * disable expand/collapse transition when loading.
2012
- */
2013
- .preload * {
2014
- transition: none !important;
2015
- -webkit-transition: none !important;
2016
- -moz-transition: none !important;
2017
- -ms-transition: none !important;
2018
- -o-transition: none !important;
2019
- }
2020
-
2021
- #content-container {
2022
- display: flex;
2023
- }
2024
-
2025
- empty-placeholder {
2026
- margin-top: var(--placeholderMarginTop, 0);
2027
- }
2028
-
2029
- .collapser-icon {
2030
- display: inline-block;
2031
- }
2032
-
2033
- .collapser-icon svg {
2034
- display: inline-block;
2035
- width: 12px;
2036
- height: 12px;
2037
- transition: transform 0.2s ease-out;
2038
- }
2039
-
2040
- #mobile-filter-collapse {
2041
- width: 100%;
2042
- }
2043
-
2044
- #mobile-filter-collapse > summary {
2045
- cursor: pointer;
2046
- list-style: none;
2047
- }
2048
-
2049
- #mobile-filter-collapse[open] > summary {
2050
- margin-bottom: 10px;
2051
- }
2052
-
2053
- #mobile-filter-collapse h2 {
2054
- display: inline-block;
2055
- margin: 0;
2056
- font-size: 2rem;
2057
- }
2058
-
2059
- #mobile-filter-collapse[open] svg {
2060
- transform: rotate(90deg);
2061
- }
2062
-
2063
- #content-container.mobile {
2064
- display: block;
2065
- }
2066
-
2067
- #right-column {
2068
- flex: 1;
2069
- position: relative;
2070
- min-height: 90vh;
2071
- border-right: 1px solid rgb(232, 232, 232);
2072
- margin-top: var(--rightColumnMarginTop, 0);
2073
- padding-top: var(--rightColumnPaddingTop, 2rem);
2074
- background: #fff;
2075
- }
2076
-
2077
- #left-column:not([hidden]) + #right-column {
2078
- border-left: 1px solid rgb(232, 232, 232);
2079
- }
2080
-
2081
- #right-column.smart-results-spacing {
2082
- padding-top: 0.5rem;
2083
- border-right: none;
2084
- background: transparent;
2085
- min-width: 0;
2086
- }
2087
-
2088
- #results {
2089
- background: #fff;
2090
- padding-left: 1rem;
2091
- padding-right: 1rem;
2092
- }
2093
-
2094
- #right-column.smart-results-spacing #results {
2095
- border-radius: 10px 10px 0px 0px;
2096
- padding-top: 0.5rem;
2097
- margin-top: 1rem;
2098
- }
2099
-
2100
- .mobile #right-column {
2101
- border-left: none;
2102
- }
2103
-
2104
- .mobile #results {
2105
- padding: 5px 5px 0;
2106
- }
2107
-
2108
- #left-column {
2109
- width: var(--leftColumnWidth, 18rem);
2110
- /* Prevents Safari from shrinking col at first draw */
2111
- min-width: var(--leftColumnWidth, 18rem);
2112
- padding-top: var(--leftColumnPaddingTop, 2rem);
2113
- /* Reduced padding by 0.2rem to add the invisible border in the rule below */
2114
- padding-right: calc(var(--leftColumnPaddingRight, 2.5rem) - 0.2rem);
2115
- border-right: 0.2rem solid transparent; /* Pads to the right of the scrollbar a bit */
2116
- z-index: 1;
2117
- }
2118
-
2119
- .desktop #left-column {
2120
- top: 0;
2121
- position: sticky;
2122
- height: calc(100vh - 2rem);
2123
- max-height: calc(100vh - 2rem);
2124
- overflow-x: hidden;
2125
- overflow-y: scroll;
2126
-
2127
- /*
2128
- * Firefox doesn't support any of the -webkit-scrollbar stuff below, but
2129
- * does at least give us a tiny bit of control over width & color.
2130
- */
2131
- scrollbar-width: thin;
2132
- scrollbar-color: transparent transparent;
2133
- }
2134
- .desktop #left-column:hover {
2135
- scrollbar-color: auto;
2136
- }
2137
- .desktop #left-column::-webkit-scrollbar {
2138
- appearance: none;
2139
- width: 6px;
2140
- }
2141
- .desktop #left-column::-webkit-scrollbar-button {
2142
- height: 3px;
2143
- background: transparent;
2144
- }
2145
- .desktop #left-column::-webkit-scrollbar-corner {
2146
- background: transparent;
2147
- }
2148
- .desktop #left-column::-webkit-scrollbar-thumb {
2149
- border-radius: 4px;
2150
- }
2151
- .desktop #left-column:hover::-webkit-scrollbar-thumb {
2152
- background: rgba(0, 0, 0, 0.15);
2153
- }
2154
- .desktop #left-column:hover::-webkit-scrollbar-thumb:hover {
2155
- background: rgba(0, 0, 0, 0.2);
2156
- }
2157
- .desktop #left-column:hover::-webkit-scrollbar-thumb:active {
2158
- background: rgba(0, 0, 0, 0.3);
2159
- }
2160
-
2161
- #facets-bottom-fade {
2162
- background: linear-gradient(
2163
- to bottom,
2164
- #f5f5f700 0%,
2165
- #f5f5f7c0 50%,
2166
- #f5f5f7 80%,
2167
- #f5f5f7 100%
2168
- );
2169
- position: fixed;
2170
- bottom: 0;
2171
- height: 50px;
2172
- /* Wide enough to cover the content, but leave the scrollbar uncovered */
2173
- width: calc(
2174
- var(--leftColumnWidth) + var(--leftColumnPaddingRight) - 10px
2175
- );
2176
- z-index: 2;
2177
- pointer-events: none;
2178
- transition: height 0.1s ease;
2179
- }
2180
- #facets-bottom-fade.hidden {
2181
- height: 0;
2182
- }
2183
-
2184
- .facets-message {
2185
- font-size: 1.4rem;
2186
- }
2187
-
2188
- .desktop-facets-dropdown > summary {
2189
- cursor: pointer;
2190
- list-style: none;
2191
- }
2192
-
2193
- .desktop-facets-dropdown h2 {
2194
- display: inline-block;
2195
- margin: 0;
2196
- font-size: 1.6rem;
2197
- }
2198
-
2199
- .desktop-facets-dropdown[open] > summary {
2200
- margin-bottom: 10px;
2201
- }
2202
-
2203
- .desktop-facets-dropdown[open] svg {
2204
- transform: rotate(90deg);
2205
- }
2206
-
2207
- .desktop #left-column-scroll-sentinel {
2208
- width: 1px;
2209
- height: 100vh;
2210
- background: transparent;
2211
- }
2212
-
2213
- .desktop #facets-scroll-sentinel {
2214
- width: 1px;
2215
- height: 1px;
2216
- background: transparent;
2217
- }
2218
-
2219
- #facets-header-container {
2220
- display: flex;
2221
- justify-content: space-between;
2222
- align-items: flex-start;
2223
- clear: both;
2224
- }
2225
-
2226
- .desktop #facets-header-container {
2227
- flex-wrap: wrap;
2228
- }
2229
-
2230
- .mobile #left-column {
2231
- width: 100%;
2232
- min-width: 0;
2233
- padding: 5px 0;
2234
- border: 0;
2235
- }
2236
-
2237
- .clear-filters-btn-row {
2238
- display: inline-block;
2239
- }
2240
-
2241
- .desktop .clear-filters-btn-row {
2242
- width: 100%;
2243
- }
2244
-
2245
- .clear-filters-btn {
2246
- display: inline-block;
2247
- appearance: none;
2248
- margin: 0;
2249
- padding: 0;
2250
- border: 0;
2251
- background: none;
2252
- color: var(--ia-theme-link-color);
2253
- font-size: 1.4rem;
2254
- font-family: inherit;
2255
- cursor: pointer;
2256
- }
2257
-
2258
- .clear-filters-btn:hover {
2259
- text-decoration: underline;
2260
- }
2261
-
2262
- .clear-filters-btn-separator {
2263
- display: inline-block;
2264
- margin-left: 5px;
2265
- border-left: 1px solid #2c2c2c;
2266
- font-size: 1.4rem;
2267
- line-height: 1.3rem;
2268
- }
2269
-
2270
- #tv-filters {
2271
- margin-bottom: 15px;
2272
- }
2273
-
2274
- .tv-filter-dropdown {
2275
- width: 100%;
2276
- padding: 3px;
2277
- margin-bottom: 5px;
2278
- }
2279
-
2280
- #facets-container {
2281
- position: relative;
2282
- max-height: 0;
2283
- transition: max-height 0.2s ease-in-out;
2284
- z-index: 1;
2285
- margin-top: var(--facetsContainerMarginTop, 5rem);
2286
- padding-bottom: 2rem;
2287
- }
2288
-
2289
- .desktop #facets-container {
2290
- width: 18rem;
2291
- }
2292
-
2293
- .mobile #facets-container {
2294
- overflow: hidden;
2295
- padding-bottom: 0;
2296
- padding-left: 10px;
2297
- padding-right: 10px;
2298
- }
2299
-
2300
- #facets-container.expanded {
2301
- max-height: 2000px;
2302
- }
2303
-
2304
- .results-section-heading {
2305
- margin: 0.5rem 0.3rem;
2306
- font-size: 2rem;
2307
- line-height: 25px;
2308
- }
2309
-
2310
- #results-total {
2311
- display: flex;
2312
- align-items: baseline;
2313
- }
2314
-
2315
- .mobile #results-total {
2316
- position: absolute;
2317
- right: 10px;
2318
- }
2319
-
2320
- #big-results-count {
2321
- font-size: 2.4rem;
2322
- font-weight: 500;
2323
- margin-right: 5px;
2324
- }
2325
-
2326
- .mobile #big-results-count {
2327
- font-size: 2rem;
2328
- }
2329
-
2330
- #big-results-label {
2331
- font-size: 1.4rem;
2332
- font-weight: 200;
2333
- }
2334
-
2335
- #list-header {
2336
- max-height: 4.2rem;
2337
- }
2338
-
2339
- .loading-cover {
2340
- position: absolute;
2341
- top: 0;
2342
- left: 0;
2343
- width: 100%;
2344
- height: 100%;
2345
- display: flex;
2346
- justify-content: center;
2347
- z-index: 1;
2348
- padding-top: 50px;
2349
- }
2350
-
2351
- #tile-blur-label {
2352
- display: flex;
2353
- align-items: center;
2354
- column-gap: 5px;
2355
- }
2356
-
2357
- #tile-blur-check {
2358
- margin: 0 5px 0 0;
2359
- width: 15px;
2360
- }
2361
-
2362
- circular-activity-indicator {
2363
- width: 30px;
2364
- height: 30px;
2365
- }
2366
-
2367
- sort-filter-bar {
2368
- display: block;
2369
- margin-bottom: 4rem;
2370
- }
2371
-
2372
- infinite-scroller {
2373
- display: block;
2374
- --infiniteScrollerRowGap: var(--collectionBrowserRowGap, 1.7rem);
2375
- --infiniteScrollerColGap: var(--collectionBrowserColGap, 1.7rem);
2376
- }
2377
-
2378
- infinite-scroller.list-compact {
2379
- --infiniteScrollerCellMinWidth: var(
2380
- --collectionBrowserCellMinWidth,
2381
- 100%
2382
- );
2383
- --infiniteScrollerCellMinHeight: 45px; /* override infinite scroller component */
2384
- --infiniteScrollerCellMaxHeight: 56px;
2385
- --infiniteScrollerRowGap: 10px;
2386
- }
2387
-
2388
- infinite-scroller.list-detail {
2389
- --infiniteScrollerCellMinWidth: var(
2390
- --collectionBrowserCellMinWidth,
2391
- 100%
2392
- );
2393
- --infiniteScrollerCellMinHeight: var(
2394
- --collectionBrowserCellMinHeight,
2395
- 5rem
2396
- );
2397
- /*
2398
- 30px in spec, compensating for a -4px margin
2399
- to align title with top of item image
2400
- src/tiles/list/tile-list.ts
2401
- */
2402
- --infiniteScrollerRowGap: 34px;
2403
- }
2404
-
2405
- .mobile infinite-scroller.list-detail {
2406
- --infiniteScrollerRowGap: 24px;
2407
- }
2408
-
2409
- infinite-scroller.grid {
2410
- --infiniteScrollerCellMinWidth: var(
2411
- --collectionBrowserCellMinWidth,
2412
- 17rem
2413
- );
2414
- --infiniteScrollerCellMaxWidth: var(
2415
- --collectionBrowserCellMaxWidth,
2416
- 1fr
2417
- );
2418
- }
2419
-
2420
- /* Allow tiles to shrink a bit further at smaller viewport widths */
2421
- @media screen and (max-width: 880px) {
2422
- infinite-scroller.grid {
2423
- --infiniteScrollerCellMinWidth: var(
2424
- --collectionBrowserCellMinWidth,
2425
- 15rem
2426
- );
2427
- }
2428
- }
2429
- /* At very small widths, maintain a 2-tile layout as far as it can reasonably go */
2430
- @media screen and (max-width: 360px) {
2431
- infinite-scroller.grid {
2432
- --infiniteScrollerCellMinWidth: var(
2433
- --collectionBrowserCellMinWidth,
2434
- 12rem
2435
- );
2436
- }
2437
- }
2438
-
2439
- infinite-scroller.hidden {
2440
- display: none;
2441
- }
2024
+ css `
2025
+ :host {
2026
+ display: block;
2027
+ --leftColumnWidth: 18rem;
2028
+ --leftColumnPaddingTop: 2rem;
2029
+ --leftColumnPaddingRight: 2.5rem;
2030
+ }
2031
+
2032
+ #facet-top-view {
2033
+ display: flex;
2034
+ }
2035
+
2036
+ /**
2037
+ * When page width resizes from desktop to mobile, use this class to
2038
+ * disable expand/collapse transition when loading.
2039
+ */
2040
+ .preload * {
2041
+ transition: none !important;
2042
+ -webkit-transition: none !important;
2043
+ -moz-transition: none !important;
2044
+ -ms-transition: none !important;
2045
+ -o-transition: none !important;
2046
+ }
2047
+
2048
+ #content-container {
2049
+ display: flex;
2050
+ }
2051
+
2052
+ empty-placeholder {
2053
+ margin-top: var(--placeholderMarginTop, 0);
2054
+ }
2055
+
2056
+ .collapser-icon {
2057
+ display: inline-block;
2058
+ }
2059
+
2060
+ .collapser-icon svg {
2061
+ display: inline-block;
2062
+ width: 12px;
2063
+ height: 12px;
2064
+ transition: transform 0.2s ease-out;
2065
+ }
2066
+
2067
+ #mobile-filter-collapse {
2068
+ width: 100%;
2069
+ }
2070
+
2071
+ #mobile-filter-collapse > summary {
2072
+ cursor: pointer;
2073
+ list-style: none;
2074
+ }
2075
+
2076
+ #mobile-filter-collapse[open] > summary {
2077
+ margin-bottom: 10px;
2078
+ }
2079
+
2080
+ #mobile-filter-collapse h2 {
2081
+ display: inline-block;
2082
+ margin: 0;
2083
+ font-size: 2rem;
2084
+ }
2085
+
2086
+ #mobile-filter-collapse[open] svg {
2087
+ transform: rotate(90deg);
2088
+ }
2089
+
2090
+ #content-container.mobile {
2091
+ display: block;
2092
+ }
2093
+
2094
+ #right-column {
2095
+ flex: 1;
2096
+ position: relative;
2097
+ min-height: 90vh;
2098
+ border-right: 1px solid rgb(232, 232, 232);
2099
+ margin-top: var(--rightColumnMarginTop, 0);
2100
+ padding-top: var(--rightColumnPaddingTop, 2rem);
2101
+ background: #fff;
2102
+ }
2103
+
2104
+ #left-column:not([hidden]) + #right-column {
2105
+ border-left: 1px solid rgb(232, 232, 232);
2106
+ }
2107
+
2108
+ #right-column.smart-results-spacing {
2109
+ padding-top: 0.5rem;
2110
+ border-right: none;
2111
+ background: transparent;
2112
+ min-width: 0;
2113
+ }
2114
+
2115
+ #results {
2116
+ background: #fff;
2117
+ padding-left: 1rem;
2118
+ padding-right: 1rem;
2119
+ }
2120
+
2121
+ #right-column.smart-results-spacing #results {
2122
+ border-radius: 10px 10px 0px 0px;
2123
+ padding-top: 0.5rem;
2124
+ margin-top: 1rem;
2125
+ }
2126
+
2127
+ .mobile #right-column {
2128
+ border-left: none;
2129
+ }
2130
+
2131
+ .mobile #results {
2132
+ padding: 5px 5px 0;
2133
+ }
2134
+
2135
+ #left-column {
2136
+ width: var(--leftColumnWidth, 18rem);
2137
+ /* Prevents Safari from shrinking col at first draw */
2138
+ min-width: var(--leftColumnWidth, 18rem);
2139
+ padding-top: var(--leftColumnPaddingTop, 2rem);
2140
+ /* Reduced padding by 0.2rem to add the invisible border in the rule below */
2141
+ padding-right: calc(var(--leftColumnPaddingRight, 2.5rem) - 0.2rem);
2142
+ border-right: 0.2rem solid transparent; /* Pads to the right of the scrollbar a bit */
2143
+ z-index: 1;
2144
+ }
2145
+
2146
+ .desktop #left-column {
2147
+ top: 0;
2148
+ position: sticky;
2149
+ height: calc(100vh - 2rem);
2150
+ max-height: calc(100vh - 2rem);
2151
+ overflow-x: hidden;
2152
+ overflow-y: scroll;
2153
+
2154
+ /*
2155
+ * Firefox doesn't support any of the -webkit-scrollbar stuff below, but
2156
+ * does at least give us a tiny bit of control over width & color.
2157
+ */
2158
+ scrollbar-width: thin;
2159
+ scrollbar-color: transparent transparent;
2160
+ }
2161
+ .desktop #left-column:hover {
2162
+ scrollbar-color: auto;
2163
+ }
2164
+ .desktop #left-column::-webkit-scrollbar {
2165
+ appearance: none;
2166
+ width: 6px;
2167
+ }
2168
+ .desktop #left-column::-webkit-scrollbar-button {
2169
+ height: 3px;
2170
+ background: transparent;
2171
+ }
2172
+ .desktop #left-column::-webkit-scrollbar-corner {
2173
+ background: transparent;
2174
+ }
2175
+ .desktop #left-column::-webkit-scrollbar-thumb {
2176
+ border-radius: 4px;
2177
+ }
2178
+ .desktop #left-column:hover::-webkit-scrollbar-thumb {
2179
+ background: rgba(0, 0, 0, 0.15);
2180
+ }
2181
+ .desktop #left-column:hover::-webkit-scrollbar-thumb:hover {
2182
+ background: rgba(0, 0, 0, 0.2);
2183
+ }
2184
+ .desktop #left-column:hover::-webkit-scrollbar-thumb:active {
2185
+ background: rgba(0, 0, 0, 0.3);
2186
+ }
2187
+
2188
+ #facets-bottom-fade {
2189
+ background: linear-gradient(
2190
+ to bottom,
2191
+ #f5f5f700 0%,
2192
+ #f5f5f7c0 50%,
2193
+ #f5f5f7 80%,
2194
+ #f5f5f7 100%
2195
+ );
2196
+ position: fixed;
2197
+ bottom: 0;
2198
+ height: 50px;
2199
+ /* Wide enough to cover the content, but leave the scrollbar uncovered */
2200
+ width: calc(
2201
+ var(--leftColumnWidth) + var(--leftColumnPaddingRight) - 10px
2202
+ );
2203
+ z-index: 2;
2204
+ pointer-events: none;
2205
+ transition: height 0.1s ease;
2206
+ }
2207
+ #facets-bottom-fade.hidden {
2208
+ height: 0;
2209
+ }
2210
+
2211
+ .facets-message {
2212
+ font-size: 1.4rem;
2213
+ }
2214
+
2215
+ .desktop-facets-dropdown > summary {
2216
+ cursor: pointer;
2217
+ list-style: none;
2218
+ }
2219
+
2220
+ .desktop-facets-dropdown h2 {
2221
+ display: inline-block;
2222
+ margin: 0;
2223
+ font-size: 1.6rem;
2224
+ }
2225
+
2226
+ .desktop-facets-dropdown[open] > summary {
2227
+ margin-bottom: 10px;
2228
+ }
2229
+
2230
+ .desktop-facets-dropdown[open] svg {
2231
+ transform: rotate(90deg);
2232
+ }
2233
+
2234
+ .desktop #left-column-scroll-sentinel {
2235
+ width: 1px;
2236
+ height: 100vh;
2237
+ background: transparent;
2238
+ }
2239
+
2240
+ .desktop #facets-scroll-sentinel {
2241
+ width: 1px;
2242
+ height: 1px;
2243
+ background: transparent;
2244
+ }
2245
+
2246
+ #facets-header-container {
2247
+ display: flex;
2248
+ justify-content: space-between;
2249
+ align-items: flex-start;
2250
+ clear: both;
2251
+ }
2252
+
2253
+ .desktop #facets-header-container {
2254
+ flex-wrap: wrap;
2255
+ }
2256
+
2257
+ .mobile #left-column {
2258
+ width: 100%;
2259
+ min-width: 0;
2260
+ padding: 5px 0;
2261
+ border: 0;
2262
+ }
2263
+
2264
+ .clear-filters-btn-row {
2265
+ display: inline-block;
2266
+ }
2267
+
2268
+ .desktop .clear-filters-btn-row {
2269
+ width: 100%;
2270
+ }
2271
+
2272
+ .clear-filters-btn {
2273
+ display: inline-block;
2274
+ appearance: none;
2275
+ margin: 0;
2276
+ padding: 0;
2277
+ border: 0;
2278
+ background: none;
2279
+ color: var(--ia-theme-link-color);
2280
+ font-size: 1.4rem;
2281
+ font-family: inherit;
2282
+ cursor: pointer;
2283
+ }
2284
+
2285
+ .clear-filters-btn:hover {
2286
+ text-decoration: underline;
2287
+ }
2288
+
2289
+ .clear-filters-btn-separator {
2290
+ display: inline-block;
2291
+ margin-left: 5px;
2292
+ border-left: 1px solid #2c2c2c;
2293
+ font-size: 1.4rem;
2294
+ line-height: 1.3rem;
2295
+ }
2296
+
2297
+ #tv-filters {
2298
+ margin-bottom: 15px;
2299
+ }
2300
+
2301
+ .tv-filter-dropdown {
2302
+ width: 100%;
2303
+ padding: 3px;
2304
+ }
2305
+
2306
+ .tv-filter-dropdown-wrap {
2307
+ display: flex;
2308
+ align-items: center;
2309
+ column-gap: 5px;
2310
+ margin-bottom: 5px;
2311
+ }
2312
+
2313
+ .tv-filter-dropdown-wrap > img {
2314
+ flex: 1;
2315
+ visibility: hidden;
2316
+ }
2317
+
2318
+ .tv-filter-dropdown.loading + img {
2319
+ visibility: visible;
2320
+ }
2321
+
2322
+ #facets-container {
2323
+ position: relative;
2324
+ max-height: 0;
2325
+ transition: max-height 0.2s ease-in-out;
2326
+ z-index: 1;
2327
+ margin-top: var(--facetsContainerMarginTop, 5rem);
2328
+ padding-bottom: 2rem;
2329
+ }
2330
+
2331
+ .desktop #facets-container {
2332
+ width: 18rem;
2333
+ }
2334
+
2335
+ .mobile #facets-container {
2336
+ overflow: hidden;
2337
+ padding-bottom: 0;
2338
+ padding-left: 10px;
2339
+ padding-right: 10px;
2340
+ }
2341
+
2342
+ #facets-container.expanded {
2343
+ max-height: 2000px;
2344
+ }
2345
+
2346
+ .results-section-heading {
2347
+ margin: 0.5rem 0.3rem;
2348
+ font-size: 2rem;
2349
+ line-height: 25px;
2350
+ }
2351
+
2352
+ #results-total {
2353
+ display: flex;
2354
+ align-items: baseline;
2355
+ }
2356
+
2357
+ .mobile #results-total {
2358
+ position: absolute;
2359
+ right: 10px;
2360
+ }
2361
+
2362
+ #big-results-count {
2363
+ font-size: 2.4rem;
2364
+ font-weight: 500;
2365
+ margin-right: 5px;
2366
+ }
2367
+
2368
+ .mobile #big-results-count {
2369
+ font-size: 2rem;
2370
+ }
2371
+
2372
+ #big-results-label {
2373
+ font-size: 1.4rem;
2374
+ font-weight: 200;
2375
+ }
2376
+
2377
+ #list-header {
2378
+ max-height: 4.2rem;
2379
+ }
2380
+
2381
+ .loading-cover {
2382
+ position: absolute;
2383
+ top: 0;
2384
+ left: 0;
2385
+ width: 100%;
2386
+ height: 100%;
2387
+ display: flex;
2388
+ justify-content: center;
2389
+ z-index: 1;
2390
+ padding-top: 50px;
2391
+ }
2392
+
2393
+ #tile-blur-label {
2394
+ display: flex;
2395
+ align-items: center;
2396
+ column-gap: 5px;
2397
+ }
2398
+
2399
+ #tile-blur-check {
2400
+ margin: 0 5px 0 0;
2401
+ width: 15px;
2402
+ }
2403
+
2404
+ circular-activity-indicator {
2405
+ width: 30px;
2406
+ height: 30px;
2407
+ }
2408
+
2409
+ sort-filter-bar {
2410
+ display: block;
2411
+ margin-bottom: 4rem;
2412
+ }
2413
+
2414
+ infinite-scroller {
2415
+ display: block;
2416
+ --infiniteScrollerRowGap: var(--collectionBrowserRowGap, 1.7rem);
2417
+ --infiniteScrollerColGap: var(--collectionBrowserColGap, 1.7rem);
2418
+ }
2419
+
2420
+ infinite-scroller.list-compact {
2421
+ --infiniteScrollerCellMinWidth: var(
2422
+ --collectionBrowserCellMinWidth,
2423
+ 100%
2424
+ );
2425
+ --infiniteScrollerCellMinHeight: 45px; /* override infinite scroller component */
2426
+ --infiniteScrollerCellMaxHeight: 56px;
2427
+ --infiniteScrollerRowGap: 10px;
2428
+ }
2429
+
2430
+ infinite-scroller.list-detail {
2431
+ --infiniteScrollerCellMinWidth: var(
2432
+ --collectionBrowserCellMinWidth,
2433
+ 100%
2434
+ );
2435
+ --infiniteScrollerCellMinHeight: var(
2436
+ --collectionBrowserCellMinHeight,
2437
+ 5rem
2438
+ );
2439
+ /*
2440
+ 30px in spec, compensating for a -4px margin
2441
+ to align title with top of item image
2442
+ src/tiles/list/tile-list.ts
2443
+ */
2444
+ --infiniteScrollerRowGap: 34px;
2445
+ }
2446
+
2447
+ .mobile infinite-scroller.list-detail {
2448
+ --infiniteScrollerRowGap: 24px;
2449
+ }
2450
+
2451
+ infinite-scroller.grid {
2452
+ --infiniteScrollerCellMinWidth: var(
2453
+ --collectionBrowserCellMinWidth,
2454
+ 17rem
2455
+ );
2456
+ --infiniteScrollerCellMaxWidth: var(
2457
+ --collectionBrowserCellMaxWidth,
2458
+ 1fr
2459
+ );
2460
+ }
2461
+
2462
+ /* Allow tiles to shrink a bit further at smaller viewport widths */
2463
+ @media screen and (max-width: 880px) {
2464
+ infinite-scroller.grid {
2465
+ --infiniteScrollerCellMinWidth: var(
2466
+ --collectionBrowserCellMinWidth,
2467
+ 15rem
2468
+ );
2469
+ }
2470
+ }
2471
+ /* At very small widths, maintain a 2-tile layout as far as it can reasonably go */
2472
+ @media screen and (max-width: 360px) {
2473
+ infinite-scroller.grid {
2474
+ --infiniteScrollerCellMinWidth: var(
2475
+ --collectionBrowserCellMinWidth,
2476
+ 12rem
2477
+ );
2478
+ }
2479
+ }
2480
+
2481
+ infinite-scroller.hidden {
2482
+ display: none;
2483
+ }
2442
2484
  `,
2443
2485
  ];
2444
2486
  }
@@ -2656,6 +2698,9 @@ __decorate([
2656
2698
  __decorate([
2657
2699
  state()
2658
2700
  ], CollectionBrowser.prototype, "selectedTVShow", void 0);
2701
+ __decorate([
2702
+ state()
2703
+ ], CollectionBrowser.prototype, "shouldPopulateShows", void 0);
2659
2704
  __decorate([
2660
2705
  query('#tv-networks')
2661
2706
  ], CollectionBrowser.prototype, "tvNetworksDropdown", void 0);