feat(ticket-actions): show backend-driven overdue lot warning

This commit is contained in:
2026-07-31 19:38:00 +05:30
parent faefd34cd4
commit 0a4d9512cb
2 changed files with 35 additions and 1 deletions

View File

@@ -1,8 +1,11 @@
'use client'; 'use client';
import { AlertTriangle } from 'lucide-react';
import { PERMISSIONS } from '@/constants/permissions'; import { PERMISSIONS } from '@/constants/permissions';
import { PermissionGuard } from '@/guards'; import { PermissionGuard } from '@/guards';
import type { TicketAssignmentSummary } from '@/types'; import type { TicketAssignmentSummary } from '@/types';
import { formatDate } from '@/utils/date';
import { NoTicketAction } from './actions/NoTicketAction'; import { NoTicketAction } from './actions/NoTicketAction';
import { RequestExtensionAction } from './actions/RequestExtensionAction'; import { RequestExtensionAction } from './actions/RequestExtensionAction';
@@ -13,6 +16,29 @@ interface TicketStatusActionsProps {
assignment?: TicketAssignmentSummary; assignment?: TicketAssignmentSummary;
} }
function OverdueLotAlert({
lotId,
dueAt,
}: {
lotId: number;
dueAt: string | null;
}) {
return (
<div
role="alert"
className="flex gap-3 rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-destructive"
>
<AlertTriangle className="mt-0.5 size-5 shrink-0" />
<div className="min-w-0">
<p className="text-sm font-semibold">Lot {lotId} is overdue</p>
<p className="mt-0.5 text-xs text-destructive/80">
The due date expired on {formatDate(dueAt)}.
</p>
</div>
</div>
);
}
function getTicketAction( function getTicketAction(
ticketId: string, ticketId: string,
assignment?: TicketAssignmentSummary, assignment?: TicketAssignmentSummary,
@@ -51,5 +77,12 @@ export function TicketStatusActions({
}: TicketStatusActionsProps) { }: TicketStatusActionsProps) {
const action = getTicketAction(ticketId, assignment); const action = getTicketAction(ticketId, assignment);
return action ? <div className="space-y-3">{action}</div> : null; return action ? (
<div className="space-y-3">
{assignment?.is_overdue ? (
<OverdueLotAlert lotId={assignment.id} dueAt={assignment.due_at} />
) : null}
{action}
</div>
) : null;
} }

View File

@@ -60,6 +60,7 @@ export interface TicketAssignmentSummary {
pending_detections: number; pending_detections: number;
not_submitted_detections: number; not_submitted_detections: number;
is_complete: boolean; is_complete: boolean;
is_overdue: boolean;
due_at: string | null; due_at: string | null;
note?: string | null; note?: string | null;
} }