formanitor 0.1.11 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -14540
- 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 -14349
- 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
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkJE6VXRWW_cjs = require('./chunk-JE6VXRWW.cjs');
|
|
4
|
+
var chunkAZSAPO2V_cjs = require('./chunk-AZSAPO2V.cjs');
|
|
5
|
+
var chunk4KSZUIJE_cjs = require('./chunk-4KSZUIJE.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 dateFns = require('date-fns');
|
|
12
|
+
var lucideReact = require('lucide-react');
|
|
13
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
14
|
+
|
|
15
|
+
var FOLLOWUP_TYPE_OPTIONS = [
|
|
16
|
+
{ value: "no followup", label: "No Follow-up" },
|
|
17
|
+
{ value: "one time", label: "One Time" }
|
|
18
|
+
];
|
|
19
|
+
var UNIT_OPTIONS = [
|
|
20
|
+
{ value: "days", label: "Days" },
|
|
21
|
+
{ value: "weeks", label: "Weeks" },
|
|
22
|
+
{ value: "months", label: "Months" }
|
|
23
|
+
];
|
|
24
|
+
var DAYS_PER_MONTH = 30;
|
|
25
|
+
function durationToDays(valueNum, unit) {
|
|
26
|
+
const today = /* @__PURE__ */ new Date();
|
|
27
|
+
today.setHours(0, 0, 0, 0);
|
|
28
|
+
let target;
|
|
29
|
+
if (unit === "days") target = dateFns.addDays(today, valueNum);
|
|
30
|
+
else if (unit === "weeks") target = dateFns.addWeeks(today, valueNum);
|
|
31
|
+
else target = dateFns.addDays(today, valueNum * DAYS_PER_MONTH);
|
|
32
|
+
return Math.max(0, dateFns.differenceInCalendarDays(target, today));
|
|
33
|
+
}
|
|
34
|
+
function daysToDisplayCount(daysNum, unit) {
|
|
35
|
+
if (unit === "days") return Math.max(0, daysNum);
|
|
36
|
+
if (unit === "weeks") return Math.round(daysNum / 7) || 1;
|
|
37
|
+
return Math.round(daysNum / DAYS_PER_MONTH) || 1;
|
|
38
|
+
}
|
|
39
|
+
function dateToDays(date) {
|
|
40
|
+
const today = /* @__PURE__ */ new Date();
|
|
41
|
+
today.setHours(0, 0, 0, 0);
|
|
42
|
+
const d = new Date(date);
|
|
43
|
+
d.setHours(0, 0, 0, 0);
|
|
44
|
+
return Math.max(0, dateFns.differenceInCalendarDays(d, today));
|
|
45
|
+
}
|
|
46
|
+
function daysToDate(days) {
|
|
47
|
+
const today = /* @__PURE__ */ new Date();
|
|
48
|
+
today.setHours(0, 0, 0, 0);
|
|
49
|
+
return dateFns.addDays(today, days);
|
|
50
|
+
}
|
|
51
|
+
function normalizeFollowup(value) {
|
|
52
|
+
if (value === false || value === null || value === void 0) return false;
|
|
53
|
+
if (typeof value !== "object") return false;
|
|
54
|
+
const o = value;
|
|
55
|
+
if (o.followupType !== "one time") return false;
|
|
56
|
+
if (typeof o.value === "string" && o.unit === "days") {
|
|
57
|
+
return { followupType: "one time", value: o.value, unit: "days" };
|
|
58
|
+
}
|
|
59
|
+
const today = /* @__PURE__ */ new Date();
|
|
60
|
+
today.setHours(0, 0, 0, 0);
|
|
61
|
+
if (o.mode === "date" && typeof o.date === "string") {
|
|
62
|
+
const d = parseLocalDate(o.date);
|
|
63
|
+
if (d) {
|
|
64
|
+
const days2 = dateToDays(d);
|
|
65
|
+
return { followupType: "one time", value: String(days2), unit: "days" };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const val = o.value != null ? Number(String(o.value)) : 7;
|
|
69
|
+
const u = o.unit === "weeks" || o.unit === "months" ? o.unit : "days";
|
|
70
|
+
const days = durationToDays(Number.isNaN(val) ? 7 : val, u);
|
|
71
|
+
return { followupType: "one time", value: String(days), unit: "days" };
|
|
72
|
+
}
|
|
73
|
+
function getDefaultDate() {
|
|
74
|
+
const d = /* @__PURE__ */ new Date();
|
|
75
|
+
d.setDate(d.getDate() + 7);
|
|
76
|
+
return d;
|
|
77
|
+
}
|
|
78
|
+
function parseLocalDate(dateString) {
|
|
79
|
+
if (!dateString) return null;
|
|
80
|
+
try {
|
|
81
|
+
return dateFns.parseISO(dateString);
|
|
82
|
+
} catch {
|
|
83
|
+
const parts = dateString.split("-");
|
|
84
|
+
if (parts.length === 3) {
|
|
85
|
+
const y = parseInt(parts[0], 10);
|
|
86
|
+
const m = parseInt(parts[1], 10) - 1;
|
|
87
|
+
const d = parseInt(parts[2], 10);
|
|
88
|
+
if (!Number.isNaN(y) && !Number.isNaN(m) && !Number.isNaN(d)) {
|
|
89
|
+
return new Date(y, m, d);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
var FollowupWidget = ({ fieldId }) => {
|
|
96
|
+
const { fieldDef, value, setValue, setTouched, error, disabled, visible } = chunkIDSBJOFY_cjs.useField(fieldId);
|
|
97
|
+
const followup = normalizeFollowup(value);
|
|
98
|
+
const [calendarOpen, setCalendarOpen] = react.useState(false);
|
|
99
|
+
const currentFollowupType = followup ? followup.followupType : "no followup";
|
|
100
|
+
const hasFollowup = followup !== false;
|
|
101
|
+
const [displayMode, setDisplayMode] = react.useState("duration");
|
|
102
|
+
const [displayUnit, setDisplayUnit] = react.useState("days");
|
|
103
|
+
const daysNum = hasFollowup ? parseInt(followup.value, 10) || 7 : 7;
|
|
104
|
+
const currentDate = hasFollowup ? daysToDate(daysNum) : null;
|
|
105
|
+
const followupMode = displayMode;
|
|
106
|
+
const currentValue = hasFollowup ? String(daysToDisplayCount(daysNum, displayUnit)) : "7";
|
|
107
|
+
const currentUnit = displayUnit;
|
|
108
|
+
const handleFollowupTypeChange = react.useCallback(
|
|
109
|
+
(newType) => {
|
|
110
|
+
setTouched();
|
|
111
|
+
if (newType === "no followup") {
|
|
112
|
+
setValue(false);
|
|
113
|
+
setCalendarOpen(false);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
setValue({
|
|
117
|
+
followupType: "one time",
|
|
118
|
+
value: hasFollowup ? followup.value : "7",
|
|
119
|
+
unit: "days"
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
[followup, hasFollowup, setValue, setTouched]
|
|
123
|
+
);
|
|
124
|
+
const handleModeChange = react.useCallback((newMode) => {
|
|
125
|
+
setDisplayMode(newMode);
|
|
126
|
+
if (newMode === "date") setCalendarOpen(false);
|
|
127
|
+
}, []);
|
|
128
|
+
const handleValueChange = react.useCallback(
|
|
129
|
+
(newValue) => {
|
|
130
|
+
setTouched();
|
|
131
|
+
const num = parseInt(newValue, 10);
|
|
132
|
+
const min = displayUnit === "days" ? 0 : 1;
|
|
133
|
+
const valid = (Number.isNaN(num) ? min : num) >= min || newValue === "";
|
|
134
|
+
if (!valid && newValue !== "") {
|
|
135
|
+
setValue({ followupType: "one time", value: String(displayUnit === "days" ? 0 : durationToDays(1, displayUnit)), unit: "days" });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const days = durationToDays(Number.isNaN(num) ? displayUnit === "days" ? 0 : 1 : num, displayUnit);
|
|
139
|
+
setValue({ followupType: "one time", value: String(days), unit: "days" });
|
|
140
|
+
},
|
|
141
|
+
[displayUnit, setValue, setTouched]
|
|
142
|
+
);
|
|
143
|
+
const handleUnitChange = react.useCallback(
|
|
144
|
+
(newUnit) => {
|
|
145
|
+
if (newUnit === displayUnit) return;
|
|
146
|
+
const n = daysToDisplayCount(daysNum, displayUnit);
|
|
147
|
+
setDisplayUnit(newUnit);
|
|
148
|
+
if (!hasFollowup) return;
|
|
149
|
+
setTouched();
|
|
150
|
+
const newDays = durationToDays(n, newUnit);
|
|
151
|
+
setValue({ followupType: "one time", value: String(newDays), unit: "days" });
|
|
152
|
+
},
|
|
153
|
+
[displayUnit, daysNum, hasFollowup, setValue, setTouched]
|
|
154
|
+
);
|
|
155
|
+
const handleDateSelect = react.useCallback(
|
|
156
|
+
(selected) => {
|
|
157
|
+
setTouched();
|
|
158
|
+
setCalendarOpen(false);
|
|
159
|
+
if (!selected) return;
|
|
160
|
+
const days = dateToDays(selected);
|
|
161
|
+
setValue({ followupType: "one time", value: String(days), unit: "days" });
|
|
162
|
+
},
|
|
163
|
+
[setValue, setTouched]
|
|
164
|
+
);
|
|
165
|
+
if (!visible || !fieldDef) return null;
|
|
166
|
+
const minDate = /* @__PURE__ */ new Date();
|
|
167
|
+
minDate.setHours(0, 0, 0, 0);
|
|
168
|
+
const selectedDate = currentDate || getDefaultDate();
|
|
169
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkJE6VXRWW_cjs.Card, { className: chunkFHHISVCH_cjs.cn(error && "border-destructive"), children: /* @__PURE__ */ jsxRuntime.jsxs(chunkJE6VXRWW_cjs.CardContent, { className: "space-y-1 p-2", children: [
|
|
170
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-between gap-2", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center flex-shrink-0 gap-2", children: [
|
|
171
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { className: "text-xs font-semibold text-muted-foreground", children: "Follow-up" }),
|
|
172
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
173
|
+
chunk4KSZUIJE_cjs.Select,
|
|
174
|
+
{
|
|
175
|
+
value: currentFollowupType,
|
|
176
|
+
onValueChange: (v) => handleFollowupTypeChange(v),
|
|
177
|
+
disabled,
|
|
178
|
+
children: [
|
|
179
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectTrigger, { className: "w-[140px] border-none bg-muted/50 text-xs py-1 focus:outline-none focus:ring-0 focus:ring-offset-0", children: /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectValue, {}) }),
|
|
180
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectContent, { children: FOLLOWUP_TYPE_OPTIONS.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectItem, { value: opt.value, className: "text-xs", children: opt.label }, opt.value)) })
|
|
181
|
+
]
|
|
182
|
+
}
|
|
183
|
+
)
|
|
184
|
+
] }) }),
|
|
185
|
+
currentFollowupType !== "no followup" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
186
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
|
|
187
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { className: "text-xs font-medium text-muted-foreground", children: "Schedule by:" }),
|
|
188
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
189
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
190
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
191
|
+
"input",
|
|
192
|
+
{
|
|
193
|
+
type: "radio",
|
|
194
|
+
name: `followup-mode-${fieldId}`,
|
|
195
|
+
value: "duration",
|
|
196
|
+
checked: followupMode === "duration",
|
|
197
|
+
onChange: () => handleModeChange("duration"),
|
|
198
|
+
className: "h-4 w-4 text-primary focus:ring-primary",
|
|
199
|
+
disabled
|
|
200
|
+
}
|
|
201
|
+
),
|
|
202
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Duration" })
|
|
203
|
+
] }),
|
|
204
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
205
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
206
|
+
"input",
|
|
207
|
+
{
|
|
208
|
+
type: "radio",
|
|
209
|
+
name: `followup-mode-${fieldId}`,
|
|
210
|
+
value: "date",
|
|
211
|
+
checked: followupMode === "date",
|
|
212
|
+
onChange: () => handleModeChange("date"),
|
|
213
|
+
className: "h-4 w-4 text-primary focus:ring-primary",
|
|
214
|
+
disabled
|
|
215
|
+
}
|
|
216
|
+
),
|
|
217
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Date" })
|
|
218
|
+
] })
|
|
219
|
+
] })
|
|
220
|
+
] }),
|
|
221
|
+
followupMode === "duration" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
222
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold text-muted-foreground", children: "In" }),
|
|
223
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
224
|
+
"input",
|
|
225
|
+
{
|
|
226
|
+
type: "number",
|
|
227
|
+
min: currentUnit === "days" ? 0 : 1,
|
|
228
|
+
value: currentValue,
|
|
229
|
+
onChange: (e) => handleValueChange(e.target.value),
|
|
230
|
+
disabled,
|
|
231
|
+
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",
|
|
232
|
+
placeholder: "7"
|
|
233
|
+
}
|
|
234
|
+
),
|
|
235
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
236
|
+
chunk4KSZUIJE_cjs.Select,
|
|
237
|
+
{
|
|
238
|
+
value: currentUnit,
|
|
239
|
+
onValueChange: (v) => handleUnitChange(v),
|
|
240
|
+
disabled,
|
|
241
|
+
children: [
|
|
242
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectTrigger, { className: "w-[100px] h-8 text-xs", children: /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectValue, { className: "text-xs" }) }),
|
|
243
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectContent, { children: UNIT_OPTIONS.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectItem, { value: opt.value, className: "text-xs", children: opt.label }, opt.value)) })
|
|
244
|
+
]
|
|
245
|
+
}
|
|
246
|
+
)
|
|
247
|
+
] }),
|
|
248
|
+
followupMode === "date" && /* @__PURE__ */ jsxRuntime.jsxs(chunkAZSAPO2V_cjs.Popover, { open: calendarOpen, onOpenChange: setCalendarOpen, children: [
|
|
249
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkAZSAPO2V_cjs.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
250
|
+
chunkO3VQBPEW_cjs.Button,
|
|
251
|
+
{
|
|
252
|
+
type: "button",
|
|
253
|
+
variant: "outline",
|
|
254
|
+
className: "w-full justify-start text-left font-normal h-9",
|
|
255
|
+
disabled,
|
|
256
|
+
children: [
|
|
257
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Calendar, { className: "mr-2 h-4 w-4 text-muted-foreground" }),
|
|
258
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: hasFollowup && currentDate ? dateFns.format(currentDate, "MMM d, yyyy") : "Select date" })
|
|
259
|
+
]
|
|
260
|
+
}
|
|
261
|
+
) }),
|
|
262
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkAZSAPO2V_cjs.PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
263
|
+
chunkAZSAPO2V_cjs.Calendar,
|
|
264
|
+
{
|
|
265
|
+
mode: "single",
|
|
266
|
+
selected: selectedDate,
|
|
267
|
+
onSelect: handleDateSelect,
|
|
268
|
+
disabled: (date) => date < minDate,
|
|
269
|
+
initialFocus: true
|
|
270
|
+
}
|
|
271
|
+
) })
|
|
272
|
+
] }),
|
|
273
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
274
|
+
"One-time appointment",
|
|
275
|
+
" ",
|
|
276
|
+
followupMode === "duration" ? `in ${currentValue} ${currentUnit}` : hasFollowup && currentDate ? `on ${dateFns.format(currentDate, "MMM d, yyyy")}` : "date to be selected"
|
|
277
|
+
] })
|
|
278
|
+
] }),
|
|
279
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-destructive", children: error })
|
|
280
|
+
] }) });
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
exports.FollowupWidget = FollowupWidget;
|
|
284
|
+
//# sourceMappingURL=FollowupWidget-EEKOI2TW.cjs.map
|
|
285
|
+
//# sourceMappingURL=FollowupWidget-EEKOI2TW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/FollowupWidget.tsx"],"names":["addDays","addWeeks","differenceInCalendarDays","days","parseISO","useField","useState","useCallback","jsx","Card","cn","jsxs","CardContent","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Fragment","Popover","PopoverTrigger","Button","CalendarIcon","format","PopoverContent","Calendar"],"mappings":"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","file":"FollowupWidget-EEKOI2TW.cjs","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,283 @@
|
|
|
1
|
+
import { Card, CardContent } from './chunk-LGGOBIEA.mjs';
|
|
2
|
+
import { Popover, PopoverTrigger, PopoverContent, Calendar as Calendar$1 } from './chunk-BMNY7F6H.mjs';
|
|
3
|
+
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-AZHTIUOL.mjs';
|
|
4
|
+
import { Button } from './chunk-GXXWMHAA.mjs';
|
|
5
|
+
import { useField } from './chunk-ZGPHTPAN.mjs';
|
|
6
|
+
import { Label } from './chunk-HEFZA2AH.mjs';
|
|
7
|
+
import { cn } from './chunk-VPU66PI6.mjs';
|
|
8
|
+
import { useState, useCallback } from 'react';
|
|
9
|
+
import { format, addDays, addWeeks, differenceInCalendarDays, parseISO } from 'date-fns';
|
|
10
|
+
import { Calendar } from 'lucide-react';
|
|
11
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
12
|
+
|
|
13
|
+
var FOLLOWUP_TYPE_OPTIONS = [
|
|
14
|
+
{ value: "no followup", label: "No Follow-up" },
|
|
15
|
+
{ value: "one time", label: "One Time" }
|
|
16
|
+
];
|
|
17
|
+
var UNIT_OPTIONS = [
|
|
18
|
+
{ value: "days", label: "Days" },
|
|
19
|
+
{ value: "weeks", label: "Weeks" },
|
|
20
|
+
{ value: "months", label: "Months" }
|
|
21
|
+
];
|
|
22
|
+
var DAYS_PER_MONTH = 30;
|
|
23
|
+
function durationToDays(valueNum, unit) {
|
|
24
|
+
const today = /* @__PURE__ */ new Date();
|
|
25
|
+
today.setHours(0, 0, 0, 0);
|
|
26
|
+
let target;
|
|
27
|
+
if (unit === "days") target = addDays(today, valueNum);
|
|
28
|
+
else if (unit === "weeks") target = addWeeks(today, valueNum);
|
|
29
|
+
else target = addDays(today, valueNum * DAYS_PER_MONTH);
|
|
30
|
+
return Math.max(0, differenceInCalendarDays(target, today));
|
|
31
|
+
}
|
|
32
|
+
function daysToDisplayCount(daysNum, unit) {
|
|
33
|
+
if (unit === "days") return Math.max(0, daysNum);
|
|
34
|
+
if (unit === "weeks") return Math.round(daysNum / 7) || 1;
|
|
35
|
+
return Math.round(daysNum / DAYS_PER_MONTH) || 1;
|
|
36
|
+
}
|
|
37
|
+
function dateToDays(date) {
|
|
38
|
+
const today = /* @__PURE__ */ new Date();
|
|
39
|
+
today.setHours(0, 0, 0, 0);
|
|
40
|
+
const d = new Date(date);
|
|
41
|
+
d.setHours(0, 0, 0, 0);
|
|
42
|
+
return Math.max(0, differenceInCalendarDays(d, today));
|
|
43
|
+
}
|
|
44
|
+
function daysToDate(days) {
|
|
45
|
+
const today = /* @__PURE__ */ new Date();
|
|
46
|
+
today.setHours(0, 0, 0, 0);
|
|
47
|
+
return addDays(today, days);
|
|
48
|
+
}
|
|
49
|
+
function normalizeFollowup(value) {
|
|
50
|
+
if (value === false || value === null || value === void 0) return false;
|
|
51
|
+
if (typeof value !== "object") return false;
|
|
52
|
+
const o = value;
|
|
53
|
+
if (o.followupType !== "one time") return false;
|
|
54
|
+
if (typeof o.value === "string" && o.unit === "days") {
|
|
55
|
+
return { followupType: "one time", value: o.value, unit: "days" };
|
|
56
|
+
}
|
|
57
|
+
const today = /* @__PURE__ */ new Date();
|
|
58
|
+
today.setHours(0, 0, 0, 0);
|
|
59
|
+
if (o.mode === "date" && typeof o.date === "string") {
|
|
60
|
+
const d = parseLocalDate(o.date);
|
|
61
|
+
if (d) {
|
|
62
|
+
const days2 = dateToDays(d);
|
|
63
|
+
return { followupType: "one time", value: String(days2), unit: "days" };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const val = o.value != null ? Number(String(o.value)) : 7;
|
|
67
|
+
const u = o.unit === "weeks" || o.unit === "months" ? o.unit : "days";
|
|
68
|
+
const days = durationToDays(Number.isNaN(val) ? 7 : val, u);
|
|
69
|
+
return { followupType: "one time", value: String(days), unit: "days" };
|
|
70
|
+
}
|
|
71
|
+
function getDefaultDate() {
|
|
72
|
+
const d = /* @__PURE__ */ new Date();
|
|
73
|
+
d.setDate(d.getDate() + 7);
|
|
74
|
+
return d;
|
|
75
|
+
}
|
|
76
|
+
function parseLocalDate(dateString) {
|
|
77
|
+
if (!dateString) return null;
|
|
78
|
+
try {
|
|
79
|
+
return parseISO(dateString);
|
|
80
|
+
} catch {
|
|
81
|
+
const parts = dateString.split("-");
|
|
82
|
+
if (parts.length === 3) {
|
|
83
|
+
const y = parseInt(parts[0], 10);
|
|
84
|
+
const m = parseInt(parts[1], 10) - 1;
|
|
85
|
+
const d = parseInt(parts[2], 10);
|
|
86
|
+
if (!Number.isNaN(y) && !Number.isNaN(m) && !Number.isNaN(d)) {
|
|
87
|
+
return new Date(y, m, d);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
var FollowupWidget = ({ fieldId }) => {
|
|
94
|
+
const { fieldDef, value, setValue, setTouched, error, disabled, visible } = useField(fieldId);
|
|
95
|
+
const followup = normalizeFollowup(value);
|
|
96
|
+
const [calendarOpen, setCalendarOpen] = useState(false);
|
|
97
|
+
const currentFollowupType = followup ? followup.followupType : "no followup";
|
|
98
|
+
const hasFollowup = followup !== false;
|
|
99
|
+
const [displayMode, setDisplayMode] = useState("duration");
|
|
100
|
+
const [displayUnit, setDisplayUnit] = useState("days");
|
|
101
|
+
const daysNum = hasFollowup ? parseInt(followup.value, 10) || 7 : 7;
|
|
102
|
+
const currentDate = hasFollowup ? daysToDate(daysNum) : null;
|
|
103
|
+
const followupMode = displayMode;
|
|
104
|
+
const currentValue = hasFollowup ? String(daysToDisplayCount(daysNum, displayUnit)) : "7";
|
|
105
|
+
const currentUnit = displayUnit;
|
|
106
|
+
const handleFollowupTypeChange = useCallback(
|
|
107
|
+
(newType) => {
|
|
108
|
+
setTouched();
|
|
109
|
+
if (newType === "no followup") {
|
|
110
|
+
setValue(false);
|
|
111
|
+
setCalendarOpen(false);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
setValue({
|
|
115
|
+
followupType: "one time",
|
|
116
|
+
value: hasFollowup ? followup.value : "7",
|
|
117
|
+
unit: "days"
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
[followup, hasFollowup, setValue, setTouched]
|
|
121
|
+
);
|
|
122
|
+
const handleModeChange = useCallback((newMode) => {
|
|
123
|
+
setDisplayMode(newMode);
|
|
124
|
+
if (newMode === "date") setCalendarOpen(false);
|
|
125
|
+
}, []);
|
|
126
|
+
const handleValueChange = useCallback(
|
|
127
|
+
(newValue) => {
|
|
128
|
+
setTouched();
|
|
129
|
+
const num = parseInt(newValue, 10);
|
|
130
|
+
const min = displayUnit === "days" ? 0 : 1;
|
|
131
|
+
const valid = (Number.isNaN(num) ? min : num) >= min || newValue === "";
|
|
132
|
+
if (!valid && newValue !== "") {
|
|
133
|
+
setValue({ followupType: "one time", value: String(displayUnit === "days" ? 0 : durationToDays(1, displayUnit)), unit: "days" });
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const days = durationToDays(Number.isNaN(num) ? displayUnit === "days" ? 0 : 1 : num, displayUnit);
|
|
137
|
+
setValue({ followupType: "one time", value: String(days), unit: "days" });
|
|
138
|
+
},
|
|
139
|
+
[displayUnit, setValue, setTouched]
|
|
140
|
+
);
|
|
141
|
+
const handleUnitChange = useCallback(
|
|
142
|
+
(newUnit) => {
|
|
143
|
+
if (newUnit === displayUnit) return;
|
|
144
|
+
const n = daysToDisplayCount(daysNum, displayUnit);
|
|
145
|
+
setDisplayUnit(newUnit);
|
|
146
|
+
if (!hasFollowup) return;
|
|
147
|
+
setTouched();
|
|
148
|
+
const newDays = durationToDays(n, newUnit);
|
|
149
|
+
setValue({ followupType: "one time", value: String(newDays), unit: "days" });
|
|
150
|
+
},
|
|
151
|
+
[displayUnit, daysNum, hasFollowup, setValue, setTouched]
|
|
152
|
+
);
|
|
153
|
+
const handleDateSelect = useCallback(
|
|
154
|
+
(selected) => {
|
|
155
|
+
setTouched();
|
|
156
|
+
setCalendarOpen(false);
|
|
157
|
+
if (!selected) return;
|
|
158
|
+
const days = dateToDays(selected);
|
|
159
|
+
setValue({ followupType: "one time", value: String(days), unit: "days" });
|
|
160
|
+
},
|
|
161
|
+
[setValue, setTouched]
|
|
162
|
+
);
|
|
163
|
+
if (!visible || !fieldDef) return null;
|
|
164
|
+
const minDate = /* @__PURE__ */ new Date();
|
|
165
|
+
minDate.setHours(0, 0, 0, 0);
|
|
166
|
+
const selectedDate = currentDate || getDefaultDate();
|
|
167
|
+
return /* @__PURE__ */ jsx(Card, { className: cn(error && "border-destructive"), children: /* @__PURE__ */ jsxs(CardContent, { className: "space-y-1 p-2", children: [
|
|
168
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-between gap-2", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center flex-shrink-0 gap-2", children: [
|
|
169
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs font-semibold text-muted-foreground", children: "Follow-up" }),
|
|
170
|
+
/* @__PURE__ */ jsxs(
|
|
171
|
+
Select,
|
|
172
|
+
{
|
|
173
|
+
value: currentFollowupType,
|
|
174
|
+
onValueChange: (v) => handleFollowupTypeChange(v),
|
|
175
|
+
disabled,
|
|
176
|
+
children: [
|
|
177
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-[140px] border-none bg-muted/50 text-xs py-1 focus:outline-none focus:ring-0 focus:ring-offset-0", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
178
|
+
/* @__PURE__ */ jsx(SelectContent, { children: FOLLOWUP_TYPE_OPTIONS.map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: opt.value, className: "text-xs", children: opt.label }, opt.value)) })
|
|
179
|
+
]
|
|
180
|
+
}
|
|
181
|
+
)
|
|
182
|
+
] }) }),
|
|
183
|
+
currentFollowupType !== "no followup" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
184
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
|
|
185
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs font-medium text-muted-foreground", children: "Schedule by:" }),
|
|
186
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
187
|
+
/* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
188
|
+
/* @__PURE__ */ jsx(
|
|
189
|
+
"input",
|
|
190
|
+
{
|
|
191
|
+
type: "radio",
|
|
192
|
+
name: `followup-mode-${fieldId}`,
|
|
193
|
+
value: "duration",
|
|
194
|
+
checked: followupMode === "duration",
|
|
195
|
+
onChange: () => handleModeChange("duration"),
|
|
196
|
+
className: "h-4 w-4 text-primary focus:ring-primary",
|
|
197
|
+
disabled
|
|
198
|
+
}
|
|
199
|
+
),
|
|
200
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Duration" })
|
|
201
|
+
] }),
|
|
202
|
+
/* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
203
|
+
/* @__PURE__ */ jsx(
|
|
204
|
+
"input",
|
|
205
|
+
{
|
|
206
|
+
type: "radio",
|
|
207
|
+
name: `followup-mode-${fieldId}`,
|
|
208
|
+
value: "date",
|
|
209
|
+
checked: followupMode === "date",
|
|
210
|
+
onChange: () => handleModeChange("date"),
|
|
211
|
+
className: "h-4 w-4 text-primary focus:ring-primary",
|
|
212
|
+
disabled
|
|
213
|
+
}
|
|
214
|
+
),
|
|
215
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Date" })
|
|
216
|
+
] })
|
|
217
|
+
] })
|
|
218
|
+
] }),
|
|
219
|
+
followupMode === "duration" && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
220
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-muted-foreground", children: "In" }),
|
|
221
|
+
/* @__PURE__ */ jsx(
|
|
222
|
+
"input",
|
|
223
|
+
{
|
|
224
|
+
type: "number",
|
|
225
|
+
min: currentUnit === "days" ? 0 : 1,
|
|
226
|
+
value: currentValue,
|
|
227
|
+
onChange: (e) => handleValueChange(e.target.value),
|
|
228
|
+
disabled,
|
|
229
|
+
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",
|
|
230
|
+
placeholder: "7"
|
|
231
|
+
}
|
|
232
|
+
),
|
|
233
|
+
/* @__PURE__ */ jsxs(
|
|
234
|
+
Select,
|
|
235
|
+
{
|
|
236
|
+
value: currentUnit,
|
|
237
|
+
onValueChange: (v) => handleUnitChange(v),
|
|
238
|
+
disabled,
|
|
239
|
+
children: [
|
|
240
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-[100px] h-8 text-xs", children: /* @__PURE__ */ jsx(SelectValue, { className: "text-xs" }) }),
|
|
241
|
+
/* @__PURE__ */ jsx(SelectContent, { children: UNIT_OPTIONS.map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: opt.value, className: "text-xs", children: opt.label }, opt.value)) })
|
|
242
|
+
]
|
|
243
|
+
}
|
|
244
|
+
)
|
|
245
|
+
] }),
|
|
246
|
+
followupMode === "date" && /* @__PURE__ */ jsxs(Popover, { open: calendarOpen, onOpenChange: setCalendarOpen, children: [
|
|
247
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
248
|
+
Button,
|
|
249
|
+
{
|
|
250
|
+
type: "button",
|
|
251
|
+
variant: "outline",
|
|
252
|
+
className: "w-full justify-start text-left font-normal h-9",
|
|
253
|
+
disabled,
|
|
254
|
+
children: [
|
|
255
|
+
/* @__PURE__ */ jsx(Calendar, { className: "mr-2 h-4 w-4 text-muted-foreground" }),
|
|
256
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: hasFollowup && currentDate ? format(currentDate, "MMM d, yyyy") : "Select date" })
|
|
257
|
+
]
|
|
258
|
+
}
|
|
259
|
+
) }),
|
|
260
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsx(
|
|
261
|
+
Calendar$1,
|
|
262
|
+
{
|
|
263
|
+
mode: "single",
|
|
264
|
+
selected: selectedDate,
|
|
265
|
+
onSelect: handleDateSelect,
|
|
266
|
+
disabled: (date) => date < minDate,
|
|
267
|
+
initialFocus: true
|
|
268
|
+
}
|
|
269
|
+
) })
|
|
270
|
+
] }),
|
|
271
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
272
|
+
"One-time appointment",
|
|
273
|
+
" ",
|
|
274
|
+
followupMode === "duration" ? `in ${currentValue} ${currentUnit}` : hasFollowup && currentDate ? `on ${format(currentDate, "MMM d, yyyy")}` : "date to be selected"
|
|
275
|
+
] })
|
|
276
|
+
] }),
|
|
277
|
+
error && /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: error })
|
|
278
|
+
] }) });
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
export { FollowupWidget };
|
|
282
|
+
//# sourceMappingURL=FollowupWidget-NJ4QDBOG.mjs.map
|
|
283
|
+
//# sourceMappingURL=FollowupWidget-NJ4QDBOG.mjs.map
|