@cobaltcore-dev/aurora 0.3.1 → 0.4.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.
Files changed (108) hide show
  1. package/dist/client/{EditSecurityGroupModal-Dl6m7wUe.mjs → EditSecurityGroupModal-DK3WYikA.mjs} +1 -1
  2. package/dist/client/{EditSecurityGroupModal-Dl6m7wUe.mjs.map → EditSecurityGroupModal-DK3WYikA.mjs.map} +1 -1
  3. package/dist/client/{FiltersInput-BgNaHFBt.mjs → FiltersInput-OVeIJzIo.mjs} +2 -2
  4. package/dist/client/FiltersInput-OVeIJzIo.mjs.map +1 -0
  5. package/dist/client/{FloatingIpActionModals-By2hXR9m.mjs → FloatingIpActionModals-Dok7fJss.mjs} +3 -3
  6. package/dist/client/{FloatingIpActionModals-By2hXR9m.mjs.map → FloatingIpActionModals-Dok7fJss.mjs.map} +1 -1
  7. package/dist/client/{ImageToastNotifications-fHI8jB2j.mjs → ImageToastNotifications-BG9LPnXf.mjs} +4 -4
  8. package/dist/client/{ImageToastNotifications-fHI8jB2j.mjs.map → ImageToastNotifications-BG9LPnXf.mjs.map} +1 -1
  9. package/dist/client/{ListToolbar-BvtCo8dk.mjs → ListToolbar-BojRTNbo.mjs} +2 -2
  10. package/dist/client/{ListToolbar-BvtCo8dk.mjs.map → ListToolbar-BojRTNbo.mjs.map} +1 -1
  11. package/dist/client/{_floatingIpId-CwHiXazi.mjs → _floatingIpId-D33bOEmH.mjs} +2 -2
  12. package/dist/client/{_floatingIpId-CwHiXazi.mjs.map → _floatingIpId-D33bOEmH.mjs.map} +1 -1
  13. package/dist/client/{_floatingIpId-BpUfL8Im2.mjs → _floatingIpId-DF_BSJN6.mjs} +5 -5
  14. package/dist/client/_floatingIpId-DF_BSJN6.mjs.map +1 -0
  15. package/dist/client/{_imageId-CdOOJjw0.mjs → _imageId-BL0I5_pv.mjs} +2 -2
  16. package/dist/client/{_imageId-CdOOJjw0.mjs.map → _imageId-BL0I5_pv.mjs.map} +1 -1
  17. package/dist/client/{_pcaId-D1ZEaCdp.mjs → _pcaId-BYCoeK6_.mjs} +2 -2
  18. package/dist/client/{_pcaId-D1ZEaCdp.mjs.map → _pcaId-BYCoeK6_.mjs.map} +1 -1
  19. package/dist/client/{_pcaId-CwlH1Kvl.mjs → _pcaId-CbBhBrX1.mjs} +153 -56
  20. package/dist/client/_pcaId-CbBhBrX1.mjs.map +1 -0
  21. package/dist/client/{_projectId-Dj_InfSc.mjs → _projectId-5NiasyXm.mjs} +2 -2
  22. package/dist/client/{_projectId-Dj_InfSc.mjs.map → _projectId-5NiasyXm.mjs.map} +1 -1
  23. package/dist/client/{_projectId-DhLpIalx.mjs → _projectId-BwLMEMGC.mjs} +1 -1
  24. package/dist/client/{_projectId-DhLpIalx.mjs.map → _projectId-BwLMEMGC.mjs.map} +1 -1
  25. package/dist/client/{_projectId-D1gGribM.mjs → _projectId-D35MN1kY.mjs} +3 -3
  26. package/dist/client/{_projectId-D1gGribM.mjs.map → _projectId-D35MN1kY.mjs.map} +1 -1
  27. package/dist/client/{_securityGroupId-B0llWH9A.mjs → _securityGroupId-B-Z-CzLp.mjs} +2 -2
  28. package/dist/client/{_securityGroupId-B0llWH9A.mjs.map → _securityGroupId-B-Z-CzLp.mjs.map} +1 -1
  29. package/dist/client/{_securityGroupId-gbUnd5Wv.mjs → _securityGroupId-B1bOYRbX.mjs} +7 -7
  30. package/dist/client/{_securityGroupId-gbUnd5Wv.mjs.map → _securityGroupId-B1bOYRbX.mjs.map} +1 -1
  31. package/dist/client/{about-DCe6LsKz.mjs → about-DLn1ShhF.mjs} +1 -1
  32. package/dist/client/{about-DCe6LsKz.mjs.map → about-DLn1ShhF.mjs.map} +1 -1
  33. package/dist/client/{buildFilterParams-By33pG59.mjs → buildFilterParams-TeyosGyK.mjs} +1 -1
  34. package/dist/client/{buildFilterParams-By33pG59.mjs.map → buildFilterParams-TeyosGyK.mjs.map} +1 -1
  35. package/dist/client/{constants-CAjjRTo_.mjs → constants-B-P2r5F1.mjs} +3 -3
  36. package/dist/client/{constants-CAjjRTo_.mjs.map → constants-B-P2r5F1.mjs.map} +1 -1
  37. package/dist/client/{containers-NW7RnHTI.mjs → containers-BjWqjNOx.mjs} +2 -2
  38. package/dist/client/containers-BjWqjNOx.mjs.map +1 -0
  39. package/dist/client/{containers-Ca5V1EBS.mjs → containers-DsRWc1L5.mjs} +1 -1
  40. package/dist/client/containers-DsRWc1L5.mjs.map +1 -0
  41. package/dist/client/{containers-BuXUVb1N.mjs → containers-J7WFA18U.mjs} +1140 -1051
  42. package/dist/client/containers-J7WFA18U.mjs.map +1 -0
  43. package/dist/client/{floatingips-Be3zLoaD.mjs → floatingips-Fa6ocNUu.mjs} +7 -7
  44. package/dist/client/{floatingips-Be3zLoaD.mjs.map → floatingips-Fa6ocNUu.mjs.map} +1 -1
  45. package/dist/client/{formatBytes-D6oa0wU9.mjs → formatBytes-tQBEnPoL.mjs} +1 -1
  46. package/dist/client/{formatBytes-D6oa0wU9.mjs.map → formatBytes-tQBEnPoL.mjs.map} +1 -1
  47. package/dist/client/{hooks-D0krAKvo.mjs → hooks-DEjb9d1F.mjs} +1 -1
  48. package/dist/client/{images-CCYBAphP2.mjs → images-CSFfefAu.mjs} +8 -7
  49. package/dist/client/images-CSFfefAu.mjs.map +1 -0
  50. package/dist/client/{images-BiEBENaj.mjs → images-CTLCY-yY.mjs} +2 -2
  51. package/dist/client/{images-BiEBENaj.mjs.map → images-CTLCY-yY.mjs.map} +1 -1
  52. package/dist/client/images-DM9I8G0p.mjs.map +1 -1
  53. package/dist/client/images-tYfyOkX8.mjs +8 -0
  54. package/dist/client/images-tYfyOkX8.mjs.map +1 -0
  55. package/dist/client/index.js +111 -109
  56. package/dist/client/index.js.map +1 -1
  57. package/dist/client/{network-nbSbl0X0.mjs → network-rYLHyf15.mjs} +1 -1
  58. package/dist/client/{network-nbSbl0X0.mjs.map → network-rYLHyf15.mjs.map} +1 -1
  59. package/dist/client/{objects-CU5ws07o.mjs → objects-BciXwZ00.mjs} +2 -2
  60. package/dist/client/objects-BciXwZ00.mjs.map +1 -0
  61. package/dist/client/{objects-GmuIOaHd.mjs → objects-Cdew99tK.mjs} +1 -1
  62. package/dist/client/objects-Cdew99tK.mjs.map +1 -0
  63. package/dist/client/objects-DaElrban.mjs +5340 -0
  64. package/dist/client/objects-DaElrban.mjs.map +1 -0
  65. package/dist/client/{overview-EhfPY8Je.mjs → overview-BMhjFMIV.mjs} +2 -2
  66. package/dist/client/{overview-EhfPY8Je.mjs.map → overview-BMhjFMIV.mjs.map} +1 -1
  67. package/dist/client/{overview-DzYBiNfD.mjs → overview-BYIRj7_X.mjs} +1 -1
  68. package/dist/client/{overview-DzYBiNfD.mjs.map → overview-BYIRj7_X.mjs.map} +1 -1
  69. package/dist/client/{overview-B3gdnWTG.mjs → overview-DRCKNBH2.mjs} +1 -1
  70. package/dist/client/{overview-B3gdnWTG.mjs.map → overview-DRCKNBH2.mjs.map} +1 -1
  71. package/dist/client/{overview-XueZI4LQ.mjs → overview-urYLOVQE.mjs} +2 -2
  72. package/dist/client/{overview-XueZI4LQ.mjs.map → overview-urYLOVQE.mjs.map} +1 -1
  73. package/dist/client/{pca-DSM71LhW.mjs → pca-COmKvp3J.mjs} +2 -2
  74. package/dist/client/{pca-DSM71LhW.mjs.map → pca-COmKvp3J.mjs.map} +1 -1
  75. package/dist/client/{pca-x9if8xU-.mjs → pca-oc7J0_Xd.mjs} +17 -17
  76. package/dist/client/pca-oc7J0_Xd.mjs.map +1 -0
  77. package/dist/client/{projects-CnmZIB2Q.mjs → projects-BUabCzvw.mjs} +16 -16
  78. package/dist/client/projects-BUabCzvw.mjs.map +1 -0
  79. package/dist/client/{projects-Bt0XptpG.mjs → projects-DI_L4oDw.mjs} +2 -2
  80. package/dist/client/{projects-Bt0XptpG.mjs.map → projects-DI_L4oDw.mjs.map} +1 -1
  81. package/dist/client/{projects-B6BPo2Ar.mjs → projects-Dl5XkXUP.mjs} +1 -1
  82. package/dist/client/{projects-B6BPo2Ar.mjs.map → projects-Dl5XkXUP.mjs.map} +1 -1
  83. package/dist/client/{projects-BilrmHLu.mjs → projects-HoQ0gE5Y.mjs} +1 -1
  84. package/dist/client/{projects-BilrmHLu.mjs.map → projects-HoQ0gE5Y.mjs.map} +1 -1
  85. package/dist/client/{securitygroups-BdzieS7Z.mjs → securitygroups-BjkmHk2J.mjs} +7 -7
  86. package/dist/client/{securitygroups-BdzieS7Z.mjs.map → securitygroups-BjkmHk2J.mjs.map} +1 -1
  87. package/dist/client/{useListWithFiltering-CqQbAjEe.mjs → useListWithFiltering-CbhHJO4V.mjs} +1 -1
  88. package/dist/client/{useListWithFiltering-CqQbAjEe.mjs.map → useListWithFiltering-CbhHJO4V.mjs.map} +1 -1
  89. package/dist/client/{useProjectId-CgOTejka.mjs → useProjectId-OQv2KBbG.mjs} +1 -1
  90. package/dist/client/{useProjectId-CgOTejka.mjs.map → useProjectId-OQv2KBbG.mjs.map} +1 -1
  91. package/dist/server/index.d.ts +7 -1
  92. package/dist/server/index.js +116 -55
  93. package/package.json +2 -3
  94. package/dist/client/FiltersInput-BgNaHFBt.mjs.map +0 -1
  95. package/dist/client/_floatingIpId-BpUfL8Im2.mjs.map +0 -1
  96. package/dist/client/_pcaId-CwlH1Kvl.mjs.map +0 -1
  97. package/dist/client/containers-BuXUVb1N.mjs.map +0 -1
  98. package/dist/client/containers-Ca5V1EBS.mjs.map +0 -1
  99. package/dist/client/containers-NW7RnHTI.mjs.map +0 -1
  100. package/dist/client/images-CCYBAphP2.mjs.map +0 -1
  101. package/dist/client/objects-CU5ws07o.mjs.map +0 -1
  102. package/dist/client/objects-FXN0VWLI.mjs +0 -4760
  103. package/dist/client/objects-FXN0VWLI.mjs.map +0 -1
  104. package/dist/client/objects-GmuIOaHd.mjs.map +0 -1
  105. package/dist/client/pca-x9if8xU-.mjs.map +0 -1
  106. package/dist/client/projects-CnmZIB2Q.mjs.map +0 -1
  107. package/permission_policies/compute.yaml +0 -975
  108. package/permission_policies/image.yaml +0 -71
