@cobaltcore-dev/aurora 0.3.1 → 0.4.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.
Files changed (108) hide show
  1. package/dist/client/{EditSecurityGroupModal-Dl6m7wUe.mjs → EditSecurityGroupModal-DK3WYikA.mjs} +1 -1
  2. package/dist/client/{EditSecurityGroupModal-Dl6m7wUe.mjs.map → EditSecurityGroupModal-DK3WYikA.mjs.map} +1 -1
  3. package/dist/client/{FiltersInput-BgNaHFBt.mjs → FiltersInput-OVeIJzIo.mjs} +2 -2
  4. package/dist/client/FiltersInput-OVeIJzIo.mjs.map +1 -0
  5. package/dist/client/{FloatingIpActionModals-By2hXR9m.mjs → FloatingIpActionModals-Dok7fJss.mjs} +3 -3
  6. package/dist/client/{FloatingIpActionModals-By2hXR9m.mjs.map → FloatingIpActionModals-Dok7fJss.mjs.map} +1 -1
  7. package/dist/client/{ImageToastNotifications-fHI8jB2j.mjs → ImageToastNotifications-BG9LPnXf.mjs} +4 -4
  8. package/dist/client/{ImageToastNotifications-fHI8jB2j.mjs.map → ImageToastNotifications-BG9LPnXf.mjs.map} +1 -1
  9. package/dist/client/{ListToolbar-BvtCo8dk.mjs → ListToolbar-BojRTNbo.mjs} +2 -2
  10. package/dist/client/{ListToolbar-BvtCo8dk.mjs.map → ListToolbar-BojRTNbo.mjs.map} +1 -1
  11. package/dist/client/{_floatingIpId-CwHiXazi.mjs → _floatingIpId-D33bOEmH.mjs} +2 -2
  12. package/dist/client/{_floatingIpId-CwHiXazi.mjs.map → _floatingIpId-D33bOEmH.mjs.map} +1 -1
  13. package/dist/client/{_floatingIpId-BpUfL8Im2.mjs → _floatingIpId-DF_BSJN6.mjs} +5 -5
  14. package/dist/client/_floatingIpId-DF_BSJN6.mjs.map +1 -0
  15. package/dist/client/{_imageId-CdOOJjw0.mjs → _imageId-BL0I5_pv.mjs} +2 -2
  16. package/dist/client/{_imageId-CdOOJjw0.mjs.map → _imageId-BL0I5_pv.mjs.map} +1 -1
  17. package/dist/client/{_pcaId-D1ZEaCdp.mjs → _pcaId-BYCoeK6_.mjs} +2 -2
  18. package/dist/client/{_pcaId-D1ZEaCdp.mjs.map → _pcaId-BYCoeK6_.mjs.map} +1 -1
  19. package/dist/client/{_pcaId-CwlH1Kvl.mjs → _pcaId-CbBhBrX1.mjs} +153 -56
  20. package/dist/client/_pcaId-CbBhBrX1.mjs.map +1 -0
  21. package/dist/client/{_projectId-Dj_InfSc.mjs → _projectId-5NiasyXm.mjs} +2 -2
  22. package/dist/client/{_projectId-Dj_InfSc.mjs.map → _projectId-5NiasyXm.mjs.map} +1 -1
  23. package/dist/client/{_projectId-DhLpIalx.mjs → _projectId-BwLMEMGC.mjs} +1 -1
  24. package/dist/client/{_projectId-DhLpIalx.mjs.map → _projectId-BwLMEMGC.mjs.map} +1 -1
  25. package/dist/client/{_projectId-D1gGribM.mjs → _projectId-D35MN1kY.mjs} +3 -3
  26. package/dist/client/{_projectId-D1gGribM.mjs.map → _projectId-D35MN1kY.mjs.map} +1 -1
  27. package/dist/client/{_securityGroupId-B0llWH9A.mjs → _securityGroupId-B-Z-CzLp.mjs} +2 -2
  28. package/dist/client/{_securityGroupId-B0llWH9A.mjs.map → _securityGroupId-B-Z-CzLp.mjs.map} +1 -1
  29. package/dist/client/{_securityGroupId-gbUnd5Wv.mjs → _securityGroupId-B1bOYRbX.mjs} +7 -7
  30. package/dist/client/{_securityGroupId-gbUnd5Wv.mjs.map → _securityGroupId-B1bOYRbX.mjs.map} +1 -1
  31. package/dist/client/{about-DCe6LsKz.mjs → about-DLn1ShhF.mjs} +1 -1
  32. package/dist/client/{about-DCe6LsKz.mjs.map → about-DLn1ShhF.mjs.map} +1 -1
  33. package/dist/client/{buildFilterParams-By33pG59.mjs → buildFilterParams-TeyosGyK.mjs} +1 -1
  34. package/dist/client/{buildFilterParams-By33pG59.mjs.map → buildFilterParams-TeyosGyK.mjs.map} +1 -1
  35. package/dist/client/{constants-CAjjRTo_.mjs → constants-B-P2r5F1.mjs} +3 -3
  36. package/dist/client/{constants-CAjjRTo_.mjs.map → constants-B-P2r5F1.mjs.map} +1 -1
  37. package/dist/client/{containers-NW7RnHTI.mjs → containers-BjWqjNOx.mjs} +2 -2
  38. package/dist/client/containers-BjWqjNOx.mjs.map +1 -0
  39. package/dist/client/{containers-Ca5V1EBS.mjs → containers-DsRWc1L5.mjs} +1 -1
  40. package/dist/client/containers-DsRWc1L5.mjs.map +1 -0
  41. package/dist/client/{containers-BuXUVb1N.mjs → containers-J7WFA18U.mjs} +1140 -1051
  42. package/dist/client/containers-J7WFA18U.mjs.map +1 -0
  43. package/dist/client/{floatingips-Be3zLoaD.mjs → floatingips-Fa6ocNUu.mjs} +7 -7
  44. package/dist/client/{floatingips-Be3zLoaD.mjs.map → floatingips-Fa6ocNUu.mjs.map} +1 -1
  45. package/dist/client/{formatBytes-D6oa0wU9.mjs → formatBytes-tQBEnPoL.mjs} +1 -1
  46. package/dist/client/{formatBytes-D6oa0wU9.mjs.map → formatBytes-tQBEnPoL.mjs.map} +1 -1
  47. package/dist/client/{hooks-D0krAKvo.mjs → hooks-DEjb9d1F.mjs} +1 -1
  48. package/dist/client/{images-CCYBAphP2.mjs → images-CSFfefAu.mjs} +8 -7
  49. package/dist/client/images-CSFfefAu.mjs.map +1 -0
  50. package/dist/client/{images-BiEBENaj.mjs → images-CTLCY-yY.mjs} +2 -2
  51. package/dist/client/{images-BiEBENaj.mjs.map → images-CTLCY-yY.mjs.map} +1 -1
  52. package/dist/client/images-DM9I8G0p.mjs.map +1 -1
  53. package/dist/client/images-tYfyOkX8.mjs +8 -0
  54. package/dist/client/images-tYfyOkX8.mjs.map +1 -0
  55. package/dist/client/index.js +111 -109
  56. package/dist/client/index.js.map +1 -1
  57. package/dist/client/{network-nbSbl0X0.mjs → network-rYLHyf15.mjs} +1 -1
  58. package/dist/client/{network-nbSbl0X0.mjs.map → network-rYLHyf15.mjs.map} +1 -1
  59. package/dist/client/{objects-CU5ws07o.mjs → objects-BciXwZ00.mjs} +2 -2
  60. package/dist/client/objects-BciXwZ00.mjs.map +1 -0
  61. package/dist/client/{objects-GmuIOaHd.mjs → objects-Cdew99tK.mjs} +1 -1
  62. package/dist/client/objects-Cdew99tK.mjs.map +1 -0
  63. package/dist/client/objects-DaElrban.mjs +5340 -0
  64. package/dist/client/objects-DaElrban.mjs.map +1 -0
  65. package/dist/client/{overview-EhfPY8Je.mjs → overview-BMhjFMIV.mjs} +2 -2
  66. package/dist/client/{overview-EhfPY8Je.mjs.map → overview-BMhjFMIV.mjs.map} +1 -1
  67. package/dist/client/{overview-DzYBiNfD.mjs → overview-BYIRj7_X.mjs} +1 -1
  68. package/dist/client/{overview-DzYBiNfD.mjs.map → overview-BYIRj7_X.mjs.map} +1 -1
  69. package/dist/client/{overview-B3gdnWTG.mjs → overview-DRCKNBH2.mjs} +1 -1
  70. package/dist/client/{overview-B3gdnWTG.mjs.map → overview-DRCKNBH2.mjs.map} +1 -1
  71. package/dist/client/{overview-XueZI4LQ.mjs → overview-urYLOVQE.mjs} +2 -2
  72. package/dist/client/{overview-XueZI4LQ.mjs.map → overview-urYLOVQE.mjs.map} +1 -1
  73. package/dist/client/{pca-DSM71LhW.mjs → pca-COmKvp3J.mjs} +2 -2
  74. package/dist/client/{pca-DSM71LhW.mjs.map → pca-COmKvp3J.mjs.map} +1 -1
  75. package/dist/client/{pca-x9if8xU-.mjs → pca-oc7J0_Xd.mjs} +17 -17
  76. package/dist/client/pca-oc7J0_Xd.mjs.map +1 -0
  77. package/dist/client/{projects-CnmZIB2Q.mjs → projects-BUabCzvw.mjs} +16 -16
  78. package/dist/client/projects-BUabCzvw.mjs.map +1 -0
  79. package/dist/client/{projects-Bt0XptpG.mjs → projects-DI_L4oDw.mjs} +2 -2
  80. package/dist/client/{projects-Bt0XptpG.mjs.map → projects-DI_L4oDw.mjs.map} +1 -1
  81. package/dist/client/{projects-B6BPo2Ar.mjs → projects-Dl5XkXUP.mjs} +1 -1
  82. package/dist/client/{projects-B6BPo2Ar.mjs.map → projects-Dl5XkXUP.mjs.map} +1 -1
  83. package/dist/client/{projects-BilrmHLu.mjs → projects-HoQ0gE5Y.mjs} +1 -1
  84. package/dist/client/{projects-BilrmHLu.mjs.map → projects-HoQ0gE5Y.mjs.map} +1 -1
  85. package/dist/client/{securitygroups-BdzieS7Z.mjs → securitygroups-BjkmHk2J.mjs} +7 -7
  86. package/dist/client/{securitygroups-BdzieS7Z.mjs.map → securitygroups-BjkmHk2J.mjs.map} +1 -1
  87. package/dist/client/{useListWithFiltering-CqQbAjEe.mjs → useListWithFiltering-CbhHJO4V.mjs} +1 -1
  88. package/dist/client/{useListWithFiltering-CqQbAjEe.mjs.map → useListWithFiltering-CbhHJO4V.mjs.map} +1 -1
  89. package/dist/client/{useProjectId-CgOTejka.mjs → useProjectId-OQv2KBbG.mjs} +1 -1
  90. package/dist/client/{useProjectId-CgOTejka.mjs.map → useProjectId-OQv2KBbG.mjs.map} +1 -1
  91. package/dist/server/index.d.ts +7 -1
  92. package/dist/server/index.js +116 -55
  93. package/package.json +2 -3
  94. package/dist/client/FiltersInput-BgNaHFBt.mjs.map +0 -1
  95. package/dist/client/_floatingIpId-BpUfL8Im2.mjs.map +0 -1
  96. package/dist/client/_pcaId-CwlH1Kvl.mjs.map +0 -1
  97. package/dist/client/containers-BuXUVb1N.mjs.map +0 -1
  98. package/dist/client/containers-Ca5V1EBS.mjs.map +0 -1
  99. package/dist/client/containers-NW7RnHTI.mjs.map +0 -1
  100. package/dist/client/images-CCYBAphP2.mjs.map +0 -1
  101. package/dist/client/objects-CU5ws07o.mjs.map +0 -1
  102. package/dist/client/objects-FXN0VWLI.mjs +0 -4760
  103. package/dist/client/objects-FXN0VWLI.mjs.map +0 -1
  104. package/dist/client/objects-GmuIOaHd.mjs.map +0 -1
  105. package/dist/client/pca-x9if8xU-.mjs.map +0 -1
  106. package/dist/client/projects-CnmZIB2Q.mjs.map +0 -1
  107. package/permission_policies/compute.yaml +0 -975
  108. package/permission_policies/image.yaml +0 -71
