@cobaltcore-dev/aurora 0.2.1 → 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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cobaltcore-dev/aurora",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "private": false,
5
5
  "description": "Aurora OpenStack dashboard — server and client library",
6
6
  "license": "Apache-2.0",
@@ -109,8 +109,8 @@
109
109
  "vite-plugin-svgr": "^5.0.0",
110
110
  "vite-tsconfig-paths": "^6.1.1",
111
111
  "vitest": "^4.1.2",
112
- "@cobaltcore-dev/policy-engine": "2.0.0",
113
112
  "@cobaltcore-dev/aurora-config": "0.0.1",
113
+ "@cobaltcore-dev/policy-engine": "2.0.0",
114
114
  "@cobaltcore-dev/signal-openstack": "1.0.0"
115
115
  },
116
116
  "scripts": {
@@ -1,242 +0,0 @@
1
- import { $ as e, A as t, B as n, K as r, N as i, O as a, P as o, T as s, V as c, W as l, Y as u, j as d, l as f, tt as p, z as m } from "./build-Cf7iWbpH.mjs";
2
- import { r as h } from "./trpcClient-BxguzNYF.mjs";
3
- import { t as g } from "./_pcaId-DWHfvMhT.mjs";
4
- import { i as _, s as v } from "./md-BivyCkGC.mjs";
5
- import { t as y } from "./useModal-DxxlilRm.mjs";
6
- import { t as b } from "./useProjectId-CgOTejka.mjs";
7
- import "./hooks-D0krAKvo.mjs";
8
- import { r as x, t as S } from "./constants-CCgR6fKI.mjs";
9
- import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
10
- import { Fragment as E } from "react";
11
- import { useNavigate as D } from "@tanstack/react-router";
12
- import { Trans as O, useLingui as k } from "@lingui/react";
13
- //#region src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-table/PcaCertificatesTableRow.tsx
14
- var A = ({ certificate: e }) => {
15
- let { i18n: n, _: r } = k(), a = D();
16
- return /* @__PURE__ */ T(i, {
17
- "data-testid": `pca-certificate-row-${e.id}`,
18
- onClick: () => a({
19
- from: "/projects/$projectId/services/pca/$pcaId/",
20
- to: "$certificateId",
21
- params: (t) => ({
22
- ...t,
23
- certificateId: e.id
24
- })
25
- }),
26
- children: [
27
- /* @__PURE__ */ w(t, { children: e.certificate_authority_id }),
28
- /* @__PURE__ */ w(t, { children: e.id }),
29
- /* @__PURE__ */ w(t, {
30
- onClick: (e) => e.stopPropagation(),
31
- className: "items-end pr-0",
32
- children: /* @__PURE__ */ w(u, { children: /* @__PURE__ */ w(s, { children: /* @__PURE__ */ w(l, {
33
- label: n._({ id: "WIx31g" }),
34
- disabled: !0
35
- }) }) })
36
- })
37
- ]
38
- }, e.id);
39
- }, j = ({ pcaId: n }) => {
40
- let { i18n: o, _: s } = k(), l = b(), u = () => [
41
- o._({ id: "c1OE1x" }),
42
- o._({ id: "S0kLOH" }),
43
- ""
44
- ], { data: d = [], isLoading: p, isError: g, error: _ } = h.services.pca.listCertificates.useQuery({
45
- project_id: l,
46
- certificate_authority_id: n
47
- });
48
- return p ? /* @__PURE__ */ T(e, {
49
- className: "py-8",
50
- distribution: "center",
51
- alignment: "center",
52
- direction: "vertical",
53
- children: [/* @__PURE__ */ w(r, {
54
- variant: "primary",
55
- size: "large",
56
- className: "mb-2"
57
- }), /* @__PURE__ */ w(O, { id: "T9o/az" })]
58
- }) : g ? /* @__PURE__ */ w(e, {
59
- className: "py-8",
60
- distribution: "center",
61
- alignment: "center",
62
- direction: "vertical",
63
- children: _?.message ?? o._({ id: "hz9da7" })
64
- }) : d.length === 0 ? /* @__PURE__ */ w(m, {
65
- columns: u().length,
66
- className: "pca-certificates",
67
- "data-testid": "no-pcas-certificates",
68
- children: /* @__PURE__ */ w(i, { children: /* @__PURE__ */ T(t, {
69
- colSpan: u().length,
70
- children: [/* @__PURE__ */ w(a, { children: /* @__PURE__ */ w(O, { id: "kNeZrV" }) }), /* @__PURE__ */ w("p", { children: /* @__PURE__ */ w(O, { id: "7huC4O" }) })]
71
- }) })
72
- }) : /* @__PURE__ */ T("div", {
73
- className: "relative",
74
- children: [/* @__PURE__ */ w(f, {
75
- variant: "primary",
76
- label: o._({ id: "BMogtG" }),
77
- disabled: !0
78
- }), /* @__PURE__ */ T(m, {
79
- columns: u().length,
80
- children: [/* @__PURE__ */ w(i, { children: u().map((e) => /* @__PURE__ */ w(c, { children: e }, e)) }), d.map((e) => /* @__PURE__ */ w(A, { certificate: e }, e.id))]
81
- })]
82
- });
83
- }, M = ({ pca: t }) => {
84
- let { i18n: r, _: i } = k(), a = D(), s = b(), [c, l] = y(!1), u = () => a({
85
- to: "/projects/$projectId/services/pca",
86
- params: { projectId: s }
87
- }), m = [
88
- {
89
- label: r._({ id: "c1OE1x" }),
90
- value: t.id
91
- },
92
- {
93
- label: r._({ id: "mSfwLL" }),
94
- value: t.project_id
95
- },
96
- {
97
- label: r._({ id: "UJmAAK" }),
98
- value: t.configuration?.subject?.common_name
99
- },
100
- {
101
- label: r._({ id: "UbWeJA" }),
102
- value: t.certificate?.validity.not_before !== void 0 && t.certificate?.validity.not_after !== void 0 ? `${Math.round((t.certificate.validity.not_after - t.certificate.validity.not_before) / (3600 * 24))} days` : void 0
103
- }
104
- ];
105
- return /* @__PURE__ */ T(C, { children: [
106
- /* @__PURE__ */ T(e, {
107
- direction: "vertical",
108
- gap: "3",
109
- children: [
110
- /* @__PURE__ */ T(e, {
111
- direction: "horizontal",
112
- distribution: "between",
113
- children: [/* @__PURE__ */ T(e, {
114
- gap: "2",
115
- alignment: "center",
116
- children: [/* @__PURE__ */ w("div", {
117
- className: "text-theme-default text-2xl font-semibold",
118
- children: `${t.configuration?.subject?.common_name} Certificate Authority Details`
119
- }), /* @__PURE__ */ T("div", {
120
- className: "bg-aurora-blue-200 flex items-center gap-1 rounded-sm px-1 py-0.5",
121
- children: [
122
- S[t.state].icon,
123
- " ",
124
- S[t.state].text
125
- ]
126
- })]
127
- }), /* @__PURE__ */ w(f, {
128
- onClick: l,
129
- children: /* @__PURE__ */ w(O, { id: "Blsc/x" })
130
- })]
131
- }),
132
- /* @__PURE__ */ w("p", {
133
- className: "text-theme-highest text-sm",
134
- children: /* @__PURE__ */ w(O, { id: "dxMaZH" })
135
- }),
136
- /* @__PURE__ */ T(e, {
137
- gap: "4",
138
- className: "grid grid-cols-2 items-start",
139
- children: [/* @__PURE__ */ w(n, {
140
- alignTerms: "right",
141
- className: "w-full",
142
- children: m.map(({ label: e, value: t }) => /* @__PURE__ */ T(E, { children: [/* @__PURE__ */ w(d, { children: e }), /* @__PURE__ */ w(o, { children: t || "—" })] }, e))
143
- }), /* @__PURE__ */ T("div", {
144
- className: "bg-dt-background w-full rounded-sm",
145
- children: [
146
- /* @__PURE__ */ T("div", {
147
- className: "text-theme-default p-4 text-xl font-bold",
148
- children: ["Certificate ", `${t.configuration?.subject?.common_name}`]
149
- }),
150
- /* @__PURE__ */ w(p, {}),
151
- /* @__PURE__ */ w("div", {
152
- className: "p-4 text-sm break-all whitespace-pre-wrap",
153
- children: t?.csr
154
- }),
155
- /* @__PURE__ */ w(p, {}),
156
- /* @__PURE__ */ T(e, {
157
- gap: "2",
158
- distribution: "end",
159
- className: "p-4",
160
- children: [/* @__PURE__ */ w(f, { children: /* @__PURE__ */ w(v, {}) }), /* @__PURE__ */ w(f, { children: /* @__PURE__ */ w(_, {}) })]
161
- })
162
- ]
163
- })]
164
- })
165
- ]
166
- }),
167
- c && /* @__PURE__ */ w(x, {
168
- pca: t,
169
- open: c,
170
- onClose: l,
171
- onSuccess: u
172
- }),
173
- /* @__PURE__ */ w(j, { pcaId: t.id })
174
- ] });
175
- };
176
- //#endregion
177
- //#region src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx?tsr-split=component
178
- function N() {
179
- let t = D(), n = b(), { pcaId: i } = g.useParams(), { isLoading: a, isError: o, error: s, data: c } = h.services.pca.getById.useQuery({
180
- project_id: n,
181
- certificate_authority_id: i
182
- });
183
- if (a) return /* @__PURE__ */ T(e, {
184
- className: "fixed inset-0",
185
- distribution: "center",
186
- alignment: "center",
187
- direction: "vertical",
188
- children: [/* @__PURE__ */ w(r, {
189
- variant: "primary",
190
- size: "large",
191
- className: "mb-2"
192
- }), /* @__PURE__ */ w(O, { id: "og1m+J" })]
193
- });
194
- let l = () => t({
195
- to: "/projects/$projectId/services/pca",
196
- params: { projectId: n }
197
- });
198
- if (o) {
199
- let t = s?.message || "Unknown error";
200
- return /* @__PURE__ */ T(e, {
201
- className: "fixed inset-0",
202
- distribution: "center",
203
- alignment: "center",
204
- direction: "vertical",
205
- gap: "5",
206
- children: [
207
- /* @__PURE__ */ w("p", {
208
- className: "text-theme-error font-semibold",
209
- children: /* @__PURE__ */ w(O, { id: "IQSLN+" })
210
- }),
211
- /* @__PURE__ */ w("p", {
212
- className: "text-theme-highest",
213
- children: t
214
- }),
215
- /* @__PURE__ */ w(f, {
216
- onClick: l,
217
- variant: "primary",
218
- children: /* @__PURE__ */ w(O, { id: "HG0uMz" })
219
- })
220
- ]
221
- });
222
- }
223
- return c ? /* @__PURE__ */ w(M, { pca: c }) : /* @__PURE__ */ T(e, {
224
- className: "fixed inset-0",
225
- distribution: "center",
226
- alignment: "center",
227
- direction: "vertical",
228
- gap: "5",
229
- children: [/* @__PURE__ */ w("p", {
230
- className: "text-theme-secondary",
231
- children: /* @__PURE__ */ w(O, { id: "Io2Dvq" })
232
- }), /* @__PURE__ */ w(f, {
233
- onClick: l,
234
- variant: "primary",
235
- children: /* @__PURE__ */ w(O, { id: "HG0uMz" })
236
- })]
237
- });
238
- }
239
- //#endregion
240
- export { N as component };
241
-
242
- //# sourceMappingURL=_pcaId-r2BTjN9y.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_pcaId-r2BTjN9y.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","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","trpcReact","useProjectId","PcaCertificatesTableRow","PcaCertificatesListContainer","pcaId","useLingui","projectId","columns","t","data","pcaCertificates","isLoading","isError","error","services","pca","listCertificates","useQuery","project_id","certificate_authority_id","className","distribution","alignment","direction","variant","size","message","length","data-testid","colSpan","p","div","label","disabled","map","certificate","id","Fragment","MdDownload","MdContentCopy","useNavigate","Button","DescriptionDefinition","DescriptionList","DescriptionTerm","Divider","Stack","useProjectId","useModal","DeletePcaModal","STATE_CONFIG","PcaCertificatesListContainer","PcaDetailsView","pca","useLingui","navigate","projectId","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","open","onClose","onSuccess","pcaId","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/PcaCertificatesListContainer.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 { 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 { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { PcaCertificatesTableRow } from \"./-table/PcaCertificatesTableRow\"\n\ninterface PcaCertificatesListContainerProps {\n pcaId: string\n}\n\nexport const PcaCertificatesListContainer = ({ pcaId }: PcaCertificatesListContainerProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\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 if (pcaCertificates.length === 0) {\n return (\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 }\n\n return (\n <div className=\"relative\">\n {/* I will enable this button on issue-certificate task of the EPIC */}\n <Button variant=\"primary\" label={t`Issue End Entity Certificate`} disabled />\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 </div>\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\"\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 [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 <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 {deletePcaModalOpen && (\n <DeletePcaModal\n pca={pca}\n open={deletePcaModalOpen}\n onClose={toggleDeletePcaModal}\n onSuccess={navigateToPcaList}\n />\n )}\n\n <PcaCertificatesListContainer pcaId={pca.id} />\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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"}