From 89af11bb9f17d2b6af6f7f81fd199fd685404475 Mon Sep 17 00:00:00 2001 From: jwnasambu Date: Fri, 27 Sep 2024 00:22:24 +0300 Subject: [PATCH 1/2] fix/O3-3983: Allow Same-Day Program Enrollment and Completion --- .../src/programs/programs-form.workspace.tsx | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/packages/esm-patient-programs-app/src/programs/programs-form.workspace.tsx b/packages/esm-patient-programs-app/src/programs/programs-form.workspace.tsx index 926f3e74c..639510b40 100644 --- a/packages/esm-patient-programs-app/src/programs/programs-form.workspace.tsx +++ b/packages/esm-patient-programs-app/src/programs/programs-form.workspace.tsx @@ -34,13 +34,29 @@ interface ProgramsFormProps extends DefaultPatientWorkspaceProps { } const createProgramsFormSchema = (t: TFunction) => - z.object({ - selectedProgram: z.string().refine((value) => !!value, t('programRequired', 'Program is required')), - enrollmentDate: z.date(), - completionDate: z.date().nullable(), - enrollmentLocation: z.string(), - selectedProgramStatus: z.string(), - }); + z + .object({ + selectedProgram: z.string().refine((value) => !!value, t('programRequired', 'Program is required')), + enrollmentDate: z.date(), + completionDate: z.date().nullable().optional(), + enrollmentLocation: z.string(), + selectedProgramStatus: z.string(), + }) + .refine( + (data) => { + if (data.completionDate) { + return ( + dayjs(data.completionDate).isSame(dayjs(data.enrollmentDate), 'day') || + dayjs(data.completionDate).isAfter(dayjs(data.enrollmentDate)) + ); + } + return true; + }, + { + message: t('completionDateInvalid', 'Completion date must be the same or after enrollment date'), + path: ['completionDate'], + }, + ); export type ProgramsFormData = z.infer>; @@ -120,7 +136,7 @@ const ProgramsForm: React.FC = ({ dateCompleted: completionDate ? dayjs(completionDate).format() : null, location: enrollmentLocation, states: - !!selectedProgramStatus && selectedProgramStatus != currentState?.state.uuid + !!selectedProgramStatus && selectedProgramStatus !== currentState?.state.uuid ? [{ state: { uuid: selectedProgramStatus } }] : [], }; @@ -220,7 +236,11 @@ const ProgramsForm: React.FC = ({ id="completionDate" datePickerType="single" dateFormat="d/m/Y" - minDate={new Date(watch('enrollmentDate')).toISOString()} + minDate={(() => { + const enrollmentDate = new Date(watch('enrollmentDate')); + enrollmentDate.setHours(0, 0, 0, 0); + return enrollmentDate; + })()} maxDate={new Date().toISOString()} placeholder="dd/mm/yyyy" onChange={([date]) => onChange(date)} From c6ed293d782e268b52a6e0ea5f7fab474d4a10d6 Mon Sep 17 00:00:00 2001 From: jwnasambu Date: Thu, 10 Oct 2024 16:19:54 +0300 Subject: [PATCH 2/2] Add time component to enrollmentDate default value --- .../src/programs/programs-form.workspace.tsx | 46 ++++++------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/packages/esm-patient-programs-app/src/programs/programs-form.workspace.tsx b/packages/esm-patient-programs-app/src/programs/programs-form.workspace.tsx index 639510b40..5352af7a0 100644 --- a/packages/esm-patient-programs-app/src/programs/programs-form.workspace.tsx +++ b/packages/esm-patient-programs-app/src/programs/programs-form.workspace.tsx @@ -34,29 +34,13 @@ interface ProgramsFormProps extends DefaultPatientWorkspaceProps { } const createProgramsFormSchema = (t: TFunction) => - z - .object({ - selectedProgram: z.string().refine((value) => !!value, t('programRequired', 'Program is required')), - enrollmentDate: z.date(), - completionDate: z.date().nullable().optional(), - enrollmentLocation: z.string(), - selectedProgramStatus: z.string(), - }) - .refine( - (data) => { - if (data.completionDate) { - return ( - dayjs(data.completionDate).isSame(dayjs(data.enrollmentDate), 'day') || - dayjs(data.completionDate).isAfter(dayjs(data.enrollmentDate)) - ); - } - return true; - }, - { - message: t('completionDateInvalid', 'Completion date must be the same or after enrollment date'), - path: ['completionDate'], - }, - ); + z.object({ + selectedProgram: z.string().refine((value) => !!value, t('programRequired', 'Program is required')), + enrollmentDate: z.date(), + completionDate: z.date().nullable(), + enrollmentLocation: z.string(), + selectedProgramStatus: z.string(), + }); export type ProgramsFormData = z.infer>; @@ -112,8 +96,10 @@ const ProgramsForm: React.FC = ({ resolver: zodResolver(programsFormSchema), defaultValues: { selectedProgram: currentEnrollment?.program.uuid ?? '', - enrollmentDate: currentEnrollment?.dateEnrolled ? parseDate(currentEnrollment.dateEnrolled) : new Date(), - completionDate: currentEnrollment?.dateCompleted ? parseDate(currentEnrollment.dateCompleted) : null, + enrollmentDate: currentEnrollment?.dateEnrolled + ? dayjs(currentEnrollment.dateEnrolled).toDate() + : dayjs().startOf('day').toDate(), + completionDate: currentEnrollment?.dateCompleted ? dayjs(currentEnrollment.dateCompleted).toDate() : null, enrollmentLocation: getLocationUuid() ?? '', selectedProgramStatus: currentState?.state.uuid ?? '', }, @@ -136,7 +122,7 @@ const ProgramsForm: React.FC = ({ dateCompleted: completionDate ? dayjs(completionDate).format() : null, location: enrollmentLocation, states: - !!selectedProgramStatus && selectedProgramStatus !== currentState?.state.uuid + !!selectedProgramStatus && selectedProgramStatus != currentState?.state.uuid ? [{ state: { uuid: selectedProgramStatus } }] : [], }; @@ -217,7 +203,7 @@ const ProgramsForm: React.FC = ({ dateFormat="d/m/Y" maxDate={new Date().toISOString()} placeholder="dd/mm/yyyy" - onChange={([date]) => onChange(date)} + onChange={([date]) => onChange(date ? dayjs(date).toDate() : null)} value={value} > @@ -236,11 +222,7 @@ const ProgramsForm: React.FC = ({ id="completionDate" datePickerType="single" dateFormat="d/m/Y" - minDate={(() => { - const enrollmentDate = new Date(watch('enrollmentDate')); - enrollmentDate.setHours(0, 0, 0, 0); - return enrollmentDate; - })()} + minDate={new Date(watch('enrollmentDate')).toISOString()} maxDate={new Date().toISOString()} placeholder="dd/mm/yyyy" onChange={([date]) => onChange(date)}