@@ -89,4 +89,4 @@ function a() {
89
89
  //#endregion
90
90
  export { a as component };
91
91
 
92
- //# sourceMappingURL=about-DCe6LsKz.mjs.map
92
+ //# sourceMappingURL=about-DLn1ShhF.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"about-DCe6LsKz.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;AACP,QACE,kBAAC,GAAA;EAAU,WAAU;YACnB,kBAAC,OAAA;GAAI,WAAU;;IACb,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA;;yCACc,UAAA,EAAA,CAAA,EAAA;;;IAMhB,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAMF,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,MAAA;KAAG,WAAU;;MACZ,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;0CACG,UAAA,EAAA,CAAA,EAAA;;MAKP,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;0CACG,UAAA,EAAA,CAAA,EAAA;;MAKP,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;0CACG,UAAA,EAAA,CAAA,EAAA;;MAKP,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;0CACG,UAAA,EAAA,CAAA,EAAA;;;;IAMT,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAMF,kBAAC,MAAA;KAAG,WAAU;gBACZ,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;yCACG,UAAA,EAAA,CAAA,EAAA;eAKP,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;yCACG,UAAA,EAAA,CAAA,EAAA;;;IAMT,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAKF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
1
+ {"version":3,"file":"about-DLn1ShhF.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;AACP,QACE,kBAAC,GAAA;EAAU,WAAU;YACnB,kBAAC,OAAA;GAAI,WAAU;;IACb,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA;;yCACc,UAAA,EAAA,CAAA,EAAA;;;IAMhB,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAMF,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,MAAA;KAAG,WAAU;;MACZ,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;0CACG,UAAA,EAAA,CAAA,EAAA;;MAKP,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;0CACG,UAAA,EAAA,CAAA,EAAA;;MAKP,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;0CACG,UAAA,EAAA,CAAA,EAAA;;MAKP,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;0CACG,UAAA,EAAA,CAAA,EAAA;;;;IAMT,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAMF,kBAAC,MAAA;KAAG,WAAU;gBACZ,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;yCACG,UAAA,EAAA,CAAA,EAAA;eAKP,kBAAC,MAAA,EAAA,UACC,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA;;yCACG,UAAA,EAAA,CAAA,EAAA;;;IAMT,kBAAC,GAAA;KAAe,WAAU;eACxB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAKF,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
@@ -12,4 +12,4 @@ var e = (e) => {
12
12
  //#endregion
13
13
  export { e as t };
14
14
 
15
- //# sourceMappingURL=buildFilterParams-By33pG59.mjs.map
15
+ //# sourceMappingURL=buildFilterParams-TeyosGyK.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildFilterParams-By33pG59.mjs","names":["buildFilterParams","filterSettings","params","selectedFilters","length","filter","sf","inactive","forEach","value","name"],"sources":["../../src/client/utils/buildFilterParams.ts"],"sourcesContent":["import { FilterSettings } from \"@/client/components/ListToolbar/types\"\n\n/**\n * Builds filter parameters from current filter settings\n */\nexport const buildFilterParams = (filterSettings: FilterSettings): Record<string, string | boolean> => {\n const params: Record<string, string | boolean> = {}\n\n if (!filterSettings.selectedFilters?.length) return params\n\n filterSettings.selectedFilters\n .filter((sf) => !sf.inactive)\n .forEach((sf) => {\n if (sf.value === \"true\" || sf.value === \"false\") {\n params[sf.name] = sf.value === \"true\"\n return\n }\n params[sf.name] = sf.value\n })\n return params\n}\n"],"mappings":";AAKA,IAAaA,KAAqBC,MAAAA;CAChC,IAAMC,IAA2C,EAAC;AAalD,QAXKD,EAAeE,iBAAiBC,UAErCH,EAAeE,gBACZE,QAAQC,MAAO,CAACA,EAAGC,SAAQ,CAC3BC,SAASF,MAAAA;AACR,MAAIA,EAAGG,UAAU,UAAUH,EAAGG,UAAU,SAAS;AAC/CP,KAAOI,EAAGI,QAAQJ,EAAGG,UAAU;AAC/B;;AAEFP,IAAOI,EAAGI,QAAQJ,EAAGG;GACvB,EAVkDP"}
1
+ {"version":3,"file":"buildFilterParams-TeyosGyK.mjs","names":["buildFilterParams","filterSettings","params","selectedFilters","length","filter","sf","inactive","forEach","value","name"],"sources":["../../src/client/utils/buildFilterParams.ts"],"sourcesContent":["import { FilterSettings } from \"@/client/components/ListToolbar/types\"\n\n/**\n * Builds filter parameters from current filter settings\n */\nexport const buildFilterParams = (filterSettings: FilterSettings): Record<string, string | boolean> => {\n const params: Record<string, string | boolean> = {}\n\n if (!filterSettings.selectedFilters?.length) return params\n\n filterSettings.selectedFilters\n .filter((sf) => !sf.inactive)\n .forEach((sf) => {\n if (sf.value === \"true\" || sf.value === \"false\") {\n params[sf.name] = sf.value === \"true\"\n return\n }\n params[sf.name] = sf.value\n })\n return params\n}\n"],"mappings":";AAKA,IAAaA,KAAqBC,MAAAA;CAChC,IAAMC,IAA2C,EAAC;AAalD,QAXKD,EAAeE,iBAAiBC,UAErCH,EAAeE,gBACZE,QAAQC,MAAO,CAACA,EAAGC,SAAQ,CAC3BC,SAASF,MAAAA;AACR,MAAIA,EAAGG,UAAU,UAAUH,EAAGG,UAAU,SAAS;AAC/CP,KAAOI,EAAGI,QAAQJ,EAAGG,UAAU;AAC/B;;AAEFP,IAAOI,EAAGI,QAAQJ,EAAGG;GACvB,EAVkDP"}
@@ -1,8 +1,8 @@
1
1
  import { Q as e, T as t, at as n, n as r, nt as i, ot as a, q as o } from "./build-BJDfnAyi.mjs";
2
2
  import { r as s } from "./trpcClient-BxguzNYF.mjs";
3
3
  import { c, n as l, p as u } from "./md-BivyCkGC.mjs";
4
- import { t as d } from "./useProjectId-CgOTejka.mjs";
5
- import "./hooks-D0krAKvo.mjs";
4
+ import { t as d } from "./useProjectId-OQv2KBbG.mjs";
5
+ import "./hooks-DEjb9d1F.mjs";
6
6
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
7
7
  import { Trans as m, useLingui as h } from "@lingui/react";
8
8
  import { z as g } from "zod";
@@ -125,4 +125,4 @@ var b = ({ pca: c, open: l, onClose: u, onSuccess: _ }) => {
125
125
  //#endregion
126
126
  export { S as n, b as r, x as t };
127
127
 
128
- //# sourceMappingURL=constants-CAjjRTo_.mjs.map
128
+ //# sourceMappingURL=constants-B-P2r5F1.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants-CAjjRTo_.mjs","names":["z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","TextInput","Stack","trpcReact","useProjectId","DeletePcaModal","pca","open","onClose","onSuccess","useLingui","projectId","utils","useUtils","isPending","deletePcaMutation","services","delete","useMutation","onSettled","list","invalidate","formSchema","object","string","refine","value","message","t","form","defaultValues","validators","onSubmit","mutateAsync","project_id","certificate_authority_id","id","handleClose","canDelete","store","state","isSubmitting","values","reset","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","error","dismissible","variant","className","div","span","gap","direction","p","strong","e","preventDefault","Field","name","children","field","onChange","handleChange","target","placeholder","helptext","required","MdError","MdRemoveCircle","MdCheckCircle","STATE_CONFIG","CREATING","text","icon","size","color","fill","AWAITING_CERTIFICATE","READY","FAILED","UNEXPECTED","TABLE_COLUMNS","t"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-modals/DeletePcaModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/constants.tsx"],"sourcesContent":["import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, TextInput, Stack } from \"@cloudoperators/juno-ui-components\"\nimport type { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface DeletePcaModalProps {\n pca: CertificateAuthority\n open: boolean\n onClose: () => void\n onSuccess?: () => void\n}\n\nexport const DeletePcaModal = ({ pca, open, onClose, onSuccess }: DeletePcaModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...deletePcaMutation } = trpcReact.services.pca.delete.useMutation({\n onSettled: () => utils.services.pca.list.invalidate(),\n })\n\n const formSchema = z.object({\n delete: z.string().refine((value) => value === \"delete\", {\n message: t`Type “delete” to confirm`,\n }),\n })\n\n const form = useForm({\n defaultValues: {\n delete: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (isPending) return\n\n await deletePcaMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pca.id,\n })\n handleClose()\n onSuccess?.()\n },\n })\n\n // creates a reactive subscription so the component re-renders, which allows the confirm button to enable once the user types \"delete\".\n const canDelete = useStore(form.store, (state) => state.isSubmitting || state.values.delete !== \"delete\")\n\n const handleClose = () => {\n form.reset()\n onClose()\n }\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Delete certificate authority`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Delete`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || canDelete}\n >\n {deletePcaMutation.error?.message && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {deletePcaMutation.error.message}\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>Deleting certificate authority...</Trans>\n </span>\n </div>\n )}\n\n <Stack gap=\"2.5\" direction=\"vertical\" className=\"mb-2.5\">\n <p>\n <Trans>\n Deleting this Certificate Authority is permanent, and all the associated certificates will no longer apply\n to entities.\n </Trans>\n </p>\n <p>\n <Trans>\n To confirm, type <strong>\"delete\"</strong> in the field below.\n </Trans>\n </p>\n </Stack>\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"delete-pca-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"delete\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Type \"delete\" to confirm`}\n helptext={t`The text must match “delete” in lowercase.`}\n required\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { MdError, MdRemoveCircle, MdCheckCircle } from \"react-icons/md\"\nimport { t } from \"@lingui/core/macro\"\nimport { CertificateAuthorityState } from \"@/server/Services/types/pca\"\n\ntype PcaDisplayState = {\n text: string\n icon: React.ReactNode\n}\n\n// will replace text and icon after design-sync with Marta\nexport const STATE_CONFIG: Record<CertificateAuthorityState, PcaDisplayState> = {\n CREATING: {\n text: \"CREATING\",\n icon: <MdCheckCircle size={18} color=\"white\" fill=\"#4FB81C\" />,\n },\n AWAITING_CERTIFICATE: {\n text: \"AWAITING_CERTIFICATE\",\n icon: <MdRemoveCircle size={18} color=\"white\" fill=\"#969696\" />,\n },\n READY: {\n text: \"READY\",\n icon: <MdError size={18} color=\"white\" fill=\"#C70000\" />,\n },\n FAILED: {\n text: \"FAILED\",\n icon: <MdError size={18} color=\"white\" fill=\"#C70000\" />,\n },\n UNEXPECTED: {\n text: \"UNEXPECTED\",\n icon: <MdError size={18} color=\"white\" fill=\"#C70000\" />,\n },\n} as const\n\nexport const TABLE_COLUMNS = () =>\n [\n t`State`,\n t`ID`,\n t`Subject information`,\n \"\", // empty column for item-action with context menu containing \"Delete CA\" button\n ] as const\n"],"mappings":"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"}
1
+ {"version":3,"file":"constants-B-P2r5F1.mjs","names":["z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","TextInput","Stack","trpcReact","useProjectId","DeletePcaModal","pca","open","onClose","onSuccess","useLingui","projectId","utils","useUtils","isPending","deletePcaMutation","services","delete","useMutation","onSettled","list","invalidate","formSchema","object","string","refine","value","message","t","form","defaultValues","validators","onSubmit","mutateAsync","project_id","certificate_authority_id","id","handleClose","canDelete","store","state","isSubmitting","values","reset","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","error","dismissible","variant","className","div","span","gap","direction","p","strong","e","preventDefault","Field","name","children","field","onChange","handleChange","target","placeholder","helptext","required","MdError","MdRemoveCircle","MdCheckCircle","STATE_CONFIG","CREATING","text","icon","size","color","fill","AWAITING_CERTIFICATE","READY","FAILED","UNEXPECTED","TABLE_COLUMNS","t"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-modals/DeletePcaModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/constants.tsx"],"sourcesContent":["import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, TextInput, Stack } from \"@cloudoperators/juno-ui-components\"\nimport type { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface DeletePcaModalProps {\n pca: CertificateAuthority\n open: boolean\n onClose: () => void\n onSuccess?: () => void\n}\n\nexport const DeletePcaModal = ({ pca, open, onClose, onSuccess }: DeletePcaModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...deletePcaMutation } = trpcReact.services.pca.delete.useMutation({\n onSettled: () => utils.services.pca.list.invalidate(),\n })\n\n const formSchema = z.object({\n delete: z.string().refine((value) => value === \"delete\", {\n message: t`Type “delete” to confirm`,\n }),\n })\n\n const form = useForm({\n defaultValues: {\n delete: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (isPending) return\n\n await deletePcaMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pca.id,\n })\n handleClose()\n onSuccess?.()\n },\n })\n\n // creates a reactive subscription so the component re-renders, which allows the confirm button to enable once the user types \"delete\".\n const canDelete = useStore(form.store, (state) => state.isSubmitting || state.values.delete !== \"delete\")\n\n const handleClose = () => {\n form.reset()\n onClose()\n }\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Delete certificate authority`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Delete`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || canDelete}\n >\n {deletePcaMutation.error?.message && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {deletePcaMutation.error.message}\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>Deleting certificate authority...</Trans>\n </span>\n </div>\n )}\n\n <Stack gap=\"2.5\" direction=\"vertical\" className=\"mb-2.5\">\n <p>\n <Trans>\n Deleting this Certificate Authority is permanent, and all the associated certificates will no longer apply\n to entities.\n </Trans>\n </p>\n <p>\n <Trans>\n To confirm, type <strong>\"delete\"</strong> in the field below.\n </Trans>\n </p>\n </Stack>\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"delete-pca-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"delete\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Type \"delete\" to confirm`}\n helptext={t`The text must match “delete” in lowercase.`}\n required\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { MdError, MdRemoveCircle, MdCheckCircle } from \"react-icons/md\"\nimport { t } from \"@lingui/core/macro\"\nimport { CertificateAuthorityState } from \"@/server/Services/types/pca\"\n\ntype PcaDisplayState = {\n text: string\n icon: React.ReactNode\n}\n\n// will replace text and icon after design-sync with Marta\nexport const STATE_CONFIG: Record<CertificateAuthorityState, PcaDisplayState> = {\n CREATING: {\n text: \"CREATING\",\n icon: <MdCheckCircle size={18} color=\"white\" fill=\"#4FB81C\" />,\n },\n AWAITING_CERTIFICATE: {\n text: \"AWAITING_CERTIFICATE\",\n icon: <MdRemoveCircle size={18} color=\"white\" fill=\"#969696\" />,\n },\n READY: {\n text: \"READY\",\n icon: <MdError size={18} color=\"white\" fill=\"#C70000\" />,\n },\n FAILED: {\n text: \"FAILED\",\n icon: <MdError size={18} color=\"white\" fill=\"#C70000\" />,\n },\n UNEXPECTED: {\n text: \"UNEXPECTED\",\n icon: <MdError size={18} color=\"white\" fill=\"#C70000\" />,\n },\n} as const\n\nexport const TABLE_COLUMNS = () =>\n [\n t`State`,\n t`ID`,\n t`Subject information`,\n \"\", // empty column for item-action with context menu containing \"Delete CA\" button\n ] as const\n"],"mappings":";;;;;;;;;;;AAeA,IAAaY,KAAkB,EAAEC,QAAKC,SAAMC,YAASC,mBAAgC;CACnF,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EACRC,IAAYP,GAAAA,EACZQ,IAAQT,EAAUU,UAAQ,EAE1B,EAAEC,cAAW,GAAGC,MAAsBZ,EAAUa,SAASV,IAAIW,OAAOC,YAAY,EACpFC,iBAAiBP,EAAMI,SAASV,IAAIc,KAAKC,YAAU,EACrD,CAAA,EAQMQ,IAAOnC,EAAQ;EACnBoC,eAAe,EACbb,QAAQ,IACV;EACAc,YAAY,EACVC,UAXevC,EAAE8B,OAAO,EAC1BN,QAAQxB,EAAE+B,QAAM,CAAGC,QAAQC,MAAUA,MAAU,UAAU,EACvDC,SAASC,EAAAA,EAAC,EAAA,IAAA,UAAyB,CAAA,EACrC,CAAA,EACF,CAAA,EAQE;EACAI,UAAU,YAAA;AACJlB,SAEJ,MAAMC,EAAkBkB,YAAY;IAClCC,YAAYvB;IACZwB,0BAA0B7B,EAAI8B;IAChC,CAAA,EACAC,GAAAA,EACA5B,KAAAA;;EAEJ,CAAA,EAGM6B,IAAY3C,EAASkC,EAAKU,QAAQC,MAAUA,EAAMC,gBAAgBD,EAAME,OAAOzB,WAAW,SAAA,EAE1FoB,UAAc;AAElB7B,EADAqB,EAAKc,OAAK,EACVnC,GAAAA;;AAGF,QACE,kBAACZ,GAAAA;EACOW;EACNqC,MAAK;EACLC,OAAOjB,EAAAA,EAAC,EAAA,IAAA,UAA6B,CAAA;EACrCkB,UAAUT;EACVU,mBAAmBnB,EAAAA,EAAC,EAAA,IAAA,UAAO,CAAA;EAC3BoB,oBAAoBpB,EAAAA,EAAC,EAAA,IAAA,UAAO,CAAA;EAC5BqB,WAAWpB,EAAKqB;EAChBC,sBAAsBrC,KAAawB;;GAElCvB,EAAkBqC,OAAOzB,WACxB,kBAAC3B,GAAAA;IAAQqD,aAAa;IAAOC,SAAQ;IAAQC,WAAU;cACpDxC,EAAkBqC,MAAMzB;;GAI5Bb,KACC,kBAAC0C,OAAAA;IAAID,WAAU;eACb,kBAACxD,GAAAA,EAAQuD,SAAQ,WAAA,CAAA,EACjB,kBAACG,QAAAA;KAAKF,WAAU;eACd,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;;GAKN,kBAACrD,GAAAA;IAAMwD,KAAI;IAAMC,WAAU;IAAWJ,WAAU;eAC9C,kBAACK,KAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAKF,kBAACA,KAAAA,EAAAA,UACC,kBAAA,GAAA;;wCACoBC,UAAAA,EAAAA,CAAAA,EAAAA;;;GAKvB,CAAC/C,KACA,kBAACjB,GAAAA;IACC0D,WAAU;IACVnB,IAAG;IACHJ,WAAW8B,MAAAA;AAETjC,KADAiC,EAAEC,gBAAc,EAChBlC,EAAKqB,cAAY;;cAGnB,kBAACpD,GAAAA,EAAAA,UACC,kBAAC+B,EAAKmC,OAAK;KACTC,MAAK;KACLC,WAAWC,MACT,kBAAClE,GAAAA;MACCmC,IAAI+B,EAAMF;MACVA,MAAME,EAAMF;MACZvC,OAAOyC,EAAM3B,MAAMd;MACnB0C,WAAWN,MAAMK,EAAME,aAAaP,EAAEQ,OAAO5C,MAAK;MAClD6C,aAAa3C,EAAAA,EAAC,EAAA,IAAA,UAAyB,CAAA;MACvC4C,UAAU5C,EAAAA,EAAC,EAAA,IAAA,UAA2C,CAAA;MACtD6C,UAAQ;;;;;;GC3GbI,IAAmE;CAC9EC,UAAU;EACRC,MAAM;EACNC,MAAM,kBAACJ,GAAAA;GAAcK,MAAM;GAAIC,OAAM;GAAQC,MAAK;;EACpD;CACAC,sBAAsB;EACpBL,MAAM;EACNC,MAAM,kBAACL,GAAAA;GAAeM,MAAM;GAAIC,OAAM;GAAQC,MAAK;;EACrD;CACAE,OAAO;EACLN,MAAM;EACNC,MAAM,kBAACN,GAAAA;GAAQO,MAAM;GAAIC,OAAM;GAAQC,MAAK;;EAC9C;CACAG,QAAQ;EACNP,MAAM;EACNC,MAAM,kBAACN,GAAAA;GAAQO,MAAM;GAAIC,OAAM;GAAQC,MAAK;;EAC9C;CACAI,YAAY;EACVR,MAAM;EACNC,MAAM,kBAACN,GAAAA;GAAQO,MAAM;GAAIC,OAAM;GAAQC,MAAK;;EAC9C;CACF,EAEaK,UACX;CACEC,EAAAA,EAAC,EAAA,IAAA,UAAM,CAAA;CACPA,EAAAA,EAAC,EAAA,IAAA,UAAG,CAAA;CACJA,EAAAA,EAAC,EAAA,IAAA,UAAoB,CAAA;CACrB;CACD"}
@@ -2,7 +2,7 @@ import { t as e } from "./helpers--JWXi40U.mjs";
2
2
  import { createFileRoute as t, lazyRouteComponent as n, redirect as r } from "@tanstack/react-router";
3
3
  import { z as i } from "zod";
4
4
  //#region src/client/routes/_auth/projects/$projectId/storage/$provider/containers/index.tsx
5
- var a = () => import("./containers-Ca5V1EBS.mjs"), o = () => import("./containers-BuXUVb1N.mjs"), s = (t, n) => {
5
+ var a = () => import("./containers-DsRWc1L5.mjs"), o = () => import("./containers-J7WFA18U.mjs"), s = (t, n) => {
6
6
  let { provider: i, projectId: a } = n, o = e(t);
7
7
  if (!o["object-store"]) throw r({
8
8
  to: "/projects/$projectId",
@@ -74,4 +74,4 @@ var a = () => import("./containers-Ca5V1EBS.mjs"), o = () => import("./container
74
74
  //#endregion
75
75
  export { l as t };
76
76
 
77
- //# sourceMappingURL=containers-NW7RnHTI.mjs.map
77
+ //# sourceMappingURL=containers-BjWqjNOx.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers-BjWqjNOx.mjs","names":["createFileRoute","redirect","z","getServiceIndex","checkServiceAvailability","availableServices","type","name","params","projectId","provider","serviceIndex","to","hasSwift","Boolean","hasCeph","cephFallbackEnabled","hasEffectiveCeph","fallbackProvider","containersSearchSchema","object","sortBy","enum","optional","sortDirection","search","string","Route","staticData","section","service","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/containers/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useParams } from \"@tanstack/react-router\"\nimport { z } from \"zod\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { SwiftContainers } from \"../../-components/Swift/Containers\"\nimport { CephContainers } from \"../../-components/Ceph/Containers\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\n/**\n * Validates that the requested storage provider is available for the given project,\n * and redirects to an appropriate fallback route when it is not.\n *\n * Redirect rules (in priority order):\n * 1. No `object-store` service at all → redirect to the project overview.\n * 2. Unknown provider (neither \"swift\" nor \"ceph\") → redirect to the first\n * available provider, or to the project overview if none exist.\n * 3. Requested provider unavailable → redirect to the other provider,\n * or to the project overview if no alternative exists.\n *\n * Ceph has a temporary fallback flag (`cephFallbackEnabled`) that treats it as\n * available even when absent from the OpenStack service catalog.\n *\n * @throws {redirect} - Always throws a TanStack Router redirect; never returns normally\n * when the requested provider/project combination is unavailable.\n */\nexport const checkServiceAvailability = (\n availableServices: {\n type: string\n name: string\n }[],\n params: {\n projectId: string\n provider: string\n }\n) => {\n const { provider, projectId } = 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\n if (provider !== \"swift\" && provider !== \"ceph\") {\n if (!fallbackProvider) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/containers\",\n params: { ...params, provider: fallbackProvider },\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/containers\",\n params: { ...params, provider: \"ceph\" },\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/containers\",\n params: { ...params, provider: \"swift\" },\n })\n }\n}\n\n// Search params schema\n// - sortBy: active sort column — persisted for deep links and back navigation\n// - sortDirection: \"asc\" | \"desc\" — persisted alongside sortBy\n// - search: active filter string — persisted so deep links preserve the current search\nconst containersSearchSchema = z.object({\n sortBy: z.enum([\"name\", \"count\", \"bytes\", \"last_modified\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/storage/$provider/containers/\")({\n staticData: {\n section: \"storage\",\n service: \"containers\",\n sectionCrumb: { labelKey: \"Storage\" },\n crumb: { useParamAsLabel: \"provider\" },\n } satisfies RouteInfo,\n validateSearch: containersSearchSchema,\n head: ({ match }) => ({\n meta: [\n {\n title:\n match.params.provider === \"swift\"\n ? \"Object Storage (Swift)\"\n : match.params.provider === \"ceph\"\n ? \"Object Storage (Ceph)\"\n : \"Storage Overview\",\n },\n ],\n }),\n component: () => {\n return <StorageDashboard />\n },\n notFoundComponent: () => {\n return <p>Storage service not found</p>\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 StorageDashboard() {\n const { project, provider } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/containers/\",\n select: (params) => {\n return { project: params.projectId, provider: params.provider }\n },\n })\n\n const { t } = useLingui()\n\n let pageTitle: string\n switch (provider) {\n case \"swift\":\n pageTitle = t`Object Storage (Swift)`\n break\n case \"ceph\":\n pageTitle = t`Object Storage (Ceph)`\n break\n default:\n pageTitle = t`Storage Overview`\n }\n\n return (\n <div>\n <ContentHeader title={pageTitle} projectId={project} />\n {project ? (\n <ErrorBoundary\n resetKeys={[project, provider]}\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 <SwiftContainers />\n case \"ceph\":\n return <CephContainers />\n default:\n return <div>Storage Overview Page</div> // replace when available\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":";;;;kGA2BaI,KACXC,GAIAG,MAAAA;CAKA,IAAM,EAAEE,aAAUD,iBAAcD,GAE1BG,IAAeR,EAAgBE,EAAAA;AAGrC,KAAI,CAACM,EAAa,gBAChB,OAAMV,EAAS;EACbW,IAAI;EACJJ,QAAQ,EAAEC,cAAU;EACtB,CAAA;CAIF,IAAMI,IAAWC,EAAQH,EAAa,gBAAgB,OAQhDM,IAPUH,EAAQH,EAAa,gBAAgB,QAIzB,IAItBO,IAAmBL,IAAW,UAAUI,IAAmB,SAAS;AAE1E,KAAIP,MAAa,WAAWA,MAAa,OAOvC,OAAMT,EANDiB,IAMU;EACbN,IAAI;EACJJ,QAAQ;GAAE,GAAGA;GAAQE,UAAUQ;GAAiB;EAClD,GARiB;EACbN,IAAI;EACJJ,QAAQ,EAAEC,cAAU;EACtB,CAAA;AAQJ,KAAIC,MAAa,WAAW,CAACG,EAQ3B,OAAMZ,EAPDgB,IAOU;EACbL,IAAI;EACJJ,QAAQ;GAAE,GAAGA;GAAQE,UAAU;GAAO;EACxC,GATiB;EACbE,IAAI;EACJJ,QAAQ,EAAEC,cAAU;EACtB,CAAA;AASJ,KAAIC,MAAa,UAAU,CAACO,EAQ1B,OAAMhB,EAPDY,IAOU;EACbD,IAAI;EACJJ,QAAQ;GAAE,GAAGA;GAAQE,UAAU;GAAQ;EACzC,GATiB;EACbE,IAAI;EACJJ,QAAQ,EAAEC,cAAU;EACtB,CAAA;GAcAU,IAAyBjB,EAAEkB,OAAO;CACtCC,QAAQnB,EAAEoB,KAAK;EAAC;EAAQ;EAAS;EAAS;EAAgB,CAAA,CAAEC,UAAQ;CACpEC,eAAetB,EAAEoB,KAAK,CAAC,OAAO,OAAO,CAAA,CAAEC,UAAQ;CAC/CE,QAAQvB,EAAEwB,QAAM,CAAGH,UAAQ;CAC7B,CAAA,EAEaI,IAAQ3B,EAAgB,2DAAA,CAA4D;CAC/F4B,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,cAAc,EAAEC,UAAU,WAAU;EACpCC,OAAO,EAAEC,iBAAiB,YAAW;EACvC;CACAE,gBAAgBjB;CAChBkB,OAAO,EAAEC,gBAAa,EACpBC,MAAM,CACJ,EACEC,OACEF,EAAM9B,OAAOE,aAAa,UACtB,2BACA4B,EAAM9B,OAAOE,aAAa,SACxB,0BACA,oBACV,CAAC,EAEL;CACA+B,WAASC,EAAAC,GAAA,YAAA;CAGTC,mBAAiBF,EAAAG,GAAA,oBAAA;CAGjBC,QAAQ,OAAO,EAAEC,iBAAS;EACxB,IAAM,EAAEC,kBAAeD;AAGvB,SAAO;GACLK,QAAQJ;GACR3C,mBAJwB,MAAM2C,GAAYC,KAAKC,qBAAqBC,OAAAA;GAKtE;;CAEFE,YAAY,OAAO,EAAEN,YAASvC,gBAAQ;EACpC,IAAM,EAAEwC,kBAAeD;AAEvB3C,IAD0B,MAAM4C,GAAYC,KAAKC,qBAAqBC,OAAAA,EACzB3C,EAAAA;;CAEjD,CAAA"}
@@ -4,4 +4,4 @@ var t = () => /* @__PURE__ */ e("p", { children: "Storage service not found" });
4
4
  //#endregion
5
5
  export { t as notFoundComponent };
6
6
 
7
- //# sourceMappingURL=containers-Ca5V1EBS.mjs.map
7
+ //# sourceMappingURL=containers-DsRWc1L5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers-DsRWc1L5.mjs","names":["SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/containers/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { createFileRoute, redirect, useParams } from \"@tanstack/react-router\"\nimport { z } from \"zod\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { SwiftContainers } from \"../../-components/Swift/Containers\"\nimport { CephContainers } from \"../../-components/Ceph/Containers\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\n/**\n * Validates that the requested storage provider is available for the given project,\n * and redirects to an appropriate fallback route when it is not.\n *\n * Redirect rules (in priority order):\n * 1. No `object-store` service at all → redirect to the project overview.\n * 2. Unknown provider (neither \"swift\" nor \"ceph\") → redirect to the first\n * available provider, or to the project overview if none exist.\n * 3. Requested provider unavailable → redirect to the other provider,\n * or to the project overview if no alternative exists.\n *\n * Ceph has a temporary fallback flag (`cephFallbackEnabled`) that treats it as\n * available even when absent from the OpenStack service catalog.\n *\n * @throws {redirect} - Always throws a TanStack Router redirect; never returns normally\n * when the requested provider/project combination is unavailable.\n */\nexport const checkServiceAvailability = (\n availableServices: {\n type: string\n name: string\n }[],\n params: {\n projectId: string\n provider: string\n }\n) => {\n const { provider, projectId } = 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\n if (provider !== \"swift\" && provider !== \"ceph\") {\n if (!fallbackProvider) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/containers\",\n params: { ...params, provider: fallbackProvider },\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/containers\",\n params: { ...params, provider: \"ceph\" },\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/containers\",\n params: { ...params, provider: \"swift\" },\n })\n }\n}\n\n// Search params schema\n// - sortBy: active sort column — persisted for deep links and back navigation\n// - sortDirection: \"asc\" | \"desc\" — persisted alongside sortBy\n// - search: active filter string — persisted so deep links preserve the current search\nconst containersSearchSchema = z.object({\n sortBy: z.enum([\"name\", \"count\", \"bytes\", \"last_modified\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/storage/$provider/containers/\")({\n staticData: {\n section: \"storage\",\n service: \"containers\",\n sectionCrumb: { labelKey: \"Storage\" },\n crumb: { useParamAsLabel: \"provider\" },\n } satisfies RouteInfo,\n validateSearch: containersSearchSchema,\n head: ({ match }) => ({\n meta: [\n {\n title:\n match.params.provider === \"swift\"\n ? \"Object Storage (Swift)\"\n : match.params.provider === \"ceph\"\n ? \"Object Storage (Ceph)\"\n : \"Storage Overview\",\n },\n ],\n }),\n component: () => {\n return <StorageDashboard />\n },\n notFoundComponent: () => {\n return <p>Storage service not found</p>\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 StorageDashboard() {\n const { project, provider } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/containers/\",\n select: (params) => {\n return { project: params.projectId, provider: params.provider }\n },\n })\n\n const { t } = useLingui()\n\n let pageTitle: string\n switch (provider) {\n case \"swift\":\n pageTitle = t`Object Storage (Swift)`\n break\n case \"ceph\":\n pageTitle = t`Object Storage (Ceph)`\n break\n default:\n pageTitle = t`Storage Overview`\n }\n\n return (\n <div>\n <ContentHeader title={pageTitle} projectId={project} />\n {project ? (\n <ErrorBoundary\n resetKeys={[project, provider]}\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 <SwiftContainers />\n case \"ceph\":\n return <CephContainers />\n default:\n return <div>Storage Overview Page</div> // replace when available\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":";;AA0GA,IAAAA,UA+BW,kBAAC,KAAA,EAAA,UAAE,6BAAA,CAAA"}