@ampath/esm-dha-workflow-app 4.0.0-next.35 → 4.0.0-next.355

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 (793) hide show
  1. package/README.md +19 -0
  2. package/dist/1149.js +1 -0
  3. package/dist/1149.js.map +1 -0
  4. package/dist/1171.js +1 -0
  5. package/dist/1171.js.map +1 -0
  6. package/dist/1197.js +1 -0
  7. package/dist/1239.js +1 -0
  8. package/dist/1239.js.map +1 -0
  9. package/dist/1277.js +1 -0
  10. package/dist/1277.js.map +1 -0
  11. package/dist/1363.js +1 -0
  12. package/dist/1363.js.map +1 -0
  13. package/dist/1551.js +1 -0
  14. package/dist/1551.js.map +1 -0
  15. package/dist/1556.js +1 -0
  16. package/dist/1556.js.map +1 -0
  17. package/dist/1560.js +1 -0
  18. package/dist/1560.js.map +1 -0
  19. package/dist/1925.js +1 -0
  20. package/dist/1925.js.map +1 -0
  21. package/dist/1927.js +1 -0
  22. package/dist/1927.js.map +1 -0
  23. package/dist/2054.js +1 -0
  24. package/dist/2054.js.map +1 -0
  25. package/dist/2093.js +1 -0
  26. package/dist/2093.js.map +1 -0
  27. package/dist/2177.js +2 -0
  28. package/dist/2177.js.map +1 -0
  29. package/dist/2230.js +1 -0
  30. package/dist/2230.js.map +1 -0
  31. package/dist/2493.js +1 -0
  32. package/dist/2493.js.map +1 -0
  33. package/dist/3041.js +1 -0
  34. package/dist/3041.js.map +1 -0
  35. package/dist/3099.js +1 -0
  36. package/dist/3101.js +1 -0
  37. package/dist/3101.js.map +1 -0
  38. package/dist/313.js +1 -0
  39. package/dist/313.js.map +1 -0
  40. package/dist/3184.js +2 -0
  41. package/dist/3184.js.map +1 -0
  42. package/dist/3202.js +1 -0
  43. package/dist/3202.js.map +1 -0
  44. package/dist/3222.js +1 -0
  45. package/dist/3222.js.map +1 -0
  46. package/dist/327.js +1 -0
  47. package/dist/327.js.map +1 -0
  48. package/dist/347.js +1 -0
  49. package/dist/347.js.map +1 -0
  50. package/dist/3595.js +1 -0
  51. package/dist/3595.js.map +1 -0
  52. package/dist/3928.js +1 -0
  53. package/dist/3928.js.map +1 -0
  54. package/dist/3939.js +1 -0
  55. package/dist/3939.js.map +1 -0
  56. package/dist/4003.js +1 -0
  57. package/dist/4003.js.map +1 -0
  58. package/dist/4055.js +1 -0
  59. package/dist/4205.js +1 -0
  60. package/dist/4205.js.map +1 -0
  61. package/dist/4225.js +1 -0
  62. package/dist/4225.js.map +1 -0
  63. package/dist/4231.js +1 -0
  64. package/dist/4231.js.map +1 -0
  65. package/dist/4300.js +1 -0
  66. package/dist/4335.js +1 -0
  67. package/dist/4353.js +1 -0
  68. package/dist/4353.js.map +1 -0
  69. package/dist/4431.js +1 -0
  70. package/dist/4431.js.map +1 -0
  71. package/dist/4454.js +1 -0
  72. package/dist/4454.js.map +1 -0
  73. package/dist/4457.js +2 -0
  74. package/dist/4457.js.LICENSE.txt +282 -0
  75. package/dist/4457.js.map +1 -0
  76. package/dist/4605.js +1 -0
  77. package/dist/4605.js.map +1 -0
  78. package/dist/4611.js +1 -0
  79. package/dist/4611.js.map +1 -0
  80. package/dist/4652.js +1 -0
  81. package/dist/4674.js +1 -0
  82. package/dist/4674.js.map +1 -0
  83. package/dist/4755.js +1 -0
  84. package/dist/4755.js.map +1 -0
  85. package/dist/4856.js +1 -0
  86. package/dist/4856.js.map +1 -0
  87. package/dist/4986.js +1 -0
  88. package/dist/4986.js.map +1 -0
  89. package/dist/5119.js +1 -0
  90. package/dist/5119.js.map +1 -0
  91. package/dist/5167.js +1 -0
  92. package/dist/5167.js.map +1 -0
  93. package/dist/5317.js +1 -0
  94. package/dist/5317.js.map +1 -0
  95. package/dist/5344.js +1 -0
  96. package/dist/5344.js.map +1 -0
  97. package/dist/5380.js +1 -0
  98. package/dist/5380.js.map +1 -0
  99. package/dist/5422.js +1 -0
  100. package/dist/5422.js.map +1 -0
  101. package/dist/5576.js +1 -0
  102. package/dist/5576.js.map +1 -0
  103. package/dist/5724.js +1 -0
  104. package/dist/5724.js.map +1 -0
  105. package/dist/5851.js +1 -0
  106. package/dist/5851.js.map +1 -0
  107. package/dist/5961.js +1 -0
  108. package/dist/5961.js.map +1 -0
  109. package/dist/6177.js +1 -0
  110. package/dist/6177.js.map +1 -0
  111. package/dist/6264.js +1 -0
  112. package/dist/6264.js.map +1 -0
  113. package/dist/6540.js +2 -0
  114. package/dist/6540.js.map +1 -0
  115. package/dist/6606.js +1 -0
  116. package/dist/6606.js.map +1 -0
  117. package/dist/6720.js +1 -0
  118. package/dist/6720.js.map +1 -0
  119. package/dist/6824.js +1 -0
  120. package/dist/6824.js.map +1 -0
  121. package/dist/6942.js +1 -0
  122. package/dist/6942.js.map +1 -0
  123. package/dist/71.js +1 -0
  124. package/dist/71.js.map +1 -0
  125. package/dist/7207.js +1 -0
  126. package/dist/7207.js.map +1 -0
  127. package/dist/7255.js +1 -0
  128. package/dist/7255.js.map +1 -0
  129. package/dist/7420.js +1 -0
  130. package/dist/7420.js.map +1 -0
  131. package/dist/7521.js +1 -0
  132. package/dist/7521.js.map +1 -0
  133. package/dist/7549.js +1 -0
  134. package/dist/7549.js.map +1 -0
  135. package/dist/7557.js +1 -0
  136. package/dist/7557.js.map +1 -0
  137. package/dist/7717.js +1 -0
  138. package/dist/7717.js.map +1 -0
  139. package/dist/7830.js +2 -0
  140. package/dist/7830.js.map +1 -0
  141. package/dist/7857.js +1 -0
  142. package/dist/7857.js.map +1 -0
  143. package/dist/7941.js +1 -0
  144. package/dist/7941.js.map +1 -0
  145. package/dist/8091.js +1 -0
  146. package/dist/8091.js.map +1 -0
  147. package/dist/810.js +1 -0
  148. package/dist/810.js.map +1 -0
  149. package/dist/8146.js +1 -0
  150. package/dist/8146.js.map +1 -0
  151. package/dist/850.js +1 -0
  152. package/dist/850.js.map +1 -0
  153. package/dist/8558.js +1 -0
  154. package/dist/8558.js.map +1 -0
  155. package/dist/8684.js +1 -0
  156. package/dist/8684.js.map +1 -0
  157. package/dist/8895.js +1 -0
  158. package/dist/8895.js.map +1 -0
  159. package/dist/9070.js +1 -0
  160. package/dist/9070.js.map +1 -0
  161. package/dist/9091.js +1 -0
  162. package/dist/9091.js.map +1 -0
  163. package/dist/9093.js +1 -0
  164. package/dist/9093.js.map +1 -0
  165. package/dist/9338.js +1 -0
  166. package/dist/9338.js.map +1 -0
  167. package/dist/9349.js +1 -0
  168. package/dist/9349.js.map +1 -0
  169. package/dist/9418.js +2 -0
  170. package/dist/9418.js.LICENSE.txt +1 -0
  171. package/dist/9418.js.map +1 -0
  172. package/dist/9428.js +1 -0
  173. package/dist/9428.js.map +1 -0
  174. package/dist/9583.js +2 -0
  175. package/dist/9583.js.map +1 -0
  176. package/dist/9871.js +1 -0
  177. package/dist/9871.js.map +1 -0
  178. package/dist/esm-dha-workflow-app.js +1 -1
  179. package/dist/esm-dha-workflow-app.js.buildmanifest.json +1830 -221
  180. package/dist/esm-dha-workflow-app.js.map +1 -1
  181. package/dist/main.js +1 -1
  182. package/dist/main.js.map +1 -1
  183. package/dist/routes.json +1 -1
  184. package/local-config.json +9 -0
  185. package/package.json +16 -6
  186. package/src/admissions/admission-request-list/admission-request-list.scss +0 -0
  187. package/src/admissions/admission-request-list/admission-request-list.tsx +263 -0
  188. package/src/admissions/admissions-dashboard.component.scss +15 -0
  189. package/src/admissions/admissions-dashboard.component.tsx +277 -0
  190. package/src/admissions/admissions.resource.ts +233 -0
  191. package/src/admissions/admitted-list/admitted-patients-list.tsx +206 -0
  192. package/src/admissions/awaiting-discharge-list/awaiting-discharge-list.tsx +197 -0
  193. package/src/admissions/bed-assigment-request/bed-assignment-request-list.tsx +134 -0
  194. package/src/admissions/constants/index.ts +33 -0
  195. package/src/admissions/discharged-list/discharged-list.scss +0 -0
  196. package/src/admissions/discharged-list/discharged-list.tsx +67 -0
  197. package/src/admissions/form-entry-workspace/form-entry-workspace.tsx +62 -0
  198. package/src/admissions/inpatient/admission-history/patient-admission-history.tsx +76 -0
  199. package/src/admissions/inpatient/admission-requests/patient-admission-requests.scss +19 -0
  200. package/src/admissions/inpatient/admission-requests/patient-admission-requests.tsx +72 -0
  201. package/src/admissions/inpatient/inpatient-admissions.component.scss +7 -0
  202. package/src/admissions/inpatient/inpatient-admissions.component.tsx +46 -0
  203. package/src/admissions/modal/add-bill-items/add-bill-items.modal.scss +17 -0
  204. package/src/admissions/modal/add-bill-items/add-bill-items.modal.tsx +233 -0
  205. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.scss +23 -0
  206. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.tsx +156 -0
  207. package/src/admissions/modal/admit-patient/admit-patient.modal.scss +0 -0
  208. package/src/admissions/modal/admit-patient/admit-patient.modal.tsx +111 -0
  209. package/src/admissions/modal/bed-swap/bed-swap.modal.scss +0 -0
  210. package/src/admissions/modal/bed-swap/bed-swap.modal.tsx +102 -0
  211. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.scss +11 -0
  212. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.tsx +105 -0
  213. package/src/admissions/modal/discharge/discharge-patient.modal.scss +13 -0
  214. package/src/admissions/modal/discharge/discharge-patient.modal.tsx +86 -0
  215. package/src/admissions/types/index.ts +263 -0
  216. package/src/appointments/appointments.component.scss +6 -0
  217. package/src/appointments/appointments.component.tsx +8 -1
  218. package/src/billing/api/billing.api.ts +139 -0
  219. package/src/billing/billing-claims.resource.ts +916 -0
  220. package/src/billing/billing-dashboard-link.component.tsx +31 -0
  221. package/src/billing/billing-dashboard-reset.ts +27 -0
  222. package/src/billing/billing-root.tsx +42 -0
  223. package/src/billing/dashboard/billingDashboard.component.scss +0 -0
  224. package/src/billing/dashboard/billingDashboard.component.tsx +25 -0
  225. package/src/billing/dashboard/v2/active-visits/active-visits.component.tsx +257 -0
  226. package/src/billing/dashboard/v2/active-visits/active-visits.resource.ts +85 -0
  227. package/src/billing/dashboard/v2/active-visits/active-visits.scss +15 -0
  228. package/src/billing/dashboard/v2/active-visits.component.tsx +102 -0
  229. package/src/billing/dashboard/v2/admissions/admission-requests-tab.component.tsx +79 -0
  230. package/src/billing/dashboard/v2/billing-claims-dashboard.component.scss +209 -0
  231. package/src/billing/dashboard/v2/billing-claims-dashboard.component.tsx +396 -0
  232. package/src/billing/dashboard/v2/cash-checklist/bill-document.component.scss +90 -0
  233. package/src/billing/dashboard/v2/cash-checklist/bill-document.component.tsx +101 -0
  234. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.component.scss +199 -0
  235. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.component.tsx +361 -0
  236. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.resource.ts +239 -0
  237. package/src/billing/dashboard/v2/cash-checklist/payment-drawer.component.scss +246 -0
  238. package/src/billing/dashboard/v2/cash-checklist/payment-drawer.component.tsx +182 -0
  239. package/src/billing/dashboard/v2/claim-statuses.ts +143 -0
  240. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.scss +0 -0
  241. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.tsx +35 -0
  242. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-panel.component.scss +67 -0
  243. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-panel.component.tsx +90 -0
  244. package/src/billing/dashboard/v2/claim-visits/claim-doctors/claim-doctors.scss +28 -0
  245. package/src/billing/dashboard/v2/claim-visits/claim-doctors/claim-doctors.tsx +36 -0
  246. package/src/billing/dashboard/v2/claim-visits/claim-history/claim-history.component.scss +119 -0
  247. package/src/billing/dashboard/v2/claim-visits/claim-history/claim-history.component.tsx +198 -0
  248. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-details.component.scss +5 -0
  249. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-details.component.tsx +160 -0
  250. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-panel.component.scss +105 -0
  251. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-panel.component.tsx +184 -0
  252. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/intervention-attachments.component.scss +161 -0
  253. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/intervention-attachments.component.tsx +328 -0
  254. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-details.component.tsx +96 -0
  255. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-document.component.tsx +236 -0
  256. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-panel.component.scss +98 -0
  257. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-panel.component.tsx +292 -0
  258. package/src/billing/dashboard/v2/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.scss +133 -0
  259. package/src/billing/dashboard/v2/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.tsx +217 -0
  260. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-by-token.component.tsx +150 -0
  261. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-page.component.scss +13 -0
  262. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-page.component.tsx +116 -0
  263. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-visit-details.component.scss +338 -0
  264. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-visit-details.component.tsx +616 -0
  265. package/src/billing/dashboard/v2/claim-visits/claim-visits.component.scss +5 -0
  266. package/src/billing/dashboard/v2/claim-visits/claim-visits.component.tsx +133 -0
  267. package/src/billing/dashboard/v2/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.scss +5 -0
  268. package/src/billing/dashboard/v2/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.tsx +49 -0
  269. package/src/billing/dashboard/v2/claim-visits/modal/claim-visit-details/claim-visit-details.modal.scss +17 -0
  270. package/src/billing/dashboard/v2/claim-visits/modal/claim-visit-details/claim-visit-details.modal.tsx +56 -0
  271. package/src/billing/dashboard/v2/claim-visits/modal/close-claim/close-claim.modal.scss +0 -0
  272. package/src/billing/dashboard/v2/claim-visits/modal/close-claim/close-claim.modal.tsx +129 -0
  273. package/src/billing/dashboard/v2/claim-visits/modal/submit-claim/submit-claim.modal.tsx +204 -0
  274. package/src/billing/dashboard/v2/claim-visits/shared/_empty-state.scss +28 -0
  275. package/src/billing/dashboard/v2/claim-visits/shared/record-cards.component.scss +298 -0
  276. package/src/billing/dashboard/v2/claim-visits/shared/record-cards.component.tsx +252 -0
  277. package/src/billing/dashboard/v2/claim-visits/shared/record-details.workspace.scss +42 -0
  278. package/src/billing/dashboard/v2/claim-visits/shared/record-details.workspace.tsx +54 -0
  279. package/src/billing/dashboard/v2/claim-visits/shared/record-table.component.scss +61 -0
  280. package/src/billing/dashboard/v2/claim-visits/shared/record-table.component.tsx +150 -0
  281. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.resource.ts +51 -0
  282. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.workspace.scss +191 -0
  283. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.workspace.tsx +648 -0
  284. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.component.scss +595 -0
  285. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.component.tsx +810 -0
  286. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.resource.ts +282 -0
  287. package/src/billing/dashboard/v2/claims-accounting/bill-utils.ts +134 -0
  288. package/src/billing/dashboard/v2/claims-accounting/claim-detail.component.tsx +346 -0
  289. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.component.scss +546 -0
  290. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.component.tsx +206 -0
  291. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.resource.ts +337 -0
  292. package/src/billing/dashboard/v2/claims-accounting/invoice-document.component.scss +90 -0
  293. package/src/billing/dashboard/v2/claims-accounting/invoice-document.component.tsx +90 -0
  294. package/src/billing/dashboard/v2/claims-accounting/remittances.component.tsx +169 -0
  295. package/src/billing/dashboard/v2/claims-accounting/remittances.resource.ts +46 -0
  296. package/src/billing/dashboard/v2/claims-accounting/status-meta.ts +25 -0
  297. package/src/billing/dashboard/v2/clearance/cash-patients.scss +18 -0
  298. package/src/billing/dashboard/v2/clearance/cash.component.tsx +145 -0
  299. package/src/billing/dashboard/v2/clearance/clearance.component.scss +84 -0
  300. package/src/billing/dashboard/v2/clearance/clearance.component.tsx +225 -0
  301. package/src/billing/dashboard/v2/clearance/pay-cash.component.tsx +202 -0
  302. package/src/billing/dashboard/v2/clearance/pay-cash.scss +28 -0
  303. package/src/billing/dashboard/v2/clearance/prepaid-services.component.tsx +112 -0
  304. package/src/billing/dashboard/v2/facility-bills/claim-status.ts +249 -0
  305. package/src/billing/dashboard/v2/facility-bills/facility-bills.component.scss +140 -0
  306. package/src/billing/dashboard/v2/facility-bills/facility-bills.component.tsx +688 -0
  307. package/src/billing/dashboard/v2/facility-bills/preauths-datatables/pending-preauths.component.tsx +132 -0
  308. package/src/billing/dashboard/v2/facility-bills/preauths-datatables/preauth-preview-table.component.tsx +267 -0
  309. package/src/billing/dashboard/v2/facility-bills/preauths.component.tsx +130 -0
  310. package/src/billing/dashboard/v2/inpatient-requests/inpatient-requests.component.scss +22 -0
  311. package/src/billing/dashboard/v2/inpatient-requests/inpatient-requests.component.tsx +389 -0
  312. package/src/billing/dashboard/v2/inpatient-requests/modal/start-inpatient-claim/start-inpatient-claim.component.scss +0 -0
  313. package/src/billing/dashboard/v2/inpatient-requests/modal/start-inpatient-claim/start-inpatient-claim.component.tsx +0 -0
  314. package/src/billing/dashboard/v2/new-facility-bills/bills-table.component.tsx +78 -0
  315. package/src/billing/dashboard/v2/new-facility-bills/bills-table.scss +18 -0
  316. package/src/billing/dashboard/v2/new-facility-bills/new-facility-bills.component.tsx +64 -0
  317. package/src/billing/dashboard/v2/new-facility-bills/new-facility-bills.scss +146 -0
  318. package/src/billing/dashboard/v2/patient-bill-details/attachments/add-attachments.component.tsx +223 -0
  319. package/src/billing/dashboard/v2/patient-bill-details/attachments/attachment.component.tsx +157 -0
  320. package/src/billing/dashboard/v2/patient-bill-details/attachments/attachments.scss +92 -0
  321. package/src/billing/dashboard/v2/patient-bill-details/attachments/case-summary/case-summary.scss +295 -0
  322. package/src/billing/dashboard/v2/patient-bill-details/attachments/case-summary/case-summary.tsx +326 -0
  323. package/src/billing/dashboard/v2/patient-bill-details/attachments/dialysis/dialysis-chart.scss +238 -0
  324. package/src/billing/dashboard/v2/patient-bill-details/attachments/dialysis/dialysis-chart.tsx +269 -0
  325. package/src/billing/dashboard/v2/patient-bill-details/attachments/discharge-summary/discharge-summary.scss +96 -0
  326. package/src/billing/dashboard/v2/patient-bill-details/attachments/discharge-summary/discharge-summary.tsx +124 -0
  327. package/src/billing/dashboard/v2/patient-bill-details/attachments/final-bill.component.tsx +152 -0
  328. package/src/billing/dashboard/v2/patient-bill-details/attachments/final-bill.scss +225 -0
  329. package/src/billing/dashboard/v2/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.scss +182 -0
  330. package/src/billing/dashboard/v2/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.tsx +173 -0
  331. package/src/billing/dashboard/v2/patient-bill-details/attachments/generate-attachments.component.tsx +371 -0
  332. package/src/billing/dashboard/v2/patient-bill-details/attachments/invoice.component.tsx +151 -0
  333. package/src/billing/dashboard/v2/patient-bill-details/attachments/invoice.scss +225 -0
  334. package/src/billing/dashboard/v2/patient-bill-details/attachments/type.ts +44 -0
  335. package/src/billing/dashboard/v2/patient-bill-details/bill-details/bill-details.scss +107 -0
  336. package/src/billing/dashboard/v2/patient-bill-details/bill-details/bill-details.tsx +508 -0
  337. package/src/billing/dashboard/v2/patient-bill-details/bill-details-page.component.scss +30 -0
  338. package/src/billing/dashboard/v2/patient-bill-details/bill-details-page.component.tsx +94 -0
  339. package/src/billing/dashboard/v2/patient-bill-details/claim-details/claim-details-skeleton.component.scss +89 -0
  340. package/src/billing/dashboard/v2/patient-bill-details/claim-details/claim-details-skeleton.component.tsx +53 -0
  341. package/src/billing/dashboard/v2/patient-bill-details/claim-details/patient-claim-details.component.scss +32 -0
  342. package/src/billing/dashboard/v2/patient-bill-details/claim-details/patient-claim-details.component.tsx +215 -0
  343. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.scss +0 -0
  344. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.tsx +99 -0
  345. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-line/add-claim-line.modal.tsx +187 -0
  346. package/src/billing/dashboard/v2/patient-bill-details/patient-bill-details.scss +153 -0
  347. package/src/billing/dashboard/v2/patient-bill-details/patient-bill-details.tsx +458 -0
  348. package/src/billing/dashboard/v2/patient-bill-details/payment-mode.ts +124 -0
  349. package/src/billing/dashboard/v2/patient-bill-details/workspaces/add-claim-line/add-claim-line.workspace.scss +27 -0
  350. package/src/billing/dashboard/v2/patient-bill-details/workspaces/add-claim-line/add-claim-line.workspace.tsx +223 -0
  351. package/src/billing/dashboard/v2/patient-bill-details/workspaces/bill-item-payment/bill-item-payment.workspace.scss +27 -0
  352. package/src/billing/dashboard/v2/patient-bill-details/workspaces/bill-item-payment/bill-item-payment.workspace.tsx +109 -0
  353. package/src/billing/dashboard/v2/preauth/preauth-attachments.component.tsx +389 -0
  354. package/src/billing/dashboard/v2/preauth/preauth-list.component.scss +38 -0
  355. package/src/billing/dashboard/v2/preauth/preauth-list.component.tsx +241 -0
  356. package/src/billing/dashboard/v2/preauth/preauth-status-tag.component.tsx +75 -0
  357. package/src/billing/dashboard/v2/preauth/preauth-typed-fields.md +125 -0
  358. package/src/billing/dashboard/v2/preauth/preauth.resource.ts +1067 -0
  359. package/src/billing/dashboard/v2/preauth/preauth.workspace.scss +91 -0
  360. package/src/billing/dashboard/v2/preauth/preauth.workspace.tsx +1802 -0
  361. package/src/billing/dashboard/v2/preauth/preauthorizations-tab.component.tsx +49 -0
  362. package/src/billing/dashboard/v2/sha-claims/sha-claims-table.component.tsx +36 -0
  363. package/src/billing/dashboard/v2/sha-claims/sha-claims.component.tsx +60 -0
  364. package/src/billing/dashboard/v2/sha-claims/sha-claims.scss +8 -0
  365. package/src/billing/dashboard/v2/shared/dash-board-card/dash-board-card.component.scss +17 -0
  366. package/src/billing/dashboard/v2/shared/dash-board-card/dash-board-card.component.tsx +15 -0
  367. package/src/billing/dashboard/v2/shared/empty-state.component.scss +24 -0
  368. package/src/billing/dashboard/v2/shared/empty-state.component.tsx +13 -0
  369. package/src/billing/dashboard/v2/shared/scroll-to-top.component.scss +54 -0
  370. package/src/billing/dashboard/v2/shared/scroll-to-top.component.tsx +54 -0
  371. package/src/billing/dashboard/v2/shared/table-toolbar.component.scss +77 -0
  372. package/src/billing/dashboard/v2/shared/table-toolbar.component.tsx +48 -0
  373. package/src/billing/dashboard/v2/types/index.ts +514 -0
  374. package/src/billing/dashboard/v3/active-visits/active-visits.component.tsx +256 -0
  375. package/src/billing/dashboard/v3/active-visits/active-visits.resource.ts +57 -0
  376. package/src/billing/dashboard/v3/active-visits/active-visits.scss +15 -0
  377. package/src/billing/dashboard/v3/cash-checklist/bill-document.component.scss +90 -0
  378. package/src/billing/dashboard/v3/cash-checklist/bill-document.component.tsx +101 -0
  379. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.component.scss +199 -0
  380. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.component.tsx +361 -0
  381. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.resource.ts +240 -0
  382. package/src/billing/dashboard/v3/cash-checklist/payment-drawer.component.scss +246 -0
  383. package/src/billing/dashboard/v3/cash-checklist/payment-drawer.component.tsx +182 -0
  384. package/src/billing/dashboard/v3/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.scss +0 -0
  385. package/src/billing/dashboard/v3/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.tsx +44 -0
  386. package/src/billing/dashboard/v3/claim-visits/claim-doctors/claim-doctors.scss +5 -0
  387. package/src/billing/dashboard/v3/claim-visits/claim-doctors/claim-doctors.tsx +42 -0
  388. package/src/billing/dashboard/v3/claim-visits/claim-documents/claim-documents.scss +10 -0
  389. package/src/billing/dashboard/v3/claim-visits/claim-documents/claim-documents.tsx +25 -0
  390. package/src/billing/dashboard/v3/claim-visits/claim-intervention-details/claim-intervention-details.component.tsx +220 -0
  391. package/src/billing/dashboard/v3/claim-visits/claim-invoice-details/claim-invoice-details.component.scss +6 -0
  392. package/src/billing/dashboard/v3/claim-visits/claim-invoice-details/claim-invoice-details.component.tsx +85 -0
  393. package/src/billing/dashboard/v3/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.scss +0 -0
  394. package/src/billing/dashboard/v3/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.tsx +109 -0
  395. package/src/billing/dashboard/v3/claim-visits/claim-visit-details/claim-visit-details.component.scss +97 -0
  396. package/src/billing/dashboard/v3/claim-visits/claim-visit-details/claim-visit-details.component.tsx +343 -0
  397. package/src/billing/dashboard/v3/claim-visits/claim-visits.component.scss +5 -0
  398. package/src/billing/dashboard/v3/claim-visits/claim-visits.component.tsx +139 -0
  399. package/src/billing/dashboard/v3/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.scss +5 -0
  400. package/src/billing/dashboard/v3/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.tsx +49 -0
  401. package/src/billing/dashboard/v3/claim-visits/modal/claim-invoice-lines/claim-invoice-lines.modal.scss +7 -0
  402. package/src/billing/dashboard/v3/claim-visits/modal/claim-invoice-lines/claim-invoice-lines.modal.tsx +35 -0
  403. package/src/billing/dashboard/v3/claim-visits/modal/claim-visit-details/claim-visit-details.modal.scss +6 -0
  404. package/src/billing/dashboard/v3/claim-visits/modal/claim-visit-details/claim-visit-details.modal.tsx +33 -0
  405. package/src/billing/dashboard/v3/claim-visits/modal/close-claim/close-claim.modal.scss +0 -0
  406. package/src/billing/dashboard/v3/claim-visits/modal/close-claim/close-claim.modal.tsx +129 -0
  407. package/src/billing/dashboard/v3/claim-visits/modal/submit-claim/submit-claim.modal.tsx +204 -0
  408. package/src/billing/dashboard/v3/claim-visits/payer-preview/index.scss +140 -0
  409. package/src/billing/dashboard/v3/claim-visits/payer-preview/payer-preview-tile.component.tsx +55 -0
  410. package/src/billing/dashboard/v3/claim-visits/payer-preview/payer-preview-workspace.component.tsx +157 -0
  411. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-doctors.component.tsx +54 -0
  412. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-lines.component.tsx +48 -0
  413. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-notes.component.tsx +47 -0
  414. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-diagnoses.component.tsx +44 -0
  415. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-interventions.component.tsx +44 -0
  416. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.resource.ts +51 -0
  417. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.workspace.scss +191 -0
  418. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.workspace.tsx +648 -0
  419. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.component.scss +595 -0
  420. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.component.tsx +810 -0
  421. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.resource.ts +282 -0
  422. package/src/billing/dashboard/v3/claims-accounting/bill-utils.ts +134 -0
  423. package/src/billing/dashboard/v3/claims-accounting/claim-detail.component.tsx +346 -0
  424. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.component.scss +546 -0
  425. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.component.tsx +206 -0
  426. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.resource.ts +337 -0
  427. package/src/billing/dashboard/v3/claims-accounting/invoice-document.component.scss +90 -0
  428. package/src/billing/dashboard/v3/claims-accounting/invoice-document.component.tsx +90 -0
  429. package/src/billing/dashboard/v3/claims-accounting/remittances.component.tsx +169 -0
  430. package/src/billing/dashboard/v3/claims-accounting/remittances.resource.ts +46 -0
  431. package/src/billing/dashboard/v3/claims-accounting/status-meta.ts +25 -0
  432. package/src/billing/dashboard/v3/clearance/clearance.component.scss +100 -0
  433. package/src/billing/dashboard/v3/clearance/clearance.component.tsx +0 -0
  434. package/src/billing/dashboard/v3/clearance/prepaid-services.component.tsx +112 -0
  435. package/src/billing/dashboard/v3/facility-bills/claim-status.ts +243 -0
  436. package/src/billing/dashboard/v3/facility-bills/facility-bills.component.scss +72 -0
  437. package/src/billing/dashboard/v3/facility-bills/facility-bills.component.tsx +181 -0
  438. package/src/billing/dashboard/v3/facility-bills/preauths-datatables/pending-preauths.component.tsx +132 -0
  439. package/src/billing/dashboard/v3/facility-bills/preauths-datatables/preauth-preview-table.component.tsx +232 -0
  440. package/src/billing/dashboard/v3/facility-bills/preauths.component.tsx +127 -0
  441. package/src/billing/dashboard/v3/patient-bill-details/attachments/add-attachments.component.tsx +223 -0
  442. package/src/billing/dashboard/v3/patient-bill-details/attachments/attachment.component.tsx +157 -0
  443. package/src/billing/dashboard/v3/patient-bill-details/attachments/attachments.scss +92 -0
  444. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary-helper.ts +58 -0
  445. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary.scss +295 -0
  446. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary.tsx +287 -0
  447. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-chart.scss +238 -0
  448. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-chart.tsx +317 -0
  449. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-helper.ts +94 -0
  450. package/src/billing/dashboard/v3/patient-bill-details/attachments/discharge-summary/discharge-summary.scss +96 -0
  451. package/src/billing/dashboard/v3/patient-bill-details/attachments/discharge-summary/discharge-summary.tsx +126 -0
  452. package/src/billing/dashboard/v3/patient-bill-details/attachments/final-bill.component.tsx +75 -0
  453. package/src/billing/dashboard/v3/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.scss +182 -0
  454. package/src/billing/dashboard/v3/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.tsx +253 -0
  455. package/src/billing/dashboard/v3/patient-bill-details/attachments/generate-attachments.component.tsx +345 -0
  456. package/src/billing/dashboard/v3/patient-bill-details/attachments/invoice.component.tsx +150 -0
  457. package/src/billing/dashboard/v3/patient-bill-details/attachments/invoice.scss +225 -0
  458. package/src/billing/dashboard/v3/patient-bill-details/attachments/type.ts +259 -0
  459. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.scss +17 -0
  460. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.tsx +260 -0
  461. package/src/billing/dashboard/v3/patient-bill-details/claim-details/patient-claim-details.component.scss +0 -0
  462. package/src/billing/dashboard/v3/patient-bill-details/claim-details/patient-claim-details.component.tsx +68 -0
  463. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.scss +0 -0
  464. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.tsx +99 -0
  465. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-line/add-claim-line.modal.scss +14 -0
  466. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-line/add-claim-line.modal.tsx +112 -0
  467. package/src/billing/dashboard/v3/patient-bill-details/modals/bill-item-payment/bill-item-payment.modal.scss +6 -0
  468. package/src/billing/dashboard/v3/patient-bill-details/modals/bill-item-payment/bill-item-payment.modal.tsx +139 -0
  469. package/src/billing/dashboard/v3/patient-bill-details/patient-bill-details.scss +85 -0
  470. package/src/billing/dashboard/v3/patient-bill-details/patient-bill-details.tsx +343 -0
  471. package/src/billing/dashboard/v3/patient-bill-details/visit-diagnosis-details/visit-diagnosis-details.component.scss +0 -0
  472. package/src/billing/dashboard/v3/patient-bill-details/visit-diagnosis-details/visit-diagnosis-details.component.tsx +92 -0
  473. package/src/billing/dashboard/v3/preauth/elective/elective-authorize.resource.ts +284 -0
  474. package/src/billing/dashboard/v3/preauth/elective/elective-preauth-request.workspace.scss +125 -0
  475. package/src/billing/dashboard/v3/preauth/elective/elective-preauth-request.workspace.tsx +1184 -0
  476. package/src/billing/dashboard/v3/preauth/elective/elective-preauth.component.scss +15 -0
  477. package/src/billing/dashboard/v3/preauth/elective/elective-preauth.component.tsx +377 -0
  478. package/src/billing/dashboard/v3/preauth/elective/elective-preauth.resource.ts +1378 -0
  479. package/src/billing/dashboard/v3/preauth/elective/elective-requests-list.component.tsx +357 -0
  480. package/src/billing/dashboard/v3/preauth/preauth-attachments.component.tsx +389 -0
  481. package/src/billing/dashboard/v3/preauth/preauth-list.component.scss +34 -0
  482. package/src/billing/dashboard/v3/preauth/preauth-list.component.tsx +300 -0
  483. package/src/billing/dashboard/v3/preauth/preauth-status-tag.component.tsx +75 -0
  484. package/src/billing/dashboard/v3/preauth/preauth-typed-fields.md +125 -0
  485. package/src/billing/dashboard/v3/preauth/preauth.resource.ts +1197 -0
  486. package/src/billing/dashboard/v3/preauth/preauth.workspace.scss +176 -0
  487. package/src/billing/dashboard/v3/preauth/preauth.workspace.tsx +2266 -0
  488. package/src/billing/dashboard/v3/preauth/preauthorizations-tab.component.tsx +55 -0
  489. package/src/billing/dashboard/v3/shared/empty-state.component.scss +25 -0
  490. package/src/billing/dashboard/v3/shared/empty-state.component.tsx +13 -0
  491. package/src/billing/dashboard/v3/shared/table-toolbar.component.scss +64 -0
  492. package/src/billing/dashboard/v3/shared/table-toolbar.component.tsx +48 -0
  493. package/src/billing/dashboard/v3/types/index.ts +384 -0
  494. package/src/billing/extensions/generate-order-bill-button/generate-order-bill-button.extension.tsx +55 -0
  495. package/src/billing/extensions/generate-order-bill-button/generate-order-bill-button.scss +16 -0
  496. package/src/billing/extensions/visit-billing/visit-billing.extension.scss +0 -0
  497. package/src/billing/extensions/visit-billing/visit-billing.extension.tsx +509 -0
  498. package/src/billing/invoice/bill.resource.ts +47 -0
  499. package/src/billing/invoice/invoice-header/header-card/header-card.scss +17 -0
  500. package/src/billing/invoice/invoice-header/header-card/header-card.tsx +21 -0
  501. package/src/billing/invoice/invoice.scss +113 -0
  502. package/src/billing/invoice/invoice.tsx +1441 -0
  503. package/src/billing/invoice/line-items/line-items.scss +0 -0
  504. package/src/billing/invoice/line-items/line-items.tsx +120 -0
  505. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.scss +23 -0
  506. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.tsx +114 -0
  507. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.scss +0 -0
  508. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.tsx +122 -0
  509. package/src/billing/invoice/payment-details/payment-details.scss +0 -0
  510. package/src/billing/invoice/payment-details/payment-details.tsx +43 -0
  511. package/src/billing/invoice/print-invoice/print-receipt.component.tsx +44 -0
  512. package/src/billing/invoice/print-invoice/print-receipt.scss +14 -0
  513. package/src/billing/maternity-discharge.resource.ts +21 -0
  514. package/src/billing/types/index.ts +354 -0
  515. package/src/billing/utils/index.ts +17 -0
  516. package/src/billing/widgets/billingTotalsRow.component.scss +0 -0
  517. package/src/billing/widgets/billingTotalsRow.component.tsx +712 -0
  518. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.resource.ts +130 -0
  519. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.scss +58 -0
  520. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.workspace.tsx +656 -0
  521. package/src/billing/workspaces/create-order-bill-form-workspace/schema.ts +12 -0
  522. package/src/bookings/bookings.component.scss +7 -0
  523. package/src/bookings/bookings.component.tsx +35 -0
  524. package/src/bookings/daily/daily-bookings.resource.ts +2 -1
  525. package/src/case-summary/case-summary.extension.scss +13 -0
  526. package/src/case-summary/case-summary.extension.tsx +40 -0
  527. package/src/case-summary/case-summary.resource.test.ts +69 -0
  528. package/src/case-summary/case-summary.resource.ts +52 -0
  529. package/src/case-summary/components/case-summary-printable.component.scss +174 -0
  530. package/src/case-summary/components/case-summary-printable.component.tsx +288 -0
  531. package/src/case-summary/components/case-summary-printable.utils.ts +51 -0
  532. package/src/case-summary/types/case-summary.types.ts +152 -0
  533. package/src/claims/claims.component.scss +70 -0
  534. package/src/claims/claims.component.tsx +743 -0
  535. package/src/claims/claims.resource.ts +1840 -0
  536. package/src/claims/index.ts +365 -0
  537. package/src/claims/interventions.resource.ts +131 -0
  538. package/src/claims/utils.ts +64 -0
  539. package/src/config-schema.ts +149 -1
  540. package/src/context/patient-context.tsx +27 -0
  541. package/src/createDashboardLink.tsx +9 -0
  542. package/src/dashboard/charts/chart.component.scss +24 -0
  543. package/src/dashboard/charts/chart.component.tsx +56 -0
  544. package/src/dashboard/dashboard.component.scss +48 -3
  545. package/src/dashboard/dashboard.component.tsx +29 -38
  546. package/src/dashboard/overview/overview.component.scss +40 -59
  547. package/src/dashboard/overview/overview.component.tsx +55 -41
  548. package/src/dashboard-meta/accounting-dashboard.meta.ts +6 -0
  549. package/src/dashboard-meta/admissions-dashboard.meta.ts +6 -0
  550. package/src/dashboard-meta/billing-dashboard.meta.ts +6 -0
  551. package/src/dashboard-meta/bookings-dashboard.meta.ts +6 -0
  552. package/src/dashboard-meta/case-summary.meta.ts +6 -0
  553. package/src/dashboard-meta/consultation-dashboard.meta.ts +6 -0
  554. package/src/dashboard-meta/dha-workflow-dashboard.meta.ts +6 -0
  555. package/src/dashboard-meta/elective-preauth.meta.ts +6 -0
  556. package/src/dashboard-meta/emt-dashboard.meta.ts +6 -0
  557. package/src/dashboard-meta/inpatient-admissions.meta.ts +6 -0
  558. package/src/dashboard-meta/maternity-dashboard.meta.ts +6 -0
  559. package/src/dashboard-meta/mch-dashboard.meta.ts +6 -0
  560. package/src/dashboard-meta/pharmacy-dashboard.meta.ts +6 -0
  561. package/src/dashboard-meta/queue-dashboard.meta.ts +6 -0
  562. package/src/dashboard-meta/registers-dashboard.meta.ts +6 -0
  563. package/src/dashboard-meta/registry-dashboard.meta.ts +6 -0
  564. package/src/dashboard-meta/service-queue-admin.meta.ts +6 -0
  565. package/src/dashboard-meta/specialized-clinics-dashboard.meta.ts +6 -0
  566. package/src/dashboard-meta/triage-dashboard.meta.ts +6 -0
  567. package/src/emt/cr-lookup.resource.test.ts +88 -0
  568. package/src/emt/cr-lookup.resource.ts +42 -0
  569. package/src/emt/emt-queue.component.test.tsx +353 -0
  570. package/src/emt/emt-queue.component.tsx +463 -0
  571. package/src/emt/emt-queue.scss +85 -0
  572. package/src/emt/emt.resource.test.ts +247 -0
  573. package/src/emt/emt.resource.ts +150 -0
  574. package/src/emt/handover-modal/handover-modal.component.test.tsx +273 -0
  575. package/src/emt/handover-modal/handover-modal.component.tsx +541 -0
  576. package/src/emt/handover-modal/handover-modal.scss +113 -0
  577. package/src/emt/types/emt.types.ts +137 -0
  578. package/src/index.ts +204 -6
  579. package/src/mnch/maternity/maternity-queues.component.scss +7 -0
  580. package/src/mnch/maternity/maternity-queues.component.tsx +32 -0
  581. package/src/mnch/maternity/queues/triage/maternity-triage.tsx +15 -0
  582. package/src/mnch/mch/mch-queues.component.scss +10 -0
  583. package/src/mnch/mch/mch-queues.component.tsx +36 -0
  584. package/src/mnch/mch/queues/consultation/mch-consultation.tsx +18 -0
  585. package/src/mnch/mch/queues/triage/mch-triage.tsx +15 -0
  586. package/src/mnch/mnch-root.tsx +17 -0
  587. package/src/mortuary/mortuary.component.tsx +13 -0
  588. package/src/pharmacy/pharmacy.component.scss +16 -0
  589. package/src/pharmacy/pharmacy.component.tsx +11 -6
  590. package/src/registers/registers.component.tsx +8 -0
  591. package/src/registry/drawer/emr-compare.component.scss +263 -0
  592. package/src/registry/drawer/emr-compare.component.tsx +302 -0
  593. package/src/registry/drawer/emr-compare.resource.ts +181 -0
  594. package/src/registry/drawer/emr-create-preview.component.tsx +123 -0
  595. package/src/registry/drawer/otp-verification-step.component.tsx +398 -0
  596. package/src/registry/drawer/pomsf-balance.util.test.ts +177 -0
  597. package/src/registry/drawer/pomsf-balance.util.ts +79 -0
  598. package/src/registry/drawer/verification.resource.ts +60 -0
  599. package/src/registry/drawer/workflow-drawer.component.scss +1242 -0
  600. package/src/registry/drawer/workflow-drawer.component.tsx +1478 -0
  601. package/src/registry/eligibility/eligibility-details/eligibility-details.scss +38 -0
  602. package/src/registry/eligibility/eligibility-details/eligibility-details.tsx +101 -0
  603. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.scss +16 -0
  604. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.tsx +120 -0
  605. package/src/registry/eligibility/modal/eligibility-details.modal.scss +0 -0
  606. package/src/registry/eligibility/modal/eligibility-details.modal.tsx +45 -0
  607. package/src/registry/hie.resource.ts +466 -0
  608. package/src/registry/hie.types.ts +63 -0
  609. package/src/registry/modal/biometrics-verification-modal/biometrics-verification-modal.scss +277 -0
  610. package/src/registry/modal/biometrics-verification-modal/biometrics-verification-modal.tsx +218 -0
  611. package/src/registry/modal/biometrics-verification-modal/type.ts +39 -0
  612. package/src/registry/modal/client-details-modal/client-details-modal.tsx +65 -29
  613. package/src/registry/modal/otp-modal/otp-whitlisting-modal.component.tsx +809 -0
  614. package/src/registry/modal/otp-modal/otp-whitlisting-modal.scss +354 -0
  615. package/src/registry/modal/otp-modal/otp-whitlisting.scss +0 -0
  616. package/src/registry/modal/otp-verification-modal/claims-consent.scss +72 -0
  617. package/src/registry/modal/otp-verification-modal/claims-consent.tsx +135 -0
  618. package/src/registry/modal/otp-verification-modal/extension/claims-consent.extension.tsx +130 -0
  619. package/src/registry/modal/otp-verification-modal/otp-verification-modal.scss +30 -0
  620. package/src/registry/modal/otp-verification-modal/otp-verification-modal.tsx +154 -54
  621. package/src/registry/modal/send-to-triage/payment-details.tsx +120 -0
  622. package/src/registry/modal/send-to-triage/payment-method.component.tsx +54 -0
  623. package/src/registry/modal/send-to-triage/send-to-queue.modal.tsx +981 -0
  624. package/src/registry/modal/send-to-triage/send-to-triage.modal.scss +156 -3
  625. package/src/registry/modal/send-to-triage/send-to-triage.modal.tsx +1094 -135
  626. package/src/registry/modal/start-patient-visit/start-patient-visit.modal.scss +34 -0
  627. package/src/registry/modal/start-patient-visit/start-patient-visit.modal.tsx +231 -0
  628. package/src/registry/payment-details/payment-options/payment-options.scss +13 -0
  629. package/src/registry/payment-details/payment-options/payment-options.tsx +61 -14
  630. package/src/registry/registration-list/registration-list.component.scss +32 -0
  631. package/src/registry/registration-list/registration-list.component.tsx +103 -0
  632. package/src/registry/registry-entry.tsx +11 -0
  633. package/src/registry/registry.component.scss +402 -78
  634. package/src/registry/registry.component.tsx +602 -222
  635. package/src/registry/registry.resource.ts +22 -3
  636. package/src/registry/types/index.ts +118 -9
  637. package/src/registry/utils/error-handler.ts +54 -0
  638. package/src/registry/utils/format-dependant-display-data.ts +1 -1
  639. package/src/registry/utils/hie-client-adapter.ts +7 -4
  640. package/src/registry/utils/mask-data.ts +40 -0
  641. package/src/registry/utils/phone-number-formatter.ts +11 -0
  642. package/src/resources/dashboard.resource.ts +20 -0
  643. package/src/resources/identifier-types.ts +2 -0
  644. package/src/resources/patient-resource.ts +6 -1
  645. package/src/resources/queue.resource.ts +24 -1
  646. package/src/resources/superset.resource.ts +21 -0
  647. package/src/resources/visit.resource.ts +19 -1
  648. package/src/root.component.tsx +10 -5
  649. package/src/routes.json +477 -23
  650. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.scss +31 -0
  651. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.tsx +153 -0
  652. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.scss +0 -0
  653. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.tsx +182 -0
  654. package/src/service-queues/admin/queue/queue-list/queue-list.scss +33 -0
  655. package/src/service-queues/admin/queue/queue-list/queue-list.tsx +113 -0
  656. package/src/service-queues/admin/queue-entry/queue-entry-list.component.scss +6 -0
  657. package/src/service-queues/admin/queue-entry/queue-entry-list.component.tsx +137 -0
  658. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.scss +31 -0
  659. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.tsx +137 -0
  660. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.scss +0 -0
  661. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.tsx +146 -0
  662. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.scss +22 -0
  663. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.tsx +120 -0
  664. package/src/service-queues/admin/service-queue-admin-dashboard.component.scss +6 -0
  665. package/src/service-queues/admin/service-queue-admin-dashboard.component.tsx +34 -0
  666. package/src/service-queues/consultation/consultation.component.tsx +9 -0
  667. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.scss +30 -0
  668. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.tsx +108 -0
  669. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.scss +26 -0
  670. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.tsx +110 -0
  671. package/src/service-queues/modals/move/move-patient.component.scss +1 -1
  672. package/src/service-queues/modals/move/move-patient.component.tsx +31 -17
  673. package/src/service-queues/queue-list/check-in.service.ts +26 -0
  674. package/src/service-queues/queue-list/queue-list.component.scss +37 -0
  675. package/src/service-queues/queue-list/queue-list.component.tsx +256 -56
  676. package/src/service-queues/service-queue/service-queue.component.tsx +151 -8
  677. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.scss +5 -0
  678. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.tsx +36 -7
  679. package/src/service-queues/service-queue.tsx +22 -16
  680. package/src/service-queues/service-queues.resource.ts +197 -1
  681. package/src/service-queues/service.resource.ts +1 -1
  682. package/src/shared/constants/concepts.ts +50 -0
  683. package/src/shared/constants/patient-category.ts +6 -0
  684. package/src/shared/constants/patient-type.ts +10 -0
  685. package/src/shared/constants/visit-types.ts +7 -0
  686. package/src/shared/services/billing.resource.ts +75 -0
  687. package/src/shared/services/claims.resource.ts +47 -0
  688. package/src/shared/services/client-payment-mode.resource.ts +27 -0
  689. package/src/shared/services/client-payment.resource.ts +17 -0
  690. package/src/shared/services/consultation-clearance.resource.ts +210 -0
  691. package/src/shared/services/eligibility.resource.ts +20 -0
  692. package/src/shared/services/encounters.resource.ts +33 -0
  693. package/src/shared/services/location.resource.ts +9 -0
  694. package/src/shared/types/index.ts +156 -0
  695. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.scss +42 -0
  696. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.tsx +42 -0
  697. package/src/shared/ui/confirm-modal/confirm.modal.scss +18 -0
  698. package/src/shared/ui/confirm-modal/confirm.modal.tsx +38 -0
  699. package/src/shared/ui/facility-worker-slot/facility-worker.component-slot.component.scss +39 -0
  700. package/src/shared/ui/facility-worker-slot/facility-worker.component-slot.component.tsx +19 -0
  701. package/src/shared/ui/otp-input/otp-input.component.scss +14 -0
  702. package/src/shared/ui/otp-input/otp-input.component.tsx +97 -0
  703. package/src/{service-queues/service-queue/stats → shared/ui}/stat-card/stat-card.component.tsx +6 -3
  704. package/src/shared/ui/timer/timer.component.scss +5 -0
  705. package/src/shared/ui/timer/timer.component.tsx +40 -0
  706. package/src/shared/utils/get-base-url.ts +15 -0
  707. package/src/shared/utils/get-tag-type.ts +75 -0
  708. package/src/side-nav-menu/mnch-nav-link-config.ts +16 -0
  709. package/src/side-nav-menu/mnch-nav-links.tsx +42 -0
  710. package/src/side-nav-menu/nav-link-config.ts +5 -5
  711. package/src/side-nav-menu/specialized-clinics-nav-link-config.ts +36 -0
  712. package/src/side-nav-menu/specialized-clinics-nav-links.tsx +42 -0
  713. package/src/specialized-clinics/critital-care-unit/critical-care-unit-queues.component.scss +7 -0
  714. package/src/specialized-clinics/critital-care-unit/critical-care-unit-queues.component.tsx +36 -0
  715. package/src/specialized-clinics/critital-care-unit/queues/consultation/critical-care-unit-consultation.tsx +15 -0
  716. package/src/specialized-clinics/critital-care-unit/queues/triage/critical-care-unit-triage.tsx +15 -0
  717. package/src/specialized-clinics/dental/dental-queues.component.scss +7 -0
  718. package/src/specialized-clinics/dental/dental-queues.component.tsx +36 -0
  719. package/src/specialized-clinics/dental/queues/consultation/dental-consultation.tsx +15 -0
  720. package/src/specialized-clinics/dental/queues/triage/dental-triage.tsx +15 -0
  721. package/src/specialized-clinics/diagnostic-and-imaging/diagnostic-and-imaging.component.scss +7 -0
  722. package/src/specialized-clinics/diagnostic-and-imaging/diagnostic-and-imaging.component.tsx +36 -0
  723. package/src/specialized-clinics/diagnostic-and-imaging/queues/consultation/diagnosis-and-imaging-consultation.tsx +15 -0
  724. package/src/specialized-clinics/diagnostic-and-imaging/queues/triage/diagnosis-and-imaging-triage.tsx +15 -0
  725. package/src/specialized-clinics/oncology/oncology-queues.component.scss +7 -0
  726. package/src/specialized-clinics/oncology/oncology-queues.component.tsx +36 -0
  727. package/src/specialized-clinics/oncology/queues/consultation/oncology-consultation.tsx +15 -0
  728. package/src/specialized-clinics/oncology/queues/triage/oncology-triage.tsx +15 -0
  729. package/src/specialized-clinics/ophthalmology/ophthalmology-queues.component.scss +7 -0
  730. package/src/specialized-clinics/ophthalmology/ophthalmology-queues.component.tsx +36 -0
  731. package/src/specialized-clinics/ophthalmology/queues/consultation/ophthalmology-consultation.tsx +15 -0
  732. package/src/specialized-clinics/ophthalmology/queues/triage/ophthalmology-triage.tsx +15 -0
  733. package/src/specialized-clinics/psychiatry/psychiatry-queues.component.scss +7 -0
  734. package/src/specialized-clinics/psychiatry/psychiatry-queues.component.tsx +36 -0
  735. package/src/specialized-clinics/psychiatry/queues/consultation/psychiatry-consultation.tsx +15 -0
  736. package/src/specialized-clinics/psychiatry/queues/triage/psychiatry-triage.tsx +15 -0
  737. package/src/specialized-clinics/renal/queues/consultation/dialysis-consultation.tsx +15 -0
  738. package/src/specialized-clinics/renal/queues/triage/renal-triage.tsx +15 -0
  739. package/src/specialized-clinics/renal/renal-queues.component.scss +7 -0
  740. package/src/specialized-clinics/renal/renal-queues.component.tsx +36 -0
  741. package/src/specialized-clinics/specialized-clinics-root.tsx +27 -0
  742. package/src/triage/triage.component.scss +6 -0
  743. package/src/triage/triage.component.tsx +4 -0
  744. package/src/types/types.ts +56 -1
  745. package/webpack.config.js +54 -1
  746. package/dist/104.js +0 -2
  747. package/dist/104.js.map +0 -1
  748. package/dist/15.js +0 -1
  749. package/dist/15.js.map +0 -1
  750. package/dist/184.js +0 -2
  751. package/dist/184.js.map +0 -1
  752. package/dist/197.js +0 -1
  753. package/dist/246.js +0 -2
  754. package/dist/246.js.map +0 -1
  755. package/dist/255.js +0 -1
  756. package/dist/255.js.map +0 -1
  757. package/dist/300.js +0 -1
  758. package/dist/335.js +0 -1
  759. package/dist/339.js +0 -1
  760. package/dist/339.js.map +0 -1
  761. package/dist/353.js +0 -1
  762. package/dist/353.js.map +0 -1
  763. package/dist/420.js +0 -1
  764. package/dist/420.js.map +0 -1
  765. package/dist/540.js +0 -2
  766. package/dist/540.js.map +0 -1
  767. package/dist/55.js +0 -1
  768. package/dist/652.js +0 -1
  769. package/dist/709.js +0 -1
  770. package/dist/709.js.map +0 -1
  771. package/dist/710.js +0 -2
  772. package/dist/710.js.map +0 -1
  773. package/dist/729.js +0 -1
  774. package/dist/729.js.map +0 -1
  775. package/dist/752.js +0 -1
  776. package/dist/752.js.map +0 -1
  777. package/dist/833.js +0 -1
  778. package/dist/833.js.map +0 -1
  779. package/dist/907.js +0 -1
  780. package/dist/907.js.map +0 -1
  781. package/dist/91.js +0 -1
  782. package/dist/91.js.map +0 -1
  783. package/dist/93.js +0 -1
  784. package/dist/93.js.map +0 -1
  785. package/dist/943.js +0 -1
  786. package/dist/943.js.map +0 -1
  787. package/dist/99.js +0 -1
  788. /package/dist/{104.js.LICENSE.txt → 2177.js.LICENSE.txt} +0 -0
  789. /package/dist/{184.js.LICENSE.txt → 3184.js.LICENSE.txt} +0 -0
  790. /package/dist/{540.js.LICENSE.txt → 6540.js.LICENSE.txt} +0 -0
  791. /package/dist/{710.js.LICENSE.txt → 7830.js.LICENSE.txt} +0 -0
  792. /package/dist/{246.js.LICENSE.txt → 9583.js.LICENSE.txt} +0 -0
  793. /package/src/{service-queues/service-queue/stats → shared/ui}/stat-card/stat-card.component.scss +0 -0
