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/widgets/BpeChartWidget.tsx"],"names":[],"mappings":"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","file":"chunk-MQHZ7HD2.mjs","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":[],"mappings":"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","file":"chunk-QQXBHDUF.mjs","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,7 +1,7 @@
|
|
|
1
1
|
import { Textarea } from './chunk-4BAKQIPJ.mjs';
|
|
2
2
|
import { Popover, PopoverTrigger, PopoverContent } from './chunk-ZZX3IG2T.mjs';
|
|
3
3
|
import { Button } from './chunk-GXXWMHAA.mjs';
|
|
4
|
-
import { useField } from './chunk-
|
|
4
|
+
import { useField } from './chunk-HKEUAERY.mjs';
|
|
5
5
|
import { cn } from './chunk-VPU66PI6.mjs';
|
|
6
6
|
import { useCallback } from 'react';
|
|
7
7
|
import { X, Trash2 } from 'lucide-react';
|
|
@@ -596,5 +596,5 @@ function ReadOnlyLegend({ usedConditions }) {
|
|
|
596
596
|
}
|
|
597
597
|
|
|
598
598
|
export { CONDITION_CONFIG, DentalChartReadOnly, DentalChartWidget, QUADRANTS, normalizeDentalChart, toothLabel };
|
|
599
|
-
//# sourceMappingURL=chunk-
|
|
600
|
-
//# sourceMappingURL=chunk-
|
|
599
|
+
//# sourceMappingURL=chunk-VAJR2VBK.mjs.map
|
|
600
|
+
//# sourceMappingURL=chunk-VAJR2VBK.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/dentalChart.ts","../src/ui/widgets/DentalChartWidget.tsx"],"names":[],"mappings":"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","file":"chunk-UKSP3B3W.mjs","sourcesContent":["import type { ToothCondition, DentalChartData } from './types';\n\nexport const CONDITION_CONFIG: Record<ToothCondition, { label: string; color: string }> = {\n cavity: { label: 'Cavity', color: '#ef4444' },\n filled: { label: 'Filled', color: '#3b82f6' },\n crown: { label: 'Crown', color: '#f59e0b' },\n missing: { label: 'Missing', color: '#9ca3af' },\n root_canal: { label: 'Root Canal (RCT)', color: '#a855f7' },\n bridge: { label: 'Bridge', color: '#f97316' },\n implant: { label: 'Implant', color: '#14b8a6' },\n fractured: { label: 'Fractured', color: '#eab308' },\n impacted: { label: 'Impacted', color: '#6366f1' },\n};\n\nexport const ALL_CONDITIONS = Object.keys(CONDITION_CONFIG) as ToothCondition[];\n\n/** FDI quadrant tooth numbers, ordered from midline outward */\nexport const QUADRANTS = {\n upperRight: [11, 12, 13, 14, 15, 16, 17, 18] as const,\n upperLeft: [21, 22, 23, 24, 25, 26, 27, 28] as const,\n lowerLeft: [31, 32, 33, 34, 35, 36, 37, 38] as const,\n lowerRight: [41, 42, 43, 44, 45, 46, 47, 48] as const,\n};\n\nconst TOOTH_NAMES: Record<number, string> = {\n 11: 'UR Central Incisor', 12: 'UR Lateral Incisor',\n 13: 'UR Canine', 14: 'UR 1st Premolar',\n 15: 'UR 2nd Premolar', 16: 'UR 1st Molar',\n 17: 'UR 2nd Molar', 18: 'UR 3rd Molar',\n 21: 'UL Central Incisor', 22: 'UL Lateral Incisor',\n 23: 'UL Canine', 24: 'UL 1st Premolar',\n 25: 'UL 2nd Premolar', 26: 'UL 1st Molar',\n 27: 'UL 2nd Molar', 28: 'UL 3rd Molar',\n 31: 'LL Central Incisor', 32: 'LL Lateral Incisor',\n 33: 'LL Canine', 34: 'LL 1st Premolar',\n 35: 'LL 2nd Premolar', 36: 'LL 1st Molar',\n 37: 'LL 2nd Molar', 38: 'LL 3rd Molar',\n 41: 'LR Central Incisor', 42: 'LR Lateral Incisor',\n 43: 'LR Canine', 44: 'LR 1st Premolar',\n 45: 'LR 2nd Premolar', 46: 'LR 1st Molar',\n 47: 'LR 2nd Molar', 48: 'LR 3rd Molar',\n};\n\nexport function toothLabel(id: number): string {\n return TOOTH_NAMES[id] ?? `Tooth ${id}`;\n}\n\n/** Conditions that support per-surface location selection. */\nexport const SURFACE_CONDITIONS: readonly ToothCondition[] = ['cavity', 'filled', 'fractured'];\n\n/** Anterior teeth that use \"Incisal\" instead of \"Occlusal\". */\nconst ANTERIOR_TEETH = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/**\n * Returns the ordered surface options for a given FDI tooth number.\n * - Upper jaw → Palatal (teeth 11-28)\n * - Lower jaw → Lingual (teeth 31-48)\n * - Anteriors → Incisal instead of Occlusal\n */\nexport function getToothSurfaces(id: number): string[] {\n const isUpper = id >= 11 && id <= 28;\n const isAnterior = ANTERIOR_TEETH.has(id);\n return [\n 'Buccal',\n 'Mesial',\n 'Distal',\n isAnterior ? 'Incisal' : 'Occlusal',\n isUpper ? 'Palatal' : 'Lingual',\n ];\n}\n\n/** Coerces an unknown value into a valid `DentalChartData` shape. */\nexport function normalizeDentalChart(value: unknown): DentalChartData {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.teeth && typeof v.teeth === 'object' && !Array.isArray(v.teeth)) {\n return value as DentalChartData;\n }\n }\n return { teeth: {} };\n}\n","import React, { useCallback } from 'react';\nimport { X, Trash2 } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Button } from '../shadcn/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../shadcn/popover';\nimport { Textarea } from '../shadcn/textarea';\nimport { useField } from '../../react/useField';\nimport {\n ALL_CONDITIONS,\n CONDITION_CONFIG,\n QUADRANTS,\n SURFACE_CONDITIONS,\n getToothSurfaces,\n normalizeDentalChart,\n toothLabel,\n} from '../../core/dentalChart';\nimport type { DentalChartData, ToothCondition, ToothEntry } from '../../core/types';\n\n// ─── Tooth Editor (inside popover) ───────────────────────────────────────────\n\nfunction ToothEditor({\n id,\n entry,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const surfaces = entry?.surfaces ?? {};\n const notes = entry?.notes ?? '';\n const availableSurfaces = getToothSurfaces(id);\n\n const buildEntry = (\n nextConditions: ToothCondition[],\n nextSurfaces: typeof surfaces,\n nextNotes: string,\n ): ToothEntry => ({\n conditions: nextConditions,\n surfaces: Object.keys(nextSurfaces).length ? nextSurfaces : undefined,\n notes: nextNotes || undefined,\n });\n\n const toggle = (c: ToothCondition) => {\n const isActive = conditions.includes(c);\n const nextConditions = isActive\n ? conditions.filter((x) => x !== c)\n : [...conditions, c];\n // Clear surfaces for a condition being deactivated\n const nextSurfaces = { ...surfaces };\n if (isActive) delete nextSurfaces[c];\n onChange(buildEntry(nextConditions, nextSurfaces, notes));\n };\n\n const toggleSurface = (c: ToothCondition, surface: string) => {\n const current = surfaces[c] ?? [];\n const next = current.includes(surface)\n ? current.filter((s) => s !== surface)\n : [...current, surface];\n const nextSurfaces = { ...surfaces, [c]: next.length ? next : [] };\n onChange(buildEntry(conditions, nextSurfaces, notes));\n };\n\n const updateNotes = (v: string) =>\n onChange(buildEntry(conditions, surfaces, v));\n\n // Conditions active that support surface selection\n const activeSurfaceConditions = SURFACE_CONDITIONS.filter((c) =>\n conditions.includes(c),\n );\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div>\n <p className=\"text-xs font-semibold text-foreground\">Tooth {id}</p>\n <p className=\"text-[10px] text-muted-foreground\">{toothLabel(id)}</p>\n </div>\n {conditions.length > 0 && (\n <button\n type=\"button\"\n onClick={() => onChange({ conditions: [] })}\n className=\"flex shrink-0 items-center gap-1 text-[10px] text-destructive hover:underline\"\n >\n <Trash2 className=\"h-3 w-3\" />\n Clear\n </button>\n )}\n </div>\n\n {/* Condition chips */}\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const active = conditions.includes(c);\n return (\n <button\n key={c}\n type=\"button\"\n onClick={() => toggle(c)}\n className={cn(\n 'rounded-full border px-2.5 py-0.5 text-[10px] font-medium transition-all',\n active\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={active ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {cfg.label}\n </button>\n );\n })}\n </div>\n\n {/* Surface location pickers — one per active surface-eligible condition */}\n {activeSurfaceConditions.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const selected = surfaces[c] ?? [];\n return (\n <div key={c} className=\"space-y-1\">\n <p\n className=\"text-[10px] font-semibold uppercase tracking-wide\"\n style={{ color: cfg.color }}\n >\n {cfg.label} — surfaces\n </p>\n <div className=\"flex flex-wrap gap-1\">\n {availableSurfaces.map((surface) => {\n const on = selected.includes(surface);\n return (\n <button\n key={surface}\n type=\"button\"\n onClick={() => toggleSurface(c, surface)}\n className={cn(\n 'rounded border px-2 py-0.5 text-[10px] font-medium transition-all',\n on\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={on ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {surface}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n\n <Textarea\n value={notes}\n onChange={(e) => updateNotes(e.target.value)}\n placeholder=\"Notes for this tooth…\"\n className=\"h-16 resize-none text-xs\"\n />\n </div>\n );\n}\n\n// ─── Single Tooth Button ──────────────────────────────────────────────────────\n\nfunction ToothButton({\n id,\n entry,\n isUpper,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n cursor: 'pointer',\n userSelect: 'none',\n outline: 'none',\n transition: 'box-shadow 0.15s',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n title={toothLabel(id)}\n style={boxStyle}\n className=\"hover:ring-2 hover:ring-primary/30 focus:ring-2 focus:ring-primary/40\"\n >\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n <PopoverContent className=\"w-72 p-3\" side={isUpper ? 'top' : 'bottom'} align=\"center\" sideOffset={6}>\n <ToothEditor id={id} entry={entry} onChange={onChange} />\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Tooth surface diagram ────────────────────────────────────────────────────\n\nconst ANTERIOR_IDS = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/** Build a surface→color map from an entry's per-condition surface selections. */\nfunction buildSurfaceColorMap(entry: ToothEntry | undefined): Record<string, string> {\n if (!entry?.surfaces) return {};\n const map: Record<string, string> = {};\n for (const cond of SURFACE_CONDITIONS) {\n const surfs = entry.surfaces[cond as ToothCondition];\n if (!surfs?.length) continue;\n const color = CONDITION_CONFIG[cond as ToothCondition]?.color;\n if (!color) continue;\n for (const s of surfs) map[s] = color;\n }\n return map;\n}\n\n/**\n * Small SVG cross-section of a tooth crown (occlusal view).\n * 5 segments: Buccal (top) · Mesial (left) · Distal (right) ·\n * Palatal or Lingual (bottom) · Occlusal or Incisal (centre).\n */\nfunction ToothDiagram({ id, entry }: { id: number; entry: ToothEntry | undefined }) {\n const colorMap = buildSurfaceColorMap(entry);\n const hasSurfaces = Object.keys(colorMap).length > 0;\n\n const isUpper = id >= 11 && id <= 28;\n const bottomLabel = isUpper ? 'Palatal' : 'Lingual';\n const centerLabel = ANTERIOR_IDS.has(id) ? 'Incisal' : 'Occlusal';\n\n // 46 × 46 viewBox; inner corners at 11 and 35\n const S = 46;\n const I = 11;\n const segments = [\n { key: 'Buccal', d: `M0,0 L${S},0 L${S-I},${I} L${I},${I}Z` },\n { key: 'Mesial', d: `M0,0 L0,${S} L${I},${S-I} L${I},${I}Z` },\n { key: 'Distal', d: `M${S},0 L${S},${S} L${S-I},${S-I} L${S-I},${I}Z` },\n { key: bottomLabel, d: `M0,${S} L${S},${S} L${S-I},${S-I} L${I},${S-I}Z` },\n { key: centerLabel, d: `M${I},${I} L${S-I},${I} L${S-I},${S-I} L${I},${S-I}Z` },\n ];\n\n return (\n <svg\n width={S}\n height={S}\n viewBox={`0 0 ${S} ${S}`}\n style={{ flexShrink: 0, opacity: hasSurfaces ? 1 : 0.3 }}\n >\n {segments.map(({ key, d }) => {\n const color = colorMap[key];\n return (\n <path\n key={key}\n d={d}\n fill={color ?? '#f1f5f9'}\n stroke={color ? color : '#cbd5e1'}\n strokeWidth=\"1\"\n strokeLinejoin=\"round\"\n />\n );\n })}\n </svg>\n );\n}\n\n// ─── Arch Row ─────────────────────────────────────────────────────────────────\n\nfunction ArchRow({\n teeth: toothIds,\n isUpper,\n data,\n onChange,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n onChange: (id: number, entry: ToothEntry) => void;\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ToothButton\n id={id}\n entry={data[String(id)]}\n isUpper={isUpper}\n onChange={(entry) => onChange(id, entry)}\n />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\n// ─── Legend ───────────────────────────────────────────────────────────────────\n\nfunction ChartLegend() {\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── Forminator Widget wrapper ────────────────────────────────────────────────\n\nexport const DentalChartWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue, setTouched, disabled } = useField(fieldId);\n const data = normalizeDentalChart(value);\n const teeth = data.teeth;\n\n const handleToothChange = useCallback(\n (id: number, entry: ToothEntry) => {\n const next: DentalChartData['teeth'] = { ...teeth };\n if (entry.conditions.length === 0 && !entry.notes) {\n delete next[String(id)];\n } else {\n next[String(id)] = entry;\n }\n setValue({ teeth: next });\n setTouched();\n },\n [teeth, setValue, setTouched],\n );\n\n const markedCount = Object.keys(teeth).length;\n\n if (disabled) {\n return <DentalChartDisplay data={data} />;\n }\n\n return (\n <div className=\"rounded-xl border border-border/60 bg-card shadow-sm\">\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n Click any tooth to mark conditions\n {markedCount > 0 && (\n <span className=\"ml-1 font-medium text-foreground\">\n · {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </span>\n )}\n </p>\n </div>\n {markedCount > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => { setValue({ teeth: {} }); setTouched(); }}\n className=\"h-7 gap-1 text-xs text-destructive hover:text-destructive\"\n >\n <X className=\"h-3 w-3\" />\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} onChange={handleToothChange} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} onChange={handleToothChange} />\n </div>\n </div>\n\n <div className=\"my-2 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\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} onChange={handleToothChange} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} onChange={handleToothChange} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ChartLegend />\n </div>\n </div>\n );\n};\n\n// ─── Minimal display used when field is disabled ──────────────────────────────\n\nfunction DentalChartDisplay({ data }: { data: DentalChartData }) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n if (markedCount === 0) {\n return (\n <div className=\"rounded-xl border border-border/60 bg-card px-4 py-8 text-center text-sm text-muted-foreground shadow-sm\">\n No dental findings recorded\n </div>\n );\n }\n return <DentalChartReadOnly data={data} />;\n}\n\n// ─── Standalone read-only view (also exported for prescription pages) ─────────\n\nexport function DentalChartReadOnly({\n data,\n className,\n}: {\n data: DentalChartData;\n className?: string;\n}) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n\n const usedConditions = new Set(\n Object.values(teeth).flatMap((e) => e.conditions ?? []),\n );\n\n const toothNotes = Object.entries(teeth)\n .filter(([, e]) => e.notes)\n .map(([id, e]) => ({ id: Number(id), label: toothLabel(Number(id)), notes: e.notes! }));\n\n return (\n <div className={cn('rounded-xl border border-border/60 bg-card shadow-sm', className)}>\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n {markedCount > 0 && (\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </p>\n )}\n </div>\n </div>\n\n {markedCount === 0 ? (\n <div className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n No dental findings recorded\n </div>\n ) : (\n <>\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} />\n </div>\n </div>\n\n <div className=\"my-2 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\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {usedConditions.size > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ReadOnlyLegend usedConditions={usedConditions} />\n </div>\n )}\n\n {toothNotes.length > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Tooth Notes</p>\n <div className=\"space-y-1.5\">\n {toothNotes.map(({ id, label, notes }) => (\n <div key={id} className=\"flex gap-2 text-xs\">\n <span className=\"shrink-0 font-medium text-foreground\">{id}</span>\n <span className=\"text-muted-foreground\">{label}:</span>\n <span className=\"text-foreground\">{notes}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Read-only helpers ────────────────────────────────────────────────────────\n\nfunction ReadOnlyTooth({\n id,\n entry,\n isUpper,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const tooltipParts = [\n `Tooth ${id}: ${toothLabel(id)}`,\n conditions.length > 0\n ? conditions.map((c) => CONDITION_CONFIG[c as ToothCondition]?.label ?? c).join(', ')\n : 'Healthy',\n entry?.notes ? `Notes: ${entry.notes}` : null,\n ].filter(Boolean);\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n userSelect: 'none',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <div title={tooltipParts.join('\\n')} style={boxStyle}>\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </div>\n );\n}\n\nfunction ReadOnlyArchRow({\n teeth: toothIds,\n isUpper,\n data,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ReadOnlyTooth id={id} entry={data[String(id)]} isUpper={isUpper} />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ReadOnlyLegend({ usedConditions }: { usedConditions: Set<string> }) {\n const active = ALL_CONDITIONS.filter((c) => usedConditions.has(c));\n if (active.length === 0) return null;\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {active.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/dentalChart.ts","../src/ui/widgets/DentalChartWidget.tsx"],"names":[],"mappings":"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","file":"chunk-VAJR2VBK.mjs","sourcesContent":["import type { ToothCondition, DentalChartData } from './types';\n\nexport const CONDITION_CONFIG: Record<ToothCondition, { label: string; color: string }> = {\n cavity: { label: 'Cavity', color: '#ef4444' },\n filled: { label: 'Filled', color: '#3b82f6' },\n crown: { label: 'Crown', color: '#f59e0b' },\n missing: { label: 'Missing', color: '#9ca3af' },\n root_canal: { label: 'Root Canal (RCT)', color: '#a855f7' },\n bridge: { label: 'Bridge', color: '#f97316' },\n implant: { label: 'Implant', color: '#14b8a6' },\n fractured: { label: 'Fractured', color: '#eab308' },\n impacted: { label: 'Impacted', color: '#6366f1' },\n};\n\nexport const ALL_CONDITIONS = Object.keys(CONDITION_CONFIG) as ToothCondition[];\n\n/** FDI quadrant tooth numbers, ordered from midline outward */\nexport const QUADRANTS = {\n upperRight: [11, 12, 13, 14, 15, 16, 17, 18] as const,\n upperLeft: [21, 22, 23, 24, 25, 26, 27, 28] as const,\n lowerLeft: [31, 32, 33, 34, 35, 36, 37, 38] as const,\n lowerRight: [41, 42, 43, 44, 45, 46, 47, 48] as const,\n};\n\nconst TOOTH_NAMES: Record<number, string> = {\n 11: 'UR Central Incisor', 12: 'UR Lateral Incisor',\n 13: 'UR Canine', 14: 'UR 1st Premolar',\n 15: 'UR 2nd Premolar', 16: 'UR 1st Molar',\n 17: 'UR 2nd Molar', 18: 'UR 3rd Molar',\n 21: 'UL Central Incisor', 22: 'UL Lateral Incisor',\n 23: 'UL Canine', 24: 'UL 1st Premolar',\n 25: 'UL 2nd Premolar', 26: 'UL 1st Molar',\n 27: 'UL 2nd Molar', 28: 'UL 3rd Molar',\n 31: 'LL Central Incisor', 32: 'LL Lateral Incisor',\n 33: 'LL Canine', 34: 'LL 1st Premolar',\n 35: 'LL 2nd Premolar', 36: 'LL 1st Molar',\n 37: 'LL 2nd Molar', 38: 'LL 3rd Molar',\n 41: 'LR Central Incisor', 42: 'LR Lateral Incisor',\n 43: 'LR Canine', 44: 'LR 1st Premolar',\n 45: 'LR 2nd Premolar', 46: 'LR 1st Molar',\n 47: 'LR 2nd Molar', 48: 'LR 3rd Molar',\n};\n\nexport function toothLabel(id: number): string {\n return TOOTH_NAMES[id] ?? `Tooth ${id}`;\n}\n\n/** Conditions that support per-surface location selection. */\nexport const SURFACE_CONDITIONS: readonly ToothCondition[] = ['cavity', 'filled', 'fractured'];\n\n/** Anterior teeth that use \"Incisal\" instead of \"Occlusal\". */\nconst ANTERIOR_TEETH = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/**\n * Returns the ordered surface options for a given FDI tooth number.\n * - Upper jaw → Palatal (teeth 11-28)\n * - Lower jaw → Lingual (teeth 31-48)\n * - Anteriors → Incisal instead of Occlusal\n */\nexport function getToothSurfaces(id: number): string[] {\n const isUpper = id >= 11 && id <= 28;\n const isAnterior = ANTERIOR_TEETH.has(id);\n return [\n 'Buccal',\n 'Mesial',\n 'Distal',\n isAnterior ? 'Incisal' : 'Occlusal',\n isUpper ? 'Palatal' : 'Lingual',\n ];\n}\n\n/** Coerces an unknown value into a valid `DentalChartData` shape. */\nexport function normalizeDentalChart(value: unknown): DentalChartData {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.teeth && typeof v.teeth === 'object' && !Array.isArray(v.teeth)) {\n return value as DentalChartData;\n }\n }\n return { teeth: {} };\n}\n","import React, { useCallback } from 'react';\nimport { X, Trash2 } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Button } from '../shadcn/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../shadcn/popover';\nimport { Textarea } from '../shadcn/textarea';\nimport { useField } from '../../react/useField';\nimport {\n ALL_CONDITIONS,\n CONDITION_CONFIG,\n QUADRANTS,\n SURFACE_CONDITIONS,\n getToothSurfaces,\n normalizeDentalChart,\n toothLabel,\n} from '../../core/dentalChart';\nimport type { DentalChartData, ToothCondition, ToothEntry } from '../../core/types';\n\n// ─── Tooth Editor (inside popover) ───────────────────────────────────────────\n\nfunction ToothEditor({\n id,\n entry,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const surfaces = entry?.surfaces ?? {};\n const notes = entry?.notes ?? '';\n const availableSurfaces = getToothSurfaces(id);\n\n const buildEntry = (\n nextConditions: ToothCondition[],\n nextSurfaces: typeof surfaces,\n nextNotes: string,\n ): ToothEntry => ({\n conditions: nextConditions,\n surfaces: Object.keys(nextSurfaces).length ? nextSurfaces : undefined,\n notes: nextNotes || undefined,\n });\n\n const toggle = (c: ToothCondition) => {\n const isActive = conditions.includes(c);\n const nextConditions = isActive\n ? conditions.filter((x) => x !== c)\n : [...conditions, c];\n // Clear surfaces for a condition being deactivated\n const nextSurfaces = { ...surfaces };\n if (isActive) delete nextSurfaces[c];\n onChange(buildEntry(nextConditions, nextSurfaces, notes));\n };\n\n const toggleSurface = (c: ToothCondition, surface: string) => {\n const current = surfaces[c] ?? [];\n const next = current.includes(surface)\n ? current.filter((s) => s !== surface)\n : [...current, surface];\n const nextSurfaces = { ...surfaces, [c]: next.length ? next : [] };\n onChange(buildEntry(conditions, nextSurfaces, notes));\n };\n\n const updateNotes = (v: string) =>\n onChange(buildEntry(conditions, surfaces, v));\n\n // Conditions active that support surface selection\n const activeSurfaceConditions = SURFACE_CONDITIONS.filter((c) =>\n conditions.includes(c),\n );\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div>\n <p className=\"text-xs font-semibold text-foreground\">Tooth {id}</p>\n <p className=\"text-[10px] text-muted-foreground\">{toothLabel(id)}</p>\n </div>\n {conditions.length > 0 && (\n <button\n type=\"button\"\n onClick={() => onChange({ conditions: [] })}\n className=\"flex shrink-0 items-center gap-1 text-[10px] text-destructive hover:underline\"\n >\n <Trash2 className=\"h-3 w-3\" />\n Clear\n </button>\n )}\n </div>\n\n {/* Condition chips */}\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const active = conditions.includes(c);\n return (\n <button\n key={c}\n type=\"button\"\n onClick={() => toggle(c)}\n className={cn(\n 'rounded-full border px-2.5 py-0.5 text-[10px] font-medium transition-all',\n active\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={active ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {cfg.label}\n </button>\n );\n })}\n </div>\n\n {/* Surface location pickers — one per active surface-eligible condition */}\n {activeSurfaceConditions.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const selected = surfaces[c] ?? [];\n return (\n <div key={c} className=\"space-y-1\">\n <p\n className=\"text-[10px] font-semibold uppercase tracking-wide\"\n style={{ color: cfg.color }}\n >\n {cfg.label} — surfaces\n </p>\n <div className=\"flex flex-wrap gap-1\">\n {availableSurfaces.map((surface) => {\n const on = selected.includes(surface);\n return (\n <button\n key={surface}\n type=\"button\"\n onClick={() => toggleSurface(c, surface)}\n className={cn(\n 'rounded border px-2 py-0.5 text-[10px] font-medium transition-all',\n on\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={on ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {surface}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n\n <Textarea\n value={notes}\n onChange={(e) => updateNotes(e.target.value)}\n placeholder=\"Notes for this tooth…\"\n className=\"h-16 resize-none text-xs\"\n />\n </div>\n );\n}\n\n// ─── Single Tooth Button ──────────────────────────────────────────────────────\n\nfunction ToothButton({\n id,\n entry,\n isUpper,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n cursor: 'pointer',\n userSelect: 'none',\n outline: 'none',\n transition: 'box-shadow 0.15s',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n title={toothLabel(id)}\n style={boxStyle}\n className=\"hover:ring-2 hover:ring-primary/30 focus:ring-2 focus:ring-primary/40\"\n >\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n <PopoverContent className=\"w-72 p-3\" side={isUpper ? 'top' : 'bottom'} align=\"center\" sideOffset={6}>\n <ToothEditor id={id} entry={entry} onChange={onChange} />\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Tooth surface diagram ────────────────────────────────────────────────────\n\nconst ANTERIOR_IDS = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/** Build a surface→color map from an entry's per-condition surface selections. */\nfunction buildSurfaceColorMap(entry: ToothEntry | undefined): Record<string, string> {\n if (!entry?.surfaces) return {};\n const map: Record<string, string> = {};\n for (const cond of SURFACE_CONDITIONS) {\n const surfs = entry.surfaces[cond as ToothCondition];\n if (!surfs?.length) continue;\n const color = CONDITION_CONFIG[cond as ToothCondition]?.color;\n if (!color) continue;\n for (const s of surfs) map[s] = color;\n }\n return map;\n}\n\n/**\n * Small SVG cross-section of a tooth crown (occlusal view).\n * 5 segments: Buccal (top) · Mesial (left) · Distal (right) ·\n * Palatal or Lingual (bottom) · Occlusal or Incisal (centre).\n */\nfunction ToothDiagram({ id, entry }: { id: number; entry: ToothEntry | undefined }) {\n const colorMap = buildSurfaceColorMap(entry);\n const hasSurfaces = Object.keys(colorMap).length > 0;\n\n const isUpper = id >= 11 && id <= 28;\n const bottomLabel = isUpper ? 'Palatal' : 'Lingual';\n const centerLabel = ANTERIOR_IDS.has(id) ? 'Incisal' : 'Occlusal';\n\n // 46 × 46 viewBox; inner corners at 11 and 35\n const S = 46;\n const I = 11;\n const segments = [\n { key: 'Buccal', d: `M0,0 L${S},0 L${S-I},${I} L${I},${I}Z` },\n { key: 'Mesial', d: `M0,0 L0,${S} L${I},${S-I} L${I},${I}Z` },\n { key: 'Distal', d: `M${S},0 L${S},${S} L${S-I},${S-I} L${S-I},${I}Z` },\n { key: bottomLabel, d: `M0,${S} L${S},${S} L${S-I},${S-I} L${I},${S-I}Z` },\n { key: centerLabel, d: `M${I},${I} L${S-I},${I} L${S-I},${S-I} L${I},${S-I}Z` },\n ];\n\n return (\n <svg\n width={S}\n height={S}\n viewBox={`0 0 ${S} ${S}`}\n style={{ flexShrink: 0, opacity: hasSurfaces ? 1 : 0.3 }}\n >\n {segments.map(({ key, d }) => {\n const color = colorMap[key];\n return (\n <path\n key={key}\n d={d}\n fill={color ?? '#f1f5f9'}\n stroke={color ? color : '#cbd5e1'}\n strokeWidth=\"1\"\n strokeLinejoin=\"round\"\n />\n );\n })}\n </svg>\n );\n}\n\n// ─── Arch Row ─────────────────────────────────────────────────────────────────\n\nfunction ArchRow({\n teeth: toothIds,\n isUpper,\n data,\n onChange,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n onChange: (id: number, entry: ToothEntry) => void;\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ToothButton\n id={id}\n entry={data[String(id)]}\n isUpper={isUpper}\n onChange={(entry) => onChange(id, entry)}\n />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\n// ─── Legend ───────────────────────────────────────────────────────────────────\n\nfunction ChartLegend() {\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── Forminator Widget wrapper ────────────────────────────────────────────────\n\nexport const DentalChartWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue, setTouched, disabled } = useField(fieldId);\n const data = normalizeDentalChart(value);\n const teeth = data.teeth;\n\n const handleToothChange = useCallback(\n (id: number, entry: ToothEntry) => {\n const next: DentalChartData['teeth'] = { ...teeth };\n if (entry.conditions.length === 0 && !entry.notes) {\n delete next[String(id)];\n } else {\n next[String(id)] = entry;\n }\n setValue({ teeth: next });\n setTouched();\n },\n [teeth, setValue, setTouched],\n );\n\n const markedCount = Object.keys(teeth).length;\n\n if (disabled) {\n return <DentalChartDisplay data={data} />;\n }\n\n return (\n <div className=\"rounded-xl border border-border/60 bg-card shadow-sm\">\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n Click any tooth to mark conditions\n {markedCount > 0 && (\n <span className=\"ml-1 font-medium text-foreground\">\n · {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </span>\n )}\n </p>\n </div>\n {markedCount > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => { setValue({ teeth: {} }); setTouched(); }}\n className=\"h-7 gap-1 text-xs text-destructive hover:text-destructive\"\n >\n <X className=\"h-3 w-3\" />\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} onChange={handleToothChange} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} onChange={handleToothChange} />\n </div>\n </div>\n\n <div className=\"my-2 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\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} onChange={handleToothChange} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} onChange={handleToothChange} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ChartLegend />\n </div>\n </div>\n );\n};\n\n// ─── Minimal display used when field is disabled ──────────────────────────────\n\nfunction DentalChartDisplay({ data }: { data: DentalChartData }) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n if (markedCount === 0) {\n return (\n <div className=\"rounded-xl border border-border/60 bg-card px-4 py-8 text-center text-sm text-muted-foreground shadow-sm\">\n No dental findings recorded\n </div>\n );\n }\n return <DentalChartReadOnly data={data} />;\n}\n\n// ─── Standalone read-only view (also exported for prescription pages) ─────────\n\nexport function DentalChartReadOnly({\n data,\n className,\n}: {\n data: DentalChartData;\n className?: string;\n}) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n\n const usedConditions = new Set(\n Object.values(teeth).flatMap((e) => e.conditions ?? []),\n );\n\n const toothNotes = Object.entries(teeth)\n .filter(([, e]) => e.notes)\n .map(([id, e]) => ({ id: Number(id), label: toothLabel(Number(id)), notes: e.notes! }));\n\n return (\n <div className={cn('rounded-xl border border-border/60 bg-card shadow-sm', className)}>\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n {markedCount > 0 && (\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </p>\n )}\n </div>\n </div>\n\n {markedCount === 0 ? (\n <div className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n No dental findings recorded\n </div>\n ) : (\n <>\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} />\n </div>\n </div>\n\n <div className=\"my-2 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\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {usedConditions.size > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ReadOnlyLegend usedConditions={usedConditions} />\n </div>\n )}\n\n {toothNotes.length > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Tooth Notes</p>\n <div className=\"space-y-1.5\">\n {toothNotes.map(({ id, label, notes }) => (\n <div key={id} className=\"flex gap-2 text-xs\">\n <span className=\"shrink-0 font-medium text-foreground\">{id}</span>\n <span className=\"text-muted-foreground\">{label}:</span>\n <span className=\"text-foreground\">{notes}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Read-only helpers ────────────────────────────────────────────────────────\n\nfunction ReadOnlyTooth({\n id,\n entry,\n isUpper,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const tooltipParts = [\n `Tooth ${id}: ${toothLabel(id)}`,\n conditions.length > 0\n ? conditions.map((c) => CONDITION_CONFIG[c as ToothCondition]?.label ?? c).join(', ')\n : 'Healthy',\n entry?.notes ? `Notes: ${entry.notes}` : null,\n ].filter(Boolean);\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n userSelect: 'none',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <div title={tooltipParts.join('\\n')} style={boxStyle}>\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </div>\n );\n}\n\nfunction ReadOnlyArchRow({\n teeth: toothIds,\n isUpper,\n data,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ReadOnlyTooth id={id} entry={data[String(id)]} isUpper={isUpper} />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ReadOnlyLegend({ usedConditions }: { usedConditions: Set<string> }) {\n const active = ALL_CONDITIONS.filter((c) => usedConditions.has(c));\n if (active.length === 0) return null;\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {active.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n"]}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
var chunkPHADAQSH_cjs = require('./chunk-PHADAQSH.cjs');
|
|
4
4
|
var chunkP62377LB_cjs = require('./chunk-P62377LB.cjs');
|
|
5
5
|
var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
|
|
6
|
-
var
|
|
7
|
-
var
|
|
6
|
+
var chunkXGO2HG3N_cjs = require('./chunk-XGO2HG3N.cjs');
|
|
7
|
+
var chunkJVIU4OBK_cjs = require('./chunk-JVIU4OBK.cjs');
|
|
8
8
|
var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
|
|
9
9
|
var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
|
|
10
10
|
var React = require('react');
|
|
@@ -143,9 +143,9 @@ function extractNouns(text) {
|
|
|
143
143
|
return cleaned;
|
|
144
144
|
}
|
|
145
145
|
var SmartTextareaWidget = ({ fieldId }) => {
|
|
146
|
-
const { fieldDef, value, setValue, setTouched, error, disabled, touched } =
|
|
147
|
-
const { state } =
|
|
148
|
-
const handler =
|
|
146
|
+
const { fieldDef, value, setValue, setTouched, error, disabled, touched } = chunkJVIU4OBK_cjs.useField(fieldId);
|
|
147
|
+
const { state } = chunkXGO2HG3N_cjs.useForm();
|
|
148
|
+
const handler = chunkJVIU4OBK_cjs.useFieldHandlers(fieldId);
|
|
149
149
|
const def = fieldDef;
|
|
150
150
|
const structured = value;
|
|
151
151
|
const textValue = structured?.text ?? "";
|
|
@@ -232,5 +232,5 @@ var SmartTextareaWidget = ({ fieldId }) => {
|
|
|
232
232
|
|
|
233
233
|
exports.SmartTextareaWidget = SmartTextareaWidget;
|
|
234
234
|
exports.useSmartKeywords = useSmartKeywords;
|
|
235
|
-
//# sourceMappingURL=chunk-
|
|
236
|
-
//# sourceMappingURL=chunk-
|
|
235
|
+
//# sourceMappingURL=chunk-WM43XTEK.cjs.map
|
|
236
|
+
//# sourceMappingURL=chunk-WM43XTEK.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/useSmartKeywords.ts","../src/ui/widgets/SmartTextarea.tsx"],"names":["useState","useRef","useCallback","useEffect","nlp","useField","useForm","useFieldHandlers","useMemo","React","getThemeConfig","cn","isLabelVisible","jsxs","Fragment","jsx","FieldRequiredIndicator","Loader2","Label","fieldLabelClass","fieldWrapperClass","Textarea","fieldControlClass","fieldErrorClass"],"mappings":"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","file":"chunk-RZK44P3C.cjs","sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport nlp from 'compromise';\nimport type { ExtractedKeywordMatch, MatchedCondition } from '../core/types';\n\nexport interface SmartKeywordsResult {\n extractedNouns: string[];\n matchedConditions: ExtractedKeywordMatch[];\n isProcessing: boolean;\n error: string | null;\n}\n\n/**\n * Extracts noun phrases from `text` using compromise, deduplicates, then\n * searches each noun against a backend master table via `onSearch`. Returns\n * the flattened list of keyword-to-master-record matches.\n *\n * All NLP runs client-side; the backend only receives simple query strings.\n */\nexport function useSmartKeywords(\n text: string,\n onSearch: (query: string) => Promise<any[]>,\n debounceDelay = 1000,\n): SmartKeywordsResult {\n // High-level debug of hook usage on each render\n console.log('[useSmartKeywords] render', {\n textLength: text?.length ?? 0,\n hasOnSearch: typeof onSearch === 'function',\n debounceDelay,\n });\n\n const [extractedNouns, setExtractedNouns] = useState<string[]>([]);\n const [matchedConditions, setMatchedConditions] = useState<ExtractedKeywordMatch[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef(0);\n\n const processText = useCallback(\n async (input: string, runId: number) => {\n if (!input || input.trim().length === 0) {\n console.log('[useSmartKeywords] skip empty input', {\n runId,\n inputLength: input?.length ?? 0,\n });\n setExtractedNouns([]);\n setMatchedConditions([]);\n setIsProcessing(false);\n return;\n }\n\n console.log('[useSmartKeywords] processText start', {\n runId,\n inputLength: input.length,\n });\n\n setIsProcessing(true);\n setError(null);\n\n try {\n const nouns = extractNouns(input);\n const uniqueNouns = Array.from(new Set(nouns));\n\n console.log('[useSmartKeywords] extracted nouns', {\n runId,\n nouns,\n uniqueNouns,\n });\n\n if (runId !== abortRef.current) return;\n setExtractedNouns(uniqueNouns);\n\n if (uniqueNouns.length === 0) {\n console.log('[useSmartKeywords] no nouns, skipping search', { runId });\n setMatchedConditions([]);\n setIsProcessing(false);\n return;\n }\n\n const searchResults = await Promise.all(\n uniqueNouns.map(async (noun) => {\n // Normalise the keyword before hitting the backend:\n // - remove newlines\n // - strip leading bullet characters like \"- \"\n // - collapse internal whitespace to single spaces\n const normalised = noun\n .replace(/\\s+/g, ' ')\n .replace(/^[\\s-]+/, '')\n .trim();\n\n try {\n console.log('[useSmartKeywords] onSearch call', { runId, noun, normalised });\n const results: MatchedCondition[] = await onSearch(normalised);\n console.log('[useSmartKeywords] onSearch result', {\n runId,\n noun,\n normalised,\n count: Array.isArray(results) ? results.length : 0,\n });\n // Only keep the first result per noun\n const first = Array.isArray(results) && results.length > 0 ? [results[0]] : [];\n return { keyword: normalised, matches: first };\n } catch (err) {\n console.error('[useSmartKeywords] onSearch error', { runId, noun, err });\n return { keyword: normalised || noun, matches: [] as MatchedCondition[] };\n }\n }),\n );\n\n if (runId !== abortRef.current) return;\n\n const allMatches: ExtractedKeywordMatch[] = searchResults.flatMap(\n ({ keyword, matches }) =>\n matches.map((record) => ({\n extractedKeyword: keyword,\n matchedCondition: {\n id: record.id,\n name: record.name,\n created_at: record.created_at,\n updated_at: record.updated_at,\n },\n })),\n );\n\n console.log('[useSmartKeywords] allMatches computed', {\n runId,\n matchesCount: allMatches.length,\n });\n\n setMatchedConditions(allMatches);\n } catch (err) {\n if (runId !== abortRef.current) return;\n console.error('[useSmartKeywords] processText error', { runId, err });\n setError(err instanceof Error ? err.message : 'Keyword extraction failed');\n } finally {\n if (runId === abortRef.current) {\n console.log('[useSmartKeywords] processText end', { runId });\n setIsProcessing(false);\n }\n }\n },\n [onSearch],\n );\n\n useEffect(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n\n const runId = ++abortRef.current;\n console.log('[useSmartKeywords] schedule debounce', {\n runId,\n debounceDelay,\n textLength: text?.length ?? 0,\n });\n\n timerRef.current = setTimeout(() => {\n console.log('[useSmartKeywords] debounce fired', { runId });\n processText(text, runId);\n }, debounceDelay);\n\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [text, debounceDelay, processText]);\n\n return { extractedNouns, matchedConditions, isProcessing, error };\n}\n\nfunction extractNouns(text: string): string[] {\n const doc = nlp(text);\n const rawNouns: string[] = doc.nouns().out('array');\n\n const cleaned = rawNouns\n .map((n) => n.replace(/[^\\w\\s-]/g, '').trim().toLowerCase())\n .filter((n) => n.length > 2);\n\n console.log('[useSmartKeywords] extractNouns', {\n inputLength: text?.length ?? 0,\n rawNouns,\n cleaned,\n });\n\n return cleaned;\n}\n","import React, { useCallback, useMemo } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { useSmartKeywords } from '../../react/useSmartKeywords';\nimport { Textarea } from '../shadcn/textarea';\nimport { Label } from '../shadcn/label';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport type { SmartTextareaFieldDef, SmartTextareaValue, ExtractedKeywordMatch } from '../../core/types';\nimport { Loader2 } from 'lucide-react';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const SmartTextareaWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const handler = useFieldHandlers(fieldId);\n\n const def = fieldDef as SmartTextareaFieldDef | undefined;\n const structured = value as SmartTextareaValue | null | undefined;\n const textValue = structured?.text ?? '';\n\n const showError = !!error && (touched || state.submitAttempted);\n\n const onSearch = useCallback(\n (query: string) => handler.onSearch(query),\n [handler],\n );\n\n const { matchedConditions, isProcessing } = useSmartKeywords(\n textValue,\n onSearch,\n def?.debounceDelay ?? 1000,\n );\n\n const currentKeywords = structured?.extractedKeywords ?? [];\n\n const nextKeywords = useMemo(() => {\n if (matchedConditions.length === 0 && currentKeywords.length === 0) return currentKeywords;\n if (\n matchedConditions.length === currentKeywords.length &&\n matchedConditions.every(\n (m, i) =>\n m.matchedCondition.id === currentKeywords[i]?.matchedCondition.id &&\n m.extractedKeyword === currentKeywords[i]?.extractedKeyword,\n )\n ) {\n return currentKeywords;\n }\n return matchedConditions;\n }, [matchedConditions, currentKeywords]);\n\n const writeValue = useCallback(\n (text: string, keywords: ExtractedKeywordMatch[]) => {\n const next: SmartTextareaValue = { text, extractedKeywords: keywords };\n setValue(next);\n },\n [setValue],\n );\n\n React.useEffect(() => {\n if (nextKeywords !== currentKeywords) {\n writeValue(textValue, nextKeywords);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nextKeywords]);\n\n const handleTextChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n writeValue(e.target.value, currentKeywords);\n },\n [writeValue, currentKeywords],\n );\n\n if (!def) return null;\n\n const height = def.height;\n const theme = getThemeConfig('textarea', def.theme);\n\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const inputClass = cn(theme?.inputClassName, showError && 'border-red-500');\n const showLabel = isLabelVisible(def);\n\n const labelContent = (\n <>\n {def.label}{' '}\n <FieldRequiredIndicator fieldDef={def} />\n {isProcessing && (\n <Loader2 className=\"inline-block ml-1.5 h-3 w-3 animate-spin text-muted-foreground\" />\n )}\n </>\n );\n\n const labelEl = showLabel ? (\n theme ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(def, labelClass)}>\n {labelContent}\n </Label>\n ) : (\n <Label htmlFor={fieldId} className={fieldLabelClass(def)}>\n {labelContent}\n </Label>\n )\n ) : null;\n\n return (\n <div\n className={fieldWrapperClass(\n def,\n wrapperClass,\n )}\n >\n {labelEl}\n\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={handleTextChange}\n onBlur={setTouched}\n disabled={disabled}\n placeholder={def.placeholder}\n className={fieldControlClass(def, inputClass)}\n aria-label={!showLabel ? def.label : undefined}\n {...(height != null ? { height } : {})}\n />\n\n {showError && (\n <p className={fieldErrorClass(def, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/useSmartKeywords.ts","../src/ui/widgets/SmartTextarea.tsx"],"names":["useState","useRef","useCallback","useEffect","nlp","useField","useForm","useFieldHandlers","useMemo","React","getThemeConfig","cn","isLabelVisible","jsxs","Fragment","jsx","FieldRequiredIndicator","Loader2","Label","fieldLabelClass","fieldWrapperClass","Textarea","fieldControlClass","fieldErrorClass"],"mappings":"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","file":"chunk-WM43XTEK.cjs","sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport nlp from 'compromise';\nimport type { ExtractedKeywordMatch, MatchedCondition } from '../core/types';\n\nexport interface SmartKeywordsResult {\n extractedNouns: string[];\n matchedConditions: ExtractedKeywordMatch[];\n isProcessing: boolean;\n error: string | null;\n}\n\n/**\n * Extracts noun phrases from `text` using compromise, deduplicates, then\n * searches each noun against a backend master table via `onSearch`. Returns\n * the flattened list of keyword-to-master-record matches.\n *\n * All NLP runs client-side; the backend only receives simple query strings.\n */\nexport function useSmartKeywords(\n text: string,\n onSearch: (query: string) => Promise<any[]>,\n debounceDelay = 1000,\n): SmartKeywordsResult {\n // High-level debug of hook usage on each render\n console.log('[useSmartKeywords] render', {\n textLength: text?.length ?? 0,\n hasOnSearch: typeof onSearch === 'function',\n debounceDelay,\n });\n\n const [extractedNouns, setExtractedNouns] = useState<string[]>([]);\n const [matchedConditions, setMatchedConditions] = useState<ExtractedKeywordMatch[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef(0);\n\n const processText = useCallback(\n async (input: string, runId: number) => {\n if (!input || input.trim().length === 0) {\n console.log('[useSmartKeywords] skip empty input', {\n runId,\n inputLength: input?.length ?? 0,\n });\n setExtractedNouns([]);\n setMatchedConditions([]);\n setIsProcessing(false);\n return;\n }\n\n console.log('[useSmartKeywords] processText start', {\n runId,\n inputLength: input.length,\n });\n\n setIsProcessing(true);\n setError(null);\n\n try {\n const nouns = extractNouns(input);\n const uniqueNouns = Array.from(new Set(nouns));\n\n console.log('[useSmartKeywords] extracted nouns', {\n runId,\n nouns,\n uniqueNouns,\n });\n\n if (runId !== abortRef.current) return;\n setExtractedNouns(uniqueNouns);\n\n if (uniqueNouns.length === 0) {\n console.log('[useSmartKeywords] no nouns, skipping search', { runId });\n setMatchedConditions([]);\n setIsProcessing(false);\n return;\n }\n\n const searchResults = await Promise.all(\n uniqueNouns.map(async (noun) => {\n // Normalise the keyword before hitting the backend:\n // - remove newlines\n // - strip leading bullet characters like \"- \"\n // - collapse internal whitespace to single spaces\n const normalised = noun\n .replace(/\\s+/g, ' ')\n .replace(/^[\\s-]+/, '')\n .trim();\n\n try {\n console.log('[useSmartKeywords] onSearch call', { runId, noun, normalised });\n const results: MatchedCondition[] = await onSearch(normalised);\n console.log('[useSmartKeywords] onSearch result', {\n runId,\n noun,\n normalised,\n count: Array.isArray(results) ? results.length : 0,\n });\n // Only keep the first result per noun\n const first = Array.isArray(results) && results.length > 0 ? [results[0]] : [];\n return { keyword: normalised, matches: first };\n } catch (err) {\n console.error('[useSmartKeywords] onSearch error', { runId, noun, err });\n return { keyword: normalised || noun, matches: [] as MatchedCondition[] };\n }\n }),\n );\n\n if (runId !== abortRef.current) return;\n\n const allMatches: ExtractedKeywordMatch[] = searchResults.flatMap(\n ({ keyword, matches }) =>\n matches.map((record) => ({\n extractedKeyword: keyword,\n matchedCondition: {\n id: record.id,\n name: record.name,\n created_at: record.created_at,\n updated_at: record.updated_at,\n },\n })),\n );\n\n console.log('[useSmartKeywords] allMatches computed', {\n runId,\n matchesCount: allMatches.length,\n });\n\n setMatchedConditions(allMatches);\n } catch (err) {\n if (runId !== abortRef.current) return;\n console.error('[useSmartKeywords] processText error', { runId, err });\n setError(err instanceof Error ? err.message : 'Keyword extraction failed');\n } finally {\n if (runId === abortRef.current) {\n console.log('[useSmartKeywords] processText end', { runId });\n setIsProcessing(false);\n }\n }\n },\n [onSearch],\n );\n\n useEffect(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n\n const runId = ++abortRef.current;\n console.log('[useSmartKeywords] schedule debounce', {\n runId,\n debounceDelay,\n textLength: text?.length ?? 0,\n });\n\n timerRef.current = setTimeout(() => {\n console.log('[useSmartKeywords] debounce fired', { runId });\n processText(text, runId);\n }, debounceDelay);\n\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [text, debounceDelay, processText]);\n\n return { extractedNouns, matchedConditions, isProcessing, error };\n}\n\nfunction extractNouns(text: string): string[] {\n const doc = nlp(text);\n const rawNouns: string[] = doc.nouns().out('array');\n\n const cleaned = rawNouns\n .map((n) => n.replace(/[^\\w\\s-]/g, '').trim().toLowerCase())\n .filter((n) => n.length > 2);\n\n console.log('[useSmartKeywords] extractNouns', {\n inputLength: text?.length ?? 0,\n rawNouns,\n cleaned,\n });\n\n return cleaned;\n}\n","import React, { useCallback, useMemo } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { useSmartKeywords } from '../../react/useSmartKeywords';\nimport { Textarea } from '../shadcn/textarea';\nimport { Label } from '../shadcn/label';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport type { SmartTextareaFieldDef, SmartTextareaValue, ExtractedKeywordMatch } from '../../core/types';\nimport { Loader2 } from 'lucide-react';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const SmartTextareaWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const handler = useFieldHandlers(fieldId);\n\n const def = fieldDef as SmartTextareaFieldDef | undefined;\n const structured = value as SmartTextareaValue | null | undefined;\n const textValue = structured?.text ?? '';\n\n const showError = !!error && (touched || state.submitAttempted);\n\n const onSearch = useCallback(\n (query: string) => handler.onSearch(query),\n [handler],\n );\n\n const { matchedConditions, isProcessing } = useSmartKeywords(\n textValue,\n onSearch,\n def?.debounceDelay ?? 1000,\n );\n\n const currentKeywords = structured?.extractedKeywords ?? [];\n\n const nextKeywords = useMemo(() => {\n if (matchedConditions.length === 0 && currentKeywords.length === 0) return currentKeywords;\n if (\n matchedConditions.length === currentKeywords.length &&\n matchedConditions.every(\n (m, i) =>\n m.matchedCondition.id === currentKeywords[i]?.matchedCondition.id &&\n m.extractedKeyword === currentKeywords[i]?.extractedKeyword,\n )\n ) {\n return currentKeywords;\n }\n return matchedConditions;\n }, [matchedConditions, currentKeywords]);\n\n const writeValue = useCallback(\n (text: string, keywords: ExtractedKeywordMatch[]) => {\n const next: SmartTextareaValue = { text, extractedKeywords: keywords };\n setValue(next);\n },\n [setValue],\n );\n\n React.useEffect(() => {\n if (nextKeywords !== currentKeywords) {\n writeValue(textValue, nextKeywords);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nextKeywords]);\n\n const handleTextChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n writeValue(e.target.value, currentKeywords);\n },\n [writeValue, currentKeywords],\n );\n\n if (!def) return null;\n\n const height = def.height;\n const theme = getThemeConfig('textarea', def.theme);\n\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const inputClass = cn(theme?.inputClassName, showError && 'border-red-500');\n const showLabel = isLabelVisible(def);\n\n const labelContent = (\n <>\n {def.label}{' '}\n <FieldRequiredIndicator fieldDef={def} />\n {isProcessing && (\n <Loader2 className=\"inline-block ml-1.5 h-3 w-3 animate-spin text-muted-foreground\" />\n )}\n </>\n );\n\n const labelEl = showLabel ? (\n theme ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(def, labelClass)}>\n {labelContent}\n </Label>\n ) : (\n <Label htmlFor={fieldId} className={fieldLabelClass(def)}>\n {labelContent}\n </Label>\n )\n ) : null;\n\n return (\n <div\n className={fieldWrapperClass(\n def,\n wrapperClass,\n )}\n >\n {labelEl}\n\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={handleTextChange}\n onBlur={setTouched}\n disabled={disabled}\n placeholder={def.placeholder}\n className={fieldControlClass(def, inputClass)}\n aria-label={!showLabel ? def.label : undefined}\n {...(height != null ? { height } : {})}\n />\n\n {showError && (\n <p className={fieldErrorClass(def, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkJVIU4OBK_cjs = require('./chunk-JVIU4OBK.cjs');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
|
|
6
6
|
function useForm() {
|
|
7
|
-
const store =
|
|
7
|
+
const store = chunkJVIU4OBK_cjs.useFormStore();
|
|
8
8
|
const [state, setState] = react.useState(store.getState());
|
|
9
9
|
react.useEffect(() => {
|
|
10
10
|
const unsubscribe = store.subscribe((newState) => {
|
|
@@ -28,5 +28,5 @@ function useForm() {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
exports.useForm = useForm;
|
|
31
|
-
//# sourceMappingURL=chunk-
|
|
32
|
-
//# sourceMappingURL=chunk-
|
|
31
|
+
//# sourceMappingURL=chunk-XGO2HG3N.cjs.map
|
|
32
|
+
//# sourceMappingURL=chunk-XGO2HG3N.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/useForm.ts"],"names":["useFormStore","useState","useEffect"],"mappings":";;;;;AAIO,SAAS,OAAA,GAAU;AACxB,EAAA,MAAM,QAAQA,8BAAA,EAAa;AAE3B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIC,cAAA,CAAoB,KAAA,CAAM,UAAU,CAAA;AAE9D,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,SAAA,CAAU,CAAC,QAAA,KAAa;AAChD,MAAA,QAAA,CAAS,EAAE,GAAG,QAAA,EAAU,CAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA;AAAA,IAC7B,UAAA,EAAY,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,IACvC,oBAAA,EAAsB,MAAM,uBAAA,EAAwB;AAAA,IACpD,cAAA,EAAgB,MAAM,cAAA,EAAe;AAAA,IACrC,mBAAA,EAAqB,KAAA,CAAM,gCAAA,CAAiC,IAAA,CAAK,KAAK,CAAA;AAAA,IACtE,YAAA,EAAc,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAAA,IAC3C,mBAAA,EAAqB,KAAA,CAAM,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA;AAAA,IACzD,mBAAA,EAAqB,KAAA,CAAM,mBAAA,CAAoB,IAAA,CAAK,KAAK;AAAA,GAC3D;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/react/useForm.ts"],"names":["useFormStore","useState","useEffect"],"mappings":";;;;;AAIO,SAAS,OAAA,GAAU;AACxB,EAAA,MAAM,QAAQA,8BAAA,EAAa;AAE3B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIC,cAAA,CAAoB,KAAA,CAAM,UAAU,CAAA;AAE9D,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,SAAA,CAAU,CAAC,QAAA,KAAa;AAChD,MAAA,QAAA,CAAS,EAAE,GAAG,QAAA,EAAU,CAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA;AAAA,IAC7B,UAAA,EAAY,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,IACvC,oBAAA,EAAsB,MAAM,uBAAA,EAAwB;AAAA,IACpD,cAAA,EAAgB,MAAM,cAAA,EAAe;AAAA,IACrC,mBAAA,EAAqB,KAAA,CAAM,gCAAA,CAAiC,IAAA,CAAK,KAAK,CAAA;AAAA,IACtE,YAAA,EAAc,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAAA,IAC3C,mBAAA,EAAqB,KAAA,CAAM,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA;AAAA,IACzD,mBAAA,EAAqB,KAAA,CAAM,mBAAA,CAAoB,IAAA,CAAK,KAAK;AAAA,GAC3D;AACF","file":"chunk-XGO2HG3N.cjs","sourcesContent":["import { useState, useEffect } from \"react\";\nimport { useFormStore } from \"./FormProvider\";\nimport type { FormState } from \"../core/types\";\n\nexport function useForm() {\n const store = useFormStore();\n\n const [state, setState] = useState<FormState>(store.getState());\n\n useEffect(() => {\n const unsubscribe = store.subscribe((newState) => {\n setState({ ...newState });\n });\n return unsubscribe;\n }, [store]);\n\n return {\n state,\n store,\n submit: store.save.bind(store), // Draft save for now\n transition: store.transition.bind(store),\n availableTransitions: store.getAvailableTransitions(),\n hasPersistence: store.hasPersistence(),\n getSerializedValues: store.getSerializedValuesForSubmission.bind(store),\n getRawValues: store.getRawValues.bind(store),\n markSubmitAttempted: store.markSubmitAttempted.bind(store),\n flushPendingUploads: store.flushPendingUploads.bind(store),\n };\n}\n"]}
|