@internetarchive/collection-browser 3.4.1-alpha-webdev7761.0 → 3.4.1-alpha-webdev7761.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,6 +19,7 @@ import './manage/manage-bar';
19
19
  import './collection-facets';
20
20
  import './circular-activity-indicator';
21
21
  import './collection-facets/smart-facets/smart-facet-bar';
22
+ import './combo-box/ia-combo-box';
22
23
  export declare class CollectionBrowser extends LitElement implements InfiniteScrollerCellProviderInterface, SharedResizeObserverResizeHandlerInterface, CollectionBrowserSearchInterface {
23
24
  baseNavigationUrl?: string;
24
25
  baseImageUrl: string;
@@ -465,11 +466,13 @@ export declare class CollectionBrowser extends LitElement implements InfiniteScr
465
466
  private get mobileFacetsTemplate();
466
467
  private selectedTVNetwork?;
467
468
  private selectedTVShow?;
468
- private shouldPopulateShows;
469
+ private tvMapsPopulated;
470
+ private loadingNetworks;
471
+ private loadingShows;
469
472
  private tvNetworksDropdown?;
470
473
  private tvShowsDropdown?;
471
- private networksDropdownClicked;
472
- private showsDropdownClicked;
474
+ private networksDropdownToggled;
475
+ private showsDropdownToggled;
473
476
  private networksDropdownChanged;
474
477
  private showsDropdownChanged;
475
478
  private get tvDropdownFiltersTemplate();
@@ -1,7 +1,6 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { html, css, LitElement, nothing, } from 'lit';
3
3
  import { customElement, property, query, state } from 'lit/decorators.js';
4
- import { map } from 'lit/directives/map.js';
5
4
  import { classMap } from 'lit/directives/class-map.js';
6
5
  import { msg } from '@lit/localize';
7
6
  import { SearchType, } from '@internetarchive/search-service';
@@ -15,6 +14,7 @@ import chevronIcon from './assets/img/icons/chevron';
15
14
  import { srOnlyStyle } from './styles/sr-only';
16
15
  import { sha1 } from './utils/sha1';
17
16
  import { log } from './utils/log';
17
+ import { updateSelectedFacetBucket } from './utils/facet-utils';
18
18
  import './empty-placeholder';
19
19
  import './tiles/tile-dispatcher';
20
20
  import './tiles/collection-browser-loading-tile';
@@ -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 { updateSelectedFacetBucket, } from './utils/facet-utils';
26
+ import './combo-box/ia-combo-box';
27
27
  let CollectionBrowser = class CollectionBrowser extends LitElement {
28
28
  constructor() {
29
29
  super();
@@ -186,7 +186,9 @@ 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
+ this.tvMapsPopulated = false;
190
+ this.loadingNetworks = false;
191
+ this.loadingShows = false;
190
192
  /**
191
193
  * Updates the height of the left column according to its position on the page.
192
194
  * Arrow function ensures proper `this` binding.
@@ -338,10 +340,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
338
340
  this.selectedTVNetwork = undefined;
339
341
  this.selectedTVShow = undefined;
340
342
  if (this.tvNetworksDropdown) {
341
- this.tvNetworksDropdown.selectedIndex = 0;
343
+ this.tvNetworksDropdown.clearSelectedOption();
342
344
  }
343
345
  if (this.tvShowsDropdown) {
344
- this.tvShowsDropdown.selectedIndex = 0;
346
+ this.tvShowsDropdown.clearSelectedOption();
345
347
  }
346
348
  }
347
349
  /**
@@ -987,27 +989,27 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
987
989
  </details>
988
990
  `;
989
991
  }
990
- async networksDropdownClicked() {
991
- var _a, _b;
992
- (_a = this.tvNetworksDropdown) === null || _a === void 0 ? void 0 : _a.classList.add('loading');
992
+ async networksDropdownToggled() {
993
+ if (this.tvMapsPopulated)
994
+ return;
995
+ this.loadingNetworks = true;
993
996
  await this.dataSource.populateTVChannelMaps();
994
- (_b = this.tvNetworksDropdown) === null || _b === void 0 ? void 0 : _b.classList.remove('loading');
997
+ this.loadingNetworks = false;
998
+ this.tvMapsPopulated = true;
995
999
  }
996
- async showsDropdownClicked() {
997
- var _a, _b;
998
- (_a = this.tvShowsDropdown) === null || _a === void 0 ? void 0 : _a.classList.add('loading');
1000
+ async showsDropdownToggled() {
1001
+ if (this.tvMapsPopulated)
1002
+ return;
1003
+ this.loadingShows = true;
999
1004
  await this.dataSource.populateTVChannelMaps();
1000
- // Delay for a single tick so that the loading indicator will be rendered
1001
- // while the dropdown options are being added
1002
- await new Promise(res => setTimeout(res, 0));
1003
- this.shouldPopulateShows = true;
1004
- await this.updateComplete;
1005
- (_b = this.tvShowsDropdown) === null || _b === void 0 ? void 0 : _b.classList.remove('loading');
1005
+ this.loadingShows = false;
1006
+ this.tvMapsPopulated = true;
1006
1007
  }
1007
1008
  async networksDropdownChanged() {
1009
+ var _a;
1008
1010
  const previousNetwork = this.selectedTVNetwork;
1009
- this.selectedTVNetwork =
1010
- this.tvNetworksDropdown.selectedOptions[0].value || undefined;
1011
+ const newNetwork = (_a = this.tvNetworksDropdown.selectedOption) === null || _a === void 0 ? void 0 : _a.text;
1012
+ this.selectedTVNetwork = newNetwork !== null && newNetwork !== void 0 ? newNetwork : undefined;
1011
1013
  const entries = this.dataSource.tvChannelMaps.channelToNetwork.entries();
1012
1014
  for (const [channel, network] of entries) {
1013
1015
  if (network === previousNetwork) {
@@ -1030,9 +1032,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1030
1032
  }
1031
1033
  }
1032
1034
  async showsDropdownChanged() {
1035
+ var _a;
1033
1036
  const previousShow = this.selectedTVShow;
1034
- this.selectedTVShow =
1035
- this.tvShowsDropdown.selectedOptions[0].value || undefined;
1037
+ const newShow = (_a = this.tvShowsDropdown.selectedOption) === null || _a === void 0 ? void 0 : _a.text;
1038
+ this.selectedTVShow = newShow !== null && newShow !== void 0 ? newShow : undefined;
1036
1039
  // Remove any previously-applied shows filter
1037
1040
  if (previousShow !== undefined) {
1038
1041
  const removedBucket = {
@@ -1065,48 +1068,42 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1065
1068
  }
1066
1069
  const shows = showEntries.map(([show]) => show);
1067
1070
  log('end filters template preprocess', Date.now());
1068
- const makeNetworkOption = (network) => html `
1069
- <option ?selected=${this.selectedTVNetwork === network}>
1070
- ${network}
1071
- </option>
1072
- `;
1073
- const makeShowOption = (show) => html `
1074
- <option ?selected=${this.selectedTVShow === show}>${show}</option>
1075
- `;
1076
1071
  const loadingIndicator = html `
1077
1072
  <img src="https://archive.org/images/loading.gif" />
1078
1073
  `;
1079
1074
  return html `
1080
1075
  <div id="tv-filters" slot="facets-top">
1081
- <div class="tv-filter-dropdown-wrap">
1082
- <select
1083
- id="tv-networks"
1084
- class="tv-filter-dropdown"
1085
- @click=${this.networksDropdownClicked}
1086
- @change=${this.networksDropdownChanged}
1087
- >
1088
- <option value="" ?selected=${!this.selectedTVNetwork}>
1089
- ${msg('Filter by Network')}
1090
- </option>
1091
- ${map(networks, makeNetworkOption)}
1092
- </select>
1093
- ${loadingIndicator}
1094
- </div>
1095
-
1096
- <div class="tv-filter-dropdown-wrap">
1097
- <select
1098
- id="tv-shows"
1099
- class="tv-filter-dropdown"
1100
- @click=${this.showsDropdownClicked}
1101
- @change=${this.showsDropdownChanged}
1102
- >
1103
- <option value="" ?selected=${!this.selectedTVShow}>
1104
- ${msg('Filter by Show')}
1105
- </option>
1106
- ${this.shouldPopulateShows ? map(shows, makeShowOption) : nothing}
1107
- </select>
1108
- ${loadingIndicator}
1109
- </div>
1076
+ <ia-combo-box
1077
+ id="tv-networks"
1078
+ class="tv-filter-dropdown"
1079
+ placeholder="Filter by Network"
1080
+ wrap-arrow-keys
1081
+ sort
1082
+ .options=${networks.map((n, i) => ({ id: `network-${i}`, text: n }))}
1083
+ @toggle=${this.networksDropdownToggled}
1084
+ @change=${this.networksDropdownChanged}
1085
+ >
1086
+ <span class="sr-only">${msg('Filter by Network')}</span>
1087
+ ${this.loadingNetworks
1088
+ ? html `<span slot="empty-options">${loadingIndicator}</span>`
1089
+ : nothing}
1090
+ </ia-combo-box>
1091
+ <ia-combo-box
1092
+ id="tv-shows"
1093
+ class="tv-filter-dropdown"
1094
+ placeholder="Filter by Show"
1095
+ max-autocomplete-entries="500"
1096
+ wrap-arrow-keys
1097
+ sort
1098
+ .options=${shows.map((s, i) => ({ id: `show-${i}`, text: s }))}
1099
+ @toggle=${this.showsDropdownToggled}
1100
+ @change=${this.showsDropdownChanged}
1101
+ >
1102
+ <span class="sr-only">${msg('Filter by Show')}</span>
1103
+ ${this.loadingShows
1104
+ ? html `<span slot="empty-options">${loadingIndicator}</span>`
1105
+ : nothing}
1106
+ </ia-combo-box>
1110
1107
  </div>
1111
1108
  `;
1112
1109
  }
@@ -2216,10 +2213,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
2216
2213
  #facets-bottom-fade {
2217
2214
  background: linear-gradient(
2218
2215
  to bottom,
2219
- #f5f5f700 0%,
2220
- #f5f5f7c0 50%,
2221
- #f5f5f7 80%,
2222
- #f5f5f7 100%
2216
+ #fbfbfd00 0%,
2217
+ #fbfbfdc0 50%,
2218
+ #fbfbfd 80%,
2219
+ #fbfbfd 100%
2223
2220
  );
2224
2221
  position: fixed;
2225
2222
  bottom: 0;
@@ -2326,25 +2323,24 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
2326
2323
  margin-bottom: 15px;
2327
2324
  }
2328
2325
 
2329
- .tv-filter-dropdown {
2330
- width: 100%;
2331
- padding: 3px;
2326
+ #tv-shows {
2327
+ --comboBoxListWidth: 300px;
2332
2328
  }
2333
2329
 
2334
- .tv-filter-dropdown-wrap {
2335
- display: flex;
2336
- align-items: center;
2337
- column-gap: 5px;
2330
+ .tv-filter-dropdown {
2331
+ display: block;
2332
+ font-size: 14px;
2333
+ margin-left: 1px;
2338
2334
  margin-bottom: 5px;
2339
2335
  }
2340
2336
 
2341
- .tv-filter-dropdown-wrap > img {
2342
- flex: 1;
2343
- visibility: hidden;
2337
+ .tv-filter-dropdown::part(combo-box) {
2338
+ outline-offset: 1px;
2344
2339
  }
2345
2340
 
2346
- .tv-filter-dropdown.loading + img {
2347
- visibility: visible;
2341
+ .tv-filter-dropdown::part(option) {
2342
+ line-height: 1.1;
2343
+ padding: 7px;
2348
2344
  }
2349
2345
 
2350
2346
  #facets-container {
@@ -2728,7 +2724,13 @@ __decorate([
2728
2724
  ], CollectionBrowser.prototype, "selectedTVShow", void 0);
2729
2725
  __decorate([
2730
2726
  state()
2731
- ], CollectionBrowser.prototype, "shouldPopulateShows", void 0);
2727
+ ], CollectionBrowser.prototype, "tvMapsPopulated", void 0);
2728
+ __decorate([
2729
+ state()
2730
+ ], CollectionBrowser.prototype, "loadingNetworks", void 0);
2731
+ __decorate([
2732
+ state()
2733
+ ], CollectionBrowser.prototype, "loadingShows", void 0);
2732
2734
  __decorate([
2733
2735
  query('#tv-networks')
2734
2736
  ], CollectionBrowser.prototype, "tvNetworksDropdown", void 0);