@@ -1,20 +1,20 @@
1
1
  import { E as e, G as t, I as n, L as r, M as i, N as a, Q as o, U as s, W as c, Y as l, at as u, c as d, et as f, j as p, n as m, nt as h, ot as g, q as _, rt as v, s as y } from "./build-BJDfnAyi.mjs";
2
2
  import { r as b } from "./trpcClient-BxguzNYF.mjs";
3
- import { t as x } from "./_pcaId-D1ZEaCdp.mjs";
3
+ import { t as x } from "./_pcaId-BYCoeK6_.mjs";
4
4
  import { i as S, s as C } from "./md-BivyCkGC.mjs";
5
5
  import { t as w } from "./useModal-DxxlilRm.mjs";
6
- import { t as T } from "./useProjectId-CgOTejka.mjs";
7
- import "./hooks-D0krAKvo.mjs";
8
- import { r as E, t as D } from "./constants-CAjjRTo_.mjs";
6
+ import { t as T } from "./useProjectId-OQv2KBbG.mjs";
7
+ import "./hooks-DEjb9d1F.mjs";
8
+ import { r as E, t as D } from "./constants-B-P2r5F1.mjs";
9
9
  import { Fragment as O, jsx as k, jsxs as A } from "react/jsx-runtime";
10
- import { Fragment as j } from "react";
11
- import { useNavigate as M } from "@tanstack/react-router";
12
- import { Trans as N, useLingui as P } from "@lingui/react";
13
- import { z as F } from "zod";
14
- import { useForm as I, useStore as L } from "@tanstack/react-form";
10
+ import { Fragment as j, useRef as M } from "react";
11
+ import { useNavigate as N } from "@tanstack/react-router";
12
+ import { Trans as P, useLingui as F } from "@lingui/react";
13
+ import { z as I } from "zod";
14
+ import { useForm as L, useStore as R } from "@tanstack/react-form";
15
15
  //#region src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-table/PcaCertificatesTableRow.tsx
16
- var R = ({ certificate: t }) => {
17
- let { i18n: r, _: a } = P(), o = M();
16
+ var z = ({ certificate: t }) => {
17
+ let { i18n: r, _: a } = F(), o = N();
18
18
  return /* @__PURE__ */ A(n, {
19
19
  "data-testid": `pca-certificate-row-${t.id}`,
20
20
  onClick: () => o({
@@ -38,10 +38,10 @@ var R = ({ certificate: t }) => {
38
38
  })
39
39
  ]
40
40
  }, t.id);
41
- }, z = ({ open: e, onClose: t, pcaId: n }) => {
42
- let { i18n: r, _: i } = P(), a = T(), s = b.useUtils(), { isPending: c, ...l } = b.services.pca.createCertificate.useMutation({ onSettled: () => s.services.pca.listCertificates.invalidate() }), d = I({
41
+ }, B = ({ open: e, onClose: t, pcaId: n }) => {
42
+ let { i18n: r, _: i } = F(), a = T(), s = b.useUtils(), { isPending: c, ...l } = b.services.pca.createCertificate.useMutation({ onSettled: () => s.services.pca.listCertificates.invalidate() }), d = L({
43
43
  defaultValues: { csr: "" },
44
- validators: { onSubmit: F.object({ csr: F.string().trim().min(1) }) },
44
+ validators: { onSubmit: I.object({ csr: I.string().trim().min(1) }) },
45
45
  onSubmit: async ({ value: e }) => {
46
46
  c || (await l.mutateAsync({
47
47
  project_id: a,
@@ -52,7 +52,7 @@ var R = ({ certificate: t }) => {
52
52
  }
53
53
  }), f = () => {
54
54
  c || (d.reset(), l.reset(), t());
55
- }, p = L(d.store, (e) => e.values.csr);
55
+ }, p = R(d.store, (e) => e.values.csr);
56
56
  return /* @__PURE__ */ A(g, {
57
57
  open: e,
58
58
  size: "large",
@@ -73,7 +73,7 @@ var R = ({ certificate: t }) => {
73
73
  className: "mb-4 flex items-center justify-center gap-2",
74
74
  children: [/* @__PURE__ */ k(o, { variant: "primary" }), /* @__PURE__ */ k("span", {
75
75
  className: "text-theme-high text-sm",
76
- children: /* @__PURE__ */ k(N, { id: "khxtMT" })
76
+ children: /* @__PURE__ */ k(P, { id: "khxtMT" })
77
77
  })]
78
78
  }),
79
79
  !c && /* @__PURE__ */ k(u, {
@@ -98,8 +98,8 @@ var R = ({ certificate: t }) => {
98
98
  })
99
99
  ]
100
100
  });
101
- }, B = ({ pcaId: e, pcaState: r }) => {
102
- let { i18n: a, _: c } = P(), l = T(), [u, f] = w(!1), m = () => [
101
+ }, V = ({ pcaId: e, pcaState: r }) => {
102
+ let { i18n: a, _: c } = F(), l = T(), [u, f] = w(!1), m = () => [
103
103
  a._({ id: "c1OE1x" }),
104
104
  a._({ id: "S0kLOH" }),
105
105
  ""
@@ -116,7 +116,7 @@ var R = ({ certificate: t }) => {
116
116
  variant: "primary",
117
117
  size: "large",
118
118
  className: "mb-2"
119
- }), /* @__PURE__ */ k(N, { id: "T9o/az" })]
119
+ }), /* @__PURE__ */ k(P, { id: "T9o/az" })]
120
120
  }) : v ? /* @__PURE__ */ k(h, {
121
121
  className: "py-8",
122
122
  distribution: "center",
@@ -129,7 +129,7 @@ var R = ({ certificate: t }) => {
129
129
  variant: "primary",
130
130
  label: a._({ id: "BMogtG" }),
131
131
  onClick: f
132
- }), u && /* @__PURE__ */ k(z, {
132
+ }), u && /* @__PURE__ */ k(B, {
133
133
  open: u,
134
134
  onClose: f,
135
135
  pcaId: e
@@ -139,15 +139,15 @@ var R = ({ certificate: t }) => {
139
139
  "data-testid": "no-pcas-certificates",
140
140
  children: /* @__PURE__ */ k(n, { children: /* @__PURE__ */ A(i, {
141
141
  colSpan: m().length,
142
- children: [/* @__PURE__ */ k(p, { children: /* @__PURE__ */ k(N, { id: "kNeZrV" }) }), /* @__PURE__ */ k("p", { children: /* @__PURE__ */ k(N, { id: "7huC4O" }) })]
142
+ children: [/* @__PURE__ */ k(p, { children: /* @__PURE__ */ k(P, { id: "kNeZrV" }) }), /* @__PURE__ */ k("p", { children: /* @__PURE__ */ k(P, { id: "7huC4O" }) })]
143
143
  }) })
144
144
  }) : /* @__PURE__ */ A(s, {
145
145
  columns: m().length,
146
- children: [/* @__PURE__ */ k(n, { children: m().map((e) => /* @__PURE__ */ k(t, { children: e }, e)) }), g.map((e) => /* @__PURE__ */ k(R, { certificate: e }, e.id))]
146
+ children: [/* @__PURE__ */ k(n, { children: m().map((e) => /* @__PURE__ */ k(t, { children: e }, e)) }), g.map((e) => /* @__PURE__ */ k(z, { certificate: e }, e.id))]
147
147
  })]
148
148
  });
