@cobaltcore-dev/aurora 0.11.0 → 0.12.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/dist/client/{ContentHeader-DsuZD8fa.mjs → ContentHeader-D2nIdJKJ.mjs} +22 -22
- package/dist/client/{ContentHeader-DsuZD8fa.mjs.map → ContentHeader-D2nIdJKJ.mjs.map} +1 -1
- package/dist/client/{DeleteFlavorModal-RnbspW_2.mjs → DeleteFlavorModal-Dwm0Hh84.mjs} +174 -174
- package/dist/client/{DeleteFlavorModal-RnbspW_2.mjs.map → DeleteFlavorModal-Dwm0Hh84.mjs.map} +1 -1
- package/dist/client/{DeleteVersionsModal-CsBJzXoW.mjs → DeleteVersionsModal-DQO8lGmS.mjs} +69 -69
- package/dist/client/{DeleteVersionsModal-CsBJzXoW.mjs.map → DeleteVersionsModal-DQO8lGmS.mjs.map} +1 -1
- package/dist/client/{EditSecurityGroupModal-BPv3d7am.mjs → EditSecurityGroupModal-BGPXglju.mjs} +17 -17
- package/dist/client/{EditSecurityGroupModal-BPv3d7am.mjs.map → EditSecurityGroupModal-BGPXglju.mjs.map} +1 -1
- package/dist/client/{FiltersInput-CViamP59.mjs → FiltersInput-cOaaRpcQ.mjs} +20 -20
- package/dist/client/{FiltersInput-CViamP59.mjs.map → FiltersInput-cOaaRpcQ.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-DTn3HFei.mjs → FloatingIpActionModals-RCvaamOg.mjs} +55 -55
- package/dist/client/{FloatingIpActionModals-DTn3HFei.mjs.map → FloatingIpActionModals-RCvaamOg.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-CFKQZTgf.mjs → ImageToastNotifications-ClO-1yOH.mjs} +310 -310
- package/dist/client/{ImageToastNotifications-CFKQZTgf.mjs.map → ImageToastNotifications-ClO-1yOH.mjs.map} +1 -1
- package/dist/client/{RouteError-BebIhFpQ.mjs → RouteError-BmZRk_ss.mjs} +2 -2
- package/dist/client/{RouteError-BebIhFpQ.mjs.map → RouteError-BmZRk_ss.mjs.map} +1 -1
- package/dist/client/{SortInput-D0Vb864D.mjs → SortInput-DjaEHvcO.mjs} +6 -6
- package/dist/client/{SortInput-D0Vb864D.mjs.map → SortInput-DjaEHvcO.mjs.map} +1 -1
- package/dist/client/{_flavorId-C9SZd1jL.mjs → _flavorId-CtQEd28h.mjs} +8 -8
- package/dist/client/{_flavorId-C9SZd1jL.mjs.map → _flavorId-CtQEd28h.mjs.map} +1 -1
- package/dist/client/{_flavorId-DINgWoeV.mjs → _flavorId-DVsGdXUf.mjs} +46 -46
- package/dist/client/{_flavorId-DINgWoeV.mjs.map → _flavorId-DVsGdXUf.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-BACLbMzi2.mjs → _floatingIpId-CKMq7-4p2.mjs} +36 -36
- package/dist/client/{_floatingIpId-BACLbMzi2.mjs.map → _floatingIpId-CKMq7-4p2.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-BzVMOv97.mjs → _floatingIpId-DvTh6vdB.mjs} +2 -2
- package/dist/client/{_floatingIpId-BzVMOv97.mjs.map → _floatingIpId-DvTh6vdB.mjs.map} +1 -1
- package/dist/client/_imageId-xG8hC49j.mjs +534 -0
- package/dist/client/{_imageId-DCvaU7-S.mjs.map → _imageId-xG8hC49j.mjs.map} +1 -1
- package/dist/client/{_pcaId-B3PqECyO.mjs → _pcaId-Db_t0x6O.mjs} +147 -147
- package/dist/client/{_pcaId-B3PqECyO.mjs.map → _pcaId-Db_t0x6O.mjs.map} +1 -1
- package/dist/client/{_pcaId-DAJEt3ZI.mjs → _pcaId-WCJoukIk.mjs} +2 -2
- package/dist/client/{_pcaId-DAJEt3ZI.mjs.map → _pcaId-WCJoukIk.mjs.map} +1 -1
- package/dist/client/{_projectId-DU8qRiZk.mjs → _projectId-B2cvskLV.mjs} +2 -2
- package/dist/client/{_projectId-DU8qRiZk.mjs.map → _projectId-B2cvskLV.mjs.map} +1 -1
- package/dist/client/{_projectId-DRr9rLST.mjs → _projectId-BCMkaH_h.mjs} +35 -35
- package/dist/client/_projectId-BCMkaH_h.mjs.map +1 -0
- package/dist/client/{_projectId-B2hG5peP.mjs → _projectId-BdqRntcN.mjs} +15 -14
- package/dist/client/{_projectId-B2hG5peP.mjs.map → _projectId-BdqRntcN.mjs.map} +1 -1
- package/dist/client/{_projectId-BnWXWTBR.mjs → _projectId-C8RGOqZb.mjs} +3 -3
- package/dist/client/{_projectId-BnWXWTBR.mjs.map → _projectId-C8RGOqZb.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-Cj9IotMJ.mjs → _securityGroupId-CyQ3XmpB.mjs} +2 -2
- package/dist/client/{_securityGroupId-Cj9IotMJ.mjs.map → _securityGroupId-CyQ3XmpB.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-ClJiFh4R.mjs → _securityGroupId-DMi7YRux.mjs} +397 -397
- package/dist/client/{_securityGroupId-ClJiFh4R.mjs.map → _securityGroupId-DMi7YRux.mjs.map} +1 -1
- package/dist/client/{_storageType-BrHDa2bD.mjs → _storageType-Bb6YZgXf.mjs} +657 -660
- package/dist/client/{_storageType-BrHDa2bD.mjs.map → _storageType-Bb6YZgXf.mjs.map} +1 -1
- package/dist/client/{_storageType-CSLH93js.mjs → _storageType-g1zkFFRh.mjs} +2 -2
- package/dist/client/{_storageType-CSLH93js.mjs.map → _storageType-g1zkFFRh.mjs.map} +1 -1
- package/dist/client/{about-BnU297yB.mjs → about-B4sGnxeW.mjs} +8 -8
- package/dist/client/{about-BnU297yB.mjs.map → about-B4sGnxeW.mjs.map} +1 -1
- package/dist/client/{build-DF7MTyXG.mjs → build-DgeVmENN.mjs} +2395 -2390
- package/dist/client/{build-DF7MTyXG.mjs.map → build-DgeVmENN.mjs.map} +1 -1
- package/dist/client/{constants-BskfpGYY.mjs → constants-D6IO9bPs.mjs} +16 -16
- package/dist/client/{constants-BskfpGYY.mjs.map → constants-D6IO9bPs.mjs.map} +1 -1
- package/dist/client/{flavors-DAbtRoep.mjs → flavors-CO5l_6d0.mjs} +178 -178
- package/dist/client/{flavors-DAbtRoep.mjs.map → flavors-CO5l_6d0.mjs.map} +1 -1
- package/dist/client/{flavors-DODudzrA.mjs → flavors-D4nGSs0r.mjs} +2 -2
- package/dist/client/{flavors-DODudzrA.mjs.map → flavors-D4nGSs0r.mjs.map} +1 -1
- package/dist/client/{floatingips-DJW9ftN_.mjs → floatingips-ClkRV7a7.mjs} +108 -108
- package/dist/client/{floatingips-DJW9ftN_.mjs.map → floatingips-ClkRV7a7.mjs.map} +1 -1
- package/dist/client/{images-C3JyPwer.mjs → images-B5ktfqg6.mjs} +2 -2
- package/dist/client/{images-C3JyPwer.mjs.map → images-B5ktfqg6.mjs.map} +1 -1
- package/dist/client/{images-Cp6V1nF5.mjs → images-C_OYLPqv.mjs} +440 -440
- package/dist/client/{images-Cp6V1nF5.mjs.map → images-C_OYLPqv.mjs.map} +1 -1
- package/dist/client/{images-BbLnuYrL.mjs → images-CvPxoPC0.mjs} +2 -2
- package/dist/client/{images-BbLnuYrL.mjs.map → images-CvPxoPC0.mjs.map} +1 -1
- package/dist/client/index.js +275 -275
- package/dist/client/index.js.map +1 -1
- package/dist/client/{objects-DUmK3WgA.mjs → objects-D0grS6pk.mjs} +1361 -1361
- package/dist/client/{objects-DUmK3WgA.mjs.map → objects-D0grS6pk.mjs.map} +1 -1
- package/dist/client/{objects-Bw96WXOs.mjs → objects-UQyUQxBj.mjs} +2 -2
- package/dist/client/{objects-Bw96WXOs.mjs.map → objects-UQyUQxBj.mjs.map} +1 -1
- package/dist/client/{pca-Dc_tdh4-.mjs → pca-BJPxOIgq.mjs} +69 -69
- package/dist/client/{pca-Dc_tdh4-.mjs.map → pca-BJPxOIgq.mjs.map} +1 -1
- package/dist/client/{pca-DKeGzbww.mjs → pca-C9MKOi3Z.mjs} +2 -2
- package/dist/client/{pca-DKeGzbww.mjs.map → pca-C9MKOi3Z.mjs.map} +1 -1
- package/dist/client/{projects-CRL37ftA.mjs → projects-C3wR-lvM.mjs} +16 -19
- package/dist/client/projects-C3wR-lvM.mjs.map +1 -0
- package/dist/client/{projects-DUWOgB3m.mjs → projects-CGjBlG2w.mjs} +2 -2
- package/dist/client/{projects-DUWOgB3m.mjs.map → projects-CGjBlG2w.mjs.map} +1 -1
- package/dist/client/{projects-DpXQYfKc.mjs → projects-DvSiI5Vg.mjs} +2 -2
- package/dist/client/{projects-DpXQYfKc.mjs.map → projects-DvSiI5Vg.mjs.map} +1 -1
- package/dist/client/{securitygroups-CWWFSjjj.mjs → securitygroups-n8ujBpJP.mjs} +118 -118
- package/dist/client/{securitygroups-CWWFSjjj.mjs.map → securitygroups-n8ujBpJP.mjs.map} +1 -1
- package/dist/client/{useListWithFiltering-C9k7xWqz.mjs → useListWithFiltering-BuhE81I6.mjs} +10 -10
- package/dist/client/{useListWithFiltering-C9k7xWqz.mjs.map → useListWithFiltering-BuhE81I6.mjs.map} +1 -1
- package/dist/server/index.d.ts +6 -2
- package/dist/server/index.js +4 -17
- package/package.json +4 -4
- package/dist/client/_imageId-DCvaU7-S.mjs +0 -534
- package/dist/client/_projectId-DRr9rLST.mjs.map +0 -1
- package/dist/client/projects-CRL37ftA.mjs.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { f as e, tt as t, x as n } from "./build-DgeVmENN.mjs";
|
|
2
2
|
import { t as r } from "./Slot-CWb612-_.mjs";
|
|
3
3
|
import { t as i } from "./helpers-1PpYf-fC.mjs";
|
|
4
|
-
import { t as a } from "./ContentHeader-
|
|
4
|
+
import { t as a } from "./ContentHeader-D2nIdJKJ.mjs";
|
|
5
5
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
6
|
import { useLoaderData as c, useNavigate as l, useRouteContext as u } from "@tanstack/react-router";
|
|
7
7
|
import { Trans as d, useLingui as f } from "@lingui/react";
|
|
8
8
|
//#region src/client/routes/_auth/projects/$projectId/index.tsx?tsr-split=component
|
|
9
|
-
function p({ group:
|
|
9
|
+
function p({ group: t, label: i, to: a, service: c }) {
|
|
10
10
|
let d = l(), { slots: f } = u({ strict: !1 });
|
|
11
11
|
return /*#__PURE__*/ s(n, {
|
|
12
12
|
onClick: () => d({ to: a }),
|
|
@@ -18,8 +18,8 @@ function p({ group: e, label: i, to: a, service: c }) {
|
|
|
18
18
|
className: "flex items-center gap-1",
|
|
19
19
|
children: [/*#__PURE__*/ o("p", {
|
|
20
20
|
className: "text-theme-light text-xs leading-5 font-medium",
|
|
21
|
-
children:
|
|
22
|
-
}), /*#__PURE__*/ o(
|
|
21
|
+
children: t
|
|
22
|
+
}), /*#__PURE__*/ o(e, {
|
|
23
23
|
icon: "expandLess",
|
|
24
24
|
size: "16",
|
|
25
25
|
className: "text-theme-high"
|
|
@@ -40,7 +40,7 @@ function p({ group: e, label: i, to: a, service: c }) {
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
function m() {
|
|
43
|
-
let { crumbProject:
|
|
43
|
+
let { crumbProject: e, availableServices: n, projectId: l, description: m } = c({ from: "/_auth/projects/$projectId" }), { i18n: h, _: g } = f(), { slots: _, enabledServices: v } = u({ strict: !1 }), y = (e) => !v || v.includes(e), b = i(n ?? []), x = `/projects/${l}`, S = [];
|
|
44
44
|
return b.image?.glance && y("images") && S.push({
|
|
45
45
|
group: h._({ id: "rp0Bd0" }),
|
|
46
46
|
label: h._({ id: "an5hVd" }),
|
|
@@ -76,19 +76,20 @@ function m() {
|
|
|
76
76
|
label: h._({ id: "miy5mb" }),
|
|
77
77
|
to: `${x}/services/pca`,
|
|
78
78
|
service: "pca"
|
|
79
|
-
}), /*#__PURE__*/ s(
|
|
79
|
+
}), /*#__PURE__*/ s(t, {
|
|
80
80
|
direction: "vertical",
|
|
81
|
-
gap: "6",
|
|
82
|
-
className: "pb-4",
|
|
83
81
|
children: [
|
|
84
82
|
/*#__PURE__*/ o(a, {
|
|
85
|
-
title:
|
|
83
|
+
title: e?.name ?? h._({ id: "e0NrBM" }),
|
|
86
84
|
projectId: l,
|
|
87
85
|
description: m
|
|
88
86
|
}),
|
|
89
|
-
_?.projectOverviewBanner && /*#__PURE__*/ o(
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
_?.projectOverviewBanner && /*#__PURE__*/ o("div", {
|
|
88
|
+
className: "mb-6",
|
|
89
|
+
children: /*#__PURE__*/ o(r, {
|
|
90
|
+
component: _.projectOverviewBanner,
|
|
91
|
+
useShadowDOM: !1
|
|
92
|
+
})
|
|
92
93
|
}),
|
|
93
94
|
S.length > 0 ? /*#__PURE__*/ o("div", {
|
|
94
95
|
className: "grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4",
|
|
@@ -103,4 +104,4 @@ function m() {
|
|
|
103
104
|
//#endregion
|
|
104
105
|
export { m as component };
|
|
105
106
|
|
|
106
|
-
//# sourceMappingURL=_projectId-
|
|
107
|
+
//# sourceMappingURL=_projectId-BdqRntcN.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_projectId-
|
|
1
|
+
{"version":3,"file":"_projectId-BdqRntcN.mjs","names":["useLoaderData","useNavigate","Card","Icon","Stack","getServiceIndex","Trans","useLingui","useRouteContext","ContentHeader","Slot","Route","ServiceCardProps","group","label","to","service","ServiceCard","navigate","slots","strict","serviceBadge","RouteComponent","crumbProject","availableServices","projectId","description","from","t","enabledServices","isEnabled","includes","serviceIndex","base","cards","push","name","projectOverviewBanner","length","map","card","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, useLoaderData, useNavigate } from \"@tanstack/react-router\"\nimport { Card, Icon, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { useRouteContext } from \"@tanstack/react-router\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { Slot } from \"@/client/components/Slot\"\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/\")({\n component: RouteComponent,\n})\n\ninterface ServiceCardProps {\n group: string\n label: string\n to: string\n service: string\n}\n\nfunction ServiceCard({ group, label, to, service }: ServiceCardProps) {\n const navigate = useNavigate()\n const { slots } = useRouteContext({ strict: false })\n\n return (\n <Card\n onClick={() => navigate({ to: to as never })}\n className=\"flex min-h-40 flex-col gap-4 px-3 pt-2 pb-3\"\n data-testid=\"service-card\"\n >\n <div className=\"flex min-w-0 flex-col\">\n <div className=\"flex items-center gap-1\">\n <p className=\"text-theme-light text-xs leading-5 font-medium\">{group}</p>\n <Icon icon=\"expandLess\" size=\"16\" className=\"text-theme-high\" />\n </div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-theme-high text-lg leading-7 font-bold\" data-testid=\"service-card-label\">\n {label}\n </p>\n {slots?.serviceBadge && <Slot component={slots.serviceBadge} useShadowDOM={false} currentService={service} />}\n </div>\n </div>\n <div className=\"flex-1\" />\n </Card>\n )\n}\n\nfunction RouteComponent() {\n const { crumbProject, availableServices, projectId, description } = useLoaderData({\n from: \"/_auth/projects/$projectId\",\n })\n const { t } = useLingui()\n const { slots, enabledServices } = useRouteContext({ strict: false })\n const isEnabled = (service: string) => !enabledServices || enabledServices.includes(service)\n\n const serviceIndex = getServiceIndex(availableServices ?? [])\n const base = `/projects/${projectId}`\n\n const cards: ServiceCardProps[] = []\n\n if (serviceIndex[\"image\"]?.[\"glance\"] && isEnabled(\"images\"))\n cards.push({ group: t`Compute`, label: t`Images`, to: `${base}/compute/images`, service: \"images\" })\n if (serviceIndex[\"compute\"]?.[\"nova\"] && isEnabled(\"flavors\"))\n cards.push({ group: t`Compute`, label: t`Flavors`, to: `${base}/compute/flavors`, service: \"flavors\" })\n if (serviceIndex[\"network\"]) {\n if (isEnabled(\"securitygroups\"))\n cards.push({\n group: t`Network`,\n label: t`Security Groups`,\n to: `${base}/network/securitygroups`,\n service: \"securitygroups\",\n })\n if (isEnabled(\"floatingips\"))\n cards.push({\n group: t`Network`,\n label: t`Floating IPs`,\n to: `${base}/network/floatingips`,\n service: \"floatingips\",\n })\n }\n if (serviceIndex[\"object-store\"]?.[\"swift\"] && isEnabled(\"containers\"))\n cards.push({\n group: t`Storage`,\n label: t`Object Storage (Swift)`,\n to: `${base}/storage/swift/containers`,\n service: \"containers\",\n })\n if (serviceIndex[\"object-store-ceph\"]?.[\"ceph\"] && isEnabled(\"ceph-containers\"))\n cards.push({\n group: t`Storage`,\n label: t`Object Storage (Ceph)`,\n to: `${base}/storage/ceph/buckets`,\n service: \"ceph-containers\",\n })\n if ((serviceIndex[\"pca\"]?.[\"clavis-dev\"] || serviceIndex[\"pca\"]?.[\"clavis-beta\"]) && isEnabled(\"pca\")) {\n cards.push({ group: t`Services`, label: t`PCA (Clavis)`, to: `${base}/services/pca`, service: \"pca\" })\n }\n\n return (\n <Stack direction=\"vertical\">\n <ContentHeader title={crumbProject?.name ?? t`Project`} projectId={projectId} description={description} />\n {slots?.projectOverviewBanner && (\n <div className=\"mb-6\">\n <Slot component={slots.projectOverviewBanner} useShadowDOM={false} />\n </div>\n )}\n {cards.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4\">\n {cards.map((card) => (\n <ServiceCard key={card.to} {...card} />\n ))}\n </div>\n ) : (\n <p className=\"text-theme-light text-sm\">\n <Trans>No services available for this project.</Trans>\n </p>\n )}\n </Stack>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
|
|
2
2
|
var n = e("/_auth/projects/$projectId")({
|
|
3
|
-
component: t(() => import("./_projectId-
|
|
4
|
-
errorComponent: t(() => import("./_projectId-
|
|
3
|
+
component: t(() => import("./_projectId-BCMkaH_h.mjs"), "component"),
|
|
4
|
+
errorComponent: t(() => import("./_projectId-B2cvskLV.mjs"), "errorComponent"),
|
|
5
5
|
loader: async (e) => {
|
|
6
6
|
let { context: t, params: n } = e, r = await t.trpcClient?.auth.setCurrentScope.mutate({
|
|
7
7
|
type: "project",
|
|
@@ -24,4 +24,4 @@ var n = e("/_auth/projects/$projectId")({
|
|
|
24
24
|
//#endregion
|
|
25
25
|
export { n as t };
|
|
26
26
|
|
|
27
|
-
//# sourceMappingURL=_projectId-
|
|
27
|
+
//# sourceMappingURL=_projectId-C8RGOqZb.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_projectId-
|
|
1
|
+
{"version":3,"file":"_projectId-C8RGOqZb.mjs","names":["createFileRoute","Route","component","lazyRouteComponent","$$splitComponentImporter","errorComponent","$$splitErrorComponentImporter","loader","options","context","params","data","trpcClient","auth","setCurrentScope","mutate","type","projectId","availableServices","projects","Promise","all","getAvailableServices","query","project","getAuthProjects","catch","accountId","domain","id","description","find","p","crumbDomain","path","name","crumbProject"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData, useRouteContext } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { buildNavSections } from \"@/client/routes/_auth/projects/-components/buildNavSections\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { useMemo } from \"react\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n\n const [availableServices, projects] = await Promise.all([\n context.trpcClient?.auth.getAvailableServices.query(),\n context.trpcClient?.project.getAuthProjects.query().catch(() => null),\n ])\n\n const accountId = data?.domain?.id || \"\"\n const description = projects?.find((p) => p.id === params.projectId)?.description ?? null\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId,\n projectId: params.projectId,\n description,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject, crumbDomain } = useLoaderData({ from: Route.id })\n const { enabledServices } = useRouteContext({ strict: false })\n\n const sections = useMemo(\n () => buildNavSections(projectId, availableServices!, enabledServices),\n [projectId, availableServices, enabledServices]\n )\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n sections={sections}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n domainName={crumbDomain?.name}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";AAQA,IAAaC,IAAQD,EAAgB,4BAAA,EAA8B;CACjEE,WAASC,6CAAA,WAAA;CACTE,gBAAcF,6CAAA,gBAAA;CAGdI,QAAQ,OAAOC,MAAAA;EACb,IAAM,EAAEC,YAASC,cAAWF,GACtBG,IAAO,MAAMF,EAAQG,YAAYC,KAAKC,gBAAgBC,OAAO;GACjEC,MAAM;GACNC,WAAWP,EAAOO,aAAa;EACjC,CAAA,GAEM,CAACC,GAAmBC,KAAY,MAAMC,QAAQC,IAAI,CACtDZ,EAAQG,YAAYC,KAAKS,qBAAqBC,MAAAA,GAC9Cd,EAAQG,YAAYY,QAAQC,gBAAgBF,MAAAA,EAAQG,YAAY,IAAA,CAAA,CACjE,GAEKC,IAAYhB,GAAMiB,QAAQC,MAAM,IAChCC,IAAcX,GAAUY,MAAMC,MAAMA,EAAEH,OAAOnB,EAAOO,SAAS,GAAGa,eAAe;EAErF,OAAO;GACLlB,YAAYH,EAAQG;GACpBqB,aAAa;IAAEC,MAAM;IAAaC,MAAMxB,GAAMiB,QAAQO;GAAK;GAC3DC,cAAczB,GAAMa;GACpBN;GACAS;GACAV,WAAWP,EAAOO;GAClBa;EACF;CACF;AACF,CAAA"}
|
|
@@ -19,7 +19,7 @@ var i = t("/_auth/projects/$projectId/network/securitygroups/$securityGroupId/")
|
|
|
19
19
|
return { sgTitle: n?.name || n?.id || null };
|
|
20
20
|
},
|
|
21
21
|
head: ({ loaderData: e }) => ({ meta: [{ title: e?.sgTitle ?? "Security Group" }] }),
|
|
22
|
-
component: n(() => import("./_securityGroupId-
|
|
22
|
+
component: n(() => import("./_securityGroupId-DMi7YRux.mjs"), "component"),
|
|
23
23
|
beforeLoad: async ({ context: t, params: n }) => {
|
|
24
24
|
let { trpcClient: i } = t, a = e(await i?.auth.getAvailableServices.query() || []);
|
|
25
25
|
if (!a.network || !a.network.neutron) throw r({
|
|
@@ -31,4 +31,4 @@ var i = t("/_auth/projects/$projectId/network/securitygroups/$securityGroupId/")
|
|
|
31
31
|
//#endregion
|
|
32
32
|
export { i as t };
|
|
33
33
|
|
|
34
|
-
//# sourceMappingURL=_securityGroupId-
|
|
34
|
+
//# sourceMappingURL=_securityGroupId-CyQ3XmpB.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_securityGroupId-
|
|
1
|
+
{"version":3,"file":"_securityGroupId-CyQ3XmpB.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","sg","trpcClient","network","securityGroup","getById","query","project_id","projectId","securityGroupId","sgTitle","name","id","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/securitygroups/$securityGroupId/index.tsx"],"sourcesContent":["import {\n Breadcrumb,\n BreadcrumbItem,\n Button,\n ContentHeading,\n Stack,\n Spinner,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useMemo } from \"react\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { SecurityGroupDetailsView } from \"./-components/SecurityGroupDetailsView\"\nimport { EditSecurityGroupModal } from \"../-components/-modals/EditSecurityGroupModal\"\nimport { useSecurityGroupDetails } from \"./-hooks/useSecurityGroupDetails\"\nimport { useListWithFiltering } from \"@/client/utils/useListWithFiltering\"\nimport { trpcReact } from \"@/client/trpcClient\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/securitygroups/$securityGroupId/\")({\n staticData: {\n section: \"network\",\n service: \"securitygroups\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Network\" },\n crumb: { labelKey: \"Security Groups\", to: \"/projects/$projectId/network/securitygroups\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const sg = await context.trpcClient?.network.securityGroup.getById.query({\n project_id: params.projectId,\n securityGroupId: params.securityGroupId,\n })\n return { sgTitle: sg?.name || sg?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.sgTitle ?? \"Security Group\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect to the \"Projects Overview\" page if network service not available\n if (!serviceIndex[\"network\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/securitygroups\",\n params: { projectId: params.projectId },\n })\n }\n\n if (!serviceIndex[\"network\"][\"neutron\"]) {\n // Redirect to the \"Network Services Overview\" page if the \"Neutron\" service is not available\n throw redirect({\n to: \"/projects/$projectId/network/securitygroups\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { securityGroupId } = Route.useParams()\n const projectId = useProjectId()\n const navigate = useNavigate()\n const { t } = useLingui()\n\n // Rules filtering using the same pattern as List page\n const {\n searchTerm: rulesSearchTerm,\n sortSettings,\n filterSettings,\n handleSearchChange,\n handleSortChange,\n handleFilterChange,\n } = useListWithFiltering<\"direction\" | \"protocol\" | \"description\">({\n defaultSortKey: \"direction\",\n defaultSortDir: \"asc\",\n sortOptions: [\n { label: t`Direction`, value: \"direction\" },\n { label: t`Protocol`, value: \"protocol\" },\n { label: t`Description`, value: \"description\" },\n ],\n filterSettings: {\n filters: [\n {\n displayName: t`Direction`,\n filterName: \"direction\",\n values: [\"ingress\", \"egress\"],\n supportsMultiValue: false,\n },\n {\n displayName: t`Ethertype`,\n filterName: \"ethertype\",\n values: [\"IPv4\", \"IPv6\"],\n supportsMultiValue: false,\n },\n {\n displayName: t`Protocol`,\n filterName: \"protocol\",\n values: [\"tcp\", \"udp\", \"icmp\", \"ipv6-icmp\"],\n supportsMultiValue: false,\n },\n ],\n },\n })\n\n // Group filter controls for the hook\n const filterControls = {\n searchTerm: rulesSearchTerm,\n onSearchChange: handleSearchChange,\n sortSettings,\n onSortChange: handleSortChange,\n filterSettings,\n onFilterChange: handleFilterChange,\n }\n\n // Use custom hook for logic (now includes filtering/sorting)\n const {\n securityGroup,\n filteredAndSortedRules,\n isLoading,\n isError,\n error,\n isUpdating,\n updateError,\n isDeletingRule,\n deleteRuleError,\n isCreatingRule,\n createRuleError,\n editModalOpen,\n handleEdit,\n handleCloseEditModal,\n handleUpdate,\n handleDeleteRule,\n handleCreateRule,\n } = useSecurityGroupDetails({\n securityGroupId,\n filterControls,\n })\n\n // Fetch available security groups for the Add Rule dropdown\n const { data: securityGroups } = trpcReact.network.securityGroup.list.useQuery({ project_id: projectId })\n const availableSecurityGroups = useMemo(() => {\n return (securityGroups || [])\n .filter((sg) => sg.id !== securityGroupId) // Exclude current group\n .map((sg) => ({\n id: sg.id,\n name: sg.name || sg.id,\n }))\n }, [securityGroups, securityGroupId])\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/network/securitygroups\",\n params: { projectId },\n })\n }\n\n // Handle loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Security Group Details...</Trans>\n </Stack>\n )\n }\n\n // Handle error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading security group</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Security Groups</Trans>\n </Button>\n </Stack>\n )\n }\n\n // Handle no data state\n if (!securityGroup) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Security group not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Security Groups</Trans>\n </Button>\n </Stack>\n )\n }\n\n // Render success state\n return (\n <Stack direction=\"vertical\">\n <ContentHeading>{securityGroup.name || securityGroup.id}</ContentHeading>\n <Breadcrumb className=\"my-6\">\n <BreadcrumbItem onClick={handleBack} label={t`Security Groups`} />\n <BreadcrumbItem active label={securityGroup.id} />\n </Breadcrumb>\n\n <SecurityGroupDetailsView\n securityGroup={securityGroup}\n filteredAndSortedRules={filteredAndSortedRules}\n onEdit={handleEdit}\n onDeleteRule={handleDeleteRule}\n isDeletingRule={isDeletingRule}\n deleteRuleError={deleteRuleError}\n filterControls={filterControls}\n onCreateRule={handleCreateRule}\n isCreatingRule={isCreatingRule}\n createRuleError={createRuleError}\n availableSecurityGroups={availableSecurityGroups}\n currentProjectId={projectId}\n />\n\n <EditSecurityGroupModal\n securityGroup={securityGroup}\n open={editModalOpen}\n onClose={handleCloseEditModal}\n onUpdate={handleUpdate}\n isLoading={isUpdating}\n error={updateError}\n />\n </Stack>\n )\n}\n"],"mappings":";;AAoBA,IAAaG,IAAQH,EAAgB,qEAAA,EAAuE;CAC1GI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,UAAU;EACpCC,OAAO;GAAED,UAAU;GAAmBE,IAAI;EAA8C;CAC1F;CACAE,QAAQ,OAAO,EAAEC,YAASC,gBAAQ;EAChC,IAAMC,IAAK,MAAMF,EAAQG,YAAYC,QAAQC,cAAcC,QAAQC,MAAM;GACvEC,YAAYP,EAAOQ;GACnBC,iBAAiBT,EAAOS;EAC1B,CAAA;EACA,OAAO,EAAEC,SAAST,GAAIU,QAAQV,GAAIW,MAAM,KAAK;CAC/C;CACAC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYJ,WAAW,iBAAiB,CAAA,EAC1D;CACAO,WAASC,mDAAA,WAAA;CACTE,YAAY,OAAO,EAAErB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAIjByB,IAAerC,EAFK,MAAOe,GAAYoB,KAAKC,qBAAqBjB,MAAAA,KAAY,CAAA,CAE9Ce;EAUrC,IAPI,CAACG,EAAa,WAOd,CAACA,EAAa,QAAW,SAE3B,MAAMtC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEQ,WAAWR,EAAOQ,UAAU;EACxC,CAAA;CAEJ;AACF,CAAA"}
|