@object-ui/plugin-form 17.5.0 → 17.7.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.
Files changed (78) hide show
  1. package/CHANGELOG.md +4841 -0
  2. package/README.md +772 -77
  3. package/dist/DrawerForm.d.ts +30 -2
  4. package/dist/DrawerForm.d.ts.map +1 -1
  5. package/dist/EmbeddableForm.d.ts.map +1 -1
  6. package/dist/FormAnalytics.d.ts.map +1 -1
  7. package/dist/LineItemsPanel.d.ts +6 -3
  8. package/dist/LineItemsPanel.d.ts.map +1 -1
  9. package/dist/MasterDetailForm.d.ts +31 -10
  10. package/dist/MasterDetailForm.d.ts.map +1 -1
  11. package/dist/ModalForm.d.ts +48 -4
  12. package/dist/ModalForm.d.ts.map +1 -1
  13. package/dist/ObjectForm.d.ts +18 -2
  14. package/dist/ObjectForm.d.ts.map +1 -1
  15. package/dist/SplitForm.d.ts +37 -2
  16. package/dist/SplitForm.d.ts.map +1 -1
  17. package/dist/TabbedForm.d.ts +65 -3
  18. package/dist/TabbedForm.d.ts.map +1 -1
  19. package/dist/WizardForm.d.ts +149 -11
  20. package/dist/WizardForm.d.ts.map +1 -1
  21. package/dist/autoLayout.d.ts +12 -3
  22. package/dist/autoLayout.d.ts.map +1 -1
  23. package/dist/closedAffordanceNotice.d.ts +14 -0
  24. package/dist/closedAffordanceNotice.d.ts.map +1 -0
  25. package/dist/customFieldsMerge.d.ts +29 -0
  26. package/dist/customFieldsMerge.d.ts.map +1 -0
  27. package/dist/deriveMasterDetail.d.ts +33 -9
  28. package/dist/deriveMasterDetail.d.ts.map +1 -1
  29. package/dist/fieldGroups.d.ts +176 -0
  30. package/dist/fieldGroups.d.ts.map +1 -1
  31. package/dist/fieldWriteGate.d.ts +116 -0
  32. package/dist/fieldWriteGate.d.ts.map +1 -0
  33. package/dist/flatFields.d.ts +30 -0
  34. package/dist/flatFields.d.ts.map +1 -0
  35. package/dist/formChrome.d.ts +55 -0
  36. package/dist/formChrome.d.ts.map +1 -0
  37. package/dist/index.d.ts +131 -25
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3676 -1967
  40. package/dist/index.umd.cjs +1 -1
  41. package/dist/initialRecord.d.ts +72 -0
  42. package/dist/initialRecord.d.ts.map +1 -0
  43. package/dist/loadFailure.d.ts +28 -0
  44. package/dist/loadFailure.d.ts.map +1 -0
  45. package/dist/masterDetailTx.d.ts.map +1 -1
  46. package/dist/occSave.d.ts +6 -1
  47. package/dist/occSave.d.ts.map +1 -1
  48. package/dist/recordInvalidation.d.ts +33 -0
  49. package/dist/recordInvalidation.d.ts.map +1 -0
  50. package/dist/recordReadGate.d.ts +34 -0
  51. package/dist/recordReadGate.d.ts.map +1 -0
  52. package/dist/sanitize.d.ts +187 -5
  53. package/dist/sanitize.d.ts.map +1 -1
  54. package/dist/schemaDefaults.d.ts +51 -30
  55. package/dist/schemaDefaults.d.ts.map +1 -1
  56. package/dist/sectionFields.d.ts +65 -2
  57. package/dist/sectionFields.d.ts.map +1 -1
  58. package/dist/sectionGroups.d.ts +62 -0
  59. package/dist/sectionGroups.d.ts.map +1 -0
  60. package/dist/sectionPredicateDiagnostic.d.ts +38 -0
  61. package/dist/sectionPredicateDiagnostic.d.ts.map +1 -0
  62. package/dist/submitRedirect.d.ts +148 -0
  63. package/dist/submitRedirect.d.ts.map +1 -0
  64. package/dist/submitRedirectNavigation.d.ts +82 -0
  65. package/dist/submitRedirectNavigation.d.ts.map +1 -0
  66. package/dist/submitTarget.d.ts +119 -0
  67. package/dist/submitTarget.d.ts.map +1 -0
  68. package/dist/successBehavior.d.ts +44 -8
  69. package/dist/successBehavior.d.ts.map +1 -1
  70. package/dist/thankYouRedirectCountdown.d.ts +17 -0
  71. package/dist/thankYouRedirectCountdown.d.ts.map +1 -0
  72. package/dist/thankYouRedirectNavigation.d.ts +111 -0
  73. package/dist/thankYouRedirectNavigation.d.ts.map +1 -0
  74. package/dist/uploadGate.d.ts +35 -0
  75. package/dist/uploadGate.d.ts.map +1 -0
  76. package/dist/writePayload.d.ts +68 -0
  77. package/dist/writePayload.d.ts.map +1 -0
  78. package/package.json +13 -12
