import { useState } from "react"; import type { Order, OrderStatus, OrderPriority, OrderType, UpdateOrderRequest, DirectiveSummary, } from "../../lib/api"; const STATUS_BADGE: Record = { open: { color: "text-[#75aafc] border-[rgba(117,170,252,0.4)]", label: "OPEN" }, in_progress: { color: "text-yellow-400 border-yellow-800", label: "IN PROGRESS" }, under_review: { color: "bg-purple-400/20 text-purple-400 border-purple-800", label: "UNDER REVIEW" }, done: { color: "text-emerald-400 border-emerald-800", label: "DONE" }, archived: { color: "text-[#556677] border-[#2a3a5a]", label: "ARCHIVED" }, }; const PRIORITY_OPTIONS: { value: OrderPriority; color: string; label: string }[] = [ { value: "critical", color: "text-red-400 border-red-800", label: "Critical" }, { value: "high", color: "text-orange-400 border-orange-800", label: "High" }, { value: "medium", color: "text-yellow-400 border-yellow-800", label: "Medium" }, { value: "low", color: "text-[#75aafc] border-[rgba(117,170,252,0.4)]", label: "Low" }, { value: "none", color: "text-[#556677] border-[#2a3a5a]", label: "None" }, ]; const TYPE_OPTIONS: { value: OrderType; color: string; label: string }[] = [ { value: "feature", color: "text-[#75aafc]", label: "Feature" }, { value: "bug", color: "text-red-400", label: "Bug" }, { value: "spike", color: "text-yellow-400", label: "Spike" }, { value: "chore", color: "text-[#7788aa]", label: "Chore" }, { value: "improvement", color: "text-emerald-400", label: "Improvement" }, ]; const STATUS_OPTIONS: OrderStatus[] = ["open", "in_progress", "under_review", "done", "archived"]; interface OrderDetailProps { order: Order; directives: DirectiveSummary[]; onUpdate: (req: UpdateOrderRequest) => Promise; onDelete: () => void; onLinkDirective: (directiveId: string) => Promise; onConvertToStep: () => Promise; onRefresh: () => void; } export function OrderDetail({ order, directives, onUpdate, onDelete, onLinkDirective, onConvertToStep, onRefresh, }: OrderDetailProps) { const [editingTitle, setEditingTitle] = useState(false); const [titleText, setTitleText] = useState(order.title); const [editingDesc, setEditingDesc] = useState(false); const [descText, setDescText] = useState(order.description || ""); const [editingLabels, setEditingLabels] = useState(false); const [labelsText, setLabelsText] = useState(order.labels.join(", ")); const [showLinkDirective, setShowLinkDirective] = useState(false); const [directiveSearch, setDirectiveSearch] = useState(""); const badge = STATUS_BADGE[order.status] || STATUS_BADGE.open; const currentPriority = PRIORITY_OPTIONS.find((p) => p.value === order.priority) || PRIORITY_OPTIONS[4]; const currentType = TYPE_OPTIONS.find((t) => t.value === order.orderType) || TYPE_OPTIONS[0]; const handleTitleSave = async () => { if (titleText.trim() && titleText !== order.title) { await onUpdate({ title: titleText.trim() }); } setEditingTitle(false); }; const handleDescSave = async () => { const newDesc = descText.trim() || null; if (newDesc !== order.description) { await onUpdate({ description: newDesc }); } setEditingDesc(false); }; const handleLabelsSave = async () => { const newLabels = labelsText .split(",") .map((l) => l.trim()) .filter((l) => l.length > 0); await onUpdate({ labels: newLabels }); setEditingLabels(false); }; const handleStatusChange = async (status: OrderStatus) => { await onUpdate({ status }); }; const handlePriorityChange = async (priority: OrderPriority) => { await onUpdate({ priority }); }; const handleTypeChange = async (orderType: OrderType) => { await onUpdate({ orderType }); }; const handleLinkDirective = async (directiveId: string) => { await onLinkDirective(directiveId); setShowLinkDirective(false); }; return (
{/* Header */}
{editingTitle ? (
setTitleText(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") handleTitleSave(); if (e.key === "Escape") setEditingTitle(false); }} autoFocus className="flex-1 bg-[#0a1628] border border-[rgba(117,170,252,0.2)] rounded px-2 py-1 text-[14px] font-mono text-white" />
) : (

{ setTitleText(order.title); setEditingTitle(true); }} > {order.title}

)}
{badge.label}
{/* Type + Priority inline */}
{currentType.label} / {currentPriority.label}
{/* Linked entities */} {order.directiveId && ( )} {order.directiveStepId && (
Step: {order.directiveStepId.slice(0, 8)}...
)} {/* Controls */}
{/* Status selector */}
Status
{STATUS_OPTIONS.map((s) => { const sBadge = STATUS_BADGE[s]; return ( ); })}
{/* Priority selector */}
Priority
{PRIORITY_OPTIONS.map((p) => ( ))}
{/* Type selector */}
Type
{TYPE_OPTIONS.map((t) => ( ))}
{/* Description */}
Description {!editingDesc && ( )}
{editingDesc ? (