diff --git a/frontend/src/components/Channels.tsx b/frontend/src/components/Channels.tsx index 3db9eb1..dc37a27 100644 --- a/frontend/src/components/Channels.tsx +++ b/frontend/src/components/Channels.tsx @@ -4,6 +4,8 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { ArrowDown, ArrowUp, + Check, + ExternalLink, Eye, EyeOff, History, @@ -361,10 +363,11 @@ function SyncBadge({ ok, label, hint }: { ok: boolean; label: string; hint?: str return ( + {ok && } {label} @@ -393,6 +396,9 @@ function ChannelRow({ onToggleTag: (tagId: number) => void; }) { const { t } = useTranslation(); + const ytUrl = c.handle + ? `https://www.youtube.com/@${c.handle.replace(/^@/, "")}` + : `https://www.youtube.com/channel/${c.id}`; return (
- +
+ + + + + + +
{t("channels.row.stored", { count: c.stored_videos, formatted: c.stored_videos.toLocaleString() })} {c.subscriber_count != null && · {t("channels.row.subs", { count: c.subscriber_count, formatted: c.subscriber_count.toLocaleString() })}} diff --git a/frontend/src/components/Playlists.tsx b/frontend/src/components/Playlists.tsx index 93512f0..8bf346e 100644 --- a/frontend/src/components/Playlists.tsx +++ b/frontend/src/components/Playlists.tsx @@ -580,6 +580,21 @@ export default function Playlists({ canWrite }: { canWrite: boolean }) {
)} +
{ + e.preventDefault(); + if (newName.trim()) createMut.mutate(newName.trim()); + }} + className="flex items-center gap-1.5 mb-3 pb-3 border-b border-border" + > + + setNewName(e.target.value)} + placeholder={t("playlists.newPlaylist")} + className="flex-1 min-w-0 bg-card border border-border rounded-md px-2 py-1 text-xs outline-none focus:border-accent" + /> + {playlists.length === 0 && !listQuery.isLoading && (
{t("playlists.noneYet")}
)} @@ -618,21 +633,6 @@ export default function Playlists({ canWrite }: { canWrite: boolean }) { ))}
-
{ - e.preventDefault(); - if (newName.trim()) createMut.mutate(newName.trim()); - }} - className="flex items-center gap-1.5 mt-3 pt-3 border-t border-border" - > - - setNewName(e.target.value)} - placeholder={t("playlists.newPlaylist")} - className="flex-1 min-w-0 bg-card border border-border rounded-md px-2 py-1 text-xs outline-none focus:border-accent" - /> -
diff --git a/frontend/src/components/Stats.tsx b/frontend/src/components/Stats.tsx index f8dd9c3..46a776e 100644 --- a/frontend/src/components/Stats.tsx +++ b/frontend/src/components/Stats.tsx @@ -63,15 +63,21 @@ export default function Stats() { ) : (
{data.daily.map((d) => ( + // Each day gets a full-height track so the column is always visible + // (even on near-zero days); the accent fill renders the value on top.
+ > +
+
))}
)} diff --git a/frontend/src/i18n/locales/de/channels.json b/frontend/src/i18n/locales/de/channels.json index 8638c94..f57b703 100644 --- a/frontend/src/i18n/locales/de/channels.json +++ b/frontend/src/i18n/locales/de/channels.json @@ -36,6 +36,7 @@ "row": { "stored": "{{formatted}} gespeichert", "subs": "{{formatted}} Abonnenten", + "openOnYouTube": "Auf YouTube öffnen", "priorityHint": "Deine Einstufung für diesen Kanal. Sortiere den Feed nach „Kanalpriorität“, um Kanäle mit höherer Priorität nach oben zu bringen.", "raisePriority": "Priorität erhöhen", "lowerPriority": "Priorität senken", diff --git a/frontend/src/i18n/locales/en/channels.json b/frontend/src/i18n/locales/en/channels.json index 9ecd280..0adc427 100644 --- a/frontend/src/i18n/locales/en/channels.json +++ b/frontend/src/i18n/locales/en/channels.json @@ -36,6 +36,7 @@ "row": { "stored": "{{formatted}} stored", "subs": "{{formatted}} subs", + "openOnYouTube": "Open on YouTube", "priorityHint": "Your ranking for this channel. Sort the feed by “Channel priority” to bring higher-priority channels to the top.", "raisePriority": "Raise priority", "lowerPriority": "Lower priority", diff --git a/frontend/src/i18n/locales/hu/channels.json b/frontend/src/i18n/locales/hu/channels.json index 30904eb..fc36ce7 100644 --- a/frontend/src/i18n/locales/hu/channels.json +++ b/frontend/src/i18n/locales/hu/channels.json @@ -36,6 +36,7 @@ "row": { "stored": "{{formatted}} tárolt", "subs": "{{formatted}} feliratkozó", + "openOnYouTube": "Megnyitás a YouTube-on", "priorityHint": "A te rangsorod ehhez a csatornához. Rendezd a hírfolyamot „Csatorna prioritás” szerint, hogy a magasabb prioritású csatornák felülre kerüljenek.", "raisePriority": "Prioritás növelése", "lowerPriority": "Prioritás csökkentése",