Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix/O3-3983: Allow Same-Day Program Enrollment and Completion #2039

Draft
wants to merge 13 commits into
base: main
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
Select,
SelectItem,
Stack,
TimePicker,
} from '@carbon/react';
import { z } from 'zod';
import { useForm, Controller, useWatch } from 'react-hook-form';
Expand Down Expand Up @@ -57,7 +58,7 @@ const ProgramsForm: React.FC<ProgramsFormProps> = ({
const availableLocations = useLocations();
const { data: availablePrograms } = useAvailablePrograms();
const { data: enrollments, mutateEnrollments } = useEnrollments(patientUuid);
const { showProgramStatusField } = useConfig();
const { showProgramStatusField, allowCompletionTime } = useConfig();
denniskigen marked this conversation as resolved.
Show resolved Hide resolved

const programsFormSchema = useMemo(() => createProgramsFormSchema(t), [t]);

Expand Down Expand Up @@ -112,14 +113,32 @@ const ProgramsForm: React.FC<ProgramsFormProps> = ({
async (data: ProgramsFormData) => {
const { selectedProgram, enrollmentDate, completionDate, enrollmentLocation, selectedProgramStatus } = data;

const formattedEnrollmentDate = dayjs(enrollmentDate).startOf('day').format();
const formattedCompletionDate = completionDate ? dayjs(completionDate).startOf('day').format() : null;

let formattedCompletionDateWithTime = formattedCompletionDate;
if (formattedCompletionDate && dayjs(formattedCompletionDate).isSame(dayjs(), 'day')) {
formattedCompletionDateWithTime = dayjs(formattedCompletionDate)
.set('hour', new Date().getHours())
.set('minute', new Date().getMinutes())
.set('second', new Date().getSeconds())
.format();
} else if (formattedCompletionDate && dayjs(formattedCompletionDate).isBefore(dayjs(), 'day')) {
formattedCompletionDateWithTime = dayjs(formattedCompletionDate)
.set('hour', 23)
.set('minute', 59)
.set('second', 59)
.format();
}

const payload = {
patient: patientUuid,
program: selectedProgram,
dateEnrolled: enrollmentDate ? dayjs(enrollmentDate).format() : null,
dateCompleted: completionDate ? dayjs(completionDate).format() : null,
dateEnrolled: formattedEnrollmentDate,
dateCompleted: formattedCompletionDateWithTime,
location: enrollmentLocation,
states:
!!selectedProgramStatus && selectedProgramStatus != currentState?.state.uuid
!!selectedProgramStatus && selectedProgramStatus !== currentState?.state.uuid
? [{ state: { uuid: selectedProgramStatus } }]
: [],
};
Expand Down Expand Up @@ -210,19 +229,35 @@ const ProgramsForm: React.FC<ProgramsFormProps> = ({
name="completionDate"
control={control}
render={({ field: { onChange, value } }) => (
<DatePicker
aria-label="completion date"
id="completionDate"
datePickerType="single"
dateFormat="d/m/Y"
minDate={new Date(watch('enrollmentDate')).toISOString()}
maxDate={new Date().toISOString()}
placeholder="dd/mm/yyyy"
onChange={([date]) => onChange(date)}
value={value}
>
<DatePickerInput id="completionDateInput" labelText={t('dateCompleted', 'Date completed')} />
</DatePicker>
<>
<DatePicker
aria-label="completion date"
id="completionDate"
datePickerType="single"
dateFormat="d/m/Y"
minDate={new Date(watch('enrollmentDate')).toISOString()}
maxDate={new Date().toISOString()}
placeholder="dd/mm/yyyy"
onChange={([date]) => onChange(date)}
value={value}
>
<DatePickerInput id="completionDateInput" labelText={t('dateCompleted', 'Date completed')} />
</DatePicker>
{allowCompletionTime && (
<TimePicker
id="completionTime"
value={value ? dayjs(value).format('HH:mm') : ''}
onChange={(time) =>
onChange(
time
? dayjs(value).set('hour', time.split(':')[0]).set('minute', time.split(':')[1]).toISOString()
: '',
)
}
labelText={t('selectTime', 'Select time')}
/>
)}
</>
)}
/>
);
Expand Down