feat(tags): tag UX overhaul + per-card video reset

- Channel-row tags show only what's attached; a '+' opens a per-channel picker. Clicking a tag
  filters the feed by it; a 'Your tags' sidebar widget makes that filter visible/clearable.
- Tag manager dialog (add/rename/delete; delete only confirms when the tag is in use), reachable
  from the Channel manager and the feed sidebar; hovering a tag's count lists its channels, each a
  link that focuses it in the Channel manager (DataTable gains an external filter input).
- Video cards get a reset action that clears all watch state (incl. an in-progress position).
- api.req() now raises the error dialog on 5xx and 400/409/422 with the server's reason.
This commit is contained in:
npeter83 2026-06-18 01:17:31 +02:00
parent 14b8eb6084
commit d33a109ea2
22 changed files with 445 additions and 49 deletions

View file

@ -8,6 +8,7 @@
"unhide": "Unhide",
"hide": "Hide",
"onlyThisChannel": "Only this channel",
"resetState": "Reset — clear watch progress/status",
"thisChannel": "This channel",
"continueTitle": "Continue where you left off",
"continue": "Continue",

View file

@ -13,6 +13,7 @@
},
"tags": {
"yourTags": "Your tags",
"manage": "Manage tags",
"yourTagsHint": "Your personal labels. Attach them to channels below, then filter the feed by tag from the sidebar. (Separate from the automatic language/topic tags.)",
"newTag": "new tag",
"createTag": "Create tag"
@ -56,6 +57,7 @@
"subs": "{{formatted}} subs",
"openOnYouTube": "Open on YouTube",
"editTags": "Edit tags",
"filterFeedByTag": "Filter the feed by “{{name}}”",
"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",
@ -94,6 +96,7 @@
"fullHistoryFailed": "Couldn't request full history",
"needYouTube": "Connect your YouTube account to do this.",
"connect": "Connect",
"filteredByTag": "Feed filtered by tag: {{name}}",
"resetDone": "Channel reset — re-fetching now",
"resetFailed": "Couldn't reset this channel"
},

View file

@ -26,6 +26,7 @@
"clearDates": "clear dates",
"reshuffle": "Reshuffle",
"noMatchingTags": "No matching tags here",
"manageTags": "Manage",
"shareView": "Copy a link to this view",
"shareCopied": "View link copied to clipboard",
"shareFailed": "Couldn't copy the link",
@ -35,7 +36,8 @@
"date": "Upload date",
"content": "Content type",
"language": "Language",
"topic": "Topic"
"topic": "Topic",
"tags": "Your tags"
},
"show": {
"unwatched": "Unwatched",

View file

@ -0,0 +1,12 @@
{
"title": "Manage tags",
"channels": "{{count}} ch.",
"onChannels": "Tagged channels",
"delete": "Delete",
"deleted": "Tag deleted",
"deleteTitle": "Delete tag",
"confirmDelete": "Delete the tag “{{name}}”? It will be removed from every channel it's on.",
"empty": "No tags yet — add one below.",
"newPlaceholder": "New tag name…",
"add": "Add"
}