@object-ui/plugin-form 13.2.0 → 14.1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,81 @@
1
1
  # @object-ui/plugin-form
2
2
 
3
+ ## 14.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 579b24d: feat(fields+form+detail): file/image uploads in inline line-item grids (#2360)
8
+
9
+ `Field.file` in a master-detail inline grid previously degraded to a plain text
10
+ input (no `input[type=file]` on the page → no way to upload from the grid), and
11
+ auto-derived subform / related-list columns silently dropped file fields.
12
+
13
+ - **fields**: new `FileCell` — a compact upload control for grid cells (upload
14
+ button + removable chips, image thumbnails), sharing the `UploadProvider`
15
+ pipeline with the full-size `FileField` via an extracted `useFileUploads`
16
+ hook. `GridField` supports `type: 'file'` columns (with `accept` /
17
+ `multiple`), renders file names in list/readonly modes, and no longer falls
18
+ back to a text `<Input>` for file columns.
19
+ - **plugin-form**: `deriveColumns` / `hydrateColumns` no longer exclude
20
+ `file`/`image`/`avatar` fields — they map to `file` columns and carry the
21
+ field's `multiple` + `accept` (image fields default to `['image/*']`).
22
+ - **plugin-detail**: auto-derived related-list columns no longer skip
23
+ `file`/`image` fields — they render through the existing FileCellRenderer /
24
+ ImageCellRenderer (file-name chip / thumbnail).
25
+
26
+ ### Patch Changes
27
+
28
+ - Updated dependencies [82441e4]
29
+ - Updated dependencies [2efa9fd]
30
+ - Updated dependencies [0890fa7]
31
+ - Updated dependencies [2ded18c]
32
+ - Updated dependencies [e628d1f]
33
+ - Updated dependencies [5523fc4]
34
+ - Updated dependencies [887062c]
35
+ - Updated dependencies [579b24d]
36
+ - Updated dependencies [2b30583]
37
+ - Updated dependencies [2b30583]
38
+ - Updated dependencies [23d65c3]
39
+ - Updated dependencies [055e1d2]
40
+ - Updated dependencies [9e2d58f]
41
+ - Updated dependencies [dea65f7]
42
+ - Updated dependencies [f30ff68]
43
+ - Updated dependencies [073e7aa]
44
+ - Updated dependencies [3e8bf07]
45
+ - Updated dependencies [6c0135c]
46
+ - Updated dependencies [5b52624]
47
+ - Updated dependencies [4afb251]
48
+ - Updated dependencies [d5b1bc0]
49
+ - Updated dependencies [f94905d]
50
+ - Updated dependencies [2712fc1]
51
+ - Updated dependencies [f0f10f5]
52
+ - @object-ui/i18n@14.1.0
53
+ - @object-ui/fields@14.1.0
54
+ - @object-ui/core@14.1.0
55
+ - @object-ui/types@14.1.0
56
+ - @object-ui/react@14.1.0
57
+ - @object-ui/permissions@14.1.0
58
+ - @object-ui/components@14.1.0
59
+
60
+ ## 14.0.0
61
+
62
+ ### Patch Changes
63
+
64
+ - Updated dependencies [443360a]
65
+ - Updated dependencies [c70bca7]
66
+ - Updated dependencies [86c69c3]
67
+ - Updated dependencies [05e56ca]
68
+ - Updated dependencies [a44e7b6]
69
+ - Updated dependencies [5971cc4]
70
+ - Updated dependencies [6a74160]
71
+ - @object-ui/core@14.0.0
72
+ - @object-ui/i18n@14.0.0
73
+ - @object-ui/react@14.0.0
74
+ - @object-ui/types@14.0.0
75
+ - @object-ui/components@14.0.0
76
+ - @object-ui/fields@14.0.0
77
+ - @object-ui/permissions@14.0.0
78
+
3
79
  ## 13.2.0
4
80
 
5
81
  ### Patch Changes
package/dist/index.js CHANGED
@@ -109,7 +109,9 @@ function be(e, t) {
109
109
  let n = e;
110
110
  if (typeof n.field != "string") return Q(n, n.visibleOn);
111
111
  let r = n.field, i = ye(r, t);
112
- return n.type != null && (i.type = v(n.type)), n.widget != null && (i.widget = n.widget), n.label != null && (i.label = n.label), n.placeholder != null && (i.placeholder = n.placeholder), n.helpText != null && (i.description = n.helpText), n.required != null && (i.required = n.required), n.readonly != null && (i.disabled = n.readonly || i.disabled), n.immutable != null && (i.immutable = n.immutable), n.hidden != null && (i.hidden = n.hidden), n.colSpan != null && (i.colSpan = n.colSpan), n.span != null && (i.span = n.span), n.options != null && (i.options = n.options), n.multiple != null && (i.multiple = n.multiple), n.reference != null && (i.reference = n.reference), n.maxLength != null && (i.maxLength = n.maxLength), n.minLength != null && (i.minLength = n.minLength), n.min != null && (i.min = n.min), n.max != null && (i.max = n.max), n.precision != null && (i.precision = n.precision), n.scale != null && (i.scale = n.scale), n.language != null && (i.language = n.language), Array.isArray(n.fields) && (i.fields = n.fields), Q(i, n.visibleOn);
112
+ n.type != null && (i.type = v(n.type)), n.widget != null && (i.widget = n.widget), n.label != null && (i.label = n.label), n.placeholder != null && (i.placeholder = n.placeholder), n.helpText != null && (i.description = n.helpText), n.required != null && (i.required = n.required), n.readonly != null && (i.disabled = n.readonly || i.disabled), n.immutable != null && (i.immutable = n.immutable), n.hidden != null && (i.hidden = n.hidden), n.colSpan != null && (i.colSpan = n.colSpan), n.span != null && (i.span = n.span), n.options != null && (i.options = n.options), n.multiple != null && (i.multiple = n.multiple);
113
+ let a = n.reference ?? n.reference_to;
114
+ return a != null && (i.reference = a, i.reference_to = a), n.maxLength != null && (i.maxLength = n.maxLength), n.minLength != null && (i.minLength = n.minLength), n.min != null && (i.min = n.min), n.max != null && (i.max = n.max), n.precision != null && (i.precision = n.precision), n.scale != null && (i.scale = n.scale), n.language != null && (i.language = n.language), Array.isArray(n.fields) && (i.fields = n.fields), Q(i, n.visibleOn);
113
115
  }
114
116
  function xe(e, t) {
115
117
  return (e.fields ?? []).map((e) => be(e, t));
@@ -207,14 +209,14 @@ function Ne(e, t) {
207
209
  if (je.has(e.name) || e.type && Se.has(e.type)) return !1;
208
210
  if (!t?.fields) return !0;
209
211
  let n = t.fields[e.name];
210
- return n ? n.readonly === !0 ? !1 : !Ee(n.type) : !0;
212
+ return !n || n.readonly !== !0 && !Ee(n.type);
211
213
  });
212
214
  }
213
215
  function Pe(e, t) {
214
216
  return e.filter((e) => {
215
217
  if (e.type && Se.has(e.type)) return !1;
216
218
  let n = t?.fields?.[e.name];
217
- return n ? !Ee(n.type) : !0;
219
+ return !n || !Ee(n.type);
218
220
  });
219
221
  }
220
222
  var Fe = {
@@ -792,7 +794,7 @@ var $ = (e) => e == null ? void 0 : e.id ?? e._id ?? e.recordId, Ke = (e, t) =>
792
794
  "recordId"
793
795
  ]);
794
796
  function Je(e, t) {
795
- return e ? Object.entries(e).every(([e, n]) => e === t || qe.has(e) ? !0 : n == null || n === "") : !0;
797
+ return !e || Object.entries(e).every(([e, n]) => e === t || qe.has(e) ? !0 : n == null || n === "");
796
798
  }
797
799
  function Ye(e, t, n) {
798
800
  let r = [{
@@ -927,9 +929,6 @@ var nt = /* @__PURE__ */ new Set([
927
929
  "rollup",
928
930
  "autonumber",
929
931
  "auto_number",
930
- "file",
931
- "image",
932
- "avatar",
933
932
  "json",
934
933
  "object",
935
934
  "grid",
@@ -957,10 +956,18 @@ function at(e) {
957
956
  case "toggle": return "select";
958
957
  case "lookup":
959
958
  case "master_detail": return "lookup";
959
+ case "file":
960
+ case "image":
961
+ case "avatar":
962
+ case "attachment": return "file";
960
963
  default: return "text";
961
964
  }
962
965
  }
963
- function ot(e) {
966
+ var ot = /* @__PURE__ */ new Set(["image", "avatar"]);
967
+ function st(e, t) {
968
+ e.multiple == null && t?.multiple && (e.multiple = !0), e.accept ?? (Array.isArray(t?.accept) && t.accept.length > 0 ? e.accept = t.accept : ot.has(t?.type) && (e.accept = ["image/*"]));
969
+ }
970
+ function ct(e) {
964
971
  if (e?.type === "boolean" || e?.type === "toggle") return [{
965
972
  label: "Yes",
966
973
  value: "true"
@@ -977,7 +984,7 @@ function ot(e) {
977
984
  value: String(e)
978
985
  });
979
986
  }
980
- function st(e, t) {
987
+ function lt(e, t) {
981
988
  let n = e?.fields;
982
989
  if (!n || typeof n != "object") return;
983
990
  let r;
@@ -990,7 +997,7 @@ function st(e, t) {
990
997
  }
991
998
  return r;
992
999
  }
993
- var ct = [
1000
+ var ut = [
994
1001
  "name",
995
1002
  "title",
996
1003
  "subject",
@@ -998,7 +1005,7 @@ var ct = [
998
1005
  "full_name",
999
1006
  "display_name",
1000
1007
  "code"
1001
- ], lt = {
1008
+ ], dt = {
1002
1009
  select: 0,
1003
1010
  currency: 1,
1004
1011
  number: 1,
@@ -1006,15 +1013,15 @@ var ct = [
1006
1013
  date: 3,
1007
1014
  text: 4
1008
1015
  };
1009
- function ut(e, t) {
1016
+ function ft(e, t) {
1010
1017
  if (t <= 0 || e.length <= t) return e;
1011
- let n = /* @__PURE__ */ new Set(), r = e.find((e) => ct.includes(e.field)) ?? e[0];
1018
+ let n = /* @__PURE__ */ new Set(), r = e.find((e) => ut.includes(e.field)) ?? e[0];
1012
1019
  r && n.add(r.field);
1013
1020
  for (let t of e) t.required && n.add(t.field);
1014
1021
  let i = e.map((e, t) => ({
1015
1022
  c: e,
1016
1023
  i: t
1017
- })).filter(({ c: e }) => !n.has(e.field)).sort((e, t) => (lt[e.c.type] ?? 5) - (lt[t.c.type] ?? 5) || e.i - t.i);
1024
+ })).filter(({ c: e }) => !n.has(e.field)).sort((e, t) => (dt[e.c.type] ?? 5) - (dt[t.c.type] ?? 5) || e.i - t.i);
1018
1025
  for (let { c: e } of i) {
1019
1026
  if (n.size >= t) break;
1020
1027
  n.add(e.field);
@@ -1024,7 +1031,7 @@ function ut(e, t) {
1024
1031
  defaultHidden: !0
1025
1032
  });
1026
1033
  }
1027
- function dt(e, t = {}) {
1034
+ function pt(e, t = {}) {
1028
1035
  let n = e?.fields;
1029
1036
  if (!n || typeof n != "object") return [];
1030
1037
  let r = /* @__PURE__ */ new Set([...t.exclude ?? [], ...t.relationshipField ? [t.relationshipField] : []]), i = [];
@@ -1036,14 +1043,14 @@ function dt(e, t = {}) {
1036
1043
  label: n?.label || e,
1037
1044
  type: at(n?.type),
1038
1045
  required: !!n?.required
1039
- }, o = ot(n);
1040
- a.type === "select" && o && (a.options = o), a.type === "lookup" && (a.reference = n?.reference, a.displayField = n?.display_field || n?.reference_field), n?.readonlyWhen && (a.readonlyWhen = n.readonlyWhen), (n?.requiredWhen ?? n?.conditionalRequired) && (a.requiredWhen = n.requiredWhen ?? n.conditionalRequired);
1046
+ }, o = ct(n);
1047
+ a.type === "select" && o && (a.options = o), a.type === "lookup" && (a.reference = n?.reference, a.displayField = n?.display_field || n?.reference_field), a.type === "file" && st(a, n), n?.readonlyWhen && (a.readonlyWhen = n.readonlyWhen), (n?.requiredWhen ?? n?.conditionalRequired) && (a.requiredWhen = n.requiredWhen ?? n.conditionalRequired);
1041
1048
  let s = typeof n?.expression == "string" ? n.expression : n?.expression?.source;
1042
1049
  s && typeof s == "string" && (a.computed = !0, a.expr = s, a.required = !1, typeof n?.scale == "number" && (a.scale = n.scale)), i.push(a);
1043
1050
  }
1044
- return ut(i, t.maxColumns ?? 6);
1051
+ return ft(i, t.maxColumns ?? 6);
1045
1052
  }
1046
- function ft(e, t) {
1053
+ function mt(e, t) {
1047
1054
  let n = e ?? [], r = t?.fields;
1048
1055
  return !n.length || !r || typeof r != "object" ? n : n.map((e) => {
1049
1056
  if (e.type) return e;
@@ -1054,30 +1061,30 @@ function ft(e, t) {
1054
1061
  type: n
1055
1062
  };
1056
1063
  i.label ??= t?.label || e.field, i.required ??= !!t?.required;
1057
- let a = ot(t);
1058
- n === "select" && a && !i.options && (i.options = a), n === "lookup" && (i.reference ??= t?.reference, i.displayField ??= t?.display_field || t?.reference_field), i.readonlyWhen == null && t?.readonlyWhen && (i.readonlyWhen = t.readonlyWhen), i.requiredWhen == null && (t?.requiredWhen ?? t?.conditionalRequired) && (i.requiredWhen = t.requiredWhen ?? t.conditionalRequired);
1064
+ let a = ct(t);
1065
+ n === "select" && a && !i.options && (i.options = a), n === "lookup" && (i.reference ??= t?.reference, i.displayField ??= t?.display_field || t?.reference_field), n === "file" && st(i, t), i.readonlyWhen == null && t?.readonlyWhen && (i.readonlyWhen = t.readonlyWhen), i.requiredWhen == null && (t?.requiredWhen ?? t?.conditionalRequired) && (i.requiredWhen = t.requiredWhen ?? t.conditionalRequired);
1059
1066
  let o = typeof t?.expression == "string" ? t.expression : t?.expression?.source;
1060
1067
  return !i.computed && o && typeof o == "string" && (i.computed = !0, i.expr = o, i.required = !1, typeof t?.scale == "number" && (i.scale = t.scale)), i;
1061
1068
  });
1062
1069
  }
1063
- var pt = /* @__PURE__ */ new Set([
1070
+ var ht = /* @__PURE__ */ new Set([
1064
1071
  "formula",
1065
1072
  "summary",
1066
1073
  "rollup",
1067
1074
  "autonumber",
1068
1075
  "auto_number"
1069
1076
  ]);
1070
- function mt(e, t = {}) {
1077
+ function gt(e, t = {}) {
1071
1078
  let n = e?.fields;
1072
1079
  if (!n || typeof n != "object") return [];
1073
1080
  let r = /* @__PURE__ */ new Set([...t.exclude ?? [], ...t.relationshipField ? [t.relationshipField] : []]), i = [];
1074
1081
  for (let [e, t] of Object.entries(n)) {
1075
1082
  let n = t;
1076
- nt.has(e) || r.has(e) || rt.has(e) || n?.system || n?.hidden || pt.has(n?.type) || i.push(e);
1083
+ nt.has(e) || r.has(e) || rt.has(e) || n?.system || n?.hidden || ht.has(n?.type) || i.push(e);
1077
1084
  }
1078
1085
  return i;
1079
1086
  }
1080
- var ht = /* @__PURE__ */ new Set([
1087
+ var _t = /* @__PURE__ */ new Set([
1081
1088
  "textarea",
1082
1089
  "richtext",
1083
1090
  "html",
@@ -1091,12 +1098,12 @@ var ht = /* @__PURE__ */ new Set([
1091
1098
  "location",
1092
1099
  "address"
1093
1100
  ]);
1094
- function gt(e, t, n = {}) {
1101
+ function vt(e, t, n = {}) {
1095
1102
  if (t === "grid" || t === "form") return t;
1096
- let r = e?.fields ?? {}, i = mt(e, { relationshipField: n.relationshipField });
1097
- return i.some((e) => ht.has(r[e]?.type)) || i.length > 8 ? "form" : "grid";
1103
+ let r = e?.fields ?? {}, i = gt(e, { relationshipField: n.relationshipField });
1104
+ return i.some((e) => _t.has(r[e]?.type)) || i.length > 8 ? "form" : "grid";
1098
1105
  }
1099
- var _t = [
1106
+ var yt = [
1100
1107
  "amount",
1101
1108
  "total",
1102
1109
  "subtotal",
@@ -1104,33 +1111,33 @@ var _t = [
1104
1111
  "line_amount",
1105
1112
  "net_amount"
1106
1113
  ];
1107
- function vt(e) {
1114
+ function bt(e) {
1108
1115
  let t = e.filter((e) => e.type === "number" || e.type === "currency");
1109
1116
  if (t.length === 0) return;
1110
1117
  let n = t.find((e) => e.computed);
1111
1118
  if (n) return n.field;
1112
- let r = t.find((e) => _t.includes(e.field));
1119
+ let r = t.find((e) => yt.includes(e.field));
1113
1120
  if (r) return r.field;
1114
1121
  let i = [...t].reverse().find((e) => e.type === "currency");
1115
1122
  return i ? i.field : t[t.length - 1].field;
1116
1123
  }
1117
- function yt(e, t, n, r = {}) {
1118
- let i = r.relationshipField || st(t, n);
1124
+ function xt(e, t, n, r = {}) {
1125
+ let i = r.relationshipField || lt(t, n);
1119
1126
  if (!i) throw Error(`MasterDetailForm: could not find a lookup/master_detail field on "${e}" referencing "${n}". Set relationshipField explicitly.`);
1120
- let a = r.columns?.length ? ft(r.columns, t) : dt(t, { relationshipField: i }), o = r.amountField || vt(a);
1127
+ let a = r.columns?.length ? mt(r.columns, t) : pt(t, { relationshipField: i }), o = r.amountField || bt(a);
1121
1128
  return {
1122
1129
  childObject: e,
1123
1130
  relationshipField: i,
1124
1131
  columns: a,
1125
- formFields: mt(t, { relationshipField: i }),
1126
- mode: gt(t, r.inlineEdit ?? (t?.fields)?.[i]?.inlineEdit, { relationshipField: i }),
1132
+ formFields: gt(t, { relationshipField: i }),
1133
+ mode: vt(t, r.inlineEdit ?? (t?.fields)?.[i]?.inlineEdit, { relationshipField: i }),
1127
1134
  amountField: o,
1128
1135
  sortField: Object.keys(t?.fields ?? {}).find((e) => rt.has(e))
1129
1136
  };
1130
1137
  }
1131
1138
  //#endregion
1132
1139
  //#region src/MasterDetailForm.tsx
1133
- function bt(e) {
1140
+ function St(e) {
1134
1141
  if (!e) return {};
1135
1142
  let t = {};
1136
1143
  return e.querySelectorAll("[name]").forEach((e) => {
@@ -1162,13 +1169,13 @@ function bt(e) {
1162
1169
  }
1163
1170
  }), t;
1164
1171
  }
1165
- var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, formKey: c, onRowExpand: l, onAddViaForm: u }) => {
1172
+ var Ct = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, formKey: c, onRowExpand: l, onAddViaForm: u }) => {
1166
1173
  let [d, f] = s({}), p = o("");
1167
1174
  r(() => {
1168
1175
  let e = i.current;
1169
1176
  if (!e) return;
1170
1177
  let t = () => {
1171
- let t = bt(e), n;
1178
+ let t = St(e), n;
1172
1179
  try {
1173
1180
  n = JSON.stringify(t);
1174
1181
  } catch {
@@ -1263,7 +1270,7 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1263
1270
  ]
1264
1271
  })
1265
1272
  })] });
1266
- }, St = ({ schema: e, dataSource: n, className: i }) => {
1273
+ }, wt = ({ schema: e, dataSource: n, className: i }) => {
1267
1274
  let c = e.details || [], l = e.mode === "edit" && !!e.recordId, u = c.some((e) => !e.relationshipField || !e.columns?.length || e.columns.some((e) => !e.type)), [d, f] = s(u ? null : c), p = d ?? c;
1268
1275
  r(() => {
1269
1276
  if (!u) {
@@ -1280,9 +1287,9 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1280
1287
  let r = await n.getObjectSchema(t.childObject);
1281
1288
  if (t.relationshipField && t.columns?.length) return {
1282
1289
  ...t,
1283
- columns: ft(t.columns, r)
1290
+ columns: mt(t.columns, r)
1284
1291
  };
1285
- let i = yt(t.childObject, r, e.objectName, {
1292
+ let i = xt(t.childObject, r, e.objectName, {
1286
1293
  relationshipField: t.relationshipField,
1287
1294
  columns: t.columns,
1288
1295
  amountField: t.amountField
@@ -1522,12 +1529,12 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1522
1529
  children: [
1523
1530
  /* @__PURE__ */ Y("div", {
1524
1531
  ref: U,
1525
- children: /* @__PURE__ */ Y(At, {
1532
+ children: /* @__PURE__ */ Y(Mt, {
1526
1533
  schema: ne,
1527
1534
  dataSource: n
1528
1535
  }, v)
1529
1536
  }),
1530
- /* @__PURE__ */ Y(xt, {
1537
+ /* @__PURE__ */ Y(Ct, {
1531
1538
  details: p,
1532
1539
  state: m,
1533
1540
  setRows: T,
@@ -1560,7 +1567,7 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1560
1567
  onClick: L,
1561
1568
  children: "Close"
1562
1569
  })]
1563
- }), /* @__PURE__ */ Y(k, { children: /* @__PURE__ */ Y(At, {
1570
+ }), /* @__PURE__ */ Y(k, { children: /* @__PURE__ */ Y(Mt, {
1564
1571
  schema: {
1565
1572
  type: "object-form",
1566
1573
  objectName: F.childObject,
@@ -1596,18 +1603,18 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1596
1603
  })
1597
1604
  ]
1598
1605
  });
1599
- }, Ct = {
1606
+ }, Tt = {
1600
1607
  1: void 0,
1601
1608
  2: "grid gap-4 grid-cols-1 @md:grid-cols-2",
1602
1609
  3: "grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3",
1603
1610
  4: "grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3 @4xl:grid-cols-4"
1604
- }, wt = Z({
1611
+ }, Et = Z({
1605
1612
  "form.discardTitle": "Discard changes?",
1606
1613
  "form.discardMessage": "You have unsaved changes. If you close this form now, your edits will be lost.",
1607
1614
  "form.keepEditing": "Keep editing",
1608
1615
  "form.discard": "Discard"
1609
- }, "form.discardTitle"), Tt = ({ schema: e, dataSource: n, className: c }) => {
1610
- let { fieldLabel: u } = p(), { t: f } = wt(), m = d(), [h, _] = s(null), [O, k] = s([]), [A, j] = s({}), [M, N] = s(!0), [P, F] = s(null), [ee, I] = s(!1), [L, R] = s(!1), [z, U] = s(!1), W = o(!1), re = e.confirmOnDiscard !== !1, ie = e.open !== !1, ae = e.drawerSide || "right", K = i(), [oe, se] = s(() => {
1616
+ }, "form.discardTitle"), Dt = ({ schema: e, dataSource: n, className: c }) => {
1617
+ let { fieldLabel: u } = p(), { t: f } = Et(), m = d(), [h, _] = s(null), [O, k] = s([]), [A, j] = s({}), [M, N] = s(!0), [P, F] = s(null), [ee, I] = s(!1), [L, R] = s(!1), [z, U] = s(!1), W = o(!1), re = e.confirmOnDiscard !== !1, ie = e.open !== !1, ae = e.drawerSide || "right", K = i(), [oe, se] = s(() => {
1611
1618
  let t = {};
1612
1619
  return e.sections?.forEach((e, n) => {
1613
1620
  let r = e.name || String(n);
@@ -1800,14 +1807,14 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1800
1807
  fields: t
1801
1808
  } });
1802
1809
  }
1803
- let t = ze(O, h, e.columns, e.mode), n = Ct[t.columns || 1];
1810
+ let t = ze(O, h, e.columns, e.mode), n = Tt[t.columns || 1];
1804
1811
  return /* @__PURE__ */ Y(l, { schema: {
1805
1812
  ..._e,
1806
1813
  fields: t.fields,
1807
1814
  columns: t.columns,
1808
1815
  ...n ? { fieldContainerClass: n } : {}
1809
1816
  } });
1810
- }, Q = e.subforms, ye = Q?.length && e.mode !== "view" ? /* @__PURE__ */ Y(St, {
1817
+ }, Q = e.subforms, ye = Q?.length && e.mode !== "view" ? /* @__PURE__ */ Y(wt, {
1811
1818
  schema: {
1812
1819
  type: "object-master-detail-form",
1813
1820
  objectName: e.objectName,
@@ -1900,7 +1907,7 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1900
1907
  };
1901
1908
  //#endregion
1902
1909
  //#region src/fieldGroups.ts
1903
- function Et(e, t) {
1910
+ function Ot(e, t) {
1904
1911
  let n = he({
1905
1912
  fieldGroups: t,
1906
1913
  fields: Object.fromEntries(e.map((e) => [e.name, { group: e.group }]))
@@ -1921,19 +1928,19 @@ function Et(e, t) {
1921
1928
  }
1922
1929
  //#endregion
1923
1930
  //#region src/ModalForm.tsx
1924
- var Dt = Z({
1931
+ var kt = Z({
1925
1932
  "form.discardTitle": "Discard changes?",
1926
1933
  "form.discardMessage": "You have unsaved changes. If you close this form now, your edits will be lost.",
1927
1934
  "form.keepEditing": "Keep editing",
1928
1935
  "form.discard": "Discard"
1929
- }, "form.discardTitle"), Ot = {
1936
+ }, "form.discardTitle"), At = {
1930
1937
  sm: "sm:max-w-sm",
1931
1938
  default: "sm:max-w-lg",
1932
1939
  lg: "sm:max-w-2xl",
1933
1940
  xl: "sm:max-w-5xl",
1934
1941
  full: "sm:max-w-[95vw] sm:w-full"
1935
- }, kt = ({ schema: e, dataSource: n, className: c }) => {
1936
- let { fieldLabel: u, sectionLabel: f } = p(), { t: m } = Dt(), h = d(), _ = se(), O = t((t) => {
1942
+ }, jt = ({ schema: e, dataSource: n, className: c }) => {
1943
+ let { fieldLabel: u, sectionLabel: f } = p(), { t: m } = kt(), h = d(), _ = se(), O = t((t) => {
1937
1944
  if (!_?.isLoaded) return t;
1938
1945
  let n = [];
1939
1946
  for (let r of t) {
@@ -1956,7 +1963,7 @@ var Dt = Z({
1956
1963
  if (e.sections?.length || e.customFields?.length) return null;
1957
1964
  let t = Me(j, k);
1958
1965
  e.mode === "create" && (t = Pe(t, k));
1959
- let n = Et(t, k?.fieldGroups);
1966
+ let n = Ot(t, k?.fieldGroups);
1960
1967
  if (!n) return null;
1961
1968
  let r = e.columns && e.columns > 0 ? Math.min(Math.floor(e.columns), 4) : De(t.length);
1962
1969
  return n.map((e) => ({
@@ -1977,7 +1984,7 @@ var Dt = Z({
1977
1984
  e.mode,
1978
1985
  J,
1979
1986
  e.customFields
1980
- ]), he = Ot[a(() => {
1987
+ ]), he = At[a(() => {
1981
1988
  if (e.modalSize) return e.modalSize;
1982
1989
  if (Z?.columns && Z.columns > 1) return Re(Z.columns);
1983
1990
  if (J?.length) {
@@ -1989,7 +1996,7 @@ var Dt = Z({
1989
1996
  e.modalSize,
1990
1997
  Z,
1991
1998
  J
1992
- ])] || Ot.default;
1999
+ ])] || At.default;
1993
2000
  r(() => {
1994
2001
  (async () => {
1995
2002
  if (!n) {
@@ -2246,7 +2253,7 @@ var Dt = Z({
2246
2253
  })]
2247
2254
  }), /* @__PURE__ */ Y("div", {
2248
2255
  className: "@container flex-1 overflow-y-auto px-4 sm:px-6 py-4",
2249
- children: /* @__PURE__ */ Y(St, {
2256
+ children: /* @__PURE__ */ Y(wt, {
2250
2257
  schema: {
2251
2258
  type: "object-master-detail-form",
2252
2259
  objectName: e.objectName,
@@ -2331,24 +2338,34 @@ var Dt = Z({
2331
2338
  ]
2332
2339
  })
2333
2340
  });
2334
- }, At = ({ schema: e, dataSource: t }) => {
2341
+ }, Mt = ({ schema: e, dataSource: t }) => {
2335
2342
  let n = se(), r = a(() => {
2336
- if (!n?.isLoaded) return e;
2337
- let t = (t) => t?.name ? n.checkField(e.objectName, t.name, "read") ? !n.checkField(e.objectName, t.name, "write") && e.mode !== "view" ? {
2338
- ...t,
2343
+ let t = e.groups, r = !e.sections?.length && Array.isArray(t) && t.length ? {
2344
+ ...e,
2345
+ sections: t.map((e) => ({
2346
+ label: e.title ?? e.label,
2347
+ description: e.description,
2348
+ collapsible: e.collapsible,
2349
+ collapsed: e.defaultCollapsed ?? e.collapsed,
2350
+ fields: e.fields ?? []
2351
+ }))
2352
+ } : e;
2353
+ if (!n?.isLoaded) return r;
2354
+ let i = (e) => e?.name ? n.checkField(r.objectName, e.name, "read") ? !n.checkField(r.objectName, e.name, "write") && r.mode !== "view" ? {
2355
+ ...e,
2339
2356
  readOnly: !0,
2340
2357
  disabled: !0
2341
- } : t : null : t, r = (e) => Array.isArray(e) ? e.map(t).filter(Boolean) : e;
2358
+ } : e : null : e, a = (e) => Array.isArray(e) ? e.map(i).filter(Boolean) : e;
2342
2359
  return {
2343
- ...e,
2344
- fields: r(e.fields),
2345
- sections: e.sections?.map((e) => ({
2360
+ ...r,
2361
+ fields: a(r.fields),
2362
+ sections: r.sections?.map((e) => ({
2346
2363
  ...e,
2347
- fields: r(e.fields)
2364
+ fields: a(e.fields)
2348
2365
  }))
2349
2366
  };
2350
2367
  }, [e, n]), { sectionLabel: i } = p(), o = (e) => e?.name ? i(r.objectName, e.name, e.label || e.name) : e?.label;
2351
- if (r.subforms?.length && r.mode !== "view" && r.formType !== "drawer" && r.formType !== "modal") return /* @__PURE__ */ Y(St, {
2368
+ if (r.subforms?.length && r.mode !== "view" && r.formType !== "drawer" && r.formType !== "modal") return /* @__PURE__ */ Y(wt, {
2352
2369
  schema: {
2353
2370
  type: "object-master-detail-form",
2354
2371
  objectName: r.objectName,
@@ -2434,7 +2451,7 @@ var Dt = Z({
2434
2451
  });
2435
2452
  if (r.formType === "drawer") {
2436
2453
  let { layout: e, ...n } = r, i = r.layout === "vertical" || r.layout === "horizontal" ? r.layout : void 0;
2437
- return /* @__PURE__ */ Y(Tt, {
2454
+ return /* @__PURE__ */ Y(Dt, {
2438
2455
  schema: {
2439
2456
  ...n,
2440
2457
  layout: i,
@@ -2460,7 +2477,7 @@ var Dt = Z({
2460
2477
  }
2461
2478
  if (r.formType === "modal") {
2462
2479
  let { layout: e, ...n } = r, i = r.layout === "vertical" || r.layout === "horizontal" ? r.layout : void 0;
2463
- return /* @__PURE__ */ Y(kt, {
2480
+ return /* @__PURE__ */ Y(jt, {
2464
2481
  schema: {
2465
2482
  ...n,
2466
2483
  layout: i,
@@ -2483,11 +2500,11 @@ var Dt = Z({
2483
2500
  className: r.className
2484
2501
  });
2485
2502
  }
2486
- return /* @__PURE__ */ Y(jt, {
2503
+ return /* @__PURE__ */ Y(Nt, {
2487
2504
  schema: r,
2488
2505
  dataSource: t
2489
2506
  });
2490
- }, jt = ({ schema: n, dataSource: i }) => {
2507
+ }, Nt = ({ schema: n, dataSource: i }) => {
2491
2508
  let { fieldLabel: a, sectionLabel: o } = p(), c = oe(), u = se(), d = t((e) => {
2492
2509
  if (!u?.isLoaded) return e;
2493
2510
  let t = [];
@@ -2566,7 +2583,7 @@ var Dt = Z({
2566
2583
  return;
2567
2584
  }
2568
2585
  if (!f) return;
2569
- let e = [], t = !!f?.managedBy && f.managedBy !== "platform", r = n.mode === "edit" ? f?.userActions?.edit === !0 : n.mode === "create" ? f?.userActions?.create === !0 : !1, o = t && !r, s = n.fields || Object.keys(f.fields || {});
2586
+ let e = [], t = !!f?.managedBy && f.managedBy !== "platform", r = n.mode === "edit" ? f?.userActions?.edit === !0 : n.mode === "create" && f?.userActions?.create === !0, o = t && !r, s = n.fields || Object.keys(f.fields || {});
2570
2587
  (Array.isArray(s) ? s : Object.keys(s)).forEach((t) => {
2571
2588
  let r = typeof t == "string" ? t : t.name;
2572
2589
  if (!r) return;
@@ -2676,7 +2693,7 @@ var Dt = Z({
2676
2693
  h,
2677
2694
  f,
2678
2695
  n.mode
2679
- ]), P = e.useMemo(() => n.sections?.length ? null : Et(N, f?.fieldGroups), [
2696
+ ]), P = e.useMemo(() => n.sections?.length ? null : Ot(N, f?.fieldGroups), [
2680
2697
  n.sections,
2681
2698
  N,
2682
2699
  f
@@ -2812,7 +2829,7 @@ var Dt = Z({
2812
2829
  "data-mobile-form": V ? "true" : void 0,
2813
2830
  children: /* @__PURE__ */ Y(l, { schema: W })
2814
2831
  });
2815
- }, Mt = {
2832
+ }, Pt = {
2816
2833
  text: 200,
2817
2834
  email: 254,
2818
2835
  url: 2048,
@@ -2820,8 +2837,8 @@ var Dt = Z({
2820
2837
  textarea: 5e3,
2821
2838
  markdown: 5e3,
2822
2839
  html: 5e3
2823
- }, Nt = "_company_website_2", Pt = 1500;
2824
- function Ft(e, t = []) {
2840
+ }, Ft = "_company_website_2", It = 1500;
2841
+ function Lt(e, t = []) {
2825
2842
  try {
2826
2843
  let n = new URL(e, typeof window < "u" ? window.location.href : "http://localhost");
2827
2844
  return typeof window < "u" && n.origin === window.location.origin ? !0 : n.protocol !== "https:" && n.protocol !== "http:" ? !1 : t.some((e) => {
@@ -2836,21 +2853,21 @@ function Ft(e, t = []) {
2836
2853
  return !1;
2837
2854
  }
2838
2855
  }
2839
- function It(e) {
2856
+ function Rt(e) {
2840
2857
  return e && e.map((e) => {
2841
- let t = Mt[String(e.type || "").toLowerCase()];
2858
+ let t = Pt[String(e.type || "").toLowerCase()];
2842
2859
  return !t || (e.maxLength ?? e.max_length) ? e : {
2843
2860
  ...e,
2844
2861
  maxLength: t
2845
2862
  };
2846
2863
  });
2847
2864
  }
2848
- var Lt = ({ config: e, dataSource: n, prefillParams: i, className: c }) => {
2865
+ var zt = ({ config: e, dataSource: n, prefillParams: i, className: c }) => {
2849
2866
  let [l, u] = s(!1), [d, f] = s(!1), [p, m] = s(null), [h, g] = s(!(e.consent?.required ?? !!e.consent)), [_, v] = s(null), y = o(null), b = o(0);
2850
2867
  r(() => {
2851
2868
  l || (b.current = Date.now());
2852
2869
  }, [l]);
2853
- let x = e.honeypot === !1 ? null : e.honeypot || Nt, S = e.minFillTime ?? Pt, C = a(() => It(e.customFields), [e.customFields]), w = a(() => {
2870
+ let x = e.honeypot === !1 ? null : e.honeypot || Ft, S = e.minFillTime ?? It, C = a(() => Rt(e.customFields), [e.customFields]), w = a(() => {
2854
2871
  if (!n || C && C.length > 0 || !e.fields || e.fields.length === 0) return;
2855
2872
  let t = async (e, t) => t;
2856
2873
  return {
@@ -2891,7 +2908,7 @@ var Lt = ({ config: e, dataSource: n, prefillParams: i, className: c }) => {
2891
2908
  try {
2892
2909
  n && await n.create(e.objectName, r), u(!0);
2893
2910
  let t = e.thankYouPage?.redirectUrl;
2894
- if (t) if (Ft(t, e.allowedRedirectHosts)) {
2911
+ if (t) if (Lt(t, e.allowedRedirectHosts)) {
2895
2912
  let n = e.thankYouPage?.redirectDelay ?? 3e3;
2896
2913
  setTimeout(() => {
2897
2914
  window.location.href = t;
@@ -2997,7 +3014,7 @@ var Lt = ({ config: e, dataSource: n, prefillParams: i, className: c }) => {
2997
3014
  className: "mb-4 p-3 bg-destructive/10 border border-destructive/30 rounded-md text-sm text-destructive",
2998
3015
  children: p
2999
3016
  }),
3000
- /* @__PURE__ */ Y(At, {
3017
+ /* @__PURE__ */ Y(Mt, {
3001
3018
  schema: {
3002
3019
  type: "object-form",
3003
3020
  objectName: e.objectName,
@@ -3103,10 +3120,10 @@ var Lt = ({ config: e, dataSource: n, prefillParams: i, className: c }) => {
3103
3120
  };
3104
3121
  //#endregion
3105
3122
  //#region src/FormAnalytics.tsx
3106
- function Rt(e) {
3123
+ function Bt(e) {
3107
3124
  return e < 60 ? `${Math.round(e)}s` : e < 3600 ? `${Math.floor(e / 60)}m ${Math.round(e % 60)}s` : `${Math.floor(e / 3600)}h ${Math.floor(e % 3600 / 60)}m`;
3108
3125
  }
3109
- var zt = ({ formId: e, formTitle: t, metrics: n, className: r }) => {
3126
+ var Vt = ({ formId: e, formTitle: t, metrics: n, className: r }) => {
3110
3127
  let i = a(() => {
3111
3128
  if (!n.abandonedSubmissions) return 100;
3112
3129
  let e = n.totalSubmissions + n.abandonedSubmissions;
@@ -3149,7 +3166,7 @@ var zt = ({ formId: e, formTitle: t, metrics: n, className: r }) => {
3149
3166
  className: "pb-2",
3150
3167
  children: [/* @__PURE__ */ Y(A, { children: "Avg. Completion Time" }), /* @__PURE__ */ Y(M, {
3151
3168
  className: "text-2xl",
3152
- children: n.avgCompletionTime ? Rt(n.avgCompletionTime) : "—"
3169
+ children: n.avgCompletionTime ? Bt(n.avgCompletionTime) : "—"
3153
3170
  })]
3154
3171
  }) })
3155
3172
  ]
@@ -3201,7 +3218,7 @@ var zt = ({ formId: e, formTitle: t, metrics: n, className: r }) => {
3201
3218
  }) })] })
3202
3219
  ]
3203
3220
  });
3204
- }, Bt = ({ schema: e }) => {
3221
+ }, Ht = ({ schema: e }) => {
3205
3222
  let n = m()?.dataSource, i = f(), o = e.parentObject || i?.objectName, c = e.parentId || e.recordId || i?.recordId, [l, u] = s([]), [d, p] = s([]), [g, _] = s(!0), [v, y] = s(!1), [b, x] = s(!1), [S, C] = s(null), [w, T] = s(null);
3206
3223
  r(() => {
3207
3224
  let t = n;
@@ -3309,11 +3326,11 @@ var zt = ({ formId: e, formTitle: t, metrics: n, className: r }) => {
3309
3326
  children: "Save the record first to add line items."
3310
3327
  })] })]
3311
3328
  });
3312
- }, Vt = ({ schema: e }) => /* @__PURE__ */ Y(At, {
3329
+ }, Ut = ({ schema: e }) => /* @__PURE__ */ Y(Mt, {
3313
3330
  schema: e,
3314
3331
  dataSource: n(u)?.dataSource ?? void 0
3315
3332
  });
3316
- c.register("object-form", Vt, {
3333
+ c.register("object-form", Ut, {
3317
3334
  namespace: "plugin-form",
3318
3335
  label: "Object Form",
3319
3336
  category: "plugin",
@@ -3454,7 +3471,7 @@ c.register("object-form", Vt, {
3454
3471
  ]
3455
3472
  }
3456
3473
  ]
3457
- }), c.register("form", Vt, {
3474
+ }), c.register("form", Ut, {
3458
3475
  namespace: "view",
3459
3476
  skipFallback: !0,
3460
3477
  label: "Data Form View",
@@ -3482,7 +3499,7 @@ c.register("object-form", Vt, {
3482
3499
  ]
3483
3500
  }
3484
3501
  ]
3485
- }), c.register("embeddable-form", ({ schema: e }) => /* @__PURE__ */ Y(Lt, { config: e }), {
3502
+ }), c.register("embeddable-form", ({ schema: e }) => /* @__PURE__ */ Y(zt, { config: e }), {
3486
3503
  namespace: "plugin-form",
3487
3504
  label: "Embeddable Form",
3488
3505
  category: "plugin",
@@ -3520,7 +3537,7 @@ c.register("object-form", Vt, {
3520
3537
  label: "Allow Multiple Submissions"
3521
3538
  }
3522
3539
  ]
3523
- }), c.register("form-analytics", ({ schema: e }) => /* @__PURE__ */ Y(zt, {
3540
+ }), c.register("form-analytics", ({ schema: e }) => /* @__PURE__ */ Y(Vt, {
3524
3541
  formId: e.formId,
3525
3542
  formTitle: e.formTitle,
3526
3543
  metrics: e.metrics || { totalSubmissions: 0 }
@@ -3546,7 +3563,7 @@ c.register("object-form", Vt, {
3546
3563
  label: "Submission Metrics"
3547
3564
  }
3548
3565
  ]
3549
- }), c.register("object-master-detail-form", ({ schema: e }) => /* @__PURE__ */ Y(St, {
3566
+ }), c.register("object-master-detail-form", ({ schema: e }) => /* @__PURE__ */ Y(wt, {
3550
3567
  schema: e,
3551
3568
  dataSource: n(u)?.dataSource ?? void 0
3552
3569
  }), {
@@ -3578,7 +3595,7 @@ c.register("object-form", Vt, {
3578
3595
  required: !0
3579
3596
  }
3580
3597
  ]
3581
- }), c.register("line_items", ({ schema: e }) => /* @__PURE__ */ Y(Bt, { schema: e }), {
3598
+ }), c.register("line_items", ({ schema: e }) => /* @__PURE__ */ Y(Ht, { schema: e }), {
3582
3599
  namespace: "record",
3583
3600
  skipFallback: !0,
3584
3601
  label: "Line Items",
@@ -3615,4 +3632,4 @@ c.register("object-form", Vt, {
3615
3632
  ]
3616
3633
  });
3617
3634
  //#endregion
3618
- export { Tt as DrawerForm, Lt as EmbeddableForm, zt as FormAnalytics, ve as FormSection, Bt as LineItemsPanel, St as MasterDetailForm, kt as ModalForm, At as ObjectForm, He as SplitForm, Be as TabbedForm, Ve as WizardForm, Ae as applyAutoColSpan, ze as applyAutoLayout, Ie as containerGridColsFor, dt as deriveColumns, yt as deriveDetail, mt as deriveFormFields, Pe as filterAutoGeneratedFields, Ne as filterCreateModeFields, Me as filterSystemFields, st as findRelationshipField, De as inferColumns, Re as inferModalSize, Ee as isAutoGeneratedFieldType, Te as isWideFieldType, gt as resolveInlineMode };
3635
+ export { Dt as DrawerForm, zt as EmbeddableForm, Vt as FormAnalytics, ve as FormSection, Ht as LineItemsPanel, wt as MasterDetailForm, jt as ModalForm, Mt as ObjectForm, He as SplitForm, Be as TabbedForm, Ve as WizardForm, Ae as applyAutoColSpan, ze as applyAutoLayout, Ie as containerGridColsFor, pt as deriveColumns, xt as deriveDetail, gt as deriveFormFields, Pe as filterAutoGeneratedFields, Ne as filterCreateModeFields, Me as filterSystemFields, lt as findRelationshipField, De as inferColumns, Re as inferModalSize, Ee as isAutoGeneratedFieldType, Te as isWideFieldType, vt as resolveInlineMode };
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("react"),require("@object-ui/core"),require("@object-ui/react"),require("@object-ui/fields"),require("@object-ui/components"),require("@object-ui/permissions"),require("lucide-react"),require("react/jsx-runtime"),require("@object-ui/i18n"),require("@objectstack/spec/data")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`@object-ui/fields`,`@object-ui/components`,`@object-ui/permissions`,`lucide-react`,`react/jsx-runtime`,`@object-ui/i18n`,`@objectstack/spec/data`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginForm={},e.React,e._object_ui_core,e._object_ui_react,e._object_ui_fields,e._object_ui_components,e._object_ui_permissions,e.lucide_react,e.react_jsx_runtime,e._object_ui_i18n,e._objectstack_spec_data))})(this,function(e,t,n,r,i,a,o,s,c,l,u){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var d=Object.create,f=Object.defineProperty,p=Object.getOwnPropertyDescriptor,m=Object.getOwnPropertyNames,h=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty,_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=m(t),a=0,o=i.length,s;a<o;a++)s=i[a],!g.call(e,s)&&s!==n&&f(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=p(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:d(h(e)),_(t||!e||!e.__esModule?f(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);function v(e){try{return typeof window>`u`?!1:new URL(e,window.location.href).origin===window.location.origin}catch{return!1}}function y(e,t){if(!e)return null;let n=t?.id??t?.recordId??t?._id;if(n==null||n===``)return null;let r=e.replace(/\{(?:id|recordId)\}/g,String(n));return v(r)?r:null}var b=({label:e,description:n,collapsible:r=!1,collapsed:i=!1,columns:o=1,children:l,className:u,gridClassName:d,showBorder:f})=>{let[p,m]=(0,t.useState)(i),h={1:`grid-cols-1`,2:`grid-cols-1 md:grid-cols-2`,3:`grid-cols-1 md:grid-cols-2 lg:grid-cols-3`,4:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`},g=()=>{r&&m(!p)},_=f??!!e,v=e||n?(0,c.jsxs)(`div`,{className:(0,a.cn)(`flex items-start gap-2`,!_&&`mb-4`,r&&`cursor-pointer select-none`),onClick:g,role:r?`button`:void 0,"aria-expanded":r?!p:void 0,children:[r&&(0,c.jsx)(`span`,{className:`mt-0.5 text-muted-foreground`,children:p?(0,c.jsx)(s.ChevronRight,{className:`h-4 w-4`}):(0,c.jsx)(s.ChevronDown,{className:`h-4 w-4`})}),(0,c.jsxs)(`div`,{className:`flex-1`,children:[e&&(0,c.jsx)(`h3`,{className:`text-sm font-semibold text-foreground`,children:e}),n&&(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:n})]})]}):null,y=p?null:(0,c.jsx)(`div`,{className:(0,a.cn)(`grid gap-4`,d||h[o]),children:l});return _?(0,c.jsxs)(a.Card,{className:(0,a.cn)(`form-section bg-muted/40 shadow-none`,u),children:[v&&(0,c.jsx)(a.CardHeader,{className:`border-b border-border pb-3`,children:v}),y&&(0,c.jsx)(a.CardContent,{className:`pt-4`,children:y})]}):(0,c.jsxs)(`div`,{className:(0,a.cn)(`form-section`,u),children:[v,y]})};function x(e,t){return typeof t==`string`&&t.trim()||typeof t==`object`&&t&&typeof t.source==`string`&&t.source.trim()?{...e,visibleOn:t}:e}function S(e,t){let n=t.objectSchema?.fields?.[e];return n?{name:e,label:t.fieldLabel(t.objectName,e,n.label||e),type:(0,i.mapFieldTypeToFormType)(n.type),required:n.required||!1,disabled:t.readOnly||t.mode===`view`||n.readonly,placeholder:n.placeholder,description:n.help||n.description,validation:(0,i.buildValidationRules)(n),field:n,options:n.options,multiple:n.multiple,visibleWhen:n.visibleWhen,readonlyWhen:n.readonlyWhen,requiredWhen:n.requiredWhen,conditionalRequired:n.conditionalRequired}:{name:e,label:e,type:`input`}}function C(e,t){if(typeof e==`string`){let n=t.objectSchema?.fields?.[e];return x(S(e,t),n?.visible_on??n?.visibleOn)}let n=e;if(typeof n.field!=`string`)return x(n,n.visibleOn);let r=n.field,a=S(r,t);return n.type!=null&&(a.type=(0,i.mapFieldTypeToFormType)(n.type)),n.widget!=null&&(a.widget=n.widget),n.label!=null&&(a.label=n.label),n.placeholder!=null&&(a.placeholder=n.placeholder),n.helpText!=null&&(a.description=n.helpText),n.required!=null&&(a.required=n.required),n.readonly!=null&&(a.disabled=n.readonly||a.disabled),n.immutable!=null&&(a.immutable=n.immutable),n.hidden!=null&&(a.hidden=n.hidden),n.colSpan!=null&&(a.colSpan=n.colSpan),n.span!=null&&(a.span=n.span),n.options!=null&&(a.options=n.options),n.multiple!=null&&(a.multiple=n.multiple),n.reference!=null&&(a.reference=n.reference),n.maxLength!=null&&(a.maxLength=n.maxLength),n.minLength!=null&&(a.minLength=n.minLength),n.min!=null&&(a.min=n.min),n.max!=null&&(a.max=n.max),n.precision!=null&&(a.precision=n.precision),n.scale!=null&&(a.scale=n.scale),n.language!=null&&(a.language=n.language),Array.isArray(n.fields)&&(a.fields=n.fields),x(a,n.visibleOn)}function w(e,t){return(e.fields??[]).map(e=>C(e,t))}var T=new Set([`field:formula`,`field:summary`,`field:auto_number`,`field:autonumber`]),E=new Set([`field:textarea`,`field:markdown`,`field:html`,`field:grid`,`field:rich-text`,`textarea`,`markdown`,`html`,`grid`,`rich-text`]),D=new Set([`formula`,`summary`,`auto_number`,`autonumber`]);function O(e){return E.has(e)}function k(e){return D.has(e)}function A(e){return e<=3?1:e<=8?2:e<=15?3:4}function j(e){return e&&e>0?Math.min(Math.floor(e),4):1}function M(e,t,n){let r=j(t);return r<=1?1:e.span===`full`?r:e.colSpan==null?e.type&&O(e.type)?r:Math.min(r,Math.max(1,Math.round(r/Math.min(Math.max(1,Math.floor(n||r)),r)))):Math.min(Math.max(1,Math.floor(e.colSpan)),r)}function N(e,t,n){let r=j(t);return r<=1?e:e.map(e=>{if(e.type===`section-divider`)return e;let t=M(e,r,n);return t>1?{...e,colSpan:t}:e.colSpan!=null&&e.colSpan!==1?{...e,colSpan:1}:e})}var P=new Set([`id`,`created_at`,`createdAt`,`updated_at`,`updatedAt`,`last_modified_at`,`lastModifiedAt`,`deleted_at`,`deletedAt`,`created_by`,`createdBy`,`updated_by`,`updatedBy`,`last_modified_by`,`lastModifiedBy`,`organization_id`,`organizationId`,`org_id`,`orgId`,`tenant_id`,`tenantId`,`owner`,`owner_id`,`_version`,`_rev`]);function F(e,t){return e.filter(e=>{if(P.has(e.name))return!1;let n=t?.fields?.[e.name];return!(n?.hidden===!0||n?.readonly===!0)})}function I(e,t){return e.filter(e=>{if(P.has(e.name)||e.type&&T.has(e.type))return!1;if(!t?.fields)return!0;let n=t.fields[e.name];return n?n.readonly===!0?!1:!k(n.type):!0})}function L(e,t){return e.filter(e=>{if(e.type&&T.has(e.type))return!1;let n=t?.fields?.[e.name];return n?!k(n.type):!0})}var R={1:void 0,2:`grid gap-4 grid-cols-1 @md:grid-cols-2`,3:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3`,4:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3 @4xl:grid-cols-4`};function z(e){return R[e&&e>0?Math.min(Math.floor(e),4):1]}function B(e,t){let n=t&&t>1?Math.min(Math.floor(t),4):1,r=n>1?N(e,n):e,i=z(n);return{fields:r,columns:n,...i?{fieldContainerClass:i}:{}}}function V(e){return e<=1?`default`:e===2?`xl`:`full`}function H(e,t,n,r){let i=[...e];if(i=F(i,t),r===`create`&&(i=L(i,t)),n!==void 0)return i=N(i,n),{fields:i,columns:n};let a=A(i.length);return i=N(i,a),{fields:i,columns:a}}var U=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,l]=(0,t.useState)(null),[u,d]=(0,t.useState)({}),[f,p]=(0,t.useState)(!0),[m,h]=(0,t.useState)(null),[g,_]=(0,t.useState)(e.defaultTab||e.sections[0]?.name||e.sections[0]?.label||`tab-0`);t.default.useEffect(()=>{(async()=>{if(!n){p(!1);return}try{let t=await n.getObjectSchema(e.objectName);l(t)}catch(e){h(e)}})()},[e.objectName,n]),t.default.useEffect(()=>{(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){d(e.initialData||e.initialValues||{}),p(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);d(t||{})}catch(e){h(e)}finally{p(!1)}})()},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let v=(0,t.useCallback)(t=>w(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[s,e.readOnly,e.mode,e.objectName,o]),y=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;return e.mode===`create`?r=await n.create(e.objectName,t):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,t)),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n]),x=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),S=(e,t)=>e.name||e.label||`tab-${t}`;if(m)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:m.message})]});if(f)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let C={type:`form`,fields:e.sections.flatMap(e=>v(e)),layout:`vertical`,defaultValues:u,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,onSubmit:y,onCancel:x},T=e.tabPosition===`left`||e.tabPosition===`right`;return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(a.Tabs,{value:g,onValueChange:_,orientation:T?`vertical`:`horizontal`,className:(0,a.cn)(T&&`flex gap-4`),children:[(0,c.jsx)(a.TabsList,{className:(0,a.cn)(T?`flex-col h-auto`:``,e.tabPosition===`bottom`&&`order-last`,e.tabPosition===`right`&&`order-last`),children:e.sections.map((e,t)=>(0,c.jsx)(a.TabsTrigger,{value:S(e,t),className:T?`w-full justify-start`:``,children:e.label||`Tab ${t+1}`},S(e,t)))}),(0,c.jsx)(`div`,{className:`flex-1`,children:e.sections.map((t,n)=>(0,c.jsx)(a.TabsContent,{value:S(t,n),className:`mt-0`,children:(0,c.jsx)(b,{description:t.description,columns:1,className:t.className,gridClassName:t.gridClassName,children:(0,c.jsx)(r.SchemaRenderer,{schema:{...C,...B(v(t),t.columns||1),showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1}})})},S(t,n)))})]})})},W=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[l,u]=(0,t.useState)(null),[d,f]=(0,t.useState)({}),[p,m]=(0,t.useState)(!0),[h,g]=(0,t.useState)(null),[_,x]=(0,t.useState)(0),[S,C]=(0,t.useState)(new Set),[T,E]=(0,t.useState)(!1),[D,O]=(0,t.useState)(null),k=t.default.useId(),[A,j]=(0,t.useState)(0),M=t.default.useRef(!1),N=e.sections.length,P=_===0,F=_===N-1;t.default.useEffect(()=>{(async()=>{if(!n){m(!1);return}try{let t=await n.getObjectSchema(e.objectName);u(t)}catch(e){g(e)}})()},[e.objectName,n]),t.default.useEffect(()=>{(l||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){M.current||=(f(e.initialData||e.initialValues||{}),!0),m(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);f(t||{})}catch(e){g(e)}finally{m(!1)}})()},[l,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let I=(0,t.useCallback)(t=>w(t,{objectSchema:l,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[l,e.readOnly,e.mode,e.objectName,o]),L=(0,t.useMemo)(()=>_>=0&&_<N?I(e.sections[_]):[],[_,N,e.sections,I]),R=(0,t.useCallback)(async t=>{let r={...d,...t};if(f(r),C(e=>new Set(e).add(_)),F){E(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(r),r;let t;if(e.mode===`create`?t=await n.create(e.objectName,r):e.mode===`edit`&&e.recordId&&(t=await n.update(e.objectName,e.recordId,r)),e.onSuccess)await e.onSuccess(t);else if(e.submitBehavior){let t=e.submitBehavior;switch(t.kind){case`redirect`:v(t.url)&&setTimeout(()=>window.location.assign(t.url),t.delayMs??0);break;case`continue`:f({}),C(new Set),x(0),j(e=>e+1);break;default:{let n=t.kind===`thank-you`&&t.message?t.message:e.successMessage||(e.mode===`create`?`Created`:`Saved`);a.toast.success(n),O({title:t.kind===`thank-you`?t.title:void 0,message:n});break}}}else{let n=y(e.navigateOnSuccess,t);if(n)return window.location.assign(n),t;a.toast.success(e.successMessage||(e.mode===`create`?`Created`:`Saved`)),e.resetOnSuccess&&e.mode===`create`&&(f({}),C(new Set),x(0),j(e=>e+1))}return t}catch(t){throw e.onError&&e.onError(t),t}finally{E(!1)}}else z(_+1)},[d,_,F,e,n]),z=(0,t.useCallback)(t=>{t>=0&&t<N&&(x(t),e.onStepChange&&e.onStepChange(t))},[N,e]),V=(0,t.useCallback)(()=>{z(_-1)},[_,z]),H=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),U=(0,t.useCallback)(t=>{(e.allowSkip||S.has(t)||t<=_)&&z(t)},[e.allowSkip,S,_,z]);if(h)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:h.message})]});if(p)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(D)return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(`div`,{className:`rounded-md border bg-card p-8 text-center`,children:[(0,c.jsx)(`h3`,{className:`text-lg font-semibold`,children:D.title??`Thanks!`}),D.message&&(0,c.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:D.message})]})});let W=e.sections[_];return(0,c.jsxs)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:[e.showStepIndicator!==!1&&(0,c.jsx)(`nav`,{"aria-label":`Progress`,className:`mb-8`,children:(0,c.jsx)(`ol`,{className:`flex items-center`,children:e.sections.map((t,n)=>{let r=n===_,i=S.has(n),o=e.allowSkip||i||n<=_;return(0,c.jsxs)(`li`,{className:(0,a.cn)(`relative flex-1`,n!==N-1&&`pr-8 sm:pr-12`),children:[n!==N-1&&(0,c.jsx)(`div`,{className:`absolute top-3 sm:top-4 left-6 -right-4 sm:left-10 sm:-right-2 h-0.5`,"aria-hidden":`true`,children:(0,c.jsx)(`div`,{className:(0,a.cn)(`h-full`,i?`bg-primary`:`bg-muted`)})}),(0,c.jsxs)(`button`,{type:`button`,className:(0,a.cn)(`group relative flex items-center`,o?`cursor-pointer`:`cursor-not-allowed`),onClick:()=>U(n),disabled:!o,children:[(0,c.jsx)(`span`,{className:(0,a.cn)(`flex h-6 w-6 sm:h-8 sm:w-8 items-center justify-center rounded-full text-xs sm:text-sm font-medium transition-colors`,i&&`bg-primary text-primary-foreground`,r&&!i&&`border-2 border-primary bg-background text-primary`,!r&&!i&&`border-2 border-muted bg-background text-muted-foreground`),children:i?(0,c.jsx)(s.Check,{className:`h-3 w-3 sm:h-4 sm:w-4`}):n+1}),(0,c.jsx)(`span`,{className:`ml-2 sm:ml-3 text-xs sm:text-sm font-medium hidden sm:block`,children:(0,c.jsx)(`span`,{className:(0,a.cn)(r?`text-foreground`:`text-muted-foreground`),children:t.label||`Step ${n+1}`})})]})]},n)})})}),(0,c.jsx)(`div`,{className:`min-h-[200px]`,children:W&&(0,c.jsx)(b,{label:W.label,description:W.description,columns:1,className:W.className,gridClassName:W.gridClassName,children:L.length>0?(0,c.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,id:k,...B(L,W.columns||1),layout:`vertical`,defaultValues:d,showSubmit:!1,showCancel:!1,onSubmit:R}},A):(0,c.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:`No fields configured for this step`})})}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between mt-6 pt-4 border-t`,children:[(0,c.jsx)(`div`,{children:e.showCancel!==!1&&(0,c.jsx)(a.Button,{variant:`ghost`,onClick:H,children:e.cancelText||`Cancel`})}),(0,c.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,c.jsxs)(`span`,{className:`text-sm text-muted-foreground mr-2`,children:[`Step `,_+1,` of `,N]}),!P&&(0,c.jsxs)(a.Button,{variant:`outline`,onClick:V,children:[(0,c.jsx)(s.ChevronLeft,{className:`h-4 w-4 mr-1`}),e.prevText||`Back`]}),F?(0,c.jsxs)(a.Button,{type:`submit`,form:k,disabled:T||e.mode===`view`,children:[T&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`,"aria-hidden":!0}),T?`Submitting...`:e.submitText||(e.mode===`create`?`Create`:`Update`)]}):(0,c.jsxs)(a.Button,{type:`submit`,form:k,children:[e.nextText||`Next`,(0,c.jsx)(s.ChevronRight,{className:`h-4 w-4 ml-1`})]})]})]})]})},G=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,l]=(0,t.useState)(null),[u,d]=(0,t.useState)({}),[f,p]=(0,t.useState)(!0),[m,h]=(0,t.useState)(null);(0,t.useEffect)(()=>{(async()=>{if(!n){p(!1);return}try{let t=await n.getObjectSchema(e.objectName);l(t)}catch(e){h(e),p(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){d(e.initialData||e.initialValues||{}),p(!1);return}if(!n){d(e.initialData||e.initialValues||{}),p(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);d(t||{})}catch(e){h(e)}finally{p(!1)}})()},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let g=(0,t.useCallback)(t=>w(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[s,e.readOnly,e.mode,e.objectName,o]),_=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;return e.mode===`create`?r=await n.create(e.objectName,t):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,t)),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n]),v=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),y=(0,t.useMemo)(()=>e.sections.slice(0,1),[e.sections]),x=(0,t.useMemo)(()=>e.sections.slice(1),[e.sections]);(0,t.useMemo)(()=>e.sections.flatMap(e=>g(e)),[e.sections,g]);let S=e.splitDirection||`horizontal`,C=e.splitSize||50;if(m)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:m.message})]});if(f)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let T={type:`form`,objectName:e.objectName,layout:`vertical`,defaultValues:u,onSubmit:_,onCancel:v},E=(t,n)=>(0,c.jsx)(`div`,{className:`space-y-6 p-4`,children:t.map((t,i)=>(0,c.jsx)(b,{label:t.label,description:t.description,columns:1,className:t.className,gridClassName:t.gridClassName,children:(0,c.jsx)(r.SchemaRenderer,{schema:{...T,...B(g(t),t.columns||1),showSubmit:n&&e.showSubmit!==!1&&e.mode!==`view`,showCancel:n&&e.showCancel!==!1,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText}})},t.name||t.label||i))});return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(a.ResizablePanelGroup,{orientation:S,className:`min-h-[300px] rounded-lg border`,children:[(0,c.jsx)(a.ResizablePanel,{defaultSize:C,minSize:20,children:E(y,x.length===0)}),x.length>0&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(a.ResizableHandle,{withHandle:e.splitResizable!==!1}),(0,c.jsx)(a.ResizablePanel,{defaultSize:100-C,minSize:20,children:E(x,!0)})]})]})})},K=new Set([`id`,`_id`,`created_at`,`updated_at`,`createdAt`,`updatedAt`,`organization_id`,`organizationId`]),q=new Set([`formula`,`summary`,`rollup`,`lookup_value`,`auto_number`,`autonumber`,`computed`]);function ee(e,t){if(!e||typeof e!=`object`)return e;let n={},r=t?.fields;for(let[t,i]of Object.entries(e))if(!K.has(t)){if(r){let e=r[t];if(!e)continue;let n=String(e.type||``).toLowerCase();if(q.has(n)||e.computed===!0||e.formula||e.readOnly===!0||e.readonly===!0)continue}n[t]=i}return n}var J=e=>e==null?void 0:e.id??e._id??e.recordId,Y=(e,t)=>t?ee(e,t):e,X=new Set([`id`,`_id`,`recordId`]);function Z(e,t){return e?Object.entries(e).every(([e,n])=>e===t||X.has(e)?!0:n==null||n===``):!0}function Q(e,t,n){let r=[{object:e,action:`create`,data:t}];for(let e of n)for(let t of e.rows)Z(t,e.relationshipField)||r.push({object:e.childObject,action:`create`,data:{...Y(t,e.childSchema),[e.relationshipField]:{$ref:0}}});return r}function te(e,t,n,r){let i=[{object:e,action:`update`,id:t,data:n}];for(let e of r){let n=(e.rows||[]).map(n=>({...n,[e.relationshipField]:t})),{toCreate:r,toUpdate:a,toDelete:o}=ne(e.original||[],n);for(let t of r){if(Z(t,e.relationshipField))continue;let{id:n,_id:r,recordId:a,...o}=t;i.push({object:e.childObject,action:`create`,data:Y(o,e.childSchema)})}for(let t of a)i.push({object:e.childObject,action:`update`,id:J(t),data:Y(t,e.childSchema)});for(let t of o)i.push({object:e.childObject,action:`delete`,id:t})}return i}function ne(e,t){let n=new Set(t.map(J).filter(Boolean));return{toCreate:t.filter(e=>!J(e)),toUpdate:t.filter(e=>J(e)),toDelete:(e||[]).map(J).filter(e=>!!e&&!n.has(e))}}function re(e,t){return Array.isArray(e)?e.reduce((e,n)=>{let r=Number(n?.[t]);return e+(Number.isFinite(r)?r:0)},0):0}function ie(e){return Array.isArray(e)?e:e&&Array.isArray(e.records)?e.records:e&&Array.isArray(e.data)?e.data:e&&(e.id||e._id)?[e]:[]}async function ae(e,t,n){return n.length===0?[]:typeof e.bulk==`function`?ie(await e.bulk(t,`create`,n)):ie(await Promise.all(n.map(n=>e.create(t,n))))}async function oe(e,t,n,r){let i=[],a=r.rows.filter(e=>J(e)||!Z(e,r.relationshipField)).map(e=>({...e,[r.relationshipField]:n}));if(r.original!==void 0){let{toCreate:t,toUpdate:n,toDelete:o}=ne(r.original,a),s=await ae(e,r.childObject,t.map(e=>Y(e,r.childSchema)));for(let e of s){let t=J(e);t&&i.push({object:r.childObject,id:t})}await Promise.all(n.map(t=>e.update(r.childObject,J(t),Y(t,r.childSchema)))),await Promise.all(o.map(t=>e.delete(r.childObject,t)))}else{let t=await ae(e,r.childObject,a.map(e=>Y(e,r.childSchema)));for(let e of t){let t=J(e);t&&i.push({object:r.childObject,id:t})}}if(r.totalField){let i=re(r.rows,r.amountField||`amount`);await e.update(t,n,{[r.totalField]:i})}return{created:i}}var se=new Set([`id`,`_id`,`recordId`,`created_at`,`updated_at`,`created_by`,`updated_by`,`createdAt`,`updatedAt`,`createdBy`,`updatedBy`,`organization_id`,`tenant_id`,`space`,`owner`]),$=new Set([`position`,`sort_order`,`sequence`,`line_no`,`line_number`,`sort`]),ce=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`,`file`,`image`,`avatar`,`json`,`object`,`grid`,`table`,`location`,`vector`,`html`,`markdown`,`richtext`]);function le(e){switch(e){case`number`:case`percent`:case`rating`:case`slider`:return`number`;case`currency`:return`currency`;case`date`:case`datetime`:case`time`:return`date`;case`select`:case`picklist`:case`radio`:case`boolean`:case`toggle`:return`select`;case`lookup`:case`master_detail`:return`lookup`;default:return`text`}}function ue(e){if(e?.type===`boolean`||e?.type===`toggle`)return[{label:`Yes`,value:`true`},{label:`No`,value:`false`}];let t=e?.options;if(Array.isArray(t))return t.map(e=>typeof e==`object`&&e?{label:String(e.label??e.value),value:String(e.value)}:{label:String(e),value:String(e)})}function de(e,t){let n=e?.fields;if(!n||typeof n!=`object`)return;let r;for(let[e,i]of Object.entries(n)){let n=i;if(n?.reference===t){if(n?.type===`master_detail`)return e;n?.type===`lookup`&&!r&&(r=e)}}return r}var fe=[`name`,`title`,`subject`,`label`,`full_name`,`display_name`,`code`],pe={select:0,currency:1,number:1,lookup:2,date:3,text:4};function me(e,t){if(t<=0||e.length<=t)return e;let n=new Set,r=e.find(e=>fe.includes(e.field))??e[0];r&&n.add(r.field);for(let t of e)t.required&&n.add(t.field);let i=e.map((e,t)=>({c:e,i:t})).filter(({c:e})=>!n.has(e.field)).sort((e,t)=>(pe[e.c.type]??5)-(pe[t.c.type]??5)||e.i-t.i);for(let{c:e}of i){if(n.size>=t)break;n.add(e.field)}return e.map(e=>n.has(e.field)?e:{...e,defaultHidden:!0})}function he(e,t={}){let n=e?.fields;if(!n||typeof n!=`object`)return[];let r=new Set([...t.exclude??[],...t.relationshipField?[t.relationshipField]:[]]),i=[];for(let[e,t]of Object.entries(n)){let n=t;if(se.has(e)||r.has(e)||$.has(e)||n?.system||n?.readonly||n?.hidden||ce.has(n?.type))continue;let a={field:e,label:n?.label||e,type:le(n?.type),required:!!n?.required},o=ue(n);a.type===`select`&&o&&(a.options=o),a.type===`lookup`&&(a.reference=n?.reference,a.displayField=n?.display_field||n?.reference_field),n?.readonlyWhen&&(a.readonlyWhen=n.readonlyWhen),(n?.requiredWhen??n?.conditionalRequired)&&(a.requiredWhen=n.requiredWhen??n.conditionalRequired);let s=typeof n?.expression==`string`?n.expression:n?.expression?.source;s&&typeof s==`string`&&(a.computed=!0,a.expr=s,a.required=!1,typeof n?.scale==`number`&&(a.scale=n.scale)),i.push(a)}return me(i,t.maxColumns??6)}function ge(e,t){let n=e??[],r=t?.fields;return!n.length||!r||typeof r!=`object`?n:n.map(e=>{if(e.type)return e;let t=r[e.field];if(!t)return e;let n=le(t?.type),i={...e,type:n};i.label??=t?.label||e.field,i.required??=!!t?.required;let a=ue(t);n===`select`&&a&&!i.options&&(i.options=a),n===`lookup`&&(i.reference??=t?.reference,i.displayField??=t?.display_field||t?.reference_field),i.readonlyWhen==null&&t?.readonlyWhen&&(i.readonlyWhen=t.readonlyWhen),i.requiredWhen==null&&(t?.requiredWhen??t?.conditionalRequired)&&(i.requiredWhen=t.requiredWhen??t.conditionalRequired);let o=typeof t?.expression==`string`?t.expression:t?.expression?.source;return!i.computed&&o&&typeof o==`string`&&(i.computed=!0,i.expr=o,i.required=!1,typeof t?.scale==`number`&&(i.scale=t.scale)),i})}var _e=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`]);function ve(e,t={}){let n=e?.fields;if(!n||typeof n!=`object`)return[];let r=new Set([...t.exclude??[],...t.relationshipField?[t.relationshipField]:[]]),i=[];for(let[e,t]of Object.entries(n)){let n=t;se.has(e)||r.has(e)||$.has(e)||n?.system||n?.hidden||_e.has(n?.type)||i.push(e)}return i}var ye=new Set([`textarea`,`richtext`,`html`,`markdown`,`rich-text`,`file`,`image`,`avatar`,`attachment`,`json`,`location`,`address`]);function be(e,t,n={}){if(t===`grid`||t===`form`)return t;let r=e?.fields??{},i=ve(e,{relationshipField:n.relationshipField});return i.some(e=>ye.has(r[e]?.type))||i.length>8?`form`:`grid`}var xe=[`amount`,`total`,`subtotal`,`line_total`,`line_amount`,`net_amount`];function Se(e){let t=e.filter(e=>e.type===`number`||e.type===`currency`);if(t.length===0)return;let n=t.find(e=>e.computed);if(n)return n.field;let r=t.find(e=>xe.includes(e.field));if(r)return r.field;let i=[...t].reverse().find(e=>e.type===`currency`);return i?i.field:t[t.length-1].field}function Ce(e,t,n,r={}){let i=r.relationshipField||de(t,n);if(!i)throw Error(`MasterDetailForm: could not find a lookup/master_detail field on "${e}" referencing "${n}". Set relationshipField explicitly.`);let a=r.columns?.length?ge(r.columns,t):he(t,{relationshipField:i}),o=r.amountField||Se(a);return{childObject:e,relationshipField:i,columns:a,formFields:ve(t,{relationshipField:i}),mode:be(t,r.inlineEdit??(t?.fields)?.[i]?.inlineEdit,{relationshipField:i}),amountField:o,sortField:Object.keys(t?.fields??{}).find(e=>$.has(e))}}function we(e){if(!e)return{};let t={};return e.querySelectorAll(`[name]`).forEach(e=>{let n=e.getAttribute(`name`);if(n){if(e.tagName===`INPUT`){let r=e;if(r.type===`checkbox`){t[n]=r.checked;return}if(r.type===`radio`){r.checked&&(t[n]=r.value);return}if(r.type===`number`||r.type===`range`){if(r.value===``){t[n]=null;return}let e=Number(r.value);t[n]=Number.isFinite(e)?e:r.value;return}t[n]=r.value;return}t[n]=e.value}}),t}var Te=({details:e,state:n,setRows:r,formHostRef:a,taxRateField:o,formKey:s,onRowExpand:l,onAddViaForm:u})=>{let[d,f]=(0,t.useState)({}),p=(0,t.useRef)(``);(0,t.useEffect)(()=>{let e=a.current;if(!e)return;let t=()=>{let t=we(e),n;try{n=JSON.stringify(t)}catch{n=String(Math.random())}n!==p.current&&(p.current=n,f(t))};t();let n=()=>t();e.addEventListener(`input`,n),e.addEventListener(`change`,n);let r=[120,360,800].map(e=>setTimeout(t,e));return()=>{e.removeEventListener(`input`,n),e.removeEventListener(`change`,n),r.forEach(clearTimeout)}},[a,s,e.length]);let m=d[o],h=m===void 0?null:Number.isFinite(Number(m))?Number(m):0,g=e.reduce((e,t,r)=>e+re(n[r]?.rows??[],t.amountField||`amount`),0),_=h!==null&&e.some(e=>!!e.amountField),v=h??0,y=v/100*g,b=g+y,x=e=>`¥${e.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2})}`;return(0,c.jsxs)(c.Fragment,{children:[e.map((e,t)=>(0,c.jsxs)(`section`,{className:`space-y-2`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium text-foreground`,children:e.title||`Line Items`}),e.columns?.length?(0,c.jsx)(i.LineItemsField,{value:n[t]?.rows??[],onChange:e=>r(t,e),contextRecord:d,...e.inlineMode===`form`||(e.formFields?.length??0)>(e.columns?.length??0)?{onRowExpand:e=>l(t,e)}:{},displayMode:e.inlineMode===`form`?`list`:`grid`,...e.inlineMode===`form`?{onAdd:()=>u(t)}:{},field:{columns:e.columns,total_field:_?void 0:e.amountField||(e.totalField?`amount`:void 0),sort_field:e.sortField,min_rows:e.minRows,max_rows:e.maxRows,add_label:e.inlineMode===`form`?e.addLabel||`Add`:e.addLabel}}):(0,c.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,children:`Loading columns…`})]},`${e.childObject}-${t}`)),_&&(0,c.jsx)(`div`,{className:`flex justify-end`,children:(0,c.jsxs)(`dl`,{className:`w-64 space-y-1.5 text-sm`,"data-testid":`md-totals`,children:[(0,c.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,c.jsx)(`dt`,{className:`text-muted-foreground`,children:`Subtotal`}),(0,c.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-subtotal`,children:x(g)})]}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,c.jsxs)(`dt`,{className:`text-muted-foreground`,children:[`Tax (`,v,`%)`]}),(0,c.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-tax`,children:x(y)})]}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between border-t border-border pt-1.5 text-base font-semibold`,children:[(0,c.jsx)(`dt`,{children:`Total`}),(0,c.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-grand-total`,children:x(b)})]})]})})]})},Ee=({schema:e,dataSource:n,className:r})=>{let i=e.details||[],o=e.mode===`edit`&&!!e.recordId,s=i.some(e=>!e.relationshipField||!e.columns?.length||e.columns.some(e=>!e.type)),[l,u]=(0,t.useState)(s?null:i),d=l??i;(0,t.useEffect)(()=>{if(!s){u(i);return}if(!n||typeof n.getObjectSchema!=`function`)return;let t=!1;return(async()=>{let r=await Promise.all(i.map(async t=>{let r=t.columns?.length?t.columns.every(e=>!!e.type):!1;if(t.relationshipField&&r)return t;try{let r=await n.getObjectSchema(t.childObject);if(t.relationshipField&&t.columns?.length)return{...t,columns:ge(t.columns,r)};let i=Ce(t.childObject,r,e.objectName,{relationshipField:t.relationshipField,columns:t.columns,amountField:t.amountField});return{...t,relationshipField:i.relationshipField,columns:i.columns,formFields:t.formFields??i.formFields,inlineMode:t.inlineMode??i.mode,amountField:t.amountField??i.amountField,sortField:t.sortField??i.sortField}}catch{return t}}));t||u(r)})(),()=>{t=!0}},[n,e.objectName,e.details]);let[f,p]=(0,t.useState)(()=>i.map(()=>({rows:[],original:[]}))),m=(0,t.useRef)(f);m.current=f;let h=(0,t.useRef)({});(0,t.useEffect)(()=>{let e=n;if(!e||typeof e.getObjectSchema!=`function`)return;let t=!1,r=Array.from(new Set(i.map(e=>e.childObject).filter(Boolean)));return(async()=>{let n=await Promise.all(r.map(async t=>{try{return[t,await e.getObjectSchema(t)]}catch{return[t,null]}}));if(t)return;let i={};for(let[e,t]of n)t&&(i[e]=t);h.current=i})(),()=>{t=!0}},[n,e.objectName,e.details]);let[g,_]=(0,t.useState)(0),[v,y]=(0,t.useState)(!1),b=(0,t.useRef)(!1),x=(0,t.useRef)(null),S=(0,t.useCallback)(()=>{b.current=!1,y(!1),x.current&&=(clearTimeout(x.current),null)},[]);(0,t.useEffect)(()=>{let t=!1;if(!(!o||!n))return(async()=>{let r=await Promise.all(d.map(async t=>{if(!t.relationshipField)return{rows:[],original:[]};try{let r=(await n.find(t.childObject,{$filter:{[t.relationshipField]:e.recordId},$top:500}))?.data??[];return{rows:r.map(e=>({...e})),original:r.map(e=>({...e}))}}catch{return{rows:[],original:[]}}}));t||p(r)})(),()=>{t=!0}},[o,n,e.recordId,l]);let C=(0,t.useCallback)((e,t)=>{p(n=>n.map((n,r)=>r===e?{...n,rows:t}:n))},[]),w=e.taxRateField||`tax_rate`,[T,E]=(0,t.useState)(null),D=T?f[T.detailIdx]?.rows?.[T.rowIdx]:void 0,O=T?d[T.detailIdx]:void 0,k=(0,t.useCallback)((e,t,n)=>{p(r=>r.map((r,i)=>i===e?{...r,rows:r.rows.map((e,r)=>r===t?{...e,...n}:e)}:r))},[]),A=(0,t.useCallback)(e=>{p(t=>{let n=t.map((t,n)=>n===e?{...t,rows:[...t.rows,{}]}:t),r=n[e].rows.length-1;return E({detailIdx:e,rowIdx:r,isNew:!0}),n})},[]),j=(0,t.useCallback)(()=>{E(e=>(e?.isNew&&p(t=>t.map((t,n)=>n===e.detailIdx?{...t,rows:t.rows.filter((t,n)=>n!==e.rowIdx)}:t)),null))},[]),M=(0,t.useCallback)(async t=>{S(),e.onSuccess||a.toast.success(o?e.title?`${e.title} saved`:`Saved`:`Created`),o||(p(d.map(()=>({rows:[],original:[]}))),_(e=>e+1)),await e.onSuccess?.(t)},[o,e.onSuccess,e.title,d.length,S]),N=(0,t.useCallback)(t=>{S(),a.toast.error(t?.message||`Save failed`),e.onError?.(t)},[e,S]),P=(0,t.useCallback)(async t=>{let r=[];for(let i=0;i<d.length;i++){let a=d[i],{rows:s,original:c}=m.current[i];if(!a.relationshipField)continue;let{created:l}=await oe(n,e.objectName,t,{childObject:a.childObject,relationshipField:a.relationshipField,rows:s,original:o?c:void 0,amountField:a.amountField,totalField:a.totalField,childSchema:h.current[a.childObject]});r.push(...l)}return r},[d,o,n,e.objectName]),F=(0,t.useCallback)(async t=>{let r=J(t)??e.recordId;if(!r)throw Error(`MasterDetailForm: parent record has no id after save`);if(!n)throw Error(`MasterDetailForm: dataSource is required`);let i=[];try{i=await P(r)}catch(t){throw o||await Promise.allSettled([...i.map(e=>n.delete(e.object,e.id)),n.delete(e.objectName,r)]),t}await M(t)},[n,o,P,e,M]),I=typeof n?.batchTransaction==`function`,L=(0,t.useCallback)(async t=>{let r=n,i={...t};d.forEach((e,t)=>{e.totalField&&(i[e.totalField]=re(m.current[t]?.rows??[],e.amountField||`amount`))});let a=o?te(e.objectName,e.recordId,i,d.filter(e=>e.relationshipField).map((e,t)=>({childObject:e.childObject,relationshipField:e.relationshipField,rows:m.current[t]?.rows??[],original:m.current[t]?.original??[],childSchema:h.current[e.childObject]}))):Q(e.objectName,i,d.filter(e=>e.relationshipField).map((e,t)=>({childObject:e.childObject,relationshipField:e.relationshipField,rows:m.current[t]?.rows??[],childSchema:h.current[e.childObject]})));return(await r.batchTransaction(a))?.results?.[0]??{...i,id:e.recordId}},[n,d,e.objectName,e.recordId,o]),R=(0,t.useMemo)(()=>({type:`object-form`,objectName:e.objectName,mode:e.mode??`create`,recordId:e.recordId,initialValues:e.initialValues,initialData:e.initialData,formType:e.formType,sections:e.sections,fields:e.fields,title:e.title,showSubmit:!1,showCancel:!1,...I?{submitHandler:L,onSuccess:M}:{onSuccess:F},onError:N}),[e,F,I,L,M,N]),z=(0,t.useRef)(null),B=e.submitText??(o?`Save`:`Create`),V=(0,t.useCallback)(()=>{b.current||z.current?.querySelector(`form`)&&(b.current=!0,y(!0),setTimeout(()=>{(z.current?.querySelector(`form`))?.requestSubmit()},0),x.current=setTimeout(()=>S(),1500))},[S]);return(0,t.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]),(0,c.jsxs)(`div`,{className:(0,a.cn)(`space-y-6`,r,e.className),children:[(0,c.jsx)(`div`,{ref:z,children:(0,c.jsx)(Pe,{schema:R,dataSource:n},g)}),(0,c.jsx)(Te,{details:d,state:f,setRows:C,formHostRef:z,taxRateField:w,formKey:g,onRowExpand:(e,t)=>E({detailIdx:e,rowIdx:t}),onAddViaForm:A}),T&&O&&(0,c.jsxs)(a.Card,{className:`border-primary/40 shadow-none ring-1 ring-primary/10`,"data-testid":`md-row-form`,children:[(0,c.jsxs)(a.CardHeader,{className:`pb-2 flex flex-row items-center justify-between gap-2 space-y-0`,children:[(0,c.jsxs)(a.CardTitle,{className:`text-sm font-medium`,children:[O.title||`Line item`,` — row `,T.rowIdx+1]}),(0,c.jsx)(a.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs text-muted-foreground`,onClick:j,children:`Close`})]}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(Pe,{schema:{type:`object-form`,objectName:O.childObject,mode:`edit`,initialData:D??{},...O.formFields?.length?{fields:O.formFields}:{},submitText:`Apply`,submitHandler:async e=>e,onSuccess:e=>{k(T.detailIdx,T.rowIdx,e),E(null)},onCancel:j},dataSource:n},`row-${T.detailIdx}-${T.rowIdx}`)})]}),e.showSubmit!==!1&&(0,c.jsxs)(`div`,{className:`flex items-center justify-end gap-2 border-t border-border pt-4`,children:[e.onCancel&&(0,c.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:e.onCancel,disabled:v,"data-testid":`md-form-cancel`,children:e.cancelText??`Cancel`}),(0,c.jsx)(a.Button,{type:`button`,onClick:V,disabled:v||s&&!l,"data-testid":`md-form-submit`,children:v?`Saving…`:B})]})]})},De={1:void 0,2:`grid gap-4 grid-cols-1 @md:grid-cols-2`,3:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3`,4:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3 @4xl:grid-cols-4`},Oe=(0,l.createSafeTranslation)({"form.discardTitle":`Discard changes?`,"form.discardMessage":`You have unsaved changes. If you close this form now, your edits will be lost.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`},`form.discardTitle`),ke=({schema:e,dataSource:n,className:o})=>{let{fieldLabel:l}=(0,r.useSafeFieldLabel)(),{t:u}=Oe(),d=(0,r.usePreviewMode)(),[f,p]=(0,t.useState)(null),[m,h]=(0,t.useState)([]),[g,_]=(0,t.useState)({}),[v,y]=(0,t.useState)(!0),[b,x]=(0,t.useState)(null),[S,C]=(0,t.useState)(!1),[T,E]=(0,t.useState)(!1),[D,O]=(0,t.useState)(!1),k=(0,t.useRef)(!1),A=e.confirmOnDiscard!==!1,j=e.open!==!1,M=e.drawerSide||`right`,N=(0,t.useId)(),[P,F]=(0,t.useState)(()=>{let t={};return e.sections?.forEach((e,n)=>{let r=e.name||String(n);e.collapsed&&(t[r]=!0)}),t});(0,t.useEffect)(()=>{(async()=>{if(!n){y(!1);return}try{let t=await n.getObjectSchema(e.objectName);p(t)}catch(e){x(e),y(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(f||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){_(e.initialData||e.initialValues||{}),y(!1);return}if(!n){_(e.initialData||e.initialValues||{}),y(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);_(t||{})}catch(e){x(e)}finally{y(!1)}})()},[f,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let I=(0,t.useCallback)(t=>w(t,{objectSchema:f,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:l}),[f,e.readOnly,e.mode,e.objectName,l]);(0,t.useEffect)(()=>{if(!f&&n)return;if(e.customFields?.length){h(e.customFields),y(!1);return}if(e.sections?.length){y(!1);return}if(!f)return;let t=e.fields||Object.keys(f.fields||{}),r=[];for(let n of t){let t=typeof n==`string`?n:n.name;if(!t)continue;let a=f.fields?.[t];a&&r.push({name:t,label:l(e.objectName,t,a.label||t),type:(0,i.mapFieldTypeToFormType)(a.type),required:a.required||!1,disabled:e.readOnly||e.mode===`view`||a.readonly,placeholder:a.placeholder,description:a.help||a.description,validation:(0,i.buildValidationRules)(a),field:a,options:a.options,multiple:a.multiple})}h(r),y(!1)},[f,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let L=(0,t.useCallback)(async t=>{O(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=ee(t,f);return e.mode===`create`?r=await n.create(e.objectName,i):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,i)),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{O(!1)}},[e,n,f]),R=(0,t.useCallback)(()=>{E(!1),k.current&&(k.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),z=(0,t.useCallback)(e=>{k.current=e,A&&S?E(!0):R()},[A,S,R]),B=(0,t.useCallback)(()=>{k.current=!0,R()},[R]),V=(0,t.useMemo)(()=>{if(e.drawerWidth)return M===`left`||M===`right`?{width:e.drawerWidth,maxWidth:e.drawerWidth}:{height:e.drawerWidth,maxHeight:e.drawerWidth}},[e.drawerWidth,M]),U=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,W=e.showSubmit!==!1&&e.mode!==`view`,G=e.showCancel!==!1,K=e.submitText||(e.mode===`create`?`Create`:`Update`),q=e.cancelText||`Cancel`,J={type:`form`,objectName:e.objectName,layout:U,defaultValues:g,submitLabel:K,cancelLabel:q,showSubmit:W,showCancel:G,onSubmit:L,onCancel:B,onDirtyChange:C,showActions:!1,id:N},Y=()=>{if(b)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:b.message})]});if(v)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(e.sections?.length){let t=[];return e.sections.forEach((e,n)=>{let r=e.name||String(n),i=P[r]??e.collapsed??!1;t.push({name:`__section_${r}`,label:e.label||``,type:`section-divider`,colSpan:4,collapsible:e.collapsible,collapsed:i,onToggle:e.collapsible?()=>F(e=>({...e,[r]:!i})):void 0,className:e.className});let a=I(e);i?t.push(...a.map(e=>({...e,hidden:!0}))):t.push(...a)}),(0,c.jsx)(r.SchemaRenderer,{schema:{...J,fields:t}})}let t=H(m,f,e.columns,e.mode),n=De[t.columns||1];return(0,c.jsx)(r.SchemaRenderer,{schema:{...J,fields:t.fields,columns:t.columns,...n?{fieldContainerClass:n}:{}}})},X=e.subforms,Z=X?.length&&e.mode!==`view`?(0,c.jsx)(Ee,{schema:{type:`object-master-detail-form`,objectName:e.objectName,mode:e.mode===`edit`?`edit`:`create`,recordId:e.recordId,fields:e.fields,sections:e.sections,submitText:e.submitText,cancelText:q,details:X,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n}):Y();return d?(0,c.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,c.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,c.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),Z]}):(0,c.jsx)(a.Sheet,{open:j,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}z(!1)},children:(0,c.jsxs)(a.SheetContent,{side:M,className:(0,a.cn)(`overflow-y-auto`,o,e.className),style:V,children:[(e.title||e.description)&&(0,c.jsxs)(a.SheetHeader,{children:[e.title&&(0,c.jsx)(a.SheetTitle,{children:e.title}),e.description?(0,c.jsx)(a.SheetDescription,{children:e.description}):(0,c.jsx)(a.SheetDescription,{className:`sr-only`,children:`Complete the form fields, then submit or cancel.`})]}),(0,c.jsx)(`div`,{className:`@container py-4`,children:Z}),!b&&!v&&!(X?.length&&e.mode!==`view`)&&(W||G)&&(0,c.jsx)(`div`,{className:`shrink-0 border-t px-4 py-3 bg-background`,"data-testid":`drawer-form-footer`,children:(0,c.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[G&&(0,c.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:B,disabled:D,className:`w-full sm:w-auto`,children:q}),W&&(0,c.jsxs)(a.Button,{type:`submit`,form:N,disabled:D,className:`w-full sm:w-auto`,children:[D&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),K]})]})}),(0,c.jsx)(a.AlertDialog,{open:T,onOpenChange:E,children:(0,c.jsxs)(a.AlertDialogContent,{children:[(0,c.jsxs)(a.AlertDialogHeader,{children:[(0,c.jsx)(a.AlertDialogTitle,{children:u(`form.discardTitle`)}),(0,c.jsx)(a.AlertDialogDescription,{children:u(`form.discardMessage`)})]}),(0,c.jsxs)(a.AlertDialogFooter,{children:[(0,c.jsx)(a.AlertDialogCancel,{onClick:()=>{k.current=!1},children:u(`form.keepEditing`)}),(0,c.jsx)(a.AlertDialogAction,{onClick:R,children:u(`form.discard`)})]})]})})]})})};function Ae(e,t){let n=(0,u.deriveFieldGroupLayout)({fieldGroups:t,fields:Object.fromEntries(e.map(e=>[e.name,{group:e.group}]))});if(!n)return null;let r=new Set(n.flatMap(e=>e.fields)),i=e.map(e=>e.name).filter(e=>!r.has(e)),a=n.map(e=>({...e.key===void 0?{}:{name:e.key},...e.key===void 0?{}:{label:e.label??e.key},fields:[...e.fields],...e.collapse===`none`?{}:{collapsible:!0},...e.collapse===`collapsed`?{collapsed:!0}:{}}));if(i.length>0){let e=a[a.length-1];e&&e.name===void 0?e.fields=[...e.fields??[],...i]:a.push({fields:i})}return a}var je=(0,l.createSafeTranslation)({"form.discardTitle":`Discard changes?`,"form.discardMessage":`You have unsaved changes. If you close this form now, your edits will be lost.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`},`form.discardTitle`),Me={sm:`sm:max-w-sm`,default:`sm:max-w-lg`,lg:`sm:max-w-2xl`,xl:`sm:max-w-5xl`,full:`sm:max-w-[95vw] sm:w-full`},Ne=({schema:e,dataSource:n,className:l})=>{let{fieldLabel:u,sectionLabel:d}=(0,r.useSafeFieldLabel)(),{t:f}=je(),p=(0,r.usePreviewMode)(),m=(0,o.usePermissions)(),h=(0,t.useCallback)(t=>{if(!m?.isLoaded)return t;let n=[];for(let r of t){if(!r?.name){n.push(r);continue}m.checkField(e.objectName,r.name,`read`)&&(!m.checkField(e.objectName,r.name,`write`)&&e.mode!==`view`?n.push({...r,readOnly:!0,disabled:!0}):n.push(r))}return n},[m,e.objectName,e.mode]),[g,_]=(0,t.useState)(null),[v,y]=(0,t.useState)([]),[x,S]=(0,t.useState)({}),[C,T]=(0,t.useState)(!0),[E,D]=(0,t.useState)(null),[O,k]=(0,t.useState)(!1),[j,M]=(0,t.useState)(!1),[P,I]=(0,t.useState)(!1),z=(0,t.useRef)(!1),U=e.confirmOnDiscard!==!1,W=e.open!==!1,G=(0,t.useId)(),K=(0,t.useMemo)(()=>{if(e.sections?.length||e.customFields?.length)return null;let t=F(v,g);e.mode===`create`&&(t=L(t,g));let n=Ae(t,g?.fieldGroups);if(!n)return null;let r=e.columns&&e.columns>0?Math.min(Math.floor(e.columns),4):A(t.length);return n.map(e=>({...e,columns:r}))},[e.sections,e.customFields,e.columns,e.mode,v,g]),q=e.sections?.length?e.sections:K??void 0,J=(0,t.useMemo)(()=>q?.length||e.customFields?.length?null:H(v,g,e.columns,e.mode),[v,g,e.columns,e.mode,q,e.customFields]),Y=Me[(0,t.useMemo)(()=>{if(e.modalSize)return e.modalSize;if(J?.columns&&J.columns>1)return V(J.columns);if(q?.length){let e=Math.max(...q.map(e=>Number(e.columns)||1));if(e>1)return V(e)}return`default`},[e.modalSize,J,q])]||Me.default;(0,t.useEffect)(()=>{(async()=>{if(!n){T(!1);return}try{let t=await n.getObjectSchema(e.objectName);_(t)}catch(e){D(e),T(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(g||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){S(e.initialData||e.initialValues||{}),T(!1);return}if(!n){S(e.initialData||e.initialValues||{}),T(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);S(t||{})}catch(e){D(e)}finally{T(!1)}})()},[g,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let X=(0,t.useCallback)(t=>w(t,{objectSchema:g,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:u}),[g,e.readOnly,e.mode,e.objectName,u]);(0,t.useEffect)(()=>{if(!g&&n)return;if(e.customFields?.length){y(e.customFields),T(!1);return}if(e.sections?.length){T(!1);return}if(!g)return;let t=e.fields||Object.keys(g.fields||{}),r=[];for(let n of t){let t=typeof n==`string`?n:n.name;if(!t)continue;let a=g.fields?.[t];a&&r.push({name:t,label:u(e.objectName,t,a.label||t),type:(0,i.mapFieldTypeToFormType)(a.type),required:a.required||!1,disabled:e.readOnly||e.mode===`view`||a.readonly,placeholder:a.placeholder,description:a.help||a.description,validation:(0,i.buildValidationRules)(a),field:a,options:a.options,multiple:a.multiple,visibleWhen:a.visibleWhen,readonlyWhen:a.readonlyWhen,requiredWhen:a.requiredWhen??a.conditionalRequired,group:a.group})}y(r),T(!1)},[g,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let Z=(0,t.useCallback)(async t=>{k(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=ee(t,g);if(m?.isLoaded){let t={};for(let n of Object.keys(i))m.checkField(e.objectName,n,`write`)&&(t[n]=i[n]);i=t}return e.mode===`create`?r=await n.create(e.objectName,i):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,i)),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{k(!1)}},[e,n,g,m]),Q=(0,t.useCallback)(()=>{I(!1),z.current&&(z.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),te=(0,t.useCallback)(e=>{z.current=e,U&&j?I(!0):Q()},[U,j,Q]),ne=(0,t.useCallback)(()=>{z.current=!0,Q()},[Q]),re=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,ie=e.showSubmit!==!1&&e.mode!==`view`,ae=e.showCancel!==!1,oe=e.submitText||(e.mode===`create`?`Create`:`Update`),se=e.cancelText||`Cancel`,$={type:`form`,objectName:e.objectName,layout:re,defaultValues:x,submitLabel:oe,cancelLabel:se,showSubmit:ie,showCancel:ae,onSubmit:Z,onCancel:ne,onDirtyChange:M,showActions:!1,id:G},ce=()=>{if(E)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:E.message})]});if(C)return(0,c.jsx)(`div`,{className:`space-y-4`,"data-testid":`modal-form-skeleton`,children:[1,2,3].map(e=>(0,c.jsxs)(`div`,{className:`space-y-2`,children:[(0,c.jsx)(a.Skeleton,{className:`h-4 w-24`}),(0,c.jsx)(a.Skeleton,{className:`h-10 w-full`})]},e))});if(e.sections?.length){let t=e.sections,n=(e,t)=>e.name||e.label||String(t),i=t=>t.name?d(e.objectName,t.name,t.label||t.name):t.label,o=e=>(0,c.jsx)(r.SchemaRenderer,{schema:{...$,...B(h(X(e)),e.columns||1)}});return e.contentLayout===`tabbed`&&t.length>1?(0,c.jsxs)(a.Tabs,{defaultValue:n(t[0],0),className:`w-full`,children:[(0,c.jsx)(a.TabsList,{className:`mb-4`,children:t.map((e,t)=>(0,c.jsx)(a.TabsTrigger,{value:n(e,t),children:i(e)||`Section ${t+1}`},n(e,t)))}),t.map((e,t)=>(0,c.jsx)(a.TabsContent,{value:n(e,t),children:(0,c.jsx)(b,{description:e.description,columns:1,className:e.className,gridClassName:e.gridClassName,children:o(e)})},n(e,t)))]}):(0,c.jsx)(`div`,{className:`space-y-6`,children:t.map((e,t)=>(0,c.jsx)(b,{label:i(e),description:e.description,columns:1,className:e.className,gridClassName:e.gridClassName,children:o(e)},n(e,t)))})}if(K?.length){let t=Number(K[0]?.columns)||1,n=[];K.forEach((r,i)=>{let a=h(X(r));if(!a.length)return;let o=r.name?d(e.objectName,r.name,r.label||r.name):r.label;o&&n.push({name:`__section_${r.name||i}`,label:o,type:`section-divider`}),n.push(...t>1?N(a,t):a)});let i=R[t];return(0,c.jsx)(r.SchemaRenderer,{schema:{...$,fields:n,columns:t,...i?{fieldContainerClass:i}:{}}})}let t=J??H(v,g,e.columns,e.mode),n=R[t.columns||1];return(0,c.jsx)(r.SchemaRenderer,{schema:{...$,fields:h(t.fields),columns:t.columns,...n?{fieldContainerClass:n}:{}}})},le=e.subforms;if(p)return(0,c.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,c.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,c.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),ce()]});if(le?.length&&e.mode!==`view`)return(0,c.jsx)(a.Dialog,{open:W,onOpenChange:e.onOpenChange,children:(0,c.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(Y,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,l,e.className),children:[(e.title||e.description)&&(0,c.jsxs)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,c.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,c.jsx)(a.DialogDescription,{children:e.description}):(0,c.jsx)(a.DialogDescription,{className:`sr-only`,children:`Enter the record and its line items, then save.`})]}),(0,c.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:(0,c.jsx)(Ee,{schema:{type:`object-master-detail-form`,objectName:e.objectName,mode:e.mode===`edit`?`edit`:`create`,recordId:e.recordId,fields:e.fields,sections:e.sections,initialValues:e.initialValues,initialData:e.initialData,submitText:oe,cancelText:se,details:le,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n})})]})});let ue=!C&&!E&&(ie||ae);return(0,c.jsx)(a.Dialog,{open:W,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}te(!1)},children:(0,c.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(Y,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,l,e.className),children:[(e.title||e.description)&&(0,c.jsxs)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,c.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,c.jsx)(a.DialogDescription,{children:e.description}):(0,c.jsx)(a.DialogDescription,{className:`sr-only`,children:`Complete the form fields, then submit or cancel.`})]}),(0,c.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:ce()}),ue&&(0,c.jsx)(`div`,{className:`shrink-0 border-t px-4 sm:px-6 py-3 bg-background`,"data-testid":`modal-form-footer`,children:(0,c.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[ae&&(0,c.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:ne,disabled:O,className:`w-full sm:w-auto`,children:se}),ie&&(0,c.jsxs)(a.Button,{type:`submit`,form:G,disabled:O,className:`w-full sm:w-auto`,children:[O&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),oe]})]})}),(0,c.jsx)(a.AlertDialog,{open:P,onOpenChange:I,children:(0,c.jsxs)(a.AlertDialogContent,{children:[(0,c.jsxs)(a.AlertDialogHeader,{children:[(0,c.jsx)(a.AlertDialogTitle,{children:f(`form.discardTitle`)}),(0,c.jsx)(a.AlertDialogDescription,{children:f(`form.discardMessage`)})]}),(0,c.jsxs)(a.AlertDialogFooter,{children:[(0,c.jsx)(a.AlertDialogCancel,{onClick:()=>{z.current=!1},children:f(`form.keepEditing`)}),(0,c.jsx)(a.AlertDialogAction,{onClick:Q,children:f(`form.discard`)})]})]})})]})})},Pe=({schema:e,dataSource:n})=>{let i=(0,o.usePermissions)(),a=(0,t.useMemo)(()=>{if(!i?.isLoaded)return e;let t=t=>t?.name?i.checkField(e.objectName,t.name,`read`)?!i.checkField(e.objectName,t.name,`write`)&&e.mode!==`view`?{...t,readOnly:!0,disabled:!0}:t:null:t,n=e=>Array.isArray(e)?e.map(t).filter(Boolean):e;return{...e,fields:n(e.fields),sections:e.sections?.map(e=>({...e,fields:n(e.fields)}))}},[e,i]),{sectionLabel:s}=(0,r.useSafeFieldLabel)(),l=e=>e?.name?s(a.objectName,e.name,e.label||e.name):e?.label;if(a.subforms?.length&&a.mode!==`view`&&a.formType!==`drawer`&&a.formType!==`modal`)return(0,c.jsx)(Ee,{schema:{type:`object-master-detail-form`,objectName:a.objectName,mode:a.mode===`edit`?`edit`:`create`,recordId:a.recordId,initialValues:a.initialValues,initialData:a.initialData,formType:a.formType===`tabbed`?`tabbed`:`simple`,sections:a.sections,fields:a.fields,title:a.title,submitText:a.submitText,cancelText:a.cancelText,showSubmit:a.showSubmit,details:a.subforms,onSuccess:a.onSuccess,onError:a.onError,onCancel:a.onCancel,className:a.className},dataSource:n});if(a.formType===`tabbed`&&a.sections?.length)return(0,c.jsx)(U,{schema:{...a,formType:`tabbed`,sections:a.sections.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),defaultTab:a.defaultTab,tabPosition:a.tabPosition},dataSource:n,className:a.className});if(a.formType===`wizard`&&a.sections?.length)return(0,c.jsx)(W,{schema:{...a,formType:`wizard`,sections:a.sections.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),allowSkip:a.allowSkip,showStepIndicator:a.showStepIndicator,nextText:a.nextText,prevText:a.prevText,onStepChange:a.onStepChange},dataSource:n,className:a.className});if(a.formType===`split`&&a.sections?.length)return(0,c.jsx)(G,{schema:{...a,formType:`split`,sections:a.sections.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),splitDirection:a.splitDirection,splitSize:a.splitSize,splitResizable:a.splitResizable},dataSource:n,className:a.className});if(a.formType===`drawer`){let{layout:e,...t}=a,r=a.layout===`vertical`||a.layout===`horizontal`?a.layout:void 0;return(0,c.jsx)(ke,{schema:{...t,layout:r,formType:`drawer`,sections:a.sections?.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,collapsible:e.collapsible,collapsed:e.collapsed,className:e.className})),open:a.open,onOpenChange:a.onOpenChange,drawerSide:a.drawerSide,drawerWidth:a.drawerWidth},dataSource:n,className:a.className})}if(a.formType===`modal`){let{layout:e,...t}=a,r=a.layout===`vertical`||a.layout===`horizontal`?a.layout:void 0;return(0,c.jsx)(Ne,{schema:{...t,layout:r,formType:`modal`,sections:a.sections?.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),open:a.open,onOpenChange:a.onOpenChange,modalSize:a.modalSize,modalCloseButton:a.modalCloseButton},dataSource:n,className:a.className})}return(0,c.jsx)(Fe,{schema:a,dataSource:n})},Fe=({schema:e,dataSource:n})=>{let{fieldLabel:s,sectionLabel:l}=(0,r.useSafeFieldLabel)(),u=(0,a.useIsMobile)(),d=(0,o.usePermissions)(),f=(0,t.useCallback)(t=>{if(!d?.isLoaded)return t;let n=[];for(let r of t)d.checkField(e.objectName,r.name,`read`)&&(!d.checkField(e.objectName,r.name,`write`)&&e.mode!==`view`?n.push({...r,readOnly:!0,disabled:!0,description:r.description??`You do not have edit access to this field.`}):n.push(r));return n},[d,e.objectName,e.mode]),[p,m]=(0,t.useState)(null),[h,g]=(0,t.useState)([]),[_,b]=(0,t.useState)(null),[x,S]=(0,t.useState)(!0),[C,w]=(0,t.useState)(null),[T,E]=(0,t.useState)(null),D=e.customFields&&e.customFields.length>0;(0,t.useEffect)(()=>{D&&(b(e.initialData||e.initialValues||{}),S(!1))},[D,e.initialData,e.initialValues]),(0,t.useEffect)(()=>{D?m({name:e.objectName,fields:{}}):e.objectName&&n?(async()=>{try{if(!n)throw Error(`DataSource is required when using ObjectQL schema fetching (inline fields not provided)`);let t=await n.getObjectSchema(e.objectName);if(!t)throw Error(`No schema found for object "${e.objectName}"`);m(t)}catch(e){w(e),S(!1)}})():D||S(!1)},[e.objectName,n,D]),(0,t.useEffect)(()=>{p&&!D&&(async()=>{if(!e.recordId||e.mode===`create`){b(e.initialData||e.initialValues||{}),S(!1);return}if(!D){if(!n){w(Error(`DataSource is required for fetching record data (inline data not provided)`)),S(!1);return}S(!0);try{let t=await n.findOne(e.objectName,e.recordId);b(t)}catch(e){console.error(`Failed to fetch record:`,e),w(e)}finally{S(!1)}}})()},[e.objectName,e.recordId,e.mode,e.initialValues,e.initialData,n,p,D]);let O=(0,t.useCallback)(e=>e,[]);(0,t.useEffect)(()=>{if(D&&e.customFields){g(e.customFields.map(O)),S(!1);return}if(!p)return;let t=[],r=!!p?.managedBy&&p.managedBy!==`platform`,a=e.mode===`edit`?p?.userActions?.edit===!0:e.mode===`create`?p?.userActions?.create===!0:!1,o=r&&!a,c=e.fields||Object.keys(p.fields||{});(Array.isArray(c)?c:Object.keys(c)).forEach(n=>{let r=typeof n==`string`?n:n.name;if(!r)return;let a=p.fields?.[r];if(!a&&!D)return;let c=!a?.permissions||a?.permissions.write!==!1;if(e.mode!==`view`&&!c)return;let l=e.customFields?.find(e=>e.name===r);if(l)t.push(O(l));else if(a){let c={name:r,label:s(e.objectName,r,a.label||n),type:(0,i.mapFieldTypeToFormType)(a.type),required:a.required||!1,disabled:e.readOnly||e.mode===`view`||a.readonly||o,placeholder:a.placeholder,description:a.help||a.description,validation:(0,i.buildValidationRules)(a),visibleWhen:a.visibleWhen,readonlyWhen:a.readonlyWhen,requiredWhen:a.requiredWhen??a.conditionalRequired,group:a.group,field:a,widget:a.widget};if((a.type===`select`||a.type===`lookup`||a.type===`master_detail`)&&(c.options=a.options||[],c.multiple=a.multiple),(a.type===`number`||a.type===`currency`||a.type===`percent`)&&(c.inputType=`number`,c.min=a.min,c.max=a.max,c.step=a.precision?10**-a.precision:void 0),a.type===`date`&&(c.inputType=`date`),a.type===`datetime`&&(c.inputType=`datetime-local`),(a.type===`text`||a.type===`textarea`||a.type===`markdown`||a.type===`html`)&&(c.maxLength=a.max_length,c.minLength=a.min_length),(a.type===`file`||a.type===`image`)&&(c.inputType=`file`,c.multiple=a.multiple,c.accept=a.accept?a.accept.join(`,`):void 0,a.max_size)){let e=`Max size: ${(0,i.formatFileSize)(a.max_size)}`;c.description=c.description?`${c.description} (${e})`:e}a.type===`email`&&(c.inputType=`email`),a.type===`phone`&&(c.inputType=`tel`),a.type===`url`&&(c.inputType=`url`),a.type===`password`&&(c.inputType=`password`),a.type===`time`&&(c.inputType=`time`),(a.type===`formula`||a.type===`summary`||a.type===`auto_number`)&&(c.disabled=!0),a.visible_on&&(c.visibleOn=a.visible_on),t.push(c)}}),g(t),!D&&e.recordId&&e.mode!==`create`&&n||S(!1)},[p,e.fields,e.customFields,e.readOnly,e.mode,D,e.recordId,n]);let k=(0,t.useCallback)(async(t,r)=>{if(t&&(t.nativeEvent||t._reactName===`onSubmit`)&&(console.warn(`ObjectForm: Received Event instead of data in handleSubmit! This suggests a Form renderer issue.`),r===void 0&&(t={})),D&&!n)return e.onSuccess&&await e.onSuccess(t),t;if(!n)throw Error(`DataSource is required for form submission (inline mode not configured)`);let i=ee(t,D?null:p);if(d?.isLoaded&&i&&typeof i==`object`){let t={};for(let n of Object.keys(i))d.checkField(e.objectName,n,`write`)&&(t[n]=i[n]);i=t}try{let t;if(e.submitHandler)t=await e.submitHandler(i);else if(e.mode===`create`)t=await n.create(e.objectName,i);else if(e.mode===`edit`&&e.recordId)t=await n.update(e.objectName,e.recordId,i);else throw Error(`Invalid form mode or missing record ID`);if(e.onSuccess)await e.onSuccess(t);else if(!e.submitHandler&&e.submitBehavior){let t=e.submitBehavior;switch(t.kind){case`redirect`:v(t.url)&&setTimeout(()=>window.location.assign(t.url),t.delayMs??0);break;case`continue`:break;default:{let n=t.kind===`thank-you`&&t.message?t.message:e.successMessage||(e.mode===`create`?`Created`:`Saved`);a.toast.success(n),E({title:t.kind===`thank-you`?t.title:void 0,message:n});break}}}else if(!e.submitHandler){let n=y(e.navigateOnSuccess,t);if(n)return window.location.assign(n),t;a.toast.success(e.successMessage||(e.mode===`create`?`Created`:`Saved`))}return t}catch(t){throw console.error(`Failed to submit form:`,t),e.onError&&e.onError(t),t}},[e,n,D,d,p]),j=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),M={...t.default.useMemo(()=>{if(!p?.fields)return{};let e={};return Object.keys(p.fields).forEach(t=>{let n=p.fields[t];n.defaultValue!==void 0&&(e[t]=n.defaultValue)}),e},[p]),..._},P=t.default.useMemo(()=>{let t=F(h,p);return e.mode===`create`&&(t=L(t,p)),t},[h,p,e.mode]),I=t.default.useMemo(()=>e.sections?.length?null:Ae(P,p?.fieldGroups),[e.sections,P,p]),R=e.sections?.length?e.sections:I,[B,V]=(0,t.useState)({});if(C)return(0,c.jsxs)(`div`,{className:`p-3 sm:p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:C.message})]});if(x)return(0,c.jsxs)(`div`,{className:`p-4 sm:p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(T)return(0,c.jsxs)(`div`,{className:`rounded-md border bg-card p-6 sm:p-8 text-center`,children:[(0,c.jsx)(`h3`,{className:`text-lg font-semibold`,children:T.title??`Thanks!`}),T.message&&(0,c.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:T.message})]});let U=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`;if(R?.length&&(!e.formType||e.formType===`simple`)){let t=I?P:h,n=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,i=R.map(e=>n(e.columns)).filter(e=>e!=null),a=R.reduce((e,t)=>e+(Array.isArray(t.fields)?t.fields.length:0),0),o=n(e.columns)??(i.length?Math.max(...i):A(a)),s=[];R.forEach((r,i)=>{let a=new Map(r.fields.map(e=>[typeof e==`string`?e:e.field??e.name,e])),c=Array.from(a.keys()),u=f(t.filter(e=>c.includes(e.name))).map(e=>{let t=a.get(e.name);if(!t||typeof t!=`object`)return e;let n=t,r={...e};return n.visibleOn!=null&&(r.visibleOn=n.visibleOn),n.colSpan!=null&&(r.colSpan=n.colSpan),n.span!=null&&(r.span=n.span),r});if(u.length===0)return;let d=r.name||r.label||String(i),p=r.name?l(e.objectName,r.name,r.label||r.name):r.label,m=B[d]??r.collapsed??!1;p&&s.push({name:`__section_${d}`,label:p,type:`section-divider`,colSpan:4,collapsible:r.collapsible,collapsed:m,onToggle:r.collapsible?()=>V(e=>({...e,[d]:!m})):void 0,className:r.className});let h=n(r.columns),g=o>1?N(u,o,h):u;p&&m?s.push(...g.map(e=>({...e,hidden:!0}))):s.push(...g)});let u=s,d=z(o);return(0,c.jsx)(`div`,{className:`w-full @container`,children:(0,c.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:u,layout:U,columns:o,...d?{fieldContainerClass:d}:{},defaultValues:M,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,onSubmit:k,onCancel:j}})})}let G=e.sections?.length,K=f(h),q=G?{fields:K,columns:e.columns}:H(K,p,e.columns,e.mode),J=e.mobile,Y=J?.fullscreenLongText?q.fields.map(e=>{let t=e.type;return t===`textarea`||t===`field:textarea`||t===`string-multiline`||t===`field:markdown`||t===`field:html`?{...e,mobile_fullscreen:!0}:e}):q.fields,X=J?.stepper,Z=J?.stepperMinFields??8,Q=Math.max(1,J?.stepperFieldsPerStep??1);if(!e.formType&&!G&&Y.length>=2&&(X===!0||X===`auto`&&u&&Y.length>=Z)){let t=Y,r=[];for(let e=0;e<t.length;e+=Q){let n=t.slice(e,e+Q);r.push({name:`step-${Math.floor(e/Q)+1}`,label:n[0]?.label||n[0]?.name||`Step ${Math.floor(e/Q)+1}`,fields:n})}return(0,c.jsx)(W,{schema:{...e,formType:`wizard`,sections:r,showStepIndicator:!0},dataSource:n,className:e.className})}let te={type:`form`,objectName:e.objectName,fields:Y,layout:U,columns:q.columns,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,resetOnSubmit:e.showReset||e.submitBehavior?.kind===`continue`||!e.submitBehavior&&e.resetOnSuccess&&e.mode===`create`,defaultValues:M,onSubmit:k,onCancel:j,className:e.className,mobileStickyActions:!!J?.stickyActions};return(0,c.jsx)(`div`,{className:J?.stickyActions?`w-full pb-20 md:pb-0`:`w-full`,"data-mobile-form":J?`true`:void 0,children:(0,c.jsx)(r.SchemaRenderer,{schema:te})})},Ie={text:200,email:254,url:2048,phone:32,textarea:5e3,markdown:5e3,html:5e3},Le=`_company_website_2`,Re=1500;function ze(e,t=[]){try{let n=new URL(e,typeof window<`u`?window.location.href:`http://localhost`);return typeof window<`u`&&n.origin===window.location.origin?!0:n.protocol!==`https:`&&n.protocol!==`http:`?!1:t.some(e=>{if(e===n.host)return!0;if(e.startsWith(`*.`)){let t=e.slice(1);return n.host.endsWith(t)&&n.host.length>t.length}return!1})}catch{return!1}}function Be(e){return e&&e.map(e=>{let t=Ie[String(e.type||``).toLowerCase()];return!t||(e.maxLength??e.max_length)?e:{...e,maxLength:t}})}var Ve=({config:e,dataSource:n,prefillParams:r,className:i})=>{let[o,l]=(0,t.useState)(!1),[u,d]=(0,t.useState)(!1),[f,p]=(0,t.useState)(null),[m,h]=(0,t.useState)(!(e.consent?.required??!!e.consent)),[g,_]=(0,t.useState)(null),v=(0,t.useRef)(null),y=(0,t.useRef)(0);(0,t.useEffect)(()=>{o||(y.current=Date.now())},[o]);let b=e.honeypot===!1?null:e.honeypot||Le,x=e.minFillTime??Re,S=(0,t.useMemo)(()=>Be(e.customFields),[e.customFields]),C=(0,t.useMemo)(()=>{if(!n||S&&S.length>0||!e.fields||e.fields.length===0)return;let t=async(e,t)=>t;return{...n,create:t,update:(e,t,n)=>Promise.resolve(n),delete:()=>Promise.reject(Error(`Not permitted on public form`))}},[n,S,e.fields]),w=(0,t.useMemo)(()=>{let t={};if(r)for(let[e,n]of Object.entries(r))t[e]=n;if(typeof window<`u`&&e.allowedPrefillFields?.length){let n=new Set(e.allowedPrefillFields);new URLSearchParams(window.location.search).forEach((e,r)=>{n.has(r)&&!(r in t)&&(t[r]=e)})}return Object.keys(t).length>0?t:void 0},[r,e.allowedPrefillFields]),T=(0,t.useCallback)(async t=>{if(e.consent?.required&&!m){_(e.texts?.consentRequired??`Please accept the privacy policy to continue.`);return}if(_(null),b&&v.current?.value){l(!0);return}if(x>0&&Date.now()-y.current<x){p(e.texts?.rateLimited??`Please take a moment to review your answers before submitting.`);return}let r={...t};b&&delete r[b],e.captchaToken&&(r._captcha=e.captchaToken),d(!0),p(null);try{n&&await n.create(e.objectName,r),l(!0);let t=e.thankYouPage?.redirectUrl;if(t)if(ze(t,e.allowedRedirectHosts)){let n=e.thankYouPage?.redirectDelay??3e3;setTimeout(()=>{window.location.href=t},n)}else console.warn(`[EmbeddableForm] Blocked unsafe redirect target:`,t),p(e.texts?.redirectBlocked??null)}catch(e){p(e instanceof Error?e.message:`Failed to submit form. Please try again.`)}finally{d(!1)}},[n,e,m,b,x]),E=(0,t.useCallback)(()=>{l(!1),p(null)},[]),D=(0,t.useMemo)(()=>{let t={};return e.branding?.backgroundColor&&(t.backgroundColor=e.branding.backgroundColor),t},[e.branding]);if(o){let t=e.thankYouPage,n=e.texts??{},r=Math.ceil((t?.redirectDelay??3e3)/1e3),o=(n.redirecting??`Redirecting in {{seconds}} seconds…`).replace(`{{seconds}}`,String(r));return(0,c.jsx)(`div`,{className:`min-h-screen flex items-center justify-center p-4 bg-gradient-to-b from-muted/40 via-background to-background ${i||``}`,style:D,children:(0,c.jsxs)(`div`,{className:`max-w-md w-full bg-card border rounded-xl shadow-sm p-8 text-center space-y-4`,children:[(0,c.jsx)(`div`,{className:`mx-auto inline-flex h-14 w-14 items-center justify-center rounded-full bg-emerald-50 text-emerald-600 dark:bg-emerald-500/10 dark:text-emerald-400`,children:(0,c.jsx)(s.CheckCircle2,{className:`h-8 w-8`,"aria-hidden":`true`})}),(0,c.jsx)(`h2`,{className:`text-xl font-semibold text-foreground`,children:t?.title||n.thankYouTitle||`Thank You!`}),(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t?.message||n.thankYouMessage||`Your submission has been received successfully.`}),e.allowMultiple&&(0,c.jsx)(a.Button,{variant:`outline`,size:`sm`,onClick:E,className:`mt-2`,children:n.submitAnother??`Submit Another Response`}),t?.redirectUrl&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:o})]})})}let O=e.texts??{},k=!!e.consent?.required,A=`${e.formId}-consent`;return(0,c.jsx)(`div`,{className:`min-h-screen flex items-center justify-center p-4 sm:p-6 bg-gradient-to-b from-muted/40 via-background to-background ${i||``}`,style:D,children:(0,c.jsxs)(`div`,{className:`max-w-2xl w-full bg-card border rounded-xl shadow-sm overflow-hidden`,children:[e.branding?.coverImage&&(0,c.jsx)(`div`,{className:`h-28 sm:h-32 w-full bg-cover bg-center`,style:{backgroundImage:`url(${JSON.stringify(e.branding.coverImage)})`},role:`presentation`}),(0,c.jsxs)(`div`,{className:`px-6 sm:px-8 pt-7 pb-5 border-b bg-muted/20`,style:e.branding?.primaryColor?{borderBottomColor:e.branding.primaryColor}:void 0,children:[e.branding?.logo&&(0,c.jsx)(`img`,{src:e.branding.logo,alt:``,className:`h-8 mb-4`}),e.title&&(0,c.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight text-foreground`,children:e.title}),e.description&&(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2 leading-relaxed`,children:e.description}),(0,c.jsx)(`p`,{className:`text-[11px] text-muted-foreground/70 mt-3`,"aria-hidden":`true`,children:O.requiredHint??`* Required field`})]}),(0,c.jsxs)(`div`,{className:`relative px-6 sm:px-8 py-6`,children:[f&&(0,c.jsx)(`div`,{role:`alert`,"aria-live":`assertive`,className:`mb-4 p-3 bg-destructive/10 border border-destructive/30 rounded-md text-sm text-destructive`,children:f}),(0,c.jsx)(Pe,{schema:{type:`object-form`,objectName:e.objectName,mode:`create`,fields:e.fields,customFields:S,initialData:w,onSuccess:T,submitText:u?O.submitting??`Submitting...`:O.submit??`Submit`},dataSource:C}),b&&(0,c.jsxs)(`div`,{"aria-hidden":`true`,className:`absolute left-[-10000px] top-auto h-px w-px overflow-hidden`,children:[(0,c.jsx)(`label`,{htmlFor:`${e.formId}-${b}`,children:`Do not fill this field`}),(0,c.jsx)(`input`,{ref:v,id:`${e.formId}-${b}`,type:`text`,name:b,tabIndex:-1,autoComplete:`off`,defaultValue:``})]}),e.consent&&(0,c.jsxs)(`div`,{className:`mt-4`,children:[(0,c.jsxs)(`label`,{className:`flex items-start gap-2 text-sm text-foreground cursor-pointer select-none`,children:[(0,c.jsx)(`input`,{type:`checkbox`,id:A,checked:m,onChange:e=>{h(e.target.checked),e.target.checked&&_(null)},"aria-required":k||void 0,"aria-invalid":g?`true`:void 0,"aria-describedby":g?`${A}-error`:void 0,className:`mt-0.5 h-4 w-4 rounded border-input accent-primary`}),(0,c.jsxs)(`span`,{className:`leading-relaxed`,children:[e.consent.label??O.consentLabelDefault??`I agree to the privacy policy.`,k&&(0,c.jsx)(`span`,{"aria-hidden":`true`,className:`text-destructive ml-0.5`,children:`*`}),e.consent.privacyUrl&&(0,c.jsxs)(c.Fragment,{children:[` `,(0,c.jsx)(`a`,{href:e.consent.privacyUrl,target:`_blank`,rel:`noopener noreferrer`,className:`underline text-primary hover:opacity-80`,children:O.consentLink??`Privacy policy`})]})]})]}),g&&(0,c.jsx)(`p`,{id:`${A}-error`,role:`alert`,className:`mt-1.5 text-xs text-destructive`,children:g})]}),u&&(0,c.jsxs)(`div`,{className:`mt-3 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,c.jsx)(s.Loader2,{className:`h-3.5 w-3.5 animate-spin`,"aria-hidden":`true`}),(0,c.jsx)(`span`,{children:O.submitting??`Submitting…`})]})]}),(0,c.jsxs)(`div`,{className:`px-6 sm:px-8 py-4 border-t bg-muted/20 flex flex-col sm:flex-row items-center justify-between gap-2`,children:[(0,c.jsxs)(`p`,{className:`inline-flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,c.jsx)(s.Lock,{className:`h-3 w-3`,"aria-hidden":`true`}),(0,c.jsx)(`span`,{children:O.secureNotice??`Your information is transmitted securely and only used to respond to your request.`})]}),(0,c.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground/80`,children:[e.privacyPolicyUrl&&(0,c.jsxs)(`a`,{href:e.privacyPolicyUrl,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1 underline hover:text-foreground`,children:[(0,c.jsx)(s.ShieldCheck,{className:`h-3 w-3`,"aria-hidden":`true`}),O.consentLink??`Privacy policy`]}),(0,c.jsx)(`span`,{children:O.poweredBy??`Powered by ObjectStack`})]})]})]})})};function He(e){return e<60?`${Math.round(e)}s`:e<3600?`${Math.floor(e/60)}m ${Math.round(e%60)}s`:`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`}var Ue=({formId:e,formTitle:n,metrics:r,className:i})=>{let o=(0,t.useMemo)(()=>{if(!r.abandonedSubmissions)return 100;let e=r.totalSubmissions+r.abandonedSubmissions;return e===0?0:Math.round(r.totalSubmissions/e*100)},[r.totalSubmissions,r.abandonedSubmissions]),s=(0,t.useMemo)(()=>r.dailySubmissions?.length?Math.max(...r.dailySubmissions.map(e=>e.count),1):1,[r.dailySubmissions]);return(0,c.jsxs)(`div`,{className:`space-y-4 ${i||``}`,children:[(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`h2`,{className:`text-lg font-semibold text-foreground`,children:n||`Form Analytics`}),(0,c.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Form ID: `,e]})]}),(0,c.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-4`,children:[(0,c.jsx)(a.Card,{children:(0,c.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,c.jsx)(a.CardDescription,{children:`Total Submissions`}),(0,c.jsx)(a.CardTitle,{className:`text-2xl`,children:r.totalSubmissions.toLocaleString()})]})}),(0,c.jsxs)(a.Card,{children:[(0,c.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,c.jsx)(a.CardDescription,{children:`Fill Rate`}),(0,c.jsxs)(a.CardTitle,{className:`text-2xl`,children:[o,`%`]})]}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(`div`,{className:`w-full bg-muted rounded-full h-2`,children:(0,c.jsx)(`div`,{className:`bg-primary rounded-full h-2 transition-all`,style:{width:`${o}%`}})})})]}),(0,c.jsx)(a.Card,{children:(0,c.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,c.jsx)(a.CardDescription,{children:`Avg. Completion Time`}),(0,c.jsx)(a.CardTitle,{className:`text-2xl`,children:r.avgCompletionTime?He(r.avgCompletionTime):`—`})]})})]}),r.dailySubmissions&&r.dailySubmissions.length>0&&(0,c.jsxs)(a.Card,{children:[(0,c.jsx)(a.CardHeader,{children:(0,c.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Daily Submissions`})}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(`div`,{className:`flex items-end gap-1 h-32`,children:r.dailySubmissions.map((e,t)=>(0,c.jsxs)(`div`,{className:`flex-1 flex flex-col items-center gap-1`,children:[(0,c.jsx)(`div`,{className:`w-full bg-primary/80 rounded-t transition-all hover:bg-primary`,style:{height:`${e.count/s*100}%`,minHeight:e.count>0?`4px`:`0`},title:`${e.date}: ${e.count} submissions`}),(0,c.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate w-full text-center`,children:e.date.slice(-5)})]},t))})})]}),r.fieldDropOff&&r.fieldDropOff.length>0&&(0,c.jsxs)(a.Card,{children:[(0,c.jsxs)(a.CardHeader,{children:[(0,c.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Field Completion Rates`}),(0,c.jsx)(a.CardDescription,{children:`Percentage of users who completed each field`})]}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(`div`,{className:`space-y-3`,children:r.fieldDropOff.map((e,t)=>(0,c.jsxs)(`div`,{className:`space-y-1`,children:[(0,c.jsxs)(`div`,{className:`flex justify-between text-sm`,children:[(0,c.jsx)(`span`,{className:`text-foreground`,children:e.label}),(0,c.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.completionRate,`%`]})]}),(0,c.jsx)(`div`,{className:`w-full bg-muted rounded-full h-1.5`,children:(0,c.jsx)(`div`,{className:`rounded-full h-1.5 transition-all ${e.completionRate>=80?`bg-green-500`:e.completionRate>=50?`bg-yellow-500`:`bg-destructive`}`,style:{width:`${e.completionRate}%`}})})]},t))})})]})]})},We=({schema:e})=>{let n=(0,r.useSchemaContext)()?.dataSource,o=(0,r.useRecordContext)(),s=e.parentObject||o?.objectName,l=e.parentId||e.recordId||o?.recordId,[u,d]=(0,t.useState)([]),[f,p]=(0,t.useState)([]),[m,h]=(0,t.useState)(!0),[g,_]=(0,t.useState)(!1),[v,y]=(0,t.useState)(!1),[b,x]=(0,t.useState)(null),[S,C]=(0,t.useState)(null);(0,t.useEffect)(()=>{let t=n;if(!t||typeof t.getObjectSchema!=`function`)return;let r=!1;return t.getObjectSchema(e.childObject).then(e=>{r||C(e??null)}).catch(()=>{r||C(null)}),()=>{r=!0}},[n,e.childObject]);let w=(0,t.useCallback)(async()=>{if(!n||!l){h(!1);return}h(!0);try{let t=(await n.find(e.childObject,{$filter:{[e.relationshipField]:l},$top:500}))?.data??[];d(t.map(e=>({...e}))),p(t.map(e=>({...e}))),y(!1)}catch(e){x(e?.message||`Failed to load line items`)}finally{h(!1)}},[n,l,e.childObject,e.relationshipField]);(0,t.useEffect)(()=>{w()},[w]);let T=(0,t.useCallback)(e=>{d(e),y(!0)},[]),E=(0,t.useCallback)(async()=>{if(!(!n||!l)){_(!0),x(null);try{await oe(n,s||e.childObject,l,{childObject:e.childObject,relationshipField:e.relationshipField,rows:u,original:f,amountField:e.amountField,totalField:s?e.totalField:void 0,childSchema:S}),await w()}catch(e){x(e?.message||`Failed to save line items`)}finally{_(!1)}}},[n,l,u,f,e,s,w,S]),D=(0,t.useMemo)(()=>({columns:e.columns,total_field:e.totalField?e.amountField||`amount`:void 0,min_rows:e.minRows,max_rows:e.maxRows,allow_add:!e.readonly,allow_delete:!e.readonly}),[e]);return(0,c.jsxs)(a.Card,{className:(0,a.cn)(`shadow-none`),children:[(0,c.jsxs)(a.CardHeader,{className:`flex-row items-center justify-between gap-2 pb-2`,children:[(0,c.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:e.title||`Line Items`}),!e.readonly&&(0,c.jsx)(a.Button,{type:`button`,size:`sm`,onClick:E,disabled:g||m||!v||!l,children:g?`Saving…`:`Save`})]}),(0,c.jsxs)(a.CardContent,{children:[b&&(0,c.jsx)(`p`,{className:`mb-2 text-sm text-destructive`,children:b}),m?(0,c.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Loading…`}):l?(0,c.jsx)(i.LineItemsField,{value:u,onChange:T,field:D,readonly:e.readonly}):(0,c.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Save the record first to add line items.`})]})]})},Ge=({schema:e})=>(0,c.jsx)(Pe,{schema:e,dataSource:(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0});n.ComponentRegistry.register(`object-form`,Ge,{namespace:`plugin-form`,label:`Object Form`,category:`plugin`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`fields`,type:`array`,label:`Fields`},{name:`mode`,type:`enum`,label:`Mode`,enum:[`create`,`edit`,`view`]},{name:`formType`,type:`enum`,label:`Form Type`,enum:[`simple`,`tabbed`,`wizard`,`split`,`drawer`,`modal`]},{name:`sections`,type:`array`,label:`Sections`},{name:`title`,type:`string`,label:`Title`},{name:`description`,type:`string`,label:`Description`},{name:`layout`,type:`enum`,label:`Layout`,enum:[`vertical`,`horizontal`,`inline`,`grid`]},{name:`columns`,type:`number`,label:`Columns`},{name:`defaultTab`,type:`string`,label:`Default Tab`},{name:`tabPosition`,type:`enum`,label:`Tab Position`,enum:[`top`,`bottom`,`left`,`right`]},{name:`allowSkip`,type:`boolean`,label:`Allow Skip Steps`},{name:`showStepIndicator`,type:`boolean`,label:`Show Step Indicator`},{name:`splitDirection`,type:`enum`,label:`Split Direction`,enum:[`horizontal`,`vertical`]},{name:`splitSize`,type:`number`,label:`Split Panel Size (%)`},{name:`splitResizable`,type:`boolean`,label:`Split Resizable`},{name:`drawerSide`,type:`enum`,label:`Drawer Side`,enum:[`top`,`bottom`,`left`,`right`]},{name:`drawerWidth`,type:`string`,label:`Drawer Width`},{name:`modalSize`,type:`enum`,label:`Modal Size`,enum:[`sm`,`default`,`lg`,`xl`,`full`]}]}),n.ComponentRegistry.register(`form`,Ge,{namespace:`view`,skipFallback:!0,label:`Data Form View`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`fields`,type:`array`,label:`Fields`},{name:`mode`,type:`enum`,label:`Mode`,enum:[`create`,`edit`,`view`]}]}),n.ComponentRegistry.register(`embeddable-form`,({schema:e})=>(0,c.jsx)(Ve,{config:e}),{namespace:`plugin-form`,label:`Embeddable Form`,category:`plugin`,inputs:[{name:`formId`,type:`string`,label:`Form ID`,required:!0},{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`title`,type:`string`,label:`Form Title`},{name:`description`,type:`string`,label:`Description`},{name:`fields`,type:`array`,label:`Fields`},{name:`allowMultiple`,type:`boolean`,label:`Allow Multiple Submissions`}]}),n.ComponentRegistry.register(`form-analytics`,({schema:e})=>(0,c.jsx)(Ue,{formId:e.formId,formTitle:e.formTitle,metrics:e.metrics||{totalSubmissions:0}}),{namespace:`plugin-form`,label:`Form Analytics`,category:`plugin`,inputs:[{name:`formId`,type:`string`,label:`Form ID`,required:!0},{name:`formTitle`,type:`string`,label:`Form Title`},{name:`metrics`,type:`object`,label:`Submission Metrics`}]}),n.ComponentRegistry.register(`object-master-detail-form`,({schema:e})=>(0,c.jsx)(Ee,{schema:e,dataSource:(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0}),{namespace:`plugin-form`,label:`Master-Detail Form`,category:`plugin`,inputs:[{name:`objectName`,type:`string`,label:`Parent Object`,required:!0},{name:`mode`,type:`enum`,label:`Mode`,enum:[`create`,`edit`]},{name:`sections`,type:`array`,label:`Parent Sections`},{name:`details`,type:`array`,label:`Detail Collections`,required:!0}]}),n.ComponentRegistry.register(`line_items`,({schema:e})=>(0,c.jsx)(We,{schema:e}),{namespace:`record`,skipFallback:!0,label:`Line Items`,category:`record`,inputs:[{name:`childObject`,type:`string`,label:`Child Object`,required:!0},{name:`relationshipField`,type:`string`,label:`Relationship Field`,required:!0},{name:`columns`,type:`array`,label:`Columns`,required:!0},{name:`totalField`,type:`string`,label:`Parent Total Field`},{name:`amountField`,type:`string`,label:`Amount Column`}]}),e.DrawerForm=ke,e.EmbeddableForm=Ve,e.FormAnalytics=Ue,e.FormSection=b,e.LineItemsPanel=We,e.MasterDetailForm=Ee,e.ModalForm=Ne,e.ObjectForm=Pe,e.SplitForm=G,e.TabbedForm=U,e.WizardForm=W,e.applyAutoColSpan=N,e.applyAutoLayout=H,e.containerGridColsFor=z,e.deriveColumns=he,e.deriveDetail=Ce,e.deriveFormFields=ve,e.filterAutoGeneratedFields=L,e.filterCreateModeFields=I,e.filterSystemFields=F,e.findRelationshipField=de,e.inferColumns=A,e.inferModalSize=V,e.isAutoGeneratedFieldType=k,e.isWideFieldType=O,e.resolveInlineMode=be});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("react"),require("@object-ui/core"),require("@object-ui/react"),require("@object-ui/fields"),require("@object-ui/components"),require("@object-ui/permissions"),require("lucide-react"),require("react/jsx-runtime"),require("@object-ui/i18n"),require("@objectstack/spec/data")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`@object-ui/fields`,`@object-ui/components`,`@object-ui/permissions`,`lucide-react`,`react/jsx-runtime`,`@object-ui/i18n`,`@objectstack/spec/data`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginForm={},e.React,e._object_ui_core,e._object_ui_react,e._object_ui_fields,e._object_ui_components,e._object_ui_permissions,e.lucide_react,e.react_jsx_runtime,e._object_ui_i18n,e._objectstack_spec_data))})(this,function(e,t,n,r,i,a,o,s,c,l,u){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var d=Object.create,f=Object.defineProperty,p=Object.getOwnPropertyDescriptor,m=Object.getOwnPropertyNames,h=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty,_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=m(t),a=0,o=i.length,s;a<o;a++)s=i[a],!g.call(e,s)&&s!==n&&f(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=p(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:d(h(e)),_(t||!e||!e.__esModule?f(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);function v(e){try{return typeof window>`u`?!1:new URL(e,window.location.href).origin===window.location.origin}catch{return!1}}function y(e,t){if(!e)return null;let n=t?.id??t?.recordId??t?._id;if(n==null||n===``)return null;let r=e.replace(/\{(?:id|recordId)\}/g,String(n));return v(r)?r:null}var b=({label:e,description:n,collapsible:r=!1,collapsed:i=!1,columns:o=1,children:l,className:u,gridClassName:d,showBorder:f})=>{let[p,m]=(0,t.useState)(i),h={1:`grid-cols-1`,2:`grid-cols-1 md:grid-cols-2`,3:`grid-cols-1 md:grid-cols-2 lg:grid-cols-3`,4:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`},g=()=>{r&&m(!p)},_=f??!!e,v=e||n?(0,c.jsxs)(`div`,{className:(0,a.cn)(`flex items-start gap-2`,!_&&`mb-4`,r&&`cursor-pointer select-none`),onClick:g,role:r?`button`:void 0,"aria-expanded":r?!p:void 0,children:[r&&(0,c.jsx)(`span`,{className:`mt-0.5 text-muted-foreground`,children:p?(0,c.jsx)(s.ChevronRight,{className:`h-4 w-4`}):(0,c.jsx)(s.ChevronDown,{className:`h-4 w-4`})}),(0,c.jsxs)(`div`,{className:`flex-1`,children:[e&&(0,c.jsx)(`h3`,{className:`text-sm font-semibold text-foreground`,children:e}),n&&(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:n})]})]}):null,y=p?null:(0,c.jsx)(`div`,{className:(0,a.cn)(`grid gap-4`,d||h[o]),children:l});return _?(0,c.jsxs)(a.Card,{className:(0,a.cn)(`form-section bg-muted/40 shadow-none`,u),children:[v&&(0,c.jsx)(a.CardHeader,{className:`border-b border-border pb-3`,children:v}),y&&(0,c.jsx)(a.CardContent,{className:`pt-4`,children:y})]}):(0,c.jsxs)(`div`,{className:(0,a.cn)(`form-section`,u),children:[v,y]})};function x(e,t){return typeof t==`string`&&t.trim()||typeof t==`object`&&t&&typeof t.source==`string`&&t.source.trim()?{...e,visibleOn:t}:e}function S(e,t){let n=t.objectSchema?.fields?.[e];return n?{name:e,label:t.fieldLabel(t.objectName,e,n.label||e),type:(0,i.mapFieldTypeToFormType)(n.type),required:n.required||!1,disabled:t.readOnly||t.mode===`view`||n.readonly,placeholder:n.placeholder,description:n.help||n.description,validation:(0,i.buildValidationRules)(n),field:n,options:n.options,multiple:n.multiple,visibleWhen:n.visibleWhen,readonlyWhen:n.readonlyWhen,requiredWhen:n.requiredWhen,conditionalRequired:n.conditionalRequired}:{name:e,label:e,type:`input`}}function C(e,t){if(typeof e==`string`){let n=t.objectSchema?.fields?.[e];return x(S(e,t),n?.visible_on??n?.visibleOn)}let n=e;if(typeof n.field!=`string`)return x(n,n.visibleOn);let r=n.field,a=S(r,t);n.type!=null&&(a.type=(0,i.mapFieldTypeToFormType)(n.type)),n.widget!=null&&(a.widget=n.widget),n.label!=null&&(a.label=n.label),n.placeholder!=null&&(a.placeholder=n.placeholder),n.helpText!=null&&(a.description=n.helpText),n.required!=null&&(a.required=n.required),n.readonly!=null&&(a.disabled=n.readonly||a.disabled),n.immutable!=null&&(a.immutable=n.immutable),n.hidden!=null&&(a.hidden=n.hidden),n.colSpan!=null&&(a.colSpan=n.colSpan),n.span!=null&&(a.span=n.span),n.options!=null&&(a.options=n.options),n.multiple!=null&&(a.multiple=n.multiple);let o=n.reference??n.reference_to;return o!=null&&(a.reference=o,a.reference_to=o),n.maxLength!=null&&(a.maxLength=n.maxLength),n.minLength!=null&&(a.minLength=n.minLength),n.min!=null&&(a.min=n.min),n.max!=null&&(a.max=n.max),n.precision!=null&&(a.precision=n.precision),n.scale!=null&&(a.scale=n.scale),n.language!=null&&(a.language=n.language),Array.isArray(n.fields)&&(a.fields=n.fields),x(a,n.visibleOn)}function w(e,t){return(e.fields??[]).map(e=>C(e,t))}var T=new Set([`field:formula`,`field:summary`,`field:auto_number`,`field:autonumber`]),E=new Set([`field:textarea`,`field:markdown`,`field:html`,`field:grid`,`field:rich-text`,`textarea`,`markdown`,`html`,`grid`,`rich-text`]),D=new Set([`formula`,`summary`,`auto_number`,`autonumber`]);function O(e){return E.has(e)}function k(e){return D.has(e)}function A(e){return e<=3?1:e<=8?2:e<=15?3:4}function j(e){return e&&e>0?Math.min(Math.floor(e),4):1}function M(e,t,n){let r=j(t);return r<=1?1:e.span===`full`?r:e.colSpan==null?e.type&&O(e.type)?r:Math.min(r,Math.max(1,Math.round(r/Math.min(Math.max(1,Math.floor(n||r)),r)))):Math.min(Math.max(1,Math.floor(e.colSpan)),r)}function N(e,t,n){let r=j(t);return r<=1?e:e.map(e=>{if(e.type===`section-divider`)return e;let t=M(e,r,n);return t>1?{...e,colSpan:t}:e.colSpan!=null&&e.colSpan!==1?{...e,colSpan:1}:e})}var P=new Set([`id`,`created_at`,`createdAt`,`updated_at`,`updatedAt`,`last_modified_at`,`lastModifiedAt`,`deleted_at`,`deletedAt`,`created_by`,`createdBy`,`updated_by`,`updatedBy`,`last_modified_by`,`lastModifiedBy`,`organization_id`,`organizationId`,`org_id`,`orgId`,`tenant_id`,`tenantId`,`owner`,`owner_id`,`_version`,`_rev`]);function F(e,t){return e.filter(e=>{if(P.has(e.name))return!1;let n=t?.fields?.[e.name];return!(n?.hidden===!0||n?.readonly===!0)})}function I(e,t){return e.filter(e=>{if(P.has(e.name)||e.type&&T.has(e.type))return!1;if(!t?.fields)return!0;let n=t.fields[e.name];return!n||n.readonly!==!0&&!k(n.type)})}function L(e,t){return e.filter(e=>{if(e.type&&T.has(e.type))return!1;let n=t?.fields?.[e.name];return!n||!k(n.type)})}var R={1:void 0,2:`grid gap-4 grid-cols-1 @md:grid-cols-2`,3:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3`,4:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3 @4xl:grid-cols-4`};function z(e){return R[e&&e>0?Math.min(Math.floor(e),4):1]}function B(e,t){let n=t&&t>1?Math.min(Math.floor(t),4):1,r=n>1?N(e,n):e,i=z(n);return{fields:r,columns:n,...i?{fieldContainerClass:i}:{}}}function V(e){return e<=1?`default`:e===2?`xl`:`full`}function H(e,t,n,r){let i=[...e];if(i=F(i,t),r===`create`&&(i=L(i,t)),n!==void 0)return i=N(i,n),{fields:i,columns:n};let a=A(i.length);return i=N(i,a),{fields:i,columns:a}}var U=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,l]=(0,t.useState)(null),[u,d]=(0,t.useState)({}),[f,p]=(0,t.useState)(!0),[m,h]=(0,t.useState)(null),[g,_]=(0,t.useState)(e.defaultTab||e.sections[0]?.name||e.sections[0]?.label||`tab-0`);t.default.useEffect(()=>{(async()=>{if(!n){p(!1);return}try{let t=await n.getObjectSchema(e.objectName);l(t)}catch(e){h(e)}})()},[e.objectName,n]),t.default.useEffect(()=>{(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){d(e.initialData||e.initialValues||{}),p(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);d(t||{})}catch(e){h(e)}finally{p(!1)}})()},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let v=(0,t.useCallback)(t=>w(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[s,e.readOnly,e.mode,e.objectName,o]),y=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;return e.mode===`create`?r=await n.create(e.objectName,t):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,t)),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n]),x=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),S=(e,t)=>e.name||e.label||`tab-${t}`;if(m)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:m.message})]});if(f)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let C={type:`form`,fields:e.sections.flatMap(e=>v(e)),layout:`vertical`,defaultValues:u,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,onSubmit:y,onCancel:x},T=e.tabPosition===`left`||e.tabPosition===`right`;return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(a.Tabs,{value:g,onValueChange:_,orientation:T?`vertical`:`horizontal`,className:(0,a.cn)(T&&`flex gap-4`),children:[(0,c.jsx)(a.TabsList,{className:(0,a.cn)(T?`flex-col h-auto`:``,e.tabPosition===`bottom`&&`order-last`,e.tabPosition===`right`&&`order-last`),children:e.sections.map((e,t)=>(0,c.jsx)(a.TabsTrigger,{value:S(e,t),className:T?`w-full justify-start`:``,children:e.label||`Tab ${t+1}`},S(e,t)))}),(0,c.jsx)(`div`,{className:`flex-1`,children:e.sections.map((t,n)=>(0,c.jsx)(a.TabsContent,{value:S(t,n),className:`mt-0`,children:(0,c.jsx)(b,{description:t.description,columns:1,className:t.className,gridClassName:t.gridClassName,children:(0,c.jsx)(r.SchemaRenderer,{schema:{...C,...B(v(t),t.columns||1),showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1}})})},S(t,n)))})]})})},W=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[l,u]=(0,t.useState)(null),[d,f]=(0,t.useState)({}),[p,m]=(0,t.useState)(!0),[h,g]=(0,t.useState)(null),[_,x]=(0,t.useState)(0),[S,C]=(0,t.useState)(new Set),[T,E]=(0,t.useState)(!1),[D,O]=(0,t.useState)(null),k=t.default.useId(),[A,j]=(0,t.useState)(0),M=t.default.useRef(!1),N=e.sections.length,P=_===0,F=_===N-1;t.default.useEffect(()=>{(async()=>{if(!n){m(!1);return}try{let t=await n.getObjectSchema(e.objectName);u(t)}catch(e){g(e)}})()},[e.objectName,n]),t.default.useEffect(()=>{(l||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){M.current||=(f(e.initialData||e.initialValues||{}),!0),m(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);f(t||{})}catch(e){g(e)}finally{m(!1)}})()},[l,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let I=(0,t.useCallback)(t=>w(t,{objectSchema:l,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[l,e.readOnly,e.mode,e.objectName,o]),L=(0,t.useMemo)(()=>_>=0&&_<N?I(e.sections[_]):[],[_,N,e.sections,I]),R=(0,t.useCallback)(async t=>{let r={...d,...t};if(f(r),C(e=>new Set(e).add(_)),F){E(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(r),r;let t;if(e.mode===`create`?t=await n.create(e.objectName,r):e.mode===`edit`&&e.recordId&&(t=await n.update(e.objectName,e.recordId,r)),e.onSuccess)await e.onSuccess(t);else if(e.submitBehavior){let t=e.submitBehavior;switch(t.kind){case`redirect`:v(t.url)&&setTimeout(()=>window.location.assign(t.url),t.delayMs??0);break;case`continue`:f({}),C(new Set),x(0),j(e=>e+1);break;default:{let n=t.kind===`thank-you`&&t.message?t.message:e.successMessage||(e.mode===`create`?`Created`:`Saved`);a.toast.success(n),O({title:t.kind===`thank-you`?t.title:void 0,message:n});break}}}else{let n=y(e.navigateOnSuccess,t);if(n)return window.location.assign(n),t;a.toast.success(e.successMessage||(e.mode===`create`?`Created`:`Saved`)),e.resetOnSuccess&&e.mode===`create`&&(f({}),C(new Set),x(0),j(e=>e+1))}return t}catch(t){throw e.onError&&e.onError(t),t}finally{E(!1)}}else z(_+1)},[d,_,F,e,n]),z=(0,t.useCallback)(t=>{t>=0&&t<N&&(x(t),e.onStepChange&&e.onStepChange(t))},[N,e]),V=(0,t.useCallback)(()=>{z(_-1)},[_,z]),H=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),U=(0,t.useCallback)(t=>{(e.allowSkip||S.has(t)||t<=_)&&z(t)},[e.allowSkip,S,_,z]);if(h)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:h.message})]});if(p)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(D)return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(`div`,{className:`rounded-md border bg-card p-8 text-center`,children:[(0,c.jsx)(`h3`,{className:`text-lg font-semibold`,children:D.title??`Thanks!`}),D.message&&(0,c.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:D.message})]})});let W=e.sections[_];return(0,c.jsxs)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:[e.showStepIndicator!==!1&&(0,c.jsx)(`nav`,{"aria-label":`Progress`,className:`mb-8`,children:(0,c.jsx)(`ol`,{className:`flex items-center`,children:e.sections.map((t,n)=>{let r=n===_,i=S.has(n),o=e.allowSkip||i||n<=_;return(0,c.jsxs)(`li`,{className:(0,a.cn)(`relative flex-1`,n!==N-1&&`pr-8 sm:pr-12`),children:[n!==N-1&&(0,c.jsx)(`div`,{className:`absolute top-3 sm:top-4 left-6 -right-4 sm:left-10 sm:-right-2 h-0.5`,"aria-hidden":`true`,children:(0,c.jsx)(`div`,{className:(0,a.cn)(`h-full`,i?`bg-primary`:`bg-muted`)})}),(0,c.jsxs)(`button`,{type:`button`,className:(0,a.cn)(`group relative flex items-center`,o?`cursor-pointer`:`cursor-not-allowed`),onClick:()=>U(n),disabled:!o,children:[(0,c.jsx)(`span`,{className:(0,a.cn)(`flex h-6 w-6 sm:h-8 sm:w-8 items-center justify-center rounded-full text-xs sm:text-sm font-medium transition-colors`,i&&`bg-primary text-primary-foreground`,r&&!i&&`border-2 border-primary bg-background text-primary`,!r&&!i&&`border-2 border-muted bg-background text-muted-foreground`),children:i?(0,c.jsx)(s.Check,{className:`h-3 w-3 sm:h-4 sm:w-4`}):n+1}),(0,c.jsx)(`span`,{className:`ml-2 sm:ml-3 text-xs sm:text-sm font-medium hidden sm:block`,children:(0,c.jsx)(`span`,{className:(0,a.cn)(r?`text-foreground`:`text-muted-foreground`),children:t.label||`Step ${n+1}`})})]})]},n)})})}),(0,c.jsx)(`div`,{className:`min-h-[200px]`,children:W&&(0,c.jsx)(b,{label:W.label,description:W.description,columns:1,className:W.className,gridClassName:W.gridClassName,children:L.length>0?(0,c.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,id:k,...B(L,W.columns||1),layout:`vertical`,defaultValues:d,showSubmit:!1,showCancel:!1,onSubmit:R}},A):(0,c.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:`No fields configured for this step`})})}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between mt-6 pt-4 border-t`,children:[(0,c.jsx)(`div`,{children:e.showCancel!==!1&&(0,c.jsx)(a.Button,{variant:`ghost`,onClick:H,children:e.cancelText||`Cancel`})}),(0,c.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,c.jsxs)(`span`,{className:`text-sm text-muted-foreground mr-2`,children:[`Step `,_+1,` of `,N]}),!P&&(0,c.jsxs)(a.Button,{variant:`outline`,onClick:V,children:[(0,c.jsx)(s.ChevronLeft,{className:`h-4 w-4 mr-1`}),e.prevText||`Back`]}),F?(0,c.jsxs)(a.Button,{type:`submit`,form:k,disabled:T||e.mode===`view`,children:[T&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`,"aria-hidden":!0}),T?`Submitting...`:e.submitText||(e.mode===`create`?`Create`:`Update`)]}):(0,c.jsxs)(a.Button,{type:`submit`,form:k,children:[e.nextText||`Next`,(0,c.jsx)(s.ChevronRight,{className:`h-4 w-4 ml-1`})]})]})]})]})},G=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,l]=(0,t.useState)(null),[u,d]=(0,t.useState)({}),[f,p]=(0,t.useState)(!0),[m,h]=(0,t.useState)(null);(0,t.useEffect)(()=>{(async()=>{if(!n){p(!1);return}try{let t=await n.getObjectSchema(e.objectName);l(t)}catch(e){h(e),p(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){d(e.initialData||e.initialValues||{}),p(!1);return}if(!n){d(e.initialData||e.initialValues||{}),p(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);d(t||{})}catch(e){h(e)}finally{p(!1)}})()},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let g=(0,t.useCallback)(t=>w(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[s,e.readOnly,e.mode,e.objectName,o]),_=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;return e.mode===`create`?r=await n.create(e.objectName,t):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,t)),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n]),v=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),y=(0,t.useMemo)(()=>e.sections.slice(0,1),[e.sections]),x=(0,t.useMemo)(()=>e.sections.slice(1),[e.sections]);(0,t.useMemo)(()=>e.sections.flatMap(e=>g(e)),[e.sections,g]);let S=e.splitDirection||`horizontal`,C=e.splitSize||50;if(m)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:m.message})]});if(f)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let T={type:`form`,objectName:e.objectName,layout:`vertical`,defaultValues:u,onSubmit:_,onCancel:v},E=(t,n)=>(0,c.jsx)(`div`,{className:`space-y-6 p-4`,children:t.map((t,i)=>(0,c.jsx)(b,{label:t.label,description:t.description,columns:1,className:t.className,gridClassName:t.gridClassName,children:(0,c.jsx)(r.SchemaRenderer,{schema:{...T,...B(g(t),t.columns||1),showSubmit:n&&e.showSubmit!==!1&&e.mode!==`view`,showCancel:n&&e.showCancel!==!1,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText}})},t.name||t.label||i))});return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(a.ResizablePanelGroup,{orientation:S,className:`min-h-[300px] rounded-lg border`,children:[(0,c.jsx)(a.ResizablePanel,{defaultSize:C,minSize:20,children:E(y,x.length===0)}),x.length>0&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(a.ResizableHandle,{withHandle:e.splitResizable!==!1}),(0,c.jsx)(a.ResizablePanel,{defaultSize:100-C,minSize:20,children:E(x,!0)})]})]})})},K=new Set([`id`,`_id`,`created_at`,`updated_at`,`createdAt`,`updatedAt`,`organization_id`,`organizationId`]),q=new Set([`formula`,`summary`,`rollup`,`lookup_value`,`auto_number`,`autonumber`,`computed`]);function ee(e,t){if(!e||typeof e!=`object`)return e;let n={},r=t?.fields;for(let[t,i]of Object.entries(e))if(!K.has(t)){if(r){let e=r[t];if(!e)continue;let n=String(e.type||``).toLowerCase();if(q.has(n)||e.computed===!0||e.formula||e.readOnly===!0||e.readonly===!0)continue}n[t]=i}return n}var J=e=>e==null?void 0:e.id??e._id??e.recordId,Y=(e,t)=>t?ee(e,t):e,X=new Set([`id`,`_id`,`recordId`]);function Z(e,t){return!e||Object.entries(e).every(([e,n])=>e===t||X.has(e)?!0:n==null||n===``)}function Q(e,t,n){let r=[{object:e,action:`create`,data:t}];for(let e of n)for(let t of e.rows)Z(t,e.relationshipField)||r.push({object:e.childObject,action:`create`,data:{...Y(t,e.childSchema),[e.relationshipField]:{$ref:0}}});return r}function te(e,t,n,r){let i=[{object:e,action:`update`,id:t,data:n}];for(let e of r){let n=(e.rows||[]).map(n=>({...n,[e.relationshipField]:t})),{toCreate:r,toUpdate:a,toDelete:o}=ne(e.original||[],n);for(let t of r){if(Z(t,e.relationshipField))continue;let{id:n,_id:r,recordId:a,...o}=t;i.push({object:e.childObject,action:`create`,data:Y(o,e.childSchema)})}for(let t of a)i.push({object:e.childObject,action:`update`,id:J(t),data:Y(t,e.childSchema)});for(let t of o)i.push({object:e.childObject,action:`delete`,id:t})}return i}function ne(e,t){let n=new Set(t.map(J).filter(Boolean));return{toCreate:t.filter(e=>!J(e)),toUpdate:t.filter(e=>J(e)),toDelete:(e||[]).map(J).filter(e=>!!e&&!n.has(e))}}function re(e,t){return Array.isArray(e)?e.reduce((e,n)=>{let r=Number(n?.[t]);return e+(Number.isFinite(r)?r:0)},0):0}function ie(e){return Array.isArray(e)?e:e&&Array.isArray(e.records)?e.records:e&&Array.isArray(e.data)?e.data:e&&(e.id||e._id)?[e]:[]}async function ae(e,t,n){return n.length===0?[]:typeof e.bulk==`function`?ie(await e.bulk(t,`create`,n)):ie(await Promise.all(n.map(n=>e.create(t,n))))}async function oe(e,t,n,r){let i=[],a=r.rows.filter(e=>J(e)||!Z(e,r.relationshipField)).map(e=>({...e,[r.relationshipField]:n}));if(r.original!==void 0){let{toCreate:t,toUpdate:n,toDelete:o}=ne(r.original,a),s=await ae(e,r.childObject,t.map(e=>Y(e,r.childSchema)));for(let e of s){let t=J(e);t&&i.push({object:r.childObject,id:t})}await Promise.all(n.map(t=>e.update(r.childObject,J(t),Y(t,r.childSchema)))),await Promise.all(o.map(t=>e.delete(r.childObject,t)))}else{let t=await ae(e,r.childObject,a.map(e=>Y(e,r.childSchema)));for(let e of t){let t=J(e);t&&i.push({object:r.childObject,id:t})}}if(r.totalField){let i=re(r.rows,r.amountField||`amount`);await e.update(t,n,{[r.totalField]:i})}return{created:i}}var se=new Set([`id`,`_id`,`recordId`,`created_at`,`updated_at`,`created_by`,`updated_by`,`createdAt`,`updatedAt`,`createdBy`,`updatedBy`,`organization_id`,`tenant_id`,`space`,`owner`]),$=new Set([`position`,`sort_order`,`sequence`,`line_no`,`line_number`,`sort`]),ce=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`,`json`,`object`,`grid`,`table`,`location`,`vector`,`html`,`markdown`,`richtext`]);function le(e){switch(e){case`number`:case`percent`:case`rating`:case`slider`:return`number`;case`currency`:return`currency`;case`date`:case`datetime`:case`time`:return`date`;case`select`:case`picklist`:case`radio`:case`boolean`:case`toggle`:return`select`;case`lookup`:case`master_detail`:return`lookup`;case`file`:case`image`:case`avatar`:case`attachment`:return`file`;default:return`text`}}var ue=new Set([`image`,`avatar`]);function de(e,t){e.multiple==null&&t?.multiple&&(e.multiple=!0),e.accept??(Array.isArray(t?.accept)&&t.accept.length>0?e.accept=t.accept:ue.has(t?.type)&&(e.accept=[`image/*`]))}function fe(e){if(e?.type===`boolean`||e?.type===`toggle`)return[{label:`Yes`,value:`true`},{label:`No`,value:`false`}];let t=e?.options;if(Array.isArray(t))return t.map(e=>typeof e==`object`&&e?{label:String(e.label??e.value),value:String(e.value)}:{label:String(e),value:String(e)})}function pe(e,t){let n=e?.fields;if(!n||typeof n!=`object`)return;let r;for(let[e,i]of Object.entries(n)){let n=i;if(n?.reference===t){if(n?.type===`master_detail`)return e;n?.type===`lookup`&&!r&&(r=e)}}return r}var me=[`name`,`title`,`subject`,`label`,`full_name`,`display_name`,`code`],he={select:0,currency:1,number:1,lookup:2,date:3,text:4};function ge(e,t){if(t<=0||e.length<=t)return e;let n=new Set,r=e.find(e=>me.includes(e.field))??e[0];r&&n.add(r.field);for(let t of e)t.required&&n.add(t.field);let i=e.map((e,t)=>({c:e,i:t})).filter(({c:e})=>!n.has(e.field)).sort((e,t)=>(he[e.c.type]??5)-(he[t.c.type]??5)||e.i-t.i);for(let{c:e}of i){if(n.size>=t)break;n.add(e.field)}return e.map(e=>n.has(e.field)?e:{...e,defaultHidden:!0})}function _e(e,t={}){let n=e?.fields;if(!n||typeof n!=`object`)return[];let r=new Set([...t.exclude??[],...t.relationshipField?[t.relationshipField]:[]]),i=[];for(let[e,t]of Object.entries(n)){let n=t;if(se.has(e)||r.has(e)||$.has(e)||n?.system||n?.readonly||n?.hidden||ce.has(n?.type))continue;let a={field:e,label:n?.label||e,type:le(n?.type),required:!!n?.required},o=fe(n);a.type===`select`&&o&&(a.options=o),a.type===`lookup`&&(a.reference=n?.reference,a.displayField=n?.display_field||n?.reference_field),a.type===`file`&&de(a,n),n?.readonlyWhen&&(a.readonlyWhen=n.readonlyWhen),(n?.requiredWhen??n?.conditionalRequired)&&(a.requiredWhen=n.requiredWhen??n.conditionalRequired);let s=typeof n?.expression==`string`?n.expression:n?.expression?.source;s&&typeof s==`string`&&(a.computed=!0,a.expr=s,a.required=!1,typeof n?.scale==`number`&&(a.scale=n.scale)),i.push(a)}return ge(i,t.maxColumns??6)}function ve(e,t){let n=e??[],r=t?.fields;return!n.length||!r||typeof r!=`object`?n:n.map(e=>{if(e.type)return e;let t=r[e.field];if(!t)return e;let n=le(t?.type),i={...e,type:n};i.label??=t?.label||e.field,i.required??=!!t?.required;let a=fe(t);n===`select`&&a&&!i.options&&(i.options=a),n===`lookup`&&(i.reference??=t?.reference,i.displayField??=t?.display_field||t?.reference_field),n===`file`&&de(i,t),i.readonlyWhen==null&&t?.readonlyWhen&&(i.readonlyWhen=t.readonlyWhen),i.requiredWhen==null&&(t?.requiredWhen??t?.conditionalRequired)&&(i.requiredWhen=t.requiredWhen??t.conditionalRequired);let o=typeof t?.expression==`string`?t.expression:t?.expression?.source;return!i.computed&&o&&typeof o==`string`&&(i.computed=!0,i.expr=o,i.required=!1,typeof t?.scale==`number`&&(i.scale=t.scale)),i})}var ye=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`]);function be(e,t={}){let n=e?.fields;if(!n||typeof n!=`object`)return[];let r=new Set([...t.exclude??[],...t.relationshipField?[t.relationshipField]:[]]),i=[];for(let[e,t]of Object.entries(n)){let n=t;se.has(e)||r.has(e)||$.has(e)||n?.system||n?.hidden||ye.has(n?.type)||i.push(e)}return i}var xe=new Set([`textarea`,`richtext`,`html`,`markdown`,`rich-text`,`file`,`image`,`avatar`,`attachment`,`json`,`location`,`address`]);function Se(e,t,n={}){if(t===`grid`||t===`form`)return t;let r=e?.fields??{},i=be(e,{relationshipField:n.relationshipField});return i.some(e=>xe.has(r[e]?.type))||i.length>8?`form`:`grid`}var Ce=[`amount`,`total`,`subtotal`,`line_total`,`line_amount`,`net_amount`];function we(e){let t=e.filter(e=>e.type===`number`||e.type===`currency`);if(t.length===0)return;let n=t.find(e=>e.computed);if(n)return n.field;let r=t.find(e=>Ce.includes(e.field));if(r)return r.field;let i=[...t].reverse().find(e=>e.type===`currency`);return i?i.field:t[t.length-1].field}function Te(e,t,n,r={}){let i=r.relationshipField||pe(t,n);if(!i)throw Error(`MasterDetailForm: could not find a lookup/master_detail field on "${e}" referencing "${n}". Set relationshipField explicitly.`);let a=r.columns?.length?ve(r.columns,t):_e(t,{relationshipField:i}),o=r.amountField||we(a);return{childObject:e,relationshipField:i,columns:a,formFields:be(t,{relationshipField:i}),mode:Se(t,r.inlineEdit??(t?.fields)?.[i]?.inlineEdit,{relationshipField:i}),amountField:o,sortField:Object.keys(t?.fields??{}).find(e=>$.has(e))}}function Ee(e){if(!e)return{};let t={};return e.querySelectorAll(`[name]`).forEach(e=>{let n=e.getAttribute(`name`);if(n){if(e.tagName===`INPUT`){let r=e;if(r.type===`checkbox`){t[n]=r.checked;return}if(r.type===`radio`){r.checked&&(t[n]=r.value);return}if(r.type===`number`||r.type===`range`){if(r.value===``){t[n]=null;return}let e=Number(r.value);t[n]=Number.isFinite(e)?e:r.value;return}t[n]=r.value;return}t[n]=e.value}}),t}var De=({details:e,state:n,setRows:r,formHostRef:a,taxRateField:o,formKey:s,onRowExpand:l,onAddViaForm:u})=>{let[d,f]=(0,t.useState)({}),p=(0,t.useRef)(``);(0,t.useEffect)(()=>{let e=a.current;if(!e)return;let t=()=>{let t=Ee(e),n;try{n=JSON.stringify(t)}catch{n=String(Math.random())}n!==p.current&&(p.current=n,f(t))};t();let n=()=>t();e.addEventListener(`input`,n),e.addEventListener(`change`,n);let r=[120,360,800].map(e=>setTimeout(t,e));return()=>{e.removeEventListener(`input`,n),e.removeEventListener(`change`,n),r.forEach(clearTimeout)}},[a,s,e.length]);let m=d[o],h=m===void 0?null:Number.isFinite(Number(m))?Number(m):0,g=e.reduce((e,t,r)=>e+re(n[r]?.rows??[],t.amountField||`amount`),0),_=h!==null&&e.some(e=>!!e.amountField),v=h??0,y=v/100*g,b=g+y,x=e=>`¥${e.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2})}`;return(0,c.jsxs)(c.Fragment,{children:[e.map((e,t)=>(0,c.jsxs)(`section`,{className:`space-y-2`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium text-foreground`,children:e.title||`Line Items`}),e.columns?.length?(0,c.jsx)(i.LineItemsField,{value:n[t]?.rows??[],onChange:e=>r(t,e),contextRecord:d,...e.inlineMode===`form`||(e.formFields?.length??0)>(e.columns?.length??0)?{onRowExpand:e=>l(t,e)}:{},displayMode:e.inlineMode===`form`?`list`:`grid`,...e.inlineMode===`form`?{onAdd:()=>u(t)}:{},field:{columns:e.columns,total_field:_?void 0:e.amountField||(e.totalField?`amount`:void 0),sort_field:e.sortField,min_rows:e.minRows,max_rows:e.maxRows,add_label:e.inlineMode===`form`?e.addLabel||`Add`:e.addLabel}}):(0,c.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,children:`Loading columns…`})]},`${e.childObject}-${t}`)),_&&(0,c.jsx)(`div`,{className:`flex justify-end`,children:(0,c.jsxs)(`dl`,{className:`w-64 space-y-1.5 text-sm`,"data-testid":`md-totals`,children:[(0,c.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,c.jsx)(`dt`,{className:`text-muted-foreground`,children:`Subtotal`}),(0,c.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-subtotal`,children:x(g)})]}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,c.jsxs)(`dt`,{className:`text-muted-foreground`,children:[`Tax (`,v,`%)`]}),(0,c.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-tax`,children:x(y)})]}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between border-t border-border pt-1.5 text-base font-semibold`,children:[(0,c.jsx)(`dt`,{children:`Total`}),(0,c.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-grand-total`,children:x(b)})]})]})})]})},Oe=({schema:e,dataSource:n,className:r})=>{let i=e.details||[],o=e.mode===`edit`&&!!e.recordId,s=i.some(e=>!e.relationshipField||!e.columns?.length||e.columns.some(e=>!e.type)),[l,u]=(0,t.useState)(s?null:i),d=l??i;(0,t.useEffect)(()=>{if(!s){u(i);return}if(!n||typeof n.getObjectSchema!=`function`)return;let t=!1;return(async()=>{let r=await Promise.all(i.map(async t=>{let r=t.columns?.length?t.columns.every(e=>!!e.type):!1;if(t.relationshipField&&r)return t;try{let r=await n.getObjectSchema(t.childObject);if(t.relationshipField&&t.columns?.length)return{...t,columns:ve(t.columns,r)};let i=Te(t.childObject,r,e.objectName,{relationshipField:t.relationshipField,columns:t.columns,amountField:t.amountField});return{...t,relationshipField:i.relationshipField,columns:i.columns,formFields:t.formFields??i.formFields,inlineMode:t.inlineMode??i.mode,amountField:t.amountField??i.amountField,sortField:t.sortField??i.sortField}}catch{return t}}));t||u(r)})(),()=>{t=!0}},[n,e.objectName,e.details]);let[f,p]=(0,t.useState)(()=>i.map(()=>({rows:[],original:[]}))),m=(0,t.useRef)(f);m.current=f;let h=(0,t.useRef)({});(0,t.useEffect)(()=>{let e=n;if(!e||typeof e.getObjectSchema!=`function`)return;let t=!1,r=Array.from(new Set(i.map(e=>e.childObject).filter(Boolean)));return(async()=>{let n=await Promise.all(r.map(async t=>{try{return[t,await e.getObjectSchema(t)]}catch{return[t,null]}}));if(t)return;let i={};for(let[e,t]of n)t&&(i[e]=t);h.current=i})(),()=>{t=!0}},[n,e.objectName,e.details]);let[g,_]=(0,t.useState)(0),[v,y]=(0,t.useState)(!1),b=(0,t.useRef)(!1),x=(0,t.useRef)(null),S=(0,t.useCallback)(()=>{b.current=!1,y(!1),x.current&&=(clearTimeout(x.current),null)},[]);(0,t.useEffect)(()=>{let t=!1;if(!(!o||!n))return(async()=>{let r=await Promise.all(d.map(async t=>{if(!t.relationshipField)return{rows:[],original:[]};try{let r=(await n.find(t.childObject,{$filter:{[t.relationshipField]:e.recordId},$top:500}))?.data??[];return{rows:r.map(e=>({...e})),original:r.map(e=>({...e}))}}catch{return{rows:[],original:[]}}}));t||p(r)})(),()=>{t=!0}},[o,n,e.recordId,l]);let C=(0,t.useCallback)((e,t)=>{p(n=>n.map((n,r)=>r===e?{...n,rows:t}:n))},[]),w=e.taxRateField||`tax_rate`,[T,E]=(0,t.useState)(null),D=T?f[T.detailIdx]?.rows?.[T.rowIdx]:void 0,O=T?d[T.detailIdx]:void 0,k=(0,t.useCallback)((e,t,n)=>{p(r=>r.map((r,i)=>i===e?{...r,rows:r.rows.map((e,r)=>r===t?{...e,...n}:e)}:r))},[]),A=(0,t.useCallback)(e=>{p(t=>{let n=t.map((t,n)=>n===e?{...t,rows:[...t.rows,{}]}:t),r=n[e].rows.length-1;return E({detailIdx:e,rowIdx:r,isNew:!0}),n})},[]),j=(0,t.useCallback)(()=>{E(e=>(e?.isNew&&p(t=>t.map((t,n)=>n===e.detailIdx?{...t,rows:t.rows.filter((t,n)=>n!==e.rowIdx)}:t)),null))},[]),M=(0,t.useCallback)(async t=>{S(),e.onSuccess||a.toast.success(o?e.title?`${e.title} saved`:`Saved`:`Created`),o||(p(d.map(()=>({rows:[],original:[]}))),_(e=>e+1)),await e.onSuccess?.(t)},[o,e.onSuccess,e.title,d.length,S]),N=(0,t.useCallback)(t=>{S(),a.toast.error(t?.message||`Save failed`),e.onError?.(t)},[e,S]),P=(0,t.useCallback)(async t=>{let r=[];for(let i=0;i<d.length;i++){let a=d[i],{rows:s,original:c}=m.current[i];if(!a.relationshipField)continue;let{created:l}=await oe(n,e.objectName,t,{childObject:a.childObject,relationshipField:a.relationshipField,rows:s,original:o?c:void 0,amountField:a.amountField,totalField:a.totalField,childSchema:h.current[a.childObject]});r.push(...l)}return r},[d,o,n,e.objectName]),F=(0,t.useCallback)(async t=>{let r=J(t)??e.recordId;if(!r)throw Error(`MasterDetailForm: parent record has no id after save`);if(!n)throw Error(`MasterDetailForm: dataSource is required`);let i=[];try{i=await P(r)}catch(t){throw o||await Promise.allSettled([...i.map(e=>n.delete(e.object,e.id)),n.delete(e.objectName,r)]),t}await M(t)},[n,o,P,e,M]),I=typeof n?.batchTransaction==`function`,L=(0,t.useCallback)(async t=>{let r=n,i={...t};d.forEach((e,t)=>{e.totalField&&(i[e.totalField]=re(m.current[t]?.rows??[],e.amountField||`amount`))});let a=o?te(e.objectName,e.recordId,i,d.filter(e=>e.relationshipField).map((e,t)=>({childObject:e.childObject,relationshipField:e.relationshipField,rows:m.current[t]?.rows??[],original:m.current[t]?.original??[],childSchema:h.current[e.childObject]}))):Q(e.objectName,i,d.filter(e=>e.relationshipField).map((e,t)=>({childObject:e.childObject,relationshipField:e.relationshipField,rows:m.current[t]?.rows??[],childSchema:h.current[e.childObject]})));return(await r.batchTransaction(a))?.results?.[0]??{...i,id:e.recordId}},[n,d,e.objectName,e.recordId,o]),R=(0,t.useMemo)(()=>({type:`object-form`,objectName:e.objectName,mode:e.mode??`create`,recordId:e.recordId,initialValues:e.initialValues,initialData:e.initialData,formType:e.formType,sections:e.sections,fields:e.fields,title:e.title,showSubmit:!1,showCancel:!1,...I?{submitHandler:L,onSuccess:M}:{onSuccess:F},onError:N}),[e,F,I,L,M,N]),z=(0,t.useRef)(null),B=e.submitText??(o?`Save`:`Create`),V=(0,t.useCallback)(()=>{b.current||z.current?.querySelector(`form`)&&(b.current=!0,y(!0),setTimeout(()=>{(z.current?.querySelector(`form`))?.requestSubmit()},0),x.current=setTimeout(()=>S(),1500))},[S]);return(0,t.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]),(0,c.jsxs)(`div`,{className:(0,a.cn)(`space-y-6`,r,e.className),children:[(0,c.jsx)(`div`,{ref:z,children:(0,c.jsx)(Ie,{schema:R,dataSource:n},g)}),(0,c.jsx)(De,{details:d,state:f,setRows:C,formHostRef:z,taxRateField:w,formKey:g,onRowExpand:(e,t)=>E({detailIdx:e,rowIdx:t}),onAddViaForm:A}),T&&O&&(0,c.jsxs)(a.Card,{className:`border-primary/40 shadow-none ring-1 ring-primary/10`,"data-testid":`md-row-form`,children:[(0,c.jsxs)(a.CardHeader,{className:`pb-2 flex flex-row items-center justify-between gap-2 space-y-0`,children:[(0,c.jsxs)(a.CardTitle,{className:`text-sm font-medium`,children:[O.title||`Line item`,` — row `,T.rowIdx+1]}),(0,c.jsx)(a.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs text-muted-foreground`,onClick:j,children:`Close`})]}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(Ie,{schema:{type:`object-form`,objectName:O.childObject,mode:`edit`,initialData:D??{},...O.formFields?.length?{fields:O.formFields}:{},submitText:`Apply`,submitHandler:async e=>e,onSuccess:e=>{k(T.detailIdx,T.rowIdx,e),E(null)},onCancel:j},dataSource:n},`row-${T.detailIdx}-${T.rowIdx}`)})]}),e.showSubmit!==!1&&(0,c.jsxs)(`div`,{className:`flex items-center justify-end gap-2 border-t border-border pt-4`,children:[e.onCancel&&(0,c.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:e.onCancel,disabled:v,"data-testid":`md-form-cancel`,children:e.cancelText??`Cancel`}),(0,c.jsx)(a.Button,{type:`button`,onClick:V,disabled:v||s&&!l,"data-testid":`md-form-submit`,children:v?`Saving…`:B})]})]})},ke={1:void 0,2:`grid gap-4 grid-cols-1 @md:grid-cols-2`,3:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3`,4:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3 @4xl:grid-cols-4`},Ae=(0,l.createSafeTranslation)({"form.discardTitle":`Discard changes?`,"form.discardMessage":`You have unsaved changes. If you close this form now, your edits will be lost.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`},`form.discardTitle`),je=({schema:e,dataSource:n,className:o})=>{let{fieldLabel:l}=(0,r.useSafeFieldLabel)(),{t:u}=Ae(),d=(0,r.usePreviewMode)(),[f,p]=(0,t.useState)(null),[m,h]=(0,t.useState)([]),[g,_]=(0,t.useState)({}),[v,y]=(0,t.useState)(!0),[b,x]=(0,t.useState)(null),[S,C]=(0,t.useState)(!1),[T,E]=(0,t.useState)(!1),[D,O]=(0,t.useState)(!1),k=(0,t.useRef)(!1),A=e.confirmOnDiscard!==!1,j=e.open!==!1,M=e.drawerSide||`right`,N=(0,t.useId)(),[P,F]=(0,t.useState)(()=>{let t={};return e.sections?.forEach((e,n)=>{let r=e.name||String(n);e.collapsed&&(t[r]=!0)}),t});(0,t.useEffect)(()=>{(async()=>{if(!n){y(!1);return}try{let t=await n.getObjectSchema(e.objectName);p(t)}catch(e){x(e),y(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(f||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){_(e.initialData||e.initialValues||{}),y(!1);return}if(!n){_(e.initialData||e.initialValues||{}),y(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);_(t||{})}catch(e){x(e)}finally{y(!1)}})()},[f,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let I=(0,t.useCallback)(t=>w(t,{objectSchema:f,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:l}),[f,e.readOnly,e.mode,e.objectName,l]);(0,t.useEffect)(()=>{if(!f&&n)return;if(e.customFields?.length){h(e.customFields),y(!1);return}if(e.sections?.length){y(!1);return}if(!f)return;let t=e.fields||Object.keys(f.fields||{}),r=[];for(let n of t){let t=typeof n==`string`?n:n.name;if(!t)continue;let a=f.fields?.[t];a&&r.push({name:t,label:l(e.objectName,t,a.label||t),type:(0,i.mapFieldTypeToFormType)(a.type),required:a.required||!1,disabled:e.readOnly||e.mode===`view`||a.readonly,placeholder:a.placeholder,description:a.help||a.description,validation:(0,i.buildValidationRules)(a),field:a,options:a.options,multiple:a.multiple})}h(r),y(!1)},[f,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let L=(0,t.useCallback)(async t=>{O(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=ee(t,f);return e.mode===`create`?r=await n.create(e.objectName,i):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,i)),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{O(!1)}},[e,n,f]),R=(0,t.useCallback)(()=>{E(!1),k.current&&(k.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),z=(0,t.useCallback)(e=>{k.current=e,A&&S?E(!0):R()},[A,S,R]),B=(0,t.useCallback)(()=>{k.current=!0,R()},[R]),V=(0,t.useMemo)(()=>{if(e.drawerWidth)return M===`left`||M===`right`?{width:e.drawerWidth,maxWidth:e.drawerWidth}:{height:e.drawerWidth,maxHeight:e.drawerWidth}},[e.drawerWidth,M]),U=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,W=e.showSubmit!==!1&&e.mode!==`view`,G=e.showCancel!==!1,K=e.submitText||(e.mode===`create`?`Create`:`Update`),q=e.cancelText||`Cancel`,J={type:`form`,objectName:e.objectName,layout:U,defaultValues:g,submitLabel:K,cancelLabel:q,showSubmit:W,showCancel:G,onSubmit:L,onCancel:B,onDirtyChange:C,showActions:!1,id:N},Y=()=>{if(b)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:b.message})]});if(v)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(e.sections?.length){let t=[];return e.sections.forEach((e,n)=>{let r=e.name||String(n),i=P[r]??e.collapsed??!1;t.push({name:`__section_${r}`,label:e.label||``,type:`section-divider`,colSpan:4,collapsible:e.collapsible,collapsed:i,onToggle:e.collapsible?()=>F(e=>({...e,[r]:!i})):void 0,className:e.className});let a=I(e);i?t.push(...a.map(e=>({...e,hidden:!0}))):t.push(...a)}),(0,c.jsx)(r.SchemaRenderer,{schema:{...J,fields:t}})}let t=H(m,f,e.columns,e.mode),n=ke[t.columns||1];return(0,c.jsx)(r.SchemaRenderer,{schema:{...J,fields:t.fields,columns:t.columns,...n?{fieldContainerClass:n}:{}}})},X=e.subforms,Z=X?.length&&e.mode!==`view`?(0,c.jsx)(Oe,{schema:{type:`object-master-detail-form`,objectName:e.objectName,mode:e.mode===`edit`?`edit`:`create`,recordId:e.recordId,fields:e.fields,sections:e.sections,submitText:e.submitText,cancelText:q,details:X,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n}):Y();return d?(0,c.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,c.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,c.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),Z]}):(0,c.jsx)(a.Sheet,{open:j,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}z(!1)},children:(0,c.jsxs)(a.SheetContent,{side:M,className:(0,a.cn)(`overflow-y-auto`,o,e.className),style:V,children:[(e.title||e.description)&&(0,c.jsxs)(a.SheetHeader,{children:[e.title&&(0,c.jsx)(a.SheetTitle,{children:e.title}),e.description?(0,c.jsx)(a.SheetDescription,{children:e.description}):(0,c.jsx)(a.SheetDescription,{className:`sr-only`,children:`Complete the form fields, then submit or cancel.`})]}),(0,c.jsx)(`div`,{className:`@container py-4`,children:Z}),!b&&!v&&!(X?.length&&e.mode!==`view`)&&(W||G)&&(0,c.jsx)(`div`,{className:`shrink-0 border-t px-4 py-3 bg-background`,"data-testid":`drawer-form-footer`,children:(0,c.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[G&&(0,c.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:B,disabled:D,className:`w-full sm:w-auto`,children:q}),W&&(0,c.jsxs)(a.Button,{type:`submit`,form:N,disabled:D,className:`w-full sm:w-auto`,children:[D&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),K]})]})}),(0,c.jsx)(a.AlertDialog,{open:T,onOpenChange:E,children:(0,c.jsxs)(a.AlertDialogContent,{children:[(0,c.jsxs)(a.AlertDialogHeader,{children:[(0,c.jsx)(a.AlertDialogTitle,{children:u(`form.discardTitle`)}),(0,c.jsx)(a.AlertDialogDescription,{children:u(`form.discardMessage`)})]}),(0,c.jsxs)(a.AlertDialogFooter,{children:[(0,c.jsx)(a.AlertDialogCancel,{onClick:()=>{k.current=!1},children:u(`form.keepEditing`)}),(0,c.jsx)(a.AlertDialogAction,{onClick:R,children:u(`form.discard`)})]})]})})]})})};function Me(e,t){let n=(0,u.deriveFieldGroupLayout)({fieldGroups:t,fields:Object.fromEntries(e.map(e=>[e.name,{group:e.group}]))});if(!n)return null;let r=new Set(n.flatMap(e=>e.fields)),i=e.map(e=>e.name).filter(e=>!r.has(e)),a=n.map(e=>({...e.key===void 0?{}:{name:e.key},...e.key===void 0?{}:{label:e.label??e.key},fields:[...e.fields],...e.collapse===`none`?{}:{collapsible:!0},...e.collapse===`collapsed`?{collapsed:!0}:{}}));if(i.length>0){let e=a[a.length-1];e&&e.name===void 0?e.fields=[...e.fields??[],...i]:a.push({fields:i})}return a}var Ne=(0,l.createSafeTranslation)({"form.discardTitle":`Discard changes?`,"form.discardMessage":`You have unsaved changes. If you close this form now, your edits will be lost.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`},`form.discardTitle`),Pe={sm:`sm:max-w-sm`,default:`sm:max-w-lg`,lg:`sm:max-w-2xl`,xl:`sm:max-w-5xl`,full:`sm:max-w-[95vw] sm:w-full`},Fe=({schema:e,dataSource:n,className:l})=>{let{fieldLabel:u,sectionLabel:d}=(0,r.useSafeFieldLabel)(),{t:f}=Ne(),p=(0,r.usePreviewMode)(),m=(0,o.usePermissions)(),h=(0,t.useCallback)(t=>{if(!m?.isLoaded)return t;let n=[];for(let r of t){if(!r?.name){n.push(r);continue}m.checkField(e.objectName,r.name,`read`)&&(!m.checkField(e.objectName,r.name,`write`)&&e.mode!==`view`?n.push({...r,readOnly:!0,disabled:!0}):n.push(r))}return n},[m,e.objectName,e.mode]),[g,_]=(0,t.useState)(null),[v,y]=(0,t.useState)([]),[x,S]=(0,t.useState)({}),[C,T]=(0,t.useState)(!0),[E,D]=(0,t.useState)(null),[O,k]=(0,t.useState)(!1),[j,M]=(0,t.useState)(!1),[P,I]=(0,t.useState)(!1),z=(0,t.useRef)(!1),U=e.confirmOnDiscard!==!1,W=e.open!==!1,G=(0,t.useId)(),K=(0,t.useMemo)(()=>{if(e.sections?.length||e.customFields?.length)return null;let t=F(v,g);e.mode===`create`&&(t=L(t,g));let n=Me(t,g?.fieldGroups);if(!n)return null;let r=e.columns&&e.columns>0?Math.min(Math.floor(e.columns),4):A(t.length);return n.map(e=>({...e,columns:r}))},[e.sections,e.customFields,e.columns,e.mode,v,g]),q=e.sections?.length?e.sections:K??void 0,J=(0,t.useMemo)(()=>q?.length||e.customFields?.length?null:H(v,g,e.columns,e.mode),[v,g,e.columns,e.mode,q,e.customFields]),Y=Pe[(0,t.useMemo)(()=>{if(e.modalSize)return e.modalSize;if(J?.columns&&J.columns>1)return V(J.columns);if(q?.length){let e=Math.max(...q.map(e=>Number(e.columns)||1));if(e>1)return V(e)}return`default`},[e.modalSize,J,q])]||Pe.default;(0,t.useEffect)(()=>{(async()=>{if(!n){T(!1);return}try{let t=await n.getObjectSchema(e.objectName);_(t)}catch(e){D(e),T(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(g||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){S(e.initialData||e.initialValues||{}),T(!1);return}if(!n){S(e.initialData||e.initialValues||{}),T(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);S(t||{})}catch(e){D(e)}finally{T(!1)}})()},[g,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let X=(0,t.useCallback)(t=>w(t,{objectSchema:g,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:u}),[g,e.readOnly,e.mode,e.objectName,u]);(0,t.useEffect)(()=>{if(!g&&n)return;if(e.customFields?.length){y(e.customFields),T(!1);return}if(e.sections?.length){T(!1);return}if(!g)return;let t=e.fields||Object.keys(g.fields||{}),r=[];for(let n of t){let t=typeof n==`string`?n:n.name;if(!t)continue;let a=g.fields?.[t];a&&r.push({name:t,label:u(e.objectName,t,a.label||t),type:(0,i.mapFieldTypeToFormType)(a.type),required:a.required||!1,disabled:e.readOnly||e.mode===`view`||a.readonly,placeholder:a.placeholder,description:a.help||a.description,validation:(0,i.buildValidationRules)(a),field:a,options:a.options,multiple:a.multiple,visibleWhen:a.visibleWhen,readonlyWhen:a.readonlyWhen,requiredWhen:a.requiredWhen??a.conditionalRequired,group:a.group})}y(r),T(!1)},[g,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let Z=(0,t.useCallback)(async t=>{k(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=ee(t,g);if(m?.isLoaded){let t={};for(let n of Object.keys(i))m.checkField(e.objectName,n,`write`)&&(t[n]=i[n]);i=t}return e.mode===`create`?r=await n.create(e.objectName,i):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,i)),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{k(!1)}},[e,n,g,m]),Q=(0,t.useCallback)(()=>{I(!1),z.current&&(z.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),te=(0,t.useCallback)(e=>{z.current=e,U&&j?I(!0):Q()},[U,j,Q]),ne=(0,t.useCallback)(()=>{z.current=!0,Q()},[Q]),re=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,ie=e.showSubmit!==!1&&e.mode!==`view`,ae=e.showCancel!==!1,oe=e.submitText||(e.mode===`create`?`Create`:`Update`),se=e.cancelText||`Cancel`,$={type:`form`,objectName:e.objectName,layout:re,defaultValues:x,submitLabel:oe,cancelLabel:se,showSubmit:ie,showCancel:ae,onSubmit:Z,onCancel:ne,onDirtyChange:M,showActions:!1,id:G},ce=()=>{if(E)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:E.message})]});if(C)return(0,c.jsx)(`div`,{className:`space-y-4`,"data-testid":`modal-form-skeleton`,children:[1,2,3].map(e=>(0,c.jsxs)(`div`,{className:`space-y-2`,children:[(0,c.jsx)(a.Skeleton,{className:`h-4 w-24`}),(0,c.jsx)(a.Skeleton,{className:`h-10 w-full`})]},e))});if(e.sections?.length){let t=e.sections,n=(e,t)=>e.name||e.label||String(t),i=t=>t.name?d(e.objectName,t.name,t.label||t.name):t.label,o=e=>(0,c.jsx)(r.SchemaRenderer,{schema:{...$,...B(h(X(e)),e.columns||1)}});return e.contentLayout===`tabbed`&&t.length>1?(0,c.jsxs)(a.Tabs,{defaultValue:n(t[0],0),className:`w-full`,children:[(0,c.jsx)(a.TabsList,{className:`mb-4`,children:t.map((e,t)=>(0,c.jsx)(a.TabsTrigger,{value:n(e,t),children:i(e)||`Section ${t+1}`},n(e,t)))}),t.map((e,t)=>(0,c.jsx)(a.TabsContent,{value:n(e,t),children:(0,c.jsx)(b,{description:e.description,columns:1,className:e.className,gridClassName:e.gridClassName,children:o(e)})},n(e,t)))]}):(0,c.jsx)(`div`,{className:`space-y-6`,children:t.map((e,t)=>(0,c.jsx)(b,{label:i(e),description:e.description,columns:1,className:e.className,gridClassName:e.gridClassName,children:o(e)},n(e,t)))})}if(K?.length){let t=Number(K[0]?.columns)||1,n=[];K.forEach((r,i)=>{let a=h(X(r));if(!a.length)return;let o=r.name?d(e.objectName,r.name,r.label||r.name):r.label;o&&n.push({name:`__section_${r.name||i}`,label:o,type:`section-divider`}),n.push(...t>1?N(a,t):a)});let i=R[t];return(0,c.jsx)(r.SchemaRenderer,{schema:{...$,fields:n,columns:t,...i?{fieldContainerClass:i}:{}}})}let t=J??H(v,g,e.columns,e.mode),n=R[t.columns||1];return(0,c.jsx)(r.SchemaRenderer,{schema:{...$,fields:h(t.fields),columns:t.columns,...n?{fieldContainerClass:n}:{}}})},le=e.subforms;if(p)return(0,c.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,c.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,c.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),ce()]});if(le?.length&&e.mode!==`view`)return(0,c.jsx)(a.Dialog,{open:W,onOpenChange:e.onOpenChange,children:(0,c.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(Y,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,l,e.className),children:[(e.title||e.description)&&(0,c.jsxs)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,c.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,c.jsx)(a.DialogDescription,{children:e.description}):(0,c.jsx)(a.DialogDescription,{className:`sr-only`,children:`Enter the record and its line items, then save.`})]}),(0,c.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:(0,c.jsx)(Oe,{schema:{type:`object-master-detail-form`,objectName:e.objectName,mode:e.mode===`edit`?`edit`:`create`,recordId:e.recordId,fields:e.fields,sections:e.sections,initialValues:e.initialValues,initialData:e.initialData,submitText:oe,cancelText:se,details:le,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n})})]})});let ue=!C&&!E&&(ie||ae);return(0,c.jsx)(a.Dialog,{open:W,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}te(!1)},children:(0,c.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(Y,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,l,e.className),children:[(e.title||e.description)&&(0,c.jsxs)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,c.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,c.jsx)(a.DialogDescription,{children:e.description}):(0,c.jsx)(a.DialogDescription,{className:`sr-only`,children:`Complete the form fields, then submit or cancel.`})]}),(0,c.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:ce()}),ue&&(0,c.jsx)(`div`,{className:`shrink-0 border-t px-4 sm:px-6 py-3 bg-background`,"data-testid":`modal-form-footer`,children:(0,c.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[ae&&(0,c.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:ne,disabled:O,className:`w-full sm:w-auto`,children:se}),ie&&(0,c.jsxs)(a.Button,{type:`submit`,form:G,disabled:O,className:`w-full sm:w-auto`,children:[O&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),oe]})]})}),(0,c.jsx)(a.AlertDialog,{open:P,onOpenChange:I,children:(0,c.jsxs)(a.AlertDialogContent,{children:[(0,c.jsxs)(a.AlertDialogHeader,{children:[(0,c.jsx)(a.AlertDialogTitle,{children:f(`form.discardTitle`)}),(0,c.jsx)(a.AlertDialogDescription,{children:f(`form.discardMessage`)})]}),(0,c.jsxs)(a.AlertDialogFooter,{children:[(0,c.jsx)(a.AlertDialogCancel,{onClick:()=>{z.current=!1},children:f(`form.keepEditing`)}),(0,c.jsx)(a.AlertDialogAction,{onClick:Q,children:f(`form.discard`)})]})]})})]})})},Ie=({schema:e,dataSource:n})=>{let i=(0,o.usePermissions)(),a=(0,t.useMemo)(()=>{let t=e.groups,n=!e.sections?.length&&Array.isArray(t)&&t.length?{...e,sections:t.map(e=>({label:e.title??e.label,description:e.description,collapsible:e.collapsible,collapsed:e.defaultCollapsed??e.collapsed,fields:e.fields??[]}))}:e;if(!i?.isLoaded)return n;let r=e=>e?.name?i.checkField(n.objectName,e.name,`read`)?!i.checkField(n.objectName,e.name,`write`)&&n.mode!==`view`?{...e,readOnly:!0,disabled:!0}:e:null:e,a=e=>Array.isArray(e)?e.map(r).filter(Boolean):e;return{...n,fields:a(n.fields),sections:n.sections?.map(e=>({...e,fields:a(e.fields)}))}},[e,i]),{sectionLabel:s}=(0,r.useSafeFieldLabel)(),l=e=>e?.name?s(a.objectName,e.name,e.label||e.name):e?.label;if(a.subforms?.length&&a.mode!==`view`&&a.formType!==`drawer`&&a.formType!==`modal`)return(0,c.jsx)(Oe,{schema:{type:`object-master-detail-form`,objectName:a.objectName,mode:a.mode===`edit`?`edit`:`create`,recordId:a.recordId,initialValues:a.initialValues,initialData:a.initialData,formType:a.formType===`tabbed`?`tabbed`:`simple`,sections:a.sections,fields:a.fields,title:a.title,submitText:a.submitText,cancelText:a.cancelText,showSubmit:a.showSubmit,details:a.subforms,onSuccess:a.onSuccess,onError:a.onError,onCancel:a.onCancel,className:a.className},dataSource:n});if(a.formType===`tabbed`&&a.sections?.length)return(0,c.jsx)(U,{schema:{...a,formType:`tabbed`,sections:a.sections.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),defaultTab:a.defaultTab,tabPosition:a.tabPosition},dataSource:n,className:a.className});if(a.formType===`wizard`&&a.sections?.length)return(0,c.jsx)(W,{schema:{...a,formType:`wizard`,sections:a.sections.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),allowSkip:a.allowSkip,showStepIndicator:a.showStepIndicator,nextText:a.nextText,prevText:a.prevText,onStepChange:a.onStepChange},dataSource:n,className:a.className});if(a.formType===`split`&&a.sections?.length)return(0,c.jsx)(G,{schema:{...a,formType:`split`,sections:a.sections.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),splitDirection:a.splitDirection,splitSize:a.splitSize,splitResizable:a.splitResizable},dataSource:n,className:a.className});if(a.formType===`drawer`){let{layout:e,...t}=a,r=a.layout===`vertical`||a.layout===`horizontal`?a.layout:void 0;return(0,c.jsx)(je,{schema:{...t,layout:r,formType:`drawer`,sections:a.sections?.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,collapsible:e.collapsible,collapsed:e.collapsed,className:e.className})),open:a.open,onOpenChange:a.onOpenChange,drawerSide:a.drawerSide,drawerWidth:a.drawerWidth},dataSource:n,className:a.className})}if(a.formType===`modal`){let{layout:e,...t}=a,r=a.layout===`vertical`||a.layout===`horizontal`?a.layout:void 0;return(0,c.jsx)(Fe,{schema:{...t,layout:r,formType:`modal`,sections:a.sections?.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),open:a.open,onOpenChange:a.onOpenChange,modalSize:a.modalSize,modalCloseButton:a.modalCloseButton},dataSource:n,className:a.className})}return(0,c.jsx)(Le,{schema:a,dataSource:n})},Le=({schema:e,dataSource:n})=>{let{fieldLabel:s,sectionLabel:l}=(0,r.useSafeFieldLabel)(),u=(0,a.useIsMobile)(),d=(0,o.usePermissions)(),f=(0,t.useCallback)(t=>{if(!d?.isLoaded)return t;let n=[];for(let r of t)d.checkField(e.objectName,r.name,`read`)&&(!d.checkField(e.objectName,r.name,`write`)&&e.mode!==`view`?n.push({...r,readOnly:!0,disabled:!0,description:r.description??`You do not have edit access to this field.`}):n.push(r));return n},[d,e.objectName,e.mode]),[p,m]=(0,t.useState)(null),[h,g]=(0,t.useState)([]),[_,b]=(0,t.useState)(null),[x,S]=(0,t.useState)(!0),[C,w]=(0,t.useState)(null),[T,E]=(0,t.useState)(null),D=e.customFields&&e.customFields.length>0;(0,t.useEffect)(()=>{D&&(b(e.initialData||e.initialValues||{}),S(!1))},[D,e.initialData,e.initialValues]),(0,t.useEffect)(()=>{D?m({name:e.objectName,fields:{}}):e.objectName&&n?(async()=>{try{if(!n)throw Error(`DataSource is required when using ObjectQL schema fetching (inline fields not provided)`);let t=await n.getObjectSchema(e.objectName);if(!t)throw Error(`No schema found for object "${e.objectName}"`);m(t)}catch(e){w(e),S(!1)}})():D||S(!1)},[e.objectName,n,D]),(0,t.useEffect)(()=>{p&&!D&&(async()=>{if(!e.recordId||e.mode===`create`){b(e.initialData||e.initialValues||{}),S(!1);return}if(!D){if(!n){w(Error(`DataSource is required for fetching record data (inline data not provided)`)),S(!1);return}S(!0);try{let t=await n.findOne(e.objectName,e.recordId);b(t)}catch(e){console.error(`Failed to fetch record:`,e),w(e)}finally{S(!1)}}})()},[e.objectName,e.recordId,e.mode,e.initialValues,e.initialData,n,p,D]);let O=(0,t.useCallback)(e=>e,[]);(0,t.useEffect)(()=>{if(D&&e.customFields){g(e.customFields.map(O)),S(!1);return}if(!p)return;let t=[],r=!!p?.managedBy&&p.managedBy!==`platform`,a=e.mode===`edit`?p?.userActions?.edit===!0:e.mode===`create`&&p?.userActions?.create===!0,o=r&&!a,c=e.fields||Object.keys(p.fields||{});(Array.isArray(c)?c:Object.keys(c)).forEach(n=>{let r=typeof n==`string`?n:n.name;if(!r)return;let a=p.fields?.[r];if(!a&&!D)return;let c=!a?.permissions||a?.permissions.write!==!1;if(e.mode!==`view`&&!c)return;let l=e.customFields?.find(e=>e.name===r);if(l)t.push(O(l));else if(a){let c={name:r,label:s(e.objectName,r,a.label||n),type:(0,i.mapFieldTypeToFormType)(a.type),required:a.required||!1,disabled:e.readOnly||e.mode===`view`||a.readonly||o,placeholder:a.placeholder,description:a.help||a.description,validation:(0,i.buildValidationRules)(a),visibleWhen:a.visibleWhen,readonlyWhen:a.readonlyWhen,requiredWhen:a.requiredWhen??a.conditionalRequired,group:a.group,field:a,widget:a.widget};if((a.type===`select`||a.type===`lookup`||a.type===`master_detail`)&&(c.options=a.options||[],c.multiple=a.multiple),(a.type===`number`||a.type===`currency`||a.type===`percent`)&&(c.inputType=`number`,c.min=a.min,c.max=a.max,c.step=a.precision?10**-a.precision:void 0),a.type===`date`&&(c.inputType=`date`),a.type===`datetime`&&(c.inputType=`datetime-local`),(a.type===`text`||a.type===`textarea`||a.type===`markdown`||a.type===`html`)&&(c.maxLength=a.max_length,c.minLength=a.min_length),(a.type===`file`||a.type===`image`)&&(c.inputType=`file`,c.multiple=a.multiple,c.accept=a.accept?a.accept.join(`,`):void 0,a.max_size)){let e=`Max size: ${(0,i.formatFileSize)(a.max_size)}`;c.description=c.description?`${c.description} (${e})`:e}a.type===`email`&&(c.inputType=`email`),a.type===`phone`&&(c.inputType=`tel`),a.type===`url`&&(c.inputType=`url`),a.type===`password`&&(c.inputType=`password`),a.type===`time`&&(c.inputType=`time`),(a.type===`formula`||a.type===`summary`||a.type===`auto_number`)&&(c.disabled=!0),a.visible_on&&(c.visibleOn=a.visible_on),t.push(c)}}),g(t),!D&&e.recordId&&e.mode!==`create`&&n||S(!1)},[p,e.fields,e.customFields,e.readOnly,e.mode,D,e.recordId,n]);let k=(0,t.useCallback)(async(t,r)=>{if(t&&(t.nativeEvent||t._reactName===`onSubmit`)&&(console.warn(`ObjectForm: Received Event instead of data in handleSubmit! This suggests a Form renderer issue.`),r===void 0&&(t={})),D&&!n)return e.onSuccess&&await e.onSuccess(t),t;if(!n)throw Error(`DataSource is required for form submission (inline mode not configured)`);let i=ee(t,D?null:p);if(d?.isLoaded&&i&&typeof i==`object`){let t={};for(let n of Object.keys(i))d.checkField(e.objectName,n,`write`)&&(t[n]=i[n]);i=t}try{let t;if(e.submitHandler)t=await e.submitHandler(i);else if(e.mode===`create`)t=await n.create(e.objectName,i);else if(e.mode===`edit`&&e.recordId)t=await n.update(e.objectName,e.recordId,i);else throw Error(`Invalid form mode or missing record ID`);if(e.onSuccess)await e.onSuccess(t);else if(!e.submitHandler&&e.submitBehavior){let t=e.submitBehavior;switch(t.kind){case`redirect`:v(t.url)&&setTimeout(()=>window.location.assign(t.url),t.delayMs??0);break;case`continue`:break;default:{let n=t.kind===`thank-you`&&t.message?t.message:e.successMessage||(e.mode===`create`?`Created`:`Saved`);a.toast.success(n),E({title:t.kind===`thank-you`?t.title:void 0,message:n});break}}}else if(!e.submitHandler){let n=y(e.navigateOnSuccess,t);if(n)return window.location.assign(n),t;a.toast.success(e.successMessage||(e.mode===`create`?`Created`:`Saved`))}return t}catch(t){throw console.error(`Failed to submit form:`,t),e.onError&&e.onError(t),t}},[e,n,D,d,p]),j=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),M={...t.default.useMemo(()=>{if(!p?.fields)return{};let e={};return Object.keys(p.fields).forEach(t=>{let n=p.fields[t];n.defaultValue!==void 0&&(e[t]=n.defaultValue)}),e},[p]),..._},P=t.default.useMemo(()=>{let t=F(h,p);return e.mode===`create`&&(t=L(t,p)),t},[h,p,e.mode]),I=t.default.useMemo(()=>e.sections?.length?null:Me(P,p?.fieldGroups),[e.sections,P,p]),R=e.sections?.length?e.sections:I,[B,V]=(0,t.useState)({});if(C)return(0,c.jsxs)(`div`,{className:`p-3 sm:p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:C.message})]});if(x)return(0,c.jsxs)(`div`,{className:`p-4 sm:p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(T)return(0,c.jsxs)(`div`,{className:`rounded-md border bg-card p-6 sm:p-8 text-center`,children:[(0,c.jsx)(`h3`,{className:`text-lg font-semibold`,children:T.title??`Thanks!`}),T.message&&(0,c.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:T.message})]});let U=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`;if(R?.length&&(!e.formType||e.formType===`simple`)){let t=I?P:h,n=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,i=R.map(e=>n(e.columns)).filter(e=>e!=null),a=R.reduce((e,t)=>e+(Array.isArray(t.fields)?t.fields.length:0),0),o=n(e.columns)??(i.length?Math.max(...i):A(a)),s=[];R.forEach((r,i)=>{let a=new Map(r.fields.map(e=>[typeof e==`string`?e:e.field??e.name,e])),c=Array.from(a.keys()),u=f(t.filter(e=>c.includes(e.name))).map(e=>{let t=a.get(e.name);if(!t||typeof t!=`object`)return e;let n=t,r={...e};return n.visibleOn!=null&&(r.visibleOn=n.visibleOn),n.colSpan!=null&&(r.colSpan=n.colSpan),n.span!=null&&(r.span=n.span),r});if(u.length===0)return;let d=r.name||r.label||String(i),p=r.name?l(e.objectName,r.name,r.label||r.name):r.label,m=B[d]??r.collapsed??!1;p&&s.push({name:`__section_${d}`,label:p,type:`section-divider`,colSpan:4,collapsible:r.collapsible,collapsed:m,onToggle:r.collapsible?()=>V(e=>({...e,[d]:!m})):void 0,className:r.className});let h=n(r.columns),g=o>1?N(u,o,h):u;p&&m?s.push(...g.map(e=>({...e,hidden:!0}))):s.push(...g)});let u=s,d=z(o);return(0,c.jsx)(`div`,{className:`w-full @container`,children:(0,c.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:u,layout:U,columns:o,...d?{fieldContainerClass:d}:{},defaultValues:M,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,onSubmit:k,onCancel:j}})})}let G=e.sections?.length,K=f(h),q=G?{fields:K,columns:e.columns}:H(K,p,e.columns,e.mode),J=e.mobile,Y=J?.fullscreenLongText?q.fields.map(e=>{let t=e.type;return t===`textarea`||t===`field:textarea`||t===`string-multiline`||t===`field:markdown`||t===`field:html`?{...e,mobile_fullscreen:!0}:e}):q.fields,X=J?.stepper,Z=J?.stepperMinFields??8,Q=Math.max(1,J?.stepperFieldsPerStep??1);if(!e.formType&&!G&&Y.length>=2&&(X===!0||X===`auto`&&u&&Y.length>=Z)){let t=Y,r=[];for(let e=0;e<t.length;e+=Q){let n=t.slice(e,e+Q);r.push({name:`step-${Math.floor(e/Q)+1}`,label:n[0]?.label||n[0]?.name||`Step ${Math.floor(e/Q)+1}`,fields:n})}return(0,c.jsx)(W,{schema:{...e,formType:`wizard`,sections:r,showStepIndicator:!0},dataSource:n,className:e.className})}let te={type:`form`,objectName:e.objectName,fields:Y,layout:U,columns:q.columns,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,resetOnSubmit:e.showReset||e.submitBehavior?.kind===`continue`||!e.submitBehavior&&e.resetOnSuccess&&e.mode===`create`,defaultValues:M,onSubmit:k,onCancel:j,className:e.className,mobileStickyActions:!!J?.stickyActions};return(0,c.jsx)(`div`,{className:J?.stickyActions?`w-full pb-20 md:pb-0`:`w-full`,"data-mobile-form":J?`true`:void 0,children:(0,c.jsx)(r.SchemaRenderer,{schema:te})})},Re={text:200,email:254,url:2048,phone:32,textarea:5e3,markdown:5e3,html:5e3},ze=`_company_website_2`,Be=1500;function Ve(e,t=[]){try{let n=new URL(e,typeof window<`u`?window.location.href:`http://localhost`);return typeof window<`u`&&n.origin===window.location.origin?!0:n.protocol!==`https:`&&n.protocol!==`http:`?!1:t.some(e=>{if(e===n.host)return!0;if(e.startsWith(`*.`)){let t=e.slice(1);return n.host.endsWith(t)&&n.host.length>t.length}return!1})}catch{return!1}}function He(e){return e&&e.map(e=>{let t=Re[String(e.type||``).toLowerCase()];return!t||(e.maxLength??e.max_length)?e:{...e,maxLength:t}})}var Ue=({config:e,dataSource:n,prefillParams:r,className:i})=>{let[o,l]=(0,t.useState)(!1),[u,d]=(0,t.useState)(!1),[f,p]=(0,t.useState)(null),[m,h]=(0,t.useState)(!(e.consent?.required??!!e.consent)),[g,_]=(0,t.useState)(null),v=(0,t.useRef)(null),y=(0,t.useRef)(0);(0,t.useEffect)(()=>{o||(y.current=Date.now())},[o]);let b=e.honeypot===!1?null:e.honeypot||ze,x=e.minFillTime??Be,S=(0,t.useMemo)(()=>He(e.customFields),[e.customFields]),C=(0,t.useMemo)(()=>{if(!n||S&&S.length>0||!e.fields||e.fields.length===0)return;let t=async(e,t)=>t;return{...n,create:t,update:(e,t,n)=>Promise.resolve(n),delete:()=>Promise.reject(Error(`Not permitted on public form`))}},[n,S,e.fields]),w=(0,t.useMemo)(()=>{let t={};if(r)for(let[e,n]of Object.entries(r))t[e]=n;if(typeof window<`u`&&e.allowedPrefillFields?.length){let n=new Set(e.allowedPrefillFields);new URLSearchParams(window.location.search).forEach((e,r)=>{n.has(r)&&!(r in t)&&(t[r]=e)})}return Object.keys(t).length>0?t:void 0},[r,e.allowedPrefillFields]),T=(0,t.useCallback)(async t=>{if(e.consent?.required&&!m){_(e.texts?.consentRequired??`Please accept the privacy policy to continue.`);return}if(_(null),b&&v.current?.value){l(!0);return}if(x>0&&Date.now()-y.current<x){p(e.texts?.rateLimited??`Please take a moment to review your answers before submitting.`);return}let r={...t};b&&delete r[b],e.captchaToken&&(r._captcha=e.captchaToken),d(!0),p(null);try{n&&await n.create(e.objectName,r),l(!0);let t=e.thankYouPage?.redirectUrl;if(t)if(Ve(t,e.allowedRedirectHosts)){let n=e.thankYouPage?.redirectDelay??3e3;setTimeout(()=>{window.location.href=t},n)}else console.warn(`[EmbeddableForm] Blocked unsafe redirect target:`,t),p(e.texts?.redirectBlocked??null)}catch(e){p(e instanceof Error?e.message:`Failed to submit form. Please try again.`)}finally{d(!1)}},[n,e,m,b,x]),E=(0,t.useCallback)(()=>{l(!1),p(null)},[]),D=(0,t.useMemo)(()=>{let t={};return e.branding?.backgroundColor&&(t.backgroundColor=e.branding.backgroundColor),t},[e.branding]);if(o){let t=e.thankYouPage,n=e.texts??{},r=Math.ceil((t?.redirectDelay??3e3)/1e3),o=(n.redirecting??`Redirecting in {{seconds}} seconds…`).replace(`{{seconds}}`,String(r));return(0,c.jsx)(`div`,{className:`min-h-screen flex items-center justify-center p-4 bg-gradient-to-b from-muted/40 via-background to-background ${i||``}`,style:D,children:(0,c.jsxs)(`div`,{className:`max-w-md w-full bg-card border rounded-xl shadow-sm p-8 text-center space-y-4`,children:[(0,c.jsx)(`div`,{className:`mx-auto inline-flex h-14 w-14 items-center justify-center rounded-full bg-emerald-50 text-emerald-600 dark:bg-emerald-500/10 dark:text-emerald-400`,children:(0,c.jsx)(s.CheckCircle2,{className:`h-8 w-8`,"aria-hidden":`true`})}),(0,c.jsx)(`h2`,{className:`text-xl font-semibold text-foreground`,children:t?.title||n.thankYouTitle||`Thank You!`}),(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t?.message||n.thankYouMessage||`Your submission has been received successfully.`}),e.allowMultiple&&(0,c.jsx)(a.Button,{variant:`outline`,size:`sm`,onClick:E,className:`mt-2`,children:n.submitAnother??`Submit Another Response`}),t?.redirectUrl&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:o})]})})}let O=e.texts??{},k=!!e.consent?.required,A=`${e.formId}-consent`;return(0,c.jsx)(`div`,{className:`min-h-screen flex items-center justify-center p-4 sm:p-6 bg-gradient-to-b from-muted/40 via-background to-background ${i||``}`,style:D,children:(0,c.jsxs)(`div`,{className:`max-w-2xl w-full bg-card border rounded-xl shadow-sm overflow-hidden`,children:[e.branding?.coverImage&&(0,c.jsx)(`div`,{className:`h-28 sm:h-32 w-full bg-cover bg-center`,style:{backgroundImage:`url(${JSON.stringify(e.branding.coverImage)})`},role:`presentation`}),(0,c.jsxs)(`div`,{className:`px-6 sm:px-8 pt-7 pb-5 border-b bg-muted/20`,style:e.branding?.primaryColor?{borderBottomColor:e.branding.primaryColor}:void 0,children:[e.branding?.logo&&(0,c.jsx)(`img`,{src:e.branding.logo,alt:``,className:`h-8 mb-4`}),e.title&&(0,c.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight text-foreground`,children:e.title}),e.description&&(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2 leading-relaxed`,children:e.description}),(0,c.jsx)(`p`,{className:`text-[11px] text-muted-foreground/70 mt-3`,"aria-hidden":`true`,children:O.requiredHint??`* Required field`})]}),(0,c.jsxs)(`div`,{className:`relative px-6 sm:px-8 py-6`,children:[f&&(0,c.jsx)(`div`,{role:`alert`,"aria-live":`assertive`,className:`mb-4 p-3 bg-destructive/10 border border-destructive/30 rounded-md text-sm text-destructive`,children:f}),(0,c.jsx)(Ie,{schema:{type:`object-form`,objectName:e.objectName,mode:`create`,fields:e.fields,customFields:S,initialData:w,onSuccess:T,submitText:u?O.submitting??`Submitting...`:O.submit??`Submit`},dataSource:C}),b&&(0,c.jsxs)(`div`,{"aria-hidden":`true`,className:`absolute left-[-10000px] top-auto h-px w-px overflow-hidden`,children:[(0,c.jsx)(`label`,{htmlFor:`${e.formId}-${b}`,children:`Do not fill this field`}),(0,c.jsx)(`input`,{ref:v,id:`${e.formId}-${b}`,type:`text`,name:b,tabIndex:-1,autoComplete:`off`,defaultValue:``})]}),e.consent&&(0,c.jsxs)(`div`,{className:`mt-4`,children:[(0,c.jsxs)(`label`,{className:`flex items-start gap-2 text-sm text-foreground cursor-pointer select-none`,children:[(0,c.jsx)(`input`,{type:`checkbox`,id:A,checked:m,onChange:e=>{h(e.target.checked),e.target.checked&&_(null)},"aria-required":k||void 0,"aria-invalid":g?`true`:void 0,"aria-describedby":g?`${A}-error`:void 0,className:`mt-0.5 h-4 w-4 rounded border-input accent-primary`}),(0,c.jsxs)(`span`,{className:`leading-relaxed`,children:[e.consent.label??O.consentLabelDefault??`I agree to the privacy policy.`,k&&(0,c.jsx)(`span`,{"aria-hidden":`true`,className:`text-destructive ml-0.5`,children:`*`}),e.consent.privacyUrl&&(0,c.jsxs)(c.Fragment,{children:[` `,(0,c.jsx)(`a`,{href:e.consent.privacyUrl,target:`_blank`,rel:`noopener noreferrer`,className:`underline text-primary hover:opacity-80`,children:O.consentLink??`Privacy policy`})]})]})]}),g&&(0,c.jsx)(`p`,{id:`${A}-error`,role:`alert`,className:`mt-1.5 text-xs text-destructive`,children:g})]}),u&&(0,c.jsxs)(`div`,{className:`mt-3 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,c.jsx)(s.Loader2,{className:`h-3.5 w-3.5 animate-spin`,"aria-hidden":`true`}),(0,c.jsx)(`span`,{children:O.submitting??`Submitting…`})]})]}),(0,c.jsxs)(`div`,{className:`px-6 sm:px-8 py-4 border-t bg-muted/20 flex flex-col sm:flex-row items-center justify-between gap-2`,children:[(0,c.jsxs)(`p`,{className:`inline-flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,c.jsx)(s.Lock,{className:`h-3 w-3`,"aria-hidden":`true`}),(0,c.jsx)(`span`,{children:O.secureNotice??`Your information is transmitted securely and only used to respond to your request.`})]}),(0,c.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground/80`,children:[e.privacyPolicyUrl&&(0,c.jsxs)(`a`,{href:e.privacyPolicyUrl,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1 underline hover:text-foreground`,children:[(0,c.jsx)(s.ShieldCheck,{className:`h-3 w-3`,"aria-hidden":`true`}),O.consentLink??`Privacy policy`]}),(0,c.jsx)(`span`,{children:O.poweredBy??`Powered by ObjectStack`})]})]})]})})};function We(e){return e<60?`${Math.round(e)}s`:e<3600?`${Math.floor(e/60)}m ${Math.round(e%60)}s`:`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`}var Ge=({formId:e,formTitle:n,metrics:r,className:i})=>{let o=(0,t.useMemo)(()=>{if(!r.abandonedSubmissions)return 100;let e=r.totalSubmissions+r.abandonedSubmissions;return e===0?0:Math.round(r.totalSubmissions/e*100)},[r.totalSubmissions,r.abandonedSubmissions]),s=(0,t.useMemo)(()=>r.dailySubmissions?.length?Math.max(...r.dailySubmissions.map(e=>e.count),1):1,[r.dailySubmissions]);return(0,c.jsxs)(`div`,{className:`space-y-4 ${i||``}`,children:[(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`h2`,{className:`text-lg font-semibold text-foreground`,children:n||`Form Analytics`}),(0,c.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Form ID: `,e]})]}),(0,c.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-4`,children:[(0,c.jsx)(a.Card,{children:(0,c.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,c.jsx)(a.CardDescription,{children:`Total Submissions`}),(0,c.jsx)(a.CardTitle,{className:`text-2xl`,children:r.totalSubmissions.toLocaleString()})]})}),(0,c.jsxs)(a.Card,{children:[(0,c.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,c.jsx)(a.CardDescription,{children:`Fill Rate`}),(0,c.jsxs)(a.CardTitle,{className:`text-2xl`,children:[o,`%`]})]}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(`div`,{className:`w-full bg-muted rounded-full h-2`,children:(0,c.jsx)(`div`,{className:`bg-primary rounded-full h-2 transition-all`,style:{width:`${o}%`}})})})]}),(0,c.jsx)(a.Card,{children:(0,c.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,c.jsx)(a.CardDescription,{children:`Avg. Completion Time`}),(0,c.jsx)(a.CardTitle,{className:`text-2xl`,children:r.avgCompletionTime?We(r.avgCompletionTime):`—`})]})})]}),r.dailySubmissions&&r.dailySubmissions.length>0&&(0,c.jsxs)(a.Card,{children:[(0,c.jsx)(a.CardHeader,{children:(0,c.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Daily Submissions`})}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(`div`,{className:`flex items-end gap-1 h-32`,children:r.dailySubmissions.map((e,t)=>(0,c.jsxs)(`div`,{className:`flex-1 flex flex-col items-center gap-1`,children:[(0,c.jsx)(`div`,{className:`w-full bg-primary/80 rounded-t transition-all hover:bg-primary`,style:{height:`${e.count/s*100}%`,minHeight:e.count>0?`4px`:`0`},title:`${e.date}: ${e.count} submissions`}),(0,c.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate w-full text-center`,children:e.date.slice(-5)})]},t))})})]}),r.fieldDropOff&&r.fieldDropOff.length>0&&(0,c.jsxs)(a.Card,{children:[(0,c.jsxs)(a.CardHeader,{children:[(0,c.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Field Completion Rates`}),(0,c.jsx)(a.CardDescription,{children:`Percentage of users who completed each field`})]}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(`div`,{className:`space-y-3`,children:r.fieldDropOff.map((e,t)=>(0,c.jsxs)(`div`,{className:`space-y-1`,children:[(0,c.jsxs)(`div`,{className:`flex justify-between text-sm`,children:[(0,c.jsx)(`span`,{className:`text-foreground`,children:e.label}),(0,c.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.completionRate,`%`]})]}),(0,c.jsx)(`div`,{className:`w-full bg-muted rounded-full h-1.5`,children:(0,c.jsx)(`div`,{className:`rounded-full h-1.5 transition-all ${e.completionRate>=80?`bg-green-500`:e.completionRate>=50?`bg-yellow-500`:`bg-destructive`}`,style:{width:`${e.completionRate}%`}})})]},t))})})]})]})},Ke=({schema:e})=>{let n=(0,r.useSchemaContext)()?.dataSource,o=(0,r.useRecordContext)(),s=e.parentObject||o?.objectName,l=e.parentId||e.recordId||o?.recordId,[u,d]=(0,t.useState)([]),[f,p]=(0,t.useState)([]),[m,h]=(0,t.useState)(!0),[g,_]=(0,t.useState)(!1),[v,y]=(0,t.useState)(!1),[b,x]=(0,t.useState)(null),[S,C]=(0,t.useState)(null);(0,t.useEffect)(()=>{let t=n;if(!t||typeof t.getObjectSchema!=`function`)return;let r=!1;return t.getObjectSchema(e.childObject).then(e=>{r||C(e??null)}).catch(()=>{r||C(null)}),()=>{r=!0}},[n,e.childObject]);let w=(0,t.useCallback)(async()=>{if(!n||!l){h(!1);return}h(!0);try{let t=(await n.find(e.childObject,{$filter:{[e.relationshipField]:l},$top:500}))?.data??[];d(t.map(e=>({...e}))),p(t.map(e=>({...e}))),y(!1)}catch(e){x(e?.message||`Failed to load line items`)}finally{h(!1)}},[n,l,e.childObject,e.relationshipField]);(0,t.useEffect)(()=>{w()},[w]);let T=(0,t.useCallback)(e=>{d(e),y(!0)},[]),E=(0,t.useCallback)(async()=>{if(!(!n||!l)){_(!0),x(null);try{await oe(n,s||e.childObject,l,{childObject:e.childObject,relationshipField:e.relationshipField,rows:u,original:f,amountField:e.amountField,totalField:s?e.totalField:void 0,childSchema:S}),await w()}catch(e){x(e?.message||`Failed to save line items`)}finally{_(!1)}}},[n,l,u,f,e,s,w,S]),D=(0,t.useMemo)(()=>({columns:e.columns,total_field:e.totalField?e.amountField||`amount`:void 0,min_rows:e.minRows,max_rows:e.maxRows,allow_add:!e.readonly,allow_delete:!e.readonly}),[e]);return(0,c.jsxs)(a.Card,{className:(0,a.cn)(`shadow-none`),children:[(0,c.jsxs)(a.CardHeader,{className:`flex-row items-center justify-between gap-2 pb-2`,children:[(0,c.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:e.title||`Line Items`}),!e.readonly&&(0,c.jsx)(a.Button,{type:`button`,size:`sm`,onClick:E,disabled:g||m||!v||!l,children:g?`Saving…`:`Save`})]}),(0,c.jsxs)(a.CardContent,{children:[b&&(0,c.jsx)(`p`,{className:`mb-2 text-sm text-destructive`,children:b}),m?(0,c.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Loading…`}):l?(0,c.jsx)(i.LineItemsField,{value:u,onChange:T,field:D,readonly:e.readonly}):(0,c.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Save the record first to add line items.`})]})]})},qe=({schema:e})=>(0,c.jsx)(Ie,{schema:e,dataSource:(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0});n.ComponentRegistry.register(`object-form`,qe,{namespace:`plugin-form`,label:`Object Form`,category:`plugin`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`fields`,type:`array`,label:`Fields`},{name:`mode`,type:`enum`,label:`Mode`,enum:[`create`,`edit`,`view`]},{name:`formType`,type:`enum`,label:`Form Type`,enum:[`simple`,`tabbed`,`wizard`,`split`,`drawer`,`modal`]},{name:`sections`,type:`array`,label:`Sections`},{name:`title`,type:`string`,label:`Title`},{name:`description`,type:`string`,label:`Description`},{name:`layout`,type:`enum`,label:`Layout`,enum:[`vertical`,`horizontal`,`inline`,`grid`]},{name:`columns`,type:`number`,label:`Columns`},{name:`defaultTab`,type:`string`,label:`Default Tab`},{name:`tabPosition`,type:`enum`,label:`Tab Position`,enum:[`top`,`bottom`,`left`,`right`]},{name:`allowSkip`,type:`boolean`,label:`Allow Skip Steps`},{name:`showStepIndicator`,type:`boolean`,label:`Show Step Indicator`},{name:`splitDirection`,type:`enum`,label:`Split Direction`,enum:[`horizontal`,`vertical`]},{name:`splitSize`,type:`number`,label:`Split Panel Size (%)`},{name:`splitResizable`,type:`boolean`,label:`Split Resizable`},{name:`drawerSide`,type:`enum`,label:`Drawer Side`,enum:[`top`,`bottom`,`left`,`right`]},{name:`drawerWidth`,type:`string`,label:`Drawer Width`},{name:`modalSize`,type:`enum`,label:`Modal Size`,enum:[`sm`,`default`,`lg`,`xl`,`full`]}]}),n.ComponentRegistry.register(`form`,qe,{namespace:`view`,skipFallback:!0,label:`Data Form View`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`fields`,type:`array`,label:`Fields`},{name:`mode`,type:`enum`,label:`Mode`,enum:[`create`,`edit`,`view`]}]}),n.ComponentRegistry.register(`embeddable-form`,({schema:e})=>(0,c.jsx)(Ue,{config:e}),{namespace:`plugin-form`,label:`Embeddable Form`,category:`plugin`,inputs:[{name:`formId`,type:`string`,label:`Form ID`,required:!0},{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`title`,type:`string`,label:`Form Title`},{name:`description`,type:`string`,label:`Description`},{name:`fields`,type:`array`,label:`Fields`},{name:`allowMultiple`,type:`boolean`,label:`Allow Multiple Submissions`}]}),n.ComponentRegistry.register(`form-analytics`,({schema:e})=>(0,c.jsx)(Ge,{formId:e.formId,formTitle:e.formTitle,metrics:e.metrics||{totalSubmissions:0}}),{namespace:`plugin-form`,label:`Form Analytics`,category:`plugin`,inputs:[{name:`formId`,type:`string`,label:`Form ID`,required:!0},{name:`formTitle`,type:`string`,label:`Form Title`},{name:`metrics`,type:`object`,label:`Submission Metrics`}]}),n.ComponentRegistry.register(`object-master-detail-form`,({schema:e})=>(0,c.jsx)(Oe,{schema:e,dataSource:(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0}),{namespace:`plugin-form`,label:`Master-Detail Form`,category:`plugin`,inputs:[{name:`objectName`,type:`string`,label:`Parent Object`,required:!0},{name:`mode`,type:`enum`,label:`Mode`,enum:[`create`,`edit`]},{name:`sections`,type:`array`,label:`Parent Sections`},{name:`details`,type:`array`,label:`Detail Collections`,required:!0}]}),n.ComponentRegistry.register(`line_items`,({schema:e})=>(0,c.jsx)(Ke,{schema:e}),{namespace:`record`,skipFallback:!0,label:`Line Items`,category:`record`,inputs:[{name:`childObject`,type:`string`,label:`Child Object`,required:!0},{name:`relationshipField`,type:`string`,label:`Relationship Field`,required:!0},{name:`columns`,type:`array`,label:`Columns`,required:!0},{name:`totalField`,type:`string`,label:`Parent Total Field`},{name:`amountField`,type:`string`,label:`Amount Column`}]}),e.DrawerForm=je,e.EmbeddableForm=Ue,e.FormAnalytics=Ge,e.FormSection=b,e.LineItemsPanel=Ke,e.MasterDetailForm=Oe,e.ModalForm=Fe,e.ObjectForm=Ie,e.SplitForm=G,e.TabbedForm=U,e.WizardForm=W,e.applyAutoColSpan=N,e.applyAutoLayout=H,e.containerGridColsFor=z,e.deriveColumns=_e,e.deriveDetail=Te,e.deriveFormFields=be,e.filterAutoGeneratedFields=L,e.filterCreateModeFields=I,e.filterSystemFields=F,e.findRelationshipField=pe,e.inferColumns=A,e.inferModalSize=V,e.isAutoGeneratedFieldType=k,e.isWideFieldType=O,e.resolveInlineMode=Se});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/plugin-form",
3
- "version": "13.2.0",
3
+ "version": "14.1.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Form plugin for Object UI",
@@ -15,15 +15,15 @@
15
15
  }
16
16
  },
17
17
  "dependencies": {
18
- "@objectstack/spec": "^14.3.0",
19
- "lucide-react": "^1.22.0",
20
- "@object-ui/components": "13.2.0",
21
- "@object-ui/core": "13.2.0",
22
- "@object-ui/fields": "13.2.0",
23
- "@object-ui/i18n": "13.2.0",
24
- "@object-ui/permissions": "13.2.0",
25
- "@object-ui/react": "13.2.0",
26
- "@object-ui/types": "13.2.0"
18
+ "@objectstack/spec": "^14.6.0",
19
+ "lucide-react": "^1.24.0",
20
+ "@object-ui/components": "14.1.0",
21
+ "@object-ui/core": "14.1.0",
22
+ "@object-ui/fields": "14.1.0",
23
+ "@object-ui/i18n": "14.1.0",
24
+ "@object-ui/permissions": "14.1.0",
25
+ "@object-ui/react": "14.1.0",
26
+ "@object-ui/types": "14.1.0"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "react": "^18.0.0 || ^19.0.0",
@@ -31,11 +31,11 @@
31
31
  },
32
32
  "devDependencies": {
33
33
  "@vitejs/plugin-react": "^6.0.3",
34
- "msw": "^2.14.6",
34
+ "msw": "^2.15.0",
35
35
  "typescript": "^6.0.3",
36
- "vite": "^8.1.3",
36
+ "vite": "^8.1.4",
37
37
  "vite-plugin-dts": "^5.0.3",
38
- "@object-ui/data-objectstack": "13.2.0"
38
+ "@object-ui/data-objectstack": "14.1.0"
39
39
  },
40
40
  "keywords": [
41
41
  "objectui",