From 3d796ac2d0193c4022b7fbf95d60b85b447ae83d Mon Sep 17 00:00:00 2001 From: Donald Kibet Date: Sun, 5 Jan 2025 17:16:21 +0300 Subject: [PATCH] (feat) : Add cross border work with MPI workflow --- .../mpi/mpi-patient.resource.ts | 21 ++- .../patient-registration-hooks.ts | 21 ++- .../patient-registration-utils.ts | 5 +- .../esm-patient-search-app/package-lock.json | 4 +- packages/esm-patient-search-app/package.json | 4 +- packages/esm-patient-search-app/src/index.ts | 2 +- .../esm-patient-search-app/src/mpi/utils.ts | 10 +- .../banner/patient-banner.component.tsx | 2 +- .../src/patient-search.resource.tsx | 12 +- yarn.lock | 161 ++---------------- 10 files changed, 57 insertions(+), 185 deletions(-) diff --git a/packages/esm-patient-registration-app/src/patient-registration/mpi/mpi-patient.resource.ts b/packages/esm-patient-registration-app/src/patient-registration/mpi/mpi-patient.resource.ts index a79cb3fe9..be25a8861 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/mpi/mpi-patient.resource.ts +++ b/packages/esm-patient-registration-app/src/patient-registration/mpi/mpi-patient.resource.ts @@ -1,18 +1,21 @@ -import { fhirBaseUrl, openmrsFetch } from '@openmrs/esm-framework'; import useSWR from 'swr'; +const fetcher = (url: string) => { + const headers = new Headers(); + headers.append('Content-Type', 'application/json'); + headers.append('Authorization', `Basic ${btoa('kemr:password')}`); + return fetch(url, { headers }).then((res) => res.json()); +}; + export function useMpiPatient(patientId: string) { - const url = `${fhirBaseUrl}/Patient/${patientId}/$cr`; + const url = `https://hiedhs.intellisoftkenya.com/fhir/Patient?_id=${patientId}`; - const { - data: patient, - error: error, - isLoading: isLoading, - } = useSWR<{ data: fhir.Patient }, Error>(url, openmrsFetch); + const { data: patient, error: error, isLoading: isLoading } = useSWR<{ data: fhir.Bundle }, Error>(url, fetcher); + const patientInfo = patient?.['entry']?.[0]?.resource; return { isLoading, - patient, - error: error, + patient: patientInfo, + error, }; } diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-hooks.ts b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-hooks.ts index edab5ea24..0d1c829fa 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-hooks.ts +++ b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-hooks.ts @@ -196,7 +196,7 @@ export function useInitialFormValuesLocal(patientUuid: string): [FormValues, Dis if (!isLoadingObs) { setInitialFormValues((initialFormValues) => ({ ...initialFormValues, obs: obs, observation: observations })); } - }, [isLoadingObs]); + }, [isLoadingObs, obs, observations]); // Set Initial encounter @@ -207,7 +207,7 @@ export function useInitialFormValuesLocal(patientUuid: string): [FormValues, Dis concepts: [...occupation, ...martialStatus, ...education], })); } - }, [educationLoad]); + }, [educationLoad, martialStatus, education, occupation]); return [initialFormValues, setInitialFormValues]; } @@ -244,19 +244,18 @@ export function useMpiInitialFormValues(patientUuid: string): [FormValues, Dispa useEffect(() => { (async () => { - if (mpiPatient?.data?.identifier) { - const identifiers = await getIdentifierFieldValuesFromFhirPatient( - mpiPatient.data, - fieldConfigurations.identifierMappings, - ); + if (mpiPatient) { + // const identifiers = await getIdentifierFieldValuesFromFhirPatient( + // mpiPatient.data, + // fieldConfigurations.identifier, + // ); const values = { ...initialMPIFormValues, - ...getFormValuesFromFhirPatient(mpiPatient.data), - address: getAddressFieldValuesFromFhirPatient(mpiPatient.data), - identifiers, + ...getFormValuesFromFhirPatient(mpiPatient), + address: getAddressFieldValuesFromFhirPatient(mpiPatient), attributes: getPhonePersonAttributeValueFromFhirPatient( - mpiPatient.data, + mpiPatient, fieldConfigurations.phone.personAttributeUuid, ), }; diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts index 48ed91872..25c033f93 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts +++ b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts @@ -110,10 +110,9 @@ export function getFormValuesFromFhirPatient(patient: fhir.Patient) { const result = {} as FormValues; const patientName = patient.name[0]; const additionalPatientName = patient.name[1]; - result.patientUuid = patient.id; - result.givenName = patientName?.given[0]; - result.middleName = patientName?.given[1]; + result.givenName = patientName?.given?.[0]; + result.middleName = patientName?.given?.[1]; result.familyName = patientName?.family; result.addNameInLocalLanguage = !!additionalPatientName ? true : undefined; result.additionalGivenName = additionalPatientName?.given?.[0] ?? undefined; diff --git a/packages/esm-patient-search-app/package-lock.json b/packages/esm-patient-search-app/package-lock.json index 3ab18434c..0ce1b819d 100644 --- a/packages/esm-patient-search-app/package-lock.json +++ b/packages/esm-patient-search-app/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@kenyaemr/esm-patient-search-app", + "name": "@openmrs/esm-patient-search-app", "version": "8.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@kenyaemr/esm-patient-search-app", + "name": "@openmrs/esm-patient-search-app", "version": "8.0.2", "license": "MPL-2.0", "dependencies": { diff --git a/packages/esm-patient-search-app/package.json b/packages/esm-patient-search-app/package.json index 21d4267ca..ef8a31035 100644 --- a/packages/esm-patient-search-app/package.json +++ b/packages/esm-patient-search-app/package.json @@ -1,8 +1,8 @@ { - "name": "@kenyaemr/esm-patient-search-app", + "name": "@openmrs/esm-patient-search-app", "version": "8.0.2", "description": "Patient search microfrontend for the OpenMRS SPA", - "browser": "dist/kenyaemr-esm-patient-search-app.js", + "browser": "dist/openmrs-esm-patient-search-app.js", "main": "src/index.ts", "source": true, "license": "MPL-2.0", diff --git a/packages/esm-patient-search-app/src/index.ts b/packages/esm-patient-search-app/src/index.ts index 6d7566da5..0237fa27d 100644 --- a/packages/esm-patient-search-app/src/index.ts +++ b/packages/esm-patient-search-app/src/index.ts @@ -15,7 +15,7 @@ import patientSearchIconComponent from './patient-search-icon'; import patientSearchButtonComponent from './patient-search-button/patient-search-button.component'; import patientSearchBarComponent from './compact-patient-search-extension'; -const moduleName = '@kenyaemr/esm-patient-search-app'; +const moduleName = '@openmrs/esm-patient-search-app'; const options = { featureName: 'patient-search', diff --git a/packages/esm-patient-search-app/src/mpi/utils.ts b/packages/esm-patient-search-app/src/mpi/utils.ts index 27880a659..52c65c975 100644 --- a/packages/esm-patient-search-app/src/mpi/utils.ts +++ b/packages/esm-patient-search-app/src/mpi/utils.ts @@ -6,6 +6,10 @@ export function inferModeFromSearchParams(searchParams: URLSearchParams): 'mpi' } export function mapToOpenMRSPatient(fhirPatients: fhir.Bundle, nameTemplate: string): Array { + if (!fhirPatients) { + return []; + } + if (fhirPatients.total < 1) { return []; } @@ -35,9 +39,9 @@ export function mapToOpenMRSPatient(fhirPatients: fhir.Bundle, nameTemplate: str deathDate: fhirPatient.deceasedDateTime, personName: { display: formatName(fhirPatient, nameTemplate), - givenName: fhirPatient?.name?.[0]?.given?.[0], - familyName: fhirPatient?.name?.[0]?.family, - middleName: fhirPatient?.name?.[0]?.given?.[1], + givenName: fhirPatient.name[0]?.given[0], + familyName: fhirPatient.name[0]?.family, + middleName: fhirPatient.name[0]?.given[1], }, }, attributes: [], diff --git a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.component.tsx b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.component.tsx index 2306a1eec..1476f651c 100644 --- a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.component.tsx +++ b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.component.tsx @@ -68,7 +68,7 @@ const PatientBanner: React.FC = ({ patient, patientUuid, hid const handleCreatePatientRecord = (externalId: string) => { navigate({ - to: `${window.getOpenmrsSpaBase()}patient-registration?sourceRecord=${externalId}`, + to: `${window.getOpenmrsSpaBase()}patient-registration?sourceRecord=${patient.externalId}`, }); }; diff --git a/packages/esm-patient-search-app/src/patient-search.resource.tsx b/packages/esm-patient-search-app/src/patient-search.resource.tsx index ccc046eb3..94cc36dfd 100644 --- a/packages/esm-patient-search-app/src/patient-search.resource.tsx +++ b/packages/esm-patient-search-app/src/patient-search.resource.tsx @@ -91,7 +91,7 @@ export function useInfinitePatientSearch( if (prevPageData && !prevPageData?.data?.link.some((link) => link.relation === 'next')) { return null; } - let url = `${fhirBaseUrl}/Patient/$cr-search?name=${searchQuery}`; + let url = `https://hiedhs.intellisoftkenya.com/fhir/Patient?name=${searchQuery}`; return url; }, @@ -106,6 +106,12 @@ export function useInfinitePatientSearch( openmrsFetch, ); + const fetcher = (url: string) => { + const headers = new Headers(); + headers.append('Content-Type', 'application/json'); + headers.append('Authorization', `Basic ${btoa('kemr:password')}`); + return fetch(url, { headers }).then((res) => res.json()); + }; const { data: mpiData, isLoading: isLoadingMpi, @@ -115,7 +121,7 @@ export function useInfinitePatientSearch( size: mpiSize, } = useSWRInfinite( shouldFetch ? (searchMode == 'mpi' ? getExtUrl : null) : null, - openmrsFetch, + searchMode == 'mpi' ? fetcher : openmrsFetch, ); const { nameTemplate } = useConfig() as PatientSearchConfig; @@ -123,7 +129,7 @@ export function useInfinitePatientSearch( const mappedData = searchMode === 'mpi' ? mpiData - ? mapToOpenMRSPatient(mpiData ? mpiData[0].data : null, nameTemplate) + ? mapToOpenMRSPatient(mpiData ? (mpiData[0] as any) : null, nameTemplate) : null : data?.flatMap((response) => response?.data?.results ?? []) ?? null; diff --git a/yarn.lock b/yarn.lock index 7aa384f1e..778756bba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2882,7 +2882,7 @@ __metadata: lodash-es: "npm:^4.17.15" webpack: "npm:^5.74.0" peerDependencies: - "@openmrs/esm-framework": 5.x + "@openmrs/esm-framework": 6.x dayjs: 1.x react: ^18.1.0 react-dom: ^18.1.0 @@ -2901,8 +2901,8 @@ __metadata: webpack: "npm:^5.74.0" yup: "npm:^0.32.11" peerDependencies: - "@openmrs/esm-framework": 5.x - "@openmrs/esm-patient-common-lib": 8.x + "@openmrs/esm-framework": 6.x + "@openmrs/esm-patient-common-lib": 9.x react: 18.x react-i18next: 11.x react-router-dom: 6.x @@ -2918,7 +2918,7 @@ __metadata: lodash-es: "npm:^4.17.15" webpack: "npm:^5.74.0" peerDependencies: - "@openmrs/esm-framework": 5.x + "@openmrs/esm-framework": 6.x dayjs: 1.x react: 18.x react-i18next: 11.x @@ -2937,7 +2937,7 @@ __metadata: lodash-es: "npm:^4.17.15" webpack: "npm:^5.74.0" peerDependencies: - "@openmrs/esm-framework": 5.x + "@openmrs/esm-framework": 6.x react: 18.x react-i18next: 11.x react-router-dom: 6.x @@ -2956,7 +2956,7 @@ __metadata: webpack: "npm:^5.74.0" yup: "npm:^0.29.1" peerDependencies: - "@openmrs/esm-framework": 5.x + "@openmrs/esm-framework": 6.x dayjs: 1.x react: 18.x react-i18next: 11.x @@ -2965,31 +2965,18 @@ __metadata: languageName: unknown linkType: soft -"@kenyaemr/esm-patient-search-app@workspace:packages/esm-patient-search-app": - version: 0.0.0-use.local - resolution: "@kenyaemr/esm-patient-search-app@workspace:packages/esm-patient-search-app" - dependencies: - "@carbon/react": "npm:^1.71.0" - lodash-es: "npm:^4.17.15" - webpack: "npm:^5.74.0" - peerDependencies: - "@openmrs/esm-framework": 5.x - react: ^18.1.0 - react-i18next: 11.x - react-router-dom: 6.x - swr: 2.x - languageName: unknown - linkType: soft - "@kenyaemr/esm-service-queues-app@workspace:packages/esm-service-queues-app": version: 0.0.0-use.local resolution: "@kenyaemr/esm-service-queues-app@workspace:packages/esm-service-queues-app" dependencies: "@carbon/react": "npm:^1.71.0" + "@hookform/resolvers": "npm:^3.9.1" lodash-es: "npm:^4.17.15" + react-hook-form: "npm:^7.54.0" webpack: "npm:^5.74.0" + zod: "npm:^3.24.1" peerDependencies: - "@openmrs/esm-framework": 5.x + "@openmrs/esm-framework": 6.x react: ^18.1.0 react-i18next: 11.x react-router-dom: 6.x @@ -3005,7 +2992,7 @@ __metadata: lodash-es: "npm:^4.17.15" webpack: "npm:^5.74.0" peerDependencies: - "@openmrs/esm-framework": 5.x + "@openmrs/esm-framework": 6.x react: ^18.1.0 react-i18next: 11.x react-router-dom: 6.x @@ -3144,23 +3131,6 @@ __metadata: languageName: node linkType: hard -"@openmrs/esm-active-visits-app@workspace:packages/esm-active-visits-app": - version: 0.0.0-use.local - resolution: "@openmrs/esm-active-visits-app@workspace:packages/esm-active-visits-app" - dependencies: - "@carbon/react": "npm:^1.71.0" - lodash-es: "npm:^4.17.15" - webpack: "npm:^5.74.0" - peerDependencies: - "@openmrs/esm-framework": 6.x - dayjs: 1.x - react: ^18.1.0 - react-dom: ^18.1.0 - react-i18next: 11.x - swr: 2.x - languageName: unknown - linkType: soft - "@openmrs/esm-api@npm:6.0.1-pre.2553": version: 6.0.1-pre.2553 resolution: "@openmrs/esm-api@npm:6.0.1-pre.2553" @@ -3211,42 +3181,6 @@ __metadata: languageName: node linkType: hard -"@openmrs/esm-appointments-app@workspace:packages/esm-appointments-app": - version: 0.0.0-use.local - resolution: "@openmrs/esm-appointments-app@workspace:packages/esm-appointments-app" - dependencies: - "@carbon/react": "npm:^1.71.0" - formik: "npm:^2.2.9" - lodash-es: "npm:^4.17.15" - webpack: "npm:^5.74.0" - yup: "npm:^0.32.11" - peerDependencies: - "@openmrs/esm-framework": 6.x - "@openmrs/esm-patient-common-lib": 9.x - react: 18.x - react-i18next: 11.x - react-router-dom: 6.x - swr: 2.x - languageName: unknown - linkType: soft - -"@openmrs/esm-bed-management-app@workspace:packages/esm-bed-management-app": - version: 0.0.0-use.local - resolution: "@openmrs/esm-bed-management-app@workspace:packages/esm-bed-management-app" - dependencies: - "@carbon/react": "npm:^1.71.0" - lodash-es: "npm:^4.17.15" - webpack: "npm:^5.74.0" - peerDependencies: - "@openmrs/esm-framework": 6.x - dayjs: 1.x - react: 18.x - react-i18next: 11.x - react-router-dom: 6.x - swr: 2.x - languageName: unknown - linkType: soft - "@openmrs/esm-config@npm:6.0.1-pre.2553": version: 6.0.1-pre.2553 resolution: "@openmrs/esm-config@npm:6.0.1-pre.2553" @@ -3426,24 +3360,6 @@ __metadata: languageName: node linkType: hard -"@openmrs/esm-patient-list-management-app@workspace:packages/esm-patient-list-management-app": - version: 0.0.0-use.local - resolution: "@openmrs/esm-patient-list-management-app@workspace:packages/esm-patient-list-management-app" - dependencies: - "@carbon/react": "npm:^1.71.0" - dexie: "npm:^3.0.3" - fuzzy: "npm:^0.1.3" - lodash-es: "npm:^4.17.15" - webpack: "npm:^5.74.0" - peerDependencies: - "@openmrs/esm-framework": 6.x - react: 18.x - react-i18next: 11.x - react-router-dom: 6.x - swr: 2.x - languageName: unknown - linkType: soft - "@openmrs/esm-patient-management@workspace:.": version: 0.0.0-use.local resolution: "@openmrs/esm-patient-management@workspace:." @@ -3514,26 +3430,6 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-patient-registration-app@workspace:packages/esm-patient-registration-app": - version: 0.0.0-use.local - resolution: "@openmrs/esm-patient-registration-app@workspace:packages/esm-patient-registration-app" - dependencies: - "@carbon/react": "npm:^1.71.0" - formik: "npm:^2.1.5" - lodash-es: "npm:^4.17.15" - uuid: "npm:^8.3.2" - webpack: "npm:^5.74.0" - yup: "npm:^0.29.1" - peerDependencies: - "@openmrs/esm-framework": 6.x - dayjs: 1.x - react: 18.x - react-i18next: 11.x - react-router-dom: 6.x - swr: 2.x - languageName: unknown - linkType: soft - "@openmrs/esm-patient-search-app@workspace:packages/esm-patient-search-app": version: 0.0.0-use.local resolution: "@openmrs/esm-patient-search-app@workspace:packages/esm-patient-search-app" @@ -3592,25 +3488,6 @@ __metadata: languageName: node linkType: hard -"@openmrs/esm-service-queues-app@workspace:packages/esm-service-queues-app": - version: 0.0.0-use.local - resolution: "@openmrs/esm-service-queues-app@workspace:packages/esm-service-queues-app" - dependencies: - "@carbon/react": "npm:^1.71.0" - "@hookform/resolvers": "npm:^3.9.1" - lodash-es: "npm:^4.17.15" - react-hook-form: "npm:^7.54.0" - webpack: "npm:^5.74.0" - zod: "npm:^3.24.1" - peerDependencies: - "@openmrs/esm-framework": 6.x - react: ^18.1.0 - react-i18next: 11.x - react-router-dom: 6.x - swr: 2.x - languageName: unknown - linkType: soft - "@openmrs/esm-state@npm:6.0.1-pre.2553": version: 6.0.1-pre.2553 resolution: "@openmrs/esm-state@npm:6.0.1-pre.2553" @@ -3680,22 +3557,6 @@ __metadata: languageName: node linkType: hard -"@openmrs/esm-ward-app@workspace:packages/esm-ward-app": - version: 0.0.0-use.local - resolution: "@openmrs/esm-ward-app@workspace:packages/esm-ward-app" - dependencies: - "@carbon/react": "npm:^1.71.0" - lodash-es: "npm:^4.17.15" - webpack: "npm:^5.74.0" - peerDependencies: - "@openmrs/esm-framework": 6.x - react: ^18.1.0 - react-i18next: 11.x - react-router-dom: 6.x - swr: 2.x - languageName: unknown - linkType: soft - "@openmrs/webpack-config@npm:6.0.1-pre.2553": version: 6.0.1-pre.2553 resolution: "@openmrs/webpack-config@npm:6.0.1-pre.2553"