@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.
- package/dist/assets/{-constants-DvXqIwvq.js → -constants-BYERQCO8.js} +2 -2
- package/dist/assets/{-constants-DvXqIwvq.js.map → -constants-BYERQCO8.js.map} +1 -1
- package/dist/assets/{admin-B4N6MLKM.js → admin-Dy1xMuLp.js} +2 -2
- package/dist/assets/{admin-B4N6MLKM.js.map → admin-Dy1xMuLp.js.map} +1 -1
- package/dist/assets/{backend-DcOfqunA.js → backend-SevlkhOM.js} +2 -2
- package/dist/assets/{backend-DcOfqunA.js.map → backend-SevlkhOM.js.map} +1 -1
- package/dist/assets/{edit._key-B6XrJtx8.js → edit._key-BgnflZIL.js} +2 -2
- package/dist/assets/{edit._key-B6XrJtx8.js.map → edit._key-BgnflZIL.js.map} +1 -1
- package/dist/assets/edit._sectionKey-D4mTSUhO.js +3 -0
- package/dist/assets/edit._sectionKey-D4mTSUhO.js.map +1 -0
- package/dist/assets/{graphql-Bf0DkZpf.js → graphql-C37jbnTG.js} +2 -2
- package/dist/assets/{graphql-Bf0DkZpf.js.map → graphql-C37jbnTG.js.map} +1 -1
- package/dist/assets/{hierarchy-DJ_1-p8i.js → hierarchy-CNBHjTAJ.js} +2 -2
- package/dist/assets/{hierarchy-DJ_1-p8i.js.map → hierarchy-CNBHjTAJ.js.map} +1 -1
- package/dist/assets/{index-CSR0XEd6.js → index-2EwzbJik.js} +2 -2
- package/dist/assets/{index-CSR0XEd6.js.map → index-2EwzbJik.js.map} +1 -1
- package/dist/assets/{index-Bd-VIuBI.js → index-B2l1e3vi.js} +2 -2
- package/dist/assets/{index-Bd-VIuBI.js.map → index-B2l1e3vi.js.map} +1 -1
- package/dist/assets/{index-BbhEKLV8.js → index-B3A5IWAQ.js} +2 -2
- package/dist/assets/{index-BbhEKLV8.js.map → index-B3A5IWAQ.js.map} +1 -1
- package/dist/assets/{index-BXLDYWo4.js → index-CAFf3K5-.js} +2 -2
- package/dist/assets/{index-BXLDYWo4.js.map → index-CAFf3K5-.js.map} +1 -1
- package/dist/assets/{index-CKO5J-yn.js → index-CDx3IfgN.js} +2 -2
- package/dist/assets/{index-CKO5J-yn.js.map → index-CDx3IfgN.js.map} +1 -1
- package/dist/assets/{index-BKgjTc--.js → index-CFlVUowS.js} +2 -2
- package/dist/assets/{index-BKgjTc--.js.map → index-CFlVUowS.js.map} +1 -1
- package/dist/assets/{index-Ce0DmLOw.js → index-Ckh17o1U.js} +2 -2
- package/dist/assets/{index-Ce0DmLOw.js.map → index-Ckh17o1U.js.map} +1 -1
- package/dist/assets/{index-oa_Oxkrg.js → index-D48MR3bL.js} +2 -2
- package/dist/assets/{index-oa_Oxkrg.js.map → index-D48MR3bL.js.map} +1 -1
- package/dist/assets/{index-BekC6gsX.js → index-DEKFCy0H.js} +3 -3
- package/dist/assets/{index-BekC6gsX.js.map → index-DEKFCy0H.js.map} +1 -1
- package/dist/assets/{index-CloYSKtQ.js → index-mFxKl9yz.js} +2 -2
- package/dist/assets/{index-CloYSKtQ.js.map → index-mFxKl9yz.js.map} +1 -1
- package/dist/assets/{new-admin-section-dialog-YeMy0G96.js → new-admin-section-dialog-4X2fxo7a.js} +2 -2
- package/dist/assets/{new-admin-section-dialog-YeMy0G96.js.map → new-admin-section-dialog-4X2fxo7a.js.map} +1 -1
- package/dist/assets/{new-app-dialog-nUBoX5fs.js → new-app-dialog-CCI4q4Mt.js} +2 -2
- package/dist/assets/{new-app-dialog-nUBoX5fs.js.map → new-app-dialog-CCI4q4Mt.js.map} +1 -1
- package/dist/assets/{new-enum-dialog-8Ba41lUU.js → new-enum-dialog-B5zvBxhT.js} +2 -2
- package/dist/assets/{new-enum-dialog-8Ba41lUU.js.map → new-enum-dialog-B5zvBxhT.js.map} +1 -1
- package/dist/assets/{new-model-dialog-CWgmV0pB.js → new-model-dialog-CiwTpKcZ.js} +2 -2
- package/dist/assets/{new-model-dialog-CWgmV0pB.js.map → new-model-dialog-CiwTpKcZ.js.map} +1 -1
- package/dist/assets/{route-DM37J86t.js → route-6ErXC2Qt.js} +2 -2
- package/dist/assets/{route-DM37J86t.js.map → route-6ErXC2Qt.js.map} +1 -1
- package/dist/assets/{route-DuhBcukV.js → route-C3eBLQEr.js} +2 -2
- package/dist/assets/{route-DuhBcukV.js.map → route-C3eBLQEr.js.map} +1 -1
- package/dist/assets/{route-CSbr85FB.js → route-C6wCPwVj.js} +2 -2
- package/dist/assets/{route-CSbr85FB.js.map → route-C6wCPwVj.js.map} +1 -1
- package/dist/assets/{route-DYxDmtHP.js → route-CZgTuGeJ.js} +2 -2
- package/dist/assets/{route-DYxDmtHP.js.map → route-CZgTuGeJ.js.map} +1 -1
- package/dist/assets/route-DLz_DL5S.js +2 -0
- package/dist/assets/{route-DHu7qE-k.js.map → route-DLz_DL5S.js.map} +1 -1
- package/dist/assets/{route-DDbjYROk.js → route-DluQ5e3_.js} +2 -2
- package/dist/assets/{route-DDbjYROk.js.map → route-DluQ5e3_.js.map} +1 -1
- package/dist/assets/{route-CTv4dICL.js → route-DzYT3FNA.js} +2 -2
- package/dist/assets/{route-CTv4dICL.js.map → route-DzYT3FNA.js.map} +1 -1
- package/dist/assets/{route-CrSpNRRy.js → route-PmxQsBVj.js} +2 -2
- package/dist/assets/{route-CrSpNRRy.js.map → route-PmxQsBVj.js.map} +1 -1
- package/dist/assets/{route-Ch1y-64Q.js → route-gYB7kkkm.js} +2 -2
- package/dist/assets/{route-Ch1y-64Q.js.map → route-gYB7kkkm.js.map} +1 -1
- package/dist/assets/{route-CbVppiIk.js → route-gzD4oiAl.js} +2 -2
- package/dist/assets/{route-CbVppiIk.js.map → route-gzD4oiAl.js.map} +1 -1
- package/dist/assets/{service-fvQlhwg4.js → service--2LVz4Ht.js} +2 -2
- package/dist/assets/{service-fvQlhwg4.js.map → service--2LVz4Ht.js.map} +1 -1
- package/dist/assets/{template-extractor-ChZnhGEF.js → template-extractor-D33LuEZ8.js} +2 -2
- package/dist/assets/{template-extractor-ChZnhGEF.js.map → template-extractor-D33LuEZ8.js.map} +1 -1
- package/dist/assets/{theme-builder-Y6jNiAJ3.js → theme-builder-CWetoMuo.js} +2 -2
- package/dist/assets/{theme-builder-Y6jNiAJ3.js.map → theme-builder-CWetoMuo.js.map} +1 -1
- package/dist/assets/{use-enum-form-D7XmblPC.js → use-enum-form-BRBAlWJc.js} +2 -2
- package/dist/assets/{use-enum-form-D7XmblPC.js.map → use-enum-form-BRBAlWJc.js.map} +1 -1
- package/dist/assets/{use-model-form-dwW5mcmn.js → use-model-form-psj-JlE9.js} +2 -2
- package/dist/assets/{use-model-form-dwW5mcmn.js.map → use-model-form-psj-JlE9.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +6 -6
- package/dist/assets/edit._sectionKey-BHWbqvR0.js +0 -3
- package/dist/assets/edit._sectionKey-BHWbqvR0.js.map +0 -1
- package/dist/assets/route-DHu7qE-k.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as c}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{u as E,l as I,I as $,t as M}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{i as c}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{u as E,l as I,I as $,t as M}from"./index-DEKFCy0H.js";import{C as W}from"./index-tflukq04.js";function A(f,a,t){return`/api/plugins/${f}/${a}/static/${t}`}const{createPluginImplementationStoreWithNewPlugins:B,PluginUtils:N,webConfigSpec:w}=await c("@baseplate-dev/project-builder-lib"),{useProjectDefinition:F}=await c("@baseplate-dev/project-builder-lib/web"),{Button:h,Card:z,CardContent:T,CardDescription:H,CardHeader:L,CardTitle:R}=await c("@baseplate-dev/ui-components"),{Link:S,useNavigate:U}=await c("@tanstack/react-router");function C({className:f,plugin:a,isActive:t,managerPlugin:i}){const{currentProjectId:x}=E(),{saveDefinitionWithFeedbackSync:j,schemaParserContext:b,definitionContainer:u,pluginContainer:y,isSavingDefinition:P}=F(),g=U();function p(){const d=B(b.pluginStore,[a],u.definition);if(d.getPluginSpec(w).getWebConfigComponent(a.key)){g({to:`/plugins/edit/${a.key}`}).catch(I);return}j(m=>{m.plugins=(m.plugins??[]).filter(v=>v.packageName!==a.packageName||v.name!==a.name),N.setPluginConfig(m,a,{},d)},{successMessage:`Enabled ${a.displayName}!`})}function r(){j(d=>{N.disablePlugin(d,a.key,b)},{successMessage:`Disabled ${a.displayName}!`})}const n=y.getPluginSpec(w),s=n.getWebConfigComponent(a.key),o=i?n.getWebConfigComponent(i.key):null;return e.jsxs(z,{className:f,children:[e.jsx(L,{children:e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center space-x-4",children:[e.jsx("div",{className:"rounded-xl border",children:a.icon&&x?e.jsx("img",{src:A(x,a.key,a.icon),className:"size-12 rounded-xl bg-muted",alt:`${a.displayName} logo`}):e.jsx(W,{className:"size-12 bg-muted p-2"})}),e.jsxs("div",{children:[e.jsx(R,{children:a.displayName}),e.jsx(H,{children:a.packageName})]})]}),e.jsx("div",{children:i?o&&t?e.jsx(S,{to:"/plugins/edit/$key",params:{key:i.key},children:e.jsx(h,{variant:"secondary",children:"Configure"})}):e.jsx(h,{variant:"secondary",disabled:!0,children:t?"Managed":"Disabled"}):t?s?e.jsx(S,{to:"/plugins/edit/$key",params:{key:a.key},children:e.jsx(h,{variant:"secondary",children:"Configure"})}):e.jsx(h,{variant:"secondary",onClick:r,disabled:P,children:"Disable"}):e.jsx(h,{variant:"secondary",onClick:p,disabled:P,children:"Enable"})})]})}),e.jsx(T,{children:e.jsx("div",{className:"text-sm",children:e.jsx("p",{children:a.description})})})]})}const{useProjectDefinition:Q}=await c("@baseplate-dev/project-builder-lib/web"),{EmptyDisplay:V,ErrorableLoader:Y}=await c("@baseplate-dev/ui-components"),{useEffect:_,useState:D}=await c("react"),O=function(){const{currentProjectId:a}=E(),[t,i]=D(null),{definition:x}=Q(),[j,b]=D(null);if(_(()=>{if(i(null),!!a){if($){i([]);return}M.plugins.getAvailablePlugins.mutate({projectId:a}).then(i).catch(b)}},[a]),!t)return e.jsx(Y,{error:j});if(t.length===0)return e.jsx(V,{header:"No plugins available.",subtitle:"Please install plugins via package.json."});const u=x.plugins??[],y=t.filter(n=>!n.managedBy),P=t.filter(n=>n.managedBy),g=y.filter(n=>u.some(s=>s.packageName===n.packageName&&s.name===n.name)),p=y.filter(n=>!n.hidden&&!u.some(s=>s.packageName===n.packageName&&s.name===n.name)),r=new Map;for(const n of P){const s=n.managedBy;if(!s)continue;r.has(s)||r.set(s,[]);const o=r.get(s);o&&o.push(n)}return e.jsxs("div",{className:"max-w-2xl space-y-4 p-4",children:[e.jsx("h1",{children:"Manage Plugins"}),e.jsx("p",{children:"Plugins are a way to extend the functionality of your project, such as adding authentication. You can enable, disable, and manage plugins from this page."}),e.jsxs("p",{children:["To add additional plugins, you can install them to your root package with ",e.jsx("strong",{children:"pnpm"}),"."]}),g.length===0?null:e.jsxs(e.Fragment,{children:[e.jsxs("h3",{children:["Active Plugins (",g.length,")"]}),g.map(n=>e.jsx(C,{plugin:n,isActive:!0},n.key))]}),p.length===0?null:e.jsxs(e.Fragment,{children:[e.jsxs("h3",{children:["Available Plugins (",p.length,")"]}),p.map(n=>e.jsx(C,{plugin:n,isActive:!1},n.key))]}),r.size===0?null:e.jsxs(e.Fragment,{children:[e.jsx("h3",{children:"Managed Plugins"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"These plugins are managed by their parent plugins and cannot be configured directly."}),[...r.entries()].map(([n,s])=>{const o=t.find(l=>l.fullyQualifiedName===n),d=o?.displayName??n;return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("h4",{className:"text-sm font-medium text-muted-foreground",children:["Managed by ",d]}),s.map(l=>{const k=u.some(m=>m.packageName===l.packageName&&m.name===l.name);return e.jsx(C,{plugin:l,isActive:k,managerPlugin:o},l.key)})]},n)})]})]})};export{O as component};
|
|
2
|
+
//# sourceMappingURL=index-2EwzbJik.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-CSR0XEd6.js","sources":["../../src/services/plugins.ts","../../src/routes/plugins/-components/plugin-card.tsx","../../src/routes/plugins/index.tsx?tsr-split=component"],"sourcesContent":["export function getPluginStaticUrl(\n projectId: string,\n pluginKey: string,\n path: string,\n): string {\n return `/api/plugins/${projectId}/${pluginKey}/static/${path}`;\n}\n","import type { PluginMetadataWithPaths } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n createPluginImplementationStoreWithNewPlugins,\n PluginUtils,\n webConfigSpec,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@baseplate-dev/ui-components';\nimport { Link, useNavigate } from '@tanstack/react-router';\nimport { MdExtension } from 'react-icons/md';\n\nimport { useProjects } from '#src/hooks/use-projects.js';\nimport { logAndFormatError } from '#src/services/error-formatter.js';\nimport { getPluginStaticUrl } from '#src/services/plugins.js';\n\ninterface PluginCardProps {\n className?: string;\n plugin: PluginMetadataWithPaths;\n isActive: boolean;\n managerPlugin?: PluginMetadataWithPaths;\n}\n\nexport function PluginCard({\n className,\n plugin,\n isActive,\n managerPlugin,\n}: PluginCardProps): React.JSX.Element {\n const { currentProjectId } = useProjects();\n const {\n saveDefinitionWithFeedbackSync,\n schemaParserContext,\n definitionContainer,\n pluginContainer,\n isSavingDefinition,\n } = useProjectDefinition();\n const navigate = useNavigate();\n\n function enablePlugin(): void {\n const implementations = createPluginImplementationStoreWithNewPlugins(\n schemaParserContext.pluginStore,\n [plugin],\n definitionContainer.definition,\n );\n const webConfigImplementation =\n implementations.getPluginSpec(webConfigSpec);\n const webConfig = webConfigImplementation.getWebConfigComponent(plugin.key);\n if (webConfig) {\n // redirect to plugin config page\n navigate({ to: `/plugins/edit/${plugin.key}` }).catch(logAndFormatError);\n return;\n }\n saveDefinitionWithFeedbackSync(\n (draft) => {\n // Remove any existing instance of this plugin\n draft.plugins = (draft.plugins ?? []).filter(\n (p) => p.packageName !== plugin.packageName || p.name !== plugin.name,\n );\n\n // Add the plugin with proper schema version\n PluginUtils.setPluginConfig(draft, plugin, {}, implementations);\n },\n {\n successMessage: `Enabled ${plugin.displayName}!`,\n },\n );\n }\n\n function disablePlugin(): void {\n saveDefinitionWithFeedbackSync(\n (draft) => {\n PluginUtils.disablePlugin(draft, plugin.key, schemaParserContext);\n },\n {\n successMessage: `Disabled ${plugin.displayName}!`,\n },\n );\n }\n\n const webConfigImplementation = pluginContainer.getPluginSpec(webConfigSpec);\n const webConfig = webConfigImplementation.getWebConfigComponent(plugin.key);\n\n // For managed plugins, check if the manager plugin has a web config\n const managerWebConfig = managerPlugin\n ? webConfigImplementation.getWebConfigComponent(managerPlugin.key)\n : null;\n\n return (\n <Card className={className}>\n <CardHeader>\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center space-x-4\">\n <div className=\"rounded-xl border\">\n {plugin.icon && currentProjectId ? (\n <img\n src={getPluginStaticUrl(\n currentProjectId,\n plugin.key,\n plugin.icon,\n )}\n className=\"size-12 rounded-xl bg-muted\"\n alt={`${plugin.displayName} logo`}\n />\n ) : (\n <MdExtension className=\"size-12 bg-muted p-2\" />\n )}\n </div>\n <div>\n <CardTitle>{plugin.displayName}</CardTitle>\n <CardDescription>{plugin.packageName}</CardDescription>\n </div>\n </div>\n <div>\n {(() => {\n // Managed plugins cannot be enabled/disabled directly\n if (managerPlugin) {\n return managerWebConfig && isActive ? (\n <Link\n to={`/plugins/edit/$key`}\n params={{ key: managerPlugin.key }}\n >\n <Button variant=\"secondary\">Configure</Button>\n </Link>\n ) : (\n <Button variant=\"secondary\" disabled>\n {isActive ? 'Managed' : 'Disabled'}\n </Button>\n );\n }\n\n // Regular plugin logic\n if (!isActive) {\n return (\n <Button\n variant=\"secondary\"\n onClick={enablePlugin}\n disabled={isSavingDefinition}\n >\n Enable\n </Button>\n );\n } else if (webConfig) {\n return (\n <Link to={`/plugins/edit/$key`} params={{ key: plugin.key }}>\n <Button variant=\"secondary\">Configure</Button>\n </Link>\n );\n } else {\n return (\n <Button\n variant=\"secondary\"\n onClick={disablePlugin}\n disabled={isSavingDefinition}\n >\n Disable\n </Button>\n );\n }\n })()}\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"text-sm\">\n <p>{plugin.description}</p>\n </div>\n </CardContent>\n </Card>\n );\n}\n","import type { PluginMetadataWithPaths } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { EmptyDisplay, ErrorableLoader } from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\nimport { useEffect, useState } from 'react';\n\nimport { useProjects } from '#src/hooks/use-projects.js';\nimport { IS_PREVIEW } from '#src/services/config.js';\nimport { trpc } from '#src/services/trpc.js';\n\nimport { PluginCard } from './-components/plugin-card.js';\n\nexport const Route = createFileRoute('/plugins/')({\n component: PluginsHomePage,\n});\n\nfunction PluginsHomePage(): React.JSX.Element {\n const { currentProjectId } = useProjects();\n const [plugins, setPlugins] = useState<PluginMetadataWithPaths[] | null>(\n null,\n );\n const { definition } = useProjectDefinition();\n const [error, setError] = useState<unknown>(null);\n\n useEffect(() => {\n setPlugins(null);\n if (!currentProjectId) {\n return;\n }\n if (IS_PREVIEW) {\n setPlugins([]);\n return;\n }\n trpc.plugins.getAvailablePlugins\n .mutate({ projectId: currentProjectId })\n .then(setPlugins)\n .catch(setError);\n }, [currentProjectId]);\n\n if (!plugins) {\n return <ErrorableLoader error={error} />;\n }\n\n if (plugins.length === 0) {\n return (\n <EmptyDisplay\n header=\"No plugins available.\"\n subtitle=\"Please install plugins via package.json.\"\n />\n );\n }\n\n const pluginConfig = definition.plugins ?? [];\n\n // Filter out managed plugins from main sections\n const mainPlugins = plugins.filter((plugin) => !plugin.managedBy);\n const managedPlugins = plugins.filter((plugin) => plugin.managedBy);\n\n const installedPlugins = mainPlugins.filter((plugin) =>\n pluginConfig.some(\n (config) =>\n config.packageName === plugin.packageName &&\n config.name === plugin.name,\n ),\n );\n const uninstalledPlugins = mainPlugins.filter(\n (plugin) =>\n !plugin.hidden &&\n !pluginConfig.some(\n (config) =>\n config.packageName === plugin.packageName &&\n config.name === plugin.name,\n ),\n );\n\n // Group managed plugins by their manager\n const managedPluginsByManager = new Map<string, typeof managedPlugins>();\n for (const managedPlugin of managedPlugins) {\n const managerName = managedPlugin.managedBy;\n if (!managerName) continue;\n\n if (!managedPluginsByManager.has(managerName)) {\n managedPluginsByManager.set(managerName, []);\n }\n const existingPlugins = managedPluginsByManager.get(managerName);\n if (existingPlugins) {\n existingPlugins.push(managedPlugin);\n }\n }\n\n return (\n <div className=\"max-w-2xl space-y-4 p-4\">\n <h1>Manage Plugins</h1>\n <p>\n Plugins are a way to extend the functionality of your project, such as\n adding authentication. You can enable, disable, and manage plugins from\n this page.\n </p>\n <p>\n To add additional plugins, you can install them to your root package\n with <strong>pnpm</strong>.\n </p>\n {installedPlugins.length === 0 ? null : (\n <>\n <h3>Active Plugins ({installedPlugins.length})</h3>\n {installedPlugins.map((plugin) => (\n <PluginCard key={plugin.key} plugin={plugin} isActive />\n ))}\n </>\n )}\n {uninstalledPlugins.length === 0 ? null : (\n <>\n <h3>Available Plugins ({uninstalledPlugins.length})</h3>\n {uninstalledPlugins.map((plugin) => (\n <PluginCard key={plugin.key} plugin={plugin} isActive={false} />\n ))}\n </>\n )}\n {managedPluginsByManager.size === 0 ? null : (\n <>\n <h3>Managed Plugins</h3>\n <p className=\"text-sm text-muted-foreground\">\n These plugins are managed by their parent plugins and cannot be\n configured directly.\n </p>\n {[...managedPluginsByManager.entries()].map(\n ([managerName, managedPlugins]) => {\n // Find the manager plugin to get its display name\n const managerPlugin = plugins.find(\n (p) => p.fullyQualifiedName === managerName,\n );\n const managerDisplayName =\n managerPlugin?.displayName ?? managerName;\n\n return (\n <div key={managerName} className=\"space-y-2\">\n <h4 className=\"text-sm font-medium text-muted-foreground\">\n Managed by {managerDisplayName}\n </h4>\n {managedPlugins.map((plugin) => {\n const isActive = pluginConfig.some(\n (config) =>\n config.packageName === plugin.packageName &&\n config.name === plugin.name,\n );\n return (\n <PluginCard\n key={plugin.key}\n plugin={plugin}\n isActive={isActive}\n managerPlugin={managerPlugin}\n />\n );\n })}\n </div>\n );\n },\n )}\n </>\n )}\n </div>\n );\n}\n"],"names":["getPluginStaticUrl","projectId","pluginKey","path","createPluginImplementationStoreWithNewPlugins","PluginUtils","webConfigSpec","importShared","useProjectDefinition","Button","Card","CardContent","CardDescription","CardHeader","CardTitle","Link","useNavigate","PluginCard","className","plugin","isActive","managerPlugin","currentProjectId","useProjects","saveDefinitionWithFeedbackSync","schemaParserContext","definitionContainer","pluginContainer","isSavingDefinition","navigate","enablePlugin","implementations","logAndFormatError","draft","p","disablePlugin","webConfigImplementation","webConfig","managerWebConfig","jsxs","jsx","MdExtension","EmptyDisplay","ErrorableLoader","useEffect","useState","SplitComponent","plugins","setPlugins","definition","error","setError","IS_PREVIEW","getAvailablePlugins","mutate","then","catch","length","pluginConfig","mainPlugins","filter","managedBy","managedPlugins","installedPlugins","some","config","packageName","name","uninstalledPlugins","hidden","managedPluginsByManager","Map","managedPlugin","managerName","has","set","existingPlugins","get","push","Fragment","map","key","size","entries","find","fullyQualifiedName","managerDisplayName","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-2EwzbJik.js","sources":["../../src/services/plugins.ts","../../src/routes/plugins/-components/plugin-card.tsx","../../src/routes/plugins/index.tsx?tsr-split=component"],"sourcesContent":["export function getPluginStaticUrl(\n projectId: string,\n pluginKey: string,\n path: string,\n): string {\n return `/api/plugins/${projectId}/${pluginKey}/static/${path}`;\n}\n","import type { PluginMetadataWithPaths } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n createPluginImplementationStoreWithNewPlugins,\n PluginUtils,\n webConfigSpec,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@baseplate-dev/ui-components';\nimport { Link, useNavigate } from '@tanstack/react-router';\nimport { MdExtension } from 'react-icons/md';\n\nimport { useProjects } from '#src/hooks/use-projects.js';\nimport { logAndFormatError } from '#src/services/error-formatter.js';\nimport { getPluginStaticUrl } from '#src/services/plugins.js';\n\ninterface PluginCardProps {\n className?: string;\n plugin: PluginMetadataWithPaths;\n isActive: boolean;\n managerPlugin?: PluginMetadataWithPaths;\n}\n\nexport function PluginCard({\n className,\n plugin,\n isActive,\n managerPlugin,\n}: PluginCardProps): React.JSX.Element {\n const { currentProjectId } = useProjects();\n const {\n saveDefinitionWithFeedbackSync,\n schemaParserContext,\n definitionContainer,\n pluginContainer,\n isSavingDefinition,\n } = useProjectDefinition();\n const navigate = useNavigate();\n\n function enablePlugin(): void {\n const implementations = createPluginImplementationStoreWithNewPlugins(\n schemaParserContext.pluginStore,\n [plugin],\n definitionContainer.definition,\n );\n const webConfigImplementation =\n implementations.getPluginSpec(webConfigSpec);\n const webConfig = webConfigImplementation.getWebConfigComponent(plugin.key);\n if (webConfig) {\n // redirect to plugin config page\n navigate({ to: `/plugins/edit/${plugin.key}` }).catch(logAndFormatError);\n return;\n }\n saveDefinitionWithFeedbackSync(\n (draft) => {\n // Remove any existing instance of this plugin\n draft.plugins = (draft.plugins ?? []).filter(\n (p) => p.packageName !== plugin.packageName || p.name !== plugin.name,\n );\n\n // Add the plugin with proper schema version\n PluginUtils.setPluginConfig(draft, plugin, {}, implementations);\n },\n {\n successMessage: `Enabled ${plugin.displayName}!`,\n },\n );\n }\n\n function disablePlugin(): void {\n saveDefinitionWithFeedbackSync(\n (draft) => {\n PluginUtils.disablePlugin(draft, plugin.key, schemaParserContext);\n },\n {\n successMessage: `Disabled ${plugin.displayName}!`,\n },\n );\n }\n\n const webConfigImplementation = pluginContainer.getPluginSpec(webConfigSpec);\n const webConfig = webConfigImplementation.getWebConfigComponent(plugin.key);\n\n // For managed plugins, check if the manager plugin has a web config\n const managerWebConfig = managerPlugin\n ? webConfigImplementation.getWebConfigComponent(managerPlugin.key)\n : null;\n\n return (\n <Card className={className}>\n <CardHeader>\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center space-x-4\">\n <div className=\"rounded-xl border\">\n {plugin.icon && currentProjectId ? (\n <img\n src={getPluginStaticUrl(\n currentProjectId,\n plugin.key,\n plugin.icon,\n )}\n className=\"size-12 rounded-xl bg-muted\"\n alt={`${plugin.displayName} logo`}\n />\n ) : (\n <MdExtension className=\"size-12 bg-muted p-2\" />\n )}\n </div>\n <div>\n <CardTitle>{plugin.displayName}</CardTitle>\n <CardDescription>{plugin.packageName}</CardDescription>\n </div>\n </div>\n <div>\n {(() => {\n // Managed plugins cannot be enabled/disabled directly\n if (managerPlugin) {\n return managerWebConfig && isActive ? (\n <Link\n to={`/plugins/edit/$key`}\n params={{ key: managerPlugin.key }}\n >\n <Button variant=\"secondary\">Configure</Button>\n </Link>\n ) : (\n <Button variant=\"secondary\" disabled>\n {isActive ? 'Managed' : 'Disabled'}\n </Button>\n );\n }\n\n // Regular plugin logic\n if (!isActive) {\n return (\n <Button\n variant=\"secondary\"\n onClick={enablePlugin}\n disabled={isSavingDefinition}\n >\n Enable\n </Button>\n );\n } else if (webConfig) {\n return (\n <Link to={`/plugins/edit/$key`} params={{ key: plugin.key }}>\n <Button variant=\"secondary\">Configure</Button>\n </Link>\n );\n } else {\n return (\n <Button\n variant=\"secondary\"\n onClick={disablePlugin}\n disabled={isSavingDefinition}\n >\n Disable\n </Button>\n );\n }\n })()}\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"text-sm\">\n <p>{plugin.description}</p>\n </div>\n </CardContent>\n </Card>\n );\n}\n","import type { PluginMetadataWithPaths } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { EmptyDisplay, ErrorableLoader } from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\nimport { useEffect, useState } from 'react';\n\nimport { useProjects } from '#src/hooks/use-projects.js';\nimport { IS_PREVIEW } from '#src/services/config.js';\nimport { trpc } from '#src/services/trpc.js';\n\nimport { PluginCard } from './-components/plugin-card.js';\n\nexport const Route = createFileRoute('/plugins/')({\n component: PluginsHomePage,\n});\n\nfunction PluginsHomePage(): React.JSX.Element {\n const { currentProjectId } = useProjects();\n const [plugins, setPlugins] = useState<PluginMetadataWithPaths[] | null>(\n null,\n );\n const { definition } = useProjectDefinition();\n const [error, setError] = useState<unknown>(null);\n\n useEffect(() => {\n setPlugins(null);\n if (!currentProjectId) {\n return;\n }\n if (IS_PREVIEW) {\n setPlugins([]);\n return;\n }\n trpc.plugins.getAvailablePlugins\n .mutate({ projectId: currentProjectId })\n .then(setPlugins)\n .catch(setError);\n }, [currentProjectId]);\n\n if (!plugins) {\n return <ErrorableLoader error={error} />;\n }\n\n if (plugins.length === 0) {\n return (\n <EmptyDisplay\n header=\"No plugins available.\"\n subtitle=\"Please install plugins via package.json.\"\n />\n );\n }\n\n const pluginConfig = definition.plugins ?? [];\n\n // Filter out managed plugins from main sections\n const mainPlugins = plugins.filter((plugin) => !plugin.managedBy);\n const managedPlugins = plugins.filter((plugin) => plugin.managedBy);\n\n const installedPlugins = mainPlugins.filter((plugin) =>\n pluginConfig.some(\n (config) =>\n config.packageName === plugin.packageName &&\n config.name === plugin.name,\n ),\n );\n const uninstalledPlugins = mainPlugins.filter(\n (plugin) =>\n !plugin.hidden &&\n !pluginConfig.some(\n (config) =>\n config.packageName === plugin.packageName &&\n config.name === plugin.name,\n ),\n );\n\n // Group managed plugins by their manager\n const managedPluginsByManager = new Map<string, typeof managedPlugins>();\n for (const managedPlugin of managedPlugins) {\n const managerName = managedPlugin.managedBy;\n if (!managerName) continue;\n\n if (!managedPluginsByManager.has(managerName)) {\n managedPluginsByManager.set(managerName, []);\n }\n const existingPlugins = managedPluginsByManager.get(managerName);\n if (existingPlugins) {\n existingPlugins.push(managedPlugin);\n }\n }\n\n return (\n <div className=\"max-w-2xl space-y-4 p-4\">\n <h1>Manage Plugins</h1>\n <p>\n Plugins are a way to extend the functionality of your project, such as\n adding authentication. You can enable, disable, and manage plugins from\n this page.\n </p>\n <p>\n To add additional plugins, you can install them to your root package\n with <strong>pnpm</strong>.\n </p>\n {installedPlugins.length === 0 ? null : (\n <>\n <h3>Active Plugins ({installedPlugins.length})</h3>\n {installedPlugins.map((plugin) => (\n <PluginCard key={plugin.key} plugin={plugin} isActive />\n ))}\n </>\n )}\n {uninstalledPlugins.length === 0 ? null : (\n <>\n <h3>Available Plugins ({uninstalledPlugins.length})</h3>\n {uninstalledPlugins.map((plugin) => (\n <PluginCard key={plugin.key} plugin={plugin} isActive={false} />\n ))}\n </>\n )}\n {managedPluginsByManager.size === 0 ? null : (\n <>\n <h3>Managed Plugins</h3>\n <p className=\"text-sm text-muted-foreground\">\n These plugins are managed by their parent plugins and cannot be\n configured directly.\n </p>\n {[...managedPluginsByManager.entries()].map(\n ([managerName, managedPlugins]) => {\n // Find the manager plugin to get its display name\n const managerPlugin = plugins.find(\n (p) => p.fullyQualifiedName === managerName,\n );\n const managerDisplayName =\n managerPlugin?.displayName ?? managerName;\n\n return (\n <div key={managerName} className=\"space-y-2\">\n <h4 className=\"text-sm font-medium text-muted-foreground\">\n Managed by {managerDisplayName}\n </h4>\n {managedPlugins.map((plugin) => {\n const isActive = pluginConfig.some(\n (config) =>\n config.packageName === plugin.packageName &&\n config.name === plugin.name,\n );\n return (\n <PluginCard\n key={plugin.key}\n plugin={plugin}\n isActive={isActive}\n managerPlugin={managerPlugin}\n />\n );\n })}\n </div>\n );\n },\n )}\n </>\n )}\n </div>\n );\n}\n"],"names":["getPluginStaticUrl","projectId","pluginKey","path","createPluginImplementationStoreWithNewPlugins","PluginUtils","webConfigSpec","importShared","useProjectDefinition","Button","Card","CardContent","CardDescription","CardHeader","CardTitle","Link","useNavigate","PluginCard","className","plugin","isActive","managerPlugin","currentProjectId","useProjects","saveDefinitionWithFeedbackSync","schemaParserContext","definitionContainer","pluginContainer","isSavingDefinition","navigate","enablePlugin","implementations","logAndFormatError","draft","p","disablePlugin","webConfigImplementation","webConfig","managerWebConfig","jsxs","jsx","MdExtension","EmptyDisplay","ErrorableLoader","useEffect","useState","SplitComponent","plugins","setPlugins","definition","error","setError","IS_PREVIEW","getAvailablePlugins","mutate","then","catch","length","pluginConfig","mainPlugins","filter","managedBy","managedPlugins","installedPlugins","some","config","packageName","name","uninstalledPlugins","hidden","managedPluginsByManager","Map","managedPlugin","managerName","has","set","existingPlugins","get","push","Fragment","map","key","size","entries","find","fullyQualifiedName","managerDisplayName","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as t}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{h as p}from"./index-tflukq04.js";import{N as n}from"./new-app-dialog-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{i as t}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{h as p}from"./index-tflukq04.js";import{N as n}from"./new-app-dialog-CCI4q4Mt.js";import{s as c}from"./sortBy-C9bvycg5.js";const{appEntityType:d}=await t("@baseplate-dev/project-builder-lib"),{useProjectDefinition:l}=await t("@baseplate-dev/project-builder-lib/web"),{Button:a,Card:m,EmptyDisplay:h}=await t("@baseplate-dev/ui-components"),{Link:x}=await t("@tanstack/react-router"),N=function(){const{definition:r}=l(),{apps:o}=r,i=c(o,[s=>s.name]);return i.length===0?e.jsx(h,{icon:p,header:"No Apps",subtitle:"You haven't created any apps yet",actions:e.jsx(n,{children:e.jsx(a,{children:"New App"})})}):e.jsxs("div",{className:"space-y-4 p-4",children:[e.jsx("h1",{children:"Apps"}),e.jsx("p",{children:"These are the apps that are defined in your project. You can edit them here."}),e.jsx(n,{children:e.jsx(a,{children:"New App"})}),e.jsx("div",{className:"max-w-xl space-y-4",children:i.map(s=>e.jsxs(m,{className:"flex justify-between space-x-4 p-4",children:[e.jsxs("div",{children:[e.jsxs("h3",{children:[s.name," (",s.type,")"]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s.packageLocation})]}),e.jsx(x,{to:"/apps/edit/$key",params:{key:d.keyFromId(s.id)},className:"inline-block",children:e.jsx(a,{variant:"secondary",children:"Edit"})})]},s.id))})]})};export{N as component};
|
|
2
|
+
//# sourceMappingURL=index-B2l1e3vi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-B2l1e3vi.js","sources":["../../src/routes/apps/index.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 { Button, Card, EmptyDisplay } from '@baseplate-dev/ui-components';\nimport { createFileRoute, Link } from '@tanstack/react-router';\nimport { sortBy } from 'es-toolkit';\nimport { MdApps } from 'react-icons/md';\n\nimport NewAppDialog from './-components/new-app-dialog.js';\n\nexport const Route = createFileRoute('/apps/')({\n component: AppsListPage,\n});\n\nfunction AppsListPage(): React.JSX.Element {\n const { definition } = useProjectDefinition();\n\n const { apps } = definition;\n const sortedApps = sortBy(apps, [(app) => app.name]);\n\n if (sortedApps.length === 0) {\n return (\n <EmptyDisplay\n icon={MdApps}\n header=\"No Apps\"\n subtitle=\"You haven't created any apps yet\"\n actions={\n <NewAppDialog>\n <Button>New App</Button>\n </NewAppDialog>\n }\n />\n );\n }\n\n return (\n <div className=\"space-y-4 p-4\">\n <h1>Apps</h1>\n <p>\n These are the apps that are defined in your project. You can edit them\n here.\n </p>\n <NewAppDialog>\n <Button>New App</Button>\n </NewAppDialog>\n <div className=\"max-w-xl space-y-4\">\n {sortedApps.map((app) => (\n <Card key={app.id} className=\"flex justify-between space-x-4 p-4\">\n <div>\n <h3>\n {app.name} ({app.type})\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {app.packageLocation}\n </p>\n </div>\n <Link\n to=\"/apps/edit/$key\"\n params={{ key: appEntityType.keyFromId(app.id) }}\n className=\"inline-block\"\n >\n <Button variant=\"secondary\">Edit</Button>\n </Link>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"names":["appEntityType","importShared","useProjectDefinition","Button","Card","EmptyDisplay","Link","SplitComponent","definition","apps","sortedApps","sortBy","app","name","length","jsx","MdApps","NewAppDialog","jsxs","map","type","packageLocation","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,KAAAC,EAAA,aAAAC,CAAA,EAAA,MAAAJ,EAAA,8BAAA,EACA,CAAA,KAAAK,CAAA,EAAA,MAAAL,EAAA,wBAAA,EAI2DM,EAAA,UAMhB,CACnC,KAAA,CAAEC,WAAAA,GAAeN,EAAqB,EAEtC,CAAEO,KAAAA,CAAAA,EAASD,EACXE,EAAaC,EAAOF,EAAM,CAAUG,GAAAA,EAAIC,IAAI,CAAC,EAE/CH,OAAAA,EAAWI,SAAW,EAErBC,EAAA,IAAAV,EAAA,CACC,KAAMW,EACN,OAAO,UACP,SAAS,mCACT,cACGC,EACC,CAAA,SAAAF,EAAAA,IAACZ,EAAO,CAAA,SAAA,SAAA,CAAO,CACjB,CAAA,EAEF,EAKJe,EAAA,KAAC,MAAI,CAAA,UAAU,gBACb,SAAA,CAAAH,EAAAA,IAAC,MAAG,SAAI,MAAA,CAAA,EACRA,EAAAA,IAAC,KAAC,SAGF,8EAAA,CAAA,EACCA,MAAAE,EAAA,CACC,SAACF,EAAA,IAAAZ,EAAA,CAAO,kBAAO,CAAA,EACjB,EACAY,EAAA,IAAC,MAAI,CAAA,UAAU,qBACZL,SAAAA,EAAWS,IACVP,GAAAM,EAAA,KAACd,EAAkB,CAAA,UAAU,qCAC3B,SAAA,CAAAc,OAAC,MACC,CAAA,SAAA,CAAAA,OAAC,KACEN,CAAAA,SAAAA,CAAIC,EAAAA,KAAK,KAAGD,EAAIQ,KAAK,GAAA,EACxB,EACCL,EAAA,IAAA,IAAA,CAAE,UAAU,gCACVH,WAAIS,eACP,CAAA,CAAA,EACF,EACCN,EAAAA,IAAAT,EAAA,CACC,GAAG,kBACH,OAAQ,CAAEgB,IAAKtB,EAAcuB,UAAUX,EAAIY,EAAE,CAAE,EAC/C,UAAU,eAEV,SAAAT,MAACZ,GAAO,QAAQ,YAAY,eAAI,CAAA,CAClC,CAAA,CAAA,GAfSS,EAAIY,EAgBf,CACD,CACH,CAAA,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as c}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{S,v as j,a as v}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{i as c}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{S,v as j,a as v}from"./index-DEKFCy0H.js";import{u as f}from"./use-enum-form-BRBAlWJc.js";import{L,c as y}from"./index-tflukq04.js";import{f as C,e as N}from"./index.esm-CdP29Ssb.js";const{SectionListSection:b,SectionListSectionContent:g,SectionListSectionHeader:w,SectionListSectionTitle:E,SwitchFieldController:V}=await c("@baseplate-dev/ui-components");function F({control:s}){return e.jsxs(b,{children:[e.jsx(w,{children:e.jsx(E,{children:"GraphQL"})}),e.jsx(g,{className:"space-y-4",children:e.jsx(V,{label:"Expose in GraphQL schema",control:s,name:"isExposed",description:"Whether to expose this enum in the GraphQL schema"})})]})}function A(s){return s.split("_").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" ")}const{modelEnumValueEntityType:T}=await c("@baseplate-dev/project-builder-lib"),{Button:d,InputFieldController:u,Label:p,SectionListSection:$,SectionListSectionContent:I,SectionListSectionDescription:k,SectionListSectionHeader:B,SectionListSectionTitle:D}=await c("@baseplate-dev/ui-components");function G({control:s,setValue:r}){const{fields:t,remove:i,append:l,move:a}=C({control:s,name:"values"}),o=N({control:s,name:"values"}),m="grid grid-cols-[repeat(2,minmax(130px,1fr))_80px] gap-3",x=t.map((h,n)=>({id:h.id,element:e.jsxs("div",{className:m,children:[e.jsx(u,{control:s,name:`values.${n}.name`}),e.jsx(u,{control:s,name:`values.${n}.friendlyName`,onFocus:()=>{!o[n].friendlyName&&o[n].name&&r(`values.${n}.friendlyName`,A(o[n].name))}}),e.jsxs(d,{variant:"ghost",size:"icon",onClick:()=>{i(n)},children:[e.jsx(L,{}),e.jsx("div",{className:"sr-only",children:"Delete Enum"})]})]})}));return e.jsxs($,{children:[e.jsxs(B,{children:[e.jsx(D,{children:"Values"}),e.jsx(k,{children:"Configure the allowed values for this enum."})]}),e.jsxs(I,{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:y(m,"pl-12"),children:[e.jsx(p,{children:"Value Name, e.g. ACTIVE"}),e.jsx(p,{children:"Value Friendly Name, e.g. Active"}),e.jsx("div",{})]}),t.length===0?e.jsx("p",{className:"pt-4 text-style-muted",children:"Add some values to get started"}):e.jsx(S,{listItems:x,sortItems:a})]}),e.jsx(d,{size:"sm",variant:"secondary",onClick:()=>{l({id:T.generateNewId(),name:"",friendlyName:""})},children:"Add Value"})]})]})}const{useBlockUnsavedChangesNavigate:Q}=await c("@baseplate-dev/project-builder-lib/web"),{FormActionBar:H,SectionList:R}=await c("@baseplate-dev/ui-components"),M=function(){const{key:r}=j.useParams(),{form:t,onSubmit:i,isSavingDefinition:l}=f({omit:["name","featureRef"],enumKey:r}),{control:a,setValue:o}=t;return Q({control:a,reset:t.reset,onSubmit:i}),e.jsx(v,{children:e.jsxs("form",{onSubmit:i,className:"mx-4 max-w-7xl min-w-[700px] flex-1 space-y-4 pb-4",children:[e.jsxs(R,{children:[e.jsx(F,{control:a}),e.jsx(G,{control:a,setValue:o})]}),e.jsx(H,{form:t,disabled:l})]})})};export{M as component};
|
|
2
|
+
//# sourceMappingURL=index-B3A5IWAQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-BbhEKLV8.js","sources":["../../src/routes/data/enums/edit.$key/-components/enum-graph-ql-section.tsx","../../src/utils/casing.ts","../../src/routes/data/enums/edit.$key/-components/enum-values-section.tsx","../../src/routes/data/enums/edit.$key/index.tsx?tsr-split=component"],"sourcesContent":["import type { EnumConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionHeader,\n SectionListSectionTitle,\n SwitchFieldController,\n} from '@baseplate-dev/ui-components';\n\nexport function EnumGraphQLSection({\n control,\n}: {\n control: Control<EnumConfig>;\n}): React.JSX.Element {\n return (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>GraphQL</SectionListSectionTitle>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-4\">\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 </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","export function underscoreToTitleCase(str: string): string {\n // Split the string into an array of words\n const words = str.split('_');\n\n // Capitalize the first letter of each word and join them back together\n const titleCase = words\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n\n return titleCase;\n}\n","import type { EnumConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { modelEnumValueEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n InputFieldController,\n Label,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useFieldArray, useWatch } from 'react-hook-form';\nimport { MdDeleteOutline } from 'react-icons/md';\n\nimport { SortableList } from '#src/components/index.js';\nimport { underscoreToTitleCase } from '#src/utils/casing.js';\n\nexport function EnumValuesSection({\n control,\n setValue,\n}: {\n control: Control<EnumConfig>;\n setValue: UseFormSetValue<EnumConfig>;\n}): React.JSX.Element {\n const {\n fields: valueFields,\n remove: removeValue,\n append: appendValue,\n move: sortValues,\n } = useFieldArray({\n control,\n name: 'values',\n });\n\n const values = useWatch({ control, name: 'values' });\n\n const gridClassNames =\n 'grid grid-cols-[repeat(2,minmax(130px,1fr))_80px] gap-3';\n\n const valueListItems = valueFields.map((field, i) => ({\n id: field.id,\n element: (\n <div className={gridClassNames}>\n <InputFieldController control={control} name={`values.${i}.name`} />\n <InputFieldController\n control={control}\n name={`values.${i}.friendlyName`}\n onFocus={() => {\n if (!values[i].friendlyName && values[i].name) {\n setValue(\n `values.${i}.friendlyName`,\n underscoreToTitleCase(values[i].name),\n );\n }\n }}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n removeValue(i);\n }}\n >\n <MdDeleteOutline />\n <div className=\"sr-only\">Delete Enum</div>\n </Button>\n </div>\n ),\n }));\n\n return (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Values</SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure the allowed values for this enum.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <div\n className={clsx(\n gridClassNames,\n // account for handle in sortable list\n 'pl-12',\n )}\n >\n <Label>Value Name, e.g. ACTIVE</Label>\n <Label>Value Friendly Name, e.g. Active</Label>\n <div />\n </div>\n {valueFields.length === 0 ? (\n <p className=\"pt-4 text-style-muted\">\n Add some values to get started\n </p>\n ) : (\n <SortableList listItems={valueListItems} sortItems={sortValues} />\n )}\n </div>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => {\n appendValue({\n id: modelEnumValueEntityType.generateNewId(),\n name: '',\n friendlyName: '',\n });\n }}\n >\n Add Value\n </Button>\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type React from 'react';\n\nimport { useBlockUnsavedChangesNavigate } from '@baseplate-dev/project-builder-lib/web';\nimport { FormActionBar, SectionList } from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { ErrorBoundary } from '#src/components/index.js';\n\nimport { useEnumForm } from '../-hooks/use-enum-form.js';\nimport { EnumGraphQLSection } from './-components/enum-graph-ql-section.js';\nimport { EnumValuesSection } from './-components/enum-values-section.js';\n\nexport const Route = createFileRoute('/data/enums/edit/$key/')({\n component: EnumEditPage,\n});\n\nfunction EnumEditPage(): React.JSX.Element {\n const { key } = Route.useParams();\n const { form, onSubmit, isSavingDefinition } = useEnumForm({\n omit: ['name', 'featureRef'],\n enumKey: key,\n });\n const { control, setValue } = form;\n\n useBlockUnsavedChangesNavigate({ control, reset: form.reset, onSubmit });\n\n return (\n <ErrorBoundary>\n <form\n onSubmit={onSubmit}\n className=\"mx-4 max-w-7xl min-w-[700px] flex-1 space-y-4 pb-4\"\n >\n <SectionList>\n <EnumGraphQLSection control={control} />\n <EnumValuesSection control={control} setValue={setValue} />\n </SectionList>\n <FormActionBar form={form} disabled={isSavingDefinition} />\n </form>\n </ErrorBoundary>\n );\n}\n"],"names":["SectionListSection","SectionListSectionContent","SectionListSectionHeader","SectionListSectionTitle","SwitchFieldController","importShared","EnumGraphQLSection","control","jsx","underscoreToTitleCase","str","word","modelEnumValueEntityType","Button","InputFieldController","Label","SectionListSectionDescription","EnumValuesSection","setValue","valueFields","removeValue","appendValue","sortValues","useFieldArray","values","useWatch","gridClassNames","valueListItems","field","i","jsxs","MdDeleteOutline","clsx","SortableList","useBlockUnsavedChangesNavigate","FormActionBar","SectionList","SplitComponent","key","Route","useParams","form","onSubmit","isSavingDefinition","useEnumForm","omit","enumKey","reset","ErrorBoundary"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-B3A5IWAQ.js","sources":["../../src/routes/data/enums/edit.$key/-components/enum-graph-ql-section.tsx","../../src/utils/casing.ts","../../src/routes/data/enums/edit.$key/-components/enum-values-section.tsx","../../src/routes/data/enums/edit.$key/index.tsx?tsr-split=component"],"sourcesContent":["import type { EnumConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionHeader,\n SectionListSectionTitle,\n SwitchFieldController,\n} from '@baseplate-dev/ui-components';\n\nexport function EnumGraphQLSection({\n control,\n}: {\n control: Control<EnumConfig>;\n}): React.JSX.Element {\n return (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>GraphQL</SectionListSectionTitle>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-4\">\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 </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","export function underscoreToTitleCase(str: string): string {\n // Split the string into an array of words\n const words = str.split('_');\n\n // Capitalize the first letter of each word and join them back together\n const titleCase = words\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n\n return titleCase;\n}\n","import type { EnumConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { modelEnumValueEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n InputFieldController,\n Label,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useFieldArray, useWatch } from 'react-hook-form';\nimport { MdDeleteOutline } from 'react-icons/md';\n\nimport { SortableList } from '#src/components/index.js';\nimport { underscoreToTitleCase } from '#src/utils/casing.js';\n\nexport function EnumValuesSection({\n control,\n setValue,\n}: {\n control: Control<EnumConfig>;\n setValue: UseFormSetValue<EnumConfig>;\n}): React.JSX.Element {\n const {\n fields: valueFields,\n remove: removeValue,\n append: appendValue,\n move: sortValues,\n } = useFieldArray({\n control,\n name: 'values',\n });\n\n const values = useWatch({ control, name: 'values' });\n\n const gridClassNames =\n 'grid grid-cols-[repeat(2,minmax(130px,1fr))_80px] gap-3';\n\n const valueListItems = valueFields.map((field, i) => ({\n id: field.id,\n element: (\n <div className={gridClassNames}>\n <InputFieldController control={control} name={`values.${i}.name`} />\n <InputFieldController\n control={control}\n name={`values.${i}.friendlyName`}\n onFocus={() => {\n if (!values[i].friendlyName && values[i].name) {\n setValue(\n `values.${i}.friendlyName`,\n underscoreToTitleCase(values[i].name),\n );\n }\n }}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n removeValue(i);\n }}\n >\n <MdDeleteOutline />\n <div className=\"sr-only\">Delete Enum</div>\n </Button>\n </div>\n ),\n }));\n\n return (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Values</SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure the allowed values for this enum.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <div\n className={clsx(\n gridClassNames,\n // account for handle in sortable list\n 'pl-12',\n )}\n >\n <Label>Value Name, e.g. ACTIVE</Label>\n <Label>Value Friendly Name, e.g. Active</Label>\n <div />\n </div>\n {valueFields.length === 0 ? (\n <p className=\"pt-4 text-style-muted\">\n Add some values to get started\n </p>\n ) : (\n <SortableList listItems={valueListItems} sortItems={sortValues} />\n )}\n </div>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => {\n appendValue({\n id: modelEnumValueEntityType.generateNewId(),\n name: '',\n friendlyName: '',\n });\n }}\n >\n Add Value\n </Button>\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type React from 'react';\n\nimport { useBlockUnsavedChangesNavigate } from '@baseplate-dev/project-builder-lib/web';\nimport { FormActionBar, SectionList } from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { ErrorBoundary } from '#src/components/index.js';\n\nimport { useEnumForm } from '../-hooks/use-enum-form.js';\nimport { EnumGraphQLSection } from './-components/enum-graph-ql-section.js';\nimport { EnumValuesSection } from './-components/enum-values-section.js';\n\nexport const Route = createFileRoute('/data/enums/edit/$key/')({\n component: EnumEditPage,\n});\n\nfunction EnumEditPage(): React.JSX.Element {\n const { key } = Route.useParams();\n const { form, onSubmit, isSavingDefinition } = useEnumForm({\n omit: ['name', 'featureRef'],\n enumKey: key,\n });\n const { control, setValue } = form;\n\n useBlockUnsavedChangesNavigate({ control, reset: form.reset, onSubmit });\n\n return (\n <ErrorBoundary>\n <form\n onSubmit={onSubmit}\n className=\"mx-4 max-w-7xl min-w-[700px] flex-1 space-y-4 pb-4\"\n >\n <SectionList>\n <EnumGraphQLSection control={control} />\n <EnumValuesSection control={control} setValue={setValue} />\n </SectionList>\n <FormActionBar form={form} disabled={isSavingDefinition} />\n </form>\n </ErrorBoundary>\n );\n}\n"],"names":["SectionListSection","SectionListSectionContent","SectionListSectionHeader","SectionListSectionTitle","SwitchFieldController","importShared","EnumGraphQLSection","control","jsx","underscoreToTitleCase","str","word","modelEnumValueEntityType","Button","InputFieldController","Label","SectionListSectionDescription","EnumValuesSection","setValue","valueFields","removeValue","appendValue","sortValues","useFieldArray","values","useWatch","gridClassNames","valueListItems","field","i","jsxs","MdDeleteOutline","clsx","SortableList","useBlockUnsavedChangesNavigate","FormActionBar","SectionList","SplitComponent","key","Route","useParams","form","onSubmit","isSavingDefinition","useEnumForm","omit","enumKey","reset","ErrorBoundary"],"mappings":"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"}
|
|
@@ -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{K as c}from"./index-tflukq04.js";import{N as m}from"./new-admin-section-dialog-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{i as s}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{K as c}from"./index-tflukq04.js";import{N as m}from"./new-admin-section-dialog-4X2fxo7a.js";import{c as o}from"./index-DEKFCy0H.js";const{adminSectionEntityType:l}=await s("@baseplate-dev/project-builder-lib"),{Button:r,Card:p,EmptyDisplay:x}=await s("@baseplate-dev/ui-components"),{Link:h}=await s("@tanstack/react-router"),S=function(){const{adminApp:d,app:a}=o.useLoaderData(),{appKey:i}=o.useParams(),n=d.sections??[];return n.length===0?e.jsx(x,{icon:c,header:"No Admin Sections",subtitle:"Create your first admin section to get started with managing your data",actions:e.jsx(m,{appId:a.id,appKey:i,children:e.jsx(r,{children:"New Section"})})}):e.jsxs("div",{className:"space-y-4 p-4",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold",children:[a.name," Admin Sections"]}),e.jsx("p",{className:"text-muted-foreground",children:"Manage CRUD interfaces for your data models. Select a section from the sidebar to edit it."})]}),e.jsx("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:n.map(t=>e.jsx(p,{className:"p-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"font-semibold",children:t.name||"Unnamed Section"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Type: ",t.type]}),t.icon&&e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Icon: ",t.icon]}),e.jsx(h,{to:"/admin-sections/$appKey/edit/$sectionKey",params:{appKey:i,sectionKey:l.keyFromId(t.id)},className:"inline-block",children:e.jsx(r,{variant:"secondary",size:"sm",children:"Edit"})})]})},t.id))})]})};export{S as component};
|
|
2
|
+
//# sourceMappingURL=index-CAFf3K5-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-CAFf3K5-.js","sources":["../../src/routes/admin-sections.$appKey/index.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { adminSectionEntityType } from '@baseplate-dev/project-builder-lib';\nimport { Button, Card, EmptyDisplay } from '@baseplate-dev/ui-components';\nimport { createFileRoute, Link, notFound } from '@tanstack/react-router';\nimport { MdSettings } from 'react-icons/md';\n\nimport NewAdminSectionDialog from './-components/new-admin-section-dialog.js';\n\nexport const Route = createFileRoute('/admin-sections/$appKey/')({\n component: AdminSectionsIndexPage,\n loader: ({ context: { adminApp, app } }) => {\n if (!adminApp) throw notFound();\n return { adminApp, app };\n },\n});\n\nfunction AdminSectionsIndexPage(): React.JSX.Element {\n const { adminApp, app } = Route.useLoaderData();\n const { appKey } = Route.useParams();\n\n // Find the web app definition and its admin sections\n const sections = adminApp.sections ?? [];\n\n if (sections.length === 0) {\n return (\n <EmptyDisplay\n icon={MdSettings}\n header=\"No Admin Sections\"\n subtitle=\"Create your first admin section to get started with managing your data\"\n actions={\n <NewAdminSectionDialog appId={app.id} appKey={appKey}>\n <Button>New Section</Button>\n </NewAdminSectionDialog>\n }\n />\n );\n }\n\n return (\n <div className=\"space-y-4 p-4\">\n <div>\n <h1 className=\"text-2xl font-bold\">{app.name} Admin Sections</h1>\n <p className=\"text-muted-foreground\">\n Manage CRUD interfaces for your data models. Select a section from the\n sidebar to edit it.\n </p>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {sections.map((section) => (\n <Card key={section.id} className=\"p-4\">\n <div className=\"space-y-2\">\n <h3 className=\"font-semibold\">\n {section.name || 'Unnamed Section'}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n Type: {section.type}\n </p>\n {section.icon && (\n <p className=\"text-sm text-muted-foreground\">\n Icon: {section.icon}\n </p>\n )}\n <Link\n to=\"/admin-sections/$appKey/edit/$sectionKey\"\n params={{\n appKey,\n sectionKey: adminSectionEntityType.keyFromId(section.id),\n }}\n className=\"inline-block\"\n >\n <Button variant=\"secondary\" size=\"sm\">\n Edit\n </Button>\n </Link>\n </div>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"names":["adminSectionEntityType","importShared","Button","Card","EmptyDisplay","Link","SplitComponent","adminApp","app","Route","useLoaderData","appKey","useParams","sections","length","MdSettings","NewAdminSectionDialog","id","jsxs","name","jsx","map","section","type","icon","sectionKey","keyFromId"],"mappings":"2PAEA,KAAA,CAAA,uBAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EACA,CAAA,OAAAC,EAAA,KAAAC,EAAA,aAAAC,CAAA,EAAA,MAAAH,EAAA,8BAAA,EACA,CAAA,KAAAI,CAAA,EAAA,MAAAJ,EAAA,wBAAA,EAG8EK,EAAA,UAUzB,CAC7C,KAAA,CAAEC,SAAAA,EAAUC,IAAAA,CAAAA,EAAQC,EAAMC,cAAc,EACxC,CAAEC,OAAAA,CAAAA,EAAWF,EAAMG,UAAU,EAG7BC,EAAWN,EAASM,UAAY,CAAE,EAEpCA,OAAAA,EAASC,SAAW,QAEnBV,EACC,CAAA,KAAMW,EACN,OAAO,oBACP,SAAS,yEACT,cACGC,EAAsB,CAAA,MAAOR,EAAIS,GAAI,OAAAN,EACpC,eAACT,EAAO,CAAA,SAAA,cAAW,EACrB,CAEF,CAAA,EAKJgB,EAAA,KAAC,MAAI,CAAA,UAAU,gBACb,SAAA,CAAAA,OAAC,MACC,CAAA,SAAA,CAACA,EAAAA,KAAA,KAAA,CAAG,UAAU,qBAAsBV,SAAAA,CAAIW,EAAAA,KAAK,iBAAA,EAAe,EAC3DC,EAAA,IAAA,IAAA,CAAE,UAAU,wBAAuB,SAGpC,4FAAA,CAAA,CAAA,EACF,EAECA,MAAA,MAAA,CAAI,UAAU,2CACZP,WAASQ,IAAKC,GACZF,EAAAA,IAAAjB,EAAA,CAAsB,UAAU,MAC/B,SAACe,EAAAA,KAAA,MAAA,CAAI,UAAU,YACb,SAAA,CAAAE,MAAC,KAAG,CAAA,UAAU,gBACXE,SAAAA,EAAQH,MAAQ,kBACnB,EACAD,EAAAA,KAAC,IAAE,CAAA,UAAU,gCAA+B,SAAA,CAAA,SACnCI,EAAQC,IAAAA,EACjB,EACCD,EAAQE,MACNN,OAAA,IAAA,CAAE,UAAU,gCAA+B,SAAA,CAAA,SACnCI,EAAQE,IAAAA,EACjB,EAEDJ,EAAAA,IAAAf,EAAA,CACC,GAAG,2CACH,OAAQ,CACNM,OAAAA,EACAc,WAAYzB,EAAuB0B,UAAUJ,EAAQL,EAAE,CACzD,EACA,UAAU,eAEV,SAACG,EAAAA,IAAAlB,EAAA,CAAO,QAAQ,YAAY,KAAK,KAAI,SAAA,MAErC,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CAzBSoB,EAAAA,EAAQL,EA0BnB,CACD,CACH,CAAA,CAAA,EACF,CAEJ"}
|
|
@@ -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{N as s}from"./new-enum-dialog-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{i as n}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{N as s}from"./new-enum-dialog-B5zvBxhT.js";const{Button:a}=await n("@baseplate-dev/ui-components"),c=function(){return e.jsxs("div",{className:"max-w-4xl space-y-4 p-4 text-style-prose",children:[e.jsx("h1",{children:"Enums"}),e.jsxs("p",{children:["Enums are a way to define a set of named values. They can be used to define a type that can only have a certain set of values. For example, you might have an enum called ",e.jsx("strong",{children:"Color"})," with values"," ",e.jsx("code",{children:"RED"}),", ",e.jsx("code",{children:"GREEN"}),", and ",e.jsx("code",{children:"BLUE"}),"."]}),e.jsxs("p",{children:["Choose an enum to edit from the sidebar or"," ",e.jsx(s,{children:e.jsx(a,{variant:"link",size:"none",children:"create a new enum"})}),"."]})]})};export{c as component};
|
|
2
|
+
//# sourceMappingURL=index-CDx3IfgN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-CDx3IfgN.js","sources":["../../src/routes/data/enums/index.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { Button } from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { NewEnumDialog } from './-components/new-enum-dialog.js';\n\nexport const Route = createFileRoute('/data/enums/')({\n component: EnumsListPage,\n});\n\nfunction EnumsListPage(): React.JSX.Element {\n return (\n <div className=\"max-w-4xl space-y-4 p-4 text-style-prose\">\n <h1>Enums</h1>\n <p>\n Enums are a way to define a set of named values. They can be used to\n define a type that can only have a certain set of values. For example,\n you might have an enum called <strong>Color</strong> with values{' '}\n <code>RED</code>, <code>GREEN</code>, and <code>BLUE</code>.\n </p>\n <p>\n Choose an enum to edit from the sidebar or{' '}\n <NewEnumDialog>\n <Button variant=\"link\" size=\"none\">\n create a new enum\n </Button>\n </NewEnumDialog>\n .\n </p>\n </div>\n );\n}\n"],"names":["Button","importShared","SplitComponent","jsxs","jsx","NewEnumDialog"],"mappings":"kKAEA,KAAA,CAAA,OAAAA,CAAA,EAAA,MAAAC,EAAA,8BAAA,EAGiEC,EAAA,UAMrB,CAExC,OAAAC,EAAA,KAAC,MAAI,CAAA,UAAU,2CACb,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAK,OAAA,CAAA,SACR,IAAC,CAAA,SAAA,CAAA,6KAG8BA,EAAAA,IAAC,UAAO,SAAK,OAAA,CAAA,EAAS,eAAa,IACjEA,EAAAA,IAAC,QAAK,SAAG,KAAA,CAAA,EAAO,KAAEA,EAAAA,IAAC,QAAK,SAAK,OAAA,CAAA,EAAO,SAAMA,EAAAA,IAAC,QAAK,SAAI,MAAA,CAAA,EAAO,GAAA,EAC7D,SACC,IAAC,CAAA,SAAA,CAAA,6CAC2C,IAC3CA,EAAAA,IAACC,GACC,SAACD,EAAA,IAAAJ,EAAA,CAAO,QAAQ,OAAO,KAAK,OAAM,SAAA,mBAAA,CAElC,CACF,CAAA,EAAe,GAAA,CAEjB,CAAA,CAAA,EACF,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 d}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
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 d}from"./index-DEKFCy0H.js";const{generalSettingsSchema:h}=await o("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:f,useProjectDefinition:j,useResettableForm:u}=await o("@baseplate-dev/project-builder-lib/web"),{FormActionBar:g,InputFieldController:s,SectionList:x,SectionListSection:b,SectionListSectionContent:S,SectionListSectionHeader:v,SectionListSectionTitle:w}=await o("@baseplate-dev/ui-components"),L=function(){const{definition:n,saveDefinitionWithFeedback:r}=j(),i=u({resolver:d(h),defaultValues:n.settings.general}),{handleSubmit:l,control:t,reset:c}=i,a=l(p=>r(m=>{m.settings.general=p}));return f({control:t,reset:c,onSubmit:a}),e.jsxs("form",{className:"relative h-full max-h-full pb-(--action-bar-height)",onSubmit:a,children:[e.jsxs("div",{className:"flex h-full max-h-full flex-1 flex-col overflow-y-auto px-6",children:[e.jsx("div",{className:"sticky top-0 border-b bg-background py-6",children:e.jsx("h1",{children:"Project settings"})}),e.jsx(x,{children:e.jsxs(b,{children:[e.jsx(v,{children:e.jsx(w,{children:"Settings"})}),e.jsxs(S,{className:"flex max-w-80 flex-col gap-4",children:[e.jsx(s,{name:"name",label:"Project Name",description:"Lowercase letters and dashes, e.g. my-project",control:t,placeholder:"e.g. my-project"}),e.jsx(s,{name:"portOffset",label:"Port Offset",description:"Multiple of 1000, e.g. 4000. This will offset the ports used by the project, e.g. API at 4001, database at 4432, to avoid conflicts with other projects.",control:t,registerOptions:{valueAsNumber:!0}}),e.jsx(s,{label:"Package Scope",name:"packageScope",description:"The scope for packages in this project, e.g. my-project will result in @my-project/app-name",control:t})]})]})})]}),e.jsx(g,{form:i})]})};export{L as component};
|
|
2
|
+
//# sourceMappingURL=index-CFlVUowS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-CFlVUowS.js","sources":["../../src/routes/settings/index.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { generalSettingsSchema } from '@baseplate-dev/project-builder-lib';\nimport {\n useBlockUnsavedChangesNavigate,\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n FormActionBar,\n InputFieldController,\n SectionList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionHeader,\n SectionListSectionTitle,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { createFileRoute } from '@tanstack/react-router';\n\nexport const Route = createFileRoute('/settings/')({\n component: ProjectSettingsPage,\n beforeLoad: () => ({\n getTitle: () => 'Project Settings',\n }),\n});\n\nfunction ProjectSettingsPage(): React.JSX.Element {\n const { definition, saveDefinitionWithFeedback } = useProjectDefinition();\n\n const form = useResettableForm({\n resolver: zodResolver(generalSettingsSchema),\n defaultValues: definition.settings.general,\n });\n\n const { handleSubmit, control, reset } = form;\n\n const onSubmit = handleSubmit((data) =>\n saveDefinitionWithFeedback((draftConfig) => {\n draftConfig.settings.general = data;\n }),\n );\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n return (\n <form\n className=\"relative h-full max-h-full pb-(--action-bar-height)\"\n onSubmit={onSubmit}\n >\n <div className=\"flex h-full max-h-full flex-1 flex-col overflow-y-auto px-6\">\n <div className=\"sticky top-0 border-b bg-background py-6\">\n <h1>Project settings</h1>\n </div>\n <SectionList>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Settings</SectionListSectionTitle>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"flex max-w-80 flex-col gap-4\">\n <InputFieldController\n name=\"name\"\n label=\"Project Name\"\n description=\"Lowercase letters and dashes, e.g. my-project\"\n control={control}\n placeholder=\"e.g. my-project\"\n />\n <InputFieldController\n name=\"portOffset\"\n label=\"Port Offset\"\n description=\"Multiple of 1000, e.g. 4000. This will offset the ports used by the project, e.g. API at 4001, database at 4432, to avoid conflicts with other projects.\"\n control={control}\n registerOptions={{ valueAsNumber: true }}\n />\n <InputFieldController\n label=\"Package Scope\"\n name=\"packageScope\"\n description=\"The scope for packages in this project, e.g. my-project will result in @my-project/app-name\"\n control={control}\n />\n </SectionListSectionContent>\n </SectionListSection>\n </SectionList>\n </div>\n <FormActionBar form={form} />\n </form>\n );\n}\n"],"names":["generalSettingsSchema","importShared","useBlockUnsavedChangesNavigate","useProjectDefinition","useResettableForm","FormActionBar","InputFieldController","SectionList","SectionListSection","SectionListSectionContent","SectionListSectionHeader","SectionListSectionTitle","SplitComponent","definition","saveDefinitionWithFeedback","form","resolver","zodResolver","defaultValues","settings","general","handleSubmit","control","reset","onSubmit","draftConfig","data","jsxs","jsx","valueAsNumber"],"mappings":"wJAEA,KAAA,CAAA,sBAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EACA,CAAA,+BAAAC,EAAA,qBAAAC,EAAA,kBAAAC,CAAA,EAAA,MAAAH,EAAA,wCAAA,EAKA,CAAA,cAAAI,EAAA,qBAAAC,EAAA,YAAAC,EAAA,mBAAAC,EAAA,0BAAAC,EAAA,yBAAAC,EAAA,wBAAAC,CAAA,EAAA,MAAAV,EAAA,8BAAA,EASsDW,EAAA,UAUJ,CAC1C,KAAA,CAAEC,WAAAA,EAAYC,2BAAAA,GAA+BX,EAAqB,EAElEY,EAAOX,EAAkB,CAC7BY,SAAUC,EAAYjB,CAAqB,EAC3CkB,cAAeL,EAAWM,SAASC,OAAAA,CACpC,EAEK,CAAEC,aAAAA,EAAcC,QAAAA,EAASC,MAAAA,CAAAA,EAAUR,EAEnCS,EAAWH,EACfP,GAAAA,EAA4CW,GAAA,CAC1CA,EAAYN,SAASC,QAAUM,CAAAA,CAChC,CACH,EAE+B,OAAAxB,EAAA,CAAEoB,QAAAA,EAASC,MAAAA,EAAOC,SAAAA,CAAAA,CAAU,EAGxDG,EAAAA,KAAA,OAAA,CACC,UAAU,sDACV,SAAAH,EAEA,SAAA,CAACG,EAAAA,KAAA,MAAA,CAAI,UAAU,8DACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,2CACb,SAACA,MAAA,KAAA,CAAG,4BAAgB,CACtB,CAAA,EACAA,EAAA,IAACrB,EACC,CAAA,SAAAoB,EAAAA,KAACnB,EACC,CAAA,SAAA,CAAAoB,MAAClB,EACC,CAAA,SAAAkB,EAAA,IAACjB,EAAwB,CAAA,SAAA,UAAQ,CAAA,EACnC,EACAgB,EAAAA,KAAClB,EAA0B,CAAA,UAAU,+BACnC,SAAA,CAACmB,EAAAA,IAAAtB,EAAA,CACC,KAAK,OACL,MAAM,eACN,YAAY,gDACZ,QAAAgB,EACA,YAAY,iBAAiB,CAAA,EAE/BM,EAAAA,IAACtB,GACC,KAAK,aACL,MAAM,cACN,YAAY,2JACZ,QAAAgB,EACA,gBAAiB,CAAEO,cAAe,EAAA,EAAO,EAE3CD,MAACtB,GACC,MAAM,gBACN,KAAK,eACL,YAAY,8FACZ,QAAAgB,CAAiB,CAAA,CAAA,CAErB,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAAA,EACF,EACAM,MAACvB,GAAc,KAAAU,CAAW,CAAA,CAAA,EAC5B,CAEJ"}
|
|
@@ -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{H as r}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{i as s}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{H as r}from"./index-DEKFCy0H.js";import{N as o}from"./new-model-dialog-CiwTpKcZ.js";const{useProjectDefinition:a}=await s("@baseplate-dev/project-builder-lib/web"),{Button:t,EmptyDisplay:n}=await s("@baseplate-dev/ui-components"),h=function(){const{definition:i}=a();return i.models.length===0?e.jsx(n,{icon:r,header:"No Models",subtitle:"Create a model to get started",actions:e.jsx(o,{children:e.jsx(t,{children:"New Model"})})}):e.jsxs("div",{className:"max-w-4xl space-y-4 p-4 text-style-prose",children:[e.jsx("h1",{children:"Models"}),e.jsx("p",{children:"Models are the building blocks of your app. They define the data structure of your app."}),e.jsxs("p",{children:["Choose a model to edit from the sidebar or"," ",e.jsx(o,{children:e.jsx(t,{variant:"link",size:"none",children:"create a new model"})}),"."]})]})};export{h as component};
|
|
2
|
+
//# sourceMappingURL=index-Ckh17o1U.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-Ckh17o1U.js","sources":["../../src/routes/data/models/index.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { Button, EmptyDisplay } from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\nimport { HiDatabase } from 'react-icons/hi';\n\nimport { NewModelDialog } from './-components/new-model-dialog.js';\n\nexport const Route = createFileRoute('/data/models/')({\n component: ModelsIndexPage,\n});\n\nfunction ModelsIndexPage(): React.JSX.Element {\n const { definition } = useProjectDefinition();\n\n if (definition.models.length === 0) {\n return (\n <EmptyDisplay\n icon={HiDatabase}\n header=\"No Models\"\n subtitle=\"Create a model to get started\"\n actions={\n <NewModelDialog>\n <Button>New Model</Button>\n </NewModelDialog>\n }\n />\n );\n }\n\n return (\n <div className=\"max-w-4xl space-y-4 p-4 text-style-prose\">\n <h1>Models</h1>\n <p>\n Models are the building blocks of your app. They define the data\n structure of your app.\n </p>\n <p>\n Choose a model to edit from the sidebar or{' '}\n <NewModelDialog>\n <Button variant=\"link\" size=\"none\">\n create a new model\n </Button>\n </NewModelDialog>\n .\n </p>\n </div>\n );\n}\n"],"names":["useProjectDefinition","importShared","Button","EmptyDisplay","SplitComponent","definition","models","length","jsx","HiDatabase","NewModelDialog","jsxs"],"mappings":"2MAEA,KAAA,CAAA,qBAAAA,CAAA,EAAA,MAAAC,EAAA,wCAAA,EACA,CAAA,OAAAC,EAAA,aAAAC,CAAA,EAAA,MAAAF,EAAA,8BAAA,EAImEG,EAAA,UAMrB,CACtC,KAAA,CAAEC,WAAAA,GAAeL,EAAqB,EAExCK,OAAAA,EAAWC,OAAOC,SAAW,EAE5BC,EAAA,IAAAL,EAAA,CACC,KAAMM,EACN,OAAO,YACP,SAAS,gCACT,cACGC,EACC,CAAA,SAAAF,EAAAA,IAACN,EAAO,CAAA,SAAA,WAAA,CAAS,CACnB,CAAA,EAEF,EAKJS,EAAA,KAAC,MAAI,CAAA,UAAU,2CACb,SAAA,CAAAH,EAAAA,IAAC,MAAG,SAAM,QAAA,CAAA,EACVA,EAAAA,IAAC,KAAC,SAGF,yFAAA,CAAA,SACC,IAAC,CAAA,SAAA,CAAA,6CAC2C,IAC3CA,EAAAA,IAACE,GACC,SAACF,EAAA,IAAAN,EAAA,CAAO,QAAQ,OAAO,KAAK,OAAM,SAAA,oBAAA,CAElC,CACF,CAAA,EAAgB,GAAA,CAElB,CAAA,CAAA,EACF,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{w,s as g}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{i as o}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{w,s as g}from"./index-DEKFCy0H.js";const{createWebAppSchema:v}=await o("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:C,useDefinitionSchema:L,useProjectDefinition:F,useResettableForm:A}=await o("@baseplate-dev/project-builder-lib/web"),{FormActionBar:D,InputFieldController:n,SectionList:k,SectionListSection:r,SectionListSectionContent:p,SectionListSectionDescription:m,SectionListSectionHeader:d,SectionListSectionTitle:u,SwitchFieldController:b}=await o("@baseplate-dev/ui-components"),B=function(){const{saveDefinitionWithFeedback:x}=F(),{webDefinition:i}=w.useRouteContext(),j=L(v),s=A({resolver:g(j),values:i}),{control:t,handleSubmit:h,reset:S}=s,a=h(f=>x(c=>{c.apps=c.apps.map(l=>l.id===i.id?f:l)}));return C({control:t,reset:S,onSubmit:a}),e.jsxs("form",{onSubmit:a,className:"w-full max-w-7xl space-y-4 p-4",children:[e.jsxs(k,{children:[e.jsxs(r,{children:[e.jsxs(d,{children:[e.jsx(u,{children:"General"}),e.jsx(m,{children:"Basic configuration for your web application."})]}),e.jsxs(p,{className:"space-y-6",children:[e.jsx(n,{label:"Name",control:t,name:"name"}),e.jsx(n,{label:"Package Location (optional)",placeholder:"e.g. packages/web",control:t,name:"packageLocation"}),e.jsx(n,{label:"Page Title",control:t,name:"title"}),e.jsx(n,{label:"Description Meta Tag",control:t,name:"description"})]})]}),e.jsxs(r,{children:[e.jsxs(d,{children:[e.jsx(u,{children:"Features"}),e.jsx(m,{children:"Configure optional features for your web application."})]}),e.jsxs(p,{className:"space-y-6",children:[e.jsx(b,{label:"Include Auth?",control:t,name:"includeAuth"}),e.jsx(b,{label:"Include Upload Components?",control:t,name:"includeUploadComponents"})]})]})]}),e.jsx(D,{form:s})]})};export{B as component};
|
|
2
|
+
//# sourceMappingURL=index-D48MR3bL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-D48MR3bL.js","sources":["../../src/routes/apps/edit.$key/web/index.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { createWebAppSchema } from '@baseplate-dev/project-builder-lib';\nimport {\n useBlockUnsavedChangesNavigate,\n useDefinitionSchema,\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n FormActionBar,\n InputFieldController,\n SectionList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n SwitchFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { createFileRoute } from '@tanstack/react-router';\n\nexport const Route = createFileRoute('/apps/edit/$key/web/')({\n component: WebAppGeneralForm,\n});\n\nfunction WebAppGeneralForm(): React.JSX.Element {\n const { saveDefinitionWithFeedback } = useProjectDefinition();\n const { webDefinition } = Route.useRouteContext();\n\n const webAppSchema = useDefinitionSchema(createWebAppSchema);\n const formProps = useResettableForm({\n resolver: zodResolver(webAppSchema),\n values: webDefinition,\n });\n const { control, handleSubmit, reset } = formProps;\n\n const onSubmit = handleSubmit((data) =>\n saveDefinitionWithFeedback((draftConfig) => {\n draftConfig.apps = draftConfig.apps.map((app) =>\n app.id === webDefinition.id ? data : app,\n );\n }),\n );\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n return (\n <form onSubmit={onSubmit} className=\"w-full max-w-7xl space-y-4 p-4\">\n <SectionList>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>General</SectionListSectionTitle>\n <SectionListSectionDescription>\n Basic configuration for your web application.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-6\">\n <InputFieldController label=\"Name\" control={control} name=\"name\" />\n <InputFieldController\n label=\"Package Location (optional)\"\n placeholder=\"e.g. packages/web\"\n control={control}\n name=\"packageLocation\"\n />\n <InputFieldController\n label=\"Page Title\"\n control={control}\n name=\"title\"\n />\n <InputFieldController\n label=\"Description Meta Tag\"\n control={control}\n name=\"description\"\n />\n </SectionListSectionContent>\n </SectionListSection>\n\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Features</SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure optional features for your web application.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-6\">\n <SwitchFieldController\n label=\"Include Auth?\"\n control={control}\n name=\"includeAuth\"\n />\n <SwitchFieldController\n label=\"Include Upload Components?\"\n control={control}\n name=\"includeUploadComponents\"\n />\n </SectionListSectionContent>\n </SectionListSection>\n </SectionList>\n <FormActionBar form={formProps} />\n </form>\n );\n}\n"],"names":["createWebAppSchema","importShared","useBlockUnsavedChangesNavigate","useDefinitionSchema","useProjectDefinition","useResettableForm","FormActionBar","InputFieldController","SectionList","SectionListSection","SectionListSectionContent","SectionListSectionDescription","SectionListSectionHeader","SectionListSectionTitle","SwitchFieldController","SplitComponent","saveDefinitionWithFeedback","webDefinition","Route","useRouteContext","webAppSchema","formProps","resolver","zodResolver","values","control","handleSubmit","reset","onSubmit","draftConfig","apps","map","app","id","data","jsxs","jsx"],"mappings":"0JAEA,KAAA,CAAA,mBAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EACA,CAAA,+BAAAC,EAAA,oBAAAC,EAAA,qBAAAC,EAAA,kBAAAC,CAAA,EAAA,MAAAJ,EAAA,wCAAA,EAMA,CAAA,cAAAK,EAAA,qBAAAC,EAAA,YAAAC,EAAA,mBAAAC,EAAA,0BAAAC,EAAA,8BAAAC,EAAA,yBAAAC,EAAA,wBAAAC,EAAA,sBAAAC,CAAA,EAAA,MAAAb,EAAA,8BAAA,EAWsDc,EAAA,UAON,CACxC,KAAA,CAAEC,2BAAAA,GAA+BZ,EAAqB,EACtD,CAAEa,cAAAA,CAAAA,EAAkBC,EAAMC,gBAAgB,EAE1CC,EAAejB,EAAoBH,CAAkB,EACrDqB,EAAYhB,EAAkB,CAClCiB,SAAUC,EAAYH,CAAY,EAClCI,OAAQP,CAAAA,CACT,EACK,CAAEQ,QAAAA,EAASC,aAAAA,EAAcC,MAAAA,CAAAA,EAAUN,EAEnCO,EAAWF,EACfV,GAAAA,EAA4Ca,GAAA,CAC9BC,EAAAA,KAAOD,EAAYC,KAAKC,IAAKC,GACvCA,EAAIC,KAAOhB,EAAcgB,GAAKC,EAAOF,CACvC,CAAA,CACD,CACH,EAE+B,OAAA9B,EAAA,CAAEuB,QAAAA,EAASE,MAAAA,EAAOC,SAAAA,CAAAA,CAAU,EAGxDO,EAAAA,KAAA,OAAA,CAAK,SAAAP,EAAoB,UAAU,iCAClC,SAAA,CAAAO,OAAC3B,EACC,CAAA,SAAA,CAAA2B,OAAC1B,EACC,CAAA,SAAA,CAAA0B,OAACvB,EACC,CAAA,SAAA,CAAAwB,EAAAA,IAACvB,GAAwB,SAAO,SAAA,CAAA,EAChCuB,EAAAA,IAACzB,GAA6B,SAE9B,+CAAA,CAAA,CAAA,EACF,EACAwB,EAAAA,KAACzB,EAA0B,CAAA,UAAU,YACnC,SAAA,CAAA0B,EAAA,IAAC7B,EAAqB,CAAA,MAAM,OAAO,QAAAkB,EAAkB,KAAK,OAAM,EAChEW,MAAC7B,GACC,MAAM,8BACN,YAAY,oBACZ,QAAAkB,EACA,KAAK,kBAAiB,QAEvBlB,EACC,CAAA,MAAM,aACN,QAAAkB,EACA,KAAK,QAAO,QAEblB,EACC,CAAA,MAAM,uBACN,QAAAkB,EACA,KAAK,aAAa,CAAA,CAAA,CAEtB,CAAA,CAAA,EACF,SAEChB,EACC,CAAA,SAAA,CAAA0B,OAACvB,EACC,CAAA,SAAA,CAAAwB,EAAAA,IAACvB,GAAwB,SAAQ,UAAA,CAAA,EACjCuB,EAAAA,IAACzB,GAA6B,SAE9B,uDAAA,CAAA,CAAA,EACF,EACAwB,EAAAA,KAACzB,EAA0B,CAAA,UAAU,YACnC,SAAA,CAAA0B,EAAA,IAACtB,EACC,CAAA,MAAM,gBACN,QAAAW,EACA,KAAK,cAAa,QAEnBX,EACC,CAAA,MAAM,6BACN,QAAAW,EACA,KAAK,yBAAyB,CAAA,CAAA,CAElC,CAAA,CAAA,CACF,CAAA,CAAA,EACF,EACAW,EAAAA,IAAC9B,EAAc,CAAA,KAAMe,CAAU,CAAA,CAAA,EACjC,CAEJ"}
|