@object-ui/plugin-form 13.1.0 → 14.0.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,88 @@
1
1
  # @object-ui/plugin-form
2
2
 
3
+ ## 14.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [443360a]
8
+ - Updated dependencies [c70bca7]
9
+ - Updated dependencies [86c69c3]
10
+ - Updated dependencies [05e56ca]
11
+ - Updated dependencies [a44e7b6]
12
+ - Updated dependencies [5971cc4]
13
+ - Updated dependencies [6a74160]
14
+ - @object-ui/core@14.0.0
15
+ - @object-ui/i18n@14.0.0
16
+ - @object-ui/react@14.0.0
17
+ - @object-ui/types@14.0.0
18
+ - @object-ui/components@14.0.0
19
+ - @object-ui/fields@14.0.0
20
+ - @object-ui/permissions@14.0.0
21
+
22
+ ## 13.2.0
23
+
24
+ ### Patch Changes
25
+
26
+ - e492b9d: Permission sets — pure separation of **design** (Studio) and **assignment**
27
+ (Setup), per ADR-0056 / epic #2398. A `sys_permission_set` used to render its six
28
+ authorization facets in Setup as raw `[Object]` / JSON textareas, and only
29
+ objects+fields were editable in Studio; this reworks both surfaces.
30
+
31
+ **Setup (assign + read-only):**
32
+ - The six facets (`object_permissions`, `field_permissions`, `system_permissions`,
33
+ `row_level_security`, `tab_permissions`, `admin_scope`) now render read-only on
34
+ the `sys_permission_set` record page as a compact summary (counts, or capability
35
+ chips) plus a **“Design in Studio →”** deep-link into the structured editor
36
+ (`/apps/:appName/metadata/permission/:setName`, env scope). No `[Object]`, no
37
+ JSON — in the record view, inline edit, and the create/edit form. Implemented as
38
+ a `permission-facet-link` field widget stamped onto the six fields via the single
39
+ `ObjectStackAdapter.getObjectSchema` choke point and honored by DetailSection +
40
+ the record form.
41
+ - User assignment (add/remove via `sys_user_permission_set`) is surfaced directly
42
+ on the Setup record page.
43
+
44
+ **Studio (design every facet):** the permission matrix editor gains structured
45
+ editors for the facets that were JSON-only —
46
+ - **System Capabilities**: a multi-select over the live `sys_capability` registry
47
+ (scope-grouped, labelled chips).
48
+ - **Row-Level Security**: per-policy rows (object · operation · enabled) with CEL
49
+ USING/CHECK.
50
+ - **Tab Visibility**: per-tab `visible | hidden | default_on | default_off`.
51
+ - **Delegated Admin Scope**: business-unit + subtree, manage-assignments /
52
+ -bindings / author-env-sets toggles, and an assignable-permission-sets allowlist.
53
+ Assignment was moved out of the editor (it is now a Setup act) — the editor is
54
+ purely a design surface.
55
+
56
+ Storage/types are unchanged; editors read/write the draft’s existing parsed
57
+ fields and tolerate legacy JSON strings on load. Note: env-scope metadata saves of
58
+ these facets do not yet project onto the queryable `sys_permission_set` data
59
+ record the Setup summary reads, so a fresh Studio edit isn’t reflected in Setup’s
60
+ read-only view until the projection refreshes — tracked as a framework follow-up
61
+ (enforcement reads the authoritative metadata).
62
+
63
+ - 5da9905: fix(plugin-form): honor `userActions.edit` on managed objects instead of blanket-disabling every field (ADR-0092 D4)
64
+
65
+ `ObjectForm` disabled every field on any non-`platform` lifecycle bucket
66
+ (config / system / append-only / better-auth) — a defensive default from when
67
+ those objects had no generic edit affordance at all. Now that an object can
68
+ OPEN per-record editing via `userActions.{edit,create}` (framework ADR-0092 D4
69
+ — e.g. `sys_user` exposing its `name`/`image` profile fields), the blanket
70
+ lock lifts for the current mode when its affordance is `true`, and each
71
+ field's own `readonly` flag decides. Managed buckets still default the
72
+ affordance off, so an object that doesn't opt in is unchanged. The server-side
73
+ identity write guard remains the real boundary; this is UX only.
74
+
75
+ - Updated dependencies [80901aa]
76
+ - Updated dependencies [53c40c2]
77
+ - Updated dependencies [e492b9d]
78
+ - @object-ui/components@13.2.0
79
+ - @object-ui/i18n@13.2.0
80
+ - @object-ui/fields@13.2.0
81
+ - @object-ui/react@13.2.0
82
+ - @object-ui/types@13.2.0
83
+ - @object-ui/core@13.2.0
84
+ - @object-ui/permissions@13.2.0
85
+
3
86
  ## 13.1.0
4
87
 
5
88
  ### Patch Changes
package/dist/index.js CHANGED
@@ -207,14 +207,14 @@ function Ne(e, t) {
207
207
  if (je.has(e.name) || e.type && Se.has(e.type)) return !1;
208
208
  if (!t?.fields) return !0;
209
209
  let n = t.fields[e.name];
210
- return n ? n.readonly === !0 ? !1 : !Ee(n.type) : !0;
210
+ return !n || n.readonly !== !0 && !Ee(n.type);
211
211
  });
212
212
  }
213
213
  function Pe(e, t) {
214
214
  return e.filter((e) => {
215
215
  if (e.type && Se.has(e.type)) return !1;
216
216
  let n = t?.fields?.[e.name];
217
- return n ? !Ee(n.type) : !0;
217
+ return !n || !Ee(n.type);
218
218
  });
219
219
  }
220
220
  var Fe = {
@@ -792,7 +792,7 @@ var $ = (e) => e == null ? void 0 : e.id ?? e._id ?? e.recordId, Ke = (e, t) =>
792
792
  "recordId"
793
793
  ]);
794
794
  function Je(e, t) {
795
- return e ? Object.entries(e).every(([e, n]) => e === t || qe.has(e) ? !0 : n == null || n === "") : !0;
795
+ return !e || Object.entries(e).every(([e, n]) => e === t || qe.has(e) ? !0 : n == null || n === "");
796
796
  }
