@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.
Files changed (170) hide show
  1. package/.turbo/turbo-build.log +19 -22
  2. package/dist/1119.js +1 -1
  3. package/dist/1197.js +1 -1
  4. package/dist/{6231.js → 1477.js} +1 -1
  5. package/dist/1477.js.map +1 -0
  6. package/dist/1638.js +1 -1
  7. package/dist/1638.js.map +1 -1
  8. package/dist/1935.js +1 -0
  9. package/dist/1935.js.map +1 -0
  10. package/dist/2146.js +1 -1
  11. package/dist/2690.js +1 -1
  12. package/dist/3099.js +1 -1
  13. package/dist/34.js +1 -0
  14. package/dist/34.js.map +1 -0
  15. package/dist/3509.js +1 -1
  16. package/dist/3509.js.map +1 -1
  17. package/dist/3584.js +1 -1
  18. package/dist/4055.js +1 -1
  19. package/dist/4132.js +1 -1
  20. package/dist/4300.js +1 -1
  21. package/dist/4335.js +1 -1
  22. package/dist/439.js +1 -0
  23. package/dist/4618.js +1 -1
  24. package/dist/4652.js +1 -1
  25. package/dist/4944.js +1 -1
  26. package/dist/5173.js +1 -1
  27. package/dist/5241.js +1 -1
  28. package/dist/5442.js +1 -1
  29. package/dist/5661.js +1 -1
  30. package/dist/5670.js +1 -1
  31. package/dist/6022.js +1 -1
  32. package/dist/6113.js +1 -0
  33. package/dist/6113.js.map +1 -0
  34. package/dist/6301.js +1 -1
  35. package/dist/6301.js.map +1 -1
  36. package/dist/6468.js +1 -1
  37. package/dist/6589.js +1 -0
  38. package/dist/6679.js +1 -1
  39. package/dist/6840.js +1 -1
  40. package/dist/6859.js +1 -1
  41. package/dist/7097.js +1 -1
  42. package/dist/7159.js +1 -1
  43. package/dist/7202.js +1 -0
  44. package/dist/7202.js.map +1 -0
  45. package/dist/723.js +1 -1
  46. package/dist/7617.js +1 -1
  47. package/dist/790.js +1 -1
  48. package/dist/790.js.map +1 -1
  49. package/dist/795.js +1 -1
  50. package/dist/8163.js +1 -1
  51. package/dist/8349.js +1 -1
  52. package/dist/8371.js +1 -0
  53. package/dist/8555.js +2 -0
  54. package/dist/8555.js.map +1 -0
  55. package/dist/8618.js +1 -1
  56. package/dist/890.js +1 -1
  57. package/dist/9214.js +1 -1
  58. package/dist/9538.js +1 -1
  59. package/dist/9569.js +1 -1
  60. package/dist/986.js +1 -1
  61. package/dist/9879.js +1 -1
  62. package/dist/9895.js +1 -1
  63. package/dist/9900.js +1 -1
  64. package/dist/9913.js +1 -1
  65. package/dist/main.js +1 -1
  66. package/dist/main.js.map +1 -1
  67. package/dist/openmrs-esm-patient-tests-app.js +1 -1
  68. package/dist/openmrs-esm-patient-tests-app.js.buildmanifest.json +302 -211
  69. package/dist/openmrs-esm-patient-tests-app.js.map +1 -1
  70. package/dist/routes.json +1 -1
  71. package/package.json +2 -2
  72. package/src/edit-test-results/modal/edit-lab-results.modal.tsx +2 -2
  73. package/src/index.ts +1 -1
  74. package/src/routes.json +4 -3
  75. package/src/test-orders/add-test-order/add-test-order.test.tsx +44 -21
  76. package/src/test-orders/add-test-order/add-test-order.workspace.tsx +152 -21
  77. package/src/test-orders/add-test-order/test-order-form.component.tsx +60 -68
  78. package/src/test-orders/add-test-order/test-order.ts +3 -3
  79. package/src/test-orders/add-test-order/test-type-search.component.tsx +60 -28
  80. package/src/test-orders/api.ts +2 -6
  81. package/src/test-orders/lab-order-basket-panel/lab-icon.component.tsx +27 -0
  82. package/src/test-orders/lab-order-basket-panel/lab-order-basket-item-tile.component.tsx +1 -1
  83. package/src/test-orders/lab-order-basket-panel/lab-order-basket-panel.extension.tsx +95 -30
  84. package/src/test-orders/lab-order-basket-panel/lab-order-basket-panel.scss +26 -11
  85. package/src/test-orders/lab-order-basket-panel/lab-order-basket-panel.test.tsx +12 -10
  86. package/src/test-results/filter/filter-context.test.tsx +556 -0
  87. package/src/test-results/filter/filter-context.tsx +1 -1
  88. package/src/test-results/filter/filter-reducer.test.ts +540 -0
  89. package/src/test-results/filter/filter-reducer.ts +1 -1
  90. package/src/test-results/filter/filter-set.component.tsx +75 -48
  91. package/src/test-results/filter/filter-set.test.tsx +694 -0
  92. package/src/test-results/filter/filter-types.ts +5 -1
  93. package/src/test-results/grouped-timeline/grid.component.tsx +4 -2
  94. package/src/test-results/grouped-timeline/grouped-timeline.component.tsx +20 -22
  95. package/src/test-results/grouped-timeline/grouped-timeline.test.tsx +3 -2
  96. package/src/test-results/grouped-timeline/reference-range-helpers.test.ts +37 -1
  97. package/src/test-results/grouped-timeline/reference-range-helpers.ts +50 -1
  98. package/src/test-results/grouped-timeline/timeline-data-group.component.tsx +4 -4
  99. package/src/test-results/grouped-timeline/useObstreeData.test.ts +471 -0
  100. package/src/test-results/grouped-timeline/useObstreeData.ts +37 -4
  101. package/src/test-results/individual-results-table/individual-results-table.component.tsx +2 -7
  102. package/src/test-results/individual-results-table-tablet/individual-results-table-tablet.component.tsx +3 -3
  103. package/src/test-results/individual-results-table-tablet/lab-set-panel.component.tsx +2 -5
  104. package/src/test-results/individual-results-table-tablet/usePanelData.tsx +40 -26
  105. package/src/test-results/loadPatientTestData/helpers.ts +29 -12
  106. package/src/test-results/loadPatientTestData/usePatientResultsData.ts +18 -7
  107. package/src/test-results/overview/external-overview.extension.tsx +1 -2
  108. package/src/test-results/print-modal/print-modal.extension.tsx +1 -1
  109. package/src/test-results/results-viewer/results-viewer.extension.tsx +8 -4
  110. package/src/test-results/tree-view/tree-view.component.tsx +18 -5
  111. package/src/test-results/tree-view/tree-view.test.tsx +119 -2
  112. package/src/test-results/trendline/trendline.component.tsx +88 -52
  113. package/src/test-results/ui-elements/{resetFiltersEmptyState → reset-filters-empty-state}/filter-empty-data-illustration.tsx +2 -2
  114. package/src/test-results/ui-elements/{resetFiltersEmptyState → reset-filters-empty-state}/filter-empty-state.component.tsx +5 -6
  115. package/src/types.ts +9 -0
  116. package/translations/am.json +3 -4
  117. package/translations/ar.json +3 -4
  118. package/translations/ar_SY.json +3 -4
  119. package/translations/bn.json +3 -4
  120. package/translations/cs.json +119 -0
  121. package/translations/de.json +3 -4
  122. package/translations/en.json +3 -4
  123. package/translations/en_US.json +3 -4
  124. package/translations/es.json +3 -4
  125. package/translations/es_MX.json +3 -4
  126. package/translations/fr.json +3 -4
  127. package/translations/he.json +3 -4
  128. package/translations/hi.json +3 -4
  129. package/translations/hi_IN.json +3 -4
  130. package/translations/id.json +3 -4
  131. package/translations/it.json +3 -4
  132. package/translations/ka.json +3 -4
  133. package/translations/km.json +3 -4
  134. package/translations/ku.json +3 -4
  135. package/translations/ky.json +3 -4
  136. package/translations/lg.json +3 -4
  137. package/translations/ne.json +3 -4
  138. package/translations/pl.json +3 -4
  139. package/translations/pt.json +3 -4
  140. package/translations/pt_BR.json +3 -4
  141. package/translations/qu.json +3 -4
  142. package/translations/ro_RO.json +3 -4
  143. package/translations/ru_RU.json +3 -4
  144. package/translations/si.json +3 -4
  145. package/translations/sq.json +119 -0
  146. package/translations/sw.json +3 -4
  147. package/translations/sw_KE.json +3 -4
  148. package/translations/tr.json +3 -4
  149. package/translations/tr_TR.json +3 -4
  150. package/translations/uk.json +3 -4
  151. package/translations/uz.json +3 -4
  152. package/translations/uz@Latn.json +3 -4
  153. package/translations/uz_UZ.json +3 -4
  154. package/translations/vi.json +3 -4
  155. package/translations/zh.json +3 -4
  156. package/translations/zh_CN.json +3 -4
  157. package/translations/zh_TW.json +119 -0
  158. package/dist/1479.js +0 -1
  159. package/dist/1479.js.map +0 -1
  160. package/dist/5348.js +0 -1
  161. package/dist/5348.js.map +0 -1
  162. package/dist/6231.js.map +0 -1
  163. package/dist/9540.js +0 -2
  164. package/dist/9540.js.map +0 -1
  165. package/dist/9838.js +0 -1
  166. package/dist/9838.js.map +0 -1
  167. package/src/test-orders/add-test-order/add-test-order.component.tsx +0 -125
  168. package/src/test-orders/add-test-order/exported-add-test-order.workspace.tsx +0 -30
  169. /package/dist/{9540.js.LICENSE.txt → 8555.js.LICENSE.txt} +0 -0
  170. /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