149
- }, V = 86400, H = ({ open: e, onClose: t, pca: n }) => {
150
- let { i18n: r, _: i } = P(), a = T(), s = b.useUtils(), { isPending: c, ...l } = b.services.pca.createCertificate.useMutation({ onSettled: () => s.services.pca.listCertificates.invalidate() });
149
+ }, H = 86400, U = ({ open: e, onClose: t, pca: n }) => {
150
+ let { i18n: r, _: i } = F(), a = T(), s = b.useUtils(), { isPending: c, ...l } = b.services.pca.createCertificate.useMutation({ onSettled: () => s.services.pca.listCertificates.invalidate() });
151
151
  return /* @__PURE__ */ A(g, {
152
152
  open: e,
153
153
  title: r._({ id: "8yVjU5" }),
@@ -161,7 +161,7 @@ var R = ({ certificate: t }) => {
161
161
  project_id: a,
162
162
  certificate_authority_id: n.id,
163
163
  csr: n.csr,
164
- configuration: { validity: { not_after: Math.floor(Date.now() / 1e3) + V } }
164
+ configuration: { validity: { not_after: Math.floor(Date.now() / 1e3) + H } }
165
165
  }), t());
166
166
  },
167
167
  disableConfirmButton: c || !n.csr,
@@ -174,15 +174,104 @@ var R = ({ certificate: t }) => {
174
174
  className: "flex items-center justify-center gap-2",
175
175
  children: [/* @__PURE__ */ k(o, { variant: "primary" }), /* @__PURE__ */ k("span", {
176
176
  className: "text-theme-high text-sm",
177
- children: /* @__PURE__ */ k(N, { id: "1DbiGM" })
177
+ children: /* @__PURE__ */ k(P, { id: "1DbiGM" })
178
178
  })]
179
- }) : /* @__PURE__ */ k(N, { id: "MI6aae" })]
179
+ }) : /* @__PURE__ */ k(P, { id: "MI6aae" })]
180
180
  });
181
- }, U = ({ pca: e }) => {
182
- let { i18n: t, _: n } = P(), i = M(), o = T(), [s, l] = w(!1), [u, f] = w(!1), p = () => i({
181
+ }, W = ({ open: e, onClose: t, pcaId: n }) => {
182
+ let { i18n: r, _: i } = F(), a = T(), s = b.useUtils(), { isPending: c, ...l } = b.services.pca.import.useMutation({ onSettled: () => s.services.pca.getById.invalidate() }), f = L({
183
+ defaultValues: { imported_certificate_chain: "" },
184
+ validators: { onSubmit: I.object({ imported_certificate_chain: I.string().trim().min(1) }) },
185
+ onSubmit: async () => {
186
+ c || (await l.mutateAsync({
187
+ project_id: a,
188
+ certificate_authority_id: n,
189
+ imported_certificate_chain: f.state.values.imported_certificate_chain
190
+ }), p());
191
+ }
192
+ }), p = () => {
193
+ c || (f.reset(), l.reset(), t());
194
+ }, h = M(null), v = R(f.store, (e) => e.values.imported_certificate_chain);
195
+ return /* @__PURE__ */ A(g, {
196
+ open: e,
197
+ size: "large",
198
+ title: r._({ id: "+1rTEL" }),
199
+ onCancel: p,
200
+ cancelButtonLabel: r._({ id: "dEgA5A" }),
201
+ confirmButtonLabel: r._({ id: "tfDRzk" }),
202
+ onConfirm: f.handleSubmit,
203
+ disableConfirmButton: c || !v.trim(),
204
+ children: [
205
+ l.error && /* @__PURE__ */ k(_, {
206
+ dismissible: !1,
207
+ variant: "error",
208
+ className: "mb-4",
209
+ children: l.error?.message
210
+ }),
211
+ c && /* @__PURE__ */ A("div", {
212
+ className: "mb-4 flex items-center justify-center gap-2",
213
+ children: [/* @__PURE__ */ k(o, { variant: "primary" }), /* @__PURE__ */ k("span", {
214
+ className: "text-theme-high text-sm",
215
+ children: /* @__PURE__ */ k(P, { id: "pYR76U" })
216
+ })]
217
+ }),
218
+ !c && /* @__PURE__ */ k(u, {
219
+ className: "mb-0",
220
+ id: "import-externally-signed-certificate-form",
221
+ onSubmit: (e) => {
222
+ e.preventDefault(), f.handleSubmit();
223
+ },
224
+ children: /* @__PURE__ */ A(m, { children: [/* @__PURE__ */ A("div", {
225
+ className: "mb-2",
226
+ children: [/* @__PURE__ */ k(d, {
227
+ onClick: () => h.current?.click(),
228
+ children: r._({ id: "E7kdtm" })
229
+ }), /* @__PURE__ */ k("input", {
230
+ ref: h,
231
+ type: "file",
232
+ accept: ".pem,.crt,.cer,.json",
233
+ className: "sr-only",
234
+ onChange: (e) => {
235
+ let t = e.target.files?.[0];
236
+ if (!t) return;
237
+ let n = new FileReader();
238
+ n.onload = (e) => {
239
+ try {
240
+ let n = e.target?.result, r = n;
241
+ if (t.name.endsWith(".json")) try {
242
+ let e = JSON.parse(n);
243
+ r = typeof e.imported_certificate_chain == "string" ? e.imported_certificate_chain : n;
244
+ } catch {
245
+ r = n;
246
+ }
247
+ f.setFieldValue("imported_certificate_chain", r);
248
+ } catch (e) {
249
+ console.error("Failed to read certificate file:", e);
250
+ }
251
+ }, n.readAsText(t);
252
+ }
253
+ })]
254
+ }), /* @__PURE__ */ k(f.Field, {
255
+ name: "imported_certificate_chain",
256
+ children: (e) => /* @__PURE__ */ k(y, {
257
+ id: e.name,
258
+ name: e.name,
259
+ value: e.state.value,
260
+ onBlur: e.handleBlur,
261
+ onChange: (t) => e.handleChange(t.target.value),
262
+ placeholder: r._({ id: "FAA/qW" }),
263
+ errortext: e.state.meta.errors.map((e) => e?.message).join(", "),
264
+ disabled: c
265
+ })
266
+ })] })
267
+ })
268
+ ]
269
+ });
270
+ }, G = ({ pca: e }) => {
271
+ let { i18n: t, _: n } = F(), i = N(), o = T(), [s, l] = w(!1), [u, f] = w(!1), [p, m] = w(!1), g = () => i({
183
272
  to: "/projects/$projectId/services/pca",
184
273
  params: { projectId: o }
185
- }), m = [
274
+ }), _ = [
186
275
  {
187
276
  label: t._({ id: "c1OE1x" }),
188
277
  value: e.id
@@ -223,13 +312,13 @@ var R = ({ certificate: t }) => {
223
312
  ]
224
313
  })]
225
314
  }), /* @__PURE__ */ k(d, {
226
- onClick: f,
227
- children: /* @__PURE__ */ k(N, { id: "Blsc/x" })
315
+ onClick: m,
316
+ children: /* @__PURE__ */ k(P, { id: "Blsc/x" })
228
317
  })]
