@cobaltcore-dev/aurora 0.2.0 → 0.2.2

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.
Files changed (175) hide show
  1. package/dist/client/{ContentHeader-H8KGY3Wd.mjs → ContentHeader-DtBiIwRY.mjs} +15 -15
  2. package/dist/client/{ContentHeader-H8KGY3Wd.mjs.map → ContentHeader-DtBiIwRY.mjs.map} +1 -1
  3. package/dist/client/{DeleteFlavorModal-B98oiHWx.mjs → DeleteFlavorModal-rmuYIafD.mjs} +142 -142
  4. package/dist/client/{DeleteFlavorModal-B98oiHWx.mjs.map → DeleteFlavorModal-rmuYIafD.mjs.map} +1 -1
  5. package/dist/client/{EditSecurityGroupModal-wQVNIVg1.mjs → EditSecurityGroupModal-B7Sz9puM.mjs} +15 -15
  6. package/dist/client/{EditSecurityGroupModal-wQVNIVg1.mjs.map → EditSecurityGroupModal-B7Sz9puM.mjs.map} +1 -1
  7. package/dist/client/{FloatingIpActionModals-qu1NMI5a.mjs → FloatingIpActionModals-CfRJiZqD.mjs} +59 -59
  8. package/dist/client/{FloatingIpActionModals-qu1NMI5a.mjs.map → FloatingIpActionModals-CfRJiZqD.mjs.map} +1 -1
  9. package/dist/client/{ImageToastNotifications-wsQDNEh7.mjs → ImageToastNotifications-Cw30RXsw.mjs} +374 -374
  10. package/dist/client/{ImageToastNotifications-wsQDNEh7.mjs.map → ImageToastNotifications-Cw30RXsw.mjs.map} +1 -1
  11. package/dist/client/{ListToolbar-CHlkZrpl.mjs → ListToolbar-DuazvsAu.mjs} +61 -61
  12. package/dist/client/{ListToolbar-CHlkZrpl.mjs.map → ListToolbar-DuazvsAu.mjs.map} +1 -1
  13. package/dist/client/{RouteError-BwgDIwJE.mjs → RouteError-Cyto623-.mjs} +2 -2
  14. package/dist/client/{RouteError-BwgDIwJE.mjs.map → RouteError-Cyto623-.mjs.map} +1 -1
  15. package/dist/client/{_auth-CsliQdkJ.mjs → _auth-CJj1Cnbm.mjs} +1 -1
  16. package/dist/client/{_auth-CsliQdkJ.mjs.map → _auth-CJj1Cnbm.mjs.map} +1 -1
  17. package/dist/client/_flavorId-B-1fYadl.mjs +188 -0
  18. package/dist/client/_flavorId-B-1fYadl.mjs.map +1 -0
  19. package/dist/client/{_flavorId-D_A53VYa.mjs → _flavorId-BYfIHIV_.mjs} +20 -10
  20. package/dist/client/_flavorId-BYfIHIV_.mjs.map +1 -0
  21. package/dist/client/_floatingIpId-FQ5P2qMV.mjs +228 -0
  22. package/dist/client/_floatingIpId-FQ5P2qMV.mjs.map +1 -0
  23. package/dist/client/{_floatingIpId-BGgftRBQ.mjs → _floatingIpId-IrnN-ozB.mjs} +13 -3
  24. package/dist/client/_floatingIpId-IrnN-ozB.mjs.map +1 -0
  25. package/dist/client/_imageId-Tx_9bqEc.mjs +527 -0
  26. package/dist/client/_imageId-Tx_9bqEc.mjs.map +1 -0
  27. package/dist/client/{_pcaId-DBgz5V_9.mjs → _pcaId-Bck7S7gJ.mjs} +16 -3
  28. package/dist/client/_pcaId-Bck7S7gJ.mjs.map +1 -0
  29. package/dist/client/_pcaId-CFuKY82d.mjs +369 -0
  30. package/dist/client/_pcaId-CFuKY82d.mjs.map +1 -0
  31. package/dist/client/{_projectId-INhedXor.mjs → _projectId-B1VjDd0Z.mjs} +3 -3
  32. package/dist/client/{_projectId-INhedXor.mjs.map → _projectId-B1VjDd0Z.mjs.map} +1 -1
  33. package/dist/client/_projectId-Bs4W9hos.mjs +283 -0
  34. package/dist/client/_projectId-Bs4W9hos.mjs.map +1 -0
  35. package/dist/client/{_projectId-C-E4NNgo.mjs → _projectId-PSpuCKO7.mjs} +9 -9
  36. package/dist/client/{_projectId-C-E4NNgo.mjs.map → _projectId-PSpuCKO7.mjs.map} +1 -1
  37. package/dist/client/{_projectId-B9fln31N.mjs → _projectId-Pxp-RXK4.mjs} +2 -2
  38. package/dist/client/{_projectId-B9fln31N.mjs.map → _projectId-Pxp-RXK4.mjs.map} +1 -1
  39. package/dist/client/{_securityGroupId-DQoRQ-yA.mjs → _securityGroupId-Dqi6ddw4.mjs} +499 -499
  40. package/dist/client/_securityGroupId-Dqi6ddw4.mjs.map +1 -0
  41. package/dist/client/{_securityGroupId-ihjy8Lcd.mjs → _securityGroupId-VV2lUcGQ.mjs} +16 -3
  42. package/dist/client/_securityGroupId-VV2lUcGQ.mjs.map +1 -0
  43. package/dist/client/{about-oT6ccz8T.mjs → about-B2AzqxFI.mjs} +8 -8
  44. package/dist/client/{about-oT6ccz8T.mjs.map → about-B2AzqxFI.mjs.map} +1 -1
  45. package/dist/client/{aurora-D_NPTbo-.mjs → aurora-CRcxVUCo.mjs} +1 -1
  46. package/dist/client/{aurora-D_NPTbo-.mjs.map → aurora-CRcxVUCo.mjs.map} +1 -1
  47. package/dist/client/{build-eu9eg0zF.mjs → build-Cf7iWbpH.mjs} +2727 -2646
  48. package/dist/client/build-Cf7iWbpH.mjs.map +1 -0
  49. package/dist/client/{buildFilterParams-BDOIRDeD.mjs → buildFilterParams-ngVK3ybs.mjs} +1 -1
  50. package/dist/client/{buildFilterParams-BDOIRDeD.mjs.map → buildFilterParams-ngVK3ybs.mjs.map} +1 -1
  51. package/dist/client/{constants-ByHCdNsI.mjs → constants-CCgR6fKI.mjs} +15 -15
  52. package/dist/client/{constants-ByHCdNsI.mjs.map → constants-CCgR6fKI.mjs.map} +1 -1
  53. package/dist/client/{containers-rn_ntCJu.mjs → containers-BWERuY0O.mjs} +978 -976
  54. package/dist/client/containers-BWERuY0O.mjs.map +1 -0
  55. package/dist/client/{containers-Dx7TYruP.mjs → containers-Cs5vOeR2.mjs} +1 -1
  56. package/dist/client/{containers-Dx7TYruP.mjs.map → containers-Cs5vOeR2.mjs.map} +1 -1
  57. package/dist/client/{containers-B_ozmVlx.mjs → containers-DovytjVP.mjs} +6 -3
  58. package/dist/client/containers-DovytjVP.mjs.map +1 -0
  59. package/dist/client/{flavors-DRZb9LJP.mjs → flavors-BXPYAFyQ.mjs} +1 -1
  60. package/dist/client/flavors-BXPYAFyQ.mjs.map +1 -0
  61. package/dist/client/{flavors-CT4auvLO.mjs → flavors-Bovz-I2U.mjs} +137 -137
  62. package/dist/client/flavors-Bovz-I2U.mjs.map +1 -0
  63. package/dist/client/flavors-CUiALHcB.mjs +16 -0
  64. package/dist/client/flavors-CUiALHcB.mjs.map +1 -0
  65. package/dist/client/floatingips-BrjDiY2t.mjs +435 -0
  66. package/dist/client/floatingips-BrjDiY2t.mjs.map +1 -0
  67. package/dist/client/{formatBytes-GYujK0dP.mjs → formatBytes-D6oa0wU9.mjs} +1 -1
  68. package/dist/client/{formatBytes-GYujK0dP.mjs.map → formatBytes-D6oa0wU9.mjs.map} +1 -1
  69. package/dist/client/{hooks-s-I8vWww.mjs → hooks-D0krAKvo.mjs} +1 -1
  70. package/dist/client/images-BZP3pBqj.mjs +16 -0
  71. package/dist/client/images-BZP3pBqj.mjs.map +1 -0
  72. package/dist/client/{images-DRTfx8k2.mjs → images-DM9I8G0p.mjs} +1 -1
  73. package/dist/client/images-DM9I8G0p.mjs.map +1 -0
  74. package/dist/client/{images-BTqRflJv2.mjs → images-DaaCUXMI.mjs} +413 -410
  75. package/dist/client/images-DaaCUXMI.mjs.map +1 -0
  76. package/dist/client/index.js +494 -414
  77. package/dist/client/index.js.map +1 -1
  78. package/dist/client/{md-CI9FmfYv.mjs → md-BivyCkGC.mjs} +1 -1
  79. package/dist/client/{md-CI9FmfYv.mjs.map → md-BivyCkGC.mjs.map} +1 -1
  80. package/dist/client/{network-DFVVVNS5.mjs → network-SCVadZsv.mjs} +1 -1
  81. package/dist/client/{network-DFVVVNS5.mjs.map → network-SCVadZsv.mjs.map} +1 -1
  82. package/dist/client/{objects-DkDKVSmQ.mjs → objects-B4yrYf_a.mjs} +1 -1
  83. package/dist/client/objects-B4yrYf_a.mjs.map +1 -0
  84. package/dist/client/objects-Cw4Vu01M.mjs +4760 -0
  85. package/dist/client/objects-Cw4Vu01M.mjs.map +1 -0
  86. package/dist/client/{objects-r_Vl31oj.mjs → objects-D4zBka5e.mjs} +9 -3
  87. package/dist/client/objects-D4zBka5e.mjs.map +1 -0
  88. package/dist/client/overview-2J54-loz.mjs +15 -0
  89. package/dist/client/overview-2J54-loz.mjs.map +1 -0
  90. package/dist/client/{overview-B7pXx6bt.mjs → overview-BnmukbFh.mjs} +5 -5
  91. package/dist/client/overview-BnmukbFh.mjs.map +1 -0
  92. package/dist/client/overview-BtIXpYBo.mjs +15 -0
  93. package/dist/client/overview-BtIXpYBo.mjs.map +1 -0
  94. package/dist/client/overview-D0AAvsmL.mjs +15 -0
  95. package/dist/client/overview-D0AAvsmL.mjs.map +1 -0
  96. package/dist/client/pca-BqZycwCu.mjs +16 -0
  97. package/dist/client/pca-BqZycwCu.mjs.map +1 -0
  98. package/dist/client/pca-V2aaOxZA.mjs +167 -0
  99. package/dist/client/pca-V2aaOxZA.mjs.map +1 -0
  100. package/dist/client/{projects-_Dfn6eQT.mjs → projects-0feOw_b6.mjs} +2 -2
  101. package/dist/client/{projects-_Dfn6eQT.mjs.map → projects-0feOw_b6.mjs.map} +1 -1
  102. package/dist/client/{projects-MbS1USl2.mjs → projects-BsN4bvU2.mjs} +1 -1
  103. package/dist/client/{projects-MbS1USl2.mjs.map → projects-BsN4bvU2.mjs.map} +1 -1
  104. package/dist/client/{projects-BuN69cxO.mjs → projects-C1IYOvFQ.mjs} +29 -29
  105. package/dist/client/{projects-BuN69cxO.mjs.map → projects-C1IYOvFQ.mjs.map} +1 -1
  106. package/dist/client/{projects-D1pP0XdA.mjs → projects-jyIHL6DE.mjs} +2 -2
  107. package/dist/client/{projects-D1pP0XdA.mjs.map → projects-jyIHL6DE.mjs.map} +1 -1
  108. package/dist/client/securitygroups-B4MkSBtI.mjs +441 -0
  109. package/dist/client/securitygroups-B4MkSBtI.mjs.map +1 -0
  110. package/dist/client/trpcClient-BxguzNYF.mjs.map +1 -1
  111. package/dist/client/{useListWithFiltering-mMX_EfyI.mjs → useListWithFiltering-CEDh1LO-.mjs} +1 -1
  112. package/dist/client/{useListWithFiltering-mMX_EfyI.mjs.map → useListWithFiltering-CEDh1LO-.mjs.map} +1 -1
  113. package/dist/client/{useModal-Dg4CBeqL.mjs → useModal-DxxlilRm.mjs} +1 -1
  114. package/dist/client/{useModal-Dg4CBeqL.mjs.map → useModal-DxxlilRm.mjs.map} +1 -1
  115. package/dist/client/{useProjectId-BWaeJZOy.mjs → useProjectId-CgOTejka.mjs} +1 -1
  116. package/dist/client/{useProjectId-BWaeJZOy.mjs.map → useProjectId-CgOTejka.mjs.map} +1 -1
  117. package/dist/server/index.js +624 -306
  118. package/package.json +8 -7
  119. package/permission_policies/compute.yaml +975 -0
  120. package/permission_policies/image.yaml +71 -0
  121. package/dist/client/_flavorId-D_A53VYa.mjs.map +0 -1
  122. package/dist/client/_flavorId-DbhYLFxY.mjs +0 -190
  123. package/dist/client/_flavorId-DbhYLFxY.mjs.map +0 -1
  124. package/dist/client/_floatingIpId-BGgftRBQ.mjs.map +0 -1
  125. package/dist/client/_floatingIpId-D5myuLFz.mjs +0 -228
  126. package/dist/client/_floatingIpId-D5myuLFz.mjs.map +0 -1
  127. package/dist/client/_imageId-BoHX155h.mjs +0 -27
  128. package/dist/client/_imageId-BoHX155h.mjs.map +0 -1
  129. package/dist/client/_imageId-CTa0c3Av.mjs +0 -530
  130. package/dist/client/_imageId-CTa0c3Av.mjs.map +0 -1
  131. package/dist/client/_pcaId-C7Lrv1H_.mjs +0 -242
  132. package/dist/client/_pcaId-C7Lrv1H_.mjs.map +0 -1
  133. package/dist/client/_pcaId-DBgz5V_9.mjs.map +0 -1
  134. package/dist/client/_projectId-Be1Erj68.mjs +0 -300
  135. package/dist/client/_projectId-Be1Erj68.mjs.map +0 -1
  136. package/dist/client/_securityGroupId-DQoRQ-yA.mjs.map +0 -1
  137. package/dist/client/_securityGroupId-ihjy8Lcd.mjs.map +0 -1
  138. package/dist/client/build-eu9eg0zF.mjs.map +0 -1
  139. package/dist/client/containers-B_ozmVlx.mjs.map +0 -1
  140. package/dist/client/containers-rn_ntCJu.mjs.map +0 -1
  141. package/dist/client/flavors-CT4auvLO.mjs.map +0 -1
  142. package/dist/client/flavors-DRZb9LJP.mjs.map +0 -1
  143. package/dist/client/flavors-DtgMd0Ii.mjs +0 -12
  144. package/dist/client/flavors-DtgMd0Ii.mjs.map +0 -1
  145. package/dist/client/floatingips-DG5cFJSZ.mjs +0 -12
  146. package/dist/client/floatingips-DG5cFJSZ.mjs.map +0 -1
  147. package/dist/client/floatingips-iCMR0ZiL.mjs +0 -436
  148. package/dist/client/floatingips-iCMR0ZiL.mjs.map +0 -1
  149. package/dist/client/images-BTqRflJv2.mjs.map +0 -1
  150. package/dist/client/images-DRTfx8k2.mjs.map +0 -1
  151. package/dist/client/images-xBfsjxkX.mjs +0 -12
  152. package/dist/client/images-xBfsjxkX.mjs.map +0 -1
  153. package/dist/client/objects-CKk6cST_.mjs +0 -4762
  154. package/dist/client/objects-CKk6cST_.mjs.map +0 -1
  155. package/dist/client/objects-DkDKVSmQ.mjs.map +0 -1
  156. package/dist/client/objects-r_Vl31oj.mjs.map +0 -1
  157. package/dist/client/overview-B7pXx6bt.mjs.map +0 -1
  158. package/dist/client/overview-CKGLIu6W.mjs +0 -12
  159. package/dist/client/overview-CKGLIu6W.mjs.map +0 -1
  160. package/dist/client/overview-Ca8r3SAz.mjs +0 -16
  161. package/dist/client/overview-Ca8r3SAz.mjs.map +0 -1
  162. package/dist/client/overview-DkPM0Od5.mjs +0 -12
  163. package/dist/client/overview-DkPM0Od5.mjs.map +0 -1
  164. package/dist/client/overview-Dxm7Ef3X.mjs +0 -12
  165. package/dist/client/overview-Dxm7Ef3X.mjs.map +0 -1
  166. package/dist/client/overview-ag4Envez.mjs +0 -16
  167. package/dist/client/overview-ag4Envez.mjs.map +0 -1
  168. package/dist/client/pca-BGv7Mprl.mjs +0 -12
  169. package/dist/client/pca-BGv7Mprl.mjs.map +0 -1
  170. package/dist/client/pca-DpULpMu5.mjs +0 -167
  171. package/dist/client/pca-DpULpMu5.mjs.map +0 -1
  172. package/dist/client/securitygroups-DURjFfYK.mjs +0 -12
  173. package/dist/client/securitygroups-DURjFfYK.mjs.map +0 -1
  174. package/dist/client/securitygroups-KC2qvmH8.mjs +0 -442
  175. package/dist/client/securitygroups-KC2qvmH8.mjs.map +0 -1
@@ -1,442 +0,0 @@
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
@@ -1 +0,0 @@
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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"}