@kenyaemr/esm-express-workflow-app 5.4.4-pre.43 → 5.4.4-pre.430

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 (627) hide show
  1. package/.turbo/turbo-build.log +14 -7
  2. package/dist/1084.js +1 -0
  3. package/dist/1084.js.map +1 -0
  4. package/dist/1278.js +1 -0
  5. package/dist/1278.js.map +1 -0
  6. package/dist/1324.js +1 -0
  7. package/dist/1324.js.map +1 -0
  8. package/dist/1375.js +66 -0
  9. package/dist/1375.js.map +1 -0
  10. package/dist/1402.js +1 -0
  11. package/dist/1402.js.map +1 -0
  12. package/dist/1442.js +1 -0
  13. package/dist/1442.js.map +1 -0
  14. package/dist/1520.js +1 -0
  15. package/dist/1520.js.map +1 -0
  16. package/dist/1559.js +1 -0
  17. package/dist/1559.js.map +1 -0
  18. package/dist/1593.js +1 -0
  19. package/dist/1593.js.map +1 -0
  20. package/dist/162.js +1 -0
  21. package/dist/162.js.map +1 -0
  22. package/dist/1620.js +1 -0
  23. package/dist/1620.js.map +1 -0
  24. package/dist/1658.js +1 -0
  25. package/dist/1658.js.map +1 -0
  26. package/dist/1659.js +1 -0
  27. package/dist/1659.js.map +1 -0
  28. package/dist/1789.js +1 -0
  29. package/dist/1789.js.map +1 -0
  30. package/dist/1827.js +1 -0
  31. package/dist/1827.js.map +1 -0
  32. package/dist/1831.js +1 -0
  33. package/dist/1831.js.map +1 -0
  34. package/dist/1854.js +1 -0
  35. package/dist/1854.js.map +1 -0
  36. package/dist/196.js +1 -0
  37. package/dist/196.js.map +1 -0
  38. package/dist/2127.js +1 -0
  39. package/dist/2127.js.map +1 -0
  40. package/dist/2152.js +1 -0
  41. package/dist/2152.js.map +1 -0
  42. package/dist/2202.js +1 -0
  43. package/dist/2202.js.map +1 -0
  44. package/dist/221.js +1 -0
  45. package/dist/221.js.map +1 -0
  46. package/dist/2269.js +1 -0
  47. package/dist/2269.js.map +1 -0
  48. package/dist/2293.js +1 -0
  49. package/dist/2293.js.map +1 -0
  50. package/dist/234.js +1 -0
  51. package/dist/234.js.map +1 -0
  52. package/dist/2412.js +1 -1
  53. package/dist/2412.js.map +1 -1
  54. package/dist/2466.js +1 -0
  55. package/dist/2466.js.map +1 -0
  56. package/dist/2534.js +1 -1
  57. package/dist/2534.js.map +1 -1
  58. package/dist/2553.js +1 -0
  59. package/dist/2553.js.map +1 -0
  60. package/dist/2556.js +1 -0
  61. package/dist/2556.js.map +1 -0
  62. package/dist/2648.js +1 -0
  63. package/dist/2648.js.map +1 -0
  64. package/dist/274.js +1 -0
  65. package/dist/274.js.map +1 -0
  66. package/dist/2788.js +1 -0
  67. package/dist/2788.js.map +1 -0
  68. package/dist/2842.js +1 -0
  69. package/dist/2842.js.map +1 -0
  70. package/dist/2874.js +1 -0
  71. package/dist/2874.js.map +1 -0
  72. package/dist/2916.js +1 -0
  73. package/dist/2916.js.map +1 -0
  74. package/dist/2947.js +1 -1
  75. package/dist/2947.js.map +1 -1
  76. package/dist/3012.js +1 -0
  77. package/dist/3012.js.map +1 -0
  78. package/dist/3087.js +1 -0
  79. package/dist/3087.js.map +1 -0
  80. package/dist/3335.js +1 -0
  81. package/dist/3335.js.map +1 -0
  82. package/dist/3378.js +1 -0
  83. package/dist/3378.js.map +1 -0
  84. package/dist/3504.js +1 -0
  85. package/dist/3504.js.map +1 -0
  86. package/dist/3509.js +1 -1
  87. package/dist/3509.js.map +1 -1
  88. package/dist/356.js +1 -0
  89. package/dist/356.js.map +1 -0
  90. package/dist/3690.js +1 -0
  91. package/dist/3690.js.map +1 -0
  92. package/dist/371.js +1 -0
  93. package/dist/371.js.map +1 -0
  94. package/dist/3747.js +1 -0
  95. package/dist/3747.js.map +1 -0
  96. package/dist/3819.js +1 -0
  97. package/dist/3819.js.map +1 -0
  98. package/dist/3820.js +1 -0
  99. package/dist/3820.js.map +1 -0
  100. package/dist/3910.js +1 -0
  101. package/dist/3910.js.map +1 -0
  102. package/dist/393.js +6 -0
  103. package/dist/393.js.map +1 -0
  104. package/dist/3933.js +1 -0
  105. package/dist/3933.js.map +1 -0
  106. package/dist/3989.js +1 -0
  107. package/dist/3989.js.map +1 -0
  108. package/dist/3995.js +1 -0
  109. package/dist/3995.js.map +1 -0
  110. package/dist/4032.js +1 -0
  111. package/dist/4032.js.map +1 -0
  112. package/dist/4145.js +1 -1
  113. package/dist/4145.js.map +1 -1
  114. package/dist/4178.js +1 -1
  115. package/dist/4178.js.map +1 -1
  116. package/dist/4191.js +1 -0
  117. package/dist/4191.js.map +1 -0
  118. package/dist/4212.js +1 -0
  119. package/dist/4212.js.map +1 -0
  120. package/dist/4215.js +1 -0
  121. package/dist/4215.js.map +1 -0
  122. package/dist/4523.js +1 -0
  123. package/dist/4523.js.map +1 -0
  124. package/dist/4588.js +1 -0
  125. package/dist/4588.js.map +1 -0
  126. package/dist/4617.js +1 -0
  127. package/dist/4617.js.map +1 -0
  128. package/dist/466.js +1 -1
  129. package/dist/466.js.map +1 -1
  130. package/dist/4688.js +1 -0
  131. package/dist/{7288.js.map → 4688.js.map} +1 -1
  132. package/dist/470.js +1 -0
  133. package/dist/470.js.map +1 -0
  134. package/dist/4759.js +1 -0
  135. package/dist/4759.js.map +1 -0
  136. package/dist/4818.js +1 -1
  137. package/dist/4818.js.map +1 -1
  138. package/dist/5086.js +1 -1
  139. package/dist/5086.js.map +1 -1
  140. package/dist/5093.js +1 -0
  141. package/dist/5093.js.map +1 -0
  142. package/dist/5097.js +1 -0
  143. package/dist/5097.js.map +1 -0
  144. package/dist/510.js +1 -0
  145. package/dist/510.js.map +1 -0
  146. package/dist/5117.js +1 -0
  147. package/dist/5117.js.map +1 -0
  148. package/dist/5279.js +1 -0
  149. package/dist/5279.js.map +1 -0
  150. package/dist/5434.js +1 -0
  151. package/dist/5434.js.map +1 -0
  152. package/dist/5514.js +1 -0
  153. package/dist/5514.js.map +1 -0
  154. package/dist/5568.js +1 -0
  155. package/dist/5568.js.map +1 -0
  156. package/dist/5576.js +1 -1
  157. package/dist/5576.js.map +1 -1
  158. package/dist/5630.js +1 -0
  159. package/dist/5630.js.map +1 -0
  160. package/dist/5676.js +1 -1
  161. package/dist/5676.js.map +1 -1
  162. package/dist/5695.js +1 -0
  163. package/dist/5695.js.map +1 -0
  164. package/dist/5697.js +1 -1
  165. package/dist/5697.js.map +1 -1
  166. package/dist/5728.js +1 -0
  167. package/dist/5728.js.map +1 -0
  168. package/dist/5809.js +1 -1
  169. package/dist/5809.js.map +1 -1
  170. package/dist/585.js +1 -0
  171. package/dist/585.js.map +1 -0
  172. package/dist/5887.js +1 -0
  173. package/dist/5887.js.map +1 -0
  174. package/dist/5958.js +1 -0
  175. package/dist/5958.js.map +1 -0
  176. package/dist/5964.js +1 -0
  177. package/dist/5964.js.map +1 -0
  178. package/dist/6008.js +1 -0
  179. package/dist/602.js +1 -0
  180. package/dist/602.js.map +1 -0
  181. package/dist/6020.js +1 -0
  182. package/dist/6020.js.map +1 -0
  183. package/dist/6161.js +1 -0
  184. package/dist/6161.js.map +1 -0
  185. package/dist/6273.js +1 -0
  186. package/dist/6273.js.map +1 -0
  187. package/dist/6337.js +1 -0
  188. package/dist/6337.js.map +1 -0
  189. package/dist/6427.js +1 -1
  190. package/dist/6427.js.map +1 -1
  191. package/dist/6429.js +1 -0
  192. package/dist/6429.js.map +1 -0
  193. package/dist/6478.js +7 -0
  194. package/dist/6478.js.map +1 -0
  195. package/dist/6508.js +1 -0
  196. package/dist/6508.js.map +1 -0
  197. package/dist/6634.js +1 -0
  198. package/dist/6634.js.map +1 -0
  199. package/dist/6767.js +1 -0
  200. package/dist/6767.js.map +1 -0
  201. package/dist/6783.js +1 -0
  202. package/dist/6783.js.map +1 -0
  203. package/dist/6868.js +1 -1
  204. package/dist/6868.js.map +1 -1
  205. package/dist/688.js +1 -0
  206. package/dist/688.js.map +1 -0
  207. package/dist/689.js +1 -1
  208. package/dist/689.js.map +1 -1
  209. package/dist/694.js +1 -0
  210. package/dist/694.js.map +1 -0
  211. package/dist/6987.js +1 -0
  212. package/dist/6987.js.map +1 -0
  213. package/dist/7061.js +1 -0
  214. package/dist/7061.js.map +1 -0
  215. package/dist/7078.js +1 -0
  216. package/dist/7078.js.map +1 -0
  217. package/dist/710.js +1 -0
  218. package/dist/710.js.map +1 -0
  219. package/dist/7128.js +1 -0
  220. package/dist/7128.js.map +1 -0
  221. package/dist/7209.js +1 -0
  222. package/dist/7209.js.map +1 -0
  223. package/dist/7424.js +1 -0
  224. package/dist/7424.js.map +1 -0
  225. package/dist/770.js +1 -0
  226. package/dist/770.js.map +1 -0
  227. package/dist/7707.js +1 -0
  228. package/dist/7707.js.map +1 -0
  229. package/dist/7784.js +1 -0
  230. package/dist/7784.js.map +1 -0
  231. package/dist/781.js +1 -1
  232. package/dist/781.js.map +1 -1
  233. package/dist/7824.js +1 -0
  234. package/dist/7824.js.map +1 -0
  235. package/dist/7832.js +1 -0
  236. package/dist/7832.js.map +1 -0
  237. package/dist/8178.js +1 -0
  238. package/dist/8178.js.map +1 -0
  239. package/dist/820.js +1 -0
  240. package/dist/820.js.map +1 -0
  241. package/dist/8224.js +1 -0
  242. package/dist/8224.js.map +1 -0
  243. package/dist/8225.js +1 -0
  244. package/dist/8225.js.map +1 -0
  245. package/dist/8240.js +1 -1
  246. package/dist/8240.js.map +1 -1
  247. package/dist/8258.js +1 -0
  248. package/dist/8258.js.map +1 -0
  249. package/dist/8702.js +1 -0
  250. package/dist/8702.js.map +1 -0
  251. package/dist/8725.js +1 -0
  252. package/dist/8725.js.map +1 -0
  253. package/dist/8762.js +1 -0
  254. package/dist/8762.js.map +1 -0
  255. package/dist/8763.js +1 -0
  256. package/dist/8763.js.map +1 -0
  257. package/dist/8815.js +1 -0
  258. package/dist/8815.js.map +1 -0
  259. package/dist/8882.js +1 -0
  260. package/dist/8882.js.map +1 -0
  261. package/dist/8924.js +1 -1
  262. package/dist/8924.js.map +1 -1
  263. package/dist/8937.js +1 -0
  264. package/dist/8937.js.map +1 -0
  265. package/dist/9.js +1 -1
  266. package/dist/9.js.map +1 -1
  267. package/dist/9061.js +1 -0
  268. package/dist/9061.js.map +1 -0
  269. package/dist/9087.js +1 -0
  270. package/dist/9087.js.map +1 -0
  271. package/dist/9301.js +1 -0
  272. package/dist/9301.js.map +1 -0
  273. package/dist/9324.js +1 -0
  274. package/dist/9324.js.map +1 -0
  275. package/dist/9497.js +1 -0
  276. package/dist/9497.js.map +1 -0
  277. package/dist/9520.js +1 -1
  278. package/dist/9520.js.map +1 -1
  279. package/dist/9526.js +1 -0
  280. package/dist/9526.js.map +1 -0
  281. package/dist/9621.js +1 -0
  282. package/dist/9621.js.map +1 -0
  283. package/dist/9676.js +17 -0
  284. package/dist/9676.js.map +1 -0
  285. package/dist/977.js +1 -0
  286. package/dist/977.js.map +1 -0
  287. package/dist/9771.js +1 -0
  288. package/dist/9771.js.map +1 -0
  289. package/dist/9806.js +1 -0
  290. package/dist/9806.js.map +1 -0
  291. package/dist/989.js +1 -0
  292. package/dist/989.js.map +1 -0
  293. package/dist/kenyaemr-esm-express-workflow-app.js +6 -5
  294. package/dist/kenyaemr-esm-express-workflow-app.js.buildmanifest.json +1407 -809
  295. package/dist/kenyaemr-esm-express-workflow-app.js.map +1 -1
  296. package/dist/main.js +22 -5
  297. package/dist/main.js.map +1 -1
  298. package/dist/routes.json +1 -1
  299. package/package.json +4 -6
  300. package/src/components/admissions/admissions-dashboard.component.tsx +2 -2
  301. package/src/components/anaesthetic/anaesthetic-dashboard.meta.ts +8 -0
  302. package/src/components/anaesthetic/anaesthetic-data-form.component.tsx +442 -0
  303. package/src/components/anaesthetic/anaesthetic-data-form.scss +278 -0
  304. package/src/components/anaesthetic/anaesthetic-link.component.tsx +21 -0
  305. package/src/components/anaesthetic/anaesthetic.component.tsx +618 -0
  306. package/src/components/anaesthetic/anaesthetic.resource.ts +1503 -0
  307. package/src/components/anaesthetic/anaesthetic.scss +1885 -0
  308. package/src/components/anaesthetic/forms/anaesthetic-form.component.tsx +304 -0
  309. package/src/components/anaesthetic/forms/anaesthetic-record-form.component.tsx +707 -0
  310. package/src/components/anaesthetic/forms/icd11-diagnosis-search.component.tsx +178 -0
  311. package/src/components/anaesthetic/forms/icd11-diagnosis-search.scss +126 -0
  312. package/src/components/anaesthetic/forms/index.ts +2 -0
  313. package/src/components/anaesthetic/forms/interoperative-record-drug-given-form.component.tsx +231 -0
  314. package/src/components/anaesthetic/forms/post-operative-summary-form.component.tsx +171 -0
  315. package/src/components/anaesthetic/forms/time-picker-dropdown.component.tsx +202 -0
  316. package/src/components/anaesthetic/forms/time-picker-dropdown.scss +107 -0
  317. package/src/components/anaesthetic/forms/time-picker-with-clock.component.tsx +174 -0
  318. package/src/components/anaesthetic/forms/time-picker-with-clock.scss +178 -0
  319. package/src/components/anaesthetic/forms/useAnaestheticData.ts +16 -0
  320. package/src/components/anaesthetic/graphs/anaesthetic-graph-wrapper.component.tsx +266 -0
  321. package/src/components/anaesthetic/graphs/anaesthetic-graph.component.tsx +185 -0
  322. package/src/components/anaesthetic/graphs/index.ts +2 -0
  323. package/src/components/anaesthetic/graphs/interoperative-record-drug-given-graph-wrapper.component.tsx +197 -0
  324. package/src/components/anaesthetic/graphs/interoperative-record-drug-given-graph.component.tsx +93 -0
  325. package/src/components/anaesthetic/resources/anaesthetic-amniotic-fluid.resource.ts +277 -0
  326. package/src/components/anaesthetic/resources/anaesthetic-form.resource.ts +716 -0
  327. package/src/components/anaesthetic/resources/anaesthetic.resource.ts +378 -0
  328. package/src/components/anaesthetic/types/index.ts +1349 -0
  329. package/src/components/consultation/clinical-encounter/clinical-encounter.component.tsx +4 -20
  330. package/src/components/consultation/clinical-encounter/encounter-details.component.tsx +9 -9
  331. package/src/components/consultation/clinical-encounter/encounter-details.test.tsx +19 -18
  332. package/src/components/consultation/consultation.utils.tsx +1 -1
  333. package/src/components/consultation/dashboard.component.tsx +0 -2
  334. package/src/components/consultation/index.ts +1 -1
  335. package/src/components/consultation/tabs/index.ts +67 -0
  336. package/src/components/facility-dashboard/components/header/home-header.component.tsx +8 -13
  337. package/src/components/laboratory/index.ts +11 -0
  338. package/src/components/laboratory/lab-table.component.tsx +46 -12
  339. package/src/components/laboratory/laboratory-tabs.component.tsx +3 -17
  340. package/src/components/mch/dashboard.component.tsx +0 -2
  341. package/src/components/mch/mch.component.tsx +1 -3
  342. package/src/components/pharmacy/index.ts +1 -1
  343. package/src/components/pharmacy/orders/pharmacy-orders.component.tsx +44 -6
  344. package/src/components/pharmacy/orders/pharmacy-orders.test.tsx +8 -7
  345. package/src/components/pharmacy/pharmacy-tabs.component.tsx +4 -20
  346. package/src/components/pharmacy/tabs/index.ts +21 -0
  347. package/src/components/preauth/index.ts +22 -0
  348. package/src/components/preauth/preauth-dashboard.component.tsx +20 -0
  349. package/src/components/procedures/index.ts +16 -0
  350. package/src/components/procedures/procedure-queues/index.ts +13 -0
  351. package/src/components/procedures/procedure-queues/procedure-form-extras.component.tsx +33 -0
  352. package/src/components/procedures/procedure-queues/procedure-form-extras.scss +5 -0
  353. package/src/components/procedures/procedure-queues/procedure-queues.component.tsx +35 -0
  354. package/src/components/procedures/procedure-queues/procedure-queues.resources.ts +37 -0
  355. package/src/components/procedures/procedure-queues/procedure-room-tabs.component.tsx +80 -0
  356. package/src/components/procedures/procedure-queues/procedure-rooms.scss +13 -0
  357. package/src/components/procedures/procedure-queues/queue-procedure-tabs.component.tsx +34 -0
  358. package/src/components/procedures/procedure-queues/summary-cards.component.tsx +81 -0
  359. package/src/components/procedures/procedure-queues/summary-cards.scss +35 -0
  360. package/src/components/procedures/procedures-table.component.tsx +77 -19
  361. package/src/components/procedures/procedures-tabs.component.test.tsx +57 -0
  362. package/src/components/procedures/procedures-tabs.component.tsx +3 -18
  363. package/src/components/radiology-and-imaging/index.ts +11 -0
  364. package/src/components/radiology-and-imaging/radiology-and-imaging-table.component.tsx +73 -21
  365. package/src/components/radiology-and-imaging/radiology-and-imaging.component.tsx +3 -19
  366. package/src/components/registration/card/HIE-card/hie-card.component.tsx +32 -44
  367. package/src/components/registration/card/Local-card/local-card.component.tsx +22 -24
  368. package/src/components/registration/checkin-form-extra/checkin-form-extra.extension.tsx +8 -2
  369. package/src/components/registration/checkin-form-extra/queue-fields.component.tsx +18 -19
  370. package/src/components/registration/dependants/dependants.component.tsx +37 -60
  371. package/src/components/registration/dependants/dependants.resource.ts +75 -46
  372. package/src/components/registration/end-visit-modal/end-visit-dialog.modal.tsx +320 -0
  373. package/src/components/registration/end-visit-modal/end-visit-dialog.scss +12 -0
  374. package/src/components/registration/end-visit-modal/end-visit.resource.tsx +59 -0
  375. package/src/components/registration/end-visit-modal/sha-end-visit.resource.ts +285 -0
  376. package/src/components/registration/search-bar/search-bar.resource.ts +32 -93
  377. package/src/components/registration/start-visit-form/hooks/useDefaultFacilityLocation.tsx +15 -0
  378. package/src/components/registration/start-visit-form/hooks/useDefaultVisitLocation.tsx +24 -0
  379. package/src/components/registration/start-visit-form/hooks/useOfflineVisitType.tsx +18 -0
  380. package/src/components/registration/start-visit-form/hooks/useRecommendedVisitTypes.tsx +36 -0
  381. package/src/components/registration/start-visit-form/hooks/useVisitAttributeType.tsx +102 -0
  382. package/src/components/registration/start-visit-form/overflow-menu-extension/custom-end-active-visit.extension.tsx +44 -0
  383. package/src/components/registration/start-visit-form/overflow-menu-extension/overflow-menu-item.extension.tsx +67 -0
  384. package/src/components/registration/start-visit-form/overflow-menu-extension/overflow-menu-item.scss +3 -0
  385. package/src/components/registration/start-visit-form/start-visit-workspace/base-visit-type.component.tsx +126 -0
  386. package/src/components/registration/start-visit-form/start-visit-workspace/base-visit-type.scss +75 -0
  387. package/src/components/registration/start-visit-form/start-visit-workspace/exported-visit-form.workspace.tsx +778 -0
  388. package/src/components/registration/start-visit-form/start-visit-workspace/location-selector.component.tsx +86 -0
  389. package/src/components/registration/start-visit-form/start-visit-workspace/recommended-visit-type.component.tsx +32 -0
  390. package/src/components/registration/start-visit-form/start-visit-workspace/visit-attribute-type.component.tsx +257 -0
  391. package/src/components/registration/start-visit-form/start-visit-workspace/visit-attribute-type.scss +5 -0
  392. package/src/components/registration/start-visit-form/start-visit-workspace/visit-date-time.component.tsx +193 -0
  393. package/src/components/registration/start-visit-form/start-visit-workspace/visit-form.resource.ts +390 -0
  394. package/src/components/registration/start-visit-form/start-visit-workspace/visit-form.scss +144 -0
  395. package/src/components/registration/start-visit-form/visit-form-workspace/visit-form.workspace.tsx +48 -0
  396. package/src/components/registration/type/index.ts +101 -0
  397. package/src/components/reports/index.ts +1 -0
  398. package/src/components/triage/dashboard.component.tsx +0 -2
  399. package/src/config-schema.ts +476 -0
  400. package/src/hooks/useOrders.tsx +2 -2
  401. package/src/hooks/useServiceQueues.tsx +1 -1
  402. package/src/index.ts +81 -15
  403. package/src/routes.json +298 -32
  404. package/src/shared/dashboard-link/dashboard-link.component.tsx +11 -8
  405. package/src/shared/orders/OrderTable.scss +7 -0
  406. package/src/shared/orders/OrderTable.tsx +68 -8
  407. package/src/shared/orders/print-order/print-order.component.tsx +158 -0
  408. package/src/shared/orders/print-order/print-order.scss +225 -0
  409. package/src/shared/orders/print-prescription/print-prescription.component.tsx +65 -0
  410. package/src/shared/orders/print-prescription/print-prescription.resource.ts +45 -0
  411. package/src/shared/orders/print-prescription/print-prescription.scss +25 -0
  412. package/src/shared/otp-verification/index.ts +112 -29
  413. package/src/shared/otp-verification/otp-verification.modal.tsx +1110 -122
  414. package/src/shared/otp-verification/otp-verification.scss +374 -0
  415. package/src/shared/patient-chart/patient-summary-dashboard/patient-summary-dashboard.component.tsx +5 -84
  416. package/src/shared/pin-put/pinput.component.test.tsx +7 -6
  417. package/src/shared/tabs/create-tab-extension.tsx +33 -0
  418. package/src/shared/tabs/extension-tabs.component.tsx +51 -33
  419. package/src/shared/utils/index.ts +140 -5
  420. package/src/types/index.ts +12 -0
  421. package/translations/am.json +443 -131
  422. package/translations/en.json +327 -15
  423. package/translations/fr.json +372 -63
  424. package/translations/sw.json +347 -35
  425. package/tsconfig.json +1 -0
  426. package/dist/1049.js +0 -1
  427. package/dist/1049.js.map +0 -1
  428. package/dist/1072.js +0 -1
  429. package/dist/1072.js.map +0 -1
  430. package/dist/1091.js +0 -1
  431. package/dist/1091.js.map +0 -1
  432. package/dist/1172.js +0 -1
  433. package/dist/1172.js.map +0 -1
  434. package/dist/132.js +0 -1
  435. package/dist/132.js.map +0 -1
  436. package/dist/1354.js +0 -1
  437. package/dist/1354.js.map +0 -1
  438. package/dist/1704.js +0 -1
  439. package/dist/1704.js.map +0 -1
  440. package/dist/1729.js +0 -17
  441. package/dist/1729.js.map +0 -1
  442. package/dist/1757.js +0 -1
  443. package/dist/1757.js.map +0 -1
  444. package/dist/1761.js +0 -1
  445. package/dist/1761.js.map +0 -1
  446. package/dist/1809.js +0 -7
  447. package/dist/1809.js.map +0 -1
  448. package/dist/1842.js +0 -1
  449. package/dist/1874.js +0 -1
  450. package/dist/1874.js.map +0 -1
  451. package/dist/1962.js +0 -1
  452. package/dist/1962.js.map +0 -1
  453. package/dist/2007.js +0 -1
  454. package/dist/2007.js.map +0 -1
  455. package/dist/2024.js +0 -1
  456. package/dist/2024.js.map +0 -1
  457. package/dist/2045.js +0 -1
  458. package/dist/2045.js.map +0 -1
  459. package/dist/2163.js +0 -1
  460. package/dist/2163.js.map +0 -1
  461. package/dist/2191.js +0 -1
  462. package/dist/2191.js.map +0 -1
  463. package/dist/2267.js +0 -1
  464. package/dist/2267.js.map +0 -1
  465. package/dist/231.js +0 -1
  466. package/dist/231.js.map +0 -1
  467. package/dist/236.js +0 -1
  468. package/dist/236.js.map +0 -1
  469. package/dist/2367.js +0 -1
  470. package/dist/2367.js.map +0 -1
  471. package/dist/2463.js +0 -1
  472. package/dist/2463.js.map +0 -1
  473. package/dist/2561.js +0 -1
  474. package/dist/2561.js.map +0 -1
  475. package/dist/2810.js +0 -2
  476. package/dist/2810.js.map +0 -1
  477. package/dist/2867.js +0 -1
  478. package/dist/2867.js.map +0 -1
  479. package/dist/2909.js +0 -1
  480. package/dist/2909.js.map +0 -1
  481. package/dist/2949.js +0 -1
  482. package/dist/2949.js.map +0 -1
  483. package/dist/3040.js +0 -1
  484. package/dist/3119.js +0 -1
  485. package/dist/3119.js.map +0 -1
  486. package/dist/3215.js +0 -1
  487. package/dist/3215.js.map +0 -1
  488. package/dist/322.js +0 -1
  489. package/dist/322.js.map +0 -1
  490. package/dist/3228.js +0 -1
  491. package/dist/3228.js.map +0 -1
  492. package/dist/330.js +0 -1
  493. package/dist/330.js.map +0 -1
  494. package/dist/3472.js +0 -1
  495. package/dist/3472.js.map +0 -1
  496. package/dist/351.js +0 -1
  497. package/dist/351.js.map +0 -1
  498. package/dist/3576.js +0 -1
  499. package/dist/3576.js.map +0 -1
  500. package/dist/397.js +0 -1
  501. package/dist/397.js.map +0 -1
  502. package/dist/4007.js +0 -66
  503. package/dist/4007.js.map +0 -1
  504. package/dist/4200.js +0 -1
  505. package/dist/4200.js.map +0 -1
  506. package/dist/4224.js +0 -1
  507. package/dist/4224.js.map +0 -1
  508. package/dist/43.js +0 -1
  509. package/dist/43.js.map +0 -1
  510. package/dist/4308.js +0 -1
  511. package/dist/4308.js.map +0 -1
  512. package/dist/4399.js +0 -1
  513. package/dist/4399.js.map +0 -1
  514. package/dist/4505.js +0 -1
  515. package/dist/4505.js.map +0 -1
  516. package/dist/4724.js +0 -1
  517. package/dist/4724.js.map +0 -1
  518. package/dist/498.js +0 -1
  519. package/dist/498.js.map +0 -1
  520. package/dist/509.js +0 -1
  521. package/dist/509.js.map +0 -1
  522. package/dist/5096.js +0 -1
  523. package/dist/5096.js.map +0 -1
  524. package/dist/5159.js +0 -13
  525. package/dist/5159.js.map +0 -1
  526. package/dist/5184.js +0 -1
  527. package/dist/5184.js.map +0 -1
  528. package/dist/5270.js +0 -1
  529. package/dist/5270.js.map +0 -1
  530. package/dist/5361.js +0 -1
  531. package/dist/5361.js.map +0 -1
  532. package/dist/5537.js +0 -1
  533. package/dist/5537.js.map +0 -1
  534. package/dist/566.js +0 -1
  535. package/dist/566.js.map +0 -1
  536. package/dist/5733.js +0 -1
  537. package/dist/5733.js.map +0 -1
  538. package/dist/5854.js +0 -1
  539. package/dist/5854.js.map +0 -1
  540. package/dist/5882.js +0 -1
  541. package/dist/6004.js +0 -1
  542. package/dist/6004.js.map +0 -1
  543. package/dist/6121.js +0 -3
  544. package/dist/6121.js.map +0 -1
  545. package/dist/6137.js +0 -1
  546. package/dist/6137.js.map +0 -1
  547. package/dist/6356.js +0 -1
  548. package/dist/6356.js.map +0 -1
  549. package/dist/6571.js +0 -1
  550. package/dist/6571.js.map +0 -1
  551. package/dist/6721.js +0 -1
  552. package/dist/6721.js.map +0 -1
  553. package/dist/6858.js +0 -1
  554. package/dist/6858.js.map +0 -1
  555. package/dist/6925.js +0 -1
  556. package/dist/6925.js.map +0 -1
  557. package/dist/6960.js +0 -1
  558. package/dist/6960.js.map +0 -1
  559. package/dist/7085.js +0 -1
  560. package/dist/7085.js.map +0 -1
  561. package/dist/7127.js +0 -1
  562. package/dist/7176.js +0 -1
  563. package/dist/7176.js.map +0 -1
  564. package/dist/7237.js +0 -1
  565. package/dist/7237.js.map +0 -1
  566. package/dist/725.js +0 -1
  567. package/dist/725.js.map +0 -1
  568. package/dist/7288.js +0 -1
  569. package/dist/7329.js +0 -1
  570. package/dist/7329.js.map +0 -1
  571. package/dist/7334.js +0 -1
  572. package/dist/7334.js.map +0 -1
  573. package/dist/7461.js +0 -1
  574. package/dist/7461.js.map +0 -1
  575. package/dist/7517.js +0 -1
  576. package/dist/7517.js.map +0 -1
  577. package/dist/7837.js +0 -1
  578. package/dist/7837.js.map +0 -1
  579. package/dist/8103.js +0 -1
  580. package/dist/8103.js.map +0 -1
  581. package/dist/8110.js +0 -1
  582. package/dist/8110.js.map +0 -1
  583. package/dist/8179.js +0 -6
  584. package/dist/8179.js.map +0 -1
  585. package/dist/8189.js +0 -1
  586. package/dist/8189.js.map +0 -1
  587. package/dist/8209.js +0 -1
  588. package/dist/8209.js.map +0 -1
  589. package/dist/8249.js +0 -1
  590. package/dist/8249.js.map +0 -1
  591. package/dist/8285.js +0 -1
  592. package/dist/8285.js.map +0 -1
  593. package/dist/8470.js +0 -1
  594. package/dist/8470.js.map +0 -1
  595. package/dist/8502.js +0 -1
  596. package/dist/8502.js.map +0 -1
  597. package/dist/866.js +0 -1
  598. package/dist/866.js.map +0 -1
  599. package/dist/8889.js +0 -11
  600. package/dist/8889.js.map +0 -1
  601. package/dist/8990.js +0 -1
  602. package/dist/8990.js.map +0 -1
  603. package/dist/8994.js +0 -1
  604. package/dist/8994.js.map +0 -1
  605. package/dist/9049.js +0 -1
  606. package/dist/9049.js.map +0 -1
  607. package/dist/9054.js +0 -1
  608. package/dist/9054.js.map +0 -1
  609. package/dist/916.js +0 -1
  610. package/dist/9231.js +0 -1
  611. package/dist/9231.js.map +0 -1
  612. package/dist/9408.js +0 -1
  613. package/dist/9408.js.map +0 -1
  614. package/dist/9425.js +0 -1
  615. package/dist/9466.js +0 -1
  616. package/dist/9466.js.map +0 -1
  617. package/dist/9919.js +0 -1
  618. package/dist/9919.js.map +0 -1
  619. package/dist/9931.js +0 -1
  620. package/dist/9931.js.map +0 -1
  621. package/jest.config.js +0 -3
  622. package/src/shared/orders/OrdersTabs.tsx +0 -58
  623. package/src/shared/patient-chart/patient-chart.component.tsx +0 -61
  624. package/src/shared/patient-chart/patient-chart.resources.ts +0 -180
  625. package/src/shared/patient-chart/patient-chart.scss +0 -15
  626. package/src/shared/patient-chart/useInitialize.ts +0 -24
  627. /package/src/shared/{patient-chart/patient-summary-dashboard → tabs}/patient-summary-dashboard.scss +0 -0
