formanitor 0.2.6 → 0.2.8
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.
- package/dist/{AddInvestigationWidget-MSY4VSQZ.cjs → AddInvestigationWidget-4AZ7HTJY.cjs} +7 -7
- package/dist/{AddInvestigationWidget-MSY4VSQZ.cjs.map → AddInvestigationWidget-4AZ7HTJY.cjs.map} +1 -1
- package/dist/{AddInvestigationWidget-A2JS2ETO.mjs → AddInvestigationWidget-MSW4FUHR.mjs} +3 -3
- package/dist/{AddInvestigationWidget-A2JS2ETO.mjs.map → AddInvestigationWidget-MSW4FUHR.mjs.map} +1 -1
- package/dist/{AddMedicationWidget-B5RXRYBK.mjs → AddMedicationWidget-OEULICY3.mjs} +7 -5
- package/dist/AddMedicationWidget-OEULICY3.mjs.map +1 -0
- package/dist/AddMedicationWidget-UDVVDKHR.cjs +34 -0
- package/dist/AddMedicationWidget-UDVVDKHR.cjs.map +1 -0
- package/dist/{AddProcedureWidget-YW4EV66W.mjs → AddProcedureWidget-7IZ7SY7N.mjs} +3 -3
- package/dist/{AddProcedureWidget-YW4EV66W.mjs.map → AddProcedureWidget-7IZ7SY7N.mjs.map} +1 -1
- package/dist/{AddProcedureWidget-QUNDIZGR.cjs → AddProcedureWidget-NQCN5FBQ.cjs} +6 -6
- package/dist/{AddProcedureWidget-QUNDIZGR.cjs.map → AddProcedureWidget-NQCN5FBQ.cjs.map} +1 -1
- package/dist/{BiometryIolWorkupWidget-FWO3IWTF.cjs → BiometryIolWorkupWidget-NTYCAGGX.cjs} +6 -6
- package/dist/{BiometryIolWorkupWidget-FWO3IWTF.cjs.map → BiometryIolWorkupWidget-NTYCAGGX.cjs.map} +1 -1
- package/dist/{BiometryIolWorkupWidget-5RZP34FF.mjs → BiometryIolWorkupWidget-ZJRUTQZK.mjs} +4 -4
- package/dist/{BiometryIolWorkupWidget-5RZP34FF.mjs.map → BiometryIolWorkupWidget-ZJRUTQZK.mjs.map} +1 -1
- package/dist/BpeChartWidget-OL5WKSQG.mjs +7 -0
- package/dist/{BpeChartWidget-HATASHAC.mjs.map → BpeChartWidget-OL5WKSQG.mjs.map} +1 -1
- package/dist/BpeChartWidget-WYDP2BVS.cjs +28 -0
- package/dist/{BpeChartWidget-VZRH7M7L.cjs.map → BpeChartWidget-WYDP2BVS.cjs.map} +1 -1
- package/dist/{DateTimeWidget-RJ7SATVA.cjs → DateTimeWidget-3E6N4NOK.cjs} +6 -6
- package/dist/{DateTimeWidget-RJ7SATVA.cjs.map → DateTimeWidget-3E6N4NOK.cjs.map} +1 -1
- package/dist/{DateTimeWidget-KRX4O6OD.mjs → DateTimeWidget-TAHCCYCX.mjs} +4 -4
- package/dist/{DateTimeWidget-KRX4O6OD.mjs.map → DateTimeWidget-TAHCCYCX.mjs.map} +1 -1
- package/dist/{DateWidget-JEKDKPNS.mjs → DateWidget-5LFXAWRK.mjs} +4 -4
- package/dist/{DateWidget-JEKDKPNS.mjs.map → DateWidget-5LFXAWRK.mjs.map} +1 -1
- package/dist/{DateWidget-T7IQUWEA.cjs → DateWidget-HIYZ3TY7.cjs} +6 -6
- package/dist/{DateWidget-T7IQUWEA.cjs.map → DateWidget-HIYZ3TY7.cjs.map} +1 -1
- package/dist/{DentalChartWidget-P2YPKAMO.mjs → DentalChartWidget-4ZUVMMRX.mjs} +4 -4
- package/dist/{DentalChartWidget-LYLOFWZU.cjs.map → DentalChartWidget-4ZUVMMRX.mjs.map} +1 -1
- package/dist/DentalChartWidget-J6CHCPWI.cjs +21 -0
- package/dist/{DentalChartWidget-P2YPKAMO.mjs.map → DentalChartWidget-J6CHCPWI.cjs.map} +1 -1
- package/dist/{DiagnosisTextareaWidget-XJ47OZYH.cjs → DiagnosisTextareaWidget-2N5DP2CP.cjs} +7 -7
- package/dist/{DiagnosisTextareaWidget-XJ47OZYH.cjs.map → DiagnosisTextareaWidget-2N5DP2CP.cjs.map} +1 -1
- package/dist/{DiagnosisTextareaWidget-6UCYCCSB.mjs → DiagnosisTextareaWidget-OXOXANMF.mjs} +4 -4
- package/dist/{DiagnosisTextareaWidget-6UCYCCSB.mjs.map → DiagnosisTextareaWidget-OXOXANMF.mjs.map} +1 -1
- package/dist/{DifferentialDiagnosisWidget-XESNHNQQ.cjs → DifferentialDiagnosisWidget-RLGTZFGB.cjs} +4 -4
- package/dist/{DifferentialDiagnosisWidget-XESNHNQQ.cjs.map → DifferentialDiagnosisWidget-RLGTZFGB.cjs.map} +1 -1
- package/dist/{DifferentialDiagnosisWidget-IZEZVW5F.mjs → DifferentialDiagnosisWidget-XY7CJ5OG.mjs} +3 -3
- package/dist/{DifferentialDiagnosisWidget-IZEZVW5F.mjs.map → DifferentialDiagnosisWidget-XY7CJ5OG.mjs.map} +1 -1
- package/dist/{DischargeMedicationOrdersWidget-KA3HANHE.mjs → DischargeMedicationOrdersWidget-JXLQWPCP.mjs} +4 -4
- package/dist/{DischargeMedicationOrdersWidget-KA3HANHE.mjs.map → DischargeMedicationOrdersWidget-JXLQWPCP.mjs.map} +1 -1
- package/dist/{DischargeMedicationOrdersWidget-WRJRYL6F.cjs → DischargeMedicationOrdersWidget-X3ZVW3FP.cjs} +7 -7
- package/dist/{DischargeMedicationOrdersWidget-WRJRYL6F.cjs.map → DischargeMedicationOrdersWidget-X3ZVW3FP.cjs.map} +1 -1
- package/dist/{EditableTable-VZ66IXYI.mjs → EditableTable-ECNOISL3.mjs} +3 -3
- package/dist/{EditableTable-VZ66IXYI.mjs.map → EditableTable-ECNOISL3.mjs.map} +1 -1
- package/dist/{EditableTable-OW5LC6OC.cjs → EditableTable-OFVKAYRA.cjs} +4 -4
- package/dist/{EditableTable-OW5LC6OC.cjs.map → EditableTable-OFVKAYRA.cjs.map} +1 -1
- package/dist/{ExtraOralExamWidget-JVKJ4ZWC.mjs → ExtraOralExamWidget-74G73HGP.mjs} +3 -3
- package/dist/{ExtraOralExamWidget-JVKJ4ZWC.mjs.map → ExtraOralExamWidget-74G73HGP.mjs.map} +1 -1
- package/dist/{ExtraOralExamWidget-ZIOSKMIO.cjs → ExtraOralExamWidget-ETQI25NZ.cjs} +4 -4
- package/dist/{ExtraOralExamWidget-ZIOSKMIO.cjs.map → ExtraOralExamWidget-ETQI25NZ.cjs.map} +1 -1
- package/dist/{FollowupWidget-GCGPWZVY.mjs → FollowupWidget-ENDML2BN.mjs} +3 -3
- package/dist/{FollowupWidget-GCGPWZVY.mjs.map → FollowupWidget-ENDML2BN.mjs.map} +1 -1
- package/dist/{FollowupWidget-2STSJSDY.cjs → FollowupWidget-XMPHTW2M.cjs} +4 -4
- package/dist/{FollowupWidget-2STSJSDY.cjs.map → FollowupWidget-XMPHTW2M.cjs.map} +1 -1
- package/dist/{FunctionalImpairmentScoreWidget-FCA4UKQA.cjs → FunctionalImpairmentScoreWidget-7TACV6EV.cjs} +6 -6
- package/dist/{FunctionalImpairmentScoreWidget-FCA4UKQA.cjs.map → FunctionalImpairmentScoreWidget-7TACV6EV.cjs.map} +1 -1
- package/dist/{FunctionalImpairmentScoreWidget-TKS6KE7K.mjs → FunctionalImpairmentScoreWidget-MGK6K4ZW.mjs} +4 -4
- package/dist/{FunctionalImpairmentScoreWidget-TKS6KE7K.mjs.map → FunctionalImpairmentScoreWidget-MGK6K4ZW.mjs.map} +1 -1
- package/dist/{GsExaminationWidget-ESIEZCP3.mjs → GsExaminationWidget-LCFURWVZ.mjs} +4 -4
- package/dist/{GsExaminationWidget-ESIEZCP3.mjs.map → GsExaminationWidget-LCFURWVZ.mjs.map} +1 -1
- package/dist/{GsExaminationWidget-KKE5I5GX.cjs → GsExaminationWidget-PCPCUJWN.cjs} +10 -10
- package/dist/{GsExaminationWidget-KKE5I5GX.cjs.map → GsExaminationWidget-PCPCUJWN.cjs.map} +1 -1
- package/dist/{GsGradingWidget-HC4MJ4KJ.mjs → GsGradingWidget-2TNN3B3R.mjs} +4 -4
- package/dist/{GsGradingWidget-HC4MJ4KJ.mjs.map → GsGradingWidget-2TNN3B3R.mjs.map} +1 -1
- package/dist/{GsGradingWidget-NGCQQVYA.cjs → GsGradingWidget-OXS65SQJ.cjs} +12 -12
- package/dist/{GsGradingWidget-NGCQQVYA.cjs.map → GsGradingWidget-OXS65SQJ.cjs.map} +1 -1
- package/dist/{GsSmartHistoryWidget-AAB427Q2.cjs → GsSmartHistoryWidget-CCIUZHMN.cjs} +12 -12
- package/dist/{GsSmartHistoryWidget-AAB427Q2.cjs.map → GsSmartHistoryWidget-CCIUZHMN.cjs.map} +1 -1
- package/dist/{GsSmartHistoryWidget-7HYGDU4O.mjs → GsSmartHistoryWidget-G5B3VUHN.mjs} +4 -4
- package/dist/{GsSmartHistoryWidget-7HYGDU4O.mjs.map → GsSmartHistoryWidget-G5B3VUHN.mjs.map} +1 -1
- package/dist/{HiddenVitalsWidget-5GFBDDPT.cjs → HiddenVitalsWidget-DHZOSOQY.cjs} +6 -6
- package/dist/{HiddenVitalsWidget-5GFBDDPT.cjs.map → HiddenVitalsWidget-DHZOSOQY.cjs.map} +1 -1
- package/dist/{HiddenVitalsWidget-CIE3KERT.mjs → HiddenVitalsWidget-QWJHUVRJ.mjs} +4 -4
- package/dist/{HiddenVitalsWidget-CIE3KERT.mjs.map → HiddenVitalsWidget-QWJHUVRJ.mjs.map} +1 -1
- package/dist/{LensAssessmentWidget-SIKJVVAE.cjs → LensAssessmentWidget-6DFZYT5F.cjs} +6 -6
- package/dist/{LensAssessmentWidget-SIKJVVAE.cjs.map → LensAssessmentWidget-6DFZYT5F.cjs.map} +1 -1
- package/dist/{LensAssessmentWidget-B4OMHTOE.mjs → LensAssessmentWidget-P2KHBHM2.mjs} +4 -4
- package/dist/{LensAssessmentWidget-B4OMHTOE.mjs.map → LensAssessmentWidget-P2KHBHM2.mjs.map} +1 -1
- package/dist/{MarMedicationOrdersWidget-767F65K6.cjs → MarMedicationOrdersWidget-QSMTNWR3.cjs} +7 -7
- package/dist/{MarMedicationOrdersWidget-767F65K6.cjs.map → MarMedicationOrdersWidget-QSMTNWR3.cjs.map} +1 -1
- package/dist/{MarMedicationOrdersWidget-LG3WOXN7.mjs → MarMedicationOrdersWidget-XW2YFTTH.mjs} +4 -4
- package/dist/{MarMedicationOrdersWidget-LG3WOXN7.mjs.map → MarMedicationOrdersWidget-XW2YFTTH.mjs.map} +1 -1
- package/dist/{OBGExaminationWidget-MRTGWLXJ.cjs → OBGExaminationWidget-5THYKJI5.cjs} +11 -11
- package/dist/{OBGExaminationWidget-MRTGWLXJ.cjs.map → OBGExaminationWidget-5THYKJI5.cjs.map} +1 -1
- package/dist/{OBGExaminationWidget-HQKTHSOZ.mjs → OBGExaminationWidget-Y2BVJB33.mjs} +4 -4
- package/dist/{OBGExaminationWidget-HQKTHSOZ.mjs.map → OBGExaminationWidget-Y2BVJB33.mjs.map} +1 -1
- package/dist/{OBGPathwayWidget-QJNWUIEM.mjs → OBGPathwayWidget-ALGYLNKZ.mjs} +5 -5
- package/dist/{OBGPathwayWidget-QJNWUIEM.mjs.map → OBGPathwayWidget-ALGYLNKZ.mjs.map} +1 -1
- package/dist/{OBGPathwayWidget-YRU36UL7.cjs → OBGPathwayWidget-FHBZPBPH.cjs} +9 -9
- package/dist/{OBGPathwayWidget-YRU36UL7.cjs.map → OBGPathwayWidget-FHBZPBPH.cjs.map} +1 -1
- package/dist/{ObstetricHistoryWidget-EW6JLNQ7.mjs → ObstetricHistoryWidget-5GDUCYS3.mjs} +4 -4
- package/dist/{ObstetricHistoryWidget-EW6JLNQ7.mjs.map → ObstetricHistoryWidget-5GDUCYS3.mjs.map} +1 -1
- package/dist/{ObstetricHistoryWidget-OOWCVFRB.cjs → ObstetricHistoryWidget-XGZM2HL4.cjs} +7 -7
- package/dist/{ObstetricHistoryWidget-OOWCVFRB.cjs.map → ObstetricHistoryWidget-XGZM2HL4.cjs.map} +1 -1
- package/dist/{OphthalDiagnosisWidget-UXXYGKD5.cjs → OphthalDiagnosisWidget-7WY633CI.cjs} +4 -4
- package/dist/{OphthalDiagnosisWidget-UXXYGKD5.cjs.map → OphthalDiagnosisWidget-7WY633CI.cjs.map} +1 -1
- package/dist/{OphthalDiagnosisWidget-MZYBQTFV.mjs → OphthalDiagnosisWidget-YHEDHIX5.mjs} +3 -3
- package/dist/{OphthalDiagnosisWidget-MZYBQTFV.mjs.map → OphthalDiagnosisWidget-YHEDHIX5.mjs.map} +1 -1
- package/dist/{OphthalmologyWidget-27ZN2E3F.mjs → OphthalmologyWidget-6RWGZHLU.mjs} +3 -3
- package/dist/{OphthalmologyWidget-27ZN2E3F.mjs.map → OphthalmologyWidget-6RWGZHLU.mjs.map} +1 -1
- package/dist/{OphthalmologyWidget-WFSFIHT4.cjs → OphthalmologyWidget-VLW4CM2Q.cjs} +4 -4
- package/dist/{OphthalmologyWidget-WFSFIHT4.cjs.map → OphthalmologyWidget-VLW4CM2Q.cjs.map} +1 -1
- package/dist/{OrthopedicExamWidget-ULZTDFXJ.cjs → OrthopedicExamWidget-4ZNOVW54.cjs} +6 -6
- package/dist/{OrthopedicExamWidget-ULZTDFXJ.cjs.map → OrthopedicExamWidget-4ZNOVW54.cjs.map} +1 -1
- package/dist/{OrthopedicExamWidget-WM55M3Y4.mjs → OrthopedicExamWidget-CWEH3ZY7.mjs} +4 -4
- package/dist/{OrthopedicExamWidget-WM55M3Y4.mjs.map → OrthopedicExamWidget-CWEH3ZY7.mjs.map} +1 -1
- package/dist/{PainScaleFlagsWidget-IFA3RCEL.cjs → PainScaleFlagsWidget-EYYQBSYL.cjs} +8 -8
- package/dist/{PainScaleFlagsWidget-IFA3RCEL.cjs.map → PainScaleFlagsWidget-EYYQBSYL.cjs.map} +1 -1
- package/dist/{PainScaleFlagsWidget-5KN7T4JK.mjs → PainScaleFlagsWidget-XC73ND7X.mjs} +4 -4
- package/dist/{PainScaleFlagsWidget-5KN7T4JK.mjs.map → PainScaleFlagsWidget-XC73ND7X.mjs.map} +1 -1
- package/dist/{PregnancyStatusWidget-U2BEJGBJ.mjs → PregnancyStatusWidget-U6Y3DCDB.mjs} +3 -3
- package/dist/{PregnancyStatusWidget-U2BEJGBJ.mjs.map → PregnancyStatusWidget-U6Y3DCDB.mjs.map} +1 -1
- package/dist/{PregnancyStatusWidget-QTTVFBOE.cjs → PregnancyStatusWidget-YZRYO2WA.cjs} +4 -4
- package/dist/{PregnancyStatusWidget-QTTVFBOE.cjs.map → PregnancyStatusWidget-YZRYO2WA.cjs.map} +1 -1
- package/dist/{ReferralWidget-GU3JYED2.mjs → ReferralWidget-FXJC56AF.mjs} +4 -4
- package/dist/{ReferralWidget-GU3JYED2.mjs.map → ReferralWidget-FXJC56AF.mjs.map} +1 -1
- package/dist/{ReferralWidget-27VGZCOQ.cjs → ReferralWidget-KD36EA74.cjs} +7 -7
- package/dist/{ReferralWidget-27VGZCOQ.cjs.map → ReferralWidget-KD36EA74.cjs.map} +1 -1
- package/dist/RichTextWidget-JG4Y7X66.mjs +11 -0
- package/dist/{RichTextWidget-2KLV65QP.cjs.map → RichTextWidget-JG4Y7X66.mjs.map} +1 -1
- package/dist/{RichTextWidget-2KLV65QP.cjs → RichTextWidget-KKC3P5Z3.cjs} +7 -7
- package/dist/{RichTextWidget-ZBX554ZJ.mjs.map → RichTextWidget-KKC3P5Z3.cjs.map} +1 -1
- package/dist/SmartTextarea-DSM5TP5N.cjs +19 -0
- package/dist/{SmartTextarea-LQDXFCYT.mjs.map → SmartTextarea-DSM5TP5N.cjs.map} +1 -1
- package/dist/SmartTextarea-HDRABZIN.mjs +10 -0
- package/dist/{SmartTextarea-WITNRNDU.cjs.map → SmartTextarea-HDRABZIN.mjs.map} +1 -1
- package/dist/{SuggestionTextareaWidget-UNL3FZRI.mjs → SuggestionTextareaWidget-IKL46SCV.mjs} +7 -7
- package/dist/{SuggestionTextareaWidget-UNL3FZRI.mjs.map → SuggestionTextareaWidget-IKL46SCV.mjs.map} +1 -1
- package/dist/{SuggestionTextareaWidget-FWRZ46MV.cjs → SuggestionTextareaWidget-KABKRNP3.cjs} +18 -18
- package/dist/{SuggestionTextareaWidget-FWRZ46MV.cjs.map → SuggestionTextareaWidget-KABKRNP3.cjs.map} +1 -1
- package/dist/{SurgicalRiskFlagsWidget-OJKCZIWJ.cjs → SurgicalRiskFlagsWidget-DO66VPQC.cjs} +6 -6
- package/dist/{SurgicalRiskFlagsWidget-OJKCZIWJ.cjs.map → SurgicalRiskFlagsWidget-DO66VPQC.cjs.map} +1 -1
- package/dist/{SurgicalRiskFlagsWidget-ZTQJ6CDF.mjs → SurgicalRiskFlagsWidget-NPOHFMIZ.mjs} +4 -4
- package/dist/{SurgicalRiskFlagsWidget-ZTQJ6CDF.mjs.map → SurgicalRiskFlagsWidget-NPOHFMIZ.mjs.map} +1 -1
- package/dist/{TreatmentPlanWidget-665HLKYV.mjs → TreatmentPlanWidget-7XYIVHQO.mjs} +4 -4
- package/dist/{TreatmentPlanWidget-665HLKYV.mjs.map → TreatmentPlanWidget-7XYIVHQO.mjs.map} +1 -1
- package/dist/{TreatmentPlanWidget-TATWSPLY.cjs → TreatmentPlanWidget-ELTSULQ4.cjs} +6 -6
- package/dist/{TreatmentPlanWidget-TATWSPLY.cjs.map → TreatmentPlanWidget-ELTSULQ4.cjs.map} +1 -1
- package/dist/{UrologyExaminationWidget-GRBL2SDG.mjs → UrologyExaminationWidget-OQLZPWVR.mjs} +4 -4
- package/dist/{UrologyExaminationWidget-GRBL2SDG.mjs.map → UrologyExaminationWidget-OQLZPWVR.mjs.map} +1 -1
- package/dist/{UrologyExaminationWidget-GQLMV4FB.cjs → UrologyExaminationWidget-OSNFGBI2.cjs} +12 -12
- package/dist/{UrologyExaminationWidget-GQLMV4FB.cjs.map → UrologyExaminationWidget-OSNFGBI2.cjs.map} +1 -1
- package/dist/{UrologyPathwayWidget-PEO5BVQX.mjs → UrologyPathwayWidget-KE2LAZTZ.mjs} +4 -4
- package/dist/{UrologyPathwayWidget-PEO5BVQX.mjs.map → UrologyPathwayWidget-KE2LAZTZ.mjs.map} +1 -1
- package/dist/{UrologyPathwayWidget-D6EWSOGW.cjs → UrologyPathwayWidget-YPYIX43Z.cjs} +7 -7
- package/dist/{UrologyPathwayWidget-D6EWSOGW.cjs.map → UrologyPathwayWidget-YPYIX43Z.cjs.map} +1 -1
- package/dist/{UrologySmartHistoryWidget-BDKRFBYN.mjs → UrologySmartHistoryWidget-ET6CU36D.mjs} +4 -4
- package/dist/{UrologySmartHistoryWidget-BDKRFBYN.mjs.map → UrologySmartHistoryWidget-ET6CU36D.mjs.map} +1 -1
- package/dist/{UrologySmartHistoryWidget-P3KTQE7L.cjs → UrologySmartHistoryWidget-SLBJALMO.cjs} +15 -15
- package/dist/{UrologySmartHistoryWidget-P3KTQE7L.cjs.map → UrologySmartHistoryWidget-SLBJALMO.cjs.map} +1 -1
- package/dist/{VitalsWidget-MS3OOZSW.cjs → VitalsWidget-MGUUJZP4.cjs} +5 -5
- package/dist/{VitalsWidget-MS3OOZSW.cjs.map → VitalsWidget-MGUUJZP4.cjs.map} +1 -1
- package/dist/{VitalsWidget-63HTXK2M.mjs → VitalsWidget-YI3IXQYN.mjs} +3 -3
- package/dist/{VitalsWidget-63HTXK2M.mjs.map → VitalsWidget-YI3IXQYN.mjs.map} +1 -1
- package/dist/{chunk-5RT3S67O.cjs → chunk-35I4CBEC.cjs} +6 -6
- package/dist/{chunk-5RT3S67O.cjs.map → chunk-35I4CBEC.cjs.map} +1 -1
- package/dist/{chunk-XDUVO3IZ.mjs → chunk-4422KT6O.mjs} +61 -6
- package/dist/chunk-4422KT6O.mjs.map +1 -0
- package/dist/{chunk-BBD3Y37O.cjs → chunk-4KTQ4NEI.cjs} +4 -4
- package/dist/{chunk-BBD3Y37O.cjs.map → chunk-4KTQ4NEI.cjs.map} +1 -1
- package/dist/{chunk-MBZRRYJB.mjs → chunk-7ZRK7ZWY.mjs} +4 -4
- package/dist/{chunk-MBZRRYJB.mjs.map → chunk-7ZRK7ZWY.mjs.map} +1 -1
- package/dist/{chunk-AIZ3XYEZ.cjs → chunk-A2A5EB5R.cjs} +60 -5
- package/dist/chunk-A2A5EB5R.cjs.map +1 -0
- package/dist/{chunk-T3UHPMFX.mjs → chunk-BKZXISZH.mjs} +3 -3
- package/dist/{chunk-T3UHPMFX.mjs.map → chunk-BKZXISZH.mjs.map} +1 -1
- package/dist/{chunk-G6Y4UJPN.mjs → chunk-CC54SKAA.mjs} +5 -5
- package/dist/{chunk-G6Y4UJPN.mjs.map → chunk-CC54SKAA.mjs.map} +1 -1
- package/dist/{chunk-Q66LXMRR.mjs → chunk-FAAMKLBY.mjs} +3 -3
- package/dist/{chunk-Q66LXMRR.mjs.map → chunk-FAAMKLBY.mjs.map} +1 -1
- package/dist/{chunk-TCQQUJCL.cjs → chunk-GQX2UGHH.cjs} +11 -11
- package/dist/{chunk-TCQQUJCL.cjs.map → chunk-GQX2UGHH.cjs.map} +1 -1
- package/dist/{chunk-2BGJZ44Q.mjs → chunk-HKEUAERY.mjs} +9 -4
- package/dist/{chunk-TB33A4PD.cjs.map → chunk-HKEUAERY.mjs.map} +1 -1
- package/dist/{chunk-T2IKWRV2.cjs → chunk-JFZ7XPDM.cjs} +9 -9
- package/dist/{chunk-T2IKWRV2.cjs.map → chunk-JFZ7XPDM.cjs.map} +1 -1
- package/dist/{chunk-TB33A4PD.cjs → chunk-JVIU4OBK.cjs} +9 -3
- package/dist/chunk-JVIU4OBK.cjs.map +1 -0
- package/dist/{chunk-XIUXYHGG.cjs → chunk-L2H5SOAV.cjs} +5 -5
- package/dist/{chunk-XIUXYHGG.cjs.map → chunk-L2H5SOAV.cjs.map} +1 -1
- package/dist/{chunk-XLCTFYFD.mjs → chunk-PNRSJPGV.mjs} +5 -5
- package/dist/{chunk-XLCTFYFD.mjs.map → chunk-PNRSJPGV.mjs.map} +1 -1
- package/dist/{chunk-X4AJCTON.cjs → chunk-PVKHVVFS.cjs} +4 -4
- package/dist/{chunk-X4AJCTON.cjs.map → chunk-PVKHVVFS.cjs.map} +1 -1
- package/dist/{chunk-Q3K646K4.mjs → chunk-QM6UMI2M.mjs} +3 -3
- package/dist/{chunk-Q3K646K4.mjs.map → chunk-QM6UMI2M.mjs.map} +1 -1
- package/dist/{chunk-MQHZ7HD2.mjs → chunk-QQXBHDUF.mjs} +3 -3
- package/dist/{chunk-MQHZ7HD2.mjs.map → chunk-QQXBHDUF.mjs.map} +1 -1
- package/dist/{chunk-UKSP3B3W.mjs → chunk-VAJR2VBK.mjs} +3 -3
- package/dist/{chunk-UKSP3B3W.mjs.map → chunk-VAJR2VBK.mjs.map} +1 -1
- package/dist/{chunk-RZK44P3C.cjs → chunk-WM43XTEK.cjs} +7 -7
- package/dist/{chunk-RZK44P3C.cjs.map → chunk-WM43XTEK.cjs.map} +1 -1
- package/dist/{chunk-7DISRJAB.cjs → chunk-XGO2HG3N.cjs} +4 -4
- package/dist/{chunk-7DISRJAB.cjs.map → chunk-XGO2HG3N.cjs.map} +1 -1
- package/dist/index.cjs +136 -134
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -4
- package/dist/index.d.ts +9 -4
- package/dist/index.mjs +54 -56
- package/dist/index.mjs.map +1 -1
- package/dist/read-only-table.d.cts +1 -1
- package/dist/read-only-table.d.ts +1 -1
- package/dist/rich-text.cjs +5 -5
- package/dist/rich-text.mjs +4 -4
- package/dist/smart.cjs +5 -5
- package/dist/smart.d.cts +1 -1
- package/dist/smart.d.ts +1 -1
- package/dist/smart.mjs +3 -3
- package/dist/{types-BbOnd5IN.d.cts → types-27f9S27N.d.cts} +13 -1
- package/dist/{types-BbOnd5IN.d.ts → types-27f9S27N.d.ts} +13 -1
- package/package.json +1 -1
- package/dist/AddMedicationWidget-45T4XVEL.cjs +0 -32
- package/dist/AddMedicationWidget-45T4XVEL.cjs.map +0 -1
- package/dist/AddMedicationWidget-B5RXRYBK.mjs.map +0 -1
- package/dist/BpeChartWidget-HATASHAC.mjs +0 -7
- package/dist/BpeChartWidget-VZRH7M7L.cjs +0 -28
- package/dist/DentalChartWidget-LYLOFWZU.cjs +0 -21
- package/dist/RichTextWidget-ZBX554ZJ.mjs +0 -11
- package/dist/SmartTextarea-LQDXFCYT.mjs +0 -10
- package/dist/SmartTextarea-WITNRNDU.cjs +0 -19
- package/dist/chunk-2BGJZ44Q.mjs.map +0 -1
- package/dist/chunk-AIZ3XYEZ.cjs.map +0 -1
- package/dist/chunk-XDUVO3IZ.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/shadcn/spinner.tsx","../src/ui/widgets/Vitals.tsx","../src/ui/widgets/VitalsWidget.tsx"],"names":["React","jsx","cn","jsxs","RefreshCw","useField","useFieldHandlers","useState","useCallback","useEffect"],"mappings":"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","file":"VitalsWidget-MS3OOZSW.cjs","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../core/utils\";\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-6 w-6 border-2\",\n lg: \"h-8 w-8 border-3\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"animate-spin rounded-full border-primary border-t-transparent\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n }\n);\nSpinner.displayName = \"Spinner\";\n\nexport { Spinner };\n","import React from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Spinner } from '../shadcn/spinner';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type VitalsData = {\n temperature?: number | null;\n height?: number | null;\n weight?: number | null;\n bmi?: number | null;\n blood_sugar?: number | null;\n notes?: string | null;\n circumference_of_head_in_cms?: number | null;\n circumference_of_waist_in_cms?: number | null;\n blood_pressure_systolic?: number | null;\n blood_pressure_diastolic?: number | null;\n heart_rate?: number | null;\n respiratory_rate?: number | null;\n oxygen_saturation?: number | null;\n recorded_at?: string | null;\n};\n\nexport type VitalsProps = {\n label?: string;\n data: VitalsData | null;\n loading?: boolean;\n error?: string | null;\n onRefresh?: () => void;\n className?: string;\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\ntype VitalItem = { label: string; value: string };\n\nfunction buildItems(data: VitalsData): VitalItem[] {\n const items: VitalItem[] = [];\n\n const hasBP =\n data.blood_pressure_systolic != null || data.blood_pressure_diastolic != null;\n if (hasBP) {\n const sys = data.blood_pressure_systolic ?? '–';\n const dia = data.blood_pressure_diastolic ?? '–';\n items.push({ label: 'BP', value: `${sys}/${dia}` });\n }\n\n if (data.heart_rate != null)\n items.push({ label: 'Heart Rate', value: `${data.heart_rate} bpm` });\n\n if (data.respiratory_rate != null)\n items.push({ label: 'Resp. Rate', value: `${data.respiratory_rate}/min` });\n\n if (data.oxygen_saturation != null)\n items.push({ label: 'SpO\\u2082', value: `${data.oxygen_saturation}%` });\n\n if (data.temperature != null)\n items.push({ label: 'Temp', value: `${data.temperature} \\u00b0F` });\n\n if (data.height != null)\n items.push({ label: 'Height', value: `${data.height} cm` });\n\n if (data.weight != null)\n items.push({ label: 'Weight', value: `${data.weight} kg` });\n\n if (data.bmi != null)\n items.push({ label: 'BMI', value: `${data.bmi}` });\n\n if (data.blood_sugar != null)\n items.push({ label: 'Blood Sugar', value: `${data.blood_sugar} mg/dL` });\n\n if (data.circumference_of_head_in_cms != null)\n items.push({ label: 'Head Circ.', value: `${data.circumference_of_head_in_cms} cm` });\n\n if (data.circumference_of_waist_in_cms != null)\n items.push({ label: 'Waist Circ.', value: `${data.circumference_of_waist_in_cms} cm` });\n\n return items;\n}\n\nfunction formatRecordedAt(iso: string | null | undefined): string {\n if (!iso) return '';\n try {\n return new Date(iso).toLocaleString(undefined, {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return iso;\n }\n}\n\n// ─── Vital chip ───────────────────────────────────────────────────────────────\n\nfunction VitalChip({ label, value }: VitalItem) {\n return (\n <div className=\"flex flex-col gap-0 rounded-md min-w-fit px-1.5\">\n <span className=\"text-[10px] font-sm text-gray-500 uppercase tracking-wide leading-none\">\n {label}\n </span>\n <span className=\"text-xs text-gray-900 leading-tight\">{value}</span>\n </div>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const Vitals: React.FC<VitalsProps> = ({\n data,\n loading = false,\n error = null,\n onRefresh,\n className,\n}) => {\n const items = data ? buildItems(data) : [];\n const hasItems = items.length > 0;\n const recordedAt = data?.recorded_at ? formatRecordedAt(data.recorded_at) : null;\n const notes = data?.notes?.trim() || null;\n\n return (\n <div\n className={cn(\n 'rounded-md overflow-hidden border border-[#D0D0D0] bg-white px-2 py-2',\n className\n )}\n >\n {loading && !hasItems ? (\n <div className=\"flex items-center gap-1.5 py-1\">\n <Spinner size=\"sm\" />\n <span className=\"text-xs text-muted-foreground\">Loading vitals…</span>\n </div>\n ) : error ? (\n <p className=\"text-xs text-red-500 py-1\">{error}</p>\n ) : hasItems ? (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-center justify-between gap-x-3 gap-y-1\">\n <div className=\"flex flex-wrap gap-x-2 gap-y-0.5\">\n {items.map(item => (\n <VitalChip key={item.label} {...item} />\n ))}\n </div>\n <div className=\"flex flex-col items-end gap-0.5 shrink-0\">\n {recordedAt && (\n <span className=\"text-[10px] text-slate-500\">{recordedAt}</span>\n )}\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n disabled={loading}\n className={cn(\n 'flex items-center gap-0.5 text-[10px] font-medium text-slate-600',\n 'hover:text-slate-900 transition-colors disabled:opacity-50 cursor-pointer'\n )}\n aria-label=\"Refresh vitals\"\n >\n <RefreshCw className={cn('h-2.5 w-2.5', loading && 'animate-spin')} />\n <span>Refresh</span>\n </button>\n )}\n </div>\n </div>\n {notes && (\n <p className=\"text-xs text-gray-600 pt-1.5 mt-0.5\">\n {notes}\n </p>\n )}\n </div>\n ) : (\n <div className=\"flex items-center justify-between gap-2 py-1\">\n <p className=\"text-xs text-muted-foreground\">No vitals recorded.</p>\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n disabled={loading}\n className={cn(\n 'flex items-center gap-0.5 text-[10px] font-medium text-slate-600',\n 'hover:text-slate-900 transition-colors disabled:opacity-50 shrink-0'\n )}\n aria-label=\"Refresh vitals\"\n >\n <RefreshCw className={cn('h-2.5 w-2.5', loading && 'animate-spin')} />\n <span>Refresh</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { Vitals, type VitalsData } from './Vitals';\n\nexport const VitalsWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue, fieldDef } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n console.log('[VitalsWidget] fieldId:', fieldId, '| onFetch present:', !!handlers.onFetch, '| value:', value);\n\n const fetchVitals = useCallback(async () => {\n if (!handlers.onFetch) return;\n setLoading(true);\n setError(null);\n try {\n const data = await handlers.onFetch();\n console.log('[VitalsWidget] fetched data:', data);\n setValue(data);\n } catch {\n setError('Failed to load vitals. Please try again.');\n } finally {\n setLoading(false);\n }\n }, [handlers, setValue]);\n\n // Fetch once on mount if a handler is provided\n useEffect(() => {\n fetchVitals();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <Vitals\n label={fieldDef?.label ?? 'Vitals'}\n data={(value as VitalsData | null) ?? null}\n loading={loading}\n error={error}\n onRefresh={handlers.onFetch ? fetchVitals : undefined}\n />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/shadcn/spinner.tsx","../src/ui/widgets/Vitals.tsx","../src/ui/widgets/VitalsWidget.tsx"],"names":["React","jsx","cn","jsxs","RefreshCw","useField","useFieldHandlers","useState","useCallback","useEffect"],"mappings":"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","file":"VitalsWidget-MGUUJZP4.cjs","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../core/utils\";\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-6 w-6 border-2\",\n lg: \"h-8 w-8 border-3\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"animate-spin rounded-full border-primary border-t-transparent\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n }\n);\nSpinner.displayName = \"Spinner\";\n\nexport { Spinner };\n","import React from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Spinner } from '../shadcn/spinner';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type VitalsData = {\n temperature?: number | null;\n height?: number | null;\n weight?: number | null;\n bmi?: number | null;\n blood_sugar?: number | null;\n notes?: string | null;\n circumference_of_head_in_cms?: number | null;\n circumference_of_waist_in_cms?: number | null;\n blood_pressure_systolic?: number | null;\n blood_pressure_diastolic?: number | null;\n heart_rate?: number | null;\n respiratory_rate?: number | null;\n oxygen_saturation?: number | null;\n recorded_at?: string | null;\n};\n\nexport type VitalsProps = {\n label?: string;\n data: VitalsData | null;\n loading?: boolean;\n error?: string | null;\n onRefresh?: () => void;\n className?: string;\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\ntype VitalItem = { label: string; value: string };\n\nfunction buildItems(data: VitalsData): VitalItem[] {\n const items: VitalItem[] = [];\n\n const hasBP =\n data.blood_pressure_systolic != null || data.blood_pressure_diastolic != null;\n if (hasBP) {\n const sys = data.blood_pressure_systolic ?? '–';\n const dia = data.blood_pressure_diastolic ?? '–';\n items.push({ label: 'BP', value: `${sys}/${dia}` });\n }\n\n if (data.heart_rate != null)\n items.push({ label: 'Heart Rate', value: `${data.heart_rate} bpm` });\n\n if (data.respiratory_rate != null)\n items.push({ label: 'Resp. Rate', value: `${data.respiratory_rate}/min` });\n\n if (data.oxygen_saturation != null)\n items.push({ label: 'SpO\\u2082', value: `${data.oxygen_saturation}%` });\n\n if (data.temperature != null)\n items.push({ label: 'Temp', value: `${data.temperature} \\u00b0F` });\n\n if (data.height != null)\n items.push({ label: 'Height', value: `${data.height} cm` });\n\n if (data.weight != null)\n items.push({ label: 'Weight', value: `${data.weight} kg` });\n\n if (data.bmi != null)\n items.push({ label: 'BMI', value: `${data.bmi}` });\n\n if (data.blood_sugar != null)\n items.push({ label: 'Blood Sugar', value: `${data.blood_sugar} mg/dL` });\n\n if (data.circumference_of_head_in_cms != null)\n items.push({ label: 'Head Circ.', value: `${data.circumference_of_head_in_cms} cm` });\n\n if (data.circumference_of_waist_in_cms != null)\n items.push({ label: 'Waist Circ.', value: `${data.circumference_of_waist_in_cms} cm` });\n\n return items;\n}\n\nfunction formatRecordedAt(iso: string | null | undefined): string {\n if (!iso) return '';\n try {\n return new Date(iso).toLocaleString(undefined, {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return iso;\n }\n}\n\n// ─── Vital chip ───────────────────────────────────────────────────────────────\n\nfunction VitalChip({ label, value }: VitalItem) {\n return (\n <div className=\"flex flex-col gap-0 rounded-md min-w-fit px-1.5\">\n <span className=\"text-[10px] font-sm text-gray-500 uppercase tracking-wide leading-none\">\n {label}\n </span>\n <span className=\"text-xs text-gray-900 leading-tight\">{value}</span>\n </div>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const Vitals: React.FC<VitalsProps> = ({\n data,\n loading = false,\n error = null,\n onRefresh,\n className,\n}) => {\n const items = data ? buildItems(data) : [];\n const hasItems = items.length > 0;\n const recordedAt = data?.recorded_at ? formatRecordedAt(data.recorded_at) : null;\n const notes = data?.notes?.trim() || null;\n\n return (\n <div\n className={cn(\n 'rounded-md overflow-hidden border border-[#D0D0D0] bg-white px-2 py-2',\n className\n )}\n >\n {loading && !hasItems ? (\n <div className=\"flex items-center gap-1.5 py-1\">\n <Spinner size=\"sm\" />\n <span className=\"text-xs text-muted-foreground\">Loading vitals…</span>\n </div>\n ) : error ? (\n <p className=\"text-xs text-red-500 py-1\">{error}</p>\n ) : hasItems ? (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-center justify-between gap-x-3 gap-y-1\">\n <div className=\"flex flex-wrap gap-x-2 gap-y-0.5\">\n {items.map(item => (\n <VitalChip key={item.label} {...item} />\n ))}\n </div>\n <div className=\"flex flex-col items-end gap-0.5 shrink-0\">\n {recordedAt && (\n <span className=\"text-[10px] text-slate-500\">{recordedAt}</span>\n )}\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n disabled={loading}\n className={cn(\n 'flex items-center gap-0.5 text-[10px] font-medium text-slate-600',\n 'hover:text-slate-900 transition-colors disabled:opacity-50 cursor-pointer'\n )}\n aria-label=\"Refresh vitals\"\n >\n <RefreshCw className={cn('h-2.5 w-2.5', loading && 'animate-spin')} />\n <span>Refresh</span>\n </button>\n )}\n </div>\n </div>\n {notes && (\n <p className=\"text-xs text-gray-600 pt-1.5 mt-0.5\">\n {notes}\n </p>\n )}\n </div>\n ) : (\n <div className=\"flex items-center justify-between gap-2 py-1\">\n <p className=\"text-xs text-muted-foreground\">No vitals recorded.</p>\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n disabled={loading}\n className={cn(\n 'flex items-center gap-0.5 text-[10px] font-medium text-slate-600',\n 'hover:text-slate-900 transition-colors disabled:opacity-50 shrink-0'\n )}\n aria-label=\"Refresh vitals\"\n >\n <RefreshCw className={cn('h-2.5 w-2.5', loading && 'animate-spin')} />\n <span>Refresh</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { Vitals, type VitalsData } from './Vitals';\n\nexport const VitalsWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue, fieldDef } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n console.log('[VitalsWidget] fieldId:', fieldId, '| onFetch present:', !!handlers.onFetch, '| value:', value);\n\n const fetchVitals = useCallback(async () => {\n if (!handlers.onFetch) return;\n setLoading(true);\n setError(null);\n try {\n const data = await handlers.onFetch();\n console.log('[VitalsWidget] fetched data:', data);\n setValue(data);\n } catch {\n setError('Failed to load vitals. Please try again.');\n } finally {\n setLoading(false);\n }\n }, [handlers, setValue]);\n\n // Fetch once on mount if a handler is provided\n useEffect(() => {\n fetchVitals();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <Vitals\n label={fieldDef?.label ?? 'Vitals'}\n data={(value as VitalsData | null) ?? null}\n loading={loading}\n error={error}\n onRefresh={handlers.onFetch ? fetchVitals : undefined}\n />\n );\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useField, useFieldHandlers } from './chunk-
|
|
1
|
+
import { useField, useFieldHandlers } from './chunk-HKEUAERY.mjs';
|
|
2
2
|
import { cn } from './chunk-VPU66PI6.mjs';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { useState, useCallback, useEffect } from 'react';
|
|
@@ -183,5 +183,5 @@ var VitalsWidget = ({ fieldId }) => {
|
|
|
183
183
|
};
|
|
184
184
|
|
|
185
185
|
export { VitalsWidget };
|
|
186
|
-
//# sourceMappingURL=VitalsWidget-
|
|
187
|
-
//# sourceMappingURL=VitalsWidget-
|
|
186
|
+
//# sourceMappingURL=VitalsWidget-YI3IXQYN.mjs.map
|
|
187
|
+
//# sourceMappingURL=VitalsWidget-YI3IXQYN.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/shadcn/spinner.tsx","../src/ui/widgets/Vitals.tsx","../src/ui/widgets/VitalsWidget.tsx"],"names":["jsx"],"mappings":"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","file":"VitalsWidget-63HTXK2M.mjs","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../core/utils\";\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-6 w-6 border-2\",\n lg: \"h-8 w-8 border-3\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"animate-spin rounded-full border-primary border-t-transparent\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n }\n);\nSpinner.displayName = \"Spinner\";\n\nexport { Spinner };\n","import React from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Spinner } from '../shadcn/spinner';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type VitalsData = {\n temperature?: number | null;\n height?: number | null;\n weight?: number | null;\n bmi?: number | null;\n blood_sugar?: number | null;\n notes?: string | null;\n circumference_of_head_in_cms?: number | null;\n circumference_of_waist_in_cms?: number | null;\n blood_pressure_systolic?: number | null;\n blood_pressure_diastolic?: number | null;\n heart_rate?: number | null;\n respiratory_rate?: number | null;\n oxygen_saturation?: number | null;\n recorded_at?: string | null;\n};\n\nexport type VitalsProps = {\n label?: string;\n data: VitalsData | null;\n loading?: boolean;\n error?: string | null;\n onRefresh?: () => void;\n className?: string;\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\ntype VitalItem = { label: string; value: string };\n\nfunction buildItems(data: VitalsData): VitalItem[] {\n const items: VitalItem[] = [];\n\n const hasBP =\n data.blood_pressure_systolic != null || data.blood_pressure_diastolic != null;\n if (hasBP) {\n const sys = data.blood_pressure_systolic ?? '–';\n const dia = data.blood_pressure_diastolic ?? '–';\n items.push({ label: 'BP', value: `${sys}/${dia}` });\n }\n\n if (data.heart_rate != null)\n items.push({ label: 'Heart Rate', value: `${data.heart_rate} bpm` });\n\n if (data.respiratory_rate != null)\n items.push({ label: 'Resp. Rate', value: `${data.respiratory_rate}/min` });\n\n if (data.oxygen_saturation != null)\n items.push({ label: 'SpO\\u2082', value: `${data.oxygen_saturation}%` });\n\n if (data.temperature != null)\n items.push({ label: 'Temp', value: `${data.temperature} \\u00b0F` });\n\n if (data.height != null)\n items.push({ label: 'Height', value: `${data.height} cm` });\n\n if (data.weight != null)\n items.push({ label: 'Weight', value: `${data.weight} kg` });\n\n if (data.bmi != null)\n items.push({ label: 'BMI', value: `${data.bmi}` });\n\n if (data.blood_sugar != null)\n items.push({ label: 'Blood Sugar', value: `${data.blood_sugar} mg/dL` });\n\n if (data.circumference_of_head_in_cms != null)\n items.push({ label: 'Head Circ.', value: `${data.circumference_of_head_in_cms} cm` });\n\n if (data.circumference_of_waist_in_cms != null)\n items.push({ label: 'Waist Circ.', value: `${data.circumference_of_waist_in_cms} cm` });\n\n return items;\n}\n\nfunction formatRecordedAt(iso: string | null | undefined): string {\n if (!iso) return '';\n try {\n return new Date(iso).toLocaleString(undefined, {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return iso;\n }\n}\n\n// ─── Vital chip ───────────────────────────────────────────────────────────────\n\nfunction VitalChip({ label, value }: VitalItem) {\n return (\n <div className=\"flex flex-col gap-0 rounded-md min-w-fit px-1.5\">\n <span className=\"text-[10px] font-sm text-gray-500 uppercase tracking-wide leading-none\">\n {label}\n </span>\n <span className=\"text-xs text-gray-900 leading-tight\">{value}</span>\n </div>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const Vitals: React.FC<VitalsProps> = ({\n data,\n loading = false,\n error = null,\n onRefresh,\n className,\n}) => {\n const items = data ? buildItems(data) : [];\n const hasItems = items.length > 0;\n const recordedAt = data?.recorded_at ? formatRecordedAt(data.recorded_at) : null;\n const notes = data?.notes?.trim() || null;\n\n return (\n <div\n className={cn(\n 'rounded-md overflow-hidden border border-[#D0D0D0] bg-white px-2 py-2',\n className\n )}\n >\n {loading && !hasItems ? (\n <div className=\"flex items-center gap-1.5 py-1\">\n <Spinner size=\"sm\" />\n <span className=\"text-xs text-muted-foreground\">Loading vitals…</span>\n </div>\n ) : error ? (\n <p className=\"text-xs text-red-500 py-1\">{error}</p>\n ) : hasItems ? (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-center justify-between gap-x-3 gap-y-1\">\n <div className=\"flex flex-wrap gap-x-2 gap-y-0.5\">\n {items.map(item => (\n <VitalChip key={item.label} {...item} />\n ))}\n </div>\n <div className=\"flex flex-col items-end gap-0.5 shrink-0\">\n {recordedAt && (\n <span className=\"text-[10px] text-slate-500\">{recordedAt}</span>\n )}\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n disabled={loading}\n className={cn(\n 'flex items-center gap-0.5 text-[10px] font-medium text-slate-600',\n 'hover:text-slate-900 transition-colors disabled:opacity-50 cursor-pointer'\n )}\n aria-label=\"Refresh vitals\"\n >\n <RefreshCw className={cn('h-2.5 w-2.5', loading && 'animate-spin')} />\n <span>Refresh</span>\n </button>\n )}\n </div>\n </div>\n {notes && (\n <p className=\"text-xs text-gray-600 pt-1.5 mt-0.5\">\n {notes}\n </p>\n )}\n </div>\n ) : (\n <div className=\"flex items-center justify-between gap-2 py-1\">\n <p className=\"text-xs text-muted-foreground\">No vitals recorded.</p>\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n disabled={loading}\n className={cn(\n 'flex items-center gap-0.5 text-[10px] font-medium text-slate-600',\n 'hover:text-slate-900 transition-colors disabled:opacity-50 shrink-0'\n )}\n aria-label=\"Refresh vitals\"\n >\n <RefreshCw className={cn('h-2.5 w-2.5', loading && 'animate-spin')} />\n <span>Refresh</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { Vitals, type VitalsData } from './Vitals';\n\nexport const VitalsWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue, fieldDef } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n console.log('[VitalsWidget] fieldId:', fieldId, '| onFetch present:', !!handlers.onFetch, '| value:', value);\n\n const fetchVitals = useCallback(async () => {\n if (!handlers.onFetch) return;\n setLoading(true);\n setError(null);\n try {\n const data = await handlers.onFetch();\n console.log('[VitalsWidget] fetched data:', data);\n setValue(data);\n } catch {\n setError('Failed to load vitals. Please try again.');\n } finally {\n setLoading(false);\n }\n }, [handlers, setValue]);\n\n // Fetch once on mount if a handler is provided\n useEffect(() => {\n fetchVitals();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <Vitals\n label={fieldDef?.label ?? 'Vitals'}\n data={(value as VitalsData | null) ?? null}\n loading={loading}\n error={error}\n onRefresh={handlers.onFetch ? fetchVitals : undefined}\n />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/shadcn/spinner.tsx","../src/ui/widgets/Vitals.tsx","../src/ui/widgets/VitalsWidget.tsx"],"names":["jsx"],"mappings":"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","file":"VitalsWidget-YI3IXQYN.mjs","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../core/utils\";\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-6 w-6 border-2\",\n lg: \"h-8 w-8 border-3\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"animate-spin rounded-full border-primary border-t-transparent\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n }\n);\nSpinner.displayName = \"Spinner\";\n\nexport { Spinner };\n","import React from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Spinner } from '../shadcn/spinner';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type VitalsData = {\n temperature?: number | null;\n height?: number | null;\n weight?: number | null;\n bmi?: number | null;\n blood_sugar?: number | null;\n notes?: string | null;\n circumference_of_head_in_cms?: number | null;\n circumference_of_waist_in_cms?: number | null;\n blood_pressure_systolic?: number | null;\n blood_pressure_diastolic?: number | null;\n heart_rate?: number | null;\n respiratory_rate?: number | null;\n oxygen_saturation?: number | null;\n recorded_at?: string | null;\n};\n\nexport type VitalsProps = {\n label?: string;\n data: VitalsData | null;\n loading?: boolean;\n error?: string | null;\n onRefresh?: () => void;\n className?: string;\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\ntype VitalItem = { label: string; value: string };\n\nfunction buildItems(data: VitalsData): VitalItem[] {\n const items: VitalItem[] = [];\n\n const hasBP =\n data.blood_pressure_systolic != null || data.blood_pressure_diastolic != null;\n if (hasBP) {\n const sys = data.blood_pressure_systolic ?? '–';\n const dia = data.blood_pressure_diastolic ?? '–';\n items.push({ label: 'BP', value: `${sys}/${dia}` });\n }\n\n if (data.heart_rate != null)\n items.push({ label: 'Heart Rate', value: `${data.heart_rate} bpm` });\n\n if (data.respiratory_rate != null)\n items.push({ label: 'Resp. Rate', value: `${data.respiratory_rate}/min` });\n\n if (data.oxygen_saturation != null)\n items.push({ label: 'SpO\\u2082', value: `${data.oxygen_saturation}%` });\n\n if (data.temperature != null)\n items.push({ label: 'Temp', value: `${data.temperature} \\u00b0F` });\n\n if (data.height != null)\n items.push({ label: 'Height', value: `${data.height} cm` });\n\n if (data.weight != null)\n items.push({ label: 'Weight', value: `${data.weight} kg` });\n\n if (data.bmi != null)\n items.push({ label: 'BMI', value: `${data.bmi}` });\n\n if (data.blood_sugar != null)\n items.push({ label: 'Blood Sugar', value: `${data.blood_sugar} mg/dL` });\n\n if (data.circumference_of_head_in_cms != null)\n items.push({ label: 'Head Circ.', value: `${data.circumference_of_head_in_cms} cm` });\n\n if (data.circumference_of_waist_in_cms != null)\n items.push({ label: 'Waist Circ.', value: `${data.circumference_of_waist_in_cms} cm` });\n\n return items;\n}\n\nfunction formatRecordedAt(iso: string | null | undefined): string {\n if (!iso) return '';\n try {\n return new Date(iso).toLocaleString(undefined, {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return iso;\n }\n}\n\n// ─── Vital chip ───────────────────────────────────────────────────────────────\n\nfunction VitalChip({ label, value }: VitalItem) {\n return (\n <div className=\"flex flex-col gap-0 rounded-md min-w-fit px-1.5\">\n <span className=\"text-[10px] font-sm text-gray-500 uppercase tracking-wide leading-none\">\n {label}\n </span>\n <span className=\"text-xs text-gray-900 leading-tight\">{value}</span>\n </div>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const Vitals: React.FC<VitalsProps> = ({\n data,\n loading = false,\n error = null,\n onRefresh,\n className,\n}) => {\n const items = data ? buildItems(data) : [];\n const hasItems = items.length > 0;\n const recordedAt = data?.recorded_at ? formatRecordedAt(data.recorded_at) : null;\n const notes = data?.notes?.trim() || null;\n\n return (\n <div\n className={cn(\n 'rounded-md overflow-hidden border border-[#D0D0D0] bg-white px-2 py-2',\n className\n )}\n >\n {loading && !hasItems ? (\n <div className=\"flex items-center gap-1.5 py-1\">\n <Spinner size=\"sm\" />\n <span className=\"text-xs text-muted-foreground\">Loading vitals…</span>\n </div>\n ) : error ? (\n <p className=\"text-xs text-red-500 py-1\">{error}</p>\n ) : hasItems ? (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-center justify-between gap-x-3 gap-y-1\">\n <div className=\"flex flex-wrap gap-x-2 gap-y-0.5\">\n {items.map(item => (\n <VitalChip key={item.label} {...item} />\n ))}\n </div>\n <div className=\"flex flex-col items-end gap-0.5 shrink-0\">\n {recordedAt && (\n <span className=\"text-[10px] text-slate-500\">{recordedAt}</span>\n )}\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n disabled={loading}\n className={cn(\n 'flex items-center gap-0.5 text-[10px] font-medium text-slate-600',\n 'hover:text-slate-900 transition-colors disabled:opacity-50 cursor-pointer'\n )}\n aria-label=\"Refresh vitals\"\n >\n <RefreshCw className={cn('h-2.5 w-2.5', loading && 'animate-spin')} />\n <span>Refresh</span>\n </button>\n )}\n </div>\n </div>\n {notes && (\n <p className=\"text-xs text-gray-600 pt-1.5 mt-0.5\">\n {notes}\n </p>\n )}\n </div>\n ) : (\n <div className=\"flex items-center justify-between gap-2 py-1\">\n <p className=\"text-xs text-muted-foreground\">No vitals recorded.</p>\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n disabled={loading}\n className={cn(\n 'flex items-center gap-0.5 text-[10px] font-medium text-slate-600',\n 'hover:text-slate-900 transition-colors disabled:opacity-50 shrink-0'\n )}\n aria-label=\"Refresh vitals\"\n >\n <RefreshCw className={cn('h-2.5 w-2.5', loading && 'animate-spin')} />\n <span>Refresh</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { Vitals, type VitalsData } from './Vitals';\n\nexport const VitalsWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue, fieldDef } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n console.log('[VitalsWidget] fieldId:', fieldId, '| onFetch present:', !!handlers.onFetch, '| value:', value);\n\n const fetchVitals = useCallback(async () => {\n if (!handlers.onFetch) return;\n setLoading(true);\n setError(null);\n try {\n const data = await handlers.onFetch();\n console.log('[VitalsWidget] fetched data:', data);\n setValue(data);\n } catch {\n setError('Failed to load vitals. Please try again.');\n } finally {\n setLoading(false);\n }\n }, [handlers, setValue]);\n\n // Fetch once on mount if a handler is provided\n useEffect(() => {\n fetchVitals();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <Vitals\n label={fieldDef?.label ?? 'Vitals'}\n data={(value as VitalsData | null) ?? null}\n loading={loading}\n error={error}\n onRefresh={handlers.onFetch ? fetchVitals : undefined}\n />\n );\n};\n"]}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkQKJ7BQSR_cjs = require('./chunk-QKJ7BQSR.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkJVIU4OBK_cjs = require('./chunk-JVIU4OBK.cjs');
|
|
5
5
|
|
|
6
6
|
// src/ui/widgets/_obgSymptomsSync.ts
|
|
7
7
|
var SYMPTOMS_FIELD = "symptoms";
|
|
8
8
|
function useObgSymptomsSync() {
|
|
9
|
-
const symptomsField =
|
|
9
|
+
const symptomsField = chunkJVIU4OBK_cjs.useField(SYMPTOMS_FIELD);
|
|
10
10
|
const writeSymptoms = (prev, next, overrideProse) => {
|
|
11
11
|
if (symptomsField.disabled) return;
|
|
12
12
|
const cur = typeof symptomsField.value === "string" ? symptomsField.value : "";
|
|
13
|
-
const { prose: curProse } =
|
|
13
|
+
const { prose: curProse } = chunkJVIU4OBK_cjs.parseProseAndChipTokens(
|
|
14
14
|
cur,
|
|
15
15
|
chunkQKJ7BQSR_cjs.OBG_ZONE_ALLOWED_CHIP_LABELS
|
|
16
16
|
);
|
|
@@ -19,12 +19,12 @@ function useObgSymptomsSync() {
|
|
|
19
19
|
const isAutoOwned = curProse === "" || curProse === prevProse;
|
|
20
20
|
const proseInput = overrideProse !== void 0 ? overrideProse : isAutoOwned ? generatedProse : curProse;
|
|
21
21
|
const chipLabels = next.zones.map(chunkQKJ7BQSR_cjs.obgZoneLabel);
|
|
22
|
-
const composed =
|
|
22
|
+
const composed = chunkJVIU4OBK_cjs.composeProseAndChips(proseInput, chipLabels);
|
|
23
23
|
if (composed !== cur) symptomsField.setValue(composed);
|
|
24
24
|
};
|
|
25
25
|
return { writeSymptoms, symptomsField };
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
exports.useObgSymptomsSync = useObgSymptomsSync;
|
|
29
|
-
//# sourceMappingURL=chunk-
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
//# sourceMappingURL=chunk-35I4CBEC.cjs.map
|
|
30
|
+
//# sourceMappingURL=chunk-35I4CBEC.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/widgets/_obgSymptomsSync.ts"],"names":["useField","parseProseAndChipTokens","OBG_ZONE_ALLOWED_CHIP_LABELS","formatObgPathwayProse","obgZoneLabel","composeProseAndChips"],"mappings":";;;;;;AAYA,IAAM,cAAA,GAAiB,UAAA;AAgBhB,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,aAAA,GAAgBA,2BAAS,cAAc,CAAA;AAE7C,EAAA,MAAM,aAAA,GAAgB,CACpB,IAAA,EACA,IAAA,EACA,aAAA,KACG;AACH,IAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,IAAA,MAAM,MACJ,OAAO,aAAA,CAAc,KAAA,KAAU,QAAA,GAAW,cAAc,KAAA,GAAQ,EAAA;AAClE,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAIC,yCAAA;AAAA,MAC1B,GAAA;AAAA,MACAC;AAAA,KACF;AAEA,IAAA,MAAM,SAAA,GAAYC,wCAAsB,IAAI,CAAA;AAC5C,IAAA,MAAM,cAAA,GAAiBA,wCAAsB,IAAI,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,QAAA,KAAa,EAAA,IAAM,QAAA,KAAa,SAAA;AAEpD,IAAA,MAAM,UAAA,GACJ,aAAA,KAAkB,MAAA,GACd,aAAA,GACA,cACE,cAAA,GACA,QAAA;AAER,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIC,8BAAY,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAWC,sCAAA,CAAqB,UAAA,EAAY,UAAU,CAAA;AAC5D,IAAA,IAAI,QAAA,KAAa,GAAA,EAAK,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,OAAO,EAAE,eAAe,aAAA,EAAc;AACxC","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/_obgSymptomsSync.ts"],"names":["useField","parseProseAndChipTokens","OBG_ZONE_ALLOWED_CHIP_LABELS","formatObgPathwayProse","obgZoneLabel","composeProseAndChips"],"mappings":";;;;;;AAYA,IAAM,cAAA,GAAiB,UAAA;AAgBhB,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,aAAA,GAAgBA,2BAAS,cAAc,CAAA;AAE7C,EAAA,MAAM,aAAA,GAAgB,CACpB,IAAA,EACA,IAAA,EACA,aAAA,KACG;AACH,IAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,IAAA,MAAM,MACJ,OAAO,aAAA,CAAc,KAAA,KAAU,QAAA,GAAW,cAAc,KAAA,GAAQ,EAAA;AAClE,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAIC,yCAAA;AAAA,MAC1B,GAAA;AAAA,MACAC;AAAA,KACF;AAEA,IAAA,MAAM,SAAA,GAAYC,wCAAsB,IAAI,CAAA;AAC5C,IAAA,MAAM,cAAA,GAAiBA,wCAAsB,IAAI,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,QAAA,KAAa,EAAA,IAAM,QAAA,KAAa,SAAA;AAEpD,IAAA,MAAM,UAAA,GACJ,aAAA,KAAkB,MAAA,GACd,aAAA,GACA,cACE,cAAA,GACA,QAAA;AAER,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIC,8BAAY,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAWC,sCAAA,CAAqB,UAAA,EAAY,UAAU,CAAA;AAC5D,IAAA,IAAI,QAAA,KAAa,GAAA,EAAK,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,OAAO,EAAE,eAAe,aAAA,EAAc;AACxC","file":"chunk-35I4CBEC.cjs","sourcesContent":["import { useField } from '../../react/useField';\nimport {\n formatObgPathwayProse,\n obgZoneLabel,\n OBG_ZONE_ALLOWED_CHIP_LABELS,\n type ObgPathwayValue,\n} from '../../core/obgPathway';\nimport {\n composeProseAndChips,\n parseProseAndChipTokens,\n} from '../../core/suggestionTokens';\n\nconst SYMPTOMS_FIELD = 'symptoms';\n\n/**\n * Mirror an OBG pathway value into the `symptoms` (HOPC) textarea as\n * prose + chips. Multiple widgets (OBGPathwayWidget, AntenatalPanels) write\n * through this hook simultaneously, so the \"is current prose user-owned?\"\n * check is stateless: we compare the current prose against the prose that\n * the *previous* pathway value would have generated. If they match, the\n * textarea is still auto-owned and may be refreshed; otherwise the user has\n * edited prose and we preserve it (only the chip line is kept in sync).\n *\n * Because `formatObgPathwayProse` is deterministic, this approach is\n * correct across multiple writers and across remounts without any shared\n * ref — a previous `lastAutoProseRef`-based design fought itself when\n * OBGPathwayWidget and AntenatalPanels both wrote on the same tick.\n */\nexport function useObgSymptomsSync() {\n const symptomsField = useField(SYMPTOMS_FIELD);\n\n const writeSymptoms = (\n prev: ObgPathwayValue,\n next: ObgPathwayValue,\n overrideProse?: string,\n ) => {\n if (symptomsField.disabled) return;\n const cur =\n typeof symptomsField.value === 'string' ? symptomsField.value : '';\n const { prose: curProse } = parseProseAndChipTokens(\n cur,\n OBG_ZONE_ALLOWED_CHIP_LABELS,\n );\n\n const prevProse = formatObgPathwayProse(prev);\n const generatedProse = formatObgPathwayProse(next);\n const isAutoOwned = curProse === '' || curProse === prevProse;\n\n const proseInput =\n overrideProse !== undefined\n ? overrideProse\n : isAutoOwned\n ? generatedProse\n : curProse;\n\n const chipLabels = next.zones.map(obgZoneLabel);\n const composed = composeProseAndChips(proseInput, chipLabels);\n if (composed !== cur) symptomsField.setValue(composed);\n };\n\n return { writeSymptoms, symptomsField };\n}\n"]}
|
|
@@ -3,7 +3,7 @@ import { Input } from './chunk-VNFBUAZD.mjs';
|
|
|
3
3
|
import { cn } from './chunk-VPU66PI6.mjs';
|
|
4
4
|
import { createContext, useContext, useState, useRef, useEffect } from 'react';
|
|
5
5
|
import { Plus, Trash2, ChevronRight, Check, ChevronUp, ChevronDown } from 'lucide-react';
|
|
6
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
7
7
|
|
|
8
8
|
var AISuggestionsContext = createContext({});
|
|
9
9
|
function useAISuggestions() {
|
|
@@ -334,7 +334,8 @@ var AddMedicationField = ({
|
|
|
334
334
|
onSearch,
|
|
335
335
|
recentlyUsed = [],
|
|
336
336
|
frequentItems = [],
|
|
337
|
-
suggestedMedications = []
|
|
337
|
+
suggestedMedications = [],
|
|
338
|
+
packages = []
|
|
338
339
|
}) => {
|
|
339
340
|
const [open, setOpen] = useState(false);
|
|
340
341
|
const [query, setQuery] = useState("");
|
|
@@ -345,6 +346,8 @@ var AddMedicationField = ({
|
|
|
345
346
|
const customIdRef = useRef(-1);
|
|
346
347
|
const valueRef = useRef([]);
|
|
347
348
|
const searchInputRef = useRef(null);
|
|
349
|
+
const addedByPackage = useRef(/* @__PURE__ */ new Map());
|
|
350
|
+
const [selectedPackageIds, setSelectedPackageIds] = useState(/* @__PURE__ */ new Set());
|
|
348
351
|
const safeValue = Array.isArray(value) ? value : [];
|
|
349
352
|
valueRef.current = safeValue;
|
|
350
353
|
const addedIds = new Set(safeValue.map((m) => String(m.id)));
|
|
@@ -386,6 +389,27 @@ var AddMedicationField = ({
|
|
|
386
389
|
onChange([...safeValue, mapFrequentItemToMedication(item)]);
|
|
387
390
|
}
|
|
388
391
|
}
|
|
392
|
+
function handlePackageToggle(pkg) {
|
|
393
|
+
const alreadyAdded = addedByPackage.current.has(pkg.id);
|
|
394
|
+
if (alreadyAdded) {
|
|
395
|
+
const idsToRemove = new Set(addedByPackage.current.get(pkg.id) ?? []);
|
|
396
|
+
onChange(valueRef.current.filter((m) => !idsToRemove.has(String(m.id))));
|
|
397
|
+
addedByPackage.current.delete(pkg.id);
|
|
398
|
+
setSelectedPackageIds((prev) => {
|
|
399
|
+
const next = new Set(prev);
|
|
400
|
+
next.delete(pkg.id);
|
|
401
|
+
return next;
|
|
402
|
+
});
|
|
403
|
+
} else {
|
|
404
|
+
const currentIds = new Set(valueRef.current.map((m) => String(m.id)));
|
|
405
|
+
const newMeds = pkg.medications.filter((d) => !currentIds.has(String(d.id))).map((d) => mapToMedication(d));
|
|
406
|
+
if (newMeds.length > 0) {
|
|
407
|
+
onChange([...valueRef.current, ...newMeds]);
|
|
408
|
+
}
|
|
409
|
+
addedByPackage.current.set(pkg.id, newMeds.map((m) => String(m.id)));
|
|
410
|
+
setSelectedPackageIds((prev) => new Set(prev).add(pkg.id));
|
|
411
|
+
}
|
|
412
|
+
}
|
|
389
413
|
function handleResultClick(result) {
|
|
390
414
|
if (addedIds.has(String(result.id))) return;
|
|
391
415
|
setAddingResultId(result.id);
|
|
@@ -456,6 +480,38 @@ var AddMedicationField = ({
|
|
|
456
480
|
item.id
|
|
457
481
|
);
|
|
458
482
|
}) : [];
|
|
483
|
+
const packageChips = packages.map((pkg) => {
|
|
484
|
+
const isAdded = selectedPackageIds.has(pkg.id);
|
|
485
|
+
return /* @__PURE__ */ jsxs(
|
|
486
|
+
"button",
|
|
487
|
+
{
|
|
488
|
+
type: "button",
|
|
489
|
+
onClick: () => handlePackageToggle(pkg),
|
|
490
|
+
className: cn(
|
|
491
|
+
"rounded-full border text-xs px-4 py-1.5 transition-colors flex items-center gap-2 cursor-pointer",
|
|
492
|
+
isAdded ? "border-green-300 bg-green-50 text-green-700" : "border-border bg-white hover:bg-gray-50"
|
|
493
|
+
),
|
|
494
|
+
children: [
|
|
495
|
+
isAdded && /* @__PURE__ */ jsx("span", { children: "\u2713" }),
|
|
496
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold", children: pkg.name }),
|
|
497
|
+
/* @__PURE__ */ jsx("span", { className: cn(
|
|
498
|
+
"rounded-full px-1.5 py-0.5 text-[10px] font-medium",
|
|
499
|
+
isAdded ? "bg-green-100 text-green-600" : "bg-purple-100 text-purple-600"
|
|
500
|
+
), children: pkg.medications.length })
|
|
501
|
+
]
|
|
502
|
+
},
|
|
503
|
+
pkg.id
|
|
504
|
+
);
|
|
505
|
+
});
|
|
506
|
+
const chipSections = [];
|
|
507
|
+
if (frequentItemChips.length > 0) {
|
|
508
|
+
chipSections.push({ label: "Frequently used", content: /* @__PURE__ */ jsx(Fragment, { children: frequentItemChips }) });
|
|
509
|
+
} else if (recentlyUsedChips.length > 0) {
|
|
510
|
+
chipSections.push({ label: "Recently Used", content: /* @__PURE__ */ jsx(Fragment, { children: recentlyUsedChips }) });
|
|
511
|
+
}
|
|
512
|
+
if (packageChips.length > 0) {
|
|
513
|
+
chipSections.push({ label: "Packages", content: /* @__PURE__ */ jsx(Fragment, { children: packageChips }) });
|
|
514
|
+
}
|
|
459
515
|
return /* @__PURE__ */ jsxs("div", { className: "rounded-md overflow-hidden flex flex-col border bg-white border-[#D0D0D0] space-y-3 p-3 h-fit", children: [
|
|
460
516
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
461
517
|
/* @__PURE__ */ jsx("span", { className: "text-sm font-semibold", children: label }),
|
|
@@ -484,8 +540,7 @@ var AddMedicationField = ({
|
|
|
484
540
|
open,
|
|
485
541
|
onClose: () => setOpen(false),
|
|
486
542
|
title: "Add Medication",
|
|
487
|
-
|
|
488
|
-
chipSectionLabel: frequentItemChips.length > 0 ? "Frequently used" : void 0,
|
|
543
|
+
chipSections: chipSections.length > 0 ? chipSections : void 0,
|
|
489
544
|
actionSlot: /* @__PURE__ */ jsx(
|
|
490
545
|
"button",
|
|
491
546
|
{
|
|
@@ -543,5 +598,5 @@ var AddMedicationField = ({
|
|
|
543
598
|
};
|
|
544
599
|
|
|
545
600
|
export { AISuggestionsProvider, AddMedicationField, useAISuggestions };
|
|
546
|
-
//# sourceMappingURL=chunk-
|
|
547
|
-
//# sourceMappingURL=chunk-
|
|
601
|
+
//# sourceMappingURL=chunk-4422KT6O.mjs.map
|
|
602
|
+
//# sourceMappingURL=chunk-4422KT6O.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/AISuggestionsContext.tsx","../src/ui/widgets/AddMedicationField.tsx"],"names":[],"mappings":"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","file":"chunk-4422KT6O.mjs","sourcesContent":["import { createContext, useContext } from 'react';\n\n/** Shape of a medication as returned by AI analysis */\nexport type AIMedication = {\n id: string | number;\n brand_name: string;\n generic_name: string;\n form?: string;\n strength?: string;\n reason?: string;\n};\n\nexport type AISuggestions = {\n medications?: AIMedication[];\n};\n\nconst AISuggestionsContext = createContext<AISuggestions>({});\n\nexport function useAISuggestions(): AISuggestions {\n return useContext(AISuggestionsContext);\n}\n\nexport const AISuggestionsProvider = AISuggestionsContext.Provider;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Trash2, ChevronUp, ChevronDown, ChevronRight, Plus, Check } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Input } from '../shadcn/input';\nimport { AddEntityDialog } from './AddEntityDialog';\nimport type { AIMedication } from '../../react/AISuggestionsContext';\nimport type { MedicationFrequentItem, MedicationPackage } from '../../core/types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nconst BEFORE_AFTER_OPTIONS = [\n { label: 'Blank', value: '' },\n { label: 'AFTER FOOD', value: 'AFTER FOOD' },\n { label: 'BEFORE FOOD', value: 'BEFORE FOOD' },\n { label: 'WITH FOOD', value: 'WITH FOOD' },\n { label: 'SINGLE DOSE', value: 'SINGLE DOSE' },\n { label: 'BED TIME', value: 'BED TIME' },\n { label: 'EMPTY STOMACH', value: 'EMPTY STOMACH' },\n { label: 'LOCAL APPLICATION', value: 'LOCAL APPLICATION' },\n { label: 'STAT', value: 'STAT' },\n { label: 'INHALATION', value: 'INHALATION' },\n] as const;\n\ntype BeforeAfterOption = (typeof BEFORE_AFTER_OPTIONS)[number]['value'];\n\nconst BEFORE_AFTER_NORMALIZATION_MAP: Record<string, BeforeAfterOption> = {\n AF: 'AFTER FOOD',\n BF: 'BEFORE FOOD',\n};\n\nexport type MedicationSearchResult = {\n id: string;\n name: string;\n generic_name?: string;\n manufacturer?: string;\n score?: number;\n};\n\n\nconst ROUTE_OPTIONS = [\n { label: 'Select route', value: '' },\n { label: 'Per Os', value: 'Per Os' },\n { label: 'Intravenous', value: 'Intravenous' },\n { label: 'Intramuscular', value: 'Intramuscular' },\n { label: 'Subcutaneous', value: 'Subcutaneous' },\n { label: 'Sublingual', value: 'Sublingual' },\n { label: 'Intranasal', value: 'Intranasal' },\n { label: 'Topical', value: 'Topical' },\n { label: 'Per Rectum', value: 'Per Rectum' },\n { label: 'Inhalation', value: 'Inhalation' },\n { label: 'ID Intradermal', value: 'ID Intradermal' },\n] as const;\n\nexport type Medication = {\n id: string;\n brand_name: string;\n generic_name: string;\n frequency: string;\n is_custom: boolean;\n duration_value: string;\n duration_unit: 'days' | 'weeks' | 'months';\n before_after: BeforeAfterOption;\n route: string;\n morning: string;\n afternoon: string;\n night: string;\n notes: string;\n};\n\nexport type AddMedicationFieldProps = {\n label?: string;\n value: Medication[];\n onChange: (items: Medication[]) => void;\n onSearch: (query: string) => Promise<MedicationSearchResult[]>;\n recentlyUsed?: MedicationSearchResult[];\n /** Doctor-scoped frequently used medications (from FormProvider frequentItems) */\n frequentItems?: MedicationFrequentItem[];\n /** AI-suggested medications shown as badges; clicking adds to value */\n suggestedMedications?: AIMedication[];\n packages?: MedicationPackage[];\n};\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction mapToMedication(result: MedicationSearchResult): Medication {\n return {\n id: result.id,\n brand_name: result.name,\n generic_name: result.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\nfunction mapAIMedicationToMedication(ai: AIMedication): Medication {\n const id = ai.id != null ? String(ai.id) : '';\n return {\n id,\n brand_name: ai.brand_name ?? '',\n generic_name: ai.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '1',\n afternoon: '0',\n night: '1',\n notes: ai.reason ?? '',\n };\n}\n\nfunction createCustomMedication(name: string, customId: number): Medication {\n return {\n id: String(customId),\n brand_name: name.trim(),\n generic_name: '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\n/** Parse duration string like \"5 days\" or \"2 weeks\" into value + unit */\nfunction parseDuration(duration?: string): { value: string; unit: 'days' | 'weeks' | 'months' } {\n if (!duration || !duration.trim()) return { value: '3', unit: 'days' };\n const lower = duration.trim().toLowerCase();\n const match = lower.match(/^(\\d+)\\s*(day|days|week|weeks|month|months)?$/);\n if (!match) return { value: '3', unit: 'days' };\n const value = match[1] ?? '3';\n const unitWord = match[2] ?? 'days';\n const unit: 'days' | 'weeks' | 'months' =\n unitWord.startsWith('month') ? 'months' : unitWord.startsWith('week') ? 'weeks' : 'days';\n return { value, unit };\n}\n\nfunction mapFrequentItemToMedication(item: MedicationFrequentItem): Medication {\n const parsed = parseDuration(item.duration);\n const duration_value = item.duration_value ?? parsed.value;\n const duration_unit =\n (item.duration_unit as Medication['duration_unit'] | undefined) ?? parsed.unit;\n\n const before_after: Medication['before_after'] = normalizeBeforeAfter(item.before_after);\n\n const routeNote = item.route ? `Route: ${item.route}` : '';\n const baseNotes = item.notes?.trim() || '';\n const combinedNotes =\n [baseNotes, routeNote.trim()].filter((part) => part.length > 0).join(' — ');\n\n return {\n id: item.id,\n brand_name: item.brand_name ?? item.name,\n generic_name: item.short_name ?? '',\n frequency: item.frequency ?? 'custom',\n is_custom: false,\n duration_value,\n duration_unit,\n before_after,\n route: item.route ?? '',\n morning: item.morning ?? '0',\n afternoon: item.afternoon ?? '0',\n night: item.night ?? '0',\n notes: combinedNotes,\n };\n}\n\nfunction normalizeBeforeAfter(value?: string): BeforeAfterOption {\n if (value == null) return 'AFTER FOOD';\n const mapped = BEFORE_AFTER_NORMALIZATION_MAP[value];\n if (mapped) return mapped;\n const validValues = BEFORE_AFTER_OPTIONS.map((option) => option.value);\n return validValues.includes(value as BeforeAfterOption) ? (value as BeforeAfterOption) : 'AFTER FOOD';\n}\n\nfunction Spinner({\n value,\n onChange,\n}: {\n value: string;\n onChange: (v: string) => void;\n}) {\n const num = parseInt(value, 10) || 0;\n return (\n <div className=\"flex flex-col items-center\">\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(num + 1))}\n >\n <ChevronUp className=\"h-3 w-3\" />\n </button>\n <span className=\"text-sm w-4 text-center leading-none\">{num}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(Math.max(0, num - 1)))}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\n// ─── Medication card (added item) ─────────────────────────────────────────────\n\nfunction MedicationCard({\n med,\n onUpdate,\n onRemove,\n}: {\n med: Medication;\n onUpdate: (updated: Medication) => void;\n onRemove: () => void;\n}) {\n const [notesOpen, setNotesOpen] = useState(false);\n\n function set<K extends keyof Medication>(key: K, val: Medication[K]) {\n onUpdate({ ...med, [key]: val });\n }\n\n return (\n <div className=\"bg-gray-50 rounded-lg p-3 space-y-2\">\n {/* Row 1: drug name, frequency dropdown, morning/afternoon/night labels, delete */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-semibold text-sm flex-1 min-w-0 truncate\">{med.brand_name}</span>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.frequency}\n onChange={(e) => set('frequency', e.target.value)}\n >\n <option value=\"custom\">select frequency</option>\n <option value=\"qid\">4 times a day (QID)</option>\n <option value=\"alternate_day\">Alternate day</option>\n <option value=\"once_weekly\">Once weekly</option>\n <option value=\"once_monthly\">Once monthly</option>\n <option value=\"as_needed\">As needed</option>\n <option value=\"fort_night\">Fort night</option>\n <option value=\"at_bed_time\">At Bed time</option>\n <option value=\"sos\">SOS only</option>\n <option value=\"biweekly\">Biweekly</option>\n <option value=\"stat\">STAT</option>\n </select>\n <div className=\"flex gap-4 items-center shrink-0\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <span\n key={slot}\n className=\"text-[10px] font-semibold uppercase text-muted-foreground tracking-wide\"\n >\n {slot === 'afternoon' ? 'AFTERNOON' : slot === 'morning' ? 'MORNING' : 'NIGHT'}\n </span>\n ))}\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"text-red-400 hover:text-red-600 shrink-0 p-1 cursor-pointer\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Row 2: duration (value + unit) on left; 3 dose spinners in middle; AF/BF on right */}\n <div className=\"flex items-center gap-3 flex-wrap\">\n <div className=\"flex items-center gap-1 shrink-0\">\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n className=\"w-11 text-sm border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_value}\n onChange={(e) => {\n const v = e.target.value.replace(/\\D/g, '');\n set('duration_value', v === '' ? '' : v);\n }}\n />\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_unit}\n onChange={(e) => set('duration_unit', e.target.value as Medication['duration_unit'])}\n >\n <option value=\"days\">days</option>\n <option value=\"weeks\">weeks</option>\n <option value=\"months\">months</option>\n </select>\n </div>\n <div className=\"flex gap-2 items-center flex-1 min-w-0 justify-end\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <div key={slot} className=\"flex flex-col items-center gap-0.5\">\n <Spinner value={med[slot]} onChange={(v) => set(slot, v)} />\n </div>\n ))}\n </div>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={normalizeBeforeAfter(med.before_after)}\n onChange={(e) => set('before_after', e.target.value as Medication['before_after'])}\n >\n {BEFORE_AFTER_OPTIONS.map((option) => (\n <option key={option.label} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.route ?? ''}\n onChange={(e) => set('route', e.target.value)}\n >\n {ROUTE_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* Row 3: medicine notes — full-width div as hit area (chevron + text), cursor-pointer */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setNotesOpen((o) => !o)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setNotesOpen((o) => !o);\n }\n }}\n className={cn(\n 'flex items-center gap-2 w-full text-left text-xs text-muted-foreground hover:text-foreground',\n 'cursor-pointer py-2 px-2 rounded border border-transparent hover:bg-gray-100/80 transition-colors'\n )}\n >\n <ChevronRight\n className={cn('h-3 w-3 shrink-0 transition-transform', notesOpen && 'rotate-90')}\n />\n <span>Medicine Notes</span>\n </div>\n {notesOpen && (\n <div className=\"relative z-10 mt-0.5\">\n <textarea\n className=\"block w-full text-xs border border-border rounded px-2 py-1 resize-none bg-white min-h-0\"\n rows={2}\n placeholder=\"Add notes...\"\n value={med.notes}\n onChange={(e) => set('notes', e.target.value)}\n />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Search result card ────────────────────────────────────────────────────────\n\nconst ADD_FEEDBACK_MS = 320;\n\nfunction SearchResultCard({\n result,\n isAdding,\n onSelect,\n}: {\n result: MedicationSearchResult;\n isAdding: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n 'w-full text-left border rounded-lg px-3 py-2 transition-all duration-300 ease-out cursor-pointer flex items-center justify-between gap-2',\n isAdding\n ? 'border-green-400 bg-green-50 scale-[0.98]'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n <div className=\"min-w-0 flex-1 text-left\">\n <p className=\"text-sm font-semibold leading-tight truncate\">{result.name}</p>\n {result.generic_name && (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\">\n Generic: {result.generic_name}\n </p>\n )}\n </div>\n {isAdding && <Check className=\"h-4 w-4 shrink-0 text-green-600\" />}\n </button>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AddMedicationField: React.FC<AddMedicationFieldProps> = ({\n label = 'Medications',\n value,\n onChange,\n onSearch,\n recentlyUsed = [],\n frequentItems = [],\n suggestedMedications = [],\n packages = [],\n}) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<MedicationSearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [addingResultId, setAddingResultId] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const customIdRef = useRef(-1);\n const valueRef = useRef<Medication[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n // tracks which medication IDs were added by each package: packageId → medicationId[]\n const addedByPackage = useRef<Map<string, string[]>>(new Map());\n // drives re-renders for package chip selected state\n const [selectedPackageIds, setSelectedPackageIds] = useState<Set<string>>(new Set());\n\n const safeValue = Array.isArray(value) ? value : [];\n valueRef.current = safeValue;\n const addedIds = new Set(safeValue.map((m) => String(m.id)));\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n setResults([]);\n setAddingResultId(null);\n }\n }, [open]);\n\n function handleQueryChange(q: string) {\n setQuery(q);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n if (!q.trim()) {\n setResults([]);\n return;\n }\n debounceRef.current = setTimeout(async () => {\n setLoading(true);\n try {\n const res = await onSearch(q);\n setResults(res);\n } finally {\n setLoading(false);\n }\n }, 500);\n }\n\n function handleRecentlyUsedToggle(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(result.id)));\n } else {\n onChange([...safeValue, mapToMedication(result)]);\n }\n }\n\n function handleFrequentItemToggle(item: MedicationFrequentItem) {\n if (addedIds.has(String(item.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(item.id)));\n } else {\n onChange([...safeValue, mapFrequentItemToMedication(item)]);\n }\n }\n\n function handlePackageToggle(pkg: MedicationPackage) {\n const alreadyAdded = addedByPackage.current.has(pkg.id);\n if (alreadyAdded) {\n const idsToRemove = new Set(addedByPackage.current.get(pkg.id) ?? []);\n onChange(valueRef.current.filter((m) => !idsToRemove.has(String(m.id))));\n addedByPackage.current.delete(pkg.id);\n setSelectedPackageIds((prev) => {\n const next = new Set(prev);\n next.delete(pkg.id);\n return next;\n });\n } else {\n const currentIds = new Set(valueRef.current.map((m) => String(m.id)));\n const newMeds = pkg.medications\n .filter((d) => !currentIds.has(String(d.id)))\n .map((d) => mapToMedication(d));\n if (newMeds.length > 0) {\n onChange([...valueRef.current, ...newMeds]);\n }\n addedByPackage.current.set(pkg.id, newMeds.map((m) => String(m.id)));\n setSelectedPackageIds((prev) => new Set(prev).add(pkg.id));\n }\n }\n\n function handleResultClick(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) return;\n setAddingResultId(result.id);\n setTimeout(() => {\n onChange([...valueRef.current, mapToMedication(result)]);\n setAddingResultId(null);\n setQuery('');\n setResults([]);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, ADD_FEEDBACK_MS);\n }\n\n function handleSave() {\n const trimmed = query.trim();\n if (!trimmed) return;\n const customId = customIdRef.current--;\n onChange([...safeValue, createCustomMedication(trimmed, customId)]);\n setQuery('');\n setResults([]);\n }\n\n function handleAddSuggestion(ai: AIMedication) {\n if (addedIds.has(String(ai.id))) return;\n onChange([...safeValue, mapAIMedicationToMedication(ai)]);\n }\n\n function updateMed(index: number, updated: Medication) {\n const next = [...safeValue];\n next[index] = updated;\n onChange(next);\n }\n\n function removeMed(index: number) {\n onChange(safeValue.filter((_, i) => i !== index));\n }\n\n const recentlyUsedChips = recentlyUsed.map((r) => {\n const isAdded = addedIds.has(String(r.id));\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => handleRecentlyUsedToggle(r)}\n className={cn(\n 'rounded-full border text-xs px-3 py-1 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {r.name}\n </button>\n );\n });\n\n const limitedFrequentItems = frequentItems.slice(0, 25);\n\n const frequentItemChips =\n limitedFrequentItems.length > 0\n ? limitedFrequentItems.map((item) => {\n const isAdded = addedIds.has(String(item.id));\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handleFrequentItemToggle(item)}\n className={cn(\n 'rounded-full border text-[11px] px-2 py-0.5 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {item.brand_name ?? item.name}\n </button>\n );\n })\n : [];\n\n const packageChips = packages.map((pkg) => {\n const isAdded = selectedPackageIds.has(pkg.id);\n return (\n <button\n key={pkg.id}\n type=\"button\"\n onClick={() => handlePackageToggle(pkg)}\n className={cn(\n 'rounded-full border text-xs px-4 py-1.5 transition-colors flex items-center gap-2 cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span>✓</span>}\n <span className=\"font-semibold\">{pkg.name}</span>\n <span className={cn(\n 'rounded-full px-1.5 py-0.5 text-[10px] font-medium',\n isAdded ? 'bg-green-100 text-green-600' : 'bg-purple-100 text-purple-600'\n )}>\n {pkg.medications.length}\n </span>\n </button>\n );\n });\n\n const chipSections = [];\n if (frequentItemChips.length > 0) {\n chipSections.push({ label: 'Frequently used', content: <>{frequentItemChips}</> });\n } else if (recentlyUsedChips.length > 0) {\n chipSections.push({ label: 'Recently Used', content: <>{recentlyUsedChips}</> });\n }\n if (packageChips.length > 0) {\n chipSections.push({ label: 'Packages', content: <>{packageChips}</> });\n }\n\n return (\n <div className=\"rounded-md overflow-hidden flex flex-col border bg-white border-[#D0D0D0] space-y-3 p-3 h-fit\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold\">{label}</span>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"text-sm font-semibold text-purple-600 hover:text-purple-800 cursor-pointer\"\n >\n ADD\n </button>\n </div>\n\n {/* Added medications */}\n <div className=\"space-y-2\">\n {safeValue.map((med, i) => (\n <MedicationCard\n key={med.id}\n med={med}\n onUpdate={(u) => updateMed(i, u)}\n onRemove={() => removeMed(i)}\n />\n ))}\n </div>\n\n {/* Dialog */}\n <AddEntityDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Add Medication\"\n chipSections={chipSections.length > 0 ? chipSections : undefined}\n actionSlot={\n <button\n type=\"button\"\n disabled={!query.trim()}\n onClick={handleSave}\n className={cn(\n 'rounded-md px-5 py-2 text-sm font-semibold bg-primary text-primary-foreground hover:bg-primary/90 transition-opacity cursor-pointer',\n !query.trim() && 'opacity-40 cursor-not-allowed'\n )}\n >\n Save Medicine\n </button>\n }\n >\n <div className=\"space-y-3\">\n <Input\n ref={searchInputRef}\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search medicines...\"\n className=\"border border-border rounded-md focus-visible:ring-0\"\n />\n\n {/* AI-suggested medications as clickable badges (inside dialog) */}\n {suggestedMedications.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 items-center\">\n <span className=\"text-xs text-muted-foreground mr-1\">Suggestions:</span>\n {suggestedMedications\n .filter((s) => !addedIds.has(String(s.id)))\n .slice(0, 25)\n .map((s) => (\n <button\n key={String(s.id)}\n type=\"button\"\n onClick={() => handleAddSuggestion(s)}\n className=\"inline-flex items-center gap-1 rounded-full border border-dashed border-purple-300 bg-purple-50/80 text-purple-800 text-[11px] px-2 py-0.5 hover:bg-purple-100 transition-colors cursor-pointer\"\n >\n <Plus className=\"h-3 w-3\" />\n {s.brand_name || s.generic_name || String(s.id)}\n </button>\n ))}\n </div>\n )}\n\n {/* Results grid */}\n {loading && (\n <p className=\"text-xs text-muted-foreground text-center py-2\">Searching…</p>\n )}\n {!loading && results.length > 0 && (\n <div className=\"grid grid-cols-2 gap-2 max-h-64 overflow-y-auto\">\n {results.map((r) => (\n <SearchResultCard\n key={r.id}\n result={r}\n isAdding={addingResultId === r.id}\n onSelect={() => handleResultClick(r)}\n />\n ))}\n </div>\n )}\n </div>\n </AddEntityDialog>\n </div>\n );\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkJVIU4OBK_cjs = require('./chunk-JVIU4OBK.cjs');
|
|
5
5
|
var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
|
|
6
6
|
var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
|
|
7
7
|
var react = require('react');
|
|
@@ -125,7 +125,7 @@ function ArchGrid({
|
|
|
125
125
|
] }) });
|
|
126
126
|
}
|
|
127
127
|
var BpeChartWidget = ({ fieldId }) => {
|
|
128
|
-
const { fieldDef, value, setValue, setTouched, disabled } =
|
|
128
|
+
const { fieldDef, value, setValue, setTouched, disabled } = chunkJVIU4OBK_cjs.useField(fieldId);
|
|
129
129
|
const data = react.useMemo(() => normalizeBpeChart(value), [value]);
|
|
130
130
|
const handleScoreChange = (key, score) => {
|
|
131
131
|
const next = { ...data, scores: { ...data.scores } };
|
|
@@ -216,5 +216,5 @@ exports.BPE_SCORES = BPE_SCORES;
|
|
|
216
216
|
exports.BpeChartReadOnly = BpeChartReadOnly;
|
|
217
217
|
exports.BpeChartWidget = BpeChartWidget;
|
|
218
218
|
exports.SEXTANTS = SEXTANTS;
|
|
219
|
-
//# sourceMappingURL=chunk-
|
|
220
|
-
//# sourceMappingURL=chunk-
|
|
219
|
+
//# sourceMappingURL=chunk-4KTQ4NEI.cjs.map
|
|
220
|
+
//# sourceMappingURL=chunk-4KTQ4NEI.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/widgets/BpeChartWidget.tsx"],"names":["jsxs","jsx","cn","Fragment","useField","useMemo","isLabelVisible","fieldWrapperClass","Label","fieldLabelClass","FieldRequiredIndicator"],"mappings":"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","file":"chunk-BBD3Y37O.cjs","sourcesContent":["import React, { useMemo } from 'react';\nimport { useField } from '../../react/useField';\nimport { Label } from '../shadcn/label';\nimport {\n FieldRequiredIndicator,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\nimport { cn } from '../../core/utils';\n\n// ─── BPE constants ────────────────────────────────────────────────────────────\n\nexport const BPE_SCORES = ['0', '1', '2', '3', '4', '*'] as const;\nexport type BpeScore = (typeof BPE_SCORES)[number];\n\nconst SCORE_LABEL: Record<BpeScore, string> = {\n '0': '0 – Healthy',\n '1': '1 – Bleeding on probing',\n '2': '2 – Calculus / plaque retentive factor',\n '3': '3 – Pocket 3.5–5.5 mm',\n '4': '4 – Pocket ≥6 mm',\n '*': '* – Furcation involvement',\n};\n\nexport const SEXTANTS = [\n { key: 'upper_right', label: 'UR', arch: 'upper' as const, teeth: '17–14' },\n { key: 'upper_anterior', label: 'UA', arch: 'upper' as const, teeth: '13–23' },\n { key: 'upper_left', label: 'UL', arch: 'upper' as const, teeth: '24–27' },\n { key: 'lower_right', label: 'LR', arch: 'lower' as const, teeth: '44–47' },\n { key: 'lower_anterior', label: 'LA', arch: 'lower' as const, teeth: '33–43' },\n { key: 'lower_left', label: 'LL', arch: 'lower' as const, teeth: '34–37' },\n] as const;\n\nexport type SextantKey = (typeof SEXTANTS)[number]['key'];\n\nexport type BpeChartData = {\n scores: Partial<Record<SextantKey, BpeScore>>;\n bleeding: Partial<Record<SextantKey, boolean>>;\n};\n\nfunction normalizeBpeChart(raw: unknown): BpeChartData {\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const o = raw as Record<string, unknown>;\n if (o.scores || o.bleeding) {\n return {\n scores: (o.scores ?? {}) as Partial<Record<SextantKey, BpeScore>>,\n bleeding: (o.bleeding ?? {}) as Partial<Record<SextantKey, boolean>>,\n };\n }\n return { scores: raw as Partial<Record<SextantKey, BpeScore>>, bleeding: {} };\n }\n return { scores: {}, bleeding: {} };\n}\n\n// ─── Arch grid ────────────────────────────────────────────────────────────────\n// Layout:\n// Upper: [boxes row] → [labels row] → [bleeding row]\n// Lower: [bleeding row] → [labels row] → [boxes row]\n// Each row shares a fixed left spacer matching the \"Bleeding\" label width so\n// checkboxes align under their respective sextant boxes.\n\nfunction ArchGrid({\n arch,\n data,\n onScoreChange,\n onBleedingChange,\n disabled,\n}: {\n arch: 'upper' | 'lower';\n data: BpeChartData;\n onScoreChange?: (key: SextantKey, score: BpeScore | undefined) => void;\n onBleedingChange?: (key: SextantKey, v: boolean) => void;\n disabled?: boolean;\n}) {\n const sextants = SEXTANTS.filter((s) => s.arch === arch);\n const isUpper = arch === 'upper';\n const editable = !!onScoreChange;\n\n const boxesRow = (\n <div className=\"flex gap-2\">\n {/* spacer matching \"Bleeding\" label column */}\n <div className=\"w-16 shrink-0\" />\n {sextants.map((s) => (\n <div\n key={s.key}\n className=\"relative flex h-12 w-14 shrink-0 items-center justify-center rounded-md border-2 border-gray-200 bg-white text-xl font-bold\"\n >\n {editable ? (\n <select\n value={data.scores[s.key] ?? ''}\n disabled={disabled}\n onChange={(e) =>\n onScoreChange!(s.key, (e.target.value || undefined) as BpeScore | undefined)\n }\n title={s.label}\n className=\"absolute inset-0 h-full w-full cursor-pointer appearance-none bg-transparent text-center text-xl font-bold text-gray-700 focus:outline-none\"\n >\n <option value=\"\">—</option>\n {BPE_SCORES.map((sc) => (\n <option key={sc} value={sc}>{sc}</option>\n ))}\n </select>\n ) : (\n <span\n className=\"text-gray-700 select-none\"\n title={data.scores[s.key] ? `${s.label}: ${SCORE_LABEL[data.scores[s.key]!]}` : `${s.label}: not recorded`}\n >\n {data.scores[s.key] ?? '—'}\n </span>\n )}\n </div>\n ))}\n </div>\n );\n\n const labelsRow = (\n <div className=\"flex gap-2\">\n <div className=\"w-16 shrink-0\" />\n {sextants.map((s) => (\n <div\n key={s.key}\n className=\"w-14 shrink-0 text-center text-xs font-semibold uppercase tracking-wider text-muted-foreground\"\n >\n {s.label}\n </div>\n ))}\n </div>\n );\n\n const bleedingRow = (\n <div className=\"flex items-center gap-2\">\n <span className=\"w-16 shrink-0 text-right text-xs text-muted-foreground pr-1\">\n Bleeding\n </span>\n {sextants.map((s) => (\n <div key={s.key} className=\"flex w-14 shrink-0 justify-center\">\n {editable ? (\n <input\n type=\"checkbox\"\n checked={!!data.bleeding[s.key]}\n disabled={disabled}\n onChange={(e) => onBleedingChange?.(s.key, e.target.checked)}\n title={`Bleeding on probing – ${s.label}`}\n className={cn(\n 'h-3.5 w-3.5 cursor-pointer accent-rose-500',\n disabled && 'pointer-events-none opacity-50',\n )}\n />\n ) : (\n <div\n className={cn(\n 'h-3.5 w-3.5 rounded-sm border border-gray-300',\n data.bleeding[s.key] ? 'bg-rose-500 border-rose-500' : 'bg-white',\n )}\n />\n )}\n </div>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex flex-col gap-1\">\n {isUpper ? (\n <>\n {bleedingRow}\n {boxesRow}\n {labelsRow}\n </>\n ) : (\n <>\n {labelsRow}\n {boxesRow}\n {bleedingRow}\n </>\n )}\n </div>\n );\n}\n\n// ─── Editable widget ──────────────────────────────────────────────────────────\n\nexport const BpeChartWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, disabled } = useField(fieldId);\n const data = useMemo(() => normalizeBpeChart(value), [value]);\n\n const handleScoreChange = (key: SextantKey, score: BpeScore | undefined) => {\n const next: BpeChartData = { ...data, scores: { ...data.scores } };\n if (score === undefined) delete next.scores[key];\n else next.scores[key] = score;\n setValue(next);\n setTouched();\n };\n\n const handleBleedingChange = (key: SextantKey, v: boolean) => {\n const next: BpeChartData = { ...data, bleeding: { ...data.bleeding } };\n if (!v) delete next.bleeding[key];\n else next.bleeding[key] = true;\n setValue(next);\n setTouched();\n };\n\n if (!fieldDef) return null;\n const showLabel = isLabelVisible(fieldDef);\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-3')}>\n {showLabel && (\n <Label className={fieldLabelClass(fieldDef)}>\n {fieldDef.label} <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n )}\n\n <div className=\"rounded-xl border border-border/60 bg-card shadow-sm\">\n <div className=\"px-4 py-4\">\n <div className=\"flex flex-col items-center gap-3\">\n <ArchGrid\n arch=\"upper\"\n data={data}\n onScoreChange={handleScoreChange}\n onBleedingChange={handleBleedingChange}\n disabled={disabled}\n />\n\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Occlusal plane\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n <ArchGrid\n arch=\"lower\"\n data={data}\n onScoreChange={handleScoreChange}\n onBleedingChange={handleBleedingChange}\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// ─── Read-only view ───────────────────────────────────────────────────────────\n\nexport function BpeChartReadOnly({\n data: rawData,\n label,\n className,\n}: {\n data: unknown;\n label?: string;\n className?: string;\n}) {\n const data = useMemo(() => normalizeBpeChart(rawData), [rawData]);\n const hasData = SEXTANTS.some((s) => data.scores[s.key] !== undefined);\n\n return (\n <div className={`rounded-xl border border-border/60 bg-card shadow-sm ${className ?? ''}`}>\n {label && (\n <div className=\"border-b border-border/60 px-4 py-3\">\n <h3 className=\"text-sm font-semibold text-foreground\">{label}</h3>\n </div>\n )}\n\n {!hasData ? (\n <div className=\"px-4 py-6 text-center text-sm text-muted-foreground\">\n No BPE scores recorded\n </div>\n ) : (\n <>\n <div className=\"px-4 py-4\">\n <div className=\"flex flex-col items-center gap-3\">\n <ArchGrid arch=\"upper\" data={data} />\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Occlusal plane\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n <ArchGrid arch=\"lower\" data={data} />\n </div>\n </div>\n\n <div className=\"border-t border-border/60 px-4 py-3\">\n <div className=\"space-y-0.5\">\n {SEXTANTS.filter((s) => data.scores[s.key]).map((s) => (\n <p key={s.key} className=\"text-xs text-foreground\">\n <span className=\"font-medium\">{s.label}:</span>{' '}\n <span className=\"text-muted-foreground\">\n {SCORE_LABEL[data.scores[s.key]!]}\n {data.bleeding[s.key] ? ' · BOP' : ''}\n </span>\n </p>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/BpeChartWidget.tsx"],"names":["jsxs","jsx","cn","Fragment","useField","useMemo","isLabelVisible","fieldWrapperClass","Label","fieldLabelClass","FieldRequiredIndicator"],"mappings":"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","file":"chunk-4KTQ4NEI.cjs","sourcesContent":["import React, { useMemo } from 'react';\nimport { useField } from '../../react/useField';\nimport { Label } from '../shadcn/label';\nimport {\n FieldRequiredIndicator,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\nimport { cn } from '../../core/utils';\n\n// ─── BPE constants ────────────────────────────────────────────────────────────\n\nexport const BPE_SCORES = ['0', '1', '2', '3', '4', '*'] as const;\nexport type BpeScore = (typeof BPE_SCORES)[number];\n\nconst SCORE_LABEL: Record<BpeScore, string> = {\n '0': '0 – Healthy',\n '1': '1 – Bleeding on probing',\n '2': '2 – Calculus / plaque retentive factor',\n '3': '3 – Pocket 3.5–5.5 mm',\n '4': '4 – Pocket ≥6 mm',\n '*': '* – Furcation involvement',\n};\n\nexport const SEXTANTS = [\n { key: 'upper_right', label: 'UR', arch: 'upper' as const, teeth: '17–14' },\n { key: 'upper_anterior', label: 'UA', arch: 'upper' as const, teeth: '13–23' },\n { key: 'upper_left', label: 'UL', arch: 'upper' as const, teeth: '24–27' },\n { key: 'lower_right', label: 'LR', arch: 'lower' as const, teeth: '44–47' },\n { key: 'lower_anterior', label: 'LA', arch: 'lower' as const, teeth: '33–43' },\n { key: 'lower_left', label: 'LL', arch: 'lower' as const, teeth: '34–37' },\n] as const;\n\nexport type SextantKey = (typeof SEXTANTS)[number]['key'];\n\nexport type BpeChartData = {\n scores: Partial<Record<SextantKey, BpeScore>>;\n bleeding: Partial<Record<SextantKey, boolean>>;\n};\n\nfunction normalizeBpeChart(raw: unknown): BpeChartData {\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const o = raw as Record<string, unknown>;\n if (o.scores || o.bleeding) {\n return {\n scores: (o.scores ?? {}) as Partial<Record<SextantKey, BpeScore>>,\n bleeding: (o.bleeding ?? {}) as Partial<Record<SextantKey, boolean>>,\n };\n }\n return { scores: raw as Partial<Record<SextantKey, BpeScore>>, bleeding: {} };\n }\n return { scores: {}, bleeding: {} };\n}\n\n// ─── Arch grid ────────────────────────────────────────────────────────────────\n// Layout:\n// Upper: [boxes row] → [labels row] → [bleeding row]\n// Lower: [bleeding row] → [labels row] → [boxes row]\n// Each row shares a fixed left spacer matching the \"Bleeding\" label width so\n// checkboxes align under their respective sextant boxes.\n\nfunction ArchGrid({\n arch,\n data,\n onScoreChange,\n onBleedingChange,\n disabled,\n}: {\n arch: 'upper' | 'lower';\n data: BpeChartData;\n onScoreChange?: (key: SextantKey, score: BpeScore | undefined) => void;\n onBleedingChange?: (key: SextantKey, v: boolean) => void;\n disabled?: boolean;\n}) {\n const sextants = SEXTANTS.filter((s) => s.arch === arch);\n const isUpper = arch === 'upper';\n const editable = !!onScoreChange;\n\n const boxesRow = (\n <div className=\"flex gap-2\">\n {/* spacer matching \"Bleeding\" label column */}\n <div className=\"w-16 shrink-0\" />\n {sextants.map((s) => (\n <div\n key={s.key}\n className=\"relative flex h-12 w-14 shrink-0 items-center justify-center rounded-md border-2 border-gray-200 bg-white text-xl font-bold\"\n >\n {editable ? (\n <select\n value={data.scores[s.key] ?? ''}\n disabled={disabled}\n onChange={(e) =>\n onScoreChange!(s.key, (e.target.value || undefined) as BpeScore | undefined)\n }\n title={s.label}\n className=\"absolute inset-0 h-full w-full cursor-pointer appearance-none bg-transparent text-center text-xl font-bold text-gray-700 focus:outline-none\"\n >\n <option value=\"\">—</option>\n {BPE_SCORES.map((sc) => (\n <option key={sc} value={sc}>{sc}</option>\n ))}\n </select>\n ) : (\n <span\n className=\"text-gray-700 select-none\"\n title={data.scores[s.key] ? `${s.label}: ${SCORE_LABEL[data.scores[s.key]!]}` : `${s.label}: not recorded`}\n >\n {data.scores[s.key] ?? '—'}\n </span>\n )}\n </div>\n ))}\n </div>\n );\n\n const labelsRow = (\n <div className=\"flex gap-2\">\n <div className=\"w-16 shrink-0\" />\n {sextants.map((s) => (\n <div\n key={s.key}\n className=\"w-14 shrink-0 text-center text-xs font-semibold uppercase tracking-wider text-muted-foreground\"\n >\n {s.label}\n </div>\n ))}\n </div>\n );\n\n const bleedingRow = (\n <div className=\"flex items-center gap-2\">\n <span className=\"w-16 shrink-0 text-right text-xs text-muted-foreground pr-1\">\n Bleeding\n </span>\n {sextants.map((s) => (\n <div key={s.key} className=\"flex w-14 shrink-0 justify-center\">\n {editable ? (\n <input\n type=\"checkbox\"\n checked={!!data.bleeding[s.key]}\n disabled={disabled}\n onChange={(e) => onBleedingChange?.(s.key, e.target.checked)}\n title={`Bleeding on probing – ${s.label}`}\n className={cn(\n 'h-3.5 w-3.5 cursor-pointer accent-rose-500',\n disabled && 'pointer-events-none opacity-50',\n )}\n />\n ) : (\n <div\n className={cn(\n 'h-3.5 w-3.5 rounded-sm border border-gray-300',\n data.bleeding[s.key] ? 'bg-rose-500 border-rose-500' : 'bg-white',\n )}\n />\n )}\n </div>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex flex-col gap-1\">\n {isUpper ? (\n <>\n {bleedingRow}\n {boxesRow}\n {labelsRow}\n </>\n ) : (\n <>\n {labelsRow}\n {boxesRow}\n {bleedingRow}\n </>\n )}\n </div>\n );\n}\n\n// ─── Editable widget ──────────────────────────────────────────────────────────\n\nexport const BpeChartWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, disabled } = useField(fieldId);\n const data = useMemo(() => normalizeBpeChart(value), [value]);\n\n const handleScoreChange = (key: SextantKey, score: BpeScore | undefined) => {\n const next: BpeChartData = { ...data, scores: { ...data.scores } };\n if (score === undefined) delete next.scores[key];\n else next.scores[key] = score;\n setValue(next);\n setTouched();\n };\n\n const handleBleedingChange = (key: SextantKey, v: boolean) => {\n const next: BpeChartData = { ...data, bleeding: { ...data.bleeding } };\n if (!v) delete next.bleeding[key];\n else next.bleeding[key] = true;\n setValue(next);\n setTouched();\n };\n\n if (!fieldDef) return null;\n const showLabel = isLabelVisible(fieldDef);\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-3')}>\n {showLabel && (\n <Label className={fieldLabelClass(fieldDef)}>\n {fieldDef.label} <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n )}\n\n <div className=\"rounded-xl border border-border/60 bg-card shadow-sm\">\n <div className=\"px-4 py-4\">\n <div className=\"flex flex-col items-center gap-3\">\n <ArchGrid\n arch=\"upper\"\n data={data}\n onScoreChange={handleScoreChange}\n onBleedingChange={handleBleedingChange}\n disabled={disabled}\n />\n\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Occlusal plane\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n <ArchGrid\n arch=\"lower\"\n data={data}\n onScoreChange={handleScoreChange}\n onBleedingChange={handleBleedingChange}\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// ─── Read-only view ───────────────────────────────────────────────────────────\n\nexport function BpeChartReadOnly({\n data: rawData,\n label,\n className,\n}: {\n data: unknown;\n label?: string;\n className?: string;\n}) {\n const data = useMemo(() => normalizeBpeChart(rawData), [rawData]);\n const hasData = SEXTANTS.some((s) => data.scores[s.key] !== undefined);\n\n return (\n <div className={`rounded-xl border border-border/60 bg-card shadow-sm ${className ?? ''}`}>\n {label && (\n <div className=\"border-b border-border/60 px-4 py-3\">\n <h3 className=\"text-sm font-semibold text-foreground\">{label}</h3>\n </div>\n )}\n\n {!hasData ? (\n <div className=\"px-4 py-6 text-center text-sm text-muted-foreground\">\n No BPE scores recorded\n </div>\n ) : (\n <>\n <div className=\"px-4 py-4\">\n <div className=\"flex flex-col items-center gap-3\">\n <ArchGrid arch=\"upper\" data={data} />\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Occlusal plane\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n <ArchGrid arch=\"lower\" data={data} />\n </div>\n </div>\n\n <div className=\"border-t border-border/60 px-4 py-3\">\n <div className=\"space-y-0.5\">\n {SEXTANTS.filter((s) => data.scores[s.key]).map((s) => (\n <p key={s.key} className=\"text-xs text-foreground\">\n <span className=\"font-medium\">{s.label}:</span>{' '}\n <span className=\"text-muted-foreground\">\n {SCORE_LABEL[data.scores[s.key]!]}\n {data.bleeding[s.key] ? ' · BOP' : ''}\n </span>\n </p>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n"]}
|