@cobaltcore-dev/aurora 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +160 -20
- package/dist/client/AuroraApp.d.ts +38 -0
- package/dist/client/{ContentHeader-kx1Th5Sq.mjs → ContentHeader-DqsGNvtD.mjs} +17 -17
- package/dist/client/{ContentHeader-kx1Th5Sq.mjs.map → ContentHeader-DqsGNvtD.mjs.map} +1 -1
- package/dist/client/{DeleteFlavorModal-C3cb7YiJ.mjs → DeleteFlavorModal-C3m7bQJu.mjs} +163 -163
- package/dist/client/{DeleteFlavorModal-C3cb7YiJ.mjs.map → DeleteFlavorModal-C3m7bQJu.mjs.map} +1 -1
- package/dist/client/{EditSecurityGroupModal-CpP54WIK.mjs → EditSecurityGroupModal-DKusxfta.mjs} +18 -18
- package/dist/client/{EditSecurityGroupModal-CpP54WIK.mjs.map → EditSecurityGroupModal-DKusxfta.mjs.map} +1 -1
- package/dist/client/{FiltersInput-DxcyR6Bp.mjs → FiltersInput-GzR4D0q6.mjs} +21 -21
- package/dist/client/{FiltersInput-DxcyR6Bp.mjs.map → FiltersInput-GzR4D0q6.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-BP8RWHbu.mjs → FloatingIpActionModals-CRvROJ3H.mjs} +51 -51
- package/dist/client/{FloatingIpActionModals-BP8RWHbu.mjs.map → FloatingIpActionModals-CRvROJ3H.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-TZ3EfQg-.mjs → ImageToastNotifications-BuDXpTkl.mjs} +344 -344
- package/dist/client/{ImageToastNotifications-TZ3EfQg-.mjs.map → ImageToastNotifications-BuDXpTkl.mjs.map} +1 -1
- package/dist/client/{RouteError-QSV7qOoJ.mjs → RouteError-DVAiT0mT.mjs} +2 -2
- package/dist/client/{RouteError-QSV7qOoJ.mjs.map → RouteError-DVAiT0mT.mjs.map} +1 -1
- package/dist/client/{SortInput-CYv2_Pur.mjs → SortInput-VK7IYqQv.mjs} +6 -6
- package/dist/client/{SortInput-CYv2_Pur.mjs.map → SortInput-VK7IYqQv.mjs.map} +1 -1
- package/dist/client/_auth-DXJkv9QO.mjs.map +1 -1
- package/dist/client/{_flavorId-C2x43-6S.mjs → _flavorId-B9Vqkraj.mjs} +8 -8
- package/dist/client/{_flavorId-C2x43-6S.mjs.map → _flavorId-B9Vqkraj.mjs.map} +1 -1
- package/dist/client/{_flavorId-CR8ZUI-P.mjs → _flavorId-CFpNGz52.mjs} +62 -62
- package/dist/client/{_flavorId-CR8ZUI-P.mjs.map → _flavorId-CFpNGz52.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-BCk41_Lb.mjs → _floatingIpId-B5GMSLeQ.mjs} +2 -2
- package/dist/client/{_floatingIpId-BCk41_Lb.mjs.map → _floatingIpId-B5GMSLeQ.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-BGrOAmPT.mjs → _floatingIpId-C2-BeRmF.mjs} +27 -27
- package/dist/client/{_floatingIpId-BGrOAmPT.mjs.map → _floatingIpId-C2-BeRmF.mjs.map} +1 -1
- package/dist/client/_imageId-9NZytfNs.mjs +534 -0
- package/dist/client/{_imageId-CvfD832b.mjs.map → _imageId-9NZytfNs.mjs.map} +1 -1
- package/dist/client/_pcaId-BwTvJJgh.mjs +479 -0
- package/dist/client/_pcaId-BwTvJJgh.mjs.map +1 -0
- package/dist/client/{_pcaId-DOHycvCf.mjs → _pcaId-DUHQd0rB.mjs} +2 -2
- package/dist/client/{_pcaId-DOHycvCf.mjs.map → _pcaId-DUHQd0rB.mjs.map} +1 -1
- package/dist/client/{_projectId-DOgwFiqD.mjs → _projectId-B_2sZKk-.mjs} +2 -2
- package/dist/client/{_projectId-DOgwFiqD.mjs.map → _projectId-B_2sZKk-.mjs.map} +1 -1
- package/dist/client/{_projectId-MxcHrXW4.mjs → _projectId-CLgClx24.mjs} +3 -3
- package/dist/client/{_projectId-MxcHrXW4.mjs.map → _projectId-CLgClx24.mjs.map} +1 -1
- package/dist/client/_projectId-cW9aQ4Ag.mjs +271 -0
- package/dist/client/_projectId-cW9aQ4Ag.mjs.map +1 -0
- package/dist/client/{_securityGroupId-KKw4RPdH.mjs → _securityGroupId-DYxmXUOP.mjs} +319 -319
- package/dist/client/{_securityGroupId-KKw4RPdH.mjs.map → _securityGroupId-DYxmXUOP.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-CJJanWiY.mjs → _securityGroupId-fhK1CuZh.mjs} +2 -2
- package/dist/client/{_securityGroupId-CJJanWiY.mjs.map → _securityGroupId-fhK1CuZh.mjs.map} +1 -1
- package/dist/client/{_storageType-DYjo-6ej.mjs → _storageType-2_fau4B5.mjs} +698 -698
- package/dist/client/{_storageType-DYjo-6ej.mjs.map → _storageType-2_fau4B5.mjs.map} +1 -1
- package/dist/client/{_storageType-4wSxI__0.mjs → _storageType-dRTFMKG3.mjs} +2 -2
- package/dist/client/{_storageType-4wSxI__0.mjs.map → _storageType-dRTFMKG3.mjs.map} +1 -1
- package/dist/client/{about-Bo9vxGHy.mjs → about-Nsxkyh9U.mjs} +2 -2
- package/dist/client/{about-Bo9vxGHy.mjs.map → about-Nsxkyh9U.mjs.map} +1 -1
- package/dist/client/{build-DeJcDjPi.mjs → build-BdRRmNf5.mjs} +3290 -3274
- package/dist/client/{build-DeJcDjPi.mjs.map → build-BdRRmNf5.mjs.map} +1 -1
- package/dist/client/{constants-BmcGYeR-.mjs → constants-J5nm9hbP.mjs} +15 -15
- package/dist/client/{constants-BmcGYeR-.mjs.map → constants-J5nm9hbP.mjs.map} +1 -1
- package/dist/client/{flavors-BxFVqgnb.mjs → flavors-_P7R-CeT.mjs} +2 -2
- package/dist/client/{flavors-BxFVqgnb.mjs.map → flavors-_P7R-CeT.mjs.map} +1 -1
- package/dist/client/{flavors-CfdgjsZY.mjs → flavors-m1qDHzeS.mjs} +238 -221
- package/dist/client/flavors-m1qDHzeS.mjs.map +1 -0
- package/dist/client/{floatingips-ByRb82wS.mjs → floatingips-Dq4DXQYb.mjs} +90 -90
- package/dist/client/{floatingips-ByRb82wS.mjs.map → floatingips-Dq4DXQYb.mjs.map} +1 -1
- package/dist/client/{images-CenluYV8.mjs → images-CpM-T_jM.mjs} +2 -2
- package/dist/client/{images-CenluYV8.mjs.map → images-CpM-T_jM.mjs.map} +1 -1
- package/dist/client/images-DHmVgQAh2.mjs +1890 -0
- package/dist/client/images-DHmVgQAh2.mjs.map +1 -0
- package/dist/client/{images-C_dX7nY6.mjs → images-Dbjo4yKn.mjs} +2 -2
- package/dist/client/{images-C_dX7nY6.mjs.map → images-Dbjo4yKn.mjs.map} +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +390 -356
- package/dist/client/index.js.map +1 -1
- package/dist/client/{objects-gxSjvbvF.mjs → objects-DKWp9RtR.mjs} +2 -2
- package/dist/client/{objects-gxSjvbvF.mjs.map → objects-DKWp9RtR.mjs.map} +1 -1
- package/dist/client/{objects-BJM6YeuF.mjs → objects-DaCuy_CB.mjs} +1156 -1156
- package/dist/client/{objects-BJM6YeuF.mjs.map → objects-DaCuy_CB.mjs.map} +1 -1
- package/dist/client/{pca-Bl8NmoVZ.mjs → pca-C8zWTSSt.mjs} +2 -2
- package/dist/client/{pca-Bl8NmoVZ.mjs.map → pca-C8zWTSSt.mjs.map} +1 -1
- package/dist/client/pca-CK5-j7Kk.mjs +202 -0
- package/dist/client/pca-CK5-j7Kk.mjs.map +1 -0
- package/dist/client/{projects-pe2_dCnV.mjs → projects-CHYn7L5e.mjs} +2 -2
- package/dist/client/{projects-pe2_dCnV.mjs.map → projects-CHYn7L5e.mjs.map} +1 -1
- package/dist/client/{projects-D2iewAzu.mjs → projects-CeLhtLvf.mjs} +2 -2
- package/dist/client/{projects-D2iewAzu.mjs.map → projects-CeLhtLvf.mjs.map} +1 -1
- package/dist/client/{projects-CgclWI16.mjs → projects-ClViaUuv.mjs} +11 -11
- package/dist/client/{projects-CgclWI16.mjs.map → projects-ClViaUuv.mjs.map} +1 -1
- package/dist/client/{_projectId-BDSWnMGj.mjs → routeInfo-DlDJZnpg.mjs} +34 -8
- package/dist/client/routeInfo-DlDJZnpg.mjs.map +1 -0
- package/dist/client/{securitygroups-DahZkVYQ.mjs → securitygroups-CNFLu9zS.mjs} +112 -112
- package/dist/client/{securitygroups-DahZkVYQ.mjs.map → securitygroups-CNFLu9zS.mjs.map} +1 -1
- package/dist/client/{useListWithFiltering-DaYcu5AB.mjs → useListWithFiltering-v2A0-SZb.mjs} +9 -9
- package/dist/client/{useListWithFiltering-DaYcu5AB.mjs.map → useListWithFiltering-v2A0-SZb.mjs.map} +1 -1
- package/dist/server/index.d.ts +576 -2
- package/dist/server/index.js +59 -217
- package/package.json +4 -5
- package/dist/client/_imageId-CvfD832b.mjs +0 -534
- package/dist/client/_pcaId-BxBt5DXi.mjs +0 -459
- package/dist/client/_pcaId-BxBt5DXi.mjs.map +0 -1
- package/dist/client/_projectId-BDSWnMGj.mjs.map +0 -1
- package/dist/client/_projectId-DS4nR59B.mjs +0 -299
- package/dist/client/_projectId-DS4nR59B.mjs.map +0 -1
- package/dist/client/flavors-CfdgjsZY.mjs.map +0 -1
- package/dist/client/images-CKqIXUq52.mjs +0 -1873
- package/dist/client/images-CKqIXUq52.mjs.map +0 -1
- package/dist/client/pca-RSiWpJs9.mjs +0 -182
- package/dist/client/pca-RSiWpJs9.mjs.map +0 -1
|
@@ -8,9 +8,9 @@ var r = e("/_auth/projects/$projectId/services/pca/")({
|
|
|
8
8
|
crumb: { labelKey: "PCA (Clavis)" }
|
|
9
9
|
},
|
|
10
10
|
head: () => ({ meta: [{ title: n._({ id: "ffw//c" }) }] }),
|
|
11
|
-
component: t(() => import("./pca-
|
|
11
|
+
component: t(() => import("./pca-CK5-j7Kk.mjs"), "component")
|
|
12
12
|
});
|
|
13
13
|
//#endregion
|
|
14
14
|
export { r as t };
|
|
15
15
|
|
|
16
|
-
//# sourceMappingURL=pca-
|
|
16
|
+
//# sourceMappingURL=pca-C8zWTSSt.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pca-
|
|
1
|
+
{"version":3,"file":"pca-C8zWTSSt.mjs","names":["createFileRoute","t","Route","staticData","section","service","sectionCrumb","labelKey","crumb","RouteInfo","head","meta","title","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { PcaListContainer } from \"./-components/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n\n return (\n <>\n <ContentHeader title={t`PCA`} projectId={projectId} />\n <PcaListContainer />\n </>\n )\n}\n"],"mappings":";;AAOA,IAAaE,IAAQF,EAAgB,0CAAA,EAA4C;CAC/EG,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,cAAc,EAAEC,UAAU,WAAW;EACrCC,OAAO,EAAED,UAAU,eAAe;CACpC;CACAG,aAAa,EAAEC,MAAM,CAAC,EAAEC,OAAOX,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA,EAAM,CAAA,EAAG;CACzCY,WAASC,sCAAA,WAAA;AACX,CAAA"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { D as e, E as t, G as n, H as r, J as i, L as a, N as o, Q as s, Y as c, _ as l, ct as u, et as d, k as f, m as p, ot as m, p as h, x as g } from "./build-BdRRmNf5.mjs";
|
|
2
|
+
import { r as _ } from "./trpcClient-BzPUgiM2.mjs";
|
|
3
|
+
import { t as v } from "./pca-C8zWTSSt.mjs";
|
|
4
|
+
import { t as y } from "./ContentHeader-DqsGNvtD.mjs";
|
|
5
|
+
import { t as b } from "./useModal-DCs1OJh7.mjs";
|
|
6
|
+
import { t as x } from "./useProjectId-DBc5lpoU.mjs";
|
|
7
|
+
import "./hooks-dSArr2Ca.mjs";
|
|
8
|
+
import { n as S, r as C, t as w } from "./constants-J5nm9hbP.mjs";
|
|
9
|
+
import { Fragment as T, jsx as E, jsxs as D } from "react/jsx-runtime";
|
|
10
|
+
import { useState as O } from "react";
|
|
11
|
+
import { useNavigate as k } from "@tanstack/react-router";
|
|
12
|
+
import { Trans as A, useLingui as j } from "@lingui/react";
|
|
13
|
+
import { z as M } from "zod";
|
|
14
|
+
import { useForm as N, useStore as P } from "@tanstack/react-form";
|
|
15
|
+
//#region src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/PcaTableRow.tsx
|
|
16
|
+
var F = ({ pca: t }) => {
|
|
17
|
+
let { i18n: r, _: i } = j(), a = k(), s = x(), [c, l] = b(!1), u = () => a({
|
|
18
|
+
to: "/projects/$projectId/services/pca/$pcaId",
|
|
19
|
+
params: {
|
|
20
|
+
projectId: s,
|
|
21
|
+
pcaId: t.id
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
return /*#__PURE__*/ D(T, { children: [/*#__PURE__*/ D(o, {
|
|
25
|
+
"data-testid": `pca-row-${t.id}`,
|
|
26
|
+
onClick: u,
|
|
27
|
+
children: [
|
|
28
|
+
/*#__PURE__*/ E(n, { children: /*#__PURE__*/ D("div", {
|
|
29
|
+
className: "flex items-center gap-2",
|
|
30
|
+
children: [w[t.state].icon, w[t.state].text]
|
|
31
|
+
}) }),
|
|
32
|
+
/*#__PURE__*/ E(n, { children: t.id }),
|
|
33
|
+
/*#__PURE__*/ E(n, { children: t.configuration?.subject?.common_name || "—" }),
|
|
34
|
+
/*#__PURE__*/ E(n, {
|
|
35
|
+
onClick: (e) => e.stopPropagation(),
|
|
36
|
+
className: "items-end pr-0",
|
|
37
|
+
children: /*#__PURE__*/ E(e, { children: /*#__PURE__*/ D(m, { children: [/*#__PURE__*/ E(f, {
|
|
38
|
+
label: r._({ id: "v0hPHE" }),
|
|
39
|
+
onClick: u
|
|
40
|
+
}), /*#__PURE__*/ E(f, {
|
|
41
|
+
label: r._({ id: "nzFJqC" }),
|
|
42
|
+
onClick: l
|
|
43
|
+
})] }) })
|
|
44
|
+
})
|
|
45
|
+
]
|
|
46
|
+
}, t.id), c && /*#__PURE__*/ E(C, {
|
|
47
|
+
pca: t,
|
|
48
|
+
open: c,
|
|
49
|
+
onClose: l
|
|
50
|
+
})] });
|
|
51
|
+
}, I = /^(?=.{1,253}$)(?:\*\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63}$/, L = (e) => I.test(e), R = ({ open: e, onClose: t }) => {
|
|
52
|
+
let { i18n: n, _: a } = j(), o = k(), s = x(), c = _.useUtils(), { isPending: l, ...d } = _.services.pca.create.useMutation({ onSettled: () => c.services.pca.list.invalidate() }), f = N({
|
|
53
|
+
defaultValues: { common_name: "" },
|
|
54
|
+
validators: { onSubmit: M.object({ common_name: M.string().trim().min(1, n._({ id: "qhDo93" })).refine((e) => L(e), { message: n._({ id: "gy6L1u" }) }) }) },
|
|
55
|
+
onSubmit: async ({ value: e }) => {
|
|
56
|
+
if (l) return;
|
|
57
|
+
let t = await d.mutateAsync({
|
|
58
|
+
project_id: s,
|
|
59
|
+
configuration: { subject: { common_name: e.common_name } }
|
|
60
|
+
});
|
|
61
|
+
m(), await o({
|
|
62
|
+
to: "/projects/$projectId/services/pca/$pcaId",
|
|
63
|
+
params: {
|
|
64
|
+
projectId: s,
|
|
65
|
+
pcaId: t.id
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}), m = () => {
|
|
70
|
+
l || (f.reset(), d.reset(), t());
|
|
71
|
+
}, v = P(f.store, (e) => e.isSubmitting || e.values.common_name.trim().length === 0);
|
|
72
|
+
return /*#__PURE__*/ D(u, {
|
|
73
|
+
open: e,
|
|
74
|
+
size: "large",
|
|
75
|
+
title: n._({ id: "WidMsn" }),
|
|
76
|
+
onCancel: m,
|
|
77
|
+
cancelButtonLabel: n._({ id: "dEgA5A" }),
|
|
78
|
+
confirmButtonLabel: n._({ id: "tfDRzk" }),
|
|
79
|
+
onConfirm: f.handleSubmit,
|
|
80
|
+
disableConfirmButton: l || v,
|
|
81
|
+
children: [
|
|
82
|
+
d.error?.message && /*#__PURE__*/ E(i, {
|
|
83
|
+
dismissible: !1,
|
|
84
|
+
variant: "error",
|
|
85
|
+
className: "mb-4",
|
|
86
|
+
children: d.error.message
|
|
87
|
+
}),
|
|
88
|
+
l && /*#__PURE__*/ D("div", {
|
|
89
|
+
className: "mb-4 flex items-center justify-center gap-2",
|
|
90
|
+
children: [/*#__PURE__*/ E(r, { variant: "primary" }), /*#__PURE__*/ E("span", {
|
|
91
|
+
className: "text-theme-high text-sm",
|
|
92
|
+
children: /*#__PURE__*/ E(A, { id: "wdUvGT" })
|
|
93
|
+
})]
|
|
94
|
+
}),
|
|
95
|
+
!l && /*#__PURE__*/ E(g, {
|
|
96
|
+
className: "mb-0",
|
|
97
|
+
id: "create-certificate-authority-form",
|
|
98
|
+
onSubmit: (e) => {
|
|
99
|
+
e.preventDefault(), f.handleSubmit();
|
|
100
|
+
},
|
|
101
|
+
children: /*#__PURE__*/ E(h, {
|
|
102
|
+
className: "mb-4",
|
|
103
|
+
children: /*#__PURE__*/ E(f.Field, {
|
|
104
|
+
name: "common_name",
|
|
105
|
+
children: (e) => /*#__PURE__*/ E(p, {
|
|
106
|
+
id: e.name,
|
|
107
|
+
name: e.name,
|
|
108
|
+
value: e.state.value,
|
|
109
|
+
onBlur: e.handleBlur,
|
|
110
|
+
onChange: (t) => e.handleChange(t.target.value),
|
|
111
|
+
label: n._({ id: "DHrCY6" }),
|
|
112
|
+
placeholder: n._({ id: "RWQ6BN" }),
|
|
113
|
+
helptext: n._({ id: "jVjr9h" }),
|
|
114
|
+
errortext: e.state.meta.errors.map((e) => e?.message).join(", "),
|
|
115
|
+
disabled: l
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
})
|
|
119
|
+
})
|
|
120
|
+
]
|
|
121
|
+
});
|
|
122
|
+
}, z = 50, B = () => {
|
|
123
|
+
let { i18n: e, _: i } = j(), u = x(), f = S(), p = f.length, [m, h] = b(!1), [g, v] = O([void 0]), [y, C] = O(1), w = g[y - 1], { data: T, isLoading: k, isError: M, error: N } = _.services.pca.list.useQuery({
|
|
124
|
+
project_id: u,
|
|
125
|
+
limit: z,
|
|
126
|
+
next_page_marker: w
|
|
127
|
+
}), P = T?.certificate_authorities ?? [], I = T?.next_page_marker, L = I ? y + 1 : y, B = Math.max(L, g.length), V = (e) => {
|
|
128
|
+
e < 1 || e > B || (e > y && I && v((t) => {
|
|
129
|
+
let n = [...t];
|
|
130
|
+
return n[e - 1] = I, n;
|
|
131
|
+
}), C(e));
|
|
132
|
+
};
|
|
133
|
+
return k ? /*#__PURE__*/ D(c, {
|
|
134
|
+
className: "py-8",
|
|
135
|
+
distribution: "center",
|
|
136
|
+
alignment: "center",
|
|
137
|
+
direction: "vertical",
|
|
138
|
+
children: [/*#__PURE__*/ E(r, {
|
|
139
|
+
variant: "primary",
|
|
140
|
+
size: "large",
|
|
141
|
+
className: "mb-2"
|
|
142
|
+
}), /*#__PURE__*/ E(A, { id: "Z3FXyt" })]
|
|
143
|
+
}) : M ? /*#__PURE__*/ E(c, {
|
|
144
|
+
className: "py-8",
|
|
145
|
+
distribution: "center",
|
|
146
|
+
alignment: "center",
|
|
147
|
+
direction: "vertical",
|
|
148
|
+
children: N?.message ?? e._({ id: "Sf3Gvg" })
|
|
149
|
+
}) : P.length === 0 && y === 1 ? /*#__PURE__*/ E(d, {
|
|
150
|
+
columns: p,
|
|
151
|
+
className: "pca",
|
|
152
|
+
"data-testid": "no-pcas",
|
|
153
|
+
children: /*#__PURE__*/ E(o, { children: /*#__PURE__*/ D(n, {
|
|
154
|
+
colSpan: p,
|
|
155
|
+
children: [/*#__PURE__*/ E(s, { children: /*#__PURE__*/ E(A, { id: "8S2nDL" }) }), /*#__PURE__*/ E("p", { children: /*#__PURE__*/ E(A, { id: "ng+PCh" }) })]
|
|
156
|
+
}) })
|
|
157
|
+
}) : /*#__PURE__*/ D("div", {
|
|
158
|
+
className: "relative",
|
|
159
|
+
children: [
|
|
160
|
+
/*#__PURE__*/ E(c, {
|
|
161
|
+
className: "pt-3 pb-2",
|
|
162
|
+
distribution: "end",
|
|
163
|
+
children: /*#__PURE__*/ E(l, {
|
|
164
|
+
variant: "primary",
|
|
165
|
+
label: e._({ id: "WidMsn" }),
|
|
166
|
+
onClick: h
|
|
167
|
+
})
|
|
168
|
+
}),
|
|
169
|
+
/*#__PURE__*/ D(d, {
|
|
170
|
+
columns: p,
|
|
171
|
+
children: [/*#__PURE__*/ E(o, { children: f.map((e) => /*#__PURE__*/ E(a, { children: e }, e)) }), P.map((e) => /*#__PURE__*/ E(F, { pca: e }, e.id))]
|
|
172
|
+
}),
|
|
173
|
+
B > 1 && /*#__PURE__*/ E("div", {
|
|
174
|
+
className: "flex justify-center py-4",
|
|
175
|
+
children: /*#__PURE__*/ E(t, {
|
|
176
|
+
variant: "input",
|
|
177
|
+
currentPage: y,
|
|
178
|
+
pages: B,
|
|
179
|
+
onPressPrevious: () => V(y - 1),
|
|
180
|
+
onPressNext: () => V(y + 1)
|
|
181
|
+
})
|
|
182
|
+
}),
|
|
183
|
+
m && /*#__PURE__*/ E(R, {
|
|
184
|
+
open: m,
|
|
185
|
+
onClose: h
|
|
186
|
+
})
|
|
187
|
+
]
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
//#endregion
|
|
191
|
+
//#region src/client/routes/_auth/projects/$projectId/services/pca/index.tsx?tsr-split=component
|
|
192
|
+
function V() {
|
|
193
|
+
let { i18n: e, _: t } = j(), { projectId: n } = v.useParams();
|
|
194
|
+
return /*#__PURE__*/ D(T, { children: [/*#__PURE__*/ E(y, {
|
|
195
|
+
title: e._({ id: "ffw//c" }),
|
|
196
|
+
projectId: n
|
|
197
|
+
}), /*#__PURE__*/ E(B, {})] });
|
|
198
|
+
}
|
|
199
|
+
//#endregion
|
|
200
|
+
export { V as component };
|
|
201
|
+
|
|
202
|
+
//# sourceMappingURL=pca-CK5-j7Kk.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pca-CK5-j7Kk.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","useModal","useProjectId","DeletePcaModal","STATE_CONFIG","PcaTableRow","pca","useLingui","navigate","projectId","deletePcaModalOpen","toggleDeletePcaModal","navigateToDetailsPage","to","params","pcaId","id","data-testid","onClick","div","className","state","icon","text","configuration","subject","common_name","e","stopPropagation","label","t","open","onClose","z","useForm","useStore","useNavigate","Modal","Form","FormSection","Spinner","TextInput","Message","trpcReact","useProjectId","csrRegex","isValidCommonName","value","test","CreatePcaModal","open","onClose","useLingui","navigate","projectId","utils","useUtils","isPending","createPcaMutation","services","pca","create","useMutation","onSettled","list","invalidate","formSchema","object","common_name","string","trim","min","t","refine","message","form","defaultValues","validators","onSubmit","createdPca","mutateAsync","project_id","configuration","subject","handleClose","to","params","pcaId","id","reset","isCreateDisabled","store","state","isSubmitting","values","length","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","error","dismissible","variant","className","div","span","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","label","placeholder","helptext","errortext","meta","errors","map","join","disabled","useState","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","Pagination","trpcReact","useProjectId","useModal","TABLE_COLUMNS","PcaTableRow","CreatePcaModal","ITEMS_PER_PAGE","PcaListContainer","useLingui","projectId","columns","columnsLength","length","createCaOpen","toggleCreateCa","pageMarkers","setPageMarkers","undefined","currentPage","setCurrentPage","currentMarker","data","isLoading","isError","error","services","pca","list","useQuery","project_id","limit","next_page_marker","pcas","certificate_authorities","nextMarker","computedTotal","totalPages","Math","max","goToPage","page","prev","updated","className","distribution","alignment","direction","variant","size","message","t","data-testid","colSpan","p","div","label","onClick","map","id","pages","onPressPrevious","onPressNext","open","onClose","useLingui","ContentHeader","PcaListContainer","Route","RouteComponent","t","projectId","useParams","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/PcaTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-modals/CreatePcaModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/PcaListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { DeletePcaModal } from \"../-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"./constants\"\n\ninterface PcaTableRowProps {\n pca: CertificateAuthority\n}\n\nexport const PcaTableRow = ({ pca }: PcaTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToDetailsPage = () =>\n navigate({\n to: \"/projects/$projectId/services/pca/$pcaId\",\n params: { projectId, pcaId: pca.id },\n })\n\n return (\n <>\n <DataGridRow key={pca.id} data-testid={`pca-row-${pca.id}`} onClick={navigateToDetailsPage}>\n <DataGridCell>\n <div className=\"flex items-center gap-2\">\n {STATE_CONFIG[pca.state].icon}\n {STATE_CONFIG[pca.state].text}\n </div>\n </DataGridCell>\n <DataGridCell>{pca.id}</DataGridCell>\n <DataGridCell>{pca.configuration?.subject?.common_name || \"—\"}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={navigateToDetailsPage} />\n <PopupMenuItem label={t`Delete CA`} onClick={toggleDeletePcaModal} />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n\n {deletePcaModalOpen && <DeletePcaModal pca={pca} open={deletePcaModalOpen} onClose={toggleDeletePcaModal} />}\n </>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, TextInput, Message } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface CreateCaModalProps {\n open: boolean\n onClose: () => void\n}\n\nconst csrRegex = /^(?=.{1,253}$)(?:\\*\\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)+[A-Za-z]{2,63}$/\nconst isValidCommonName = (value: string) => csrRegex.test(value)\n\nexport const CreatePcaModal = ({ open, onClose }: CreateCaModalProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createPcaMutation } = trpcReact.services.pca.create.useMutation({\n onSettled: () => utils.services.pca.list.invalidate(),\n })\n\n const formSchema = z.object({\n common_name: z\n .string()\n .trim()\n .min(1, t`Common name is required.`)\n .refine((value) => isValidCommonName(value), { message: t`Must be a valid common name (FQDN).` }),\n })\n\n const form = useForm({\n defaultValues: {\n common_name: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n const createdPca = await createPcaMutation.mutateAsync({\n project_id: projectId,\n configuration: {\n subject: { common_name: value.common_name },\n },\n })\n handleClose()\n\n await navigate({\n to: \"/projects/$projectId/services/pca/$pcaId\",\n params: { projectId, pcaId: createdPca.id },\n })\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createPcaMutation.reset()\n onClose()\n }\n\n // Reactive subscription used to control create action disabled state.\n const isCreateDisabled = useStore(\n form.store,\n (state) => state.isSubmitting || state.values.common_name.trim().length === 0\n )\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Create Certificate Authority`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || isCreateDisabled}\n >\n {createPcaMutation.error?.message && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createPcaMutation.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>Creating Certificate Authority...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"create-certificate-authority-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"common_name\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n label={t`Common name`}\n placeholder={t`Enter Common name (e.g., demo-ca.test.sci)`}\n helptext={t`Enter a valid common name in FQDN format (e.g., demo-ca.test.sci).`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useState } from \"react\"\nimport {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n Pagination,\n} from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { TABLE_COLUMNS } from \"./-table/constants\"\nimport { PcaTableRow } from \"./-table/PcaTableRow\"\nimport { CreatePcaModal } from \"./-modals/CreatePcaModal\"\n\nconst ITEMS_PER_PAGE = 50\n\nexport const PcaListContainer = () => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const columns = TABLE_COLUMNS()\n const columnsLength = columns.length\n const [createCaOpen, toggleCreateCa] = useModal(false)\n const [pageMarkers, setPageMarkers] = useState<(string | undefined)[]>([undefined])\n const [currentPage, setCurrentPage] = useState(1)\n\n const currentMarker = pageMarkers[currentPage - 1]\n\n const { data, isLoading, isError, error } = trpcReact.services.pca.list.useQuery({\n project_id: projectId,\n limit: ITEMS_PER_PAGE,\n next_page_marker: currentMarker,\n })\n\n const pcas = data?.certificate_authorities ?? []\n const nextMarker = data?.next_page_marker\n const computedTotal = nextMarker ? currentPage + 1 : currentPage\n const totalPages = Math.max(computedTotal, pageMarkers.length)\n\n const goToPage = (page: number) => {\n if (page < 1 || page > totalPages) return\n if (page > currentPage && nextMarker) {\n setPageMarkers((prev) => {\n const updated = [...prev]\n updated[page - 1] = nextMarker\n return updated\n })\n }\n setCurrentPage(page)\n }\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load PCAs`}\n </Stack>\n )\n }\n\n if (pcas.length === 0 && currentPage === 1) {\n return (\n <DataGrid columns={columnsLength} className=\"pca\" data-testid=\"no-pcas\">\n <DataGridRow>\n <DataGridCell colSpan={columnsLength}>\n <ContentHeading>\n <Trans>No PCAs found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no PCAs available for this project.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <div className=\"relative\">\n <Stack className=\"pt-3 pb-2\" distribution=\"end\">\n <Button variant=\"primary\" label={t`Create Certificate Authority`} onClick={toggleCreateCa} />\n </Stack>\n <DataGrid columns={columnsLength}>\n <DataGridRow>\n {columns.map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {pcas.map((pca) => (\n <PcaTableRow key={pca.id} pca={pca} />\n ))}\n </DataGrid>\n\n {totalPages > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n variant=\"input\"\n currentPage={currentPage}\n pages={totalPages}\n onPressPrevious={() => goToPage(currentPage - 1)}\n onPressNext={() => goToPage(currentPage + 1)}\n />\n </div>\n )}\n\n {createCaOpen && <CreatePcaModal open={createCaOpen} onClose={toggleCreateCa} />}\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { PcaListContainer } from \"./-components/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n\n return (\n <>\n <ContentHeader title={t`PCA`} projectId={projectId} />\n <PcaListContainer />\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as e } from "./RouteError-
|
|
1
|
+
import { t as e } from "./RouteError-DVAiT0mT.mjs";
|
|
2
2
|
import { jsx as t } from "react/jsx-runtime";
|
|
3
3
|
import { TRPCClientError as n } from "@trpc/client";
|
|
4
4
|
//#region src/client/routes/_auth/projects/index.tsx?tsr-split=errorComponent
|
|
@@ -9,4 +9,4 @@ var r = ({ error: r }) => /*#__PURE__*/ t(e, {
|
|
|
9
9
|
//#endregion
|
|
10
10
|
export { r as errorComponent };
|
|
11
11
|
|
|
12
|
-
//# sourceMappingURL=projects-
|
|
12
|
+
//# sourceMappingURL=projects-CHYn7L5e.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects-
|
|
1
|
+
{"version":3,"file":"projects-CHYn7L5e.mjs","names":["RouteError","TRPCClientError","SplitErrorComponent","error","message","undefined","errorComponent"],"sources":["../../src/client/routes/_auth/projects/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { ProjectsOverviewNavBar } from \"@/client/routes/_auth/projects/-components/ProjectOverviewNavBar\"\nimport { ProjectCardView } from \"@/client/routes/_auth/projects/-components/ProjectCardView\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { Container, ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n component: ProjectsOverview,\n errorComponent: ({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n ),\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n loaderDeps: ({ search }) => ({\n search: search.search || \"\",\n }),\n loader: async ({ context, deps }) => {\n const allProjects = await context.trpcClient?.project.getAuthProjects.query()\n\n let projects = allProjects\n if (deps.search && deps.search.trim() !== \"\") {\n const searchTermLower = deps.search.toLowerCase()\n projects = allProjects?.filter(\n (project) =>\n project.name?.toLowerCase().includes(searchTermLower) ||\n project.description?.toLowerCase().includes(searchTermLower)\n )\n }\n\n return { projects }\n },\n})\n\nfunction ProjectsOverview() {\n const { projects } = Route.useLoaderData()\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n\n const handleSearch = (value: string) => {\n navigate({ search: { search: value }, replace: true })\n }\n\n return (\n <Container py>\n <ContentHeading className=\"pb-4\">\n <Trans>Projects</Trans>\n </ContentHeading>\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <ProjectCardView projects={projects} />\n </div>\n </Container>\n )\n}\n"],"mappings":";;;;AAI8C,IAAAE,KAW3B,EAAEC,eACjB,gBAAC,GAAA;CAAkBA;CAAO,kBAAkBA,aAAiBF,IAAkBE,EAAMC,UAAUC,KAAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
|
|
2
2
|
import { z as n } from "zod";
|
|
3
3
|
//#region src/client/routes/_auth/projects/index.tsx
|
|
4
|
-
var r = () => import("./projects-yiK0HGSA.mjs"), i = () => import("./projects-
|
|
4
|
+
var r = () => import("./projects-yiK0HGSA.mjs"), i = () => import("./projects-CHYn7L5e.mjs"), a = () => import("./projects-ClViaUuv.mjs"), o = n.object({ search: n.string().optional() }), s = e("/_auth/projects/")({
|
|
5
5
|
component: t(a, "component"),
|
|
6
6
|
errorComponent: t(i, "errorComponent"),
|
|
7
7
|
notFoundComponent: t(r, "notFoundComponent"),
|
|
@@ -19,4 +19,4 @@ var r = () => import("./projects-yiK0HGSA.mjs"), i = () => import("./projects-pe
|
|
|
19
19
|
//#endregion
|
|
20
20
|
export { s as t };
|
|
21
21
|
|
|
22
|
-
//# sourceMappingURL=projects-
|
|
22
|
+
//# sourceMappingURL=projects-CeLhtLvf.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects-
|
|
1
|
+
{"version":3,"file":"projects-CeLhtLvf.mjs","names":["createFileRoute","z","searchSchema","object","search","string","optional","Route","component","lazyRouteComponent","$$splitComponentImporter","errorComponent","$$splitErrorComponentImporter","notFoundComponent","$$splitNotFoundComponentImporter","validateSearch","loaderDeps","loader","context","deps","allProjects","trpcClient","project","getAuthProjects","query","projects","trim","searchTermLower","toLowerCase","filter","name","includes","description"],"sources":["../../src/client/routes/_auth/projects/index.tsx"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { ProjectsOverviewNavBar } from \"@/client/routes/_auth/projects/-components/ProjectOverviewNavBar\"\nimport { ProjectCardView } from \"@/client/routes/_auth/projects/-components/ProjectCardView\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { Container, ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n component: ProjectsOverview,\n errorComponent: ({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n ),\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n loaderDeps: ({ search }) => ({\n search: search.search || \"\",\n }),\n loader: async ({ context, deps }) => {\n const allProjects = await context.trpcClient?.project.getAuthProjects.query()\n\n let projects = allProjects\n if (deps.search && deps.search.trim() !== \"\") {\n const searchTermLower = deps.search.toLowerCase()\n projects = allProjects?.filter(\n (project) =>\n project.name?.toLowerCase().includes(searchTermLower) ||\n project.description?.toLowerCase().includes(searchTermLower)\n )\n }\n\n return { projects }\n },\n})\n\nfunction ProjectsOverview() {\n const { projects } = Route.useLoaderData()\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n\n const handleSearch = (value: string) => {\n navigate({ search: { search: value }, replace: true })\n }\n\n return (\n <Container py>\n <ContentHeading className=\"pb-4\">\n <Trans>Projects</Trans>\n </ContentHeading>\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <ProjectCardView projects={projects} />\n </div>\n </Container>\n )\n}\n"],"mappings":";;;2IASME,IAAeD,EAAEE,OAAO,EAC5BC,QAAQH,EAAEI,OAAM,EAAGC,SAAQ,EAC7B,CAAA,GAEaC,IAAQP,EAAgB,kBAAA,EAAoB;CACvDQ,WAASC,EAAAC,GAAA,WAAA;CACTC,gBAAcF,EAAAG,GAAA,gBAAA;CAGdC,mBAAiBJ,EAAAK,GAAA,mBAAA;CAGjBC,gBAAgBb;CAChBc,aAAa,EAAEZ,iBAAc,EAC3BA,QAAQA,EAAOA,UAAU,GAC3B;CACAa,QAAQ,OAAO,EAAEC,YAASC,cAAM;EAC9B,IAAMC,IAAc,MAAMF,EAAQG,YAAYC,QAAQC,gBAAgBC,MAAAA,GAElEC,IAAWL;EACf,IAAID,EAAKf,UAAUe,EAAKf,OAAOsB,KAAI,MAAO,IAAI;GAC5C,IAAMC,IAAkBR,EAAKf,OAAOwB,YAAW;GAC/CH,IAAWL,GAAaS,QACrBP,MACCA,EAAQQ,MAAMF,YAAAA,EAAcG,SAASJ,CAAAA,KACrCL,EAAQU,aAAaJ,YAAAA,EAAcG,SAASJ,CAAAA,CAAAA;EAElD;EAEA,OAAO,EAAEF,YAAS;CACpB;AACF,CAAA"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as i } from "./projects-
|
|
1
|
+
import { O as e, Q as t, V as n, u as r } from "./build-BdRRmNf5.mjs";
|
|
2
|
+
import { t as i } from "./projects-CeLhtLvf.mjs";
|
|
3
3
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
4
4
|
import { useEffect as s, useRef as c, useState as l } from "react";
|
|
5
5
|
import { useNavigate as u } from "@tanstack/react-router";
|
|
6
6
|
import { Trans as d, useLingui as f } from "@lingui/react";
|
|
7
7
|
//#region src/client/routes/_auth/projects/-components/ProjectOverviewNavBar.tsx
|
|
8
|
-
function p({ onSearch: e, searchTerm:
|
|
9
|
-
let { i18n: r, _: i } = f(), o = c(null), u = c(!1), [d, p] = l(
|
|
8
|
+
function p({ onSearch: e, searchTerm: t = "" }) {
|
|
9
|
+
let { i18n: r, _: i } = f(), o = c(null), u = c(!1), [d, p] = l(t);
|
|
10
10
|
return s(() => {
|
|
11
|
-
!u.current && !o.current &&
|
|
12
|
-
}, [
|
|
11
|
+
!u.current && !o.current && t !== d && p(t);
|
|
12
|
+
}, [t]), s(() => () => {
|
|
13
13
|
o.current && clearTimeout(o.current);
|
|
14
|
-
}, []), /*#__PURE__*/ a(
|
|
14
|
+
}, []), /*#__PURE__*/ a(n, {
|
|
15
15
|
className: "w-full",
|
|
16
16
|
type: "text",
|
|
17
17
|
placeholder: r._({ id: "YIix5Y" }),
|
|
@@ -75,11 +75,11 @@ function h({ projects: e }) {
|
|
|
75
75
|
//#endregion
|
|
76
76
|
//#region src/client/routes/_auth/projects/index.tsx?tsr-split=component
|
|
77
77
|
function g() {
|
|
78
|
-
let { projects:
|
|
78
|
+
let { projects: n } = i.useLoaderData(), { search: r = "" } = i.useSearch(), s = i.useNavigate();
|
|
79
79
|
return /*#__PURE__*/ o(e, {
|
|
80
80
|
py: !0,
|
|
81
81
|
children: [
|
|
82
|
-
/*#__PURE__*/ a(
|
|
82
|
+
/*#__PURE__*/ a(t, {
|
|
83
83
|
className: "pb-4",
|
|
84
84
|
children: /*#__PURE__*/ a(d, { id: "+0B+ue" })
|
|
85
85
|
}),
|
|
@@ -94,7 +94,7 @@ function g() {
|
|
|
94
94
|
}),
|
|
95
95
|
/*#__PURE__*/ a("div", {
|
|
96
96
|
className: "pt-5",
|
|
97
|
-
children: /*#__PURE__*/ a(h, { projects:
|
|
97
|
+
children: /*#__PURE__*/ a(h, { projects: n })
|
|
98
98
|
})
|
|
99
99
|
]
|
|
100
100
|
});
|
|
@@ -102,4 +102,4 @@ function g() {
|
|
|
102
102
|
//#endregion
|
|
103
103
|
export { g as component };
|
|
104
104
|
|
|
105
|
-
//# sourceMappingURL=projects-
|
|
105
|
+
//# sourceMappingURL=projects-ClViaUuv.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects-
|
|
1
|
+
{"version":3,"file":"projects-ClViaUuv.mjs","names":["useEffect","useRef","useState","SearchInput","ProjectsOverviewNavBar","onSearch","searchTerm","useLingui","timerRef","inputFocusedRef","inputValue","setInputValue","current","clearTimeout","handleSearchChange","e","value","target","setTimeout","handleClear","className","type","placeholder","t","onChange","onFocus","onBlur","onClear","useNavigate","Card","ProjectCard","project","navigate","padding","onClick","to","params","projectId","id","className","div","p","domain_name","domain_id","data-testid","name","description","ProjectCardView","projects","length","map","ProjectsOverviewNavBar","ProjectCardView","Container","ContentHeading","Trans","Route","ProjectsOverview","projects","useLoaderData","search","useSearch","navigate","useNavigate","handleSearch","value","replace","component"],"sources":["../../src/client/routes/_auth/projects/-components/ProjectOverviewNavBar.tsx","../../src/client/routes/_auth/projects/-components/ProjectCardView.tsx","../../src/client/routes/_auth/projects/index.tsx?tsr-split=component"],"sourcesContent":["import { ChangeEvent, useEffect, useRef, useState } from \"react\"\nimport { SearchInput } from \"@cloudoperators/juno-ui-components\"\nimport { useLingui } from \"@lingui/react/macro\"\n\ntype ProjectsOverviewNavBarProps = {\n searchTerm?: string\n onSearch: (value: string) => void\n}\n\nexport function ProjectsOverviewNavBar({ onSearch, searchTerm = \"\" }: ProjectsOverviewNavBarProps) {\n const { t } = useLingui()\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const inputFocusedRef = useRef(false)\n const [inputValue, setInputValue] = useState(searchTerm)\n\n useEffect(() => {\n if (!inputFocusedRef.current && !timerRef.current && searchTerm !== inputValue) {\n setInputValue(searchTerm)\n }\n }, [searchTerm])\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [])\n\n const handleSearchChange = (e: ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setInputValue(value)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n timerRef.current = null\n onSearch(value)\n }, 300)\n }\n\n const handleClear = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n setInputValue(\"\")\n onSearch(\"\")\n }\n\n return (\n <SearchInput\n className=\"w-full\"\n type=\"text\"\n placeholder={t`Search...`}\n onChange={handleSearchChange}\n onFocus={() => {\n inputFocusedRef.current = true\n }}\n onBlur={() => {\n inputFocusedRef.current = false\n }}\n onClear={handleClear}\n value={inputValue}\n />\n )\n}\n","import { useNavigate } from \"@tanstack/react-router\"\nimport { Project } from \"@/server/Project/types/models\"\nimport { Card } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\n\ntype ProjectCardProps = {\n project: Project\n}\ntype ProjectCardViewProps = {\n projects: Project[] | undefined\n}\n\nexport function ProjectCard({ project }: ProjectCardProps) {\n const navigate = useNavigate()\n return (\n <Card\n padding\n onClick={() => navigate({ to: \"/projects/$projectId\", params: { projectId: project.id } })}\n className=\"flex flex-col gap-4\"\n >\n <div className=\"flex min-w-0 flex-col\">\n <p className=\"text-theme-light text-xs leading-5 font-normal\">\n {project.domain_name ?? project.domain_id ?? <Trans>Unknown domain</Trans>}\n </p>\n <p data-testid=\"project-name\" className=\"text-theme-high text-lg leading-7 font-bold\">\n {project.name}\n </p>\n </div>\n {project.description && (\n <p className=\"text-theme-default line-clamp-2 text-base leading-6 font-normal\">{project.description}</p>\n )}\n </Card>\n )\n}\n\nexport function ProjectCardView({ projects }: ProjectCardViewProps) {\n return (\n <div className=\"w-full\">\n <div className=\"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4\">\n {projects?.length ? (\n projects.map((project) => <ProjectCard key={project.id} project={project} />)\n ) : (\n <p className=\"text-center\">\n <Trans>No projects available.</Trans>\n </p>\n )}\n </div>\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { ProjectsOverviewNavBar } from \"@/client/routes/_auth/projects/-components/ProjectOverviewNavBar\"\nimport { ProjectCardView } from \"@/client/routes/_auth/projects/-components/ProjectCardView\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { Container, ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n component: ProjectsOverview,\n errorComponent: ({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n ),\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n loaderDeps: ({ search }) => ({\n search: search.search || \"\",\n }),\n loader: async ({ context, deps }) => {\n const allProjects = await context.trpcClient?.project.getAuthProjects.query()\n\n let projects = allProjects\n if (deps.search && deps.search.trim() !== \"\") {\n const searchTermLower = deps.search.toLowerCase()\n projects = allProjects?.filter(\n (project) =>\n project.name?.toLowerCase().includes(searchTermLower) ||\n project.description?.toLowerCase().includes(searchTermLower)\n )\n }\n\n return { projects }\n },\n})\n\nfunction ProjectsOverview() {\n const { projects } = Route.useLoaderData()\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n\n const handleSearch = (value: string) => {\n navigate({ search: { search: value }, replace: true })\n }\n\n return (\n <Container py>\n <ContentHeading className=\"pb-4\">\n <Trans>Projects</Trans>\n </ContentHeading>\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <ProjectCardView projects={projects} />\n </div>\n </Container>\n )\n}\n"],"mappings":";;;;;;;AASA,SAAgBI,EAAuB,EAAEC,aAAUC,gBAAa,MAAiC;CAC/F,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAWP,EAA6C,IAAA,GACxDQ,IAAkBR,EAAO,EAAA,GACzB,CAACS,GAAYC,KAAiBT,EAASI,CAAAA;CAiC7C,OA/BAN,QAAU;EACR,AAAI,CAACS,EAAgBG,WAAW,CAACJ,EAASI,WAAWN,MAAeI,KAClEC,EAAcL,CAAAA;CAElB,GAAG,CAACA,CAAAA,CAAW,GAEfN,cACS;EACL,AAAIQ,EAASI,WAASC,aAAaL,EAASI,OAAO;CACrD,GACC,CAAA,CAAE,GAsBH,gBAACT,GAAAA;EACCiB,WAAU;EACVC,MAAK;EACLC,aAAaC,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;EACxBC,WAxBwBT,MAAAA;GAC1B,IAAMC,IAAQD,EAAEE,OAAOD;GAGvBR,AAFAG,EAAcK,CAAAA,GACVR,EAASI,WAASC,aAAaL,EAASI,OAAO,GACnDJ,EAASI,UAAUM,iBAAW;IAE5Bb,AADAG,EAASI,UAAU,MACnBP,EAASW,CAAAA;GACX,GAAG,GAAA;EACL;EAiBIS,eAAS;GACPhB,EAAgBG,UAAU;EAC5B;EACAc,cAAQ;GACNjB,EAAgBG,UAAU;EAC5B;EACAe,eArBgB;GAMlBtB,AALA,AAEEG,EAASI,aADTC,aAAaL,EAASI,OAAO,GACV,OAErBD,EAAc,EAAA,GACdN,EAAS,EAAA;EACX;EAeIW,OAAON;;AAGb;;;AClDA,SAAgBoB,EAAY,EAAEC,cAA2B;CACvD,IAAMC,IAAWJ,EAAAA;CACjB,OACE,gBAACC,GAAAA;EACCI,SAAO;EACPC,eAAeF,EAAS;GAAEG,IAAI;GAAwBC,QAAQ,EAAEC,WAAWN,EAAQO,GAAG;EAAE,CAAA;EACxFC,WAAU;aAEV,gBAACC,OAAAA;GAAID,WAAU;cACb,gBAACE,KAAAA;IAAEF,WAAU;cACVR,EAAQW,eAAeX,EAAQY,aAAa,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;OAE/C,gBAACF,KAAAA;IAAEG,eAAY;IAAeL,WAAU;cACrCR,EAAQc;;MAGZd,EAAQe,eACP,gBAACL,KAAAA;GAAEF,WAAU;aAAmER,EAAQe;;;AAIhG;AAEA,SAAgBC,EAAgB,EAAEC,eAAgC;CAChE,OACE,gBAACR,OAAAA;EAAID,WAAU;YACb,gBAACC,OAAAA;GAAID,WAAU;aACZS,GAAUC,SACTD,EAASE,KAAKnB,MAAY,gBAACD,GAAAA,EAAsCC,WAAAA,GAArBA,EAAQO,EAAE,CAAA,IAEtD,gBAACG,KAAAA;IAAEF,WAAU;cACX,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;AAMZ;;;ACPA,SAASkB,IAAAA;CACP,IAAM,EAAEC,gBAAaF,EAAMG,cAAa,GAClC,EAAEC,YAAS,OAAOJ,EAAMK,UAAS,GACjCC,IAAWN,EAAMO,YAAW;CAMlC,OACE,gBAAC,GAAA;EAAU,IAAE;;GACX,gBAAC,GAAA;IAAe,WAAU;cACxB,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;GAEF,gBAAC,GAAA;IAAuB,YAAYH;IAAQ,WAT1BK,MAAAA;KACpBH,EAAS;MAAEF,QAAQ,EAAEA,QAAQK,EAAM;MAAGC,SAAS;KAAK,CAAA;IACtD;;GAQI,gBAAC,OAAA;IAAI,WAAU;cACb,gBAAC,GAAA,EAA0BR,YAAAA,CAAAA;;;;AAInC"}
|
|
@@ -2,8 +2,9 @@ import { jsx as e } from "react/jsx-runtime";
|
|
|
2
2
|
import { useEffect as t, useRef as n, useState as r } from "react";
|
|
3
3
|
import { createPortal as i } from "react-dom";
|
|
4
4
|
import { createFileRoute as a, lazyRouteComponent as o, useRouteContext as s } from "@tanstack/react-router";
|
|
5
|
+
import { z as c } from "zod";
|
|
5
6
|
//#region src/client/components/Slot.tsx
|
|
6
|
-
function
|
|
7
|
+
function l({ children: a }) {
|
|
7
8
|
let o = n(null), [s, c] = r(null);
|
|
8
9
|
return t(() => {
|
|
9
10
|
o.current && c(o.current.shadowRoot ?? o.current.attachShadow({ mode: "open" }));
|
|
@@ -13,15 +14,15 @@ function c({ children: a }) {
|
|
|
13
14
|
children: s && /*#__PURE__*/ i(a, s)
|
|
14
15
|
});
|
|
15
16
|
}
|
|
16
|
-
function
|
|
17
|
+
function u({ component: t, useShadowDOM: n = !0 }) {
|
|
17
18
|
let { trpcClient: r } = s({ strict: !1 });
|
|
18
19
|
if (!r) return null;
|
|
19
20
|
let i = /*#__PURE__*/ e(t, { auroraContext: { client: r } });
|
|
20
|
-
return n ? /*#__PURE__*/ e(
|
|
21
|
+
return n ? /*#__PURE__*/ e(l, { children: i }) : i;
|
|
21
22
|
}
|
|
22
|
-
var
|
|
23
|
-
component: o(() => import("./_projectId-
|
|
24
|
-
errorComponent: o(() => import("./_projectId-
|
|
23
|
+
var d = a("/_auth/projects/$projectId")({
|
|
24
|
+
component: o(() => import("./_projectId-cW9aQ4Ag.mjs"), "component"),
|
|
25
|
+
errorComponent: o(() => import("./_projectId-B_2sZKk-.mjs"), "errorComponent"),
|
|
25
26
|
loader: async (e) => {
|
|
26
27
|
let { context: t, params: n } = e, r = await t.trpcClient?.auth.setCurrentScope.mutate({
|
|
27
28
|
type: "project",
|
|
@@ -39,8 +40,33 @@ var u = a("/_auth/projects/$projectId")({
|
|
|
39
40
|
projectId: n.projectId
|
|
40
41
|
};
|
|
41
42
|
}
|
|
43
|
+
}), f = c.object({
|
|
44
|
+
labelKey: c.enum([
|
|
45
|
+
"Compute",
|
|
46
|
+
"Network",
|
|
47
|
+
"Storage",
|
|
48
|
+
"Services",
|
|
49
|
+
"Images",
|
|
50
|
+
"Flavors",
|
|
51
|
+
"Security Groups",
|
|
52
|
+
"Floating IPs",
|
|
53
|
+
"PCA (Clavis)"
|
|
54
|
+
]).optional(),
|
|
55
|
+
to: c.string().optional(),
|
|
56
|
+
useParamAsLabel: c.string().optional(),
|
|
57
|
+
useParentTitleAsLabel: c.boolean().optional()
|
|
58
|
+
}), p = c.object({
|
|
59
|
+
section: c.string(),
|
|
60
|
+
service: c.string().optional(),
|
|
61
|
+
isDetail: c.boolean().optional(),
|
|
62
|
+
crumb: f.optional(),
|
|
63
|
+
sectionCrumb: f.optional(),
|
|
64
|
+
intermediateCrumb: f.optional()
|
|
42
65
|
});
|
|
66
|
+
function m(e) {
|
|
67
|
+
return p.safeParse(e).success;
|
|
68
|
+
}
|
|
43
69
|
//#endregion
|
|
44
|
-
export {
|
|
70
|
+
export { d as n, u as r, m as t };
|
|
45
71
|
|
|
46
|
-
//# sourceMappingURL=
|
|
72
|
+
//# sourceMappingURL=routeInfo-DlDJZnpg.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeInfo-DlDJZnpg.mjs","names":["useRef","useState","useEffect","createPortal","useRouteContext","SlotShadowRoot","children","ref","root","setRoot","current","shadowRoot","attachShadow","mode","div","style","display","Slot","component","Component","useShadowDOM","trpcClient","strict","content","auroraContext","client","createFileRoute","Route","component","lazyRouteComponent","$$splitComponentImporter","errorComponent","$$splitErrorComponentImporter","loader","options","context","params","data","trpcClient","auth","setCurrentScope","mutate","type","projectId","availableServices","getAvailableServices","query","accountId","domain","id","crumbDomain","path","name","crumbProject","project","z","CRUMB_LABEL_KEYS","CrumbSchema","object","labelKey","enum","optional","to","string","useParamAsLabel","useParentTitleAsLabel","boolean","RouteInfoSchema","section","service","isDetail","crumb","sectionCrumb","intermediateCrumb","isRouteInfo","data","safeParse","success"],"sources":["../../src/client/components/Slot.tsx","../../src/client/routes/_auth/projects/$projectId.tsx","../../src/client/routes/routeInfo.ts"],"sourcesContent":["import { useRef, useState, useEffect, type ReactNode, type FC } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { useRouteContext } from \"@tanstack/react-router\"\nimport type { SlotProps } from \"../AuroraApp\"\n\nfunction SlotShadowRoot({ children }: { children: ReactNode }) {\n const ref = useRef<HTMLDivElement>(null)\n const [root, setRoot] = useState<ShadowRoot | null>(null)\n\n useEffect(() => {\n if (!ref.current) return\n setRoot(ref.current.shadowRoot ?? ref.current.attachShadow({ mode: \"open\" }))\n }, [])\n\n return (\n <div ref={ref} style={{ display: \"contents\" }}>\n {root && createPortal(children, root)}\n </div>\n )\n}\n\nexport function Slot({\n component: Component,\n useShadowDOM = true,\n}: {\n component: FC<SlotProps>\n useShadowDOM?: boolean\n}) {\n const { trpcClient } = useRouteContext({ strict: false })\n\n if (!trpcClient) return null\n\n const content = <Component auroraContext={{ client: trpcClient }} />\n\n if (!useShadowDOM) {\n return content\n }\n\n return <SlotShadowRoot>{content}</SlotShadowRoot>\n}\n","import { createFileRoute, Outlet, useLoaderData } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\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 const availableServices = await context.trpcClient?.auth.getAvailableServices.query()\n\n // Extract accountId (domain id) from the rescoped token\n // This is needed for SideNavBar navigation until we refactor it\n const accountId = data?.domain?.id || \"\"\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId, // Keep for SideNavBar compatibility\n projectId: params.projectId,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject, crumbDomain } = useLoaderData({ from: Route.id })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n availableServices={availableServices!}\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","import { z } from \"zod\"\n\nexport const CRUMB_LABEL_KEYS = [\n \"Compute\",\n \"Network\",\n \"Storage\",\n \"Services\",\n \"Images\",\n \"Flavors\",\n \"Security Groups\",\n \"Floating IPs\",\n \"PCA (Clavis)\",\n] as const\n\nexport type CrumbLabelKey = (typeof CRUMB_LABEL_KEYS)[number]\n\nconst CrumbSchema = z.object({\n labelKey: z.enum(CRUMB_LABEL_KEYS).optional(),\n to: z.string().optional(),\n useParamAsLabel: z.string().optional(),\n useParentTitleAsLabel: z.boolean().optional(),\n})\n\nconst RouteInfoSchema = z.object({\n section: z.string(),\n service: z.string().optional(),\n isDetail: z.boolean().optional(),\n crumb: CrumbSchema.optional(),\n sectionCrumb: CrumbSchema.optional(),\n intermediateCrumb: CrumbSchema.optional(),\n})\n\nexport type Crumb = z.infer<typeof CrumbSchema>\nexport type RouteInfo = z.infer<typeof RouteInfoSchema>\n\nexport function isRouteInfo(data: unknown): data is RouteInfo {\n return RouteInfoSchema.safeParse(data).success\n}\n"],"mappings":";;;;;;AAKA,SAASK,EAAe,EAAEC,eAAmC;CAC3D,IAAMC,IAAMP,EAAuB,IAAA,GAC7B,CAACQ,GAAMC,KAAWR,EAA4B,IAAA;CAOpD,OALAC,QAAU;EACHK,EAAIG,WACTD,EAAQF,EAAIG,QAAQC,cAAcJ,EAAIG,QAAQE,aAAa,EAAEC,MAAM,OAAO,CAAA,CAAA;CAC5E,GAAG,CAAA,CAAE,GAGH,gBAACC,OAAAA;EAASP;EAAKQ,OAAO,EAAEC,SAAS,WAAW;YACzCR,KAAQL,gBAAaG,GAAUE,CAAAA;;AAGtC;AAEA,SAAgBS,EAAK,EACnBC,WAAWC,GACXC,kBAAe,MAIhB;CACC,IAAM,EAAEC,kBAAejB,EAAgB,EAAEkB,QAAQ,GAAM,CAAA;CAEvD,IAAI,CAACD,GAAY,OAAO;CAExB,IAAME,IAAU,gBAACJ,GAAAA,EAAUK,eAAe,EAAEC,QAAQJ,EAAW,EAAA,CAAA;CAM/D,OAJKD,IAIE,gBAACf,GAAAA,EAAAA,UAAgBkB,EAAAA,CAAAA,IAHfA;AAIX;ACjCA,IAAaI,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,GACMC,IAAoB,MAAMT,EAAQG,YAAYC,KAAKM,qBAAqBC,MAAAA,GAIxEC,IAAYV,GAAMW,QAAQC,MAAM;EAEtC,OAAO;GACLX,YAAYH,EAAQG;GACpBY,aAAa;IAAEC,MAAM;IAAaC,MAAMf,GAAMW,QAAQI;GAAK;GAC3DC,cAAchB,GAAMiB;GACpBV;GACAG;GACAJ,WAAWP,EAAOO;EACpB;CACF;AACF,CAAA,GChBMc,IAAcF,EAAEG,OAAO;CAC3BC,UAAUJ,EAAEK,KAAKJ;EAdjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAMiBA,CAAAA,EAAkBK,SAAQ;CAC3CC,IAAIP,EAAEQ,OAAM,EAAGF,SAAQ;CACvBG,iBAAiBT,EAAEQ,OAAM,EAAGF,SAAQ;CACpCI,uBAAuBV,EAAEW,QAAO,EAAGL,SAAQ;AAC7C,CAAA,GAEMM,IAAkBZ,EAAEG,OAAO;CAC/BU,SAASb,EAAEQ,OAAM;CACjBM,SAASd,EAAEQ,OAAM,EAAGF,SAAQ;CAC5BS,UAAUf,EAAEW,QAAO,EAAGL,SAAQ;CAC9BU,OAAOd,EAAYI,SAAQ;CAC3BW,cAAcf,EAAYI,SAAQ;CAClCY,mBAAmBhB,EAAYI,SAAQ;AACzC,CAAA;AAKA,SAAgBa,EAAYC,GAAa;CACvC,OAAOR,EAAgBS,UAAUD,CAAAA,EAAME;AACzC"}
|