@@ -0,0 +1,809 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import {
3
+ cancelAllPendingAuthorizations,
4
+ getOtpWhitelistingStatus,
5
+ getOtpWhitelistRequests,
6
+ getPatientContacts,
7
+ } from '../../hie.resource';
8
+ import {
9
+ Button,
10
+ ComboBox,
11
+ FormLabel,
12
+ InlineLoading,
13
+ InlineNotification,
14
+ Tag,
15
+ TextArea,
16
+ TextInput,
17
+ } from '@carbon/react';
18
+ import {
19
+ CheckmarkFilled,
20
+ Chat,
21
+ CloudUpload,
22
+ DocumentPdf,
23
+ Renew,
24
+ SendAlt,
25
+ TrashCan,
26
+ WarningAlt,
27
+ } from '@carbon/react/icons';
28
+ import { usePatient } from '../../../context/patient-context';
29
+ import { useSession } from '@openmrs/esm-framework';
30
+ import { type OTPWhitelistRequest } from '../../hie.types';
31
+ import { HieIdentificationType } from '../../types';
32
+ import styles from './otp-whitlisting-modal.scss';
33
+
34
+ // Seconds a user must wait before the OTP can be resent.
35
+ const RESEND_COOLDOWN = 30;
36
+ const formatCountdown = (secs: number) => `0:${String(Math.max(0, secs)).padStart(2, '0')}`;
37
+
38
+ const ACCEPTED_FILE_TYPES = ['application/pdf', 'image/png', 'image/jpeg'];
39
+ const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5 MB
40
+
41
+ const formatBytes = (bytes: number): string => {
42
+ if (bytes < 1024) return `${bytes} B`;
43
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;
44
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
45
+ };
46
+
47
+ interface WhitelistFormErrors {
48
+ file?: string;
49
+ reasonType?: string;
50
+ reasonDescription?: string;
51
+ }
52
+
53
+ interface WhitelistRequestResult {
54
+ status?: string;
55
+ guid?: string;
56
+ reasonType?: string;
57
+ reason?: string;
58
+ beneficiaryCrId?: string;
59
+ beneficiaryName?: string;
60
+ facilityName?: string;
61
+ attachments?: Array<{ guid: string; uploadedFile: string; description: string; contentType: string }>;
62
+ }
63
+
64
+ // Tag colour for the request status.
65
+ const statusTagType = (status?: string): 'green' | 'red' | 'blue' => {
66
+ const s = (status ?? '').toUpperCase();
67
+ if (s === 'APPROVED' || s === 'WHITELISTED') return 'green';
68
+ if (s === 'REJECTED' || s === 'EXPIRED') return 'red';
69
+ return 'blue';
70
+ };
71
+
72
+ interface OTPWhitlistingModalProps {
73
+ onWhitelistStatusChange: (whitelisted: boolean) => void;
74
+ onWhitelistSubmit: (payload: OTPWhitelistRequest) => Promise<unknown> | void;
75
+ onSendClaimsOtp: () => void;
76
+ onOtpVerified: (otp: string) => void;
77
+ onOtpVerificationStatusChange: (verified: boolean) => void;
78
+ submitting: boolean;
79
+ otpSent: boolean;
80
+ whitelistRequest: any;
81
+ crId: string;
82
+ isMinor?: boolean;
83
+ }
84
+
85
+ const OTPWhitlistingModal: React.FC<OTPWhitlistingModalProps> = ({
86
+ onWhitelistStatusChange,
87
+ onSendClaimsOtp,
88
+ onWhitelistSubmit,
89
+ onOtpVerified,
90
+ submitting,
91
+ otpSent,
92
+ whitelistRequest,
93
+ onOtpVerificationStatusChange,
94
+ crId,
95
+ isMinor = false,
96
+ }) => {
97
+ const [whitelisted, setWhitelisted] = useState<boolean | null>(isMinor ? true : null);
98
+ const [isFaciltyWhitelisted, setFaciltyWhitelisted] = useState<boolean | null>(null);
99
+ const [siMinor, setIsMinor] = useState<boolean | null>(null);
100
+ const [phoneNumber, setPhoneNumber] = useState('');
101
+ const [file, setFile] = useState<File | null>(null);
102
+ const [selectedReason, setSelectedReason] = useState('');
103
+ const [reasonDescription, setReasonDescription] = useState('');
104
+ const [otp, setOtp] = useState(['', '', '', '', '', '']);
105
+ const [resendIn, setResendIn] = useState(0);
106
+ // Which OTP action is in flight, so the buttons show the right label.
107
+ const [otpBusy, setOtpBusy] = useState<'verify' | 'resend' | null>(null);
108
+ // Set once the OTP is verified — swaps the panel to a "consent successful" state.
109
+ const [consentGiven, setConsentGiven] = useState(false);
110
+ const [dragOver, setDragOver] = useState(false);
111
+ const [errors, setErrors] = useState<WhitelistFormErrors>({});
112
+ const [previewUrl, setPreviewUrl] = useState<string | null>(null);
113
+ const [submittingWhitelist, setSubmittingWhitelist] = useState(false);
114
+ const [submitError, setSubmitError] = useState('');
115
+ const [submittedRequest, setSubmittedRequest] = useState<WhitelistRequestResult | null>(null);
116
+ const fileInputRef = useRef<HTMLInputElement>(null);
117
+ const { patient } = usePatient();
118
+ const session = useSession();
119
+ const locationUuid = session.sessionLocation!.uuid;
120
+ const [loadingWhitelistStatus, setLoadingWhitelistStatus] = useState(false);
121
+
122
+ const REASON_TYPES = [
123
+ 'OLD',
124
+ 'AMPUTEE',
125
+ 'MEDICAL_CONDITION',
126
+ 'MENTALLY_UNSTABLE',
127
+ 'ONCOLOGY_TREATMENT',
128
+ 'DIALYSIS_TREATMENT',
129
+ 'CONSTRUCTION_WORKER',
130
+ 'OTHER',
131
+ 'EXPIRED',
132
+ 'BIOMETRIC_FAILURE',
133
+ 'CHILD_BELOW_7_YEARS',
134
+ 'PRIVACY_CONCERNS',
135
+ 'TECHNICAL_ISSUES',
136
+ ];
137
+ useEffect(() => {
138
+ if (isMinor) {
139
+ onWhitelistStatusChange(true);
140
+ return;
141
+ }
142
+ if (patient) {
143
+ checkWhitelistStatus();
144
+ }
145
+ }, [isMinor, patient]);
146
+
147
+ useEffect(() => {
148
+ if (!crId) return;
149
+
150
+ const cancelPending = async () => {
151
+ try {
152
+ await cancelAllPendingAuthorizations(locationUuid, crId);
153
+ } catch (error) {
154
+ console.error('Failed to cancel pending authorizations:', error);
155
+ }
156
+ };
157
+
158
+ cancelPending();
159
+ }, [crId, locationUuid]);
160
+
161
+ const checkAgeLessThan18years = (dateOfBirth: string): boolean => {
162
+ const birthDate = new Date(dateOfBirth);
163
+ const today = new Date();
164
+
165
+ let age = today.getFullYear() - birthDate.getFullYear();
166
+
167
+ const hasHadBirthdayThisYear =
168
+ today.getMonth() > birthDate.getMonth() ||
169
+ (today.getMonth() === birthDate.getMonth() && today.getDate() >= birthDate.getDate());
170
+
171
+ if (!hasHadBirthdayThisYear) {
172
+ age--;
173
+ }
174
+
175
+ return age < 18;
176
+ };
177
+
178
+ const checkWhitelistStatus = async () => {
179
+ try {
180
+ setLoadingWhitelistStatus(true);
181
+ // Default to the CR id rather than patient.identification_number — the latter is
182
+ // only ever the National ID passed in by whichever caller built the HieClient, and
183
+ // is frequently empty (no National ID on file), which sent identificationNumber=
184
+ // to the eligibility endpoint and always failed. The CR id is always populated.
185
+ const res = await getOtpWhitelistingStatus(crId, HieIdentificationType.Cr, locationUuid);
186
+
187
+ let isWhitelisted = res?.whitelistedForOTP ?? false;
188
+
189
+ let facilityWhitelisted = res?.facilityBiometricsEnforced ?? false;
190
+
191
+ let isLessThan18years = checkAgeLessThan18years(res?.dateOfBirth);
192
+
193
+ if (!isWhitelisted && facilityWhitelisted && !isLessThan18years) {
194
+ // Not whitelisted by eligibility — look up any existing whitelist request.
195
+ try {
196
+ const list = await getOtpWhitelistRequests(patient!.id, locationUuid);
197
+ const latest = list?.results?.[0];
198
+ const status = (latest?.status ?? '').toUpperCase();
199
+ if (status === 'APPROVED') {
200
+ // Already approved → proceed to OTP consent.
201
+ isWhitelisted = true;
202
+ setSubmittedRequest(null);
203
+ } else if (latest && status !== 'REJECTED' && status !== 'EXPIRED') {
204
+ // Pending review — show the submitted-request state with a status check.
205
+ setSubmittedRequest(latest as WhitelistRequestResult);
206
+ } else {
207
+ // No request (or rejected/expired) → show the whitelisting form.
208
+ setSubmittedRequest(null);
209
+ }
210
+ } catch {
211
+ setSubmittedRequest(null);
212
+ }
213
+ } else {
214
+ setSubmittedRequest(null);
215
+ }
216
+
217
+ setWhitelisted(isWhitelisted);
218
+ setFaciltyWhitelisted(facilityWhitelisted);
219
+ setIsMinor(isLessThan18years);
220
+ onWhitelistStatusChange(isWhitelisted);
221
+ } catch (error) {
222
+ console.error(error);
223
+ } finally {
224
+ setLoadingWhitelistStatus(false);
225
+ }
226
+ };
227
+
228
+ useEffect(() => {
229
+ const crId = patient!.id;
230
+ async function fetchData() {
231
+ try {
232
+ const res = await getPatientContacts(crId, locationUuid);
233
+
234
+ const phone = res?.results[0]?.contactValue;
235
+
236
+ setPhoneNumber(phone ?? '');
237
+ } catch (error) {
238
+ console.error('Error fetching whitelist status:', error);
239
+ setWhitelisted(false);
240
+ onWhitelistStatusChange(false);
241
+ }
242
+ }
243
+
244
+ fetchData();
245
+ }, [onWhitelistStatusChange, patient, locationUuid]);
246
+
247
+ // Start the resend cooldown and focus the first digit when a code is sent.
248
+ useEffect(() => {
249
+ if (otpSent) {
250
+ setResendIn(RESEND_COOLDOWN);
251
+ document.getElementById('otp-0')?.focus();
252
+ }
253
+ }, [otpSent]);
254
+
255
+ // Tick the resend countdown down to zero.
256
+ useEffect(() => {
257
+ if (!otpSent || resendIn <= 0) return;
258
+ const timer = setTimeout(() => setResendIn((s) => Math.max(0, s - 1)), 1000);
259
+ return () => clearTimeout(timer);
260
+ }, [otpSent, resendIn]);
261
+
262
+ // Clear the in-flight OTP action once the parent finishes (submitting → false).
263
+ useEffect(() => {
264
+ if (!submitting) {
265
+ setOtpBusy(null);
266
+ }
267
+ }, [submitting]);
268
+
269
+ // Build (and clean up) an object URL to preview an uploaded image.
270
+ useEffect(() => {
271
+ if (file && file.type.startsWith('image/')) {
272
+ const url = URL.createObjectURL(file);
273
+ setPreviewUrl(url);
274
+ return () => URL.revokeObjectURL(url);
275
+ }
276
+ setPreviewUrl(null);
277
+ }, [file]);
278
+
279
+ // Surface the required-field errors as soon as the whitelisting form appears,
280
+ // so the fields show their red/invalid state on launch (not only after edits).
281
+ useEffect(() => {
282
+ if (whitelisted === false) {
283
+ setErrors(validateForm());
284
+ }
285
+ // eslint-disable-next-line react-hooks/exhaustive-deps
286
+ }, [whitelisted]);
287
+
288
+ if (whitelisted === null) {
289
+ return (
290
+ <div className={styles.checkingState}>
291
+ <InlineLoading className={styles.checking} description="Checking whitelisting…" />
292
+ </div>
293
+ );
294
+ }
295
+
296
+ const handleCheckStatus = async () => {
297
+ await checkWhitelistStatus();
298
+ };
299
+
300
+ const validateFile = (candidate: File | null): string | undefined => {
301
+ if (!candidate) {
302
+ return 'A supporting document is required.';
303
+ }
304
+ if (!ACCEPTED_FILE_TYPES.includes(candidate.type)) {
305
+ return 'Unsupported file type. Upload a PDF, PNG or JPG.';
306
+ }
307
+ if (candidate.size > MAX_FILE_SIZE) {
308
+ return 'File is too large. The maximum size is 5 MB.';
309
+ }
310
+ return undefined;
311
+ };
312
+
313
+ const validateForm = (): WhitelistFormErrors => {
314
+ const nextErrors: WhitelistFormErrors = {};
315
+
316
+ const fileError = validateFile(file);
317
+ if (fileError) {
318
+ nextErrors.file = fileError;
319
+ }
320
+
321
+ if (!selectedReason) {
322
+ nextErrors.reasonType = 'A reason type is required.';
323
+ }
324
+
325
+ if (!reasonDescription.trim()) {
326
+ nextErrors.reasonDescription = 'A reason description is required.';
327
+ } else if (reasonDescription.trim().length < 10) {
328
+ nextErrors.reasonDescription = 'Provide at least 10 characters of detail.';
329
+ }
330
+
331
+ return nextErrors;
332
+ };
333
+
334
+ // Re-validate a field as the user edits it so errors surface (and clear) live.
335
+ const revalidate = (field: keyof WhitelistFormErrors, error: string | undefined) => {
336
+ setErrors((prev) => ({ ...prev, [field]: error }));
337
+ };
338
+
339
+ const handleFileSelected = (selected: File | null) => {
340
+ setFile(selected);
341
+ setErrors((prev) => ({ ...prev, file: validateFile(selected) }));
342
+ };
343
+
344
+ // Live form validity — the submit button is only enabled when this is true.
345
+ const isFormValid = !validateFile(file) && Boolean(selectedReason) && reasonDescription.trim().length >= 10;
346
+
347
+ const handleWhitelistSubmit = async () => {
348
+ const nextErrors = validateForm();
349
+ setErrors(nextErrors);
350
+
351
+ if (Object.keys(nextErrors).length > 0) {
352
+ return;
353
+ }
354
+
355
+ setSubmitError('');
356
+ setSubmittingWhitelist(true);
357
+ try {
358
+ const result = await onWhitelistSubmit({
359
+ reasonType: selectedReason,
360
+ reason: reasonDescription.trim(),
361
+ crId: patient!.id,
362
+ attachments_file_blob: file!,
363
+ locationUuid,
364
+ });
365
+ // A successful request returns the created record — show its details.
366
+ setSubmittedRequest((result as WhitelistRequestResult) ?? {});
367
+ } catch (err) {
368
+ // Surface the server message (strip the "Request failed with 400:" prefix).
369
+ const message =
370
+ err instanceof Error
371
+ ? err.message.replace(/^Request failed with \d+:\s*/i, '')
372
+ : 'Could not submit the whitelisting request. Please try again.';
373
+ setSubmitError(message);
374
+ } finally {
375
+ setSubmittingWhitelist(false);
376
+ }
377
+ };
378
+
379
+ const isSubmitting = submitting || submittingWhitelist;
380
+
381
+ const handleSendClaimsOtp = async () => {
382
+ setOtpBusy('resend');
383
+ onOtpVerificationStatusChange(false);
384
+ onSendClaimsOtp();
385
+ setResendIn(RESEND_COOLDOWN);
386
+ };
387
+
388
+ const handleVerifyClaimsOtp = async () => {
389
+ setOtpBusy('verify');
390
+ onOtpVerified(otp.join(''));
391
+ onOtpVerificationStatusChange(true);
392
+ setConsentGiven(true);
393
+ };
394
+
395
+ const focusOtp = (index: number) => {
396
+ (document.getElementById(`otp-${index}`) as HTMLInputElement | null)?.focus();
397
+ };
398
+
399
+ const handleOtpChange = (index: number, value: string) => {
400
+ if (!/^\d?$/.test(value)) return;
401
+
402
+ const newOtp = [...otp];
403
+ newOtp[index] = value;
404
+ setOtp(newOtp);
405
+ if (value && index < 5) {
406
+ focusOtp(index + 1);
407
+ }
408
+ };
409
+
410
+ // Backspace on an empty field steps back to the previous one.
411
+ const handleOtpKeyDown = (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {
412
+ if (e.key === 'Backspace' && !otp[index] && index > 0) {
413
+ e.preventDefault();
414
+ focusOtp(index - 1);
415
+ } else if (e.key === 'ArrowLeft' && index > 0) {
416
+ focusOtp(index - 1);
417
+ } else if (e.key === 'ArrowRight' && index < 5) {
418
+ focusOtp(index + 1);
419
+ }
420
+ };
421
+
422
+ // Pasting a full code fills every field at once.
423
+ const handleOtpPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {
424
+ const digits = e.clipboardData.getData('text').replace(/\D/g, '').slice(0, 6);
425
+ if (!digits) return;
426
+ e.preventDefault();
427
+ const newOtp = ['', '', '', '', '', ''];
428
+ for (let i = 0; i < digits.length; i++) newOtp[i] = digits[i];
429
+ setOtp(newOtp);
430
+ focusOtp(Math.min(digits.length, 5));
431
+ };
432
+
433
+ return (
434
+ <div>
435
+ {isMinor || !isFaciltyWhitelisted || whitelisted ? (
436
+ consentGiven ? (
437
+ <div className={styles.otpCard}>
438
+ <span className={styles.successIcon}>
439
+ <CheckmarkFilled size={24} />
440
+ </span>
441
+ <h4 className={styles.otpTitle}>Consent successful</h4>
442
+ <p className={styles.otpHint}>
443
+ The client has given consent. Proceed to initiate the SHA claim so the patient can be seen.
444
+ </p>
445
+ </div>
446
+ ) : otpSent ? (
447
+ <div className={styles.otpCard}>
448
+ <span className={styles.otpIcon}>
449
+ <Chat size={24} />
450
+ </span>
451
+ <h4 className={styles.otpTitle}>Enter OTP</h4>
452
+ <p className={styles.otpHint}>
453
+ {phoneNumber ? (
454
+ <>
455
+ Enter the 6-digit code sent to <strong>{phoneNumber}</strong>.
456
+ </>
457
+ ) : (
458
+ "Enter the 6-digit code sent to the client's registered phone number."
459
+ )}
460
+ </p>
461
+
462
+ <div className={styles.otpInputs}>
463
+ {otp.map((digit, index) => (
464
+ <TextInput
465
+ key={index}
466
+ id={`otp-${index}`}
467
+ labelText=""
468
+ hideLabel
469
+ size="lg"
470
+ value={digit}
471
+ maxLength={1}
472
+ inputMode="numeric"
473
+ autoComplete="one-time-code"
474
+ readOnly={submitting}
475
+ onChange={(e) => handleOtpChange(index, e.target.value)}
476
+ onKeyDown={(e) => handleOtpKeyDown(index, e)}
477
+ onPaste={index === 0 ? handleOtpPaste : undefined}
478
+ className={styles.otpDigit}
479
+ />
480
+ ))}
481
+ </div>
482
+
483
+ <div className={styles.otpActions}>
484
+ <Button size="sm" onClick={handleVerifyClaimsOtp} disabled={otp.join('').length !== 6 || submitting}>
485
+ {otpBusy === 'verify' && submitting ? 'Verifying…' : 'Verify OTP'}
486
+ </Button>
487
+
488
+ <Button kind="ghost" size="sm" onClick={handleSendClaimsOtp} disabled={submitting || resendIn > 0}>
489
+ {otpBusy === 'resend' && submitting
490
+ ? 'Resending…'
491
+ : resendIn > 0
492
+ ? `Resend in ${formatCountdown(resendIn)}`
493
+ : 'Resend OTP'}
494
+ </Button>
495
+ </div>
496
+ </div>
497
+ ) : (
498
+ <div className={styles.otpCard}>
499
+ <span className={styles.otpIcon}>
500
+ <Chat size={24} />
501
+ </span>
502
+ <h4 className={styles.otpTitle}>OTP verification</h4>
503
+ <p className={styles.otpHint}>
504
+ {phoneNumber ? (
505
+ <>
506
+ A one-time code will be sent by SMS to <strong>{phoneNumber}</strong>.
507
+ </>
508
+ ) : (
509
+ "A one-time code will be sent by SMS to the client's registered phone number."
510
+ )}
511
+ </p>
512
+ <Button
513
+ className={styles.otpSend}
514
+ size="sm"
515
+ renderIcon={SendAlt}
516
+ onClick={handleSendClaimsOtp}
517
+ disabled={submitting}
518
+ >
519
+ {submitting ? 'Sending…' : 'Send OTP'}
520
+ </Button>
521
+ </div>
522
+ )
523
+ ) : submittedRequest || whitelistRequest ? (
524
+ (() => {
525
+ const req: WhitelistRequestResult = submittedRequest ?? whitelistRequest ?? {};
526
+ const attachment = req.attachments?.[0];
527
+ return (
528
+ <div className={styles.whitelistCard}>
529
+ <div className={styles.whitelistIntro}>
530
+ <span className={styles.successIcon}>
531
+ <CheckmarkFilled size={20} />
532
+ </span>
533
+ <div>
534
+ <h4 className={styles.otpTitle}>Whitelisting request submitted</h4>
535
+ <p className={styles.otpHint}>
536
+ The request is <strong>{(req.status ?? 'PENDING').toLowerCase()}</strong> review. Once approved,
537
+ {req.beneficiaryName ? ` ${req.beneficiaryName}` : ' the client'} can verify by OTP.
538
+ </p>
539
+ </div>
540
+ </div>
541
+
542
+ <div className={styles.whitelistDivider} />
543
+
544
+ <dl className={styles.detailsGrid}>
545
+ <div className={styles.detailRow}>
546
+ <dt>Status</dt>
547
+ <dd>
548
+ <Tag size="sm" type={statusTagType(req.status)}>
549
+ {req.status ?? 'PENDING'}
550
+ </Tag>
551
+ </dd>
552
+ </div>
553
+ {req.beneficiaryName ? (
554
+ <div className={styles.detailRow}>
555
+ <dt>Beneficiary</dt>
556
+ <dd>{req.beneficiaryName}</dd>
557
+ </div>
558
+ ) : null}
559
+ {req.beneficiaryCrId ? (
560
+ <div className={styles.detailRow}>
561
+ <dt>CR number</dt>
562
+ <dd>{req.beneficiaryCrId}</dd>
563
+ </div>
564
+ ) : null}
565
+ {req.reasonType ? (
566
+ <div className={styles.detailRow}>
567
+ <dt>Reason</dt>
568
+ <dd>{req.reasonType.replace(/_/g, ' ')}</dd>
569
+ </div>
570
+ ) : null}
571
+ {req.facilityName ? (
572
+ <div className={styles.detailRow}>
573
+ <dt>Facility</dt>
574
+ <dd>{req.facilityName}</dd>
575
+ </div>
576
+ ) : null}
577
+ {req.reason ? (
578
+ <div className={styles.detailRow}>
579
+ <dt>Notes</dt>
580
+ <dd>{req.reason}</dd>
581
+ </div>
582
+ ) : null}
583
+ {attachment ? (
584
+ <div className={styles.detailRow}>
585
+ <dt>Attachment</dt>
586
+ <dd>
587
+ <a href={attachment.uploadedFile} target="_blank" rel="noreferrer noopener">
588
+ {attachment.description || 'View document'}
589
+ </a>
590
+ </dd>
591
+ </div>
592
+ ) : null}
593
+ </dl>
594
+
595
+ <Button
596
+ className={styles.whitelistSubmit}
597
+ kind="tertiary"
598
+ size="md"
599
+ renderIcon={Renew}
600
+ onClick={handleCheckStatus}
601
+ disabled={loadingWhitelistStatus}
602
+ >
603
+ {loadingWhitelistStatus ? 'Checking…' : 'Check whitelist status'}
604
+ </Button>
605
+ </div>
606
+ );
607
+ })()
608
+ ) : (
609
+ <div className={styles.whitelistCard}>
610
+ <div className={styles.whitelistIntro}>
611
+ <span className={styles.whitelistIcon}>
612
+ <WarningAlt size={20} />
613
+ </span>
614
+ <div>
615
+ <h4 className={styles.otpTitle}>Phone number not whitelisted</h4>
616
+ <p className={styles.otpHint}>
617
+ {phoneNumber ? <strong>{phoneNumber}</strong> : 'This phone number'} isn&apos;t approved to receive OTP
618
+ codes. Submit the request below with a supporting document — once approved, the client can verify by
619
+ OTP.
620
+ </p>
621
+ </div>
622
+ </div>
623
+
624
+ <div className={styles.whitelistDivider} />
625
+
626
+ <div className={styles.whitelistForm}>
627
+ <span className={styles.whitelistFormTitle}>Request details</span>
628
+ <div className={styles.uploadField}>
629
+ <FormLabel>
630
+ Supporting document <span className={styles.required}>*</span>
631
+ </FormLabel>
632
+ <p className={styles.uploadHint}>PDF or image (PNG / JPG) · one file · max 5 MB</p>
633
+ {file ? (
634
+ // A single file is uploaded — preview it with a remove action.
635
+ // Removing brings the dropzone back so another can be chosen.
636
+ <div className={`${styles.filePreview} ${errors.file ? styles.filePreviewInvalid : ''}`}>
637
+ {previewUrl ? (
638
+ <img src={previewUrl} alt={file.name} className={styles.previewThumb} />
639
+ ) : (
640
+ <span className={styles.previewIcon}>
641
+ <DocumentPdf size={24} />
642
+ </span>
643
+ )}
644
+ <div className={styles.previewMeta}>
645
+ <span className={styles.previewName} title={file.name}>
646
+ {file.name}
647
+ </span>
648
+ <span className={styles.previewSize}>{formatBytes(file.size)}</span>
649
+ </div>
650
+ <Button
651
+ kind="ghost"
652
+ size="sm"
653
+ hasIconOnly
654
+ iconDescription="Remove file"
655
+ renderIcon={TrashCan}
656
+ onClick={() => handleFileSelected(null)}
657
+ />
658
+ </div>
659
+ ) : (
660
+ <div
661
+ className={`${styles.dropZone} ${dragOver ? styles.dropZoneActive : ''} ${
662
+ errors.file ? styles.dropZoneInvalid : ''
663
+ }`}
664
+ role="button"
665
+ tabIndex={0}
666
+ aria-invalid={Boolean(errors.file)}
667
+ aria-describedby={errors.file ? 'supporting-document-error' : undefined}
668
+ onClick={() => fileInputRef.current?.click()}
669
+ onKeyDown={(e) => {
670
+ if (e.key === 'Enter' || e.key === ' ') {
671
+ e.preventDefault();
672
+ fileInputRef.current?.click();
673
+ }
674
+ }}
675
+ onDragOver={(e) => {
676
+ e.preventDefault();
677
+ setDragOver(true);
678
+ }}
679
+ onDragLeave={() => setDragOver(false)}
680
+ onDrop={(e) => {
681
+ e.preventDefault();
682
+ setDragOver(false);
683
+ const dropped = e.dataTransfer.files?.[0];
684
+ if (dropped) {
685
+ handleFileSelected(dropped);
686
+ }
687
+ }}
688
+ >
689
+ <span className={styles.dropIcon}>
690
+ <CloudUpload size={24} />
691
+ </span>
692
+ <span className={styles.dropTitle}>Drag and drop a file here</span>
693
+ <span className={styles.dropSubtitle}>or click to browse</span>
694
+ <input
695
+ ref={fileInputRef}
696
+ type="file"
697
+ accept=".pdf,.png,.jpg,.jpeg"
698
+ className={styles.hiddenInput}
699
+ onChange={(e) => handleFileSelected(e.target.files?.[0] ?? null)}
700
+ />
701
+ </div>
702
+ )}
703
+ {errors.file ? (
704
+ <div id="supporting-document-error" className={styles.fieldError} role="alert">
705
+ {errors.file}
706
+ </div>
707
+ ) : null}
708
+ </div>
709
+
710
+ {/* Lock the chosen reason so it can't be partially edited; Backspace/✕ clears it. */}
711
+ <div
712
+ onKeyDownCapture={(e) => {
713
+ if (!selectedReason || e.ctrlKey || e.metaKey || e.altKey) {
714
+ return;
715
+ }
716
+ if (e.key === 'Backspace' || e.key === 'Delete') {
717
+ e.preventDefault();
718
+ e.stopPropagation();
719
+ setSelectedReason('');
720
+ revalidate('reasonType', 'A reason type is required.');
721
+ } else if (e.key.length === 1) {
722
+ e.preventDefault();
723
+ e.stopPropagation();
724
+ }
725
+ }}
726
+ >
727
+ <ComboBox
728
+ id="reason-type"
729
+ titleText={
730
+ <>
731
+ Reason type <span className={styles.required}>*</span>
732
+ </>
733
+ }
734
+ placeholder="Search a reason"
735
+ items={REASON_TYPES}
736
+ itemToString={(item) => (item ? item.replace(/_/g, ' ') : '')}
737
+ shouldFilterItem={({ item, inputValue }) => {
738
+ const selectedLabel = selectedReason ? selectedReason.replace(/_/g, ' ') : '';
739
+ // Reopening on a selection lists every reason (the chosen one is
740
+ // highlighted); only a fresh typed query narrows the list.
741
+ if (!inputValue || inputValue === selectedLabel) {
742
+ return true;
743
+ }
744
+ return (item ?? '').replace(/_/g, ' ').toLowerCase().includes(inputValue.toLowerCase());
745
+ }}
746
+ selectedItem={selectedReason || null}
747
+ invalid={Boolean(errors.reasonType)}
748
+ invalidText={errors.reasonType}
749
+ onChange={({ selectedItem }) => {
750
+ setSelectedReason(selectedItem ?? '');
751
+ revalidate('reasonType', selectedItem ? undefined : 'A reason type is required.');
752
+ }}
753
+ />
754
+ </div>
755
+
756
+ <TextArea
757
+ id="reason-description"
758
+ labelText={
759
+ <>
760
+ Reason description <span className={styles.required}>*</span>
761
+ </>
762
+ }
763
+ placeholder="Provide additional details…"
764
+ value={reasonDescription}
765
+ invalid={Boolean(errors.reasonDescription)}
766
+ invalidText={errors.reasonDescription}
767
+ onChange={(e) => {
768
+ const value = e.target.value;
769
+ setReasonDescription(value);
770
+ revalidate(
771
+ 'reasonDescription',
772
+ !value.trim()
773
+ ? 'A reason description is required.'
774
+ : value.trim().length < 10
775
+ ? 'Provide at least 10 characters of detail.'
776
+ : undefined,
777
+ );
778
+ }}
779
+ />
780
+
781
+ {submitError ? (
782
+ <InlineNotification
783
+ kind="error"
784
+ lowContrast
785
+ hideCloseButton
786
+ title="Whitelisting request failed"
787
+ subtitle={submitError}
788
+ className={styles.submitError}
789
+ />
790
+ ) : null}
791
+
792
+ <Button
793
+ className={styles.whitelistSubmit}
794
+ size="md"
795
+ renderIcon={SendAlt}
796
+ onClick={handleWhitelistSubmit}
797
+ // Enabled only when the whole form is valid; shows the busy state in-place.
798
+ disabled={isSubmitting || !isFormValid}
799
+ >
800
+ {isSubmitting ? 'Submitting…' : 'Submit whitelisting request'}
801
+ </Button>
802
+ </div>
803
+ </div>
804
+ )}
805
+ </div>
806
+ );
807
+ };
808
+
809
+ export default OTPWhitlistingModal;