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,171 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkUGGUIXUS_cjs = require('./chunk-UGGUIXUS.cjs');
|
|
4
|
+
var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
|
|
5
|
+
var chunkKPGTPJDH_cjs = require('./chunk-KPGTPJDH.cjs');
|
|
6
|
+
var chunk4KSZUIJE_cjs = require('./chunk-4KSZUIJE.cjs');
|
|
7
|
+
var chunkIDSBJOFY_cjs = require('./chunk-IDSBJOFY.cjs');
|
|
8
|
+
var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
|
|
9
|
+
require('./chunk-FHHISVCH.cjs');
|
|
10
|
+
var react = require('react');
|
|
11
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
12
|
+
|
|
13
|
+
function normalizeOptions(response) {
|
|
14
|
+
if (Array.isArray(response)) {
|
|
15
|
+
return response.map((o) => ({ label: String(o.label), value: String(o.value) }));
|
|
16
|
+
}
|
|
17
|
+
if (response?.specializations?.length) {
|
|
18
|
+
return response.specializations.map((s) => ({ label: s, value: s }));
|
|
19
|
+
}
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
function normalizeValue(value) {
|
|
23
|
+
if (!value || !Array.isArray(value)) return [];
|
|
24
|
+
return value.map((item) => {
|
|
25
|
+
if (item && typeof item === "object" && "specialization" in item) {
|
|
26
|
+
const s = item.specialization;
|
|
27
|
+
const u = item.is_urgent;
|
|
28
|
+
return { specialization: String(s), is_urgent: Boolean(u) };
|
|
29
|
+
}
|
|
30
|
+
return { specialization: String(item), is_urgent: false };
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
var ReferralWidget = ({ fieldId }) => {
|
|
34
|
+
const { fieldDef, value, setValue, setTouched, error, disabled, touched } = chunkIDSBJOFY_cjs.useField(fieldId);
|
|
35
|
+
const handlers = chunkIDSBJOFY_cjs.useFieldHandlers(fieldId);
|
|
36
|
+
const [options, setOptions] = react.useState([]);
|
|
37
|
+
const [loading, setLoading] = react.useState(false);
|
|
38
|
+
const { state } = chunkKPGTPJDH_cjs.useForm();
|
|
39
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
40
|
+
const selectedItems = normalizeValue(value);
|
|
41
|
+
const availableOptions = options.filter(
|
|
42
|
+
(opt) => !selectedItems.some((item) => item.specialization === opt.value)
|
|
43
|
+
);
|
|
44
|
+
const loadOptions = react.useCallback(async () => {
|
|
45
|
+
if (handlers.onFetchOptions) {
|
|
46
|
+
setLoading(true);
|
|
47
|
+
try {
|
|
48
|
+
const res = await handlers.onFetchOptions();
|
|
49
|
+
setOptions(normalizeOptions(res));
|
|
50
|
+
} finally {
|
|
51
|
+
setLoading(false);
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const def = fieldDef;
|
|
56
|
+
if (def?.options?.length) {
|
|
57
|
+
setOptions(def.options.map((o) => ({ label: String(o.label), value: String(o.value) })));
|
|
58
|
+
} else if (def?.dataSource) {
|
|
59
|
+
setLoading(true);
|
|
60
|
+
chunkUGGUIXUS_cjs.fetchOptions(def.dataSource.source, def.dataSource.params).then((opts) => setOptions(opts.map((o) => ({ label: String(o.label), value: String(o.value) })))).finally(() => setLoading(false));
|
|
61
|
+
} else {
|
|
62
|
+
setOptions([]);
|
|
63
|
+
}
|
|
64
|
+
}, [fieldDef, handlers]);
|
|
65
|
+
react.useEffect(() => {
|
|
66
|
+
if (!fieldDef) return;
|
|
67
|
+
loadOptions();
|
|
68
|
+
}, [fieldDef, loadOptions]);
|
|
69
|
+
const handleAdd = react.useCallback(
|
|
70
|
+
(specialization) => {
|
|
71
|
+
const next = [...selectedItems, { specialization, is_urgent: false }];
|
|
72
|
+
setValue(next);
|
|
73
|
+
setTouched();
|
|
74
|
+
},
|
|
75
|
+
[selectedItems, setValue, setTouched]
|
|
76
|
+
);
|
|
77
|
+
const handleRemove = react.useCallback(
|
|
78
|
+
(specialization) => {
|
|
79
|
+
const next = selectedItems.filter((item) => item.specialization !== specialization);
|
|
80
|
+
setValue(next);
|
|
81
|
+
setTouched();
|
|
82
|
+
},
|
|
83
|
+
[selectedItems, setValue, setTouched]
|
|
84
|
+
);
|
|
85
|
+
const handleToggleUrgent = react.useCallback(
|
|
86
|
+
(specialization) => {
|
|
87
|
+
const next = selectedItems.map(
|
|
88
|
+
(item) => item.specialization === specialization ? { ...item, is_urgent: !item.is_urgent } : item
|
|
89
|
+
);
|
|
90
|
+
setValue(next);
|
|
91
|
+
setTouched();
|
|
92
|
+
},
|
|
93
|
+
[selectedItems, setValue, setTouched]
|
|
94
|
+
);
|
|
95
|
+
if (!fieldDef) return null;
|
|
96
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5E3APMY6_cjs.fieldWrapperClass(fieldDef, "space-y-2"), children: [
|
|
97
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkJMGUUFOJ_cjs.Label, { htmlFor: fieldId, className: chunk5E3APMY6_cjs.fieldLabelClass(fieldDef), children: [
|
|
98
|
+
"Referral to ",
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk5E3APMY6_cjs.FieldRequiredIndicator, { fieldDef })
|
|
100
|
+
] }),
|
|
101
|
+
loading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "Loading..." }),
|
|
102
|
+
!loading && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
103
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
104
|
+
chunk4KSZUIJE_cjs.Select,
|
|
105
|
+
{
|
|
106
|
+
disabled,
|
|
107
|
+
value: "",
|
|
108
|
+
onValueChange: (val) => {
|
|
109
|
+
if (val) {
|
|
110
|
+
handleAdd(val);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
children: [
|
|
114
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
115
|
+
chunk4KSZUIJE_cjs.SelectTrigger,
|
|
116
|
+
{
|
|
117
|
+
id: fieldId,
|
|
118
|
+
className: chunk5E3APMY6_cjs.fieldControlClass(fieldDef, showError ? "border-red-500" : ""),
|
|
119
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectValue, { placeholder: "Select specializations..." })
|
|
120
|
+
}
|
|
121
|
+
),
|
|
122
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunk4KSZUIJE_cjs.SelectContent, { children: [
|
|
123
|
+
availableOptions.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectItem, { value: opt.value, children: opt.label }, opt.value)),
|
|
124
|
+
availableOptions.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-2 px-2 text-sm text-muted-foreground", children: "All specializations selected" })
|
|
125
|
+
] })
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
`referral-${selectedItems.map((i) => i.specialization).join(",")}`
|
|
129
|
+
),
|
|
130
|
+
selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1.5 flex h-12 flex-wrap content-start gap-1.5 overflow-y-auto pr-1", children: selectedItems.map((item) => {
|
|
131
|
+
const isUrgent = item.is_urgent;
|
|
132
|
+
const chipClass = isUrgent ? "inline-flex items-center gap-0.5 px-2 py-0.5 bg-red-100 text-red-800 border border-red-300 rounded-full text-xs max-w-full cursor-pointer hover:bg-red-200 transition-colors" : "inline-flex items-center gap-0.5 px-2 py-0.5 bg-blue-100 text-blue-800 rounded-full text-xs max-w-full cursor-pointer hover:bg-blue-200 transition-colors";
|
|
133
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
134
|
+
"div",
|
|
135
|
+
{
|
|
136
|
+
className: chipClass,
|
|
137
|
+
onClick: (e) => {
|
|
138
|
+
if (e.target instanceof HTMLElement && e.target.closest("button")) return;
|
|
139
|
+
handleToggleUrgent(item.specialization);
|
|
140
|
+
},
|
|
141
|
+
children: [
|
|
142
|
+
isUrgent && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 bg-red-600 text-white text-[10px] font-bold px-1 py-0.5 rounded mr-1", children: "U" }),
|
|
143
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate max-w-[120px]", children: item.specialization }),
|
|
144
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
145
|
+
"button",
|
|
146
|
+
{
|
|
147
|
+
type: "button",
|
|
148
|
+
onClick: (e) => {
|
|
149
|
+
e.stopPropagation();
|
|
150
|
+
handleRemove(item.specialization);
|
|
151
|
+
},
|
|
152
|
+
className: "ml-0.5 text-blue-600 hover:text-blue-800 focus:outline-none flex-shrink-0 text-sm leading-none",
|
|
153
|
+
"aria-label": `Remove ${item.specialization}`,
|
|
154
|
+
children: "\xD7"
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
item.specialization
|
|
160
|
+
);
|
|
161
|
+
}) }),
|
|
162
|
+
selectedItems.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-1", children: "No specializations selected" }),
|
|
163
|
+
selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-1.5", children: "Click a chip to mark as urgent" })
|
|
164
|
+
] }),
|
|
165
|
+
showError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldErrorClass(fieldDef, "text-xs text-red-500"), children: error })
|
|
166
|
+
] });
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
exports.ReferralWidget = ReferralWidget;
|
|
170
|
+
//# sourceMappingURL=ReferralWidget-PDNEKHFO.cjs.map
|
|
171
|
+
//# sourceMappingURL=ReferralWidget-PDNEKHFO.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/ReferralWidget.tsx"],"names":["useField","useFieldHandlers","useState","useForm","useCallback","fetchOptions","useEffect","fieldWrapperClass","jsxs","Label","fieldLabelClass","jsx","FieldRequiredIndicator","Fragment","Select","SelectTrigger","fieldControlClass","SelectValue","SelectContent","SelectItem","fieldErrorClass"],"mappings":"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","file":"ReferralWidget-PDNEKHFO.cjs","sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { fetchOptions } from '../../core/asyncOptions';\nimport type { ReferralFieldDef, ReferralItem } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n} from '../../react/fieldStyle';\n\nfunction normalizeOptions(\n response: { specializations?: string[] } | { label: string; value: any }[]\n): { label: string; value: string }[] {\n if (Array.isArray(response)) {\n return response.map((o) => ({ label: String(o.label), value: String(o.value) }));\n }\n if (response?.specializations?.length) {\n return response.specializations.map((s) => ({ label: s, value: s }));\n }\n return [];\n}\n\nfunction normalizeValue(value: unknown): ReferralItem[] {\n if (!value || !Array.isArray(value)) return [];\n return value.map((item) => {\n if (item && typeof item === 'object' && 'specialization' in item) {\n const s = (item as ReferralItem).specialization;\n const u = (item as ReferralItem).is_urgent;\n return { specialization: String(s), is_urgent: Boolean(u) };\n }\n return { specialization: String(item), is_urgent: false };\n });\n}\n\nexport const ReferralWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const [options, setOptions] = useState<{ label: string; value: string }[]>([]);\n const [loading, setLoading] = useState(false);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n const selectedItems = normalizeValue(value);\n const availableOptions = options.filter(\n (opt) => !selectedItems.some((item) => item.specialization === opt.value)\n );\n\n const loadOptions = useCallback(async () => {\n if (handlers.onFetchOptions) {\n setLoading(true);\n try {\n const res = await handlers.onFetchOptions();\n setOptions(normalizeOptions(res));\n } finally {\n setLoading(false);\n }\n return;\n }\n const def = fieldDef as ReferralFieldDef | undefined;\n if (def?.options?.length) {\n setOptions(def.options.map((o) => ({ label: String(o.label), value: String(o.value) })));\n } else if (def?.dataSource) {\n setLoading(true);\n fetchOptions(def.dataSource.source, def.dataSource.params)\n .then((opts) => setOptions(opts.map((o) => ({ label: String(o.label), value: String(o.value) }))))\n .finally(() => setLoading(false));\n } else {\n setOptions([]);\n }\n }, [fieldDef, handlers]);\n\n useEffect(() => {\n if (!fieldDef) return;\n loadOptions();\n }, [fieldDef, loadOptions]);\n\n const handleAdd = useCallback(\n (specialization: string) => {\n const next = [...selectedItems, { specialization, is_urgent: false }];\n setValue(next);\n setTouched();\n },\n [selectedItems, setValue, setTouched]\n );\n\n const handleRemove = useCallback(\n (specialization: string) => {\n const next = selectedItems.filter((item) => item.specialization !== specialization);\n setValue(next);\n setTouched();\n },\n [selectedItems, setValue, setTouched]\n );\n\n const handleToggleUrgent = useCallback(\n (specialization: string) => {\n const next = selectedItems.map((item) =>\n item.specialization === specialization\n ? { ...item, is_urgent: !item.is_urgent }\n : item\n );\n setValue(next);\n setTouched();\n },\n [selectedItems, setValue, setTouched]\n );\n\n if (!fieldDef) return null;\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n Referral to <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n\n {loading && <p className=\"text-xs text-muted-foreground\">Loading...</p>}\n\n {!loading && (\n <>\n <Select\n key={`referral-${selectedItems.map((i) => i.specialization).join(',')}`}\n disabled={disabled}\n value=\"\"\n onValueChange={(val) => {\n if (val) {\n handleAdd(val);\n }\n }}\n >\n <SelectTrigger\n id={fieldId}\n className={fieldControlClass(fieldDef, showError ? 'border-red-500' : '')}\n >\n <SelectValue placeholder=\"Select specializations...\" />\n </SelectTrigger>\n <SelectContent>\n {availableOptions.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n {availableOptions.length === 0 && (\n <div className=\"py-2 px-2 text-sm text-muted-foreground\">\n All specializations selected\n </div>\n )}\n </SelectContent>\n </Select>\n\n {selectedItems.length > 0 && (\n <div className=\"mt-1.5 flex h-12 flex-wrap content-start gap-1.5 overflow-y-auto pr-1\">\n {selectedItems.map((item) => {\n const isUrgent = item.is_urgent;\n const chipClass = isUrgent\n ? 'inline-flex items-center gap-0.5 px-2 py-0.5 bg-red-100 text-red-800 border border-red-300 rounded-full text-xs max-w-full cursor-pointer hover:bg-red-200 transition-colors'\n : 'inline-flex items-center gap-0.5 px-2 py-0.5 bg-blue-100 text-blue-800 rounded-full text-xs max-w-full cursor-pointer hover:bg-blue-200 transition-colors';\n return (\n <div\n key={item.specialization}\n className={chipClass}\n onClick={(e) => {\n if (e.target instanceof HTMLElement && e.target.closest('button')) return;\n handleToggleUrgent(item.specialization);\n }}\n >\n {isUrgent && (\n <span className=\"flex-shrink-0 bg-red-600 text-white text-[10px] font-bold px-1 py-0.5 rounded mr-1\">\n U\n </span>\n )}\n <span className=\"truncate max-w-[120px]\">{item.specialization}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(item.specialization);\n }}\n className=\"ml-0.5 text-blue-600 hover:text-blue-800 focus:outline-none flex-shrink-0 text-sm leading-none\"\n aria-label={`Remove ${item.specialization}`}\n >\n ×\n </button>\n </div>\n );\n })}\n </div>\n )}\n\n {selectedItems.length === 0 && (\n <p className=\"text-xs text-muted-foreground mt-1\">No specializations selected</p>\n )}\n\n {selectedItems.length > 0 && (\n <p className=\"text-xs text-muted-foreground mt-1.5\">\n Click a chip to mark as urgent\n </p>\n )}\n </>\n )}\n\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { RichTextWidget } from './chunk-MIUUO4CI.mjs';
|
|
2
|
+
export { richTextHtmlClassName } from './chunk-I4AV6BQF.mjs';
|
|
3
|
+
import './chunk-ZSOIQVB3.mjs';
|
|
4
|
+
import './chunk-WYVXXEZI.mjs';
|
|
5
|
+
import './chunk-XR2ZM654.mjs';
|
|
6
|
+
import './chunk-GXXWMHAA.mjs';
|
|
7
|
+
import './chunk-ZGPHTPAN.mjs';
|
|
8
|
+
import './chunk-HEFZA2AH.mjs';
|
|
9
|
+
import './chunk-VPU66PI6.mjs';
|
|
10
|
+
//# sourceMappingURL=RichTextWidget-5OOJ2LJN.mjs.map
|
|
11
|
+
//# sourceMappingURL=RichTextWidget-5OOJ2LJN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"RichTextWidget-5OOJ2LJN.mjs"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkCTW65YW2_cjs = require('./chunk-CTW65YW2.cjs');
|
|
4
|
+
var chunkIFSKLIS2_cjs = require('./chunk-IFSKLIS2.cjs');
|
|
5
|
+
require('./chunk-FZEEWRW3.cjs');
|
|
6
|
+
require('./chunk-5E3APMY6.cjs');
|
|
7
|
+
require('./chunk-KPGTPJDH.cjs');
|
|
8
|
+
require('./chunk-O3VQBPEW.cjs');
|
|
9
|
+
require('./chunk-IDSBJOFY.cjs');
|
|
10
|
+
require('./chunk-JMGUUFOJ.cjs');
|
|
11
|
+
require('./chunk-FHHISVCH.cjs');
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
Object.defineProperty(exports, "RichTextWidget", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return chunkCTW65YW2_cjs.RichTextWidget; }
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "richTextHtmlClassName", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return chunkIFSKLIS2_cjs.richTextHtmlClassName; }
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=RichTextWidget-XWLOHKLE.cjs.map
|
|
24
|
+
//# sourceMappingURL=RichTextWidget-XWLOHKLE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"RichTextWidget-XWLOHKLE.cjs"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkJNVSA77L_cjs = require('./chunk-JNVSA77L.cjs');
|
|
4
|
+
require('./chunk-PHADAQSH.cjs');
|
|
5
|
+
require('./chunk-P62377LB.cjs');
|
|
6
|
+
require('./chunk-5E3APMY6.cjs');
|
|
7
|
+
require('./chunk-KPGTPJDH.cjs');
|
|
8
|
+
require('./chunk-IDSBJOFY.cjs');
|
|
9
|
+
require('./chunk-JMGUUFOJ.cjs');
|
|
10
|
+
require('./chunk-FHHISVCH.cjs');
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
Object.defineProperty(exports, "SmartTextareaWidget", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return chunkJNVSA77L_cjs.SmartTextareaWidget; }
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=SmartTextarea-L7Q4CORK.cjs.map
|
|
19
|
+
//# sourceMappingURL=SmartTextarea-L7Q4CORK.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"SmartTextarea-L7Q4CORK.cjs"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { SmartTextareaWidget } from './chunk-GFDE2KZC.mjs';
|
|
2
|
+
import './chunk-4BAKQIPJ.mjs';
|
|
3
|
+
import './chunk-Y7TIWH4I.mjs';
|
|
4
|
+
import './chunk-WYVXXEZI.mjs';
|
|
5
|
+
import './chunk-XR2ZM654.mjs';
|
|
6
|
+
import './chunk-ZGPHTPAN.mjs';
|
|
7
|
+
import './chunk-HEFZA2AH.mjs';
|
|
8
|
+
import './chunk-VPU66PI6.mjs';
|
|
9
|
+
//# sourceMappingURL=SmartTextarea-ZCXGMZLG.mjs.map
|
|
10
|
+
//# sourceMappingURL=SmartTextarea-ZCXGMZLG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"SmartTextarea-ZCXGMZLG.mjs"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkDE7VZVKR_cjs = require('./chunk-DE7VZVKR.cjs');
|
|
4
|
+
var chunkUGGUIXUS_cjs = require('./chunk-UGGUIXUS.cjs');
|
|
5
|
+
var chunkPHADAQSH_cjs = require('./chunk-PHADAQSH.cjs');
|
|
6
|
+
var chunkP62377LB_cjs = require('./chunk-P62377LB.cjs');
|
|
7
|
+
var chunkFZEEWRW3_cjs = require('./chunk-FZEEWRW3.cjs');
|
|
8
|
+
var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
|
|
9
|
+
var chunkKPGTPJDH_cjs = require('./chunk-KPGTPJDH.cjs');
|
|
10
|
+
require('./chunk-TJHG5WHX.cjs');
|
|
11
|
+
require('./chunk-4KSZUIJE.cjs');
|
|
12
|
+
var chunkIDSBJOFY_cjs = require('./chunk-IDSBJOFY.cjs');
|
|
13
|
+
var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
|
|
14
|
+
var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
|
|
15
|
+
var react = require('react');
|
|
16
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
17
|
+
|
|
18
|
+
var DEFAULT_TOKEN_SEPARATOR = ", ";
|
|
19
|
+
function getAppendSeparator(def) {
|
|
20
|
+
const raw = def.meta && typeof def.meta.appendSeparator === "string" ? def.meta.appendSeparator : DEFAULT_TOKEN_SEPARATOR;
|
|
21
|
+
return raw;
|
|
22
|
+
}
|
|
23
|
+
function isTokenSelected(text, optionValue) {
|
|
24
|
+
const t = String(optionValue).trim();
|
|
25
|
+
if (!t) return false;
|
|
26
|
+
return chunkIDSBJOFY_cjs.getSuggestionTokensFromText(text).some((p) => p === t);
|
|
27
|
+
}
|
|
28
|
+
function deriveKnownSuggestionChipValues(text, options) {
|
|
29
|
+
if (!options.length) return [];
|
|
30
|
+
const allowed = new Map(options.map((o) => [String(o.value), o.value]));
|
|
31
|
+
const tokens = chunkIDSBJOFY_cjs.getSuggestionTokensFromText(text);
|
|
32
|
+
const out = [];
|
|
33
|
+
const seen = /* @__PURE__ */ new Set();
|
|
34
|
+
for (const t of tokens) {
|
|
35
|
+
if (!allowed.has(t) || seen.has(t)) continue;
|
|
36
|
+
seen.add(t);
|
|
37
|
+
out.push(allowed.get(t));
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
function parallelChipArraysEqual(a, b) {
|
|
42
|
+
if (!Array.isArray(a) || !Array.isArray(b)) return false;
|
|
43
|
+
if (a.length !== b.length) return false;
|
|
44
|
+
for (let i = 0; i < a.length; i++) {
|
|
45
|
+
if (a[i] !== b[i]) return false;
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
function isSuggestionField(type) {
|
|
50
|
+
return type === "suggestion_textarea" || type === "complaint_chips";
|
|
51
|
+
}
|
|
52
|
+
function EmbeddedSchemaField({ fieldId }) {
|
|
53
|
+
const store = chunkIDSBJOFY_cjs.useFormStore();
|
|
54
|
+
const fieldDef = store.getFieldDef(fieldId);
|
|
55
|
+
if (!fieldDef) return null;
|
|
56
|
+
switch (fieldDef.type) {
|
|
57
|
+
case "text":
|
|
58
|
+
case "number":
|
|
59
|
+
case "textarea":
|
|
60
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkDE7VZVKR_cjs.TextWidget, { fieldId });
|
|
61
|
+
case "select":
|
|
62
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkDE7VZVKR_cjs.SelectWidget, { fieldId });
|
|
63
|
+
default:
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
var SuggestionTextareaWidget = ({ fieldId }) => {
|
|
68
|
+
const { fieldDef, value, setValue, setTouched, error, disabled, touched } = chunkIDSBJOFY_cjs.useField(fieldId);
|
|
69
|
+
const { state } = chunkKPGTPJDH_cjs.useForm();
|
|
70
|
+
const store = chunkIDSBJOFY_cjs.useFormStore();
|
|
71
|
+
const hasVoice = !!(fieldDef?.voice && store.getVoice());
|
|
72
|
+
const [options, setOptions] = react.useState([]);
|
|
73
|
+
const [loading, setLoading] = react.useState(false);
|
|
74
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
75
|
+
const def = fieldDef && isSuggestionField(fieldDef.type) ? fieldDef : void 0;
|
|
76
|
+
const textValue = value == null || typeof value === "string" ? value || "" : String(value);
|
|
77
|
+
const parallelChipFieldId = def?.meta && typeof def.meta.parallelChipFieldId === "string" ? def.meta.parallelChipFieldId.trim() : void 0;
|
|
78
|
+
const embeddedFieldIds = react.useMemo(() => {
|
|
79
|
+
const raw = def?.meta && Array.isArray(def.meta.embeddedFieldIds) ? def.meta.embeddedFieldIds : [];
|
|
80
|
+
return raw.filter((id) => typeof id === "string" && id.trim().length > 0).map((id) => id.trim()).filter((id) => store.getFieldDef(id));
|
|
81
|
+
}, [def?.meta, store]);
|
|
82
|
+
react.useEffect(() => {
|
|
83
|
+
if (!def) {
|
|
84
|
+
setOptions([]);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (def.options?.length) {
|
|
88
|
+
setOptions(def.options);
|
|
89
|
+
} else if (def.dataSource) {
|
|
90
|
+
setLoading(true);
|
|
91
|
+
chunkUGGUIXUS_cjs.fetchOptions(def.dataSource.source, def.dataSource.params).then((opts) => setOptions(opts)).finally(() => setLoading(false));
|
|
92
|
+
} else {
|
|
93
|
+
setOptions([]);
|
|
94
|
+
}
|
|
95
|
+
}, [def]);
|
|
96
|
+
const chipAllowedSet = react.useMemo(
|
|
97
|
+
() => new Set(options.map((o) => String(o.value).trim()).filter(Boolean)),
|
|
98
|
+
[options]
|
|
99
|
+
);
|
|
100
|
+
react.useEffect(() => {
|
|
101
|
+
if (!parallelChipFieldId) return;
|
|
102
|
+
const parallelDef = store.getFieldDef(parallelChipFieldId);
|
|
103
|
+
if (!parallelDef || parallelDef.type !== "multiselect") return;
|
|
104
|
+
const next = deriveKnownSuggestionChipValues(textValue, options);
|
|
105
|
+
const prev = store.getFieldState(parallelChipFieldId).value;
|
|
106
|
+
if (parallelChipArraysEqual(prev, next)) return;
|
|
107
|
+
store.setValues({ [parallelChipFieldId]: next }, { touch: false });
|
|
108
|
+
}, [def, parallelChipFieldId, textValue, options, store]);
|
|
109
|
+
if (!def) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const appendSeparator = getAppendSeparator(def);
|
|
113
|
+
const suggestionsAria = def.meta && typeof def.meta.suggestionsAriaLabel === "string" ? def.meta.suggestionsAriaLabel : "Quick suggestions";
|
|
114
|
+
const theme = chunkP62377LB_cjs.getThemeConfig("textarea", def.theme);
|
|
115
|
+
const wrapperClass = theme?.wrapperClassName ?? "space-y-2";
|
|
116
|
+
const labelClass = theme?.labelClassName;
|
|
117
|
+
const inputClass = chunkFHHISVCH_cjs.cn(theme?.inputClassName, showError && "border-red-500");
|
|
118
|
+
const inputWithStyle = chunk5E3APMY6_cjs.fieldControlClass(def, inputClass);
|
|
119
|
+
const height = def.height != null ? typeof def.height === "string" ? Number(def.height) || void 0 : def.height : void 0;
|
|
120
|
+
const labelContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
121
|
+
def.label,
|
|
122
|
+
" ",
|
|
123
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk5E3APMY6_cjs.FieldRequiredIndicator, { fieldDef: def })
|
|
124
|
+
] });
|
|
125
|
+
const showLabel = chunk5E3APMY6_cjs.isLabelVisible(def);
|
|
126
|
+
const labelEl = showLabel ? theme ? /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { className: chunk5E3APMY6_cjs.fieldLabelClass(def, labelClass), children: labelContent }) : /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { className: chunk5E3APMY6_cjs.fieldLabelClass(def), children: labelContent }) : null;
|
|
127
|
+
const onChipClick = (optValue) => {
|
|
128
|
+
if (disabled) return;
|
|
129
|
+
setValue(chunkIDSBJOFY_cjs.toggleSuggestionTokenInText(textValue, String(optValue), appendSeparator, chipAllowedSet));
|
|
130
|
+
};
|
|
131
|
+
const hasSuggestions = options.length > 0;
|
|
132
|
+
const hasEmbedded = embeddedFieldIds.length > 0;
|
|
133
|
+
const hasShell = hasSuggestions || hasEmbedded;
|
|
134
|
+
const isHighlightLabel = def.theme === "highlight-label";
|
|
135
|
+
const suggestionShellClass = chunkFHHISVCH_cjs.cn(
|
|
136
|
+
"flex min-w-0 flex-col overflow-hidden",
|
|
137
|
+
hasShell && (isHighlightLabel ? "-mt-1 rounded-b-md border-[#D0D0D0] bg-white" : "rounded-md border border-input bg-background")
|
|
138
|
+
);
|
|
139
|
+
const chipsRowClass = chunkFHHISVCH_cjs.cn(
|
|
140
|
+
"flex flex-wrap gap-2 px-3 pb-2 pt-3",
|
|
141
|
+
hasSuggestions && (isHighlightLabel ? "" : "border-b border-input/70"),
|
|
142
|
+
disabled && "pointer-events-none opacity-50"
|
|
143
|
+
);
|
|
144
|
+
const embeddedRowClass = chunkFHHISVCH_cjs.cn(
|
|
145
|
+
"grid gap-3 px-3 sm:grid-cols-3",
|
|
146
|
+
hasEmbedded && (hasSuggestions ? chunkFHHISVCH_cjs.cn("py-2", isHighlightLabel && "border-t border-input/70") : "border-b border-input/70 py-3"),
|
|
147
|
+
disabled && "pointer-events-none opacity-50"
|
|
148
|
+
);
|
|
149
|
+
const textareaShellClass = chunkFHHISVCH_cjs.cn(
|
|
150
|
+
inputWithStyle,
|
|
151
|
+
hasShell && chunkFHHISVCH_cjs.cn(
|
|
152
|
+
"mt-0 rounded-t-none rounded-b-md border-0 shadow-none focus-visible:ring-offset-0",
|
|
153
|
+
isHighlightLabel ? "border-t-0" : "min-h-[80px]"
|
|
154
|
+
)
|
|
155
|
+
);
|
|
156
|
+
const suggestionButtons = loading ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Loading suggestions\u2026" }) : options.map((opt) => {
|
|
157
|
+
const on = isTokenSelected(textValue, opt.value);
|
|
158
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
159
|
+
"button",
|
|
160
|
+
{
|
|
161
|
+
type: "button",
|
|
162
|
+
onClick: () => onChipClick(opt.value),
|
|
163
|
+
className: chunkFHHISVCH_cjs.cn(
|
|
164
|
+
"inline-flex min-h-8 items-center rounded-full border px-3 py-1 text-xs font-medium leading-none transition-colors",
|
|
165
|
+
on ? "border-primary bg-primary/10 text-primary" : "border-muted-foreground/30 bg-background hover:bg-muted/60"
|
|
166
|
+
),
|
|
167
|
+
children: opt.label
|
|
168
|
+
},
|
|
169
|
+
String(opt.value)
|
|
170
|
+
);
|
|
171
|
+
});
|
|
172
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5E3APMY6_cjs.fieldWrapperClass(def, wrapperClass), children: [
|
|
173
|
+
hasVoice ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
174
|
+
labelEl,
|
|
175
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkFZEEWRW3_cjs.VoiceMicButton, { fieldId, onTranscriptReady: setValue })
|
|
176
|
+
] }) : labelEl,
|
|
177
|
+
def.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldDescriptionClass(def, "text-xs text-muted-foreground"), children: def.description }),
|
|
178
|
+
hasShell ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: suggestionShellClass, children: [
|
|
179
|
+
hasSuggestions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: chipsRowClass, role: "group", "aria-label": suggestionsAria, children: suggestionButtons }),
|
|
180
|
+
hasEmbedded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: embeddedRowClass, children: embeddedFieldIds.map((id) => /* @__PURE__ */ jsxRuntime.jsx(EmbeddedSchemaField, { fieldId: id }, id)) }),
|
|
181
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
182
|
+
chunkPHADAQSH_cjs.Textarea,
|
|
183
|
+
{
|
|
184
|
+
id: fieldId,
|
|
185
|
+
value: textValue,
|
|
186
|
+
onChange: (e) => setValue(e.target.value),
|
|
187
|
+
onBlur: setTouched,
|
|
188
|
+
disabled,
|
|
189
|
+
className: textareaShellClass,
|
|
190
|
+
placeholder: def.placeholder,
|
|
191
|
+
style: height != null && Number.isFinite(height) ? { minHeight: height } : void 0,
|
|
192
|
+
"aria-label": !showLabel ? def.label : void 0
|
|
193
|
+
}
|
|
194
|
+
)
|
|
195
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
196
|
+
chunkPHADAQSH_cjs.Textarea,
|
|
197
|
+
{
|
|
198
|
+
id: fieldId,
|
|
199
|
+
value: textValue,
|
|
200
|
+
onChange: (e) => setValue(e.target.value),
|
|
201
|
+
onBlur: setTouched,
|
|
202
|
+
disabled,
|
|
203
|
+
className: inputWithStyle,
|
|
204
|
+
placeholder: def.placeholder,
|
|
205
|
+
style: height != null && Number.isFinite(height) ? { minHeight: height } : void 0,
|
|
206
|
+
"aria-label": !showLabel ? def.label : void 0
|
|
207
|
+
}
|
|
208
|
+
),
|
|
209
|
+
showError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldErrorClass(def, "text-xs text-red-500"), children: error })
|
|
210
|
+
] });
|
|
211
|
+
};
|
|
212
|
+
var ComplaintChipsWidget = SuggestionTextareaWidget;
|
|
213
|
+
|
|
214
|
+
Object.defineProperty(exports, "getSuggestionTokensFromText", {
|
|
215
|
+
enumerable: true,
|
|
216
|
+
get: function () { return chunkIDSBJOFY_cjs.getSuggestionTokensFromText; }
|
|
217
|
+
});
|
|
218
|
+
Object.defineProperty(exports, "toggleSuggestionTokenInText", {
|
|
219
|
+
enumerable: true,
|
|
220
|
+
get: function () { return chunkIDSBJOFY_cjs.toggleSuggestionTokenInText; }
|
|
221
|
+
});
|
|
222
|
+
exports.ComplaintChipsWidget = ComplaintChipsWidget;
|
|
223
|
+
exports.SuggestionTextareaWidget = SuggestionTextareaWidget;
|
|
224
|
+
exports.deriveKnownSuggestionChipValues = deriveKnownSuggestionChipValues;
|
|
225
|
+
//# sourceMappingURL=SuggestionTextareaWidget-2TEITBPF.cjs.map
|
|
226
|
+
//# sourceMappingURL=SuggestionTextareaWidget-2TEITBPF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/SuggestionTextareaWidget.tsx"],"names":["getSuggestionTokensFromText","useFormStore","jsx","TextWidget","SelectWidget","useField","useForm","useState","useMemo","useEffect","fetchOptions","getThemeConfig","cn","fieldControlClass","jsxs","Fragment","FieldRequiredIndicator","isLabelVisible","Label","fieldLabelClass","toggleSuggestionTokenInText","fieldWrapperClass","VoiceMicButton","fieldDescriptionClass","Textarea","fieldErrorClass"],"mappings":"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","file":"SuggestionTextareaWidget-2TEITBPF.cjs","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFormStore } from '../../react/FormProvider';\nimport { VoiceMicButton } from '../../react/VoiceMicButton';\nimport { Label } from '../shadcn/label';\nimport { Textarea } from '../shadcn/textarea';\nimport { getThemeConfig } from '../themes';\nimport { fetchOptions } from '../../core/asyncOptions';\nimport { cn } from '../../core/utils';\nimport type { SelectOption, SuggestionTextareaFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldDescriptionClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\nimport { TextWidget } from './Text';\nimport { SelectWidget } from './Select';\n\nimport { getSuggestionTokensFromText, toggleSuggestionTokenInText } from '../../core/suggestionTokens';\n\nexport { getSuggestionTokensFromText, toggleSuggestionTokenInText };\n\nconst DEFAULT_TOKEN_SEPARATOR = ', ';\n\nfunction getAppendSeparator(def: SuggestionTextareaFieldDef): string {\n const raw = def.meta && typeof (def.meta as { appendSeparator?: unknown }).appendSeparator === 'string'\n ? (def.meta as { appendSeparator: string }).appendSeparator\n : DEFAULT_TOKEN_SEPARATOR;\n return raw;\n}\n\nfunction isTokenSelected(text: string, optionValue: unknown): boolean {\n const t = String(optionValue).trim();\n if (!t) return false;\n return getSuggestionTokensFromText(text).some((p) => p === t);\n}\n\n/**\n * Chip option values present in `text` as comma-separated tokens (same typing as schema `options[].value`).\n * Order follows left-to-right token order; duplicates in text only appear once.\n */\nexport function deriveKnownSuggestionChipValues(text: string, options: SelectOption[]): unknown[] {\n if (!options.length) return [];\n const allowed = new Map<string, unknown>(options.map((o) => [String(o.value), o.value] as const));\n const tokens = getSuggestionTokensFromText(text);\n const out: unknown[] = [];\n const seen = new Set<string>();\n for (const t of tokens) {\n if (!allowed.has(t) || seen.has(t)) continue;\n seen.add(t);\n out.push(allowed.get(t)!);\n }\n return out;\n}\n\nfunction parallelChipArraysEqual(a: unknown, b: unknown): boolean {\n if (!Array.isArray(a) || !Array.isArray(b)) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction isSuggestionField(type: string | undefined): type is SuggestionTextareaFieldDef['type'] {\n return type === 'suggestion_textarea' || type === 'complaint_chips';\n}\n\n/**\n * Renders a sibling schema field inside the suggestion textarea shell. Uses concrete widgets\n * (not FieldRenderer) so `hidden` layout fields still render here without circular imports.\n * Supported: text, number, textarea, select.\n */\nfunction EmbeddedSchemaField({ fieldId }: { fieldId: string }) {\n const store = useFormStore();\n const fieldDef = store.getFieldDef(fieldId);\n if (!fieldDef) return null;\n switch (fieldDef.type) {\n case 'text':\n case 'number':\n case 'textarea':\n return <TextWidget fieldId={fieldId} />;\n case 'select':\n return <SelectWidget fieldId={fieldId} />;\n default:\n return null;\n }\n}\n\n/**\n * Reusable textarea with schema-driven **suggestion chips** inside the input area (same white\n * shell as the textarea). The field value is a **single string**: clicking a chip **appends**\n * that option’s `value` or **removes** it if already selected. When chip options are loaded,\n * slugs are kept on the **last line** (comma + space by default), with prose above separated by\n * a newline. Optional `meta.parallelChipFieldId` mirrors chip selections into a sibling\n * **`multiselect`** array. Free typing is still allowed.\n */\nexport const SuggestionTextareaWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const store = useFormStore();\n const hasVoice = !!(fieldDef?.voice && store.getVoice());\n\n const [options, setOptions] = useState<SelectOption[]>([]);\n const [loading, setLoading] = useState(false);\n const showError = !!error && (touched || state.submitAttempted);\n\n const def =\n fieldDef && isSuggestionField(fieldDef.type) ? (fieldDef as SuggestionTextareaFieldDef) : undefined;\n\n const textValue = value == null || typeof value === 'string' ? value || '' : String(value);\n\n const parallelChipFieldId =\n def?.meta &&\n typeof (def.meta as { parallelChipFieldId?: unknown }).parallelChipFieldId === 'string'\n ? (def.meta as { parallelChipFieldId: string }).parallelChipFieldId.trim()\n : undefined;\n\n const embeddedFieldIds = useMemo(() => {\n const raw = def?.meta && Array.isArray((def.meta as { embeddedFieldIds?: unknown }).embeddedFieldIds)\n ? (def.meta as { embeddedFieldIds: unknown[] }).embeddedFieldIds\n : [];\n return raw\n .filter((id): id is string => typeof id === 'string' && id.trim().length > 0)\n .map((id) => id.trim())\n .filter((id) => store.getFieldDef(id));\n }, [def?.meta, store]);\n\n useEffect(() => {\n if (!def) {\n setOptions([]);\n return;\n }\n if (def.options?.length) {\n setOptions(def.options);\n } else if (def.dataSource) {\n setLoading(true);\n fetchOptions(def.dataSource.source, def.dataSource.params)\n .then((opts) => setOptions(opts as SelectOption[]))\n .finally(() => setLoading(false));\n } else {\n setOptions([]);\n }\n }, [def]);\n\n const chipAllowedSet = useMemo(\n () => new Set(options.map((o) => String(o.value).trim()).filter(Boolean)),\n [options],\n );\n\n useEffect(() => {\n if (!parallelChipFieldId) return;\n const parallelDef = store.getFieldDef(parallelChipFieldId);\n if (!parallelDef || parallelDef.type !== 'multiselect') return;\n const next = deriveKnownSuggestionChipValues(textValue, options);\n const prev = store.getFieldState(parallelChipFieldId).value;\n if (parallelChipArraysEqual(prev, next)) return;\n store.setValues({ [parallelChipFieldId]: next }, { touch: false });\n }, [def, parallelChipFieldId, textValue, options, store]);\n\n if (!def) {\n return null;\n }\n\n const appendSeparator = getAppendSeparator(def);\n const suggestionsAria =\n def.meta && typeof (def.meta as { suggestionsAriaLabel?: string }).suggestionsAriaLabel === 'string'\n ? (def.meta as { suggestionsAriaLabel: string }).suggestionsAriaLabel\n : 'Quick suggestions';\n\n const theme = getThemeConfig('textarea', def.theme);\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const inputClass = cn(theme?.inputClassName, showError && 'border-red-500');\n const inputWithStyle = fieldControlClass(def, inputClass);\n const height =\n def.height != null\n ? typeof def.height === 'string'\n ? Number(def.height) || undefined\n : def.height\n : undefined;\n\n const labelContent = (\n <>\n {def.label}{' '}\n <FieldRequiredIndicator fieldDef={def} />\n </>\n );\n\n const showLabel = isLabelVisible(def);\n\n const labelEl = showLabel ? (\n theme ? (\n <Label className={fieldLabelClass(def, labelClass)}>{labelContent}</Label>\n ) : (\n <Label className={fieldLabelClass(def)}>{labelContent}</Label>\n )\n ) : null;\n\n const onChipClick = (optValue: unknown) => {\n if (disabled) return;\n setValue(toggleSuggestionTokenInText(textValue, String(optValue), appendSeparator, chipAllowedSet));\n };\n\n const hasSuggestions = options.length > 0;\n const hasEmbedded = embeddedFieldIds.length > 0;\n const hasShell = hasSuggestions || hasEmbedded;\n const isHighlightLabel = def.theme === 'highlight-label';\n\n const suggestionShellClass = cn(\n 'flex min-w-0 flex-col overflow-hidden',\n hasShell &&\n (isHighlightLabel\n ? '-mt-1 rounded-b-md border-[#D0D0D0] bg-white'\n : 'rounded-md border border-input bg-background'),\n );\n\n const chipsRowClass = cn(\n 'flex flex-wrap gap-2 px-3 pb-2 pt-3',\n hasSuggestions &&\n (isHighlightLabel ? '' : 'border-b border-input/70'),\n disabled && 'pointer-events-none opacity-50',\n );\n\n const embeddedRowClass = cn(\n 'grid gap-3 px-3 sm:grid-cols-3',\n hasEmbedded &&\n (hasSuggestions\n ? cn('py-2', isHighlightLabel && 'border-t border-input/70')\n : 'border-b border-input/70 py-3'),\n disabled && 'pointer-events-none opacity-50',\n );\n\n const textareaShellClass = cn(\n inputWithStyle,\n hasShell &&\n cn(\n 'mt-0 rounded-t-none rounded-b-md border-0 shadow-none focus-visible:ring-offset-0',\n isHighlightLabel ? 'border-t-0' : 'min-h-[80px]',\n ),\n );\n\n const suggestionButtons =\n loading ? (\n <span className=\"text-xs text-muted-foreground\">Loading suggestions…</span>\n ) : (\n options.map((opt) => {\n const on = isTokenSelected(textValue, opt.value);\n return (\n <button\n key={String(opt.value)}\n type=\"button\"\n onClick={() => onChipClick(opt.value)}\n className={cn(\n 'inline-flex min-h-8 items-center rounded-full border px-3 py-1 text-xs font-medium leading-none transition-colors',\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-muted-foreground/30 bg-background hover:bg-muted/60',\n )}\n >\n {opt.label}\n </button>\n );\n })\n );\n\n return (\n <div className={fieldWrapperClass(def, wrapperClass)}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {labelEl}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : (\n labelEl\n )}\n\n {def.description && (\n <p className={fieldDescriptionClass(def, 'text-xs text-muted-foreground')}>\n {def.description}\n </p>\n )}\n\n {hasShell ? (\n <div className={suggestionShellClass}>\n {hasSuggestions && (\n <div className={chipsRowClass} role=\"group\" aria-label={suggestionsAria}>\n {suggestionButtons}\n </div>\n )}\n {hasEmbedded && (\n <div className={embeddedRowClass}>\n {embeddedFieldIds.map((id) => (\n <EmbeddedSchemaField key={id} fieldId={id} />\n ))}\n </div>\n )}\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={(e) => setValue(e.target.value)}\n onBlur={setTouched}\n disabled={disabled}\n className={textareaShellClass}\n placeholder={def.placeholder}\n style={height != null && Number.isFinite(height) ? { minHeight: height } : undefined}\n aria-label={!showLabel ? def.label : undefined}\n />\n </div>\n ) : (\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={(e) => setValue(e.target.value)}\n onBlur={setTouched}\n disabled={disabled}\n className={inputWithStyle}\n placeholder={def.placeholder}\n style={height != null && Number.isFinite(height) ? { minHeight: height } : undefined}\n aria-label={!showLabel ? def.label : undefined}\n />\n )}\n\n {showError && (\n <p className={fieldErrorClass(def, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n/** @deprecated Use `SuggestionTextareaWidget`. Kept for schema compatibility. */\nexport const ComplaintChipsWidget = SuggestionTextareaWidget;\n"]}
|