diff --git a/packages/esm-lab-manifest-app/src/component/lab-manifest.component.tsx b/packages/esm-lab-manifest-app/src/component/lab-manifest.component.tsx index 2df4649c0..308bdc8ee 100644 --- a/packages/esm-lab-manifest-app/src/component/lab-manifest.component.tsx +++ b/packages/esm-lab-manifest-app/src/component/lab-manifest.component.tsx @@ -8,7 +8,7 @@ const LabManifestComponent: React.FC = () => { const { t } = useTranslation(); return (
- +
diff --git a/packages/esm-lab-manifest-app/src/config-schema.ts b/packages/esm-lab-manifest-app/src/config-schema.ts index 24b129179..2636d7175 100644 --- a/packages/esm-lab-manifest-app/src/config-schema.ts +++ b/packages/esm-lab-manifest-app/src/config-schema.ts @@ -7,15 +7,15 @@ export const configSchema = { _default: [ { id: 1, - type: 'EID Type', + type: 'EID', }, { id: 2, - type: 'VL Type', + type: 'VL', }, { id: 3, - type: 'FLU Type', + type: 'FLU', }, ], }, diff --git a/packages/esm-lab-manifest-app/src/forms/active-order-selection-preview.tsx b/packages/esm-lab-manifest-app/src/forms/active-order-selection-preview.tsx new file mode 100644 index 000000000..42083fe91 --- /dev/null +++ b/packages/esm-lab-manifest-app/src/forms/active-order-selection-preview.tsx @@ -0,0 +1,86 @@ +import React from 'react'; + +import { + DataTable, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableHeader, + TableRow, +} from '@carbon/react'; +import { useTranslation } from 'react-i18next'; +import styles from '../tables/lab-manifest-table.scss'; +import { ActiveRequestOrder } from '../types'; + +interface ActiveOrdersSelectionPreviewProps { + orders?: Array; +} + +const ActiveOrdersSelectionPreview: React.FC = ({ orders = [] }) => { + const { t } = useTranslation(); + + const headers = [ + { + header: t('patientName', 'Patient name'), + key: 'patientName', + }, + { + header: t('cccKDODNumber', 'CCC/KDOD Number'), + key: 'cccKdod', + }, + { + header: t('dateRequested', 'Date Requested'), + key: 'dateRequested', + }, + ]; + + const tableRows = + orders?.map((activeRequest) => { + return { + id: `${activeRequest.orderUuid}`, + patientName: activeRequest.patientName, + cccKdod: activeRequest.cccKdod, + dateRequested: activeRequest.dateRequested, + }; + }) ?? []; + return ( +
+ ( + <> + + + + + {headers.map((header, i) => ( + + {header.header} + + ))} + + + + {rows.map((row, i) => ( + {}}> + {row.cells.map((cell) => ( + {cell.value} + ))} + + ))} + +
+
+ + )} + /> +
+ ); +}; + +export default ActiveOrdersSelectionPreview; diff --git a/packages/esm-lab-manifest-app/src/forms/lab-manifest-form.scss b/packages/esm-lab-manifest-app/src/forms/lab-manifest-form.scss index 2b511513f..c252e85f2 100644 --- a/packages/esm-lab-manifest-app/src/forms/lab-manifest-form.scss +++ b/packages/esm-lab-manifest-app/src/forms/lab-manifest-form.scss @@ -121,3 +121,8 @@ gap: spacing.$spacing-05; } } + +.previewContainer { + margin-top: spacing.$spacing-05; + margin-bottom: spacing.$spacing-05; +} diff --git a/packages/esm-lab-manifest-app/src/forms/lab-manifest-form.workspace.tsx b/packages/esm-lab-manifest-app/src/forms/lab-manifest-form.workspace.tsx index 955d75299..fac7a09a5 100644 --- a/packages/esm-lab-manifest-app/src/forms/lab-manifest-form.workspace.tsx +++ b/packages/esm-lab-manifest-app/src/forms/lab-manifest-form.workspace.tsx @@ -11,27 +11,31 @@ import { } from '@carbon/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { DefaultWorkspaceProps, parseDate, showSnackbar, useConfig, useLayoutType } from '@openmrs/esm-framework'; -import React, { useEffect } from 'react'; +import React from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { z } from 'zod'; -import { LabManifestFilters, labManifestFormSchema, saveLabManifest } from '../lab-manifest.resources'; -import styles from './lab-manifest-form.scss'; -import { County, MappedLabManifest } from '../types'; -import { mutate } from 'swr'; import { LabManifestConfig } from '../config-schema'; +import { + LabManifestFilters, + labManifestFormSchema, + mutateManifestLinks, + saveLabManifest, +} from '../lab-manifest.resources'; +import { County, MappedLabManifest } from '../types'; +import styles from './lab-manifest-form.scss'; interface LabManifestFormProps extends DefaultWorkspaceProps { patientUuid: string; manifest?: MappedLabManifest; } -type ContactListFormType = z.infer; +type LabManifestFormType = z.infer; const LabManifestForm: React.FC = ({ closeWorkspace, manifest }) => { const { labmanifestTypes } = useConfig(); const counties = require('../counties.json') as County[]; - const form = useForm({ + const form = useForm({ defaultValues: { ...manifest, manifestType: manifest?.manifestType ? Number(manifest.manifestType) : undefined, @@ -45,18 +49,10 @@ const LabManifestForm: React.FC = ({ closeWorkspace, manif const observableSelectedCounty = form.watch('county'); const layout = useLayoutType(); const controlSize = layout === 'tablet' ? 'xl' : 'sm'; - const onSubmit = async (values: ContactListFormType) => { + const onSubmit = async (values: LabManifestFormType) => { try { await saveLabManifest(values, manifest?.uuid); - const mutateLinks = [ - `/ws/rest/v1/labmanifest?v=full&status=${values.manifestStatus}`, - `/ws/rest/v1/kemrorder/validorders?manifestUuid=${manifest?.uuid}`, - `/ws/rest/v1/labmanifest/${manifest?.uuid}`, - ]; - mutate((key) => { - return typeof key === 'string' && mutateLinks.some((link) => key.startsWith(link)); - }); - + mutateManifestLinks(manifest?.uuid, values?.manifestStatus); closeWorkspace(); showSnackbar({ title: 'Success', kind: 'success', subtitle: 'Lab manifest created successfully!' }); } catch (error) { @@ -73,10 +69,11 @@ const LabManifestForm: React.FC = ({ closeWorkspace, manif name="startDate" render={({ field }) => ( = ({ closeWorkspace, manif name="endDate" render={({ field }) => ( = ({ closeWorkspace, manif /> Dispatch status - = ({ closeWorkspace, manif - diff --git a/packages/esm-lab-manifest-app/src/forms/lab-manifest-orders-to-manifest.modal.tsx b/packages/esm-lab-manifest-app/src/forms/lab-manifest-orders-to-manifest.modal.tsx index 68a8c15cc..79929df29 100644 --- a/packages/esm-lab-manifest-app/src/forms/lab-manifest-orders-to-manifest.modal.tsx +++ b/packages/esm-lab-manifest-app/src/forms/lab-manifest-orders-to-manifest.modal.tsx @@ -19,14 +19,21 @@ import { Controller, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { mutate } from 'swr'; import { z } from 'zod'; -import { addOrderToManifest, labManifestOrderToManifestFormSchema, sampleTypes } from '../lab-manifest.resources'; -import styles from './lab-manifest-form.scss'; import { useLabManifest } from '../hooks'; +import { + addOrderToManifest, + labManifestOrderToManifestFormSchema, + mutateManifestLinks, + sampleTypes, +} from '../lab-manifest.resources'; +import { ActiveRequestOrder } from '../types'; +import ActiveOrdersSelectionPreview from './active-order-selection-preview'; +import styles from './lab-manifest-form.scss'; interface LabManifestOrdersToManifestFormProps { onClose: () => void; props: { - title?: string; + orders?: Array; selectedOrders: Array<{ labManifest: { uuid: string; @@ -43,7 +50,7 @@ type OrderToManifestFormType = z.infer = ({ onClose, - props: { title, selectedOrders }, + props: { selectedOrders, orders }, }) => { const { t } = useTranslation(); const form = useForm({ @@ -64,14 +71,7 @@ const LabManifestOrdersToManifestForm: React.FC { - return typeof key === 'string' && mutateLinks.some((link) => key.startsWith(link)); - }); + mutateManifestLinks(manifest?.uuid, manifest?.manifestStatus); onClose(); } catch (error) { showSnackbar({ title: 'Failure', kind: 'error', subtitle: 'Error adding orders to the manifest' }); @@ -82,7 +82,7 @@ const LabManifestOrdersToManifestForm: React.FC
- {title ?? t('updateSampleDetails', 'Update Sample Details')} + {t('updateSampleDetails', 'Update Sample Details')} @@ -154,16 +154,19 @@ const LabManifestOrdersToManifestForm: React.FC +
+ +
- +
diff --git a/packages/esm-lab-manifest-app/src/forms/sample-delete-confirm-dialog.modal.tsx b/packages/esm-lab-manifest-app/src/forms/sample-delete-confirm-dialog.modal.tsx index 29bf3d33e..f0a54d2d0 100644 --- a/packages/esm-lab-manifest-app/src/forms/sample-delete-confirm-dialog.modal.tsx +++ b/packages/esm-lab-manifest-app/src/forms/sample-delete-confirm-dialog.modal.tsx @@ -1,24 +1,126 @@ -import { Button, ButtonSet, ModalBody, ModalFooter, ModalHeader } from '@carbon/react'; +import { + Button, + ButtonSet, + DataTable, + ModalBody, + ModalFooter, + ModalHeader, + Stack, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableHeader, + TableRow, +} from '@carbon/react'; +import { formatDate, parseDate } from '@openmrs/esm-framework'; import React from 'react'; import { useTranslation } from 'react-i18next'; +import styles from '../tables/lab-manifest-table.scss'; +import { LabManifestSample } from '../types'; interface SampleDeleteConfirmDialogProps { onClose: () => void; onDelete: () => void; + samples?: Array; } -const SampleDeleteConfirmDialog: React.FC = ({ onClose, onDelete }) => { +const SampleDeleteConfirmDialog: React.FC = ({ onClose, onDelete, samples = [] }) => { const { t } = useTranslation(); + const headers = [ + { + header: t('patientIdentifier', 'Patient Identifier'), + key: 'cccKDODNumber', + }, + { + header: t('batchNumber', 'Batch Number'), + key: 'batchNumber', + }, + { + header: t('sampleType', 'Sample type'), + key: 'sampleType', + }, + { + header: t('dateRequested', 'Date Requested'), + key: 'dateRequested', + }, + { + header: t('resultDate', 'Result Date'), + key: 'resultDate', + }, + { + header: t('result', 'Result'), + key: 'result', + }, + ]; + + const tableRows = + samples.map((sample) => { + return { + id: `${sample.uuid}`, + sampleType: sample.sampleType ?? '--', + status: sample.status, + batchNumber: sample.batchNumber ?? '--', + cccKDODNumber: sample?.order?.patient?.identifiers[0]?.identifier ?? '--', + dateRequested: sample.dateSent ? formatDate(parseDate(sample.dateSent)) : '--', + resultDate: sample.resultDate ? formatDate(parseDate(sample.resultDate)) : '--', + result: sample.result ?? '--', + }; + }) ?? []; + return ( - {t('warning', 'Warning!')} - Are you sure you want to delete sample.This action is irriversible? + + {t('removeSampledFromManifest', 'Remove Samples from Manifest')} + + + + + Are you sure yu would like to remove bellow samples from the manifest? + +
+ ( + <> + + + + + {headers.map((header, i) => ( + + {header.header} + + ))} + + + + {rows.map((row, i) => ( + {}}> + {row.cells.map((cell) => ( + {cell.value} + ))} + + ))} + +
+
+ + )} + /> +
+
+
- - - diff --git a/packages/esm-lab-manifest-app/src/header/lab-manifest-detail-header.component.tsx b/packages/esm-lab-manifest-app/src/header/lab-manifest-detail-header.component.tsx index a6f826801..d2f29cc9e 100644 --- a/packages/esm-lab-manifest-app/src/header/lab-manifest-detail-header.component.tsx +++ b/packages/esm-lab-manifest-app/src/header/lab-manifest-detail-header.component.tsx @@ -1,4 +1,4 @@ -import { Button, ButtonSet, SkeletonText } from '@carbon/react'; +import { Button, ButtonSet, Layer, Row, SkeletonText, Tile } from '@carbon/react'; import { ArrowLeft, Edit } from '@carbon/react/icons'; import { formatDate, launchWorkspace, navigate, parseDate } from '@openmrs/esm-framework'; import React from 'react'; @@ -27,47 +27,51 @@ const LabManifestDetailHeader: React.FC = ({ manif if (isLoading) { return ( -
-
- {Array.from({ length: 3 }).map((_) => ( - - ))} -
-
+ + + + {Array.from({ length: 8 }).map((_, index) => ( + + ))} + +
+ + + + +
+
); } return ( -
-
-
-
- Date: - {manifest.startDate ? formatDate(parseDate(manifest.startDate)) : '--'} To{' '} - {manifest.endDate ? formatDate(parseDate(manifest.endDate)) : '--'} -
-
- Status: - {manifest.manifestStatus} | Type : {manifest.manifestType} | Courrier: - {manifest.courierName} -
-
- Dispatch Date: - {manifest.dispatchDate ? formatDate(parseDate(manifest.dispatchDate)) : '--'} |{' '} - Lab person Contact: - {manifest.labPersonContact} -
-
-
+ + + + Start date: + {manifest.startDate ? formatDate(parseDate(manifest.startDate)) : '--'} + End date: + {manifest.endDate ? formatDate(parseDate(manifest.endDate)) : '--'} + Status: + {manifest.manifestStatus} + Dispatch date: + {manifest.dispatchDate ? formatDate(parseDate(manifest.dispatchDate)) : '--'} + +
+ + Total Samples in the Manifest + {manifest.samples.length} + +
- -
+ ); }; diff --git a/packages/esm-lab-manifest-app/src/header/lab-manifest-header.component.tsx b/packages/esm-lab-manifest-app/src/header/lab-manifest-header.component.tsx index 484ae4d59..d356a8b8d 100644 --- a/packages/esm-lab-manifest-app/src/header/lab-manifest-header.component.tsx +++ b/packages/esm-lab-manifest-app/src/header/lab-manifest-header.component.tsx @@ -18,7 +18,7 @@ export const LabManifestHeader: React.FC = ({ title }) =
-

{t('labManifest', 'Lab manifest Management')}

+

{t('labManifest', 'Lab Manifest')}

{title}

diff --git a/packages/esm-lab-manifest-app/src/header/lab-manifest-header.scss b/packages/esm-lab-manifest-app/src/header/lab-manifest-header.scss index 6931821f9..c082a318d 100644 --- a/packages/esm-lab-manifest-app/src/header/lab-manifest-header.scss +++ b/packages/esm-lab-manifest-app/src/header/lab-manifest-header.scss @@ -99,7 +99,36 @@ svg.iconOverrides { .btnSet { display: flex; justify-content: space-between; - padding: spacing.$spacing-05; + margin-top: spacing.$spacing-05; + margin-bottom: spacing.$spacing-05; + + flex-flow: row wrap; + align-items: center; +} + +.detailHeaderContainer { + margin: spacing.$spacing-05; + flex-flow: row wrap; + justify-content: space-between; +} + +.detailHeaderContent { + background-color: $color-gray-30; + width: fit-content; +} + +.detailHeaderContentLoading { + background-color: $color-gray-30; + max-width: 70%; +} + +.detailHeaderContentRow { + display: flex; flex-flow: row wrap; + gap: spacing.$spacing-08; align-items: center; } + +.samplesCountValue { + @include type.type-style('heading-04'); +} diff --git a/packages/esm-lab-manifest-app/src/hooks/useActiveRequests.ts b/packages/esm-lab-manifest-app/src/hooks/useActiveRequests.ts index 2a11f3ccd..c41dfbb41 100644 --- a/packages/esm-lab-manifest-app/src/hooks/useActiveRequests.ts +++ b/packages/esm-lab-manifest-app/src/hooks/useActiveRequests.ts @@ -1,11 +1,10 @@ import { FetchResponse, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; import useSWR from 'swr'; -import { activeRequests } from '../lab-manifest.mock'; -import { ActiveRequests } from '../types'; +import { ActiveRequest } from '../types'; const useActiveRequests = (labManifestUuid: string) => { const url = `${restBaseUrl}/kemrorder/validorders?manifestUuid=${labManifestUuid}`; - const { isLoading, error, data } = useSWR>(url, openmrsFetch); + const { isLoading, error, data } = useSWR>(url, openmrsFetch); return { isLoading, diff --git a/packages/esm-lab-manifest-app/src/hooks/useLabManifestAggregates.ts b/packages/esm-lab-manifest-app/src/hooks/useLabManifestAggregates.ts new file mode 100644 index 000000000..523f007ad --- /dev/null +++ b/packages/esm-lab-manifest-app/src/hooks/useLabManifestAggregates.ts @@ -0,0 +1,28 @@ +import { FetchResponse, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; +import useSWR from 'swr'; +import { extractLabManifest } from '../lab-manifest.resources'; +import { LabManifest } from '../types'; +const fetchLabManifestsByStatus = async (status: string) => { + const url = `${restBaseUrl}/labmanifest?v=full&status=${status}`; + const response = await openmrsFetch<{ results: Array }>(url); + return response?.data?.results.map(extractLabManifest); +}; + +// TODO -> oPTIOMOZE BY CACHING AND RETREVING FROM CACHE +const useLabManifestAggregates = (statuses: Array) => { + const { data, error, isValidating } = useSWR( + statuses.length ? `labmanifest-aggregate-${statuses.join(',')}` : null, + async () => { + const results = await Promise.all(statuses.map((status) => fetchLabManifestsByStatus(status))); + return results.flat(); + }, + ); + + return { + isLoading: isValidating, + manifests: data || [], + error, + }; +}; + +export default useLabManifestAggregates; diff --git a/packages/esm-lab-manifest-app/src/lab-manifest.mock.ts b/packages/esm-lab-manifest-app/src/lab-manifest.mock.ts deleted file mode 100644 index 3298ebd0a..000000000 --- a/packages/esm-lab-manifest-app/src/lab-manifest.mock.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ActiveRequests, MappedLabManifest, LabManifestSample } from './types'; - -export const labManifestSamples: Array = []; - -export const activeRequests: Array = []; diff --git a/packages/esm-lab-manifest-app/src/lab-manifest.resources.ts b/packages/esm-lab-manifest-app/src/lab-manifest.resources.ts index f769cf759..9afcdd52d 100644 --- a/packages/esm-lab-manifest-app/src/lab-manifest.resources.ts +++ b/packages/esm-lab-manifest-app/src/lab-manifest.resources.ts @@ -1,6 +1,7 @@ import { openmrsFetch, restBaseUrl } from '@openmrs/esm-framework'; import { z } from 'zod'; import { LabManifest, MappedLabManifest } from './types'; +import { mutate } from 'swr'; export const LabManifestFilters = [ { @@ -118,6 +119,17 @@ export const addOrderToManifest = async (data: z.infer { + const mutateLinks = [ + `/ws/rest/v1/labmanifest?v=full&status=${manifestStatus}`, + `/ws/rest/v1/kemrorder/validorders?manifestUuid=${manifestUuid}`, + `/ws/rest/v1/labmanifest/${manifestUuid}`, + ]; + mutate((key) => { + return typeof key === 'string' && mutateLinks.some((link) => key.startsWith(link)); + }); +}; + export const removeSampleFromTheManifest = async (orderUuid: string) => { let url = `${restBaseUrl}/labmanifestorder/${orderUuid}`; const abortController = new AbortController(); diff --git a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-card.component.tsx b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-card.component.tsx new file mode 100644 index 000000000..41228bb54 --- /dev/null +++ b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-card.component.tsx @@ -0,0 +1,33 @@ +import { Column, Layer, Row } from '@carbon/react'; +import React from 'react'; +import useLabManifestAggregates from '../hooks/useLabManifestAggregates'; +import LabManifestMetricValue from './lab-manifest-metric-value.component'; +import styles from './lab-manifest-metrics.scss'; + +interface MetricCardProps { + title: string; + status?: Array<{ status: string; color?: string }>; +} + +const MetricCard: React.FC = ({ title, status = [] }) => { + const { isLoading, error, manifests } = useLabManifestAggregates(status.map((s) => s.status)); + return ( + +

{title}

+ + +

{manifests?.length}

+
+ + + {status.map(({ status, color }, index) => ( + + ))} + + +
+
+ ); +}; + +export default MetricCard; diff --git a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-status-aggegate-value.component.tsx b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-status-aggegate-value.component.tsx new file mode 100644 index 000000000..d45dacb99 --- /dev/null +++ b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-status-aggegate-value.component.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +type LabManifestStatusAggregateValueProps = { + status?: Array; +}; + +const LabManifestStatusAggregateValue: React.FC = ({ status = [] }) => { + return
LabManifestStatusAggregateValue
; +}; + +export default LabManifestStatusAggregateValue; diff --git a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-value.component.tsx b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-value.component.tsx index 786b7d963..a819992d9 100644 --- a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-value.component.tsx +++ b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metric-value.component.tsx @@ -1,23 +1,26 @@ +import { SkeletonText } from '@carbon/react'; import React from 'react'; import { useLabManifests } from '../hooks'; -import { SkeletonText } from '@carbon/react'; import styles from './lab-manifest-metrics.scss'; interface LabManifestMetricValueProps { status: string; + color?: string; } -const LabManifestMetricValue: React.FC = ({ status }) => { +const LabManifestMetricValue: React.FC = ({ status, color }) => { const { error, isLoading, manifests } = useLabManifests(status); if (isLoading) { - return ; + return ; } if (error) { return; } return ( - {status}: {manifests.length} + {status}
+
+ {manifests?.length ?? '--'}
); }; diff --git a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics-header.component.tsx b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics-header.component.tsx deleted file mode 100644 index a52095a5c..000000000 --- a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics-header.component.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Button } from '@carbon/react'; -import { ArrowRight } from '@carbon/react/icons'; -import { launchWorkspace } from '@openmrs/esm-framework'; -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import styles from './lab-manifest-header.scss'; - -const MetricsHeader = () => { - const { t } = useTranslation(); - const metricsTitle = t('labManifestSummary', 'Lab Manifest Summary'); - - const handleAddLabManifest = () => { - launchWorkspace('lab-manifest-form', { - workspaceTitle: 'Lab Manifest Form', - }); - }; - - return ( -
- {metricsTitle} -
- -
-
- ); -}; - -export default MetricsHeader; diff --git a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics.component.tsx b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics.component.tsx index fdb055db6..fef98065b 100644 --- a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics.component.tsx +++ b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics.component.tsx @@ -1,9 +1,10 @@ +import { Button, Layer } from '@carbon/react'; +import { ArrowRight } from '@carbon/react/icons'; +import { launchWorkspace } from '@openmrs/esm-framework'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { LabManifestFilters } from '../lab-manifest.resources'; -import MetricsHeader from './lab-manifest-metrics-header.component'; +import MetricCard from './lab-manifest-metric-card.component'; import styles from './lab-manifest-metrics.scss'; -import LabManifestMetricValue from './lab-manifest-metric-value.component'; export interface Service { uuid: string; @@ -12,15 +13,56 @@ export interface Service { function LabManifestMetrics() { const { t } = useTranslation(); + + const handleAddLabManifest = () => { + launchWorkspace('lab-manifest-form', { + workspaceTitle: 'Lab Manifest Form', + }); + }; + return ( - <> - -
- {LabManifestFilters.map((f, index) => ( - - ))} -
- + + + + + + + + + + + ); } diff --git a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics.scss b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics.scss index 0ba17571f..e3f410f1d 100644 --- a/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics.scss +++ b/packages/esm-lab-manifest-app/src/metrics/lab-manifest-metrics.scss @@ -1,17 +1,58 @@ @use '@carbon/styles/scss/spacing'; @use '@carbon/colors'; +@use '@carbon/styles/scss/type'; @import '~@openmrs/esm-styleguide/src/vars'; .cardContainer { - background-color: $color-gray-30; display: flex; - justify-content: space-between; - padding: spacing.$spacing-05; flex-flow: row wrap; margin-top: spacing.$spacing-05; gap: spacing.$spacing-05; } .metricContainer { + padding: spacing.$spacing-05; +} + +.labManifestStatusMetricValue { max-width: spacing.$spacing-13; } + +.btnLayer { + display: flex; + margin-top: spacing.$spacing-05; + margin-bottom: spacing.$spacing-05; + flex-direction: row; + justify-content: flex-end; + width: 100%; +} + +.metricCardContainer { + border: $color-gray-30 solid spacing.$spacing-01; + padding: spacing.$spacing-03; + flex-grow: 1; + & > p { + @include type.type-style('heading-02'); + margin-bottom: spacing.$spacing-03; + } +} + +.metricCardStatusRow { + display: flex; + flex-flow: row wrap; + gap: spacing.$spacing-05; +} + +.metricCardRow { + display: flex; + flex-flow: row wrap; + gap: spacing.$spacing-05; + justify-content: space-between; + padding-top: spacing.$spacing-05; + align-items: center; +} + +.metricCardAgregateValue { + @include type.type-style('heading-05'); + font-weight: var(--cds-heading-05-font-weight, 100); +} diff --git a/packages/esm-lab-manifest-app/src/tables/lab-manifest-active-requests.component.tsx b/packages/esm-lab-manifest-app/src/tables/lab-manifest-active-requests.component.tsx index f0708f6d0..5f425c8c4 100644 --- a/packages/esm-lab-manifest-app/src/tables/lab-manifest-active-requests.component.tsx +++ b/packages/esm-lab-manifest-app/src/tables/lab-manifest-active-requests.component.tsx @@ -69,6 +69,7 @@ const LabManifestActiveRequests: React.FC = ({ m props: { title: selected.length > 1 ? 'Add Multiple Orders To Manifest' : undefined, selectedOrders: selected, + orders: request.Orders.filter((order) => selected.some((o) => o.order.uuid === order.orderUuid)), }, }); } @@ -85,6 +86,7 @@ const LabManifestActiveRequests: React.FC = ({ m