import React, { useState, useEffect } from 'react'; import { usePublicQuestionnaireIds } from '../../hooks/usePublicQuestionnaireIds'; import { TextareaControl } from "../ui/textarea-control"; import { Card, CardHeader, CardBody, CardDivider } from '../ui/wp-card'; import { Elevation } from '../ui/elevation'; import { InputControl } from '../ui/input-control'; import { DismissibleAlert } from '../ui/dismissible-alert'; import { Heading } from '../ui/heading'; import { Spacer } from '../ui/spacer'; import { TabPanel } from '../ui/tab-panel'; import { Disabled } from '../ui/disabled'; import { useFormContext, Controller, useFieldArray } from 'react-hook-form'; import { IValueSet, useAuthServiceContext, useValueSetServiceContext } from '../../services'; import { FhirAnnotation, FhirCode, FhirCodeableConcept, FhirPeriod, FhirReference, FhirReferenceCollection } from '../../components'; import { useFhirEncounters, useFhirLocations, useFhirQuestionnaires, useFhirTaskBroadcast, useFhirTasks } from '../../hooks'; import { FhirResource } from 'fhir/r4'; interface FhirTaskProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } export const FhirTask: React.FC = ({ elevated = true, disabled = false, enableInlineActions = true }) => { const { control } = useFormContext(); const { userRole, USER_ROLES } = useAuthServiceContext(); const { fetchValueSet, valueSetUrls } = useValueSetServiceContext(); const [loading, setLoading] = useState(false); // value sets const [taskStatus, setTaskStatus] = useState([]); const [taskIntent, setTaskIntent] = useState([]); const [requestPriority, setRequestPriority] = useState([]); // const [taskCode, setTaskCode] = useState([]); const [performerRole, setPerformerRole] = useState([]); const [resourceTypes, setResourceTypes] = useState([]); const isPatient = [USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string); const spacerMargin = '24px'; useFhirTaskBroadcast(); const { tasksList } = useFhirTasks(); const { encountersList } = useFhirEncounters(); const { locationsList } = useFhirLocations(); const { questionnaireList } = useFhirQuestionnaires({ pageSize: 100 }); // A public form is website content, never a task's questionnaire; unknown public forms offer nothing. const { publicIds, publicRead } = usePublicQuestionnaireIds(); const taskQuestionnaires = publicRead === 'ready' ? questionnaireList.filter((questionnaire) => !questionnaire.id || !publicIds.has(questionnaire.id)) : []; const outputFieldArray = useFieldArray({ control, name: 'output' }); const focusFieldArray = useFieldArray({ control, name: 'focus' }); const restrictionRecipientFieldArray = useFieldArray({ control, name: 'restriction.recipient' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ taskStatusValueSet, taskIntentValueSet, requestPriorityValueSet, // taskCodeValueSet, performerRoleValueSet, resourceTypesValueSet ] = await Promise.all([ fetchValueSet(valueSetUrls.taskStatus), fetchValueSet(valueSetUrls.taskIntent), fetchValueSet(valueSetUrls.requestPriority), // fetchValueSet(valueSetUrls.taskCode), fetchValueSet(valueSetUrls.performerRole), fetchValueSet(valueSetUrls.resourceTypes) ]); setTaskStatus(taskStatusValueSet); setTaskIntent(taskIntentValueSet); setRequestPriority(requestPriorityValueSet); // setTaskCode(taskCodeValueSet); setPerformerRole(performerRoleValueSet); setResourceTypes(resourceTypesValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); return ( {elevated && } Details {/* status */} {/* statusReason */} {/**/} {/**/} {/* businessStatus */} {/**/} {/**/} {/* intent */} {/* priority */} {/* code */} {/**/} {/* focus */} { switch (referenceType) { case 'Questionnaire': return taskQuestionnaires; default: return []; } }} required={true} multiple={false} disabled={disabled} readonly={isPatient} enableInlineActions={enableInlineActions}/> {/* description */} ( <> {fieldState.error && ( Description is required )} )}/> {/* performerType */} {/* partOf */} {/* encounter */} {/* location */} {/* authoredOn */} ( )}/> {/* lastModified */} ( )}/> {/* executionPeriod */} {(tab) => { // restrictions if (tab.name === 'restrictions') { return (
{/* repetitions */} ( )}/> {/* restriction.period */} {/* recipients */}
); } // notes if (tab.name === 'notes') { return (
{/* note */}
); } }}
); }; export default FhirTask;