diff --git a/packages/esm-lab-order-manifest-app/jest.config.js b/packages/esm-lab-order-manifest-app/jest.config.js new file mode 100644 index 00000000..0352f621 --- /dev/null +++ b/packages/esm-lab-order-manifest-app/jest.config.js @@ -0,0 +1,3 @@ +const rootConfig = require('../../jest.config.js'); + +module.exports = rootConfig; diff --git a/packages/esm-lab-order-manifest-app/package.json b/packages/esm-lab-order-manifest-app/package.json new file mode 100644 index 00000000..8da26cd9 --- /dev/null +++ b/packages/esm-lab-order-manifest-app/package.json @@ -0,0 +1,55 @@ +{ + "name": "@ampath/esm-lab-order-manifest-app", + "version": "6.0.0", + "description": "AMPATH lab Orders Manifest App", + "browser": "dist/ampath-esm-lab-order-manifest-app.js", + "main": "src/index.ts", + "source": true, + "license": "MPL-2.0", + "homepage": "https://github.com/AMPATH/ampath-esm-3.x#readme", + "scripts": { + "start": "openmrs develop --port 4542 --backend http://amrs.ampath.or.ke:8080 --api-url /amrs --importmap http://amrs.ampath.or.ke:8080/amrs/spa/importmap.json", + "serve": "webpack serve --mode=development", + "debug": "npm run serve", + "build": "webpack --mode production", + "analyze": "webpack --mode=production --env.analyze=true", + "lint": "cross-env TIMING=1 eslint src --ext ts,tsx", + "test": "cross-env TZ=UTC jest --config jest.config.js --verbose false --passWithNoTests --color", + "test:watch": "cross-env TZ=UTC jest --watch --config jest.config.js --color", + "coverage": "yarn test --coverage", + "typescript": "tsc", + "extract-translations": "i18next 'src/**/*.component.tsx'" + }, + "browserslist": [ + "extends browserslist-config-openmrs" + ], + "keywords": [ + "openmrs", + "ampath" + ], + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/AMPATH/ampath-esm-3.x.git" + }, + "bugs": { + "url": "https://github.com/AMPATH/ampath-esm-3.x/issues" + }, + "dependencies": { + "@carbon/react": "~1.37.0", + "lodash-es": "^4.17.15" + }, + "peerDependencies": { + "@openmrs/esm-framework": "5.x", + "@openmrs/esm-laboratory-app": "1.0.0", + "react": "^18.1.0", + "react-i18next": "11.x", + "react-router-dom": "6.x", + "swr": "2.x" + }, + "devDependencies": { + "webpack": "^5.74.0" + } +} diff --git a/packages/esm-lab-order-manifest-app/src/config-schema.ts b/packages/esm-lab-order-manifest-app/src/config-schema.ts new file mode 100644 index 00000000..81d64f93 --- /dev/null +++ b/packages/esm-lab-order-manifest-app/src/config-schema.ts @@ -0,0 +1,8 @@ +import { Type } from '@openmrs/esm-framework'; +export const configSchema = { + basicAuthBase64: { + _type: Type.String, + _description: 'Basic auth base64 string for the API call e.g Basic someBase64String==', + _default: '', + }, +}; diff --git a/packages/esm-lab-order-manifest-app/src/declarations.d.ts b/packages/esm-lab-order-manifest-app/src/declarations.d.ts new file mode 100644 index 00000000..85391863 --- /dev/null +++ b/packages/esm-lab-order-manifest-app/src/declarations.d.ts @@ -0,0 +1,4 @@ +declare module '@carbon/react'; +declare module '*.css'; +declare module '*.scss'; +declare type SideNavProps = {}; diff --git a/packages/esm-lab-order-manifest-app/src/index.ts b/packages/esm-lab-order-manifest-app/src/index.ts new file mode 100644 index 00000000..c306f297 --- /dev/null +++ b/packages/esm-lab-order-manifest-app/src/index.ts @@ -0,0 +1,32 @@ +import { defineConfigSchema, getAsyncLifecycle, getSyncLifecycle } from '@openmrs/esm-framework'; +import { configSchema } from './config-schema'; +import Root from './root.component'; + +const moduleName = '@ampath/esm-lab-order-manifest-app'; + +const options = { + featureName: 'esm-lab-order-manifest-app', + moduleName, +}; + +export const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); + +export const root = getSyncLifecycle(Root, options); +export const manifestOrdersComponent = getAsyncLifecycle( + () => import('./lab-order-manifest/manifest-orders.component'), + options, +); + +export const postOrderToEidDialog = getAsyncLifecycle( + () => import('./lab-order-manifest/dialog/post-to-eid-dialog.component'), + options, +); + +export const postOrderToEidButton = getAsyncLifecycle( + () => import('./lab-order-manifest/order-actions/post-to-eid-action.component'), + options, +); + +export function startupApp() { + defineConfigSchema(moduleName, configSchema); +} diff --git a/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/post-orde-to-eid-dialog.scss b/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/post-orde-to-eid-dialog.scss new file mode 100644 index 00000000..e76de4d0 --- /dev/null +++ b/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/post-orde-to-eid-dialog.scss @@ -0,0 +1,14 @@ +@use '@carbon/styles/scss/spacing'; +@use '@carbon/styles/scss/type'; + +section { + margin: spacing.$spacing-03; +} + +.sectionTitle { + margin-bottom: spacing.$spacing-04; +} + +.modalBody { + padding-bottom: spacing.$spacing-05; +} diff --git a/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/post-to-eid-dialog.component.tsx b/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/post-to-eid-dialog.component.tsx new file mode 100644 index 00000000..268fe08e --- /dev/null +++ b/packages/esm-lab-order-manifest-app/src/lab-order-manifest/dialog/post-to-eid-dialog.component.tsx @@ -0,0 +1,109 @@ +import React, { useState } from 'react'; + +import { + Button, + ContentSwitcher, + Form, + ModalBody, + ModalFooter, + ModalHeader, + Select, + SelectItem, + Switch, + TextArea, + Grid, + Checkbox, + TextInput, + IconButton, +} from '@carbon/react'; +import { useTranslation } from 'react-i18next'; +import styles from './post-orde-to-eid-dialog.scss'; +import { type Result } from '../manifest-orders-list-resource'; +import { PostToEid } from './post-to-eid-dialog.resource'; +import { showNotification, showSnackbar } from '@openmrs/esm-framework'; +import { Card } from '@ampath/esm-patient-registration-app/src/patient-verification/verification.component'; + +interface PostOrderDialogProps { + order: Result; + closeModal: () => void; +} + +const PostEidOrderDialog: React.FC = ({ order, closeModal }) => { + const { t } = useTranslation(); + + const [notes, setNotes] = useState(''); + + const postOrder = async (event) => { + event.preventDefault(); + // TODO Clean up for amrs posting to nascop eid + const payload = { + fulfillerStatus: 'EXCEPTION', + fulfillerComment: notes, + }; + PostToEid(order.uuid, payload).then( + (resp) => { + showSnackbar({ + isLowContrast: true, + title: t('postOrder', 'Post Order'), + kind: 'success', + subtitle: t( + 'successfullyPosted', + `You have successfully posted an Order with OrderNumber ${order.orderNumber} `, + ), + }); + closeModal(); + }, + (err) => { + showNotification({ + title: t(`errorRejectingOrder', 'Error Rejecting the order`), + kind: 'error', + critical: true, + description: err?.message, + }); + }, + ); + }; + + return ( +
+
+ + +
+
+
+ {order?.accessionNumber}   ·  {order?.fulfillerStatus}   ·   + {order?.orderNumber} +   +
+
+
+
+ +