@object-ui/plugin-form 11.5.0 → 13.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,141 @@
1
1
  # @object-ui/plugin-form
2
2
 
3
+ ## 13.2.0
4
+
5
+ ### Patch Changes
6
+
7
+ - e492b9d: Permission sets — pure separation of **design** (Studio) and **assignment**
8
+ (Setup), per ADR-0056 / epic #2398. A `sys_permission_set` used to render its six
9
+ authorization facets in Setup as raw `[Object]` / JSON textareas, and only
10
+ objects+fields were editable in Studio; this reworks both surfaces.
11
+
12
+ **Setup (assign + read-only):**
13
+ - The six facets (`object_permissions`, `field_permissions`, `system_permissions`,
14
+ `row_level_security`, `tab_permissions`, `admin_scope`) now render read-only on
15
+ the `sys_permission_set` record page as a compact summary (counts, or capability
16
+ chips) plus a **“Design in Studio →”** deep-link into the structured editor
17
+ (`/apps/:appName/metadata/permission/:setName`, env scope). No `[Object]`, no
18
+ JSON — in the record view, inline edit, and the create/edit form. Implemented as
19
+ a `permission-facet-link` field widget stamped onto the six fields via the single
20
+ `ObjectStackAdapter.getObjectSchema` choke point and honored by DetailSection +
21
+ the record form.
22
+ - User assignment (add/remove via `sys_user_permission_set`) is surfaced directly
23
+ on the Setup record page.
24
+
25
+ **Studio (design every facet):** the permission matrix editor gains structured
26
+ editors for the facets that were JSON-only —
27
+ - **System Capabilities**: a multi-select over the live `sys_capability` registry
28
+ (scope-grouped, labelled chips).
29
+ - **Row-Level Security**: per-policy rows (object · operation · enabled) with CEL
30
+ USING/CHECK.
31
+ - **Tab Visibility**: per-tab `visible | hidden | default_on | default_off`.
32
+ - **Delegated Admin Scope**: business-unit + subtree, manage-assignments /
33
+ -bindings / author-env-sets toggles, and an assignable-permission-sets allowlist.
34
+ Assignment was moved out of the editor (it is now a Setup act) — the editor is
35
+ purely a design surface.
36
+
37
+ Storage/types are unchanged; editors read/write the draft’s existing parsed
38
+ fields and tolerate legacy JSON strings on load. Note: env-scope metadata saves of
39
+ these facets do not yet project onto the queryable `sys_permission_set` data
40
+ record the Setup summary reads, so a fresh Studio edit isn’t reflected in Setup’s
41
+ read-only view until the projection refreshes — tracked as a framework follow-up
42
+ (enforcement reads the authoritative metadata).
43
+
44
+ - 5da9905: fix(plugin-form): honor `userActions.edit` on managed objects instead of blanket-disabling every field (ADR-0092 D4)
45
+
46
+ `ObjectForm` disabled every field on any non-`platform` lifecycle bucket
47
+ (config / system / append-only / better-auth) — a defensive default from when
48
+ those objects had no generic edit affordance at all. Now that an object can
49
+ OPEN per-record editing via `userActions.{edit,create}` (framework ADR-0092 D4
50
+ — e.g. `sys_user` exposing its `name`/`image` profile fields), the blanket
51
+ lock lifts for the current mode when its affordance is `true`, and each
52
+ field's own `readonly` flag decides. Managed buckets still default the
53
+ affordance off, so an object that doesn't opt in is unchanged. The server-side
54
+ identity write guard remains the real boundary; this is UX only.
55
+
56
+ - Updated dependencies [80901aa]
57
+ - Updated dependencies [53c40c2]
58
+ - Updated dependencies [e492b9d]
59
+ - @object-ui/components@13.2.0
60
+ - @object-ui/i18n@13.2.0
61
+ - @object-ui/fields@13.2.0
62
+ - @object-ui/react@13.2.0
63
+ - @object-ui/types@13.2.0
64
+ - @object-ui/core@13.2.0
65
+ - @object-ui/permissions@13.2.0
66
+
67
+ ## 13.1.0
68
+
69
+ ### Patch Changes
70
+
71
+ - @object-ui/types@13.1.0
72
+ - @object-ui/core@13.1.0
73
+ - @object-ui/i18n@13.1.0
74
+ - @object-ui/react@13.1.0
75
+ - @object-ui/components@13.1.0
76
+ - @object-ui/fields@13.1.0
77
+ - @object-ui/permissions@13.1.0
78
+
79
+ ## 13.0.0
80
+
81
+ ### Patch Changes
82
+
83
+ - Updated dependencies [9e38270]
84
+ - Updated dependencies [ac04b76]
85
+ - Updated dependencies [619097e]
86
+ - @object-ui/i18n@13.0.0
87
+ - @object-ui/components@13.0.0
88
+ - @object-ui/types@13.0.0
89
+ - @object-ui/fields@13.0.0
90
+ - @object-ui/react@13.0.0
91
+ - @object-ui/core@13.0.0
92
+ - @object-ui/permissions@13.0.0
93
+
94
+ ## 12.1.0
95
+
96
+ ### Patch Changes
97
+
98
+ - 195121a: Studio form designer + preview now match the runtime form's column density.
99
+
100
+ The Data pillar's **Form → Layout** designer laid every section out in a fixed 2-column grid capped at `max-w-3xl`, and **Form → Preview** capped the real `ObjectForm` at `max-w-2xl`. So on a wide screen the studio showed at most 2 columns while the record the end user actually edits spreads to up to 4 — the design surface misrepresented the real layout.
101
+
102
+ `ObjectFormDesigner` now derives its column count the same way the runtime form does (`inferColumns` over the object's editable field count, objectui#2578) and lays each section out with the shared container-query grid classes (`containerGridColsFor`) inside a per-section `@container`, so a field-heavy object reaches 4 fields per row on wide screens and collapses to one column when the panel is narrow. Wide widgets (textarea/markdown/html/…) span the full row, mirroring the form. Both the layout and preview canvases were widened to `max-w-6xl` so the container queries can actually reach 4 columns. `containerGridColsFor` is now exported from `@object-ui/plugin-form` as the single source of truth for these grid classes.
103
+
104
+ - Updated dependencies [6cbccf3]
105
+ - Updated dependencies [e1840bf]
106
+ - Updated dependencies [c31874d]
107
+ - @object-ui/components@12.1.0
108
+ - @object-ui/fields@12.1.0
109
+ - @object-ui/i18n@12.1.0
110
+ - @object-ui/types@12.1.0
111
+ - @object-ui/react@12.1.0
112
+ - @object-ui/core@12.1.0
113
+ - @object-ui/permissions@12.1.0
114
+
115
+ ## 12.0.0
116
+
117
+ ### Minor Changes
118
+
119
+ - e4de456: Fix form section grouping inconsistencies found in a UX review of grouped forms:
120
+
121
+ - **Unified section visual language.** `FormSection`'s Card-wrapped path (used by Modal/Split/Tabbed/Wizard forms) previously rendered as a nearly-invisible white-on-white card (same `bg-card` as the page background, distinguished only by a barely-visible shadow) with a duplicated, inconsistent header (different title size, and a collapse chevron positioned differently) versus the flat `SectionDivider` path used by simple/drawer forms. Both now share the same header treatment (`text-sm font-semibold`, inline-left chevron, bottom border), and the Card path gets a soft `bg-muted/40` tint so grouped sections are visually distinguishable without relying on shadow alone.
122
+ - **`readonly` no longer renders as `disabled`.** A field marked `readonly` (statically or via `readonlyWhen`) was being folded into the `disabled` prop before reaching field widgets, so widgets with a dedicated readonly display (e.g. `EmailField`'s mailto link, `TextField`'s plain-text view) never received it — every readonly field just looked permanently disabled. `readonly` is now forwarded as its own prop; generic `input`/`textarea` fields get a distinct readonly style (`bg-muted/40`, no `cursor-not-allowed`) instead of the disabled look.
123
+ - **Section `className`/`gridClassName` now flow through JSON schemas.** `ObjectFormSection` and the per-form-variant section configs (`ModalFormSectionConfig`, `SplitFormSectionConfig`, `FormSectionConfig`, `DrawerFormSectionConfig`) accept `className` (and `gridClassName` where applicable), wired through `ObjectForm`'s form-type dispatch into `FormSection`/`SectionDivider` — closing a gap where section wrappers couldn't be customized from schema despite `FormSection` itself already supporting it.
124
+
125
+ ### Patch Changes
126
+
127
+ - Updated dependencies [226fde9]
128
+ - Updated dependencies [e36a9c7]
129
+ - Updated dependencies [e4de456]
130
+ - Updated dependencies [68e2d1c]
131
+ - @object-ui/types@12.0.0
132
+ - @object-ui/core@12.0.0
133
+ - @object-ui/components@12.0.0
134
+ - @object-ui/fields@12.0.0
135
+ - @object-ui/permissions@12.0.0
136
+ - @object-ui/react@12.0.0
137
+ - @object-ui/i18n@12.0.0
138
+
3
139
  ## 11.5.0
4
140
 
5
141
  ### Patch Changes
@@ -8,6 +8,8 @@ export interface DrawerFormSectionConfig {
8
8
  fields: (string | FormField)[];
9
9
  collapsible?: boolean;
10
10
  collapsed?: boolean;
11
+ /** Custom CSS class for the section's divider header. */
12
+ className?: string;
11
13
  }
12
14
  export interface DrawerFormSchema {
13
15
  type: 'object-form';
@@ -6,6 +6,10 @@ export interface ModalFormSectionConfig {
6
6
  description?: string;
7
7
  columns?: 1 | 2 | 3 | 4;
8
8
  fields: (string | FormField)[];
9
+ /** Custom CSS class for the section's Card wrapper. */
10
+ className?: string;
11
+ /** Custom CSS class for the section's field grid. */
12
+ gridClassName?: string;
9
13
  }
10
14
  export interface ModalFormSchema {
11
15
  type: 'object-form';
@@ -6,6 +6,10 @@ export interface SplitFormSectionConfig {
6
6
  description?: string;
7
7
  columns?: 1 | 2 | 3 | 4;
8
8
  fields: (string | FormField)[];
9
+ /** Custom CSS class for the section's Card wrapper. */
10
+ className?: string;
11
+ /** Custom CSS class for the section's field grid. */
12
+ gridClassName?: string;
9
13
  }
10
14
  export interface SplitFormSchema {
11
15
  type: 'object-form';
@@ -22,6 +22,14 @@ export interface FormSectionConfig {
22
22
  * Field names or configurations in this section
23
23
  */
24
24
  fields: (string | FormField)[];
25
+ /**
26
+ * Custom CSS class for the section's Card wrapper.
27
+ */
28
+ className?: string;
29
+ /**
30
+ * Custom CSS class for the section's field grid.
31
+ */
32
+ gridClassName?: string;
25
33
  }
26
34
  export interface TabbedFormSchema {
27
35
  type: 'object-form';
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { ObjectForm };
3
3
  export type { ObjectFormProps } from './ObjectForm';
4
4
  export { FormSection } from './FormSection';
5
5
  export type { FormSectionProps } from './FormSection';
6
- export { applyAutoLayout, inferColumns, inferModalSize, isWideFieldType, isAutoGeneratedFieldType, applyAutoColSpan, filterCreateModeFields, filterSystemFields, filterAutoGeneratedFields, } from './autoLayout';
6
+ export { applyAutoLayout, inferColumns, inferModalSize, isWideFieldType, isAutoGeneratedFieldType, applyAutoColSpan, containerGridColsFor, filterCreateModeFields, filterSystemFields, filterAutoGeneratedFields, } from './autoLayout';
7
7
  export { TabbedForm } from './TabbedForm';
8
8
  export type { TabbedFormProps, TabbedFormSchema, FormSectionConfig } from './TabbedForm';
9
9
  export { WizardForm } from './WizardForm';
package/dist/index.js CHANGED
@@ -44,7 +44,7 @@ var ve = ({ label: e, description: t, collapsible: n = !1, collapsed: r = !1, co
44
44
  }), /* @__PURE__ */ X("div", {
45
45
  className: "flex-1",
46
46
  children: [e && /* @__PURE__ */ Y("h3", {
47
- className: "text-base font-semibold text-foreground",
47
+ className: "text-sm font-semibold text-foreground",
48
48
  children: e
49
49
  }), t && /* @__PURE__ */ Y("p", {
50
50
  className: "text-sm text-muted-foreground mt-0.5",
@@ -56,25 +56,14 @@ var ve = ({ label: e, description: t, collapsible: n = !1, collapsed: r = !1, co
56
56
  children: a
57
57
  });
58
58
  return m ? /* @__PURE__ */ X(O, {
59
- className: G("form-section", o),
60
- children: [h && /* @__PURE__ */ X(j, {
61
- className: "pb-3",
62
- children: [
63
- e && /* @__PURE__ */ Y(M, {
64
- className: "text-base",
65
- children: e
66
- }),
67
- t && /* @__PURE__ */ Y(A, { children: t }),
68
- n && /* @__PURE__ */ Y("button", {
69
- type: "button",
70
- className: "absolute right-4 top-4 text-muted-foreground",
71
- onClick: p,
72
- "aria-expanded": !u,
73
- "aria-label": u ? "Expand section" : "Collapse section",
74
- children: Y(u ? de : q, { className: "h-4 w-4" })
75
- })
76
- ]
77
- }), g && /* @__PURE__ */ Y(k, { children: g })]
59
+ className: G("form-section bg-muted/40 shadow-none", o),
60
+ children: [h && /* @__PURE__ */ Y(j, {
61
+ className: "border-b border-border pb-3",
62
+ children: h
63
+ }), g && /* @__PURE__ */ Y(k, {
64
+ className: "pt-4",
65
+ children: g
66
+ })]
78
67
  }) : /* @__PURE__ */ X("div", {
79
68
  className: G("form-section", o),
80
69
  children: [h, g]
@@ -271,7 +260,8 @@ var Be = ({ schema: n, dataSource: r, className: i }) => {
271
260
  return;
272
261
  }
273
262
  try {
274
- c(await r.getObjectSchema(n.objectName));
263
+ let e = await r.getObjectSchema(n.objectName);
264
+ c(e);
275
265
  } catch (e) {
276
266
  g(e);
277
267
  }
@@ -283,7 +273,8 @@ var Be = ({ schema: n, dataSource: r, className: i }) => {
283
273
  return;
284
274
  }
285
275
  try {
286
- d(await r.findOne(n.objectName, n.recordId) || {});
276
+ let e = await r.findOne(n.objectName, n.recordId);
277
+ d(e || {});
287
278
  } catch (e) {
288
279
  g(e);
289
280
  } finally {
@@ -373,6 +364,8 @@ var Be = ({ schema: n, dataSource: r, className: i }) => {
373
364
  children: /* @__PURE__ */ Y(ve, {
374
365
  description: e.description,
375
366
  columns: 1,
367
+ className: e.className,
368
+ gridClassName: e.gridClassName,
376
369
  children: /* @__PURE__ */ Y(l, { schema: {
377
370
  ...C,
378
371
  ...Le(y(e), e.columns || 1),
@@ -393,7 +386,8 @@ var Be = ({ schema: n, dataSource: r, className: i }) => {
393
386
  return;
394
387
  }
395
388
  try {
396
- u(await r.getObjectSchema(n.objectName));
389
+ let e = await r.getObjectSchema(n.objectName);
390
+ u(e);
397
391
  } catch (e) {
398
392
  _(e);
399
393
  }
@@ -405,7 +399,8 @@ var Be = ({ schema: n, dataSource: r, className: i }) => {
405
399
  return;
406
400
  }
407
401
  try {
408
- f(await r.findOne(n.objectName, n.recordId) || {});
402
+ let e = await r.findOne(n.objectName, n.recordId);
403
+ f(e || {});
409
404
  } catch (e) {
410
405
  _(e);
411
406
  } finally {
@@ -572,6 +567,8 @@ var Be = ({ schema: n, dataSource: r, className: i }) => {
572
567
  label: B.label,
573
568
  description: B.description,
574
569
  columns: 1,
570
+ className: B.className,
571
+ gridClassName: B.gridClassName,
575
572
  children: F.length > 0 ? /* @__PURE__ */ Y(l, { schema: {
576
573
  type: "form",
577
574
  objectName: n.objectName,
@@ -638,7 +635,8 @@ var Be = ({ schema: n, dataSource: r, className: i }) => {
638
635
  return;
639
636
  }
640
637
  try {
641
- u(await n.getObjectSchema(e.objectName));
638
+ let t = await n.getObjectSchema(e.objectName);
639
+ u(t);
642
640
  } catch (e) {
643
641
  _(e), h(!1);
644
642
  }
@@ -654,7 +652,8 @@ var Be = ({ schema: n, dataSource: r, className: i }) => {
654
652
  return;
655
653
  }
656
654
  try {
657
- f(await n.findOne(e.objectName, e.recordId) || {});
655
+ let t = await n.findOne(e.objectName, e.recordId);
656
+ f(t || {});
658
657
  } catch (e) {
659
658
  _(e);
660
659
  } finally {
@@ -720,11 +719,13 @@ var Be = ({ schema: n, dataSource: r, className: i }) => {
720
719
  onSubmit: y,
721
720
  onCancel: b
722
721
  }, E = (t, n) => /* @__PURE__ */ Y("div", {
723
- className: "space-y-4 p-4",
722
+ className: "space-y-6 p-4",
724
723
  children: t.map((t, r) => /* @__PURE__ */ Y(ve, {
725
724
  label: t.label,
726
725
  description: t.description,
727
726
  columns: 1,
727
+ className: t.className,
728
+ gridClassName: t.gridClassName,
728
729
  children: /* @__PURE__ */ Y(l, { schema: {
729
730
  ...T,
730
731
  ...Le(v(t), t.columns || 1),
@@ -1393,10 +1394,10 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1393
1394
  let n = t.map((t, n) => n === e ? {
1394
1395
  ...t,
1395
1396
  rows: [...t.rows, {}]
1396
- } : t);
1397
+ } : t), r = n[e].rows.length - 1;
1397
1398
  return N({
1398
1399
  detailIdx: e,
1399
- rowIdx: n[e].rows.length - 1,
1400
+ rowIdx: r,
1400
1401
  isNew: !0
1401
1402
  }), n;
1402
1403
  });
@@ -1620,7 +1621,8 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1620
1621
  return;
1621
1622
  }
1622
1623
  try {
1623
- _(await n.getObjectSchema(e.objectName));
1624
+ let t = await n.getObjectSchema(e.objectName);
1625
+ _(t);
1624
1626
  } catch (e) {
1625
1627
  F(e), N(!1);
1626
1628
  }
@@ -1636,7 +1638,8 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1636
1638
  return;
1637
1639
  }
1638
1640
  try {
1639
- j(await n.findOne(e.objectName, e.recordId) || {});
1641
+ let t = await n.findOne(e.objectName, e.recordId);
1642
+ j(t || {});
1640
1643
  } catch (e) {
1641
1644
  F(e);
1642
1645
  } finally {
@@ -1784,7 +1787,8 @@ var xt = ({ details: e, state: t, setRows: n, formHostRef: i, taxRateField: a, f
1784
1787
  onToggle: e.collapsible ? () => se((e) => ({
1785
1788
  ...e,
1786
1789
  [r]: !i
1787
- })) : void 0
1790
+ })) : void 0,
1791
+ className: e.className
1788
1792
  });
1789
1793
  let a = ce(e);
1790
1794
  i ? t.push(...a.map((e) => ({
@@ -1993,7 +1997,8 @@ var Dt = Z({
1993
1997
  return;
1994
1998
  }
1995
1999
  try {
1996
- A(await n.getObjectSchema(e.objectName));
2000
+ let t = await n.getObjectSchema(e.objectName);
2001
+ A(t);
1997
2002
  } catch (e) {
1998
2003
  H(e), B(!1);
1999
2004
  }
@@ -2009,7 +2014,8 @@ var Dt = Z({
2009
2014
  return;
2010
2015
  }
2011
2016
  try {
2012
- R(await n.findOne(e.objectName, e.recordId) || {});
2017
+ let t = await n.findOne(e.objectName, e.recordId);
2018
+ R(t || {});
2013
2019
  } catch (e) {
2014
2020
  H(e);
2015
2021
  } finally {
@@ -2169,6 +2175,8 @@ var Dt = Z({
2169
2175
  children: /* @__PURE__ */ Y(ve, {
2170
2176
  description: e.description,
2171
2177
  columns: 1,
2178
+ className: e.className,
2179
+ gridClassName: e.gridClassName,
2172
2180
  children: i(e)
2173
2181
  })
2174
2182
  }, n(e, t)))]
@@ -2178,6 +2186,8 @@ var Dt = Z({
2178
2186
  label: r(e),
2179
2187
  description: e.description,
2180
2188
  columns: 1,
2189
+ className: e.className,
2190
+ gridClassName: e.gridClassName,
2181
2191
  children: i(e)
2182
2192
  }, n(e, t)))
2183
2193
  });
@@ -2370,7 +2380,9 @@ var Dt = Z({
2370
2380
  label: o(e),
2371
2381
  description: e.description,
2372
2382
  columns: e.columns,
2373
- fields: e.fields
2383
+ fields: e.fields,
2384
+ className: e.className,
2385
+ gridClassName: e.gridClassName
2374
2386
  })),
2375
2387
  defaultTab: r.defaultTab,
2376
2388
  tabPosition: r.tabPosition
@@ -2387,7 +2399,9 @@ var Dt = Z({
2387
2399
  label: o(e),
2388
2400
  description: e.description,
2389
2401
  columns: e.columns,
2390
- fields: e.fields
2402
+ fields: e.fields,
2403
+ className: e.className,
2404
+ gridClassName: e.gridClassName
2391
2405
  })),
2392
2406
  allowSkip: r.allowSkip,
2393
2407
  showStepIndicator: r.showStepIndicator,
@@ -2407,7 +2421,9 @@ var Dt = Z({
2407
2421
  label: o(e),
2408
2422
  description: e.description,
2409
2423
  columns: e.columns,
2410
- fields: e.fields
2424
+ fields: e.fields,
2425
+ className: e.className,
2426
+ gridClassName: e.gridClassName
2411
2427
  })),
2412
2428
  splitDirection: r.splitDirection,
2413
2429
  splitSize: r.splitSize,
@@ -2430,7 +2446,8 @@ var Dt = Z({
2430
2446
  columns: e.columns,
2431
2447
  fields: e.fields,
2432
2448
  collapsible: e.collapsible,
2433
- collapsed: e.collapsed
2449
+ collapsed: e.collapsed,
2450
+ className: e.className
2434
2451
  })),
2435
2452
  open: r.open,
2436
2453
  onOpenChange: r.onOpenChange,
@@ -2453,7 +2470,9 @@ var Dt = Z({
2453
2470
  label: o(e),
2454
2471
  description: e.description,
2455
2472
  columns: e.columns,
2456
- fields: e.fields
2473
+ fields: e.fields,
2474
+ className: e.className,
2475
+ gridClassName: e.gridClassName
2457
2476
  })),
2458
2477
  open: r.open,
2459
2478
  onOpenChange: r.onOpenChange,
@@ -2521,7 +2540,8 @@ var Dt = Z({
2521
2540
  }
2522
2541
  C(!0);
2523
2542
  try {
2524
- x(await i.findOne(n.objectName, n.recordId));
2543
+ let e = await i.findOne(n.objectName, n.recordId);
2544
+ x(e);
2525
2545
  } catch (e) {
2526
2546
  console.error("Failed to fetch record:", e), T(e);
2527
2547
  } finally {
@@ -2546,23 +2566,23 @@ var Dt = Z({
2546
2566
  return;
2547
2567
  }
2548
2568
  if (!f) return;
2549
- let e = [], t = n.fields || Object.keys(f.fields || {});
2550
- (Array.isArray(t) ? t : Object.keys(t)).forEach((t) => {
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 || {});
2570
+ (Array.isArray(s) ? s : Object.keys(s)).forEach((t) => {
2551
2571
  let r = typeof t == "string" ? t : t.name;
2552
2572
  if (!r) return;
2553
2573
  let i = f.fields?.[r];
2554
2574
  if (!i && !O) return;
2555
- let o = !i?.permissions || i?.permissions.write !== !1;
2556
- if (n.mode !== "view" && !o) return;
2557
- let s = n.customFields?.find((e) => e.name === r);
2558
- if (s) e.push(k(s));
2575
+ let s = !i?.permissions || i?.permissions.write !== !1;
2576
+ if (n.mode !== "view" && !s) return;
2577
+ let c = n.customFields?.find((e) => e.name === r);
2578
+ if (c) e.push(k(c));
2559
2579
  else if (i) {
2560
- let o = {
2580
+ let s = {
2561
2581
  name: r,
2562
2582
  label: a(n.objectName, r, i.label || t),
2563
2583
  type: v(i.type),
2564
2584
  required: i.required || !1,
2565
- disabled: n.readOnly || n.mode === "view" || i.readonly || f?.managedBy && f.managedBy !== "platform",
2585
+ disabled: n.readOnly || n.mode === "view" || i.readonly || o,
2566
2586
  placeholder: i.placeholder,
2567
2587
  description: i.help || i.description,
2568
2588
  validation: g(i),
@@ -2570,13 +2590,14 @@ var Dt = Z({
2570
2590
  readonlyWhen: i.readonlyWhen,
2571
2591
  requiredWhen: i.requiredWhen ?? i.conditionalRequired,
2572
2592
  group: i.group,
2573
- field: i
2593
+ field: i,
2594
+ widget: i.widget
2574
2595
  };
2575
- if ((i.type === "select" || i.type === "lookup" || i.type === "master_detail") && (o.options = i.options || [], o.multiple = i.multiple), (i.type === "number" || i.type === "currency" || i.type === "percent") && (o.inputType = "number", o.min = i.min, o.max = i.max, o.step = i.precision ? 10 ** -i.precision : void 0), i.type === "date" && (o.inputType = "date"), i.type === "datetime" && (o.inputType = "datetime-local"), (i.type === "text" || i.type === "textarea" || i.type === "markdown" || i.type === "html") && (o.maxLength = i.max_length, o.minLength = i.min_length), (i.type === "file" || i.type === "image") && (o.inputType = "file", o.multiple = i.multiple, o.accept = i.accept ? i.accept.join(",") : void 0, i.max_size)) {
2596
+ if ((i.type === "select" || i.type === "lookup" || i.type === "master_detail") && (s.options = i.options || [], s.multiple = i.multiple), (i.type === "number" || i.type === "currency" || i.type === "percent") && (s.inputType = "number", s.min = i.min, s.max = i.max, s.step = i.precision ? 10 ** -i.precision : void 0), i.type === "date" && (s.inputType = "date"), i.type === "datetime" && (s.inputType = "datetime-local"), (i.type === "text" || i.type === "textarea" || i.type === "markdown" || i.type === "html") && (s.maxLength = i.max_length, s.minLength = i.min_length), (i.type === "file" || i.type === "image") && (s.inputType = "file", s.multiple = i.multiple, s.accept = i.accept ? i.accept.join(",") : void 0, i.max_size)) {
2576
2597
  let e = `Max size: ${_(i.max_size)}`;
2577
- o.description = o.description ? `${o.description} (${e})` : e;
2598
+ s.description = s.description ? `${s.description} (${e})` : e;
2578
2599
  }
2579
- i.type === "email" && (o.inputType = "email"), i.type === "phone" && (o.inputType = "tel"), i.type === "url" && (o.inputType = "url"), i.type === "password" && (o.inputType = "password"), i.type === "time" && (o.inputType = "time"), (i.type === "formula" || i.type === "summary" || i.type === "auto_number") && (o.disabled = !0), i.visible_on && (o.visibleOn = i.visible_on), e.push(o);
2600
+ i.type === "email" && (s.inputType = "email"), i.type === "phone" && (s.inputType = "tel"), i.type === "url" && (s.inputType = "url"), i.type === "password" && (s.inputType = "password"), i.type === "time" && (s.inputType = "time"), (i.type === "formula" || i.type === "summary" || i.type === "auto_number") && (s.disabled = !0), i.visible_on && (s.visibleOn = i.visible_on), e.push(s);
2580
2601
  }
2581
2602
  }), y(e), !O && n.recordId && n.mode !== "create" && i || C(!1);
2582
2603
  }, [
@@ -2709,7 +2730,8 @@ var Dt = Z({
2709
2730
  onToggle: r.collapsible ? () => I((e) => ({
2710
2731
  ...e,
2711
2732
  [f]: !m
2712
- })) : void 0
2733
+ })) : void 0,
2734
+ className: r.className
2713
2735
  });
2714
2736
  let h = t(r.columns), g = a > 1 ? Ae(u, a, h) : u;
2715
2737
  p && m ? s.push(...g.map((e) => ({
@@ -3593,4 +3615,4 @@ c.register("object-form", Vt, {
3593
3615
  ]
3594
3616
  });
3595
3617
  //#endregion
3596
- 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, 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 };
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 };
@@ -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-base 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`,u),children:[v&&(0,c.jsxs)(a.CardHeader,{className:`pb-3`,children:[e&&(0,c.jsx)(a.CardTitle,{className:`text-base`,children:e}),n&&(0,c.jsx)(a.CardDescription,{children:n}),r&&(0,c.jsx)(`button`,{type:`button`,className:`absolute right-4 top-4 text-muted-foreground`,onClick:g,"aria-expanded":!p,"aria-label":p?`Expand section`:`Collapse section`,children:p?(0,c.jsx)(s.ChevronRight,{className:`h-4 w-4`}):(0,c.jsx)(s.ChevronDown,{className:`h-4 w-4`})})]}),y&&(0,c.jsx)(a.CardContent,{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{l(await n.getObjectSchema(e.objectName))}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{d(await n.findOne(e.objectName,e.recordId)||{})}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,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{u(await n.getObjectSchema(e.objectName))}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{f(await n.findOne(e.objectName,e.recordId)||{})}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,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{l(await n.getObjectSchema(e.objectName))}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{d(await n.findOne(e.objectName,e.recordId)||{})}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-4 p-4`,children:t.map((t,i)=>(0,c.jsx)(b,{label:t.label,description:t.description,columns:1,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);return E({detailIdx:e,rowIdx:n[e].rows.length-1,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{p(await n.getObjectSchema(e.objectName))}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{_(await n.findOne(e.objectName,e.recordId)||{})}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});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{_(await n.getObjectSchema(e.objectName))}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{S(await n.findOne(e.objectName,e.recordId)||{})}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,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,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})),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})),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})),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})),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})),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{b(await n.findOne(e.objectName,e.recordId))}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=e.fields||Object.keys(p.fields||{});(Array.isArray(r)?r:Object.keys(r)).forEach(n=>{let r=typeof n==`string`?n:n.name;if(!r)return;let a=p.fields?.[r];if(!a&&!D)return;let o=!a?.permissions||a?.permissions.write!==!1;if(e.mode!==`view`&&!o)return;let c=e.customFields?.find(e=>e.name===r);if(c)t.push(O(c));else if(a){let o={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||p?.managedBy&&p.managedBy!==`platform`,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};if((a.type===`select`||a.type===`lookup`||a.type===`master_detail`)&&(o.options=a.options||[],o.multiple=a.multiple),(a.type===`number`||a.type===`currency`||a.type===`percent`)&&(o.inputType=`number`,o.min=a.min,o.max=a.max,o.step=a.precision?10**-a.precision:void 0),a.type===`date`&&(o.inputType=`date`),a.type===`datetime`&&(o.inputType=`datetime-local`),(a.type===`text`||a.type===`textarea`||a.type===`markdown`||a.type===`html`)&&(o.maxLength=a.max_length,o.minLength=a.min_length),(a.type===`file`||a.type===`image`)&&(o.inputType=`file`,o.multiple=a.multiple,o.accept=a.accept?a.accept.join(`,`):void 0,a.max_size)){let e=`Max size: ${(0,i.formatFileSize)(a.max_size)}`;o.description=o.description?`${o.description} (${e})`:e}a.type===`email`&&(o.inputType=`email`),a.type===`phone`&&(o.inputType=`tel`),a.type===`url`&&(o.inputType=`url`),a.type===`password`&&(o.inputType=`password`),a.type===`time`&&(o.inputType=`time`),(a.type===`formula`||a.type===`summary`||a.type===`auto_number`)&&(o.disabled=!0),a.visible_on&&(o.visibleOn=a.visible_on),t.push(o)}}),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});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.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);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});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/plugin-form",
3
- "version": "11.5.0",
3
+ "version": "13.2.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": "^11.7.0",
18
+ "@objectstack/spec": "^14.3.0",
19
19
  "lucide-react": "^1.22.0",
20
- "@object-ui/components": "11.5.0",
21
- "@object-ui/core": "11.5.0",
22
- "@object-ui/fields": "11.5.0",
23
- "@object-ui/i18n": "11.5.0",
24
- "@object-ui/permissions": "11.5.0",
25
- "@object-ui/react": "11.5.0",
26
- "@object-ui/types": "11.5.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"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "react": "^18.0.0 || ^19.0.0",
@@ -33,9 +33,9 @@
33
33
  "@vitejs/plugin-react": "^6.0.3",
34
34
  "msw": "^2.14.6",
35
35
  "typescript": "^6.0.3",
36
- "vite": "^8.1.0",
36
+ "vite": "^8.1.3",
37
37
  "vite-plugin-dts": "^5.0.3",
38
- "@object-ui/data-objectstack": "11.5.0"
38
+ "@object-ui/data-objectstack": "13.2.0"
39
39
  },
40
40
  "keywords": [
41
41
  "objectui",