@thrustdevs/esm-procedure-orders-app 1.0.2-pre.6

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 (207) hide show
  1. package/.turbo/turbo-build.log +41 -0
  2. package/README.md +7 -0
  3. package/dist/122.js +1 -0
  4. package/dist/122.js.map +1 -0
  5. package/dist/144.js +2 -0
  6. package/dist/144.js.LICENSE.txt +19 -0
  7. package/dist/144.js.map +1 -0
  8. package/dist/182.js +1 -0
  9. package/dist/182.js.map +1 -0
  10. package/dist/205.js +1 -0
  11. package/dist/205.js.map +1 -0
  12. package/dist/216.js +2 -0
  13. package/dist/216.js.LICENSE.txt +9 -0
  14. package/dist/216.js.map +1 -0
  15. package/dist/290.js +2 -0
  16. package/dist/290.js.LICENSE.txt +5 -0
  17. package/dist/290.js.map +1 -0
  18. package/dist/300.js +1 -0
  19. package/dist/341.js +2 -0
  20. package/dist/341.js.LICENSE.txt +29 -0
  21. package/dist/341.js.map +1 -0
  22. package/dist/41.js +2 -0
  23. package/dist/41.js.LICENSE.txt +9 -0
  24. package/dist/41.js.map +1 -0
  25. package/dist/470.js +1 -0
  26. package/dist/470.js.map +1 -0
  27. package/dist/495.js +1 -0
  28. package/dist/495.js.map +1 -0
  29. package/dist/506.js +2 -0
  30. package/dist/506.js.LICENSE.txt +39 -0
  31. package/dist/506.js.map +1 -0
  32. package/dist/537.js +1 -0
  33. package/dist/537.js.map +1 -0
  34. package/dist/647.js +2 -0
  35. package/dist/647.js.LICENSE.txt +5 -0
  36. package/dist/647.js.map +1 -0
  37. package/dist/7.js +1 -0
  38. package/dist/7.js.map +1 -0
  39. package/dist/719.js +2 -0
  40. package/dist/719.js.LICENSE.txt +5 -0
  41. package/dist/719.js.map +1 -0
  42. package/dist/720.js +1 -0
  43. package/dist/720.js.map +1 -0
  44. package/dist/876.js +1 -0
  45. package/dist/876.js.map +1 -0
  46. package/dist/883.js +1 -0
  47. package/dist/883.js.map +1 -0
  48. package/dist/89.js +1 -0
  49. package/dist/89.js.map +1 -0
  50. package/dist/892.js +1 -0
  51. package/dist/892.js.map +1 -0
  52. package/dist/895.js +1 -0
  53. package/dist/895.js.map +1 -0
  54. package/dist/913.js +2 -0
  55. package/dist/913.js.LICENSE.txt +32 -0
  56. package/dist/913.js.map +1 -0
  57. package/dist/924.js +1 -0
  58. package/dist/924.js.map +1 -0
  59. package/dist/943.js +1 -0
  60. package/dist/943.js.map +1 -0
  61. package/dist/99.js +2 -0
  62. package/dist/99.js.LICENSE.txt +5 -0
  63. package/dist/99.js.map +1 -0
  64. package/dist/kenyaemr-esm-procedure-orders-app.js +1 -0
  65. package/dist/kenyaemr-esm-procedure-orders-app.js.buildmanifest.json +786 -0
  66. package/dist/kenyaemr-esm-procedure-orders-app.js.map +1 -0
  67. package/dist/main.js +2 -0
  68. package/dist/main.js.LICENSE.txt +35 -0
  69. package/dist/main.js.map +1 -0
  70. package/dist/routes.json +1 -0
  71. package/jest.config.js +8 -0
  72. package/package.json +55 -0
  73. package/src/completed-list/completed-list.component.tsx +40 -0
  74. package/src/completed-list/completed-list.resource.ts +0 -0
  75. package/src/completed-list/completed-list.scss +223 -0
  76. package/src/components/create-dashboard-link.component.tsx +35 -0
  77. package/src/components/overlay/hook.ts +47 -0
  78. package/src/components/overlay/overlay.component.tsx +42 -0
  79. package/src/components/overlay/overlay.scss +92 -0
  80. package/src/config-schema.ts +78 -0
  81. package/src/constants.ts +5 -0
  82. package/src/declarations.d.ts +6 -0
  83. package/src/empty-state/empty-state-component.tsx +21 -0
  84. package/src/empty-state/empty-state.scss +23 -0
  85. package/src/form/post-procedures/post-procedure-form.component.tsx +468 -0
  86. package/src/form/post-procedures/post-procedure-form.scss +189 -0
  87. package/src/form/post-procedures/post-procedure.resource.tsx +71 -0
  88. package/src/form/procedures-orders/add-procedures-order/add-procedures-order.scss +44 -0
  89. package/src/form/procedures-orders/add-procedures-order/add-procedures-order.workspace.tsx +93 -0
  90. package/src/form/procedures-orders/add-procedures-order/procedures-order-form.component.tsx +476 -0
  91. package/src/form/procedures-orders/add-procedures-order/procedures-order-form.scss +80 -0
  92. package/src/form/procedures-orders/add-procedures-order/procedures-order.ts +17 -0
  93. package/src/form/procedures-orders/add-procedures-order/procedures-type-search.scss +115 -0
  94. package/src/form/procedures-orders/add-procedures-order/procedures-type-search.tsx +236 -0
  95. package/src/form/procedures-orders/add-procedures-order/useProceduresTypes.ts +93 -0
  96. package/src/form/procedures-orders/api.ts +282 -0
  97. package/src/form/procedures-orders/order-config.ts +48 -0
  98. package/src/form/procedures-orders/procedures-order-basket-panel/procedures-icon.component.tsx +39 -0
  99. package/src/form/procedures-orders/procedures-order-basket-panel/procedures-order-basket-item-tile.component.tsx +100 -0
  100. package/src/form/procedures-orders/procedures-order-basket-panel/procedures-order-basket-item-tile.scss +72 -0
  101. package/src/form/procedures-orders/procedures-order-basket-panel/procedures-order-basket-panel.extension.tsx +190 -0
  102. package/src/form/procedures-orders/procedures-order-basket-panel/procedures-order-basket-panel.scss +74 -0
  103. package/src/form/procedures-orders/procedures-order-basket-panel/procedures-order-basket.scss +55 -0
  104. package/src/header/procedure-header.component.tsx +32 -0
  105. package/src/header/procedure-header.scss +70 -0
  106. package/src/header/procedure-illustration.component.tsx +52 -0
  107. package/src/hooks/useOrdersWorklist.ts +70 -0
  108. package/src/hooks/useSearchGroupedResults.ts +22 -0
  109. package/src/hooks/useSearchResults.ts +39 -0
  110. package/src/index.ts +59 -0
  111. package/src/left-panel-link.tsx +40 -0
  112. package/src/not-done-list/not-done-list.component.tsx +44 -0
  113. package/src/not-done-list/not-done.scss +207 -0
  114. package/src/patient-chart/patient-procedure-order-results-table.resource.ts +43 -0
  115. package/src/patient-chart/patient-procedure-order-results.component.tsx +12 -0
  116. package/src/patient-chart/patient-procedure-order-results.resource.ts +485 -0
  117. package/src/patient-chart/patient-procedure-results.component.tsx +30 -0
  118. package/src/patient-chart/procedure-active-order/procedure-active-order-results.component.tsx +390 -0
  119. package/src/patient-chart/procedure-active-order/procedure-active-order-results.scss +78 -0
  120. package/src/patient-chart/procedure-order-referals/procedure-order-referals.component.tsx +394 -0
  121. package/src/patient-chart/procedure-order-referals/procedure-order-referals.resource.tsx +0 -0
  122. package/src/patient-chart/procedure-order-referals/procedure-order-referals.scss +78 -0
  123. package/src/patient-chart/procedure-past-test/laboratory-past-test-order-results.component.tsx +366 -0
  124. package/src/patient-chart/procedure-past-test/laboratory-past-test-order-results.scss +74 -0
  125. package/src/patient-chart/procedure-tabs/laboratory-order-tabs.component.tsx +44 -0
  126. package/src/patient-chart/procedure-tabs/laboratory-order-tabs.scss +7 -0
  127. package/src/patient-chart/procedure-workspaces/laboratory-referral.workspace.component.tsx +11 -0
  128. package/src/patient-chart/procedure-workspaces/laboratory-referral.workspace.scss +0 -0
  129. package/src/patient-chart/results-summary/print-results-summary.component.tsx +152 -0
  130. package/src/patient-chart/results-summary/print-results-summary.scss +80 -0
  131. package/src/patient-chart/results-summary/print-results-table.component.tsx +134 -0
  132. package/src/patient-chart/results-summary/results-summary.resource.tsx +174 -0
  133. package/src/patient-chart/results-summary/results-summary.scss +158 -0
  134. package/src/patient-chart/results-summary/send-email-dialog.component.tsx +59 -0
  135. package/src/patient-chart/results-summary/test-children-results.component.tsx +177 -0
  136. package/src/patient-chart/results-summary/test-print-results-table.component.tsx +105 -0
  137. package/src/patient-chart/results-summary/test-results-table.component.tsx +103 -0
  138. package/src/print/print-procedure-results.component.tsx +49 -0
  139. package/src/print/print-procedure.component.tsx +105 -0
  140. package/src/print/print-procedure.scss +98 -0
  141. package/src/procedure-tabs/completed-tab.component.tsx +12 -0
  142. package/src/procedure-tabs/not-done-tab.component.tsx +12 -0
  143. package/src/procedure-tabs/referred-tab.component.tsx +12 -0
  144. package/src/procedure-tabs/work-list-tab.component.tsx +13 -0
  145. package/src/procedure.component.tsx +24 -0
  146. package/src/procedures-ordered/_pick-procedure-request-menu.component.tsx +33 -0
  147. package/src/procedures-ordered/pick-procedure-order/add-to-worklist-dialog.component.tsx +105 -0
  148. package/src/procedures-ordered/pick-procedure-order/add-to-worklist-dialog.resource.ts +106 -0
  149. package/src/procedures-ordered/pick-procedure-order/add-to-worklist-dialog.scss +38 -0
  150. package/src/procedures-ordered/pick-procedure-request-menu.component.tsx +32 -0
  151. package/src/procedures-ordered/procedure-dialogs/add-to-worklist-dialog.component.tsx +300 -0
  152. package/src/procedures-ordered/procedure-dialogs/add-to-worklist-dialog.resource.ts +153 -0
  153. package/src/procedures-ordered/procedure-dialogs/add-to-worklist-dialog.scss +38 -0
  154. package/src/procedures-ordered/procedure-instructions/instructions.scss +24 -0
  155. package/src/procedures-ordered/procedure-instructions/procedure-instructions-menu.component.tsx +32 -0
  156. package/src/procedures-ordered/procedure-instructions/procedure-instructions.component.tsx +78 -0
  157. package/src/procedures-ordered/procedure-instructions/procedure-instructions.scss +24 -0
  158. package/src/procedures-ordered/procedure-queue.scss +211 -0
  159. package/src/procedures-ordered/procedure-tabs.component.tsx +104 -0
  160. package/src/procedures-ordered/procedure-tests/procedure-tests.component.tsx +83 -0
  161. package/src/procedures-ordered/procedure-tests/procedure-tests.resource.ts +14 -0
  162. package/src/procedures-ordered/procedure-tests/procedure-tests.scss +12 -0
  163. package/src/procedures-ordered/procedures-ordered-list.component.tsx +38 -0
  164. package/src/procedures-ordered/reject-order-dialog/reject-order-dialog.scss +14 -0
  165. package/src/procedures-ordered/reject-order-dialog/reject-procedure-order-dialog.component.tsx +98 -0
  166. package/src/procedures-ordered/reject-reason/procedure-reject-reason-menu.component.tsx +32 -0
  167. package/src/procedures-ordered/reject-reason/procedure-reject-reason.component.tsx +40 -0
  168. package/src/procedures-ordered/transition-patient-new-queue/transition-latest-queue-entry-button.component.tsx +42 -0
  169. package/src/procedures-ordered/transition-patient-new-queue/transition-latest-queue-entry-button.scss +14 -0
  170. package/src/procedures-ordered/transition-patient-new-queue/transition-latest-queue-entry-button.test.tsx +67 -0
  171. package/src/referred-procedures/referred-procedures.component.tsx +37 -0
  172. package/src/results/result-form-field.component.tsx +141 -0
  173. package/src/results/result-form.component.tsx +120 -0
  174. package/src/results/result-form.resource.ts +361 -0
  175. package/src/results/result-form.scss +22 -0
  176. package/src/root.component.tsx +16 -0
  177. package/src/routes.json +152 -0
  178. package/src/setup-tests.ts +7 -0
  179. package/src/shared/ui/common/action-button/action-button.component.tsx +68 -0
  180. package/src/shared/ui/common/action-button/action-button.scss +12 -0
  181. package/src/shared/ui/common/action-button/order-action-extension.component.tsx +21 -0
  182. package/src/shared/ui/common/grouped-orders-table.component.tsx +176 -0
  183. package/src/shared/ui/common/grouped-orders-table.scss +30 -0
  184. package/src/shared/ui/common/grouped-procedure-types.ts +47 -0
  185. package/src/shared/ui/common/list-order-details.component.tsx +171 -0
  186. package/src/shared/ui/common/list-order-details.resource.ts +41 -0
  187. package/src/shared/ui/common/list-order-details.scss +118 -0
  188. package/src/shared/ui/common/orders-date-range-picker.scss +15 -0
  189. package/src/shared/ui/common/orders-date-range-picker.tsx +38 -0
  190. package/src/summary-tiles/procedure-summary-tiles.component.tsx +36 -0
  191. package/src/summary-tiles/procedure-summary-tiles.scss +11 -0
  192. package/src/summary-tiles/procedure-summary.resource.tsx +79 -0
  193. package/src/summary-tiles/summary-tile.component.tsx +41 -0
  194. package/src/summary-tiles/summary-tile.scss +53 -0
  195. package/src/types/index.ts +661 -0
  196. package/src/types/patient-queue.ts +77 -0
  197. package/src/ui-components/overflow-menu.component.tsx +74 -0
  198. package/src/ui-components/overflow-menu.scss +39 -0
  199. package/src/utils/functions.ts +236 -0
  200. package/src/utils/orders-table/orders-data-table.component.tsx +129 -0
  201. package/src/utils/orders-table/orders-data-table.scss +50 -0
  202. package/src/work-list/work-list.component.tsx +38 -0
  203. package/src/work-list/work-list.resource.ts +26 -0
  204. package/src/work-list/work-list.scss +207 -0
  205. package/translations/en.json +141 -0
  206. package/tsconfig.json +5 -0
  207. package/webpack.config.js +1 -0