@@ -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("@objectstack/spec/data"),require("lucide-react"),require("@object-ui/i18n"),require("react/jsx-runtime")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`@object-ui/fields`,`@object-ui/components`,`@object-ui/permissions`,`@objectstack/spec/data`,`lucide-react`,`@object-ui/i18n`,`react/jsx-runtime`],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._objectstack_spec_data,e.lucide_react,e._object_ui_i18n,e.react_jsx_runtime))})(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||!g.call(e,`default`)?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}function b(e){return typeof e==`object`&&!!e&&typeof e.dialect==`string`&&typeof e.source==`string`}function x(e){return(0,s.isRuntimeDefaultToken)(e)||b(e)}function S(e){return e!=null&&!x(e)}function C(e){return e?.mode===`create`||!e?.recordId}function w(e,t){return!(!e?.required||t&&x(e.defaultValue))}function T(e){let t=e?.fields;if(!t||typeof t!=`object`)return{};let n={};for(let e of Object.keys(t)){let r=t[e]?.defaultValue;S(r)&&(n[e]=r)}return n}function E(e,t){return{...T(e),...t??{}}}function D(e,t){if(!e||typeof e!=`object`)return e;let r=t?.fields;if(!r||typeof r!=`object`)return e;let i={};for(let[t,a]of Object.entries(e))x(r[t]?.defaultValue)&&(0,n.isMissingForRequired)(a)||(i[t]=a);return i}function O(e,t){return typeof t==`string`&&t.trim()||typeof t==`object`&&t&&typeof t.source==`string`&&t.source.trim()?{...e,visibleOn:t}:e}var k=new Set;function A(e,t){if(typeof e.name!=`string`||e.name===e.field)return;let n=`${t}:${e.field}:${e.name}`;k.has(n)||(k.add(n),console.warn(`[object-ui] section field { field: '${e.field}' } also carries name: '${e.name}' — mixed form-field vocabularies. The spec key wins (the runtime name becomes '${e.field}'); drop \`name\` from authored form views.`))}function j(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,{multiple:n.multiple}),required:w(n,C(t)),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}:{name:e,label:e,type:`input`}}function M(e,t){if(typeof e==`string`){let n=t.objectSchema?.fields?.[e];return O(j(e,t),n?.visible_on??n?.visibleOn)}let n=e;if(typeof n.field!=`string`)return O(n,n.visibleOn);A(n,t.objectName);let r=n.field,a=j(r,t);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=w({required:n.required,defaultValue:t.objectSchema?.fields?.[r]?.defaultValue},C(t))),n.readonly!=null&&(a.disabled=n.readonly||a.disabled),n.immutable!=null&&(a.immutable=n.immutable),n.hidden!=null&&(a.hidden=n.hidden),n.colSpan!=null&&(a.colSpan=n.colSpan),n.span!=null&&(a.span=n.span),n.options!=null&&(a.options=n.options),n.multiple!=null&&(a.multiple=n.multiple);let o=n.type??t.objectSchema?.fields?.[r]?.type;o!=null&&(a.type=(0,i.mapFieldTypeToFormType)(o,{multiple:a.multiple}));let s=n.reference??n.reference_to;return s!=null&&(a.reference=s,a.reference_to=s),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),n.dependsOn!=null&&(a.dependsOn=n.dependsOn),n.keyField!=null&&(a.keyField=n.keyField),n.disclosure!=null&&(a.disclosure=n.disclosure),O(a,n.visibleWhen??n.visibleOn)}function N(e,t){return(e.fields??[]).map(e=>M(e,t))}var P=new Set([`field:formula`,`field:summary`,`field:auto_number`,`field:autonumber`]),F=new Set([`field:textarea`,`field:markdown`,`field:html`,`field:grid`,`field:richtext`,`textarea`,`markdown`,`html`,`grid`,`richtext`]),I=new Set([`formula`,`summary`,`auto_number`,`autonumber`]);function L(e){return F.has(e)}function R(e){return I.has(e)}function ee(e){return e<=3?1:e<=8?2:e<=15?3:4}function z(e){return e&&e>0?Math.min(Math.floor(e),4):1}function B(e,t,n){let r=z(t);return r<=1?1:e.span===`full`?r:e.colSpan==null?e.type&&L(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 V(e,t,n){let r=z(t);return r<=1?e:e.map(e=>{if(e.type===`section-divider`)return e;let t=B(e,r,n);return t>1?{...e,colSpan:t}:e.colSpan!=null&&e.colSpan!==1?{...e,colSpan:1}:e})}var H=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 te(e,t){return e.filter(e=>{if(H.has(e.name))return!1;let n=t?.fields?.[e.name];return n?.hidden!==!0&&n?.readonly!==!0})}function U(e,t){return e.filter(e=>{if(H.has(e.name)||e.type&&P.has(e.type))return!1;if(!t?.fields)return!0;let n=t.fields[e.name];return!n||n.readonly!==!0&&!R(n.type)})}function W(e,t){return e.filter(e=>{if(e.type&&P.has(e.type))return!1;let n=t?.fields?.[e.name];return!n||!R(n.type)})}var G={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 K(e){return G[e&&e>0?Math.min(Math.floor(e),4):1]}function ne(e){return e<=1?`default`:e===2?`xl`:`full`}function re(e,t,n,r){let i=[...e];if(i=te(i,t),r===`create`&&(i=W(i,t)),n!==void 0)return i=V(i,n),{fields:i,columns:n};let a=ee(i.length);return i=V(i,a),{fields:i,columns:a}}var q=(0,l.createSafeTranslation)({"form.conflictTitle":`Save conflict`,"form.conflictMessage":`This record was changed by someone else while you were editing. Overwriting will replace their changes with yours.`,"form.conflictLatestVersion":`Their save: {{time}}`,"form.conflictOverwrite":`Overwrite`,"form.keepEditing":`Keep editing`},`form.conflictTitle`);function J(e){let t=e?.updated_at;return typeof t==`string`&&t.length>0?t:void 0}function ie(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.code===`CONCURRENT_UPDATE`||t.name===`ConcurrentUpdateError`}function Y(e){if(!e)return null;let t=/\d{4}-\d{2}-\d{2}[ T]/.test(e)?e.replace(` `,`T`):e,n=new Date(t);return Number.isNaN(n.getTime())?null:n.toLocaleString()}function ae(){let{t:e}=q(),[n,r]=t.useState(null),i=t.useRef(null),o=t.useCallback(e=>{i.current?.(e),i.current=null,r(null)},[]);t.useEffect(()=>()=>i.current?.(!1),[]);let s=t.useCallback(async({dataSource:e,objectName:t,recordId:n,payload:a,baseRecord:o})=>{let s=J(o);try{return{status:`saved`,result:await e.update(t,n,a,s?{ifMatch:s}:void 0)}}catch(o){if(!ie(o))throw o;let s=o.currentVersion;if(!await new Promise(e=>{i.current=e,r({currentVersion:typeof s==`string`?s:void 0})}))return{status:`cancelled`};let c=typeof s==`string`&&s.length>0?s:void 0;return{status:`saved`,result:await e.update(t,n,a,c?{ifMatch:c}:void 0)}}},[]),l=Y(n?.currentVersion);return{saveWithOcc:s,conflictDialog:(0,u.jsx)(a.AlertDialog,{open:!!n,onOpenChange:e=>{e||o(!1)},children:(0,u.jsxs)(a.AlertDialogContent,{children:[(0,u.jsxs)(a.AlertDialogHeader,{children:[(0,u.jsxs)(a.AlertDialogTitle,{className:`flex items-center gap-2`,children:[(0,u.jsx)(c.AlertTriangle,{className:`h-5 w-5 text-amber-500`,"aria-hidden":!0}),e(`form.conflictTitle`)]}),(0,u.jsxs)(a.AlertDialogDescription,{children:[e(`form.conflictMessage`),l&&(0,u.jsx)(`span`,{className:`mt-2 block text-xs text-muted-foreground`,children:e(`form.conflictLatestVersion`,{time:l})})]})]}),(0,u.jsxs)(a.AlertDialogFooter,{children:[(0,u.jsx)(`button`,{type:`button`,className:(0,a.cn)((0,a.buttonVariants)({variant:`outline`})),onClick:()=>o(!1),children:e(`form.keepEditing`)}),(0,u.jsx)(`button`,{type:`button`,className:(0,a.cn)((0,a.buttonVariants)({variant:`destructive`})),onClick:()=>o(!0),children:e(`form.conflictOverwrite`)})]})]})})}}var X=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,c]=(0,t.useState)(null),[l,d]=(0,t.useState)({}),{saveWithOcc:f,conflictDialog:p}=ae(),[m,h]=(0,t.useState)(!0),[g,_]=(0,t.useState)(null),v=e.defaultTab||e.sections[0]?.name||e.sections[0]?.label||`tab-0`;t.default.useEffect(()=>{(async()=>{if(!n){h(!1);return}try{let t=await n.getObjectSchema(e.objectName);c(t)}catch(e){_(e)}})()},[e.objectName,n]);let y=(0,t.useRef)(void 0);t.default.useEffect(()=>{let t=!1;return(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){d(E(s,e.initialData||e.initialValues)),h(!1);return}y.current!==e.recordId&&h(!0);try{let r=await n.findOne(e.objectName,e.recordId);if(t)return;y.current=e.recordId,d(r||{})}catch(e){if(t)return;_(e)}finally{t||h(!1)}})(),()=>{t=!0}},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let b=(0,t.useCallback)(t=>N(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:o}),[s,e.readOnly,e.mode,e.recordId,e.objectName,o]),x=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;if(e.mode===`create`)r=await n.create(e.objectName,D(t,s));else if(e.mode===`edit`&&e.recordId){let i=await f({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:t,baseRecord:l});if(i.status===`cancelled`)return;r=i.result}return e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n,f,l]),S=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),C=(e,t)=>e.name||e.label||`tab-${t}`;if(g)return(0,u.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,u.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,u.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:g.message})]});if(m)return(0,u.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,u.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,u.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let w=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,T=e.sections.map(e=>w(e.columns)).filter(e=>e!=null),O=w(e.columns)??(T.length?Math.max(...T):1),k=K(O),A=e.sections.map((e,t)=>{let n=b(e);return{key:C(e,t),label:e.label||`Tab ${t+1}`,description:e.description,containerClass:e.gridClassName,fields:O>1?V(n,O,w(e.columns)):n}}),j=A.flatMap(e=>e.fields);return(0,u.jsxs)(`div`,{className:(0,a.cn)(`w-full @container`,i,e.className),children:[(0,u.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:j,columns:O,...k?{fieldContainerClass:k}:{},layout:`vertical`,defaultValues:l,previousValues:e.mode===`edit`&&e.recordId?l:void 0,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,onSubmit:x,onCancel:S,fieldTabs:A.map(e=>({key:e.key,label:e.label,description:e.description,fields:e.fields.map(e=>e.name),containerClass:e.containerClass})),defaultFieldTab:v,fieldTabsPosition:e.tabPosition||`top`}}),p]})},Z=({label:e,description:n,collapsible:r=!1,collapsed:i=!1,columns:o=1,children:s,className:l,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,u.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,u.jsx)(`span`,{className:`mt-0.5 text-muted-foreground`,children:p?(0,u.jsx)(c.ChevronRight,{className:`h-4 w-4`}):(0,u.jsx)(c.ChevronDown,{className:`h-4 w-4`})}),(0,u.jsxs)(`div`,{className:`flex-1`,children:[e&&(0,u.jsx)(`h3`,{className:`text-sm font-semibold text-foreground`,children:e}),n&&(0,u.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:n})]})]}):null,y=p?null:(0,u.jsx)(`div`,{className:(0,a.cn)(`grid gap-4`,d||h[o]),children:s});return _?(0,u.jsxs)(a.Card,{className:(0,a.cn)(`form-section bg-muted/40 shadow-none`,l),children:[v&&(0,u.jsx)(a.CardHeader,{className:`border-b border-border pb-3`,children:v}),y&&(0,u.jsx)(a.CardContent,{className:`pt-4`,children:y})]}):(0,u.jsxs)(`div`,{className:(0,a.cn)(`form-section`,l),children:[v,y]})},Q=(0,l.createSafeTranslation)({"wizard.missingRequired":`Please complete the required fields: {{fields}}`},`wizard.missingRequired`),oe=n.isMissingForRequired,se=({schema:e,dataSource:i,className:o})=>{let{fieldLabel:s}=(0,r.useSafeFieldLabel)(),{t:l}=Q(),[d,f]=(0,t.useState)(null),[p,m]=(0,t.useState)({}),[h,g]=(0,t.useState)(void 0),{saveWithOcc:_,conflictDialog:b}=ae(),[x,S]=(0,t.useState)(!0),[C,w]=(0,t.useState)(null),[T,O]=(0,t.useState)(0),[k,A]=(0,t.useState)(new Set),[j,M]=(0,t.useState)(!1),[P,F]=(0,t.useState)(new Set),[I,L]=(0,t.useState)(null),R=t.default.useId(),[ee,z]=(0,t.useState)(0),B=t.default.useRef(!1),H=e.sections.length,te=T===0,U=T===H-1;t.default.useEffect(()=>{(async()=>{if(!i){S(!1);return}try{let t=await i.getObjectSchema(e.objectName);f(t)}catch(e){w(e)}})()},[e.objectName,i]),t.default.useEffect(()=>{(d||!i)&&(async()=>{if(e.mode===`create`||!e.recordId||!i){B.current||=(m(E(d,e.initialData||e.initialValues)),!0),S(!1);return}try{let t=await i.findOne(e.objectName,e.recordId);m(t||{}),g(t||{})}catch(e){w(e)}finally{S(!1)}})()},[d,e.mode,e.recordId,e.initialData,e.initialValues,i,e.objectName]);let W=(0,t.useCallback)(t=>N(t,{objectSchema:d,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:s}),[d,e.readOnly,e.mode,e.recordId,e.objectName,s]),G=(0,t.useMemo)(()=>T>=0&&T<H?W(e.sections[T]):[],[T,H,e.sections,W]),ne=(0,t.useCallback)(t=>{let r=new Map;return e.sections.forEach((e,i)=>{for(let a of W(e)){let e=a?.name;if(!e||a.hidden===!0)continue;let o=(0,n.resolveFieldRuleState)({visibleWhen:a.visibleWhen,readonlyWhen:a.readonlyWhen,requiredWhen:a.requiredWhen},t,{required:!!a.required,readonly:a.readonly===!0},void 0,void 0,`field '${e}'`);!(a.visibleOn==null||(0,n.evalFieldPredicate)(a.visibleOn,t,!0,void 0,void 0,{context:`visibleOn of field '${e}'`}))||!o.visible||o.readonly||!o.required||oe(t[e])&&r.set(i,[...r.get(i)??[],a.label||e])}}),r},[e.sections,W]),re=(0,t.useCallback)(async t=>{let n={...p,...t};if(m(n),A(e=>new Set(e).add(T)),F(e=>{if(!e.has(T))return e;let t=new Set(e);return t.delete(T),t}),U){let t=ne(n);if(t.size>0){F(new Set(t.keys()));let e=[...t.values()].flat();a.toast.error(l(`wizard.missingRequired`,{fields:e.slice(0,3).join(`, `)+(e.length>3?`…`:``)})),q(Math.min(...t.keys()));return}F(new Set),M(!0);try{if(!i)return e.onSuccess&&await e.onSuccess(n),n;let t;if(e.mode===`create`)t=await i.create(e.objectName,D(n,d));else if(e.mode===`edit`&&e.recordId){let r=await _({dataSource:i,objectName:e.objectName,recordId:e.recordId,payload:n,baseRecord:p});if(r.status===`cancelled`)return;t=r.result}if(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`:m(E(d,e.initialData||e.initialValues)),A(new Set),O(0),z(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),L({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`&&(m(E(d,e.initialData||e.initialValues)),A(new Set),O(0),z(e=>e+1))}return t}catch(t){throw e.onError&&e.onError(t),t}finally{M(!1)}}q(T+1)},[p,T,U,e,d,i,ne,l,_]),q=(0,t.useCallback)(t=>{t>=0&&t<H&&(O(t),e.onStepChange&&e.onStepChange(t))},[H,e]),J=(0,t.useCallback)(()=>{q(T-1)},[T,q]),ie=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),Y=(0,t.useCallback)(t=>{(e.allowSkip||k.has(t)||t<=T)&&q(t)},[e.allowSkip,k,T,q]);if(C)return(0,u.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,u.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,u.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:C.message})]});if(x)return(0,u.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,u.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,u.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(I)return(0,u.jsx)(`div`,{className:(0,a.cn)(`w-full`,o,e.className),children:(0,u.jsxs)(`div`,{className:`rounded-md border bg-card p-8 text-center`,children:[(0,u.jsx)(`h3`,{className:`text-lg font-semibold`,children:I.title??`Thanks!`}),I.message&&(0,u.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:I.message})]})});let X=e.sections[T],se=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,ce=se(e.columns)??se(X?.columns)??1,$=K(ce);return(0,u.jsxs)(`div`,{className:(0,a.cn)(`w-full @container`,o,e.className),children:[e.showStepIndicator!==!1&&(0,u.jsx)(`nav`,{"aria-label":`Progress`,className:`mb-8`,children:(0,u.jsx)(`ol`,{className:`flex items-center`,children:e.sections.map((t,n)=>{let r=n===T,i=k.has(n),o=e.allowSkip||i||n<=T,s=P.has(n);return(0,u.jsxs)(`li`,{className:(0,a.cn)(`relative flex-1`,n!==H-1&&`pr-8 sm:pr-12`),children:[n!==H-1&&(0,u.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,u.jsx)(`div`,{className:(0,a.cn)(`h-full`,i?`bg-primary`:`bg-muted`)})}),(0,u.jsxs)(`button`,{type:`button`,className:(0,a.cn)(`group relative flex items-center`,o?`cursor-pointer`:`cursor-not-allowed`),onClick:()=>Y(n),disabled:!o,"data-testid":`wizard-step:${t.name||n}`,"data-error":s||void 0,children:[(0,u.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`,s&&`border-2 border-destructive bg-background text-destructive`,!s&&i&&`bg-primary text-primary-foreground`,!s&&r&&!i&&`border-2 border-primary bg-background text-primary`,!s&&!r&&!i&&`border-2 border-muted bg-background text-muted-foreground`),children:s?(0,u.jsx)(c.AlertCircle,{className:`h-3 w-3 sm:h-4 sm:w-4`,"aria-hidden":!0}):i?(0,u.jsx)(c.Check,{className:`h-3 w-3 sm:h-4 sm:w-4`}):n+1}),(0,u.jsx)(`span`,{className:`ml-2 sm:ml-3 text-xs sm:text-sm font-medium hidden sm:block`,children:(0,u.jsx)(`span`,{className:(0,a.cn)(s?`text-destructive`:r?`text-foreground`:`text-muted-foreground`),children:t.label||`Step ${n+1}`})})]})]},n)})})}),(0,u.jsx)(`div`,{className:`min-h-[200px]`,children:X&&(0,u.jsx)(Z,{label:X.label,description:X.description,columns:1,className:X.className,gridClassName:X.gridClassName,children:G.length>0?(0,u.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,id:R,fields:ce>1?V(G,ce,se(X.columns)):G,columns:ce,...$?{fieldContainerClass:$}:{},layout:`vertical`,defaultValues:p,previousValues:e.mode===`edit`?h:void 0,showSubmit:!1,showCancel:!1,onSubmit:re}},ee):(0,u.jsx)(`form`,{id:R,onSubmit:e=>{e.preventDefault(),re({})},children:(0,u.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:`No fields configured for this step`})})})}),(0,u.jsxs)(`div`,{className:`flex items-center justify-between mt-6 pt-4 border-t`,children:[(0,u.jsx)(`div`,{children:e.showCancel!==!1&&(0,u.jsx)(a.Button,{variant:`ghost`,onClick:ie,children:e.cancelText||`Cancel`})}),(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,u.jsxs)(`span`,{className:`text-sm text-muted-foreground mr-2`,children:[`Step `,T+1,` of `,H]}),!te&&(0,u.jsxs)(a.Button,{variant:`outline`,onClick:J,children:[(0,u.jsx)(c.ChevronLeft,{className:`h-4 w-4 mr-1`}),e.prevText||`Back`]}),U?(0,u.jsxs)(a.Button,{type:`submit`,form:R,disabled:j||e.mode===`view`,children:[j&&(0,u.jsx)(c.Loader2,{className:`mr-2 h-4 w-4 animate-spin`,"aria-hidden":!0}),j?`Submitting...`:e.submitText||(e.mode===`create`?`Create`:`Update`)]}):(0,u.jsxs)(a.Button,{type:`submit`,form:R,children:[e.nextText||`Next`,(0,u.jsx)(c.ChevronRight,{className:`h-4 w-4 ml-1`})]})]})]}),b]})},ce=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),[s,c]=(0,t.useState)(null),[l,d]=(0,t.useState)({}),{saveWithOcc:f,conflictDialog:p}=ae(),[m,h]=(0,t.useState)(!0),[g,_]=(0,t.useState)(null);(0,t.useEffect)(()=>{(async()=>{if(!n){h(!1);return}try{let t=await n.getObjectSchema(e.objectName);c(t)}catch(e){_(e),h(!1)}})()},[e.objectName,n]);let v=(0,t.useRef)(void 0);(0,t.useEffect)(()=>{let t=!1;return(s||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){d(E(s,e.initialData||e.initialValues)),h(!1);return}if(!n){d(e.initialData||e.initialValues||{}),h(!1);return}v.current!==e.recordId&&h(!0);try{let r=await n.findOne(e.objectName,e.recordId);if(t)return;v.current=e.recordId,d(r||{})}catch(e){if(t)return;_(e)}finally{t||h(!1)}})(),()=>{t=!0}},[s,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let y=(0,t.useCallback)(t=>N(t,{objectSchema:s,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:o}),[s,e.readOnly,e.mode,e.recordId,e.objectName,o]),b=(0,t.useCallback)(async t=>{if(!n)return e.onSuccess&&await e.onSuccess(t),t;try{let r;if(e.mode===`create`)r=await n.create(e.objectName,D(t,s));else if(e.mode===`edit`&&e.recordId){let i=await f({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:t,baseRecord:l});if(i.status===`cancelled`)return;r=i.result}return e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n,f,l]),x=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),S=(e,t)=>e.pane===`primary`||e.pane===`secondary`?e.pane:t===0?`primary`:`secondary`,C=(0,t.useMemo)(()=>e.sections.filter((e,t)=>S(e,t)===`primary`),[e.sections]),w=(0,t.useMemo)(()=>e.sections.filter((e,t)=>S(e,t)===`secondary`),[e.sections]),T=e.splitDirection||`horizontal`,O=e.splitSize||50;if(g)return(0,u.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,u.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,u.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:g.message})]});if(m)return(0,u.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,u.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,u.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});let k=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,A=e.sections.map(e=>k(e.columns)).filter(e=>e!=null),j=k(e.columns)??(A.length?Math.max(...A):1),M=K(j),P=(e,t)=>{let n=[];return e.forEach((e,r)=>{let i=y(e);i.length&&((e.label||e.description)&&n.push({name:`__section_${e.name||`${t}_${r}`}`,label:e.label,description:e.description,type:`section-divider`,colSpan:4,className:e.className}),n.push(...j>1?V(i,j,k(e.columns)):i))}),n},F=[{key:`primary`,sections:C,defaultSize:O},{key:`secondary`,sections:w,defaultSize:100-O}].map(e=>({...e,fields:P(e.sections,e.key),containerClass:e.sections.length===1?e.sections[0].gridClassName:void 0})).filter(e=>e.fields.length>0);return(0,u.jsxs)(`div`,{className:(0,a.cn)(`w-full @container`,i,e.className),children:[(0,u.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:F.flatMap(e=>e.fields),columns:j,...M?{fieldContainerClass:M}:{},layout:`vertical`,defaultValues:l,previousValues:e.mode===`edit`&&e.recordId?l:void 0,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,onSubmit:b,onCancel:x,fieldPanes:F.map(e=>({key:e.key,fields:e.fields.map(e=>e.name),defaultSize:e.defaultSize,...e.containerClass?{containerClass:e.containerClass}:{}})),fieldPanesOrientation:T,fieldPanesResizable:e.splitResizable!==!1}}),p]})},$=new Set([`id`,`_id`,`created_at`,`updated_at`,`createdAt`,`updatedAt`,`organization_id`,`organizationId`]),le=new Set([`formula`,`summary`,`rollup`,`lookup_value`,`auto_number`,`autonumber`,`computed`]);function ue(e,t){if(!e||typeof e!=`object`)return e;let n={},r=t?.fields;for(let[t,i]of Object.entries(e))if(!$.has(t)){if(r){let e=r[t];if(!e)continue;let n=String(e.type||``).toLowerCase();if(le.has(n)||e.computed===!0||e.formula||e.readOnly===!0||e.readonly===!0)continue}n[t]=i}return n}var de=e=>e==null?void 0:e.id??e._id??e.recordId,fe=(e,t)=>t?ue(e,t):e,pe=new Set([`id`,`_id`,`recordId`]);function me(e,t){return!e||Object.entries(e).every(([e,n])=>e===t||pe.has(e)?!0:n==null||n===``)}function he(e,t,n){let r=[{object:e,action:`create`,data:t}];for(let e of n)for(let t of e.rows)me(t,e.relationshipField)||r.push({object:e.childObject,action:`create`,data:{...fe(t,e.childSchema),[e.relationshipField]:{$ref:0}}});return r}function ge(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}=_e(e.original||[],n);for(let t of r){if(me(t,e.relationshipField))continue;let{id:n,_id:r,recordId:a,...o}=t;i.push({object:e.childObject,action:`create`,data:fe(o,e.childSchema)})}for(let t of a)i.push({object:e.childObject,action:`update`,id:de(t),data:fe(t,e.childSchema)});for(let t of o)i.push({object:e.childObject,action:`delete`,id:t})}return i}function _e(e,t){let n=new Set(t.map(de).filter(Boolean));return{toCreate:t.filter(e=>!de(e)),toUpdate:t.filter(e=>de(e)),toDelete:(e||[]).map(de).filter(e=>!!e&&!n.has(e))}}function ve(e,t){return Array.isArray(e)?e.reduce((e,n)=>{let r=Number(n?.[t]);return e+(Number.isFinite(r)?r:0)},0):0}var ye=new Set([`id`,`_id`,`recordId`,`created_at`,`updated_at`,`created_by`,`updated_by`,`createdAt`,`updatedAt`,`createdBy`,`updatedBy`,`organization_id`,`tenant_id`,`space`,`owner`]),be=new Set([`position`,`sort_order`,`sequence`,`line_no`,`line_number`,`sort`]),xe=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`,`json`,`object`,`grid`,`table`,`location`,`vector`,`html`,`markdown`,`richtext`]);function Se(e){switch(e){case`number`:case`percent`:case`rating`:case`slider`:return`number`;case`currency`:return`currency`;case`date`:return`date`;case`datetime`:return`datetime`;case`time`:return`time`;case`select`:case`picklist`:case`radio`:case`boolean`:case`toggle`:return`select`;case`lookup`:case`master_detail`:return`lookup`;case`file`:case`image`:case`avatar`:return`file`;default:return`text`}}var Ce=new Set([`image`,`avatar`]);function we(e,t){e.multiple==null&&t?.multiple&&(e.multiple=!0),e.accept??(Array.isArray(t?.accept)&&t.accept.length>0?e.accept=t.accept:Ce.has(t?.type)&&(e.accept=[`image/*`]))}function Te(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 Ee(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 De=[`name`,`title`,`subject`,`label`,`full_name`,`display_name`,`code`],Oe={select:0,currency:1,number:1,lookup:2,date:3,datetime:3,time:3,text:4};function ke(e){return(e.type?Oe[e.type]:void 0)??5}function Ae(e,t){if(t<=0||e.length<=t)return e;let n=new Set,r=e.find(e=>De.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)=>ke(e.c)-ke(t.c)||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 je(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(ye.has(e)||r.has(e)||be.has(e)||n?.system||n?.readonly||n?.hidden||xe.has(n?.type))continue;let a={field:e,label:n?.label||e,type:Se(n?.type),required:!!n?.required},o=Te(n);a.type===`select`&&o&&(a.options=o),a.type===`lookup`&&(a.reference=n?.reference,a.displayField=n?.display_field||n?.reference_field),a.type===`file`&&we(a,n),n?.readonlyWhen&&(a.readonlyWhen=n.readonlyWhen),n?.requiredWhen&&(a.requiredWhen=n.requiredWhen);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 Ae(i,t.maxColumns??6)}function Me(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=Se(t?.type),i={...e,type:n};i.label??=t?.label||e.field,i.required??=!!t?.required;let a=Te(t);n===`select`&&a&&!i.options&&(i.options=a),n===`lookup`&&(i.reference??=t?.reference,i.displayField??=t?.display_field||t?.reference_field),n===`file`&&we(i,t),i.readonlyWhen==null&&t?.readonlyWhen&&(i.readonlyWhen=t.readonlyWhen),i.requiredWhen==null&&t?.requiredWhen&&(i.requiredWhen=t.requiredWhen);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 Ne=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`]);function Pe(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;ye.has(e)||r.has(e)||be.has(e)||n?.system||n?.hidden||Ne.has(n?.type)||i.push(e)}return i}var Fe=new Set([`textarea`,`richtext`,`html`,`markdown`,`rich-text`,`json`,`location`,`address`]),Ie=new Set([`file`,`image`,`avatar`]);function Le(e,t,n={}){if(t===`grid`||t===`form`)return t;let r=e?.fields??{},i=Pe(e,{relationshipField:n.relationshipField});return i.some(e=>Fe.has(r[e]?.type))||i.filter(e=>Ie.has(r[e]?.type)).length>=2||i.length>8?`form`:`grid`}var Re=[`amount`,`total`,`subtotal`,`line_total`,`line_amount`,`net_amount`];function ze(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=>Re.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 Be(e,t,n,r={}){let i=r.relationshipField||Ee(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?Me(r.columns,t):je(t,{relationshipField:i}),o=r.amountField||ze(a);return{childObject:e,relationshipField:i,columns:a,formFields:Pe(t,{relationshipField:i}),mode:Le(t,r.inlineEdit??(t?.fields)?.[i]?.inlineEdit,{relationshipField:i}),amountField:o,sortField:Object.keys(t?.fields??{}).find(e=>be.has(e))}}function Ve(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 He=({details:e,state:n,setRows:r,formHostRef:a,taxRateField:o,formKey:s,onRowExpand:c,onAddViaForm:l})=>{let[d,f]=(0,t.useState)({}),p=(0,t.useRef)(``);(0,t.useEffect)(()=>{let e=a.current;if(!e)return;let t=()=>{let t=Ve(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+ve(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,u.jsxs)(u.Fragment,{children:[e.map((e,t)=>(0,u.jsxs)(`section`,{className:`space-y-2`,children:[(0,u.jsx)(`h3`,{className:`text-sm font-medium text-foreground`,children:e.title||`Line Items`}),e.columns?.length?(0,u.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=>c(t,e)}:{},displayMode:e.inlineMode===`form`?`list`:`grid`,...e.inlineMode===`form`?{onAdd:()=>l(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,u.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,children:`Loading columns…`})]},`${e.childObject}-${t}`)),_&&(0,u.jsx)(`div`,{className:`flex justify-end`,children:(0,u.jsxs)(`dl`,{className:`w-64 space-y-1.5 text-sm`,"data-testid":`md-totals`,children:[(0,u.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,u.jsx)(`dt`,{className:`text-muted-foreground`,children:`Subtotal`}),(0,u.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-subtotal`,children:x(g)})]}),(0,u.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,u.jsxs)(`dt`,{className:`text-muted-foreground`,children:[`Tax (`,v,`%)`]}),(0,u.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-tax`,children:x(y)})]}),(0,u.jsxs)(`div`,{className:`flex items-center justify-between border-t border-border pt-1.5 text-base font-semibold`,children:[(0,u.jsx)(`dt`,{children:`Total`}),(0,u.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-grand-total`,children:x(b)})]})]})})]})},Ue=({schema:e,dataSource:r,className:i})=>{let o=e.details||[],s=e.mode===`edit`&&!!e.recordId,c=o.some(e=>!e.relationshipField||!e.columns?.length||e.columns.some(e=>!e.type)),[l,d]=(0,t.useState)(c?null:o),f=l??o;(0,t.useEffect)(()=>{if(!c){d(o);return}if(!r||typeof r.getObjectSchema!=`function`)return;let t=!1;return(async()=>{let n=await Promise.all(o.map(async t=>{let n=t.columns?.length?t.columns.every(e=>!!e.type):!1;if(t.relationshipField&&n)return t;try{let n=await r.getObjectSchema(t.childObject);if(t.relationshipField&&t.columns?.length)return{...t,columns:Me(t.columns,n)};let i=Be(t.childObject,n,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||d(n)})(),()=>{t=!0}},[r,e.objectName,e.details]);let[p,m]=(0,t.useState)(()=>o.map(()=>({rows:[],original:[]}))),h=(0,t.useRef)(p);h.current=p;let g=(0,t.useRef)({});(0,t.useEffect)(()=>{let e=r;if(!e||typeof e.getObjectSchema!=`function`)return;let t=!1,n=Array.from(new Set(o.map(e=>e.childObject).filter(Boolean)));return(async()=>{let r=await Promise.all(n.map(async t=>{try{return[t,await e.getObjectSchema(t)]}catch{return[t,null]}}));if(t)return;let i={};for(let[e,t]of r)t&&(i[e]=t);g.current=i})(),()=>{t=!0}},[r,e.objectName,e.details]);let[_,v]=(0,t.useState)(0),[y,b]=(0,t.useState)(!1),x=(0,t.useRef)(!1),S=(0,t.useRef)(null),C=(0,t.useCallback)(()=>{x.current=!1,b(!1),S.current&&=(clearTimeout(S.current),null)},[]);(0,t.useEffect)(()=>{let t=!1;if(!(!s||!r))return(async()=>{let n=await Promise.all(f.map(async t=>{if(!t.relationshipField)return{rows:[],original:[]};try{let n=(await r.find(t.childObject,{$filter:{[t.relationshipField]:e.recordId},$top:500}))?.data??[];return{rows:n.map(e=>({...e})),original:n.map(e=>({...e}))}}catch{return{rows:[],original:[]}}}));t||m(n)})(),()=>{t=!0}},[s,r,e.recordId,l]);let w=(0,t.useCallback)((e,t)=>{m(n=>n.map((n,r)=>r===e?{...n,rows:t}:n))},[]),T=e.taxRateField||`tax_rate`,[E,D]=(0,t.useState)(null),O=E?p[E.detailIdx]?.rows?.[E.rowIdx]:void 0,k=E?f[E.detailIdx]:void 0,A=(0,t.useCallback)((e,t,n)=>{m(r=>r.map((r,i)=>i===e?{...r,rows:r.rows.map((e,r)=>r===t?{...e,...n}:e)}:r))},[]),j=(0,t.useCallback)(e=>{m(t=>{let n=t.map((t,n)=>n===e?{...t,rows:[...t.rows,{}]}:t),r=n[e].rows.length-1;return D({detailIdx:e,rowIdx:r,isNew:!0}),n})},[]),M=(0,t.useCallback)(()=>{D(e=>(e?.isNew&&m(t=>t.map((t,n)=>n===e.detailIdx?{...t,rows:t.rows.filter((t,n)=>n!==e.rowIdx)}:t)),null))},[]),N=(0,t.useCallback)(async t=>{C(),e.onSuccess||a.toast.success(s?e.title?`${e.title} saved`:`Saved`:`Created`),s||(m(f.map(()=>({rows:[],original:[]}))),v(e=>e+1)),await e.onSuccess?.(t)},[s,e.onSuccess,e.title,f.length,C]),P=(0,t.useCallback)(t=>{C(),a.toast.error(t?.message||`Save failed`),e.onError?.(t)},[e,C]),F=(0,t.useCallback)(async t=>{if(!r)throw Error(`MasterDetailForm: dataSource is required`);let i={...t};f.forEach((e,t)=>{e.totalField&&(i[e.totalField]=ve(h.current[t]?.rows??[],e.amountField||`amount`))});let a=s?ge(e.objectName,String(e.recordId),i,f.filter(e=>e.relationshipField).map((e,t)=>({childObject:e.childObject,relationshipField:e.relationshipField,rows:h.current[t]?.rows??[],original:h.current[t]?.original??[],childSchema:g.current[e.childObject]}))):he(e.objectName,i,f.filter(e=>e.relationshipField).map((e,t)=>({childObject:e.childObject,relationshipField:e.relationshipField,rows:h.current[t]?.rows??[],childSchema:g.current[e.childObject]})));return(await(0,n.runBatchTransaction)(r,a))?.results?.[0]??{...i,id:e.recordId}},[r,f,e.objectName,e.recordId,s]),I=(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,submitHandler:F,onSuccess:N,onError:P}),[e,F,N,P]),L=(0,t.useRef)(null),R=e.submitText??(s?`Save`:`Create`),ee=(0,t.useCallback)(()=>{x.current||L.current?.querySelector(`form`)&&(x.current=!0,b(!0),setTimeout(()=>{(L.current?.querySelector(`form`))?.requestSubmit()},0),S.current=setTimeout(()=>C(),1500))},[C]);return(0,t.useEffect)(()=>()=>{S.current&&clearTimeout(S.current)},[]),(0,u.jsxs)(`div`,{className:(0,a.cn)(`space-y-6`,i,e.className),children:[(0,u.jsx)(`div`,{ref:L,children:(0,u.jsx)(Qe,{schema:I,dataSource:r},_)}),(0,u.jsx)(He,{details:f,state:p,setRows:w,formHostRef:L,taxRateField:T,formKey:_,onRowExpand:(e,t)=>D({detailIdx:e,rowIdx:t}),onAddViaForm:j}),E&&k&&(0,u.jsxs)(a.Card,{className:`border-primary/40 shadow-none ring-1 ring-primary/10`,"data-testid":`md-row-form`,children:[(0,u.jsxs)(a.CardHeader,{className:`pb-2 flex flex-row items-center justify-between gap-2 space-y-0`,children:[(0,u.jsxs)(a.CardTitle,{className:`text-sm font-medium`,children:[k.title||`Line item`,` — row `,E.rowIdx+1]}),(0,u.jsx)(a.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs text-muted-foreground`,onClick:M,children:`Close`})]}),(0,u.jsx)(a.CardContent,{children:(0,u.jsx)(Qe,{schema:{type:`object-form`,objectName:k.childObject,mode:`edit`,initialData:O??{},...k.formFields?.length?{fields:k.formFields}:{},submitText:`Apply`,submitHandler:async e=>e,onSuccess:e=>{A(E.detailIdx,E.rowIdx,e),D(null)},onCancel:M},dataSource:r},`row-${E.detailIdx}-${E.rowIdx}`)})]}),e.showSubmit!==!1&&(0,u.jsxs)(`div`,{className:`flex items-center justify-end gap-2 border-t border-border pt-4`,children:[e.onCancel&&(0,u.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:e.onCancel,disabled:y,"data-testid":`md-form-cancel`,children:e.cancelText??`Cancel`}),(0,u.jsx)(a.Button,{type:`button`,onClick:ee,disabled:y||c&&!l,"data-testid":`md-form-submit`,children:y?`Saving…`:R})]})]})},We={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`},Ge=(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.dialogDescriptionFallback":`Complete the form fields, then submit or cancel.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`},`form.discardTitle`),Ke=({schema:e,dataSource:n,className:o})=>{let{fieldLabel:s}=(0,r.useSafeFieldLabel)(),{t:l}=Ge(),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,T]=(0,t.useState)(!1),[O,k]=(0,t.useState)(!1),{saveWithOcc:A,conflictDialog:j}=ae(),[M,P]=(0,t.useState)(!1),F=(0,t.useRef)(!1),I=e.confirmOnDiscard!==!1,L=e.open!==!1,R=e.drawerSide||`right`,ee=(0,t.useId)(),[z,B]=(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]);let V=(0,t.useRef)(void 0);(0,t.useEffect)(()=>{let t=!1;return(f||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){_(E(f,e.initialData||e.initialValues)),y(!1);return}if(!n){_(e.initialData||e.initialValues||{}),y(!1);return}V.current!==e.recordId&&(y(!0),T(!1));try{let r=await n.findOne(e.objectName,e.recordId);if(t)return;V.current=e.recordId,_(r||{})}catch(e){if(t)return;x(e)}finally{t||y(!1)}})(),()=>{t=!0}},[f,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let H=(0,t.useCallback)(t=>N(t,{objectSchema:f,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:s}),[f,e.readOnly,e.mode,e.recordId,e.objectName,s]);(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:s(e.objectName,t,a.label||t),type:(0,i.mapFieldTypeToFormType)(a.type,{multiple:a.multiple}),required:w(a,C(e)),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 te=(0,t.useCallback)(async t=>{P(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=ue(t,f);if(e.mode===`create`)r=await n.create(e.objectName,D(i,f));else if(e.mode===`edit`&&e.recordId){let t=await A({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:i,baseRecord:g});if(t.status===`cancelled`)return;r=t.result}return e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{P(!1)}},[e,n,f,A,g]),U=(0,t.useCallback)(()=>{k(!1),F.current&&(F.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),W=(0,t.useCallback)(e=>{F.current=e,I&&S?k(!0):U()},[I,S,U]);(0,t.useEffect)(()=>{if(!L||!S||!I)return;let e=e=>{e.preventDefault(),e.returnValue=``};return window.addEventListener(`beforeunload`,e),()=>window.removeEventListener(`beforeunload`,e)},[L,S,I]);let G=(0,t.useCallback)(()=>{F.current=!0,U()},[U]),K=(0,t.useMemo)(()=>{if(e.drawerWidth)return R===`left`||R===`right`?{width:e.drawerWidth,maxWidth:e.drawerWidth}:{height:e.drawerWidth,maxHeight:e.drawerWidth}},[e.drawerWidth,R]),ne=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,q=e.showSubmit!==!1&&e.mode!==`view`,J=e.showCancel!==!1,ie=e.submitText||(e.mode===`create`?`Create`:`Update`),Y=e.cancelText||`Cancel`,X={type:`form`,objectName:e.objectName,layout:ne,defaultValues:g,previousValues:e.mode===`edit`&&e.recordId?g:void 0,submitLabel:ie,cancelLabel:Y,showSubmit:q,showCancel:J,onSubmit:te,onCancel:G,onDirtyChange:T,showActions:!1,id:ee},Z=()=>{if(b)return(0,u.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,u.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,u.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:b.message})]});if(v)return(0,u.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,u.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,u.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=z[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?()=>B(e=>({...e,[r]:!i})):void 0,className:e.className});let a=H(e);i?t.push(...a.map(e=>({...e,hidden:!0}))):t.push(...a)}),(0,u.jsx)(r.SchemaRenderer,{schema:{...X,fields:t}})}let t=re(m,f,e.columns,e.mode),n=We[t.columns||1];return(0,u.jsx)(r.SchemaRenderer,{schema:{...X,fields:t.fields,columns:t.columns,...n?{fieldContainerClass:n}:{}}})},Q=e.subforms,oe=Q?.length&&e.mode!==`view`?(0,u.jsx)(Ue,{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:Y,details:Q,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n}):Z();return d?(0,u.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,u.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,u.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,u.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),oe]}):(0,u.jsx)(a.Sheet,{open:L,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}W(!1)},children:(0,u.jsxs)(a.SheetContent,{side:R,className:(0,a.cn)(`overflow-y-auto`,o,e.className),style:K,children:[(e.title||e.description)&&(0,u.jsxs)(a.SheetHeader,{children:[e.title&&(0,u.jsx)(a.SheetTitle,{children:e.title}),e.description?(0,u.jsx)(a.SheetDescription,{children:e.description}):(0,u.jsx)(a.SheetDescription,{className:`sr-only`,children:l(`form.dialogDescriptionFallback`)})]}),(0,u.jsx)(`div`,{className:`@container py-4`,children:oe}),!b&&!v&&!(Q?.length&&e.mode!==`view`)&&(q||J)&&(0,u.jsx)(`div`,{className:`shrink-0 border-t px-4 py-3 bg-background`,"data-testid":`drawer-form-footer`,children:(0,u.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[J&&(0,u.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:G,disabled:M,className:`w-full sm:w-auto`,children:Y}),q&&(0,u.jsxs)(a.Button,{type:`submit`,form:ee,disabled:M,className:`w-full sm:w-auto`,children:[M&&(0,u.jsx)(c.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),ie]})]})}),(0,u.jsx)(a.AlertDialog,{open:O,onOpenChange:k,children:(0,u.jsxs)(a.AlertDialogContent,{children:[(0,u.jsxs)(a.AlertDialogHeader,{children:[(0,u.jsx)(a.AlertDialogTitle,{children:l(`form.discardTitle`)}),(0,u.jsx)(a.AlertDialogDescription,{children:l(`form.discardMessage`)})]}),(0,u.jsxs)(a.AlertDialogFooter,{children:[(0,u.jsx)(a.AlertDialogCancel,{onClick:()=>{F.current=!1},children:l(`form.keepEditing`)}),(0,u.jsx)(a.AlertDialogAction,{onClick:U,children:l(`form.discard`)})]})]})}),j]})})};function qe(e,t){let n=(0,s.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.dialogDescriptionFallback":`Complete the form fields, then submit or cancel.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`},`form.discardTitle`),Ye={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`},Xe=({schema:e,dataSource:n,className:s})=>{let{fieldLabel:l,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)([]),[b,x]=(0,t.useState)({}),[S,T]=(0,t.useState)(!0),[O,k]=(0,t.useState)(null),[A,j]=(0,t.useState)(!1),[M,P]=(0,t.useState)(!1),[F,I]=(0,t.useState)(!1),{saveWithOcc:L,conflictDialog:R}=ae(),z=(0,t.useRef)(!1),B=e.confirmOnDiscard!==!1,H=e.open!==!1,U=(0,t.useId)(),K=(0,t.useMemo)(()=>{if(e.sections?.length||e.customFields?.length)return null;let t=te(v,g);e.mode===`create`&&(t=W(t,g));let n=qe(t,g?.fieldGroups);if(!n)return null;let r=e.columns&&e.columns>0?Math.min(Math.floor(e.columns),4):ee(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:re(v,g,e.columns,e.mode),[v,g,e.columns,e.mode,q,e.customFields]),ie=Ye[(0,t.useMemo)(()=>{if(e.modalSize)return e.modalSize;if(J?.columns&&J.columns>1)return ne(J.columns);if(q?.length){let e=Math.max(...q.map(e=>Number(e.columns)||1));if(e>1)return ne(e)}return`default`},[e.modalSize,J,q])]||Ye.default;(0,t.useEffect)(()=>{(async()=>{if(!n){T(!1);return}try{let t=await n.getObjectSchema(e.objectName);_(t)}catch(e){k(e),T(!1)}})()},[e.objectName,n]);let Y=(0,t.useRef)(void 0);(0,t.useEffect)(()=>{let t=!1;return(g||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){x(E(g,e.initialData||e.initialValues)),T(!1);return}if(!n){x(e.initialData||e.initialValues||{}),T(!1);return}Y.current!==e.recordId&&(T(!0),P(!1));try{let r=await n.findOne(e.objectName,e.recordId);if(t)return;Y.current=e.recordId,x(r||{})}catch(e){if(t)return;k(e)}finally{t||T(!1)}})(),()=>{t=!0}},[g,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let X=(0,t.useCallback)(t=>N(t,{objectSchema:g,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:l}),[g,e.readOnly,e.mode,e.recordId,e.objectName,l]);(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:l(e.objectName,t,a.label||t),type:(0,i.mapFieldTypeToFormType)(a.type,{multiple:a.multiple}),required:w(a,C(e)),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,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=>{j(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=ue(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}if(e.mode===`create`)r=await n.create(e.objectName,D(i,g));else if(e.mode===`edit`&&e.recordId){let t=await L({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:i,baseRecord:b});if(t.status===`cancelled`)return;r=t.result}return e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{j(!1)}},[e,n,g,m,L,b]),Q=(0,t.useCallback)(()=>{I(!1),z.current&&(z.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),oe=(0,t.useCallback)(e=>{z.current=e,B&&M?I(!0):Q()},[B,M,Q]);(0,t.useEffect)(()=>{if(!H||!M||!B)return;let e=e=>{e.preventDefault(),e.returnValue=``};return window.addEventListener(`beforeunload`,e),()=>window.removeEventListener(`beforeunload`,e)},[H,M,B]);let se=(0,t.useCallback)(()=>{z.current=!0,Q()},[Q]),ce=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,$=e.showSubmit!==!1&&e.mode!==`view`,le=e.showCancel!==!1,de=e.submitText||(e.mode===`create`?`Create`:`Update`),fe=e.cancelText||`Cancel`,pe={type:`form`,objectName:e.objectName,layout:ce,defaultValues:b,previousValues:e.mode===`edit`&&e.recordId?b:void 0,submitLabel:de,cancelLabel:fe,showSubmit:$,showCancel:le,onSubmit:Z,onCancel:se,onDirtyChange:P,showActions:!1,id:U},me=()=>{if(O)return(0,u.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,u.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,u.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:O.message})]});if(S)return(0,u.jsx)(`div`,{className:`space-y-4`,"data-testid":`modal-form-skeleton`,children:[1,2,3].map(e=>(0,u.jsxs)(`div`,{className:`space-y-2`,children:[(0,u.jsx)(a.Skeleton,{className:`h-4 w-24`}),(0,u.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,a=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,o=t.map(e=>a(e.columns)).filter(e=>e!=null),s=a(e.columns)??(o.length?Math.max(...o):1),c=G[s],l=t.map((e,t)=>{let r=h(X(e));return{key:n(e,t),title:i(e),description:e.description,className:e.className,gridClassName:e.gridClassName,fields:s>1?V(r,s,a(e.columns)):r}}).filter(e=>e.fields.length>0),f={...pe,columns:s,...c?{fieldContainerClass:c}:{}};if(e.contentLayout===`tabbed`&&l.length>1)return(0,u.jsx)(r.SchemaRenderer,{schema:{...f,fields:l.flatMap(e=>e.fields),fieldTabs:l.map((e,t)=>({key:e.key,label:e.title||`Section ${t+1}`,description:e.description,fields:e.fields.map(e=>e.name),containerClass:e.gridClassName}))}});let p=[];return l.forEach(e=>{(e.title||e.description)&&p.push({name:`__section_${e.key}`,label:e.title,description:e.description,type:`section-divider`,colSpan:4,className:e.className}),p.push(...e.fields)}),(0,u.jsx)(r.SchemaRenderer,{schema:{...f,fields:p}})}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?V(a,t):a)});let i=G[t];return(0,u.jsx)(r.SchemaRenderer,{schema:{...pe,fields:n,columns:t,...i?{fieldContainerClass:i}:{}}})}let t=J??re(v,g,e.columns,e.mode),n=G[t.columns||1];return(0,u.jsx)(r.SchemaRenderer,{schema:{...pe,fields:h(t.fields),columns:t.columns,...n?{fieldContainerClass:n}:{}}})},he=e.subforms;if(p)return(0,u.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,u.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,u.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,u.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),me()]});if(he?.length&&e.mode!==`view`)return(0,u.jsx)(a.Dialog,{open:H,onOpenChange:e.onOpenChange,children:(0,u.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(ie,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,s,e.className),children:[(e.title||e.description)&&(0,u.jsxs)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,u.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,u.jsx)(a.DialogDescription,{children:e.description}):(0,u.jsx)(a.DialogDescription,{className:`sr-only`,children:`Enter the record and its line items, then save.`})]}),(0,u.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:(0,u.jsx)(Ue,{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:de,cancelText:fe,details:he,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n})})]})});let ge=!S&&!O&&($||le);return(0,u.jsx)(a.Dialog,{open:H,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}oe(!1)},children:(0,u.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(ie,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,s,e.className),children:[(e.title||e.description)&&(0,u.jsxs)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,u.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,u.jsx)(a.DialogDescription,{children:e.description}):(0,u.jsx)(a.DialogDescription,{className:`sr-only`,children:f(`form.dialogDescriptionFallback`)})]}),(0,u.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:me()}),ge&&(0,u.jsx)(`div`,{className:`shrink-0 border-t px-4 sm:px-6 py-3 bg-background`,"data-testid":`modal-form-footer`,children:(0,u.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[le&&(0,u.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:se,disabled:A,className:`w-full sm:w-auto`,children:fe}),$&&(0,u.jsxs)(a.Button,{type:`submit`,form:U,disabled:A,className:`w-full sm:w-auto`,children:[A&&(0,u.jsx)(c.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),de]})]})}),(0,u.jsx)(a.AlertDialog,{open:F,onOpenChange:I,children:(0,u.jsxs)(a.AlertDialogContent,{children:[(0,u.jsxs)(a.AlertDialogHeader,{children:[(0,u.jsx)(a.AlertDialogTitle,{children:f(`form.discardTitle`)}),(0,u.jsx)(a.AlertDialogDescription,{children:f(`form.discardMessage`)})]}),(0,u.jsxs)(a.AlertDialogFooter,{children:[(0,u.jsx)(a.AlertDialogCancel,{onClick:()=>{z.current=!1},children:f(`form.keepEditing`)}),(0,u.jsx)(a.AlertDialogAction,{onClick:Q,children:f(`form.discard`)})]})]})}),R]})})};function Ze(e){let t=e.buttons,n=e.defaults;if(!t&&!n)return e;let r=e,i={...r};return t?.submit?.show!==void 0&&r.showSubmit===void 0&&(i.showSubmit=t.submit.show),t?.submit?.label!=null&&r.submitText===void 0&&(i.submitText=t.submit.label),t?.cancel?.show!==void 0&&r.showCancel===void 0&&(i.showCancel=t.cancel.show),t?.cancel?.label!=null&&r.cancelText===void 0&&(i.cancelText=t.cancel.label),t?.reset?.show!==void 0&&r.showReset===void 0&&(i.showReset=t.reset.show),n&&r.initialValues===void 0&&(i.initialValues=n),i}var Qe=({schema:e,dataSource:n})=>{let i=(0,o.usePermissions)(),a=(0,t.useMemo)(()=>{let t=Ze(e),n=t.groups,r=!t.sections?.length&&Array.isArray(n)&&n.length?{...t,sections:n.map(e=>({label:e.title??e.label,description:e.description,collapsible:e.collapsible,collapsed:e.defaultCollapsed??e.collapsed,fields:e.fields??[]}))}:t;if(!i?.isLoaded)return r;let a=e=>e?.name?i.checkField(r.objectName,e.name,`read`)?!i.checkField(r.objectName,e.name,`write`)&&r.mode!==`view`?{...e,readOnly:!0,disabled:!0}:e:null:e,o=e=>Array.isArray(e)?e.map(a).filter(Boolean):e;return{...r,fields:o(r.fields),sections:r.sections?.map(e=>({...e,fields:o(e.fields)}))}},[e,i]),{sectionLabel:s}=(0,r.useSafeFieldLabel)(),c=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,u.jsx)(Ue,{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,u.jsx)(X,{schema:{...a,formType:`tabbed`,sections:a.sections.map(e=>({name:e.name,label:c(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,u.jsx)(se,{schema:{...a,formType:`wizard`,sections:a.sections.map(e=>({name:e.name,label:c(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,u.jsx)(ce,{schema:{...a,formType:`split`,sections:a.sections.map(e=>({name:e.name,label:c(e),description:e.description,columns:e.columns,fields:e.fields,pane:e.pane,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,u.jsx)(Ke,{schema:{...t,layout:r,formType:`drawer`,sections:a.sections?.map(e=>({name:e.name,label:c(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,u.jsx)(Xe,{schema:{...t,layout:r,formType:`modal`,sections:a.sections?.map(e=>({name:e.name,label:c(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,u.jsx)($e,{schema:a,dataSource:n})},$e=({schema:e,dataSource:s})=>{let{fieldLabel:c,sectionLabel:l}=(0,r.useSafeFieldLabel)(),d=(0,a.useIsMobile)(),f=(0,o.usePermissions)(),p=(0,t.useCallback)(t=>{if(!f?.isLoaded)return t;let n=[];for(let r of t)f.checkField(e.objectName,r.name,`read`)&&(!f.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},[f,e.objectName,e.mode]),[m,h]=(0,t.useState)(null),[g,_]=(0,t.useState)([]),[b,x]=(0,t.useState)(null),[S,E]=(0,t.useState)(!0),[O,k]=(0,t.useState)(null),[A,j]=(0,t.useState)(null),{saveWithOcc:M,conflictDialog:N}=ae(),P=e.customFields&&e.customFields.length>0;(0,t.useEffect)(()=>{P&&(x(e.initialData||e.initialValues||{}),E(!1))},[P,e.initialData,e.initialValues]),(0,t.useEffect)(()=>{P?h({name:e.objectName,fields:{}}):e.objectName&&s?(async()=>{try{if(!s)throw Error(`DataSource is required when using ObjectQL schema fetching (inline fields not provided)`);let t=await s.getObjectSchema(e.objectName);if(!t)throw Error(`No schema found for object "${e.objectName}"`);h(t)}catch(e){k(e),E(!1)}})():P||E(!1)},[e.objectName,s,P]),(0,t.useEffect)(()=>{m&&!P&&(async()=>{if(!e.recordId||e.mode===`create`){x(e.initialData||e.initialValues||{}),E(!1);return}if(!P){if(!s){k(Error(`DataSource is required for fetching record data (inline data not provided)`)),E(!1);return}E(!0);try{let t=await s.findOne(e.objectName,e.recordId);x(t)}catch(e){console.error(`Failed to fetch record:`,e),k(e)}finally{E(!1)}}})()},[e.objectName,e.recordId,e.mode,e.initialValues,e.initialData,s,m,P]);let F=(0,t.useCallback)(e=>e,[]);(0,t.useEffect)(()=>{if(P&&e.customFields){_(e.customFields.map(F)),E(!1);return}if(!m)return;let t=[],r=(0,n.resolveEffectiveCrudAffordances)(m,f?.getObjectApiOperations?.(e.objectName)),a=!(e.mode===`edit`?r.edit:e.mode!==`create`||r.create),o=e.fields||Object.keys(m.fields||{});(Array.isArray(o)?o:Object.keys(o)).forEach(n=>{let r=typeof n==`string`?n:n.name;if(!r)return;let o=m.fields?.[r];if(!o&&!P)return;let s=e.customFields?.find(e=>e.name===r);if(s)t.push(F(s));else if(o){let s={name:r,label:c(e.objectName,r,o.label||n),type:(0,i.mapFieldTypeToFormType)(o.type,{multiple:o.multiple}),required:w(o,C(e)),disabled:e.readOnly||e.mode===`view`||o.readonly||a,placeholder:o.placeholder,description:o.help||o.description,validation:(0,i.buildValidationRules)(o),visibleWhen:o.visibleWhen,readonlyWhen:o.readonlyWhen,requiredWhen:o.requiredWhen,group:o.group,field:o,widget:o.widget};if((o.type===`select`||o.type===`lookup`||o.type===`master_detail`)&&(s.options=o.options||[],s.multiple=o.multiple),(o.type===`number`||o.type===`currency`||o.type===`percent`)&&(s.inputType=`number`,s.min=o.min,s.max=o.max,s.step=o.precision?10**-o.precision:void 0),o.type===`date`&&(s.inputType=`date`),o.type===`datetime`&&(s.inputType=`datetime-local`),(o.type===`text`||o.type===`textarea`||o.type===`markdown`||o.type===`html`)&&(s.maxLength=o.maxLength??o.max_length,s.minLength=o.minLength??o.min_length),(o.type===`file`||o.type===`image`)&&(s.inputType=`file`,s.multiple=o.multiple,s.accept=o.accept?o.accept.join(`,`):void 0,o.max_size)){let e=`Max size: ${(0,i.formatFileSize)(o.max_size)}`;s.description=s.description?`${s.description} (${e})`:e}o.type===`email`&&(s.inputType=`email`),o.type===`phone`&&(s.inputType=`tel`),o.type===`url`&&(s.inputType=`url`),o.type===`password`&&(s.inputType=`password`),o.type===`time`&&(s.inputType=`time`),(o.type===`formula`||o.type===`summary`||o.type===`auto_number`)&&(s.disabled=!0),o.visible_on&&(s.visibleOn=o.visible_on),t.push(s)}}),_(t),!P&&e.recordId&&e.mode!==`create`&&s||E(!1)},[m,e.fields,e.customFields,e.readOnly,e.mode,e.objectName,P,e.recordId,s,f]);let I=(0,t.useCallback)(async(t,n)=>{if(t&&(t.nativeEvent||t._reactName===`onSubmit`)&&(console.warn(`ObjectForm: Received Event instead of data in handleSubmit! This suggests a Form renderer issue.`),n===void 0&&(t={})),P&&!s)return e.onSuccess&&await e.onSuccess(t),t;if(!s)throw Error(`DataSource is required for form submission (inline mode not configured)`);let r=ue(t,P?null:m);if(C(e)&&(r=D(r,P?null:m)),f?.isLoaded&&r&&typeof r==`object`){let t={};for(let n of Object.keys(r))f.checkField(e.objectName,n,`write`)&&(t[n]=r[n]);r=t}try{let t;if(e.submitHandler)t=await e.submitHandler(r);else if(e.mode===`create`)t=await s.create(e.objectName,r);else if(e.mode===`edit`&&e.recordId){let n=await M({dataSource:s,objectName:e.objectName,recordId:e.recordId,payload:r,baseRecord:b});if(n.status===`cancelled`)return;t=n.result}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),j({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,s,P,f,m,M,b]),L=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),R=C(e),z={...t.default.useMemo(()=>R?T(m):{},[m,R]),...b},B=e.mode===`edit`&&e.recordId&&b&&typeof b==`object`?b:void 0,H=t.default.useMemo(()=>{let t=te(g,m);return e.mode===`create`&&(t=W(t,m)),t},[g,m,e.mode]),U=t.default.useMemo(()=>e.sections?.length?null:qe(H,m?.fieldGroups),[e.sections,H,m]),G=e.sections?.length?e.sections:U,[ne,q]=(0,t.useState)({});if(O)return(0,u.jsxs)(`div`,{className:`p-3 sm:p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,u.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:`Error loading form`}),(0,u.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:O.message})]});if(S)return(0,u.jsxs)(`div`,{className:`p-4 sm:p-8 text-center`,children:[(0,u.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,u.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:`Loading form...`})]});if(A)return(0,u.jsxs)(`div`,{className:`rounded-md border bg-card p-6 sm:p-8 text-center`,children:[(0,u.jsx)(`h3`,{className:`text-lg font-semibold`,children:A.title??`Thanks!`}),A.message&&(0,u.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:A.message})]});let J=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`;if(G?.length&&(!e.formType||e.formType===`simple`)){let t=U?H:g,n=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,i=G.map(e=>n(e.columns)).filter(e=>e!=null),a=G.reduce((e,t)=>e+(Array.isArray(t.fields)?t.fields.length:0),0),o=n(e.columns)??(i.length?Math.max(...i):ee(a)),s=[];G.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=p(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),f=r.name?l(e.objectName,r.name,r.label||r.name):r.label,m=ne[d]??r.collapsed??!1;f&&s.push({name:`__section_${d}`,label:f,type:`section-divider`,colSpan:4,collapsible:r.collapsible,collapsed:m,onToggle:r.collapsible?()=>q(e=>({...e,[d]:!m})):void 0,className:r.className});let h=n(r.columns),g=o>1?V(u,o,h):u;f&&m?s.push(...g.map(e=>({...e,hidden:!0}))):s.push(...g)});let c=s,d=K(o);return(0,u.jsxs)(`div`,{className:`w-full @container`,children:[(0,u.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:c,layout:J,columns:o,...d?{fieldContainerClass:d}:{},defaultValues:z,previousValues:B,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,onSubmit:I,onCancel:L}}),N]})}let ie=e.sections?.length,Y=p(g),X=ie?{fields:Y,columns:e.columns}:re(Y,m,e.columns,e.mode),Z=e.mobile,Q=Z?.fullscreenLongText?X.fields.map(e=>{let t=e.type;return t!==`textarea`&&t!==`field:textarea`&&t!==`field:markdown`&&t!==`field:html`?e:e.field?{...e,field:{...e.field,mobile_fullscreen:!0}}:{...e,mobile_fullscreen:!0}}):X.fields,oe=Z?.stepper,ce=Z?.stepperMinFields??8,$=Math.max(1,Z?.stepperFieldsPerStep??1);if(!e.formType&&!ie&&Q.length>=2&&(oe===!0||oe===`auto`&&d&&Q.length>=ce)){let t=Q,n=[];for(let e=0;e<t.length;e+=$){let r=t.slice(e,e+$);n.push({name:`step-${Math.floor(e/$)+1}`,label:r[0]?.label||r[0]?.name||`Step ${Math.floor(e/$)+1}`,fields:r})}return(0,u.jsx)(se,{schema:{...e,formType:`wizard`,sections:n,showStepIndicator:!0},dataSource:s,className:e.className})}let le={type:`form`,objectName:e.objectName,fields:Q,layout:J,columns:X.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:z,previousValues:B,onSubmit:I,onCancel:L,className:e.className,mobileStickyActions:!!Z?.stickyActions};return(0,u.jsxs)(`div`,{className:Z?.stickyActions?`w-full pb-20 md:pb-0`:`w-full`,"data-mobile-form":Z?`true`:void 0,children:[(0,u.jsx)(r.SchemaRenderer,{schema:le}),N]})},et={text:200,email:254,url:2048,phone:32,textarea:5e3,markdown:5e3,html:5e3},tt=`_company_website_2`,nt=1500;function rt(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 it(e){return e&&e.map(e=>{let t=et[String(e.type||``).toLowerCase()];return!t||(e.maxLength??e.max_length)?e:{...e,maxLength:t}})}var at=({config:e,dataSource:n,prefillParams:r,className:i})=>{let[o,s]=(0,t.useState)(!1),[l,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||tt,x=e.minFillTime??nt,S=(0,t.useMemo)(()=>it(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){s(!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),s(!0);let t=e.thankYouPage?.redirectUrl;if(t){if(rt(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)(()=>{s(!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,u.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,u.jsxs)(`div`,{className:`max-w-md w-full bg-card border rounded-xl shadow-sm p-8 text-center space-y-4`,children:[(0,u.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,u.jsx)(c.CheckCircle2,{className:`h-8 w-8`,"aria-hidden":`true`})}),(0,u.jsx)(`h2`,{className:`text-xl font-semibold text-foreground`,children:t?.title||n.thankYouTitle||`Thank You!`}),(0,u.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t?.message||n.thankYouMessage||`Your submission has been received successfully.`}),e.allowMultiple&&(0,u.jsx)(a.Button,{variant:`outline`,size:`sm`,onClick:E,className:`mt-2`,children:n.submitAnother??`Submit Another Response`}),t?.redirectUrl&&(0,u.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:o})]})})}let O=e.texts??{},k=!!e.consent?.required,A=`${e.formId}-consent`;return(0,u.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,u.jsxs)(`div`,{className:`max-w-2xl w-full bg-card border rounded-xl shadow-sm overflow-hidden`,children:[e.branding?.coverImage&&(0,u.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,u.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,u.jsx)(`img`,{src:e.branding.logo,alt:``,className:`h-8 mb-4`}),e.title&&(0,u.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight text-foreground`,children:e.title}),e.description&&(0,u.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2 leading-relaxed`,children:e.description}),(0,u.jsx)(`p`,{className:`text-[11px] text-muted-foreground/70 mt-3`,"aria-hidden":`true`,children:O.requiredHint??`* Required field`})]}),(0,u.jsxs)(`div`,{className:`relative px-6 sm:px-8 py-6`,children:[f&&(0,u.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,u.jsx)(Qe,{schema:{type:`object-form`,objectName:e.objectName,mode:`create`,fields:e.fields,customFields:S,initialData:w,onSuccess:T,submitText:l?O.submitting??`Submitting...`:O.submit??`Submit`},dataSource:C}),b&&(0,u.jsxs)(`div`,{"aria-hidden":`true`,className:`absolute left-[-10000px] top-auto h-px w-px overflow-hidden`,children:[(0,u.jsx)(`label`,{htmlFor:`${e.formId}-${b}`,children:`Do not fill this field`}),(0,u.jsx)(`input`,{ref:v,id:`${e.formId}-${b}`,type:`text`,name:b,tabIndex:-1,autoComplete:`off`,defaultValue:``})]}),e.consent&&(0,u.jsxs)(`div`,{className:`mt-4`,children:[(0,u.jsxs)(`label`,{className:`flex items-start gap-2 text-sm text-foreground cursor-pointer select-none`,children:[(0,u.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,u.jsxs)(`span`,{className:`leading-relaxed`,children:[e.consent.label??O.consentLabelDefault??`I agree to the privacy policy.`,k&&(0,u.jsx)(`span`,{"aria-hidden":`true`,className:`text-destructive ml-0.5`,children:`*`}),e.consent.privacyUrl&&(0,u.jsxs)(u.Fragment,{children:[` `,(0,u.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,u.jsx)(`p`,{id:`${A}-error`,role:`alert`,className:`mt-1.5 text-xs text-destructive`,children:g})]}),l&&(0,u.jsxs)(`div`,{className:`mt-3 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,u.jsx)(c.Loader2,{className:`h-3.5 w-3.5 animate-spin`,"aria-hidden":`true`}),(0,u.jsx)(`span`,{children:O.submitting??`Submitting…`})]})]}),(0,u.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,u.jsxs)(`p`,{className:`inline-flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,u.jsx)(c.Lock,{className:`h-3 w-3`,"aria-hidden":`true`}),(0,u.jsx)(`span`,{children:O.secureNotice??`Your information is transmitted securely and only used to respond to your request.`})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground/80`,children:[e.privacyPolicyUrl&&(0,u.jsxs)(`a`,{href:e.privacyPolicyUrl,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1 underline hover:text-foreground`,children:[(0,u.jsx)(c.ShieldCheck,{className:`h-3 w-3`,"aria-hidden":`true`}),O.consentLink??`Privacy policy`]}),(0,u.jsx)(`span`,{children:O.poweredBy??`Powered by ObjectStack`})]})]})]})})};function ot(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 st=({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,u.jsxs)(`div`,{className:`space-y-4 ${i||``}`,children:[(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`h2`,{className:`text-lg font-semibold text-foreground`,children:n||`Form Analytics`}),(0,u.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Form ID: `,e]})]}),(0,u.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-4`,children:[(0,u.jsx)(a.Card,{children:(0,u.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,u.jsx)(a.CardDescription,{children:`Total Submissions`}),(0,u.jsx)(a.CardTitle,{className:`text-2xl`,children:r.totalSubmissions.toLocaleString()})]})}),(0,u.jsxs)(a.Card,{children:[(0,u.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,u.jsx)(a.CardDescription,{children:`Fill Rate`}),(0,u.jsxs)(a.CardTitle,{className:`text-2xl`,children:[o,`%`]})]}),(0,u.jsx)(a.CardContent,{children:(0,u.jsx)(`div`,{className:`w-full bg-muted rounded-full h-2`,children:(0,u.jsx)(`div`,{className:`bg-primary rounded-full h-2 transition-all`,style:{width:`${o}%`}})})})]}),(0,u.jsx)(a.Card,{children:(0,u.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,u.jsx)(a.CardDescription,{children:`Avg. Completion Time`}),(0,u.jsx)(a.CardTitle,{className:`text-2xl`,children:r.avgCompletionTime?ot(r.avgCompletionTime):`—`})]})})]}),r.dailySubmissions&&r.dailySubmissions.length>0&&(0,u.jsxs)(a.Card,{children:[(0,u.jsx)(a.CardHeader,{children:(0,u.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Daily Submissions`})}),(0,u.jsx)(a.CardContent,{children:(0,u.jsx)(`div`,{className:`flex items-end gap-1 h-32`,children:r.dailySubmissions.map((e,t)=>(0,u.jsxs)(`div`,{className:`flex-1 flex flex-col items-center gap-1`,children:[(0,u.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,u.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,u.jsxs)(a.Card,{children:[(0,u.jsxs)(a.CardHeader,{children:[(0,u.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Field Completion Rates`}),(0,u.jsx)(a.CardDescription,{children:`Percentage of users who completed each field`})]}),(0,u.jsx)(a.CardContent,{children:(0,u.jsx)(`div`,{className:`space-y-3`,children:r.fieldDropOff.map((e,t)=>(0,u.jsxs)(`div`,{className:`space-y-1`,children:[(0,u.jsxs)(`div`,{className:`flex justify-between text-sm`,children:[(0,u.jsx)(`span`,{className:`text-foreground`,children:e.label}),(0,u.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.completionRate,`%`]})]}),(0,u.jsx)(`div`,{className:`w-full bg-muted rounded-full h-1.5`,children:(0,u.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))})})]})]})},ct=({schema:e})=>{let o=(0,r.useSchemaContext)()?.dataSource,s=(0,r.useRecordContext)(),c=e.parentObject||s?.objectName,l=e.parentId||e.recordId||s?.recordId,[d,f]=(0,t.useState)([]),[p,m]=(0,t.useState)([]),[h,g]=(0,t.useState)(!0),[_,v]=(0,t.useState)(!1),[y,b]=(0,t.useState)(!1),[x,S]=(0,t.useState)(null),[C,w]=(0,t.useState)(null);(0,t.useEffect)(()=>{let t=o;if(!t||typeof t.getObjectSchema!=`function`)return;let n=!1;return t.getObjectSchema(e.childObject).then(e=>{n||w(e??null)}).catch(()=>{n||w(null)}),()=>{n=!0}},[o,e.childObject]);let T=JSON.stringify(e.filter??null),E=JSON.stringify(e.sort??null),D=(0,t.useMemo)(()=>(0,n.toFilterNode)(e.filter),[T]),O=(0,t.useMemo)(()=>(0,n.convertSortToQueryParams)(e.sort),[E]),k=(0,t.useCallback)(async()=>{if(!o||!l){g(!1);return}g(!0);try{let t={[e.relationshipField]:l},r=(await o.find(e.childObject,{$filter:D===void 0?t:(0,n.mergeFilterNodes)(t,D),...O?{$orderby:O}:{},$top:e.limit??500}))?.data??[];f(r.map(e=>({...e}))),m(r.map(e=>({...e}))),b(!1)}catch(e){S(e?.message||`Failed to load line items`)}finally{g(!1)}},[o,l,e.childObject,e.relationshipField,e.limit,D,O]);(0,t.useEffect)(()=>{k()},[k]);let A=(0,t.useCallback)(e=>{f(e),b(!0)},[]),j=(0,t.useCallback)(async()=>{if(!(!o||!l)){v(!0),S(null);try{let t=!!(c&&e.totalField),r=t?{[e.totalField]:ve(d,e.amountField||`amount`)}:{},i=ge(c??``,l,r,[{childObject:e.childObject,relationshipField:e.relationshipField,rows:d,original:p,childSchema:C}]);t||(i=i.slice(1)),i.length&&await(0,n.runBatchTransaction)(o,i),await k()}catch(e){S(e?.message||`Failed to save line items`)}finally{v(!1)}}},[o,l,d,p,e,c,k,C]),M=(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,u.jsxs)(a.Card,{className:(0,a.cn)(`shadow-none`),children:[(0,u.jsxs)(a.CardHeader,{className:`flex-row items-center justify-between gap-2 pb-2`,children:[(0,u.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:e.title||`Line Items`}),!e.readonly&&(0,u.jsx)(a.Button,{type:`button`,size:`sm`,onClick:j,disabled:_||h||!y||!l,children:_?`Saving…`:`Save`})]}),(0,u.jsxs)(a.CardContent,{children:[x&&(0,u.jsx)(`p`,{className:`mb-2 text-sm text-destructive`,children:x}),h?(0,u.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Loading…`}):l?(0,u.jsx)(i.LineItemsField,{value:d,onChange:A,field:M,readonly:e.readonly}):(0,u.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Save the record first to add line items.`})]})]})},lt=({schema:e})=>{let n=(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0;return(0,u.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n,testId:`object-form`,errorTitle:`This form’s data source could not be resolved`,children:e=>(0,u.jsx)(Qe,{schema:e,dataSource:n})})};n.ComponentRegistry.register(`object-form`,lt,{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`,lt,{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})=>{let n=(0,t.useContext)(r.SchemaRendererContext);return(0,u.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n?.dataSource,testId:`embeddable-form`,errorTitle:`This form’s data source could not be resolved`,children:e=>(0,u.jsx)(at,{config:e,dataSource:n?.dataSource})})},{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,u.jsx)(st,{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})=>{let n=(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0;return(0,u.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n,testId:`object-master-detail-form`,errorTitle:`This form’s data source could not be resolved`,children:e=>(0,u.jsx)(Ue,{schema:e,dataSource:n})})},{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}]});var ut={object:`childObject`,filter:!0,sort:!0,limit:`limit`};n.ComponentRegistry.register(`line_items`,({schema:e})=>(0,u.jsx)(r.ElementDataSourceGate,{schema:e,mapping:ut,testId:`record-line-items`,errorTitle:`This line-items panel’s data source could not be resolved`,children:e=>(0,u.jsx)(ct,{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=at,e.FormAnalytics=st,e.FormSectionContainer=Z,e.LineItemsPanel=ct,e.MasterDetailForm=Ue,e.ModalForm=Xe,e.ObjectForm=Qe,e.SplitForm=ce,e.TabbedForm=X,e.WizardForm=se,e.applyAutoColSpan=V,e.applyAutoLayout=re,e.containerGridColsFor=K,e.deriveColumns=je,e.deriveDetail=Be,e.deriveFormFields=Pe,e.filterAutoGeneratedFields=W,e.filterCreateModeFields=U,e.filterSystemFields=te,e.findRelationshipField=Ee,e.inferColumns=ee,e.inferModalSize=ne,e.isAutoGeneratedFieldType=R,e.isWideFieldType=L,e.resolveInlineMode=Le});
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/i18n"),require("@object-ui/fields"),require("@object-ui/components"),require("@objectstack/spec/ui"),require("@object-ui/permissions"),require("@objectstack/spec/data"),require("lucide-react"),require("react/jsx-runtime")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`@object-ui/i18n`,`@object-ui/fields`,`@object-ui/components`,`@objectstack/spec/ui`,`@object-ui/permissions`,`@objectstack/spec/data`,`lucide-react`,`react/jsx-runtime`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginForm={},e.React,e._object_ui_core,e._object_ui_react,e._object_ui_i18n,e._object_ui_fields,e._object_ui_components,e._objectstack_spec_ui,e._object_ui_permissions,e._objectstack_spec_data,e.lucide_react,e.react_jsx_runtime))})(this,function(e,t,n,r,i,a,o,s,c,l,u,d){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var f=Object.create,p=Object.defineProperty,m=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyNames,g=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty,v=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=h(t),a=0,o=i.length,s;a<o;a++)s=i[a],!_.call(e,s)&&s!==n&&p(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=m(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:f(g(e)),v(t||!e||!e.__esModule||!_.call(e,`default`)?p(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);function y(e,n,i){let a=(0,r.useDataInvalidation)(i&&e||void 0,i&&n!==void 0?String(n):void 0),[o,s]=(0,t.useState)(0),c=(0,t.useRef)(!1),l=(0,t.useRef)(!1),u=(0,t.useRef)(a);(0,t.useEffect)(()=>{if(a!==u.current){if(u.current=a,c.current){l.current=!0;return}s(e=>e+1)}},[a]);let[d]=(0,t.useState)(()=>{let e=()=>{l.current&&(l.current=!1,s(e=>e+1))};return{onDirtyChange:t=>{c.current=t,t||e()},saved:()=>{c.current=!1,e()}}});return{refetch:o,...d}}var b=`https://a.invalid/`,x=`https://b.invalid/`;function S(e){try{return new URL(e,b).origin===`https://a.invalid`&&new URL(e,x).origin===`https://b.invalid`}catch{return!1}}function C(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,()=>encodeURIComponent(String(n)));return S(r)?r:null}var w=/\{\{record\.([a-z_][a-z0-9_]*)\}\}/g;function T(e){return e==null?``:typeof e==`string`?e:typeof e==`boolean`||typeof e==`number`&&Number.isFinite(e)?String(e):``}function E(e,t){let n=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:{};return{...n(e),...n(t)}}function D(e,t){let n=s.FormViewSchema.safeParse({submitBehavior:{kind:`redirect`,url:e}});if(!n.success)return{ok:!1,refusal:n.error.issues.find(e=>e.path[0]===`submitBehavior`&&e.path[1]===`url`)?.message??n.error.issues[0]?.message??`\`submitBehavior.url\` is not a value this contract accepts: ${JSON.stringify(e)}.`};let r=n.data.submitBehavior,i=(r?.kind===`redirect`?r.url:e).replace(w,(e,n)=>encodeURIComponent(T(t[n])));return i.includes(`{`)||i.includes(`}`)?{ok:!1,refusal:`\`submitBehavior.url\` carries an interpolation this renderer could not resolve (${JSON.stringify(e)}). A token names one declared record field, spelled \`{{record.field_name}}\`, and the redirect is refused rather than followed with the token left in it.`}:{ok:!0,url:i}}function O(e){let{navigate:n}=(0,r.useHostNavigation)(),i=(0,t.useRef)(n);(0,t.useEffect)(()=>{i.current=n},[n]),(0,t.useEffect)(()=>{if(!e)return;let t=setTimeout(()=>{let t=i.current;if(t){t(e.url);return}window.location.assign(e.url)},e.delayMs);return()=>clearTimeout(t)},[e])}function k(e,t){return`[ObjectForm] Section \`visibleWhen\` is not yet supported on this layout: the \`${e}\` layout's steps drop the predicate, so section(s) ${t} render unconditionally. A wizard STEP predicate is a separate contract still being designed (objectui#6237) — it is not the tab predicate with a different name. Today, use \`formType: 'tabbed' | 'modal' | 'drawer' | 'split'\` or the flat layout — each honours a section \`visibleWhen\` — or move the predicate onto the individual fields, whose own \`visibleWhen\` is evaluated on every layout.`}function A(e){return e!=null&&!(0,n.isRuntimeDefault)(e)}function j(e){return e?.mode===`create`||!e?.recordId}function M(e,t){return!(!e?.required||t&&(0,n.isRuntimeDefault)(e.defaultValue))}function N(e,t){let n=e?.fields;if(!n||typeof n!=`object`)return{};let r={};for(let e of Object.keys(n)){let i=n[e],a=i?.defaultValue;A(a)?r[e]=a:P(i)&&t?.currentUserId&&(r[e]=t.currentUserId)}return r}function P(e){return!e||!(0,l.isCurrentUserDefaultToken)(e.defaultValue)?!1:e.type===`user`||e.type===`lookup`&&e.reference===`sys_user`}function F(e,t,n){return{...N(e,n),...t??{}}}function I(e,t){if(!e||typeof e!=`object`)return e;let r=t?.fields;if(!r||typeof r!=`object`)return e;let i={};for(let[t,a]of Object.entries(e))(0,n.isRuntimeDefault)(r[t]?.defaultValue)&&(0,n.isMissingForRequired)(a)||(i[t]=a);return i}function L(e,t){if(e?.length)return e.find(e=>e?.name===t)}function R(e,t,n,r=e=>e){let i=t?.length?t:void 0,a=[];if(e.forEach((e,t)=>{let o=L(i,e);if(o){a.push(r(o));return}let s=n(e,t);s&&a.push(s)}),i){let e=new Set(a.map(e=>e.name));i.forEach(t=>{let n=t?.name;n&&!e.has(n)&&(e.add(n),a.push(r(t)))})}return a}function z(e,t){return typeof t==`string`||typeof t==`object`&&t&&typeof t.source==`string`?(0,n.isBlankPredicateText)(t)?(e.visibleOn!==t&&(0,n.evalFieldPredicate)(t,{},!0,void 0,void 0,{context:`view-level visibility of field '${e.name}', read as no gate`}),e):{...e,visibleOn:t}:e}var B=new Set;function V(e,t){if(typeof e.name!=`string`||e.name===e.field)return;let n=`${t}:${e.field}:${e.name}`;B.has(n)||(B.add(n),console.warn(`[object-ui] section field { field: '${e.field}' } also carries name: '${e.name}' — mixed form-field vocabularies. The spec key wins (the runtime name becomes '${e.field}'); drop \`name\` from authored form views.`))}var H=new Set;function U(e,t){let n=typeof e==`object`&&e&&typeof e.field==`string`?`{ field: '${e.field}' }`:JSON.stringify(e),r=`${t}:${n}`;H.has(r)||(H.add(r),console.warn(`[object-ui] top-level \`fields\` entry ${n} resolved to no field name and was skipped. Top-level \`fields\` takes bare field-name strings — it is NOT the same vocabulary as \`sections[].fields\`, which also accepts the spec \`FormFieldSchema\` object (identity key \`field\`, e.g. \`{ field: 'note', colSpan: 2 }\`). That shape has no \`name\` here and is silently dropped; use a bare field-name string, or move the entry into a \`sections[].fields\` entry instead.`))}var W=new Set;function G(e,t,n){let r=n?`section '${n}'`:`an untitled section`,i=`${t}:${r}:${e}`;W.has(i)||(W.add(i),console.warn(`[object-ui] ${r} names '${e}', which object '${t}' declares, but the form's top-level \`fields\` does not list it — so it was dropped from the rendered form. Top-level \`fields\` and \`sections\` INTERSECT (the parent field pool is built from \`fields\` first, and every section resolves its members against that pool); they are alternatives, not layers. Author one or the other, or list every section member in \`fields\` too. A section that loses EVERY member this way disappears with its heading.`))}function K(e,t){let n=t.objectSchema?.fields?.[e];return n?{name:e,label:t.fieldLabel(t.objectName,e,n.label||e),type:(0,a.mapFieldTypeToFormType)(n.type,{multiple:n.multiple}),required:M(n,j(t)),disabled:t.readOnly||t.mode===`view`||n.readonly,placeholder:n.placeholder,description:n.help||n.description,validation:(0,a.buildValidationRules)(n),field:n,options:n.options,multiple:n.multiple,visibleWhen:n.visibleWhen,readonlyWhen:n.readonlyWhen,requiredWhen:n.requiredWhen}:{name:e,label:e,type:`input`}}function ee(e){if(typeof e==`string`)return e;if(typeof e!=`object`||!e)return;let t=e;return typeof t.field==`string`?t.field:typeof t.name==`string`?t.name:void 0}function q(e,t){return J(e,t,void 0)}function J(e,t,n){if(typeof e==`string`){if(n)return n;let r=L(t.customFields,e);if(r)return q(r,t);let i=t.objectSchema?.fields?.[e];return z(K(e,t),i?.visible_on??i?.visibleOn)}let r=e;if(typeof r.field!=`string`)return z(r,r.visibleOn);V(r,t.objectName);let i=r.field,o=L(t.customFields,i),s=n?{...n}:o?{...o}:K(i,t);r.widget!=null&&(s.widget=r.widget),r.label!=null&&(s.label=r.label),r.placeholder!=null&&(s.placeholder=r.placeholder),r.helpText!=null&&(s.description=r.helpText),r.required!=null&&(s.required=M({required:r.required,defaultValue:t.objectSchema?.fields?.[i]?.defaultValue},j(t))),r.readonly!=null&&(s.disabled=r.readonly||s.disabled),r.immutable!=null&&(s.immutable=r.immutable),r.hidden!=null&&(s.hidden=r.hidden),r.colSpan!=null&&(s.colSpan=r.colSpan),r.span!=null&&(s.span=r.span),r.options!=null&&(s.options=r.options),r.multiple!=null&&(s.multiple=r.multiple);let c=r.type??(o?void 0:t.objectSchema?.fields?.[i]?.type);return c!=null&&(s.type=(0,a.mapFieldTypeToFormType)(c,{multiple:s.multiple})),r.reference!=null&&(s.reference=r.reference),r.maxLength!=null&&(s.maxLength=r.maxLength),r.minLength!=null&&(s.minLength=r.minLength),r.min!=null&&(s.min=r.min),r.max!=null&&(s.max=r.max),r.precision!=null&&(s.precision=r.precision),r.scale!=null&&(s.scale=r.scale),r.language!=null&&(s.language=r.language),Array.isArray(r.fields)&&(s.fields=r.fields),r.dependsOn!=null&&(s.dependsOn=r.dependsOn),r.keyField!=null&&(s.keyField=r.keyField),r.disclosure!=null&&(s.disclosure=r.disclosure),z(s,r.visibleWhen??r.visibleOn)}function te(e,t){let n=e.fields??[],r=t.pool;if(!r)return n.map(e=>q(e,t));let i=new Map;for(let e of r)e?.name&&!i.has(e.name)&&i.set(e.name,e);let a=[];for(let e of n){let n=ee(e),r=n===void 0?void 0:i.get(n);r&&a.push(J(e,t,r))}return a}function ne(e){return{...e?.initialValues??{},...e?.initialData??{}}}function re(e,t){if(e?.isLoaded)return n=>e.checkField(t,n,`write`)}function ie(e,t,n,r,i){if(!Array.isArray(e)||!t?.isLoaded)return e;let a=[];for(let o of e){if(!o?.name){a.push(o);continue}if(t.checkField(n,o.name,`read`)){if(r!==`view`&&!t.checkField(n,o.name,`write`)){a.push(i(o));continue}a.push(o)}}return a}function Y(e,{perms:t,objectName:n,mode:r,deniedDescription:i}){return ie(e,t,n,r,e=>i?{...e,readOnly:!0,disabled:!0,description:e.description??i}:{...e,readOnly:!0,disabled:!0})}function X(e,t,r,i){if(i!==`edit`&&i!==`create`)return!1;let a=(0,n.resolveEffectiveCrudAffordances)(e,t?.getObjectApiOperations?.(r));return i===`edit`?!a.edit:!a.create}function ae({perms:e,objectName:t,mode:n,objectSchema:r}){if(X(r,e,t,n))return n===`edit`?`edit`:`create`}function oe(e,{objectSchema:t,...n}){let r=Y(e,n);return!Array.isArray(r)||!X(t,n.perms,n.objectName,n.mode)?r:r.map(e=>e?.name?{...e,disabled:!0}:e)}var se=`true`;function ce(e,{perms:t,objectName:n}){return ie(e,t,n,void 0,e=>({...e,readonlyWhen:se}))}var le=(0,i.createSafeTranslation)({"form.noPermissionToCreate":`You don't have permission to create {{object}} records. The fields are read-only.`,"form.noPermissionToEdit":`You don't have permission to edit {{object}} records. The fields are read-only.`},`form.noPermissionToCreate`);function Z({affordance:e,objectName:t,objectSchema:n}){let i=(0,r.useSafeFieldLabel)(),{t:a}=le();if(!e)return null;let o=typeof n?.label==`string`&&n.label?n.label:t,s=`objectLabel`in i?i.objectLabel({name:t,label:o}):o,c=a(e===`edit`?`form.noPermissionToEdit`:`form.noPermissionToCreate`,{object:s});return(0,d.jsxs)(`p`,{role:`status`,className:`mb-4 flex items-start gap-2 rounded-md border bg-muted/50 px-3 py-2 text-sm text-muted-foreground`,"data-testid":`closed-affordance-notice`,"data-affordance":e,children:[(0,d.jsx)(u.Lock,{className:`mt-0.5 h-4 w-4 shrink-0`,"aria-hidden":!0}),(0,d.jsx)(`span`,{children:c})]})}var ue=new Set(`id._id.__v._version._rev.created.created_at.createdAt.created_by.createdBy.modified.modified_by.updated_at.updatedAt.updated_by.updatedBy.last_modified_at.lastModifiedAt.last_modified_by.lastModifiedBy.deleted_at.deletedAt.owner.owner_id.ownerId.owning_business_unit_id.owningBusinessUnitId.organization_id.organizationId.org_id.orgId.tenant_id.tenantId.company_id.companyId.space`.split(`.`)),de=new Set([`formula`,`summary`,`rollup`,`lookup_value`,`auto_number`,`autonumber`,`computed`]);function fe(e,t,n){if(!e||typeof e!=`object`)return e;let r={},i=t?.fields,a=n?.canEdit;for(let[t,n]of Object.entries(e))if(!ue.has(t)&&(!a||a(t))){if(i){let e=i[t];if(!e||e.system===!0)continue;let n=String(e.type||``).toLowerCase();if(de.has(n)||e.computed===!0||e.readOnly===!0||e.readonly===!0)continue}r[t]=n}return r}function pe(e,t){if(e===t||e==null&&t==null)return!0;if(e==null||t==null)return!1;if(e instanceof Date||t instanceof Date){let n=e instanceof Date?e.getTime():NaN,r=t instanceof Date?t.getTime():NaN;return Number.isFinite(n)&&n===r}if(typeof e==`object`&&typeof t==`object`)try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}return!1}function me(e,t){let n={};for(let[r,i]of Object.entries(e))pe(i,t[r])||(n[r]=i);return n}function he(e,t){return e.recordId==null||e.recordId===``||!t||typeof t!=`object`||Array.isArray(t)?null:{objectName:e.objectName,recordId:String(e.recordId),record:{...t}}}function Q(e,t){return!e||t.mode!==`edit`||t.recordId==null||t.recordId===``||e.objectName!==t.objectName||e.recordId!==String(t.recordId)?null:e.record}function ge(e,t,n){if(!e||typeof e!=`object`)return e;let r=Q(t,n);if(!r)return e;let i=me(e,r);return Object.keys(i).length>0?i:e}function _e(e,t,n){let r=Q(e,t);return!e||!r?e??null:!n||typeof n!=`object`?e:{...e,record:{...r,...n}}}function ve(e,t,{objectSchema:n,canEdit:r,snapshot:i}){let a=Array.isArray(t.customFields)&&t.customFields.length>0?null:n,o=fe(e,a,{canEdit:r});return j(t)&&(o=I(o,a)),{payload:o,writePayload:ge(o,i,t)}}var ye=new Set([`field:formula`,`field:summary`,`field:auto_number`,`field:autonumber`]),be=new Set([`field:textarea`,`field:markdown`,`field:html`,`field:grid`,`field:richtext`,`textarea`,`markdown`,`html`,`grid`,`richtext`]),xe=new Set([`formula`,`summary`,`auto_number`,`autonumber`]);function Se(e){return be.has(e)}function Ce(e){return xe.has(e)}function we(e){return e<=3?1:e<=8?2:e<=15?3:4}function Te(e){return e&&e>0?Math.min(Math.floor(e),4):1}function Ee(e,t,n){let r=Te(t);return r<=1?1:e.span===`full`?r:e.colSpan==null?e.type&&Se(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 De(e,t,n){let r=Te(t);return r<=1?e:e.map(e=>{if(e.type===`section-divider`)return e;let t=Ee(e,r,n);return t>1?{...e,colSpan:t}:e.colSpan!=null&&e.colSpan!==1?{...e,colSpan:1}:e})}var $=ue;function Oe(e,t){return e.filter(e=>{if($.has(e.name))return!1;let n=t?.fields?.[e.name];return n?.hidden!==!0&&n?.readonly!==!0})}function ke(e,t){return e.filter(e=>{if($.has(e.name)||e.type&&ye.has(e.type))return!1;if(!t?.fields)return!0;let n=t.fields[e.name];return!n||n.readonly!==!0&&!Ce(n.type)})}function Ae(e,t){return e.filter(e=>{if(e.type&&ye.has(e.type))return!1;let n=t?.fields?.[e.name];return!n||!Ce(n.type)})}var je={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 Me(e){return je[e&&e>0?Math.min(Math.floor(e),4):1]}function Ne(e){return e<=1?`default`:e===2?`xl`:`full`}function Pe(e,t,n,r){let i=[...e];if(i=Oe(i,t),r===`create`&&(i=Ae(i,t)),n!==void 0)return i=De(i,n),{fields:i,columns:n};let a=we(i.length);return i=De(i,a),{fields:i,columns:a}}var Fe=(0,i.createSafeTranslation)({"form.conflictTitle":`Save conflict`,"form.conflictMessage":`This record was changed by someone else while you were editing. Overwriting will replace their changes with yours.`,"form.conflictLatestVersion":`Their save: {{time}}`,"form.conflictOverwrite":`Overwrite`,"form.keepEditing":`Keep editing`},`form.conflictTitle`);function Ie(e){let t=e?.updated_at;return typeof t==`string`&&t.length>0?t:void 0}function Le(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.code===`CONCURRENT_UPDATE`||t.name===`ConcurrentUpdateError`}function Re(e,t){return JSON.stringify([e,String(t)])}function ze(e,t){if(t)return e&&e.readVersion===t?e.version:t}function Be(e,t){if(!e)return null;let n=/\d{4}-\d{2}-\d{2}[ T]/.test(e)?e.replace(` `,`T`):e,r=new Date(n);return Number.isNaN(r.getTime())?null:r.toLocaleString(t)}function Ve(){let{t:e}=Fe(),n=(0,i.useDisplayLocale)(),[a,s]=t.useState(null),c=t.useRef(null),l=t.useRef(new Map),f=t.useCallback(e=>{c.current?.(e),c.current=null,s(null)},[]);t.useEffect(()=>()=>c.current?.(!1),[]);let p=t.useCallback(async({dataSource:e,objectName:t,recordId:n,payload:i,baseRecord:a})=>{let o=Re(t,n),u=Ie(a),d=ze(l.current.get(o),u),f=e=>{let t=Ie(e);u&&t?l.current.set(o,{readVersion:u,version:t}):l.current.delete(o)};try{let r=await e.update(t,n,i,d?{ifMatch:d}:void 0);return f(r),{status:`saved`,result:r}}catch(a){if(!Le(a))throw a;let o=a.currentVersion,l=(0,r.declaredUserMessage)(a);if(!await new Promise(e=>{c.current=e,s({currentVersion:typeof o==`string`?o:void 0,userMessage:l??void 0})}))return{status:`cancelled`};let u=typeof o==`string`&&o.length>0?o:void 0,d=await e.update(t,n,i,u?{ifMatch:u}:void 0);return f(d),{status:`saved`,result:d}}},[]),m=Be(a?.currentVersion,n);return{saveWithOcc:p,conflictDialog:(0,d.jsx)(o.AlertDialog,{open:!!a,onOpenChange:e=>{e||f(!1)},children:(0,d.jsxs)(o.AlertDialogContent,{children:[(0,d.jsxs)(o.AlertDialogHeader,{children:[(0,d.jsxs)(o.AlertDialogTitle,{className:`flex items-center gap-2`,children:[(0,d.jsx)(u.AlertTriangle,{className:`h-5 w-5 text-amber-500`,"aria-hidden":!0}),e(`form.conflictTitle`)]}),(0,d.jsxs)(o.AlertDialogDescription,{children:[a?.userMessage&&(0,d.jsx)(`span`,{className:`mb-2 block font-medium text-foreground`,children:a.userMessage}),e(`form.conflictMessage`),m&&(0,d.jsx)(`span`,{className:`mt-2 block text-xs text-muted-foreground`,children:e(`form.conflictLatestVersion`,{time:m})})]})]}),(0,d.jsxs)(o.AlertDialogFooter,{children:[(0,d.jsx)(`button`,{type:`button`,className:(0,o.cn)((0,o.buttonVariants)({variant:`outline`})),onClick:()=>f(!1),children:e(`form.keepEditing`)}),(0,d.jsx)(`button`,{type:`button`,className:(0,o.cn)((0,o.buttonVariants)({variant:`destructive`})),onClick:()=>f(!0),children:e(`form.conflictOverwrite`)})]})]})})}}var He={schema:null,record:null};function Ue(e,t,n){let r=++e.current[n],i=()=>e.current[n]===r;return{fail(e){i()&&t(t=>({...t,[n]:e}))},commit(){i()&&t(e=>e[n]===null?e:{...e,[n]:null})}}}function We(e){return e.schema||e.record}function Ge(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return typeof t.field!=`string`&&typeof t.name==`string`}function Ke(e){if(!Array.isArray(e)||e.length===0)return!1;let t=0;for(let n of e){if(typeof n!=`object`||!n)return!1;let e=n.fields;if(!Array.isArray(e))return!1;for(let n of e){if(!Ge(n))return!1;t+=1}}return t>0}function qe(e){let t=e;return Array.isArray(t?.customFields)&&t.customFields.length>0?!0:Ke(t?.sections)}var Je=`DataSource is required for form submission (inline mode not configured)`;function Ye(){return Error(Je)}var Xe=(0,i.createSafeTranslation)({"form.uploadInFlight":`Wait for the upload to finish before saving.`,"fields.file.uploading":`Uploading…`},`form.uploadInFlight`);function Ze(){let e=(0,a.useUploadingScope)(),{t}=Xe();return{uploading:e.anyUploading,scope:e,busyLabel:t(`fields.file.uploading`),reason:t(`form.uploadInFlight`)}}function Qe({gate:e,children:t}){return(0,d.jsx)(a.UploadingScopeProvider,{scope:e.scope,children:t})}function $e({gate:e}){return e.uploading?(0,d.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,"data-testid":`upload-in-flight-notice`,children:e.reason}):null}var et={"form.create":`Create`,"form.update":`Update`,"common.save":`Save`,"common.cancel":`Cancel`,"form.created":`Created`,"form.saved":`Saved`,"form.savedNamed":`{{title}} saved`,"form.errorLoading":`Error loading form`,"form.navigateRefused":"The `navigateOnSuccess` destination declared for this form was refused, so the navigation did not happen.","publicForm.thankYouTitle":`Thank you!`,"publicForm.loading":`Loading form…`,"form.deniedDescription":`You do not have edit access to this field.`,"form.masterDetail.loadingColumns":`Loading columns…`,"form.masterDetail.subtotal":`Subtotal`,"form.masterDetail.tax":`Tax ({{rate}}%)`,"form.masterDetail.total":`Total`,"form.masterDetail.lineItem":`Line item`,"form.masterDetail.rowTitle":`{{title}} — row {{row}}`,"form.masterDetail.applyRow":`Apply`,"detail.add":`Add`,"common.close":`Close`,"detail.saving":`Saving…`,"form.masterDetail.noChildObject":`This collection has no child object configured: set {{property}} to the object whose rows it lists.`,"form.masterDetail.schemaUnavailable":`Could not load the schema of {{object}}, so this collection has no columns to show. Check that the object exists and is readable, then reload.`,"form.masterDetail.noRelationshipField":`Could not work out how {{object}} links to {{parent}}: no lookup or master_detail field on it references the parent. Set {{property}} on this collection to the field that holds the parent record.`,"form.lineItems.title":`Line Items`};et[`form.navigateRefused`];var tt=(0,i.createSafeTranslation)(et,`form.errorLoading`),nt=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:a}=(0,r.useSafeFieldLabel)(),{t:s}=tt(),l=(0,c.usePermissions)(),{userId:u}=l,[f,p]=(0,t.useState)(null),m=Ze(),[h,g]=(0,t.useState)({}),{saveWithOcc:_,conflictDialog:v}=Ve(),[b,x]=(0,t.useState)(!0),[S,C]=(0,t.useState)(He),w=(0,t.useRef)({schema:0,record:0}),T=We(S),E=e.defaultTab||e.sections[0]?.name||e.sections[0]?.label||`tab-0`;t.default.useEffect(()=>{let t=!1,r=Ue(w,C,`schema`);return(async()=>{if(!n){x(!1);return}try{let i=await n.getObjectSchema(e.objectName);if(t)return;p(i),r.commit()}catch(e){if(t)return;r.fail(e)}})(),()=>{t=!0}},[e.objectName,n]);let D=(0,t.useRef)(void 0),O=(0,t.useRef)(null),{refetch:k,onDirtyChange:A,saved:j}=y(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`);t.default.useEffect(()=>{let t=!1,r=Ue(w,C,`record`);return(f||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){O.current=null,g(F(f,ne(e),{currentUserId:u})),r.commit(),x(!1);return}D.current!==e.recordId&&x(!0);try{let i=await n.findOne(e.objectName,e.recordId);if(t)return;D.current=e.recordId,O.current=he(e,i),g(i||{}),r.commit()}catch(e){if(t)return;r.fail(e)}finally{t||x(!1)}})(),()=>{t=!0}},[f,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName,k]);let M=(0,t.useCallback)(t=>{let n=te(t,{objectSchema:f,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:a,customFields:e.customFields});return oe(n,{perms:l,objectName:e.objectName,mode:e.mode,objectSchema:f})??n},[f,e.readOnly,e.mode,e.recordId,e.objectName,e.customFields,a,l]),N=(0,t.useCallback)(async t=>{if(m.uploading){o.toast.error(m.reason);return}if(!n&&!e.submitHandler&&qe(e))return e.onSuccess&&await e.onSuccess(t),t;try{let r,{writePayload:i}=ve(t,e,{objectSchema:f,canEdit:re(l,e.objectName),snapshot:O.current});if(e.submitHandler)r=await e.submitHandler(i);else if(!n)throw Ye();else if(e.mode===`create`)r=await n.create(e.objectName,i);else if(e.mode===`edit`&&e.recordId){let t=await _({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:i,baseRecord:h});if(t.status===`cancelled`)return;r=t.result}return O.current=_e(O.current,e,i),j(),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n,f,l,_,h,m.uploading,m.reason,j]),P=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),I=(e,t)=>e.name||e.label||`tab-${t}`;if(T)return(0,d.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,d.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:s(`form.errorLoading`)}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:T.message})]});if(b)return(0,d.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,d.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,d.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:s(`publicForm.loading`)})]});let L=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,R=e.sections.map(e=>L(e.columns)).filter(e=>e!=null),z=L(e.columns)??(R.length?Math.max(...R):1),B=Me(z),V=e.sections.map((e,t)=>{let n=M(e);return{key:I(e,t),label:e.label||`Tab ${t+1}`,description:e.description,containerClass:e.gridClassName,visibleWhen:e.visibleWhen,fields:z>1?De(n,z,L(e.columns)):n}}),H=[...V.length>1?[]:V.filter(e=>e.visibleWhen!=null).map(e=>({name:`__section_gate_${e.key}`,type:`section-divider`,visibleWhen:e.visibleWhen,fields:e.fields.map(e=>e.name),colSpan:4})),...V.flatMap(e=>e.fields)],U={type:`form`,objectName:e.objectName,fields:H,columns:z,...B?{fieldContainerClass:B}:{},layout:`vertical`,defaultValues:h,previousValues:e.mode===`edit`&&e.recordId?h:void 0,submitLabel:m.uploading?m.busyLabel:e.submitText||(e.mode===`create`?s(`form.create`):s(`form.update`)),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,onSubmit:N,onCancel:P,onDirtyChange:A,fieldTabs:V.map(e=>({key:e.key,label:e.label,description:e.description,fields:e.fields.map(e=>e.name),containerClass:e.containerClass,visibleWhen:e.visibleWhen})),defaultFieldTab:E,fieldTabsPosition:e.tabPosition||`top`};return(0,d.jsx)(Qe,{gate:m,children:(0,d.jsxs)(`div`,{className:(0,o.cn)(`w-full @container`,i,e.className),children:[(0,d.jsx)(Z,{affordance:ae({perms:l,objectName:e.objectName,mode:e.mode,objectSchema:f}),objectName:e.objectName,objectSchema:f}),(0,d.jsx)(r.SchemaRenderer,{schema:U}),(0,d.jsx)($e,{gate:m}),v]})})},rt=({label:e,description:n,collapsible:r=!1,collapsed:i=!1,columns:a=1,children:s,className:c,gridClassName:l,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,d.jsxs)(`div`,{className:(0,o.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,d.jsx)(`span`,{className:`mt-0.5 text-muted-foreground`,children:p?(0,d.jsx)(u.ChevronRight,{className:`h-4 w-4`}):(0,d.jsx)(u.ChevronDown,{className:`h-4 w-4`})}),(0,d.jsxs)(`div`,{className:`flex-1`,children:[e&&(0,d.jsx)(`h3`,{className:`text-sm font-semibold text-foreground`,children:e}),n&&(0,d.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:n})]})]}):null,y=p?null:(0,d.jsx)(`div`,{className:(0,o.cn)(`grid gap-4`,l||h[a]),children:s});return _?(0,d.jsxs)(o.Card,{className:(0,o.cn)(`form-section bg-muted/40 shadow-none`,c),children:[v&&(0,d.jsx)(o.CardHeader,{className:`border-b border-border pb-3`,children:v}),y&&(0,d.jsx)(o.CardContent,{className:`pt-4`,children:y})]}):(0,d.jsxs)(`div`,{className:(0,o.cn)(`form-section`,c),children:[v,y]})},it=e=>e==null||e===``||Array.isArray(e)&&e.length===0,at=(e,t)=>Object.keys(e).some(n=>{let r=e[n],i=t[n];if(it(r)&&it(i))return!1;try{return JSON.stringify(r)!==JSON.stringify(i)}catch{return r!==i}}),ot=(0,i.createSafeTranslation)({"wizard.missingRequired":`Please complete the required fields: {{fields}}`,"common.cancel":`Cancel`,"wizard.back":`Back`,"common.next":`Next`,"wizard.submitting":`Submitting…`,"form.create":`Create`,"form.update":`Update`,"form.stepOf":`Step {{current}} of {{total}}`,"wizard.stepFallback":`Step {{n}}`,"wizard.progressLabel":`Progress`,"wizard.emptyStep":`No fields configured for this step`,"form.created":`Created`,"form.saved":`Saved`,"form.navigateRefused":"The `navigateOnSuccess` destination declared for this form was refused, so the navigation did not happen.","publicForm.thankYouTitle":`Thank you!`,"publicForm.loading":`Loading form…`,"form.errorLoading":`Error loading form`,"form.visibleWhenFaulted":`Can't submit: the visibleWhen rule of {{fields}} could not be evaluated. The rule must be fixed before this form can be submitted.`,"validation.formInvalidJoiner":`, `},`wizard.missingRequired`),st=n.isMissingForRequired,ct=({schema:e,dataSource:i,className:a})=>{let{fieldLabel:s}=(0,r.useSafeFieldLabel)(),l=(0,c.usePermissions)(),{userId:f}=l,{t:p}=ot(),m=Ze(),[h,g]=(0,t.useState)(null),[_,v]=(0,t.useState)({}),[b,x]=(0,t.useState)(void 0),S=t.default.useRef(null),{saveWithOcc:w,conflictDialog:T}=Ve(),[k,A]=(0,t.useState)(!0),[M,N]=(0,t.useState)(He),P=t.default.useRef({schema:0,record:0}),I=We(M),[L,R]=(0,t.useState)(0),[z,B]=(0,t.useState)(new Set),[V,H]=(0,t.useState)(!1),[U,W]=(0,t.useState)(new Set),[G,K]=(0,t.useState)(null),[ee,q]=(0,t.useState)(null);O(ee);let J=t.default.useId(),[ie,Y]=(0,t.useState)(0),X=t.default.useRef(!1),se=t.default.useRef(void 0),{refetch:ce,onDirtyChange:le,saved:ue}=y(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`),de=t.default.useRef(!1),fe=t.default.useRef(!1),pe=(0,t.useCallback)(()=>{le(de.current||fe.current)},[le]),me=(0,t.useCallback)(e=>{de.current=e,pe()},[pe]),Q=e.sections.length,ge=L===0,ye=L===Q-1;t.default.useEffect(()=>{let t=!1,n=Ue(P,N,`schema`);return(async()=>{if(!i){A(!1);return}try{let r=await i.getObjectSchema(e.objectName);if(t)return;g(r),n.commit()}catch(e){if(t)return;n.fail(e)}})(),()=>{t=!0}},[e.objectName,i]),t.default.useEffect(()=>{let t=!1,n=Ue(P,N,`record`);return(h||!i)&&(async()=>{if(e.mode===`create`||!e.recordId||!i){S.current=null,X.current||=(v(F(h,ne(e),{currentUserId:f})),!0),n.commit(),A(!1);return}se.current!==e.recordId&&A(!0);try{let r=await i.findOne(e.objectName,e.recordId);if(t)return;se.current=e.recordId,S.current=he(e,r),v(r||{}),x(r||{}),fe.current=!1,n.commit()}catch(e){if(t)return;n.fail(e)}finally{t||A(!1)}})(),()=>{t=!0}},[h,e.mode,e.recordId,e.initialData,e.initialValues,i,e.objectName,ce]);let be=(0,t.useCallback)(t=>{let n=te(t,{objectSchema:h,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:s,customFields:e.customFields});return oe(n,{perms:l,objectName:e.objectName,mode:e.mode,objectSchema:h})??n},[h,e.readOnly,e.mode,e.recordId,e.objectName,e.customFields,s,l]),xe=ae({perms:l,objectName:e.objectName,mode:e.mode,objectSchema:h}),Se=j(e),Ce=(0,r.usePredicateScope)(),we=(0,t.useMemo)(()=>L>=0&&L<Q?be(e.sections[L]):[],[L,Q,e.sections,be]),Te=(0,t.useCallback)(t=>{let r=new Map,i=new Map;return e.sections.forEach((e,a)=>{for(let o of be(e)){let e=o?.name;if(!e||o.hidden===!0)continue;let s=(0,n.resolveFieldRuleState)({visibleWhen:o.visibleWhen,readonlyWhen:o.readonlyWhen,requiredWhen:o.requiredWhen},t,{required:!!o.required,readonly:o.readonly===!0,serverOwnedValue:(0,n.isServerOwnedValue)(o,Se)},void 0,Ce,`field '${e}'`);s.faults.visibleWhen!==void 0&&o.type!==`section-divider`&&i.set(a,[...i.get(a)??[],o.label||e]),(o.visibleOn==null||(0,n.evalFieldPredicate)(o.visibleOn,t,!0,void 0,Ce,{context:`visibleOn of field '${e}'`}))&&s.visible&&!s.readonly&&s.required&&st(t[e])&&r.set(a,[...r.get(a)??[],o.label||e])}}),{missing:r,faultedVisibleWhen:i}},[e.sections,be,Se,Ce]),Ee=(0,t.useCallback)(async t=>{if(xe)return;let n={..._,...t};if(v(n),at(t,_)&&(fe.current=!0,pe()),B(e=>new Set(e).add(L)),W(e=>{if(!e.has(L))return e;let t=new Set(e);return t.delete(L),t}),ye){if(m.uploading){o.toast.error(m.reason);return}let{missing:t,faultedVisibleWhen:r}=Te(n);if(r.size>0){W(new Set(r.keys())),o.toast.error(p(`form.visibleWhenFaulted`,{fields:[...r.values()].flat().join(p(`validation.formInvalidJoiner`))})),$(Math.min(...r.keys()));return}if(t.size>0){W(new Set(t.keys()));let e=[...t.values()].flat();o.toast.error(p(`wizard.missingRequired`,{fields:e.slice(0,3).join(`, `)+(e.length>3?`…`:``)})),$(Math.min(...t.keys()));return}W(new Set),H(!0);try{if(!i&&!e.submitHandler&&qe(e))return e.onSuccess&&await e.onSuccess(n),n;let t,{writePayload:r}=ve(n,e,{objectSchema:h,canEdit:re(l,e.objectName),snapshot:S.current});if(e.submitHandler)t=await e.submitHandler(r);else if(!i)throw Ye();else if(e.mode===`create`)t=await i.create(e.objectName,r);else if(e.mode===`edit`&&e.recordId){let n=await w({dataSource:i,objectName:e.objectName,recordId:e.recordId,payload:r,baseRecord:_});if(n.status===`cancelled`)return;t=n.result}if(S.current=_e(S.current,e,r),fe.current=!1,ue(),e.onSuccess)await e.onSuccess(t);else if(!e.submitHandler&&e.submitBehavior){let r=e.submitBehavior;switch(r.kind){case`redirect`:{let i=D(r.url,E(n,t));if(!i.ok){o.toast.error(i.refusal),K({message:e.successMessage||(e.mode===`create`?p(`form.created`):p(`form.saved`)),refusal:i.refusal});break}q({url:i.url,delayMs:r.delayMs??0});break}case`continue`:v(F(h,ne(e),{currentUserId:f})),B(new Set),R(0),Y(e=>e+1);break;default:{let t=r.kind===`thank-you`&&r.message?r.message:e.successMessage||(e.mode===`create`?p(`form.created`):p(`form.saved`));o.toast.success(t),K({title:r.kind===`thank-you`?r.title:void 0,message:t});break}}}else if(!e.submitHandler){let n=C(e.navigateOnSuccess,t);if(n)return q({url:n,delayMs:0}),t;e.navigateOnSuccess?(console.warn("[WizardForm] `navigateOnSuccess` was declared but produced no destination:",e.navigateOnSuccess),o.toast.success(e.successMessage||(e.mode===`create`?p(`form.created`):p(`form.saved`)),{description:p(`form.navigateRefused`)})):o.toast.success(e.successMessage||(e.mode===`create`?p(`form.created`):p(`form.saved`))),e.resetOnSuccess&&e.mode===`create`&&(v(F(h,ne(e),{currentUserId:f})),B(new Set),R(0),Y(e=>e+1))}return t}catch(t){throw e.onError&&e.onError(t),t}finally{H(!1)}}$(L+1)},[xe,_,L,ye,e,h,i,l,Te,p,w,m.uploading,m.reason,pe,ue]),$=(0,t.useCallback)(t=>{t>=0&&t<Q&&(R(t),e.onStepChange&&e.onStepChange(t))},[Q,e]),Oe=(0,t.useCallback)(()=>{$(L-1)},[L,$]),ke=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),Ae=(0,t.useCallback)(t=>t<=L||!xe&&(!!e.allowSkip||z.has(t)),[L,xe,e.allowSkip,z]),je=(0,t.useCallback)(e=>{Ae(e)&&$(e)},[Ae,$]);if(I)return(0,d.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,d.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:p(`form.errorLoading`)}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:I.message})]});if(k)return(0,d.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,d.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,d.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:p(`publicForm.loading`)})]});if(G)return(0,d.jsxs)(`div`,{className:(0,o.cn)(`w-full space-y-4`,a,e.className),children:[(0,d.jsxs)(`div`,{className:`rounded-md border bg-card p-8 text-center`,children:[(0,d.jsx)(`h3`,{className:`text-lg font-semibold`,children:G.title??p(`publicForm.thankYouTitle`)}),G.message&&(0,d.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:G.message})]}),G.refusal&&(0,d.jsx)(`div`,{role:`alert`,className:`rounded-md border border-destructive/40 bg-destructive/10 p-4 text-sm text-destructive`,children:G.refusal})]});let Ne=e.sections[L],Pe=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,Fe=Pe(e.columns)??Pe(Ne?.columns)??1,Ie=Me(Fe),Le={type:`form`,objectName:e.objectName,id:J,fields:Fe>1?De(we,Fe,Pe(Ne?.columns)):we,columns:Fe,...Ie?{fieldContainerClass:Ie}:{},layout:`vertical`,defaultValues:_,previousValues:e.mode===`edit`?b:void 0,showSubmit:!1,showCancel:!1,onSubmit:Ee,onDirtyChange:me};return(0,d.jsx)(Qe,{gate:m,children:(0,d.jsxs)(`div`,{className:(0,o.cn)(`w-full @container`,a,e.className),children:[e.showStepIndicator!==!1&&(0,d.jsx)(`nav`,{"aria-label":p(`wizard.progressLabel`),className:`mb-8`,children:(0,d.jsx)(`ol`,{className:`flex items-center`,children:e.sections.map((e,t)=>{let n=t===L,r=z.has(t),i=Ae(t),a=U.has(t);return(0,d.jsxs)(`li`,{className:(0,o.cn)(`relative flex-1`,t!==Q-1&&`pr-8 sm:pr-12`),children:[t!==Q-1&&(0,d.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,d.jsx)(`div`,{className:(0,o.cn)(`h-full`,r?`bg-primary`:`bg-muted`)})}),(0,d.jsxs)(`button`,{type:`button`,className:(0,o.cn)(`group relative flex items-center`,i?`cursor-pointer`:`cursor-not-allowed`),onClick:()=>je(t),disabled:!i,"data-testid":`wizard-step:${e.name||t}`,"data-error":a||void 0,children:[(0,d.jsx)(`span`,{className:(0,o.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`,a&&`border-2 border-destructive bg-background text-destructive`,!a&&r&&`bg-primary text-primary-foreground`,!a&&n&&!r&&`border-2 border-primary bg-background text-primary`,!a&&!n&&!r&&`border-2 border-muted bg-background text-muted-foreground`),children:a?(0,d.jsx)(u.AlertCircle,{className:`h-3 w-3 sm:h-4 sm:w-4`,"aria-hidden":!0}):r?(0,d.jsx)(u.Check,{className:`h-3 w-3 sm:h-4 sm:w-4`}):t+1}),(0,d.jsx)(`span`,{className:`ml-2 sm:ml-3 text-xs sm:text-sm font-medium hidden sm:block`,children:(0,d.jsx)(`span`,{className:(0,o.cn)(a?`text-destructive`:n?`text-foreground`:`text-muted-foreground`),children:e.label||p(`wizard.stepFallback`,{n:t+1})})})]})]},t)})})}),(0,d.jsx)(Z,{affordance:xe,objectName:e.objectName,objectSchema:h}),(0,d.jsx)(`div`,{className:`min-h-[200px]`,children:Ne&&(0,d.jsx)(rt,{label:Ne.label,description:Ne.description,columns:1,className:Ne.className,gridClassName:Ne.gridClassName,children:we.length>0?(0,d.jsx)(r.SchemaRenderer,{schema:Le},ie):(0,d.jsx)(`form`,{id:J,onSubmit:e=>{e.preventDefault(),Ee({})},children:(0,d.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:p(`wizard.emptyStep`)})})})}),(0,d.jsxs)(`div`,{className:`flex items-center justify-between mt-6 pt-4 border-t`,children:[(0,d.jsx)(`div`,{children:e.showCancel!==!1&&(0,d.jsx)(o.Button,{variant:`ghost`,onClick:ke,children:e.cancelText||p(`common.cancel`)})}),(0,d.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,d.jsx)(`span`,{className:`text-sm text-muted-foreground mr-2`,children:p(`form.stepOf`,{current:L+1,total:Q})}),!ge&&(0,d.jsxs)(o.Button,{variant:`outline`,onClick:Oe,children:[(0,d.jsx)(u.ChevronLeft,{className:`h-4 w-4 mr-1`}),e.prevText||p(`wizard.back`)]}),ye?(0,d.jsxs)(o.Button,{type:`submit`,form:J,disabled:V||e.mode===`view`||m.uploading||!!xe,children:[V&&(0,d.jsx)(u.Loader2,{className:`mr-2 h-4 w-4 animate-spin`,"aria-hidden":!0}),m.uploading?m.busyLabel:V?p(`wizard.submitting`):e.submitText||(e.mode===`create`?p(`form.create`):p(`form.update`))]}):(0,d.jsxs)(o.Button,{type:`submit`,form:J,disabled:!!xe,children:[e.nextText||p(`common.next`),(0,d.jsx)(u.ChevronRight,{className:`h-4 w-4 ml-1`})]})]})]}),(0,d.jsx)($e,{gate:m}),T]})})},lt=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:a}=(0,r.useSafeFieldLabel)(),{t:s}=tt(),l=(0,c.usePermissions)(),{userId:u}=l,f=Ze(),[p,m]=(0,t.useState)(null),[h,g]=(0,t.useState)({}),{saveWithOcc:_,conflictDialog:v}=Ve(),[b,x]=(0,t.useState)(!0),[S,C]=(0,t.useState)(He),w=(0,t.useRef)({schema:0,record:0}),T=We(S);(0,t.useEffect)(()=>{let t=!1,r=Ue(w,C,`schema`);return(async()=>{if(!n){x(!1);return}try{let i=await n.getObjectSchema(e.objectName);if(t)return;m(i),r.commit()}catch(e){if(t)return;r.fail(e),x(!1)}})(),()=>{t=!0}},[e.objectName,n]);let E=(0,t.useRef)(void 0),D=(0,t.useRef)(null),{refetch:O,onDirtyChange:k,saved:A}=y(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`);(0,t.useEffect)(()=>{let t=!1,r=Ue(w,C,`record`);return(p||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){D.current=null,g(F(p,ne(e),{currentUserId:u})),r.commit(),x(!1);return}if(!n){D.current=null,g(ne(e)),r.commit(),x(!1);return}E.current!==e.recordId&&x(!0);try{let i=await n.findOne(e.objectName,e.recordId);if(t)return;E.current=e.recordId,D.current=he(e,i),g(i||{}),r.commit()}catch(e){if(t)return;r.fail(e)}finally{t||x(!1)}})(),()=>{t=!0}},[p,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName,O]);let j=(0,t.useCallback)(t=>{let n=te(t,{objectSchema:p,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:a,customFields:e.customFields});return oe(n,{perms:l,objectName:e.objectName,mode:e.mode,objectSchema:p})??n},[p,e.readOnly,e.mode,e.recordId,e.objectName,e.customFields,a,l]),M=(0,t.useCallback)(async t=>{if(f.uploading){o.toast.error(f.reason);return}if(!n&&!e.submitHandler&&qe(e))return e.onSuccess&&await e.onSuccess(t),t;try{let r,{writePayload:i}=ve(t,e,{objectSchema:p,canEdit:re(l,e.objectName),snapshot:D.current});if(e.submitHandler)r=await e.submitHandler(i);else if(!n)throw Ye();else if(e.mode===`create`)r=await n.create(e.objectName,i);else if(e.mode===`edit`&&e.recordId){let t=await _({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:i,baseRecord:h});if(t.status===`cancelled`)return;r=t.result}return D.current=_e(D.current,e,i),A(),e.onSuccess&&await e.onSuccess(r),r}catch(t){throw e.onError&&e.onError(t),t}},[e,n,p,l,_,h,f.uploading,f.reason,A]),N=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),P=(e,t)=>e.pane===`primary`||e.pane===`secondary`?e.pane:t===0?`primary`:`secondary`,I=(0,t.useMemo)(()=>e.sections.filter((e,t)=>P(e,t)===`primary`),[e.sections]),L=(0,t.useMemo)(()=>e.sections.filter((e,t)=>P(e,t)===`secondary`),[e.sections]),R=e.splitDirection||`horizontal`,z=e.splitSize||50;if(T)return(0,d.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,d.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:s(`form.errorLoading`)}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:T.message})]});if(b)return(0,d.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,d.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,d.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:s(`publicForm.loading`)})]});let B=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,V=e.sections.map(e=>B(e.columns)).filter(e=>e!=null),H=B(e.columns)??(V.length?Math.max(...V):1),U=Me(H),W=(e,t)=>{let n=[];return e.forEach((e,r)=>{let i=j(e);i.length&&((e.label||e.description)&&n.push({name:`__section_${e.name||`${t}_${r}`}`,label:e.label,description:e.description,type:`section-divider`,visibleWhen:e.visibleWhen,fields:i.map(e=>e.name),colSpan:4,className:e.className}),n.push(...H>1?De(i,H,B(e.columns)):i))}),n},G=[{key:`primary`,sections:I,defaultSize:z},{key:`secondary`,sections:L,defaultSize:100-z}].map(e=>({...e,fields:W(e.sections,e.key),containerClass:e.sections.length===1?e.sections[0].gridClassName:void 0})).filter(e=>e.fields.length>0),K={type:`form`,objectName:e.objectName,fields:G.flatMap(e=>e.fields),columns:H,...U?{fieldContainerClass:U}:{},layout:`vertical`,defaultValues:h,previousValues:e.mode===`edit`&&e.recordId?h:void 0,submitLabel:f.uploading?f.busyLabel:e.submitText||(e.mode===`create`?s(`form.create`):s(`form.update`)),cancelLabel:e.cancelText,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,onSubmit:M,onCancel:N,onDirtyChange:k,fieldPanes:G.map(e=>({key:e.key,fields:e.fields.map(e=>e.name),defaultSize:e.defaultSize,...e.containerClass?{containerClass:e.containerClass}:{}})),fieldPanesOrientation:R,fieldPanesResizable:e.splitResizable!==!1};return(0,d.jsx)(Qe,{gate:f,children:(0,d.jsxs)(`div`,{className:(0,o.cn)(`w-full @container`,i,e.className),children:[(0,d.jsx)(Z,{affordance:ae({perms:l,objectName:e.objectName,mode:e.mode,objectSchema:p}),objectName:e.objectName,objectSchema:p}),(0,d.jsx)(r.SchemaRenderer,{schema:K}),(0,d.jsx)($e,{gate:f}),v]})})},ut=e=>e==null?void 0:e.id??e._id??e.recordId,dt=(e,t)=>t?fe(e,t):e,ft=e=>fe(e,null),pt=new Set([`id`,`_id`,`recordId`]);function mt(e,t){return!e||Object.entries(e).every(([e,n])=>e===t||pt.has(e)?!0:n==null||n===``)}function ht(e,t,n){let r=[{object:e,action:`create`,data:ft(t)}];for(let e of n)for(let t of e.rows)mt(t,e.relationshipField)||r.push({object:e.childObject,action:`create`,data:{...dt(t,e.childSchema),[e.relationshipField]:{$ref:0}}});return r}function gt(e,t,n,r){let i=[{object:e,action:`update`,id:t,data:ft(n)}];for(let e of r){let n=(e.rows||[]).map(n=>({...n,[e.relationshipField]:t})),{toCreate:r,toUpdate:a,toDelete:o}=_t(e.original||[],n);for(let t of r){if(mt(t,e.relationshipField))continue;let{id:n,_id:r,recordId:a,...o}=t;i.push({object:e.childObject,action:`create`,data:dt(o,e.childSchema)})}let s=new Map;for(let t of e.original||[]){let e=ut(t);e&&s.set(e,t)}for(let t of a){let n=ut(t),r=s.get(n),a=dt(t,e.childSchema),o=r?me(a,r):a;r&&Object.keys(o).length===0||i.push({object:e.childObject,action:`update`,id:n,data:o})}for(let t of o)i.push({object:e.childObject,action:`delete`,id:t})}return i}function _t(e,t){let n=new Set(t.map(ut).filter(Boolean));return{toCreate:t.filter(e=>!ut(e)),toUpdate:t.filter(e=>ut(e)),toDelete:(e||[]).map(ut).filter(e=>!!e&&!n.has(e))}}function vt(e,t){return Array.isArray(e)?e.reduce((e,n)=>{let r=Number(n?.[t]);return e+(Number.isFinite(r)?r:0)},0):0}var yt=new Set([`id`,`_id`,`recordId`,`created_at`,`updated_at`,`created_by`,`updated_by`,`createdAt`,`updatedAt`,`createdBy`,`updatedBy`,`organization_id`,`tenant_id`,`space`,`owner`]),bt=new Set([`position`,`sort_order`,`sequence`,`line_no`,`line_number`,`sort`]),xt=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`,`json`,`object`,`grid`,`table`,`location`,`vector`,`html`,`markdown`,`richtext`]);function St(e){switch(e){case`number`:case`percent`:case`rating`:case`slider`:return`number`;case`currency`:return`currency`;case`date`:return`date`;case`datetime`:return`datetime`;case`time`:return`time`;case`select`:case`picklist`:case`radio`:case`boolean`:case`toggle`:return`select`;case`lookup`:case`master_detail`:return`lookup`;case`file`:case`image`:case`avatar`:return`file`;default:return`text`}}var Ct=new Set([`image`,`avatar`]);function wt(e,t){e.multiple==null&&t?.multiple&&(e.multiple=!0),e.accept??(Array.isArray(t?.accept)&&t.accept.length>0?e.accept=t.accept:Ct.has(t?.type)&&(e.accept=[`image/*`]))}function Tt(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 Et(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 Dt=[`name`,`title`,`subject`,`label`,`full_name`,`display_name`,`code`],Ot={select:0,currency:1,number:1,lookup:2,date:3,datetime:3,time:3,text:4};function kt(e){return(e.type?Ot[e.type]:void 0)??5}function At(e,t){if(t<=0||e.length<=t)return e;let n=new Set,r=e.find(e=>Dt.includes(e.name))??e[0];r&&n.add(r.name);for(let t of e)t.required&&n.add(t.name);let i=e.map((e,t)=>({c:e,i:t})).filter(({c:e})=>!n.has(e.name)).sort((e,t)=>kt(e.c)-kt(t.c)||e.i-t.i);for(let{c:e}of i){if(n.size>=t)break;n.add(e.name)}return e.map(e=>n.has(e.name)?e:{...e,defaultHidden:!0})}function jt(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(yt.has(e)||r.has(e)||bt.has(e)||n?.system||n?.readonly||n?.hidden||xt.has(n?.type))continue;let a={name:e,label:n?.label||e,type:St(n?.type),required:!!n?.required},o=Tt(n);a.type===`select`&&o&&(a.options=o),a.type===`lookup`&&(a.reference=n?.reference,a.displayField=n?.displayField||n?.reference_field),a.type===`file`&&wt(a,n),n?.readonlyWhen&&(a.readonlyWhen=n.readonlyWhen),n?.requiredWhen&&(a.requiredWhen=n.requiredWhen);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 At(i,t.maxColumns??6)}var Mt=new Set;function Nt(e,t,n){if(e.scale===void 0)return;let r=t?` of '${t}'`:``,i=`${t??``}:${e.name}:${n?`hydrated`:`declared`}:${String(e.scale)}`;if(Mt.has(i))return;Mt.add(i);let a=n?`takes type 'currency' from child field '${e.name}'${r}`:`declares type 'currency'${r}`;console.warn(`[object-ui] \`scale\` is not valid on a \`currency\` inline grid column — delete the key. Inline grid column '${e.name}' ${a}, so its \`scale: ${String(e.scale)}\` is not read: the currency's ISO 4217 minor unit (2 for USD, 0 for JPY, 3 for KWD) decides how the cell displays the amount and the width a computed amount is rounded to.`)}function Pt(e,t){let n=e??[],r=t?.fields;return!n.length||!r||typeof r!=`object`?n:n.map(e=>{if(e.type)return e.type===`currency`&&Nt(e,t?.name,!1),e;let n=r[e.name];if(!n)return e;let i=St(n?.type);i===`currency`&&Nt(e,t?.name,!0);let a={...e,type:i};a.label??=n?.label||e.name,a.required??=!!n?.required;let o=Tt(n);i===`select`&&o&&!a.options&&(a.options=o),i===`lookup`&&(a.reference??=n?.reference,a.displayField??=n?.displayField||n?.reference_field),i===`file`&&wt(a,n),a.readonlyWhen==null&&n?.readonlyWhen&&(a.readonlyWhen=n.readonlyWhen),a.requiredWhen==null&&n?.requiredWhen&&(a.requiredWhen=n.requiredWhen);let s=typeof n?.expression==`string`?n.expression:n?.expression?.source;return!a.computed&&s&&typeof s==`string`&&(a.computed=!0,a.expr=s,a.required=!1,typeof n?.scale==`number`&&(a.scale=n.scale)),a})}var Ft=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`]);function It(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;yt.has(e)||r.has(e)||bt.has(e)||n?.system||n?.hidden||Ft.has(n?.type)||i.push(e)}return i}var Lt=new Set([`textarea`,`richtext`,`html`,`markdown`,`rich-text`,`json`,`location`,`address`]),Rt=new Set([`file`,`image`,`avatar`]);function zt(e,t,n={}){if(t===`grid`||t===`form`)return t;let r=e?.fields??{},i=It(e,{relationshipField:n.relationshipField});return i.some(e=>Lt.has(r[e]?.type))||i.filter(e=>Rt.has(r[e]?.type)).length>=2||i.length>8?`form`:`grid`}var Bt=[`amount`,`total`,`subtotal`,`line_total`,`line_amount`,`net_amount`];function Vt(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.name;let r=t.find(e=>Bt.includes(e.name));if(r)return r.name;let i=[...t].reverse().find(e=>e.type===`currency`);return i?i.name:t[t.length-1].name}function Ht(e,t,n,r={}){let i=r.relationshipField||Et(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?Pt(r.columns,t):jt(t,{relationshipField:i}),o=r.amountField||Vt(a);return{childObject:e,relationshipField:i,columns:a,formFields:It(t,{relationshipField:i}),mode:zt(t,r.inlineEdit??(t?.fields)?.[i]?.inlineEdit,{relationshipField:i}),amountField:o,sortField:Object.keys(t?.fields??{}).find(e=>bt.has(e))}}function Ut(e,t,n){return Object.entries(e??{}).every(([e,r])=>e===n||pe(r,t[e]))}function Wt(e,t,n){let r=Array.isArray(t)?t:[],i=[];e.forEach((e,t)=>{t>0&&e.action===`create`&&i.push({op:e,echo:r[t]})});let a=0,o=!1,s=n.map(({entryId:t,input:n})=>{let{childObject:r,relationshipField:s}=n,c=n.rows||[],l=n.original||[],u=new Map,d=new Map;for(let e of c){if(o)break;if(ut(e)!=null||mt(e,s))continue;let t=i[a];if(!t||t.op.object!==r||!Ut(t.op.data,e,s)){o=!0;break}a+=1;let n=ut(t.echo);n!=null&&(u.set(e,n),d.set(n,t.op.data??{}))}for(let t=1;t<e.length;t++){let n=e[t];n.action===`update`&&n.object===r&&n.id!=null&&d.set(n.id,n.data??{})}let f=new Map;for(let e of l){let t=ut(e);t!=null&&f.set(t,e)}let p=[];for(let e of c){let t=ut(e)??u.get(e);if(t==null)continue;let n=f.get(t),r=d.get(t);if(!n&&!r)continue;let i={...n??{},...r??{}};ut(i)??(i.id=t),p.push(i)}return{entryId:t,diffedAgainst:n.original,createdIds:u,original:p}});return(o||a!==i.length)&&console.warn(`[MasterDetailForm] could not pair every row created by this save with its create operation; an unpaired row keeps no id, and the next save creates it again.`),s}function Gt(e,t){if(!t)return;let n=e?.fields?.[t];return n&&typeof n==`object`?n:void 0}function Kt(e,t){let n=new Set(e.filter(e=>!!e.config.amountField).map(e=>(0,i.resolveFieldCurrency)(e.amountFieldDef,t)));return n.size===1?n.values().next().value:void 0}var qt=2;function Jt(e,t,n){let r=()=>(0,i.formatDisplayNumber)(e,{locale:n,minimumFractionDigits:qt,maximumFractionDigits:qt});if(!t)return r();try{return(0,i.formatDisplayNumber)(e,{locale:n,currency:t})}catch{return`${t} ${r()}`}}function Yt(e){let t=new Map;return e.map((e,n)=>{let r=e.childObject?`obj:${e.childObject}`:`pos:${n}`,i=t.get(r)??0;return t.set(r,i+1),i===0?r:`${r}~${i}`})}function Xt(e){let n=JSON.stringify(Array.from(new Set(e)).sort()),[i,a]=(0,t.useState)({});return(0,t.useEffect)(()=>{let e=JSON.parse(n);if(e.length===0)return;let t=(0,r.subscribeDataChanges)(t=>{let n=e.filter(e=>(0,r.dataChangeMatches)(t,e));n.length!==0&&a(e=>{let t={...e};for(let e of n)t[e]=(t[e]??0)+1;return t})});return()=>{t()}},[n]),i}function Zt(e,t,n,r){if(!e||!t.relationshipField)return!1;let i=t.relationshipField;return gt(``,n,{},[{childObject:t.childObject,relationshipField:i,rows:e.rows,original:e.original.map(e=>({...e,[i]:n})),childSchema:r}]).length>1}function Qt(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}function $t(e,t){let n=Object.keys(t),r=RegExp(`(${n.map(e=>`\\{\\{${e}\\}\\}`).join(`|`)})`);return e.split(r).map((e,r)=>{let i=n.find(t=>e===`{{${t}}}`);return i===void 0?e:(0,d.jsx)(`code`,{className:`font-mono`,children:t[i]},r)})}var en=({entries:e,rowState:n,setRows:r,saving:o,formHostRef:s,taxRateField:l,formKey:u,onRowExpand:f,onAddViaForm:p,parentObjectName:m})=>{let h=(0,i.useDisplayLocale)(),{currency:g}=(0,i.useLocalization)(),{t:_}=tt(),v=(0,c.usePermissions)(),[y,b]=(0,t.useState)({}),x=(0,t.useRef)(``);(0,t.useEffect)(()=>{let e=s.current;if(!e)return;let t=()=>{let t=Qt(e),n;try{n=JSON.stringify(t)}catch{n=String(Math.random())}n!==x.current&&(x.current=n,b(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)}},[s,u,e.length]);let S=y[l],C=S===void 0?null:Number.isFinite(Number(S))?Number(S):0,w=e.reduce((e,t)=>e+vt(n[t.id]?.rows??[],t.config.amountField||`amount`),0),T=C!==null&&e.some(e=>!!e.config.amountField),E=C??0,D=E/100*w,O=w+D,k=Kt(e,g),A=e=>Jt(e,k,h);return(0,d.jsxs)(d.Fragment,{children:[e.map(e=>{let t=e.config;return(0,d.jsxs)(`section`,{className:`space-y-2`,children:[(0,d.jsx)(`h3`,{className:`text-sm font-medium text-foreground`,children:t.title||_(`form.lineItems.title`)}),t.childObject?e.status===`failed`?(0,d.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,role:`status`,"data-testid":`md-detail-schema-unavailable`,children:$t(_(`form.masterDetail.schemaUnavailable`,{object:`{{object}}`}),{object:t.childObject})}):e.status===`underivable`?(0,d.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,"data-testid":`md-detail-no-relationship-field`,children:$t(_(`form.masterDetail.noRelationshipField`,{object:`{{object}}`,parent:`{{parent}}`,property:`{{property}}`}),{object:t.childObject,parent:m,property:`relationshipField`})}):t.columns?.length?(0,d.jsx)(a.LineItemsField,{value:n[e.id]?.rows??[],onChange:t=>r(e.id,t),disabled:o,contextRecord:y,...t.inlineMode===`form`||(t.formFields?.length??0)>(t.columns?.length??0)?{onRowExpand:t=>f(e.id,t)}:{},displayMode:t.inlineMode===`form`?`list`:`grid`,...t.inlineMode===`form`?{onAdd:()=>p(e.id)}:{},field:{columns:ce(t.columns,{perms:v,objectName:t.childObject}),total_field:T?void 0:t.amountField||(t.totalField?`amount`:void 0),sort_field:e.sortField,min_rows:t.minRows,max_rows:t.maxRows,add_label:t.inlineMode===`form`?t.addLabel||_(`detail.add`):t.addLabel}}):(0,d.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,children:_(`form.masterDetail.loadingColumns`)}):(0,d.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,"data-testid":`md-detail-no-child-object`,children:$t(_(`form.masterDetail.noChildObject`,{property:`{{property}}`}),{property:`childObject`})})]},e.id)}),T&&(0,d.jsx)(`div`,{className:`flex justify-end`,children:(0,d.jsxs)(`dl`,{className:`w-64 space-y-1.5 text-sm`,"data-testid":`md-totals`,children:[(0,d.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,d.jsx)(`dt`,{className:`text-muted-foreground`,children:_(`form.masterDetail.subtotal`)}),(0,d.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-subtotal`,children:A(w)})]}),(0,d.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,d.jsx)(`dt`,{className:`text-muted-foreground`,children:_(`form.masterDetail.tax`,{rate:E})}),(0,d.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-tax`,children:A(D)})]}),(0,d.jsxs)(`div`,{className:`flex items-center justify-between border-t border-border pt-1.5 text-base font-semibold`,children:[(0,d.jsx)(`dt`,{children:_(`form.masterDetail.total`)}),(0,d.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-grand-total`,children:A(O)})]})]})})]})},tn=({schema:e,dataSource:r,className:a})=>{let s=e.details||[],c=e.mode===`edit`&&!!e.recordId,{language:l}=(0,i.useObjectTranslation)(),u=(0,i.pickLocalized)(e.title,l),{t:f}=tt(),p=s.some(e=>!e.relationshipField||!e.columns?.length||e.columns.some(e=>!e.type)),m=(0,t.useMemo)(()=>Yt(s),[e.details]),h=(0,t.useMemo)(()=>s.map((e,t)=>({id:m[t],config:e,status:p?`pending`:`ready`})),[e.details,m,p]),[g,_]=(0,t.useState)(null),v=g??h;(0,t.useEffect)(()=>{if(!p){_(h);return}if(!r||typeof r.getObjectSchema!=`function`)return;let t=!1;return(async()=>{let n=await Promise.all(h.map(async t=>{let n=t.config,i=n.columns?.length?n.columns.every(e=>!!e.type):!1;if(n.relationshipField&&i)return{...t,status:`ready`};if(!n.childObject)return console.warn(`[MasterDetailForm] a detail collection has no childObject — refusing to fetch its schema. Set childObject to the child object the collection lists.`),{...t,status:`declined`};let a;try{a=await r.getObjectSchema(n.childObject)}catch(e){return console.warn(`[MasterDetailForm] could not load the schema of child object "${n.childObject}" — its columns cannot be derived, so the collection renders a refusal placeholder instead of a permanent "Loading columns…".`,e),{...t,status:`failed`}}try{let r=Ht(n.childObject,a,e.objectName,{relationshipField:n.relationshipField,columns:n.columns,amountField:n.amountField}),i=n.amountField??r.amountField;return n.relationshipField&&n.columns?.length?{...t,config:{...n,columns:r.columns,amountField:i},status:`ready`,sortField:r.sortField,amountFieldDef:Gt(a,i)}:{...t,status:`ready`,config:{...n,relationshipField:r.relationshipField,columns:r.columns,formFields:n.formFields??r.formFields,inlineMode:n.inlineMode??r.mode,amountField:i},sortField:r.sortField,amountFieldDef:Gt(a,i)}}catch(e){return console.warn(`[MasterDetailForm] loaded the schema of child object "${n.childObject}" but could not derive its detail configuration; the collection cannot render its columns. Set relationshipField (and columns) explicitly on the detail entry.`,e),{...t,status:`underivable`}}}));t||_(n)})(),()=>{t=!0}},[r,e.objectName,e.details]);let[y,b]=(0,t.useState)({}),x=(0,t.useRef)(y);x.current=y;let S=(0,t.useRef)({});(0,t.useEffect)(()=>{let e=r;if(!e||typeof e.getObjectSchema!=`function`)return;let t=!1,n=Array.from(new Set(s.map(e=>e.childObject).filter(Boolean)));return(async()=>{let r=await Promise.all(n.map(async t=>{try{return[t,await e.getObjectSchema(t)]}catch{return[t,null]}}));if(t)return;let i={};for(let[e,t]of r)t&&(i[e]=t);S.current=i})(),()=>{t=!0}},[r,e.objectName,e.details]);let[C,w]=(0,t.useState)(0),[T,E]=(0,t.useState)(!1),D=(0,t.useRef)(!1),O=(0,t.useRef)(null),k=(0,t.useRef)(!1),A=`form-outcome:${t.default.useId()}`,j=(0,t.useCallback)(()=>{O.current&&=(clearTimeout(O.current),null)},[]),M=(0,t.useCallback)(()=>{D.current=!1,E(!1),j()},[j]),N=(0,t.useCallback)(()=>{D.current=!0,E(!0),j()},[j]),[P,F]=(0,t.useState)(null),I=(0,t.useRef)(null);I.current=P?.entryId??null;let L=Xt(c&&r?v.flatMap(e=>e.config.childObject&&e.config.relationshipField?[e.config.childObject]:[]):[]),R=(0,t.useRef)(0),z=(0,t.useRef)({}),B=(0,t.useRef)(new Set),V=(0,t.useRef)(new Set),H=(0,t.useRef)({}),U=String(e.recordId),W=(0,t.useCallback)(e=>I.current===e.id||Zt(x.current[e.id],e.config,U,S.current[e.config.childObject]),[U]),G=(0,t.useCallback)(async function t(n,i){if(i===`bus`){if(W(n)){B.current.add(n.id);return}B.current.delete(n.id)}let a=R.current,o=(z.current[n.id]??0)+1;z.current[n.id]=o;let s=()=>R.current===a&&z.current[n.id]===o,c=n.config;if(!r||!c.relationshipField){b(e=>({...e,[n.id]:{rows:[],original:[]}}));return}let l=i!==`load`,u=x.current[n.id]?.rows,d;try{d=(await r.find(c.childObject,{$filter:{[c.relationshipField]:e.recordId},$top:500}))?.data??[]}catch(e){if(!s())return;if(l){console.warn(`[MasterDetailForm] could not re-read the lines of "${c.childObject}" after a data change; ${u===void 0?`no lines have been read for it yet`:`the lines on screen are kept`}.`,e);return}d=[]}if(s()){if(l&&I.current===n.id){B.current.add(n.id);return}if(l&&x.current[n.id]?.rows!==u){t(n,`bus`);return}b(e=>l&&(e[n.id]?.rows!==u||I.current===n.id)?(B.current.add(n.id),e):{...e,[n.id]:{rows:d.map(e=>({...e})),original:d.map(e=>({...e}))}})}},[r,e.recordId,W]);(0,t.useEffect)(()=>{if(B.current.clear(),V.current.clear(),c&&r)for(let e of v)G(e,`load`);return()=>{R.current+=1}},[c,r,e.recordId,g]),(0,t.useEffect)(()=>{for(let e of v){let t=e.config.childObject;if(!t||!e.config.relationshipField)continue;let n=L[t]??0,r=H.current[e.id];H.current[e.id]=n,r!==void 0&&r!==n&&G(e,`bus`)}},[L,v,G]),(0,t.useEffect)(()=>{if(T)return;let e=B.current;for(let t of v)e.has(t.id)&&I.current!==t.id&&(V.current.has(t.id)||!W(t))&&(e.delete(t.id),G(t,`replay`));V.current.clear()},[y,T,P,v,G,W]);let K=(0,t.useCallback)((e,t)=>{b(n=>({...n,[e]:{rows:t,original:n[e]?.original??[]}}))},[]),ee=e.taxRateField||`tax_rate`,q=P?y[P.entryId]?.rows?.[P.rowIdx]:void 0,J=P?v.find(e=>e.id===P.entryId)?.config:void 0,te=(0,t.useCallback)((e,t,n)=>{b(r=>{let i=r[e]??{rows:[],original:[]};return{...r,[e]:{...i,rows:i.rows.map((e,r)=>r===t?{...e,...n}:e)}}})},[]),ne=(0,t.useCallback)(e=>{b(t=>{let n=t[e]??{rows:[],original:[]},r=[...n.rows,{}];return F({entryId:e,rowIdx:r.length-1,isNew:!0}),{...t,[e]:{...n,rows:r}}})},[]),re=(0,t.useCallback)(()=>{F(e=>(e?.isNew&&b(t=>{let n=t[e.entryId];return n?{...t,[e.entryId]:{...n,rows:n.rows.filter((t,n)=>n!==e.rowIdx)}}:t}),null))},[]),ie=(0,t.useCallback)(async t=>{M(),e.onSuccess||o.toast.success(c?u?f(`form.savedNamed`,{title:u}):f(`form.saved`):f(`form.created`),{id:A}),c||(b({}),w(e=>e+1)),await e.onSuccess?.(t)},[c,e.onSuccess,u,v.length,M,A,f]),Y=(0,t.useCallback)(t=>{k.current||M(),e.onError?.(t)},[e,M]),X=(0,t.useCallback)(async t=>{if(!r)throw Error(`MasterDetailForm: dataSource is required`);let i={...t};v.forEach(e=>{let t=e.config;t.totalField&&(i[t.totalField]=vt(x.current[e.id]?.rows??[],t.amountField||`amount`))});let a=c?v.filter(e=>e.config.relationshipField).map(e=>({entryId:e.id,input:{childObject:e.config.childObject,relationshipField:e.config.relationshipField,rows:x.current[e.id]?.rows??[],original:x.current[e.id]?.original??[],childSchema:S.current[e.config.childObject]}})):null,o=a?gt(e.objectName,String(e.recordId),i,a.map(e=>e.input)):ht(e.objectName,i,v.filter(e=>e.config.relationshipField).map(e=>({childObject:e.config.childObject,relationshipField:e.config.relationshipField,rows:x.current[e.id]?.rows??[],childSchema:S.current[e.config.childObject]}))),s=await(0,n.runBatchTransaction)(r,o);if(a){let e=Wt(o,s?.results,a);for(let t of e)V.current.add(t.entryId);b(t=>{let n=t;for(let r of e){let e=t[r.entryId];if(!e||e.original!==r.diffedAgainst)continue;let i=r.createdIds.size===0?e.rows:e.rows.map(e=>{let t=r.createdIds.get(e);return t===void 0?e:{...e,id:t}});n={...n,[r.entryId]:{rows:i,original:r.original}}}return n})}return s?.results?.[0]??{...i,id:e.recordId}},[r,v,e.objectName,e.recordId,c]),ae=(0,t.useCallback)(async e=>{if(k.current)throw Error(`This save was not sent: another save of this form was still in progress.`);k.current=!0,N();try{return await X(e)}finally{k.current=!1}},[X,N]),oe=(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:u||void 0,showSubmit:!1,showCancel:!1,submitHandler:ae,onSuccess:ie,onError:Y}),[e,u,ae,ie,Y]),se=(0,t.useRef)(null),ce=(0,i.pickLocalized)(e.submitText,l)||f(c?`common.save`:`form.create`),le=(0,i.pickLocalized)(e.cancelText,l)||f(`common.cancel`),Z=Ze(),ue=(0,t.useCallback)(()=>{if(Z.uploading){o.toast.error(Z.reason);return}D.current||se.current?.querySelector(`form`)&&(D.current=!0,E(!0),o.toast.dismiss(A),setTimeout(()=>{(se.current?.querySelector(`form`))?.requestSubmit()},0),O.current=setTimeout(()=>M(),1500))},[M,A,Z.uploading,Z.reason]);return(0,t.useEffect)(()=>()=>{O.current&&clearTimeout(O.current)},[]),(0,d.jsx)(Qe,{gate:Z,children:(0,d.jsxs)(`div`,{className:(0,o.cn)(`space-y-6`,a,e.className),children:[(0,d.jsx)(`div`,{ref:se,children:(0,d.jsx)(jn,{schema:oe,dataSource:r},C)}),(0,d.jsx)(en,{entries:v,rowState:y,setRows:K,saving:T,formHostRef:se,taxRateField:ee,formKey:C,onRowExpand:(e,t)=>F({entryId:e,rowIdx:t}),onAddViaForm:ne,parentObjectName:e.objectName}),P&&J&&(0,d.jsxs)(o.Card,{className:`border-primary/40 shadow-none ring-1 ring-primary/10`,"data-testid":`md-row-form`,children:[(0,d.jsxs)(o.CardHeader,{className:`pb-2 flex flex-row items-center justify-between gap-2 space-y-0`,children:[(0,d.jsx)(o.CardTitle,{className:`text-sm font-medium`,children:f(`form.masterDetail.rowTitle`,{title:J.title||f(`form.masterDetail.lineItem`),row:P.rowIdx+1})}),(0,d.jsx)(o.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs text-muted-foreground`,onClick:re,children:f(`common.close`)})]}),(0,d.jsx)(o.CardContent,{children:(0,d.jsx)(`fieldset`,{disabled:T,className:`min-w-0`,children:(0,d.jsx)(jn,{schema:{type:`object-form`,objectName:J.childObject,mode:`edit`,initialData:q??{},...J.formFields?.length?{fields:J.formFields}:{},submitText:f(`form.masterDetail.applyRow`),submitHandler:async e=>e,onSuccess:e=>{te(P.entryId,P.rowIdx,e),F(null)},onCancel:re},dataSource:r},`row-${P.entryId}-${P.rowIdx}`)})})]}),e.showSubmit!==!1&&(0,d.jsxs)(`div`,{className:`border-t border-border pt-4`,children:[(0,d.jsx)($e,{gate:Z}),(0,d.jsxs)(`div`,{className:`flex items-center justify-end gap-2`,children:[e.onCancel&&(0,d.jsx)(o.Button,{type:`button`,variant:`outline`,onClick:e.onCancel,disabled:T,"data-testid":`md-form-cancel`,children:le}),(0,d.jsx)(o.Button,{type:`button`,onClick:ue,disabled:T||p&&!g||Z.uploading,"data-testid":`md-form-submit`,children:Z.uploading?Z.busyLabel:T?f(`detail.saving`):ce})]})]})]})})};function nn(e){let t=e.fields||Object.keys(e.objectSchema?.fields||{}),n=[];for(let r of t){let t=typeof r==`string`?r:r?.name;if(!t){U(r,e.objectName);continue}n.push(t)}return R(n,e.customFields,t=>{let n=e.objectSchema?.fields?.[t];if(n)return{...K(t,e),group:n.group}})}function rn(e){return e.mode!==`create`&&!!e.recordId&&!!e.dataSource&&e.loadedRecordId!==e.recordId}function an(e,t){let n=(0,l.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},...e.description===void 0?{}:{description:e.description},...e.visibleWhen===void 0?{}:{visibleWhen:e.visibleWhen},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}function on(e,t){return!!e||!!t}function sn(e){return`collapsible section has no heading or description to carry its control: ${e} declares \`collapsible\` / \`collapsed\` but yields neither a \`label\` nor a \`description\`, so no divider row is drawn for it and there is nowhere to put the disclosure control. The section is rendered OPEN and the declaration is ignored. Give it a \`label\` (or a \`description\`), or drop \`collapsible\` / \`collapsed\`.`}var cn=new Set;function ln(e,t){cn.has(t)||(cn.add(t),console.warn(`[object-ui] ${sn(e)}`))}function un(e,t){let n=!!e.collapsible||!!e.collapsed,r=on(t.title,t.description);n&&!r&&ln(t.where,t.where);let i=r&&n,a=i&&(t.live??!!e.collapsed);return{collapsible:i,collapsed:a,onToggle:i?()=>t.setCollapsed(!a):void 0}}var dn=4;function fn(e){let{key:t,title:n,description:r,visibleWhen:i,members:a,className:o,collapse:s}=e;if(!on(n,r))return i==null?[]:[{name:`__section_gate_${t}`,type:`section-divider`,visibleWhen:i,fields:a,colSpan:dn}];let c={name:`__section_${t}`,label:n,type:`section-divider`,description:r,visibleWhen:i,fields:a,colSpan:dn};return o!==void 0&&(c.className=o),s&&(c.collapsible=s.collapsible,c.collapsed=s.collapsed,c.onToggle=s.onToggle),[c]}var pn=(0,i.createSafeTranslation)({"form.discardTitle":`Discard changes?`,"form.discardMessage":`You have unsaved changes. If you close this form now, your edits will be lost.`,"form.dialogDescriptionFallback":`Complete the form fields, then submit or cancel.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`,"form.create":`Create`,"form.update":`Update`,"common.cancel":`Cancel`,"form.errorLoading":`Error loading form`,"publicForm.loading":`Loading form…`},`form.discardTitle`),mn=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:a,sectionLabel:s}=(0,r.useSafeFieldLabel)(),l=(0,c.usePermissions)(),{userId:f}=l,{t:p}=pn(),m=Ze(),h=(0,r.usePreviewMode)(),[g,_]=(0,t.useState)(null),v=(0,t.useCallback)(t=>oe(t,{perms:l,objectName:e.objectName,mode:e.mode,objectSchema:g}),[l,e.objectName,e.mode,g]),[b,x]=(0,t.useState)([]),[S,C]=(0,t.useState)({}),[w,T]=(0,t.useState)(!0),[E,D]=(0,t.useState)(He),O=(0,t.useRef)({schema:0,record:0}),k=We(E),[A,j]=(0,t.useState)(!1),[M,N]=(0,t.useState)(!1),{saveWithOcc:P,conflictDialog:L}=Ve(),[R,z]=(0,t.useState)(!1),B=(0,t.useRef)(!1),V=e.confirmOnDiscard!==!1,H=e.open!==!1,U=e.drawerSide||`right`,W=(0,t.useId)(),[G,K]=(0,t.useState)({});(0,t.useEffect)(()=>{let t=!1,r=Ue(O,D,`schema`);return(async()=>{if(!n){T(!1);return}try{let i=await n.getObjectSchema(e.objectName);if(t)return;_(i),r.commit()}catch(e){if(t)return;r.fail(e),T(!1)}})(),()=>{t=!0}},[e.objectName,n]);let ee=(0,t.useRef)(void 0),q=(0,t.useRef)(null),{refetch:J,onDirtyChange:ie,saved:Y}=y(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`),X=(0,t.useCallback)(e=>{j(e),ie(e)},[ie]);(0,t.useEffect)(()=>{let t=!1,r=Ue(O,D,`record`);return(g||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){q.current=null,C(F(g,ne(e),{currentUserId:f})),r.commit(),T(!1);return}if(!n){q.current=null,C(ne(e)),r.commit(),T(!1);return}ee.current!==e.recordId&&(T(!0),j(!1));try{let i=await n.findOne(e.objectName,e.recordId);if(t)return;ee.current=e.recordId,q.current=he(e,i),C(i||{}),r.commit()}catch(e){if(t)return;r.fail(e)}finally{t||T(!1)}})(),()=>{t=!0}},[g,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName,J]);let se=(0,t.useCallback)(t=>te(t,{objectSchema:g,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:a,customFields:e.customFields}),[g,e.readOnly,e.mode,e.recordId,e.objectName,e.customFields,a]);(0,t.useEffect)(()=>{if(!g&&n)return;let t=rn({mode:e.mode,recordId:e.recordId,dataSource:n,loadedRecordId:ee.current}),r=()=>{t||T(!1)};if(e.sections?.length){r();return}(g||e.customFields?.length)&&(x(nn({fields:e.fields,objectSchema:g,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:a,customFields:e.customFields})),r())},[g,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let ce=(0,t.useMemo)(()=>{if(e.sections?.length)return null;let t=Oe(b,g);e.mode===`create`&&(t=Ae(t,g));let n=an(t,g?.fieldGroups);if(!n)return null;let r=e.columns&&e.columns>0?Math.min(Math.floor(e.columns),4):we(t.length);return n.map(e=>({...e,columns:r}))},[e.sections,e.columns,e.mode,b,g]),le=(0,t.useCallback)(async t=>{if(m.uploading){o.toast.error(m.reason);return}z(!0);try{if(!n&&!e.submitHandler&&qe(e))return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=fe(t,g,{canEdit:re(l,e.objectName)}),a=e.mode===`create`?I(i,g):ge(i,q.current,e);if(e.submitHandler)r=await e.submitHandler(a);else if(!n)throw Ye();else if(e.mode===`create`)r=await n.create(e.objectName,a);else if(e.mode===`edit`&&e.recordId){let t=await P({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:a,baseRecord:S});if(t.status===`cancelled`)return;r=t.result}return q.current=_e(q.current,e,a),Y(),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{z(!1)}},[e,n,g,P,S,l,m.uploading,m.reason,Y]),ue=(0,t.useCallback)(()=>{N(!1),B.current&&(B.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),de=(0,t.useCallback)(e=>{B.current=e,V&&A?N(!0):ue()},[V,A,ue]);(0,t.useEffect)(()=>{if(!H||!A||!V)return;let e=e=>{e.preventDefault(),e.returnValue=``};return window.addEventListener(`beforeunload`,e),()=>window.removeEventListener(`beforeunload`,e)},[H,A,V]);let pe=(0,t.useCallback)(()=>{B.current=!0,ue()},[ue]),me=(0,t.useMemo)(()=>{if(e.drawerWidth)return U===`left`||U===`right`?{width:e.drawerWidth,maxWidth:e.drawerWidth}:{height:e.drawerWidth,maxHeight:e.drawerWidth}},[e.drawerWidth,U]),Q=e.layout??`vertical`,ve=e.showSubmit!==!1&&e.mode!==`view`,ye=e.showCancel!==!1,be=e.submitText||(e.mode===`create`?p(`form.create`):p(`form.update`)),xe=e.cancelText||p(`common.cancel`),Se={type:`form`,objectName:e.objectName,layout:Q,defaultValues:S,previousValues:e.mode===`edit`&&e.recordId?S:void 0,submitLabel:be,cancelLabel:xe,showSubmit:ve,showCancel:ye,onSubmit:le,onCancel:pe,onDirtyChange:X,showActions:!1,id:W},Ce=()=>{if(k)return(0,d.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,d.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:p(`form.errorLoading`)}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:k.message})]});if(w)return(0,d.jsxs)(`div`,{className:`p-8 text-center`,children:[(0,d.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,d.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:p(`publicForm.loading`)})]});if(e.sections?.length){let t=[];e.sections.forEach((n,r)=>{let i=n.name||String(r),a=v(se(n)),o=un(n,{live:G[i],title:n.label,description:n.description,where:`DrawerForm section '${i}' of object '${e.objectName}'`,setCollapsed:e=>K(t=>({...t,[i]:e}))});t.push(...fn({key:i,title:n.label,description:n.description,visibleWhen:n.visibleWhen,members:a.map(e=>e.name),collapse:o})),o.collapsed?t.push(...a.map(e=>({...e,hidden:!0}))):t.push(...a)});let n={...Se,fields:t};return(0,d.jsx)(r.SchemaRenderer,{schema:n})}if(ce?.length){let t=Number(ce[0]?.columns)||1,n=[];ce.forEach((r,i)=>{let a=v(se(r));if(!a.length)return;let o=r.name||String(i),c=r.name?s(e.objectName,r.name,r.label||r.name):r.label,l=un(r,{live:G[o],title:c,description:r.description,where:`DrawerForm field group '${o}' of object '${e.objectName}'`,setCollapsed:e=>K(t=>({...t,[o]:e}))});n.push(...fn({key:o,title:c,description:r.description,visibleWhen:r.visibleWhen,members:a.map(e=>e.name),collapse:l}));let u=t>1?De(a,t):a;n.push(...l.collapsed?u.map(e=>({...e,hidden:!0})):u)});let i=je[t],a={...Se,fields:n,columns:t,...i?{fieldContainerClass:i}:{}};return(0,d.jsx)(r.SchemaRenderer,{schema:a})}let t=Pe(v(b),g,e.columns,e.mode),n=je[t.columns||1],i={...Se,fields:t.fields,columns:t.columns,...n?{fieldContainerClass:n}:{}};return(0,d.jsx)(r.SchemaRenderer,{schema:i})},Te=!k&&!w?(0,d.jsx)(Z,{affordance:ae({perms:l,objectName:e.objectName,mode:e.mode,objectSchema:g}),objectName:e.objectName,objectSchema:g}):null,Ee=e.subforms,$=Ee?.length&&e.mode!==`view`?(0,d.jsx)(tn,{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:xe,details:Ee,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n}):(0,d.jsxs)(d.Fragment,{children:[Te,Ce()]});return h?(0,d.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,d.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,d.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),$]}):(0,d.jsx)(o.Sheet,{open:H,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}de(!1)},children:(0,d.jsxs)(o.SheetContent,{side:U,className:(0,o.cn)(`overflow-y-auto`,i,e.className),style:me,children:[(e.title||e.description)&&(0,d.jsxs)(o.SheetHeader,{children:[e.title&&(0,d.jsx)(o.SheetTitle,{children:e.title}),e.description?(0,d.jsx)(o.SheetDescription,{children:e.description}):(0,d.jsx)(o.SheetDescription,{className:`sr-only`,children:p(`form.dialogDescriptionFallback`)})]}),(0,d.jsx)(`div`,{className:`@container py-4`,children:(0,d.jsx)(Qe,{gate:m,children:$})}),!k&&!w&&!(Ee?.length&&e.mode!==`view`)&&(ve||ye)&&(0,d.jsxs)(`div`,{className:`shrink-0 border-t px-4 py-3 bg-background`,"data-testid":`drawer-form-footer`,children:[(0,d.jsx)($e,{gate:m}),(0,d.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[ye&&(0,d.jsx)(o.Button,{type:`button`,variant:`outline`,onClick:pe,disabled:R,className:`w-full sm:w-auto`,children:xe}),ve&&(0,d.jsxs)(o.Button,{type:`submit`,form:W,disabled:R||m.uploading,className:`w-full sm:w-auto`,children:[R&&(0,d.jsx)(u.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),m.uploading?m.busyLabel:be]})]})]}),(0,d.jsx)(o.AlertDialog,{open:M,onOpenChange:N,children:(0,d.jsxs)(o.AlertDialogContent,{children:[(0,d.jsxs)(o.AlertDialogHeader,{children:[(0,d.jsx)(o.AlertDialogTitle,{children:p(`form.discardTitle`)}),(0,d.jsx)(o.AlertDialogDescription,{children:p(`form.discardMessage`)})]}),(0,d.jsxs)(o.AlertDialogFooter,{children:[(0,d.jsx)(o.AlertDialogCancel,{onClick:()=>{B.current=!1},children:p(`form.keepEditing`)}),(0,d.jsx)(o.AlertDialogAction,{onClick:ue,children:p(`form.discard`)})]})]})}),L]})})},hn=[`name`,`label`,`description`,`collapsible`,`collapsed`,`visibleWhen`],gn=[`columns`,`pane`],_n=new Set;function vn(e,t){_n.has(e)||(_n.add(e),t())}function yn(e){return Array.isArray(e)&&e.some(e=>typeof e==`object`&&!!e&&typeof e.group==`string`)}function bn(e){let t=e?.fields;return!t||typeof t!=`object`?null:an(Object.entries(t).map(([e,t])=>({name:e,group:t?.group})),e?.fieldGroups)}function xn(e,t){if(!yn(e))return e;let n=e,{objectName:r,formType:i,objectDef:a,resolvable:o=!0}=t;if(i===`wizard`){for(let e of n){let t=e?.group;typeof t==`string`&&vn(`wizard:${r}.${t}`,()=>console.warn(`[object-ui] form section { group: '${t}' } is not supported on a wizard step and renders nothing. \`@objectstack/spec\` refuses \`group\` on a \`formType: 'wizard'\` section at parse: a field group carries \`visibleWhen\` and \`collapse\`, and a wizard step has no slot for either. Enumerate \`fields\` on the step instead.`))}return n.map(e=>typeof e?.group==`string`?Sn(e,[]):e)}let s=a?bn(a):null,c=new Map;for(let e of s??[])typeof e.name==`string`&&c.set(e.name,e);return n.map(e=>{let t=e?.group;if(typeof t!=`string`)return e;let n=Cn(e);wn(e,t,r);let i=c.get(t);return i?{...i,...n}:((a||!o)&&vn(`unknown:${r}.${t}`,()=>console.error(`[object-ui] form section group "${t}" is not declared in fieldGroups on object "${r}" — the section renders nothing. Declare the group on the object, or enumerate \`fields\` on the section. (\`@objectstack/lint\` reports this as \`form-section-group-unknown\`.)`)),Sn(e,[]))})}function Sn(e,t){return{...Cn(e),fields:t}}function Cn(e){let t={};for(let n of gn){let r=e[n];r!==void 0&&(t[n]=r)}return t}function wn(e,t,n){let r=hn.filter(t=>e[t]!==void 0);r.length!==0&&vn(`owned:${n}.${t}:${r.join(`,`)}`,()=>console.warn(`[object-ui] form section { group: '${t}' } also declares ${r.map(e=>`\`${e}\``).join(`, `)} — the group owns ${r.length>1?`those keys`:`that key`} and the authored value is ignored. \`@objectstack/spec\` refuses this combination at parse (there are no override semantics); set it on the object's \`fieldGroups\` entry for "${t}" instead.`))}var Tn=(0,i.createSafeTranslation)({"form.discardTitle":`Discard changes?`,"form.discardMessage":`You have unsaved changes. If you close this form now, your edits will be lost.`,"form.dialogDescriptionFallback":`Complete the form fields, then submit or cancel.`,"form.masterDetail.editorDescription":`Enter the record and its line items, then save.`,"form.keepEditing":`Keep editing`,"form.discard":`Discard`,"form.create":`Create`,"form.update":`Update`,"common.cancel":`Cancel`,"form.errorLoading":`Error loading form`},`form.discardTitle`),En={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`},Dn=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:a,sectionLabel:s}=(0,r.useSafeFieldLabel)(),{t:l}=Tn(),f=Ze(),p=(0,r.usePreviewMode)(),m=(0,c.usePermissions)(),[h,g]=(0,t.useState)(null),_=(0,t.useCallback)(t=>oe(t,{perms:m,objectName:e.objectName,mode:e.mode,objectSchema:h}),[m,e.objectName,e.mode,h]),[v,b]=(0,t.useState)([]),[x,S]=(0,t.useState)({}),[C,w]=(0,t.useState)(!0),[T,E]=(0,t.useState)(He),D=(0,t.useRef)({schema:0,record:0}),O=We(T),[k,A]=(0,t.useState)(!1),[j,M]=(0,t.useState)(!1),[N,P]=(0,t.useState)(!1),[L,R]=(0,t.useState)({}),{saveWithOcc:z,conflictDialog:B}=Ve(),V=(0,t.useRef)(!1),H=e.confirmOnDiscard!==!1,U=e.open!==!1,W=e.modalCloseButton!==!1,G=(0,t.useId)(),K=(0,t.useMemo)(()=>xn(e.sections,{objectName:e.objectName,formType:e.formType,objectDef:h,resolvable:typeof n?.getObjectSchema==`function`}),[e.sections,e.objectName,e.formType,h,n]),ee=(0,t.useMemo)(()=>{if(e.sections?.length)return null;let t=Oe(v,h);e.mode===`create`&&(t=Ae(t,h));let n=an(t,h?.fieldGroups);if(!n)return null;let r=e.columns&&e.columns>0?Math.min(Math.floor(e.columns),4):we(t.length);return n.map(e=>({...e,columns:r}))},[e.sections,e.columns,e.mode,v,h]),q=K?.length?K:ee??void 0,J=(0,t.useMemo)(()=>q?.length?null:Pe(v,h,e.columns,e.mode),[v,h,e.columns,e.mode,q]),ie=En[(0,t.useMemo)(()=>{if(e.modalSize)return e.modalSize;if(J?.columns&&J.columns>1)return Ne(J.columns);if(q?.length){let e=Math.max(...q.map(e=>Number(e.columns)||1));if(e>1)return Ne(e)}return`default`},[e.modalSize,J,q])]||En.default;(0,t.useEffect)(()=>{let t=!1,r=Ue(D,E,`schema`);return(async()=>{if(!n){w(!1);return}try{let i=await n.getObjectSchema(e.objectName);if(t)return;g(i),r.commit()}catch(e){if(t)return;r.fail(e),w(!1)}})(),()=>{t=!0}},[e.objectName,n]);let Y=(0,t.useRef)(void 0),X=(0,t.useRef)(null),{refetch:se,onDirtyChange:ce,saved:le}=y(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`),ue=(0,t.useCallback)(e=>{M(e),ce(e)},[ce]);(0,t.useEffect)(()=>{let t=!1,r=Ue(D,E,`record`);return(h||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){X.current=null,S(F(h,ne(e),{currentUserId:m.userId})),r.commit(),w(!1);return}if(!n){X.current=null,S(ne(e)),r.commit(),w(!1);return}Y.current!==e.recordId&&(w(!0),M(!1));try{let i=await n.findOne(e.objectName,e.recordId);if(t)return;Y.current=e.recordId,X.current=he(e,i),S(i||{}),r.commit()}catch(e){if(t)return;r.fail(e)}finally{t||w(!1)}})(),()=>{t=!0}},[h,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName,se]);let de=(0,t.useCallback)(t=>te(t,{objectSchema:h,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:a,customFields:e.customFields}),[h,e.readOnly,e.mode,e.recordId,e.objectName,e.customFields,a]);(0,t.useEffect)(()=>{if(!h&&n)return;let t=rn({mode:e.mode,recordId:e.recordId,dataSource:n,loadedRecordId:Y.current}),r=()=>{t||w(!1)};if(e.sections?.length){r();return}(h||e.customFields?.length)&&(b(nn({fields:e.fields,objectSchema:h,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:a,customFields:e.customFields})),r())},[h,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let pe=(0,t.useCallback)(async t=>{if(f.uploading){o.toast.error(f.reason);return}A(!0);try{if(!n&&!e.submitHandler&&qe(e))return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=fe(t,h,{canEdit:re(m,e.objectName)}),a=e.mode===`create`?I(i,h):ge(i,X.current,e);if(e.submitHandler)r=await e.submitHandler(a);else if(!n)throw Ye();else if(e.mode===`create`)r=await n.create(e.objectName,a);else if(e.mode===`edit`&&e.recordId){let t=await z({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:a,baseRecord:x});if(t.status===`cancelled`)return;r=t.result}return X.current=_e(X.current,e,a),le(),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{A(!1)}},[e,n,h,m,z,x,f.uploading,f.reason,le]),me=(0,t.useCallback)(()=>{P(!1),V.current&&(V.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),Q=(0,t.useCallback)(e=>{V.current=e,H&&j?P(!0):me()},[H,j,me]);(0,t.useEffect)(()=>{if(!U||!j||!H)return;let e=e=>{e.preventDefault(),e.returnValue=``};return window.addEventListener(`beforeunload`,e),()=>window.removeEventListener(`beforeunload`,e)},[U,j,H]);let ve=(0,t.useCallback)(()=>{V.current=!0,me()},[me]),ye=e.layout??`vertical`,be=e.showSubmit!==!1&&e.mode!==`view`,xe=e.showCancel!==!1,Se=e.submitText||(e.mode===`create`?l(`form.create`):l(`form.update`)),Ce=e.cancelText||l(`common.cancel`),Te={type:`form`,objectName:e.objectName,layout:ye,defaultValues:x,previousValues:e.mode===`edit`&&e.recordId?x:void 0,submitLabel:Se,cancelLabel:Ce,showSubmit:be,showCancel:xe,onSubmit:pe,onCancel:ve,onDirtyChange:ue,showActions:!1,id:G},Ee=()=>{if(O)return(0,d.jsxs)(`div`,{className:`p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,d.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:l(`form.errorLoading`)}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:O.message})]});if(C)return(0,d.jsx)(`div`,{className:`space-y-4`,"data-testid":`modal-form-skeleton`,children:[1,2,3].map(e=>(0,d.jsxs)(`div`,{className:`space-y-2`,children:[(0,d.jsx)(o.Skeleton,{className:`h-4 w-24`}),(0,d.jsx)(o.Skeleton,{className:`h-10 w-full`})]},e))});if(K?.length){let t=K,n=(e,t)=>e.name||e.label||String(t),i=t=>t.name?s(e.objectName,t.name,t.label||t.name):t.label,a=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,o=t.map(e=>a(e.columns)).filter(e=>e!=null),c=a(e.columns)??(o.length?Math.max(...o):1),l=je[c],u=t.map((t,r)=>{let o=_(de(t)),s=n(t,r),l=i(t);return{key:s,title:l,description:t.description,resolveCollapse:()=>un(t,{live:L[s],title:l,description:t.description,where:`ModalForm section '${s}' of object '${e.objectName}'`,setCollapsed:e=>R(t=>({...t,[s]:e}))}),visibleWhen:t.visibleWhen,className:t.className,gridClassName:t.gridClassName,fields:c>1?De(o,c,a(t.columns)):o}}).filter(e=>e.fields.length>0),f={...Te,columns:c,...l?{fieldContainerClass:l}:{}};if(e.contentLayout===`tabbed`&&u.length>1){let e={...f,fields:u.flatMap(e=>e.fields),fieldTabs:u.map((e,t)=>({key:e.key,label:e.title||`Section ${t+1}`,description:e.description,fields:e.fields.map(e=>e.name),containerClass:e.gridClassName,visibleWhen:e.visibleWhen}))};return(0,d.jsx)(r.SchemaRenderer,{schema:e})}let p=[];u.forEach(e=>{let t=e.resolveCollapse();p.push(...fn({key:e.key,title:e.title,description:e.description,visibleWhen:e.visibleWhen,members:e.fields.map(e=>e.name),className:e.className,collapse:t})),p.push(...t.collapsed?e.fields.map(e=>({...e,hidden:!0})):e.fields)});let m={...f,fields:p};return(0,d.jsx)(r.SchemaRenderer,{schema:m})}if(ee?.length){let t=Number(ee[0]?.columns)||1,n=[];ee.forEach((r,i)=>{let a=_(de(r));if(!a.length)return;let o=r.name?s(e.objectName,r.name,r.label||r.name):r.label,c=r.name||String(i),l=un(r,{live:L[c],title:o,description:r.description,where:`ModalForm field group '${c}' of object '${e.objectName}'`,setCollapsed:e=>R(t=>({...t,[c]:e}))});n.push(...fn({key:c,title:o,description:r.description,visibleWhen:r.visibleWhen,members:a.map(e=>e.name),collapse:l}));let u=t>1?De(a,t):a;n.push(...l.collapsed?u.map(e=>({...e,hidden:!0})):u)});let i=je[t],a={...Te,fields:n,columns:t,...i?{fieldContainerClass:i}:{}};return(0,d.jsx)(r.SchemaRenderer,{schema:a})}let t=J??Pe(v,h,e.columns,e.mode),n=je[t.columns||1],i={...Te,fields:_(t.fields),columns:t.columns,...n?{fieldContainerClass:n}:{}};return(0,d.jsx)(r.SchemaRenderer,{schema:i})},$=e.subforms,ke=!O&&!C?(0,d.jsx)(Z,{affordance:ae({perms:m,objectName:e.objectName,mode:e.mode,objectSchema:h}),objectName:e.objectName,objectSchema:h}):null;if(p)return(0,d.jsxs)(`div`,{className:`@container rounded-md border bg-card p-4`,children:[(e.title||e.description)&&(0,d.jsxs)(`div`,{className:`mb-3 space-y-0.5`,children:[e.title&&(0,d.jsx)(`div`,{className:`text-sm font-semibold`,children:e.title}),e.description&&(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description})]}),ke,Ee()]});if($?.length&&e.mode!==`view`)return(0,d.jsx)(o.Dialog,{open:U,onOpenChange:e.onOpenChange,children:(0,d.jsxs)(o.MobileDialogContent,{showCloseButton:W,className:(0,o.cn)(ie,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,i,e.className),children:[(e.title||e.description)&&(0,d.jsxs)(o.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,d.jsx)(o.DialogTitle,{children:e.title}),e.description?(0,d.jsx)(o.DialogDescription,{children:e.description}):(0,d.jsx)(o.DialogDescription,{className:`sr-only`,children:l(`form.masterDetail.editorDescription`)})]}),(0,d.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:(0,d.jsx)(tn,{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:Se,cancelText:Ce,details:$,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n})})]})});let Me=!C&&!O&&(be||xe);return(0,d.jsx)(o.Dialog,{open:U,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}Q(!1)},children:(0,d.jsxs)(o.MobileDialogContent,{showCloseButton:W,className:(0,o.cn)(ie,`flex flex-col h-[100dvh] sm:h-auto sm:max-h-[90vh] overflow-hidden p-0`,i,e.className),children:[(e.title||e.description)&&(0,d.jsxs)(o.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,d.jsx)(o.DialogTitle,{children:e.title}),e.description?(0,d.jsx)(o.DialogDescription,{children:e.description}):(0,d.jsx)(o.DialogDescription,{className:`sr-only`,children:l(`form.dialogDescriptionFallback`)})]}),(0,d.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:(0,d.jsxs)(Qe,{gate:f,children:[ke,Ee()]})}),Me&&(0,d.jsxs)(`div`,{className:`shrink-0 border-t px-4 sm:px-6 py-3 bg-background`,"data-testid":`modal-form-footer`,children:[(0,d.jsx)($e,{gate:f}),(0,d.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[xe&&(0,d.jsx)(o.Button,{type:`button`,variant:`outline`,onClick:ve,disabled:k,className:`w-full sm:w-auto`,children:Ce}),be&&(0,d.jsxs)(o.Button,{type:`submit`,form:G,disabled:k||f.uploading,className:`w-full sm:w-auto`,children:[k&&(0,d.jsx)(u.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),f.uploading?f.busyLabel:Se]})]})]}),(0,d.jsx)(o.AlertDialog,{open:N,onOpenChange:P,children:(0,d.jsxs)(o.AlertDialogContent,{children:[(0,d.jsxs)(o.AlertDialogHeader,{children:[(0,d.jsx)(o.AlertDialogTitle,{children:l(`form.discardTitle`)}),(0,d.jsx)(o.AlertDialogDescription,{children:l(`form.discardMessage`)})]}),(0,d.jsxs)(o.AlertDialogFooter,{children:[(0,d.jsx)(o.AlertDialogCancel,{onClick:()=>{V.current=!1},children:l(`form.keepEditing`)}),(0,d.jsx)(o.AlertDialogAction,{onClick:me,children:l(`form.discard`)})]})]})}),B]})})};function On(e){let t=e.buttons,n=e.defaults;if(!t&&!n)return e;let r=e,i={...r};return t?.submit?.show!==void 0&&r.showSubmit===void 0&&(i.showSubmit=t.submit.show),t?.submit?.label!=null&&r.submitText===void 0&&(i.submitText=t.submit.label),t?.cancel?.show!==void 0&&r.showCancel===void 0&&(i.showCancel=t.cancel.show),t?.cancel?.label!=null&&r.cancelText===void 0&&(i.cancelText=t.cancel.label),t?.reset?.show!==void 0&&r.showReset===void 0&&(i.showReset=t.reset.show),n&&r.initialValues===void 0&&(i.initialValues=n),i}var kn=[`title`,`description`,`submitText`,`cancelText`,`nextText`,`prevText`,`successMessage`];function An(e,t){let n=null;for(let r of kn){let a=e[r];typeof a==`object`&&a&&(n??={...e},n[r]=(0,i.pickLocalized)(a,t)||void 0)}return n??e}var jn=({schema:e,dataSource:n})=>{let a=(0,c.usePermissions)(),o=yn(e?.sections),s=typeof n?.getObjectSchema==`function`,[l,u]=(0,t.useState)(null);(0,t.useEffect)(()=>{if(!o||!s)return;let t=!0;return Promise.resolve(n.getObjectSchema(e.objectName)).then(e=>{t&&u(e??null)}).catch(()=>{t&&u(null)}),()=>{t=!1}},[o,s,n,e.objectName]);let{language:f}=(0,i.useObjectTranslation)(),p=(0,t.useMemo)(()=>{let t=An(On(e),f),n=t.groups,r=!t.sections?.length&&Array.isArray(n)&&n.length?{...t,sections:n.map(e=>({label:e.title??e.label,description:e.description,collapsible:e.collapsible,collapsed:e.defaultCollapsed??e.collapsed,fields:e.fields??[]}))}:t,i=e=>{let t=xn(e.sections,{objectName:e.objectName,formType:e.formType,objectDef:l,resolvable:s});return t===e.sections?e:{...e,sections:t}};if(!a?.isLoaded)return i(r);let o=e=>Y(e,{perms:a,objectName:r.objectName,mode:r.mode});return i({...r,fields:o(r.fields),sections:r.sections?.map(e=>({...e,fields:o(e.fields)}))})},[e,a,l,s,f]),{sectionLabel:m}=(0,r.useSafeFieldLabel)(),h=e=>e?.name?m(p.objectName,e.name,e.label||e.name):e?.label,g=!!p.subforms?.length&&p.mode!==`view`&&p.formType!==`drawer`&&p.formType!==`modal`,_=!g&&p.formType===`wizard`?p.formType:null,v=(p.sections??[]).filter(e=>e?.visibleWhen!=null).map(e=>e?.name||e?.label||`(unnamed)`).join(`, `);return(0,t.useEffect)(()=>{_&&v&&console.warn(k(_,v))},[_,v]),g?(0,d.jsx)(tn,{schema:{type:`object-master-detail-form`,objectName:p.objectName,mode:p.mode===`edit`?`edit`:`create`,recordId:p.recordId,initialValues:p.initialValues,initialData:p.initialData,formType:p.formType===`tabbed`?`tabbed`:`simple`,sections:p.sections,fields:p.fields,title:p.title,submitText:p.submitText,cancelText:p.cancelText,showSubmit:p.showSubmit,details:p.subforms,onSuccess:p.onSuccess,onError:p.onError,onCancel:p.onCancel,className:p.className},dataSource:n}):p.formType===`tabbed`&&p.sections?.length?(0,d.jsx)(nt,{schema:{...p,formType:`tabbed`,sections:p.sections.map(e=>({name:e.name,label:h(e),description:e.description,columns:e.columns,fields:e.fields??[],visibleWhen:e.visibleWhen})),defaultTab:p.defaultTab,tabPosition:p.tabPosition},dataSource:n,className:p.className}):p.formType===`wizard`&&p.sections?.length?(0,d.jsx)(ct,{schema:{...p,formType:`wizard`,sections:p.sections.map(e=>({name:e.name,label:h(e),description:e.description,columns:e.columns,fields:e.fields??[]})),allowSkip:p.allowSkip,showStepIndicator:p.showStepIndicator,nextText:p.nextText,prevText:p.prevText,onStepChange:p.onStepChange},dataSource:n,className:p.className}):p.formType===`split`&&p.sections?.length?(0,d.jsx)(lt,{schema:{...p,formType:`split`,sections:p.sections.map(e=>({name:e.name,label:h(e),description:e.description,columns:e.columns,fields:e.fields??[],pane:e.pane,visibleWhen:e.visibleWhen})),splitDirection:p.splitDirection,splitSize:p.splitSize,splitResizable:p.splitResizable},dataSource:n,className:p.className}):p.formType===`drawer`?(0,d.jsx)(mn,{schema:{...p,formType:`drawer`,sections:p.sections?.map(e=>({name:e.name,label:h(e),description:e.description,columns:e.columns,fields:e.fields??[],collapsible:e.collapsible,collapsed:e.collapsed,visibleWhen:e.visibleWhen})),open:p.open,onOpenChange:p.onOpenChange,drawerSide:p.drawerSide,drawerWidth:p.drawerWidth},dataSource:n,className:p.className}):p.formType===`modal`?(0,d.jsx)(Dn,{schema:{...p,formType:`modal`,sections:p.sections?.map(e=>({name:e.name,label:h(e),description:e.description,columns:e.columns,fields:e.fields??[],collapsible:e.collapsible,collapsed:e.collapsed,visibleWhen:e.visibleWhen})),open:p.open,onOpenChange:p.onOpenChange,modalSize:p.modalSize,modalCloseButton:p.modalCloseButton},dataSource:n,className:p.className}):(0,d.jsx)(Mn,{schema:p,dataSource:n})},Mn=({schema:e,dataSource:n})=>{let{fieldLabel:i,sectionLabel:s}=(0,r.useSafeFieldLabel)(),{t:l}=tt(),u=(0,o.useIsMobile)(),f=Ze(),p=(0,c.usePermissions)(),[m,h]=(0,t.useState)(null),g=l(`form.deniedDescription`),_=(0,t.useCallback)(t=>oe(t,{perms:p,objectName:e.objectName,mode:e.mode,objectSchema:m,deniedDescription:g}),[p,e.objectName,e.mode,m,g]),v=ae({perms:p,objectName:e.objectName,mode:e.mode,objectSchema:m}),b=(0,d.jsx)(Z,{affordance:v,objectName:e.objectName,objectSchema:m}),[x,S]=(0,t.useState)([]),[w,T]=(0,t.useState)(null),[k,A]=(0,t.useState)(!0),[P,F]=(0,t.useState)(He),I=t.default.useRef({schema:0,record:0}),L=We(P),[z,B]=(0,t.useState)(null),[V,H]=(0,t.useState)(null);O(V);let{saveWithOcc:W,conflictDialog:K}=Ve(),q=t.default.useRef(null),J=e.customFields&&e.customFields.length>0;(0,t.useEffect)(()=>{J&&(T(ne(e)),e.objectName&&n||A(!1))},[J,e.initialData,e.initialValues,e.objectName,n]),(0,t.useEffect)(()=>{let t=!1,r=Ue(I,F,`schema`),i={name:e.objectName,fields:{}};return e.objectName&&n?(async()=>{try{if(!n)throw Error(`DataSource is required when using ObjectQL schema fetching (inline fields not provided)`);let i=await n.getObjectSchema(e.objectName);if(t)return;if(!i)throw Error(`No schema found for object "${e.objectName}"`);h(i),r.commit()}catch(e){if(t)return;if(J){h(i),r.commit(),A(!1);return}r.fail(e),A(!1)}})():J?(h(i),r.commit()):A(!1),()=>{t=!0}},[e.objectName,n,J]);let ie=!!e.recordId&&e.mode!==`create`&&!J,{refetch:Y,onDirtyChange:X,saved:se}=y(e.objectName,e.recordId,ie),ce=t.default.useRef(0);(0,t.useEffect)(()=>{let t=Y!==ce.current;ce.current=Y;let r=!1,i=Ue(I,F,`record`);return m&&!J&&(async()=>{if(!e.recordId||e.mode===`create`){q.current=null,T(ne(e)),i.commit(),A(!1);return}if(!J){if(!n){i.fail(Error(`DataSource is required for fetching record data (inline data not provided)`)),A(!1);return}t||A(!0);try{let t=await n.findOne(e.objectName,e.recordId);if(r)return;q.current=he(e,t),T(t),i.commit()}catch(e){if(r)return;console.error(`Failed to fetch record:`,e),i.fail(e)}finally{r||A(!1)}}})(),()=>{r=!0}},[e.objectName,e.recordId,e.mode,e.initialValues,e.initialData,n,m,J,Y]);let le=(0,t.useCallback)(e=>e,[]);(0,t.useEffect)(()=>{if(!m)return;let t=e.fields||Object.keys(m.fields||{}),r=Array.isArray(t)?t:Object.keys(t),o=[];r.forEach(t=>{let n=typeof t==`string`?t:t.name;if(!n){U(t,e.objectName);return}o.push({name:n,entry:t})}),S(R(o.map(e=>e.name),e.customFields,(t,n)=>{let r=o[n].entry,s=m.fields?.[t];if(s){let n={name:t,label:i(e.objectName,t,s.label||r),type:(0,a.mapFieldTypeToFormType)(s.type,{multiple:s.multiple}),required:M(s,j(e)),disabled:e.readOnly||e.mode===`view`||s.readonly,placeholder:s.placeholder,description:s.help||s.description,validation:(0,a.buildValidationRules)(s),visibleWhen:s.visibleWhen,readonlyWhen:s.readonlyWhen,requiredWhen:s.requiredWhen,group:s.group,field:s,widget:s.widget};if((s.type===`select`||s.type===`lookup`||s.type===`master_detail`)&&(n.options=s.options||[],n.multiple=s.multiple),(s.type===`number`||s.type===`currency`||s.type===`percent`)&&(n.inputType=`number`,n.min=s.min,n.max=s.max,n.step=typeof s.scale==`number`?10**-s.scale:`any`),s.type===`date`&&(n.inputType=`date`),s.type===`datetime`&&(n.inputType=`datetime-local`),(s.type===`text`||s.type===`textarea`||s.type===`markdown`||s.type===`html`)&&(n.maxLength=s.maxLength,n.minLength=s.minLength),(s.type===`file`||s.type===`image`)&&(n.inputType=`file`,n.multiple=s.multiple,n.accept=s.accept?s.accept.join(`,`):void 0,s.max_size)){let e=`Max size: ${(0,a.formatFileSize)(s.max_size)}`;n.description=n.description?`${n.description} (${e})`:e}return s.type===`email`&&(n.inputType=`email`),s.type===`phone`&&(n.inputType=`tel`),s.type===`url`&&(n.inputType=`url`),s.type===`password`&&(n.inputType=`password`),s.type===`time`&&(n.inputType=`time`),(s.type===`formula`||s.type===`summary`||s.type===`auto_number`)&&(n.disabled=!0),s.visible_on&&(n.visibleOn=s.visible_on),n}},le)),!J&&e.recordId&&e.mode!==`create`&&n||A(!1)},[m,e.fields,e.customFields,e.readOnly,e.mode,e.objectName,J,e.recordId,n]);let ue=(0,t.useCallback)(async(t,r)=>{if(f.uploading){o.toast.error(f.reason);return}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={})),!n&&!e.submitHandler&&J)return e.onSuccess&&await e.onSuccess(t),t;let{payload:i,writePayload:a}=ve(t,e,{objectSchema:m,canEdit:re(p,e.objectName),snapshot:q.current});try{let t;if(e.submitHandler)t=await e.submitHandler(a);else if(!n)throw Ye();else if(e.mode===`create`)t=await n.create(e.objectName,i);else if(e.mode===`edit`&&e.recordId){let r=await W({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:a,baseRecord:w});if(r.status===`cancelled`)return;t=r.result}else throw Error(`Invalid form mode or missing record ID`);if(q.current=_e(q.current,e,a),se(),e.onSuccess)await e.onSuccess(t);else if(!e.submitHandler&&e.submitBehavior){let n=e.submitBehavior;switch(n.kind){case`redirect`:{let r=D(n.url,E(i,t));if(!r.ok){o.toast.error(r.refusal),B({message:e.successMessage||(e.mode===`create`?l(`form.created`):l(`form.saved`)),refusal:r.refusal});break}H({url:r.url,delayMs:n.delayMs??0});break}case`continue`:break;default:{let t=n.kind===`thank-you`&&n.message?n.message:e.successMessage||(e.mode===`create`?l(`form.created`):l(`form.saved`));o.toast.success(t),B({title:n.kind===`thank-you`?n.title:void 0,message:t});break}}}else if(!e.submitHandler){let n=C(e.navigateOnSuccess,t);if(n)return H({url:n,delayMs:0}),t;e.navigateOnSuccess?(console.warn("[ObjectForm] `navigateOnSuccess` was declared but produced no destination:",e.navigateOnSuccess),o.toast.success(e.successMessage||(e.mode===`create`?l(`form.created`):l(`form.saved`)),{description:l(`form.navigateRefused`)})):o.toast.success(e.successMessage||(e.mode===`create`?l(`form.created`):l(`form.saved`)))}return t}catch(t){throw console.error(`Failed to submit form:`,t),e.onError&&e.onError(t),t}},[e,n,J,p,m,W,w,f.uploading,f.reason,se,l]),de=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),fe=j(e),pe={...t.default.useMemo(()=>fe?N(m,{currentUserId:p.userId}):{},[m,fe,p.userId]),...w},me=e.mode===`edit`&&e.recordId&&w&&typeof w==`object`?w:void 0,Q=t.default.useMemo(()=>{let t=Oe(x,m);return e.mode===`create`&&(t=Ae(t,m)),t},[x,m,e.mode]),ge=t.default.useMemo(()=>e.sections?.length?null:an(Q,m?.fieldGroups),[e.sections,Q,m]),ye=e.sections?.length?e.sections:ge,[be,xe]=(0,t.useState)({});if(L)return(0,d.jsxs)(`div`,{className:`p-3 sm:p-4 border border-red-300 bg-red-50 rounded-md`,children:[(0,d.jsx)(`h3`,{className:`text-red-800 font-semibold`,children:l(`form.errorLoading`)}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:L.message})]});if(k)return(0,d.jsxs)(`div`,{className:`p-4 sm:p-8 text-center`,children:[(0,d.jsx)(`div`,{className:`inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900`}),(0,d.jsx)(`p`,{className:`mt-2 text-sm text-gray-600`,children:l(`publicForm.loading`)})]});if(z){let e=(0,d.jsxs)(`div`,{className:`rounded-md border bg-card p-6 sm:p-8 text-center`,children:[(0,d.jsx)(`h3`,{className:`text-lg font-semibold`,children:z.title??l(`publicForm.thankYouTitle`)}),z.message&&(0,d.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:z.message})]});return z.refusal?(0,d.jsxs)(`div`,{className:`space-y-4`,children:[e,(0,d.jsx)(`div`,{role:`alert`,className:`rounded-md border border-destructive/40 bg-destructive/10 p-4 text-sm text-destructive`,children:z.refusal})]}):e}let Se=e.layout??`vertical`;if(ye?.length&&(!e.formType||e.formType===`simple`)){let t=ge?Q:x,n=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,a=ye.map(e=>n(e.columns)).filter(e=>e!=null),o=ye.reduce((e,t)=>e+(Array.isArray(t.fields)?t.fields.length:0),0),c=n(e.columns)??(a.length?Math.max(...a):we(o)),u=[],p={objectSchema:m,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:i,customFields:e.customFields,pool:t};ye.forEach((r,i)=>{let a=(r.fields??[]).map(ee);if(e.fields!=null&&e.sections?.length){let n=new Set(t.map(e=>e.name));a.forEach(t=>{typeof t!=`string`||n.has(t)||(m?.fields?.[t]!=null||(e.customFields??[]).some(e=>e?.name===t))&&G(t,e.objectName,r.name||r.label)})}let o=_(te(r,p));if(o.length===0)return;let l=r.name||r.label||String(i),d=r.name?s(e.objectName,r.name,r.label||r.name):r.label,f=un(r,{live:be[l],title:d,description:r.description,where:`ObjectForm section '${l}' of object '${e.objectName}'`,setCollapsed:e=>xe(t=>({...t,[l]:e}))});u.push(...fn({key:l,title:d,description:r.description,visibleWhen:r.visibleWhen,members:o.map(e=>e.name),collapse:f}));let h=n(r.columns),g=c>1?De(o,c,h):o;f.collapsed?u.push(...g.map(e=>({...e,hidden:!0}))):u.push(...g)});let h=u,g=Me(c);return(0,d.jsx)(Qe,{gate:f,children:(0,d.jsxs)(`div`,{className:`w-full @container`,children:[b,(0,d.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:h,layout:Se,columns:c,...g?{fieldContainerClass:g}:{},defaultValues:pe,previousValues:me,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,submitLabel:f.uploading?f.busyLabel:e.submitText||(e.mode===`create`?l(`form.create`):l(`form.update`)),cancelLabel:e.cancelText,onSubmit:ue,onCancel:de,onDirtyChange:X}}),(0,d.jsx)($e,{gate:f}),K]})})}let Ce=e.sections?.length,Te=_(x),Ee=Ce?{fields:Te,columns:e.columns}:Pe(Te,m,e.columns,e.mode),$=e.mobile,ke=$?.fullscreenLongText?Ee.fields.map(e=>{let t=e.type;return t!==`textarea`&&t!==`field:textarea`&&t!==`field:markdown`&&t!==`field:html`&&t!==`field:richtext`?e:e.field?{...e,field:{...e.field,mobile_fullscreen:!0}}:{...e,mobile_fullscreen:!0}}):Ee.fields,je=$?.stepper,Ne=$?.stepperMinFields??8,Fe=Math.max(1,$?.stepperFieldsPerStep??1);if(!e.formType&&!Ce&&ke.length>=2&&(je===!0||je===`auto`&&u&&ke.length>=Ne)){let t=ke,r=[];for(let e=0;e<t.length;e+=Fe){let n=t.slice(e,e+Fe);r.push({name:`step-${Math.floor(e/Fe)+1}`,label:n[0]?.label||n[0]?.name||`Step ${Math.floor(e/Fe)+1}`,fields:n})}return(0,d.jsx)(ct,{schema:{...e,formType:`wizard`,sections:r,showStepIndicator:!0},dataSource:n,className:e.className})}let Ie={type:`form`,objectName:e.objectName,fields:ke,layout:Se,columns:Ee.columns,submitLabel:f.uploading?f.busyLabel:e.submitText||(e.mode===`create`?l(`form.create`):l(`form.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:pe,previousValues:me,onSubmit:ue,onCancel:de,onDirtyChange:X,className:e.className,mobileStickyActions:!!$?.stickyActions};return(0,d.jsx)(Qe,{gate:f,children:(0,d.jsxs)(`div`,{className:$?.stickyActions?`w-full pb-20 md:pb-0`:`w-full`,"data-mobile-form":$?`true`:void 0,children:[b,(0,d.jsx)(r.SchemaRenderer,{schema:Ie}),(0,d.jsx)($e,{gate:f}),K]})})},Nn=`https://a.invalid/`,Pn=`https://b.invalid/`;function Fn(e){try{return new URL(e,Nn).origin===`https://a.invalid`&&new URL(e,Pn).origin===`https://b.invalid`}catch{return!1}}function In(e){let{navigate:n}=(0,r.useHostNavigation)(),i=(0,t.useRef)(n);(0,t.useEffect)(()=>{i.current=n},[n]),(0,t.useEffect)(()=>{if(!e)return;let t=setTimeout(()=>{let t=Fn(e.url)?i.current:void 0;if(t){t(e.url);return}window.location.href=e.url},e.delayMs);return()=>clearTimeout(t)},[e])}var Ln=1e3;function Rn(e){return e?Math.max(0,Math.ceil(e.delayMs/1e3)):null}function zn(e){let[n,r]=(0,t.useState)(e),[i,a]=(0,t.useState)(()=>Rn(e));return e!==n&&(r(e),a(Rn(e))),(0,t.useEffect)(()=>{if(!e)return;let t=setInterval(()=>{a(e=>e===null||e<=1?(clearInterval(t),0):e-1)},Ln);return()=>clearInterval(t)},[e]),i}var Bn=5e3,Vn={text:200,email:254,url:2048,phone:32,textarea:Bn,...Object.fromEntries(a.RICH_TEXT_FIELD_TYPES.map(e=>[e,Bn]))},Hn=`_company_website_2`,Un=1500;function Wn(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 Gn(e){return e&&e.map(e=>{let t=Vn[String(e.type||``).toLowerCase()];return!t||e.maxLength?e:{...e,maxLength:t}})}var Kn=({config:e,dataSource:n,prefillParams:r,className:i})=>{let[a,s]=(0,t.useState)(!1),[c,l]=(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,y]=(0,t.useState)(null),[b,x]=(0,t.useState)(!1),S=(0,t.useRef)(null),C=(0,t.useRef)(0);(0,t.useEffect)(()=>{a||(C.current=Date.now())},[a]),In(v);let w=zn(v),T=e.honeypot===!1?null:e.honeypot||Hn,E=e.minFillTime??Un,D=(0,t.useMemo)(()=>Gn(e.customFields),[e.customFields]),O=(0,t.useMemo)(()=>{if(!n||D&&D.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,D,e.fields]),k=(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]),A=(0,t.useCallback)(async t=>{if(e.consent?.required&&!m){_(e.texts?.consentRequired??`Please accept the privacy policy to continue.`);return}if(_(null),T&&S.current?.value){s(!0);return}if(E>0&&Date.now()-C.current<E){p(e.texts?.rateLimited??`Please take a moment to review your answers before submitting.`);return}let r={...t};T&&delete r[T],e.captchaToken&&(r._captcha=e.captchaToken),l(!0),p(null);try{n&&await n.create(e.objectName,r),s(!0);let t=e.thankYouPage?.redirectUrl;if(t){if(Wn(t,e.allowedRedirectHosts)){let n=e.thankYouPage?.redirectDelay??3e3;y({url:t,delayMs:n})}else console.warn(`[EmbeddableForm] Blocked unsafe redirect target:`,t),x(!0)}}catch(e){p(e instanceof Error?e.message:`Failed to submit form. Please try again.`)}finally{l(!1)}},[n,e,m,T,E]),j=(0,t.useCallback)(()=>{s(!1),p(null),y(null),x(!1)},[]),M=(0,t.useMemo)(()=>{let t={};return e.branding?.backgroundColor&&(t.backgroundColor=e.branding.backgroundColor),t},[e.branding]);if(a){let t=e.thankYouPage,n=e.texts??{},r=v&&w!==null?(n.redirecting??`Redirecting in {{seconds}} seconds…`).replace(`{{seconds}}`,String(w)):null;return(0,d.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:M,children:(0,d.jsxs)(`div`,{className:`max-w-md w-full bg-card border rounded-xl shadow-sm p-8 text-center space-y-4`,children:[(0,d.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,d.jsx)(u.CheckCircle2,{className:`h-8 w-8`,"aria-hidden":`true`})}),(0,d.jsx)(`h2`,{className:`text-xl font-semibold text-foreground`,children:t?.title||n.thankYouTitle||`Thank You!`}),(0,d.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t?.message||n.thankYouMessage||`Your submission has been received successfully.`}),e.allowMultiple&&(0,d.jsx)(o.Button,{variant:`outline`,size:`sm`,onClick:j,className:`mt-2`,children:n.submitAnother??`Submit Another Response`}),r&&(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:r}),b&&n.redirectBlocked&&(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n.redirectBlocked})]})})}let N=e.texts??{},P=!!e.consent?.required,F=`${e.formId}-consent`;return(0,d.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:M,children:(0,d.jsxs)(`div`,{className:`max-w-2xl w-full bg-card border rounded-xl shadow-sm overflow-hidden`,children:[e.branding?.coverImage&&(0,d.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,d.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,d.jsx)(`img`,{src:e.branding.logo,alt:``,className:`h-8 mb-4`}),e.title&&(0,d.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight text-foreground`,children:e.title}),e.description&&(0,d.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2 leading-relaxed`,children:e.description}),(0,d.jsx)(`p`,{className:`text-[11px] text-muted-foreground/70 mt-3`,"aria-hidden":`true`,children:N.requiredHint??`* Required field`})]}),(0,d.jsxs)(`div`,{className:`relative px-6 sm:px-8 py-6`,children:[f&&(0,d.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,d.jsx)(jn,{schema:{type:`object-form`,objectName:e.objectName,mode:`create`,fields:e.fields,customFields:D,initialData:k,onSuccess:A,submitText:c?N.submitting??`Submitting...`:N.submit??`Submit`},dataSource:O}),T&&(0,d.jsxs)(`div`,{"aria-hidden":`true`,className:`absolute left-[-10000px] top-auto h-px w-px overflow-hidden`,children:[(0,d.jsx)(`label`,{htmlFor:`${e.formId}-${T}`,children:`Do not fill this field`}),(0,d.jsx)(`input`,{ref:S,id:`${e.formId}-${T}`,type:`text`,name:T,tabIndex:-1,autoComplete:`off`,defaultValue:``})]}),e.consent&&(0,d.jsxs)(`div`,{className:`mt-4`,children:[(0,d.jsxs)(`label`,{className:`flex items-start gap-2 text-sm text-foreground cursor-pointer select-none`,children:[(0,d.jsx)(`input`,{type:`checkbox`,id:F,checked:m,onChange:e=>{h(e.target.checked),e.target.checked&&_(null)},"aria-required":P||void 0,"aria-invalid":g?`true`:void 0,"aria-describedby":g?`${F}-error`:void 0,className:`mt-0.5 h-4 w-4 rounded border-input accent-primary`}),(0,d.jsxs)(`span`,{className:`leading-relaxed`,children:[e.consent.label??N.consentLabelDefault??`I agree to the privacy policy.`,P&&(0,d.jsx)(`span`,{"aria-hidden":`true`,className:`text-destructive ml-0.5`,children:`*`}),e.consent.privacyUrl&&(0,d.jsxs)(d.Fragment,{children:[` `,(0,d.jsx)(`a`,{href:e.consent.privacyUrl,target:`_blank`,rel:`noopener noreferrer`,className:`underline text-primary hover:opacity-80`,children:N.consentLink??`Privacy policy`})]})]})]}),g&&(0,d.jsx)(`p`,{id:`${F}-error`,role:`alert`,className:`mt-1.5 text-xs text-destructive`,children:g})]}),c&&(0,d.jsxs)(`div`,{className:`mt-3 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,d.jsx)(u.Loader2,{className:`h-3.5 w-3.5 animate-spin`,"aria-hidden":`true`}),(0,d.jsx)(`span`,{children:N.submitting??`Submitting…`})]})]}),(0,d.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,d.jsxs)(`p`,{className:`inline-flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,d.jsx)(u.Lock,{className:`h-3 w-3`,"aria-hidden":`true`}),(0,d.jsx)(`span`,{children:N.secureNotice??`Your information is transmitted securely and only used to respond to your request.`})]}),(0,d.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground/80`,children:[e.privacyPolicyUrl&&(0,d.jsxs)(`a`,{href:e.privacyPolicyUrl,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1 underline hover:text-foreground`,children:[(0,d.jsx)(u.ShieldCheck,{className:`h-3 w-3`,"aria-hidden":`true`}),N.consentLink??`Privacy policy`]}),(0,d.jsx)(`span`,{children:N.poweredBy??`Powered by ObjectStack`})]})]})]})})};function qn(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 Jn=({formId:e,formTitle:n,metrics:r,className:a})=>{let s=(0,i.useDisplayLocale)(),c=(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]),l=(0,t.useMemo)(()=>r.dailySubmissions?.length?Math.max(...r.dailySubmissions.map(e=>e.count),1):1,[r.dailySubmissions]);return(0,d.jsxs)(`div`,{className:`space-y-4 ${a||``}`,children:[(0,d.jsxs)(`div`,{children:[(0,d.jsx)(`h2`,{className:`text-lg font-semibold text-foreground`,children:n||`Form Analytics`}),(0,d.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Form ID: `,e]})]}),(0,d.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-4`,children:[(0,d.jsx)(o.Card,{children:(0,d.jsxs)(o.CardHeader,{className:`pb-2`,children:[(0,d.jsx)(o.CardDescription,{children:`Total Submissions`}),(0,d.jsx)(o.CardTitle,{className:`text-2xl`,children:r.totalSubmissions.toLocaleString(s)})]})}),(0,d.jsxs)(o.Card,{children:[(0,d.jsxs)(o.CardHeader,{className:`pb-2`,children:[(0,d.jsx)(o.CardDescription,{children:`Fill Rate`}),(0,d.jsxs)(o.CardTitle,{className:`text-2xl`,children:[c,`%`]})]}),(0,d.jsx)(o.CardContent,{children:(0,d.jsx)(`div`,{className:`w-full bg-muted rounded-full h-2`,children:(0,d.jsx)(`div`,{className:`bg-primary rounded-full h-2 transition-all`,style:{width:`${c}%`}})})})]}),(0,d.jsx)(o.Card,{children:(0,d.jsxs)(o.CardHeader,{className:`pb-2`,children:[(0,d.jsx)(o.CardDescription,{children:`Avg. Completion Time`}),(0,d.jsx)(o.CardTitle,{className:`text-2xl`,children:r.avgCompletionTime?qn(r.avgCompletionTime):`—`})]})})]}),r.dailySubmissions&&r.dailySubmissions.length>0&&(0,d.jsxs)(o.Card,{children:[(0,d.jsx)(o.CardHeader,{children:(0,d.jsx)(o.CardTitle,{className:`text-sm font-medium`,children:`Daily Submissions`})}),(0,d.jsx)(o.CardContent,{children:(0,d.jsx)(`div`,{className:`flex items-end gap-1 h-32`,children:r.dailySubmissions.map((e,t)=>(0,d.jsxs)(`div`,{className:`flex-1 flex flex-col items-center gap-1`,children:[(0,d.jsx)(`div`,{className:`w-full bg-primary/80 rounded-t transition-all hover:bg-primary`,style:{height:`${e.count/l*100}%`,minHeight:e.count>0?`4px`:`0`},title:`${e.date}: ${e.count} submissions`}),(0,d.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,d.jsxs)(o.Card,{children:[(0,d.jsxs)(o.CardHeader,{children:[(0,d.jsx)(o.CardTitle,{className:`text-sm font-medium`,children:`Field Completion Rates`}),(0,d.jsx)(o.CardDescription,{children:`Percentage of users who completed each field`})]}),(0,d.jsx)(o.CardContent,{children:(0,d.jsx)(`div`,{className:`space-y-3`,children:r.fieldDropOff.map((e,t)=>(0,d.jsxs)(`div`,{className:`space-y-1`,children:[(0,d.jsxs)(`div`,{className:`flex justify-between text-sm`,children:[(0,d.jsx)(`span`,{className:`text-foreground`,children:e.label}),(0,d.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.completionRate,`%`]})]}),(0,d.jsx)(`div`,{className:`w-full bg-muted rounded-full h-1.5`,children:(0,d.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))})})]})]})},Yn=(0,i.createSafeTranslation)({"view.malformedFilter":`This view’s filter is malformed, so no records are shown: the {{subject}} condition cannot be applied.`,"form.lineItems.title":`Line Items`,"common.save":`Save`,"detail.saving":`Saving…`,"common.loading":`Loading…`,"form.lineItems.saveRecordFirst":`Save the record first to add line items.`,"form.lineItems.notLoaded":`This record’s line items have not been loaded.`,"form.lineItems.loadFailed":`Failed to load line items`,"form.lineItems.saveFailed":`Failed to save line items`,"form.lineItems.noChildObject":`This panel has no child object configured: set {{property}} to the object whose rows it lists.`},`view.malformedFilter`);function Xn(e,t){let n=e?.message;return n?{message:n}:{op:t}}function Zn(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function Qn(e,t){return Zn(e)?e:t}function $n(e,t){return e==null||Zn(e)?null:`[ObjectUI] LineItemsPanel row cap: ${typeof t==`string`&&t?`record:line_items on ${t}`:`record:line_items`} declared limit: ${String(e)}, which is not a positive integer. A row cap must be a positive integer (the spec refuses zero and negative values), so it was ignored and this panel fell back to its default row cap (500).`}var er=({schema:e})=>{let i=(0,r.useSchemaContext)(),{t:s}=Yn(),l=i?.dataSource,u=(0,r.useRecordContext)(),f=(0,c.usePermissions)(),p=e.parentObject||u?.objectName,m=e.parentId||e.recordId||u?.recordId,[h,g]=(0,t.useState)([]),[_,v]=(0,t.useState)([]),[y,b]=(0,t.useState)(!0),[x,S]=(0,t.useState)(!1),[C,w]=(0,t.useState)(!1),[T,E]=(0,t.useState)(null),D=(0,t.useRef)(0),[O,k]=(0,t.useState)(void 0),A=O!==void 0&&O!==m,j=(0,t.useRef)({dirty:!1,rowsHeldFor:void 0});(0,t.useEffect)(()=>{j.current={dirty:C,rowsHeldFor:O}},[C,O]);let M=(0,t.useRef)(null),N=(0,t.useRef)(!1),[P,F]=(0,t.useState)(0),[I,L]=(0,t.useState)(!1),[R,z]=(0,t.useState)(null);(0,t.useEffect)(()=>{let t=l;if(!t||typeof t.getObjectSchema!=`function`)return;if(!e.childObject){z(null),console.warn(`[LineItemsPanel] a line-items panel has no childObject — refusing to fetch its child schema. Set childObject to the child object the panel lists.`);return}let n=!1;return t.getObjectSchema(e.childObject).then(e=>{n||z(e??null)}).catch(()=>{n||z(null)}),()=>{n=!0}},[l,e.childObject]),(0,t.useEffect)(()=>{let t=$n(e.limit,e.childObject);t&&console.warn(t)},[e.limit,e.childObject]);let B=(0,r.useFilterScope)(),V=(0,r.useResolvedFilter)(e.filter,B),H=JSON.stringify(V??null),U=JSON.stringify(e.sort??null),W=(0,t.useMemo)(()=>(0,n.toFilterNodeSafely)(V),[H]),G=W.ok?void 0:W.refusal,K=W.ok?W.node:void 0,ee=(0,t.useMemo)(()=>(0,n.convertSortToQueryParams)(e.sort),[U]),q=(0,r.useDataInvalidation)(l&&m?e.childObject:void 0),J=(0,t.useCallback)(async(t=`save`)=>{if(t===`inputs`){let t=j.current,n=M.current,r=t.dirty&&t.rowsHeldFor!==void 0&&t.rowsHeldFor===m,i=n!==null&&n.parentId===m&&n.dataSource===l&&n.childObject===e.childObject&&n.relationshipField===e.relationshipField;if(r&&i){N.current=!0;return}}let r=Qn(e.limit,500),i=M.current,a=t===`inputs`&&i!==null&&i.parentId===m&&i.dataSource===l&&i.childObject===e.childObject&&i.relationshipField===e.relationshipField&&i.top===r&&i.filterKey===H&&i.sortKey===U&&j.current.rowsHeldFor===m;N.current=!1;let o=++D.current,s=()=>D.current===o;if(M.current={parentId:m,dataSource:l,childObject:e.childObject,relationshipField:e.relationshipField,top:r,filterKey:H,sortKey:U},L(!1),!l||!m){b(!1);return}if(G){b(!1);return}if(!e.childObject){b(!1),console.warn(`[LineItemsPanel] a line-items panel has no childObject — refusing to fetch its rows. Set childObject to the child object the panel lists.`);return}a?L(!0):b(!0);try{let t={[e.relationshipField]:m},i=await l.find(e.childObject,{$filter:K===void 0?t:(0,n.mergeFilterNodes)(t,K),...ee?{$orderby:ee}:{},$top:r});if(!s())return;let a=i?.data??[];g(a.map(e=>({...e}))),v(a.map(e=>({...e}))),w(!1),k(m),E(null),N.current&&(N.current=!1,F(e=>e+1))}catch(e){s()&&(E(Xn(e,`load`)),k(e=>e??m))}finally{s()&&(b(!1),L(!1))}},[l,m,e.childObject,e.relationshipField,e.limit,G,K,ee,H,U]),te=(0,t.useRef)({load:J,parentId:m});(0,t.useEffect)(()=>{te.current={load:J,parentId:m}},[J,m]),(0,t.useEffect)(()=>{J(`inputs`)},[J,P,q]);let ne=(0,t.useCallback)(e=>{if(g(e),w(!0),m){let e=m;k(t=>t??e)}},[m]),re=(0,t.useCallback)(async()=>{if(!l||!m||!e.childObject||A)return;let t=m,r=()=>te.current.parentId===t;S(!0),E(null);try{let t=!!(p&&e.totalField),i=t?{[e.totalField]:vt(h,e.amountField||`amount`)}:{},a=gt(p??``,m,i,[{childObject:e.childObject,relationshipField:e.relationshipField,rows:h,original:_,childSchema:R}]);t||(a=a.slice(1)),a.length&&await(0,n.runBatchTransaction)(l,a),r()&&await te.current.load(`save`)}catch(e){r()&&E(Xn(e,`save`))}finally{S(!1)}},[l,m,A,h,_,e,p,R]),ie=(0,t.useMemo)(()=>({columns:ce(e.columns,{perms:f,objectName:e.childObject}),total_field:e.amountField||(e.totalField?`amount`:void 0),min_rows:e.minRows,max_rows:e.maxRows,allow_add:!e.readonly,allow_delete:!e.readonly}),[e,f]),[Y,X]=s(`form.lineItems.noChildObject`,{property:`{{property}}`}).split(`{{property}}`);return(0,d.jsxs)(o.Card,{className:(0,o.cn)(`shadow-none`),children:[(0,d.jsxs)(o.CardHeader,{className:`flex-row items-center justify-between gap-2 pb-2`,children:[(0,d.jsx)(o.CardTitle,{className:`text-sm font-medium`,children:e.title||s(`form.lineItems.title`)}),!e.readonly&&(0,d.jsx)(o.Button,{type:`button`,size:`sm`,onClick:re,disabled:x||y||!C||!m||A,children:s(x?`detail.saving`:`common.save`)})]}),(0,d.jsxs)(o.CardContent,{children:[T&&(0,d.jsx)(`p`,{className:`mb-2 text-sm text-destructive`,children:`message`in T?T.message:s(T.op===`load`?`form.lineItems.loadFailed`:`form.lineItems.saveFailed`)}),G?(0,d.jsxs)(`div`,{role:`alert`,className:`rounded-md border border-amber-300 bg-amber-50 p-3 text-sm text-amber-800`,"data-testid":`line-items-malformed-filter`,children:[(0,d.jsx)(`p`,{className:`font-medium`,"data-testid":`line-items-malformed-filter-subject`,children:s(`view.malformedFilter`,{subject:(0,n.filterRefusalSubject)(G)??``})}),(0,d.jsx)(`p`,{className:`mt-1 text-xs opacity-80`,children:G.message})]}):e.childObject?y?(0,d.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:s(`common.loading`)}):m?A?(0,d.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,"data-testid":`line-items-held-for-another-parent`,children:s(`form.lineItems.notLoaded`)}):(0,d.jsx)(a.LineItemsField,{value:h,onChange:ne,field:ie,readonly:e.readonly,disabled:x||I}):(0,d.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:s(`form.lineItems.saveRecordFirst`)}):(0,d.jsxs)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,"data-testid":`line-items-no-child-object`,children:[Y,(0,d.jsx)(`code`,{className:`font-mono`,children:`childObject`}),X]})]})]})},tr=(0,n.elementDataSourceBlock)(({schema:e,dataSource:t})=>{let n=(0,r.useResolvedDataSource)(t);return(0,d.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n,testId:`object-form`,errorTitle:`This form’s data source could not be resolved`,requiresDataSource:!(e?.customFields?.length>0)&&typeof e?.objectName==`string`&&e.objectName.length>0,noDataSourceMessage:(0,r.noDataSourceMessage)(`object-form`,e?.objectName),children:e=>(0,d.jsx)(jn,{schema:e,dataSource:n})})});n.ComponentRegistry.register(`object-form`,tr,{namespace:`plugin-form`,label:`Object Form`,category:`plugin`,inputs:[{name:`objectName`,type:`string`,required:!0},{name:`fields`,type:`array`,description:'Bare field names to show, in order (each looked up in the object schema). NOT the same vocabulary as `sections[].fields`, which also accepts the spec `FormFieldSchema` object (identity key `field`, e.g. `{ field: "note", colSpan: 2 }`) — that shape resolves to no name HERE and is silently skipped (SimpleObjectForm in ObjectForm.tsx; buildFlatFields in flatFields.ts for the drawer/modal presentations).'},{name:`mode`,type:`enum`,enum:[`create`,`edit`,`view`]},{name:`formType`,type:`enum`,enum:[`simple`,`tabbed`,`wizard`,`split`,`drawer`,`modal`]},{name:`sections`,type:`array`},{name:`title`,type:[`string`,`object`],description:'Heading of the drawer and modal presentations (`formType: "drawer"` / `"modal"`). Accepts either a plain string or an inline per-locale map (`{ en: "New order", "zh-CN": "新建订单" }`) — the `I18nLabel` union the contract admits on this key — and the form resolves the map against the active UI language, falling back through base language, a region-qualified sibling, `default`, then `en`, and finally to any remaining entry.'},{name:`description`,type:[`string`,`object`],description:'Subtitle under the drawer and modal heading. Accepts either a plain string or an inline per-locale map (`{ en: "Enter the order details", "zh-CN": "填写订单信息" }`), resolved against the active UI language with the same fallback chain as `title`.'},{name:`layout`,type:`enum`,enum:[`vertical`,`horizontal`],description:"Label placement: `vertical` puts each label above its field (the default), `horizontal` beside it."},{name:`columns`,type:`number`},{name:`defaultTab`,type:`string`},{name:`tabPosition`,type:`enum`,enum:[`top`,`bottom`,`left`,`right`]},{name:`allowSkip`,type:`boolean`},{name:`showStepIndicator`,type:`boolean`},{name:`splitDirection`,type:`enum`,enum:[`horizontal`,`vertical`]},{name:`splitSize`,type:`number`},{name:`splitResizable`,type:`boolean`},{name:`drawerSide`,type:`enum`,enum:[`top`,`bottom`,`left`,`right`]},{name:`drawerWidth`,type:`string`},{name:`modalSize`,type:`enum`,enum:[`sm`,`default`,`lg`,`xl`,`full`]},{name:`modalCloseButton`,type:`boolean`,description:"Show the modal presentation’s close (X) button. Default `true`; `false` hides it. Forwarded by `ObjectForm`’s modal route and honoured by `ModalForm` on both of its dialog arms. With the button hidden the modal still closes on Escape, and on the Cancel action when that is shown."},{name:`contentLayout`,type:`enum`,enum:[`simple`,`tabbed`],description:'How the modal presentation lays out sections. `tabbed` differs from `simple` only when more than one section has a field to show (`ModalForm` tests `schema.contentLayout === "tabbed" && groups.length > 1`).'},{name:`confirmOnDiscard`,type:`boolean`,description:"Ask before discarding unsaved edits when a drawer/modal form is dismissed. Set `false` to close immediately."},{name:`recordId`,type:`string`,description:"The record to load in `edit` / `view` mode. Leave unset for `create`."},{name:`customFields`,type:`array`,description:`Field definitions merged over the set generated from object metadata. With inline definitions and no data source, this becomes the only field source.`},{name:`initialValues`,type:`object`,description:"Values to prefill in `create` mode."},{name:`initialData`,type:`object`,description:"Alternate spelling of `initialValues` that the drawer/modal presentations read FIRST — PER MEMBER (`{ ...initialValues, ...initialData }`), so a member this key says nothing about keeps its `initialValues` value. Prefer `initialValues` in new schemas."},{name:`readOnly`,type:`boolean`,description:"Render every field read-only, whatever `mode` says."},{name:`submitText`,type:[`string`,`object`],description:'Label of the Save button. A map no locale limb resolves shows the default label. Accepts either a plain string or an inline per-locale map (`{ en: "Save order", "zh-CN": "保存订单" }`), resolved against the active UI language with the same fallback chain as `title`.'},{name:`cancelText`,type:[`string`,`object`],description:'Label of the Cancel button. Accepts either a plain string or an inline per-locale map (`{ en: "Back", "zh-CN": "返回" }`), resolved against the active UI language with the same fallback chain as `title`.'},{name:`nextText`,type:[`string`,`object`],description:'Label of the next-step button (wizard). Accepts either a plain string or an inline per-locale map (`{ en: "Continue", "zh-CN": "继续" }`), resolved against the active UI language with the same fallback chain as `title`.'},{name:`prevText`,type:[`string`,`object`],description:'Label of the previous-step button (wizard). Accepts either a plain string or an inline per-locale map (`{ en: "Previous", "zh-CN": "上一步" }`), resolved against the active UI language with the same fallback chain as `title`.'},{name:`showSubmit`,type:`boolean`},{name:`showCancel`,type:`boolean`},{name:`showReset`,type:`boolean`},{name:`submitBehavior`,type:`object`,description:'Declarative post-submit behaviour, one of `{ kind: "thank-you", title?, message? }`, `{ kind: "redirect", url, delayMs? }`, `{ kind: "continue" }`, `{ kind: "next-record" }`. When present it takes precedence over `successMessage` / `navigateOnSuccess` / `resetOnSuccess`.'},{name:`successMessage`,type:[`string`,`object`],description:'Toast shown after a successful submit. Ignored when `submitBehavior` or `navigateOnSuccess` is set. Accepts either a plain string or an inline per-locale map (`{ en: "Order saved", "zh-CN": "订单已保存" }`), resolved against the active UI language with the same fallback chain as `title`.'},{name:`navigateOnSuccess`,type:`string`,description:"Path to navigate to after a successful create/update. Supports `{id}` / `{recordId}` interpolation from the saved record and is same-origin-guarded. Takes precedence over `successMessage`."},{name:`resetOnSuccess`,type:`boolean`,description:`Clear the form after a successful submit instead of keeping the saved values.`},{name:`mobile`,type:`object`,description:'Phone-only presentation overrides, e.g. `{ stepper: "auto", stepperMinFields: 8, fullscreenLongText: true }`.'}]}),n.ComponentRegistry.register(`form`,tr,{namespace:`view`,skipFallback:!0,label:`Data Form View`,category:`view`,inputs:[{name:`objectName`,type:`string`,required:!0},{name:`fields`,type:`array`,description:'Bare field names to show, in order (each looked up in the object schema). NOT the same vocabulary as `sections[].fields`, which also accepts the spec `FormFieldSchema` object (identity key `field`, e.g. `{ field: "note", colSpan: 2 }`) — that shape resolves to no name HERE and is silently skipped (this renders through the same `ObjectFormRenderer` / `SimpleObjectForm` as `object-form` above — see its `fields` description).'},{name:`mode`,type:`enum`,enum:[`create`,`edit`,`view`]}]});var nr=(0,n.elementDataSourceBlock)(({schema:e})=>{let n=(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0;return(0,d.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n,testId:`embeddable-form`,errorTitle:`This form’s data source could not be resolved`,children:e=>(0,d.jsx)(Kn,{config:e,dataSource:n})})});n.ComponentRegistry.register(`embeddable-form`,nr,{namespace:`plugin-form`,label:`Embeddable Form`,category:`plugin`,inputs:[{name:`formId`,type:`string`,required:!0},{name:`objectName`,type:`string`,required:!0},{name:`title`,type:`string`},{name:`description`,type:`string`},{name:`fields`,type:`array`,description:'Bare field names to show, in order (each looked up in the object schema). NOT the same vocabulary as `sections[].fields`, which also accepts the spec `FormFieldSchema` object (identity key `field`, e.g. `{ field: "note", colSpan: 2 }`) — that shape resolves to no name HERE and is silently skipped (`EmbeddableForm` passes this array straight through to `<ObjectForm>` with no `sections`, so it renders through the same `SimpleObjectForm` as `object-form` above — see its `fields` description).'},{name:`allowMultiple`,type:`boolean`}]});var rr=(0,n.elementDataSourceBlock)(({schema:e})=>{let n=(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0;return(0,d.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n,testId:`object-master-detail-form`,errorTitle:`This form’s data source could not be resolved`,children:e=>(0,d.jsx)(tn,{schema:e,dataSource:n})})});n.ComponentRegistry.register(`object-master-detail-form`,rr,{namespace:`plugin-form`,label:`Master-Detail Form`,category:`plugin`,inputs:[{name:`objectName`,type:`string`,required:!0},{name:`mode`,type:`enum`,enum:[`create`,`edit`]},{name:`sections`,type:`array`},{name:`details`,type:`array`,required:!0},{name:`recordId`,type:`string`,description:"The parent record to load in `edit` mode. Leave unset for `create`."},{name:`formType`,type:`enum`,enum:[`simple`,`tabbed`],description:`How the PARENT half of the form is presented. The detail grids below it are unaffected.`},{name:`fields`,type:`array`,description:"Which parent fields to show, in order — and it is NOT ignored when `sections` is given: the two INTERSECT. The parent field pool is built from this key first and every section then resolves its own members against that pool, so a section member this key does not list is dropped from the rendered form, and a section that loses EVERY member that way disappears with its heading. Each such drop is reported once via `console.warn` (objectui#9884); it is not repaired, because this key bounds what the form DRAWS and edits, not what Save writes: on a create, the submitted set is the drawn fields plus any parent value seeded through `initialValues` (or its alternate spelling `initialData`), drawn or not. A seed for an undeclared, server-owned, computed or read-only field is still stripped, as on any save. Author one or the other, or list every section member here too. Members are bare field names; NOT the spec `FormFieldSchema` object `sections[].fields` accepts (identity key `field`) — that shape resolves to no name here and is silently skipped (the parent form renders through the same `ObjectForm` / `SimpleObjectForm` as `object-form` — see its `fields` description)."},{name:`title`,type:[`string`,`object`],description:'Names the record in the built-in "… saved" toast after an edit save, which shows only when the host supplies no `onSuccess`. Accepts either a plain string or an inline per-locale map (`{ en: "Purchase order", "zh-CN": "采购单" }`) — the `I18nLabel` union the contract admits on this key — and the renderer resolves the map against the active UI language, falling back through base language, a region-qualified sibling, `default`, then `en`, and finally to any remaining entry.'},{name:`submitText`,type:[`string`,`object`],description:'Label of the button that saves the parent and every detail row in one batch. Defaults to "Save" when editing a record (`mode: "edit"` with a `recordId`) and to "Create" otherwise, in the active UI language; an empty string, or a map no locale limb resolves, shows the default too. Accepts either a plain string or an inline per-locale map (`{ en: "Save order", "zh-CN": "保存订单" }`), resolved against the active UI language with the same fallback chain as `title`.'},{name:`cancelText`,type:[`string`,`object`],description:'Label of the Cancel button, which renders only when the host supplies an `onCancel` callback (a runtime slot, not authorable in a JSON document). Defaults to "Cancel", in the active UI language; an empty string, or a map no locale limb resolves, shows the default too. Accepts either a plain string or an inline per-locale map (`{ en: "Back", "zh-CN": "返回" }`), resolved against the active UI language with the same fallback chain as `title`.'},{name:`showSubmit`,type:`boolean`},{name:`initialValues`,type:`object`,description:"Values to prefill on the PARENT record in `create` mode."},{name:`initialData`,type:`object`,description:"Alternate spelling of `initialValues` the renderer also reads: the `parentSchema` memo carries both keys onto the parent form, which merges them PER MEMBER with this one winning. Prefer `initialValues` in new schemas."},{name:`taxRateField`,type:`string`,description:`Name of the field ON THE CHILD object that holds each line’s tax rate. Feeds the line-items totals row; leave unset when the detail rows carry no tax.`}]});var ir={object:`childObject`,filter:!0,sort:!0,limit:`limit`},ar=(0,n.elementDataSourceBlock)(({schema:e})=>(0,d.jsx)(r.ElementDataSourceGate,{schema:e,mapping:ir,testId:`record-line-items`,errorTitle:`This line-items panel’s data source could not be resolved`,children:e=>(0,d.jsx)(er,{schema:e})}));n.ComponentRegistry.register(`line_items`,ar,{namespace:`record`,skipFallback:!0,label:`Line Items`,category:`record`,inputs:[{name:`childObject`,type:`string`,required:!0},{name:`relationshipField`,type:`string`,required:!0},{name:`columns`,type:`array`,required:!0},{name:`totalField`,type:`string`},{name:`amountField`,type:`string`},{name:`parentObject`,type:`string`,description:"The PARENT object the line total is written to on Save, together with `totalField`. Defaults to the object of the record the page shows, and outranks it when set. With neither, Save writes the lines alone and no parent field."},{name:`parentId`,type:`string`,description:"The parent record whose lines the panel lists and saves: it loads `childObject` rows whose `relationshipField` equals this id, and a line added in the grid is saved with this id in `relationshipField`. Outranks `recordId` and the record the page shows; leave it unset on a record page, where the record shown is the parent. With no parent id at all the panel asks the user to save the record first and loads nothing."},{name:`recordId`,type:`string`,description:"The parent record id, read only when `parentId` is unset. It outranks the record the page shows."},{name:`title`,type:`string`,description:`Heading of the panel. Defaults to "Line Items" in the active UI language. A plain string, drawn as authored.`},{name:`readonly`,type:`boolean`,description:`Shows the lines without editing: no Save button, no Add line / Duplicate row / Remove row actions, and the grid draws a read-only table.`},{name:`minRows`,type:`number`,description:`Fewest lines the user can leave: every line's Remove row action is disabled while the grid holds this many lines or fewer. It adds no blank lines to reach the number.`},{name:`maxRows`,type:`number`,description:`Most lines the user can hold: at this many lines Add line and Duplicate row are disabled and the trailing blank entry row is not drawn.`},{name:`filter`,type:`array`,of:`object`,description:"Additional criteria for the lines, as spec `ViewFilterRule` entries (`[{ field, operator, value }]`). AND-combined with the parent relationship condition, never a replacement for it: it can only narrow this record's lines. Also the key a per-element `dataSource` binding's composed filter lands on."},{name:`sort`,type:`array`,of:`object`,description:"Load order for the lines, as `[{ field, order }]` entries applied in list order; `order` is `asc` or `desc`. Without it the lines arrive in storage order."},{name:`limit`,type:`number`,description:`Most lines loaded (default 500). The grid has no pagination: every loaded line is editable and saved as one batch, and lines past the cap are not loaded. Must be a positive integer: any other value is ignored, with a console warning.`}]}),e.DrawerForm=mn,e.EmbeddableForm=Kn,e.FormAnalytics=Jn,e.FormSectionContainer=rt,e.LineItemsPanel=er,e.MasterDetailForm=tn,e.ModalForm=Dn,e.ObjectForm=jn,e.SplitForm=lt,e.TabbedForm=nt,e.WizardForm=ct,e.applyAutoColSpan=De,e.applyAutoLayout=Pe,e.containerGridColsFor=Me,e.deriveColumns=jt,e.deriveDetail=Ht,e.deriveFormFields=It,e.filterAutoGeneratedFields=Ae,e.filterCreateModeFields=ke,e.filterSystemFields=Oe,e.findRelationshipField=Et,e.inferColumns=we,e.inferModalSize=Ne,e.isAutoGeneratedFieldType=Ce,e.isRequiredInForm=M,e.isWideFieldType=Se,e.omitServerResolvedDefaults=I,e.resolveInlineMode=zt,e.resolveSectionGroupReferences=xn});