@cobaltcore-dev/aurora 0.2.2 → 0.3.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/AuroraApp.d.ts +10 -0
- package/dist/client/{ContentHeader-DtBiIwRY.mjs → ContentHeader-B_PWrxbw.mjs} +17 -17
- package/dist/client/{ContentHeader-DtBiIwRY.mjs.map → ContentHeader-B_PWrxbw.mjs.map} +1 -1
- package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs → DeleteFlavorModal-BkPrQKyE.mjs} +146 -146
- package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs.map → DeleteFlavorModal-BkPrQKyE.mjs.map} +1 -1
- package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs → EditSecurityGroupModal-ad4uzlt0.mjs} +14 -14
- package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs.map → EditSecurityGroupModal-ad4uzlt0.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs → FloatingIpActionModals-lKMwLuL8.mjs} +51 -51
- package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs.map → FloatingIpActionModals-lKMwLuL8.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs → ImageToastNotifications--U13YiQ_.mjs} +328 -328
- package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs.map → ImageToastNotifications--U13YiQ_.mjs.map} +1 -1
- package/dist/client/{ListToolbar-DuazvsAu.mjs → ListToolbar-C5lzTrit.mjs} +56 -56
- package/dist/client/{ListToolbar-DuazvsAu.mjs.map → ListToolbar-C5lzTrit.mjs.map} +1 -1
- package/dist/client/{RouteError-Cyto623-.mjs → RouteError-iP1Vd6bY.mjs} +2 -2
- package/dist/client/{RouteError-Cyto623-.mjs.map → RouteError-iP1Vd6bY.mjs.map} +1 -1
- package/dist/client/{_flavorId-B-1fYadl.mjs → _flavorId-BaNXUJhA.mjs} +49 -49
- package/dist/client/_flavorId-BaNXUJhA.mjs.map +1 -0
- package/dist/client/{_flavorId-BYfIHIV_.mjs → _flavorId-CnO76tuy.mjs} +10 -10
- package/dist/client/_flavorId-CnO76tuy.mjs.map +1 -0
- package/dist/client/{_floatingIpId-IrnN-ozB.mjs → _floatingIpId-C8G20nNt.mjs} +2 -2
- package/dist/client/{_floatingIpId-IrnN-ozB.mjs.map → _floatingIpId-C8G20nNt.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-FQ5P2qMV.mjs → _floatingIpId-DdKnjdIV.mjs} +36 -36
- package/dist/client/{_floatingIpId-FQ5P2qMV.mjs.map → _floatingIpId-DdKnjdIV.mjs.map} +1 -1
- package/dist/client/{_imageId-Tx_9bqEc.mjs → _imageId-DdSbxFqG.mjs} +135 -135
- package/dist/client/_imageId-DdSbxFqG.mjs.map +1 -0
- package/dist/client/{_pcaId-CFuKY82d.mjs → _pcaId-DFkYJEb5.mjs} +136 -136
- package/dist/client/{_pcaId-CFuKY82d.mjs.map → _pcaId-DFkYJEb5.mjs.map} +1 -1
- package/dist/client/{_pcaId-Bck7S7gJ.mjs → _pcaId-DX_S-3hE.mjs} +2 -2
- package/dist/client/{_pcaId-Bck7S7gJ.mjs.map → _pcaId-DX_S-3hE.mjs.map} +1 -1
- package/dist/client/{_projectId-PSpuCKO7.mjs → _projectId-DYrcZ3E3.mjs} +9 -9
- package/dist/client/{_projectId-PSpuCKO7.mjs.map → _projectId-DYrcZ3E3.mjs.map} +1 -1
- package/dist/client/{_projectId-B1VjDd0Z.mjs → _projectId-Dha4XqX4.mjs} +3 -3
- package/dist/client/{_projectId-B1VjDd0Z.mjs.map → _projectId-Dha4XqX4.mjs.map} +1 -1
- package/dist/client/_projectId-DsSVV2EA.mjs +316 -0
- package/dist/client/_projectId-DsSVV2EA.mjs.map +1 -0
- package/dist/client/{_projectId-Pxp-RXK4.mjs → _projectId-KH5si25Q.mjs} +2 -2
- package/dist/client/{_projectId-Pxp-RXK4.mjs.map → _projectId-KH5si25Q.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-VV2lUcGQ.mjs → _securityGroupId-DgaSqYex.mjs} +2 -2
- package/dist/client/{_securityGroupId-VV2lUcGQ.mjs.map → _securityGroupId-DgaSqYex.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-Dqi6ddw4.mjs → _securityGroupId-O7FXfx0M.mjs} +306 -306
- package/dist/client/{_securityGroupId-Dqi6ddw4.mjs.map → _securityGroupId-O7FXfx0M.mjs.map} +1 -1
- package/dist/client/{about-B2AzqxFI.mjs → about-DN8n8sN8.mjs} +8 -8
- package/dist/client/{about-B2AzqxFI.mjs.map → about-DN8n8sN8.mjs.map} +1 -1
- package/dist/client/{build-Cf7iWbpH.mjs → build-CZRvXrAL.mjs} +1047 -1042
- package/dist/client/{build-Cf7iWbpH.mjs.map → build-CZRvXrAL.mjs.map} +1 -1
- package/dist/client/{constants-CCgR6fKI.mjs → constants-akdIBeTX.mjs} +6 -6
- package/dist/client/{constants-CCgR6fKI.mjs.map → constants-akdIBeTX.mjs.map} +1 -1
- package/dist/client/{containers-BWERuY0O.mjs → containers-BE2QiLBs.mjs} +748 -748
- package/dist/client/{containers-BWERuY0O.mjs.map → containers-BE2QiLBs.mjs.map} +1 -1
- package/dist/client/containers-Cs5vOeR2.mjs.map +1 -1
- package/dist/client/{containers-DovytjVP.mjs → containers-DmwhE9Uz.mjs} +6 -6
- package/dist/client/containers-DmwhE9Uz.mjs.map +1 -0
- package/dist/client/flavors-BXPYAFyQ.mjs.map +1 -1
- package/dist/client/{flavors-CUiALHcB.mjs → flavors-CY7A6--v.mjs} +2 -2
- package/dist/client/{flavors-CUiALHcB.mjs.map → flavors-CY7A6--v.mjs.map} +1 -1
- package/dist/client/{flavors-Bovz-I2U.mjs → flavors-pEcGkCut.mjs} +150 -150
- package/dist/client/{flavors-Bovz-I2U.mjs.map → flavors-pEcGkCut.mjs.map} +1 -1
- package/dist/client/{floatingips-BrjDiY2t.mjs → floatingips-BtL4d4m-.mjs} +118 -118
- package/dist/client/{floatingips-BrjDiY2t.mjs.map → floatingips-BtL4d4m-.mjs.map} +1 -1
- package/dist/client/{images-DaaCUXMI.mjs → images-C19gCFSy.mjs} +389 -389
- package/dist/client/{images-DaaCUXMI.mjs.map → images-C19gCFSy.mjs.map} +1 -1
- package/dist/client/images-DM9I8G0p.mjs.map +1 -1
- package/dist/client/{images-BZP3pBqj.mjs → images-I9gQfRa7.mjs} +2 -2
- package/dist/client/{images-BZP3pBqj.mjs.map → images-I9gQfRa7.mjs.map} +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.js +416 -418
- package/dist/client/index.js.map +1 -1
- package/dist/client/objects-B4yrYf_a.mjs.map +1 -1
- package/dist/client/{objects-D4zBka5e.mjs → objects-BrYe_RaJ.mjs} +6 -6
- package/dist/client/objects-BrYe_RaJ.mjs.map +1 -0
- package/dist/client/{objects-Cw4Vu01M.mjs → objects-DOYFFn3Y.mjs} +1013 -1013
- package/dist/client/{objects-Cw4Vu01M.mjs.map → objects-DOYFFn3Y.mjs.map} +1 -1
- package/dist/client/{overview-2J54-loz.mjs → overview-BjRSFSBh.mjs} +2 -2
- package/dist/client/{overview-2J54-loz.mjs.map → overview-BjRSFSBh.mjs.map} +1 -1
- package/dist/client/{overview-BnmukbFh.mjs → overview-C4gjtc2q.mjs} +7 -7
- package/dist/client/{overview-BnmukbFh.mjs.map → overview-C4gjtc2q.mjs.map} +1 -1
- package/dist/client/{overview-D0AAvsmL.mjs → overview-CmQkJ4Hh.mjs} +2 -2
- package/dist/client/{overview-D0AAvsmL.mjs.map → overview-CmQkJ4Hh.mjs.map} +1 -1
- package/dist/client/{overview-BtIXpYBo.mjs → overview-DTLIAKkJ.mjs} +2 -2
- package/dist/client/{overview-BtIXpYBo.mjs.map → overview-DTLIAKkJ.mjs.map} +1 -1
- package/dist/client/{pca-V2aaOxZA.mjs → pca-CYFJxSZ2.mjs} +70 -70
- package/dist/client/{pca-V2aaOxZA.mjs.map → pca-CYFJxSZ2.mjs.map} +1 -1
- package/dist/client/{pca-BqZycwCu.mjs → pca-DzixU9Dl.mjs} +2 -2
- package/dist/client/{pca-BqZycwCu.mjs.map → pca-DzixU9Dl.mjs.map} +1 -1
- package/dist/client/projects-BsN4bvU2.mjs.map +1 -1
- package/dist/client/{projects-0feOw_b6.mjs → projects-BtyjXGq2.mjs} +2 -2
- package/dist/client/projects-BtyjXGq2.mjs.map +1 -0
- package/dist/client/projects-D3hOC1cy.mjs +95 -0
- package/dist/client/projects-D3hOC1cy.mjs.map +1 -0
- package/dist/client/{projects-jyIHL6DE.mjs → projects-DwVawmll.mjs} +2 -2
- package/dist/client/projects-DwVawmll.mjs.map +1 -0
- package/dist/client/{securitygroups-B4MkSBtI.mjs → securitygroups-DMCIDHQS.mjs} +114 -114
- package/dist/client/{securitygroups-B4MkSBtI.mjs.map → securitygroups-DMCIDHQS.mjs.map} +1 -1
- package/package.json +3 -3
- package/dist/client/_flavorId-B-1fYadl.mjs.map +0 -1
- package/dist/client/_flavorId-BYfIHIV_.mjs.map +0 -1
- package/dist/client/_imageId-Tx_9bqEc.mjs.map +0 -1
- package/dist/client/_projectId-Bs4W9hos.mjs +0 -283
- package/dist/client/_projectId-Bs4W9hos.mjs.map +0 -1
- package/dist/client/containers-DovytjVP.mjs.map +0 -1
- package/dist/client/objects-D4zBka5e.mjs.map +0 -1
- package/dist/client/projects-0feOw_b6.mjs.map +0 -1
- package/dist/client/projects-C1IYOvFQ.mjs +0 -144
- package/dist/client/projects-C1IYOvFQ.mjs.map +0 -1
- package/dist/client/projects-jyIHL6DE.mjs.map +0 -1
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as e, R as t, c as n, h as r } from "./build-CZRvXrAL.mjs";
|
|
2
2
|
import { t as i } from "./helpers--JWXi40U.mjs";
|
|
3
3
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
4
4
|
import { createFileRoute as s, lazyRouteComponent as c, redirect as l } from "@tanstack/react-router";
|
|
5
5
|
import { Trans as u } from "@lingui/react";
|
|
6
6
|
//#region src/client/components/Error/StatusError.tsx
|
|
7
7
|
function d({ message: i, statusCode: s, onHomeClick: c, onBackClick: l, title: d, reset: f }) {
|
|
8
|
-
return /* @__PURE__ */ o(
|
|
8
|
+
return /* @__PURE__ */ o(t, {
|
|
9
9
|
className: "mx-auto flex min-h-full max-w-3xl flex-col items-center justify-center px-6 py-12 sm:px-12 md:px-20",
|
|
10
10
|
children: [
|
|
11
11
|
s && /* @__PURE__ */ a("div", {
|
|
12
12
|
className: "text-theme-high text-6xl font-bold",
|
|
13
13
|
children: s
|
|
14
14
|
}),
|
|
15
|
-
/* @__PURE__ */ a(
|
|
15
|
+
/* @__PURE__ */ a(e, { children: d }),
|
|
16
16
|
/* @__PURE__ */ a("p", { children: i }),
|
|
17
|
-
(l || c || f) && /* @__PURE__ */ o(
|
|
17
|
+
(l || c || f) && /* @__PURE__ */ o(r, {
|
|
18
18
|
className: "mt-6",
|
|
19
19
|
children: [
|
|
20
|
-
l && /* @__PURE__ */ a(
|
|
20
|
+
l && /* @__PURE__ */ a(n, {
|
|
21
21
|
onClick: l,
|
|
22
22
|
variant: "primary",
|
|
23
23
|
children: /* @__PURE__ */ a(u, { id: "iH8pgl" })
|
|
24
24
|
}),
|
|
25
|
-
c && /* @__PURE__ */ a(
|
|
25
|
+
c && /* @__PURE__ */ a(n, {
|
|
26
26
|
onClick: c,
|
|
27
27
|
children: /* @__PURE__ */ a(u, { id: "i0qMbr" })
|
|
28
28
|
}),
|
|
29
|
-
f && /* @__PURE__ */ a(
|
|
29
|
+
f && /* @__PURE__ */ a(n, {
|
|
30
30
|
onClick: f,
|
|
31
31
|
children: /* @__PURE__ */ a(u, { id: "qJb6G2" })
|
|
32
32
|
})
|
|
@@ -51,11 +51,11 @@ var f = s("/_auth/projects/$projectId/compute/flavors/$flavorId")({
|
|
|
51
51
|
flavorId: t.flavorId
|
|
52
52
|
}))?.name ?? null }),
|
|
53
53
|
head: ({ loaderData: e }) => ({ meta: [{ title: e?.flavorName ?? "Flavor Details" }] }),
|
|
54
|
-
component: c(() => import("./_flavorId-
|
|
54
|
+
component: c(() => import("./_flavorId-BaNXUJhA.mjs"), "component"),
|
|
55
55
|
beforeLoad: async ({ context: e, params: t }) => {
|
|
56
56
|
let { trpcClient: n } = e, { projectId: r } = t, a = i(await n?.auth.getAvailableServices.query() || []);
|
|
57
57
|
if (!a.flavor && !a.compute) throw l({
|
|
58
|
-
to: "/projects/$projectId
|
|
58
|
+
to: "/projects/$projectId",
|
|
59
59
|
params: { projectId: r }
|
|
60
60
|
});
|
|
61
61
|
}
|
|
@@ -63,4 +63,4 @@ var f = s("/_auth/projects/$projectId/compute/flavors/$flavorId")({
|
|
|
63
63
|
//#endregion
|
|
64
64
|
export { d as n, f as t };
|
|
65
65
|
|
|
66
|
-
//# sourceMappingURL=_flavorId-
|
|
66
|
+
//# sourceMappingURL=_flavorId-CnO76tuy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_flavorId-CnO76tuy.mjs","names":["Button","ButtonRow","Container","ContentHeading","StatusError","message","statusCode","onHomeClick","onBackClick","title","reset","className","div","p","onClick","variant","createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","flavor","trpcClient","compute","getFlavorById","query","project_id","projectId","flavorId","flavorName","name","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex"],"sources":["../../src/client/components/Error/StatusError.tsx","../../src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx"],"sourcesContent":["import { Button, ButtonRow, Container, ContentHeading } from \"@cloudoperators/juno-ui-components/index\"\nimport { Trans } from \"@lingui/react/macro\"\n\ninterface StatusErrorProps {\n message: string\n statusCode?: number\n onHomeClick?: () => void\n onBackClick?: () => void\n title: string\n showHeader?: boolean\n reset?: () => void\n}\n\nexport function StatusError({ message, statusCode, onHomeClick, onBackClick, title, reset }: StatusErrorProps) {\n return (\n <Container className=\"mx-auto flex min-h-full max-w-3xl flex-col items-center justify-center px-6 py-12 sm:px-12 md:px-20\">\n {statusCode && <div className=\"text-theme-high text-6xl font-bold\">{statusCode}</div>}\n <ContentHeading>{title}</ContentHeading>\n <p>{message}</p>\n {(onBackClick || onHomeClick || reset) && (\n <ButtonRow className=\"mt-6\">\n {onBackClick && (\n <Button onClick={onBackClick} variant=\"primary\">\n <Trans>Back</Trans>\n </Button>\n )}\n {onHomeClick && (\n <Button onClick={onHomeClick}>\n <Trans>Home</Trans>\n </Button>\n )}\n\n {reset && (\n <Button onClick={reset}>\n <Trans>Try Again</Trans>\n </Button>\n )}\n </ButtonRow>\n )}\n </Container>\n )\n}\n","import {\n Button,\n ButtonRow,\n Stack,\n Spinner,\n PopupMenu,\n PopupMenuToggle,\n PopupMenuOptions,\n PopupMenuItem,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { createFileRoute, redirect, useNavigate, useParams } from \"@tanstack/react-router\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { FlavorDetailsView } from \"./-components/FlavorDetailsView\"\nimport { StatusError } from \"@/client/components/Error/StatusError\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport { EditSpecModal } from \"../-components/Flavors/-components/EditSpecModal\"\nimport { ManageAccessModal } from \"../-components/Flavors/-components/ManageAccessModal\"\nimport { DeleteFlavorModal } from \"../-components/Flavors/-components/DeleteFlavorModal\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/flavors/$flavorId\")({\n staticData: {\n section: \"compute\",\n service: \"flavors\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Compute\" },\n crumb: { labelKey: \"Flavors\", to: \"/projects/$projectId/compute/flavors\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const flavor = await context.trpcClient?.compute.getFlavorById.query({\n project_id: params.projectId,\n flavorId: params.flavorId,\n })\n return { flavorName: flavor?.name ?? null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.flavorName ?? \"Flavor Details\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const { projectId } = params\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n\n const serviceIndex = getServiceIndex(availableServices)\n\n if (!serviceIndex[\"flavor\"] && !serviceIndex[\"compute\"]) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { projectId, flavorId } = useParams({\n from: \"/_auth/projects/$projectId/compute/flavors/$flavorId\",\n })\n const { trpcClient } = Route.useRouteContext()\n const navigate = useNavigate()\n const { t } = useLingui()\n const { translateError, isRetryableError } = useErrorTranslation()\n\n const {\n data: flavor,\n status,\n error,\n refetch,\n } = trpcReact.compute.getFlavorById.useQuery({\n project_id: projectId,\n flavorId,\n })\n\n const { data: permissionsData } = trpcReact.compute.canUser.useQuery({\n project_id: projectId,\n permission: [\"flavors:delete\", \"flavors:list_projects\", \"flavor_specs:create\", \"flavor_specs:delete\"],\n })\n\n const canDeleteFlavor = permissionsData?.[0] ?? false\n const canManageAccess = permissionsData?.[1] ?? false\n const canManageSpecs = (permissionsData?.[2] ?? false) || (permissionsData?.[3] ?? false)\n\n const [specModalOpen, toggleSpecModal] = useModal()\n const [accessModalOpen, toggleAccessModal] = useModal()\n const [deleteModalOpen, toggleDeleteModal] = useModal()\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/compute/flavors\",\n params: { projectId },\n })\n }\n\n const handleHome = () => {\n navigate({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n const handleRetry = () => {\n refetch()\n }\n\n if (status === \"pending\") {\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 Flavor Details...</Trans>\n </Stack>\n )\n }\n\n if (status === \"error\") {\n const errorCode = error?.message || \"UNKNOWN_ERROR\"\n const translatedError = translateError(errorCode)\n const canRetry = isRetryableError(errorCode)\n\n const getStatusCode = (code: string): number | undefined => {\n if (code.includes(\"UNAUTHORIZED\")) return 401\n if (code.includes(\"FORBIDDEN\")) return 403\n if (code.includes(\"NOT_FOUND\")) return 404\n if (code.includes(\"SERVER_ERROR\")) return 500\n return undefined\n }\n\n return (\n <StatusError\n message={translatedError}\n statusCode={getStatusCode(errorCode)}\n title={t`Error Loading Flavor`}\n onBackClick={handleBack}\n onHomeClick={handleHome}\n reset={canRetry ? handleRetry : undefined}\n />\n )\n }\n\n if (!flavor) {\n return (\n <StatusError\n message={t`The requested flavor could not be found. It may have been deleted or you may not have access to it.`}\n statusCode={404}\n title={t`Flavor Not Found`}\n onBackClick={handleBack}\n onHomeClick={handleHome}\n />\n )\n }\n\n const hasMoreActions = canManageAccess || canDeleteFlavor\n\n const headerActions =\n hasMoreActions || canManageSpecs ? (\n <ButtonRow>\n {hasMoreActions && (\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button icon=\"moreVert\">\n <Trans>More Actions</Trans>\n </Button>\n </PopupMenuToggle>\n <PopupMenuOptions>\n {canManageAccess && <PopupMenuItem label={t`Manage Access`} onClick={toggleAccessModal} />}\n {canDeleteFlavor && <PopupMenuItem label={t`Delete Flavor`} onClick={toggleDeleteModal} />}\n </PopupMenuOptions>\n </PopupMenu>\n )}\n {canManageSpecs && (\n <Button onClick={toggleSpecModal} variant=\"primary\">\n <Trans>Metadata</Trans>\n </Button>\n )}\n </ButtonRow>\n ) : undefined\n\n return (\n <>\n <ContentHeader title={flavor.name} projectId={projectId} actions={headerActions} />\n <Stack direction=\"vertical\">\n <FlavorDetailsView flavor={flavor} />\n </Stack>\n\n {trpcClient && (\n <>\n {specModalOpen && (\n <EditSpecModal\n client={trpcClient}\n isOpen={specModalOpen}\n onClose={toggleSpecModal}\n project={projectId}\n flavor={flavor}\n />\n )}\n\n {accessModalOpen && (\n <ManageAccessModal\n client={trpcClient}\n isOpen={accessModalOpen}\n onClose={toggleAccessModal}\n project={projectId}\n flavor={flavor}\n />\n )}\n\n {deleteModalOpen && (\n <DeleteFlavorModal\n client={trpcClient}\n isOpen={deleteModalOpen}\n onClose={toggleDeleteModal}\n project={projectId}\n flavor={flavor}\n onSuccess={handleBack}\n />\n )}\n </>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;AAaA,SAAgBI,EAAY,EAAEC,YAASC,eAAYC,gBAAaC,gBAAaC,UAAOC,YAAyB;AAC3G,QACE,kBAACR,GAAAA;EAAUS,WAAU;;GAClBL,KAAc,kBAACM,OAAAA;IAAID,WAAU;cAAsCL;;GACpE,kBAACH,GAAAA,EAAAA,UAAgBM,GAAAA,CAAAA;GACjB,kBAACI,KAAAA,EAAAA,UAAGR,GAAAA,CAAAA;IACFG,KAAeD,KAAeG,MAC9B,kBAACT,GAAAA;IAAUU,WAAU;;KAClBH,KACC,kBAACR,GAAAA;MAAOc,SAASN;MAAaO,SAAQ;gBACpC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;KAGHR,KACC,kBAACP,GAAAA;MAAOc,SAASP;gBACf,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;KAIHG,KACC,kBAACV,GAAAA;MAAOc,SAASJ;gBACf,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;;;;;;ACVd,IAAaS,IAAQH,EAAgB,uDAAA,CAAwD;CAC3FI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,WAAU;EACpCC,OAAO;GAAED,UAAU;GAAWE,IAAI;GAAuC;EAC3E;CACAE,QAAQ,OAAO,EAAEC,YAASC,iBAKjB,EAAES,aAJM,MAAMV,EAAQG,YAAYC,QAAQC,cAAcC,MAAM;EACnEC,YAAYN,EAAOO;EACnBC,UAAUR,EAAOQ;EACnB,CAAA,GAC6BE,QAAQ,MAAK;CAE5CC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYH,cAAc,kBAAiB,CAAC,EAC9D;CACAM,WAASC,4CAAA,YAAA;CACTE,YAAY,OAAO,EAAEnB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GACjB,EAAEQ,iBAAcP,GAIhBsB,IAAenC,EAFK,MAAOe,GAAYkB,KAAKC,qBAAqBhB,OAAAA,IAAY,EAAE,CAEhDc;AAErC,MAAI,CAACG,EAAa,UAAa,CAACA,EAAa,QAC3C,OAAMpC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,cAAU;GACtB,CAAA;;CAGN,CAAA"}
|
|
@@ -16,7 +16,7 @@ var i = t("/_auth/projects/$projectId/network/floatingips/$floatingIpId/")({
|
|
|
16
16
|
floatingip_id: t.floatingIpId
|
|
17
17
|
}))?.floating_ip_address ?? null }),
|
|
18
18
|
head: ({ loaderData: e }) => ({ meta: [{ title: e?.floatingIpAddress ?? "Floating IP" }] }),
|
|
19
|
-
component: n(() => import("./_floatingIpId-
|
|
19
|
+
component: n(() => import("./_floatingIpId-DdKnjdIV.mjs"), "component"),
|
|
20
20
|
beforeLoad: async ({ context: t, params: n }) => {
|
|
21
21
|
let { trpcClient: i } = t, a = e(await i?.auth.getAvailableServices.query() || []);
|
|
22
22
|
if (!a.network || !a.network.neutron) throw r({
|
|
@@ -28,4 +28,4 @@ var i = t("/_auth/projects/$projectId/network/floatingips/$floatingIpId/")({
|
|
|
28
28
|
//#endregion
|
|
29
29
|
export { i as t };
|
|
30
30
|
|
|
31
|
-
//# sourceMappingURL=_floatingIpId-
|
|
31
|
+
//# sourceMappingURL=_floatingIpId-C8G20nNt.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_floatingIpId-
|
|
1
|
+
{"version":3,"file":"_floatingIpId-C8G20nNt.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","floatingIp","trpcClient","network","getById","query","project_id","projectId","floatingip_id","floatingIpId","floatingIpAddress","floating_ip_address","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Button, ContentHeading, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { FloatingIpDetailsView } from \"./-components/-details/FloatingIpDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/floatingips/$floatingIpId/\")({\n staticData: {\n section: \"network\",\n service: \"floatingips\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Network\" },\n crumb: { labelKey: \"Floating IPs\", to: \"/projects/$projectId/network/floatingips\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const floatingIp = await context.trpcClient?.network.floatingIp.getById.query({\n project_id: params.projectId,\n floatingip_id: params.floatingIpId,\n })\n return { floatingIpAddress: floatingIp?.floating_ip_address ?? null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.floatingIpAddress ?? \"Floating IP\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect if network service not available\n if (!serviceIndex[\"network\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n\n if (!serviceIndex[\"network\"][\"neutron\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { floatingIpId } = Route.useParams()\n const projectId = useProjectId()\n const navigate = useNavigate()\n\n // Fetch floating IP details\n const {\n data: floatingIp,\n isLoading,\n isError,\n error,\n } = trpcReact.network.floatingIp.getById.useQuery({\n project_id: projectId,\n floatingip_id: floatingIpId,\n })\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId },\n })\n }\n\n // 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 Floating IP Details...</Trans>\n </Stack>\n )\n }\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\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 floating IP</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!floatingIp) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Floating IP not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // Success state\n return (\n <>\n <ContentHeading>{floatingIp.floating_ip_address}</ContentHeading>\n <FloatingIpDetailsView floatingIp={floatingIp} />\n </>\n )\n}\n"],"mappings":";;AASA,IAAaG,IAAQH,EAAgB,gEAAA,CAAiE;CACpGI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,WAAU;EACpCC,OAAO;GAAED,UAAU;GAAgBE,IAAI;GAA2C;EACpF;CACAE,QAAQ,OAAO,EAAEC,YAASC,iBAKjB,EAAEU,oBAJU,MAAMX,EAAQG,YAAYC,QAAQF,WAAWG,QAAQC,MAAM;EAC5EC,YAAYN,EAAOO;EACnBC,eAAeR,EAAOS;EACxB,CAAA,GACwCE,uBAAuB,MAAK;CAEtEC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYH,qBAAqB,eAAc,CAAC,EAClE;CACAM,WAASC,gDAAA,YAAA;CACTE,YAAY,OAAO,EAAEpB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAGjBwB,IAAepC,EADK,MAAOe,GAAYmB,KAAKC,qBAAqBjB,OAAAA,IAAY,EAAE,CAChDe;AAUrC,MAPI,CAACG,EAAa,WAOd,CAACA,EAAa,QAAW,QAC3B,OAAMrC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,WAAWP,EAAOO,WAAU;GACxC,CAAA;;CAGN,CAAA"}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as e, I as t, M as n, U as r, Z as i, c as a, h as o, tt as s } from "./build-CZRvXrAL.mjs";
|
|
2
2
|
import { r as c } from "./trpcClient-BxguzNYF.mjs";
|
|
3
|
-
import { t as l } from "./_floatingIpId-
|
|
3
|
+
import { t as l } from "./_floatingIpId-C8G20nNt.mjs";
|
|
4
4
|
import { t as u } from "./useProjectId-CgOTejka.mjs";
|
|
5
5
|
import "./hooks-D0krAKvo.mjs";
|
|
6
|
-
import { t as d } from "./FloatingIpActionModals-
|
|
6
|
+
import { t as d } from "./FloatingIpActionModals-lKMwLuL8.mjs";
|
|
7
7
|
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
8
8
|
import { Fragment as h } from "react";
|
|
9
9
|
import { useNavigate as g } from "@tanstack/react-router";
|
|
10
10
|
import { Trans as _, useLingui as v } from "@lingui/react";
|
|
11
11
|
//#region src/client/utils/formatFloatingIpStatus.ts
|
|
12
|
-
var y = (e) => e.charAt(0) + e.slice(1).toLowerCase(), b = ({ items:
|
|
13
|
-
let
|
|
14
|
-
return /* @__PURE__ */ m(
|
|
12
|
+
var y = (e) => e.charAt(0) + e.slice(1).toLowerCase(), b = ({ items: e }) => {
|
|
13
|
+
let i = Math.ceil(e.length / 2), a = e.slice(0, i), o = e.slice(i);
|
|
14
|
+
return /* @__PURE__ */ m(s, {
|
|
15
15
|
gap: "6",
|
|
16
16
|
className: "grid grid-cols-2",
|
|
17
|
-
children: [/* @__PURE__ */ p(
|
|
17
|
+
children: [/* @__PURE__ */ p(r, {
|
|
18
18
|
alignTerms: "right",
|
|
19
|
-
children: a.map(({ label: e, value:
|
|
20
|
-
}), /* @__PURE__ */ p(
|
|
19
|
+
children: a.map(({ label: e, value: r }) => /* @__PURE__ */ m(h, { children: [/* @__PURE__ */ p(n, { children: e }), /* @__PURE__ */ p(t, { children: r })] }, e))
|
|
20
|
+
}), /* @__PURE__ */ p(r, {
|
|
21
21
|
alignTerms: "right",
|
|
22
|
-
children:
|
|
22
|
+
children: o.map(({ label: e, value: r }) => /* @__PURE__ */ m(h, { children: [/* @__PURE__ */ p(n, { children: e }), /* @__PURE__ */ p(t, { children: r })] }, e))
|
|
23
23
|
})]
|
|
24
24
|
});
|
|
25
25
|
}, x = ({ floatingIp: t }) => {
|
|
26
|
-
let { i18n: n, _:
|
|
26
|
+
let { i18n: n, _: r } = v(), i = [
|
|
27
27
|
{
|
|
28
28
|
label: n._({ id: "S0kLOH" }),
|
|
29
29
|
value: t.id
|
|
@@ -115,44 +115,44 @@ var y = (e) => e.charAt(0) + e.slice(1).toLowerCase(), b = ({ items: n }) => {
|
|
|
115
115
|
}),
|
|
116
116
|
/* @__PURE__ */ p(d, {
|
|
117
117
|
floatingIp: t,
|
|
118
|
-
children: ({ toggleEditModal: e, toggleAttachModal: t, toggleDetachModal: r, toggleReleaseModal: i }) => /* @__PURE__ */ m(
|
|
119
|
-
/* @__PURE__ */ p(
|
|
118
|
+
children: ({ toggleEditModal: e, toggleAttachModal: t, toggleDetachModal: r, toggleReleaseModal: i }) => /* @__PURE__ */ m(o, { children: [
|
|
119
|
+
/* @__PURE__ */ p(a, {
|
|
120
120
|
onClick: e,
|
|
121
121
|
children: n._({ id: "n22YIM" })
|
|
122
122
|
}),
|
|
123
|
-
/* @__PURE__ */ p(
|
|
123
|
+
/* @__PURE__ */ p(a, {
|
|
124
124
|
onClick: t,
|
|
125
125
|
children: n._({ id: "igVDFt" })
|
|
126
126
|
}),
|
|
127
|
-
/* @__PURE__ */ p(
|
|
127
|
+
/* @__PURE__ */ p(a, {
|
|
128
128
|
onClick: r,
|
|
129
129
|
children: n._({ id: "FOcBn3" })
|
|
130
130
|
}),
|
|
131
|
-
/* @__PURE__ */ p(
|
|
131
|
+
/* @__PURE__ */ p(a, {
|
|
132
132
|
onClick: i,
|
|
133
133
|
children: n._({ id: "H+a5j6" })
|
|
134
134
|
})
|
|
135
135
|
] })
|
|
136
136
|
}),
|
|
137
|
-
/* @__PURE__ */ m(
|
|
137
|
+
/* @__PURE__ */ m(s, {
|
|
138
138
|
direction: "vertical",
|
|
139
139
|
gap: "6",
|
|
140
140
|
className: "my-6",
|
|
141
141
|
children: [
|
|
142
|
-
/* @__PURE__ */ m(
|
|
142
|
+
/* @__PURE__ */ m(s, {
|
|
143
143
|
direction: "vertical",
|
|
144
144
|
gap: "2",
|
|
145
|
-
children: [/* @__PURE__ */ p(
|
|
145
|
+
children: [/* @__PURE__ */ p(e, { children: /* @__PURE__ */ p(_, { id: "SuX2Ca" }) }), /* @__PURE__ */ p(b, { items: i })]
|
|
146
146
|
}),
|
|
147
|
-
/* @__PURE__ */ m(
|
|
147
|
+
/* @__PURE__ */ m(s, {
|
|
148
148
|
direction: "vertical",
|
|
149
149
|
gap: "2",
|
|
150
|
-
children: [/* @__PURE__ */ p(
|
|
150
|
+
children: [/* @__PURE__ */ p(e, { children: /* @__PURE__ */ p(_, { id: "jKopCP" }) }), /* @__PURE__ */ p(b, { items: c })]
|
|
151
151
|
}),
|
|
152
|
-
/* @__PURE__ */ m(
|
|
152
|
+
/* @__PURE__ */ m(s, {
|
|
153
153
|
direction: "vertical",
|
|
154
154
|
gap: "2",
|
|
155
|
-
children: [/* @__PURE__ */ p(
|
|
155
|
+
children: [/* @__PURE__ */ p(e, { children: /* @__PURE__ */ p(_, { id: "5M4Te3" }) }), /* @__PURE__ */ p(b, { items: l })]
|
|
156
156
|
})
|
|
157
157
|
]
|
|
158
158
|
})
|
|
@@ -161,29 +161,29 @@ var y = (e) => e.charAt(0) + e.slice(1).toLowerCase(), b = ({ items: n }) => {
|
|
|
161
161
|
//#endregion
|
|
162
162
|
//#region src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/index.tsx?tsr-split=component
|
|
163
163
|
function S() {
|
|
164
|
-
let { floatingIpId: t } = l.useParams(),
|
|
165
|
-
project_id:
|
|
164
|
+
let { floatingIpId: t } = l.useParams(), n = u(), r = g(), { data: o, isLoading: d, isError: h, error: v } = c.network.floatingIp.getById.useQuery({
|
|
165
|
+
project_id: n,
|
|
166
166
|
floatingip_id: t
|
|
167
167
|
}), y = () => {
|
|
168
|
-
|
|
168
|
+
r({
|
|
169
169
|
to: "/projects/$projectId/network/floatingips",
|
|
170
|
-
params: { projectId:
|
|
170
|
+
params: { projectId: n }
|
|
171
171
|
});
|
|
172
172
|
};
|
|
173
|
-
if (d) return /* @__PURE__ */ m(
|
|
173
|
+
if (d) return /* @__PURE__ */ m(s, {
|
|
174
174
|
className: "fixed inset-0",
|
|
175
175
|
distribution: "center",
|
|
176
176
|
alignment: "center",
|
|
177
177
|
direction: "vertical",
|
|
178
|
-
children: [/* @__PURE__ */ p(
|
|
178
|
+
children: [/* @__PURE__ */ p(i, {
|
|
179
179
|
variant: "primary",
|
|
180
180
|
size: "large",
|
|
181
181
|
className: "mb-2"
|
|
182
182
|
}), /* @__PURE__ */ p(_, { id: "VLI9eO" })]
|
|
183
183
|
});
|
|
184
184
|
if (h) {
|
|
185
|
-
let
|
|
186
|
-
return /* @__PURE__ */ m(
|
|
185
|
+
let e = v?.message || "Unknown error";
|
|
186
|
+
return /* @__PURE__ */ m(s, {
|
|
187
187
|
className: "fixed inset-0",
|
|
188
188
|
distribution: "center",
|
|
189
189
|
alignment: "center",
|
|
@@ -196,9 +196,9 @@ function S() {
|
|
|
196
196
|
}),
|
|
197
197
|
/* @__PURE__ */ p("p", {
|
|
198
198
|
className: "text-theme-highest",
|
|
199
|
-
children:
|
|
199
|
+
children: e
|
|
200
200
|
}),
|
|
201
|
-
/* @__PURE__ */ p(
|
|
201
|
+
/* @__PURE__ */ p(a, {
|
|
202
202
|
onClick: y,
|
|
203
203
|
variant: "primary",
|
|
204
204
|
children: /* @__PURE__ */ p(_, { id: "z1JceR" })
|
|
@@ -206,7 +206,7 @@ function S() {
|
|
|
206
206
|
]
|
|
207
207
|
});
|
|
208
208
|
}
|
|
209
|
-
return o ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(
|
|
209
|
+
return o ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(e, { children: o.floating_ip_address }), /* @__PURE__ */ p(x, { floatingIp: o })] }) : /* @__PURE__ */ m(s, {
|
|
210
210
|
className: "fixed inset-0",
|
|
211
211
|
distribution: "center",
|
|
212
212
|
alignment: "center",
|
|
@@ -215,7 +215,7 @@ function S() {
|
|
|
215
215
|
children: [/* @__PURE__ */ p("p", {
|
|
216
216
|
className: "text-theme-secondary",
|
|
217
217
|
children: /* @__PURE__ */ p(_, { id: "ChOuUj" })
|
|
218
|
-
}), /* @__PURE__ */ p(
|
|
218
|
+
}), /* @__PURE__ */ p(a, {
|
|
219
219
|
onClick: y,
|
|
220
220
|
variant: "primary",
|
|
221
221
|
children: /* @__PURE__ */ p(_, { id: "z1JceR" })
|
|
@@ -225,4 +225,4 @@ function S() {
|
|
|
225
225
|
//#endregion
|
|
226
226
|
export { S as component };
|
|
227
227
|
|
|
228
|
-
//# sourceMappingURL=_floatingIpId-
|
|
228
|
+
//# sourceMappingURL=_floatingIpId-DdKnjdIV.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_floatingIpId-FQ5P2qMV.mjs","names":["formatFloatingIpStatus","status","charAt","slice","toLowerCase","Fragment","DescriptionDefinition","DescriptionList","DescriptionTerm","Stack","TwoColumnDescriptionList","items","mid","Math","ceil","length","firstColumn","slice","secondColumn","gap","className","alignTerms","map","label","value","Stack","ButtonRow","Button","ContentHeading","formatFloatingIpStatus","TwoColumnDescriptionList","FloatingIpActionModals","FloatingIpDetailsView","floatingIp","useLingui","basicInfoItems","label","t","value","id","description","project_id","status","created_at","Date","toLocaleString","updated_at","tags","join","networkRoutingItems","floating_ip_address","floating_network_id","fixed_ip_address","port_details","name","mac_address","network_id","device_owner","device_id","router_id","port_id","qos_policy_id","port_forwardings","map","port","dnsItems","dns_domain","dns_name","p","className","toggleEditModal","toggleAttachModal","toggleDetachModal","toggleReleaseModal","onClick","direction","gap","items","useNavigate","Button","ContentHeading","Stack","Spinner","Trans","useProjectId","trpcReact","FloatingIpDetailsView","Route","RouteComponent","floatingIpId","useParams","projectId","navigate","data","floatingIp","isLoading","isError","error","network","getById","useQuery","project_id","floatingip_id","handleBack","to","params","errorMessage","message","floating_ip_address","component"],"sources":["../../src/client/utils/formatFloatingIpStatus.ts","../../src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/-components/TwoColumnDescriptionList.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/-components/-details/FloatingIpDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/index.tsx?tsr-split=component"],"sourcesContent":["import type { FloatingIpStatus } from \"@/server/Network/types/floatingIp\"\n\n/**\n * Formats a floating IP status value from uppercase enum to title case.\n * Example: \"ACTIVE\" → \"Active\", \"DOWN\" → \"Down\", \"ERROR\" → \"Error\"\n */\nexport const formatFloatingIpStatus = (status: FloatingIpStatus) => {\n return status.charAt(0) + status.slice(1).toLowerCase()\n}\n","import { Fragment } from \"react\"\nimport { DescriptionDefinition, DescriptionList, DescriptionTerm, Stack } from \"@cloudoperators/juno-ui-components\"\n\nexport type DetailListItem = {\n label: string\n value: string\n}\n\ninterface TwoColumnDescriptionListProps {\n items: DetailListItem[]\n}\n\nexport const TwoColumnDescriptionList = ({ items }: TwoColumnDescriptionListProps) => {\n const mid = Math.ceil(items.length / 2)\n const firstColumn = items.slice(0, mid)\n const secondColumn = items.slice(mid)\n\n return (\n <Stack gap=\"6\" className=\"grid grid-cols-2\">\n <DescriptionList alignTerms=\"right\">\n {firstColumn.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n\n <DescriptionList alignTerms=\"right\">\n {secondColumn.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n </Stack>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Stack, ButtonRow, Button, ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport type { FloatingIp } from \"@/server/Network/types/floatingIp\"\nimport { formatFloatingIpStatus } from \"@/client/utils/formatFloatingIpStatus\"\nimport { DetailListItem, TwoColumnDescriptionList } from \"../TwoColumnDescriptionList\"\nimport { FloatingIpActionModals } from \"../../../-components/-modals/FloatingIpActionModals\"\n\ninterface FloatingIpDetailsViewProps {\n floatingIp: FloatingIp\n}\n\nexport const FloatingIpDetailsView = ({ floatingIp }: FloatingIpDetailsViewProps) => {\n const { t } = useLingui()\n\n const basicInfoItems: DetailListItem[] = [\n { label: t`ID`, value: floatingIp.id },\n { label: t`Description`, value: floatingIp.description || `—` },\n { label: t`Project ID`, value: floatingIp.project_id || `—` },\n { label: t`Status`, value: formatFloatingIpStatus(floatingIp.status) },\n { label: t`Created At`, value: floatingIp.created_at ? new Date(floatingIp.created_at).toLocaleString() : `—` },\n { label: t`Updated At`, value: floatingIp.updated_at ? new Date(floatingIp.updated_at).toLocaleString() : `—` },\n { label: t`Tags`, value: floatingIp.tags?.join(\", \") || `—` },\n ]\n\n const networkRoutingItems: DetailListItem[] = [\n { label: t`Floating IP Address`, value: floatingIp.floating_ip_address || `—` },\n { label: t`Floating Network`, value: floatingIp.floating_network_id || `—` },\n { label: t`Fixed IP Address`, value: floatingIp.fixed_ip_address || `—` },\n { label: t`Port Name`, value: floatingIp.port_details?.name || `—` },\n { label: t`MAC Address`, value: floatingIp.port_details?.mac_address || `—` },\n { label: t`Network ID`, value: floatingIp.port_details?.network_id || `—` },\n { label: t`Device Owner`, value: floatingIp.port_details?.device_owner || `—` },\n { label: t`Device ID`, value: floatingIp.port_details?.device_id || `—` },\n { label: t`Router ID`, value: floatingIp.router_id || `—` },\n { label: t`Port ID`, value: floatingIp.port_id || `—` },\n { label: t`QoS Policy ID`, value: floatingIp.qos_policy_id || `—` },\n { label: t`Port Forwarding`, value: floatingIp.port_forwardings?.map((port) => port.id).join(\", \") || `—` },\n ]\n\n const dnsItems: DetailListItem[] = [\n { label: t`DNS Domain`, value: floatingIp.dns_domain || `—` },\n { label: t`DNS Name`, value: floatingIp.dns_name || `—` },\n ]\n\n return (\n <>\n <p className=\"text-theme-secondary mt-2 text-sm\">\n <Trans>\n Full lifecycle management of Floating IPs, including attachment, port association/disassociation, DNS\n settings, and deletion\n </Trans>\n </p>\n\n <FloatingIpActionModals floatingIp={floatingIp}>\n {({ toggleEditModal, toggleAttachModal, toggleDetachModal, toggleReleaseModal }) => (\n <ButtonRow>\n <Button onClick={toggleEditModal}>{t`Edit Description`}</Button>\n <Button onClick={toggleAttachModal}>{t`Attach`}</Button>\n <Button onClick={toggleDetachModal}>{t`Detach`}</Button>\n <Button onClick={toggleReleaseModal}>{t`Release`}</Button>\n </ButtonRow>\n )}\n </FloatingIpActionModals>\n\n <Stack direction=\"vertical\" gap=\"6\" className=\"my-6\">\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>Basic Info</Trans>\n </ContentHeading>\n <TwoColumnDescriptionList items={basicInfoItems} />\n </Stack>\n\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>Network & Routing</Trans>\n </ContentHeading>\n <TwoColumnDescriptionList items={networkRoutingItems} />\n </Stack>\n\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>DNS</Trans>\n </ContentHeading>\n <TwoColumnDescriptionList items={dnsItems} />\n </Stack>\n </Stack>\n </>\n )\n}\n","import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Button, ContentHeading, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { FloatingIpDetailsView } from \"./-components/-details/FloatingIpDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/floatingips/$floatingIpId/\")({\n staticData: {\n section: \"network\",\n service: \"floatingips\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Network\" },\n crumb: { labelKey: \"Floating IPs\", to: \"/projects/$projectId/network/floatingips\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const floatingIp = await context.trpcClient?.network.floatingIp.getById.query({\n project_id: params.projectId,\n floatingip_id: params.floatingIpId,\n })\n return { floatingIpAddress: floatingIp?.floating_ip_address ?? null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.floatingIpAddress ?? \"Floating IP\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect if network service not available\n if (!serviceIndex[\"network\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n\n if (!serviceIndex[\"network\"][\"neutron\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { floatingIpId } = Route.useParams()\n const projectId = useProjectId()\n const navigate = useNavigate()\n\n // Fetch floating IP details\n const {\n data: floatingIp,\n isLoading,\n isError,\n error,\n } = trpcReact.network.floatingIp.getById.useQuery({\n project_id: projectId,\n floatingip_id: floatingIpId,\n })\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId },\n })\n }\n\n // 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 Floating IP Details...</Trans>\n </Stack>\n )\n }\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\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 floating IP</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!floatingIp) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Floating IP not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // Success state\n return (\n <>\n <ContentHeading>{floatingIp.floating_ip_address}</ContentHeading>\n <FloatingIpDetailsView floatingIp={floatingIp} />\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;AAMA,IAAaA,KAA0BC,MAC9BA,EAAOC,OAAO,EAAA,GAAKD,EAAOE,MAAM,EAAA,CAAGC,aAAW,ECK1CM,KAA4B,EAAEC,eAAsC;CAC/E,IAAMC,IAAMC,KAAKC,KAAKH,EAAMI,SAAS,EAAA,EAC/BC,IAAcL,EAAMM,MAAM,GAAGL,EAAAA,EAC7BM,IAAeP,EAAMM,MAAML,EAAAA;AAEjC,QACE,kBAACH,GAAAA;EAAMU,KAAI;EAAIC,WAAU;aACvB,kBAACb,GAAAA;GAAgBc,YAAW;aACzBL,EAAYM,KAAK,EAAEC,UAAOC,eACzB,kBAACnB,GAAAA,EAAAA,UAAAA,CACC,kBAACG,GAAAA,EAAAA,UAAiBe,GAAAA,CAAAA,EAClB,kBAACjB,GAAAA,EAAAA,UAAuBkB,GAAAA,CAAAA,CAAAA,EAAAA,EAFXD,EAAAA,CAAAA;MAOnB,kBAAChB,GAAAA;GAAgBc,YAAW;aACzBH,EAAaI,KAAK,EAAEC,UAAOC,eAC1B,kBAACnB,GAAAA,EAAAA,UAAAA,CACC,kBAACG,GAAAA,EAAAA,UAAiBe,GAAAA,CAAAA,EAClB,kBAACjB,GAAAA,EAAAA,UAAuBkB,GAAAA,CAAAA,CAAAA,EAAAA,EAFXD,EAAAA,CAAAA;;;GCnBZS,KAAyB,EAAEC,oBAAwC;CAC9E,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EAERC,IAAmC;EACvC;GAAEC,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAG,CAAA;GAAGC,OAAOL,EAAWM;GAAG;EACrC;GAAEH,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAY,CAAA;GAAGC,OAAOL,EAAWO,eAAe;GAAI;EAC9D;GAAEJ,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA;GAAGC,OAAOL,EAAWQ,cAAc;GAAI;EAC5D;GAAEL,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAO,CAAA;GAAGC,OAAOT,EAAuBI,EAAWS,OAAM;GAAE;EACrE;GAAEN,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA;GAAGC,OAAOL,EAAWU,aAAa,IAAIC,KAAKX,EAAWU,WAAU,CAAEE,gBAAc,GAAK;GAAI;EAC9G;GAAET,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA;GAAGC,OAAOL,EAAWa,aAAa,IAAIF,KAAKX,EAAWa,WAAU,CAAED,gBAAc,GAAK;GAAI;EAC9G;GAAET,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAK,CAAA;GAAGC,OAAOL,EAAWc,MAAMC,KAAK,KAAA,IAAS;GAAI;EAC7D,EAEKC,IAAwC;EAC5C;GAAEb,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAoB,CAAA;GAAGC,OAAOL,EAAWiB,uBAAuB;GAAI;EAC9E;GAAEd,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAiB,CAAA;GAAGC,OAAOL,EAAWkB,uBAAuB;GAAI;EAC3E;GAAEf,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAiB,CAAA;GAAGC,OAAOL,EAAWmB,oBAAoB;GAAI;EACxE;GAAEhB,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;GAAGC,OAAOL,EAAWoB,cAAcC,QAAQ;GAAI;EACnE;GAAElB,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAY,CAAA;GAAGC,OAAOL,EAAWoB,cAAcE,eAAe;GAAI;EAC5E;GAAEnB,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA;GAAGC,OAAOL,EAAWoB,cAAcG,cAAc;GAAI;EAC1E;GAAEpB,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAa,CAAA;GAAGC,OAAOL,EAAWoB,cAAcI,gBAAgB;GAAI;EAC9E;GAAErB,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;GAAGC,OAAOL,EAAWoB,cAAcK,aAAa;GAAI;EACxE;GAAEtB,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;GAAGC,OAAOL,EAAW0B,aAAa;GAAI;EAC1D;GAAEvB,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAQ,CAAA;GAAGC,OAAOL,EAAW2B,WAAW;GAAI;EACtD;GAAExB,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAc,CAAA;GAAGC,OAAOL,EAAW4B,iBAAiB;GAAI;EAClE;GAAEzB,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAgB,CAAA;GAAGC,OAAOL,EAAW6B,kBAAkBC,KAAKC,MAASA,EAAKzB,GAAE,CAAES,KAAK,KAAA,IAAS;GAAI;EAC3G,EAEKiB,IAA6B,CACjC;EAAE7B,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA;EAAGC,OAAOL,EAAWiC,cAAc;EAAI,EAC5D;EAAE9B,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAS,CAAA;EAAGC,OAAOL,EAAWkC,YAAY;EAAI,CACzD;AAED,QACE,kBAAA,GAAA,EAAA,UAAA;EACE,kBAACC,KAAAA;GAAEC,WAAU;aACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;EAMF,kBAACtC,GAAAA;GAAmCE;cAChC,EAAEqC,oBAAiBC,sBAAmBC,sBAAmBC,4BACzD,kBAAC/C,GAAAA,EAAAA,UAAAA;IACC,kBAACC,GAAAA;KAAO+C,SAASJ;eAAkBjC,EAAAA,EAAC,EAAA,IAAA,UAAiB,CAAA;;IACrD,kBAACV,GAAAA;KAAO+C,SAASH;eAAoBlC,EAAAA,EAAC,EAAA,IAAA,UAAO,CAAA;;IAC7C,kBAACV,GAAAA;KAAO+C,SAASF;eAAoBnC,EAAAA,EAAC,EAAA,IAAA,UAAO,CAAA;;IAC7C,kBAACV,GAAAA;KAAO+C,SAASD;eAAqBpC,EAAAA,EAAC,EAAA,IAAA,UAAQ,CAAA;;;;EAKrD,kBAACZ,GAAAA;GAAMkD,WAAU;GAAWC,KAAI;GAAIP,WAAU;;IAC5C,kBAAC5C,GAAAA;KAAMkD,WAAU;KAAWC,KAAI;gBAC9B,kBAAChD,GAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAEF,kBAACE,GAAAA,EAAyB+C,OAAO1C,GAAAA,CAAAA,CAAAA;;IAGnC,kBAACV,GAAAA;KAAMkD,WAAU;KAAWC,KAAI;gBAC9B,kBAAChD,GAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAEF,kBAACE,GAAAA,EAAyB+C,OAAO5B,GAAAA,CAAAA,CAAAA;;IAGnC,kBAACxB,GAAAA;KAAMkD,WAAU;KAAWC,KAAI;gBAC9B,kBAAChD,GAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAEF,kBAACE,GAAAA,EAAyB+C,OAAOZ,GAAAA,CAAAA,CAAAA;;;;;;;;AChC3C,SAASuB,IAAAA;CACP,IAAM,EAAEC,oBAAiBF,EAAMG,WAAS,EAClCC,IAAYP,GAAAA,EACZQ,IAAWd,GAAAA,EAGX,EACJe,MAAMC,GACNC,cACAC,YACAC,aACEZ,EAAUa,QAAQJ,WAAWK,QAAQC,SAAS;EAChDC,YAAYV;EACZW,eAAeb;EACjB,CAAA,EAEMc,UAAaA;AACjBX,IAAS;GACPY,IAAI;GACJC,QAAQ,EAAEd,cAAU;GACtB,CAAA;;AAIF,KAAII,EACF,QACE,kBAAC,GAAA;EAAM,WAAU;EAAgB,cAAa;EAAS,WAAU;EAAS,WAAU;aAClF,kBAAC,GAAA;GAAQ,SAAQ;GAAU,MAAK;GAAQ,WAAU;MAClD,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,CAAA;;AAMN,KAAIC,GAAS;EACX,IAAMU,IAAeT,GAAOU,WAAW;AACvC,SACE,kBAAC,GAAA;GAAM,WAAU;GAAgB,cAAa;GAAS,WAAU;GAAS,WAAU;GAAW,KAAI;;IACjG,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eAAsBD;;IACnC,kBAAC,GAAA;KAAO,SAASH;KAAY,SAAQ;eACnC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;;;;AAqBR,QAdKT,IAeH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAA,EAAA,UAAgBA,EAAWc,qBAAAA,CAAAA,EAC5B,kBAAC,GAAA,EAAkCd,eAAAA,CAAAA,CAAAA,EAAAA,CAAAA,GAfnC,kBAAC,GAAA;EAAM,WAAU;EAAgB,cAAa;EAAS,WAAU;EAAS,WAAU;EAAW,KAAI;aACjG,kBAAC,KAAA;GAAE,WAAU;aACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;MAEF,kBAAC,GAAA;GAAO,SAASS;GAAY,SAAQ;aACnC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"_floatingIpId-DdKnjdIV.mjs","names":["formatFloatingIpStatus","status","charAt","slice","toLowerCase","Fragment","DescriptionDefinition","DescriptionList","DescriptionTerm","Stack","TwoColumnDescriptionList","items","mid","Math","ceil","length","firstColumn","slice","secondColumn","gap","className","alignTerms","map","label","value","Stack","ButtonRow","Button","ContentHeading","formatFloatingIpStatus","TwoColumnDescriptionList","FloatingIpActionModals","FloatingIpDetailsView","floatingIp","useLingui","basicInfoItems","label","t","value","id","description","project_id","status","created_at","Date","toLocaleString","updated_at","tags","join","networkRoutingItems","floating_ip_address","floating_network_id","fixed_ip_address","port_details","name","mac_address","network_id","device_owner","device_id","router_id","port_id","qos_policy_id","port_forwardings","map","port","dnsItems","dns_domain","dns_name","p","className","toggleEditModal","toggleAttachModal","toggleDetachModal","toggleReleaseModal","onClick","direction","gap","items","useNavigate","Button","ContentHeading","Stack","Spinner","Trans","useProjectId","trpcReact","FloatingIpDetailsView","Route","RouteComponent","floatingIpId","useParams","projectId","navigate","data","floatingIp","isLoading","isError","error","network","getById","useQuery","project_id","floatingip_id","handleBack","to","params","errorMessage","message","floating_ip_address","component"],"sources":["../../src/client/utils/formatFloatingIpStatus.ts","../../src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/-components/TwoColumnDescriptionList.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/-components/-details/FloatingIpDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/index.tsx?tsr-split=component"],"sourcesContent":["import type { FloatingIpStatus } from \"@/server/Network/types/floatingIp\"\n\n/**\n * Formats a floating IP status value from uppercase enum to title case.\n * Example: \"ACTIVE\" → \"Active\", \"DOWN\" → \"Down\", \"ERROR\" → \"Error\"\n */\nexport const formatFloatingIpStatus = (status: FloatingIpStatus) => {\n return status.charAt(0) + status.slice(1).toLowerCase()\n}\n","import { Fragment } from \"react\"\nimport { DescriptionDefinition, DescriptionList, DescriptionTerm, Stack } from \"@cloudoperators/juno-ui-components\"\n\nexport type DetailListItem = {\n label: string\n value: string\n}\n\ninterface TwoColumnDescriptionListProps {\n items: DetailListItem[]\n}\n\nexport const TwoColumnDescriptionList = ({ items }: TwoColumnDescriptionListProps) => {\n const mid = Math.ceil(items.length / 2)\n const firstColumn = items.slice(0, mid)\n const secondColumn = items.slice(mid)\n\n return (\n <Stack gap=\"6\" className=\"grid grid-cols-2\">\n <DescriptionList alignTerms=\"right\">\n {firstColumn.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n\n <DescriptionList alignTerms=\"right\">\n {secondColumn.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n </Stack>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Stack, ButtonRow, Button, ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport type { FloatingIp } from \"@/server/Network/types/floatingIp\"\nimport { formatFloatingIpStatus } from \"@/client/utils/formatFloatingIpStatus\"\nimport { DetailListItem, TwoColumnDescriptionList } from \"../TwoColumnDescriptionList\"\nimport { FloatingIpActionModals } from \"../../../-components/-modals/FloatingIpActionModals\"\n\ninterface FloatingIpDetailsViewProps {\n floatingIp: FloatingIp\n}\n\nexport const FloatingIpDetailsView = ({ floatingIp }: FloatingIpDetailsViewProps) => {\n const { t } = useLingui()\n\n const basicInfoItems: DetailListItem[] = [\n { label: t`ID`, value: floatingIp.id },\n { label: t`Description`, value: floatingIp.description || `—` },\n { label: t`Project ID`, value: floatingIp.project_id || `—` },\n { label: t`Status`, value: formatFloatingIpStatus(floatingIp.status) },\n { label: t`Created At`, value: floatingIp.created_at ? new Date(floatingIp.created_at).toLocaleString() : `—` },\n { label: t`Updated At`, value: floatingIp.updated_at ? new Date(floatingIp.updated_at).toLocaleString() : `—` },\n { label: t`Tags`, value: floatingIp.tags?.join(\", \") || `—` },\n ]\n\n const networkRoutingItems: DetailListItem[] = [\n { label: t`Floating IP Address`, value: floatingIp.floating_ip_address || `—` },\n { label: t`Floating Network`, value: floatingIp.floating_network_id || `—` },\n { label: t`Fixed IP Address`, value: floatingIp.fixed_ip_address || `—` },\n { label: t`Port Name`, value: floatingIp.port_details?.name || `—` },\n { label: t`MAC Address`, value: floatingIp.port_details?.mac_address || `—` },\n { label: t`Network ID`, value: floatingIp.port_details?.network_id || `—` },\n { label: t`Device Owner`, value: floatingIp.port_details?.device_owner || `—` },\n { label: t`Device ID`, value: floatingIp.port_details?.device_id || `—` },\n { label: t`Router ID`, value: floatingIp.router_id || `—` },\n { label: t`Port ID`, value: floatingIp.port_id || `—` },\n { label: t`QoS Policy ID`, value: floatingIp.qos_policy_id || `—` },\n { label: t`Port Forwarding`, value: floatingIp.port_forwardings?.map((port) => port.id).join(\", \") || `—` },\n ]\n\n const dnsItems: DetailListItem[] = [\n { label: t`DNS Domain`, value: floatingIp.dns_domain || `—` },\n { label: t`DNS Name`, value: floatingIp.dns_name || `—` },\n ]\n\n return (\n <>\n <p className=\"text-theme-secondary mt-2 text-sm\">\n <Trans>\n Full lifecycle management of Floating IPs, including attachment, port association/disassociation, DNS\n settings, and deletion\n </Trans>\n </p>\n\n <FloatingIpActionModals floatingIp={floatingIp}>\n {({ toggleEditModal, toggleAttachModal, toggleDetachModal, toggleReleaseModal }) => (\n <ButtonRow>\n <Button onClick={toggleEditModal}>{t`Edit Description`}</Button>\n <Button onClick={toggleAttachModal}>{t`Attach`}</Button>\n <Button onClick={toggleDetachModal}>{t`Detach`}</Button>\n <Button onClick={toggleReleaseModal}>{t`Release`}</Button>\n </ButtonRow>\n )}\n </FloatingIpActionModals>\n\n <Stack direction=\"vertical\" gap=\"6\" className=\"my-6\">\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>Basic Info</Trans>\n </ContentHeading>\n <TwoColumnDescriptionList items={basicInfoItems} />\n </Stack>\n\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>Network & Routing</Trans>\n </ContentHeading>\n <TwoColumnDescriptionList items={networkRoutingItems} />\n </Stack>\n\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>DNS</Trans>\n </ContentHeading>\n <TwoColumnDescriptionList items={dnsItems} />\n </Stack>\n </Stack>\n </>\n )\n}\n","import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Button, ContentHeading, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { FloatingIpDetailsView } from \"./-components/-details/FloatingIpDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/floatingips/$floatingIpId/\")({\n staticData: {\n section: \"network\",\n service: \"floatingips\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Network\" },\n crumb: { labelKey: \"Floating IPs\", to: \"/projects/$projectId/network/floatingips\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const floatingIp = await context.trpcClient?.network.floatingIp.getById.query({\n project_id: params.projectId,\n floatingip_id: params.floatingIpId,\n })\n return { floatingIpAddress: floatingIp?.floating_ip_address ?? null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.floatingIpAddress ?? \"Floating IP\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect if network service not available\n if (!serviceIndex[\"network\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n\n if (!serviceIndex[\"network\"][\"neutron\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { floatingIpId } = Route.useParams()\n const projectId = useProjectId()\n const navigate = useNavigate()\n\n // Fetch floating IP details\n const {\n data: floatingIp,\n isLoading,\n isError,\n error,\n } = trpcReact.network.floatingIp.getById.useQuery({\n project_id: projectId,\n floatingip_id: floatingIpId,\n })\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId },\n })\n }\n\n // 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 Floating IP Details...</Trans>\n </Stack>\n )\n }\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\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 floating IP</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!floatingIp) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Floating IP not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // Success state\n return (\n <>\n <ContentHeading>{floatingIp.floating_ip_address}</ContentHeading>\n <FloatingIpDetailsView floatingIp={floatingIp} />\n </>\n )\n}\n"],"mappings":"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"}
|