diff --git a/src/modules/registratura/components/deadline-timeline.tsx b/src/modules/registratura/components/deadline-timeline.tsx index 6617c07..020127f 100644 --- a/src/modules/registratura/components/deadline-timeline.tsx +++ b/src/modules/registratura/components/deadline-timeline.tsx @@ -17,7 +17,7 @@ interface TimelineMilestone { /** Position on the timeline (0..1) */ position: number; /** Status of this milestone */ - status: "completed" | "active" | "expired" | "upcoming" | "background"; + status: "completed" | "active" | "expired" | "upcoming" | "background" | "paused"; /** Human-readable status text */ statusText: string; /** Whether this is the main (user-created) deadline or an auto-tracked milestone */ @@ -189,6 +189,7 @@ function getMainStatus( ): TimelineMilestone["status"] { if (dl.resolution === "completed") return "completed"; if (dl.resolution !== "pending") return "completed"; + if (dl.pausedAt) return "paused"; if (daysRemaining < 0) return "expired"; if (daysRemaining <= 5) return "active"; return "upcoming"; @@ -216,6 +217,8 @@ function getStatusText( switch (status) { case "completed": return "Finalizat"; + case "paused": + return "Suspendat — așteptare completări"; case "expired": return daysRemaining < 0 ? `${Math.abs(daysRemaining)}z depasit` @@ -252,7 +255,10 @@ function getExpiredDescription( status: TimelineMilestone["status"], ): string { if (status === "expired" && typeId.includes("verificare")) { - return "Posibilitatea de a solicita clarificari sau de a returna documentatia a expirat."; + return "Termenul de verificare a expirat — nu se mai pot solicita clarificari si nu se mai poate restitui dosarul."; + } + if (status === "expired" && (typeId.includes("emitere") || typeId.includes("ac-emitere"))) { + return "Termenul legal de emitere a fost depasit — poate fi sesizat ISC (sanctiuni)."; } return ""; } @@ -266,6 +272,18 @@ function formatShortDate(iso: string): string { } } +function formatFullDate(iso: string): string { + try { + return new Date(iso).toLocaleDateString("ro-RO", { + day: "2-digit", + month: "long", + year: "numeric", + }); + } catch { + return iso; + } +} + // ── Component ── export function DeadlineTimeline({ deadlines }: DeadlineTimelineProps) { @@ -290,11 +308,13 @@ export function DeadlineTimeline({ deadlines }: DeadlineTimelineProps) { "rounded-lg border px-3 py-2", main.status === "expired" ? "border-destructive/40 bg-destructive/5" - : main.status === "active" - ? "border-amber-300 bg-amber-50/30 dark:border-amber-800 dark:bg-amber-950/20" - : main.status === "completed" - ? "border-muted bg-muted/20" - : "border-border", + : main.status === "paused" + ? "border-blue-400/40 bg-blue-50/30 dark:border-blue-800 dark:bg-blue-950/20" + : main.status === "active" + ? "border-amber-300 bg-amber-50/30 dark:border-amber-800 dark:bg-amber-950/20" + : main.status === "completed" + ? "border-muted bg-muted/20" + : "border-border", )} >
+ Termenul legal de emitere a fost depasit — poate fi sesizat ISC (sanctiuni) +
+ )} + {main.deadline.resolutionNote && ({main.deadline.resolutionNote} @@ -394,9 +432,11 @@ function ProgressBar({ "h-1.5 rounded-full transition-all", status === "expired" ? "bg-red-500" - : status === "active" - ? "bg-amber-500" - : "bg-green-500", + : status === "paused" + ? "bg-blue-400 animate-pulse" + : status === "active" + ? "bg-amber-500" + : "bg-green-500", )} style={{ width: `${pct}%` }} /> @@ -432,7 +472,7 @@ function MilestoneTimeline({ key={ms.deadline.id} className="absolute top-0" style={{ left: `${ms.position * 100}%` }} - title={`${ms.label}: ${ms.statusText}`} + title={`${ms.label}\nData maximă: ${formatFullDate(ms.dueDate)}\n${ms.statusText}${ms.description ? `\n${ms.description}` : ""}`} >