-
{pl.name}
+
{plName(pl)}
{t("playlists.itemCount", { count: pl.item_count })}
@@ -287,17 +292,19 @@ export default function Playlists() {
/>
) : (
-
{detail.name}
-
+
{plName(detail)}
+ {!builtin && (
+
+ )}
)}
@@ -311,12 +318,14 @@ export default function Playlists() {
>
{t("playlists.playAll")}
-
+ {!builtin && (
+
+ )}
diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx
index 95a8980..e846ba9 100644
--- a/frontend/src/components/Sidebar.tsx
+++ b/frontend/src/components/Sidebar.tsx
@@ -50,7 +50,7 @@ const SORT_IDS = [
"shuffle",
];
-const SHOW_IDS = ["unwatched", "in_progress", "all", "watched", "saved", "hidden"];
+const SHOW_IDS = ["unwatched", "in_progress", "all", "watched", "hidden"];
// Fresh shuffle token for the "surprise me" sort.
const rollSeed = () => Math.floor(Math.random() * 1_000_000_000);
diff --git a/frontend/src/components/VideoCard.tsx b/frontend/src/components/VideoCard.tsx
index 489b14f..597470c 100644
--- a/frontend/src/components/VideoCard.tsx
+++ b/frontend/src/components/VideoCard.tsx
@@ -19,10 +19,12 @@ import { formatDuration, formatViews, relativeTime } from "../lib/format";
function Actions({
video,
onState,
+ onToggleSave,
onChannelFilter,
}: {
video: Video;
onState: (id: string, status: string) => void;
+ onToggleSave: (id: string, saved: boolean) => void;
onChannelFilter?: (channelId: string, channelName: string) => void;
}) {
const { t } = useTranslation();
@@ -31,6 +33,11 @@ function Actions({
e.stopPropagation();
onState(video.id, video.status === status ? "new" : status);
};
+ const toggleSave = (e: React.MouseEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ onToggleSave(video.id, !video.saved);
+ };
return (