pipeline UI polish: jellyfin deep-links on titles, hover-to-show approve buttons, series approve-up-to
Build and Push Docker Image / build (push) Successful in 37s

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-28 01:14:19 +01:00
parent 7cefd9bf04
commit 9c5a793a47
5 changed files with 151 additions and 88 deletions
+14 -4
View File
@@ -4,18 +4,19 @@ import { SeriesCard } from './SeriesCard';
interface ReviewColumnProps {
items: any[];
jellyfinUrl: string;
onMutate: () => void;
}
export function ReviewColumn({ items, onMutate }: ReviewColumnProps) {
export function ReviewColumn({ items, jellyfinUrl, onMutate }: ReviewColumnProps) {
// Group by series (movies are standalone)
const movies = items.filter((i: any) => i.type === 'Movie');
const seriesMap = new Map<string, { name: string; key: string; episodes: any[] }>();
const seriesMap = new Map<string, { name: string; key: string; jellyfinId: string | null; episodes: any[] }>();
for (const item of items.filter((i: any) => i.type === 'Episode')) {
const key = item.series_jellyfin_id ?? item.series_name;
if (!seriesMap.has(key)) {
seriesMap.set(key, { name: item.series_name, key, episodes: [] });
seriesMap.set(key, { name: item.series_name, key, jellyfinId: item.series_jellyfin_id, episodes: [] });
}
seriesMap.get(key)!.episodes.push(item);
}
@@ -35,6 +36,12 @@ export function ReviewColumn({ items, onMutate }: ReviewColumnProps) {
})),
].sort((a, b) => a.sortKey - b.sortKey);
// For "approve up to here" on series, use the last episode's plan ID
const lastPlanId = (series: { episodes: any[] }) => {
const eps = series.episodes;
return eps[eps.length - 1]?.id;
};
return (
<div className="flex flex-col w-80 min-w-80 bg-gray-50 rounded-lg">
<div className="px-3 py-2 border-b font-medium text-sm">
@@ -47,11 +54,11 @@ export function ReviewColumn({ items, onMutate }: ReviewColumnProps) {
<PipelineCard
key={entry.item.id}
item={entry.item}
jellyfinUrl={jellyfinUrl}
onLanguageChange={async (lang) => {
await api.patch(`/api/review/${entry.item.item_id}/language`, { language: lang });
onMutate();
}}
showApproveUpTo
onApproveUpTo={() => approveUpTo(entry.item.id)}
/>
);
@@ -61,8 +68,11 @@ export function ReviewColumn({ items, onMutate }: ReviewColumnProps) {
key={entry.item.key}
seriesKey={entry.item.key}
seriesName={entry.item.name}
jellyfinUrl={jellyfinUrl}
seriesJellyfinId={entry.item.jellyfinId}
episodes={entry.item.episodes}
onMutate={onMutate}
onApproveUpTo={() => approveUpTo(lastPlanId(entry.item))}
/>
);
}