All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 3m26s
Added analyst_verified, research_complete, analysis_enriched, and ready_for_writing statuses across all UI components: status-badge, workflow-timeline, status-donut, status-changer, status-guide, and kpi-cards. Also changed qa_review label from "QA" to "בדיקת איכות". Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
85 lines
2.8 KiB
TypeScript
85 lines
2.8 KiB
TypeScript
"use client";
|
||
|
||
import { useState } from "react";
|
||
import { toast } from "sonner";
|
||
import {
|
||
Select, SelectContent, SelectItem, SelectTrigger, SelectValue,
|
||
} from "@/components/ui/select";
|
||
import { Button } from "@/components/ui/button";
|
||
import { STATUS_LABELS, STATUS_ICONS } from "@/components/cases/status-badge";
|
||
import { useUpdateCase, type CaseStatus } from "@/lib/api/cases";
|
||
|
||
/*
|
||
* Dropdown for manually overriding the case status — skip a step
|
||
* or revert to an earlier stage. Calls PUT /api/cases/:caseNumber
|
||
* with { status: newValue }.
|
||
*/
|
||
|
||
const ALL_STATUSES: CaseStatus[] = [
|
||
"new", "uploading", "processing",
|
||
"documents_ready", "analyst_verified", "research_complete", "outcome_set",
|
||
"brainstorming", "direction_approved", "analysis_enriched", "ready_for_writing",
|
||
"drafting", "qa_review", "drafted",
|
||
"exported", "reviewed", "final",
|
||
];
|
||
|
||
export function StatusChanger({
|
||
caseNumber,
|
||
currentStatus,
|
||
}: {
|
||
caseNumber: string;
|
||
currentStatus?: CaseStatus;
|
||
}) {
|
||
const [selected, setSelected] = useState<CaseStatus | "">(currentStatus ?? "");
|
||
const mutate = useUpdateCase(caseNumber);
|
||
|
||
const handleSave = async () => {
|
||
if (!selected || selected === currentStatus) return;
|
||
try {
|
||
await mutate.mutateAsync({ status: selected });
|
||
toast.success(`הסטטוס עודכן ל${STATUS_LABELS[selected]}`);
|
||
} catch (e) {
|
||
toast.error(e instanceof Error ? e.message : "שגיאה בעדכון הסטטוס");
|
||
}
|
||
};
|
||
|
||
return (
|
||
<div className="mt-4 border-t border-rule pt-3 space-y-2">
|
||
<label className="text-[0.72rem] text-ink-muted block">שינוי סטטוס ידני</label>
|
||
<div className="flex items-center gap-2">
|
||
<Select
|
||
value={selected || "__current__"}
|
||
onValueChange={(v) => setSelected(v === "__current__" ? "" : v as CaseStatus)}
|
||
dir="rtl"
|
||
>
|
||
<SelectTrigger className="text-[0.75rem] h-8">
|
||
<SelectValue />
|
||
</SelectTrigger>
|
||
<SelectContent>
|
||
{ALL_STATUSES.map((s) => {
|
||
const Icon = STATUS_ICONS[s];
|
||
return (
|
||
<SelectItem key={s} value={s} className="text-[0.75rem]">
|
||
<span className="inline-flex items-center gap-1.5">
|
||
<Icon className="w-3 h-3 shrink-0" />
|
||
{STATUS_LABELS[s]}
|
||
</span>
|
||
</SelectItem>
|
||
);
|
||
})}
|
||
</SelectContent>
|
||
</Select>
|
||
<Button
|
||
size="sm"
|
||
variant="outline"
|
||
className="h-8 text-[0.72rem] px-3 shrink-0"
|
||
disabled={!selected || selected === currentStatus || mutate.isPending}
|
||
onClick={handleSave}
|
||
>
|
||
{mutate.isPending ? "שומר…" : "עדכן"}
|
||
</Button>
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|