@@ -1,28 +1,12 @@
1
- import React, { useMemo } from 'react';
2
- import { useTranslation } from 'react-i18next';
3
- import { Layer } from '@carbon/react';
4
- import { IbmWatsonDiscovery, Account, Stethoscope } from '@carbon/react/icons';
5
- import ExtensionTabs, { ExtensionTabItem } from '../../../shared/tabs/extension-tabs.component';
1
+ import React from 'react';
2
+ import ExtensionTabs from '../../../shared/tabs/extension-tabs.component';
6
3
 
7
4
  type ClinicalEncounterProps = {
8
5
  patientUuid: string;
9
- patient: fhir.Patient;
10
6
  };
11
7
 
12
- const ClinicalEncounter: React.FC<ClinicalEncounterProps> = ({ patientUuid, patient }) => {
13
- const { t } = useTranslation();
14
- const state = useMemo(() => ({ patientUuid, patient }), [patientUuid, patient]);
15
- const items: Array<ExtensionTabItem> = [
16
- { label: t('clinicalEncounter', 'Clinical Encounter'), icon: Stethoscope, slotName: 'ewf-clinical-encounter-slot' },
17
- { label: t('visits', 'Visits'), icon: Account, slotName: 'ewf-visits-slot' },
18
- { label: t('specialClinics', 'Special Clinics'), icon: IbmWatsonDiscovery, slotName: 'ewf-special-clinics-slot' },
19
- ];
20
-
21
- return (
22
- <Layer>
23
- <ExtensionTabs items={items} state={state} />
24
- </Layer>
25
- );
8
+ const ClinicalEncounter: React.FC<ClinicalEncounterProps> = ({ patientUuid }) => {
9
+ return <ExtensionTabs extensionSlotName="clinical-encounter-tabs-slot" patientUuid={patientUuid} />;
26
10
  };
27
11
 
28
12
  export default ClinicalEncounter;
@@ -9,7 +9,6 @@ import {
9
9
  Dashboard,
10
10
  Stethoscope,
11
11
  Add,
12
- Edit,
13
12
  DocumentMultiple_02,
14
13
  } from '@carbon/react/icons';
15
14
 
@@ -88,6 +87,7 @@ const EncounterDetails: React.FC<EncounterDetailsProps> = ({ patientUuid, patien
88
87
  <TabPanels>
89
88
  <TabPanel>
90
89
  <EncounterCard
90
+ patientUuid={patientUuid}
91
91
  encounterUuid={lastEncounter?.uuid}
92
92
  title={t('visitDetails', 'Visit Details')}
93
93
  mutateForm={mutate}
@@ -108,6 +108,7 @@ const EncounterDetails: React.FC<EncounterDetailsProps> = ({ patientUuid, patien
108
108
  </TabPanel>
109
109
  <TabPanel>
110
110
  <EncounterCard
111
+ patientUuid={patientUuid}
111
112
  encounterUuid={lastEncounter?.uuid}
112
113
  mutateForm={mutate}
113
114
  title={t('patientHistory', 'Patient History')}
@@ -116,6 +117,7 @@ const EncounterDetails: React.FC<EncounterDetailsProps> = ({ patientUuid, patien
116
117
  </TabPanel>
117
118
  <TabPanel>
118
119
  <EncounterCard
120
+ patientUuid={patientUuid}
119
121
  encounterUuid={lastEncounter?.uuid}
120
122
  mutateForm={mutate}
121
123
  title={t('patientExamination', 'Patient Examination')}
@@ -124,6 +126,7 @@ const EncounterDetails: React.FC<EncounterDetailsProps> = ({ patientUuid, patien
124
126
  </TabPanel>
125
127
  <TabPanel>
126
128
  <EncounterCard
129
+ patientUuid={patientUuid}
127
130
  encounterUuid={lastEncounter?.uuid}
128
131
  mutateForm={mutate}
129
132
  title={t('patientManagement', 'Patient Management')}
@@ -146,24 +149,21 @@ type EncounterCardProps = {
146
149
  cardItems: Array<{ title: string; value: string }>;
147
150
  mutateForm: () => void;
148
151
  encounterUuid?: string;
152
+ patientUuid: string;
149
153
  };
150
154
 
151
- const EncounterCard = ({ title, cardItems, mutateForm, encounterUuid }: EncounterCardProps) => {
155
+ const EncounterCard = ({ title, cardItems, mutateForm, encounterUuid, patientUuid }: EncounterCardProps) => {
152
156
  const { t } = useTranslation();
153
157
  const {
154
158
  clinicalEncounter: { formUuid },
155
159
  } = useConfig<ExpressWorkflowConfig>();
156
- const launchWorkspaceRequiringVisit = useLaunchWorkspaceRequiringVisit('patient-form-entry-workspace');
160
+ const launchWorkspaceRequiringVisit = useLaunchWorkspaceRequiringVisit(patientUuid, 'patient-form-entry-workspace');
157
161
 
158
162
  const handleOpenOrEditClinicalEncounterForm = (encounterUuid?: string) => {
159
163
  launchWorkspaceRequiringVisit({
160
- workspaceTitle: title,
164
+ form: { uuid: formUuid },
161
165
  mutateForm: mutateForm,
162
- formInfo: {
163
- encounterUuid: encounterUuid ?? '',
164
- formUuid: formUuid,
165
- additionalProps: {},
166
- },
166
+ encounterUuid: encounterUuid ?? '',
167
167
  });
168
168
  };
169
169
  return (
@@ -1,27 +1,28 @@
1
1
  import React from 'react';
2
2
  import { render, screen, within } from '@testing-library/react';
3
3
  import userEvent from '@testing-library/user-event';
4
+ import { vi, type MockedFunction } from 'vitest';
4
5
  import { formatDatetime, parseDate } from '@openmrs/esm-framework';
5
6
  import { useLaunchWorkspaceRequiringVisit } from '@openmrs/esm-patient-common-lib';
6
7
  import EncounterDetails from './encounter-details.component';
7
8
  import { usePatientEncounter, useClinicalEncounterForm } from '../../../hooks/usePatientEncounter';
8
9
 
9
10
  // Create a mock function for the workspace launcher
10
- const mockLaunchWorkspaceRequiringVisit = jest.fn();
11
+ const mockLaunchWorkspaceRequiringVisit = vi.fn();
11
12
 
12
13
  // Mock dependencies
13
- jest.mock('@openmrs/esm-framework', () => ({
14
- ...jest.requireActual('@openmrs/esm-framework'),
15
- formatDatetime: jest.fn((date, options) => '15-Jan-2024'),
16
- parseDate: jest.fn((date) => new Date(date)),
17
- openmrsFetch: jest.fn(),
18
- useConfig: jest.fn(() => ({
14
+ vi.mock('@openmrs/esm-framework', () => ({
15
+ ...vi.importActual<typeof import('@openmrs/esm-framework')>('@openmrs/esm-framework'),
16
+ formatDatetime: vi.fn((date, options) => '15-Jan-2024'),
17
+ parseDate: vi.fn((date) => new Date(date)),
18
+ openmrsFetch: vi.fn(),
19
+ useConfig: vi.fn(() => ({
19
20
  clinicalEncounter: {
20
21
  encounterTypeUuid: '465a92f2-baf8-42e9-9612-53064be868e8',
21
22
  formUuid: 'e958f902-64df-4819-afd4-7fb061f59308',
22
23
  },
23
24
  })),
24
- ErrorState: jest.fn(({ error, headerTitle }) => (
25
+ ErrorState: vi.fn(({ error, headerTitle }) => (
25
26
  <div data-testid="error-state">
26
27
  <h2>{headerTitle}</h2>
27
28
  <p>{error.message}</p>
@@ -29,26 +30,26 @@ jest.mock('@openmrs/esm-framework', () => ({
29
30
  )),
30
31
  }));
31
32
 
32
- jest.mock('@openmrs/esm-patient-common-lib', () => ({
33
+ vi.mock('@openmrs/esm-patient-common-lib', () => ({
33
34
  CardHeader: ({ title, children }: { title: string; children: React.ReactNode }) => (
34
35
  <div data-testid="card-header">
35
36
  <h2>{title}</h2>
36
37
  {children}
37
38
  </div>
38
39
  ),
39
- useLaunchWorkspaceRequiringVisit: jest.fn(),
40
+ useLaunchWorkspaceRequiringVisit: vi.fn(),
40
41
  }));
41
42
 
42
- jest.mock('@carbon/react', () => ({
43
- ...jest.requireActual('@carbon/react'),
44
- TabsSkeleton: jest.fn(() => <div data-testid="tabs-skeleton">Loading tabs...</div>),
43
+ vi.mock('@carbon/react', () => ({
44
+ ...vi.importActual<typeof import('@carbon/react')>('@carbon/react'),
45
+ TabsSkeleton: vi.fn(() => <div data-testid="tabs-skeleton">Loading tabs...</div>),
45
46
  }));
46
47
 
47
- jest.mock('../../../hooks/usePatientEncounter');
48
+ vi.mock('../../../hooks/usePatientEncounter');
48
49
 
49
- const mockUsePatientEncounter = usePatientEncounter as jest.MockedFunction<typeof usePatientEncounter>;
50
- const mockUseClinicalEncounterForm = useClinicalEncounterForm as jest.MockedFunction<typeof useClinicalEncounterForm>;
51
- const mockUseLaunchWorkspaceRequiringVisit = useLaunchWorkspaceRequiringVisit as jest.MockedFunction<
50
+ const mockUsePatientEncounter = usePatientEncounter as MockedFunction<typeof usePatientEncounter>;
51
+ const mockUseClinicalEncounterForm = useClinicalEncounterForm as MockedFunction<typeof useClinicalEncounterForm>;
52
+ const mockUseLaunchWorkspaceRequiringVisit = useLaunchWorkspaceRequiringVisit as MockedFunction<
52
53
  typeof useLaunchWorkspaceRequiringVisit
53
54
  >;
54
55
 
@@ -150,7 +151,7 @@ describe('EncounterDetails', () => {
150
151
  };
151
152
 
152
153
  beforeEach(() => {
153
- jest.clearAllMocks();
154
+ vi.clearAllMocks();
154
155
  mockLaunchWorkspaceRequiringVisit.mockClear();
155
156
  mockUseLaunchWorkspaceRequiringVisit.mockReturnValue(mockLaunchWorkspaceRequiringVisit);
156
157
  mockUsePatientEncounter.mockReturnValue({
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { IconButton, InlineLoading } from '@carbon/react';
3
+ import type { TFunction } from 'i18next';
3
4
  import { Renew } from '@carbon/react/icons';
4
- import type { TFunction } from 'react-i18next';
5
5
  import type { QueueSummaryCard } from '../../shared/queue/queue-summary-cards.component';
6
6
  import type { QueueFilter, QueueEntry } from '../../types';
7
7
  import styles from './consultation.scss';
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { BrowserRouter, Routes, Route } from 'react-router-dom';
3
3
  import { spaBasePath } from '../../constants';
4
- import PatientChart from '../../shared/patient-chart/patient-chart.component';
5
4
  import Consultation from './consultation.component';
6
5
 
7
6
  type ConsultationDashboardProps = {
@@ -13,7 +12,6 @@ const ConsultationDashboard: React.FC<ConsultationDashboardProps> = ({ dashboard
13
12
  <BrowserRouter basename={`${spaBasePath}/consultation`}>
14
13
  <Routes>
15
14
  <Route path="/" element={<Consultation dashboardTitle={dashboardTitle} />} />
16
- <Route path="/:patientUuid" element={<PatientChart navigationPath="consultation" />} />
17
15
  </Routes>
18
16
  </BrowserRouter>
19
17
  );
@@ -1,5 +1,5 @@
1
1
  import { getAsyncLifecycle } from '@openmrs/esm-framework';
2
-
2
+ export * from './tabs';
3
3
  import { moduleName } from '../../constants';
4
4
 
5
5
  const options = {
@@ -0,0 +1,67 @@
1
+ import { getAsyncLifecycle } from '@openmrs/esm-framework';
2
+
3
+ const options = {
4
+ featureName: 'express-workflow',
5
+ moduleName: '@kenyaemr/esm-express-workflow-app',
6
+ };
7
+
8
+ // t('patientSummaryTab', 'Patient Summary')
9
+ export const patientSummary = getAsyncLifecycle(
10
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
11
+ options,
12
+ );
13
+ // t('vitalsAndAnthropometric', 'Vitals & Anthropometric')
14
+ export const patientVitals = getAsyncLifecycle(
15
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
16
+ options,
17
+ );
18
+ // t('carePanel', 'Care Panel')
19
+ export const carePanel = getAsyncLifecycle(
20
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
21
+ options,
22
+ );
23
+ // t('immunizations', 'Immunizations')
24
+ export const immunization = getAsyncLifecycle(
25
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
26
+ options,
27
+ );
28
+ // t('relationships', 'Relationships')
29
+ export const relationships = getAsyncLifecycle(
30
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
31
+ options,
32
+ );
33
+ // t('appointments', 'Appointments')
34
+ export const appointments = getAsyncLifecycle(
35
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
36
+ options,
37
+ );
38
+ // t("attachments", "Attachments")
39
+ export const attachments = getAsyncLifecycle(
40
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
41
+ options,
42
+ );
43
+ // t('clinicalEncounterTab', 'Clinical Encounter')
44
+ export const patientClinicalEncounter = getAsyncLifecycle(
45
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
46
+ options,
47
+ );
48
+ // t('visits', 'Visits')
49
+ export const patientVisits = getAsyncLifecycle(
50
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
51
+ options,
52
+ );
53
+ // t('specialClinics', 'Special Clinics')
54
+ export const specialClinics = getAsyncLifecycle(
55
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
56
+ options,
57
+ );
58
+ // t('clinicalNotes', 'Clinical Notes')
59
+ export const clinicalNotes = getAsyncLifecycle(
60
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
61
+ options,
62
+ );
63
+ // t('proceduresAndOrders', 'Investigation & Orders')
64
+ export const proceduresAndOrders = getAsyncLifecycle(
65
+ () => import('../../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
66
+ options,
67
+ );
@@ -1,7 +1,6 @@
1
- import React, { useCallback, useMemo } from 'react';
1
+ import React from 'react';
2
2
  import dayjs from 'dayjs';
3
3
  import { useTranslation } from 'react-i18next';
4
- import { MultiSelect } from '@carbon/react';
5
4
  import {
6
5
  PageHeader,
7
6
  PageHeaderContent,
@@ -18,17 +17,17 @@ interface HomeHeaderProps {
18
17
 
19
18
  const HomeHeader: React.FC<HomeHeaderProps> = ({ title, onDateChange }) => {
20
19
  const { t } = useTranslation();
21
- const today = new Date().toISOString().split('T')[0];
20
+ const today = dayjs().toDate();
22
21
  const [startDate, setStartDate] = React.useState(today);
23
22
  const [endDate, setEndDate] = React.useState(today);
24
23
 
25
24
  const handleDateChange = (type: 'start' | 'end', date: string) => {
26
25
  if (type === 'start') {
27
- setStartDate(date);
28
- onDateChange?.(date, endDate);
26
+ setStartDate(dayjs(date).startOf('day').toDate());
27
+ onDateChange?.(dayjs(date).startOf('day').toISOString(), dayjs(endDate).endOf('day').toISOString());
29
28
  } else {
30
- setEndDate(date);
31
- onDateChange?.(startDate, date);
29
+ setEndDate(dayjs(date).endOf('day').toDate());
30
+ onDateChange?.(dayjs(startDate).startOf('day').toISOString(), dayjs(date).endOf('day').toISOString());
32
31
  }
33
32
  };
34
33
 
@@ -44,9 +43,7 @@ const HomeHeader: React.FC<HomeHeaderProps> = ({ title, onDateChange }) => {
44
43
  id="start-date"
45
44
  labelText="Start Date"
46
45
  value={startDate}
47
- onChange={(date) =>
48
- handleDateChange('start', typeof date === 'string' ? date : date.toISOString().split('T')[0])
49
- }
46
+ onChange={(date) => handleDateChange('start', typeof date === 'string' ? date : date.toISOString())}
50
47
  />
51
48
  </div>
52
49
  <div className={styles.dateInput}>
@@ -54,9 +51,7 @@ const HomeHeader: React.FC<HomeHeaderProps> = ({ title, onDateChange }) => {
54
51
  id="end-date"
55
52
  labelText="End Date"
56
53
  value={endDate}
57
- onChange={(date) =>
58
- handleDateChange('end', typeof date === 'string' ? date : date.toISOString().split('T')[0])
59
- }
54
+ onChange={(date) => handleDateChange('end', typeof date === 'string' ? date : date.toISOString())}
60
55
  />
61
56
  </div>
62
57
  </div>
@@ -20,3 +20,14 @@ export const laboratoryLeftPanelLink = getAsyncLifecycle(
20
20
  })),
21
21
  options,
22
22
  );
23
+
24
+ // t("results", "Results")
25
+ export const patientLaboratoryOrdersResults = getAsyncLifecycle(
26
+ () => import('./../../shared/tabs/create-tab-extension').then((mod) => ({ default: mod.createTabExtension() })),
27
+ options,
28
+ );
29
+ // t("order", "Orders")
30
+ export const patientLaboratoryOrdersTab = getAsyncLifecycle(
31
+ () => import('../../components/laboratory/lab-table.component'),
32
+ options,
33
+ );
@@ -1,22 +1,49 @@
1
- import React from 'react';
2
- import { Order } from '../../types/order/order';
3
- import { Layer } from '@carbon/react';
1
+ import React, { useMemo } from 'react';
2
+ import { DataTableSkeleton, Layer } from '@carbon/react';
4
3
  import { useTranslation } from 'react-i18next';
5
- import { useConfig } from '@openmrs/esm-framework';
4
+ import { ErrorState, useConfig } from '@openmrs/esm-framework';
6
5
  import styles from './laboratory-tabs.scss';
7
- import { EmptyState, useLaunchWorkspaceRequiringVisit } from '@openmrs/esm-patient-common-lib';
6
+ import { EmptyState, useLaunchWorkspaceRequiringVisit, usePatientChartStore } from '@openmrs/esm-patient-common-lib';
8
7
  import { ExpressWorkflowConfig } from '../../config-schema';
9
8
  import OrderTable from '../../shared/orders/OrderTable';
9
+ import { getPatientPrintFields } from '../../shared/utils';
10
+ import { usePatientOrders } from '../../hooks/useOrders';
10
11
 
11
12
  type LabTableProps = {
12
- orders: Order[];
13
+ patientUuid: string;
13
14
  };
14
15
 
15
- const LabTable: React.FC<LabTableProps> = ({ orders }) => {
16
- const { t } = useTranslation();
16
+ const LabTable: React.FC<LabTableProps> = ({ patientUuid }) => {
17
17
  const { labOrderTypeUuid, orderableConceptSets } = useConfig<ExpressWorkflowConfig>();
18
+ const {
19
+ data: orders,
20
+ isLoading,
21
+ error,
22
+ mutate: mutateOrders,
23
+ } = usePatientOrders(patientUuid, 'any', labOrderTypeUuid, undefined, undefined);
24
+
25
+ const { t } = useTranslation();
26
+ const { patient } = usePatientChartStore(patientUuid);
27
+ const windowProps = useMemo(() => ({ encounterUuid: orders?.[0]?.encounter?.uuid }), [orders]);
28
+ const groupProps = useMemo(
29
+ () => ({
30
+ patient,
31
+ patientUuid: patient?.id,
32
+ visitContext: orders?.[0]?.encounter?.visit,
33
+ mutateVisitContext: mutateOrders,
34
+ }),
35
+ [patient, orders, mutateOrders],
36
+ );
37
+ const launchAddLabOrder = useLaunchWorkspaceRequiringVisit(patientUuid, 'order-basket');
38
+ const { patientName, patientId, patientAge } = getPatientPrintFields(patient);
18
39
 
19
- const launchAddLabOrder = useLaunchWorkspaceRequiringVisit('add-lab-order');
40
+ if (isLoading) {
41
+ return <DataTableSkeleton />;
42
+ }
43
+
44
+ if (error) {
45
+ return <ErrorState headerTitle={t('laboratoryOrders', 'Laboratory Orders')} error={error} />;
46
+ }
20
47
 
21
48
  if (orders?.length === 0) {
22
49
  return (
@@ -24,7 +51,9 @@ const LabTable: React.FC<LabTableProps> = ({ orders }) => {
24
51
  <EmptyState
25
52
  displayText={t('orders', 'Orders')}
26
53
  headerTitle={t('laboratoryOrders', 'Laboratory Orders')}
27
- launchForm={() => launchAddLabOrder({ orderTypeUuid: labOrderTypeUuid, orderableConceptSets })}
54
+ launchForm={() =>
55
+ launchAddLabOrder({ orderTypeUuid: labOrderTypeUuid, orderableConceptSets }, windowProps, groupProps)
56
+ }
28
57
  />
29
58
  </Layer>
30
59
  );
@@ -33,12 +62,17 @@ const LabTable: React.FC<LabTableProps> = ({ orders }) => {
33
62
  return (
34
63
  <OrderTable
35
64
  title={t('laboratoryOrders', 'Laboratory Orders')}
36
- orders={orders}
37
- onAdd={() => launchAddLabOrder({ orderTypeUuid: labOrderTypeUuid, orderableConceptSets })}
65
+ orders={orders ?? []}
66
+ onAdd={() => launchAddLabOrder(undefined, { encounterUuid: '' }, groupProps)}
38
67
  containerClassName={styles.labTableContainer}
39
68
  tableCellClassName={styles.tableCell}
40
69
  priorityPillClassName={styles.priorityPill}
41
70
  statusPillClassName={styles.statusPill}
71
+ module="@openmrs/esm-laboratory-app"
72
+ orderType="lab"
73
+ patientName={patientName}
74
+ patientId={patientId}
75
+ patientAge={patientAge}
42
76
  />
43
77
  );
44
78
  };
@@ -1,29 +1,15 @@
1
1
  import React from 'react';
2
2
  import { useTranslation } from 'react-i18next';
3
- import OrdersTabs from '../../shared/orders/OrdersTabs';
4
- import LabTable from './lab-table.component';
3
+ import ExtensionTabs from '../../shared/tabs/extension-tabs.component';
5
4
 
6
5
  type LaboratoryTabsProps = {
7
6
  patientUuid: string;
8
- patient: fhir.Patient;
9
7
  };
10
8
 
11
- const LaboratoryTabs: React.FC<LaboratoryTabsProps> = ({ patientUuid, patient }) => {
9
+ const LaboratoryTabs: React.FC<LaboratoryTabsProps> = ({ patientUuid }) => {
12
10
  const { t } = useTranslation();
13
- const testOrderTypeUuid = '52a447d3-a64a-11e3-9aeb-50e549534c5e';
14
11
 
15
- return (
16
- <OrdersTabs
17
- patientUuid={patientUuid}
18
- patient={patient}
19
- basePath="laboratory"
20
- resultsSlotName="ewf-laboratory-results-slot"
21
- orderTypeUuid={testOrderTypeUuid}
22
- Table={({ orders }) => {
23
- return <LabTable orders={orders} />;
24
- }}
25
- />
26
- );
12
+ return <ExtensionTabs extensionSlotName="patient-laboratory-tabs-slot" patientUuid={patientUuid} />;
27
13
  };
28
14
 
29
15
  export default LaboratoryTabs;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { BrowserRouter, Routes, Route } from 'react-router-dom';
3
3
  import { spaBasePath } from '../../constants';
4
- import PatientChart from '../../shared/patient-chart/patient-chart.component';
5
4
  import MCH from './mch.component';
6
5
 
7
6
  type MchDashboardProps = {
@@ -13,7 +12,6 @@ const MCHDashboard: React.FC<MchDashboardProps> = ({ dashboardTitle }) => {
13
12
  <BrowserRouter basename={`${spaBasePath}/mch`}>
14
13
  <Routes>
15
14
  <Route path="/" element={<MCH dashboardTitle={dashboardTitle} />} />
16
- <Route path="/:patientUuid" element={<PatientChart navigationPath="mch" />} />
17
15
  </Routes>
18
16
  </BrowserRouter>
19
17
  );
@@ -18,9 +18,7 @@ const MCH: React.FC<MchProps> = ({ dashboardTitle }) => {
18
18
  <div>
19
19
  <PageHeader className={styles.pageHeader}>
20
20
  <PageHeaderContent
21
- title={`${toUpper(dashboardTitle)} ${
22
- selectedIndex === 0 ? t('triage', 'Triage') : t('consultation', 'Consultation')
23
- }`}
21
+ title={selectedIndex === 0 ? t('mchTriage', 'MCH Triage') : t('mchConsultation', 'MCH Consultation')}
24
22
  illustration={<HomePictogram />}
25
23
  />
26
24
 
@@ -1,7 +1,7 @@
1
1
  import { getAsyncLifecycle } from '@openmrs/esm-framework';
2
2
 
3
3
  import { moduleName } from '../../constants';
4
-
4
+ export * from './tabs';
5
5
  const options = {
6
6
  featureName: 'express-workflow',
7
7
  moduleName,
@@ -16,14 +16,22 @@ import {
16
16
  DataTableSkeleton,
17
17
  Pagination,
18
18
  } from '@carbon/react';
19
- import { Add, Renew } from '@carbon/react/icons';
20
- import { ErrorState, formatDatetime, parseDate, useDebounce, useLayoutType } from '@openmrs/esm-framework';
21
- import { EmptyState, useLaunchWorkspaceRequiringVisit, usePaginationInfo } from '@openmrs/esm-patient-common-lib';
19
+ import { Add, Printer, Renew } from '@carbon/react/icons';
20
+ import { ErrorState, formatDatetime, parseDate, showModal, useDebounce, useLayoutType } from '@openmrs/esm-framework';
21
+ import {
22
+ EmptyState,
23
+ invalidateVisitAndEncounterData,
24
+ invalidateVisitByUuid,
25
+ useLaunchWorkspaceRequiringVisit,
26
+ usePaginationInfo,
27
+ usePatientChartStore,
28
+ } from '@openmrs/esm-patient-common-lib';
22
29
  import capitalize from 'lodash-es/capitalize';
23
30
 
24
31
  import { usePharmacyOrders } from './pharmacy-orders.resource';
25
32
 
26
33
  import styles from './pharmacy-orders.scss';
34
+ import { useSWRConfig } from 'swr';
27
35
 
28
36
  type PharmacyOrdersProps = {
29
37
  patient: fhir.Patient;
@@ -36,7 +44,22 @@ const PharmacyOrders: React.FC<PharmacyOrdersProps> = ({ patient }) => {
36
44
  const debouncedSearchTerm = useDebounce(searchTerm, 500);
37
45
  const { medicationRequests, isLoading, error, mutate, currentPage, goTo, totalCount, currPageSize, setCurrPageSize } =
38
46
  usePharmacyOrders(patient.identifier[0]?.value ?? '', debouncedSearchTerm);
39
- const launchAddDrugOrder = useLaunchWorkspaceRequiringVisit('add-drug-order');
47
+ const { mutate: globalMutate } = useSWRConfig();
48
+
49
+ const { visitContext } = usePatientChartStore(patient.id);
50
+ const groupProps = useMemo(
51
+ () => ({
52
+ patient,
53
+ patientUuid: patient?.id,
54
+ visitContext: visitContext,
55
+ mutateVisitContext: () => {
56
+ invalidateVisitByUuid(globalMutate, visitContext.uuid);
57
+ invalidateVisitAndEncounterData(globalMutate, patient.id);
58
+ },
59
+ }),
60
+ [globalMutate, visitContext, patient.id],
61
+ );
62
+ const launchOrderBasket = useLaunchWorkspaceRequiringVisit(patient?.id, 'order-basket');
40
63
 
41
64
  const currentItems = useMemo(() => {
42
65
  return medicationRequests.length;
@@ -64,6 +87,14 @@ const PharmacyOrders: React.FC<PharmacyOrdersProps> = ({ patient }) => {
64
87
  };
65
88
  });
66
89
 
90
+ const handlePrintPrescription = () => {
91
+ const uuids = medicationRequests.map((entry) => entry.resource.id).filter(Boolean);
92
+ const dispose = showModal('print-prescription-modal', {
93
+ onClose: () => dispose(),
94
+ medicationRequestUuids: uuids,
95
+ });
96
+ };
97
+
67
98
  if (isLoading) {
68
99
  return (
69
100
  <div className={styles.pharmacyOrdersContainer}>
@@ -86,7 +117,7 @@ const PharmacyOrders: React.FC<PharmacyOrdersProps> = ({ patient }) => {
86
117
  <EmptyState
87
118
  displayText={t('noMedicationOrdersFound', 'medication orders found')}
88
119
  headerTitle={t('medicationOrders', 'Medication Orders')}
89
- launchForm={launchAddDrugOrder}
120
+ launchForm={() => launchOrderBasket({}, { encounterUuid: '' }, groupProps)}
90
121
  />
91
122
  </div>
92
123
  );
@@ -113,7 +144,14 @@ const PharmacyOrders: React.FC<PharmacyOrdersProps> = ({ patient }) => {
113
144
  <Button kind="ghost" renderIcon={Renew} size={responseSize} onClick={() => mutate()}>
114
145
  {t('refresh', 'Refresh')}
115
146
  </Button>
116
- <Button size={responseSize} onClick={() => launchAddDrugOrder()} kind="ghost" renderIcon={Add}>
147
+ <Button kind="ghost" renderIcon={Printer} size={responseSize} onClick={() => handlePrintPrescription()}>
148
+ {t('printPrescription', 'Print Prescription')}
149
+ </Button>
150
+ <Button
151
+ size={responseSize}
152
+ onClick={() => launchOrderBasket({}, { encounterUuid: '' }, groupProps)}
153
+ kind="ghost"
154
+ renderIcon={Add}>
117
155
  {t('addMedicationOrder', 'Add Medication Order')}
118
156
  </Button>
119
157
  </TableToolbarContent>
@@ -1,21 +1,22 @@
1
1
  import React from 'react';
2
2
  import { screen, waitFor } from '@testing-library/react';
3
3
  import userEvent from '@testing-library/user-event';
4
+ import { vi, type MockedFunction } from 'vitest';
4
5
  import { renderWithSwr } from '../../../../../../tools/test-helpers';
5
6
  import PharmacyOrders from './pharmacy-orders.component';
6
7
  import { usePharmacyOrders } from './pharmacy-orders.resource';
7
8
 
8
9
  // Mock the workspace launcher hook
9
- const mockLaunchAddDrugOrder = jest.fn();
10
- jest.mock('@openmrs/esm-patient-common-lib', () => ({
11
- ...jest.requireActual('@openmrs/esm-patient-common-lib'),
12
- useLaunchWorkspaceRequiringVisit: jest.fn(() => mockLaunchAddDrugOrder),
10
+ const mockLaunchAddDrugOrder = vi.fn();
11
+ vi.mock('@openmrs/esm-patient-common-lib', () => ({
12
+ ...vi.importActual<typeof import('@openmrs/esm-patient-common-lib')>('@openmrs/esm-patient-common-lib'),
13
+ useLaunchWorkspaceRequiringVisit: vi.fn(() => mockLaunchAddDrugOrder),
13
14
  }));
14
15
 
15
16
  // Mock the pharmacy orders hook
16
- jest.mock('./pharmacy-orders.resource');
17
+ vi.mock('./pharmacy-orders.resource');
17
18
 
18
- const mockUsePharmacyOrders = usePharmacyOrders as jest.MockedFunction<typeof usePharmacyOrders>;
19
+ const mockUsePharmacyOrders = usePharmacyOrders as MockedFunction<typeof usePharmacyOrders>;
19
20
 
20
21
  describe('PharmacyOrders Component', () => {
21
22
  const mockPatient: fhir.Patient = {
@@ -103,7 +104,7 @@ describe('PharmacyOrders Component', () => {
103
104
  const mockSetCurrPageSize = jest.fn() as unknown as React.Dispatch<React.SetStateAction<number>>;
104
105
 
105
106
  beforeEach(() => {
106
- jest.clearAllMocks();
107
+ vi.clearAllMocks();
107
108
  });
108
109
 
109
110
  describe('Loading State', () => {