formanitor 0.1.10 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AddInvestigationWidget-G7NPTSFY.cjs +32 -0
- package/dist/AddInvestigationWidget-G7NPTSFY.cjs.map +1 -0
- package/dist/AddInvestigationWidget-TQUKTGAW.mjs +30 -0
- package/dist/AddInvestigationWidget-TQUKTGAW.mjs.map +1 -0
- package/dist/AddMedicationWidget-26RHKIA6.cjs +32 -0
- package/dist/AddMedicationWidget-26RHKIA6.cjs.map +1 -0
- package/dist/AddMedicationWidget-I5UIT3WG.mjs +30 -0
- package/dist/AddMedicationWidget-I5UIT3WG.mjs.map +1 -0
- package/dist/AddProcedureWidget-B6OUF3BM.cjs +278 -0
- package/dist/AddProcedureWidget-B6OUF3BM.cjs.map +1 -0
- package/dist/AddProcedureWidget-NB46COB6.mjs +276 -0
- package/dist/AddProcedureWidget-NB46COB6.mjs.map +1 -0
- package/dist/BiometryIolWorkupWidget-F7HRYMOJ.mjs +298 -0
- package/dist/BiometryIolWorkupWidget-F7HRYMOJ.mjs.map +1 -0
- package/dist/BiometryIolWorkupWidget-TCU4MMVI.cjs +300 -0
- package/dist/BiometryIolWorkupWidget-TCU4MMVI.cjs.map +1 -0
- package/dist/DateTimeWidget-72YUK7PX.cjs +61 -0
- package/dist/DateTimeWidget-72YUK7PX.cjs.map +1 -0
- package/dist/DateTimeWidget-WKQIEQSA.mjs +59 -0
- package/dist/DateTimeWidget-WKQIEQSA.mjs.map +1 -0
- package/dist/DateWidget-K2TVTZ7Z.mjs +72 -0
- package/dist/DateWidget-K2TVTZ7Z.mjs.map +1 -0
- package/dist/DateWidget-SYDMSGWO.cjs +74 -0
- package/dist/DateWidget-SYDMSGWO.cjs.map +1 -0
- package/dist/DiagnosisTextareaWidget-RD65PGDY.mjs +184 -0
- package/dist/DiagnosisTextareaWidget-RD65PGDY.mjs.map +1 -0
- package/dist/DiagnosisTextareaWidget-UKWLE2SQ.cjs +190 -0
- package/dist/DiagnosisTextareaWidget-UKWLE2SQ.cjs.map +1 -0
- package/dist/DifferentialDiagnosisWidget-FENJP245.mjs +15 -0
- package/dist/DifferentialDiagnosisWidget-FENJP245.mjs.map +1 -0
- package/dist/DifferentialDiagnosisWidget-ZGFXP2BH.cjs +17 -0
- package/dist/DifferentialDiagnosisWidget-ZGFXP2BH.cjs.map +1 -0
- package/dist/DischargeMedicationOrdersWidget-26ALTGJM.mjs +161 -0
- package/dist/DischargeMedicationOrdersWidget-26ALTGJM.mjs.map +1 -0
- package/dist/DischargeMedicationOrdersWidget-B4CJQ3QS.cjs +163 -0
- package/dist/DischargeMedicationOrdersWidget-B4CJQ3QS.cjs.map +1 -0
- package/dist/EditableTable-LPAYCK36.mjs +279 -0
- package/dist/EditableTable-LPAYCK36.mjs.map +1 -0
- package/dist/EditableTable-YB4IC3ZK.cjs +281 -0
- package/dist/EditableTable-YB4IC3ZK.cjs.map +1 -0
- package/dist/FollowupWidget-EEKOI2TW.cjs +285 -0
- package/dist/FollowupWidget-EEKOI2TW.cjs.map +1 -0
- package/dist/FollowupWidget-NJ4QDBOG.mjs +283 -0
- package/dist/FollowupWidget-NJ4QDBOG.mjs.map +1 -0
- package/dist/FunctionalImpairmentScoreWidget-HAAPCMIS.cjs +93 -0
- package/dist/FunctionalImpairmentScoreWidget-HAAPCMIS.cjs.map +1 -0
- package/dist/FunctionalImpairmentScoreWidget-ZNLKKBYN.mjs +91 -0
- package/dist/FunctionalImpairmentScoreWidget-ZNLKKBYN.mjs.map +1 -0
- package/dist/GsExaminationWidget-EX6C3EF5.cjs +528 -0
- package/dist/GsExaminationWidget-EX6C3EF5.cjs.map +1 -0
- package/dist/GsExaminationWidget-MEIUHRQQ.mjs +526 -0
- package/dist/GsExaminationWidget-MEIUHRQQ.mjs.map +1 -0
- package/dist/GsGradingWidget-4UPOEYNL.mjs +90 -0
- package/dist/GsGradingWidget-4UPOEYNL.mjs.map +1 -0
- package/dist/GsGradingWidget-IV3UF63W.cjs +92 -0
- package/dist/GsGradingWidget-IV3UF63W.cjs.map +1 -0
- package/dist/GsSmartHistoryWidget-7QNJZEI4.cjs +398 -0
- package/dist/GsSmartHistoryWidget-7QNJZEI4.cjs.map +1 -0
- package/dist/GsSmartHistoryWidget-LGN7W2AV.mjs +396 -0
- package/dist/GsSmartHistoryWidget-LGN7W2AV.mjs.map +1 -0
- package/dist/HiddenVitalsWidget-AMH32HT2.cjs +55 -0
- package/dist/HiddenVitalsWidget-AMH32HT2.cjs.map +1 -0
- package/dist/HiddenVitalsWidget-W23IFSEF.mjs +53 -0
- package/dist/HiddenVitalsWidget-W23IFSEF.mjs.map +1 -0
- package/dist/LensAssessmentWidget-LSHBUTT5.cjs +234 -0
- package/dist/LensAssessmentWidget-LSHBUTT5.cjs.map +1 -0
- package/dist/LensAssessmentWidget-SJ6YUTSN.mjs +232 -0
- package/dist/LensAssessmentWidget-SJ6YUTSN.mjs.map +1 -0
- package/dist/MarMedicationOrdersWidget-IKMAFPRG.mjs +74 -0
- package/dist/MarMedicationOrdersWidget-IKMAFPRG.mjs.map +1 -0
- package/dist/MarMedicationOrdersWidget-ZKZLSZRN.cjs +76 -0
- package/dist/MarMedicationOrdersWidget-ZKZLSZRN.cjs.map +1 -0
- package/dist/OBGExaminationWidget-BK4ERETW.mjs +213 -0
- package/dist/OBGExaminationWidget-BK4ERETW.mjs.map +1 -0
- package/dist/OBGExaminationWidget-SMFZ2WCL.cjs +215 -0
- package/dist/OBGExaminationWidget-SMFZ2WCL.cjs.map +1 -0
- package/dist/OBGPathwayWidget-5YTUDBEH.cjs +519 -0
- package/dist/OBGPathwayWidget-5YTUDBEH.cjs.map +1 -0
- package/dist/OBGPathwayWidget-U5BCAESB.mjs +517 -0
- package/dist/OBGPathwayWidget-U5BCAESB.mjs.map +1 -0
- package/dist/ObstetricHistoryWidget-GC63CB3U.cjs +1115 -0
- package/dist/ObstetricHistoryWidget-GC63CB3U.cjs.map +1 -0
- package/dist/ObstetricHistoryWidget-WD572Q7H.mjs +1113 -0
- package/dist/ObstetricHistoryWidget-WD572Q7H.mjs.map +1 -0
- package/dist/OphthalDiagnosisWidget-QXFK446I.cjs +91 -0
- package/dist/OphthalDiagnosisWidget-QXFK446I.cjs.map +1 -0
- package/dist/OphthalDiagnosisWidget-Y3AHD6AG.mjs +89 -0
- package/dist/OphthalDiagnosisWidget-Y3AHD6AG.mjs.map +1 -0
- package/dist/OphthalmologyWidget-CRQMN5QU.mjs +1329 -0
- package/dist/OphthalmologyWidget-CRQMN5QU.mjs.map +1 -0
- package/dist/OphthalmologyWidget-U2HQMZ4J.cjs +1331 -0
- package/dist/OphthalmologyWidget-U2HQMZ4J.cjs.map +1 -0
- package/dist/OrthopedicExamWidget-LP7VN3W5.cjs +368 -0
- package/dist/OrthopedicExamWidget-LP7VN3W5.cjs.map +1 -0
- package/dist/OrthopedicExamWidget-PAOIVU6Z.mjs +366 -0
- package/dist/OrthopedicExamWidget-PAOIVU6Z.mjs.map +1 -0
- package/dist/PainScaleFlagsWidget-IBNGVVHD.cjs +153 -0
- package/dist/PainScaleFlagsWidget-IBNGVVHD.cjs.map +1 -0
- package/dist/PainScaleFlagsWidget-MRMQ7HPJ.mjs +151 -0
- package/dist/PainScaleFlagsWidget-MRMQ7HPJ.mjs.map +1 -0
- package/dist/ReadOnlyTable-4Y2XW4MX.mjs +6 -0
- package/dist/ReadOnlyTable-4Y2XW4MX.mjs.map +1 -0
- package/dist/ReadOnlyTable-L7G6GWEJ.cjs +15 -0
- package/dist/ReadOnlyTable-L7G6GWEJ.cjs.map +1 -0
- package/dist/ReferralWidget-IYTS32TS.mjs +169 -0
- package/dist/ReferralWidget-IYTS32TS.mjs.map +1 -0
- package/dist/ReferralWidget-PDNEKHFO.cjs +171 -0
- package/dist/ReferralWidget-PDNEKHFO.cjs.map +1 -0
- package/dist/RichTextWidget-5OOJ2LJN.mjs +11 -0
- package/dist/RichTextWidget-5OOJ2LJN.mjs.map +1 -0
- package/dist/RichTextWidget-XWLOHKLE.cjs +24 -0
- package/dist/RichTextWidget-XWLOHKLE.cjs.map +1 -0
- package/dist/SmartTextarea-L7Q4CORK.cjs +19 -0
- package/dist/SmartTextarea-L7Q4CORK.cjs.map +1 -0
- package/dist/SmartTextarea-ZCXGMZLG.mjs +10 -0
- package/dist/SmartTextarea-ZCXGMZLG.mjs.map +1 -0
- package/dist/SuggestionTextareaWidget-2TEITBPF.cjs +226 -0
- package/dist/SuggestionTextareaWidget-2TEITBPF.cjs.map +1 -0
- package/dist/SuggestionTextareaWidget-RN5LZYFC.mjs +215 -0
- package/dist/SuggestionTextareaWidget-RN5LZYFC.mjs.map +1 -0
- package/dist/SurgicalRiskFlagsWidget-DBICX4MB.mjs +144 -0
- package/dist/SurgicalRiskFlagsWidget-DBICX4MB.mjs.map +1 -0
- package/dist/SurgicalRiskFlagsWidget-JCSL3GWS.cjs +146 -0
- package/dist/SurgicalRiskFlagsWidget-JCSL3GWS.cjs.map +1 -0
- package/dist/UrologyExaminationWidget-74L3IN2X.cjs +273 -0
- package/dist/UrologyExaminationWidget-74L3IN2X.cjs.map +1 -0
- package/dist/UrologyExaminationWidget-IQEBP6CI.mjs +271 -0
- package/dist/UrologyExaminationWidget-IQEBP6CI.mjs.map +1 -0
- package/dist/UrologyPathwayWidget-S4QY6RD6.mjs +153 -0
- package/dist/UrologyPathwayWidget-S4QY6RD6.mjs.map +1 -0
- package/dist/UrologyPathwayWidget-UJY5EW2G.cjs +155 -0
- package/dist/UrologyPathwayWidget-UJY5EW2G.cjs.map +1 -0
- package/dist/UrologySmartHistoryWidget-NFTHHK6A.mjs +469 -0
- package/dist/UrologySmartHistoryWidget-NFTHHK6A.mjs.map +1 -0
- package/dist/UrologySmartHistoryWidget-XKZF63BV.cjs +471 -0
- package/dist/UrologySmartHistoryWidget-XKZF63BV.cjs.map +1 -0
- package/dist/VitalsWidget-44UWQGIF.cjs +208 -0
- package/dist/VitalsWidget-44UWQGIF.cjs.map +1 -0
- package/dist/VitalsWidget-MBYDGC7U.mjs +187 -0
- package/dist/VitalsWidget-MBYDGC7U.mjs.map +1 -0
- package/dist/chunk-4BAKQIPJ.mjs +27 -0
- package/dist/chunk-4BAKQIPJ.mjs.map +1 -0
- package/dist/chunk-4KSZUIJE.cjs +143 -0
- package/dist/chunk-4KSZUIJE.cjs.map +1 -0
- package/dist/chunk-4PMNVBJD.mjs +121 -0
- package/dist/chunk-4PMNVBJD.mjs.map +1 -0
- package/dist/chunk-5E3APMY6.cjs +54 -0
- package/dist/chunk-5E3APMY6.cjs.map +1 -0
- package/dist/chunk-AIZ3XYEZ.cjs +551 -0
- package/dist/chunk-AIZ3XYEZ.cjs.map +1 -0
- package/dist/chunk-AZHTIUOL.mjs +116 -0
- package/dist/chunk-AZHTIUOL.mjs.map +1 -0
- package/dist/chunk-AZSAPO2V.cjs +174 -0
- package/dist/chunk-AZSAPO2V.cjs.map +1 -0
- package/dist/chunk-AZVJU7NZ.mjs +137 -0
- package/dist/chunk-AZVJU7NZ.mjs.map +1 -0
- package/dist/chunk-B3GBIAHZ.mjs +285 -0
- package/dist/chunk-B3GBIAHZ.mjs.map +1 -0
- package/dist/chunk-BMNY7F6H.mjs +148 -0
- package/dist/chunk-BMNY7F6H.mjs.map +1 -0
- package/dist/chunk-BU4ZEAAP.mjs +102 -0
- package/dist/chunk-BU4ZEAAP.mjs.map +1 -0
- package/dist/chunk-CTW65YW2.cjs +388 -0
- package/dist/chunk-CTW65YW2.cjs.map +1 -0
- package/dist/chunk-DE7VZVKR.cjs +140 -0
- package/dist/chunk-DE7VZVKR.cjs.map +1 -0
- package/dist/chunk-DZYV47QC.mjs +54 -0
- package/dist/chunk-DZYV47QC.mjs.map +1 -0
- package/dist/chunk-E7WUDHSA.cjs +127 -0
- package/dist/chunk-E7WUDHSA.cjs.map +1 -0
- package/dist/chunk-FHHISVCH.cjs +13 -0
- package/dist/chunk-FHHISVCH.cjs.map +1 -0
- package/dist/chunk-FZEEWRW3.cjs +77 -0
- package/dist/chunk-FZEEWRW3.cjs.map +1 -0
- package/dist/chunk-GFDE2KZC.mjs +228 -0
- package/dist/chunk-GFDE2KZC.mjs.map +1 -0
- package/dist/chunk-GNZWSVTB.mjs +29 -0
- package/dist/chunk-GNZWSVTB.mjs.map +1 -0
- package/dist/chunk-GXXWMHAA.mjs +49 -0
- package/dist/chunk-GXXWMHAA.mjs.map +1 -0
- package/dist/chunk-GZPCYSJK.mjs +104 -0
- package/dist/chunk-GZPCYSJK.mjs.map +1 -0
- package/dist/chunk-HEFZA2AH.mjs +22 -0
- package/dist/chunk-HEFZA2AH.mjs.map +1 -0
- package/dist/chunk-I4AV6BQF.mjs +10 -0
- package/dist/chunk-I4AV6BQF.mjs.map +1 -0
- package/dist/chunk-IDSBJOFY.cjs +1885 -0
- package/dist/chunk-IDSBJOFY.cjs.map +1 -0
- package/dist/chunk-IFMQKLNW.mjs +39 -0
- package/dist/chunk-IFMQKLNW.mjs.map +1 -0
- package/dist/chunk-IFSKLIS2.cjs +12 -0
- package/dist/chunk-IFSKLIS2.cjs.map +1 -0
- package/dist/chunk-IKAKE7TR.mjs +527 -0
- package/dist/chunk-IKAKE7TR.mjs.map +1 -0
- package/dist/chunk-JE6VXRWW.cjs +86 -0
- package/dist/chunk-JE6VXRWW.cjs.map +1 -0
- package/dist/chunk-JMGUUFOJ.cjs +45 -0
- package/dist/chunk-JMGUUFOJ.cjs.map +1 -0
- package/dist/chunk-JNVSA77L.cjs +236 -0
- package/dist/chunk-JNVSA77L.cjs.map +1 -0
- package/dist/chunk-KJA5BLGX.cjs +31 -0
- package/dist/chunk-KJA5BLGX.cjs.map +1 -0
- package/dist/chunk-KMJOTMUQ.cjs +109 -0
- package/dist/chunk-KMJOTMUQ.cjs.map +1 -0
- package/dist/chunk-KPGTPJDH.cjs +32 -0
- package/dist/chunk-KPGTPJDH.cjs.map +1 -0
- package/dist/chunk-LBWB7MYU.cjs +287 -0
- package/dist/chunk-LBWB7MYU.cjs.map +1 -0
- package/dist/chunk-LGGOBIEA.mjs +61 -0
- package/dist/chunk-LGGOBIEA.mjs.map +1 -0
- package/dist/chunk-LQYWMYEC.mjs +28 -0
- package/dist/chunk-LQYWMYEC.mjs.map +1 -0
- package/dist/chunk-MIUUO4CI.mjs +361 -0
- package/dist/chunk-MIUUO4CI.mjs.map +1 -0
- package/dist/chunk-N4L76SHJ.cjs +65 -0
- package/dist/chunk-N4L76SHJ.cjs.map +1 -0
- package/dist/chunk-NJJTIL3U.cjs +73 -0
- package/dist/chunk-NJJTIL3U.cjs.map +1 -0
- package/dist/chunk-O3VQBPEW.cjs +72 -0
- package/dist/chunk-O3VQBPEW.cjs.map +1 -0
- package/dist/chunk-P62377LB.cjs +27 -0
- package/dist/chunk-P62377LB.cjs.map +1 -0
- package/dist/chunk-PHADAQSH.cjs +49 -0
- package/dist/chunk-PHADAQSH.cjs.map +1 -0
- package/dist/chunk-PZBJYPWW.cjs +52 -0
- package/dist/chunk-PZBJYPWW.cjs.map +1 -0
- package/dist/chunk-QKJ7BQSR.cjs +538 -0
- package/dist/chunk-QKJ7BQSR.cjs.map +1 -0
- package/dist/chunk-QS6WG2XJ.cjs +56 -0
- package/dist/chunk-QS6WG2XJ.cjs.map +1 -0
- package/dist/chunk-S7EMPE2D.cjs +104 -0
- package/dist/chunk-S7EMPE2D.cjs.map +1 -0
- package/dist/chunk-SCMXLRX5.mjs +42 -0
- package/dist/chunk-SCMXLRX5.mjs.map +1 -0
- package/dist/chunk-TJHG5WHX.cjs +47 -0
- package/dist/chunk-TJHG5WHX.cjs.map +1 -0
- package/dist/chunk-UGGUIXUS.cjs +41 -0
- package/dist/chunk-UGGUIXUS.cjs.map +1 -0
- package/dist/chunk-UULLSS4O.mjs +82 -0
- package/dist/chunk-UULLSS4O.mjs.map +1 -0
- package/dist/chunk-VNFBUAZD.mjs +25 -0
- package/dist/chunk-VNFBUAZD.mjs.map +1 -0
- package/dist/chunk-VPU66PI6.mjs +11 -0
- package/dist/chunk-VPU66PI6.mjs.map +1 -0
- package/dist/chunk-WYVXXEZI.mjs +46 -0
- package/dist/chunk-WYVXXEZI.mjs.map +1 -0
- package/dist/chunk-XDUVO3IZ.mjs +547 -0
- package/dist/chunk-XDUVO3IZ.mjs.map +1 -0
- package/dist/chunk-XR2ZM654.mjs +30 -0
- package/dist/chunk-XR2ZM654.mjs.map +1 -0
- package/dist/chunk-Y7TIWH4I.mjs +25 -0
- package/dist/chunk-Y7TIWH4I.mjs.map +1 -0
- package/dist/chunk-YEFM2ERQ.cjs +143 -0
- package/dist/chunk-YEFM2ERQ.cjs.map +1 -0
- package/dist/chunk-YYPMIUDW.mjs +69 -0
- package/dist/chunk-YYPMIUDW.mjs.map +1 -0
- package/dist/chunk-ZGPHTPAN.mjs +1851 -0
- package/dist/chunk-ZGPHTPAN.mjs.map +1 -0
- package/dist/chunk-ZSOIQVB3.mjs +75 -0
- package/dist/chunk-ZSOIQVB3.mjs.map +1 -0
- package/dist/index.cjs +1596 -14537
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -767
- package/dist/index.d.ts +4 -767
- package/dist/index.mjs +1358 -14346
- package/dist/index.mjs.map +1 -1
- package/dist/read-only-table.cjs +15 -0
- package/dist/read-only-table.cjs.map +1 -0
- package/dist/read-only-table.d.cts +10 -0
- package/dist/read-only-table.d.ts +10 -0
- package/dist/read-only-table.mjs +6 -0
- package/dist/read-only-table.mjs.map +1 -0
- package/dist/rich-text.cjs +24 -0
- package/dist/rich-text.cjs.map +1 -0
- package/dist/rich-text.d.cts +8 -0
- package/dist/rich-text.d.ts +8 -0
- package/dist/rich-text.mjs +11 -0
- package/dist/rich-text.mjs.map +1 -0
- package/dist/richTextClassName--8wkuHkW.d.cts +10 -0
- package/dist/richTextClassName--8wkuHkW.d.ts +10 -0
- package/dist/smart.cjs +23 -0
- package/dist/smart.cjs.map +1 -0
- package/dist/smart.d.cts +23 -0
- package/dist/smart.d.ts +23 -0
- package/dist/smart.mjs +10 -0
- package/dist/smart.mjs.map +1 -0
- package/dist/types-D0iYXUOo.d.cts +736 -0
- package/dist/types-D0iYXUOo.d.ts +736 -0
- package/package.json +20 -2
- package/src/styles/index.css +35 -2
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { getThemeConfig } from './chunk-Y7TIWH4I.mjs';
|
|
2
|
+
import { isLabelVisible, FieldRequiredIndicator, fieldLabelClass, fieldDescriptionClass, fieldControlClass, fieldErrorClass, fieldWrapperClass } from './chunk-WYVXXEZI.mjs';
|
|
3
|
+
import { useForm } from './chunk-XR2ZM654.mjs';
|
|
4
|
+
import { Button } from './chunk-GXXWMHAA.mjs';
|
|
5
|
+
import { useField, useFieldHandlers } from './chunk-ZGPHTPAN.mjs';
|
|
6
|
+
import { Label } from './chunk-HEFZA2AH.mjs';
|
|
7
|
+
import { cn } from './chunk-VPU66PI6.mjs';
|
|
8
|
+
import { useCallback } from 'react';
|
|
9
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
var MarMedicationOrdersWidget = ({ fieldId }) => {
|
|
12
|
+
const { fieldDef, value, setTouched, error, disabled, touched } = useField(fieldId);
|
|
13
|
+
const { state } = useForm();
|
|
14
|
+
const handlers = useFieldHandlers(fieldId);
|
|
15
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
16
|
+
const onOpen = useCallback(async () => {
|
|
17
|
+
await handlers.onOpenMedicationOrders?.();
|
|
18
|
+
setTouched();
|
|
19
|
+
}, [handlers, setTouched]);
|
|
20
|
+
if (!fieldDef || fieldDef.type !== "textarea") return null;
|
|
21
|
+
const textDef = fieldDef;
|
|
22
|
+
const height = textDef.height;
|
|
23
|
+
const theme = getThemeConfig("textarea", fieldDef.theme);
|
|
24
|
+
const wrapperClass = theme?.wrapperClassName ?? "space-y-2";
|
|
25
|
+
const labelClass = theme?.labelClassName;
|
|
26
|
+
const showLabel = isLabelVisible(fieldDef);
|
|
27
|
+
const labelContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
28
|
+
fieldDef.label,
|
|
29
|
+
" ",
|
|
30
|
+
/* @__PURE__ */ jsx(FieldRequiredIndicator, { fieldDef })
|
|
31
|
+
] });
|
|
32
|
+
const labelEl = showLabel ? theme ? /* @__PURE__ */ jsx(Label, { htmlFor: fieldId, className: fieldLabelClass(fieldDef, labelClass), children: labelContent }) : /* @__PURE__ */ jsx(Label, { htmlFor: fieldId, className: fieldLabelClass(fieldDef), children: labelContent }) : null;
|
|
33
|
+
const text = typeof value === "string" ? value : value == null ? "" : String(value);
|
|
34
|
+
const hasHandler = typeof handlers.onOpenMedicationOrders === "function";
|
|
35
|
+
return /* @__PURE__ */ jsxs("div", { className: fieldWrapperClass(fieldDef, wrapperClass), children: [
|
|
36
|
+
labelEl,
|
|
37
|
+
fieldDef.description && /* @__PURE__ */ jsx("p", { className: fieldDescriptionClass(fieldDef, "text-sm text-muted-foreground"), children: fieldDef.description }),
|
|
38
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-3", children: [
|
|
39
|
+
/* @__PURE__ */ jsx(
|
|
40
|
+
"div",
|
|
41
|
+
{
|
|
42
|
+
id: fieldId,
|
|
43
|
+
className: fieldControlClass(
|
|
44
|
+
fieldDef,
|
|
45
|
+
cn(
|
|
46
|
+
"min-h-[80px] flex-1 rounded-md border border-input bg-background px-3 py-2 text-sm whitespace-pre-wrap",
|
|
47
|
+
showError && "border-red-500",
|
|
48
|
+
!text && "text-muted-foreground"
|
|
49
|
+
)
|
|
50
|
+
),
|
|
51
|
+
style: height != null ? { minHeight: height } : void 0,
|
|
52
|
+
"aria-readonly": "true",
|
|
53
|
+
children: text || fieldDef.placeholder || "No medication orders added."
|
|
54
|
+
}
|
|
55
|
+
),
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
Button,
|
|
58
|
+
{
|
|
59
|
+
type: "button",
|
|
60
|
+
variant: "default",
|
|
61
|
+
disabled: disabled || !hasHandler,
|
|
62
|
+
onClick: onOpen,
|
|
63
|
+
className: "shrink-0 sm:mt-0",
|
|
64
|
+
children: "Add medication orders"
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
] }),
|
|
68
|
+
showError && /* @__PURE__ */ jsx("p", { className: fieldErrorClass(fieldDef, "text-xs text-red-500"), children: error })
|
|
69
|
+
] });
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export { MarMedicationOrdersWidget };
|
|
73
|
+
//# sourceMappingURL=MarMedicationOrdersWidget-IKMAFPRG.mjs.map
|
|
74
|
+
//# sourceMappingURL=MarMedicationOrdersWidget-IKMAFPRG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/MarMedicationOrdersWidget.tsx"],"names":[],"mappings":"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","file":"MarMedicationOrdersWidget-IKMAFPRG.mjs","sourcesContent":["import React, { useCallback } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { Label } from '../shadcn/label';\nimport { Button } from '../shadcn/button';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport type { TextFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldDescriptionClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const MarMedicationOrdersWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const handlers = useFieldHandlers(fieldId);\n\n const showError = !!error && (touched || state.submitAttempted);\n\n const onOpen = useCallback(async () => {\n await handlers.onOpenMedicationOrders?.();\n setTouched();\n }, [handlers, setTouched]);\n\n if (!fieldDef || fieldDef.type !== 'textarea') return null;\n\n const textDef = fieldDef as TextFieldDef;\n const height = textDef.height;\n const theme = getThemeConfig('textarea', fieldDef.theme);\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label} <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = showLabel ? (\n theme ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef, labelClass)}>\n {labelContent}\n </Label>\n ) : (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n )\n ) : null;\n\n const text = typeof value === 'string' ? value : value == null ? '' : String(value);\n const hasHandler = typeof handlers.onOpenMedicationOrders === 'function';\n\n return (\n <div className={fieldWrapperClass(fieldDef, wrapperClass)}>\n {labelEl}\n {fieldDef.description && (\n <p className={fieldDescriptionClass(fieldDef, 'text-sm text-muted-foreground')}>\n {fieldDef.description}\n </p>\n )}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-3\">\n <div\n id={fieldId}\n className={fieldControlClass(\n fieldDef,\n cn(\n 'min-h-[80px] flex-1 rounded-md border border-input bg-background px-3 py-2 text-sm whitespace-pre-wrap',\n showError && 'border-red-500',\n !text && 'text-muted-foreground',\n ),\n )}\n style={height != null ? { minHeight: height } : undefined}\n aria-readonly=\"true\"\n >\n {text || fieldDef.placeholder || 'No medication orders added.'}\n </div>\n <Button\n type=\"button\"\n variant=\"default\"\n disabled={disabled || !hasHandler}\n onClick={onOpen}\n className=\"shrink-0 sm:mt-0\"\n >\n Add medication orders\n </Button>\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkP62377LB_cjs = require('./chunk-P62377LB.cjs');
|
|
4
|
+
var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
|
|
5
|
+
var chunkKPGTPJDH_cjs = require('./chunk-KPGTPJDH.cjs');
|
|
6
|
+
var chunkO3VQBPEW_cjs = require('./chunk-O3VQBPEW.cjs');
|
|
7
|
+
var chunkIDSBJOFY_cjs = require('./chunk-IDSBJOFY.cjs');
|
|
8
|
+
var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
|
|
9
|
+
var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
|
|
10
|
+
var react = require('react');
|
|
11
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
12
|
+
|
|
13
|
+
var MarMedicationOrdersWidget = ({ fieldId }) => {
|
|
14
|
+
const { fieldDef, value, setTouched, error, disabled, touched } = chunkIDSBJOFY_cjs.useField(fieldId);
|
|
15
|
+
const { state } = chunkKPGTPJDH_cjs.useForm();
|
|
16
|
+
const handlers = chunkIDSBJOFY_cjs.useFieldHandlers(fieldId);
|
|
17
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
18
|
+
const onOpen = react.useCallback(async () => {
|
|
19
|
+
await handlers.onOpenMedicationOrders?.();
|
|
20
|
+
setTouched();
|
|
21
|
+
}, [handlers, setTouched]);
|
|
22
|
+
if (!fieldDef || fieldDef.type !== "textarea") return null;
|
|
23
|
+
const textDef = fieldDef;
|
|
24
|
+
const height = textDef.height;
|
|
25
|
+
const theme = chunkP62377LB_cjs.getThemeConfig("textarea", fieldDef.theme);
|
|
26
|
+
const wrapperClass = theme?.wrapperClassName ?? "space-y-2";
|
|
27
|
+
const labelClass = theme?.labelClassName;
|
|
28
|
+
const showLabel = chunk5E3APMY6_cjs.isLabelVisible(fieldDef);
|
|
29
|
+
const labelContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
30
|
+
fieldDef.label,
|
|
31
|
+
" ",
|
|
32
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk5E3APMY6_cjs.FieldRequiredIndicator, { fieldDef })
|
|
33
|
+
] });
|
|
34
|
+
const labelEl = showLabel ? theme ? /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { htmlFor: fieldId, className: chunk5E3APMY6_cjs.fieldLabelClass(fieldDef, labelClass), children: labelContent }) : /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { htmlFor: fieldId, className: chunk5E3APMY6_cjs.fieldLabelClass(fieldDef), children: labelContent }) : null;
|
|
35
|
+
const text = typeof value === "string" ? value : value == null ? "" : String(value);
|
|
36
|
+
const hasHandler = typeof handlers.onOpenMedicationOrders === "function";
|
|
37
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5E3APMY6_cjs.fieldWrapperClass(fieldDef, wrapperClass), children: [
|
|
38
|
+
labelEl,
|
|
39
|
+
fieldDef.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldDescriptionClass(fieldDef, "text-sm text-muted-foreground"), children: fieldDef.description }),
|
|
40
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-3", children: [
|
|
41
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
id: fieldId,
|
|
45
|
+
className: chunk5E3APMY6_cjs.fieldControlClass(
|
|
46
|
+
fieldDef,
|
|
47
|
+
chunkFHHISVCH_cjs.cn(
|
|
48
|
+
"min-h-[80px] flex-1 rounded-md border border-input bg-background px-3 py-2 text-sm whitespace-pre-wrap",
|
|
49
|
+
showError && "border-red-500",
|
|
50
|
+
!text && "text-muted-foreground"
|
|
51
|
+
)
|
|
52
|
+
),
|
|
53
|
+
style: height != null ? { minHeight: height } : void 0,
|
|
54
|
+
"aria-readonly": "true",
|
|
55
|
+
children: text || fieldDef.placeholder || "No medication orders added."
|
|
56
|
+
}
|
|
57
|
+
),
|
|
58
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
59
|
+
chunkO3VQBPEW_cjs.Button,
|
|
60
|
+
{
|
|
61
|
+
type: "button",
|
|
62
|
+
variant: "default",
|
|
63
|
+
disabled: disabled || !hasHandler,
|
|
64
|
+
onClick: onOpen,
|
|
65
|
+
className: "shrink-0 sm:mt-0",
|
|
66
|
+
children: "Add medication orders"
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
] }),
|
|
70
|
+
showError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldErrorClass(fieldDef, "text-xs text-red-500"), children: error })
|
|
71
|
+
] });
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
exports.MarMedicationOrdersWidget = MarMedicationOrdersWidget;
|
|
75
|
+
//# sourceMappingURL=MarMedicationOrdersWidget-ZKZLSZRN.cjs.map
|
|
76
|
+
//# sourceMappingURL=MarMedicationOrdersWidget-ZKZLSZRN.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/MarMedicationOrdersWidget.tsx"],"names":["useField","useForm","useFieldHandlers","useCallback","getThemeConfig","isLabelVisible","jsxs","Fragment","jsx","FieldRequiredIndicator","Label","fieldLabelClass","fieldWrapperClass","fieldDescriptionClass","fieldControlClass","cn","Button","fieldErrorClass"],"mappings":"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","file":"MarMedicationOrdersWidget-ZKZLSZRN.cjs","sourcesContent":["import React, { useCallback } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { Label } from '../shadcn/label';\nimport { Button } from '../shadcn/button';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport type { TextFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldDescriptionClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const MarMedicationOrdersWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const handlers = useFieldHandlers(fieldId);\n\n const showError = !!error && (touched || state.submitAttempted);\n\n const onOpen = useCallback(async () => {\n await handlers.onOpenMedicationOrders?.();\n setTouched();\n }, [handlers, setTouched]);\n\n if (!fieldDef || fieldDef.type !== 'textarea') return null;\n\n const textDef = fieldDef as TextFieldDef;\n const height = textDef.height;\n const theme = getThemeConfig('textarea', fieldDef.theme);\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label} <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = showLabel ? (\n theme ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef, labelClass)}>\n {labelContent}\n </Label>\n ) : (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n )\n ) : null;\n\n const text = typeof value === 'string' ? value : value == null ? '' : String(value);\n const hasHandler = typeof handlers.onOpenMedicationOrders === 'function';\n\n return (\n <div className={fieldWrapperClass(fieldDef, wrapperClass)}>\n {labelEl}\n {fieldDef.description && (\n <p className={fieldDescriptionClass(fieldDef, 'text-sm text-muted-foreground')}>\n {fieldDef.description}\n </p>\n )}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-3\">\n <div\n id={fieldId}\n className={fieldControlClass(\n fieldDef,\n cn(\n 'min-h-[80px] flex-1 rounded-md border border-input bg-background px-3 py-2 text-sm whitespace-pre-wrap',\n showError && 'border-red-500',\n !text && 'text-muted-foreground',\n ),\n )}\n style={height != null ? { minHeight: height } : undefined}\n aria-readonly=\"true\"\n >\n {text || fieldDef.placeholder || 'No medication orders added.'}\n </div>\n <Button\n type=\"button\"\n variant=\"default\"\n disabled={disabled || !hasHandler}\n onClick={onOpen}\n className=\"shrink-0 sm:mt-0\"\n >\n Add medication orders\n </Button>\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { normalizeObgExamination, OBG_EXAM_ALLOWED_CHIP_LABELS, obgExaminationFromChipLabels, obgExaminationChipLabels } from './chunk-IKAKE7TR.mjs';
|
|
2
|
+
import { Checkbox } from './chunk-GNZWSVTB.mjs';
|
|
3
|
+
import { Textarea } from './chunk-4BAKQIPJ.mjs';
|
|
4
|
+
import { getThemeConfig } from './chunk-Y7TIWH4I.mjs';
|
|
5
|
+
import { FieldRequiredIndicator } from './chunk-WYVXXEZI.mjs';
|
|
6
|
+
import { useForm } from './chunk-XR2ZM654.mjs';
|
|
7
|
+
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-AZHTIUOL.mjs';
|
|
8
|
+
import { useField, parseProseAndChipTokens, composeProseAndChips } from './chunk-ZGPHTPAN.mjs';
|
|
9
|
+
import { Label } from './chunk-HEFZA2AH.mjs';
|
|
10
|
+
import { cn } from './chunk-VPU66PI6.mjs';
|
|
11
|
+
import { useMemo, useRef, useEffect } from 'react';
|
|
12
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
13
|
+
|
|
14
|
+
var CLINICAL_EXAMINATION_FIELD = "clinical_examination";
|
|
15
|
+
var GENERAL_ROWS = [
|
|
16
|
+
{ key: "pallor", label: "Pallor" },
|
|
17
|
+
{ key: "oedema", label: "Oedema" },
|
|
18
|
+
{ key: "thyroid", label: "Thyroid" },
|
|
19
|
+
{ key: "hirsutism", label: "Hirsutism" },
|
|
20
|
+
{ key: "acanthosis", label: "Acanthosis" }
|
|
21
|
+
];
|
|
22
|
+
var ABDOMEN_ROWS = [
|
|
23
|
+
{ key: "surgicalScars", label: "Surgical scars" },
|
|
24
|
+
{ key: "massTenderness", label: "Mass / tenderness" }
|
|
25
|
+
];
|
|
26
|
+
var BREAST_ROWS = [
|
|
27
|
+
{ key: "lump", label: "Lump" },
|
|
28
|
+
{ key: "nippleDischarge", label: "Nipple discharge" },
|
|
29
|
+
{ key: "skinChanges", label: "Skin changes" },
|
|
30
|
+
{ key: "axillaryNodes", label: "Axillary nodes" }
|
|
31
|
+
];
|
|
32
|
+
var PELVIC_ROWS = [
|
|
33
|
+
{ key: "speculumDone", label: "Speculum done" },
|
|
34
|
+
{ key: "discharge", label: "Discharge" },
|
|
35
|
+
{ key: "cervicalErosion", label: "Cervical erosion" },
|
|
36
|
+
{ key: "cervicalGrowth", label: "Cervical growth" },
|
|
37
|
+
{ key: "activeBleeding", label: "Active bleeding" },
|
|
38
|
+
{ key: "bimanualDone", label: "Bimanual done" },
|
|
39
|
+
{ key: "adnexalMass", label: "Adnexal mass" },
|
|
40
|
+
{ key: "cmt", label: "Cervical motion tenderness" }
|
|
41
|
+
];
|
|
42
|
+
var UTERUS_OPTIONS = [
|
|
43
|
+
{ value: "", label: "\u2014" },
|
|
44
|
+
{ value: "Normal", label: "Normal" },
|
|
45
|
+
{ value: "Bulky", label: "Bulky" },
|
|
46
|
+
{ value: "Enlarged", label: "Enlarged" }
|
|
47
|
+
];
|
|
48
|
+
var OBGExaminationWidget = ({ fieldId }) => {
|
|
49
|
+
const { fieldDef, value, setValue, setTouched, error, touched, disabled } = useField(fieldId);
|
|
50
|
+
const clinicalField = useField(CLINICAL_EXAMINATION_FIELD);
|
|
51
|
+
const { state } = useForm();
|
|
52
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
53
|
+
const safe = useMemo(() => normalizeObgExamination(value), [value]);
|
|
54
|
+
const lastAutoProseRef = useRef(null);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (lastAutoProseRef.current !== null) return;
|
|
57
|
+
const cur = typeof clinicalField.value === "string" ? clinicalField.value : "";
|
|
58
|
+
const { prose } = parseProseAndChipTokens(cur, OBG_EXAM_ALLOWED_CHIP_LABELS);
|
|
59
|
+
if (prose === "") lastAutoProseRef.current = "";
|
|
60
|
+
}, []);
|
|
61
|
+
const writeClinical = (next) => {
|
|
62
|
+
const cur = typeof clinicalField.value === "string" ? clinicalField.value : "";
|
|
63
|
+
const { prose: curProse } = parseProseAndChipTokens(cur, OBG_EXAM_ALLOWED_CHIP_LABELS);
|
|
64
|
+
const lastAutoProse = lastAutoProseRef.current;
|
|
65
|
+
const proseInput = curProse === "" || curProse === lastAutoProse ? "" : curProse;
|
|
66
|
+
const composed = composeProseAndChips(proseInput, obgExaminationChipLabels(next));
|
|
67
|
+
if (composed !== cur) clinicalField.setValue(composed);
|
|
68
|
+
if (proseInput === "" || proseInput === lastAutoProse) {
|
|
69
|
+
lastAutoProseRef.current = "";
|
|
70
|
+
}
|
|
71
|
+
return composed;
|
|
72
|
+
};
|
|
73
|
+
const bump = (next) => {
|
|
74
|
+
if (disabled) {
|
|
75
|
+
setValue(next);
|
|
76
|
+
setTouched();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const composed = writeClinical(next);
|
|
80
|
+
setValue({ ...next, examinationNotes: composed });
|
|
81
|
+
setTouched();
|
|
82
|
+
};
|
|
83
|
+
const onClinicalChange = (raw) => {
|
|
84
|
+
clinicalField.setValue(raw);
|
|
85
|
+
clinicalField.setTouched();
|
|
86
|
+
if (disabled) return;
|
|
87
|
+
const { prose, chips } = parseProseAndChipTokens(raw, OBG_EXAM_ALLOWED_CHIP_LABELS);
|
|
88
|
+
const rebuilt = obgExaminationFromChipLabels(chips, raw);
|
|
89
|
+
setValue(rebuilt);
|
|
90
|
+
setTouched();
|
|
91
|
+
lastAutoProseRef.current = prose === "" ? "" : "\0USER\0";
|
|
92
|
+
};
|
|
93
|
+
const toggleGeneral = (key) => bump({ ...safe, general: { ...safe.general, [key]: !safe.general[key] } });
|
|
94
|
+
const toggleAbdomen = (key) => bump({ ...safe, abdomen: { ...safe.abdomen, [key]: !safe.abdomen[key] } });
|
|
95
|
+
const toggleBreast = (key) => bump({ ...safe, breast: { ...safe.breast, [key]: !safe.breast[key] } });
|
|
96
|
+
const togglePelvic = (key) => {
|
|
97
|
+
const nextPelvic = { ...safe.pelvic, [key]: !safe.pelvic[key] };
|
|
98
|
+
const nextUterus = !nextPelvic.bimanualDone ? "" : safe.uterusSize;
|
|
99
|
+
bump({ ...safe, pelvic: nextPelvic, uterusSize: nextUterus });
|
|
100
|
+
};
|
|
101
|
+
const setUterusSize = (val) => bump({ ...safe, uterusSize: val });
|
|
102
|
+
if (!fieldDef) return null;
|
|
103
|
+
const theme = getThemeConfig("textarea", fieldDef.theme);
|
|
104
|
+
const wrapperClass = theme?.wrapperClassName ?? "rounded-md overflow-hidden flex flex-col border border-[#D0D0D0]";
|
|
105
|
+
const labelClass = theme?.labelClassName;
|
|
106
|
+
const labelContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
107
|
+
fieldDef.label,
|
|
108
|
+
/* @__PURE__ */ jsx(FieldRequiredIndicator, { fieldDef })
|
|
109
|
+
] });
|
|
110
|
+
const labelEl = theme ? /* @__PURE__ */ jsx(Label, { className: labelClass, children: labelContent }) : /* @__PURE__ */ jsx(Label, { className: "text-sm font-medium", children: labelContent });
|
|
111
|
+
const bodyClass = cn(
|
|
112
|
+
"-mt-1 flex min-w-0 flex-col gap-3 border-t border-[#D0D0D0] bg-white px-3 py-3",
|
|
113
|
+
disabled && "pointer-events-none opacity-60"
|
|
114
|
+
);
|
|
115
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("w-full min-w-0", wrapperClass), children: [
|
|
116
|
+
labelEl,
|
|
117
|
+
fieldDef.description ? /* @__PURE__ */ jsx("p", { className: "px-3 pt-2 text-[11px] text-muted-foreground", children: fieldDef.description }) : null,
|
|
118
|
+
/* @__PURE__ */ jsxs("div", { className: bodyClass, children: [
|
|
119
|
+
showError ? /* @__PURE__ */ jsx("p", { className: "text-xs text-red-600", children: error }) : null,
|
|
120
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-3 text-xs md:grid-cols-2 xl:grid-cols-4", children: [
|
|
121
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
122
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-slate-800", children: "General" }),
|
|
123
|
+
GENERAL_ROWS.map((r) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2", children: [
|
|
124
|
+
/* @__PURE__ */ jsx(
|
|
125
|
+
Checkbox,
|
|
126
|
+
{
|
|
127
|
+
checked: safe.general[r.key],
|
|
128
|
+
onCheckedChange: () => toggleGeneral(r.key),
|
|
129
|
+
disabled
|
|
130
|
+
}
|
|
131
|
+
),
|
|
132
|
+
r.label
|
|
133
|
+
] }, r.key))
|
|
134
|
+
] }),
|
|
135
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
136
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-slate-800", children: "Abdomen" }),
|
|
137
|
+
ABDOMEN_ROWS.map((r) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2", children: [
|
|
138
|
+
/* @__PURE__ */ jsx(
|
|
139
|
+
Checkbox,
|
|
140
|
+
{
|
|
141
|
+
checked: safe.abdomen[r.key],
|
|
142
|
+
onCheckedChange: () => toggleAbdomen(r.key),
|
|
143
|
+
disabled
|
|
144
|
+
}
|
|
145
|
+
),
|
|
146
|
+
r.label
|
|
147
|
+
] }, r.key)),
|
|
148
|
+
/* @__PURE__ */ jsx("p", { className: "text-[10px] text-muted-foreground", children: "Pregnancy \u2192 fundal ht / FHR / lie captured in Antenatal pathway." })
|
|
149
|
+
] }),
|
|
150
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
151
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-slate-800", children: "Breast" }),
|
|
152
|
+
BREAST_ROWS.map((r) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2", children: [
|
|
153
|
+
/* @__PURE__ */ jsx(
|
|
154
|
+
Checkbox,
|
|
155
|
+
{
|
|
156
|
+
checked: safe.breast[r.key],
|
|
157
|
+
onCheckedChange: () => toggleBreast(r.key),
|
|
158
|
+
disabled
|
|
159
|
+
}
|
|
160
|
+
),
|
|
161
|
+
r.label
|
|
162
|
+
] }, r.key))
|
|
163
|
+
] }),
|
|
164
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
165
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-slate-800", children: "Pelvic (consent applied)" }),
|
|
166
|
+
PELVIC_ROWS.map((r) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2", children: [
|
|
167
|
+
/* @__PURE__ */ jsx(
|
|
168
|
+
Checkbox,
|
|
169
|
+
{
|
|
170
|
+
checked: safe.pelvic[r.key],
|
|
171
|
+
onCheckedChange: () => togglePelvic(r.key),
|
|
172
|
+
disabled
|
|
173
|
+
}
|
|
174
|
+
),
|
|
175
|
+
r.label
|
|
176
|
+
] }, r.key)),
|
|
177
|
+
safe.pelvic.bimanualDone ? /* @__PURE__ */ jsxs("label", { className: "block pt-1", children: [
|
|
178
|
+
/* @__PURE__ */ jsx("span", { className: "mb-1 block font-medium", children: "Uterus size (on bimanual)" }),
|
|
179
|
+
/* @__PURE__ */ jsxs(
|
|
180
|
+
Select,
|
|
181
|
+
{
|
|
182
|
+
value: safe.uterusSize === "" ? "none" : safe.uterusSize,
|
|
183
|
+
onValueChange: (v) => setUterusSize(v === "none" ? "" : v),
|
|
184
|
+
disabled,
|
|
185
|
+
children: [
|
|
186
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "h-8 text-xs", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "\u2014" }) }),
|
|
187
|
+
/* @__PURE__ */ jsx(SelectContent, { children: UTERUS_OPTIONS.map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: opt.value === "" ? "none" : opt.value, children: opt.label }, opt.value || "none")) })
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
] }) : null
|
|
192
|
+
] })
|
|
193
|
+
] }),
|
|
194
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1 border-t border-[#D0D0D0] pt-3", children: [
|
|
195
|
+
/* @__PURE__ */ jsx(Label, { className: "text-sm font-medium", children: clinicalField.fieldDef?.label ?? "Clinical examination" }),
|
|
196
|
+
/* @__PURE__ */ jsx(
|
|
197
|
+
Textarea,
|
|
198
|
+
{
|
|
199
|
+
className: "min-h-[80px] text-xs",
|
|
200
|
+
placeholder: "Free text on top lines; ticked findings appear as comma-separated chips on the last line. Removing a chip unticks it.",
|
|
201
|
+
value: typeof clinicalField.value === "string" ? clinicalField.value : clinicalField.value == null ? "" : String(clinicalField.value),
|
|
202
|
+
onChange: (e) => onClinicalChange(e.target.value),
|
|
203
|
+
disabled: disabled || clinicalField.disabled
|
|
204
|
+
}
|
|
205
|
+
)
|
|
206
|
+
] })
|
|
207
|
+
] })
|
|
208
|
+
] });
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
export { OBGExaminationWidget };
|
|
212
|
+
//# sourceMappingURL=OBGExaminationWidget-BK4ERETW.mjs.map
|
|
213
|
+
//# sourceMappingURL=OBGExaminationWidget-BK4ERETW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/OBGExaminationWidget.tsx"],"names":[],"mappings":"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","file":"OBGExaminationWidget-BK4ERETW.mjs","sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport { Textarea } from '../shadcn/textarea';\nimport { Checkbox } from '../shadcn/checkbox';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { cn } from '../../core/utils';\nimport { FieldRequiredIndicator } from '../../react/fieldStyle';\nimport { getThemeConfig } from '../themes';\nimport {\n normalizeObgExamination,\n obgExaminationChipLabels,\n obgExaminationFromChipLabels,\n OBG_EXAM_ALLOWED_CHIP_LABELS,\n type ObgExaminationValue,\n type ObgUterusSize,\n} from '../../core/obgPathway';\nimport {\n composeProseAndChips,\n parseProseAndChipTokens,\n} from '../../core/suggestionTokens';\n\nconst CLINICAL_EXAMINATION_FIELD = 'clinical_examination';\n\ntype GeneralKey = keyof ObgExaminationValue['general'];\ntype AbdomenKey = keyof ObgExaminationValue['abdomen'];\ntype BreastKey = keyof ObgExaminationValue['breast'];\ntype PelvicKey = keyof ObgExaminationValue['pelvic'];\n\nconst GENERAL_ROWS: { key: GeneralKey; label: string }[] = [\n { key: 'pallor', label: 'Pallor' },\n { key: 'oedema', label: 'Oedema' },\n { key: 'thyroid', label: 'Thyroid' },\n { key: 'hirsutism', label: 'Hirsutism' },\n { key: 'acanthosis', label: 'Acanthosis' },\n];\n\nconst ABDOMEN_ROWS: { key: AbdomenKey; label: string }[] = [\n { key: 'surgicalScars', label: 'Surgical scars' },\n { key: 'massTenderness', label: 'Mass / tenderness' },\n];\n\nconst BREAST_ROWS: { key: BreastKey; label: string }[] = [\n { key: 'lump', label: 'Lump' },\n { key: 'nippleDischarge', label: 'Nipple discharge' },\n { key: 'skinChanges', label: 'Skin changes' },\n { key: 'axillaryNodes', label: 'Axillary nodes' },\n];\n\nconst PELVIC_ROWS: { key: PelvicKey; label: string }[] = [\n { key: 'speculumDone', label: 'Speculum done' },\n { key: 'discharge', label: 'Discharge' },\n { key: 'cervicalErosion', label: 'Cervical erosion' },\n { key: 'cervicalGrowth', label: 'Cervical growth' },\n { key: 'activeBleeding', label: 'Active bleeding' },\n { key: 'bimanualDone', label: 'Bimanual done' },\n { key: 'adnexalMass', label: 'Adnexal mass' },\n { key: 'cmt', label: 'Cervical motion tenderness' },\n];\n\nconst UTERUS_OPTIONS: { value: ObgUterusSize; label: string }[] = [\n { value: '', label: '—' },\n { value: 'Normal', label: 'Normal' },\n { value: 'Bulky', label: 'Bulky' },\n { value: 'Enlarged', label: 'Enlarged' },\n];\n\nexport const OBGExaminationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched, disabled } = useField(fieldId);\n const clinicalField = useField(CLINICAL_EXAMINATION_FIELD);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n const safe = useMemo(() => normalizeObgExamination(value), [value]);\n\n // Tracks user-owned prose (anything above the chip line). When the prose\n // matches what we last auto-wrote (or is empty), structured updates may\n // refresh it. Once the user types, prose is preserved and only the chip\n // line is kept in sync.\n const lastAutoProseRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (lastAutoProseRef.current !== null) return;\n const cur = typeof clinicalField.value === 'string' ? clinicalField.value : '';\n const { prose } = parseProseAndChipTokens(cur, OBG_EXAM_ALLOWED_CHIP_LABELS);\n if (prose === '') lastAutoProseRef.current = '';\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const writeClinical = (next: ObgExaminationValue) => {\n const cur = typeof clinicalField.value === 'string' ? clinicalField.value : '';\n const { prose: curProse } = parseProseAndChipTokens(cur, OBG_EXAM_ALLOWED_CHIP_LABELS);\n const lastAutoProse = lastAutoProseRef.current;\n const proseInput =\n curProse === '' || curProse === lastAutoProse ? '' : curProse;\n const composed = composeProseAndChips(proseInput, obgExaminationChipLabels(next));\n if (composed !== cur) clinicalField.setValue(composed);\n if (proseInput === '' || proseInput === lastAutoProse) {\n lastAutoProseRef.current = '';\n }\n return composed;\n };\n\n const bump = (next: ObgExaminationValue) => {\n if (disabled) {\n setValue(next);\n setTouched();\n return;\n }\n const composed = writeClinical(next);\n setValue({ ...next, examinationNotes: composed });\n setTouched();\n };\n\n const onClinicalChange = (raw: string) => {\n clinicalField.setValue(raw);\n clinicalField.setTouched();\n if (disabled) return;\n const { prose, chips } = parseProseAndChipTokens(raw, OBG_EXAM_ALLOWED_CHIP_LABELS);\n const rebuilt = obgExaminationFromChipLabels(chips, raw);\n setValue(rebuilt);\n setTouched();\n lastAutoProseRef.current = prose === '' ? '' : '\\u0000USER\\u0000';\n };\n\n const toggleGeneral = (key: GeneralKey) =>\n bump({ ...safe, general: { ...safe.general, [key]: !safe.general[key] } });\n const toggleAbdomen = (key: AbdomenKey) =>\n bump({ ...safe, abdomen: { ...safe.abdomen, [key]: !safe.abdomen[key] } });\n const toggleBreast = (key: BreastKey) =>\n bump({ ...safe, breast: { ...safe.breast, [key]: !safe.breast[key] } });\n const togglePelvic = (key: PelvicKey) => {\n const nextPelvic = { ...safe.pelvic, [key]: !safe.pelvic[key] };\n const nextUterus: ObgUterusSize = !nextPelvic.bimanualDone ? '' : safe.uterusSize;\n bump({ ...safe, pelvic: nextPelvic, uterusSize: nextUterus });\n };\n const setUterusSize = (val: ObgUterusSize) => bump({ ...safe, uterusSize: val });\n\n if (!fieldDef) return null;\n\n const theme = getThemeConfig('textarea', fieldDef.theme);\n const wrapperClass =\n theme?.wrapperClassName ?? 'rounded-md overflow-hidden flex flex-col border border-[#D0D0D0]';\n const labelClass = theme?.labelClassName;\n\n const labelContent = (\n <>\n {fieldDef.label}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = theme ? (\n <Label className={labelClass}>{labelContent}</Label>\n ) : (\n <Label className=\"text-sm font-medium\">{labelContent}</Label>\n );\n\n const bodyClass = cn(\n '-mt-1 flex min-w-0 flex-col gap-3 border-t border-[#D0D0D0] bg-white px-3 py-3',\n disabled && 'pointer-events-none opacity-60',\n );\n\n return (\n <div className={cn('w-full min-w-0', wrapperClass)}>\n {labelEl}\n {fieldDef.description ? (\n <p className=\"px-3 pt-2 text-[11px] text-muted-foreground\">{fieldDef.description}</p>\n ) : null}\n\n <div className={bodyClass}>\n {showError ? <p className=\"text-xs text-red-600\">{error}</p> : null}\n\n <div className=\"grid grid-cols-1 gap-3 text-xs md:grid-cols-2 xl:grid-cols-4\">\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">General</p>\n {GENERAL_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.general[r.key]}\n onCheckedChange={() => toggleGeneral(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">Abdomen</p>\n {ABDOMEN_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.abdomen[r.key]}\n onCheckedChange={() => toggleAbdomen(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n <p className=\"text-[10px] text-muted-foreground\">\n Pregnancy → fundal ht / FHR / lie captured in Antenatal pathway.\n </p>\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">Breast</p>\n {BREAST_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.breast[r.key]}\n onCheckedChange={() => toggleBreast(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">Pelvic (consent applied)</p>\n {PELVIC_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.pelvic[r.key]}\n onCheckedChange={() => togglePelvic(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n {safe.pelvic.bimanualDone ? (\n <label className=\"block pt-1\">\n <span className=\"mb-1 block font-medium\">Uterus size (on bimanual)</span>\n <Select\n value={safe.uterusSize === '' ? 'none' : safe.uterusSize}\n onValueChange={(v) =>\n setUterusSize(v === 'none' ? '' : (v as ObgUterusSize))\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n {UTERUS_OPTIONS.map((opt) => (\n <SelectItem key={opt.value || 'none'} value={opt.value === '' ? 'none' : opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n ) : null}\n </div>\n </div>\n\n <div className=\"space-y-1 border-t border-[#D0D0D0] pt-3\">\n <Label className=\"text-sm font-medium\">\n {clinicalField.fieldDef?.label ?? 'Clinical examination'}\n </Label>\n <Textarea\n className=\"min-h-[80px] text-xs\"\n placeholder=\"Free text on top lines; ticked findings appear as comma-separated chips on the last line. Removing a chip unticks it.\"\n value={\n typeof clinicalField.value === 'string'\n ? clinicalField.value\n : clinicalField.value == null\n ? ''\n : String(clinicalField.value)\n }\n onChange={(e) => onClinicalChange(e.target.value)}\n disabled={disabled || clinicalField.disabled}\n />\n </div>\n </div>\n </div>\n );\n};\n"]}
|