229
318
  }),
230
319
  /* @__PURE__ */ k("p", {
231
320
  className: "text-theme-highest text-sm",
232
- children: /* @__PURE__ */ k(N, { id: "dxMaZH" })
321
+ children: /* @__PURE__ */ k(P, { id: "dxMaZH" })
233
322
  }),
234
323
  e.state === "AWAITING_CERTIFICATE" && /* @__PURE__ */ A(h, {
235
324
  direction: "vertical",
@@ -240,16 +329,19 @@ var R = ({ certificate: t }) => {
240
329
  gap: "1",
241
330
  children: [/* @__PURE__ */ k("div", {
242
331
  className: "text-base font-bold",
243
- children: /* @__PURE__ */ k(N, { id: "cUKFby" })
244
- }), /* @__PURE__ */ k("div", { children: /* @__PURE__ */ k(N, { id: "+HVj+D" }) })]
245
- }), /* @__PURE__ */ k(h, {
332
+ children: /* @__PURE__ */ k(P, { id: "cUKFby" })
333
+ }), /* @__PURE__ */ k("div", { children: /* @__PURE__ */ k(P, { id: "+HVj+D" }) })]
334
+ }), /* @__PURE__ */ A(h, {
246
335
  direction: "horizontal",
247
336
  gap: "2",
248
337
  distribution: "end",
249
- children: /* @__PURE__ */ k(d, {
338
+ children: [/* @__PURE__ */ k(d, {
250
339
  onClick: l,
251
- children: /* @__PURE__ */ k(N, { id: "AirKNZ" })
252
- })
340
+ children: /* @__PURE__ */ k(P, { id: "AirKNZ" })
341
+ }), /* @__PURE__ */ k(d, {
342
+ onClick: f,
343
+ children: /* @__PURE__ */ k(P, { id: "3uDz8n" })
344
+ })]
253
345
  })]
254
346
  }),
