import React, { useEffect, useState } from 'react'; import { FhirCodeDisplay } from '../../utils/fhirCode'; import { FhirReferenceDisplay } from '../../utils/fhirReference'; import { formatDateTime } from '../../utils/dateUtils'; import { renderField } from '../../utils/renderField'; import { QuestionnaireResponse } from 'fhir/r4'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/dialog'; import { FieldHistoryProvider, FieldHistoryScope } from '../FieldHistory/FieldHistoryProvider'; import { ShowFieldHistoryToggle } from '../FieldHistory/ShowFieldHistoryToggle'; import { PrintRecord } from '../ui/print-record'; import { RecordEditedMarker } from '../FieldHistory/RecordEditedMarker'; import { FieldGroup, Section } from '../FieldHistory/FieldLayout'; import { useQuestionnaireServiceContext } from '../../services'; import { QuestionnaireAnswers } from '../QuestionnaireAnswers/QuestionnaireAnswers'; import { changedAnswerCount, previousSentVersion } from '../../utils/changedAnswers'; interface FhirQuestionnaireResponseDisplayProps { questionnaireResponse: QuestionnaireResponse; isOpen: boolean; onClose: () => void; title?: string; } // Closed, it renders nothing and asks for no services, so surfaces that mount it closed need no provider. export const FhirQuestionnaireResponseDisplay: React.FC = (props) => props.isOpen ? : null; const QuestionnaireResponseDialog: React.FC = ({ questionnaireResponse, isOpen, onClose, title = "Questionnaire Response Details" }) => { const { fetchQuestionnaireResponseHistory } = useQuestionnaireServiceContext(); const [previous, setPrevious] = useState(); const [historyFailed, setHistoryFailed] = useState(false); const responseId = questionnaireResponse?.id; const versionId = questionnaireResponse?.meta?.versionId; // The previous sent version, so each changed answer is read beside what it said before. useEffect(() => { setPrevious(undefined); setHistoryFailed(false); if (!responseId) return; let cancelled = false; fetchQuestionnaireResponseHistory(responseId, 20) .then((history) => { const versions = (history.entry ?? []) .map((entry) => entry.resource) .filter((resource): resource is QuestionnaireResponse => Boolean(resource)); if (!cancelled) setPrevious(previousSentVersion(versions, versionId)); }) .catch(() => { if (!cancelled) setHistoryFailed(true); }); return () => { cancelled = true; }; }, [responseId, versionId, fetchQuestionnaireResponseHistory]); const changedCount = changedAnswerCount(questionnaireResponse, previous); return ( { if (!next) onClose(); }} >
{title}
{renderField('The subject of the questions', )} {renderField('Status', , 'status')} {renderField('Date the answers were gathered', formatDateTime(questionnaireResponse.authored), 'authored')} {renderField('Encounter created as part of', )} {renderField('Person who received and recorded the answers', )} {renderField('The person who answered the questions', )}
{changedCount > 0 && (

{`${changedCount} ${changedCount === 1 ? 'answer was' : 'answers were'} changed after the form was first sent.`}

)} {historyFailed && (

Earlier versions of these answers could not be loaded, so any changes are not shown.

)} 0 ? formatDateTime(questionnaireResponse.meta?.lastUpdated ?? questionnaireResponse.authored) : undefined} previousOn={previous ? formatDateTime(previous.meta?.lastUpdated ?? previous.authored) : undefined} />
{renderField('Request fulfilled by this QuestionnaireResponse', )}
{renderField('Part of this action', )}
); }; export default FhirQuestionnaireResponseDisplay;