From eab7f2e21ba0afc90dbaa5601a38709f052f2973 Mon Sep 17 00:00:00 2001 From: Froidefond Julien Date: Mon, 23 Mar 2026 18:59:33 +0100 Subject: [PATCH] feat: filter metadata refresh to ongoing series & improve job action buttons - Metadata refresh now skips series with ended/cancelled status - Add xs size to Button component - Unify view/cancel button sizes (h-7) with icons (eye & cross) Co-Authored-By: Claude Opus 4.6 --- apps/api/src/metadata_refresh.rs | 25 ++++++++++++++------ apps/backoffice/app/components/JobRow.tsx | 17 +++++++++---- apps/backoffice/app/components/ui/Button.tsx | 3 ++- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/apps/api/src/metadata_refresh.rs b/apps/api/src/metadata_refresh.rs index b77ca4f..531acfc 100644 --- a/apps/api/src/metadata_refresh.rs +++ b/apps/api/src/metadata_refresh.rs @@ -110,9 +110,16 @@ pub async fn start_refresh( }))); } - // Check there are approved links to refresh + // Check there are approved links to refresh (only ongoing series) let link_count: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM external_metadata_links WHERE library_id = $1 AND status = 'approved'", + r#" + SELECT COUNT(*) FROM external_metadata_links eml + LEFT JOIN series_metadata sm + ON sm.library_id = eml.library_id AND sm.name = eml.series_name + WHERE eml.library_id = $1 + AND eml.status = 'approved' + AND COALESCE(sm.status, 'ongoing') NOT IN ('ended', 'cancelled') + "#, ) .bind(library_id) .fetch_one(&state.pool) @@ -234,13 +241,17 @@ pub(crate) async fn process_metadata_refresh( .await .map_err(|e| e.to_string())?; - // Get all approved links for this library + // Get approved links for this library, only for ongoing series (not ended/cancelled) let links: Vec<(Uuid, String, String, String)> = sqlx::query_as( r#" - SELECT id, series_name, provider, external_id - FROM external_metadata_links - WHERE library_id = $1 AND status = 'approved' - ORDER BY series_name + SELECT eml.id, eml.series_name, eml.provider, eml.external_id + FROM external_metadata_links eml + LEFT JOIN series_metadata sm + ON sm.library_id = eml.library_id AND sm.name = eml.series_name + WHERE eml.library_id = $1 + AND eml.status = 'approved' + AND COALESCE(sm.status, 'ongoing') NOT IN ('ended', 'cancelled') + ORDER BY eml.series_name "#, ) .bind(library_id) diff --git a/apps/backoffice/app/components/JobRow.tsx b/apps/backoffice/app/components/JobRow.tsx index 87cb2b8..b3c5d24 100644 --- a/apps/backoffice/app/components/JobRow.tsx +++ b/apps/backoffice/app/components/JobRow.tsx @@ -203,18 +203,25 @@ export function JobRow({ job, libraryName, highlighted, onCancel, formatDate, fo
- + + + + {t("jobRow.view")} {(job.status === "pending" || job.status === "running" || job.status === "extracting_pages" || job.status === "generating_thumbnails") && ( - )} diff --git a/apps/backoffice/app/components/ui/Button.tsx b/apps/backoffice/app/components/ui/Button.tsx index 3e11387..b34e587 100644 --- a/apps/backoffice/app/components/ui/Button.tsx +++ b/apps/backoffice/app/components/ui/Button.tsx @@ -14,7 +14,7 @@ type ButtonVariant = interface ButtonProps extends ButtonHTMLAttributes { children: ReactNode; variant?: ButtonVariant; - size?: "sm" | "md" | "lg"; + size?: "xs" | "sm" | "md" | "lg"; } const variantStyles: Record = { @@ -33,6 +33,7 @@ const variantStyles: Record = { }; const sizeStyles: Record = { + xs: "h-7 px-2.5 text-xs rounded-md", sm: "h-9 px-3 text-xs rounded-md", md: "h-10 px-4 py-2 text-sm rounded-md", lg: "h-11 px-8 text-base rounded-md",