@kenyaemr/esm-express-workflow-app 5.4.3 → 5.4.4-pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +13 -11
- package/dist/1074.js +1 -0
- package/dist/1074.js.map +1 -0
- package/dist/1084.js +1 -0
- package/dist/1084.js.map +1 -0
- package/dist/12.js +17 -0
- package/dist/12.js.map +1 -0
- package/dist/126.js +1 -0
- package/dist/126.js.map +1 -0
- package/dist/1311.js +1 -0
- package/dist/1311.js.map +1 -0
- package/dist/1323.js +1 -0
- package/dist/1323.js.map +1 -0
- package/dist/1469.js +1 -0
- package/dist/1469.js.map +1 -0
- package/dist/1506.js +13 -0
- package/dist/1506.js.map +1 -0
- package/dist/1760.js +1 -0
- package/dist/1760.js.map +1 -0
- package/dist/1780.js +1 -0
- package/dist/1780.js.map +1 -0
- package/dist/1791.js +1 -0
- package/dist/1791.js.map +1 -0
- package/dist/1884.js +1 -0
- package/dist/1884.js.map +1 -0
- package/dist/1972.js +1 -0
- package/dist/1972.js.map +1 -0
- package/dist/1990.js +1 -0
- package/dist/1990.js.map +1 -0
- package/dist/2016.js +1 -0
- package/dist/2016.js.map +1 -0
- package/dist/2024.js +1 -0
- package/dist/2024.js.map +1 -0
- package/dist/2153.js +1 -0
- package/dist/2153.js.map +1 -0
- package/dist/216.js +1 -0
- package/dist/216.js.map +1 -0
- package/dist/2225.js +1 -0
- package/dist/2225.js.map +1 -0
- package/dist/2294.js +1 -0
- package/dist/2294.js.map +1 -0
- package/dist/2345.js +1 -0
- package/dist/2345.js.map +1 -0
- package/dist/2386.js +1 -0
- package/dist/2386.js.map +1 -0
- package/dist/2438.js +1 -0
- package/dist/2438.js.map +1 -0
- package/dist/2499.js +1 -0
- package/dist/2499.js.map +1 -0
- package/dist/2500.js +1 -0
- package/dist/2500.js.map +1 -0
- package/dist/2586.js +1 -0
- package/dist/2586.js.map +1 -0
- package/dist/2625.js +1 -0
- package/dist/2625.js.map +1 -0
- package/dist/2685.js +1 -0
- package/dist/2685.js.map +1 -0
- package/dist/2757.js +1 -0
- package/dist/2757.js.map +1 -0
- package/dist/2851.js +1 -0
- package/dist/2851.js.map +1 -0
- package/dist/2881.js +1 -0
- package/dist/2881.js.map +1 -0
- package/dist/2948.js +1 -0
- package/dist/2948.js.map +1 -0
- package/dist/2968.js +1 -0
- package/dist/2968.js.map +1 -0
- package/dist/2998.js +1 -0
- package/dist/2998.js.map +1 -0
- package/dist/30.js +1 -0
- package/dist/30.js.map +1 -0
- package/dist/3089.js +1 -0
- package/dist/3089.js.map +1 -0
- package/dist/3139.js +1 -0
- package/dist/3139.js.map +1 -0
- package/dist/3220.js +1 -0
- package/dist/3220.js.map +1 -0
- package/dist/3265.js +1 -0
- package/dist/3265.js.map +1 -0
- package/dist/3548.js +1 -0
- package/dist/3548.js.map +1 -0
- package/dist/3567.js +1 -0
- package/dist/3567.js.map +1 -0
- package/dist/3571.js +1 -0
- package/dist/3571.js.map +1 -0
- package/dist/3691.js +1 -0
- package/dist/3691.js.map +1 -0
- package/dist/3730.js +1 -0
- package/dist/3730.js.map +1 -0
- package/dist/3923.js +1 -0
- package/dist/3923.js.map +1 -0
- package/dist/3963.js +1 -0
- package/dist/3963.js.map +1 -0
- package/dist/4024.js +1 -0
- package/dist/4024.js.map +1 -0
- package/dist/405.js +1 -0
- package/dist/405.js.map +1 -0
- package/dist/4296.js +1 -0
- package/dist/4296.js.map +1 -0
- package/dist/4504.js +1 -0
- package/dist/4504.js.map +1 -0
- package/dist/4564.js +1 -0
- package/dist/4564.js.map +1 -0
- package/dist/4581.js +1 -0
- package/dist/4581.js.map +1 -0
- package/dist/4670.js +1 -0
- package/dist/4670.js.map +1 -0
- package/dist/4680.js +1 -0
- package/dist/4680.js.map +1 -0
- package/dist/4682.js +1 -0
- package/dist/4682.js.map +1 -0
- package/dist/4735.js +1 -0
- package/dist/4735.js.map +1 -0
- package/dist/4737.js +1 -0
- package/dist/4737.js.map +1 -0
- package/dist/4744.js +1 -0
- package/dist/4744.js.map +1 -0
- package/dist/4795.js +1 -0
- package/dist/4795.js.map +1 -0
- package/dist/4813.js +2 -0
- package/dist/4813.js.map +1 -0
- package/dist/4818.js +1 -0
- package/dist/4818.js.map +1 -0
- package/dist/4858.js +1 -0
- package/dist/4858.js.map +1 -0
- package/dist/487.js +1 -0
- package/dist/487.js.map +1 -0
- package/dist/4970.js +1 -0
- package/dist/4970.js.map +1 -0
- package/dist/5047.js +1 -0
- package/dist/5047.js.map +1 -0
- package/dist/5054.js +1 -0
- package/dist/5054.js.map +1 -0
- package/dist/5202.js +1 -0
- package/dist/5202.js.map +1 -0
- package/dist/5491.js +1 -0
- package/dist/5491.js.map +1 -0
- package/dist/5592.js +1 -0
- package/dist/5592.js.map +1 -0
- package/dist/5669.js +1 -0
- package/dist/5669.js.map +1 -0
- package/dist/5787.js +1 -0
- package/dist/5787.js.map +1 -0
- package/dist/586.js +1 -0
- package/dist/586.js.map +1 -0
- package/dist/5879.js +1 -0
- package/dist/5879.js.map +1 -0
- package/dist/5904.js +1 -0
- package/dist/5904.js.map +1 -0
- package/dist/5986.js +1 -0
- package/dist/5986.js.map +1 -0
- package/dist/6007.js +11 -0
- package/dist/6007.js.map +1 -0
- package/dist/6075.js +1 -0
- package/dist/6075.js.map +1 -0
- package/dist/6258.js +1 -0
- package/dist/6258.js.map +1 -0
- package/dist/629.js +1 -0
- package/dist/629.js.map +1 -0
- package/dist/6328.js +1 -0
- package/dist/6328.js.map +1 -0
- package/dist/6355.js +1 -0
- package/dist/6355.js.map +1 -0
- package/dist/64.js +1 -0
- package/dist/64.js.map +1 -0
- package/dist/6445.js +1 -0
- package/dist/6445.js.map +1 -0
- package/dist/6456.js +1 -0
- package/dist/6466.js +3 -0
- package/dist/6466.js.map +1 -0
- package/dist/6663.js +1 -0
- package/dist/6663.js.map +1 -0
- package/dist/6720.js +1 -0
- package/dist/6720.js.map +1 -0
- package/dist/6798.js +66 -0
- package/dist/6798.js.map +1 -0
- package/dist/6925.js +1 -0
- package/dist/6925.js.map +1 -0
- package/dist/7201.js +1 -0
- package/dist/7201.js.map +1 -0
- package/dist/7234.js +1 -0
- package/dist/7234.js.map +1 -0
- package/dist/7261.js +1 -0
- package/dist/7261.js.map +1 -0
- package/dist/7326.js +1 -0
- package/dist/7359.js +1 -0
- package/dist/7405.js +1 -0
- package/dist/7405.js.map +1 -0
- package/dist/7591.js +1 -0
- package/dist/7591.js.map +1 -0
- package/dist/7602.js +1 -0
- package/dist/7602.js.map +1 -0
- package/dist/7607.js +1 -0
- package/dist/7701.js +1 -0
- package/dist/7701.js.map +1 -0
- package/dist/7717.js +1 -0
- package/dist/7717.js.map +1 -0
- package/dist/7739.js +1 -0
- package/dist/7739.js.map +1 -0
- package/dist/7788.js +1 -0
- package/dist/7788.js.map +1 -0
- package/dist/7819.js +1 -0
- package/dist/7819.js.map +1 -0
- package/dist/7820.js +1 -0
- package/dist/7820.js.map +1 -0
- package/dist/7844.js +1 -0
- package/dist/7844.js.map +1 -0
- package/dist/7971.js +1 -0
- package/dist/7971.js.map +1 -0
- package/dist/807.js +1 -0
- package/dist/807.js.map +1 -0
- package/dist/8159.js +7 -0
- package/dist/8159.js.map +1 -0
- package/dist/8338.js +1 -0
- package/dist/8338.js.map +1 -0
- package/dist/845.js +1 -0
- package/dist/845.js.map +1 -0
- package/dist/8566.js +1 -0
- package/dist/8566.js.map +1 -0
- package/dist/8570.js +1 -0
- package/dist/8570.js.map +1 -0
- package/dist/8613.js +1 -0
- package/dist/8613.js.map +1 -0
- package/dist/8682.js +1 -0
- package/dist/8682.js.map +1 -0
- package/dist/87.js +1 -0
- package/dist/87.js.map +1 -0
- package/dist/8727.js +1 -0
- package/dist/8766.js +1 -0
- package/dist/8766.js.map +1 -0
- package/dist/8799.js +1 -0
- package/dist/8799.js.map +1 -0
- package/dist/8828.js +1 -0
- package/dist/8828.js.map +1 -0
- package/dist/8860.js +1 -0
- package/dist/8860.js.map +1 -0
- package/dist/8911.js +1 -0
- package/dist/8911.js.map +1 -0
- package/dist/8930.js +1 -0
- package/dist/8930.js.map +1 -0
- package/dist/8971.js +1 -0
- package/dist/8971.js.map +1 -0
- package/dist/9011.js +1 -0
- package/dist/9011.js.map +1 -0
- package/dist/9111.js +1 -0
- package/dist/9111.js.map +1 -0
- package/dist/9124.js +1 -0
- package/dist/9124.js.map +1 -0
- package/dist/9157.js +1 -0
- package/dist/9157.js.map +1 -0
- package/dist/9161.js +1 -0
- package/dist/9161.js.map +1 -0
- package/dist/9182.js +1 -0
- package/dist/921.js +1 -0
- package/dist/921.js.map +1 -0
- package/dist/9212.js +1 -0
- package/dist/9212.js.map +1 -0
- package/dist/9255.js +1 -0
- package/dist/9255.js.map +1 -0
- package/dist/9257.js +1 -0
- package/dist/9257.js.map +1 -0
- package/dist/9343.js +1 -0
- package/dist/9343.js.map +1 -0
- package/dist/9404.js +1 -0
- package/dist/9404.js.map +1 -0
- package/dist/9446.js +1 -0
- package/dist/9446.js.map +1 -0
- package/dist/9449.js +1 -0
- package/dist/9449.js.map +1 -0
- package/dist/9488.js +1 -0
- package/dist/9488.js.map +1 -0
- package/dist/9514.js +1 -0
- package/dist/9514.js.map +1 -0
- package/dist/9528.js +1 -0
- package/dist/9528.js.map +1 -0
- package/dist/9535.js +1 -0
- package/dist/9535.js.map +1 -0
- package/dist/9606.js +1 -0
- package/dist/9606.js.map +1 -0
- package/dist/9834.js +1 -0
- package/dist/9834.js.map +1 -0
- package/dist/9845.js +1 -0
- package/dist/9845.js.map +1 -0
- package/dist/9848.js +1 -0
- package/dist/9848.js.map +1 -0
- package/dist/kenyaemr-esm-express-workflow-app.js +5 -5
- package/dist/kenyaemr-esm-express-workflow-app.js.buildmanifest.json +3394 -173
- package/dist/kenyaemr-esm-express-workflow-app.js.map +1 -1
- package/dist/main.js +7 -106
- package/dist/main.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +7 -8
- package/rspack.config.js +1 -1
- package/src/components/accounting/index.tsx +11 -10
- package/src/components/admissions/admissions-dashboard.component.tsx +2 -2
- package/src/components/admissions/index.tsx +11 -10
- package/src/components/anaesthetic/anaesthetic-dashboard.meta.ts +8 -0
- package/src/components/anaesthetic/anaesthetic-data-form.component.tsx +442 -0
- package/src/components/anaesthetic/anaesthetic-data-form.scss +278 -0
- package/src/components/anaesthetic/anaesthetic-link.component.tsx +21 -0
- package/src/components/anaesthetic/anaesthetic.component.tsx +618 -0
- package/src/components/anaesthetic/anaesthetic.resource.ts +1503 -0
- package/src/components/anaesthetic/anaesthetic.scss +1885 -0
- package/src/components/anaesthetic/forms/anaesthetic-form.component.tsx +304 -0
- package/src/components/anaesthetic/forms/anaesthetic-record-form.component.tsx +707 -0
- package/src/components/anaesthetic/forms/icd11-diagnosis-search.component.tsx +178 -0
- package/src/components/anaesthetic/forms/icd11-diagnosis-search.scss +126 -0
- package/src/components/anaesthetic/forms/index.ts +2 -0
- package/src/components/anaesthetic/forms/interoperative-record-drug-given-form.component.tsx +231 -0
- package/src/components/anaesthetic/forms/post-operative-summary-form.component.tsx +171 -0
- package/src/components/anaesthetic/forms/time-picker-dropdown.component.tsx +202 -0
- package/src/components/anaesthetic/forms/time-picker-dropdown.scss +107 -0
- package/src/components/anaesthetic/forms/time-picker-with-clock.component.tsx +174 -0
- package/src/components/anaesthetic/forms/time-picker-with-clock.scss +178 -0
- package/src/components/anaesthetic/forms/useAnaestheticData.ts +16 -0
- package/src/components/anaesthetic/graphs/anaesthetic-graph-wrapper.component.tsx +266 -0
- package/src/components/anaesthetic/graphs/anaesthetic-graph.component.tsx +185 -0
- package/src/components/anaesthetic/graphs/index.ts +2 -0
- package/src/components/anaesthetic/graphs/interoperative-record-drug-given-graph-wrapper.component.tsx +197 -0
- package/src/components/anaesthetic/graphs/interoperative-record-drug-given-graph.component.tsx +93 -0
- package/src/components/anaesthetic/resources/anaesthetic-amniotic-fluid.resource.ts +277 -0
- package/src/components/anaesthetic/resources/anaesthetic-form.resource.ts +716 -0
- package/src/components/anaesthetic/resources/anaesthetic.resource.ts +378 -0
- package/src/components/anaesthetic/types/index.ts +1349 -0
- package/src/components/appointments/index.ts +10 -8
- package/src/components/consultation/clinical-encounter/clinical-encounter.component.tsx +4 -20
- package/src/components/consultation/clinical-encounter/encounter-details.component.tsx +9 -9
- package/src/components/consultation/clinical-encounter/encounter-details.test.tsx +19 -18
- package/src/components/consultation/consultation-context.tsx +19 -0
- package/src/components/consultation/consultation-summary-cards.component.tsx +124 -0
- package/src/components/consultation/consultation.component.tsx +41 -268
- package/src/components/consultation/consultation.resource.ts +67 -24
- package/src/components/consultation/consultation.scss +5 -0
- package/src/components/consultation/consultation.utils.tsx +222 -0
- package/src/components/consultation/dashboard.component.tsx +0 -2
- package/src/components/consultation/index.ts +28 -21
- package/src/components/consultation/tabs/index.ts +67 -0
- package/src/components/facility-dashboard/components/header/home-header.component.tsx +8 -13
- package/src/components/facility-dashboard/index.tsx +10 -9
- package/src/components/laboratory/index.ts +22 -10
- package/src/components/laboratory/lab-table.component.tsx +40 -12
- package/src/components/laboratory/laboratory-tabs.component.tsx +3 -17
- package/src/components/mch/dashboard.component.tsx +0 -2
- package/src/components/mch/index.tsx +10 -9
- package/src/components/mch/mch.component.tsx +1 -3
- package/src/components/mch/mch.consultation.component.tsx +27 -15
- package/src/components/mch/mch.triage.component.tsx +42 -33
- package/src/components/pharmacy/index.ts +21 -19
- package/src/components/pharmacy/orders/pharmacy-orders.component.tsx +35 -13
- package/src/components/pharmacy/orders/pharmacy-orders.test.tsx +8 -7
- package/src/components/pharmacy/pharmacy-tabs.component.tsx +4 -20
- package/src/components/pharmacy/tabs/index.ts +21 -0
- package/src/components/preauth/index.ts +22 -0
- package/src/components/preauth/preauth-dashboard.component.tsx +20 -0
- package/src/components/procedures/index.ts +27 -10
- package/src/components/procedures/procedure-queues/index.ts +13 -0
- package/src/components/procedures/procedure-queues/procedure-form-extras.component.tsx +33 -0
- package/src/components/procedures/procedure-queues/procedure-form-extras.scss +5 -0
- package/src/components/procedures/procedure-queues/procedure-queues.component.tsx +35 -0
- package/src/components/procedures/procedure-queues/procedure-queues.resources.ts +37 -0
- package/src/components/procedures/procedure-queues/procedure-room-tabs.component.tsx +80 -0
- package/src/components/procedures/procedure-queues/procedure-rooms.scss +13 -0
- package/src/components/procedures/procedure-queues/queue-procedure-tabs.component.tsx +34 -0
- package/src/components/procedures/procedure-queues/summary-cards.component.tsx +81 -0
- package/src/components/procedures/procedure-queues/summary-cards.scss +35 -0
- package/src/components/procedures/procedures-table.component.tsx +69 -19
- package/src/components/procedures/procedures-tabs.component.test.tsx +57 -0
- package/src/components/procedures/procedures-tabs.component.tsx +3 -18
- package/src/components/radiology-and-imaging/index.ts +25 -10
- package/src/components/radiology-and-imaging/radiology-and-imaging-table.component.tsx +62 -21
- package/src/components/radiology-and-imaging/radiology-and-imaging.component.tsx +3 -19
- package/src/components/registration/card/HIE-card/hie-card.component.tsx +32 -44
- package/src/components/registration/card/Local-card/local-card.component.tsx +22 -24
- package/src/components/registration/checkin-form-extra/checkin-form-extra.extension.tsx +8 -2
- package/src/components/registration/checkin-form-extra/queue-fields.component.tsx +18 -19
- package/src/components/registration/dependants/dependants.component.tsx +37 -60
- package/src/components/registration/dependants/dependants.resource.ts +79 -50
- package/src/components/registration/end-visit-modal/end-visit-dialog.modal.tsx +320 -0
- package/src/components/registration/end-visit-modal/end-visit-dialog.scss +12 -0
- package/src/components/registration/end-visit-modal/end-visit.resource.tsx +59 -0
- package/src/components/registration/end-visit-modal/sha-end-visit.resource.ts +285 -0
- package/src/components/registration/helper/index.ts +4 -0
- package/src/components/registration/index.ts +10 -9
- package/src/components/registration/search-bar/search-bar.resource.ts +32 -93
- package/src/components/registration/start-visit-form/hooks/useDefaultFacilityLocation.tsx +15 -0
- package/src/components/registration/start-visit-form/hooks/useDefaultVisitLocation.tsx +24 -0
- package/src/components/registration/start-visit-form/hooks/useOfflineVisitType.tsx +18 -0
- package/src/components/registration/start-visit-form/hooks/useRecommendedVisitTypes.tsx +36 -0
- package/src/components/registration/start-visit-form/hooks/useVisitAttributeType.tsx +102 -0
- package/src/components/registration/start-visit-form/overflow-menu-extension/custom-end-active-visit.extension.tsx +44 -0
- package/src/components/registration/start-visit-form/overflow-menu-extension/overflow-menu-item.extension.tsx +57 -0
- package/src/components/registration/start-visit-form/overflow-menu-extension/overflow-menu-item.scss +3 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/base-visit-type.component.tsx +126 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/base-visit-type.scss +75 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/exported-visit-form.workspace.tsx +759 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/location-selector.component.tsx +86 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/recommended-visit-type.component.tsx +32 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/visit-attribute-type.component.tsx +257 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/visit-attribute-type.scss +5 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/visit-date-time.component.tsx +193 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/visit-form.resource.ts +389 -0
- package/src/components/registration/start-visit-form/start-visit-workspace/visit-form.scss +144 -0
- package/src/components/registration/start-visit-form/visit-form-workspace/visit-form.workspace.tsx +48 -0
- package/src/components/registration/type/index.ts +101 -0
- package/src/components/reports/index.ts +11 -9
- package/src/components/triage/dashboard.component.tsx +0 -2
- package/src/components/triage/index.ts +10 -9
- package/src/components/triage/triage.component.tsx +92 -42
- package/src/components/triage/triage.resource.ts +56 -50
- package/src/components/triage/triage.scss +6 -0
- package/src/config-schema.ts +482 -0
- package/src/hooks/useOrders.tsx +2 -2
- package/src/hooks/useServiceQueues.tsx +95 -25
- package/src/index.ts +84 -28
- package/src/routes.json +290 -32
- package/src/shared/dashboard-link/dashboard-link.component.tsx +11 -8
- package/src/shared/orders/OrderTable.tsx +19 -3
- package/src/shared/otp-verification/index.ts +112 -29
- package/src/shared/otp-verification/otp-verification.modal.tsx +1110 -122
- package/src/shared/otp-verification/otp-verification.scss +374 -0
- package/src/shared/patient-chart/patient-summary-dashboard/patient-summary-dashboard.component.tsx +5 -85
- package/src/shared/pin-put/pinput.component.test.tsx +7 -6
- package/src/shared/queue/queue-entry/queue-entry-table.component.tsx +99 -88
- package/src/shared/queue/queue-entry/queue-entry-table.scss +4 -0
- package/src/shared/queue/queue-summary-cards.component.tsx +32 -0
- package/src/shared/queue/queue-tab.component.tsx +182 -70
- package/src/shared/queue/queue-tab.scss +1 -0
- package/src/shared/queue/queue-workflow-context.tsx +90 -0
- package/src/shared/tabs/create-tab-extension.tsx +33 -0
- package/src/shared/tabs/extension-tabs.component.tsx +51 -30
- package/src/shared/utils/index.ts +119 -5
- package/src/types/index.ts +29 -2
- package/translations/am.json +426 -133
- package/translations/en.json +312 -19
- package/translations/fr.json +351 -63
- package/translations/sw.json +330 -37
- package/dist/127.js +0 -1
- package/dist/200.js +0 -1
- package/dist/200.js.map +0 -1
- package/dist/24.js +0 -1
- package/dist/24.js.map +0 -1
- package/dist/267.js +0 -1
- package/dist/267.js.map +0 -1
- package/dist/285.js +0 -1
- package/dist/285.js.map +0 -1
- package/dist/329.js +0 -1
- package/dist/329.js.map +0 -1
- package/dist/40.js +0 -1
- package/dist/466.js +0 -1
- package/dist/466.js.map +0 -1
- package/dist/472.js +0 -66
- package/dist/472.js.map +0 -1
- package/dist/490.js +0 -1
- package/dist/490.js.map +0 -1
- package/dist/54.js +0 -1
- package/dist/54.js.map +0 -1
- package/dist/689.js +0 -1
- package/dist/689.js.map +0 -1
- package/dist/697.js +0 -1
- package/dist/697.js.map +0 -1
- package/dist/704.js +0 -1
- package/dist/704.js.map +0 -1
- package/dist/710.js +0 -1
- package/dist/710.js.map +0 -1
- package/dist/729.js +0 -17
- package/dist/729.js.map +0 -1
- package/dist/805.js +0 -37
- package/dist/805.js.map +0 -1
- package/dist/847.js +0 -1
- package/dist/847.js.map +0 -1
- package/dist/85.js +0 -1
- package/dist/85.js.map +0 -1
- package/dist/882.js +0 -1
- package/dist/91.js +0 -1
- package/dist/91.js.map +0 -1
- package/dist/916.js +0 -1
- package/dist/994.js +0 -1
- package/dist/994.js.map +0 -1
- package/dist/998.js +0 -1
- package/dist/998.js.map +0 -1
- package/jest.config.js +0 -3
- package/src/shared/orders/OrdersTabs.tsx +0 -58
- package/src/shared/patient-chart/patient-chart.component.tsx +0 -61
- package/src/shared/patient-chart/patient-chart.resources.ts +0 -184
- package/src/shared/patient-chart/patient-chart.scss +0 -15
- package/src/shared/patient-chart/useInitialize.ts +0 -24
- /package/src/shared/{patient-chart/patient-summary-dashboard → tabs}/patient-summary-dashboard.scss +0 -0
|
@@ -1,28 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import
|
|
3
|
-
import OrdersTabs from '../../shared/orders/OrdersTabs';
|
|
4
|
-
import LabTable from './radiology-and-imaging-table.component';
|
|
5
|
-
import { ExpressWorkflowConfig } from '../../config-schema';
|
|
2
|
+
import ExtensionTabs from '../../shared/tabs/extension-tabs.component';
|
|
6
3
|
|
|
7
4
|
type RadiologyAndImagingTabsProps = {
|
|
8
5
|
patientUuid: string;
|
|
9
|
-
patient: fhir.Patient;
|
|
10
6
|
};
|
|
11
|
-
const imagingRadiologyConceptClassUuid = '8caa332c-efe4-4025-8b18-3398328e1323';
|
|
12
7
|
|
|
13
|
-
const RadiologyAndImagingTabs: React.FC<RadiologyAndImagingTabsProps> = ({ patientUuid
|
|
14
|
-
|
|
15
|
-
return (
|
|
16
|
-
<OrdersTabs
|
|
17
|
-
patientUuid={patientUuid}
|
|
18
|
-
patient={patient}
|
|
19
|
-
basePath="radiology-and-imaging"
|
|
20
|
-
resultsSlotName="ewf-radiology-and-imaging-results-slot"
|
|
21
|
-
orderTypeUuid={imagingOrderTypeUuid}
|
|
22
|
-
filter={(order) => order.concept?.conceptClass?.uuid === imagingRadiologyConceptClassUuid}
|
|
23
|
-
Table={({ orders }) => <LabTable orders={orders} />}
|
|
24
|
-
/>
|
|
25
|
-
);
|
|
8
|
+
const RadiologyAndImagingTabs: React.FC<RadiologyAndImagingTabsProps> = ({ patientUuid }) => {
|
|
9
|
+
return <ExtensionTabs extensionSlotName="patient-imaging-tabs-slot" patientUuid={patientUuid} />;
|
|
26
10
|
};
|
|
27
11
|
|
|
28
12
|
export default RadiologyAndImagingTabs;
|
|
@@ -7,13 +7,21 @@ import styles from '../card.scss';
|
|
|
7
7
|
import DependentsComponent from '../../dependants/dependants.component';
|
|
8
8
|
import { LocalResponse, type HIEBundleResponse, type EligibilityResponse } from '../../type';
|
|
9
9
|
import { hasDependents } from '../../helper';
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
launchWorkspace2,
|
|
12
|
+
launchWorkspaceGroup2,
|
|
13
|
+
PatientPhoto,
|
|
14
|
+
showModal,
|
|
15
|
+
navigate,
|
|
16
|
+
type Visit,
|
|
17
|
+
} from '@openmrs/esm-framework';
|
|
11
18
|
import { EnhancedPatientBannerPatientInfo } from '../../patient-banner/patient-banner.component';
|
|
12
19
|
import { findExistingLocalPatient, registerOrLaunchHIEPatient } from '../../search-bar/search-bar.resource';
|
|
13
20
|
import { launchOtpVerificationModal } from '../../../../shared/otp-verification';
|
|
14
21
|
import { otpManager, useOtpSource, cleanupAllOTPs } from './hie-card.resource';
|
|
15
22
|
import { useMultipleActiveVisits } from '../../dependants/dependants.resource';
|
|
16
23
|
import { sanitizePhoneNumber } from '../../../../shared/utils';
|
|
24
|
+
import { VisitFormProps } from '../../start-visit-form/visit-form-workspace/visit-form.workspace';
|
|
17
25
|
|
|
18
26
|
interface HIEDisplayCardProps {
|
|
19
27
|
bundle: HIEBundleResponse;
|
|
@@ -140,6 +148,25 @@ const HIEDisplayCard: React.FC<HIEDisplayCardProps> = ({
|
|
|
140
148
|
return '254700000000';
|
|
141
149
|
};
|
|
142
150
|
|
|
151
|
+
const launchCheckInWorkspace = async (patient: any, patientUuid: string) => {
|
|
152
|
+
await launchWorkspaceGroup2('ewf-patient-chart', {
|
|
153
|
+
patient,
|
|
154
|
+
patientUuid,
|
|
155
|
+
visitContext: null as unknown as Visit,
|
|
156
|
+
mutateVisitContext: () => {},
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
launchWorkspace2<VisitFormProps, {}, {}>(
|
|
160
|
+
'custom-start-visit-workspace-form',
|
|
161
|
+
{
|
|
162
|
+
openedFrom: 'registration-check-in',
|
|
163
|
+
showPatientHeader: false,
|
|
164
|
+
},
|
|
165
|
+
{},
|
|
166
|
+
null,
|
|
167
|
+
);
|
|
168
|
+
};
|
|
169
|
+
|
|
143
170
|
const handleOTPRequest = (patientUuid: string) => {
|
|
144
171
|
setOtpRequestedFor((prev) => new Set(prev).add(patientUuid));
|
|
145
172
|
};
|
|
@@ -170,9 +197,7 @@ const HIEDisplayCard: React.FC<HIEDisplayCardProps> = ({
|
|
|
170
197
|
if (!otpSource) {
|
|
171
198
|
throw new Error('OTP source not configured. Please contact your administrator.');
|
|
172
199
|
}
|
|
173
|
-
|
|
174
200
|
otpManager.setOtpSource(otpSource);
|
|
175
|
-
|
|
176
201
|
await otpManager.requestOTP(sanitizedPhone, patientName, otpExpiryMinutes, searchedNationalId, patientUuid);
|
|
177
202
|
} catch (error) {
|
|
178
203
|
throw error;
|
|
@@ -184,9 +209,7 @@ const HIEDisplayCard: React.FC<HIEDisplayCardProps> = ({
|
|
|
184
209
|
if (!otpSource) {
|
|
185
210
|
throw new Error('OTP source not configured. Please contact your administrator.');
|
|
186
211
|
}
|
|
187
|
-
|
|
188
212
|
otpManager.setOtpSource(otpSource);
|
|
189
|
-
|
|
190
213
|
const isValid = await otpManager.verifyOTP(sanitizedPhone, otp, patientUuid);
|
|
191
214
|
if (!isValid) {
|
|
192
215
|
throw new Error('OTP verification failed');
|
|
@@ -312,21 +335,7 @@ const HIEDisplayCard: React.FC<HIEDisplayCardProps> = ({
|
|
|
312
335
|
<Button
|
|
313
336
|
kind="secondary"
|
|
314
337
|
size="sm"
|
|
315
|
-
onClick={() =>
|
|
316
|
-
const localPatientName =
|
|
317
|
-
localPatient?.person?.personName?.display ||
|
|
318
|
-
`${localPatient?.person?.personName?.givenName || ''} ${
|
|
319
|
-
localPatient?.person?.personName?.middleName || ''
|
|
320
|
-
} ${localPatient?.person?.personName?.familyName || ''}`.trim() ||
|
|
321
|
-
patientName;
|
|
322
|
-
|
|
323
|
-
launchWorkspace('start-visit-workspace-form', {
|
|
324
|
-
patientUuid: localPatient.uuid,
|
|
325
|
-
workspaceTitle: t('startVisitWorkspaceTitle', 'Start Visit for {{patientName}}', {
|
|
326
|
-
patientName: localPatientName,
|
|
327
|
-
}),
|
|
328
|
-
});
|
|
329
|
-
}}>
|
|
338
|
+
onClick={() => launchCheckInWorkspace(localPatient, localPatient.uuid)}>
|
|
330
339
|
{t('checkIn', 'Check In')}
|
|
331
340
|
</Button>
|
|
332
341
|
)}
|
|
@@ -345,27 +354,8 @@ const HIEDisplayCard: React.FC<HIEDisplayCardProps> = ({
|
|
|
345
354
|
kind="secondary"
|
|
346
355
|
size="sm"
|
|
347
356
|
onClick={async () => {
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
patientUuid: localPatient.uuid,
|
|
351
|
-
workspaceTitle: t('checkInPatientWorkspaceTitle', 'Check in patient'),
|
|
352
|
-
closeWorkspace: () => {
|
|
353
|
-
closeWorkspace('start-visit-workspace-form', {
|
|
354
|
-
onWorkspaceClose: () => {
|
|
355
|
-
navigate({ to: `\${openmrsSpaBase}/patient/${localPatient.uuid}/chart` });
|
|
356
|
-
},
|
|
357
|
-
ignoreChanges: true,
|
|
358
|
-
});
|
|
359
|
-
},
|
|
360
|
-
closeWorkspaceWithSavedChanges: () => {
|
|
361
|
-
closeWorkspace('start-visit-workspace-form', {
|
|
362
|
-
onWorkspaceClose: () => {
|
|
363
|
-
navigate({ to: `\${openmrsSpaBase}/patient/${localPatient.uuid}/chart` });
|
|
364
|
-
},
|
|
365
|
-
ignoreChanges: true,
|
|
366
|
-
});
|
|
367
|
-
},
|
|
368
|
-
});
|
|
357
|
+
const registeredPatient = await registerOrLaunchHIEPatient(patient, t);
|
|
358
|
+
await launchCheckInWorkspace(registeredPatient, registeredPatient.uuid);
|
|
369
359
|
}}>
|
|
370
360
|
{t('checkIn', 'Check In')}
|
|
371
361
|
</Button>
|
|
@@ -376,9 +366,7 @@ const HIEDisplayCard: React.FC<HIEDisplayCardProps> = ({
|
|
|
376
366
|
iconDescription={showDependents ? 'Hide dependents' : 'Show dependents'}
|
|
377
367
|
kind="tertiary"
|
|
378
368
|
size="sm"
|
|
379
|
-
onClick={() =>
|
|
380
|
-
toggleDependentsVisibility(patientKey);
|
|
381
|
-
}}
|
|
369
|
+
onClick={() => toggleDependentsVisibility(patientKey)}
|
|
382
370
|
renderIcon={showDependents ? ChevronUp : ChevronDown}>
|
|
383
371
|
{showDependents
|
|
384
372
|
? t('hideDependents', 'Hide dependents')
|
|
@@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next';
|
|
|
5
5
|
import classNames from 'classnames';
|
|
6
6
|
import styles from '../card.scss';
|
|
7
7
|
import { LocalResponse, type HIEBundleResponse, type EligibilityResponse } from '../../type';
|
|
8
|
-
import {
|
|
8
|
+
import { launchWorkspace2, launchWorkspaceGroup2, PatientPhoto, showModal, type Visit } from '@openmrs/esm-framework';
|
|
9
9
|
import { EnhancedPatientBannerPatientInfo } from '../../patient-banner/patient-banner.component';
|
|
10
10
|
import { convertLocalPatientToFHIR, getNationalIdFromPatient, hasDependents } from '../../helper';
|
|
11
11
|
import { launchOtpVerificationModal } from '../../../../shared/otp-verification';
|
|
@@ -13,6 +13,7 @@ import DependentsComponent from '../../dependants/dependants.component';
|
|
|
13
13
|
import { useMultipleActiveVisits } from '../../dependants/dependants.resource';
|
|
14
14
|
import { otpManager, useOtpSource, cleanupAllOTPs } from '../HIE-card/hie-card.resource';
|
|
15
15
|
import { sanitizePhoneNumber } from '../../../../shared/utils';
|
|
16
|
+
import { VisitFormProps } from '../../start-visit-form/visit-form-workspace/visit-form.workspace';
|
|
16
17
|
|
|
17
18
|
interface LocalPatientCardProps {
|
|
18
19
|
localSearchResults: LocalResponse;
|
|
@@ -46,7 +47,6 @@ const LocalPatientCard: React.FC<LocalPatientCardProps> = ({
|
|
|
46
47
|
}
|
|
47
48
|
}, [otpSource]);
|
|
48
49
|
|
|
49
|
-
// Clean up OTPs when component unmounts
|
|
50
50
|
useEffect(() => {
|
|
51
51
|
return () => {
|
|
52
52
|
cleanupAllOTPs();
|
|
@@ -114,6 +114,25 @@ const LocalPatientCard: React.FC<LocalPatientCardProps> = ({
|
|
|
114
114
|
return '254700000000';
|
|
115
115
|
}, []);
|
|
116
116
|
|
|
117
|
+
const launchCheckInWorkspace = async (patient: any, patientUuid: string) => {
|
|
118
|
+
const groupProps = {
|
|
119
|
+
patient,
|
|
120
|
+
patientUuid,
|
|
121
|
+
visitContext: null as unknown as Visit,
|
|
122
|
+
mutateVisitContext: () => {},
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
launchWorkspace2<VisitFormProps, {}, {}>(
|
|
126
|
+
'custom-start-visit-workspace-form',
|
|
127
|
+
{
|
|
128
|
+
openedFrom: 'registration-check-in',
|
|
129
|
+
showPatientHeader: false,
|
|
130
|
+
},
|
|
131
|
+
{},
|
|
132
|
+
groupProps,
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
|
|
117
136
|
const handleOTPRequest = useCallback((patientUuid: string) => {
|
|
118
137
|
setOtpRequestedFor((prev) => new Set(prev).add(patientUuid));
|
|
119
138
|
}, []);
|
|
@@ -141,9 +160,7 @@ const LocalPatientCard: React.FC<LocalPatientCardProps> = ({
|
|
|
141
160
|
if (!otpSource) {
|
|
142
161
|
throw new Error('OTP source not configured. Please contact your administrator.');
|
|
143
162
|
}
|
|
144
|
-
|
|
145
163
|
otpManager.setOtpSource(otpSource);
|
|
146
|
-
|
|
147
164
|
await otpManager.requestOTP(sanitizedPhone, patientName, otpExpiryMinutes, searchedNationalId, patientUuid);
|
|
148
165
|
} catch (error) {
|
|
149
166
|
throw error;
|
|
@@ -155,9 +172,7 @@ const LocalPatientCard: React.FC<LocalPatientCardProps> = ({
|
|
|
155
172
|
if (!otpSource) {
|
|
156
173
|
throw new Error('OTP source not configured. Please contact your administrator.');
|
|
157
174
|
}
|
|
158
|
-
|
|
159
175
|
otpManager.setOtpSource(otpSource);
|
|
160
|
-
|
|
161
176
|
const isValid = await otpManager.verifyOTP(sanitizedPhone, otp, patientUuid);
|
|
162
177
|
if (!isValid) {
|
|
163
178
|
throw new Error('OTP verification failed');
|
|
@@ -207,7 +222,6 @@ const LocalPatientCard: React.FC<LocalPatientCardProps> = ({
|
|
|
207
222
|
const hasActiveVisit = !!activeVisit;
|
|
208
223
|
|
|
209
224
|
const hiePatientData: any = findHIEPatientData(localPatient);
|
|
210
|
-
|
|
211
225
|
const patientHasDependents: boolean = hiePatientData ? hasDependents(hiePatientData) : false;
|
|
212
226
|
const showDependents: boolean = showDependentsForPatient.has(patientUuid);
|
|
213
227
|
|
|
@@ -230,7 +244,6 @@ const LocalPatientCard: React.FC<LocalPatientCardProps> = ({
|
|
|
230
244
|
<div className={styles.patientAvatar} role="img">
|
|
231
245
|
<PatientPhoto patientUuid={patientUuid} patientName={patientName} />
|
|
232
246
|
</div>
|
|
233
|
-
|
|
234
247
|
<EnhancedPatientBannerPatientInfo
|
|
235
248
|
patient={fhirPatient}
|
|
236
249
|
renderedFrom="local-search"
|
|
@@ -291,22 +304,7 @@ const LocalPatientCard: React.FC<LocalPatientCardProps> = ({
|
|
|
291
304
|
<Button
|
|
292
305
|
kind="primary"
|
|
293
306
|
size="sm"
|
|
294
|
-
onClick={() =>
|
|
295
|
-
launchWorkspace('start-visit-workspace-form', {
|
|
296
|
-
patientUuid: patientUuid,
|
|
297
|
-
workspaceTitle: t('checkInPatientWorkspaceTitle', 'Check in patient'),
|
|
298
|
-
closeWorkspace: () => {
|
|
299
|
-
closeWorkspace('start-visit-workspace-form', {
|
|
300
|
-
ignoreChanges: true,
|
|
301
|
-
});
|
|
302
|
-
},
|
|
303
|
-
closeWorkspaceWithSavedChanges: () => {
|
|
304
|
-
closeWorkspace('start-visit-workspace-form', {
|
|
305
|
-
ignoreChanges: true,
|
|
306
|
-
});
|
|
307
|
-
},
|
|
308
|
-
});
|
|
309
|
-
}}>
|
|
307
|
+
onClick={() => launchCheckInWorkspace(localPatient, patientUuid)}>
|
|
310
308
|
{t('checkIn', 'Check In')}
|
|
311
309
|
</Button>
|
|
312
310
|
)}
|
|
@@ -13,6 +13,7 @@ export interface CheckinFormExtraExtensionProps {
|
|
|
13
13
|
isDHAWorkflow: boolean;
|
|
14
14
|
};
|
|
15
15
|
patientUuid: string;
|
|
16
|
+
visitStatus: string;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
/**
|
|
@@ -20,9 +21,14 @@ export interface CheckinFormExtraExtensionProps {
|
|
|
20
21
|
* It is used slotted into the patient-chart's start visit form
|
|
21
22
|
*/
|
|
22
23
|
const CheckinFormExtraExtension: React.FC<CheckinFormExtraExtensionProps> = (props) => {
|
|
23
|
-
const { setVisitFormCallbacks, visitFormOpenedFrom, patientChartConfig } = props;
|
|
24
|
+
const { setVisitFormCallbacks, visitFormOpenedFrom, patientChartConfig, visitStatus } = props;
|
|
24
25
|
if (patientChartConfig.isDHAWorkflow || visitFormOpenedFrom == 'service-queues-add-patient') {
|
|
25
|
-
return
|
|
26
|
+
return (
|
|
27
|
+
<QueueFields
|
|
28
|
+
setOnSubmit={(onSubmit) => setVisitFormCallbacks({ onVisitCreatedOrUpdated: onSubmit })}
|
|
29
|
+
visitStatus={visitStatus}
|
|
30
|
+
/>
|
|
31
|
+
);
|
|
26
32
|
} else {
|
|
27
33
|
return <></>;
|
|
28
34
|
}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
InlineNotification,
|
|
3
|
-
RadioButton,
|
|
4
|
-
RadioButtonGroup,
|
|
5
|
-
RadioButtonSkeleton,
|
|
6
|
-
Select,
|
|
7
|
-
SelectItem,
|
|
8
|
-
SelectSkeleton,
|
|
9
|
-
} from '@carbon/react';
|
|
1
|
+
import { InlineNotification, RadioButton, RadioButtonGroup, Select, SelectItem, SelectSkeleton } from '@carbon/react';
|
|
10
2
|
import { ResponsiveWrapper, showSnackbar, useConfig, useSession, type Visit } from '@openmrs/esm-framework';
|
|
11
3
|
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
12
4
|
import { useTranslation } from 'react-i18next';
|
|
@@ -16,21 +8,23 @@ import { ExpressWorkflowConfig } from '../../../config-schema';
|
|
|
16
8
|
|
|
17
9
|
export interface QueueFieldsProps {
|
|
18
10
|
setOnSubmit(onSubmit: (visit: Visit) => Promise<any>);
|
|
11
|
+
visitStatus: string;
|
|
19
12
|
}
|
|
20
13
|
|
|
21
|
-
const PATIENT_CATEGORIES = [
|
|
22
|
-
{ id: 'triage', name: 'Triage' },
|
|
23
|
-
{ id: 'walk-in', name: 'Walk-in' },
|
|
24
|
-
];
|
|
25
|
-
|
|
26
14
|
/**
|
|
27
15
|
* This component contains form fields for starting a patient's queue entry.
|
|
28
16
|
*/
|
|
29
|
-
const QueueFields: React.FC<QueueFieldsProps> = ({ setOnSubmit }) => {
|
|
17
|
+
const QueueFields: React.FC<QueueFieldsProps> = ({ setOnSubmit, visitStatus }) => {
|
|
30
18
|
const { t } = useTranslation();
|
|
19
|
+
const patientCategory = useMemo(
|
|
20
|
+
() => [
|
|
21
|
+
{ id: 'triage', name: t('triage', 'Triage') },
|
|
22
|
+
{ id: 'walk-in', name: t('walkIn', 'Walk-in') },
|
|
23
|
+
],
|
|
24
|
+
[t],
|
|
25
|
+
);
|
|
31
26
|
const { queueRooms, isLoading: isLoadingQueueRooms } = useQueueRooms();
|
|
32
27
|
const { sessionLocation } = useSession();
|
|
33
|
-
|
|
34
28
|
const {
|
|
35
29
|
visitQueueNumberAttributeUuid,
|
|
36
30
|
triageServiceConceptUuid,
|
|
@@ -84,7 +78,7 @@ const QueueFields: React.FC<QueueFieldsProps> = ({ setOnSubmit }) => {
|
|
|
84
78
|
|
|
85
79
|
const onSubmit = useCallback(
|
|
86
80
|
(visit: Visit) => {
|
|
87
|
-
if (selectedQueueRoom) {
|
|
81
|
+
if (selectedQueueRoom && visitStatus !== 'past') {
|
|
88
82
|
const selectedRoom = filteredQueueRooms.find((room) => room.uuid === selectedQueueRoom);
|
|
89
83
|
const queueUuid = selectedRoom?.queue?.uuid;
|
|
90
84
|
|
|
@@ -140,6 +134,7 @@ const QueueFields: React.FC<QueueFieldsProps> = ({ setOnSubmit }) => {
|
|
|
140
134
|
sessionLocation.uuid,
|
|
141
135
|
filteredQueueRooms,
|
|
142
136
|
t,
|
|
137
|
+
visitStatus,
|
|
143
138
|
],
|
|
144
139
|
);
|
|
145
140
|
|
|
@@ -157,6 +152,10 @@ const QueueFields: React.FC<QueueFieldsProps> = ({ setOnSubmit }) => {
|
|
|
157
152
|
}
|
|
158
153
|
}, [filteredQueueRooms, selectedQueueRoom]);
|
|
159
154
|
|
|
155
|
+
if (visitStatus === 'past') {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
|
|
160
159
|
return (
|
|
161
160
|
<div>
|
|
162
161
|
<section className={styles.section}>
|
|
@@ -169,7 +168,7 @@ const QueueFields: React.FC<QueueFieldsProps> = ({ setOnSubmit }) => {
|
|
|
169
168
|
orientation="vertical"
|
|
170
169
|
valueSelected={selectedCategory}
|
|
171
170
|
onChange={(value) => setSelectedCategory(String(value))}>
|
|
172
|
-
{
|
|
171
|
+
{patientCategory.map((category) => (
|
|
173
172
|
<RadioButton
|
|
174
173
|
key={category.id}
|
|
175
174
|
className={styles.radioButtonOption}
|
|
@@ -218,4 +217,4 @@ const QueueFields: React.FC<QueueFieldsProps> = ({ setOnSubmit }) => {
|
|
|
218
217
|
);
|
|
219
218
|
};
|
|
220
219
|
|
|
221
|
-
export default QueueFields;
|
|
220
|
+
export default React.memo(QueueFields);
|
|
@@ -2,16 +2,17 @@ import React, { useState, useEffect, useMemo, useCallback } from 'react';
|
|
|
2
2
|
import { DataTable, Table, TableHead, TableBody, TableRow, TableCell, TableHeader, Button, Tag } from '@carbon/react';
|
|
3
3
|
import { TwoFactorAuthentication } from '@carbon/react/icons';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
|
-
import {
|
|
5
|
+
import { launchWorkspace2, launchWorkspaceGroup2, showSnackbar, showModal, type Visit } from '@openmrs/esm-framework';
|
|
6
6
|
import capitalize from 'lodash/capitalize';
|
|
7
7
|
import styles from './dependants.scss';
|
|
8
8
|
import { maskName } from '../helper';
|
|
9
9
|
import { findExistingLocalPatient, registerOrLaunchDependent } from '../search-bar/search-bar.resource';
|
|
10
10
|
import { getDependentsFromContacts, useMultipleActiveVisits } from './dependants.resource';
|
|
11
|
-
import { DependentWithPhone,
|
|
11
|
+
import { DependentWithPhone, HIEPatient } from '../type';
|
|
12
12
|
import { otpManager, useOtpSource, cleanupAllOTPs } from '../card/HIE-card/hie-card.resource';
|
|
13
13
|
import { launchOtpVerificationModal } from '../../../shared/otp-verification';
|
|
14
14
|
import { sanitizePhoneNumber } from '../../../shared/utils';
|
|
15
|
+
import { VisitFormProps } from '../start-visit-form/visit-form-workspace/visit-form.workspace';
|
|
15
16
|
|
|
16
17
|
type DependentProps = {
|
|
17
18
|
patient: HIEPatient;
|
|
@@ -28,12 +29,11 @@ const DependentsComponent: React.FC<DependentProps> = ({
|
|
|
28
29
|
const [submittingStates, setSubmittingStates] = useState<Record<string, boolean>>({});
|
|
29
30
|
const [loadingStates, setLoadingStates] = useState<Record<string, boolean>>({});
|
|
30
31
|
const [localPatientCache, setLocalPatientCache] = useState<Map<string, any>>(new Map());
|
|
31
|
-
|
|
32
32
|
const [verifiedSpouses, setVerifiedSpouses] = useState<Set<string>>(new Set());
|
|
33
33
|
const [otpRequestedForSpouse, setOtpRequestedForSpouse] = useState<Set<string>>(new Set());
|
|
34
34
|
const [activePhoneNumbers, setActivePhoneNumbers] = useState<Map<string, string>>(new Map());
|
|
35
35
|
|
|
36
|
-
const { otpSource, isLoading: isLoadingOtpSource
|
|
36
|
+
const { otpSource, isLoading: isLoadingOtpSource } = useOtpSource();
|
|
37
37
|
|
|
38
38
|
useEffect(() => {
|
|
39
39
|
if (otpSource) {
|
|
@@ -74,7 +74,7 @@ const DependentsComponent: React.FC<DependentProps> = ({
|
|
|
74
74
|
}, []);
|
|
75
75
|
|
|
76
76
|
const getDependentPhoneNumber = useCallback(
|
|
77
|
-
(dependent: HIEPatient | DependentWithPhone): string
|
|
77
|
+
(dependent: HIEPatient | DependentWithPhone): string => {
|
|
78
78
|
if ('contact' in dependent && dependent.contact && Array.isArray(dependent.contact)) {
|
|
79
79
|
for (const contact of dependent.contact) {
|
|
80
80
|
if (contact.telecom && Array.isArray(contact.telecom)) {
|
|
@@ -82,7 +82,6 @@ const DependentsComponent: React.FC<DependentProps> = ({
|
|
|
82
82
|
(telecom) =>
|
|
83
83
|
telecom.system === 'phone' && telecom.value && telecom.value !== 'N/A' && telecom.value.trim() !== '',
|
|
84
84
|
);
|
|
85
|
-
|
|
86
85
|
if (phoneTelecom) {
|
|
87
86
|
return sanitizePhoneNumber(phoneTelecom.value);
|
|
88
87
|
}
|
|
@@ -99,7 +98,6 @@ const DependentsComponent: React.FC<DependentProps> = ({
|
|
|
99
98
|
attr.value.trim() !== '' &&
|
|
100
99
|
attr.value.trim().length > 0,
|
|
101
100
|
);
|
|
102
|
-
|
|
103
101
|
if (phoneAttribute?.value) {
|
|
104
102
|
return sanitizePhoneNumber(phoneAttribute.value);
|
|
105
103
|
}
|
|
@@ -152,16 +150,12 @@ const DependentsComponent: React.FC<DependentProps> = ({
|
|
|
152
150
|
return {
|
|
153
151
|
onRequestOtp: async (phoneNumber: string): Promise<void> => {
|
|
154
152
|
const sanitizedPhone = sanitizePhoneNumber(phoneNumber);
|
|
155
|
-
|
|
156
153
|
try {
|
|
157
154
|
if (!otpSource) {
|
|
158
155
|
throw new Error('OTP source not configured. Please contact your administrator.');
|
|
159
156
|
}
|
|
160
|
-
|
|
161
157
|
otpManager.setOtpSource(otpSource);
|
|
162
|
-
|
|
163
158
|
setActivePhoneNumbers((prev) => new Map(prev.set(dependentId, sanitizedPhone)));
|
|
164
|
-
|
|
165
159
|
await otpManager.requestOTP(sanitizedPhone, dependentName, otpExpiryMinutes, null, dependentId);
|
|
166
160
|
} catch (error) {
|
|
167
161
|
throw error;
|
|
@@ -172,12 +166,9 @@ const DependentsComponent: React.FC<DependentProps> = ({
|
|
|
172
166
|
if (!otpSource) {
|
|
173
167
|
throw new Error('OTP source not configured. Please contact your administrator.');
|
|
174
168
|
}
|
|
175
|
-
|
|
176
169
|
otpManager.setOtpSource(otpSource);
|
|
177
|
-
|
|
178
170
|
const activePhone = activePhoneNumbers.get(dependentId) || initialPhone;
|
|
179
171
|
const sanitizedPhone = sanitizePhoneNumber(activePhone);
|
|
180
|
-
|
|
181
172
|
const isValid = await otpManager.verifyOTP(sanitizedPhone, otp, dependentId);
|
|
182
173
|
if (!isValid) {
|
|
183
174
|
throw new Error('OTP verification failed');
|
|
@@ -211,20 +202,29 @@ const DependentsComponent: React.FC<DependentProps> = ({
|
|
|
211
202
|
}
|
|
212
203
|
|
|
213
204
|
if (localPatient) {
|
|
214
|
-
|
|
215
|
-
localPatient
|
|
216
|
-
`${localPatient.person?.personName?.givenName || ''} ${localPatient.person?.personName?.middleName || ''} ${
|
|
217
|
-
localPatient.person?.personName?.familyName || ''
|
|
218
|
-
}`.trim() ||
|
|
219
|
-
dependent.name;
|
|
220
|
-
|
|
221
|
-
launchWorkspace('start-visit-workspace-form', {
|
|
205
|
+
await launchWorkspaceGroup2('ewf-patient-chart', {
|
|
206
|
+
patient: localPatient,
|
|
222
207
|
patientUuid: localPatient.uuid,
|
|
223
|
-
|
|
208
|
+
visitContext: null as unknown as Visit,
|
|
209
|
+
mutateVisitContext: () => {},
|
|
224
210
|
});
|
|
211
|
+
|
|
212
|
+
launchWorkspace2<VisitFormProps, {}, {}>(
|
|
213
|
+
'custom-start-visit-workspace-form',
|
|
214
|
+
{
|
|
215
|
+
openedFrom: 'dependants-check-in',
|
|
216
|
+
showPatientHeader: false,
|
|
217
|
+
},
|
|
218
|
+
{},
|
|
219
|
+
{
|
|
220
|
+
patient: localPatient,
|
|
221
|
+
patientUuid: localPatient.uuid,
|
|
222
|
+
visitContext: null as unknown as Visit,
|
|
223
|
+
mutateVisitContext: () => {},
|
|
224
|
+
},
|
|
225
|
+
);
|
|
225
226
|
} else {
|
|
226
227
|
setSubmittingStates((prev) => ({ ...prev, [dependent.id]: true }));
|
|
227
|
-
|
|
228
228
|
try {
|
|
229
229
|
await registerOrLaunchDependent(dependent, t);
|
|
230
230
|
} catch (error) {
|
|
@@ -246,34 +246,13 @@ const DependentsComponent: React.FC<DependentProps> = ({
|
|
|
246
246
|
|
|
247
247
|
const headers = useMemo(
|
|
248
248
|
() => [
|
|
249
|
-
{
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
key: 'gender',
|
|
259
|
-
header: t('gender', 'Gender'),
|
|
260
|
-
},
|
|
261
|
-
{
|
|
262
|
-
key: 'birthDate',
|
|
263
|
-
header: t('birthDate', 'Birth Date'),
|
|
264
|
-
},
|
|
265
|
-
{
|
|
266
|
-
key: 'identifiers',
|
|
267
|
-
header: t('identifiers', 'Identifiers'),
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
key: 'status',
|
|
271
|
-
header: t('status', 'Status'),
|
|
272
|
-
},
|
|
273
|
-
{
|
|
274
|
-
key: 'actions',
|
|
275
|
-
header: t('actions', 'Actions'),
|
|
276
|
-
},
|
|
249
|
+
{ key: 'name', header: t('name', 'Name') },
|
|
250
|
+
{ key: 'relationship', header: t('relationship', 'Relationship') },
|
|
251
|
+
{ key: 'gender', header: t('gender', 'Gender') },
|
|
252
|
+
{ key: 'birthDate', header: t('birthDate', 'Birth Date') },
|
|
253
|
+
{ key: 'identifiers', header: t('identifiers', 'Identifiers') },
|
|
254
|
+
{ key: 'status', header: t('status', 'Status') },
|
|
255
|
+
{ key: 'actions', header: t('actions', 'Actions') },
|
|
277
256
|
],
|
|
278
257
|
[t],
|
|
279
258
|
);
|
|
@@ -475,18 +454,16 @@ const DependentsComponent: React.FC<DependentProps> = ({
|
|
|
475
454
|
<Table {...getTableProps()}>
|
|
476
455
|
<TableHead>
|
|
477
456
|
<TableRow>
|
|
478
|
-
{headers.map((header
|
|
479
|
-
<TableHeader
|
|
480
|
-
{header.header}
|
|
481
|
-
</TableHeader>
|
|
457
|
+
{headers.map((header) => (
|
|
458
|
+
<TableHeader {...getHeaderProps({ header })}>{header.header}</TableHeader>
|
|
482
459
|
))}
|
|
483
460
|
</TableRow>
|
|
484
461
|
</TableHead>
|
|
485
462
|
<TableBody>
|
|
486
|
-
{rows.map((row
|
|
487
|
-
<TableRow
|
|
488
|
-
{row.cells.map((cell
|
|
489
|
-
<TableCell key={
|
|
463
|
+
{rows.map((row) => (
|
|
464
|
+
<TableRow {...getRowProps({ row })}>
|
|
465
|
+
{row.cells.map((cell) => (
|
|
466
|
+
<TableCell key={cell.id}>{cell.value}</TableCell>
|
|
490
467
|
))}
|
|
491
468
|
</TableRow>
|
|
492
469
|
))}
|