@openmrs/esm-patient-tests-app 11.3.1-patch.9310 → 11.3.1-patch.9508
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 +19 -22
- package/dist/1119.js +1 -1
- package/dist/1197.js +1 -1
- package/dist/{6231.js → 1477.js} +1 -1
- package/dist/1477.js.map +1 -0
- package/dist/1638.js +1 -1
- package/dist/1638.js.map +1 -1
- package/dist/1935.js +1 -0
- package/dist/1935.js.map +1 -0
- package/dist/2146.js +1 -1
- package/dist/2690.js +1 -1
- package/dist/3099.js +1 -1
- package/dist/34.js +1 -0
- package/dist/34.js.map +1 -0
- package/dist/3509.js +1 -1
- package/dist/3509.js.map +1 -1
- package/dist/3584.js +1 -1
- package/dist/4055.js +1 -1
- package/dist/4132.js +1 -1
- package/dist/4300.js +1 -1
- package/dist/4335.js +1 -1
- package/dist/439.js +1 -0
- package/dist/4618.js +1 -1
- package/dist/4652.js +1 -1
- package/dist/4944.js +1 -1
- package/dist/5173.js +1 -1
- package/dist/5241.js +1 -1
- package/dist/5442.js +1 -1
- package/dist/5661.js +1 -1
- package/dist/5670.js +1 -1
- package/dist/6022.js +1 -1
- package/dist/6113.js +1 -0
- package/dist/6113.js.map +1 -0
- package/dist/6301.js +1 -1
- package/dist/6301.js.map +1 -1
- package/dist/6468.js +1 -1
- package/dist/6589.js +1 -0
- package/dist/6679.js +1 -1
- package/dist/6840.js +1 -1
- package/dist/6859.js +1 -1
- package/dist/7097.js +1 -1
- package/dist/7159.js +1 -1
- package/dist/7202.js +1 -0
- package/dist/7202.js.map +1 -0
- package/dist/723.js +1 -1
- package/dist/7617.js +1 -1
- package/dist/790.js +1 -1
- package/dist/790.js.map +1 -1
- package/dist/795.js +1 -1
- package/dist/8163.js +1 -1
- package/dist/8349.js +1 -1
- package/dist/8371.js +1 -0
- package/dist/8555.js +2 -0
- package/dist/8555.js.map +1 -0
- package/dist/8618.js +1 -1
- package/dist/890.js +1 -1
- package/dist/9214.js +1 -1
- package/dist/9538.js +1 -1
- package/dist/9569.js +1 -1
- package/dist/986.js +1 -1
- package/dist/9879.js +1 -1
- package/dist/9895.js +1 -1
- package/dist/9900.js +1 -1
- package/dist/9913.js +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/openmrs-esm-patient-tests-app.js +1 -1
- package/dist/openmrs-esm-patient-tests-app.js.buildmanifest.json +302 -211
- package/dist/openmrs-esm-patient-tests-app.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +2 -2
- package/src/edit-test-results/modal/edit-lab-results.modal.tsx +2 -2
- package/src/index.ts +1 -1
- package/src/routes.json +4 -3
- package/src/test-orders/add-test-order/add-test-order.test.tsx +44 -21
- package/src/test-orders/add-test-order/add-test-order.workspace.tsx +152 -21
- package/src/test-orders/add-test-order/test-order-form.component.tsx +60 -68
- package/src/test-orders/add-test-order/test-order.ts +3 -3
- package/src/test-orders/add-test-order/test-type-search.component.tsx +60 -28
- package/src/test-orders/api.ts +2 -6
- package/src/test-orders/lab-order-basket-panel/lab-icon.component.tsx +27 -0
- package/src/test-orders/lab-order-basket-panel/lab-order-basket-item-tile.component.tsx +1 -1
- package/src/test-orders/lab-order-basket-panel/lab-order-basket-panel.extension.tsx +95 -30
- package/src/test-orders/lab-order-basket-panel/lab-order-basket-panel.scss +26 -11
- package/src/test-orders/lab-order-basket-panel/lab-order-basket-panel.test.tsx +12 -10
- package/src/test-results/filter/filter-context.test.tsx +556 -0
- package/src/test-results/filter/filter-context.tsx +1 -1
- package/src/test-results/filter/filter-reducer.test.ts +540 -0
- package/src/test-results/filter/filter-reducer.ts +1 -1
- package/src/test-results/filter/filter-set.component.tsx +75 -48
- package/src/test-results/filter/filter-set.test.tsx +694 -0
- package/src/test-results/filter/filter-types.ts +5 -1
- package/src/test-results/grouped-timeline/grid.component.tsx +4 -2
- package/src/test-results/grouped-timeline/grouped-timeline.component.tsx +20 -22
- package/src/test-results/grouped-timeline/grouped-timeline.test.tsx +3 -2
- package/src/test-results/grouped-timeline/reference-range-helpers.test.ts +37 -1
- package/src/test-results/grouped-timeline/reference-range-helpers.ts +50 -1
- package/src/test-results/grouped-timeline/timeline-data-group.component.tsx +4 -4
- package/src/test-results/grouped-timeline/useObstreeData.test.ts +471 -0
- package/src/test-results/grouped-timeline/useObstreeData.ts +37 -4
- package/src/test-results/individual-results-table/individual-results-table.component.tsx +2 -7
- package/src/test-results/individual-results-table-tablet/individual-results-table-tablet.component.tsx +3 -3
- package/src/test-results/individual-results-table-tablet/lab-set-panel.component.tsx +2 -5
- package/src/test-results/individual-results-table-tablet/usePanelData.tsx +40 -26
- package/src/test-results/loadPatientTestData/helpers.ts +29 -12
- package/src/test-results/loadPatientTestData/usePatientResultsData.ts +18 -7
- package/src/test-results/overview/external-overview.extension.tsx +1 -2
- package/src/test-results/print-modal/print-modal.extension.tsx +1 -1
- package/src/test-results/results-viewer/results-viewer.extension.tsx +8 -4
- package/src/test-results/tree-view/tree-view.component.tsx +18 -5
- package/src/test-results/tree-view/tree-view.test.tsx +119 -2
- package/src/test-results/trendline/trendline.component.tsx +88 -52
- package/src/test-results/ui-elements/{resetFiltersEmptyState → reset-filters-empty-state}/filter-empty-data-illustration.tsx +2 -2
- package/src/test-results/ui-elements/{resetFiltersEmptyState → reset-filters-empty-state}/filter-empty-state.component.tsx +5 -6
- package/src/types.ts +9 -0
- package/translations/am.json +3 -4
- package/translations/ar.json +3 -4
- package/translations/ar_SY.json +3 -4
- package/translations/bn.json +3 -4
- package/translations/cs.json +119 -0
- package/translations/de.json +3 -4
- package/translations/en.json +3 -4
- package/translations/en_US.json +3 -4
- package/translations/es.json +3 -4
- package/translations/es_MX.json +3 -4
- package/translations/fr.json +3 -4
- package/translations/he.json +3 -4
- package/translations/hi.json +3 -4
- package/translations/hi_IN.json +3 -4
- package/translations/id.json +3 -4
- package/translations/it.json +3 -4
- package/translations/ka.json +3 -4
- package/translations/km.json +3 -4
- package/translations/ku.json +3 -4
- package/translations/ky.json +3 -4
- package/translations/lg.json +3 -4
- package/translations/ne.json +3 -4
- package/translations/pl.json +3 -4
- package/translations/pt.json +3 -4
- package/translations/pt_BR.json +3 -4
- package/translations/qu.json +3 -4
- package/translations/ro_RO.json +3 -4
- package/translations/ru_RU.json +3 -4
- package/translations/si.json +3 -4
- package/translations/sq.json +119 -0
- package/translations/sw.json +3 -4
- package/translations/sw_KE.json +3 -4
- package/translations/tr.json +3 -4
- package/translations/tr_TR.json +3 -4
- package/translations/uk.json +3 -4
- package/translations/uz.json +3 -4
- package/translations/uz@Latn.json +3 -4
- package/translations/uz_UZ.json +3 -4
- package/translations/vi.json +3 -4
- package/translations/zh.json +3 -4
- package/translations/zh_CN.json +3 -4
- package/translations/zh_TW.json +119 -0
- package/dist/1479.js +0 -1
- package/dist/1479.js.map +0 -1
- package/dist/5348.js +0 -1
- package/dist/5348.js.map +0 -1
- package/dist/6231.js.map +0 -1
- package/dist/9540.js +0 -2
- package/dist/9540.js.map +0 -1
- package/dist/9838.js +0 -1
- package/dist/9838.js.map +0 -1
- package/src/test-orders/add-test-order/add-test-order.component.tsx +0 -125
- package/src/test-orders/add-test-order/exported-add-test-order.workspace.tsx +0 -30
- /package/dist/{9540.js.LICENSE.txt → 8555.js.LICENSE.txt} +0 -0
- /package/src/test-results/ui-elements/{resetFiltersEmptyState/index.scss → reset-filters-empty-state/filter-empty-state.scss} +0 -0
|
@@ -19,35 +19,35 @@ import { zodResolver } from '@hookform/resolvers/zod';
|
|
|
19
19
|
import { z } from 'zod';
|
|
20
20
|
import { useTranslation } from 'react-i18next';
|
|
21
21
|
import {
|
|
22
|
+
type DefaultPatientWorkspaceProps,
|
|
23
|
+
type Order,
|
|
22
24
|
type OrderUrgency,
|
|
23
25
|
priorityOptions,
|
|
24
26
|
useOrderBasket,
|
|
25
27
|
useOrderType,
|
|
26
|
-
type TestOrderBasketItem,
|
|
27
|
-
postOrder,
|
|
28
|
-
useMutatePatientOrders,
|
|
29
|
-
showOrderSuccessToast,
|
|
30
28
|
} from '@openmrs/esm-patient-common-lib';
|
|
31
29
|
import {
|
|
32
30
|
ExtensionSlot,
|
|
31
|
+
launchWorkspace,
|
|
33
32
|
OpenmrsDatePicker,
|
|
34
|
-
showSnackbar,
|
|
35
33
|
useConfig,
|
|
36
34
|
useLayoutType,
|
|
37
35
|
useSession,
|
|
38
|
-
type Workspace2DefinitionProps,
|
|
39
36
|
} from '@openmrs/esm-framework';
|
|
40
37
|
import { prepTestOrderPostData, useOrderReasons } from '../api';
|
|
41
38
|
import { ordersEqual } from './test-order';
|
|
42
39
|
import { type ConfigObject } from '../../config-schema';
|
|
40
|
+
import { type TestOrderBasketItem } from '../../types';
|
|
41
|
+
import { WORKSPACES } from '../lab-order-basket-panel/lab-order-basket-panel.extension';
|
|
43
42
|
import styles from './test-order-form.scss';
|
|
44
43
|
|
|
45
|
-
export interface LabOrderFormProps {
|
|
46
|
-
closeWorkspace: Workspace2DefinitionProps['closeWorkspace'];
|
|
44
|
+
export interface LabOrderFormProps extends DefaultPatientWorkspaceProps {
|
|
47
45
|
initialOrder: TestOrderBasketItem;
|
|
48
46
|
orderTypeUuid: string;
|
|
49
47
|
orderableConceptSets: Array<string>;
|
|
50
|
-
|
|
48
|
+
prevWorkSpace: string;
|
|
49
|
+
isWorkSpaceType: (value: string) => boolean;
|
|
50
|
+
prevOrder: Order;
|
|
51
51
|
patient: fhir.Patient;
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -57,22 +57,25 @@ export interface LabOrderFormProps {
|
|
|
57
57
|
export function LabOrderForm({
|
|
58
58
|
initialOrder,
|
|
59
59
|
closeWorkspace,
|
|
60
|
+
closeWorkspaceWithSavedChanges,
|
|
61
|
+
promptBeforeClosing,
|
|
60
62
|
orderTypeUuid,
|
|
61
|
-
|
|
63
|
+
orderableConceptSets,
|
|
64
|
+
prevWorkSpace,
|
|
65
|
+
isWorkSpaceType,
|
|
66
|
+
prevOrder,
|
|
67
|
+
patientUuid,
|
|
62
68
|
patient,
|
|
63
69
|
}: LabOrderFormProps) {
|
|
64
70
|
const { t } = useTranslation();
|
|
65
71
|
const isTablet = useLayoutType() === 'tablet';
|
|
66
72
|
const session = useSession();
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
orderTypeUuid,
|
|
70
|
-
prepTestOrderPostData,
|
|
71
|
-
);
|
|
73
|
+
const isEditing = useMemo(() => initialOrder && initialOrder.action === 'REVISE', [initialOrder]);
|
|
74
|
+
const { orders, setOrders } = useOrderBasket<TestOrderBasketItem>(patient, orderTypeUuid, prepTestOrderPostData);
|
|
72
75
|
const [showErrorNotification, setShowErrorNotification] = useState(false);
|
|
73
76
|
const config = useConfig<ConfigObject>();
|
|
74
|
-
const { orderType } = useOrderType(orderTypeUuid);
|
|
75
|
-
|
|
77
|
+
const { orderType, isLoadingOrderType } = useOrderType(orderTypeUuid);
|
|
78
|
+
|
|
76
79
|
const orderReasonRequired = useMemo(
|
|
77
80
|
() =>
|
|
78
81
|
(config.labTestsWithOrderReasons?.find((c) => c.labTestUuid === initialOrder?.testType?.conceptUuid) || {})
|
|
@@ -144,7 +147,7 @@ export function LabOrderForm({
|
|
|
144
147
|
return itemDisplay?.includes(inputValue);
|
|
145
148
|
}, []);
|
|
146
149
|
|
|
147
|
-
const
|
|
150
|
+
const handleFormSubmission = useCallback(
|
|
148
151
|
(data: TestOrderBasketItem) => {
|
|
149
152
|
const finalizedOrder: TestOrderBasketItem = {
|
|
150
153
|
...initialOrder,
|
|
@@ -167,46 +170,40 @@ export function LabOrderForm({
|
|
|
167
170
|
|
|
168
171
|
setOrders(newOrders);
|
|
169
172
|
|
|
170
|
-
|
|
173
|
+
closeWorkspaceWithSavedChanges({
|
|
174
|
+
onWorkspaceClose: () =>
|
|
175
|
+
typeof isWorkSpaceType === 'function' &&
|
|
176
|
+
isWorkSpaceType(prevWorkSpace) &&
|
|
177
|
+
prevWorkSpace === WORKSPACES.TEST_RESULTS_FORM
|
|
178
|
+
? launchWorkspace(prevWorkSpace, { order: prevOrder })
|
|
179
|
+
: launchWorkspace(WORKSPACES.ORDER_BASKET),
|
|
180
|
+
closeWorkspaceGroup: false,
|
|
181
|
+
});
|
|
171
182
|
},
|
|
172
|
-
[
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
postOrder(prepTestOrderPostData(finalizedOrder, patient.id, finalizedOrder?.encounterUuid))
|
|
183
|
-
.then(() => {
|
|
184
|
-
clearOrders();
|
|
185
|
-
mutateOrders();
|
|
186
|
-
showOrderSuccessToast(t, [finalizedOrder]);
|
|
187
|
-
closeWorkspace({ discardUnsavedChanges: true });
|
|
188
|
-
})
|
|
189
|
-
.catch((error) => {
|
|
190
|
-
showSnackbar({
|
|
191
|
-
isLowContrast: false,
|
|
192
|
-
kind: 'error',
|
|
193
|
-
title: t('errorSavingLabOrder', 'Error saving lab order'),
|
|
194
|
-
subtitle: error.message,
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
},
|
|
198
|
-
[clearOrders, closeWorkspace, initialOrder, mutateOrders, patient.id, session.currentProvider.uuid, t],
|
|
183
|
+
[
|
|
184
|
+
orders,
|
|
185
|
+
setOrders,
|
|
186
|
+
session?.currentProvider?.uuid,
|
|
187
|
+
closeWorkspaceWithSavedChanges,
|
|
188
|
+
initialOrder,
|
|
189
|
+
isWorkSpaceType,
|
|
190
|
+
prevOrder,
|
|
191
|
+
prevWorkSpace,
|
|
192
|
+
],
|
|
199
193
|
);
|
|
200
194
|
|
|
201
195
|
const cancelOrder = useCallback(() => {
|
|
202
196
|
setOrders(orders.filter((order) => order.testType.conceptUuid !== defaultValues.testType.conceptUuid));
|
|
203
|
-
closeWorkspace(
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
197
|
+
closeWorkspace({
|
|
198
|
+
onWorkspaceClose: () =>
|
|
199
|
+
typeof isWorkSpaceType === 'function' &&
|
|
200
|
+
isWorkSpaceType(prevWorkSpace) &&
|
|
201
|
+
prevWorkSpace === WORKSPACES.TEST_RESULTS_FORM
|
|
202
|
+
? launchWorkspace(prevWorkSpace, { order: prevOrder })
|
|
203
|
+
: launchWorkspace(WORKSPACES.ORDER_BASKET),
|
|
204
|
+
closeWorkspaceGroup: false,
|
|
205
|
+
});
|
|
206
|
+
}, [closeWorkspace, orders, setOrders, defaultValues, isWorkSpaceType, prevOrder, prevWorkSpace]);
|
|
210
207
|
|
|
211
208
|
const onError = (errors: FieldErrors<TestOrderBasketItem>) => {
|
|
212
209
|
if (errors) {
|
|
@@ -228,23 +225,19 @@ export function LabOrderForm({
|
|
|
228
225
|
);
|
|
229
226
|
|
|
230
227
|
useEffect(() => {
|
|
231
|
-
|
|
232
|
-
}, [isDirty,
|
|
228
|
+
promptBeforeClosing(() => isDirty);
|
|
229
|
+
}, [isDirty, promptBeforeClosing]);
|
|
233
230
|
|
|
234
231
|
const responsiveSize = isTablet ? 'lg' : 'sm';
|
|
235
232
|
|
|
236
233
|
return (
|
|
237
|
-
<Form
|
|
238
|
-
className={styles.orderForm}
|
|
239
|
-
onSubmit={handleSubmit(initialOrder?.action == 'REVISE' ? submitLabOrderToServer : saveLabOrderToBasket, onError)}
|
|
240
|
-
id="drugOrderForm"
|
|
241
|
-
>
|
|
234
|
+
<Form className={styles.orderForm} onSubmit={handleSubmit(handleFormSubmission, onError)} id="drugOrderForm">
|
|
242
235
|
<div className={styles.form}>
|
|
243
236
|
<ExtensionSlot name="top-of-lab-order-form-slot" state={{ order: initialOrder }} />
|
|
244
237
|
<Grid className={styles.gridRow}>
|
|
245
238
|
<Column lg={16} md={8} sm={4}>
|
|
246
239
|
<InputWrapper>
|
|
247
|
-
<
|
|
240
|
+
<span className={styles.testTypeLabel}>{t('testType', 'Test type')}</span>
|
|
248
241
|
<p className={styles.testType}>{initialOrder?.testType?.label}</p>
|
|
249
242
|
</InputWrapper>
|
|
250
243
|
</Column>
|
|
@@ -388,16 +381,15 @@ export function LabOrderForm({
|
|
|
388
381
|
<ButtonSet
|
|
389
382
|
className={classNames(styles.buttonSet, isTablet ? styles.tabletButtonSet : styles.desktopButtonSet)}
|
|
390
383
|
>
|
|
391
|
-
<Button
|
|
392
|
-
className={styles.button}
|
|
393
|
-
kind="secondary"
|
|
394
|
-
onClick={initialOrder?.action == 'REVISE' ? closeModifyOrderWorkspace : cancelOrder}
|
|
395
|
-
size="xl"
|
|
396
|
-
>
|
|
384
|
+
<Button className={styles.button} kind="secondary" onClick={cancelOrder} size="xl">
|
|
397
385
|
{t('discard', 'Discard')}
|
|
398
386
|
</Button>
|
|
399
387
|
<Button className={styles.button} kind="primary" size="xl" type="submit">
|
|
400
|
-
{
|
|
388
|
+
{typeof isWorkSpaceType === 'function' &&
|
|
389
|
+
isWorkSpaceType(prevWorkSpace) &&
|
|
390
|
+
prevWorkSpace === WORKSPACES.TEST_RESULTS_FORM
|
|
391
|
+
? t('saveTest', 'Save test')
|
|
392
|
+
: t('saveOrder', 'Save order')}
|
|
401
393
|
</Button>
|
|
402
394
|
</ButtonSet>
|
|
403
395
|
</div>
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { priorityOptions, type OrderUrgency
|
|
1
|
+
import { priorityOptions, type OrderUrgency } from '@openmrs/esm-patient-common-lib';
|
|
2
2
|
import { type TestType } from './useTestTypes';
|
|
3
|
+
import type { TestOrderBasketItem } from '../../types';
|
|
3
4
|
|
|
4
5
|
type LabOrderRequest = Pick<TestOrderBasketItem, 'action' | 'testType'>;
|
|
5
6
|
|
|
6
|
-
export function createEmptyLabOrder(testType: TestType, orderer: string
|
|
7
|
+
export function createEmptyLabOrder(testType: TestType, orderer: string): TestOrderBasketItem {
|
|
7
8
|
return {
|
|
8
9
|
action: 'NEW',
|
|
9
10
|
urgency: priorityOptions[0].value as OrderUrgency,
|
|
10
11
|
display: testType.label,
|
|
11
12
|
testType,
|
|
12
13
|
orderer,
|
|
13
|
-
visit,
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -5,30 +5,34 @@ import { Button, ButtonSkeleton, Search, SkeletonText, Tile } from '@carbon/reac
|
|
|
5
5
|
import { ShoppingCartArrowUp } from '@carbon/react/icons';
|
|
6
6
|
import {
|
|
7
7
|
ArrowRightIcon,
|
|
8
|
+
closeWorkspace,
|
|
9
|
+
launchWorkspace,
|
|
8
10
|
ResponsiveWrapper,
|
|
9
11
|
ShoppingCartArrowDownIcon,
|
|
10
12
|
useDebounce,
|
|
11
13
|
useLayoutType,
|
|
12
14
|
useSession,
|
|
13
|
-
type Visit,
|
|
14
|
-
type Workspace2DefinitionProps,
|
|
15
15
|
} from '@openmrs/esm-framework';
|
|
16
|
-
import { useOrderBasket, type
|
|
16
|
+
import { useOrderBasket, type Order } from '@openmrs/esm-patient-common-lib';
|
|
17
|
+
import type { TestOrderBasketItem } from '../../types';
|
|
17
18
|
import { prepTestOrderPostData } from '../api';
|
|
18
19
|
import { createEmptyLabOrder } from './test-order';
|
|
19
20
|
import { useTestTypes, type TestType } from './useTestTypes';
|
|
21
|
+
import { WORKSPACES } from '../lab-order-basket-panel/lab-order-basket-panel.extension';
|
|
20
22
|
import styles from './test-type-search.scss';
|
|
21
23
|
|
|
22
24
|
export interface TestTypeSearchProps {
|
|
23
25
|
openLabForm: (searchResult: TestOrderBasketItem) => void;
|
|
24
26
|
orderTypeUuid: string;
|
|
25
27
|
orderableConceptSets: Array<string>;
|
|
26
|
-
|
|
28
|
+
prevWorkSpace: string;
|
|
29
|
+
isWorkSpaceType: (value: string) => boolean;
|
|
30
|
+
prevOrder: Order;
|
|
27
31
|
patient: fhir.Patient;
|
|
28
|
-
visit: Visit;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
interface TestTypeSearchResultsProps extends TestTypeSearchProps {
|
|
35
|
+
cancelOrder: () => void;
|
|
32
36
|
searchTerm: string;
|
|
33
37
|
focusAndClearSearchInput: () => void;
|
|
34
38
|
patient: fhir.Patient;
|
|
@@ -38,18 +42,20 @@ interface TestTypeSearchResultItemProps {
|
|
|
38
42
|
orderTypeUuid: string;
|
|
39
43
|
testType: TestType;
|
|
40
44
|
openOrderForm: (searchResult: TestOrderBasketItem) => void;
|
|
45
|
+
prevWorkSpace: string;
|
|
46
|
+
isWorkSpaceType: (value: string) => boolean;
|
|
47
|
+
prevOrder: Order;
|
|
41
48
|
patient: fhir.Patient;
|
|
42
|
-
visit: Visit;
|
|
43
|
-
closeWorkspace: Workspace2DefinitionProps['closeWorkspace'];
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
export function TestTypeSearch({
|
|
47
|
-
patient,
|
|
48
|
-
visit,
|
|
49
52
|
openLabForm,
|
|
50
53
|
orderTypeUuid,
|
|
51
54
|
orderableConceptSets,
|
|
52
|
-
|
|
55
|
+
prevWorkSpace,
|
|
56
|
+
isWorkSpaceType,
|
|
57
|
+
prevOrder,
|
|
58
|
+
patient,
|
|
53
59
|
}: TestTypeSearchProps) {
|
|
54
60
|
const { t } = useTranslation();
|
|
55
61
|
const [searchTerm, setSearchTerm] = useState('');
|
|
@@ -61,6 +67,18 @@ export function TestTypeSearch({
|
|
|
61
67
|
searchInputRef.current?.focus();
|
|
62
68
|
}, [setSearchTerm]);
|
|
63
69
|
|
|
70
|
+
const cancelOrder = useCallback(() => {
|
|
71
|
+
closeWorkspace('add-lab-order', {
|
|
72
|
+
ignoreChanges: true,
|
|
73
|
+
onWorkspaceClose: () =>
|
|
74
|
+
typeof isWorkSpaceType === 'function' &&
|
|
75
|
+
isWorkSpaceType(prevWorkSpace) &&
|
|
76
|
+
prevWorkSpace === WORKSPACES.TEST_RESULTS_FORM
|
|
77
|
+
? launchWorkspace(prevWorkSpace, { order: prevOrder })
|
|
78
|
+
: launchWorkspace(WORKSPACES.ORDER_BASKET),
|
|
79
|
+
});
|
|
80
|
+
}, [isWorkSpaceType, prevOrder, prevWorkSpace]);
|
|
81
|
+
|
|
64
82
|
const handleSearchTermChange = useCallback(
|
|
65
83
|
(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
66
84
|
setSearchTerm(event.target.value ?? '');
|
|
@@ -82,28 +100,32 @@ export function TestTypeSearch({
|
|
|
82
100
|
/>
|
|
83
101
|
</ResponsiveWrapper>
|
|
84
102
|
<TestTypeSearchResults
|
|
85
|
-
|
|
103
|
+
cancelOrder={cancelOrder}
|
|
86
104
|
orderTypeUuid={orderTypeUuid}
|
|
87
105
|
orderableConceptSets={orderableConceptSets}
|
|
88
106
|
focusAndClearSearchInput={focusAndClearSearchInput}
|
|
89
107
|
openLabForm={openLabForm}
|
|
90
108
|
searchTerm={debouncedSearchTerm}
|
|
109
|
+
prevWorkSpace={prevWorkSpace}
|
|
110
|
+
isWorkSpaceType={isWorkSpaceType}
|
|
111
|
+
prevOrder={prevOrder}
|
|
91
112
|
patient={patient}
|
|
92
|
-
visit={visit}
|
|
93
113
|
/>
|
|
94
114
|
</>
|
|
95
115
|
);
|
|
96
116
|
}
|
|
97
117
|
|
|
98
118
|
function TestTypeSearchResults({
|
|
99
|
-
|
|
119
|
+
cancelOrder,
|
|
100
120
|
searchTerm,
|
|
101
121
|
orderTypeUuid,
|
|
102
122
|
orderableConceptSets,
|
|
103
123
|
openLabForm,
|
|
104
124
|
focusAndClearSearchInput,
|
|
125
|
+
prevWorkSpace,
|
|
126
|
+
isWorkSpaceType,
|
|
127
|
+
prevOrder,
|
|
105
128
|
patient,
|
|
106
|
-
visit,
|
|
107
129
|
}: TestTypeSearchResultsProps) {
|
|
108
130
|
const { t } = useTranslation();
|
|
109
131
|
const isTablet = useLayoutType() === 'tablet';
|
|
@@ -154,9 +176,10 @@ function TestTypeSearchResults({
|
|
|
154
176
|
orderTypeUuid={orderTypeUuid}
|
|
155
177
|
openOrderForm={openLabForm}
|
|
156
178
|
testType={testType}
|
|
157
|
-
|
|
179
|
+
prevWorkSpace={prevWorkSpace}
|
|
180
|
+
isWorkSpaceType={isWorkSpaceType}
|
|
181
|
+
prevOrder={prevOrder}
|
|
158
182
|
patient={patient}
|
|
159
|
-
visit={visit}
|
|
160
183
|
/>
|
|
161
184
|
))}
|
|
162
185
|
</div>
|
|
@@ -164,12 +187,12 @@ function TestTypeSearchResults({
|
|
|
164
187
|
{isTablet && (
|
|
165
188
|
<div className={styles.separatorContainer}>
|
|
166
189
|
<p className={styles.separator}>{t('or', 'or')}</p>
|
|
167
|
-
<Button
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
190
|
+
<Button iconDescription="Return to order basket" kind="ghost" onClick={cancelOrder}>
|
|
191
|
+
{typeof isWorkSpaceType === 'function' &&
|
|
192
|
+
isWorkSpaceType(prevWorkSpace) &&
|
|
193
|
+
prevWorkSpace === WORKSPACES.TEST_RESULTS_FORM
|
|
194
|
+
? t('backToTestResults', 'Back to test Results')
|
|
195
|
+
: t('backToOrderBasket', 'Back to order basket')}
|
|
173
196
|
</Button>
|
|
174
197
|
</div>
|
|
175
198
|
)}
|
|
@@ -201,9 +224,10 @@ const TestTypeSearchResultItem: React.FC<TestTypeSearchResultItemProps> = ({
|
|
|
201
224
|
testType,
|
|
202
225
|
openOrderForm,
|
|
203
226
|
orderTypeUuid,
|
|
204
|
-
|
|
227
|
+
prevWorkSpace,
|
|
228
|
+
isWorkSpaceType,
|
|
229
|
+
prevOrder,
|
|
205
230
|
patient,
|
|
206
|
-
visit,
|
|
207
231
|
}) => {
|
|
208
232
|
const { t } = useTranslation();
|
|
209
233
|
const isTablet = useLayoutType() === 'tablet';
|
|
@@ -217,17 +241,25 @@ const TestTypeSearchResultItem: React.FC<TestTypeSearchResultItemProps> = ({
|
|
|
217
241
|
|
|
218
242
|
const createLabOrder = useCallback(
|
|
219
243
|
(orderableConcept: TestType) => {
|
|
220
|
-
return createEmptyLabOrder(orderableConcept, session.currentProvider?.uuid
|
|
244
|
+
return createEmptyLabOrder(orderableConcept, session.currentProvider?.uuid);
|
|
221
245
|
},
|
|
222
|
-
[session.currentProvider.uuid
|
|
246
|
+
[session.currentProvider.uuid],
|
|
223
247
|
);
|
|
224
248
|
|
|
225
249
|
const addToBasket = useCallback(() => {
|
|
226
250
|
const labOrder = createLabOrder(testType);
|
|
227
251
|
labOrder.isOrderIncomplete = true;
|
|
228
252
|
setOrders([...orders, labOrder]);
|
|
229
|
-
closeWorkspace({
|
|
230
|
-
|
|
253
|
+
closeWorkspace('add-lab-order', {
|
|
254
|
+
ignoreChanges: true,
|
|
255
|
+
onWorkspaceClose: () =>
|
|
256
|
+
typeof isWorkSpaceType === 'function' &&
|
|
257
|
+
isWorkSpaceType(prevWorkSpace) &&
|
|
258
|
+
prevWorkSpace === WORKSPACES.TEST_RESULTS_FORM
|
|
259
|
+
? launchWorkspace(prevWorkSpace, { order: prevOrder })
|
|
260
|
+
: launchWorkspace(WORKSPACES.ORDER_BASKET),
|
|
261
|
+
});
|
|
262
|
+
}, [orders, setOrders, createLabOrder, testType, isWorkSpaceType, prevOrder, prevWorkSpace]);
|
|
231
263
|
|
|
232
264
|
const removeFromBasket = useCallback(() => {
|
|
233
265
|
setOrders(orders.filter((order) => order.testType.conceptUuid !== testType.conceptUuid));
|
package/src/test-orders/api.ts
CHANGED
|
@@ -2,12 +2,7 @@ import { useCallback, useMemo } from 'react';
|
|
|
2
2
|
import { chunk } from 'lodash-es';
|
|
3
3
|
import useSWR, { useSWRConfig } from 'swr';
|
|
4
4
|
import useSWRImmutable from 'swr/immutable';
|
|
5
|
-
import type {
|
|
6
|
-
OrderPost,
|
|
7
|
-
PatientOrderFetchResponse,
|
|
8
|
-
TestOrderBasketItem,
|
|
9
|
-
TestOrderPost,
|
|
10
|
-
} from '@openmrs/esm-patient-common-lib';
|
|
5
|
+
import type { OrderPost, PatientOrderFetchResponse, TestOrderPost } from '@openmrs/esm-patient-common-lib';
|
|
11
6
|
import {
|
|
12
7
|
type FetchResponse,
|
|
13
8
|
openmrsFetch,
|
|
@@ -17,6 +12,7 @@ import {
|
|
|
17
12
|
useConfig,
|
|
18
13
|
} from '@openmrs/esm-framework';
|
|
19
14
|
import { type ConfigObject } from '../config-schema';
|
|
15
|
+
import type { TestOrderBasketItem } from '../types';
|
|
20
16
|
|
|
21
17
|
export const careSettingUuid = '6f0c9a92-6f24-11e3-af88-005056821db0';
|
|
22
18
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
interface LabIconProps {
|
|
4
|
+
isTablet: boolean;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function LabIcon({ isTablet }: LabIconProps) {
|
|
8
|
+
const size = isTablet ? 40 : 24;
|
|
9
|
+
return (
|
|
10
|
+
<svg width={size} height={size} viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
11
|
+
<g clipPath="url(#clip0_lab_icon)">
|
|
12
|
+
<path d="M24 0H0V24H24V0Z" fill="#E8DAFF" />
|
|
13
|
+
<path
|
|
14
|
+
d="M17.6157 15.8091L14 10.8374V6H15V5H9V6H10V10.8374L6.3843 15.8091C5.9398 16.4203 5.87585 17.2292 6.2188 17.9026C6.56175 18.576 7.25358 19 8.0093 19H15.9907C16.7464 19 17.4383 18.576 17.7812 17.9026C18.1242 17.2292 18.0602 16.4203 17.6157 15.8091ZM11 11.1626V6H13V11.1626L14.3364 13H9.6636L11 11.1626ZM15.9907 18H8.0093C7.62971 17.9999 7.28226 17.7868 7.10998 17.4486C6.93771 17.1103 6.96973 16.704 7.19285 16.3969L8.9363 14H15.0637L16.8072 16.3969C17.0303 16.704 17.0623 17.1103 16.89 17.4486C16.7178 17.7868 16.3703 17.9999 15.9907 18Z"
|
|
15
|
+
fill="#6929C4"
|
|
16
|
+
/>
|
|
17
|
+
</g>
|
|
18
|
+
<defs>
|
|
19
|
+
<clipPath id="clip0_lab_icon">
|
|
20
|
+
<rect width={size} height={size} fill="white" />
|
|
21
|
+
</clipPath>
|
|
22
|
+
</defs>
|
|
23
|
+
</svg>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default LabIcon;
|
|
@@ -3,7 +3,7 @@ import classNames from 'classnames';
|
|
|
3
3
|
import { useTranslation } from 'react-i18next';
|
|
4
4
|
import { ClickableTile, IconButton, Tile } from '@carbon/react';
|
|
5
5
|
import { ExtensionSlot, TrashCanIcon, useLayoutType, WarningIcon } from '@openmrs/esm-framework';
|
|
6
|
-
import type { TestOrderBasketItem } from '
|
|
6
|
+
import type { TestOrderBasketItem } from '../../types';
|
|
7
7
|
import styles from './lab-order-basket-item-tile.scss';
|
|
8
8
|
|
|
9
9
|
export interface OrderBasketItemTileProps {
|