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

(feat) O3-2163: Add support for editing end visit data/time on current visits #1712

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Expand Up @@ -108,8 +108,8 @@ const StartVisitForm: React.FC<StartVisitFormProps> = ({
const [extraVisitInfo, setExtraVisitInfo] = useState(null);

const displayVisitStopDateTimeFields = useMemo(
() => visitToEdit?.stopDatetime || showVisitEndDateTimeFields,
[visitToEdit?.stopDatetime, showVisitEndDateTimeFields],
() => visitToEdit?.uuid || showVisitEndDateTimeFields,
[visitToEdit?.uuid, showVisitEndDateTimeFields],
);

const visitFormSchema = useMemo(() => {
Expand All @@ -127,6 +127,13 @@ const StartVisitForm: React.FC<StartVisitFormProps> = ({
{},
);

const visitStopTimeValidation = z
.string()
.refine(
(value) => (!visitToEdit?.stopDatetime && !value) || value.match(time12HourFormatRegex),
t('invalidTimeFormat', 'Invalid time format'),
);

return z.object({
visitStartDate: z.date().refine(
(value) => {
Expand All @@ -145,13 +152,9 @@ const StartVisitForm: React.FC<StartVisitFormProps> = ({
.string()
.refine((value) => value.match(time12HourFormatRegex), t('invalidTimeFormat', 'Invalid time format')),
visitStartTimeFormat: z.enum(['PM', 'AM']),
visitStopDate: displayVisitStopDateTimeFields ? z.date() : z.date().optional(),
visitStopTime: displayVisitStopDateTimeFields
? z
.string()
.refine((value) => value.match(time12HourFormatRegex), t('invalidTimeFormat', 'Invalid time format'))
: z.string().optional(),
visitStopTimeFormat: displayVisitStopDateTimeFields ? z.enum(['PM', 'AM']) : z.enum(['PM', 'AM']).optional(),
visitStopDate: visitToEdit?.stopDatetime ? z.date() : z.date().optional(),
visitStopTime: visitToEdit?.stopDatetime ? visitStopTimeValidation : visitStopTimeValidation.optional(),
visitStopTimeFormat: visitToEdit?.stopDatetime ? z.enum(['PM', 'AM']) : z.enum(['PM', 'AM']).optional(),
programType: z.string().optional(),
visitType: z.string().refine((value) => !!value, t('visitTypeRequired', 'Visit type is required')),
visitLocation: z.object({
Expand All @@ -160,7 +163,7 @@ const StartVisitForm: React.FC<StartVisitFormProps> = ({
}),
visitAttributes: z.object(visitAttributes),
});
}, [t, config, displayVisitStopDateTimeFields]);
}, [t, config, visitToEdit?.stopDatetime, displayVisitStopDateTimeFields]);

const defaultValues = useMemo(() => {
const visitStartDate = visitToEdit?.startDatetime ? new Date(visitToEdit?.startDatetime) : new Date();
Expand Down Expand Up @@ -256,31 +259,33 @@ const StartVisitForm: React.FC<StartVisitFormProps> = ({
const visitStopTime = getValues('visitStopTime');
const visitStopTimeFormat = getValues('visitStopTimeFormat');

const [visitStopHours, visitStopMinutes] = convertTime12to24(visitStopTime, visitStopTimeFormat);

const visitStopDatetime = visitStopDate.setHours(visitStopHours, visitStopMinutes);

if (minVisitStopDatetime && visitStopDatetime <= minVisitStopDatetime) {
validSubmission = false;
setError('visitStopDate', {
message: t(
'visitStopDateMustBeAfterMostRecentEncounter',
'Stop date needs to be on or after {{lastEncounterDatetime}}',
{
lastEncounterDatetime: new Date(minVisitStopDatetime).toLocaleString(),
interpolation: {
escapeValue: false,
if (visitStopDate && visitStopTime && visitStopTimeFormat) {
const [visitStopHours, visitStopMinutes] = convertTime12to24(visitStopTime, visitStopTimeFormat);

const visitStopDatetime = visitStopDate.setHours(visitStopHours, visitStopMinutes);

if (minVisitStopDatetime && visitStopDatetime <= minVisitStopDatetime) {
validSubmission = false;
setError('visitStopDate', {
message: t(
'visitStopDateMustBeAfterMostRecentEncounter',
'Stop date needs to be on or after {{lastEncounterDatetime}}',
{
lastEncounterDatetime: new Date(minVisitStopDatetime).toLocaleString(),
interpolation: {
escapeValue: false,
},
},
},
),
});
}
),
});
}

if (visitStartDatetime >= visitStopDatetime) {
validSubmission = false;
setError('visitStopDate', {
message: t('invalidVisitStopDate', 'Visit stop date time cannot be on or before visit start date time'),
});
if (visitStartDatetime >= visitStopDatetime) {
validSubmission = false;
setError('visitStopDate', {
message: t('invalidVisitStopDate', 'Visit stop date time cannot be on or before visit start date time'),
});
}
}

return validSubmission;
Expand Down Expand Up @@ -335,7 +340,7 @@ const StartVisitForm: React.FC<StartVisitFormProps> = ({
delete payload.patient;
}

if (displayVisitStopDateTimeFields) {
if (displayVisitStopDateTimeFields && visitStopDate && visitStopTime && visitStopTimeFormat) {
const [visitStopHours, visitStopMinutes] = convertTime12to24(visitStopTime, visitStopTimeFormat);

payload.stopDatetime = toDateObjectStrict(
Expand Down