@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
@@ -0,0 +1,1349 @@
1
+ // Utility: Map contraction level UUID to label
2
+ export function contractionLevelUuidToLabel(uuid: string): string {
3
+ switch (uuid) {
4
+ case '1107AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA':
5
+ return 'none';
6
+ case '1498AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA':
7
+ return 'mild';
8
+ case '1499AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA':
9
+ return 'moderate';
10
+ case '166788AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA':
11
+ return 'strong';
12
+ default:
13
+ return uuid;
14
+ }
15
+ }
16
+ // Utility: Map urine test label/plus to UUID
17
+ export function labelToUuid(label: string): string {
18
+ switch (label) {
19
+ case '0':
20
+ return '1107AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
21
+ case '+':
22
+ return '1362AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
23
+ case '++':
24
+ return '1363AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
25
+ case '+++':
26
+ return '1364AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
27
+ default:
28
+ return label;
29
+ }
30
+ }
31
+ // Uterine Contraction Level UUID Map (for forms and lookups)
32
+ export const contractionLevelUuidMap: Record<string, string> = {
33
+ none: '1107AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
34
+ mild: '1498AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
35
+ moderate: '1499AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
36
+ strong: '166788AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
37
+ };
38
+ export function getValidEncounterDatetime(): string {
39
+ const now = new Date();
40
+ now.setMinutes(now.getMinutes() - 4);
41
+ return now.toISOString();
42
+ }
43
+ export const URINE_TEST_TIME_SLOT_CONCEPT = 'bb3724c9-fbcc-49c5-9702-6cde0be325ca';
44
+
45
+ export const contractionLevelOptions = [
46
+ {
47
+ value: 'none',
48
+ labelKey: 'noContractions',
49
+ defaultLabel: 'No Contractions',
50
+ concept: '1107AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
51
+ visual: '0',
52
+ visualClass: 'none',
53
+ titleKey: 'none',
54
+ defaultTitle: 'None',
55
+ },
56
+ {
57
+ value: 'mild',
58
+ labelKey: 'mildContractions',
59
+ defaultLabel: 'Mild Contractions',
60
+ concept: '1498AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
61
+ visual: '1',
62
+ visualClass: 'mild',
63
+ titleKey: 'mild',
64
+ defaultTitle: 'Mild',
65
+ },
66
+ {
67
+ value: 'moderate',
68
+ labelKey: 'moderateContractions',
69
+ defaultLabel: 'Moderate Contractions',
70
+ concept: '1499AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
71
+ visual: '2',
72
+ visualClass: 'moderate',
73
+ titleKey: 'moderate',
74
+ defaultTitle: 'Moderate',
75
+ },
76
+ {
77
+ value: 'strong',
78
+ labelKey: 'strongContractions',
79
+ defaultLabel: 'Strong Contractions',
80
+ concept: '4b90b73a-ad11-4650-91b0-baea131974e0',
81
+ visual: '3',
82
+ visualClass: 'strong',
83
+ title: 'Strong',
84
+ },
85
+ ];
86
+ import {
87
+ configSchema,
88
+ MOULDING_NONE_CONCEPT,
89
+ MOULDING_SLIGHT_CONCEPT,
90
+ MOULDING_MODERATE_CONCEPT,
91
+ MOULDING_SEVERE_CONCEPT,
92
+ CERVIX_CONCEPT,
93
+ FETAL_HEART_RATE_CONCEPT,
94
+ FETAL_HEART_RATE_HOUR_CONCEPT,
95
+ DESCENT_OF_HEAD_CONCEPT,
96
+ UTERINE_CONTRACTIONS_CONCEPT,
97
+ UTERINE_CONTRACTION_FREQUENCY_CONCEPT,
98
+ UTERINE_CONTRACTION_DURATION_CONCEPT,
99
+ MATERNAL_PULSE_CONCEPT,
100
+ ROUTE_CONCEPT,
101
+ FREQUENCY_CONCEPT,
102
+ SYSTOLIC_BP_CONCEPT,
103
+ DIASTOLIC_BP_CONCEPT,
104
+ TEMPERATURE_CONCEPT,
105
+ PROTEIN_LEVEL_CONCEPT,
106
+ GLUCOSE_LEVEL_CONCEPT,
107
+ KETONE_LEVEL_CONCEPT,
108
+ URINE_VOLUME_CONCEPT,
109
+ CONTRACTION_COUNT_CONCEPT,
110
+ URINE_CHARACTERISTICS_CONCEPT,
111
+ MEDICATION_CONCEPT,
112
+ MEDICATION_NAME_CONCEPT,
113
+ OXYTOCIN_DOSE_CONCEPT,
114
+ IV_FLUIDS_CONCEPT,
115
+ DOSAGE_CONCEPT,
116
+ DRUG_DOSE_CONCEPT,
117
+ EVENT_TYPE_CONCEPT,
118
+ EVENT_DESCRIPTION_CONCEPT,
119
+ AMNIOTIC_FLUID_CONCEPT,
120
+ MOULDING_CONCEPT,
121
+ BLOOD_GROUP_CONCEPT,
122
+ TIME_SLOT_CONCEPT,
123
+ LABOR_PATTERN_CONCEPT,
124
+ HOURS_SINCE_RUPTURE_CONCEPT,
125
+ RUPTURED_MEMBRANES_CONCEPT,
126
+ DATE_OF_ADMISSION_CONCEPT,
127
+ GESTATION_WEEKS_CONCEPT,
128
+ ESTIMATED_DELIVERY_DATE_CONCEPT,
129
+ LAST_MENSTRUAL_PERIOD_CONCEPT,
130
+ AMNIOTIC_CLEAR_LIQUOR_CONCEPT,
131
+ AMNIOTIC_MECONIUM_STAINED_CONCEPT,
132
+ AMNIOTIC_ABSENT_CONCEPT,
133
+ AMNIOTIC_BLOOD_STAINED_CONCEPT,
134
+ STATION_0_CONCEPT,
135
+ STATION_1_CONCEPT,
136
+ STATION_2_CONCEPT,
137
+ STATION_3_CONCEPT,
138
+ STATION_4_CONCEPT,
139
+ STATION_5_CONCEPT,
140
+ PULSE_BP_TIME_CONCEPT,
141
+ FETAL_HEART_RATE_TIME_CONCEPT,
142
+ CONTRACTION_LEVEL_MILD_CONCEPT,
143
+ CONTRACTION_LEVEL_MODERATE_CONCEPT,
144
+ CONTRACTION_LEVEL_STRONG_CONCEPT,
145
+ OXYTOCIN_DROPS_PER_MINUTE_CONCEPT,
146
+ OXYTOCIN_TIME_CONCEPT,
147
+ } from '../../../config-schema';
148
+
149
+ const _CODE_TO_PLUS_MAP: Record<string, string> = {
150
+ [MOULDING_NONE_CONCEPT]: '0',
151
+ '0': '0',
152
+ [MOULDING_SLIGHT_CONCEPT]: '+',
153
+ '+': '+',
154
+ [MOULDING_MODERATE_CONCEPT]: '++',
155
+ '++': '++',
156
+ [MOULDING_SEVERE_CONCEPT]: '+++',
157
+ '+++': '+++',
158
+ NEGATIVE: '0',
159
+ ZERO: '0',
160
+ 'ONE PLUS': '+',
161
+ '1+': '+',
162
+ 'TWO PLUS': '++',
163
+ '2+': '++',
164
+ 'THREE PLUS': '+++',
165
+ '3+': '+++',
166
+ TRACE: '+/-',
167
+ '+/-': '+/-',
168
+ };
169
+
170
+ export const codeToPlus = (raw?: string): string => {
171
+ const key = (raw ?? '').toString().trim().toUpperCase();
172
+ return _CODE_TO_PLUS_MAP[key] ?? raw ?? '';
173
+ };
174
+ const _partoConcepts = (configSchema as any)?.partography?._default?.conceptUuids ?? {};
175
+
176
+ export const PARTOGRAPHY_CONCEPTS = {
177
+ cervix: _partoConcepts.cervix ?? CERVIX_CONCEPT,
178
+ 'fetal-heart-rate': _partoConcepts['fetal-heart-rate'] ?? FETAL_HEART_RATE_CONCEPT,
179
+ 'fetal-heart-rate-hour': _partoConcepts['fetal-heart-rate-hour'] ?? FETAL_HEART_RATE_HOUR_CONCEPT,
180
+ 'fetal-heart-rate-time': _partoConcepts['fetal-heart-rate-time'] ?? FETAL_HEART_RATE_TIME_CONCEPT,
181
+
182
+ 'cervical-dilation': _partoConcepts['cervical-dilation'] ?? CERVIX_CONCEPT,
183
+ 'descent-of-head': _partoConcepts['descent-of-head'] ?? DESCENT_OF_HEAD_CONCEPT,
184
+ 'uterine-contractions': _partoConcepts['uterine-contractions'] ?? UTERINE_CONTRACTIONS_CONCEPT,
185
+ 'uterine-contraction-frequency':
186
+ _partoConcepts['uterine-contraction-frequency'] ?? UTERINE_CONTRACTION_FREQUENCY_CONCEPT,
187
+ 'uterine-contraction-duration':
188
+ _partoConcepts['uterine-contraction-duration'] ?? UTERINE_CONTRACTION_DURATION_CONCEPT,
189
+ 'maternal-pulse': _partoConcepts['maternal-pulse'] ?? MATERNAL_PULSE_CONCEPT,
190
+ 'systolic-bp': _partoConcepts['systolic-bp'] ?? SYSTOLIC_BP_CONCEPT,
191
+ 'diastolic-bp': _partoConcepts['diastolic-bp'] ?? DIASTOLIC_BP_CONCEPT,
192
+ temperature: _partoConcepts.temperature ?? TEMPERATURE_CONCEPT,
193
+ 'protein-level': _partoConcepts['protein-level'] ?? PROTEIN_LEVEL_CONCEPT,
194
+ 'glucose-level': _partoConcepts['glucose-level'] ?? GLUCOSE_LEVEL_CONCEPT,
195
+ 'ketone-level': _partoConcepts['ketone-level'] ?? KETONE_LEVEL_CONCEPT,
196
+ 'urine-volume': _partoConcepts['urine-volume'] ?? URINE_VOLUME_CONCEPT,
197
+ 'contraction-count': _partoConcepts['contraction-count'] ?? CONTRACTION_COUNT_CONCEPT,
198
+ 'urine-characteristics': _partoConcepts['urine-characteristics'] ?? URINE_CHARACTERISTICS_CONCEPT,
199
+ medication: _partoConcepts.medication ?? MEDICATION_CONCEPT,
200
+ 'medication-name': _partoConcepts['medication-name'] ?? MEDICATION_NAME_CONCEPT,
201
+ 'oxytocin-dose': _partoConcepts['oxytocin-dose'] ?? OXYTOCIN_DOSE_CONCEPT,
202
+ 'iv-fluids': _partoConcepts['iv-fluids'] ?? IV_FLUIDS_CONCEPT,
203
+ dosage: _partoConcepts.dosage ?? DOSAGE_CONCEPT,
204
+ route: _partoConcepts.route ?? ROUTE_CONCEPT,
205
+ frequency: _partoConcepts.frequency ?? FREQUENCY_CONCEPT,
206
+ 'drug-dose': _partoConcepts['drug-dose'] ?? DRUG_DOSE_CONCEPT,
207
+ 'event-type': _partoConcepts['event-type'] ?? EVENT_TYPE_CONCEPT,
208
+ 'event-description': _partoConcepts['event-description'] ?? EVENT_DESCRIPTION_CONCEPT,
209
+ 'amniotic-fluid': _partoConcepts['amniotic-fluid'] ?? AMNIOTIC_FLUID_CONCEPT,
210
+ moulding: _partoConcepts.moulding ?? MOULDING_CONCEPT,
211
+ 'blood-group': _partoConcepts['blood-group'] ?? BLOOD_GROUP_CONCEPT,
212
+ 'time-slot': _partoConcepts['time-slot'] ?? TIME_SLOT_CONCEPT,
213
+ 'pulse-time-slot': _partoConcepts['pulse-time-slot'] ?? PULSE_BP_TIME_CONCEPT,
214
+ 'labor-pattern': _partoConcepts['labor-pattern'] ?? LABOR_PATTERN_CONCEPT,
215
+ 'hours-since-rupture': _partoConcepts['hours-since-rupture'] ?? HOURS_SINCE_RUPTURE_CONCEPT,
216
+ 'ruptured-membranes': _partoConcepts['ruptured-membranes'] ?? RUPTURED_MEMBRANES_CONCEPT,
217
+ 'date-of-admission': _partoConcepts['date-of-admission'] ?? DATE_OF_ADMISSION_CONCEPT,
218
+ 'gestation-weeks': _partoConcepts['gestation-weeks'] ?? GESTATION_WEEKS_CONCEPT,
219
+ 'estimated-delivery-date': _partoConcepts['estimated-delivery-date'] ?? ESTIMATED_DELIVERY_DATE_CONCEPT,
220
+ 'last-menstrual-period': _partoConcepts['last-menstrual-period'] ?? LAST_MENSTRUAL_PERIOD_CONCEPT,
221
+ } as const;
222
+
223
+ const _partoUuids = (configSchema as any)?.partography?._default?.uuids ?? {};
224
+
225
+ export const MCH_PARTOGRAPHY_ENCOUNTER_UUID =
226
+ _partoUuids.mchPartographyEncounterUuid ?? 'd14dde5b-95dc-40a1-8ff0-acad34fb58b2';
227
+
228
+ export const CONTRACTION_STRONG_UUID =
229
+ _partoUuids.contractionStrongConceptUuid ?? '4b90b73a-ad11-4650-91b0-baea131974e0';
230
+
231
+ export const SURGICAL_PROCEDURE_UUID = '1810AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
232
+
233
+ export const PARTOGRAPHY_GRAPH_TYPES = [
234
+ 'cervix',
235
+ 'fetal-heart-rate',
236
+ 'cervical-dilation',
237
+ 'descent-of-head',
238
+ 'uterine-contractions',
239
+ 'maternal-pulse',
240
+ 'blood-pressure',
241
+ 'pulse-bp-combined',
242
+ 'temperature',
243
+ 'urine-analysis',
244
+ 'drugs-fluids',
245
+ 'progress-events',
246
+ 'post-operative-summary',
247
+ ] as const;
248
+
249
+ export const POST_OPERATIVE_SUMMARY_ENCOUNTER_UUID = 'd14dde5b-95dc-40a1-8ff0-acad34fb58b2';
250
+
251
+ export const PARTOGRAPHY_ENCOUNTER_TYPES = {
252
+ ...Object.fromEntries(
253
+ PARTOGRAPHY_GRAPH_TYPES.filter((type) => type !== 'post-operative-summary').map((type) => [
254
+ type,
255
+ MCH_PARTOGRAPHY_ENCOUNTER_UUID,
256
+ ]),
257
+ ),
258
+ 'post-operative-summary': POST_OPERATIVE_SUMMARY_ENCOUNTER_UUID,
259
+ } as Record<(typeof PARTOGRAPHY_GRAPH_TYPES)[number], string>;
260
+
261
+ export interface OpenMRSResponse<T> {
262
+ results: T[];
263
+ }
264
+
265
+ export interface PartographyObservation {
266
+ uuid: string;
267
+ concept: {
268
+ uuid: string;
269
+ display: string;
270
+ };
271
+ value: string | number;
272
+ obsDatetime: string;
273
+ encounter: {
274
+ uuid: string;
275
+ encounterType: {
276
+ uuid: string;
277
+ display: string;
278
+ };
279
+ };
280
+ }
281
+
282
+ export interface PartographyEncounter {
283
+ uuid: string;
284
+ encounterDatetime: string;
285
+ encounterType: {
286
+ uuid: string;
287
+ display: string;
288
+ };
289
+ obs: PartographyObservation[];
290
+ }
291
+
292
+ export type PartographyGraphType = keyof typeof PARTOGRAPHY_ENCOUNTER_TYPES;
293
+
294
+ export interface PartographyGraph {
295
+ id: PartographyGraphType;
296
+ titleKey: string;
297
+ titleDefault: string;
298
+ descriptionKey: string;
299
+ descriptionDefault: string;
300
+ yAxisLabel: string;
301
+ normalRange: string;
302
+ color: string;
303
+ yMin: number;
304
+ yMax: number;
305
+ }
306
+
307
+ export const PARTOGRAPHY_UNITS = {
308
+ cervix: 'cm',
309
+ 'fetal-heart-rate': 'BPM',
310
+ 'cervical-dilation': 'cm',
311
+ 'descent-of-head': 'Station',
312
+ 'uterine-contractions': 'per 10min',
313
+ 'maternal-pulse': 'BPM',
314
+ 'blood-pressure': 'mmHg',
315
+ 'pulse-bp-combined': 'mmHg',
316
+ temperature: '°C',
317
+ 'urine-analysis': 'Level',
318
+ 'drugs-fluids': 'ml/hr',
319
+ 'progress-events': 'Value',
320
+ 'post-operative-summary': 'Value',
321
+ } as const;
322
+
323
+ export const PARTOGRAPHY_NORMAL_RANGES = {
324
+ cervix: '1-10 cm',
325
+ 'fetal-heart-rate': '110-160 BPM',
326
+ 'cervical-dilation': '0-10 cm',
327
+ 'descent-of-head': '-3 to +3',
328
+ 'uterine-contractions': '2-5 per 10min',
329
+ 'maternal-pulse': '60-100 BPM',
330
+ 'blood-pressure': '90/60-140/90',
331
+ 'pulse-bp-combined': '90/60-140/90',
332
+ temperature: '36-37.5°C',
333
+ 'urine-analysis': 'Negative/Trace',
334
+ 'drugs-fluids': 'As prescribed',
335
+ 'progress-events': 'Timeline based',
336
+ 'post-operative-summary': 'As documented',
337
+ } as const;
338
+
339
+ export const PARTOGRAPHY_COLORS = {
340
+ cervix: 'blue',
341
+ 'fetal-heart-rate': 'red',
342
+ 'cervical-dilation': 'blue',
343
+ 'descent-of-head': 'green',
344
+ 'uterine-contractions': 'purple',
345
+ 'maternal-pulse': 'orange',
346
+ 'blood-pressure': 'cyan',
347
+ 'pulse-bp-combined': 'cyan',
348
+ temperature: 'teal',
349
+ 'urine-analysis': 'yellow',
350
+ 'drugs-fluids': 'magenta',
351
+ 'progress-events': 'gray',
352
+ 'post-operative-summary': 'gray',
353
+ } as const;
354
+
355
+ export const PARTOGRAPHY_Y_RANGES = {
356
+ cervix: { min: 1, max: 10 },
357
+ 'fetal-heart-rate': { min: 80, max: 200 },
358
+ 'cervical-dilation': { min: 0, max: 10 },
359
+ 'descent-of-head': { min: -4, max: 4 },
360
+ 'uterine-contractions': { min: 0, max: 6 },
361
+ 'maternal-pulse': { min: 50, max: 120 },
362
+ 'blood-pressure': { min: 50, max: 180 },
363
+ 'pulse-bp-combined': { min: 50, max: 180 },
364
+ temperature: { min: 35, max: 39 },
365
+ 'urine-analysis': { min: 0, max: 4 },
366
+ 'drugs-fluids': { min: 0, max: 500 },
367
+ 'progress-events': { min: 0, max: 10 },
368
+ 'post-operative-summary': { min: 0, max: 10 },
369
+ } as const;
370
+
371
+ export const PARTOGRAPHY_COLOR_MAPPINGS = {
372
+ red: '#da1e28',
373
+ blue: '#0f62fe',
374
+ green: '#24a148',
375
+ purple: '#8a3ffc',
376
+ orange: '#ff832b',
377
+ cyan: '#1192e8',
378
+ teal: '#009d9a',
379
+ yellow: '#f1c21b',
380
+ magenta: '#d12771',
381
+ gray: '#525252',
382
+ } as const;
383
+
384
+ export const isValidPartographyGraphType = (type: string): type is PartographyGraphType => {
385
+ return PARTOGRAPHY_GRAPH_TYPES.includes(type as PartographyGraphType);
386
+ };
387
+
388
+ export const getPartographyUnit = (graphType: PartographyGraphType): string => {
389
+ return PARTOGRAPHY_UNITS[graphType];
390
+ };
391
+
392
+ export const getPartographyNormalRange = (graphType: PartographyGraphType): string => {
393
+ return PARTOGRAPHY_NORMAL_RANGES[graphType];
394
+ };
395
+
396
+ export const getPartographyColor = (graphType: PartographyGraphType): string => {
397
+ return PARTOGRAPHY_COLORS[graphType];
398
+ };
399
+
400
+ export const getPartographyYRange = (graphType: PartographyGraphType): { min: number; max: number } => {
401
+ return PARTOGRAPHY_Y_RANGES[graphType];
402
+ };
403
+
404
+ export const PARTOGRAPHY_GRAPH_CONFIGS: PartographyGraph[] = [
405
+ {
406
+ id: 'cervix',
407
+ titleKey: 'cervix',
408
+ titleDefault: 'Cervix',
409
+ descriptionKey: 'cervixDesc',
410
+ descriptionDefault: 'Cervical monitoring during labor',
411
+ yAxisLabel: 'cm',
412
+ normalRange: '1-10 cm',
413
+ color: 'blue',
414
+ yMin: 1,
415
+ yMax: 10,
416
+ },
417
+ {
418
+ id: 'fetal-heart-rate',
419
+ titleKey: 'fetalHeartRate',
420
+ titleDefault: 'Fetal Heart Rate',
421
+ descriptionKey: 'fetalHeartRateDesc',
422
+ descriptionDefault: 'Monitor fetal well-being during labor',
423
+ yAxisLabel: 'BPM',
424
+ normalRange: '110-160 BPM',
425
+ color: 'red',
426
+ yMin: 80,
427
+ yMax: 200,
428
+ },
429
+ {
430
+ id: 'cervical-dilation',
431
+ titleKey: 'cervicalDilation',
432
+ titleDefault: 'Cervical Dilation',
433
+ descriptionKey: 'cervicalDilationDesc',
434
+ descriptionDefault: 'Progress of cervical opening during labor',
435
+ yAxisLabel: 'cm',
436
+ normalRange: '0-10 cm',
437
+ color: 'blue',
438
+ yMin: 0,
439
+ yMax: 10,
440
+ },
441
+ {
442
+ id: 'descent-of-head',
443
+ titleKey: 'descentOfHead',
444
+ titleDefault: 'Descent of Head',
445
+ descriptionKey: 'descentOfHeadDesc',
446
+ descriptionDefault: 'Fetal head position relative to ischial spines',
447
+ yAxisLabel: 'Station',
448
+ normalRange: '-3 to +3',
449
+ color: 'green',
450
+ yMin: -4,
451
+ yMax: 4,
452
+ },
453
+ {
454
+ id: 'uterine-contractions',
455
+ titleKey: 'uterineContractions',
456
+ titleDefault: 'Uterine Contractions',
457
+ descriptionKey: 'uterineContractionsDesc',
458
+ descriptionDefault: 'Frequency and intensity of contractions',
459
+ yAxisLabel: 'Contractions/10min',
460
+ normalRange: '2-5 per 10min',
461
+ color: 'purple',
462
+ yMin: 0,
463
+ yMax: 6,
464
+ },
465
+ {
466
+ id: 'maternal-pulse',
467
+ titleKey: 'maternalPulse',
468
+ titleDefault: 'Maternal Pulse',
469
+ descriptionKey: 'maternalPulseDesc',
470
+ descriptionDefault: 'Heart rate monitoring during labor',
471
+ yAxisLabel: 'BPM',
472
+ normalRange: '60-100 BPM',
473
+ color: 'orange',
474
+ yMin: 50,
475
+ yMax: 120,
476
+ },
477
+ {
478
+ id: 'blood-pressure',
479
+ titleKey: 'bloodPressure',
480
+ titleDefault: 'Blood Pressure',
481
+ descriptionKey: 'bloodPressureDesc',
482
+ descriptionDefault: 'Systolic and diastolic blood pressure',
483
+ yAxisLabel: 'mmHg',
484
+ normalRange: '90/60-140/90',
485
+ color: 'cyan',
486
+ yMin: 50,
487
+ yMax: 180,
488
+ },
489
+ {
490
+ id: 'temperature',
491
+ titleKey: 'temperature',
492
+ titleDefault: 'Temperature',
493
+ descriptionKey: 'temperatureDesc',
494
+ descriptionDefault: 'Maternal body temperature monitoring',
495
+ yAxisLabel: '°C',
496
+ normalRange: '36-37.5°C',
497
+ color: 'teal',
498
+ yMin: 35,
499
+ yMax: 39,
500
+ },
501
+ {
502
+ id: 'urine-analysis',
503
+ titleKey: 'urineAnalysis',
504
+ titleDefault: 'Urine Analysis',
505
+ descriptionKey: 'urineAnalysisDesc',
506
+ descriptionDefault: 'Protein, glucose, and ketones in urine',
507
+ yAxisLabel: 'Level',
508
+ normalRange: 'Negative/Trace',
509
+ color: 'yellow',
510
+ yMin: 0,
511
+ yMax: 4,
512
+ },
513
+ {
514
+ id: 'drugs-fluids',
515
+ titleKey: 'drugsFluids',
516
+ titleDefault: 'Drugs & Fluids',
517
+ descriptionKey: 'drugsFluidsDesc',
518
+ descriptionDefault: 'Medications and fluid administration',
519
+ yAxisLabel: 'ml/hr',
520
+ normalRange: 'As prescribed',
521
+ color: 'magenta',
522
+ yMin: 0,
523
+ yMax: 500,
524
+ },
525
+ {
526
+ id: 'progress-events',
527
+ titleKey: 'progressEvents',
528
+ titleDefault: 'Progress & Events',
529
+ descriptionKey: 'progressEventsDesc',
530
+ descriptionDefault: 'Labor milestones and significant events',
531
+ yAxisLabel: 'Progress Stage',
532
+ normalRange: 'Timeline based',
533
+ color: 'gray',
534
+ yMin: 0,
535
+ yMax: 10,
536
+ },
537
+ ];
538
+
539
+ export const getTranslatedPartographyGraphs = (t: (key: string, fallback: string) => string) => {
540
+ const cervixOnlyConfigs = PARTOGRAPHY_GRAPH_CONFIGS.filter((config) => config.id === 'cervix');
541
+
542
+ return cervixOnlyConfigs.map((config) => ({
543
+ id: config.id,
544
+ title: t(config.titleKey, config.titleDefault),
545
+ description: t(config.descriptionKey, config.descriptionDefault),
546
+ yAxisLabel: config.yAxisLabel,
547
+ normalRange: config.normalRange,
548
+ color: config.color,
549
+ yMin: config.yMin,
550
+ yMax: config.yMax,
551
+ }));
552
+ };
553
+
554
+ export const getPartographyTableHeaders = (t: (key: string, fallback: string) => string) => [
555
+ { key: 'dateTime', header: t('dateAndTime', 'Date and time') },
556
+ { key: 'value', header: t('value', 'Value') },
557
+ { key: 'unit', header: t('unit', 'Unit') },
558
+ ];
559
+
560
+ export const getColorForGraph = (colorName: string): string => {
561
+ return PARTOGRAPHY_COLOR_MAPPINGS[colorName as keyof typeof PARTOGRAPHY_COLOR_MAPPINGS] || '#525252';
562
+ };
563
+
564
+ // Default Fetal Heart Rate Chart Data - Empty for no data state
565
+ export const defaultFetalHeartRateChartData: Array<{
566
+ hour: number;
567
+ value: number;
568
+ group: string;
569
+ time: string;
570
+ color: string;
571
+ }> = [];
572
+
573
+ export const FORM_OPTION_CONCEPTS = {
574
+ AMNIOTIC_FLUID: {
575
+ MEMBRANE_INTACT: PARTOGRAPHY_CONCEPTS['amniotic-fluid'],
576
+ CLEAR_LIQUOR:
577
+ (configSchema as any)?.partography?._default?.conceptUuids?.['amniotic-clear-liquor'] ??
578
+ AMNIOTIC_CLEAR_LIQUOR_CONCEPT,
579
+ MECONIUM_STAINED:
580
+ (configSchema as any)?.partography?._default?.conceptUuids?.['amniotic-meconium-stained'] ??
581
+ AMNIOTIC_MECONIUM_STAINED_CONCEPT,
582
+ ABSENT: (configSchema as any)?.partography?._default?.conceptUuids?.['amniotic-absent'] ?? AMNIOTIC_ABSENT_CONCEPT,
583
+ BLOOD_STAINED:
584
+ (configSchema as any)?.partography?._default?.conceptUuids?.['amniotic-blood-stained'] ??
585
+ AMNIOTIC_BLOOD_STAINED_CONCEPT,
586
+ },
587
+
588
+ MOULDING: {
589
+ NONE: (configSchema as any)?.partography?._default?.conceptUuids?.['moulding-none'] ?? MOULDING_NONE_CONCEPT,
590
+ SLIGHT: (configSchema as any)?.partography?._default?.conceptUuids?.['moulding-slight'] ?? MOULDING_SLIGHT_CONCEPT,
591
+ MODERATE:
592
+ (configSchema as any)?.partography?._default?.conceptUuids?.['moulding-moderate'] ?? MOULDING_MODERATE_CONCEPT,
593
+ SEVERE: (configSchema as any)?.partography?._default?.conceptUuids?.['moulding-severe'] ?? MOULDING_SEVERE_CONCEPT,
594
+ },
595
+
596
+ DESCENT_STATION: {
597
+ ZERO_FIFTHS: (configSchema as any)?.partography?._default?.conceptUuids?.['station-0'] ?? STATION_0_CONCEPT,
598
+ ONE_FIFTH: (configSchema as any)?.partography?._default?.conceptUuids?.['station-1'] ?? STATION_1_CONCEPT,
599
+ TWO_FIFTHS: (configSchema as any)?.partography?._default?.conceptUuids?.['station-2'] ?? STATION_2_CONCEPT,
600
+ THREE_FIFTHS: (configSchema as any)?.partography?._default?.conceptUuids?.['station-3'] ?? STATION_3_CONCEPT,
601
+ FOUR_FIFTHS: (configSchema as any)?.partography?._default?.conceptUuids?.['station-4'] ?? STATION_4_CONCEPT,
602
+ FIVE_FIFTHS: (configSchema as any)?.partography?._default?.conceptUuids?.['station-5'] ?? STATION_5_CONCEPT,
603
+ },
604
+
605
+ CONTRACTION_INTENSITY: {
606
+ MILD: CONTRACTION_LEVEL_MILD_CONCEPT,
607
+ MODERATE: CONTRACTION_LEVEL_MODERATE_CONCEPT,
608
+ STRONG: CONTRACTION_LEVEL_STRONG_CONCEPT,
609
+ },
610
+
611
+ URINE_LEVELS: {
612
+ NEGATIVE: (configSchema as any)?.partography?._default?.conceptUuids?.['moulding-none'] ?? MOULDING_NONE_CONCEPT,
613
+ TRACE: (configSchema as any)?.partography?._default?.conceptUuids?.['moulding-slight'] ?? MOULDING_SLIGHT_CONCEPT,
614
+ POSITIVE_PLUS:
615
+ (configSchema as any)?.partography?._default?.conceptUuids?.['moulding-moderate'] ?? MOULDING_MODERATE_CONCEPT,
616
+ POSITIVE_PLUS_PLUS:
617
+ (configSchema as any)?.partography?._default?.conceptUuids?.['moulding-severe'] ?? MOULDING_SEVERE_CONCEPT,
618
+ },
619
+
620
+ BLOOD_GROUP: PARTOGRAPHY_CONCEPTS['blood-group'],
621
+
622
+ EVENT_TYPES: {
623
+ MEMBRANE_RUPTURE: PARTOGRAPHY_CONCEPTS['event-type'],
624
+ LABOR_ONSET: PARTOGRAPHY_CONCEPTS['event-type'],
625
+ POSITION_CHANGE: PARTOGRAPHY_CONCEPTS['event-type'],
626
+ MEDICATION_GIVEN: PARTOGRAPHY_CONCEPTS['event-type'],
627
+ COMPLICATION: PARTOGRAPHY_CONCEPTS['event-type'],
628
+ DELIVERY: PARTOGRAPHY_CONCEPTS['event-type'],
629
+ OTHER: PARTOGRAPHY_CONCEPTS['event-type'],
630
+ },
631
+ } as const;
632
+
633
+ export const AMNIOTIC_FLUID_OPTIONS = [
634
+ { value: '', text: 'chooseAnOption', conceptUuid: '' },
635
+ {
636
+ value: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.MEMBRANE_INTACT,
637
+ text: 'membraneIntact',
638
+ conceptUuid: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.MEMBRANE_INTACT,
639
+ },
640
+ {
641
+ value: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.CLEAR_LIQUOR,
642
+ text: 'clearLiquor',
643
+ conceptUuid: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.CLEAR_LIQUOR,
644
+ },
645
+ {
646
+ value: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.MECONIUM_STAINED,
647
+ text: 'meconiumStained',
648
+ conceptUuid: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.MECONIUM_STAINED,
649
+ },
650
+ {
651
+ value: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.ABSENT,
652
+ text: 'absent',
653
+ conceptUuid: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.ABSENT,
654
+ },
655
+ {
656
+ value: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.BLOOD_STAINED,
657
+ text: 'bloodStained',
658
+ conceptUuid: FORM_OPTION_CONCEPTS.AMNIOTIC_FLUID.BLOOD_STAINED,
659
+ },
660
+ ] as const;
661
+
662
+ export const MOULDING_OPTIONS = [
663
+ { value: '', text: 'chooseAnOption', display: '', conceptUuid: '' },
664
+ {
665
+ value: FORM_OPTION_CONCEPTS.MOULDING.NONE,
666
+ text: 'none',
667
+ display: '0',
668
+ conceptUuid: FORM_OPTION_CONCEPTS.MOULDING.NONE,
669
+ },
670
+ {
671
+ value: FORM_OPTION_CONCEPTS.MOULDING.SLIGHT,
672
+ text: 'slight',
673
+ display: '+',
674
+ conceptUuid: FORM_OPTION_CONCEPTS.MOULDING.SLIGHT,
675
+ },
676
+ {
677
+ value: FORM_OPTION_CONCEPTS.MOULDING.MODERATE,
678
+ text: 'moderate',
679
+ display: '++',
680
+ conceptUuid: FORM_OPTION_CONCEPTS.MOULDING.MODERATE,
681
+ },
682
+ {
683
+ value: FORM_OPTION_CONCEPTS.MOULDING.SEVERE,
684
+ text: 'severe',
685
+ display: '+++',
686
+ conceptUuid: FORM_OPTION_CONCEPTS.MOULDING.SEVERE,
687
+ },
688
+ ] as const;
689
+
690
+ export const ROUTE_OPTIONS = [
691
+ { id: 'oral', text: 'Oral' },
692
+ { id: 'iv', text: 'Intravenous (IV)' },
693
+ { id: 'im', text: 'Intramuscular (IM)' },
694
+ { id: 'sc', text: 'Subcutaneous (SC)' },
695
+ { id: 'topical', text: 'Topical' },
696
+ { id: 'inhalation', text: 'Inhalation' },
697
+ { id: 'other', text: 'Other' },
698
+ ] as const;
699
+
700
+ export const FREQUENCY_OPTIONS = [
701
+ { id: 'stat', text: 'STAT (immediately)' },
702
+ { id: 'od', text: 'Once daily (OD)' },
703
+ { id: 'bd', text: 'Twice daily (BD)' },
704
+ { id: 'tds', text: 'Three times daily (TDS)' },
705
+ { id: 'qds', text: 'Four times daily (QDS)' },
706
+ { id: 'q4h', text: 'Every 4 hours' },
707
+ { id: 'q6h', text: 'Every 6 hours' },
708
+ { id: 'q8h', text: 'Every 8 hours' },
709
+ { id: 'q12h', text: 'Every 12 hours' },
710
+ { id: 'prn', text: 'As needed (PRN)' },
711
+ { id: 'other', text: 'Other' },
712
+ ] as const;
713
+
714
+ export const IV_FLUIDS_OPTIONS = [
715
+ { id: '', text: 'Choose an option', conceptUuid: '' },
716
+ { id: 'ringer-lactate', text: "Ringer's lactate", conceptUuid: '78617AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' },
717
+ { id: 'normal-saline', text: 'Sodim Chloride', conceptUuid: '80804AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' },
718
+ { id: 'dextrose-5-water', text: 'Dextrose 5% in water', conceptUuid: '161250AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' },
719
+ { id: 'dextran', text: 'Dextran', conceptUuid: '74653AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' },
720
+ { id: 'dextrose-10-water', text: 'Dextrose 10% in water', conceptUuid: '161922AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' },
721
+ {
722
+ id: 'dextrose-5-normal-saline',
723
+ text: 'Dextrose 5% in normal saline',
724
+ conceptUuid: '162857AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
725
+ },
726
+ {
727
+ id: 'kcl-20-normal-saline',
728
+ text: 'Potassium chloride 20 mmol/L in normal saline',
729
+ conceptUuid: '162855AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
730
+ },
731
+ {
732
+ id: 'kcl-40-sodium',
733
+ text: 'Potassium chloride 40 mmol/sodium',
734
+ conceptUuid: '162856AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
735
+ },
736
+ {
737
+ id: 'glucose50-sodium-chloride',
738
+ text: 'Glucose 50 MG/ML / Sodium Chloride',
739
+ conceptUuid: '162859AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
740
+ },
741
+ {
742
+ id: 'mono-potassium-phosphate-sodium-phosphate',
743
+ text: 'Monopotassium phosphate 0.259% / sodium phosphate',
744
+ conceptUuid: '162860AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
745
+ },
746
+ {
747
+ id: 'sodium-bicarbonate',
748
+ text: 'Sodium bicarbonate 1.26% injection solution',
749
+ conceptUuid: '162861AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
750
+ },
751
+ ] as const;
752
+
753
+ export const DESCENT_OF_HEAD_OPTIONS = [
754
+ { value: '', text: 'selectStation', stationValue: 0, conceptUuid: '' },
755
+ {
756
+ value: FORM_OPTION_CONCEPTS.DESCENT_STATION.ZERO_FIFTHS,
757
+ text: '0/5',
758
+ stationValue: 0,
759
+ conceptUuid: FORM_OPTION_CONCEPTS.DESCENT_STATION.ZERO_FIFTHS,
760
+ },
761
+ {
762
+ value: FORM_OPTION_CONCEPTS.DESCENT_STATION.ONE_FIFTH,
763
+ text: '1/5',
764
+ stationValue: 1,
765
+ conceptUuid: FORM_OPTION_CONCEPTS.DESCENT_STATION.ONE_FIFTH,
766
+ },
767
+ {
768
+ value: FORM_OPTION_CONCEPTS.DESCENT_STATION.TWO_FIFTHS,
769
+ text: '2/5',
770
+ stationValue: 2,
771
+ conceptUuid: FORM_OPTION_CONCEPTS.DESCENT_STATION.TWO_FIFTHS,
772
+ },
773
+ {
774
+ value: FORM_OPTION_CONCEPTS.DESCENT_STATION.THREE_FIFTHS,
775
+ text: '3/5',
776
+ stationValue: 3,
777
+ conceptUuid: FORM_OPTION_CONCEPTS.DESCENT_STATION.THREE_FIFTHS,
778
+ },
779
+ {
780
+ value: FORM_OPTION_CONCEPTS.DESCENT_STATION.FOUR_FIFTHS,
781
+ text: '4/5',
782
+ stationValue: 4,
783
+ conceptUuid: FORM_OPTION_CONCEPTS.DESCENT_STATION.FOUR_FIFTHS,
784
+ },
785
+ {
786
+ value: FORM_OPTION_CONCEPTS.DESCENT_STATION.FIVE_FIFTHS,
787
+ text: '5/5',
788
+ stationValue: 5,
789
+ conceptUuid: FORM_OPTION_CONCEPTS.DESCENT_STATION.FIVE_FIFTHS,
790
+ },
791
+ ] as const;
792
+
793
+ export const CONTRACTION_INTENSITY_OPTIONS = [
794
+ { value: '', text: 'selectIntensity', conceptUuid: '' },
795
+ { value: 'mild', text: 'mild', conceptUuid: FORM_OPTION_CONCEPTS.CONTRACTION_INTENSITY.MILD },
796
+ { value: 'moderate', text: 'moderate', conceptUuid: FORM_OPTION_CONCEPTS.CONTRACTION_INTENSITY.MODERATE },
797
+ { value: 'strong', text: 'strong', conceptUuid: FORM_OPTION_CONCEPTS.CONTRACTION_INTENSITY.STRONG },
798
+ ] as const;
799
+
800
+ export const URINE_LEVEL_OPTIONS = [
801
+ { value: '', text: 'selectLevel', conceptUuid: '' },
802
+ {
803
+ value: FORM_OPTION_CONCEPTS.URINE_LEVELS.NEGATIVE,
804
+ text: 'negative',
805
+ conceptUuid: FORM_OPTION_CONCEPTS.URINE_LEVELS.NEGATIVE,
806
+ },
807
+ {
808
+ value: FORM_OPTION_CONCEPTS.URINE_LEVELS.TRACE,
809
+ text: 'trace',
810
+ conceptUuid: FORM_OPTION_CONCEPTS.URINE_LEVELS.TRACE,
811
+ },
812
+ {
813
+ value: FORM_OPTION_CONCEPTS.URINE_LEVELS.POSITIVE_PLUS,
814
+ text: 'positivePlus',
815
+ conceptUuid: FORM_OPTION_CONCEPTS.URINE_LEVELS.POSITIVE_PLUS,
816
+ },
817
+ {
818
+ value: FORM_OPTION_CONCEPTS.URINE_LEVELS.POSITIVE_PLUS_PLUS,
819
+ text: 'positivePlusPlus',
820
+ conceptUuid: FORM_OPTION_CONCEPTS.URINE_LEVELS.POSITIVE_PLUS_PLUS,
821
+ },
822
+ ] as const;
823
+
824
+ export const BLOOD_GROUP_OPTIONS = [
825
+ { value: '', text: 'selectBG', conceptUuid: '' },
826
+ { value: 'A+', text: 'A+', conceptUuid: FORM_OPTION_CONCEPTS.BLOOD_GROUP },
827
+ { value: 'A-', text: 'A-', conceptUuid: FORM_OPTION_CONCEPTS.BLOOD_GROUP },
828
+ { value: 'B+', text: 'B+', conceptUuid: FORM_OPTION_CONCEPTS.BLOOD_GROUP },
829
+ { value: 'B-', text: 'B-', conceptUuid: FORM_OPTION_CONCEPTS.BLOOD_GROUP },
830
+ { value: 'AB+', text: 'AB+', conceptUuid: FORM_OPTION_CONCEPTS.BLOOD_GROUP },
831
+ { value: 'AB-', text: 'AB-', conceptUuid: FORM_OPTION_CONCEPTS.BLOOD_GROUP },
832
+ { value: 'O+', text: 'O+', conceptUuid: FORM_OPTION_CONCEPTS.BLOOD_GROUP },
833
+ { value: 'O-', text: 'O-', conceptUuid: FORM_OPTION_CONCEPTS.BLOOD_GROUP },
834
+ ] as const;
835
+
836
+ export const ADMISSION_OPTIONS = [
837
+ { value: '', text: 'selectAdmission', conceptUuid: '' },
838
+ { value: 'normal', text: 'normal', conceptUuid: PARTOGRAPHY_CONCEPTS['date-of-admission'] },
839
+ { value: 'emergency', text: 'emergency', conceptUuid: PARTOGRAPHY_CONCEPTS['date-of-admission'] },
840
+ { value: 'elective', text: 'elective', conceptUuid: PARTOGRAPHY_CONCEPTS['date-of-admission'] },
841
+ { value: 'referral', text: 'referral', conceptUuid: PARTOGRAPHY_CONCEPTS['date-of-admission'] },
842
+ ] as const;
843
+
844
+ export const TIME_SLOT_OPTIONS = [
845
+ { value: '', text: 'selectAM', conceptUuid: '' },
846
+ { value: 'morning', text: 'morning', conceptUuid: PARTOGRAPHY_CONCEPTS['time-slot'] },
847
+ { value: 'afternoon', text: 'afternoon', conceptUuid: PARTOGRAPHY_CONCEPTS['time-slot'] },
848
+ { value: 'evening', text: 'evening', conceptUuid: PARTOGRAPHY_CONCEPTS['time-slot'] },
849
+ { value: 'night', text: 'night', conceptUuid: PARTOGRAPHY_CONCEPTS['time-slot'] },
850
+ ] as const;
851
+
852
+ export const MEMBRANE_TIME_SLOT_OPTIONS = [
853
+ // Add 0hr option first
854
+ { value: '0', label: '0hr' },
855
+ // Then add the existing 0.5hr increments
856
+ ...Array.from({ length: 48 }, (_, i) => {
857
+ const value = ((i + 1) * 0.5).toString();
858
+ const label = i % 2 === 1 ? `${(i + 1) * 0.5}hr` : `${(i + 1) / 2}hr`;
859
+ return { value, label };
860
+ }),
861
+ ] as const;
862
+
863
+ export const EVENT_TYPE_OPTIONS = [
864
+ { value: '', text: 'selectEventType', conceptUuid: '' },
865
+ {
866
+ value: 'membrane-rupture',
867
+ text: 'membraneRupture',
868
+ conceptUuid: FORM_OPTION_CONCEPTS.EVENT_TYPES.MEMBRANE_RUPTURE,
869
+ },
870
+ { value: 'labor-onset', text: 'laborOnset', conceptUuid: FORM_OPTION_CONCEPTS.EVENT_TYPES.LABOR_ONSET },
871
+ { value: 'position-change', text: 'positionChange', conceptUuid: FORM_OPTION_CONCEPTS.EVENT_TYPES.POSITION_CHANGE },
872
+ {
873
+ value: 'medication-given',
874
+ text: 'medicationGiven',
875
+ conceptUuid: FORM_OPTION_CONCEPTS.EVENT_TYPES.MEDICATION_GIVEN,
876
+ },
877
+ { value: 'complication', text: 'complication', conceptUuid: FORM_OPTION_CONCEPTS.EVENT_TYPES.COMPLICATION },
878
+ { value: 'delivery', text: 'delivery', conceptUuid: FORM_OPTION_CONCEPTS.EVENT_TYPES.DELIVERY },
879
+ { value: 'other', text: 'other', conceptUuid: FORM_OPTION_CONCEPTS.EVENT_TYPES.OTHER },
880
+ ] as const;
881
+
882
+ export const getDescentStationMapping = () => {
883
+ const mapping: Record<string, number> = {};
884
+ DESCENT_OF_HEAD_OPTIONS.forEach((option) => {
885
+ if (option.value && option.stationValue !== undefined) {
886
+ mapping[option.value] = option.stationValue;
887
+ }
888
+ });
889
+ return mapping;
890
+ };
891
+
892
+ export const VALIDATION_RANGES = {
893
+ CERVIX: { min: 1, max: 10, normal: { min: 1, max: 10 }, step: 0.5 },
894
+ FETAL_HEART_RATE: { min: 80, max: 200, normal: { min: 110, max: 160 }, step: 1 },
895
+ CERVICAL_DILATION: { min: 0, max: 10, normal: { min: 0, max: 10 }, step: 0.5 },
896
+ MATERNAL_PULSE: { min: 40, max: 140, normal: { min: 60, max: 100 }, step: 1 },
897
+ SYSTOLIC_BP: { min: 60, max: 250, normal: { min: 90, max: 140 }, step: 1 },
898
+ DIASTOLIC_BP: { min: 30, max: 150, normal: { min: 60, max: 90 }, step: 1 },
899
+ TEMPERATURE: { min: 35, max: 42, normal: { min: 36, max: 37.5 }, step: 0.1 },
900
+ UTERINE_CONTRACTIONS: { min: 0, max: 10, normal: { min: 2, max: 5 }, step: 1 },
901
+ } as const;
902
+
903
+ export const INPUT_RANGES = {
904
+ cervix: {
905
+ ...VALIDATION_RANGES.CERVIX,
906
+ placeholderKey: 'cervixPlaceholder',
907
+ conceptUuid: PARTOGRAPHY_CONCEPTS['cervix'],
908
+ },
909
+ 'fetal-heart-rate': {
910
+ ...VALIDATION_RANGES.FETAL_HEART_RATE,
911
+ placeholderKey: 'fetalHeartRatePlaceholder',
912
+ conceptUuid: PARTOGRAPHY_CONCEPTS['fetal-heart-rate'],
913
+ },
914
+ 'cervical-dilation': {
915
+ ...VALIDATION_RANGES.CERVICAL_DILATION,
916
+ placeholderKey: 'cervicalDilationPlaceholder',
917
+ conceptUuid: PARTOGRAPHY_CONCEPTS['cervical-dilation'],
918
+ },
919
+ 'maternal-pulse': {
920
+ ...VALIDATION_RANGES.MATERNAL_PULSE,
921
+ placeholderKey: 'maternalPulsePlaceholder',
922
+ conceptUuid: PARTOGRAPHY_CONCEPTS['maternal-pulse'],
923
+ },
924
+ 'systolic-bp': {
925
+ ...VALIDATION_RANGES.SYSTOLIC_BP,
926
+ placeholderKey: 'systolicBPPlaceholder',
927
+ conceptUuid: PARTOGRAPHY_CONCEPTS['systolic-bp'],
928
+ },
929
+ 'diastolic-bp': {
930
+ ...VALIDATION_RANGES.DIASTOLIC_BP,
931
+ placeholderKey: 'diastolicBPPlaceholder',
932
+ conceptUuid: PARTOGRAPHY_CONCEPTS['diastolic-bp'],
933
+ },
934
+ temperature: {
935
+ ...VALIDATION_RANGES.TEMPERATURE,
936
+ placeholderKey: 'temperaturePlaceholder',
937
+ conceptUuid: PARTOGRAPHY_CONCEPTS.temperature,
938
+ },
939
+ 'uterine-contractions': {
940
+ ...VALIDATION_RANGES.UTERINE_CONTRACTIONS,
941
+ placeholderKey: 'contractionFrequencyPlaceholder',
942
+ conceptUuid: PARTOGRAPHY_CONCEPTS['uterine-contractions'],
943
+ },
944
+ } as const;
945
+
946
+ export const createRangeValidator = (rangeName: keyof typeof VALIDATION_RANGES) => {
947
+ const range = VALIDATION_RANGES[rangeName];
948
+ return (value: string | number): boolean => {
949
+ const num = typeof value === 'string' ? parseFloat(value) : value;
950
+ return !isNaN(num) && num >= range.min && num <= range.max;
951
+ };
952
+ };
953
+
954
+ export const isValidCervicalDilation = createRangeValidator('CERVICAL_DILATION');
955
+
956
+ export const isValidFetalHeartRate = createRangeValidator('FETAL_HEART_RATE');
957
+
958
+ export const isValidMaternalPulse = createRangeValidator('MATERNAL_PULSE');
959
+
960
+ export const isValidSystolicBP = createRangeValidator('SYSTOLIC_BP');
961
+
962
+ export const isValidDiastolicBP = createRangeValidator('DIASTOLIC_BP');
963
+
964
+ export const isValidTemperature = createRangeValidator('TEMPERATURE');
965
+
966
+ export const isValidUterineContractions = createRangeValidator('UTERINE_CONTRACTIONS');
967
+
968
+ export const isValidBloodPressure = (systolic: string, diastolic: string): boolean => {
969
+ return (
970
+ systolic.trim() !== '' && diastolic.trim() !== '' && isValidSystolicBP(systolic) && isValidDiastolicBP(diastolic)
971
+ );
972
+ };
973
+
974
+ export const isValidUrineAnalysis = (protein: string, glucose: string, ketone: string): boolean => {
975
+ return protein !== '' || glucose !== '' || ketone !== '';
976
+ };
977
+
978
+ export const isValidDrugsFluids = (medication: string, dosage: string): boolean => {
979
+ return medication.trim() !== '' && dosage.trim() !== '';
980
+ };
981
+
982
+ export const isValidProgressEvents = (eventType: string, eventDescription: string): boolean => {
983
+ return eventType !== '' && eventDescription.trim() !== '';
984
+ };
985
+
986
+ export const isValidDescentOfHead = (value: string): boolean => {
987
+ return value.trim() !== '' && DESCENT_OF_HEAD_OPTIONS.some((option) => option.value === value);
988
+ };
989
+
990
+ export const isValidMeasurement = (graphType: string, value: string): boolean => {
991
+ switch (graphType) {
992
+ case 'fetal-heart-rate':
993
+ return isValidFetalHeartRate(value);
994
+ case 'cervical-dilation':
995
+ return isValidCervicalDilation(value);
996
+ case 'maternal-pulse':
997
+ return isValidMaternalPulse(value);
998
+ case 'temperature':
999
+ return isValidTemperature(value);
1000
+ case 'uterine-contractions':
1001
+ return isValidUterineContractions(value);
1002
+ case 'descent-of-head':
1003
+ return isValidDescentOfHead(value);
1004
+ default:
1005
+ return value.trim() !== '';
1006
+ }
1007
+ };
1008
+ export const MEASUREMENT_LABELS = {
1009
+ cervix: { key: 'cervicalDilation', default: 'Cervical Dilation' },
1010
+ 'fetal-heart-rate': { key: 'fetalHeartRate', default: 'Foetal Heart Rate' },
1011
+ 'cervical-dilation': { key: 'membraneAmnioticFluidMoulding', default: 'Membrane Amniotic Fluid & Moulding' },
1012
+ 'descent-of-head': { key: 'descentOfHead', default: 'Descent of Head' },
1013
+ 'uterine-contractions': { key: 'uterineContractions', default: 'Uterine Contractions' },
1014
+ 'maternal-pulse': { key: 'maternalPulse', default: 'Maternal Pulse' },
1015
+ 'blood-pressure': { key: 'bloodPressure', default: 'Blood Pressure' },
1016
+ temperature: { key: 'temperature', default: 'Temperature' },
1017
+ 'urine-analysis': { key: 'urineAnalysis', default: 'Urine Analysis' },
1018
+ 'drugs-fluids': { key: 'drugsFluids', default: 'Drugs & Fluids' },
1019
+ 'progress-events': { key: 'progressEvents', default: 'Progress & Events' },
1020
+ } as const;
1021
+
1022
+ export const FIELD_LABELS = {
1023
+ fetalHeartRate: { key: 'fetalHeartRate', default: 'Fetal Heart Rate (BPM)' },
1024
+ cervicalDilation: { key: 'cervicalDilation', default: 'Cervical Dilation (cm)' },
1025
+ maternalPulse: { key: 'maternalPulse', default: 'Maternal Pulse (BPM)' },
1026
+ systolic: { key: 'systolic', default: 'Systolic (mmHg)' },
1027
+ diastolic: { key: 'diastolic', default: 'Diastolic (mmHg)' },
1028
+ temperature: { key: 'temperature', default: 'Temperature (°C)' },
1029
+ frequency: { key: 'frequency', default: 'Frequency (per 10min)' },
1030
+ amnioticFluid: { key: 'amnioticFluid', default: 'Amniotic Fluid' },
1031
+ moulding: { key: 'moulding', default: 'Moulding' },
1032
+ descentOfHead: { key: 'descentOfHead', default: 'Descent of Head (Station)' },
1033
+ intensity: { key: 'intensity', default: 'Intensity' },
1034
+ proteinLevel: { key: 'proteinLevel', default: 'Protein Level' },
1035
+ glucoseLevel: { key: 'glucoseLevel', default: 'Glucose Level' },
1036
+ ketoneLevel: { key: 'ketoneLevel', default: 'Ketone Level' },
1037
+ eventType: { key: 'eventType', default: 'Event Type' },
1038
+ medication: { key: 'medication', default: 'Medication/Fluid' },
1039
+ dosageRate: { key: 'dosageRate', default: 'Dosage/Rate' },
1040
+ eventDescription: { key: 'eventDescription', default: 'Event Description' },
1041
+ admission: { key: 'admission', default: 'Admission' },
1042
+ bg: { key: 'bg', default: 'BG' },
1043
+ am: { key: 'am', default: 'AM' },
1044
+ } as const;
1045
+ export const FIELD_PLACEHOLDERS = {
1046
+ fetalHeartRatePlaceholder: { key: 'enterFetalHeartRate', default: 'Enter fetal heart rate (110-160 BPM)' },
1047
+ cervicalDilationPlaceholder: { key: 'enterCervicalDilation', default: 'Enter cervical dilation (0-10 cm)' },
1048
+ maternalPulsePlaceholder: { key: 'enterMaternalPulse', default: 'Enter maternal pulse (60-100 BPM)' },
1049
+ systolicBPPlaceholder: { key: 'enterSystolicBP', default: 'Enter systolic BP (90-140 mmHg)' },
1050
+ diastolicBPPlaceholder: { key: 'enterDiastolicBP', default: 'Enter diastolic BP (60-90 mmHg)' },
1051
+ temperaturePlaceholder: { key: 'enterTemperature', default: 'Enter temperature (36-37.5°C)' },
1052
+ contractionFrequencyPlaceholder: { key: 'enterContractionFrequency', default: 'Enter contractions per 10 minutes' },
1053
+ contractionIntensityPlaceholder: { key: 'selectContractionIntensity', default: 'Select contraction intensity' },
1054
+ descentOfHeadPlaceholder: { key: 'selectDescentStation', default: 'Select descent station (0/5 - 5/5)' },
1055
+ amnioticFluidPlaceholder: { key: 'selectAmnioticFluid', default: 'Select amniotic fluid status' },
1056
+ mouldingPlaceholder: { key: 'selectMoulding', default: 'Select moulding status' },
1057
+ proteinLevelPlaceholder: { key: 'selectProteinLevel', default: 'Select protein level' },
1058
+ glucoseLevelPlaceholder: { key: 'selectGlucoseLevel', default: 'Select glucose level' },
1059
+ ketoneLevelPlaceholder: { key: 'selectKetoneLevel', default: 'Select ketone level' },
1060
+ eventTypePlaceholder: { key: 'selectEventType', default: 'Select event type' },
1061
+ medicationType: { key: 'enterMedicationOrFluidType', default: 'Enter medication or fluid type' },
1062
+ dosageRate: { key: 'enterDosageOrFlowRate', default: 'Enter dosage or flow rate' },
1063
+ eventDescription: { key: 'describeEventOrMilestone', default: 'Describe the event or milestone' },
1064
+ generalMeasurement: { key: 'enterMeasurementValue', default: 'Enter measurement value' },
1065
+ } as const;
1066
+ export const getMeasurementLabel = (
1067
+ graphType: string,
1068
+ t: (key: string, fallback: string) => string,
1069
+ fallbackTitle?: string,
1070
+ ): string => {
1071
+ const labelConfig = MEASUREMENT_LABELS[graphType as keyof typeof MEASUREMENT_LABELS];
1072
+ if (labelConfig) {
1073
+ return t(labelConfig.key, labelConfig.default);
1074
+ }
1075
+ return fallbackTitle || graphType;
1076
+ };
1077
+ export const getFieldLabel = (
1078
+ fieldKey: keyof typeof FIELD_LABELS,
1079
+ t: (key: string, fallback: string) => string,
1080
+ ): string => {
1081
+ const labelConfig = FIELD_LABELS[fieldKey];
1082
+ return t(labelConfig.key, labelConfig.default);
1083
+ };
1084
+
1085
+ export const getFieldPlaceholder = (
1086
+ fieldKey: keyof typeof FIELD_PLACEHOLDERS,
1087
+ t: (key: string, fallback: string) => string,
1088
+ ): string => {
1089
+ const placeholderConfig = FIELD_PLACEHOLDERS[fieldKey];
1090
+ return t(placeholderConfig.key, placeholderConfig.default);
1091
+ };
1092
+
1093
+ export const getInputRangePlaceholder = (
1094
+ graphType: keyof typeof INPUT_RANGES,
1095
+ t: (key: string, fallback: string) => string,
1096
+ ): string => {
1097
+ const inputConfig = INPUT_RANGES[graphType];
1098
+ if (inputConfig && 'placeholderKey' in inputConfig) {
1099
+ return getFieldPlaceholder(inputConfig.placeholderKey as keyof typeof FIELD_PLACEHOLDERS, t);
1100
+ }
1101
+ return t('enterMeasurementValue', 'Enter measurement value');
1102
+ };
1103
+
1104
+ export const getConceptUuid = (optionType: string, optionValue: string): string => {
1105
+ switch (optionType) {
1106
+ case 'amnioticFluid':
1107
+ return AMNIOTIC_FLUID_OPTIONS.find((opt) => opt.value === optionValue)?.conceptUuid || '';
1108
+ case 'moulding':
1109
+ return MOULDING_OPTIONS.find((opt) => opt.value === optionValue)?.conceptUuid || '';
1110
+ case 'descentOfHead':
1111
+ return DESCENT_OF_HEAD_OPTIONS.find((opt) => opt.value === optionValue)?.conceptUuid || '';
1112
+ case 'contractionIntensity':
1113
+ return CONTRACTION_INTENSITY_OPTIONS.find((opt) => opt.value === optionValue)?.conceptUuid || '';
1114
+ case 'urineLevel':
1115
+ return URINE_LEVEL_OPTIONS.find((opt) => opt.value === optionValue)?.conceptUuid || '';
1116
+ case 'bloodGroup':
1117
+ return BLOOD_GROUP_OPTIONS.find((opt) => opt.value === optionValue)?.conceptUuid || '';
1118
+ case 'admission':
1119
+ return ADMISSION_OPTIONS.find((opt) => opt.value === optionValue)?.conceptUuid || '';
1120
+ case 'timeSlot':
1121
+ return TIME_SLOT_OPTIONS.find((opt) => opt.value === optionValue)?.conceptUuid || '';
1122
+ case 'eventType':
1123
+ return EVENT_TYPE_OPTIONS.find((opt) => opt.value === optionValue)?.conceptUuid || '';
1124
+ default:
1125
+ return '';
1126
+ }
1127
+ };
1128
+
1129
+ export const isWithinNormalRange = (graphType: string, value: number): boolean => {
1130
+ const range = Object.values(VALIDATION_RANGES).find((r) => {
1131
+ switch (graphType) {
1132
+ case 'fetal-heart-rate':
1133
+ return r === VALIDATION_RANGES.FETAL_HEART_RATE;
1134
+ case 'cervical-dilation':
1135
+ return r === VALIDATION_RANGES.CERVICAL_DILATION;
1136
+ case 'maternal-pulse':
1137
+ return r === VALIDATION_RANGES.MATERNAL_PULSE;
1138
+ case 'temperature':
1139
+ return r === VALIDATION_RANGES.TEMPERATURE;
1140
+ case 'uterine-contractions':
1141
+ return r === VALIDATION_RANGES.UTERINE_CONTRACTIONS;
1142
+ default:
1143
+ return false;
1144
+ }
1145
+ });
1146
+
1147
+ if (!range || !range.normal) {
1148
+ return true;
1149
+ }
1150
+ return value >= range.normal.min && value <= range.normal.max;
1151
+ };
1152
+
1153
+ export interface GraphDataProcessor {
1154
+ validate: (formData: any) => boolean;
1155
+ getValue: (formData: any) => number;
1156
+ getAdditionalData: (formData: any) => Record<string, any>;
1157
+ }
1158
+
1159
+ export const GRAPH_DATA_PROCESSORS: Record<string, GraphDataProcessor> = {
1160
+ 'cervical-dilation': {
1161
+ validate: (formData) => isValidCervicalDilation(formData.measurementValue),
1162
+ getValue: (formData) => parseFloat(formData.measurementValue) || 0,
1163
+ getAdditionalData: (formData) => ({
1164
+ amnioticFluid: formData.amnioticFluid,
1165
+ moulding: formData.moulding,
1166
+ conceptUuid: PARTOGRAPHY_CONCEPTS['cervical-dilation'],
1167
+ }),
1168
+ },
1169
+ 'blood-pressure': {
1170
+ validate: (formData) => isValidBloodPressure(formData.systolic, formData.diastolic),
1171
+ getValue: (formData) => parseFloat(formData.systolic) || 0,
1172
+ getAdditionalData: (formData) => ({
1173
+ diastolic: parseFloat(formData.diastolic) || 0,
1174
+ conceptUuid: PARTOGRAPHY_CONCEPTS['systolic-bp'],
1175
+ diastolicConceptUuid: PARTOGRAPHY_CONCEPTS['diastolic-bp'],
1176
+ }),
1177
+ },
1178
+ 'urine-analysis': {
1179
+ validate: (formData) => isValidUrineAnalysis(formData.proteinLevel, formData.glucoseLevel, formData.ketoneLevel),
1180
+ getValue: () => 1,
1181
+ getAdditionalData: (formData) => ({
1182
+ proteinLevel: formData.proteinLevel,
1183
+ glucoseLevel: formData.glucoseLevel,
1184
+ ketoneLevel: formData.ketoneLevel,
1185
+ proteinConceptUuid: PARTOGRAPHY_CONCEPTS['protein-level'],
1186
+ glucoseConceptUuid: PARTOGRAPHY_CONCEPTS['glucose-level'],
1187
+ ketoneConceptUuid: PARTOGRAPHY_CONCEPTS['ketone-level'],
1188
+ }),
1189
+ },
1190
+ 'drugs-fluids': {
1191
+ validate: (formData) => isValidDrugsFluids(formData.medication, formData.dosage),
1192
+ getValue: () => 1,
1193
+ getAdditionalData: (formData) => ({
1194
+ medication: formData.medication,
1195
+ dosage: formData.dosage,
1196
+ medicationConceptUuid: PARTOGRAPHY_CONCEPTS.medication,
1197
+ dosageConceptUuid: PARTOGRAPHY_CONCEPTS.dosage,
1198
+ }),
1199
+ },
1200
+ 'progress-events': {
1201
+ validate: (formData) => isValidProgressEvents(formData.eventType, formData.eventDescription),
1202
+ getValue: () => 1,
1203
+ getAdditionalData: (formData) => ({
1204
+ eventType: formData.eventType,
1205
+ eventDescription: formData.eventDescription,
1206
+ eventTypeConceptUuid: PARTOGRAPHY_CONCEPTS['event-type'],
1207
+ eventDescriptionConceptUuid: PARTOGRAPHY_CONCEPTS['event-description'],
1208
+ }),
1209
+ },
1210
+ 'uterine-contractions': {
1211
+ validate: (formData) => isValidMeasurement('uterine-contractions', formData.measurementValue),
1212
+ getValue: (formData) => parseFloat(formData.measurementValue) || 0,
1213
+ getAdditionalData: (formData) => ({
1214
+ intensity: formData.eventDescription,
1215
+ conceptUuid: PARTOGRAPHY_CONCEPTS['uterine-contractions'],
1216
+ intensityConceptUuid: PARTOGRAPHY_CONCEPTS['uterine-contraction-duration'],
1217
+ }),
1218
+ },
1219
+ 'descent-of-head': {
1220
+ validate: (formData) => isValidDescentOfHead(formData.measurementValue),
1221
+ getValue: (formData) => {
1222
+ const stationMapping = getDescentStationMapping();
1223
+ return stationMapping[formData.measurementValue] ?? 0;
1224
+ },
1225
+ getAdditionalData: (formData) => {
1226
+ const stationMapping = getDescentStationMapping();
1227
+ return {
1228
+ conceptUuid: formData.measurementValue,
1229
+ stationValue: stationMapping[formData.measurementValue] ?? 0,
1230
+ descentConceptUuid: PARTOGRAPHY_CONCEPTS['descent-of-head'],
1231
+ };
1232
+ },
1233
+ },
1234
+ 'fetal-heart-rate': {
1235
+ validate: (formData) => isValidMeasurement('fetal-heart-rate', formData.measurementValue),
1236
+ getValue: (formData) => parseFloat(formData.measurementValue) || 0,
1237
+ getAdditionalData: () => ({
1238
+ conceptUuid: PARTOGRAPHY_CONCEPTS['fetal-heart-rate'],
1239
+ }),
1240
+ },
1241
+ 'maternal-pulse': {
1242
+ validate: (formData) => isValidMeasurement('maternal-pulse', formData.measurementValue),
1243
+ getValue: (formData) => parseFloat(formData.measurementValue) || 0,
1244
+ getAdditionalData: () => ({
1245
+ conceptUuid: PARTOGRAPHY_CONCEPTS['maternal-pulse'],
1246
+ }),
1247
+ },
1248
+ temperature: {
1249
+ validate: (formData) => isValidMeasurement('temperature', formData.measurementValue),
1250
+ getValue: (formData) => parseFloat(formData.measurementValue) || 0,
1251
+ getAdditionalData: () => ({
1252
+ conceptUuid: PARTOGRAPHY_CONCEPTS.temperature,
1253
+ }),
1254
+ },
1255
+ };
1256
+
1257
+ export const getDefaultProcessor = (graphType: string): GraphDataProcessor => ({
1258
+ validate: (formData) => isValidMeasurement(graphType, formData.measurementValue),
1259
+ getValue: (formData) => parseFloat(formData.measurementValue) || 0,
1260
+ getAdditionalData: () => ({
1261
+ conceptUuid: PARTOGRAPHY_CONCEPTS[graphType as keyof typeof PARTOGRAPHY_CONCEPTS] || '',
1262
+ }),
1263
+ });
1264
+
1265
+ export const getGraphDataProcessor = (graphType: string): GraphDataProcessor => {
1266
+ return GRAPH_DATA_PROCESSORS[graphType] || getDefaultProcessor(graphType);
1267
+ };
1268
+
1269
+ export const CERVIX_CHART_OPTIONS = {
1270
+ title: 'Cervical Dilation',
1271
+ axes: {
1272
+ bottom: {
1273
+ title: 'Time (Hours)',
1274
+ scaleType: 'time',
1275
+ },
1276
+ left: {
1277
+ title: 'Dilation (cm)',
1278
+ mapsTo: 'value',
1279
+ domain: [0, 10],
1280
+ ticks: {
1281
+ values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
1282
+ },
1283
+ scaleType: 'linear',
1284
+ },
1285
+ },
1286
+ data: {
1287
+ groups: {
1288
+ 'Alert Line': { stroke: 'orange', dashed: true, line: { strokeDasharray: '4 4' } },
1289
+ 'Action Line': { stroke: 'red', dashed: true, line: { strokeDasharray: '4 4' } },
1290
+ },
1291
+ },
1292
+ curve: 'curveLinear',
1293
+ };
1294
+
1295
+ export const SVG_NAMESPACE = 'http://www.w3.org/2000/svg' as const;
1296
+
1297
+ export const generateRange = (start: number, end: number, step = 1): number[] => {
1298
+ const result: number[] = [];
1299
+ const precision = Math.max(0, (step.toString().split('.')[1] || '').length);
1300
+ for (let v = start; v <= end + Number.EPSILON; v = +(v + step).toFixed(precision)) {
1301
+ result.push(Number(v.toFixed(precision)));
1302
+ }
1303
+ return result;
1304
+ };
1305
+
1306
+ export const AMNIOTIC_FLUID_INITIALS_MAP: Record<string, string> = {
1307
+ 'Membrane intact': 'M',
1308
+ 'Clear liquor': 'C',
1309
+ Clear: 'C',
1310
+ 'Meconium Stained': 'MS',
1311
+ 'Meconium staining': 'MS',
1312
+ Absent: 'A',
1313
+ 'Blood Stained': 'B',
1314
+ 'Blood stained': 'B',
1315
+ A: 'A',
1316
+ C: 'C',
1317
+ MS: 'MS',
1318
+ B: 'B',
1319
+ };
1320
+
1321
+ export const AMNIOTIC_FLUID_LABEL_MAP: Record<string, string> = {
1322
+ M: 'Membrane intact',
1323
+ C: 'Clear liquor',
1324
+ MS: 'Meconium Stained',
1325
+ A: 'Absent',
1326
+ B: 'Blood Stained',
1327
+ };
1328
+
1329
+ export const MOULDING_SYMBOL_MAP: Record<string, string> = {
1330
+ '0': '0',
1331
+ '+': '+',
1332
+ '++': '++',
1333
+ '+++': '+++',
1334
+ None: '0',
1335
+ 'ONE PLUS': '+',
1336
+ 'TWO PLUS': '++',
1337
+ 'THREE PLUS': '+++',
1338
+ };
1339
+
1340
+ export const OXYTOCIN_FORM_CONCEPTS = {
1341
+ time: OXYTOCIN_TIME_CONCEPT,
1342
+ oxytocinDropsPerMinute: OXYTOCIN_DROPS_PER_MINUTE_CONCEPT,
1343
+ } as const;
1344
+ export const CERVIX_FORM_CONCEPTS = {
1345
+ hour: FETAL_HEART_RATE_HOUR_CONCEPT,
1346
+ time: FETAL_HEART_RATE_TIME_CONCEPT,
1347
+ cervicalDilation: CERVIX_CONCEPT,
1348
+ descentOfHead: DESCENT_OF_HEAD_CONCEPT,
1349
+ } as const;