@cobaltcore-dev/aurora 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/client/AuroraApp.d.ts +2 -0
- package/dist/client/AuthProvider-DZqOvceF.mjs +64 -0
- package/dist/client/AuthProvider-DZqOvceF.mjs.map +1 -0
- package/dist/client/ContentHeader-DsuZD8fa.mjs +110 -0
- package/dist/client/ContentHeader-DsuZD8fa.mjs.map +1 -0
- package/dist/client/{DeleteFlavorModal-C3m7bQJu.mjs → DeleteFlavorModal-RnbspW_2.mjs} +135 -135
- package/dist/client/{DeleteFlavorModal-C3m7bQJu.mjs.map → DeleteFlavorModal-RnbspW_2.mjs.map} +1 -1
- package/dist/client/DeleteVersionsModal-CsBJzXoW.mjs +331 -0
- package/dist/client/DeleteVersionsModal-CsBJzXoW.mjs.map +1 -0
- package/dist/client/{EditSecurityGroupModal-DKusxfta.mjs → EditSecurityGroupModal-BPv3d7am.mjs} +15 -15
- package/dist/client/{EditSecurityGroupModal-DKusxfta.mjs.map → EditSecurityGroupModal-BPv3d7am.mjs.map} +1 -1
- package/dist/client/{FiltersInput-GzR4D0q6.mjs → FiltersInput-CViamP59.mjs} +2 -2
- package/dist/client/{FiltersInput-GzR4D0q6.mjs.map → FiltersInput-CViamP59.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-CRvROJ3H.mjs → FloatingIpActionModals-DTn3HFei.mjs} +45 -45
- package/dist/client/{FloatingIpActionModals-CRvROJ3H.mjs.map → FloatingIpActionModals-DTn3HFei.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-BuDXpTkl.mjs → ImageToastNotifications-CFKQZTgf.mjs} +261 -261
- package/dist/client/{ImageToastNotifications-BuDXpTkl.mjs.map → ImageToastNotifications-CFKQZTgf.mjs.map} +1 -1
- package/dist/client/{RouteError-DVAiT0mT.mjs → RouteError-BebIhFpQ.mjs} +2 -2
- package/dist/client/{RouteError-DVAiT0mT.mjs.map → RouteError-BebIhFpQ.mjs.map} +1 -1
- package/dist/client/{SortInput-VK7IYqQv.mjs → SortInput-D0Vb864D.mjs} +9 -9
- package/dist/client/SortInput-D0Vb864D.mjs.map +1 -0
- package/dist/client/{_auth-DXJkv9QO.mjs → _auth-DnImOqR-.mjs} +2 -2
- package/dist/client/_auth-DnImOqR-.mjs.map +1 -0
- package/dist/client/{_flavorId-Dy7EYQum.mjs → _flavorId-C9SZd1jL.mjs} +8 -8
- package/dist/client/{_flavorId-Dy7EYQum.mjs.map → _flavorId-C9SZd1jL.mjs.map} +1 -1
- package/dist/client/{_flavorId-DsD2VTKA.mjs → _flavorId-DINgWoeV.mjs} +38 -38
- package/dist/client/{_flavorId-DsD2VTKA.mjs.map → _flavorId-DINgWoeV.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-j17rCQqG2.mjs → _floatingIpId-BACLbMzi2.mjs} +32 -32
- package/dist/client/{_floatingIpId-j17rCQqG2.mjs.map → _floatingIpId-BACLbMzi2.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-BjVbeNw_.mjs → _floatingIpId-BzVMOv97.mjs} +2 -2
- package/dist/client/{_floatingIpId-BjVbeNw_.mjs.map → _floatingIpId-BzVMOv97.mjs.map} +1 -1
- package/dist/client/_imageId-DCvaU7-S.mjs +534 -0
- package/dist/client/_imageId-DCvaU7-S.mjs.map +1 -0
- package/dist/client/{_pcaId-BwTvJJgh.mjs → _pcaId-B3PqECyO.mjs} +115 -115
- package/dist/client/{_pcaId-BwTvJJgh.mjs.map → _pcaId-B3PqECyO.mjs.map} +1 -1
- package/dist/client/{_pcaId-DUHQd0rB.mjs → _pcaId-DAJEt3ZI.mjs} +2 -2
- package/dist/client/{_pcaId-DUHQd0rB.mjs.map → _pcaId-DAJEt3ZI.mjs.map} +1 -1
- package/dist/client/{_projectId-CARHuZTU.mjs → _projectId-B2hG5peP.mjs} +3 -3
- package/dist/client/_projectId-B2hG5peP.mjs.map +1 -0
- package/dist/client/{_projectId-DR_2U10f.mjs → _projectId-BnWXWTBR.mjs} +3 -3
- package/dist/client/_projectId-BnWXWTBR.mjs.map +1 -0
- package/dist/client/{_projectId-BaqZ4W50.mjs → _projectId-DRr9rLST.mjs} +103 -109
- package/dist/client/_projectId-DRr9rLST.mjs.map +1 -0
- package/dist/client/{_projectId-B_2sZKk-.mjs → _projectId-DU8qRiZk.mjs} +2 -2
- package/dist/client/_projectId-DU8qRiZk.mjs.map +1 -0
- package/dist/client/{_securityGroupId-fhK1CuZh.mjs → _securityGroupId-Cj9IotMJ.mjs} +2 -2
- package/dist/client/{_securityGroupId-fhK1CuZh.mjs.map → _securityGroupId-Cj9IotMJ.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-DYxmXUOP.mjs → _securityGroupId-ClJiFh4R.mjs} +267 -267
- package/dist/client/{_securityGroupId-DYxmXUOP.mjs.map → _securityGroupId-ClJiFh4R.mjs.map} +1 -1
- package/dist/client/_storageType-BrHDa2bD.mjs +3005 -0
- package/dist/client/_storageType-BrHDa2bD.mjs.map +1 -0
- package/dist/client/{_storageType-D7-_Xwwl.mjs → _storageType-CSLH93js.mjs} +2 -2
- package/dist/client/{_storageType-D7-_Xwwl.mjs.map → _storageType-CSLH93js.mjs.map} +1 -1
- package/dist/client/_storageType-zeSZe--V.mjs.map +1 -1
- package/dist/client/{about-Nsxkyh9U.mjs → about-BnU297yB.mjs} +2 -2
- package/dist/client/about-BnU297yB.mjs.map +1 -0
- package/dist/client/{aurora-DDzsst74.mjs → aurora-6RsAZtnz.mjs} +2 -2
- package/dist/client/aurora-6RsAZtnz.mjs.map +1 -0
- package/dist/client/{build-BdRRmNf5.mjs → build-DF7MTyXG.mjs} +3582 -3114
- package/dist/client/{build-BdRRmNf5.mjs.map → build-DF7MTyXG.mjs.map} +1 -1
- package/dist/client/{constants-J5nm9hbP.mjs → constants-BskfpGYY.mjs} +17 -17
- package/dist/client/{constants-J5nm9hbP.mjs.map → constants-BskfpGYY.mjs.map} +1 -1
- package/dist/client/{flavors-C-gY4XeQ.mjs → flavors-DAbtRoep.mjs} +151 -151
- package/dist/client/{flavors-C-gY4XeQ.mjs.map → flavors-DAbtRoep.mjs.map} +1 -1
- package/dist/client/{flavors-Dwy1ID_f.mjs → flavors-DODudzrA.mjs} +2 -2
- package/dist/client/{flavors-Dwy1ID_f.mjs.map → flavors-DODudzrA.mjs.map} +1 -1
- package/dist/client/flavors-DWMZ6TuJ.mjs.map +1 -1
- package/dist/client/{floatingips-Dq4DXQYb.mjs → floatingips-DJW9ftN_.mjs} +84 -84
- package/dist/client/floatingips-DJW9ftN_.mjs.map +1 -0
- package/dist/client/{hooks-dSArr2Ca.mjs → hooks-CMgoYcDG.mjs} +1 -1
- package/dist/client/{images-bG-MZZ7V.mjs → images-BbLnuYrL.mjs} +2 -2
- package/dist/client/{images-bG-MZZ7V.mjs.map → images-BbLnuYrL.mjs.map} +1 -1
- package/dist/client/{images-Dbjo4yKn.mjs → images-C3JyPwer.mjs} +2 -2
- package/dist/client/images-C3JyPwer.mjs.map +1 -0
- package/dist/client/{images-HG7TneK0.mjs → images-Cp6V1nF5.mjs} +455 -455
- package/dist/client/{images-HG7TneK0.mjs.map → images-Cp6V1nF5.mjs.map} +1 -1
- package/dist/client/images-NBf2bV43.mjs.map +1 -1
- package/dist/client/index.js +270 -266
- package/dist/client/index.js.map +1 -1
- package/dist/client/{md-CYTrL5dq.mjs → md-CyCflQee.mjs} +10 -28
- package/dist/client/{md-CYTrL5dq.mjs.map → md-CyCflQee.mjs.map} +1 -1
- package/dist/client/network-DuZm76BZ.mjs.map +1 -1
- package/dist/client/{objects-DKWp9RtR.mjs → objects-Bw96WXOs.mjs} +4 -3
- package/dist/client/objects-Bw96WXOs.mjs.map +1 -0
- package/dist/client/objects-DUmK3WgA.mjs +5998 -0
- package/dist/client/objects-DUmK3WgA.mjs.map +1 -0
- package/dist/client/objects-o2Cj_ndZ.mjs.map +1 -1
- package/dist/client/{pca-D7DF_BZZ.mjs → pca-DKeGzbww.mjs} +2 -2
- package/dist/client/{pca-D7DF_BZZ.mjs.map → pca-DKeGzbww.mjs.map} +1 -1
- package/dist/client/{pca-BBxPCAH0.mjs → pca-Dc_tdh4-.mjs} +47 -47
- package/dist/client/{pca-BBxPCAH0.mjs.map → pca-Dc_tdh4-.mjs.map} +1 -1
- package/dist/client/{projects-DNd3UTas.mjs → projects-CRL37ftA.mjs} +16 -16
- package/dist/client/{projects-DNd3UTas.mjs.map → projects-CRL37ftA.mjs.map} +1 -1
- package/dist/client/{projects-B5topuei.mjs → projects-DUWOgB3m.mjs} +2 -2
- package/dist/client/{projects-B5topuei.mjs.map → projects-DUWOgB3m.mjs.map} +1 -1
- package/dist/client/{projects-CHYn7L5e.mjs → projects-DpXQYfKc.mjs} +2 -2
- package/dist/client/projects-DpXQYfKc.mjs.map +1 -0
- package/dist/client/{securitygroups-CNFLu9zS.mjs → securitygroups-CWWFSjjj.mjs} +94 -94
- package/dist/client/securitygroups-CWWFSjjj.mjs.map +1 -0
- package/dist/client/{useListWithFiltering-v2A0-SZb.mjs → useListWithFiltering-C9k7xWqz.mjs} +7 -7
- package/dist/client/{useListWithFiltering-v2A0-SZb.mjs.map → useListWithFiltering-C9k7xWqz.mjs.map} +1 -1
- package/dist/server/index.js +979 -454
- package/package.json +3 -3
- package/dist/client/AuthProvider-Co4d0WzB.mjs +0 -100
- package/dist/client/AuthProvider-Co4d0WzB.mjs.map +0 -1
- package/dist/client/ContentHeader-D4jlOG-9.mjs +0 -96
- package/dist/client/ContentHeader-D4jlOG-9.mjs.map +0 -1
- package/dist/client/SortInput-VK7IYqQv.mjs.map +0 -1
- package/dist/client/_auth-DXJkv9QO.mjs.map +0 -1
- package/dist/client/_imageId-BjfhqAje.mjs +0 -534
- package/dist/client/_imageId-BjfhqAje.mjs.map +0 -1
- package/dist/client/_projectId-B_2sZKk-.mjs.map +0 -1
- package/dist/client/_projectId-BaqZ4W50.mjs.map +0 -1
- package/dist/client/_projectId-CARHuZTU.mjs.map +0 -1
- package/dist/client/_projectId-DR_2U10f.mjs.map +0 -1
- package/dist/client/_storageType-B0eJODiQ.mjs +0 -3244
- package/dist/client/_storageType-B0eJODiQ.mjs.map +0 -1
- package/dist/client/about-Nsxkyh9U.mjs.map +0 -1
- package/dist/client/aurora-DDzsst74.mjs.map +0 -1
- package/dist/client/floatingips-Dq4DXQYb.mjs.map +0 -1
- package/dist/client/images-Dbjo4yKn.mjs.map +0 -1
- package/dist/client/objects-DKWp9RtR.mjs.map +0 -1
- package/dist/client/objects-DaCuy_CB.mjs +0 -5708
- package/dist/client/objects-DaCuy_CB.mjs.map +0 -1
- package/dist/client/projects-CHYn7L5e.mjs.map +0 -1
- package/dist/client/securitygroups-CNFLu9zS.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"about-Nsxkyh9U.mjs","names":["Trans","Container","ContentHeading","About","component"],"sources":["../../src/client/routes/about.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Container, ContentHeading } from \"@cloudoperators/juno-ui-components/index\"\n\nexport const Route = createFileRoute(\"/about\")({\n component: About,\n})\n\nfunction About() {\n return (\n <Container className=\"flex flex-col items-center justify-center px-6 py-12 sm:px-12 md:px-20\">\n <div className=\"mx-auto w-full lg:w-2/3\">\n <ContentHeading className=\"mb-6 text-center\">\n <Trans>About Aurora Dashboard</Trans>\n </ContentHeading>\n <p className=\"mb-8 text-center\">\n <Trans>\n Welcome to <strong>Aurora Dashboard</strong>, your next-generation cloud management solution. We are\n dedicated to simplifying how you interact with and manage your cloud infrastructure. Designed with\n efficiency, scalability, and usability at its core, Aurora empowers you to streamline operations and unlock\n the full potential of your cloud resources.\n </Trans>\n </p>\n <ContentHeading className=\"mb-4 text-center\">\n <Trans>Our Mission</Trans>\n </ContentHeading>\n <p className=\"mb-8 text-center\">\n <Trans>\n At Aurora, our mission is to provide a centralized platform that unifies cloud management. We aim to\n simplify the complexities of provisioning, configuring, and scaling resources across diverse cloud\n environments while enabling seamless growth for your business.\n </Trans>\n </p>\n <ContentHeading className=\"mb-4 text-center\">\n <Trans>Key Features</Trans>\n </ContentHeading>\n <ul className=\"mb-8 list-disc space-y-4 pl-6\">\n <li>\n <p>\n <Trans>\n <strong>Unified Cloud Management:</strong> Consolidates all your cloud assets into one intuitive\n interface.\n </Trans>\n </p>\n </li>\n <li>\n <p>\n <Trans>\n <strong>Effortless Resource Provisioning:</strong> Quickly provision, configure, and deploy resources\n like servers, networks, and volumes with just a few clicks.\n </Trans>\n </p>\n </li>\n <li>\n <p>\n <Trans>\n <strong>Optimized Scalability:</strong> Built for businesses of all sizes, Aurora grows with you,\n supporting simple environments and intricate multi-cloud setups alike.\n </Trans>\n </p>\n </li>\n <li>\n <p>\n <Trans>\n <strong>Enhanced Productivity:</strong> By reducing operational complexity, Aurora helps your team focus\n on what truly matters—innovating and driving business success.\n </Trans>\n </p>\n </li>\n </ul>\n <ContentHeading className=\"mb-4 text-center\">\n <Trans>Why Choose Aurora?</Trans>\n </ContentHeading>\n <p className=\"mb-8 text-center\">\n <Trans>\n Aurora Dashboard is more than just a tool—it's your partner in navigating the cloud. Whether you're a small\n startup or a global enterprise, Aurora provides the flexibility, power, and simplicity you need to achieve\n your goals.\n </Trans>\n </p>\n <ul className=\"mb-8 list-disc space-y-4 pl-6\">\n <li>\n <p>\n <Trans>\n <strong>Secure & Reliable:</strong> Your data and operations are safeguarded with enterprise-grade\n security and robust reliability.\n </Trans>\n </p>\n </li>\n <li>\n <p>\n <Trans>\n <strong>Future-Ready:</strong> Aurora is designed to evolve with the latest trends in cloud technology,\n ensuring your solution is always cutting-edge.\n </Trans>\n </p>\n </li>\n </ul>\n <ContentHeading className=\"mb-4 text-center\">\n <Trans>Get Involved</Trans>\n </ContentHeading>\n <p className=\"mb-6 text-center\">\n <Trans>\n We are building Aurora Dashboard to serve you better. Your feedback is invaluable in shaping a tool that\n meets the unique needs of businesses like yours. Stay connected and join us as we redefine cloud management.\n </Trans>\n </p>\n <p className=\"text-center\">\n <Trans>Together, we can unlock the true potential of your cloud infrastructure.</Trans>\n </p>\n </div>\n </Container>\n )\n}\n"],"mappings":";;;;AAQA,SAASG,IAAAA;CACP,OACE,gBAAC,GAAA;EAAU,WAAU;YACnB,gBAAC,OAAA;GAAI,WAAU;;IACb,gBAAC,GAAA;KAAe,WAAU;eACxB,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,KAAA;KAAE,WAAU;eACX,gBAAA,GAAA;;uCACc,UAAA,CAAA,CAAA,EAAA;;;IAMhB,gBAAC,GAAA;KAAe,WAAU;eACxB,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,KAAA;KAAE,WAAU;eACX,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAMF,gBAAC,GAAA;KAAe,WAAU;eACxB,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,MAAA;KAAG,WAAU;;MACZ,gBAAC,MAAA,EAAA,UACC,gBAAC,KAAA,EAAA,UACC,gBAAA,GAAA;;wCACG,UAAA,CAAA,CAAA,EAAA;;MAKP,gBAAC,MAAA,EAAA,UACC,gBAAC,KAAA,EAAA,UACC,gBAAA,GAAA;;wCACG,UAAA,CAAA,CAAA,EAAA;;MAKP,gBAAC,MAAA,EAAA,UACC,gBAAC,KAAA,EAAA,UACC,gBAAA,GAAA;;wCACG,UAAA,CAAA,CAAA,EAAA;;MAKP,gBAAC,MAAA,EAAA,UACC,gBAAC,KAAA,EAAA,UACC,gBAAA,GAAA;;wCACG,UAAA,CAAA,CAAA,EAAA;;;;IAMT,gBAAC,GAAA;KAAe,WAAU;eACxB,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,KAAA;KAAE,WAAU;eACX,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAMF,gBAAC,MAAA;KAAG,WAAU;gBACZ,gBAAC,MAAA,EAAA,UACC,gBAAC,KAAA,EAAA,UACC,gBAAA,GAAA;;uCACG,UAAA,CAAA,CAAA,EAAA;eAKP,gBAAC,MAAA,EAAA,UACC,gBAAC,KAAA,EAAA,UACC,gBAAA,GAAA;;uCACG,UAAA,CAAA,CAAA,EAAA;;;IAMT,gBAAC,GAAA;KAAe,WAAU;eACxB,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,KAAA;KAAE,WAAU;eACX,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAKF,gBAAC,KAAA;KAAE,WAAU;eACX,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;;AAKV"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aurora-DDzsst74.mjs","names":["useAuth","Trans","DashboardPage","user","name","component"],"sources":["../../src/client/routes/_auth/aurora.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\n\nimport { useAuth } from \"../../store/AuthProvider\"\nimport { Trans } from \"@lingui/react/macro\"\n\nexport const Route = createFileRoute(\"/_auth/aurora\")({\n component: DashboardPage,\n})\n\nfunction DashboardPage() {\n const { user } = useAuth()\n\n return (\n <div className=\"grid gap-2 p-2\">\n <p>\n <Trans>Hi</Trans> {user?.name}\n </p>\n <p>\n <Trans>You are currently on the dashboard route.</Trans>\n </p>\n </div>\n )\n}\n"],"mappings":";;;;AASA,SAASE,IAAAA;CACP,IAAM,EAAEC,YAASH,EAAAA;CAEjB,OACE,gBAAC,OAAA;EAAI,WAAU;aACb,gBAAC,KAAA,EAAA,UAAA;GACC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;GAAiB;GAAEG,GAAMC;QAE3B,gBAAC,KAAA,EAAA,UACC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,CAAA;;AAIR"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"floatingips-Dq4DXQYb.mjs","names":["MdError","MdRemoveCircle","MdCheckCircle","STATUS_CONFIG","ACTIVE","text","icon","size","color","fill","DOWN","ERROR","TABLE_COLUMNS","t","useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","STATUS_CONFIG","FloatingIpActionModals","useProjectId","FloatingIpTableRow","floatingIp","useLingui","navigate","projectId","navigateToDetailsPage","to","params","floatingIpId","id","data-testid","onClick","div","className","status","icon","text","floating_ip_address","fixed_ip_address","floating_network_id","description","e","stopPropagation","toggleEditModal","toggleAttachModal","toggleDetachModal","toggleReleaseModal","label","t","DataGrid","DataGridHeadCell","DataGridRow","DataGridCell","ContentHeading","Stack","Spinner","FloatingIpTableRow","TABLE_COLUMNS","FloatingIpListContainer","floatingIps","isLoading","isError","error","useLingui","columns","className","distribution","alignment","direction","variant","size","message","t","length","data-testid","colSpan","p","map","label","ip","floatingIp","id","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","TextInput","Select","SelectOption","trpcReact","useProjectId","ipv4Regex","ipv6Regex","isValidIpAddress","value","test","dnsNameRegex","AllocateFloatingIpModal","open","onClose","useLingui","projectId","utils","useUtils","isPending","createFloatingIpMutation","network","floatingIp","create","useMutation","onSettled","list","invalidate","data","externalNetworks","isLoading","isExternalNetworksLoading","error","externalNetworksError","listExternalNetworks","useQuery","project_id","dnsDomains","isDnsDomainsLoading","dnsDomainsError","listDnsDomains","availablePorts","isPortsLoading","portsError","listAvailablePorts","formSchema","object","floating_network_id","string","dns_domain","dns_name","trim","max","t","refine","message","description","floating_ip_address","port_id","fixed_ip_address","form","defaultValues","validators","onSubmit","mutateAsync","tenant_id","handleClose","reset","currentPortId","store","state","values","currentFloatingNetworkId","selectedPort","find","port","id","portFixedIps","fixed_ips","formErrorMessage","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","dismissible","variant","className","div","span","e","preventDefault","Field","name","children","field","onChange","handleChange","label","helptext","placeholder","disabled","required","loading","map","onBlur","handleBlur","target","errortext","meta","errors","join","portId","p","ips","setFieldValue","length","ip_address","Button","ListToolbar","trpcReact","buildFilterParams","useListWithFiltering","useModal","useProjectId","FloatingIpListContainer","AllocateFloatingIpModal","DEFAULT_SORT_KEY","DEFAULT_SORT_DIR","FloatingIpsList","useLingui","projectId","allocateModalOpen","toggleAllocateModal","searchTerm","handleSearchChange","sortSettings","handleSortChange","filterSettings","handleFilterChange","defaultSortKey","defaultSortDir","sortOptions","label","t","value","filters","displayName","filterName","values","supportsMultiValue","data","floatingIps","isLoading","isError","error","network","floatingIp","list","useQuery","project_id","sort_key","sortBy","sort_dir","sortDirection","div","className","onSearch","onSort","onFilter","actions","variant","onClick","open","onClose","useLingui","FloatingIpsList","ContentHeading","RouteComponent","t","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/-table/constants.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/-table/FloatingIpTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/-table/FloatingIpListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/-modals/AllocateFloatingIpModal.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/FloatingIpsList.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/index.tsx?tsr-split=component"],"sourcesContent":["import { MdError, MdRemoveCircle, MdCheckCircle } from \"react-icons/md\"\nimport { t } from \"@lingui/core/macro\"\nimport { FloatingIpStatus } from \"@/server/Network/types/floatingIp\"\n\ntype FloatingIpStatusDisplay = {\n text: string\n icon: React.ReactNode\n}\n\nexport const STATUS_CONFIG: Record<FloatingIpStatus, FloatingIpStatusDisplay> = {\n ACTIVE: {\n text: \"Active\",\n icon: <MdCheckCircle size={18} color=\"white\" fill=\"#4FB81C\" />,\n },\n DOWN: {\n text: \"Down\",\n icon: <MdRemoveCircle size={18} color=\"white\" fill=\"#969696\" />,\n },\n ERROR: {\n text: \"Error\",\n icon: <MdError size={18} color=\"white\" fill=\"#C70000\" />,\n },\n} as const\n\nexport const TABLE_COLUMNS = () =>\n [\n t`Status`,\n t`Floating IP Address`,\n t`Fixed IP Address`,\n t`Subnet`,\n t`Description`,\n \"\", // empty column for item-actions with context menu containing \"Preview\", \"Edit Description\", \"Attach\", \"Detach\" and \"Release\"\n ] as const\n","import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { FloatingIp } from \"@/server/Network/types/floatingIp\"\nimport { STATUS_CONFIG } from \"./constants\"\nimport { FloatingIpActionModals } from \"../-modals/FloatingIpActionModals\"\nimport { useProjectId } from \"@/client/hooks\"\n\ninterface FloatingIpTableRowProps {\n floatingIp: FloatingIp\n}\n\nexport const FloatingIpTableRow = ({ floatingIp }: FloatingIpTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n\n const navigateToDetailsPage = () => {\n navigate({\n to: \"/projects/$projectId/network/floatingips/$floatingIpId\",\n params: { projectId, floatingIpId: floatingIp.id },\n })\n }\n\n return (\n <DataGridRow key={floatingIp.id} data-testid={`floating-ip-row-${floatingIp.id}`} onClick={navigateToDetailsPage}>\n <DataGridCell>\n <div className=\"flex items-center gap-2\">\n {STATUS_CONFIG[floatingIp.status].icon}\n {STATUS_CONFIG[floatingIp.status].text}\n </div>\n </DataGridCell>\n <DataGridCell>{floatingIp.floating_ip_address}</DataGridCell>\n <DataGridCell>{floatingIp.fixed_ip_address || \"—\"}</DataGridCell>\n <DataGridCell>{floatingIp.floating_network_id}</DataGridCell>\n <DataGridCell>{floatingIp.description || \"—\"}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <FloatingIpActionModals floatingIp={floatingIp}>\n {({ toggleEditModal, toggleAttachModal, toggleDetachModal, toggleReleaseModal }) => (\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Preview`} onClick={navigateToDetailsPage} />\n <PopupMenuItem label={t`Edit Description`} onClick={toggleEditModal} />\n <PopupMenuItem label={t`Attach`} onClick={toggleAttachModal} />\n <PopupMenuItem label={t`Detach`} onClick={toggleDetachModal} />\n <PopupMenuItem label={t`Release`} onClick={toggleReleaseModal} />\n </PopupMenuOptions>\n </PopupMenu>\n )}\n </FloatingIpActionModals>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n DataGrid,\n DataGridHeadCell,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n Stack,\n Spinner,\n} from \"@cloudoperators/juno-ui-components\"\nimport { FloatingIp } from \"@/server/Network/types/floatingIp\"\nimport { FloatingIpTableRow } from \"./FloatingIpTableRow\"\nimport { TABLE_COLUMNS } from \"./constants\"\n\ninterface FloatingIpListContainerProps {\n floatingIps: FloatingIp[]\n isLoading: boolean\n isError: boolean\n error: { message?: string } | null\n}\n\nexport const FloatingIpListContainer = ({ floatingIps, isLoading, isError, error }: FloatingIpListContainerProps) => {\n const { t } = useLingui()\n const columns = TABLE_COLUMNS()\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load Floating IPs`}\n </Stack>\n )\n }\n\n if (floatingIps.length === 0) {\n return (\n <DataGrid columns={columns.length} className=\"floating-ips\" data-testid=\"no-floating-ips\">\n <DataGridRow>\n <DataGridCell colSpan={columns.length}>\n <ContentHeading>\n <Trans>No Floating IPs found</Trans>\n </ContentHeading>\n <p>\n <Trans>\n There are no Floating IPs available for this project. Floating IPs allow you to map public IP addresses\n to instances.\n </Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <DataGrid columns={columns.length}>\n <DataGridRow>\n {columns.map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {floatingIps.map((ip) => (\n <FloatingIpTableRow key={ip.id} floatingIp={ip} />\n ))}\n </DataGrid>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormSection,\n Spinner,\n Message,\n Textarea,\n TextInput,\n Select,\n SelectOption,\n} from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface AllocateFloatingIpModalProps {\n open: boolean\n onClose: () => void\n}\n\nconst ipv4Regex = /^(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}$/\nconst ipv6Regex =\n /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(([0-9a-fA-F]{1,4}:){1,7}:)|(([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4})|(([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2})|(([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3})|(([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4})|(([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5})|([0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}))|(:((:[0-9a-fA-F]{1,4}){1,7}|:))|(::([fF]{4}(:0{1,4})?:)?((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|(([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})))$/\nconst isValidIpAddress = (value: string) => ipv4Regex.test(value) || ipv6Regex.test(value)\nconst dnsNameRegex = /^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)*[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/\n\nexport const AllocateFloatingIpModal = ({ open, onClose }: AllocateFloatingIpModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createFloatingIpMutation } = trpcReact.network.floatingIp.create.useMutation({\n onSettled: () => utils.network.floatingIp.list.invalidate(),\n })\n\n const {\n data: externalNetworks = [],\n isLoading: isExternalNetworksLoading,\n error: externalNetworksError,\n } = trpcReact.network.floatingIp.listExternalNetworks.useQuery({ project_id: projectId })\n\n const {\n data: dnsDomains = [],\n isLoading: isDnsDomainsLoading,\n error: dnsDomainsError,\n } = trpcReact.network.floatingIp.listDnsDomains.useQuery({ project_id: projectId })\n\n const {\n data: availablePorts = [],\n isLoading: isPortsLoading,\n error: portsError,\n } = trpcReact.network.floatingIp.listAvailablePorts.useQuery({ project_id: projectId })\n\n const formSchema = z.object({\n floating_network_id: z.string(),\n dns_domain: z.string(),\n dns_name: z\n .string()\n .trim()\n .max(63, t`DNS name must be at most 63 characters.`)\n .refine((value) => value === \"\" || dnsNameRegex.test(value), {\n message: t`Must be a valid PQDN or FQDN (alphanumeric and hyphens only, cannot start or end with hyphen).`,\n }),\n description: z\n .string()\n .trim()\n .max(255, t`Description must be at most 255 characters.`),\n floating_ip_address: z\n .string()\n .trim()\n .refine((value) => value === \"\" || isValidIpAddress(value), {\n message: t`Must be a valid IPv4 or IPv6 address (for example: 172.24.4.228 or 2001:db8::1).`,\n }),\n port_id: z.string(),\n fixed_ip_address: z.string(),\n })\n\n const form = useForm({\n defaultValues: {\n floating_network_id: \"\",\n dns_domain: \"\",\n dns_name: \"\",\n description: \"\",\n floating_ip_address: \"\",\n port_id: \"\",\n fixed_ip_address: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n await createFloatingIpMutation.mutateAsync({\n project_id: projectId,\n tenant_id: projectId,\n floating_network_id: value.floating_network_id,\n ...(value.dns_domain && { dns_domain: value.dns_domain }),\n ...(value.dns_name && { dns_name: value.dns_name }),\n ...(value.description && { description: value.description }),\n ...(value.floating_ip_address && { floating_ip_address: value.floating_ip_address }),\n ...(value.port_id && { port_id: value.port_id }),\n ...(value.fixed_ip_address && { fixed_ip_address: value.fixed_ip_address }),\n })\n handleClose()\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createFloatingIpMutation.reset()\n onClose()\n }\n\n const currentPortId = useStore(form.store, (state) => state.values.port_id)\n const currentFloatingNetworkId = useStore(form.store, (state) => state.values.floating_network_id)\n const selectedPort = availablePorts.find((port) => port.id === currentPortId)\n const portFixedIps = selectedPort?.fixed_ips ?? []\n\n const formErrorMessage =\n (externalNetworksError?.message || dnsDomainsError?.message || portsError?.message) ??\n createFloatingIpMutation.error?.message ??\n null\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Allocate Floating IP`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Allocate`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !currentFloatingNetworkId}\n >\n {formErrorMessage && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {formErrorMessage}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Allocating Floating IP...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"allocate-floating-ip-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"floating_network_id\"\n children={(field) => (\n <Select\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(value) => field.handleChange(typeof value === \"string\" ? value : \"\")}\n label={t`External Network`}\n helptext={t`The ID of the network associated with the floating IP.`}\n placeholder={t`Select an external network`}\n disabled={isPending || isExternalNetworksLoading}\n required\n loading={isExternalNetworksLoading}\n >\n {externalNetworks.map(({ id, name }) => (\n <SelectOption key={id} value={id} label={name ? `${name} (${id})` : id} />\n ))}\n </Select>\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"dns_domain\"\n children={(field) => (\n <Select\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(value) => field.handleChange(typeof value === \"string\" ? value : \"\")}\n label={t`DNS Domain`}\n helptext={t`Select a DNS domain.`}\n disabled={isPending || isDnsDomainsLoading}\n loading={isDnsDomainsLoading}\n >\n {dnsDomains.map(({ id, name }) => (\n <SelectOption key={id} value={name} label={name} />\n ))}\n </Select>\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"dns_name\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n label={t`DNS Name`}\n placeholder={t`Enter DNS name`}\n helptext={t`Enter a valid PQDN or FQDN (max 63 characters) to associate with the floating IP. A and PTR records are created automatically.`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"description\"\n children={(field) => (\n <Textarea\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Description`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"floating_ip_address\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n label={t`Floating IP Address`}\n placeholder={t`Enter a floating IP`}\n helptext={t`Enter a floating IP or leave blank to auto-assign one`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"port_id\"\n children={(field) => (\n <Select\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(value) => {\n const portId = typeof value === \"string\" ? value : \"\"\n field.handleChange(portId)\n const port = availablePorts.find((p) => p.id === portId)\n const ips = port?.fixed_ips ?? []\n form.setFieldValue(\"fixed_ip_address\", ips.length === 1 ? ips[0].ip_address : \"\")\n }}\n label={t`Port ID`}\n placeholder={t`Select port to associate`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending || isPortsLoading}\n loading={isPortsLoading}\n >\n {availablePorts.map((port) => (\n <SelectOption\n key={port.id}\n value={port.id}\n label={port.name ? `${port.name} (${port.id})` : port.id}\n />\n ))}\n </Select>\n )}\n />\n </FormSection>\n <FormSection>\n <form.Field\n name=\"fixed_ip_address\"\n children={(field) => (\n <Select\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(value) => field.handleChange(typeof value === \"string\" ? value : \"\")}\n label={t`Fixed IP Address`}\n placeholder={t`Select a fixed IP address`}\n helptext={t`Associates on the selected port. If the port has multiple IPs, select the desired fixed IP address.`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending || portFixedIps.length === 0}\n >\n {portFixedIps.map(({ ip_address }) => (\n <SelectOption key={ip_address} value={ip_address} label={ip_address} />\n ))}\n </Select>\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { useLingui } from \"@lingui/react/macro\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { FloatingIpQueryParameters } from \"@/server/Network/types/floatingIp\"\nimport { ListToolbar } from \"@/client/components/ListToolbar\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { buildFilterParams } from \"@/client/utils/buildFilterParams\"\nimport { useListWithFiltering } from \"@/client/utils/useListWithFiltering\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { FloatingIpListContainer } from \"./-table/FloatingIpListContainer\"\nimport { AllocateFloatingIpModal } from \"./-modals/AllocateFloatingIpModal\"\n\nconst DEFAULT_SORT_KEY = \"fixed_ip_address\"\nconst DEFAULT_SORT_DIR = \"asc\"\nexport type FloatingIpsSortKey = NonNullable<FloatingIpQueryParameters[\"sort_key\"]>\n\nexport const FloatingIpsList = () => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [allocateModalOpen, toggleAllocateModal] = useModal(false)\n\n const { searchTerm, handleSearchChange, sortSettings, handleSortChange, filterSettings, handleFilterChange } =\n useListWithFiltering<FloatingIpsSortKey>({\n defaultSortKey: DEFAULT_SORT_KEY,\n defaultSortDir: DEFAULT_SORT_DIR,\n sortOptions: [\n { label: t`Fixed IP Address`, value: \"fixed_ip_address\" },\n { label: t`Floating IP Address`, value: \"floating_ip_address\" },\n { label: t`Floating Network ID`, value: \"floating_network_id\" },\n { label: t`ID`, value: \"id\" },\n { label: t`Router ID`, value: \"router_id\" },\n { label: t`Status`, value: \"status\" },\n // Tenant_id was kept for backward compatibility in case the deprecated tenant ID was used to sort instead of the project ID.\n { label: t`Tenant ID`, value: \"tenant_id\" },\n { label: t`Project ID`, value: \"project_id\" },\n ],\n filterSettings: {\n filters: [\n {\n displayName: t`Status`,\n filterName: \"status\",\n values: [\"ACTIVE\", \"DOWN\", \"ERROR\"],\n supportsMultiValue: false,\n },\n ],\n },\n })\n\n const {\n data: floatingIps = [],\n isLoading,\n isError,\n error,\n } = trpcReact.network.floatingIp.list.useQuery({\n project_id: projectId,\n sort_key: sortSettings.sortBy,\n sort_dir: sortSettings.sortDirection,\n ...buildFilterParams(filterSettings),\n ...(searchTerm ? { searchTerm } : {}),\n })\n\n return (\n <div className=\"relative\">\n <ListToolbar\n searchTerm={searchTerm}\n onSearch={handleSearchChange}\n sortSettings={sortSettings}\n onSort={handleSortChange}\n filterSettings={filterSettings}\n onFilter={handleFilterChange}\n actions={<Button variant=\"primary\" label={t`Allocate Floating IP`} onClick={toggleAllocateModal} />}\n />\n\n <FloatingIpListContainer floatingIps={floatingIps} isLoading={isLoading} isError={isError} error={error} />\n\n {allocateModalOpen && <AllocateFloatingIpModal open={allocateModalOpen} onClose={toggleAllocateModal} />}\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { FloatingIpsList } from \"./-components/FloatingIpsList\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/floatingips/\")({\n staticData: {\n section: \"network\",\n service: \"floatingips\",\n sectionCrumb: { labelKey: \"Network\" },\n crumb: { labelKey: \"Floating IPs\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Floating IPs` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n return (\n <>\n <ContentHeading>{t`Floating IPs`}</ContentHeading>\n <FloatingIpsList />\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;AASA,IAAaG,IAAmE;CAC9EC,QAAQ;EACNC,MAAM;EACNC,MAAM,gBAACJ,GAAAA;GAAcK,MAAM;GAAIC,OAAM;GAAQC,MAAK;;CACpD;CACAC,MAAM;EACJL,MAAM;EACNC,MAAM,gBAACL,GAAAA;GAAeM,MAAM;GAAIC,OAAM;GAAQC,MAAK;;CACrD;CACAE,OAAO;EACLN,MAAM;EACNC,MAAM,gBAACN,GAAAA;GAAQO,MAAM;GAAIC,OAAM;GAAQC,MAAK;;CAC9C;AACF,GAEaG,UACX;CACEC,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;CACRA,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;CACrBA,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;CAClBA,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;CACRA,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA;CACb;GCbSU,KAAsB,EAAEC,oBAAqC;CACxE,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAWZ,EAAAA,GACXa,IAAYL,EAAAA,GAEZM,UAAwB;EAC5BF,EAAS;GACPG,IAAI;GACJC,QAAQ;IAAEH;IAAWI,cAAcP,EAAWQ;GAAG;EACnD,CAAA;CACF;CAEA,OACE,gBAAChB,GAAAA;EAAgCiB,eAAa,mBAAmBT,EAAWQ;EAAME,SAASN;;GACzF,gBAACb,GAAAA,EAAAA,UACC,gBAACoB,OAAAA;IAAIC,WAAU;eACZhB,EAAcI,EAAWa,QAAQC,MACjClB,EAAcI,EAAWa,QAAQE,IAAAA;;GAGtC,gBAACxB,GAAAA,EAAAA,UAAcS,EAAWgB,oBAAAA,CAAAA;GAC1B,gBAACzB,GAAAA,EAAAA,UAAcS,EAAWiB,oBAAoB,IAAA,CAAA;GAC9C,gBAAC1B,GAAAA,EAAAA,UAAcS,EAAWkB,oBAAAA,CAAAA;GAC1B,gBAAC3B,GAAAA,EAAAA,UAAcS,EAAWmB,eAAe,IAAA,CAAA;GACzC,gBAAC5B,GAAAA;IAAamB,UAAUU,MAAMA,EAAEC,gBAAe;IAAIT,WAAU;cAC3D,gBAACf,GAAAA;KAAmCG;gBAChC,EAAEsB,oBAAiBC,sBAAmBC,sBAAmBC,4BACzD,gBAAChC,GAAAA,EAAAA,UACC,gBAACE,GAAAA,EAAAA,UAAAA;MACC,gBAACD,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAQ,CAAA;OAAGjB,SAASN;;MAC3C,gBAACV,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;OAAGjB,SAASY;;MACpD,gBAAC5B,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;OAAGjB,SAASa;;MAC1C,gBAAC7B,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;OAAGjB,SAASc;;MAC1C,gBAAC9B,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAQ,CAAA;OAAGjB,SAASe;;;;;;IApBrCzB,EAAWQ,EAAE;AA4BnC,GCtCa6B,KAA2B,EAAEC,gBAAaC,cAAWC,YAASC,eAAqC;CAC9G,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAUP,EAAAA;CAuChB,OArCIG,IAEA,gBAACN,GAAAA;EAAMW,WAAU;EAAOC,cAAa;EAASC,WAAU;EAASC,WAAU;aACzE,gBAACb,GAAAA;GAAQc,SAAQ;GAAUC,MAAK;GAAQL,WAAU;MAClD,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,CAAA;MAKFJ,IAEA,gBAACP,GAAAA;EAAMW,WAAU;EAAOC,cAAa;EAASC,WAAU;EAASC,WAAU;YACxEN,GAAOS,WAAWC,EAAAA,EAAC,EAAA,IAAA,SAA4B,CAAA;MAKlDb,EAAYc,WAAW,IAEvB,gBAACxB,GAAAA;EAASe,SAASA,EAAQS;EAAQR,WAAU;EAAeS,eAAY;YACtE,gBAACvB,GAAAA,EAAAA,UACC,gBAACC,GAAAA;GAAauB,SAASX,EAAQS;cAC7B,gBAACpB,GAAAA,EAAAA,UACC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,GAEF,gBAACuB,KAAAA,EAAAA,UACC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,CAAA;;MAYV,gBAAC3B,GAAAA;EAASe,SAASA,EAAQS;aACzB,gBAACtB,GAAAA,EAAAA,UACEa,EAAQa,KAAKC,MACZ,gBAAC5B,GAAAA,EAAAA,UAA8B4B,EAAAA,GAARA,CAAAA,CAAAA,EAAAA,CAAAA,GAG1BnB,EAAYkB,KAAKE,MAChB,gBAACvB,GAAAA,EAA+BwB,YAAYD,EAAAA,GAAnBA,EAAGE,EAAE,CAAA,CAAA;;AAItC,GCpDMe,IAAY,+EACZC,IACJ,4lBACIC,KAAoBC,MAAkBH,EAAUI,KAAKD,CAAAA,KAAUF,EAAUG,KAAKD,CAAAA,GAC9EE,IAAe,iGAERC,KAA2B,EAAEC,SAAMC,iBAAuC;CACrF,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAYX,EAAAA,GACZY,IAAQb,EAAUc,SAAQ,GAE1B,EAAEC,cAAW,GAAGC,MAA6BhB,EAAUiB,QAAQC,WAAWC,OAAOC,YAAY,EACjGC,iBAAiBR,EAAMI,QAAQC,WAAWI,KAAKC,WAAU,EAC3D,CAAA,GAEM,EACJC,MAAMC,IAAmB,CAAA,GACzBC,WAAWC,GACXC,OAAOC,MACL7B,EAAUiB,QAAQC,WAAWY,qBAAqBC,SAAS,EAAEC,YAAYpB,EAAU,CAAA,GAEjF,EACJY,MAAMS,IAAa,CAAA,GACnBP,WAAWQ,GACXN,OAAOO,MACLnC,EAAUiB,QAAQC,WAAWkB,eAAeL,SAAS,EAAEC,YAAYpB,EAAU,CAAA,GAE3E,EACJY,MAAMa,IAAiB,CAAA,GACvBX,WAAWY,GACXV,OAAOW,MACLvC,EAAUiB,QAAQC,WAAWsB,mBAAmBT,SAAS,EAAEC,YAAYpB,EAAU,CAAA,GA0B/E4C,IAAOnE,EAAQ;EACnBoE,eAAe;GACbd,qBAAqB;GACrBE,YAAY;GACZC,UAAU;GACVM,aAAa;GACbC,qBAAqB;GACrBC,SAAS;GACTC,kBAAkB;EACpB;EACAG,YAAY,EACVC,UAnCevE,EAAEsD,OAAO;GAC1BC,qBAAqBvD,EAAEwD,OAAM;GAC7BC,YAAYzD,EAAEwD,OAAM;GACpBE,UAAU1D,EACPwD,OAAM,EACNG,KAAI,EACJC,IAAI,IAAIC,EAAAA,EAAC,EAAA,IAAA,SAAwC,CAAA,CAAA,EACjDC,QAAQ7C,MAAUA,MAAU,MAAME,EAAaD,KAAKD,CAAAA,GAAQ,EAC3D8C,SAASF,EAAAA,EAAC,EAAA,IAAA,SAA+F,CAAA,EAC3G,CAAA;GACFG,aAAahE,EACVwD,OAAM,EACNG,KAAI,EACJC,IAAI,KAAKC,EAAAA,EAAC,EAAA,IAAA,SAA4C,CAAA,CAAA;GACzDI,qBAAqBjE,EAClBwD,OAAM,EACNG,KAAI,EACJG,QAAQ7C,MAAUA,MAAU,MAAMD,EAAiBC,CAAAA,GAAQ,EAC1D8C,SAASF,EAAAA,EAAC,EAAA,IAAA,SAAiF,CAAA,EAC7F,CAAA;GACFK,SAASlE,EAAEwD,OAAM;GACjBW,kBAAkBnE,EAAEwD,OAAM;EAC5B,CAacH,EACZ;EACAkB,UAAU,OAAO,EAAEtD,eAAO;GACpBU,MAEJ,MAAMC,EAAyB4C,YAAY;IACzC5B,YAAYpB;IACZiD,WAAWjD;IACX+B,qBAAqBtC,EAAMsC;IAC3B,GAAItC,EAAMwC,cAAc,EAAEA,YAAYxC,EAAMwC,WAAW;IACvD,GAAIxC,EAAMyC,YAAY,EAAEA,UAAUzC,EAAMyC,SAAS;IACjD,GAAIzC,EAAM+C,eAAe,EAAEA,aAAa/C,EAAM+C,YAAY;IAC1D,GAAI/C,EAAMgD,uBAAuB,EAAEA,qBAAqBhD,EAAMgD,oBAAoB;IAClF,GAAIhD,EAAMiD,WAAW,EAAEA,SAASjD,EAAMiD,QAAQ;IAC9C,GAAIjD,EAAMkD,oBAAoB,EAAEA,kBAAkBlD,EAAMkD,iBAAiB;GAC3E,CAAA,GACAO,EAAAA;EACF;CACF,CAAA,GAEMA,UAAc;EACd/C,MAEJyC,EAAKO,MAAK,GACV/C,EAAyB+C,MAAK,GAC9BrD,EAAAA;CACF,GAEMsD,IAAgB1E,EAASkE,EAAKS,QAAQC,MAAUA,EAAMC,OAAOb,OAAO,GACpEc,IAA2B9E,EAASkE,EAAKS,QAAQC,MAAUA,EAAMC,OAAOxB,mBAAmB,GAE3F8B,IADepC,EAAeiC,MAAMC,MAASA,EAAKC,OAAOR,CAC1CK,GAAcK,aAAa,CAAA,GAE1CC,KACH9C,GAAuBsB,WAAWhB,GAAiBgB,WAAWZ,GAAYY,YAC3EnC,EAAyBY,OAAOuB,WAChC;CAEF,OACE,gBAAC5D,GAAAA;EACOkB;EACNmE,MAAK;EACLC,OAAO5B,EAAAA,EAAC,EAAA,IAAA,SAAqB,CAAA;EAC7B6B,UAAUhB;EACViB,mBAAmB9B,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;EAC3B+B,oBAAoB/B,EAAAA,EAAC,EAAA,IAAA,SAAS,CAAA;EAC9BgC,WAAWzB,EAAK0B;EAChBC,sBAAsBpE,KAAa,CAACqD;;GAEnCO,KACC,gBAAChF,GAAAA;IAAQyF,aAAa;IAAOC,SAAQ;IAAQC,WAAU;cACpDX;;GAIJ5D,KACC,gBAACwE,OAAAA;IAAID,WAAU;eACb,gBAAC5F,GAAAA,EAAQ2F,SAAQ,UAAA,CAAA,GACjB,gBAACG,QAAAA;KAAKF,WAAU;eACd,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;GAKL,CAACvE,KACA,gBAACvB,GAAAA;IACC8F,WAAU;IACVd,IAAG;IACHb,WAAW8B,MAAAA;KAETjC,AADAiC,EAAEC,eAAc,GAChBlC,EAAK0B,aAAY;IACnB;;KAEA,gBAACzF,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAAChG,GAAAA;QACC0E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnB0F,WAAW1F,MAAUyF,EAAME,aAAa,OAAO3F,KAAU,WAAWA,IAAQ,EAAA;QAC5E4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;QACzBiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAAuD,CAAA;QAClEkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAA2B,CAAA;QACzCmD,UAAUrF,KAAaY;QACvB0E,UAAQ;QACRC,SAAS3E;kBAERF,EAAiB8E,KAAK,EAAE/B,OAAIoB,cAC3B,gBAAC7F,GAAAA;SAAsBM,OAAOmE;SAAIyB,OAAOL,IAAO,GAAGA,EAAK,IAAIpB,EAAG,KAAKA;WAAjDA,CAAAA,CAAAA;;;;KAM7B,gBAAC/E,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAAChG,GAAAA;QACC0E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnB0F,WAAW1F,MAAUyF,EAAME,aAAa,OAAO3F,KAAU,WAAWA,IAAQ,EAAA;QAC5E4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAW,CAAA;QACnBiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAAqB,CAAA;QAChCmD,UAAUrF,KAAamB;QACvBoE,SAASpE;kBAERD,EAAWsE,KAAK,EAAE/B,OAAIoB,cACrB,gBAAC7F,GAAAA;SAAsBM,OAAOuF;SAAMK,OAAOL;WAAxBpB,CAAAA,CAAAA;;;;KAM7B,gBAAC/E,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAACjG,GAAAA;QACC2E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnBmG,QAAQV,EAAMW;QACdV,WAAWN,MAAMK,EAAME,aAAaP,EAAEiB,OAAOrG,KAAK;QAClD4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAS,CAAA;QACjBkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAAe,CAAA;QAC7BiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAA+H,CAAA;QAC1I0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;QAC/DV,UAAUrF;;;;KAKlB,gBAACtB,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAAClG,GAAAA;QACC4E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnBmG,QAAQV,EAAMW;QACdV,WAAWN,MAAMK,EAAME,aAAaP,EAAEiB,OAAOrG,KAAK;QAClD8F,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA;QAC1B0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;QAC/DV,UAAUrF;;;;KAKlB,gBAACtB,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAACjG,GAAAA;QACC2E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnBmG,QAAQV,EAAMW;QACdV,WAAWN,MAAMK,EAAME,aAAaP,EAAEiB,OAAOrG,KAAK;QAClD4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;QAC5BkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;QAClCiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAAsD,CAAA;QACjE0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;QAC/DV,UAAUrF;;;;KAKlB,gBAACtB,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAAChG,GAAAA;QACC0E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnB0F,WAAW1F,MAAAA;SACT,IAAM0G,IAAS,OAAO1G,KAAU,WAAWA,IAAQ;SACnDyF,EAAME,aAAae,CAAAA;SAEnB,IAAME,IADO5E,EAAeiC,MAAM0C,MAAMA,EAAExC,OAAOuC,CACrCxC,GAAMG,aAAa,CAAA;SAC/BlB,EAAK0D,cAAc,oBAAoBD,EAAIE,WAAW,IAAIF,EAAI,GAAGG,aAAa,EAAA;QAChF;QACAnB,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAQ,CAAA;QAChBkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAAyB,CAAA;QACvC0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;QAC/DV,UAAUrF,KAAauB;QACvBgE,SAAShE;kBAERD,EAAekE,KAAKhC,MACnB,gBAACxE,GAAAA;SAECM,OAAOkE,EAAKC;SACZyB,OAAO1B,EAAKqB,OAAO,GAAGrB,EAAKqB,KAAK,IAAIrB,EAAKC,GAAG,KAAKD,EAAKC;WAFjDD,EAAKC,EAAE,CAAA;;;;KASxB,gBAAC/E,GAAAA,EAAAA,UACC,gBAAC+D,EAAKmC,OAAK;MACTC,MAAK;MACLC,WAAWC,MACT,gBAAChG,GAAAA;OACC0E,IAAIsB,EAAMF;OACVA,MAAME,EAAMF;OACZvF,OAAOyF,EAAM5B,MAAM7D;OACnBmG,QAAQV,EAAMW;OACdV,WAAW1F,MAAUyF,EAAME,aAAa,OAAO3F,KAAU,WAAWA,IAAQ,EAAA;OAC5E4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;OACzBkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAA0B,CAAA;OACxCiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAAoG,CAAA;OAC/G0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;OAC/DV,UAAUrF,KAAa0D,EAAa0C,WAAW;iBAE9C1C,EAAa8B,KAAK,EAAEa,oBACnB,gBAACrH,GAAAA;QAA8BM,OAAO+G;QAAYnB,OAAOmB;UAAtCA,CAAAA,CAAAA;;;;;;;AAUvC,GCrTMU,IAAmB,oBACnBC,IAAmB,OAGZC,UAAkB;CAC7B,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAYP,EAAAA,GACZ,CAACQ,GAAmBC,KAAuBV,EAAS,EAAA,GAEpD,EAAEW,eAAYC,uBAAoBC,iBAAcC,qBAAkBC,mBAAgBC,0BACtFjB,EAAyC;EACvCkB,gBAAgBb;EAChBc,gBAAgBb;EAChBc,aAAa;GACX;IAAEC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;IAAGC,OAAO;GAAmB;GACxD;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;IAAGC,OAAO;GAAsB;GAC9D;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;IAAGC,OAAO;GAAsB;GAC9D;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAG,CAAA;IAAGC,OAAO;GAAK;GAC5B;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;IAAGC,OAAO;GAAY;GAC1C;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;IAAGC,OAAO;GAAS;GAEpC;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;IAAGC,OAAO;GAAY;GAC1C;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAW,CAAA;IAAGC,OAAO;GAAa;;EAE9CP,gBAAgB,EACdQ,SAAS,CACP;GACEC,aAAaH,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;GACrBI,YAAY;GACZC,QAAQ;IAAC;IAAU;IAAQ;;GAC3BC,oBAAoB;EACtB,CAAA,EAEJ;CACF,CAAA,GAEI,EACJC,MAAMC,IAAc,CAAA,GACpBC,cACAC,YACAC,aACEnC,EAAUoC,QAAQC,WAAWC,KAAKC,SAAS;EAC7CC,YAAY7B;EACZ8B,UAAUzB,EAAa0B;EACvBC,UAAU3B,EAAa4B;EACvB,GAAG3C,EAAkBiB,CAAAA;EACrB,GAAIJ,IAAa,EAAEA,cAAW,IAAI,CAAC;CACrC,CAAA;CAEA,OACE,gBAAC+B,OAAAA;EAAIC,WAAU;;GACb,gBAAC/C,GAAAA;IACae;IACZiC,UAAUhC;IACIC;IACdgC,QAAQ/B;IACQC;IAChB+B,UAAU9B;IACV+B,SAAS,gBAACpD,GAAAA;KAAOqD,SAAQ;KAAU5B,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAqB,CAAA;KAAG4B,SAASvC;;;GAG9E,gBAACR,GAAAA;IAAqC2B;IAAwBC;IAAoBC;IAAgBC;;GAEjGvB,KAAqB,gBAACN,GAAAA;IAAwB+C,MAAMzC;IAAmB0C,SAASzC;;;;AAGvF;;;AC5DA,SAAS6C,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQH,EAAAA;CACd,OACE,gBAAA,GAAA,EAAA,UAAA,CACE,gBAAC,GAAA,EAAA,UAAgBI,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,GAClB,gBAAC,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA;AAGP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"images-Dbjo4yKn.mjs","names":["RouteError","SplitErrorComponent","error","errorComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/images.tsx?tsr-split=errorComponent"],"sourcesContent":["import { createFileRoute, Outlet, redirect } from \"@tanstack/react-router\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nconst multiValueEnum = (allowedValues: string[]) => {\n return z.string().refine((val) => {\n const values = val.startsWith(\"in:\") ? val.replace(\"in:\", \"\").split(\",\") : [val]\n return values.every((v) => allowedValues.includes(v))\n })\n}\n\nconst imagesSearchFields = {\n status: multiValueEnum([\n \"queued\",\n \"saving\",\n \"active\",\n \"deactivated\",\n \"killed\",\n \"deleted\",\n \"pending_delete\",\n ]).optional(),\n visibility: z.enum([\"public\", \"private\", \"shared\", \"community\", \"all\"]).optional(),\n disk_format: multiValueEnum([\n \"ami\",\n \"ari\",\n \"aki\",\n \"vhd\",\n \"vhdx\",\n \"vmdk\",\n \"raw\",\n \"qcow2\",\n \"vdi\",\n \"iso\",\n \"ploop\",\n ]).optional(),\n container_format: multiValueEnum([\"ami\", \"ari\", \"aki\", \"bare\", \"ovf\", \"ova\", \"docker\"]).optional(),\n protected: z.enum([\"true\", \"false\"]).optional(),\n search: z.string().optional(),\n sortBy: z.enum([\"created_at\", \"updated_at\", \"name\", \"size\", \"status\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n memberStatus: z.enum([\"all\", \"accepted\", \"pending\"]).optional(),\n page: z.number().int().positive().optional(),\n}\n\nconst imagesSearchSchema = z.object(imagesSearchFields).passthrough()\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/images\")({\n staticData: {\n section: \"compute\",\n service: \"images\",\n sectionCrumb: { labelKey: \"Compute\" },\n crumb: { labelKey: \"Images\" },\n } satisfies RouteInfo,\n errorComponent: ({ error }) => <RouteError error={error} />,\n validateSearch: (search) => {\n const result = imagesSearchSchema.safeParse(search)\n if (result.success) return result.data\n return {\n ...search,\n status: imagesSearchFields.status.safeParse(search.status).success ? search.status : undefined,\n visibility: imagesSearchFields.visibility.safeParse(search.visibility).success ? search.visibility : undefined,\n disk_format: imagesSearchFields.disk_format.safeParse(search.disk_format).success\n ? search.disk_format\n : undefined,\n container_format: imagesSearchFields.container_format.safeParse(search.container_format).success\n ? search.container_format\n : undefined,\n protected: imagesSearchFields.protected.safeParse(search.protected).success ? search.protected : undefined,\n search: imagesSearchFields.search.safeParse(search.search).success ? search.search : undefined,\n sortBy: imagesSearchFields.sortBy.safeParse(search.sortBy).success ? search.sortBy : undefined,\n sortDirection: imagesSearchFields.sortDirection.safeParse(search.sortDirection).success\n ? search.sortDirection\n : undefined,\n memberStatus: imagesSearchFields.memberStatus.safeParse(search.memberStatus).success\n ? search.memberStatus\n : undefined,\n page: imagesSearchFields.page.safeParse(search.page).success ? (search.page as number) : undefined,\n }\n },\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const { projectId } = params\n\n if (!trpcClient) {\n throw new Error(\"trpcClient is not available in route context\")\n }\n\n const availableServices = await trpcClient.auth.getAvailableServices.query()\n const serviceIndex = getServiceIndex(availableServices)\n\n if (!serviceIndex[\"image\"]?.[\"glance\"]) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n },\n component: () => <Outlet />,\n})\n"],"mappings":";;;AAIiE,IAAAC,KAmD9C,EAAEC,eAAY,gBAAC,GAAA,EAAkBA,SAAAA,CAAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"objects-DKWp9RtR.mjs","names":["createFileRoute","redirect","getServiceIndex","z","checkServiceAvailability","availableServices","type","name","params","projectId","provider","storageType","containerName","serviceIndex","to","hasSwift","Boolean","hasCeph","cephFallbackEnabled","hasEffectiveCeph","fallbackProvider","fallbackStorageType","expectedStorageType","objectsSearchSchema","object","prefix","string","optional","sortBy","enum","sortDirection","search","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","useParamAsLabel","RouteInfo","validateSearch","head","match","meta","title","component","lazyRouteComponent","$$splitComponentImporter","notFoundComponent","$$splitNotFoundComponentImporter","loader","context","trpcClient","auth","getAvailableServices","query","client","beforeLoad"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useParams } from \"@tanstack/react-router\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { SwiftObjects } from \"../../../../-components/Swift/Objects\"\nimport { CephObjects } from \"../../../../-components/Ceph/Objects\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nexport const checkServiceAvailability = (\n availableServices: {\n type: string\n name: string\n }[],\n params: {\n projectId: string\n provider: string\n storageType: string\n containerName: string\n }\n) => {\n const { provider, projectId, storageType, containerName } = params\n\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect to the \"Projects Overview\" page if no storage services available\n if (!serviceIndex[\"object-store\"]) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n // Check provider availability\n const hasSwift = Boolean(serviceIndex[\"object-store\"][\"swift\"])\n const hasCeph = Boolean(serviceIndex[\"object-store\"][\"ceph\"])\n\n // TEMPORARY: Allow Ceph access even if not in catalog (relies on env config)\n // TODO: Properly register Ceph in OpenStack service catalog\n const cephFallbackEnabled = true // Set to false once Ceph is in catalog\n\n // Effective availability includes fallback flag for Ceph\n const hasEffectiveCeph = hasCeph || cephFallbackEnabled\n const fallbackProvider = hasSwift ? \"swift\" : hasEffectiveCeph ? \"ceph\" : null\n const fallbackStorageType = hasSwift ? \"containers\" : hasEffectiveCeph ? \"buckets\" : null\n\n if (provider !== \"swift\" && provider !== \"ceph\") {\n if (!fallbackProvider || !fallbackStorageType) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider: fallbackProvider, storageType: fallbackStorageType, containerName },\n })\n }\n\n if (provider === \"swift\" && !hasSwift) {\n if (!hasEffectiveCeph) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider: \"ceph\", storageType: \"buckets\", containerName },\n })\n }\n\n if (provider === \"ceph\" && !hasEffectiveCeph) {\n if (!hasSwift) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider: \"swift\", storageType: \"containers\", containerName },\n })\n }\n\n // Canonicalize the URL terminology for the resolved provider. Availability is\n // already settled above, so by this point provider is a valid, available\n // swift|ceph. The storageType segment is user-controllable and the router never\n // validates it, so a mismatched noun (e.g. ceph + \"containers\", swift + \"buckets\")\n // must redirect to the canonical path to keep URLs normalized.\n if (provider === \"swift\" || provider === \"ceph\") {\n const expectedStorageType = provider === \"swift\" ? \"containers\" : \"buckets\"\n if (storageType !== expectedStorageType) {\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider, storageType: expectedStorageType, containerName },\n })\n }\n }\n}\n\n// Search params schema\n// - prefix: base64-encoded current folder path, safe to carry \"/\" chars in the URL\n// - sortBy: active sort column key — persisted so deep links and back navigation restore sort state\n// Accepts both Swift keys (last_modified, bytes) and Ceph keys (lastModified, size) for compatibility\n// - sortDirection: \"asc\" | \"desc\" — persisted alongside sortBy\nconst objectsSearchSchema = z.object({\n prefix: z.string().optional(),\n sortBy: z.enum([\"name\", \"last_modified\", \"bytes\", \"lastModified\", \"size\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\n \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\"\n)({\n staticData: {\n section: \"storage\",\n service: \"containers\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Storage\" },\n crumb: { useParamAsLabel: \"provider\", to: \"/projects/$projectId/storage/$provider/$storageType\" },\n } satisfies RouteInfo,\n validateSearch: objectsSearchSchema,\n head: ({ match }) => ({\n meta: [{ title: match.params.containerName }],\n }),\n component: () => {\n return <ObjectsDashboard />\n },\n notFoundComponent: () => {\n return (\n <p>\n <Trans>Storage container not found</Trans>\n </p>\n )\n },\n loader: async ({ context }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n\n return {\n client: trpcClient,\n availableServices,\n }\n },\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n checkServiceAvailability(availableServices!, params)\n },\n})\n\nfunction ObjectsDashboard() {\n const { project, provider, containerName } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\",\n select: (params) => ({\n project: params.projectId,\n provider: params.provider,\n containerName: params.containerName,\n storageType: params.storageType,\n }),\n })\n\n const { prefix, sortBy, sortDirection, search } = Route.useSearch()\n\n return (\n <div>\n {project ? (\n <ErrorBoundary\n resetKeys={[project, provider, containerName, prefix, sortBy, sortDirection, search]}\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Error loading component</Trans>\n </div>\n }\n >\n {(() => {\n switch (provider) {\n case \"swift\":\n return <SwiftObjects provider={provider} containerName={containerName} />\n case \"ceph\":\n return <CephObjects bucketName={containerName} />\n default:\n return (\n <div className=\"p-4\">\n <Trans>Objects — {containerName}</Trans>\n </div>\n )\n }\n })()}\n </ErrorBoundary>\n ) : (\n <div className=\"p-4 text-center\">\n <Trans>No project selected</Trans>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":";;;;4FASaI,KACXC,GAIAG,MAAAA;CAOA,IAAM,EAAEE,aAAUD,cAAWE,gBAAaC,qBAAkBJ,GAEtDK,IAAeX,EAAgBG,CAAAA;CAGrC,IAAI,CAACQ,EAAa,iBAChB,MAAMZ,EAAS;EACba,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,CAAA;CAIF,IAAMM,IAAWC,EAAQH,EAAa,gBAAgB,OAQhDM,IAPUH,EAAQH,EAAa,gBAAgB,QAOjBK,IAC9BE,IAAmBL,IAAW,UAAUI,IAAmB,SAAS,MACpEE,IAAsBN,IAAW,eAAeI,IAAmB,YAAY;CAErF,IAAIT,MAAa,WAAWA,MAAa,QAOvC,MALQT,EADJ,CAACmB,KAAoB,CAACC,IACT;EACbP,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,IAEa;EACbK,IAAI;EACJN,QAAQ;GAAEC;GAAWC,UAAUU;GAAkBT,aAAaU;GAAqBT;EAAc;CACnG,CALE;CAQJ,IAAIF,MAAa,WAAW,CAACK,GAQ3B,MAAMd,EAPDkB,IAOU;EACbL,IAAI;EACJN,QAAQ;GAAEC;GAAWC,UAAU;GAAQC,aAAa;GAAWC;EAAc;CAC/E,IATiB;EACbE,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,CAAA;CASJ,IAAIC,MAAa,UAAU,CAACS,GAQ1B,MAAMlB,EAPDc,IAOU;EACbD,IAAI;EACJN,QAAQ;GAAEC;GAAWC,UAAU;GAASC,aAAa;GAAcC;EAAc;CACnF,IATiB;EACbE,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,CAAA;CAcJ,IAAIC,MAAa,WAAWA,MAAa,QAAQ;EAC/C,IAAMY,IAAsBZ,MAAa,UAAU,eAAe;EAClE,IAAIC,MAAgBW,GAClB,MAAMrB,EAAS;GACba,IAAI;GACJN,QAAQ;IAAEC;IAAWC;IAAUC,aAAaW;IAAqBV;GAAc;EACjF,CAAA;CAEJ;AACF,GAOMW,IAAsBpB,EAAEqB,OAAO;CACnCC,QAAQtB,EAAEuB,OAAM,EAAGC,SAAQ;CAC3BC,QAAQzB,EAAE0B,KAAK;EAAC;EAAQ;EAAiB;EAAS;EAAgB;EAAO,EAAEF,SAAQ;CACnFG,eAAe3B,EAAE0B,KAAK,CAAC,OAAO,MAAA,CAAO,EAAEF,SAAQ;CAC/CI,QAAQ5B,EAAEuB,OAAM,EAAGC,SAAQ;AAC7B,CAAA,GAEaK,IAAQhC,EACnB,mFAAA,EACA;CACAiC,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,UAAU;EACpCC,OAAO;GAAEC,iBAAiB;GAAY1B,IAAI;EAAsD;CAClG;CACA4B,gBAAgBnB;CAChBoB,OAAO,EAAEC,gBAAa,EACpBC,MAAM,CAAC,EAAEC,OAAOF,EAAMpC,OAAOI,cAAc,CAAA,EAC7C;CACAmC,WAASC,EAAAC,GAAA,WAAA;CAGTC,mBAAiBF,EAAAG,GAAA,mBAAA;CAOjBC,QAAQ,OAAO,EAAEC,iBAAS;EACxB,IAAM,EAAEC,kBAAeD;EAGvB,OAAO;GACLK,QAAQJ;GACRjD,mBAAAA,MAJ8BiD,GAAYC,KAAKC,qBAAqBC,MAAAA;EAKtE;CACF;CACAE,YAAY,OAAO,EAAEN,YAAS7C,gBAAQ;EACpC,IAAM,EAAE8C,kBAAeD;EAEvBjD,EAAyBC,MADOiD,GAAYC,KAAKC,qBAAqBC,MAAAA,GACzBjD,CAAAA;CAC/C;AACF,CAAA"}
|