255
347
  /* @__PURE__ */ A(h, {
@@ -258,7 +350,7 @@ var R = ({ certificate: t }) => {
258
350
  children: [/* @__PURE__ */ k(c, {
259
351
  alignTerms: "right",
260
352
  className: "w-full",
261
- children: m.map(({ label: e, value: t }) => /* @__PURE__ */ A(j, { children: [/* @__PURE__ */ k(a, { children: e }), /* @__PURE__ */ k(r, { children: t || "—" })] }, e))
353
+ children: _.map(({ label: e, value: t }) => /* @__PURE__ */ A(j, { children: [/* @__PURE__ */ k(a, { children: e }), /* @__PURE__ */ k(r, { children: t || "—" })] }, e))
262
354
  }), /* @__PURE__ */ A("div", {
263
355
  className: "bg-dt-background w-full rounded-sm",
264
356
  children: [
@@ -283,18 +375,23 @@ var R = ({ certificate: t }) => {
283
375
  })
284
376
  ]
285
377
  }),
286
- s && /* @__PURE__ */ k(H, {
378
+ u && /* @__PURE__ */ k(W, {
379
+ pcaId: e.id,
380
+ open: u,
381
+ onClose: f
382
+ }),
383
+ s && /* @__PURE__ */ k(U, {
287
384
  pca: e,
288
385
  open: s,
289
386
  onClose: l
290
387
  }),
291
- u && /* @__PURE__ */ k(E, {
388
+ p && /* @__PURE__ */ k(E, {
292
389
  pca: e,
293
- open: u,
294
- onClose: f,
295
- onSuccess: p
390
+ open: p,
391
+ onClose: m,
392
+ onSuccess: g
296
393
  }),
297
- /* @__PURE__ */ k(B, {
394
+ /* @__PURE__ */ k(V, {
298
395
  pcaId: e.id,
299
396
  pcaState: e.state
300
397
  })
@@ -302,8 +399,8 @@ var R = ({ certificate: t }) => {
302
399
  };
303
400
  //#endregion
304
401
  //#region src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx?tsr-split=component
305
- function W() {
306
- let e = M(), t = T(), { pcaId: n } = x.useParams(), { isLoading: r, isError: i, error: a, data: s } = b.services.pca.getById.useQuery({
402
+ function K() {
403
+ let e = N(), t = T(), { pcaId: n } = x.useParams(), { isLoading: r, isError: i, error: a, data: s } = b.services.pca.getById.useQuery({
307
404
  project_id: t,
308
405
  certificate_authority_id: n
309
406
  });
@@ -316,7 +413,7 @@ function W() {
316
413
  variant: "primary",
317
414
  size: "large",
318
415
  className: "mb-2"
319
- }), /* @__PURE__ */ k(N, { id: "og1m+J" })]
416
+ }), /* @__PURE__ */ k(P, { id: "og1m+J" })]
320
417
  });
321
418
  let c = () => e({
322
419
  to: "/projects/$projectId/services/pca",
@@ -333,7 +430,7 @@ function W() {
333
430
  children: [
334
431
  /* @__PURE__ */ k("p", {
335
432
  className: "text-theme-error font-semibold",
336
- children: /* @__PURE__ */ k(N, { id: "IQSLN+" })
433
+ children: /* @__PURE__ */ k(P, { id: "IQSLN+" })
337
434
  }),
338
435
  /* @__PURE__ */ k("p", {
339
436
  className: "text-theme-highest",
@@ -342,12 +439,12 @@ function W() {
342
439
  /* @__PURE__ */ k(d, {
343
440
  onClick: c,
344
441
  variant: "primary",
345
- children: /* @__PURE__ */ k(N, { id: "HG0uMz" })
442
+ children: /* @__PURE__ */ k(P, { id: "HG0uMz" })
346
443
  })
347
444
  ]
348
445
  });
349
446
  }
350
- return s ? /* @__PURE__ */ k(U, { pca: s }) : /* @__PURE__ */ A(h, {
447
+ return s ? /* @__PURE__ */ k(G, { pca: s }) : /* @__PURE__ */ A(h, {
351
448
  className: "fixed inset-0",
352
449
  distribution: "center",
353
450
  alignment: "center",
@@ -355,15 +452,15 @@ function W() {
355
452
  gap: "5",
356
453
  children: [/* @__PURE__ */ k("p", {
357
454
  className: "text-theme-secondary",
358
- children: /* @__PURE__ */ k(N, { id: "Io2Dvq" })
455
+ children: /* @__PURE__ */ k(P, { id: "Io2Dvq" })
359
456
  }), /* @__PURE__ */ k(d, {
360
457
  onClick: c,
361
458
  variant: "primary",
362
- children: /* @__PURE__ */ k(N, { id: "HG0uMz" })
459
+ children: /* @__PURE__ */ k(P, { id: "HG0uMz" })
363
460
  })]
364
461
  });
365
462
  }
366
463
  //#endregion
367
- export { W as component };
464
+ export { K as component };
368
465
 
369
- //# sourceMappingURL=_pcaId-CwlH1Kvl.mjs.map
466
+ //# sourceMappingURL=_pcaId-CbBhBrX1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_pcaId-CbBhBrX1.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","PcaCertificatesTableRow","certificate","useLingui","navigate","navigateToCertificateDetailsPage","from","to","params","prev","certificateId","id","data-testid","onClick","certificate_authority_id","e","stopPropagation","className","label","t","disabled","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","trpcReact","useProjectId","IssueEndEntityCertificateModal","open","onClose","pcaId","useLingui","projectId","utils","useUtils","isPending","createCertificateMutation","services","pca","createCertificate","useMutation","onSettled","listCertificates","invalidate","formSchema","object","csr","string","trim","min","form","defaultValues","validators","onSubmit","value","mutateAsync","project_id","certificate_authority_id","replace","configuration","validity","not_after","Math","floor","Date","now","handleClose","reset","currentCsr","store","state","values","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","length","error","dismissible","variant","className","message","div","span","id","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","placeholder","errortext","meta","errors","map","join","disabled","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","trpcReact","useProjectId","useModal","PcaCertificatesTableRow","IssueEndEntityCertificateModal","PcaCertificatesListContainer","pcaId","pcaState","useLingui","projectId","createIssueEndEntityOpen","toggleIssueEndEntity","columns","t","data","pcaCertificates","isLoading","isError","error","services","pca","listCertificates","useQuery","project_id","certificate_authority_id","className","distribution","alignment","direction","variant","size","message","div","label","onClick","open","onClose","length","data-testid","colSpan","p","map","certificate","id","Modal","Spinner","Message","trpcReact","useProjectId","VALIDITY_SECONDS","IssueSelfSignedCertificateModal","open","onClose","pca","useLingui","projectId","utils","useUtils","isPending","createCertificateMutation","services","createCertificate","useMutation","onSettled","listCertificates","invalidate","handleConfirm","csr","mutateAsync","project_id","certificate_authority_id","id","configuration","validity","not_after","Math","floor","Date","now","handleClose","reset","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","disableConfirmButton","error","dismissible","variant","className","message","div","span","useRef","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","Button","trpcReact","useProjectId","ImportExternallySignedCertificateModal","open","onClose","pcaId","useLingui","projectId","utils","useUtils","isPending","importMutation","services","pca","import","useMutation","onSettled","getById","invalidate","formSchema","object","imported_certificate_chain","string","trim","min","form","defaultValues","validators","onSubmit","mutateAsync","project_id","certificate_authority_id","state","values","handleClose","reset","fileInputRef","currentChain","store","handleFileChange","e","file","target","files","reader","FileReader","onload","event","text","result","chainValue","name","endsWith","parsed","JSON","parse","setFieldValue","error","console","readAsText","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","dismissible","variant","className","message","div","span","id","preventDefault","onClick","current","click","input","ref","type","accept","onChange","Field","children","field","value","onBlur","handleBlur","handleChange","placeholder","errortext","meta","errors","map","join","disabled","Fragment","MdDownload","MdContentCopy","useNavigate","Button","DescriptionDefinition","DescriptionList","DescriptionTerm","Divider","Stack","useProjectId","useModal","DeletePcaModal","STATE_CONFIG","PcaCertificatesListContainer","IssueSelfSignedCertificateModal","ImportExternallySignedCertificateModal","PcaDetailsView","pca","useLingui","navigate","projectId","issueSelfSignedModalOpen","toggleIssueSelfSignedModal","importExternallySignedModalOpen","toggleImportExternallySignedModal","deletePcaModalOpen","toggleDeletePcaModal","navigateToPcaList","to","params","basicInfo","label","t","value","id","project_id","configuration","subject","common_name","certificate","validity","not_before","undefined","not_after","Math","round","direction","gap","distribution","alignment","div","className","state","icon","text","onClick","p","alignTerms","map","csr","pcaId","open","onClose","onSuccess","pcaState","useNavigate","Trans","Button","Spinner","Stack","trpcReact","useProjectId","PcaDetailsView","Route","RouteComponent","navigate","projectId","pcaId","useParams","isLoading","isError","error","data","pca","services","getById","useQuery","project_id","certificate_authority_id","handleBack","to","params","errorMessage","message","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-table/PcaCertificatesTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueEndEntityCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaCertificatesListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueSelfSignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/ImportExternallySignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Certificate } from \"@/server/Services/types/pca\"\n\ninterface PcaCertificatesTableRowProps {\n certificate: Certificate\n}\n\nexport const PcaCertificatesTableRow = ({ certificate }: PcaCertificatesTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n\n const navigateToCertificateDetailsPage = () =>\n navigate({\n from: \"/projects/$projectId/services/pca/$pcaId/\",\n to: \"$certificateId\",\n params: (prev) => ({ ...prev, certificateId: certificate.id }),\n })\n\n return (\n <DataGridRow\n key={certificate.id}\n data-testid={`pca-certificate-row-${certificate.id}`}\n onClick={navigateToCertificateDetailsPage}\n >\n <DataGridCell>{certificate.certificate_authority_id}</DataGridCell>\n <DataGridCell>{certificate.id}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n {/* I will enable this button on create-certificate task of the EPIC */}\n <PopupMenuItem label={t`Create Certificate`} disabled />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface IssueEndEntityCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const IssueEndEntityCertificateModal = ({ open, onClose, pcaId }: IssueEndEntityCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const formSchema = z.object({\n csr: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n csr: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n // Normalize to one format so users can paste raw multi-line CSRs with \\n along with already formatted ones\n csr: value.csr.replace(/\\\\n/g, \"\\n\"),\n configuration: { validity: { not_after: Math.floor(Date.now() / 1000) + 8 * 60 * 60 } },\n })\n handleClose()\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createCertificateMutation.reset()\n onClose()\n }\n\n const currentCsr = useStore(form.store, (state) => state.values.csr)\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Issue End Entity Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !(currentCsr.trim().length > 0)}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.error?.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Issuing End Entity Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"issue-end-entity-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"csr\"\n children={(field) => (\n <Textarea\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Paste CSR code`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { PcaCertificatesTableRow } from \"./-table/PcaCertificatesTableRow\"\nimport { IssueEndEntityCertificateModal } from \"./-modals/IssueEndEntityCertificateModal\"\n\ninterface PcaCertificatesListContainerProps {\n pcaId: string\n pcaState: CertificateAuthority[\"state\"]\n}\n\nexport const PcaCertificatesListContainer = ({ pcaId, pcaState }: PcaCertificatesListContainerProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [createIssueEndEntityOpen, toggleIssueEndEntity] = useModal(false)\n\n const columns = () =>\n [\n t`CA ID`,\n t`ID`,\n \"\", // empty column for item-action with context menu containing \"Delete CA\" button\n ] as const\n\n const {\n data: pcaCertificates = [],\n isLoading,\n isError,\n error,\n } = trpcReact.services.pca.listCertificates.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificates issued by Certificate Authority...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load Certificates issued by Certificate Authority.`}\n </Stack>\n )\n }\n\n return (\n <div className=\"relative\">\n {pcaState === \"READY\" && (\n <>\n <Button variant=\"primary\" label={t`Issue End Entity Certificate`} onClick={toggleIssueEndEntity} />\n {createIssueEndEntityOpen && (\n <IssueEndEntityCertificateModal\n open={createIssueEndEntityOpen}\n onClose={toggleIssueEndEntity}\n pcaId={pcaId}\n />\n )}\n </>\n )}\n\n {pcaCertificates.length === 0 ? (\n <DataGrid columns={columns().length} className=\"pca-certificates\" data-testid=\"no-pcas-certificates\">\n <DataGridRow>\n <DataGridCell colSpan={columns().length}>\n <ContentHeading>\n <Trans>No Certificates issued by this Certificate Authority found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no Certificates available for this Certificate Authority.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n ) : (\n <DataGrid columns={columns().length}>\n <DataGridRow>\n {columns().map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {pcaCertificates.map((certificate) => (\n <PcaCertificatesTableRow key={certificate.id} certificate={certificate} />\n ))}\n </DataGrid>\n )}\n </div>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Spinner, Message } from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nconst VALIDITY_SECONDS = 86400 // 1 day\n\nexport interface IssueSelfSignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pca: CertificateAuthority\n}\n\nexport const IssueSelfSignedCertificateModal = ({ open, onClose, pca }: IssueSelfSignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const handleConfirm = async () => {\n if (isPending || !pca.csr) return\n\n await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pca.id,\n csr: pca.csr,\n configuration: {\n validity: {\n not_after: Math.floor(Date.now() / 1000) + VALIDITY_SECONDS,\n },\n },\n })\n onClose()\n }\n\n const handleClose = () => {\n if (isPending) return\n\n createCertificateMutation.reset()\n onClose()\n }\n\n return (\n <Modal\n open={open}\n title={t`Issue Self Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Issue Certificate`}\n onConfirm={handleConfirm}\n disableConfirmButton={isPending || !pca.csr}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.error?.message}\n </Message>\n )}\n\n {isPending ? (\n <div className=\"flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Issuing Self-Signed Certificate...</Trans>\n </span>\n </div>\n ) : (\n <Trans>This action will create a self-signed CA certificate.</Trans>\n )}\n </Modal>\n )\n}\n","import { useRef } from \"react\"\nimport { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea, Button } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface ImportExternallySignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const ImportExternallySignedCertificateModal = ({\n open,\n onClose,\n pcaId,\n}: ImportExternallySignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...importMutation } = trpcReact.services.pca.import.useMutation({\n onSettled: () => utils.services.pca.getById.invalidate(),\n })\n\n const formSchema = z.object({\n imported_certificate_chain: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n imported_certificate_chain: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (isPending) return\n\n await importMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n imported_certificate_chain: form.state.values.imported_certificate_chain,\n })\n handleClose()\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n importMutation.reset()\n onClose()\n }\n\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const currentChain = useStore(form.store, (state) => state.values.imported_certificate_chain)\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n\n const reader = new FileReader()\n reader.onload = (event) => {\n try {\n const text = event.target?.result as string\n let chainValue = text\n\n if (file.name.endsWith(\".json\")) {\n try {\n const parsed = JSON.parse(text)\n // Validate that imported_certificate_chain is a string, fallback to raw text\n chainValue =\n typeof parsed.imported_certificate_chain === \"string\" ? parsed.imported_certificate_chain : text\n } catch {\n // If JSON parsing fails, use raw text\n chainValue = text\n }\n }\n\n form.setFieldValue(\"imported_certificate_chain\", chainValue)\n } catch (error) {\n console.error(\"Failed to read certificate file:\", error)\n }\n }\n reader.readAsText(file)\n }\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Import Externally Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !currentChain.trim()}\n >\n {importMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {importMutation.error?.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Importing Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"import-externally-signed-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <div className=\"mb-2\">\n <Button onClick={() => fileInputRef.current?.click()}>{t`Choose Certificate to Import`}</Button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".pem,.crt,.cer,.json\"\n className=\"sr-only\"\n onChange={handleFileChange}\n />\n </div>\n <form.Field\n name=\"imported_certificate_chain\"\n children={(field) => (\n <Textarea\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Paste the code`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { Fragment } from \"react\"\nimport { MdDownload, MdContentCopy } from \"react-icons/md\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Button,\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Divider,\n Stack,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { DeletePcaModal } from \"../../-components/-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"../../-components/-table/constants\"\nimport { PcaCertificatesListContainer } from \"./PcaCertificatesListContainer\"\nimport { IssueSelfSignedCertificateModal } from \"./-modals/IssueSelfSignedCertificateModal\"\nimport { ImportExternallySignedCertificateModal } from \"./-modals/ImportExternallySignedCertificateModal\"\n\ninterface PcaDetailsViewProps {\n pca: CertificateAuthority\n}\n\nexport const PcaDetailsView = ({ pca }: PcaDetailsViewProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const [issueSelfSignedModalOpen, toggleIssueSelfSignedModal] = useModal(false)\n const [importExternallySignedModalOpen, toggleImportExternallySignedModal] = useModal(false)\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToPcaList = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n const basicInfo = [\n { label: t`CA ID`, value: pca.id },\n { label: t`Project ID`, value: pca.project_id },\n { label: t`Subject`, value: pca.configuration?.subject?.common_name },\n {\n label: t`Duration/validity`,\n value:\n pca.certificate?.validity.not_before !== undefined && pca.certificate?.validity.not_after !== undefined\n ? `${Math.round(\n (pca.certificate.validity.not_after - pca.certificate.validity.not_before) / (60 * 60 * 24)\n )} days`\n : undefined,\n },\n ] as const\n\n return (\n <>\n <Stack direction=\"vertical\" gap=\"3\">\n <Stack direction=\"horizontal\" distribution=\"between\">\n <Stack gap=\"2\" alignment=\"center\">\n <div className=\"text-theme-default text-2xl font-semibold\">\n {`${pca.configuration?.subject?.common_name} Certificate Authority Details`}\n </div>\n {/* temporary bg, I will resolve this as soon as I will have sync with designers */}\n <div className=\"bg-aurora-blue-200 flex items-center gap-1 rounded-sm px-1 py-0.5\">\n {STATE_CONFIG[pca.state].icon} {STATE_CONFIG[pca.state].text}\n </div>\n </Stack>\n <Button onClick={toggleDeletePcaModal}>\n <Trans>Delete Certificate Authority</Trans>\n </Button>\n </Stack>\n\n <p className=\"text-theme-highest text-sm\">\n <Trans>Manage your Private Certificate Authority infrastructure</Trans>\n </p>\n\n {pca.state === \"AWAITING_CERTIFICATE\" && (\n <Stack direction=\"vertical\" gap=\"1\" className=\"bg-dt-background mb-1 rounded-sm p-2\">\n <Stack direction=\"vertical\" gap=\"1\">\n <div className=\"text-base font-bold\">\n <Trans>Lifecycle action</Trans>\n </div>\n <div>\n <Trans>Add a Signed Certificate to your CA to activate it</Trans>\n </div>\n </Stack>\n <Stack direction=\"horizontal\" gap=\"2\" distribution=\"end\">\n <Button onClick={toggleIssueSelfSignedModal}>\n <Trans>Issue Self-Signed Certificate</Trans>\n </Button>\n <Button onClick={toggleImportExternallySignedModal}>\n <Trans>Import Signed Certificate</Trans>\n </Button>\n </Stack>\n </Stack>\n )}\n\n <Stack gap=\"4\" className=\"grid grid-cols-2 items-start\">\n <DescriptionList alignTerms=\"right\" className=\"w-full\">\n {basicInfo.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value || \"—\"}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n\n <div className=\"bg-dt-background w-full rounded-sm\">\n <div className=\"text-theme-default p-4 text-xl font-bold\">\n Certificate {`${pca.configuration?.subject?.common_name}`}\n </div>\n <Divider />\n\n <div className=\"p-4 text-sm break-all whitespace-pre-wrap\">{pca?.csr}</div>\n\n {/* I will implement downloading-copying functionality at issue/import part of the epic as I need to clarify some stuff with design-clavis team */}\n <Divider />\n <Stack gap=\"2\" distribution=\"end\" className=\"p-4\">\n <Button>\n <MdDownload />\n </Button>\n <Button>\n <MdContentCopy />\n </Button>\n </Stack>\n </div>\n </Stack>\n </Stack>\n\n {importExternallySignedModalOpen && (\n <ImportExternallySignedCertificateModal\n pcaId={pca.id}\n open={importExternallySignedModalOpen}\n onClose={toggleImportExternallySignedModal}\n />\n )}\n\n {issueSelfSignedModalOpen && (\n <IssueSelfSignedCertificateModal\n pca={pca}\n open={issueSelfSignedModalOpen}\n onClose={toggleIssueSelfSignedModal}\n />\n )}\n\n {deletePcaModalOpen && (\n <DeletePcaModal\n pca={pca}\n open={deletePcaModalOpen}\n onClose={toggleDeletePcaModal}\n onSuccess={navigateToPcaList}\n />\n )}\n\n <PcaCertificatesListContainer pcaId={pca.id} pcaState={pca.state} />\n </>\n )\n}\n","import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Button, Spinner, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { PcaDetailsView } from \"./-components/PcaDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/$pcaId/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\", to: \"/projects/$projectId/services/pca\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const pca = await context.trpcClient?.services.pca.getById.query({\n project_id: params.projectId,\n certificate_authority_id: params.pcaId,\n })\n return { pcaTitle: pca?.configuration?.subject?.common_name || pca?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.pcaTitle ?? \"Certificate Authority\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n const pcaServices = serviceIndex[\"pca\"]?.[\"clavis-beta\"] || serviceIndex[\"pca\"]?.[\"clavis-dev\"]\n\n // Redirect if clavis service not available\n if (!pcaServices) {\n throw redirect({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n\n const {\n isLoading,\n isError,\n error,\n data: pca,\n } = trpcReact.services.pca.getById.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n // Loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificate Authority Details...</Trans>\n </Stack>\n )\n }\n\n const handleBack = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading Certificate Authority</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!pca) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Certificate Authority not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
2
2
  var n = e("/_auth/projects/$projectId")({
3
- component: t(() => import("./_projectId-D1gGribM.mjs"), "component"),
3
+ component: t(() => import("./_projectId-D35MN1kY.mjs"), "component"),
4
4
  errorComponent: t(() => import("./_projectId-OW2xkK43.mjs"), "errorComponent"),
5
5
  loader: async (e) => {
6
6
  let { context: t, params: n } = e, r = await t.trpcClient?.auth.setCurrentScope.mutate({
@@ -23,4 +23,4 @@ var n = e("/_auth/projects/$projectId")({
23
23
  //#endregion
24
24
  export { n as t };
25
25
 
26
- //# sourceMappingURL=_projectId-Dj_InfSc.mjs.map
26
+ //# sourceMappingURL=_projectId-5NiasyXm.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_projectId-Dj_InfSc.mjs","names":["createFileRoute","Route","component","lazyRouteComponent","$$splitComponentImporter","errorComponent","$$splitErrorComponentImporter","loader","options","context","params","data","trpcClient","auth","setCurrentScope","mutate","type","projectId","availableServices","getAvailableServices","query","accountId","domain","id","crumbDomain","path","name","crumbProject","project"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n const availableServices = await context.trpcClient?.auth.getAvailableServices.query()\n\n // Extract accountId (domain id) from the rescoped token\n // This is needed for SideNavBar navigation until we refactor it\n const accountId = data?.domain?.id || \"\"\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId, // Keep for SideNavBar compatibility\n projectId: params.projectId,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject } = useLoaderData({ from: Route.id })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n availableServices={availableServices!}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";AAMA,IAAaC,IAAQD,EAAgB,6BAAA,CAA8B;CACjEE,WAASC,6CAAA,YAAA;CACTE,gBAAcF,6CAAA,iBAAA;CAGdI,QAAQ,OAAOC,MAAAA;EACb,IAAM,EAAEC,YAASC,cAAWF,GACtBG,IAAO,MAAMF,EAAQG,YAAYC,KAAKC,gBAAgBC,OAAO;GACjEC,MAAM;GACNC,WAAWP,EAAOO,aAAa;GACjC,CAAA,EACMC,IAAoB,MAAMT,EAAQG,YAAYC,KAAKM,qBAAqBC,OAAAA,EAIxEC,IAAYV,GAAMW,QAAQC,MAAM;AAEtC,SAAO;GACLX,YAAYH,EAAQG;GACpBY,aAAa;IAAEC,MAAM;IAAaC,MAAMf,GAAMW,QAAQI;IAAK;GAC3DC,cAAchB,GAAMiB;GACpBV;GACAG;GACAJ,WAAWP,EAAOO;GACpB;;CAEJ,CAAA"}
1
+ {"version":3,"file":"_projectId-5NiasyXm.mjs","names":["createFileRoute","Route","component","lazyRouteComponent","$$splitComponentImporter","errorComponent","$$splitErrorComponentImporter","loader","options","context","params","data","trpcClient","auth","setCurrentScope","mutate","type","projectId","availableServices","getAvailableServices","query","accountId","domain","id","crumbDomain","path","name","crumbProject","project"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n const availableServices = await context.trpcClient?.auth.getAvailableServices.query()\n\n // Extract accountId (domain id) from the rescoped token\n // This is needed for SideNavBar navigation until we refactor it\n const accountId = data?.domain?.id || \"\"\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId, // Keep for SideNavBar compatibility\n projectId: params.projectId,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject } = useLoaderData({ from: Route.id })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n availableServices={availableServices!}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";AAMA,IAAaC,IAAQD,EAAgB,6BAAA,CAA8B;CACjEE,WAASC,6CAAA,YAAA;CACTE,gBAAcF,6CAAA,iBAAA;CAGdI,QAAQ,OAAOC,MAAAA;EACb,IAAM,EAAEC,YAASC,cAAWF,GACtBG,IAAO,MAAMF,EAAQG,YAAYC,KAAKC,gBAAgBC,OAAO;GACjEC,MAAM;GACNC,WAAWP,EAAOO,aAAa;GACjC,CAAA,EACMC,IAAoB,MAAMT,EAAQG,YAAYC,KAAKM,qBAAqBC,OAAAA,EAIxEC,IAAYV,GAAMW,QAAQC,MAAM;AAEtC,SAAO;GACLX,YAAYH,EAAQG;GACpBY,aAAa;IAAEC,MAAM;IAAaC,MAAMf,GAAMW,QAAQI;IAAK;GAC3DC,cAAchB,GAAMiB;GACpBV;GACAG;GACAJ,WAAWP,EAAOO;GACpB;;CAEJ,CAAA"}
@@ -81,4 +81,4 @@ function d() {
81
81
  //#endregion
82
82
  export { d as component };
83
83
 
84
- //# sourceMappingURL=_projectId-DhLpIalx.mjs.map
84
+ //# sourceMappingURL=_projectId-BwLMEMGC.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_projectId-DhLpIalx.mjs","names":["Link","useLoaderData","Box","Stack","getServiceIndex","Trans","useLingui","ContentHeader","ServiceCardProps","title","links","label","to","ServiceCard","map","RouteComponent","crumbProject","availableServices","projectId","from","t","serviceIndex","base","cards","push","storageLinks","name","length","card","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Link, useLoaderData } from \"@tanstack/react-router\"\nimport { Box, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/\")({\n component: RouteComponent,\n})\n\ninterface ServiceCardProps {\n title: string\n links: { label: string; to: string }[]\n}\n\nfunction ServiceCard({ title, links }: ServiceCardProps) {\n return (\n <Box className=\"p-5\">\n <h3 className=\"text-theme-high mb-3 text-base font-semibold\">{title}</h3>\n <ul className=\"space-y-1.5\">\n {links.map(({ label, to }) => (\n <li key={label}>\n <Link to={to} className=\"text-theme-accent hover:text-theme-accent/80 text-sm\">\n {label}\n </Link>\n </li>\n ))}\n </ul>\n </Box>\n )\n}\n\nfunction RouteComponent() {\n const { crumbProject, availableServices, projectId } = useLoaderData({\n from: \"/_auth/projects/$projectId\",\n })\n const { t } = useLingui()\n\n const serviceIndex = getServiceIndex(availableServices ?? [])\n const base = `/projects/${projectId}`\n\n const cards: ServiceCardProps[] = []\n\n if (serviceIndex[\"image\"]?.[\"glance\"] || serviceIndex[\"compute\"]?.[\"nova\"]) {\n const links: { label: string; to: string }[] = []\n if (serviceIndex[\"image\"]?.[\"glance\"]) links.push({ label: \"Images\", to: `${base}/compute/images` })\n if (serviceIndex[\"compute\"]?.[\"nova\"]) links.push({ label: \"Flavors\", to: `${base}/compute/flavors` })\n cards.push({ title: \"Compute\", links })\n }\n\n if (serviceIndex[\"network\"]) {\n cards.push({\n title: \"Network\",\n links: [\n { label: \"Security Groups\", to: `${base}/network/securitygroups` },\n { label: \"Floating IPs\", to: `${base}/network/floatingips` },\n ],\n })\n }\n\n // Storage section - always show Ceph, optionally add Swift\n const storageLinks: { label: string; to: string }[] = []\n if (serviceIndex[\"object-store\"]?.[\"swift\"]) {\n storageLinks.push({ label: \"Swift\", to: `${base}/storage/swift/containers` })\n }\n storageLinks.push({ label: \"Ceph\", to: `${base}/storage/ceph/containers` })\n cards.push({ title: \"Storage\", links: storageLinks })\n\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n if (serviceIndex[\"pca\"]?.[\"clavis-dev\"] || serviceIndex[\"pca\"]?.[\"clavis-beta\"]) {\n cards.push({\n title: \"Services\",\n links: [{ label: \"PCA (Clavis)\", to: `${base}/services/pca` }],\n })\n }\n\n return (\n <Stack direction=\"vertical\" gap=\"6\" className=\"pb-4\">\n <ContentHeader title={crumbProject?.name ?? t`Project`} projectId={projectId} />\n {cards.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {cards.map((card) => (\n <ServiceCard key={card.title} {...card} />\n ))}\n </div>\n ) : (\n <p className=\"text-theme-light text-sm\">\n <Trans>No services available for this project.</Trans>\n </p>\n )}\n </Stack>\n )\n}\n"],"mappings":";;;;;;;AAgBA,SAASa,EAAY,EAAEJ,UAAOC,YAAyB;AACrD,QACE,kBAAC,GAAA;EAAI,WAAU;aACb,kBAAC,MAAA;GAAG,WAAU;aAAgDD;MAC9D,kBAAC,MAAA;GAAG,WAAU;aACXC,EAAMI,KAAK,EAAEH,UAAOC,YACnB,kBAAC,MAAA,EAAA,UACC,kBAAC,GAAA;IAASA;IAAI,WAAU;cACrBD;SAFIA,EAAAA,CAAAA;;;;AAWnB,SAASI,IAAAA;CACP,IAAM,EAAEC,iBAAcC,sBAAmBC,iBAAcjB,EAAc,EACnEkB,MAAM,8BACR,CAAA,EACM,EAAA,MAAA,GAAA,GAAA,MAAQb,GAAAA,EAERe,IAAejB,EAAgBa,KAAqB,EAAE,CAAA,EACtDK,IAAO,aAAaJ,KAEpBK,IAA4B,EAAE;AAEpC,KAAIF,EAAa,OAAW,UAAaA,EAAa,SAAa,MAAS;EAC1E,IAAMX,IAAyC,EAAE;AAGjDa,EAFIF,EAAa,OAAW,UAAWX,EAAMc,KAAK;GAAEb,OAAO;GAAUC,IAAI,GAAGU,EAAI;GAAkB,CAAA,EAC9FD,EAAa,SAAa,QAASX,EAAMc,KAAK;GAAEb,OAAO;GAAWC,IAAI,GAAGU,EAAI;GAAmB,CAAA,EACpGC,EAAMC,KAAK;GAAEf,OAAO;GAAWC;GAAM,CAAA;;AAGvC,CAAIW,EAAa,WACfE,EAAMC,KAAK;EACTf,OAAO;EACPC,OAAO,CACL;GAAEC,OAAO;GAAmBC,IAAI,GAAGU,EAAI;GAA0B,EACjE;GAAEX,OAAO;GAAgBC,IAAI,GAAGU,EAAI;GAAuB,CAAC;EAEhE,CAAA;CAIF,IAAMG,IAAgD,EAAE;AAexD,QAdIJ,EAAa,iBAAkB,SACjCI,EAAaD,KAAK;EAAEb,OAAO;EAASC,IAAI,GAAGU,EAAI;EAA4B,CAAA,EAE7EG,EAAaD,KAAK;EAAEb,OAAO;EAAQC,IAAI,GAAGU,EAAI;EAA2B,CAAA,EACzEC,EAAMC,KAAK;EAAEf,OAAO;EAAWC,OAAOe;EAAa,CAAA,GAG/CJ,EAAa,MAAS,iBAAiBA,EAAa,MAAS,mBAC/DE,EAAMC,KAAK;EACTf,OAAO;EACPC,OAAO,CAAC;GAAEC,OAAO;GAAgBC,IAAI,GAAGU,EAAI;GAAgB,CAAC;EAC/D,CAAA,EAIA,kBAAC,GAAA;EAAM,WAAU;EAAW,KAAI;EAAI,WAAU;aAC5C,kBAAC,GAAA;GAAc,OAAON,GAAcU,QAAQN,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA;GAAsBF;MAClEK,EAAMI,SAAS,IACd,kBAAC,OAAA;GAAI,WAAU;aACZJ,EAAMT,KAAKc,MACV,kBAAC,GAAA,EAA6B,GAAIA,GAAAA,EAAhBA,EAAKnB,MAAK,CAAA;OAIhC,kBAAC,KAAA;GAAE,WAAU;aACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
1
+ {"version":3,"file":"_projectId-BwLMEMGC.mjs","names":["Link","useLoaderData","Box","Stack","getServiceIndex","Trans","useLingui","ContentHeader","ServiceCardProps","title","links","label","to","ServiceCard","map","RouteComponent","crumbProject","availableServices","projectId","from","t","serviceIndex","base","cards","push","storageLinks","name","length","card","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Link, useLoaderData } from \"@tanstack/react-router\"\nimport { Box, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/\")({\n component: RouteComponent,\n})\n\ninterface ServiceCardProps {\n title: string\n links: { label: string; to: string }[]\n}\n\nfunction ServiceCard({ title, links }: ServiceCardProps) {\n return (\n <Box className=\"p-5\">\n <h3 className=\"text-theme-high mb-3 text-base font-semibold\">{title}</h3>\n <ul className=\"space-y-1.5\">\n {links.map(({ label, to }) => (\n <li key={label}>\n <Link to={to} className=\"text-theme-accent hover:text-theme-accent/80 text-sm\">\n {label}\n </Link>\n </li>\n ))}\n </ul>\n </Box>\n )\n}\n\nfunction RouteComponent() {\n const { crumbProject, availableServices, projectId } = useLoaderData({\n from: \"/_auth/projects/$projectId\",\n })\n const { t } = useLingui()\n\n const serviceIndex = getServiceIndex(availableServices ?? [])\n const base = `/projects/${projectId}`\n\n const cards: ServiceCardProps[] = []\n\n if (serviceIndex[\"image\"]?.[\"glance\"] || serviceIndex[\"compute\"]?.[\"nova\"]) {\n const links: { label: string; to: string }[] = []\n if (serviceIndex[\"image\"]?.[\"glance\"]) links.push({ label: \"Images\", to: `${base}/compute/images` })\n if (serviceIndex[\"compute\"]?.[\"nova\"]) links.push({ label: \"Flavors\", to: `${base}/compute/flavors` })\n cards.push({ title: \"Compute\", links })\n }\n\n if (serviceIndex[\"network\"]) {\n cards.push({\n title: \"Network\",\n links: [\n { label: \"Security Groups\", to: `${base}/network/securitygroups` },\n { label: \"Floating IPs\", to: `${base}/network/floatingips` },\n ],\n })\n }\n\n // Storage section - always show Ceph, optionally add Swift\n const storageLinks: { label: string; to: string }[] = []\n if (serviceIndex[\"object-store\"]?.[\"swift\"]) {\n storageLinks.push({ label: \"Swift\", to: `${base}/storage/swift/containers` })\n }\n storageLinks.push({ label: \"Ceph\", to: `${base}/storage/ceph/containers` })\n cards.push({ title: \"Storage\", links: storageLinks })\n\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n if (serviceIndex[\"pca\"]?.[\"clavis-dev\"] || serviceIndex[\"pca\"]?.[\"clavis-beta\"]) {\n cards.push({\n title: \"Services\",\n links: [{ label: \"PCA (Clavis)\", to: `${base}/services/pca` }],\n })\n }\n\n return (\n <Stack direction=\"vertical\" gap=\"6\" className=\"pb-4\">\n <ContentHeader title={crumbProject?.name ?? t`Project`} projectId={projectId} />\n {cards.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {cards.map((card) => (\n <ServiceCard key={card.title} {...card} />\n ))}\n </div>\n ) : (\n <p className=\"text-theme-light text-sm\">\n <Trans>No services available for this project.</Trans>\n </p>\n )}\n </Stack>\n )\n}\n"],"mappings":";;;;;;;AAgBA,SAASa,EAAY,EAAEJ,UAAOC,YAAyB;AACrD,QACE,kBAAC,GAAA;EAAI,WAAU;aACb,kBAAC,MAAA;GAAG,WAAU;aAAgDD;MAC9D,kBAAC,MAAA;GAAG,WAAU;aACXC,EAAMI,KAAK,EAAEH,UAAOC,YACnB,kBAAC,MAAA,EAAA,UACC,kBAAC,GAAA;IAASA;IAAI,WAAU;cACrBD;SAFIA,EAAAA,CAAAA;;;;AAWnB,SAASI,IAAAA;CACP,IAAM,EAAEC,iBAAcC,sBAAmBC,iBAAcjB,EAAc,EACnEkB,MAAM,8BACR,CAAA,EACM,EAAA,MAAA,GAAA,GAAA,MAAQb,GAAAA,EAERe,IAAejB,EAAgBa,KAAqB,EAAE,CAAA,EACtDK,IAAO,aAAaJ,KAEpBK,IAA4B,EAAE;AAEpC,KAAIF,EAAa,OAAW,UAAaA,EAAa,SAAa,MAAS;EAC1E,IAAMX,IAAyC,EAAE;AAGjDa,EAFIF,EAAa,OAAW,UAAWX,EAAMc,KAAK;GAAEb,OAAO;GAAUC,IAAI,GAAGU,EAAI;GAAkB,CAAA,EAC9FD,EAAa,SAAa,QAASX,EAAMc,KAAK;GAAEb,OAAO;GAAWC,IAAI,GAAGU,EAAI;GAAmB,CAAA,EACpGC,EAAMC,KAAK;GAAEf,OAAO;GAAWC;GAAM,CAAA;;AAGvC,CAAIW,EAAa,WACfE,EAAMC,KAAK;EACTf,OAAO;EACPC,OAAO,CACL;GAAEC,OAAO;GAAmBC,IAAI,GAAGU,EAAI;GAA0B,EACjE;GAAEX,OAAO;GAAgBC,IAAI,GAAGU,EAAI;GAAuB,CAAC;EAEhE,CAAA;CAIF,IAAMG,IAAgD,EAAE;AAexD,QAdIJ,EAAa,iBAAkB,SACjCI,EAAaD,KAAK;EAAEb,OAAO;EAASC,IAAI,GAAGU,EAAI;EAA4B,CAAA,EAE7EG,EAAaD,KAAK;EAAEb,OAAO;EAAQC,IAAI,GAAGU,EAAI;EAA2B,CAAA,EACzEC,EAAMC,KAAK;EAAEf,OAAO;EAAWC,OAAOe;EAAa,CAAA,GAG/CJ,EAAa,MAAS,iBAAiBA,EAAa,MAAS,mBAC/DE,EAAMC,KAAK;EACTf,OAAO;EACPC,OAAO,CAAC;GAAEC,OAAO;GAAgBC,IAAI,GAAGU,EAAI;GAAgB,CAAC;EAC/D,CAAA,EAIA,kBAAC,GAAA;EAAM,WAAU;EAAW,KAAI;EAAI,WAAU;aAC5C,kBAAC,GAAA;GAAc,OAAON,GAAcU,QAAQN,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA;GAAsBF;MAClEK,EAAMI,SAAS,IACd,kBAAC,OAAA;GAAI,WAAU;aACZJ,EAAMT,KAAKc,MACV,kBAAC,GAAA,EAA6B,GAAIA,GAAAA,EAAhBA,EAAKnB,MAAK,CAAA;OAIhC,kBAAC,KAAA;GAAE,WAAU;aACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { D as e, K as t, V as n, X as r, g as i, k as a, nt as o, z as s } from "./build-BJDfnAyi.mjs";
2
- import { t as c } from "./_projectId-Dj_InfSc.mjs";
2
+ import { t as c } from "./_projectId-5NiasyXm.mjs";
3
3
  import { t as l } from "./helpers--JWXi40U.mjs";
4
4
  import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
5
5
  import { useEffect as p, useMemo as m, useRef as h, useState as g } from "react";
@@ -198,7 +198,7 @@ var j = ({ projectId: e, projectName: r, availableServices: i }) => {
198
198
  function M({ projectInfo: t }) {
199
199
  let { i18n: n, _: i } = w(), a = x(), o = b(), { projectId: s } = S({ strict: !1 });
200
200
  return /* @__PURE__ */ d(r, {
201
- className: "mt-8 mb-4",
201
+ className: "relative z-1 mt-8 mb-4",
202
202
  children: m(() => {
203
203
  let e = {
204
204
  Compute: n._({ id: "rp0Bd0" }),
@@ -313,4 +313,4 @@ function N() {
313
313
  //#endregion
314
314
  export { N as component };
315
315
 
316
- //# sourceMappingURL=_projectId-D1gGribM.mjs.map
316
+ //# sourceMappingURL=_projectId-D35MN1kY.mjs.map