@kenyaemr/esm-express-workflow-app 5.4.3 → 5.4.4-pre.1

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 (487) hide show
  1. package/.turbo/turbo-build.log +13 -11
  2. package/dist/1074.js +1 -0
  3. package/dist/1074.js.map +1 -0
  4. package/dist/1084.js +1 -0
  5. package/dist/1084.js.map +1 -0
  6. package/dist/12.js +17 -0
  7. package/dist/12.js.map +1 -0
  8. package/dist/126.js +1 -0
  9. package/dist/126.js.map +1 -0
  10. package/dist/1311.js +1 -0
  11. package/dist/1311.js.map +1 -0
  12. package/dist/1323.js +1 -0
  13. package/dist/1323.js.map +1 -0
  14. package/dist/1469.js +1 -0
  15. package/dist/1469.js.map +1 -0
  16. package/dist/1506.js +13 -0
  17. package/dist/1506.js.map +1 -0
  18. package/dist/1760.js +1 -0
  19. package/dist/1760.js.map +1 -0
  20. package/dist/1780.js +1 -0
  21. package/dist/1780.js.map +1 -0
  22. package/dist/1791.js +1 -0
  23. package/dist/1791.js.map +1 -0
  24. package/dist/1884.js +1 -0
  25. package/dist/1884.js.map +1 -0
  26. package/dist/1972.js +1 -0
  27. package/dist/1972.js.map +1 -0
  28. package/dist/1990.js +1 -0
  29. package/dist/1990.js.map +1 -0
  30. package/dist/2016.js +1 -0
  31. package/dist/2016.js.map +1 -0
  32. package/dist/2024.js +1 -0
  33. package/dist/2024.js.map +1 -0
  34. package/dist/2153.js +1 -0
  35. package/dist/2153.js.map +1 -0
  36. package/dist/216.js +1 -0
  37. package/dist/216.js.map +1 -0
  38. package/dist/2225.js +1 -0
  39. package/dist/2225.js.map +1 -0
  40. package/dist/2294.js +1 -0
  41. package/dist/2294.js.map +1 -0
  42. package/dist/2345.js +1 -0
  43. package/dist/2345.js.map +1 -0
  44. package/dist/2386.js +1 -0
  45. package/dist/2386.js.map +1 -0
  46. package/dist/2438.js +1 -0
  47. package/dist/2438.js.map +1 -0
  48. package/dist/2499.js +1 -0
  49. package/dist/2499.js.map +1 -0
  50. package/dist/2500.js +1 -0
  51. package/dist/2500.js.map +1 -0
  52. package/dist/2586.js +1 -0
  53. package/dist/2586.js.map +1 -0
  54. package/dist/2625.js +1 -0
  55. package/dist/2625.js.map +1 -0
  56. package/dist/2685.js +1 -0
  57. package/dist/2685.js.map +1 -0
  58. package/dist/2757.js +1 -0
  59. package/dist/2757.js.map +1 -0
  60. package/dist/2851.js +1 -0
  61. package/dist/2851.js.map +1 -0
  62. package/dist/2881.js +1 -0
  63. package/dist/2881.js.map +1 -0
  64. package/dist/2948.js +1 -0
  65. package/dist/2948.js.map +1 -0
  66. package/dist/2968.js +1 -0
  67. package/dist/2968.js.map +1 -0
  68. package/dist/2998.js +1 -0
  69. package/dist/2998.js.map +1 -0
  70. package/dist/30.js +1 -0
  71. package/dist/30.js.map +1 -0
  72. package/dist/3089.js +1 -0
  73. package/dist/3089.js.map +1 -0
  74. package/dist/3139.js +1 -0
  75. package/dist/3139.js.map +1 -0
  76. package/dist/3220.js +1 -0
  77. package/dist/3220.js.map +1 -0
  78. package/dist/3265.js +1 -0
  79. package/dist/3265.js.map +1 -0
  80. package/dist/3548.js +1 -0
  81. package/dist/3548.js.map +1 -0
  82. package/dist/3567.js +1 -0
  83. package/dist/3567.js.map +1 -0
  84. package/dist/3571.js +1 -0
  85. package/dist/3571.js.map +1 -0
  86. package/dist/3691.js +1 -0
  87. package/dist/3691.js.map +1 -0
  88. package/dist/3730.js +1 -0
  89. package/dist/3730.js.map +1 -0
  90. package/dist/3923.js +1 -0
  91. package/dist/3923.js.map +1 -0
  92. package/dist/3963.js +1 -0
  93. package/dist/3963.js.map +1 -0
  94. package/dist/4024.js +1 -0
  95. package/dist/4024.js.map +1 -0
  96. package/dist/405.js +1 -0
  97. package/dist/405.js.map +1 -0
  98. package/dist/4296.js +1 -0
  99. package/dist/4296.js.map +1 -0
  100. package/dist/4504.js +1 -0
  101. package/dist/4504.js.map +1 -0
  102. package/dist/4564.js +1 -0
  103. package/dist/4564.js.map +1 -0
  104. package/dist/4581.js +1 -0
  105. package/dist/4581.js.map +1 -0
  106. package/dist/4670.js +1 -0
  107. package/dist/4670.js.map +1 -0
  108. package/dist/4680.js +1 -0
  109. package/dist/4680.js.map +1 -0
  110. package/dist/4682.js +1 -0
  111. package/dist/4682.js.map +1 -0
  112. package/dist/4735.js +1 -0
  113. package/dist/4735.js.map +1 -0
  114. package/dist/4737.js +1 -0
  115. package/dist/4737.js.map +1 -0
  116. package/dist/4744.js +1 -0
  117. package/dist/4744.js.map +1 -0
  118. package/dist/4795.js +1 -0
  119. package/dist/4795.js.map +1 -0
  120. package/dist/4813.js +2 -0
  121. package/dist/4813.js.map +1 -0
  122. package/dist/4818.js +1 -0
  123. package/dist/4818.js.map +1 -0
  124. package/dist/4858.js +1 -0
  125. package/dist/4858.js.map +1 -0
  126. package/dist/487.js +1 -0
  127. package/dist/487.js.map +1 -0
  128. package/dist/4970.js +1 -0
  129. package/dist/4970.js.map +1 -0
  130. package/dist/5047.js +1 -0
  131. package/dist/5047.js.map +1 -0
  132. package/dist/5054.js +1 -0
  133. package/dist/5054.js.map +1 -0
  134. package/dist/5202.js +1 -0
  135. package/dist/5202.js.map +1 -0
  136. package/dist/5491.js +1 -0
  137. package/dist/5491.js.map +1 -0
  138. package/dist/5592.js +1 -0
  139. package/dist/5592.js.map +1 -0
  140. package/dist/5669.js +1 -0
  141. package/dist/5669.js.map +1 -0
  142. package/dist/5787.js +1 -0
  143. package/dist/5787.js.map +1 -0
  144. package/dist/586.js +1 -0
  145. package/dist/586.js.map +1 -0
  146. package/dist/5879.js +1 -0
  147. package/dist/5879.js.map +1 -0
  148. package/dist/5904.js +1 -0
  149. package/dist/5904.js.map +1 -0
  150. package/dist/5986.js +1 -0
  151. package/dist/5986.js.map +1 -0
  152. package/dist/6007.js +11 -0
  153. package/dist/6007.js.map +1 -0
  154. package/dist/6075.js +1 -0
  155. package/dist/6075.js.map +1 -0
  156. package/dist/6258.js +1 -0
  157. package/dist/6258.js.map +1 -0
  158. package/dist/629.js +1 -0
  159. package/dist/629.js.map +1 -0
  160. package/dist/6328.js +1 -0
  161. package/dist/6328.js.map +1 -0
  162. package/dist/6355.js +1 -0
  163. package/dist/6355.js.map +1 -0
  164. package/dist/64.js +1 -0
  165. package/dist/64.js.map +1 -0
  166. package/dist/6445.js +1 -0
  167. package/dist/6445.js.map +1 -0
  168. package/dist/6456.js +1 -0
  169. package/dist/6466.js +3 -0
  170. package/dist/6466.js.map +1 -0
  171. package/dist/6663.js +1 -0
  172. package/dist/6663.js.map +1 -0
  173. package/dist/6720.js +1 -0
  174. package/dist/6720.js.map +1 -0
  175. package/dist/6798.js +66 -0
  176. package/dist/6798.js.map +1 -0
  177. package/dist/6925.js +1 -0
  178. package/dist/6925.js.map +1 -0
  179. package/dist/7201.js +1 -0
  180. package/dist/7201.js.map +1 -0
  181. package/dist/7234.js +1 -0
  182. package/dist/7234.js.map +1 -0
  183. package/dist/7261.js +1 -0
  184. package/dist/7261.js.map +1 -0
  185. package/dist/7326.js +1 -0
  186. package/dist/7359.js +1 -0
  187. package/dist/7405.js +1 -0
  188. package/dist/7405.js.map +1 -0
  189. package/dist/7591.js +1 -0
  190. package/dist/7591.js.map +1 -0
  191. package/dist/7602.js +1 -0
  192. package/dist/7602.js.map +1 -0
  193. package/dist/7607.js +1 -0
  194. package/dist/7701.js +1 -0
  195. package/dist/7701.js.map +1 -0
  196. package/dist/7717.js +1 -0
  197. package/dist/7717.js.map +1 -0
  198. package/dist/7739.js +1 -0
  199. package/dist/7739.js.map +1 -0
  200. package/dist/7788.js +1 -0
  201. package/dist/7788.js.map +1 -0
  202. package/dist/7819.js +1 -0
  203. package/dist/7819.js.map +1 -0
  204. package/dist/7820.js +1 -0
  205. package/dist/7820.js.map +1 -0
  206. package/dist/7844.js +1 -0
  207. package/dist/7844.js.map +1 -0
  208. package/dist/7971.js +1 -0
  209. package/dist/7971.js.map +1 -0
  210. package/dist/807.js +1 -0
  211. package/dist/807.js.map +1 -0
  212. package/dist/8159.js +7 -0
  213. package/dist/8159.js.map +1 -0
  214. package/dist/8338.js +1 -0
  215. package/dist/8338.js.map +1 -0
  216. package/dist/845.js +1 -0
  217. package/dist/845.js.map +1 -0
  218. package/dist/8566.js +1 -0
  219. package/dist/8566.js.map +1 -0
  220. package/dist/8570.js +1 -0
  221. package/dist/8570.js.map +1 -0
  222. package/dist/8613.js +1 -0
  223. package/dist/8613.js.map +1 -0
  224. package/dist/8682.js +1 -0
  225. package/dist/8682.js.map +1 -0
  226. package/dist/87.js +1 -0
  227. package/dist/87.js.map +1 -0
  228. package/dist/8727.js +1 -0
  229. package/dist/8766.js +1 -0
  230. package/dist/8766.js.map +1 -0
  231. package/dist/8799.js +1 -0
  232. package/dist/8799.js.map +1 -0
  233. package/dist/8828.js +1 -0
  234. package/dist/8828.js.map +1 -0
  235. package/dist/8860.js +1 -0
  236. package/dist/8860.js.map +1 -0
  237. package/dist/8911.js +1 -0
  238. package/dist/8911.js.map +1 -0
  239. package/dist/8930.js +1 -0
  240. package/dist/8930.js.map +1 -0
  241. package/dist/8971.js +1 -0
  242. package/dist/8971.js.map +1 -0
  243. package/dist/9011.js +1 -0
  244. package/dist/9011.js.map +1 -0
  245. package/dist/9111.js +1 -0
  246. package/dist/9111.js.map +1 -0
  247. package/dist/9124.js +1 -0
  248. package/dist/9124.js.map +1 -0
  249. package/dist/9157.js +1 -0
  250. package/dist/9157.js.map +1 -0
  251. package/dist/9161.js +1 -0
  252. package/dist/9161.js.map +1 -0
  253. package/dist/9182.js +1 -0
  254. package/dist/921.js +1 -0
  255. package/dist/921.js.map +1 -0
  256. package/dist/9212.js +1 -0
  257. package/dist/9212.js.map +1 -0
  258. package/dist/9255.js +1 -0
  259. package/dist/9255.js.map +1 -0
  260. package/dist/9257.js +1 -0
  261. package/dist/9257.js.map +1 -0
  262. package/dist/9343.js +1 -0
  263. package/dist/9343.js.map +1 -0
  264. package/dist/9404.js +1 -0
  265. package/dist/9404.js.map +1 -0
  266. package/dist/9446.js +1 -0
  267. package/dist/9446.js.map +1 -0
  268. package/dist/9449.js +1 -0
  269. package/dist/9449.js.map +1 -0
  270. package/dist/9488.js +1 -0
  271. package/dist/9488.js.map +1 -0
  272. package/dist/9514.js +1 -0
  273. package/dist/9514.js.map +1 -0
  274. package/dist/9528.js +1 -0
  275. package/dist/9528.js.map +1 -0
  276. package/dist/9535.js +1 -0
  277. package/dist/9535.js.map +1 -0
  278. package/dist/9606.js +1 -0
  279. package/dist/9606.js.map +1 -0
  280. package/dist/9834.js +1 -0
  281. package/dist/9834.js.map +1 -0
  282. package/dist/9845.js +1 -0
  283. package/dist/9845.js.map +1 -0
  284. package/dist/9848.js +1 -0
  285. package/dist/9848.js.map +1 -0
  286. package/dist/kenyaemr-esm-express-workflow-app.js +5 -5
  287. package/dist/kenyaemr-esm-express-workflow-app.js.buildmanifest.json +3394 -173
  288. package/dist/kenyaemr-esm-express-workflow-app.js.map +1 -1
  289. package/dist/main.js +7 -106
  290. package/dist/main.js.map +1 -1
  291. package/dist/routes.json +1 -1
  292. package/package.json +7 -8
  293. package/rspack.config.js +1 -1
  294. package/src/components/accounting/index.tsx +11 -10
  295. package/src/components/admissions/admissions-dashboard.component.tsx +2 -2
  296. package/src/components/admissions/index.tsx +11 -10
  297. package/src/components/anaesthetic/anaesthetic-dashboard.meta.ts +8 -0
  298. package/src/components/anaesthetic/anaesthetic-data-form.component.tsx +442 -0
  299. package/src/components/anaesthetic/anaesthetic-data-form.scss +278 -0
  300. package/src/components/anaesthetic/anaesthetic-link.component.tsx +21 -0
  301. package/src/components/anaesthetic/anaesthetic.component.tsx +618 -0
  302. package/src/components/anaesthetic/anaesthetic.resource.ts +1503 -0
  303. package/src/components/anaesthetic/anaesthetic.scss +1885 -0
  304. package/src/components/anaesthetic/forms/anaesthetic-form.component.tsx +304 -0
  305. package/src/components/anaesthetic/forms/anaesthetic-record-form.component.tsx +707 -0
  306. package/src/components/anaesthetic/forms/icd11-diagnosis-search.component.tsx +178 -0
  307. package/src/components/anaesthetic/forms/icd11-diagnosis-search.scss +126 -0
  308. package/src/components/anaesthetic/forms/index.ts +2 -0
  309. package/src/components/anaesthetic/forms/interoperative-record-drug-given-form.component.tsx +231 -0
  310. package/src/components/anaesthetic/forms/post-operative-summary-form.component.tsx +171 -0
  311. package/src/components/anaesthetic/forms/time-picker-dropdown.component.tsx +202 -0
  312. package/src/components/anaesthetic/forms/time-picker-dropdown.scss +107 -0
  313. package/src/components/anaesthetic/forms/time-picker-with-clock.component.tsx +174 -0
  314. package/src/components/anaesthetic/forms/time-picker-with-clock.scss +178 -0
  315. package/src/components/anaesthetic/forms/useAnaestheticData.ts +16 -0
  316. package/src/components/anaesthetic/graphs/anaesthetic-graph-wrapper.component.tsx +266 -0
  317. package/src/components/anaesthetic/graphs/anaesthetic-graph.component.tsx +185 -0
  318. package/src/components/anaesthetic/graphs/index.ts +2 -0
  319. package/src/components/anaesthetic/graphs/interoperative-record-drug-given-graph-wrapper.component.tsx +197 -0
  320. package/src/components/anaesthetic/graphs/interoperative-record-drug-given-graph.component.tsx +93 -0
  321. package/src/components/anaesthetic/resources/anaesthetic-amniotic-fluid.resource.ts +277 -0
  322. package/src/components/anaesthetic/resources/anaesthetic-form.resource.ts +716 -0
  323. package/src/components/anaesthetic/resources/anaesthetic.resource.ts +378 -0
  324. package/src/components/anaesthetic/types/index.ts +1349 -0
  325. package/src/components/appointments/index.ts +10 -8
  326. package/src/components/consultation/clinical-encounter/clinical-encounter.component.tsx +4 -20
  327. package/src/components/consultation/clinical-encounter/encounter-details.component.tsx +9 -9
  328. package/src/components/consultation/clinical-encounter/encounter-details.test.tsx +19 -18
  329. package/src/components/consultation/consultation-context.tsx +19 -0
  330. package/src/components/consultation/consultation-summary-cards.component.tsx +124 -0
  331. package/src/components/consultation/consultation.component.tsx +41 -268
  332. package/src/components/consultation/consultation.resource.ts +67 -24
  333. package/src/components/consultation/consultation.scss +5 -0
  334. package/src/components/consultation/consultation.utils.tsx +222 -0
  335. package/src/components/consultation/dashboard.component.tsx +0 -2
  336. package/src/components/consultation/index.ts +28 -21
  337. package/src/components/consultation/tabs/index.ts +67 -0
  338. package/src/components/facility-dashboard/components/header/home-header.component.tsx +8 -13
  339. package/src/components/facility-dashboard/index.tsx +10 -9
  340. package/src/components/laboratory/index.ts +22 -10
  341. package/src/components/laboratory/lab-table.component.tsx +40 -12
  342. package/src/components/laboratory/laboratory-tabs.component.tsx +3 -17
  343. package/src/components/mch/dashboard.component.tsx +0 -2
  344. package/src/components/mch/index.tsx +10 -9
  345. package/src/components/mch/mch.component.tsx +1 -3
  346. package/src/components/mch/mch.consultation.component.tsx +27 -15
  347. package/src/components/mch/mch.triage.component.tsx +42 -33
  348. package/src/components/pharmacy/index.ts +21 -19
  349. package/src/components/pharmacy/orders/pharmacy-orders.component.tsx +35 -13
  350. package/src/components/pharmacy/orders/pharmacy-orders.test.tsx +8 -7
  351. package/src/components/pharmacy/pharmacy-tabs.component.tsx +4 -20
  352. package/src/components/pharmacy/tabs/index.ts +21 -0
  353. package/src/components/preauth/index.ts +22 -0
  354. package/src/components/preauth/preauth-dashboard.component.tsx +20 -0
  355. package/src/components/procedures/index.ts +27 -10
  356. package/src/components/procedures/procedure-queues/index.ts +13 -0
  357. package/src/components/procedures/procedure-queues/procedure-form-extras.component.tsx +33 -0
  358. package/src/components/procedures/procedure-queues/procedure-form-extras.scss +5 -0
  359. package/src/components/procedures/procedure-queues/procedure-queues.component.tsx +35 -0
  360. package/src/components/procedures/procedure-queues/procedure-queues.resources.ts +37 -0
  361. package/src/components/procedures/procedure-queues/procedure-room-tabs.component.tsx +80 -0
  362. package/src/components/procedures/procedure-queues/procedure-rooms.scss +13 -0
  363. package/src/components/procedures/procedure-queues/queue-procedure-tabs.component.tsx +34 -0
  364. package/src/components/procedures/procedure-queues/summary-cards.component.tsx +81 -0
  365. package/src/components/procedures/procedure-queues/summary-cards.scss +35 -0
  366. package/src/components/procedures/procedures-table.component.tsx +69 -19
  367. package/src/components/procedures/procedures-tabs.component.test.tsx +57 -0
  368. package/src/components/procedures/procedures-tabs.component.tsx +3 -18
  369. package/src/components/radiology-and-imaging/index.ts +25 -10
  370. package/src/components/radiology-and-imaging/radiology-and-imaging-table.component.tsx +62 -21
  371. package/src/components/radiology-and-imaging/radiology-and-imaging.component.tsx +3 -19
  372. package/src/components/registration/card/HIE-card/hie-card.component.tsx +32 -44
  373. package/src/components/registration/card/Local-card/local-card.component.tsx +22 -24
  374. package/src/components/registration/checkin-form-extra/checkin-form-extra.extension.tsx +8 -2
  375. package/src/components/registration/checkin-form-extra/queue-fields.component.tsx +18 -19
  376. package/src/components/registration/dependants/dependants.component.tsx +37 -60
  377. package/src/components/registration/dependants/dependants.resource.ts +79 -50
  378. package/src/components/registration/end-visit-modal/end-visit-dialog.modal.tsx +320 -0
  379. package/src/components/registration/end-visit-modal/end-visit-dialog.scss +12 -0
  380. package/src/components/registration/end-visit-modal/end-visit.resource.tsx +59 -0
  381. package/src/components/registration/end-visit-modal/sha-end-visit.resource.ts +285 -0
  382. package/src/components/registration/helper/index.ts +4 -0
  383. package/src/components/registration/index.ts +10 -9
  384. package/src/components/registration/search-bar/search-bar.resource.ts +32 -93
  385. package/src/components/registration/start-visit-form/hooks/useDefaultFacilityLocation.tsx +15 -0
  386. package/src/components/registration/start-visit-form/hooks/useDefaultVisitLocation.tsx +24 -0
  387. package/src/components/registration/start-visit-form/hooks/useOfflineVisitType.tsx +18 -0
  388. package/src/components/registration/start-visit-form/hooks/useRecommendedVisitTypes.tsx +36 -0
  389. package/src/components/registration/start-visit-form/hooks/useVisitAttributeType.tsx +102 -0
  390. package/src/components/registration/start-visit-form/overflow-menu-extension/custom-end-active-visit.extension.tsx +44 -0
  391. package/src/components/registration/start-visit-form/overflow-menu-extension/overflow-menu-item.extension.tsx +57 -0
  392. package/src/components/registration/start-visit-form/overflow-menu-extension/overflow-menu-item.scss +3 -0
  393. package/src/components/registration/start-visit-form/start-visit-workspace/base-visit-type.component.tsx +126 -0
  394. package/src/components/registration/start-visit-form/start-visit-workspace/base-visit-type.scss +75 -0
  395. package/src/components/registration/start-visit-form/start-visit-workspace/exported-visit-form.workspace.tsx +759 -0
  396. package/src/components/registration/start-visit-form/start-visit-workspace/location-selector.component.tsx +86 -0
  397. package/src/components/registration/start-visit-form/start-visit-workspace/recommended-visit-type.component.tsx +32 -0
  398. package/src/components/registration/start-visit-form/start-visit-workspace/visit-attribute-type.component.tsx +257 -0
  399. package/src/components/registration/start-visit-form/start-visit-workspace/visit-attribute-type.scss +5 -0
  400. package/src/components/registration/start-visit-form/start-visit-workspace/visit-date-time.component.tsx +193 -0
  401. package/src/components/registration/start-visit-form/start-visit-workspace/visit-form.resource.ts +389 -0
  402. package/src/components/registration/start-visit-form/start-visit-workspace/visit-form.scss +144 -0
  403. package/src/components/registration/start-visit-form/visit-form-workspace/visit-form.workspace.tsx +48 -0
  404. package/src/components/registration/type/index.ts +101 -0
  405. package/src/components/reports/index.ts +11 -9
  406. package/src/components/triage/dashboard.component.tsx +0 -2
  407. package/src/components/triage/index.ts +10 -9
  408. package/src/components/triage/triage.component.tsx +92 -42
  409. package/src/components/triage/triage.resource.ts +56 -50
  410. package/src/components/triage/triage.scss +6 -0
  411. package/src/config-schema.ts +482 -0
  412. package/src/hooks/useOrders.tsx +2 -2
  413. package/src/hooks/useServiceQueues.tsx +95 -25
  414. package/src/index.ts +84 -28
  415. package/src/routes.json +290 -32
  416. package/src/shared/dashboard-link/dashboard-link.component.tsx +11 -8
  417. package/src/shared/orders/OrderTable.tsx +19 -3
  418. package/src/shared/otp-verification/index.ts +112 -29
  419. package/src/shared/otp-verification/otp-verification.modal.tsx +1110 -122
  420. package/src/shared/otp-verification/otp-verification.scss +374 -0
  421. package/src/shared/patient-chart/patient-summary-dashboard/patient-summary-dashboard.component.tsx +5 -85
  422. package/src/shared/pin-put/pinput.component.test.tsx +7 -6
  423. package/src/shared/queue/queue-entry/queue-entry-table.component.tsx +99 -88
  424. package/src/shared/queue/queue-entry/queue-entry-table.scss +4 -0
  425. package/src/shared/queue/queue-summary-cards.component.tsx +32 -0
  426. package/src/shared/queue/queue-tab.component.tsx +182 -70
  427. package/src/shared/queue/queue-tab.scss +1 -0
  428. package/src/shared/queue/queue-workflow-context.tsx +90 -0
  429. package/src/shared/tabs/create-tab-extension.tsx +33 -0
  430. package/src/shared/tabs/extension-tabs.component.tsx +51 -30
  431. package/src/shared/utils/index.ts +119 -5
  432. package/src/types/index.ts +29 -2
  433. package/translations/am.json +426 -133
  434. package/translations/en.json +312 -19
  435. package/translations/fr.json +351 -63
  436. package/translations/sw.json +330 -37
  437. package/dist/127.js +0 -1
  438. package/dist/200.js +0 -1
  439. package/dist/200.js.map +0 -1
  440. package/dist/24.js +0 -1
  441. package/dist/24.js.map +0 -1
  442. package/dist/267.js +0 -1
  443. package/dist/267.js.map +0 -1
  444. package/dist/285.js +0 -1
  445. package/dist/285.js.map +0 -1
  446. package/dist/329.js +0 -1
  447. package/dist/329.js.map +0 -1
  448. package/dist/40.js +0 -1
  449. package/dist/466.js +0 -1
  450. package/dist/466.js.map +0 -1
  451. package/dist/472.js +0 -66
  452. package/dist/472.js.map +0 -1
  453. package/dist/490.js +0 -1
  454. package/dist/490.js.map +0 -1
  455. package/dist/54.js +0 -1
  456. package/dist/54.js.map +0 -1
  457. package/dist/689.js +0 -1
  458. package/dist/689.js.map +0 -1
  459. package/dist/697.js +0 -1
  460. package/dist/697.js.map +0 -1
  461. package/dist/704.js +0 -1
  462. package/dist/704.js.map +0 -1
  463. package/dist/710.js +0 -1
  464. package/dist/710.js.map +0 -1
  465. package/dist/729.js +0 -17
  466. package/dist/729.js.map +0 -1
  467. package/dist/805.js +0 -37
  468. package/dist/805.js.map +0 -1
  469. package/dist/847.js +0 -1
  470. package/dist/847.js.map +0 -1
  471. package/dist/85.js +0 -1
  472. package/dist/85.js.map +0 -1
  473. package/dist/882.js +0 -1
  474. package/dist/91.js +0 -1
  475. package/dist/91.js.map +0 -1
  476. package/dist/916.js +0 -1
  477. package/dist/994.js +0 -1
  478. package/dist/994.js.map +0 -1
  479. package/dist/998.js +0 -1
  480. package/dist/998.js.map +0 -1
  481. package/jest.config.js +0 -3
  482. package/src/shared/orders/OrdersTabs.tsx +0 -58
  483. package/src/shared/patient-chart/patient-chart.component.tsx +0 -61
  484. package/src/shared/patient-chart/patient-chart.resources.ts +0 -184
  485. package/src/shared/patient-chart/patient-chart.scss +0 -15
  486. package/src/shared/patient-chart/useInitialize.ts +0 -24
  487. /package/src/shared/{patient-chart/patient-summary-dashboard → tabs}/patient-summary-dashboard.scss +0 -0
