feat(18-02): wire batch track-details to all 4 view context menus

- track-list: branch on selection count, resolve tracks from this.tracks
- cover-grid: branch on selection count, resolve from expandedTracks
- queue-panel: branch on indices count, resolve via libraryStore.getCachedTracks
- playlist-details: branch on selection count, resolve via libraryStore
- Each view determines coverArt/coverArtMixed state and calls showBatch()
This commit is contained in:
2026-03-18 13:14:02 -04:00
parent 6dab32b36b
commit 656985add9
4 changed files with 188 additions and 5 deletions
@@ -26,6 +26,7 @@ import '@awesome.me/webawesome/dist/components/icon/icon.js';
import '@components/playlist-picker/playlist-picker.js';
import '@components/track-details/track-details.js';
import type { TrackDetails } from '@components/track-details/track-details.js';
import type { CoverArtUrls } from '@components/track-details/track-details.js';
import { AlbumSelectionManager } from './album-selection.js';
import { ScrollManager } from './scroll-manager.js';
import type { ScrollManagerHost } from './scroll-manager.js';
@@ -1524,7 +1525,11 @@ export class CoverGrid
queueStore.playTracksNext(filePaths);
break;
case 'track-details':
this.openTrackDetails(filePaths[0]!);
if (filePaths.length === 1) {
this.openTrackDetails(filePaths[0]!);
} else {
this.openBatchTrackDetails(filePaths);
}
break;
}
@@ -1580,6 +1585,45 @@ export class CoverGrid
);
}
private openBatchTrackDetails(
filePaths: string[],
) {
const tracks = filePaths
.map((fp) =>
this.expandedTracks.find(
(t) => t.FilePath === fp,
),
)
.filter(
(t): t is library.Track => t != null,
);
if (tracks.length === 0) return;
const albumNames = new Set(
tracks.map((t) => t.Album),
);
let coverArt: CoverArtUrls | null = null;
let coverArtMixed = false;
if (albumNames.size === 1) {
const albumName = [...albumNames][0]!;
coverArt =
this.selMgr.resolveTrackCoverArt(
albumName,
this.expandedAlbumId,
);
} else {
coverArtMixed = true;
}
this.trackDetailsDialog?.showBatch(
tracks,
coverArt,
coverArtMixed,
);
}
/** Resolve file paths for the playlist submenu. */
private async getPlaylistSubmenuFilePaths(): Promise<
string[]