Skip to content

Commit f5502ff

Browse files
authored
WEBDEV-7757 Adjust sort options shown for TV searches (#494)
* Adjust sort bar to make list of sort options configurable * Adjust sort bar template with new display logic * Improve template readability/consistency a bit * Add dom.iterable to tsconfig * Add & update unit tests * Better organize sort option templates * Update unit tests * Switch views/date sort display type depending on available options * Simplify views/date sort availability
1 parent 97b42ad commit f5502ff

File tree

5 files changed

+502
-141
lines changed

5 files changed

+502
-141
lines changed

src/collection-browser.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ import {
4747
tvFacetDisplayOrder,
4848
TvClipFilterType,
4949
TileBlurOverrideState,
50+
defaultSortAvailability,
51+
favoritesSortAvailability,
52+
tvSortAvailability,
5053
} from './models';
5154
import {
5255
RestorationStateHandlerInterface,
@@ -802,14 +805,37 @@ export class CollectionBrowser
802805
private get sortFilterBarTemplate(): TemplateResult | typeof nothing {
803806
if (this.suppressSortBar) return nothing;
804807

808+
// Determine the set of sortable fields that should be shown in the sort bar
809+
let defaultViewSort = SortField.weeklyview;
810+
let defaultDateSort = SortField.date;
811+
let sortFieldAvailability = defaultSortAvailability;
812+
813+
// We adjust the sort options for a couple of special cases...
814+
if (this.withinCollection?.startsWith('fav-')) {
815+
// When viewing a fav- collection, we include the Date Favorited option and show
816+
// it as the default in the date dropdown.
817+
defaultDateSort = SortField.datefavorited;
818+
sortFieldAvailability = favoritesSortAvailability;
819+
} else if (!this.withinCollection && this.searchType === SearchType.TV) {
820+
// When viewing TV search results, we default the views dropdown to All-time Views
821+
// and exclude several of the usual date sort options.
822+
defaultViewSort = SortField.alltimeview;
823+
defaultDateSort = SortField.datearchived;
824+
sortFieldAvailability = tvSortAvailability;
825+
}
826+
827+
// We only show relevance sort if a search query is currently defined
828+
sortFieldAvailability.relevance = this.isRelevanceSortAvailable;
829+
805830
return html`
806831
<sort-filter-bar
807832
.defaultSortField=${this.defaultSortField}
808833
.defaultSortDirection=${this.defaultSortDirection}
834+
.defaultViewSort=${defaultViewSort}
835+
.defaultDateSort=${defaultDateSort}
809836
.selectedSort=${this.selectedSort}
810837
.sortDirection=${this.sortDirection}
811-
.showRelevance=${this.isRelevanceSortAvailable}
812-
.showDateFavorited=${this.withinCollection?.startsWith('fav-')}
838+
.sortFieldAvailability=${sortFieldAvailability}
813839
.displayMode=${this.displayMode}
814840
.selectedTitleFilter=${this.selectedTitleFilter}
815841
.selectedCreatorFilter=${this.selectedCreatorFilter}

src/models.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,27 @@ export enum SortField {
322322
'creator' = 'creator',
323323
}
324324

325+
/**
326+
* Views-related sort fields
327+
*/
328+
export const ALL_VIEWS_SORT_FIELDS = [
329+
SortField.weeklyview,
330+
SortField.alltimeview,
331+
] as const;
332+
export type ViewsSortField = (typeof ALL_VIEWS_SORT_FIELDS)[number];
333+
334+
/**
335+
* Date-related sort fields
336+
*/
337+
export const ALL_DATE_SORT_FIELDS = [
338+
SortField.datefavorited,
339+
SortField.date,
340+
SortField.datearchived,
341+
SortField.datereviewed,
342+
SortField.dateadded,
343+
] as const;
344+
export type DateSortField = (typeof ALL_DATE_SORT_FIELDS)[number];
345+
325346
export interface SortOption {
326347
/**
327348
* The SortField enum member corresponding to this option.
@@ -532,6 +553,33 @@ export function sortOptionFromAPIString(sortName?: string | null): SortOption {
532553
);
533554
}
534555

556+
export const defaultSortAvailability: Record<SortField, boolean> = {
557+
[SortField.relevance]: true,
558+
[SortField.weeklyview]: true,
559+
[SortField.alltimeview]: true,
560+
[SortField.title]: true,
561+
[SortField.datefavorited]: false,
562+
[SortField.date]: true,
563+
[SortField.datearchived]: true,
564+
[SortField.datereviewed]: true,
565+
[SortField.dateadded]: true,
566+
[SortField.creator]: true,
567+
[SortField.default]: false,
568+
[SortField.unrecognized]: false,
569+
};
570+
571+
export const favoritesSortAvailability: Record<SortField, boolean> = {
572+
...defaultSortAvailability,
573+
[SortField.datefavorited]: true,
574+
};
575+
576+
export const tvSortAvailability: Record<SortField, boolean> = {
577+
...defaultSortAvailability,
578+
[SortField.date]: false,
579+
[SortField.datereviewed]: false,
580+
[SortField.dateadded]: false,
581+
};
582+
535583
export const defaultProfileElementSorts: Record<
536584
string,
537585
Exclude<SortField, SortField.default>

0 commit comments

Comments
 (0)