formanitor 0.1.11 → 0.2.0

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 (289) hide show
  1. package/dist/AddInvestigationWidget-G7NPTSFY.cjs +32 -0
  2. package/dist/AddInvestigationWidget-G7NPTSFY.cjs.map +1 -0
  3. package/dist/AddInvestigationWidget-TQUKTGAW.mjs +30 -0
  4. package/dist/AddInvestigationWidget-TQUKTGAW.mjs.map +1 -0
  5. package/dist/AddMedicationWidget-26RHKIA6.cjs +32 -0
  6. package/dist/AddMedicationWidget-26RHKIA6.cjs.map +1 -0
  7. package/dist/AddMedicationWidget-I5UIT3WG.mjs +30 -0
  8. package/dist/AddMedicationWidget-I5UIT3WG.mjs.map +1 -0
  9. package/dist/AddProcedureWidget-B6OUF3BM.cjs +278 -0
  10. package/dist/AddProcedureWidget-B6OUF3BM.cjs.map +1 -0
  11. package/dist/AddProcedureWidget-NB46COB6.mjs +276 -0
  12. package/dist/AddProcedureWidget-NB46COB6.mjs.map +1 -0
  13. package/dist/BiometryIolWorkupWidget-F7HRYMOJ.mjs +298 -0
  14. package/dist/BiometryIolWorkupWidget-F7HRYMOJ.mjs.map +1 -0
  15. package/dist/BiometryIolWorkupWidget-TCU4MMVI.cjs +300 -0
  16. package/dist/BiometryIolWorkupWidget-TCU4MMVI.cjs.map +1 -0
  17. package/dist/DateTimeWidget-72YUK7PX.cjs +61 -0
  18. package/dist/DateTimeWidget-72YUK7PX.cjs.map +1 -0
  19. package/dist/DateTimeWidget-WKQIEQSA.mjs +59 -0
  20. package/dist/DateTimeWidget-WKQIEQSA.mjs.map +1 -0
  21. package/dist/DateWidget-K2TVTZ7Z.mjs +72 -0
  22. package/dist/DateWidget-K2TVTZ7Z.mjs.map +1 -0
  23. package/dist/DateWidget-SYDMSGWO.cjs +74 -0
  24. package/dist/DateWidget-SYDMSGWO.cjs.map +1 -0
  25. package/dist/DiagnosisTextareaWidget-RD65PGDY.mjs +184 -0
  26. package/dist/DiagnosisTextareaWidget-RD65PGDY.mjs.map +1 -0
  27. package/dist/DiagnosisTextareaWidget-UKWLE2SQ.cjs +190 -0
  28. package/dist/DiagnosisTextareaWidget-UKWLE2SQ.cjs.map +1 -0
  29. package/dist/DifferentialDiagnosisWidget-FENJP245.mjs +15 -0
  30. package/dist/DifferentialDiagnosisWidget-FENJP245.mjs.map +1 -0
  31. package/dist/DifferentialDiagnosisWidget-ZGFXP2BH.cjs +17 -0
  32. package/dist/DifferentialDiagnosisWidget-ZGFXP2BH.cjs.map +1 -0
  33. package/dist/DischargeMedicationOrdersWidget-26ALTGJM.mjs +161 -0
  34. package/dist/DischargeMedicationOrdersWidget-26ALTGJM.mjs.map +1 -0
  35. package/dist/DischargeMedicationOrdersWidget-B4CJQ3QS.cjs +163 -0
  36. package/dist/DischargeMedicationOrdersWidget-B4CJQ3QS.cjs.map +1 -0
  37. package/dist/EditableTable-LPAYCK36.mjs +279 -0
  38. package/dist/EditableTable-LPAYCK36.mjs.map +1 -0
  39. package/dist/EditableTable-YB4IC3ZK.cjs +281 -0
  40. package/dist/EditableTable-YB4IC3ZK.cjs.map +1 -0
  41. package/dist/FollowupWidget-EEKOI2TW.cjs +285 -0
  42. package/dist/FollowupWidget-EEKOI2TW.cjs.map +1 -0
  43. package/dist/FollowupWidget-NJ4QDBOG.mjs +283 -0
  44. package/dist/FollowupWidget-NJ4QDBOG.mjs.map +1 -0
  45. package/dist/FunctionalImpairmentScoreWidget-HAAPCMIS.cjs +93 -0
  46. package/dist/FunctionalImpairmentScoreWidget-HAAPCMIS.cjs.map +1 -0
  47. package/dist/FunctionalImpairmentScoreWidget-ZNLKKBYN.mjs +91 -0
  48. package/dist/FunctionalImpairmentScoreWidget-ZNLKKBYN.mjs.map +1 -0
  49. package/dist/GsExaminationWidget-EX6C3EF5.cjs +528 -0
  50. package/dist/GsExaminationWidget-EX6C3EF5.cjs.map +1 -0
  51. package/dist/GsExaminationWidget-MEIUHRQQ.mjs +526 -0
  52. package/dist/GsExaminationWidget-MEIUHRQQ.mjs.map +1 -0
  53. package/dist/GsGradingWidget-4UPOEYNL.mjs +90 -0
  54. package/dist/GsGradingWidget-4UPOEYNL.mjs.map +1 -0
  55. package/dist/GsGradingWidget-IV3UF63W.cjs +92 -0
  56. package/dist/GsGradingWidget-IV3UF63W.cjs.map +1 -0
  57. package/dist/GsSmartHistoryWidget-7QNJZEI4.cjs +398 -0
  58. package/dist/GsSmartHistoryWidget-7QNJZEI4.cjs.map +1 -0
  59. package/dist/GsSmartHistoryWidget-LGN7W2AV.mjs +396 -0
  60. package/dist/GsSmartHistoryWidget-LGN7W2AV.mjs.map +1 -0
  61. package/dist/HiddenVitalsWidget-AMH32HT2.cjs +55 -0
  62. package/dist/HiddenVitalsWidget-AMH32HT2.cjs.map +1 -0
  63. package/dist/HiddenVitalsWidget-W23IFSEF.mjs +53 -0
  64. package/dist/HiddenVitalsWidget-W23IFSEF.mjs.map +1 -0
  65. package/dist/LensAssessmentWidget-LSHBUTT5.cjs +234 -0
  66. package/dist/LensAssessmentWidget-LSHBUTT5.cjs.map +1 -0
  67. package/dist/LensAssessmentWidget-SJ6YUTSN.mjs +232 -0
  68. package/dist/LensAssessmentWidget-SJ6YUTSN.mjs.map +1 -0
  69. package/dist/MarMedicationOrdersWidget-IKMAFPRG.mjs +74 -0
  70. package/dist/MarMedicationOrdersWidget-IKMAFPRG.mjs.map +1 -0
  71. package/dist/MarMedicationOrdersWidget-ZKZLSZRN.cjs +76 -0
  72. package/dist/MarMedicationOrdersWidget-ZKZLSZRN.cjs.map +1 -0
  73. package/dist/OBGExaminationWidget-BK4ERETW.mjs +213 -0
  74. package/dist/OBGExaminationWidget-BK4ERETW.mjs.map +1 -0
  75. package/dist/OBGExaminationWidget-SMFZ2WCL.cjs +215 -0
  76. package/dist/OBGExaminationWidget-SMFZ2WCL.cjs.map +1 -0
  77. package/dist/OBGPathwayWidget-5YTUDBEH.cjs +519 -0
  78. package/dist/OBGPathwayWidget-5YTUDBEH.cjs.map +1 -0
  79. package/dist/OBGPathwayWidget-U5BCAESB.mjs +517 -0
  80. package/dist/OBGPathwayWidget-U5BCAESB.mjs.map +1 -0
  81. package/dist/ObstetricHistoryWidget-GC63CB3U.cjs +1115 -0
  82. package/dist/ObstetricHistoryWidget-GC63CB3U.cjs.map +1 -0
  83. package/dist/ObstetricHistoryWidget-WD572Q7H.mjs +1113 -0
  84. package/dist/ObstetricHistoryWidget-WD572Q7H.mjs.map +1 -0
  85. package/dist/OphthalDiagnosisWidget-QXFK446I.cjs +91 -0
  86. package/dist/OphthalDiagnosisWidget-QXFK446I.cjs.map +1 -0
  87. package/dist/OphthalDiagnosisWidget-Y3AHD6AG.mjs +89 -0
  88. package/dist/OphthalDiagnosisWidget-Y3AHD6AG.mjs.map +1 -0
  89. package/dist/OphthalmologyWidget-CRQMN5QU.mjs +1329 -0
  90. package/dist/OphthalmologyWidget-CRQMN5QU.mjs.map +1 -0
  91. package/dist/OphthalmologyWidget-U2HQMZ4J.cjs +1331 -0
  92. package/dist/OphthalmologyWidget-U2HQMZ4J.cjs.map +1 -0
  93. package/dist/OrthopedicExamWidget-LP7VN3W5.cjs +368 -0
  94. package/dist/OrthopedicExamWidget-LP7VN3W5.cjs.map +1 -0
  95. package/dist/OrthopedicExamWidget-PAOIVU6Z.mjs +366 -0
  96. package/dist/OrthopedicExamWidget-PAOIVU6Z.mjs.map +1 -0
  97. package/dist/PainScaleFlagsWidget-IBNGVVHD.cjs +153 -0
  98. package/dist/PainScaleFlagsWidget-IBNGVVHD.cjs.map +1 -0
  99. package/dist/PainScaleFlagsWidget-MRMQ7HPJ.mjs +151 -0
  100. package/dist/PainScaleFlagsWidget-MRMQ7HPJ.mjs.map +1 -0
  101. package/dist/ReadOnlyTable-4Y2XW4MX.mjs +6 -0
  102. package/dist/ReadOnlyTable-4Y2XW4MX.mjs.map +1 -0
  103. package/dist/ReadOnlyTable-L7G6GWEJ.cjs +15 -0
  104. package/dist/ReadOnlyTable-L7G6GWEJ.cjs.map +1 -0
  105. package/dist/ReferralWidget-IYTS32TS.mjs +169 -0
  106. package/dist/ReferralWidget-IYTS32TS.mjs.map +1 -0
  107. package/dist/ReferralWidget-PDNEKHFO.cjs +171 -0
  108. package/dist/ReferralWidget-PDNEKHFO.cjs.map +1 -0
  109. package/dist/RichTextWidget-5OOJ2LJN.mjs +11 -0
  110. package/dist/RichTextWidget-5OOJ2LJN.mjs.map +1 -0
  111. package/dist/RichTextWidget-XWLOHKLE.cjs +24 -0
  112. package/dist/RichTextWidget-XWLOHKLE.cjs.map +1 -0
  113. package/dist/SmartTextarea-L7Q4CORK.cjs +19 -0
  114. package/dist/SmartTextarea-L7Q4CORK.cjs.map +1 -0
  115. package/dist/SmartTextarea-ZCXGMZLG.mjs +10 -0
  116. package/dist/SmartTextarea-ZCXGMZLG.mjs.map +1 -0
  117. package/dist/SuggestionTextareaWidget-2TEITBPF.cjs +226 -0
  118. package/dist/SuggestionTextareaWidget-2TEITBPF.cjs.map +1 -0
  119. package/dist/SuggestionTextareaWidget-RN5LZYFC.mjs +215 -0
  120. package/dist/SuggestionTextareaWidget-RN5LZYFC.mjs.map +1 -0
  121. package/dist/SurgicalRiskFlagsWidget-DBICX4MB.mjs +144 -0
  122. package/dist/SurgicalRiskFlagsWidget-DBICX4MB.mjs.map +1 -0
  123. package/dist/SurgicalRiskFlagsWidget-JCSL3GWS.cjs +146 -0
  124. package/dist/SurgicalRiskFlagsWidget-JCSL3GWS.cjs.map +1 -0
  125. package/dist/UrologyExaminationWidget-74L3IN2X.cjs +273 -0
  126. package/dist/UrologyExaminationWidget-74L3IN2X.cjs.map +1 -0
  127. package/dist/UrologyExaminationWidget-IQEBP6CI.mjs +271 -0
  128. package/dist/UrologyExaminationWidget-IQEBP6CI.mjs.map +1 -0
  129. package/dist/UrologyPathwayWidget-S4QY6RD6.mjs +153 -0
  130. package/dist/UrologyPathwayWidget-S4QY6RD6.mjs.map +1 -0
  131. package/dist/UrologyPathwayWidget-UJY5EW2G.cjs +155 -0
  132. package/dist/UrologyPathwayWidget-UJY5EW2G.cjs.map +1 -0
  133. package/dist/UrologySmartHistoryWidget-NFTHHK6A.mjs +469 -0
  134. package/dist/UrologySmartHistoryWidget-NFTHHK6A.mjs.map +1 -0
  135. package/dist/UrologySmartHistoryWidget-XKZF63BV.cjs +471 -0
  136. package/dist/UrologySmartHistoryWidget-XKZF63BV.cjs.map +1 -0
  137. package/dist/VitalsWidget-44UWQGIF.cjs +208 -0
  138. package/dist/VitalsWidget-44UWQGIF.cjs.map +1 -0
  139. package/dist/VitalsWidget-MBYDGC7U.mjs +187 -0
  140. package/dist/VitalsWidget-MBYDGC7U.mjs.map +1 -0
  141. package/dist/chunk-4BAKQIPJ.mjs +27 -0
  142. package/dist/chunk-4BAKQIPJ.mjs.map +1 -0
  143. package/dist/chunk-4KSZUIJE.cjs +143 -0
  144. package/dist/chunk-4KSZUIJE.cjs.map +1 -0
  145. package/dist/chunk-4PMNVBJD.mjs +121 -0
  146. package/dist/chunk-4PMNVBJD.mjs.map +1 -0
  147. package/dist/chunk-5E3APMY6.cjs +54 -0
  148. package/dist/chunk-5E3APMY6.cjs.map +1 -0
  149. package/dist/chunk-AIZ3XYEZ.cjs +551 -0
  150. package/dist/chunk-AIZ3XYEZ.cjs.map +1 -0
  151. package/dist/chunk-AZHTIUOL.mjs +116 -0
  152. package/dist/chunk-AZHTIUOL.mjs.map +1 -0
  153. package/dist/chunk-AZSAPO2V.cjs +174 -0
  154. package/dist/chunk-AZSAPO2V.cjs.map +1 -0
  155. package/dist/chunk-AZVJU7NZ.mjs +137 -0
  156. package/dist/chunk-AZVJU7NZ.mjs.map +1 -0
  157. package/dist/chunk-B3GBIAHZ.mjs +285 -0
  158. package/dist/chunk-B3GBIAHZ.mjs.map +1 -0
  159. package/dist/chunk-BMNY7F6H.mjs +148 -0
  160. package/dist/chunk-BMNY7F6H.mjs.map +1 -0
  161. package/dist/chunk-BU4ZEAAP.mjs +102 -0
  162. package/dist/chunk-BU4ZEAAP.mjs.map +1 -0
  163. package/dist/chunk-CTW65YW2.cjs +388 -0
  164. package/dist/chunk-CTW65YW2.cjs.map +1 -0
  165. package/dist/chunk-DE7VZVKR.cjs +140 -0
  166. package/dist/chunk-DE7VZVKR.cjs.map +1 -0
  167. package/dist/chunk-DZYV47QC.mjs +54 -0
  168. package/dist/chunk-DZYV47QC.mjs.map +1 -0
  169. package/dist/chunk-E7WUDHSA.cjs +127 -0
  170. package/dist/chunk-E7WUDHSA.cjs.map +1 -0
  171. package/dist/chunk-FHHISVCH.cjs +13 -0
  172. package/dist/chunk-FHHISVCH.cjs.map +1 -0
  173. package/dist/chunk-FZEEWRW3.cjs +77 -0
  174. package/dist/chunk-FZEEWRW3.cjs.map +1 -0
  175. package/dist/chunk-GFDE2KZC.mjs +228 -0
  176. package/dist/chunk-GFDE2KZC.mjs.map +1 -0
  177. package/dist/chunk-GNZWSVTB.mjs +29 -0
  178. package/dist/chunk-GNZWSVTB.mjs.map +1 -0
  179. package/dist/chunk-GXXWMHAA.mjs +49 -0
  180. package/dist/chunk-GXXWMHAA.mjs.map +1 -0
  181. package/dist/chunk-GZPCYSJK.mjs +104 -0
  182. package/dist/chunk-GZPCYSJK.mjs.map +1 -0
  183. package/dist/chunk-HEFZA2AH.mjs +22 -0
  184. package/dist/chunk-HEFZA2AH.mjs.map +1 -0
  185. package/dist/chunk-I4AV6BQF.mjs +10 -0
  186. package/dist/chunk-I4AV6BQF.mjs.map +1 -0
  187. package/dist/chunk-IDSBJOFY.cjs +1885 -0
  188. package/dist/chunk-IDSBJOFY.cjs.map +1 -0
  189. package/dist/chunk-IFMQKLNW.mjs +39 -0
  190. package/dist/chunk-IFMQKLNW.mjs.map +1 -0
  191. package/dist/chunk-IFSKLIS2.cjs +12 -0
  192. package/dist/chunk-IFSKLIS2.cjs.map +1 -0
  193. package/dist/chunk-IKAKE7TR.mjs +527 -0
  194. package/dist/chunk-IKAKE7TR.mjs.map +1 -0
  195. package/dist/chunk-JE6VXRWW.cjs +86 -0
  196. package/dist/chunk-JE6VXRWW.cjs.map +1 -0
  197. package/dist/chunk-JMGUUFOJ.cjs +45 -0
  198. package/dist/chunk-JMGUUFOJ.cjs.map +1 -0
  199. package/dist/chunk-JNVSA77L.cjs +236 -0
  200. package/dist/chunk-JNVSA77L.cjs.map +1 -0
  201. package/dist/chunk-KJA5BLGX.cjs +31 -0
  202. package/dist/chunk-KJA5BLGX.cjs.map +1 -0
  203. package/dist/chunk-KMJOTMUQ.cjs +109 -0
  204. package/dist/chunk-KMJOTMUQ.cjs.map +1 -0
  205. package/dist/chunk-KPGTPJDH.cjs +32 -0
  206. package/dist/chunk-KPGTPJDH.cjs.map +1 -0
  207. package/dist/chunk-LBWB7MYU.cjs +287 -0
  208. package/dist/chunk-LBWB7MYU.cjs.map +1 -0
  209. package/dist/chunk-LGGOBIEA.mjs +61 -0
  210. package/dist/chunk-LGGOBIEA.mjs.map +1 -0
  211. package/dist/chunk-LQYWMYEC.mjs +28 -0
  212. package/dist/chunk-LQYWMYEC.mjs.map +1 -0
  213. package/dist/chunk-MIUUO4CI.mjs +361 -0
  214. package/dist/chunk-MIUUO4CI.mjs.map +1 -0
  215. package/dist/chunk-N4L76SHJ.cjs +65 -0
  216. package/dist/chunk-N4L76SHJ.cjs.map +1 -0
  217. package/dist/chunk-NJJTIL3U.cjs +73 -0
  218. package/dist/chunk-NJJTIL3U.cjs.map +1 -0
  219. package/dist/chunk-O3VQBPEW.cjs +72 -0
  220. package/dist/chunk-O3VQBPEW.cjs.map +1 -0
  221. package/dist/chunk-P62377LB.cjs +27 -0
  222. package/dist/chunk-P62377LB.cjs.map +1 -0
  223. package/dist/chunk-PHADAQSH.cjs +49 -0
  224. package/dist/chunk-PHADAQSH.cjs.map +1 -0
  225. package/dist/chunk-PZBJYPWW.cjs +52 -0
  226. package/dist/chunk-PZBJYPWW.cjs.map +1 -0
  227. package/dist/chunk-QKJ7BQSR.cjs +538 -0
  228. package/dist/chunk-QKJ7BQSR.cjs.map +1 -0
  229. package/dist/chunk-QS6WG2XJ.cjs +56 -0
  230. package/dist/chunk-QS6WG2XJ.cjs.map +1 -0
  231. package/dist/chunk-S7EMPE2D.cjs +104 -0
  232. package/dist/chunk-S7EMPE2D.cjs.map +1 -0
  233. package/dist/chunk-SCMXLRX5.mjs +42 -0
  234. package/dist/chunk-SCMXLRX5.mjs.map +1 -0
  235. package/dist/chunk-TJHG5WHX.cjs +47 -0
  236. package/dist/chunk-TJHG5WHX.cjs.map +1 -0
  237. package/dist/chunk-UGGUIXUS.cjs +41 -0
  238. package/dist/chunk-UGGUIXUS.cjs.map +1 -0
  239. package/dist/chunk-UULLSS4O.mjs +82 -0
  240. package/dist/chunk-UULLSS4O.mjs.map +1 -0
  241. package/dist/chunk-VNFBUAZD.mjs +25 -0
  242. package/dist/chunk-VNFBUAZD.mjs.map +1 -0
  243. package/dist/chunk-VPU66PI6.mjs +11 -0
  244. package/dist/chunk-VPU66PI6.mjs.map +1 -0
  245. package/dist/chunk-WYVXXEZI.mjs +46 -0
  246. package/dist/chunk-WYVXXEZI.mjs.map +1 -0
  247. package/dist/chunk-XDUVO3IZ.mjs +547 -0
  248. package/dist/chunk-XDUVO3IZ.mjs.map +1 -0
  249. package/dist/chunk-XR2ZM654.mjs +30 -0
  250. package/dist/chunk-XR2ZM654.mjs.map +1 -0
  251. package/dist/chunk-Y7TIWH4I.mjs +25 -0
  252. package/dist/chunk-Y7TIWH4I.mjs.map +1 -0
  253. package/dist/chunk-YEFM2ERQ.cjs +143 -0
  254. package/dist/chunk-YEFM2ERQ.cjs.map +1 -0
  255. package/dist/chunk-YYPMIUDW.mjs +69 -0
  256. package/dist/chunk-YYPMIUDW.mjs.map +1 -0
  257. package/dist/chunk-ZGPHTPAN.mjs +1851 -0
  258. package/dist/chunk-ZGPHTPAN.mjs.map +1 -0
  259. package/dist/chunk-ZSOIQVB3.mjs +75 -0
  260. package/dist/chunk-ZSOIQVB3.mjs.map +1 -0
  261. package/dist/index.cjs +1596 -14540
  262. package/dist/index.cjs.map +1 -1
  263. package/dist/index.d.cts +4 -767
  264. package/dist/index.d.ts +4 -767
  265. package/dist/index.mjs +1358 -14349
  266. package/dist/index.mjs.map +1 -1
  267. package/dist/read-only-table.cjs +15 -0
  268. package/dist/read-only-table.cjs.map +1 -0
  269. package/dist/read-only-table.d.cts +10 -0
  270. package/dist/read-only-table.d.ts +10 -0
  271. package/dist/read-only-table.mjs +6 -0
  272. package/dist/read-only-table.mjs.map +1 -0
  273. package/dist/rich-text.cjs +24 -0
  274. package/dist/rich-text.cjs.map +1 -0
  275. package/dist/rich-text.d.cts +8 -0
  276. package/dist/rich-text.d.ts +8 -0
  277. package/dist/rich-text.mjs +11 -0
  278. package/dist/rich-text.mjs.map +1 -0
  279. package/dist/richTextClassName--8wkuHkW.d.cts +10 -0
  280. package/dist/richTextClassName--8wkuHkW.d.ts +10 -0
  281. package/dist/smart.cjs +23 -0
  282. package/dist/smart.cjs.map +1 -0
  283. package/dist/smart.d.cts +23 -0
  284. package/dist/smart.d.ts +23 -0
  285. package/dist/smart.mjs +10 -0
  286. package/dist/smart.mjs.map +1 -0
  287. package/dist/types-D0iYXUOo.d.cts +736 -0
  288. package/dist/types-D0iYXUOo.d.ts +736 -0
  289. package/package.json +20 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/shadcn/date-picker.tsx","../src/ui/widgets/DateWidget.tsx"],"names":["CalendarIcon","Calendar","jsxs","jsx"],"mappings":";;;;;;;;;;;;;AAmBO,SAAS,WAAW,EAAE,IAAA,EAAM,SAAS,SAAA,EAAW,WAAA,GAAc,eAAc,EAAoB;AACrG,EAAA,4BACG,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,SAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,UACT,+CAAA;AAAA,UACA,CAAC,IAAA,IAAQ,uBAAA;AAAA,UACT;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAACA,QAAA,EAAA,EAAa,WAAU,cAAA,EAAe,CAAA;AAAA,UACtC,OAAO,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA,mBAAI,GAAA,CAAC,UAAM,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA;AAAA,KACnD,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,YAAA,EACxB,QAAA,kBAAA,GAAA;AAAA,MAACC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,YAAA,EAAY;AAAA;AAAA,KACd,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC/BO,IAAM,UAAA,GAA4C,CAAC,EAAE,OAAA,EAAQ,KAAM;AACxE,EAAA,MAAM,EAAE,UAAU,KAAA,EAAO,QAAA,EAAU,YAAY,KAAA,EAAO,OAAA,EAAQ,GAAI,QAAA,CAAS,OAAO,CAAA;AAClF,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,OAAA,EAAQ;AAC1B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,KAAA,KAAU,WAAW,KAAA,CAAM,eAAA,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,eAAe,QAAQ,CAAA;AAEzC,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,iBAAA,CAAkB,QAAA,EAAU,WAAW,CAAA,EACpD,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCA,KAAC,KAAA,EAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAW,eAAA,CAAgB,QAAQ,CAAA,EACzD,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,KAAA;AAAA,MAAO,GAAA;AAAA,sBACjBC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAoB;AAAA,KAAA,EAC9C,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,QAAQ,MAAM,UAAA,IACjB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AAAA,QAChC,OAAA,EAAS,CAAC,IAAA,KAAS,QAAA,CAAS,OAAO,IAAA,CAAK,WAAA,KAAgB,MAAS,CAAA;AAAA,QACjE,aAAa,QAAA,CAAS,WAAA;AAAA,QACtB,SAAA,EAAW,iBAAA;AAAA,UACT,QAAA;AAAA,UACA,YAAY,uBAAA,GAA0B;AAAA;AACxC;AAAA,KACF,EACF,CAAA;AAAA,IACC,SAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAW,eAAA,CAAgB,QAAA,EAAU,sBAAsB,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAE5E,CAAA;AAEJ","file":"DateWidget-K2TVTZ7Z.mjs","sourcesContent":["import { format } from \"date-fns\"\nimport { Calendar as CalendarIcon } from \"lucide-react\"\n\nimport { cn } from \"../../core/utils\"\nimport { Button } from \"./button\"\nimport { Calendar } from \"./calendar\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"./popover\"\n\nexport interface DatePickerProps {\n date?: Date\n setDate?: (date: Date | undefined) => void\n className?: string\n placeholder?: string\n}\n\nexport function DatePicker({ date, setDate, className, placeholder = \"Pick a date\" }: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant={\"outline\"}\n className={cn(\n \"w-[280px] justify-start text-left font-normal\",\n !date && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {date ? format(date, \"PPP\") : <span>{placeholder}</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\">\n <Calendar\n mode=\"single\"\n selected={date}\n onSelect={setDate}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n )\n}\n\n","import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { DatePicker } from '../shadcn/date-picker';\nimport { Label } from '../shadcn/label';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const DateWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {showLabel ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n ) : null}\n <div onBlur={() => setTouched()}>\n <DatePicker\n date={value ? new Date(value) : undefined}\n setDate={(date) => setValue(date ? date.toISOString() : undefined)}\n placeholder={fieldDef.placeholder}\n className={fieldControlClass(\n fieldDef,\n showError ? 'border-red-500 w-full' : 'w-full',\n )}\n />\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n"]}
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
4
+ var chunkKPGTPJDH_cjs = require('./chunk-KPGTPJDH.cjs');
5
+ var chunkAZSAPO2V_cjs = require('./chunk-AZSAPO2V.cjs');
6
+ require('./chunk-4KSZUIJE.cjs');
7
+ var chunkO3VQBPEW_cjs = require('./chunk-O3VQBPEW.cjs');
8
+ var chunkIDSBJOFY_cjs = require('./chunk-IDSBJOFY.cjs');
9
+ var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
10
+ var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
11
+ require('react');
12
+ var dateFns = require('date-fns');
13
+ var lucideReact = require('lucide-react');
14
+ var jsxRuntime = require('react/jsx-runtime');
15
+
16
+ function DatePicker({ date, setDate, className, placeholder = "Pick a date" }) {
17
+ return /* @__PURE__ */ jsxRuntime.jsxs(chunkAZSAPO2V_cjs.Popover, { children: [
18
+ /* @__PURE__ */ jsxRuntime.jsx(chunkAZSAPO2V_cjs.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
19
+ chunkO3VQBPEW_cjs.Button,
20
+ {
21
+ variant: "outline",
22
+ className: chunkFHHISVCH_cjs.cn(
23
+ "w-[280px] justify-start text-left font-normal",
24
+ !date && "text-muted-foreground",
25
+ className
26
+ ),
27
+ children: [
28
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Calendar, { className: "mr-2 h-4 w-4" }),
29
+ date ? dateFns.format(date, "PPP") : /* @__PURE__ */ jsxRuntime.jsx("span", { children: placeholder })
30
+ ]
31
+ }
32
+ ) }),
33
+ /* @__PURE__ */ jsxRuntime.jsx(chunkAZSAPO2V_cjs.PopoverContent, { className: "w-auto p-0", children: /* @__PURE__ */ jsxRuntime.jsx(
34
+ chunkAZSAPO2V_cjs.Calendar,
35
+ {
36
+ mode: "single",
37
+ selected: date,
38
+ onSelect: setDate,
39
+ initialFocus: true
40
+ }
41
+ ) })
42
+ ] });
43
+ }
44
+ var DateWidget = ({ fieldId }) => {
45
+ const { fieldDef, value, setValue, setTouched, error, touched } = chunkIDSBJOFY_cjs.useField(fieldId);
46
+ const { state } = chunkKPGTPJDH_cjs.useForm();
47
+ const showError = !!error && (touched || state.submitAttempted);
48
+ if (!fieldDef) return null;
49
+ const showLabel = chunk5E3APMY6_cjs.isLabelVisible(fieldDef);
50
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5E3APMY6_cjs.fieldWrapperClass(fieldDef, "space-y-2"), children: [
51
+ showLabel ? /* @__PURE__ */ jsxRuntime.jsxs(chunkJMGUUFOJ_cjs.Label, { htmlFor: fieldId, className: chunk5E3APMY6_cjs.fieldLabelClass(fieldDef), children: [
52
+ fieldDef.label,
53
+ " ",
54
+ /* @__PURE__ */ jsxRuntime.jsx(chunk5E3APMY6_cjs.FieldRequiredIndicator, { fieldDef })
55
+ ] }) : null,
56
+ /* @__PURE__ */ jsxRuntime.jsx("div", { onBlur: () => setTouched(), children: /* @__PURE__ */ jsxRuntime.jsx(
57
+ DatePicker,
58
+ {
59
+ date: value ? new Date(value) : void 0,
60
+ setDate: (date) => setValue(date ? date.toISOString() : void 0),
61
+ placeholder: fieldDef.placeholder,
62
+ className: chunk5E3APMY6_cjs.fieldControlClass(
63
+ fieldDef,
64
+ showError ? "border-red-500 w-full" : "w-full"
65
+ )
66
+ }
67
+ ) }),
68
+ showError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldErrorClass(fieldDef, "text-xs text-red-500"), children: error })
69
+ ] });
70
+ };
71
+
72
+ exports.DateWidget = DateWidget;
73
+ //# sourceMappingURL=DateWidget-SYDMSGWO.cjs.map
74
+ //# sourceMappingURL=DateWidget-SYDMSGWO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/shadcn/date-picker.tsx","../src/ui/widgets/DateWidget.tsx"],"names":["Popover","jsx","PopoverTrigger","jsxs","Button","cn","CalendarIcon","format","PopoverContent","Calendar","useField","useForm","isLabelVisible","fieldWrapperClass","Label","fieldLabelClass","FieldRequiredIndicator","fieldControlClass","fieldErrorClass"],"mappings":";;;;;;;;;;;;;;;AAmBO,SAAS,WAAW,EAAE,IAAA,EAAM,SAAS,SAAA,EAAW,WAAA,GAAc,eAAc,EAAoB;AACrG,EAAA,uCACGA,yBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,gCAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAAC,eAAA;AAAA,MAACC,wBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,SAAA;AAAA,QACT,SAAA,EAAWC,oBAAA;AAAA,UACT,+CAAA;AAAA,UACA,CAAC,IAAA,IAAQ,uBAAA;AAAA,UACT;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAJ,cAAA,CAACK,oBAAA,EAAA,EAAa,WAAU,cAAA,EAAe,CAAA;AAAA,UACtC,OAAOC,cAAA,CAAO,IAAA,EAAM,KAAK,CAAA,mBAAIN,cAAA,CAAC,UAAM,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA;AAAA,KACnD,EACF,CAAA;AAAA,oBACAA,cAAA,CAACO,gCAAA,EAAA,EAAe,SAAA,EAAU,YAAA,EACxB,QAAA,kBAAAP,cAAA;AAAA,MAACQ,0BAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,YAAA,EAAY;AAAA;AAAA,KACd,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC/BO,IAAM,UAAA,GAA4C,CAAC,EAAE,OAAA,EAAQ,KAAM;AACxE,EAAA,MAAM,EAAE,UAAU,KAAA,EAAO,QAAA,EAAU,YAAY,KAAA,EAAO,OAAA,EAAQ,GAAIC,0BAAA,CAAS,OAAO,CAAA;AAClF,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIC,yBAAA,EAAQ;AAC1B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,KAAA,KAAU,WAAW,KAAA,CAAM,eAAA,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,SAAA,GAAYC,iCAAe,QAAQ,CAAA;AAEzC,EAAA,uBACET,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWU,mCAAA,CAAkB,QAAA,EAAU,WAAW,CAAA,EACpD,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCV,gBAACW,uBAAA,EAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAWC,iCAAA,CAAgB,QAAQ,CAAA,EACzD,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,KAAA;AAAA,MAAO,GAAA;AAAA,sBACjBd,cAAAA,CAACe,wCAAA,EAAA,EAAuB,QAAA,EAAoB;AAAA,KAAA,EAC9C,CAAA,GACE,IAAA;AAAA,oBACJf,cAAAA,CAAC,KAAA,EAAA,EAAI,QAAQ,MAAM,UAAA,IACjB,QAAA,kBAAAA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AAAA,QAChC,OAAA,EAAS,CAAC,IAAA,KAAS,QAAA,CAAS,OAAO,IAAA,CAAK,WAAA,KAAgB,MAAS,CAAA;AAAA,QACjE,aAAa,QAAA,CAAS,WAAA;AAAA,QACtB,SAAA,EAAWgB,mCAAA;AAAA,UACT,QAAA;AAAA,UACA,YAAY,uBAAA,GAA0B;AAAA;AACxC;AAAA,KACF,EACF,CAAA;AAAA,IACC,SAAA,oBACChB,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAWiB,iCAAA,CAAgB,QAAA,EAAU,sBAAsB,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAE5E,CAAA;AAEJ","file":"DateWidget-SYDMSGWO.cjs","sourcesContent":["import { format } from \"date-fns\"\nimport { Calendar as CalendarIcon } from \"lucide-react\"\n\nimport { cn } from \"../../core/utils\"\nimport { Button } from \"./button\"\nimport { Calendar } from \"./calendar\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"./popover\"\n\nexport interface DatePickerProps {\n date?: Date\n setDate?: (date: Date | undefined) => void\n className?: string\n placeholder?: string\n}\n\nexport function DatePicker({ date, setDate, className, placeholder = \"Pick a date\" }: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant={\"outline\"}\n className={cn(\n \"w-[280px] justify-start text-left font-normal\",\n !date && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {date ? format(date, \"PPP\") : <span>{placeholder}</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\">\n <Calendar\n mode=\"single\"\n selected={date}\n onSelect={setDate}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n )\n}\n\n","import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { DatePicker } from '../shadcn/date-picker';\nimport { Label } from '../shadcn/label';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const DateWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {showLabel ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n ) : null}\n <div onBlur={() => setTouched()}>\n <DatePicker\n date={value ? new Date(value) : undefined}\n setDate={(date) => setValue(date ? date.toISOString() : undefined)}\n placeholder={fieldDef.placeholder}\n className={fieldControlClass(\n fieldDef,\n showError ? 'border-red-500 w-full' : 'w-full',\n )}\n />\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n"]}
@@ -0,0 +1,184 @@
1
+ import { Textarea } from './chunk-4BAKQIPJ.mjs';
2
+ import { getThemeConfig } from './chunk-Y7TIWH4I.mjs';
3
+ import { FieldRequiredIndicator, isLabelVisible, fieldLabelClass, fieldControlClass, fieldErrorClass, fieldWrapperClass } from './chunk-WYVXXEZI.mjs';
4
+ import { useForm } from './chunk-XR2ZM654.mjs';
5
+ import { useField, useFieldHandlers } from './chunk-ZGPHTPAN.mjs';
6
+ import { Label } from './chunk-HEFZA2AH.mjs';
7
+ import { cn } from './chunk-VPU66PI6.mjs';
8
+ import React from 'react';
9
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
10
+
11
+ function normalizeDiagnosisGrades(payload) {
12
+ const result = [];
13
+ const pushGroup = (conditionRaw, gradesRaw) => {
14
+ const condition = typeof conditionRaw === "string" ? conditionRaw.trim() : "";
15
+ if (!condition) return;
16
+ if (!Array.isArray(gradesRaw)) return;
17
+ const grades = Array.from(
18
+ new Set(
19
+ gradesRaw.map((grade) => typeof grade === "string" ? grade.trim() : "").filter(Boolean)
20
+ )
21
+ );
22
+ if (grades.length === 0) return;
23
+ result.push({ condition, grades });
24
+ };
25
+ const asArrayResponse = payload;
26
+ if (Array.isArray(asArrayResponse?.diagnosisGrades)) {
27
+ asArrayResponse.diagnosisGrades.forEach((item) => {
28
+ pushGroup(item?.condition, item?.grades);
29
+ });
30
+ return result;
31
+ }
32
+ const asMapResponse = payload;
33
+ const mapLike = asMapResponse?.field === "diagnosisgrade" && asMapResponse?.value && typeof asMapResponse.value === "object" ? asMapResponse.value : null;
34
+ if (mapLike) {
35
+ Object.entries(mapLike).forEach(([condition, grades]) => {
36
+ pushGroup(condition, grades);
37
+ });
38
+ }
39
+ return result;
40
+ }
41
+ var DiagnosisTextareaWidget = ({ fieldId }) => {
42
+ const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);
43
+ const { state } = useForm();
44
+ const handler = useFieldHandlers(fieldId);
45
+ const def = fieldDef;
46
+ const [gradeGroups, setGradeGroups] = React.useState([]);
47
+ const [isLoadingGrades, setIsLoadingGrades] = React.useState(false);
48
+ const normalized = React.useMemo(() => {
49
+ const raw = value;
50
+ if (typeof raw === "string") {
51
+ return { text: raw, selectedGradesByCondition: {} };
52
+ }
53
+ if (!raw || typeof raw !== "object") {
54
+ return { text: "", selectedGradesByCondition: {} };
55
+ }
56
+ const text = typeof raw.text === "string" ? raw.text : "";
57
+ const mapRaw = raw.selectedGradesByCondition;
58
+ let selectedGradesByCondition = {};
59
+ if (mapRaw && typeof mapRaw === "object" && !Array.isArray(mapRaw)) {
60
+ const entries = Object.entries(mapRaw);
61
+ for (const [condition, gradeRaw] of entries) {
62
+ if (typeof condition !== "string") continue;
63
+ if (typeof gradeRaw === "string" && gradeRaw.trim()) {
64
+ selectedGradesByCondition[condition] = gradeRaw;
65
+ }
66
+ }
67
+ }
68
+ const sg = raw.selectedGrade;
69
+ if (sg && typeof sg === "object" && typeof sg.condition === "string" && typeof sg.grade === "string") {
70
+ const condition = sg.condition.trim();
71
+ const grade = sg.grade.trim();
72
+ if (condition && grade && !selectedGradesByCondition[condition]) {
73
+ selectedGradesByCondition = { ...selectedGradesByCondition, [condition]: grade };
74
+ }
75
+ }
76
+ return { text, selectedGradesByCondition };
77
+ }, [value]);
78
+ const textValue = normalized.text;
79
+ const showError = !!error && (touched || state.submitAttempted);
80
+ React.useEffect(() => {
81
+ const query = textValue.trim();
82
+ const fetchGrades = handler.onFetchDiagnosisGrades;
83
+ const debounceMs = def?.debounceDelay ?? 1e3;
84
+ if (!query || !fetchGrades) {
85
+ setGradeGroups([]);
86
+ setIsLoadingGrades(false);
87
+ return;
88
+ }
89
+ let isActive = true;
90
+ const timer = window.setTimeout(async () => {
91
+ setIsLoadingGrades(true);
92
+ try {
93
+ const response = await fetchGrades(query);
94
+ if (!isActive) return;
95
+ setGradeGroups(normalizeDiagnosisGrades(response));
96
+ } catch {
97
+ if (!isActive) return;
98
+ setGradeGroups([]);
99
+ } finally {
100
+ if (isActive) setIsLoadingGrades(false);
101
+ }
102
+ }, debounceMs);
103
+ return () => {
104
+ isActive = false;
105
+ window.clearTimeout(timer);
106
+ };
107
+ }, [textValue, handler.onFetchDiagnosisGrades, def?.debounceDelay]);
108
+ if (!def) return null;
109
+ const theme = getThemeConfig("textarea", def.theme);
110
+ const wrapperClass = theme?.wrapperClassName ?? "space-y-2";
111
+ const labelClass = theme?.labelClassName;
112
+ const inputClass = cn(theme?.inputClassName, showError && "border-red-500");
113
+ const toggleSelectedGrade = (condition, grade) => {
114
+ if (disabled) return;
115
+ const current = normalized.selectedGradesByCondition[condition];
116
+ const nextForCondition = current === grade ? "" : grade;
117
+ const nextMap = { ...normalized.selectedGradesByCondition };
118
+ if (!nextForCondition) {
119
+ delete nextMap[condition];
120
+ } else {
121
+ nextMap[condition] = nextForCondition;
122
+ }
123
+ setValue({ text: normalized.text, selectedGradesByCondition: nextMap });
124
+ setTouched();
125
+ };
126
+ const labelContent = /* @__PURE__ */ jsxs(Fragment, { children: [
127
+ def.label,
128
+ " ",
129
+ /* @__PURE__ */ jsx(FieldRequiredIndicator, { fieldDef: def })
130
+ ] });
131
+ const showLabel = isLabelVisible(def);
132
+ return /* @__PURE__ */ jsxs("div", { className: fieldWrapperClass(def, wrapperClass), children: [
133
+ showLabel ? theme ? /* @__PURE__ */ jsx(Label, { htmlFor: fieldId, className: fieldLabelClass(def, labelClass), children: labelContent }) : /* @__PURE__ */ jsx(Label, { htmlFor: fieldId, className: fieldLabelClass(def), children: labelContent }) : null,
134
+ /* @__PURE__ */ jsx(
135
+ Textarea,
136
+ {
137
+ id: fieldId,
138
+ value: textValue,
139
+ onChange: (e) => setValue({ text: e.target.value, selectedGradesByCondition: normalized.selectedGradesByCondition }),
140
+ onBlur: setTouched,
141
+ disabled,
142
+ placeholder: def.placeholder,
143
+ className: fieldControlClass(def, inputClass),
144
+ "aria-label": !showLabel ? def.label : void 0,
145
+ ...def.height != null ? { height: def.height } : {}
146
+ }
147
+ ),
148
+ isLoadingGrades && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: "Checking diagnosis grades..." }),
149
+ !isLoadingGrades && gradeGroups.length > 0 && /* @__PURE__ */ jsx(
150
+ "div",
151
+ {
152
+ className: "mt-2 space-y-3 rounded-lg border border-border bg-muted/30 p-3",
153
+ role: "group",
154
+ "aria-label": "Diagnosis grade options",
155
+ children: gradeGroups.map((group) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
156
+ /* @__PURE__ */ jsxs("span", { className: "text-xs font-medium leading-none text-muted-foreground", children: [
157
+ group.condition,
158
+ ":"
159
+ ] }),
160
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: group.grades.map((grade) => /* @__PURE__ */ jsx(
161
+ "button",
162
+ {
163
+ type: "button",
164
+ onClick: () => toggleSelectedGrade(group.condition, grade),
165
+ disabled,
166
+ className: cn(
167
+ "inline-flex min-h-8 items-center rounded-full border px-3 py-1 text-xs font-medium leading-none transition-colors",
168
+ normalized.selectedGradesByCondition[group.condition] === grade ? "border-primary bg-primary/15 text-primary shadow-sm" : "border-border/80 bg-background text-foreground hover:bg-muted/80",
169
+ disabled && "cursor-not-allowed opacity-60"
170
+ ),
171
+ children: grade
172
+ },
173
+ `${group.condition}-${grade}`
174
+ )) })
175
+ ] }, group.condition))
176
+ }
177
+ ),
178
+ showError && /* @__PURE__ */ jsx("p", { className: fieldErrorClass(def, "text-xs text-red-500"), children: error })
179
+ ] });
180
+ };
181
+
182
+ export { DiagnosisTextareaWidget };
183
+ //# sourceMappingURL=DiagnosisTextareaWidget-RD65PGDY.mjs.map
184
+ //# sourceMappingURL=DiagnosisTextareaWidget-RD65PGDY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/widgets/DiagnosisTextareaWidget.tsx"],"names":[],"mappings":"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","file":"DiagnosisTextareaWidget-RD65PGDY.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { Textarea } from '../shadcn/textarea';\nimport { Label } from '../shadcn/label';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport type { DiagnosisTextareaFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\ntype DiagnosisGradeGroup = {\n condition: string;\n grades: string[];\n};\n\ntype DiagnosisTextareaValue =\n | string\n | {\n text?: unknown;\n selectedGrade?: unknown; // legacy single-selection\n selectedGradesByCondition?: unknown; // new multi-condition single-select\n }\n | null\n | undefined;\n\ntype DiagnosisGradesArrayResponse = {\n diagnosisGrades?: Array<{\n condition?: unknown;\n grades?: unknown;\n }>;\n};\n\ntype DiagnosisMapResponse = {\n field?: unknown;\n value?: unknown;\n};\n\nfunction normalizeDiagnosisGrades(payload: unknown): DiagnosisGradeGroup[] {\n const result: DiagnosisGradeGroup[] = [];\n\n const pushGroup = (conditionRaw: unknown, gradesRaw: unknown) => {\n const condition = typeof conditionRaw === 'string' ? conditionRaw.trim() : '';\n if (!condition) return;\n if (!Array.isArray(gradesRaw)) return;\n\n const grades = Array.from(\n new Set(\n gradesRaw\n .map((grade) => (typeof grade === 'string' ? grade.trim() : ''))\n .filter(Boolean),\n ),\n );\n\n if (grades.length === 0) return;\n result.push({ condition, grades });\n };\n\n const asArrayResponse = payload as DiagnosisGradesArrayResponse;\n if (Array.isArray(asArrayResponse?.diagnosisGrades)) {\n asArrayResponse.diagnosisGrades.forEach((item) => {\n pushGroup(item?.condition, item?.grades);\n });\n return result;\n }\n\n const asMapResponse = payload as DiagnosisMapResponse;\n const mapLike =\n asMapResponse?.field === 'diagnosisgrade' && asMapResponse?.value && typeof asMapResponse.value === 'object'\n ? (asMapResponse.value as Record<string, unknown>)\n : null;\n\n if (mapLike) {\n Object.entries(mapLike).forEach(([condition, grades]) => {\n pushGroup(condition, grades);\n });\n }\n\n return result;\n}\n\nexport const DiagnosisTextareaWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const handler = useFieldHandlers(fieldId);\n const def = fieldDef as DiagnosisTextareaFieldDef | undefined;\n\n const [gradeGroups, setGradeGroups] = React.useState<DiagnosisGradeGroup[]>([]);\n const [isLoadingGrades, setIsLoadingGrades] = React.useState(false);\n\n const normalized = React.useMemo(() => {\n const raw = value as DiagnosisTextareaValue;\n if (typeof raw === 'string') {\n return { text: raw, selectedGradesByCondition: {} as Record<string, string> };\n }\n if (!raw || typeof raw !== 'object') {\n return { text: '', selectedGradesByCondition: {} as Record<string, string> };\n }\n\n const text = typeof (raw as any).text === 'string' ? ((raw as any).text as string) : '';\n\n // Prefer new map shape.\n const mapRaw = (raw as any).selectedGradesByCondition;\n let selectedGradesByCondition: Record<string, string> = {};\n if (mapRaw && typeof mapRaw === 'object' && !Array.isArray(mapRaw)) {\n const entries = Object.entries(mapRaw as Record<string, unknown>);\n for (const [condition, gradeRaw] of entries) {\n if (typeof condition !== 'string') continue;\n if (typeof gradeRaw === 'string' && gradeRaw.trim()) {\n selectedGradesByCondition[condition] = gradeRaw;\n }\n }\n }\n\n // Backward-compat: if legacy single selection exists and no map entry yet, seed it.\n const sg = (raw as any).selectedGrade;\n if (\n sg &&\n typeof sg === 'object' &&\n typeof (sg as any).condition === 'string' &&\n typeof (sg as any).grade === 'string'\n ) {\n const condition = (sg as any).condition.trim();\n const grade = (sg as any).grade.trim();\n if (condition && grade && !selectedGradesByCondition[condition]) {\n selectedGradesByCondition = { ...selectedGradesByCondition, [condition]: grade };\n }\n }\n\n return { text, selectedGradesByCondition };\n }, [value]);\n\n const textValue = normalized.text;\n const showError = !!error && (touched || state.submitAttempted);\n\n React.useEffect(() => {\n const query = textValue.trim();\n const fetchGrades = handler.onFetchDiagnosisGrades;\n const debounceMs = def?.debounceDelay ?? 1000;\n\n if (!query || !fetchGrades) {\n setGradeGroups([]);\n setIsLoadingGrades(false);\n return;\n }\n\n let isActive = true;\n const timer = window.setTimeout(async () => {\n setIsLoadingGrades(true);\n try {\n const response = await fetchGrades(query);\n if (!isActive) return;\n setGradeGroups(normalizeDiagnosisGrades(response));\n } catch {\n if (!isActive) return;\n setGradeGroups([]);\n } finally {\n if (isActive) setIsLoadingGrades(false);\n }\n }, debounceMs);\n\n return () => {\n isActive = false;\n window.clearTimeout(timer);\n };\n }, [textValue, handler.onFetchDiagnosisGrades, def?.debounceDelay]);\n\n if (!def) return null;\n\n const theme = getThemeConfig('textarea', def.theme);\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const inputClass = cn(theme?.inputClassName, showError && 'border-red-500');\n\n const toggleSelectedGrade = (condition: string, grade: string) => {\n if (disabled) return;\n const current = normalized.selectedGradesByCondition[condition];\n const nextForCondition = current === grade ? '' : grade;\n const nextMap: Record<string, string> = { ...normalized.selectedGradesByCondition };\n if (!nextForCondition) {\n delete nextMap[condition];\n } else {\n nextMap[condition] = nextForCondition;\n }\n setValue({ text: normalized.text, selectedGradesByCondition: nextMap });\n setTouched();\n };\n\n const labelContent = (\n <>\n {def.label}{' '}\n <FieldRequiredIndicator fieldDef={def} />\n </>\n );\n\n const showLabel = isLabelVisible(def);\n\n return (\n <div className={fieldWrapperClass(def, wrapperClass)}>\n {showLabel ? (\n theme ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(def, labelClass)}>\n {labelContent}\n </Label>\n ) : (\n <Label htmlFor={fieldId} className={fieldLabelClass(def)}>\n {labelContent}\n </Label>\n )\n ) : null}\n\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={(e) =>\n setValue({ text: e.target.value, selectedGradesByCondition: normalized.selectedGradesByCondition })\n }\n onBlur={setTouched}\n disabled={disabled}\n placeholder={def.placeholder}\n className={fieldControlClass(def, inputClass)}\n aria-label={!showLabel ? def.label : undefined}\n {...(def.height != null ? { height: def.height } : {})}\n />\n\n {isLoadingGrades && (\n <p className=\"mt-2 text-xs text-muted-foreground\">Checking diagnosis grades...</p>\n )}\n\n {!isLoadingGrades && gradeGroups.length > 0 && (\n <div\n className=\"mt-2 space-y-3 rounded-lg border border-border bg-muted/30 p-3\"\n role=\"group\"\n aria-label=\"Diagnosis grade options\"\n >\n {gradeGroups.map((group) => (\n <div key={group.condition} className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium leading-none text-muted-foreground\">\n {group.condition}:\n </span>\n <div className=\"flex flex-wrap gap-2\">\n {group.grades.map((grade) => (\n <button\n key={`${group.condition}-${grade}`}\n type=\"button\"\n onClick={() => toggleSelectedGrade(group.condition, grade)}\n disabled={disabled}\n className={cn(\n 'inline-flex min-h-8 items-center rounded-full border px-3 py-1 text-xs font-medium leading-none transition-colors',\n normalized.selectedGradesByCondition[group.condition] === grade\n ? 'border-primary bg-primary/15 text-primary shadow-sm'\n : 'border-border/80 bg-background text-foreground hover:bg-muted/80',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {grade}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {showError && (\n <p className={fieldErrorClass(def, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,190 @@
1
+ 'use strict';
2
+
3
+ var chunkPHADAQSH_cjs = require('./chunk-PHADAQSH.cjs');
4
+ var chunkP62377LB_cjs = require('./chunk-P62377LB.cjs');
5
+ var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
6
+ var chunkKPGTPJDH_cjs = require('./chunk-KPGTPJDH.cjs');
7
+ var chunkIDSBJOFY_cjs = require('./chunk-IDSBJOFY.cjs');
8
+ var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
9
+ var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
10
+ var React = require('react');
11
+ var jsxRuntime = require('react/jsx-runtime');
12
+
13
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
+
15
+ var React__default = /*#__PURE__*/_interopDefault(React);
16
+
17
+ function normalizeDiagnosisGrades(payload) {
18
+ const result = [];
19
+ const pushGroup = (conditionRaw, gradesRaw) => {
20
+ const condition = typeof conditionRaw === "string" ? conditionRaw.trim() : "";
21
+ if (!condition) return;
22
+ if (!Array.isArray(gradesRaw)) return;
23
+ const grades = Array.from(
24
+ new Set(
25
+ gradesRaw.map((grade) => typeof grade === "string" ? grade.trim() : "").filter(Boolean)
26
+ )
27
+ );
28
+ if (grades.length === 0) return;
29
+ result.push({ condition, grades });
30
+ };
31
+ const asArrayResponse = payload;
32
+ if (Array.isArray(asArrayResponse?.diagnosisGrades)) {
33
+ asArrayResponse.diagnosisGrades.forEach((item) => {
34
+ pushGroup(item?.condition, item?.grades);
35
+ });
36
+ return result;
37
+ }
38
+ const asMapResponse = payload;
39
+ const mapLike = asMapResponse?.field === "diagnosisgrade" && asMapResponse?.value && typeof asMapResponse.value === "object" ? asMapResponse.value : null;
40
+ if (mapLike) {
41
+ Object.entries(mapLike).forEach(([condition, grades]) => {
42
+ pushGroup(condition, grades);
43
+ });
44
+ }
45
+ return result;
46
+ }
47
+ var DiagnosisTextareaWidget = ({ fieldId }) => {
48
+ const { fieldDef, value, setValue, setTouched, error, disabled, touched } = chunkIDSBJOFY_cjs.useField(fieldId);
49
+ const { state } = chunkKPGTPJDH_cjs.useForm();
50
+ const handler = chunkIDSBJOFY_cjs.useFieldHandlers(fieldId);
51
+ const def = fieldDef;
52
+ const [gradeGroups, setGradeGroups] = React__default.default.useState([]);
53
+ const [isLoadingGrades, setIsLoadingGrades] = React__default.default.useState(false);
54
+ const normalized = React__default.default.useMemo(() => {
55
+ const raw = value;
56
+ if (typeof raw === "string") {
57
+ return { text: raw, selectedGradesByCondition: {} };
58
+ }
59
+ if (!raw || typeof raw !== "object") {
60
+ return { text: "", selectedGradesByCondition: {} };
61
+ }
62
+ const text = typeof raw.text === "string" ? raw.text : "";
63
+ const mapRaw = raw.selectedGradesByCondition;
64
+ let selectedGradesByCondition = {};
65
+ if (mapRaw && typeof mapRaw === "object" && !Array.isArray(mapRaw)) {
66
+ const entries = Object.entries(mapRaw);
67
+ for (const [condition, gradeRaw] of entries) {
68
+ if (typeof condition !== "string") continue;
69
+ if (typeof gradeRaw === "string" && gradeRaw.trim()) {
70
+ selectedGradesByCondition[condition] = gradeRaw;
71
+ }
72
+ }
73
+ }
74
+ const sg = raw.selectedGrade;
75
+ if (sg && typeof sg === "object" && typeof sg.condition === "string" && typeof sg.grade === "string") {
76
+ const condition = sg.condition.trim();
77
+ const grade = sg.grade.trim();
78
+ if (condition && grade && !selectedGradesByCondition[condition]) {
79
+ selectedGradesByCondition = { ...selectedGradesByCondition, [condition]: grade };
80
+ }
81
+ }
82
+ return { text, selectedGradesByCondition };
83
+ }, [value]);
84
+ const textValue = normalized.text;
85
+ const showError = !!error && (touched || state.submitAttempted);
86
+ React__default.default.useEffect(() => {
87
+ const query = textValue.trim();
88
+ const fetchGrades = handler.onFetchDiagnosisGrades;
89
+ const debounceMs = def?.debounceDelay ?? 1e3;
90
+ if (!query || !fetchGrades) {
91
+ setGradeGroups([]);
92
+ setIsLoadingGrades(false);
93
+ return;
94
+ }
95
+ let isActive = true;
96
+ const timer = window.setTimeout(async () => {
97
+ setIsLoadingGrades(true);
98
+ try {
99
+ const response = await fetchGrades(query);
100
+ if (!isActive) return;
101
+ setGradeGroups(normalizeDiagnosisGrades(response));
102
+ } catch {
103
+ if (!isActive) return;
104
+ setGradeGroups([]);
105
+ } finally {
106
+ if (isActive) setIsLoadingGrades(false);
107
+ }
108
+ }, debounceMs);
109
+ return () => {
110
+ isActive = false;
111
+ window.clearTimeout(timer);
112
+ };
113
+ }, [textValue, handler.onFetchDiagnosisGrades, def?.debounceDelay]);
114
+ if (!def) return null;
115
+ const theme = chunkP62377LB_cjs.getThemeConfig("textarea", def.theme);
116
+ const wrapperClass = theme?.wrapperClassName ?? "space-y-2";
117
+ const labelClass = theme?.labelClassName;
118
+ const inputClass = chunkFHHISVCH_cjs.cn(theme?.inputClassName, showError && "border-red-500");
119
+ const toggleSelectedGrade = (condition, grade) => {
120
+ if (disabled) return;
121
+ const current = normalized.selectedGradesByCondition[condition];
122
+ const nextForCondition = current === grade ? "" : grade;
123
+ const nextMap = { ...normalized.selectedGradesByCondition };
124
+ if (!nextForCondition) {
125
+ delete nextMap[condition];
126
+ } else {
127
+ nextMap[condition] = nextForCondition;
128
+ }
129
+ setValue({ text: normalized.text, selectedGradesByCondition: nextMap });
130
+ setTouched();
131
+ };
132
+ const labelContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
133
+ def.label,
134
+ " ",
135
+ /* @__PURE__ */ jsxRuntime.jsx(chunk5E3APMY6_cjs.FieldRequiredIndicator, { fieldDef: def })
136
+ ] });
137
+ const showLabel = chunk5E3APMY6_cjs.isLabelVisible(def);
138
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5E3APMY6_cjs.fieldWrapperClass(def, wrapperClass), children: [
139
+ showLabel ? theme ? /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { htmlFor: fieldId, className: chunk5E3APMY6_cjs.fieldLabelClass(def, labelClass), children: labelContent }) : /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { htmlFor: fieldId, className: chunk5E3APMY6_cjs.fieldLabelClass(def), children: labelContent }) : null,
140
+ /* @__PURE__ */ jsxRuntime.jsx(
141
+ chunkPHADAQSH_cjs.Textarea,
142
+ {
143
+ id: fieldId,
144
+ value: textValue,
145
+ onChange: (e) => setValue({ text: e.target.value, selectedGradesByCondition: normalized.selectedGradesByCondition }),
146
+ onBlur: setTouched,
147
+ disabled,
148
+ placeholder: def.placeholder,
149
+ className: chunk5E3APMY6_cjs.fieldControlClass(def, inputClass),
150
+ "aria-label": !showLabel ? def.label : void 0,
151
+ ...def.height != null ? { height: def.height } : {}
152
+ }
153
+ ),
154
+ isLoadingGrades && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: "Checking diagnosis grades..." }),
155
+ !isLoadingGrades && gradeGroups.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
156
+ "div",
157
+ {
158
+ className: "mt-2 space-y-3 rounded-lg border border-border bg-muted/30 p-3",
159
+ role: "group",
160
+ "aria-label": "Diagnosis grade options",
161
+ children: gradeGroups.map((group) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5", children: [
162
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-medium leading-none text-muted-foreground", children: [
163
+ group.condition,
164
+ ":"
165
+ ] }),
166
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: group.grades.map((grade) => /* @__PURE__ */ jsxRuntime.jsx(
167
+ "button",
168
+ {
169
+ type: "button",
170
+ onClick: () => toggleSelectedGrade(group.condition, grade),
171
+ disabled,
172
+ className: chunkFHHISVCH_cjs.cn(
173
+ "inline-flex min-h-8 items-center rounded-full border px-3 py-1 text-xs font-medium leading-none transition-colors",
174
+ normalized.selectedGradesByCondition[group.condition] === grade ? "border-primary bg-primary/15 text-primary shadow-sm" : "border-border/80 bg-background text-foreground hover:bg-muted/80",
175
+ disabled && "cursor-not-allowed opacity-60"
176
+ ),
177
+ children: grade
178
+ },
179
+ `${group.condition}-${grade}`
180
+ )) })
181
+ ] }, group.condition))
182
+ }
183
+ ),
184
+ showError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldErrorClass(def, "text-xs text-red-500"), children: error })
185
+ ] });
186
+ };
187
+
188
+ exports.DiagnosisTextareaWidget = DiagnosisTextareaWidget;
189
+ //# sourceMappingURL=DiagnosisTextareaWidget-UKWLE2SQ.cjs.map
190
+ //# sourceMappingURL=DiagnosisTextareaWidget-UKWLE2SQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/widgets/DiagnosisTextareaWidget.tsx"],"names":["useField","useForm","useFieldHandlers","React","getThemeConfig","cn","jsxs","Fragment","jsx","FieldRequiredIndicator","isLabelVisible","fieldWrapperClass","Label","fieldLabelClass","Textarea","fieldControlClass","fieldErrorClass"],"mappings":"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","file":"DiagnosisTextareaWidget-UKWLE2SQ.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { Textarea } from '../shadcn/textarea';\nimport { Label } from '../shadcn/label';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport type { DiagnosisTextareaFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\ntype DiagnosisGradeGroup = {\n condition: string;\n grades: string[];\n};\n\ntype DiagnosisTextareaValue =\n | string\n | {\n text?: unknown;\n selectedGrade?: unknown; // legacy single-selection\n selectedGradesByCondition?: unknown; // new multi-condition single-select\n }\n | null\n | undefined;\n\ntype DiagnosisGradesArrayResponse = {\n diagnosisGrades?: Array<{\n condition?: unknown;\n grades?: unknown;\n }>;\n};\n\ntype DiagnosisMapResponse = {\n field?: unknown;\n value?: unknown;\n};\n\nfunction normalizeDiagnosisGrades(payload: unknown): DiagnosisGradeGroup[] {\n const result: DiagnosisGradeGroup[] = [];\n\n const pushGroup = (conditionRaw: unknown, gradesRaw: unknown) => {\n const condition = typeof conditionRaw === 'string' ? conditionRaw.trim() : '';\n if (!condition) return;\n if (!Array.isArray(gradesRaw)) return;\n\n const grades = Array.from(\n new Set(\n gradesRaw\n .map((grade) => (typeof grade === 'string' ? grade.trim() : ''))\n .filter(Boolean),\n ),\n );\n\n if (grades.length === 0) return;\n result.push({ condition, grades });\n };\n\n const asArrayResponse = payload as DiagnosisGradesArrayResponse;\n if (Array.isArray(asArrayResponse?.diagnosisGrades)) {\n asArrayResponse.diagnosisGrades.forEach((item) => {\n pushGroup(item?.condition, item?.grades);\n });\n return result;\n }\n\n const asMapResponse = payload as DiagnosisMapResponse;\n const mapLike =\n asMapResponse?.field === 'diagnosisgrade' && asMapResponse?.value && typeof asMapResponse.value === 'object'\n ? (asMapResponse.value as Record<string, unknown>)\n : null;\n\n if (mapLike) {\n Object.entries(mapLike).forEach(([condition, grades]) => {\n pushGroup(condition, grades);\n });\n }\n\n return result;\n}\n\nexport const DiagnosisTextareaWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const handler = useFieldHandlers(fieldId);\n const def = fieldDef as DiagnosisTextareaFieldDef | undefined;\n\n const [gradeGroups, setGradeGroups] = React.useState<DiagnosisGradeGroup[]>([]);\n const [isLoadingGrades, setIsLoadingGrades] = React.useState(false);\n\n const normalized = React.useMemo(() => {\n const raw = value as DiagnosisTextareaValue;\n if (typeof raw === 'string') {\n return { text: raw, selectedGradesByCondition: {} as Record<string, string> };\n }\n if (!raw || typeof raw !== 'object') {\n return { text: '', selectedGradesByCondition: {} as Record<string, string> };\n }\n\n const text = typeof (raw as any).text === 'string' ? ((raw as any).text as string) : '';\n\n // Prefer new map shape.\n const mapRaw = (raw as any).selectedGradesByCondition;\n let selectedGradesByCondition: Record<string, string> = {};\n if (mapRaw && typeof mapRaw === 'object' && !Array.isArray(mapRaw)) {\n const entries = Object.entries(mapRaw as Record<string, unknown>);\n for (const [condition, gradeRaw] of entries) {\n if (typeof condition !== 'string') continue;\n if (typeof gradeRaw === 'string' && gradeRaw.trim()) {\n selectedGradesByCondition[condition] = gradeRaw;\n }\n }\n }\n\n // Backward-compat: if legacy single selection exists and no map entry yet, seed it.\n const sg = (raw as any).selectedGrade;\n if (\n sg &&\n typeof sg === 'object' &&\n typeof (sg as any).condition === 'string' &&\n typeof (sg as any).grade === 'string'\n ) {\n const condition = (sg as any).condition.trim();\n const grade = (sg as any).grade.trim();\n if (condition && grade && !selectedGradesByCondition[condition]) {\n selectedGradesByCondition = { ...selectedGradesByCondition, [condition]: grade };\n }\n }\n\n return { text, selectedGradesByCondition };\n }, [value]);\n\n const textValue = normalized.text;\n const showError = !!error && (touched || state.submitAttempted);\n\n React.useEffect(() => {\n const query = textValue.trim();\n const fetchGrades = handler.onFetchDiagnosisGrades;\n const debounceMs = def?.debounceDelay ?? 1000;\n\n if (!query || !fetchGrades) {\n setGradeGroups([]);\n setIsLoadingGrades(false);\n return;\n }\n\n let isActive = true;\n const timer = window.setTimeout(async () => {\n setIsLoadingGrades(true);\n try {\n const response = await fetchGrades(query);\n if (!isActive) return;\n setGradeGroups(normalizeDiagnosisGrades(response));\n } catch {\n if (!isActive) return;\n setGradeGroups([]);\n } finally {\n if (isActive) setIsLoadingGrades(false);\n }\n }, debounceMs);\n\n return () => {\n isActive = false;\n window.clearTimeout(timer);\n };\n }, [textValue, handler.onFetchDiagnosisGrades, def?.debounceDelay]);\n\n if (!def) return null;\n\n const theme = getThemeConfig('textarea', def.theme);\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const inputClass = cn(theme?.inputClassName, showError && 'border-red-500');\n\n const toggleSelectedGrade = (condition: string, grade: string) => {\n if (disabled) return;\n const current = normalized.selectedGradesByCondition[condition];\n const nextForCondition = current === grade ? '' : grade;\n const nextMap: Record<string, string> = { ...normalized.selectedGradesByCondition };\n if (!nextForCondition) {\n delete nextMap[condition];\n } else {\n nextMap[condition] = nextForCondition;\n }\n setValue({ text: normalized.text, selectedGradesByCondition: nextMap });\n setTouched();\n };\n\n const labelContent = (\n <>\n {def.label}{' '}\n <FieldRequiredIndicator fieldDef={def} />\n </>\n );\n\n const showLabel = isLabelVisible(def);\n\n return (\n <div className={fieldWrapperClass(def, wrapperClass)}>\n {showLabel ? (\n theme ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(def, labelClass)}>\n {labelContent}\n </Label>\n ) : (\n <Label htmlFor={fieldId} className={fieldLabelClass(def)}>\n {labelContent}\n </Label>\n )\n ) : null}\n\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={(e) =>\n setValue({ text: e.target.value, selectedGradesByCondition: normalized.selectedGradesByCondition })\n }\n onBlur={setTouched}\n disabled={disabled}\n placeholder={def.placeholder}\n className={fieldControlClass(def, inputClass)}\n aria-label={!showLabel ? def.label : undefined}\n {...(def.height != null ? { height: def.height } : {})}\n />\n\n {isLoadingGrades && (\n <p className=\"mt-2 text-xs text-muted-foreground\">Checking diagnosis grades...</p>\n )}\n\n {!isLoadingGrades && gradeGroups.length > 0 && (\n <div\n className=\"mt-2 space-y-3 rounded-lg border border-border bg-muted/30 p-3\"\n role=\"group\"\n aria-label=\"Diagnosis grade options\"\n >\n {gradeGroups.map((group) => (\n <div key={group.condition} className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium leading-none text-muted-foreground\">\n {group.condition}:\n </span>\n <div className=\"flex flex-wrap gap-2\">\n {group.grades.map((grade) => (\n <button\n key={`${group.condition}-${grade}`}\n type=\"button\"\n onClick={() => toggleSelectedGrade(group.condition, grade)}\n disabled={disabled}\n className={cn(\n 'inline-flex min-h-8 items-center rounded-full border px-3 py-1 text-xs font-medium leading-none transition-colors',\n normalized.selectedGradesByCondition[group.condition] === grade\n ? 'border-primary bg-primary/15 text-primary shadow-sm'\n : 'border-border/80 bg-background text-foreground hover:bg-muted/80',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {grade}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {showError && (\n <p className={fieldErrorClass(def, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,15 @@
1
+ import { DifferentialDiagnosis } from './chunk-BU4ZEAAP.mjs';
2
+ import { useField } from './chunk-ZGPHTPAN.mjs';
3
+ import './chunk-VPU66PI6.mjs';
4
+ import 'react';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ var DifferentialDiagnosisWidget = ({ fieldId }) => {
8
+ const { value } = useField(fieldId);
9
+ const items = Array.isArray(value) ? value : [];
10
+ return /* @__PURE__ */ jsx(DifferentialDiagnosis, { differentialDiagnosis: items });
11
+ };
12
+
13
+ export { DifferentialDiagnosisWidget };
14
+ //# sourceMappingURL=DifferentialDiagnosisWidget-FENJP245.mjs.map
15
+ //# sourceMappingURL=DifferentialDiagnosisWidget-FENJP245.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/widgets/DifferentialDiagnosisWidget.tsx"],"names":[],"mappings":";;;;;;AAKO,IAAM,2BAAA,GAA6D,CAAC,EAAE,OAAA,EAAQ,KAAM;AACzF,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,CAAS,OAAO,CAAA;AAElC,EAAA,MAAM,QAAqC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACzD,QACD,EAAC;AAEL,EAAA,uBAAO,GAAA,CAAC,qBAAA,EAAA,EAAsB,qBAAA,EAAuB,KAAA,EAAO,CAAA;AAC9D","file":"DifferentialDiagnosisWidget-FENJP245.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { DifferentialDiagnosis } from './DifferentialDiagnosis';\nimport type { DifferentialDiagnosisItem } from './DifferentialDiagnosis';\n\nexport const DifferentialDiagnosisWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value } = useField(fieldId);\n\n const items: DifferentialDiagnosisItem[] = Array.isArray(value)\n ? (value as DifferentialDiagnosisItem[])\n : [];\n\n return <DifferentialDiagnosis differentialDiagnosis={items} />;\n};\n\n"]}
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ var chunkS7EMPE2D_cjs = require('./chunk-S7EMPE2D.cjs');
4
+ var chunkIDSBJOFY_cjs = require('./chunk-IDSBJOFY.cjs');
5
+ require('./chunk-FHHISVCH.cjs');
6
+ require('react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ var DifferentialDiagnosisWidget = ({ fieldId }) => {
10
+ const { value } = chunkIDSBJOFY_cjs.useField(fieldId);
11
+ const items = Array.isArray(value) ? value : [];
12
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkS7EMPE2D_cjs.DifferentialDiagnosis, { differentialDiagnosis: items });
13
+ };
14
+
15
+ exports.DifferentialDiagnosisWidget = DifferentialDiagnosisWidget;
16
+ //# sourceMappingURL=DifferentialDiagnosisWidget-ZGFXP2BH.cjs.map
17
+ //# sourceMappingURL=DifferentialDiagnosisWidget-ZGFXP2BH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/widgets/DifferentialDiagnosisWidget.tsx"],"names":["useField","jsx","DifferentialDiagnosis"],"mappings":";;;;;;;;AAKO,IAAM,2BAAA,GAA6D,CAAC,EAAE,OAAA,EAAQ,KAAM;AACzF,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIA,0BAAA,CAAS,OAAO,CAAA;AAElC,EAAA,MAAM,QAAqC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACzD,QACD,EAAC;AAEL,EAAA,uBAAOC,cAAA,CAACC,uCAAA,EAAA,EAAsB,qBAAA,EAAuB,KAAA,EAAO,CAAA;AAC9D","file":"DifferentialDiagnosisWidget-ZGFXP2BH.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { DifferentialDiagnosis } from './DifferentialDiagnosis';\nimport type { DifferentialDiagnosisItem } from './DifferentialDiagnosis';\n\nexport const DifferentialDiagnosisWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value } = useField(fieldId);\n\n const items: DifferentialDiagnosisItem[] = Array.isArray(value)\n ? (value as DifferentialDiagnosisItem[])\n : [];\n\n return <DifferentialDiagnosis differentialDiagnosis={items} />;\n};\n\n"]}