@@ -11,23 +11,26 @@ export interface LinkConfig {
11
11
  name: string;
12
12
  title: string;
13
13
  icon?: string | CarbonIconType;
14
+ basePath?: string;
14
15
  }
15
16
 
16
- export function LinkExtension({ config }: { config: LinkConfig }) {
17
+ export function LinkExtension({ config }: { readonly config: LinkConfig }) {
17
18
  const { t } = useTranslation();
18
- const { name, title, icon } = config;
19
+ const { name, title, icon, basePath = 'home' } = config;
19
20
  const nameSegment = name.split('/').at(-1);
20
21
  const location = useLocation();
21
- const spaBasePath = window.getOpenmrsSpaBase() + 'home';
22
+ const spaBasePath = window.getOpenmrsSpaBase() + basePath;
22
23
 
23
- let urlSegment = useMemo(() => decodeURIComponent(last(location.pathname.split('/'))), [location.pathname]);
24
- const IconComp = typeof icon !== 'string' ? (icon as CarbonIconType) : null;
24
+ let urlSegment = useMemo(() => decodeURIComponent(last(location.pathname.split('/')) || ''), [location.pathname]);
25
+ const IconComp = typeof icon === 'string' ? null : icon;
26
+
27
+ const url = spaBasePath + '/' + name;
28
+
29
+ const cleanUrl = url.replaceAll(/(?<!:)\/\//g, '/');
25
30
 
26
31
  const isActive = nameSegment === urlSegment;
27
32
  return (
28
- <ConfigurableLink
29
- to={spaBasePath + '/' + name}
30
- className={`cds--side-nav__link ${isActive && 'active-left-nav-link'}`}>
33
+ <ConfigurableLink to={cleanUrl} className={`cds--side-nav__link ${isActive && 'active-left-nav-link'}`}>
31
34
  {typeof icon === 'string' ? (
32
35
  <MaybeIcon icon={icon} className={styles.icon} size={16} />
33
36
  ) : (
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { DataTable, Table, TableHead, TableRow, TableHeader, TableBody, TableCell, Layer, Button } from '@carbon/react';
3
3
  import { Add } from '@carbon/react/icons';
4
4
  import { useTranslation } from 'react-i18next';
5
- import { parseDate, formatDatetime } from '@openmrs/esm-framework';
5
+ import { parseDate, formatDatetime, translateFrom, OpenmrsResource } from '@openmrs/esm-framework';
6
6
  import { PriorityPill, StatusPill } from './OrderPills';
7
7
  import { type Order } from '../../types/order/order';
8
8
  import { CardHeader } from '@openmrs/esm-patient-common-lib';
@@ -15,12 +15,14 @@ type OrderTableProps = {
15
15
  tableCellClassName: string;
16
16
  priorityPillClassName: string;
17
17
  statusPillClassName: string;
18
+ module: string;
18
19
  };
19
20
 
20
21
  const defaultHeaders = (t: (k: string, d: string) => string) => [
21
22
  { header: t('orderNo', 'Order No'), key: 'orderNo' },
22
23
  { header: t('dateOrdered', 'Date Ordered'), key: 'dateOrdered' },
23
24
  { header: t('order', 'Order'), key: 'order' },
25
+ { header: t('orderReason', 'Order reason'), key: 'orderReason' },
24
26
  { header: t('priority', 'Priority'), key: 'priority' },
25
27
  { header: t('orderBy', 'Order By'), key: 'orderBy' },
26
28
  { header: t('status', 'Status'), key: 'status' },
@@ -34,6 +36,7 @@ export const OrderTable: React.FC<OrderTableProps> = ({
34
36
  tableCellClassName,
35
37
  priorityPillClassName,
36
38
  statusPillClassName,
39
+ module,
37
40
  }) => {
38
41
  const { t } = useTranslation();
39
42
 
@@ -42,9 +45,22 @@ export const OrderTable: React.FC<OrderTableProps> = ({
42
45
  orderNo: order.orderNumber,
43
46
  dateOrdered: formatDatetime(parseDate(order.dateActivated), { mode: 'standard' }),
44
47
  order: order.concept?.display?.replace('_', ' ') ?? '--',
45
- priority: <PriorityPill value={order.urgency} className={priorityPillClassName} dataAttrName="priority" />,
48
+ priority: (
49
+ <PriorityPill
50
+ value={translateFrom(module, order.urgency, order.urgency)}
51
+ className={priorityPillClassName}
52
+ dataAttrName="priority"
53
+ />
54
+ ),
46
55
  orderBy: order.orderer?.display ?? '--',
47
- status: <StatusPill value={order.fulfillerStatus} className={statusPillClassName} dataAttrName="status" />,
56
+ orderReason: (order.orderReason as unknown as OpenmrsResource)?.display,
57
+ status: (
58
+ <StatusPill
59
+ value={translateFrom(module, order.fulfillerStatus, order.fulfillerStatus)}
60
+ className={statusPillClassName}
61
+ dataAttrName="status"
62
+ />
63
+ ),
48
64
  }));
49
65
 
50
66
  if (orders?.length === 0) {
@@ -3,7 +3,36 @@ import { default as otpVerificationModal } from './otp-verification.modal';
3
3
  import { type ModalSize } from '@carbon/react/lib/components/Modal/Modal';
4
4
 
5
5
  /**
6
- * Options for configuring the OTP Verification modal.
6
+ * Result returned by onStartBiometric — the caller's `/biometric-authorize`
7
+ * handler resolves with this shape so the modal knows the embed URL to render
8
+ * and the auth code to round-trip on success.
9
+ */
10
+ export type BiometricStartResult = {
11
+ embed_url: string;
12
+ authorization_code: string;
13
+ consent_token: string;
14
+ };
15
+
16
+ /**
17
+ * Result handed to onBiometricSuccess when the iframe's eKYC capture completes
18
+ * successfully (postMessage from the eKYC origin).
19
+ */
20
+ export type BiometricSuccessResult = {
21
+ authorization_code: string;
22
+ consent_token: string;
23
+ };
24
+
25
+ /**
26
+ * Options for configuring the OTP / Secure Patient Authentication modal.
27
+ *
28
+ * The modal supports two operating modes:
29
+ *
30
+ * 1. **otp-only** (default, backward compatible) — opens directly into the
31
+ * existing OTP confirm-phone screen. Use this when the only auth path is OTP.
32
+ * All existing consumers don't need to change.
33
+ *
34
+ * 2. **multi** — opens an auth landing screen with three options: biometric,
35
+ * OTP, or whitelist request. The available options depend on `whitelistedForOTP`.
7
36
  *
8
37
  * @property {number} [otpLength] - The number of digits required for the OTP. Defaults to implementation-specific value.
9
38
  * @property {(otp: string) => Promise<void>} [onVerify] - Callback invoked when the user submits the OTP. Should return a promise that resolves on successful verification.
@@ -15,35 +44,61 @@ import { type ModalSize } from '@carbon/react/lib/components/Modal/Modal';
15
44
  * @property {number} [expiryMinutes] - The number of minutes after which the OTP expires. Defaults to 5 minutes. This is displayed to the user for clarity.
16
45
  * @property {() => void} [onCleanup] - Callback invoked when the modal closes to clean up OTP resources.
17
46
  *
47
+ * @property {'otp-only' | 'multi'} [authMode] - When 'multi', shows the auth-landing method picker first (Biometric / OTP / Whitelist). When 'otp-only' or undefined, opens directly to the existing OTP landing.
48
+ * @property {boolean} [whitelistedForOTP] - Whether the patient is approved for OTP whitelist bypass. Drives method picker layout and post-failure recovery options.
49
+ * @property {() => Promise<BiometricStartResult>} [onStartBiometric] - Called when the user picks biometric. Should resolve with the embed_url + auth code from /biometric-authorize.
50
+ * @property {(result: BiometricSuccessResult) => void} [onBiometricSuccess] - Called on successful biometric capture (iframe postMessage SUCCESS).
51
+ * @property {(consentToken: string | null) => void} [onBiometricCancel] - Called when biometric session is cancelled (user closes, timer expires). Backend's /biometric-cancel goes here.
52
+ * @property {() => void} [onRequestWhitelist] - Called when the user clicks "Request OTP Whitelisting" — parent should open the whitelist submission flow.
53
+ * @property {() => void} [onRejected] - Called when the user clicks "Reject" on the auth landing — visit proceeds without consent (administrative override).
54
+ * @property {string} [ekycOrigin] - Expected origin of the eKYC iframe's postMessage events for security validation. Defaults to https://test.ekyc.pesaflow.com.
55
+ *
56
+ * @example
57
+ * // OTP-only mode (existing behavior, unchanged)
58
+ * launchOtpVerificationModal({
59
+ * otpLength: 6,
60
+ * phoneNumber: '254700000000',
61
+ * onRequestOtp: async (phone) => sendSHAOtp(crId, codes),
62
+ * onVerify: async (otp) => createSHAVirtualClaim(crId, otp, ...),
63
+ * onVerificationSuccess: () => console.log('verified'),
64
+ * });
65
+ *
18
66
  * @example
19
- * <Button
20
- * onClick={() =>
21
- * launchOtpVerificationModal({
22
- * otpLength: 4,
23
- * obscureText: false,
24
- * phoneNumber: '254700000000',
25
- * expiryMinutes: 10, // OTP expires in 10 minutes
26
- * onRequestOtp: (phone) =>
27
- * new Promise((resolve, reject) => {
28
- * const success = true;
29
- * setTimeout(() => (success ? resolve() : reject(new Error('Some error'))), 3000);
30
- * }),
31
- * onVerify: async (otp) =>
32
- * new Promise((resolve, reject) => {
33
- * const success = true;
34
- * setTimeout(() => (success ? resolve() : reject(new Error('Some error'))), 3000);
35
- * }),
36
- * onCleanup: () => {
37
- * // Clean up OTP resources
38
- * otpManager.cleanupExpiredOTPs();
39
- * },
40
- * })
41
- * }
42
- * >
43
- * Launch OTP verification Modal
44
- * </Button>
67
+ * // Multi-method auth mode (biometric + OTP + whitelist)
68
+ * launchOtpVerificationModal({
69
+ * authMode: 'multi',
70
+ * whitelistedForOTP: patient.whitelisted_for_otp ?? false,
71
+ * phoneNumber: '254700000000',
72
+ *
73
+ * // OTP wiring
74
+ * onRequestOtp: async (phone) => sendSHAOtp(crId, codes),
75
+ * onVerify: async (otp) => createSHAVirtualClaim(crId, otp, ...),
76
+ * onVerificationSuccess: () => { ... },
77
+ *
78
+ * // Biometric wiring
79
+ * onStartBiometric: async () => {
80
+ * const res = await createSHABiometricAuthorize({ ... });
81
+ * if (!res.success || !res.embed_url) throw new Error(res.error);
82
+ * return {
83
+ * embed_url: res.embed_url,
84
+ * authorization_code: res.authorization_code!,
85
+ * consent_token: res.consent_token!,
86
+ * };
87
+ * },
88
+ * onBiometricSuccess: (result) => {
89
+ * shaClaimResponseRef.current = result;
90
+ * },
91
+ * onBiometricCancel: async (consentToken) => {
92
+ * if (consentToken) await cancelBiometricSession(consentToken);
93
+ * },
94
+ *
95
+ * // Escape paths
96
+ * onRequestWhitelist: () => launchWhitelistSubmissionModal({ patientCRId }),
97
+ * onRejected: () => markVisitProceedingWithoutConsent(),
98
+ * });
45
99
  */
46
100
  export type OTPVerificationModalOptions = {
101
+ // ── existing OTP props ──
47
102
  otpLength?: number;
48
103
  onVerify?: (otp: string) => Promise<void>;
49
104
  obscureText?: boolean;
@@ -54,12 +109,40 @@ export type OTPVerificationModalOptions = {
54
109
  expiryMinutes?: number;
55
110
  size?: ModalSize;
56
111
  onCleanup?: () => void;
112
+
113
+ // ── new multi-method auth props ──
114
+ /** When 'multi', shows the auth-landing method picker first. Defaults to 'otp-only'. */
115
+ authMode?: 'otp-only' | 'multi';
116
+
117
+ /** Whether the patient is approved for OTP whitelist bypass. */
118
+ whitelistedForOTP?: boolean;
119
+
120
+ /** Called when user picks biometric. Resolve with embed_url + auth code. */
121
+ onStartBiometric?: () => Promise<BiometricStartResult>;
122
+
123
+ /** Called on successful biometric capture (postMessage SUCCESS from eKYC). */
124
+ onBiometricSuccess?: (result: BiometricSuccessResult) => void;
125
+
126
+ /** Called when biometric session is cancelled. Wire to backend /biometric-cancel. */
127
+ onBiometricCancel?: (consentToken: string | null) => void;
128
+
129
+ /** Called when user clicks "Request OTP Whitelisting". */
130
+ onRequestWhitelist?: () => void;
131
+
132
+ /** Called when user clicks "Reject" — visit proceeds without consent. */
133
+ onRejected?: () => void;
134
+
135
+ /** Expected origin of eKYC postMessage events. Defaults to https://test.ekyc.pesaflow.com. */
136
+ ekycOrigin?: string;
137
+
138
+ /** Whether this modal is being used to start or end a visit. Defaults to 'start'. Affects progress message text. */
139
+ visitAction?: 'start' | 'end';
57
140
  };
58
141
 
59
142
  /**
60
- * Launch the OTP verification modal with the provided options
143
+ * Launch the OTP / Secure Patient Authentication modal with the provided options.
61
144
  *
62
- * @param props - Configuration options for the OTP verification modal
145
+ * @param props - Configuration options for the modal
63
146
  * @returns A dispose function to close the modal programmatically
64
147
  */
65
148
  export const launchOtpVerificationModal = (props: OTPVerificationModalOptions) => {