import React from "react"; import { RiskAssessment, RiskAssessmentPrediction } from "fhir/r4"; import { SheetBody, SheetHeader } from "../ui/sheet"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs"; import { ChevronRight } from "lucide-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "../ui/accordion"; import { FhirCodeableConceptDisplay } from "../../utils/fhirCodeableConcept"; import { FhirReferenceDisplay } from "../../utils/fhirReference"; import { FhirPeriodDisplay } from "../../utils/fhirPeriod"; import { FhirRangeDisplay } from "../../utils/fhirRange"; import { FhirAnnotationDisplay } from "../../utils/fhirAnnotation"; import { formatDateTime } from "../../utils/dateUtils"; 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 FhirRiskAssessmentDisplayProps { riskAssessment: RiskAssessment; isOpen: boolean; onClose: () => void; title?: string; } export const FhirRiskAssessmentDisplay: React.FC< FhirRiskAssessmentDisplayProps > = ({ riskAssessment, isOpen, 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 => ( ); // occurrence[x] is polymorphic: a dateTime string, or a Period. const renderOccurrenceValue = (): React.ReactNode => { if (riskAssessment.occurrenceDateTime) { return formatDateTime(riskAssessment.occurrenceDateTime); } if (riskAssessment.occurrencePeriod) { return ; } return undefined; }; // prediction.probability[x] is polymorphic: a decimal (percentage, max 100) or a Range. const renderPredictionProbability = ( prediction: RiskAssessmentPrediction, ): React.ReactNode => { if (prediction.probabilityDecimal !== undefined) { return `${prediction.probabilityDecimal}%`; } if (prediction.probabilityRange) { return ; } return undefined; }; // prediction.when[x] is polymorphic: a Period or a Range (age range). const renderPredictionWhen = ( prediction: RiskAssessmentPrediction, ): React.ReactNode => { if (prediction.whenPeriod) { return ; } if (prediction.whenRange) { return ; } return undefined; }; return (
{title || "Risk Assessment Details"}

{riskAssessment.code?.text || riskAssessment.code?.coding?.[0]?.display || "Risk Assessment"}

Overview Predictions } path="code.coding[0].display" /> } /> } path="method.coding[0].display" /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {riskAssessment?.prediction && riskAssessment.prediction.length > 0 ? ( riskAssessment.prediction.map((prediction, index) => (
{index + 1}

{prediction.outcome?.text || prediction.outcome?.coding?.[0] ?.display || `Prediction ${index + 1}`}

{(prediction.probabilityDecimal !== undefined || prediction.probabilityRange) && ( {renderPredictionProbability( prediction, )} )} {prediction.qualitativeRisk && ( )}

Outcome

} />

Probability

} />

Timeframe

Rationale

)) ) : (

No predictions recorded

)}
); }; export default FhirRiskAssessmentDisplay;