+ ${this.loading
+ ? html`
+ Loading tracks...
+
`
+ : this.renderTrackList()}
+
+
+ ${this.renderContextMenu()}
+
+
+ this.handlePhantomClick(
+ e,
+ trackIndex,
+ )
+ : (e: MouseEvent) =>
+ this.handleTrackClick(
+ e,
+ trackIndex,
+ )}
+ @dblclick=${isPhantom
+ ? nothing
+ : () =>
+ this.handleTrackDblClick(
+ trackIndex,
+ )}
+ @contextmenu=${isPhantom
+ ? (e: MouseEvent) =>
+ this.handlePhantomContextMenu(
+ e,
+ trackIndex,
+ )
+ : (e: MouseEvent) =>
+ this.handleTrackContextMenu(
+ e,
+ trackIndex,
+ )}
+ @dragstart=${isPhantom
+ ? nothing
+ : (e: DragEvent) =>
+ this.onTrackDragStart(
+ e,
+ track,
+ trackIndex,
+ )}
+ @dragend=${isPhantom
+ ? nothing
+ : this.onTrackDragEnd}
+ >
+ ${isPhantom
+ ? html`
+
+
+ ${track.FilePath}
+
+
+
+
+
+
`
+ : html`
`}
+
+ `;
+ },
+ )}
+ `;
+ }
+
+ private renderContextMenu() {
+ return html`
+
+
+
+ `;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'playlist-details': PlaylistDetails;
+ }
+}
diff --git a/frontend/src/store/search-store.ts b/frontend/src/store/search-store.ts
index ed84053..0a6ca43 100644
--- a/frontend/src/store/search-store.ts
+++ b/frontend/src/store/search-store.ts
@@ -1,5 +1,5 @@
/** Searchable views that respond to the global search term. */
-const SEARCHABLE_VIEWS = new Set(['tracks', 'albums', 'playlists', 'artists', 'genres']);
+const SEARCHABLE_VIEWS = new Set(['tracks', 'albums', 'playlists', 'playlist-details', 'artists', 'genres']);
type Subscriber = () => void;