@cobaltcore-dev/aurora 0.23.0 → 1.0.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/App.d.ts +1 -1
- package/dist/client/{AuthProvider-CQ6Yppoh.mjs → AuthProvider-5TyZKZkx.mjs} +3 -3
- package/dist/client/AuthProvider-5TyZKZkx.mjs.map +1 -0
- package/dist/client/{ContentHeader-9KZdhOoA.mjs → ContentHeader-D64NtKvo.mjs} +26 -25
- package/dist/client/ContentHeader-D64NtKvo.mjs.map +1 -0
- package/dist/client/DeleteFlavorModal-C2K43ABZ.mjs +732 -0
- package/dist/client/DeleteFlavorModal-C2K43ABZ.mjs.map +1 -0
- package/dist/client/DeletePcaModal-D9v8E0Ki.mjs +92 -0
- package/dist/client/DeletePcaModal-D9v8E0Ki.mjs.map +1 -0
- package/dist/client/DetailsInfo-h7rPJ4Jf.mjs +61 -0
- package/dist/client/DetailsInfo-h7rPJ4Jf.mjs.map +1 -0
- package/dist/client/FiltersInput-Bw8TFfwb.mjs +82 -0
- package/dist/client/FiltersInput-Bw8TFfwb.mjs.map +1 -0
- package/dist/client/{FloatingIpActionModals-BcceUHcg.mjs → FloatingIpActionModals-BfEDfYg9.mjs} +66 -66
- package/dist/client/{FloatingIpActionModals-BcceUHcg.mjs.map → FloatingIpActionModals-BfEDfYg9.mjs.map} +1 -1
- package/dist/client/ImageToastNotifications-C0Tluzq-.mjs +1125 -0
- package/dist/client/ImageToastNotifications-C0Tluzq-.mjs.map +1 -0
- package/dist/client/{RouteError-Rm08PcxN.mjs → RouteError-B-NPGIv7.mjs} +2 -2
- package/dist/client/{RouteError-Rm08PcxN.mjs.map → RouteError-B-NPGIv7.mjs.map} +1 -1
- package/dist/client/Slot-CWb612-_.mjs.map +1 -1
- package/dist/client/{SortInput-D_q_jDfe.mjs → SortInput-DysAXpB3.mjs} +6 -6
- package/dist/client/{SortInput-D_q_jDfe.mjs.map → SortInput-DysAXpB3.mjs.map} +1 -1
- package/dist/client/{StatusError-2ZU1gFpu.mjs → StatusError-DX-GvLjq.mjs} +8 -8
- package/dist/client/{StatusError-2ZU1gFpu.mjs.map → StatusError-DX-GvLjq.mjs.map} +1 -1
- package/dist/client/TwoColumnDescriptionList-B3xunXmz.mjs +22 -0
- package/dist/client/TwoColumnDescriptionList-B3xunXmz.mjs.map +1 -0
- package/dist/client/{_auth-D5_QNUos.mjs → _auth-R5H2yKFf.mjs} +2 -2
- package/dist/client/_auth-R5H2yKFf.mjs.map +1 -0
- package/dist/client/_flavorId-Dit5mM8I.mjs +210 -0
- package/dist/client/_flavorId-Dit5mM8I.mjs.map +1 -0
- package/dist/client/{_flavorId-CFmkmg2Y.mjs → _flavorId-Zj7LNL-R.mjs} +4 -4
- package/dist/client/{_flavorId-CFmkmg2Y.mjs.map → _flavorId-Zj7LNL-R.mjs.map} +1 -1
- package/dist/client/_floatingIpId-B0MCoqE3.mjs +215 -0
- package/dist/client/_floatingIpId-B0MCoqE3.mjs.map +1 -0
- package/dist/client/{_floatingIpId-Dzh6_JCI.mjs → _floatingIpId-DCQQpNO-.mjs} +4 -4
- package/dist/client/{_floatingIpId-Dzh6_JCI.mjs.map → _floatingIpId-DCQQpNO-.mjs.map} +1 -1
- package/dist/client/_imageId-CZYzBAVx.mjs +558 -0
- package/dist/client/_imageId-CZYzBAVx.mjs.map +1 -0
- package/dist/client/_pcaId-CHRRsWmO.mjs +605 -0
- package/dist/client/_pcaId-CHRRsWmO.mjs.map +1 -0
- package/dist/client/{_projectId-DNZsNxJw.mjs → _projectId-B8wWSxPu.mjs} +9 -9
- package/dist/client/_projectId-B8wWSxPu.mjs.map +1 -0
- package/dist/client/{_projectId-BuBIFdgG.mjs → _projectId-C5DUYIjt.mjs} +117 -117
- package/dist/client/{_projectId-BuBIFdgG.mjs.map → _projectId-C5DUYIjt.mjs.map} +1 -1
- package/dist/client/{_projectId-CAQkJHZ4.mjs → _projectId-D2pFfYIs.mjs} +3 -3
- package/dist/client/{_projectId-CAQkJHZ4.mjs.map → _projectId-D2pFfYIs.mjs.map} +1 -1
- package/dist/client/{_projectId-D-b7paXE.mjs → _projectId-DhSWowQo.mjs} +4 -4
- package/dist/client/{_projectId-D-b7paXE.mjs.map → _projectId-DhSWowQo.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-DFdNKa2l.mjs → _securityGroupId-DZ4D4WwB.mjs} +635 -617
- package/dist/client/_securityGroupId-DZ4D4WwB.mjs.map +1 -0
- package/dist/client/{_securityGroupId-DRkY3Gt6.mjs → _securityGroupId-Mj8NJT2-.mjs} +4 -4
- package/dist/client/{_securityGroupId-DRkY3Gt6.mjs.map → _securityGroupId-Mj8NJT2-.mjs.map} +1 -1
- package/dist/client/_storageType-C-9bNkmZ.mjs +2211 -0
- package/dist/client/_storageType-C-9bNkmZ.mjs.map +1 -0
- package/dist/client/_storageType-zeSZe--V.mjs.map +1 -1
- package/dist/client/{about-C8tTrQaW.mjs → about-WLyShNgE.mjs} +8 -8
- package/dist/client/about-WLyShNgE.mjs.map +1 -0
- package/dist/client/assets/objectDownload.worker-BXFQIIU_.js.map +1 -0
- package/dist/client/assets/objectDownload.worker-ECvFtmOF.js.map +1 -0
- package/dist/client/{aurora-jyvXcI4T.mjs → aurora-IMO9HhqJ.mjs} +2 -2
- package/dist/client/aurora-IMO9HhqJ.mjs.map +1 -0
- package/dist/client/{build-CRLQyqu2.mjs → build-DnD-T35u.mjs} +8180 -8212
- package/dist/client/build-DnD-T35u.mjs.map +1 -0
- package/dist/client/components/Auth/LoginForm.d.ts +1 -1
- package/dist/client/components/Auth/SessionExpirationTimer.d.ts +1 -1
- package/dist/client/components/ContentHeader/ContentHeader.d.ts +1 -1
- package/dist/client/components/Error/RouteError.d.ts +1 -1
- package/dist/client/components/Error/StatusError.d.ts +1 -1
- package/dist/client/components/JsonEditor.d.ts +1 -1
- package/dist/client/components/ListToolbar/FiltersInput.d.ts +3 -1
- package/dist/client/components/ListToolbar/SelectedFilters.d.ts +1 -1
- package/dist/client/components/ListToolbar/index.d.ts +1 -1
- package/dist/client/components/ProjectView/ProjectInfoBox.d.ts +1 -1
- package/dist/client/components/Slot.d.ts +1 -1
- package/dist/client/components/TwoColumnDescriptionList.d.ts +11 -0
- package/dist/client/components/navigation/LanguageSelect.d.ts +1 -1
- package/dist/client/components/navigation/MainNavigation.d.ts +1 -1
- package/dist/client/components/navigation/UserMenu.d.ts +1 -1
- package/dist/client/{flavors-Dy-2mRGv.mjs → flavors-Cp0LEGOH.mjs} +2 -2
- package/dist/client/{flavors-Dy-2mRGv.mjs.map → flavors-Cp0LEGOH.mjs.map} +1 -1
- package/dist/client/{flavors-BfTXqmoD.mjs → flavors-CwMbDRHm2.mjs} +203 -201
- package/dist/client/flavors-CwMbDRHm2.mjs.map +1 -0
- package/dist/client/flavors-DWMZ6TuJ.mjs.map +1 -1
- package/dist/client/floatingips-ICwo-rV_.mjs +591 -0
- package/dist/client/floatingips-ICwo-rV_.mjs.map +1 -0
- package/dist/client/formatBytes-CZv_XyCY.mjs.map +1 -1
- package/dist/client/helpers-1PpYf-fC.mjs.map +1 -1
- package/dist/client/hooks/useAvailableViewportHeight.d.ts +33 -0
- package/dist/client/hooks/useVirtualizedTableBody.d.ts +37 -0
- package/dist/client/{hooks-Bw3sHHOg.mjs → hooks-CrriowRk.mjs} +2 -2
- package/dist/client/{hooks-Bw3sHHOg.mjs.map → hooks-CrriowRk.mjs.map} +1 -1
- package/dist/client/images-DOGZmr3D.mjs +1937 -0
- package/dist/client/images-DOGZmr3D.mjs.map +1 -0
- package/dist/client/{images-DPKUXryV.mjs → images-DWiM_72I.mjs} +2 -2
- package/dist/client/{images-DPKUXryV.mjs.map → images-DWiM_72I.mjs.map} +1 -1
- package/dist/client/images-NBf2bV43.mjs.map +1 -1
- package/dist/client/index.js +601 -445
- package/dist/client/index.js.map +1 -1
- package/dist/client/{md-CyCflQee.mjs → md-DNzcRhmz.mjs} +6 -60
- package/dist/client/{md-CyCflQee.mjs.map → md-DNzcRhmz.mjs.map} +1 -1
- package/dist/client/network-DuZm76BZ.mjs.map +1 -1
- package/dist/client/objects-D2MKUCxc.mjs +56 -0
- package/dist/client/objects-D2MKUCxc.mjs.map +1 -0
- package/dist/client/objects-DI1-tnKr.mjs +56 -0
- package/dist/client/objects-DI1-tnKr.mjs.map +1 -0
- package/dist/client/objects-DeK2WD5K.mjs +10078 -0
- package/dist/client/objects-DeK2WD5K.mjs.map +1 -0
- package/dist/client/pca-BokFv4Gz.mjs +239 -0
- package/dist/client/pca-BokFv4Gz.mjs.map +1 -0
- package/dist/client/{pca-D0kKxHp4.mjs → pca-D5jHAl0b.mjs} +4 -3
- package/dist/client/{pca-D0kKxHp4.mjs.map → pca-D5jHAl0b.mjs.map} +1 -1
- package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
- package/dist/client/routeInfo-CdTRlSxv.mjs.map +1 -1
- package/dist/client/{routes-CtfnI-aY.mjs → routes-B05u5bk4.mjs} +2 -2
- package/dist/client/{routes-CtfnI-aY.mjs.map → routes-B05u5bk4.mjs.map} +1 -1
- package/dist/client/{routes-BOf-GDMM.mjs → routes-DOJr5onJ.mjs} +31 -28
- package/dist/client/routes-DOJr5onJ.mjs.map +1 -0
- package/dist/client/{securitygroups-DRhFle2O.mjs → securitygroups-Be2Qgmew.mjs} +201 -195
- package/dist/client/securitygroups-Be2Qgmew.mjs.map +1 -0
- package/dist/client/{securitygroups-B8aLyFK7.mjs → securitygroups-_7SYN2jN.mjs} +2 -2
- package/dist/client/{securitygroups-B8aLyFK7.mjs.map → securitygroups-_7SYN2jN.mjs.map} +1 -1
- package/dist/client/store/AuthProvider.d.ts +1 -1
- package/dist/client/{trpcClient-Di56hpVv.mjs → trpcClient-D7gpR7YG.mjs} +2 -2
- package/dist/client/{trpcClient-Di56hpVv.mjs.map → trpcClient-D7gpR7YG.mjs.map} +1 -1
- package/dist/client/trpcClient.d.ts +125 -11
- package/dist/client/useModal-DCs1OJh7.mjs.map +1 -1
- package/dist/client/{useSecurityGroupPermissions-BPS1ibWq.mjs → useSecurityGroupPermissions-qPwm4mFt.mjs} +15 -15
- package/dist/client/{useSecurityGroupPermissions-BPS1ibWq.mjs.map → useSecurityGroupPermissions-qPwm4mFt.mjs.map} +1 -1
- package/dist/server/index.d.ts +125 -11
- package/dist/server/index.js +4142 -2845
- package/package.json +8 -8
- package/dist/client/AuthProvider-CQ6Yppoh.mjs.map +0 -1
- package/dist/client/BucketToastNotifications-BhPi4WWw.mjs +0 -613
- package/dist/client/BucketToastNotifications-BhPi4WWw.mjs.map +0 -1
- package/dist/client/ContentHeader-9KZdhOoA.mjs.map +0 -1
- package/dist/client/DeleteFlavorModal-Be2qZo4w.mjs +0 -713
- package/dist/client/DeleteFlavorModal-Be2qZo4w.mjs.map +0 -1
- package/dist/client/DeletePcaModal-CIFsGWyj.mjs +0 -80
- package/dist/client/DeletePcaModal-CIFsGWyj.mjs.map +0 -1
- package/dist/client/DetailsInfo-CHVD7d-W.mjs +0 -52
- package/dist/client/DetailsInfo-CHVD7d-W.mjs.map +0 -1
- package/dist/client/FiltersInput-DqT08Ib-.mjs +0 -81
- package/dist/client/FiltersInput-DqT08Ib-.mjs.map +0 -1
- package/dist/client/ImageToastNotifications-BGyX2J6j.mjs +0 -1219
- package/dist/client/ImageToastNotifications-BGyX2J6j.mjs.map +0 -1
- package/dist/client/_auth-D5_QNUos.mjs.map +0 -1
- package/dist/client/_flavorId-BsmqS9hP.mjs +0 -194
- package/dist/client/_flavorId-BsmqS9hP.mjs.map +0 -1
- package/dist/client/_floatingIpId-Bb9ZEJ6b.mjs +0 -228
- package/dist/client/_floatingIpId-Bb9ZEJ6b.mjs.map +0 -1
- package/dist/client/_imageId-C3As7sHE.mjs +0 -534
- package/dist/client/_imageId-C3As7sHE.mjs.map +0 -1
- package/dist/client/_pcaId-n0q0aDb6.mjs +0 -545
- package/dist/client/_pcaId-n0q0aDb6.mjs.map +0 -1
- package/dist/client/_projectId-DNZsNxJw.mjs.map +0 -1
- package/dist/client/_securityGroupId-DFdNKa2l.mjs.map +0 -1
- package/dist/client/_storageType-BKfQcpgp.mjs +0 -81
- package/dist/client/_storageType-BKfQcpgp.mjs.map +0 -1
- package/dist/client/_storageType-sMj9NEJz.mjs +0 -2870
- package/dist/client/_storageType-sMj9NEJz.mjs.map +0 -1
- package/dist/client/about-C8tTrQaW.mjs.map +0 -1
- package/dist/client/assets/objectDownload.worker-BAc5Au4B.js.map +0 -1
- package/dist/client/aurora-jyvXcI4T.mjs.map +0 -1
- package/dist/client/build-CRLQyqu2.mjs.map +0 -1
- package/dist/client/flavors-BfTXqmoD.mjs.map +0 -1
- package/dist/client/floatingips-zhNK6Xxn.mjs +0 -562
- package/dist/client/floatingips-zhNK6Xxn.mjs.map +0 -1
- package/dist/client/images-DhZnqUG_.mjs +0 -1890
- package/dist/client/images-DhZnqUG_.mjs.map +0 -1
- package/dist/client/objects-BG1saVLZ.mjs +0 -6648
- package/dist/client/objects-BG1saVLZ.mjs.map +0 -1
- package/dist/client/objects-Dahys529.mjs +0 -103
- package/dist/client/objects-Dahys529.mjs.map +0 -1
- package/dist/client/objects-o2Cj_ndZ.mjs +0 -8
- package/dist/client/objects-o2Cj_ndZ.mjs.map +0 -1
- package/dist/client/pca-B60iWWfG.mjs +0 -251
- package/dist/client/pca-B60iWWfG.mjs.map +0 -1
- package/dist/client/routes-BOf-GDMM.mjs.map +0 -1
- package/dist/client/securitygroups-DRhFle2O.mjs.map +0 -1
- package/dist/client/useListWithFiltering-aPTUNRaW.mjs +0 -32
- package/dist/client/useListWithFiltering-aPTUNRaW.mjs.map +0 -1
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { B as e, C as t, E as n, G as r, I as i, S as a, Y as o, Z as s, _ as c, a as l, dt as u, f as d, h as f, k as p, m, rt as h, s as g, t as _ } from "./build-DnD-T35u.mjs";
|
|
2
|
+
import { a as v } from "./trpcClient-D7gpR7YG.mjs";
|
|
3
|
+
import { t as y } from "./pca-D5jHAl0b.mjs";
|
|
4
|
+
import { t as b } from "./useProjectId-DBc5lpoU.mjs";
|
|
5
|
+
import { f as x, n as S } from "./md-DNzcRhmz.mjs";
|
|
6
|
+
import { t as C } from "./ContentHeader-D64NtKvo.mjs";
|
|
7
|
+
import "./hooks-CrriowRk.mjs";
|
|
8
|
+
import { t as w } from "./useModal-DCs1OJh7.mjs";
|
|
9
|
+
import { t as T } from "./DeletePcaModal-D9v8E0Ki.mjs";
|
|
10
|
+
import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
|
|
11
|
+
import { useState as k } from "react";
|
|
12
|
+
import { useNavigate as A } from "@tanstack/react-router";
|
|
13
|
+
import { Trans as j, useLingui as M } from "@lingui/react";
|
|
14
|
+
import { z as N } from "zod";
|
|
15
|
+
import { useForm as P, useStore as F } from "@tanstack/react-form";
|
|
16
|
+
//#region src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/PcaTableRow.tsx
|
|
17
|
+
var I = ({ pca: e }) => {
|
|
18
|
+
let { i18n: t, _: i } = M(), o = A(), s = b(), [l, u] = w(!1), f = () => o({
|
|
19
|
+
to: "/projects/$projectId/services/pca/$pcaId",
|
|
20
|
+
params: {
|
|
21
|
+
projectId: s,
|
|
22
|
+
pcaId: e.id
|
|
23
|
+
}
|
|
24
|
+
}), m = {
|
|
25
|
+
CREATING: {
|
|
26
|
+
text: t._({ id: "E9bKSA" }),
|
|
27
|
+
icon: /*#__PURE__*/ D(r, { size: "18" })
|
|
28
|
+
},
|
|
29
|
+
AWAITING_CERTIFICATE: {
|
|
30
|
+
text: t._({ id: "mB4LB4" }),
|
|
31
|
+
icon: /*#__PURE__*/ D(d, {
|
|
32
|
+
icon: "accessTime",
|
|
33
|
+
size: 20,
|
|
34
|
+
color: "#FBC02D"
|
|
35
|
+
})
|
|
36
|
+
},
|
|
37
|
+
READY: {
|
|
38
|
+
text: t._({ id: "ckH3fT" }),
|
|
39
|
+
icon: /*#__PURE__*/ D(S, {
|
|
40
|
+
size: 20,
|
|
41
|
+
color: "white",
|
|
42
|
+
fill: "#4FB81C"
|
|
43
|
+
})
|
|
44
|
+
},
|
|
45
|
+
FAILED: {
|
|
46
|
+
text: t._({ id: "7Bj3x9" }),
|
|
47
|
+
icon: /*#__PURE__*/ D(x, {
|
|
48
|
+
size: 20,
|
|
49
|
+
color: "white",
|
|
50
|
+
fill: "#D32F2F"
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
return /*#__PURE__*/ O(E, { children: [/*#__PURE__*/ O(n, {
|
|
55
|
+
"data-testid": `pca-row-${e.id}`,
|
|
56
|
+
onClick: f,
|
|
57
|
+
children: [
|
|
58
|
+
/*#__PURE__*/ D(_, { children: /*#__PURE__*/ O("div", {
|
|
59
|
+
className: "flex items-center gap-2",
|
|
60
|
+
children: [m[e.state].icon, m[e.state].text]
|
|
61
|
+
}) }),
|
|
62
|
+
/*#__PURE__*/ D(_, { children: e.id }),
|
|
63
|
+
/*#__PURE__*/ D(_, { children: e.display_subject || "—" }),
|
|
64
|
+
/*#__PURE__*/ D(_, {
|
|
65
|
+
onClick: (e) => e.stopPropagation(),
|
|
66
|
+
className: "items-end pr-0",
|
|
67
|
+
children: /*#__PURE__*/ D(p, { children: /*#__PURE__*/ O(c, { children: [/*#__PURE__*/ D(a, {
|
|
68
|
+
label: t._({ id: "v0hPHE" }),
|
|
69
|
+
onClick: f
|
|
70
|
+
}), /*#__PURE__*/ D(a, {
|
|
71
|
+
label: t._({ id: "nzFJqC" }),
|
|
72
|
+
onClick: u
|
|
73
|
+
})] }) })
|
|
74
|
+
})
|
|
75
|
+
]
|
|
76
|
+
}, e.id), l && /*#__PURE__*/ D(T, {
|
|
77
|
+
pca: e,
|
|
78
|
+
open: l,
|
|
79
|
+
onClose: u
|
|
80
|
+
})] });
|
|
81
|
+
}, L = /^(?=.{1,253}$)(?:\*\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63}$/, R = (e) => L.test(e), z = ({ open: e, onClose: t }) => {
|
|
82
|
+
let { i18n: n, _: a } = M(), s = A(), c = b(), l = v.useUtils(), { isPending: d, ...p } = v.services.pca.create.useMutation({ onSettled: () => l.services.pca.list.invalidate() }), h = N.object({ common_name: N.string().trim().min(1, n._({ id: "qhDo93" })).refine((e) => R(e), { message: n._({ id: "gy6L1u" }) }) }), g = P({
|
|
83
|
+
defaultValues: { common_name: "" },
|
|
84
|
+
validators: { onSubmit: h },
|
|
85
|
+
onSubmit: async ({ value: e }) => {
|
|
86
|
+
if (d) return;
|
|
87
|
+
let t = await p.mutateAsync({
|
|
88
|
+
project_id: c,
|
|
89
|
+
configuration: { subject: { named_attributes: { cn: e.common_name } } }
|
|
90
|
+
});
|
|
91
|
+
_(), await s({
|
|
92
|
+
to: "/projects/$projectId/services/pca/$pcaId",
|
|
93
|
+
params: {
|
|
94
|
+
projectId: c,
|
|
95
|
+
pcaId: t.id
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}), _ = () => {
|
|
100
|
+
d || (g.reset(), p.reset(), t());
|
|
101
|
+
}, y = F(g.store, (e) => e.isSubmitting || e.values.common_name.trim().length === 0);
|
|
102
|
+
return /*#__PURE__*/ O(o, {
|
|
103
|
+
open: e,
|
|
104
|
+
size: "large",
|
|
105
|
+
title: n._({ id: "WidMsn" }),
|
|
106
|
+
onCancel: _,
|
|
107
|
+
cancelButtonLabel: n._({ id: "dEgA5A" }),
|
|
108
|
+
confirmButtonLabel: n._({ id: "tfDRzk" }),
|
|
109
|
+
onConfirm: g.handleSubmit,
|
|
110
|
+
disableConfirmButton: d || y,
|
|
111
|
+
children: [
|
|
112
|
+
p.error?.message && /*#__PURE__*/ D(i, {
|
|
113
|
+
dismissible: !1,
|
|
114
|
+
variant: "error",
|
|
115
|
+
className: "mb-4",
|
|
116
|
+
children: p.error.message
|
|
117
|
+
}),
|
|
118
|
+
d && /*#__PURE__*/ O("div", {
|
|
119
|
+
className: "mb-4 flex items-center justify-center gap-2",
|
|
120
|
+
children: [/*#__PURE__*/ D(r, { variant: "primary" }), /*#__PURE__*/ D("span", {
|
|
121
|
+
className: "text-theme-high text-sm",
|
|
122
|
+
children: /*#__PURE__*/ D(j, { id: "wdUvGT" })
|
|
123
|
+
})]
|
|
124
|
+
}),
|
|
125
|
+
!d && /*#__PURE__*/ D(u, {
|
|
126
|
+
className: "mb-0",
|
|
127
|
+
id: "create-certificate-authority-form",
|
|
128
|
+
onSubmit: (e) => {
|
|
129
|
+
e.preventDefault(), g.handleSubmit();
|
|
130
|
+
},
|
|
131
|
+
children: /*#__PURE__*/ D(m, {
|
|
132
|
+
className: "mb-4",
|
|
133
|
+
children: /*#__PURE__*/ D(g.Field, {
|
|
134
|
+
name: "common_name",
|
|
135
|
+
children: (e) => /*#__PURE__*/ D(f, {
|
|
136
|
+
id: e.name,
|
|
137
|
+
name: e.name,
|
|
138
|
+
value: e.state.value,
|
|
139
|
+
onBlur: e.handleBlur,
|
|
140
|
+
onChange: (t) => e.handleChange(t.target.value),
|
|
141
|
+
label: n._({ id: "DHrCY6" }),
|
|
142
|
+
placeholder: n._({ id: "RWQ6BN" }),
|
|
143
|
+
helptext: n._({ id: "jVjr9h" }),
|
|
144
|
+
errortext: e.state.meta.errors.map((e) => e?.message).join(", "),
|
|
145
|
+
disabled: d
|
|
146
|
+
})
|
|
147
|
+
})
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
]
|
|
151
|
+
});
|
|
152
|
+
}, B = 50, V = () => {
|
|
153
|
+
let { i18n: i, _: a } = M(), o = b(), [c, u] = w(!1), [d, f] = k([void 0]), [p, m] = k(1), y = d[p - 1], { data: x, isLoading: S, isError: C, error: T } = v.services.pca.list.useQuery({
|
|
154
|
+
project_id: o,
|
|
155
|
+
limit: B,
|
|
156
|
+
next_page_marker: y
|
|
157
|
+
}), A = x?.certificate_authorities ?? [], N = x?.next_page_marker, P = N ? p + 1 : p, F = Math.max(P, d.length), L = (e) => {
|
|
158
|
+
e < 1 || e > F || (e > p && N && f((t) => {
|
|
159
|
+
let n = [...t];
|
|
160
|
+
return n[e - 1] = N, n;
|
|
161
|
+
}), m(e));
|
|
162
|
+
};
|
|
163
|
+
if (S) return /*#__PURE__*/ O(s, {
|
|
164
|
+
className: "py-8",
|
|
165
|
+
distribution: "center",
|
|
166
|
+
alignment: "center",
|
|
167
|
+
direction: "vertical",
|
|
168
|
+
children: [/*#__PURE__*/ D(r, {
|
|
169
|
+
variant: "primary",
|
|
170
|
+
size: "large",
|
|
171
|
+
className: "mb-2"
|
|
172
|
+
}), /*#__PURE__*/ D(j, { id: "Z3FXyt" })]
|
|
173
|
+
});
|
|
174
|
+
if (C) return /*#__PURE__*/ D(s, {
|
|
175
|
+
className: "py-8",
|
|
176
|
+
distribution: "center",
|
|
177
|
+
alignment: "center",
|
|
178
|
+
direction: "vertical",
|
|
179
|
+
children: T?.message ?? i._({ id: "Sf3Gvg" })
|
|
180
|
+
});
|
|
181
|
+
let R = [
|
|
182
|
+
i._({ id: "RS0o7b" }),
|
|
183
|
+
i._({ id: "S0kLOH" }),
|
|
184
|
+
i._({ id: "QGFuw+" }),
|
|
185
|
+
""
|
|
186
|
+
], V = R.length;
|
|
187
|
+
return /*#__PURE__*/ O("div", {
|
|
188
|
+
className: "relative",
|
|
189
|
+
children: [
|
|
190
|
+
/*#__PURE__*/ D(s, {
|
|
191
|
+
className: "pt-3 pb-2",
|
|
192
|
+
distribution: "end",
|
|
193
|
+
children: /*#__PURE__*/ D(l, {
|
|
194
|
+
variant: "primary",
|
|
195
|
+
label: i._({ id: "WidMsn" }),
|
|
196
|
+
onClick: u
|
|
197
|
+
})
|
|
198
|
+
}),
|
|
199
|
+
A.length === 0 && p === 1 ? /*#__PURE__*/ D(g, {
|
|
200
|
+
columns: V,
|
|
201
|
+
className: "pca",
|
|
202
|
+
"data-testid": "no-pcas",
|
|
203
|
+
children: /*#__PURE__*/ D(n, { children: /*#__PURE__*/ O(_, {
|
|
204
|
+
colSpan: V,
|
|
205
|
+
children: [/*#__PURE__*/ D(h, { children: /*#__PURE__*/ D(j, { id: "8S2nDL" }) }), /*#__PURE__*/ D("p", { children: /*#__PURE__*/ D(j, { id: "ng+PCh" }) })]
|
|
206
|
+
}) })
|
|
207
|
+
}) : /*#__PURE__*/ O(E, { children: [/*#__PURE__*/ O(g, {
|
|
208
|
+
columns: V,
|
|
209
|
+
children: [/*#__PURE__*/ D(n, { children: R.map((e) => /*#__PURE__*/ D(t, { children: e }, e)) }), A.map((e) => /*#__PURE__*/ D(I, { pca: e }, e.id))]
|
|
210
|
+
}), F > 1 && /*#__PURE__*/ D("div", {
|
|
211
|
+
className: "flex justify-center py-4",
|
|
212
|
+
children: /*#__PURE__*/ D(e, {
|
|
213
|
+
variant: "input",
|
|
214
|
+
currentPage: p,
|
|
215
|
+
pages: F,
|
|
216
|
+
onPressPrevious: () => L(p - 1),
|
|
217
|
+
onPressNext: () => L(p + 1)
|
|
218
|
+
})
|
|
219
|
+
})] }),
|
|
220
|
+
c && /*#__PURE__*/ D(z, {
|
|
221
|
+
open: c,
|
|
222
|
+
onClose: u
|
|
223
|
+
})
|
|
224
|
+
]
|
|
225
|
+
});
|
|
226
|
+
};
|
|
227
|
+
//#endregion
|
|
228
|
+
//#region src/client/routes/_auth/projects/$projectId/services/pca/index.tsx?tsr-split=component
|
|
229
|
+
function H() {
|
|
230
|
+
let { i18n: e, _: t } = M(), { projectId: n } = y.useParams();
|
|
231
|
+
return /*#__PURE__*/ O(E, { children: [/*#__PURE__*/ D(C, {
|
|
232
|
+
title: e._({ id: "ffw//c" }),
|
|
233
|
+
projectId: n
|
|
234
|
+
}), /*#__PURE__*/ D(V, {})] });
|
|
235
|
+
}
|
|
236
|
+
//#endregion
|
|
237
|
+
export { H as component };
|
|
238
|
+
|
|
239
|
+
//# sourceMappingURL=pca-BokFv4Gz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pca-BokFv4Gz.mjs","names":["MdCheckCircle","MdReportProblem","useNavigate","DataGridCell","DataGridRow","Icon","PopupMenu","PopupMenuItem","PopupMenuOptions","Spinner","useModal","useProjectId","DeletePcaModal","PcaTableRow","pca","useLingui","navigate","projectId","deletePcaModalOpen","toggleDeletePcaModal","navigateToDetailsPage","to","params","pcaId","id","STATE_CONFIG","CREATING","text","t","icon","size","AWAITING_CERTIFICATE","color","READY","fill","FAILED","data-testid","onClick","div","className","state","display_subject","e","stopPropagation","label","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","named_attributes","cn","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","PcaTableRow","CreatePcaModal","ITEMS_PER_PAGE","PcaListContainer","useLingui","projectId","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","length","goToPage","page","prev","updated","className","distribution","alignment","direction","variant","size","message","t","TABLE_COLUMNS","columnsLength","div","label","onClick","columns","data-testid","colSpan","p","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/-table/PcaListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx?tsr-split=component"],"sourcesContent":["import { MdCheckCircle, MdReportProblem } from \"react-icons/md\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n Icon,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n Spinner,\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\"\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 const STATE_CONFIG = {\n CREATING: {\n text: t`Creating`,\n icon: <Spinner size=\"18\" />,\n },\n AWAITING_CERTIFICATE: {\n text: t`Awaiting Certificate`,\n icon: <Icon icon=\"accessTime\" size={20} color=\"#FBC02D\" />,\n },\n READY: {\n text: t`Ready`,\n icon: <MdCheckCircle size={20} color=\"white\" fill=\"#4FB81C\" />,\n },\n FAILED: {\n text: t`Failed`,\n icon: <MdReportProblem size={20} color=\"white\" fill=\"#D32F2F\" />,\n },\n } as const\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.display_subject || \"—\"}</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\ninterface CreatePcaModalProps {\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 }: CreatePcaModalProps) => {\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: {\n named_attributes: {\n cn: value.common_name,\n },\n },\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 { PcaTableRow } from \"./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 [createCaOpen, toggleCreateCa] = useModal(false)\n const [pageMarkers, setPageMarkers] = useState<(string | undefined)[]>([undefined])\n const [currentPage, setCurrentPage] = useState(1)\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 const TABLE_COLUMNS = [\n t`State`,\n t`ID`,\n t`Subject Information`,\n \"\", // empty column for item-action with context menu containing \"Delete CA\" button\n ] as const\n const columnsLength = TABLE_COLUMNS.length\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\n {pcas.length === 0 && currentPage === 1 ? (\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 <DataGrid columns={columnsLength}>\n <DataGridRow>\n {TABLE_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 )}\n\n {createCaOpen && <CreatePcaModal open={createCaOpen} onClose={toggleCreateCa} />}\n </div>\n )\n}\n","import { createFileRoute, redirect } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { canAccessClavisPca } from \"./-components/pcaAccess\"\nimport { PcaListContainer } from \"./-components/-table/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n analytics: {\n name: \"services.pca.list\",\n },\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n beforeLoad: async ({ context, params }) => {\n const availableServices = (await context.trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n\n if (!canAccessClavisPca(serviceIndex, context.enabledServices)) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId: params.projectId },\n })\n }\n },\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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"}
|
|
@@ -12,14 +12,15 @@ var o = n("/_auth/projects/$projectId/services/pca/")({
|
|
|
12
12
|
},
|
|
13
13
|
head: () => ({ meta: [{ title: a._({ id: "ffw//c" }) }] }),
|
|
14
14
|
beforeLoad: async ({ context: n, params: r }) => {
|
|
15
|
-
|
|
15
|
+
let a = await n.trpcClient?.auth.getAvailableServices.query() || [], o = e(a);
|
|
16
|
+
if (!t(o, n.enabledServices)) throw i({
|
|
16
17
|
to: "/projects/$projectId",
|
|
17
18
|
params: { projectId: r.projectId }
|
|
18
19
|
});
|
|
19
20
|
},
|
|
20
|
-
component: r(() => import("./pca-
|
|
21
|
+
component: r(() => import("./pca-BokFv4Gz.mjs"), "component")
|
|
21
22
|
});
|
|
22
23
|
//#endregion
|
|
23
24
|
export { o as t };
|
|
24
25
|
|
|
25
|
-
//# sourceMappingURL=pca-
|
|
26
|
+
//# sourceMappingURL=pca-D5jHAl0b.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pca-
|
|
1
|
+
{"version":3,"file":"pca-D5jHAl0b.mjs","names":["createFileRoute","redirect","t","getServiceIndex","canAccessClavisPca","Route","staticData","section","service","analytics","name","sectionCrumb","labelKey","crumb","RouteInfo","head","meta","title","beforeLoad","context","params","availableServices","trpcClient","auth","getAvailableServices","query","serviceIndex","enabledServices","to","projectId","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx"],"sourcesContent":["import { createFileRoute, redirect } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { canAccessClavisPca } from \"./-components/pcaAccess\"\nimport { PcaListContainer } from \"./-components/-table/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n analytics: {\n name: \"services.pca.list\",\n },\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n beforeLoad: async ({ context, params }) => {\n const availableServices = (await context.trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n\n if (!canAccessClavisPca(serviceIndex, context.enabledServices)) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId: params.projectId },\n })\n }\n },\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":";;;;AASA,IAAaK,IAAQL,EAAgB,0CAAA,CAAA,CAA4C;CAC/EM,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,WAAW,EACTC,MAAM,oBACR;EACAC,cAAc,EAAEC,UAAU,WAAW;EACrCC,OAAO,EAAED,UAAU,eAAe;CACpC;CACAG,aAAa,EAAEC,MAAM,CAAC,EAAEC,OAAOf,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA,EAAM,CAAC,EAAE;CACzCgB,YAAY,OAAO,EAAEC,YAASC,gBAAQ;EACpC,IAAMC,IAAoB,MAAOF,EAAQG,YAAYC,KAAKC,qBAAqBC,MAAAA,KAAY,CAAA,GACrFC,IAAevB,EAAgBkB,CAAAA;EAErC,IAAI,CAACjB,EAAmBsB,GAAcP,EAAQQ,eAAe,GAC3D,MAAM1B,EAAS;GACb2B,IAAI;GACJR,QAAQ,EAAES,WAAWT,EAAOS,UAAU;EACxC,CAAA;CAEJ;CACAC,WAASC,sCAAA,WAAA;AACX,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects-yiK0HGSA.mjs","names":["ProjectsContentProps","search","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { Suspense } from \"react\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { createFileRoute, useRouteContext } 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, Spinner, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\nimport { Slot } from \"@/client/components/Slot\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n staticData: {\n analytics: {\n name: \"projects.list\",\n },\n } satisfies RouteInfo,\n component: ProjectsOverview,\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n})\n\ninterface ProjectsContentProps {\n search: string\n}\n\nfunction ProjectsContent({ search }: ProjectsContentProps) {\n const [allProjects] = trpcReact.project.getAuthProjects.useSuspenseQuery()\n\n const normalizedSearch = search.trim().toLowerCase()\n const projects =\n allProjects && normalizedSearch\n ? allProjects.filter(\n (project) =>\n project.name?.toLowerCase().includes(normalizedSearch) ||\n project.description?.toLowerCase().includes(normalizedSearch)\n )\n : allProjects\n\n return <ProjectCardView projects={projects} />\n}\n\nexport function ProjectsOverview() {\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n const { slots } = useRouteContext({ strict: false })\n\n const handleSearch = (value: string) => {\n navigate({ search: (prev) => ({ ...prev, search: value || undefined }), replace: true })\n }\n\n return (\n <Container py>\n <ContentHeading className=\"pb-4\">\n <Trans>Projects</Trans>\n </ContentHeading>\n {slots?.projectsBanner && (\n <ErrorBoundary fallbackRender={() => null}>\n <Suspense fallback={null}>\n <Slot component={slots.projectsBanner} useShadowDOM={false} />\n </Suspense>\n </ErrorBoundary>\n )}\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n )}\n >\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <Suspense\n fallback={\n <Stack distribution=\"center\" alignment=\"center\" direction=\"vertical\" className=\"py-12\">\n <Spinner variant=\"primary\" size=\"large\" />\n </Stack>\n }\n >\n <ProjectsContent search={search} />\n </Suspense>\n </div>\n </ErrorBoundary>\n </Container>\n )\n}\n"],"mappings":";;AAiCC,IAAAE,UAPU,gBAAC,KAAA,
|
|
1
|
+
{"version":3,"file":"projects-yiK0HGSA.mjs","names":["ProjectsContentProps","search","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { Suspense } from \"react\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { createFileRoute, useRouteContext } 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, Spinner, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\nimport { Slot } from \"@/client/components/Slot\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n staticData: {\n analytics: {\n name: \"projects.list\",\n },\n } satisfies RouteInfo,\n component: ProjectsOverview,\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n})\n\ninterface ProjectsContentProps {\n search: string\n}\n\nfunction ProjectsContent({ search }: ProjectsContentProps) {\n const [allProjects] = trpcReact.project.getAuthProjects.useSuspenseQuery()\n\n const normalizedSearch = search.trim().toLowerCase()\n const projects =\n allProjects && normalizedSearch\n ? allProjects.filter(\n (project) =>\n project.name?.toLowerCase().includes(normalizedSearch) ||\n project.description?.toLowerCase().includes(normalizedSearch)\n )\n : allProjects\n\n return <ProjectCardView projects={projects} />\n}\n\nexport function ProjectsOverview() {\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n const { slots } = useRouteContext({ strict: false })\n\n const handleSearch = (value: string) => {\n navigate({ search: (prev) => ({ ...prev, search: value || undefined }), replace: true })\n }\n\n return (\n <Container py>\n <ContentHeading className=\"pb-4\">\n <Trans>Projects</Trans>\n </ContentHeading>\n {slots?.projectsBanner && (\n <ErrorBoundary fallbackRender={() => null}>\n <Suspense fallback={null}>\n <Slot component={slots.projectsBanner} useShadowDOM={false} />\n </Suspense>\n </ErrorBoundary>\n )}\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n )}\n >\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <Suspense\n fallback={\n <Stack distribution=\"center\" alignment=\"center\" direction=\"vertical\" className=\"py-12\">\n <Spinner variant=\"primary\" size=\"large\" />\n </Stack>\n }\n >\n <ProjectsContent search={search} />\n </Suspense>\n </div>\n </ErrorBoundary>\n </Container>\n )\n}\n"],"mappings":";;AAiCC,IAAAE,UAPU,gBAAC,KAAA,EAAE,UAAA,qBAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeInfo-CdTRlSxv.mjs","names":["z","CRUMB_LABEL_KEYS","CrumbSchema","object","labelKey","enum","optional","to","string","useParamAsLabel","useParentTitleAsLabel","boolean","AnalyticsSchema","name","RouteInfoSchema","section","service","isDetail","crumb","sectionCrumb","intermediateCrumb","analytics","isRouteInfo","data","safeParse","success"],"sources":["../../src/client/routes/routeInfo.ts"],"sourcesContent":["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 AnalyticsSchema = z.object({\n name: z.string(),\n})\n\nconst RouteInfoSchema = z.object({\n section: z.string().optional(),\n service: z.string().optional(),\n isDetail: z.boolean().optional(),\n crumb: CrumbSchema.optional(),\n sectionCrumb: CrumbSchema.optional(),\n intermediateCrumb: CrumbSchema.optional(),\n analytics: AnalyticsSchema.optional(),\n})\n\nexport type Crumb = z.infer<typeof CrumbSchema>\nexport type Analytics = z.infer<typeof AnalyticsSchema>\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":";AAgBA,IAAME,IAAcF,EAAEG,OAAO;CAC3BC,UAAUJ,EAAEK,KAAKJ;EAdjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAMiBA,CAAAA,
|
|
1
|
+
{"version":3,"file":"routeInfo-CdTRlSxv.mjs","names":["z","CRUMB_LABEL_KEYS","CrumbSchema","object","labelKey","enum","optional","to","string","useParamAsLabel","useParentTitleAsLabel","boolean","AnalyticsSchema","name","RouteInfoSchema","section","service","isDetail","crumb","sectionCrumb","intermediateCrumb","analytics","isRouteInfo","data","safeParse","success"],"sources":["../../src/client/routes/routeInfo.ts"],"sourcesContent":["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 AnalyticsSchema = z.object({\n name: z.string(),\n})\n\nconst RouteInfoSchema = z.object({\n section: z.string().optional(),\n service: z.string().optional(),\n isDetail: z.boolean().optional(),\n crumb: CrumbSchema.optional(),\n sectionCrumb: CrumbSchema.optional(),\n intermediateCrumb: CrumbSchema.optional(),\n analytics: AnalyticsSchema.optional(),\n})\n\nexport type Crumb = z.infer<typeof CrumbSchema>\nexport type Analytics = z.infer<typeof AnalyticsSchema>\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":";AAgBA,IAAME,IAAcF,EAAEG,OAAO;CAC3BC,UAAUJ,EAAEK,KAAKJ;EAdjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAMiBA,CAAAA,CAAAA,CAAkBK,SAAQ;CAC3CC,IAAIP,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CACvBG,iBAAiBT,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CACpCI,uBAAuBV,EAAEW,QAAO,CAAA,CAAGL,SAAQ;AAC7C,CAAA,GAEMM,IAAkBZ,EAAEG,OAAO,EAC/BU,MAAMb,EAAEQ,OAAM,EAChB,CAAA,GAEMM,IAAkBd,EAAEG,OAAO;CAC/BY,SAASf,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CAC5BU,SAAShB,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CAC5BW,UAAUjB,EAAEW,QAAO,CAAA,CAAGL,SAAQ;CAC9BY,OAAOhB,EAAYI,SAAQ;CAC3Ba,cAAcjB,EAAYI,SAAQ;CAClCc,mBAAmBlB,EAAYI,SAAQ;CACvCe,WAAWT,EAAgBN,SAAQ;AACrC,CAAA;AAMA,SAAgBgB,EAAYC,GAAa;CACvC,OAAOT,EAAgBU,UAAUD,CAAAA,CAAAA,CAAME;AACzC"}
|
|
@@ -2,9 +2,9 @@ import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-r
|
|
|
2
2
|
import { z as n } from "zod";
|
|
3
3
|
var r = e("/")({
|
|
4
4
|
validateSearch: n.object({ redirect: n.string().optional().catch("") }),
|
|
5
|
-
component: t(() => import("./routes-
|
|
5
|
+
component: t(() => import("./routes-DOJr5onJ.mjs"), "component")
|
|
6
6
|
});
|
|
7
7
|
//#endregion
|
|
8
8
|
export { r as t };
|
|
9
9
|
|
|
10
|
-
//# sourceMappingURL=routes-
|
|
10
|
+
//# sourceMappingURL=routes-B05u5bk4.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-
|
|
1
|
+
{"version":3,"file":"routes-B05u5bk4.mjs","names":["createFileRoute","z","Route","validateSearch","object","redirect","string","optional","catch","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/index.tsx"],"sourcesContent":["import { createFileRoute, useNavigate } from \"@tanstack/react-router\"\nimport { Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { z } from \"zod\"\nimport { useEffect } from \"react\"\nimport { LoginForm } from \"../components/Auth/LoginForm\"\nimport { Slot } from \"../components/Slot\"\nimport { useAuth } from \"../store/AuthProvider\"\n\nfunction isSafeRedirect(path: unknown): path is string {\n return typeof path === \"string\" && path.startsWith(\"/\") && !path.startsWith(\"//\")\n}\n\nexport const Route = createFileRoute(\"/\")({\n validateSearch: z.object({\n redirect: z.string().optional().catch(\"\"),\n }),\n component: LandingPage,\n})\n\nfunction LandingPage() {\n const { isLoading, isAuthenticated } = useAuth()\n const { slots } = Route.useRouteContext()\n const { redirect: searchRedirect } = Route.useSearch()\n const navigate = useNavigate()\n\n // Redirect when authenticated\n useEffect(() => {\n if (isAuthenticated && !isLoading) {\n const target = isSafeRedirect(searchRedirect) ? searchRedirect : \"/projects\"\n navigate({ to: target, replace: true })\n }\n }, [isAuthenticated, isLoading, navigate, searchRedirect])\n\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\">\n <div className=\"absolute inset-0 backdrop-blur-sm\" />\n <Spinner variant=\"primary\" size=\"large\" />\n </Stack>\n )\n }\n\n if (slots?.login && !isAuthenticated) {\n return (\n <div className=\"mt-8 flex justify-center\">\n <Slot component={slots.login} useShadowDOM={false} />\n </div>\n )\n }\n\n if (!isAuthenticated) {\n return <LoginForm />\n }\n\n // Redirecting...\n return null\n}\n"],"mappings":";;AAYA,IAAaE,IAAQF,EAAgB,GAAA,CAAA,CAAK;CACxCG,gBAAgBF,EAAEG,OAAO,EACvBC,UAAUJ,EAAEK,OAAM,CAAA,CAAGC,SAAQ,CAAA,CAAGC,MAAM,EAAA,EACxC,CAAA;CACAC,WAASC,yCAAA,WAAA;AACX,CAAA"}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as s } from "./AuthProvider-
|
|
1
|
+
import { G as e, I as t, Z as n, a as r, g as i, h as a, rt as o } from "./build-DnD-T35u.mjs";
|
|
2
|
+
import { n as s } from "./AuthProvider-5TyZKZkx.mjs";
|
|
3
3
|
import { t as c } from "./Slot-CWb612-_.mjs";
|
|
4
|
-
import { t as l } from "./routes-
|
|
4
|
+
import { t as l } from "./routes-B05u5bk4.mjs";
|
|
5
5
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
6
6
|
import { useEffect as f } from "react";
|
|
7
7
|
import { useNavigate as p } from "@tanstack/react-router";
|
|
8
8
|
import { Trans as m } from "@lingui/react";
|
|
9
9
|
//#region src/client/components/Auth/LoginForm.tsx
|
|
10
10
|
function h() {
|
|
11
|
-
let { isLoading:
|
|
11
|
+
let { isLoading: e, error: n, login: c } = s();
|
|
12
12
|
return /*#__PURE__*/ u("div", {
|
|
13
13
|
className: "mt-8 flex justify-center",
|
|
14
14
|
children: /*#__PURE__*/ d("div", {
|
|
15
15
|
className: "border-theme-light relative w-full max-w-md rounded-lg border p-6 shadow-lg",
|
|
16
16
|
children: [
|
|
17
|
-
/*#__PURE__*/ u(
|
|
17
|
+
/*#__PURE__*/ u(o, {
|
|
18
18
|
className: "text-center",
|
|
19
|
-
children: /*#__PURE__*/ u(m, { id: "
|
|
19
|
+
children: /*#__PURE__*/ u(m, { id: "MDQl/K" })
|
|
20
20
|
}),
|
|
21
21
|
/*#__PURE__*/ u("p", {
|
|
22
22
|
className: "mb-6 text-center",
|
|
@@ -34,25 +34,25 @@ function h() {
|
|
|
34
34
|
});
|
|
35
35
|
},
|
|
36
36
|
children: [
|
|
37
|
-
|
|
38
|
-
text:
|
|
37
|
+
n && /*#__PURE__*/ u(t, {
|
|
38
|
+
text: n,
|
|
39
39
|
variant: "error"
|
|
40
40
|
}),
|
|
41
|
-
/*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(
|
|
41
|
+
/*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(a, {
|
|
42
42
|
id: "domain",
|
|
43
43
|
name: "domain",
|
|
44
44
|
label: "Domain",
|
|
45
45
|
autoComplete: "domain",
|
|
46
46
|
required: !0
|
|
47
47
|
}) }),
|
|
48
|
-
/*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(
|
|
48
|
+
/*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(a, {
|
|
49
49
|
id: "user",
|
|
50
50
|
name: "user",
|
|
51
51
|
label: "User",
|
|
52
52
|
autoComplete: "user",
|
|
53
53
|
required: !0
|
|
54
54
|
}) }),
|
|
55
|
-
/*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(
|
|
55
|
+
/*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(a, {
|
|
56
56
|
id: "password",
|
|
57
57
|
name: "password",
|
|
58
58
|
type: "password",
|
|
@@ -60,12 +60,12 @@ function h() {
|
|
|
60
60
|
autoComplete: "password",
|
|
61
61
|
required: !0
|
|
62
62
|
}) }),
|
|
63
|
-
/*#__PURE__*/ u(
|
|
63
|
+
/*#__PURE__*/ u(r, {
|
|
64
64
|
type: "submit",
|
|
65
65
|
variant: "primary",
|
|
66
66
|
className: "mt-2 w-full",
|
|
67
|
-
disabled:
|
|
68
|
-
children:
|
|
67
|
+
disabled: e,
|
|
68
|
+
children: e ? /*#__PURE__*/ u(m, { id: "Z3FXyt" }) : /*#__PURE__*/ u(m, { id: "n1ekoW" })
|
|
69
69
|
})
|
|
70
70
|
]
|
|
71
71
|
})
|
|
@@ -79,34 +79,37 @@ function g(e) {
|
|
|
79
79
|
return typeof e == "string" && e.startsWith("/") && !e.startsWith("//");
|
|
80
80
|
}
|
|
81
81
|
function _() {
|
|
82
|
-
let { isLoading:
|
|
82
|
+
let { isLoading: t, isAuthenticated: r } = s(), { slots: i } = l.useRouteContext(), { redirect: a } = l.useSearch(), o = p();
|
|
83
83
|
return f(() => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
if (r && !t) {
|
|
85
|
+
let e = g(a) ? a : "/projects";
|
|
86
|
+
o({
|
|
87
|
+
to: e,
|
|
88
|
+
replace: !0
|
|
89
|
+
});
|
|
90
|
+
}
|
|
88
91
|
}, [
|
|
89
|
-
|
|
90
|
-
|
|
92
|
+
r,
|
|
93
|
+
t,
|
|
91
94
|
o,
|
|
92
|
-
|
|
93
|
-
]),
|
|
95
|
+
a
|
|
96
|
+
]), t ? /*#__PURE__*/ d(n, {
|
|
94
97
|
className: "fixed inset-0",
|
|
95
98
|
distribution: "center",
|
|
96
99
|
alignment: "center",
|
|
97
|
-
children: [/*#__PURE__*/ u("div", { className: "absolute inset-0 backdrop-blur-sm" }), /*#__PURE__*/ u(
|
|
100
|
+
children: [/*#__PURE__*/ u("div", { className: "absolute inset-0 backdrop-blur-sm" }), /*#__PURE__*/ u(e, {
|
|
98
101
|
variant: "primary",
|
|
99
102
|
size: "large"
|
|
100
103
|
})]
|
|
101
|
-
}) :
|
|
104
|
+
}) : i?.login && !r ? /*#__PURE__*/ u("div", {
|
|
102
105
|
className: "mt-8 flex justify-center",
|
|
103
106
|
children: /*#__PURE__*/ u(c, {
|
|
104
|
-
component:
|
|
107
|
+
component: i.login,
|
|
105
108
|
useShadowDOM: !1
|
|
106
109
|
})
|
|
107
|
-
}) :
|
|
110
|
+
}) : r ? null : /*#__PURE__*/ u(h, {});
|
|
108
111
|
}
|
|
109
112
|
//#endregion
|
|
110
113
|
export { _ as component };
|
|
111
114
|
|
|
112
|
-
//# sourceMappingURL=routes-
|
|
115
|
+
//# sourceMappingURL=routes-DOJr5onJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes-DOJr5onJ.mjs","names":["ContentHeading","Message","Button","FormRow","TextInput","useAuth","LoginForm","isLoading","error","loginError","login","div","className","p","form","onSubmit","e","preventDefault","formData","FormData","currentTarget","domain","String","get","user","password","text","variant","id","name","label","autoComplete","required","type","disabled","useNavigate","Stack","Spinner","useEffect","LoginForm","Slot","useAuth","isSafeRedirect","path","startsWith","Route","LandingPage","isLoading","isAuthenticated","slots","useRouteContext","redirect","searchRedirect","useSearch","navigate","target","to","replace","login","component"],"sources":["../../src/client/components/Auth/LoginForm.tsx","../../src/client/routes/index.tsx?tsr-split=component"],"sourcesContent":["import { ContentHeading, Message, Button, FormRow, TextInput } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useAuth } from \"../../store/AuthProvider\"\n\nexport function LoginForm() {\n const { isLoading, error: loginError, login } = useAuth()\n\n return (\n <div className=\"mt-8 flex justify-center\">\n <div className=\"border-theme-light relative w-full max-w-md rounded-lg border p-6 shadow-lg\">\n <ContentHeading className=\"text-center\">\n <Trans>Sign In to Your Account</Trans>\n </ContentHeading>\n <p className=\"mb-6 text-center\">\n <Trans>Enter your credentials to access your account</Trans>\n </p>\n\n <form\n className=\"space-y-5\"\n onSubmit={(e) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n login({\n domain: String(formData.get(\"domain\") ?? \"\"),\n user: String(formData.get(\"user\") ?? \"\"),\n password: String(formData.get(\"password\") ?? \"\"),\n })\n }}\n >\n {loginError && <Message text={loginError} variant=\"error\" />}\n <FormRow>\n <TextInput id=\"domain\" name=\"domain\" label=\"Domain\" autoComplete=\"domain\" required />\n </FormRow>\n <FormRow>\n <TextInput id=\"user\" name=\"user\" label=\"User\" autoComplete=\"user\" required />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"password\"\n name=\"password\"\n type=\"password\"\n label=\"Password\"\n autoComplete=\"password\"\n required\n />\n </FormRow>\n\n <Button type=\"submit\" variant=\"primary\" className=\"mt-2 w-full\" disabled={isLoading}>\n {isLoading ? <Trans>Loading...</Trans> : <Trans>Sign In</Trans>}\n </Button>\n </form>\n </div>\n </div>\n )\n}\n","import { createFileRoute, useNavigate } from \"@tanstack/react-router\"\nimport { Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { z } from \"zod\"\nimport { useEffect } from \"react\"\nimport { LoginForm } from \"../components/Auth/LoginForm\"\nimport { Slot } from \"../components/Slot\"\nimport { useAuth } from \"../store/AuthProvider\"\n\nfunction isSafeRedirect(path: unknown): path is string {\n return typeof path === \"string\" && path.startsWith(\"/\") && !path.startsWith(\"//\")\n}\n\nexport const Route = createFileRoute(\"/\")({\n validateSearch: z.object({\n redirect: z.string().optional().catch(\"\"),\n }),\n component: LandingPage,\n})\n\nfunction LandingPage() {\n const { isLoading, isAuthenticated } = useAuth()\n const { slots } = Route.useRouteContext()\n const { redirect: searchRedirect } = Route.useSearch()\n const navigate = useNavigate()\n\n // Redirect when authenticated\n useEffect(() => {\n if (isAuthenticated && !isLoading) {\n const target = isSafeRedirect(searchRedirect) ? searchRedirect : \"/projects\"\n navigate({ to: target, replace: true })\n }\n }, [isAuthenticated, isLoading, navigate, searchRedirect])\n\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\">\n <div className=\"absolute inset-0 backdrop-blur-sm\" />\n <Spinner variant=\"primary\" size=\"large\" />\n </Stack>\n )\n }\n\n if (slots?.login && !isAuthenticated) {\n return (\n <div className=\"mt-8 flex justify-center\">\n <Slot component={slots.login} useShadowDOM={false} />\n </div>\n )\n }\n\n if (!isAuthenticated) {\n return <LoginForm />\n }\n\n // Redirecting...\n return null\n}\n"],"mappings":";;;;;;;;;AAIA,SAAgBM,IAAAA;CACd,IAAM,EAAEC,cAAWC,OAAOC,GAAYC,aAAUL,EAAAA;CAEhD,OACE,gBAACM,OAAAA;EAAIC,WAAU;EACb,UAAA,gBAACD,OAAAA;GAAIC,WAAU;;IACb,gBAACZ,GAAAA;KAAeY,WAAU;KACxB,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAACC,KAAAA;KAAED,WAAU;KACX,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAGF,gBAACE,QAAAA;KACCF,WAAU;KACVG,WAAWC,MAAAA;MACTA,EAAEC,eAAc;MAChB,IAAMC,IAAW,IAAIC,SAASH,EAAEI,aAAa;MAC7CV,EAAM;OACJW,QAAQC,OAAOJ,EAASK,IAAI,QAAA,KAAa,EAAA;OACzCC,MAAMF,OAAOJ,EAASK,IAAI,MAAA,KAAW,EAAA;OACrCE,UAAUH,OAAOJ,EAASK,IAAI,UAAA,KAAe,EAAA;MAC/C,CAAA;KACF;;MAECd,KAAc,gBAACR,GAAAA;OAAQyB,MAAMjB;OAAYkB,SAAQ;;MAClD,gBAACxB,GAAAA,EACC,UAAA,gBAACC,GAAAA;OAAUwB,IAAG;OAASC,MAAK;OAASC,OAAM;OAASC,cAAa;OAASC,UAAQ;;MAEpF,gBAAC7B,GAAAA,EACC,UAAA,gBAACC,GAAAA;OAAUwB,IAAG;OAAOC,MAAK;OAAOC,OAAM;OAAOC,cAAa;OAAOC,UAAQ;;MAE5E,gBAAC7B,GAAAA,EACC,UAAA,gBAACC,GAAAA;OACCwB,IAAG;OACHC,MAAK;OACLI,MAAK;OACLH,OAAM;OACNC,cAAa;OACbC,UAAQ;;MAIZ,gBAAC9B,GAAAA;OAAO+B,MAAK;OAASN,SAAQ;OAAUf,WAAU;OAAcsB,UAAU3B;OACvEA,UAAAA,IAAY,gBAAA,GAAA,EAAA,IAAA,SAA4B,CAAA,IAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;;;;AAMrD;;;AC9CA,SAASmC,EAAeC,GAAa;CACnC,OAAO,OAAOA,KAAS,YAAYA,EAAKC,WAAW,GAAA,KAAQ,CAACD,EAAKC,WAAW,IAAA;AAC9E;AASA,SAASE,IAAAA;CACP,IAAM,EAAEC,cAAWC,uBAAoBP,EAAAA,GACjC,EAAEQ,aAAUJ,EAAMK,gBAAe,GACjC,EAAEC,UAAUC,MAAmBP,EAAMQ,UAAS,GAC9CC,IAAWnB,EAAAA;CAgCjB,OA7BAG,QAAU;EACR,IAAIU,KAAmB,CAACD,GAAW;GACjC,IAAMQ,IAASb,EAAeU,CAAAA,IAAkBA,IAAiB;GACjEE,EAAS;IAAEE,IAAID;IAAQE,SAAS;GAAK,CAAA;EACvC;CACF,GAAG;EAACT;EAAiBD;EAAWO;EAAUF;CAAe,CAAA,GAErDL,IAEA,gBAAC,GAAA;EAAM,WAAU;EAAgB,cAAa;EAAS,WAAU;EAC/D,UAAA,CAAA,gBAAC,OAAA,EAAI,WAAU,oCAAA,CAAA,GACf,gBAAC,GAAA;GAAQ,SAAQ;GAAU,MAAK;;MAKlCE,GAAOS,SAAS,CAACV,IAEjB,gBAAC,OAAA;EAAI,WAAU;EACb,UAAA,gBAAC,GAAA;GAAK,WAAWC,EAAMS;GAAO,cAAc;;MAK7CV,IAKE,OAJE,gBAAC,GAAA,CAAA,CAAA;AAKZ"}
|