From d8e3eb9415ab73461afcec4eaca1e143d9130f7f Mon Sep 17 00:00:00 2001 From: Michele Date: Sun, 8 Mar 2026 03:14:07 +0100 Subject: [PATCH] fix(01): calendar slot merge in OutputReview for PN/Schwartz badges GenerateResponse now includes calendar field from backend. OutputReview merges CalendarSlot into PostResult via slot_index, enabling BadgePN, BadgeSchwartz rendering and Retry button. Co-Authored-By: Claude Opus 4.6 --- backend/schemas/generate.py | 6 +++++- backend/services/generation_pipeline.py | 1 + frontend/src/pages/OutputReview.tsx | 9 +++++++-- frontend/src/types.ts | 1 + 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/backend/schemas/generate.py b/backend/schemas/generate.py index 4624b55..7720320 100644 --- a/backend/schemas/generate.py +++ b/backend/schemas/generate.py @@ -10,7 +10,7 @@ from typing import Literal, Optional from pydantic import BaseModel, Field -from backend.schemas.calendar import CalendarSlot +from backend.schemas.calendar import CalendarResponse, CalendarSlot # --------------------------------------------------------------------------- @@ -185,3 +185,7 @@ class GenerateResponse(BaseModel): ge=0, description="Numero di post falliti — esclusi dal CSV export", ) + calendar: Optional[CalendarResponse] = Field( + default=None, + description="Calendario con gli slot originali — usato dal frontend per badge PN/Schwartz", + ) diff --git a/backend/services/generation_pipeline.py b/backend/services/generation_pipeline.py index 9cbae3e..0e8f7de 100644 --- a/backend/services/generation_pipeline.py +++ b/backend/services/generation_pipeline.py @@ -198,6 +198,7 @@ class GenerationPipeline: total=status.total, success_count=success_count, failed_count=failed_count, + calendar=status.calendar, ) def generate_single( diff --git a/frontend/src/pages/OutputReview.tsx b/frontend/src/pages/OutputReview.tsx index 5d4e600..ac5a548 100644 --- a/frontend/src/pages/OutputReview.tsx +++ b/frontend/src/pages/OutputReview.tsx @@ -25,10 +25,15 @@ export function OutputReview() { // Stato locale dei post — viene aggiornato da edit inline e rigenerazione const [localResults, setLocalResults] = useState([]) - // Inizializza i risultati quando arrivano dal backend + // Inizializza i risultati e merge con CalendarSlot dal calendario useEffect(() => { if (jobData?.results) { - setLocalResults(jobData.results) + const slots = jobData.calendar?.slots + const merged = jobData.results.map((r) => ({ + ...r, + slot: slots?.find((s) => s.indice === r.slot_index) ?? r.slot, + })) + setLocalResults(merged) } }, [jobData]) diff --git a/frontend/src/types.ts b/frontend/src/types.ts index a905d7d..d232954 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -103,6 +103,7 @@ export interface GenerateResponse { total: number success_count: number failed_count: number + calendar?: CalendarResponse | null } // ---------------------------------------------------------------------------