@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":"route-DDbjYROk.js","sources":["../../src/routes/plugins/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n getPluginMetadataByKeyOrThrow,\n pluginEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n NavigationMenu,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n SidebarLayout,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n} from '@baseplate-dev/ui-components';\nimport { notEmpty } from '@baseplate-dev/utils';\nimport { createFileRoute, Link, Outlet } from '@tanstack/react-router';\nimport { MdAdd } from 'react-icons/md';\n\nimport { ErrorBoundary } from '#src/components/index.js';\n\nexport const Route = createFileRoute('/plugins')({\n component: PluginsLayout,\n beforeLoad: () => ({\n getTitle: () => 'Plugins',\n }),\n});\n\nfunction PluginsLayout(): React.JSX.Element {\n const { definition, schemaParserContext } = useProjectDefinition();\n\n const { availablePlugins } = schemaParserContext.pluginStore;\n\n const enabledPlugins = (definition.plugins ?? [])\n .filter(\n (plugin) =>\n !getPluginMetadataByKeyOrThrow(\n schemaParserContext.pluginStore,\n pluginEntityType.keyFromId(plugin.id),\n ).managedBy,\n )\n .map((plugin) => {\n const pluginWithMetadata = availablePlugins.find(\n (p) => p.metadata.key === pluginEntityType.keyFromId(plugin.id),\n );\n return pluginWithMetadata?.metadata;\n })\n .filter(notEmpty);\n\n return (\n <SidebarLayout className=\"flex-1\">\n <SidebarLayoutSidebar className=\"flex flex-col gap-4\" width=\"sm\">\n <Link to=\"/plugins\">\n <Button variant=\"secondary\" className=\"w-full\" size=\"sm\">\n <MdAdd />\n Add new plugin\n </Button>\n </Link>\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {enabledPlugins.map((plugin) => (\n <NavigationMenuLink key={plugin.key} asChild>\n <Link to={`/plugins/edit/$key`} params={{ key: plugin.key }}>\n {plugin.displayName}\n </Link>\n </NavigationMenuLink>\n ))}\n {enabledPlugins.length === 0 && (\n <NavigationMenuItem className=\"mt-4 w-full text-center opacity-80\">\n No plugins enabled\n </NavigationMenuItem>\n )}\n </NavigationMenuList>\n </NavigationMenu>\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":["getPluginMetadataByKeyOrThrow","pluginEntityType","importShared","useProjectDefinition","Button","NavigationMenu","NavigationMenuItem","NavigationMenuLink","NavigationMenuList","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","notEmpty","Link","Outlet","SplitComponent","definition","schemaParserContext","availablePlugins","pluginStore","enabledPlugins","plugins","filter","plugin","keyFromId","id","managedBy","map","find","p","metadata","key","jsxs","jsx","MdAdd","displayName","length","ErrorBoundary"],"mappings":"gMAEA,KAAA,CAAA,8BAAAA,EAAA,iBAAAC,CAAA,EAAA,MAAAC,EAAA,oCAAA,EAIA,CAAA,qBAAAC,CAAA,EAAA,MAAAD,EAAA,wCAAA,EACA,CAAA,OAAAE,EAAA,eAAAC,EAAA,mBAAAC,EAAA,mBAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,qBAAAC,CAAA,EAAA,MAAAT,EAAA,8BAAA,EAUA,CAAA,SAAAU,CAAA,EAAA,MAAAV,EAAA,sBAAA,EACA,CAAA,KAAAW,EAAA,OAAAC,CAAA,EAAA,MAAAZ,EAAA,wBAAA,EAGyDa,EAAA,UASb,CACpC,KAAA,CAAEC,WAAAA,EAAYC,oBAAAA,GAAwBd,EAAqB,EAE3D,CAAEe,iBAAAA,GAAqBD,EAAoBE,YAE3CC,GAAkBJ,EAAWK,SAAW,IAC3CC,OACEC,GACC,CAACvB,EACCiB,EAAoBE,YACpBlB,EAAiBuB,UAAUD,EAAOE,EAAE,CACtC,EAAEC,SACN,EACCC,IAAgBJ,GACYL,EAAiBU,KACnCC,GAAAA,EAAEC,SAASC,MAAQ9B,EAAiBuB,UAAUD,EAAOE,EAAE,CAChE,GAC2BK,QAC5B,EACAR,OAAOV,CAAQ,EAGhB,OAAAoB,EAAA,KAACvB,EAAc,CAAA,UAAU,SACvB,SAAA,CAAAuB,EAAA,KAACrB,EAAqB,CAAA,UAAU,sBAAsB,MAAM,KAC1D,SAAA,CAACsB,EAAA,IAAApB,EAAA,CAAK,GAAG,WACP,SAACmB,EAAAA,KAAA5B,EAAA,CAAO,QAAQ,YAAY,UAAU,SAAS,KAAK,KAClD,SAAA,CAAA6B,EAAA,IAACC,EAAK,EAAA,EAAA,gBAAA,CAAA,CAER,CACF,CAAA,EACCD,MAAA5B,EAAA,CAAe,YAAY,WAC1B,gBAACG,EACEY,CAAAA,SAAAA,CAAeO,EAAAA,IACdJ,GAAAU,EAAAA,IAAC1B,EAAoC,CAAA,QAAO,GAC1C,SAAC0B,EAAAA,IAAApB,EAAA,CAAK,GAAI,qBAAsB,OAAQ,CAAEkB,IAAKR,EAAOQ,GAAAA,EACnDR,SAAOY,EAAAA,WAAAA,CACV,CAHuBZ,EAAAA,EAAOQ,GAIhC,CACD,EACAX,EAAegB,SAAW,SACxB9B,EAAmB,CAAA,UAAU,qCAAoC,SAElE,oBAAA,CAAA,CAAA,CAAA,CAEJ,CACF,CAAA,CAAA,EACF,EACA2B,EAAAA,IAACvB,GAAqB,UAAU,2CAC9B,eAAC2B,EACC,CAAA,SAAAJ,EAAA,IAACnB,EAAM,CAAA,CAAA,CACT,CAAA,CACF,CAAA,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"route-DluQ5e3_.js","sources":["../../src/routes/plugins/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n getPluginMetadataByKeyOrThrow,\n pluginEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n NavigationMenu,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n SidebarLayout,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n} from '@baseplate-dev/ui-components';\nimport { notEmpty } from '@baseplate-dev/utils';\nimport { createFileRoute, Link, Outlet } from '@tanstack/react-router';\nimport { MdAdd } from 'react-icons/md';\n\nimport { ErrorBoundary } from '#src/components/index.js';\n\nexport const Route = createFileRoute('/plugins')({\n component: PluginsLayout,\n beforeLoad: () => ({\n getTitle: () => 'Plugins',\n }),\n});\n\nfunction PluginsLayout(): React.JSX.Element {\n const { definition, schemaParserContext } = useProjectDefinition();\n\n const { availablePlugins } = schemaParserContext.pluginStore;\n\n const enabledPlugins = (definition.plugins ?? [])\n .filter(\n (plugin) =>\n !getPluginMetadataByKeyOrThrow(\n schemaParserContext.pluginStore,\n pluginEntityType.keyFromId(plugin.id),\n ).managedBy,\n )\n .map((plugin) => {\n const pluginWithMetadata = availablePlugins.find(\n (p) => p.metadata.key === pluginEntityType.keyFromId(plugin.id),\n );\n return pluginWithMetadata?.metadata;\n })\n .filter(notEmpty);\n\n return (\n <SidebarLayout className=\"flex-1\">\n <SidebarLayoutSidebar className=\"flex flex-col gap-4\" width=\"sm\">\n <Link to=\"/plugins\">\n <Button variant=\"secondary\" className=\"w-full\" size=\"sm\">\n <MdAdd />\n Add new plugin\n </Button>\n </Link>\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {enabledPlugins.map((plugin) => (\n <NavigationMenuLink key={plugin.key} asChild>\n <Link to={`/plugins/edit/$key`} params={{ key: plugin.key }}>\n {plugin.displayName}\n </Link>\n </NavigationMenuLink>\n ))}\n {enabledPlugins.length === 0 && (\n <NavigationMenuItem className=\"mt-4 w-full text-center opacity-80\">\n No plugins enabled\n </NavigationMenuItem>\n )}\n </NavigationMenuList>\n </NavigationMenu>\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":["getPluginMetadataByKeyOrThrow","pluginEntityType","importShared","useProjectDefinition","Button","NavigationMenu","NavigationMenuItem","NavigationMenuLink","NavigationMenuList","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","notEmpty","Link","Outlet","SplitComponent","definition","schemaParserContext","availablePlugins","pluginStore","enabledPlugins","plugins","filter","plugin","keyFromId","id","managedBy","map","find","p","metadata","key","jsxs","jsx","MdAdd","displayName","length","ErrorBoundary"],"mappings":"gMAEA,KAAA,CAAA,8BAAAA,EAAA,iBAAAC,CAAA,EAAA,MAAAC,EAAA,oCAAA,EAIA,CAAA,qBAAAC,CAAA,EAAA,MAAAD,EAAA,wCAAA,EACA,CAAA,OAAAE,EAAA,eAAAC,EAAA,mBAAAC,EAAA,mBAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,qBAAAC,CAAA,EAAA,MAAAT,EAAA,8BAAA,EAUA,CAAA,SAAAU,CAAA,EAAA,MAAAV,EAAA,sBAAA,EACA,CAAA,KAAAW,EAAA,OAAAC,CAAA,EAAA,MAAAZ,EAAA,wBAAA,EAGyDa,EAAA,UASb,CACpC,KAAA,CAAEC,WAAAA,EAAYC,oBAAAA,GAAwBd,EAAqB,EAE3D,CAAEe,iBAAAA,GAAqBD,EAAoBE,YAE3CC,GAAkBJ,EAAWK,SAAW,IAC3CC,OACEC,GACC,CAACvB,EACCiB,EAAoBE,YACpBlB,EAAiBuB,UAAUD,EAAOE,EAAE,CACtC,EAAEC,SACN,EACCC,IAAgBJ,GACYL,EAAiBU,KACnCC,GAAAA,EAAEC,SAASC,MAAQ9B,EAAiBuB,UAAUD,EAAOE,EAAE,CAChE,GAC2BK,QAC5B,EACAR,OAAOV,CAAQ,EAGhB,OAAAoB,EAAA,KAACvB,EAAc,CAAA,UAAU,SACvB,SAAA,CAAAuB,EAAA,KAACrB,EAAqB,CAAA,UAAU,sBAAsB,MAAM,KAC1D,SAAA,CAACsB,EAAA,IAAApB,EAAA,CAAK,GAAG,WACP,SAACmB,EAAAA,KAAA5B,EAAA,CAAO,QAAQ,YAAY,UAAU,SAAS,KAAK,KAClD,SAAA,CAAA6B,EAAA,IAACC,EAAK,EAAA,EAAA,gBAAA,CAAA,CAER,CACF,CAAA,EACCD,MAAA5B,EAAA,CAAe,YAAY,WAC1B,gBAACG,EACEY,CAAAA,SAAAA,CAAeO,EAAAA,IACdJ,GAAAU,EAAAA,IAAC1B,EAAoC,CAAA,QAAO,GAC1C,SAAC0B,EAAAA,IAAApB,EAAA,CAAK,GAAI,qBAAsB,OAAQ,CAAEkB,IAAKR,EAAOQ,GAAAA,EACnDR,SAAOY,EAAAA,WAAAA,CACV,CAHuBZ,EAAAA,EAAOQ,GAIhC,CACD,EACAX,EAAegB,SAAW,SACxB9B,EAAmB,CAAA,UAAU,qCAAoC,SAElE,oBAAA,CAAA,CAAA,CAAA,CAEJ,CACF,CAAA,CAAA,EACF,EACA2B,EAAAA,IAACvB,GAAqB,UAAU,2CAC9B,eAAC2B,EACC,CAAA,SAAAJ,EAAA,IAACnB,EAAM,CAAA,CAAA,CACT,CAAA,CACF,CAAA,CAAA,EACF,CAEJ"}
@@ -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{J as m,A as l}from"./index-tflukq04.js";import{N as p}from"./new-admin-section-dialog-YeMy0G96.js";import{R as o}from"./index-BekC6gsX.js";import{s as x}from"./sortBy-C9bvycg5.js";const{adminSectionEntityType:u}=await a("@baseplate-dev/project-builder-lib"),{Button:h,NavigationMenu:j,NavigationMenuItemWithLink:f,NavigationMenuList:y,SidebarLayout:N,SidebarLayoutContent:S,SidebarLayoutSidebar:g}=await a("@baseplate-dev/ui-components"),{Link:r,Outlet:v}=await a("@tanstack/react-router"),C=function(){const{adminApp:c,app:i}=o.useLoaderData(),{appKey:t}=o.useParams(),d=c.sections??[],n=x(d,[s=>s.name]);return e.jsxs(N,{className:"flex-1",children:[e.jsxs(g,{className:"space-y-4",width:"sm",children:[e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs(r,{to:"/apps/edit/$key/web/admin",params:{key:t},className:"flex items-center gap-2 text-sm hover:underline",children:[e.jsx(m,{}),"Back to Admin Config"]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold",children:i.name}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Admin Sections"})]})]}),e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx(p,{appId:i.id,appKey:t,children:e.jsxs(h,{variant:"secondary",className:"w-full",children:[e.jsx(l,{}),"New Section"]})})}),n.length>0&&e.jsx(j,{orientation:"vertical",children:e.jsx(y,{children:n.map(s=>e.jsx(f,{asChild:!0,children:e.jsx(r,{to:"/admin-sections/$appKey/edit/$sectionKey",params:{appKey:t,sectionKey:u.keyFromId(s.id)},children:s.name})},s.id))})})]}),e.jsx(S,{children:e.jsx(v,{})})]})};export{C as component};
2
- //# sourceMappingURL=route-CTv4dICL.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{J as m,A as l}from"./index-tflukq04.js";import{N as p}from"./new-admin-section-dialog-4X2fxo7a.js";import{R as o}from"./index-DEKFCy0H.js";import{s as x}from"./sortBy-C9bvycg5.js";const{adminSectionEntityType:u}=await a("@baseplate-dev/project-builder-lib"),{Button:h,NavigationMenu:j,NavigationMenuItemWithLink:f,NavigationMenuList:y,SidebarLayout:N,SidebarLayoutContent:S,SidebarLayoutSidebar:g}=await a("@baseplate-dev/ui-components"),{Link:r,Outlet:v}=await a("@tanstack/react-router"),C=function(){const{adminApp:c,app:i}=o.useLoaderData(),{appKey:t}=o.useParams(),d=c.sections??[],n=x(d,[s=>s.name]);return e.jsxs(N,{className:"flex-1",children:[e.jsxs(g,{className:"space-y-4",width:"sm",children:[e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs(r,{to:"/apps/edit/$key/web/admin",params:{key:t},className:"flex items-center gap-2 text-sm hover:underline",children:[e.jsx(m,{}),"Back to Admin Config"]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold",children:i.name}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Admin Sections"})]})]}),e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx(p,{appId:i.id,appKey:t,children:e.jsxs(h,{variant:"secondary",className:"w-full",children:[e.jsx(l,{}),"New Section"]})})}),n.length>0&&e.jsx(j,{orientation:"vertical",children:e.jsx(y,{children:n.map(s=>e.jsx(f,{asChild:!0,children:e.jsx(r,{to:"/admin-sections/$appKey/edit/$sectionKey",params:{appKey:t,sectionKey:u.keyFromId(s.id)},children:s.name})},s.id))})})]}),e.jsx(S,{children:e.jsx(v,{})})]})};export{C as component};
2
+ //# sourceMappingURL=route-DzYT3FNA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-CTv4dICL.js","sources":["../../src/routes/admin-sections.$appKey/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n adminSectionEntityType,\n appEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n NavigationMenu,\n NavigationMenuItemWithLink,\n NavigationMenuList,\n SidebarLayout,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n Link,\n notFound,\n Outlet,\n redirect,\n} from '@tanstack/react-router';\nimport { sortBy } from 'es-toolkit';\nimport { MdAdd, MdArrowBack } from 'react-icons/md';\n\nimport NewAdminSectionDialog from './-components/new-admin-section-dialog.js';\n\nexport const Route = createFileRoute('/admin-sections/$appKey')({\n component: AdminSectionsLayout,\n beforeLoad: ({ params: { appKey }, context: { projectDefinition } }) => {\n const appId = appEntityType.idFromKey(appKey);\n const app = appId\n ? projectDefinition.apps.find((a) => a.id === appId)\n : undefined;\n if (!app || app.type !== 'web') {\n return {};\n }\n const { adminApp } = app;\n return {\n getTitle: () => app.name,\n app,\n adminApp,\n };\n },\n loader: ({ context: { app, adminApp } }) => {\n if (!app) throw notFound();\n if (!adminApp)\n throw redirect({\n to: '/apps/edit/$key/web/admin',\n params: { key: appEntityType.keyFromId(app.id) },\n });\n return { app, adminApp };\n },\n});\n\nfunction AdminSectionsLayout(): React.JSX.Element {\n const { adminApp, app } = Route.useLoaderData();\n const { appKey } = Route.useParams();\n\n const sections = adminApp.sections ?? [];\n const sortedSections = sortBy(sections, [(section) => section.name]);\n\n return (\n <SidebarLayout className=\"flex-1\">\n <SidebarLayoutSidebar className=\"space-y-4\" width=\"sm\">\n {/* Header with back link */}\n <div className=\"flex flex-col gap-4\">\n <Link\n to=\"/apps/edit/$key/web/admin\"\n params={{ key: appKey }}\n className=\"flex items-center gap-2 text-sm hover:underline\"\n >\n <MdArrowBack />\n Back to Admin Config\n </Link>\n\n <div>\n <h2 className=\"text-lg font-semibold\">{app.name}</h2>\n <p className=\"text-sm text-muted-foreground\">Admin Sections</p>\n </div>\n </div>\n\n {/* New Section Button */}\n <div className=\"flex flex-col gap-4\">\n <NewAdminSectionDialog appId={app.id} appKey={appKey}>\n <Button variant=\"secondary\" className=\"w-full\">\n <MdAdd />\n New Section\n </Button>\n </NewAdminSectionDialog>\n </div>\n\n {/* Sections Navigation */}\n {sortedSections.length > 0 && (\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {sortedSections.map((section) => (\n <NavigationMenuItemWithLink key={section.id} asChild>\n <Link\n to=\"/admin-sections/$appKey/edit/$sectionKey\"\n params={{\n appKey,\n sectionKey: adminSectionEntityType.keyFromId(section.id),\n }}\n >\n {section.name}\n </Link>\n </NavigationMenuItemWithLink>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n )}\n </SidebarLayoutSidebar>\n\n <SidebarLayoutContent>\n <Outlet />\n </SidebarLayoutContent>\n </SidebarLayout>\n );\n}\n"],"names":["adminSectionEntityType","importShared","Button","NavigationMenu","NavigationMenuItemWithLink","NavigationMenuList","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","Link","Outlet","SplitComponent","adminApp","app","Route","useLoaderData","appKey","useParams","sections","sortedSections","sortBy","section","name","jsxs","key","jsx","MdArrowBack","NewAdminSectionDialog","id","MdAdd","length","map","sectionKey","keyFromId"],"mappings":"2SAEA,KAAA,CAAA,uBAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EAIA,CAAA,OAAAC,EAAA,eAAAC,EAAA,2BAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,qBAAAC,CAAA,EAAA,MAAAP,EAAA,8BAAA,EASA,CAAA,KAAAQ,EAAA,OAAAC,CAAA,EAAA,MAAAT,EAAA,wBAAA,EAU8EU,EAAA,UA8B5B,CAC1C,KAAA,CAAEC,SAAAA,EAAUC,IAAAA,CAAAA,EAAQC,EAAMC,cAAc,EACxC,CAAEC,OAAAA,CAAAA,EAAWF,EAAMG,UAAU,EAE7BC,EAAWN,EAASM,UAAY,CAAE,EAClCC,EAAiBC,EAAOF,EAAU,CAAcG,GAAAA,EAAQC,IAAI,CAAC,EAGjE,OAAAC,EAAA,KAACjB,EAAc,CAAA,UAAU,SACvB,SAAA,CAAAiB,EAAA,KAACf,EAAqB,CAAA,UAAU,YAAY,MAAM,KAEhD,SAAA,CAACe,EAAAA,KAAA,MAAA,CAAI,UAAU,sBACb,SAAA,CAACA,EAAAA,KAAAd,EAAA,CACC,GAAG,4BACH,OAAQ,CAAEe,IAAKR,CAAAA,EACf,UAAU,kDAEV,SAAA,CAAAS,EAAA,IAACC,EAAW,EAAA,EAAA,sBAAA,EAEd,SAEC,MACC,CAAA,SAAA,CAAAD,EAAA,IAAC,KAAG,CAAA,UAAU,wBAAyBZ,SAAAA,EAAIS,KAAK,EAC/CG,EAAA,IAAA,IAAA,CAAE,UAAU,gCAAgC,SAAc,gBAAA,CAAA,CAAA,CAC7D,CAAA,CAAA,EACF,EAGCA,MAAA,MAAA,CAAI,UAAU,sBACb,eAACE,EAAsB,CAAA,MAAOd,EAAIe,GAAI,OAAAZ,EACpC,SAACO,EAAA,KAAArB,EAAA,CAAO,QAAQ,YAAY,UAAU,SACpC,SAAA,CAAAuB,EAAA,IAACI,EAAK,EAAA,EAAA,aAAA,CAER,CAAA,CACF,CAAA,EACF,EAGCV,EAAeW,OAAS,GACvBL,EAAA,IAACtB,GAAe,YAAY,WAC1B,eAACE,EACEc,CAAAA,SAAAA,EAAeY,IACdV,GAAAI,EAAA,IAACrB,GAA4C,QAAO,GAClD,eAACK,EACC,CAAA,GAAG,2CACH,OAAQ,CACNO,OAAAA,EACAgB,WAAYhC,EAAuBiC,UAAUZ,EAAQO,EAAE,CAAA,EAGxDP,WAAQC,IACX,CAAA,CAAA,EAT+BD,EAAQO,EAUzC,CACD,EACH,CACF,CAAA,CAAA,EAEJ,EAECH,EAAA,IAAAlB,EAAA,CACC,SAACkB,EAAAA,IAAAf,EAAA,CAAA,CAAM,CACT,CAAA,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"route-DzYT3FNA.js","sources":["../../src/routes/admin-sections.$appKey/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n adminSectionEntityType,\n appEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n NavigationMenu,\n NavigationMenuItemWithLink,\n NavigationMenuList,\n SidebarLayout,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n Link,\n notFound,\n Outlet,\n redirect,\n} from '@tanstack/react-router';\nimport { sortBy } from 'es-toolkit';\nimport { MdAdd, MdArrowBack } from 'react-icons/md';\n\nimport NewAdminSectionDialog from './-components/new-admin-section-dialog.js';\n\nexport const Route = createFileRoute('/admin-sections/$appKey')({\n component: AdminSectionsLayout,\n beforeLoad: ({ params: { appKey }, context: { projectDefinition } }) => {\n const appId = appEntityType.idFromKey(appKey);\n const app = appId\n ? projectDefinition.apps.find((a) => a.id === appId)\n : undefined;\n if (!app || app.type !== 'web') {\n return {};\n }\n const { adminApp } = app;\n return {\n getTitle: () => app.name,\n app,\n adminApp,\n };\n },\n loader: ({ context: { app, adminApp } }) => {\n if (!app) throw notFound();\n if (!adminApp)\n throw redirect({\n to: '/apps/edit/$key/web/admin',\n params: { key: appEntityType.keyFromId(app.id) },\n });\n return { app, adminApp };\n },\n});\n\nfunction AdminSectionsLayout(): React.JSX.Element {\n const { adminApp, app } = Route.useLoaderData();\n const { appKey } = Route.useParams();\n\n const sections = adminApp.sections ?? [];\n const sortedSections = sortBy(sections, [(section) => section.name]);\n\n return (\n <SidebarLayout className=\"flex-1\">\n <SidebarLayoutSidebar className=\"space-y-4\" width=\"sm\">\n {/* Header with back link */}\n <div className=\"flex flex-col gap-4\">\n <Link\n to=\"/apps/edit/$key/web/admin\"\n params={{ key: appKey }}\n className=\"flex items-center gap-2 text-sm hover:underline\"\n >\n <MdArrowBack />\n Back to Admin Config\n </Link>\n\n <div>\n <h2 className=\"text-lg font-semibold\">{app.name}</h2>\n <p className=\"text-sm text-muted-foreground\">Admin Sections</p>\n </div>\n </div>\n\n {/* New Section Button */}\n <div className=\"flex flex-col gap-4\">\n <NewAdminSectionDialog appId={app.id} appKey={appKey}>\n <Button variant=\"secondary\" className=\"w-full\">\n <MdAdd />\n New Section\n </Button>\n </NewAdminSectionDialog>\n </div>\n\n {/* Sections Navigation */}\n {sortedSections.length > 0 && (\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n {sortedSections.map((section) => (\n <NavigationMenuItemWithLink key={section.id} asChild>\n <Link\n to=\"/admin-sections/$appKey/edit/$sectionKey\"\n params={{\n appKey,\n sectionKey: adminSectionEntityType.keyFromId(section.id),\n }}\n >\n {section.name}\n </Link>\n </NavigationMenuItemWithLink>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n )}\n </SidebarLayoutSidebar>\n\n <SidebarLayoutContent>\n <Outlet />\n </SidebarLayoutContent>\n </SidebarLayout>\n );\n}\n"],"names":["adminSectionEntityType","importShared","Button","NavigationMenu","NavigationMenuItemWithLink","NavigationMenuList","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","Link","Outlet","SplitComponent","adminApp","app","Route","useLoaderData","appKey","useParams","sections","sortedSections","sortBy","section","name","jsxs","key","jsx","MdArrowBack","NewAdminSectionDialog","id","MdAdd","length","map","sectionKey","keyFromId"],"mappings":"2SAEA,KAAA,CAAA,uBAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EAIA,CAAA,OAAAC,EAAA,eAAAC,EAAA,2BAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,qBAAAC,CAAA,EAAA,MAAAP,EAAA,8BAAA,EASA,CAAA,KAAAQ,EAAA,OAAAC,CAAA,EAAA,MAAAT,EAAA,wBAAA,EAU8EU,EAAA,UA8B5B,CAC1C,KAAA,CAAEC,SAAAA,EAAUC,IAAAA,CAAAA,EAAQC,EAAMC,cAAc,EACxC,CAAEC,OAAAA,CAAAA,EAAWF,EAAMG,UAAU,EAE7BC,EAAWN,EAASM,UAAY,CAAE,EAClCC,EAAiBC,EAAOF,EAAU,CAAcG,GAAAA,EAAQC,IAAI,CAAC,EAGjE,OAAAC,EAAA,KAACjB,EAAc,CAAA,UAAU,SACvB,SAAA,CAAAiB,EAAA,KAACf,EAAqB,CAAA,UAAU,YAAY,MAAM,KAEhD,SAAA,CAACe,EAAAA,KAAA,MAAA,CAAI,UAAU,sBACb,SAAA,CAACA,EAAAA,KAAAd,EAAA,CACC,GAAG,4BACH,OAAQ,CAAEe,IAAKR,CAAAA,EACf,UAAU,kDAEV,SAAA,CAAAS,EAAA,IAACC,EAAW,EAAA,EAAA,sBAAA,EAEd,SAEC,MACC,CAAA,SAAA,CAAAD,EAAA,IAAC,KAAG,CAAA,UAAU,wBAAyBZ,SAAAA,EAAIS,KAAK,EAC/CG,EAAA,IAAA,IAAA,CAAE,UAAU,gCAAgC,SAAc,gBAAA,CAAA,CAAA,CAC7D,CAAA,CAAA,EACF,EAGCA,MAAA,MAAA,CAAI,UAAU,sBACb,eAACE,EAAsB,CAAA,MAAOd,EAAIe,GAAI,OAAAZ,EACpC,SAACO,EAAA,KAAArB,EAAA,CAAO,QAAQ,YAAY,UAAU,SACpC,SAAA,CAAAuB,EAAA,IAACI,EAAK,EAAA,EAAA,aAAA,CAER,CAAA,CACF,CAAA,EACF,EAGCV,EAAeW,OAAS,GACvBL,EAAA,IAACtB,GAAe,YAAY,WAC1B,eAACE,EACEc,CAAAA,SAAAA,EAAeY,IACdV,GAAAI,EAAA,IAACrB,GAA4C,QAAO,GAClD,eAACK,EACC,CAAA,GAAG,2CACH,OAAQ,CACNO,OAAAA,EACAgB,WAAYhC,EAAuBiC,UAAUZ,EAAQO,EAAE,CAAA,EAGxDP,WAAQC,IACX,CAAA,CAAA,EAT+BD,EAAQO,EAUzC,CACD,EACH,CACF,CAAA,CAAA,EAEJ,EAECH,EAAA,IAAAlB,EAAA,CACC,SAACkB,EAAAA,IAAAf,EAAA,CAAA,CAAM,CACT,CAAA,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{i as s}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as t}from"./jsx-runtime-D_zvdyIk.js";import{E as r}from"./index-BekC6gsX.js";const{NavigationMenu:a,NavigationMenuLink:e,NavigationMenuList:n,SidebarLayout:o,SidebarLayoutContent:l,SidebarLayoutSidebar:c}=await s("@baseplate-dev/ui-components"),{Link:i,Outlet:d}=await s("@tanstack/react-router"),j=function(){return t.jsxs(o,{className:"h-full flex-1",children:[t.jsx(c,{className:"space-y-4",width:"sm",children:t.jsx(a,{orientation:"vertical",children:t.jsxs(n,{children:[t.jsx(e,{asChild:!0,children:t.jsx(i,{to:"/settings",children:"Project settings"})}),t.jsx(e,{asChild:!0,children:t.jsx(i,{to:"/settings/hierarchy",children:"Hierarchy"})}),t.jsx(e,{asChild:!0,children:t.jsx(i,{to:"/settings/theme-builder",children:"Theme builder"})}),r&&t.jsx(e,{asChild:!0,children:t.jsx(i,{to:"/settings/template-extractor",children:"Template extractor"})})]})})}),t.jsx(l,{className:"h-full",children:t.jsx(d,{})})]})};export{j as component};
2
- //# sourceMappingURL=route-CrSpNRRy.js.map
1
+ import{i as s}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as t}from"./jsx-runtime-D_zvdyIk.js";import{E as r}from"./index-DEKFCy0H.js";const{NavigationMenu:a,NavigationMenuLink:e,NavigationMenuList:n,SidebarLayout:o,SidebarLayoutContent:l,SidebarLayoutSidebar:c}=await s("@baseplate-dev/ui-components"),{Link:i,Outlet:d}=await s("@tanstack/react-router"),j=function(){return t.jsxs(o,{className:"h-full flex-1",children:[t.jsx(c,{className:"space-y-4",width:"sm",children:t.jsx(a,{orientation:"vertical",children:t.jsxs(n,{children:[t.jsx(e,{asChild:!0,children:t.jsx(i,{to:"/settings",children:"Project settings"})}),t.jsx(e,{asChild:!0,children:t.jsx(i,{to:"/settings/hierarchy",children:"Hierarchy"})}),t.jsx(e,{asChild:!0,children:t.jsx(i,{to:"/settings/theme-builder",children:"Theme builder"})}),r&&t.jsx(e,{asChild:!0,children:t.jsx(i,{to:"/settings/template-extractor",children:"Template extractor"})})]})})}),t.jsx(l,{className:"h-full",children:t.jsx(d,{})})]})};export{j as component};
2
+ //# sourceMappingURL=route-PmxQsBVj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-CrSpNRRy.js","sources":["../../src/routes/settings/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n NavigationMenu,\n NavigationMenuLink,\n NavigationMenuList,\n SidebarLayout,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n} from '@baseplate-dev/ui-components';\nimport { createFileRoute, Link, Outlet } from '@tanstack/react-router';\n\nimport { ENABLE_TEMPLATE_EXTRACTOR } from '#src/services/config.js';\n\nexport const Route = createFileRoute('/settings')({\n component: SettingsLayout,\n beforeLoad: () => ({\n getTitle: () => 'Settings',\n }),\n});\n\nfunction SettingsLayout(): React.JSX.Element {\n return (\n <SidebarLayout className=\"h-full flex-1\">\n <SidebarLayoutSidebar className=\"space-y-4\" width=\"sm\">\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n <NavigationMenuLink asChild>\n <Link to={`/settings`}>Project settings</Link>\n </NavigationMenuLink>\n <NavigationMenuLink asChild>\n <Link to={`/settings/hierarchy`}>Hierarchy</Link>\n </NavigationMenuLink>\n <NavigationMenuLink asChild>\n <Link to={`/settings/theme-builder`}>Theme builder</Link>\n </NavigationMenuLink>\n {ENABLE_TEMPLATE_EXTRACTOR && (\n <NavigationMenuLink asChild>\n <Link to={`/settings/template-extractor`}>\n Template extractor\n </Link>\n </NavigationMenuLink>\n )}\n </NavigationMenuList>\n </NavigationMenu>\n </SidebarLayoutSidebar>\n <SidebarLayoutContent className=\"h-full\">\n <Outlet />\n </SidebarLayoutContent>\n </SidebarLayout>\n );\n}\n"],"names":["NavigationMenu","NavigationMenuLink","NavigationMenuList","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","importShared","Link","Outlet","SplitComponent","jsxs","jsx","ENABLE_TEMPLATE_EXTRACTOR"],"mappings":"wJAEA,KAAA,CAAA,eAAAA,EAAA,mBAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,qBAAAC,CAAA,EAAA,MAAAC,EAAA,8BAAA,EAQA,CAAA,KAAAC,EAAA,OAAAC,CAAA,EAAA,MAAAF,EAAA,wBAAA,EAEoEG,EAAA,UASvB,CAEzC,OAAAC,EAAA,KAACP,EAAc,CAAA,UAAU,gBACvB,SAAA,CAACQ,EAAA,IAAAN,EAAA,CAAqB,UAAU,YAAY,MAAM,KAChD,eAACL,EAAe,CAAA,YAAY,WAC1B,SAAAU,EAAAA,KAACR,EACC,CAAA,SAAA,CAACS,EAAA,IAAAV,EAAA,CAAmB,QAAO,GACzB,SAAAU,EAAAA,IAACJ,GAAK,GAAI,YAAa,4BAAgB,CACzC,CAAA,EACAI,EAAA,IAACV,GAAmB,QAAO,GACzB,eAACM,EAAK,CAAA,GAAI,sBAAuB,SAAA,WAAA,CAAS,CAC5C,CAAA,EACAI,EAAA,IAACV,GAAmB,QAAO,GACzB,eAACM,EAAK,CAAA,GAAI,0BAA2B,SAAA,eAAA,CAAa,CACpD,CAAA,EACCK,GACED,EAAA,IAAAV,EAAA,CAAmB,QAAO,GACzB,eAACM,EAAK,CAAA,GAAI,+BAA+B,SAAA,oBAAA,CAEzC,CACF,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,EACF,QACCH,EAAqB,CAAA,UAAU,SAC9B,SAAAO,EAAA,IAACH,IAAM,CACT,CAAA,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"route-PmxQsBVj.js","sources":["../../src/routes/settings/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n NavigationMenu,\n NavigationMenuLink,\n NavigationMenuList,\n SidebarLayout,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n} from '@baseplate-dev/ui-components';\nimport { createFileRoute, Link, Outlet } from '@tanstack/react-router';\n\nimport { ENABLE_TEMPLATE_EXTRACTOR } from '#src/services/config.js';\n\nexport const Route = createFileRoute('/settings')({\n component: SettingsLayout,\n beforeLoad: () => ({\n getTitle: () => 'Settings',\n }),\n});\n\nfunction SettingsLayout(): React.JSX.Element {\n return (\n <SidebarLayout className=\"h-full flex-1\">\n <SidebarLayoutSidebar className=\"space-y-4\" width=\"sm\">\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenuList>\n <NavigationMenuLink asChild>\n <Link to={`/settings`}>Project settings</Link>\n </NavigationMenuLink>\n <NavigationMenuLink asChild>\n <Link to={`/settings/hierarchy`}>Hierarchy</Link>\n </NavigationMenuLink>\n <NavigationMenuLink asChild>\n <Link to={`/settings/theme-builder`}>Theme builder</Link>\n </NavigationMenuLink>\n {ENABLE_TEMPLATE_EXTRACTOR && (\n <NavigationMenuLink asChild>\n <Link to={`/settings/template-extractor`}>\n Template extractor\n </Link>\n </NavigationMenuLink>\n )}\n </NavigationMenuList>\n </NavigationMenu>\n </SidebarLayoutSidebar>\n <SidebarLayoutContent className=\"h-full\">\n <Outlet />\n </SidebarLayoutContent>\n </SidebarLayout>\n );\n}\n"],"names":["NavigationMenu","NavigationMenuLink","NavigationMenuList","SidebarLayout","SidebarLayoutContent","SidebarLayoutSidebar","importShared","Link","Outlet","SplitComponent","jsxs","jsx","ENABLE_TEMPLATE_EXTRACTOR"],"mappings":"wJAEA,KAAA,CAAA,eAAAA,EAAA,mBAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,qBAAAC,CAAA,EAAA,MAAAC,EAAA,8BAAA,EAQA,CAAA,KAAAC,EAAA,OAAAC,CAAA,EAAA,MAAAF,EAAA,wBAAA,EAEoEG,EAAA,UASvB,CAEzC,OAAAC,EAAA,KAACP,EAAc,CAAA,UAAU,gBACvB,SAAA,CAACQ,EAAA,IAAAN,EAAA,CAAqB,UAAU,YAAY,MAAM,KAChD,eAACL,EAAe,CAAA,YAAY,WAC1B,SAAAU,EAAAA,KAACR,EACC,CAAA,SAAA,CAACS,EAAA,IAAAV,EAAA,CAAmB,QAAO,GACzB,SAAAU,EAAAA,IAACJ,GAAK,GAAI,YAAa,4BAAgB,CACzC,CAAA,EACAI,EAAA,IAACV,GAAmB,QAAO,GACzB,eAACM,EAAK,CAAA,GAAI,sBAAuB,SAAA,WAAA,CAAS,CAC5C,CAAA,EACAI,EAAA,IAACV,GAAmB,QAAO,GACzB,eAACM,EAAK,CAAA,GAAI,0BAA2B,SAAA,eAAA,CAAa,CACpD,CAAA,EACCK,GACED,EAAA,IAAAV,EAAA,CAAmB,QAAO,GACzB,eAACM,EAAK,CAAA,GAAI,+BAA+B,SAAA,oBAAA,CAEzC,CACF,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,EACF,QACCH,EAAqB,CAAA,UAAU,SAC9B,SAAAO,EAAA,IAACH,IAAM,CACT,CAAA,CAAA,EACF,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{c as p,H as j,L as v}from"./index-tflukq04.js";import{l as b,k as g}from"./index-BekC6gsX.js";import{E as y}from"./enum-info-form-3ykREN-o.js";import{u as E}from"./use-enum-form-D7XmblPC.js";const{Button:f,Dialog:C,DialogClose:D,DialogContent:N,DialogFooter:w,DialogHeader:S,DialogTitle:F,DialogTrigger:I,useControlledState:k}=await s("@baseplate-dev/ui-components");function B({enumKey:i,open:t,onOpenChange:o,asChild:r,children:l}){const[c,a]=k(t,o,!1),{form:{control:d,reset:u},onSubmit:n,defaultValues:m,isSavingDefinition:h}=E({enumKey:i,onSubmitSuccess(){a(!1)}});return e.jsxs(C,{open:c,onOpenChange:x=>{a(x),x||u(m)},children:[e.jsx(I,{asChild:r,children:l}),e.jsx(N,{"aria-describedby":void 0,children:e.jsxs("form",{onSubmit:n,className:"space-y-4",children:[e.jsx(S,{children:e.jsx(F,{children:"Edit Enum Info"})}),e.jsx(y,{control:d}),e.jsxs(w,{children:[e.jsx(D,{asChild:!0,children:e.jsx(f,{variant:"secondary",children:"Cancel"})}),e.jsx(f,{type:"submit",disabled:h,children:"Save"})]})]})})]})}const{FeatureUtils:O,modelEnumEntityType:R}=await s("@baseplate-dev/project-builder-lib"),{useProjectDefinition:T}=await s("@baseplate-dev/project-builder-lib/web"),{Button:H,useConfirmDialog:L}=await s("@baseplate-dev/ui-components"),{useNavigate:z}=await s("@tanstack/react-router");function A({className:i,enumDefinition:t}){const{definition:o,saveDefinitionWithFeedbackSync:r,isSavingDefinition:l}=T(),c=z(),{requestConfirm:a}=L(),d=u=>{r(n=>{n.enums=n.enums?.filter(m=>m.id!==u)},{onSuccess:()=>{c({to:"/data/enums"}).catch(b)}})};return e.jsxs("div",{className:p("flex items-center justify-between",i),children:[e.jsxs("div",{children:[e.jsx(B,{enumKey:R.keyFromId(t.id),asChild:!0,children:e.jsxs("button",{className:"group flex items-center space-x-2 hover:cursor-pointer",type:"button",title:"Edit Enum Info",children:[e.jsx("h1",{children:t.name}),e.jsx(j,{className:"invisible size-4 group-hover:visible"})]})}),t.featureRef&&e.jsx("div",{className:"text-xs text-muted-foreground",children:O.getFeatureById(o,t.featureRef)?.name})]}),e.jsx("div",{className:"flex gap-8",children:e.jsxs(H,{variant:"outline",size:"icon",onClick:()=>{a({title:"Confirm delete",content:`Are you sure you want to delete ${t.name}?`,buttonConfirmVariant:"destructive",buttonConfirmText:"Delete",onConfirm:()=>{d(t.id)}})},disabled:l,children:[e.jsx(v,{className:"text-destructive"}),e.jsx("div",{className:"sr-only",children:"Delete Enum"})]})})]})}const{Outlet:M}=await s("@tanstack/react-router"),W=function(){const{enumDefinition:t}=g.useLoaderData();return e.jsxs("div",{className:"relative flex h-full flex-1 flex-col overflow-hidden",children:[e.jsx("div",{className:"mx-4 max-w-7xl space-y-4 border-b py-4",children:e.jsx(A,{enumDefinition:t})}),e.jsx("div",{className:"mb-(--action-bar-height) flex flex-1 overflow-y-auto",children:e.jsx(M,{})})]},t.id)};export{W as component};
2
- //# sourceMappingURL=route-Ch1y-64Q.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{c as p,H as j,L as v}from"./index-tflukq04.js";import{l as b,k as g}from"./index-DEKFCy0H.js";import{E as y}from"./enum-info-form-3ykREN-o.js";import{u as E}from"./use-enum-form-BRBAlWJc.js";const{Button:f,Dialog:C,DialogClose:D,DialogContent:N,DialogFooter:w,DialogHeader:S,DialogTitle:F,DialogTrigger:I,useControlledState:k}=await s("@baseplate-dev/ui-components");function B({enumKey:i,open:t,onOpenChange:o,asChild:r,children:l}){const[c,a]=k(t,o,!1),{form:{control:d,reset:u},onSubmit:n,defaultValues:m,isSavingDefinition:h}=E({enumKey:i,onSubmitSuccess(){a(!1)}});return e.jsxs(C,{open:c,onOpenChange:x=>{a(x),x||u(m)},children:[e.jsx(I,{asChild:r,children:l}),e.jsx(N,{"aria-describedby":void 0,children:e.jsxs("form",{onSubmit:n,className:"space-y-4",children:[e.jsx(S,{children:e.jsx(F,{children:"Edit Enum Info"})}),e.jsx(y,{control:d}),e.jsxs(w,{children:[e.jsx(D,{asChild:!0,children:e.jsx(f,{variant:"secondary",children:"Cancel"})}),e.jsx(f,{type:"submit",disabled:h,children:"Save"})]})]})})]})}const{FeatureUtils:O,modelEnumEntityType:R}=await s("@baseplate-dev/project-builder-lib"),{useProjectDefinition:T}=await s("@baseplate-dev/project-builder-lib/web"),{Button:H,useConfirmDialog:L}=await s("@baseplate-dev/ui-components"),{useNavigate:z}=await s("@tanstack/react-router");function A({className:i,enumDefinition:t}){const{definition:o,saveDefinitionWithFeedbackSync:r,isSavingDefinition:l}=T(),c=z(),{requestConfirm:a}=L(),d=u=>{r(n=>{n.enums=n.enums?.filter(m=>m.id!==u)},{onSuccess:()=>{c({to:"/data/enums"}).catch(b)}})};return e.jsxs("div",{className:p("flex items-center justify-between",i),children:[e.jsxs("div",{children:[e.jsx(B,{enumKey:R.keyFromId(t.id),asChild:!0,children:e.jsxs("button",{className:"group flex items-center space-x-2 hover:cursor-pointer",type:"button",title:"Edit Enum Info",children:[e.jsx("h1",{children:t.name}),e.jsx(j,{className:"invisible size-4 group-hover:visible"})]})}),t.featureRef&&e.jsx("div",{className:"text-xs text-muted-foreground",children:O.getFeatureById(o,t.featureRef)?.name})]}),e.jsx("div",{className:"flex gap-8",children:e.jsxs(H,{variant:"outline",size:"icon",onClick:()=>{a({title:"Confirm delete",content:`Are you sure you want to delete ${t.name}?`,buttonConfirmVariant:"destructive",buttonConfirmText:"Delete",onConfirm:()=>{d(t.id)}})},disabled:l,children:[e.jsx(v,{className:"text-destructive"}),e.jsx("div",{className:"sr-only",children:"Delete Enum"})]})})]})}const{Outlet:M}=await s("@tanstack/react-router"),W=function(){const{enumDefinition:t}=g.useLoaderData();return e.jsxs("div",{className:"relative flex h-full flex-1 flex-col overflow-hidden",children:[e.jsx("div",{className:"mx-4 max-w-7xl space-y-4 border-b py-4",children:e.jsx(A,{enumDefinition:t})}),e.jsx("div",{className:"mb-(--action-bar-height) flex flex-1 overflow-y-auto",children:e.jsx(M,{})})]},t.id)};export{W as component};
2
+ //# sourceMappingURL=route-gYB7kkkm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-Ch1y-64Q.js","sources":["../../src/routes/data/enums/edit.$key/-components/enum-info-edit-dialog.tsx","../../src/routes/data/enums/edit.$key/-components/enum-header-bar.tsx","../../src/routes/data/enums/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 { EnumInfoForm } from '../../-components/enum-info-form.js';\nimport { useEnumForm } from '../../-hooks/use-enum-form.js';\n\ninterface EnumInfoEditDialogProps {\n enumKey: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n asChild?: boolean;\n}\n\nexport function EnumInfoEditDialog({\n enumKey,\n open,\n onOpenChange,\n asChild,\n children,\n}: EnumInfoEditDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n\n const {\n form: { control, reset },\n onSubmit,\n defaultValues,\n isSavingDefinition,\n } = useEnumForm({\n enumKey,\n onSubmitSuccess() {\n setIsOpen(false);\n },\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 <DialogTrigger asChild={asChild}>{children}</DialogTrigger>\n <DialogContent aria-describedby={undefined}>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <DialogHeader>\n <DialogTitle>Edit Enum Info</DialogTitle>\n </DialogHeader>\n <EnumInfoForm control={control} />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" disabled={isSavingDefinition}>\n Save\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { EnumConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n FeatureUtils,\n modelEnumEntityType,\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 { EnumInfoEditDialog } from './enum-info-edit-dialog.js';\n\ninterface EnumHeaderBarProps {\n className?: string;\n enumDefinition: EnumConfig;\n}\n\nexport function EnumHeaderBar({\n className,\n enumDefinition,\n}: EnumHeaderBarProps): 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.enums = draftConfig.enums?.filter((m) => m.id !== id);\n },\n {\n onSuccess: () => {\n navigate({ to: '/data/enums' }).catch(logAndFormatError);\n },\n },\n );\n };\n\n return (\n <div className={clsx('flex items-center justify-between', className)}>\n <div>\n <EnumInfoEditDialog\n enumKey={modelEnumEntityType.keyFromId(enumDefinition.id)}\n asChild\n >\n <button\n className=\"group flex items-center space-x-2 hover:cursor-pointer\"\n type=\"button\"\n title=\"Edit Enum Info\"\n >\n <h1>{enumDefinition.name}</h1>\n <MdEdit className=\"invisible size-4 group-hover:visible\" />\n </button>\n </EnumInfoEditDialog>\n {enumDefinition.featureRef && (\n <div className=\"text-xs text-muted-foreground\">\n {\n FeatureUtils.getFeatureById(definition, enumDefinition.featureRef)\n ?.name\n }\n </div>\n )}\n </div>\n <div className=\"flex gap-8\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => {\n requestConfirm({\n title: 'Confirm delete',\n content: `Are you sure you want to delete ${\n enumDefinition.name\n }?`,\n buttonConfirmVariant: 'destructive',\n buttonConfirmText: 'Delete',\n onConfirm: () => {\n handleDelete(enumDefinition.id);\n },\n });\n }}\n disabled={isSavingDefinition}\n >\n <MdDeleteOutline className=\"text-destructive\" />\n <div className=\"sr-only\">Delete Enum</div>\n </Button>\n </div>\n </div>\n );\n}\n","import type React from 'react';\n\nimport {\n EnumUtils,\n modelEnumEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { createFileRoute, notFound, Outlet } from '@tanstack/react-router';\n\nimport { EnumHeaderBar } from './-components/enum-header-bar.js';\n\nexport const Route = createFileRoute('/data/enums/edit/$key')({\n component: EnumEditLayout,\n beforeLoad: ({ params: { key }, context: { projectDefinition } }) => {\n const id = modelEnumEntityType.idFromKey(key);\n const enumDefinition = EnumUtils.byId(projectDefinition, id);\n if (!enumDefinition) return {};\n return {\n getTitle: () => enumDefinition.name,\n enumDefinition,\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: { enumDefinition } }) => {\n if (!enumDefinition) throw notFound();\n return { enumDefinition };\n },\n});\n\nfunction EnumEditLayout(): React.JSX.Element {\n const { enumDefinition } = Route.useLoaderData();\n\n return (\n <div\n className=\"relative flex h-full flex-1 flex-col overflow-hidden\"\n key={enumDefinition.id}\n >\n <div className=\"mx-4 max-w-7xl space-y-4 border-b py-4\">\n <EnumHeaderBar enumDefinition={enumDefinition} />\n </div>\n <div className=\"mb-(--action-bar-height) flex flex-1 overflow-y-auto\">\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["Button","Dialog","DialogClose","DialogContent","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","useControlledState","importShared","EnumInfoEditDialog","enumKey","open","onOpenChange","asChild","children","isOpen","setIsOpen","control","reset","onSubmit","defaultValues","isSavingDefinition","useEnumForm","jsxs","newOpen","jsx","EnumInfoForm","FeatureUtils","modelEnumEntityType","useProjectDefinition","useConfirmDialog","useNavigate","EnumHeaderBar","className","enumDefinition","definition","saveDefinitionWithFeedbackSync","navigate","requestConfirm","handleDelete","id","draftConfig","logAndFormatError","clsx","MdEdit","MdDeleteOutline","Outlet","SplitComponent","Route","useLoaderData"],"mappings":"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"}
1
+ {"version":3,"file":"route-gYB7kkkm.js","sources":["../../src/routes/data/enums/edit.$key/-components/enum-info-edit-dialog.tsx","../../src/routes/data/enums/edit.$key/-components/enum-header-bar.tsx","../../src/routes/data/enums/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 { EnumInfoForm } from '../../-components/enum-info-form.js';\nimport { useEnumForm } from '../../-hooks/use-enum-form.js';\n\ninterface EnumInfoEditDialogProps {\n enumKey: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n asChild?: boolean;\n}\n\nexport function EnumInfoEditDialog({\n enumKey,\n open,\n onOpenChange,\n asChild,\n children,\n}: EnumInfoEditDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n\n const {\n form: { control, reset },\n onSubmit,\n defaultValues,\n isSavingDefinition,\n } = useEnumForm({\n enumKey,\n onSubmitSuccess() {\n setIsOpen(false);\n },\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 <DialogTrigger asChild={asChild}>{children}</DialogTrigger>\n <DialogContent aria-describedby={undefined}>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <DialogHeader>\n <DialogTitle>Edit Enum Info</DialogTitle>\n </DialogHeader>\n <EnumInfoForm control={control} />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" disabled={isSavingDefinition}>\n Save\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { EnumConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n FeatureUtils,\n modelEnumEntityType,\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 { EnumInfoEditDialog } from './enum-info-edit-dialog.js';\n\ninterface EnumHeaderBarProps {\n className?: string;\n enumDefinition: EnumConfig;\n}\n\nexport function EnumHeaderBar({\n className,\n enumDefinition,\n}: EnumHeaderBarProps): 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.enums = draftConfig.enums?.filter((m) => m.id !== id);\n },\n {\n onSuccess: () => {\n navigate({ to: '/data/enums' }).catch(logAndFormatError);\n },\n },\n );\n };\n\n return (\n <div className={clsx('flex items-center justify-between', className)}>\n <div>\n <EnumInfoEditDialog\n enumKey={modelEnumEntityType.keyFromId(enumDefinition.id)}\n asChild\n >\n <button\n className=\"group flex items-center space-x-2 hover:cursor-pointer\"\n type=\"button\"\n title=\"Edit Enum Info\"\n >\n <h1>{enumDefinition.name}</h1>\n <MdEdit className=\"invisible size-4 group-hover:visible\" />\n </button>\n </EnumInfoEditDialog>\n {enumDefinition.featureRef && (\n <div className=\"text-xs text-muted-foreground\">\n {\n FeatureUtils.getFeatureById(definition, enumDefinition.featureRef)\n ?.name\n }\n </div>\n )}\n </div>\n <div className=\"flex gap-8\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => {\n requestConfirm({\n title: 'Confirm delete',\n content: `Are you sure you want to delete ${\n enumDefinition.name\n }?`,\n buttonConfirmVariant: 'destructive',\n buttonConfirmText: 'Delete',\n onConfirm: () => {\n handleDelete(enumDefinition.id);\n },\n });\n }}\n disabled={isSavingDefinition}\n >\n <MdDeleteOutline className=\"text-destructive\" />\n <div className=\"sr-only\">Delete Enum</div>\n </Button>\n </div>\n </div>\n );\n}\n","import type React from 'react';\n\nimport {\n EnumUtils,\n modelEnumEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { createFileRoute, notFound, Outlet } from '@tanstack/react-router';\n\nimport { EnumHeaderBar } from './-components/enum-header-bar.js';\n\nexport const Route = createFileRoute('/data/enums/edit/$key')({\n component: EnumEditLayout,\n beforeLoad: ({ params: { key }, context: { projectDefinition } }) => {\n const id = modelEnumEntityType.idFromKey(key);\n const enumDefinition = EnumUtils.byId(projectDefinition, id);\n if (!enumDefinition) return {};\n return {\n getTitle: () => enumDefinition.name,\n enumDefinition,\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: { enumDefinition } }) => {\n if (!enumDefinition) throw notFound();\n return { enumDefinition };\n },\n});\n\nfunction EnumEditLayout(): React.JSX.Element {\n const { enumDefinition } = Route.useLoaderData();\n\n return (\n <div\n className=\"relative flex h-full flex-1 flex-col overflow-hidden\"\n key={enumDefinition.id}\n >\n <div className=\"mx-4 max-w-7xl space-y-4 border-b py-4\">\n <EnumHeaderBar enumDefinition={enumDefinition} />\n </div>\n <div className=\"mb-(--action-bar-height) flex flex-1 overflow-y-auto\">\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["Button","Dialog","DialogClose","DialogContent","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","useControlledState","importShared","EnumInfoEditDialog","enumKey","open","onOpenChange","asChild","children","isOpen","setIsOpen","control","reset","onSubmit","defaultValues","isSavingDefinition","useEnumForm","jsxs","newOpen","jsx","EnumInfoForm","FeatureUtils","modelEnumEntityType","useProjectDefinition","useConfirmDialog","useNavigate","EnumHeaderBar","className","enumDefinition","definition","saveDefinitionWithFeedbackSync","navigate","requestConfirm","handleDelete","id","draftConfig","logAndFormatError","clsx","MdEdit","MdDeleteOutline","Outlet","SplitComponent","Route","useLoaderData"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as t}from"./jsx-runtime-D_zvdyIk.js";import{m as r}from"./index-BekC6gsX.js";const{NavigationTabs:n,NavigationTabsItem:a}=await i("@baseplate-dev/ui-components"),{Link:s,Outlet:o}=await i("@tanstack/react-router"),l=function(){const{key:e}=r.useParams();return t.jsxs("div",{className:"p-4",children:[t.jsxs(n,{children:[t.jsx(a,{asChild:!0,children:t.jsx(s,{to:"/apps/edit/$key/web",params:{key:e},activeOptions:{exact:!0},children:"General"})}),t.jsx(a,{asChild:!0,children:t.jsx(s,{to:"/apps/edit/$key/web/admin",params:{key:e},children:"Admin"})})]}),t.jsx("div",{className:"mt-4 border-t",children:t.jsx(o,{})})]})};export{l as component};
2
- //# sourceMappingURL=route-CbVppiIk.js.map
1
+ import{i}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as t}from"./jsx-runtime-D_zvdyIk.js";import{m as r}from"./index-DEKFCy0H.js";const{NavigationTabs:n,NavigationTabsItem:a}=await i("@baseplate-dev/ui-components"),{Link:s,Outlet:o}=await i("@tanstack/react-router"),l=function(){const{key:e}=r.useParams();return t.jsxs("div",{className:"p-4",children:[t.jsxs(n,{children:[t.jsx(a,{asChild:!0,children:t.jsx(s,{to:"/apps/edit/$key/web",params:{key:e},activeOptions:{exact:!0},children:"General"})}),t.jsx(a,{asChild:!0,children:t.jsx(s,{to:"/apps/edit/$key/web/admin",params:{key:e},children:"Admin"})})]}),t.jsx("div",{className:"mt-4 border-t",children:t.jsx(o,{})})]})};export{l as component};
2
+ //# sourceMappingURL=route-gzD4oiAl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-CbVppiIk.js","sources":["../../src/routes/apps/edit.$key/web/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n NavigationTabs,\n NavigationTabsItem,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n Link,\n Outlet,\n redirect,\n} from '@tanstack/react-router';\n\nexport const Route = createFileRoute('/apps/edit/$key/web')({\n component: WebAppLayout,\n beforeLoad: ({ context: { app }, params: { key } }) => {\n if (app?.type !== 'web') {\n throw redirect({ to: '/apps/edit/$key', params: { key } });\n }\n\n return {\n webDefinition: app,\n };\n },\n});\n\nfunction WebAppLayout(): React.JSX.Element {\n const { key } = Route.useParams();\n return (\n <div className=\"p-4\">\n <NavigationTabs>\n <NavigationTabsItem asChild>\n <Link\n to=\"/apps/edit/$key/web\"\n params={{ key }}\n activeOptions={{ exact: true }}\n >\n General\n </Link>\n </NavigationTabsItem>\n <NavigationTabsItem asChild>\n <Link to=\"/apps/edit/$key/web/admin\" params={{ key }}>\n Admin\n </Link>\n </NavigationTabsItem>\n </NavigationTabs>\n\n <div className=\"mt-4 border-t\">\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["NavigationTabs","NavigationTabsItem","importShared","Link","Outlet","SplitComponent","key","Route","useParams","jsxs","jsx","exact"],"mappings":"mJAEA,KAAA,CAAA,eAAAA,EAAA,mBAAAC,CAAA,EAAA,MAAAC,EAAA,8BAAA,EAIA,CAAA,KAAAC,EAAA,OAAAC,CAAA,EAAA,MAAAF,EAAA,wBAAA,EAKgCG,EAAA,UAeW,CACnC,KAAA,CAAEC,IAAAA,CAAAA,EAAQC,EAAMC,UAAU,EAE9B,OAAAC,EAAA,KAAC,MAAI,CAAA,UAAU,MACb,SAAA,CAAAA,OAACT,EACC,CAAA,SAAA,CAAAU,EAAAA,IAACT,GAAmB,QAAO,GACzB,eAACE,EACC,CAAA,GAAG,sBACH,OAAQ,CAAEG,IAAAA,GACV,cAAe,CAAEK,MAAO,EAAA,EAAO,kBAGjC,CAAA,EACF,EACAD,EAAAA,IAACT,GAAmB,QAAO,GACzB,eAACE,EAAK,CAAA,GAAG,4BAA4B,OAAQ,CAAEG,IAAAA,CAAAA,EAAM,iBAErD,CACF,CAAA,CAAA,EACF,QAEC,MAAI,CAAA,UAAU,gBACb,SAAAI,EAAA,IAACN,IAAM,CACT,CAAA,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"route-gzD4oiAl.js","sources":["../../src/routes/apps/edit.$key/web/route.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport {\n NavigationTabs,\n NavigationTabsItem,\n} from '@baseplate-dev/ui-components';\nimport {\n createFileRoute,\n Link,\n Outlet,\n redirect,\n} from '@tanstack/react-router';\n\nexport const Route = createFileRoute('/apps/edit/$key/web')({\n component: WebAppLayout,\n beforeLoad: ({ context: { app }, params: { key } }) => {\n if (app?.type !== 'web') {\n throw redirect({ to: '/apps/edit/$key', params: { key } });\n }\n\n return {\n webDefinition: app,\n };\n },\n});\n\nfunction WebAppLayout(): React.JSX.Element {\n const { key } = Route.useParams();\n return (\n <div className=\"p-4\">\n <NavigationTabs>\n <NavigationTabsItem asChild>\n <Link\n to=\"/apps/edit/$key/web\"\n params={{ key }}\n activeOptions={{ exact: true }}\n >\n General\n </Link>\n </NavigationTabsItem>\n <NavigationTabsItem asChild>\n <Link to=\"/apps/edit/$key/web/admin\" params={{ key }}>\n Admin\n </Link>\n </NavigationTabsItem>\n </NavigationTabs>\n\n <div className=\"mt-4 border-t\">\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["NavigationTabs","NavigationTabsItem","importShared","Link","Outlet","SplitComponent","key","Route","useParams","jsxs","jsx","exact"],"mappings":"mJAEA,KAAA,CAAA,eAAAA,EAAA,mBAAAC,CAAA,EAAA,MAAAC,EAAA,8BAAA,EAIA,CAAA,KAAAC,EAAA,OAAAC,CAAA,EAAA,MAAAF,EAAA,wBAAA,EAKgCG,EAAA,UAeW,CACnC,KAAA,CAAEC,IAAAA,CAAAA,EAAQC,EAAMC,UAAU,EAE9B,OAAAC,EAAA,KAAC,MAAI,CAAA,UAAU,MACb,SAAA,CAAAA,OAACT,EACC,CAAA,SAAA,CAAAU,EAAAA,IAACT,GAAmB,QAAO,GACzB,eAACE,EACC,CAAA,GAAG,sBACH,OAAQ,CAAEG,IAAAA,GACV,cAAe,CAAEK,MAAO,EAAA,EAAO,kBAGjC,CAAA,EACF,EACAD,EAAAA,IAACT,GAAmB,QAAO,GACzB,eAACE,EAAK,CAAA,GAAG,4BAA4B,OAAQ,CAAEG,IAAAA,CAAAA,EAAM,iBAErD,CACF,CAAA,CAAA,EACF,QAEC,MAAI,CAAA,UAAU,gBACb,SAAAI,EAAA,IAACN,IAAM,CACT,CAAA,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{i as d}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{s as _,x as O,r as U}from"./index-BekC6gsX.js";import{u as D,S as A,B as N,E as B}from"./-constants-DvXqIwvq.js";import{u as H}from"./use-model-form-dwW5mcmn.js";import{e as C,b as z,f as k}from"./index.esm-CdP29Ssb.js";import{B as L}from"./badge-with-type-label-CThmzNSh.js";import{c as V,A as G,H as K,Q as q}from"./index-tflukq04.js";const{ModelTransformerUtils:Q}=await d("@baseplate-dev/project-builder-lib"),{modelTransformerWebSpec:Y,useProjectDefinition:J}=await d("@baseplate-dev/project-builder-lib/web"),{Label:M,SectionListSection:X,SectionListSectionContent:Z,SectionListSectionDescription:ee,SectionListSectionHeader:te,SectionListSectionTitle:se,SwitchField:v}=await d("@baseplate-dev/ui-components");function ne({className:h,control:i,setValue:o}){const a=D(t=>t.model.fields),p=C({control:i,name:"service.create"}),s=C({control:i,name:"service.update"}),m=p?.enabled,n=s?.enabled,u=C({control:i,name:"service.transformers"})??[],{definitionContainer:r,pluginContainer:j}=J();if(!m&&!n)return null;const c=p?.fields??[],S=s?.fields??[],b=p?.transformerNames??[],l=s?.transformerNames??[],g="w-full border-collapse text-left [&_td]:py-1 [&_th]:sticky [&_th]:top-0 [&_th]:bg-background [&_th]:z-10 [&_th]:py-2",T=j.getPluginSpec(Y);return e.jsxs(X,{className:h,children:[e.jsxs(te,{children:[e.jsx(se,{children:"Create / Update Fields"}),e.jsx(ee,{children:"Configure the fields that can be created or updated by the service method"})]}),e.jsx(Z,{className:"max-w-xl space-y-4",children:e.jsxs("table",{className:g,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{className:"w-full",children:e.jsx(M,{children:"Fields"})}),m&&e.jsx("th",{className:"pl-8",children:"Create"}),n&&e.jsx("th",{className:"pl-8",children:"Update"})]})}),e.jsxs("tbody",{children:[a.map(t=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx(L,{type:t.type==="enum"&&t.options?.enumRef?r.nameFromId(t.options.enumRef):A[t.type].label,children:t.name})}),m&&e.jsx("td",{className:"pl-8",children:e.jsx(v,{value:c.includes(t.id),onChange:f=>{o("service.create.fields",f?[...c,t.id]:c.filter(x=>x!==t.id),{shouldDirty:!0})}})}),n&&e.jsx("td",{className:"pl-8",children:e.jsx(v,{value:S.includes(t.id),onChange:f=>{o("service.update.fields",f?[...S,t.id]:S.filter(x=>x!==t.id),{shouldDirty:!0})}})})]},t.id)),u.length>0&&e.jsx("tr",{children:e.jsx("th",{children:e.jsx(M,{children:"Transformers"})})}),u.map(t=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx(L,{type:T.getTransformerWebConfig(t.type,N).label,children:Q.getTransformName(r,t,j)})}),m&&e.jsx("td",{className:"pl-8",children:e.jsx(v,{value:b.includes(t.id),onChange:f=>{o("service.create.transformerNames",f?[...b,t.id]:b.filter(x=>x!==t.id),{shouldDirty:!0})}})}),n&&e.jsx("td",{className:"pl-8",children:e.jsx(v,{value:l.includes(t.id),onChange:f=>{o("service.update.transformerNames",f?[...l,t.id]:l.filter(x=>x!==t.id),{shouldDirty:!0})}})})]},t.id))]})]})})]})}const{createTransformerSchema:ie,modelTransformerEntityType:re}=await d("@baseplate-dev/project-builder-lib"),{useDefinitionSchema:oe}=await d("@baseplate-dev/project-builder-lib/web"),{Button:E,DialogClose:ae,DialogFooter:ce}=await d("@baseplate-dev/ui-components"),{useId:le,useMemo:de}=await d("react"),{z:me}=await d("zod");function pe({className:h,webConfig:{Form:i,pluginKey:o},transformer:a,onUpdate:p,isCreate:s}){const m=D(l=>l),n=oe(ie),u=de(()=>me.object({transformer:n}),[n]),r=z({resolver:_(u),defaultValues:{transformer:a}}),{handleSubmit:j,formState:{isDirty:c}}=r,S=j(l=>{p({...l.transformer,id:l.transformer.id?l.transformer.id:re.generateNewId()})}),b=le();return i?e.jsxs("form",{className:V("space-y-4",h),id:b,onSubmit:l=>(l.stopPropagation(),S(l)),children:[e.jsx(i,{formProps:r,name:"transformer",originalModel:m,pluginKey:o}),e.jsxs(ce,{children:[e.jsx(ae,{asChild:!0,children:e.jsx(E,{variant:"secondary",children:"Cancel"})}),e.jsx(E,{type:"submit",disabled:!s&&!c,form:b,children:"Save"})]})]}):null}const{Dialog:ue,DialogContent:he,DialogDescription:fe,DialogHeader:xe,DialogTitle:je,DialogTrigger:Se,useControlledState:be}=await d("@baseplate-dev/ui-components");function I({children:h,transformer:i,asChild:o,webConfig:a,open:p,onOpenChange:s,onUpdate:m,isCreate:n}){const[u,r]=be(p,s,!1);return e.jsxs(ue,{open:u,onOpenChange:r,children:[h&&e.jsx(Se,{asChild:o,children:h}),e.jsxs(he,{children:[e.jsxs(xe,{children:[e.jsxs(je,{children:[n?"Create":"Edit"," ",a?.label," Transformer"]}),e.jsx(fe,{children:a?.instructions??"Manage the transformer for the service"})]}),a&&e.jsx(pe,{transformer:i,onUpdate:j=>{r(!1),m(j)},webConfig:a,isCreate:n})]})]})}const{modelTransformerWebSpec:$,useProjectDefinition:P}=await d("@baseplate-dev/project-builder-lib/web"),{Button:y,DropdownMenu:ge,DropdownMenuContent:ve,DropdownMenuGroup:Ce,DropdownMenuItem:Te,DropdownMenuTrigger:we,RecordView:ye,RecordViewActions:De,RecordViewItem:F,RecordViewItemList:Ne,SectionListSection:Le,SectionListSectionContent:Me,SectionListSectionDescription:Ee,SectionListSectionHeader:Fe,SectionListSectionTitle:Re,useConfirmDialog:Ie}=await d("@baseplate-dev/ui-components"),{useState:R}=await d("react");function $e({formProps:h,idx:i,onRemove:o,onUpdate:a}){const{pluginContainer:p,definitionContainer:s}=P(),{control:m}=h,n=C({control:m,name:`service.transformers.${i}`}),r=p.getPluginSpec($).getTransformerWebConfig(n.type,N),j=r.getSummary(n,s);return e.jsxs(ye,{children:[e.jsxs(Ne,{children:[e.jsx(F,{title:"Type",children:r.label}),j.map(c=>e.jsx(F,{title:c.label,children:c.description},c.label))]}),e.jsxs(De,{children:[r.Form&&e.jsx(I,{webConfig:r,transformer:n,onUpdate:c=>{a(c,i)},asChild:!0,isCreate:!1,children:e.jsx(y,{variant:"ghost",size:"icon",title:"Edit",children:e.jsx(K,{})})}),e.jsx(y,{variant:"ghost",size:"icon",onClick:()=>{o(i)},title:"Remove",className:"text-destructive hover:text-destructive-hover",children:e.jsx(q,{})})]})]})}function Pe({className:h,formProps:i}){const{control:o}=i,{fields:a,remove:p,append:s,update:m}=k({control:o,name:"service.transformers"}),{pluginContainer:n,definitionContainer:u}=P(),{requestConfirm:r}=Ie(),j=n.getPluginSpec($),c=D(t=>t),S=j.getTransformerWebConfigs(N).filter(t=>t.allowNewTransformer?t.allowNewTransformer(u,c):!0),[b,l]=R(!1),[g,T]=R(0);return e.jsxs(Le,{className:h,children:[e.jsxs(Fe,{children:[e.jsx(Re,{children:"Transformers"}),e.jsx(Ee,{children:"Transformers are used to operate on the data from the client into the shape that the database ORM expects."})]}),e.jsxs(Me,{className:"max-w-xl space-y-4",children:[a.map((t,f)=>e.jsx($e,{formProps:i,idx:f,onUpdate:(x,W)=>{m(W,x)},onRemove:x=>{r({title:"Confirm delete",content:"Are you sure you want to delete this transformer?",buttonConfirmText:"Delete",buttonConfirmVariant:"destructive",onConfirm:()=>{p(x)}})}},t.id)),S.length>0&&e.jsxs(ge,{children:[e.jsx(we,{asChild:!0,children:e.jsxs(y,{variant:"secondary",size:"sm",children:[e.jsx(G,{}),"Add Transformer"]})}),e.jsx(ve,{children:e.jsx(Ce,{children:S.map((t,f)=>e.jsx(Te,{onSelect:()=>{t.Form?(T(f),l(!0)):s(t.getNewTransformer(u,c))},children:e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("div",{children:t.label}),e.jsx("div",{className:"text-style-muted",children:t.description})]})},t.name))})})]}),e.jsx(I,{webConfig:S[g],transformer:S[g]?.getNewTransformer(u,c),onUpdate:t=>{s(t)},open:b,onOpenChange:l,isCreate:!0})]})]})}const{modelTransformerEntityType:We}=await d("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:_e}=await d("@baseplate-dev/project-builder-lib/web"),{FormActionBar:Oe,SectionList:Ue,SectionListSection:Ae,SectionListSectionContent:Be,SectionListSectionDescription:He,SectionListSectionHeader:ze,SectionListSectionTitle:ke,SwitchFieldController:w}=await d("@baseplate-dev/ui-components");U(We,"/data/models/edit/{parentKey}");const Ze=function(){const{key:i}=O.useParams(),{form:o,onSubmit:a,originalModel:p}=H({omit:["name","featureRef"],modelKey:i}),{control:s,watch:m,getValues:n,setValue:u,reset:r}=o;return _e({control:s,reset:r,onSubmit:a}),e.jsx(B,{originalModel:p,getValues:n,watch:m,children:e.jsxs("form",{onSubmit:a,className:"w-full max-w-7xl space-y-4 p-4",children:[e.jsxs(Ue,{children:[e.jsxs(Ae,{children:[e.jsxs(ze,{children:[e.jsx(ke,{children:"Methods"}),e.jsx(He,{children:"Enable or disable which service methods will be generated"})]}),e.jsxs(Be,{className:"flex gap-8",children:[e.jsx(w,{label:"Create",name:"service.create.enabled",control:s}),e.jsx(w,{label:"Update",name:"service.update.enabled",control:s}),e.jsx(w,{label:"Delete",name:"service.delete.enabled",control:s})]})]}),e.jsx(ne,{control:s,setValue:u}),e.jsx(Pe,{formProps:o})]}),e.jsx(Oe,{form:o})]})})};export{Ze as component};
2
- //# sourceMappingURL=service-fvQlhwg4.js.map
1
+ import{i as d}from"./_virtual___federation_fn_import-D3sI42Ph.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{s as _,x as O,r as U}from"./index-DEKFCy0H.js";import{u as D,S as A,B as N,E as B}from"./-constants-BYERQCO8.js";import{u as H}from"./use-model-form-psj-JlE9.js";import{e as C,b as z,f as k}from"./index.esm-CdP29Ssb.js";import{B as L}from"./badge-with-type-label-CThmzNSh.js";import{c as V,A as G,H as K,Q as q}from"./index-tflukq04.js";const{ModelTransformerUtils:Q}=await d("@baseplate-dev/project-builder-lib"),{modelTransformerWebSpec:Y,useProjectDefinition:J}=await d("@baseplate-dev/project-builder-lib/web"),{Label:M,SectionListSection:X,SectionListSectionContent:Z,SectionListSectionDescription:ee,SectionListSectionHeader:te,SectionListSectionTitle:se,SwitchField:v}=await d("@baseplate-dev/ui-components");function ne({className:h,control:i,setValue:o}){const a=D(t=>t.model.fields),p=C({control:i,name:"service.create"}),s=C({control:i,name:"service.update"}),m=p?.enabled,n=s?.enabled,u=C({control:i,name:"service.transformers"})??[],{definitionContainer:r,pluginContainer:j}=J();if(!m&&!n)return null;const c=p?.fields??[],S=s?.fields??[],b=p?.transformerNames??[],l=s?.transformerNames??[],g="w-full border-collapse text-left [&_td]:py-1 [&_th]:sticky [&_th]:top-0 [&_th]:bg-background [&_th]:z-10 [&_th]:py-2",T=j.getPluginSpec(Y);return e.jsxs(X,{className:h,children:[e.jsxs(te,{children:[e.jsx(se,{children:"Create / Update Fields"}),e.jsx(ee,{children:"Configure the fields that can be created or updated by the service method"})]}),e.jsx(Z,{className:"max-w-xl space-y-4",children:e.jsxs("table",{className:g,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{className:"w-full",children:e.jsx(M,{children:"Fields"})}),m&&e.jsx("th",{className:"pl-8",children:"Create"}),n&&e.jsx("th",{className:"pl-8",children:"Update"})]})}),e.jsxs("tbody",{children:[a.map(t=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx(L,{type:t.type==="enum"&&t.options?.enumRef?r.nameFromId(t.options.enumRef):A[t.type].label,children:t.name})}),m&&e.jsx("td",{className:"pl-8",children:e.jsx(v,{value:c.includes(t.id),onChange:f=>{o("service.create.fields",f?[...c,t.id]:c.filter(x=>x!==t.id),{shouldDirty:!0})}})}),n&&e.jsx("td",{className:"pl-8",children:e.jsx(v,{value:S.includes(t.id),onChange:f=>{o("service.update.fields",f?[...S,t.id]:S.filter(x=>x!==t.id),{shouldDirty:!0})}})})]},t.id)),u.length>0&&e.jsx("tr",{children:e.jsx("th",{children:e.jsx(M,{children:"Transformers"})})}),u.map(t=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx(L,{type:T.getTransformerWebConfig(t.type,N).label,children:Q.getTransformName(r,t,j)})}),m&&e.jsx("td",{className:"pl-8",children:e.jsx(v,{value:b.includes(t.id),onChange:f=>{o("service.create.transformerNames",f?[...b,t.id]:b.filter(x=>x!==t.id),{shouldDirty:!0})}})}),n&&e.jsx("td",{className:"pl-8",children:e.jsx(v,{value:l.includes(t.id),onChange:f=>{o("service.update.transformerNames",f?[...l,t.id]:l.filter(x=>x!==t.id),{shouldDirty:!0})}})})]},t.id))]})]})})]})}const{createTransformerSchema:ie,modelTransformerEntityType:re}=await d("@baseplate-dev/project-builder-lib"),{useDefinitionSchema:oe}=await d("@baseplate-dev/project-builder-lib/web"),{Button:E,DialogClose:ae,DialogFooter:ce}=await d("@baseplate-dev/ui-components"),{useId:le,useMemo:de}=await d("react"),{z:me}=await d("zod");function pe({className:h,webConfig:{Form:i,pluginKey:o},transformer:a,onUpdate:p,isCreate:s}){const m=D(l=>l),n=oe(ie),u=de(()=>me.object({transformer:n}),[n]),r=z({resolver:_(u),defaultValues:{transformer:a}}),{handleSubmit:j,formState:{isDirty:c}}=r,S=j(l=>{p({...l.transformer,id:l.transformer.id?l.transformer.id:re.generateNewId()})}),b=le();return i?e.jsxs("form",{className:V("space-y-4",h),id:b,onSubmit:l=>(l.stopPropagation(),S(l)),children:[e.jsx(i,{formProps:r,name:"transformer",originalModel:m,pluginKey:o}),e.jsxs(ce,{children:[e.jsx(ae,{asChild:!0,children:e.jsx(E,{variant:"secondary",children:"Cancel"})}),e.jsx(E,{type:"submit",disabled:!s&&!c,form:b,children:"Save"})]})]}):null}const{Dialog:ue,DialogContent:he,DialogDescription:fe,DialogHeader:xe,DialogTitle:je,DialogTrigger:Se,useControlledState:be}=await d("@baseplate-dev/ui-components");function I({children:h,transformer:i,asChild:o,webConfig:a,open:p,onOpenChange:s,onUpdate:m,isCreate:n}){const[u,r]=be(p,s,!1);return e.jsxs(ue,{open:u,onOpenChange:r,children:[h&&e.jsx(Se,{asChild:o,children:h}),e.jsxs(he,{children:[e.jsxs(xe,{children:[e.jsxs(je,{children:[n?"Create":"Edit"," ",a?.label," Transformer"]}),e.jsx(fe,{children:a?.instructions??"Manage the transformer for the service"})]}),a&&e.jsx(pe,{transformer:i,onUpdate:j=>{r(!1),m(j)},webConfig:a,isCreate:n})]})]})}const{modelTransformerWebSpec:$,useProjectDefinition:P}=await d("@baseplate-dev/project-builder-lib/web"),{Button:y,DropdownMenu:ge,DropdownMenuContent:ve,DropdownMenuGroup:Ce,DropdownMenuItem:Te,DropdownMenuTrigger:we,RecordView:ye,RecordViewActions:De,RecordViewItem:F,RecordViewItemList:Ne,SectionListSection:Le,SectionListSectionContent:Me,SectionListSectionDescription:Ee,SectionListSectionHeader:Fe,SectionListSectionTitle:Re,useConfirmDialog:Ie}=await d("@baseplate-dev/ui-components"),{useState:R}=await d("react");function $e({formProps:h,idx:i,onRemove:o,onUpdate:a}){const{pluginContainer:p,definitionContainer:s}=P(),{control:m}=h,n=C({control:m,name:`service.transformers.${i}`}),r=p.getPluginSpec($).getTransformerWebConfig(n.type,N),j=r.getSummary(n,s);return e.jsxs(ye,{children:[e.jsxs(Ne,{children:[e.jsx(F,{title:"Type",children:r.label}),j.map(c=>e.jsx(F,{title:c.label,children:c.description},c.label))]}),e.jsxs(De,{children:[r.Form&&e.jsx(I,{webConfig:r,transformer:n,onUpdate:c=>{a(c,i)},asChild:!0,isCreate:!1,children:e.jsx(y,{variant:"ghost",size:"icon",title:"Edit",children:e.jsx(K,{})})}),e.jsx(y,{variant:"ghost",size:"icon",onClick:()=>{o(i)},title:"Remove",className:"text-destructive hover:text-destructive-hover",children:e.jsx(q,{})})]})]})}function Pe({className:h,formProps:i}){const{control:o}=i,{fields:a,remove:p,append:s,update:m}=k({control:o,name:"service.transformers"}),{pluginContainer:n,definitionContainer:u}=P(),{requestConfirm:r}=Ie(),j=n.getPluginSpec($),c=D(t=>t),S=j.getTransformerWebConfigs(N).filter(t=>t.allowNewTransformer?t.allowNewTransformer(u,c):!0),[b,l]=R(!1),[g,T]=R(0);return e.jsxs(Le,{className:h,children:[e.jsxs(Fe,{children:[e.jsx(Re,{children:"Transformers"}),e.jsx(Ee,{children:"Transformers are used to operate on the data from the client into the shape that the database ORM expects."})]}),e.jsxs(Me,{className:"max-w-xl space-y-4",children:[a.map((t,f)=>e.jsx($e,{formProps:i,idx:f,onUpdate:(x,W)=>{m(W,x)},onRemove:x=>{r({title:"Confirm delete",content:"Are you sure you want to delete this transformer?",buttonConfirmText:"Delete",buttonConfirmVariant:"destructive",onConfirm:()=>{p(x)}})}},t.id)),S.length>0&&e.jsxs(ge,{children:[e.jsx(we,{asChild:!0,children:e.jsxs(y,{variant:"secondary",size:"sm",children:[e.jsx(G,{}),"Add Transformer"]})}),e.jsx(ve,{children:e.jsx(Ce,{children:S.map((t,f)=>e.jsx(Te,{onSelect:()=>{t.Form?(T(f),l(!0)):s(t.getNewTransformer(u,c))},children:e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("div",{children:t.label}),e.jsx("div",{className:"text-style-muted",children:t.description})]})},t.name))})})]}),e.jsx(I,{webConfig:S[g],transformer:S[g]?.getNewTransformer(u,c),onUpdate:t=>{s(t)},open:b,onOpenChange:l,isCreate:!0})]})]})}const{modelTransformerEntityType:We}=await d("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:_e}=await d("@baseplate-dev/project-builder-lib/web"),{FormActionBar:Oe,SectionList:Ue,SectionListSection:Ae,SectionListSectionContent:Be,SectionListSectionDescription:He,SectionListSectionHeader:ze,SectionListSectionTitle:ke,SwitchFieldController:w}=await d("@baseplate-dev/ui-components");U(We,"/data/models/edit/{parentKey}");const Ze=function(){const{key:i}=O.useParams(),{form:o,onSubmit:a,originalModel:p}=H({omit:["name","featureRef"],modelKey:i}),{control:s,watch:m,getValues:n,setValue:u,reset:r}=o;return _e({control:s,reset:r,onSubmit:a}),e.jsx(B,{originalModel:p,getValues:n,watch:m,children:e.jsxs("form",{onSubmit:a,className:"w-full max-w-7xl space-y-4 p-4",children:[e.jsxs(Ue,{children:[e.jsxs(Ae,{children:[e.jsxs(ze,{children:[e.jsx(ke,{children:"Methods"}),e.jsx(He,{children:"Enable or disable which service methods will be generated"})]}),e.jsxs(Be,{className:"flex gap-8",children:[e.jsx(w,{label:"Create",name:"service.create.enabled",control:s}),e.jsx(w,{label:"Update",name:"service.update.enabled",control:s}),e.jsx(w,{label:"Delete",name:"service.delete.enabled",control:s})]})]}),e.jsx(ne,{control:s,setValue:u}),e.jsx(Pe,{formProps:o})]}),e.jsx(Oe,{form:o})]})})};export{Ze as component};
2
+ //# sourceMappingURL=service--2LVz4Ht.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-fvQlhwg4.js","sources":["../../src/routes/data/models/edit.$key/-components/service/service-method-fields-section.tsx","../../src/routes/data/models/edit.$key/-components/service/service-transformer-form.tsx","../../src/routes/data/models/edit.$key/-components/service/service-transformer-dialog.tsx","../../src/routes/data/models/edit.$key/-components/service/service-transformers-section.tsx","../../src/routes/data/models/edit.$key/service.tsx?tsr-split=component"],"sourcesContent":["import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { ModelTransformerUtils } from '@baseplate-dev/project-builder-lib';\nimport {\n modelTransformerWebSpec,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Label,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n SwitchField,\n} from '@baseplate-dev/ui-components';\nimport { useWatch } from 'react-hook-form';\n\nimport {\n BUILT_IN_TRANSFORMER_WEB_CONFIGS,\n SCALAR_FIELD_TYPE_OPTIONS,\n} from '../../../-constants.js';\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\nimport { BadgeWithTypeLabel } from '../badge-with-type-label.js';\n\ninterface ServiceMethodFieldsSectionProps {\n className?: string;\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\nexport function ServiceMethodFieldsSection({\n className,\n control,\n setValue,\n}: ServiceMethodFieldsSectionProps): React.JSX.Element | null {\n const fields = useEditedModelConfig((model) => model.model.fields);\n const create = useWatch({ control, name: 'service.create' });\n const update = useWatch({ control, name: 'service.update' });\n const isCreateEnabled = create?.enabled;\n const isUpdateEnabled = update?.enabled;\n const transformers =\n useWatch({ control, name: 'service.transformers' }) ?? [];\n const { definitionContainer, pluginContainer } = useProjectDefinition();\n\n if (!isCreateEnabled && !isUpdateEnabled) {\n return null;\n }\n\n const createFields = create?.fields ?? [];\n const updateFields = update?.fields ?? [];\n\n const createTransformers = create?.transformerNames ?? [];\n const updateTransformers = update?.transformerNames ?? [];\n\n const tableClassName =\n 'w-full border-collapse text-left [&_td]:py-1 [&_th]:sticky [&_th]:top-0 [&_th]:bg-background [&_th]:z-10 [&_th]:py-2';\n\n const transformerWeb = pluginContainer.getPluginSpec(modelTransformerWebSpec);\n\n return (\n <SectionListSection className={className}>\n <SectionListSectionHeader>\n <SectionListSectionTitle>\n Create / Update Fields\n </SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure the fields that can be created or updated by the service\n method\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"max-w-xl space-y-4\">\n <table className={tableClassName}>\n <thead>\n <tr>\n <th className=\"w-full\">\n <Label>Fields</Label>\n </th>\n {isCreateEnabled && <th className=\"pl-8\">Create</th>}\n {isUpdateEnabled && <th className=\"pl-8\">Update</th>}\n </tr>\n </thead>\n <tbody>\n {fields.map((field) => (\n <tr key={field.id}>\n <td>\n <BadgeWithTypeLabel\n type={\n field.type === 'enum' && field.options?.enumRef\n ? definitionContainer.nameFromId(field.options.enumRef)\n : SCALAR_FIELD_TYPE_OPTIONS[field.type].label\n }\n >\n {field.name}\n </BadgeWithTypeLabel>\n </td>\n {isCreateEnabled && (\n <td className=\"pl-8\">\n <SwitchField\n value={createFields.includes(field.id)}\n onChange={(value) => {\n setValue(\n 'service.create.fields',\n value\n ? [...createFields, field.id]\n : createFields.filter((id) => id !== field.id),\n { shouldDirty: true },\n );\n }}\n />\n </td>\n )}\n {isUpdateEnabled && (\n <td className=\"pl-8\">\n <SwitchField\n value={updateFields.includes(field.id)}\n onChange={(value) => {\n setValue(\n 'service.update.fields',\n value\n ? [...updateFields, field.id]\n : updateFields.filter((id) => id !== field.id),\n { shouldDirty: true },\n );\n }}\n />\n </td>\n )}\n </tr>\n ))}\n {transformers.length > 0 && (\n <tr>\n <th>\n <Label>Transformers</Label>\n </th>\n </tr>\n )}\n {transformers.map((transformer) => (\n <tr key={transformer.id}>\n <td>\n <BadgeWithTypeLabel\n type={\n transformerWeb.getTransformerWebConfig(\n transformer.type,\n BUILT_IN_TRANSFORMER_WEB_CONFIGS,\n ).label\n }\n >\n {ModelTransformerUtils.getTransformName(\n definitionContainer,\n transformer,\n pluginContainer,\n )}\n </BadgeWithTypeLabel>\n </td>\n {isCreateEnabled && (\n <td className=\"pl-8\">\n <SwitchField\n value={createTransformers.includes(transformer.id)}\n onChange={(value) => {\n setValue(\n 'service.create.transformerNames',\n value\n ? [...createTransformers, transformer.id]\n : createTransformers.filter(\n (id) => id !== transformer.id,\n ),\n { shouldDirty: true },\n );\n }}\n />\n </td>\n )}\n {isUpdateEnabled && (\n <td className=\"pl-8\">\n <SwitchField\n value={updateTransformers.includes(transformer.id)}\n onChange={(value) => {\n setValue(\n 'service.update.transformerNames',\n value\n ? [...updateTransformers, transformer.id]\n : updateTransformers.filter(\n (id) => id !== transformer.id,\n ),\n { shouldDirty: true },\n );\n }}\n />\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type { TransformerConfig } from '@baseplate-dev/project-builder-lib';\nimport type { ModelTransformerWebConfig } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\n\nimport {\n createTransformerSchema,\n modelTransformerEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { useDefinitionSchema } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n DialogClose,\n DialogFooter,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { clsx } from 'clsx';\nimport { useId, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\n\ninterface ServiceTransformerFormProps {\n className?: string;\n webConfig: ModelTransformerWebConfig;\n transformer?: TransformerConfig;\n onUpdate: (transformer: TransformerConfig) => void;\n isCreate: boolean;\n}\n\nexport function ServiceTransformerForm({\n className,\n webConfig: { Form, pluginKey },\n transformer,\n onUpdate,\n isCreate,\n}: ServiceTransformerFormProps): React.JSX.Element | null {\n const originalModel = useEditedModelConfig((model) => model);\n const transformerSchema = useDefinitionSchema(createTransformerSchema);\n const schema = useMemo(\n () =>\n z.object({\n transformer: transformerSchema,\n }),\n [transformerSchema],\n );\n const formProps = useForm<{ transformer: TransformerConfig }>({\n resolver: zodResolver(schema),\n defaultValues: { transformer },\n });\n const {\n handleSubmit,\n formState: { isDirty },\n } = formProps;\n\n const onSubmit = handleSubmit((data) => {\n onUpdate({\n ...data.transformer,\n id: data.transformer.id\n ? data.transformer.id\n : modelTransformerEntityType.generateNewId(),\n });\n });\n\n const formId = useId();\n\n if (!Form) {\n return null;\n }\n\n return (\n <form\n className={clsx('space-y-4', className)}\n id={formId}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n >\n <Form\n formProps={formProps}\n name=\"transformer\"\n originalModel={originalModel}\n pluginKey={pluginKey}\n />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" disabled={!isCreate && !isDirty} form={formId}>\n Save\n </Button>\n </DialogFooter>\n </form>\n );\n}\n","import type { TransformerConfig } from '@baseplate-dev/project-builder-lib';\nimport type { ModelTransformerWebConfig } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { ServiceTransformerForm } from './service-transformer-form.js';\n\ninterface ServiceTransformerDialogProps {\n children?: React.ReactNode;\n asChild?: boolean;\n open?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n webConfig: ModelTransformerWebConfig | undefined;\n transformer: TransformerConfig | undefined;\n onUpdate: (transformer: TransformerConfig) => void;\n isCreate: boolean;\n}\n\nexport function ServiceTransformerDialog({\n children,\n transformer,\n asChild,\n webConfig,\n open,\n onOpenChange,\n onUpdate,\n isCreate,\n}: ServiceTransformerDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {isCreate ? 'Create' : 'Edit'} {webConfig?.label} Transformer\n </DialogTitle>\n <DialogDescription>\n {webConfig?.instructions ??\n 'Manage the transformer for the service'}\n </DialogDescription>\n </DialogHeader>\n {webConfig && (\n <ServiceTransformerForm\n transformer={transformer}\n onUpdate={(transformer) => {\n setIsOpen(false);\n onUpdate(transformer);\n }}\n webConfig={webConfig}\n isCreate={isCreate}\n />\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","import type {\n ModelConfigInput,\n TransformerConfig,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\n\nimport {\n modelTransformerWebSpec,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport { useState } from 'react';\nimport { useFieldArray, useWatch } from 'react-hook-form';\nimport { MdAdd, MdEdit, MdOutlineDelete } from 'react-icons/md';\n\nimport { BUILT_IN_TRANSFORMER_WEB_CONFIGS } from '#src/routes/data/models/-constants.js';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\nimport { ServiceTransformerDialog } from './service-transformer-dialog.js';\n\ninterface Props {\n className?: string;\n formProps: UseFormReturn<ModelConfigInput>;\n}\n\nfunction ServiceTransformerRecord({\n formProps,\n idx,\n onRemove,\n onUpdate,\n}: {\n formProps: UseFormReturn<ModelConfigInput>;\n idx: number;\n onUpdate: (transformer: TransformerConfig, idx: number) => void;\n onRemove: (idx: number) => void;\n}): React.JSX.Element {\n const { pluginContainer, definitionContainer } = useProjectDefinition();\n const { control } = formProps;\n\n const field = useWatch({\n control,\n name: `service.transformers.${idx}`,\n });\n\n const transformerWeb = pluginContainer.getPluginSpec(modelTransformerWebSpec);\n const transformerConfig = transformerWeb.getTransformerWebConfig(\n field.type,\n BUILT_IN_TRANSFORMER_WEB_CONFIGS,\n );\n const summary = transformerConfig.getSummary(field, definitionContainer);\n return (\n <RecordView>\n <RecordViewItemList>\n <RecordViewItem title=\"Type\">{transformerConfig.label}</RecordViewItem>\n {summary.map((item) => (\n <RecordViewItem key={item.label} title={item.label}>\n {item.description}\n </RecordViewItem>\n ))}\n </RecordViewItemList>\n <RecordViewActions>\n {transformerConfig.Form && (\n <ServiceTransformerDialog\n webConfig={transformerConfig}\n transformer={field}\n onUpdate={(transformer) => {\n onUpdate(transformer, idx);\n }}\n asChild\n isCreate={false}\n >\n <Button variant=\"ghost\" size=\"icon\" title=\"Edit\">\n <MdEdit />\n </Button>\n </ServiceTransformerDialog>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n onRemove(idx);\n }}\n title=\"Remove\"\n className=\"text-destructive hover:text-destructive-hover\"\n >\n <MdOutlineDelete />\n </Button>\n </RecordViewActions>\n </RecordView>\n );\n}\n\nexport function ServiceTransformersSection({\n className,\n formProps,\n}: Props): React.JSX.Element | null {\n const { control } = formProps;\n const { fields, remove, append, update } = useFieldArray({\n control,\n name: `service.transformers`,\n });\n const { pluginContainer, definitionContainer } = useProjectDefinition();\n\n const { requestConfirm } = useConfirmDialog();\n\n const transformerWeb = pluginContainer.getPluginSpec(modelTransformerWebSpec);\n\n const modelConfig = useEditedModelConfig((model) => model);\n\n const addableTransformers = transformerWeb\n .getTransformerWebConfigs(BUILT_IN_TRANSFORMER_WEB_CONFIGS)\n .filter((transformer) =>\n transformer.allowNewTransformer\n ? transformer.allowNewTransformer(definitionContainer, modelConfig)\n : true,\n );\n\n const [isNewTransfomerDialogOpen, setIsNewTransformerDialogOpen] =\n useState(false);\n const [addableTransformerIdx, setAddableTransformerIdx] = useState<number>(0);\n\n return (\n <SectionListSection className={className}>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Transformers</SectionListSectionTitle>\n <SectionListSectionDescription>\n Transformers are used to operate on the data from the client into the\n shape that the database ORM expects.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"max-w-xl space-y-4\">\n {fields.map((field, idx) => (\n <ServiceTransformerRecord\n key={field.id}\n formProps={formProps}\n idx={idx}\n onUpdate={(transformer, idx) => {\n update(idx, transformer);\n }}\n onRemove={(idx) => {\n requestConfirm({\n title: 'Confirm delete',\n content: `Are you sure you want to delete this transformer?`,\n buttonConfirmText: 'Delete',\n buttonConfirmVariant: 'destructive',\n onConfirm: () => {\n remove(idx);\n },\n });\n }}\n />\n ))}\n {addableTransformers.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"secondary\" size=\"sm\">\n <MdAdd />\n Add Transformer\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuGroup>\n {addableTransformers.map((transformer, idx) => (\n <DropdownMenuItem\n key={transformer.name}\n onSelect={() => {\n if (transformer.Form) {\n setAddableTransformerIdx(idx);\n setIsNewTransformerDialogOpen(true);\n } else {\n append(\n transformer.getNewTransformer(\n definitionContainer,\n modelConfig,\n ),\n );\n }\n }}\n >\n <div className=\"flex flex-col gap-1\">\n <div>{transformer.label}</div>\n <div className=\"text-style-muted\">\n {transformer.description}\n </div>\n </div>\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n <ServiceTransformerDialog\n webConfig={addableTransformers[addableTransformerIdx]}\n transformer={addableTransformers[\n addableTransformerIdx\n ]?.getNewTransformer(definitionContainer, modelConfig)}\n onUpdate={(transformer) => {\n append(transformer);\n }}\n open={isNewTransfomerDialogOpen}\n onOpenChange={setIsNewTransformerDialogOpen}\n isCreate={true}\n />\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type React from 'react';\n\nimport { modelTransformerEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useBlockUnsavedChangesNavigate } from '@baseplate-dev/project-builder-lib/web';\nimport {\n FormActionBar,\n SectionList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n SwitchFieldController,\n} from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { registerEntityTypeUrl } from '#src/services/entity-type.js';\n\nimport { EditedModelContextProvider } from '../-hooks/use-edited-model-config.js';\nimport { useModelForm } from '../-hooks/use-model-form.js';\nimport { ServiceMethodFieldsSection } from './-components/service/service-method-fields-section.js';\nimport { ServiceTransformersSection } from './-components/service/service-transformers-section.js';\n\nregisterEntityTypeUrl(\n modelTransformerEntityType,\n `/data/models/edit/{parentKey}`,\n);\n\nexport const Route = createFileRoute('/data/models/edit/$key/service')({\n component: ModelEditServicePage,\n beforeLoad: () => ({\n getTitle: () => 'Service',\n }),\n});\n\nfunction ModelEditServicePage(): React.JSX.Element {\n const { key } = Route.useParams();\n const { form, onSubmit, originalModel } = useModelForm({\n omit: ['name', 'featureRef'],\n modelKey: key,\n });\n const { control, watch, getValues, setValue, reset } = form;\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n return (\n <EditedModelContextProvider\n originalModel={originalModel}\n getValues={getValues}\n watch={watch}\n >\n <form onSubmit={onSubmit} className=\"w-full max-w-7xl space-y-4 p-4\">\n <SectionList>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Methods</SectionListSectionTitle>\n <SectionListSectionDescription>\n Enable or disable which service methods will be generated\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"flex gap-8\">\n <SwitchFieldController\n label=\"Create\"\n name=\"service.create.enabled\"\n control={control}\n />\n <SwitchFieldController\n label=\"Update\"\n name=\"service.update.enabled\"\n control={control}\n />\n <SwitchFieldController\n label=\"Delete\"\n name=\"service.delete.enabled\"\n control={control}\n />\n </SectionListSectionContent>\n </SectionListSection>\n <ServiceMethodFieldsSection control={control} setValue={setValue} />\n <ServiceTransformersSection formProps={form} />\n </SectionList>\n <FormActionBar form={form} />\n </form>\n </EditedModelContextProvider>\n );\n}\n"],"names":["ModelTransformerUtils","importShared","modelTransformerWebSpec","useProjectDefinition","Label","SectionListSection","SectionListSectionContent","SectionListSectionDescription","SectionListSectionHeader","SectionListSectionTitle","SwitchField","ServiceMethodFieldsSection","className","control","setValue","fields","useEditedModelConfig","model","create","useWatch","update","isCreateEnabled","isUpdateEnabled","transformers","definitionContainer","pluginContainer","createFields","updateFields","createTransformers","updateTransformers","tableClassName","transformerWeb","jsxs","jsx","field","BadgeWithTypeLabel","SCALAR_FIELD_TYPE_OPTIONS","value","id","transformer","BUILT_IN_TRANSFORMER_WEB_CONFIGS","createTransformerSchema","modelTransformerEntityType","useDefinitionSchema","Button","DialogClose","DialogFooter","useId","useMemo","z","ServiceTransformerForm","Form","pluginKey","onUpdate","isCreate","originalModel","transformerSchema","schema","formProps","useForm","zodResolver","handleSubmit","isDirty","onSubmit","data","formId","clsx","e","Dialog","DialogContent","DialogDescription","DialogHeader","DialogTitle","DialogTrigger","useControlledState","ServiceTransformerDialog","children","asChild","webConfig","open","onOpenChange","isOpen","setIsOpen","DropdownMenu","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","DropdownMenuTrigger","RecordView","RecordViewActions","RecordViewItem","RecordViewItemList","useConfirmDialog","useState","ServiceTransformerRecord","idx","onRemove","transformerConfig","summary","item","MdEdit","MdOutlineDelete","ServiceTransformersSection","remove","append","useFieldArray","requestConfirm","modelConfig","addableTransformers","isNewTransfomerDialogOpen","setIsNewTransformerDialogOpen","addableTransformerIdx","setAddableTransformerIdx","MdAdd","useBlockUnsavedChangesNavigate","FormActionBar","SectionList","SwitchFieldController","registerEntityTypeUrl","SplitComponent","key","Route","useParams","form","useModelForm","omit","modelKey","watch","getValues","reset","EditedModelContextProvider"],"mappings":"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"}
1
+ {"version":3,"file":"service--2LVz4Ht.js","sources":["../../src/routes/data/models/edit.$key/-components/service/service-method-fields-section.tsx","../../src/routes/data/models/edit.$key/-components/service/service-transformer-form.tsx","../../src/routes/data/models/edit.$key/-components/service/service-transformer-dialog.tsx","../../src/routes/data/models/edit.$key/-components/service/service-transformers-section.tsx","../../src/routes/data/models/edit.$key/service.tsx?tsr-split=component"],"sourcesContent":["import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { ModelTransformerUtils } from '@baseplate-dev/project-builder-lib';\nimport {\n modelTransformerWebSpec,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Label,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n SwitchField,\n} from '@baseplate-dev/ui-components';\nimport { useWatch } from 'react-hook-form';\n\nimport {\n BUILT_IN_TRANSFORMER_WEB_CONFIGS,\n SCALAR_FIELD_TYPE_OPTIONS,\n} from '../../../-constants.js';\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\nimport { BadgeWithTypeLabel } from '../badge-with-type-label.js';\n\ninterface ServiceMethodFieldsSectionProps {\n className?: string;\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\nexport function ServiceMethodFieldsSection({\n className,\n control,\n setValue,\n}: ServiceMethodFieldsSectionProps): React.JSX.Element | null {\n const fields = useEditedModelConfig((model) => model.model.fields);\n const create = useWatch({ control, name: 'service.create' });\n const update = useWatch({ control, name: 'service.update' });\n const isCreateEnabled = create?.enabled;\n const isUpdateEnabled = update?.enabled;\n const transformers =\n useWatch({ control, name: 'service.transformers' }) ?? [];\n const { definitionContainer, pluginContainer } = useProjectDefinition();\n\n if (!isCreateEnabled && !isUpdateEnabled) {\n return null;\n }\n\n const createFields = create?.fields ?? [];\n const updateFields = update?.fields ?? [];\n\n const createTransformers = create?.transformerNames ?? [];\n const updateTransformers = update?.transformerNames ?? [];\n\n const tableClassName =\n 'w-full border-collapse text-left [&_td]:py-1 [&_th]:sticky [&_th]:top-0 [&_th]:bg-background [&_th]:z-10 [&_th]:py-2';\n\n const transformerWeb = pluginContainer.getPluginSpec(modelTransformerWebSpec);\n\n return (\n <SectionListSection className={className}>\n <SectionListSectionHeader>\n <SectionListSectionTitle>\n Create / Update Fields\n </SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure the fields that can be created or updated by the service\n method\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"max-w-xl space-y-4\">\n <table className={tableClassName}>\n <thead>\n <tr>\n <th className=\"w-full\">\n <Label>Fields</Label>\n </th>\n {isCreateEnabled && <th className=\"pl-8\">Create</th>}\n {isUpdateEnabled && <th className=\"pl-8\">Update</th>}\n </tr>\n </thead>\n <tbody>\n {fields.map((field) => (\n <tr key={field.id}>\n <td>\n <BadgeWithTypeLabel\n type={\n field.type === 'enum' && field.options?.enumRef\n ? definitionContainer.nameFromId(field.options.enumRef)\n : SCALAR_FIELD_TYPE_OPTIONS[field.type].label\n }\n >\n {field.name}\n </BadgeWithTypeLabel>\n </td>\n {isCreateEnabled && (\n <td className=\"pl-8\">\n <SwitchField\n value={createFields.includes(field.id)}\n onChange={(value) => {\n setValue(\n 'service.create.fields',\n value\n ? [...createFields, field.id]\n : createFields.filter((id) => id !== field.id),\n { shouldDirty: true },\n );\n }}\n />\n </td>\n )}\n {isUpdateEnabled && (\n <td className=\"pl-8\">\n <SwitchField\n value={updateFields.includes(field.id)}\n onChange={(value) => {\n setValue(\n 'service.update.fields',\n value\n ? [...updateFields, field.id]\n : updateFields.filter((id) => id !== field.id),\n { shouldDirty: true },\n );\n }}\n />\n </td>\n )}\n </tr>\n ))}\n {transformers.length > 0 && (\n <tr>\n <th>\n <Label>Transformers</Label>\n </th>\n </tr>\n )}\n {transformers.map((transformer) => (\n <tr key={transformer.id}>\n <td>\n <BadgeWithTypeLabel\n type={\n transformerWeb.getTransformerWebConfig(\n transformer.type,\n BUILT_IN_TRANSFORMER_WEB_CONFIGS,\n ).label\n }\n >\n {ModelTransformerUtils.getTransformName(\n definitionContainer,\n transformer,\n pluginContainer,\n )}\n </BadgeWithTypeLabel>\n </td>\n {isCreateEnabled && (\n <td className=\"pl-8\">\n <SwitchField\n value={createTransformers.includes(transformer.id)}\n onChange={(value) => {\n setValue(\n 'service.create.transformerNames',\n value\n ? [...createTransformers, transformer.id]\n : createTransformers.filter(\n (id) => id !== transformer.id,\n ),\n { shouldDirty: true },\n );\n }}\n />\n </td>\n )}\n {isUpdateEnabled && (\n <td className=\"pl-8\">\n <SwitchField\n value={updateTransformers.includes(transformer.id)}\n onChange={(value) => {\n setValue(\n 'service.update.transformerNames',\n value\n ? [...updateTransformers, transformer.id]\n : updateTransformers.filter(\n (id) => id !== transformer.id,\n ),\n { shouldDirty: true },\n );\n }}\n />\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type { TransformerConfig } from '@baseplate-dev/project-builder-lib';\nimport type { ModelTransformerWebConfig } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\n\nimport {\n createTransformerSchema,\n modelTransformerEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { useDefinitionSchema } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n DialogClose,\n DialogFooter,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { clsx } from 'clsx';\nimport { useId, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\n\ninterface ServiceTransformerFormProps {\n className?: string;\n webConfig: ModelTransformerWebConfig;\n transformer?: TransformerConfig;\n onUpdate: (transformer: TransformerConfig) => void;\n isCreate: boolean;\n}\n\nexport function ServiceTransformerForm({\n className,\n webConfig: { Form, pluginKey },\n transformer,\n onUpdate,\n isCreate,\n}: ServiceTransformerFormProps): React.JSX.Element | null {\n const originalModel = useEditedModelConfig((model) => model);\n const transformerSchema = useDefinitionSchema(createTransformerSchema);\n const schema = useMemo(\n () =>\n z.object({\n transformer: transformerSchema,\n }),\n [transformerSchema],\n );\n const formProps = useForm<{ transformer: TransformerConfig }>({\n resolver: zodResolver(schema),\n defaultValues: { transformer },\n });\n const {\n handleSubmit,\n formState: { isDirty },\n } = formProps;\n\n const onSubmit = handleSubmit((data) => {\n onUpdate({\n ...data.transformer,\n id: data.transformer.id\n ? data.transformer.id\n : modelTransformerEntityType.generateNewId(),\n });\n });\n\n const formId = useId();\n\n if (!Form) {\n return null;\n }\n\n return (\n <form\n className={clsx('space-y-4', className)}\n id={formId}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n >\n <Form\n formProps={formProps}\n name=\"transformer\"\n originalModel={originalModel}\n pluginKey={pluginKey}\n />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" disabled={!isCreate && !isDirty} form={formId}>\n Save\n </Button>\n </DialogFooter>\n </form>\n );\n}\n","import type { TransformerConfig } from '@baseplate-dev/project-builder-lib';\nimport type { ModelTransformerWebConfig } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { ServiceTransformerForm } from './service-transformer-form.js';\n\ninterface ServiceTransformerDialogProps {\n children?: React.ReactNode;\n asChild?: boolean;\n open?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n webConfig: ModelTransformerWebConfig | undefined;\n transformer: TransformerConfig | undefined;\n onUpdate: (transformer: TransformerConfig) => void;\n isCreate: boolean;\n}\n\nexport function ServiceTransformerDialog({\n children,\n transformer,\n asChild,\n webConfig,\n open,\n onOpenChange,\n onUpdate,\n isCreate,\n}: ServiceTransformerDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {isCreate ? 'Create' : 'Edit'} {webConfig?.label} Transformer\n </DialogTitle>\n <DialogDescription>\n {webConfig?.instructions ??\n 'Manage the transformer for the service'}\n </DialogDescription>\n </DialogHeader>\n {webConfig && (\n <ServiceTransformerForm\n transformer={transformer}\n onUpdate={(transformer) => {\n setIsOpen(false);\n onUpdate(transformer);\n }}\n webConfig={webConfig}\n isCreate={isCreate}\n />\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","import type {\n ModelConfigInput,\n TransformerConfig,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\n\nimport {\n modelTransformerWebSpec,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport { useState } from 'react';\nimport { useFieldArray, useWatch } from 'react-hook-form';\nimport { MdAdd, MdEdit, MdOutlineDelete } from 'react-icons/md';\n\nimport { BUILT_IN_TRANSFORMER_WEB_CONFIGS } from '#src/routes/data/models/-constants.js';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\nimport { ServiceTransformerDialog } from './service-transformer-dialog.js';\n\ninterface Props {\n className?: string;\n formProps: UseFormReturn<ModelConfigInput>;\n}\n\nfunction ServiceTransformerRecord({\n formProps,\n idx,\n onRemove,\n onUpdate,\n}: {\n formProps: UseFormReturn<ModelConfigInput>;\n idx: number;\n onUpdate: (transformer: TransformerConfig, idx: number) => void;\n onRemove: (idx: number) => void;\n}): React.JSX.Element {\n const { pluginContainer, definitionContainer } = useProjectDefinition();\n const { control } = formProps;\n\n const field = useWatch({\n control,\n name: `service.transformers.${idx}`,\n });\n\n const transformerWeb = pluginContainer.getPluginSpec(modelTransformerWebSpec);\n const transformerConfig = transformerWeb.getTransformerWebConfig(\n field.type,\n BUILT_IN_TRANSFORMER_WEB_CONFIGS,\n );\n const summary = transformerConfig.getSummary(field, definitionContainer);\n return (\n <RecordView>\n <RecordViewItemList>\n <RecordViewItem title=\"Type\">{transformerConfig.label}</RecordViewItem>\n {summary.map((item) => (\n <RecordViewItem key={item.label} title={item.label}>\n {item.description}\n </RecordViewItem>\n ))}\n </RecordViewItemList>\n <RecordViewActions>\n {transformerConfig.Form && (\n <ServiceTransformerDialog\n webConfig={transformerConfig}\n transformer={field}\n onUpdate={(transformer) => {\n onUpdate(transformer, idx);\n }}\n asChild\n isCreate={false}\n >\n <Button variant=\"ghost\" size=\"icon\" title=\"Edit\">\n <MdEdit />\n </Button>\n </ServiceTransformerDialog>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n onRemove(idx);\n }}\n title=\"Remove\"\n className=\"text-destructive hover:text-destructive-hover\"\n >\n <MdOutlineDelete />\n </Button>\n </RecordViewActions>\n </RecordView>\n );\n}\n\nexport function ServiceTransformersSection({\n className,\n formProps,\n}: Props): React.JSX.Element | null {\n const { control } = formProps;\n const { fields, remove, append, update } = useFieldArray({\n control,\n name: `service.transformers`,\n });\n const { pluginContainer, definitionContainer } = useProjectDefinition();\n\n const { requestConfirm } = useConfirmDialog();\n\n const transformerWeb = pluginContainer.getPluginSpec(modelTransformerWebSpec);\n\n const modelConfig = useEditedModelConfig((model) => model);\n\n const addableTransformers = transformerWeb\n .getTransformerWebConfigs(BUILT_IN_TRANSFORMER_WEB_CONFIGS)\n .filter((transformer) =>\n transformer.allowNewTransformer\n ? transformer.allowNewTransformer(definitionContainer, modelConfig)\n : true,\n );\n\n const [isNewTransfomerDialogOpen, setIsNewTransformerDialogOpen] =\n useState(false);\n const [addableTransformerIdx, setAddableTransformerIdx] = useState<number>(0);\n\n return (\n <SectionListSection className={className}>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Transformers</SectionListSectionTitle>\n <SectionListSectionDescription>\n Transformers are used to operate on the data from the client into the\n shape that the database ORM expects.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"max-w-xl space-y-4\">\n {fields.map((field, idx) => (\n <ServiceTransformerRecord\n key={field.id}\n formProps={formProps}\n idx={idx}\n onUpdate={(transformer, idx) => {\n update(idx, transformer);\n }}\n onRemove={(idx) => {\n requestConfirm({\n title: 'Confirm delete',\n content: `Are you sure you want to delete this transformer?`,\n buttonConfirmText: 'Delete',\n buttonConfirmVariant: 'destructive',\n onConfirm: () => {\n remove(idx);\n },\n });\n }}\n />\n ))}\n {addableTransformers.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"secondary\" size=\"sm\">\n <MdAdd />\n Add Transformer\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuGroup>\n {addableTransformers.map((transformer, idx) => (\n <DropdownMenuItem\n key={transformer.name}\n onSelect={() => {\n if (transformer.Form) {\n setAddableTransformerIdx(idx);\n setIsNewTransformerDialogOpen(true);\n } else {\n append(\n transformer.getNewTransformer(\n definitionContainer,\n modelConfig,\n ),\n );\n }\n }}\n >\n <div className=\"flex flex-col gap-1\">\n <div>{transformer.label}</div>\n <div className=\"text-style-muted\">\n {transformer.description}\n </div>\n </div>\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n <ServiceTransformerDialog\n webConfig={addableTransformers[addableTransformerIdx]}\n transformer={addableTransformers[\n addableTransformerIdx\n ]?.getNewTransformer(definitionContainer, modelConfig)}\n onUpdate={(transformer) => {\n append(transformer);\n }}\n open={isNewTransfomerDialogOpen}\n onOpenChange={setIsNewTransformerDialogOpen}\n isCreate={true}\n />\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type React from 'react';\n\nimport { modelTransformerEntityType } from '@baseplate-dev/project-builder-lib';\nimport { useBlockUnsavedChangesNavigate } from '@baseplate-dev/project-builder-lib/web';\nimport {\n FormActionBar,\n SectionList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n SwitchFieldController,\n} from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { registerEntityTypeUrl } from '#src/services/entity-type.js';\n\nimport { EditedModelContextProvider } from '../-hooks/use-edited-model-config.js';\nimport { useModelForm } from '../-hooks/use-model-form.js';\nimport { ServiceMethodFieldsSection } from './-components/service/service-method-fields-section.js';\nimport { ServiceTransformersSection } from './-components/service/service-transformers-section.js';\n\nregisterEntityTypeUrl(\n modelTransformerEntityType,\n `/data/models/edit/{parentKey}`,\n);\n\nexport const Route = createFileRoute('/data/models/edit/$key/service')({\n component: ModelEditServicePage,\n beforeLoad: () => ({\n getTitle: () => 'Service',\n }),\n});\n\nfunction ModelEditServicePage(): React.JSX.Element {\n const { key } = Route.useParams();\n const { form, onSubmit, originalModel } = useModelForm({\n omit: ['name', 'featureRef'],\n modelKey: key,\n });\n const { control, watch, getValues, setValue, reset } = form;\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n return (\n <EditedModelContextProvider\n originalModel={originalModel}\n getValues={getValues}\n watch={watch}\n >\n <form onSubmit={onSubmit} className=\"w-full max-w-7xl space-y-4 p-4\">\n <SectionList>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Methods</SectionListSectionTitle>\n <SectionListSectionDescription>\n Enable or disable which service methods will be generated\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"flex gap-8\">\n <SwitchFieldController\n label=\"Create\"\n name=\"service.create.enabled\"\n control={control}\n />\n <SwitchFieldController\n label=\"Update\"\n name=\"service.update.enabled\"\n control={control}\n />\n <SwitchFieldController\n label=\"Delete\"\n name=\"service.delete.enabled\"\n control={control}\n />\n </SectionListSectionContent>\n </SectionListSection>\n <ServiceMethodFieldsSection control={control} setValue={setValue} />\n <ServiceTransformersSection formProps={form} />\n </SectionList>\n <FormActionBar form={form} />\n </form>\n </EditedModelContextProvider>\n );\n}\n"],"names":["ModelTransformerUtils","importShared","modelTransformerWebSpec","useProjectDefinition","Label","SectionListSection","SectionListSectionContent","SectionListSectionDescription","SectionListSectionHeader","SectionListSectionTitle","SwitchField","ServiceMethodFieldsSection","className","control","setValue","fields","useEditedModelConfig","model","create","useWatch","update","isCreateEnabled","isUpdateEnabled","transformers","definitionContainer","pluginContainer","createFields","updateFields","createTransformers","updateTransformers","tableClassName","transformerWeb","jsxs","jsx","field","BadgeWithTypeLabel","SCALAR_FIELD_TYPE_OPTIONS","value","id","transformer","BUILT_IN_TRANSFORMER_WEB_CONFIGS","createTransformerSchema","modelTransformerEntityType","useDefinitionSchema","Button","DialogClose","DialogFooter","useId","useMemo","z","ServiceTransformerForm","Form","pluginKey","onUpdate","isCreate","originalModel","transformerSchema","schema","formProps","useForm","zodResolver","handleSubmit","isDirty","onSubmit","data","formId","clsx","e","Dialog","DialogContent","DialogDescription","DialogHeader","DialogTitle","DialogTrigger","useControlledState","ServiceTransformerDialog","children","asChild","webConfig","open","onOpenChange","isOpen","setIsOpen","DropdownMenu","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","DropdownMenuTrigger","RecordView","RecordViewActions","RecordViewItem","RecordViewItemList","useConfirmDialog","useState","ServiceTransformerRecord","idx","onRemove","transformerConfig","summary","item","MdEdit","MdOutlineDelete","ServiceTransformersSection","remove","append","useFieldArray","requestConfirm","modelConfig","addableTransformers","isNewTransfomerDialogOpen","setIsNewTransformerDialogOpen","addableTransformerIdx","setAddableTransformerIdx","MdAdd","useBlockUnsavedChangesNavigate","FormActionBar","SectionList","SwitchFieldController","registerEntityTypeUrl","SplitComponent","key","Route","useParams","form","useModelForm","omit","modelKey","watch","getValues","reset","EditedModelContextProvider"],"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{s as h,E as p}from"./index-BekC6gsX.js";const{createTemplateExtractorSchema:f}=await a("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:b,useDefinitionSchema:u,useProjectDefinition:j,useResettableForm:g}=await a("@baseplate-dev/project-builder-lib/web"),{Alert:E,AlertDescription:S,AlertTitle:T,CheckboxFieldController:v,FormActionBar:w,SectionList:A,SectionListSection:L,SectionListSectionContent:R,SectionListSectionHeader:C,SectionListSectionTitle:N,TextareaFieldController:y}=await a("@baseplate-dev/ui-components"),k=function(){const{definition:l,saveDefinitionWithFeedback:r}=j(),o=l.settings.templateExtractor??{writeMetadata:!1,fileIdRegexWhitelist:""},n=u(f),i=g({resolver:h(n),defaultValues:o}),{handleSubmit:c,control:t,reset:d}=i,s=c(m=>r(x=>{x.settings.templateExtractor=m}));return b({control:t,reset:d,onSubmit:s}),p?e.jsxs("form",{className:"relative h-full max-h-full pb-(--action-bar-height)",onSubmit:s,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:"Template Extractor"})}),e.jsx(A,{children:e.jsxs(L,{children:[e.jsx(C,{children:e.jsx(N,{children:"Settings"})}),e.jsxs(R,{className:"flex max-w-md flex-col gap-4",children:[e.jsx(v,{name:"writeMetadata",label:"Write Metadata",description:"Write metadata to the project to enable template extraction",control:t}),e.jsx(y,{name:"fileIdRegexWhitelist",label:"File ID Regex Whitelist",description:"A list of file IDs to include in the template extractor metadata for generators that have a manually assigned file IDs, e.g. files generated by generators that have multiple instances. The list is delimited by a newline and must be a valid regex.",control:t})]})]})})]}),e.jsx(w,{form:i})]}):e.jsxs(E,{variant:"error",className:"mx-auto my-16 max-w-2xl",children:[e.jsx(T,{children:"Template Extractor is disabled"}),e.jsxs(S,{children:["Template extractor is disabled in the environment. Please enable it with ",e.jsx("code",{children:"VITE_ENABLE_TEMPLATE_EXTRACTOR=true"})," to use it."]})]})};export{k as component};
2
- //# sourceMappingURL=template-extractor-ChZnhGEF.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{s as h,E as p}from"./index-DEKFCy0H.js";const{createTemplateExtractorSchema:f}=await a("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:b,useDefinitionSchema:u,useProjectDefinition:j,useResettableForm:g}=await a("@baseplate-dev/project-builder-lib/web"),{Alert:E,AlertDescription:S,AlertTitle:T,CheckboxFieldController:v,FormActionBar:w,SectionList:A,SectionListSection:L,SectionListSectionContent:R,SectionListSectionHeader:C,SectionListSectionTitle:N,TextareaFieldController:y}=await a("@baseplate-dev/ui-components"),k=function(){const{definition:l,saveDefinitionWithFeedback:r}=j(),o=l.settings.templateExtractor??{writeMetadata:!1,fileIdRegexWhitelist:""},n=u(f),i=g({resolver:h(n),defaultValues:o}),{handleSubmit:c,control:t,reset:d}=i,s=c(m=>r(x=>{x.settings.templateExtractor=m}));return b({control:t,reset:d,onSubmit:s}),p?e.jsxs("form",{className:"relative h-full max-h-full pb-(--action-bar-height)",onSubmit:s,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:"Template Extractor"})}),e.jsx(A,{children:e.jsxs(L,{children:[e.jsx(C,{children:e.jsx(N,{children:"Settings"})}),e.jsxs(R,{className:"flex max-w-md flex-col gap-4",children:[e.jsx(v,{name:"writeMetadata",label:"Write Metadata",description:"Write metadata to the project to enable template extraction",control:t}),e.jsx(y,{name:"fileIdRegexWhitelist",label:"File ID Regex Whitelist",description:"A list of file IDs to include in the template extractor metadata for generators that have a manually assigned file IDs, e.g. files generated by generators that have multiple instances. The list is delimited by a newline and must be a valid regex.",control:t})]})]})})]}),e.jsx(w,{form:i})]}):e.jsxs(E,{variant:"error",className:"mx-auto my-16 max-w-2xl",children:[e.jsx(T,{children:"Template Extractor is disabled"}),e.jsxs(S,{children:["Template extractor is disabled in the environment. Please enable it with ",e.jsx("code",{children:"VITE_ENABLE_TEMPLATE_EXTRACTOR=true"})," to use it."]})]})};export{k as component};
2
+ //# sourceMappingURL=template-extractor-D33LuEZ8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-extractor-ChZnhGEF.js","sources":["../../src/routes/settings/template-extractor.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { createTemplateExtractorSchema } 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 Alert,\n AlertDescription,\n AlertTitle,\n CheckboxFieldController,\n FormActionBar,\n SectionList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionHeader,\n SectionListSectionTitle,\n TextareaFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { ENABLE_TEMPLATE_EXTRACTOR } from '#src/services/config.js';\n\nexport const Route = createFileRoute('/settings/template-extractor')({\n component: TemplateExtractorSettingsPage,\n beforeLoad: () => ({\n getTitle: () => 'Template Extractor',\n }),\n});\n\n/**\n * Settings page for template extractor configuration\n *\n * Allows users to control template metadata generation during the extraction process.\n */\nfunction TemplateExtractorSettingsPage(): React.JSX.Element {\n const { definition, saveDefinitionWithFeedback } = useProjectDefinition();\n const defaultValues = definition.settings.templateExtractor ?? {\n writeMetadata: false,\n fileIdRegexWhitelist: '',\n };\n const templateExtractorSchema = useDefinitionSchema(\n createTemplateExtractorSchema,\n );\n const form = useResettableForm({\n resolver: zodResolver(templateExtractorSchema),\n defaultValues,\n });\n\n const { handleSubmit, control, reset } = form;\n\n const onSubmit = handleSubmit((data) =>\n saveDefinitionWithFeedback((draftConfig) => {\n draftConfig.settings.templateExtractor = data;\n }),\n );\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n if (!ENABLE_TEMPLATE_EXTRACTOR) {\n return (\n <Alert variant=\"error\" className=\"mx-auto my-16 max-w-2xl\">\n <AlertTitle>Template Extractor is disabled</AlertTitle>\n <AlertDescription>\n Template extractor is disabled in the environment. Please enable it\n with <code>VITE_ENABLE_TEMPLATE_EXTRACTOR=true</code> to use it.\n </AlertDescription>\n </Alert>\n );\n }\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>Template Extractor</h1>\n </div>\n <SectionList>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Settings</SectionListSectionTitle>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"flex max-w-md flex-col gap-4\">\n <CheckboxFieldController\n name=\"writeMetadata\"\n label=\"Write Metadata\"\n description=\"Write metadata to the project to enable template extraction\"\n control={control}\n />\n <TextareaFieldController\n name=\"fileIdRegexWhitelist\"\n label=\"File ID Regex Whitelist\"\n description=\"A list of file IDs to include in the template extractor metadata for generators that have a manually assigned file IDs, e.g. files generated by generators that have multiple instances. The list is delimited by a newline and must be a valid regex.\"\n control={control}\n />\n </SectionListSectionContent>\n </SectionListSection>\n </SectionList>\n </div>\n <FormActionBar form={form} />\n </form>\n );\n}\n"],"names":["createTemplateExtractorSchema","importShared","useBlockUnsavedChangesNavigate","useDefinitionSchema","useProjectDefinition","useResettableForm","Alert","AlertDescription","AlertTitle","CheckboxFieldController","FormActionBar","SectionList","SectionListSection","SectionListSectionContent","SectionListSectionHeader","SectionListSectionTitle","TextareaFieldController","SplitComponent","definition","saveDefinitionWithFeedback","defaultValues","settings","templateExtractor","writeMetadata","fileIdRegexWhitelist","templateExtractorSchema","form","resolver","zodResolver","handleSubmit","control","reset","onSubmit","draftConfig","data","ENABLE_TEMPLATE_EXTRACTOR","jsxs","jsx"],"mappings":"+JAEA,KAAA,CAAA,8BAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EACA,CAAA,+BAAAC,EAAA,oBAAAC,EAAA,qBAAAC,EAAA,kBAAAC,CAAA,EAAA,MAAAJ,EAAA,wCAAA,EAMA,CAAA,MAAAK,EAAA,iBAAAC,EAAA,WAAAC,EAAA,wBAAAC,EAAA,cAAAC,EAAA,YAAAC,EAAA,mBAAAC,EAAA,0BAAAC,EAAA,yBAAAC,EAAA,wBAAAC,EAAA,wBAAAC,CAAA,EAAA,MAAAf,EAAA,8BAAA,EAyBAgB,EAAA,UAK4D,CACpD,KAAA,CAAEC,WAAAA,EAAYC,2BAAAA,GAA+Bf,EAAqB,EAClEgB,EAAgBF,EAAWG,SAASC,mBAAqB,CAC7DC,cAAe,GACfC,qBAAsB,EACxB,EACMC,EAA0BtB,EAC9BH,CACF,EACM0B,EAAOrB,EAAkB,CAC7BsB,SAAUC,EAAYH,CAAuB,EAC7CL,cAAAA,CAAAA,CACD,EAEK,CAAES,aAAAA,EAAcC,QAAAA,EAASC,MAAAA,CAAAA,EAAUL,EAEnCM,EAAWH,EACfV,GAAAA,EAA4Cc,GAAA,CAC1CA,EAAYZ,SAASC,kBAAoBY,CAAAA,CAC1C,CACH,EAIA,OAF+BhC,EAAA,CAAE4B,QAAAA,EAASC,MAAAA,EAAOC,SAAAA,CAAAA,CAAU,EAEtDG,EAaFC,EAAAA,KAAA,OAAA,CACC,UAAU,sDACV,SAAAJ,EAEA,SAAA,CAACI,EAAAA,KAAA,MAAA,CAAI,UAAU,8DACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,2CACb,SAACA,MAAA,KAAA,CAAG,8BAAkB,CACxB,CAAA,EACAA,EAAA,IAAC1B,EACC,CAAA,SAAAyB,EAAAA,KAACxB,EACC,CAAA,SAAA,CAAAyB,MAACvB,EACC,CAAA,SAAAuB,EAAA,IAACtB,EAAwB,CAAA,SAAA,UAAQ,CAAA,EACnC,EACAqB,EAAAA,KAACvB,EAA0B,CAAA,UAAU,+BACnC,SAAA,CAAAwB,MAAC5B,GACC,KAAK,gBACL,MAAM,iBACN,YAAY,8DACZ,QAAAqB,EAAiB,EAEnBO,MAACrB,GACC,KAAK,uBACL,MAAM,0BACN,YAAY,yPACZ,QAAAc,CAAiB,CAAA,CAAA,CAErB,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAAA,EACF,EACAO,MAAC3B,GAAc,KAAAgB,CAAW,CAAA,CAAA,EAC5B,EA1CGU,EAAAA,KAAA9B,EAAA,CAAM,QAAQ,QAAQ,UAAU,0BAC/B,SAAA,CAAA+B,EAAAA,IAAC7B,GAAW,SAA8B,gCAAA,CAAA,SACzCD,EAAgB,CAAA,SAAA,CAAA,4EAEV8B,EAAAA,IAAC,QAAK,SAAmC,qCAAA,CAAA,EAAO,aAAA,CACvD,CAAA,CAAA,EACF,CAsCN"}
1
+ {"version":3,"file":"template-extractor-D33LuEZ8.js","sources":["../../src/routes/settings/template-extractor.tsx?tsr-split=component"],"sourcesContent":["import type React from 'react';\n\nimport { createTemplateExtractorSchema } 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 Alert,\n AlertDescription,\n AlertTitle,\n CheckboxFieldController,\n FormActionBar,\n SectionList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionHeader,\n SectionListSectionTitle,\n TextareaFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { ENABLE_TEMPLATE_EXTRACTOR } from '#src/services/config.js';\n\nexport const Route = createFileRoute('/settings/template-extractor')({\n component: TemplateExtractorSettingsPage,\n beforeLoad: () => ({\n getTitle: () => 'Template Extractor',\n }),\n});\n\n/**\n * Settings page for template extractor configuration\n *\n * Allows users to control template metadata generation during the extraction process.\n */\nfunction TemplateExtractorSettingsPage(): React.JSX.Element {\n const { definition, saveDefinitionWithFeedback } = useProjectDefinition();\n const defaultValues = definition.settings.templateExtractor ?? {\n writeMetadata: false,\n fileIdRegexWhitelist: '',\n };\n const templateExtractorSchema = useDefinitionSchema(\n createTemplateExtractorSchema,\n );\n const form = useResettableForm({\n resolver: zodResolver(templateExtractorSchema),\n defaultValues,\n });\n\n const { handleSubmit, control, reset } = form;\n\n const onSubmit = handleSubmit((data) =>\n saveDefinitionWithFeedback((draftConfig) => {\n draftConfig.settings.templateExtractor = data;\n }),\n );\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n if (!ENABLE_TEMPLATE_EXTRACTOR) {\n return (\n <Alert variant=\"error\" className=\"mx-auto my-16 max-w-2xl\">\n <AlertTitle>Template Extractor is disabled</AlertTitle>\n <AlertDescription>\n Template extractor is disabled in the environment. Please enable it\n with <code>VITE_ENABLE_TEMPLATE_EXTRACTOR=true</code> to use it.\n </AlertDescription>\n </Alert>\n );\n }\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>Template Extractor</h1>\n </div>\n <SectionList>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Settings</SectionListSectionTitle>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"flex max-w-md flex-col gap-4\">\n <CheckboxFieldController\n name=\"writeMetadata\"\n label=\"Write Metadata\"\n description=\"Write metadata to the project to enable template extraction\"\n control={control}\n />\n <TextareaFieldController\n name=\"fileIdRegexWhitelist\"\n label=\"File ID Regex Whitelist\"\n description=\"A list of file IDs to include in the template extractor metadata for generators that have a manually assigned file IDs, e.g. files generated by generators that have multiple instances. The list is delimited by a newline and must be a valid regex.\"\n control={control}\n />\n </SectionListSectionContent>\n </SectionListSection>\n </SectionList>\n </div>\n <FormActionBar form={form} />\n </form>\n );\n}\n"],"names":["createTemplateExtractorSchema","importShared","useBlockUnsavedChangesNavigate","useDefinitionSchema","useProjectDefinition","useResettableForm","Alert","AlertDescription","AlertTitle","CheckboxFieldController","FormActionBar","SectionList","SectionListSection","SectionListSectionContent","SectionListSectionHeader","SectionListSectionTitle","TextareaFieldController","SplitComponent","definition","saveDefinitionWithFeedback","defaultValues","settings","templateExtractor","writeMetadata","fileIdRegexWhitelist","templateExtractorSchema","form","resolver","zodResolver","handleSubmit","control","reset","onSubmit","draftConfig","data","ENABLE_TEMPLATE_EXTRACTOR","jsxs","jsx"],"mappings":"+JAEA,KAAA,CAAA,8BAAAA,CAAA,EAAA,MAAAC,EAAA,oCAAA,EACA,CAAA,+BAAAC,EAAA,oBAAAC,EAAA,qBAAAC,EAAA,kBAAAC,CAAA,EAAA,MAAAJ,EAAA,wCAAA,EAMA,CAAA,MAAAK,EAAA,iBAAAC,EAAA,WAAAC,EAAA,wBAAAC,EAAA,cAAAC,EAAA,YAAAC,EAAA,mBAAAC,EAAA,0BAAAC,EAAA,yBAAAC,EAAA,wBAAAC,EAAA,wBAAAC,CAAA,EAAA,MAAAf,EAAA,8BAAA,EAyBAgB,EAAA,UAK4D,CACpD,KAAA,CAAEC,WAAAA,EAAYC,2BAAAA,GAA+Bf,EAAqB,EAClEgB,EAAgBF,EAAWG,SAASC,mBAAqB,CAC7DC,cAAe,GACfC,qBAAsB,EACxB,EACMC,EAA0BtB,EAC9BH,CACF,EACM0B,EAAOrB,EAAkB,CAC7BsB,SAAUC,EAAYH,CAAuB,EAC7CL,cAAAA,CAAAA,CACD,EAEK,CAAES,aAAAA,EAAcC,QAAAA,EAASC,MAAAA,CAAAA,EAAUL,EAEnCM,EAAWH,EACfV,GAAAA,EAA4Cc,GAAA,CAC1CA,EAAYZ,SAASC,kBAAoBY,CAAAA,CAC1C,CACH,EAIA,OAF+BhC,EAAA,CAAE4B,QAAAA,EAASC,MAAAA,EAAOC,SAAAA,CAAAA,CAAU,EAEtDG,EAaFC,EAAAA,KAAA,OAAA,CACC,UAAU,sDACV,SAAAJ,EAEA,SAAA,CAACI,EAAAA,KAAA,MAAA,CAAI,UAAU,8DACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,2CACb,SAACA,MAAA,KAAA,CAAG,8BAAkB,CACxB,CAAA,EACAA,EAAA,IAAC1B,EACC,CAAA,SAAAyB,EAAAA,KAACxB,EACC,CAAA,SAAA,CAAAyB,MAACvB,EACC,CAAA,SAAAuB,EAAA,IAACtB,EAAwB,CAAA,SAAA,UAAQ,CAAA,EACnC,EACAqB,EAAAA,KAACvB,EAA0B,CAAA,UAAU,+BACnC,SAAA,CAAAwB,MAAC5B,GACC,KAAK,gBACL,MAAM,iBACN,YAAY,8DACZ,QAAAqB,EAAiB,EAEnBO,MAACrB,GACC,KAAK,uBACL,MAAM,0BACN,YAAY,yPACZ,QAAAc,CAAiB,CAAA,CAAA,CAErB,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAAA,EACF,EACAO,MAAC3B,GAAc,KAAAgB,CAAW,CAAA,CAAA,EAC5B,EA1CGU,EAAAA,KAAA9B,EAAA,CAAM,QAAQ,QAAQ,UAAU,0BAC/B,SAAA,CAAA+B,EAAAA,IAAC7B,GAAW,SAA8B,gCAAA,CAAA,SACzCD,EAAgB,CAAA,SAAA,CAAA,4EAEV8B,EAAAA,IAAC,QAAK,SAAmC,qCAAA,CAAA,EAAO,aAAA,CACvD,CAAA,CAAA,EACF,CAsCN"}