feat(nav): tabs, list views and name searches are named in the address

Settings, Configuration and Users name their tab (stab/cfgtab/utab); a link's tab wins and a tab pre-selected
while its page is on screen now switches it. A playlist's sort, filters and grouping (plsort/plf/plgroup), the
Files sort (fsort, always written) and the name searches of Channels, Files, Playlists and Plex (cq/fq/plq/pq+pqf)
reopen from the address; the searches are written once the typing pauses.
This commit is contained in:
2026-10-26 01:13:39 +01:00
parent 91d36b3357
commit d4f24de4ba
34 changed files with 728 additions and 130 deletions
+27 -3
View File
@@ -1,6 +1,30 @@
import { decodeSortParam, encodeSortParam, type SortState } from "./columnSort";
// The Files page's address-bar keys: the folder shown (`?folder=`, its encoding in
// modules/files/filesContext) and the file it turns to once (`?item=`). Here, beside the other pages'
// key lists, so the page's definition can declare them without importing its own folder.
// modules/files/filesContext), the file it turns to once (`?item=`), the name search (`?fq=`) and the
// sort (`?fsort=`). Here, beside the other pages' key lists, so the page's definition can declare them
// without importing its own folder.
export const FILES_FOLDER_KEY = "folder";
export const FILES_ITEM_KEY = "item";
export const FILES_KEYS = [FILES_FOLDER_KEY, FILES_ITEM_KEY] as const;
export const FILES_SEARCH_KEY = "fq";
export const FILES_SORT_KEY = "fsort";
export const FILES_KEYS = [
FILES_FOLDER_KEY,
FILES_ITEM_KEY,
FILES_SEARCH_KEY,
FILES_SORT_KEY,
] as const;
// The list's own order (no column sort) has a word of its own: the sort is always written, because a
// page opened without one takes the account's remembered sort, which may not be the one bookmarked.
const UNSORTED = "none";
export function encodeFilesSort(sort: SortState): string {
return encodeSortParam(sort) ?? UNSORTED;
}
/** The sort an address names; `undefined` when it names none (the remembered one applies). */
export function decodeFilesSort(raw: string | null): SortState | undefined {
if (raw == null) return undefined;
return raw === UNSORTED ? null : decodeSortParam(raw);
}