@baseplate-dev/project-builder-web 0.2.4 → 0.2.6
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-BC9esibq.js → -constants-CqYT9Sad.js} +2 -2
- package/dist/assets/{-constants-BC9esibq.js.map → -constants-CqYT9Sad.js.map} +1 -1
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/{web-BaAZd6c4.js → web-CEscUEnR.js} +2 -2
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/{web-BaAZd6c4.js.map → web-CEscUEnR.js.map} +1 -1
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-CzpSl25Z.js +5 -0
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-CzpSl25Z.js.map +1 -0
- package/dist/assets/__federation_shared_@baseplate-dev/{ui-components-CbLT5eCP.js → ui-components-Bpztr-cx.js} +4 -4
- package/dist/assets/__federation_shared_@baseplate-dev/ui-components-Bpztr-cx.js.map +1 -0
- package/dist/assets/{_virtual___federation_fn_import-CzwHXTRo.js → _virtual___federation_fn_import-BLYgPlMt.js} +2 -2
- package/dist/assets/{_virtual___federation_fn_import-CzwHXTRo.js.map → _virtual___federation_fn_import-BLYgPlMt.js.map} +1 -1
- package/dist/assets/{backend-B3MDDop9.js → backend-hJNcdERv.js} +2 -2
- package/dist/assets/{backend-B3MDDop9.js.map → backend-hJNcdERv.js.map} +1 -1
- package/dist/assets/{badge-with-type-label-CNVJUqNt.js → badge-with-type-label-CezAtjFy.js} +2 -2
- package/dist/assets/{badge-with-type-label-CNVJUqNt.js.map → badge-with-type-label-CezAtjFy.js.map} +1 -1
- package/dist/assets/{edit._id-Ce2Ymc-o.js → edit._id-bMpe6S3O.js} +2 -2
- package/dist/assets/{edit._id-Ce2Ymc-o.js.map → edit._id-bMpe6S3O.js.map} +1 -1
- package/dist/assets/{enum-info-form-CVHvQqYN.js → enum-info-form-xlZ2HO8I.js} +2 -2
- package/dist/assets/{enum-info-form-CVHvQqYN.js.map → enum-info-form-xlZ2HO8I.js.map} +1 -1
- package/dist/assets/{graphql-BlURtGp8.js → graphql-D3J4ZWXL.js} +2 -2
- package/dist/assets/{graphql-BlURtGp8.js.map → graphql-D3J4ZWXL.js.map} +1 -1
- package/dist/assets/{hierarchy-B1V1qwhL.js → hierarchy-DF9lzUjz.js} +2 -2
- package/dist/assets/{hierarchy-B1V1qwhL.js.map → hierarchy-DF9lzUjz.js.map} +1 -1
- package/dist/assets/{immer-xieDw-3D.js → immer-BOh2djD_.js} +2 -2
- package/dist/assets/{immer-xieDw-3D.js.map → immer-BOh2djD_.js.map} +1 -1
- package/dist/assets/{index-BEMXZzJT.js → index-1ErFJbDw.js} +2 -2
- package/dist/assets/{index-BEMXZzJT.js.map → index-1ErFJbDw.js.map} +1 -1
- package/dist/assets/index-37eYMUXo.js +2 -0
- package/dist/assets/index-37eYMUXo.js.map +1 -0
- package/dist/assets/{index-1rH5AIf1.js → index-B5-Qczd9.js} +2 -2
- package/dist/assets/{index-1rH5AIf1.js.map → index-B5-Qczd9.js.map} +1 -1
- package/dist/assets/{index-Bw18F51O.js → index-BLuLGksP.js} +2 -2
- package/dist/assets/{index-Bw18F51O.js.map → index-BLuLGksP.js.map} +1 -1
- package/dist/assets/index-BPK2SbiO.js +2 -0
- package/dist/assets/index-BPK2SbiO.js.map +1 -0
- package/dist/assets/{index-1DYdEncJ.js → index-BdmJimiZ.js} +2 -2
- package/dist/assets/{index-1DYdEncJ.js.map → index-BdmJimiZ.js.map} +1 -1
- package/dist/assets/{index-BRdI-lNh.js → index-Bv8hyN9u.js} +2 -2
- package/dist/assets/{index-BRdI-lNh.js.map → index-Bv8hyN9u.js.map} +1 -1
- package/dist/assets/{index-BxN9iLEr.js → index-C15I7WFi.js} +2 -2
- package/dist/assets/{index-BxN9iLEr.js.map → index-C15I7WFi.js.map} +1 -1
- package/dist/assets/{index-BMCloLL3.js → index-C_wN4CIq.js} +19 -19
- package/dist/assets/index-C_wN4CIq.js.map +1 -0
- package/dist/assets/index-DBOJRz5n.css +1 -0
- package/dist/assets/{index-DlrvL7L-.js → index-DJsZccoO.js} +2 -2
- package/dist/assets/{index-DlrvL7L-.js.map → index-DJsZccoO.js.map} +1 -1
- package/dist/assets/{index-DJrwWHdu.js → index-DwyYddxl.js} +2 -2
- package/dist/assets/{index-DJrwWHdu.js.map → index-DwyYddxl.js.map} +1 -1
- package/dist/assets/index-P-wtG1LL.js +2 -0
- package/dist/assets/index-P-wtG1LL.js.map +1 -0
- package/dist/assets/{index.esm-C6ngV5UE.js → index.esm-DcyGeCKA.js} +2 -2
- package/dist/assets/{index.esm-C6ngV5UE.js.map → index.esm-DcyGeCKA.js.map} +1 -1
- package/dist/assets/{model-info-form-B3UWaCuz.js → model-info-form-VtbYsjrH.js} +2 -2
- package/dist/assets/{model-info-form-B3UWaCuz.js.map → model-info-form-VtbYsjrH.js.map} +1 -1
- package/dist/assets/model-merger-qJqD9I2_.js +2 -0
- package/dist/assets/{model-merger-BoPVsTMR.js.map → model-merger-qJqD9I2_.js.map} +1 -1
- package/dist/assets/{new-app-dialog-DmiiaAcy.js → new-app-dialog-CTtQ52jO.js} +2 -2
- package/dist/assets/{new-app-dialog-DmiiaAcy.js.map → new-app-dialog-CTtQ52jO.js.map} +1 -1
- package/dist/assets/{new-enum-dialog-eE-ABw-k.js → new-enum-dialog-B0QcIWdY.js} +2 -2
- package/dist/assets/{new-enum-dialog-eE-ABw-k.js.map → new-enum-dialog-B0QcIWdY.js.map} +1 -1
- package/dist/assets/{new-model-dialog-DsUABBKe.js → new-model-dialog-CM2dJ8Iv.js} +2 -2
- package/dist/assets/{new-model-dialog-DsUABBKe.js.map → new-model-dialog-CM2dJ8Iv.js.map} +1 -1
- package/dist/assets/{route-CBp4D5qe.js → route-B34jnFQF.js} +2 -2
- package/dist/assets/{route-CBp4D5qe.js.map → route-B34jnFQF.js.map} +1 -1
- package/dist/assets/{route-MODh5ysn.js → route-BRBmSLMi.js} +2 -2
- package/dist/assets/{route-MODh5ysn.js.map → route-BRBmSLMi.js.map} +1 -1
- package/dist/assets/{route-Cey_4lZX.js → route-BsIUCKz1.js} +2 -2
- package/dist/assets/{route-Cey_4lZX.js.map → route-BsIUCKz1.js.map} +1 -1
- package/dist/assets/route-CAp89B2q.js +2 -0
- package/dist/assets/{route-CqtFDOsk.js.map → route-CAp89B2q.js.map} +1 -1
- package/dist/assets/{route-rX4E9J5V.js → route-DcsVxxui.js} +2 -2
- package/dist/assets/{route-rX4E9J5V.js.map → route-DcsVxxui.js.map} +1 -1
- package/dist/assets/{route-BcszKLdV.js → route-DmdFbZkw.js} +2 -2
- package/dist/assets/{route-BcszKLdV.js.map → route-DmdFbZkw.js.map} +1 -1
- package/dist/assets/{route-DioBcaFQ.js → route-Dpmx4lrA.js} +2 -2
- package/dist/assets/{route-DioBcaFQ.js.map → route-Dpmx4lrA.js.map} +1 -1
- package/dist/assets/route-T4J_Uk-9.js +2 -0
- package/dist/assets/route-T4J_Uk-9.js.map +1 -0
- package/dist/assets/{route-sqtj7nCf.js → route-w8_2x1VY.js} +2 -2
- package/dist/assets/{route-sqtj7nCf.js.map → route-w8_2x1VY.js.map} +1 -1
- package/dist/assets/{service-CuzPG1Yl.js → service-Bgm1ICPI.js} +2 -2
- package/dist/assets/{service-CuzPG1Yl.js.map → service-Bgm1ICPI.js.map} +1 -1
- package/dist/assets/{template-extractor-B9fEhgo_.js → template-extractor-DEU0CX0Y.js} +2 -2
- package/dist/assets/{template-extractor-B9fEhgo_.js.map → template-extractor-DEU0CX0Y.js.map} +1 -1
- package/dist/assets/{theme-builder-Bw8c01EE.js → theme-builder-La1nKR0K.js} +2 -2
- package/dist/assets/{theme-builder-Bw8c01EE.js.map → theme-builder-La1nKR0K.js.map} +1 -1
- package/dist/assets/{use-definition-schema-DANa9pch.js → use-definition-schema-CuFFJIzk.js} +2 -2
- package/dist/assets/{use-definition-schema-DANa9pch.js.map → use-definition-schema-CuFFJIzk.js.map} +1 -1
- package/dist/assets/{use-enum-form-Dz-Wnbxj.js → use-enum-form-DKD2EDHZ.js} +2 -2
- package/dist/assets/{use-enum-form-Dz-Wnbxj.js.map → use-enum-form-DKD2EDHZ.js.map} +1 -1
- package/dist/assets/{use-model-form-DMG7DdSK.js → use-model-form-BQa-PiE_.js} +2 -2
- package/dist/assets/{use-model-form-DMG7DdSK.js.map → use-model-form-BQa-PiE_.js.map} +1 -1
- package/dist/assets/{utils-95Eli4qP.js → utils-BYjOwi1b.js} +2 -2
- package/dist/assets/{utils-95Eli4qP.js.map → utils-BYjOwi1b.js.map} +1 -1
- package/dist/index.html +6 -6
- package/package.json +6 -6
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-C7fVVw7M.js +0 -5
- package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-C7fVVw7M.js.map +0 -1
- package/dist/assets/__federation_shared_@baseplate-dev/ui-components-CbLT5eCP.js.map +0 -1
- package/dist/assets/index-B9Di1LKs.css +0 -1
- package/dist/assets/index-BMCloLL3.js.map +0 -1
- package/dist/assets/index-BazMYfmA.js +0 -2
- package/dist/assets/index-BazMYfmA.js.map +0 -1
- package/dist/assets/index-D9m5kBYP.js +0 -2
- package/dist/assets/index-D9m5kBYP.js.map +0 -1
- package/dist/assets/model-merger-BoPVsTMR.js +0 -2
- package/dist/assets/route-CqtFDOsk.js +0 -2
- package/dist/assets/route-VW3n5-PC.js +0 -2
- package/dist/assets/route-VW3n5-PC.js.map +0 -1
- package/dist/assets/sections-D48VzvlO.js +0 -2
- package/dist/assets/sections-D48VzvlO.js.map +0 -1
- package/dist/assets/sections._sectionKey-Cojmxr6C.js +0 -2
- package/dist/assets/sections._sectionKey-Cojmxr6C.js.map +0 -1
- package/dist/assets/web-B6BjTv_c.js +0 -2
- package/dist/assets/web-B6BjTv_c.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as n}from"./_virtual___federation_fn_import-CzwHXTRo.js";import{j as e}from"./index.esm-C6ngV5UE.js";import{q as v,s as w}from"./index-BMCloLL3.js";import{u as A}from"./use-definition-schema-DANa9pch.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-BazMYfmA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BazMYfmA.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 as r}from"./_virtual___federation_fn_import-CzwHXTRo.js";import{j as e}from"./index.esm-C6ngV5UE.js";import{b as N,c as y,L as k,l as E,I as S,t as I}from"./index-BMCloLL3.js";import{D}from"./index-BxN9iLEr.js";import{l as $}from"./utils-95Eli4qP.js";function A(c,n,a){return`/api/plugins/${c}/${n}/static/${a}`}const{pluginEntityType:b,webConfigSpec:v}=await r("@baseplate-dev/project-builder-lib"),{useProjectDefinition:F}=await r("@baseplate-dev/project-builder-lib/web"),{Button:f,Card:W,CardContent:M,CardDescription:L,CardHeader:T,CardTitle:z}=await r("@baseplate-dev/ui-components");function C({className:c,plugin:n,isActive:a}){const{currentProjectId:s}=N(),{saveDefinitionWithFeedbackSync:d,schemaParserContext:u,definitionContainer:p,pluginContainer:m,isSavingDefinition:o}=F(),l=y();function i(){if($(u.pluginStore,n,p.definition).getPluginSpec(v).getWebConfigComponent(n.id)){l({to:`/plugins/edit/${n.id}`}).catch(E);return}d(j=>{j.plugins=[...(j.plugins??[]).filter(x=>x.packageName!==n.packageName||x.name!==n.name),{id:b.idFromKey(n.id),packageName:n.packageName,name:n.name,version:n.version,config:{}}]},{successMessage:`Enabled ${n.displayName}!`})}function t(){d(g=>{g.plugins=(g.plugins??[]).filter(h=>h.id!==b.idFromKey(n.id))},{successMessage:`Disabled ${n.displayName}!`})}const w=m.getPluginSpec(v).getWebConfigComponent(n.id);return e.jsxs(W,{className:c,children:[e.jsx(T,{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&&s?e.jsx("img",{src:A(s,n.id,n.icon),className:"size-12 rounded-xl bg-muted",alt:`${n.displayName} logo`}):e.jsx(D,{className:"size-12 bg-muted p-2"})}),e.jsxs("div",{children:[e.jsx(z,{children:n.displayName}),e.jsx(L,{children:n.packageName})]})]}),e.jsx("div",{children:a?w?e.jsx(k,{to:"/plugins/edit/$id",from:"/",params:{id:n.id},children:e.jsx(f,{variant:"secondary",children:"Configure"})}):e.jsx(f,{variant:"secondary",onClick:t,disabled:o,children:"Disable"}):e.jsx(f,{variant:"secondary",onClick:i,disabled:o,children:"Enable"})})]})}),e.jsx(M,{children:e.jsx("div",{className:"text-sm",children:e.jsx("p",{children:n.description})})})]})}const{useProjectDefinition:H}=await r("@baseplate-dev/project-builder-lib/web"),{EmptyDisplay:K,ErrorableLoader:R}=await r("@baseplate-dev/ui-components"),{useEffect:B,useState:P}=await r("react"),O=function(){const{currentProjectId:n}=N(),[a,s]=P(null),{definition:d}=H(),[u,p]=P(null);if(B(()=>{if(s(null),!!n){if(S){s([]);return}I.plugins.getAvailablePlugins.mutate({projectId:n}).then(s).catch(p)}},[n]),!a)return e.jsx(R,{error:u});if(a.length===0)return e.jsx(K,{header:"No plugins available.",subtitle:"Please install plugins via package.json."});const m=d.plugins??[],o=a.filter(i=>m.some(t=>t.packageName===i.packageName&&t.name===i.name)),l=a.filter(i=>!i.hidden&&!m.some(t=>t.packageName===i.packageName&&t.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(C,{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(C,{plugin:i,isActive:!1},i.id))]})]})};export{O as component};
|
|
2
|
-
//# sourceMappingURL=index-D9m5kBYP.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-D9m5kBYP.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 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 draft.plugins = [\n ...(draft.plugins ?? []).filter(\n (p) =>\n p.packageName !== plugin.packageName || p.name !== plugin.name,\n ),\n {\n id: pluginEntityType.idFromKey(plugin.id),\n packageName: plugin.packageName,\n name: plugin.name,\n version: plugin.version,\n config: {},\n },\n ];\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","webConfigSpec","importShared","useProjectDefinition","Button","Card","CardContent","CardDescription","CardHeader","CardTitle","PluginCard","className","plugin","isActive","currentProjectId","useProjects","saveDefinitionWithFeedbackSync","schemaParserContext","definitionContainer","pluginContainer","isSavingDefinition","navigate","useNavigate","enablePlugin","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":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as F}from"./_virtual___federation_fn_import-CzwHXTRo.js";import{g as Y,a as D,e as T}from"./isEqual-C420KeG-.js";function $(e){return e==null||typeof e!="object"&&typeof e!="function"}function C(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function g(e,t,i,n=new Map,s=void 0){const o=s?.(e,t,i,n);if(o!=null)return o;if($(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const r=new Array(e.length);n.set(e,r);for(let f=0;f<e.length;f++)r[f]=g(e[f],f,i,n,s);return Object.hasOwn(e,"index")&&(r.index=e.index),Object.hasOwn(e,"input")&&(r.input=e.input),r}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp){const r=new RegExp(e.source,e.flags);return r.lastIndex=e.lastIndex,r}if(e instanceof Map){const r=new Map;n.set(e,r);for(const[f,a]of e)r.set(f,g(a,f,i,n,s));return r}if(e instanceof Set){const r=new Set;n.set(e,r);for(const f of e)r.add(g(f,void 0,i,n,s));return r}if(typeof Buffer<"u"&&Buffer.isBuffer(e))return e.subarray();if(C(e)){const r=new(Object.getPrototypeOf(e)).constructor(e.length);n.set(e,r);for(let f=0;f<e.length;f++)r[f]=g(e[f],f,i,n,s);return r}if(e instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&e instanceof SharedArrayBuffer)return e.slice(0);if(e instanceof DataView){const r=new DataView(e.buffer.slice(0),e.byteOffset,e.byteLength);return n.set(e,r),w(r,e,i,n,s),r}if(typeof File<"u"&&e instanceof File){const r=new File([e],e.name,{type:e.type});return n.set(e,r),w(r,e,i,n,s),r}if(e instanceof Blob){const r=new Blob([e],{type:e.type});return n.set(e,r),w(r,e,i,n,s),r}if(e instanceof Error){const r=new e.constructor;return n.set(e,r),r.message=e.message,r.name=e.name,r.stack=e.stack,r.cause=e.cause,w(r,e,i,n,s),r}if(typeof e=="object"&&e!==null){const r=Object.create(Object.getPrototypeOf(e));return n.set(e,r),w(r,e,i,n,s),r}return e}function w(e,t,i=e,n,s){const o=[...Object.keys(t),...Y(t)];for(let r=0;r<o.length;r++){const f=o[r],a=Object.getOwnPropertyDescriptor(e,f);(a==null||a.writable)&&(e[f]=g(t[f],f,i,n,s))}}function q(e){return g(e,void 0,e,new Map,void 0)}function j(e,t){const i={},n=Object.keys(e);for(let s=0;s<n.length;s++){const o=n[s],r=e[o];i[o]=t(r,o,e)}return i}function b(e,t){const i=Object.keys(t);for(let n=0;n<i.length;n++){const s=i[n],o=t[s],r=e[s];Array.isArray(o)?Array.isArray(r)?e[s]=b(r,o):e[s]=b([],o):D(o)?D(r)?e[s]=b(r,o):e[s]=b({},o):(r===void 0||o!==void 0)&&(e[s]=o)}return e}function N(e,t){const i={...e};for(let n=0;n<t.length;n++){const s=t[n];delete i[s]}return i}function v(e,t){return b(q(e),t)}let ee=e=>crypto.getRandomValues(new Uint8Array(e)),te=(e,t,i)=>{let n=(2<<Math.log2(e.length-1))-1,s=-~(1.6*n*t/e.length);return(o=t)=>{let r="";for(;;){let f=i(s),a=s|0;for(;a--;)if(r+=e[f[a]&n]||"",r.length>=o)return r}}},re=(e,t=21)=>te(e,t|0,ee);const ne="0123456789",ie="abcdefghijklmnopqrstuvwxyz",se="ABCDEFGHIJKLMNOPQRSTUVWXYZ",fe=re(`${ne}${ie}${se}_`,12);function oe(e=12){return fe(e)}const{z:R}=await F("zod"),ae=/^[a-z0-9-]+$/,K=/^[A-Z][a-zA-Z0-9]*$/,ue=/^[a-z][a-zA-Z0-9]*$/,de=/^[A-Z][A-Z0-9_]*$/,ce={KEBAB_CASE:R.string().regex(ae,{message:'Must be kebab case (e.g. "my-project")'}),PASCAL_CASE:R.string().regex(K,{message:'Must be pascal case (e.g. "MyProject")'}),CAMEL_CASE:R.string().regex(ue,{message:'Must be camel case (e.g. "myProject")'}),CONSTANT_CASE:R.string().regex(de,{message:'Must be constant case (e.g. "MY_PROJECT")'})};function ft(e,t){return{spec:e,implementation:t}}function ot(e,t){const{platforms:i,defaultInitializer:n}=t??{};return{type:"plugin-spec",name:e,platforms:i&&(Array.isArray(i)?i:[i]),isOptional:!1,optional(){return{...this,isOptional:!0}},defaultInitializer:n}}class le{constructor(t,i,n){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"parentType",{enumerable:!0,configurable:!0,writable:!0,value:n}),Object.defineProperty(this,"prefix",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.prefix=i??t.split("/").pop()??t}generateNewId(){return`${this.prefix}:${oe()}`}idFromKey(t){if(t)return`${this.prefix}:${t}`}keyFromId(t){return t.split(":")[1]}isId(t){return t.startsWith(`${this.prefix}:`)}}function p(e,t){const{parentType:i,prefix:n}=t??{};return new le(e,n,i)}class pe{constructor(t,i){Object.defineProperty(this,"value",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"reference",{enumerable:!0,configurable:!0,writable:!0,value:i})}toString(){return this.value??""}}const m=Symbol("refAnnotationsMarker"),{z:ye}=await F("zod");function me({transformReferences:e}){function t(s){return ye.string().transform(o=>e&&o?new pe(o,s):o)}function i(s,o){if(!("id"in s.shape))throw new Error(`Entity must have an id field. Entity type: ${o.type.name}. Schema keys: ${Object.keys(s.shape).join(", ")}`);return s.transform(r=>{if(!("id"in r)||!o.type.isId(r.id))throw new Error(`Invalid id for entity ${o.type.name}. Id: ${r.id}`);if(e){const f=m in r?r[m]:void 0;return{...r,[m]:{entities:[...f?.entities??[],o],references:f?.references??[],contextPaths:f?.contextPaths??[]}}}return r})}function n(s,o){return s.transform(r=>{if(!r)return r;if(typeof r!="object")throw new TypeError(`refBuilder requires an object, but got ${typeof r}`);const f=m in r?r[m]:void 0,a=f?.entities??[],d=f?.references??[],u=f?.contextPaths??[];return o?.({addReference:l=>{d.push(l)},addEntity:l=>{a.push(l)},addPathToContext:(l,H,J)=>{u.push({path:l,type:H,context:J})}},r),e?{...r,[m]:{entities:a,references:d,contextPaths:u}}:r})}return{withRef:t,withEnt:i,withRefBuilder:n}}const{z:ge}=await F("zod");function he(e){return Array.isArray(e)?e.length===0:typeof e=="object"&&e!==null?Object.values(e).every(t=>t===void 0):e===!1||e===""}function we(e){const t=e.defaultMode??"populate";return{withDefault:function(n,s){const o=n.optional();switch(t){case"populate":return ge.preprocess(r=>r===void 0?s:r,o);case"strip":return o.transform(r=>{if(!he(r))return r});case"preserve":return o.transform(r=>r)}}}}function at(e){return{...e,...me(e),...we(e)}}function _(e){return t=>e(t)}function be(e){switch(typeof e){case"number":case"symbol":return!1;case"string":return e.includes(".")||e.includes("[")||e.includes("]")}}function Re(e){return Object.is(e,-0)?"-0":e.toString()}function z(e){const t=[],i=e.length;if(i===0)return t;let n=0,s="",o="",r=!1;for(e.charCodeAt(0)===46&&(t.push(""),n++);n<i;){const f=e[n];o?f==="\\"&&n+1<i?(n++,s+=e[n]):f===o?o="":s+=f:r?f==='"'||f==="'"?o=f:f==="]"?(r=!1,t.push(s),s=""):s+=f:f==="["?(r=!0,s&&(t.push(s),s="")):f==="."?s&&(t.push(s),s=""):s+=f,n++}return s&&t.push(s),t}function E(e,t,i){if(e==null)return i;switch(typeof t){case"string":{const n=e[t];return n===void 0?be(t)?E(e,z(t),i):i:n}case"number":case"symbol":{typeof t=="number"&&(t=Re(t));const n=e[t];return n===void 0?i:n}default:{if(Array.isArray(t))return Ae(e,t,i);Object.is(t?.valueOf(),-0)?t="-0":t=String(t);const n=e[t];return n===void 0?i:n}}}function Ae(e,t,i){if(t.length===0)return i;let n=e;for(let s=0;s<t.length;s++){if(n==null)return i;n=n[t[s]]}return n===void 0?i:n}function Ee(e){return e!==null&&(typeof e=="object"||typeof e=="function")}function h(e,t){if(t===e)return!0;switch(typeof t){case"object":{if(t==null)return!0;const i=Object.keys(t);if(e==null)return i.length===0;if(Array.isArray(t))return L(e,t);if(t instanceof Map)return Me(e,t);if(t instanceof Set)return Ie(e,t);for(let n=0;n<i.length;n++){const s=i[n];if(!$(e)&&!(s in e)||t[s]===void 0&&e[s]!==void 0||t[s]===null&&e[s]!==null||!h(e[s],t[s]))return!1}return!0}case"function":return Object.keys(t).length>0?h(e,{...t}):!1;default:return Ee(e)?!t:T(e,t)}}function Me(e,t){if(t.size===0)return!0;if(!(e instanceof Map))return!1;for(const[i,n]of t.entries())if(!h(e.get(i),n))return!1;return!0}function L(e,t){if(t.length===0)return!0;if(!Array.isArray(e))return!1;const i=new Set;for(let n=0;n<t.length;n++){const s=t[n],o=e.findIndex((r,f)=>h(r,s)&&!i.has(f));if(o===-1)return!1;i.add(o)}return!0}function Ie(e,t){return t.size===0?!0:e instanceof Set?L([...e],[...t]):!1}const Fe=/^(?:0|[1-9]\d*)$/;function Oe(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e<t;case"symbol":return!1;case"string":return Fe.test(e)}}function Se(e,t,i){const n=Array.isArray(t)?t:typeof t=="string"?z(t):[t];let s=e;for(let r=0;r<n.length-1;r++){const f=n[r],a=n[r+1];s[f]==null&&(s[f]=Oe(a)?[]:{}),s=s[f]}const o=n[n.length-1];return s[o]=i,e}const{z:A}=await F("zod"),M=p("feature"),k=ce.KEBAB_CASE,je=_(e=>e.withEnt(A.object({id:A.string(),name:A.string().min(1).refine(t=>t.split("/").every(i=>k.safeParse(i).success),{message:"Feature name must be lowercase and contain only letters, numbers, and dashes"}),parentRef:e.withRef({type:M,onDelete:"DELETE_PARENT"}).optional()}),{type:M})),ut=_(e=>A.array(je(e)).default([])),y=p("model"),xe=p("model-scalar-field",{parentType:y}),Pe=p("model-local-relation",{parentType:y}),De=p("model-foreign-relation",{parentType:y}),Ne=p("model-unique-constraint",{parentType:y}),dt=p("model-transformer",{parentType:y}),Be=p("model-enum"),ct=p("model-enum-value",{parentType:Be});function $e(e){return e.features.filter(t=>!t.parentRef)}function G(e,t){return e.features.find(i=>i.id===t)}function x(e,t){const i=G(e,t);if(!i)throw new Error(`Could not find feature with ID ${t}`);return i}function qe(e,t){return e.features.filter(i=>i.parentRef===t)}function U(e){return e.name.split("/").pop()??""}function Ke(e,t){const i=x(e,t);return U(i)}function _e(e,t){return x(e,t).name}function ze(e){return e.split("/").every(i=>k.safeParse(i).success)}function Le(e,t){if(M.isId(t))return t;const i=t.split("/");let n="",s;for(const o of i){const r=e.features.find(a=>a.name===o&&a.parentRef===s),f=[n,o].filter(Boolean).join("/");if(r)s=r.id;else{const a={id:M.generateNewId(),name:f,parentRef:s};e.features.push(a),s=a.id}n=f}if(!s)throw new Error("Failed to create feature");return s}function W(e,t){return e.features.find(i=>i.name===t)}function ke(e,t){return W(e,t)?.id??t}const lt={getRootFeatures:$e,getFeatureById:G,getFeatureByIdOrThrow:x,getFeatureChildren:qe,getFeatureName:U,getFeatureNameById:Ke,getFeaturePathById:_e,validateFeatureName:ze,ensureFeatureByNameRecursively:Le,getFeatureByName:W,getFeatureIdByNameOrDefault:ke};function X(e,t){return e.models.find(i=>i.id===t)}function Ge(e,t){const i=X(e,t);if(!i)throw new Error(`Could not find model with ID ${t}`);return i}function Ue(e,t){const i=e.model.fields.find(n=>n.id===t);if(!i)throw new Error(`Could not find field with ID ${t}`);return i}function We(e,t){return e.models.flatMap(i=>i.model.relations?.filter(n=>n.modelRef===t).map(n=>({model:i,relation:n}))??[])}function Xe(e,t){return e.models.filter(i=>i.featureRef===t)}function Ze(e){return e.model.primaryKeyFieldRefs}function Qe(e){return!!e.service.create.enabled||!!e.service.update.enabled||!!e.service.delete.enabled||e.service.transformers.length>0}function Ve(e){return K.test(e)}function He(e,t){return e.models.find(i=>i.name===t)?.id??t}const I={byId:X,byIdOrThrow:Ge,getScalarFieldById:Ue,getRelationsToModel:We,getModelsForFeature:Xe,getModelIdFields:Ze,hasService:Qe,validateModelName:Ve,getModelIdByNameOrDefault:He};class P{constructor(t){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:t})}}class O extends P{constructor(t,i,n={}){super(t),Object.defineProperty(this,"getKey",{enumerable:!0,configurable:!0,writable:!0,value:i}),Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:n}),this.getKey=i}diff(t,i){const n=t??[],s=i??[];if(!Array.isArray(n)||!Array.isArray(s))throw new TypeError("Current and desired must be arrays");const o=[],{allowRemove:r,ignoreFields:f=["id"]}=this.options,a=new Map(n.map(u=>[this.getKey(u),u])),d=new Map(s.map(u=>[this.getKey(u),u]));for(const[u,c]of d){const l=a.get(u);if(!l){o.push({type:"add",key:u,item:c});continue}h(N(l,f),N(c,f))||o.push({type:"update",key:u,item:c})}if(r)for(const[u,c]of a)d.has(u)||o.push({type:"remove",key:u,item:c});return o}apply(t,i){const n=i,s=t??[];if(!Array.isArray(s))throw new TypeError("Current must be array");const o=[...s];for(const{type:r,key:f,item:a}of n){const d=o.findIndex(u=>this.getKey(u)===f);switch(r){case"add":{o.push(a);break}case"update":{if(d===-1)throw new Error(`Cannot apply patch. Item with key "${f}" not found.`);o[d]=v(o[d],a);break}case"remove":{d!==-1&&o.splice(d,1);break}}}return o}getActionVerb(t){return t?"created":"added or updated"}}class B extends P{diff(t,i){return i===void 0?[]:h(t,i)?[]:[{type:"update",key:"*",item:i}]}apply(t,i){return i.length===0?t:i[0].item}getActionVerb(t){return t?"set":"replaced"}}class S extends P{constructor(t,i){super(t),Object.defineProperty(this,"getKey",{enumerable:!0,configurable:!0,writable:!0,value:i})}diff(t,i){const n=t??[],s=i??[];if(!Array.isArray(n)||!Array.isArray(s))throw new TypeError("Current and desired must be arrays");const o=[],r=new Set(this.getKey?n.map(this.getKey):n);for(const f of s){const a=this.getKey?this.getKey(f):String(f);r.has(a)||o.push({type:"add",key:a,item:f})}return o}apply(t,i){const n=t??[];if(!Array.isArray(n))throw new TypeError("Current must be array");const s=[...n];for(const{type:o,item:r}of i)o==="add"&&s.push(r);return s}getActionVerb(t){return t?"created":"added"}}function pt(e){return e}function Je(e,t,i){const n=j(i,(s,o)=>s?s.diff(E(e,o),E(t,o)):[]);if(!Object.values(n).every(s=>s.length===0))return n}function Ye(e,t,i){const n=q(e);for(const[s,o]of Object.entries(t)){if(!o)continue;const r=i[s],f=E(n,s);Se(n,s,r.apply(f,o))}return n}function Te(e){return e.fields.map(i=>i.fieldRef).sort().join("|")}const Z={"model.fields":new O("fields",e=>e.name),"model.relations":new O("relations",e=>e.name),"model.uniqueConstraints":new O("unique constraints",e=>Te(e)),"model.primaryKeyFieldRefs":new B("primary key fields"),"graphql.objectType.enabled":new B("GraphQL object type enabled"),"graphql.objectType.fields":new S("GraphQL object type fields"),"graphql.objectType.localRelations":new S("GraphQL object type local relations"),"graphql.objectType.foreignRelations":new S("GraphQL object type foreign relations")};function Q(e,t,i){const n=new Map([...e.model.fields.map(f=>[f.id,f.name]),...i.flatMap(f=>f.model.fields.map(a=>[a.id,a.name]))]),s=new Map([...(e.model.relations??[]).map(f=>[f.id,f.name]),...i.flatMap(f=>(f.model.relations??[]).map(a=>[a.id,a.name])),...(e.model.relations??[]).map(f=>[f.foreignId,f.foreignRelationName]),...i.flatMap(f=>(f.model.relations??[]).map(a=>[a.foreignId,a.foreignRelationName]))]),o=f=>n.get(f)??t.nameFromId(f),r=f=>s.get(f)??t.nameFromId(f);return{...e,model:{...e.model,relations:e.model.relations?.map(f=>({...f,references:f.references.map(a=>({...a,localRef:o(a.localRef),foreignRef:o(a.foreignRef)}))})),uniqueConstraints:e.model.uniqueConstraints?.map(f=>({...f,fields:f.fields.map(a=>({...a,fieldRef:o(a.fieldRef)}))})),primaryKeyFieldRefs:e.model.primaryKeyFieldRefs.map(o)},graphql:{...e.graphql,objectType:{...e.graphql?.objectType,fields:e.graphql?.objectType?.fields?.map(o)??[],localRelations:e.graphql?.objectType?.localRelations?.map(r)??[],foreignRelations:e.graphql?.objectType?.foreignRelations?.map(r)??[]}}}}function Ce(e){return{...e,model:{...e.model,fields:e.model.fields.map(t=>({...t,id:t.id??xe.generateNewId()})),relations:e.model.relations?.map(t=>({...t,id:t.id??Pe.generateNewId(),foreignId:t.foreignId??De.generateNewId()})),uniqueConstraints:e.model.uniqueConstraints?.map(t=>({...t,id:t.id??Ne.generateNewId()}))}}}function ve(e,t,i){const n=Ce(e),s=r=>{const f=n.model.fields.find(a=>a.name===r);if(!f)throw new Error(`Field ${r} not found`);return f.id},o=r=>{const f=n.model.relations?.find(a=>a.name===r);if(!f)throw new Error(`Relation ${r} not found`);return f.id};return{...n,model:{...n.model,relations:n.model.relations?.map(r=>({...r,references:r.references.map(f=>({...f,localRef:s(f.localRef),foreignRef:t(r.modelRef,f.foreignRef)}))})),uniqueConstraints:n.model.uniqueConstraints?.map(r=>({...r,fields:r.fields.map(f=>({...f,fieldRef:s(f.fieldRef)}))})),primaryKeyFieldRefs:n.model.primaryKeyFieldRefs.map(r=>s(r))},graphql:{...n.graphql,objectType:{...n.graphql?.objectType,fields:n.graphql?.objectType?.fields?.map(r=>s(r))??[],localRelations:n.graphql?.objectType?.localRelations?.map(r=>o(r))??[],foreignRelations:n.graphql?.objectType?.foreignRelations?.map(r=>i(r))??[]}}}}function V(e,t){return{id:y.generateNewId(),name:e,featureRef:t,model:{fields:[],primaryKeyFieldRefs:[]}}}function et(e,t,i,{siblingModels:n=[]}={}){const s=e??V(t.name,t.featureRef),o=Q(s,i,n),r=Je(o,t,Z);if(r)return{isNewModel:!e,id:s.id,name:s.name,featureRef:s.featureRef,changes:r}}function yt(e){return Object.values(e).some(t=>t?.changes)}function tt(e,t,i,{siblingModels:n=[]}={}){return j(t,(s,o)=>et(e[o]&&y.isId(e[o])?I.byIdOrThrow(i.definition,e[o]):void 0,s,i,{siblingModels:n}))}function rt(e,t,i,n=[]){const s=Q(e,i,n),o=Ye(s,t,Z);return{...e,...ve(o,(r,f)=>{const a=n.find(c=>c.id===r);if(a){const c=a.model.fields.find(l=>l.name===f);if(!c)throw new Error(`Field ${f} not found in sibling model ${r}`);return c.id}const d=I.byIdOrThrow(i.definition,r),u=d.model.fields.find(c=>c.name===f);if(!u)throw new Error(`Field ${f} not found in model ${d.name}`);return u.id},r=>{let f;for(const u of n){const c=u.model.relations?.find(l=>l.foreignRelationName===r);if(c){f=c.foreignId;break}}if(f)return f;const d=I.getRelationsToModel(i.definition,e.id).find(u=>u.relation.foreignRelationName===r&&u.relation.modelRef===e.id);if(!d)throw new Error(`Relation ${r} not found in model ${e.name}`);return d.relation.foreignId})}}function nt(e,t,i,{siblingModels:n=[]}={}){const s=t.isNewModel?V(t.name,t.featureRef):I.byIdOrThrow(i.definition,t.id),o=rt(s,t.changes,i,n);if(t.isNewModel)e.models.push(o);else{const r=e.models.findIndex(f=>f.id===t.id);if(r===-1)throw new Error(`Model ${t.id} not found`);e.models[r]=o}return o.id}function mt(e,t,i,n,{siblingModels:s=[]}={}){const o=tt(t,i,n,{siblingModels:s});return j(o,(r,f)=>r?nt(e,r,n,{siblingModels:s}):i[f].name)}export{tt as A,rt as B,ce as C,pe as D,nt as E,lt as F,mt as G,O as H,B as I,S as J,pt as K,Je as L,I as M,Ye as N,m as R,p as a,at as b,ot as c,_ as d,De as e,Pe as f,E as g,xe as h,dt as i,y as j,ct as k,M as l,j as m,Be as n,Ne as o,ut as p,N as q,q as r,Se as s,ft as t,le as u,k as v,je as w,Z as x,et as y,yt as z};
|
|
2
|
-
//# sourceMappingURL=model-merger-BoPVsTMR.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as r}from"./_virtual___federation_fn_import-CzwHXTRo.js";import{j as e}from"./index.esm-C6ngV5UE.js";import{k as n,L as s,O as a}from"./index-BMCloLL3.js";const{Alert:o,AlertDescription:l,AlertTitle:p,NavigationTabs:d,NavigationTabsItem:t}=await r("@baseplate-dev/ui-components"),x=function(){const{key:i}=n.useParams();return e.jsxs("div",{className:"p-4",children:[e.jsxs(o,{variant:"warning",className:"mb-4",children:[e.jsx(p,{children:"⚠️ Development Preview"}),e.jsx(l,{children:"The admin app functionality will likely be fully rewritten in future versions. This is provided for preview purposes only and should not be relied upon for production use."})]}),e.jsxs(d,{children:[e.jsx(t,{asChild:!0,children:e.jsx(s,{to:"/apps/edit/$key/admin",from:"/",params:{key:i},activeOptions:{exact:!0},children:"General"})}),e.jsx(t,{asChild:!0,children:e.jsx(s,{to:"/apps/edit/$key/admin/sections",params:{key:i},children:"Sections"})})]}),e.jsx("div",{className:"mt-4 border-t",children:e.jsx(a,{})})]})};export{x as component};
|
|
2
|
-
//# sourceMappingURL=route-VW3n5-PC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"route-VW3n5-PC.js","sources":["../../src/routes/apps/edit.$key/admin/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n NavigationTabs,\n NavigationTabsItem,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n Link,\n Outlet,\n redirect,\n} from '@tanstack/react-router';\n\nexport const Route = createFileRoute('/apps/edit/$key/admin')({\n component: AdminAppEditLayout,\n beforeLoad: ({ context: { app }, params: { key } }) => {\n if (app?.type !== 'admin') {\n throw redirect({ to: '/apps/edit/$key', params: { key } });\n }\n return {\n adminDefinition: app,\n };\n },\n});\n\nfunction AdminAppEditLayout(): React.JSX.Element {\n const { key } = Route.useParams();\n return (\n <div className=\"p-4\">\n <Alert variant=\"warning\" className=\"mb-4\">\n <AlertTitle>⚠️ Development Preview</AlertTitle>\n <AlertDescription>\n The admin app functionality will likely be fully rewritten in future\n versions. This is provided for preview purposes only and should not be\n relied upon for production use.\n </AlertDescription>\n </Alert>\n <NavigationTabs>\n <NavigationTabsItem asChild>\n <Link\n to=\"/apps/edit/$key/admin\"\n from=\"/\"\n params={{ key }}\n activeOptions={{ exact: true }}\n >\n General\n </Link>\n </NavigationTabsItem>\n <NavigationTabsItem asChild>\n <Link to=\"/apps/edit/$key/admin/sections\" params={{ key }}>\n Sections\n </Link>\n </NavigationTabsItem>\n </NavigationTabs>\n <div className=\"mt-4 border-t\">\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["Alert","AlertDescription","AlertTitle","NavigationTabs","NavigationTabsItem","importShared","SplitComponent","key","Route","useParams","jsxs","jsx","Link","exact","Outlet"],"mappings":"oKAEA,KAAA,CAAA,MAAAA,EAAA,iBAAAC,EAAA,WAAAC,EAAA,eAAAC,EAAA,mBAAAC,CAAA,EAAA,MAAAC,EAAA,8BAAA,EAYgCC,EAAA,UAciB,CACzC,KAAA,CAAEC,IAAAA,CAAAA,EAAQC,EAAMC,UAAU,EAE9B,OAAAC,EAAA,KAAC,MAAI,CAAA,UAAU,MACb,SAAA,CAAAA,EAAA,KAACV,EAAM,CAAA,QAAQ,UAAU,UAAU,OACjC,SAAA,CAAAW,EAAAA,IAACT,GAAW,SAAsB,wBAAA,CAAA,EAClCS,EAAAA,IAACV,GAAgB,SAIjB,6KAAA,CAAA,CAAA,EACF,SACCE,EACC,CAAA,SAAA,CAACQ,EAAAA,IAAAP,EAAA,CAAmB,QAAO,GACzB,SAAAO,EAAAA,IAACC,GACC,GAAG,wBACH,KAAK,IACL,OAAQ,CAAEL,IAAAA,GACV,cAAe,CAAEM,MAAO,EAAA,EAAO,kBAGjC,CAAA,EACF,EACAF,EAAAA,IAACP,GAAmB,QAAO,GACzB,eAACQ,EAAK,CAAA,GAAG,iCAAiC,OAAQ,CAAEL,IAAAA,CAAAA,EAAM,oBAE1D,CACF,CAAA,CAAA,EACF,QACC,MAAI,CAAA,UAAU,gBACb,SAAAI,EAAA,IAACG,IAAM,CACT,CAAA,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as o}from"./_virtual___federation_fn_import-CzwHXTRo.js";import{j as e}from"./index.esm-C6ngV5UE.js";import{y as s,L as n,O as m,r as l}from"./index-BMCloLL3.js";import{s as p}from"./immer-xieDw-3D.js";const{adminSectionEntityType:r}=await o("@baseplate-dev/project-builder-lib"),{NavigationMenu:y,NavigationMenuItemWithLink:a,NavigationMenuList:x,SidebarLayout:h,SidebarLayoutContent:u,SidebarLayoutSidebar:j}=await o("@baseplate-dev/ui-components");l(r,"/apps/edit/{parentKey}/sections/edit/{key}");const v=function(){const{adminDefinition:c}=s.useRouteContext(),{key:t}=s.useParams(),d=p(c.sections??[],[i=>i.name]);return e.jsxs(h,{children:[e.jsxs(j,{className:"space-y-4",width:"sm",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx("h2",{children:"Sections"})}),e.jsx(y,{orientation:"vertical",children:e.jsxs(x,{children:[e.jsx("li",{children:e.jsx(a,{asChild:!0,children:e.jsx(n,{to:"/apps/edit/$key/admin/sections/$sectionKey",from:"/",params:{key:t,sectionKey:"new"},className:"text-green-500",children:"New Section"})})}),d.map(i=>e.jsx("li",{children:e.jsx(a,{asChild:!0,children:e.jsx(n,{to:"/apps/edit/$key/admin/sections/$sectionKey",from:"/",params:{key:t,sectionKey:r.keyFromId(i.id)},children:i.name})})},i.id))]})})]}),e.jsx(u,{className:"p-4",children:e.jsx(m,{})})]})};export{v as component};
|
|
2
|
-
//# sourceMappingURL=sections-D48VzvlO.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sections-D48VzvlO.js","sources":["../../src/routes/apps/edit.$key/admin/sections.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { adminSectionEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n NavigationMenu,\n NavigationMenuItemWithLink,\n NavigationMenuList,\n SidebarLayout,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n} from '@baseplate-dev/ui-components';\nimport { createFileRoute, Link, Outlet } from '@tanstack/react-router';\nimport { sortBy } from 'es-toolkit';\n\nimport { registerEntityTypeUrl } from '#src/services/entity-type.js';\n\nregisterEntityTypeUrl(\n adminSectionEntityType,\n `/apps/edit/{parentKey}/sections/edit/{key}`,\n);\n\nexport const Route = createFileRoute('/apps/edit/$key/admin/sections')({\n component: AdminAppEditSectionsPage,\n});\n\nfunction AdminAppEditSectionsPage(): React.JSX.Element {\n const { adminDefinition } = Route.useRouteContext();\n const { key } = Route.useParams();\n const sortedSections = sortBy(adminDefinition.sections ?? [], [\n (section) => section.name,\n ]);\n\n return (\n <SidebarLayout>\n <SidebarLayoutSidebar className=\"space-y-4\" width=\"sm\">\n <div className=\"flex items-center justify-between\">\n <h2>Sections</h2>\n </div>\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n <li>\n <NavigationMenuItemWithLink asChild>\n <Link\n to=\"/apps/edit/$key/admin/sections/$sectionKey\"\n from=\"/\"\n params={{\n key,\n sectionKey: 'new',\n }}\n className=\"text-green-500\"\n >\n New Section\n </Link>\n </NavigationMenuItemWithLink>\n </li>\n {sortedSections.map((section) => (\n <li key={section.id}>\n <NavigationMenuItemWithLink asChild>\n <Link\n to=\"/apps/edit/$key/admin/sections/$sectionKey\"\n from=\"/\"\n params={{\n key,\n sectionKey: adminSectionEntityType.keyFromId(section.id),\n }}\n >\n {section.name}\n </Link>\n </NavigationMenuItemWithLink>\n </li>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </SidebarLayoutSidebar>\n <SidebarLayoutContent className=\"p-4\">\n <Outlet />\n </SidebarLayoutContent>\n </SidebarLayout>\n );\n}\n"],"names":["adminSectionEntityType","importShared","NavigationMenu","NavigationMenuItemWithLink","NavigationMenuList","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","registerEntityTypeUrl","SplitComponent","adminDefinition","Route","useRouteContext","key","useParams","sortedSections","sortBy","sections","section","name","jsxs","jsx","Link","sectionKey","map","keyFromId","id","Outlet"],"mappings":"mNAEA,KAAA,CAAA,uBAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EACA,CAAA,eAAAC,EAAA,2BAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,qBAAAC,CAAA,EAAA,MAAAN,EAAA,8BAAA,EAaAO,EACER,EACA,4CACF,EAAES,MAAAA,EAAA,UAMqD,CAC/C,KAAA,CAAEC,gBAAAA,CAAAA,EAAoBC,EAAMC,gBAAgB,EAC5C,CAAEC,IAAAA,CAAAA,EAAQF,EAAMG,UAAU,EAC1BC,EAAiBC,EAAON,EAAgBO,UAAY,GAAI,CAC3DC,GAAYA,EAAQC,IAAI,CAC1B,EAED,cACGd,EACC,CAAA,SAAA,CAAAe,EAAA,KAACb,EAAqB,CAAA,UAAU,YAAY,MAAM,KAChD,SAAA,CAAAc,EAAAA,IAAC,OAAI,UAAU,oCACb,SAACA,MAAA,KAAA,CAAG,oBAAQ,CACd,CAAA,EACCA,MAAAnB,EAAA,CAAe,YAAY,WAC1B,gBAACE,EACC,CAAA,SAAA,CAACiB,EAAA,IAAA,KAAA,CACC,SAACA,EAAA,IAAAlB,EAAA,CAA2B,QAAO,GACjC,SAACkB,EAAA,IAAAC,EAAA,CACC,GAAG,6CACH,KAAK,IACL,OAAQ,CACNT,IAAAA,EACAU,WAAY,KAAA,EAEd,UAAU,iBAAgB,SAAA,aAG5B,CAAA,CACF,CAAA,EACF,EACCR,EAAeS,IACdN,GAAAG,EAAAA,IAAC,MACC,SAACA,EAAA,IAAAlB,EAAA,CAA2B,QAAO,GACjC,eAACmB,EACC,CAAA,GAAG,6CACH,KAAK,IACL,OAAQ,CACNT,IAAAA,EACAU,WAAYvB,EAAuByB,UAAUP,EAAQQ,EAAE,CAAA,EAGxDR,SAAQC,EAAAA,IAAAA,CACX,EACF,CAZOD,EAAAA,EAAQQ,EAajB,CACD,CAAA,CAAA,CACH,CACF,CAAA,CAAA,EACF,QACCpB,EAAqB,CAAA,UAAU,MAC9B,SAAAe,EAAA,IAACM,IAAM,CACT,CAAA,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as r}from"./_virtual___federation_fn_import-CzwHXTRo.js";import{j as e,f as U,e as v,b as Q}from"./index.esm-C6ngV5UE.js";import{C as _,s as z,l as X,z as Z,A as N,c as ee}from"./index-BMCloLL3.js";import{c as E}from"./index-BxN9iLEr.js";import{s as ne}from"./immer-xieDw-3D.js";const{ModelUtils:oe}=await r("@baseplate-dev/project-builder-lib"),{createAdminCrudInputWebConfig:le,useProjectDefinition:te}=await r("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:A}=await r("@baseplate-dev/ui-components");function ie({formProps:t,name:o,model:i,embeddedFormOptions:d}){const{definition:a}=te(),l=oe.getRelationsToModel(a,i.id).map(c=>({label:`${c.relation.foreignRelationName} (${c.model.name})`,value:c.relation.foreignId})),n=o,s=t.control;return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Relation Name",control:s,name:`${n}.modelRelationRef`,options:l}),e.jsx(A,{label:"Embedded Form",control:s,name:`${n}.embeddedFormRef`,options:d})]})}const ae=le({name:"embedded",pluginId:void 0,label:"Embedded",getNewInput:()=>({label:"",type:"embedded",modelRelationRef:"",embeddedFormRef:""}),Form:ie}),{createAdminCrudInputWebConfig:se,useProjectDefinition:de}=await r("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:O}=await r("@baseplate-dev/ui-components");function re({formProps:t,name:o,model:i,embeddedFormOptions:d}){const{definitionContainer:a}=de(),l=i.model.relations?.map(c=>({label:`${c.name} (${a.nameFromId(c.modelRef)})`,value:c.id}))??[],n=o,s=t.control;return e.jsxs(e.Fragment,{children:[e.jsx(O,{label:"Relation Name",control:s,name:`${n}.localRelationRef`,options:l}),e.jsx(O,{label:"Embedded Form",control:s,name:`${n}.embeddedFormRef`,options:d})]})}const ce=se({name:"embeddedLocal",pluginId:void 0,label:"Embedded Local",getNewInput:()=>({label:"",type:"embeddedLocal",embeddedFormRef:"",localRelationRef:""}),Form:re}),{createAdminCrudInputWebConfig:me}=await r("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:pe}=await r("@baseplate-dev/ui-components");function ue({formProps:t,name:o,model:i}){const d=i.model.fields.filter(n=>n.type==="enum").map(n=>({label:n.name,value:n.id})),a=o,l=t.control;return e.jsx(pe,{label:"Enum Field",control:l,name:`${a}.modelFieldRef`,options:d})}const be=me({name:"enum",pluginId:void 0,label:"Enum",getNewInput:()=>({label:"",type:"enum",modelFieldRef:""}),Form:ue}),{createAdminCrudInputWebConfig:fe,useProjectDefinition:je}=await r("@baseplate-dev/project-builder-lib/web"),{InputFieldController:y,SelectFieldController:Ce}=await r("@baseplate-dev/ui-components");function xe({formProps:t,name:o,model:i}){const{definitionContainer:d}=je(),a=i.model.relations?.map(s=>({label:`${s.name} (${d.nameFromId(s.modelRef)})`,value:s.id}))??[],l=o,n=t.control;return e.jsxs(e.Fragment,{children:[e.jsx(Ce,{label:"Local Relation Name",control:n,name:`${l}.localRelationRef`,options:a}),e.jsx(y,{label:"Label Expression (e.g. name)",control:n,name:`${l}.labelExpression`}),e.jsx(y,{label:"Value Expression (e.g. id)",control:n,name:`${l}.valueExpression`}),e.jsx(y,{label:"Default Label (optional)",control:n,name:`${l}.defaultLabel`}),e.jsx(y,{label:"Empty Label (optional) - only if field is nullable",control:n,name:`${l}.nullLabel`})]})}const Fe=fe({name:"foreign",pluginId:void 0,label:"Foreign",getNewInput:()=>({label:"",type:"foreign",localRelationRef:"",labelExpression:"",valueExpression:"",defaultLabel:"",nullLabel:""}),Form:xe}),{createAdminCrudInputWebConfig:ve}=await r("@baseplate-dev/project-builder-lib/web"),{InputFieldController:ye,SelectFieldController:he}=await r("@baseplate-dev/ui-components");function Ie({formProps:t,name:o,model:i}){const d=i.model.fields.map(n=>({label:n.name,value:n.id})),a=o,l=t.control;return e.jsxs(e.Fragment,{children:[e.jsx(he,{label:"Field",control:l,name:`${a}.modelFieldRef`,options:d}),e.jsx(ye,{label:"Validation (zod), e.g. z.string().min(1) (optional)",control:l,name:`${a}.validation`})]})}const ge=ve({name:"text",pluginId:void 0,label:"Text",getNewInput:()=>({label:"",type:"text",modelFieldRef:""}),Form:Ie}),W=[ae,ce,be,Fe,ge],{ModelUtils:$e}=await r("@baseplate-dev/project-builder-lib"),{adminCrudInputWebSpec:we,useProjectDefinition:Re}=await r("@baseplate-dev/project-builder-lib/web"),{Button:Se,InputFieldController:Ee,SelectFieldController:Te}=await r("@baseplate-dev/ui-components");function De({idx:t,formProps:o,embeddedFormOptions:i}){const{control:d}=o,a=v({control:d,name:"modelRef"}),{definition:l,pluginContainer:n}=Re(),s=a?$e.byIdOrThrow(l,a):void 0,c=n.getPluginSpec(we),u=c.getInputWebConfigs(W).map(f=>({label:f.label,value:f.name})),b=v({control:d,name:`form.fields.${t}.type`}),m=c.getInputWebConfig(b,W),p=m.Form;return e.jsxs("div",{className:"space-y-4",children:[e.jsx(Te,{label:"Type",control:d,options:u,name:`form.fields.${t}.type`}),e.jsx(Ee,{label:"Label",control:d,name:`form.fields.${t}.label`}),p&&s&&e.jsx(p,{formProps:o,name:`form.fields.${t}`,model:s,embeddedFormOptions:i,pluginId:m.pluginId})]})}function V({className:t,formProps:o,embeddedFormOptions:i}){const{control:d}=o,{fields:a,append:l,remove:n}=U({control:d,name:"form.fields"});return e.jsxs("div",{className:E("space-y-4",t),children:[a.map((s,c)=>e.jsx(_,{collapsedContents:e.jsxs("div",{children:[s.label," (",s.type,")"]}),onRemove:()=>{n(c)},defaultOpen:!s.label,children:e.jsx(De,{idx:c,formProps:o,embeddedFormOptions:i},s.id)},s.id)),e.jsx(Se,{onClick:()=>{l({type:"text",label:""})},children:"Add Field"})]})}const{adminCrudDisplayTypes:Ne,ModelUtils:Ae}=await r("@baseplate-dev/project-builder-lib"),{useProjectDefinition:Oe}=await r("@baseplate-dev/project-builder-lib/web"),{Button:We,InputFieldController:w,SelectFieldController:R}=await r("@baseplate-dev/ui-components");function Le({idx:t,control:o,fieldOptions:i,localRelationOptions:d}){const a=Ne.map(n=>({label:n,value:n})),l=v({control:o,name:`table.columns.${t}.display.type`});return e.jsxs("div",{className:"space-y-4",children:[e.jsx(R,{label:"Type",control:o,options:a,name:`table.columns.${t}.display.type`}),e.jsx(w,{label:"Label",control:o,name:`table.columns.${t}.label`}),l==="text"&&e.jsx(R,{label:"Field",control:o,name:`table.columns.${t}.display.modelFieldRef`,options:i}),l==="foreign"&&e.jsxs(e.Fragment,{children:[e.jsx(R,{label:"Local Relation Name",control:o,name:`table.columns.${t}.display.localRelationRef`,options:d}),e.jsx(w,{label:"Label Expression (e.g. name)",control:o,name:`table.columns.${t}.display.labelExpression`}),e.jsx(w,{label:"Value Expression (e.g. id)",control:o,name:`table.columns.${t}.display.valueExpression`})]})]})}function H({className:t,control:o}){const i=v({control:o,name:"modelRef"}),{definition:d,definitionContainer:a}=Oe(),l=i?Ae.byIdOrThrow(d,i):void 0,{fields:n,append:s,remove:c}=U({control:o,name:"table.columns"}),u=l?.model.relations?.map(m=>({label:`${m.name} (${a.nameFromId(m.modelRef)})`,value:m.id}))??[],b=l?.model.fields.map(m=>({label:m.name,value:m.id}))??[];return e.jsxs("div",{className:E("space-y-4",t),children:[n.map((m,p)=>e.jsx(_,{collapsedContents:e.jsxs("div",{children:[m.label," (",m.display.type,")"]}),onRemove:()=>{c(p)},defaultOpen:!m.label,children:e.jsx(Le,{idx:p,control:o,fieldOptions:b,localRelationOptions:u},m.id)},m.id)),e.jsx(We,{onClick:()=>{s({display:{type:"text",modelFieldRef:""},label:""})},children:"Add Column"})]})}const{createAdminCrudEmbeddedFormSchema:Pe}=await r("@baseplate-dev/project-builder-lib"),{useDefinitionSchema:ke,useProjectDefinition:K}=await r("@baseplate-dev/project-builder-lib/web"),{Button:S,CheckboxFieldController:Be,InputFieldController:Me,SelectFieldController:L,Table:Ue,TableBody:_e,TableCell:h,TableHead:I,TableHeader:ze,TableRow:P,toast:Ve}=await r("@baseplate-dev/ui-components"),{useId:He}=await r("react");function Ke({items:t,edit:o,remove:i}){const{definitionContainer:d}=K();return e.jsxs(Ue,{className:"max-w-6xl",children:[e.jsx(ze,{children:e.jsxs(P,{children:[e.jsx(I,{children:"Form Name"}),e.jsx(I,{children:"Model Name"}),e.jsx(I,{children:"Type"}),e.jsx(I,{children:"Actions"})]})}),e.jsx(_e,{children:t.map((a,l)=>e.jsxs(P,{children:[e.jsx(h,{children:a.name}),e.jsx(h,{children:d.nameFromId(a.modelRef)}),e.jsx(h,{children:a.type}),e.jsxs(h,{className:"space-x-4",children:[e.jsx(S,{variant:"link",size:"none",onClick:()=>{o(l)},children:"Edit"}),e.jsx(S,{variant:"linkDestructive",size:"none",onClick:()=>{i(l)},children:"Remove"})]})]},a.id))})]})}const qe=[{label:"Object",value:"object"},{label:"List",value:"list"}];function Ge({initialData:t,onSubmit:o,embeddedFormOptions:i}){const{definition:d}=K(),a=ke(Pe),l=Q({resolver:z(a),defaultValues:t}),{handleSubmit:n,control:s,watch:c}=l,u=d.models.map(p=>({label:p.name,value:p.id})),b=c("type"),m=He();return e.jsxs("form",{onSubmit:p=>{p.stopPropagation(),n(o)(p).catch(f=>{Ve.error(X(f))})},id:m,className:"space-y-4",children:[e.jsx(Me,{label:"Name",control:s,name:"name"}),e.jsx(L,{label:"Type",control:s,name:"type",options:qe}),e.jsx(Be,{label:"Include ID Field? (useful for list types)",control:s,name:"includeIdField"}),e.jsx(L,{label:"Model",control:s,options:u,name:"modelRef"}),b==="list"&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:"Table"}),e.jsx(H,{control:s})]}),e.jsx("h2",{children:"Form"}),e.jsx(V,{formProps:l,embeddedFormOptions:i}),e.jsx(S,{type:"submit",form:m,children:"Save"})]})}const{useProjectDefinition:Ye}=await r("@baseplate-dev/project-builder-lib/web"),{CheckboxFieldController:Je,SelectFieldController:Qe}=await r("@baseplate-dev/ui-components");function Xe({className:t,formProps:o}){const{control:i}=o,{definition:d}=Ye(),a=d.models.map(n=>({label:n.name,value:n.id})),l=v({control:i,name:"embeddedForms"})?.map(n=>({label:n.name,value:n.id}))??[];return e.jsxs("div",{className:E("space-y-4",t),children:[e.jsx(Qe,{label:"Model",control:i,options:a,name:"modelRef"}),e.jsx(Je,{label:"Disable Create?",control:i,name:"disableCreate"}),e.jsx("h2",{children:"Table"}),e.jsx(H,{control:i}),e.jsx("h2",{children:"Form"}),e.jsx(V,{formProps:o,embeddedFormOptions:l}),e.jsx("h2",{children:"Embedded Forms"}),e.jsx(Z.LabelledController,{control:i,name:"embeddedForms",renderForm:n=>e.jsx(Ge,{...n,embeddedFormOptions:l}),renderTable:n=>e.jsx(Ke,{...n}),defaultValue:{type:"object"}})]})}const{adminSectionEntityType:k,createAdminSectionSchema:Ze}=await r("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:en,useDefinitionSchema:nn,useProjectDefinition:on,useResettableForm:ln}=await r("@baseplate-dev/project-builder-lib/web"),{Button:B,ComboboxFieldController:tn,InputFieldController:M,SelectFieldController:an,useConfirmDialog:sn}=await r("@baseplate-dev/ui-components"),{useEffect:dn}=await r("react"),rn=[{label:"Crud",value:"crud"}],fn=function(){const{requestConfirm:o}=sn(),{key:i}=N.useParams(),{saveDefinitionWithFeedback:d,saveDefinitionWithFeedbackSync:a,isSavingDefinition:l,definition:n}=on(),s=ee(),{adminDefinition:c,sectionId:u,existingSection:b}=N.useLoaderData(),m=nn(Ze),p=ln({values:b,defaultValues:{type:"crud"},resolver:z(m)}),{control:f,handleSubmit:q,watch:G,reset:g}=p;dn(()=>{g(b??{type:"crud"})},[g,b]);const T=q(j=>{const C=j.id||k.generateNewId();return d(x=>{const $=x.apps.find(F=>F.id===c.id);if($?.type!=="admin")throw new Error("Cannot add a section to a non-admin app");$.sections=ne([...($.sections??[]).filter(F=>!u||F.id!==u),{...j,id:C}],[F=>F.name])},{onSuccess:()=>{u||s({to:"/apps/edit/$key/admin/sections/$sectionKey",params:{key:i,sectionKey:k.keyFromId(C)}})}})});en({control:f,reset:g,onSubmit:T});const D=G("type");function Y(){o({title:"Delete Section",content:`Are you sure you want to delete ${b?.name??"this section"}?`,onConfirm:()=>{a(j=>{const C=j.apps.find(x=>x.id===c.id);if(C?.type!=="admin")throw new Error("Cannot add a section to a non-admin app");C.sections=(C.sections??[]).filter(x=>!u||x.id!==u)},{successMessage:"Successfully deleted section!",onSuccess:()=>{s({to:".."})}})}})}const J=n.features.map(j=>({label:j.name,value:j.id}));return e.jsx("div",{className:"p-4",children:e.jsxs("form",{onSubmit:T,className:"space-y-4",children:[u&&e.jsx(B,{variant:"link",size:"none",onClick:()=>{Y()},children:"Delete Section"}),e.jsx(M,{label:"Name",control:f,name:"name"}),e.jsx(tn,{label:"Feature",control:f,options:J,name:"featureRef"}),e.jsx(M,{label:"Icon",control:f,name:"icon"}),e.jsx(an,{label:"Type",control:f,name:"type",options:rn}),(()=>{switch(D){case"crud":return e.jsx(Xe,{formProps:p});default:return e.jsxs("div",{children:["Unsupported type ",D]})}})(),e.jsx(B,{type:"submit",disabled:l,children:"Save"})]})})};export{fn as component};
|
|
2
|
-
//# sourceMappingURL=sections._sectionKey-Cojmxr6C.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sections._sectionKey-Cojmxr6C.js","sources":["../../src/routes/apps/edit.$key/admin/-components/inputs/embedded-input-config.tsx","../../src/routes/apps/edit.$key/admin/-components/inputs/embedded-local-input-config.tsx","../../src/routes/apps/edit.$key/admin/-components/inputs/enum-input-config.tsx","../../src/routes/apps/edit.$key/admin/-components/inputs/foreign-input-config.tsx","../../src/routes/apps/edit.$key/admin/-components/inputs/text-input-config.tsx","../../src/routes/apps/edit.$key/admin/-components/inputs/index.ts","../../src/routes/apps/edit.$key/admin/-components/crud-form-fields-form.tsx","../../src/routes/apps/edit.$key/admin/-components/crud-table-columns-form.tsx","../../src/routes/apps/edit.$key/admin/-components/admin-crud-embedded-form.tsx","../../src/routes/apps/edit.$key/admin/-components/admin-crud-section-form.tsx","../../src/routes/apps/edit.$key/admin/sections.$sectionKey.tsx?tsr-split=component"],"sourcesContent":["import type { AdminCrudEmbeddedInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { ModelUtils } from '@baseplate-dev/project-builder-lib';\nimport {\n createAdminCrudInputWebConfig,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport { SelectFieldController } from '@baseplate-dev/ui-components';\n\nfunction AdminCrudEmbeddedInputForm({\n formProps,\n name,\n model,\n embeddedFormOptions,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const { definition } = useProjectDefinition();\n\n const foreignRelationOptions = ModelUtils.getRelationsToModel(\n definition,\n model.id,\n ).map((r) => ({\n label: `${r.relation.foreignRelationName} (${r.model.name})`,\n value: r.relation.foreignId,\n }));\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudEmbeddedInputConfig;\n }>;\n\n return (\n <>\n <SelectFieldController\n label=\"Relation Name\"\n control={controlTyped}\n name={`${prefix}.modelRelationRef`}\n options={foreignRelationOptions}\n />\n <SelectFieldController\n label=\"Embedded Form\"\n control={controlTyped}\n name={`${prefix}.embeddedFormRef`}\n options={embeddedFormOptions}\n />\n </>\n );\n}\n\nexport const adminCrudEmbeddedInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudEmbeddedInputConfig>({\n name: 'embedded',\n pluginId: undefined,\n label: 'Embedded',\n getNewInput: () => ({\n label: '',\n type: 'embedded',\n modelRelationRef: '',\n embeddedFormRef: '',\n }),\n Form: AdminCrudEmbeddedInputForm,\n });\n","import type { AdminCrudEmbeddedLocalInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n createAdminCrudInputWebConfig,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport { SelectFieldController } from '@baseplate-dev/ui-components';\n\nfunction AdminCrudEmbeddedLocalInputForm({\n formProps,\n name,\n model,\n embeddedFormOptions,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const { definitionContainer } = useProjectDefinition();\n const localRelationOptions =\n model.model.relations?.map((relation) => ({\n label: `${relation.name} (${definitionContainer.nameFromId(relation.modelRef)})`,\n value: relation.id,\n })) ?? [];\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudEmbeddedLocalInputConfig;\n }>;\n\n return (\n <>\n <SelectFieldController\n label=\"Relation Name\"\n control={controlTyped}\n name={`${prefix}.localRelationRef`}\n options={localRelationOptions}\n />\n <SelectFieldController\n label=\"Embedded Form\"\n control={controlTyped}\n name={`${prefix}.embeddedFormRef`}\n options={embeddedFormOptions}\n />\n </>\n );\n}\n\nexport const adminCrudEmbeddedLocalInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudEmbeddedLocalInputConfig>({\n name: 'embeddedLocal',\n pluginId: undefined,\n label: 'Embedded Local',\n getNewInput: () => ({\n label: '',\n type: 'embeddedLocal',\n embeddedFormRef: '',\n localRelationRef: '',\n }),\n Form: AdminCrudEmbeddedLocalInputForm,\n });\n","import type { AdminCrudEnumInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { createAdminCrudInputWebConfig } from '@baseplate-dev/project-builder-lib/web';\nimport { SelectFieldController } from '@baseplate-dev/ui-components';\n\nfunction AdminCrudEnumInputForm({\n formProps,\n name,\n model,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const enumFieldOptions = model.model.fields\n .filter((f) => f.type === 'enum')\n .map((field) => ({\n label: field.name,\n value: field.id,\n }));\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudEnumInputConfig;\n }>;\n\n return (\n <SelectFieldController\n label=\"Enum Field\"\n control={controlTyped}\n name={`${prefix}.modelFieldRef`}\n options={enumFieldOptions}\n />\n );\n}\n\nexport const adminCrudEnumInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudEnumInputConfig>({\n name: 'enum',\n pluginId: undefined,\n label: 'Enum',\n getNewInput: () => ({ label: '', type: 'enum', modelFieldRef: '' }),\n Form: AdminCrudEnumInputForm,\n });\n","import type { AdminCrudForeignInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n createAdminCrudInputWebConfig,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\n\nfunction AdminCrudForeignInputForm({\n formProps,\n name,\n model,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const { definitionContainer } = useProjectDefinition();\n const localRelationOptions =\n model.model.relations?.map((relation) => ({\n label: `${relation.name} (${definitionContainer.nameFromId(relation.modelRef)})`,\n value: relation.id,\n })) ?? [];\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudForeignInputConfig;\n }>;\n\n return (\n <>\n <SelectFieldController\n label=\"Local Relation Name\"\n control={controlTyped}\n name={`${prefix}.localRelationRef`}\n options={localRelationOptions}\n />\n <InputFieldController\n label=\"Label Expression (e.g. name)\"\n control={controlTyped}\n name={`${prefix}.labelExpression`}\n />\n <InputFieldController\n label=\"Value Expression (e.g. id)\"\n control={controlTyped}\n name={`${prefix}.valueExpression`}\n />\n <InputFieldController\n label=\"Default Label (optional)\"\n control={controlTyped}\n name={`${prefix}.defaultLabel`}\n />\n <InputFieldController\n label=\"Empty Label (optional) - only if field is nullable\"\n control={controlTyped}\n name={`${prefix}.nullLabel`}\n />\n </>\n );\n}\n\nexport const adminCrudForeignInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudForeignInputConfig>({\n name: 'foreign',\n pluginId: undefined,\n label: 'Foreign',\n getNewInput: () => ({\n label: '',\n type: 'foreign',\n localRelationRef: '',\n labelExpression: '',\n valueExpression: '',\n defaultLabel: '',\n nullLabel: '',\n }),\n Form: AdminCrudForeignInputForm,\n });\n","import type { AdminCrudTextInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { createAdminCrudInputWebConfig } from '@baseplate-dev/project-builder-lib/web';\nimport {\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\n\nfunction AdminCrudTextInputForm({\n formProps,\n name,\n model,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const fieldOptions = model.model.fields.map((field) => ({\n label: field.name,\n value: field.id,\n }));\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudTextInputConfig;\n }>;\n\n return (\n <>\n <SelectFieldController\n label=\"Field\"\n control={controlTyped}\n name={`${prefix}.modelFieldRef`}\n options={fieldOptions}\n />\n <InputFieldController\n label=\"Validation (zod), e.g. z.string().min(1) (optional)\"\n control={controlTyped}\n name={`${prefix}.validation`}\n />\n </>\n );\n}\n\nexport const adminCrudTextInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudTextInputConfig>({\n name: 'text',\n pluginId: undefined,\n label: 'Text',\n getNewInput: () => ({ label: '', type: 'text', modelFieldRef: '' }),\n Form: AdminCrudTextInputForm,\n });\n","import { adminCrudEmbeddedInputWebConfig } from './embedded-input-config.js';\nimport { adminCrudEmbeddedLocalInputWebConfig } from './embedded-local-input-config.js';\nimport { adminCrudEnumInputWebConfig } from './enum-input-config.js';\nimport { adminCrudForeignInputWebConfig } from './foreign-input-config.js';\nimport { adminCrudTextInputWebConfig } from './text-input-config.js';\n\nexport const BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS = [\n adminCrudEmbeddedInputWebConfig,\n adminCrudEmbeddedLocalInputWebConfig,\n adminCrudEnumInputWebConfig,\n adminCrudForeignInputWebConfig,\n adminCrudTextInputWebConfig,\n];\n","import type { AdminCrudSectionConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\n\nimport { ModelUtils } from '@baseplate-dev/project-builder-lib';\nimport {\n adminCrudInputWebSpec,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useFieldArray, useWatch } from 'react-hook-form';\n\nimport { CollapsibleRow } from '#src/components/index.js';\n\nimport { BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS } from './inputs/index.js';\n\nexport type AdminCrudFormConfigInput = Pick<\n AdminCrudSectionConfigInput,\n 'form' | 'modelRef'\n>;\n\ninterface Props {\n className?: string;\n formProps: UseFormReturn<AdminCrudFormConfigInput>;\n embeddedFormOptions: { label: string; value: string }[];\n}\n\nfunction FieldForm({\n idx,\n formProps,\n embeddedFormOptions,\n}: {\n idx: number;\n formProps: UseFormReturn<AdminCrudFormConfigInput>;\n embeddedFormOptions: { label: string; value: string }[];\n}): React.JSX.Element {\n const { control } = formProps;\n const modelRef = useWatch({ control, name: 'modelRef' });\n const { definition, pluginContainer } = useProjectDefinition();\n const model = modelRef\n ? ModelUtils.byIdOrThrow(definition, modelRef)\n : undefined;\n\n const inputWeb = pluginContainer.getPluginSpec(adminCrudInputWebSpec);\n\n const fieldTypeOptions = inputWeb\n .getInputWebConfigs(BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS)\n .map((config) => ({\n label: config.label,\n value: config.name,\n }));\n\n const type = useWatch({\n control,\n name: `form.fields.${idx}.type`,\n });\n const inputWebConfig = inputWeb.getInputWebConfig(\n type,\n BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS,\n );\n const WebForm = inputWebConfig.Form;\n\n return (\n <div className=\"space-y-4\">\n <SelectFieldController\n label=\"Type\"\n control={control}\n options={fieldTypeOptions}\n name={`form.fields.${idx}.type`}\n />\n <InputFieldController\n label=\"Label\"\n control={control}\n name={`form.fields.${idx}.label`}\n />\n {WebForm && model && (\n <WebForm\n formProps={formProps}\n name={`form.fields.${idx}`}\n model={model}\n embeddedFormOptions={embeddedFormOptions}\n pluginId={inputWebConfig.pluginId}\n />\n )}\n </div>\n );\n}\n\nfunction CrudFormFieldsForm({\n className,\n formProps,\n embeddedFormOptions,\n}: Props): React.JSX.Element {\n const { control } = formProps;\n const { fields, append, remove } = useFieldArray({\n control,\n name: 'form.fields',\n });\n\n return (\n <div className={clsx('space-y-4', className)}>\n {fields.map((field, idx) => (\n <CollapsibleRow\n key={field.id}\n collapsedContents={\n <div>\n {field.label} ({field.type})\n </div>\n }\n onRemove={() => {\n remove(idx);\n }}\n defaultOpen={!field.label}\n >\n <FieldForm\n key={field.id}\n idx={idx}\n formProps={formProps}\n embeddedFormOptions={embeddedFormOptions}\n />\n </CollapsibleRow>\n ))}\n <Button\n onClick={() => {\n append({ type: 'text', label: '' });\n }}\n >\n Add Field\n </Button>\n </div>\n );\n}\n\nexport default CrudFormFieldsForm;\n","import type { AdminCrudSectionConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n adminCrudDisplayTypes,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useFieldArray, useWatch } from 'react-hook-form';\n\nimport { CollapsibleRow } from '#src/components/index.js';\n\nexport type AdminCrudTableConfig = Pick<\n AdminCrudSectionConfig,\n 'table' | 'modelRef'\n>;\n\ninterface Props {\n className?: string;\n control: Control<AdminCrudTableConfig>;\n}\n\nfunction ColumnForm({\n idx,\n control,\n fieldOptions,\n localRelationOptions,\n}: {\n idx: number;\n control: Control<AdminCrudTableConfig>;\n fieldOptions: { label: string; value: string }[];\n localRelationOptions: { label: string; value: string }[];\n}): React.JSX.Element {\n const displayTypeOptions = adminCrudDisplayTypes.map((t) => ({\n label: t,\n value: t,\n }));\n const type = useWatch({ control, name: `table.columns.${idx}.display.type` });\n return (\n <div className=\"space-y-4\">\n <SelectFieldController\n label=\"Type\"\n control={control}\n options={displayTypeOptions}\n name={`table.columns.${idx}.display.type`}\n />\n <InputFieldController\n label=\"Label\"\n control={control}\n name={`table.columns.${idx}.label`}\n />\n\n {type === 'text' && (\n <SelectFieldController\n label=\"Field\"\n control={control}\n name={`table.columns.${idx}.display.modelFieldRef`}\n options={fieldOptions}\n />\n )}\n {type === 'foreign' && (\n <>\n <SelectFieldController\n label=\"Local Relation Name\"\n control={control}\n name={`table.columns.${idx}.display.localRelationRef`}\n options={localRelationOptions}\n />\n <InputFieldController\n label=\"Label Expression (e.g. name)\"\n control={control}\n name={`table.columns.${idx}.display.labelExpression`}\n />\n <InputFieldController\n label=\"Value Expression (e.g. id)\"\n control={control}\n name={`table.columns.${idx}.display.valueExpression`}\n />\n </>\n )}\n </div>\n );\n}\n\nfunction CrudTableColumnsForm({\n className,\n control,\n}: Props): React.JSX.Element {\n const modelRef = useWatch({ control, name: 'modelRef' });\n const { definition, definitionContainer } = useProjectDefinition();\n const model = modelRef\n ? ModelUtils.byIdOrThrow(definition, modelRef)\n : undefined;\n const { fields, append, remove } = useFieldArray({\n control,\n name: 'table.columns',\n });\n\n const localRelationOptions =\n model?.model.relations?.map((relation) => ({\n label: `${relation.name} (${definitionContainer.nameFromId(relation.modelRef)})`,\n value: relation.id,\n })) ?? [];\n\n const fieldOptions =\n model?.model.fields.map((field) => ({\n label: field.name,\n value: field.id,\n })) ?? [];\n\n return (\n <div className={clsx('space-y-4', className)}>\n {fields.map((field, idx) => (\n <CollapsibleRow\n key={field.id}\n collapsedContents={\n <div>\n {field.label} ({field.display.type})\n </div>\n }\n onRemove={() => {\n remove(idx);\n }}\n defaultOpen={!field.label}\n >\n <ColumnForm\n key={field.id}\n idx={idx}\n control={control}\n fieldOptions={fieldOptions}\n localRelationOptions={localRelationOptions}\n />\n </CollapsibleRow>\n ))}\n <Button\n onClick={() => {\n append({ display: { type: 'text', modelFieldRef: '' }, label: '' });\n }}\n >\n Add Column\n </Button>\n </div>\n );\n}\n\nexport default CrudTableColumnsForm;\n","import type { AdminCrudEmbeddedFormConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormReturn } from 'react-hook-form';\n\nimport { createAdminCrudEmbeddedFormSchema } from '@baseplate-dev/project-builder-lib';\nimport {\n useDefinitionSchema,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n CheckboxFieldController,\n InputFieldController,\n SelectFieldController,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n toast,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useId } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport type {\n EmbeddedListFormProps,\n EmbeddedListTableProps,\n} from '#src/components/index.js';\n\nimport { logAndFormatError } from '#src/services/error-formatter.js';\n\nimport type { AdminCrudFormConfigInput } from './crud-form-fields-form.js';\nimport type { AdminCrudTableConfig } from './crud-table-columns-form.js';\n\nimport CrudFormFieldsForm from './crud-form-fields-form.js';\nimport CrudTableColumnsForm from './crud-table-columns-form.js';\n\nexport function AdminCrudEmbeddedTable({\n items,\n edit,\n remove,\n}: EmbeddedListTableProps<AdminCrudEmbeddedFormConfigInput>): React.JSX.Element {\n const { definitionContainer } = useProjectDefinition();\n return (\n <Table className=\"max-w-6xl\">\n <TableHeader>\n <TableRow>\n <TableHead>Form Name</TableHead>\n <TableHead>Model Name</TableHead>\n <TableHead>Type</TableHead>\n <TableHead>Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map((item, idx) => (\n <TableRow key={item.id}>\n <TableCell>{item.name}</TableCell>\n <TableCell>\n {definitionContainer.nameFromId(item.modelRef)}\n </TableCell>\n <TableCell>{item.type}</TableCell>\n <TableCell className=\"space-x-4\">\n <Button\n variant=\"link\"\n size=\"none\"\n onClick={() => {\n edit(idx);\n }}\n >\n Edit\n </Button>\n <Button\n variant=\"linkDestructive\"\n size=\"none\"\n onClick={() => {\n remove(idx);\n }}\n >\n Remove\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n\nconst TYPE_OPTIONS = [\n { label: 'Object', value: 'object' },\n { label: 'List', value: 'list' },\n];\n\ninterface Props\n extends EmbeddedListFormProps<AdminCrudEmbeddedFormConfigInput> {\n embeddedFormOptions: { label: string; value: string }[];\n}\n\nfunction AdminCrudEmbeddedForm({\n initialData,\n onSubmit,\n embeddedFormOptions,\n}: Props): React.JSX.Element {\n const { definition } = useProjectDefinition();\n const adminCrudEmbeddedFormSchema = useDefinitionSchema(\n createAdminCrudEmbeddedFormSchema,\n );\n const formProps = useForm<AdminCrudEmbeddedFormConfigInput>({\n resolver: zodResolver(adminCrudEmbeddedFormSchema),\n defaultValues: initialData,\n });\n const { handleSubmit, control, watch } = formProps;\n\n const modelOptions = definition.models.map((model) => ({\n label: model.name,\n value: model.id,\n }));\n\n const type = watch('type');\n\n const formId = useId();\n\n return (\n <form\n onSubmit={(e) => {\n e.stopPropagation();\n handleSubmit(onSubmit)(e).catch((error: unknown) => {\n toast.error(logAndFormatError(error));\n });\n }}\n id={formId}\n className=\"space-y-4\"\n >\n <InputFieldController label=\"Name\" control={control} name=\"name\" />\n <SelectFieldController\n label=\"Type\"\n control={control}\n name=\"type\"\n options={TYPE_OPTIONS}\n />\n <CheckboxFieldController\n label=\"Include ID Field? (useful for list types)\"\n control={control}\n name=\"includeIdField\"\n />\n <SelectFieldController\n label=\"Model\"\n control={control}\n options={modelOptions}\n name=\"modelRef\"\n />\n {type === 'list' && (\n <>\n <h2>Table</h2>\n <CrudTableColumnsForm\n control={control as unknown as Control<AdminCrudTableConfig>}\n />\n </>\n )}\n <h2>Form</h2>\n <CrudFormFieldsForm\n formProps={\n formProps as unknown as UseFormReturn<AdminCrudFormConfigInput>\n }\n embeddedFormOptions={embeddedFormOptions}\n />\n <Button type=\"submit\" form={formId}>\n Save\n </Button>\n </form>\n );\n}\n\nexport default AdminCrudEmbeddedForm;\n","import type { AdminCrudSectionConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormReturn } from 'react-hook-form';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n CheckboxFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useWatch } from 'react-hook-form';\n\nimport { EmbeddedListInput } from '#src/components/index.js';\n\nimport type { AdminCrudFormConfigInput } from './crud-form-fields-form.js';\nimport type { AdminCrudTableConfig } from './crud-table-columns-form.js';\n\nimport AdminCrudEmbeddedForm, {\n AdminCrudEmbeddedTable,\n} from './admin-crud-embedded-form.js';\nimport CrudFormFieldsForm from './crud-form-fields-form.js';\nimport CrudTableColumnsForm from './crud-table-columns-form.js';\n\ninterface Props {\n className?: string;\n formProps: UseFormReturn<AdminCrudSectionConfigInput>;\n}\n\nfunction AdminCrudSectionForm({\n className,\n formProps,\n}: Props): React.JSX.Element {\n const { control } = formProps;\n const { definition } = useProjectDefinition();\n\n const modelOptions = definition.models.map((model) => ({\n label: model.name,\n value: model.id,\n }));\n\n // TODO: struggles with https://github.com/react-hook-form/react-hook-form/discussions/7354\n\n const embeddedFormOptions =\n useWatch({\n control,\n name: 'embeddedForms',\n })?.map((form) => ({\n label: form.name,\n value: form.id,\n })) ?? [];\n\n // TODO: Update embedded form names when form is added/removed\n\n return (\n <div className={clsx('space-y-4', className)}>\n <SelectFieldController\n label=\"Model\"\n control={control}\n options={modelOptions}\n name=\"modelRef\"\n />\n <CheckboxFieldController\n label=\"Disable Create?\"\n control={control}\n name=\"disableCreate\"\n />\n <h2>Table</h2>\n <CrudTableColumnsForm\n control={control as unknown as Control<AdminCrudTableConfig>}\n />\n <h2>Form</h2>\n <CrudFormFieldsForm\n formProps={\n formProps as unknown as UseFormReturn<AdminCrudFormConfigInput>\n }\n embeddedFormOptions={embeddedFormOptions}\n />\n <h2>Embedded Forms</h2>\n <EmbeddedListInput.LabelledController\n control={control}\n name=\"embeddedForms\"\n renderForm={(formProps) => (\n <AdminCrudEmbeddedForm\n {...formProps}\n embeddedFormOptions={embeddedFormOptions}\n />\n )}\n renderTable={(tableProps) => <AdminCrudEmbeddedTable {...tableProps} />}\n defaultValue={{ type: 'object' }}\n />\n </div>\n );\n}\n\nexport default AdminCrudSectionForm;\n","import type React from 'react';\n\nimport {\n adminSectionEntityType,\n createAdminSectionSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useBlockUnsavedChangesNavigate,\n useDefinitionSchema,\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n ComboboxFieldController,\n InputFieldController,\n SelectFieldController,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { createFileRoute, notFound, useNavigate } from '@tanstack/react-router';\nimport { sortBy } from 'es-toolkit';\nimport { useEffect } from 'react';\n\nimport AdminCrudSectionForm from './-components/admin-crud-section-form.js';\n\nconst SECTION_OPTIONS = [{ label: 'Crud', value: 'crud' }];\n\nexport const Route = createFileRoute(\n '/apps/edit/$key/admin/sections/$sectionKey',\n)({\n component: AdminAppEditSectionPage,\n loader: ({ context: { adminDefinition }, params: { sectionKey } }) => {\n const sectionId =\n sectionKey === 'new'\n ? undefined\n : adminSectionEntityType.idFromKey(sectionKey);\n const existingSection = sectionId\n ? adminDefinition.sections?.find((section) => section.id === sectionId)\n : undefined;\n if (sectionId && !existingSection) throw notFound();\n return { adminDefinition, sectionId, existingSection };\n },\n});\n\nfunction AdminAppEditSectionPage(): React.JSX.Element {\n const { requestConfirm } = useConfirmDialog();\n const { key } = Route.useParams();\n const {\n saveDefinitionWithFeedback,\n saveDefinitionWithFeedbackSync,\n isSavingDefinition,\n definition,\n } = useProjectDefinition();\n const navigate = useNavigate();\n const { adminDefinition, sectionId, existingSection } = Route.useLoaderData();\n\n const adminSectionSchema = useDefinitionSchema(createAdminSectionSchema);\n\n const formProps = useResettableForm({\n values: existingSection,\n defaultValues: { type: 'crud' },\n resolver: zodResolver(adminSectionSchema),\n });\n\n const { control, handleSubmit, watch, reset } = formProps;\n\n useEffect(() => {\n reset(existingSection ?? { type: 'crud' });\n }, [reset, existingSection]);\n\n const onSubmit = handleSubmit((data) => {\n const id = data.id || adminSectionEntityType.generateNewId();\n return saveDefinitionWithFeedback(\n (config) => {\n const adminApp = config.apps.find(\n (app) => app.id === adminDefinition.id,\n );\n if (adminApp?.type !== 'admin') {\n throw new Error('Cannot add a section to a non-admin app');\n }\n\n adminApp.sections = sortBy(\n [\n ...(adminApp.sections ?? []).filter(\n (section) => !sectionId || section.id !== sectionId,\n ),\n { ...data, id },\n ],\n [(section) => section.name],\n );\n },\n {\n onSuccess: () => {\n if (!sectionId) {\n navigate({\n to: `/apps/edit/$key/admin/sections/$sectionKey`,\n params: { key, sectionKey: adminSectionEntityType.keyFromId(id) },\n });\n }\n },\n },\n );\n });\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n const type = watch('type');\n\n function handleDelete(): void {\n requestConfirm({\n title: 'Delete Section',\n content: `Are you sure you want to delete ${\n existingSection?.name ?? 'this section'\n }?`,\n onConfirm: () => {\n saveDefinitionWithFeedbackSync(\n (config) => {\n const adminApp = config.apps.find(\n (app) => app.id === adminDefinition.id,\n );\n if (adminApp?.type !== 'admin') {\n throw new Error('Cannot add a section to a non-admin app');\n }\n\n adminApp.sections = (adminApp.sections ?? []).filter(\n (section) => !sectionId || section.id !== sectionId,\n );\n },\n {\n successMessage: 'Successfully deleted section!',\n onSuccess: () => {\n navigate({ to: '..' });\n },\n },\n );\n },\n });\n }\n\n const featureOptions = definition.features.map((f) => ({\n label: f.name,\n value: f.id,\n }));\n\n return (\n <div className=\"p-4\">\n <form onSubmit={onSubmit} className=\"space-y-4\">\n {sectionId && (\n <Button\n variant=\"link\"\n size=\"none\"\n onClick={() => {\n handleDelete();\n }}\n >\n Delete Section\n </Button>\n )}\n <InputFieldController label=\"Name\" control={control} name=\"name\" />\n <ComboboxFieldController\n label=\"Feature\"\n control={control}\n options={featureOptions}\n name=\"featureRef\"\n />\n <InputFieldController label=\"Icon\" control={control} name=\"icon\" />\n <SelectFieldController\n label=\"Type\"\n control={control}\n name=\"type\"\n options={SECTION_OPTIONS}\n />\n {(() => {\n switch (type as string) {\n case 'crud': {\n return <AdminCrudSectionForm formProps={formProps} />;\n }\n default: {\n return <div>Unsupported type {type}</div>;\n }\n }\n })()}\n <Button type=\"submit\" disabled={isSavingDefinition}>\n Save\n </Button>\n </form>\n </div>\n );\n}\n"],"names":["ModelUtils","importShared","createAdminCrudInputWebConfig","useProjectDefinition","SelectFieldController","AdminCrudEmbeddedInputForm","formProps","name","model","embeddedFormOptions","definition","foreignRelationOptions","r","prefix","controlTyped","jsxs","Fragment","jsx","adminCrudEmbeddedInputWebConfig","AdminCrudEmbeddedLocalInputForm","definitionContainer","localRelationOptions","relation","adminCrudEmbeddedLocalInputWebConfig","AdminCrudEnumInputForm","enumFieldOptions","f","field","adminCrudEnumInputWebConfig","InputFieldController","AdminCrudForeignInputForm","adminCrudForeignInputWebConfig","AdminCrudTextInputForm","fieldOptions","adminCrudTextInputWebConfig","BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS","adminCrudInputWebSpec","Button","FieldForm","idx","control","modelRef","useWatch","pluginContainer","inputWeb","fieldTypeOptions","config","type","inputWebConfig","WebForm","CrudFormFieldsForm","className","fields","append","remove","useFieldArray","clsx","CollapsibleRow","adminCrudDisplayTypes","ColumnForm","displayTypeOptions","t","CrudTableColumnsForm","createAdminCrudEmbeddedFormSchema","useDefinitionSchema","CheckboxFieldController","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","toast","useId","AdminCrudEmbeddedTable","items","edit","item","TYPE_OPTIONS","AdminCrudEmbeddedForm","initialData","onSubmit","adminCrudEmbeddedFormSchema","useForm","zodResolver","handleSubmit","watch","modelOptions","formId","e","error","logAndFormatError","AdminCrudSectionForm","form","EmbeddedListInput","tableProps","adminSectionEntityType","createAdminSectionSchema","useBlockUnsavedChangesNavigate","useResettableForm","ComboboxFieldController","useConfirmDialog","useEffect","SECTION_OPTIONS","label","value","SplitComponent","requestConfirm","key","Route","useParams","saveDefinitionWithFeedback","saveDefinitionWithFeedbackSync","isSavingDefinition","navigate","useNavigate","adminDefinition","sectionId","existingSection","useLoaderData","adminSectionSchema","values","defaultValues","resolver","reset","data","id","generateNewId","adminApp","apps","find","app","Error","sections","sortBy","filter","section","onSuccess","to","params","sectionKey","keyFromId","handleDelete","title","content","onConfirm","successMessage","featureOptions","features","map"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i}from"./_virtual___federation_fn_import-CzwHXTRo.js";import{j as e}from"./index.esm-C6ngV5UE.js";import{g as v,s as f}from"./index-BMCloLL3.js";const{authConfigSpec:C,createWebAppSchema:w}=await i("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:A,useDefinitionSchema:k,useProjectDefinition:m,useResettableForm:D}=await i("@baseplate-dev/project-builder-lib/web"),{Button:F,CheckboxFieldController:t,InputFieldController:n,MultiComboboxFieldController:R}=await i("@baseplate-dev/ui-components"),U=function(){const{saveDefinitionWithFeedback:b,isSavingDefinition:u}=m(),{appConfig:s}=v.useLoaderData(),d=k(w),j=D({resolver:f(d),values:s}),{control:o,handleSubmit:x,reset:g}=j,{definition:h,pluginContainer:S}=m(),l=x(a=>b(c=>{c.apps=c.apps.map(r=>r.id===s.id?a:r)}));A({control:o,reset:g,onSubmit:l});const p=S.getPluginSpecOptional(C)?.getAuthRoles(h).map(a=>({label:a.name,value:a.id}));return e.jsx("div",{className:"p-4",children:e.jsxs("form",{onSubmit:l,className:"space-y-4",children:[e.jsx(n,{label:"Name",control:o,name:"name"}),e.jsx(n,{label:"Package Location (optional) e.g. packages/web",control:o,name:"packageLocation"}),e.jsx(n,{label:"Page Title",control:o,name:"title"}),e.jsx(n,{label:"Description Meta Tag",control:o,name:"description"}),e.jsx(t,{label:"Include Auth?",control:o,name:"includeAuth"}),e.jsx(t,{label:"Include Upload Components?",control:o,name:"includeUploadComponents"}),e.jsx(t,{label:"Enable Subscriptions?",control:o,name:"enableSubscriptions"}),p&&e.jsx(R,{label:"Allowed Roles?",control:o,options:p,name:"allowedRoles"}),e.jsx(F,{type:"submit",disabled:u,children:"Save"})]})})};export{U as component};
|
|
2
|
-
//# sourceMappingURL=web-B6BjTv_c.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"web-B6BjTv_c.js","sources":["../../src/routes/apps/edit.$key/web.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n authConfigSpec,\n createWebAppSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useBlockUnsavedChangesNavigate,\n useDefinitionSchema,\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n CheckboxFieldController,\n InputFieldController,\n MultiComboboxFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { createFileRoute, notFound, redirect } from '@tanstack/react-router';\n\nexport const Route = createFileRoute('/apps/edit/$key/web')({\n component: WebAppForm,\n loader: ({ context: { app }, params: { key } }) => {\n if (!app) throw notFound();\n if (app.type !== 'web') {\n throw redirect({ to: '/apps/edit/$key', params: { key } });\n }\n return {\n appConfig: app,\n };\n },\n});\n\nfunction WebAppForm(): React.JSX.Element {\n const { saveDefinitionWithFeedback, isSavingDefinition } =\n useProjectDefinition();\n const { appConfig } = Route.useLoaderData();\n\n const webAppSchema = useDefinitionSchema(createWebAppSchema);\n const formProps = useResettableForm({\n resolver: zodResolver(webAppSchema),\n values: appConfig,\n });\n const { control, handleSubmit, reset } = formProps;\n\n const { definition, pluginContainer } = useProjectDefinition();\n\n const onSubmit = handleSubmit((data) =>\n saveDefinitionWithFeedback((draftConfig) => {\n draftConfig.apps = draftConfig.apps.map((app) =>\n app.id === appConfig.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 <div className=\"p-4\">\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <InputFieldController label=\"Name\" control={control} name=\"name\" />\n <InputFieldController\n label=\"Package Location (optional) e.g. packages/web\"\n control={control}\n name=\"packageLocation\"\n />\n <InputFieldController\n label=\"Page Title\"\n control={control}\n name=\"title\"\n />\n <InputFieldController\n label=\"Description Meta Tag\"\n control={control}\n name=\"description\"\n />\n <CheckboxFieldController\n label=\"Include Auth?\"\n control={control}\n name=\"includeAuth\"\n />\n <CheckboxFieldController\n label=\"Include Upload Components?\"\n control={control}\n name=\"includeUploadComponents\"\n />\n <CheckboxFieldController\n label=\"Enable Subscriptions?\"\n control={control}\n name=\"enableSubscriptions\"\n />\n {roleOptions && (\n <MultiComboboxFieldController\n label=\"Allowed Roles?\"\n control={control}\n options={roleOptions}\n name=\"allowedRoles\"\n />\n )}\n <Button type=\"submit\" disabled={isSavingDefinition}>\n Save\n </Button>\n </form>\n </div>\n );\n}\n"],"names":["authConfigSpec","createWebAppSchema","importShared","useBlockUnsavedChangesNavigate","useDefinitionSchema","useProjectDefinition","useResettableForm","Button","CheckboxFieldController","InputFieldController","MultiComboboxFieldController","SplitComponent","saveDefinitionWithFeedback","isSavingDefinition","appConfig","Route","useLoaderData","webAppSchema","formProps","resolver","zodResolver","values","control","handleSubmit","reset","definition","pluginContainer","onSubmit","draftConfig","apps","map","app","id","data","roleOptions","getPluginSpecOptional","getAuthRoles","role","label","name","value","jsx"],"mappings":"wJAEA,KAAA,CAAA,eAAAA,EAAA,mBAAAC,CAAA,EAAA,MAAAC,EAAA,oCAAA,EAIA,CAAA,+BAAAC,EAAA,oBAAAC,EAAA,qBAAAC,EAAA,kBAAAC,CAAA,EAAA,MAAAJ,EAAA,wCAAA,EAMA,CAAA,OAAAK,EAAA,wBAAAC,EAAA,qBAAAC,EAAA,6BAAAC,CAAA,EAAA,MAAAR,EAAA,8BAAA,EAMsDS,EAAA,UAgBb,CACjC,KAAA,CAAEC,2BAAAA,EAA4BC,mBAAAA,GAClCR,EAAqB,EACjB,CAAES,UAAAA,CAAAA,EAAcC,EAAMC,cAAc,EAEpCC,EAAeb,EAAoBH,CAAkB,EACrDiB,EAAYZ,EAAkB,CAClCa,SAAUC,EAAYH,CAAY,EAClCI,OAAQP,CAAAA,CACT,EACK,CAAEQ,QAAAA,EAASC,aAAAA,EAAcC,MAAAA,CAAAA,EAAUN,EAEnC,CAAEO,WAAAA,EAAYC,gBAAAA,GAAoBrB,EAAqB,EAEvDsB,EAAWJ,EACfX,GAAAA,EAA4CgB,GAAA,CAC9BC,EAAAA,KAAOD,EAAYC,KAAKC,IAAKC,GACvCA,EAAIC,KAAOlB,EAAUkB,GAAKC,EAAOF,CACnC,CAAA,CACD,CACH,EAE+B5B,EAAA,CAAEmB,QAAAA,EAASE,MAAAA,EAAOG,SAAAA,CAAAA,CAAU,EAErDO,MAAAA,EAAcR,EACjBS,sBAAsBnC,CAAc,GACnCoC,aAAaX,CAAU,EACxBK,IAAeO,IAAA,CACdC,MAAOD,EAAKE,KACZC,MAAOH,EAAKL,EAAAA,EACZ,EAGF,OAAAS,EAAA,IAAC,OAAI,UAAU,MACb,gBAAC,OAAK,CAAA,SAAAd,EAAoB,UAAU,YAClC,SAAA,CAAAc,EAAA,IAAChC,EAAqB,CAAA,MAAM,OAAO,QAAAa,EAAkB,KAAK,OAAM,QAC/Db,EACC,CAAA,MAAM,gDACN,QAAAa,EACA,KAAK,kBAAiB,QAEvBb,EACC,CAAA,MAAM,aACN,QAAAa,EACA,KAAK,QAAO,QAEbb,EACC,CAAA,MAAM,uBACN,QAAAa,EACA,KAAK,cAAa,QAEnBd,EACC,CAAA,MAAM,gBACN,QAAAc,EACA,KAAK,cAAa,QAEnBd,EACC,CAAA,MAAM,6BACN,QAAAc,EACA,KAAK,0BAAyB,QAE/Bd,EACC,CAAA,MAAM,wBACN,QAAAc,EACA,KAAK,sBAAqB,EAE3BY,SACExB,EACC,CAAA,MAAM,iBACN,QAAAY,EACA,QAASY,EACT,KAAK,cAER,CAAA,QACA3B,EAAO,CAAA,KAAK,SAAS,SAAUM,EAAmB,SAEnD,MAAA,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ"}
|