@ampath/esm-dha-workflow-app 4.0.0-next.33 → 4.0.0-next.331

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