- setHasUnsavedChanges: (hasUnsavedChanges: boolean) => void;
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
- setHasUnsavedChanges,
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 { orders, setOrders, clearOrders } = useOrderBasket<TestOrderBasketItem>(
68
- patient,
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
- const { mutate: mutateOrders } = useMutatePatientOrders(patient.id);
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 saveLabOrderToBasket = useCallback(
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
- closeWorkspace({ discardUnsavedChanges: true });
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
- [orders, setOrders, session?.currentProvider?.uuid, closeWorkspace, initialOrder],
173
- );
174
-
175
- const submitLabOrderToServer = useCallback(
176
- (data: TestOrderBasketItem) => {
177
- const finalizedOrder: TestOrderBasketItem = {
178
- ...initialOrder,
179
- ...data,
180
- };
181
- finalizedOrder.orderer = session.currentProvider.uuid;
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
- }, [closeWorkspace, orders, setOrders, defaultValues]);
205
-
206
- const closeModifyOrderWorkspace = useCallback(() => {
207
- clearOrders();
208
- closeWorkspace();
209
- }, [clearOrders, closeWorkspace]);
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
- setHasUnsavedChanges(isDirty);
232
- }, [isDirty, setHasUnsavedChanges]);
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
- <label className={styles.testTypeLabel}>{t('testType', 'Test type')}</label>
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
- {t('saveOrder', 'Save order')}
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, type TestOrderBasketItem } from '@openmrs/esm-patient-common-lib';
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, visit): TestOrderBasketItem {
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 TestOrderBasketItem } from '@openmrs/esm-patient-common-lib';
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
- closeWorkspace: Workspace2DefinitionProps['closeWorkspace'];
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
- closeWorkspace,
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
- closeWorkspace={closeWorkspace}
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
- closeWorkspace,
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
- closeWorkspace={closeWorkspace}
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
- iconDescription="Return to order basket"
169
- kind="ghost"
170
- onClick={() => closeWorkspace({ discardUnsavedChanges: true })}
171
- >
172
- {t('returnToOrderBasket', 'Return to order basket')}
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
- closeWorkspace,
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, visit);
244
+ return createEmptyLabOrder(orderableConcept, session.currentProvider?.uuid);
221
245
  },
222
- [session.currentProvider.uuid, visit],
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({ discardUnsavedChanges: true });
230
- }, [orders, setOrders, createLabOrder, testType, closeWorkspace]);
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));
@@ -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 '@openmrs/esm-patient-common-lib';
6
+ import type { TestOrderBasketItem } from '../../types';
7
7
  import styles from './lab-order-basket-item-tile.scss';
8
8
 
9
9
  export interface OrderBasketItemTileProps {