797
797
  function Ye(e, t, n) {
798
798
  let r = [{
@@ -2566,23 +2566,23 @@ var Dt = Z({
2566
2566
  return;
2567
2567
  }
2568
2568
  if (!f) return;
2569
- let e = [], t = n.fields || Object.keys(f.fields || {});
2570
- (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, o = t && !r, s = n.fields || Object.keys(f.fields || {});
2570
+ (Array.isArray(s) ? s : Object.keys(s)).forEach((t) => {
2571
2571
  let r = typeof t == "string" ? t : t.name;
2572
2572
  if (!r) return;
2573
2573
  let i = f.fields?.[r];
2574
2574
  if (!i && !O) return;
2575
- let o = !i?.permissions || i?.permissions.write !== !1;
2576
- if (n.mode !== "view" && !o) return;
2577
- let s = n.customFields?.find((e) => e.name === r);
2578
- 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));
2579
2579
  else if (i) {
2580
- let o = {
2580
+ let s = {
2581
2581
  name: r,
2582
2582
  label: a(n.objectName, r, i.label || t),
2583
2583
  type: v(i.type),
2584
2584
  required: i.required || !1,
2585
- disabled: n.readOnly || n.mode === "view" || i.readonly || f?.managedBy && f.managedBy !== "platform",
2585
+ disabled: n.readOnly || n.mode === "view" || i.readonly || o,
2586
2586
  placeholder: i.placeholder,
2587
2587
  description: i.help || i.description,
2588
2588
  validation: g(i),
@@ -2590,13 +2590,14 @@ var Dt = Z({
2590
2590
  readonlyWhen: i.readonlyWhen,
2591
2591
  requiredWhen: i.requiredWhen ?? i.conditionalRequired,
2592
2592
  group: i.group,
2593
- field: i
2593
+ field: i,
2594
+ widget: i.widget
2594
2595
  };
2595
- 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)) {
2596
2597
  let e = `Max size: ${_(i.max_size)}`;
2597
- o.description = o.description ? `${o.description} (${e})` : e;
2598
+ s.description = s.description ? `${s.description} (${e})` : e;
2598
2599
  }
2599
- 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);
2600
2601
  }
2601
2602
  }), y(e), !O && n.recordId && n.mode !== "create" && i || C(!1);
2602
2603
  }, [
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("react"),require("@object-ui/core"),require("@object-ui/react"),require("@object-ui/fields"),require("@object-ui/components"),require("@object-ui/permissions"),require("lucide-react"),require("react/jsx-runtime"),require("@object-ui/i18n"),require("@objectstack/spec/data")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`@object-ui/fields`,`@object-ui/components`,`@object-ui/permissions`,`lucide-react`,`react/jsx-runtime`,`@object-ui/i18n`,`@objectstack/spec/data`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginForm={},e.React,e._object_ui_core,e._object_ui_react,e._object_ui_fields,e._object_ui_components,e._object_ui_permissions,e.lucide_react,e.react_jsx_runtime,e._object_ui_i18n,e._objectstack_spec_data))})(this,function(e,t,n,r,i,a,o,s,c,l,u){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var d=Object.create,f=Object.defineProperty,p=Object.getOwnPropertyDescriptor,m=Object.getOwnPropertyNames,h=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty,_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=m(t),a=0,o=i.length,s;a<o;a++)s=i[a],!g.call(e,s)&&s!==n&&f(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=p(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:d(h(e)),_(t||!e||!e.__esModule?f(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);function v(e){try{return typeof window>`u`?!1:new URL(e,window.location.href).origin===window.location.origin}catch{return!1}}function y(e,t){if(!e)return null;let n=t?.id??t?.recordId??t?._id;if(n==null||n===``)return null;let r=e.replace(/\{(?:id|recordId)\}/g,String(n));return v(r)?r:null}var b=({label:e,description:n,collapsible:r=!1,collapsed:i=!1,columns:o=1,children:l,className:u,gridClassName:d,showBorder:f})=>{let[p,m]=(0,t.useState)(i),h={1:`grid-cols-1`,2:`grid-cols-1 md:grid-cols-2`,3:`grid-cols-1 md:grid-cols-2 lg:grid-cols-3`,4:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`},g=()=>{r&&m(!p)},_=f??!!e,v=e||n?(0,c.jsxs)(`div`,{className:(0,a.cn)(`flex items-start gap-2`,!_&&`mb-4`,r&&`cursor-pointer select-none`),onClick:g,role:r?`button`:void 0,"aria-expanded":r?!p:void 0,children:[r&&(0,c.jsx)(`span`,{className:`mt-0.5 text-muted-foreground`,children:p?(0,c.jsx)(s.ChevronRight,{className:`h-4 w-4`}):(0,c.jsx)(s.ChevronDown,{className:`h-4 w-4`})}),(0,c.jsxs)(`div`,{className:`flex-1`,children:[e&&(0,c.jsx)(`h3`,{className:`text-sm font-semibold text-foreground`,children:e}),n&&(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:n})]})]}):null,y=p?null:(0,c.jsx)(`div`,{className:(0,a.cn)(`grid gap-4`,d||h[o]),children:l});return _?(0,c.jsxs)(a.Card,{className:(0,a.cn)(`form-section bg-muted/40 shadow-none`,u),children:[v&&(0,c.jsx)(a.CardHeader,{className:`border-b border-border pb-3`,children:v}),y&&(0,c.jsx)(a.CardContent,{className:`pt-4`,children:y})]}):(0,c.jsxs)(`div`,{className:(0,a.cn)(`form-section`,u),children:[v,y]})};function x(e,t){return typeof t==`string`&&t.trim()||typeof t==`object`&&t&&typeof t.source==`string`&&t.source.trim()?{...e,visibleOn:t}:e}function S(e,t){let n=t.objectSchema?.fields?.[e];return n?{name:e,label:t.fieldLabel(t.objectName,e,n.label||e),type:(0,i.mapFieldTypeToFormType)(n.type),required:n.required||!1,disabled:t.readOnly||t.mode===`view`||n.readonly,placeholder:n.placeholder,description:n.help||n.description,validation:(0,i.buildValidationRules)(n),field:n,options:n.options,multiple:n.multiple,visibleWhen:n.visibleWhen,readonlyWhen:n.readonlyWhen,requiredWhen:n.requiredWhen,conditionalRequired:n.conditionalRequired}:{name:e,label:e,type:`input`}}function C(e,t){if(typeof e==`string`){let n=t.objectSchema?.fields?.[e];return x(S(e,t),n?.visible_on??n?.visibleOn)}let n=e;if(typeof n.field!=`string`)return x(n,n.visibleOn);let r=n.field,a=S(r,t);return n.type!=null&&(a.type=(0,i.mapFieldTypeToFormType)(n.type)),n.widget!=null&&(a.widget=n.widget),n.label!=null&&(a.label=n.label),n.placeholder!=null&&(a.placeholder=n.placeholder),n.helpText!=null&&(a.description=n.helpText),n.required!=null&&(a.required=n.required),n.readonly!=null&&(a.disabled=n.readonly||a.disabled),n.immutable!=null&&(a.immutable=n.immutable),n.hidden!=null&&(a.hidden=n.hidden),n.colSpan!=null&&(a.colSpan=n.colSpan),n.span!=null&&(a.span=n.span),n.options!=null&&(a.options=n.options),n.multiple!=null&&(a.multiple=n.multiple),n.reference!=null&&(a.reference=n.reference),n.maxLength!=null&&(a.maxLength=n.maxLength),n.minLength!=null&&(a.minLength=n.minLength),n.min!=null&&(a.min=n.min),n.max!=null&&(a.max=n.max),n.precision!=null&&(a.precision=n.precision),n.scale!=null&&(a.scale=n.scale),n.language!=null&&(a.language=n.language),Array.isArray(n.fields)&&(a.fields=n.fields),x(a,n.visibleOn)}function w(e,t){return(e.fields??[]).map(e=>C(e,t))}var T=new Set([`field:formula`,`field:summary`,`field:auto_number`,`field:autonumber`]),E=new Set([`field:textarea`,`field:markdown`,`field:html`,`field:grid`,`field:rich-text`,`textarea`,`markdown`,`html`,`grid`,`rich-text`]),D=new Set([`formula`,`summary`,`auto_number`,`autonumber`]);function O(e){return E.has(e)}function k(e){return D.has(e)}function A(e){return e<=3?1:e<=8?2:e<=15?3:4}function j(e){return e&&e>0?Math.min(Math.floor(e),4):1}function M(e,t,n){let r=j(t);return r<=1?1:e.span===`full`?r:e.colSpan==null?e.type&&O(e.type)?r:Math.min(r,Math.max(1,Math.round(r/Math.min(Math.max(1,Math.floor(n||r)),r)))):Math.min(Math.max(1,Math.floor(e.colSpan)),r)}function N(e,t,n){let r=j(t);return r<=1?e:e.map(e=>{if(e.type===`section-divider`)return e;let t=M(e,r,n);return t>1?{...e,colSpan:t}:e.colSpan!=null&&e.colSpan!==1?{...e,colSpan:1}:e})}var P=new Set([`id`,`created_at`,`createdAt`,`updated_at`,`updatedAt`,`last_modified_at`,`lastModifiedAt`,`deleted_at`,`deletedAt`,`created_by`,`createdBy`,`updated_by`,`updatedBy`,`last_modified_by`,`lastModifiedBy`,`organization_id`,`organizationId`,`org_id`,`orgId`,`tenant_id`,`tenantId`,`owner`,`owner_id`,`_version`,`_rev`]);function F(e,t){return e.filter(e=>{if(P.has(e.name))return!1;let n=t?.fields?.[e.name];return!(n?.hidden===!0||n?.readonly===!0)})}function I(e,t){return e.filter(e=>{if(P.has(e.name)||e.type&&T.has(e.type))return!1;if(!t?.fields)return!0;let n=t.fields[e.name];return n?n.readonly===!0?!1:!k(n.type):!0})}function L(e,t){return e.filter(e=>{if(e.type&&T.has(e.type))return!1;let n=t?.fields?.[e.name];return n?!k(n.type):!0})}var R={1:void 0,2:`grid gap-4 grid-cols-1 @md:grid-cols-2`,3:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3`,4:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3 @4xl:grid-cols-4`};function z(e){return R[e&&e>0?Math.min(Math.floor(e),4):1]}function B(e,t){let n=t&&t>1?Math.min(Math.floor(t),4):1,r=n>1?N(e,n):e,i=z(n);return{fields:r,columns:n,...i?{fieldContainerClass:i}:{}}}function V(e){return e<=1?`default`:e===2?`xl`:`full`}function H(e,t,n,r){let i=[...e];if(i=F(i,t),r===`create`&&(i=L(i,t)),n!==void 0)return i=N(i,n),{fields:i,columns:n};let a=A(i.length);return i=N(i,a),{fields:i,columns:a}}var U=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,l]=(0,t.useState)(null),[u,d]=(0,t.useState)({}),[f,p]=(0,t.useState)(!0),[m,h]=(0,t.useState)(null),[g,_]=(0,t.useState)(e.defaultTab||e.sections[0]?.name||e.sections[0]?.label||`tab-0`);t.default.useEffect(()=>{(async()=>{if(!n){p(!1);return}try{let t=await n.getObjectSchema(e.objectName);l(t)}catch(e){h(e)}})()},[e.objectName,n]),t.default.useEffect(()=>{(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){d(e.initialData||e.initialValues||{}),p(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);d(t||{})}catch(e){h(e)}finally{p(!1)}})()},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let v=(0,t.useCallback)(t=>w(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[s,e.readOnly,e.mode,e.objectName,o]),y=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;return e.mode===`create`?r=await n.create(e.objectName,t):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,t)),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n]),x=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),S=(e,t)=>e.name||e.label||`tab-${t}`;if(m)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:m.message})]});if(f)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let C={type:`form`,fields:e.sections.flatMap(e=>v(e)),layout:`vertical`,defaultValues:u,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,onSubmit:y,onCancel:x},T=e.tabPosition===`left`||e.tabPosition===`right`;return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(a.Tabs,{value:g,onValueChange:_,orientation:T?`vertical`:`horizontal`,className:(0,a.cn)(T&&`flex gap-4`),children:[(0,c.jsx)(a.TabsList,{className:(0,a.cn)(T?`flex-col h-auto`:``,e.tabPosition===`bottom`&&`order-last`,e.tabPosition===`right`&&`order-last`),children:e.sections.map((e,t)=>(0,c.jsx)(a.TabsTrigger,{value:S(e,t),className:T?`w-full justify-start`:``,children:e.label||`Tab ${t+1}`},S(e,t)))}),(0,c.jsx)(`div`,{className:`flex-1`,children:e.sections.map((t,n)=>(0,c.jsx)(a.TabsContent,{value:S(t,n),className:`mt-0`,children:(0,c.jsx)(b,{description:t.description,columns:1,className:t.className,gridClassName:t.gridClassName,children:(0,c.jsx)(r.SchemaRenderer,{schema:{...C,...B(v(t),t.columns||1),showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1}})})},S(t,n)))})]})})},W=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[l,u]=(0,t.useState)(null),[d,f]=(0,t.useState)({}),[p,m]=(0,t.useState)(!0),[h,g]=(0,t.useState)(null),[_,x]=(0,t.useState)(0),[S,C]=(0,t.useState)(new Set),[T,E]=(0,t.useState)(!1),[D,O]=(0,t.useState)(null),k=t.default.useId(),[A,j]=(0,t.useState)(0),M=t.default.useRef(!1),N=e.sections.length,P=_===0,F=_===N-1;t.default.useEffect(()=>{(async()=>{if(!n){m(!1);return}try{let t=await n.getObjectSchema(e.objectName);u(t)}catch(e){g(e)}})()},[e.objectName,n]),t.default.useEffect(()=>{(l||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){M.current||=(f(e.initialData||e.initialValues||{}),!0),m(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);f(t||{})}catch(e){g(e)}finally{m(!1)}})()},[l,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let I=(0,t.useCallback)(t=>w(t,{objectSchema:l,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[l,e.readOnly,e.mode,e.objectName,o]),L=(0,t.useMemo)(()=>_>=0&&_<N?I(e.sections[_]):[],[_,N,e.sections,I]),R=(0,t.useCallback)(async t=>{let r={...d,...t};if(f(r),C(e=>new Set(e).add(_)),F){E(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(r),r;let t;if(e.mode===`create`?t=await n.create(e.objectName,r):e.mode===`edit`&&e.recordId&&(t=await n.update(e.objectName,e.recordId,r)),e.onSuccess)await e.onSuccess(t);else if(e.submitBehavior){let t=e.submitBehavior;switch(t.kind){case`redirect`:v(t.url)&&setTimeout(()=>window.location.assign(t.url),t.delayMs??0);break;case`continue`:f({}),C(new Set),x(0),j(e=>e+1);break;default:{let n=t.kind===`thank-you`&&t.message?t.message:e.successMessage||(e.mode===`create`?`Created`:`Saved`);a.toast.success(n),O({title:t.kind===`thank-you`?t.title:void 0,message:n});break}}}else{let n=y(e.navigateOnSuccess,t);if(n)return window.location.assign(n),t;a.toast.success(e.successMessage||(e.mode===`create`?`Created`:`Saved`)),e.resetOnSuccess&&e.mode===`create`&&(f({}),C(new Set),x(0),j(e=>e+1))}return t}catch(t){throw e.onError&&e.onError(t),t}finally{E(!1)}}else z(_+1)},[d,_,F,e,n]),z=(0,t.useCallback)(t=>{t>=0&&t<N&&(x(t),e.onStepChange&&e.onStepChange(t))},[N,e]),V=(0,t.useCallback)(()=>{z(_-1)},[_,z]),H=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),U=(0,t.useCallback)(t=>{(e.allowSkip||S.has(t)||t<=_)&&z(t)},[e.allowSkip,S,_,z]);if(h)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:h.message})]});if(p)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(D)return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(`div`,{className:`rounded-md border bg-card p-8 text-center`,children:[(0,c.jsx)(`h3`,{className:`text-lg font-semibold`,children:D.title??`Thanks!`}),D.message&&(0,c.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:D.message})]})});let W=e.sections[_];return(0,c.jsxs)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:[e.showStepIndicator!==!1&&(0,c.jsx)(`nav`,{"aria-label":`Progress`,className:`mb-8`,children:(0,c.jsx)(`ol`,{className:`flex items-center`,children:e.sections.map((t,n)=>{let r=n===_,i=S.has(n),o=e.allowSkip||i||n<=_;return(0,c.jsxs)(`li`,{className:(0,a.cn)(`relative flex-1`,n!==N-1&&`pr-8 sm:pr-12`),children:[n!==N-1&&(0,c.jsx)(`div`,{className:`absolute top-3 sm:top-4 left-6 -right-4 sm:left-10 sm:-right-2 h-0.5`,"aria-hidden":`true`,children:(0,c.jsx)(`div`,{className:(0,a.cn)(`h-full`,i?`bg-primary`:`bg-muted`)})}),(0,c.jsxs)(`button`,{type:`button`,className:(0,a.cn)(`group relative flex items-center`,o?`cursor-pointer`:`cursor-not-allowed`),onClick:()=>U(n),disabled:!o,children:[(0,c.jsx)(`span`,{className:(0,a.cn)(`flex h-6 w-6 sm:h-8 sm:w-8 items-center justify-center rounded-full text-xs sm:text-sm font-medium transition-colors`,i&&`bg-primary text-primary-foreground`,r&&!i&&`border-2 border-primary bg-background text-primary`,!r&&!i&&`border-2 border-muted bg-background text-muted-foreground`),children:i?(0,c.jsx)(s.Check,{className:`h-3 w-3 sm:h-4 sm:w-4`}):n+1}),(0,c.jsx)(`span`,{className:`ml-2 sm:ml-3 text-xs sm:text-sm font-medium hidden sm:block`,children:(0,c.jsx)(`span`,{className:(0,a.cn)(r?`text-foreground`:`text-muted-foreground`),children:t.label||`Step ${n+1}`})})]})]},n)})})}),(0,c.jsx)(`div`,{className:`min-h-[200px]`,children:W&&(0,c.jsx)(b,{label:W.label,description:W.description,columns:1,className:W.className,gridClassName:W.gridClassName,children:L.length>0?(0,c.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,id:k,...B(L,W.columns||1),layout:`vertical`,defaultValues:d,showSubmit:!1,showCancel:!1,onSubmit:R}},A):(0,c.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:`No fields configured for this step`})})}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between mt-6 pt-4 border-t`,children:[(0,c.jsx)(`div`,{children:e.showCancel!==!1&&(0,c.jsx)(a.Button,{variant:`ghost`,onClick:H,children:e.cancelText||`Cancel`})}),(0,c.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,c.jsxs)(`span`,{className:`text-sm text-muted-foreground mr-2`,children:[`Step `,_+1,` of `,N]}),!P&&(0,c.jsxs)(a.Button,{variant:`outline`,onClick:V,children:[(0,c.jsx)(s.ChevronLeft,{className:`h-4 w-4 mr-1`}),e.prevText||`Back`]}),F?(0,c.jsxs)(a.Button,{type:`submit`,form:k,disabled:T||e.mode===`view`,children:[T&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`,"aria-hidden":!0}),T?`Submitting...`:e.submitText||(e.mode===`create`?`Create`:`Update`)]}):(0,c.jsxs)(a.Button,{type:`submit`,form:k,children:[e.nextText||`Next`,(0,c.jsx)(s.ChevronRight,{className:`h-4 w-4 ml-1`})]})]})]})]})},G=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,l]=(0,t.useState)(null),[u,d]=(0,t.useState)({}),[f,p]=(0,t.useState)(!0),[m,h]=(0,t.useState)(null);(0,t.useEffect)(()=>{(async()=>{if(!n){p(!1);return}try{let t=await n.getObjectSchema(e.objectName);l(t)}catch(e){h(e),p(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){d(e.initialData||e.initialValues||{}),p(!1);return}if(!n){d(e.initialData||e.initialValues||{}),p(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);d(t||{})}catch(e){h(e)}finally{p(!1)}})()},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let g=(0,t.useCallback)(t=>w(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[s,e.readOnly,e.mode,e.objectName,o]),_=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;return e.mode===`create`?r=await n.create(e.objectName,t):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,t)),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n]),v=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),y=(0,t.useMemo)(()=>e.sections.slice(0,1),[e.sections]),x=(0,t.useMemo)(()=>e.sections.slice(1),[e.sections]);(0,t.useMemo)(()=>e.sections.flatMap(e=>g(e)),[e.sections,g]);let S=e.splitDirection||`horizontal`,C=e.splitSize||50;if(m)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:m.message})]});if(f)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let T={type:`form`,objectName:e.objectName,layout:`vertical`,defaultValues:u,onSubmit:_,onCancel:v},E=(t,n)=>(0,c.jsx)(`div`,{className:`space-y-6 p-4`,children:t.map((t,i)=>(0,c.jsx)(b,{label:t.label,description:t.description,columns:1,className:t.className,gridClassName:t.gridClassName,children:(0,c.jsx)(r.SchemaRenderer,{schema:{...T,...B(g(t),t.columns||1),showSubmit:n&&e.showSubmit!==!1&&e.mode!==`view`,showCancel:n&&e.showCancel!==!1,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText}})},t.name||t.label||i))});return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(a.ResizablePanelGroup,{orientation:S,className:`min-h-[300px] rounded-lg border`,children:[(0,c.jsx)(a.ResizablePanel,{defaultSize:C,minSize:20,children:E(y,x.length===0)}),x.length>0&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(a.ResizableHandle,{withHandle:e.splitResizable!==!1}),(0,c.jsx)(a.ResizablePanel,{defaultSize:100-C,minSize:20,children:E(x,!0)})]})]})})},K=new Set([`id`,`_id`,`created_at`,`updated_at`,`createdAt`,`updatedAt`,`organization_id`,`organizationId`]),q=new Set([`formula`,`summary`,`rollup`,`lookup_value`,`auto_number`,`autonumber`,`computed`]);function ee(e,t){if(!e||typeof e!=`object`)return e;let n={},r=t?.fields;for(let[t,i]of Object.entries(e))if(!K.has(t)){if(r){let e=r[t];if(!e)continue;let n=String(e.type||``).toLowerCase();if(q.has(n)||e.computed===!0||e.formula||e.readOnly===!0||e.readonly===!0)continue}n[t]=i}return n}var J=e=>e==null?void 0:e.id??e._id??e.recordId,Y=(e,t)=>t?ee(e,t):e,X=new Set([`id`,`_id`,`recordId`]);function Z(e,t){return e?Object.entries(e).every(([e,n])=>e===t||X.has(e)?!0:n==null||n===``):!0}function Q(e,t,n){let r=[{object:e,action:`create`,data:t}];for(let e of n)for(let t of e.rows)Z(t,e.relationshipField)||r.push({object:e.childObject,action:`create`,data:{...Y(t,e.childSchema),[e.relationshipField]:{$ref:0}}});return r}function te(e,t,n,r){let i=[{object:e,action:`update`,id:t,data:n}];for(let e of r){let n=(e.rows||[]).map(n=>({...n,[e.relationshipField]:t})),{toCreate:r,toUpdate:a,toDelete:o}=ne(e.original||[],n);for(let t of r){if(Z(t,e.relationshipField))continue;let{id:n,_id:r,recordId:a,...o}=t;i.push({object:e.childObject,action:`create`,data:Y(o,e.childSchema)})}for(let t of a)i.push({object:e.childObject,action:`update`,id:J(t),data:Y(t,e.childSchema)});for(let t of o)i.push({object:e.childObject,action:`delete`,id:t})}return i}function ne(e,t){let n=new Set(t.map(J).filter(Boolean));return{toCreate:t.filter(e=>!J(e)),toUpdate:t.filter(e=>J(e)),toDelete:(e||[]).map(J).filter(e=>!!e&&!n.has(e))}}function re(e,t){return Array.isArray(e)?e.reduce((e,n)=>{let r=Number(n?.[t]);return e+(Number.isFinite(r)?r:0)},0):0}function ie(e){return Array.isArray(e)?e:e&&Array.isArray(e.records)?e.records:e&&Array.isArray(e.data)?e.data:e&&(e.id||e._id)?[e]:[]}async function ae(e,t,n){return n.length===0?[]:typeof e.bulk==`function`?ie(await e.bulk(t,`create`,n)):ie(await Promise.all(n.map(n=>e.create(t,n))))}async function oe(e,t,n,r){let i=[],a=r.rows.filter(e=>J(e)||!Z(e,r.relationshipField)).map(e=>({...e,[r.relationshipField]:n}));if(r.original!==void 0){let{toCreate:t,toUpdate:n,toDelete:o}=ne(r.original,a),s=await ae(e,r.childObject,t.map(e=>Y(e,r.childSchema)));for(let e of s){let t=J(e);t&&i.push({object:r.childObject,id:t})}await Promise.all(n.map(t=>e.update(r.childObject,J(t),Y(t,r.childSchema)))),await Promise.all(o.map(t=>e.delete(r.childObject,t)))}else{let t=await ae(e,r.childObject,a.map(e=>Y(e,r.childSchema)));for(let e of t){let t=J(e);t&&i.push({object:r.childObject,id:t})}}if(r.totalField){let i=re(r.rows,r.amountField||`amount`);await e.update(t,n,{[r.totalField]:i})}return{created:i}}var se=new Set([`id`,`_id`,`recordId`,`created_at`,`updated_at`,`created_by`,`updated_by`,`createdAt`,`updatedAt`,`createdBy`,`updatedBy`,`organization_id`,`tenant_id`,`space`,`owner`]),$=new Set([`position`,`sort_order`,`sequence`,`line_no`,`line_number`,`sort`]),ce=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`,`file`,`image`,`avatar`,`json`,`object`,`grid`,`table`,`location`,`vector`,`html`,`markdown`,`richtext`]);function le(e){switch(e){case`number`:case`percent`:case`rating`:case`slider`:return`number`;case`currency`:return`currency`;case`date`:case`datetime`:case`time`:return`date`;case`select`:case`picklist`:case`radio`:case`boolean`:case`toggle`:return`select`;case`lookup`:case`master_detail`:return`lookup`;default:return`text`}}function ue(e){if(e?.type===`boolean`||e?.type===`toggle`)return[{label:`Yes`,value:`true`},{label:`No`,value:`false`}];let t=e?.options;if(Array.isArray(t))return t.map(e=>typeof e==`object`&&e?{label:String(e.label??e.value),value:String(e.value)}:{label:String(e),value:String(e)})}function de(e,t){let n=e?.fields;if(!n||typeof n!=`object`)return;let r;for(let[e,i]of Object.entries(n)){let n=i;if(n?.reference===t){if(n?.type===`master_detail`)return e;n?.type===`lookup`&&!r&&(r=e)}}return r}var fe=[`name`,`title`,`subject`,`label`,`full_name`,`display_name`,`code`],pe={select:0,currency:1,number:1,lookup:2,date:3,text:4};function me(e,t){if(t<=0||e.length<=t)return e;let n=new Set,r=e.find(e=>fe.includes(e.field))??e[0];r&&n.add(r.field);for(let t of e)t.required&&n.add(t.field);let i=e.map((e,t)=>({c:e,i:t})).filter(({c:e})=>!n.has(e.field)).sort((e,t)=>(pe[e.c.type]??5)-(pe[t.c.type]??5)||e.i-t.i);for(let{c:e}of i){if(n.size>=t)break;n.add(e.field)}return e.map(e=>n.has(e.field)?e:{...e,defaultHidden:!0})}function he(e,t={}){let n=e?.fields;if(!n||typeof n!=`object`)return[];let r=new Set([...t.exclude??[],...t.relationshipField?[t.relationshipField]:[]]),i=[];for(let[e,t]of Object.entries(n)){let n=t;if(se.has(e)||r.has(e)||$.has(e)||n?.system||n?.readonly||n?.hidden||ce.has(n?.type))continue;let a={field:e,label:n?.label||e,type:le(n?.type),required:!!n?.required},o=ue(n);a.type===`select`&&o&&(a.options=o),a.type===`lookup`&&(a.reference=n?.reference,a.displayField=n?.display_field||n?.reference_field),n?.readonlyWhen&&(a.readonlyWhen=n.readonlyWhen),(n?.requiredWhen??n?.conditionalRequired)&&(a.requiredWhen=n.requiredWhen??n.conditionalRequired);let s=typeof n?.expression==`string`?n.expression:n?.expression?.source;s&&typeof s==`string`&&(a.computed=!0,a.expr=s,a.required=!1,typeof n?.scale==`number`&&(a.scale=n.scale)),i.push(a)}return me(i,t.maxColumns??6)}function ge(e,t){let n=e??[],r=t?.fields;return!n.length||!r||typeof r!=`object`?n:n.map(e=>{if(e.type)return e;let t=r[e.field];if(!t)return e;let n=le(t?.type),i={...e,type:n};i.label??=t?.label||e.field,i.required??=!!t?.required;let a=ue(t);n===`select`&&a&&!i.options&&(i.options=a),n===`lookup`&&(i.reference??=t?.reference,i.displayField??=t?.display_field||t?.reference_field),i.readonlyWhen==null&&t?.readonlyWhen&&(i.readonlyWhen=t.readonlyWhen),i.requiredWhen==null&&(t?.requiredWhen??t?.conditionalRequired)&&(i.requiredWhen=t.requiredWhen??t.conditionalRequired);let o=typeof t?.expression==`string`?t.expression:t?.expression?.source;return!i.computed&&o&&typeof o==`string`&&(i.computed=!0,i.expr=o,i.required=!1,typeof t?.scale==`number`&&(i.scale=t.scale)),i})}var _e=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`]);function ve(e,t={}){let n=e?.fields;if(!n||typeof n!=`object`)return[];let r=new Set([...t.exclude??[],...t.relationshipField?[t.relationshipField]:[]]),i=[];for(let[e,t]of Object.entries(n)){let n=t;se.has(e)||r.has(e)||$.has(e)||n?.system||n?.hidden||_e.has(n?.type)||i.push(e)}return i}var ye=new Set([`textarea`,`richtext`,`html`,`markdown`,`rich-text`,`file`,`image`,`avatar`,`attachment`,`json`,`location`,`address`]);function be(e,t,n={}){if(t===`grid`||t===`form`)return t;let r=e?.fields??{},i=ve(e,{relationshipField:n.relationshipField});return i.some(e=>ye.has(r[e]?.type))||i.length>8?`form`:`grid`}var xe=[`amount`,`total`,`subtotal`,`line_total`,`line_amount`,`net_amount`];function Se(e){let t=e.filter(e=>e.type===`number`||e.type===`currency`);if(t.length===0)return;let n=t.find(e=>e.computed);if(n)return n.field;let r=t.find(e=>xe.includes(e.field));if(r)return r.field;let i=[...t].reverse().find(e=>e.type===`currency`);return i?i.field:t[t.length-1].field}function Ce(e,t,n,r={}){let i=r.relationshipField||de(t,n);if(!i)throw Error(`MasterDetailForm: could not find a lookup/master_detail field on "${e}" referencing "${n}". Set relationshipField explicitly.`);let a=r.columns?.length?ge(r.columns,t):he(t,{relationshipField:i}),o=r.amountField||Se(a);return{childObject:e,relationshipField:i,columns:a,formFields:ve(t,{relationshipField:i}),mode:be(t,r.inlineEdit??(t?.fields)?.[i]?.inlineEdit,{relationshipField:i}),amountField:o,sortField:Object.keys(t?.fields??{}).find(e=>$.has(e))}}function we(e){if(!e)return{};let t={};return e.querySelectorAll(`[name]`).forEach(e=>{let n=e.getAttribute(`name`);if(n){if(e.tagName===`INPUT`){let r=e;if(r.type===`checkbox`){t[n]=r.checked;return}if(r.type===`radio`){r.checked&&(t[n]=r.value);return}if(r.type===`number`||r.type===`range`){if(r.value===``){t[n]=null;return}let e=Number(r.value);t[n]=Number.isFinite(e)?e:r.value;return}t[n]=r.value;return}t[n]=e.value}}),t}var Te=({details:e,state:n,setRows:r,formHostRef:a,taxRateField:o,formKey:s,onRowExpand:l,onAddViaForm:u})=>{let[d,f]=(0,t.useState)({}),p=(0,t.useRef)(``);(0,t.useEffect)(()=>{let e=a.current;if(!e)return;let t=()=>{let t=we(e),n;try{n=JSON.stringify(t)}catch{n=String(Math.random())}n!==p.current&&(p.current=n,f(t))};t();let n=()=>t();e.addEventListener(`input`,n),e.addEventListener(`change`,n);let r=[120,360,800].map(e=>setTimeout(t,e));return()=>{e.removeEventListener(`input`,n),e.removeEventListener(`change`,n),r.forEach(clearTimeout)}},[a,s,e.length]);let m=d[o],h=m===void 0?null:Number.isFinite(Number(m))?Number(m):0,g=e.reduce((e,t,r)=>e+re(n[r]?.rows??[],t.amountField||`amount`),0),_=h!==null&&e.some(e=>!!e.amountField),v=h??0,y=v/100*g,b=g+y,x=e=>`¥${e.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2})}`;return(0,c.jsxs)(c.Fragment,{children:[e.map((e,t)=>(0,c.jsxs)(`section`,{className:`space-y-2`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium text-foreground`,children:e.title||`Line Items`}),e.columns?.length?(0,c.jsx)(i.LineItemsField,{value:n[t]?.rows??[],onChange:e=>r(t,e),contextRecord:d,...e.inlineMode===`form`||(e.formFields?.length??0)>(e.columns?.length??0)?{onRowExpand:e=>l(t,e)}:{},displayMode:e.inlineMode===`form`?`list`:`grid`,...e.inlineMode===`form`?{onAdd:()=>u(t)}:{},field:{columns:e.columns,total_field:_?void 0:e.amountField||(e.totalField?`amount`:void 0),sort_field:e.sortField,min_rows:e.minRows,max_rows:e.maxRows,add_label:e.inlineMode===`form`?e.addLabel||`Add`:e.addLabel}}):(0,c.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,children:`Loading columns…`})]},`${e.childObject}-${t}`)),_&&(0,c.jsx)(`div`,{className:`flex justify-end`,children:(0,c.jsxs)(`dl`,{className:`w-64 space-y-1.5 text-sm`,"data-testid":`md-totals`,children:[(0,c.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,c.jsx)(`dt`,{className:`text-muted-foreground`,children:`Subtotal`}),(0,c.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-subtotal`,children:x(g)})]}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,c.jsxs)(`dt`,{className:`text-muted-foreground`,children:[`Tax (`,v,`%)`]}),(0,c.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-tax`,children:x(y)})]}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between border-t border-border pt-1.5 text-base font-semibold`,children:[(0,c.jsx)(`dt`,{children:`Total`}),(0,c.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-grand-total`,children:x(b)})]})]})})]})},Ee=({schema:e,dataSource:n,className:r})=>{let i=e.details||[],o=e.mode===`edit`&&!!e.recordId,s=i.some(e=>!e.relationshipField||!e.columns?.length||e.columns.some(e=>!e.type)),[l,u]=(0,t.useState)(s?null:i),d=l??i;(0,t.useEffect)(()=>{if(!s){u(i);return}if(!n||typeof n.getObjectSchema!=`function`)return;let t=!1;return(async()=>{let r=await Promise.all(i.map(async t=>{let r=t.columns?.length?t.columns.every(e=>!!e.type):!1;if(t.relationshipField&&r)return t;try{let r=await n.getObjectSchema(t.childObject);if(t.relationshipField&&t.columns?.length)return{...t,columns:ge(t.columns,r)};let i=Ce(t.childObject,r,e.objectName,{relationshipField:t.relationshipField,columns:t.columns,amountField:t.amountField});return{...t,relationshipField:i.relationshipField,columns:i.columns,formFields:t.formFields??i.formFields,inlineMode:t.inlineMode??i.mode,amountField:t.amountField??i.amountField,sortField:t.sortField??i.sortField}}catch{return t}}));t||u(r)})(),()=>{t=!0}},[n,e.objectName,e.details]);let[f,p]=(0,t.useState)(()=>i.map(()=>({rows:[],original:[]}))),m=(0,t.useRef)(f);m.current=f;let h=(0,t.useRef)({});(0,t.useEffect)(()=>{let e=n;if(!e||typeof e.getObjectSchema!=`function`)return;let t=!1,r=Array.from(new Set(i.map(e=>e.childObject).filter(Boolean)));return(async()=>{let n=await Promise.all(r.map(async t=>{try{return[t,await e.getObjectSchema(t)]}catch{return[t,null]}}));if(t)return;let i={};for(let[e,t]of n)t&&(i[e]=t);h.current=i})(),()=>{t=!0}},[n,e.objectName,e.details]);let[g,_]=(0,t.useState)(0),[v,y]=(0,t.useState)(!1),b=(0,t.useRef)(!1),x=(0,t.useRef)(null),S=(0,t.useCallback)(()=>{b.current=!1,y(!1),x.current&&=(clearTimeout(x.current),null)},[]);(0,t.useEffect)(()=>{let t=!1;if(!(!o||!n))return(async()=>{let r=await Promise.all(d.map(async t=>{if(!t.relationshipField)return{rows:[],original:[]};try{let r=(await n.find(t.childObject,{$filter:{[t.relationshipField]:e.recordId},$top:500}))?.data??[];return{rows:r.map(e=>({...e})),original:r.map(e=>({...e}))}}catch{return{rows:[],original:[]}}}));t||p(r)})(),()=>{t=!0}},[o,n,e.recordId,l]);let C=(0,t.useCallback)((e,t)=>{p(n=>n.map((n,r)=>r===e?{...n,rows:t}:n))},[]),w=e.taxRateField||`tax_rate`,[T,E]=(0,t.useState)(null),D=T?f[T.detailIdx]?.rows?.[T.rowIdx]:void 0,O=T?d[T.detailIdx]:void 0,k=(0,t.useCallback)((e,t,n)=>{p(r=>r.map((r,i)=>i===e?{...r,rows:r.rows.map((e,r)=>r===t?{...e,...n}:e)}:r))},[]),A=(0,t.useCallback)(e=>{p(t=>{let n=t.map((t,n)=>n===e?{...t,rows:[...t.rows,{}]}:t),r=n[e].rows.length-1;return E({detailIdx:e,rowIdx:r,isNew:!0}),n})},[]),j=(0,t.useCallback)(()=>{E(e=>(e?.isNew&&p(t=>t.map((t,n)=>n===e.detailIdx?{...t,rows:t.rows.filter((t,n)=>n!==e.rowIdx)}:t)),null))},[]),M=(0,t.useCallback)(async t=>{S(),e.onSuccess||a.toast.success(o?e.title?`${e.title} saved`:`Saved`:`Created`),o||(p(d.map(()=>({rows:[],original:[]}))),_(e=>e+1)),await e.onSuccess?.(t)},[o,e.onSuccess,e.title,d.length,S]),N=(0,t.useCallback)(t=>{S(),a.toast.error(t?.message||`Save failed`),e.onError?.(t)},[e,S]),P=(0,t.useCallback)(async t=>{let r=[];for(let i=0;i<d.length;i++){let a=d[i],{rows:s,original:c}=m.current[i];if(!a.relationshipField)continue;let{created:l}=await oe(n,e.objectName,t,{childObject:a.childObject,relationshipField:a.relationshipField,rows:s,original:o?c:void 0,amountField:a.amountField,totalField:a.totalField,childSchema:h.current[a.childObject]});r.push(...l)}return r},[d,o,n,e.objectName]),F=(0,t.useCallback)(async t=>{let r=J(t)??e.recordId;if(!r)throw Error(`MasterDetailForm: parent record has no id after save`);if(!n)throw Error(`MasterDetailForm: dataSource is required`);let i=[];try{i=await P(r)}catch(t){throw o||await Promise.allSettled([...i.map(e=>n.delete(e.object,e.id)),n.delete(e.objectName,r)]),t}await M(t)},[n,o,P,e,M]),I=typeof n?.batchTransaction==`function`,L=(0,t.useCallback)(async t=>{let r=n,i={...t};d.forEach((e,t)=>{e.totalField&&(i[e.totalField]=re(m.current[t]?.rows??[],e.amountField||`amount`))});let a=o?te(e.objectName,e.recordId,i,d.filter(e=>e.relationshipField).map((e,t)=>({childObject:e.childObject,relationshipField:e.relationshipField,rows:m.current[t]?.rows??[],original:m.current[t]?.original??[],childSchema:h.current[e.childObject]}))):Q(e.objectName,i,d.filter(e=>e.relationshipField).map((e,t)=>({childObject:e.childObject,relationshipField:e.relationshipField,rows:m.current[t]?.rows??[],childSchema:h.current[e.childObject]})));return(await r.batchTransaction(a))?.results?.[0]??{...i,id:e.recordId}},[n,d,e.objectName,e.recordId,o]),R=(0,t.useMemo)(()=>({type:`object-form`,objectName:e.objectName,mode:e.mode??`create`,recordId:e.recordId,initialValues:e.initialValues,initialData:e.initialData,formType:e.formType,sections:e.sections,fields:e.fields,title:e.title,showSubmit:!1,showCancel:!1,...I?{submitHandler:L,onSuccess:M}:{onSuccess:F},onError:N}),[e,F,I,L,M,N]),z=(0,t.useRef)(null),B=e.submitText??(o?`Save`:`Create`),V=(0,t.useCallback)(()=>{b.current||z.current?.querySelector(`form`)&&(b.current=!0,y(!0),setTimeout(()=>{(z.current?.querySelector(`form`))?.requestSubmit()},0),x.current=setTimeout(()=>S(),1500))},[S]);return(0,t.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]),(0,c.jsxs)(`div`,{className:(0,a.cn)(`space-y-6`,r,e.className),children:[(0,c.jsx)(`div`,{ref:z,children:(0,c.jsx)(Pe,{schema:R,dataSource:n},g)}),(0,c.jsx)(Te,{details:d,state:f,setRows:C,formHostRef:z,taxRateField:w,formKey:g,onRowExpand:(e,t)=>E({detailIdx:e,rowIdx:t}),onAddViaForm:A}),T&&O&&(0,c.jsxs)(a.Card,{className:`border-primary/40 shadow-none ring-1 ring-primary/10`,"data-testid":`md-row-form`,children:[(0,c.jsxs)(a.CardHeader,{className:`pb-2 flex flex-row items-center justify-between gap-2 space-y-0`,children:[(0,c.jsxs)(a.CardTitle,{className:`text-sm font-medium`,children:[O.title||`Line item`,` — row `,T.rowIdx+1]}),(0,c.jsx)(a.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs text-muted-foreground`,onClick:j,children:`Close`})]}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(Pe,{schema:{type:`object-form`,objectName:O.childObject,mode:`edit`,initialData:D??{},...O.formFields?.length?{fields:O.formFields}:{},submitText:`Apply`,submitHandler:async e=>e,onSuccess:e=>{k(T.detailIdx,T.rowIdx,e),E(null)},onCancel:j},dataSource:n},`row-${T.detailIdx}-${T.rowIdx}`)})]}),e.showSubmit!==!1&&(0,c.jsxs)(`div`,{className:`flex items-center justify-end gap-2 border-t border-border pt-4`,children:[e.onCancel&&(0,c.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:e.onCancel,disabled:v,"data-testid":`md-form-cancel`,children:e.cancelText??`Cancel`}),(0,c.jsx)(a.Button,{type:`button`,onClick:V,disabled:v||s&&!l,"data-testid":`md-form-submit`,children:v?`Saving…`:B})]})]})},De={1:void 0,2:`grid gap-4 grid-cols-1 @md:grid-cols-2`,3:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3`,4:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3 @4xl:grid-cols-4`},Oe=(0,l.createSafeTranslation)({"form.discardTitle":`Discard changes?`,"form.discardMessage":`You have unsaved changes. If you close this form now, your edits will be lost.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`},`form.discardTitle`),ke=({schema:e,dataSource:n,className:o})=>{let{fieldLabel:l}=(0,r.useSafeFieldLabel)(),{t:u}=Oe(),d=(0,r.usePreviewMode)(),[f,p]=(0,t.useState)(null),[m,h]=(0,t.useState)([]),[g,_]=(0,t.useState)({}),[v,y]=(0,t.useState)(!0),[b,x]=(0,t.useState)(null),[S,C]=(0,t.useState)(!1),[T,E]=(0,t.useState)(!1),[D,O]=(0,t.useState)(!1),k=(0,t.useRef)(!1),A=e.confirmOnDiscard!==!1,j=e.open!==!1,M=e.drawerSide||`right`,N=(0,t.useId)(),[P,F]=(0,t.useState)(()=>{let t={};return e.sections?.forEach((e,n)=>{let r=e.name||String(n);e.collapsed&&(t[r]=!0)}),t});(0,t.useEffect)(()=>{(async()=>{if(!n){y(!1);return}try{let t=await n.getObjectSchema(e.objectName);p(t)}catch(e){x(e),y(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(f||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){_(e.initialData||e.initialValues||{}),y(!1);return}if(!n){_(e.initialData||e.initialValues||{}),y(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);_(t||{})}catch(e){x(e)}finally{y(!1)}})()},[f,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let I=(0,t.useCallback)(t=>w(t,{objectSchema:f,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:l}),[f,e.readOnly,e.mode,e.objectName,l]);(0,t.useEffect)(()=>{if(!f&&n)return;if(e.customFields?.length){h(e.customFields),y(!1);return}if(e.sections?.length){y(!1);return}if(!f)return;let t=e.fields||Object.keys(f.fields||{}),r=[];for(let n of t){let t=typeof n==`string`?n:n.name;if(!t)continue;let a=f.fields?.[t];a&&r.push({name:t,label:l(e.objectName,t,a.label||t),type:(0,i.mapFieldTypeToFormType)(a.type),required:a.required||!1,disabled:e.readOnly||e.mode===`view`||a.readonly,placeholder:a.placeholder,description:a.help||a.description,validation:(0,i.buildValidationRules)(a),field:a,options:a.options,multiple:a.multiple})}h(r),y(!1)},[f,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let L=(0,t.useCallback)(async t=>{O(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=ee(t,f);return e.mode===`create`?r=await n.create(e.objectName,i):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,i)),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{O(!1)}},[e,n,f]),R=(0,t.useCallback)(()=>{E(!1),k.current&&(k.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),z=(0,t.useCallback)(e=>{k.current=e,A&&S?E(!0):R()},[A,S,R]),B=(0,t.useCallback)(()=>{k.current=!0,R()},[R]),V=(0,t.useMemo)(()=>{if(e.drawerWidth)return M===`left`||M===`right`?{width:e.drawerWidth,maxWidth:e.drawerWidth}:{height:e.drawerWidth,maxHeight:e.drawerWidth}},[e.drawerWidth,M]),U=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,W=e.showSubmit!==!1&&e.mode!==`view`,G=e.showCancel!==!1,K=e.submitText||(e.mode===`create`?`Create`:`Update`),q=e.cancelText||`Cancel`,J={type:`form`,objectName:e.objectName,layout:U,defaultValues:g,submitLabel:K,cancelLabel:q,showSubmit:W,showCancel:G,onSubmit:L,onCancel:B,onDirtyChange:C,showActions:!1,id:N},Y=()=>{if(b)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:b.message})]});if(v)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(e.sections?.length){let t=[];return e.sections.forEach((e,n)=>{let r=e.name||String(n),i=P[r]??e.collapsed??!1;t.push({name:`__section_${r}`,label:e.label||``,type:`section-divider`,colSpan:4,collapsible:e.collapsible,collapsed:i,onToggle:e.collapsible?()=>F(e=>({...e,[r]:!i})):void 0,className:e.className});let a=I(e);i?t.push(...a.map(e=>({...e,hidden:!0}))):t.push(...a)}),(0,c.jsx)(r.SchemaRenderer,{schema:{...J,fields:t}})}let t=H(m,f,e.columns,e.mode),n=De[t.columns||1];return(0,c.jsx)(r.SchemaRenderer,{schema:{...J,fields:t.fields,columns:t.columns,...n?{fieldContainerClass:n}:{}}})},X=e.subforms,Z=X?.length&&e.mode!==`view`?(0,c.jsx)(Ee,{schema:{type:`object-master-detail-form`,objectName:e.objectName,mode:e.mode===`edit`?`edit`:`create`,recordId:e.recordId,fields:e.fields,sections:e.sections,submitText:e.submitText,cancelText:q,details:X,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n}):Y();return d?(0,c.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,c.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,c.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),Z]}):(0,c.jsx)(a.Sheet,{open:j,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}z(!1)},children:(0,c.jsxs)(a.SheetContent,{side:M,className:(0,a.cn)(`overflow-y-auto`,o,e.className),style:V,children:[(e.title||e.description)&&(0,c.jsxs)(a.SheetHeader,{children:[e.title&&(0,c.jsx)(a.SheetTitle,{children:e.title}),e.description?(0,c.jsx)(a.SheetDescription,{children:e.description}):(0,c.jsx)(a.SheetDescription,{className:`sr-only`,children:`Complete the form fields, then submit or cancel.`})]}),(0,c.jsx)(`div`,{className:`@container py-4`,children:Z}),!b&&!v&&!(X?.length&&e.mode!==`view`)&&(W||G)&&(0,c.jsx)(`div`,{className:`shrink-0 border-t px-4 py-3 bg-background`,"data-testid":`drawer-form-footer`,children:(0,c.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[G&&(0,c.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:B,disabled:D,className:`w-full sm:w-auto`,children:q}),W&&(0,c.jsxs)(a.Button,{type:`submit`,form:N,disabled:D,className:`w-full sm:w-auto`,children:[D&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),K]})]})}),(0,c.jsx)(a.AlertDialog,{open:T,onOpenChange:E,children:(0,c.jsxs)(a.AlertDialogContent,{children:[(0,c.jsxs)(a.AlertDialogHeader,{children:[(0,c.jsx)(a.AlertDialogTitle,{children:u(`form.discardTitle`)}),(0,c.jsx)(a.AlertDialogDescription,{children:u(`form.discardMessage`)})]}),(0,c.jsxs)(a.AlertDialogFooter,{children:[(0,c.jsx)(a.AlertDialogCancel,{onClick:()=>{k.current=!1},children:u(`form.keepEditing`)}),(0,c.jsx)(a.AlertDialogAction,{onClick:R,children:u(`form.discard`)})]})]})})]})})};function Ae(e,t){let n=(0,u.deriveFieldGroupLayout)({fieldGroups:t,fields:Object.fromEntries(e.map(e=>[e.name,{group:e.group}]))});if(!n)return null;let r=new Set(n.flatMap(e=>e.fields)),i=e.map(e=>e.name).filter(e=>!r.has(e)),a=n.map(e=>({...e.key===void 0?{}:{name:e.key},...e.key===void 0?{}:{label:e.label??e.key},fields:[...e.fields],...e.collapse===`none`?{}:{collapsible:!0},...e.collapse===`collapsed`?{collapsed:!0}:{}}));if(i.length>0){let e=a[a.length-1];e&&e.name===void 0?e.fields=[...e.fields??[],...i]:a.push({fields:i})}return a}var je=(0,l.createSafeTranslation)({"form.discardTitle":`Discard changes?`,"form.discardMessage":`You have unsaved changes. If you close this form now, your edits will be lost.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`},`form.discardTitle`),Me={sm:`sm:max-w-sm`,default:`sm:max-w-lg`,lg:`sm:max-w-2xl`,xl:`sm:max-w-5xl`,full:`sm:max-w-[95vw] sm:w-full`},Ne=({schema:e,dataSource:n,className:l})=>{let{fieldLabel:u,sectionLabel:d}=(0,r.useSafeFieldLabel)(),{t:f}=je(),p=(0,r.usePreviewMode)(),m=(0,o.usePermissions)(),h=(0,t.useCallback)(t=>{if(!m?.isLoaded)return t;let n=[];for(let r of t){if(!r?.name){n.push(r);continue}m.checkField(e.objectName,r.name,`read`)&&(!m.checkField(e.objectName,r.name,`write`)&&e.mode!==`view`?n.push({...r,readOnly:!0,disabled:!0}):n.push(r))}return n},[m,e.objectName,e.mode]),[g,_]=(0,t.useState)(null),[v,y]=(0,t.useState)([]),[x,S]=(0,t.useState)({}),[C,T]=(0,t.useState)(!0),[E,D]=(0,t.useState)(null),[O,k]=(0,t.useState)(!1),[j,M]=(0,t.useState)(!1),[P,I]=(0,t.useState)(!1),z=(0,t.useRef)(!1),U=e.confirmOnDiscard!==!1,W=e.open!==!1,G=(0,t.useId)(),K=(0,t.useMemo)(()=>{if(e.sections?.length||e.customFields?.length)return null;let t=F(v,g);e.mode===`create`&&(t=L(t,g));let n=Ae(t,g?.fieldGroups);if(!n)return null;let r=e.columns&&e.columns>0?Math.min(Math.floor(e.columns),4):A(t.length);return n.map(e=>({...e,columns:r}))},[e.sections,e.customFields,e.columns,e.mode,v,g]),q=e.sections?.length?e.sections:K??void 0,J=(0,t.useMemo)(()=>q?.length||e.customFields?.length?null:H(v,g,e.columns,e.mode),[v,g,e.columns,e.mode,q,e.customFields]),Y=Me[(0,t.useMemo)(()=>{if(e.modalSize)return e.modalSize;if(J?.columns&&J.columns>1)return V(J.columns);if(q?.length){let e=Math.max(...q.map(e=>Number(e.columns)||1));if(e>1)return V(e)}return`default`},[e.modalSize,J,q])]||Me.default;(0,t.useEffect)(()=>{(async()=>{if(!n){T(!1);return}try{let t=await n.getObjectSchema(e.objectName);_(t)}catch(e){D(e),T(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(g||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){S(e.initialData||e.initialValues||{}),T(!1);return}if(!n){S(e.initialData||e.initialValues||{}),T(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);S(t||{})}catch(e){D(e)}finally{T(!1)}})()},[g,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let X=(0,t.useCallback)(t=>w(t,{objectSchema:g,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:u}),[g,e.readOnly,e.mode,e.objectName,u]);(0,t.useEffect)(()=>{if(!g&&n)return;if(e.customFields?.length){y(e.customFields),T(!1);return}if(e.sections?.length){T(!1);return}if(!g)return;let t=e.fields||Object.keys(g.fields||{}),r=[];for(let n of t){let t=typeof n==`string`?n:n.name;if(!t)continue;let a=g.fields?.[t];a&&r.push({name:t,label:u(e.objectName,t,a.label||t),type:(0,i.mapFieldTypeToFormType)(a.type),required:a.required||!1,disabled:e.readOnly||e.mode===`view`||a.readonly,placeholder:a.placeholder,description:a.help||a.description,validation:(0,i.buildValidationRules)(a),field:a,options:a.options,multiple:a.multiple,visibleWhen:a.visibleWhen,readonlyWhen:a.readonlyWhen,requiredWhen:a.requiredWhen??a.conditionalRequired,group:a.group})}y(r),T(!1)},[g,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let Z=(0,t.useCallback)(async t=>{k(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=ee(t,g);if(m?.isLoaded){let t={};for(let n of Object.keys(i))m.checkField(e.objectName,n,`write`)&&(t[n]=i[n]);i=t}return e.mode===`create`?r=await n.create(e.objectName,i):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,i)),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{k(!1)}},[e,n,g,m]),Q=(0,t.useCallback)(()=>{I(!1),z.current&&(z.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),te=(0,t.useCallback)(e=>{z.current=e,U&&j?I(!0):Q()},[U,j,Q]),ne=(0,t.useCallback)(()=>{z.current=!0,Q()},[Q]),re=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,ie=e.showSubmit!==!1&&e.mode!==`view`,ae=e.showCancel!==!1,oe=e.submitText||(e.mode===`create`?`Create`:`Update`),se=e.cancelText||`Cancel`,$={type:`form`,objectName:e.objectName,layout:re,defaultValues:x,submitLabel:oe,cancelLabel:se,showSubmit:ie,showCancel:ae,onSubmit:Z,onCancel:ne,onDirtyChange:M,showActions:!1,id:G},ce=()=>{if(E)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:E.message})]});if(C)return(0,c.jsx)(`div`,{className:`space-y-4`,"data-testid":`modal-form-skeleton`,children:[1,2,3].map(e=>(0,c.jsxs)(`div`,{className:`space-y-2`,children:[(0,c.jsx)(a.Skeleton,{className:`h-4 w-24`}),(0,c.jsx)(a.Skeleton,{className:`h-10 w-full`})]},e))});if(e.sections?.length){let t=e.sections,n=(e,t)=>e.name||e.label||String(t),i=t=>t.name?d(e.objectName,t.name,t.label||t.name):t.label,o=e=>(0,c.jsx)(r.SchemaRenderer,{schema:{...$,...B(h(X(e)),e.columns||1)}});return e.contentLayout===`tabbed`&&t.length>1?(0,c.jsxs)(a.Tabs,{defaultValue:n(t[0],0),className:`w-full`,children:[(0,c.jsx)(a.TabsList,{className:`mb-4`,children:t.map((e,t)=>(0,c.jsx)(a.TabsTrigger,{value:n(e,t),children:i(e)||`Section ${t+1}`},n(e,t)))}),t.map((e,t)=>(0,c.jsx)(a.TabsContent,{value:n(e,t),children:(0,c.jsx)(b,{description:e.description,columns:1,className:e.className,gridClassName:e.gridClassName,children:o(e)})},n(e,t)))]}):(0,c.jsx)(`div`,{className:`space-y-6`,children:t.map((e,t)=>(0,c.jsx)(b,{label:i(e),description:e.description,columns:1,className:e.className,gridClassName:e.gridClassName,children:o(e)},n(e,t)))})}if(K?.length){let t=Number(K[0]?.columns)||1,n=[];K.forEach((r,i)=>{let a=h(X(r));if(!a.length)return;let o=r.name?d(e.objectName,r.name,r.label||r.name):r.label;o&&n.push({name:`__section_${r.name||i}`,label:o,type:`section-divider`}),n.push(...t>1?N(a,t):a)});let i=R[t];return(0,c.jsx)(r.SchemaRenderer,{schema:{...$,fields:n,columns:t,...i?{fieldContainerClass:i}:{}}})}let t=J??H(v,g,e.columns,e.mode),n=R[t.columns||1];return(0,c.jsx)(r.SchemaRenderer,{schema:{...$,fields:h(t.fields),columns:t.columns,...n?{fieldContainerClass:n}:{}}})},le=e.subforms;if(p)return(0,c.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,c.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,c.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),ce()]});if(le?.length&&e.mode!==`view`)return(0,c.jsx)(a.Dialog,{open:W,onOpenChange:e.onOpenChange,children:(0,c.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(Y,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,l,e.className),children:[(e.title||e.description)&&(0,c.jsxs)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,c.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,c.jsx)(a.DialogDescription,{children:e.description}):(0,c.jsx)(a.DialogDescription,{className:`sr-only`,children:`Enter the record and its line items, then save.`})]}),(0,c.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:(0,c.jsx)(Ee,{schema:{type:`object-master-detail-form`,objectName:e.objectName,mode:e.mode===`edit`?`edit`:`create`,recordId:e.recordId,fields:e.fields,sections:e.sections,initialValues:e.initialValues,initialData:e.initialData,submitText:oe,cancelText:se,details:le,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n})})]})});let ue=!C&&!E&&(ie||ae);return(0,c.jsx)(a.Dialog,{open:W,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}te(!1)},children:(0,c.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(Y,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,l,e.className),children:[(e.title||e.description)&&(0,c.jsxs)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,c.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,c.jsx)(a.DialogDescription,{children:e.description}):(0,c.jsx)(a.DialogDescription,{className:`sr-only`,children:`Complete the form fields, then submit or cancel.`})]}),(0,c.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:ce()}),ue&&(0,c.jsx)(`div`,{className:`shrink-0 border-t px-4 sm:px-6 py-3 bg-background`,"data-testid":`modal-form-footer`,children:(0,c.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[ae&&(0,c.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:ne,disabled:O,className:`w-full sm:w-auto`,children:se}),ie&&(0,c.jsxs)(a.Button,{type:`submit`,form:G,disabled:O,className:`w-full sm:w-auto`,children:[O&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),oe]})]})}),(0,c.jsx)(a.AlertDialog,{open:P,onOpenChange:I,children:(0,c.jsxs)(a.AlertDialogContent,{children:[(0,c.jsxs)(a.AlertDialogHeader,{children:[(0,c.jsx)(a.AlertDialogTitle,{children:f(`form.discardTitle`)}),(0,c.jsx)(a.AlertDialogDescription,{children:f(`form.discardMessage`)})]}),(0,c.jsxs)(a.AlertDialogFooter,{children:[(0,c.jsx)(a.AlertDialogCancel,{onClick:()=>{z.current=!1},children:f(`form.keepEditing`)}),(0,c.jsx)(a.AlertDialogAction,{onClick:Q,children:f(`form.discard`)})]})]})})]})})},Pe=({schema:e,dataSource:n})=>{let i=(0,o.usePermissions)(),a=(0,t.useMemo)(()=>{if(!i?.isLoaded)return e;let t=t=>t?.name?i.checkField(e.objectName,t.name,`read`)?!i.checkField(e.objectName,t.name,`write`)&&e.mode!==`view`?{...t,readOnly:!0,disabled:!0}:t:null:t,n=e=>Array.isArray(e)?e.map(t).filter(Boolean):e;return{...e,fields:n(e.fields),sections:e.sections?.map(e=>({...e,fields:n(e.fields)}))}},[e,i]),{sectionLabel:s}=(0,r.useSafeFieldLabel)(),l=e=>e?.name?s(a.objectName,e.name,e.label||e.name):e?.label;if(a.subforms?.length&&a.mode!==`view`&&a.formType!==`drawer`&&a.formType!==`modal`)return(0,c.jsx)(Ee,{schema:{type:`object-master-detail-form`,objectName:a.objectName,mode:a.mode===`edit`?`edit`:`create`,recordId:a.recordId,initialValues:a.initialValues,initialData:a.initialData,formType:a.formType===`tabbed`?`tabbed`:`simple`,sections:a.sections,fields:a.fields,title:a.title,submitText:a.submitText,cancelText:a.cancelText,showSubmit:a.showSubmit,details:a.subforms,onSuccess:a.onSuccess,onError:a.onError,onCancel:a.onCancel,className:a.className},dataSource:n});if(a.formType===`tabbed`&&a.sections?.length)return(0,c.jsx)(U,{schema:{...a,formType:`tabbed`,sections:a.sections.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),defaultTab:a.defaultTab,tabPosition:a.tabPosition},dataSource:n,className:a.className});if(a.formType===`wizard`&&a.sections?.length)return(0,c.jsx)(W,{schema:{...a,formType:`wizard`,sections:a.sections.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),allowSkip:a.allowSkip,showStepIndicator:a.showStepIndicator,nextText:a.nextText,prevText:a.prevText,onStepChange:a.onStepChange},dataSource:n,className:a.className});if(a.formType===`split`&&a.sections?.length)return(0,c.jsx)(G,{schema:{...a,formType:`split`,sections:a.sections.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),splitDirection:a.splitDirection,splitSize:a.splitSize,splitResizable:a.splitResizable},dataSource:n,className:a.className});if(a.formType===`drawer`){let{layout:e,...t}=a,r=a.layout===`vertical`||a.layout===`horizontal`?a.layout:void 0;return(0,c.jsx)(ke,{schema:{...t,layout:r,formType:`drawer`,sections:a.sections?.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,collapsible:e.collapsible,collapsed:e.collapsed,className:e.className})),open:a.open,onOpenChange:a.onOpenChange,drawerSide:a.drawerSide,drawerWidth:a.drawerWidth},dataSource:n,className:a.className})}if(a.formType===`modal`){let{layout:e,...t}=a,r=a.layout===`vertical`||a.layout===`horizontal`?a.layout:void 0;return(0,c.jsx)(Ne,{schema:{...t,layout:r,formType:`modal`,sections:a.sections?.map(e=>({name:e.name,label:l(e),description:e.description,columns:e.columns,fields:e.fields,className:e.className,gridClassName:e.gridClassName})),open:a.open,onOpenChange:a.onOpenChange,modalSize:a.modalSize,modalCloseButton:a.modalCloseButton},dataSource:n,className:a.className})}return(0,c.jsx)(Fe,{schema:a,dataSource:n})},Fe=({schema:e,dataSource:n})=>{let{fieldLabel:s,sectionLabel:l}=(0,r.useSafeFieldLabel)(),u=(0,a.useIsMobile)(),d=(0,o.usePermissions)(),f=(0,t.useCallback)(t=>{if(!d?.isLoaded)return t;let n=[];for(let r of t)d.checkField(e.objectName,r.name,`read`)&&(!d.checkField(e.objectName,r.name,`write`)&&e.mode!==`view`?n.push({...r,readOnly:!0,disabled:!0,description:r.description??`You do not have edit access to this field.`}):n.push(r));return n},[d,e.objectName,e.mode]),[p,m]=(0,t.useState)(null),[h,g]=(0,t.useState)([]),[_,b]=(0,t.useState)(null),[x,S]=(0,t.useState)(!0),[C,w]=(0,t.useState)(null),[T,E]=(0,t.useState)(null),D=e.customFields&&e.customFields.length>0;(0,t.useEffect)(()=>{D&&(b(e.initialData||e.initialValues||{}),S(!1))},[D,e.initialData,e.initialValues]),(0,t.useEffect)(()=>{D?m({name:e.objectName,fields:{}}):e.objectName&&n?(async()=>{try{if(!n)throw Error(`DataSource is required when using ObjectQL schema fetching (inline fields not provided)`);let t=await n.getObjectSchema(e.objectName);if(!t)throw Error(`No schema found for object "${e.objectName}"`);m(t)}catch(e){w(e),S(!1)}})():D||S(!1)},[e.objectName,n,D]),(0,t.useEffect)(()=>{p&&!D&&(async()=>{if(!e.recordId||e.mode===`create`){b(e.initialData||e.initialValues||{}),S(!1);return}if(!D){if(!n){w(Error(`DataSource is required for fetching record data (inline data not provided)`)),S(!1);return}S(!0);try{let t=await n.findOne(e.objectName,e.recordId);b(t)}catch(e){console.error(`Failed to fetch record:`,e),w(e)}finally{S(!1)}}})()},[e.objectName,e.recordId,e.mode,e.initialValues,e.initialData,n,p,D]);let O=(0,t.useCallback)(e=>e,[]);(0,t.useEffect)(()=>{if(D&&e.customFields){g(e.customFields.map(O)),S(!1);return}if(!p)return;let t=[],r=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,className:r.className});let h=n(r.columns),g=o>1?N(u,o,h):u;p&&m?s.push(...g.map(e=>({...e,hidden:!0}))):s.push(...g)});let u=s,d=z(o);return(0,c.jsx)(`div`,{className:`w-full @container`,children:(0,c.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:u,layout:U,columns:o,...d?{fieldContainerClass:d}:{},defaultValues:M,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,onSubmit:k,onCancel:j}})})}let G=e.sections?.length,K=f(h),q=G?{fields:K,columns:e.columns}:H(K,p,e.columns,e.mode),J=e.mobile,Y=J?.fullscreenLongText?q.fields.map(e=>{let t=e.type;return t===`textarea`||t===`field:textarea`||t===`string-multiline`||t===`field:markdown`||t===`field:html`?{...e,mobile_fullscreen:!0}:e}):q.fields,X=J?.stepper,Z=J?.stepperMinFields??8,Q=Math.max(1,J?.stepperFieldsPerStep??1);if(!e.formType&&!G&&Y.length>=2&&(X===!0||X===`auto`&&u&&Y.length>=Z)){let t=Y,r=[];for(let e=0;e<t.length;e+=Q){let n=t.slice(e,e+Q);r.push({name:`step-${Math.floor(e/Q)+1}`,label:n[0]?.label||n[0]?.name||`Step ${Math.floor(e/Q)+1}`,fields:n})}return(0,c.jsx)(W,{schema:{...e,formType:`wizard`,sections:r,showStepIndicator:!0},dataSource:n,className:e.className})}let te={type:`form`,objectName:e.objectName,fields:Y,layout:U,columns:q.columns,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,resetOnSubmit:e.showReset||e.submitBehavior?.kind===`continue`||!e.submitBehavior&&e.resetOnSuccess&&e.mode===`create`,defaultValues:M,onSubmit:k,onCancel:j,className:e.className,mobileStickyActions:!!J?.stickyActions};return(0,c.jsx)(`div`,{className:J?.stickyActions?`w-full pb-20 md:pb-0`:`w-full`,"data-mobile-form":J?`true`:void 0,children:(0,c.jsx)(r.SchemaRenderer,{schema:te})})},Ie={text:200,email:254,url:2048,phone:32,textarea:5e3,markdown:5e3,html:5e3},Le=`_company_website_2`,Re=1500;function ze(e,t=[]){try{let n=new URL(e,typeof window<`u`?window.location.href:`http://localhost`);return typeof window<`u`&&n.origin===window.location.origin?!0:n.protocol!==`https:`&&n.protocol!==`http:`?!1:t.some(e=>{if(e===n.host)return!0;if(e.startsWith(`*.`)){let t=e.slice(1);return n.host.endsWith(t)&&n.host.length>t.length}return!1})}catch{return!1}}function Be(e){return e&&e.map(e=>{let t=Ie[String(e.type||``).toLowerCase()];return!t||(e.maxLength??e.max_length)?e:{...e,maxLength:t}})}var Ve=({config:e,dataSource:n,prefillParams:r,className:i})=>{let[o,l]=(0,t.useState)(!1),[u,d]=(0,t.useState)(!1),[f,p]=(0,t.useState)(null),[m,h]=(0,t.useState)(!(e.consent?.required??!!e.consent)),[g,_]=(0,t.useState)(null),v=(0,t.useRef)(null),y=(0,t.useRef)(0);(0,t.useEffect)(()=>{o||(y.current=Date.now())},[o]);let b=e.honeypot===!1?null:e.honeypot||Le,x=e.minFillTime??Re,S=(0,t.useMemo)(()=>Be(e.customFields),[e.customFields]),C=(0,t.useMemo)(()=>{if(!n||S&&S.length>0||!e.fields||e.fields.length===0)return;let t=async(e,t)=>t;return{...n,create:t,update:(e,t,n)=>Promise.resolve(n),delete:()=>Promise.reject(Error(`Not permitted on public form`))}},[n,S,e.fields]),w=(0,t.useMemo)(()=>{let t={};if(r)for(let[e,n]of Object.entries(r))t[e]=n;if(typeof window<`u`&&e.allowedPrefillFields?.length){let n=new Set(e.allowedPrefillFields);new URLSearchParams(window.location.search).forEach((e,r)=>{n.has(r)&&!(r in t)&&(t[r]=e)})}return Object.keys(t).length>0?t:void 0},[r,e.allowedPrefillFields]),T=(0,t.useCallback)(async t=>{if(e.consent?.required&&!m){_(e.texts?.consentRequired??`Please accept the privacy policy to continue.`);return}if(_(null),b&&v.current?.value){l(!0);return}if(x>0&&Date.now()-y.current<x){p(e.texts?.rateLimited??`Please take a moment to review your answers before submitting.`);return}let r={...t};b&&delete r[b],e.captchaToken&&(r._captcha=e.captchaToken),d(!0),p(null);try{n&&await n.create(e.objectName,r),l(!0);let t=e.thankYouPage?.redirectUrl;if(t)if(ze(t,e.allowedRedirectHosts)){let n=e.thankYouPage?.redirectDelay??3e3;setTimeout(()=>{window.location.href=t},n)}else console.warn(`[EmbeddableForm] Blocked unsafe redirect target:`,t),p(e.texts?.redirectBlocked??null)}catch(e){p(e instanceof Error?e.message:`Failed to submit form. Please try again.`)}finally{d(!1)}},[n,e,m,b,x]),E=(0,t.useCallback)(()=>{l(!1),p(null)},[]),D=(0,t.useMemo)(()=>{let t={};return e.branding?.backgroundColor&&(t.backgroundColor=e.branding.backgroundColor),t},[e.branding]);if(o){let t=e.thankYouPage,n=e.texts??{},r=Math.ceil((t?.redirectDelay??3e3)/1e3),o=(n.redirecting??`Redirecting in {{seconds}} seconds…`).replace(`{{seconds}}`,String(r));return(0,c.jsx)(`div`,{className:`min-h-screen flex items-center justify-center p-4 bg-gradient-to-b from-muted/40 via-background to-background ${i||``}`,style:D,children:(0,c.jsxs)(`div`,{className:`max-w-md w-full bg-card border rounded-xl shadow-sm p-8 text-center space-y-4`,children:[(0,c.jsx)(`div`,{className:`mx-auto inline-flex h-14 w-14 items-center justify-center rounded-full bg-emerald-50 text-emerald-600 dark:bg-emerald-500/10 dark:text-emerald-400`,children:(0,c.jsx)(s.CheckCircle2,{className:`h-8 w-8`,"aria-hidden":`true`})}),(0,c.jsx)(`h2`,{className:`text-xl font-semibold text-foreground`,children:t?.title||n.thankYouTitle||`Thank You!`}),(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t?.message||n.thankYouMessage||`Your submission has been received successfully.`}),e.allowMultiple&&(0,c.jsx)(a.Button,{variant:`outline`,size:`sm`,onClick:E,className:`mt-2`,children:n.submitAnother??`Submit Another Response`}),t?.redirectUrl&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:o})]})})}let O=e.texts??{},k=!!e.consent?.required,A=`${e.formId}-consent`;return(0,c.jsx)(`div`,{className:`min-h-screen flex items-center justify-center p-4 sm:p-6 bg-gradient-to-b from-muted/40 via-background to-background ${i||``}`,style:D,children:(0,c.jsxs)(`div`,{className:`max-w-2xl w-full bg-card border rounded-xl shadow-sm overflow-hidden`,children:[e.branding?.coverImage&&(0,c.jsx)(`div`,{className:`h-28 sm:h-32 w-full bg-cover bg-center`,style:{backgroundImage:`url(${JSON.stringify(e.branding.coverImage)})`},role:`presentation`}),(0,c.jsxs)(`div`,{className:`px-6 sm:px-8 pt-7 pb-5 border-b bg-muted/20`,style:e.branding?.primaryColor?{borderBottomColor:e.branding.primaryColor}:void 0,children:[e.branding?.logo&&(0,c.jsx)(`img`,{src:e.branding.logo,alt:``,className:`h-8 mb-4`}),e.title&&(0,c.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight text-foreground`,children:e.title}),e.description&&(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2 leading-relaxed`,children:e.description}),(0,c.jsx)(`p`,{className:`text-[11px] text-muted-foreground/70 mt-3`,"aria-hidden":`true`,children:O.requiredHint??`* Required field`})]}),(0,c.jsxs)(`div`,{className:`relative px-6 sm:px-8 py-6`,children:[f&&(0,c.jsx)(`div`,{role:`alert`,"aria-live":`assertive`,className:`mb-4 p-3 bg-destructive/10 border border-destructive/30 rounded-md text-sm text-destructive`,children:f}),(0,c.jsx)(Pe,{schema:{type:`object-form`,objectName:e.objectName,mode:`create`,fields:e.fields,customFields:S,initialData:w,onSuccess:T,submitText:u?O.submitting??`Submitting...`:O.submit??`Submit`},dataSource:C}),b&&(0,c.jsxs)(`div`,{"aria-hidden":`true`,className:`absolute left-[-10000px] top-auto h-px w-px overflow-hidden`,children:[(0,c.jsx)(`label`,{htmlFor:`${e.formId}-${b}`,children:`Do not fill this field`}),(0,c.jsx)(`input`,{ref:v,id:`${e.formId}-${b}`,type:`text`,name:b,tabIndex:-1,autoComplete:`off`,defaultValue:``})]}),e.consent&&(0,c.jsxs)(`div`,{className:`mt-4`,children:[(0,c.jsxs)(`label`,{className:`flex items-start gap-2 text-sm text-foreground cursor-pointer select-none`,children:[(0,c.jsx)(`input`,{type:`checkbox`,id:A,checked:m,onChange:e=>{h(e.target.checked),e.target.checked&&_(null)},"aria-required":k||void 0,"aria-invalid":g?`true`:void 0,"aria-describedby":g?`${A}-error`:void 0,className:`mt-0.5 h-4 w-4 rounded border-input accent-primary`}),(0,c.jsxs)(`span`,{className:`leading-relaxed`,children:[e.consent.label??O.consentLabelDefault??`I agree to the privacy policy.`,k&&(0,c.jsx)(`span`,{"aria-hidden":`true`,className:`text-destructive ml-0.5`,children:`*`}),e.consent.privacyUrl&&(0,c.jsxs)(c.Fragment,{children:[` `,(0,c.jsx)(`a`,{href:e.consent.privacyUrl,target:`_blank`,rel:`noopener noreferrer`,className:`underline text-primary hover:opacity-80`,children:O.consentLink??`Privacy policy`})]})]})]}),g&&(0,c.jsx)(`p`,{id:`${A}-error`,role:`alert`,className:`mt-1.5 text-xs text-destructive`,children:g})]}),u&&(0,c.jsxs)(`div`,{className:`mt-3 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,c.jsx)(s.Loader2,{className:`h-3.5 w-3.5 animate-spin`,"aria-hidden":`true`}),(0,c.jsx)(`span`,{children:O.submitting??`Submitting…`})]})]}),(0,c.jsxs)(`div`,{className:`px-6 sm:px-8 py-4 border-t bg-muted/20 flex flex-col sm:flex-row items-center justify-between gap-2`,children:[(0,c.jsxs)(`p`,{className:`inline-flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,c.jsx)(s.Lock,{className:`h-3 w-3`,"aria-hidden":`true`}),(0,c.jsx)(`span`,{children:O.secureNotice??`Your information is transmitted securely and only used to respond to your request.`})]}),(0,c.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground/80`,children:[e.privacyPolicyUrl&&(0,c.jsxs)(`a`,{href:e.privacyPolicyUrl,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1 underline hover:text-foreground`,children:[(0,c.jsx)(s.ShieldCheck,{className:`h-3 w-3`,"aria-hidden":`true`}),O.consentLink??`Privacy policy`]}),(0,c.jsx)(`span`,{children:O.poweredBy??`Powered by ObjectStack`})]})]})]})})};function He(e){return e<60?`${Math.round(e)}s`:e<3600?`${Math.floor(e/60)}m ${Math.round(e%60)}s`:`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`}var Ue=({formId:e,formTitle:n,metrics:r,className:i})=>{let o=(0,t.useMemo)(()=>{if(!r.abandonedSubmissions)return 100;let e=r.totalSubmissions+r.abandonedSubmissions;return e===0?0:Math.round(r.totalSubmissions/e*100)},[r.totalSubmissions,r.abandonedSubmissions]),s=(0,t.useMemo)(()=>r.dailySubmissions?.length?Math.max(...r.dailySubmissions.map(e=>e.count),1):1,[r.dailySubmissions]);return(0,c.jsxs)(`div`,{className:`space-y-4 ${i||``}`,children:[(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`h2`,{className:`text-lg font-semibold text-foreground`,children:n||`Form Analytics`}),(0,c.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Form ID: `,e]})]}),(0,c.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-4`,children:[(0,c.jsx)(a.Card,{children:(0,c.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,c.jsx)(a.CardDescription,{children:`Total Submissions`}),(0,c.jsx)(a.CardTitle,{className:`text-2xl`,children:r.totalSubmissions.toLocaleString()})]})}),(0,c.jsxs)(a.Card,{children:[(0,c.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,c.jsx)(a.CardDescription,{children:`Fill Rate`}),(0,c.jsxs)(a.CardTitle,{className:`text-2xl`,children:[o,`%`]})]}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(`div`,{className:`w-full bg-muted rounded-full h-2`,children:(0,c.jsx)(`div`,{className:`bg-primary rounded-full h-2 transition-all`,style:{width:`${o}%`}})})})]}),(0,c.jsx)(a.Card,{children:(0,c.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,c.jsx)(a.CardDescription,{children:`Avg. Completion Time`}),(0,c.jsx)(a.CardTitle,{className:`text-2xl`,children:r.avgCompletionTime?He(r.avgCompletionTime):`—`})]})})]}),r.dailySubmissions&&r.dailySubmissions.length>0&&(0,c.jsxs)(a.Card,{children:[(0,c.jsx)(a.CardHeader,{children:(0,c.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Daily Submissions`})}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(`div`,{className:`flex items-end gap-1 h-32`,children:r.dailySubmissions.map((e,t)=>(0,c.jsxs)(`div`,{className:`flex-1 flex flex-col items-center gap-1`,children:[(0,c.jsx)(`div`,{className:`w-full bg-primary/80 rounded-t transition-all hover:bg-primary`,style:{height:`${e.count/s*100}%`,minHeight:e.count>0?`4px`:`0`},title:`${e.date}: ${e.count} submissions`}),(0,c.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate w-full text-center`,children:e.date.slice(-5)})]},t))})})]}),r.fieldDropOff&&r.fieldDropOff.length>0&&(0,c.jsxs)(a.Card,{children:[(0,c.jsxs)(a.CardHeader,{children:[(0,c.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Field Completion Rates`}),(0,c.jsx)(a.CardDescription,{children:`Percentage of users who completed each field`})]}),(0,c.jsx)(a.CardContent,{children:(0,c.jsx)(`div`,{className:`space-y-3`,children:r.fieldDropOff.map((e,t)=>(0,c.jsxs)(`div`,{className:`space-y-1`,children:[(0,c.jsxs)(`div`,{className:`flex justify-between text-sm`,children:[(0,c.jsx)(`span`,{className:`text-foreground`,children:e.label}),(0,c.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.completionRate,`%`]})]}),(0,c.jsx)(`div`,{className:`w-full bg-muted rounded-full h-1.5`,children:(0,c.jsx)(`div`,{className:`rounded-full h-1.5 transition-all ${e.completionRate>=80?`bg-green-500`:e.completionRate>=50?`bg-yellow-500`:`bg-destructive`}`,style:{width:`${e.completionRate}%`}})})]},t))})})]})]})},We=({schema:e})=>{let n=(0,r.useSchemaContext)()?.dataSource,o=(0,r.useRecordContext)(),s=e.parentObject||o?.objectName,l=e.parentId||e.recordId||o?.recordId,[u,d]=(0,t.useState)([]),[f,p]=(0,t.useState)([]),[m,h]=(0,t.useState)(!0),[g,_]=(0,t.useState)(!1),[v,y]=(0,t.useState)(!1),[b,x]=(0,t.useState)(null),[S,C]=(0,t.useState)(null);(0,t.useEffect)(()=>{let t=n;if(!t||typeof t.getObjectSchema!=`function`)return;let r=!1;return t.getObjectSchema(e.childObject).then(e=>{r||C(e??null)}).catch(()=>{r||C(null)}),()=>{r=!0}},[n,e.childObject]);let w=(0,t.useCallback)(async()=>{if(!n||!l){h(!1);return}h(!0);try{let t=(await n.find(e.childObject,{$filter:{[e.relationshipField]:l},$top:500}))?.data??[];d(t.map(e=>({...e}))),p(t.map(e=>({...e}))),y(!1)}catch(e){x(e?.message||`Failed to load line items`)}finally{h(!1)}},[n,l,e.childObject,e.relationshipField]);(0,t.useEffect)(()=>{w()},[w]);let T=(0,t.useCallback)(e=>{d(e),y(!0)},[]),E=(0,t.useCallback)(async()=>{if(!(!n||!l)){_(!0),x(null);try{await oe(n,s||e.childObject,l,{childObject:e.childObject,relationshipField:e.relationshipField,rows:u,original:f,amountField:e.amountField,totalField:s?e.totalField:void 0,childSchema:S}),await w()}catch(e){x(e?.message||`Failed to save line items`)}finally{_(!1)}}},[n,l,u,f,e,s,w,S]),D=(0,t.useMemo)(()=>({columns:e.columns,total_field:e.totalField?e.amountField||`amount`:void 0,min_rows:e.minRows,max_rows:e.maxRows,allow_add:!e.readonly,allow_delete:!e.readonly}),[e]);return(0,c.jsxs)(a.Card,{className:(0,a.cn)(`shadow-none`),children:[(0,c.jsxs)(a.CardHeader,{className:`flex-row items-center justify-between gap-2 pb-2`,children:[(0,c.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:e.title||`Line Items`}),!e.readonly&&(0,c.jsx)(a.Button,{type:`button`,size:`sm`,onClick:E,disabled:g||m||!v||!l,children:g?`Saving…`:`Save`})]}),(0,c.jsxs)(a.CardContent,{children:[b&&(0,c.jsx)(`p`,{className:`mb-2 text-sm text-destructive`,children:b}),m?(0,c.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Loading…`}):l?(0,c.jsx)(i.LineItemsField,{value:u,onChange:T,field:D,readonly:e.readonly}):(0,c.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Save the record first to add line items.`})]})]})},Ge=({schema:e})=>(0,c.jsx)(Pe,{schema:e,dataSource:(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0});n.ComponentRegistry.register(`object-form`,Ge,{namespace:`plugin-form`,label:`Object Form`,category:`plugin`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`fields`,type:`array`,label:`Fields`},{name:`mode`,type:`enum`,label:`Mode`,enum:[`create`,`edit`,`view`]},{name:`formType`,type:`enum`,label:`Form Type`,enum:[`simple`,`tabbed`,`wizard`,`split`,`drawer`,`modal`]},{name:`sections`,type:`array`,label:`Sections`},{name:`title`,type:`string`,label:`Title`},{name:`description`,type:`string`,label:`Description`},{name:`layout`,type:`enum`,label:`Layout`,enum:[`vertical`,`horizontal`,`inline`,`grid`]},{name:`columns`,type:`number`,label:`Columns`},{name:`defaultTab`,type:`string`,label:`Default Tab`},{name:`tabPosition`,type:`enum`,label:`Tab Position`,enum:[`top`,`bottom`,`left`,`right`]},{name:`allowSkip`,type:`boolean`,label:`Allow Skip Steps`},{name:`showStepIndicator`,type:`boolean`,label:`Show Step Indicator`},{name:`splitDirection`,type:`enum`,label:`Split Direction`,enum:[`horizontal`,`vertical`]},{name:`splitSize`,type:`number`,label:`Split Panel Size (%)`},{name:`splitResizable`,type:`boolean`,label:`Split Resizable`},{name:`drawerSide`,type:`enum`,label:`Drawer Side`,enum:[`top`,`bottom`,`left`,`right`]},{name:`drawerWidth`,type:`string`,label:`Drawer Width`},{name:`modalSize`,type:`enum`,label:`Modal Size`,enum:[`sm`,`default`,`lg`,`xl`,`full`]}]}),n.ComponentRegistry.register(`form`,Ge,{namespace:`view`,skipFallback:!0,label:`Data Form View`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`fields`,type:`array`,label:`Fields`},{name:`mode`,type:`enum`,label:`Mode`,enum:[`create`,`edit`,`view`]}]}),n.ComponentRegistry.register(`embeddable-form`,({schema:e})=>(0,c.jsx)(Ve,{config:e}),{namespace:`plugin-form`,label:`Embeddable Form`,category:`plugin`,inputs:[{name:`formId`,type:`string`,label:`Form ID`,required:!0},{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`title`,type:`string`,label:`Form Title`},{name:`description`,type:`string`,label:`Description`},{name:`fields`,type:`array`,label:`Fields`},{name:`allowMultiple`,type:`boolean`,label:`Allow Multiple Submissions`}]}),n.ComponentRegistry.register(`form-analytics`,({schema:e})=>(0,c.jsx)(Ue,{formId:e.formId,formTitle:e.formTitle,metrics:e.metrics||{totalSubmissions:0}}),{namespace:`plugin-form`,label:`Form Analytics`,category:`plugin`,inputs:[{name:`formId`,type:`string`,label:`Form ID`,required:!0},{name:`formTitle`,type:`string`,label:`Form Title`},{name:`metrics`,type:`object`,label:`Submission Metrics`}]}),n.ComponentRegistry.register(`object-master-detail-form`,({schema:e})=>(0,c.jsx)(Ee,{schema:e,dataSource:(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0}),{namespace:`plugin-form`,label:`Master-Detail Form`,category:`plugin`,inputs:[{name:`objectName`,type:`string`,label:`Parent Object`,required:!0},{name:`mode`,type:`enum`,label:`Mode`,enum:[`create`,`edit`]},{name:`sections`,type:`array`,label:`Parent Sections`},{name:`details`,type:`array`,label:`Detail Collections`,required:!0}]}),n.ComponentRegistry.register(`line_items`,({schema:e})=>(0,c.jsx)(We,{schema:e}),{namespace:`record`,skipFallback:!0,label:`Line Items`,category:`record`,inputs:[{name:`childObject`,type:`string`,label:`Child Object`,required:!0},{name:`relationshipField`,type:`string`,label:`Relationship Field`,required:!0},{name:`columns`,type:`array`,label:`Columns`,required:!0},{name:`totalField`,type:`string`,label:`Parent Total Field`},{name:`amountField`,type:`string`,label:`Amount Column`}]}),e.DrawerForm=ke,e.EmbeddableForm=Ve,e.FormAnalytics=Ue,e.FormSection=b,e.LineItemsPanel=We,e.MasterDetailForm=Ee,e.ModalForm=Ne,e.ObjectForm=Pe,e.SplitForm=G,e.TabbedForm=U,e.WizardForm=W,e.applyAutoColSpan=N,e.applyAutoLayout=H,e.containerGridColsFor=z,e.deriveColumns=he,e.deriveDetail=Ce,e.deriveFormFields=ve,e.filterAutoGeneratedFields=L,e.filterCreateModeFields=I,e.filterSystemFields=F,e.findRelationshipField=de,e.inferColumns=A,e.inferModalSize=V,e.isAutoGeneratedFieldType=k,e.isWideFieldType=O,e.resolveInlineMode=be});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("react"),require("@object-ui/core"),require("@object-ui/react"),require("@object-ui/fields"),require("@object-ui/components"),require("@object-ui/permissions"),require("lucide-react"),require("react/jsx-runtime"),require("@object-ui/i18n"),require("@objectstack/spec/data")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`@object-ui/fields`,`@object-ui/components`,`@object-ui/permissions`,`lucide-react`,`react/jsx-runtime`,`@object-ui/i18n`,`@objectstack/spec/data`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginForm={},e.React,e._object_ui_core,e._object_ui_react,e._object_ui_fields,e._object_ui_components,e._object_ui_permissions,e.lucide_react,e.react_jsx_runtime,e._object_ui_i18n,e._objectstack_spec_data))})(this,function(e,t,n,r,i,a,o,s,c,l,u){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var d=Object.create,f=Object.defineProperty,p=Object.getOwnPropertyDescriptor,m=Object.getOwnPropertyNames,h=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty,_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=m(t),a=0,o=i.length,s;a<o;a++)s=i[a],!g.call(e,s)&&s!==n&&f(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=p(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:d(h(e)),_(t||!e||!e.__esModule?f(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);function v(e){try{return typeof window>`u`?!1:new URL(e,window.location.href).origin===window.location.origin}catch{return!1}}function y(e,t){if(!e)return null;let n=t?.id??t?.recordId??t?._id;if(n==null||n===``)return null;let r=e.replace(/\{(?:id|recordId)\}/g,String(n));return v(r)?r:null}var b=({label:e,description:n,collapsible:r=!1,collapsed:i=!1,columns:o=1,children:l,className:u,gridClassName:d,showBorder:f})=>{let[p,m]=(0,t.useState)(i),h={1:`grid-cols-1`,2:`grid-cols-1 md:grid-cols-2`,3:`grid-cols-1 md:grid-cols-2 lg:grid-cols-3`,4:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`},g=()=>{r&&m(!p)},_=f??!!e,v=e||n?(0,c.jsxs)(`div`,{className:(0,a.cn)(`flex items-start gap-2`,!_&&`mb-4`,r&&`cursor-pointer select-none`),onClick:g,role:r?`button`:void 0,"aria-expanded":r?!p:void 0,children:[r&&(0,c.jsx)(`span`,{className:`mt-0.5 text-muted-foreground`,children:p?(0,c.jsx)(s.ChevronRight,{className:`h-4 w-4`}):(0,c.jsx)(s.ChevronDown,{className:`h-4 w-4`})}),(0,c.jsxs)(`div`,{className:`flex-1`,children:[e&&(0,c.jsx)(`h3`,{className:`text-sm font-semibold text-foreground`,children:e}),n&&(0,c.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:n})]})]}):null,y=p?null:(0,c.jsx)(`div`,{className:(0,a.cn)(`grid gap-4`,d||h[o]),children:l});return _?(0,c.jsxs)(a.Card,{className:(0,a.cn)(`form-section bg-muted/40 shadow-none`,u),children:[v&&(0,c.jsx)(a.CardHeader,{className:`border-b border-border pb-3`,children:v}),y&&(0,c.jsx)(a.CardContent,{className:`pt-4`,children:y})]}):(0,c.jsxs)(`div`,{className:(0,a.cn)(`form-section`,u),children:[v,y]})};function x(e,t){return typeof t==`string`&&t.trim()||typeof t==`object`&&t&&typeof t.source==`string`&&t.source.trim()?{...e,visibleOn:t}:e}function S(e,t){let n=t.objectSchema?.fields?.[e];return n?{name:e,label:t.fieldLabel(t.objectName,e,n.label||e),type:(0,i.mapFieldTypeToFormType)(n.type),required:n.required||!1,disabled:t.readOnly||t.mode===`view`||n.readonly,placeholder:n.placeholder,description:n.help||n.description,validation:(0,i.buildValidationRules)(n),field:n,options:n.options,multiple:n.multiple,visibleWhen:n.visibleWhen,readonlyWhen:n.readonlyWhen,requiredWhen:n.requiredWhen,conditionalRequired:n.conditionalRequired}:{name:e,label:e,type:`input`}}function C(e,t){if(typeof e==`string`){let n=t.objectSchema?.fields?.[e];return x(S(e,t),n?.visible_on??n?.visibleOn)}let n=e;if(typeof n.field!=`string`)return x(n,n.visibleOn);let r=n.field,a=S(r,t);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&&!k(n.type)})}function L(e,t){return e.filter(e=>{if(e.type&&T.has(e.type))return!1;let n=t?.fields?.[e.name];return!n||!k(n.type)})}var R={1:void 0,2:`grid gap-4 grid-cols-1 @md:grid-cols-2`,3:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3`,4:`grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3 @4xl:grid-cols-4`};function z(e){return R[e&&e>0?Math.min(Math.floor(e),4):1]}function B(e,t){let n=t&&t>1?Math.min(Math.floor(t),4):1,r=n>1?N(e,n):e,i=z(n);return{fields:r,columns:n,...i?{fieldContainerClass:i}:{}}}function V(e){return e<=1?`default`:e===2?`xl`:`full`}function H(e,t,n,r){let i=[...e];if(i=F(i,t),r===`create`&&(i=L(i,t)),n!==void 0)return i=N(i,n),{fields:i,columns:n};let a=A(i.length);return i=N(i,a),{fields:i,columns:a}}var U=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,l]=(0,t.useState)(null),[u,d]=(0,t.useState)({}),[f,p]=(0,t.useState)(!0),[m,h]=(0,t.useState)(null),[g,_]=(0,t.useState)(e.defaultTab||e.sections[0]?.name||e.sections[0]?.label||`tab-0`);t.default.useEffect(()=>{(async()=>{if(!n){p(!1);return}try{let t=await n.getObjectSchema(e.objectName);l(t)}catch(e){h(e)}})()},[e.objectName,n]),t.default.useEffect(()=>{(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){d(e.initialData||e.initialValues||{}),p(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);d(t||{})}catch(e){h(e)}finally{p(!1)}})()},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let v=(0,t.useCallback)(t=>w(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[s,e.readOnly,e.mode,e.objectName,o]),y=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;return e.mode===`create`?r=await n.create(e.objectName,t):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,t)),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n]),x=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),S=(e,t)=>e.name||e.label||`tab-${t}`;if(m)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:m.message})]});if(f)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let C={type:`form`,fields:e.sections.flatMap(e=>v(e)),layout:`vertical`,defaultValues:u,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,onSubmit:y,onCancel:x},T=e.tabPosition===`left`||e.tabPosition===`right`;return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(a.Tabs,{value:g,onValueChange:_,orientation:T?`vertical`:`horizontal`,className:(0,a.cn)(T&&`flex gap-4`),children:[(0,c.jsx)(a.TabsList,{className:(0,a.cn)(T?`flex-col h-auto`:``,e.tabPosition===`bottom`&&`order-last`,e.tabPosition===`right`&&`order-last`),children:e.sections.map((e,t)=>(0,c.jsx)(a.TabsTrigger,{value:S(e,t),className:T?`w-full justify-start`:``,children:e.label||`Tab ${t+1}`},S(e,t)))}),(0,c.jsx)(`div`,{className:`flex-1`,children:e.sections.map((t,n)=>(0,c.jsx)(a.TabsContent,{value:S(t,n),className:`mt-0`,children:(0,c.jsx)(b,{description:t.description,columns:1,className:t.className,gridClassName:t.gridClassName,children:(0,c.jsx)(r.SchemaRenderer,{schema:{...C,...B(v(t),t.columns||1),showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1}})})},S(t,n)))})]})})},W=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[l,u]=(0,t.useState)(null),[d,f]=(0,t.useState)({}),[p,m]=(0,t.useState)(!0),[h,g]=(0,t.useState)(null),[_,x]=(0,t.useState)(0),[S,C]=(0,t.useState)(new Set),[T,E]=(0,t.useState)(!1),[D,O]=(0,t.useState)(null),k=t.default.useId(),[A,j]=(0,t.useState)(0),M=t.default.useRef(!1),N=e.sections.length,P=_===0,F=_===N-1;t.default.useEffect(()=>{(async()=>{if(!n){m(!1);return}try{let t=await n.getObjectSchema(e.objectName);u(t)}catch(e){g(e)}})()},[e.objectName,n]),t.default.useEffect(()=>{(l||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){M.current||=(f(e.initialData||e.initialValues||{}),!0),m(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);f(t||{})}catch(e){g(e)}finally{m(!1)}})()},[l,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let I=(0,t.useCallback)(t=>w(t,{objectSchema:l,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[l,e.readOnly,e.mode,e.objectName,o]),L=(0,t.useMemo)(()=>_>=0&&_<N?I(e.sections[_]):[],[_,N,e.sections,I]),R=(0,t.useCallback)(async t=>{let r={...d,...t};if(f(r),C(e=>new Set(e).add(_)),F){E(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(r),r;let t;if(e.mode===`create`?t=await n.create(e.objectName,r):e.mode===`edit`&&e.recordId&&(t=await n.update(e.objectName,e.recordId,r)),e.onSuccess)await e.onSuccess(t);else if(e.submitBehavior){let t=e.submitBehavior;switch(t.kind){case`redirect`:v(t.url)&&setTimeout(()=>window.location.assign(t.url),t.delayMs??0);break;case`continue`:f({}),C(new Set),x(0),j(e=>e+1);break;default:{let n=t.kind===`thank-you`&&t.message?t.message:e.successMessage||(e.mode===`create`?`Created`:`Saved`);a.toast.success(n),O({title:t.kind===`thank-you`?t.title:void 0,message:n});break}}}else{let n=y(e.navigateOnSuccess,t);if(n)return window.location.assign(n),t;a.toast.success(e.successMessage||(e.mode===`create`?`Created`:`Saved`)),e.resetOnSuccess&&e.mode===`create`&&(f({}),C(new Set),x(0),j(e=>e+1))}return t}catch(t){throw e.onError&&e.onError(t),t}finally{E(!1)}}else z(_+1)},[d,_,F,e,n]),z=(0,t.useCallback)(t=>{t>=0&&t<N&&(x(t),e.onStepChange&&e.onStepChange(t))},[N,e]),V=(0,t.useCallback)(()=>{z(_-1)},[_,z]),H=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),U=(0,t.useCallback)(t=>{(e.allowSkip||S.has(t)||t<=_)&&z(t)},[e.allowSkip,S,_,z]);if(h)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:h.message})]});if(p)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(D)return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(`div`,{className:`rounded-md border bg-card p-8 text-center`,children:[(0,c.jsx)(`h3`,{className:`text-lg font-semibold`,children:D.title??`Thanks!`}),D.message&&(0,c.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:D.message})]})});let W=e.sections[_];return(0,c.jsxs)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:[e.showStepIndicator!==!1&&(0,c.jsx)(`nav`,{"aria-label":`Progress`,className:`mb-8`,children:(0,c.jsx)(`ol`,{className:`flex items-center`,children:e.sections.map((t,n)=>{let r=n===_,i=S.has(n),o=e.allowSkip||i||n<=_;return(0,c.jsxs)(`li`,{className:(0,a.cn)(`relative flex-1`,n!==N-1&&`pr-8 sm:pr-12`),children:[n!==N-1&&(0,c.jsx)(`div`,{className:`absolute top-3 sm:top-4 left-6 -right-4 sm:left-10 sm:-right-2 h-0.5`,"aria-hidden":`true`,children:(0,c.jsx)(`div`,{className:(0,a.cn)(`h-full`,i?`bg-primary`:`bg-muted`)})}),(0,c.jsxs)(`button`,{type:`button`,className:(0,a.cn)(`group relative flex items-center`,o?`cursor-pointer`:`cursor-not-allowed`),onClick:()=>U(n),disabled:!o,children:[(0,c.jsx)(`span`,{className:(0,a.cn)(`flex h-6 w-6 sm:h-8 sm:w-8 items-center justify-center rounded-full text-xs sm:text-sm font-medium transition-colors`,i&&`bg-primary text-primary-foreground`,r&&!i&&`border-2 border-primary bg-background text-primary`,!r&&!i&&`border-2 border-muted bg-background text-muted-foreground`),children:i?(0,c.jsx)(s.Check,{className:`h-3 w-3 sm:h-4 sm:w-4`}):n+1}),(0,c.jsx)(`span`,{className:`ml-2 sm:ml-3 text-xs sm:text-sm font-medium hidden sm:block`,children:(0,c.jsx)(`span`,{className:(0,a.cn)(r?`text-foreground`:`text-muted-foreground`),children:t.label||`Step ${n+1}`})})]})]},n)})})}),(0,c.jsx)(`div`,{className:`min-h-[200px]`,children:W&&(0,c.jsx)(b,{label:W.label,description:W.description,columns:1,className:W.className,gridClassName:W.gridClassName,children:L.length>0?(0,c.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,id:k,...B(L,W.columns||1),layout:`vertical`,defaultValues:d,showSubmit:!1,showCancel:!1,onSubmit:R}},A):(0,c.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:`No fields configured for this step`})})}),(0,c.jsxs)(`div`,{className:`flex items-center justify-between mt-6 pt-4 border-t`,children:[(0,c.jsx)(`div`,{children:e.showCancel!==!1&&(0,c.jsx)(a.Button,{variant:`ghost`,onClick:H,children:e.cancelText||`Cancel`})}),(0,c.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,c.jsxs)(`span`,{className:`text-sm text-muted-foreground mr-2`,children:[`Step `,_+1,` of `,N]}),!P&&(0,c.jsxs)(a.Button,{variant:`outline`,onClick:V,children:[(0,c.jsx)(s.ChevronLeft,{className:`h-4 w-4 mr-1`}),e.prevText||`Back`]}),F?(0,c.jsxs)(a.Button,{type:`submit`,form:k,disabled:T||e.mode===`view`,children:[T&&(0,c.jsx)(s.Loader2,{className:`mr-2 h-4 w-4 animate-spin`,"aria-hidden":!0}),T?`Submitting...`:e.submitText||(e.mode===`create`?`Create`:`Update`)]}):(0,c.jsxs)(a.Button,{type:`submit`,form:k,children:[e.nextText||`Next`,(0,c.jsx)(s.ChevronRight,{className:`h-4 w-4 ml-1`})]})]})]})]})},G=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,l]=(0,t.useState)(null),[u,d]=(0,t.useState)({}),[f,p]=(0,t.useState)(!0),[m,h]=(0,t.useState)(null);(0,t.useEffect)(()=>{(async()=>{if(!n){p(!1);return}try{let t=await n.getObjectSchema(e.objectName);l(t)}catch(e){h(e),p(!1)}})()},[e.objectName,n]),(0,t.useEffect)(()=>{(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){d(e.initialData||e.initialValues||{}),p(!1);return}if(!n){d(e.initialData||e.initialValues||{}),p(!1);return}try{let t=await n.findOne(e.objectName,e.recordId);d(t||{})}catch(e){h(e)}finally{p(!1)}})()},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let g=(0,t.useCallback)(t=>w(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,fieldLabel:o}),[s,e.readOnly,e.mode,e.objectName,o]),_=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;return e.mode===`create`?r=await n.create(e.objectName,t):e.mode===`edit`&&e.recordId&&(r=await n.update(e.objectName,e.recordId,t)),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n]),v=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),y=(0,t.useMemo)(()=>e.sections.slice(0,1),[e.sections]),x=(0,t.useMemo)(()=>e.sections.slice(1),[e.sections]);(0,t.useMemo)(()=>e.sections.flatMap(e=>g(e)),[e.sections,g]);let S=e.splitDirection||`horizontal`,C=e.splitSize||50;if(m)return(0,c.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,c.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,c.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:m.message})]});if(f)return(0,c.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,c.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let T={type:`form`,objectName:e.objectName,layout:`vertical`,defaultValues:u,onSubmit:_,onCancel:v},E=(t,n)=>(0,c.jsx)(`div`,{className:`space-y-6 p-4`,children:t.map((t,i)=>(0,c.jsx)(b,{label:t.label,description:t.description,columns:1,className:t.className,gridClassName:t.gridClassName,children:(0,c.jsx)(r.SchemaRenderer,{schema:{...T,...B(g(t),t.columns||1),showSubmit:n&&e.showSubmit!==!1&&e.mode!==`view`,showCancel:n&&e.showCancel!==!1,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText}})},t.name||t.label||i))});return(0,c.jsx)(`div`,{className:(0,a.cn)(`w-full`,i,e.className),children:(0,c.jsxs)(a.ResizablePanelGroup,{orientation:S,className:`min-h-[300px] rounded-lg border`,children:[(0,c.jsx)(a.ResizablePanel,{defaultSize:C,minSize:20,children:E(y,x.length===0)}),x.length>0&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(a.ResizableHandle,{withHandle:e.splitResizable!==!1}),(0,c.jsx)(a.ResizablePanel,{defaultSize:100-C,minSize:20,children:E(x,!0)})]})]})})},K=new Set([`id`,`_id`,`created_at`,`updated_at`,`createdAt`,`updatedAt`,`organization_id`,`organizationId`]),q=new Set([`formula`,`summary`,`rollup`,`lookup_value`,`auto_number`,`autonumber`,`computed`]);function ee(e,t){if(!e||typeof e!=`object`)return e;let n={},r=t?.fields;for(let[t,i]of Object.entries(e))if(!K.has(t)){if(r){let e=r[t];if(!e)continue;let n=String(e.type||``).toLowerCase();if(q.has(n)||e.computed===!0||e.formula||e.readOnly===!0||e.readonly===!0)continue}n[t]=i}return n}var J=e=>e==null?void 0:e.id??e._id??e.recordId,Y=(e,t)=>t?ee(e,t):e,X=new Set([`id`,`_id`,`recordId`]);function Z(e,t){return!e||Object.entries(e).every(([e,n])=>e===t||X.has(e)?!0:n==null||n===``)}function Q(e,t,n){let r=[{object:e,action:`create`,data:t}];for(let e of n)for(let t of e.rows)Z(t,e.relationshipField)||r.push({object:e.childObject,action:`create`,data:{...Y(t,e.childSchema),[e.relationshipField]:{$ref:0}}});return r}function te(e,t,n,r){let i=[{object:e,action:`update`,id:t,data:n}];for(let e of r){let n=(e.rows||[]).map(n=>({...n,[e.relationshipField]:t})),{toCreate:r,toUpdate:a,toDelete:o}=ne(e.original||[],n);for(let t of r){if(Z(t,e.relationshipField))continue;let{id:n,_id:r,recordId:a,...o}=t;i.push({object:e.childObject,action:`create`,data:Y(o,e.childSchema)})}for(let t of a)i.push({object:e.childObject,action:`update`,id:J(t),data:Y(t,e.childSchema)});for(let t of o)i.push({object:e.childObject,action:`delete`,id:t})}return i}function ne(e,t){let n=new Set(t.map(J).filter(Boolean));return{toCreate:t.filter(e=>!J(e)),toUpdate:t.filter(e=>J(e)),toDelete:(e||[]).map(J).filter(e=>!!e&&!n.has(e))}}function re(e,t){return Array.isArray(e)?e.reduce((e,n)=>{let r=Number(n?.[t]);return e+(Number.isFinite(r)?r:0)},0):0}function ie(e){return Array.isArray(e)?e:e&&Array.isArray(e.records)?e.records:e&&Array.isArray(e.data)?e.data:e&&(e.id||e._id)?[e]:[]}async function ae(e,t,n){return n.length===0?[]:typeof e.bulk==`function`?ie(await e.bulk(t,`create`,n)):ie(await Promise.all(n.map(n=>e.create(t,n))))}async function oe(e,t,n,r){let i=[],a=r.rows.filter(e=>J(e)||!Z(e,r.relationshipField)).map(e=>({...e,[r.relationshipField]:n}));if(r.original!==void 0){let{toCreate:t,toUpdate:n,toDelete:o}=ne(r.original,a),s=await ae(e,r.childObject,t.map(e=>Y(e,r.childSchema)));for(let e of s){let t=J(e);t&&i.push({object:r.childObject,id:t})}await Promise.all(n.map(t=>e.update(r.childObject,J(t),Y(t,r.childSchema)))),await Promise.all(o.map(t=>e.delete(r.childObject,t)))}else{let t=await ae(e,r.childObject,a.map(e=>Y(e,r.childSchema)));for(let e of t){let t=J(e);t&&i.push({object:r.childObject,id:t})}}if(r.totalField){let i=re(r.rows,r.amountField||`amount`);await e.update(t,n,{[r.totalField]:i})}return{created:i}}var se=new Set([`id`,`_id`,`recordId`,`created_at`,`updated_at`,`created_by`,`updated_by`,`createdAt`,`updatedAt`,`createdBy`,`updatedBy`,`organization_id`,`tenant_id`,`space`,`owner`]),$=new Set([`position`,`sort_order`,`sequence`,`line_no`,`line_number`,`sort`]),ce=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`,`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,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": "13.1.0",
3
+ "version": "14.0.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": "^13.0.0",
19
- "lucide-react": "^1.22.0",
20
- "@object-ui/components": "13.1.0",
21
- "@object-ui/core": "13.1.0",
22
- "@object-ui/fields": "13.1.0",
23
- "@object-ui/i18n": "13.1.0",
24
- "@object-ui/permissions": "13.1.0",
25
- "@object-ui/react": "13.1.0",
26
- "@object-ui/types": "13.1.0"
18
+ "@objectstack/spec": "^14.6.0",
19
+ "lucide-react": "^1.24.0",
20
+ "@object-ui/components": "14.0.0",
21
+ "@object-ui/core": "14.0.0",
22
+ "@object-ui/fields": "14.0.0",
23
+ "@object-ui/i18n": "14.0.0",
24
+ "@object-ui/permissions": "14.0.0",
25
+ "@object-ui/react": "14.0.0",
26
+ "@object-ui/types": "14.0.0"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "react": "^18.0.0 || ^19.0.0",
@@ -31,11 +31,11 @@
31
31
  },
32
32
  "devDependencies": {
33
33
  "@vitejs/plugin-react": "^6.0.3",
34
- "msw": "^2.14.6",
34
+ "msw": "^2.15.0",
35
35
  "typescript": "^6.0.3",
36
- "vite": "^8.1.3",
36
+ "vite": "^8.1.4",
37
37
  "vite-plugin-dts": "^5.0.3",
38
- "@object-ui/data-objectstack": "13.1.0"
38
+ "@object-ui/data-objectstack": "14.0.0"
39
39
  },
40
40
  "keywords": [
41
41
  "objectui",