@baseplate-dev/project-builder-web 0.3.4 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/assets/{-constants-DvXqIwvq.js → -constants-BYERQCO8.js} +2 -2
  2. package/dist/assets/{-constants-DvXqIwvq.js.map → -constants-BYERQCO8.js.map} +1 -1
  3. package/dist/assets/{admin-B4N6MLKM.js → admin-Dy1xMuLp.js} +2 -2
  4. package/dist/assets/{admin-B4N6MLKM.js.map → admin-Dy1xMuLp.js.map} +1 -1
  5. package/dist/assets/{backend-DcOfqunA.js → backend-SevlkhOM.js} +2 -2
  6. package/dist/assets/{backend-DcOfqunA.js.map → backend-SevlkhOM.js.map} +1 -1
  7. package/dist/assets/{edit._key-B6XrJtx8.js → edit._key-BgnflZIL.js} +2 -2
  8. package/dist/assets/{edit._key-B6XrJtx8.js.map → edit._key-BgnflZIL.js.map} +1 -1
  9. package/dist/assets/edit._sectionKey-D4mTSUhO.js +3 -0
  10. package/dist/assets/edit._sectionKey-D4mTSUhO.js.map +1 -0
  11. package/dist/assets/{graphql-Bf0DkZpf.js → graphql-C37jbnTG.js} +2 -2
  12. package/dist/assets/{graphql-Bf0DkZpf.js.map → graphql-C37jbnTG.js.map} +1 -1
  13. package/dist/assets/{hierarchy-DJ_1-p8i.js → hierarchy-CNBHjTAJ.js} +2 -2
  14. package/dist/assets/{hierarchy-DJ_1-p8i.js.map → hierarchy-CNBHjTAJ.js.map} +1 -1
  15. package/dist/assets/{index-CSR0XEd6.js → index-2EwzbJik.js} +2 -2
  16. package/dist/assets/{index-CSR0XEd6.js.map → index-2EwzbJik.js.map} +1 -1
  17. package/dist/assets/{index-Bd-VIuBI.js → index-B2l1e3vi.js} +2 -2
  18. package/dist/assets/{index-Bd-VIuBI.js.map → index-B2l1e3vi.js.map} +1 -1
  19. package/dist/assets/{index-BbhEKLV8.js → index-B3A5IWAQ.js} +2 -2
  20. package/dist/assets/{index-BbhEKLV8.js.map → index-B3A5IWAQ.js.map} +1 -1
  21. package/dist/assets/{index-BXLDYWo4.js → index-CAFf3K5-.js} +2 -2
  22. package/dist/assets/{index-BXLDYWo4.js.map → index-CAFf3K5-.js.map} +1 -1
  23. package/dist/assets/{index-CKO5J-yn.js → index-CDx3IfgN.js} +2 -2
  24. package/dist/assets/{index-CKO5J-yn.js.map → index-CDx3IfgN.js.map} +1 -1
  25. package/dist/assets/{index-BKgjTc--.js → index-CFlVUowS.js} +2 -2
  26. package/dist/assets/{index-BKgjTc--.js.map → index-CFlVUowS.js.map} +1 -1
  27. package/dist/assets/{index-Ce0DmLOw.js → index-Ckh17o1U.js} +2 -2
  28. package/dist/assets/{index-Ce0DmLOw.js.map → index-Ckh17o1U.js.map} +1 -1
  29. package/dist/assets/{index-oa_Oxkrg.js → index-D48MR3bL.js} +2 -2
  30. package/dist/assets/{index-oa_Oxkrg.js.map → index-D48MR3bL.js.map} +1 -1
  31. package/dist/assets/{index-BekC6gsX.js → index-DEKFCy0H.js} +3 -3
  32. package/dist/assets/{index-BekC6gsX.js.map → index-DEKFCy0H.js.map} +1 -1
  33. package/dist/assets/{index-CloYSKtQ.js → index-mFxKl9yz.js} +2 -2
  34. package/dist/assets/{index-CloYSKtQ.js.map → index-mFxKl9yz.js.map} +1 -1
  35. package/dist/assets/{new-admin-section-dialog-YeMy0G96.js → new-admin-section-dialog-4X2fxo7a.js} +2 -2
  36. package/dist/assets/{new-admin-section-dialog-YeMy0G96.js.map → new-admin-section-dialog-4X2fxo7a.js.map} +1 -1
  37. package/dist/assets/{new-app-dialog-nUBoX5fs.js → new-app-dialog-CCI4q4Mt.js} +2 -2
  38. package/dist/assets/{new-app-dialog-nUBoX5fs.js.map → new-app-dialog-CCI4q4Mt.js.map} +1 -1
  39. package/dist/assets/{new-enum-dialog-8Ba41lUU.js → new-enum-dialog-B5zvBxhT.js} +2 -2
  40. package/dist/assets/{new-enum-dialog-8Ba41lUU.js.map → new-enum-dialog-B5zvBxhT.js.map} +1 -1
  41. package/dist/assets/{new-model-dialog-CWgmV0pB.js → new-model-dialog-CiwTpKcZ.js} +2 -2
  42. package/dist/assets/{new-model-dialog-CWgmV0pB.js.map → new-model-dialog-CiwTpKcZ.js.map} +1 -1
  43. package/dist/assets/{route-DM37J86t.js → route-6ErXC2Qt.js} +2 -2
  44. package/dist/assets/{route-DM37J86t.js.map → route-6ErXC2Qt.js.map} +1 -1
  45. package/dist/assets/{route-DuhBcukV.js → route-C3eBLQEr.js} +2 -2
  46. package/dist/assets/{route-DuhBcukV.js.map → route-C3eBLQEr.js.map} +1 -1
  47. package/dist/assets/{route-CSbr85FB.js → route-C6wCPwVj.js} +2 -2
  48. package/dist/assets/{route-CSbr85FB.js.map → route-C6wCPwVj.js.map} +1 -1
  49. package/dist/assets/{route-DYxDmtHP.js → route-CZgTuGeJ.js} +2 -2
  50. package/dist/assets/{route-DYxDmtHP.js.map → route-CZgTuGeJ.js.map} +1 -1
  51. package/dist/assets/route-DLz_DL5S.js +2 -0
  52. package/dist/assets/{route-DHu7qE-k.js.map → route-DLz_DL5S.js.map} +1 -1
  53. package/dist/assets/{route-DDbjYROk.js → route-DluQ5e3_.js} +2 -2
  54. package/dist/assets/{route-DDbjYROk.js.map → route-DluQ5e3_.js.map} +1 -1
  55. package/dist/assets/{route-CTv4dICL.js → route-DzYT3FNA.js} +2 -2
  56. package/dist/assets/{route-CTv4dICL.js.map → route-DzYT3FNA.js.map} +1 -1
  57. package/dist/assets/{route-CrSpNRRy.js → route-PmxQsBVj.js} +2 -2
  58. package/dist/assets/{route-CrSpNRRy.js.map → route-PmxQsBVj.js.map} +1 -1
  59. package/dist/assets/{route-Ch1y-64Q.js → route-gYB7kkkm.js} +2 -2
  60. package/dist/assets/{route-Ch1y-64Q.js.map → route-gYB7kkkm.js.map} +1 -1
  61. package/dist/assets/{route-CbVppiIk.js → route-gzD4oiAl.js} +2 -2
  62. package/dist/assets/{route-CbVppiIk.js.map → route-gzD4oiAl.js.map} +1 -1
  63. package/dist/assets/{service-fvQlhwg4.js → service--2LVz4Ht.js} +2 -2
  64. package/dist/assets/{service-fvQlhwg4.js.map → service--2LVz4Ht.js.map} +1 -1
  65. package/dist/assets/{template-extractor-ChZnhGEF.js → template-extractor-D33LuEZ8.js} +2 -2
  66. package/dist/assets/{template-extractor-ChZnhGEF.js.map → template-extractor-D33LuEZ8.js.map} +1 -1
  67. package/dist/assets/{theme-builder-Y6jNiAJ3.js → theme-builder-CWetoMuo.js} +2 -2
  68. package/dist/assets/{theme-builder-Y6jNiAJ3.js.map → theme-builder-CWetoMuo.js.map} +1 -1
  69. package/dist/assets/{use-enum-form-D7XmblPC.js → use-enum-form-BRBAlWJc.js} +2 -2
  70. package/dist/assets/{use-enum-form-D7XmblPC.js.map → use-enum-form-BRBAlWJc.js.map} +1 -1
  71. package/dist/assets/{use-model-form-dwW5mcmn.js → use-model-form-psj-JlE9.js} +2 -2
  72. package/dist/assets/{use-model-form-dwW5mcmn.js.map → use-model-form-psj-JlE9.js.map} +1 -1
  73. package/dist/index.html +1 -1
  74. package/package.json +6 -6
  75. package/dist/assets/edit._sectionKey-BHWbqvR0.js +0 -3
  76. package/dist/assets/edit._sectionKey-BHWbqvR0.js.map +0 -1
  77. package/dist/assets/route-DHu7qE-k.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"new-admin-section-dialog-YeMy0G96.js","sources":["../../src/routes/admin-sections.$appKey/-components/new-admin-section-dialog.tsx"],"sourcesContent":["import type React from 'react';\n\nimport {\n adminSectionEntityType,\n createWebAdminSectionSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n ComboboxFieldController,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n InputFieldController,\n SelectFieldController,\n useControlledState,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useMemo } from 'react';\nimport { useWatch } from 'react-hook-form';\n\nimport { useDefinitionSchema } from '#src/hooks/use-definition-schema.js';\n\ninterface NewAdminSectionDialogProps {\n children: React.ReactNode;\n appId: string;\n appKey: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction NewAdminSectionDialog({\n children,\n appId,\n appKey,\n open,\n onOpenChange,\n}: NewAdminSectionDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n const navigate = useNavigate();\n\n const { definition, saveDefinitionWithFeedback, isSavingDefinition } =\n useProjectDefinition();\n const adminSectionSchema = useDefinitionSchema(createWebAdminSectionSchema);\n\n const featureOptions = definition.features.map((f) => ({\n label: f.name,\n value: f.id,\n }));\n\n const modelOptions = definition.models.map((m) => ({\n label: m.name,\n value: m.id,\n }));\n\n const formProps = useResettableForm({\n resolver: zodResolver(adminSectionSchema),\n defaultValues: {\n name: '',\n type: 'crud' as const,\n featureRef: featureOptions[0]?.value ?? '',\n icon: '',\n modelRef: '',\n nameFieldRef: '',\n form: { fields: [] },\n table: { columns: [] },\n },\n });\n\n const { control, handleSubmit, reset } = formProps;\n\n const modelRef = useWatch({\n control,\n name: 'modelRef',\n });\n\n const fieldOptions = useMemo(\n () =>\n definition.models\n .find((m) => m.id === modelRef)\n ?.model.fields.map((f) => ({\n label: f.name,\n value: f.id,\n })) ?? [],\n [definition.models, modelRef],\n );\n\n const onSubmit = handleSubmit((data) => {\n const newId = adminSectionEntityType.generateNewId();\n return saveDefinitionWithFeedback(\n (draftConfig) => {\n const webApp = draftConfig.apps.find((a) => a.id === appId);\n if (webApp?.type !== 'web') return;\n\n webApp.adminApp ??= {\n enabled: true,\n pathPrefix: '/admin',\n sections: [],\n };\n\n webApp.adminApp.sections = [\n ...(webApp.adminApp.sections ?? []),\n { ...data, id: newId },\n ].sort((a, b) => a.name.localeCompare(b.name));\n },\n {\n successMessage: `Successfully created section \"${data.name}\"!`,\n onSuccess: () => {\n setIsOpen(false);\n reset();\n // Navigate to the newly created section\n navigate({\n to: '/admin-sections/$appKey/edit/$sectionKey',\n params: {\n appKey,\n sectionKey: adminSectionEntityType.keyFromId(newId),\n },\n });\n },\n },\n );\n });\n\n const handleOpenChange = (newOpen: boolean): void => {\n setIsOpen(newOpen);\n if (!newOpen) {\n reset();\n }\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={handleOpenChange}>\n <DialogTrigger asChild>{children}</DialogTrigger>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Create New Admin Section</DialogTitle>\n <DialogDescription>\n Create a new CRUD interface for managing your data models.\n </DialogDescription>\n </DialogHeader>\n <form\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n className=\"space-y-4\"\n >\n <InputFieldController\n label=\"Name\"\n control={control}\n name=\"name\"\n placeholder=\"e.g. Users, Posts, Categories\"\n description=\"The display name for this admin section\"\n autoComplete=\"off\"\n />\n <ComboboxFieldController\n label=\"Feature\"\n control={control}\n options={featureOptions}\n name=\"featureRef\"\n description=\"The feature this section belongs to\"\n />\n <InputFieldController\n label=\"Icon\"\n control={control}\n name=\"icon\"\n placeholder=\"e.g. MdPeople, MdArticle\"\n description=\"React icon component name (optional)\"\n />\n <SelectFieldController\n label=\"Type\"\n control={control}\n name=\"type\"\n options={[{ label: 'CRUD', value: 'crud' }]}\n description=\"The type of admin interface\"\n />\n <ComboboxFieldController\n label=\"Model\"\n control={control}\n options={modelOptions}\n name=\"modelRef\"\n description=\"The model to use for this section\"\n />\n <ComboboxFieldController\n label=\"Name Field\"\n control={control}\n options={fieldOptions}\n name=\"nameFieldRef\"\n description=\"The field to use for the name of the section\"\n />\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n handleOpenChange(false);\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSavingDefinition}>\n {isSavingDefinition ? 'Creating...' : 'Create Section'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default NewAdminSectionDialog;\n"],"names":["adminSectionEntityType","createWebAdminSectionSchema","importShared","useProjectDefinition","useResettableForm","Button","ComboboxFieldController","Dialog","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","InputFieldController","SelectFieldController","useControlledState","useNavigate","useMemo","NewAdminSectionDialog","children","appId","appKey","open","onOpenChange","isOpen","setIsOpen","navigate","definition","saveDefinitionWithFeedback","isSavingDefinition","adminSectionSchema","useDefinitionSchema","featureOptions","f","modelOptions","m","formProps","zodResolver","control","handleSubmit","reset","modelRef","useWatch","fieldOptions","onSubmit","data","newId","draftConfig","webApp","a","b","handleOpenChange","newOpen","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"new-admin-section-dialog-4X2fxo7a.js","sources":["../../src/routes/admin-sections.$appKey/-components/new-admin-section-dialog.tsx"],"sourcesContent":["import type React from 'react';\n\nimport {\n adminSectionEntityType,\n createWebAdminSectionSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n ComboboxFieldController,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n InputFieldController,\n SelectFieldController,\n useControlledState,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useMemo } from 'react';\nimport { useWatch } from 'react-hook-form';\n\nimport { useDefinitionSchema } from '#src/hooks/use-definition-schema.js';\n\ninterface NewAdminSectionDialogProps {\n children: React.ReactNode;\n appId: string;\n appKey: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction NewAdminSectionDialog({\n children,\n appId,\n appKey,\n open,\n onOpenChange,\n}: NewAdminSectionDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n const navigate = useNavigate();\n\n const { definition, saveDefinitionWithFeedback, isSavingDefinition } =\n useProjectDefinition();\n const adminSectionSchema = useDefinitionSchema(createWebAdminSectionSchema);\n\n const featureOptions = definition.features.map((f) => ({\n label: f.name,\n value: f.id,\n }));\n\n const modelOptions = definition.models.map((m) => ({\n label: m.name,\n value: m.id,\n }));\n\n const formProps = useResettableForm({\n resolver: zodResolver(adminSectionSchema),\n defaultValues: {\n name: '',\n type: 'crud' as const,\n featureRef: featureOptions[0]?.value ?? '',\n icon: '',\n modelRef: '',\n nameFieldRef: '',\n form: { fields: [] },\n table: { columns: [] },\n },\n });\n\n const { control, handleSubmit, reset } = formProps;\n\n const modelRef = useWatch({\n control,\n name: 'modelRef',\n });\n\n const fieldOptions = useMemo(\n () =>\n definition.models\n .find((m) => m.id === modelRef)\n ?.model.fields.map((f) => ({\n label: f.name,\n value: f.id,\n })) ?? [],\n [definition.models, modelRef],\n );\n\n const onSubmit = handleSubmit((data) => {\n const newId = adminSectionEntityType.generateNewId();\n return saveDefinitionWithFeedback(\n (draftConfig) => {\n const webApp = draftConfig.apps.find((a) => a.id === appId);\n if (webApp?.type !== 'web') return;\n\n webApp.adminApp ??= {\n enabled: true,\n pathPrefix: '/admin',\n sections: [],\n };\n\n webApp.adminApp.sections = [\n ...(webApp.adminApp.sections ?? []),\n { ...data, id: newId },\n ].sort((a, b) => a.name.localeCompare(b.name));\n },\n {\n successMessage: `Successfully created section \"${data.name}\"!`,\n onSuccess: () => {\n setIsOpen(false);\n reset();\n // Navigate to the newly created section\n navigate({\n to: '/admin-sections/$appKey/edit/$sectionKey',\n params: {\n appKey,\n sectionKey: adminSectionEntityType.keyFromId(newId),\n },\n });\n },\n },\n );\n });\n\n const handleOpenChange = (newOpen: boolean): void => {\n setIsOpen(newOpen);\n if (!newOpen) {\n reset();\n }\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={handleOpenChange}>\n <DialogTrigger asChild>{children}</DialogTrigger>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Create New Admin Section</DialogTitle>\n <DialogDescription>\n Create a new CRUD interface for managing your data models.\n </DialogDescription>\n </DialogHeader>\n <form\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n className=\"space-y-4\"\n >\n <InputFieldController\n label=\"Name\"\n control={control}\n name=\"name\"\n placeholder=\"e.g. Users, Posts, Categories\"\n description=\"The display name for this admin section\"\n autoComplete=\"off\"\n />\n <ComboboxFieldController\n label=\"Feature\"\n control={control}\n options={featureOptions}\n name=\"featureRef\"\n description=\"The feature this section belongs to\"\n />\n <InputFieldController\n label=\"Icon\"\n control={control}\n name=\"icon\"\n placeholder=\"e.g. MdPeople, MdArticle\"\n description=\"React icon component name (optional)\"\n />\n <SelectFieldController\n label=\"Type\"\n control={control}\n name=\"type\"\n options={[{ label: 'CRUD', value: 'crud' }]}\n description=\"The type of admin interface\"\n />\n <ComboboxFieldController\n label=\"Model\"\n control={control}\n options={modelOptions}\n name=\"modelRef\"\n description=\"The model to use for this section\"\n />\n <ComboboxFieldController\n label=\"Name Field\"\n control={control}\n options={fieldOptions}\n name=\"nameFieldRef\"\n description=\"The field to use for the name of the section\"\n />\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n handleOpenChange(false);\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSavingDefinition}>\n {isSavingDefinition ? 'Creating...' : 'Create Section'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default NewAdminSectionDialog;\n"],"names":["adminSectionEntityType","createWebAdminSectionSchema","importShared","useProjectDefinition","useResettableForm","Button","ComboboxFieldController","Dialog","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","InputFieldController","SelectFieldController","useControlledState","useNavigate","useMemo","NewAdminSectionDialog","children","appId","appKey","open","onOpenChange","isOpen","setIsOpen","navigate","definition","saveDefinitionWithFeedback","isSavingDefinition","adminSectionSchema","useDefinitionSchema","featureOptions","f","modelOptions","m","formProps","zodResolver","control","handleSubmit","reset","modelRef","useWatch","fieldOptions","onSubmit","data","newId","draftConfig","webApp","a","b","handleOpenChange","newOpen","jsxs","jsx"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{s as v,l as D}from"./index-BekC6gsX.js";import{b as k}from"./index.esm-CdP29Ssb.js";import{w as A}from"./words-Cs2RBKRm.js";import{s as S}from"./sortBy-C9bvycg5.js";function N(r){const n=A(r.trim());let a="";for(let s=0;s<n.length;s++){const o=n[s];a&&(a+=" "),a+=o[0].toUpperCase()+o.slice(1).toLowerCase()}return a}const{appEntityType:b,baseAppSchema:F}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:I}=await i("@baseplate-dev/project-builder-lib/web"),{Button:h,Dialog:T,DialogContent:B,DialogDescription:O,DialogFooter:$,DialogHeader:E,DialogTitle:P,DialogTrigger:W,InputFieldController:H,SelectFieldController:L,useControlledState:M}=await i("@baseplate-dev/ui-components"),{useNavigate:R}=await i("@tanstack/react-router");function K({children:r,open:n,onOpenChange:a}){const[s,o]=M(n,a,!1),{saveDefinitionWithFeedback:f,isSavingDefinition:p}=I(),g=R(),{control:l,handleSubmit:w,reset:c}=k({resolver:v(F),defaultValues:{id:"",name:"",type:"backend"}}),j=[{label:"Backend App",value:"backend"},{label:"Web App",value:"web"}],y=w(t=>{const m=b.generateNewId();return f(u=>{const C=[...u.apps,{...t,id:m,...t.type==="web"&&{title:N(t.name),description:`A ${t.type} application`}}];u.apps=S(C,[x=>x.name])},{successMessage:`Successfully created ${t.name}!`,onSuccess:()=>{o(!1),c(),g({to:`/apps/edit/${b.keyFromId(m)}`}).catch(D)}})}),d=t=>{o(t),t||c()};return e.jsxs(T,{open:s,onOpenChange:d,children:[e.jsx(W,{asChild:!0,children:r}),e.jsxs(B,{className:"sm:max-w-md",children:[e.jsxs(E,{children:[e.jsx(P,{children:"Create New App"}),e.jsx(O,{children:"Create a new application in your project. Choose the type that best fits your needs."})]}),e.jsxs("form",{onSubmit:t=>(t.stopPropagation(),y(t)),className:"space-y-4",children:[e.jsx(H,{label:"Name",control:l,name:"name",placeholder:"e.g. backend, web, admin",description:"The name of the app, such as 'backend' or 'web'",autoComplete:"off"}),e.jsx(L,{label:"Type",control:l,name:"type",options:j,description:"Backend apps provide APIs, web apps are client applications"}),e.jsxs($,{children:[e.jsx(h,{type:"button",variant:"outline",onClick:()=>{d(!1)},children:"Cancel"}),e.jsx(h,{type:"submit",disabled:p,children:p?"Creating...":"Create App"})]})]})]})]})}export{K as N};
2
- //# sourceMappingURL=new-app-dialog-nUBoX5fs.js.map
1
+ import{i}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{s as v,l as D}from"./index-DEKFCy0H.js";import{b as k}from"./index.esm-CdP29Ssb.js";import{w as A}from"./words-Cs2RBKRm.js";import{s as S}from"./sortBy-C9bvycg5.js";function N(r){const n=A(r.trim());let a="";for(let s=0;s<n.length;s++){const o=n[s];a&&(a+=" "),a+=o[0].toUpperCase()+o.slice(1).toLowerCase()}return a}const{appEntityType:b,baseAppSchema:F}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:I}=await i("@baseplate-dev/project-builder-lib/web"),{Button:h,Dialog:T,DialogContent:B,DialogDescription:O,DialogFooter:$,DialogHeader:E,DialogTitle:P,DialogTrigger:W,InputFieldController:H,SelectFieldController:L,useControlledState:M}=await i("@baseplate-dev/ui-components"),{useNavigate:R}=await i("@tanstack/react-router");function K({children:r,open:n,onOpenChange:a}){const[s,o]=M(n,a,!1),{saveDefinitionWithFeedback:f,isSavingDefinition:p}=I(),g=R(),{control:l,handleSubmit:w,reset:c}=k({resolver:v(F),defaultValues:{id:"",name:"",type:"backend"}}),j=[{label:"Backend App",value:"backend"},{label:"Web App",value:"web"}],y=w(t=>{const m=b.generateNewId();return f(u=>{const C=[...u.apps,{...t,id:m,...t.type==="web"&&{title:N(t.name),description:`A ${t.type} application`}}];u.apps=S(C,[x=>x.name])},{successMessage:`Successfully created ${t.name}!`,onSuccess:()=>{o(!1),c(),g({to:`/apps/edit/${b.keyFromId(m)}`}).catch(D)}})}),d=t=>{o(t),t||c()};return e.jsxs(T,{open:s,onOpenChange:d,children:[e.jsx(W,{asChild:!0,children:r}),e.jsxs(B,{className:"sm:max-w-md",children:[e.jsxs(E,{children:[e.jsx(P,{children:"Create New App"}),e.jsx(O,{children:"Create a new application in your project. Choose the type that best fits your needs."})]}),e.jsxs("form",{onSubmit:t=>(t.stopPropagation(),y(t)),className:"space-y-4",children:[e.jsx(H,{label:"Name",control:l,name:"name",placeholder:"e.g. backend, web, admin",description:"The name of the app, such as 'backend' or 'web'",autoComplete:"off"}),e.jsx(L,{label:"Type",control:l,name:"type",options:j,description:"Backend apps provide APIs, web apps are client applications"}),e.jsxs($,{children:[e.jsx(h,{type:"button",variant:"outline",onClick:()=>{d(!1)},children:"Cancel"}),e.jsx(h,{type:"submit",disabled:p,children:p?"Creating...":"Create App"})]})]})]})]})}export{K as N};
2
+ //# sourceMappingURL=new-app-dialog-CCI4q4Mt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"new-app-dialog-nUBoX5fs.js","sources":["../../../../node_modules/.pnpm/es-toolkit@1.31.0/node_modules/es-toolkit/dist/string/startCase.mjs","../../src/routes/apps/-components/new-app-dialog.tsx"],"sourcesContent":["import { words } from './words.mjs';\n\nfunction startCase(str) {\n const words$1 = words(str.trim());\n let result = '';\n for (let i = 0; i < words$1.length; i++) {\n const word = words$1[i];\n if (result) {\n result += ' ';\n }\n result += word[0].toUpperCase() + word.slice(1).toLowerCase();\n }\n return result;\n}\n\nexport { startCase };\n","import type { AppConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n appEntityType,\n baseAppSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n InputFieldController,\n SelectFieldController,\n useControlledState,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useNavigate } from '@tanstack/react-router';\nimport { sortBy, startCase } from 'es-toolkit';\nimport { useForm } from 'react-hook-form';\n\nimport { logAndFormatError } from '#src/services/error-formatter.js';\n\ninterface NewAppDialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction NewAppDialog({\n children,\n open,\n onOpenChange,\n}: NewAppDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n\n const { saveDefinitionWithFeedback, isSavingDefinition } =\n useProjectDefinition();\n const navigate = useNavigate();\n\n const { control, handleSubmit, reset } = useForm({\n resolver: zodResolver(baseAppSchema),\n defaultValues: {\n id: '',\n name: '',\n type: 'backend' as const,\n },\n });\n\n const appTypeOptions = [\n { label: 'Backend App', value: 'backend' },\n { label: 'Web App', value: 'web' },\n ];\n\n const onSubmit = handleSubmit((data) => {\n const newId = appEntityType.generateNewId();\n return saveDefinitionWithFeedback(\n (draftConfig) => {\n const newApps = [\n ...draftConfig.apps,\n {\n ...data,\n id: newId,\n ...(data.type === 'web' && {\n title: startCase(data.name),\n description: `A ${data.type} application`,\n }),\n },\n ];\n draftConfig.apps = sortBy(newApps, [(app) => app.name]) as AppConfig[];\n },\n {\n successMessage: `Successfully created ${data.name}!`,\n onSuccess: () => {\n setIsOpen(false);\n reset();\n navigate({\n to: `/apps/edit/${appEntityType.keyFromId(newId)}`,\n }).catch(logAndFormatError);\n },\n },\n );\n });\n\n const handleOpenChange = (newOpen: boolean): void => {\n setIsOpen(newOpen);\n if (!newOpen) {\n reset();\n }\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={handleOpenChange}>\n <DialogTrigger asChild>{children}</DialogTrigger>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Create New App</DialogTitle>\n <DialogDescription>\n Create a new application in your project. Choose the type that best\n fits your needs.\n </DialogDescription>\n </DialogHeader>\n <form\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n className=\"space-y-4\"\n >\n <InputFieldController\n label=\"Name\"\n control={control}\n name=\"name\"\n placeholder=\"e.g. backend, web, admin\"\n description=\"The name of the app, such as 'backend' or 'web'\"\n autoComplete=\"off\"\n />\n <SelectFieldController\n label=\"Type\"\n control={control}\n name=\"type\"\n options={appTypeOptions}\n description=\"Backend apps provide APIs, web apps are client applications\"\n />\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n handleOpenChange(false);\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSavingDefinition}>\n {isSavingDefinition ? 'Creating...' : 'Create App'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default NewAppDialog;\n"],"names":["startCase","str","words$1","words","result","i","word","appEntityType","baseAppSchema","importShared","useProjectDefinition","Button","Dialog","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","InputFieldController","SelectFieldController","useControlledState","useNavigate","NewAppDialog","children","open","onOpenChange","isOpen","setIsOpen","saveDefinitionWithFeedback","isSavingDefinition","navigate","control","handleSubmit","reset","useForm","zodResolver","appTypeOptions","onSubmit","data","newId","draftConfig","newApps","sortBy","app","logAndFormatError","handleOpenChange","newOpen","jsxs","jsx","e"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"new-app-dialog-CCI4q4Mt.js","sources":["../../../../node_modules/.pnpm/es-toolkit@1.31.0/node_modules/es-toolkit/dist/string/startCase.mjs","../../src/routes/apps/-components/new-app-dialog.tsx"],"sourcesContent":["import { words } from './words.mjs';\n\nfunction startCase(str) {\n const words$1 = words(str.trim());\n let result = '';\n for (let i = 0; i < words$1.length; i++) {\n const word = words$1[i];\n if (result) {\n result += ' ';\n }\n result += word[0].toUpperCase() + word.slice(1).toLowerCase();\n }\n return result;\n}\n\nexport { startCase };\n","import type { AppConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n appEntityType,\n baseAppSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n InputFieldController,\n SelectFieldController,\n useControlledState,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useNavigate } from '@tanstack/react-router';\nimport { sortBy, startCase } from 'es-toolkit';\nimport { useForm } from 'react-hook-form';\n\nimport { logAndFormatError } from '#src/services/error-formatter.js';\n\ninterface NewAppDialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction NewAppDialog({\n children,\n open,\n onOpenChange,\n}: NewAppDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n\n const { saveDefinitionWithFeedback, isSavingDefinition } =\n useProjectDefinition();\n const navigate = useNavigate();\n\n const { control, handleSubmit, reset } = useForm({\n resolver: zodResolver(baseAppSchema),\n defaultValues: {\n id: '',\n name: '',\n type: 'backend' as const,\n },\n });\n\n const appTypeOptions = [\n { label: 'Backend App', value: 'backend' },\n { label: 'Web App', value: 'web' },\n ];\n\n const onSubmit = handleSubmit((data) => {\n const newId = appEntityType.generateNewId();\n return saveDefinitionWithFeedback(\n (draftConfig) => {\n const newApps = [\n ...draftConfig.apps,\n {\n ...data,\n id: newId,\n ...(data.type === 'web' && {\n title: startCase(data.name),\n description: `A ${data.type} application`,\n }),\n },\n ];\n draftConfig.apps = sortBy(newApps, [(app) => app.name]) as AppConfig[];\n },\n {\n successMessage: `Successfully created ${data.name}!`,\n onSuccess: () => {\n setIsOpen(false);\n reset();\n navigate({\n to: `/apps/edit/${appEntityType.keyFromId(newId)}`,\n }).catch(logAndFormatError);\n },\n },\n );\n });\n\n const handleOpenChange = (newOpen: boolean): void => {\n setIsOpen(newOpen);\n if (!newOpen) {\n reset();\n }\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={handleOpenChange}>\n <DialogTrigger asChild>{children}</DialogTrigger>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Create New App</DialogTitle>\n <DialogDescription>\n Create a new application in your project. Choose the type that best\n fits your needs.\n </DialogDescription>\n </DialogHeader>\n <form\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n className=\"space-y-4\"\n >\n <InputFieldController\n label=\"Name\"\n control={control}\n name=\"name\"\n placeholder=\"e.g. backend, web, admin\"\n description=\"The name of the app, such as 'backend' or 'web'\"\n autoComplete=\"off\"\n />\n <SelectFieldController\n label=\"Type\"\n control={control}\n name=\"type\"\n options={appTypeOptions}\n description=\"Backend apps provide APIs, web apps are client applications\"\n />\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n handleOpenChange(false);\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSavingDefinition}>\n {isSavingDefinition ? 'Creating...' : 'Create App'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default NewAppDialog;\n"],"names":["startCase","str","words$1","words","result","i","word","appEntityType","baseAppSchema","importShared","useProjectDefinition","Button","Dialog","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","InputFieldController","SelectFieldController","useControlledState","useNavigate","NewAppDialog","children","open","onOpenChange","isOpen","setIsOpen","saveDefinitionWithFeedback","isSavingDefinition","navigate","control","handleSubmit","reset","useForm","zodResolver","appTypeOptions","onSubmit","data","newId","draftConfig","newApps","sortBy","app","logAndFormatError","handleOpenChange","newOpen","jsxs","jsx","e"],"mappings":"uRAEA,SAASA,EAAUC,EAAK,CACpB,MAAMC,EAAUC,EAAMF,EAAI,KAAI,CAAE,EAChC,IAAIG,EAAS,GACb,QAASC,EAAI,EAAGA,EAAIH,EAAQ,OAAQG,IAAK,CACrC,MAAMC,EAAOJ,EAAQG,CAAC,EAClBD,IACAA,GAAU,KAEdA,GAAUE,EAAK,CAAC,EAAE,YAAW,EAAKA,EAAK,MAAM,CAAC,EAAE,YAAa,CACrE,CACI,OAAOF,CACX,CCVA,KAAA,CAAA,cAAAG,EAAA,cAAAC,CAAA,EAAA,MAAAC,EAAA,oCAAA,EAIA,CAAA,qBAAAC,CAAA,EAAA,MAAAD,EAAA,wCAAA,EACA,CAAA,OAAAE,EAAA,OAAAC,EAAA,cAAAC,EAAA,kBAAAC,EAAA,aAAAC,EAAA,aAAAC,EAAA,YAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,sBAAAC,EAAA,mBAAAC,CAAA,EAAA,MAAAZ,EAAA,8BAAA,EAcA,CAAA,YAAAa,CAAA,EAAA,MAAAb,EAAA,wBAAA,EAYA,SAASc,EAAa,CACpB,SAAAC,EACA,KAAAC,EACA,aAAAC,CACF,EAAyC,CACvC,KAAM,CAACC,EAAQC,CAAS,EAAIP,EAAmBI,EAAMC,EAAc,EAAK,EAElE,CAAE,2BAAAG,EAA4B,mBAAAC,CAAmB,EACrDpB,EAAqB,EACjBqB,EAAWT,EAAY,EAEvB,CAAE,QAAAU,EAAS,aAAAC,EAAc,MAAAC,CAAA,EAAUC,EAAQ,CAC/C,SAAUC,EAAY5B,CAAa,EACnC,cAAe,CACb,GAAI,GACJ,KAAM,GACN,KAAM,SAAA,CACR,CACD,EAEK6B,EAAiB,CACrB,CAAE,MAAO,cAAe,MAAO,SAAU,EACzC,CAAE,MAAO,UAAW,MAAO,KAAM,CACnC,EAEMC,EAAWL,EAAcM,GAAS,CAChC,MAAAC,EAAQjC,EAAc,cAAc,EACnC,OAAAsB,EACJY,GAAgB,CACf,MAAMC,EAAU,CACd,GAAGD,EAAY,KACf,CACE,GAAGF,EACH,GAAIC,EACJ,GAAID,EAAK,OAAS,OAAS,CACzB,MAAOvC,EAAUuC,EAAK,IAAI,EAC1B,YAAa,KAAKA,EAAK,IAAI,cAAA,CAC7B,CAEJ,EACYE,EAAA,KAAOE,EAAOD,EAAS,CAAEE,GAAQA,EAAI,IAAI,CAAC,CACxD,EACA,CACE,eAAgB,wBAAwBL,EAAK,IAAI,IACjD,UAAW,IAAM,CACfX,EAAU,EAAK,EACTM,EAAA,EACGH,EAAA,CACP,GAAI,cAAcxB,EAAc,UAAUiC,CAAK,CAAC,EAAA,CACjD,EAAE,MAAMK,CAAiB,CAAA,CAC5B,CAEJ,CAAA,CACD,EAEKC,EAAoBC,GAA2B,CACnDnB,EAAUmB,CAAO,EACZA,GACGb,EAAA,CAEV,EAEA,OACGc,EAAAA,KAAApC,EAAA,CAAO,KAAMe,EAAQ,aAAcmB,EAClC,SAAA,CAACG,EAAAA,IAAA/B,EAAA,CAAc,QAAO,GAAE,SAAAM,CAAS,CAAA,EACjCwB,EAAAA,KAACnC,EAAc,CAAA,UAAU,cACvB,SAAA,CAAAmC,OAAChC,EACC,CAAA,SAAA,CAAAiC,EAAAA,IAAChC,GAAY,SAAc,gBAAA,CAAA,EAC3BgC,EAAAA,IAACnC,GAAkB,SAGnB,sFAAA,CAAA,CAAA,EACF,EACAkC,EAAA,KAAC,OAAA,CACC,SAAWE,IACTA,EAAE,gBAAgB,EACXZ,EAASY,CAAC,GAEnB,UAAU,YAEV,SAAA,CAAAD,EAAA,IAAC9B,EAAA,CACC,MAAM,OACN,QAAAa,EACA,KAAK,OACL,YAAY,2BACZ,YAAY,kDACZ,aAAa,KAAA,CACf,EACAiB,EAAA,IAAC7B,EAAA,CACC,MAAM,OACN,QAAAY,EACA,KAAK,OACL,QAASK,EACT,YAAY,6DAAA,CACd,SACCtB,EACC,CAAA,SAAA,CAAAkC,EAAA,IAACtC,EAAA,CACC,KAAK,SACL,QAAQ,UACR,QAAS,IAAM,CACbmC,EAAiB,EAAK,CACxB,EACD,SAAA,QAAA,CAED,EACAG,EAAAA,IAACtC,GAAO,KAAK,SAAS,SAAUmB,EAC7B,SAAAA,EAAqB,cAAgB,YACxC,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAAA,EACF,CAEJ","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- import{i as n}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{u as h}from"./use-enum-form-D7XmblPC.js";import{E as p}from"./enum-info-form-3ykREN-o.js";const{useBlockBeforeContinue:x}=await n("@baseplate-dev/project-builder-lib/web"),{Button:i,Dialog:f,DialogClose:j,DialogContent:g,DialogDescription:C,DialogFooter:b,DialogHeader:D,DialogTitle:E,DialogTrigger:S,SwitchFieldController:w,useControlledState:v}=await n("@baseplate-dev/ui-components");function O({children:t,open:a,onOpenChange:r}){const[l,s]=v(a,r,!1),{onSubmit:c,form:{control:o},isSavingDefinition:u}=h({isCreate:!0,onSubmitSuccess:()=>{s(!1)}}),m=x();return e.jsxs(f,{open:l,onOpenChange:d=>{d?m({onContinue:()=>{s(!0)}}):s(!1)},children:[e.jsx(S,{asChild:!0,children:t}),e.jsxs(g,{children:[e.jsxs(D,{children:[e.jsx(E,{children:"New Enum"}),e.jsx(C,{children:"Enums are a list of values that can be used in your data models."})]}),e.jsxs("form",{onSubmit:c,className:"space-y-4",children:[e.jsx(p,{control:o}),e.jsx(w,{label:"Expose in GraphQL schema",control:o,name:"isExposed",description:"Whether to expose this enum in the GraphQL schema"}),e.jsxs(b,{children:[e.jsx(j,{asChild:!0,children:e.jsx(i,{variant:"secondary",children:"Cancel"})}),e.jsx(i,{type:"submit",disabled:u,children:"Create Enum"})]})]})]})]})}export{O as N};
2
- //# sourceMappingURL=new-enum-dialog-8Ba41lUU.js.map
1
+ import{i as n}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{u as h}from"./use-enum-form-BRBAlWJc.js";import{E as p}from"./enum-info-form-3ykREN-o.js";const{useBlockBeforeContinue:x}=await n("@baseplate-dev/project-builder-lib/web"),{Button:i,Dialog:f,DialogClose:j,DialogContent:g,DialogDescription:C,DialogFooter:b,DialogHeader:D,DialogTitle:E,DialogTrigger:S,SwitchFieldController:w,useControlledState:v}=await n("@baseplate-dev/ui-components");function O({children:t,open:a,onOpenChange:r}){const[l,s]=v(a,r,!1),{onSubmit:c,form:{control:o},isSavingDefinition:u}=h({isCreate:!0,onSubmitSuccess:()=>{s(!1)}}),m=x();return e.jsxs(f,{open:l,onOpenChange:d=>{d?m({onContinue:()=>{s(!0)}}):s(!1)},children:[e.jsx(S,{asChild:!0,children:t}),e.jsxs(g,{children:[e.jsxs(D,{children:[e.jsx(E,{children:"New Enum"}),e.jsx(C,{children:"Enums are a list of values that can be used in your data models."})]}),e.jsxs("form",{onSubmit:c,className:"space-y-4",children:[e.jsx(p,{control:o}),e.jsx(w,{label:"Expose in GraphQL schema",control:o,name:"isExposed",description:"Whether to expose this enum in the GraphQL schema"}),e.jsxs(b,{children:[e.jsx(j,{asChild:!0,children:e.jsx(i,{variant:"secondary",children:"Cancel"})}),e.jsx(i,{type:"submit",disabled:u,children:"Create Enum"})]})]})]})]})}export{O as N};
2
+ //# sourceMappingURL=new-enum-dialog-B5zvBxhT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"new-enum-dialog-8Ba41lUU.js","sources":["../../src/routes/data/enums/-components/new-enum-dialog.tsx"],"sourcesContent":["import type React from 'react';\n\nimport { useBlockBeforeContinue } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n SwitchFieldController,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { useEnumForm } from '../-hooks/use-enum-form.js';\nimport { EnumInfoForm } from './enum-info-form.js';\n\ninterface NewEnumDialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function NewEnumDialog({\n children,\n open,\n onOpenChange,\n}: NewEnumDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n const {\n onSubmit,\n form: { control },\n isSavingDefinition,\n } = useEnumForm({\n isCreate: true,\n onSubmitSuccess: () => {\n setIsOpen(false);\n },\n });\n\n const blockBeforeContinue = useBlockBeforeContinue();\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(shouldOpen) => {\n if (shouldOpen) {\n blockBeforeContinue({\n onContinue: () => {\n setIsOpen(true);\n },\n });\n } else {\n setIsOpen(false);\n }\n }}\n >\n <DialogTrigger asChild>{children}</DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New Enum</DialogTitle>\n <DialogDescription>\n Enums are a list of values that can be used in your data models.\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <EnumInfoForm control={control} />\n <SwitchFieldController\n label=\"Expose in GraphQL schema\"\n control={control}\n name=\"isExposed\"\n description=\"Whether to expose this enum in the GraphQL schema\"\n />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" disabled={isSavingDefinition}>\n Create Enum\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"names":["useBlockBeforeContinue","importShared","Button","Dialog","DialogClose","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","SwitchFieldController","useControlledState","NewEnumDialog","children","open","onOpenChange","isOpen","setIsOpen","onSubmit","control","isSavingDefinition","useEnumForm","blockBeforeContinue","jsxs","shouldOpen","jsx","EnumInfoForm"],"mappings":"iNAEA,KAAA,CAAA,uBAAAA,CAAA,EAAA,MAAAC,EAAA,wCAAA,EACA,CAAA,OAAAC,EAAA,OAAAC,EAAA,YAAAC,EAAA,cAAAC,EAAA,kBAAAC,EAAA,aAAAC,EAAA,aAAAC,EAAA,YAAAC,EAAA,cAAAC,EAAA,sBAAAC,EAAA,mBAAAC,CAAA,EAAA,MAAAX,EAAA,8BAAA,EAuBO,SAASY,EAAc,CAC5B,SAAAC,EACA,KAAAC,EACA,aAAAC,CACF,EAA0C,CACxC,KAAM,CAACC,EAAQC,CAAS,EAAIN,EAAmBG,EAAMC,EAAc,EAAK,EAClE,CACJ,SAAAG,EACA,KAAM,CAAE,QAAAC,CAAQ,EAChB,mBAAAC,GACEC,EAAY,CACd,SAAU,GACV,gBAAiB,IAAM,CACrBJ,EAAU,EAAK,CAAA,CACjB,CACD,EAEKK,EAAsBvB,EAAuB,EAGjD,OAAAwB,EAAA,KAACrB,EAAA,CACC,KAAMc,EACN,aAAeQ,GAAe,CACxBA,EACkBF,EAAA,CAClB,WAAY,IAAM,CAChBL,EAAU,EAAI,CAAA,CAChB,CACD,EAEDA,EAAU,EAAK,CAEnB,EAEA,SAAA,CAACQ,EAAAA,IAAAhB,EAAA,CAAc,QAAO,GAAE,SAAAI,CAAS,CAAA,SAChCT,EACC,CAAA,SAAA,CAAAmB,OAAChB,EACC,CAAA,SAAA,CAAAkB,EAAAA,IAACjB,GAAY,SAAQ,UAAA,CAAA,EACrBiB,EAAAA,IAACpB,GAAkB,SAEnB,kEAAA,CAAA,CAAA,EACF,EACCkB,EAAA,KAAA,OAAA,CAAK,SAAAL,EAAoB,UAAU,YAClC,SAAA,CAAAO,MAACC,GAAa,QAAAP,EAAkB,EAChCM,EAAA,IAACf,EAAA,CACC,MAAM,2BACN,QAAAS,EACA,KAAK,YACL,YAAY,mDAAA,CACd,SACCb,EACC,CAAA,SAAA,CAACmB,EAAAA,IAAAtB,EAAA,CAAY,QAAO,GAClB,SAAAsB,EAAA,IAACxB,GAAO,QAAQ,YAAY,kBAAM,CACpC,CAAA,QACCA,EAAO,CAAA,KAAK,SAAS,SAAUmB,EAAoB,SAEpD,aAAA,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CAEJ"}
1
+ {"version":3,"file":"new-enum-dialog-B5zvBxhT.js","sources":["../../src/routes/data/enums/-components/new-enum-dialog.tsx"],"sourcesContent":["import type React from 'react';\n\nimport { useBlockBeforeContinue } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n SwitchFieldController,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { useEnumForm } from '../-hooks/use-enum-form.js';\nimport { EnumInfoForm } from './enum-info-form.js';\n\ninterface NewEnumDialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function NewEnumDialog({\n children,\n open,\n onOpenChange,\n}: NewEnumDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n const {\n onSubmit,\n form: { control },\n isSavingDefinition,\n } = useEnumForm({\n isCreate: true,\n onSubmitSuccess: () => {\n setIsOpen(false);\n },\n });\n\n const blockBeforeContinue = useBlockBeforeContinue();\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(shouldOpen) => {\n if (shouldOpen) {\n blockBeforeContinue({\n onContinue: () => {\n setIsOpen(true);\n },\n });\n } else {\n setIsOpen(false);\n }\n }}\n >\n <DialogTrigger asChild>{children}</DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New Enum</DialogTitle>\n <DialogDescription>\n Enums are a list of values that can be used in your data models.\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <EnumInfoForm control={control} />\n <SwitchFieldController\n label=\"Expose in GraphQL schema\"\n control={control}\n name=\"isExposed\"\n description=\"Whether to expose this enum in the GraphQL schema\"\n />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" disabled={isSavingDefinition}>\n Create Enum\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"names":["useBlockBeforeContinue","importShared","Button","Dialog","DialogClose","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","SwitchFieldController","useControlledState","NewEnumDialog","children","open","onOpenChange","isOpen","setIsOpen","onSubmit","control","isSavingDefinition","useEnumForm","blockBeforeContinue","jsxs","shouldOpen","jsx","EnumInfoForm"],"mappings":"iNAEA,KAAA,CAAA,uBAAAA,CAAA,EAAA,MAAAC,EAAA,wCAAA,EACA,CAAA,OAAAC,EAAA,OAAAC,EAAA,YAAAC,EAAA,cAAAC,EAAA,kBAAAC,EAAA,aAAAC,EAAA,aAAAC,EAAA,YAAAC,EAAA,cAAAC,EAAA,sBAAAC,EAAA,mBAAAC,CAAA,EAAA,MAAAX,EAAA,8BAAA,EAuBO,SAASY,EAAc,CAC5B,SAAAC,EACA,KAAAC,EACA,aAAAC,CACF,EAA0C,CACxC,KAAM,CAACC,EAAQC,CAAS,EAAIN,EAAmBG,EAAMC,EAAc,EAAK,EAClE,CACJ,SAAAG,EACA,KAAM,CAAE,QAAAC,CAAQ,EAChB,mBAAAC,GACEC,EAAY,CACd,SAAU,GACV,gBAAiB,IAAM,CACrBJ,EAAU,EAAK,CAAA,CACjB,CACD,EAEKK,EAAsBvB,EAAuB,EAGjD,OAAAwB,EAAA,KAACrB,EAAA,CACC,KAAMc,EACN,aAAeQ,GAAe,CACxBA,EACkBF,EAAA,CAClB,WAAY,IAAM,CAChBL,EAAU,EAAI,CAAA,CAChB,CACD,EAEDA,EAAU,EAAK,CAEnB,EAEA,SAAA,CAACQ,EAAAA,IAAAhB,EAAA,CAAc,QAAO,GAAE,SAAAI,CAAS,CAAA,SAChCT,EACC,CAAA,SAAA,CAAAmB,OAAChB,EACC,CAAA,SAAA,CAAAkB,EAAAA,IAACjB,GAAY,SAAQ,UAAA,CAAA,EACrBiB,EAAAA,IAACpB,GAAkB,SAEnB,kEAAA,CAAA,CAAA,EACF,EACCkB,EAAA,KAAA,OAAA,CAAK,SAAAL,EAAoB,UAAU,YAClC,SAAA,CAAAO,MAACC,GAAa,QAAAP,EAAkB,EAChCM,EAAA,IAACf,EAAA,CACC,MAAM,2BACN,QAAAS,EACA,KAAK,YACL,YAAY,mDAAA,CACd,SACCb,EACC,CAAA,SAAA,CAACmB,EAAAA,IAAAtB,EAAA,CAAY,QAAO,GAClB,SAAAsB,EAAA,IAACxB,GAAO,QAAQ,YAAY,kBAAM,CACpC,CAAA,QACCA,EAAO,CAAA,KAAK,SAAS,SAAUmB,EAAoB,SAEpD,aAAA,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{i as o}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{s as F}from"./index-BekC6gsX.js";import{b as S}from"./index.esm-CdP29Ssb.js";import{M as N}from"./model-info-form-koY65NLs.js";import{s as k}from"./sortBy-C9bvycg5.js";const{createModelBaseSchema:B,FeatureUtils:I,modelEntityType:y,modelScalarFieldEntityType:R}=await o("@baseplate-dev/project-builder-lib"),{useBlockBeforeContinue:E,useDefinitionSchema:O,useProjectDefinition:T}=await o("@baseplate-dev/project-builder-lib/web"),{Button:p,Dialog:L,DialogClose:U,DialogContent:$,DialogDescription:H,DialogFooter:K,DialogHeader:P,DialogTitle:V,DialogTrigger:W,useControlledState:q}=await o("@baseplate-dev/ui-components"),{useNavigate:z}=await o("@tanstack/react-router"),{useMemo:h}=await o("react");function g(){const a=R.generateNewId();return{id:y.generateNewId(),name:"",featureRef:"",service:{create:{enabled:!1},update:{enabled:!1},delete:{enabled:!1},transformers:[]},model:{primaryKeyFieldRefs:[a],fields:[{id:a,name:"id",type:"uuid",isOptional:!1,options:{default:"",genUuid:!0}}]}}}function _({children:a,open:b,onOpenChange:x}){const[j,i]=q(b,x,!1),{definition:l,saveDefinitionWithFeedback:d}=T(),M=O(B),w=h(()=>g(),[]),c=z(),{handleSubmit:u,reset:m,setError:f,control:D}=S({resolver:F(M),defaultValues:w}),C=h(()=>u(t=>{if(l.models.find(s=>s.name.toLowerCase()===t.name.toLowerCase())){f("name",{message:`Model with name ${t.name} already exists.`});return}return d(s=>{const r={...t};r.featureRef=I.ensureFeatureByNameRecursively(s,r.featureRef),s.models=k([...s.models.filter(n=>n.id!==r.id),r],[n=>n.name])},{successMessage:"Successfully created model!",onSuccess:()=>{c({to:"/data/models/edit/$key",params:{key:y.keyFromId(t.id)}}),m(g()),i(!1)}})}),[m,f,u,d,c,l,i]),v=E();return e.jsxs(L,{open:j,onOpenChange:t=>{t?v({onContinue:()=>{i(!0)}}):i(!1)},children:[e.jsx(W,{asChild:!0,children:a}),e.jsxs($,{children:[e.jsxs(P,{children:[e.jsx(V,{children:"New Model"}),e.jsx(H,{children:"Models define the structure of your data."})]}),e.jsxs("form",{onSubmit:C,className:"space-y-4",children:[e.jsx(N,{control:D}),e.jsxs(K,{children:[e.jsx(U,{asChild:!0,children:e.jsx(p,{variant:"secondary",children:"Cancel"})}),e.jsx(p,{type:"submit",children:"Create Model"})]})]})]})]})}export{_ as N};
2
- //# sourceMappingURL=new-model-dialog-CWgmV0pB.js.map
1
+ import{i as o}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{s as F}from"./index-DEKFCy0H.js";import{b as S}from"./index.esm-CdP29Ssb.js";import{M as N}from"./model-info-form-koY65NLs.js";import{s as k}from"./sortBy-C9bvycg5.js";const{createModelBaseSchema:B,FeatureUtils:I,modelEntityType:y,modelScalarFieldEntityType:R}=await o("@baseplate-dev/project-builder-lib"),{useBlockBeforeContinue:E,useDefinitionSchema:O,useProjectDefinition:T}=await o("@baseplate-dev/project-builder-lib/web"),{Button:p,Dialog:L,DialogClose:U,DialogContent:$,DialogDescription:H,DialogFooter:K,DialogHeader:P,DialogTitle:V,DialogTrigger:W,useControlledState:q}=await o("@baseplate-dev/ui-components"),{useNavigate:z}=await o("@tanstack/react-router"),{useMemo:h}=await o("react");function g(){const a=R.generateNewId();return{id:y.generateNewId(),name:"",featureRef:"",service:{create:{enabled:!1},update:{enabled:!1},delete:{enabled:!1},transformers:[]},model:{primaryKeyFieldRefs:[a],fields:[{id:a,name:"id",type:"uuid",isOptional:!1,options:{default:"",genUuid:!0}}]}}}function _({children:a,open:b,onOpenChange:x}){const[j,i]=q(b,x,!1),{definition:l,saveDefinitionWithFeedback:d}=T(),M=O(B),w=h(()=>g(),[]),c=z(),{handleSubmit:u,reset:m,setError:f,control:D}=S({resolver:F(M),defaultValues:w}),C=h(()=>u(t=>{if(l.models.find(s=>s.name.toLowerCase()===t.name.toLowerCase())){f("name",{message:`Model with name ${t.name} already exists.`});return}return d(s=>{const r={...t};r.featureRef=I.ensureFeatureByNameRecursively(s,r.featureRef),s.models=k([...s.models.filter(n=>n.id!==r.id),r],[n=>n.name])},{successMessage:"Successfully created model!",onSuccess:()=>{c({to:"/data/models/edit/$key",params:{key:y.keyFromId(t.id)}}),m(g()),i(!1)}})}),[m,f,u,d,c,l,i]),v=E();return e.jsxs(L,{open:j,onOpenChange:t=>{t?v({onContinue:()=>{i(!0)}}):i(!1)},children:[e.jsx(W,{asChild:!0,children:a}),e.jsxs($,{children:[e.jsxs(P,{children:[e.jsx(V,{children:"New Model"}),e.jsx(H,{children:"Models define the structure of your data."})]}),e.jsxs("form",{onSubmit:C,className:"space-y-4",children:[e.jsx(N,{control:D}),e.jsxs(K,{children:[e.jsx(U,{asChild:!0,children:e.jsx(p,{variant:"secondary",children:"Cancel"})}),e.jsx(p,{type:"submit",children:"Create Model"})]})]})]})]})}export{_ as N};
2
+ //# sourceMappingURL=new-model-dialog-CiwTpKcZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"new-model-dialog-CWgmV0pB.js","sources":["../../src/routes/data/models/-components/new-model-dialog.tsx"],"sourcesContent":["import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n createModelBaseSchema,\n FeatureUtils,\n modelEntityType,\n modelScalarFieldEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useBlockBeforeContinue,\n useDefinitionSchema,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useNavigate } from '@tanstack/react-router';\nimport { sortBy } from 'es-toolkit';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { ModelInfoForm } from '../edit.$key/-components/model-info-form.js';\n\ninterface NewModelDialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction createNewModel(): ModelConfigInput {\n const idFieldId = modelScalarFieldEntityType.generateNewId();\n return {\n id: modelEntityType.generateNewId(),\n name: '',\n featureRef: '',\n service: {\n create: { enabled: false },\n update: { enabled: false },\n delete: { enabled: false },\n transformers: [],\n },\n model: {\n primaryKeyFieldRefs: [idFieldId],\n fields: [\n {\n id: idFieldId,\n name: 'id',\n type: 'uuid',\n isOptional: false,\n options: {\n default: '',\n genUuid: true,\n },\n },\n ],\n },\n };\n}\n\nexport function NewModelDialog({\n children,\n open,\n onOpenChange,\n}: NewModelDialogProps): React.ReactElement {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n const { definition, saveDefinitionWithFeedback } = useProjectDefinition();\n // memoize it to keep the same key when resetting\n const baseModelSchema = useDefinitionSchema(createModelBaseSchema);\n\n const defaultValues = useMemo(() => createNewModel(), []);\n const navigate = useNavigate();\n\n const { handleSubmit, reset, setError, control } = useForm({\n resolver: zodResolver(baseModelSchema),\n defaultValues,\n });\n\n const onSubmit = useMemo(\n () =>\n handleSubmit((data) => {\n // check for models with the same name\n const existingModel = definition.models.find(\n (m) => m.name.toLowerCase() === data.name.toLowerCase(),\n );\n if (existingModel) {\n setError('name', {\n message: `Model with name ${data.name} already exists.`,\n });\n return;\n }\n\n return saveDefinitionWithFeedback(\n (draftConfig) => {\n // create feature if a new feature exists\n const updatedModel = { ...data };\n updatedModel.featureRef =\n FeatureUtils.ensureFeatureByNameRecursively(\n draftConfig,\n updatedModel.featureRef,\n );\n draftConfig.models = sortBy(\n [\n ...draftConfig.models.filter((m) => m.id !== updatedModel.id),\n updatedModel,\n ],\n [(m) => m.name],\n );\n },\n {\n successMessage: 'Successfully created model!',\n onSuccess: () => {\n navigate({\n to: '/data/models/edit/$key',\n params: { key: modelEntityType.keyFromId(data.id) },\n });\n reset(createNewModel());\n setIsOpen(false);\n },\n },\n );\n }),\n [\n reset,\n setError,\n handleSubmit,\n saveDefinitionWithFeedback,\n navigate,\n definition,\n setIsOpen,\n ],\n );\n\n const blockBeforeContinue = useBlockBeforeContinue();\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(shouldOpen) => {\n if (shouldOpen) {\n blockBeforeContinue({\n onContinue: () => {\n setIsOpen(true);\n },\n });\n } else {\n setIsOpen(false);\n }\n }}\n >\n <DialogTrigger asChild>{children}</DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New Model</DialogTitle>\n <DialogDescription>\n Models define the structure of your data.\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <ModelInfoForm control={control} />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\">Create Model</Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"names":["createModelBaseSchema","FeatureUtils","modelEntityType","modelScalarFieldEntityType","importShared","useBlockBeforeContinue","useDefinitionSchema","useProjectDefinition","Button","Dialog","DialogClose","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","useControlledState","useNavigate","useMemo","createNewModel","idFieldId","NewModelDialog","children","open","onOpenChange","isOpen","setIsOpen","definition","saveDefinitionWithFeedback","baseModelSchema","defaultValues","navigate","handleSubmit","reset","setError","control","useForm","zodResolver","onSubmit","data","m","draftConfig","updatedModel","sortBy","blockBeforeContinue","jsxs","shouldOpen","jsx","ModelInfoForm"],"mappings":"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"}
1
+ {"version":3,"file":"new-model-dialog-CiwTpKcZ.js","sources":["../../src/routes/data/models/-components/new-model-dialog.tsx"],"sourcesContent":["import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n createModelBaseSchema,\n FeatureUtils,\n modelEntityType,\n modelScalarFieldEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useBlockBeforeContinue,\n useDefinitionSchema,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useNavigate } from '@tanstack/react-router';\nimport { sortBy } from 'es-toolkit';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { ModelInfoForm } from '../edit.$key/-components/model-info-form.js';\n\ninterface NewModelDialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction createNewModel(): ModelConfigInput {\n const idFieldId = modelScalarFieldEntityType.generateNewId();\n return {\n id: modelEntityType.generateNewId(),\n name: '',\n featureRef: '',\n service: {\n create: { enabled: false },\n update: { enabled: false },\n delete: { enabled: false },\n transformers: [],\n },\n model: {\n primaryKeyFieldRefs: [idFieldId],\n fields: [\n {\n id: idFieldId,\n name: 'id',\n type: 'uuid',\n isOptional: false,\n options: {\n default: '',\n genUuid: true,\n },\n },\n ],\n },\n };\n}\n\nexport function NewModelDialog({\n children,\n open,\n onOpenChange,\n}: NewModelDialogProps): React.ReactElement {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n const { definition, saveDefinitionWithFeedback } = useProjectDefinition();\n // memoize it to keep the same key when resetting\n const baseModelSchema = useDefinitionSchema(createModelBaseSchema);\n\n const defaultValues = useMemo(() => createNewModel(), []);\n const navigate = useNavigate();\n\n const { handleSubmit, reset, setError, control } = useForm({\n resolver: zodResolver(baseModelSchema),\n defaultValues,\n });\n\n const onSubmit = useMemo(\n () =>\n handleSubmit((data) => {\n // check for models with the same name\n const existingModel = definition.models.find(\n (m) => m.name.toLowerCase() === data.name.toLowerCase(),\n );\n if (existingModel) {\n setError('name', {\n message: `Model with name ${data.name} already exists.`,\n });\n return;\n }\n\n return saveDefinitionWithFeedback(\n (draftConfig) => {\n // create feature if a new feature exists\n const updatedModel = { ...data };\n updatedModel.featureRef =\n FeatureUtils.ensureFeatureByNameRecursively(\n draftConfig,\n updatedModel.featureRef,\n );\n draftConfig.models = sortBy(\n [\n ...draftConfig.models.filter((m) => m.id !== updatedModel.id),\n updatedModel,\n ],\n [(m) => m.name],\n );\n },\n {\n successMessage: 'Successfully created model!',\n onSuccess: () => {\n navigate({\n to: '/data/models/edit/$key',\n params: { key: modelEntityType.keyFromId(data.id) },\n });\n reset(createNewModel());\n setIsOpen(false);\n },\n },\n );\n }),\n [\n reset,\n setError,\n handleSubmit,\n saveDefinitionWithFeedback,\n navigate,\n definition,\n setIsOpen,\n ],\n );\n\n const blockBeforeContinue = useBlockBeforeContinue();\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(shouldOpen) => {\n if (shouldOpen) {\n blockBeforeContinue({\n onContinue: () => {\n setIsOpen(true);\n },\n });\n } else {\n setIsOpen(false);\n }\n }}\n >\n <DialogTrigger asChild>{children}</DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New Model</DialogTitle>\n <DialogDescription>\n Models define the structure of your data.\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <ModelInfoForm control={control} />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\">Create Model</Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"names":["createModelBaseSchema","FeatureUtils","modelEntityType","modelScalarFieldEntityType","importShared","useBlockBeforeContinue","useDefinitionSchema","useProjectDefinition","Button","Dialog","DialogClose","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","useControlledState","useNavigate","useMemo","createNewModel","idFieldId","NewModelDialog","children","open","onOpenChange","isOpen","setIsOpen","definition","saveDefinitionWithFeedback","baseModelSchema","defaultValues","navigate","handleSubmit","reset","setError","control","useForm","zodResolver","onSubmit","data","m","draftConfig","updatedModel","sortBy","blockBeforeContinue","jsxs","shouldOpen","jsx","ModelInfoForm"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i as a}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{A as n}from"./index-tflukq04.js";import{N as r}from"./new-app-dialog-nUBoX5fs.js";import{s as c}from"./sortBy-C9bvycg5.js";const{appEntityType:d}=await a("@baseplate-dev/project-builder-lib"),{useProjectDefinition:l}=await a("@baseplate-dev/project-builder-lib/web"),{Button:p,NavigationMenu:m,NavigationMenuItemWithLink:u,NavigationMenuList:x,SidebarLayout:j,SidebarLayoutContent:h,SidebarLayoutSidebar:b}=await a("@baseplate-dev/ui-components"),{Link:f,Outlet:y}=await a("@tanstack/react-router"),S=function(){const{definition:i}=l(),{apps:s}=i,o=c(s,[t=>t.name]);return e.jsxs(j,{className:"flex-1",children:[e.jsxs(b,{className:"space-y-4",width:"sm",children:[e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx(r,{children:e.jsxs(p,{variant:"secondary",className:"w-full",children:[e.jsx(n,{}),"New App"]})})}),e.jsx(m,{orientation:"vertical",children:e.jsx(x,{children:o.map(t=>e.jsx(u,{asChild:!0,children:e.jsx(f,{to:"/apps/edit/$key",params:{key:d.keyFromId(t.id)},children:t.name})},t.id))})})]}),e.jsx(h,{children:e.jsx(y,{})})]})};export{S as component};
2
- //# sourceMappingURL=route-DM37J86t.js.map
1
+ import{i as a}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{A as n}from"./index-tflukq04.js";import{N as r}from"./new-app-dialog-CCI4q4Mt.js";import{s as c}from"./sortBy-C9bvycg5.js";const{appEntityType:d}=await a("@baseplate-dev/project-builder-lib"),{useProjectDefinition:l}=await a("@baseplate-dev/project-builder-lib/web"),{Button:p,NavigationMenu:m,NavigationMenuItemWithLink:u,NavigationMenuList:x,SidebarLayout:j,SidebarLayoutContent:h,SidebarLayoutSidebar:b}=await a("@baseplate-dev/ui-components"),{Link:f,Outlet:y}=await a("@tanstack/react-router"),S=function(){const{definition:i}=l(),{apps:s}=i,o=c(s,[t=>t.name]);return e.jsxs(j,{className:"flex-1",children:[e.jsxs(b,{className:"space-y-4",width:"sm",children:[e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx(r,{children:e.jsxs(p,{variant:"secondary",className:"w-full",children:[e.jsx(n,{}),"New App"]})})}),e.jsx(m,{orientation:"vertical",children:e.jsx(x,{children:o.map(t=>e.jsx(u,{asChild:!0,children:e.jsx(f,{to:"/apps/edit/$key",params:{key:d.keyFromId(t.id)},children:t.name})},t.id))})})]}),e.jsx(h,{children:e.jsx(y,{})})]})};export{S as component};
2
+ //# sourceMappingURL=route-6ErXC2Qt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-DM37J86t.js","sources":["../../src/routes/apps/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { appEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\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';\nimport { MdAdd } from 'react-icons/md';\n\nimport NewAppDialog from './-components/new-app-dialog.js';\n\nexport const Route = createFileRoute('/apps')({\n component: AppsLayout,\n beforeLoad: () => ({\n getTitle: () => 'Apps',\n }),\n});\n\nfunction AppsLayout(): React.JSX.Element {\n const { definition } = useProjectDefinition();\n\n const { apps } = definition;\n const sortedApps = sortBy(apps, [(app) => app.name]);\n\n return (\n <SidebarLayout className=\"flex-1\">\n <SidebarLayoutSidebar className=\"space-y-4\" width=\"sm\">\n <div className=\"flex flex-col gap-4\">\n <NewAppDialog>\n <Button variant=\"secondary\" className=\"w-full\">\n <MdAdd />\n New App\n </Button>\n </NewAppDialog>\n </div>\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {sortedApps.map((app) => (\n <NavigationMenuItemWithLink key={app.id} asChild>\n <Link\n to=\"/apps/edit/$key\"\n params={{ key: appEntityType.keyFromId(app.id) }}\n >\n {app.name}\n </Link>\n </NavigationMenuItemWithLink>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </SidebarLayoutSidebar>\n <SidebarLayoutContent>\n <Outlet />\n </SidebarLayoutContent>\n </SidebarLayout>\n );\n}\n"],"names":["appEntityType","importShared","useProjectDefinition","Button","NavigationMenu","NavigationMenuItemWithLink","NavigationMenuList","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","Link","Outlet","SplitComponent","definition","apps","sortedApps","sortBy","app","name","jsxs","jsx","NewAppDialog","MdAdd","map","key","keyFromId","id"],"mappings":"kPAEA,KAAA,CAAA,cAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EACA,CAAA,qBAAAC,CAAA,EAAA,MAAAD,EAAA,wCAAA,EACA,CAAA,OAAAE,EAAA,eAAAC,EAAA,2BAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,qBAAAC,CAAA,EAAA,MAAAR,EAAA,8BAAA,EASA,CAAA,KAAAS,EAAA,OAAAC,CAAA,EAAA,MAAAV,EAAA,wBAAA,EAI2DW,EAAA,UASlB,CACjC,KAAA,CAAEC,WAAAA,GAAeX,EAAqB,EAEtC,CAAEY,KAAAA,CAAAA,EAASD,EACXE,EAAaC,EAAOF,EAAM,CAAUG,GAAAA,EAAIC,IAAI,CAAC,EAGjD,OAAAC,EAAA,KAACZ,EAAc,CAAA,UAAU,SACvB,SAAA,CAAAY,EAAA,KAACV,EAAqB,CAAA,UAAU,YAAY,MAAM,KAChD,SAAA,CAACW,EAAA,IAAA,MAAA,CAAI,UAAU,sBACb,SAACA,EAAA,IAAAC,EAAA,CACC,gBAAClB,EAAO,CAAA,QAAQ,YAAY,UAAU,SACpC,SAAA,CAAAiB,EAAA,IAACE,EAAK,EAAA,EAAA,SAAA,CAER,CAAA,CACF,CAAA,EACF,QACClB,EAAe,CAAA,YAAY,WAC1B,SAAAgB,EAAA,IAACd,GACES,SAAWQ,EAAAA,IACVN,GAAAG,EAAAA,IAACf,GAAwC,QAAO,GAC9C,eAACK,EACC,CAAA,GAAG,kBACH,OAAQ,CAAEc,IAAKxB,EAAcyB,UAAUR,EAAIS,EAAE,CAAA,EAE5CT,WAAIC,IACP,CAAA,CAAA,EAN+BD,EAAIS,EAOrC,CACD,EACH,CACF,CAAA,CAAA,EACF,EACCN,EAAA,IAAAZ,EAAA,CACC,SAACY,EAAAA,IAAAT,EAAA,CAAA,CAAM,CACT,CAAA,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"route-6ErXC2Qt.js","sources":["../../src/routes/apps/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { appEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\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';\nimport { MdAdd } from 'react-icons/md';\n\nimport NewAppDialog from './-components/new-app-dialog.js';\n\nexport const Route = createFileRoute('/apps')({\n component: AppsLayout,\n beforeLoad: () => ({\n getTitle: () => 'Apps',\n }),\n});\n\nfunction AppsLayout(): React.JSX.Element {\n const { definition } = useProjectDefinition();\n\n const { apps } = definition;\n const sortedApps = sortBy(apps, [(app) => app.name]);\n\n return (\n <SidebarLayout className=\"flex-1\">\n <SidebarLayoutSidebar className=\"space-y-4\" width=\"sm\">\n <div className=\"flex flex-col gap-4\">\n <NewAppDialog>\n <Button variant=\"secondary\" className=\"w-full\">\n <MdAdd />\n New App\n </Button>\n </NewAppDialog>\n </div>\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {sortedApps.map((app) => (\n <NavigationMenuItemWithLink key={app.id} asChild>\n <Link\n to=\"/apps/edit/$key\"\n params={{ key: appEntityType.keyFromId(app.id) }}\n >\n {app.name}\n </Link>\n </NavigationMenuItemWithLink>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </SidebarLayoutSidebar>\n <SidebarLayoutContent>\n <Outlet />\n </SidebarLayoutContent>\n </SidebarLayout>\n );\n}\n"],"names":["appEntityType","importShared","useProjectDefinition","Button","NavigationMenu","NavigationMenuItemWithLink","NavigationMenuList","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","Link","Outlet","SplitComponent","definition","apps","sortedApps","sortBy","app","name","jsxs","jsx","NewAppDialog","MdAdd","map","key","keyFromId","id"],"mappings":"kPAEA,KAAA,CAAA,cAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EACA,CAAA,qBAAAC,CAAA,EAAA,MAAAD,EAAA,wCAAA,EACA,CAAA,OAAAE,EAAA,eAAAC,EAAA,2BAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,qBAAAC,CAAA,EAAA,MAAAR,EAAA,8BAAA,EASA,CAAA,KAAAS,EAAA,OAAAC,CAAA,EAAA,MAAAV,EAAA,wBAAA,EAI2DW,EAAA,UASlB,CACjC,KAAA,CAAEC,WAAAA,GAAeX,EAAqB,EAEtC,CAAEY,KAAAA,CAAAA,EAASD,EACXE,EAAaC,EAAOF,EAAM,CAAUG,GAAAA,EAAIC,IAAI,CAAC,EAGjD,OAAAC,EAAA,KAACZ,EAAc,CAAA,UAAU,SACvB,SAAA,CAAAY,EAAA,KAACV,EAAqB,CAAA,UAAU,YAAY,MAAM,KAChD,SAAA,CAACW,EAAA,IAAA,MAAA,CAAI,UAAU,sBACb,SAACA,EAAA,IAAAC,EAAA,CACC,gBAAClB,EAAO,CAAA,QAAQ,YAAY,UAAU,SACpC,SAAA,CAAAiB,EAAA,IAACE,EAAK,EAAA,EAAA,SAAA,CAER,CAAA,CACF,CAAA,EACF,QACClB,EAAe,CAAA,YAAY,WAC1B,SAAAgB,EAAA,IAACd,GACES,SAAWQ,EAAAA,IACVN,GAAAG,EAAAA,IAACf,GAAwC,QAAO,GAC9C,eAACK,EACC,CAAA,GAAG,kBACH,OAAQ,CAAEc,IAAKxB,EAAcyB,UAAUR,EAAIS,EAAE,CAAA,EAE5CT,WAAIC,IACP,CAAA,CAAA,EAN+BD,EAAIS,EAOrC,CACD,EACH,CACF,CAAA,CAAA,EACF,EACCN,EAAA,IAAAZ,EAAA,CACC,SAACY,EAAAA,IAAAT,EAAA,CAAA,CAAM,CACT,CAAA,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{i}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{a as g}from"./index-BekC6gsX.js";import{c as u,A as b,B as y}from"./index-tflukq04.js";import{N as S}from"./new-enum-dialog-8Ba41lUU.js";import{s as w}from"./sortBy-C9bvycg5.js";import{N as L}from"./new-model-dialog-CWgmV0pB.js";function k(c,o){let a=c[0],n=-1/0;for(let r=0;r<c.length;r++){const l=c[r],s=o(l);s>n&&(n=s,a=l)}return a}const{modelEnumEntityType:C}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:M}=await i("@baseplate-dev/project-builder-lib/web"),{Button:h,InputField:$,NavigationMenu:E,NavigationMenuItemWithLink:I,NavigationMenuList:T,ScrollArea:A}=await i("@baseplate-dev/ui-components"),{Link:B}=await i("@tanstack/react-router"),{useState:x}=await i("react");function F({className:c}){const{definition:{enums:o=[]}}=M(),[a,n]=x(""),r=o.filter(t=>t.name.toLowerCase().includes(a.toLowerCase())),l=w(r,[t=>t.name]),[s,m]=x(!1);return e.jsxs("div",{className:u(c,"flex flex-1 flex-col space-y-4 overflow-y-auto"),children:[e.jsxs("div",{className:"space-y-4 px-4",children:[e.jsx(S,{children:e.jsxs(h,{variant:"secondary",className:"w-full",children:[e.jsx(b,{}),"New Enum"]})}),o.length>0&&e.jsxs("div",{className:"relative",children:[e.jsx($,{value:a,onChange:t=>{n(t)},placeholder:"Search"}),a&&e.jsx(h,{variant:"ghost",className:"absolute top-1/2 right-4 -translate-y-1/2",size:"icon",onClick:()=>{n("")},children:e.jsx(y,{})})]})]}),e.jsxs(A,{className:u("flex-1 px-2",s&&"border-t"),onScrollCapture:t=>{const d=t.currentTarget.scrollTop>0;d!==s&&m(d)},children:[l.length===0&&a&&e.jsx("div",{className:"py-4 text-center text-style-muted",children:"No enums found"}),e.jsx(E,{orientation:"vertical",children:e.jsx(T,{children:l.map(t=>e.jsx("li",{children:e.jsx(I,{asChild:!0,children:e.jsx(B,{to:"/data/enums/edit/$key",params:{key:C.keyFromId(t.id)},children:t.name})})},t.id))})})]})]})}const{modelEntityType:D}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:P}=await i("@baseplate-dev/project-builder-lib/web"),{Button:p,InputField:W,NavigationMenu:Q,NavigationMenuItemWithLink:z,NavigationMenuList:R,ScrollArea:O}=await i("@baseplate-dev/ui-components"),{Link:q}=await i("@tanstack/react-router"),{useState:j}=await i("react");function G({className:c}){const{definition:{models:o}}=P(),[a,n]=j(""),r=o.filter(t=>t.name.toLowerCase().includes(a.toLowerCase())),l=w(r,[t=>t.name]),[s,m]=j(!1);return e.jsxs("div",{className:u(c,"flex flex-1 flex-col space-y-4 overflow-y-auto"),children:[e.jsxs("div",{className:"space-y-4 px-4",children:[e.jsx(L,{children:e.jsxs(p,{variant:"secondary",className:"w-full",children:[e.jsx(b,{}),"New Model"]})}),o.length>0&&e.jsxs("div",{className:"relative",children:[e.jsx(W,{value:a,onChange:t=>{n(t)},placeholder:"Search"}),a&&e.jsx(p,{variant:"ghost",className:"absolute top-1/2 right-4 -translate-y-1/2",onClick:()=>{n("")},size:"icon",children:e.jsx(y,{})})]})]}),e.jsxs(O,{className:u("flex-1 px-2",s&&"border-t"),onScrollCapture:t=>{const d=t.currentTarget.scrollTop>0;d!==s&&m(d)},children:[l.length===0&&a&&e.jsx("div",{className:"py-4 text-center text-style-muted",children:"No models found"}),e.jsx(Q,{orientation:"vertical",children:e.jsx(R,{children:l.map(t=>e.jsx(z,{asChild:!0,children:e.jsx(q,{to:"/data/models/edit/$key",params:{key:D.keyFromId(t.id)},children:t.name})},t.id))})})]})]})}const{useProjectDefinition:H}=await i("@baseplate-dev/project-builder-lib/web"),{NavigationTabs:J,NavigationTabsItem:f,SidebarLayout:K,SidebarLayoutContent:U,SidebarLayoutSidebar:V}=await i("@baseplate-dev/ui-components"),{Link:v,Outlet:X,useRouterState:N}=await i("@tanstack/react-router"),ie=function(){const{definition:{models:o=[],enums:a=[]}}=H(),n=k([...o,...a],s=>s.name.length)?.name,r=N({select:s=>s.location.pathname.startsWith("/data/models")}),l=N({select:s=>s.location.pathname.startsWith("/data/enums")});return e.jsxs(K,{className:"flex-1",children:[e.jsxs(V,{className:"flex h-[calc(100vh-var(--topbar-height)-1px)] max-w-sm min-w-[230px] flex-col space-y-4",width:"auto",noPadding:!0,children:[e.jsx("div",{className:"invisible block h-1 overflow-hidden font-semibold text-transparent",children:n}),e.jsx("div",{className:"px-4",children:e.jsxs(J,{className:"w-full",children:[e.jsx(f,{asChild:!0,children:e.jsx(v,{to:"/data/models",children:"Models"})}),e.jsx(f,{asChild:!0,children:e.jsx(v,{to:"/data/enums",children:"Enums"})})]})}),r?e.jsx(G,{}):null,l?e.jsx(F,{}):null]}),e.jsx(U,{className:"h-[calc(100vh-var(--topbar-height)-1px)]",children:e.jsx(g,{children:e.jsx(X,{})})})]})};export{ie as component};
2
- //# sourceMappingURL=route-DuhBcukV.js.map
1
+ import{i}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{a as g}from"./index-DEKFCy0H.js";import{c as u,A as b,B as y}from"./index-tflukq04.js";import{N as S}from"./new-enum-dialog-B5zvBxhT.js";import{s as w}from"./sortBy-C9bvycg5.js";import{N as L}from"./new-model-dialog-CiwTpKcZ.js";function k(c,o){let a=c[0],n=-1/0;for(let r=0;r<c.length;r++){const l=c[r],s=o(l);s>n&&(n=s,a=l)}return a}const{modelEnumEntityType:C}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:M}=await i("@baseplate-dev/project-builder-lib/web"),{Button:h,InputField:$,NavigationMenu:E,NavigationMenuItemWithLink:I,NavigationMenuList:T,ScrollArea:A}=await i("@baseplate-dev/ui-components"),{Link:B}=await i("@tanstack/react-router"),{useState:x}=await i("react");function F({className:c}){const{definition:{enums:o=[]}}=M(),[a,n]=x(""),r=o.filter(t=>t.name.toLowerCase().includes(a.toLowerCase())),l=w(r,[t=>t.name]),[s,m]=x(!1);return e.jsxs("div",{className:u(c,"flex flex-1 flex-col space-y-4 overflow-y-auto"),children:[e.jsxs("div",{className:"space-y-4 px-4",children:[e.jsx(S,{children:e.jsxs(h,{variant:"secondary",className:"w-full",children:[e.jsx(b,{}),"New Enum"]})}),o.length>0&&e.jsxs("div",{className:"relative",children:[e.jsx($,{value:a,onChange:t=>{n(t)},placeholder:"Search"}),a&&e.jsx(h,{variant:"ghost",className:"absolute top-1/2 right-4 -translate-y-1/2",size:"icon",onClick:()=>{n("")},children:e.jsx(y,{})})]})]}),e.jsxs(A,{className:u("flex-1 px-2",s&&"border-t"),onScrollCapture:t=>{const d=t.currentTarget.scrollTop>0;d!==s&&m(d)},children:[l.length===0&&a&&e.jsx("div",{className:"py-4 text-center text-style-muted",children:"No enums found"}),e.jsx(E,{orientation:"vertical",children:e.jsx(T,{children:l.map(t=>e.jsx("li",{children:e.jsx(I,{asChild:!0,children:e.jsx(B,{to:"/data/enums/edit/$key",params:{key:C.keyFromId(t.id)},children:t.name})})},t.id))})})]})]})}const{modelEntityType:D}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:P}=await i("@baseplate-dev/project-builder-lib/web"),{Button:p,InputField:W,NavigationMenu:Q,NavigationMenuItemWithLink:z,NavigationMenuList:R,ScrollArea:O}=await i("@baseplate-dev/ui-components"),{Link:q}=await i("@tanstack/react-router"),{useState:j}=await i("react");function G({className:c}){const{definition:{models:o}}=P(),[a,n]=j(""),r=o.filter(t=>t.name.toLowerCase().includes(a.toLowerCase())),l=w(r,[t=>t.name]),[s,m]=j(!1);return e.jsxs("div",{className:u(c,"flex flex-1 flex-col space-y-4 overflow-y-auto"),children:[e.jsxs("div",{className:"space-y-4 px-4",children:[e.jsx(L,{children:e.jsxs(p,{variant:"secondary",className:"w-full",children:[e.jsx(b,{}),"New Model"]})}),o.length>0&&e.jsxs("div",{className:"relative",children:[e.jsx(W,{value:a,onChange:t=>{n(t)},placeholder:"Search"}),a&&e.jsx(p,{variant:"ghost",className:"absolute top-1/2 right-4 -translate-y-1/2",onClick:()=>{n("")},size:"icon",children:e.jsx(y,{})})]})]}),e.jsxs(O,{className:u("flex-1 px-2",s&&"border-t"),onScrollCapture:t=>{const d=t.currentTarget.scrollTop>0;d!==s&&m(d)},children:[l.length===0&&a&&e.jsx("div",{className:"py-4 text-center text-style-muted",children:"No models found"}),e.jsx(Q,{orientation:"vertical",children:e.jsx(R,{children:l.map(t=>e.jsx(z,{asChild:!0,children:e.jsx(q,{to:"/data/models/edit/$key",params:{key:D.keyFromId(t.id)},children:t.name})},t.id))})})]})]})}const{useProjectDefinition:H}=await i("@baseplate-dev/project-builder-lib/web"),{NavigationTabs:J,NavigationTabsItem:f,SidebarLayout:K,SidebarLayoutContent:U,SidebarLayoutSidebar:V}=await i("@baseplate-dev/ui-components"),{Link:v,Outlet:X,useRouterState:N}=await i("@tanstack/react-router"),ie=function(){const{definition:{models:o=[],enums:a=[]}}=H(),n=k([...o,...a],s=>s.name.length)?.name,r=N({select:s=>s.location.pathname.startsWith("/data/models")}),l=N({select:s=>s.location.pathname.startsWith("/data/enums")});return e.jsxs(K,{className:"flex-1",children:[e.jsxs(V,{className:"flex h-[calc(100vh-var(--topbar-height)-1px)] max-w-sm min-w-[230px] flex-col space-y-4",width:"auto",noPadding:!0,children:[e.jsx("div",{className:"invisible block h-1 overflow-hidden font-semibold text-transparent",children:n}),e.jsx("div",{className:"px-4",children:e.jsxs(J,{className:"w-full",children:[e.jsx(f,{asChild:!0,children:e.jsx(v,{to:"/data/models",children:"Models"})}),e.jsx(f,{asChild:!0,children:e.jsx(v,{to:"/data/enums",children:"Enums"})})]})}),r?e.jsx(G,{}):null,l?e.jsx(F,{}):null]}),e.jsx(U,{className:"h-[calc(100vh-var(--topbar-height)-1px)]",children:e.jsx(g,{children:e.jsx(X,{})})})]})};export{ie as component};
2
+ //# sourceMappingURL=route-C3eBLQEr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-DuhBcukV.js","sources":["../../../../node_modules/.pnpm/es-toolkit@1.31.0/node_modules/es-toolkit/dist/array/maxBy.mjs","../../src/routes/data/enums/-components/enums-sidebar-list.tsx","../../src/routes/data/models/-components/models-sidebar-list.tsx","../../src/routes/data/route.tsx?tsr-split=component"],"sourcesContent":["function maxBy(items, getValue) {\n let maxElement = items[0];\n let max = -Infinity;\n for (let i = 0; i < items.length; i++) {\n const element = items[i];\n const value = getValue(element);\n if (value > max) {\n max = value;\n maxElement = element;\n }\n }\n return maxElement;\n}\n\nexport { maxBy };\n","import type React from 'react';\n\nimport { modelEnumEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n InputField,\n NavigationMenu,\n NavigationMenuItemWithLink,\n NavigationMenuList,\n ScrollArea,\n} from '@baseplate-dev/ui-components';\nimport { Link } from '@tanstack/react-router';\nimport clsx from 'clsx';\nimport { sortBy } from 'es-toolkit';\nimport { useState } from 'react';\nimport { MdAdd, MdClear } from 'react-icons/md';\n\nimport { NewEnumDialog } from './new-enum-dialog.js';\n\ninterface EnumsSidebarListProps {\n className?: string;\n}\n\nexport function EnumsSidebarList({\n className,\n}: EnumsSidebarListProps): React.JSX.Element {\n const {\n definition: { enums = [] },\n } = useProjectDefinition();\n\n const [filterQuery, setFilterQuery] = useState('');\n const filteredEnums = enums.filter((item) =>\n item.name.toLowerCase().includes(filterQuery.toLowerCase()),\n );\n\n const sortedEnums = sortBy(filteredEnums, [(m) => m.name]);\n\n const [isScrolled, setIsScrolled] = useState(false);\n\n return (\n <div\n className={clsx(\n className,\n 'flex flex-1 flex-col space-y-4 overflow-y-auto',\n )}\n >\n <div className=\"space-y-4 px-4\">\n <NewEnumDialog>\n <Button variant=\"secondary\" className=\"w-full\">\n <MdAdd />\n New Enum\n </Button>\n </NewEnumDialog>\n {enums.length > 0 && (\n <div className=\"relative\">\n <InputField\n value={filterQuery}\n onChange={(text) => {\n setFilterQuery(text);\n }}\n placeholder=\"Search\"\n />\n {filterQuery && (\n <Button\n variant=\"ghost\"\n className=\"absolute top-1/2 right-4 -translate-y-1/2\"\n size=\"icon\"\n onClick={() => {\n setFilterQuery('');\n }}\n >\n <MdClear />\n </Button>\n )}\n </div>\n )}\n </div>\n\n <ScrollArea\n className={clsx('flex-1 px-2', isScrolled && 'border-t')}\n onScrollCapture={(e) => {\n const hasScrolled = e.currentTarget.scrollTop > 0;\n if (hasScrolled !== isScrolled) {\n setIsScrolled(hasScrolled);\n }\n }}\n >\n {sortedEnums.length === 0 && filterQuery && (\n <div className=\"py-4 text-center text-style-muted\">\n No enums found\n </div>\n )}\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {sortedEnums.map((enumDef) => (\n <li key={enumDef.id}>\n <NavigationMenuItemWithLink asChild>\n <Link\n to=\"/data/enums/edit/$key\"\n params={{ key: modelEnumEntityType.keyFromId(enumDef.id) }}\n >\n {enumDef.name}\n </Link>\n </NavigationMenuItemWithLink>\n </li>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </ScrollArea>\n </div>\n );\n}\n","import type React from 'react';\n\nimport { modelEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n InputField,\n NavigationMenu,\n NavigationMenuItemWithLink,\n NavigationMenuList,\n ScrollArea,\n} from '@baseplate-dev/ui-components';\nimport { Link } from '@tanstack/react-router';\nimport clsx from 'clsx';\nimport { sortBy } from 'es-toolkit';\nimport { useState } from 'react';\nimport { MdAdd, MdClear } from 'react-icons/md';\n\nimport { NewModelDialog } from './new-model-dialog.js';\n\ninterface ModelsSidebarListProps {\n className?: string;\n}\n\nexport function ModelsSidebarList({\n className,\n}: ModelsSidebarListProps): React.JSX.Element {\n const {\n definition: { models },\n } = useProjectDefinition();\n\n const [filterQuery, setFilterQuery] = useState('');\n const filteredModels = models.filter((model) =>\n model.name.toLowerCase().includes(filterQuery.toLowerCase()),\n );\n\n const sortedModels = sortBy(filteredModels, [(m) => m.name]);\n\n const [isScrolled, setIsScrolled] = useState(false);\n\n return (\n <div\n className={clsx(\n className,\n 'flex flex-1 flex-col space-y-4 overflow-y-auto',\n )}\n >\n <div className=\"space-y-4 px-4\">\n <NewModelDialog>\n <Button variant=\"secondary\" className=\"w-full\">\n <MdAdd />\n New Model\n </Button>\n </NewModelDialog>\n {models.length > 0 && (\n <div className=\"relative\">\n <InputField\n value={filterQuery}\n onChange={(text) => {\n setFilterQuery(text);\n }}\n placeholder=\"Search\"\n />\n {filterQuery && (\n <Button\n variant=\"ghost\"\n className=\"absolute top-1/2 right-4 -translate-y-1/2\"\n onClick={() => {\n setFilterQuery('');\n }}\n size=\"icon\"\n >\n <MdClear />\n </Button>\n )}\n </div>\n )}\n </div>\n\n <ScrollArea\n className={clsx('flex-1 px-2', isScrolled && 'border-t')}\n onScrollCapture={(e) => {\n const hasScrolled = e.currentTarget.scrollTop > 0;\n if (hasScrolled !== isScrolled) {\n setIsScrolled(hasScrolled);\n }\n }}\n >\n {sortedModels.length === 0 && filterQuery && (\n <div className=\"py-4 text-center text-style-muted\">\n No models found\n </div>\n )}\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {sortedModels.map((model) => (\n <NavigationMenuItemWithLink key={model.id} asChild>\n <Link\n to=\"/data/models/edit/$key\"\n params={{ key: modelEntityType.keyFromId(model.id) }}\n >\n {model.name}\n </Link>\n </NavigationMenuItemWithLink>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </ScrollArea>\n </div>\n );\n}\n","import type React from 'react';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n NavigationTabs,\n NavigationTabsItem,\n SidebarLayout,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n Link,\n Outlet,\n useRouterState,\n} from '@tanstack/react-router';\nimport { maxBy } from 'es-toolkit';\n\nimport { ErrorBoundary } from '#src/components/error-boundary/error-boundary.js';\n\nimport { EnumsSidebarList } from './enums/-components/enums-sidebar-list.js';\nimport { ModelsSidebarList } from './models/-components/models-sidebar-list.js';\n\nexport const Route = createFileRoute('/data')({\n component: DataLayout,\n});\n\nfunction DataLayout(): React.JSX.Element {\n const {\n definition: { models = [], enums = [] },\n } = useProjectDefinition();\n\n const longestName = maxBy([...models, ...enums], (m) => m.name.length)?.name;\n\n const modelsActive = useRouterState({\n select: (state) => state.location.pathname.startsWith('/data/models'),\n });\n const enumsActive = useRouterState({\n select: (state) => state.location.pathname.startsWith('/data/enums'),\n });\n\n return (\n <SidebarLayout className=\"flex-1\">\n <SidebarLayoutSidebar\n className=\"flex h-[calc(100vh-var(--topbar-height)-1px)] max-w-sm min-w-[230px] flex-col space-y-4\"\n width=\"auto\"\n noPadding\n >\n {/* Allows us to ensure the width doesn't change when selected is semi-bold or search filter is active */}\n <div className=\"invisible block h-1 overflow-hidden font-semibold text-transparent\">\n {longestName}\n </div>\n <div className=\"px-4\">\n <NavigationTabs className=\"w-full\">\n <NavigationTabsItem asChild>\n <Link to=\"/data/models\">Models</Link>\n </NavigationTabsItem>\n <NavigationTabsItem asChild>\n <Link to=\"/data/enums\">Enums</Link>\n </NavigationTabsItem>\n </NavigationTabs>\n </div>\n {modelsActive ? <ModelsSidebarList /> : null}\n {enumsActive ? <EnumsSidebarList /> : null}\n </SidebarLayoutSidebar>\n <SidebarLayoutContent className=\"h-[calc(100vh-var(--topbar-height)-1px)]\">\n <ErrorBoundary>\n <Outlet />\n </ErrorBoundary>\n </SidebarLayoutContent>\n </SidebarLayout>\n );\n}\n"],"names":["maxBy","items","getValue","maxElement","max","i","element","value","modelEnumEntityType","importShared","useProjectDefinition","Button","InputField","NavigationMenu","NavigationMenuItemWithLink","NavigationMenuList","ScrollArea","Link","useState","EnumsSidebarList","className","enums","filterQuery","setFilterQuery","filteredEnums","item","sortedEnums","sortBy","m","isScrolled","setIsScrolled","jsxs","clsx","jsx","NewEnumDialog","MdAdd","text","MdClear","e","hasScrolled","enumDef","modelEntityType","ModelsSidebarList","models","filteredModels","model","sortedModels","NewModelDialog","NavigationTabs","NavigationTabsItem","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","Outlet","useRouterState","SplitComponent","definition","longestName","name","length","modelsActive","select","state","location","pathname","startsWith","enumsActive","ErrorBoundary"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"route-C3eBLQEr.js","sources":["../../../../node_modules/.pnpm/es-toolkit@1.31.0/node_modules/es-toolkit/dist/array/maxBy.mjs","../../src/routes/data/enums/-components/enums-sidebar-list.tsx","../../src/routes/data/models/-components/models-sidebar-list.tsx","../../src/routes/data/route.tsx?tsr-split=component"],"sourcesContent":["function maxBy(items, getValue) {\n let maxElement = items[0];\n let max = -Infinity;\n for (let i = 0; i < items.length; i++) {\n const element = items[i];\n const value = getValue(element);\n if (value > max) {\n max = value;\n maxElement = element;\n }\n }\n return maxElement;\n}\n\nexport { maxBy };\n","import type React from 'react';\n\nimport { modelEnumEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n InputField,\n NavigationMenu,\n NavigationMenuItemWithLink,\n NavigationMenuList,\n ScrollArea,\n} from '@baseplate-dev/ui-components';\nimport { Link } from '@tanstack/react-router';\nimport clsx from 'clsx';\nimport { sortBy } from 'es-toolkit';\nimport { useState } from 'react';\nimport { MdAdd, MdClear } from 'react-icons/md';\n\nimport { NewEnumDialog } from './new-enum-dialog.js';\n\ninterface EnumsSidebarListProps {\n className?: string;\n}\n\nexport function EnumsSidebarList({\n className,\n}: EnumsSidebarListProps): React.JSX.Element {\n const {\n definition: { enums = [] },\n } = useProjectDefinition();\n\n const [filterQuery, setFilterQuery] = useState('');\n const filteredEnums = enums.filter((item) =>\n item.name.toLowerCase().includes(filterQuery.toLowerCase()),\n );\n\n const sortedEnums = sortBy(filteredEnums, [(m) => m.name]);\n\n const [isScrolled, setIsScrolled] = useState(false);\n\n return (\n <div\n className={clsx(\n className,\n 'flex flex-1 flex-col space-y-4 overflow-y-auto',\n )}\n >\n <div className=\"space-y-4 px-4\">\n <NewEnumDialog>\n <Button variant=\"secondary\" className=\"w-full\">\n <MdAdd />\n New Enum\n </Button>\n </NewEnumDialog>\n {enums.length > 0 && (\n <div className=\"relative\">\n <InputField\n value={filterQuery}\n onChange={(text) => {\n setFilterQuery(text);\n }}\n placeholder=\"Search\"\n />\n {filterQuery && (\n <Button\n variant=\"ghost\"\n className=\"absolute top-1/2 right-4 -translate-y-1/2\"\n size=\"icon\"\n onClick={() => {\n setFilterQuery('');\n }}\n >\n <MdClear />\n </Button>\n )}\n </div>\n )}\n </div>\n\n <ScrollArea\n className={clsx('flex-1 px-2', isScrolled && 'border-t')}\n onScrollCapture={(e) => {\n const hasScrolled = e.currentTarget.scrollTop > 0;\n if (hasScrolled !== isScrolled) {\n setIsScrolled(hasScrolled);\n }\n }}\n >\n {sortedEnums.length === 0 && filterQuery && (\n <div className=\"py-4 text-center text-style-muted\">\n No enums found\n </div>\n )}\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {sortedEnums.map((enumDef) => (\n <li key={enumDef.id}>\n <NavigationMenuItemWithLink asChild>\n <Link\n to=\"/data/enums/edit/$key\"\n params={{ key: modelEnumEntityType.keyFromId(enumDef.id) }}\n >\n {enumDef.name}\n </Link>\n </NavigationMenuItemWithLink>\n </li>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </ScrollArea>\n </div>\n );\n}\n","import type React from 'react';\n\nimport { modelEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n InputField,\n NavigationMenu,\n NavigationMenuItemWithLink,\n NavigationMenuList,\n ScrollArea,\n} from '@baseplate-dev/ui-components';\nimport { Link } from '@tanstack/react-router';\nimport clsx from 'clsx';\nimport { sortBy } from 'es-toolkit';\nimport { useState } from 'react';\nimport { MdAdd, MdClear } from 'react-icons/md';\n\nimport { NewModelDialog } from './new-model-dialog.js';\n\ninterface ModelsSidebarListProps {\n className?: string;\n}\n\nexport function ModelsSidebarList({\n className,\n}: ModelsSidebarListProps): React.JSX.Element {\n const {\n definition: { models },\n } = useProjectDefinition();\n\n const [filterQuery, setFilterQuery] = useState('');\n const filteredModels = models.filter((model) =>\n model.name.toLowerCase().includes(filterQuery.toLowerCase()),\n );\n\n const sortedModels = sortBy(filteredModels, [(m) => m.name]);\n\n const [isScrolled, setIsScrolled] = useState(false);\n\n return (\n <div\n className={clsx(\n className,\n 'flex flex-1 flex-col space-y-4 overflow-y-auto',\n )}\n >\n <div className=\"space-y-4 px-4\">\n <NewModelDialog>\n <Button variant=\"secondary\" className=\"w-full\">\n <MdAdd />\n New Model\n </Button>\n </NewModelDialog>\n {models.length > 0 && (\n <div className=\"relative\">\n <InputField\n value={filterQuery}\n onChange={(text) => {\n setFilterQuery(text);\n }}\n placeholder=\"Search\"\n />\n {filterQuery && (\n <Button\n variant=\"ghost\"\n className=\"absolute top-1/2 right-4 -translate-y-1/2\"\n onClick={() => {\n setFilterQuery('');\n }}\n size=\"icon\"\n >\n <MdClear />\n </Button>\n )}\n </div>\n )}\n </div>\n\n <ScrollArea\n className={clsx('flex-1 px-2', isScrolled && 'border-t')}\n onScrollCapture={(e) => {\n const hasScrolled = e.currentTarget.scrollTop > 0;\n if (hasScrolled !== isScrolled) {\n setIsScrolled(hasScrolled);\n }\n }}\n >\n {sortedModels.length === 0 && filterQuery && (\n <div className=\"py-4 text-center text-style-muted\">\n No models found\n </div>\n )}\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {sortedModels.map((model) => (\n <NavigationMenuItemWithLink key={model.id} asChild>\n <Link\n to=\"/data/models/edit/$key\"\n params={{ key: modelEntityType.keyFromId(model.id) }}\n >\n {model.name}\n </Link>\n </NavigationMenuItemWithLink>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </ScrollArea>\n </div>\n );\n}\n","import type React from 'react';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n NavigationTabs,\n NavigationTabsItem,\n SidebarLayout,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n Link,\n Outlet,\n useRouterState,\n} from '@tanstack/react-router';\nimport { maxBy } from 'es-toolkit';\n\nimport { ErrorBoundary } from '#src/components/error-boundary/error-boundary.js';\n\nimport { EnumsSidebarList } from './enums/-components/enums-sidebar-list.js';\nimport { ModelsSidebarList } from './models/-components/models-sidebar-list.js';\n\nexport const Route = createFileRoute('/data')({\n component: DataLayout,\n});\n\nfunction DataLayout(): React.JSX.Element {\n const {\n definition: { models = [], enums = [] },\n } = useProjectDefinition();\n\n const longestName = maxBy([...models, ...enums], (m) => m.name.length)?.name;\n\n const modelsActive = useRouterState({\n select: (state) => state.location.pathname.startsWith('/data/models'),\n });\n const enumsActive = useRouterState({\n select: (state) => state.location.pathname.startsWith('/data/enums'),\n });\n\n return (\n <SidebarLayout className=\"flex-1\">\n <SidebarLayoutSidebar\n className=\"flex h-[calc(100vh-var(--topbar-height)-1px)] max-w-sm min-w-[230px] flex-col space-y-4\"\n width=\"auto\"\n noPadding\n >\n {/* Allows us to ensure the width doesn't change when selected is semi-bold or search filter is active */}\n <div className=\"invisible block h-1 overflow-hidden font-semibold text-transparent\">\n {longestName}\n </div>\n <div className=\"px-4\">\n <NavigationTabs className=\"w-full\">\n <NavigationTabsItem asChild>\n <Link to=\"/data/models\">Models</Link>\n </NavigationTabsItem>\n <NavigationTabsItem asChild>\n <Link to=\"/data/enums\">Enums</Link>\n </NavigationTabsItem>\n </NavigationTabs>\n </div>\n {modelsActive ? <ModelsSidebarList /> : null}\n {enumsActive ? <EnumsSidebarList /> : null}\n </SidebarLayoutSidebar>\n <SidebarLayoutContent className=\"h-[calc(100vh-var(--topbar-height)-1px)]\">\n <ErrorBoundary>\n <Outlet />\n </ErrorBoundary>\n </SidebarLayoutContent>\n </SidebarLayout>\n );\n}\n"],"names":["maxBy","items","getValue","maxElement","max","i","element","value","modelEnumEntityType","importShared","useProjectDefinition","Button","InputField","NavigationMenu","NavigationMenuItemWithLink","NavigationMenuList","ScrollArea","Link","useState","EnumsSidebarList","className","enums","filterQuery","setFilterQuery","filteredEnums","item","sortedEnums","sortBy","m","isScrolled","setIsScrolled","jsxs","clsx","jsx","NewEnumDialog","MdAdd","text","MdClear","e","hasScrolled","enumDef","modelEntityType","ModelsSidebarList","models","filteredModels","model","sortedModels","NewModelDialog","NavigationTabs","NavigationTabsItem","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","Outlet","useRouterState","SplitComponent","definition","longestName","name","length","modelsActive","select","state","location","pathname","startsWith","enumsActive","ErrorBoundary"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- import{i as s}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{f as l,l as x}from"./index-BekC6gsX.js";const{useProjectDefinition:u}=await s("@baseplate-dev/project-builder-lib/web"),{Button:t,Dialog:m,DialogClose:f,DialogContent:g,DialogFooter:j,DialogHeader:v,DialogTitle:D,DialogTrigger:y}=await s("@baseplate-dev/ui-components"),{Outlet:b,useNavigate:w}=await s("@tanstack/react-router"),A=function(){const{saveDefinitionWithFeedbackSync:o,definition:r,isSavingDefinition:c}=u(),{app:a}=l.useLoaderData(),d=w({from:l.fullPath}),p=()=>{o(n=>{n.apps=n.apps.filter(h=>h.id!==a.id)},{successMessage:"Successfully unlinked app!",disableDeleteRefDialog:!0,onSuccess:()=>{d({to:"/apps"}).catch(x)}})},{packageScope:i}=r.settings.general;return e.jsxs("div",{className:"relative flex h-full flex-1 flex-col overflow-hidden",children:[e.jsx("div",{className:"max-w-7xl space-y-4 p-4",children:e.jsxs("div",{className:"flex items-center justify-between space-x-4",children:[e.jsxs("div",{children:[e.jsx("h2",{children:i?`@${i}/${a.name}`:a.name}),e.jsxs("p",{className:"text-base text-muted-foreground",children:[a.type," app"]})]}),e.jsxs(m,{children:[e.jsx(y,{asChild:!0,children:e.jsx(t,{variant:"secondary",children:"Delete"})}),e.jsxs(g,{children:[e.jsx(v,{children:e.jsxs(D,{children:["Delete ",a.name]})}),e.jsxs("p",{children:["Are you sure you want to delete ",e.jsx("strong",{children:a.name}),"?"]}),e.jsx("p",{className:"text-style-muted",children:"This action will unlink the app from the generation process, so it will no longer be updated or managed through Baseplate. If already generated, the app will remain on the file system. You can manually delete it afterwards if no longer needed."}),e.jsxs(j,{children:[e.jsx(f,{children:e.jsx(t,{variant:"secondary",children:"Cancel"})}),e.jsx(t,{variant:"destructive",onClick:p,disabled:c,children:"Unlink App"})]})]})]})]})}),e.jsx("div",{className:"mb-(--action-bar-height) flex flex-1 overflow-y-auto",style:{"--action-bar-height":"52px"},children:e.jsx(b,{})})]},a.id)};export{A as component};
2
- //# sourceMappingURL=route-CSbr85FB.js.map
1
+ import{i as s}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{f as l,l as x}from"./index-DEKFCy0H.js";const{useProjectDefinition:u}=await s("@baseplate-dev/project-builder-lib/web"),{Button:t,Dialog:m,DialogClose:f,DialogContent:g,DialogFooter:j,DialogHeader:v,DialogTitle:D,DialogTrigger:y}=await s("@baseplate-dev/ui-components"),{Outlet:b,useNavigate:w}=await s("@tanstack/react-router"),A=function(){const{saveDefinitionWithFeedbackSync:o,definition:r,isSavingDefinition:c}=u(),{app:a}=l.useLoaderData(),d=w({from:l.fullPath}),p=()=>{o(n=>{n.apps=n.apps.filter(h=>h.id!==a.id)},{successMessage:"Successfully unlinked app!",disableDeleteRefDialog:!0,onSuccess:()=>{d({to:"/apps"}).catch(x)}})},{packageScope:i}=r.settings.general;return e.jsxs("div",{className:"relative flex h-full flex-1 flex-col overflow-hidden",children:[e.jsx("div",{className:"max-w-7xl space-y-4 p-4",children:e.jsxs("div",{className:"flex items-center justify-between space-x-4",children:[e.jsxs("div",{children:[e.jsx("h2",{children:i?`@${i}/${a.name}`:a.name}),e.jsxs("p",{className:"text-base text-muted-foreground",children:[a.type," app"]})]}),e.jsxs(m,{children:[e.jsx(y,{asChild:!0,children:e.jsx(t,{variant:"secondary",children:"Delete"})}),e.jsxs(g,{children:[e.jsx(v,{children:e.jsxs(D,{children:["Delete ",a.name]})}),e.jsxs("p",{children:["Are you sure you want to delete ",e.jsx("strong",{children:a.name}),"?"]}),e.jsx("p",{className:"text-style-muted",children:"This action will unlink the app from the generation process, so it will no longer be updated or managed through Baseplate. If already generated, the app will remain on the file system. You can manually delete it afterwards if no longer needed."}),e.jsxs(j,{children:[e.jsx(f,{children:e.jsx(t,{variant:"secondary",children:"Cancel"})}),e.jsx(t,{variant:"destructive",onClick:p,disabled:c,children:"Unlink App"})]})]})]})]})}),e.jsx("div",{className:"mb-(--action-bar-height) flex flex-1 overflow-y-auto",style:{"--action-bar-height":"52px"},children:e.jsx(b,{})})]},a.id)};export{A as component};
2
+ //# sourceMappingURL=route-C6wCPwVj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-CSbr85FB.js","sources":["../../src/routes/apps/edit.$key/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { appEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n notFound,\n Outlet,\n useNavigate,\n} from '@tanstack/react-router';\n\nimport { logAndFormatError } from '#src/services/error-formatter.js';\n\nexport const Route = createFileRoute('/apps/edit/$key')({\n component: EditAppPage,\n beforeLoad: ({ params: { key }, context: { projectDefinition } }) => {\n const id = appEntityType.idFromKey(key);\n const app = id && projectDefinition.apps.find((a) => a.id === id);\n if (!app) {\n return {};\n }\n return {\n getTitle: () => app.name,\n app,\n };\n },\n // Workaround for https://github.com/TanStack/router/issues/2139#issuecomment-2632375738\n // where throwing notFound() in beforeLoad causes the not found component to be rendered incorrectly\n loader: ({ context: { app } }) => {\n if (!app) throw notFound();\n return { app };\n },\n});\n\nfunction EditAppPage(): React.JSX.Element {\n const { saveDefinitionWithFeedbackSync, definition, isSavingDefinition } =\n useProjectDefinition();\n\n const { app } = Route.useLoaderData();\n\n const navigate = useNavigate({ from: Route.fullPath });\n\n const handleDelete = (): void => {\n saveDefinitionWithFeedbackSync(\n (definition) => {\n definition.apps = definition.apps.filter((a) => a.id !== app.id);\n },\n {\n successMessage: 'Successfully unlinked app!',\n disableDeleteRefDialog: true,\n onSuccess: () => {\n navigate({ to: '/apps' }).catch(logAndFormatError);\n },\n },\n );\n };\n\n const { packageScope } = definition.settings.general;\n\n return (\n <div\n className=\"relative flex h-full flex-1 flex-col overflow-hidden\"\n key={app.id}\n >\n <div className=\"max-w-7xl space-y-4 p-4\">\n <div className=\"flex items-center justify-between space-x-4\">\n <div>\n <h2>{packageScope ? `@${packageScope}/${app.name}` : app.name}</h2>\n <p className=\"text-base text-muted-foreground\">{app.type} app</p>\n </div>\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"secondary\">Delete</Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete {app.name}</DialogTitle>\n </DialogHeader>\n <p>\n Are you sure you want to delete <strong>{app.name}</strong>?\n </p>\n <p className=\"text-style-muted\">\n This action will unlink the app from the generation process, so\n it will no longer be updated or managed through Baseplate. If\n already generated, the app will remain on the file system. You\n can manually delete it afterwards if no longer needed.\n </p>\n\n <DialogFooter>\n <DialogClose>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button\n variant=\"destructive\"\n onClick={handleDelete}\n disabled={isSavingDefinition}\n >\n Unlink App\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n </div>\n <div\n className=\"mb-(--action-bar-height) flex flex-1 overflow-y-auto\"\n style={\n {\n '--action-bar-height': '52px',\n } as React.CSSProperties\n }\n >\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["useProjectDefinition","importShared","Button","Dialog","DialogClose","DialogContent","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","Outlet","useNavigate","SplitComponent","saveDefinitionWithFeedbackSync","definition","isSavingDefinition","app","Route","useLoaderData","navigate","from","fullPath","handleDelete","apps","filter","a","id","successMessage","disableDeleteRefDialog","onSuccess","to","catch","logAndFormatError","packageScope","settings","general","jsxs","jsx","name","type"],"mappings":"+JAGA,KAAA,CAAA,qBAAAA,CAAA,EAAA,MAAAC,EAAA,wCAAA,EACA,CAAA,OAAAC,EAAA,OAAAC,EAAA,YAAAC,EAAA,cAAAC,EAAA,aAAAC,EAAA,aAAAC,EAAA,YAAAC,EAAA,cAAAC,CAAA,EAAA,MAAAR,EAAA,8BAAA,EAUA,CAAA,OAAAS,EAAA,YAAAC,CAAA,EAAA,MAAAV,EAAA,wBAAA,EAOqEW,EAAA,UAuB3B,CAClC,KAAA,CAAEC,+BAAAA,EAAgCC,WAAAA,EAAYC,mBAAAA,GAClDf,EAAqB,EAEjB,CAAEgB,IAAAA,CAAAA,EAAQC,EAAMC,cAAc,EAE9BC,EAAWR,EAAY,CAAES,KAAMH,EAAMI,QAAAA,CAAU,EAE/CC,EAAeA,IAAY,CAC/BT,EACGC,GAAe,CACdA,EAAWS,KAAOT,EAAWS,KAAKC,OAAcC,GAAAA,EAAEC,KAAOV,EAAIU,EAAE,CAAA,EAEjE,CACEC,eAAgB,6BAChBC,uBAAwB,GACxBC,UAAWA,IAAM,CACNV,EAAA,CAAEW,GAAI,OAAA,CAAS,EAAEC,MAAMC,CAAiB,CAAA,CACnD,CAEJ,CACF,EAEM,CAAEC,aAAAA,CAAAA,EAAiBnB,EAAWoB,SAASC,QAG3C,OAAAC,EAAA,KAAC,MACC,CAAA,UAAU,uDAGV,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,0BACb,SAACD,EAAA,KAAA,MAAA,CAAI,UAAU,8CACb,SAAA,CAAAA,OAAC,MACC,CAAA,SAAA,CAACC,EAAAA,IAAA,KAAA,CAAIJ,WAAe,IAAIA,CAAY,IAAIjB,EAAIsB,IAAI,GAAKtB,EAAIsB,IAAK,CAAA,EAC9DF,EAAAA,KAAC,IAAE,CAAA,UAAU,kCAAmCpB,SAAAA,CAAIuB,EAAAA,KAAK,MAAA,CAAI,CAAA,CAAA,EAC/D,SACCpC,EACC,CAAA,SAAA,CAACkC,EAAAA,IAAA5B,EAAA,CAAc,QAAO,GACpB,SAAA4B,EAAA,IAACnC,GAAO,QAAQ,YAAY,kBAAM,CACpC,CAAA,SACCG,EACC,CAAA,SAAA,CAACgC,EAAA,IAAA9B,EAAA,CACC,gBAACC,EAAY,CAAA,SAAA,CAAA,UAAQQ,EAAIsB,IAAAA,CAAAA,CAAK,CAChC,CAAA,SACC,IAAC,CAAA,SAAA,CAAA,mCACgCD,EAAAA,IAAC,SAAQrB,CAAAA,SAAAA,EAAIsB,IAAK,CAAA,EAAS,GAAA,EAC7D,EACCD,EAAA,IAAA,IAAA,CAAE,UAAU,mBAAkB,SAK/B,sPAAA,SAEC/B,EACC,CAAA,SAAA,CAAA+B,EAAAA,IAACjC,GACC,SAACiC,EAAA,IAAAnC,EAAA,CAAO,QAAQ,YAAY,kBAAM,CACpC,CAAA,EACAmC,EAAAA,IAACnC,GACC,QAAQ,cACR,QAASoB,EACT,SAAUP,EAAmB,SAG/B,YAAA,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CACF,CAAA,EACCsB,EAAAA,IAAA,MAAA,CACC,UAAU,uDACV,MACE,CACE,sBAAuB,MACzB,EAGF,SAACA,EAAAA,IAAA3B,EAAA,CAAM,CAAA,CACT,CAAA,CAAA,CAAA,EAnDKM,EAAIU,EAoDX,CAEJ"}
1
+ {"version":3,"file":"route-C6wCPwVj.js","sources":["../../src/routes/apps/edit.$key/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { appEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n notFound,\n Outlet,\n useNavigate,\n} from '@tanstack/react-router';\n\nimport { logAndFormatError } from '#src/services/error-formatter.js';\n\nexport const Route = createFileRoute('/apps/edit/$key')({\n component: EditAppPage,\n beforeLoad: ({ params: { key }, context: { projectDefinition } }) => {\n const id = appEntityType.idFromKey(key);\n const app = id && projectDefinition.apps.find((a) => a.id === id);\n if (!app) {\n return {};\n }\n return {\n getTitle: () => app.name,\n app,\n };\n },\n // Workaround for https://github.com/TanStack/router/issues/2139#issuecomment-2632375738\n // where throwing notFound() in beforeLoad causes the not found component to be rendered incorrectly\n loader: ({ context: { app } }) => {\n if (!app) throw notFound();\n return { app };\n },\n});\n\nfunction EditAppPage(): React.JSX.Element {\n const { saveDefinitionWithFeedbackSync, definition, isSavingDefinition } =\n useProjectDefinition();\n\n const { app } = Route.useLoaderData();\n\n const navigate = useNavigate({ from: Route.fullPath });\n\n const handleDelete = (): void => {\n saveDefinitionWithFeedbackSync(\n (definition) => {\n definition.apps = definition.apps.filter((a) => a.id !== app.id);\n },\n {\n successMessage: 'Successfully unlinked app!',\n disableDeleteRefDialog: true,\n onSuccess: () => {\n navigate({ to: '/apps' }).catch(logAndFormatError);\n },\n },\n );\n };\n\n const { packageScope } = definition.settings.general;\n\n return (\n <div\n className=\"relative flex h-full flex-1 flex-col overflow-hidden\"\n key={app.id}\n >\n <div className=\"max-w-7xl space-y-4 p-4\">\n <div className=\"flex items-center justify-between space-x-4\">\n <div>\n <h2>{packageScope ? `@${packageScope}/${app.name}` : app.name}</h2>\n <p className=\"text-base text-muted-foreground\">{app.type} app</p>\n </div>\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"secondary\">Delete</Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete {app.name}</DialogTitle>\n </DialogHeader>\n <p>\n Are you sure you want to delete <strong>{app.name}</strong>?\n </p>\n <p className=\"text-style-muted\">\n This action will unlink the app from the generation process, so\n it will no longer be updated or managed through Baseplate. If\n already generated, the app will remain on the file system. You\n can manually delete it afterwards if no longer needed.\n </p>\n\n <DialogFooter>\n <DialogClose>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button\n variant=\"destructive\"\n onClick={handleDelete}\n disabled={isSavingDefinition}\n >\n Unlink App\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n </div>\n <div\n className=\"mb-(--action-bar-height) flex flex-1 overflow-y-auto\"\n style={\n {\n '--action-bar-height': '52px',\n } as React.CSSProperties\n }\n >\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["useProjectDefinition","importShared","Button","Dialog","DialogClose","DialogContent","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","Outlet","useNavigate","SplitComponent","saveDefinitionWithFeedbackSync","definition","isSavingDefinition","app","Route","useLoaderData","navigate","from","fullPath","handleDelete","apps","filter","a","id","successMessage","disableDeleteRefDialog","onSuccess","to","catch","logAndFormatError","packageScope","settings","general","jsxs","jsx","name","type"],"mappings":"+JAGA,KAAA,CAAA,qBAAAA,CAAA,EAAA,MAAAC,EAAA,wCAAA,EACA,CAAA,OAAAC,EAAA,OAAAC,EAAA,YAAAC,EAAA,cAAAC,EAAA,aAAAC,EAAA,aAAAC,EAAA,YAAAC,EAAA,cAAAC,CAAA,EAAA,MAAAR,EAAA,8BAAA,EAUA,CAAA,OAAAS,EAAA,YAAAC,CAAA,EAAA,MAAAV,EAAA,wBAAA,EAOqEW,EAAA,UAuB3B,CAClC,KAAA,CAAEC,+BAAAA,EAAgCC,WAAAA,EAAYC,mBAAAA,GAClDf,EAAqB,EAEjB,CAAEgB,IAAAA,CAAAA,EAAQC,EAAMC,cAAc,EAE9BC,EAAWR,EAAY,CAAES,KAAMH,EAAMI,QAAAA,CAAU,EAE/CC,EAAeA,IAAY,CAC/BT,EACGC,GAAe,CACdA,EAAWS,KAAOT,EAAWS,KAAKC,OAAcC,GAAAA,EAAEC,KAAOV,EAAIU,EAAE,CAAA,EAEjE,CACEC,eAAgB,6BAChBC,uBAAwB,GACxBC,UAAWA,IAAM,CACNV,EAAA,CAAEW,GAAI,OAAA,CAAS,EAAEC,MAAMC,CAAiB,CAAA,CACnD,CAEJ,CACF,EAEM,CAAEC,aAAAA,CAAAA,EAAiBnB,EAAWoB,SAASC,QAG3C,OAAAC,EAAA,KAAC,MACC,CAAA,UAAU,uDAGV,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,0BACb,SAACD,EAAA,KAAA,MAAA,CAAI,UAAU,8CACb,SAAA,CAAAA,OAAC,MACC,CAAA,SAAA,CAACC,EAAAA,IAAA,KAAA,CAAIJ,WAAe,IAAIA,CAAY,IAAIjB,EAAIsB,IAAI,GAAKtB,EAAIsB,IAAK,CAAA,EAC9DF,EAAAA,KAAC,IAAE,CAAA,UAAU,kCAAmCpB,SAAAA,CAAIuB,EAAAA,KAAK,MAAA,CAAI,CAAA,CAAA,EAC/D,SACCpC,EACC,CAAA,SAAA,CAACkC,EAAAA,IAAA5B,EAAA,CAAc,QAAO,GACpB,SAAA4B,EAAA,IAACnC,GAAO,QAAQ,YAAY,kBAAM,CACpC,CAAA,SACCG,EACC,CAAA,SAAA,CAACgC,EAAA,IAAA9B,EAAA,CACC,gBAACC,EAAY,CAAA,SAAA,CAAA,UAAQQ,EAAIsB,IAAAA,CAAAA,CAAK,CAChC,CAAA,SACC,IAAC,CAAA,SAAA,CAAA,mCACgCD,EAAAA,IAAC,SAAQrB,CAAAA,SAAAA,EAAIsB,IAAK,CAAA,EAAS,GAAA,EAC7D,EACCD,EAAA,IAAA,IAAA,CAAE,UAAU,mBAAkB,SAK/B,sPAAA,SAEC/B,EACC,CAAA,SAAA,CAAA+B,EAAAA,IAACjC,GACC,SAACiC,EAAA,IAAAnC,EAAA,CAAO,QAAQ,YAAY,kBAAM,CACpC,CAAA,EACAmC,EAAAA,IAACnC,GACC,QAAQ,cACR,QAASoB,EACT,SAAUP,EAAmB,SAG/B,YAAA,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CACF,CAAA,EACCsB,EAAAA,IAAA,MAAA,CACC,UAAU,uDACV,MACE,CACE,sBAAuB,MACzB,EAGF,SAACA,EAAAA,IAAA3B,EAAA,CAAM,CAAA,CACT,CAAA,CAAA,CAAA,EAnDKM,EAAIU,EAoDX,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{i}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{c as v,H as b,L as g}from"./index-tflukq04.js";import{l as y,j as f}from"./index-BekC6gsX.js";import{u as C}from"./use-model-form-dwW5mcmn.js";import{M as D}from"./model-info-form-koY65NLs.js";const{Button:j,Dialog:N,DialogClose:w,DialogContent:M,DialogFooter:S,DialogHeader:k,DialogTitle:F,DialogTrigger:E,useControlledState:I}=await i("@baseplate-dev/ui-components");function O({open:a,onOpenChange:t,children:s,asChild:r,modelKey:l}){const[c,o]=I(a,t,!1),{form:{control:d,reset:u},onSubmit:n,defaultValues:m}=C({modelKey:l,onSubmitSuccess(){o(!1)}});return e.jsxs(N,{open:c,onOpenChange:p=>{o(p),p||u(m)},children:[s&&e.jsx(E,{asChild:r,children:s}),e.jsx(M,{"aria-describedby":void 0,children:e.jsxs("form",{onSubmit:n,className:"space-y-4",children:[e.jsx(k,{children:e.jsx(F,{children:"Edit Model Info"})}),e.jsx(D,{control:d}),e.jsxs(S,{children:[e.jsx(w,{asChild:!0,children:e.jsx(j,{variant:"secondary",children:"Cancel"})}),e.jsx(j,{type:"submit",children:"Save"})]})]})})]})}const{FeatureUtils:T,modelEntityType:B}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:L}=await i("@baseplate-dev/project-builder-lib/web"),{Button:$,useConfirmDialog:R}=await i("@baseplate-dev/ui-components"),{useNavigate:H}=await i("@tanstack/react-router");function q({className:a,model:t}){const{definition:s,saveDefinitionWithFeedbackSync:r,isSavingDefinition:l}=L(),c=H(),{requestConfirm:o}=R(),d=u=>{r(n=>{n.models=n.models.filter(m=>m.id!==u)},{onSuccess:()=>{c({to:"/data/models"}).catch(y)},successMessage:"Successfully deleted model!"})};return e.jsxs("div",{className:v("flex items-center justify-between border-b py-4",a),children:[e.jsxs("div",{children:[e.jsx(O,{modelKey:B.keyFromId(t.id),asChild:!0,children:e.jsxs("button",{className:"group flex items-center space-x-2 hover:cursor-pointer",type:"button",title:"Edit Model Info",children:[e.jsx("h1",{children:t.name}),e.jsx(b,{className:"invisible size-4 group-hover:visible"})]})}),t.featureRef&&e.jsx("div",{className:"text-xs text-muted-foreground",children:T.getFeatureById(s,t.featureRef)?.name})]}),e.jsx("div",{className:"flex gap-8",children:e.jsxs($,{variant:"outline",size:"icon",disabled:l,onClick:()=>{o({title:"Confirm delete",content:`Are you sure you want to delete ${t.name}?`,buttonConfirmText:"Delete",buttonConfirmVariant:"destructive",onConfirm:()=>{d(t.id)}})},children:[e.jsx(g,{className:"text-destructive"}),e.jsx("div",{className:"sr-only",children:"Delete Model"})]})})]})}const{NavigationTabs:z,NavigationTabsItem:x}=await i("@baseplate-dev/ui-components"),{Link:h,Outlet:A}=await i("@tanstack/react-router"),W=function(){const{model:t}=f.useLoaderData(),{key:s}=f.useParams();return e.jsxs("div",{className:"relative flex h-full flex-1 flex-col overflow-hidden",children:[e.jsxs("div",{className:"max-w-7xl space-y-4 px-4 pb-4",children:[e.jsx(q,{model:t}),e.jsxs(z,{children:[e.jsx(x,{asChild:!0,children:e.jsx(h,{to:"/data/models/edit/$key",params:{key:s},activeOptions:{exact:!0},children:"Fields"})}),e.jsx(x,{asChild:!0,children:e.jsx(h,{to:"/data/models/edit/$key/service",params:{key:s},activeOptions:{exact:!0},children:"Service"})}),e.jsx(x,{asChild:!0,children:e.jsx(h,{to:"/data/models/edit/$key/graphql",params:{key:s},activeOptions:{exact:!0},children:"GraphQL"})})]})]}),e.jsx("div",{className:"mb-(--action-bar-height) flex flex-1 overflow-y-auto",style:{"--action-bar-height":"52px"},children:e.jsx(A,{})})]},t.id)};export{W as component};
2
- //# sourceMappingURL=route-DYxDmtHP.js.map
1
+ import{i}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{c as v,H as b,L as g}from"./index-tflukq04.js";import{l as y,j as f}from"./index-DEKFCy0H.js";import{u as C}from"./use-model-form-psj-JlE9.js";import{M as D}from"./model-info-form-koY65NLs.js";const{Button:j,Dialog:N,DialogClose:w,DialogContent:M,DialogFooter:S,DialogHeader:k,DialogTitle:F,DialogTrigger:E,useControlledState:I}=await i("@baseplate-dev/ui-components");function O({open:a,onOpenChange:t,children:s,asChild:r,modelKey:l}){const[c,o]=I(a,t,!1),{form:{control:d,reset:u},onSubmit:n,defaultValues:m}=C({modelKey:l,onSubmitSuccess(){o(!1)}});return e.jsxs(N,{open:c,onOpenChange:p=>{o(p),p||u(m)},children:[s&&e.jsx(E,{asChild:r,children:s}),e.jsx(M,{"aria-describedby":void 0,children:e.jsxs("form",{onSubmit:n,className:"space-y-4",children:[e.jsx(k,{children:e.jsx(F,{children:"Edit Model Info"})}),e.jsx(D,{control:d}),e.jsxs(S,{children:[e.jsx(w,{asChild:!0,children:e.jsx(j,{variant:"secondary",children:"Cancel"})}),e.jsx(j,{type:"submit",children:"Save"})]})]})})]})}const{FeatureUtils:T,modelEntityType:B}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:L}=await i("@baseplate-dev/project-builder-lib/web"),{Button:$,useConfirmDialog:R}=await i("@baseplate-dev/ui-components"),{useNavigate:H}=await i("@tanstack/react-router");function q({className:a,model:t}){const{definition:s,saveDefinitionWithFeedbackSync:r,isSavingDefinition:l}=L(),c=H(),{requestConfirm:o}=R(),d=u=>{r(n=>{n.models=n.models.filter(m=>m.id!==u)},{onSuccess:()=>{c({to:"/data/models"}).catch(y)},successMessage:"Successfully deleted model!"})};return e.jsxs("div",{className:v("flex items-center justify-between border-b py-4",a),children:[e.jsxs("div",{children:[e.jsx(O,{modelKey:B.keyFromId(t.id),asChild:!0,children:e.jsxs("button",{className:"group flex items-center space-x-2 hover:cursor-pointer",type:"button",title:"Edit Model Info",children:[e.jsx("h1",{children:t.name}),e.jsx(b,{className:"invisible size-4 group-hover:visible"})]})}),t.featureRef&&e.jsx("div",{className:"text-xs text-muted-foreground",children:T.getFeatureById(s,t.featureRef)?.name})]}),e.jsx("div",{className:"flex gap-8",children:e.jsxs($,{variant:"outline",size:"icon",disabled:l,onClick:()=>{o({title:"Confirm delete",content:`Are you sure you want to delete ${t.name}?`,buttonConfirmText:"Delete",buttonConfirmVariant:"destructive",onConfirm:()=>{d(t.id)}})},children:[e.jsx(g,{className:"text-destructive"}),e.jsx("div",{className:"sr-only",children:"Delete Model"})]})})]})}const{NavigationTabs:z,NavigationTabsItem:x}=await i("@baseplate-dev/ui-components"),{Link:h,Outlet:A}=await i("@tanstack/react-router"),W=function(){const{model:t}=f.useLoaderData(),{key:s}=f.useParams();return e.jsxs("div",{className:"relative flex h-full flex-1 flex-col overflow-hidden",children:[e.jsxs("div",{className:"max-w-7xl space-y-4 px-4 pb-4",children:[e.jsx(q,{model:t}),e.jsxs(z,{children:[e.jsx(x,{asChild:!0,children:e.jsx(h,{to:"/data/models/edit/$key",params:{key:s},activeOptions:{exact:!0},children:"Fields"})}),e.jsx(x,{asChild:!0,children:e.jsx(h,{to:"/data/models/edit/$key/service",params:{key:s},activeOptions:{exact:!0},children:"Service"})}),e.jsx(x,{asChild:!0,children:e.jsx(h,{to:"/data/models/edit/$key/graphql",params:{key:s},activeOptions:{exact:!0},children:"GraphQL"})})]})]}),e.jsx("div",{className:"mb-(--action-bar-height) flex flex-1 overflow-y-auto",style:{"--action-bar-height":"52px"},children:e.jsx(A,{})})]},t.id)};export{W as component};
2
+ //# sourceMappingURL=route-CZgTuGeJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-DYxDmtHP.js","sources":["../../src/routes/data/models/edit.$key/-components/model-info-edit-dialog.tsx","../../src/routes/data/models/edit.$key/-components/model-header-bar.tsx","../../src/routes/data/models/edit.$key/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { useModelForm } from '../../-hooks/use-model-form.js';\nimport { ModelInfoForm } from './model-info-form.js';\n\ninterface ModelInfoEditDialogProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n asChild?: boolean;\n modelKey: string;\n}\n\nexport function ModelInfoEditDialog({\n open,\n onOpenChange,\n children,\n asChild,\n modelKey,\n}: ModelInfoEditDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n\n const {\n form: { control, reset },\n onSubmit,\n defaultValues,\n } = useModelForm({\n modelKey,\n onSubmitSuccess() {\n setIsOpen(false);\n },\n });\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(newOpen) => {\n setIsOpen(newOpen);\n if (!newOpen) {\n reset(defaultValues);\n }\n }}\n >\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent aria-describedby={undefined}>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <DialogHeader>\n <DialogTitle>Edit Model Info</DialogTitle>\n </DialogHeader>\n <ModelInfoForm control={control} />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\">Save</Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { ModelConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n FeatureUtils,\n modelEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { Button, useConfirmDialog } from '@baseplate-dev/ui-components';\nimport { useNavigate } from '@tanstack/react-router';\nimport { clsx } from 'clsx';\nimport { MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { logAndFormatError } from '#src/services/error-formatter.js';\n\nimport { ModelInfoEditDialog } from './model-info-edit-dialog.js';\n\ninterface ModelHeaderBarProps {\n className?: string;\n model: ModelConfig;\n}\n\nexport function ModelHeaderBar({\n className,\n model,\n}: ModelHeaderBarProps): React.JSX.Element {\n const { definition, saveDefinitionWithFeedbackSync, isSavingDefinition } =\n useProjectDefinition();\n const navigate = useNavigate();\n const { requestConfirm } = useConfirmDialog();\n\n const handleDelete = (id: string): void => {\n saveDefinitionWithFeedbackSync(\n (draftConfig) => {\n draftConfig.models = draftConfig.models.filter((m) => m.id !== id);\n },\n {\n onSuccess: () => {\n navigate({ to: '/data/models' }).catch(logAndFormatError);\n },\n successMessage: 'Successfully deleted model!',\n },\n );\n };\n\n return (\n <div\n className={clsx(\n 'flex items-center justify-between border-b py-4',\n className,\n )}\n >\n <div>\n <ModelInfoEditDialog\n modelKey={modelEntityType.keyFromId(model.id)}\n asChild\n >\n <button\n className=\"group flex items-center space-x-2 hover:cursor-pointer\"\n type=\"button\"\n title=\"Edit Model Info\"\n >\n <h1>{model.name}</h1>\n <MdEdit className=\"invisible size-4 group-hover:visible\" />\n </button>\n </ModelInfoEditDialog>\n {model.featureRef && (\n <div className=\"text-xs text-muted-foreground\">\n {FeatureUtils.getFeatureById(definition, model.featureRef)?.name}\n </div>\n )}\n </div>\n <div className=\"flex gap-8\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n disabled={isSavingDefinition}\n onClick={() => {\n requestConfirm({\n title: 'Confirm delete',\n content: `Are you sure you want to delete ${model.name}?`,\n buttonConfirmText: 'Delete',\n buttonConfirmVariant: 'destructive',\n onConfirm: () => {\n handleDelete(model.id);\n },\n });\n }}\n >\n <MdDeleteOutline className=\"text-destructive\" />\n <div className=\"sr-only\">Delete Model</div>\n </Button>\n </div>\n </div>\n );\n}\n","import type React from 'react';\n\nimport {\n modelEntityType,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n NavigationTabs,\n NavigationTabsItem,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n Link,\n notFound,\n Outlet,\n} from '@tanstack/react-router';\n\nimport { ModelHeaderBar } from './-components/model-header-bar.js';\n\nexport const Route = createFileRoute('/data/models/edit/$key')({\n component: ModelEditLayout,\n beforeLoad: ({ params: { key }, context: { projectDefinition } }) => {\n const id = modelEntityType.idFromKey(key);\n const model = ModelUtils.byId(projectDefinition, id);\n if (!model) return {};\n return {\n getTitle: () => model.name,\n model,\n };\n },\n loader: ({ context: { model } }) => {\n if (!model) throw notFound();\n return { model };\n },\n});\n\nfunction ModelEditLayout(): React.JSX.Element {\n const { model } = Route.useLoaderData();\n const { key } = Route.useParams();\n\n return (\n <div\n className=\"relative flex h-full flex-1 flex-col overflow-hidden\"\n key={model.id}\n >\n <div className=\"max-w-7xl space-y-4 px-4 pb-4\">\n <ModelHeaderBar model={model} />\n <NavigationTabs>\n <NavigationTabsItem asChild>\n <Link\n to=\"/data/models/edit/$key\"\n params={{ key }}\n activeOptions={{ exact: true }}\n >\n Fields\n </Link>\n </NavigationTabsItem>\n <NavigationTabsItem asChild>\n <Link\n to=\"/data/models/edit/$key/service\"\n params={{ key }}\n activeOptions={{ exact: true }}\n >\n Service\n </Link>\n </NavigationTabsItem>\n <NavigationTabsItem asChild>\n <Link\n to=\"/data/models/edit/$key/graphql\"\n params={{ key }}\n activeOptions={{ exact: true }}\n >\n GraphQL\n </Link>\n </NavigationTabsItem>\n </NavigationTabs>\n </div>\n <div\n className=\"mb-(--action-bar-height) flex flex-1 overflow-y-auto\"\n style={\n {\n '--action-bar-height': '52px',\n } as React.CSSProperties\n }\n >\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["Button","Dialog","DialogClose","DialogContent","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","useControlledState","importShared","ModelInfoEditDialog","open","onOpenChange","children","asChild","modelKey","isOpen","setIsOpen","control","reset","onSubmit","defaultValues","useModelForm","jsxs","newOpen","jsx","ModelInfoForm","FeatureUtils","modelEntityType","useProjectDefinition","useConfirmDialog","useNavigate","ModelHeaderBar","className","model","definition","saveDefinitionWithFeedbackSync","isSavingDefinition","navigate","requestConfirm","handleDelete","id","draftConfig","logAndFormatError","clsx","MdEdit","MdDeleteOutline","NavigationTabs","NavigationTabsItem","Link","Outlet","SplitComponent","Route","useLoaderData","key","useParams","exact"],"mappings":"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"}
1
+ {"version":3,"file":"route-CZgTuGeJ.js","sources":["../../src/routes/data/models/edit.$key/-components/model-info-edit-dialog.tsx","../../src/routes/data/models/edit.$key/-components/model-header-bar.tsx","../../src/routes/data/models/edit.$key/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { useModelForm } from '../../-hooks/use-model-form.js';\nimport { ModelInfoForm } from './model-info-form.js';\n\ninterface ModelInfoEditDialogProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n asChild?: boolean;\n modelKey: string;\n}\n\nexport function ModelInfoEditDialog({\n open,\n onOpenChange,\n children,\n asChild,\n modelKey,\n}: ModelInfoEditDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n\n const {\n form: { control, reset },\n onSubmit,\n defaultValues,\n } = useModelForm({\n modelKey,\n onSubmitSuccess() {\n setIsOpen(false);\n },\n });\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(newOpen) => {\n setIsOpen(newOpen);\n if (!newOpen) {\n reset(defaultValues);\n }\n }}\n >\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent aria-describedby={undefined}>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <DialogHeader>\n <DialogTitle>Edit Model Info</DialogTitle>\n </DialogHeader>\n <ModelInfoForm control={control} />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\">Save</Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { ModelConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n FeatureUtils,\n modelEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { Button, useConfirmDialog } from '@baseplate-dev/ui-components';\nimport { useNavigate } from '@tanstack/react-router';\nimport { clsx } from 'clsx';\nimport { MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { logAndFormatError } from '#src/services/error-formatter.js';\n\nimport { ModelInfoEditDialog } from './model-info-edit-dialog.js';\n\ninterface ModelHeaderBarProps {\n className?: string;\n model: ModelConfig;\n}\n\nexport function ModelHeaderBar({\n className,\n model,\n}: ModelHeaderBarProps): React.JSX.Element {\n const { definition, saveDefinitionWithFeedbackSync, isSavingDefinition } =\n useProjectDefinition();\n const navigate = useNavigate();\n const { requestConfirm } = useConfirmDialog();\n\n const handleDelete = (id: string): void => {\n saveDefinitionWithFeedbackSync(\n (draftConfig) => {\n draftConfig.models = draftConfig.models.filter((m) => m.id !== id);\n },\n {\n onSuccess: () => {\n navigate({ to: '/data/models' }).catch(logAndFormatError);\n },\n successMessage: 'Successfully deleted model!',\n },\n );\n };\n\n return (\n <div\n className={clsx(\n 'flex items-center justify-between border-b py-4',\n className,\n )}\n >\n <div>\n <ModelInfoEditDialog\n modelKey={modelEntityType.keyFromId(model.id)}\n asChild\n >\n <button\n className=\"group flex items-center space-x-2 hover:cursor-pointer\"\n type=\"button\"\n title=\"Edit Model Info\"\n >\n <h1>{model.name}</h1>\n <MdEdit className=\"invisible size-4 group-hover:visible\" />\n </button>\n </ModelInfoEditDialog>\n {model.featureRef && (\n <div className=\"text-xs text-muted-foreground\">\n {FeatureUtils.getFeatureById(definition, model.featureRef)?.name}\n </div>\n )}\n </div>\n <div className=\"flex gap-8\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n disabled={isSavingDefinition}\n onClick={() => {\n requestConfirm({\n title: 'Confirm delete',\n content: `Are you sure you want to delete ${model.name}?`,\n buttonConfirmText: 'Delete',\n buttonConfirmVariant: 'destructive',\n onConfirm: () => {\n handleDelete(model.id);\n },\n });\n }}\n >\n <MdDeleteOutline className=\"text-destructive\" />\n <div className=\"sr-only\">Delete Model</div>\n </Button>\n </div>\n </div>\n );\n}\n","import type React from 'react';\n\nimport {\n modelEntityType,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n NavigationTabs,\n NavigationTabsItem,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n Link,\n notFound,\n Outlet,\n} from '@tanstack/react-router';\n\nimport { ModelHeaderBar } from './-components/model-header-bar.js';\n\nexport const Route = createFileRoute('/data/models/edit/$key')({\n component: ModelEditLayout,\n beforeLoad: ({ params: { key }, context: { projectDefinition } }) => {\n const id = modelEntityType.idFromKey(key);\n const model = ModelUtils.byId(projectDefinition, id);\n if (!model) return {};\n return {\n getTitle: () => model.name,\n model,\n };\n },\n loader: ({ context: { model } }) => {\n if (!model) throw notFound();\n return { model };\n },\n});\n\nfunction ModelEditLayout(): React.JSX.Element {\n const { model } = Route.useLoaderData();\n const { key } = Route.useParams();\n\n return (\n <div\n className=\"relative flex h-full flex-1 flex-col overflow-hidden\"\n key={model.id}\n >\n <div className=\"max-w-7xl space-y-4 px-4 pb-4\">\n <ModelHeaderBar model={model} />\n <NavigationTabs>\n <NavigationTabsItem asChild>\n <Link\n to=\"/data/models/edit/$key\"\n params={{ key }}\n activeOptions={{ exact: true }}\n >\n Fields\n </Link>\n </NavigationTabsItem>\n <NavigationTabsItem asChild>\n <Link\n to=\"/data/models/edit/$key/service\"\n params={{ key }}\n activeOptions={{ exact: true }}\n >\n Service\n </Link>\n </NavigationTabsItem>\n <NavigationTabsItem asChild>\n <Link\n to=\"/data/models/edit/$key/graphql\"\n params={{ key }}\n activeOptions={{ exact: true }}\n >\n GraphQL\n </Link>\n </NavigationTabsItem>\n </NavigationTabs>\n </div>\n <div\n className=\"mb-(--action-bar-height) flex flex-1 overflow-y-auto\"\n style={\n {\n '--action-bar-height': '52px',\n } as React.CSSProperties\n }\n >\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["Button","Dialog","DialogClose","DialogContent","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","useControlledState","importShared","ModelInfoEditDialog","open","onOpenChange","children","asChild","modelKey","isOpen","setIsOpen","control","reset","onSubmit","defaultValues","useModelForm","jsxs","newOpen","jsx","ModelInfoForm","FeatureUtils","modelEntityType","useProjectDefinition","useConfirmDialog","useNavigate","ModelHeaderBar","className","model","definition","saveDefinitionWithFeedbackSync","isSavingDefinition","navigate","requestConfirm","handleDelete","id","draftConfig","logAndFormatError","clsx","MdEdit","MdDeleteOutline","NavigationTabs","NavigationTabsItem","Link","Outlet","SplitComponent","Route","useLoaderData","key","useParams","exact"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import"./jsx-runtime-D_zvdyIk.js";import{N as o}from"./index-DEKFCy0H.js";const p=o;export{p as notFoundComponent};
2
+ //# sourceMappingURL=route-DLz_DL5S.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-DHu7qE-k.js","sources":["../../src/routes/data/models/route.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { createFileRoute } from '@tanstack/react-router';\n\nimport { NotFoundCard } from '#src/components/index.js';\n\nexport const Route = createFileRoute('/data/models')({\n beforeLoad: () => ({\n getTitle: () => 'Models',\n }),\n notFoundComponent: NotFoundCard,\n});\n"],"names":["SplitNotFoundComponent","NotFoundCard"],"mappings":"0EAEwD,MAAAA,EAA/CC"}
1
+ {"version":3,"file":"route-DLz_DL5S.js","sources":["../../src/routes/data/models/route.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { createFileRoute } from '@tanstack/react-router';\n\nimport { NotFoundCard } from '#src/components/index.js';\n\nexport const Route = createFileRoute('/data/models')({\n beforeLoad: () => ({\n getTitle: () => 'Models',\n }),\n notFoundComponent: NotFoundCard,\n});\n"],"names":["SplitNotFoundComponent","NotFoundCard"],"mappings":"0EAEwD,MAAAA,EAA/CC"}
@@ -1,2 +1,2 @@
1
- import{i as a}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{A as c}from"./index-tflukq04.js";import{a as u}from"./index-BekC6gsX.js";const{getPluginMetadataByKeyOrThrow:p,pluginEntityType:s}=await a("@baseplate-dev/project-builder-lib"),{useProjectDefinition:m}=await a("@baseplate-dev/project-builder-lib/web"),{Button:h,NavigationMenu:x,NavigationMenuItem:g,NavigationMenuLink:y,NavigationMenuList:j,SidebarLayout:b,SidebarLayoutContent:f,SidebarLayoutSidebar:v}=await a("@baseplate-dev/ui-components"),{notEmpty:w}=await a("@baseplate-dev/utils"),{Link:o,Outlet:N}=await a("@tanstack/react-router"),C=function(){const{definition:r,schemaParserContext:i}=m(),{availablePlugins:l}=i.pluginStore,n=(r.plugins??[]).filter(t=>!p(i.pluginStore,s.keyFromId(t.id)).managedBy).map(t=>l.find(d=>d.metadata.key===s.keyFromId(t.id))?.metadata).filter(w);return e.jsxs(b,{className:"flex-1",children:[e.jsxs(v,{className:"flex flex-col gap-4",width:"sm",children:[e.jsx(o,{to:"/plugins",children:e.jsxs(h,{variant:"secondary",className:"w-full",size:"sm",children:[e.jsx(c,{}),"Add new plugin"]})}),e.jsx(x,{orientation:"vertical",children:e.jsxs(j,{children:[n.map(t=>e.jsx(y,{asChild:!0,children:e.jsx(o,{to:"/plugins/edit/$key",params:{key:t.key},children:t.displayName})},t.key)),n.length===0&&e.jsx(g,{className:"mt-4 w-full text-center opacity-80",children:"No plugins enabled"})]})})]}),e.jsx(f,{className:"h-[calc(100vh-var(--topbar-height)-1px)]",children:e.jsx(u,{children:e.jsx(N,{})})})]})};export{C as component};
2
- //# sourceMappingURL=route-DDbjYROk.js.map
1
+ import{i as a}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{A as c}from"./index-tflukq04.js";import{a as u}from"./index-DEKFCy0H.js";const{getPluginMetadataByKeyOrThrow:p,pluginEntityType:s}=await a("@baseplate-dev/project-builder-lib"),{useProjectDefinition:m}=await a("@baseplate-dev/project-builder-lib/web"),{Button:h,NavigationMenu:x,NavigationMenuItem:g,NavigationMenuLink:y,NavigationMenuList:j,SidebarLayout:b,SidebarLayoutContent:f,SidebarLayoutSidebar:v}=await a("@baseplate-dev/ui-components"),{notEmpty:w}=await a("@baseplate-dev/utils"),{Link:o,Outlet:N}=await a("@tanstack/react-router"),C=function(){const{definition:r,schemaParserContext:i}=m(),{availablePlugins:l}=i.pluginStore,n=(r.plugins??[]).filter(t=>!p(i.pluginStore,s.keyFromId(t.id)).managedBy).map(t=>l.find(d=>d.metadata.key===s.keyFromId(t.id))?.metadata).filter(w);return e.jsxs(b,{className:"flex-1",children:[e.jsxs(v,{className:"flex flex-col gap-4",width:"sm",children:[e.jsx(o,{to:"/plugins",children:e.jsxs(h,{variant:"secondary",className:"w-full",size:"sm",children:[e.jsx(c,{}),"Add new plugin"]})}),e.jsx(x,{orientation:"vertical",children:e.jsxs(j,{children:[n.map(t=>e.jsx(y,{asChild:!0,children:e.jsx(o,{to:"/plugins/edit/$key",params:{key:t.key},children:t.displayName})},t.key)),n.length===0&&e.jsx(g,{className:"mt-4 w-full text-center opacity-80",children:"No plugins enabled"})]})})]}),e.jsx(f,{className:"h-[calc(100vh-var(--topbar-height)-1px)]",children:e.jsx(u,{children:e.jsx(N,{})})})]})};export{C as component};
2
+ //# sourceMappingURL=route-DluQ5e3_.js.map