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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/FollowupWidget.tsx"],"names":["days","CalendarIcon","Calendar"],"mappings":"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","file":"FollowupWidget-NJ4QDBOG.mjs","sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { format, parseISO, differenceInCalendarDays, addDays, addWeeks } from 'date-fns';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { useField } from '../../react/useField';\nimport { Card, CardContent } from '../shadcn/card';\nimport { Label } from '../shadcn/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { Calendar } from '../shadcn/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '../shadcn/popover';\nimport { Button } from '../shadcn/button';\nimport { cn } from '../../core/utils';\nimport type { FollowupValue } from '../../core/types';\n\nconst FOLLOWUP_TYPE_OPTIONS = [\n { value: 'no followup', label: 'No Follow-up' },\n { value: 'one time', label: 'One Time' },\n] as const;\n\nconst UNIT_OPTIONS = [\n { value: 'days', label: 'Days' },\n { value: 'weeks', label: 'Weeks' },\n { value: 'months', label: 'Months' },\n] as const;\n\nconst DAYS_PER_MONTH = 30;\n\n/** Convert duration (value + unit) to number of days from today. */\nfunction durationToDays(valueNum: number, unit: 'days' | 'weeks' | 'months'): number {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n let target: Date;\n if (unit === 'days') target = addDays(today, valueNum);\n else if (unit === 'weeks') target = addWeeks(today, valueNum);\n else target = addDays(today, valueNum * DAYS_PER_MONTH);\n return Math.max(0, differenceInCalendarDays(target, today));\n}\n\nfunction daysToDisplayCount(daysNum: number, unit: 'days' | 'weeks' | 'months'): number {\n if (unit === 'days') return Math.max(0, daysNum);\n if (unit === 'weeks') return Math.round(daysNum / 7) || 1;\n return Math.round(daysNum / DAYS_PER_MONTH) || 1;\n}\n\n/** Convert a future date to number of days from today. */\nfunction dateToDays(date: Date): number {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return Math.max(0, differenceInCalendarDays(d, today));\n}\n\n/** Days → date for display (today + days). */\nfunction daysToDate(days: number): Date {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return addDays(today, days);\n}\n\nfunction normalizeFollowup(value: unknown): false | FollowupValue {\n if (value === false || value === null || value === undefined) return false;\n if (typeof value !== 'object') return false;\n const o = value as Record<string, unknown>;\n if (o.followupType !== 'one time') return false;\n // New shape: { followupType, value, unit: 'days' }\n if (typeof o.value === 'string' && o.unit === 'days') {\n return { followupType: 'one time', value: o.value, unit: 'days' };\n }\n // Legacy: mode + date or mode + value/unit → convert to days\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n if (o.mode === 'date' && typeof o.date === 'string') {\n const d = parseLocalDate(o.date);\n if (d) {\n const days = dateToDays(d);\n return { followupType: 'one time', value: String(days), unit: 'days' };\n }\n }\n const val = o.value != null ? Number(String(o.value)) : 7;\n const u = (o.unit === 'weeks' || o.unit === 'months' ? o.unit : 'days') as 'days' | 'weeks' | 'months';\n const days = durationToDays(Number.isNaN(val) ? 7 : val, u);\n return { followupType: 'one time', value: String(days), unit: 'days' };\n}\n\nfunction getDefaultDate(): Date {\n const d = new Date();\n d.setDate(d.getDate() + 7);\n return d;\n}\n\nfunction parseLocalDate(dateString: string | null | undefined): Date | null {\n if (!dateString) return null;\n try {\n return parseISO(dateString);\n } catch {\n const parts = dateString.split('-');\n if (parts.length === 3) {\n const y = parseInt(parts[0], 10);\n const m = parseInt(parts[1], 10) - 1;\n const d = parseInt(parts[2], 10);\n if (!Number.isNaN(y) && !Number.isNaN(m) && !Number.isNaN(d)) {\n return new Date(y, m, d);\n }\n }\n return null;\n }\n}\n\nexport const FollowupWidget: React.FC<{ fieldId: string; showIcon?: boolean }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, visible } = useField(fieldId);\n const followup = normalizeFollowup(value);\n const [calendarOpen, setCalendarOpen] = useState(false);\n\n const currentFollowupType = followup ? followup.followupType : 'no followup';\n const hasFollowup = followup !== false;\n const [displayMode, setDisplayMode] = useState<'duration' | 'date'>('duration');\n const [displayUnit, setDisplayUnit] = useState<'days' | 'weeks' | 'months'>('days');\n const daysNum = hasFollowup ? parseInt(followup.value, 10) || 7 : 7;\n const currentDate = hasFollowup ? daysToDate(daysNum) : null;\n const followupMode = displayMode;\n const currentValue = hasFollowup ? String(daysToDisplayCount(daysNum, displayUnit)) : '7';\n const currentUnit = displayUnit;\n\n const handleFollowupTypeChange = useCallback(\n (newType: 'no followup' | 'one time') => {\n setTouched();\n if (newType === 'no followup') {\n setValue(false);\n setCalendarOpen(false);\n return;\n }\n setValue({\n followupType: 'one time',\n value: hasFollowup ? followup.value : '7',\n unit: 'days',\n });\n },\n [followup, hasFollowup, setValue, setTouched]\n );\n\n const handleModeChange = useCallback((newMode: 'duration' | 'date') => {\n setDisplayMode(newMode);\n if (newMode === 'date') setCalendarOpen(false);\n }, []);\n\n const handleValueChange = useCallback(\n (newValue: string) => {\n setTouched();\n const num = parseInt(newValue, 10);\n const min = displayUnit === 'days' ? 0 : 1;\n const valid = (Number.isNaN(num) ? min : num) >= min || newValue === '';\n if (!valid && newValue !== '') {\n setValue({ followupType: 'one time', value: String(displayUnit === 'days' ? 0 : durationToDays(1, displayUnit)), unit: 'days' });\n return;\n }\n const days = durationToDays(Number.isNaN(num) ? (displayUnit === 'days' ? 0 : 1) : num, displayUnit);\n setValue({ followupType: 'one time', value: String(days), unit: 'days' });\n },\n [displayUnit, setValue, setTouched]\n );\n\n const handleUnitChange = useCallback(\n (newUnit: 'days' | 'weeks' | 'months') => {\n if (newUnit === displayUnit) return;\n const n = daysToDisplayCount(daysNum, displayUnit);\n setDisplayUnit(newUnit);\n if (!hasFollowup) return;\n setTouched();\n const newDays = durationToDays(n, newUnit);\n setValue({ followupType: 'one time', value: String(newDays), unit: 'days' });\n },\n [displayUnit, daysNum, hasFollowup, setValue, setTouched]\n );\n\n const handleDateSelect = useCallback(\n (selected: Date | undefined) => {\n setTouched();\n setCalendarOpen(false);\n if (!selected) return;\n const days = dateToDays(selected);\n setValue({ followupType: 'one time', value: String(days), unit: 'days' });\n },\n [setValue, setTouched]\n );\n\n if (!visible || !fieldDef) return null;\n\n const minDate = new Date();\n minDate.setHours(0, 0, 0, 0);\n const selectedDate = currentDate || getDefaultDate();\n\n return (\n <Card className={cn(error && 'border-destructive')}>\n {/* <CardHeader className=\"flex flex-row items-center space-y-0\">\n {showIcon && (\n <img\n alt=\"Follow-up\"\n className=\"h-5 w-5\"\n src=\"/icons/star_png.png\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n )}\n <Label className=\"text-base font-semibold\">{fieldDef.label}</Label>\n </CardHeader> */}\n <CardContent className=\"space-y-1 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center flex-shrink-0 gap-2\">\n <Label className=\"text-xs font-semibold text-muted-foreground\">Follow-up</Label>\n <Select\n value={currentFollowupType}\n onValueChange={(v) => handleFollowupTypeChange(v as 'no followup' | 'one time')}\n disabled={disabled}\n >\n <SelectTrigger className=\"w-[140px] border-none bg-muted/50 text-xs py-1 focus:outline-none focus:ring-0 focus:ring-offset-0\">\n <SelectValue/>\n </SelectTrigger>\n <SelectContent>\n {FOLLOWUP_TYPE_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value} className=\"text-xs\">\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {currentFollowupType !== 'no followup' && (\n <>\n <div className=\"flex items-center gap-4\">\n <Label className=\"text-xs font-medium text-muted-foreground\">Schedule by:</Label>\n <div className=\"flex items-center gap-3\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name={`followup-mode-${fieldId}`}\n value=\"duration\"\n checked={followupMode === 'duration'}\n onChange={() => handleModeChange('duration')}\n className=\"h-4 w-4 text-primary focus:ring-primary\"\n disabled={disabled}\n />\n <span className=\"text-xs text-muted-foreground\">Duration</span>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name={`followup-mode-${fieldId}`}\n value=\"date\"\n checked={followupMode === 'date'}\n onChange={() => handleModeChange('date')}\n className=\"h-4 w-4 text-primary focus:ring-primary\"\n disabled={disabled}\n />\n <span className=\"text-xs text-muted-foreground\">Date</span>\n </label>\n </div>\n </div>\n\n {followupMode === 'duration' && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold text-muted-foreground\">In</span>\n <input\n type=\"number\"\n min={currentUnit === 'days' ? 0 : 1}\n value={currentValue}\n onChange={(e) => handleValueChange(e.target.value)}\n disabled={disabled}\n className=\"w-16 py-1.5 px-2 border border-input rounded-md text-center text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n placeholder=\"7\"\n />\n <Select\n value={currentUnit}\n onValueChange={(v) => handleUnitChange(v as 'days' | 'weeks' | 'months')}\n disabled={disabled}\n >\n <SelectTrigger className=\"w-[100px] h-8 text-xs\">\n <SelectValue className='text-xs'/>\n </SelectTrigger>\n <SelectContent>\n {UNIT_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value} className=\"text-xs\">\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {followupMode === 'date' && (\n <Popover open={calendarOpen} onOpenChange={setCalendarOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-full justify-start text-left font-normal h-9\"\n disabled={disabled}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">\n {hasFollowup && currentDate\n ? format(currentDate, 'MMM d, yyyy')\n : 'Select date'}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={selectedDate}\n onSelect={handleDateSelect}\n disabled={(date) => date < minDate}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n )}\n\n <p className=\"text-xs text-muted-foreground\">\n One-time appointment{' '}\n {followupMode === 'duration'\n ? `in ${currentValue} ${currentUnit}`\n : hasFollowup && currentDate\n ? `on ${format(currentDate, 'MMM d, yyyy')}`\n : 'date to be selected'}\n </p>\n </>\n )}\n\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </CardContent>\n </Card>\n );\n};\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkKJA5BLGX_cjs = require('./chunk-KJA5BLGX.cjs');
|
|
4
|
+
var chunkKPGTPJDH_cjs = require('./chunk-KPGTPJDH.cjs');
|
|
5
|
+
var chunkIDSBJOFY_cjs = require('./chunk-IDSBJOFY.cjs');
|
|
6
|
+
var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
|
|
7
|
+
require('react');
|
|
8
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
|
|
10
|
+
var ITEMS = [
|
|
11
|
+
{ key: "reading", label: "Difficulty reading" },
|
|
12
|
+
{ key: "nightDriving", label: "Night driving difficulty" },
|
|
13
|
+
{ key: "glare", label: "Glare sensitivity" },
|
|
14
|
+
{ key: "occupation", label: "Occupational impact" },
|
|
15
|
+
{ key: "adl", label: "ADL limitation" }
|
|
16
|
+
];
|
|
17
|
+
var SCALE_LABELS = ["None", "Mild", "Moderate", "Severe"];
|
|
18
|
+
var DEFAULT_TITLE = "Functional Impairment Score (Stage 5)";
|
|
19
|
+
var ITEMS_GRID_STYLE = {
|
|
20
|
+
display: "grid",
|
|
21
|
+
gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 8rem), 1fr))",
|
|
22
|
+
columnGap: "0.5rem",
|
|
23
|
+
rowGap: "0.5rem",
|
|
24
|
+
width: "100%",
|
|
25
|
+
minWidth: 0
|
|
26
|
+
};
|
|
27
|
+
function clamp03(n) {
|
|
28
|
+
const v = typeof n === "number" ? n : Number(n);
|
|
29
|
+
if (!Number.isFinite(v)) return 0;
|
|
30
|
+
return Math.max(0, Math.min(3, Math.trunc(v)));
|
|
31
|
+
}
|
|
32
|
+
var FunctionalImpairmentScoreWidget = ({
|
|
33
|
+
fieldId
|
|
34
|
+
}) => {
|
|
35
|
+
const { fieldDef, value, setValue, error, disabled, touched } = chunkIDSBJOFY_cjs.useField(fieldId);
|
|
36
|
+
const { state } = chunkKPGTPJDH_cjs.useForm();
|
|
37
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
38
|
+
if (!fieldDef || fieldDef.type !== "functional_impairment_score") {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const def = fieldDef;
|
|
42
|
+
const v = chunkKJA5BLGX_cjs.parseFunctionalImpairmentScore(value);
|
|
43
|
+
const total = chunkKJA5BLGX_cjs.functionalImpairmentTotal(v);
|
|
44
|
+
const title = def.meta?.cardTitle?.trim() || (def.label?.trim() ? def.label : DEFAULT_TITLE);
|
|
45
|
+
const setDim = (key, n) => {
|
|
46
|
+
setValue({ ...v, [key]: clamp03(n) });
|
|
47
|
+
};
|
|
48
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
49
|
+
"div",
|
|
50
|
+
{
|
|
51
|
+
id: `functional-impairment-${fieldId}`,
|
|
52
|
+
className: "w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-3 text-card-foreground shadow-sm",
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-2 text-xs font-semibold leading-tight text-foreground sm:text-[13px]", children: title }),
|
|
55
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: ITEMS_GRID_STYLE, children: ITEMS.map((it) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [
|
|
56
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[10px] font-medium leading-snug text-foreground sm:text-[11px]", children: it.label }),
|
|
57
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex w-fit max-w-full shrink-0 gap-0.5", children: [0, 1, 2, 3].map((score) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
58
|
+
"button",
|
|
59
|
+
{
|
|
60
|
+
type: "button",
|
|
61
|
+
title: SCALE_LABELS[score],
|
|
62
|
+
disabled,
|
|
63
|
+
onClick: () => setDim(it.key, score),
|
|
64
|
+
className: chunkFHHISVCH_cjs.cn(
|
|
65
|
+
"h-6 w-7 shrink-0 rounded border text-[10px] transition-colors sm:text-[11px]",
|
|
66
|
+
v[it.key] === score ? "border-primary bg-primary text-primary-foreground" : "border-input hover:bg-muted",
|
|
67
|
+
disabled && "pointer-events-none opacity-50"
|
|
68
|
+
),
|
|
69
|
+
children: score
|
|
70
|
+
},
|
|
71
|
+
score
|
|
72
|
+
)) })
|
|
73
|
+
] }, it.key)) }),
|
|
74
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-col gap-1.5 border-t border-border pt-2 sm:flex-row sm:items-center sm:justify-between sm:gap-2", children: [
|
|
75
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[10px] leading-snug text-muted-foreground sm:text-[11px]", children: "Score scale: 0 = none, 3 = severe (each item)" }),
|
|
76
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5 sm:justify-end", children: [
|
|
77
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-muted-foreground sm:text-[11px]", children: "Total" }),
|
|
78
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-bold tabular-nums sm:text-[15px]", children: [
|
|
79
|
+
total,
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-normal text-muted-foreground", children: "/15" })
|
|
81
|
+
] })
|
|
82
|
+
] })
|
|
83
|
+
] }),
|
|
84
|
+
def.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: def.description }),
|
|
85
|
+
showError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-red-500", children: error })
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
exports.FunctionalImpairmentScoreWidget = FunctionalImpairmentScoreWidget;
|
|
92
|
+
//# sourceMappingURL=FunctionalImpairmentScoreWidget-HAAPCMIS.cjs.map
|
|
93
|
+
//# sourceMappingURL=FunctionalImpairmentScoreWidget-HAAPCMIS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/FunctionalImpairmentScoreWidget.tsx"],"names":["useField","useForm","parseFunctionalImpairmentScore","functionalImpairmentTotal","jsxs","jsx","cn"],"mappings":"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","file":"FunctionalImpairmentScoreWidget-HAAPCMIS.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { cn } from '../../core/utils';\nimport type {\n FunctionalImpairmentDimension,\n FunctionalImpairmentScoreFieldDef,\n} from '../../core/types';\nimport {\n functionalImpairmentTotal,\n parseFunctionalImpairmentScore,\n} from '../../core/functionalImpairmentScore';\n\nconst ITEMS: { key: FunctionalImpairmentDimension; label: string }[] = [\n { key: 'reading', label: 'Difficulty reading' },\n { key: 'nightDriving', label: 'Night driving difficulty' },\n { key: 'glare', label: 'Glare sensitivity' },\n { key: 'occupation', label: 'Occupational impact' },\n { key: 'adl', label: 'ADL limitation' },\n];\n\nconst SCALE_LABELS = ['None', 'Mild', 'Moderate', 'Severe'] as const;\n\nconst DEFAULT_TITLE = 'Functional Impairment Score (Stage 5)';\n\n/**\n * Two columns when the card fits two compact cells (~22rem + gap);\n * one column below that. Low min so side columns still get 2-up.\n */\nconst ITEMS_GRID_STYLE: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(min(100%, 8rem), 1fr))',\n columnGap: '0.5rem',\n rowGap: '0.5rem',\n width: '100%',\n minWidth: 0,\n};\n\nfunction clamp03(n: unknown): number {\n const v = typeof n === 'number' ? n : Number(n);\n if (!Number.isFinite(v)) return 0;\n return Math.max(0, Math.min(3, Math.trunc(v)));\n}\n\n/**\n * Stage-5 functional impairment: five 0–3 items and total /15.\n */\nexport const FunctionalImpairmentScoreWidget: React.FC<{ fieldId: string }> = ({\n fieldId,\n}) => {\n const { fieldDef, value, setValue, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef || fieldDef.type !== 'functional_impairment_score') {\n return null;\n }\n\n const def = fieldDef as FunctionalImpairmentScoreFieldDef;\n const v = parseFunctionalImpairmentScore(value);\n const total = functionalImpairmentTotal(v);\n const title =\n (def.meta?.cardTitle as string | undefined)?.trim() ||\n (def.label?.trim() ? def.label : DEFAULT_TITLE);\n\n const setDim = (key: FunctionalImpairmentDimension, n: number) => {\n setValue({ ...v, [key]: clamp03(n) });\n };\n\n return (\n <div\n id={`functional-impairment-${fieldId}`}\n className=\"w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-3 text-card-foreground shadow-sm\"\n >\n <h3 className=\"mb-2 text-xs font-semibold leading-tight text-foreground sm:text-[13px]\">\n {title}\n </h3>\n\n <div style={ITEMS_GRID_STYLE}>\n {ITEMS.map((it) => (\n <div key={it.key} className=\"flex min-w-0 flex-col gap-1\">\n <div className=\"text-[10px] font-medium leading-snug text-foreground sm:text-[11px]\">\n {it.label}\n </div>\n <div className=\"flex w-fit max-w-full shrink-0 gap-0.5\">\n {[0, 1, 2, 3].map((score) => (\n <button\n key={score}\n type=\"button\"\n title={SCALE_LABELS[score]}\n disabled={disabled}\n onClick={() => setDim(it.key, score)}\n className={cn(\n 'h-6 w-7 shrink-0 rounded border text-[10px] transition-colors sm:text-[11px]',\n v[it.key] === score\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-input hover:bg-muted',\n disabled && 'pointer-events-none opacity-50',\n )}\n >\n {score}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"mt-2 flex flex-col gap-1.5 border-t border-border pt-2 sm:flex-row sm:items-center sm:justify-between sm:gap-2\">\n <div className=\"text-[10px] leading-snug text-muted-foreground sm:text-[11px]\">\n Score scale: 0 = none, 3 = severe (each item)\n </div>\n <div className=\"flex flex-wrap items-center gap-1.5 sm:justify-end\">\n <span className=\"text-[10px] text-muted-foreground sm:text-[11px]\">Total</span>\n <span className=\"text-sm font-bold tabular-nums sm:text-[15px]\">\n {total}\n <span className=\"font-normal text-muted-foreground\">/15</span>\n </span>\n </div>\n </div>\n\n {def.description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">{def.description}</p>\n )}\n\n {showError && <p className=\"mt-2 text-xs text-red-500\">{error}</p>}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { parseFunctionalImpairmentScore, functionalImpairmentTotal } from './chunk-LQYWMYEC.mjs';
|
|
2
|
+
import { useForm } from './chunk-XR2ZM654.mjs';
|
|
3
|
+
import { useField } from './chunk-ZGPHTPAN.mjs';
|
|
4
|
+
import { cn } from './chunk-VPU66PI6.mjs';
|
|
5
|
+
import 'react';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var ITEMS = [
|
|
9
|
+
{ key: "reading", label: "Difficulty reading" },
|
|
10
|
+
{ key: "nightDriving", label: "Night driving difficulty" },
|
|
11
|
+
{ key: "glare", label: "Glare sensitivity" },
|
|
12
|
+
{ key: "occupation", label: "Occupational impact" },
|
|
13
|
+
{ key: "adl", label: "ADL limitation" }
|
|
14
|
+
];
|
|
15
|
+
var SCALE_LABELS = ["None", "Mild", "Moderate", "Severe"];
|
|
16
|
+
var DEFAULT_TITLE = "Functional Impairment Score (Stage 5)";
|
|
17
|
+
var ITEMS_GRID_STYLE = {
|
|
18
|
+
display: "grid",
|
|
19
|
+
gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 8rem), 1fr))",
|
|
20
|
+
columnGap: "0.5rem",
|
|
21
|
+
rowGap: "0.5rem",
|
|
22
|
+
width: "100%",
|
|
23
|
+
minWidth: 0
|
|
24
|
+
};
|
|
25
|
+
function clamp03(n) {
|
|
26
|
+
const v = typeof n === "number" ? n : Number(n);
|
|
27
|
+
if (!Number.isFinite(v)) return 0;
|
|
28
|
+
return Math.max(0, Math.min(3, Math.trunc(v)));
|
|
29
|
+
}
|
|
30
|
+
var FunctionalImpairmentScoreWidget = ({
|
|
31
|
+
fieldId
|
|
32
|
+
}) => {
|
|
33
|
+
const { fieldDef, value, setValue, error, disabled, touched } = useField(fieldId);
|
|
34
|
+
const { state } = useForm();
|
|
35
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
36
|
+
if (!fieldDef || fieldDef.type !== "functional_impairment_score") {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const def = fieldDef;
|
|
40
|
+
const v = parseFunctionalImpairmentScore(value);
|
|
41
|
+
const total = functionalImpairmentTotal(v);
|
|
42
|
+
const title = def.meta?.cardTitle?.trim() || (def.label?.trim() ? def.label : DEFAULT_TITLE);
|
|
43
|
+
const setDim = (key, n) => {
|
|
44
|
+
setValue({ ...v, [key]: clamp03(n) });
|
|
45
|
+
};
|
|
46
|
+
return /* @__PURE__ */ jsxs(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
id: `functional-impairment-${fieldId}`,
|
|
50
|
+
className: "w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-3 text-card-foreground shadow-sm",
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-2 text-xs font-semibold leading-tight text-foreground sm:text-[13px]", children: title }),
|
|
53
|
+
/* @__PURE__ */ jsx("div", { style: ITEMS_GRID_STYLE, children: ITEMS.map((it) => /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [
|
|
54
|
+
/* @__PURE__ */ jsx("div", { className: "text-[10px] font-medium leading-snug text-foreground sm:text-[11px]", children: it.label }),
|
|
55
|
+
/* @__PURE__ */ jsx("div", { className: "flex w-fit max-w-full shrink-0 gap-0.5", children: [0, 1, 2, 3].map((score) => /* @__PURE__ */ jsx(
|
|
56
|
+
"button",
|
|
57
|
+
{
|
|
58
|
+
type: "button",
|
|
59
|
+
title: SCALE_LABELS[score],
|
|
60
|
+
disabled,
|
|
61
|
+
onClick: () => setDim(it.key, score),
|
|
62
|
+
className: cn(
|
|
63
|
+
"h-6 w-7 shrink-0 rounded border text-[10px] transition-colors sm:text-[11px]",
|
|
64
|
+
v[it.key] === score ? "border-primary bg-primary text-primary-foreground" : "border-input hover:bg-muted",
|
|
65
|
+
disabled && "pointer-events-none opacity-50"
|
|
66
|
+
),
|
|
67
|
+
children: score
|
|
68
|
+
},
|
|
69
|
+
score
|
|
70
|
+
)) })
|
|
71
|
+
] }, it.key)) }),
|
|
72
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-col gap-1.5 border-t border-border pt-2 sm:flex-row sm:items-center sm:justify-between sm:gap-2", children: [
|
|
73
|
+
/* @__PURE__ */ jsx("div", { className: "text-[10px] leading-snug text-muted-foreground sm:text-[11px]", children: "Score scale: 0 = none, 3 = severe (each item)" }),
|
|
74
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5 sm:justify-end", children: [
|
|
75
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground sm:text-[11px]", children: "Total" }),
|
|
76
|
+
/* @__PURE__ */ jsxs("span", { className: "text-sm font-bold tabular-nums sm:text-[15px]", children: [
|
|
77
|
+
total,
|
|
78
|
+
/* @__PURE__ */ jsx("span", { className: "font-normal text-muted-foreground", children: "/15" })
|
|
79
|
+
] })
|
|
80
|
+
] })
|
|
81
|
+
] }),
|
|
82
|
+
def.description && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: def.description }),
|
|
83
|
+
showError && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-red-500", children: error })
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export { FunctionalImpairmentScoreWidget };
|
|
90
|
+
//# sourceMappingURL=FunctionalImpairmentScoreWidget-ZNLKKBYN.mjs.map
|
|
91
|
+
//# sourceMappingURL=FunctionalImpairmentScoreWidget-ZNLKKBYN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/FunctionalImpairmentScoreWidget.tsx"],"names":[],"mappings":"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","file":"FunctionalImpairmentScoreWidget-ZNLKKBYN.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { cn } from '../../core/utils';\nimport type {\n FunctionalImpairmentDimension,\n FunctionalImpairmentScoreFieldDef,\n} from '../../core/types';\nimport {\n functionalImpairmentTotal,\n parseFunctionalImpairmentScore,\n} from '../../core/functionalImpairmentScore';\n\nconst ITEMS: { key: FunctionalImpairmentDimension; label: string }[] = [\n { key: 'reading', label: 'Difficulty reading' },\n { key: 'nightDriving', label: 'Night driving difficulty' },\n { key: 'glare', label: 'Glare sensitivity' },\n { key: 'occupation', label: 'Occupational impact' },\n { key: 'adl', label: 'ADL limitation' },\n];\n\nconst SCALE_LABELS = ['None', 'Mild', 'Moderate', 'Severe'] as const;\n\nconst DEFAULT_TITLE = 'Functional Impairment Score (Stage 5)';\n\n/**\n * Two columns when the card fits two compact cells (~22rem + gap);\n * one column below that. Low min so side columns still get 2-up.\n */\nconst ITEMS_GRID_STYLE: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(min(100%, 8rem), 1fr))',\n columnGap: '0.5rem',\n rowGap: '0.5rem',\n width: '100%',\n minWidth: 0,\n};\n\nfunction clamp03(n: unknown): number {\n const v = typeof n === 'number' ? n : Number(n);\n if (!Number.isFinite(v)) return 0;\n return Math.max(0, Math.min(3, Math.trunc(v)));\n}\n\n/**\n * Stage-5 functional impairment: five 0–3 items and total /15.\n */\nexport const FunctionalImpairmentScoreWidget: React.FC<{ fieldId: string }> = ({\n fieldId,\n}) => {\n const { fieldDef, value, setValue, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef || fieldDef.type !== 'functional_impairment_score') {\n return null;\n }\n\n const def = fieldDef as FunctionalImpairmentScoreFieldDef;\n const v = parseFunctionalImpairmentScore(value);\n const total = functionalImpairmentTotal(v);\n const title =\n (def.meta?.cardTitle as string | undefined)?.trim() ||\n (def.label?.trim() ? def.label : DEFAULT_TITLE);\n\n const setDim = (key: FunctionalImpairmentDimension, n: number) => {\n setValue({ ...v, [key]: clamp03(n) });\n };\n\n return (\n <div\n id={`functional-impairment-${fieldId}`}\n className=\"w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-3 text-card-foreground shadow-sm\"\n >\n <h3 className=\"mb-2 text-xs font-semibold leading-tight text-foreground sm:text-[13px]\">\n {title}\n </h3>\n\n <div style={ITEMS_GRID_STYLE}>\n {ITEMS.map((it) => (\n <div key={it.key} className=\"flex min-w-0 flex-col gap-1\">\n <div className=\"text-[10px] font-medium leading-snug text-foreground sm:text-[11px]\">\n {it.label}\n </div>\n <div className=\"flex w-fit max-w-full shrink-0 gap-0.5\">\n {[0, 1, 2, 3].map((score) => (\n <button\n key={score}\n type=\"button\"\n title={SCALE_LABELS[score]}\n disabled={disabled}\n onClick={() => setDim(it.key, score)}\n className={cn(\n 'h-6 w-7 shrink-0 rounded border text-[10px] transition-colors sm:text-[11px]',\n v[it.key] === score\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-input hover:bg-muted',\n disabled && 'pointer-events-none opacity-50',\n )}\n >\n {score}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"mt-2 flex flex-col gap-1.5 border-t border-border pt-2 sm:flex-row sm:items-center sm:justify-between sm:gap-2\">\n <div className=\"text-[10px] leading-snug text-muted-foreground sm:text-[11px]\">\n Score scale: 0 = none, 3 = severe (each item)\n </div>\n <div className=\"flex flex-wrap items-center gap-1.5 sm:justify-end\">\n <span className=\"text-[10px] text-muted-foreground sm:text-[11px]\">Total</span>\n <span className=\"text-sm font-bold tabular-nums sm:text-[15px]\">\n {total}\n <span className=\"font-normal text-muted-foreground\">/15</span>\n </span>\n </div>\n </div>\n\n {def.description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">{def.description}</p>\n )}\n\n {showError && <p className=\"mt-2 text-xs text-red-500\">{error}</p>}\n </div>\n );\n};\n"]}
|