From 547eb0b3aa313904cb5b6dfad3e99ab998fd3e5a Mon Sep 17 00:00:00 2001 From: Donald Kibet Date: Tue, 19 Mar 2024 11:09:37 +0300 Subject: [PATCH 1/2] (feat) re-use upcomming appointment work to mark appointments as `Checked In` --- .../esm-patient-chart-app/src/constants.ts | 1 + .../visit/hooks/useUpcomingAppointments.tsx | 16 +++++---- .../visit/visit-form/visit-form.component.tsx | 34 ++++++------------- .../translations/en.json | 4 +-- 4 files changed, 23 insertions(+), 32 deletions(-) diff --git a/packages/esm-patient-chart-app/src/constants.ts b/packages/esm-patient-chart-app/src/constants.ts index bffc0fb82b..d01f53acb8 100644 --- a/packages/esm-patient-chart-app/src/constants.ts +++ b/packages/esm-patient-chart-app/src/constants.ts @@ -5,3 +5,4 @@ export const spaBasePath = `${window.spaBase}${basePath}`; export const moduleName = '@openmrs/esm-patient-chart-app'; export const patientChartWorkspaceSlot = 'patient-chart-workspace-slot'; export const patientChartWorkspaceHeaderSlot = 'patient-chart-workspace-header-slot'; +export const omrsDateFormat = 'YYYY-MM-DDTHH:mm:ss.SSSZZ'; diff --git a/packages/esm-patient-chart-app/src/visit/hooks/useUpcomingAppointments.tsx b/packages/esm-patient-chart-app/src/visit/hooks/useUpcomingAppointments.tsx index a878cbb253..eaefdaf3d7 100644 --- a/packages/esm-patient-chart-app/src/visit/hooks/useUpcomingAppointments.tsx +++ b/packages/esm-patient-chart-app/src/visit/hooks/useUpcomingAppointments.tsx @@ -1,5 +1,6 @@ import dayjs from 'dayjs'; import { openmrsFetch, restBaseUrl, type OpenmrsResource } from '@openmrs/esm-framework'; +import { omrsDateFormat } from '../../constants'; export interface AppointmentPayload { patientUuid: string; @@ -17,13 +18,14 @@ export interface AppointmentPayload { dateHonored?: string; } -export function saveAppointment(appointment: AppointmentPayload, abortController: AbortController) { - return openmrsFetch(`${restBaseUrl}/appointment`, { +export const updateAppointmentStatus = async (toStatus: string, appointmentUuid: string) => { + const abortController = new AbortController(); + const statusChangeTime = dayjs(new Date()).format(omrsDateFormat); + const url = `${restBaseUrl}/appointments/${appointmentUuid}/status-change`; + return await openmrsFetch(url, { + body: { toStatus, onDate: statusChangeTime }, method: 'POST', + headers: { 'Content-Type': 'application/json' }, signal: abortController.signal, - headers: { - 'Content-Type': 'application/json', - }, - body: appointment, }); -} +}; diff --git a/packages/esm-patient-chart-app/src/visit/visit-form/visit-form.component.tsx b/packages/esm-patient-chart-app/src/visit/visit-form/visit-form.component.tsx index 9318b04a3d..56e3927b94 100644 --- a/packages/esm-patient-chart-app/src/visit/visit-form/visit-form.component.tsx +++ b/packages/esm-patient-chart-app/src/visit/visit-form/visit-form.component.tsx @@ -44,7 +44,7 @@ import { import { MemoizedRecommendedVisitType } from './recommended-visit-type.component'; import { type ChartConfig } from '../../config-schema'; import { saveQueueEntry } from '../hooks/useServiceQueue'; -import { type AppointmentPayload, saveAppointment } from '../hooks/useUpcomingAppointments'; +import { updateAppointmentStatus } from '../hooks/useUpcomingAppointments'; import { useLocations } from '../hooks/useLocations'; import { useVisitQueueEntry } from '../queue-entry/queue.resource'; import BaseVisitType from './base-visit-type.component'; @@ -375,28 +375,16 @@ const StartVisitForm: React.FC = ({ ); } if (config.showUpcomingAppointments && upcomingAppointment) { - const appointmentPayload: AppointmentPayload = { - appointmentKind: upcomingAppointment?.appointmentKind, - serviceUuid: upcomingAppointment?.service.uuid, - startDateTime: upcomingAppointment?.startDateTime, - endDateTime: upcomingAppointment?.endDateTime, - locationUuid: visitLocation?.uuid, - patientUuid: patientUuid, - uuid: upcomingAppointment?.uuid, - dateHonored: dayjs(visitStartDate).format(), - }; - saveAppointment(appointmentPayload, abortController).then( - ({ status }) => { - if (status === 201) { - mutateCurrentVisit(); - mutateVisits(); - showSnackbar({ - isLowContrast: true, - kind: 'success', - subtitle: t('appointmentUpdate', 'Upcoming appointment updated successfully'), - title: t('appointmentEdited', 'Appointment edited'), - }); - } + updateAppointmentStatus('CheckedIn', upcomingAppointment?.uuid).then( + () => { + mutateCurrentVisit(); + mutateVisits(); + showSnackbar({ + isLowContrast: true, + kind: 'success', + subtitle: t('appointmentMarkedChecked', 'Appointment marked as Checked In'), + title: t('appointmentCheckedIn', 'Appointment checked'), + }); }, (error) => { showSnackbar({ diff --git a/packages/esm-patient-chart-app/translations/en.json b/packages/esm-patient-chart-app/translations/en.json index b713cdef52..c2fd42b9f2 100644 --- a/packages/esm-patient-chart-app/translations/en.json +++ b/packages/esm-patient-chart-app/translations/en.json @@ -5,9 +5,9 @@ "all": "All", "allEncounters": "All encounters", "Allergies dashboard": "Allergies dashboard", - "appointmentEdited": "Appointment edited", + "appointmentCheckedIn": "Appointment checked", + "appointmentMarkedChecked": "Appointment marked as Checked In", "Appointments dashboard": "Appointments dashboard", - "appointmentUpdate": "Upcoming appointment updated successfully", "Attachments dashboard": "Attachments dashboard", "cancel": "Cancel", "cancelActiveVisitConfirmation": "Are you sure you want to cancel this active visit?", From 3d6ba9e35d99a5d5a8388e3f66f4899f296e6ef6 Mon Sep 17 00:00:00 2001 From: Donald Kibet Date: Wed, 20 Mar 2024 09:14:28 +0300 Subject: [PATCH 2/2] addressing code reviews changes --- .../src/visit/hooks/useUpcomingAppointments.tsx | 11 +++++++---- .../src/visit/visit-form/visit-form.component.tsx | 4 ++-- packages/esm-patient-chart-app/translations/en.json | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/esm-patient-chart-app/src/visit/hooks/useUpcomingAppointments.tsx b/packages/esm-patient-chart-app/src/visit/hooks/useUpcomingAppointments.tsx index eaefdaf3d7..4c8f8db0d9 100644 --- a/packages/esm-patient-chart-app/src/visit/hooks/useUpcomingAppointments.tsx +++ b/packages/esm-patient-chart-app/src/visit/hooks/useUpcomingAppointments.tsx @@ -1,5 +1,5 @@ import dayjs from 'dayjs'; -import { openmrsFetch, restBaseUrl, type OpenmrsResource } from '@openmrs/esm-framework'; +import { openmrsFetch, restBaseUrl, type OpenmrsResource, useAbortController } from '@openmrs/esm-framework'; import { omrsDateFormat } from '../../constants'; export interface AppointmentPayload { @@ -18,9 +18,12 @@ export interface AppointmentPayload { dateHonored?: string; } -export const updateAppointmentStatus = async (toStatus: string, appointmentUuid: string) => { - const abortController = new AbortController(); - const statusChangeTime = dayjs(new Date()).format(omrsDateFormat); +export const updateAppointmentStatus = async ( + toStatus: string, + appointmentUuid: string, + abortController: AbortController, +) => { + const statusChangeTime = dayjs().format(omrsDateFormat); const url = `${restBaseUrl}/appointments/${appointmentUuid}/status-change`; return await openmrsFetch(url, { body: { toStatus, onDate: statusChangeTime }, diff --git a/packages/esm-patient-chart-app/src/visit/visit-form/visit-form.component.tsx b/packages/esm-patient-chart-app/src/visit/visit-form/visit-form.component.tsx index 56e3927b94..d698aa241f 100644 --- a/packages/esm-patient-chart-app/src/visit/visit-form/visit-form.component.tsx +++ b/packages/esm-patient-chart-app/src/visit/visit-form/visit-form.component.tsx @@ -375,7 +375,7 @@ const StartVisitForm: React.FC = ({ ); } if (config.showUpcomingAppointments && upcomingAppointment) { - updateAppointmentStatus('CheckedIn', upcomingAppointment?.uuid).then( + updateAppointmentStatus('CheckedIn', upcomingAppointment?.uuid, abortController).then( () => { mutateCurrentVisit(); mutateVisits(); @@ -383,7 +383,7 @@ const StartVisitForm: React.FC = ({ isLowContrast: true, kind: 'success', subtitle: t('appointmentMarkedChecked', 'Appointment marked as Checked In'), - title: t('appointmentCheckedIn', 'Appointment checked'), + title: t('appointmentCheckedIn', 'Appointment Checked In'), }); }, (error) => { diff --git a/packages/esm-patient-chart-app/translations/en.json b/packages/esm-patient-chart-app/translations/en.json index c2fd42b9f2..7bde1db556 100644 --- a/packages/esm-patient-chart-app/translations/en.json +++ b/packages/esm-patient-chart-app/translations/en.json @@ -5,7 +5,7 @@ "all": "All", "allEncounters": "All encounters", "Allergies dashboard": "Allergies dashboard", - "appointmentCheckedIn": "Appointment checked", + "appointmentCheckedIn": "Appointment checked in", "appointmentMarkedChecked": "Appointment marked as Checked In", "Appointments dashboard": "Appointments dashboard", "Attachments dashboard": "Attachments dashboard",