@cobaltcore-dev/aurora 1.3.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/ContentHeader-fKKZVu-o.mjs +116 -0
- package/dist/client/ContentHeader-fKKZVu-o.mjs.map +1 -0
- package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs +802 -0
- package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs.map +1 -0
- package/dist/client/{FiltersInput-CKI6zWnm.mjs → FiltersInput-Becwxo_J.mjs} +36 -33
- package/dist/client/FiltersInput-Becwxo_J.mjs.map +1 -0
- package/dist/client/{FloatingIpActionModals-Ch8uozH9.mjs → FloatingIpActionModals-Cq10WljB.mjs} +2 -2
- package/dist/client/{FloatingIpActionModals-Ch8uozH9.mjs.map → FloatingIpActionModals-Cq10WljB.mjs.map} +1 -1
- package/dist/client/ImageToastNotifications-BWfzOUMc.mjs +1135 -0
- package/dist/client/ImageToastNotifications-BWfzOUMc.mjs.map +1 -0
- package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +26 -0
- package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +1 -0
- package/dist/client/StorageNotFound-B-zVinVD.mjs +30 -0
- package/dist/client/StorageNotFound-B-zVinVD.mjs.map +1 -0
- package/dist/client/_flavorId-0PioWpEp.mjs +276 -0
- package/dist/client/_flavorId-0PioWpEp.mjs.map +1 -0
- package/dist/client/_flavorId-B7fp6Nk8.mjs +22 -0
- package/dist/client/_flavorId-B7fp6Nk8.mjs.map +1 -0
- package/dist/client/{_flavorId-Dg7MS0Af.mjs → _flavorId-CgueqKTs.mjs} +4 -3
- package/dist/client/_flavorId-CgueqKTs.mjs.map +1 -0
- package/dist/client/{_floatingIpId-DNn6ABCB.mjs → _floatingIpId-B8r64AL9.mjs} +6 -6
- package/dist/client/{_floatingIpId-DNn6ABCB.mjs.map → _floatingIpId-B8r64AL9.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-C9xfRWot.mjs → _floatingIpId-lEobpOER.mjs} +2 -2
- package/dist/client/{_floatingIpId-C9xfRWot.mjs.map → _floatingIpId-lEobpOER.mjs.map} +1 -1
- package/dist/client/{_imageId-8JIbFmGB.mjs → _imageId-Ccv8PedW.mjs} +4 -3
- package/dist/client/_imageId-Ccv8PedW.mjs.map +1 -0
- package/dist/client/_imageId-CiqEQB_J.mjs +558 -0
- package/dist/client/_imageId-CiqEQB_J.mjs.map +1 -0
- package/dist/client/_imageId-D9LR-02T.mjs +22 -0
- package/dist/client/_imageId-D9LR-02T.mjs.map +1 -0
- package/dist/client/{_projectId-DPzv0CCp.mjs → _projectId-BDARsteX.mjs} +4 -4
- package/dist/client/_projectId-BDARsteX.mjs.map +1 -0
- package/dist/client/{_projectId-DfeVJy0G.mjs → _projectId-CtyAHqhH.mjs} +2 -2
- package/dist/client/_projectId-CtyAHqhH.mjs.map +1 -0
- package/dist/client/_projectId-D3VOH5lN.mjs +94 -0
- package/dist/client/_projectId-D3VOH5lN.mjs.map +1 -0
- package/dist/client/{_projectId-B3wmSala.mjs → _projectId-ZBk6vka0.mjs} +83 -81
- package/dist/client/_projectId-ZBk6vka0.mjs.map +1 -0
- package/dist/client/{_securityGroupId-C6eHmrx_.mjs → _securityGroupId-BwgZnoiR.mjs} +2 -2
- package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +1 -0
- package/dist/client/{_securityGroupId-DmplhDgt.mjs → _securityGroupId-Cz2NUHdB.mjs} +750 -741
- package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +1 -0
- package/dist/client/{_storageType-CzZ4u9x_.mjs → _storageType-BNpP1A2N.mjs} +3 -2
- package/dist/client/_storageType-BNpP1A2N.mjs.map +1 -0
- package/dist/client/_storageType-BxSGKhAI.mjs +15 -0
- package/dist/client/_storageType-BxSGKhAI.mjs.map +1 -0
- package/dist/client/_storageType-DZYCmiLt.mjs +30 -0
- package/dist/client/_storageType-DZYCmiLt.mjs.map +1 -0
- package/dist/client/_storageType-UqAMP-8d.mjs +859 -0
- package/dist/client/_storageType-UqAMP-8d.mjs.map +1 -0
- package/dist/client/_storageType-u51_7OwJ.mjs +7 -0
- package/dist/client/_storageType-u51_7OwJ.mjs.map +1 -0
- package/dist/client/components/{Error → Errors}/RouteError.d.ts +5 -0
- package/dist/client/components/Errors/RouteIdLevelDefaultError.d.ts +18 -0
- package/dist/client/components/Errors/ServiceLevelDefaultError.d.ts +9 -0
- package/dist/client/components/ListToolbar/SelectedFilters.d.ts +7 -2
- package/dist/client/components/ListToolbar/types.d.ts +6 -0
- package/dist/client/components/ListToolbar/valueLabels.d.ts +11 -0
- package/dist/client/{flavors-B1SDOPDu.mjs → flavors-Ce3J-cFa.mjs} +2 -2
- package/dist/client/{flavors-B1SDOPDu.mjs.map → flavors-Ce3J-cFa.mjs.map} +1 -1
- package/dist/client/flavors-D5ThLaXO.mjs +666 -0
- package/dist/client/flavors-D5ThLaXO.mjs.map +1 -0
- package/dist/client/floatingips-Cz9k80cc.mjs.map +1 -1
- package/dist/client/{floatingips-DrCvtXtT.mjs → floatingips-DXnRlLvV.mjs} +7 -7
- package/dist/client/{floatingips-DrCvtXtT.mjs.map → floatingips-DXnRlLvV.mjs.map} +1 -1
- package/dist/client/floatingips-HRbuLxiN.mjs +22 -0
- package/dist/client/floatingips-HRbuLxiN.mjs.map +1 -0
- package/dist/client/floatingips-nN1kQmsu.mjs +14 -0
- package/dist/client/floatingips-nN1kQmsu.mjs.map +1 -0
- package/dist/client/{images-BGQv9kKT.mjs → images-C8M3ysWR.mjs} +810 -770
- package/dist/client/images-C8M3ysWR.mjs.map +1 -0
- package/dist/client/{images-CPmMa4SQ.mjs → images-Cf5R28NR.mjs} +2 -2
- package/dist/client/{images-CPmMa4SQ.mjs.map → images-Cf5R28NR.mjs.map} +1 -1
- package/dist/client/index.js +419 -415
- package/dist/client/index.js.map +1 -1
- package/dist/client/{objects-BR3eeSNH.mjs → objects-BudUAfWY.mjs} +5478 -5519
- package/dist/client/objects-BudUAfWY.mjs.map +1 -0
- package/dist/client/objects-Dc7sKUr8.mjs +67 -0
- package/dist/client/objects-Dc7sKUr8.mjs.map +1 -0
- package/dist/client/objects-Dw7oeTq2.mjs +80 -0
- package/dist/client/objects-Dw7oeTq2.mjs.map +1 -0
- package/dist/client/objects-_g7nGIn5.mjs +25 -0
- package/dist/client/objects-_g7nGIn5.mjs.map +1 -0
- package/dist/client/objects-eBxvY6_n.mjs +78 -0
- package/dist/client/objects-eBxvY6_n.mjs.map +1 -0
- package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
- package/dist/client/{securitygroups-DEJQBcxm.mjs → securitygroups-67fFxiwt.mjs} +2 -2
- package/dist/client/{securitygroups-DEJQBcxm.mjs.map → securitygroups-67fFxiwt.mjs.map} +1 -1
- package/dist/client/securitygroups-CtKne8UQ.mjs.map +1 -1
- package/dist/client/securitygroups-DXrfyuVF.mjs +580 -0
- package/dist/client/securitygroups-DXrfyuVF.mjs.map +1 -0
- package/dist/client/securitygroups-WLB1_IM6.mjs +22 -0
- package/dist/client/securitygroups-WLB1_IM6.mjs.map +1 -0
- package/dist/client/securitygroups-o0IXZM6S.mjs +14 -0
- package/dist/client/securitygroups-o0IXZM6S.mjs.map +1 -0
- package/dist/client/serviceCatalog-B3lKWC9V.mjs +6 -0
- package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +1 -0
- package/dist/client/storageProviders-CJ5rOh13.mjs +15 -0
- package/dist/client/storageProviders-CJ5rOh13.mjs.map +1 -0
- package/dist/client/trpcClient.d.ts +102 -4
- package/dist/client/useModalTracking-BYd37pXm.mjs +37 -0
- package/dist/client/useModalTracking-BYd37pXm.mjs.map +1 -0
- package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +294 -0
- package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +1 -0
- package/dist/client/utils/serviceCatalog.d.ts +9 -0
- package/dist/client/utils/storageProviders.d.ts +44 -0
- package/dist/server/index.d.ts +102 -4
- package/dist/server/index.js +1319 -416
- package/package.json +4 -4
- package/dist/client/ContentHeader-CPJbgYWn.mjs +0 -115
- package/dist/client/ContentHeader-CPJbgYWn.mjs.map +0 -1
- package/dist/client/DeleteFlavorModal-V44QCJBd.mjs +0 -773
- package/dist/client/DeleteFlavorModal-V44QCJBd.mjs.map +0 -1
- package/dist/client/FiltersInput-CKI6zWnm.mjs.map +0 -1
- package/dist/client/ImageToastNotifications-m6c3tVPb.mjs +0 -1152
- package/dist/client/ImageToastNotifications-m6c3tVPb.mjs.map +0 -1
- package/dist/client/_flavorId-Dg7MS0Af.mjs.map +0 -1
- package/dist/client/_flavorId-kHl-b8rI.mjs +0 -232
- package/dist/client/_flavorId-kHl-b8rI.mjs.map +0 -1
- package/dist/client/_imageId-8JIbFmGB.mjs.map +0 -1
- package/dist/client/_imageId-BBAlRioC.mjs +0 -574
- package/dist/client/_imageId-BBAlRioC.mjs.map +0 -1
- package/dist/client/_projectId-7Nl1MQTJ.mjs +0 -99
- package/dist/client/_projectId-7Nl1MQTJ.mjs.map +0 -1
- package/dist/client/_projectId-B3wmSala.mjs.map +0 -1
- package/dist/client/_projectId-DPzv0CCp.mjs.map +0 -1
- package/dist/client/_projectId-DfeVJy0G.mjs.map +0 -1
- package/dist/client/_securityGroupId-C6eHmrx_.mjs.map +0 -1
- package/dist/client/_securityGroupId-DmplhDgt.mjs.map +0 -1
- package/dist/client/_storageType-BRWWJtow.mjs +0 -14
- package/dist/client/_storageType-BRWWJtow.mjs.map +0 -1
- package/dist/client/_storageType-C5gS9eut.mjs +0 -845
- package/dist/client/_storageType-C5gS9eut.mjs.map +0 -1
- package/dist/client/_storageType-CzZ4u9x_.mjs.map +0 -1
- package/dist/client/_storageType-zeSZe--V.mjs +0 -7
- package/dist/client/_storageType-zeSZe--V.mjs.map +0 -1
- package/dist/client/flavors-D8_PzQUB.mjs +0 -628
- package/dist/client/flavors-D8_PzQUB.mjs.map +0 -1
- package/dist/client/images-BGQv9kKT.mjs.map +0 -1
- package/dist/client/objects-AERkhfiM.mjs +0 -66
- package/dist/client/objects-AERkhfiM.mjs.map +0 -1
- package/dist/client/objects-BR3eeSNH.mjs.map +0 -1
- package/dist/client/objects-DVccbrL1.mjs +0 -66
- package/dist/client/objects-DVccbrL1.mjs.map +0 -1
- package/dist/client/securitygroups-BjhgLBHm.mjs +0 -620
- package/dist/client/securitygroups-BjhgLBHm.mjs.map +0 -1
- package/dist/client/useModalTracking-BcOKTYRN.mjs +0 -33
- package/dist/client/useModalTracking-BcOKTYRN.mjs.map +0 -1
- package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs +0 -227
- package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs.map +0 -1
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { K as e, L as t, M as n, P as r, Q as i, X as a, ft as o, h as s, i as c, lt as l, m as u, p as d, rt as f } from "./build-WuxXRAqf.mjs";
|
|
2
|
+
import { a as p } from "./trpcClient-D7gpR7YG.mjs";
|
|
3
|
+
import { t as m } from "./useModalTracking-BYd37pXm.mjs";
|
|
4
|
+
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
5
|
+
import { useEffect as _, useState as v } from "react";
|
|
6
|
+
import { Trans as y, useLingui as b } from "@lingui/react";
|
|
7
|
+
import { z as x } from "zod";
|
|
8
|
+
import { useForm as S, useStore as C } from "@tanstack/react-form";
|
|
9
|
+
//#region src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupToastNotifications.tsx
|
|
10
|
+
var w = (e) => ({
|
|
11
|
+
message: /*#__PURE__*/ h(y, { id: "FT6BiH" }),
|
|
12
|
+
description: /*#__PURE__*/ h(y, {
|
|
13
|
+
id: "+rAGXM",
|
|
14
|
+
values: { name: e }
|
|
15
|
+
})
|
|
16
|
+
}), T = (e) => ({
|
|
17
|
+
message: /*#__PURE__*/ h(y, { id: "xc8SHc" }),
|
|
18
|
+
description: /*#__PURE__*/ h(y, {
|
|
19
|
+
id: "K4twCt",
|
|
20
|
+
values: { errorMessage: e }
|
|
21
|
+
})
|
|
22
|
+
}), E = (e) => ({
|
|
23
|
+
message: /*#__PURE__*/ h(y, { id: "pySxXV" }),
|
|
24
|
+
description: /*#__PURE__*/ h(y, {
|
|
25
|
+
id: "/GSSFQ",
|
|
26
|
+
values: { name: e }
|
|
27
|
+
})
|
|
28
|
+
}), D = (e) => ({
|
|
29
|
+
message: /*#__PURE__*/ h(y, { id: "9PnW2j" }),
|
|
30
|
+
description: /*#__PURE__*/ h(y, {
|
|
31
|
+
id: "6x1HCw",
|
|
32
|
+
values: { errorMessage: e }
|
|
33
|
+
})
|
|
34
|
+
}), O = () => ({
|
|
35
|
+
message: /*#__PURE__*/ h(y, { id: "3qYWKy" }),
|
|
36
|
+
description: /*#__PURE__*/ h(y, { id: "8Xn6tg" })
|
|
37
|
+
}), k = (e) => ({
|
|
38
|
+
message: /*#__PURE__*/ h(y, { id: "3cksfP" }),
|
|
39
|
+
description: /*#__PURE__*/ h(y, {
|
|
40
|
+
id: "nqaM9R",
|
|
41
|
+
values: { errorMessage: e }
|
|
42
|
+
})
|
|
43
|
+
}), A = () => ({
|
|
44
|
+
message: /*#__PURE__*/ h(y, { id: "ygiW4d" }),
|
|
45
|
+
description: /*#__PURE__*/ h(y, { id: "lbxRVC" })
|
|
46
|
+
}), j = (e) => ({
|
|
47
|
+
message: /*#__PURE__*/ h(y, { id: "qToFUF" }),
|
|
48
|
+
description: /*#__PURE__*/ h(y, {
|
|
49
|
+
id: "/9TcRw",
|
|
50
|
+
values: { errorMessage: e }
|
|
51
|
+
})
|
|
52
|
+
}), M = (e) => ({
|
|
53
|
+
message: /*#__PURE__*/ h(y, { id: "CpPgKl" }),
|
|
54
|
+
description: /*#__PURE__*/ h(y, {
|
|
55
|
+
id: "3Gviib",
|
|
56
|
+
values: { targetTenant: e }
|
|
57
|
+
})
|
|
58
|
+
}), N = (e) => ({
|
|
59
|
+
message: /*#__PURE__*/ h(y, { id: "7xCEph" }),
|
|
60
|
+
description: /*#__PURE__*/ h(y, {
|
|
61
|
+
id: "tXYQKw",
|
|
62
|
+
values: { errorMessage: e }
|
|
63
|
+
})
|
|
64
|
+
}), P = (e) => ({
|
|
65
|
+
message: /*#__PURE__*/ h(y, { id: "+lwzZX" }),
|
|
66
|
+
description: /*#__PURE__*/ h(y, {
|
|
67
|
+
id: "+W6219",
|
|
68
|
+
values: { targetTenant: e }
|
|
69
|
+
})
|
|
70
|
+
}), F = (e) => ({
|
|
71
|
+
message: /*#__PURE__*/ h(y, { id: "YmvhrF" }),
|
|
72
|
+
description: /*#__PURE__*/ h(y, {
|
|
73
|
+
id: "Pc3uze",
|
|
74
|
+
values: { errorMessage: e }
|
|
75
|
+
})
|
|
76
|
+
}), I = ({ securityGroup: i, open: p, onClose: m, onUpdate: x, isLoading: S = !1, error: C = null }) => {
|
|
77
|
+
let { i18n: w, _: T } = b(), [E, D] = v({
|
|
78
|
+
name: i.name || "",
|
|
79
|
+
description: i.description || ""
|
|
80
|
+
}), [O, k] = v({});
|
|
81
|
+
_(() => {
|
|
82
|
+
D({
|
|
83
|
+
name: i.name || "",
|
|
84
|
+
description: i.description || ""
|
|
85
|
+
});
|
|
86
|
+
}, [i]);
|
|
87
|
+
let A = (e) => {
|
|
88
|
+
let { name: t, value: n, type: r } = e.target, i = e.target.checked;
|
|
89
|
+
D((e) => ({
|
|
90
|
+
...e,
|
|
91
|
+
[t]: r === "checkbox" ? i : n
|
|
92
|
+
})), O[t] && k((e) => {
|
|
93
|
+
let n = { ...e };
|
|
94
|
+
return delete n[t], n;
|
|
95
|
+
});
|
|
96
|
+
}, j = () => {
|
|
97
|
+
let e = {};
|
|
98
|
+
return (!E.name || E.name.trim() === "") && (e.name = w._({ id: "lN/Z9n" })), k(e), Object.keys(e).length === 0;
|
|
99
|
+
}, M = async (e) => {
|
|
100
|
+
if (e.preventDefault(), j() && x) {
|
|
101
|
+
let e = {
|
|
102
|
+
name: E.name.trim(),
|
|
103
|
+
description: E.description.trim() || void 0
|
|
104
|
+
};
|
|
105
|
+
await x(i.id, e);
|
|
106
|
+
}
|
|
107
|
+
}, N = () => {
|
|
108
|
+
k({}), m();
|
|
109
|
+
};
|
|
110
|
+
return /*#__PURE__*/ g(a, {
|
|
111
|
+
open: p,
|
|
112
|
+
onCancel: N,
|
|
113
|
+
size: "large",
|
|
114
|
+
title: w._({ id: "yu9G3x" }),
|
|
115
|
+
modalFooter: /*#__PURE__*/ h(r, {
|
|
116
|
+
className: "flex justify-end",
|
|
117
|
+
children: /*#__PURE__*/ g(n, { children: [/*#__PURE__*/ h(c, {
|
|
118
|
+
variant: "default",
|
|
119
|
+
onClick: N,
|
|
120
|
+
disabled: S,
|
|
121
|
+
children: /*#__PURE__*/ h(y, { id: "dEgA5A" })
|
|
122
|
+
}), /*#__PURE__*/ h(c, {
|
|
123
|
+
variant: "primary",
|
|
124
|
+
onClick: (e) => {
|
|
125
|
+
M(e);
|
|
126
|
+
},
|
|
127
|
+
disabled: S,
|
|
128
|
+
"data-testid": "update-security-group-button",
|
|
129
|
+
children: S ? /*#__PURE__*/ h(e, { size: "small" }) : /*#__PURE__*/ h(y, { id: "Df0YHr" })
|
|
130
|
+
})] })
|
|
131
|
+
}),
|
|
132
|
+
children: [
|
|
133
|
+
C && /*#__PURE__*/ h(t, {
|
|
134
|
+
dismissible: !1,
|
|
135
|
+
variant: "error",
|
|
136
|
+
className: "mb-4",
|
|
137
|
+
children: C
|
|
138
|
+
}),
|
|
139
|
+
S && /*#__PURE__*/ h(f, {
|
|
140
|
+
status: "progress",
|
|
141
|
+
title: w._({ id: "IYS5YX" }),
|
|
142
|
+
className: "mt-0"
|
|
143
|
+
}),
|
|
144
|
+
!S && /*#__PURE__*/ h(o, {
|
|
145
|
+
className: "mb-6",
|
|
146
|
+
children: /*#__PURE__*/ g(d, {
|
|
147
|
+
className: "mb-6",
|
|
148
|
+
children: [/*#__PURE__*/ h(s, {
|
|
149
|
+
className: "mb-6",
|
|
150
|
+
children: /*#__PURE__*/ h(u, {
|
|
151
|
+
id: "name",
|
|
152
|
+
name: "name",
|
|
153
|
+
label: w._({ id: "6YtxFj" }),
|
|
154
|
+
value: E.name,
|
|
155
|
+
onChange: A,
|
|
156
|
+
required: !0,
|
|
157
|
+
errortext: O.name,
|
|
158
|
+
placeholder: w._({ id: "Ac6dy9" }),
|
|
159
|
+
disabled: S
|
|
160
|
+
})
|
|
161
|
+
}), /*#__PURE__*/ h(s, {
|
|
162
|
+
className: "mb-6",
|
|
163
|
+
children: /*#__PURE__*/ h(l, {
|
|
164
|
+
id: "description",
|
|
165
|
+
name: "description",
|
|
166
|
+
label: w._({ id: "Nu4oKW" }),
|
|
167
|
+
value: E.description,
|
|
168
|
+
onChange: A,
|
|
169
|
+
placeholder: w._({ id: "Nu4oKW" }),
|
|
170
|
+
disabled: S,
|
|
171
|
+
rows: 3
|
|
172
|
+
})
|
|
173
|
+
})]
|
|
174
|
+
})
|
|
175
|
+
})
|
|
176
|
+
]
|
|
177
|
+
});
|
|
178
|
+
}, L = ({ isOpen: e, onClose: n, securityGroup: r, onDelete: s, isDeleting: c = !1, error: l = null }) => {
|
|
179
|
+
let { i18n: f, _: p } = b(), { trackClose: _, markSubmitted: v, resetTracking: w } = m({
|
|
180
|
+
isOpen: e,
|
|
181
|
+
actionPrefix: "network.securitygroup.delete"
|
|
182
|
+
}), T = x.object({ confirm: x.string().refine((e) => e === "delete", { message: f._({ id: "QytzQr" }) }) }), E = S({
|
|
183
|
+
defaultValues: { confirm: "" },
|
|
184
|
+
validators: { onSubmit: T },
|
|
185
|
+
onSubmit: async () => {
|
|
186
|
+
c || (v(), s(r.id));
|
|
187
|
+
}
|
|
188
|
+
}), D = C(E.store, (e) => e.isSubmitting || e.values.confirm !== "delete"), O = r.name || r.id;
|
|
189
|
+
return /*#__PURE__*/ h(a, {
|
|
190
|
+
open: e,
|
|
191
|
+
onCancel: () => {
|
|
192
|
+
_(), E.reset(), w(), n();
|
|
193
|
+
},
|
|
194
|
+
size: "small",
|
|
195
|
+
title: f._({
|
|
196
|
+
id: "Y+2SDm",
|
|
197
|
+
values: { securityGroupName: O }
|
|
198
|
+
}),
|
|
199
|
+
confirmButtonLabel: c ? f._({ id: "EF2EU9" }) : f._({ id: "bcOdok" }),
|
|
200
|
+
confirmButtonVariant: "primary-danger",
|
|
201
|
+
onConfirm: E.handleSubmit,
|
|
202
|
+
cancelButtonLabel: f._({ id: "dEgA5A" }),
|
|
203
|
+
disableConfirmButton: D || c,
|
|
204
|
+
disableCancelButton: c,
|
|
205
|
+
disableCloseButton: c,
|
|
206
|
+
children: /*#__PURE__*/ g(i, {
|
|
207
|
+
direction: "vertical",
|
|
208
|
+
gap: "4",
|
|
209
|
+
children: [
|
|
210
|
+
l && /*#__PURE__*/ h(t, {
|
|
211
|
+
variant: "error",
|
|
212
|
+
children: l
|
|
213
|
+
}),
|
|
214
|
+
/*#__PURE__*/ h("p", {
|
|
215
|
+
className: "text-theme-default",
|
|
216
|
+
children: /*#__PURE__*/ h(y, { id: "Qb+14I" })
|
|
217
|
+
}),
|
|
218
|
+
/*#__PURE__*/ h(o, {
|
|
219
|
+
className: "mb-0",
|
|
220
|
+
id: "delete-security-group-form",
|
|
221
|
+
onSubmit: (e) => {
|
|
222
|
+
e.preventDefault(), E.handleSubmit();
|
|
223
|
+
},
|
|
224
|
+
children: /*#__PURE__*/ h(d, { children: /*#__PURE__*/ h(E.Field, {
|
|
225
|
+
name: "confirm",
|
|
226
|
+
children: (e) => /*#__PURE__*/ h(u, {
|
|
227
|
+
label: f._({ id: "QytzQr" }),
|
|
228
|
+
id: e.name,
|
|
229
|
+
name: e.name,
|
|
230
|
+
value: e.state.value,
|
|
231
|
+
onChange: (t) => e.handleChange(t.target.value),
|
|
232
|
+
placeholder: "delete",
|
|
233
|
+
disabled: c,
|
|
234
|
+
autoComplete: "off",
|
|
235
|
+
autoFocus: !0,
|
|
236
|
+
"data-testid": "delete-confirmation-input",
|
|
237
|
+
required: !0
|
|
238
|
+
})
|
|
239
|
+
}) })
|
|
240
|
+
})
|
|
241
|
+
]
|
|
242
|
+
})
|
|
243
|
+
});
|
|
244
|
+
};
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region src/client/routes/_auth/projects/$projectId/network/securitygroups/-hooks/useSecurityGroupPermissions.ts
|
|
247
|
+
function R(e) {
|
|
248
|
+
let { data: t = {
|
|
249
|
+
canView: !1,
|
|
250
|
+
canCreate: !1,
|
|
251
|
+
canUpdate: !1,
|
|
252
|
+
canDelete: !1,
|
|
253
|
+
canCreateRule: !1,
|
|
254
|
+
canDeleteRule: !1,
|
|
255
|
+
canManageAccess: !1,
|
|
256
|
+
canViewRBAC: !1
|
|
257
|
+
}, isLoading: n, isError: r } = p.network.canUser.useQuery({
|
|
258
|
+
project_id: e || "",
|
|
259
|
+
permission: [
|
|
260
|
+
"network:security_groups:read",
|
|
261
|
+
"network:security_groups:create",
|
|
262
|
+
"network:security_groups:update",
|
|
263
|
+
"network:security_groups:delete",
|
|
264
|
+
"network:security_group_rules:create",
|
|
265
|
+
"network:security_group_rules:delete",
|
|
266
|
+
"network:rbac_policies:create",
|
|
267
|
+
"network:rbac_policies:delete",
|
|
268
|
+
"network:rbac_policies:read"
|
|
269
|
+
]
|
|
270
|
+
}, {
|
|
271
|
+
enabled: !!e,
|
|
272
|
+
select: ([e, t, n, r, i, a, o, s, c]) => ({
|
|
273
|
+
canView: e,
|
|
274
|
+
canCreate: t,
|
|
275
|
+
canUpdate: n,
|
|
276
|
+
canDelete: r,
|
|
277
|
+
canCreateRule: i,
|
|
278
|
+
canDeleteRule: a,
|
|
279
|
+
canManageAccess: o && s,
|
|
280
|
+
canViewRBAC: c
|
|
281
|
+
}),
|
|
282
|
+
staleTime: Infinity,
|
|
283
|
+
gcTime: Infinity
|
|
284
|
+
});
|
|
285
|
+
return {
|
|
286
|
+
permissions: t,
|
|
287
|
+
isLoading: n,
|
|
288
|
+
isError: r
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
//#endregion
|
|
292
|
+
export { M as a, T as c, O as d, j as f, E as h, N as i, w as l, D as m, L as n, F as o, A as p, I as r, P as s, R as t, k as u };
|
|
293
|
+
|
|
294
|
+
//# sourceMappingURL=useSecurityGroupPermissions--hK4aR8Y.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSecurityGroupPermissions--hK4aR8Y.mjs","names":["getSecurityGroupDeletedToast","name","message","description","getSecurityGroupDeleteErrorToast","errorMessage","getSecurityGroupUpdatedToast","getSecurityGroupUpdateErrorToast","getSecurityGroupRuleCreatedToast","getSecurityGroupRuleCreateErrorToast","getSecurityGroupRuleDeletedToast","getSecurityGroupRuleDeleteErrorToast","getRBACPolicyAddedToast","targetTenant","getRBACPolicyAddErrorToast","getRBACPolicyDeletedToast","getRBACPolicyDeleteErrorToast","React","useState","useEffect","Modal","Form","FormRow","FormSection","TextInput","Button","ButtonRow","Spinner","ModalFooter","Textarea","Message","Status","EditSecurityGroupModal","securityGroup","open","onClose","onUpdate","isLoading","error","useLingui","properties","setProperties","name","description","errors","setErrors","handleInputChange","e","value","type","target","checked","prev","newErrors","validateForm","trim","t","Object","keys","length","handleSubmit","preventDefault","updateData","undefined","id","handleClose","onCancel","size","title","modalFooter","className","variant","onClick","disabled","data-testid","dismissible","status","label","onChange","required","errortext","placeholder","rows","z","useForm","useStore","React","Modal","Stack","Message","Form","FormSection","TextInput","useModalTracking","DeleteSecurityGroupDialog","isOpen","onClose","securityGroup","onDelete","isDeleting","error","useLingui","trackClose","markSubmitted","resetTracking","actionPrefix","formSchema","object","confirm","string","refine","value","message","t","form","defaultValues","validators","onSubmit","id","canDelete","store","state","isSubmitting","values","securityGroupName","name","handleClose","reset","open","onCancel","size","title","confirmButtonLabel","confirmButtonVariant","onConfirm","handleSubmit","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","direction","gap","variant","p","className","e","preventDefault","Field","children","field","label","onChange","handleChange","target","placeholder","disabled","autoComplete","autoFocus","data-testid","required","trpcReact","useSecurityGroupPermissions","projectId","data","permissions","canView","canCreate","canUpdate","canDelete","canCreateRule","canDeleteRule","canManageAccess","canViewRBAC","isLoading","isError","network","canUser","useQuery","project_id","permission","enabled","Boolean","select","canCreateRBAC","canDeleteRBAC","staleTime","Infinity","gcTime"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupToastNotifications.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/-modals/EditSecurityGroupModal.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/-modals/DeleteSecurityGroupDialog.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-hooks/useSecurityGroupPermissions.ts"],"sourcesContent":["import { ReactNode } from \"react\"\nimport { NotificationOptions } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\n\ntype ToastReturnType = { message: ReactNode } & NotificationOptions\n\n// ── Security Group operations ──────────────────────────────────────────────\n\nexport const getSecurityGroupDeletedToast = (name: string): ToastReturnType => ({\n message: <Trans>Security Group Deleted</Trans>,\n description: <Trans>Security group \"{name}\" was successfully deleted.</Trans>,\n})\n\nexport const getSecurityGroupDeleteErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Delete Security Group</Trans>,\n description: <Trans>Could not delete security group: {errorMessage}</Trans>,\n})\n\nexport const getSecurityGroupUpdatedToast = (name: string): ToastReturnType => ({\n message: <Trans>Security Group Updated</Trans>,\n description: <Trans>Security group \"{name}\" was successfully updated.</Trans>,\n})\n\nexport const getSecurityGroupUpdateErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Update Security Group</Trans>,\n description: <Trans>Could not update security group: {errorMessage}</Trans>,\n})\n\n// ── Rule operations ────────────────────────────────────────────────────────\n\nexport const getSecurityGroupRuleCreatedToast = (): ToastReturnType => ({\n message: <Trans>Rule Created</Trans>,\n description: <Trans>Security group rule was successfully created.</Trans>,\n})\n\nexport const getSecurityGroupRuleCreateErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Create Rule</Trans>,\n description: <Trans>Could not create security group rule: {errorMessage}</Trans>,\n})\n\nexport const getSecurityGroupRuleDeletedToast = (): ToastReturnType => ({\n message: <Trans>Rule Deleted</Trans>,\n description: <Trans>Security group rule was successfully deleted.</Trans>,\n})\n\nexport const getSecurityGroupRuleDeleteErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Delete Rule</Trans>,\n description: <Trans>Could not delete security group rule: {errorMessage}</Trans>,\n})\n\n// ── RBAC Policy operations ─────────────────────────────────────────────────\n\nexport const getRBACPolicyAddedToast = (targetTenant: string): ToastReturnType => ({\n message: <Trans>Security Group Shared</Trans>,\n description: <Trans>Security group was successfully shared with project \"{targetTenant}\".</Trans>,\n})\n\nexport const getRBACPolicyAddErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Share Security Group</Trans>,\n description: <Trans>Could not share security group: {errorMessage}</Trans>,\n})\n\nexport const getRBACPolicyDeletedToast = (targetTenant: string): ToastReturnType => ({\n message: <Trans>Access Revoked</Trans>,\n description: <Trans>Access for project \"{targetTenant}\" was successfully revoked.</Trans>,\n})\n\nexport const getRBACPolicyDeleteErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Revoke Access</Trans>,\n description: <Trans>Could not revoke access: {errorMessage}</Trans>,\n})\n","import React, { useState, useEffect } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormRow,\n FormSection,\n TextInput,\n Button,\n ButtonRow,\n Spinner,\n ModalFooter,\n Textarea,\n Message,\n Status,\n} from \"@cloudoperators/juno-ui-components\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\nimport { UpdateSecurityGroupInput } from \"@/server/Network/types/securityGroup\"\n\ninterface EditSecurityGroupModalProps {\n securityGroup: SecurityGroup\n open: boolean\n onClose: () => void\n onUpdate?: (\n securityGroupId: string,\n data: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\">\n ) => Promise<void>\n isLoading?: boolean\n error?: string | null\n}\n\ninterface SecurityGroupProperties {\n name: string\n description: string\n}\n\nexport const EditSecurityGroupModal: React.FC<EditSecurityGroupModalProps> = ({\n securityGroup,\n open,\n onClose,\n onUpdate,\n isLoading = false,\n error = null,\n}) => {\n const { t } = useLingui()\n\n const [properties, setProperties] = useState<SecurityGroupProperties>({\n name: securityGroup.name || \"\",\n description: securityGroup.description || \"\",\n })\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n\n // Update properties when securityGroup changes\n useEffect(() => {\n setProperties({\n name: securityGroup.name || \"\",\n description: securityGroup.description || \"\",\n })\n }, [securityGroup])\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const { name, value, type } = e.target\n const checked = (e.target as HTMLInputElement).checked\n\n setProperties((prev) => ({\n ...prev,\n [name]: type === \"checkbox\" ? checked : value,\n }))\n\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\n }\n }\n\n const validateForm = (): boolean => {\n const newErrors: { [key: string]: string } = {}\n\n if (!properties.name || properties.name.trim() === \"\") {\n newErrors.name = t`Security group name is required`\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n\n if (!validateForm()) {\n return\n }\n\n if (onUpdate) {\n // Prepare base update data without stateful\n const updateData: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\"> = {\n name: properties.name.trim(),\n description: properties.description.trim() || undefined,\n }\n\n // Note: We deliberately do NOT include 'stateful' field here\n // because it requires special 'update_security_group:stateful' permission\n // which needs cloud admin role. Regular users can only update name/description.\n\n await onUpdate(securityGroup.id, updateData)\n }\n }\n\n const handleClose = () => {\n setErrors({})\n onClose()\n }\n\n return (\n <Modal\n open={open}\n onCancel={handleClose}\n size=\"large\"\n title={t`Edit Security Group`}\n modalFooter={\n <ModalFooter className=\"flex justify-end\">\n <ButtonRow>\n <Button variant=\"default\" onClick={handleClose} disabled={isLoading}>\n <Trans>Cancel</Trans>\n </Button>\n <Button\n variant=\"primary\"\n onClick={(e) => {\n handleSubmit(e)\n }}\n disabled={isLoading}\n data-testid=\"update-security-group-button\"\n >\n {isLoading ? <Spinner size=\"small\" /> : <Trans>Update Security Group</Trans>}\n </Button>\n </ButtonRow>\n </ModalFooter>\n }\n >\n {/* Error Message */}\n {error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {error}\n </Message>\n )}\n\n {isLoading && <Status status=\"progress\" title={t`Updating Security Group...`} className=\"mt-0\" />}\n\n {!isLoading && (\n <Form className=\"mb-6\">\n <FormSection className=\"mb-6\">\n <FormRow className=\"mb-6\">\n <TextInput\n id=\"name\"\n name=\"name\"\n label={t`Name`}\n value={properties.name}\n onChange={handleInputChange}\n required\n errortext={errors.name}\n placeholder={t`Type name`}\n disabled={isLoading}\n />\n </FormRow>\n\n <FormRow className=\"mb-6\">\n <Textarea\n id=\"description\"\n name=\"description\"\n label={t`Description`}\n value={properties.description}\n onChange={handleInputChange}\n placeholder={t`Description`}\n disabled={isLoading}\n rows={3}\n />\n </FormRow>\n {/* Note: Stateful checkbox is not shown here because it requires 'update_security_group:stateful' permission (cloud admin only) */}\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport React from \"react\"\nimport { Modal, Stack, Message, Form, FormSection, TextInput } from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\nimport { useModalTracking } from \"@/client/hooks/useModalTracking\"\n\ninterface DeleteSecurityGroupDialogProps {\n isOpen: boolean\n securityGroup: SecurityGroup\n onClose: () => void\n onDelete: (securityGroupId: string) => void\n isDeleting?: boolean\n error?: string | null\n}\n\nexport const DeleteSecurityGroupDialog: React.FC<DeleteSecurityGroupDialogProps> = ({\n isOpen,\n onClose,\n securityGroup,\n onDelete,\n isDeleting = false,\n error = null,\n}) => {\n const { t } = useLingui()\n\n const { trackClose, markSubmitted, resetTracking } = useModalTracking({\n isOpen,\n actionPrefix: \"network.securitygroup.delete\",\n })\n\n const formSchema = z.object({\n confirm: z.string().refine((value) => value === \"delete\", {\n message: t`Type \"delete\" to confirm`,\n }),\n })\n\n const form = useForm({\n defaultValues: {\n confirm: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (isDeleting) return\n\n markSubmitted()\n onDelete(securityGroup.id)\n },\n })\n\n const canDelete = useStore(form.store, (state) => state.isSubmitting || state.values.confirm !== \"delete\")\n\n const securityGroupName = securityGroup.name || securityGroup.id\n\n const handleClose = () => {\n trackClose()\n form.reset()\n resetTracking()\n onClose()\n }\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n size=\"small\"\n title={t`Delete Security Group \"${securityGroupName}\"`}\n confirmButtonLabel={isDeleting ? t`Deleting...` : t`Delete Group`}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={form.handleSubmit}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={canDelete || isDeleting}\n disableCancelButton={isDeleting}\n disableCloseButton={isDeleting}\n >\n <Stack direction=\"vertical\" gap=\"4\">\n {error && <Message variant=\"error\">{error}</Message>}\n\n <p className=\"text-theme-default\">\n <Trans>This action cannot be undone. The security group will be permanently deleted.</Trans>\n </p>\n\n <Form\n className=\"mb-0\"\n id=\"delete-security-group-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"confirm\"\n children={(field) => (\n <TextInput\n label={t`Type \"delete\" to confirm`}\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"delete\"\n disabled={isDeleting}\n autoComplete=\"off\"\n autoFocus\n data-testid=\"delete-confirmation-input\"\n required\n />\n )}\n />\n </FormSection>\n </Form>\n </Stack>\n </Modal>\n )\n}\n","import { trpcReact } from \"@/client/trpcClient\"\n\nexport interface SecurityGroupPermissions {\n canView: boolean\n canCreate: boolean\n canUpdate: boolean\n canDelete: boolean\n canCreateRule: boolean\n canDeleteRule: boolean\n canManageAccess: boolean\n canViewRBAC: boolean\n}\n\n/**\n * Hook to fetch security group permissions for the current user\n * Uses React Query with infinite cache since permissions don't change during session\n */\nexport function useSecurityGroupPermissions(projectId: string) {\n const {\n data: permissions = {\n canView: false,\n canCreate: false,\n canUpdate: false,\n canDelete: false,\n canCreateRule: false,\n canDeleteRule: false,\n canManageAccess: false,\n canViewRBAC: false,\n },\n isLoading,\n isError,\n } = trpcReact.network.canUser.useQuery(\n {\n project_id: projectId || \"\",\n permission: [\n \"network:security_groups:read\",\n \"network:security_groups:create\",\n \"network:security_groups:update\",\n \"network:security_groups:delete\",\n \"network:security_group_rules:create\",\n \"network:security_group_rules:delete\",\n \"network:rbac_policies:create\",\n \"network:rbac_policies:delete\",\n \"network:rbac_policies:read\",\n ],\n },\n {\n enabled: Boolean(projectId), // Only fetch if we have a project ID\n select: ([\n canView,\n canCreate,\n canUpdate,\n canDelete,\n canCreateRule,\n canDeleteRule,\n canCreateRBAC,\n canDeleteRBAC,\n canViewRBAC,\n ]) => ({\n canView,\n canCreate,\n canUpdate,\n canDelete,\n canCreateRule,\n canDeleteRule,\n canManageAccess: canCreateRBAC && canDeleteRBAC,\n canViewRBAC,\n }),\n staleTime: Infinity, // Permissions don't change during session\n gcTime: Infinity, // Keep in cache forever (previously cacheTime)\n }\n )\n\n return {\n permissions,\n isLoading,\n isError,\n }\n}\n"],"mappings":";;;;;;;;;AAQA,IAAaA,KAAgCC,OAAmC;CAC9EC,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAAwBF,QAAAA,EAAAA,QAAAA;;AACvC,IAEaG,KAAoCC,OAA2C;CAC1FH,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAAyCE,QAAAA,EAAAA,gBAAAA;;AACxD,IAEaC,KAAgCL,OAAmC;CAC9EC,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAAwBF,QAAAA,EAAAA,QAAAA;;AACvC,IAEaM,KAAoCF,OAA2C;CAC1FH,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAAyCE,QAAAA,EAAAA,gBAAAA;;AACxD,IAIaG,WAA2D;CACtEN,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;AACf,IAEaM,KAAwCJ,OAA2C;CAC9FH,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAA8CE,QAAAA,EAAAA,gBAAAA;;AAC7D,IAEaK,WAA2D;CACtER,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;AACf,IAEaQ,KAAwCN,OAA2C;CAC9FH,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAA8CE,QAAAA,EAAAA,gBAAAA;;AAC7D,IAIaO,KAA2BC,OAA2C;CACjFX,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAA6DU,QAAAA,EAAAA,gBAAAA;;AAC5E,IAEaC,KAA8BT,OAA2C;CACpFH,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAAwCE,QAAAA,EAAAA,gBAAAA;;AACvD,IAEaU,KAA6BF,OAA2C;CACnFX,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAA4BU,QAAAA,EAAAA,gBAAAA;;AAC3C,IAEaG,KAAiCX,OAA2C;CACvFH,SAAS,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;CACTC,aAAa,gBAAA,GAAA;;EAAiCE,QAAAA,EAAAA,gBAAAA;;AAChD,IClCa2B,KAAiE,EAC5EC,kBACAC,SACAC,YACAC,aACAC,eAAY,IACZC,WAAQ,WACT;CACC,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GAER,CAACC,GAAYC,KAAiBvB,EAAkC;EACpEwB,MAAMT,EAAcS,QAAQ;EAC5BC,aAAaV,EAAcU,eAAe;CAC5C,CAAA,GACM,CAACC,GAAQC,KAAa3B,EAAoC,CAAC,CAAA;CAGjEC,QAAU;EACRsB,EAAc;GACZC,MAAMT,EAAcS,QAAQ;GAC5BC,aAAaV,EAAcU,eAAe;EAC5C,CAAA;CACF,GAAG,CAACV,CAAc,CAAA;CAElB,IAAMa,KAAqBC,MAAAA;EACzB,IAAM,EAAEL,SAAMM,UAAOC,YAASF,EAAEG,QAC1BC,IAAU,EAAGD,OAA4BC;EAO/C,AALAV,GAAeW,OAAU;GACvB,GAAGA;IACFV,IAAOO,MAAS,aAAaE,IAAUH;EAC1C,EAAA,GAEIJ,EAAOF,MACTG,GAAWO,MAAAA;GACT,IAAMC,IAAY,EAAE,GAAGD,EAAK;GAE5B,OADA,OAAOC,EAAUX,IACVW;EACT,CAAA;CAEJ,GAEMC,UAAe;EACnB,IAAMD,IAAuC,CAAC;EAO9C,QALI,CAACb,EAAWE,QAAQF,EAAWE,KAAKa,KAAI,MAAO,QACjDF,EAAUX,OAAOc,EAAAA,EAAC,EAAA,IAAA,SAAgC,CAAA,IAGpDX,EAAUQ,CAAAA,GACHI,OAAOC,KAAKL,CAAAA,CAAAA,CAAWM,WAAW;CAC3C,GAEMC,IAAe,OAAOb,MAAAA;EAC1BA,MAAEc,eAAc,GAEXP,EAAAA,KAIDlB,GAAU;GAEZ,IAAM0B,IAA+E;IACnFpB,MAAMF,EAAWE,KAAKa,KAAI;IAC1BZ,aAAaH,EAAWG,YAAYY,KAAI,KAAMQ,KAAAA;GAChD;GAMA,MAAM3B,EAASH,EAAc+B,IAAIF,CAAAA;EACnC;CACF,GAEMG,UAAc;EAElB9B,AADAU,EAAU,CAAC,CAAA,GACXV,EAAAA;CACF;CAEA,OACE,gBAACf,GAAAA;EACOc;EACNgC,UAAUD;EACVE,MAAK;EACLC,OAAOZ,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;EAC5Ba,aACE,gBAACzC,GAAAA;GAAY0C,WAAU;GACrB,UAAA,gBAAC5C,GAAAA,EAAAA,UAAAA,CACC,gBAACD,GAAAA;IAAO8C,SAAQ;IAAUC,SAASP;IAAaQ,UAAUpC;IACxD,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;GAEF,CAAA,GAAA,gBAACZ,GAAAA;IACC8C,SAAQ;IACRC,UAAUzB,MAAAA;KACRa,EAAab,CAAAA;IACf;IACA0B,UAAUpC;IACVqC,eAAY;IAEXrC,UAAAA,IAAY,gBAACV,GAAAA,EAAQwC,MAAK,QAAa,CAAA,IAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;GAO/C7B,KACC,gBAACR,GAAAA;IAAQ6C,aAAa;IAAOJ,SAAQ;IAAQD,WAAU;IACpDhC,UAAAA;;GAIJD,KAAa,gBAACN,GAAAA;IAAO6C,QAAO;IAAWR,OAAOZ,EAAAA,EAAC,EAAA,IAAA,SAA2B,CAAA;IAAGc,WAAU;;GAEvF,CAACjC,KACA,gBAAChB,GAAAA;IAAKiD,WAAU;IACd,UAAA,gBAAC/C,GAAAA;KAAY+C,WAAU;KACrB,UAAA,CAAA,gBAAChD,GAAAA;MAAQgD,WAAU;MACjB,UAAA,gBAAC9C,GAAAA;OACCwC,IAAG;OACHtB,MAAK;OACLmC,OAAOrB,EAAAA,EAAC,EAAA,IAAA,SAAK,CAAA;OACbR,OAAOR,EAAWE;OAClBoC,UAAUhC;OACViC,UAAQ;OACRC,WAAWpC,EAAOF;OAClBuC,aAAazB,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;OACxBiB,UAAUpC;;KAId,CAAA,GAAA,gBAACf,GAAAA;MAAQgD,WAAU;MACjB,UAAA,gBAACzC,GAAAA;OACCmC,IAAG;OACHtB,MAAK;OACLmC,OAAOrB,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA;OACpBR,OAAOR,EAAWG;OAClBmC,UAAUhC;OACVmC,aAAazB,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA;OAC1BiB,UAAUpC;OACV6C,MAAM;;;;;;;AAStB,GCzKaY,KAAuE,EAClFC,WACAC,YACAC,kBACAC,aACAC,gBAAa,IACbC,WAAQ,WACT;CACC,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GAER,EAAEC,eAAYC,kBAAeC,qBAAkBX,EAAiB;EACpEE;EACAU,cAAc;CAChB,CAAA,GAEMC,IAAavB,EAAEwB,OAAO,EAC1BC,SAASzB,EAAE0B,OAAM,CAAA,CAAGC,QAAQC,MAAUA,MAAU,UAAU,EACxDC,SAASC,EAAAA,EAAC,EAAA,IAAA,SAAyB,CAAA,EACrC,CAAA,EACF,CAAA,GAEMC,IAAO9B,EAAQ;EACnB+B,eAAe,EACbP,SAAS,GACX;EACAQ,YAAY,EACVC,UAAUX,EACZ;EACAW,UAAU,YAAA;GACJlB,MAEJI,EAAAA,GACAL,EAASD,EAAcqB,EAAE;EAC3B;CACF,CAAA,GAEMC,IAAYlC,EAAS6B,EAAKM,QAAQC,MAAUA,EAAMC,gBAAgBD,EAAME,OAAOf,YAAY,QAAA,GAE3FgB,IAAoB3B,EAAc4B,QAAQ5B,EAAcqB;CAS9D,OACE,gBAAC/B,GAAAA;EACCyC,MAAMjC;EACNkC,gBAVgB;GAIlBjC,AAHAM,EAAAA,GACAY,EAAKa,MAAK,GACVvB,EAAAA,GACAR,EAAAA;EACF;EAMIkC,MAAK;EACLC,OAAOlB,EAAAA,EAAC;;GAA0BW,QAAAA,EAAAA,qBAAAA;EAAmB,CAAA;EACrDQ,oBAAoBjC,IAAac,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA,IAAIA,EAAAA,EAAC,EAAA,IAAA,SAAa,CAAA;EAChEoB,sBAAqB;EACrBC,WAAWpB,EAAKqB;EAChBC,mBAAmBvB,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;EAC3BwB,sBAAsBlB,KAAapB;EACnCuC,qBAAqBvC;EACrBwC,oBAAoBxC;EAEpB,UAAA,gBAACX,GAAAA;GAAMoD,WAAU;GAAWC,KAAI;;IAC7BzC,KAAS,gBAACX,GAAAA;KAAQqD,SAAQ;KAAS1C,UAAAA;;IAEpC,gBAAC2C,KAAAA;KAAEC,WAAU;KACX,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAGF,gBAACtD,GAAAA;KACCsD,WAAU;KACV1B,IAAG;KACHD,WAAW4B,MAAAA;MAET/B,AADA+B,EAAEC,eAAc,GAChBhC,EAAKqB,aAAY;KACnB;KAEA,UAAA,gBAAC5C,GAAAA,EACC,UAAA,gBAACuB,EAAKiC,OAAK;MACTtB,MAAK;MACLuB,WAAWC,MACT,gBAACzD,GAAAA;OACC0D,OAAOrC,EAAAA,EAAC,EAAA,IAAA,SAAyB,CAAA;OACjCK,IAAI+B,EAAMxB;OACVA,MAAMwB,EAAMxB;OACZd,OAAOsC,EAAM5B,MAAMV;OACnBwC,WAAWN,MAAMI,EAAMG,aAAaP,EAAEQ,OAAO1C,KAAK;OAClD2C,aAAY;OACZC,UAAUxD;OACVyD,cAAa;OACbC,WAAS;OACTC,eAAY;OACZC,UAAQ;;;;;;;AAS1B;;;ACpGA,SAAgBE,EAA4BC,GAAiB;CAC3D,IAAM,EACJC,MAAMC,IAAc;EAClBC,SAAS;EACTC,WAAW;EACXC,WAAW;EACXC,WAAW;EACXC,eAAe;EACfC,eAAe;EACfC,iBAAiB;EACjBC,aAAa;CACf,GACAC,cACAC,eACEd,EAAUe,QAAQC,QAAQC,SAC5B;EACEC,YAAYhB,KAAa;EACzBiB,YAAY;GACV;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;CACH,GACA;EACEC,SAASC,EAAQnB;EACjBoB,SAAS,CACPjB,GACAC,GACAC,GACAC,GACAC,GACAC,GACAa,GACAC,GACAZ,QACK;GACLP;GACAC;GACAC;GACAC;GACAC;GACAC;GACAC,iBAAiBY,KAAiBC;GAClCZ;EACF;EACAa,WAAWC;EACXC,QAAQD;CACV,CAAA;CAGF,OAAO;EACLtB;EACAS;EACAC;CACF;AACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mirrors the backend's service resolution, which matches by NAME and ignores the
|
|
3
|
+
* catalog type entirely (cephProcedure.ts:23 → ctx.openstack.service("ceph");
|
|
4
|
+
* swiftRouter.ts → service("swift"); signal-openstack session.ts:95 takes only a name).
|
|
5
|
+
* The old type-scoped lookups disagreed with it: Ceph lives in the catalog as
|
|
6
|
+
* { type: "object-store-ceph", name: "ceph" }, so serviceIndex["object-store"]["ceph"]
|
|
7
|
+
* never matched, and a temporary Ceph availability fallback had to paper over it.
|
|
8
|
+
*/
|
|
9
|
+
export declare const hasServiceByName: (serviceIndex: Record<string, Record<string, boolean>>, name: string) => boolean;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for the storage provider ↔ storage-type noun mapping
|
|
3
|
+
* (`swift` → `containers`, `ceph` → `buckets`). Every route/component that needs
|
|
4
|
+
* to build or validate a `/storage/$provider/$storageType` URL should go through
|
|
5
|
+
* this module instead of re-hardcoding the pairing.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The object-storage providers. The same spelling serves as the `$provider` URL
|
|
9
|
+
* segment and as the OpenStack catalog service *name* the backend resolves by
|
|
10
|
+
* (see `serviceCatalog.ts`), so one constant covers both uses.
|
|
11
|
+
*/
|
|
12
|
+
export declare const STORAGE_PROVIDER: {
|
|
13
|
+
readonly SWIFT: "swift";
|
|
14
|
+
readonly CEPH: "ceph";
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The `$storageType` URL segment noun each provider uses.
|
|
18
|
+
*
|
|
19
|
+
* Deliberately NOT the same vocabulary as the nav / `enabledServices` service keys
|
|
20
|
+
* (`"containers"` / `"ceph-containers"`), which only happen to share the word
|
|
21
|
+
* "containers" — Ceph's nav key is `"ceph-containers"`, never `"buckets"`. Don't
|
|
22
|
+
* substitute one for the other.
|
|
23
|
+
*/
|
|
24
|
+
export declare const STORAGE_TYPE: {
|
|
25
|
+
readonly CONTAINERS: "containers";
|
|
26
|
+
readonly BUCKETS: "buckets";
|
|
27
|
+
};
|
|
28
|
+
export declare const STORAGE_TYPE_BY_PROVIDER: {
|
|
29
|
+
readonly swift: "containers";
|
|
30
|
+
readonly ceph: "buckets";
|
|
31
|
+
};
|
|
32
|
+
export type StorageProvider = keyof typeof STORAGE_TYPE_BY_PROVIDER;
|
|
33
|
+
export type StorageType = (typeof STORAGE_TYPE_BY_PROVIDER)[StorageProvider];
|
|
34
|
+
/**
|
|
35
|
+
* Narrows an unknown value (typically a raw `$provider` URL segment) to a known
|
|
36
|
+
* `StorageProvider`. Uses `Object.hasOwn` rather than `in` — `"__proto__" in obj`
|
|
37
|
+
* evaluates to `true` for any object, which would let `/storage/__proto__/...`
|
|
38
|
+
* pass validation.
|
|
39
|
+
*/
|
|
40
|
+
export declare const isStorageProvider: (value: unknown) => value is StorageProvider;
|
|
41
|
+
/** Returns `value` narrowed to a `StorageProvider`, or `fallback` if it isn't one. */
|
|
42
|
+
export declare const asStorageProvider: (value: unknown, fallback: StorageProvider) => StorageProvider;
|
|
43
|
+
/** The canonical storage-type noun for a given provider. */
|
|
44
|
+
export declare const storageTypeFor: (provider: StorageProvider) => StorageType;
|
package/dist/server/index.d.ts
CHANGED
|
@@ -965,6 +965,7 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
|
|
|
965
965
|
tags_any?: string | undefined;
|
|
966
966
|
not_tags?: string | undefined;
|
|
967
967
|
not_tags_any?: string | undefined;
|
|
968
|
+
stateful?: boolean | undefined;
|
|
968
969
|
searchTerm?: string | undefined;
|
|
969
970
|
};
|
|
970
971
|
output: {
|
|
@@ -1317,6 +1318,43 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
|
|
|
1317
1318
|
}[] | undefined;
|
|
1318
1319
|
meta: object;
|
|
1319
1320
|
}>;
|
|
1321
|
+
listProjectsWithSearch: _trpc_server.TRPCQueryProcedure<{
|
|
1322
|
+
input: {
|
|
1323
|
+
searchTerm?: string | undefined;
|
|
1324
|
+
};
|
|
1325
|
+
output: {
|
|
1326
|
+
id: string;
|
|
1327
|
+
name: string;
|
|
1328
|
+
enabled: boolean;
|
|
1329
|
+
domain_id?: string | null | undefined;
|
|
1330
|
+
parent_id?: string | null | undefined;
|
|
1331
|
+
is_domain?: boolean | null | undefined;
|
|
1332
|
+
tags?: string[] | null | undefined;
|
|
1333
|
+
options?: Record<string, string | boolean> | null | undefined;
|
|
1334
|
+
description?: string | null | undefined;
|
|
1335
|
+
links?: {
|
|
1336
|
+
self?: string | null | undefined;
|
|
1337
|
+
} | undefined;
|
|
1338
|
+
domain_name?: string | undefined;
|
|
1339
|
+
parents?: {
|
|
1340
|
+
project: {
|
|
1341
|
+
id: string;
|
|
1342
|
+
name: string;
|
|
1343
|
+
enabled: boolean;
|
|
1344
|
+
domain_id?: string | null | undefined;
|
|
1345
|
+
parent_id?: string | null | undefined;
|
|
1346
|
+
is_domain?: boolean | null | undefined;
|
|
1347
|
+
tags?: string[] | null | undefined;
|
|
1348
|
+
options?: Record<string, string | boolean> | null | undefined;
|
|
1349
|
+
description?: string | null | undefined;
|
|
1350
|
+
links?: {
|
|
1351
|
+
self?: string | null | undefined;
|
|
1352
|
+
} | undefined;
|
|
1353
|
+
};
|
|
1354
|
+
}[] | undefined;
|
|
1355
|
+
}[] | undefined;
|
|
1356
|
+
meta: object;
|
|
1357
|
+
}>;
|
|
1320
1358
|
getProject: _trpc_server.TRPCQueryProcedure<{
|
|
1321
1359
|
input: {
|
|
1322
1360
|
projectId: string;
|
|
@@ -1515,7 +1553,11 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
|
|
|
1515
1553
|
tempUrlKey?: string | undefined;
|
|
1516
1554
|
tempUrlKey2?: string | undefined;
|
|
1517
1555
|
};
|
|
1518
|
-
output:
|
|
1556
|
+
output: {
|
|
1557
|
+
created: true;
|
|
1558
|
+
optionsApplied: boolean;
|
|
1559
|
+
optionsError?: string | undefined;
|
|
1560
|
+
};
|
|
1519
1561
|
meta: object;
|
|
1520
1562
|
}>;
|
|
1521
1563
|
getContainerMetadata: _trpc_server.TRPCQueryProcedure<{
|
|
@@ -1885,6 +1927,31 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
|
|
|
1885
1927
|
}[];
|
|
1886
1928
|
meta: object;
|
|
1887
1929
|
}>;
|
|
1930
|
+
head: _trpc_server.TRPCQueryProcedure<{
|
|
1931
|
+
input: {
|
|
1932
|
+
project_id: string;
|
|
1933
|
+
bucketName: string;
|
|
1934
|
+
};
|
|
1935
|
+
output: {
|
|
1936
|
+
exists: true;
|
|
1937
|
+
};
|
|
1938
|
+
meta: object;
|
|
1939
|
+
}>;
|
|
1940
|
+
getState: _trpc_server.TRPCQueryProcedure<{
|
|
1941
|
+
input: {
|
|
1942
|
+
project_id: string;
|
|
1943
|
+
bucketName: string;
|
|
1944
|
+
};
|
|
1945
|
+
output: {
|
|
1946
|
+
status: "Enabled" | "Suspended" | "Unversioned";
|
|
1947
|
+
isVersioningEnabled: boolean;
|
|
1948
|
+
isEmpty: boolean;
|
|
1949
|
+
hasOnlyDeleteMarkers: boolean;
|
|
1950
|
+
hasOldVersionsOrDeleteMarkers: boolean;
|
|
1951
|
+
isPartialScan: boolean;
|
|
1952
|
+
};
|
|
1953
|
+
meta: object;
|
|
1954
|
+
}>;
|
|
1888
1955
|
create: _trpc_server.TRPCMutationProcedure<{
|
|
1889
1956
|
input: {
|
|
1890
1957
|
project_id: string;
|
|
@@ -2051,6 +2118,24 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
|
|
|
2051
2118
|
};
|
|
2052
2119
|
meta: object;
|
|
2053
2120
|
}>;
|
|
2121
|
+
deleteNonCurrentVersions: _trpc_server.TRPCMutationProcedure<{
|
|
2122
|
+
input: {
|
|
2123
|
+
project_id: string;
|
|
2124
|
+
containerName: string;
|
|
2125
|
+
};
|
|
2126
|
+
output: {
|
|
2127
|
+
errors: {
|
|
2128
|
+
key: string;
|
|
2129
|
+
versionId?: string | undefined;
|
|
2130
|
+
code?: string | undefined;
|
|
2131
|
+
message?: string | undefined;
|
|
2132
|
+
}[];
|
|
2133
|
+
deletedCount: number;
|
|
2134
|
+
errorCount: number;
|
|
2135
|
+
isPartial: boolean;
|
|
2136
|
+
};
|
|
2137
|
+
meta: object;
|
|
2138
|
+
}>;
|
|
2054
2139
|
createFolder: _trpc_server.TRPCMutationProcedure<{
|
|
2055
2140
|
input: {
|
|
2056
2141
|
project_id: string;
|
|
@@ -2245,14 +2330,16 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
|
|
|
2245
2330
|
input: {
|
|
2246
2331
|
project_id: string;
|
|
2247
2332
|
bucket: string;
|
|
2248
|
-
|
|
2333
|
+
prefix?: string | undefined;
|
|
2334
|
+
folders?: string[] | undefined;
|
|
2249
2335
|
};
|
|
2250
2336
|
output: {
|
|
2251
2337
|
prefix: string;
|
|
2252
2338
|
hasDeletedContent: boolean;
|
|
2253
2339
|
isFolderDeleted: boolean;
|
|
2254
|
-
|
|
2255
|
-
|
|
2340
|
+
isPartialScan: boolean;
|
|
2341
|
+
folderDeleteMarkerVersionId?: string | undefined;
|
|
2342
|
+
folderMarkerVersionId?: string | undefined;
|
|
2256
2343
|
}[];
|
|
2257
2344
|
meta: object;
|
|
2258
2345
|
}>;
|
|
@@ -3194,6 +3281,16 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
|
|
|
3194
3281
|
output: string[];
|
|
3195
3282
|
meta: object;
|
|
3196
3283
|
}>;
|
|
3284
|
+
getComputeApiVersion: _trpc_server.TRPCQueryProcedure<{
|
|
3285
|
+
input: {
|
|
3286
|
+
project_id: string;
|
|
3287
|
+
};
|
|
3288
|
+
output: {
|
|
3289
|
+
version: string;
|
|
3290
|
+
supportsDescription: boolean;
|
|
3291
|
+
};
|
|
3292
|
+
meta: object;
|
|
3293
|
+
}>;
|
|
3197
3294
|
getFlavorById: _trpc_server.TRPCQueryProcedure<{
|
|
3198
3295
|
input: {
|
|
3199
3296
|
project_id: string;
|
|
@@ -3262,6 +3359,7 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
|
|
|
3262
3359
|
rxtx_factor?: number | undefined;
|
|
3263
3360
|
"OS-FLV-EXT-DATA:ephemeral"?: number | undefined;
|
|
3264
3361
|
"os-flavor-access:is_public"?: boolean | undefined;
|
|
3362
|
+
description?: string | undefined;
|
|
3265
3363
|
};
|
|
3266
3364
|
};
|
|
3267
3365
|
output: {
|