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
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:
@@ -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))}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user