@@ -0,0 +1,190 @@
1
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import classNames from 'classnames';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { Button, Tile } from '@carbon/react';
5
+ import { Add, ChevronDown, ChevronUp } from '@carbon/react/icons';
6
+ import { useLayoutType, closeWorkspace } from '@openmrs/esm-framework';
7
+ import { launchPatientWorkspace, type OrderBasketItem, useOrderBasket } from '@openmrs/esm-patient-common-lib';
8
+ import { ProceduresOrderBasketItemTile } from './procedures-order-basket-item-tile.component';
9
+ import { prepProceduresOrderPostData } from '../api';
10
+ import LabIcon from './procedures-icon.component';
11
+ import styles from './procedures-order-basket-panel.scss';
12
+ import { type ProcedureOrderBasketItem } from '../../../types';
13
+
14
+ export default function ProceduresOrderBasketPanelExtension() {
15
+ const { t } = useTranslation();
16
+ const isTablet = useLayoutType() === 'tablet';
17
+ const { orders, setOrders } = useOrderBasket<ProcedureOrderBasketItem>('procedures', prepProceduresOrderPostData);
18
+ const [isExpanded, setIsExpanded] = useState(orders.length > 0);
19
+ const {
20
+ incompleteOrderBasketItems,
21
+ newOrderBasketItems,
22
+ renewedOrderBasketItems,
23
+ revisedOrderBasketItems,
24
+ discontinuedOrderBasketItems,
25
+ } = useMemo(() => {
26
+ const incompleteOrderBasketItems: Array<ProcedureOrderBasketItem> = [];
27
+ const newOrderBasketItems: Array<ProcedureOrderBasketItem> = [];
28
+ const renewedOrderBasketItems: Array<ProcedureOrderBasketItem> = [];
29
+ const revisedOrderBasketItems: Array<ProcedureOrderBasketItem> = [];
30
+ const discontinuedOrderBasketItems: Array<ProcedureOrderBasketItem> = [];
31
+
32
+ orders.forEach((order) => {
33
+ if (order?.isOrderIncomplete) {
34
+ incompleteOrderBasketItems.push(order);
35
+ } else if (order.action === 'NEW') {
36
+ newOrderBasketItems.push(order);
37
+ } else if (order.action === 'RENEW') {
38
+ renewedOrderBasketItems.push(order);
39
+ } else if (order.action === 'REVISE') {
40
+ revisedOrderBasketItems.push(order);
41
+ } else if (order.action === 'DISCONTINUE') {
42
+ discontinuedOrderBasketItems.push(order);
43
+ }
44
+ });
45
+
46
+ return {
47
+ incompleteOrderBasketItems,
48
+ newOrderBasketItems,
49
+ renewedOrderBasketItems,
50
+ revisedOrderBasketItems,
51
+ discontinuedOrderBasketItems,
52
+ };
53
+ }, [orders]);
54
+
55
+ const openNewProceduresForm = useCallback(() => {
56
+ closeWorkspace('order-basket', {
57
+ ignoreChanges: true,
58
+ onWorkspaceClose: () => {
59
+ launchPatientWorkspace('add-procedures-order');
60
+ },
61
+ });
62
+ }, []);
63
+
64
+ const openEditProceduresForm = useCallback((order: OrderBasketItem) => {
65
+ closeWorkspace('order-basket', {
66
+ ignoreChanges: true,
67
+ onWorkspaceClose: () => launchPatientWorkspace('add-procedures-order', { order }),
68
+ });
69
+ }, []);
70
+
71
+ const removeLabOrder = useCallback(
72
+ (order: ProcedureOrderBasketItem) => {
73
+ const newOrders = [...orders];
74
+ newOrders.splice(orders.indexOf(order), 1);
75
+ setOrders(newOrders);
76
+ },
77
+ [orders, setOrders],
78
+ );
79
+
80
+ useEffect(() => {
81
+ setIsExpanded(orders.length > 0);
82
+ }, [orders]);
83
+
84
+ return (
85
+ <Tile
86
+ className={classNames(isTablet ? styles.tabletTile : styles.desktopTile, {
87
+ [styles.collapsedTile]: !isExpanded,
88
+ })}>
89
+ <div className={styles.container}>
90
+ <div className={styles.iconAndLabel}>
91
+ <LabIcon isTablet={isTablet} />
92
+ <h4 className={styles.heading}>{`${t('proceduresOrders', 'Procedures orders')} (${orders.length})`}</h4>
93
+ </div>
94
+ <div className={styles.buttonContainer}>
95
+ <Button
96
+ kind="ghost"
97
+ renderIcon={(props) => <Add size={16} {...props} />}
98
+ iconDescription="Add procedures order"
99
+ onClick={openNewProceduresForm}
100
+ size={isTablet ? 'md' : 'sm'}>
101
+ {t('add', 'Add')}
102
+ </Button>
103
+ <Button
104
+ className={styles.chevron}
105
+ hasIconOnly
106
+ kind="ghost"
107
+ renderIcon={(props) =>
108
+ isExpanded ? <ChevronUp size={16} {...props} /> : <ChevronDown size={16} {...props} />
109
+ }
110
+ iconDescription="View"
111
+ disabled={orders.length === 0}
112
+ onClick={() => setIsExpanded(!isExpanded)}>
113
+ {t('add', 'Add')}
114
+ </Button>
115
+ </div>
116
+ </div>
117
+ {isExpanded && (
118
+ <>
119
+ {orders.length > 0 && (
120
+ <>
121
+ {incompleteOrderBasketItems.length > 0 && (
122
+ <>
123
+ {incompleteOrderBasketItems.map((order) => (
124
+ <ProceduresOrderBasketItemTile
125
+ key={order.uuid}
126
+ orderBasketItem={order}
127
+ onItemClick={() => openEditProceduresForm(order)}
128
+ onRemoveClick={() => removeLabOrder(order)}
129
+ />
130
+ ))}
131
+ </>
132
+ )}
133
+ {newOrderBasketItems.length > 0 && (
134
+ <>
135
+ {newOrderBasketItems.map((order) => (
136
+ <ProceduresOrderBasketItemTile
137
+ key={order.uuid}
138
+ orderBasketItem={order}
139
+ onItemClick={() => openEditProceduresForm(order)}
140
+ onRemoveClick={() => removeLabOrder(order)}
141
+ />
142
+ ))}
143
+ </>
144
+ )}
145
+
146
+ {renewedOrderBasketItems.length > 0 && (
147
+ <>
148
+ {renewedOrderBasketItems.map((order) => (
149
+ <ProceduresOrderBasketItemTile
150
+ key={order.uuid}
151
+ orderBasketItem={order}
152
+ onItemClick={() => openEditProceduresForm(order)}
153
+ onRemoveClick={() => removeLabOrder(order)}
154
+ />
155
+ ))}
156
+ </>
157
+ )}
158
+
159
+ {revisedOrderBasketItems.length > 0 && (
160
+ <>
161
+ {revisedOrderBasketItems.map((order) => (
162
+ <ProceduresOrderBasketItemTile
163
+ key={order.uuid}
164
+ orderBasketItem={order}
165
+ onItemClick={() => openEditProceduresForm(order)}
166
+ onRemoveClick={() => removeLabOrder(order)}
167
+ />
168
+ ))}
169
+ </>
170
+ )}
171
+
172
+ {discontinuedOrderBasketItems.length > 0 && (
173
+ <>
174
+ {discontinuedOrderBasketItems.map((order) => (
175
+ <ProceduresOrderBasketItemTile
176
+ key={order.uuid}
177
+ orderBasketItem={order}
178
+ onItemClick={() => openEditProceduresForm(order)}
179
+ onRemoveClick={() => removeLabOrder(order)}
180
+ />
181
+ ))}
182
+ </>
183
+ )}
184
+ </>
185
+ )}
186
+ </>
187
+ )}
188
+ </Tile>
189
+ );
190
+ }
@@ -0,0 +1,74 @@
1
+ @use '@carbon/styles/scss/spacing';
2
+ @use '@carbon/styles/scss/type';
3
+ @use '@openmrs/esm-styleguide/src/vars' as vars;
4
+
5
+ .desktopTile {
6
+ border-left: 4px solid #ffe9bd;
7
+ background-color: vars.$ui-02;
8
+ border-top: 1px solid #fbf2e1;
9
+ border-right: none;
10
+ padding: 0;
11
+ }
12
+
13
+ .tabletTile {
14
+ @extend .desktopTile;
15
+ border-top: 1px solid #fdeccb;
16
+ }
17
+
18
+ .collapsedTile {
19
+ border-bottom: none;
20
+ min-height: 0;
21
+
22
+ .orderBasketHeader {
23
+ margin-bottom: 0;
24
+ }
25
+ }
26
+
27
+ .tabletTile.collapsedTile {
28
+ border-bottom: 1px solid vars.$grey-2;
29
+ }
30
+
31
+ .container {
32
+ background-color: vars.$ui-02;
33
+ display: flex;
34
+ justify-content: space-between;
35
+ align-items: center;
36
+ text-align: left;
37
+ }
38
+
39
+ .desktopTile .container {
40
+ h4 {
41
+ @include type.type-style('heading-compact-02');
42
+ color: vars.$text-02;
43
+ }
44
+ }
45
+
46
+ .tabletTile .container {
47
+ padding: spacing.$spacing-03;
48
+
49
+ h4 {
50
+ @include type.type-style('heading-03');
51
+ color: vars.$ui-05;
52
+ }
53
+ }
54
+
55
+ .heading {
56
+ margin-left: spacing.$spacing-03;
57
+ }
58
+
59
+ .iconAndLabel {
60
+ display: flex;
61
+ align-items: center;
62
+ margin: spacing.$spacing-03;
63
+ }
64
+
65
+ .buttonContainer {
66
+ display: flex;
67
+ align-items: center;
68
+ }
69
+
70
+ .chevron {
71
+ svg {
72
+ fill: black;
73
+ }
74
+ }
@@ -0,0 +1,55 @@
1
+ @use '@carbon/styles/scss/spacing';
2
+ @use '@openmrs/esm-styleguide/src/vars' as vars;
3
+
4
+ .container {
5
+ display: flex;
6
+ flex-direction: column;
7
+ justify-content: space-between;
8
+ height: calc(100vh - 9rem);
9
+ }
10
+
11
+ .orderBasketContainer {
12
+ margin: spacing.$spacing-05;
13
+ }
14
+
15
+ .orderBasketContainer :global(.cds--btn-set .cds--btn) {
16
+ max-width: 50%;
17
+ height: 4rem;
18
+ }
19
+
20
+ .spinner :global(.cds--loading__stroke) {
21
+ stroke: var(--brand-03);
22
+ }
23
+
24
+ .activeMedicationsContainer {
25
+ border: 1px solid vars.$ui-03;
26
+ }
27
+
28
+ .tablet {
29
+ padding: 1.5rem 1rem;
30
+ background-color: vars.$ui-02;
31
+ }
32
+
33
+ .desktop {
34
+ padding: 0rem;
35
+ }
36
+
37
+ .button {
38
+ height: 4rem;
39
+ display: flex;
40
+ align-content: flex-start;
41
+ align-items: baseline;
42
+ min-width: 50%;
43
+ }
44
+
45
+ .loader {
46
+ display: flex;
47
+ justify-content: center;
48
+ align-items: center;
49
+ min-height: 100vh;
50
+ }
51
+
52
+ .inlineNotification,
53
+ .actionNotification {
54
+ max-width: unset !important;
55
+ }
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+ import { Calendar, Location } from '@carbon/react/icons';
4
+ import { useSession, formatDate } from '@openmrs/esm-framework';
5
+ import ProcedureIllustration from './procedure-illustration.component';
6
+ import styles from './procedure-header.scss';
7
+
8
+ export const ProcedureHeader: React.FC = () => {
9
+ const { t } = useTranslation();
10
+ const userSession = useSession();
11
+ const userLocation = userSession?.sessionLocation?.display;
12
+
13
+ return (
14
+ <div className={styles.header}>
15
+ <div className={styles['left-justified-items']}>
16
+ <ProcedureIllustration />
17
+ <div className={styles['page-labels']}>
18
+ <p className={styles['page-name']}>{t('procedure', 'Procedures')}</p>
19
+ </div>
20
+ </div>
21
+ <div className={styles['right-justified-items']}>
22
+ <div className={styles['date-and-location']}>
23
+ <Location size={16} />
24
+ <span className={styles.value}>{userLocation}</span>
25
+ <span className={styles.middot}>&middot;</span>
26
+ <Calendar size={16} />
27
+ <span className={styles.value}>{formatDate(new Date(), { mode: 'standard' })}</span>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ );
32
+ };
@@ -0,0 +1,70 @@
1
+ @use '@carbon/styles/scss/spacing';
2
+ @use '@carbon/styles/scss/type';
3
+ @use '@openmrs/esm-styleguide/src/vars' as vars;
4
+
5
+ .header {
6
+ @include type.type-style('body-compact-02');
7
+ color: vars.$text-02;
8
+ height: spacing.$spacing-12;
9
+ background-color: vars.$ui-02;
10
+ border: 1px solid vars.$ui-03;
11
+ border-left: 0px;
12
+ display: flex;
13
+ justify-content: space-between;
14
+ }
15
+
16
+ .left-justified-items {
17
+ display: flex;
18
+ flex-direction: row;
19
+ align-items: center;
20
+ margin-left: 0.75rem;
21
+ }
22
+
23
+ .right-justified-items {
24
+ @include type.type-style('body-compact-02');
25
+ color: vars.$text-02;
26
+ padding-top: 1rem;
27
+ }
28
+
29
+ .page-name {
30
+ @include type.type-style('heading-04');
31
+ }
32
+
33
+ .page-labels {
34
+ margin-left: 1rem;
35
+
36
+ p:first-of-type {
37
+ margin-bottom: 0.25rem;
38
+ }
39
+ }
40
+
41
+ .date-and-location {
42
+ display: flex;
43
+ justify-content: flex-end;
44
+ align-items: center;
45
+ margin-right: 1rem;
46
+ }
47
+
48
+ .value {
49
+ margin-left: 0.25rem;
50
+ }
51
+
52
+ .middot {
53
+ margin: 0 0.5rem;
54
+ }
55
+
56
+ .view {
57
+ @include type.type-style('label-01');
58
+ }
59
+
60
+ svg.iconOverrides {
61
+ width: 72 !important;
62
+ height: 72 !important;
63
+ fill: var(--brand-03);
64
+ }
65
+
66
+ .svgContainer svg {
67
+ width: 72px;
68
+ height: 72px;
69
+ fill: var(--brand-03);
70
+ }
@@ -0,0 +1,52 @@
1
+ import React from 'react';
2
+ // import { WatsonHealthScalpelSelect } from "@carbon/react/icons";
3
+ // import styles from "./procedure-header.scss";
4
+
5
+ const ProcedureIllustration: React.FC = () => {
6
+ return (
7
+ <svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg">
8
+ <g clip-path="url(#clip0_37_2293)">
9
+ <path
10
+ fill-rule="evenodd"
11
+ clip-rule="evenodd"
12
+ d="M64.8633 16.1368C63.1494 14.4994 60.8703 13.5858 58.5 13.5858C56.1298 13.5858 53.8507 14.4994 52.1368 16.1368L0.772461 67.5H21.5751C23.0531 67.5038 24.5172 67.2145 25.8827 66.6488C27.2482 66.0831 28.4879 65.2522 29.5302 64.2042L64.8633 28.8632C65.6992 28.0277 66.3623 27.0358 66.8148 25.9439C67.2672 24.8521 67.5001 23.6818 67.5001 22.5C67.5001 21.3181 67.2672 20.1479 66.8148 19.056C66.3623 17.9642 65.6992 16.9722 64.8633 16.1368ZM32.3523 42.2838L27.6588 46.9771L34.0254 53.3439L38.7183 48.6499L32.3523 42.2838ZM24.1592 62.4889C24.9784 62.1494 25.7221 61.651 26.3475 61.0225L30.8446 56.5263L24.4771 50.1588L11.6357 63H21.5751C22.4618 63.002 23.3401 62.8283 24.1592 62.4889ZM41.8989 45.468L51.7899 35.5748L61.6809 25.6817C62.0988 25.2639 62.4303 24.7679 62.6565 24.222C62.8827 23.6761 62.9991 23.0909 62.9991 22.5C62.9991 21.9091 62.8827 21.3239 62.6565 20.778C62.4303 20.2321 62.0988 19.736 61.6809 19.3183C60.8238 18.4997 59.6843 18.0429 58.4991 18.0429C57.314 18.0429 56.1744 18.4997 55.3174 19.3183L35.5329 39.1023L41.8989 45.468Z"
13
+ fill="#7BBCB9"
14
+ />
15
+ <path
16
+ d="M26.3475 61.0225C25.7221 61.651 24.9784 62.1494 24.1592 62.4889C23.3401 62.8283 22.4618 63.002 21.5751 63H11.6357L24.4771 50.1588L30.8446 56.5263L26.3475 61.0225Z"
17
+ fill="#BCDDDB"
18
+ />
19
+ <path d="M27.6588 46.9771L32.3523 42.2838L38.7183 48.6499L34.0254 53.3439L27.6588 46.9771Z" fill="#BCDDDB" />
20
+ <path
21
+ d="M61.6809 25.6817L51.7899 35.5748L41.8989 45.468L35.5329 39.1023L55.3174 19.3183C56.1744 18.4997 57.314 18.0429 58.4991 18.0429C59.6843 18.0429 60.8238 18.4997 61.6809 19.3183C62.0988 19.736 62.4303 20.2321 62.6565 20.778C62.8827 21.3239 62.9991 21.9091 62.9991 22.5C62.9991 23.0909 62.8827 23.6761 62.6565 24.222C62.4303 24.7679 62.0988 25.2639 61.6809 25.6817Z"
22
+ fill="#BCDDDB"
23
+ />
24
+ <path
25
+ d="M11.2502 13.5C10.8052 13.5 10.3702 13.3681 10.0002 13.1208C9.6302 12.8736 9.34181 12.5222 9.17152 12.1111C9.00122 11.6999 8.95666 11.2475 9.04348 10.8111C9.1303 10.3746 9.34459 9.97371 9.65926 9.65904C9.97392 9.34437 10.3748 9.13008 10.8113 9.04326C11.2478 8.95645 11.7002 9.001 12.1113 9.1713C12.5224 9.3416 12.8738 9.62999 13.1211 10C13.3683 10.37 13.5002 10.805 13.5002 11.25C13.4998 11.8466 13.2626 12.4186 12.8407 12.8405C12.4189 13.2623 11.8468 13.4996 11.2502 13.5Z"
26
+ fill="#BCDDDB"
27
+ />
28
+ <path
29
+ d="M11.2502 36C10.8052 36 10.3702 35.8681 10.0002 35.6208C9.6302 35.3736 9.34181 35.0222 9.17152 34.6111C9.00122 34.1999 8.95666 33.7475 9.04348 33.3111C9.1303 32.8746 9.34459 32.4737 9.65926 32.159C9.97392 31.8444 10.3748 31.6301 10.8113 31.5433C11.2478 31.4564 11.7002 31.501 12.1113 31.6713C12.5224 31.8416 12.8738 32.13 13.1211 32.5C13.3683 32.87 13.5002 33.305 13.5002 33.75C13.4998 34.3466 13.2626 34.9186 12.8407 35.3405C12.4189 35.7623 11.8468 35.9996 11.2502 36Z"
30
+ fill="#BCDDDB"
31
+ />
32
+ <path
33
+ d="M33.7502 13.5C33.3052 13.5 32.8702 13.3681 32.5002 13.1208C32.1302 12.8736 31.8418 12.5222 31.6715 12.1111C31.5012 11.6999 31.4567 11.2475 31.5435 10.8111C31.6303 10.3746 31.8446 9.97371 32.1593 9.65904C32.4739 9.34437 32.8748 9.13008 33.3113 9.04326C33.7478 8.95645 34.2002 9.001 34.6113 9.1713C35.0224 9.3416 35.3738 9.62999 35.6211 10C35.8683 10.37 36.0002 10.805 36.0002 11.25C35.9998 11.8466 35.7626 12.4186 35.3407 12.8405C34.9189 13.2623 34.3468 13.4996 33.7502 13.5Z"
34
+ fill="#BCDDDB"
35
+ />
36
+ <path
37
+ fill-rule="evenodd"
38
+ clip-rule="evenodd"
39
+ d="M33.7502 4.50003C32.3589 4.50424 31.0029 4.93906 29.8686 5.74479C28.7342 6.55052 27.8771 7.68765 27.4149 9.00003H17.5853C17.2079 7.92599 16.5642 6.96521 15.7146 6.20748C14.8649 5.44975 13.837 4.91983 12.727 4.66726C11.6169 4.41468 10.4609 4.44769 9.36706 4.7632C8.27322 5.07872 7.27723 5.66644 6.47221 6.47141C5.66719 7.27639 5.07942 8.27234 4.76385 9.36617C4.44828 10.46 4.41521 11.616 4.66773 12.7261C4.92025 13.8361 5.45011 14.8641 6.20779 15.7138C6.96548 16.5634 7.92623 17.2071 9.00025 17.5847V27.4143C7.49901 27.945 6.23375 28.9894 5.42808 30.3628C4.6224 31.7363 4.3282 33.3503 4.59746 34.9197C4.86672 36.489 5.68211 37.9127 6.89951 38.939C8.11692 39.9653 9.65795 40.5282 11.2502 40.5282C12.8425 40.5282 14.3836 39.9653 15.601 38.939C16.8184 37.9127 17.6338 36.489 17.903 34.9197C18.1723 33.3503 17.8781 31.7363 17.0724 30.3628C16.2667 28.9894 15.0015 27.945 13.5002 27.4143V17.5858C14.4414 17.2501 15.2962 16.7094 16.0027 16.0028C16.7093 15.2961 17.2498 14.4413 17.5853 13.5H27.4147C27.8293 14.6634 28.5557 15.6905 29.5145 16.469C30.4733 17.2475 31.6277 17.7475 32.8515 17.9144C34.0752 18.0813 35.3213 17.9086 36.4535 17.4152C37.5858 16.9218 38.5606 16.1267 39.2716 15.1167C39.9825 14.1068 40.4022 12.9209 40.4848 11.6886C40.5673 10.4562 40.3096 9.22493 39.7398 8.12918C39.1699 7.03343 38.3098 6.11538 37.2535 5.47534C36.1972 4.83531 34.9853 4.49792 33.7502 4.50003ZM10.0002 35.6208C10.3702 35.8681 10.8052 36 11.2502 36C11.8468 35.9996 12.4189 35.7623 12.8407 35.3405C13.2626 34.9186 13.4998 34.3466 13.5002 33.75C13.5002 33.305 13.3683 32.87 13.1211 32.5C12.8738 32.13 12.5224 31.8416 12.1113 31.6713C11.7002 31.501 11.2478 31.4564 10.8113 31.5433C10.3748 31.6301 9.97392 31.8444 9.65926 32.159C9.34459 32.4737 9.1303 32.8746 9.04348 33.3111C8.95666 33.7475 9.00122 34.1999 9.17152 34.6111C9.34181 35.0222 9.6302 35.3736 10.0002 35.6208ZM10.0002 13.1208C10.3702 13.3681 10.8052 13.5 11.2502 13.5C11.8468 13.4996 12.4189 13.2623 12.8407 12.8405C13.2626 12.4186 13.4998 11.8466 13.5002 11.25C13.5002 10.805 13.3683 10.37 13.1211 10C12.8738 9.62999 12.5224 9.3416 12.1113 9.1713C11.7002 9.001 11.2478 8.95645 10.8113 9.04326C10.3748 9.13008 9.97392 9.34437 9.65926 9.65904C9.34459 9.97371 9.1303 10.3746 9.04348 10.8111C8.95666 11.2475 9.00122 11.6999 9.17152 12.1111C9.34181 12.5222 9.6302 12.8736 10.0002 13.1208ZM32.5002 13.1208C32.8702 13.3681 33.3052 13.5 33.7502 13.5C34.3468 13.4996 34.9189 13.2623 35.3407 12.8405C35.7626 12.4186 35.9998 11.8466 36.0002 11.25C36.0002 10.805 35.8683 10.37 35.6211 10C35.3738 9.62999 35.0224 9.3416 34.6113 9.1713C34.2002 9.001 33.7478 8.95645 33.3113 9.04326C32.8748 9.13008 32.4739 9.34437 32.1593 9.65904C31.8446 9.97371 31.6303 10.3746 31.5435 10.8111C31.4567 11.2475 31.5012 11.6999 31.6715 12.1111C31.8418 12.5222 32.1302 12.8736 32.5002 13.1208Z"
40
+ fill="#7BBCB9"
41
+ />
42
+ </g>
43
+ <defs>
44
+ <clipPath id="clip0_37_2293">
45
+ <rect width="72" height="72" fill="white" />
46
+ </clipPath>
47
+ </defs>
48
+ </svg>
49
+ );
50
+ };
51
+
52
+ export default ProcedureIllustration;
@@ -0,0 +1,70 @@
1
+ import { type ConfigObject, openmrsFetch, useAppContext, useConfig } from '@openmrs/esm-framework';
2
+ import useSWR from 'swr';
3
+ import { ProcedureConceptClass_UUID } from '../constants';
4
+ import { type DateFilterContext, type Result } from '../types';
5
+ import dayjs from 'dayjs';
6
+ export function useOrdersWorklist(activatedOnOrAfterDate: string, fulfillerStatus: string) {
7
+ const config = useConfig() as ConfigObject;
8
+ const { dateRange } = useAppContext<DateFilterContext>('procedures-date-filter') ?? {
9
+ dateRange: [dayjs().startOf('day').toDate(), new Date()],
10
+ };
11
+
12
+ const responseFormat =
13
+ 'custom:(uuid,orderNumber,patient:(uuid,display,identifiers,person:(uuid,display,age,gender)),concept:(uuid,display,conceptClass),action,careSetting,orderer:(uuid,display),urgency,instructions,bodySite,laterality,commentToFulfiller,procedures,display,fulfillerStatus,dateStopped,scheduledDate,dateActivated,fulfillerComment)';
14
+ const orderTypeParam = `orderTypes=${config.procedureOrderTypeUuid}&activatedOnOrAfterDate=${dateRange
15
+ .at(0)
16
+ .toISOString()}&activatedOnOrBeforeDate=${dateRange
17
+ .at(1)
18
+ .toISOString()}&isStopped=false&fulfillerStatus=${fulfillerStatus}&v=${responseFormat}`;
19
+ const apiUrl = `/ws/rest/v1/order?${orderTypeParam}`;
20
+
21
+ const { data, error, isLoading } = useSWR<{ data: { results: Array<Result> } }, Error>(apiUrl, openmrsFetch);
22
+
23
+ const orders = data?.data?.results?.filter((order) => {
24
+ if (fulfillerStatus === '') {
25
+ return (
26
+ order.fulfillerStatus === null &&
27
+ order.dateStopped === null &&
28
+ order.action === 'NEW' &&
29
+ order.concept.conceptClass.uuid === ProcedureConceptClass_UUID
30
+ );
31
+ } else if (fulfillerStatus === 'IN_PROGRESS') {
32
+ return (
33
+ order.fulfillerStatus === 'IN_PROGRESS' &&
34
+ order.dateStopped === null &&
35
+ order.action !== 'DISCONTINUE' &&
36
+ order.concept.conceptClass.uuid === ProcedureConceptClass_UUID
37
+ );
38
+ } else if (fulfillerStatus === 'COMPLETED') {
39
+ return (
40
+ order.fulfillerStatus === 'COMPLETED' &&
41
+ order.dateStopped === null &&
42
+ order.action !== 'DISCONTINUE' &&
43
+ order.concept.conceptClass.uuid === ProcedureConceptClass_UUID
44
+ );
45
+ } else if (fulfillerStatus === 'EXCEPTION') {
46
+ return (
47
+ order.fulfillerStatus === 'EXCEPTION' &&
48
+ order.dateStopped === null &&
49
+ order.action !== 'DISCONTINUE' &&
50
+ order.concept.conceptClass.uuid === ProcedureConceptClass_UUID
51
+ );
52
+ } else if (fulfillerStatus === 'DECLINED') {
53
+ return (
54
+ order.fulfillerStatus === 'DECLINED' &&
55
+ order.dateStopped === null &&
56
+ order.action !== 'DISCONTINUE' &&
57
+ order.concept.conceptClass.uuid === ProcedureConceptClass_UUID
58
+ );
59
+ }
60
+ });
61
+ const sortedOrders = orders?.sort(
62
+ (a, b) => new Date(a.dateActivated).getTime() - new Date(b.dateActivated).getTime(),
63
+ );
64
+
65
+ return {
66
+ workListEntries: sortedOrders?.length > 0 ? sortedOrders : [],
67
+ isLoading,
68
+ isError: error,
69
+ };
70
+ }
@@ -0,0 +1,22 @@
1
+ import { useMemo } from 'react';
2
+ import { type GroupedOrders } from '../types';
3
+
4
+ export function useSearchGroupedResults(data: Array<GroupedOrders>, searchString: string) {
5
+ const searchResults = useMemo(() => {
6
+ if (searchString && searchString.trim() !== '') {
7
+ // Normalize the search string to lowercase
8
+ const lowerSearchString = searchString.toLowerCase();
9
+ return data.filter((orderGroup) =>
10
+ orderGroup.orders.some(
11
+ (order) =>
12
+ order.orderNumber.toLowerCase().includes(lowerSearchString) ||
13
+ order.patient.display.toLowerCase().includes(lowerSearchString),
14
+ ),
15
+ );
16
+ }
17
+
18
+ return data;
19
+ }, [searchString, data]);
20
+
21
+ return searchResults;
22
+ }
@@ -0,0 +1,39 @@
1
+ import { formatDate, parseDate } from '@openmrs/esm-framework';
2
+ import { useMemo } from 'react';
3
+ import { type Result } from '../types';
4
+
5
+ export function useSearchResults(data: Result[], searchString: string) {
6
+ const flattenedData = data.map((eachObject) => {
7
+ return {
8
+ ...eachObject,
9
+ id: eachObject.uuid,
10
+ date: formatDate(parseDate(eachObject.dateActivated)),
11
+ patient: eachObject.patient.display.split('-')[1],
12
+ orderNumber: eachObject.orderNumber,
13
+ accessionNumber: eachObject.accessionNumber,
14
+ procedure: eachObject.concept.display,
15
+ action: eachObject.action,
16
+ status: eachObject.fulfillerStatus ?? '--',
17
+ orderer: eachObject.orderer.display,
18
+ urgency: eachObject.urgency,
19
+ };
20
+ });
21
+
22
+ const searchResults = useMemo(() => {
23
+ if (searchString && searchString.trim() !== '') {
24
+ const search = searchString.toLowerCase();
25
+ return flattenedData.filter((eachDataRow) =>
26
+ Object.entries(eachDataRow).some(([header, value]) => {
27
+ if (header === 'patientUuid') {
28
+ return false;
29
+ }
30
+ return `${value}`.toLowerCase().includes(search);
31
+ }),
32
+ );
33
+ }
34
+
35
+ return flattenedData;
36
+ }, [searchString, data]);
37
+
38
+ return searchResults;
39
+ }
package/src/index.ts ADDED
@@ -0,0 +1,59 @@
1
+ import { getAsyncLifecycle, defineConfigSchema, getSyncLifecycle, translateFrom } from '@openmrs/esm-framework';
2
+ import { configSchema } from './config-schema';
3
+ import { createLeftPanelLink } from './left-panel-link';
4
+ import workListProcedures from './procedure-tabs/work-list-tab.component';
5
+ import referredProcedures from './procedure-tabs/referred-tab.component';
6
+ import completedProcedures from './procedure-tabs/completed-tab.component';
7
+ import notDoneProcedures from './procedure-tabs/not-done-tab.component';
8
+ import addProcedureToWorklistDialog from './procedures-ordered/pick-procedure-order/add-to-worklist-dialog.component';
9
+ import procedureInstructionsModal from './procedures-ordered/procedure-instructions/procedure-instructions.component';
10
+ import ProceduresOrderBasketPanelExtension from './form/procedures-orders/procedures-order-basket-panel/procedures-order-basket-panel.extension';
11
+ import rejectProcedureOrderDialog from './procedures-ordered/reject-order-dialog/reject-procedure-order-dialog.component';
12
+ import procedureRejectReasonModal from './procedures-ordered/reject-reason/procedure-reject-reason.component';
13
+ import PostProcedureForm from './form/post-procedures/post-procedure-form.component';
14
+ import PrintPreviewModal from './print/print-procedure-results.component';
15
+
16
+ const moduleName = '@thrustdevs/esm-procedure-orders-app';
17
+
18
+ const options = {
19
+ featureName: 'esm-procedure-orders-app',
20
+ moduleName,
21
+ };
22
+
23
+ export const importTranslation = require.context('../translations', false, /.json$/, 'lazy');
24
+
25
+ export function startupApp() {
26
+ defineConfigSchema(moduleName, configSchema);
27
+ }
28
+
29
+ export const root = getAsyncLifecycle(() => import('./root.component'), options);
30
+
31
+ export const procedureDashboardLink = getSyncLifecycle(
32
+ createLeftPanelLink({
33
+ name: 'procedure',
34
+ title: 'Procedures',
35
+ }),
36
+ options,
37
+ );
38
+
39
+ // Modals
40
+ export const rejectProcedureOrderDialogComponent = getSyncLifecycle(rejectProcedureOrderDialog, options);
41
+
42
+ export const worklistProceduresTabComponent = getSyncLifecycle(workListProcedures, options);
43
+
44
+ export const referredProceduresTabComponent = getSyncLifecycle(referredProcedures, options);
45
+ export const completedProceduresTabComponent = getSyncLifecycle(completedProcedures, options);
46
+ export const notDoneProceduresTabComponent = getSyncLifecycle(notDoneProcedures, options);
47
+ export const procedureInstructionsModalComponent = getSyncLifecycle(procedureInstructionsModal, options);
48
+ export const procedureRejectModalComponent = getSyncLifecycle(procedureRejectReasonModal, options);
49
+ export const addProcedureToWorklistDialogComponent = getSyncLifecycle(addProcedureToWorklistDialog, options);
50
+
51
+ export const proceduresOrderPanel = getSyncLifecycle(ProceduresOrderBasketPanelExtension, options);
52
+ export const postProcedureResults = getSyncLifecycle(PostProcedureForm, options);
53
+ export const printProcedureReportModal = getSyncLifecycle(PrintPreviewModal, options);
54
+
55
+ // t('addProcedureOrderWorkspaceTitle', 'Add procedure order')
56
+ export const addProceduresOrderWorkspace = getAsyncLifecycle(
57
+ () => import('./form/procedures-orders/add-procedures-order/add-procedures-order.workspace'),
58
+ options,
59
+ );