@baseplate-dev/project-builder-web
Version:
Web interface for constructing project builder JSON
4 lines (3 loc) • 29.9 kB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-D_oO4W9-.js","assets/_virtual___federation_fn_import-o6aKHb82.js","assets/jsx-runtime-D_zvdyIk.js","assets/index-c0qeY2gs.js","assets/index-DqHVrEeL.js","assets/_commonjsHelpers-CqkleIqs.js","assets/index-B6LhSOJ-.js","assets/index.esm-B0dGSilx.js","assets/sortBy-C9bvycg5.js","assets/immer-B7fdkLVi.js","assets/index-DPK1IfNZ.css","assets/index-bqrQLiwF.js","assets/index-n58UNslG.js"])))=>i.map(i=>d[i]);
import{i as c}from"./_virtual___federation_fn_import-o6aKHb82.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{s as N,S as xe,l as je,h as we,_ as L,i as M}from"./index-D_oO4W9-.js";import{u as Fe}from"./use-definition-schema-Bxe6QzcW.js";import{g as Z,s as ee,b as V,e as D,f as q}from"./index.esm-B0dGSilx.js";import{c as Y,H as J,L as Q,A as X}from"./index-B6LhSOJ-.js";var De=class S{constructor(t,i,n){this.control=t,this.path=i,this.cache=n}static create(t,i){return new S(t,"",i)}focus(t){var i,n,o,s,a,m;const d=t.toString(),u=this.path?`${this.path}.${d}`:d,f=(i=this.cache)==null?void 0:i.get(u,this.reflectedKey);if(f)return f;if(Array.isArray(this.override)){const[b]=this.override,p=new S(this.control,u,this.cache);return p.isArrayItemReflection=!0,p.override=b,(n=this.cache)==null||n.set(p,u),p}else if(this.override){const b=Z(this.override,d);if(!b){const p=new S(this.control,u,this.cache);return(o=this.cache)==null||o.set(p,u),p}if(this.isArrayItemReflection){const p=`${this.path}.${b.path}`,x=new S(this.control,p,this.cache);return(s=this.cache)==null||s.set(x,p),x}else return(a=this.cache)==null||a.set(b,u),b}const C=new S(this.control,u,this.cache);return(m=this.cache)==null||m.set(C,u),C}reflect(t){var i,n,o;const s=(i=this.cache)==null?void 0:i.get(this.path,t);if(s)return s;const a=new S(this.control,this.path,this.cache),m=new Proxy({},{get:(u,f)=>typeof f=="string"?a.focus(f):u}),d=t(m,a);if(Array.isArray(d)){const u=new S(this.control,this.path,this.cache);return a.path="",u.override=t(m,a),u.reflectedKey=t,(n=this.cache)==null||n.set(u,this.path,t),u}else return a.override=d,a.path=this.path,a.reflectedKey=t,(o=this.cache)==null||o.set(a,this.path,t),a}map(t,i){return t.map((n,o,s)=>{const a=this.focus(o.toString());return i(n,a,o,s,this)})}interop(t){var i;return t?t(this.control,this.path):((i=this.interopCache)!=null||(this.interopCache={control:this.control,name:this.path||void 0,...this.override?{getTransformer:this.getTransformer.bind(this),setTransformer:this.setTransformer.bind(this)}:{}}),this.interopCache)}narrow(){return this}assert(){return this}defined(){return this}cast(){return this}getTransformer(t){const[i]=Array.isArray(this.override)?this.override:[this.override];if(!t||!i)return t;const n={};return Object.entries(i).forEach(([o,s])=>{const a=s;if(!a)return;const m=Z(t,a.path);ee(n,o,m)}),n}setTransformer(t){const[i]=Array.isArray(this.override)?this.override:[this.override];if(!t||!i)return t;const n={};return Object.entries(t).forEach(([o,s])=>{const a=i[o];a&&ee(n,a.path,s)}),n}},Se=class{constructor(l){this.cache=new Map,l._subscribe({formState:{values:!0},exact:!0,callback:()=>{l._names.unMount.forEach(t=>{this.delete(t)})}})}get(l,t){const i=this.cache.get(l);if(i)return t?i.complex.get(t):i.plain}set(l,t,i){let n=this.cache.get(t);n||(n={complex:new WeakMap},this.cache.set(t,n)),i?n.complex.set(i,l):n.plain=l}has(l,t){var i,n;return t?(n=(i=this.cache.get(l))==null?void 0:i.complex.has(t))!=null?n:!1:this.cache.has(l)}delete(l){for(const t of this.cache.keys())t.startsWith(l)&&this.cache.delete(t)}clear(){this.cache.clear()}};const{useMemo:Ie}=await c("react");function Ce(l,t=[]){return Ie(()=>{const i=new Se(l.control);return De.create(l.control,i)},[l.control,...t])}const{ModelUtils:Ae}=await c("@baseplate-dev/project-builder-lib"),{createAdminCrudInputWebConfig:$e,useProjectDefinition:Te}=await c("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:te}=await c("@baseplate-dev/ui-components");function Re({formProps:l,name:t,model:i,embeddedFormOptions:n}){const{definition:o}=Te(),s=Ae.getRelationsToModel(o,i.id).map(d=>({label:`${d.relation.foreignRelationName} (${d.model.name})`,value:d.relation.foreignId})),a=t,m=l.control;return e.jsxs(e.Fragment,{children:[e.jsx(te,{label:"Relation Name",control:m,name:`${a}.modelRelationRef`,options:s}),e.jsx(te,{label:"Embedded Form",control:m,name:`${a}.embeddedFormRef`,options:n})]})}const Ee=$e({name:"embedded",pluginKey:void 0,label:"Embedded",getNewInput:()=>({label:"",type:"embedded",modelRelationRef:"",embeddedFormRef:""}),Form:Re}),{createAdminCrudInputWebConfig:Ne,useProjectDefinition:Le}=await c("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:ne}=await c("@baseplate-dev/ui-components");function _e({formProps:l,name:t,model:i,embeddedFormOptions:n}){const{definitionContainer:o}=Le(),s=i.model.relations?.map(d=>({label:`${d.name} (${o.nameFromId(d.modelRef)})`,value:d.id}))??[],a=t,m=l.control;return e.jsxs(e.Fragment,{children:[e.jsx(ne,{label:"Relation Name",control:m,name:`${a}.localRelationRef`,options:s}),e.jsx(ne,{label:"Embedded Form",control:m,name:`${a}.embeddedFormRef`,options:n})]})}const We=Ne({name:"embeddedLocal",pluginKey:void 0,label:"Embedded Local",getNewInput:()=>({label:"",type:"embeddedLocal",embeddedFormRef:"",localRelationRef:""}),Form:_e}),{createAdminCrudInputWebConfig:Pe}=await c("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:Ve}=await c("@baseplate-dev/ui-components");function Me({formProps:l,name:t,model:i}){const n=i.model.fields.filter(a=>a.type==="enum").map(a=>({label:a.name,value:a.id})),o=t,s=l.control;return e.jsx(Ve,{label:"Enum Field",control:s,name:`${o}.modelFieldRef`,options:n})}const Oe=Pe({name:"enum",pluginKey:void 0,label:"Enum",getNewInput:()=>({label:"",type:"enum",modelFieldRef:""}),Form:Me}),{createAdminCrudInputWebConfig:ke,useProjectDefinition:Ue}=await c("@baseplate-dev/project-builder-lib/web"),{InputFieldController:_,SelectFieldController:Be}=await c("@baseplate-dev/ui-components");function Ke({formProps:l,name:t,model:i}){const{definitionContainer:n}=Ue(),o=i.model.relations?.map(m=>({label:`${m.name} (${n.nameFromId(m.modelRef)})`,value:m.id}))??[],s=t,a=l.control;return e.jsxs(e.Fragment,{children:[e.jsx(Be,{label:"Local Relation Name",control:a,name:`${s}.localRelationRef`,options:o}),e.jsx(_,{label:"Label Expression (e.g. name)",control:a,name:`${s}.labelExpression`}),e.jsx(_,{label:"Value Expression (e.g. id)",control:a,name:`${s}.valueExpression`}),e.jsx(_,{label:"Default Label (optional)",control:a,name:`${s}.defaultLabel`}),e.jsx(_,{label:"Empty Label (optional) - only if field is nullable",control:a,name:`${s}.nullLabel`})]})}const ze=ke({name:"foreign",pluginKey:void 0,label:"Foreign",getNewInput:()=>({label:"",type:"foreign",localRelationRef:"",labelExpression:"",valueExpression:"",defaultLabel:"",nullLabel:""}),Form:Ke}),{createAdminCrudInputWebConfig:He}=await c("@baseplate-dev/project-builder-lib/web"),{InputFieldController:Ge,SelectFieldController:qe}=await c("@baseplate-dev/ui-components");function Ye({formProps:l,name:t,model:i}){const n=i.model.fields.map(a=>({label:a.name,value:a.id})),o=t,s=l.control;return e.jsxs(e.Fragment,{children:[e.jsx(qe,{label:"Field",control:s,name:`${o}.modelFieldRef`,options:n}),e.jsx(Ge,{label:"Validation (zod), e.g. z.string().min(1) (optional)",control:s,name:`${o}.validation`})]})}const Je=He({name:"text",pluginKey:void 0,label:"Text",getNewInput:()=>({label:"",type:"text",modelFieldRef:""}),Form:Ye}),ie=[Ee,We,Oe,ze,Je],{createAdminCrudInputSchema:Qe,ModelUtils:Xe}=await c("@baseplate-dev/project-builder-lib"),{adminCrudInputWebSpec:Ze,useDefinitionSchema:et,useProjectDefinition:tt}=await c("@baseplate-dev/project-builder-lib/web"),{Button:oe,Dialog:nt,DialogContent:it,DialogDescription:ot,DialogFooter:lt,DialogHeader:st,DialogTitle:at,InputFieldController:rt,SelectFieldController:ct}=await c("@baseplate-dev/ui-components"),{useId:dt}=await c("react");function mt({open:l,onOpenChange:t,field:i,modelRef:n,embeddedFormOptions:o,isNew:s=!1,onSave:a}){const{definition:m,pluginContainer:d}=tt(),u=et(Qe),f=n?Xe.byIdOrThrow(m,n):void 0,C=d.getPluginSpec(Ze),b=C.getInputWebConfigs(ie).map(h=>({label:h.label,value:h.name})),p=V({resolver:N(u),values:i??{type:"text",label:""}}),{control:x,handleSubmit:y,formState:{isDirty:F}}=p,g=D({control:x,name:"type"}),v=g?C.getInputWebConfig(g,ie):void 0,w=v?.Form,j=y(h=>{a(h),t(!1)}),r=dt();return e.jsx(nt,{open:l,onOpenChange:t,children:e.jsx(it,{className:"sm:max-w-[500px]",children:e.jsxs("form",{id:r,onSubmit:h=>(h.stopPropagation(),j(h)),children:[e.jsxs(st,{children:[e.jsx(at,{children:s?"Add Field":"Edit Field"}),e.jsx(ot,{children:s?"Configure the new form field settings.":"Update the field settings below."})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsx(ct,{label:"Type",control:x,options:b,name:"type"}),e.jsx(rt,{label:"Label",control:x,name:"label",placeholder:"Enter field label"}),w&&f&&e.jsx(w,{formProps:p,name:"",model:f,embeddedFormOptions:o,pluginKey:v.pluginKey})]}),e.jsxs(lt,{children:[e.jsx(oe,{type:"button",variant:"outline",onClick:()=>{t(!1)},children:"Cancel"}),e.jsxs(oe,{form:r,type:"submit",disabled:!F,children:[s?"Add":"Update"," Field"]})]})]})})})}const{Button:O,RecordView:ut,RecordViewActions:pt,RecordViewItem:le,RecordViewItemList:ft,useConfirmDialog:bt}=await c("@baseplate-dev/ui-components"),{useState:k}=await c("react");function ge({className:l,formProps:t,embeddedFormOptions:i}){const{control:n}=t,{requestConfirm:o}=bt(),{fields:s,append:a,remove:m,update:d}=q({control:n,name:"form.fields"}),[u,f]=k(void 0),[C,b]=k(!1),[p,x]=k(!1),y=D({control:n,name:"form.fields"});function F(j){const r=y[j];o({title:"Delete Field",content:`Are you sure you want to delete the field "${r.label||"Untitled"}"?`,onConfirm:()=>{m(j)}})}function g(j){f(y[j]),b(!0)}function v(){f(void 0),x(!0)}function w(j){if(u){const r=y.findIndex(h=>h.id===u.id);r!==-1&&d(r,j)}else a(j)}return e.jsxs("div",{className:Y("space-y-4",l),children:[s.map((j,r)=>e.jsxs(ut,{children:[e.jsxs(ft,{children:[e.jsx(le,{title:"Label",children:e.jsx("div",{className:"flex items-center gap-2",children:j.label})}),e.jsx(le,{title:"Type",children:j.type})]}),e.jsxs(pt,{children:[e.jsx(O,{variant:"ghost",size:"icon",title:"Edit","aria-label":"Edit field",onClick:()=>{g(r)},children:e.jsx(J,{})}),e.jsx(O,{variant:"ghostDestructive",size:"icon",title:"Delete","aria-label":"Delete field",onClick:()=>{F(r)},children:e.jsx(Q,{})})]})]},j.id)),e.jsx(mt,{open:C||p,onOpenChange:j=>{j||(b(!1),x(!1),f(void 0))},field:u,modelRef:D({control:n,name:"modelRef"})||"",embeddedFormOptions:i,isNew:p,onSave:w}),e.jsxs(O,{variant:"secondary",size:"sm",onClick:v,children:[e.jsx(X,{}),"Add Field"]})]})}const{useMemo:ht}=await c("react");function xt(l){const t=q(l);return{fields:ht(()=>l.getTransformer?t.fields.map(l.getTransformer):t.fields,[t.fields,l.getTransformer]),move:t.move,remove:t.remove,swap:t.swap,prepend:(n,o)=>{if(!l.setTransformer)return t.prepend(n,o);const s=Array.isArray(n)?n.map(l.setTransformer):l.setTransformer(n);t.prepend(s,o)},append:(n,o)=>{if(!l.setTransformer)return t.append(n,o);const s=Array.isArray(n)?n.map(l.setTransformer):l.setTransformer(n);t.append(s,o)},insert:(n,o,s)=>{if(!l.setTransformer)return t.insert(n,o,s);const a=Array.isArray(o)?o.map(l.setTransformer):l.setTransformer(o);t.insert(n,a,s)},update:(n,o)=>{if(!l.setTransformer)return t.update(n,o);const s=l.setTransformer(o);t.update(n,s)},replace:n=>{if(!l.setTransformer)return t.replace(n);const o=l.setTransformer(n);t.replace(o)}}}const{adminCrudColumnEntityType:jt}=await c("@baseplate-dev/project-builder-lib"),{createAdminCrudColumnWebConfig:Ct,useProjectDefinition:gt}=await c("@baseplate-dev/project-builder-lib/web"),{InputFieldController:se,SelectFieldController:vt}=await c("@baseplate-dev/ui-components");function yt({formProps:l,model:t}){const{control:i}=l,{definitionContainer:n}=gt(),o=t.model.relations?.map(s=>({label:`${s.name} (${n.nameFromId(s.modelRef)})`,value:s.id}))??[];return e.jsxs(e.Fragment,{children:[e.jsx(vt,{label:"Local Relation",control:i,name:"localRelationRef",options:o,placeholder:"Select a relation"}),e.jsx(se,{label:"Label Expression",control:i,name:"labelExpression",placeholder:"e.g. name",description:"Field to display from the related model"}),e.jsx(se,{label:"Value Expression",control:i,name:"valueExpression",placeholder:"e.g. id",description:"Field to use for matching the relation"})]})}const wt=Ct({name:"foreign",pluginKey:void 0,label:"Foreign Column",isAvailableForModel:(l,t)=>(l.models.find(n=>n.id===t)?.model.relations?.length??0)>0,Form:yt,getNewColumn:()=>({id:jt.generateNewId(),type:"foreign",label:"",localRelationRef:"",labelExpression:"",valueExpression:""})}),{adminCrudColumnEntityType:Ft}=await c("@baseplate-dev/project-builder-lib"),{createAdminCrudColumnWebConfig:Dt}=await c("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:St}=await c("@baseplate-dev/ui-components");function It({formProps:l,model:t}){const{control:i}=l,n=t.model.fields.map(o=>({label:o.name,value:o.id}));return e.jsx(St,{label:"Field",control:i,name:"modelFieldRef",options:n,placeholder:"Select a field"})}const At=Dt({name:"text",pluginKey:void 0,label:"Text Column",Form:It,isAvailableForModel:()=>!0,getNewColumn:()=>({id:Ft.generateNewId(),type:"text",label:"",modelFieldRef:""})}),ae=[wt,At],{createAdminCrudColumnSchema:$t,ModelUtils:Tt}=await c("@baseplate-dev/project-builder-lib"),{adminCrudColumnWebSpec:Rt,useDefinitionSchema:Et,useProjectDefinition:Nt}=await c("@baseplate-dev/project-builder-lib/web"),{Button:re,Dialog:Lt,DialogContent:_t,DialogDescription:Wt,DialogFooter:Pt,DialogHeader:Vt,DialogTitle:Mt,InputFieldController:Ot,SelectFieldController:kt}=await c("@baseplate-dev/ui-components"),{useId:Ut}=await c("react");function Bt({open:l,onOpenChange:t,column:i,modelRef:n,isNew:o=!1,onSave:s}){const{definition:a,pluginContainer:m}=Nt(),d=Et($t),u=n?Tt.byIdOrThrow(a,n):void 0,f=m.getPluginSpec(Rt),C=f.getColumnWebConfigs(ae).filter(r=>r.isAvailableForModel(a,n)).map(r=>({label:r.label,value:r.name})),b=V({resolver:N(d),values:i??{type:"text",label:""}}),{control:p,handleSubmit:x,formState:{isDirty:y}}=b,F=D({control:p,name:"type"}),g=F?f.getColumnWebConfig(F,ae):void 0,v=g?.Form,w=x(r=>{s(r),t(!1)}),j=Ut();return e.jsx(Lt,{open:l,onOpenChange:t,children:e.jsx(_t,{className:"sm:max-w-[425px]",children:e.jsxs("form",{id:j,onSubmit:r=>(r.stopPropagation(),w(r)),children:[e.jsxs(Vt,{children:[e.jsx(Mt,{children:o?"Add Column":"Edit Column"}),e.jsx(Wt,{children:o?"Configure the new table column settings.":"Update the column settings below."})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsx(kt,{label:"Type",control:p,options:C,name:"type"}),e.jsx(Ot,{label:"Label",control:p,name:"label",placeholder:"Enter column label"}),v&&u&&e.jsx(v,{formProps:b,model:u,pluginKey:g.pluginKey})]}),e.jsxs(Pt,{children:[e.jsx(re,{type:"button",variant:"outline",onClick:()=>{t(!1)},children:"Cancel"}),e.jsxs(re,{form:j,type:"submit",disabled:!y,children:[o?"Add":"Update"," Column"]})]})]})})})}const{Button:U,RecordView:Kt,RecordViewActions:zt,RecordViewItem:ce,RecordViewItemList:Ht,useConfirmDialog:Gt}=await c("@baseplate-dev/ui-components"),{useState:B}=await c("react");function ve({className:l,lens:t,modelRef:i}){const{requestConfirm:n}=Gt(),{fields:o,append:s,remove:a,update:m,move:d}=xt(t.interop()),[u,f]=B(void 0),[C,b]=B(!1),[p,x]=B(!1);function y(r){const h=o[r];n({title:"Delete Column",content:`Are you sure you want to delete the column "${h.label||"Untitled"}"?`,onConfirm:()=>{a(r)}})}const F=D(t.interop());function g(r){f(F[r]),b(!0)}function v(){f(void 0),x(!0)}function w(r){if(u){const h=F.findIndex(I=>I.id===u.id);h!==-1&&m(h,r)}else s(r)}const j=o.map((r,h)=>({id:r.id,element:e.jsxs(Kt,{children:[e.jsxs(Ht,{children:[e.jsx(ce,{title:"Label",children:e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{children:r.label||e.jsx("span",{className:"text-muted-foreground",children:"Untitled Column"})})})}),e.jsx(ce,{title:"Type",children:r.type})]}),e.jsxs(zt,{children:[e.jsx(U,{variant:"ghost",size:"icon",title:"Edit","aria-label":"Edit column",onClick:()=>{g(h)},children:e.jsx(J,{})}),e.jsx(U,{variant:"ghostDestructive",size:"icon",title:"Delete","aria-label":"Delete column",onClick:()=>{y(h)},children:e.jsx(Q,{})})]})]},r.id)}));return e.jsxs("div",{className:Y("space-y-4",l),children:[o.length===0?e.jsx("p",{className:"pt-4 text-style-muted",children:"No columns configured. Add columns to display data in your table."}):e.jsx("div",{className:"flex w-full flex-col gap-2",children:e.jsx(xe,{listItems:j,sortItems:d})}),e.jsx(Bt,{open:C||p,onOpenChange:r=>{r||(b(!1),x(!1),f(void 0))},column:u,modelRef:i,isNew:p,onSave:w}),e.jsxs(U,{variant:"secondary",size:"sm",onClick:v,children:[e.jsx(X,{}),"Add Column"]})]})}const{createAdminCrudEmbeddedFormSchema:qt}=await c("@baseplate-dev/project-builder-lib"),{useDefinitionSchema:Yt,useProjectDefinition:ye}=await c("@baseplate-dev/project-builder-lib/web"),{Button:G,CheckboxFieldController:Jt,InputFieldController:Qt,SelectFieldController:de,Table:Xt,TableBody:Zt,TableCell:W,TableHead:P,TableHeader:en,TableRow:me,toast:tn}=await c("@baseplate-dev/ui-components"),{useId:nn}=await c("react");function on({items:l,edit:t,remove:i}){const{definitionContainer:n}=ye();return e.jsxs(Xt,{className:"max-w-6xl",children:[e.jsx(en,{children:e.jsxs(me,{children:[e.jsx(P,{children:"Form Name"}),e.jsx(P,{children:"Model Name"}),e.jsx(P,{children:"Type"}),e.jsx(P,{children:"Actions"})]})}),e.jsx(Zt,{children:l.map((o,s)=>e.jsxs(me,{children:[e.jsx(W,{children:o.name}),e.jsx(W,{children:n.nameFromId(o.modelRef)}),e.jsx(W,{children:o.type}),e.jsxs(W,{className:"space-x-4",children:[e.jsx(G,{variant:"link",size:"none",onClick:()=>{t(s)},children:"Edit"}),e.jsx(G,{variant:"linkDestructive",size:"none",onClick:()=>{i(s)},children:"Remove"})]})]},o.id))})]})}const ln=[{label:"Object",value:"object"},{label:"List",value:"list"}];function sn({initialData:l,onSubmit:t,embeddedFormOptions:i}){const{definition:n}=ye(),o=Yt(qt),s=V({resolver:N(o),defaultValues:l}),{handleSubmit:a,control:m,watch:d}=s,u=n.models.map(x=>({label:x.name,value:x.id})),f=d("type"),C=d("modelRef"),b=Ce({control:m}),p=nn();return e.jsxs("form",{onSubmit:x=>{x.stopPropagation(),a(t)(x).catch(y=>{tn.error(je(y))})},id:p,className:"space-y-4",children:[e.jsx(Qt,{label:"Name",control:m,name:"name"}),e.jsx(de,{label:"Type",control:m,name:"type",options:ln}),e.jsx(Jt,{label:"Include ID Field? (useful for list types)",control:m,name:"includeIdField"}),e.jsx(de,{label:"Model",control:m,options:u,name:"modelRef"}),f==="list"&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:"Table"}),e.jsx(ve,{lens:b.focus("table.columns"),modelRef:C})]}),e.jsx("h2",{children:"Form"}),e.jsx(ge,{formProps:s,embeddedFormOptions:i}),e.jsx(G,{type:"submit",form:p,children:"Save"})]})}const{createAdminCrudActionWebConfig:an}=await c("@baseplate-dev/project-builder-lib/web"),rn=an({name:"delete",pluginKey:void 0,label:"Delete",isAvailableForModel:()=>!0,getNewAction:()=>({type:"delete",position:"dropdown"})}),{createAdminCrudActionWebConfig:cn}=await c("@baseplate-dev/project-builder-lib/web"),dn=cn({name:"edit",pluginKey:void 0,label:"Edit",isAvailableForModel:()=>!0,getNewAction:()=>({type:"edit",position:"inline"})}),ue=[dn,rn],{createAdminCrudActionSchema:mn,ModelUtils:un}=await c("@baseplate-dev/project-builder-lib"),{adminCrudActionWebSpec:pn,useDefinitionSchema:fn,useProjectDefinition:bn}=await c("@baseplate-dev/project-builder-lib/web"),{Button:pe,Dialog:hn,DialogContent:xn,DialogDescription:jn,DialogFooter:Cn,DialogHeader:gn,DialogTitle:vn,SelectFieldController:fe}=await c("@baseplate-dev/ui-components"),{useId:yn}=await c("react");function wn({open:l,onOpenChange:t,action:i,modelRef:n,isNew:o=!1,onSave:s}){const{definition:a,pluginContainer:m}=bn(),d=fn(mn),u=n?un.byIdOrThrow(a,n):void 0,f=m.getPluginSpec(pn),C=f.getActionWebConfigs(ue).filter(r=>r.isAvailableForModel(a,n)).map(r=>({label:r.label,value:r.name})),b=V({resolver:N(d),values:i??{type:"edit",position:"inline"}}),{control:p,handleSubmit:x,formState:{isDirty:y}}=b,F=D({control:p,name:"type"}),g=F?f.getActionWebConfig(F,ue):void 0,v=g?.Form,w=x(r=>{s(r),t(!1)}),j=yn();return e.jsx(hn,{open:l,onOpenChange:t,children:e.jsx(xn,{className:"sm:max-w-[500px]",children:e.jsxs("form",{id:j,onSubmit:r=>(r.stopPropagation(),w(r)),children:[e.jsxs(gn,{children:[e.jsx(vn,{children:o?"Add Action":"Edit Action"}),e.jsx(jn,{children:o?"Configure the new table action settings.":"Update the action settings below."})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsx(fe,{label:"Type",control:p,options:C,name:"type"}),e.jsx(fe,{label:"Position",control:p,options:[{label:"Inline",value:"inline"},{label:"Dropdown",value:"dropdown"}],name:"position"}),v&&u&&e.jsx(v,{formProps:b,model:u,pluginKey:g.pluginKey})]}),e.jsxs(Cn,{children:[e.jsx(pe,{type:"button",variant:"outline",onClick:()=>{t(!1)},children:"Cancel"}),e.jsxs(pe,{form:j,type:"submit",disabled:!y,children:[o?"Add":"Update"," Action"]})]})]})})})}const{Button:K,RecordView:Fn,RecordViewActions:Dn,RecordViewItem:be,RecordViewItemList:Sn,useConfirmDialog:In}=await c("@baseplate-dev/ui-components"),{useState:z}=await c("react");function An({className:l,control:t,modelRef:i}){const{requestConfirm:n}=In(),{fields:o,append:s,remove:a,update:m,move:d}=q({control:t,name:"table.actions"}),[u,f]=z(void 0),[C,b]=z(!1),[p,x]=z(!1);function y(r){const h=o[r];n({title:"Delete Action",content:`Are you sure you want to delete the "${h.type}" action?`,onConfirm:()=>{a(r)}})}const F=D({control:t,name:"table.actions"});function g(r){f(F?.[r]),b(!0)}function v(){f(void 0),x(!0)}function w(r){if(u){const h=(F??[]).findIndex(I=>I.id===u.id);h!==-1&&m(h,r)}else s(r)}const j=o.map((r,h)=>({id:r.id,element:e.jsxs(Fn,{children:[e.jsxs(Sn,{children:[e.jsx(be,{title:"Type",children:e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{className:"capitalize",children:r.type})})}),e.jsx(be,{title:"Position",children:r.position})]}),e.jsxs(Dn,{children:[e.jsx(K,{variant:"ghost",size:"icon",title:"Edit","aria-label":"Edit action",onClick:()=>{g(h)},children:e.jsx(J,{})}),e.jsx(K,{variant:"ghostDestructive",size:"icon",title:"Delete","aria-label":"Delete action",onClick:()=>{y(h)},children:e.jsx(Q,{})})]})]},r.id)}));return e.jsxs("div",{className:Y("space-y-4",l),children:[o.length===0?e.jsx("p",{className:"pt-4 text-style-muted",children:"No actions configured. Add actions to enable row operations."}):e.jsx("div",{className:"flex w-full flex-col gap-2",children:e.jsx(xe,{listItems:j,sortItems:d})}),e.jsx(wn,{open:C||p,onOpenChange:r=>{r||(b(!1),x(!1),f(void 0))},action:u,modelRef:i??"",isNew:p,onSave:w}),e.jsxs(K,{variant:"secondary",size:"sm",onClick:v,children:[e.jsx(X,{}),"Add Action"]})]})}const{useProjectDefinition:$n}=await c("@baseplate-dev/project-builder-lib/web"),{CheckboxFieldController:Tn,ComboboxFieldController:he,SectionListSection:A,SectionListSectionContent:$,SectionListSectionDescription:T,SectionListSectionHeader:R,SectionListSectionTitle:E}=await c("@baseplate-dev/ui-components");function Rn({formProps:l}){const{control:t}=l,{definition:i}=$n(),n=Ce({control:t}),o=i.models.map(d=>({label:d.name,value:d.id})),s=D({control:t,name:"modelRef"}),a=i.models.find(d=>d.id===s)?.model.fields.map(d=>({label:d.name,value:d.id}))??[],m=D({control:t,name:"embeddedForms"})?.map(d=>({label:d.name,value:d.id}))??[];return e.jsxs(e.Fragment,{children:[e.jsxs(A,{children:[e.jsxs(R,{children:[e.jsx(E,{children:"Model Configuration"}),e.jsx(T,{children:"Configure the data model and basic settings for this CRUD section."})]}),e.jsxs($,{className:"space-y-6",children:[e.jsx(he,{label:"Model",control:t,options:o,name:"modelRef"}),e.jsx(he,{label:"Name Field",control:t,options:a,description:"The field to use as the name of the record (used in breadcrumbs/title of edit page)",name:"nameFieldRef"}),e.jsx(Tn,{label:"Disable Create?",control:t,name:"disableCreate"})]})]}),e.jsxs(A,{children:[e.jsxs(R,{children:[e.jsx(E,{children:"Table Configuration"}),e.jsx(T,{children:"Configure which columns to display in the data table."})]}),e.jsx($,{children:e.jsx(ve,{lens:n.focus("table.columns"),modelRef:s})})]}),e.jsxs(A,{children:[e.jsxs(R,{children:[e.jsx(E,{children:"Table Actions"}),e.jsx(T,{children:"Configure actions available for each row in the table. Drag to reorder."})]}),e.jsx($,{children:e.jsx(An,{control:t,modelRef:s})})]}),e.jsxs(A,{children:[e.jsxs(R,{children:[e.jsx(E,{children:"Form Configuration"}),e.jsx(T,{children:"Configure the form fields for creating and editing records."})]}),e.jsx($,{children:e.jsx(ge,{formProps:l,embeddedFormOptions:m})})]}),e.jsxs(A,{children:[e.jsxs(R,{children:[e.jsx(E,{children:"Embedded Forms"}),e.jsx(T,{children:"Configure embedded forms for related data objects."})]}),e.jsx($,{children:e.jsx(we.LabelledController,{control:t,name:"embeddedForms",renderForm:d=>e.jsx(sn,{...d,embeddedFormOptions:m}),renderTable:d=>e.jsx(on,{...d}),defaultValue:{type:"object"}})})]})]})}const{AsyncComboboxField:En,useControllerMerged:Nn}=await c("@baseplate-dev/ui-components");async function Ln(){const l=await L(()=>import("./index-D_oO4W9-.js").then(s=>s.A),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])),t=await L(()=>import("./index-bqrQLiwF.js"),__vite__mapDeps([11,6,1])),i=await L(()=>import("./index-B6LhSOJ-.js").then(s=>s.R),__vite__mapDeps([6,1])),n=await L(()=>import("./index-n58UNslG.js"),__vite__mapDeps([12,6,1]));return[l,t,i,n].map(s=>Object.entries(s).filter(([,a])=>typeof a=="function").map(([a,m])=>({label:a,value:a,icon:m}))).flat()}function _n({...l}){return e.jsx(En,{placeholder:"Select an icon",...l,loadOptions:t=>Ln().then(i=>i.filter(n=>!t||n.label.toLowerCase().includes(t.toLowerCase())).sort((n,o)=>n.label.localeCompare(o.label)).slice(0,20)),renderItemLabel:t=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(t.icon,{className:"size-4"}),t.label]})})}function Wn({name:l,control:t,...i}){const{field:n,fieldState:{error:o}}=Nn({name:l,control:t},i),s=i;return e.jsx(_n,{error:o?.message,...s,...n,value:n.value??null})}const{adminSectionEntityType:Pn,createWebAdminSectionSchema:Vn}=await c("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:Mn,useProjectDefinition:On,useResettableForm:kn}=await c("@baseplate-dev/project-builder-lib/web"),{Button:H,ComboboxFieldController:Un,Dialog:Bn,DialogClose:Kn,DialogContent:zn,DialogDescription:Hn,DialogFooter:Gn,DialogHeader:qn,DialogTitle:Yn,DialogTrigger:Jn,FormActionBar:Qn,InputFieldController:Xn,SectionList:Zn,SectionListSection:ei,SectionListSectionContent:ti,SectionListSectionDescription:ni,SectionListSectionHeader:ii,SectionListSectionTitle:oi}=await c("@baseplate-dev/ui-components"),{useNavigate:li}=await c("@tanstack/react-router"),ui=function(){const{app:t,section:i}=M.useLoaderData(),{appKey:n,sectionKey:o}=M.useParams(),s=li({from:M.fullPath}),{definition:a,saveDefinitionWithFeedback:m,isSavingDefinition:d}=On(),u=Fe(Vn),f=a.features.map(g=>({label:g.name,value:g.id})),C=kn({resolver:N(u),values:i,defaultValues:{type:"crud"}}),{control:b,handleSubmit:p,reset:x}=C,y=p(g=>{const{id:v,...w}=g;return m(j=>{const r=j.apps.find(I=>I.id===t.id);if(r?.type!=="web"||!r.adminApp)return;const h=r.adminApp.sections?.findIndex(I=>I.id===Pn.idFromKey(o));h!==void 0&&h>=0&&r.adminApp.sections&&(r.adminApp.sections[h]={...w,id:i.id})})}),F=()=>{m(g=>{const v=g.apps.find(w=>w.id===t.id);v?.type!=="web"||!v.adminApp||(v.adminApp.sections=v.adminApp.sections?.filter(w=>w.id!==i.id))},{successMessage:`Successfully deleted section "${i.name}"!`,onSuccess:()=>{s({to:"/admin-sections/$appKey",params:{appKey:n}}).catch(je)}})};return Mn({control:b,reset:x,onSubmit:y}),e.jsxs("div",{className:"relative flex h-full flex-1 flex-col overflow-hidden",children:[e.jsx("div",{className:"max-w-7xl space-y-4 border-b p-4",children:e.jsxs("div",{className:"flex items-center justify-between space-x-4",children:[e.jsxs("div",{children:[e.jsx("h2",{children:i.name}),e.jsxs("p",{className:"text-base text-muted-foreground",children:[i.type," section"]})]}),e.jsxs(Bn,{children:[e.jsx(Jn,{asChild:!0,children:e.jsx(H,{variant:"secondary",children:"Delete"})}),e.jsxs(zn,{children:[e.jsxs(qn,{children:[e.jsxs(Yn,{children:["Delete ",i.name]}),e.jsxs(Hn,{className:"sr-only",children:["Are you sure you want to delete"," ",e.jsx("strong",{children:i.name}),"?"]})]}),e.jsxs("p",{children:["Are you sure you want to delete ",e.jsx("strong",{children:i.name}),"?"]}),e.jsx("p",{className:"text-style-muted",children:"This action will permanently remove the admin section from your application. This cannot be undone."}),e.jsxs(Gn,{children:[e.jsx(Kn,{asChild:!0,children:e.jsx(H,{variant:"secondary",children:"Cancel"})}),e.jsx(H,{variant:"destructive",onClick:F,disabled:d,children:"Delete Section"})]})]})]})]})}),e.jsx("div",{className:"mb-(--action-bar-height) flex flex-1 overflow-y-auto",style:{"--action-bar-height":"52px"},children:e.jsxs("form",{onSubmit:y,className:"w-full max-w-7xl space-y-4 p-4",children:[e.jsxs(Zn,{children:[e.jsxs(ei,{children:[e.jsxs(ii,{children:[e.jsx(oi,{children:"General"}),e.jsx(ni,{children:"Basic configuration for your admin section."})]}),e.jsxs(ti,{className:"space-y-6",children:[e.jsx(Xn,{label:"Name",control:b,name:"name",autoComplete:"off"}),e.jsx(Un,{label:"Feature",control:b,options:f,name:"featureRef"}),e.jsx(Wn,{label:"Icon",control:b,name:"icon",description:"Choose an icon to represent this section"})]})]}),e.jsx(Rn,{formProps:C})]}),e.jsx(Qn,{form:C})]})})]},i.id)};export{ui as component};
//# sourceMappingURL=edit._sectionKey-BMO2TE-N.js.map