import React from "react"; import { Task, TaskInput, TaskOutput } from "fhir/r4"; import { FhirCodeableConceptDisplay } from "../../utils/fhirCodeableConcept"; import { FhirReferenceDisplay } from "../../utils/fhirReference"; import { FhirAnnotationDisplay } from "../../utils/fhirAnnotation"; import { FhirPeriodDisplay } from "../../utils/fhirPeriod"; import { formatDate } from "../../utils/dateUtils"; import { SheetBody, SheetHeader } from "../ui/sheet"; import { formatDateForDisplay } from "../../lib/utils"; import { Calendar, ChevronRight, Utensils } from "lucide-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "../ui/accordion"; import { Card, CardContent, CardHeader } from "../ui/card"; import TaskWithdrawAction from "../TaskWithdrawAction/TaskWithdrawAction.tsx"; import { FieldHistoryProvider, FieldHistoryScope, } from "../FieldHistory/FieldHistoryProvider"; import { ShowFieldHistoryToggle } from "../FieldHistory/ShowFieldHistoryToggle"; import { PrintRecord } from "../ui/print-record"; import { RecordEditedMarker } from "../FieldHistory/RecordEditedMarker"; import { Field } from "../FieldHistory/Field"; import { FieldGroup } from "../FieldHistory/FieldLayout"; import { StatusBadge } from "../ui/status"; interface FhirTaskDisplayProps { task: Task; isOpen: boolean; onClose: () => void; title?: string; } // output[]/input[].value[x] is polymorphic across ~20 primitive/complex FHIR types. Every // primitive variant plus the Reference variant (the ones a real Task producer/consumer actually // populates) is handled explicitly; anything unmatched falls through to `undefined` so the // enclosing renders the uniform muted em-dash rather than a literal "-" string. const renderTaskValue = (item: TaskInput | TaskOutput): React.ReactNode => { if (item.valueBase64Binary) { return (
{item.valueBase64Binary}
); } if (item.valueBoolean !== undefined) { return item.valueBoolean ? "Yes" : "No"; } if (item.valueCanonical) { return item.valueCanonical; } if (item.valueCode) { return item.valueCode; } if (item.valueDate) { return formatDate(item.valueDate); } if (item.valueDateTime) { return formatDate(item.valueDateTime); } if (item.valueDecimal !== undefined) { return item.valueDecimal.toString(); } if (item.valueId) { return item.valueId; } if (item.valueInstant) { return formatDate(item.valueInstant); } if (item.valueInteger !== undefined) { return item.valueInteger.toString(); } if (item.valueMarkdown) { return (
{item.valueMarkdown}
); } if (item.valueOid) { return item.valueOid; } if (item.valuePositiveInt !== undefined) { return item.valuePositiveInt.toString(); } if (item.valueString) { return item.valueString; } if (item.valueTime) { return item.valueTime; } if (item.valueUnsignedInt !== undefined) { return item.valueUnsignedInt.toString(); } if (item.valueUri) { return ( {item.valueUri} ); } if (item.valueUrl) { return ( {item.valueUrl} ); } if (item.valueUuid) { return item.valueUuid; } if (item.valueReference) { return ; } return undefined; }; export const FhirTaskDisplay: React.FC = ({ task, isOpen, onClose, title, }) => { if (!isOpen) return null; // / D5 - was a hand-rolled pill: a local STATUS_STYLES record of hardcoded hex pairs // applied as an INLINE STYLE, with the raw FHIR code as the text. Colour-only, non-token, and one // of twelve near-identical copies. carries the shared word plus D5's colour AND shape. const renderStatusPill = (status: string | undefined): React.ReactNode => ( ); return (
{title || "Task Details"}

{task?.description || "No description available"}

{task.authoredOn && ( {" "} {formatDateForDisplay(task.authoredOn)} )}
Status {task.status ? ( renderStatusPill(task.status) ) : ( No status recorded )}
Owner
Details
} path="statusReason.coding[0].display" /> } path="businessStatus.coding[0].display" /> {task.intent} ) : undefined } path="intent" /> {task.priority} ) : undefined } path="priority" /> } path="code.coding[0].display" /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } path="reasonCode.coding[0].display" /> } /> } />
Output & Restrictions

Outputs

{task.output && task.output.length > 0 ? ( task.output.map((output, index) => (
Output {index + 1}
} />
)) ) : (

No output recorded

)}

Inputs

{task.input && task.input.length > 0 ? ( task.input.map((input, index) => (
Input {index + 1}
} />
)) ) : (

No input recorded

)}

Restriction

} /> } />
); }; export default FhirTaskDisplay;