@cobaltcore-dev/aurora 0.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/LICENSE +201 -0
- package/README.md +141 -0
- package/dist/client/AuroraApp.d.ts +7 -0
- package/dist/client/AuthProvider-D-5Jpa6F.mjs +100 -0
- package/dist/client/AuthProvider-D-5Jpa6F.mjs.map +1 -0
- package/dist/client/ContentHeader-H8KGY3Wd.mjs +81 -0
- package/dist/client/ContentHeader-H8KGY3Wd.mjs.map +1 -0
- package/dist/client/DeleteFlavorModal-B98oiHWx.mjs +629 -0
- package/dist/client/DeleteFlavorModal-B98oiHWx.mjs.map +1 -0
- package/dist/client/EditSecurityGroupModal-wQVNIVg1.mjs +137 -0
- package/dist/client/EditSecurityGroupModal-wQVNIVg1.mjs.map +1 -0
- package/dist/client/FloatingIpActionModals-qu1NMI5a.mjs +417 -0
- package/dist/client/FloatingIpActionModals-qu1NMI5a.mjs.map +1 -0
- package/dist/client/ImageToastNotifications-wsQDNEh7.mjs +1267 -0
- package/dist/client/ImageToastNotifications-wsQDNEh7.mjs.map +1 -0
- package/dist/client/ListToolbar-CHlkZrpl.mjs +223 -0
- package/dist/client/ListToolbar-CHlkZrpl.mjs.map +1 -0
- package/dist/client/RouteError-BwgDIwJE.mjs +25 -0
- package/dist/client/RouteError-BwgDIwJE.mjs.map +1 -0
- package/dist/client/_auth-CsliQdkJ.mjs +11 -0
- package/dist/client/_auth-CsliQdkJ.mjs.map +1 -0
- package/dist/client/_flavorId-D_A53VYa.mjs +56 -0
- package/dist/client/_flavorId-D_A53VYa.mjs.map +1 -0
- package/dist/client/_flavorId-DbhYLFxY.mjs +190 -0
- package/dist/client/_flavorId-DbhYLFxY.mjs.map +1 -0
- package/dist/client/_floatingIpId-BGgftRBQ.mjs +21 -0
- package/dist/client/_floatingIpId-BGgftRBQ.mjs.map +1 -0
- package/dist/client/_floatingIpId-D5myuLFz.mjs +228 -0
- package/dist/client/_floatingIpId-D5myuLFz.mjs.map +1 -0
- package/dist/client/_imageId-BoHX155h.mjs +27 -0
- package/dist/client/_imageId-BoHX155h.mjs.map +1 -0
- package/dist/client/_imageId-CTa0c3Av.mjs +530 -0
- package/dist/client/_imageId-CTa0c3Av.mjs.map +1 -0
- package/dist/client/_pcaId-C7Lrv1H_.mjs +242 -0
- package/dist/client/_pcaId-C7Lrv1H_.mjs.map +1 -0
- package/dist/client/_pcaId-DBgz5V_9.mjs +21 -0
- package/dist/client/_pcaId-DBgz5V_9.mjs.map +1 -0
- package/dist/client/_projectId-B9fln31N.mjs +8 -0
- package/dist/client/_projectId-B9fln31N.mjs.map +1 -0
- package/dist/client/_projectId-Be1Erj68.mjs +300 -0
- package/dist/client/_projectId-Be1Erj68.mjs.map +1 -0
- package/dist/client/_projectId-C-E4NNgo.mjs +84 -0
- package/dist/client/_projectId-C-E4NNgo.mjs.map +1 -0
- package/dist/client/_projectId-INhedXor.mjs +26 -0
- package/dist/client/_projectId-INhedXor.mjs.map +1 -0
- package/dist/client/_securityGroupId-DQoRQ-yA.mjs +1647 -0
- package/dist/client/_securityGroupId-DQoRQ-yA.mjs.map +1 -0
- package/dist/client/_securityGroupId-ihjy8Lcd.mjs +21 -0
- package/dist/client/_securityGroupId-ihjy8Lcd.mjs.map +1 -0
- package/dist/client/about-oT6ccz8T.mjs +92 -0
- package/dist/client/about-oT6ccz8T.mjs.map +1 -0
- package/dist/client/aurora-D_NPTbo-.mjs +19 -0
- package/dist/client/aurora-D_NPTbo-.mjs.map +1 -0
- package/dist/client/build-eu9eg0zF.mjs +14619 -0
- package/dist/client/build-eu9eg0zF.mjs.map +1 -0
- package/dist/client/buildFilterParams-BDOIRDeD.mjs +15 -0
- package/dist/client/buildFilterParams-BDOIRDeD.mjs.map +1 -0
- package/dist/client/cn-C3laVXMm.mjs +10 -0
- package/dist/client/cn-C3laVXMm.mjs.map +1 -0
- package/dist/client/constants-ByHCdNsI.mjs +128 -0
- package/dist/client/constants-ByHCdNsI.mjs.map +1 -0
- package/dist/client/containers-B_ozmVlx.mjs +74 -0
- package/dist/client/containers-B_ozmVlx.mjs.map +1 -0
- package/dist/client/containers-Dx7TYruP.mjs +7 -0
- package/dist/client/containers-Dx7TYruP.mjs.map +1 -0
- package/dist/client/containers-rn_ntCJu.mjs +3029 -0
- package/dist/client/containers-rn_ntCJu.mjs.map +1 -0
- package/dist/client/flavors-CT4auvLO.mjs +565 -0
- package/dist/client/flavors-CT4auvLO.mjs.map +1 -0
- package/dist/client/flavors-DRZb9LJP.mjs +8 -0
- package/dist/client/flavors-DRZb9LJP.mjs.map +1 -0
- package/dist/client/flavors-DtgMd0Ii.mjs +12 -0
- package/dist/client/flavors-DtgMd0Ii.mjs.map +1 -0
- package/dist/client/floatingips-DG5cFJSZ.mjs +12 -0
- package/dist/client/floatingips-DG5cFJSZ.mjs.map +1 -0
- package/dist/client/floatingips-iCMR0ZiL.mjs +436 -0
- package/dist/client/floatingips-iCMR0ZiL.mjs.map +1 -0
- package/dist/client/formatBytes-GYujK0dP.mjs +38 -0
- package/dist/client/formatBytes-GYujK0dP.mjs.map +1 -0
- package/dist/client/helpers--JWXi40U.mjs +6 -0
- package/dist/client/helpers--JWXi40U.mjs.map +1 -0
- package/dist/client/hooks-s-I8vWww.mjs +2 -0
- package/dist/client/images-BTqRflJv2.mjs +1794 -0
- package/dist/client/images-BTqRflJv2.mjs.map +1 -0
- package/dist/client/images-DRTfx8k2.mjs +8 -0
- package/dist/client/images-DRTfx8k2.mjs.map +1 -0
- package/dist/client/images-xBfsjxkX.mjs +12 -0
- package/dist/client/images-xBfsjxkX.mjs.map +1 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1033 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/md-CI9FmfYv.mjs +390 -0
- package/dist/client/md-CI9FmfYv.mjs.map +1 -0
- package/dist/client/network-DFVVVNS5.mjs +8 -0
- package/dist/client/network-DFVVVNS5.mjs.map +1 -0
- package/dist/client/objects-CKk6cST_.mjs +4762 -0
- package/dist/client/objects-CKk6cST_.mjs.map +1 -0
- package/dist/client/objects-DkDKVSmQ.mjs +8 -0
- package/dist/client/objects-DkDKVSmQ.mjs.map +1 -0
- package/dist/client/objects-r_Vl31oj.mjs +80 -0
- package/dist/client/objects-r_Vl31oj.mjs.map +1 -0
- package/dist/client/overview-B7pXx6bt.mjs +173 -0
- package/dist/client/overview-B7pXx6bt.mjs.map +1 -0
- package/dist/client/overview-CKGLIu6W.mjs +12 -0
- package/dist/client/overview-CKGLIu6W.mjs.map +1 -0
- package/dist/client/overview-Ca8r3SAz.mjs +16 -0
- package/dist/client/overview-Ca8r3SAz.mjs.map +1 -0
- package/dist/client/overview-DkPM0Od5.mjs +12 -0
- package/dist/client/overview-DkPM0Od5.mjs.map +1 -0
- package/dist/client/overview-Dxm7Ef3X.mjs +12 -0
- package/dist/client/overview-Dxm7Ef3X.mjs.map +1 -0
- package/dist/client/overview-ag4Envez.mjs +16 -0
- package/dist/client/overview-ag4Envez.mjs.map +1 -0
- package/dist/client/pca-BGv7Mprl.mjs +12 -0
- package/dist/client/pca-BGv7Mprl.mjs.map +1 -0
- package/dist/client/pca-DpULpMu5.mjs +167 -0
- package/dist/client/pca-DpULpMu5.mjs.map +1 -0
- package/dist/client/projects-BuN69cxO.mjs +144 -0
- package/dist/client/projects-BuN69cxO.mjs.map +1 -0
- package/dist/client/projects-D1pP0XdA.mjs +12 -0
- package/dist/client/projects-D1pP0XdA.mjs.map +1 -0
- package/dist/client/projects-MbS1USl2.mjs +7 -0
- package/dist/client/projects-MbS1USl2.mjs.map +1 -0
- package/dist/client/projects-_Dfn6eQT.mjs +22 -0
- package/dist/client/projects-_Dfn6eQT.mjs.map +1 -0
- package/dist/client/securitygroups-DURjFfYK.mjs +12 -0
- package/dist/client/securitygroups-DURjFfYK.mjs.map +1 -0
- package/dist/client/securitygroups-KC2qvmH8.mjs +442 -0
- package/dist/client/securitygroups-KC2qvmH8.mjs.map +1 -0
- package/dist/client/trpcClient-BxguzNYF.mjs +57 -0
- package/dist/client/trpcClient-BxguzNYF.mjs.map +1 -0
- package/dist/client/useErrorTranslation-TZVwIAzq.mjs +83 -0
- package/dist/client/useErrorTranslation-TZVwIAzq.mjs.map +1 -0
- package/dist/client/useListWithFiltering-mMX_EfyI.mjs +32 -0
- package/dist/client/useListWithFiltering-mMX_EfyI.mjs.map +1 -0
- package/dist/client/useModal-Dg4CBeqL.mjs +12 -0
- package/dist/client/useModal-Dg4CBeqL.mjs.map +1 -0
- package/dist/client/useProjectId-BWaeJZOy.mjs +11 -0
- package/dist/client/useProjectId-BWaeJZOy.mjs.map +1 -0
- package/dist/server/index.d.ts +35 -0
- package/dist/server/index.js +36514 -0
- package/package.json +129 -0
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { $ as e, D as t, I as n, K as r, N as i, Q as a, W as o, a as s, b as c, g as l, i as u, it as d, j as f, k as p, n as m, q as h, rt as g, s as _, v, w as y, x as b } from "./build-eu9eg0zF.mjs";
|
|
2
|
+
import { r as x } from "./trpcClient-BxguzNYF.mjs";
|
|
3
|
+
import { t as S } from "./securitygroups-DURjFfYK.mjs";
|
|
4
|
+
import { t as C } from "./ListToolbar-CHlkZrpl.mjs";
|
|
5
|
+
import { t as w } from "./useProjectId-BWaeJZOy.mjs";
|
|
6
|
+
import "./hooks-s-I8vWww.mjs";
|
|
7
|
+
import { t as T } from "./buildFilterParams-BDOIRDeD.mjs";
|
|
8
|
+
import { t as E } from "./useListWithFiltering-mMX_EfyI.mjs";
|
|
9
|
+
import { t as D } from "./EditSecurityGroupModal-wQVNIVg1.mjs";
|
|
10
|
+
import { Fragment as O, jsx as k, jsxs as A } from "react/jsx-runtime";
|
|
11
|
+
import { useEffect as j, useRef as M, useState as N } from "react";
|
|
12
|
+
import { useNavigate as P } from "@tanstack/react-router";
|
|
13
|
+
import { Trans as F, useLingui as I } from "@lingui/react";
|
|
14
|
+
//#region src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/-modals/DeleteSecurityGroupDialog.tsx
|
|
15
|
+
var L = ({ isOpen: t, onClose: n, securityGroup: r, onDelete: i, isDeleting: a = !1, error: o = null }) => {
|
|
16
|
+
let { i18n: u, _: d } = I(), [f, p] = N(""), m = u._({ id: "HNlEFZ" }), h = f.toLowerCase() === m.toLowerCase(), g = r.name || r.id, y = (e) => {
|
|
17
|
+
e.preventDefault(), h && !a && i(r.id);
|
|
18
|
+
}, b = () => {
|
|
19
|
+
p(""), n();
|
|
20
|
+
};
|
|
21
|
+
return /* @__PURE__ */ k(_, {
|
|
22
|
+
open: t,
|
|
23
|
+
onCancel: b,
|
|
24
|
+
size: "small",
|
|
25
|
+
title: u._({
|
|
26
|
+
id: "Y+2SDm",
|
|
27
|
+
values: { securityGroupName: g }
|
|
28
|
+
}),
|
|
29
|
+
modalFooter: /* @__PURE__ */ k(s, {
|
|
30
|
+
className: "flex justify-end",
|
|
31
|
+
children: /* @__PURE__ */ A(v, { children: [/* @__PURE__ */ k(l, {
|
|
32
|
+
variant: "default",
|
|
33
|
+
onClick: b,
|
|
34
|
+
disabled: a,
|
|
35
|
+
children: /* @__PURE__ */ k(F, { id: "dEgA5A" })
|
|
36
|
+
}), /* @__PURE__ */ k(l, {
|
|
37
|
+
variant: "primary-danger",
|
|
38
|
+
onClick: y,
|
|
39
|
+
disabled: !h || a,
|
|
40
|
+
"data-testid": "confirm-delete-button",
|
|
41
|
+
children: a ? /* @__PURE__ */ k(F, { id: "EF2EU9" }) : /* @__PURE__ */ k(F, { id: "cnGeoo" })
|
|
42
|
+
})] })
|
|
43
|
+
}),
|
|
44
|
+
children: /* @__PURE__ */ A("div", { children: [
|
|
45
|
+
o && /* @__PURE__ */ k(c, {
|
|
46
|
+
dismissible: !1,
|
|
47
|
+
variant: "error",
|
|
48
|
+
className: "mt-4",
|
|
49
|
+
children: o
|
|
50
|
+
}),
|
|
51
|
+
/* @__PURE__ */ k(F, { id: "Qb+14I" }),
|
|
52
|
+
/* @__PURE__ */ A("div", {
|
|
53
|
+
className: "mt-4",
|
|
54
|
+
children: [/* @__PURE__ */ k("p", {
|
|
55
|
+
className: "mb-2 text-sm",
|
|
56
|
+
children: /* @__PURE__ */ k(F, {
|
|
57
|
+
id: "hLp49h",
|
|
58
|
+
values: { deleteWord: m },
|
|
59
|
+
components: { 0: /* @__PURE__ */ k("strong", {}) }
|
|
60
|
+
})
|
|
61
|
+
}), /* @__PURE__ */ k(e, {
|
|
62
|
+
id: "confirmation",
|
|
63
|
+
name: "confirmation",
|
|
64
|
+
value: f,
|
|
65
|
+
onChange: (e) => p(e.target.value),
|
|
66
|
+
placeholder: m,
|
|
67
|
+
disabled: a,
|
|
68
|
+
autoComplete: "off",
|
|
69
|
+
"data-testid": "delete-confirmation-input"
|
|
70
|
+
})]
|
|
71
|
+
})
|
|
72
|
+
] })
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
//#endregion
|
|
76
|
+
//#region src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupTableRow.tsx
|
|
77
|
+
function R({ securityGroup: e, permissions: t, onEdit: a, onDelete: o, onViewDetails: s, isReadOnly: c = !1 }) {
|
|
78
|
+
let { i18n: l, _: u } = I(), d = ({ value: e }) => /* @__PURE__ */ k("span", { children: e ? l._({ id: "l75CjT" }) : l._({ id: "1UzENP" }) }), f = () => {
|
|
79
|
+
s && s(e);
|
|
80
|
+
};
|
|
81
|
+
return /* @__PURE__ */ A(n, {
|
|
82
|
+
"data-testid": `security-group-row-${e.id}`,
|
|
83
|
+
onClick: f,
|
|
84
|
+
className: "hover:bg-theme-background-lvl-2 cursor-pointer",
|
|
85
|
+
children: [
|
|
86
|
+
/* @__PURE__ */ k(i, { children: /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("p", {
|
|
87
|
+
className: "text-md",
|
|
88
|
+
children: e.name
|
|
89
|
+
}), /* @__PURE__ */ k("p", {
|
|
90
|
+
className: "text-theme-light text-xs",
|
|
91
|
+
children: e.id
|
|
92
|
+
})] }) }),
|
|
93
|
+
/* @__PURE__ */ k(i, { children: e.description || l._({ id: "h47p9L" }) }),
|
|
94
|
+
/* @__PURE__ */ A(i, { children: [/* @__PURE__ */ k(d, { value: e.shared }), e.shared && /* @__PURE__ */ A("p", { children: [
|
|
95
|
+
/* @__PURE__ */ k(F, { id: "LtI9AS" }),
|
|
96
|
+
": ",
|
|
97
|
+
/* @__PURE__ */ k("span", {
|
|
98
|
+
className: "text-theme-light text-xs",
|
|
99
|
+
children: e.project_id
|
|
100
|
+
})
|
|
101
|
+
] })] }),
|
|
102
|
+
/* @__PURE__ */ k(i, { children: /* @__PURE__ */ k(d, { value: e.stateful }) }),
|
|
103
|
+
/* @__PURE__ */ k(i, {
|
|
104
|
+
onClick: (e) => e.stopPropagation(),
|
|
105
|
+
className: "items-end justify-end pr-0",
|
|
106
|
+
children: /* @__PURE__ */ k(m, { children: /* @__PURE__ */ A(g, { children: [
|
|
107
|
+
/* @__PURE__ */ k(r, {
|
|
108
|
+
label: l._({ id: "v0hPHE" }),
|
|
109
|
+
onClick: () => f()
|
|
110
|
+
}),
|
|
111
|
+
t.canUpdate && !c && /* @__PURE__ */ k(r, {
|
|
112
|
+
label: l._({ id: "ePK91l" }),
|
|
113
|
+
onClick: () => a(e)
|
|
114
|
+
}),
|
|
115
|
+
t.canDelete && !c && /* @__PURE__ */ k(r, {
|
|
116
|
+
label: l._({ id: "cnGeoo" }),
|
|
117
|
+
onClick: () => o(e)
|
|
118
|
+
})
|
|
119
|
+
] }) })
|
|
120
|
+
})
|
|
121
|
+
]
|
|
122
|
+
}, e.id);
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupListContainer.tsx
|
|
126
|
+
var z = ({ securityGroups: e, isLoading: t, isError: r, error: i, permissions: a, onDeleteSecurityGroup: s, isDeletingSecurityGroup: c = !1, deleteError: l = null, onUpdateSecurityGroup: u, isUpdatingSecurityGroup: f = !1, updateError: m = null, currentProjectId: g }) => {
|
|
127
|
+
let { i18n: _, _: v } = I(), y = P(), b = w(), [x, S] = N(null), [C, T] = N(!1), [E, z] = N(!1), B = M(!1), V = M(!1), H = (e) => {
|
|
128
|
+
S(e), T(!0);
|
|
129
|
+
}, U = (e) => {
|
|
130
|
+
S(e), z(!0);
|
|
131
|
+
}, W = (e) => {
|
|
132
|
+
y({
|
|
133
|
+
to: "/projects/$projectId/network/securitygroups/$securityGroupId",
|
|
134
|
+
params: {
|
|
135
|
+
projectId: b,
|
|
136
|
+
securityGroupId: e.id
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}, G = () => {
|
|
140
|
+
S(null), T(!1);
|
|
141
|
+
}, K = () => {
|
|
142
|
+
S(null), z(!1);
|
|
143
|
+
};
|
|
144
|
+
return j(() => {
|
|
145
|
+
B.current && !c && E && !l && K(), B.current = c;
|
|
146
|
+
}, [
|
|
147
|
+
c,
|
|
148
|
+
l,
|
|
149
|
+
E
|
|
150
|
+
]), j(() => {
|
|
151
|
+
V.current && !f && C && !m && G(), V.current = f;
|
|
152
|
+
}, [
|
|
153
|
+
f,
|
|
154
|
+
m,
|
|
155
|
+
C
|
|
156
|
+
]), t ? /* @__PURE__ */ A(h, {
|
|
157
|
+
className: "py-8",
|
|
158
|
+
distribution: "center",
|
|
159
|
+
alignment: "center",
|
|
160
|
+
direction: "vertical",
|
|
161
|
+
children: [/* @__PURE__ */ k(o, {
|
|
162
|
+
variant: "primary",
|
|
163
|
+
size: "large",
|
|
164
|
+
className: "mb-2"
|
|
165
|
+
}), /* @__PURE__ */ k(F, { id: "Z3FXyt" })]
|
|
166
|
+
}) : r ? /* @__PURE__ */ k(h, {
|
|
167
|
+
className: "py-8",
|
|
168
|
+
distribution: "center",
|
|
169
|
+
alignment: "center",
|
|
170
|
+
direction: "vertical",
|
|
171
|
+
children: i?.message ?? _._({ id: "Wca9WC" })
|
|
172
|
+
}) : e.length === 0 ? /* @__PURE__ */ k(F, { id: "SfW/3r" }) : /* @__PURE__ */ A(O, { children: [/* @__PURE__ */ A(p, {
|
|
173
|
+
columns: 5,
|
|
174
|
+
children: [/* @__PURE__ */ k(n, { children: [
|
|
175
|
+
_._({ id: "6YtxFj" }),
|
|
176
|
+
_._({ id: "Nu4oKW" }),
|
|
177
|
+
_._({ id: "0Gd0NU" }),
|
|
178
|
+
_._({ id: "Jim5X9" }),
|
|
179
|
+
""
|
|
180
|
+
].map((e) => /* @__PURE__ */ k(d, { children: e }, e)) }), e.map((e) => /* @__PURE__ */ k(R, {
|
|
181
|
+
securityGroup: e,
|
|
182
|
+
permissions: a,
|
|
183
|
+
onEdit: H,
|
|
184
|
+
onDelete: U,
|
|
185
|
+
onViewDetails: W,
|
|
186
|
+
isReadOnly: !!(g && e.project_id && e.project_id !== g)
|
|
187
|
+
}, e.id))]
|
|
188
|
+
}), x && /* @__PURE__ */ A(O, { children: [/* @__PURE__ */ k(D, {
|
|
189
|
+
securityGroup: x,
|
|
190
|
+
open: C,
|
|
191
|
+
onClose: G,
|
|
192
|
+
onUpdate: async (e, t) => {
|
|
193
|
+
u && await u(e, t);
|
|
194
|
+
},
|
|
195
|
+
isLoading: f,
|
|
196
|
+
error: m
|
|
197
|
+
}), /* @__PURE__ */ k(L, {
|
|
198
|
+
securityGroup: x,
|
|
199
|
+
isOpen: E,
|
|
200
|
+
onClose: K,
|
|
201
|
+
onDelete: (e) => {
|
|
202
|
+
s && s(e);
|
|
203
|
+
},
|
|
204
|
+
isDeleting: c,
|
|
205
|
+
error: l
|
|
206
|
+
})] })] });
|
|
207
|
+
}, B = {
|
|
208
|
+
name: "",
|
|
209
|
+
description: "",
|
|
210
|
+
stateful: !0
|
|
211
|
+
}, V = ({ isOpen: n, onClose: r, onCreate: i, isLoading: d = !1, error: p = null }) => {
|
|
212
|
+
let { i18n: m, _: h } = I(), [g, y] = N({ ...B }), [x, S] = N({}), C = (e) => {
|
|
213
|
+
let { name: t, value: n, type: r } = e.target, i = e.target.checked;
|
|
214
|
+
y((e) => ({
|
|
215
|
+
...e,
|
|
216
|
+
[t]: r === "checkbox" ? i : n
|
|
217
|
+
})), x[t] && S((e) => {
|
|
218
|
+
let n = { ...e };
|
|
219
|
+
return delete n[t], n;
|
|
220
|
+
});
|
|
221
|
+
}, w = () => {
|
|
222
|
+
let e = {};
|
|
223
|
+
return (!g.name || g.name.trim() === "") && (e.name = m._({ id: "lN/Z9n" })), S(e), Object.keys(e).length === 0;
|
|
224
|
+
}, T = async (e) => {
|
|
225
|
+
e.preventDefault(), w() && (await i({
|
|
226
|
+
name: g.name.trim(),
|
|
227
|
+
description: g.description.trim() || void 0,
|
|
228
|
+
stateful: g.stateful
|
|
229
|
+
}), E());
|
|
230
|
+
}, E = () => {
|
|
231
|
+
y({ ...B }), S({}), r();
|
|
232
|
+
};
|
|
233
|
+
return /* @__PURE__ */ A(_, {
|
|
234
|
+
open: n,
|
|
235
|
+
onCancel: E,
|
|
236
|
+
size: "large",
|
|
237
|
+
title: m._({ id: "YjAOtb" }),
|
|
238
|
+
modalFooter: /* @__PURE__ */ k(s, {
|
|
239
|
+
className: "flex justify-end",
|
|
240
|
+
children: /* @__PURE__ */ A(v, { children: [/* @__PURE__ */ k(l, {
|
|
241
|
+
variant: "default",
|
|
242
|
+
onClick: E,
|
|
243
|
+
disabled: d,
|
|
244
|
+
children: /* @__PURE__ */ k(F, { id: "dEgA5A" })
|
|
245
|
+
}), /* @__PURE__ */ k(l, {
|
|
246
|
+
variant: "primary",
|
|
247
|
+
onClick: (e) => {
|
|
248
|
+
T(e);
|
|
249
|
+
},
|
|
250
|
+
disabled: d,
|
|
251
|
+
"data-testid": "create-security-group-button",
|
|
252
|
+
children: d ? /* @__PURE__ */ k(o, { size: "small" }) : /* @__PURE__ */ k(F, { id: "YjAOtb" })
|
|
253
|
+
})] })
|
|
254
|
+
}),
|
|
255
|
+
children: [
|
|
256
|
+
p && /* @__PURE__ */ k(c, {
|
|
257
|
+
dismissible: !1,
|
|
258
|
+
variant: "error",
|
|
259
|
+
className: "mb-4",
|
|
260
|
+
children: p
|
|
261
|
+
}),
|
|
262
|
+
d && /* @__PURE__ */ A("div", {
|
|
263
|
+
className: "mb-4 flex items-center justify-center gap-2",
|
|
264
|
+
children: [/* @__PURE__ */ k(o, { variant: "primary" }), /* @__PURE__ */ k("span", {
|
|
265
|
+
className: "text-theme-high text-sm",
|
|
266
|
+
children: /* @__PURE__ */ k(F, { id: "Km4AGG" })
|
|
267
|
+
})]
|
|
268
|
+
}),
|
|
269
|
+
!d && /* @__PURE__ */ k(t, {
|
|
270
|
+
className: "mb-6",
|
|
271
|
+
children: /* @__PURE__ */ A(u, {
|
|
272
|
+
className: "mb-6",
|
|
273
|
+
children: [
|
|
274
|
+
/* @__PURE__ */ k(f, {
|
|
275
|
+
className: "mb-6",
|
|
276
|
+
children: /* @__PURE__ */ k(e, {
|
|
277
|
+
id: "name",
|
|
278
|
+
name: "name",
|
|
279
|
+
label: m._({ id: "6YtxFj" }),
|
|
280
|
+
value: g.name,
|
|
281
|
+
onChange: C,
|
|
282
|
+
required: !0,
|
|
283
|
+
errortext: x.name,
|
|
284
|
+
placeholder: m._({ id: "Ac6dy9" }),
|
|
285
|
+
disabled: d
|
|
286
|
+
})
|
|
287
|
+
}),
|
|
288
|
+
/* @__PURE__ */ k(f, {
|
|
289
|
+
className: "mb-6",
|
|
290
|
+
children: /* @__PURE__ */ k(b, {
|
|
291
|
+
id: "description",
|
|
292
|
+
name: "description",
|
|
293
|
+
label: m._({ id: "Nu4oKW" }),
|
|
294
|
+
value: g.description,
|
|
295
|
+
onChange: C,
|
|
296
|
+
placeholder: m._({ id: "Nu4oKW" }),
|
|
297
|
+
disabled: d,
|
|
298
|
+
rows: 3
|
|
299
|
+
})
|
|
300
|
+
}),
|
|
301
|
+
/* @__PURE__ */ k(f, {
|
|
302
|
+
className: "mb-0",
|
|
303
|
+
children: /* @__PURE__ */ k(a, {
|
|
304
|
+
id: "stateful",
|
|
305
|
+
name: "stateful",
|
|
306
|
+
label: m._({ id: "Jim5X9" }),
|
|
307
|
+
checked: g.stateful,
|
|
308
|
+
onChange: C,
|
|
309
|
+
disabled: d
|
|
310
|
+
})
|
|
311
|
+
})
|
|
312
|
+
]
|
|
313
|
+
})
|
|
314
|
+
})
|
|
315
|
+
]
|
|
316
|
+
});
|
|
317
|
+
}, H = {
|
|
318
|
+
TRUE: "true",
|
|
319
|
+
FALSE: "false"
|
|
320
|
+
}, U = () => {
|
|
321
|
+
let { i18n: e, _: t } = I(), n = P(), r = w(), [i, a] = N(!1), [o, s] = N(null), [c, u] = N(null), [d, f] = N(null), { searchTerm: p, sortSettings: m, filterSettings: h, handleSearchChange: g, handleSortChange: _, handleFilterChange: v } = E({
|
|
322
|
+
defaultSortKey: "name",
|
|
323
|
+
defaultSortDir: "asc",
|
|
324
|
+
sortOptions: [{
|
|
325
|
+
label: e._({ id: "6YtxFj" }),
|
|
326
|
+
value: "name"
|
|
327
|
+
}, {
|
|
328
|
+
label: e._({ id: "podzPY" }),
|
|
329
|
+
value: "project_id"
|
|
330
|
+
}],
|
|
331
|
+
filterSettings: { filters: [{
|
|
332
|
+
displayName: e._({ id: "0Gd0NU" }),
|
|
333
|
+
filterName: "shared",
|
|
334
|
+
values: Object.values(H),
|
|
335
|
+
supportsMultiValue: !1
|
|
336
|
+
}] }
|
|
337
|
+
}), y = x.useUtils(), b = {
|
|
338
|
+
canCreate: !0,
|
|
339
|
+
canUpdate: !0,
|
|
340
|
+
canDelete: !0,
|
|
341
|
+
canManageAccess: !0
|
|
342
|
+
}, { data: S = [], isLoading: D, isError: O, error: j } = x.network.securityGroup.list.useQuery({
|
|
343
|
+
project_id: r || "",
|
|
344
|
+
sort_key: m.sortBy,
|
|
345
|
+
sort_dir: m.sortDirection,
|
|
346
|
+
...T(h),
|
|
347
|
+
...p ? { searchTerm: p } : {}
|
|
348
|
+
}, { enabled: !!r }), M = x.network.securityGroup.create.useMutation({
|
|
349
|
+
onSuccess: (e) => {
|
|
350
|
+
y.network.securityGroup.list.invalidate(), u(null), n({
|
|
351
|
+
to: "/projects/$projectId/network/securitygroups/$securityGroupId",
|
|
352
|
+
params: {
|
|
353
|
+
projectId: r,
|
|
354
|
+
securityGroupId: e.id
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
},
|
|
358
|
+
onError: (t) => {
|
|
359
|
+
u(t.message || e._({ id: "o6M6l0" }));
|
|
360
|
+
}
|
|
361
|
+
}), L = x.network.securityGroup.deleteById.useMutation({
|
|
362
|
+
onSuccess: () => {
|
|
363
|
+
y.network.securityGroup.list.invalidate(), s(null);
|
|
364
|
+
},
|
|
365
|
+
onError: (t) => {
|
|
366
|
+
s(t.message || e._({ id: "d0pLfy" }));
|
|
367
|
+
}
|
|
368
|
+
}), R = x.network.securityGroup.update.useMutation({
|
|
369
|
+
onSuccess: () => {
|
|
370
|
+
y.network.securityGroup.list.invalidate(), f(null);
|
|
371
|
+
},
|
|
372
|
+
onError: (t) => {
|
|
373
|
+
f(t.message || e._({ id: "jPxavx" }));
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
return /* @__PURE__ */ A("div", {
|
|
377
|
+
className: "relative",
|
|
378
|
+
children: [
|
|
379
|
+
/* @__PURE__ */ k(C, {
|
|
380
|
+
sortSettings: m,
|
|
381
|
+
filterSettings: h,
|
|
382
|
+
searchTerm: p,
|
|
383
|
+
onSort: _,
|
|
384
|
+
onFilter: v,
|
|
385
|
+
onSearch: g,
|
|
386
|
+
actions: b.canCreate && /* @__PURE__ */ k(l, {
|
|
387
|
+
onClick: () => a(!0),
|
|
388
|
+
variant: "primary",
|
|
389
|
+
children: /* @__PURE__ */ k(F, { id: "YjAOtb" })
|
|
390
|
+
})
|
|
391
|
+
}),
|
|
392
|
+
/* @__PURE__ */ k(z, {
|
|
393
|
+
securityGroups: S,
|
|
394
|
+
isLoading: D,
|
|
395
|
+
isError: O,
|
|
396
|
+
error: j,
|
|
397
|
+
permissions: b,
|
|
398
|
+
onCreateClick: () => a(!0),
|
|
399
|
+
onDeleteSecurityGroup: (e) => {
|
|
400
|
+
s(null), L.mutate({
|
|
401
|
+
project_id: r,
|
|
402
|
+
securityGroupId: e
|
|
403
|
+
});
|
|
404
|
+
},
|
|
405
|
+
isDeletingSecurityGroup: L.isPending,
|
|
406
|
+
deleteError: o,
|
|
407
|
+
onUpdateSecurityGroup: async (e, t) => {
|
|
408
|
+
f(null), await R.mutateAsync({
|
|
409
|
+
project_id: r,
|
|
410
|
+
securityGroupId: e,
|
|
411
|
+
...t
|
|
412
|
+
});
|
|
413
|
+
},
|
|
414
|
+
isUpdatingSecurityGroup: R.isPending,
|
|
415
|
+
updateError: d,
|
|
416
|
+
currentProjectId: r
|
|
417
|
+
}),
|
|
418
|
+
/* @__PURE__ */ k(V, {
|
|
419
|
+
isOpen: i,
|
|
420
|
+
onClose: () => a(!1),
|
|
421
|
+
onCreate: async (e) => {
|
|
422
|
+
u(null), await M.mutateAsync({
|
|
423
|
+
project_id: r,
|
|
424
|
+
...e
|
|
425
|
+
});
|
|
426
|
+
},
|
|
427
|
+
isLoading: M.isPending,
|
|
428
|
+
error: c
|
|
429
|
+
})
|
|
430
|
+
]
|
|
431
|
+
});
|
|
432
|
+
};
|
|
433
|
+
//#endregion
|
|
434
|
+
//#region src/client/routes/_auth/projects/$projectId/network/securitygroups/index.tsx?tsr-split=component
|
|
435
|
+
function W() {
|
|
436
|
+
let { i18n: e, _: t } = I(), { setPageTitle: n } = S.useRouteContext();
|
|
437
|
+
return n(e._({ id: "4opp4r" })), /* @__PURE__ */ A(O, { children: [/* @__PURE__ */ k(y, { children: e._({ id: "4opp4r" }) }), /* @__PURE__ */ k(U, {})] });
|
|
438
|
+
}
|
|
439
|
+
//#endregion
|
|
440
|
+
export { W as component };
|
|
441
|
+
|
|
442
|
+
//# sourceMappingURL=securitygroups-KC2qvmH8.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securitygroups-KC2qvmH8.mjs","names":["React","useState","Modal","Button","ModalFooter","ButtonRow","Message","TextInput","DeleteSecurityGroupDialog","isOpen","onClose","securityGroup","onDelete","isDeleting","error","useLingui","confirmationText","setConfirmationText","deleteWord","t","isDeleteEnabled","toLowerCase","securityGroupName","name","id","handleDelete","e","preventDefault","handleClose","open","onCancel","size","title","modalFooter","className","variant","onClick","disabled","data-testid","div","dismissible","p","strong","value","onChange","target","placeholder","autoComplete","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","SecurityGroupTableRow","securityGroup","sg","permissions","onEdit","onDelete","onViewDetails","isReadOnly","useLingui","BooleanValue","value","span","t","handleShowDetails","data-testid","id","onClick","className","div","p","name","description","shared","project_id","stateful","e","stopPropagation","label","canUpdate","canDelete","useState","useEffect","useRef","DataGrid","DataGridHeadCell","DataGridRow","Stack","Spinner","useNavigate","useProjectId","EditSecurityGroupModal","DeleteSecurityGroupDialog","SecurityGroupTableRow","SecurityGroupListContainer","securityGroups","isLoading","isError","error","permissions","onDeleteSecurityGroup","isDeletingSecurityGroup","deleteError","onUpdateSecurityGroup","isUpdatingSecurityGroup","updateError","currentProjectId","useLingui","navigate","projectId","selectedSecurityGroup","setSelectedSecurityGroup","editModalOpen","setEditModalOpen","deleteDialogOpen","setDeleteDialogOpen","prevIsDeletingRef","prevIsUpdatingRef","handleEdit","sg","handleDelete","handleViewDetails","to","params","securityGroupId","id","closeEditModal","closeDeleteDialog","deletionJustFinished","current","updateJustFinished","className","distribution","alignment","direction","variant","size","message","t","length","columns","map","label","isReadOnly","Boolean","project_id","securityGroup","onEdit","onDelete","onViewDetails","open","onClose","onUpdate","data","isOpen","isDeleting","React","useState","Modal","Form","FormRow","FormSection","TextInput","Checkbox","Button","ButtonRow","Spinner","ModalFooter","Textarea","Message","defaultSecurityGroupValues","name","description","stateful","CreateSecurityGroupModal","isOpen","onClose","onCreate","isLoading","error","useLingui","properties","setProperties","errors","setErrors","handleInputChange","e","value","type","target","checked","prev","newErrors","validateForm","trim","t","Object","keys","length","handleSubmit","preventDefault","securityGroupData","undefined","handleClose","open","onCancel","size","title","modalFooter","className","variant","onClick","disabled","data-testid","dismissible","div","span","id","label","onChange","required","errortext","placeholder","rows","useState","useNavigate","Button","trpcReact","ListToolbar","buildFilterParams","useListWithFiltering","useProjectId","SecurityGroupListContainer","CreateSecurityGroupModal","SECURITY_GROUP_SHARED","TRUE","FALSE","SecurityGroups","useLingui","navigate","projectId","createModalOpen","setCreateModalOpen","deleteError","setDeleteError","createError","setCreateError","updateError","setUpdateError","searchTerm","sortSettings","filterSettings","handleSearchChange","handleSortChange","handleFilterChange","defaultSortKey","defaultSortDir","sortOptions","label","t","value","filters","displayName","filterName","values","Object","supportsMultiValue","utils","useUtils","permissions","canCreate","canUpdate","canDelete","canManageAccess","data","securityGroups","isLoading","isError","error","network","securityGroup","list","useQuery","project_id","sort_key","sortBy","sort_dir","sortDirection","enabled","createSecurityGroupMutation","create","useMutation","onSuccess","createdSecurityGroup","invalidate","to","params","securityGroupId","id","onError","message","deleteSecurityGroupMutation","deleteById","updateSecurityGroupMutation","update","handleCreateSecurityGroup","securityGroupData","mutateAsync","handleDeleteSecurityGroup","mutate","handleUpdateSecurityGroup","div","className","onSort","onFilter","onSearch","actions","onClick","variant","onCreateClick","onDeleteSecurityGroup","isDeletingSecurityGroup","isPending","onUpdateSecurityGroup","isUpdatingSecurityGroup","currentProjectId","isOpen","onClose","onCreate","useLingui","SecurityGroups","ContentHeading","Route","RouteComponent","t","setPageTitle","useRouteContext","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/-modals/DeleteSecurityGroupDialog.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/-modals/CreateSecurityGroupModal.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupsList.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/index.tsx?tsr-split=component"],"sourcesContent":["import React, { useState } from \"react\"\nimport { Modal, Button, ModalFooter, ButtonRow, Message, TextInput } from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\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 const [confirmationText, setConfirmationText] = useState(\"\")\n\n const deleteWord = t`delete`\n const isDeleteEnabled = confirmationText.toLowerCase() === deleteWord.toLowerCase()\n const securityGroupName = securityGroup.name || securityGroup.id\n\n const handleDelete = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault()\n if (isDeleteEnabled && !isDeleting) {\n onDelete(securityGroup.id)\n }\n }\n\n const handleClose = () => {\n setConfirmationText(\"\")\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 modalFooter={\n <ModalFooter className=\"flex justify-end\">\n <ButtonRow>\n <Button variant=\"default\" onClick={handleClose} disabled={isDeleting}>\n <Trans>Cancel</Trans>\n </Button>\n <Button\n variant=\"primary-danger\"\n onClick={handleDelete}\n disabled={!isDeleteEnabled || isDeleting}\n data-testid=\"confirm-delete-button\"\n >\n {isDeleting ? <Trans>Deleting...</Trans> : <Trans>Delete</Trans>}\n </Button>\n </ButtonRow>\n </ModalFooter>\n }\n >\n <div>\n {/* Error Message */}\n {error && (\n <Message dismissible={false} variant=\"error\" className=\"mt-4\">\n {error}\n </Message>\n )}\n\n {/* Warning */}\n <Trans>This action cannot be undone. The security group will be permanently deleted.</Trans>\n\n {/* Confirmation Input */}\n <div className=\"mt-4\">\n <p className=\"mb-2 text-sm\">\n <Trans>\n Type <strong>{deleteWord}</strong> to confirm:\n </Trans>\n </p>\n <TextInput\n id=\"confirmation\"\n name=\"confirmation\"\n value={confirmationText}\n onChange={(e) => setConfirmationText(e.target.value)}\n placeholder={deleteWord}\n disabled={isDeleting}\n autoComplete=\"off\"\n data-testid=\"delete-confirmation-input\"\n />\n </div>\n </div>\n </Modal>\n )\n}\n","import {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { useLingui, Trans } from \"@lingui/react/macro\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\n\nexport interface SecurityGroupPermissions {\n canCreate: boolean\n canUpdate: boolean\n canDelete: boolean\n canManageAccess: boolean\n}\n\ninterface SecurityGroupTableRowProps {\n securityGroup: SecurityGroup\n permissions: SecurityGroupPermissions\n onEdit: (sg: SecurityGroup) => void\n onDelete: (sg: SecurityGroup) => void\n onViewDetails?: (sg: SecurityGroup) => void\n isReadOnly?: boolean\n}\n\nexport function SecurityGroupTableRow({\n securityGroup: sg,\n permissions,\n onEdit,\n onDelete,\n onViewDetails,\n isReadOnly = false,\n}: SecurityGroupTableRowProps) {\n const { t } = useLingui()\n\n const BooleanValue = ({ value }: { value: boolean | undefined }) => <span>{value ? t`Yes` : t`No`}</span>\n\n const handleShowDetails = () => {\n if (onViewDetails) {\n onViewDetails(sg)\n }\n }\n\n return (\n <DataGridRow\n key={sg.id}\n data-testid={`security-group-row-${sg.id}`}\n onClick={handleShowDetails}\n className=\"hover:bg-theme-background-lvl-2 cursor-pointer\"\n >\n <DataGridCell>\n <div>\n <p className=\"text-md\">{sg.name}</p>\n <p className=\"text-theme-light text-xs\">{sg.id}</p>\n </div>\n </DataGridCell>\n <DataGridCell>{sg.description || t`—`}</DataGridCell>\n <DataGridCell>\n <BooleanValue value={sg.shared} />\n {sg.shared && (\n <p>\n <Trans>Owner</Trans>: <span className=\"text-theme-light text-xs\">{sg.project_id}</span>\n </p>\n )}\n </DataGridCell>\n <DataGridCell>\n <BooleanValue value={sg.stateful} />\n </DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end justify-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={() => handleShowDetails()} />\n {permissions.canUpdate && !isReadOnly && <PopupMenuItem label={t`Edit`} onClick={() => onEdit(sg)} />}\n {permissions.canDelete && !isReadOnly && <PopupMenuItem label={t`Delete`} onClick={() => onDelete(sg)} />}\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { useState, useEffect, useRef } from \"react\"\nimport { DataGrid, DataGridHeadCell, DataGridRow, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { useProjectId } from \"@/client/hooks\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\nimport type { UpdateSecurityGroupInput } from \"@/server/Network/types/securityGroup\"\nimport { EditSecurityGroupModal } from \"./-modals/EditSecurityGroupModal\"\nimport { DeleteSecurityGroupDialog } from \"./-modals/DeleteSecurityGroupDialog\"\nimport { SecurityGroupTableRow, type SecurityGroupPermissions } from \"./SecurityGroupTableRow\"\n\ninterface SecurityGroupListContainerProps {\n securityGroups: SecurityGroup[]\n isLoading: boolean\n isError: boolean\n error: { message?: string } | null\n permissions: SecurityGroupPermissions\n onCreateClick?: () => void\n onDeleteSecurityGroup?: (securityGroupId: string) => void\n isDeletingSecurityGroup?: boolean\n deleteError?: string | null\n onUpdateSecurityGroup?: (\n securityGroupId: string,\n data: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\">\n ) => void\n isUpdatingSecurityGroup?: boolean\n updateError?: string | null\n currentProjectId?: string\n}\n\nexport const SecurityGroupListContainer = ({\n securityGroups,\n isLoading,\n isError,\n error,\n permissions,\n onDeleteSecurityGroup,\n isDeletingSecurityGroup = false,\n deleteError = null,\n onUpdateSecurityGroup,\n isUpdatingSecurityGroup = false,\n updateError = null,\n currentProjectId,\n}: SecurityGroupListContainerProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const [selectedSecurityGroup, setSelectedSecurityGroup] = useState<SecurityGroup | null>(null)\n const [editModalOpen, setEditModalOpen] = useState(false)\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false)\n const prevIsDeletingRef = useRef<boolean>(false)\n const prevIsUpdatingRef = useRef<boolean>(false)\n\n const handleEdit = (sg: SecurityGroup) => {\n setSelectedSecurityGroup(sg)\n setEditModalOpen(true)\n }\n\n const handleDelete = (sg: SecurityGroup) => {\n setSelectedSecurityGroup(sg)\n setDeleteDialogOpen(true)\n }\n\n const handleViewDetails = (sg: SecurityGroup) => {\n navigate({\n to: \"/projects/$projectId/network/securitygroups/$securityGroupId\",\n params: { projectId, securityGroupId: sg.id },\n })\n }\n\n const closeEditModal = () => {\n setSelectedSecurityGroup(null)\n setEditModalOpen(false)\n }\n\n const closeDeleteDialog = () => {\n setSelectedSecurityGroup(null)\n setDeleteDialogOpen(false)\n }\n\n // Close delete dialog when deletion completes successfully\n useEffect(() => {\n // Check if deletion just finished (was deleting before, now not deleting)\n const deletionJustFinished = prevIsDeletingRef.current && !isDeletingSecurityGroup\n\n // Close dialog if deletion just finished and there's no error\n if (deletionJustFinished && deleteDialogOpen && !deleteError) {\n closeDeleteDialog()\n }\n\n // Update the ref for next render\n prevIsDeletingRef.current = isDeletingSecurityGroup\n }, [isDeletingSecurityGroup, deleteError, deleteDialogOpen])\n\n // Close edit modal when update completes successfully\n useEffect(() => {\n // Check if update just finished (was updating before, now not updating)\n const updateJustFinished = prevIsUpdatingRef.current && !isUpdatingSecurityGroup\n\n // Close modal if update just finished and there's no error\n if (updateJustFinished && editModalOpen && !updateError) {\n closeEditModal()\n }\n\n // Update the ref for next render\n prevIsUpdatingRef.current = isUpdatingSecurityGroup\n }, [isUpdatingSecurityGroup, updateError, editModalOpen])\n\n // Loading state\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 // Error state\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load security groups`}\n </Stack>\n )\n }\n\n // Empty state\n if (securityGroups.length === 0) {\n return <Trans>There are no groups</Trans>\n }\n\n return (\n <>\n <DataGrid columns={5}>\n <DataGridRow>\n {[t`Name`, t`Description`, t`Shared`, t`Stateful`, \"\"].map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {securityGroups.map((sg) => {\n // Compute isReadOnly only when the security group has an explicit project owner\n const isReadOnly = Boolean(currentProjectId && sg.project_id && sg.project_id !== currentProjectId)\n\n return (\n <SecurityGroupTableRow\n key={sg.id}\n securityGroup={sg}\n permissions={permissions}\n onEdit={handleEdit}\n onDelete={handleDelete}\n onViewDetails={handleViewDetails}\n isReadOnly={isReadOnly}\n />\n )\n })}\n </DataGrid>\n\n {selectedSecurityGroup && (\n <>\n <EditSecurityGroupModal\n securityGroup={selectedSecurityGroup}\n open={editModalOpen}\n onClose={closeEditModal}\n onUpdate={async (id, data) => {\n if (onUpdateSecurityGroup) {\n await onUpdateSecurityGroup(id, data)\n }\n }}\n isLoading={isUpdatingSecurityGroup}\n error={updateError}\n />\n <DeleteSecurityGroupDialog\n securityGroup={selectedSecurityGroup}\n isOpen={deleteDialogOpen}\n onClose={closeDeleteDialog}\n onDelete={(id) => {\n if (onDeleteSecurityGroup) {\n onDeleteSecurityGroup(id)\n }\n }}\n isDeleting={isDeletingSecurityGroup}\n error={deleteError}\n />\n </>\n )}\n </>\n )\n}\n","import React, { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormRow,\n FormSection,\n TextInput,\n Checkbox,\n Button,\n ButtonRow,\n Spinner,\n ModalFooter,\n Textarea,\n Message,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CreateSecurityGroupInput } from \"@/server/Network/types/securityGroup\"\n\ninterface CreateSecurityGroupModalProps {\n isOpen: boolean\n onClose: () => void\n onCreate: (securityGroupData: Omit<CreateSecurityGroupInput, \"project_id\">) => Promise<void>\n isLoading?: boolean\n error?: string | null\n}\n\ninterface SecurityGroupProperties {\n name: string\n description: string\n stateful: boolean\n}\n\nconst defaultSecurityGroupValues: SecurityGroupProperties = {\n name: \"\",\n description: \"\",\n stateful: true,\n}\n\nexport const CreateSecurityGroupModal: React.FC<CreateSecurityGroupModalProps> = ({\n isOpen,\n onClose,\n onCreate,\n isLoading = false,\n error = null,\n}) => {\n const { t } = useLingui()\n\n const [properties, setProperties] = useState<SecurityGroupProperties>({ ...defaultSecurityGroupValues })\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\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 const securityGroupData: Omit<CreateSecurityGroupInput, \"project_id\"> = {\n name: properties.name.trim(),\n description: properties.description.trim() || undefined,\n stateful: properties.stateful,\n }\n\n await onCreate(securityGroupData)\n handleClose()\n }\n\n const handleClose = () => {\n setProperties({ ...defaultSecurityGroupValues })\n setErrors({})\n onClose()\n }\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n size=\"large\"\n title={t`Create 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=\"create-security-group-button\"\n >\n {isLoading ? <Spinner size=\"small\" /> : <Trans>Create 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 && (\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 security group...</Trans>\n </span>\n </div>\n )}\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\n <FormRow className=\"mb-0\">\n <Checkbox\n id=\"stateful\"\n name=\"stateful\"\n label={t`Stateful`}\n checked={properties.stateful}\n onChange={handleInputChange}\n disabled={isLoading}\n />\n </FormRow>\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { ListToolbar } from \"@/client/components/ListToolbar\"\nimport { buildFilterParams } from \"@/client/utils/buildFilterParams\"\nimport { useListWithFiltering } from \"@/client/utils/useListWithFiltering\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { SecurityGroupListContainer } from \"./SecurityGroupListContainer\"\nimport { CreateSecurityGroupModal } from \"./-modals/CreateSecurityGroupModal\"\nimport { CreateSecurityGroupInput, UpdateSecurityGroupInput } from \"@/server/Network/types/securityGroup\"\n\n// Security group shared filter constants\nconst SECURITY_GROUP_SHARED = {\n TRUE: \"true\",\n FALSE: \"false\",\n} as const\n\ntype SecurityGroupSortKey = \"name\" | \"project_id\"\n\nexport const SecurityGroups = () => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n\n const [createModalOpen, setCreateModalOpen] = useState(false)\n const [deleteError, setDeleteError] = useState<string | null>(null)\n const [createError, setCreateError] = useState<string | null>(null)\n const [updateError, setUpdateError] = useState<string | null>(null)\n\n const { searchTerm, sortSettings, filterSettings, handleSearchChange, handleSortChange, handleFilterChange } =\n useListWithFiltering<SecurityGroupSortKey>({\n defaultSortKey: \"name\",\n defaultSortDir: \"asc\",\n sortOptions: [\n { label: t`Name`, value: \"name\" },\n { label: t`Project id`, value: \"project_id\" },\n ],\n filterSettings: {\n filters: [\n {\n displayName: t`Shared`,\n filterName: \"shared\",\n values: Object.values(SECURITY_GROUP_SHARED),\n supportsMultiValue: false,\n },\n ],\n },\n })\n\n const utils = trpcReact.useUtils()\n\n // TODO: replace with trpc.network.canUser when security group permissions are available\n const permissions = {\n canCreate: true,\n canUpdate: true,\n canDelete: true,\n canManageAccess: true,\n }\n\n const {\n data: securityGroups = [],\n isLoading,\n isError,\n error,\n } = trpcReact.network.securityGroup.list.useQuery(\n {\n project_id: projectId || \"\",\n sort_key: sortSettings.sortBy,\n sort_dir: sortSettings.sortDirection,\n ...buildFilterParams(filterSettings),\n ...(searchTerm ? { searchTerm } : {}),\n },\n {\n enabled: !!projectId,\n }\n )\n\n const createSecurityGroupMutation = trpcReact.network.securityGroup.create.useMutation({\n onSuccess: (createdSecurityGroup) => {\n // Invalidate and refetch the security groups list\n utils.network.securityGroup.list.invalidate()\n setCreateError(null)\n\n // Navigate to the details page of the newly created security group\n navigate({\n to: \"/projects/$projectId/network/securitygroups/$securityGroupId\",\n params: {\n projectId,\n securityGroupId: createdSecurityGroup.id,\n },\n })\n },\n onError: (error) => {\n // Backend handles error parsing, just display the message\n setCreateError(error.message || t`Failed to create security group`)\n },\n })\n\n const deleteSecurityGroupMutation = trpcReact.network.securityGroup.deleteById.useMutation({\n onSuccess: () => {\n // Invalidate and refetch the security groups list\n utils.network.securityGroup.list.invalidate()\n setDeleteError(null)\n },\n onError: (error) => {\n // Backend handles error parsing, just display the message\n setDeleteError(error.message || t`Failed to delete security group`)\n },\n })\n\n const updateSecurityGroupMutation = trpcReact.network.securityGroup.update.useMutation({\n onSuccess: () => {\n // Invalidate and refetch the security groups list\n utils.network.securityGroup.list.invalidate()\n setUpdateError(null)\n },\n onError: (error) => {\n // Backend handles error parsing, just display the message\n setUpdateError(error.message || t`Failed to update security group`)\n },\n })\n\n const handleCreateSecurityGroup = async (securityGroupData: Omit<CreateSecurityGroupInput, \"project_id\">) => {\n setCreateError(null)\n await createSecurityGroupMutation.mutateAsync({ project_id: projectId, ...securityGroupData })\n }\n\n const handleDeleteSecurityGroup = (securityGroupId: string) => {\n setDeleteError(null)\n deleteSecurityGroupMutation.mutate({ project_id: projectId, securityGroupId })\n }\n\n const handleUpdateSecurityGroup = async (\n securityGroupId: string,\n data: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\">\n ) => {\n setUpdateError(null)\n await updateSecurityGroupMutation.mutateAsync({ project_id: projectId, securityGroupId, ...data })\n }\n\n return (\n <div className=\"relative\">\n <ListToolbar\n sortSettings={sortSettings}\n filterSettings={filterSettings}\n searchTerm={searchTerm}\n onSort={handleSortChange}\n onFilter={handleFilterChange}\n onSearch={handleSearchChange}\n actions={\n permissions.canCreate && (\n <Button onClick={() => setCreateModalOpen(true)} variant=\"primary\">\n <Trans>Create Security Group</Trans>\n </Button>\n )\n }\n />\n\n <SecurityGroupListContainer\n securityGroups={securityGroups}\n isLoading={isLoading}\n isError={isError}\n error={error}\n permissions={permissions}\n onCreateClick={() => setCreateModalOpen(true)}\n onDeleteSecurityGroup={handleDeleteSecurityGroup}\n isDeletingSecurityGroup={deleteSecurityGroupMutation.isPending}\n deleteError={deleteError}\n onUpdateSecurityGroup={handleUpdateSecurityGroup}\n isUpdatingSecurityGroup={updateSecurityGroupMutation.isPending}\n updateError={updateError}\n currentProjectId={projectId}\n />\n\n <CreateSecurityGroupModal\n isOpen={createModalOpen}\n onClose={() => setCreateModalOpen(false)}\n onCreate={handleCreateSecurityGroup}\n isLoading={createSecurityGroupMutation.isPending}\n error={createError}\n />\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { SecurityGroups } from \"./-components/SecurityGroupsList\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/securitygroups/\")({\n staticData: { section: \"network\", service: \"securitygroups\" } satisfies RouteInfo,\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { setPageTitle } = Route.useRouteContext()\n setPageTitle(t`Security Groups`)\n return (\n <>\n <ContentHeading>{t`Security Groups`}</ContentHeading>\n <SecurityGroups />\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createTRPCReact as e } from "@trpc/react-query";
|
|
2
|
+
import { createTRPCClient as t, httpBatchLink as n, httpBatchStreamLink as r, httpLink as i, httpSubscriptionLink as a, isNonJsonSerializable as o, splitLink as s } from "@trpc/client";
|
|
3
|
+
//#region src/client/trpcClient.ts
|
|
4
|
+
var c = async () => {
|
|
5
|
+
try {
|
|
6
|
+
let { csrfToken: e } = await fetch("/csrf-token").then((e) => e.json());
|
|
7
|
+
return { "x-csrf-token": e };
|
|
8
|
+
} catch (e) {
|
|
9
|
+
return console.error("Failed to fetch CSRF token:", e), {};
|
|
10
|
+
}
|
|
11
|
+
}, l = new Set(["storage.swift.downloadObject"]), u = "/polaris-bff";
|
|
12
|
+
function d(e) {
|
|
13
|
+
u = e;
|
|
14
|
+
}
|
|
15
|
+
var f = () => [s({
|
|
16
|
+
condition: (e) => e.type === "subscription",
|
|
17
|
+
true: a({
|
|
18
|
+
url: u,
|
|
19
|
+
eventSourceOptions: async () => ({ headers: await c() })
|
|
20
|
+
}),
|
|
21
|
+
false: s({
|
|
22
|
+
condition: (e) => o(e.input),
|
|
23
|
+
true: i({
|
|
24
|
+
url: u,
|
|
25
|
+
async headers({ op: e }) {
|
|
26
|
+
let t = await c(), n = e.context?.headers ?? {};
|
|
27
|
+
return {
|
|
28
|
+
...t,
|
|
29
|
+
...n
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}),
|
|
33
|
+
false: s({
|
|
34
|
+
condition: (e) => l.has(e.path),
|
|
35
|
+
true: r({
|
|
36
|
+
url: u,
|
|
37
|
+
async headers() {
|
|
38
|
+
return c();
|
|
39
|
+
}
|
|
40
|
+
}),
|
|
41
|
+
false: n({
|
|
42
|
+
url: u,
|
|
43
|
+
async headers() {
|
|
44
|
+
return c();
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
})], p = e(), m = null, h = null, g = new Proxy({}, { get(e, t) {
|
|
50
|
+
return m ||= p.createClient({ links: f() }), m[t];
|
|
51
|
+
} }), _ = new Proxy({}, { get(e, n) {
|
|
52
|
+
return h ||= t({ links: f() }), h[n];
|
|
53
|
+
} });
|
|
54
|
+
//#endregion
|
|
55
|
+
export { g as i, _ as n, p as r, d as t };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=trpcClient-BxguzNYF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trpcClient-BxguzNYF.mjs","names":["createTRPCReact","createTRPCClient","httpBatchLink","httpBatchStreamLink","httpLink","splitLink","isNonJsonSerializable","httpSubscriptionLink","getCsrfHeaders","csrfToken","fetch","then","res","json","error","console","STREAMING_PROCEDURES","Set","_bffEndpoint","setBffEndpoint","endpoint","getLinks","condition","op","type","true","url","eventSourceOptions","headers","false","input","csrf","extra","context","has","path","trpcReact","_trpcReactClient","_trpcClient","trpcReactClient","Proxy","get","_target","prop","createClient","links","trpcClient"],"sources":["../../src/client/trpcClient.ts"],"sourcesContent":["import { createTRPCReact } from \"@trpc/react-query\"\nimport {\n createTRPCClient,\n httpBatchLink,\n httpBatchStreamLink,\n httpLink,\n splitLink,\n isNonJsonSerializable,\n httpSubscriptionLink,\n} from \"@trpc/client\"\nimport type { AuroraRouter } from \"../server/routers\"\n\n// CSRF headers factory\nconst getCsrfHeaders = async () => {\n try {\n const { csrfToken } = await fetch(\"/csrf-token\").then((res) => res.json())\n return {\n \"x-csrf-token\": csrfToken,\n }\n } catch (error) {\n console.error(\"Failed to fetch CSRF token:\", error)\n return {}\n }\n}\n\n// Procedures that return async iterables (chunked streaming responses).\n// These are routed through httpBatchStreamLink instead of httpBatchLink.\n// Add any new streaming procedure paths here.\nconst STREAMING_PROCEDURES = new Set<string>([\"storage.swift.downloadObject\"])\n\n// Mutable endpoint — set once by App before any tRPC calls are made.\nlet _bffEndpoint = \"/polaris-bff\"\n\nexport function setBffEndpoint(endpoint: string) {\n _bffEndpoint = endpoint\n}\n\nconst getLinks = () => [\n splitLink({\n // First check: is it a subscription?\n condition: (op) => op.type === \"subscription\",\n // Use HTTP subscription link for subscriptions (long-polling)\n true: httpSubscriptionLink({\n url: _bffEndpoint,\n // Callback to populate headers\n eventSourceOptions: async () => {\n return { headers: await getCsrfHeaders() }\n },\n }),\n // For non-subscriptions, check for non-JSON data or streaming procedures\n false: splitLink({\n // Non-JSON serializable input (FormData, Blob, ArrayBuffer, etc.) → plain httpLink.\n condition: (op) => isNonJsonSerializable(op.input),\n true: httpLink({\n url: _bffEndpoint,\n async headers({ op }) {\n const csrf = await getCsrfHeaders()\n // Per-request headers can be injected via tRPC operation context.\n // op.context is set by the caller and forwarded through the link chain.\n const extra = (op.context as { headers?: Record<string, string> } | undefined)?.headers ?? {}\n return { ...csrf, ...extra }\n },\n }),\n // For JSON procedures, decide between streaming and regular batching\n false: splitLink({\n // Procedures returning async iterables must use httpBatchStreamLink.\n // httpBatchLink buffers the full response before resolving, which\n // breaks streaming. httpBatchStreamLink preserves batching while\n // supporting chunked/streamed responses.\n // Note: httpBatchStreamLink is intentionally NOT used globally because\n // it is incompatible with the @fastify/csrf-protection cookie rotation\n // used in this app — CSRF tokens can expire mid-stream on long-lived\n // connections. Scope it only to procedures that actually need streaming.\n condition: (op) => STREAMING_PROCEDURES.has(op.path),\n true: httpBatchStreamLink({\n url: _bffEndpoint,\n async headers() {\n return getCsrfHeaders()\n },\n }),\n // Regular JSON mutations/queries — standard batching\n false: httpBatchLink({\n url: _bffEndpoint,\n async headers() {\n return getCsrfHeaders()\n },\n }),\n }),\n }),\n }),\n]\n\n// React Query client (for hooks like useQuery/useMutation/useSubscription)\nexport const trpcReact = createTRPCReact<AuroraRouter>()\n\nlet _trpcReactClient: ReturnType<typeof trpcReact.createClient> | null = null\nlet _trpcClient: ReturnType<typeof createTRPCClient<AuroraRouter>> | null = null\n\n// Lazily initialised — created on first access after setBffEndpoint() has been called by App.\nexport const trpcReactClient = new Proxy({} as ReturnType<typeof trpcReact.createClient>, {\n get(_target, prop) {\n if (!_trpcReactClient) {\n _trpcReactClient = trpcReact.createClient({ links: getLinks() })\n }\n return (_trpcReactClient as Record<string | symbol, unknown>)[prop]\n },\n})\n\nexport const trpcClient = new Proxy({} as ReturnType<typeof createTRPCClient<AuroraRouter>>, {\n get(_target, prop) {\n if (!_trpcClient) {\n _trpcClient = createTRPCClient<AuroraRouter>({ links: getLinks() })\n }\n return (_trpcClient as Record<string | symbol, unknown>)[prop]\n },\n})\n\nexport type TrpcReact = typeof trpcReact\nexport type TrpcClient = typeof trpcClient\n"],"mappings":";;;AAaA,IAAMQ,IAAiB,YAAA;AACrB,KAAI;EACF,IAAM,EAAEC,iBAAc,MAAMC,MAAM,cAAA,CAAeC,MAAMC,MAAQA,EAAIC,MAAI,CAAA;AACvE,SAAO,EACL,gBAAgBJ,GAClB;UACOK,GAAO;AAEd,SADAC,QAAQD,MAAM,+BAA+BA,EAAAA,EACtC,EAAC;;GAONE,IAAuB,IAAIC,IAAY,CAAC,+BAA+B,CAAA,EAGzEC,IAAe;AAEnB,SAAgBC,EAAeC,GAAgB;AAC7CF,KAAeE;;AAGjB,IAAMC,UAAiB,CACrBhB,EAAU;CAERiB,YAAYC,MAAOA,EAAGC,SAAS;CAE/BC,MAAMlB,EAAqB;EACzBmB,KAAKR;EAELS,oBAAoB,aACX,EAAEC,SAAS,MAAMpB,GAAAA,EAAiB;EAE7C,CAAA;CAEAqB,OAAOxB,EAAU;EAEfiB,YAAYC,MAAOjB,EAAsBiB,EAAGO,MAAK;EACjDL,MAAMrB,EAAS;GACbsB,KAAKR;GACL,MAAMU,QAAQ,EAAEL,SAAI;IAClB,IAAMQ,IAAO,MAAMvB,GAAAA,EAGbwB,IAAQ,EAAIC,SAA8DL,WAAW,EAAC;AAC5F,WAAO;KAAE,GAAGG;KAAM,GAAGC;KAAM;;GAE/B,CAAA;EAEAH,OAAOxB,EAAU;GASfiB,YAAYC,MAAOP,EAAqBkB,IAAIX,EAAGY,KAAI;GACnDV,MAAMtB,EAAoB;IACxBuB,KAAKR;IACL,MAAMU,UAAAA;AACJ,YAAOpB,GAAAA;;IAEX,CAAA;GAEAqB,OAAO3B,EAAc;IACnBwB,KAAKR;IACL,MAAMU,UAAAA;AACJ,YAAOpB,GAAAA;;IAEX,CAAA;GACF,CAAA;EACF,CAAA;CACF,CAAA,CACD,EAGY4B,IAAYpC,GAAAA,EAErBqC,IAAqE,MACrEC,IAAwE,MAG/DC,IAAkB,IAAIC,MAAM,EAAC,EAAgD,EACxFC,IAAIC,GAASC,GAAI;AAIf,QAHA,AACEN,MAAmBD,EAAUQ,aAAa,EAAEC,OAAOxB,GAAAA,EAAW,CAAA,EAEzD,EAAuDsB;GAElE,CAAA,EAEaG,IAAa,IAAIN,MAAM,EAAC,EAAwD,EAC3FC,IAAIC,GAASC,GAAI;AAIf,QAHA,AACEL,MAAcrC,EAA+B,EAAE4C,OAAOxB,GAAAA,EAAW,CAAA,EAE5D,EAAkDsB;GAE7D,CAAA"}
|