From e6378e1f0d3b0f2a7604b8ef6097dba9050cdd16 Mon Sep 17 00:00:00 2001 From: Caleb Allen Date: Sun, 1 Mar 2026 10:06:56 -0500 Subject: [PATCH] feat(quick-7): wire frontend pin-default-playlist feature end-to-end - Add pinDefault state, getter, setter to favorites-store - Add pinDefault getter and setPinDefault to favorites-controller - Update sortedEntries in playlist-view to pin default playlist to top - Add Pin to Top toggle in config page Favorites section - Add Wails bindings for GetPinDefaultPlaylist/SetPinDefaultPlaylist - React to PinDefault in FavoritesConfigChanged event payload --- .../src/components/config-page/config-page.ts | 27 +++++++++++++++++ .../components/playlist-view/playlist-view.ts | 16 ++++++++++ .../store/controllers/favorites-controller.ts | 10 +++++++ frontend/src/store/favorites-store.ts | 29 ++++++++++++++++--- frontend/wailsjs/go/config/Config.d.ts | 4 +++ frontend/wailsjs/go/config/Config.js | 8 +++++ 6 files changed, 90 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/config-page/config-page.ts b/frontend/src/components/config-page/config-page.ts index 69683fb..511adfb 100644 --- a/frontend/src/components/config-page/config-page.ts +++ b/frontend/src/components/config-page/config-page.ts @@ -819,6 +819,21 @@ export class ConfigPage extends LitElement { }); }; + private handlePinDefaultChange = ( + e: CustomEvent, + ): void => { + const pin = Boolean(e.detail.value); + + this.favCtrl + .setPinDefault(pin) + .catch((err: unknown) => { + console.error( + 'Failed to set pin default:', + err, + ); + }); + }; + // =================================================================== // TRACK LIST COLUMN HANDLERS // =================================================================== @@ -1082,6 +1097,18 @@ export class ConfigPage extends LitElement { .iconStyle} @config-change=${this.handleFavIconStyleChange} > + + `; } diff --git a/frontend/src/components/playlist-view/playlist-view.ts b/frontend/src/components/playlist-view/playlist-view.ts index 9862fac..fc0430e 100644 --- a/frontend/src/components/playlist-view/playlist-view.ts +++ b/frontend/src/components/playlist-view/playlist-view.ts @@ -1042,6 +1042,22 @@ export class PlaylistView this.sortDirection === 'asc' ? 1 : -1; return [...entries].sort((a, b) => { + // Pin default playlist to top when enabled. + if (this.favCtrl.pinDefault) { + const aIsDefault = + a.summary.ID === + this.favCtrl.playlistId; + const bIsDefault = + b.summary.ID === + this.favCtrl.playlistId; + + if (aIsDefault && !bIsDefault) + return -1; + + if (!aIsDefault && bIsDefault) + return 1; + } + let cmp = 0; switch (this.sortField) { diff --git a/frontend/src/store/controllers/favorites-controller.ts b/frontend/src/store/controllers/favorites-controller.ts index 35c0780..90c921b 100644 --- a/frontend/src/store/controllers/favorites-controller.ts +++ b/frontend/src/store/controllers/favorites-controller.ts @@ -69,6 +69,10 @@ export class FavoritesController return favoritesStore.getPlaylistId(); } + get pinDefault(): boolean { + return favoritesStore.getPinDefault(); + } + /** * Returns the icon name for the current icon style. */ @@ -113,4 +117,10 @@ export class FavoritesController ): Promise { await favoritesStore.setDefaultPlaylist(id); } + + async setPinDefault( + pin: boolean, + ): Promise { + await favoritesStore.setPinDefault(pin); + } } diff --git a/frontend/src/store/favorites-store.ts b/frontend/src/store/favorites-store.ts index db9b507..8b3f136 100644 --- a/frontend/src/store/favorites-store.ts +++ b/frontend/src/store/favorites-store.ts @@ -9,8 +9,10 @@ import { import { GetFavoritesIconStyle, GetFavoritesPlaylistID, + GetPinDefaultPlaylist, SetFavoritesIconStyle, SetFavoritesPlaylistID, + SetPinDefaultPlaylist, } from '@go/config/Config'; import { Events } from '../events'; @@ -29,6 +31,7 @@ class FavoritesStore { private playlistId = 0; private playlistName = 'Favorites'; private iconStyle: IconStyle = 'heart'; + private pinDefault = true; private favoritedPaths = new Set(); private subscribers = new Set(); private loading = false; @@ -44,10 +47,13 @@ class FavoritesStore { (data: { PlaylistID: number; IconStyle: string; + PinDefault: boolean; }) => { this.playlistId = data.PlaylistID; this.iconStyle = data.IconStyle as IconStyle; + this.pinDefault = data.PinDefault; + this.notify(); void this.loadPlaylistName(); void this.loadPaths(); }, @@ -119,6 +125,10 @@ class FavoritesStore { return this.playlistId; } + getPinDefault(): boolean { + return this.pinDefault; + } + isLoading(): boolean { return this.loading; } @@ -203,6 +213,14 @@ class FavoritesStore { await this.loadPaths(); } + async setPinDefault( + pin: boolean, + ): Promise { + this.pinDefault = pin; + this.notify(); + await SetPinDefaultPlaylist(pin); + } + // =============================================================== // SUBSCRIPTION SYSTEM // =============================================================== @@ -223,13 +241,16 @@ class FavoritesStore { private async loadConfig(): Promise { try { - const [id, style] = await Promise.all([ - GetFavoritesPlaylistID(), - GetFavoritesIconStyle(), - ]); + const [id, style, pin] = + await Promise.all([ + GetFavoritesPlaylistID(), + GetFavoritesIconStyle(), + GetPinDefaultPlaylist(), + ]); this.playlistId = id; this.iconStyle = style as IconStyle; + this.pinDefault = pin; await this.loadPlaylistName(); this.notify(); } catch { diff --git a/frontend/wailsjs/go/config/Config.d.ts b/frontend/wailsjs/go/config/Config.d.ts index a6cfdcc..98a82c7 100755 --- a/frontend/wailsjs/go/config/Config.d.ts +++ b/frontend/wailsjs/go/config/Config.d.ts @@ -9,6 +9,8 @@ export function GetFavoritesPlaylistID():Promise; export function GetLibraryDirectory():Promise; +export function GetPinDefaultPlaylist():Promise; + export function GetScanConcurrency():Promise; export function GetThemeAccentColor():Promise; @@ -29,6 +31,8 @@ export function SetFavoritesPlaylistID(arg1:number):Promise; export function SetLibraryDirectory(arg1:string):Promise; +export function SetPinDefaultPlaylist(arg1:boolean):Promise; + export function SetScanConcurrency(arg1:string):Promise; export function SetThemeAccentColor(arg1:string):Promise; diff --git a/frontend/wailsjs/go/config/Config.js b/frontend/wailsjs/go/config/Config.js index 1b206ec..2b04eb1 100755 --- a/frontend/wailsjs/go/config/Config.js +++ b/frontend/wailsjs/go/config/Config.js @@ -14,6 +14,10 @@ export function GetLibraryDirectory() { return window['go']['config']['Config']['GetLibraryDirectory'](); } +export function GetPinDefaultPlaylist() { + return window['go']['config']['Config']['GetPinDefaultPlaylist'](); +} + export function GetScanConcurrency() { return window['go']['config']['Config']['GetScanConcurrency'](); } @@ -54,6 +58,10 @@ export function SetLibraryDirectory(arg1) { return window['go']['config']['Config']['SetLibraryDirectory'](arg1); } +export function SetPinDefaultPlaylist(arg1) { + return window['go']['config']['Config']['SetPinDefaultPlaylist'](arg1); +} + export function SetScanConcurrency(arg1) { return window['go']['config']['Config']['SetScanConcurrency'](arg1); }