@object-ui/plugin-form 17.6.0 → 18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +4991 -0
  2. package/README.md +522 -80
  3. package/dist/DrawerForm.d.ts +42 -3
  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 +79 -38
  10. package/dist/MasterDetailForm.d.ts.map +1 -1
  11. package/dist/ModalForm.d.ts +60 -5
  12. package/dist/ModalForm.d.ts.map +1 -1
  13. package/dist/ObjectForm.d.ts.map +1 -1
  14. package/dist/SplitForm.d.ts +49 -3
  15. package/dist/SplitForm.d.ts.map +1 -1
  16. package/dist/TabbedForm.d.ts +75 -5
  17. package/dist/TabbedForm.d.ts.map +1 -1
  18. package/dist/WizardForm.d.ts +145 -38
  19. package/dist/WizardForm.d.ts.map +1 -1
  20. package/dist/autoLayout.d.ts +113 -8
  21. package/dist/autoLayout.d.ts.map +1 -1
  22. package/dist/closedAffordanceNotice.d.ts +14 -0
  23. package/dist/closedAffordanceNotice.d.ts.map +1 -0
  24. package/dist/customFieldsMerge.d.ts +29 -0
  25. package/dist/customFieldsMerge.d.ts.map +1 -0
  26. package/dist/deriveMasterDetail.d.ts +82 -29
  27. package/dist/deriveMasterDetail.d.ts.map +1 -1
  28. package/dist/fieldGroups.d.ts +189 -0
  29. package/dist/fieldGroups.d.ts.map +1 -1
  30. package/dist/fieldWriteGate.d.ts +136 -0
  31. package/dist/fieldWriteGate.d.ts.map +1 -0
  32. package/dist/flatFields.d.ts +11 -2
  33. package/dist/flatFields.d.ts.map +1 -1
  34. package/dist/formChrome.d.ts +55 -0
  35. package/dist/formChrome.d.ts.map +1 -0
  36. package/dist/index.d.ts +149 -26
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +3984 -2332
  39. package/dist/index.umd.cjs +1 -1
  40. package/dist/initialFieldFocus.d.ts +23 -0
  41. package/dist/initialFieldFocus.d.ts.map +1 -0
  42. package/dist/initialRecord.d.ts +72 -0
  43. package/dist/initialRecord.d.ts.map +1 -0
  44. package/dist/loadFailure.d.ts +28 -0
  45. package/dist/loadFailure.d.ts.map +1 -0
  46. package/dist/masterDetailTx.d.ts.map +1 -1
  47. package/dist/occSave.d.ts +6 -1
  48. package/dist/occSave.d.ts.map +1 -1
  49. package/dist/recordInvalidation.d.ts +33 -0
  50. package/dist/recordInvalidation.d.ts.map +1 -0
  51. package/dist/recordReadGate.d.ts +34 -0
  52. package/dist/recordReadGate.d.ts.map +1 -0
  53. package/dist/sanitize.d.ts +272 -5
  54. package/dist/sanitize.d.ts.map +1 -1
  55. package/dist/schemaDefaults.d.ts +104 -9
  56. package/dist/schemaDefaults.d.ts.map +1 -1
  57. package/dist/sectionFields.d.ts +67 -2
  58. package/dist/sectionFields.d.ts.map +1 -1
  59. package/dist/sectionGroups.d.ts +62 -0
  60. package/dist/sectionGroups.d.ts.map +1 -0
  61. package/dist/sectionPredicateDiagnostic.d.ts +38 -0
  62. package/dist/sectionPredicateDiagnostic.d.ts.map +1 -0
  63. package/dist/submitTarget.d.ts +136 -0
  64. package/dist/submitTarget.d.ts.map +1 -0
  65. package/dist/successBehavior.d.ts +44 -25
  66. package/dist/successBehavior.d.ts.map +1 -1
  67. package/dist/thankYouRedirectCountdown.d.ts +1 -1
  68. package/dist/uploadGate.d.ts +35 -0
  69. package/dist/uploadGate.d.ts.map +1 -0
  70. package/dist/writePayload.d.ts +87 -0
  71. package/dist/writePayload.d.ts.map +1 -0
  72. 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("@objectstack/spec/ui"),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`,`@objectstack/spec/ui`,`@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._objectstack_spec_ui,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,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){try{return typeof window>`u`?!1:new URL(e,window.location.href).origin===window.location.origin}catch{return!1}}function b(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 y(r)?r:null}var x=/\{\{record\.([a-z_][a-z0-9_]*)\}\}/g;function S(e){return e==null?``:typeof e==`string`?e:typeof e==`boolean`||typeof e==`number`&&Number.isFinite(e)?String(e):``}function C(e,t){let n=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:{};return{...n(e),...n(t)}}function w(e,t){let n=o.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(x,(e,n)=>encodeURIComponent(S(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 T(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])}var E=`https://a.invalid/`,D=`https://b.invalid/`;function O(e){try{return new URL(e,E).origin===`https://a.invalid`&&new URL(e,D).origin===`https://b.invalid`}catch{return!1}}function k(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=O(e.url)?i.current:void 0;if(t){t(e.url);return}window.location.href=e.url},e.delayMs);return()=>clearTimeout(t)},[e])}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,c.isCurrentUserDefaultToken)(e.defaultValue)?!1:e.type===`user`||e.type===`lookup`&&(e.reference===`sys_user`||e.reference_to===`sys_user`)}function F(e,t,n){return{...N(e,n),...t??{}}}function ee(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 I(e,t){return typeof t==`string`&&t.trim()||typeof t==`object`&&t&&typeof t.source==`string`&&t.source.trim()?{...e,visibleOn:t}:e}var L=new Set;function R(e,t){if(typeof e.name!=`string`||e.name===e.field)return;let n=`${t}:${e.field}:${e.name}`;L.has(n)||(L.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 z(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:M(n,j(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 B(e,t){if(typeof e==`string`){let n=t.objectSchema?.fields?.[e];return I(z(e,t),n?.visible_on??n?.visibleOn)}let n=e;if(typeof n.field!=`string`)return I(n,n.visibleOn);R(n,t.objectName);let r=n.field,a=z(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=M({required:n.required,defaultValue:t.objectSchema?.fields?.[r]?.defaultValue},j(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),I(a,n.visibleWhen??n.visibleOn)}function te(e,t){return(e.fields??[]).map(e=>B(e,t))}var V=new Set([`field:formula`,`field:summary`,`field:auto_number`,`field:autonumber`]),ne=new Set([`field:textarea`,`field:markdown`,`field:html`,`field:grid`,`field:richtext`,`textarea`,`markdown`,`html`,`grid`,`richtext`]),re=new Set([`formula`,`summary`,`auto_number`,`autonumber`]);function H(e){return ne.has(e)}function U(e){return re.has(e)}function ie(e){return e<=3?1:e<=8?2:e<=15?3:4}function W(e){return e&&e>0?Math.min(Math.floor(e),4):1}function G(e,t,n){let r=W(t);return r<=1?1:e.span===`full`?r:e.colSpan==null?e.type&&H(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 K(e,t,n){let r=W(t);return r<=1?e:e.map(e=>{if(e.type===`section-divider`)return e;let t=G(e,r,n);return t>1?{...e,colSpan:t}:e.colSpan!=null&&e.colSpan!==1?{...e,colSpan:1}:e})}var ae=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 oe(e,t){return e.filter(e=>{if(ae.has(e.name))return!1;let n=t?.fields?.[e.name];return n?.hidden!==!0&&n?.readonly!==!0})}function q(e,t){return e.filter(e=>{if(ae.has(e.name)||e.type&&V.has(e.type))return!1;if(!t?.fields)return!0;let n=t.fields[e.name];return!n||n.readonly!==!0&&!U(n.type)})}function se(e,t){return e.filter(e=>{if(e.type&&V.has(e.type))return!1;let n=t?.fields?.[e.name];return!n||!U(n.type)})}var J={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 Y(e){return J[e&&e>0?Math.min(Math.floor(e),4):1]}function ce(e){return e<=1?`default`:e===2?`xl`:`full`}function le(e,t,n,r){let i=[...e];if(i=oe(i,t),r===`create`&&(i=se(i,t)),n!==void 0)return i=K(i,n),{fields:i,columns:n};let a=ie(i.length);return i=K(i,a),{fields:i,columns:a}}var X=(0,u.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 Z(e){let t=e?.updated_at;return typeof t==`string`&&t.length>0?t:void 0}function Q(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.code===`CONCURRENT_UPDATE`||t.name===`ConcurrentUpdateError`}function ue(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 de(){let{t:e}=X(),[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=Z(o);try{return{status:`saved`,result:await e.update(t,n,a,s?{ifMatch:s}:void 0)}}catch(o){if(!Q(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)}}},[]),c=ue(n?.currentVersion);return{saveWithOcc:s,conflictDialog:(0,d.jsx)(a.AlertDialog,{open:!!n,onOpenChange:e=>{e||o(!1)},children:(0,d.jsxs)(a.AlertDialogContent,{children:[(0,d.jsxs)(a.AlertDialogHeader,{children:[(0,d.jsxs)(a.AlertDialogTitle,{className:`flex items-center gap-2`,children:[(0,d.jsx)(l.AlertTriangle,{className:`h-5 w-5 text-amber-500`,"aria-hidden":!0}),e(`form.conflictTitle`)]}),(0,d.jsxs)(a.AlertDialogDescription,{children:[e(`form.conflictMessage`),c&&(0,d.jsx)(`span`,{className:`mt-2 block text-xs text-muted-foreground`,children:e(`form.conflictLatestVersion`,{time:c})})]})]}),(0,d.jsxs)(a.AlertDialogFooter,{children:[(0,d.jsx)(`button`,{type:`button`,className:(0,a.cn)((0,a.buttonVariants)({variant:`outline`})),onClick:()=>o(!1),children:e(`form.keepEditing`)}),(0,d.jsx)(`button`,{type:`button`,className:(0,a.cn)((0,a.buttonVariants)({variant:`destructive`})),onClick:()=>o(!0),children:e(`form.conflictOverwrite`)})]})]})})}}var $=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),{userId:c}=(0,s.usePermissions)(),[l,u]=(0,t.useState)(null),[f,p]=(0,t.useState)({}),{saveWithOcc:m,conflictDialog:h}=de(),[g,_]=(0,t.useState)(!0),[v,y]=(0,t.useState)(null),b=e.defaultTab||e.sections[0]?.name||e.sections[0]?.label||`tab-0`;t.default.useEffect(()=>{(async()=>{if(!n){_(!1);return}try{let t=await n.getObjectSchema(e.objectName);u(t)}catch(e){y(e)}})()},[e.objectName,n]);let x=(0,t.useRef)(void 0);t.default.useEffect(()=>{let t=!1;return(l||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){p(F(l,e.initialData||e.initialValues,{currentUserId:c})),_(!1);return}x.current!==e.recordId&&_(!0);try{let r=await n.findOne(e.objectName,e.recordId);if(t)return;x.current=e.recordId,p(r||{})}catch(e){if(t)return;y(e)}finally{t||_(!1)}})(),()=>{t=!0}},[l,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let S=(0,t.useCallback)(t=>te(t,{objectSchema:l,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:o}),[l,e.readOnly,e.mode,e.recordId,e.objectName,o]),C=(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,ee(t,l));else if(e.mode===`edit`&&e.recordId){let i=await m({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:t,baseRecord:f});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,m,f]),w=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),T=(e,t)=>e.name||e.label||`tab-${t}`;if(v)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:`Error loading form`}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:v.message})]});if(g)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:`Loading form...`})]});let E=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,D=e.sections.map(e=>E(e.columns)).filter(e=>e!=null),O=E(e.columns)??(D.length?Math.max(...D):1),k=Y(O),A=e.sections.map((e,t)=>{let n=S(e);return{key:T(e,t),label:e.label||`Tab ${t+1}`,description:e.description,containerClass:e.gridClassName,fields:O>1?K(n,O,E(e.columns)):n}}),j=A.flatMap(e=>e.fields);return(0,d.jsxs)(`div`,{className:(0,a.cn)(`w-full @container`,i,e.className),children:[(0,d.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:j,columns:O,...k?{fieldContainerClass:k}:{},layout:`vertical`,defaultValues:f,previousValues:e.mode===`edit`&&e.recordId?f: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:C,onCancel:w,fieldTabs:A.map(e=>({key:e.key,label:e.label,description:e.description,fields:e.fields.map(e=>e.name),containerClass:e.containerClass})),defaultFieldTab:b,fieldTabsPosition:e.tabPosition||`top`}}),h]})},fe=({label:e,description:n,collapsible:r=!1,collapsed:i=!1,columns:o=1,children:s,className:c,gridClassName:u,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,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,d.jsx)(`span`,{className:`mt-0.5 text-muted-foreground`,children:p?(0,d.jsx)(l.ChevronRight,{className:`h-4 w-4`}):(0,d.jsx)(l.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,a.cn)(`grid gap-4`,u||h[o]),children:s});return _?(0,d.jsxs)(a.Card,{className:(0,a.cn)(`form-section bg-muted/40 shadow-none`,c),children:[v&&(0,d.jsx)(a.CardHeader,{className:`border-b border-border pb-3`,children:v}),y&&(0,d.jsx)(a.CardContent,{className:`pt-4`,children:y})]}):(0,d.jsxs)(`div`,{className:(0,a.cn)(`form-section`,c),children:[v,y]})},pe="The `navigateOnSuccess` destination declared for this form was refused, so the navigation did not happen.",me=(0,u.createSafeTranslation)({"wizard.missingRequired":`Please complete the required fields: {{fields}}`},`wizard.missingRequired`),he=n.isMissingForRequired,ge=({schema:e,dataSource:i,className:o})=>{let{fieldLabel:c}=(0,r.useSafeFieldLabel)(),{userId:u}=(0,s.usePermissions)(),{t:f}=me(),[p,m]=(0,t.useState)(null),[h,g]=(0,t.useState)({}),[_,v]=(0,t.useState)(void 0),{saveWithOcc:y,conflictDialog:x}=de(),[S,E]=(0,t.useState)(!0),[D,k]=(0,t.useState)(null),[A,M]=(0,t.useState)(0),[N,P]=(0,t.useState)(new Set),[I,L]=(0,t.useState)(!1),[R,z]=(0,t.useState)(new Set),[B,V]=(0,t.useState)(null),[ne,re]=(0,t.useState)(null);T(ne);let H=t.default.useId(),[U,ie]=(0,t.useState)(0),W=t.default.useRef(!1),G=e.sections.length,ae=A===0,oe=A===G-1;t.default.useEffect(()=>{(async()=>{if(!i){E(!1);return}try{let t=await i.getObjectSchema(e.objectName);m(t)}catch(e){k(e)}})()},[e.objectName,i]),t.default.useEffect(()=>{(p||!i)&&(async()=>{if(e.mode===`create`||!e.recordId||!i){W.current||=(g(F(p,e.initialData||e.initialValues,{currentUserId:u})),!0),E(!1);return}try{let t=await i.findOne(e.objectName,e.recordId);g(t||{}),v(t||{})}catch(e){k(e)}finally{E(!1)}})()},[p,e.mode,e.recordId,e.initialData,e.initialValues,i,e.objectName]);let q=(0,t.useCallback)(t=>te(t,{objectSchema:p,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:c}),[p,e.readOnly,e.mode,e.recordId,e.objectName,c]),se=j(e),J=(0,t.useMemo)(()=>A>=0&&A<G?q(e.sections[A]):[],[A,G,e.sections,q]),ce=(0,t.useCallback)(t=>{let r=new Map;return e.sections.forEach((e,i)=>{for(let a of q(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,serverOwnedValue:(0,n.isServerOwnedValue)(a,se)},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||he(t[e])&&r.set(i,[...r.get(i)??[],a.label||e])}}),r},[e.sections,q,se]),le=(0,t.useCallback)(async t=>{let n={...h,...t};if(g(n),P(e=>new Set(e).add(A)),z(e=>{if(!e.has(A))return e;let t=new Set(e);return t.delete(A),t}),oe){let t=ce(n);if(t.size>0){z(new Set(t.keys()));let e=[...t.values()].flat();a.toast.error(f(`wizard.missingRequired`,{fields:e.slice(0,3).join(`, `)+(e.length>3?`…`:``)})),X(Math.min(...t.keys()));return}z(new Set),L(!0);try{if(!i)return e.onSuccess&&await e.onSuccess(n),n;let t;if(e.mode===`create`)t=await i.create(e.objectName,ee(n,p));else if(e.mode===`edit`&&e.recordId){let r=await y({dataSource:i,objectName:e.objectName,recordId:e.recordId,payload:n,baseRecord:h});if(r.status===`cancelled`)return;t=r.result}if(e.onSuccess)await e.onSuccess(t);else if(e.submitBehavior){let r=e.submitBehavior;switch(r.kind){case`redirect`:{let i=w(r.url,C(n,t));if(!i.ok){a.toast.error(i.refusal),V({message:e.successMessage||(e.mode===`create`?`Created`:`Saved`),refusal:i.refusal});break}re({url:i.url,delayMs:r.delayMs??0});break}case`continue`:g(F(p,e.initialData||e.initialValues,{currentUserId:u})),P(new Set),M(0),ie(e=>e+1);break;default:{let t=r.kind===`thank-you`&&r.message?r.message:e.successMessage||(e.mode===`create`?`Created`:`Saved`);a.toast.success(t),V({title:r.kind===`thank-you`?r.title:void 0,message:t});break}}}else{let n=b(e.navigateOnSuccess,t);if(n)return O(n)?re({url:n,delayMs:0}):window.location.assign(n),t;e.navigateOnSuccess?(console.warn("[WizardForm] `navigateOnSuccess` was declared but produced no destination:",e.navigateOnSuccess),a.toast.success(e.successMessage||(e.mode===`create`?`Created`:`Saved`),{description:pe})):a.toast.success(e.successMessage||(e.mode===`create`?`Created`:`Saved`)),e.resetOnSuccess&&e.mode===`create`&&(g(F(p,e.initialData||e.initialValues,{currentUserId:u})),P(new Set),M(0),ie(e=>e+1))}return t}catch(t){throw e.onError&&e.onError(t),t}finally{L(!1)}}X(A+1)},[h,A,oe,e,p,i,ce,f,y]),X=(0,t.useCallback)(t=>{t>=0&&t<G&&(M(t),e.onStepChange&&e.onStepChange(t))},[G,e]),Z=(0,t.useCallback)(()=>{X(A-1)},[A,X]),Q=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),ue=(0,t.useCallback)(t=>{(e.allowSkip||N.has(t)||t<=A)&&X(t)},[e.allowSkip,N,A,X]);if(D)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:`Error loading form`}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:D.message})]});if(S)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:`Loading form...`})]});if(B)return(0,d.jsxs)(`div`,{className:(0,a.cn)(`w-full space-y-4`,o,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:B.title??`Thanks!`}),B.message&&(0,d.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:B.message})]}),B.refusal&&(0,d.jsx)(`div`,{role:`alert`,className:`rounded-md border border-destructive/40 bg-destructive/10 p-4 text-sm text-destructive`,children:B.refusal})]});let $=e.sections[A],ge=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,_e=ge(e.columns)??ge($?.columns)??1,ve=Y(_e);return(0,d.jsxs)(`div`,{className:(0,a.cn)(`w-full @container`,o,e.className),children:[e.showStepIndicator!==!1&&(0,d.jsx)(`nav`,{"aria-label":`Progress`,className:`mb-8`,children:(0,d.jsx)(`ol`,{className:`flex items-center`,children:e.sections.map((t,n)=>{let r=n===A,i=N.has(n),o=e.allowSkip||i||n<=A,s=R.has(n);return(0,d.jsxs)(`li`,{className:(0,a.cn)(`relative flex-1`,n!==G-1&&`pr-8 sm:pr-12`),children:[n!==G-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,a.cn)(`h-full`,i?`bg-primary`:`bg-muted`)})}),(0,d.jsxs)(`button`,{type:`button`,className:(0,a.cn)(`group relative flex items-center`,o?`cursor-pointer`:`cursor-not-allowed`),onClick:()=>ue(n),disabled:!o,"data-testid":`wizard-step:${t.name||n}`,"data-error":s||void 0,children:[(0,d.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,d.jsx)(l.AlertCircle,{className:`h-3 w-3 sm:h-4 sm:w-4`,"aria-hidden":!0}):i?(0,d.jsx)(l.Check,{className:`h-3 w-3 sm:h-4 sm:w-4`}):n+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,a.cn)(s?`text-destructive`:r?`text-foreground`:`text-muted-foreground`),children:t.label||`Step ${n+1}`})})]})]},n)})})}),(0,d.jsx)(`div`,{className:`min-h-[200px]`,children:$&&(0,d.jsx)(fe,{label:$.label,description:$.description,columns:1,className:$.className,gridClassName:$.gridClassName,children:J.length>0?(0,d.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,id:H,fields:_e>1?K(J,_e,ge($.columns)):J,columns:_e,...ve?{fieldContainerClass:ve}:{},layout:`vertical`,defaultValues:h,previousValues:e.mode===`edit`?_:void 0,showSubmit:!1,showCancel:!1,onSubmit:le}},U):(0,d.jsx)(`form`,{id:H,onSubmit:e=>{e.preventDefault(),le({})},children:(0,d.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:`No fields configured for this step`})})})}),(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)(a.Button,{variant:`ghost`,onClick:Q,children:e.cancelText||`Cancel`})}),(0,d.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,d.jsxs)(`span`,{className:`text-sm text-muted-foreground mr-2`,children:[`Step `,A+1,` of `,G]}),!ae&&(0,d.jsxs)(a.Button,{variant:`outline`,onClick:Z,children:[(0,d.jsx)(l.ChevronLeft,{className:`h-4 w-4 mr-1`}),e.prevText||`Back`]}),oe?(0,d.jsxs)(a.Button,{type:`submit`,form:H,disabled:I||e.mode===`view`,children:[I&&(0,d.jsx)(l.Loader2,{className:`mr-2 h-4 w-4 animate-spin`,"aria-hidden":!0}),I?`Submitting...`:e.submitText||(e.mode===`create`?`Create`:`Update`)]}):(0,d.jsxs)(a.Button,{type:`submit`,form:H,children:[e.nextText||`Next`,(0,d.jsx)(l.ChevronRight,{className:`h-4 w-4 ml-1`})]})]})]}),x]})},_e=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o}=(0,r.useSafeFieldLabel)(),{userId:c}=(0,s.usePermissions)(),[l,u]=(0,t.useState)(null),[f,p]=(0,t.useState)({}),{saveWithOcc:m,conflictDialog:h}=de(),[g,_]=(0,t.useState)(!0),[v,y]=(0,t.useState)(null);(0,t.useEffect)(()=>{(async()=>{if(!n){_(!1);return}try{let t=await n.getObjectSchema(e.objectName);u(t)}catch(e){y(e),_(!1)}})()},[e.objectName,n]);let b=(0,t.useRef)(void 0);(0,t.useEffect)(()=>{let t=!1;return(l||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){p(F(l,e.initialData||e.initialValues,{currentUserId:c})),_(!1);return}if(!n){p(e.initialData||e.initialValues||{}),_(!1);return}b.current!==e.recordId&&_(!0);try{let r=await n.findOne(e.objectName,e.recordId);if(t)return;b.current=e.recordId,p(r||{})}catch(e){if(t)return;y(e)}finally{t||_(!1)}})(),()=>{t=!0}},[l,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let x=(0,t.useCallback)(t=>te(t,{objectSchema:l,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:o}),[l,e.readOnly,e.mode,e.recordId,e.objectName,o]),S=(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,ee(t,l));else if(e.mode===`edit`&&e.recordId){let i=await m({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:t,baseRecord:f});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,m,f]),C=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),w=(e,t)=>e.pane===`primary`||e.pane===`secondary`?e.pane:t===0?`primary`:`secondary`,T=(0,t.useMemo)(()=>e.sections.filter((e,t)=>w(e,t)===`primary`),[e.sections]),E=(0,t.useMemo)(()=>e.sections.filter((e,t)=>w(e,t)===`secondary`),[e.sections]),D=e.splitDirection||`horizontal`,O=e.splitSize||50;if(v)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:`Error loading form`}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:v.message})]});if(g)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:`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=Y(j),N=(e,t)=>{let n=[];return e.forEach((e,r)=>{let i=x(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?K(i,j,k(e.columns)):i))}),n},P=[{key:`primary`,sections:T,defaultSize:O},{key:`secondary`,sections:E,defaultSize:100-O}].map(e=>({...e,fields:N(e.sections,e.key),containerClass:e.sections.length===1?e.sections[0].gridClassName:void 0})).filter(e=>e.fields.length>0);return(0,d.jsxs)(`div`,{className:(0,a.cn)(`w-full @container`,i,e.className),children:[(0,d.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:P.flatMap(e=>e.fields),columns:j,...M?{fieldContainerClass:M}:{},layout:`vertical`,defaultValues:f,previousValues:e.mode===`edit`&&e.recordId?f: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:S,onCancel:C,fieldPanes:P.map(e=>({key:e.key,fields:e.fields.map(e=>e.name),defaultSize:e.defaultSize,...e.containerClass?{containerClass:e.containerClass}:{}})),fieldPanesOrientation:D,fieldPanesResizable:e.splitResizable!==!1}}),h]})},ve=new Set([`id`,`_id`,`created_at`,`updated_at`,`createdAt`,`updatedAt`,`organization_id`,`organizationId`]),ye=new Set([`formula`,`summary`,`rollup`,`lookup_value`,`auto_number`,`autonumber`,`computed`]);function be(e,t){if(!e||typeof e!=`object`)return e;let n={},r=t?.fields;for(let[t,i]of Object.entries(e))if(!ve.has(t)){if(r){let e=r[t];if(!e)continue;let n=String(e.type||``).toLowerCase();if(ye.has(n)||e.computed===!0||e.formula||e.readOnly===!0||e.readonly===!0)continue}n[t]=i}return n}var xe=e=>e==null?void 0:e.id??e._id??e.recordId,Se=(e,t)=>t?be(e,t):e,Ce=new Set([`id`,`_id`,`recordId`]);function we(e,t){return!e||Object.entries(e).every(([e,n])=>e===t||Ce.has(e)?!0:n==null||n===``)}function Te(e,t,n){let r=[{object:e,action:`create`,data:t}];for(let e of n)for(let t of e.rows)we(t,e.relationshipField)||r.push({object:e.childObject,action:`create`,data:{...Se(t,e.childSchema),[e.relationshipField]:{$ref:0}}});return r}function Ee(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}=De(e.original||[],n);for(let t of r){if(we(t,e.relationshipField))continue;let{id:n,_id:r,recordId:a,...o}=t;i.push({object:e.childObject,action:`create`,data:Se(o,e.childSchema)})}for(let t of a)i.push({object:e.childObject,action:`update`,id:xe(t),data:Se(t,e.childSchema)});for(let t of o)i.push({object:e.childObject,action:`delete`,id:t})}return i}function De(e,t){let n=new Set(t.map(xe).filter(Boolean));return{toCreate:t.filter(e=>!xe(e)),toUpdate:t.filter(e=>xe(e)),toDelete:(e||[]).map(xe).filter(e=>!!e&&!n.has(e))}}function Oe(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 ke=new Set([`id`,`_id`,`recordId`,`created_at`,`updated_at`,`created_by`,`updated_by`,`createdAt`,`updatedAt`,`createdBy`,`updatedBy`,`organization_id`,`tenant_id`,`space`,`owner`]),Ae=new Set([`position`,`sort_order`,`sequence`,`line_no`,`line_number`,`sort`]),je=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`,`json`,`object`,`grid`,`table`,`location`,`vector`,`html`,`markdown`,`richtext`]);function Me(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 Ne=new Set([`image`,`avatar`]);function Pe(e,t){e.multiple==null&&t?.multiple&&(e.multiple=!0),e.accept??(Array.isArray(t?.accept)&&t.accept.length>0?e.accept=t.accept:Ne.has(t?.type)&&(e.accept=[`image/*`]))}function Fe(e){if(e?.type===`boolean`||e?.type===`toggle`)return[{label:`Yes`,value:`true`},{label:`No`,value:`false`}];let t=e?.options;if(Array.isArray(t))return t.map(e=>typeof e==`object`&&e?{label:String(e.label??e.value),value:String(e.value)}:{label:String(e),value:String(e)})}function Ie(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 Le=[`name`,`title`,`subject`,`label`,`full_name`,`display_name`,`code`],Re={select:0,currency:1,number:1,lookup:2,date:3,datetime:3,time:3,text:4};function ze(e){return(e.type?Re[e.type]:void 0)??5}function Be(e,t){if(t<=0||e.length<=t)return e;let n=new Set,r=e.find(e=>Le.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)=>ze(e.c)-ze(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 Ve(e,t={}){let n=e?.fields;if(!n||typeof n!=`object`)return[];let r=new Set([...t.exclude??[],...t.relationshipField?[t.relationshipField]:[]]),i=[];for(let[e,t]of Object.entries(n)){let n=t;if(ke.has(e)||r.has(e)||Ae.has(e)||n?.system||n?.readonly||n?.hidden||je.has(n?.type))continue;let a={name:e,label:n?.label||e,type:Me(n?.type),required:!!n?.required},o=Fe(n);a.type===`select`&&o&&(a.options=o),a.type===`lookup`&&(a.reference=n?.reference,a.displayField=n?.display_field||n?.reference_field),a.type===`file`&&Pe(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 Be(i,t.maxColumns??6)}function He(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.name];if(!t)return e;let n=Me(t?.type),i={...e,type:n};i.label??=t?.label||e.name,i.required??=!!t?.required;let a=Fe(t);n===`select`&&a&&!i.options&&(i.options=a),n===`lookup`&&(i.reference??=t?.reference,i.displayField??=t?.display_field||t?.reference_field),n===`file`&&Pe(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 Ue=new Set([`formula`,`summary`,`rollup`,`autonumber`,`auto_number`]);function We(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;ke.has(e)||r.has(e)||Ae.has(e)||n?.system||n?.hidden||Ue.has(n?.type)||i.push(e)}return i}var Ge=new Set([`textarea`,`richtext`,`html`,`markdown`,`rich-text`,`json`,`location`,`address`]),Ke=new Set([`file`,`image`,`avatar`]);function qe(e,t,n={}){if(t===`grid`||t===`form`)return t;let r=e?.fields??{},i=We(e,{relationshipField:n.relationshipField});return i.some(e=>Ge.has(r[e]?.type))||i.filter(e=>Ke.has(r[e]?.type)).length>=2||i.length>8?`form`:`grid`}var Je=[`amount`,`total`,`subtotal`,`line_total`,`line_amount`,`net_amount`];function Ye(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=>Je.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 Xe(e,t,n,r={}){let i=r.relationshipField||Ie(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?He(r.columns,t):Ve(t,{relationshipField:i}),o=r.amountField||Ye(a);return{childObject:e,relationshipField:i,columns:a,formFields:We(t,{relationshipField:i}),mode:qe(t,r.inlineEdit??(t?.fields)?.[i]?.inlineEdit,{relationshipField:i}),amountField:o,sortField:Object.keys(t?.fields??{}).find(e=>Ae.has(e))}}function Ze(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 Qe=({details:e,state:n,setRows:r,formHostRef:a,taxRateField:o,formKey:s,onRowExpand:c,onAddViaForm:l})=>{let[u,f]=(0,t.useState)({}),p=(0,t.useRef)(``);(0,t.useEffect)(()=>{let e=a.current;if(!e)return;let t=()=>{let t=Ze(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=u[o],h=m===void 0?null:Number.isFinite(Number(m))?Number(m):0,g=e.reduce((e,t,r)=>e+Oe(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,d.jsxs)(d.Fragment,{children:[e.map((e,t)=>(0,d.jsxs)(`section`,{className:`space-y-2`,children:[(0,d.jsx)(`h3`,{className:`text-sm font-medium text-foreground`,children:e.title||`Line Items`}),e.columns?.length?(0,d.jsx)(i.LineItemsField,{value:n[t]?.rows??[],onChange:e=>r(t,e),contextRecord:u,...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,d.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,children:`Loading columns…`})]},`${e.childObject}-${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:`Subtotal`}),(0,d.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-subtotal`,children:x(g)})]}),(0,d.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,d.jsxs)(`dt`,{className:`text-muted-foreground`,children:[`Tax (`,v,`%)`]}),(0,d.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-tax`,children:x(y)})]}),(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:`Total`}),(0,d.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-grand-total`,children:x(b)})]})]})})]})},$e=({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,u]=(0,t.useState)(c?null:o),f=l??o;(0,t.useEffect)(()=>{if(!c){u(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:He(t.columns,n)};let i=Xe(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||u(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]=Oe(h.current[t]?.rows??[],e.amountField||`amount`))});let a=s?Ee(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]}))):Te(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]),ee=(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]),I=(0,t.useRef)(null),L=e.submitText??(s?`Save`:`Create`),R=(0,t.useCallback)(()=>{x.current||I.current?.querySelector(`form`)&&(x.current=!0,b(!0),setTimeout(()=>{(I.current?.querySelector(`form`))?.requestSubmit()},0),S.current=setTimeout(()=>C(),1500))},[C]);return(0,t.useEffect)(()=>()=>{S.current&&clearTimeout(S.current)},[]),(0,d.jsxs)(`div`,{className:(0,a.cn)(`space-y-6`,i,e.className),children:[(0,d.jsx)(`div`,{ref:I,children:(0,d.jsx)(lt,{schema:ee,dataSource:r},_)}),(0,d.jsx)(Qe,{details:f,state:p,setRows:w,formHostRef:I,taxRateField:T,formKey:_,onRowExpand:(e,t)=>D({detailIdx:e,rowIdx:t}),onAddViaForm:j}),E&&k&&(0,d.jsxs)(a.Card,{className:`border-primary/40 shadow-none ring-1 ring-primary/10`,"data-testid":`md-row-form`,children:[(0,d.jsxs)(a.CardHeader,{className:`pb-2 flex flex-row items-center justify-between gap-2 space-y-0`,children:[(0,d.jsxs)(a.CardTitle,{className:`text-sm font-medium`,children:[k.title||`Line item`,` — row `,E.rowIdx+1]}),(0,d.jsx)(a.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs text-muted-foreground`,onClick:M,children:`Close`})]}),(0,d.jsx)(a.CardContent,{children:(0,d.jsx)(lt,{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,d.jsxs)(`div`,{className:`flex items-center justify-end gap-2 border-t border-border pt-4`,children:[e.onCancel&&(0,d.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:e.onCancel,disabled:y,"data-testid":`md-form-cancel`,children:e.cancelText??`Cancel`}),(0,d.jsx)(a.Button,{type:`button`,onClick:R,disabled:y||c&&!l,"data-testid":`md-form-submit`,children:y?`Saving…`:L})]})]})};function et(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)continue;let i=e.objectSchema?.fields?.[t];i&&n.push({...z(t,e),group:i.group})}return n}function tt(e,t){let n=(0,c.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 nt={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`},rt=(0,u.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`),it=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o,sectionLabel:c}=(0,r.useSafeFieldLabel)(),{userId:u}=(0,s.usePermissions)(),{t:f}=rt(),p=(0,r.usePreviewMode)(),[m,h]=(0,t.useState)(null),[g,_]=(0,t.useState)([]),[v,y]=(0,t.useState)({}),[b,x]=(0,t.useState)(!0),[S,C]=(0,t.useState)(null),[w,T]=(0,t.useState)(!1),[E,D]=(0,t.useState)(!1),{saveWithOcc:O,conflictDialog:k}=de(),[A,j]=(0,t.useState)(!1),M=(0,t.useRef)(!1),N=e.confirmOnDiscard!==!1,P=e.open!==!1,I=e.drawerSide||`right`,L=(0,t.useId)(),[R,z]=(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){x(!1);return}try{let t=await n.getObjectSchema(e.objectName);h(t)}catch(e){C(e),x(!1)}})()},[e.objectName,n]);let B=(0,t.useRef)(void 0);(0,t.useEffect)(()=>{let t=!1;return(m||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){y(F(m,e.initialData||e.initialValues,{currentUserId:u})),x(!1);return}if(!n){y(e.initialData||e.initialValues||{}),x(!1);return}B.current!==e.recordId&&(x(!0),T(!1));try{let r=await n.findOne(e.objectName,e.recordId);if(t)return;B.current=e.recordId,y(r||{})}catch(e){if(t)return;C(e)}finally{t||x(!1)}})(),()=>{t=!0}},[m,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let V=(0,t.useCallback)(t=>te(t,{objectSchema:m,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:o}),[m,e.readOnly,e.mode,e.recordId,e.objectName,o]);(0,t.useEffect)(()=>{if(!(!m&&n)){if(e.customFields?.length){_(e.customFields),x(!1);return}if(e.sections?.length){x(!1);return}m&&(_(et({fields:e.fields,objectSchema:m,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:o})),x(!1))}},[m,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let ne=(0,t.useMemo)(()=>{if(e.sections?.length||e.customFields?.length)return null;let t=oe(g,m);e.mode===`create`&&(t=se(t,m));let n=tt(t,m?.fieldGroups);if(!n)return null;let r=e.columns&&e.columns>0?Math.min(Math.floor(e.columns),4):ie(t.length);return n.map(e=>({...e,columns:r}))},[e.sections,e.customFields,e.columns,e.mode,g,m]),re=(0,t.useCallback)(async t=>{j(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=be(t,m);if(e.mode===`create`)r=await n.create(e.objectName,ee(i,m));else if(e.mode===`edit`&&e.recordId){let t=await O({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:i,baseRecord:v});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,m,O,v]),H=(0,t.useCallback)(()=>{D(!1),M.current&&(M.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),U=(0,t.useCallback)(e=>{M.current=e,N&&w?D(!0):H()},[N,w,H]);(0,t.useEffect)(()=>{if(!P||!w||!N)return;let e=e=>{e.preventDefault(),e.returnValue=``};return window.addEventListener(`beforeunload`,e),()=>window.removeEventListener(`beforeunload`,e)},[P,w,N]);let W=(0,t.useCallback)(()=>{M.current=!0,H()},[H]),G=(0,t.useMemo)(()=>{if(e.drawerWidth)return I===`left`||I===`right`?{width:e.drawerWidth,maxWidth:e.drawerWidth}:{height:e.drawerWidth,maxHeight:e.drawerWidth}},[e.drawerWidth,I]),ae=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,q=e.showSubmit!==!1&&e.mode!==`view`,J=e.showCancel!==!1,Y=e.submitText||(e.mode===`create`?`Create`:`Update`),ce=e.cancelText||`Cancel`,X={type:`form`,objectName:e.objectName,layout:ae,defaultValues:v,previousValues:e.mode===`edit`&&e.recordId?v:void 0,submitLabel:Y,cancelLabel:ce,showSubmit:q,showCancel:J,onSubmit:re,onCancel:W,onDirtyChange:T,showActions:!1,id:L},Z=()=>{if(S)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:`Error loading form`}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:S.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:`Loading form...`})]});if(e.sections?.length){let t=[];return e.sections.forEach((e,n)=>{let r=e.name||String(n),i=R[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?()=>z(e=>({...e,[r]:!i})):void 0,className:e.className});let a=V(e);i?t.push(...a.map(e=>({...e,hidden:!0}))):t.push(...a)}),(0,d.jsx)(r.SchemaRenderer,{schema:{...X,fields:t}})}if(ne?.length){let t=Number(ne[0]?.columns)||1,n=[];ne.forEach((r,i)=>{let a=V(r);if(!a.length)return;let o=r.name||String(i),s=r.collapsible?R[o]??r.collapsed??!1:!1,l=r.name?c(e.objectName,r.name,r.label||r.name):r.label;l&&n.push({name:`__section_${o}`,label:l,type:`section-divider`,colSpan:4,collapsible:r.collapsible,collapsed:s,onToggle:r.collapsible?()=>z(e=>({...e,[o]:!s})):void 0});let u=t>1?K(a,t):a;n.push(...s?u.map(e=>({...e,hidden:!0})):u)});let i=nt[t];return(0,d.jsx)(r.SchemaRenderer,{schema:{...X,fields:n,columns:t,...i?{fieldContainerClass:i}:{}}})}let t=le(g,m,e.columns,e.mode),n=nt[t.columns||1];return(0,d.jsx)(r.SchemaRenderer,{schema:{...X,fields:t.fields,columns:t.columns,...n?{fieldContainerClass:n}:{}}})},Q=e.subforms,ue=Q?.length&&e.mode!==`view`?(0,d.jsx)($e,{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:ce,details:Q,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n}):Z();return p?(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})]}),ue]}):(0,d.jsx)(a.Sheet,{open:P,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}U(!1)},children:(0,d.jsxs)(a.SheetContent,{side:I,className:(0,a.cn)(`overflow-y-auto`,i,e.className),style:G,children:[(e.title||e.description)&&(0,d.jsxs)(a.SheetHeader,{children:[e.title&&(0,d.jsx)(a.SheetTitle,{children:e.title}),e.description?(0,d.jsx)(a.SheetDescription,{children:e.description}):(0,d.jsx)(a.SheetDescription,{className:`sr-only`,children:f(`form.dialogDescriptionFallback`)})]}),(0,d.jsx)(`div`,{className:`@container py-4`,children:ue}),!S&&!b&&!(Q?.length&&e.mode!==`view`)&&(q||J)&&(0,d.jsx)(`div`,{className:`shrink-0 border-t px-4 py-3 bg-background`,"data-testid":`drawer-form-footer`,children:(0,d.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[J&&(0,d.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:W,disabled:A,className:`w-full sm:w-auto`,children:ce}),q&&(0,d.jsxs)(a.Button,{type:`submit`,form:L,disabled:A,className:`w-full sm:w-auto`,children:[A&&(0,d.jsx)(l.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),Y]})]})}),(0,d.jsx)(a.AlertDialog,{open:E,onOpenChange:D,children:(0,d.jsxs)(a.AlertDialogContent,{children:[(0,d.jsxs)(a.AlertDialogHeader,{children:[(0,d.jsx)(a.AlertDialogTitle,{children:f(`form.discardTitle`)}),(0,d.jsx)(a.AlertDialogDescription,{children:f(`form.discardMessage`)})]}),(0,d.jsxs)(a.AlertDialogFooter,{children:[(0,d.jsx)(a.AlertDialogCancel,{onClick:()=>{M.current=!1},children:f(`form.keepEditing`)}),(0,d.jsx)(a.AlertDialogAction,{onClick:H,children:f(`form.discard`)})]})]})}),k]})})},at=(0,u.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`),ot={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`},st=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:o,sectionLabel:c}=(0,r.useSafeFieldLabel)(),{t:u}=at(),f=(0,r.usePreviewMode)(),p=(0,s.usePermissions)(),m=(0,t.useCallback)(t=>{if(!p?.isLoaded)return t;let n=[];for(let r of t){if(!r?.name){n.push(r);continue}p.checkField(e.objectName,r.name,`read`)&&(!p.checkField(e.objectName,r.name,`write`)&&e.mode!==`view`?n.push({...r,readOnly:!0,disabled:!0}):n.push(r))}return n},[p,e.objectName,e.mode]),[h,g]=(0,t.useState)(null),[_,v]=(0,t.useState)([]),[y,b]=(0,t.useState)({}),[x,S]=(0,t.useState)(!0),[C,w]=(0,t.useState)(null),[T,E]=(0,t.useState)(!1),[D,O]=(0,t.useState)(!1),[k,A]=(0,t.useState)(!1),{saveWithOcc:j,conflictDialog:M}=de(),N=(0,t.useRef)(!1),P=e.confirmOnDiscard!==!1,I=e.open!==!1,L=(0,t.useId)(),R=(0,t.useMemo)(()=>{if(e.sections?.length||e.customFields?.length)return null;let t=oe(_,h);e.mode===`create`&&(t=se(t,h));let n=tt(t,h?.fieldGroups);if(!n)return null;let r=e.columns&&e.columns>0?Math.min(Math.floor(e.columns),4):ie(t.length);return n.map(e=>({...e,columns:r}))},[e.sections,e.customFields,e.columns,e.mode,_,h]),z=e.sections?.length?e.sections:R??void 0,B=(0,t.useMemo)(()=>z?.length||e.customFields?.length?null:le(_,h,e.columns,e.mode),[_,h,e.columns,e.mode,z,e.customFields]),V=ot[(0,t.useMemo)(()=>{if(e.modalSize)return e.modalSize;if(B?.columns&&B.columns>1)return ce(B.columns);if(z?.length){let e=Math.max(...z.map(e=>Number(e.columns)||1));if(e>1)return ce(e)}return`default`},[e.modalSize,B,z])]||ot.default;(0,t.useEffect)(()=>{(async()=>{if(!n){S(!1);return}try{let t=await n.getObjectSchema(e.objectName);g(t)}catch(e){w(e),S(!1)}})()},[e.objectName,n]);let ne=(0,t.useRef)(void 0);(0,t.useEffect)(()=>{let t=!1;return(h||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){b(F(h,e.initialData||e.initialValues,{currentUserId:p.userId})),S(!1);return}if(!n){b(e.initialData||e.initialValues||{}),S(!1);return}ne.current!==e.recordId&&(S(!0),O(!1));try{let r=await n.findOne(e.objectName,e.recordId);if(t)return;ne.current=e.recordId,b(r||{})}catch(e){if(t)return;w(e)}finally{t||S(!1)}})(),()=>{t=!0}},[h,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName]);let re=(0,t.useCallback)(t=>te(t,{objectSchema:h,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:o}),[h,e.readOnly,e.mode,e.recordId,e.objectName,o]);(0,t.useEffect)(()=>{if(!(!h&&n)){if(e.customFields?.length){v(e.customFields),S(!1);return}if(e.sections?.length){S(!1);return}h&&(v(et({fields:e.fields,objectSchema:h,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:o})),S(!1))}},[h,e.fields,e.customFields,e.sections,e.readOnly,e.mode,n]);let H=(0,t.useCallback)(async t=>{E(!0);try{if(!n)return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=be(t,h);if(p?.isLoaded){let t={};for(let n of Object.keys(i))p.checkField(e.objectName,n,`write`)&&(t[n]=i[n]);i=t}if(e.mode===`create`)r=await n.create(e.objectName,ee(i,h));else if(e.mode===`edit`&&e.recordId){let t=await j({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:i,baseRecord:y});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{E(!1)}},[e,n,h,p,j,y]),U=(0,t.useCallback)(()=>{A(!1),N.current&&(N.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),W=(0,t.useCallback)(e=>{N.current=e,P&&D?A(!0):U()},[P,D,U]);(0,t.useEffect)(()=>{if(!I||!D||!P)return;let e=e=>{e.preventDefault(),e.returnValue=``};return window.addEventListener(`beforeunload`,e),()=>window.removeEventListener(`beforeunload`,e)},[I,D,P]);let G=(0,t.useCallback)(()=>{N.current=!0,U()},[U]),ae=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`,q=e.showSubmit!==!1&&e.mode!==`view`,Y=e.showCancel!==!1,X=e.submitText||(e.mode===`create`?`Create`:`Update`),Z=e.cancelText||`Cancel`,Q={type:`form`,objectName:e.objectName,layout:ae,defaultValues:y,previousValues:e.mode===`edit`&&e.recordId?y:void 0,submitLabel:X,cancelLabel:Z,showSubmit:q,showCancel:Y,onSubmit:H,onCancel:G,onDirtyChange:O,showActions:!1,id:L},ue=()=>{if(C)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:`Error loading form`}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:C.message})]});if(x)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)(a.Skeleton,{className:`h-4 w-24`}),(0,d.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?c(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),l=J[s],u=t.map((e,t)=>{let r=m(re(e));return{key:n(e,t),title:i(e),description:e.description,className:e.className,gridClassName:e.gridClassName,fields:s>1?K(r,s,a(e.columns)):r}}).filter(e=>e.fields.length>0),f={...Q,columns:s,...l?{fieldContainerClass:l}:{}};if(e.contentLayout===`tabbed`&&u.length>1)return(0,d.jsx)(r.SchemaRenderer,{schema:{...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}))}});let p=[];return u.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,d.jsx)(r.SchemaRenderer,{schema:{...f,fields:p}})}if(R?.length){let t=Number(R[0]?.columns)||1,n=[];R.forEach((r,i)=>{let a=m(re(r));if(!a.length)return;let o=r.name?c(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?K(a,t):a)});let i=J[t];return(0,d.jsx)(r.SchemaRenderer,{schema:{...Q,fields:n,columns:t,...i?{fieldContainerClass:i}:{}}})}let t=B??le(_,h,e.columns,e.mode),n=J[t.columns||1];return(0,d.jsx)(r.SchemaRenderer,{schema:{...Q,fields:m(t.fields),columns:t.columns,...n?{fieldContainerClass:n}:{}}})},$=e.subforms;if(f)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})]}),ue()]});if($?.length&&e.mode!==`view`)return(0,d.jsx)(a.Dialog,{open:I,onOpenChange:e.onOpenChange,children:(0,d.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(V,`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)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,d.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,d.jsx)(a.DialogDescription,{children:e.description}):(0,d.jsx)(a.DialogDescription,{className:`sr-only`,children:`Enter the record and its line items, then save.`})]}),(0,d.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:(0,d.jsx)($e,{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:X,cancelText:Z,details:$,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n})})]})});let fe=!x&&!C&&(q||Y);return(0,d.jsx)(a.Dialog,{open:I,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}W(!1)},children:(0,d.jsxs)(a.MobileDialogContent,{className:(0,a.cn)(V,`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)(a.DialogHeader,{className:`shrink-0 px-4 pt-4 sm:px-6 sm:pt-6 pb-2 border-b`,children:[e.title&&(0,d.jsx)(a.DialogTitle,{children:e.title}),e.description?(0,d.jsx)(a.DialogDescription,{children:e.description}):(0,d.jsx)(a.DialogDescription,{className:`sr-only`,children:u(`form.dialogDescriptionFallback`)})]}),(0,d.jsx)(`div`,{className:`@container flex-1 overflow-y-auto px-4 sm:px-6 py-4`,children:ue()}),fe&&(0,d.jsx)(`div`,{className:`shrink-0 border-t px-4 sm:px-6 py-3 bg-background`,"data-testid":`modal-form-footer`,children:(0,d.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[Y&&(0,d.jsx)(a.Button,{type:`button`,variant:`outline`,onClick:G,disabled:T,className:`w-full sm:w-auto`,children:Z}),q&&(0,d.jsxs)(a.Button,{type:`submit`,form:L,disabled:T,className:`w-full sm:w-auto`,children:[T&&(0,d.jsx)(l.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),X]})]})}),(0,d.jsx)(a.AlertDialog,{open:k,onOpenChange:A,children:(0,d.jsxs)(a.AlertDialogContent,{children:[(0,d.jsxs)(a.AlertDialogHeader,{children:[(0,d.jsx)(a.AlertDialogTitle,{children:u(`form.discardTitle`)}),(0,d.jsx)(a.AlertDialogDescription,{children:u(`form.discardMessage`)})]}),(0,d.jsxs)(a.AlertDialogFooter,{children:[(0,d.jsx)(a.AlertDialogCancel,{onClick:()=>{N.current=!1},children:u(`form.keepEditing`)}),(0,d.jsx)(a.AlertDialogAction,{onClick:U,children:u(`form.discard`)})]})]})}),M]})})};function ct(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 lt=({schema:e,dataSource:n})=>{let i=(0,s.usePermissions)(),a=(0,t.useMemo)(()=>{let t=ct(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:o}=(0,r.useSafeFieldLabel)(),c=e=>e?.name?o(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,d.jsx)($e,{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,d.jsx)($,{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,d.jsx)(ge,{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,d.jsx)(_e,{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,d.jsx)(it,{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,d.jsx)(st,{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,d.jsx)(ut,{schema:a,dataSource:n})},ut=({schema:e,dataSource:o})=>{let{fieldLabel:c,sectionLabel:l}=(0,r.useSafeFieldLabel)(),u=(0,a.useIsMobile)(),f=(0,s.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)([]),[v,y]=(0,t.useState)(null),[x,S]=(0,t.useState)(!0),[E,D]=(0,t.useState)(null),[k,A]=(0,t.useState)(null),[P,F]=(0,t.useState)(null);T(P);let{saveWithOcc:I,conflictDialog:L}=de(),R=e.customFields&&e.customFields.length>0;(0,t.useEffect)(()=>{R&&(y(e.initialData||e.initialValues||{}),S(!1))},[R,e.initialData,e.initialValues]),(0,t.useEffect)(()=>{R?h({name:e.objectName,fields:{}}):e.objectName&&o?(async()=>{try{if(!o)throw Error(`DataSource is required when using ObjectQL schema fetching (inline fields not provided)`);let t=await o.getObjectSchema(e.objectName);if(!t)throw Error(`No schema found for object "${e.objectName}"`);h(t)}catch(e){D(e),S(!1)}})():R||S(!1)},[e.objectName,o,R]),(0,t.useEffect)(()=>{m&&!R&&(async()=>{if(!e.recordId||e.mode===`create`){y(e.initialData||e.initialValues||{}),S(!1);return}if(!R){if(!o){D(Error(`DataSource is required for fetching record data (inline data not provided)`)),S(!1);return}S(!0);try{let t=await o.findOne(e.objectName,e.recordId);y(t)}catch(e){console.error(`Failed to fetch record:`,e),D(e)}finally{S(!1)}}})()},[e.objectName,e.recordId,e.mode,e.initialValues,e.initialData,o,m,R]);let z=(0,t.useCallback)(e=>e,[]);(0,t.useEffect)(()=>{if(R&&e.customFields){_(e.customFields.map(z)),S(!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),s=e.fields||Object.keys(m.fields||{});(Array.isArray(s)?s:Object.keys(s)).forEach(n=>{let r=typeof n==`string`?n:n.name;if(!r)return;let o=m.fields?.[r];if(!o&&!R)return;let s=e.customFields?.find(e=>e.name===r);if(s)t.push(z(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:M(o,j(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),!R&&e.recordId&&e.mode!==`create`&&o||S(!1)},[m,e.fields,e.customFields,e.readOnly,e.mode,e.objectName,R,e.recordId,o,f]);let B=(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={})),R&&!o)return e.onSuccess&&await e.onSuccess(t),t;if(!o)throw Error(`DataSource is required for form submission (inline mode not configured)`);let r=be(t,R?null:m);if(j(e)&&(r=ee(r,R?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 o.create(e.objectName,r);else if(e.mode===`edit`&&e.recordId){let n=await I({dataSource:o,objectName:e.objectName,recordId:e.recordId,payload:r,baseRecord:v});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 n=e.submitBehavior;switch(n.kind){case`redirect`:{let i=w(n.url,C(r,t));if(!i.ok){a.toast.error(i.refusal),A({message:e.successMessage||(e.mode===`create`?`Created`:`Saved`),refusal:i.refusal});break}F({url:i.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`?`Created`:`Saved`);a.toast.success(t),A({title:n.kind===`thank-you`?n.title:void 0,message:t});break}}}else if(!e.submitHandler){let n=b(e.navigateOnSuccess,t);if(n)return O(n)?F({url:n,delayMs:0}):window.location.assign(n),t;e.navigateOnSuccess?(console.warn("[ObjectForm] `navigateOnSuccess` was declared but produced no destination:",e.navigateOnSuccess),a.toast.success(e.successMessage||(e.mode===`create`?`Created`:`Saved`),{description:pe})):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,o,R,f,m,I,v]),te=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),V=j(e),ne={...t.default.useMemo(()=>V?N(m,{currentUserId:f.userId}):{},[m,V,f.userId]),...v},re=e.mode===`edit`&&e.recordId&&v&&typeof v==`object`?v:void 0,H=t.default.useMemo(()=>{let t=oe(g,m);return e.mode===`create`&&(t=se(t,m)),t},[g,m,e.mode]),U=t.default.useMemo(()=>e.sections?.length?null:tt(H,m?.fieldGroups),[e.sections,H,m]),W=e.sections?.length?e.sections:U,[G,ae]=(0,t.useState)({});if(E)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:`Error loading form`}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:E.message})]});if(x)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:`Loading form...`})]});if(k){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:k.title??`Thanks!`}),k.message&&(0,d.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:k.message})]});return k.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:k.refusal})]}):e}let q=e.layout===`vertical`||e.layout===`horizontal`?e.layout:`vertical`;if(W?.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=W.map(e=>n(e.columns)).filter(e=>e!=null),a=W.reduce((e,t)=>e+(Array.isArray(t.fields)?t.fields.length:0),0),o=n(e.columns)??(i.length?Math.max(...i):ie(a)),s=[];W.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=G[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?()=>ae(e=>({...e,[d]:!m})):void 0,className:r.className});let h=n(r.columns),g=o>1?K(u,o,h):u;f&&m?s.push(...g.map(e=>({...e,hidden:!0}))):s.push(...g)});let c=s,u=Y(o);return(0,d.jsxs)(`div`,{className:`w-full @container`,children:[(0,d.jsx)(r.SchemaRenderer,{schema:{type:`form`,objectName:e.objectName,fields:c,layout:q,columns:o,...u?{fieldContainerClass:u}:{},defaultValues:ne,previousValues:re,showSubmit:e.showSubmit!==!1&&e.mode!==`view`,showCancel:e.showCancel!==!1,submitLabel:e.submitText||(e.mode===`create`?`Create`:`Update`),cancelLabel:e.cancelText,onSubmit:B,onCancel:te}}),L]})}let J=e.sections?.length,ce=p(g),X=J?{fields:ce,columns:e.columns}:le(ce,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`&&t!==`field:richtext`?e:e.field?{...e,field:{...e.field,mobile_fullscreen:!0}}:{...e,mobile_fullscreen:!0}}):X.fields,ue=Z?.stepper,$=Z?.stepperMinFields??8,fe=Math.max(1,Z?.stepperFieldsPerStep??1);if(!e.formType&&!J&&Q.length>=2&&(ue===!0||ue===`auto`&&u&&Q.length>=$)){let t=Q,n=[];for(let e=0;e<t.length;e+=fe){let r=t.slice(e,e+fe);n.push({name:`step-${Math.floor(e/fe)+1}`,label:r[0]?.label||r[0]?.name||`Step ${Math.floor(e/fe)+1}`,fields:r})}return(0,d.jsx)(ge,{schema:{...e,formType:`wizard`,sections:n,showStepIndicator:!0},dataSource:o,className:e.className})}let me={type:`form`,objectName:e.objectName,fields:Q,layout:q,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:ne,previousValues:re,onSubmit:B,onCancel:te,className:e.className,mobileStickyActions:!!Z?.stickyActions};return(0,d.jsxs)(`div`,{className:Z?.stickyActions?`w-full pb-20 md:pb-0`:`w-full`,"data-mobile-form":Z?`true`:void 0,children:[(0,d.jsx)(r.SchemaRenderer,{schema:me}),L]})},dt=1e3;function ft(e){return e?Math.max(0,Math.ceil(e.delayMs/1e3)):null}function pt(e){let[n,r]=(0,t.useState)(e),[i,a]=(0,t.useState)(()=>ft(e));return e!==n&&(r(e),a(ft(e))),(0,t.useEffect)(()=>{if(!e)return;let t=setInterval(()=>{a(e=>e===null||e<=1?(clearInterval(t),0):e-1)},dt);return()=>clearInterval(t)},[e]),i}var mt={text:200,email:254,url:2048,phone:32,textarea:5e3,markdown:5e3,html:5e3},ht=`_company_website_2`,gt=1500;function _t(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 vt(e){return e&&e.map(e=>{let t=mt[String(e.type||``).toLowerCase()];return!t||(e.maxLength??e.max_length)?e:{...e,maxLength:t}})}var yt=({config:e,dataSource:n,prefillParams:r,className:i})=>{let[o,s]=(0,t.useState)(!1),[c,u]=(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)(()=>{o||(C.current=Date.now())},[o]),k(v);let w=pt(v),T=e.honeypot===!1?null:e.honeypot||ht,E=e.minFillTime??gt,D=(0,t.useMemo)(()=>vt(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]),A=(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]),j=(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),u(!0),p(null);try{n&&await n.create(e.objectName,r),s(!0);let t=e.thankYouPage?.redirectUrl;if(t){if(_t(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{u(!1)}},[n,e,m,T,E]),M=(0,t.useCallback)(()=>{s(!1),p(null),y(null),x(!1)},[]),N=(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=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:N,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)(l.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)(a.Button,{variant:`outline`,size:`sm`,onClick:M,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 P=e.texts??{},F=!!e.consent?.required,ee=`${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:N,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:P.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)(lt,{schema:{type:`object-form`,objectName:e.objectName,mode:`create`,fields:e.fields,customFields:D,initialData:A,onSuccess:j,submitText:c?P.submitting??`Submitting...`:P.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:ee,checked:m,onChange:e=>{h(e.target.checked),e.target.checked&&_(null)},"aria-required":F||void 0,"aria-invalid":g?`true`:void 0,"aria-describedby":g?`${ee}-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??P.consentLabelDefault??`I agree to the privacy policy.`,F&&(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:P.consentLink??`Privacy policy`})]})]})]}),g&&(0,d.jsx)(`p`,{id:`${ee}-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)(l.Loader2,{className:`h-3.5 w-3.5 animate-spin`,"aria-hidden":`true`}),(0,d.jsx)(`span`,{children:P.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)(l.Lock,{className:`h-3 w-3`,"aria-hidden":`true`}),(0,d.jsx)(`span`,{children:P.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)(l.ShieldCheck,{className:`h-3 w-3`,"aria-hidden":`true`}),P.consentLink??`Privacy policy`]}),(0,d.jsx)(`span`,{children:P.poweredBy??`Powered by ObjectStack`})]})]})]})})};function bt(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 xt=({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,d.jsxs)(`div`,{className:`space-y-4 ${i||``}`,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)(a.Card,{children:(0,d.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,d.jsx)(a.CardDescription,{children:`Total Submissions`}),(0,d.jsx)(a.CardTitle,{className:`text-2xl`,children:r.totalSubmissions.toLocaleString()})]})}),(0,d.jsxs)(a.Card,{children:[(0,d.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,d.jsx)(a.CardDescription,{children:`Fill Rate`}),(0,d.jsxs)(a.CardTitle,{className:`text-2xl`,children:[o,`%`]})]}),(0,d.jsx)(a.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:`${o}%`}})})})]}),(0,d.jsx)(a.Card,{children:(0,d.jsxs)(a.CardHeader,{className:`pb-2`,children:[(0,d.jsx)(a.CardDescription,{children:`Avg. Completion Time`}),(0,d.jsx)(a.CardTitle,{className:`text-2xl`,children:r.avgCompletionTime?bt(r.avgCompletionTime):`—`})]})})]}),r.dailySubmissions&&r.dailySubmissions.length>0&&(0,d.jsxs)(a.Card,{children:[(0,d.jsx)(a.CardHeader,{children:(0,d.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Daily Submissions`})}),(0,d.jsx)(a.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/s*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)(a.Card,{children:[(0,d.jsxs)(a.CardHeader,{children:[(0,d.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:`Field Completion Rates`}),(0,d.jsx)(a.CardDescription,{children:`Percentage of users who completed each field`})]}),(0,d.jsx)(a.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))})})]})]})},St=({schema:e})=>{let o=(0,r.useSchemaContext)()?.dataSource,s=(0,r.useRecordContext)(),c=e.parentObject||s?.objectName,l=e.parentId||e.recordId||s?.recordId,[u,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]:Oe(u,e.amountField||`amount`)}:{},i=Ee(c??``,l,r,[{childObject:e.childObject,relationshipField:e.relationshipField,rows:u,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,u,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,d.jsxs)(a.Card,{className:(0,a.cn)(`shadow-none`),children:[(0,d.jsxs)(a.CardHeader,{className:`flex-row items-center justify-between gap-2 pb-2`,children:[(0,d.jsx)(a.CardTitle,{className:`text-sm font-medium`,children:e.title||`Line Items`}),!e.readonly&&(0,d.jsx)(a.Button,{type:`button`,size:`sm`,onClick:j,disabled:_||h||!y||!l,children:_?`Saving…`:`Save`})]}),(0,d.jsxs)(a.CardContent,{children:[x&&(0,d.jsx)(`p`,{className:`mb-2 text-sm text-destructive`,children:x}),h?(0,d.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Loading…`}):l?(0,d.jsx)(i.LineItemsField,{value:u,onChange:A,field:M,readonly:e.readonly}):(0,d.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`Save the record first to add line items.`})]})]})},Ct=({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)(lt,{schema:e,dataSource:n})})};n.ComponentRegistry.register(`object-form`,Ct,{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`]},{name:`modalCloseButton`,type:`boolean`,label:`Modal Close Button`,description:`Show the modal presentation’s close button. Read at ObjectForm.tsx:361 and honoured by ModalForm.`},{name:`contentLayout`,type:`enum`,label:`Modal Content Layout`,enum:[`simple`,`tabbed`],description:"How the modal presentation lays out sections. `tabbed` needs more than one section to differ from `simple` (ModalForm.tsx:638)."},{name:`confirmOnDiscard`,type:`boolean`,label:`Confirm On Discard`,description:"Ask before discarding unsaved edits when a drawer/modal form is dismissed. Set `false` to close immediately."},{name:`recordId`,type:`string`,label:`Record Id`,description:"The record to load in `edit` / `view` mode. Leave unset for `create`."},{name:`customFields`,type:`array`,label:`Custom Fields`,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`,label:`Initial Values`,description:"Values to prefill in `create` mode."},{name:`initialData`,type:`object`,label:`Initial Data`,description:"Alternate spelling of `initialValues` that the drawer/modal presentations read FIRST (`schema.initialData || schema.initialValues`). Prefer `initialValues` in new schemas."},{name:`readOnly`,type:`boolean`,label:`Read Only`,description:"Render every field read-only, whatever `mode` says."},{name:`submitText`,type:`string`,label:`Submit Button Text`},{name:`cancelText`,type:`string`,label:`Cancel Button Text`},{name:`nextText`,type:`string`,label:`Next Button Text`,description:`Label of the next-step button (wizard).`},{name:`prevText`,type:`string`,label:`Previous Button Text`,description:`Label of the previous-step button (wizard).`},{name:`showSubmit`,type:`boolean`,label:`Show Submit Button`},{name:`showCancel`,type:`boolean`,label:`Show Cancel Button`},{name:`showReset`,type:`boolean`,label:`Show Reset Button`},{name:`submitBehavior`,type:`object`,label:`Submit Behavior`,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`,label:`Success Message`,description:"Toast shown after a successful submit. Ignored when `submitBehavior` or `navigateOnSuccess` is set."},{name:`navigateOnSuccess`,type:`string`,label:`Navigate On Success`,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`,label:`Reset On Success`,description:`Clear the form after a successful submit instead of keeping the saved values.`},{name:`mobile`,type:`object`,label:`Mobile Overrides`,description:'Phone-only presentation overrides, e.g. `{ stepper: "auto", stepperMinFields: 8, fullscreenLongText: true }`.'}]}),n.ComponentRegistry.register(`form`,Ct,{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,d.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n?.dataSource,testId:`embeddable-form`,errorTitle:`This form’s data source could not be resolved`,children:e=>(0,d.jsx)(yt,{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,d.jsx)(xt,{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,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)($e,{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},{name:`recordId`,type:`string`,label:`Parent Record Id`,description:"The parent record to load in `edit` mode. Leave unset for `create`."},{name:`formType`,type:`string`,label:`Parent Form Presentation`,description:`How the PARENT half of the form is presented. The detail grids below it are unaffected.`},{name:`fields`,type:`array`,label:`Parent Fields`,description:"Which parent fields to show, in order. Ignored when `sections` is given — sections carry their own field lists."},{name:`title`,type:`string`,label:`Title`},{name:`submitText`,type:`string`,label:`Submit Button Text`,description:`Label of the button that saves the parent and every detail row in one batch.`},{name:`cancelText`,type:`string`,label:`Cancel Button Text`},{name:`showSubmit`,type:`boolean`,label:`Show Submit Button`},{name:`initialValues`,type:`object`,label:`Initial Values`,description:"Values to prefill on the PARENT record in `create` mode."},{name:`initialData`,type:`object`,label:`Initial Data`,description:"Alternate spelling of `initialValues` the renderer also reads (MasterDetailForm.tsx:602). Prefer `initialValues` in new schemas."},{name:`taxRateField`,type:`string`,label:`Tax Rate Field`,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 wt={object:`childObject`,filter:!0,sort:!0,limit:`limit`};n.ComponentRegistry.register(`line_items`,({schema:e})=>(0,d.jsx)(r.ElementDataSourceGate,{schema:e,mapping:wt,testId:`record-line-items`,errorTitle:`This line-items panel’s data source could not be resolved`,children:e=>(0,d.jsx)(St,{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=it,e.EmbeddableForm=yt,e.FormAnalytics=xt,e.FormSectionContainer=fe,e.LineItemsPanel=St,e.MasterDetailForm=$e,e.ModalForm=st,e.ObjectForm=lt,e.SplitForm=_e,e.TabbedForm=$,e.WizardForm=ge,e.applyAutoColSpan=K,e.applyAutoLayout=le,e.containerGridColsFor=Y,e.deriveColumns=Ve,e.deriveDetail=Xe,e.deriveFormFields=We,e.filterAutoGeneratedFields=se,e.filterCreateModeFields=q,e.filterSystemFields=oe,e.findRelationshipField=Ie,e.inferColumns=ie,e.inferModalSize=ce,e.isAutoGeneratedFieldType=U,e.isWideFieldType=H,e.resolveInlineMode=qe});
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 ee(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 y=`https://a.invalid/`,b=`https://b.invalid/`;function x(e){try{return new URL(e,y).origin===`https://a.invalid`&&new URL(e,b).origin===`https://b.invalid`}catch{return!1}}function S(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 x(r)?r:null}var C=/\{\{record\.([a-z_][a-z0-9_]*)\}\}/g;function w(e){return e==null?``:typeof e==`string`?e:typeof e==`boolean`||typeof e==`number`&&Number.isFinite(e)?String(e):``}function T(e,t){let n=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:{};return{...n(e),...n(t)}}function E(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(C,(e,n)=>encodeURIComponent(w(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 D(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 O(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 k(e){return e!=null&&!(0,n.isRuntimeDefault)(e)}function A(e){return e?.mode===`create`||!e?.recordId}function j(e,t){return!(!e?.required||t&&(0,n.isRuntimeDefault)(e.defaultValue))}function M(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;if(k(a))r[e]=a;else if(F(i)&&t?.currentUserId)r[e]=t.currentUserId;else if(a==null){let t=N(i);t!==void 0&&(r[e]=t)}}return r}function N(e){let t=e?.options;if(!Array.isArray(t))return;let n=[];for(let e of t)P(e)&&e.value!==void 0&&e.value!==null&&n.push(e.value);if(n.length!==0)return(0,l.isMultiValueField)({type:typeof e?.type==`string`?e.type:``,multiple:e?.multiple===!0})?n:n[0]}function P(e){return typeof e==`object`&&!!e&&`default`in e&&e.default===!0}function F(e){return!e||!(0,l.isCurrentUserDefaultToken)(e.defaultValue)?!1:e.type===`user`||e.type===`lookup`&&e.reference===`sys_user`}function te(e,t,n){return{...M(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){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return typeof t.field!=`string`&&typeof t.name==`string`}function B(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(!z(n))return!1;t+=1}}return t>0}function ne(e){let t=e;return Array.isArray(t?.customFields)&&t.customFields.length>0?!0:B(t?.sections)}var V=`DataSource is required for form submission (inline mode not configured)`;function re(){return Error(V)}function H(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 U=new Set;function ie(e,t){if(typeof e.name!=`string`||e.name===e.field)return;let n=`${t}:${e.field}:${e.name}`;U.has(n)||(U.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 W=new Set;function G(e,t){let n=typeof e==`object`&&e&&typeof e.field==`string`?`{ field: '${e.field}' }`:JSON.stringify(e),r=`${t}:${n}`;W.has(r)||(W.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 K=new Set;function q(e,t,n){let r=n?`section '${n}'`:`an untitled section`,i=`${t}:${r}:${e}`;K.has(i)||(K.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 J(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:j(n,A(t)),disabled:t.readOnly||t.mode===`view`||n.readonly,placeholder:n.placeholder,description:(0,a.fieldHelpText)(n),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 ae(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 Y(e,t){return oe(e,t,void 0)}function oe(e,t,n){if(typeof e==`string`){if(n)return n;let r=L(t.customFields,e);return r?Y(r,t):J(e,t)}let r=e;if(typeof r.field!=`string`)return H(r,r.visibleOn);ie(r,t.objectName);let i=r.field,o=L(t.customFields,i),s=n?{...n}:o?{...o}:J(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=j({required:r.required,defaultValue:t.objectSchema?.fields?.[i]?.defaultValue},A(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),H(s,r.visibleWhen)}function se(e,t){let n=e.fields??[],r=t.pool;if(!r)return n.map(e=>Y(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){if(z(e)){a.push(Y(e,t));continue}let n=ae(e),r=n===void 0?void 0:i.get(n);r&&a.push(oe(e,t,r))}return a}function ce(e){return{...e?.initialValues??{},...e?.initialData??{}}}function le(e,t,r){if(!e?.isLoaded)return;let i=(0,n.formFieldsAffordance)(r)??`editFormFields`;return r=>(0,n.resolveFieldAffordance)(i,e,t,r)}function X(e,t,r,i,a){if(!Array.isArray(e)||!t?.isLoaded)return e;let o=(0,n.formFieldsAffordance)(i),s=[];for(let i of e){if(!i?.name){s.push(i);continue}if(t.checkField(r,i.name,`read`)){if(o&&!(0,n.resolveFieldAffordance)(o,t,r,i.name)){s.push(a(i));continue}s.push(i)}}return s}function ue(e,{perms:t,objectName:n,mode:r,deniedDescription:i}){return X(e,t,n,r,e=>i?{...e,readOnly:!0,disabled:!0,description:e.description??i}:{...e,readOnly:!0,disabled:!0})}function de(e,t,r,i){if(i!==`edit`&&i!==`create`)return!1;let a=(0,n.formFieldsAffordance)(i);return a?!(0,n.resolveAffordance)(a,{objectSchema:e,objectName:r,perms:t}).allowed:!1}function fe({perms:e,objectName:t,mode:n,objectSchema:r}){if(de(r,e,t,n))return n===`edit`?`edit`:`create`}function pe(e,{objectSchema:t,...n}){let r=ue(e,n);return!Array.isArray(r)||!de(t,n.perms,n.objectName,n.mode)?r:r.map(e=>e?.name?{...e,disabled:!0}:e)}var me=`true`;function he(e,{perms:t,objectName:n,mode:r}){return X(e,t,n,r,e=>({...e,readonlyWhen:me}))}var ge=(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 _e({affordance:e,objectName:t,objectSchema:n}){let i=(0,r.useSafeFieldLabel)(),{t:a}=ge();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 ve=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(`.`)),Z=new Set([`formula`,`summary`,`rollup`,`lookup_value`,`auto_number`,`autonumber`,`computed`]);function ye(e,t,n){return xe(e,t,n?.canEdit,!1)}var be=`owner_id`;function xe(e,t,n,r){if(!e||typeof e!=`object`)return e;let i={},a=t?.fields;for(let[t,o]of Object.entries(e)){let e=r&&t===be;if((e||!ve.has(t))&&(!n||n(t))){if(a){let n=a[t];if(!n||!e&&n.system===!0)continue;let r=String(n.type||``).toLowerCase();if(Z.has(r)||n.computed===!0||n.readOnly===!0||n.readonly===!0)continue}i[t]=o}}return i}function Q(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 Se(e,t){let n={};for(let[r,i]of Object.entries(e))Q(i,t[r])||(n[r]=i);return n}function Ce(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 we(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 Te(e,t,n,r){if(!e||typeof e!=`object`)return e;let i=we(t,n);if(!i)return e;let a={...Se(e,i),...De(r,i)};return Object.keys(a).length>0?a:e}function Ee(e,t,n){if(!e||typeof e!=`object`||!t||typeof t!=`object`)return e;let r=De(n,t);return Object.keys(r).length>0?{...e,...r}:e}function De(e,t){let n=e?.values;if(!n||typeof n!=`object`)return{};let r=n[be];return r===void 0?{}:Se(xe({[be]:r},e.objectSchema,e.canEdit,!0),t)}function Oe(e,t,n){let r=we(e,t);return!e||!r?e??null:!n||typeof n!=`object`?e:{...e,record:{...r,...n}}}function ke(e,t,{objectSchema:n,canEdit:r,snapshot:i,createBaseline:a}){let o=Array.isArray(t.customFields)&&t.customFields.length>0?null:n,s=ye(e,o,{canEdit:r}),c={values:e,objectSchema:o,canEdit:r};return A(t)&&(s=I(Ee(s,a,c),o)),{payload:s,writePayload:Te(s,i,t,c)}}var $=new Set([`field:formula`,`field:summary`,`field:auto_number`,`field:autonumber`]),Ae=new Set([`field:textarea`,`field:markdown`,`field:html`,`field:grid`,`field:richtext`,`textarea`,`markdown`,`html`,`grid`,`richtext`]),je=new Set([`formula`,`summary`,`auto_number`,`autonumber`]);function Me(e){return Ae.has(e)}function Ne(e){return je.has(e)}function Pe(e){return e<=3?1:e<=8?2:e<=15?3:4}function Fe(e){return e&&e>0?Math.min(Math.floor(e),4):1}function Ie(e,t,n){let r=Fe(t);return r<=1?1:e.span===`full`?r:e.colSpan==null?e.type&&Me(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 Le(e,t,n){let r=Fe(t);return r<=1?e:e.map(e=>{if(e.type===`section-divider`)return e;let t=Ie(e,r,n);return t>1?{...e,colSpan:t}:e.colSpan!=null&&e.colSpan!==1?{...e,colSpan:1}:e})}var Re=ve;function ze(e,t){return e.filter(e=>{if(Re.has(e.name))return!1;let n=t?.fields?.[e.name];return n?.hidden!==!0&&n?.readonly!==!0})}function Be(e,t){return e.filter(e=>{if(Re.has(e.name)||e.type&&$.has(e.type))return!1;if(!t?.fields)return!0;let n=t.fields[e.name];return!n||n.readonly!==!0&&!Ne(n.type)})}function Ve(e,t){return e.filter(e=>{if(e.type&&$.has(e.type))return!1;let n=t?.fields?.[e.name];return!n||!Ne(n.type)})}var He={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 Ue(e){return He[e&&e>0?Math.min(Math.floor(e),4):1]}var We=`grid gap-4 grid-cols-1 @md:grid-cols-12`;function Ge(e){return typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0}function Ke(e,t){return Ge(e)??Ge(t)??2}function qe(e,t){let n=t.length?Math.max(...t.map(t=>Ke(t,e))):2;return Ge(e)??n}function Je(e,t){let n=qe(e,t),r=t=>Math.min(Ke(t,e),n);return t.every(e=>{let t=r(e);return t===1||t===n})?{columns:n,fieldContainerClass:Ue(n),layOut:(e,t)=>n>1?Le(e,n,r(t)):e}:{columns:n,fieldContainerClass:We,layOut:(e,t)=>{let n=r(t);return e.map(e=>e.type===`section-divider`?e:{...e,colSpan:Ye(e,n)})}}}function Ye(e,t){return e.span===`full`?12:e.colSpan==null?e.type&&Me(e.type)?12:12/t:12*Math.min(Math.max(1,Math.floor(e.colSpan)),t)/t}function Xe(e){return e<=1?`lg`:`xl`}function Ze(e,t,n,r){let i=[...e];if(i=ze(i,t),r===`create`&&(i=Ve(i,t)),n!==void 0)return i=Le(i,n),{fields:i,columns:n};let a=Pe(i.length);return i=Le(i,a),{fields:i,columns:a}}var Qe=(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 $e(e){let t=e?.updated_at;return typeof t==`string`&&t.length>0?t:void 0}function et(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.code===`CONCURRENT_UPDATE`||t.name===`ConcurrentUpdateError`}function tt(e,t){return JSON.stringify([e,String(t)])}function nt(e,t){if(t)return e&&e.readVersion===t?e.version:t}function rt(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 it(){let{t:e}=Qe(),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=tt(t,n),u=$e(a),d=nt(l.current.get(o),u),f=e=>{let t=$e(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(!et(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=rt(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 at={schema:null,record:null};function ot(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 st(e){return e.schema||e.record}var ct=(0,i.createSafeTranslation)({"form.uploadInFlight":`Wait for the upload to finish before saving.`,"fields.file.uploading":`Uploading…`},`form.uploadInFlight`);function lt(){let e=(0,a.useUploadingScope)(),{t}=ct();return{uploading:e.anyUploading,scope:e,busyLabel:t(`fields.file.uploading`),reason:t(`form.uploadInFlight`)}}function ut({gate:e,children:t}){return(0,d.jsx)(a.UploadingScopeProvider,{scope:e.scope,children:t})}function dt({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 ft={"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`};ft[`form.navigateRefused`];var pt=(0,i.createSafeTranslation)(ft,`form.errorLoading`),mt=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:a}=(0,r.useSafeFieldLabel)(),{t:s}=pt(),l=(0,c.usePermissions)(),{userId:u}=l,[f,p]=(0,t.useState)(null),m=lt(),[h,g]=(0,t.useState)({}),{saveWithOcc:_,conflictDialog:v}=it(),[y,b]=(0,t.useState)(!0),[x,S]=(0,t.useState)(at),C=(0,t.useRef)({schema:0,record:0}),w=st(x),T=e.defaultTab||e.sections[0]?.name||e.sections[0]?.label||`tab-0`;t.default.useEffect(()=>{let t=!1,r=ot(C,S,`schema`);return(async()=>{if(!n){b(!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 E=(0,t.useRef)(void 0),D=(0,t.useRef)(null),{refetch:O,onDirtyChange:k,saved:A}=ee(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`);t.default.useEffect(()=>{let t=!1,r=ot(C,S,`record`);return(f||!n)&&(async()=>{if(e.mode===`create`||!e.recordId||!n){D.current=null,g(te(f,ce(e),{currentUserId:u})),r.commit(),b(!1);return}E.current!==e.recordId&&b(!0);try{let i=await n.findOne(e.objectName,e.recordId);if(t)return;E.current=e.recordId,D.current=Ce(e,i),g(i||{}),r.commit()}catch(e){if(t)return;r.fail(e)}finally{t||b(!1)}})(),()=>{t=!0}},[f,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName,O]);let j=(0,t.useCallback)(t=>{let n=se(t,{objectSchema:f,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:a,customFields:e.customFields});return pe(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]),M=(0,t.useCallback)(async t=>{if(m.uploading){o.toast.error(m.reason);return}if(!n&&!e.submitHandler&&ne(e))return e.onSuccess&&await e.onSuccess(t),t;try{let r,{writePayload:i}=ke(t,e,{objectSchema:f,canEdit:le(l,e.objectName,e.mode),snapshot:D.current,createBaseline:h});if(e.submitHandler)r=await e.submitHandler(i);else if(!n)throw re();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=Oe(D.current,e,i),A(),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,A]),N=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),P=(e,t)=>e.name||e.label||`tab-${t}`;if(w)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:w.message})]});if(y)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 F=Je(e.columns,e.sections.map(e=>e.columns)),I=F.columns,L=F.fieldContainerClass,R=e.sections.map((e,t)=>{let n=j(e);return{key:P(e,t),label:e.label||`Tab ${t+1}`,description:e.description,containerClass:e.gridClassName,visibleWhen:e.visibleWhen,visibleWhenFault:e.visibleWhenFault,fields:F.layOut(n,e.columns)}}),z=[...R.length>1?[]:R.filter(e=>e.visibleWhen!=null).map(e=>({name:`__section_gate_${e.key}`,type:`section-divider`,visibleWhen:e.visibleWhen,visibleWhenFault:e.visibleWhenFault,fields:e.fields.map(e=>e.name),colSpan:4})),...R.flatMap(e=>e.fields)],B={type:`form`,objectName:e.objectName,fields:z,columns:I,...L?{fieldContainerClass:L}:{},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:M,onCancel:N,onDirtyChange:k,fieldTabs:R.map(e=>({key:e.key,label:e.label,description:e.description,fields:e.fields.map(e=>e.name),containerClass:e.containerClass,visibleWhen:e.visibleWhen,visibleWhenFault:e.visibleWhenFault})),defaultFieldTab:T,fieldTabsPosition:e.tabPosition||`top`};return(0,d.jsx)(ut,{gate:m,children:(0,d.jsxs)(`div`,{className:(0,o.cn)(`w-full @container`,i,e.className),children:[(0,d.jsx)(_e,{affordance:fe({perms:l,objectName:e.objectName,mode:e.mode,objectSchema:f}),objectName:e.objectName,objectSchema:f}),(0,d.jsx)(r.SchemaRenderer,{schema:B}),(0,d.jsx)(dt,{gate:m}),v]})})},ht=({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,ee=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}),ee&&(0,d.jsx)(o.CardContent,{className:`pt-4`,children:ee})]}):(0,d.jsxs)(`div`,{className:(0,o.cn)(`form-section`,c),children:[v,ee]})},gt=e=>e==null||e===``||Array.isArray(e)&&e.length===0,_t=(e,t)=>Object.keys(e).some(n=>{let r=e[n],i=t[n];if(gt(r)&&gt(i))return!1;try{return JSON.stringify(r)!==JSON.stringify(i)}catch{return r!==i}}),vt=(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`),yt=n.isMissingForRequired;function bt(e,t){return e.current=t,t}var xt=({schema:e,dataSource:i,className:a})=>{let{fieldLabel:s}=(0,r.useSafeFieldLabel)(),l=(0,c.usePermissions)(),{userId:f}=l,{t:p}=vt(),m=lt(),[h,g]=(0,t.useState)(null),[_,v]=(0,t.useState)({}),[y,b]=(0,t.useState)(void 0),x=t.default.useRef(null),{saveWithOcc:C,conflictDialog:w}=it(),[O,k]=(0,t.useState)(!0),[j,M]=(0,t.useState)(at),N=t.default.useRef({schema:0,record:0}),P=st(j),[F,I]=(0,t.useState)(0),[L,R]=(0,t.useState)(new Set),[z,B]=(0,t.useState)(!1),[V,H]=(0,t.useState)(new Set),[U,ie]=(0,t.useState)(null),[W,G]=(0,t.useState)(null);D(W);let K=t.default.useId(),[q,J]=(0,t.useState)(0),ae=t.default.useRef(!1),Y=t.default.useRef(null),oe=t.default.useRef(void 0),{refetch:X,onDirtyChange:ue,saved:de}=ee(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`),me=t.default.useRef(!1),he=t.default.useRef(!1),ge=(0,t.useCallback)(()=>{ue(me.current||he.current)},[ue]),ve=(0,t.useCallback)(e=>{me.current=e,ge()},[ge]),Z=e.sections.length,ye=F===0,be=F===Z-1;t.default.useEffect(()=>{let t=!1,n=ot(N,M,`schema`);return(async()=>{if(!i){k(!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=ot(N,M,`record`);return(h||!i)&&(async()=>{if(e.mode===`create`||!e.recordId||!i){x.current=null,ae.current||=(v(bt(Y,te(h,ce(e),{currentUserId:f}))),!0),n.commit(),k(!1);return}oe.current!==e.recordId&&k(!0);try{let r=await i.findOne(e.objectName,e.recordId);if(t)return;oe.current=e.recordId,x.current=Ce(e,r),v(r||{}),b(r||{}),he.current=!1,n.commit()}catch(e){if(t)return;n.fail(e)}finally{t||k(!1)}})(),()=>{t=!0}},[h,e.mode,e.recordId,e.initialData,e.initialValues,i,e.objectName,X]);let xe=(0,t.useCallback)(t=>{let n=se(t,{objectSchema:h,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:s,customFields:e.customFields});return pe(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]),Q=fe({perms:l,objectName:e.objectName,mode:e.mode,objectSchema:h}),Se=A(e),we=(0,r.usePredicateScope)(),Te=(0,t.useMemo)(()=>F>=0&&F<Z?xe(e.sections[F]):[],[F,Z,e.sections,xe]),Ee=(0,t.useCallback)(t=>{let r=new Map,i=new Map;return e.sections.forEach((e,a)=>{for(let o of xe(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,we,`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,we,{context:`visibleOn of field '${e}'`}))&&s.visible&&!s.readonly&&s.required&&yt(t[e])&&r.set(a,[...r.get(a)??[],o.label||e])}}),{missing:r,faultedVisibleWhen:i}},[e.sections,xe,Se,we]),De=(0,t.useCallback)(async t=>{if(Q)return;let n={..._,...t};if(v(n),_t(t,_)&&(he.current=!0,ge()),R(e=>new Set(e).add(F)),H(e=>{if(!e.has(F))return e;let t=new Set(e);return t.delete(F),t}),be){if(m.uploading){o.toast.error(m.reason);return}let{missing:t,faultedVisibleWhen:r}=Ee(n);if(r.size>0){H(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){H(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}H(new Set),B(!0);try{if(!i&&!e.submitHandler&&ne(e))return e.onSuccess&&await e.onSuccess(n),n;let t,{writePayload:r}=ke(n,e,{objectSchema:h,canEdit:le(l,e.objectName,e.mode),snapshot:x.current,createBaseline:Y.current});if(e.submitHandler)t=await e.submitHandler(r);else if(!i)throw re();else if(e.mode===`create`)t=await i.create(e.objectName,r);else if(e.mode===`edit`&&e.recordId){let n=await C({dataSource:i,objectName:e.objectName,recordId:e.recordId,payload:r,baseRecord:_});if(n.status===`cancelled`)return;t=n.result}if(x.current=Oe(x.current,e,r),he.current=!1,de(),e.onSuccess)await e.onSuccess(t);else if(!e.submitHandler&&e.submitBehavior){let r=e.submitBehavior;switch(r.kind){case`redirect`:{let i=E(r.url,T(n,t));if(!i.ok){o.toast.error(i.refusal),ie({message:e.successMessage||(e.mode===`create`?p(`form.created`):p(`form.saved`)),refusal:i.refusal});break}G({url:i.url,delayMs:r.delayMs??0});break}case`continue`:v(bt(Y,te(h,ce(e),{currentUserId:f}))),R(new Set),I(0),J(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),ie({title:r.kind===`thank-you`?r.title:void 0,message:t});break}}}else if(!e.submitHandler){let n=S(e.navigateOnSuccess,t);if(n)return G({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(bt(Y,te(h,ce(e),{currentUserId:f}))),R(new Set),I(0),J(e=>e+1))}return t}catch(t){throw e.onError&&e.onError(t),t}finally{B(!1)}}$(F+1)},[Q,_,F,be,e,h,i,l,Ee,p,C,m.uploading,m.reason,ge,de]),$=(0,t.useCallback)(t=>{t>=0&&t<Z&&(I(t),e.onStepChange&&e.onStepChange(t))},[Z,e]),Ae=(0,t.useCallback)(()=>{$(F-1)},[F,$]),je=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),Me=(0,t.useCallback)(t=>t<=F||!Q&&(!!e.allowSkip||L.has(t)),[F,Q,e.allowSkip,L]),Ne=(0,t.useCallback)(e=>{Me(e)&&$(e)},[Me,$]);if(P)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:P.message})]});if(O)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(U)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:U.title??p(`publicForm.thankYouTitle`)}),U.message&&(0,d.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:U.message})]}),U.refusal&&(0,d.jsx)(`div`,{role:`alert`,className:`rounded-md border border-destructive/40 bg-destructive/10 p-4 text-sm text-destructive`,children:U.refusal})]});let Pe=e.sections[F],Fe=Je(e.columns,[Pe?.columns]),Ie=Fe.columns,Le=Fe.fieldContainerClass,Re={type:`form`,objectName:e.objectName,id:K,fields:Fe.layOut(Te,Pe?.columns),columns:Ie,...Le?{fieldContainerClass:Le}:{},layout:`vertical`,defaultValues:_,previousValues:e.mode===`edit`?y:void 0,showSubmit:!1,showCancel:!1,onSubmit:De,onDirtyChange:ve};return(0,d.jsx)(ut,{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===F,r=L.has(t),i=Me(t),a=V.has(t);return(0,d.jsxs)(`li`,{className:(0,o.cn)(`relative flex-1`,t!==Z-1&&`pr-8 sm:pr-12`),children:[t!==Z-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:()=>Ne(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)(_e,{affordance:Q,objectName:e.objectName,objectSchema:h}),(0,d.jsx)(`div`,{className:`min-h-[200px]`,children:Pe&&(0,d.jsx)(ht,{label:Pe.label,description:Pe.description,columns:1,className:Pe.className,gridClassName:Pe.gridClassName,children:Te.length>0?(0,d.jsx)(r.SchemaRenderer,{schema:Re},q):(0,d.jsx)(`form`,{id:K,onSubmit:e=>{e.preventDefault(),De({})},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:je,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:F+1,total:Z})}),!ye&&(0,d.jsxs)(o.Button,{variant:`outline`,onClick:Ae,children:[(0,d.jsx)(u.ChevronLeft,{className:`h-4 w-4 mr-1`}),e.prevText||p(`wizard.back`)]}),be?(0,d.jsxs)(o.Button,{type:`submit`,form:K,disabled:z||e.mode===`view`||m.uploading||!!Q,children:[z&&(0,d.jsx)(u.Loader2,{className:`mr-2 h-4 w-4 animate-spin`,"aria-hidden":!0}),m.uploading?m.busyLabel:z?p(`wizard.submitting`):e.submitText||(e.mode===`create`?p(`form.create`):p(`form.update`))]}):(0,d.jsxs)(o.Button,{type:`submit`,form:K,disabled:!!Q,children:[e.nextText||p(`common.next`),(0,d.jsx)(u.ChevronRight,{className:`h-4 w-4 ml-1`})]})]})]}),(0,d.jsx)(dt,{gate:m}),w]})})},St=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:a}=(0,r.useSafeFieldLabel)(),{t:s}=pt(),l=(0,c.usePermissions)(),{userId:u}=l,f=lt(),[p,m]=(0,t.useState)(null),[h,g]=(0,t.useState)({}),{saveWithOcc:_,conflictDialog:v}=it(),[y,b]=(0,t.useState)(!0),[x,S]=(0,t.useState)(at),C=(0,t.useRef)({schema:0,record:0}),w=st(x);(0,t.useEffect)(()=>{let t=!1,r=ot(C,S,`schema`);return(async()=>{if(!n){b(!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),b(!1)}})(),()=>{t=!0}},[e.objectName,n]);let T=(0,t.useRef)(void 0),E=(0,t.useRef)(null),{refetch:D,onDirtyChange:O,saved:k}=ee(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`);(0,t.useEffect)(()=>{let t=!1,r=ot(C,S,`record`);return(p||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){E.current=null,g(te(p,ce(e),{currentUserId:u})),r.commit(),b(!1);return}if(!n){E.current=null,g(ce(e)),r.commit(),b(!1);return}T.current!==e.recordId&&b(!0);try{let i=await n.findOne(e.objectName,e.recordId);if(t)return;T.current=e.recordId,E.current=Ce(e,i),g(i||{}),r.commit()}catch(e){if(t)return;r.fail(e)}finally{t||b(!1)}})(),()=>{t=!0}},[p,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName,D]);let A=(0,t.useCallback)(t=>{let n=se(t,{objectSchema:p,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:a,customFields:e.customFields});return pe(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]),j=(0,t.useCallback)(async t=>{if(f.uploading){o.toast.error(f.reason);return}if(!n&&!e.submitHandler&&ne(e))return e.onSuccess&&await e.onSuccess(t),t;try{let r,{writePayload:i}=ke(t,e,{objectSchema:p,canEdit:le(l,e.objectName,e.mode),snapshot:E.current,createBaseline:h});if(e.submitHandler)r=await e.submitHandler(i);else if(!n)throw re();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 E.current=Oe(E.current,e,i),k(),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,k]),M=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),N=(e,t)=>e.pane===`primary`||e.pane===`secondary`?e.pane:t===0?`primary`:`secondary`,P=(0,t.useMemo)(()=>e.sections.filter((e,t)=>N(e,t)===`primary`),[e.sections]),F=(0,t.useMemo)(()=>e.sections.filter((e,t)=>N(e,t)===`secondary`),[e.sections]),I=e.splitDirection||`horizontal`,L=e.splitSize||50;if(w)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:w.message})]});if(y)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 R=Je(e.columns,e.sections.map(e=>e.columns)),z=R.columns,B=R.fieldContainerClass,V=(e,t)=>{let n=[];return e.forEach((e,r)=>{let i=A(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,visibleWhenFault:e.visibleWhenFault,fields:i.map(e=>e.name),colSpan:4,className:e.className}),n.push(...R.layOut(i,e.columns)))}),n},H=[{key:`primary`,sections:P,defaultSize:L},{key:`secondary`,sections:F,defaultSize:100-L}].map(e=>({...e,fields:V(e.sections,e.key),containerClass:e.sections.length===1?e.sections[0].gridClassName:void 0})).filter(e=>e.fields.length>0),U={type:`form`,objectName:e.objectName,fields:H.flatMap(e=>e.fields),columns:z,...B?{fieldContainerClass:B}:{},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:j,onCancel:M,onDirtyChange:O,fieldPanes:H.map(e=>({key:e.key,fields:e.fields.map(e=>e.name),defaultSize:e.defaultSize,...e.containerClass?{containerClass:e.containerClass}:{}})),fieldPanesOrientation:I,fieldPanesResizable:e.splitResizable!==!1};return(0,d.jsx)(ut,{gate:f,children:(0,d.jsxs)(`div`,{className:(0,o.cn)(`w-full @container`,i,e.className),children:[(0,d.jsx)(_e,{affordance:fe({perms:l,objectName:e.objectName,mode:e.mode,objectSchema:p}),objectName:e.objectName,objectSchema:p}),(0,d.jsx)(r.SchemaRenderer,{schema:U}),(0,d.jsx)(dt,{gate:f}),v]})})},Ct=e=>e==null?void 0:e.id??e._id??e.recordId,wt=(e,t)=>t?ye(e,t):e,Tt=e=>ye(e,null),Et=new Set([`id`,`_id`,`recordId`]);function Dt(e,t){return!e||Object.entries(e).every(([e,n])=>e===t||Et.has(e)?!0:n==null||n===``)}function Ot(e,t,n){let r=[{object:e,action:`create`,data:Tt(t)}];for(let e of n)for(let t of e.rows)Dt(t,e.relationshipField)||r.push({object:e.childObject,action:`create`,data:{...wt(t,e.childSchema),[e.relationshipField]:{$ref:0}}});return r}function kt(e,t,n,r){let i=[{object:e,action:`update`,id:t,data:Tt(n)}];for(let e of r){let n=(e.rows||[]).map(n=>({...n,[e.relationshipField]:t})),{toCreate:r,toUpdate:a,toDelete:o}=At(e.original||[],n);for(let t of r){if(Dt(t,e.relationshipField))continue;let{id:n,_id:r,recordId:a,...o}=t;i.push({object:e.childObject,action:`create`,data:wt(o,e.childSchema)})}let s=new Map;for(let t of e.original||[]){let e=Ct(t);e&&s.set(e,t)}for(let t of a){let n=Ct(t),r=s.get(n),a=wt(t,e.childSchema),o=r?Se(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 At(e,t){let n=new Set(t.map(Ct).filter(Boolean));return{toCreate:t.filter(e=>!Ct(e)),toUpdate:t.filter(e=>Ct(e)),toDelete:(e||[]).map(Ct).filter(e=>!!e&&!n.has(e))}}function jt(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 Mt=new Set([`position`,`sort_order`,`sequence`,`line_no`,`line_number`,`sort`]);function Nt(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 Pt=new Set([`image`,`avatar`]);function Ft(e,t){e.multiple==null&&t?.multiple&&(e.multiple=!0),e.accept??(Array.isArray(t?.accept)&&t.accept.length>0?e.accept=t.accept:Pt.has(t?.type)&&(e.accept=[`image/*`]))}function It(e,t){if(e?.type===`boolean`||e?.type===`toggle`)return[{label:t(!0),value:`true`},{label:t(!1),value:`false`}];let n=e?.options;if(Array.isArray(n))return n.map(e=>typeof e==`object`&&e?{label:String(e.label??e.value),value:String(e.value)}:{label:String(e),value:String(e)})}function Lt(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}function Rt(e,t){let n=e?.fields;return!n||typeof n!=`object`?[]:(0,l.deriveInlineGridColumns)(e,{relationshipField:t.relationshipField,exclude:t.exclude,maxColumns:t.maxColumns??l.DEFAULT_MAX_INLINE_GRID_COLUMNS}).map(({name:e,defaultHidden:r})=>{let i=zt(e,n[e],t.booleanLabel);return r?{...i,defaultHidden:r}:i})}function zt(e,t,n){let r={name:e,label:t?.label||e,type:Nt(t?.type),required:!!t?.required},i=It(t,n);r.type===`select`&&i&&(r.options=i),r.type===`lookup`&&(r.reference=t?.reference,r.displayField=t?.displayField||t?.reference_field),r.type===`file`&&Ft(r,t),t?.readonlyWhen&&(r.readonlyWhen=t.readonlyWhen),t?.requiredWhen&&(r.requiredWhen=t.requiredWhen);let a=typeof t?.expression==`string`?t.expression:t?.expression?.source;return a&&typeof a==`string`&&(r.computed=!0,r.expr=a,r.required=!1,typeof t?.scale==`number`&&(r.scale=t.scale)),r}var Bt=new Set;function Vt(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(Bt.has(i))return;Bt.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 Ht(e,t,n){let r=e??[],i=t?.fields;return!r.length||!i||typeof i!=`object`?r:r.map(e=>{if(e.type)return e.type===`currency`&&Vt(e,t?.name,!1),e;let r=i[e.name];if(!r)return e;let a=Nt(r?.type);a===`currency`&&Vt(e,t?.name,!0);let o={...e,type:a};o.label??=r?.label||e.name,o.required??=!!r?.required;let s=It(r,n.booleanLabel);a===`select`&&s&&!o.options&&(o.options=s),a===`lookup`&&(o.reference??=r?.reference,o.displayField??=r?.displayField||r?.reference_field),a===`file`&&Ft(o,r),o.readonlyWhen==null&&r?.readonlyWhen&&(o.readonlyWhen=r.readonlyWhen),o.requiredWhen==null&&r?.requiredWhen&&(o.requiredWhen=r.requiredWhen);let c=typeof r?.expression==`string`?r.expression:r?.expression?.source;return!o.computed&&c&&typeof c==`string`&&(o.computed=!0,o.expr=c,o.required=!1,typeof r?.scale==`number`&&(o.scale=r.scale)),o})}function Ut(e,t={}){return(0,l.deriveInlineRowFormFields)(e,{relationshipField:t.relationshipField,exclude:t.exclude})}var Wt=new Set([`textarea`,`richtext`,`html`,`markdown`,`rich-text`,`json`,`location`,`address`]),Gt=new Set([`file`,`image`,`avatar`]);function Kt(e,t,n={}){if(t===`grid`||t===`form`)return t;let r=e?.fields??{},i=Ut(e,{relationshipField:n.relationshipField});return i.some(e=>Wt.has(r[e]?.type))||i.filter(e=>Gt.has(r[e]?.type)).length>=2||i.length>8?`form`:`grid`}var qt=[`amount`,`total`,`subtotal`,`line_total`,`line_amount`,`net_amount`];function Jt(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=>qt.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 Yt(e,t,n,r){let i=r.relationshipField||Lt(t,n);if(!i)throw Error(`MasterDetailForm: could not find a lookup/master_detail field on "${e}" referencing "${n}". Set relationshipField explicitly.`);let{booleanLabel:a}=r,o=r.columns?.length?Ht(r.columns,t,{booleanLabel:a}):Rt(t,{relationshipField:i,booleanLabel:a}),s=r.amountField||Jt(o);return{childObject:e,relationshipField:i,columns:o,formFields:Ut(t,{relationshipField:i}),mode:Kt(t,r.inlineEdit??(t?.fields)?.[i]?.inlineEdit,{relationshipField:i}),amountField:s,sortField:Object.keys(t?.fields??{}).find(e=>Mt.has(e))}}function Xt(e,t,n){return Object.entries(e??{}).every(([e,r])=>e===n||Q(r,t[e]))}function Zt(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(Ct(e)!=null||Dt(e,s))continue;let t=i[a];if(!t||t.op.object!==r||!Xt(t.op.data,e,s)){o=!0;break}a+=1;let n=Ct(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=Ct(e);t!=null&&f.set(t,e)}let p=[];for(let e of c){let t=Ct(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??{}};Ct(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 Qt(e,t){if(!t)return;let n=e?.fields?.[t];return n&&typeof n==`object`?n:void 0}function $t(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 en=2;function tn(e,t,n){let r=()=>(0,i.formatDisplayNumber)(e,{locale:n,minimumFractionDigits:en,maximumFractionDigits:en});if(!t)return r();try{return(0,i.formatDisplayNumber)(e,{locale:n,currency:t})}catch{return`${t} ${r()}`}}function nn(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 rn(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 an(e,t,n,r){if(!e||!t.relationshipField)return!1;let i=t.relationshipField;return kt(``,n,{},[{childObject:t.childObject,relationshipField:i,rows:e.rows,original:e.original.map(e=>({...e,[i]:n})),childSchema:r}]).length>1}function on(e){return{record:e,objectFields:null,seq:0,listeners:new Set}}function sn(e,t,n,r){if(!e)return e;let i=n!=null&&n!==``,a=new Map,o=(e,t)=>{Promise.resolve(e).then(t,()=>void 0)};return new Proxy(e,{get(e,s){let c=Reflect.get(e,s,e);if(typeof c!=`function`)return c;if(!a.has(s)){let l=t=>c.apply(e,t),u;u=s===`findOne`&&i?(...e)=>{let i=l(e);if(e[0]===t&&String(e[1])===String(n)){let e=++r.seq;o(i,t=>{e===r.seq&&(r.record=t??{},r.listeners.forEach(e=>e(`record`)))})}return i}:s===`getObjectSchema`?(...e)=>{let n=l(e);return e[0]===t&&o(n,e=>{let t=e?.fields;r.objectFields=t?Object.keys(t):[],r.listeners.forEach(e=>e(`objectFields`))}),n}:c.bind(e),a.set(s,u)}return a.get(s)}})}function cn(e){let t=e=>(e??[]).map(ae).filter(e=>typeof e==`string`);return e.sections?.length?e.sections.flatMap(e=>t(e?.fields)):e.fields?.length?t(e.fields):null}function ln(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 un(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 dn=({entries:e,rowState:r,setRows:o,saving:s,formHostRef:u,taxRateField:f,headerRecord:p,declaredHeaderFieldNames:m,onRowExpand:h,onAddViaForm:g,parentObjectName:_,formMode:v})=>{let ee=(0,i.useDisplayLocale)(),{currency:y}=(0,i.useLocalization)(),{t:b}=pt(),x=(0,c.usePermissions)(),[S,C]=(0,t.useState)(p.record),[w,T]=(0,t.useState)(p.objectFields),[E,D]=(0,t.useState)(null),O=(0,t.useRef)(``);(0,t.useEffect)(()=>{let e=e=>{if(e===`objectFields`){T(p.objectFields);return}O.current=``,D(null),C(p.record)};return e(`record`),e(`objectFields`),p.listeners.add(e),()=>{p.listeners.delete(e)}},[p]),(0,t.useEffect)(()=>{let e=u.current;if(!e)return;let t=()=>{let t=ln(e),n;try{n=JSON.stringify(t)}catch{n=String(Math.random())}n!==O.current&&(O.current=n,D(t))};return e.addEventListener(`input`,t),e.addEventListener(`change`,t),()=>{e.removeEventListener(`input`,t),e.removeEventListener(`change`,t)}},[u]);let k=(0,t.useMemo)(()=>E?{...S,...E}:S,[S,E]),A=Object.prototype.hasOwnProperty.call(k,f)||(m??w??[]).includes(f),j=k[f],M=A?Number.isFinite(Number(j))?Number(j):0:null,N=e.reduce((e,t)=>e+jt(r[t.id]?.rows??[],t.config.amountField||`amount`),0),P=M!==null&&e.some(e=>!!e.config.amountField),F=M??0,te=F/100*N,I=N+te,L=$t(e,y),R=e=>tn(e,L,ee);return(0,d.jsxs)(d.Fragment,{children:[e.map(e=>{let t=e.config,i={objectSchema:null,objectName:t.childObject,perms:x},c=(0,n.resolveAffordance)(`relatedNew`,i).allowed,u=v===`create`||(0,n.resolveAffordance)(`relatedRowDelete`,i).allowed;return(0,d.jsxs)(`section`,{className:`space-y-2`,children:[(0,d.jsx)(`h3`,{className:`text-sm font-medium text-foreground`,children:t.title||b(`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:un(b(`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:un(b(`form.masterDetail.noRelationshipField`,{object:`{{object}}`,parent:`{{parent}}`,property:`{{property}}`}),{object:t.childObject,parent:_,property:`relationshipField`})}):t.columns?.length?(0,d.jsx)(a.LineItemsField,{value:r[e.id]?.rows??[],onChange:t=>o(e.id,t),disabled:s,contextRecord:k,...(0,l.isInlineRowFormOffered)({inlineMode:t.inlineMode,formFields:t.formFields,columns:t.columns})?{onRowExpand:t=>h(e.id,t)}:{},displayMode:t.inlineMode===`form`?`list`:`grid`,...t.inlineMode===`form`?{onAdd:()=>g(e.id)}:{},field:{columns:he(t.columns,{perms:x,objectName:t.childObject,mode:v}),totalField:P?void 0:t.amountField||(t.totalField?`amount`:void 0),sortField:e.sortField,minRows:t.minRows,maxRows:t.maxRows,allowAdd:c,allowDelete:u,addLabel:t.inlineMode===`form`?t.addLabel||b(`detail.add`):t.addLabel}}):(0,d.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,children:b(`form.masterDetail.loadingColumns`)}):(0,d.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,"data-testid":`md-detail-no-child-object`,children:un(b(`form.masterDetail.noChildObject`,{property:`{{property}}`}),{property:`childObject`})})]},e.id)}),P&&(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:b(`form.masterDetail.subtotal`)}),(0,d.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-subtotal`,children:R(N)})]}),(0,d.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,d.jsx)(`dt`,{className:`text-muted-foreground`,children:b(`form.masterDetail.tax`,{rate:F})}),(0,d.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-tax`,children:R(te)})]}),(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:b(`form.masterDetail.total`)}),(0,d.jsx)(`dd`,{className:`tabular-nums`,"data-testid":`md-grand-total`,children:R(I)})]})]})})]})},fn=({schema:e,dataSource:r,className:s})=>{let c=e.details||[],l=e.mode===`edit`&&!!e.recordId,{language:u}=(0,i.useObjectTranslation)(),f=(0,i.pickLocalized)(e.title,u),{t:p}=pt(),m=(0,a.useBooleanValueLabel)(),h=(0,t.useRef)(m);h.current=m;let g=m(!0),_=m(!1),v=c.some(e=>!e.relationshipField||!e.columns?.length||e.columns.some(e=>!e.type)),ee=(0,t.useMemo)(()=>nn(c),[e.details]),y=(0,t.useMemo)(()=>c.map((e,t)=>({id:ee[t],config:e,status:v?`pending`:`ready`})),[e.details,ee,v]),[b,x]=(0,t.useState)(null),S=b??y,C=(0,t.useMemo)(()=>S.map(e=>e.columnsWith?{...e,config:{...e.config,columns:e.columnsWith(m)}}:e),[S,g,_]);(0,t.useEffect)(()=>{if(!v){x(y);return}if(!r||typeof r.getObjectSchema!=`function`)return;let t=!1;return(async()=>{let n=await Promise.all(y.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={relationshipField:n.relationshipField,columns:n.columns,amountField:n.amountField},i=Yt(n.childObject,a,e.objectName,{booleanLabel:h.current,...r}),o=t=>Yt(n.childObject,a,e.objectName,{booleanLabel:t,...r}).columns,s=n.amountField??i.amountField;return n.relationshipField&&n.columns?.length?{...t,config:{...n,columns:i.columns,amountField:s},status:`ready`,sortField:i.sortField,amountFieldDef:Qt(a,s),columnsWith:o}:{...t,status:`ready`,config:{...n,relationshipField:i.relationshipField,columns:i.columns,formFields:n.formFields??i.formFields,inlineMode:n.inlineMode??i.mode,amountField:s},sortField:i.sortField,amountFieldDef:Qt(a,s),columnsWith:o}}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||x(n)})(),()=>{t=!0}},[r,e.objectName,e.details]);let[w,T]=(0,t.useState)({}),E=(0,t.useRef)(w);E.current=w;let D=(0,t.useRef)({});(0,t.useEffect)(()=>{let e=r;if(!e||typeof e.getObjectSchema!=`function`)return;let t=!1,n=Array.from(new Set(c.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);D.current=i})(),()=>{t=!0}},[r,e.objectName,e.details]);let[O,k]=(0,t.useState)(0),[A,j]=(0,t.useState)(!1),M=(0,t.useRef)(!1),N=(0,t.useRef)(null),P=(0,t.useRef)(!1),F=`form-outcome:${t.default.useId()}`,te=(0,t.useCallback)(()=>{N.current&&=(clearTimeout(N.current),null)},[]),I=(0,t.useCallback)(()=>{M.current=!1,j(!1),te()},[te]),L=(0,t.useCallback)(()=>{M.current=!0,j(!0),te()},[te]),[R,z]=(0,t.useState)(null),B=(0,t.useRef)(null);B.current=R?.entryId??null;let ne=rn(l&&r?S.flatMap(e=>e.config.childObject&&e.config.relationshipField?[e.config.childObject]:[]):[]),V=(0,t.useRef)(0),re=(0,t.useRef)({}),H=(0,t.useRef)(new Set),U=(0,t.useRef)(new Set),ie=(0,t.useRef)({}),W=String(e.recordId),G=(0,t.useCallback)(e=>B.current===e.id||an(E.current[e.id],e.config,W,D.current[e.config.childObject]),[W]),K=(0,t.useCallback)(async function t(n,i){if(i===`bus`){if(G(n)){H.current.add(n.id);return}H.current.delete(n.id)}let a=V.current,o=(re.current[n.id]??0)+1;re.current[n.id]=o;let s=()=>V.current===a&&re.current[n.id]===o,c=n.config;if(!r||!c.relationshipField){T(e=>({...e,[n.id]:{rows:[],original:[]}}));return}let l=i!==`load`,u=E.current[n.id]?.rows,d;try{d=(await r.find(c.childObject,{$filter:{[c.relationshipField]:e.recordId},...n.sortField?{$orderby:[{field:n.sortField,order:`asc`},{field:`id`,order:`asc`}]}:{},$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&&B.current===n.id){H.current.add(n.id);return}if(l&&E.current[n.id]?.rows!==u){t(n,`bus`);return}T(e=>l&&(e[n.id]?.rows!==u||B.current===n.id)?(H.current.add(n.id),e):{...e,[n.id]:{rows:d.map(e=>({...e})),original:d.map(e=>({...e}))}})}},[r,e.recordId,G]);(0,t.useEffect)(()=>{if(H.current.clear(),U.current.clear(),l&&r)for(let e of S)K(e,`load`);return()=>{V.current+=1}},[l,r,e.recordId,b]),(0,t.useEffect)(()=>{for(let e of S){let t=e.config.childObject;if(!t||!e.config.relationshipField)continue;let n=ne[t]??0,r=ie.current[e.id];ie.current[e.id]=n,r!==void 0&&r!==n&&K(e,`bus`)}},[ne,S,K]),(0,t.useEffect)(()=>{if(A)return;let e=H.current;for(let t of S)e.has(t.id)&&B.current!==t.id&&(U.current.has(t.id)||!G(t))&&(e.delete(t.id),K(t,`replay`));U.current.clear()},[w,A,R,S,K,G]);let q=(0,t.useCallback)((e,t)=>{T(n=>({...n,[e]:{rows:t,original:n[e]?.original??[]}}))},[]),J=e.taxRateField||`tax_rate`,ae=R?w[R.entryId]?.rows?.[R.rowIdx]:void 0,Y=R?S.find(e=>e.id===R.entryId)?.config:void 0,oe=(0,t.useCallback)((e,t,n)=>{T(r=>{let i=r[e]??{rows:[],original:[]};return{...r,[e]:{...i,rows:i.rows.map((e,r)=>r===t?{...e,...n}:e)}}})},[]),se=(0,t.useCallback)(e=>{T(t=>{let n=t[e]??{rows:[],original:[]},r=[...n.rows,{}];return z({entryId:e,rowIdx:r.length-1,isNew:!0}),{...t,[e]:{...n,rows:r}}})},[]),le=(0,t.useCallback)(()=>{z(e=>(e?.isNew&&T(t=>{let n=t[e.entryId];return n?{...t,[e.entryId]:{...n,rows:n.rows.filter((t,n)=>n!==e.rowIdx)}}:t}),null))},[]),X=(0,t.useCallback)(async t=>{I(),e.onSuccess||o.toast.success(l?f?p(`form.savedNamed`,{title:f}):p(`form.saved`):p(`form.created`),{id:F}),l||(T({}),k(e=>e+1)),await e.onSuccess?.(t)},[l,e.onSuccess,f,S.length,I,F,p]),ue=(0,t.useCallback)(t=>{P.current||I(),e.onError?.(t)},[e,I]),de=(0,t.useCallback)(async t=>{if(!r)throw Error(`MasterDetailForm: dataSource is required`);let i={...t};S.forEach(e=>{let t=e.config;t.totalField&&(i[t.totalField]=jt(E.current[e.id]?.rows??[],t.amountField||`amount`))});let a=l?S.filter(e=>e.config.relationshipField).map(e=>({entryId:e.id,input:{childObject:e.config.childObject,relationshipField:e.config.relationshipField,rows:E.current[e.id]?.rows??[],original:E.current[e.id]?.original??[],childSchema:D.current[e.config.childObject]}})):null,o=a?kt(e.objectName,String(e.recordId),i,a.map(e=>e.input)):Ot(e.objectName,i,S.filter(e=>e.config.relationshipField).map(e=>({childObject:e.config.childObject,relationshipField:e.config.relationshipField,rows:E.current[e.id]?.rows??[],childSchema:D.current[e.config.childObject]}))),s=await(0,n.runBatchTransaction)(r,o);if(a){let e=Zt(o,s?.results,a);for(let t of e)U.current.add(t.entryId);T(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,S,e.objectName,e.recordId,l]),fe=(0,t.useCallback)(async e=>{if(P.current)throw Error(`This save was not sent: another save of this form was still in progress.`);P.current=!0,L();try{return await de(e)}finally{P.current=!1}},[de,L]),pe=(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:f||void 0,showSubmit:!1,showCancel:!1,submitHandler:fe,onSuccess:X,onError:ue}),[e,f,fe,X,ue]),me=(0,t.useRef)(null),he=!!e.recordId&&(e.mode??`create`)!==`create`,ge=he?{}:ce(e),_e;try{_e=JSON.stringify([e.objectName,he?String(e.recordId):null,O,ge])}catch{_e=JSON.stringify([e.objectName,he?String(e.recordId):null,O])}let ve=(0,t.useRef)(null);if(!ve.current||ve.current.key!==_e||ve.current.source!==r){let t=ve.current?.key===_e?ve.current.feed:on(ge);ve.current={key:_e,source:r,feed:t,dataSource:sn(r,e.objectName,he?e.recordId:void 0,t)}}let{feed:Z,dataSource:ye}=ve.current,be=(0,i.pickLocalized)(e.submitText,u)||p(l?`common.save`:`form.create`),xe=(0,i.pickLocalized)(e.cancelText,u)||p(`common.cancel`),Q=lt(),Se=(0,t.useCallback)(()=>{if(Q.uploading){o.toast.error(Q.reason);return}M.current||me.current?.querySelector(`form`)&&(M.current=!0,j(!0),o.toast.dismiss(F),setTimeout(()=>{(me.current?.querySelector(`form`))?.requestSubmit()},0),N.current=setTimeout(()=>I(),1500))},[I,F,Q.uploading,Q.reason]);return(0,t.useEffect)(()=>()=>{N.current&&clearTimeout(N.current)},[]),(0,d.jsx)(ut,{gate:Q,children:(0,d.jsxs)(`div`,{className:(0,o.cn)(`space-y-6`,s,e.className),children:[(0,d.jsx)(`div`,{ref:me,children:(0,d.jsx)(Zn,{schema:pe,dataSource:ye},O)}),(0,d.jsx)(dn,{entries:C,rowState:w,setRows:q,saving:A,formHostRef:me,taxRateField:J,headerRecord:Z,declaredHeaderFieldNames:cn(e),onRowExpand:(e,t)=>z({entryId:e,rowIdx:t}),onAddViaForm:se,parentObjectName:e.objectName,formMode:l?`edit`:`create`}),R&&Y&&(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:p(`form.masterDetail.rowTitle`,{title:Y.title||p(`form.masterDetail.lineItem`),row:R.rowIdx+1})}),(0,d.jsx)(o.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs text-muted-foreground`,onClick:le,children:p(`common.close`)})]}),(0,d.jsx)(o.CardContent,{children:(0,d.jsx)(`fieldset`,{disabled:A,className:`min-w-0`,children:(0,d.jsx)(Zn,{schema:{type:`object-form`,objectName:Y.childObject,mode:`edit`,initialData:ae??{},...Y.formFields?.length?{fields:Y.formFields}:{},submitText:p(`form.masterDetail.applyRow`),submitHandler:async e=>e,onSuccess:e=>{oe(R.entryId,R.rowIdx,e),z(null)},onCancel:le},dataSource:r},`row-${R.entryId}-${R.rowIdx}`)})})]}),e.showSubmit!==!1&&(0,d.jsxs)(`div`,{className:`border-t border-border pt-4`,children:[(0,d.jsx)(dt,{gate:Q}),(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:A,"data-testid":`md-form-cancel`,children:xe}),(0,d.jsx)(o.Button,{type:`button`,onClick:Se,disabled:A||v&&!b||Q.uploading,"data-testid":`md-form-submit`,children:Q.uploading?Q.busyLabel:A?p(`detail.saving`):be})]})]})]})})};function pn(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){G(r,e.objectName);continue}n.push(t)}return R(n,e.customFields,t=>{let n=e.objectSchema?.fields?.[t];if(n)return{...J(t,e),group:n.group}})}function mn(e){return e.mode!==`create`&&!!e.recordId&&!!e.dataSource&&e.loadedRecordId!==e.recordId}function hn(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},...e.visibleWhen===void 0?{}:{visibleWhenFault:`hidden`},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 gn(e,t){return!!e||!!t}function _n(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 vn=new Set;function yn(e,t){vn.has(t)||(vn.add(t),console.warn(`[object-ui] ${_n(e)}`))}function bn(e,t){let n=!!e.collapsible||!!e.collapsed,r=gn(t.title,t.description);n&&!r&&yn(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 xn=4;function Sn(e){let{key:t,title:n,description:r,visibleWhen:i,visibleWhenFault:a,members:o,className:s,collapse:c}=e;if(!gn(n,r))return i==null?[]:[{name:`__section_gate_${t}`,type:`section-divider`,visibleWhen:i,...a===void 0?{}:{visibleWhenFault:a},fields:o,colSpan:xn}];let l={name:`__section_${t}`,label:n,type:`section-divider`,description:r,visibleWhen:i,fields:o,colSpan:xn};return a!==void 0&&(l.visibleWhenFault=a),s!==void 0&&(l.className=s),c&&(l.collapsible=c.collapsible,l.collapsed=c.collapsed,l.onToggle=c.onToggle),[l]}var Cn=`input:not([type="hidden"]), select, textarea, button, [tabindex]:not([tabindex="-1"]), [contenteditable="true"]`,wn=`[hidden], [inert], [aria-hidden="true"], fieldset[disabled], [role="tabpanel"][data-state="inactive"]`;function Tn(e){return e.disabled===!0||e.readOnly===!0||e.getAttribute(`aria-disabled`)===`true`||e.getAttribute(`aria-readonly`)===`true`||e.tabIndex<0?!1:e.closest(wn)===null}function En(e){for(let t of Array.from(e.querySelectorAll(`[data-field]`)))for(let e of Array.from(t.querySelectorAll(Cn)))if(Tn(e))return e;return null}function Dn(e){let t=En(e);return t?(t.focus({preventScroll:!0}),t.ownerDocument.activeElement===t):!1}function On(){let e=(0,t.useRef)(null);return(0,t.useEffect)(()=>()=>{e.current?.(),e.current=null},[]),(0,t.useMemo)(()=>{let t=()=>{e.current?.(),e.current=null};return{onOpenAutoFocus:n=>{t();let r=n.currentTarget;if(!r||typeof r.focus!=`function`||(n.preventDefault(),Dn(r)))return;r.focus({preventScroll:!0});let i=r.ownerDocument,a=i.defaultView;if(!a||typeof a.MutationObserver!=`function`)return;let o=new a.MutationObserver(()=>{if(i.activeElement!==r){t();return}Dn(r)&&t()});o.observe(r,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`disabled`,`readonly`,`hidden`,`inert`,`style`,`tabindex`,`data-state`,`aria-disabled`,`aria-readonly`,`aria-hidden`]}),e.current=()=>o.disconnect()},onCloseAutoFocus:()=>t()}},[])}var kn=(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`),An=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:a,sectionLabel:s}=(0,r.useSafeFieldLabel)(),l=(0,c.usePermissions)(),{userId:f}=l,{t:p}=kn(),m=lt(),h=(0,r.usePreviewMode)(),[g,_]=(0,t.useState)(null),v=(0,t.useCallback)(t=>pe(t,{perms:l,objectName:e.objectName,mode:e.mode,objectSchema:g}),[l,e.objectName,e.mode,g]),[y,b]=(0,t.useState)([]),[x,S]=(0,t.useState)({}),[C,w]=(0,t.useState)(!0),[T,E]=(0,t.useState)(at),D=(0,t.useRef)({schema:0,record:0}),O=st(T),[k,A]=(0,t.useState)(!1),[j,M]=(0,t.useState)(!1),{saveWithOcc:N,conflictDialog:P}=it(),[F,L]=(0,t.useState)(!1),R=(0,t.useRef)(!1),z=e.confirmOnDiscard!==!1,B=e.open!==!1,V=e.drawerSide||`right`,H=(0,t.useId)(),U=On(),[ie,W]=(0,t.useState)({}),G=(e,n)=>(0,t.startTransition)(()=>W(t=>({...t,[e]:n})));(0,t.useEffect)(()=>{let t=!1,r=ot(D,E,`schema`);return(async()=>{if(!n){w(!1);return}try{let i=await n.getObjectSchema(e.objectName);if(t)return;_(i),r.commit()}catch(e){if(t)return;r.fail(e),w(!1)}})(),()=>{t=!0}},[e.objectName,n]);let K=(0,t.useRef)(void 0),q=(0,t.useRef)(null),{refetch:J,onDirtyChange:ae,saved:Y}=ee(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`),oe=(0,t.useCallback)(e=>{A(e),ae(e)},[ae]);(0,t.useEffect)(()=>{let t=!1,r=ot(D,E,`record`);return(g||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){q.current=null,S(te(g,ce(e),{currentUserId:f})),r.commit(),w(!1);return}if(!n){q.current=null,S(ce(e)),r.commit(),w(!1);return}K.current!==e.recordId&&(w(!0),A(!1));try{let i=await n.findOne(e.objectName,e.recordId);if(t)return;K.current=e.recordId,q.current=Ce(e,i),S(i||{}),r.commit()}catch(e){if(t)return;r.fail(e)}finally{t||w(!1)}})(),()=>{t=!0}},[g,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName,J]);let X=(0,t.useCallback)(t=>se(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=mn({mode:e.mode,recordId:e.recordId,dataSource:n,loadedRecordId:K.current}),r=()=>{t||w(!1)};if(e.sections?.length){r();return}(g||e.customFields?.length)&&(b(pn({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 ue=(0,t.useMemo)(()=>{if(e.sections?.length)return null;let t=ze(y,g);e.mode===`create`&&(t=Ve(t,g));let n=hn(t,g?.fieldGroups);if(!n)return null;let r=e.columns&&e.columns>0?Math.min(Math.floor(e.columns),4):Pe(t.length);return n.map(e=>({...e,columns:r}))},[e.sections,e.columns,e.mode,y,g]),de=(0,t.useCallback)(async t=>{if(m.uploading){o.toast.error(m.reason);return}L(!0);try{if(!n&&!e.submitHandler&&ne(e))return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=le(l,e.objectName,e.mode),a=ye(t,g,{canEdit:i}),o={values:t,objectSchema:g,canEdit:i},s=e.mode===`create`?I(Ee(a,x,o),g):Te(a,q.current,e,o);if(e.submitHandler)r=await e.submitHandler(s);else if(!n)throw re();else if(e.mode===`create`)r=await n.create(e.objectName,s);else if(e.mode===`edit`&&e.recordId){let t=await N({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:s,baseRecord:x});if(t.status===`cancelled`)return;r=t.result}return q.current=Oe(q.current,e,s),Y(),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{L(!1)}},[e,n,g,N,x,l,m.uploading,m.reason,Y]),me=(0,t.useCallback)(()=>{M(!1),R.current&&(R.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),he=(0,t.useCallback)(e=>{R.current=e,z&&k?M(!0):me()},[z,k,me]);(0,t.useEffect)(()=>{if(!B||!k||!z)return;let e=e=>{e.preventDefault(),e.returnValue=``};return window.addEventListener(`beforeunload`,e),()=>window.removeEventListener(`beforeunload`,e)},[B,k,z]);let ge=(0,t.useCallback)(()=>{R.current=!0,me()},[me]),ve=(0,t.useMemo)(()=>{if(e.drawerWidth)return V===`left`||V===`right`?{width:e.drawerWidth,maxWidth:e.drawerWidth}:{height:e.drawerWidth,maxHeight:e.drawerWidth}},[e.drawerWidth,V]),Z=e.layout??`vertical`,be=e.showSubmit!==!1&&e.mode!==`view`,xe=e.showCancel!==!1,Q=e.submitText||(e.mode===`create`?p(`form.create`):p(`form.update`)),Se=e.cancelText||p(`common.cancel`),we={type:`form`,objectName:e.objectName,layout:Z,defaultValues:x,previousValues:e.mode===`edit`&&e.recordId?x:void 0,submitLabel:Q,cancelLabel:Se,showSubmit:be,showCancel:xe,onSubmit:de,onCancel:ge,onDirtyChange:oe,showActions:!1,id:H},De=()=>{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:p(`form.errorLoading`)}),(0,d.jsx)(`p`,{className:`text-red-600 text-sm mt-1`,children:O.message})]});if(C)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(X(n)),o=bn(n,{live:ie[i],title:n.label,description:n.description,where:`DrawerForm section '${i}' of object '${e.objectName}'`,setCollapsed:e=>G(i,e)});t.push(...Sn({key:i,title:n.label,description:n.description,visibleWhen:n.visibleWhen,visibleWhenFault:n.visibleWhenFault,members:a.map(e=>e.name),collapse:o})),o.collapsed?t.push(...a.map(e=>({...e,hidden:!0}))):t.push(...a)});let n={...we,fields:t};return(0,d.jsx)(r.SchemaRenderer,{schema:n})}if(ue?.length){let t=Number(ue[0]?.columns)||1,n=[];ue.forEach((r,i)=>{let a=v(X(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=bn(r,{live:ie[o],title:c,description:r.description,where:`DrawerForm field group '${o}' of object '${e.objectName}'`,setCollapsed:e=>G(o,e)});n.push(...Sn({key:o,title:c,description:r.description,visibleWhen:r.visibleWhen,visibleWhenFault:r.visibleWhenFault,members:a.map(e=>e.name),collapse:l}));let u=t>1?Le(a,t):a;n.push(...l.collapsed?u.map(e=>({...e,hidden:!0})):u)});let i=He[t],a={...we,fields:n,columns:t,...i?{fieldContainerClass:i}:{}};return(0,d.jsx)(r.SchemaRenderer,{schema:a})}let t=Ze(v(y),g,e.columns,e.mode),n=He[t.columns||1],i={...we,fields:t.fields,columns:t.columns,...n?{fieldContainerClass:n}:{}};return(0,d.jsx)(r.SchemaRenderer,{schema:i})},ke=!O&&!C?(0,d.jsx)(_e,{affordance:fe({perms:l,objectName:e.objectName,mode:e.mode,objectSchema:g}),objectName:e.objectName,objectSchema:g}):null,$=e.subforms,Ae=$?.length&&e.mode!==`view`?(0,d.jsx)(fn,{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:Se,details:$,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:[ke,De()]});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})]}),Ae]}):(0,d.jsx)(o.Sheet,{open:B,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}he(!1)},children:(0,d.jsxs)(o.SheetContent,{side:V,onOpenAutoFocus:U.onOpenAutoFocus,onCloseAutoFocus:U.onCloseAutoFocus,className:(0,o.cn)(`overflow-y-auto`,i,e.className),style:ve,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)(ut,{gate:m,children:(0,d.jsx)(t.Suspense,{fallback:(0,d.jsx)(jn,{}),children:Ae})})}),!O&&!C&&!($?.length&&e.mode!==`view`)&&(be||xe)&&(0,d.jsxs)(`div`,{className:`shrink-0 border-t px-4 py-3 bg-background`,"data-testid":`drawer-form-footer`,children:[(0,d.jsx)(dt,{gate:m}),(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:ge,disabled:F,className:`w-full sm:w-auto`,children:Se}),be&&(0,d.jsxs)(o.Button,{type:`submit`,form:H,disabled:F||m.uploading,className:`w-full sm:w-auto`,children:[F&&(0,d.jsx)(u.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),m.uploading?m.busyLabel:Q]})]})]}),(0,d.jsx)(o.AlertDialog,{open:j,onOpenChange:M,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:()=>{R.current=!1},children:p(`form.keepEditing`)}),(0,d.jsx)(o.AlertDialogAction,{onClick:me,children:p(`form.discard`)})]})]})}),P]})})};function jn(){return(0,d.jsx)(`div`,{className:`space-y-4`,"data-testid":`drawer-form-body-pending`,"aria-hidden":`true`,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))})}var Mn=[`name`,`label`,`description`,`collapsible`,`collapsed`,`visibleWhen`],Nn=[`columns`,`pane`],Pn=new Set;function Fn(e,t){Pn.has(e)||(Pn.add(e),t())}function In(e){return Array.isArray(e)&&e.some(e=>typeof e==`object`&&!!e&&typeof e.group==`string`)}function Ln(e){let t=e?.fields;return!t||typeof t!=`object`?null:hn(Object.entries(t).map(([e,t])=>({name:e,group:t?.group})),e?.fieldGroups)}function Rn(e,t){if(!In(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`&&Fn(`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`?zn(e,[]):e)}let s=a?Ln(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=Bn(e);Vn(e,t,r);let i=c.get(t);return i?{...i,...n}:((a||!o)&&Fn(`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\`.)`)),zn(e,[]))})}function zn(e,t){return{...Bn(e),fields:t}}function Bn(e){let t={};for(let n of Nn){let r=e[n];r!==void 0&&(t[n]=r)}return t}function Vn(e,t,n){let r=Mn.filter(t=>e[t]!==void 0);r.length!==0&&Fn(`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 Hn=(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`),Un={sm:`sm:max-w-sm`,default:`sm:max-w-lg`,lg:`sm:max-w-2xl ${o.DIALOG_VIEWPORT_GUTTER}`,xl:`sm:max-w-5xl ${o.DIALOG_VIEWPORT_GUTTER}`,full:`sm:max-w-[95vw] sm:w-full`},Wn=2,Gn=e=>typeof e==`number`&&e>0?Math.min(Math.floor(e),4):void 0,Kn=({schema:e,dataSource:n,className:i})=>{let{fieldLabel:a,sectionLabel:s}=(0,r.useSafeFieldLabel)(),{t:l}=Hn(),f=lt(),p=(0,r.usePreviewMode)(),m=(0,c.usePermissions)(),[h,g]=(0,t.useState)(null),_=(0,t.useCallback)(t=>pe(t,{perms:m,objectName:e.objectName,mode:e.mode,objectSchema:h}),[m,e.objectName,e.mode,h]),[v,y]=(0,t.useState)([]),[b,x]=(0,t.useState)({}),[S,C]=(0,t.useState)(!0),[w,T]=(0,t.useState)(at),E=(0,t.useRef)({schema:0,record:0}),D=st(w),[O,k]=(0,t.useState)(!1),[A,j]=(0,t.useState)(!1),[M,N]=(0,t.useState)(!1),[P,F]=(0,t.useState)({}),L=(e,n)=>(0,t.startTransition)(()=>F(t=>({...t,[e]:n}))),{saveWithOcc:R,conflictDialog:z}=it(),B=(0,t.useRef)(!1),V=e.confirmOnDiscard!==!1,H=e.open!==!1,U=e.modalCloseButton!==!1,ie=(0,t.useId)(),W=On(),G=(0,t.useMemo)(()=>Rn(e.sections,{objectName:e.objectName,formType:e.formType,objectDef:h,resolvable:typeof n?.getObjectSchema==`function`}),[e.sections,e.objectName,e.formType,h,n]),K=(0,t.useMemo)(()=>{if(e.sections?.length)return null;let t=ze(v,h);e.mode===`create`&&(t=Ve(t,h));let n=hn(t,h?.fieldGroups);if(!n)return null;let r=Gn(e.columns)??Wn;return n.map(e=>({...e,columns:r}))},[e.sections,e.columns,e.mode,v,h]),q=G?.length?G:K??void 0,J=e.columns??Wn,ae=(0,t.useMemo)(()=>q?.length?null:Ze(v,h,J,e.mode),[v,h,J,e.mode,q]),Y=Un[(0,t.useMemo)(()=>{if(e.modalSize)return e.modalSize;let t=q?.length?qe(e.columns,q.map(e=>e.columns)):ae?.columns??Wn,n=q?.length?q.reduce((e,t)=>e+(Array.isArray(t.fields)?t.fields.length:0),0):ae?.fields.length??0;return Xe(Math.min(t,Pe(n)))},[e.modalSize,e.columns,ae,q])]||Un.default;(0,t.useEffect)(()=>{let t=!1,r=ot(E,T,`schema`);return(async()=>{if(!n){C(!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),C(!1)}})(),()=>{t=!0}},[e.objectName,n]);let oe=(0,t.useRef)(void 0),X=(0,t.useRef)(null),{refetch:ue,onDirtyChange:de,saved:me}=ee(e.objectName,e.recordId,!!e.recordId&&e.mode!==`create`),he=(0,t.useCallback)(e=>{j(e),de(e)},[de]);(0,t.useEffect)(()=>{let t=!1,r=ot(E,T,`record`);return(h||!n)&&(async()=>{if(e.mode===`create`||!e.recordId){X.current=null,x(te(h,ce(e),{currentUserId:m.userId})),r.commit(),C(!1);return}if(!n){X.current=null,x(ce(e)),r.commit(),C(!1);return}oe.current!==e.recordId&&(C(!0),j(!1));try{let i=await n.findOne(e.objectName,e.recordId);if(t)return;oe.current=e.recordId,X.current=Ce(e,i),x(i||{}),r.commit()}catch(e){if(t)return;r.fail(e)}finally{t||C(!1)}})(),()=>{t=!0}},[h,e.mode,e.recordId,e.initialData,e.initialValues,n,e.objectName,ue]);let ge=(0,t.useCallback)(t=>se(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=mn({mode:e.mode,recordId:e.recordId,dataSource:n,loadedRecordId:oe.current}),r=()=>{t||C(!1)};if(e.sections?.length){r();return}(h||e.customFields?.length)&&(y(pn({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 ve=(0,t.useCallback)(async t=>{if(f.uploading){o.toast.error(f.reason);return}k(!0);try{if(!n&&!e.submitHandler&&ne(e))return e.onSuccess&&await e.onSuccess(t),e.onOpenChange?.(!1),t;let r,i=le(m,e.objectName,e.mode),a=ye(t,h,{canEdit:i}),o={values:t,objectSchema:h,canEdit:i},s=e.mode===`create`?I(Ee(a,b,o),h):Te(a,X.current,e,o);if(e.submitHandler)r=await e.submitHandler(s);else if(!n)throw re();else if(e.mode===`create`)r=await n.create(e.objectName,s);else if(e.mode===`edit`&&e.recordId){let t=await R({dataSource:n,objectName:e.objectName,recordId:e.recordId,payload:s,baseRecord:b});if(t.status===`cancelled`)return;r=t.result}return X.current=Oe(X.current,e,s),me(),e.onSuccess&&await e.onSuccess(r),e.onOpenChange?.(!1),r}catch(t){throw e.onError&&e.onError(t),t}finally{k(!1)}},[e,n,h,m,R,b,f.uploading,f.reason,me]),Z=(0,t.useCallback)(()=>{N(!1),B.current&&(B.current=!1,e.onCancel?.()),e.onOpenChange?.(!1)},[e]),be=(0,t.useCallback)(e=>{B.current=e,V&&A?N(!0):Z()},[V,A,Z]);(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 xe=(0,t.useCallback)(()=>{B.current=!0,Z()},[Z]),Q=e.layout??`vertical`,Se=e.showSubmit!==!1&&e.mode!==`view`,we=e.showCancel!==!1,De=e.submitText||(e.mode===`create`?l(`form.create`):l(`form.update`)),ke=e.cancelText||l(`common.cancel`),$={type:`form`,objectName:e.objectName,layout:Q,defaultValues:b,previousValues:e.mode===`edit`&&e.recordId?b:void 0,submitLabel:De,cancelLabel:ke,showSubmit:Se,showCancel:we,onSubmit:ve,onCancel:xe,onDirtyChange:he,showActions:!1,id:ie},Ae=()=>{if(D)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:D.message})]});if(S)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(G?.length){let t=G,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=Je(e.columns,t.map(e=>e.columns)),o=a.columns,c=a.fieldContainerClass,l=t.map((t,r)=>{let o=_(ge(t)),s=n(t,r),c=i(t);return{key:s,title:c,description:t.description,resolveCollapse:()=>bn(t,{live:P[s],title:c,description:t.description,where:`ModalForm section '${s}' of object '${e.objectName}'`,setCollapsed:e=>L(s,e)}),visibleWhen:t.visibleWhen,visibleWhenFault:t.visibleWhenFault,className:t.className,gridClassName:t.gridClassName,fields:a.layOut(o,t.columns)}}).filter(e=>e.fields.length>0),u={...$,columns:o,...c?{fieldContainerClass:c}:{}};if(e.contentLayout===`tabbed`&&l.length>1){let e={...u,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,visibleWhen:e.visibleWhen,visibleWhenFault:e.visibleWhenFault}))};return(0,d.jsx)(r.SchemaRenderer,{schema:e})}let f=[];l.forEach(e=>{let t=e.resolveCollapse();f.push(...Sn({key:e.key,title:e.title,description:e.description,visibleWhen:e.visibleWhen,visibleWhenFault:e.visibleWhenFault,members:e.fields.map(e=>e.name),className:e.className,collapse:t})),f.push(...t.collapsed?e.fields.map(e=>({...e,hidden:!0})):e.fields)});let p={...u,fields:f};return(0,d.jsx)(r.SchemaRenderer,{schema:p})}if(K?.length){let t=Number(K[0]?.columns)||1,n=[];K.forEach((r,i)=>{let a=_(ge(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=bn(r,{live:P[c],title:o,description:r.description,where:`ModalForm field group '${c}' of object '${e.objectName}'`,setCollapsed:e=>L(c,e)});n.push(...Sn({key:c,title:o,description:r.description,visibleWhen:r.visibleWhen,visibleWhenFault:r.visibleWhenFault,members:a.map(e=>e.name),collapse:l}));let u=t>1?Le(a,t):a;n.push(...l.collapsed?u.map(e=>({...e,hidden:!0})):u)});let i=He[t],a={...$,fields:n,columns:t,...i?{fieldContainerClass:i}:{}};return(0,d.jsx)(r.SchemaRenderer,{schema:a})}let t=ae??Ze(v,h,J,e.mode),n=He[t.columns||1],i={...$,fields:_(t.fields),columns:t.columns,...n?{fieldContainerClass:n}:{}};return(0,d.jsx)(r.SchemaRenderer,{schema:i})},je=e.subforms,Me=!D&&!S?(0,d.jsx)(_e,{affordance:fe({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})]}),Me,Ae()]});if(je?.length&&e.mode!==`view`)return(0,d.jsx)(o.Dialog,{open:H,onOpenChange:e.onOpenChange,children:(0,d.jsxs)(o.MobileDialogContent,{showCloseButton:U,onOpenAutoFocus:W.onOpenAutoFocus,onCloseAutoFocus:W.onCloseAutoFocus,className:(0,o.cn)(Y,`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)(t.Suspense,{fallback:(0,d.jsx)(qn,{}),children:(0,d.jsx)(fn,{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:ke,details:je,onSuccess:async t=>{await e.onSuccess?.(t),e.onOpenChange?.(!1)},onError:e.onError,onCancel:()=>e.onOpenChange?.(!1)},dataSource:n})})})]})});let Ne=!S&&!D&&(Se||we);return(0,d.jsx)(o.Dialog,{open:H,onOpenChange:t=>{if(t){e.onOpenChange?.(!0);return}be(!1)},children:(0,d.jsxs)(o.MobileDialogContent,{showCloseButton:U,onOpenAutoFocus:W.onOpenAutoFocus,onCloseAutoFocus:W.onCloseAutoFocus,className:(0,o.cn)(Y,`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)(ut,{gate:f,children:[Me,(0,d.jsx)(t.Suspense,{fallback:(0,d.jsx)(qn,{}),children:Ae()})]})}),Ne&&(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)(dt,{gate:f}),(0,d.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2 sm:justify-end`,children:[we&&(0,d.jsx)(o.Button,{type:`button`,variant:`outline`,onClick:xe,disabled:O,className:`w-full sm:w-auto`,children:ke}),Se&&(0,d.jsxs)(o.Button,{type:`submit`,form:ie,disabled:O||f.uploading,className:`w-full sm:w-auto`,children:[O&&(0,d.jsx)(u.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),f.uploading?f.busyLabel:De]})]})]}),(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:l(`form.discardTitle`)}),(0,d.jsx)(o.AlertDialogDescription,{children:l(`form.discardMessage`)})]}),(0,d.jsxs)(o.AlertDialogFooter,{children:[(0,d.jsx)(o.AlertDialogCancel,{onClick:()=>{B.current=!1},children:l(`form.keepEditing`)}),(0,d.jsx)(o.AlertDialogAction,{onClick:Z,children:l(`form.discard`)})]})]})}),z]})})};function qn(){return(0,d.jsx)(`div`,{className:`space-y-4`,"data-testid":`modal-form-body-pending`,"aria-hidden":`true`,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))})}function Jn(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 Yn=[`title`,`description`,`submitText`,`cancelText`,`nextText`,`prevText`,`successMessage`];function Xn(e,t){let n=null;for(let r of Yn){let a=e[r];typeof a==`object`&&a&&(n??={...e},n[r]=(0,i.pickLocalized)(a,t)||void 0)}return n??e}var Zn=({schema:e,dataSource:n})=>{let a=(0,c.usePermissions)(),o=In(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=Xn(Jn(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=Rn(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=>ue(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(O(_,v))},[_,v]),g?(0,d.jsx)(fn,{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)(mt,{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,visibleWhenFault:e.visibleWhenFault})),defaultTab:p.defaultTab,tabPosition:p.tabPosition},dataSource:n,className:p.className}):p.formType===`wizard`&&p.sections?.length?(0,d.jsx)(xt,{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)(St,{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,visibleWhenFault:e.visibleWhenFault})),splitDirection:p.splitDirection,splitSize:p.splitSize,splitResizable:p.splitResizable},dataSource:n,className:p.className}):p.formType===`drawer`?(0,d.jsx)(An,{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,visibleWhenFault:e.visibleWhenFault})),open:p.open,onOpenChange:p.onOpenChange,drawerSide:p.drawerSide,drawerWidth:p.drawerWidth},dataSource:n,className:p.className}):p.formType===`modal`?(0,d.jsx)(Kn,{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,visibleWhenFault:e.visibleWhenFault})),open:p.open,onOpenChange:p.onOpenChange,modalSize:p.modalSize,modalCloseButton:p.modalCloseButton},dataSource:n,className:p.className}):(0,d.jsx)($n,{schema:p,dataSource:n})};function Qn(e,t){return{...e,...t??{}}}var $n=({schema:e,dataSource:n})=>{let{fieldLabel:i,sectionLabel:s}=(0,r.useSafeFieldLabel)(),{t:l}=pt(),u=(0,o.useIsMobile)(),f=lt(),p=(0,c.usePermissions)(),[m,h]=(0,t.useState)(null),g=l(`form.deniedDescription`),_=l(`form.maxFileSize`,{size:``}),v=(0,t.useCallback)(t=>pe(t,{perms:p,objectName:e.objectName,mode:e.mode,objectSchema:m,deniedDescription:g}),[p,e.objectName,e.mode,m,g]),y=fe({perms:p,objectName:e.objectName,mode:e.mode,objectSchema:m}),b=(0,d.jsx)(_e,{affordance:y,objectName:e.objectName,objectSchema:m}),[x,C]=(0,t.useState)([]),[w,O]=(0,t.useState)(null),[k,N]=(0,t.useState)(!0),[P,F]=(0,t.useState)(at),te=t.default.useRef({schema:0,record:0}),I=st(P),[L,B]=(0,t.useState)(null),[V,H]=(0,t.useState)(null);D(V);let{saveWithOcc:U,conflictDialog:ie}=it(),W=t.default.useRef(null),K=e.customFields&&e.customFields.length>0,J=ne(e);(0,t.useEffect)(()=>{K&&(O(ce(e)),e.objectName&&n||N(!1))},[K,e.initialData,e.initialValues,e.objectName,n]),(0,t.useEffect)(()=>{let t=!1,r=ot(te,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(K){h(i),r.commit(),N(!1);return}r.fail(e),N(!1)}})():J?(h(i),r.commit()):N(!1),()=>{t=!0}},[e.objectName,n,K,J]);let Y=!!e.recordId&&e.mode!==`create`&&!K,{refetch:oe,onDirtyChange:X,saved:ue}=ee(e.objectName,e.recordId,Y),de=t.default.useRef(0);(0,t.useEffect)(()=>{let t=oe!==de.current;de.current=oe;let r=!1,i=ot(te,F,`record`);return m&&!K&&(async()=>{if(!e.recordId||e.mode===`create`){W.current=null,O(ce(e)),i.commit(),N(!1);return}if(!K){if(!n){if(J){W.current=null,O(ce(e)),i.commit(),N(!1);return}i.fail(Error(`DataSource is required for fetching record data (inline data not provided)`)),N(!1);return}t||N(!0);try{let t=await n.findOne(e.objectName,e.recordId);if(r)return;W.current=Ce(e,t),O(t),i.commit()}catch(e){if(r)return;console.error(`Failed to fetch record:`,e),i.fail(e)}finally{r||N(!1)}}})(),()=>{r=!0}},[e.objectName,e.recordId,e.mode,e.initialValues,e.initialData,n,m,K,J,oe]);let me=(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){G(t,e.objectName);return}o.push({name:n,entry:t})}),C(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:j(s,A(e)),disabled:e.readOnly||e.mode===`view`||s.readonly,placeholder:s.placeholder,description:(0,a.fieldHelpText)(s),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),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.maxSize)){let e=l(`form.maxFileSize`,{size:(0,a.formatFileSize)(s.maxSize),defaultValue:`Max size: {{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),n}},me)),!K&&e.recordId&&e.mode!==`create`&&n||N(!1)},[m,e.fields,e.customFields,e.readOnly,e.mode,e.objectName,K,e.recordId,n,_]);let he=A(e),ge=t.default.useMemo(()=>he?M(m,{currentUserId:p.userId}):{},[m,he,p.userId]),ve=Qn(ge,w),Z=(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&&ne(e))return e.onSuccess&&await e.onSuccess(t),t;let{payload:i,writePayload:a}=ke(t,e,{objectSchema:m,canEdit:le(p,e.objectName,e.mode),snapshot:W.current,createBaseline:Qn(ge,w)});try{let t;if(e.submitHandler)t=await e.submitHandler(a);else if(!n)throw re();else if(e.mode===`create`)t=await n.create(e.objectName,i);else if(e.mode===`edit`&&e.recordId){let r=await U({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(W.current=Oe(W.current,e,a),ue(),e.onSuccess)await e.onSuccess(t);else if(!e.submitHandler&&e.submitBehavior){let n=e.submitBehavior;switch(n.kind){case`redirect`:{let r=E(n.url,T(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=S(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,p,m,U,w,ge,f.uploading,f.reason,ue,l]),ye=(0,t.useCallback)(()=>{e.onCancel&&e.onCancel()},[e]),be=e.mode===`edit`&&e.recordId&&w&&typeof w==`object`?w:void 0,xe=t.default.useMemo(()=>{let t=ze(x,m);return e.mode===`create`&&(t=Ve(t,m)),t},[x,m,e.mode]),Q=t.default.useMemo(()=>e.sections?.length?null:hn(xe,m?.fieldGroups),[e.sections,xe,m]),Se=e.sections?.length?e.sections:Q,[we,Te]=(0,t.useState)({});if(I)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:I.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(L){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:L.title??l(`publicForm.thankYouTitle`)}),L.message&&(0,d.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:L.message})]});return L.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:L.refusal})]}):e}let Ee=e.layout??`vertical`;if(Se?.length&&(!e.formType||e.formType===`simple`)){let t=Q?xe:x,n=Je(e.columns,Se.map(e=>e.columns)),a=n.columns,o=[],c={objectSchema:m,objectName:e.objectName,readOnly:e.readOnly,mode:e.mode,recordId:e.recordId,fieldLabel:i,customFields:e.customFields,pool:t};Se.forEach((r,i)=>{let a=(r.fields??[]).filter(e=>!z(e)).map(ae);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))&&q(t,e.objectName,r.name||r.label)})}let l=v(se(r,c));if(l.length===0)return;let u=r.name||r.label||String(i),d=r.name?s(e.objectName,r.name,r.label||r.name):r.label,f=bn(r,{live:we[u],title:d,description:r.description,where:`ObjectForm section '${u}' of object '${e.objectName}'`,setCollapsed:e=>Te(t=>({...t,[u]:e}))});o.push(...Sn({key:u,title:d,description:r.description,visibleWhen:r.visibleWhen,visibleWhenFault:r.visibleWhenFault,members:l.map(e=>e.name),collapse:f}));let p=n.layOut(l,r.columns);f.collapsed?o.push(...p.map(e=>({...e,hidden:!0}))):o.push(...p)});let u=o,p=n.fieldContainerClass;return(0,d.jsx)(ut,{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:u,layout:Ee,columns:a,...p?{fieldContainerClass:p}:{},defaultValues:ve,previousValues:be,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:Z,onCancel:ye,onDirtyChange:X}}),(0,d.jsx)(dt,{gate:f}),ie]})})}let De=e.sections?.length,$=v(x),Ae=De?{fields:$,columns:e.columns}:Ze($,m,e.columns,e.mode),je=e.mobile,Me=je?.fullscreenLongText?Ae.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}}):Ae.fields,Ne=je?.stepper,Pe=je?.stepperMinFields??8,Fe=Math.max(1,je?.stepperFieldsPerStep??1);if(!e.formType&&!De&&Me.length>=2&&(Ne===!0||Ne===`auto`&&u&&Me.length>=Pe)){let t=Me,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)(xt,{schema:{...e,formType:`wizard`,sections:r,showStepIndicator:!0},dataSource:n,className:e.className})}let Ie={type:`form`,objectName:e.objectName,fields:Me,layout:Ee,columns:Ae.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:ve,previousValues:be,onSubmit:Z,onCancel:ye,onDirtyChange:X,className:e.className,mobileStickyActions:!!je?.stickyActions};return(0,d.jsx)(ut,{gate:f,children:(0,d.jsxs)(`div`,{className:je?.stickyActions?`w-full pb-20 md:pb-0`:`w-full`,"data-mobile-form":je?`true`:void 0,children:[b,(0,d.jsx)(r.SchemaRenderer,{schema:Ie}),(0,d.jsx)(dt,{gate:f}),ie]})})},er=`https://a.invalid/`,tr=`https://b.invalid/`;function nr(e){try{return new URL(e,er).origin===`https://a.invalid`&&new URL(e,tr).origin===`https://b.invalid`}catch{return!1}}function rr(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=nr(e.url)?i.current:void 0;if(t){t(e.url);return}window.location.href=e.url},e.delayMs);return()=>clearTimeout(t)},[e])}var ir=1e3;function ar(e){return e?Math.max(0,Math.ceil(e.delayMs/1e3)):null}function or(e){let[n,r]=(0,t.useState)(e),[i,a]=(0,t.useState)(()=>ar(e));return e!==n&&(r(e),a(ar(e))),(0,t.useEffect)(()=>{if(!e)return;let t=setInterval(()=>{a(e=>e===null||e<=1?(clearInterval(t),0):e-1)},ir);return()=>clearInterval(t)},[e]),i}var sr=5e3,cr={text:200,email:254,url:2048,phone:32,textarea:sr,...Object.fromEntries(a.RICH_TEXT_FIELD_TYPES.map(e=>[e,sr]))},lr=`_company_website_2`,ur=1500;function dr(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 fr(e){return e&&e.map(e=>{let t=cr[String(e.type||``).toLowerCase()];return!t||e.maxLength?e:{...e,maxLength:t}})}var pr=({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,ee]=(0,t.useState)(null),[y,b]=(0,t.useState)(!1),x=(0,t.useRef)(null),S=(0,t.useRef)(0);(0,t.useEffect)(()=>{a||(S.current=Date.now())},[a]),rr(v);let C=or(v),w=e.honeypot===!1?null:e.honeypot||lr,T=e.minFillTime??ur,E=(0,t.useMemo)(()=>fr(e.customFields),[e.customFields]),D=(0,t.useMemo)(()=>{if(!n||E&&E.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,E,e.fields]),O=(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]),k=(0,t.useCallback)(async t=>{if(e.consent?.required&&!m){_(e.texts?.consentRequired??`Please accept the privacy policy to continue.`);return}if(_(null),w&&x.current?.value){s(!0);return}if(T>0&&Date.now()-S.current<T){p(e.texts?.rateLimited??`Please take a moment to review your answers before submitting.`);return}let r={...t};w&&delete r[w],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(dr(t,e.allowedRedirectHosts)){let n=e.thankYouPage?.redirectDelay??3e3;ee({url:t,delayMs:n})}else console.warn(`[EmbeddableForm] Blocked unsafe redirect target:`,t),b(!0)}}catch(e){p(e instanceof Error?e.message:`Failed to submit form. Please try again.`)}finally{l(!1)}},[n,e,m,w,T]),A=(0,t.useCallback)(()=>{s(!1),p(null),ee(null),b(!1)},[]),j=(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&&C!==null?(n.redirecting??`Redirecting in {{seconds}} seconds…`).replace(`{{seconds}}`,String(C)):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:j,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:A,className:`mt-2`,children:n.submitAnother??`Submit Another Response`}),r&&(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:r}),y&&n.redirectBlocked&&(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n.redirectBlocked})]})})}let M=e.texts??{},N=!!e.consent?.required,P=`${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:j,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:M.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)(Zn,{schema:{type:`object-form`,objectName:e.objectName,mode:`create`,fields:e.fields,customFields:E,initialData:O,onSuccess:k,submitText:c?M.submitting??`Submitting...`:M.submit??`Submit`},dataSource:D}),w&&(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}-${w}`,children:`Do not fill this field`}),(0,d.jsx)(`input`,{ref:x,id:`${e.formId}-${w}`,type:`text`,name:w,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:P,checked:m,onChange:e=>{h(e.target.checked),e.target.checked&&_(null)},"aria-required":N||void 0,"aria-invalid":g?`true`:void 0,"aria-describedby":g?`${P}-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??M.consentLabelDefault??`I agree to the privacy policy.`,N&&(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:M.consentLink??`Privacy policy`})]})]})]}),g&&(0,d.jsx)(`p`,{id:`${P}-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:M.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:M.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`}),M.consentLink??`Privacy policy`]}),(0,d.jsx)(`span`,{children:M.poweredBy??`Powered by ObjectStack`})]})]})]})})};function mr(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 hr=({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?mr(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))})})]})]})},gr=(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 _r(e,t){let n=e?.message;return n?{message:n}:{op:t}}function vr(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function yr(e,t){return vr(e)?e:t}function br(e,t){return e==null||vr(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 xr=({schema:e})=>{let i=(0,r.useSchemaContext)(),{t:s}=gr(),l=(0,a.useBooleanValueLabel)(),u=l(!0),f=l(!1),p=i?.dataSource,m=(0,r.useRecordContext)(),h=(0,c.usePermissions)(),g=e.parentObject||m?.objectName,_=e.parentId||e.recordId||m?.recordId,[v,ee]=(0,t.useState)([]),[y,b]=(0,t.useState)([]),[x,S]=(0,t.useState)(!0),[C,w]=(0,t.useState)(!1),[T,E]=(0,t.useState)(!1),[D,O]=(0,t.useState)(null),k=(0,t.useRef)(0),[A,j]=(0,t.useState)(void 0),M=A!==void 0&&A!==_,N=(0,t.useRef)({dirty:!1,rowsHeldFor:void 0});(0,t.useEffect)(()=>{N.current={dirty:T,rowsHeldFor:A}},[T,A]);let P=(0,t.useRef)(null),F=(0,t.useRef)(!1),[te,I]=(0,t.useState)(0),L=(0,r.usePrintPage)()!==null,[R,z]=(0,t.useState)(null),[B,ne]=(0,t.useState)(!1),[V,re]=(0,t.useState)(null);(0,t.useEffect)(()=>{let t=p;if(!t||typeof t.getObjectSchema!=`function`)return;if(!e.childObject){re(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||re(e??null)}).catch(()=>{n||re(null)}),()=>{n=!0}},[p,e.childObject]),(0,t.useEffect)(()=>{let t=br(e.limit,e.childObject);t&&console.warn(t)},[e.limit,e.childObject]);let H=(0,r.useFilterScope)(),U=(0,r.useResolvedFilter)(e.filter,H),ie=JSON.stringify(U??null),W=JSON.stringify(e.sort??null),G=(0,t.useMemo)(()=>(0,n.toFilterNodeSafely)(U),[ie]),K=G.ok?void 0:G.refusal,q=G.ok?G.node:void 0,J=(0,t.useMemo)(()=>(0,n.convertSortToQueryParams)(e.sort),[W]),ae=(0,r.useDataInvalidation)(p&&_?e.childObject:void 0),Y=(0,t.useCallback)(async(t=`save`)=>{if(t===`inputs`){let t=N.current,n=P.current,r=t.dirty&&t.rowsHeldFor!==void 0&&t.rowsHeldFor===_,i=n!==null&&n.parentId===_&&n.dataSource===p&&n.childObject===e.childObject&&n.relationshipField===e.relationshipField;if(r&&i){F.current=!0;return}}let r=yr(e.limit,500),i=P.current,a=t===`inputs`&&i!==null&&i.parentId===_&&i.dataSource===p&&i.childObject===e.childObject&&i.relationshipField===e.relationshipField&&i.top===r&&i.filterKey===ie&&i.sortKey===W&&N.current.rowsHeldFor===_;F.current=!1;let o=++k.current,s=()=>k.current===o;if(P.current={parentId:_,dataSource:p,childObject:e.childObject,relationshipField:e.relationshipField,top:r,filterKey:ie,sortKey:W},ne(!1),!p||!_){S(!1);return}if(K){S(!1);return}if(!e.childObject){S(!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?ne(!0):S(!0);try{let t={[e.relationshipField]:_},i=await p.find(e.childObject,{$filter:q===void 0?t:(0,n.mergeFilterNodes)(t,q),...J?{$orderby:J}:{},...L?{$top:r+1,$count:!0}:{$top:r}});if(!s())return;let a=i?.data??[],o=L&&a.length>r,c=o?a.slice(0,r):a;z(o?{shown:c.length,total:typeof i?.total==`number`?i.total:void 0}:null),ee(c.map(e=>({...e}))),b(c.map(e=>({...e}))),E(!1),j(_),O(null),F.current&&(F.current=!1,I(e=>e+1))}catch(e){s()&&(O(_r(e,`load`)),j(e=>e??_))}finally{s()&&(S(!1),ne(!1))}},[p,_,e.childObject,e.relationshipField,e.limit,K,q,J,ie,W,L]),oe=(0,t.useRef)({load:Y,parentId:_});(0,t.useEffect)(()=>{oe.current={load:Y,parentId:_}},[Y,_]),(0,t.useEffect)(()=>{Y(`inputs`)},[Y,te,ae]);let se=(0,t.useCallback)(e=>{if(ee(e),E(!0),_){let e=_;j(t=>t??e)}},[_]),ce=(0,t.useCallback)(async()=>{if(!p||!_||!e.childObject||M)return;let t=_,r=()=>oe.current.parentId===t;w(!0),O(null);try{let t=!!(g&&e.totalField),i=t?{[e.totalField]:jt(v,e.amountField||`amount`)}:{},a=kt(g??``,_,i,[{childObject:e.childObject,relationshipField:e.relationshipField,rows:v,original:y,childSchema:V}]);t||(a=a.slice(1)),a.length&&await(0,n.runBatchTransaction)(p,a),r()&&await oe.current.load(`save`)}catch(e){r()&&O(_r(e,`save`))}finally{w(!1)}},[p,_,M,v,y,e,g,V]),le=(0,t.useMemo)(()=>(0,n.resolveAffordance)(`relatedNew`,{objectSchema:V,objectName:e.childObject,perms:h}).allowed,[V,e.childObject,h]),X=(0,t.useMemo)(()=>(0,n.resolveAffordance)(`relatedRowDelete`,{objectSchema:V,objectName:e.childObject,perms:h}).allowed,[V,e.childObject,h]),ue=(0,t.useMemo)(()=>({columns:he(Ht(e.columns,V??void 0,{booleanLabel:l}),{perms:h,objectName:e.childObject}),totalField:e.amountField||(e.totalField?`amount`:void 0),minRows:e.minRows,maxRows:e.maxRows,allowAdd:!e.readonly&&le,allowDelete:!e.readonly&&X}),[e,V,h,le,X,u,f]),[de,fe]=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:ce,disabled:C||x||!T||!_||M,children:s(C?`detail.saving`:`common.save`)})]}),(0,d.jsxs)(o.CardContent,{children:[D&&(0,d.jsx)(`p`,{className:`mb-2 text-sm text-destructive`,children:`message`in D?D.message:s(D.op===`load`?`form.lineItems.loadFailed`:`form.lineItems.saveFailed`)}),K?(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)(K)??``})}),(0,d.jsx)(`p`,{className:`mt-1 text-xs opacity-80`,children:K.message})]}):e.childObject?x?(0,d.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:s(`common.loading`)}):_?M?(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.jsxs)(d.Fragment,{children:[(0,d.jsx)(a.LineItemsField,{value:v,onChange:se,field:ue,readonly:e.readonly,disabled:C||B}),R&&(0,d.jsx)(r.NonGridRowCeilingNote,{result:{rows:Array.from({length:R.shown}),total:R.total,truncated:!0}})]}):(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:[de,(0,d.jsx)(`code`,{className:`font-mono`,children:`childObject`}),fe]})]})]})},Sr=(0,n.elementDataSourceBlock)(({schema:e,dataSource:t})=>{let n=(0,r.useResolvedDataSource)(t),{t:a}=(0,i.useObjectTranslation)();return(0,d.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n,testId:`object-form`,errorTitle:a(`element.form.sourceUnresolved`,{defaultValue:`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),requiresObject:!ne(e),children:e=>(0,d.jsx)(Zn,{schema:e,dataSource:n})})}),Cr={name:`objectName`,type:`string`,description:"Object this form creates or edits. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, and no inline fields (non-empty `customFields`, or `sections` whose every field is inline), the form shows a hint naming this key instead of a form with no fields."};n.ComponentRegistry.register(`object-form`,Sr,{namespace:`plugin-form`,label:`Object Form`,category:`plugin`,inputs:[{...Cr},{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`,Sr,{namespace:`view`,skipFallback:!0,label:`Data Form View`,category:`view`,inputs:[{...Cr},{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 wr=(0,n.elementDataSourceBlock)(({schema:e})=>{let n=(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0,{t:a}=(0,i.useObjectTranslation)();return(0,d.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n,testId:`embeddable-form`,errorTitle:a(`element.form.sourceUnresolved`,{defaultValue:`This form’s data source could not be resolved`}),requiresObject:!0,children:e=>(0,d.jsx)(pr,{config:e,dataSource:n})})});n.ComponentRegistry.register(`embeddable-form`,wr,{namespace:`plugin-form`,label:`Embeddable Form`,category:`plugin`,inputs:[{name:`formId`,type:`string`,required:!0},{name:`objectName`,type:`string`,description:"Object the form creates a record in. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, the form shows a hint naming this key instead of a form that cannot submit."},{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 Tr=(0,n.elementDataSourceBlock)(({schema:e})=>{let n=(0,t.useContext)(r.SchemaRendererContext)?.dataSource??void 0,{t:a}=(0,i.useObjectTranslation)();return(0,d.jsx)(r.ElementDataSourceGate,{schema:e,dataSource:n,testId:`object-master-detail-form`,errorTitle:a(`element.form.sourceUnresolved`,{defaultValue:`This form’s data source could not be resolved`}),requiresObject:!0,children:e=>(0,d.jsx)(fn,{schema:e,dataSource:n})})});n.ComponentRegistry.register(`object-master-detail-form`,Tr,{namespace:`plugin-form`,label:`Master-Detail Form`,category:`plugin`,inputs:[{name:`objectName`,type:`string`,description:"The PARENT object this form creates or edits. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, the form shows a hint naming this key instead of an empty parent form."},{name:`mode`,type:`enum`,enum:[`create`,`edit`]},{name:`sections`,type:`array`},{name:`details`,type:`array`,of:`object`,required:!0,description:"The child collections, one OBJECT per entry, judged by the spec's closed `details` entry: `childObject` (required) names the child object; `relationshipField` is the FK on the child back to the parent, derived from the child's metadata when omitted; `columns` are the line grid's columns as the spec's inline grid column objects (`{ name, … }`, never a bare field name), derived from the child's fields when omitted; `formFields` names the per-row form's fields; `inlineMode` is `grid` (editable cells) or `form` (list + per-row form); `amountField` is the CHILD column summed and `totalField` the PARENT field that sum is saved to; `title`, `minRows`, `maxRows` and `addLabel` dress the section and its grid. An undeclared member key is refused by name. `sortField` is not a member: the line-position field is derived from the child object (objectui#11070), and since `@objectstack/spec` 17.7.0 the entry refuses an authored `sortField` with the spec's retired-key message (objectstack-ai/objectstack#21589)."},{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 NAMED members (a bare name, or the `{ field }` entry) against that pool, so such a 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. An inline field entry (`{ name, type, … }`) names nothing to resolve and is drawn whatever this key lists, as on every form type (objectui#11615). 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 Er={object:`childObject`,filter:!0,sort:!0,limit:`limit`},Dr=(0,n.elementDataSourceBlock)(({schema:e})=>{let{t}=(0,i.useObjectTranslation)();return(0,d.jsx)(r.ElementDataSourceGate,{schema:e,mapping:Er,testId:`record-line-items`,errorTitle:t(`element.lineItems.sourceUnresolved`,{defaultValue:`This line-items panel’s data source could not be resolved`}),children:e=>(0,d.jsx)(xr,{schema:e})})});n.ComponentRegistry.register(`line_items`,Dr,{namespace:`record`,skipFallback:!0,label:`Line Items`,category:`record`,inputs:[{name:`childObject`,type:`string`,description:"The child object whose records the panel lists, edits and saves. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, the panel shows a configuration hint naming this key and loads nothing."},{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=An,e.EmbeddableForm=pr,e.FormAnalytics=hr,e.FormSectionContainer=ht,e.LineItemsPanel=xr,e.MasterDetailForm=fn,e.ModalForm=Kn,e.ObjectForm=Zn,e.SplitForm=St,e.TabbedForm=mt,e.WizardForm=xt,e.applyAutoColSpan=Le,e.applyAutoLayout=Ze,e.containerGridColsFor=Ue,e.deriveColumns=Rt,e.deriveDetail=Yt,e.deriveFormFields=Ut,e.filterAutoGeneratedFields=Ve,e.filterCreateModeFields=Be,e.filterSystemFields=ze,e.findRelationshipField=Lt,e.inferColumns=Pe,e.inferModalSize=Xe,e.isAutoGeneratedFieldType=Ne,e.isRequiredInForm=j,e.isWideFieldType=Me,e.omitServerResolvedDefaults=I,e.optionListDefault=N,e.resolveInlineMode=Kt,e.resolveSectionGroupReferences=Rn,e.sectionEntryName=ae});