@baseplate-dev/project-builder-web 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/-constants-C0cnDlAn.js +4 -0
- package/dist/assets/-constants-C0cnDlAn.js.map +1 -0
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/web-BCejYgPM.js +2 -0
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/{web-dPVRSC8L.js.map → web-BCejYgPM.js.map} +1 -1
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-BxDAWgq7.js +2 -0
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-BxDAWgq7.js.map +1 -0
- package/dist/assets/__federation_shared_@baseplate-dev/ui-components-D6OnTPTN.js +46 -0
- package/dist/assets/__federation_shared_@baseplate-dev/ui-components-D6OnTPTN.js.map +1 -0
- package/dist/assets/__federation_shared_@baseplate-dev/utils-DvvrgoSE.js +5 -0
- package/dist/assets/__federation_shared_@baseplate-dev/utils-DvvrgoSE.js.map +1 -0
- package/dist/assets/__federation_shared_@tanstack/react-router-B5c6YNeC.js +19 -0
- package/dist/assets/__federation_shared_@tanstack/react-router-B5c6YNeC.js.map +1 -0
- package/dist/assets/__federation_shared_react-WURrSs1p.js +2 -0
- package/dist/assets/{__federation_shared_react-CTQ9xfiH.js.map → __federation_shared_react-WURrSs1p.js.map} +1 -1
- package/dist/assets/__federation_shared_react-dom-CWagDEjd.js +2 -0
- package/dist/assets/{__federation_shared_react-dom-DPv53nVg.js.map → __federation_shared_react-dom-CWagDEjd.js.map} +1 -1
- package/dist/assets/_commonjsHelpers-CqkleIqs.js +2 -0
- package/dist/assets/_commonjsHelpers-CqkleIqs.js.map +1 -0
- package/dist/assets/_virtual___federation_fn_import-DXu2m-ZE.js +2 -0
- package/dist/assets/{_virtual___federation_fn_import-DK_YYIlv.js.map → _virtual___federation_fn_import-DXu2m-ZE.js.map} +1 -1
- package/dist/assets/admin-Bw70Pql0.js +2 -0
- package/dist/assets/admin-Bw70Pql0.js.map +1 -0
- package/dist/assets/backend-CoqSwiCt.js +2 -0
- package/dist/assets/{backend-B_UhUC1z.js.map → backend-CoqSwiCt.js.map} +1 -1
- package/dist/assets/badge-with-type-label-BXoSRTRE.js +2 -0
- package/dist/assets/{badge-with-type-label-Cvf-Kq7s.js.map → badge-with-type-label-BXoSRTRE.js.map} +1 -1
- package/dist/assets/edit._key-CtMMGDWu.js +2 -0
- package/dist/assets/edit._key-CtMMGDWu.js.map +1 -0
- package/dist/assets/edit._sectionKey-CTX9L0j4.js +3 -0
- package/dist/assets/edit._sectionKey-CTX9L0j4.js.map +1 -0
- package/dist/assets/enum-info-form-D5bAsvPH.js +2 -0
- package/dist/assets/{enum-info-form-CfQbLUQ3.js.map → enum-info-form-D5bAsvPH.js.map} +1 -1
- package/dist/assets/graphql-BmA-sAqU.js +2 -0
- package/dist/assets/{graphql-DTRjqtIq.js.map → graphql-BmA-sAqU.js.map} +1 -1
- package/dist/assets/hierarchy-CZorhmS7.js +2 -0
- package/dist/assets/{hierarchy-BDu76BxG.js.map → hierarchy-CZorhmS7.js.map} +1 -1
- package/dist/assets/immer-B7fdkLVi.js +2 -0
- package/dist/assets/immer-B7fdkLVi.js.map +1 -0
- package/dist/assets/index-BABen-rU.js +2 -0
- package/dist/assets/index-BABen-rU.js.map +1 -0
- package/dist/assets/index-BGLRovL6.js +2 -0
- package/dist/assets/index-BGLRovL6.js.map +1 -0
- package/dist/assets/index-BPzqpd9P.js +2 -0
- package/dist/assets/{index-CKCJuR7p.js.map → index-BPzqpd9P.js.map} +1 -1
- package/dist/assets/index-BUYA3Tes.js +40 -0
- package/dist/assets/index-BUYA3Tes.js.map +1 -0
- package/dist/assets/index-Bl_iRlKL.js +2 -0
- package/dist/assets/index-Bl_iRlKL.js.map +1 -0
- package/dist/assets/index-BpDkQSTy.js +2 -0
- package/dist/assets/{index-01LAxHjt.js.map → index-BpDkQSTy.js.map} +1 -1
- package/dist/assets/index-CaiaVpxa.js +2 -0
- package/dist/assets/index-CaiaVpxa.js.map +1 -0
- package/dist/assets/index-CsGKSjOd.js +2 -0
- package/dist/assets/index-CsGKSjOd.js.map +1 -0
- package/dist/assets/index-D-dbw3Qx.js +2 -0
- package/dist/assets/{index-DITwAD5X.js.map → index-D-dbw3Qx.js.map} +1 -1
- package/dist/assets/index-DCiH936w.js +2 -0
- package/dist/assets/{index-D8LleqeK.js.map → index-DCiH936w.js.map} +1 -1
- package/dist/assets/index-DDivWD4R.js +2 -0
- package/dist/assets/index-DDivWD4R.js.map +1 -0
- package/dist/assets/index-DpJKJe06.js +2 -0
- package/dist/assets/index-DpJKJe06.js.map +1 -0
- package/dist/assets/{index-B0D_rfGi.js → index-DqHVrEeL.js} +2 -2
- package/dist/assets/{index-B0D_rfGi.js.map → index-DqHVrEeL.js.map} +1 -1
- package/dist/assets/index-PlVWOW99.css +1 -0
- package/dist/assets/index-_mf2naQd.js +2 -0
- package/dist/assets/index-_mf2naQd.js.map +1 -0
- package/dist/assets/{index-9Ra4Lmds.js → index-c0qeY2gs.js} +3 -3
- package/dist/assets/{index-9Ra4Lmds.js.map → index-c0qeY2gs.js.map} +1 -1
- package/dist/assets/index-p--SDqro.js +2 -0
- package/dist/assets/{index-DhWOhNFS.js.map → index-p--SDqro.js.map} +1 -1
- package/dist/assets/index.esm-CTDJ8Wko.js +2 -0
- package/dist/assets/index.esm-CTDJ8Wko.js.map +1 -0
- package/dist/assets/jsx-runtime-D_zvdyIk.js +10 -0
- package/dist/assets/jsx-runtime-D_zvdyIk.js.map +1 -0
- package/dist/assets/model-info-form-pKQBCJu4.js +2 -0
- package/dist/assets/{model-info-form-tJoD-VwE.js.map → model-info-form-pKQBCJu4.js.map} +1 -1
- package/dist/assets/model-merger-vEOkdVdS.js +2 -0
- package/dist/assets/model-merger-vEOkdVdS.js.map +1 -0
- package/dist/assets/new-admin-section-dialog-F58HZ0yO.js +2 -0
- package/dist/assets/new-admin-section-dialog-F58HZ0yO.js.map +1 -0
- package/dist/assets/new-app-dialog-DPQv-mvi.js +2 -0
- package/dist/assets/new-app-dialog-DPQv-mvi.js.map +1 -0
- package/dist/assets/new-enum-dialog-xVvneRQN.js +2 -0
- package/dist/assets/{new-enum-dialog-BxDxXwX_.js.map → new-enum-dialog-xVvneRQN.js.map} +1 -1
- package/dist/assets/new-model-dialog-ApenxGWq.js +2 -0
- package/dist/assets/{new-model-dialog-D4pnLGR_.js.map → new-model-dialog-ApenxGWq.js.map} +1 -1
- package/dist/assets/route-1RLqcpwJ.js +2 -0
- package/dist/assets/{route-DYHQ0t6P.js.map → route-1RLqcpwJ.js.map} +1 -1
- package/dist/assets/route-9nRSk82v.js +2 -0
- package/dist/assets/route-9nRSk82v.js.map +1 -0
- package/dist/assets/route-B5_zLW88.js +2 -0
- package/dist/assets/{route-DSICQIL3.js.map → route-B5_zLW88.js.map} +1 -1
- package/dist/assets/route-BPsno3Cl.js +2 -0
- package/dist/assets/route-BPsno3Cl.js.map +1 -0
- package/dist/assets/route-BW0F_EH4.js +2 -0
- package/dist/assets/{route-BGYla1q4.js.map → route-BW0F_EH4.js.map} +1 -1
- package/dist/assets/route-C1hyfOXp.js +2 -0
- package/dist/assets/route-C1hyfOXp.js.map +1 -0
- package/dist/assets/route-CH7VQVwb.js +2 -0
- package/dist/assets/route-CH7VQVwb.js.map +1 -0
- package/dist/assets/route-CpoiDvOD.js +2 -0
- package/dist/assets/route-CpoiDvOD.js.map +1 -0
- package/dist/assets/route-Dq2UgkxS.js +2 -0
- package/dist/assets/{route-CO2y2T3j.js.map → route-Dq2UgkxS.js.map} +1 -1
- package/dist/assets/route-z54yq2nP.js +2 -0
- package/dist/assets/route-z54yq2nP.js.map +1 -0
- package/dist/assets/service-Cv-U7NUv.js +2 -0
- package/dist/assets/service-Cv-U7NUv.js.map +1 -0
- package/dist/assets/sortBy-C9bvycg5.js +2 -0
- package/dist/assets/sortBy-C9bvycg5.js.map +1 -0
- package/dist/assets/template-extractor-ElrbBsVj.js +2 -0
- package/dist/assets/{template-extractor-1dzSeRMo.js.map → template-extractor-ElrbBsVj.js.map} +1 -1
- package/dist/assets/{theme-builder-NSOA1xIw.js → theme-builder-Butjmy7L.js} +6 -6
- package/dist/assets/{theme-builder-NSOA1xIw.js.map → theme-builder-Butjmy7L.js.map} +1 -1
- package/dist/assets/{use-definition-schema-DOTr2MSB.js → use-definition-schema-e7us6WfR.js} +2 -2
- package/dist/assets/{use-definition-schema-DOTr2MSB.js.map → use-definition-schema-e7us6WfR.js.map} +1 -1
- package/dist/assets/use-enum-form-CEyTBPQn.js +2 -0
- package/dist/assets/{use-enum-form-Bon-b8Oc.js.map → use-enum-form-CEyTBPQn.js.map} +1 -1
- package/dist/assets/use-model-form-Ch_tz0Rd.js +2 -0
- package/dist/assets/{use-model-form-Bjm8n0m8.js.map → use-model-form-Ch_tz0Rd.js.map} +1 -1
- package/dist/assets/words-Cs2RBKRm.js +2 -0
- package/dist/assets/words-Cs2RBKRm.js.map +1 -0
- package/dist/index.html +11 -8
- package/package.json +11 -11
- package/dist/assets/-constants-CyTNHADu.js +0 -4
- package/dist/assets/-constants-CyTNHADu.js.map +0 -1
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/web-dPVRSC8L.js +0 -2
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-DnM8acZf.js +0 -5
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-DnM8acZf.js.map +0 -1
- package/dist/assets/__federation_shared_@baseplate-dev/ui-components-z-HwX7Wv.js +0 -46
- package/dist/assets/__federation_shared_@baseplate-dev/ui-components-z-HwX7Wv.js.map +0 -1
- package/dist/assets/__federation_shared_react-CTQ9xfiH.js +0 -2
- package/dist/assets/__federation_shared_react-dom-DPv53nVg.js +0 -2
- package/dist/assets/_virtual___federation_fn_import-DK_YYIlv.js +0 -2
- package/dist/assets/backend-B_UhUC1z.js +0 -2
- package/dist/assets/badge-with-type-label-Cvf-Kq7s.js +0 -2
- package/dist/assets/edit._id-TYAWf8Zb.js +0 -2
- package/dist/assets/edit._id-TYAWf8Zb.js.map +0 -1
- package/dist/assets/enum-info-form-CfQbLUQ3.js +0 -2
- package/dist/assets/graphql-DTRjqtIq.js +0 -2
- package/dist/assets/hierarchy-BDu76BxG.js +0 -2
- package/dist/assets/immer-BOh2djD_.js +0 -2
- package/dist/assets/immer-BOh2djD_.js.map +0 -1
- package/dist/assets/index-01LAxHjt.js +0 -2
- package/dist/assets/index-B7G2CMwL.js +0 -58
- package/dist/assets/index-B7G2CMwL.js.map +0 -1
- package/dist/assets/index-B9Di1LKs.css +0 -1
- package/dist/assets/index-BgFEd-vA.js +0 -2
- package/dist/assets/index-BgFEd-vA.js.map +0 -1
- package/dist/assets/index-BkkIaDrq.js +0 -2
- package/dist/assets/index-BkkIaDrq.js.map +0 -1
- package/dist/assets/index-CKCJuR7p.js +0 -2
- package/dist/assets/index-Cg4QKyV6.js +0 -2
- package/dist/assets/index-Cg4QKyV6.js.map +0 -1
- package/dist/assets/index-D8LleqeK.js +0 -2
- package/dist/assets/index-DITwAD5X.js +0 -2
- package/dist/assets/index-DhWOhNFS.js +0 -2
- package/dist/assets/index-PWrncK3R.js +0 -2
- package/dist/assets/index-PWrncK3R.js.map +0 -1
- package/dist/assets/index-tLZ1b0Gc.js +0 -2
- package/dist/assets/index-tLZ1b0Gc.js.map +0 -1
- package/dist/assets/index.esm-Bvv3vNQh.js +0 -10
- package/dist/assets/index.esm-Bvv3vNQh.js.map +0 -1
- package/dist/assets/model-info-form-tJoD-VwE.js +0 -2
- package/dist/assets/model-merger-DuBMgrZ3.js +0 -2
- package/dist/assets/model-merger-DuBMgrZ3.js.map +0 -1
- package/dist/assets/new-app-dialog-CFhp6QLe.js +0 -2
- package/dist/assets/new-app-dialog-CFhp6QLe.js.map +0 -1
- package/dist/assets/new-enum-dialog-BxDxXwX_.js +0 -2
- package/dist/assets/new-model-dialog-D4pnLGR_.js +0 -2
- package/dist/assets/route-BGYla1q4.js +0 -2
- package/dist/assets/route-BILZA_nq.js +0 -2
- package/dist/assets/route-BILZA_nq.js.map +0 -1
- package/dist/assets/route-BLMjDHl_.js +0 -2
- package/dist/assets/route-BLMjDHl_.js.map +0 -1
- package/dist/assets/route-CO2y2T3j.js +0 -2
- package/dist/assets/route-DSICQIL3.js +0 -2
- package/dist/assets/route-DYHQ0t6P.js +0 -2
- package/dist/assets/route-DvbGaH6v.js +0 -2
- package/dist/assets/route-DvbGaH6v.js.map +0 -1
- package/dist/assets/route-MA2rDgPd.js +0 -2
- package/dist/assets/route-MA2rDgPd.js.map +0 -1
- package/dist/assets/route-rzAviP-P.js +0 -2
- package/dist/assets/route-rzAviP-P.js.map +0 -1
- package/dist/assets/sections-BSA71xrl.js +0 -2
- package/dist/assets/sections-BSA71xrl.js.map +0 -1
- package/dist/assets/sections._sectionKey-DSatzih8.js +0 -2
- package/dist/assets/sections._sectionKey-DSatzih8.js.map +0 -1
- package/dist/assets/service-C0mRE7Wd.js +0 -2
- package/dist/assets/service-C0mRE7Wd.js.map +0 -1
- package/dist/assets/template-extractor-1dzSeRMo.js +0 -2
- package/dist/assets/use-enum-form-Bon-b8Oc.js +0 -2
- package/dist/assets/use-model-form-Bjm8n0m8.js +0 -2
- package/dist/assets/utils-BGrwv_U7.js +0 -2
- package/dist/assets/utils-BGrwv_U7.js.map +0 -1
- package/dist/assets/web-B598C4Bq.js +0 -2
- package/dist/assets/web-B598C4Bq.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as r}from"./_virtual___federation_fn_import-DK_YYIlv.js";import{j as e}from"./index.esm-Bvv3vNQh.js";import{b as v,c as N,L as y,l as k,I as E,t as S}from"./index-B7G2CMwL.js";import{D as I}from"./index-BgFEd-vA.js";import{l as D}from"./utils-BGrwv_U7.js";function $(d,n,t){return`/api/plugins/${d}/${n}/static/${t}`}const{pluginEntityType:A,PluginUtils:F,webConfigSpec:b}=await r("@baseplate-dev/project-builder-lib"),{useProjectDefinition:W}=await r("@baseplate-dev/project-builder-lib/web"),{Button:f,Card:M,CardContent:L,CardDescription:T,CardHeader:z,CardTitle:H}=await r("@baseplate-dev/ui-components");function P({className:d,plugin:n,isActive:t}){const{currentProjectId:a}=v(),{saveDefinitionWithFeedbackSync:m,schemaParserContext:g,definitionContainer:p,pluginContainer:u,isSavingDefinition:o}=W(),l=N();function i(){const c=D(g.pluginStore,n,p.definition);if(c.getPluginSpec(b).getWebConfigComponent(n.id)){l({to:`/plugins/edit/${n.id}`}).catch(k);return}m(h=>{h.plugins=(h.plugins??[]).filter(x=>x.packageName!==n.packageName||x.name!==n.name),F.setPluginConfig(h,n,{},c)},{successMessage:`Enabled ${n.displayName}!`})}function s(){m(c=>{c.plugins=(c.plugins??[]).filter(j=>j.id!==A.idFromKey(n.id))},{successMessage:`Disabled ${n.displayName}!`})}const w=u.getPluginSpec(b).getWebConfigComponent(n.id);return e.jsxs(M,{className:d,children:[e.jsx(z,{children:e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center space-x-4",children:[e.jsx("div",{className:"rounded-xl border",children:n.icon&&a?e.jsx("img",{src:$(a,n.id,n.icon),className:"size-12 rounded-xl bg-muted",alt:`${n.displayName} logo`}):e.jsx(I,{className:"size-12 bg-muted p-2"})}),e.jsxs("div",{children:[e.jsx(H,{children:n.displayName}),e.jsx(T,{children:n.packageName})]})]}),e.jsx("div",{children:t?w?e.jsx(y,{to:"/plugins/edit/$id",from:"/",params:{id:n.id},children:e.jsx(f,{variant:"secondary",children:"Configure"})}):e.jsx(f,{variant:"secondary",onClick:s,disabled:o,children:"Disable"}):e.jsx(f,{variant:"secondary",onClick:i,disabled:o,children:"Enable"})})]})}),e.jsx(L,{children:e.jsx("div",{className:"text-sm",children:e.jsx("p",{children:n.description})})})]})}const{useProjectDefinition:R}=await r("@baseplate-dev/project-builder-lib/web"),{EmptyDisplay:U,ErrorableLoader:B}=await r("@baseplate-dev/ui-components"),{useEffect:K,useState:C}=await r("react"),Q=function(){const{currentProjectId:n}=v(),[t,a]=C(null),{definition:m}=R(),[g,p]=C(null);if(K(()=>{if(a(null),!!n){if(E){a([]);return}S.plugins.getAvailablePlugins.mutate({projectId:n}).then(a).catch(p)}},[n]),!t)return e.jsx(B,{error:g});if(t.length===0)return e.jsx(U,{header:"No plugins available.",subtitle:"Please install plugins via package.json."});const u=m.plugins??[],o=t.filter(i=>u.some(s=>s.packageName===i.packageName&&s.name===i.name)),l=t.filter(i=>!i.hidden&&!u.some(s=>s.packageName===i.packageName&&s.name===i.name));return e.jsxs("div",{className:"max-w-2xl space-y-4 p-4",children:[e.jsx("h1",{children:"Manage Plugins"}),e.jsx("p",{children:"Plugins are a way to extend the functionality of your project, such as adding authentication. You can enable, disable, and manage plugins from this page."}),e.jsxs("p",{children:["To add additional plugins, you can install them to your root package with ",e.jsx("strong",{children:"pnpm"}),"."]}),o.length===0?null:e.jsxs(e.Fragment,{children:[e.jsxs("h3",{children:["Active Plugins (",o.length,")"]}),o.map(i=>e.jsx(P,{plugin:i,isActive:!0},i.id))]}),l.length===0?null:e.jsxs(e.Fragment,{children:[e.jsxs("h3",{children:["Available Plugins (",l.length,")"]}),l.map(i=>e.jsx(P,{plugin:i,isActive:!1},i.id))]})]})};export{Q as component};
|
|
2
|
-
//# sourceMappingURL=index-BkkIaDrq.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BkkIaDrq.js","sources":["../../src/services/plugins.ts","../../src/routes/plugins/-components/plugin-card.tsx","../../src/routes/plugins/index.tsx?tsr-split=component"],"sourcesContent":["export function getPluginStaticUrl(\n projectId: string,\n pluginId: string,\n path: string,\n): string {\n return `/api/plugins/${projectId}/${pluginId}/static/${path}`;\n}\n","import type { PluginMetadataWithPaths } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n pluginEntityType,\n PluginUtils,\n webConfigSpec,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@baseplate-dev/ui-components';\nimport { Link, useNavigate } from '@tanstack/react-router';\nimport { MdExtension } from 'react-icons/md';\n\nimport { useProjects } from '#src/hooks/use-projects.js';\nimport { logAndFormatError } from '#src/services/error-formatter.js';\nimport { getPluginStaticUrl } from '#src/services/plugins.js';\n\nimport { loadPluginImplementationStoreWithNewPlugin } from './utils.js';\n\ninterface PluginCardProps {\n className?: string;\n plugin: PluginMetadataWithPaths;\n isActive: boolean;\n}\n\nexport function PluginCard({\n className,\n plugin,\n isActive,\n}: PluginCardProps): React.JSX.Element {\n const { currentProjectId } = useProjects();\n const {\n saveDefinitionWithFeedbackSync,\n schemaParserContext,\n definitionContainer,\n pluginContainer,\n isSavingDefinition,\n } = useProjectDefinition();\n const navigate = useNavigate();\n\n function enablePlugin(): void {\n const implementations = loadPluginImplementationStoreWithNewPlugin(\n schemaParserContext.pluginStore,\n plugin,\n definitionContainer.definition,\n );\n const webConfigImplementation =\n implementations.getPluginSpec(webConfigSpec);\n const webConfig = webConfigImplementation.getWebConfigComponent(plugin.id);\n if (webConfig) {\n // redirect to plugin config page\n navigate({ to: `/plugins/edit/${plugin.id}` }).catch(logAndFormatError);\n return;\n }\n saveDefinitionWithFeedbackSync(\n (draft) => {\n // Remove any existing instance of this plugin\n draft.plugins = (draft.plugins ?? []).filter(\n (p) => p.packageName !== plugin.packageName || p.name !== plugin.name,\n );\n\n // Add the plugin with proper schema version\n PluginUtils.setPluginConfig(draft, plugin, {}, implementations);\n },\n {\n successMessage: `Enabled ${plugin.displayName}!`,\n },\n );\n }\n\n function disablePlugin(): void {\n saveDefinitionWithFeedbackSync(\n (draft) => {\n draft.plugins = (draft.plugins ?? []).filter(\n (p) => p.id !== pluginEntityType.idFromKey(plugin.id),\n );\n },\n {\n successMessage: `Disabled ${plugin.displayName}!`,\n },\n );\n }\n\n const webConfigImplementation = pluginContainer.getPluginSpec(webConfigSpec);\n const webConfig = webConfigImplementation.getWebConfigComponent(plugin.id);\n\n return (\n <Card className={className}>\n <CardHeader>\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center space-x-4\">\n <div className=\"rounded-xl border\">\n {plugin.icon && currentProjectId ? (\n <img\n src={getPluginStaticUrl(\n currentProjectId,\n plugin.id,\n plugin.icon,\n )}\n className=\"size-12 rounded-xl bg-muted\"\n alt={`${plugin.displayName} logo`}\n />\n ) : (\n <MdExtension className=\"size-12 bg-muted p-2\" />\n )}\n </div>\n <div>\n <CardTitle>{plugin.displayName}</CardTitle>\n <CardDescription>{plugin.packageName}</CardDescription>\n </div>\n </div>\n <div>\n {(() => {\n if (!isActive) {\n return (\n <Button\n variant=\"secondary\"\n onClick={enablePlugin}\n disabled={isSavingDefinition}\n >\n Enable\n </Button>\n );\n } else if (webConfig) {\n return (\n <Link\n to={`/plugins/edit/$id`}\n from=\"/\"\n params={{ id: plugin.id }}\n >\n <Button variant=\"secondary\">Configure</Button>\n </Link>\n );\n } else {\n return (\n <Button\n variant=\"secondary\"\n onClick={disablePlugin}\n disabled={isSavingDefinition}\n >\n Disable\n </Button>\n );\n }\n })()}\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"text-sm\">\n <p>{plugin.description}</p>\n </div>\n </CardContent>\n </Card>\n );\n}\n","import type { PluginMetadataWithPaths } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { EmptyDisplay, ErrorableLoader } from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\nimport { useEffect, useState } from 'react';\n\nimport { useProjects } from '#src/hooks/use-projects.js';\nimport { IS_PREVIEW } from '#src/services/config.js';\nimport { trpc } from '#src/services/trpc.js';\n\nimport { PluginCard } from './-components/plugin-card.js';\n\nexport const Route = createFileRoute('/plugins/')({\n component: PluginsHomePage,\n});\n\nfunction PluginsHomePage(): React.JSX.Element {\n const { currentProjectId } = useProjects();\n const [plugins, setPlugins] = useState<PluginMetadataWithPaths[] | null>(\n null,\n );\n const { definition } = useProjectDefinition();\n const [error, setError] = useState<unknown>(null);\n\n useEffect(() => {\n setPlugins(null);\n if (!currentProjectId) {\n return;\n }\n if (IS_PREVIEW) {\n setPlugins([]);\n return;\n }\n trpc.plugins.getAvailablePlugins\n .mutate({ projectId: currentProjectId })\n .then(setPlugins)\n .catch(setError);\n }, [currentProjectId]);\n\n if (!plugins) {\n return <ErrorableLoader error={error} />;\n }\n\n if (plugins.length === 0) {\n return (\n <EmptyDisplay\n header=\"No plugins available.\"\n subtitle=\"Please install plugins via package.json.\"\n />\n );\n }\n\n const pluginConfig = definition.plugins ?? [];\n const installedPlugins = plugins.filter((plugin) =>\n pluginConfig.some(\n (config) =>\n config.packageName === plugin.packageName &&\n config.name === plugin.name,\n ),\n );\n const uninstalledPlugins = plugins.filter(\n (plugin) =>\n !plugin.hidden &&\n !pluginConfig.some(\n (config) =>\n config.packageName === plugin.packageName &&\n config.name === plugin.name,\n ),\n );\n\n return (\n <div className=\"max-w-2xl space-y-4 p-4\">\n <h1>Manage Plugins</h1>\n <p>\n Plugins are a way to extend the functionality of your project, such as\n adding authentication. You can enable, disable, and manage plugins from\n this page.\n </p>\n <p>\n To add additional plugins, you can install them to your root package\n with <strong>pnpm</strong>.\n </p>\n {installedPlugins.length === 0 ? null : (\n <>\n <h3>Active Plugins ({installedPlugins.length})</h3>\n {installedPlugins.map((plugin) => (\n <PluginCard key={plugin.id} plugin={plugin} isActive />\n ))}\n </>\n )}\n {uninstalledPlugins.length === 0 ? null : (\n <>\n <h3>Available Plugins ({uninstalledPlugins.length})</h3>\n {uninstalledPlugins.map((plugin) => (\n <PluginCard key={plugin.id} plugin={plugin} isActive={false} />\n ))}\n </>\n )}\n </div>\n );\n}\n"],"names":["getPluginStaticUrl","projectId","pluginId","path","pluginEntityType","PluginUtils","webConfigSpec","importShared","useProjectDefinition","Button","Card","CardContent","CardDescription","CardHeader","CardTitle","PluginCard","className","plugin","isActive","currentProjectId","useProjects","saveDefinitionWithFeedbackSync","schemaParserContext","definitionContainer","pluginContainer","isSavingDefinition","navigate","useNavigate","enablePlugin","implementations","loadPluginImplementationStoreWithNewPlugin","logAndFormatError","draft","p","disablePlugin","webConfig","jsxs","jsx","MdExtension","Link","EmptyDisplay","ErrorableLoader","useEffect","useState","SplitComponent","plugins","setPlugins","definition","error","setError","IS_PREVIEW","getAvailablePlugins","mutate","then","catch","length","pluginConfig","installedPlugins","filter","some","config","packageName","name","uninstalledPlugins","hidden","Fragment","map","id"],"mappings":"yQAAgB,SAAAA,EACdC,EACAC,EACAC,EACQ,CACR,MAAO,gBAAgBF,CAAS,IAAIC,CAAQ,WAAWC,CAAI,EAC7D,CCHA,KAAA,CAAA,iBAAAC,EAAA,YAAAC,EAAA,cAAAC,CAAA,EAAA,MAAAC,EAAA,oCAAA,EAKA,CAAA,qBAAAC,CAAA,EAAA,MAAAD,EAAA,wCAAA,EACA,CAAA,OAAAE,EAAA,KAAAC,EAAA,YAAAC,EAAA,gBAAAC,EAAA,WAAAC,EAAA,UAAAC,CAAA,EAAA,MAAAP,EAAA,8BAAA,EAuBO,SAASQ,EAAW,CACzB,UAAAC,EACA,OAAAC,EACA,SAAAC,CACF,EAAuC,CAC/B,KAAA,CAAE,iBAAAC,CAAiB,EAAIC,EAAY,EACnC,CACJ,+BAAAC,EACA,oBAAAC,EACA,oBAAAC,EACA,gBAAAC,EACA,mBAAAC,GACEjB,EAAqB,EACnBkB,EAAWC,EAAY,EAE7B,SAASC,GAAqB,CAC5B,MAAMC,EAAkBC,EACtBR,EAAoB,YACpBL,EACAM,EAAoB,UACtB,EAIA,GAFEM,EAAgB,cAAcvB,CAAa,EACH,sBAAsBW,EAAO,EAAE,EAC1D,CAEJS,EAAA,CAAE,GAAI,iBAAiBT,EAAO,EAAE,EAAI,CAAA,EAAE,MAAMc,CAAiB,EACtE,MAAA,CAEFV,EACGW,GAAU,CAETA,EAAM,SAAWA,EAAM,SAAW,CAAI,GAAA,OACnCC,GAAMA,EAAE,cAAgBhB,EAAO,aAAegB,EAAE,OAAShB,EAAO,IACnE,EAGAZ,EAAY,gBAAgB2B,EAAOf,EAAQ,CAAA,EAAIY,CAAe,CAChE,EACA,CACE,eAAgB,WAAWZ,EAAO,WAAW,GAAA,CAEjD,CAAA,CAGF,SAASiB,GAAsB,CAC7Bb,EACGW,GAAU,CACTA,EAAM,SAAWA,EAAM,SAAW,CAAI,GAAA,OACnCC,GAAMA,EAAE,KAAO7B,EAAiB,UAAUa,EAAO,EAAE,CACtD,CACF,EACA,CACE,eAAgB,YAAYA,EAAO,WAAW,GAAA,CAElD,CAAA,CAIF,MAAMkB,EAD0BX,EAAgB,cAAclB,CAAa,EACjC,sBAAsBW,EAAO,EAAE,EAGvE,OAAAmB,OAAC1B,GAAK,UAAAM,EACJ,SAAA,CAAAqB,MAACxB,EACC,CAAA,SAAAuB,EAAAA,KAAC,MAAI,CAAA,UAAU,0CACb,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAC,MAAC,MAAI,CAAA,UAAU,oBACZ,SAAApB,EAAO,MAAQE,EACdkB,EAAA,IAAC,MAAA,CACC,IAAKrC,EACHmB,EACAF,EAAO,GACPA,EAAO,IACT,EACA,UAAU,8BACV,IAAK,GAAGA,EAAO,WAAW,OAAA,CAAA,EAG5BoB,EAAAA,IAACC,EAAY,CAAA,UAAU,uBAAuB,CAElD,CAAA,SACC,MACC,CAAA,SAAA,CAACD,EAAAA,IAAAvB,EAAA,CAAW,WAAO,WAAY,CAAA,EAC/BuB,EAAAA,IAACzB,EAAiB,CAAA,SAAAK,EAAO,WAAY,CAAA,CAAA,CACvC,CAAA,CAAA,EACF,EACAoB,EAAAA,IAAC,OACG,SACKnB,EAUMiB,EAEPE,EAAA,IAACE,EAAA,CACC,GAAI,oBACJ,KAAK,IACL,OAAQ,CAAE,GAAItB,EAAO,EAAG,EAExB,SAACoB,EAAA,IAAA5B,EAAA,CAAO,QAAQ,YAAY,SAAS,WAAA,CAAA,CAAA,CACvC,EAIA4B,EAAA,IAAC5B,EAAA,CACC,QAAQ,YACR,QAASyB,EACT,SAAUT,EACX,SAAA,SAAA,CAED,EA1BAY,EAAA,IAAC5B,EAAA,CACC,QAAQ,YACR,QAASmB,EACT,SAAUH,EACX,SAAA,QAAA,CAED,CAwBR,CAAA,CAAA,CAAA,CACF,CACF,CAAA,EACAY,EAAA,IAAC1B,EACC,CAAA,SAAA0B,EAAA,IAAC,MAAI,CAAA,UAAU,UACb,SAAAA,EAAA,IAAC,IAAG,CAAA,SAAApB,EAAO,WAAY,CAAA,CAAA,CACzB,CACF,CAAA,CAAA,EACF,CAEJ,CC/JA,KAAA,CAAA,qBAAAT,CAAA,EAAA,MAAAD,EAAA,wCAAA,EACA,CAAA,aAAAiC,EAAA,gBAAAC,CAAA,EAAA,MAAAlC,EAAA,8BAAA,EAEA,CAAA,UAAAmC,EAAA,SAAAC,CAAA,EAAA,MAAApC,EAAA,OAAA,EAM0DqC,EAAA,UAMZ,CACtC,KAAA,CAAEzB,iBAAAA,GAAqBC,EAAY,EACnC,CAACyB,EAASC,CAAU,EAAIH,EAC5B,IACF,EACM,CAAEI,WAAAA,GAAevC,EAAqB,EACtC,CAACwC,EAAOC,CAAQ,EAAIN,EAAkB,IAAI,EAiBhD,GAfAD,EAAU,IAAM,CAEd,GADAI,EAAW,IAAI,EACX,EAAC3B,EAGL,IAAI+B,EAAY,CACdJ,EAAW,CAAA,CAAE,EACb,MAAA,CAEGD,EAAAA,QAAQM,oBACVC,OAAO,CAAEnD,UAAWkB,CAAkB,CAAA,EACtCkC,KAAKP,CAAU,EACfQ,MAAML,CAAQ,EAAA,EAChB,CAAC9B,CAAgB,CAAC,EAEjB,CAAC0B,EACI,OAAAR,MAACI,GAAgB,MAAAO,EAAgB,EAGtCH,GAAAA,EAAQU,SAAW,EACrB,OACGlB,EAAAA,IAAAG,EAAA,CACC,OAAO,wBACP,SAAS,2CACT,EAIAgB,MAAAA,EAAeT,EAAWF,SAAW,CAAE,EACvCY,EAAmBZ,EAAQa,OAAQzC,GACvCuC,EAAaG,KACVC,GACCA,EAAOC,cAAgB5C,EAAO4C,aAC9BD,EAAOE,OAAS7C,EAAO6C,IAC3B,CACF,EACMC,EAAqBlB,EAAQa,UAE/B,CAACzC,EAAO+C,QACR,CAACR,EAAaG,KAEVC,GAAAA,EAAOC,cAAgB5C,EAAO4C,aAC9BD,EAAOE,OAAS7C,EAAO6C,IAC3B,CACJ,EAGE,OAAA1B,EAAA,KAAC,MAAI,CAAA,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAc,gBAAA,CAAA,EAClBA,EAAAA,IAAC,KAAC,SAIF,2JAAA,CAAA,SACC,IAAC,CAAA,SAAA,CAAA,6EAEKA,EAAAA,IAAC,UAAO,SAAI,MAAA,CAAA,EAAS,GAAA,EAC5B,EACCoB,EAAiBF,SAAW,EAAI,KAE7BnB,EAAAA,KAAA6B,EAAAA,SAAA,CAAA,SAAA,CAAA7B,OAAC,KAAG,CAAA,SAAA,CAAA,mBAAiBqB,EAAiBF,OAAO,GAAA,EAAC,EAC7CE,EAAiBS,IAAKjD,GACpBoB,EAAA,IAAAtB,EAAA,CAA2B,OAAAE,EAAgB,SAAQ,IAAnCA,EAAOkD,EAA4B,CACrD,CAAA,EACH,EAEDJ,EAAmBR,SAAW,EAAI,KAE/BnB,EAAAA,KAAA6B,EAAAA,SAAA,CAAA,SAAA,CAAA7B,OAAC,KAAG,CAAA,SAAA,CAAA,sBAAoB2B,EAAmBR,OAAO,GAAA,EAAC,EAClDQ,EAAmBG,IAAKjD,GACtBoB,EAAA,IAAAtB,EAAA,CAA2B,OAAAE,EAAgB,SAAU,IAArCA,EAAOkD,GACzB,CAAA,CACH,CAAA,CAAA,EAEJ,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as n}from"./_virtual___federation_fn_import-DK_YYIlv.js";import{j as e}from"./index.esm-Bvv3vNQh.js";import{N as s}from"./new-enum-dialog-BxDxXwX_.js";const{Button:a}=await n("@baseplate-dev/ui-components"),c=function(){return e.jsxs("div",{className:"max-w-4xl space-y-4 p-4 text-style-prose",children:[e.jsx("h1",{children:"Enums"}),e.jsxs("p",{children:["Enums are a way to define a set of named values. They can be used to define a type that can only have a certain set of values. For example, you might have an enum called ",e.jsx("strong",{children:"Color"})," with values"," ",e.jsx("code",{children:"RED"}),", ",e.jsx("code",{children:"GREEN"}),", and ",e.jsx("code",{children:"BLUE"}),"."]}),e.jsxs("p",{children:["Choose an enum to edit from the sidebar or"," ",e.jsx(s,{children:e.jsx(a,{variant:"link",size:"none",children:"create a new enum"})}),"."]})]})};export{c as component};
|
|
2
|
-
//# sourceMappingURL=index-CKCJuR7p.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as n}from"./_virtual___federation_fn_import-DK_YYIlv.js";import{j as e}from"./index.esm-Bvv3vNQh.js";import{q as v,s as w}from"./index-B7G2CMwL.js";import{u as A}from"./use-definition-schema-DOTr2MSB.js";const{authConfigSpec:L,createAdminAppSchema:R}=await n("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:k,useProjectDefinition:D,useResettableForm:F}=await n("@baseplate-dev/project-builder-lib/web"),{FormActionBar:P,InputFieldController:p,MultiComboboxFieldController:N,SectionList:y,SectionListSection:m,SectionListSectionContent:d,SectionListSectionDescription:u,SectionListSectionHeader:h,SectionListSectionTitle:x}=await n("@baseplate-dev/ui-components"),H=function(){const{adminDefinition:t}=v.useRouteContext(),{definition:j,saveDefinitionWithFeedback:S,pluginContainer:b}=D(),f=A(R),s=F({resolver:w(f),values:t}),{control:i,handleSubmit:g,reset:C}=s,a=g(o=>S(l=>{l.apps=l.apps.map(r=>r.id===t.id?o:r)}));k({control:i,reset:C,onSubmit:a});const c=b.getPluginSpecOptional(L)?.getAuthRoles(j).map(o=>({label:o.name,value:o.id}));return e.jsxs("form",{className:"w-full max-w-7xl space-y-4 p-4",onSubmit:a,children:[e.jsxs(y,{children:[e.jsxs(m,{children:[e.jsxs(h,{children:[e.jsx(x,{children:"General"}),e.jsx(u,{children:"Basic configuration for your admin application."})]}),e.jsxs(d,{className:"space-y-6",children:[e.jsx(p,{label:"Name",control:i,name:"name"}),e.jsx(p,{label:"Package Location (optional)",placeholder:"e.g. packages/admin",control:i,name:"packageLocation"})]})]}),c&&e.jsxs(m,{children:[e.jsxs(h,{children:[e.jsx(x,{children:"Access Control"}),e.jsx(u,{children:"Configure which user roles can access the admin application."})]}),e.jsx(d,{children:e.jsx(N,{label:"Allowed Roles",control:i,options:c,name:"allowedRoles"})})]})]}),e.jsx(P,{form:s})]})};export{H as component};
|
|
2
|
-
//# sourceMappingURL=index-Cg4QKyV6.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-Cg4QKyV6.js","sources":["../../src/routes/apps/edit.$key/admin/index.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n authConfigSpec,\n createAdminAppSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useBlockUnsavedChangesNavigate,\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n FormActionBar,\n InputFieldController,\n MultiComboboxFieldController,\n SectionList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { useDefinitionSchema } from '#src/hooks/use-definition-schema.js';\n\nexport const Route = createFileRoute('/apps/edit/$key/admin/')({\n component: AdminAppEditPage,\n});\n\nfunction AdminAppEditPage(): React.JSX.Element {\n const { adminDefinition } = Route.useRouteContext();\n const { definition, saveDefinitionWithFeedback, pluginContainer } =\n useProjectDefinition();\n const adminAppSchema = useDefinitionSchema(createAdminAppSchema);\n\n const formProps = useResettableForm({\n resolver: zodResolver(adminAppSchema),\n values: adminDefinition,\n });\n const { control, handleSubmit, reset } = formProps;\n\n const onSubmit = handleSubmit((data) =>\n saveDefinitionWithFeedback((draftConfig) => {\n draftConfig.apps = draftConfig.apps.map((app) =>\n app.id === adminDefinition.id ? data : app,\n );\n }),\n );\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n const roleOptions = pluginContainer\n .getPluginSpecOptional(authConfigSpec)\n ?.getAuthRoles(definition)\n .map((role) => ({\n label: role.name,\n value: role.id,\n }));\n\n return (\n <form className=\"w-full max-w-7xl space-y-4 p-4\" onSubmit={onSubmit}>\n <SectionList>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>General</SectionListSectionTitle>\n <SectionListSectionDescription>\n Basic configuration for your admin application.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-6\">\n <InputFieldController label=\"Name\" control={control} name=\"name\" />\n <InputFieldController\n label=\"Package Location (optional)\"\n placeholder=\"e.g. packages/admin\"\n control={control}\n name=\"packageLocation\"\n />\n </SectionListSectionContent>\n </SectionListSection>\n\n {roleOptions && (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Access Control</SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure which user roles can access the admin application.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent>\n <MultiComboboxFieldController\n label=\"Allowed Roles\"\n control={control}\n options={roleOptions}\n name=\"allowedRoles\"\n />\n </SectionListSectionContent>\n </SectionListSection>\n )}\n </SectionList>\n <FormActionBar form={formProps} />\n </form>\n );\n}\n"],"names":["authConfigSpec","createAdminAppSchema","importShared","useBlockUnsavedChangesNavigate","useProjectDefinition","useResettableForm","FormActionBar","InputFieldController","MultiComboboxFieldController","SectionList","SectionListSection","SectionListSectionContent","SectionListSectionDescription","SectionListSectionHeader","SectionListSectionTitle","SplitComponent","adminDefinition","Route","useRouteContext","definition","saveDefinitionWithFeedback","pluginContainer","adminAppSchema","useDefinitionSchema","formProps","resolver","zodResolver","values","control","handleSubmit","reset","onSubmit","draftConfig","apps","map","app","id","data","roleOptions","getPluginSpecOptional","getAuthRoles","role","label","name","value","jsxs","jsx"],"mappings":"qNAEA,KAAA,CAAA,eAAAA,EAAA,qBAAAC,CAAA,EAAA,MAAAC,EAAA,oCAAA,EAIA,CAAA,+BAAAC,EAAA,qBAAAC,EAAA,kBAAAC,CAAA,EAAA,MAAAH,EAAA,wCAAA,EAKA,CAAA,cAAAI,EAAA,qBAAAC,EAAA,6BAAAC,EAAA,YAAAC,EAAA,mBAAAC,EAAA,0BAAAC,EAAA,8BAAAC,EAAA,yBAAAC,EAAA,wBAAAC,CAAA,EAAA,MAAAZ,EAAA,8BAAA,EAc0Ea,EAAA,UAM3B,CACvC,KAAA,CAAEC,gBAAAA,CAAAA,EAAoBC,EAAMC,gBAAgB,EAC5C,CAAEC,WAAAA,EAAYC,2BAAAA,EAA4BC,gBAAAA,GAC9CjB,EAAqB,EACjBkB,EAAiBC,EAAoBtB,CAAoB,EAEzDuB,EAAYnB,EAAkB,CAClCoB,SAAUC,EAAYJ,CAAc,EACpCK,OAAQX,CAAAA,CACT,EACK,CAAEY,QAAAA,EAASC,aAAAA,EAAcC,MAAAA,CAAAA,EAAUN,EAEnCO,EAAWF,EACfT,GAAAA,EAA4CY,GAAA,CAC9BC,EAAAA,KAAOD,EAAYC,KAAKC,IAAKC,GACvCA,EAAIC,KAAOpB,EAAgBoB,GAAKC,EAAOF,CACzC,CAAA,CACD,CACH,EAE+BhC,EAAA,CAAEyB,QAAAA,EAASE,MAAAA,EAAOC,SAAAA,CAAAA,CAAU,EAErDO,MAAAA,EAAcjB,EACjBkB,sBAAsBvC,CAAc,GACnCwC,aAAarB,CAAU,EACxBe,IAAeO,IAAA,CACdC,MAAOD,EAAKE,KACZC,MAAOH,EAAKL,EAAAA,EACZ,EAEJ,OACGS,EAAAA,KAAA,OAAA,CAAK,UAAU,iCAAiC,SAAAd,EAC/C,SAAA,CAAAc,OAACpC,EACC,CAAA,SAAA,CAAAoC,OAACnC,EACC,CAAA,SAAA,CAAAmC,OAAChC,EACC,CAAA,SAAA,CAAAiC,EAAAA,IAAChC,GAAwB,SAAO,SAAA,CAAA,EAChCgC,EAAAA,IAAClC,GAA6B,SAE9B,iDAAA,CAAA,CAAA,EACF,EACAiC,EAAAA,KAAClC,EAA0B,CAAA,UAAU,YACnC,SAAA,CAAAmC,EAAA,IAACvC,EAAqB,CAAA,MAAM,OAAO,QAAAqB,EAAkB,KAAK,OAAM,EAChEkB,MAACvC,GACC,MAAM,8BACN,YAAY,sBACZ,QAAAqB,EACA,KAAK,iBAAiB,CAAA,CAAA,CAE1B,CAAA,CAAA,EACF,EAECU,UACE5B,EACC,CAAA,SAAA,CAAAmC,OAAChC,EACC,CAAA,SAAA,CAAAiC,EAAAA,IAAChC,GAAwB,SAAc,gBAAA,CAAA,EACvCgC,EAAAA,IAAClC,GAA6B,SAE9B,8DAAA,CAAA,CAAA,EACF,EACAkC,EAAAA,IAACnC,EACC,CAAA,SAAAmC,EAAA,IAACtC,EACC,CAAA,MAAM,gBACN,QAAAoB,EACA,QAASU,EACT,KAAK,cAAc,CAAA,CAEvB,CAAA,CAAA,CACF,CAAA,CAAA,EAEJ,EACAQ,EAAAA,IAACxC,EAAc,CAAA,KAAMkB,CAAU,CAAA,CAAA,EACjC,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i}from"./_virtual___federation_fn_import-DK_YYIlv.js";import{j as e}from"./index.esm-Bvv3vNQh.js";import{L as p}from"./index-B7G2CMwL.js";import{h as c}from"./index-BgFEd-vA.js";import{N as n}from"./new-app-dialog-CFhp6QLe.js";import{s as d}from"./immer-BOh2djD_.js";const{appEntityType:l}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:m}=await i("@baseplate-dev/project-builder-lib/web"),{Button:t,Card:h,EmptyDisplay:x}=await i("@baseplate-dev/ui-components"),v=function(){const{definition:r}=m(),{apps:o}=r,a=d(o,[s=>s.name]);return a.length===0?e.jsx(x,{icon:c,header:"No Apps",subtitle:"You haven't created any apps yet",actions:e.jsx(n,{children:e.jsx(t,{children:"New App"})})}):e.jsxs("div",{className:"space-y-4 p-4",children:[e.jsx("h1",{children:"Apps"}),e.jsx("p",{children:"These are the apps that are defined in your project. You can edit them here."}),e.jsx(n,{children:e.jsx(t,{children:"New App"})}),e.jsx("div",{className:"max-w-xl space-y-4",children:a.map(s=>e.jsxs(h,{className:"flex justify-between space-x-4 p-4",children:[e.jsxs("div",{children:[e.jsxs("h3",{children:[s.name," (",s.type,")"]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s.packageLocation})]}),e.jsx(p,{to:"/apps/edit/$key",from:"/",params:{key:l.keyFromId(s.id)},className:"inline-block",children:e.jsx(t,{variant:"secondary",children:"Edit"})})]},s.id))})]})};export{v as component};
|
|
2
|
-
//# sourceMappingURL=index-D8LleqeK.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as c}from"./_virtual___federation_fn_import-DK_YYIlv.js";import{j as e,f as S,e as j}from"./index.esm-Bvv3vNQh.js";import{S as v,o as f,a as L}from"./index-B7G2CMwL.js";import{u as y}from"./use-enum-form-Bon-b8Oc.js";import{K as C,c as N}from"./index-BgFEd-vA.js";const{SectionListSection:b,SectionListSectionContent:g,SectionListSectionHeader:w,SectionListSectionTitle:E,SwitchFieldController:V}=await c("@baseplate-dev/ui-components");function F({control:s}){return e.jsxs(b,{children:[e.jsx(w,{children:e.jsx(E,{children:"GraphQL"})}),e.jsx(g,{className:"space-y-4",children:e.jsx(V,{label:"Expose in GraphQL schema",control:s,name:"isExposed",description:"Whether to expose this enum in the GraphQL schema"})})]})}function A(s){return s.split("_").map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join(" ")}const{modelEnumValueEntityType:T}=await c("@baseplate-dev/project-builder-lib"),{Button:d,InputFieldController:u,Label:p,SectionListSection:$,SectionListSectionContent:I,SectionListSectionDescription:k,SectionListSectionHeader:B,SectionListSectionTitle:D}=await c("@baseplate-dev/ui-components");function G({control:s,setValue:l}){const{fields:t,remove:n,append:r,move:a}=S({control:s,name:"values"}),o=j({control:s,name:"values"}),m="grid grid-cols-[repeat(2,minmax(130px,1fr))_80px] gap-3",x=t.map((h,i)=>({id:h.id,element:e.jsxs("div",{className:m,children:[e.jsx(u,{control:s,name:`values.${i}.name`}),e.jsx(u,{control:s,name:`values.${i}.friendlyName`,onFocus:()=>{!o[i].friendlyName&&o[i].name&&l(`values.${i}.friendlyName`,A(o[i].name))}}),e.jsxs(d,{variant:"ghost",size:"icon",onClick:()=>{n(i)},children:[e.jsx(C,{}),e.jsx("div",{className:"sr-only",children:"Delete Enum"})]})]})}));return e.jsxs($,{children:[e.jsxs(B,{children:[e.jsx(D,{children:"Values"}),e.jsx(k,{children:"Configure the allowed values for this enum."})]}),e.jsxs(I,{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:N(m,"pl-12"),children:[e.jsx(p,{children:"Value Name, e.g. ACTIVE"}),e.jsx(p,{children:"Value Friendly Name, e.g. Active"}),e.jsx("div",{})]}),t.length===0?e.jsx("p",{className:"pt-4 text-style-muted",children:"Add some values to get started"}):e.jsx(v,{listItems:x,sortItems:a})]}),e.jsx(d,{size:"sm",variant:"secondary",onClick:()=>{r({id:T.generateNewId(),name:"",friendlyName:""})},children:"Add Value"})]})]})}const{useBlockUnsavedChangesNavigate:Q}=await c("@baseplate-dev/project-builder-lib/web"),{FormActionBar:H,SectionList:R}=await c("@baseplate-dev/ui-components"),_=function(){const{key:l}=f.useParams(),{form:t,onSubmit:n,isSavingDefinition:r}=y({omit:["name","featureRef"],enumKey:l}),{control:a,setValue:o}=t;return Q({control:a,reset:t.reset,onSubmit:n}),e.jsx(L,{children:e.jsxs("form",{onSubmit:n,className:"mx-4 max-w-7xl min-w-[700px] flex-1 space-y-4 pb-4",children:[e.jsxs(R,{children:[e.jsx(F,{control:a}),e.jsx(G,{control:a,setValue:o})]}),e.jsx(H,{form:t,disabled:r})]})})};export{_ as component};
|
|
2
|
-
//# sourceMappingURL=index-DITwAD5X.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as o}from"./_virtual___federation_fn_import-DK_YYIlv.js";import{j as e}from"./index.esm-Bvv3vNQh.js";import{s as d}from"./index-B7G2CMwL.js";const{generalSettingsSchema:h}=await o("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:f,useProjectDefinition:j,useResettableForm:u}=await o("@baseplate-dev/project-builder-lib/web"),{FormActionBar:g,InputFieldController:s,SectionList:x,SectionListSection:b,SectionListSectionContent:S,SectionListSectionHeader:v,SectionListSectionTitle:w}=await o("@baseplate-dev/ui-components"),L=function(){const{definition:n,saveDefinitionWithFeedback:r}=j(),i=u({resolver:d(h),defaultValues:n.settings.general}),{handleSubmit:l,control:t,reset:c}=i,a=l(p=>r(m=>{m.settings.general=p}));return f({control:t,reset:c,onSubmit:a}),e.jsxs("form",{className:"relative h-full max-h-full pb-(--action-bar-height)",onSubmit:a,children:[e.jsxs("div",{className:"flex h-full max-h-full flex-1 flex-col overflow-y-auto px-6",children:[e.jsx("div",{className:"sticky top-0 border-b bg-background py-6",children:e.jsx("h1",{children:"Project settings"})}),e.jsx(x,{children:e.jsxs(b,{children:[e.jsx(v,{children:e.jsx(w,{children:"Settings"})}),e.jsxs(S,{className:"flex max-w-80 flex-col gap-4",children:[e.jsx(s,{name:"name",label:"Project Name",description:"Lowercase letters and dashes, e.g. my-project",control:t,placeholder:"e.g. my-project"}),e.jsx(s,{name:"portOffset",label:"Port Offset",description:"Multiple of 1000, e.g. 4000. This will offset the ports used by the project, e.g. API at 4001, database at 4432, to avoid conflicts with other projects.",control:t,registerOptions:{valueAsNumber:!0}}),e.jsx(s,{label:"Package Scope",name:"packageScope",description:"The scope for packages in this project, e.g. my-project will result in @my-project/app-name",control:t})]})]})})]}),e.jsx(g,{form:i})]})};export{L as component};
|
|
2
|
-
//# sourceMappingURL=index-DhWOhNFS.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as f}from"./_virtual___federation_fn_import-DK_YYIlv.js";import{j as e,u as I,b as ie,e as le,f as Se}from"./index.esm-Bvv3vNQh.js";import{s as te,m as U,e as ne,S as $e,n as Ne,a as Fe,r as se}from"./index-B7G2CMwL.js";import{u as g,S as Me,E as Ie}from"./-constants-CyTNHADu.js";import{u as Le}from"./use-model-form-Bjm8n0m8.js";import{q as Te,c as w,L as Ee,N as Oe,O as Ue,P as qe,I as ve,K as be,B as Ce}from"./index-BgFEd-vA.js";import{i as Pe}from"./inflection-C1nKqrJS.js";import{c as Ae}from"./capitalize-gOJXDbsR.js";const Be=/\p{Lu}?\p{Ll}+|[0-9]+|\p{Lu}+(?!\p{Ll})|\p{Emoji_Presentation}|\p{Extended_Pictographic}|\p{L}+/gu;function Ke(d){return Array.from(d.match(Be)??[])}function M(d){const t=Ke(d);if(t.length===0)return"";const[s,...l]=t;return`${s.toLowerCase()}${l.map(r=>Ae(r)).join("")}`}const{modelScalarFieldEntityType:ae}=await f("@baseplate-dev/project-builder-lib"),{Button:re,ButtonGroup:ze,DropdownMenu:Ve,DropdownMenuContent:ke,DropdownMenuItem:He,DropdownMenuTrigger:_e}=await f("@baseplate-dev/ui-components"),{useMemo:We}=await f("react");function Ge({className:d,appendField:t,setValue:s}){const l=g(i=>i.model.fields.map(a=>a.name)),r=g(i=>i.model.primaryKeyFieldRefs.length),n=We(()=>{const i=[];r||i.push({name:"ID (uuid)",fields:[{name:"id",type:"uuid",options:{genUuid:!0},isPrimaryKey:!0}]});const a=l.includes("createdAt"),m=l.includes("updatedAt");return(!a||!m)&&i.push({name:"Timestamps",fields:[{name:"createdAt",type:"dateTime",options:{defaultToNow:!0}},{name:"updatedAt",type:"dateTime",options:{updatedAt:!0,defaultToNow:!0}}]}),i},[l,r]),o=i=>{for(const{isPrimaryKey:a,...m}of i.fields){const c=ae.generateNewId();l.includes(m.name)||t({id:c,...m}),a&&s("model.primaryKeyFieldRefs",[c],{shouldDirty:!0})}};return e.jsxs(ze,{className:d,children:[e.jsx(re,{variant:"secondary",onClick:()=>{t({id:ae.generateNewId(),name:"",type:"string",isOptional:!0,options:{default:""}})},size:"sm",children:"Add Field"}),e.jsxs(Ve,{children:[e.jsx(_e,{disabled:n.length===0,asChild:!0,children:e.jsx(re,{variant:"secondary",size:"sm",children:e.jsx(Te,{})})}),e.jsx(ke,{children:n.map(i=>e.jsx(He,{onClick:()=>{o(i)},children:i.name},i.name))})]})]})}const{Button:de,DialogClose:Ye,DialogFooter:Xe,MultiComboboxFieldController:Je}=await f("@baseplate-dev/ui-components"),{useId:Qe}=await f("react"),{z:W}=await f("zod"),Ze=W.object({fields:W.array(W.string()).min(1,"At least one primary key is required")});function en({className:d,control:t,onSubmitSuccess:s}){const l=g(c=>c.model.fields),{field:{value:r=[],onChange:n}}=I({name:"model.primaryKeyFieldRefs",control:t}),{control:o,handleSubmit:i}=ie({resolver:te(Ze),values:{fields:r}}),a=i(c=>{n(c.fields),s?.()}),m=Qe();return e.jsxs("form",{className:w("space-y-4",d),onSubmit:c=>(c.stopPropagation(),a(c)),id:m,children:[e.jsx(Je,{control:o,name:"fields",options:l.map(c=>({value:c.id,label:c.name})),placeholder:"Select fields to use as primary keys"}),e.jsxs(Xe,{children:[e.jsx(Ye,{asChild:!0,children:e.jsx(de,{variant:"secondary",children:"Cancel"})}),e.jsx(de,{type:"submit",form:m,children:"Save"})]})]})}const{Dialog:nn,DialogContent:tn,DialogDescription:sn,DialogHeader:on,DialogTitle:ln,DialogTrigger:an,useControlledState:rn}=await f("@baseplate-dev/ui-components");function we({control:d,children:t,asChild:s,open:l,onOpenChange:r}){const[n,o]=rn(l,r,!1);return e.jsxs(nn,{open:n,onOpenChange:o,children:[t&&e.jsx(an,{asChild:s,children:t}),e.jsxs(tn,{children:[e.jsxs(on,{children:[e.jsx(ln,{children:"Primary Keys"}),e.jsx(sn,{children:"Select the fields that will be used as the primary key for this model"})]}),e.jsx(en,{control:d,onSubmitSuccess:()=>{o(!1)}})]})]})}const{BadgeWithIcon:dn}=await f("@baseplate-dev/ui-components"),{useState:cn}=await f("react");function mn({className:d,control:t,autoCollapse:s}){const[l,r]=cn(!1),n=!s||l;return e.jsx(we,{control:t,children:e.jsx(dn,{icon:Ee,variant:"secondary",className:d,onMouseEnter:()=>{r(!0)},onMouseLeave:()=>{r(!1)},"aria-label":"Primary Key",title:"Primary Key",children:n&&"Primary"})})}const{createModelRelationFieldSchema:un,ModelFieldUtils:fn,modelForeignRelationEntityType:pn,modelLocalRelationEntityType:hn,ModelUtils:ce}=await f("@baseplate-dev/project-builder-lib"),{useDefinitionSchema:xn,useProjectDefinition:jn}=await f("@baseplate-dev/project-builder-lib/web"),{Button:G,ComboboxField:gn,ComboboxFieldController:Y,DialogClose:yn,DialogFooter:vn,InputFieldController:me,SelectFieldController:bn,toast:ue}=await f("@baseplate-dev/ui-components"),De=await f("react"),{useId:Cn,useMemo:wn}=De;function Dn(d,t,s){if(!s)return;const l=s.replace(/Id$/,""),r=a=>d.models.find(m=>m.id!==t.id&&a(m))?.id,n=r(a=>a.name.toLowerCase()===l.toLowerCase());if(n)return n;const o=r(a=>a.featureRef===a.featureRef&&a.name.toLowerCase().includes(l.toLowerCase()));return o||r(a=>a.name.toLowerCase().includes(l.toLowerCase()))}function fe(d,t,s,l){const r=(()=>{if(s.name)return s.name;if(s.modelRef){const i=ce.byIdOrThrow(d,s.modelRef);return M(i.name)}})(),n=(()=>{if(!s.modelRef)return;const{model:{fields:i,primaryKeyFieldRefs:a},name:m}=ce.byIdOrThrow(d,s.modelRef),c=i.filter(x=>a.includes(x.id)),p=s.references??[];return c.map((x,h)=>{const D=h===0&&l?l:c.length===1?`${M(m)}Id`:x.name;return{localRef:p[h]?.localRef??t.model.fields.find(y=>y.name===D)?.id,foreignRef:x.id}})})(),o=(()=>{if(!n)return;if(s.foreignRelationName)return s.foreignRelationName;const i=n.every(a=>a.localRef)&&fn.areScalarsUnique(t,n.map(a=>a.localRef));return M(i?t.name:Pe.pluralize(t.name))})();return{name:r??"",foreignRelationName:o??"",references:n??[]}}function Rn({className:d,control:t,onSubmitSuccess:s,relationId:l,defaultFieldName:r}){const{definition:n}=jn(),o=g(u=>u),i=o.name,{fields:a}=o.model,{field:{value:m=[],onChange:c}}=I({name:"model.relations",control:t}),p=n.models.map(u=>({label:u.name,value:u.id})),x=l===void 0?void 0:m.find(u=>u.id===l),h=wn(()=>{if(x)return x;const u=Dn(n,o,r);return{id:hn.generateNewId(),foreignId:pn.generateNewId(),modelRef:u??"",onDelete:"Restrict",onUpdate:"Restrict",...fe(n,o,{modelRef:u},r)}},[x,r,n,o]),D=xn(un),{control:b,handleSubmit:y,setError:H,watch:P,setValue:L}=ie({resolver:te(D),defaultValues:h}),S=P(),$=S.modelRef?n.models.find(u=>u.id===S.modelRef):void 0,T=$?.model.fields,_=a.map(u=>({label:u.name,value:u.id})),A=T?.map(u=>({label:u.name,value:u.id}))??[],j=S.references.some(u=>a.find(C=>C.id===u.localRef)?.isOptional),R=()=>{c(m.filter(u=>u.id!==l)),s?.()},Re=y(u=>{const{id:C}=u;if(a.some(v=>v.name===u.name)||m.some(v=>v.name===u.name&&v.id!==u.id)){H("name",{message:"The relation name cannot be the same as a field/relation name"});return}const O=u.references.map(v=>v.localRef);if(new Set(O).size!==O.length){ue.error("Local fields must be unique");return}const B=u.references.map(v=>v.foreignRef);if(new Set(B).size!==B.length){ue.error("Foreign fields must be unique");return}m.some(v=>v.id===C)?c(m.map(v=>v.id===C?u:v)):c([...m,u]),s?.()}),oe=Cn(),E=!!$;return e.jsxs("form",{className:w("space-y-4",d),onSubmit:u=>(u.stopPropagation(),Re(u)),id:oe,children:[e.jsxs("div",{className:"grid grid-cols-2 gap-x-8 gap-y-2",children:[e.jsx(gn,{options:[{label:i,value:i}],value:i,disabled:!0,label:"Local Model"}),e.jsx(Y,{control:b,name:"modelRef",options:p,label:"Foreign Model",onChange:u=>{if(!u)return;const{foreignRelationName:C,name:O,references:B}=fe(n,o,{...S,modelRef:u},r);C&&L("foreignRelationName",C),O&&L("name",O),L("references",B)}})]}),e.jsxs("div",{className:w("grid grid-cols-2 gap-x-8 gap-y-2",!E&&"pointer-events-none opacity-50"),children:[e.jsx(me,{control:b,disabled:!E,name:"name",label:"Local Relation Name",description:e.jsxs("span",{children:["Name of the relation, e.g. ",M(i),".",e.jsx("strong",{children:$?.name?M($.name):"user"})]})}),e.jsx(me,{control:b,disabled:!E,name:"foreignRelationName",label:"Foreign Relation Name",description:e.jsxs("span",{children:["Name of the relation on the foreign model, e.g."," ",M($?.name??"post"),".",e.jsx("strong",{children:h.foreignRelationName||"user"})]})}),e.jsx("div",{className:"text-sm font-medium",children:"Local Field"}),e.jsx("div",{className:"text-sm font-medium",children:"Foreign Field"}),S.references.map((u,C)=>e.jsxs(De.Fragment,{children:[e.jsx(Y,{disabled:!E,control:b,name:`references.${C}.localRef`,options:_}),e.jsx(Y,{control:b,name:`references.${C}.foreignRef`,options:A,disabled:!0})]},C))]}),e.jsx("div",{className:"grid grid-cols-2 gap-x-8 gap-y-2 border-t pt-4",children:e.jsx(bn,{label:"On Delete",control:b,options:[{label:"Cascade (delete entire local row)",value:"Cascade"},{label:"Restrict (throw error)",value:"Restrict"},...j?[{label:"Set Null (set local field to null)",value:"SetNull"}]:[]],name:"onDelete",description:"What to do when the foreign row is deleted"})}),e.jsx(vn,{children:e.jsxs("div",{className:"flex w-full justify-between",children:[l&&e.jsx(G,{variant:"secondary",onClick:u=>{u.preventDefault(),R()},children:"Delete"}),e.jsxs("div",{className:"flex gap-4",children:[e.jsx(yn,{asChild:!0,children:e.jsx(G,{variant:"secondary",children:"Cancel"})}),e.jsx(G,{type:"submit",form:oe,disabled:!E,children:"Save"})]})]})})]})}const{Dialog:Sn,DialogContent:$n,DialogDescription:Nn,DialogHeader:Fn,DialogTitle:Mn,DialogTrigger:In,useControlledState:Ln}=await f("@baseplate-dev/ui-components");function V({control:d,children:t,asChild:s,open:l,onOpenChange:r,relationId:n,defaultFieldName:o}){const[i,a]=Ln(l,r,!1);return e.jsxs(Sn,{open:i,onOpenChange:a,children:[t&&e.jsx(In,{asChild:s,children:t}),e.jsxs($n,{width:"lg",children:[e.jsxs(Fn,{children:[e.jsx(Mn,{children:n?"Edit Relation":"Create Relation"}),e.jsx(Nn,{children:"Set up the relation between this model and another model"})]}),e.jsx(Rn,{control:d,onSubmitSuccess:()=>{a(!1)},relationId:n,defaultFieldName:o})]})]})}const{useProjectDefinition:Tn}=await f("@baseplate-dev/project-builder-lib/web"),{BadgeWithIcon:En}=await f("@baseplate-dev/ui-components"),{useState:On}=await f("react");function Un({className:d,control:t,relation:s,autoCollapse:l}){const{definitionContainer:r}=Tn(),[n,o]=On(!1),i=!l||n;return e.jsx(V,{control:t,relationId:s.id,children:e.jsx(En,{icon:Oe,variant:"secondary",className:w("max-w-[100px]",d),onMouseEnter:()=>{o(!0)},onMouseLeave:()=>{o(!1)},"aria-label":"Relation",title:"Relation",children:i&&`${r.nameFromId(s.modelRef)} ${s.references.length>1?`(${s.references.length})`:""}`})})}const{modelUniqueConstraintEntityType:qn}=await f("@baseplate-dev/project-builder-lib"),{Button:X,DialogClose:Pn,DialogFooter:An,MultiComboboxFieldController:Bn}=await f("@baseplate-dev/ui-components"),{useId:Kn}=await f("react"),{z:K}=await f("zod"),zn=K.object({id:K.string().optional(),fields:K.array(K.string()).min(1,"At least one field is required")});function Vn({className:d,control:t,onSubmitSuccess:s,constraintId:l}){const r=g(h=>h.model.fields),{field:{value:n=[],onChange:o}}=I({name:"model.uniqueConstraints",control:t}),i=l===void 0?void 0:n.find(h=>h.id===l),{control:a,handleSubmit:m}=ie({resolver:te(zn),values:i?{id:i.id,fields:i.fields.map(h=>h.fieldRef)}:{fields:[]}}),c=()=>{o(n.filter(h=>h.id!==l)),s?.()},p=m(h=>{const D={id:h.id??qn.generateNewId(),fields:h.fields.map(y=>({fieldRef:y}))},{id:b}=D;n.some(y=>y.id===b)?o(n.map(y=>y.id===b?D:y)):o([...n,D]),s?.()}),x=Kn();return e.jsxs("form",{className:w("space-y-4",d),onSubmit:h=>(h.stopPropagation(),p(h)),id:x,children:[e.jsx(Bn,{control:a,name:"fields",options:r.map(h=>({value:h.id,label:h.name})),placeholder:"Select fields to use as primary keys"}),e.jsx(An,{children:e.jsxs("div",{className:"flex w-full justify-between",children:[l&&e.jsx(X,{variant:"secondary",onClick:h=>{h.preventDefault(),c()},children:"Delete"}),e.jsxs("div",{className:"flex gap-4",children:[e.jsx(Pn,{asChild:!0,children:e.jsx(X,{variant:"secondary",children:"Cancel"})}),e.jsx(X,{type:"submit",form:x,children:"Save"})]})]})})]})}const{Dialog:kn,DialogContent:Hn,DialogDescription:_n,DialogHeader:Wn,DialogTitle:Gn,DialogTrigger:Yn,useControlledState:Xn}=await f("@baseplate-dev/ui-components");function k({control:d,children:t,asChild:s,open:l,onOpenChange:r,constraintId:n}){const[o,i]=Xn(l,r,!1);return e.jsxs(kn,{open:o,onOpenChange:i,children:[t&&e.jsx(Yn,{asChild:s,children:t}),e.jsxs(Hn,{children:[e.jsxs(Wn,{children:[e.jsx(Gn,{children:"Unique Constraint"}),e.jsx(_n,{children:"Select the fields that will be part of this unique constraint."})]}),e.jsx(Vn,{control:d,onSubmitSuccess:()=>{i(!1)},constraintId:n})]})]})}const{BadgeWithIcon:Jn}=await f("@baseplate-dev/ui-components"),{useState:Qn}=await f("react");function Zn({className:d,control:t,constraintId:s,autoCollapse:l}){const[r,n]=Qn(!1),o=!l||r,i=g(a=>a.model.uniqueConstraints?.find(m=>m.id===s)?.fields.length??0);return e.jsx(k,{control:t,constraintId:s,children:e.jsx(Jn,{variant:"secondary",icon:Ue,className:w("",d),onMouseEnter:()=>{n(!0)},onMouseLeave:()=>{n(!1)},"aria-label":"Unique Constraint",title:"Unique Constraint",children:o&&`Unique ${i>1?`(${i})`:""}`})})}function ei({className:d,control:t,idx:s}){const l=g(c=>c.model.fields[s]),r=g(c=>c.model.primaryKeyFieldRefs.includes(l.id)),n=g(c=>c.model.uniqueConstraints?.filter(p=>p.fields.some(x=>x.fieldRef===l.id)).map(p=>p.id)??[]),o=g(({model:c})=>{const p=c.fields[s];return c.relations?.filter(x=>x.references.some(h=>h.localRef===p.id))??[]}),a=(r?1:0)+n.length+o.length>2,m=[r&&e.jsx(mn,{control:t,autoCollapse:a},"primary"),...n.map(c=>e.jsx(Zn,{control:t,constraintId:c,autoCollapse:a},c)),...o.map(c=>e.jsx(Un,{control:t,relation:c,autoCollapse:a},c.id))];return e.jsx("div",{className:w("flex gap-4",d),children:m})}const{EnumUtils:ni}=await f("@baseplate-dev/project-builder-lib"),{useProjectDefinition:ii}=await f("@baseplate-dev/project-builder-lib/web"),{Button:N,ComboboxField:ti,DropdownMenu:pe,DropdownMenuContent:he,DropdownMenuGroup:xe,DropdownMenuItem:J,DropdownMenuTrigger:je,InputField:ge,InputFieldController:Q,SelectFieldController:si}=await f("@baseplate-dev/ui-components");function oi({control:d,idx:t,setValue:s}){const{definition:l}=ii(),r=le({control:d,name:`model.fields.${t}.type`}),{field:{value:n,onChange:o}}=I({name:`model.fields.${t}.options`,control:d}),i=le({control:d,name:`model.fields.${t}.options.default`});if(r==="boolean")return e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(si,{control:d,className:"flex-1",name:`model.fields.${t}.options.default`,options:[{label:"True",value:"true"},{label:"False",value:"false"}],placeholder:"NULL"}),i&&e.jsx(N,{title:"Reset",onClick:()=>{s(`model.fields.${t}.options.default`,"",{shouldDirty:!0})},variant:"ghost",size:"icon",children:e.jsx(U,{})})]});if(["string","int","float"].includes(r))return e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(Q,{control:d,placeholder:"NULL",name:`model.fields.${t}.options.default`,className:"flex-1"}),i&&e.jsx(N,{title:"Reset",onClick:()=>{s(`model.fields.${t}.options.default`,void 0,{shouldDirty:!0})},variant:"ghost",size:"icon",children:e.jsx(U,{})})]});if(r==="uuid")return n?.genUuid?e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(ge,{disabled:!0,value:"Random UUID v4",className:"flex-1"}),e.jsx(N,{title:"Reset",onClick:()=>{o({...n,genUuid:!1})},variant:"ghost",size:"icon",children:e.jsx(U,{})})]}):e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(Q,{control:d,placeholder:"NULL",name:`model.fields.${t}.options.default`,className:"flex-1"}),e.jsxs(pe,{children:[e.jsx(je,{asChild:!0,children:e.jsx(N,{title:"Options",variant:"ghost",size:"icon",children:e.jsx(ne,{})})}),e.jsx(he,{children:e.jsx(xe,{children:e.jsx(J,{onSelect:()=>{o({...n,genUuid:!0})},children:"Random UUID v4"})})})]})]});if(r==="dateTime"||r==="date"){const{defaultToNow:a,updatedAt:m}=n??{};return a??m?e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(ge,{disabled:!0,value:m?"Last Updated":"Now",className:"flex-1"}),e.jsx(N,{title:"Reset",onClick:()=>{o({...n,defaultToNow:!1,updatedAt:!1})},variant:"ghost",size:"icon",children:e.jsx(U,{})})]}):e.jsxs("div",{className:"flex items-center space-x-1",children:[e.jsx(Q,{placeholder:"NULL",control:d,name:`model.fields.${t}.options.default`,className:"flex-1"}),e.jsxs(pe,{children:[e.jsx(je,{asChild:!0,children:e.jsx(N,{title:"Options",variant:"ghost",size:"icon",children:e.jsx(ne,{})})}),e.jsx(he,{children:e.jsxs(xe,{children:[e.jsx(J,{onSelect:()=>{o({...n,defaultToNow:!0,updatedAt:!1})},children:"Now"}),e.jsx(J,{onSelect:()=>{o({...n,defaultToNow:!0,updatedAt:!0})},children:"Last Updated At"})]})})]})]})}if(r==="enum"&&n?.enumRef){const m=ni.byIdOrThrow(l,n.enumRef).values.map(c=>({label:c.friendlyName,value:c.id}));return e.jsxs("div",{className:"flex items-center space-x-1",children:[e.jsx(ti,{placeholder:"NULL",value:n.defaultEnumValueRef??null,onChange:c=>{o({...n,defaultEnumValueRef:c||void 0})},options:m,className:"flex-1"}),n.defaultEnumValueRef&&e.jsx(N,{title:"Reset",onClick:()=>{o({...n,defaultEnumValueRef:""})},variant:"ghost",size:"icon",children:e.jsx(U,{})})]})}return e.jsx("div",{})}const{SCALAR_FIELD_TYPES:li}=await f("@baseplate-dev/project-builder-lib"),{useProjectDefinition:ai}=await f("@baseplate-dev/project-builder-lib/web"),{ComboboxField:ri}=await f("@baseplate-dev/ui-components");function di({control:d,idx:t}){const{definition:s}=ai(),l=(s.enums??[]).map(p=>({label:p.name,value:`enum-${p.id}`,description:"Enum type"})),r=[...li.filter(p=>p!=="enum").map(p=>Me[p]),...l],{field:{value:n,onChange:o}}=I({name:`model.fields.${t}.type`,control:d}),{field:{value:i,onChange:a}}=I({name:`model.fields.${t}.options`,control:d}),m=p=>{if(p?.startsWith("enum-")){const x=p.replace("enum-","");a({enumRef:x}),o("enum")}else o(p)},c=i?.enumRef;return e.jsx("div",{className:"space-y-2",children:e.jsx(ri,{value:n==="enum"&&c?`enum-${c}`:n,onChange:m,options:r,renderItemLabel:p=>e.jsxs("div",{className:"flex flex-col",children:[e.jsx("div",{children:p.label}),e.jsx("div",{className:"text-xs text-muted-foreground",children:p.description})]})})})}const{modelUniqueConstraintEntityType:ci}=await f("@baseplate-dev/project-builder-lib"),{Button:ye,DropdownMenu:mi,DropdownMenuContent:ui,DropdownMenuGroup:fi,DropdownMenuItem:F,DropdownMenuTrigger:pi,InputFieldController:hi,SwitchFieldController:xi,toast:ji}=await f("@baseplate-dev/ui-components"),{useState:q}=await f("react");function gi({className:d,control:t,idx:s,setValue:l,onRemove:r}){const n=g(j=>j.model.fields[s]),o=g(j=>j.model.relations),i=g(j=>j.model.primaryKeyFieldRefs),a=g(j=>j.model.uniqueConstraints)??[],m=i.includes(n.id),c=i.length>1,p=a.filter(j=>j.fields.some(R=>R.fieldRef===n.id)),x=o?.filter(j=>j.references.some(R=>R.localRef===n.id))??[],h=(()=>{if(x.length>0)return`Unable to remove field as it is being used in relations ${x.map(j=>j.name).join(", ")}`;if(m&&c)return"Unable to remove field as it is being used in in the primary key";if(a.some(j=>j.fields.some(R=>R.fieldRef===n.id)))return"Unable to remove field as it is being used in in a unique constraint"})();function D(){if(h){ji.error(h);return}r(s),m&&!c&&l("model.primaryKeyFieldRefs",[],{shouldDirty:!0})}const[b,y]=q(!1),[H,P]=q(!1),[L,S]=q(),[$,T]=q(!1),[_,A]=q();return e.jsxs("div",{className:w("items-center",d),children:[e.jsx("div",{children:e.jsx(hi,{control:t,name:`model.fields.${s}.name`})}),e.jsx("div",{children:e.jsx(di,{control:t,idx:s})}),e.jsx("div",{children:e.jsx(xi,{control:t,name:`model.fields.${s}.isOptional`})}),e.jsx("div",{className:"mr-4",children:e.jsx(oi,{control:t,idx:s,setValue:l})}),e.jsx("div",{children:e.jsx(ei,{control:t,idx:s})}),e.jsx("div",{children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(mi,{children:[e.jsx(pi,{asChild:!0,children:e.jsx(ye,{variant:"ghost",size:"icon",children:e.jsx(ne,{})})}),e.jsx(ui,{children:e.jsxs(fi,{children:[x.length===0&&e.jsx(F,{onSelect:()=>{T(!0),A(void 0)},children:"Add Relation"}),x.length>0&&x.map(j=>e.jsxs(F,{onSelect:()=>{T(!0),A(j.id)},children:["Edit Relation ",x.length>1&&j.name]},j.id)),!c&&!m&&e.jsx(F,{onSelect:()=>{l("model.primaryKeyFieldRefs",[n.id],{shouldDirty:!0})},children:"Set as Primary Key"}),m&&e.jsx(F,{onSelect:()=>{y(!0)},children:"Edit Primary Key"}),p.length===0&&(c||!m)&&e.jsx(F,{onSelect:()=>{l("model.uniqueConstraints",[...a,{id:ci.generateNewId(),fields:[{fieldRef:n.id}]}],{shouldDirty:!0})},children:"Make Unique"}),p.length>0&&p.map((j,R)=>e.jsxs(F,{onSelect:()=>{S(j.id),P(!0)},children:["Edit Unique Constraint"," ",p.length>1&&R+1]},j.id))]})})]}),e.jsx(we,{control:t,open:b,onOpenChange:y}),e.jsx(k,{control:t,open:H,onOpenChange:P,constraintId:L}),e.jsx(V,{control:t,open:$,onOpenChange:T,relationId:_,defaultFieldName:n.name}),e.jsx(ye,{variant:"ghost",onClick:()=>{D()},size:"icon",children:e.jsx(qe,{})})]})})]})}function yi({className:d,control:t,setValue:s}){const{fields:l,remove:r,append:n,move:o}=Se({control:t,name:"model.fields"}),i="grid grid-cols-[repeat(2,minmax(130px,1fr))_60px_minmax(130px,1fr)_minmax(100px,1fr)_80px] gap-3",a=l.map((m,c)=>({id:m.id,element:e.jsx(gi,{className:i,control:t,setValue:s,idx:c,onRemove:r},m.id)}));return e.jsxs("div",{className:w("space-y-4",d),children:[l.length===0?e.jsx("p",{className:"pt-4 text-style-muted",children:"Add some fields to get started"}):e.jsxs("div",{className:"flex w-full flex-col gap-2 bg-white",children:[e.jsxs("div",{className:w(i,"sticky -top-0 z-10 bg-white py-2 text-sm font-semibold","pl-12"),children:[e.jsx("div",{children:"Name"}),e.jsx("div",{children:"Type"}),e.jsx("div",{children:"Optional"}),e.jsx("div",{children:"Default Value"}),e.jsx("div",{className:"sr-only",children:"Badges"}),e.jsx("div",{className:"sr-only",children:"Actions"})]}),e.jsx($e,{listItems:a,sortItems:o})]}),e.jsx(Ge,{appendField:n,setValue:s})]})}const{useProjectDefinition:vi}=await f("@baseplate-dev/project-builder-lib/web"),{Button:Z,RecordView:bi,RecordViewActions:Ci,RecordViewItem:z,RecordViewItemList:wi,SectionListSection:Di,SectionListSectionContent:Ri,SectionListSectionDescription:Si,SectionListSectionHeader:$i,SectionListSectionTitle:Ni,useConfirmDialog:Fi}=await f("@baseplate-dev/ui-components");function Mi({control:d,setValue:t}){const{requestConfirm:s}=Fi(),{definitionContainer:l}=vi(),r=g(({model:i})=>i.relations??[]),n=g(({model:i})=>Object.fromEntries(i.fields.map(a=>[a.id,a.name])));function o(i){const a=r.find(m=>m.id===i);s({title:"Delete Relation",content:`Are you sure you want to delete the relation "${a?.name??"<invalid>"}"?`,onConfirm:()=>{t("model.relations",r.filter(m=>m.id!==i))}})}return e.jsxs(Di,{children:[e.jsxs($i,{children:[e.jsx(Ni,{children:"Relations"}),e.jsx(Si,{children:"Define relations to enforce uniqueness on one or more fields."})]}),e.jsxs(Ri,{className:"space-y-4",children:[r.map(i=>e.jsxs(bi,{children:[e.jsxs(wi,{children:[e.jsx(z,{title:"Name",children:i.name}),e.jsx(z,{title:"Local Field",children:i.references.map(a=>n[a.localRef]).join(", ")}),e.jsx(z,{title:"Foreign Model",children:l.nameFromId(i.modelRef)}),e.jsx(z,{title:"On Delete",children:i.onDelete})]}),e.jsxs(Ci,{children:[e.jsx(V,{relationId:i.id,control:d,asChild:!0,children:e.jsx(Z,{variant:"ghost",size:"icon",title:"Edit",children:e.jsx(ve,{})})}),e.jsx(Z,{variant:"ghostDestructive",size:"icon",title:"Delete",onClick:()=>{o(i.id)},children:e.jsx(be,{})})]})]},i.id)),e.jsx(V,{control:d,asChild:!0,children:e.jsxs(Z,{variant:"secondary",size:"sm",children:[e.jsx(Ce,{}),"Add Relation"]})})]})]})}const{Button:ee,RecordView:Ii,RecordViewActions:Li,RecordViewItem:Ti,RecordViewItemList:Ei,SectionListSection:Oi,SectionListSectionContent:Ui,SectionListSectionDescription:qi,SectionListSectionHeader:Pi,SectionListSectionTitle:Ai,useConfirmDialog:Bi}=await f("@baseplate-dev/ui-components");function Ki({control:d,setValue:t}){const{requestConfirm:s}=Bi(),l=g(({model:o})=>o.uniqueConstraints??[]),r=g(({model:o})=>Object.fromEntries(o.fields.map(i=>[i.id,i.name])));function n(o){s({title:"Delete Unique Constraint",content:"Are you sure you want to delete this unique constraint?",onConfirm:()=>{t("model.uniqueConstraints",l.filter(i=>i.id!==o))}})}return e.jsxs(Oi,{children:[e.jsxs(Pi,{children:[e.jsx(Ai,{children:"Unique Constraints"}),e.jsx(qi,{children:"Define unique constraints to enforce uniqueness on one or more fields."})]}),e.jsxs(Ui,{className:"space-y-4",children:[l.map(o=>e.jsxs(Ii,{children:[e.jsx(Ei,{children:e.jsx(Ti,{title:"Fields",children:o.fields.map(i=>r[i.fieldRef]??"<invalid>").join(", ")})}),e.jsxs(Li,{children:[e.jsx(k,{constraintId:o.id,control:d,asChild:!0,children:e.jsx(ee,{variant:"ghost",size:"icon",title:"Edit",children:e.jsx(ve,{})})}),e.jsx(ee,{variant:"ghostDestructive",size:"icon",title:"Delete",onClick:()=>{n(o.id)},children:e.jsx(be,{})})]})]},o.id)),e.jsx(k,{control:d,asChild:!0,children:e.jsxs(ee,{variant:"secondary",size:"sm",children:[e.jsx(Ce,{}),"Add Unique Constraint"]})})]})]})}const{modelEntityType:zi,modelLocalRelationEntityType:Vi,modelScalarFieldEntityType:ki}=await f("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:Hi}=await f("@baseplate-dev/project-builder-lib/web"),{FormActionBar:_i,SectionList:Wi}=await f("@baseplate-dev/ui-components");se(zi,"/data/models/edit/{key}");se(ki,"/data/models/edit/{parentKey}");se(Vi,"/data/models/edit/{parentKey}");const it=function(){const{key:t}=Ne.useParams(),{form:s,onSubmit:l,originalModel:r}=Le({omit:["name","featureRef"],modelKey:t}),{control:n,watch:o,getValues:i,setValue:a,reset:m}=s;return Hi({control:n,reset:m,onSubmit:l}),e.jsx(Fe,{children:e.jsx(Ie,{originalModel:r,getValues:i,watch:o,children:e.jsxs("form",{onSubmit:l,className:"max-w-7xl min-w-[700px] flex-1 space-y-4 px-4 pb-4",children:[e.jsx(yi,{control:n,setValue:a}),e.jsxs(Wi,{children:[e.jsx(Mi,{control:n,setValue:a}),e.jsx(Ki,{control:n,setValue:a})]}),e.jsx(_i,{form:s})]})})})};export{it as component};
|
|
2
|
-
//# sourceMappingURL=index-PWrncK3R.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-PWrncK3R.js","sources":["../../../../node_modules/.pnpm/es-toolkit@1.31.0/node_modules/es-toolkit/dist/string/words.mjs","../../../../node_modules/.pnpm/es-toolkit@1.31.0/node_modules/es-toolkit/dist/string/camelCase.mjs","../../src/routes/data/models/edit.$key/-components/fields/model-add-field-button.tsx","../../src/routes/data/models/edit.$key/-components/fields/primary-key/model-primary-key-form.tsx","../../src/routes/data/models/edit.$key/-components/fields/primary-key/model-primary-key-dialog.tsx","../../src/routes/data/models/edit.$key/-components/fields/primary-key/model-primary-key-badge.tsx","../../src/routes/data/models/edit.$key/-components/fields/relations/model-relation-form.tsx","../../src/routes/data/models/edit.$key/-components/fields/relations/model-relation-dialog.tsx","../../src/routes/data/models/edit.$key/-components/fields/relations/model-relation-badge.tsx","../../src/routes/data/models/edit.$key/-components/fields/unique-constraints/model-unique-constraint-form.tsx","../../src/routes/data/models/edit.$key/-components/fields/unique-constraints/model-unique-constraint-dialog.tsx","../../src/routes/data/models/edit.$key/-components/fields/unique-constraints/model-unique-constraint-badge.tsx","../../src/routes/data/models/edit.$key/-components/fields/badges/model-field-badges.tsx","../../src/routes/data/models/edit.$key/-components/fields/model-field-default-value-input.tsx","../../src/routes/data/models/edit.$key/-components/fields/model-field-type-input.tsx","../../src/routes/data/models/edit.$key/-components/fields/model-field-form.tsx","../../src/routes/data/models/edit.$key/-components/fields/model-fields-form.tsx","../../src/routes/data/models/edit.$key/-components/model-relations-section.tsx","../../src/routes/data/models/edit.$key/-components/model-unique-constraints-section.tsx","../../src/routes/data/models/edit.$key/index.tsx?tsr-split=component"],"sourcesContent":["const CASE_SPLIT_PATTERN = /\\p{Lu}?\\p{Ll}+|[0-9]+|\\p{Lu}+(?!\\p{Ll})|\\p{Emoji_Presentation}|\\p{Extended_Pictographic}|\\p{L}+/gu;\nfunction words(str) {\n return Array.from(str.match(CASE_SPLIT_PATTERN) ?? []);\n}\n\nexport { CASE_SPLIT_PATTERN, words };\n","import { capitalize } from './capitalize.mjs';\nimport { words } from './words.mjs';\n\nfunction camelCase(str) {\n const words$1 = words(str);\n if (words$1.length === 0) {\n return '';\n }\n const [first, ...rest] = words$1;\n return `${first.toLowerCase()}${rest.map(word => capitalize(word)).join('')}`;\n}\n\nexport { camelCase };\n","import type {\n ModelConfigInput,\n ModelScalarFieldConfig,\n ModelScalarFieldConfigInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { UseFieldArrayAppend, UseFormSetValue } from 'react-hook-form';\n\nimport { modelScalarFieldEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n ButtonGroup,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@baseplate-dev/ui-components';\nimport { useMemo } from 'react';\nimport { MdExpandMore } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\n\ninterface ModelAddFieldButtonProps {\n className?: string;\n appendField: UseFieldArrayAppend<ModelConfigInput, 'model.fields'>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\ninterface AutoAddField {\n name: string;\n fields: (Omit<ModelScalarFieldConfigInput, 'id'> & {\n isPrimaryKey?: boolean;\n })[];\n}\n\nexport function ModelAddFieldButton({\n className,\n appendField,\n setValue,\n}: ModelAddFieldButtonProps): React.JSX.Element {\n const fieldNames = useEditedModelConfig((model) =>\n model.model.fields.map((f) => f.name),\n );\n const primaryKeyFieldLength = useEditedModelConfig(\n (model) => model.model.primaryKeyFieldRefs.length,\n );\n const availableAutoFields = useMemo(() => {\n const autoFields: AutoAddField[] = [];\n if (!primaryKeyFieldLength) {\n autoFields.push({\n name: 'ID (uuid)',\n fields: [\n {\n name: 'id',\n type: 'uuid',\n options: {\n genUuid: true,\n },\n isPrimaryKey: true,\n },\n ],\n });\n }\n const hasCreatedAt = fieldNames.includes('createdAt');\n const hasUpdatedAt = fieldNames.includes('updatedAt');\n if (!hasCreatedAt || !hasUpdatedAt) {\n autoFields.push({\n name: 'Timestamps',\n fields: [\n {\n name: 'createdAt',\n type: 'dateTime',\n options: {\n defaultToNow: true,\n },\n },\n {\n name: 'updatedAt',\n type: 'dateTime',\n options: {\n updatedAt: true,\n defaultToNow: true,\n },\n },\n ],\n });\n }\n return autoFields;\n }, [fieldNames, primaryKeyFieldLength]);\n\n const applyAutoField = (autoField: AutoAddField): void => {\n for (const { isPrimaryKey, ...field } of autoField.fields) {\n const fieldId = modelScalarFieldEntityType.generateNewId();\n if (!fieldNames.includes(field.name)) {\n appendField({\n id: fieldId,\n ...field,\n });\n }\n if (isPrimaryKey) {\n setValue('model.primaryKeyFieldRefs', [fieldId], { shouldDirty: true });\n }\n }\n };\n return (\n <ButtonGroup className={className}>\n <Button\n variant=\"secondary\"\n onClick={() => {\n appendField({\n id: modelScalarFieldEntityType.generateNewId(),\n name: '',\n type: 'string',\n isOptional: true,\n options: {\n default: '',\n },\n } satisfies ModelScalarFieldConfig);\n }}\n size=\"sm\"\n >\n Add Field\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger\n disabled={availableAutoFields.length === 0}\n asChild\n >\n <Button variant=\"secondary\" size=\"sm\">\n <MdExpandMore />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {availableAutoFields.map((field) => (\n <DropdownMenuItem\n key={field.name}\n onClick={() => {\n applyAutoField(field);\n }}\n >\n {field.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </ButtonGroup>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n Button,\n DialogClose,\n DialogFooter,\n MultiComboboxFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { clsx } from 'clsx';\nimport { useId } from 'react';\nimport { useController, useForm } from 'react-hook-form';\nimport { z } from 'zod';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\n\ninterface ModelPrimaryKeyFormProps {\n className?: string;\n control: Control<ModelConfigInput>;\n onSubmitSuccess?: () => void;\n}\n\nconst primaryKeychema = z.object({\n fields: z.array(z.string()).min(1, 'At least one primary key is required'),\n});\n\ntype FormValues = z.infer<typeof primaryKeychema>;\n\nexport function ModelPrimaryKeyForm({\n className,\n control: modelControl,\n onSubmitSuccess,\n}: ModelPrimaryKeyFormProps): React.JSX.Element {\n const fields = useEditedModelConfig((model) => model.model.fields);\n const {\n field: { value: modelValue = [], onChange: onModelChange },\n } = useController({\n name: 'model.primaryKeyFieldRefs',\n control: modelControl,\n });\n\n const { control, handleSubmit } = useForm<FormValues>({\n resolver: zodResolver(primaryKeychema),\n values: { fields: modelValue },\n });\n\n const onSubmit = handleSubmit((data) => {\n onModelChange(data.fields);\n onSubmitSuccess?.();\n });\n\n const formId = useId();\n\n return (\n <form\n className={clsx('space-y-4', className)}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n id={formId}\n >\n <MultiComboboxFieldController\n control={control}\n name=\"fields\"\n options={fields.map((f) => ({ value: f.id, label: f.name }))}\n placeholder=\"Select fields to use as primary keys\"\n />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" form={formId}>\n Save\n </Button>\n </DialogFooter>\n </form>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { ModelPrimaryKeyForm } from './model-primary-key-form.js';\n\ninterface ModelPrimaryKeyDialogProps {\n control: Control<ModelConfigInput>;\n asChild?: boolean;\n open?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function ModelPrimaryKeyDialog({\n control,\n children,\n asChild,\n open,\n onOpenChange,\n}: ModelPrimaryKeyDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Primary Keys</DialogTitle>\n <DialogDescription>\n Select the fields that will be used as the primary key for this\n model\n </DialogDescription>\n </DialogHeader>\n <ModelPrimaryKeyForm\n control={control}\n onSubmitSuccess={() => {\n setIsOpen(false);\n }}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { BadgeWithIcon } from '@baseplate-dev/ui-components';\nimport { useState } from 'react';\nimport { MdKey } from 'react-icons/md';\n\nimport { ModelPrimaryKeyDialog } from './model-primary-key-dialog.js';\n\ninterface ModelPrimaryKeyBadgeProps {\n className?: string;\n control: Control<ModelConfigInput>;\n autoCollapse?: boolean;\n}\n\nexport function ModelPrimaryKeyBadge({\n className,\n control,\n autoCollapse,\n}: ModelPrimaryKeyBadgeProps): React.JSX.Element {\n const [isHovered, setIsHovered] = useState(false);\n const shouldShowText = !autoCollapse || isHovered;\n return (\n <ModelPrimaryKeyDialog control={control}>\n <BadgeWithIcon\n icon={MdKey}\n variant=\"secondary\"\n className={className}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n aria-label=\"Primary Key\"\n title=\"Primary Key\"\n >\n {shouldShowText && 'Primary'}\n </BadgeWithIcon>\n </ModelPrimaryKeyDialog>\n );\n}\n","import type {\n ModelConfig,\n ModelConfigInput,\n ModelRelationFieldConfig,\n ModelRelationFieldConfigInput,\n ProjectDefinition,\n} from '@baseplate-dev/project-builder-lib';\nimport type { Control } from 'react-hook-form';\n\nimport {\n createModelRelationFieldSchema,\n ModelFieldUtils,\n modelForeignRelationEntityType,\n modelLocalRelationEntityType,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useDefinitionSchema,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n ComboboxField,\n ComboboxFieldController,\n DialogClose,\n DialogFooter,\n InputFieldController,\n SelectFieldController,\n toast,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { clsx } from 'clsx';\nimport { camelCase } from 'es-toolkit';\nimport { pluralize } from 'inflection';\nimport React, { useId, useMemo } from 'react';\nimport { useController, useForm } from 'react-hook-form';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\n\ninterface ModelRelationFormProps {\n className?: string;\n control: Control<ModelConfigInput>;\n onSubmitSuccess?: () => void;\n relationId?: string;\n defaultFieldName?: string;\n}\n\n/**\n * Tries to guess the model type from the field name\n */\nfunction guessModelTypeFromFieldName(\n definition: ProjectDefinition,\n editedModel: ModelConfigInput,\n fieldName: string | undefined,\n): string | undefined {\n if (!fieldName) return;\n\n const name = fieldName.replace(/Id$/, '');\n\n const tryFindModel = (\n condition: (m: ModelConfig) => boolean,\n ): string | undefined =>\n definition.models.find((m) => m.id !== editedModel.id && condition(m))?.id;\n\n // try to find a model with the exact name first\n const modelWithName = tryFindModel(\n (m) => m.name.toLowerCase() === name.toLowerCase(),\n );\n if (modelWithName) return modelWithName;\n\n // try to find a model with the same feature and a similar name\n const modelWithFeature = tryFindModel(\n (m) =>\n m.featureRef === m.featureRef &&\n m.name.toLowerCase().includes(name.toLowerCase()),\n );\n if (modelWithFeature) return modelWithFeature;\n\n // try to find a model with a similar name\n const modelWithSimilarName = tryFindModel((m) =>\n m.name.toLowerCase().includes(name.toLowerCase()),\n );\n return modelWithSimilarName;\n}\n\n/**\n * Tries to guess the default values for a relation field based on the model\n */\nfunction getRelationDefaultsFromModel(\n definition: ProjectDefinition,\n editedModel: ModelConfigInput,\n editedRelation: Partial<ModelRelationFieldConfigInput>,\n defaultFieldName?: string,\n): Pick<\n ModelRelationFieldConfig,\n 'foreignRelationName' | 'name' | 'references'\n> {\n // default the name to the local field name if it ends with Id\n const name = (() => {\n if (editedRelation.name) return editedRelation.name;\n if (editedRelation.modelRef) {\n const model = ModelUtils.byIdOrThrow(definition, editedRelation.modelRef);\n return camelCase(model.name);\n }\n return;\n })();\n\n const references = (() => {\n if (!editedRelation.modelRef) return;\n const {\n model: { fields, primaryKeyFieldRefs },\n name: foreignName,\n } = ModelUtils.byIdOrThrow(definition, editedRelation.modelRef);\n const primaryKeys = fields.filter((f) =>\n primaryKeyFieldRefs.includes(f.id),\n );\n const existingReferences = editedRelation.references ?? [];\n return primaryKeys.map((primaryKey, i) => {\n const bestGuessLocalName = (() => {\n if (i === 0 && defaultFieldName) return defaultFieldName;\n if (primaryKeys.length === 1) return `${camelCase(foreignName)}Id`;\n return primaryKey.name;\n })();\n const bestGuessLocal =\n existingReferences[i]?.localRef ??\n editedModel.model.fields.find((f) => f.name === bestGuessLocalName)?.id;\n return {\n localRef: bestGuessLocal,\n foreignRef: primaryKey.id,\n };\n });\n })();\n\n const foreignRelationName = (() => {\n if (!references) return;\n if (editedRelation.foreignRelationName) {\n return editedRelation.foreignRelationName;\n }\n const isOneToOne =\n references.every((ref) => ref.localRef) &&\n ModelFieldUtils.areScalarsUnique(\n editedModel,\n references.map((r) => r.localRef),\n );\n return camelCase(\n isOneToOne ? editedModel.name : pluralize(editedModel.name),\n );\n })();\n\n return {\n name: name ?? '',\n foreignRelationName: foreignRelationName ?? '',\n references: references ?? [],\n };\n}\n\nexport function ModelRelationForm({\n className,\n control: modelControl,\n onSubmitSuccess,\n relationId,\n defaultFieldName,\n}: ModelRelationFormProps): React.JSX.Element {\n const { definition } = useProjectDefinition();\n const editedModel = useEditedModelConfig((model) => model);\n const modelName = editedModel.name;\n const { fields } = editedModel.model;\n const {\n field: { value: modelRelations = [], onChange: onModelRelationsChange },\n } = useController({\n name: `model.relations`,\n control: modelControl,\n });\n\n const foreignModelOptions = definition.models.map((type) => ({\n label: type.name,\n value: type.id,\n }));\n\n const modelRelation =\n relationId === undefined\n ? undefined\n : modelRelations.find((item) => item.id === relationId);\n\n const defaultValues = useMemo((): ModelRelationFieldConfigInput => {\n if (modelRelation) return modelRelation;\n const modelRef = guessModelTypeFromFieldName(\n definition,\n editedModel,\n defaultFieldName,\n );\n return {\n id: modelLocalRelationEntityType.generateNewId(),\n foreignId: modelForeignRelationEntityType.generateNewId(),\n modelRef: modelRef ?? '',\n onDelete: 'Restrict',\n onUpdate: 'Restrict',\n ...getRelationDefaultsFromModel(\n definition,\n editedModel,\n {\n modelRef,\n },\n defaultFieldName,\n ),\n };\n }, [modelRelation, defaultFieldName, definition, editedModel]);\n\n const modelRelationFieldSchema = useDefinitionSchema(\n createModelRelationFieldSchema,\n );\n\n const { control, handleSubmit, setError, watch, setValue } = useForm({\n resolver: zodResolver(modelRelationFieldSchema),\n defaultValues,\n });\n\n const relation = watch();\n\n const foreignModel = relation.modelRef\n ? definition.models.find((m) => m.id === relation.modelRef)\n : undefined;\n\n const foreignFields = foreignModel?.model.fields;\n\n const localFieldOptions = fields.map((f) => ({\n label: f.name,\n value: f.id,\n }));\n\n const foreignFieldOptions =\n foreignFields?.map((f) => ({\n label: f.name,\n value: f.id,\n })) ?? [];\n\n const isRelationOptional = relation.references.some(\n (ref) => fields.find((f) => f.id === ref.localRef)?.isOptional,\n );\n\n const onDelete = (): void => {\n onModelRelationsChange(\n modelRelations.filter((relation) => relation.id !== relationId),\n );\n onSubmitSuccess?.();\n };\n\n const onSubmit = handleSubmit((data): void => {\n const { id } = data;\n\n if (\n fields.some((field) => field.name === data.name) ||\n modelRelations.some(\n (relation) => relation.name === data.name && relation.id !== data.id,\n )\n ) {\n setError('name', {\n message:\n 'The relation name cannot be the same as a field/relation name',\n });\n return;\n }\n\n // look for duplicate local fields\n const localFields = data.references.map((ref) => ref.localRef);\n if (new Set(localFields).size !== localFields.length) {\n toast.error('Local fields must be unique');\n return;\n }\n\n const foreignFields = data.references.map((ref) => ref.foreignRef);\n if (new Set(foreignFields).size !== foreignFields.length) {\n toast.error('Foreign fields must be unique');\n return;\n }\n\n // replace the existing relation with the new one if it exists\n if (modelRelations.some((relation) => relation.id === id)) {\n onModelRelationsChange(\n modelRelations.map((relation) =>\n relation.id === id ? data : relation,\n ),\n );\n } else {\n onModelRelationsChange([...modelRelations, data]);\n }\n onSubmitSuccess?.();\n });\n\n const formId = useId();\n\n const hasSelectedForeignModel = !!foreignModel;\n\n return (\n <form\n className={clsx('space-y-4', className)}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n id={formId}\n >\n <div className=\"grid grid-cols-2 gap-x-8 gap-y-2\">\n <ComboboxField\n options={[{ label: modelName, value: modelName }]}\n value={modelName}\n disabled\n label=\"Local Model\"\n />\n <ComboboxFieldController\n control={control}\n name=\"modelRef\"\n options={foreignModelOptions}\n label=\"Foreign Model\"\n onChange={(value) => {\n if (!value) return;\n const { foreignRelationName, name, references } =\n getRelationDefaultsFromModel(\n definition,\n editedModel,\n {\n ...relation,\n modelRef: value,\n },\n defaultFieldName,\n );\n if (foreignRelationName) {\n setValue('foreignRelationName', foreignRelationName);\n }\n if (name) {\n setValue('name', name);\n }\n setValue('references', references);\n }}\n />\n </div>\n <div\n className={clsx(\n 'grid grid-cols-2 gap-x-8 gap-y-2',\n !hasSelectedForeignModel && 'pointer-events-none opacity-50',\n )}\n >\n <InputFieldController\n control={control}\n disabled={!hasSelectedForeignModel}\n name=\"name\"\n label=\"Local Relation Name\"\n description={\n <span>\n Name of the relation, e.g. {camelCase(modelName)}.\n <strong>\n {foreignModel?.name ? camelCase(foreignModel.name) : 'user'}\n </strong>\n </span>\n }\n />\n <InputFieldController\n control={control}\n disabled={!hasSelectedForeignModel}\n name=\"foreignRelationName\"\n label=\"Foreign Relation Name\"\n description={\n <span>\n Name of the relation on the foreign model, e.g.{' '}\n {camelCase(foreignModel?.name ?? 'post')}.\n <strong>{defaultValues.foreignRelationName || 'user'}</strong>\n </span>\n }\n />\n <div className=\"text-sm font-medium\">Local Field</div>\n <div className=\"text-sm font-medium\">Foreign Field</div>\n {relation.references.map((_, i) => (\n <React.Fragment key={i}>\n <ComboboxFieldController\n disabled={!hasSelectedForeignModel}\n control={control}\n name={`references.${i}.localRef`}\n options={localFieldOptions}\n />\n <ComboboxFieldController\n control={control}\n name={`references.${i}.foreignRef`}\n options={foreignFieldOptions}\n disabled\n />\n </React.Fragment>\n ))}\n </div>\n <div className=\"grid grid-cols-2 gap-x-8 gap-y-2 border-t pt-4\">\n <SelectFieldController\n label=\"On Delete\"\n control={control}\n options={[\n { label: 'Cascade (delete entire local row)', value: 'Cascade' },\n { label: 'Restrict (throw error)', value: 'Restrict' },\n ...(isRelationOptional\n ? [\n {\n label: 'Set Null (set local field to null)',\n value: 'SetNull',\n },\n ]\n : []),\n ]}\n name=\"onDelete\"\n description=\"What to do when the foreign row is deleted\"\n />\n </div>\n <DialogFooter>\n <div className=\"flex w-full justify-between\">\n {relationId && (\n <Button\n variant=\"secondary\"\n onClick={(e) => {\n e.preventDefault();\n onDelete();\n }}\n >\n Delete\n </Button>\n )}\n <div className=\"flex gap-4\">\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button\n type=\"submit\"\n form={formId}\n disabled={!hasSelectedForeignModel}\n >\n Save\n </Button>\n </div>\n </div>\n </DialogFooter>\n </form>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { ModelRelationForm } from './model-relation-form.js';\n\ninterface ModelRelationDialogProps {\n control: Control<ModelConfigInput>;\n asChild?: boolean;\n open?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n children?: React.ReactNode;\n relationId?: string;\n defaultFieldName?: string;\n}\n\nexport function ModelRelationDialog({\n control,\n children,\n asChild,\n open,\n onOpenChange,\n relationId,\n defaultFieldName,\n}: ModelRelationDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent width=\"lg\">\n <DialogHeader>\n <DialogTitle>\n {relationId ? 'Edit Relation' : 'Create Relation'}\n </DialogTitle>\n <DialogDescription>\n Set up the relation between this model and another model\n </DialogDescription>\n </DialogHeader>\n <ModelRelationForm\n control={control}\n onSubmitSuccess={() => {\n setIsOpen(false);\n }}\n relationId={relationId}\n defaultFieldName={defaultFieldName}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","import type {\n ModelConfigInput,\n ModelRelationFieldConfigInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { BadgeWithIcon } from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport { MdLink } from 'react-icons/md';\n\nimport { ModelRelationDialog } from './model-relation-dialog.js';\n\ninterface ModelRelationBadgeProps {\n className?: string;\n control: Control<ModelConfigInput>;\n relation: ModelRelationFieldConfigInput;\n autoCollapse?: boolean;\n}\n\nexport function ModelRelationsBadge({\n className,\n control,\n relation,\n autoCollapse,\n}: ModelRelationBadgeProps): React.JSX.Element {\n const { definitionContainer } = useProjectDefinition();\n const [isHovered, setIsHovered] = useState(false);\n const shouldShowText = !autoCollapse || isHovered;\n return (\n <ModelRelationDialog control={control} relationId={relation.id}>\n <BadgeWithIcon\n icon={MdLink}\n variant=\"secondary\"\n className={clsx('max-w-[100px]', className)}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n aria-label=\"Relation\"\n title=\"Relation\"\n >\n {shouldShowText &&\n `${definitionContainer.nameFromId(relation.modelRef)} ${\n relation.references.length > 1\n ? `(${relation.references.length})`\n : ''\n }`}\n </BadgeWithIcon>\n </ModelRelationDialog>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { modelUniqueConstraintEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n DialogClose,\n DialogFooter,\n MultiComboboxFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { clsx } from 'clsx';\nimport { useId } from 'react';\nimport { useController, useForm } from 'react-hook-form';\nimport { z } from 'zod';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\n\ninterface ModelUniqueConstraintFormProps {\n className?: string;\n control: Control<ModelConfigInput>;\n onSubmitSuccess?: () => void;\n constraintId?: string;\n}\n\nconst formSchema = z.object({\n id: z.string().optional(),\n fields: z.array(z.string()).min(1, 'At least one field is required'),\n});\n\ntype FormValues = z.infer<typeof formSchema>;\n\nexport function ModelUniqueConstraintForm({\n className,\n control: modelControl,\n onSubmitSuccess,\n constraintId,\n}: ModelUniqueConstraintFormProps): React.JSX.Element {\n const fields = useEditedModelConfig((model) => model.model.fields);\n const {\n field: { value: modelValue = [], onChange: onModelChange },\n } = useController({\n name: `model.uniqueConstraints`,\n control: modelControl,\n });\n\n const modelUniqueConstraint =\n constraintId === undefined\n ? undefined\n : modelValue.find((uc) => uc.id === constraintId);\n\n const { control, handleSubmit } = useForm<FormValues>({\n resolver: zodResolver(formSchema),\n values: modelUniqueConstraint\n ? {\n id: modelUniqueConstraint.id,\n fields: modelUniqueConstraint.fields.map((f) => f.fieldRef),\n }\n : { fields: [] },\n });\n\n const onDelete = (): void => {\n onModelChange(modelValue.filter((uc) => uc.id !== constraintId));\n onSubmitSuccess?.();\n };\n\n const onSubmit = handleSubmit((data) => {\n const dataWithId = {\n id: data.id ?? modelUniqueConstraintEntityType.generateNewId(),\n fields: data.fields.map((fieldRef) => ({\n fieldRef,\n })),\n };\n const { id } = dataWithId;\n // replace the existing unique constraint with the new one if it exists\n if (modelValue.some((uc) => uc.id === id)) {\n onModelChange(modelValue.map((uc) => (uc.id === id ? dataWithId : uc)));\n } else {\n onModelChange([...modelValue, dataWithId]);\n }\n onSubmitSuccess?.();\n });\n\n const formId = useId();\n\n return (\n <form\n className={clsx('space-y-4', className)}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n id={formId}\n >\n <MultiComboboxFieldController\n control={control}\n name=\"fields\"\n options={fields.map((f) => ({ value: f.id, label: f.name }))}\n placeholder=\"Select fields to use as primary keys\"\n />\n <DialogFooter>\n <div className=\"flex w-full justify-between\">\n {constraintId && (\n <Button\n variant=\"secondary\"\n onClick={(e) => {\n e.preventDefault();\n onDelete();\n }}\n >\n Delete\n </Button>\n )}\n <div className=\"flex gap-4\">\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" form={formId}>\n Save\n </Button>\n </div>\n </div>\n </DialogFooter>\n </form>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { ModelUniqueConstraintForm } from './model-unique-constraint-form.js';\n\ninterface ModelUniqueConstraintDialogProps {\n control: Control<ModelConfigInput>;\n asChild?: boolean;\n open?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n children?: React.ReactNode;\n constraintId?: string;\n}\n\nexport function ModelUniqueConstraintDialog({\n control,\n children,\n asChild,\n open,\n onOpenChange,\n constraintId,\n}: ModelUniqueConstraintDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Unique Constraint</DialogTitle>\n <DialogDescription>\n Select the fields that will be part of this unique constraint.\n </DialogDescription>\n </DialogHeader>\n <ModelUniqueConstraintForm\n control={control}\n onSubmitSuccess={() => {\n setIsOpen(false);\n }}\n constraintId={constraintId}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { BadgeWithIcon } from '@baseplate-dev/ui-components';\nimport { clsx } from 'clsx';\nimport { useState } from 'react';\nimport { MdStar } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\nimport { ModelUniqueConstraintDialog } from './model-unique-constraint-dialog.js';\n\ninterface ModelFieldUniqueBadgeProps {\n className?: string;\n control: Control<ModelConfigInput>;\n constraintId: string;\n autoCollapse?: boolean;\n}\n\nexport function ModelFieldUniqueBadge({\n className,\n control,\n constraintId,\n autoCollapse,\n}: ModelFieldUniqueBadgeProps): React.JSX.Element {\n const [isHovered, setIsHovered] = useState(false);\n const shouldShowText = !autoCollapse || isHovered;\n const fieldsLength = useEditedModelConfig(\n (model) =>\n model.model.uniqueConstraints?.find((uc) => uc.id === constraintId)\n ?.fields.length ?? 0,\n );\n return (\n <ModelUniqueConstraintDialog control={control} constraintId={constraintId}>\n <BadgeWithIcon\n variant=\"secondary\"\n icon={MdStar}\n className={clsx('', className)}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n aria-label=\"Unique Constraint\"\n title=\"Unique Constraint\"\n >\n {shouldShowText &&\n `Unique ${fieldsLength > 1 ? `(${fieldsLength})` : ''}`}\n </BadgeWithIcon>\n </ModelUniqueConstraintDialog>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { clsx } from 'clsx';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\nimport { ModelPrimaryKeyBadge } from '../primary-key/model-primary-key-badge.js';\nimport { ModelRelationsBadge } from '../relations/model-relation-badge.js';\nimport { ModelFieldUniqueBadge } from '../unique-constraints/model-unique-constraint-badge.js';\n\ninterface ModelFieldBadgesProps {\n className?: string;\n control: Control<ModelConfigInput>;\n idx: number;\n}\n\nexport function ModelFieldBadges({\n className,\n control,\n idx,\n}: ModelFieldBadgesProps): React.JSX.Element {\n const field = useEditedModelConfig((model) => model.model.fields[idx]);\n const isPrimary = useEditedModelConfig((model) =>\n model.model.primaryKeyFieldRefs.includes(field.id),\n );\n const uniqueConstraints = useEditedModelConfig(\n (model) =>\n model.model.uniqueConstraints\n ?.filter((constraint) =>\n constraint.fields.some((f) => f.fieldRef === field.id),\n )\n .map((uc) => uc.id) ?? [],\n );\n const modelFieldRelations = useEditedModelConfig(({ model }) => {\n const field = model.fields[idx];\n return (\n model.relations?.filter((r) =>\n r.references.some((ref) => ref.localRef === field.id),\n ) ?? []\n );\n });\n\n const totalBadges =\n (isPrimary ? 1 : 0) + uniqueConstraints.length + modelFieldRelations.length;\n const autoCollapse = totalBadges > 2;\n\n const badges = [\n isPrimary && (\n <ModelPrimaryKeyBadge\n key={'primary'}\n control={control}\n autoCollapse={autoCollapse}\n />\n ),\n ...uniqueConstraints.map((uc) => (\n <ModelFieldUniqueBadge\n key={uc}\n control={control}\n constraintId={uc}\n autoCollapse={autoCollapse}\n />\n )),\n ...modelFieldRelations.map((relation) => (\n <ModelRelationsBadge\n key={relation.id}\n control={control}\n relation={relation}\n autoCollapse={autoCollapse}\n />\n )),\n ];\n\n return <div className={clsx('flex gap-4', className)}>{badges}</div>;\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { EnumUtils } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n ComboboxField,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n InputField,\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport { useController, useWatch } from 'react-hook-form';\nimport { HiDotsVertical, HiOutlineX } from 'react-icons/hi';\n\ninterface ModelFieldDefaultValueInputProps {\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n idx: number;\n}\n\nexport function ModelFieldDefaultValueInput({\n control,\n idx,\n setValue,\n}: ModelFieldDefaultValueInputProps): React.JSX.Element {\n const { definition } = useProjectDefinition();\n const type = useWatch({\n control,\n name: `model.fields.${idx}.type`,\n });\n\n const {\n field: { value: optionsValue, onChange: onOptionsChange },\n } = useController({\n name: `model.fields.${idx}.options`,\n control,\n });\n\n const defaultValue = useWatch({\n control,\n name: `model.fields.${idx}.options.default`,\n });\n\n if (type === 'boolean') {\n return (\n <div className=\"flex items-center gap-1\">\n <SelectFieldController\n control={control}\n className=\"flex-1\"\n name={`model.fields.${idx}.options.default`}\n options={[\n { label: 'True', value: 'true' },\n { label: 'False', value: 'false' },\n ]}\n placeholder=\"NULL\"\n />\n {defaultValue && (\n <Button\n title=\"Reset\"\n onClick={() => {\n setValue(`model.fields.${idx}.options.default`, '', {\n shouldDirty: true,\n });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n )}\n </div>\n );\n }\n\n if (['string', 'int', 'float'].includes(type)) {\n return (\n <div className=\"flex items-center gap-1\">\n <InputFieldController\n control={control}\n placeholder=\"NULL\"\n name={`model.fields.${idx}.options.default`}\n className=\"flex-1\"\n />\n {defaultValue && (\n <Button\n title=\"Reset\"\n onClick={() => {\n setValue(`model.fields.${idx}.options.default`, undefined, {\n shouldDirty: true,\n });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n )}\n </div>\n );\n }\n\n if (type === 'uuid') {\n if (optionsValue?.genUuid) {\n return (\n <div className=\"flex items-center gap-1\">\n <InputField disabled value=\"Random UUID v4\" className=\"flex-1\" />\n <Button\n title=\"Reset\"\n onClick={() => {\n onOptionsChange({ ...optionsValue, genUuid: false });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n </div>\n );\n }\n return (\n <div className=\"flex items-center gap-1\">\n <InputFieldController\n control={control}\n placeholder=\"NULL\"\n name={`model.fields.${idx}.options.default`}\n className=\"flex-1\"\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button title=\"Options\" variant=\"ghost\" size=\"icon\">\n <HiDotsVertical />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuGroup>\n <DropdownMenuItem\n onSelect={() => {\n onOptionsChange({\n ...optionsValue,\n genUuid: true,\n });\n }}\n >\n Random UUID v4\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n }\n\n if (type === 'dateTime' || type === 'date') {\n const { defaultToNow, updatedAt } = optionsValue ?? {};\n\n if (defaultToNow ?? updatedAt) {\n return (\n <div className=\"flex items-center gap-1\">\n <InputField\n disabled\n value={updatedAt ? 'Last Updated' : 'Now'}\n className=\"flex-1\"\n />\n <Button\n title=\"Reset\"\n onClick={() => {\n onOptionsChange({\n ...optionsValue,\n defaultToNow: false,\n updatedAt: false,\n });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n </div>\n );\n }\n return (\n <div className=\"flex items-center space-x-1\">\n <InputFieldController\n placeholder=\"NULL\"\n control={control}\n name={`model.fields.${idx}.options.default`}\n className=\"flex-1\"\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button title=\"Options\" variant=\"ghost\" size=\"icon\">\n <HiDotsVertical />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuGroup>\n <DropdownMenuItem\n onSelect={() => {\n onOptionsChange({\n ...optionsValue,\n defaultToNow: true,\n updatedAt: false,\n });\n }}\n >\n Now\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => {\n onOptionsChange({\n ...optionsValue,\n defaultToNow: true,\n updatedAt: true,\n });\n }}\n >\n Last Updated At\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n }\n\n if (type === 'enum' && optionsValue?.enumRef) {\n const fieldEnum = EnumUtils.byIdOrThrow(definition, optionsValue.enumRef);\n const enumValues = fieldEnum.values.map((v) => ({\n label: v.friendlyName,\n value: v.id,\n }));\n return (\n <div className=\"flex items-center space-x-1\">\n <ComboboxField\n placeholder=\"NULL\"\n value={optionsValue.defaultEnumValueRef ?? null}\n onChange={(value) => {\n onOptionsChange({\n ...optionsValue,\n defaultEnumValueRef: value ? value : undefined,\n });\n }}\n options={enumValues}\n className=\"flex-1\"\n />\n {optionsValue.defaultEnumValueRef && (\n <Button\n title=\"Reset\"\n onClick={() => {\n onOptionsChange({\n ...optionsValue,\n defaultEnumValueRef: '',\n });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n )}\n </div>\n );\n }\n\n return <div />;\n}\n","import type {\n ModelConfigInput,\n ScalarFieldType,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { SCALAR_FIELD_TYPES } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { ComboboxField } from '@baseplate-dev/ui-components';\nimport { useController } from 'react-hook-form';\n\nimport type { ScalarFieldTypeOption } from '../../../-constants.js';\n\nimport { SCALAR_FIELD_TYPE_OPTIONS } from '../../../-constants.js';\n\ninterface ModelFieldTypeInputProps {\n control: Control<ModelConfigInput>;\n idx: number;\n}\n\nexport function ModelFieldTypeInput({\n control,\n idx,\n}: ModelFieldTypeInputProps): React.JSX.Element {\n const { definition } = useProjectDefinition();\n\n const enumOptions: ScalarFieldTypeOption[] = (definition.enums ?? []).map(\n (config) => ({\n label: config.name,\n value: `enum-${config.id}`,\n description: 'Enum type',\n }),\n );\n\n const typeOptions = [\n ...SCALAR_FIELD_TYPES.filter((t) => t !== 'enum').map(\n (fieldType) => SCALAR_FIELD_TYPE_OPTIONS[fieldType],\n ),\n ...enumOptions,\n ];\n\n const {\n field: { value: typeValue, onChange: onTypeChange },\n } = useController({\n name: `model.fields.${idx}.type`,\n control,\n });\n\n const {\n field: { value: fieldOptions, onChange: onFieldOptionsChange },\n } = useController({\n name: `model.fields.${idx}.options`,\n control,\n });\n\n const handleChange = (value: string | null): void => {\n if (value?.startsWith('enum-')) {\n const enumRef = value.replace('enum-', '');\n onFieldOptionsChange({\n enumRef,\n });\n onTypeChange('enum');\n } else {\n onTypeChange(value as ScalarFieldType);\n }\n };\n\n const enumRef = fieldOptions?.enumRef;\n\n return (\n <div className=\"space-y-2\">\n <ComboboxField\n value={typeValue === 'enum' && enumRef ? `enum-${enumRef}` : typeValue}\n onChange={handleChange}\n options={typeOptions}\n renderItemLabel={(option) => (\n <div className=\"flex flex-col\">\n <div>{option.label}</div>\n <div className=\"text-xs text-muted-foreground\">\n {option.description}\n </div>\n </div>\n )}\n />\n </div>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { modelUniqueConstraintEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n InputFieldController,\n SwitchFieldController,\n toast,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport { HiDotsVertical } from 'react-icons/hi';\nimport { MdOutlineDelete } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\nimport { ModelFieldBadges } from './badges/model-field-badges.js';\nimport { ModelFieldDefaultValueInput } from './model-field-default-value-input.js';\nimport { ModelFieldTypeInput } from './model-field-type-input.js';\nimport { ModelPrimaryKeyDialog } from './primary-key/model-primary-key-dialog.js';\nimport { ModelRelationDialog } from './relations/model-relation-dialog.js';\nimport { ModelUniqueConstraintDialog } from './unique-constraints/model-unique-constraint-dialog.js';\n\ninterface Props {\n className?: string;\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n idx: number;\n onRemove: (idx: number) => void;\n}\n\nfunction ModelFieldForm({\n className,\n control,\n idx,\n setValue,\n onRemove,\n}: Props): React.JSX.Element {\n const watchedField = useEditedModelConfig((model) => model.model.fields[idx]);\n\n const watchedRelations = useEditedModelConfig(\n (model) => model.model.relations,\n );\n\n const primaryKeyFieldRefs = useEditedModelConfig(\n (model) => model.model.primaryKeyFieldRefs,\n );\n const uniqueConstraints =\n useEditedModelConfig((model) => model.model.uniqueConstraints) ?? [];\n const isPartOfPrimaryKey = primaryKeyFieldRefs.includes(watchedField.id);\n const hasCompositePrimaryKey = primaryKeyFieldRefs.length > 1;\n\n const ownUniqueConstraints = uniqueConstraints.filter((uc) =>\n uc.fields.some((f) => f.fieldRef === watchedField.id),\n );\n const usedRelations =\n watchedRelations?.filter((relation) =>\n relation.references.some((r) => r.localRef === watchedField.id),\n ) ?? [];\n\n const removeError = (() => {\n // check local references\n if (usedRelations.length > 0) {\n return `Unable to remove field as it is being used in relations ${usedRelations\n .map((r) => r.name)\n .join(', ')}`;\n }\n // check primary keys\n if (isPartOfPrimaryKey && hasCompositePrimaryKey) {\n return `Unable to remove field as it is being used in in the primary key`;\n }\n // check unique constraints\n if (\n uniqueConstraints.some((constraint) =>\n constraint.fields.some((f) => f.fieldRef === watchedField.id),\n )\n ) {\n return `Unable to remove field as it is being used in in a unique constraint`;\n }\n return;\n })();\n\n function handleRemove(): void {\n if (removeError) {\n toast.error(removeError);\n return;\n }\n\n onRemove(idx);\n\n if (isPartOfPrimaryKey && !hasCompositePrimaryKey) {\n setValue('model.primaryKeyFieldRefs', [], { shouldDirty: true });\n }\n }\n\n const [isPrimaryKeyDialogOpen, setIsPrimaryKeyDialogOpen] = useState(false);\n\n const [isUniqueConstraintDialogOpen, setIsUniqueConstraintDialogOpen] =\n useState(false);\n const [uniqueConstriantId, setUniqueConstraintId] = useState<\n string | undefined\n >();\n\n const [isRelationDialogOpen, setIsRelationDialogOpen] = useState(false);\n const [relationId, setRelationId] = useState<string | undefined>();\n\n return (\n <div className={clsx('items-center', className)}>\n <div>\n <InputFieldController\n control={control}\n name={`model.fields.${idx}.name`}\n />\n </div>\n <div>\n <ModelFieldTypeInput control={control} idx={idx} />\n </div>\n <div>\n <SwitchFieldController\n control={control}\n name={`model.fields.${idx}.isOptional`}\n />\n </div>\n <div className=\"mr-4\">\n <ModelFieldDefaultValueInput\n control={control}\n idx={idx}\n setValue={setValue}\n />\n </div>\n <div>\n <ModelFieldBadges control={control} idx={idx} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <HiDotsVertical />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuGroup>\n {usedRelations.length === 0 && (\n <DropdownMenuItem\n onSelect={() => {\n setIsRelationDialogOpen(true);\n setRelationId(undefined);\n }}\n >\n Add Relation\n </DropdownMenuItem>\n )}\n {usedRelations.length > 0 &&\n usedRelations.map((relation) => (\n <DropdownMenuItem\n key={relation.id}\n onSelect={() => {\n setIsRelationDialogOpen(true);\n setRelationId(relation.id);\n }}\n >\n Edit Relation {usedRelations.length > 1 && relation.name}\n </DropdownMenuItem>\n ))}\n {!hasCompositePrimaryKey && !isPartOfPrimaryKey && (\n <DropdownMenuItem\n onSelect={() => {\n setValue('model.primaryKeyFieldRefs', [watchedField.id], {\n shouldDirty: true,\n });\n }}\n >\n Set as Primary Key\n </DropdownMenuItem>\n )}\n {isPartOfPrimaryKey && (\n <DropdownMenuItem\n onSelect={() => {\n setIsPrimaryKeyDialogOpen(true);\n }}\n >\n Edit Primary Key\n </DropdownMenuItem>\n )}\n {ownUniqueConstraints.length === 0 &&\n (hasCompositePrimaryKey || !isPartOfPrimaryKey) && (\n <DropdownMenuItem\n onSelect={() => {\n setValue(\n 'model.uniqueConstraints',\n [\n ...uniqueConstraints,\n {\n id: modelUniqueConstraintEntityType.generateNewId(),\n fields: [{ fieldRef: watchedField.id }],\n },\n ],\n { shouldDirty: true },\n );\n }}\n >\n Make Unique\n </DropdownMenuItem>\n )}\n {ownUniqueConstraints.length > 0 &&\n ownUniqueConstraints.map((uc, idx) => (\n <DropdownMenuItem\n key={uc.id}\n onSelect={() => {\n setUniqueConstraintId(uc.id);\n setIsUniqueConstraintDialogOpen(true);\n }}\n >\n Edit Unique Constraint{' '}\n {ownUniqueConstraints.length > 1 && idx + 1}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n <ModelPrimaryKeyDialog\n control={control}\n open={isPrimaryKeyDialogOpen}\n onOpenChange={setIsPrimaryKeyDialogOpen}\n />\n <ModelUniqueConstraintDialog\n control={control}\n open={isUniqueConstraintDialogOpen}\n onOpenChange={setIsUniqueConstraintDialogOpen}\n constraintId={uniqueConstriantId}\n />\n <ModelRelationDialog\n control={control}\n open={isRelationDialogOpen}\n onOpenChange={setIsRelationDialogOpen}\n relationId={relationId}\n defaultFieldName={watchedField.name}\n />\n <Button\n variant=\"ghost\"\n onClick={() => {\n handleRemove();\n }}\n size=\"icon\"\n >\n <MdOutlineDelete />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default ModelFieldForm;\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type {\n Control,\n FieldArrayWithId,\n UseFormSetValue,\n} from 'react-hook-form';\n\nimport { clsx } from 'clsx';\nimport { useFieldArray } from 'react-hook-form';\n\nimport { SortableList } from '#src/components/index.js';\n\nimport { ModelAddFieldButton } from './model-add-field-button.js';\nimport ModelFieldForm from './model-field-form.js';\n\ninterface ModelFieldsFormProps {\n className?: string;\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\nexport function ModelFieldsForm({\n className,\n control,\n setValue,\n}: ModelFieldsFormProps): React.JSX.Element {\n const {\n fields: fieldFields,\n remove: removeField,\n append: appendField,\n move: sortFields,\n } = useFieldArray({\n control,\n name: 'model.fields',\n });\n\n const gridClassNames =\n 'grid grid-cols-[repeat(2,minmax(130px,1fr))_60px_minmax(130px,1fr)_minmax(100px,1fr)_80px] gap-3';\n\n const fieldListItems = fieldFields.map((f: FieldArrayWithId, i: number) => ({\n id: f.id,\n element: (\n <ModelFieldForm\n className={gridClassNames}\n key={f.id}\n control={control}\n setValue={setValue}\n idx={i}\n onRemove={removeField}\n />\n ),\n }));\n\n return (\n <div className={clsx('space-y-4', className)}>\n {fieldFields.length === 0 ? (\n <p className=\"pt-4 text-style-muted\">Add some fields to get started</p>\n ) : (\n <div className=\"flex w-full flex-col gap-2 bg-white\">\n <div\n className={clsx(\n gridClassNames,\n 'sticky -top-0 z-10 bg-white py-2 text-sm font-semibold',\n // account for handle in sortable list\n 'pl-12',\n )}\n >\n <div>Name</div>\n <div>Type</div>\n <div>Optional</div>\n <div>Default Value</div>\n <div className=\"sr-only\">Badges</div>\n <div className=\"sr-only\">Actions</div>\n </div>\n <SortableList listItems={fieldListItems} sortItems={sortFields} />\n </div>\n )}\n <ModelAddFieldButton appendField={appendField} setValue={setValue} />\n </div>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport { MdAdd, MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../-hooks/use-edited-model-config.js';\nimport { ModelRelationDialog } from './fields/relations/model-relation-dialog.js';\n\ninterface Props {\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\nexport function ModelRelationsSection({\n control,\n setValue,\n}: Props): React.JSX.Element {\n const { requestConfirm } = useConfirmDialog();\n const { definitionContainer } = useProjectDefinition();\n const relations = useEditedModelConfig(({ model }) => model.relations ?? []);\n const fieldIdsToNames = useEditedModelConfig(({ model }) =>\n Object.fromEntries(model.fields.map((field) => [field.id, field.name])),\n );\n\n function handleDeleteRelation(relationId: string): void {\n const relation = relations.find((relation) => relation.id === relationId);\n requestConfirm({\n title: 'Delete Relation',\n content: `Are you sure you want to delete the relation \"${relation?.name ?? '<invalid>'}\"?`,\n onConfirm: () => {\n setValue(\n 'model.relations',\n relations.filter((relation) => relation.id !== relationId),\n );\n },\n });\n }\n\n return (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Relations</SectionListSectionTitle>\n <SectionListSectionDescription>\n Define relations to enforce uniqueness on one or more fields.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-4\">\n {relations.map((relation) => (\n <RecordView key={relation.id}>\n <RecordViewItemList>\n <RecordViewItem title=\"Name\">{relation.name}</RecordViewItem>\n <RecordViewItem title=\"Local Field\">\n {relation.references\n .map((r) => fieldIdsToNames[r.localRef])\n .join(', ')}\n </RecordViewItem>\n <RecordViewItem title=\"Foreign Model\">\n {definitionContainer.nameFromId(relation.modelRef)}\n </RecordViewItem>\n <RecordViewItem title=\"On Delete\">\n {relation.onDelete}\n </RecordViewItem>\n </RecordViewItemList>\n <RecordViewActions>\n <ModelRelationDialog\n relationId={relation.id}\n control={control}\n asChild\n >\n <Button variant=\"ghost\" size=\"icon\" title=\"Edit\">\n <MdEdit />\n </Button>\n </ModelRelationDialog>\n <Button\n variant=\"ghostDestructive\"\n size=\"icon\"\n title=\"Delete\"\n onClick={() => {\n handleDeleteRelation(relation.id);\n }}\n >\n <MdDeleteOutline />\n </Button>\n </RecordViewActions>\n </RecordView>\n ))}\n <ModelRelationDialog control={control} asChild>\n <Button variant=\"secondary\" size=\"sm\">\n <MdAdd />\n Add Relation\n </Button>\n </ModelRelationDialog>\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport {\n Button,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport { MdAdd, MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../-hooks/use-edited-model-config.js';\nimport { ModelUniqueConstraintDialog } from './fields/unique-constraints/model-unique-constraint-dialog.js';\n\ninterface Props {\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\nexport function ModelUniqueConstraintsSection({\n control,\n setValue,\n}: Props): React.JSX.Element {\n const { requestConfirm } = useConfirmDialog();\n const uniqueConstraints = useEditedModelConfig(\n ({ model }) => model.uniqueConstraints ?? [],\n );\n const fieldIdsToNames = useEditedModelConfig(({ model }) =>\n Object.fromEntries(model.fields.map((field) => [field.id, field.name])),\n );\n\n function handleDeleteConstraint(constraintId: string): void {\n requestConfirm({\n title: 'Delete Unique Constraint',\n content: 'Are you sure you want to delete this unique constraint?',\n onConfirm: () => {\n setValue(\n 'model.uniqueConstraints',\n uniqueConstraints.filter(\n (constraint) => constraint.id !== constraintId,\n ),\n );\n },\n });\n }\n\n return (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Unique Constraints</SectionListSectionTitle>\n <SectionListSectionDescription>\n Define unique constraints to enforce uniqueness on one or more fields.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-4\">\n {uniqueConstraints.map((constraint) => (\n <RecordView key={constraint.id}>\n <RecordViewItemList>\n <RecordViewItem title=\"Fields\">\n {constraint.fields\n .map(\n (field) => fieldIdsToNames[field.fieldRef] ?? '<invalid>',\n )\n .join(', ')}\n </RecordViewItem>\n </RecordViewItemList>\n <RecordViewActions>\n <ModelUniqueConstraintDialog\n constraintId={constraint.id}\n control={control}\n asChild\n >\n <Button variant=\"ghost\" size=\"icon\" title=\"Edit\">\n <MdEdit />\n </Button>\n </ModelUniqueConstraintDialog>\n <Button\n variant=\"ghostDestructive\"\n size=\"icon\"\n title=\"Delete\"\n onClick={() => {\n handleDeleteConstraint(constraint.id);\n }}\n >\n <MdDeleteOutline />\n </Button>\n </RecordViewActions>\n </RecordView>\n ))}\n <ModelUniqueConstraintDialog control={control} asChild>\n <Button variant=\"secondary\" size=\"sm\">\n <MdAdd />\n Add Unique Constraint\n </Button>\n </ModelUniqueConstraintDialog>\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type React from 'react';\n\nimport {\n modelEntityType,\n modelLocalRelationEntityType,\n modelScalarFieldEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { useBlockUnsavedChangesNavigate } from '@baseplate-dev/project-builder-lib/web';\nimport { FormActionBar, SectionList } from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { ErrorBoundary } from '#src/components/index.js';\nimport { registerEntityTypeUrl } from '#src/services/entity-type.js';\n\nimport { EditedModelContextProvider } from '../-hooks/use-edited-model-config.js';\nimport { useModelForm } from '../-hooks/use-model-form.js';\nimport { ModelFieldsForm } from './-components/fields/model-fields-form.js';\nimport { ModelRelationsSection } from './-components/model-relations-section.js';\nimport { ModelUniqueConstraintsSection } from './-components/model-unique-constraints-section.js';\n\nregisterEntityTypeUrl(modelEntityType, `/data/models/edit/{key}`);\nregisterEntityTypeUrl(\n modelScalarFieldEntityType,\n `/data/models/edit/{parentKey}`,\n);\nregisterEntityTypeUrl(\n modelLocalRelationEntityType,\n `/data/models/edit/{parentKey}`,\n);\n\nexport const Route = createFileRoute('/data/models/edit/$key/')({\n component: ModelEditModelPage,\n});\n\nfunction ModelEditModelPage(): React.JSX.Element {\n const { key } = Route.useParams();\n const { form, onSubmit, originalModel } = useModelForm({\n omit: ['name', 'featureRef'],\n modelKey: key,\n });\n const { control, watch, getValues, setValue, reset } = form;\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n // TODO: Add validation for fields form where:\n // - referenced type does not match field type\n // - SET NULL is on non-optional fields\n\n return (\n <ErrorBoundary>\n <EditedModelContextProvider\n originalModel={originalModel}\n getValues={getValues}\n watch={watch}\n >\n <form\n onSubmit={onSubmit}\n className=\"max-w-7xl min-w-[700px] flex-1 space-y-4 px-4 pb-4\"\n >\n <ModelFieldsForm control={control} setValue={setValue} />\n <SectionList>\n <ModelRelationsSection control={control} setValue={setValue} />\n <ModelUniqueConstraintsSection\n control={control}\n setValue={setValue}\n />\n </SectionList>\n <FormActionBar form={form} />\n </form>\n </EditedModelContextProvider>\n </ErrorBoundary>\n );\n}\n"],"names":["CASE_SPLIT_PATTERN","words","str","camelCase","words$1","first","rest","word","capitalize","modelScalarFieldEntityType","importShared","Button","ButtonGroup","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","useMemo","ModelAddFieldButton","className","appendField","setValue","fieldNames","useEditedModelConfig","model","f","primaryKeyFieldLength","availableAutoFields","autoFields","hasCreatedAt","hasUpdatedAt","applyAutoField","autoField","isPrimaryKey","field","fieldId","jsxs","jsx","MdExpandMore","DialogClose","DialogFooter","MultiComboboxFieldController","useId","z","primaryKeychema","ModelPrimaryKeyForm","modelControl","onSubmitSuccess","fields","modelValue","onModelChange","useController","control","handleSubmit","useForm","zodResolver","onSubmit","data","formId","clsx","e","Dialog","DialogContent","DialogDescription","DialogHeader","DialogTitle","DialogTrigger","useControlledState","ModelPrimaryKeyDialog","children","asChild","open","onOpenChange","isOpen","setIsOpen","BadgeWithIcon","useState","ModelPrimaryKeyBadge","autoCollapse","isHovered","setIsHovered","shouldShowText","MdKey","createModelRelationFieldSchema","ModelFieldUtils","modelForeignRelationEntityType","modelLocalRelationEntityType","ModelUtils","useDefinitionSchema","useProjectDefinition","ComboboxField","ComboboxFieldController","InputFieldController","SelectFieldController","toast","React","guessModelTypeFromFieldName","definition","editedModel","fieldName","name","tryFindModel","condition","modelWithName","m","modelWithFeature","getRelationDefaultsFromModel","editedRelation","defaultFieldName","references","primaryKeyFieldRefs","foreignName","primaryKeys","existingReferences","primaryKey","i","bestGuessLocalName","foreignRelationName","isOneToOne","ref","r","pluralize","ModelRelationForm","relationId","modelName","modelRelations","onModelRelationsChange","foreignModelOptions","type","modelRelation","item","defaultValues","modelRef","modelRelationFieldSchema","setError","watch","relation","foreignModel","foreignFields","localFieldOptions","foreignFieldOptions","isRelationOptional","onDelete","id","localFields","hasSelectedForeignModel","value","_","ModelRelationDialog","ModelRelationsBadge","definitionContainer","MdLink","modelUniqueConstraintEntityType","formSchema","ModelUniqueConstraintForm","constraintId","modelUniqueConstraint","uc","dataWithId","fieldRef","ModelUniqueConstraintDialog","ModelFieldUniqueBadge","fieldsLength","MdStar","ModelFieldBadges","idx","isPrimary","uniqueConstraints","constraint","modelFieldRelations","badges","EnumUtils","DropdownMenuGroup","InputField","ModelFieldDefaultValueInput","useWatch","optionsValue","onOptionsChange","defaultValue","HiOutlineX","HiDotsVertical","defaultToNow","updatedAt","enumValues","v","SCALAR_FIELD_TYPES","ModelFieldTypeInput","enumOptions","config","typeOptions","t","fieldType","SCALAR_FIELD_TYPE_OPTIONS","typeValue","onTypeChange","fieldOptions","onFieldOptionsChange","handleChange","enumRef","option","SwitchFieldController","ModelFieldForm","onRemove","watchedField","watchedRelations","isPartOfPrimaryKey","hasCompositePrimaryKey","ownUniqueConstraints","usedRelations","removeError","handleRemove","isPrimaryKeyDialogOpen","setIsPrimaryKeyDialogOpen","isUniqueConstraintDialogOpen","setIsUniqueConstraintDialogOpen","uniqueConstriantId","setUniqueConstraintId","isRelationDialogOpen","setIsRelationDialogOpen","setRelationId","MdOutlineDelete","ModelFieldsForm","fieldFields","removeField","sortFields","useFieldArray","gridClassNames","fieldListItems","SortableList","RecordView","RecordViewActions","RecordViewItem","RecordViewItemList","SectionListSection","SectionListSectionContent","SectionListSectionDescription","SectionListSectionHeader","SectionListSectionTitle","useConfirmDialog","ModelRelationsSection","requestConfirm","relations","fieldIdsToNames","handleDeleteRelation","MdEdit","MdDeleteOutline","MdAdd","ModelUniqueConstraintsSection","handleDeleteConstraint","modelEntityType","useBlockUnsavedChangesNavigate","FormActionBar","SectionList","registerEntityTypeUrl","SplitComponent","key","Route","useParams","form","originalModel","useModelForm","omit","modelKey","getValues","reset","ErrorBoundary","EditedModelContextProvider"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as c}from"./_virtual___federation_fn_import-DK_YYIlv.js";import{j as e}from"./index.esm-Bvv3vNQh.js";import{L as s}from"./index-B7G2CMwL.js";const{Button:n,Card:i,CardDescription:r,CardFooter:a,CardHeader:o,CardTitle:t}=await c("@baseplate-dev/ui-components"),x=function(){return e.jsx("div",{className:"flex-1 bg-white",children:e.jsxs("div",{className:"mx-auto w-160 space-y-4 p-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h1",{children:"Baseplate Project Builder"}),e.jsxs("p",{children:["When you've set everything up, just click the"," ",e.jsx("strong",{children:"Sync"})," button and Baseplate will sync the project configuration to your codebase."]})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-1",children:[e.jsxs(i,{children:[e.jsxs(o,{children:[e.jsx(t,{children:"Models"}),e.jsx(r,{children:"Models are the core of your app. They define the data that your app will store and manipulate."})]}),e.jsx(a,{children:e.jsx(s,{to:"/data",from:"/",children:e.jsx(n,{children:"Configure Models"})})})]}),e.jsxs(i,{children:[e.jsxs(o,{children:[e.jsx(t,{children:"Plugins"}),e.jsx(r,{children:"Baseplate comes with a number of plugins that you can enable or disable, such as email and authentication."})]}),e.jsx(a,{children:e.jsx(s,{to:"/plugins",from:"/",children:e.jsx(n,{children:"Configure Plugins"})})})]}),e.jsxs(i,{children:[e.jsxs(o,{children:[e.jsx(t,{children:"Apps & Repositories"}),e.jsx(r,{children:"Each app represents a separate application that can be run, e.g. backend, frontend, mobile app, etc. You can also configure how the apps are organized into repositories, e.g. monorepos."})]}),e.jsx(a,{children:e.jsx(s,{className:"inline-block",to:"/apps",from:"/",children:e.jsx(n,{children:"Configure Apps"})})})]})]})]})})};export{x as component};
|
|
2
|
-
//# sourceMappingURL=index-tLZ1b0Gc.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-tLZ1b0Gc.js","sources":["../../src/routes/index.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n Button,\n Card,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from '@baseplate-dev/ui-components';\nimport { createFileRoute, Link } from '@tanstack/react-router';\n\nexport const Route = createFileRoute('/')({\n component: Index,\n});\n\nfunction Index(): React.JSX.Element {\n return (\n <div className=\"flex-1 bg-white\">\n <div className=\"mx-auto w-160 space-y-4 p-4\">\n <div className=\"space-y-2\">\n <h1>Baseplate Project Builder</h1>\n <p>\n When you've set everything up, just click the{' '}\n <strong>Sync</strong> button and Baseplate will sync the project\n configuration to your codebase.\n </p>\n </div>\n <div className=\"grid gap-4 md:grid-cols-1\">\n <Card>\n <CardHeader>\n <CardTitle>Models</CardTitle>\n <CardDescription>\n Models are the core of your app. They define the data that your\n app will store and manipulate.\n </CardDescription>\n </CardHeader>\n <CardFooter>\n <Link to=\"/data\" from=\"/\">\n <Button>Configure Models</Button>\n </Link>\n </CardFooter>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Plugins</CardTitle>\n <CardDescription>\n Baseplate comes with a number of plugins that you can enable or\n disable, such as email and authentication.\n </CardDescription>\n </CardHeader>\n <CardFooter>\n <Link to=\"/plugins\" from=\"/\">\n <Button>Configure Plugins</Button>\n </Link>\n </CardFooter>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Apps & Repositories</CardTitle>\n <CardDescription>\n Each app represents a separate application that can be run, e.g.\n backend, frontend, mobile app, etc. You can also configure how\n the apps are organized into repositories, e.g. monorepos.\n </CardDescription>\n </CardHeader>\n <CardFooter>\n <Link className=\"inline-block\" to=\"/apps\" from=\"/\">\n <Button>Configure Apps</Button>\n </Link>\n </CardFooter>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["Button","Card","CardDescription","CardFooter","CardHeader","CardTitle","importShared","SplitComponent","jsxs","jsx","Link"],"mappings":"sJAEA,KAAA,CAAA,OAAAA,EAAA,KAAAC,EAAA,gBAAAC,EAAA,WAAAC,EAAA,WAAAC,EAAA,UAAAC,CAAA,EAAA,MAAAC,EAAA,8BAAA,EAQ+DC,EAAA,UAM3B,CAClC,aACG,MAAI,CAAA,UAAU,kBACb,SAACC,EAAA,KAAA,MAAA,CAAI,UAAU,8BACb,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAyB,2BAAA,CAAA,SAC5B,IAAC,CAAA,SAAA,CAAA,gDACmD,IACnDA,EAAAA,IAAC,UAAO,SAAI,MAAA,CAAA,EAAS,6EAAA,CAEvB,CAAA,CAAA,EACF,EACAD,EAAAA,KAAC,MAAI,CAAA,UAAU,4BACb,SAAA,CAAAA,OAACP,EACC,CAAA,SAAA,CAAAO,OAACJ,EACC,CAAA,SAAA,CAAAK,EAAAA,IAACJ,GAAU,SAAM,QAAA,CAAA,EACjBI,EAAAA,IAACP,GAAe,SAGhB,gGAAA,CAAA,CAAA,EACF,EACCO,EAAA,IAAAN,EAAA,CACC,SAACM,EAAA,IAAAC,EAAA,CAAK,GAAG,QAAQ,KAAK,IACpB,SAACD,EAAAA,IAAAT,EAAA,CAAO,SAAgB,kBAAA,CAAA,CAAA,CAC1B,CACF,CAAA,CAAA,EACF,SACCC,EACC,CAAA,SAAA,CAAAO,OAACJ,EACC,CAAA,SAAA,CAAAK,EAAAA,IAACJ,GAAU,SAAO,SAAA,CAAA,EAClBI,EAAAA,IAACP,GAAe,SAGhB,4GAAA,CAAA,CAAA,EACF,EACCO,EAAA,IAAAN,EAAA,CACC,SAACM,EAAA,IAAAC,EAAA,CAAK,GAAG,WAAW,KAAK,IACvB,SAACD,EAAAA,IAAAT,EAAA,CAAO,SAAiB,mBAAA,CAAA,CAAA,CAC3B,CACF,CAAA,CAAA,EACF,SACCC,EACC,CAAA,SAAA,CAAAO,OAACJ,EACC,CAAA,SAAA,CAAAK,EAAAA,IAACJ,GAAU,SAAmB,qBAAA,CAAA,EAC9BI,EAAAA,IAACP,GAAe,SAIhB,2LAAA,CAAA,CAAA,EACF,EACCO,MAAAN,EAAA,CACC,SAACM,EAAAA,IAAAC,EAAA,CAAK,UAAU,eAAe,GAAG,QAAQ,KAAK,IAC7C,SAAAD,MAACT,EAAO,CAAA,SAAA,iBAAc,EACxB,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import{i as Ye}from"./_virtual___federation_fn_import-DK_YYIlv.js";var Me={exports:{}},ge={};/**
|
|
2
|
-
* @license React
|
|
3
|
-
* react-jsx-runtime.production.js
|
|
4
|
-
*
|
|
5
|
-
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
6
|
-
*
|
|
7
|
-
* This source code is licensed under the MIT license found in the
|
|
8
|
-
* LICENSE file in the root directory of this source tree.
|
|
9
|
-
*/var lt;function Jt(){if(lt)return ge;lt=1;var e=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function t(i,n,u){var c=null;if(u!==void 0&&(c=""+u),n.key!==void 0&&(c=""+n.key),"key"in n){u={};for(var o in n)o!=="key"&&(u[o]=n[o])}else u=n;return n=u.ref,{$$typeof:e,type:i,key:c,ref:n!==void 0?n:null,props:u}}return ge.Fragment=r,ge.jsx=t,ge.jsxs=t,ge}var ot;function Yt(){return ot||(ot=1,Me.exports=Jt()),Me.exports}var vr=Yt();const ct=e=>{let r;const t=new Set,i=(A,S)=>{const w=typeof A=="function"?A(r):A;if(!Object.is(w,r)){const F=r;r=S??(typeof w!="object"||w===null)?w:Object.assign({},r,w),t.forEach(R=>R(r,F))}},n=()=>r,o={setState:i,getState:n,getInitialState:()=>b,subscribe:A=>(t.add(A),()=>t.delete(A))},b=r=e(i,n,o);return o},Gt=e=>e?ct(e):ct,dt=await Ye("react"),zt=e=>e;function Qt(e,r=zt){const t=dt.useSyncExternalStore(e.subscribe,()=>r(e.getState()),()=>r(e.getInitialState()));return dt.useDebugValue(t),t}const ft=e=>{const r=Gt(e),t=i=>Qt(r,i);return Object.assign(t,r),t},mr=e=>e?ft(e):ft,yt=await Ye("react"),m=await Ye("react");var ve=e=>e.type==="checkbox",le=e=>e instanceof Date,H=e=>e==null;const xt=e=>typeof e=="object";var P=e=>!H(e)&&!Array.isArray(e)&&xt(e)&&!le(e),St=e=>P(e)&&e.target?ve(e.target)?e.target.checked:e.target.value:e,Xt=e=>e.substring(0,e.search(/\.\d+(\.|$)/))||e,wt=(e,r)=>e.has(Xt(r)),Zt=e=>{const r=e.constructor&&e.constructor.prototype;return P(r)&&r.hasOwnProperty("isPrototypeOf")},Ge=typeof window<"u"&&typeof window.HTMLElement<"u"&&typeof document<"u";function O(e){let r;const t=Array.isArray(e),i=typeof FileList<"u"?e instanceof FileList:!1;if(e instanceof Date)r=new Date(e);else if(!(Ge&&(e instanceof Blob||i))&&(t||P(e)))if(r=t?[]:{},!t&&!Zt(e))r=e;else for(const n in e)e.hasOwnProperty(n)&&(r[n]=O(e[n]));else return e;return r}var we=e=>/^\w*$/.test(e),M=e=>e===void 0,ke=e=>Array.isArray(e)?e.filter(Boolean):[],ze=e=>ke(e.replace(/["|']|\]/g,"").split(/\.|\[/)),f=(e,r,t)=>{if(!r||!P(e))return t;const i=(we(r)?[r]:ze(r)).reduce((n,u)=>H(n)?n:n[u],e);return M(i)||i===e?M(e[r])?t:e[r]:i},X=e=>typeof e=="boolean",C=(e,r,t)=>{let i=-1;const n=we(r)?[r]:ze(r),u=n.length,c=u-1;for(;++i<u;){const o=n[i];let b=t;if(i!==c){const A=e[o];b=P(A)||Array.isArray(A)?A:isNaN(+n[i+1])?{}:[]}if(o==="__proto__"||o==="constructor"||o==="prototype")return;e[o]=b,e=e[o]}};const Ae={BLUR:"blur",FOCUS_OUT:"focusout",CHANGE:"change"},K={onBlur:"onBlur",onChange:"onChange",onSubmit:"onSubmit",onTouched:"onTouched",all:"all"},ie={max:"max",min:"min",maxLength:"maxLength",minLength:"minLength",pattern:"pattern",required:"required",validate:"validate"},kt=m.createContext(null);kt.displayName="HookFormContext";const pe=()=>m.useContext(kt);var pt=(e,r,t,i=!0)=>{const n={defaultValues:r._defaultValues};for(const u in e)Object.defineProperty(n,u,{get:()=>{const c=u;return r._proxyFormState[c]!==K.all&&(r._proxyFormState[c]=!i||K.all),t&&(t[c]=!0),e[c]}});return n};const Ee=typeof window<"u"?yt.useLayoutEffect:yt.useEffect;function Kt(e){const r=pe(),{control:t=r.control,disabled:i,name:n,exact:u}=e||{},[c,o]=m.useState(t._formState),b=m.useRef({isDirty:!1,isLoading:!1,dirtyFields:!1,touchedFields:!1,validatingFields:!1,isValidating:!1,isValid:!1,errors:!1});return Ee(()=>t._subscribe({name:n,formState:b.current,exact:u,callback:A=>{!i&&o({...t._formState,...A})}}),[n,i,u]),m.useEffect(()=>{b.current.isValid&&t._setValid(!0)},[t]),m.useMemo(()=>pt(c,t,b.current,!1),[c,t])}var se=e=>typeof e=="string",Et=(e,r,t,i,n)=>se(e)?(i&&r.watch.add(e),f(t,e,n)):Array.isArray(e)?e.map(u=>(i&&r.watch.add(u),f(t,u))):(i&&(r.watchAll=!0),t);function er(e){const r=pe(),{control:t=r.control,name:i,defaultValue:n,disabled:u,exact:c}=e||{},o=m.useRef(n),[b,A]=m.useState(t._getWatch(i,o.current));return Ee(()=>t._subscribe({name:i,formState:{values:!0},exact:c,callback:S=>!u&&A(Et(i,t._names,S.values||t._formValues,!1,o.current))}),[i,t,u,c]),m.useEffect(()=>t._removeUnmounted()),b}function br(e){const r=pe(),{name:t,disabled:i,control:n=r.control,shouldUnregister:u}=e,c=wt(n._names.array,t),o=er({control:n,name:t,defaultValue:f(n._formValues,t,f(n._defaultValues,t,e.defaultValue)),exact:!0}),b=Kt({control:n,name:t,exact:!0}),A=m.useRef(e),S=m.useRef(n.register(t,{...e.rules,value:o,...X(e.disabled)?{disabled:e.disabled}:{}})),w=m.useMemo(()=>Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!f(b.errors,t)},isDirty:{enumerable:!0,get:()=>!!f(b.dirtyFields,t)},isTouched:{enumerable:!0,get:()=>!!f(b.touchedFields,t)},isValidating:{enumerable:!0,get:()=>!!f(b.validatingFields,t)},error:{enumerable:!0,get:()=>f(b.errors,t)}}),[b,t]),F=m.useCallback(L=>S.current.onChange({target:{value:St(L),name:t},type:Ae.CHANGE}),[t]),R=m.useCallback(()=>S.current.onBlur({target:{value:f(n._formValues,t),name:t},type:Ae.BLUR}),[t,n._formValues]),Y=m.useCallback(L=>{const ee=f(n._fields,t);ee&&L&&(ee._f.ref={focus:()=>L.focus&&L.focus(),select:()=>L.select&&L.select(),setCustomValidity:V=>L.setCustomValidity(V),reportValidity:()=>L.reportValidity()})},[n._fields,t]),U=m.useMemo(()=>({name:t,value:o,...X(i)||b.disabled?{disabled:b.disabled||i}:{},onChange:F,onBlur:R,ref:Y}),[t,i,b.disabled,F,R,Y,o]);return m.useEffect(()=>{const L=n._options.shouldUnregister||u;n.register(t,{...A.current.rules,...X(A.current.disabled)?{disabled:A.current.disabled}:{}});const ee=(V,G)=>{const q=f(n._fields,V);q&&q._f&&(q._f.mount=G)};if(ee(t,!0),L){const V=O(f(n._options.defaultValues,t));C(n._defaultValues,t,V),M(f(n._formValues,t))&&C(n._formValues,t,V)}return!c&&n.register(t),()=>{(c?L&&!n._state.action:L)?n.unregister(t):ee(t,!1)}},[t,n,c,u]),m.useEffect(()=>{n._setDisabledField({disabled:i,name:t})},[i,t,n]),m.useMemo(()=>({field:U,formState:b,fieldState:w}),[U,b,w])}var tr=(e,r,t,i,n)=>r?{...t[e],types:{...t[e]&&t[e].types?t[e].types:{},[i]:n||!0}}:{},J=e=>Array.isArray(e)?e:[e],gt=()=>{let e=[];return{get observers(){return e},next:n=>{for(const u of e)u.next&&u.next(n)},subscribe:n=>(e.push(n),{unsubscribe:()=>{e=e.filter(u=>u!==n)}}),unsubscribe:()=>{e=[]}}},He=e=>H(e)||!xt(e);function ue(e,r,t=new WeakSet){if(He(e)||He(r))return e===r;if(le(e)&&le(r))return e.getTime()===r.getTime();const i=Object.keys(e),n=Object.keys(r);if(i.length!==n.length)return!1;if(t.has(e)||t.has(r))return!0;t.add(e),t.add(r);for(const u of i){const c=e[u];if(!n.includes(u))return!1;if(u!=="ref"){const o=r[u];if(le(c)&&le(o)||P(c)&&P(o)||Array.isArray(c)&&Array.isArray(o)?!ue(c,o,t):c!==o)return!1}}return!0}var j=e=>P(e)&&!Object.keys(e).length,Qe=e=>e.type==="file",te=e=>typeof e=="function",Ve=e=>{if(!Ge)return!1;const r=e?e.ownerDocument:0;return e instanceof(r&&r.defaultView?r.defaultView.HTMLElement:HTMLElement)},Dt=e=>e.type==="select-multiple",Xe=e=>e.type==="radio",rr=e=>Xe(e)||ve(e),Ue=e=>Ve(e)&&e.isConnected;function sr(e,r){const t=r.slice(0,-1).length;let i=0;for(;i<t;)e=M(e)?i++:e[r[i++]];return e}function ir(e){for(const r in e)if(e.hasOwnProperty(r)&&!M(e[r]))return!1;return!0}function B(e,r){const t=Array.isArray(r)?r:we(r)?[r]:ze(r),i=t.length===1?e:sr(e,t),n=t.length-1,u=t[n];return i&&delete i[u],n!==0&&(P(i)&&j(i)||Array.isArray(i)&&ir(i))&&B(e,t.slice(0,-1)),e}var Ct=e=>{for(const r in e)if(te(e[r]))return!0;return!1};function xe(e,r={}){const t=Array.isArray(e);if(P(e)||t)for(const i in e)Array.isArray(e[i])||P(e[i])&&!Ct(e[i])?(r[i]=Array.isArray(e[i])?[]:{},xe(e[i],r[i])):H(e[i])||(r[i]=!0);return r}function Rt(e,r,t){const i=Array.isArray(e);if(P(e)||i)for(const n in e)Array.isArray(e[n])||P(e[n])&&!Ct(e[n])?M(r)||He(t[n])?t[n]=Array.isArray(e[n])?xe(e[n],[]):{...xe(e[n])}:Rt(e[n],H(r)?{}:r[n],t[n]):t[n]=!ue(e[n],r[n]);return t}var _e=(e,r)=>Rt(e,r,xe(r));const _t={value:!1,isValid:!1},ht={value:!0,isValid:!0};var Tt=e=>{if(Array.isArray(e)){if(e.length>1){const r=e.filter(t=>t&&t.checked&&!t.disabled).map(t=>t.value);return{value:r,isValid:!!r.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!M(e[0].attributes.value)?M(e[0].value)||e[0].value===""?ht:{value:e[0].value,isValid:!0}:ht:_t}return _t},Ot=(e,{valueAsNumber:r,valueAsDate:t,setValueAs:i})=>M(e)?e:r?e===""?NaN:e&&+e:t&&se(e)?new Date(e):i?i(e):e;const vt={isValid:!1,value:null};var Mt=e=>Array.isArray(e)?e.reduce((r,t)=>t&&t.checked&&!t.disabled?{isValid:!0,value:t.value}:r,vt):vt;function mt(e){const r=e.ref;return Qe(r)?r.files:Xe(r)?Mt(e.refs).value:Dt(r)?[...r.selectedOptions].map(({value:t})=>t):ve(r)?Tt(e.refs).value:Ot(M(r.value)?e.ref.value:r.value,e)}var ar=(e,r,t,i)=>{const n={};for(const u of e){const c=f(r,u);c&&C(n,u,c._f)}return{criteriaMode:t,names:[...e],fields:n,shouldUseNativeValidation:i}},Se=e=>e instanceof RegExp,he=e=>M(e)?e:Se(e)?e.source:P(e)?Se(e.value)?e.value.source:e.value:e,de=e=>({isOnSubmit:!e||e===K.onSubmit,isOnBlur:e===K.onBlur,isOnChange:e===K.onChange,isOnAll:e===K.all,isOnTouch:e===K.onTouched});const bt="AsyncFunction";var nr=e=>!!e&&!!e.validate&&!!(te(e.validate)&&e.validate.constructor.name===bt||P(e.validate)&&Object.values(e.validate).find(r=>r.constructor.name===bt)),ur=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate),$e=(e,r,t)=>!t&&(r.watchAll||r.watch.has(e)||[...r.watch].some(i=>e.startsWith(i)&&/^\.\w+/.test(e.slice(i.length))));const fe=(e,r,t,i)=>{for(const n of t||Object.keys(e)){const u=f(e,n);if(u){const{_f:c,...o}=u;if(c){if(c.refs&&c.refs[0]&&r(c.refs[0],n)&&!i)return!0;if(c.ref&&r(c.ref,c.name)&&!i)return!0;if(fe(o,r))break}else if(P(o)&&fe(o,r))break}}};function Ft(e,r,t){const i=f(e,t);if(i||we(t))return{error:i,name:t};const n=t.split(".");for(;n.length;){const u=n.join("."),c=f(r,u),o=f(e,u);if(c&&!Array.isArray(c)&&t!==u)return{name:t};if(o&&o.type)return{name:u,error:o};if(o&&o.root&&o.root.type)return{name:`${u}.root`,error:o.root};n.pop()}return{name:t}}var lr=(e,r,t,i)=>{t(e);const{name:n,...u}=e;return j(u)||Object.keys(u).length>=Object.keys(r).length||Object.keys(u).find(c=>r[c]===(!i||K.all))},or=(e,r,t)=>!e||!r||e===r||J(e).some(i=>i&&(t?i===r:i.startsWith(r)||r.startsWith(i))),cr=(e,r,t,i,n)=>n.isOnAll?!1:!t&&n.isOnTouch?!(r||e):(t?i.isOnBlur:n.isOnBlur)?!e:(t?i.isOnChange:n.isOnChange)?e:!0,dr=(e,r)=>!ke(f(e,r)).length&&B(e,r),Ut=(e,r,t)=>{const i=J(f(e,t));return C(i,"root",r[t]),C(e,t,i),e},Fe=e=>se(e);function At(e,r,t="validate"){if(Fe(e)||Array.isArray(e)&&e.every(Fe)||X(e)&&!e)return{type:t,message:Fe(e)?e:"",ref:r}}var ce=e=>P(e)&&!Se(e)?e:{value:e,message:""},Je=async(e,r,t,i,n,u)=>{const{ref:c,refs:o,required:b,maxLength:A,minLength:S,min:w,max:F,pattern:R,validate:Y,name:U,valueAsNumber:L,mount:ee}=e._f,V=f(t,U);if(!ee||r.has(U))return{};const G=o?o[0]:c,q=p=>{n&&G.reportValidity&&(G.setCustomValidity(X(p)?"":p||""),G.reportValidity())},I={},v=Xe(c),_=ve(c),x=v||_,k=(L||Qe(c))&&M(c.value)&&M(V)||Ve(c)&&c.value===""||V===""||Array.isArray(V)&&!V.length,z=tr.bind(null,U,i,I),Q=(p,D,N,W=ie.maxLength,$=ie.minLength)=>{const re=p?D:N;I[U]={type:p?W:$,message:re,ref:c,...z(p?W:$,re)}};if(u?!Array.isArray(V)||!V.length:b&&(!x&&(k||H(V))||X(V)&&!V||_&&!Tt(o).isValid||v&&!Mt(o).isValid)){const{value:p,message:D}=Fe(b)?{value:!!b,message:b}:ce(b);if(p&&(I[U]={type:ie.required,message:D,ref:G,...z(ie.required,D)},!i))return q(D),I}if(!k&&(!H(w)||!H(F))){let p,D;const N=ce(F),W=ce(w);if(!H(V)&&!isNaN(V)){const $=c.valueAsNumber||V&&+V;H(N.value)||(p=$>N.value),H(W.value)||(D=$<W.value)}else{const $=c.valueAsDate||new Date(V),re=me=>new Date(new Date().toDateString()+" "+me),ye=c.type=="time",oe=c.type=="week";se(N.value)&&V&&(p=ye?re(V)>re(N.value):oe?V>N.value:$>new Date(N.value)),se(W.value)&&V&&(D=ye?re(V)<re(W.value):oe?V<W.value:$<new Date(W.value))}if((p||D)&&(Q(!!p,N.message,W.message,ie.max,ie.min),!i))return q(I[U].message),I}if((A||S)&&!k&&(se(V)||u&&Array.isArray(V))){const p=ce(A),D=ce(S),N=!H(p.value)&&V.length>+p.value,W=!H(D.value)&&V.length<+D.value;if((N||W)&&(Q(N,p.message,D.message),!i))return q(I[U].message),I}if(R&&!k&&se(V)){const{value:p,message:D}=ce(R);if(Se(p)&&!V.match(p)&&(I[U]={type:ie.pattern,message:D,ref:c,...z(ie.pattern,D)},!i))return q(D),I}if(Y){if(te(Y)){const p=await Y(V,t),D=At(p,G);if(D&&(I[U]={...D,...z(ie.validate,D.message)},!i))return q(D.message),I}else if(P(Y)){let p={};for(const D in Y){if(!j(p)&&!i)break;const N=At(await Y[D](V,t),G,D);N&&(p={...N,...z(D,N.message)},q(N.message),i&&(I[U]=p))}if(!j(p)&&(I[U]={ref:G,...p},!i))return I}}return q(!0),I};const fr={mode:K.onSubmit,reValidateMode:K.onChange,shouldFocusError:!0};function yr(e={}){let r={...fr,...e},t={submitCount:0,isDirty:!1,isReady:!1,isLoading:te(r.defaultValues),isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},validatingFields:{},errors:r.errors||{},disabled:r.disabled||!1},i={},n=P(r.defaultValues)||P(r.values)?O(r.defaultValues||r.values)||{}:{},u=r.shouldUnregister?{}:O(n),c={action:!1,mount:!1,watch:!1},o={mount:new Set,disabled:new Set,unMount:new Set,array:new Set,watch:new Set},b,A=0;const S={isDirty:!1,dirtyFields:!1,validatingFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1};let w={...S};const F={array:gt(),state:gt()},R=r.criteriaMode===K.all,Y=s=>a=>{clearTimeout(A),A=setTimeout(s,a)},U=async s=>{if(!r.disabled&&(S.isValid||w.isValid||s)){const a=r.resolver?j((await _()).errors):await k(i,!0);a!==t.isValid&&F.state.next({isValid:a})}},L=(s,a)=>{!r.disabled&&(S.isValidating||S.validatingFields||w.isValidating||w.validatingFields)&&((s||Array.from(o.mount)).forEach(l=>{l&&(a?C(t.validatingFields,l,a):B(t.validatingFields,l))}),F.state.next({validatingFields:t.validatingFields,isValidating:!j(t.validatingFields)}))},ee=(s,a=[],l,g,y=!0,d=!0)=>{if(g&&l&&!r.disabled){if(c.action=!0,d&&Array.isArray(f(i,s))){const h=l(f(i,s),g.argA,g.argB);y&&C(i,s,h)}if(d&&Array.isArray(f(t.errors,s))){const h=l(f(t.errors,s),g.argA,g.argB);y&&C(t.errors,s,h),dr(t.errors,s)}if((S.touchedFields||w.touchedFields)&&d&&Array.isArray(f(t.touchedFields,s))){const h=l(f(t.touchedFields,s),g.argA,g.argB);y&&C(t.touchedFields,s,h)}(S.dirtyFields||w.dirtyFields)&&(t.dirtyFields=_e(n,u)),F.state.next({name:s,isDirty:Q(s,a),dirtyFields:t.dirtyFields,errors:t.errors,isValid:t.isValid})}else C(u,s,a)},V=(s,a)=>{C(t.errors,s,a),F.state.next({errors:t.errors})},G=s=>{t.errors=s,F.state.next({errors:t.errors,isValid:!1})},q=(s,a,l,g)=>{const y=f(i,s);if(y){const d=f(u,s,M(l)?f(n,s):l);M(d)||g&&g.defaultChecked||a?C(u,s,a?d:mt(y._f)):N(s,d),c.mount&&U()}},I=(s,a,l,g,y)=>{let d=!1,h=!1;const E={name:s};if(!r.disabled){if(!l||g){(S.isDirty||w.isDirty)&&(h=t.isDirty,t.isDirty=E.isDirty=Q(),d=h!==E.isDirty);const T=ue(f(n,s),a);h=!!f(t.dirtyFields,s),T?B(t.dirtyFields,s):C(t.dirtyFields,s,!0),E.dirtyFields=t.dirtyFields,d=d||(S.dirtyFields||w.dirtyFields)&&h!==!T}if(l){const T=f(t.touchedFields,s);T||(C(t.touchedFields,s,l),E.touchedFields=t.touchedFields,d=d||(S.touchedFields||w.touchedFields)&&T!==l)}d&&y&&F.state.next(E)}return d?E:{}},v=(s,a,l,g)=>{const y=f(t.errors,s),d=(S.isValid||w.isValid)&&X(a)&&t.isValid!==a;if(r.delayError&&l?(b=Y(()=>V(s,l)),b(r.delayError)):(clearTimeout(A),b=null,l?C(t.errors,s,l):B(t.errors,s)),(l?!ue(y,l):y)||!j(g)||d){const h={...g,...d&&X(a)?{isValid:a}:{},errors:t.errors,name:s};t={...t,...h},F.state.next(h)}},_=async s=>{L(s,!0);const a=await r.resolver(u,r.context,ar(s||o.mount,i,r.criteriaMode,r.shouldUseNativeValidation));return L(s),a},x=async s=>{const{errors:a}=await _(s);if(s)for(const l of s){const g=f(a,l);g?C(t.errors,l,g):B(t.errors,l)}else t.errors=a;return a},k=async(s,a,l={valid:!0})=>{for(const g in s){const y=s[g];if(y){const{_f:d,...h}=y;if(d){const E=o.array.has(d.name),T=y._f&&nr(y._f);T&&S.validatingFields&&L([g],!0);const Z=await Je(y,o.disabled,u,R,r.shouldUseNativeValidation&&!a,E);if(T&&S.validatingFields&&L([g]),Z[d.name]&&(l.valid=!1,a))break;!a&&(f(Z,d.name)?E?Ut(t.errors,Z,d.name):C(t.errors,d.name,Z[d.name]):B(t.errors,d.name))}!j(h)&&await k(h,a,l)}}return l.valid},z=()=>{for(const s of o.unMount){const a=f(i,s);a&&(a._f.refs?a._f.refs.every(l=>!Ue(l)):!Ue(a._f.ref))&&De(s)}o.unMount=new Set},Q=(s,a)=>!r.disabled&&(s&&a&&C(u,s,a),!ue(me(),n)),p=(s,a,l)=>Et(s,o,{...c.mount?u:M(a)?n:se(s)?{[s]:a}:a},l,a),D=s=>ke(f(c.mount?u:n,s,r.shouldUnregister?f(n,s,[]):[])),N=(s,a,l={})=>{const g=f(i,s);let y=a;if(g){const d=g._f;d&&(!d.disabled&&C(u,s,Ot(a,d)),y=Ve(d.ref)&&H(a)?"":a,Dt(d.ref)?[...d.ref.options].forEach(h=>h.selected=y.includes(h.value)):d.refs?ve(d.ref)?d.refs.forEach(h=>{(!h.defaultChecked||!h.disabled)&&(Array.isArray(y)?h.checked=!!y.find(E=>E===h.value):h.checked=y===h.value||!!y)}):d.refs.forEach(h=>h.checked=h.value===y):Qe(d.ref)?d.ref.value="":(d.ref.value=y,d.ref.type||F.state.next({name:s,values:O(u)})))}(l.shouldDirty||l.shouldTouch)&&I(s,y,l.shouldTouch,l.shouldDirty,!0),l.shouldValidate&&oe(s)},W=(s,a,l)=>{for(const g in a){if(!a.hasOwnProperty(g))return;const y=a[g],d=s+"."+g,h=f(i,d);(o.array.has(s)||P(y)||h&&!h._f)&&!le(y)?W(d,y,l):N(d,y,l)}},$=(s,a,l={})=>{const g=f(i,s),y=o.array.has(s),d=O(a);C(u,s,d),y?(F.array.next({name:s,values:O(u)}),(S.isDirty||S.dirtyFields||w.isDirty||w.dirtyFields)&&l.shouldDirty&&F.state.next({name:s,dirtyFields:_e(n,u),isDirty:Q(s,d)})):g&&!g._f&&!H(d)?W(s,d,l):N(s,d,l),$e(s,o)&&F.state.next({...t}),F.state.next({name:c.mount?s:void 0,values:O(u)})},re=async s=>{c.mount=!0;const a=s.target;let l=a.name,g=!0;const y=f(i,l),d=T=>{g=Number.isNaN(T)||le(T)&&isNaN(T.getTime())||ue(T,f(u,l,T))},h=de(r.mode),E=de(r.reValidateMode);if(y){let T,Z;const be=a.type?mt(y._f):St(s),ae=s.type===Ae.BLUR||s.type===Ae.FOCUS_OUT,jt=!ur(y._f)&&!r.resolver&&!f(t.errors,l)&&!y._f.deps||cr(ae,f(t.touchedFields,l),t.isSubmitted,E,h),Te=$e(l,o,ae);C(u,l,be),ae?(y._f.onBlur&&y._f.onBlur(s),b&&b(0)):y._f.onChange&&y._f.onChange(s);const Oe=I(l,be,ae),Ht=!j(Oe)||Te;if(!ae&&F.state.next({name:l,type:s.type,values:O(u)}),jt)return(S.isValid||w.isValid)&&(r.mode==="onBlur"?ae&&U():ae||U()),Ht&&F.state.next({name:l,...Te?{}:Oe});if(!ae&&Te&&F.state.next({...t}),r.resolver){const{errors:nt}=await _([l]);if(d(be),g){const $t=Ft(t.errors,i,l),ut=Ft(nt,i,$t.name||l);T=ut.error,l=ut.name,Z=j(nt)}}else L([l],!0),T=(await Je(y,o.disabled,u,R,r.shouldUseNativeValidation))[l],L([l]),d(be),g&&(T?Z=!1:(S.isValid||w.isValid)&&(Z=await k(i,!0)));g&&(y._f.deps&&oe(y._f.deps),v(l,Z,T,Oe))}},ye=(s,a)=>{if(f(t.errors,a)&&s.focus)return s.focus(),1},oe=async(s,a={})=>{let l,g;const y=J(s);if(r.resolver){const d=await x(M(s)?s:y);l=j(d),g=s?!y.some(h=>f(d,h)):l}else s?(g=(await Promise.all(y.map(async d=>{const h=f(i,d);return await k(h&&h._f?{[d]:h}:h)}))).every(Boolean),!(!g&&!t.isValid)&&U()):g=l=await k(i);return F.state.next({...!se(s)||(S.isValid||w.isValid)&&l!==t.isValid?{}:{name:s},...r.resolver||!s?{isValid:l}:{},errors:t.errors}),a.shouldFocus&&!g&&fe(i,ye,s?y:o.mount),g},me=s=>{const a={...c.mount?u:n};return M(s)?a:se(s)?f(a,s):s.map(l=>f(a,l))},Ze=(s,a)=>({invalid:!!f((a||t).errors,s),isDirty:!!f((a||t).dirtyFields,s),error:f((a||t).errors,s),isValidating:!!f(t.validatingFields,s),isTouched:!!f((a||t).touchedFields,s)}),Lt=s=>{s&&J(s).forEach(a=>B(t.errors,a)),F.state.next({errors:s?t.errors:{}})},Ke=(s,a,l)=>{const g=(f(i,s,{_f:{}})._f||{}).ref,y=f(t.errors,s)||{},{ref:d,message:h,type:E,...T}=y;C(t.errors,s,{...T,...a,ref:g}),F.state.next({name:s,errors:t.errors,isValid:!1}),l&&l.shouldFocus&&g&&g.focus&&g.focus()},It=(s,a)=>te(s)?F.state.subscribe({next:l=>s(p(void 0,a),l)}):p(s,a,!0),et=s=>F.state.subscribe({next:a=>{or(s.name,a.name,s.exact)&&lr(a,s.formState||S,Wt,s.reRenderRoot)&&s.callback({values:{...u},...t,...a})}}).unsubscribe,Nt=s=>(c.mount=!0,w={...w,...s.formState},et({...s,formState:w})),De=(s,a={})=>{for(const l of s?J(s):o.mount)o.mount.delete(l),o.array.delete(l),a.keepValue||(B(i,l),B(u,l)),!a.keepError&&B(t.errors,l),!a.keepDirty&&B(t.dirtyFields,l),!a.keepTouched&&B(t.touchedFields,l),!a.keepIsValidating&&B(t.validatingFields,l),!r.shouldUnregister&&!a.keepDefaultValue&&B(n,l);F.state.next({values:O(u)}),F.state.next({...t,...a.keepDirty?{isDirty:Q()}:{}}),!a.keepIsValid&&U()},tt=({disabled:s,name:a})=>{(X(s)&&c.mount||s||o.disabled.has(a))&&(s?o.disabled.add(a):o.disabled.delete(a))},Ce=(s,a={})=>{let l=f(i,s);const g=X(a.disabled)||X(r.disabled);return C(i,s,{...l||{},_f:{...l&&l._f?l._f:{ref:{name:s}},name:s,mount:!0,...a}}),o.mount.add(s),l?tt({disabled:X(a.disabled)?a.disabled:r.disabled,name:s}):q(s,!0,a.value),{...g?{disabled:a.disabled||r.disabled}:{},...r.progressive?{required:!!a.required,min:he(a.min),max:he(a.max),minLength:he(a.minLength),maxLength:he(a.maxLength),pattern:he(a.pattern)}:{},name:s,onChange:re,onBlur:re,ref:y=>{if(y){Ce(s,a),l=f(i,s);const d=M(y.value)&&y.querySelectorAll&&y.querySelectorAll("input,select,textarea")[0]||y,h=rr(d),E=l._f.refs||[];if(h?E.find(T=>T===d):d===l._f.ref)return;C(i,s,{_f:{...l._f,...h?{refs:[...E.filter(Ue),d,...Array.isArray(f(n,s))?[{}]:[]],ref:{type:d.type,name:s}}:{ref:d}}}),q(s,!1,void 0,d)}else l=f(i,s,{}),l._f&&(l._f.mount=!1),(r.shouldUnregister||a.shouldUnregister)&&!(wt(o.array,s)&&c.action)&&o.unMount.add(s)}}},Re=()=>r.shouldFocusError&&fe(i,ye,o.mount),Bt=s=>{X(s)&&(F.state.next({disabled:s}),fe(i,(a,l)=>{const g=f(i,l);g&&(a.disabled=g._f.disabled||s,Array.isArray(g._f.refs)&&g._f.refs.forEach(y=>{y.disabled=g._f.disabled||s}))},0,!1))},rt=(s,a)=>async l=>{let g;l&&(l.preventDefault&&l.preventDefault(),l.persist&&l.persist());let y=O(u);if(F.state.next({isSubmitting:!0}),r.resolver){const{errors:d,values:h}=await _();t.errors=d,y=O(h)}else await k(i);if(o.disabled.size)for(const d of o.disabled)B(y,d);if(B(t.errors,"root"),j(t.errors)){F.state.next({errors:{}});try{await s(y,l)}catch(d){g=d}}else a&&await a({...t.errors},l),Re(),setTimeout(Re);if(F.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:j(t.errors)&&!g,submitCount:t.submitCount+1,errors:t.errors}),g)throw g},Pt=(s,a={})=>{f(i,s)&&(M(a.defaultValue)?$(s,O(f(n,s))):($(s,a.defaultValue),C(n,s,O(a.defaultValue))),a.keepTouched||B(t.touchedFields,s),a.keepDirty||(B(t.dirtyFields,s),t.isDirty=a.defaultValue?Q(s,O(f(n,s))):Q()),a.keepError||(B(t.errors,s),S.isValid&&U()),F.state.next({...t}))},st=(s,a={})=>{const l=s?O(s):n,g=O(l),y=j(s),d=y?n:g;if(a.keepDefaultValues||(n=l),!a.keepValues){if(a.keepDirtyValues){const h=new Set([...o.mount,...Object.keys(_e(n,u))]);for(const E of Array.from(h))f(t.dirtyFields,E)?C(d,E,f(u,E)):$(E,f(d,E))}else{if(Ge&&M(s))for(const h of o.mount){const E=f(i,h);if(E&&E._f){const T=Array.isArray(E._f.refs)?E._f.refs[0]:E._f.ref;if(Ve(T)){const Z=T.closest("form");if(Z){Z.reset();break}}}}if(a.keepFieldsRef)for(const h of o.mount)$(h,f(d,h));else i={}}u=r.shouldUnregister?a.keepDefaultValues?O(n):{}:O(d),F.array.next({values:{...d}}),F.state.next({values:{...d}})}o={mount:a.keepDirtyValues?o.mount:new Set,unMount:new Set,array:new Set,disabled:new Set,watch:new Set,watchAll:!1,focus:""},c.mount=!S.isValid||!!a.keepIsValid||!!a.keepDirtyValues,c.watch=!!r.shouldUnregister,F.state.next({submitCount:a.keepSubmitCount?t.submitCount:0,isDirty:y?!1:a.keepDirty?t.isDirty:!!(a.keepDefaultValues&&!ue(s,n)),isSubmitted:a.keepIsSubmitted?t.isSubmitted:!1,dirtyFields:y?{}:a.keepDirtyValues?a.keepDefaultValues&&u?_e(n,u):t.dirtyFields:a.keepDefaultValues&&s?_e(n,s):a.keepDirty?t.dirtyFields:{},touchedFields:a.keepTouched?t.touchedFields:{},errors:a.keepErrors?t.errors:{},isSubmitSuccessful:a.keepIsSubmitSuccessful?t.isSubmitSuccessful:!1,isSubmitting:!1})},it=(s,a)=>st(te(s)?s(u):s,a),qt=(s,a={})=>{const l=f(i,s),g=l&&l._f;if(g){const y=g.refs?g.refs[0]:g.ref;y.focus&&(y.focus(),a.shouldSelect&&te(y.select)&&y.select())}},Wt=s=>{t={...t,...s}},at={control:{register:Ce,unregister:De,getFieldState:Ze,handleSubmit:rt,setError:Ke,_subscribe:et,_runSchema:_,_focusError:Re,_getWatch:p,_getDirty:Q,_setValid:U,_setFieldArray:ee,_setDisabledField:tt,_setErrors:G,_getFieldArray:D,_reset:st,_resetDefaultValues:()=>te(r.defaultValues)&&r.defaultValues().then(s=>{it(s,r.resetOptions),F.state.next({isLoading:!1})}),_removeUnmounted:z,_disableForm:Bt,_subjects:F,_proxyFormState:S,get _fields(){return i},get _formValues(){return u},get _state(){return c},set _state(s){c=s},get _defaultValues(){return n},get _names(){return o},set _names(s){o=s},get _formState(){return t},get _options(){return r},set _options(s){r={...r,...s}}},subscribe:Nt,trigger:oe,register:Ce,handleSubmit:rt,watch:It,setValue:$,getValues:me,reset:it,resetField:Pt,clearErrors:Lt,unregister:De,setError:Ke,setFocus:qt,getFieldState:Ze};return{...at,formControl:at}}var ne=()=>{if(typeof crypto<"u"&&crypto.randomUUID)return crypto.randomUUID();const e=typeof performance>"u"?Date.now():performance.now()*1e3;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{const t=(Math.random()*16+e)%16|0;return(r=="x"?t:t&3|8).toString(16)})},Le=(e,r,t={})=>t.shouldFocus||M(t.shouldFocus)?t.focusName||`${e}.${M(t.focusIndex)?r:t.focusIndex}.`:"",Ie=(e,r)=>[...e,...J(r)],Ne=e=>Array.isArray(e)?e.map(()=>{}):void 0;function Be(e,r,t){return[...e.slice(0,r),...J(t),...e.slice(r)]}var Pe=(e,r,t)=>Array.isArray(e)?(M(e[t])&&(e[t]=void 0),e.splice(t,0,e.splice(r,1)[0]),e):[],qe=(e,r)=>[...J(r),...J(e)];function gr(e,r){let t=0;const i=[...e];for(const n of r)i.splice(n-t,1),t++;return ke(i).length?i:[]}var We=(e,r)=>M(r)?[]:gr(e,J(r).sort((t,i)=>t-i)),je=(e,r,t)=>{[e[r],e[t]]=[e[t],e[r]]},Vt=(e,r,t)=>(e[r]=t,e);function Fr(e){const r=pe(),{control:t=r.control,name:i,keyName:n="id",shouldUnregister:u,rules:c}=e,[o,b]=m.useState(t._getFieldArray(i)),A=m.useRef(t._getFieldArray(i).map(ne)),S=m.useRef(o),w=m.useRef(i),F=m.useRef(!1);w.current=i,S.current=o,t._names.array.add(i),c&&t.register(i,c),Ee(()=>t._subjects.array.subscribe({next:({values:v,name:_})=>{if(_===w.current||!_){const x=f(v,w.current);Array.isArray(x)&&(b(x),A.current=x.map(ne))}}}).unsubscribe,[t]);const R=m.useCallback(v=>{F.current=!0,t._setFieldArray(i,v)},[t,i]),Y=(v,_)=>{const x=J(O(v)),k=Ie(t._getFieldArray(i),x);t._names.focus=Le(i,k.length-1,_),A.current=Ie(A.current,x.map(ne)),R(k),b(k),t._setFieldArray(i,k,Ie,{argA:Ne(v)})},U=(v,_)=>{const x=J(O(v)),k=qe(t._getFieldArray(i),x);t._names.focus=Le(i,0,_),A.current=qe(A.current,x.map(ne)),R(k),b(k),t._setFieldArray(i,k,qe,{argA:Ne(v)})},L=v=>{const _=We(t._getFieldArray(i),v);A.current=We(A.current,v),R(_),b(_),!Array.isArray(f(t._fields,i))&&C(t._fields,i,void 0),t._setFieldArray(i,_,We,{argA:v})},ee=(v,_,x)=>{const k=J(O(_)),z=Be(t._getFieldArray(i),v,k);t._names.focus=Le(i,v,x),A.current=Be(A.current,v,k.map(ne)),R(z),b(z),t._setFieldArray(i,z,Be,{argA:v,argB:Ne(_)})},V=(v,_)=>{const x=t._getFieldArray(i);je(x,v,_),je(A.current,v,_),R(x),b(x),t._setFieldArray(i,x,je,{argA:v,argB:_},!1)},G=(v,_)=>{const x=t._getFieldArray(i);Pe(x,v,_),Pe(A.current,v,_),R(x),b(x),t._setFieldArray(i,x,Pe,{argA:v,argB:_},!1)},q=(v,_)=>{const x=O(_),k=Vt(t._getFieldArray(i),v,x);A.current=[...k].map((z,Q)=>!z||Q===v?ne():A.current[Q]),R(k),b([...k]),t._setFieldArray(i,k,Vt,{argA:v,argB:x},!0,!1)},I=v=>{const _=J(O(v));A.current=_.map(ne),R([..._]),b([..._]),t._setFieldArray(i,[..._],x=>x,{},!0,!1)};return m.useEffect(()=>{if(t._state.action=!1,$e(i,t._names)&&t._subjects.state.next({...t._formState}),F.current&&(!de(t._options.mode).isOnSubmit||t._formState.isSubmitted)&&!de(t._options.reValidateMode).isOnSubmit)if(t._options.resolver)t._runSchema([i]).then(v=>{const _=f(v.errors,i),x=f(t._formState.errors,i);(x?!_&&x.type||_&&(x.type!==_.type||x.message!==_.message):_&&_.type)&&(_?C(t._formState.errors,i,_):B(t._formState.errors,i),t._subjects.state.next({errors:t._formState.errors}))});else{const v=f(t._fields,i);v&&v._f&&!(de(t._options.reValidateMode).isOnSubmit&&de(t._options.mode).isOnSubmit)&&Je(v,t._names.disabled,t._formValues,t._options.criteriaMode===K.all,t._options.shouldUseNativeValidation,!0).then(_=>!j(_)&&t._subjects.state.next({errors:Ut(t._formState.errors,_,i)}))}t._subjects.state.next({name:i,values:O(t._formValues)}),t._names.focus&&fe(t._fields,(v,_)=>{if(t._names.focus&&_.startsWith(t._names.focus)&&v.focus)return v.focus(),1}),t._names.focus="",t._setValid(),F.current=!1},[o,i,t]),m.useEffect(()=>(!f(t._formValues,i)&&t._setFieldArray(i),()=>{const v=(_,x)=>{const k=f(t._fields,_);k&&k._f&&(k._f.mount=x)};t._options.shouldUnregister||u?t.unregister(i):v(i,!1)}),[i,t,n,u]),{swap:m.useCallback(V,[R,i,t]),move:m.useCallback(G,[R,i,t]),prepend:m.useCallback(U,[R,i,t]),append:m.useCallback(Y,[R,i,t]),remove:m.useCallback(L,[R,i,t]),insert:m.useCallback(ee,[R,i,t]),update:m.useCallback(q,[R,i,t]),replace:m.useCallback(I,[R,i,t]),fields:m.useMemo(()=>o.map((v,_)=>({...v,[n]:A.current[_]||ne()})),[o,n])}}function Ar(e={}){const r=m.useRef(void 0),t=m.useRef(void 0),[i,n]=m.useState({isDirty:!1,isValidating:!1,isLoading:te(e.defaultValues),isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,submitCount:0,dirtyFields:{},touchedFields:{},validatingFields:{},errors:e.errors||{},disabled:e.disabled||!1,isReady:!1,defaultValues:te(e.defaultValues)?void 0:e.defaultValues});if(!r.current)if(e.formControl)r.current={...e.formControl,formState:i},e.defaultValues&&!te(e.defaultValues)&&e.formControl.reset(e.defaultValues,e.resetOptions);else{const{formControl:c,...o}=yr(e);r.current={...o,formState:i}}const u=r.current.control;return u._options=e,Ee(()=>{const c=u._subscribe({formState:u._proxyFormState,callback:()=>n({...u._formState}),reRenderRoot:!0});return n(o=>({...o,isReady:!0})),u._formState.isReady=!0,c},[u]),m.useEffect(()=>u._disableForm(e.disabled),[u,e.disabled]),m.useEffect(()=>{e.mode&&(u._options.mode=e.mode),e.reValidateMode&&(u._options.reValidateMode=e.reValidateMode)},[u,e.mode,e.reValidateMode]),m.useEffect(()=>{e.errors&&(u._setErrors(e.errors),u._focusError())},[u,e.errors]),m.useEffect(()=>{e.shouldUnregister&&u._subjects.state.next({values:u._getWatch()})},[u,e.shouldUnregister]),m.useEffect(()=>{if(u._proxyFormState.isDirty){const c=u._getDirty();c!==i.isDirty&&u._subjects.state.next({isDirty:c})}},[u,i.isDirty]),m.useEffect(()=>{e.values&&!ue(e.values,t.current)?(u._reset(e.values,{keepFieldsRef:!0,...u._options.resetOptions}),t.current=e.values,n(c=>({...c}))):u._resetDefaultValues()},[u,e.values]),m.useEffect(()=>{u._state.mount||(u._setValid(),u._state.mount=!0),u._state.watch&&(u._state.watch=!1,u._subjects.state.next({...u._formState})),u._removeUnmounted()}),r.current.formState=pt(i,u),r.current}export{tr as a,Ar as b,mr as c,Kt as d,er as e,Fr as f,f as g,Gt as h,Qt as i,vr as j,C as s,br as u};
|
|
10
|
-
//# sourceMappingURL=index.esm-Bvv3vNQh.js.map
|