formanitor 0.2.3 → 0.2.4
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/BpeChartWidget-HATASHAC.mjs +7 -0
- package/dist/BpeChartWidget-HATASHAC.mjs.map +1 -0
- package/dist/BpeChartWidget-VZRH7M7L.cjs +28 -0
- package/dist/BpeChartWidget-VZRH7M7L.cjs.map +1 -0
- package/dist/{DateTimeWidget-3AUBZYYK.mjs → DateTimeWidget-KRX4O6OD.mjs} +5 -4
- package/dist/DateTimeWidget-KRX4O6OD.mjs.map +1 -0
- package/dist/{DateTimeWidget-OS7ER5F6.cjs → DateTimeWidget-RJ7SATVA.cjs} +6 -5
- package/dist/DateTimeWidget-RJ7SATVA.cjs.map +1 -0
- package/dist/{DateWidget-KCTE6N5G.mjs → DateWidget-JEKDKPNS.mjs} +4 -3
- package/dist/DateWidget-JEKDKPNS.mjs.map +1 -0
- package/dist/{DateWidget-UNLX544Z.cjs → DateWidget-T7IQUWEA.cjs} +8 -7
- package/dist/DateWidget-T7IQUWEA.cjs.map +1 -0
- package/dist/DentalChartWidget-LYLOFWZU.cjs +21 -0
- package/dist/DentalChartWidget-LYLOFWZU.cjs.map +1 -0
- package/dist/DentalChartWidget-P2YPKAMO.mjs +8 -0
- package/dist/DentalChartWidget-P2YPKAMO.mjs.map +1 -0
- package/dist/{EditableTable-VQ72UEFF.cjs → EditableTable-OW5LC6OC.cjs} +6 -5
- package/dist/EditableTable-OW5LC6OC.cjs.map +1 -0
- package/dist/{EditableTable-XFCPKSUY.mjs → EditableTable-VZ66IXYI.mjs} +5 -4
- package/dist/EditableTable-VZ66IXYI.mjs.map +1 -0
- package/dist/ExtraOralExamWidget-JVKJ4ZWC.mjs +438 -0
- package/dist/ExtraOralExamWidget-JVKJ4ZWC.mjs.map +1 -0
- package/dist/ExtraOralExamWidget-ZIOSKMIO.cjs +440 -0
- package/dist/ExtraOralExamWidget-ZIOSKMIO.cjs.map +1 -0
- package/dist/{FollowupWidget-MAYTHM2E.cjs → FollowupWidget-2STSJSDY.cjs} +8 -7
- package/dist/FollowupWidget-2STSJSDY.cjs.map +1 -0
- package/dist/{FollowupWidget-BFZ6P2JE.mjs → FollowupWidget-GCGPWZVY.mjs} +4 -3
- package/dist/FollowupWidget-GCGPWZVY.mjs.map +1 -0
- package/dist/{OBGPathwayWidget-X67XKRIH.mjs → OBGPathwayWidget-QJNWUIEM.mjs} +4 -3
- package/dist/OBGPathwayWidget-QJNWUIEM.mjs.map +1 -0
- package/dist/{OBGPathwayWidget-XGN3HEWS.cjs → OBGPathwayWidget-YRU36UL7.cjs} +13 -12
- package/dist/OBGPathwayWidget-YRU36UL7.cjs.map +1 -0
- package/dist/{ObstetricHistoryWidget-Z4VAXH3E.mjs → ObstetricHistoryWidget-EW6JLNQ7.mjs} +4 -3
- package/dist/ObstetricHistoryWidget-EW6JLNQ7.mjs.map +1 -0
- package/dist/{ObstetricHistoryWidget-RP7NY4PV.cjs → ObstetricHistoryWidget-OOWCVFRB.cjs} +10 -9
- package/dist/ObstetricHistoryWidget-OOWCVFRB.cjs.map +1 -0
- package/dist/PregnancyStatusWidget-QTTVFBOE.cjs +96 -0
- package/dist/PregnancyStatusWidget-QTTVFBOE.cjs.map +1 -0
- package/dist/PregnancyStatusWidget-U2BEJGBJ.mjs +94 -0
- package/dist/PregnancyStatusWidget-U2BEJGBJ.mjs.map +1 -0
- package/dist/{SuggestionTextareaWidget-DY6M5JPO.cjs → SuggestionTextareaWidget-FWRZ46MV.cjs} +5 -5
- package/dist/{SuggestionTextareaWidget-DY6M5JPO.cjs.map → SuggestionTextareaWidget-FWRZ46MV.cjs.map} +1 -1
- package/dist/{SuggestionTextareaWidget-GQTWCFBG.mjs → SuggestionTextareaWidget-UNL3FZRI.mjs} +3 -3
- package/dist/{SuggestionTextareaWidget-GQTWCFBG.mjs.map → SuggestionTextareaWidget-UNL3FZRI.mjs.map} +1 -1
- package/dist/TreatmentPlanWidget-665HLKYV.mjs +317 -0
- package/dist/TreatmentPlanWidget-665HLKYV.mjs.map +1 -0
- package/dist/TreatmentPlanWidget-TATWSPLY.cjs +319 -0
- package/dist/TreatmentPlanWidget-TATWSPLY.cjs.map +1 -0
- package/dist/{chunk-4PMNVBJD.mjs → chunk-2OMQV2ZB.mjs} +4 -3
- package/dist/chunk-2OMQV2ZB.mjs.map +1 -0
- package/dist/chunk-5RT3S67O.cjs +30 -0
- package/dist/chunk-5RT3S67O.cjs.map +1 -0
- package/dist/chunk-6YUVILN5.mjs +42 -0
- package/dist/chunk-6YUVILN5.mjs.map +1 -0
- package/dist/{chunk-YEFM2ERQ.cjs → chunk-7OQFO6TM.cjs} +8 -7
- package/dist/chunk-7OQFO6TM.cjs.map +1 -0
- package/dist/chunk-BBD3Y37O.cjs +220 -0
- package/dist/chunk-BBD3Y37O.cjs.map +1 -0
- package/dist/chunk-EJ7MKHER.mjs +45 -0
- package/dist/chunk-EJ7MKHER.mjs.map +1 -0
- package/dist/{chunk-XN2QLBLT.mjs → chunk-G6Y4UJPN.mjs} +5 -4
- package/dist/chunk-G6Y4UJPN.mjs.map +1 -0
- package/dist/{chunk-AZSAPO2V.cjs → chunk-HXY3IX3G.cjs} +3 -44
- package/dist/chunk-HXY3IX3G.cjs.map +1 -0
- package/dist/{chunk-BMNY7F6H.mjs → chunk-JM7WNDNT.mjs} +4 -21
- package/dist/chunk-JM7WNDNT.mjs.map +1 -0
- package/dist/chunk-MQHZ7HD2.mjs +215 -0
- package/dist/chunk-MQHZ7HD2.mjs.map +1 -0
- package/dist/{chunk-ML47UEDU.cjs → chunk-O4FSJPU3.cjs} +2 -27
- package/dist/chunk-O4FSJPU3.cjs.map +1 -0
- package/dist/chunk-Q66LXMRR.mjs +28 -0
- package/dist/chunk-Q66LXMRR.mjs.map +1 -0
- package/dist/chunk-RILRMRXB.cjs +50 -0
- package/dist/chunk-RILRMRXB.cjs.map +1 -0
- package/dist/chunk-SQ2KNAUD.cjs +64 -0
- package/dist/chunk-SQ2KNAUD.cjs.map +1 -0
- package/dist/{chunk-TVFUWRTE.cjs → chunk-TCQQUJCL.cjs} +5 -4
- package/dist/chunk-TCQQUJCL.cjs.map +1 -0
- package/dist/chunk-UKSP3B3W.mjs +600 -0
- package/dist/chunk-UKSP3B3W.mjs.map +1 -0
- package/dist/chunk-X4AJCTON.cjs +607 -0
- package/dist/chunk-X4AJCTON.cjs.map +1 -0
- package/dist/chunk-ZZX3IG2T.mjs +25 -0
- package/dist/chunk-ZZX3IG2T.mjs.map +1 -0
- package/dist/index.cjs +104 -46
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +67 -3
- package/dist/index.d.ts +67 -3
- package/dist/index.mjs +70 -42
- package/dist/index.mjs.map +1 -1
- package/dist/read-only-table.d.cts +1 -1
- package/dist/read-only-table.d.ts +1 -1
- package/dist/smart.d.cts +1 -1
- package/dist/smart.d.ts +1 -1
- package/dist/{types-CYtJk8H9.d.ts → types-BbOnd5IN.d.cts} +53 -3
- package/dist/{types-CYtJk8H9.d.cts → types-BbOnd5IN.d.ts} +53 -3
- package/package.json +1 -1
- package/dist/DateTimeWidget-3AUBZYYK.mjs.map +0 -1
- package/dist/DateTimeWidget-OS7ER5F6.cjs.map +0 -1
- package/dist/DateWidget-KCTE6N5G.mjs.map +0 -1
- package/dist/DateWidget-UNLX544Z.cjs.map +0 -1
- package/dist/EditableTable-VQ72UEFF.cjs.map +0 -1
- package/dist/EditableTable-XFCPKSUY.mjs.map +0 -1
- package/dist/FollowupWidget-BFZ6P2JE.mjs.map +0 -1
- package/dist/FollowupWidget-MAYTHM2E.cjs.map +0 -1
- package/dist/OBGPathwayWidget-X67XKRIH.mjs.map +0 -1
- package/dist/OBGPathwayWidget-XGN3HEWS.cjs.map +0 -1
- package/dist/ObstetricHistoryWidget-RP7NY4PV.cjs.map +0 -1
- package/dist/ObstetricHistoryWidget-Z4VAXH3E.mjs.map +0 -1
- package/dist/chunk-4HDMR2LX.mjs +0 -69
- package/dist/chunk-4HDMR2LX.mjs.map +0 -1
- package/dist/chunk-4PMNVBJD.mjs.map +0 -1
- package/dist/chunk-AZSAPO2V.cjs.map +0 -1
- package/dist/chunk-BMNY7F6H.mjs.map +0 -1
- package/dist/chunk-ML47UEDU.cjs.map +0 -1
- package/dist/chunk-TVFUWRTE.cjs.map +0 -1
- package/dist/chunk-XN2QLBLT.mjs.map +0 -1
- package/dist/chunk-YEFM2ERQ.cjs.map +0 -1
package/dist/smart.d.cts
CHANGED
package/dist/smart.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type FieldType = "text" | "number" | "textarea" | "diagnosis_textarea" | "richtext" | "select" | "multiselect" | "radio" | "repeatable" | "checkbox" | "image_upload" | "media_upload" | "file_upload" | "signature" | "date" | "datetime" | "editable_table" | "static_text" | "medications" | "investigations" | "procedures" | "vitals" | "hidden_vitals" | "referral" | "followup" | "toggle" | "urology_smart_history" | "urology_examination" | "urology_pathway" | string;
|
|
1
|
+
type FieldType = "text" | "number" | "textarea" | "diagnosis_textarea" | "richtext" | "select" | "multiselect" | "radio" | "repeatable" | "checkbox" | "image_upload" | "media_upload" | "file_upload" | "signature" | "date" | "datetime" | "editable_table" | "static_text" | "medications" | "investigations" | "procedures" | "vitals" | "hidden_vitals" | "referral" | "followup" | "toggle" | "urology_smart_history" | "urology_examination" | "urology_pathway" | "dental_chart" | "bpe_chart" | "extra_oral_exam" | "social_history" | "treatment_plan" | "pregnancy_status" | string;
|
|
2
2
|
interface ValidationRule {
|
|
3
3
|
min?: number;
|
|
4
4
|
max?: number;
|
|
@@ -610,6 +610,56 @@ interface CampTimeSlotsFieldDef extends BaseFieldDef {
|
|
|
610
610
|
campDateFieldId?: string;
|
|
611
611
|
};
|
|
612
612
|
}
|
|
613
|
+
type ToothCondition = "cavity" | "filled" | "crown" | "missing" | "root_canal" | "bridge" | "implant" | "fractured" | "impacted";
|
|
614
|
+
interface ToothEntry {
|
|
615
|
+
conditions: ToothCondition[];
|
|
616
|
+
/** Surface locations per condition (only used for cavity / filled / fractured). */
|
|
617
|
+
surfaces?: Partial<Record<ToothCondition, string[]>>;
|
|
618
|
+
notes?: string;
|
|
619
|
+
}
|
|
620
|
+
/** Value shape for the `dental_chart` field type. */
|
|
621
|
+
interface DentalChartData {
|
|
622
|
+
teeth: Record<string, ToothEntry>;
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Interactive FDI dental chart. Value shape: `DentalChartData`.
|
|
626
|
+
* Stores the full tooth-condition map in form state and includes it in submission.
|
|
627
|
+
*/
|
|
628
|
+
interface DentalChartFieldDef extends BaseFieldDef {
|
|
629
|
+
type: "dental_chart";
|
|
630
|
+
}
|
|
631
|
+
interface BpeChartFieldDef extends BaseFieldDef {
|
|
632
|
+
type: "bpe_chart";
|
|
633
|
+
}
|
|
634
|
+
/** Social/lifestyle history — renders as a labelled textarea. */
|
|
635
|
+
interface SocialHistoryFieldDef extends BaseFieldDef {
|
|
636
|
+
type: "social_history";
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Treatment plan selector. `options` may be `string[]` or `{ label, value }[]`; the widget
|
|
640
|
+
* normalises them internally. Stores the selected value as a string or string[].
|
|
641
|
+
*/
|
|
642
|
+
interface TreatmentPlanFieldDef extends BaseFieldDef {
|
|
643
|
+
type: "treatment_plan";
|
|
644
|
+
options?: string[] | {
|
|
645
|
+
label: string;
|
|
646
|
+
value: string;
|
|
647
|
+
}[];
|
|
648
|
+
}
|
|
649
|
+
/** Value shape for `pregnancy_status` field. */
|
|
650
|
+
interface PregnancyStatusValue {
|
|
651
|
+
is_pregnant: boolean;
|
|
652
|
+
is_breastfeeding: boolean;
|
|
653
|
+
pregnant_notes?: string;
|
|
654
|
+
breastfeeding_notes?: string;
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* Pregnancy status — renders two inline toggles (Pregnant / Breastfeeding).
|
|
658
|
+
* Stored as `{ is_pregnant: boolean, is_breastfeeding: boolean }`.
|
|
659
|
+
*/
|
|
660
|
+
interface PregnancyStatusFieldDef extends BaseFieldDef {
|
|
661
|
+
type: "pregnancy_status";
|
|
662
|
+
}
|
|
613
663
|
/** Value shape stored in the form store after a successful OTP verification. */
|
|
614
664
|
interface OtpVerifiedValue {
|
|
615
665
|
verified: true;
|
|
@@ -618,7 +668,7 @@ interface OtpVerifiedValue {
|
|
|
618
668
|
code: string;
|
|
619
669
|
token?: string;
|
|
620
670
|
}
|
|
621
|
-
type FieldDef = TextFieldDef | RichTextFieldDef | NumberFieldDef | SliderFieldDef | SelectFieldDef | RadioFieldDef | CheckboxFieldDef | RepeatableFieldDef | ImageUploadFieldDef | MediaUploadFieldDef | FileUploadFieldDef | SignatureFieldDef | EditableTableFieldDef | StaticTextFieldDef | MedicationsFieldDef | InvestigationsFieldDef | ProceduresFieldDef | DifferentialDiagnosisFieldDef | VitalsFieldDef | ReferralFieldDef | FollowupFieldDef | SmartTextareaFieldDef | DiagnosisTextareaFieldDef | SuggestionTextareaFieldDef | LensAssessmentFieldDef | FunctionalImpairmentScoreFieldDef | ToggleFieldDef | BiometryIolWorkupFieldDef | SurgicalRiskFlagsFieldDef | GeneralSurgerySmartHistoryFieldDef | GeneralSurgeryExaminationFieldDef | GeneralSurgeryGradingFieldDef | UrologySmartHistoryFieldDef | UrologyExaminationFieldDef | UrologyPathwayFieldDef | OBGExaminationFieldDef | OBGPathwayFieldDef | PainScaleFlagsFieldDef | PhoneInputFieldDef | OtpInputFieldDef | CampDatesFieldDef | CampTimeSlotsFieldDef | BaseFieldDef;
|
|
671
|
+
type FieldDef = TextFieldDef | RichTextFieldDef | NumberFieldDef | SliderFieldDef | SelectFieldDef | RadioFieldDef | CheckboxFieldDef | RepeatableFieldDef | ImageUploadFieldDef | MediaUploadFieldDef | FileUploadFieldDef | SignatureFieldDef | EditableTableFieldDef | StaticTextFieldDef | MedicationsFieldDef | InvestigationsFieldDef | ProceduresFieldDef | DifferentialDiagnosisFieldDef | VitalsFieldDef | ReferralFieldDef | FollowupFieldDef | SmartTextareaFieldDef | DiagnosisTextareaFieldDef | SuggestionTextareaFieldDef | LensAssessmentFieldDef | FunctionalImpairmentScoreFieldDef | ToggleFieldDef | BiometryIolWorkupFieldDef | SurgicalRiskFlagsFieldDef | GeneralSurgerySmartHistoryFieldDef | GeneralSurgeryExaminationFieldDef | GeneralSurgeryGradingFieldDef | UrologySmartHistoryFieldDef | UrologyExaminationFieldDef | UrologyPathwayFieldDef | OBGExaminationFieldDef | OBGPathwayFieldDef | PainScaleFlagsFieldDef | PhoneInputFieldDef | OtpInputFieldDef | CampDatesFieldDef | CampTimeSlotsFieldDef | DentalChartFieldDef | BpeChartFieldDef | SocialHistoryFieldDef | TreatmentPlanFieldDef | PregnancyStatusFieldDef | BaseFieldDef;
|
|
622
672
|
/** Boolean switch; value is `true` | `false`. */
|
|
623
673
|
interface ToggleFieldDef extends BaseFieldDef {
|
|
624
674
|
type: "toggle";
|
|
@@ -779,4 +829,4 @@ interface FormState {
|
|
|
779
829
|
pendingUploads: number;
|
|
780
830
|
}
|
|
781
831
|
|
|
782
|
-
export type {
|
|
832
|
+
export type { LensAssessmentFieldDef as $, FieldStyleClassNames as A, BaseFieldDef as B, CampDateOption as C, DataSource as D, EditableTableColumnDef as E, FieldDef as F, FieldStyleConfig as G, FieldType as H, FileUploadFieldDef as I, FollowupFieldDef as J, FollowupValue as K, FormDef as L, FormErrors as M, FormState as N, FormValues as O, FormulaComputation as P, FormulaExpr as Q, FunctionalImpairmentDimension as R, FunctionalImpairmentScoreFieldDef as S, FunctionalImpairmentScoreValue as T, GeneralSurgeryExaminationFieldDef as U, GeneralSurgeryGradingFieldDef as V, GeneralSurgerySmartHistoryFieldDef as W, ImageUploadFieldDef as X, InvestigationFrequentItem as Y, InvestigationsFieldDef as Z, LayoutNode as _, BiometryIolWorkupFieldDef as a, LensAssessmentValue as a0, LocsGrades as a1, MatchedCondition as a2, MediaUploadFieldDef as a3, MedicationFrequentItem as a4, MedicationsFieldDef as a5, MultiStepLayoutNode as a6, MultiStepNode as a7, NumberFieldDef as a8, OBGExaminationFieldDef as a9, SmartTextareaValue as aA, SocialHistoryFieldDef as aB, StaticTextFieldDef as aC, SuggestionTextareaFieldDef as aD, SumComputation as aE, SurgicalRiskFlagsFieldDef as aF, SurgicalRiskFlagsValue as aG, TextFieldDef as aH, ToggleFieldDef as aI, ToothCondition as aJ, ToothEntry as aK, TreatmentPlanFieldDef as aL, UrologyExaminationFieldDef as aM, UrologyPathwayFieldDef as aN, UrologySmartHistoryFieldDef as aO, ValidationRule as aP, VitalsFieldDef as aQ, WebhookDef as aR, Workflow as aS, WorkflowTransition as aT, OBGPathwayFieldDef as aa, OtpInputFieldDef as ab, OtpVerifiedValue as ac, PainScaleFlagsFieldDef as ad, Permission as ae, PhoneInputFieldDef as af, PregnancyStatusFieldDef as ag, PregnancyStatusValue as ah, ProcedureFrequentItem as ai, ProceduresFieldDef as aj, RadioFieldDef as ak, ReferralFieldDef as al, ReferralItem as am, RepeatableFieldDef as an, RichTextFieldDef as ao, Rule as ap, RuleAction as aq, ScoreComputation as ar, ScoreRange as as, Section as at, SectionChild as au, SelectFieldDef as av, SelectOption as aw, SignatureFieldDef as ax, SliderFieldDef as ay, SmartTextareaFieldDef as az, BiometryIolWorkupValue as b, BiometryMethod as c, BpeChartFieldDef as d, CampDateSelection as e, CampDatesFieldDef as f, CampTimeSlotOption as g, CampTimeSlotsFieldDef as h, CheckboxFieldDef as i, ColumnLayout as j, Computation as k, Condition as l, DentalChartData as m, DentalChartFieldDef as n, DiagnosisGradeSelection as o, DiagnosisTextareaFieldDef as p, DiagnosisTextareaValue as q, DiagnosticPackage as r, DiagnosticPackageTest as s, DifferentialDiagnosisFieldDef as t, DoctorFrequentItems as u, EditableTableFieldDef as v, EventDefinition as w, ExtractedKeywordMatch as x, FieldPrefill as y, FieldState as z };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type FieldType = "text" | "number" | "textarea" | "diagnosis_textarea" | "richtext" | "select" | "multiselect" | "radio" | "repeatable" | "checkbox" | "image_upload" | "media_upload" | "file_upload" | "signature" | "date" | "datetime" | "editable_table" | "static_text" | "medications" | "investigations" | "procedures" | "vitals" | "hidden_vitals" | "referral" | "followup" | "toggle" | "urology_smart_history" | "urology_examination" | "urology_pathway" | string;
|
|
1
|
+
type FieldType = "text" | "number" | "textarea" | "diagnosis_textarea" | "richtext" | "select" | "multiselect" | "radio" | "repeatable" | "checkbox" | "image_upload" | "media_upload" | "file_upload" | "signature" | "date" | "datetime" | "editable_table" | "static_text" | "medications" | "investigations" | "procedures" | "vitals" | "hidden_vitals" | "referral" | "followup" | "toggle" | "urology_smart_history" | "urology_examination" | "urology_pathway" | "dental_chart" | "bpe_chart" | "extra_oral_exam" | "social_history" | "treatment_plan" | "pregnancy_status" | string;
|
|
2
2
|
interface ValidationRule {
|
|
3
3
|
min?: number;
|
|
4
4
|
max?: number;
|
|
@@ -610,6 +610,56 @@ interface CampTimeSlotsFieldDef extends BaseFieldDef {
|
|
|
610
610
|
campDateFieldId?: string;
|
|
611
611
|
};
|
|
612
612
|
}
|
|
613
|
+
type ToothCondition = "cavity" | "filled" | "crown" | "missing" | "root_canal" | "bridge" | "implant" | "fractured" | "impacted";
|
|
614
|
+
interface ToothEntry {
|
|
615
|
+
conditions: ToothCondition[];
|
|
616
|
+
/** Surface locations per condition (only used for cavity / filled / fractured). */
|
|
617
|
+
surfaces?: Partial<Record<ToothCondition, string[]>>;
|
|
618
|
+
notes?: string;
|
|
619
|
+
}
|
|
620
|
+
/** Value shape for the `dental_chart` field type. */
|
|
621
|
+
interface DentalChartData {
|
|
622
|
+
teeth: Record<string, ToothEntry>;
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Interactive FDI dental chart. Value shape: `DentalChartData`.
|
|
626
|
+
* Stores the full tooth-condition map in form state and includes it in submission.
|
|
627
|
+
*/
|
|
628
|
+
interface DentalChartFieldDef extends BaseFieldDef {
|
|
629
|
+
type: "dental_chart";
|
|
630
|
+
}
|
|
631
|
+
interface BpeChartFieldDef extends BaseFieldDef {
|
|
632
|
+
type: "bpe_chart";
|
|
633
|
+
}
|
|
634
|
+
/** Social/lifestyle history — renders as a labelled textarea. */
|
|
635
|
+
interface SocialHistoryFieldDef extends BaseFieldDef {
|
|
636
|
+
type: "social_history";
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Treatment plan selector. `options` may be `string[]` or `{ label, value }[]`; the widget
|
|
640
|
+
* normalises them internally. Stores the selected value as a string or string[].
|
|
641
|
+
*/
|
|
642
|
+
interface TreatmentPlanFieldDef extends BaseFieldDef {
|
|
643
|
+
type: "treatment_plan";
|
|
644
|
+
options?: string[] | {
|
|
645
|
+
label: string;
|
|
646
|
+
value: string;
|
|
647
|
+
}[];
|
|
648
|
+
}
|
|
649
|
+
/** Value shape for `pregnancy_status` field. */
|
|
650
|
+
interface PregnancyStatusValue {
|
|
651
|
+
is_pregnant: boolean;
|
|
652
|
+
is_breastfeeding: boolean;
|
|
653
|
+
pregnant_notes?: string;
|
|
654
|
+
breastfeeding_notes?: string;
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* Pregnancy status — renders two inline toggles (Pregnant / Breastfeeding).
|
|
658
|
+
* Stored as `{ is_pregnant: boolean, is_breastfeeding: boolean }`.
|
|
659
|
+
*/
|
|
660
|
+
interface PregnancyStatusFieldDef extends BaseFieldDef {
|
|
661
|
+
type: "pregnancy_status";
|
|
662
|
+
}
|
|
613
663
|
/** Value shape stored in the form store after a successful OTP verification. */
|
|
614
664
|
interface OtpVerifiedValue {
|
|
615
665
|
verified: true;
|
|
@@ -618,7 +668,7 @@ interface OtpVerifiedValue {
|
|
|
618
668
|
code: string;
|
|
619
669
|
token?: string;
|
|
620
670
|
}
|
|
621
|
-
type FieldDef = TextFieldDef | RichTextFieldDef | NumberFieldDef | SliderFieldDef | SelectFieldDef | RadioFieldDef | CheckboxFieldDef | RepeatableFieldDef | ImageUploadFieldDef | MediaUploadFieldDef | FileUploadFieldDef | SignatureFieldDef | EditableTableFieldDef | StaticTextFieldDef | MedicationsFieldDef | InvestigationsFieldDef | ProceduresFieldDef | DifferentialDiagnosisFieldDef | VitalsFieldDef | ReferralFieldDef | FollowupFieldDef | SmartTextareaFieldDef | DiagnosisTextareaFieldDef | SuggestionTextareaFieldDef | LensAssessmentFieldDef | FunctionalImpairmentScoreFieldDef | ToggleFieldDef | BiometryIolWorkupFieldDef | SurgicalRiskFlagsFieldDef | GeneralSurgerySmartHistoryFieldDef | GeneralSurgeryExaminationFieldDef | GeneralSurgeryGradingFieldDef | UrologySmartHistoryFieldDef | UrologyExaminationFieldDef | UrologyPathwayFieldDef | OBGExaminationFieldDef | OBGPathwayFieldDef | PainScaleFlagsFieldDef | PhoneInputFieldDef | OtpInputFieldDef | CampDatesFieldDef | CampTimeSlotsFieldDef | BaseFieldDef;
|
|
671
|
+
type FieldDef = TextFieldDef | RichTextFieldDef | NumberFieldDef | SliderFieldDef | SelectFieldDef | RadioFieldDef | CheckboxFieldDef | RepeatableFieldDef | ImageUploadFieldDef | MediaUploadFieldDef | FileUploadFieldDef | SignatureFieldDef | EditableTableFieldDef | StaticTextFieldDef | MedicationsFieldDef | InvestigationsFieldDef | ProceduresFieldDef | DifferentialDiagnosisFieldDef | VitalsFieldDef | ReferralFieldDef | FollowupFieldDef | SmartTextareaFieldDef | DiagnosisTextareaFieldDef | SuggestionTextareaFieldDef | LensAssessmentFieldDef | FunctionalImpairmentScoreFieldDef | ToggleFieldDef | BiometryIolWorkupFieldDef | SurgicalRiskFlagsFieldDef | GeneralSurgerySmartHistoryFieldDef | GeneralSurgeryExaminationFieldDef | GeneralSurgeryGradingFieldDef | UrologySmartHistoryFieldDef | UrologyExaminationFieldDef | UrologyPathwayFieldDef | OBGExaminationFieldDef | OBGPathwayFieldDef | PainScaleFlagsFieldDef | PhoneInputFieldDef | OtpInputFieldDef | CampDatesFieldDef | CampTimeSlotsFieldDef | DentalChartFieldDef | BpeChartFieldDef | SocialHistoryFieldDef | TreatmentPlanFieldDef | PregnancyStatusFieldDef | BaseFieldDef;
|
|
622
672
|
/** Boolean switch; value is `true` | `false`. */
|
|
623
673
|
interface ToggleFieldDef extends BaseFieldDef {
|
|
624
674
|
type: "toggle";
|
|
@@ -779,4 +829,4 @@ interface FormState {
|
|
|
779
829
|
pendingUploads: number;
|
|
780
830
|
}
|
|
781
831
|
|
|
782
|
-
export type {
|
|
832
|
+
export type { LensAssessmentFieldDef as $, FieldStyleClassNames as A, BaseFieldDef as B, CampDateOption as C, DataSource as D, EditableTableColumnDef as E, FieldDef as F, FieldStyleConfig as G, FieldType as H, FileUploadFieldDef as I, FollowupFieldDef as J, FollowupValue as K, FormDef as L, FormErrors as M, FormState as N, FormValues as O, FormulaComputation as P, FormulaExpr as Q, FunctionalImpairmentDimension as R, FunctionalImpairmentScoreFieldDef as S, FunctionalImpairmentScoreValue as T, GeneralSurgeryExaminationFieldDef as U, GeneralSurgeryGradingFieldDef as V, GeneralSurgerySmartHistoryFieldDef as W, ImageUploadFieldDef as X, InvestigationFrequentItem as Y, InvestigationsFieldDef as Z, LayoutNode as _, BiometryIolWorkupFieldDef as a, LensAssessmentValue as a0, LocsGrades as a1, MatchedCondition as a2, MediaUploadFieldDef as a3, MedicationFrequentItem as a4, MedicationsFieldDef as a5, MultiStepLayoutNode as a6, MultiStepNode as a7, NumberFieldDef as a8, OBGExaminationFieldDef as a9, SmartTextareaValue as aA, SocialHistoryFieldDef as aB, StaticTextFieldDef as aC, SuggestionTextareaFieldDef as aD, SumComputation as aE, SurgicalRiskFlagsFieldDef as aF, SurgicalRiskFlagsValue as aG, TextFieldDef as aH, ToggleFieldDef as aI, ToothCondition as aJ, ToothEntry as aK, TreatmentPlanFieldDef as aL, UrologyExaminationFieldDef as aM, UrologyPathwayFieldDef as aN, UrologySmartHistoryFieldDef as aO, ValidationRule as aP, VitalsFieldDef as aQ, WebhookDef as aR, Workflow as aS, WorkflowTransition as aT, OBGPathwayFieldDef as aa, OtpInputFieldDef as ab, OtpVerifiedValue as ac, PainScaleFlagsFieldDef as ad, Permission as ae, PhoneInputFieldDef as af, PregnancyStatusFieldDef as ag, PregnancyStatusValue as ah, ProcedureFrequentItem as ai, ProceduresFieldDef as aj, RadioFieldDef as ak, ReferralFieldDef as al, ReferralItem as am, RepeatableFieldDef as an, RichTextFieldDef as ao, Rule as ap, RuleAction as aq, ScoreComputation as ar, ScoreRange as as, Section as at, SectionChild as au, SelectFieldDef as av, SelectOption as aw, SignatureFieldDef as ax, SliderFieldDef as ay, SmartTextareaFieldDef as az, BiometryIolWorkupValue as b, BiometryMethod as c, BpeChartFieldDef as d, CampDateSelection as e, CampDatesFieldDef as f, CampTimeSlotOption as g, CampTimeSlotsFieldDef as h, CheckboxFieldDef as i, ColumnLayout as j, Computation as k, Condition as l, DentalChartData as m, DentalChartFieldDef as n, DiagnosisGradeSelection as o, DiagnosisTextareaFieldDef as p, DiagnosisTextareaValue as q, DiagnosticPackage as r, DiagnosticPackageTest as s, DifferentialDiagnosisFieldDef as t, DoctorFrequentItems as u, EditableTableFieldDef as v, EventDefinition as w, ExtractedKeywordMatch as x, FieldPrefill as y, FieldState as z };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/widgets/DateTimeWidget.tsx"],"names":[],"mappings":";;;;;;;;;;;;;AAcO,IAAM,cAAA,GAAgD,CAAC,EAAE,OAAA,EAAQ,KAAM;AAC5E,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,OAAO,QAAA,EAAU,OAAA,EAAQ,GAAI,QAAA,CAAS,OAAO,CAAA;AAC5F,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,OAAA,EAAQ;AAC1B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,KAAA,KAAU,WAAW,KAAA,CAAM,eAAA,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,eAAe,QAAQ,CAAA;AAEzC,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAA2B;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,QAAA,CAAS,MAAS,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,iBAAA,CAAkB,QAAA,EAAU,WAAW,CAAA,EACpD,QAAA,EAAA;AAAA,IAAA,SAAA,wBACE,KAAA,EAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAW,eAAA,CAAgB,QAAQ,CAAA,EACzD,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,KAAA;AAAA,MAAO,GAAA;AAAA,sBACjB,GAAA,CAAC,0BAAuB,QAAA,EAAoB;AAAA,KAAA,EAC9C,CAAA,GACE,IAAA;AAAA,oBACJ,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,MAAM,UAAA,EAAW;AAAA,QACzB,SAAA,EAAW,WAAW,gCAAA,GAAmC,MAAA;AAAA,QAEzD,QAAA,kBAAA,GAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,WAAA;AAAA,YACV,WAAA,EAAa,YAAA;AAAA,YACb,aAAa,QAAA,CAAS,WAAA;AAAA,YACtB,SAAA,EAAW,iBAAA;AAAA,cACT,QAAA;AAAA,cACA,YAAY,uBAAA,GAA0B;AAAA;AACxC;AAAA;AACF;AAAA,KACF;AAAA,IACC,SAAA,wBACE,GAAA,EAAA,EAAE,SAAA,EAAW,gBAAgB,QAAA,EAAU,sBAAsB,GAAI,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAE5E,CAAA;AAEJ","file":"DateTimeWidget-3AUBZYYK.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { DateTimePicker } from '../shadcn/datetime-picker';\nimport { Label } from '../shadcn/label';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const DateTimeWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef) return null;\n\n const currentDate = value ? new Date(value) : undefined;\n const showLabel = isLabelVisible(fieldDef);\n\n const handleChange = (date: Date | undefined) => {\n if (!date) {\n setValue(undefined);\n return;\n }\n setValue(date.toISOString());\n };\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {showLabel ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n ) : null}\n <div\n onBlur={() => setTouched()}\n className={disabled ? 'opacity-60 pointer-events-none' : undefined}\n >\n <DateTimePicker\n dateTime={currentDate}\n setDateTime={handleChange}\n placeholder={fieldDef.placeholder}\n className={fieldControlClass(\n fieldDef,\n showError ? 'border-red-500 w-full' : 'w-full',\n )}\n />\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/widgets/DateTimeWidget.tsx"],"names":["useField","useForm","isLabelVisible","fieldWrapperClass","Label","fieldLabelClass","jsx","FieldRequiredIndicator","DateTimePicker","fieldControlClass","fieldErrorClass"],"mappings":";;;;;;;;;;;;;;;AAcO,IAAM,cAAA,GAAgD,CAAC,EAAE,OAAA,EAAQ,KAAM;AAC5E,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,OAAO,QAAA,EAAU,OAAA,EAAQ,GAAIA,0BAAA,CAAS,OAAO,CAAA;AAC5F,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIC,yBAAA,EAAQ;AAC1B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,KAAA,KAAU,WAAW,KAAA,CAAM,eAAA,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AAC9C,EAAA,MAAM,SAAA,GAAYC,iCAAe,QAAQ,CAAA;AAEzC,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAA2B;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,QAAA,CAAS,MAAS,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAWC,mCAAA,CAAkB,QAAA,EAAU,WAAW,CAAA,EACpD,QAAA,EAAA;AAAA,IAAA,SAAA,mCACEC,uBAAA,EAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAWC,iCAAA,CAAgB,QAAQ,CAAA,EACzD,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,KAAA;AAAA,MAAO,GAAA;AAAA,sBACjBC,cAAA,CAACC,4CAAuB,QAAA,EAAoB;AAAA,KAAA,EAC9C,CAAA,GACE,IAAA;AAAA,oBACJD,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,MAAM,UAAA,EAAW;AAAA,QACzB,SAAA,EAAW,WAAW,gCAAA,GAAmC,MAAA;AAAA,QAEzD,QAAA,kBAAAA,cAAA;AAAA,UAACE,gCAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,WAAA;AAAA,YACV,WAAA,EAAa,YAAA;AAAA,YACb,aAAa,QAAA,CAAS,WAAA;AAAA,YACtB,SAAA,EAAWC,mCAAA;AAAA,cACT,QAAA;AAAA,cACA,YAAY,uBAAA,GAA0B;AAAA;AACxC;AAAA;AACF;AAAA,KACF;AAAA,IACC,SAAA,mCACE,GAAA,EAAA,EAAE,SAAA,EAAWC,kCAAgB,QAAA,EAAU,sBAAsB,GAAI,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAE5E,CAAA;AAEJ","file":"DateTimeWidget-OS7ER5F6.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { DateTimePicker } from '../shadcn/datetime-picker';\nimport { Label } from '../shadcn/label';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const DateTimeWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef) return null;\n\n const currentDate = value ? new Date(value) : undefined;\n const showLabel = isLabelVisible(fieldDef);\n\n const handleChange = (date: Date | undefined) => {\n if (!date) {\n setValue(undefined);\n return;\n }\n setValue(date.toISOString());\n };\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {showLabel ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n ) : null}\n <div\n onBlur={() => setTouched()}\n className={disabled ? 'opacity-60 pointer-events-none' : undefined}\n >\n <DateTimePicker\n dateTime={currentDate}\n setDateTime={handleChange}\n placeholder={fieldDef.placeholder}\n className={fieldControlClass(\n fieldDef,\n showError ? 'border-red-500 w-full' : 'w-full',\n )}\n />\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/shadcn/date-picker.tsx","../src/ui/widgets/DateWidget.tsx"],"names":["CalendarIcon","Calendar","jsxs","jsx"],"mappings":";;;;;;;;;;;;;AAmBO,SAAS,WAAW,EAAE,IAAA,EAAM,SAAS,SAAA,EAAW,WAAA,GAAc,eAAc,EAAoB;AACrG,EAAA,4BACG,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,SAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,UACT,+CAAA;AAAA,UACA,CAAC,IAAA,IAAQ,uBAAA;AAAA,UACT;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAACA,QAAA,EAAA,EAAa,WAAU,cAAA,EAAe,CAAA;AAAA,UACtC,OAAO,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA,mBAAI,GAAA,CAAC,UAAM,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA;AAAA,KACnD,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,YAAA,EACxB,QAAA,kBAAA,GAAA;AAAA,MAACC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,YAAA,EAAY;AAAA;AAAA,KACd,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC/BO,IAAM,UAAA,GAA4C,CAAC,EAAE,OAAA,EAAQ,KAAM;AACxE,EAAA,MAAM,EAAE,UAAU,KAAA,EAAO,QAAA,EAAU,YAAY,KAAA,EAAO,OAAA,EAAQ,GAAI,QAAA,CAAS,OAAO,CAAA;AAClF,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,OAAA,EAAQ;AAC1B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,KAAA,KAAU,WAAW,KAAA,CAAM,eAAA,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,eAAe,QAAQ,CAAA;AAEzC,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,iBAAA,CAAkB,QAAA,EAAU,WAAW,CAAA,EACpD,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCA,KAAC,KAAA,EAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAW,eAAA,CAAgB,QAAQ,CAAA,EACzD,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,KAAA;AAAA,MAAO,GAAA;AAAA,sBACjBC,GAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAoB;AAAA,KAAA,EAC9C,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,QAAQ,MAAM,UAAA,IACjB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AAAA,QAChC,OAAA,EAAS,CAAC,IAAA,KAAS,QAAA,CAAS,OAAO,IAAA,CAAK,WAAA,KAAgB,MAAS,CAAA;AAAA,QACjE,aAAa,QAAA,CAAS,WAAA;AAAA,QACtB,SAAA,EAAW,iBAAA;AAAA,UACT,QAAA;AAAA,UACA,YAAY,uBAAA,GAA0B;AAAA;AACxC;AAAA,KACF,EACF,CAAA;AAAA,IACC,SAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAW,eAAA,CAAgB,QAAA,EAAU,sBAAsB,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAE5E,CAAA;AAEJ","file":"DateWidget-KCTE6N5G.mjs","sourcesContent":["import { format } from \"date-fns\"\nimport { Calendar as CalendarIcon } from \"lucide-react\"\n\nimport { cn } from \"../../core/utils\"\nimport { Button } from \"./button\"\nimport { Calendar } from \"./calendar\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"./popover\"\n\nexport interface DatePickerProps {\n date?: Date\n setDate?: (date: Date | undefined) => void\n className?: string\n placeholder?: string\n}\n\nexport function DatePicker({ date, setDate, className, placeholder = \"Pick a date\" }: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant={\"outline\"}\n className={cn(\n \"w-[280px] justify-start text-left font-normal\",\n !date && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {date ? format(date, \"PPP\") : <span>{placeholder}</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\">\n <Calendar\n mode=\"single\"\n selected={date}\n onSelect={setDate}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n )\n}\n\n","import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { DatePicker } from '../shadcn/date-picker';\nimport { Label } from '../shadcn/label';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const DateWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {showLabel ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n ) : null}\n <div onBlur={() => setTouched()}>\n <DatePicker\n date={value ? new Date(value) : undefined}\n setDate={(date) => setValue(date ? date.toISOString() : undefined)}\n placeholder={fieldDef.placeholder}\n className={fieldControlClass(\n fieldDef,\n showError ? 'border-red-500 w-full' : 'w-full',\n )}\n />\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/shadcn/date-picker.tsx","../src/ui/widgets/DateWidget.tsx"],"names":["Popover","jsx","PopoverTrigger","jsxs","Button","cn","CalendarIcon","format","PopoverContent","Calendar","useField","useForm","isLabelVisible","fieldWrapperClass","Label","fieldLabelClass","FieldRequiredIndicator","fieldControlClass","fieldErrorClass"],"mappings":";;;;;;;;;;;;;;;AAmBO,SAAS,WAAW,EAAE,IAAA,EAAM,SAAS,SAAA,EAAW,WAAA,GAAc,eAAc,EAAoB;AACrG,EAAA,uCACGA,yBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,gCAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAAC,eAAA;AAAA,MAACC,wBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,SAAA;AAAA,QACT,SAAA,EAAWC,oBAAA;AAAA,UACT,+CAAA;AAAA,UACA,CAAC,IAAA,IAAQ,uBAAA;AAAA,UACT;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAJ,cAAA,CAACK,oBAAA,EAAA,EAAa,WAAU,cAAA,EAAe,CAAA;AAAA,UACtC,OAAOC,cAAA,CAAO,IAAA,EAAM,KAAK,CAAA,mBAAIN,cAAA,CAAC,UAAM,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA;AAAA,KACnD,EACF,CAAA;AAAA,oBACAA,cAAA,CAACO,gCAAA,EAAA,EAAe,SAAA,EAAU,YAAA,EACxB,QAAA,kBAAAP,cAAA;AAAA,MAACQ,0BAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,YAAA,EAAY;AAAA;AAAA,KACd,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC/BO,IAAM,UAAA,GAA4C,CAAC,EAAE,OAAA,EAAQ,KAAM;AACxE,EAAA,MAAM,EAAE,UAAU,KAAA,EAAO,QAAA,EAAU,YAAY,KAAA,EAAO,OAAA,EAAQ,GAAIC,0BAAA,CAAS,OAAO,CAAA;AAClF,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIC,yBAAA,EAAQ;AAC1B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,KAAA,KAAU,WAAW,KAAA,CAAM,eAAA,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,SAAA,GAAYC,iCAAe,QAAQ,CAAA;AAEzC,EAAA,uBACET,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWU,mCAAA,CAAkB,QAAA,EAAU,WAAW,CAAA,EACpD,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCV,gBAACW,uBAAA,EAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAWC,iCAAA,CAAgB,QAAQ,CAAA,EACzD,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,KAAA;AAAA,MAAO,GAAA;AAAA,sBACjBd,cAAAA,CAACe,wCAAA,EAAA,EAAuB,QAAA,EAAoB;AAAA,KAAA,EAC9C,CAAA,GACE,IAAA;AAAA,oBACJf,cAAAA,CAAC,KAAA,EAAA,EAAI,QAAQ,MAAM,UAAA,IACjB,QAAA,kBAAAA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AAAA,QAChC,OAAA,EAAS,CAAC,IAAA,KAAS,QAAA,CAAS,OAAO,IAAA,CAAK,WAAA,KAAgB,MAAS,CAAA;AAAA,QACjE,aAAa,QAAA,CAAS,WAAA;AAAA,QACtB,SAAA,EAAWgB,mCAAA;AAAA,UACT,QAAA;AAAA,UACA,YAAY,uBAAA,GAA0B;AAAA;AACxC;AAAA,KACF,EACF,CAAA;AAAA,IACC,SAAA,oBACChB,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAWiB,iCAAA,CAAgB,QAAA,EAAU,sBAAsB,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAE5E,CAAA;AAEJ","file":"DateWidget-UNLX544Z.cjs","sourcesContent":["import { format } from \"date-fns\"\nimport { Calendar as CalendarIcon } from \"lucide-react\"\n\nimport { cn } from \"../../core/utils\"\nimport { Button } from \"./button\"\nimport { Calendar } from \"./calendar\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"./popover\"\n\nexport interface DatePickerProps {\n date?: Date\n setDate?: (date: Date | undefined) => void\n className?: string\n placeholder?: string\n}\n\nexport function DatePicker({ date, setDate, className, placeholder = \"Pick a date\" }: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant={\"outline\"}\n className={cn(\n \"w-[280px] justify-start text-left font-normal\",\n !date && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {date ? format(date, \"PPP\") : <span>{placeholder}</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\">\n <Calendar\n mode=\"single\"\n selected={date}\n onSelect={setDate}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n )\n}\n\n","import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { DatePicker } from '../shadcn/date-picker';\nimport { Label } from '../shadcn/label';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nexport const DateWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {showLabel ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n ) : null}\n <div onBlur={() => setTouched()}>\n <DatePicker\n date={value ? new Date(value) : undefined}\n setDate={(date) => setValue(date ? date.toISOString() : undefined)}\n placeholder={fieldDef.placeholder}\n className={fieldControlClass(\n fieldDef,\n showError ? 'border-red-500 w-full' : 'w-full',\n )}\n />\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/widgets/EditableTable.tsx"],"names":["useField","useMemo","def","useRef","useEffect","useState","format","jsxs","jsx","Button","Trash2","Input","useReactTable","getCoreRowModel","Label","Table","TableHeader","TableRow","TableHead","flexRender","TableBody","TableCell","Plus","Fragment","DateTimePicker"],"mappings":"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","file":"EditableTable-VQ72UEFF.cjs","sourcesContent":["import React, { useMemo, useState, useRef, useEffect } from \"react\";\nimport {\n useReactTable,\n getCoreRowModel,\n flexRender,\n type ColumnDef,\n} from \"@tanstack/react-table\";\nimport { format } from \"date-fns\";\nimport { useField } from \"../../react/useField\";\nimport { Button } from \"../shadcn/button\";\nimport { Input } from \"../shadcn/input\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../shadcn/table\";\nimport { Label } from \"../shadcn/label\";\nimport { DateTimePicker } from \"../shadcn/datetime-picker\";\nimport { Trash2, Plus } from \"lucide-react\";\nimport type { EditableTableFieldDef } from \"../../core/types\";\n\n// Define the shape of our table data (matches EditableTableColumnDef + runtime)\ninterface TableColumn {\n id: string;\n label: string;\n allowDelete?: boolean;\n}\n\ninterface TableData {\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\ninterface EditableTableWidgetProps {\n fieldId: string;\n}\n\n/**\n * Editable Table widget. Schema (editable_table field):\n *\n * {\n * id: string,\n * type: \"editable_table\",\n * label: string,\n * allowAddRow?: boolean, // default true\n * allowAddColumn?: boolean, // default true\n * allowDeleteRow?: boolean, // default true\n * allowDeleteColumn?: boolean, // default true\n * addRowLabel?: string, // default \"Add Row\"\n * addColumnLabel?: string, // default \"Add Column\"\n * newColumnNameHint?: string, // placeholder for new column input; default \"New Column Name\"\n * newColumnNameInputType?: \"text\" | \"datetime\", // default \"text\"; \"datetime\" uses a date-time picker for column name\n * minRows?: number, // minimum rows to keep; row delete hidden when rows.length <= minRows; default 0\n * columns?: Array<{\n * id: string,\n * label: string,\n * allowDelete?: boolean // if false, delete button for this column is hidden; default true\n * }>\n * }\n */\nexport const EditableTableWidget: React.FC<EditableTableWidgetProps> = ({\n fieldId,\n}) => {\n const { fieldDef, value, setValue, disabled } = useField(fieldId);\n const def = fieldDef as EditableTableFieldDef;\n const canAddRow = def?.allowAddRow ?? true;\n const canAddColumn = def?.allowAddColumn ?? true;\n const canDeleteRow = def?.allowDeleteRow ?? true;\n const canDeleteColumn = def?.allowDeleteColumn ?? true;\n\n const minRows = def?.minRows ?? 0;\n const addRowLabel = def?.addRowLabel ?? \"Add Row\";\n const addColumnLabel = def?.addColumnLabel ?? \"Add Column\";\n const newColumnNameHint = def?.newColumnNameHint ?? \"New Column Name\";\n const newColumnNameInputType = def?.newColumnNameInputType ?? \"text\";\n\n // Initialize data if null/undefined\n const tableData: TableData = useMemo(() => {\n if (value && typeof value === \"object\" && \"columns\" in value && \"rows\" in value) {\n return value as TableData;\n }\n const def = fieldDef as EditableTableFieldDef;\n const cols = (def?.columns || []).map((c) => ({\n id: c.id,\n label: c.label,\n allowDelete: c.allowDelete !== false,\n }));\n return {\n columns: cols,\n rows: [],\n };\n }, [value, fieldDef]);\n\n // Keep a ref to tableData so we can access the latest version in callbacks\n // without forcing re-creation of columns (which causes focus loss).\n const dataRef = useRef(tableData);\n useEffect(() => {\n dataRef.current = tableData;\n }, [tableData]);\n\n const [newColumnName, setNewColumnName] = useState(\"\");\n const [newColumnDate, setNewColumnDate] = useState<Date | undefined>(undefined);\n\n const updateData = (newData: TableData) => {\n setValue(newData);\n };\n\n const addRow = () => {\n const currentData = dataRef.current;\n const newRow: Record<string, string> = {};\n currentData.columns.forEach((col) => {\n newRow[col.id] = \"\";\n });\n updateData({\n ...currentData,\n rows: [...currentData.rows, newRow],\n });\n };\n\n const addColumnFromText = () => {\n if (!newColumnName.trim()) return;\n const currentData = dataRef.current;\n const colId = newColumnName.toLowerCase().replace(/\\s+/g, \"_\") + \"_\" + Date.now();\n const newCol: TableColumn = { id: colId, label: newColumnName.trim(), allowDelete: true };\n updateData({\n columns: [...currentData.columns, newCol],\n rows: currentData.rows.map((row) => ({ ...row, [colId]: \"\" })),\n });\n setNewColumnName(\"\");\n };\n\n const addColumnFromDate = (date: Date | undefined) => {\n if (!date) return;\n const currentData = dataRef.current;\n const label = format(date, \"PPP HH:mm\");\n const colId = \"col_\" + date.getTime();\n const newCol: TableColumn = { id: colId, label, allowDelete: true };\n updateData({\n columns: [...currentData.columns, newCol],\n rows: currentData.rows.map((row) => ({ ...row, [colId]: \"\" })),\n });\n setNewColumnDate(undefined);\n };\n\n const hasValidNewColumn =\n newColumnNameInputType === \"datetime\"\n ? !!newColumnDate\n : !!newColumnName.trim();\n const addColumn = () => {\n if (newColumnNameInputType === \"datetime\") {\n addColumnFromDate(newColumnDate);\n } else {\n addColumnFromText();\n }\n };\n\n // We use refs inside these callbacks to ensure they are stable and don't depend on changing data\n const removeRow = (index: number) => {\n const currentData = dataRef.current;\n const newRows = [...currentData.rows];\n newRows.splice(index, 1);\n updateData({ ...currentData, rows: newRows });\n };\n\n const removeColumn = (colId: string) => {\n const currentData = dataRef.current;\n const newCols = currentData.columns.filter((c) => c.id !== colId);\n const newRows = currentData.rows.map((row) => {\n const newRow = { ...row };\n delete newRow[colId];\n return newRow;\n });\n updateData({ columns: newCols, rows: newRows });\n };\n\n const updateCell = (rowIndex: number, colId: string, val: string) => {\n const currentData = dataRef.current;\n const newRows = [...currentData.rows];\n newRows[rowIndex] = { ...newRows[rowIndex], [colId]: val };\n updateData({ ...currentData, rows: newRows });\n };\n\n // Generate columns for tanstack table\n // CRITICAL: This useMemo MUST NOT depend on tableData.rows, or focus will be lost on every type.\n // It only depends on tableData.columns (structure) and disabled state.\n const columns = useMemo<ColumnDef<Record<string, string>>[]>(() => {\n const currentCols = tableData.columns; // We only care about columns structure here\n \n const dataCols = currentCols.map((col) => {\n const showColumnDelete =\n !disabled &&\n canDeleteColumn &&\n (col.allowDelete !== false);\n return {\n accessorKey: col.id,\n header: () => (\n <div className=\"flex items-center justify-between space-x-2\">\n <span>{col.label}</span>\n {showColumnDelete && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0 text-muted-foreground hover:text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n removeColumn(col.id);\n }}\n title=\"Remove Column\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n ),\n cell: (info: any) => {\n // We use a local component or direct render, but the key is that 'columns' array doesn't change identity.\n // The cell will re-render because 'info.getValue()' changes, but the Input node stays mounted.\n return (\n <Input\n value={info.getValue() as string || \"\"}\n onChange={(e) => updateCell(info.row.index, col.id, e.target.value)}\n disabled={disabled}\n className=\"h-8 border bg-transparent\"\n />\n );\n },\n };\n });\n\n const showRowDelete = !disabled && canDeleteRow && tableData.rows.length > minRows;\n // Add delete row column\n if (showRowDelete) {\n dataCols.push({\n id: \"actions\",\n header: \"\",\n cell: (info: any) => (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 p-0 text-destructive hover:bg-destructive/10\"\n onClick={(e) => {\n e.stopPropagation();\n removeRow(info.row.index);\n }}\n title=\"Remove Row\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n ),\n } as any);\n }\n\n return dataCols;\n }, [tableData.columns, tableData.rows.length, disabled, canDeleteRow, canDeleteColumn, minRows]); // columns structure + row count for delete visibility\n\n const table = useReactTable({\n data: tableData.rows,\n columns,\n getCoreRowModel: getCoreRowModel(),\n });\n\n if (!fieldDef) return null;\n\n return (\n <div className=\"space-y-4 border rounded-md p-4\">\n <div className=\"flex flex-col space-y-2\">\n <Label>{fieldDef.label}</Label>\n {fieldDef.description && (\n <p className=\"text-sm text-muted-foreground\">{fieldDef.description}</p>\n )}\n </div>\n\n <div className=\"rounded-md border\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id}>\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() && \"selected\"}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className=\"p-1\">\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"h-24 text-center\"\n >\n No data. Add rows or columns to start.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {!disabled && (\n <div className=\"flex flex-col sm:flex-row gap-4 justify-between pt-2\">\n {canAddRow ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={addRow}\n >\n <Plus className=\"mr-2 h-4 w-4\" /> {addRowLabel}\n </Button>\n ) : (\n <div />\n )}\n\n {canAddColumn && (\n <div className=\"flex gap-2 items-center flex-wrap\">\n {newColumnNameInputType === \"datetime\" ? (\n <>\n <DateTimePicker\n dateTime={newColumnDate}\n setDateTime={setNewColumnDate}\n placeholder={newColumnNameHint}\n className=\"w-[280px]\"\n />\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={addColumn}\n disabled={!hasValidNewColumn}\n >\n {addColumnLabel}\n </Button>\n </>\n ) : (\n <>\n <Input\n placeholder={newColumnNameHint}\n value={newColumnName}\n onChange={(e) => setNewColumnName(e.target.value)}\n className=\"w-48\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n addColumn();\n }\n }}\n />\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={addColumn}\n disabled={!hasValidNewColumn}\n >\n {addColumnLabel}\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/widgets/EditableTable.tsx"],"names":["def"],"mappings":"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","file":"EditableTable-XFCPKSUY.mjs","sourcesContent":["import React, { useMemo, useState, useRef, useEffect } from \"react\";\nimport {\n useReactTable,\n getCoreRowModel,\n flexRender,\n type ColumnDef,\n} from \"@tanstack/react-table\";\nimport { format } from \"date-fns\";\nimport { useField } from \"../../react/useField\";\nimport { Button } from \"../shadcn/button\";\nimport { Input } from \"../shadcn/input\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../shadcn/table\";\nimport { Label } from \"../shadcn/label\";\nimport { DateTimePicker } from \"../shadcn/datetime-picker\";\nimport { Trash2, Plus } from \"lucide-react\";\nimport type { EditableTableFieldDef } from \"../../core/types\";\n\n// Define the shape of our table data (matches EditableTableColumnDef + runtime)\ninterface TableColumn {\n id: string;\n label: string;\n allowDelete?: boolean;\n}\n\ninterface TableData {\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\ninterface EditableTableWidgetProps {\n fieldId: string;\n}\n\n/**\n * Editable Table widget. Schema (editable_table field):\n *\n * {\n * id: string,\n * type: \"editable_table\",\n * label: string,\n * allowAddRow?: boolean, // default true\n * allowAddColumn?: boolean, // default true\n * allowDeleteRow?: boolean, // default true\n * allowDeleteColumn?: boolean, // default true\n * addRowLabel?: string, // default \"Add Row\"\n * addColumnLabel?: string, // default \"Add Column\"\n * newColumnNameHint?: string, // placeholder for new column input; default \"New Column Name\"\n * newColumnNameInputType?: \"text\" | \"datetime\", // default \"text\"; \"datetime\" uses a date-time picker for column name\n * minRows?: number, // minimum rows to keep; row delete hidden when rows.length <= minRows; default 0\n * columns?: Array<{\n * id: string,\n * label: string,\n * allowDelete?: boolean // if false, delete button for this column is hidden; default true\n * }>\n * }\n */\nexport const EditableTableWidget: React.FC<EditableTableWidgetProps> = ({\n fieldId,\n}) => {\n const { fieldDef, value, setValue, disabled } = useField(fieldId);\n const def = fieldDef as EditableTableFieldDef;\n const canAddRow = def?.allowAddRow ?? true;\n const canAddColumn = def?.allowAddColumn ?? true;\n const canDeleteRow = def?.allowDeleteRow ?? true;\n const canDeleteColumn = def?.allowDeleteColumn ?? true;\n\n const minRows = def?.minRows ?? 0;\n const addRowLabel = def?.addRowLabel ?? \"Add Row\";\n const addColumnLabel = def?.addColumnLabel ?? \"Add Column\";\n const newColumnNameHint = def?.newColumnNameHint ?? \"New Column Name\";\n const newColumnNameInputType = def?.newColumnNameInputType ?? \"text\";\n\n // Initialize data if null/undefined\n const tableData: TableData = useMemo(() => {\n if (value && typeof value === \"object\" && \"columns\" in value && \"rows\" in value) {\n return value as TableData;\n }\n const def = fieldDef as EditableTableFieldDef;\n const cols = (def?.columns || []).map((c) => ({\n id: c.id,\n label: c.label,\n allowDelete: c.allowDelete !== false,\n }));\n return {\n columns: cols,\n rows: [],\n };\n }, [value, fieldDef]);\n\n // Keep a ref to tableData so we can access the latest version in callbacks\n // without forcing re-creation of columns (which causes focus loss).\n const dataRef = useRef(tableData);\n useEffect(() => {\n dataRef.current = tableData;\n }, [tableData]);\n\n const [newColumnName, setNewColumnName] = useState(\"\");\n const [newColumnDate, setNewColumnDate] = useState<Date | undefined>(undefined);\n\n const updateData = (newData: TableData) => {\n setValue(newData);\n };\n\n const addRow = () => {\n const currentData = dataRef.current;\n const newRow: Record<string, string> = {};\n currentData.columns.forEach((col) => {\n newRow[col.id] = \"\";\n });\n updateData({\n ...currentData,\n rows: [...currentData.rows, newRow],\n });\n };\n\n const addColumnFromText = () => {\n if (!newColumnName.trim()) return;\n const currentData = dataRef.current;\n const colId = newColumnName.toLowerCase().replace(/\\s+/g, \"_\") + \"_\" + Date.now();\n const newCol: TableColumn = { id: colId, label: newColumnName.trim(), allowDelete: true };\n updateData({\n columns: [...currentData.columns, newCol],\n rows: currentData.rows.map((row) => ({ ...row, [colId]: \"\" })),\n });\n setNewColumnName(\"\");\n };\n\n const addColumnFromDate = (date: Date | undefined) => {\n if (!date) return;\n const currentData = dataRef.current;\n const label = format(date, \"PPP HH:mm\");\n const colId = \"col_\" + date.getTime();\n const newCol: TableColumn = { id: colId, label, allowDelete: true };\n updateData({\n columns: [...currentData.columns, newCol],\n rows: currentData.rows.map((row) => ({ ...row, [colId]: \"\" })),\n });\n setNewColumnDate(undefined);\n };\n\n const hasValidNewColumn =\n newColumnNameInputType === \"datetime\"\n ? !!newColumnDate\n : !!newColumnName.trim();\n const addColumn = () => {\n if (newColumnNameInputType === \"datetime\") {\n addColumnFromDate(newColumnDate);\n } else {\n addColumnFromText();\n }\n };\n\n // We use refs inside these callbacks to ensure they are stable and don't depend on changing data\n const removeRow = (index: number) => {\n const currentData = dataRef.current;\n const newRows = [...currentData.rows];\n newRows.splice(index, 1);\n updateData({ ...currentData, rows: newRows });\n };\n\n const removeColumn = (colId: string) => {\n const currentData = dataRef.current;\n const newCols = currentData.columns.filter((c) => c.id !== colId);\n const newRows = currentData.rows.map((row) => {\n const newRow = { ...row };\n delete newRow[colId];\n return newRow;\n });\n updateData({ columns: newCols, rows: newRows });\n };\n\n const updateCell = (rowIndex: number, colId: string, val: string) => {\n const currentData = dataRef.current;\n const newRows = [...currentData.rows];\n newRows[rowIndex] = { ...newRows[rowIndex], [colId]: val };\n updateData({ ...currentData, rows: newRows });\n };\n\n // Generate columns for tanstack table\n // CRITICAL: This useMemo MUST NOT depend on tableData.rows, or focus will be lost on every type.\n // It only depends on tableData.columns (structure) and disabled state.\n const columns = useMemo<ColumnDef<Record<string, string>>[]>(() => {\n const currentCols = tableData.columns; // We only care about columns structure here\n \n const dataCols = currentCols.map((col) => {\n const showColumnDelete =\n !disabled &&\n canDeleteColumn &&\n (col.allowDelete !== false);\n return {\n accessorKey: col.id,\n header: () => (\n <div className=\"flex items-center justify-between space-x-2\">\n <span>{col.label}</span>\n {showColumnDelete && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0 text-muted-foreground hover:text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n removeColumn(col.id);\n }}\n title=\"Remove Column\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n ),\n cell: (info: any) => {\n // We use a local component or direct render, but the key is that 'columns' array doesn't change identity.\n // The cell will re-render because 'info.getValue()' changes, but the Input node stays mounted.\n return (\n <Input\n value={info.getValue() as string || \"\"}\n onChange={(e) => updateCell(info.row.index, col.id, e.target.value)}\n disabled={disabled}\n className=\"h-8 border bg-transparent\"\n />\n );\n },\n };\n });\n\n const showRowDelete = !disabled && canDeleteRow && tableData.rows.length > minRows;\n // Add delete row column\n if (showRowDelete) {\n dataCols.push({\n id: \"actions\",\n header: \"\",\n cell: (info: any) => (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 p-0 text-destructive hover:bg-destructive/10\"\n onClick={(e) => {\n e.stopPropagation();\n removeRow(info.row.index);\n }}\n title=\"Remove Row\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n ),\n } as any);\n }\n\n return dataCols;\n }, [tableData.columns, tableData.rows.length, disabled, canDeleteRow, canDeleteColumn, minRows]); // columns structure + row count for delete visibility\n\n const table = useReactTable({\n data: tableData.rows,\n columns,\n getCoreRowModel: getCoreRowModel(),\n });\n\n if (!fieldDef) return null;\n\n return (\n <div className=\"space-y-4 border rounded-md p-4\">\n <div className=\"flex flex-col space-y-2\">\n <Label>{fieldDef.label}</Label>\n {fieldDef.description && (\n <p className=\"text-sm text-muted-foreground\">{fieldDef.description}</p>\n )}\n </div>\n\n <div className=\"rounded-md border\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id}>\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() && \"selected\"}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className=\"p-1\">\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"h-24 text-center\"\n >\n No data. Add rows or columns to start.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {!disabled && (\n <div className=\"flex flex-col sm:flex-row gap-4 justify-between pt-2\">\n {canAddRow ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={addRow}\n >\n <Plus className=\"mr-2 h-4 w-4\" /> {addRowLabel}\n </Button>\n ) : (\n <div />\n )}\n\n {canAddColumn && (\n <div className=\"flex gap-2 items-center flex-wrap\">\n {newColumnNameInputType === \"datetime\" ? (\n <>\n <DateTimePicker\n dateTime={newColumnDate}\n setDateTime={setNewColumnDate}\n placeholder={newColumnNameHint}\n className=\"w-[280px]\"\n />\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={addColumn}\n disabled={!hasValidNewColumn}\n >\n {addColumnLabel}\n </Button>\n </>\n ) : (\n <>\n <Input\n placeholder={newColumnNameHint}\n value={newColumnName}\n onChange={(e) => setNewColumnName(e.target.value)}\n className=\"w-48\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n addColumn();\n }\n }}\n />\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={addColumn}\n disabled={!hasValidNewColumn}\n >\n {addColumnLabel}\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/widgets/FollowupWidget.tsx"],"names":["days","CalendarIcon","Calendar"],"mappings":"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","file":"FollowupWidget-BFZ6P2JE.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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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-MAYTHM2E.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"]}
|