@cobaltcore-dev/aurora 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -77
- package/dist/client/AuroraApp.d.ts +15 -0
- package/dist/client/{AuthProvider-D-5Jpa6F.mjs → AuthProvider-Co4d0WzB.mjs} +3 -3
- package/dist/client/{AuthProvider-D-5Jpa6F.mjs.map → AuthProvider-Co4d0WzB.mjs.map} +1 -1
- package/dist/client/{ContentHeader-BXZoN3B9.mjs → ContentHeader-xQVhO2yT.mjs} +20 -20
- package/dist/client/{ContentHeader-BXZoN3B9.mjs.map → ContentHeader-xQVhO2yT.mjs.map} +1 -1
- package/dist/client/{DeleteFlavorModal-BusYn32r.mjs → DeleteFlavorModal-CHTUZ3YV.mjs} +211 -202
- package/dist/client/DeleteFlavorModal-CHTUZ3YV.mjs.map +1 -0
- package/dist/client/{EditSecurityGroupModal-Dl6m7wUe.mjs → EditSecurityGroupModal-CWHHx2Xk.mjs} +22 -22
- package/dist/client/{EditSecurityGroupModal-Dl6m7wUe.mjs.map → EditSecurityGroupModal-CWHHx2Xk.mjs.map} +1 -1
- package/dist/client/{FiltersInput-BgNaHFBt.mjs → FiltersInput-UKJpNFdr.mjs} +11 -11
- package/dist/client/FiltersInput-UKJpNFdr.mjs.map +1 -0
- package/dist/client/{FloatingIpActionModals-By2hXR9m.mjs → FloatingIpActionModals-caXn6bYo.mjs} +54 -54
- package/dist/client/{FloatingIpActionModals-By2hXR9m.mjs.map → FloatingIpActionModals-caXn6bYo.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-fHI8jB2j.mjs → ImageToastNotifications-BWimIzu_.mjs} +227 -227
- package/dist/client/{ImageToastNotifications-fHI8jB2j.mjs.map → ImageToastNotifications-BWimIzu_.mjs.map} +1 -1
- package/dist/client/{RouteError-pDEWC_k7.mjs → RouteError-CUj_m3gu.mjs} +6 -6
- package/dist/client/{RouteError-pDEWC_k7.mjs.map → RouteError-CUj_m3gu.mjs.map} +1 -1
- package/dist/client/{SortInput-DXWSqSny.mjs → SortInput-GQlQBlAj.mjs} +6 -6
- package/dist/client/{SortInput-DXWSqSny.mjs.map → SortInput-GQlQBlAj.mjs.map} +1 -1
- package/dist/client/{_auth-CJj1Cnbm.mjs → _auth-DXJkv9QO.mjs} +3 -3
- package/dist/client/{_auth-CJj1Cnbm.mjs.map → _auth-DXJkv9QO.mjs.map} +1 -1
- package/dist/client/_flavorId-C5dc1N_j.mjs +194 -0
- package/dist/client/_flavorId-C5dc1N_j.mjs.map +1 -0
- package/dist/client/{_flavorId-BoNcxYmF.mjs → _flavorId-sUWG0xuy.mjs} +15 -15
- package/dist/client/_flavorId-sUWG0xuy.mjs.map +1 -0
- package/dist/client/{_floatingIpId-BpUfL8Im2.mjs → _floatingIpId-COK_TBrz2.mjs} +42 -42
- package/dist/client/{_floatingIpId-BpUfL8Im2.mjs.map → _floatingIpId-COK_TBrz2.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-CwHiXazi.mjs → _floatingIpId-CT4y-60o.mjs} +3 -3
- package/dist/client/{_floatingIpId-CwHiXazi.mjs.map → _floatingIpId-CT4y-60o.mjs.map} +1 -1
- package/dist/client/_imageId-n3RcnhAR.mjs +534 -0
- package/dist/client/_imageId-n3RcnhAR.mjs.map +1 -0
- package/dist/client/_pcaId-B-f_6kqs.mjs +466 -0
- package/dist/client/_pcaId-B-f_6kqs.mjs.map +1 -0
- package/dist/client/{_pcaId-D1ZEaCdp.mjs → _pcaId-ChnM_t-9.mjs} +3 -3
- package/dist/client/{_pcaId-D1ZEaCdp.mjs.map → _pcaId-ChnM_t-9.mjs.map} +1 -1
- package/dist/client/_projectId-26bw-_rm.mjs +46 -0
- package/dist/client/_projectId-26bw-_rm.mjs.map +1 -0
- package/dist/client/{_projectId-DhLpIalx.mjs → _projectId-BK9UqeYw.mjs} +14 -14
- package/dist/client/{_projectId-DhLpIalx.mjs.map → _projectId-BK9UqeYw.mjs.map} +1 -1
- package/dist/client/{_projectId-D1gGribM.mjs → _projectId-CCtpAQ8m.mjs} +79 -96
- package/dist/client/_projectId-CCtpAQ8m.mjs.map +1 -0
- package/dist/client/{_projectId-OW2xkK43.mjs → _projectId-Dhb4AyBD.mjs} +3 -3
- package/dist/client/{_projectId-OW2xkK43.mjs.map → _projectId-Dhb4AyBD.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-B0llWH9A.mjs → _securityGroupId-CR1mKICQ.mjs} +3 -3
- package/dist/client/{_securityGroupId-B0llWH9A.mjs.map → _securityGroupId-CR1mKICQ.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-gbUnd5Wv.mjs → _securityGroupId-DroYG6cA.mjs} +254 -255
- package/dist/client/{_securityGroupId-gbUnd5Wv.mjs.map → _securityGroupId-DroYG6cA.mjs.map} +1 -1
- package/dist/client/about-969pIiZ9.mjs +92 -0
- package/dist/client/{about-DCe6LsKz.mjs.map → about-969pIiZ9.mjs.map} +1 -1
- package/dist/client/aurora-DDzsst74.mjs +19 -0
- package/dist/client/{aurora-CRcxVUCo.mjs.map → aurora-DDzsst74.mjs.map} +1 -1
- package/dist/client/{build-BJDfnAyi.mjs → build-DracvfrJ.mjs} +5 -5
- package/dist/client/{build-BJDfnAyi.mjs.map → build-DracvfrJ.mjs.map} +1 -1
- package/dist/client/{buildFilterParams-By33pG59.mjs → buildFilterParams-DoZzMKX9.mjs} +1 -1
- package/dist/client/{buildFilterParams-By33pG59.mjs.map → buildFilterParams-DoZzMKX9.mjs.map} +1 -1
- package/dist/client/{cn-C3laVXMm.mjs → cn-DM4Cy3jv.mjs} +1 -1
- package/dist/client/{cn-C3laVXMm.mjs.map → cn-DM4Cy3jv.mjs.map} +1 -1
- package/dist/client/{constants-CAjjRTo_.mjs → constants-4lVQXort.mjs} +22 -22
- package/dist/client/{constants-CAjjRTo_.mjs.map → constants-4lVQXort.mjs.map} +1 -1
- package/dist/client/{containers-NW7RnHTI.mjs → containers-DGY2hoWw.mjs} +3 -3
- package/dist/client/containers-DGY2hoWw.mjs.map +1 -0
- package/dist/client/containers-ZMFTRaQL.mjs +3277 -0
- package/dist/client/containers-ZMFTRaQL.mjs.map +1 -0
- package/dist/client/{containers-Ca5V1EBS.mjs → containers-xfsYgRyf.mjs} +2 -2
- package/dist/client/containers-xfsYgRyf.mjs.map +1 -0
- package/dist/client/{flavors-D8oElC2K.mjs → flavors-C4GtoybP.mjs} +2 -2
- package/dist/client/{flavors-D8oElC2K.mjs.map → flavors-C4GtoybP.mjs.map} +1 -1
- package/dist/client/{flavors-qvgPSI7J.mjs → flavors-CpirO_nr.mjs} +167 -148
- package/dist/client/flavors-CpirO_nr.mjs.map +1 -0
- package/dist/client/{flavors-BXPYAFyQ.mjs → flavors-DWMZ6TuJ.mjs} +2 -2
- package/dist/client/{flavors-BXPYAFyQ.mjs.map → flavors-DWMZ6TuJ.mjs.map} +1 -1
- package/dist/client/{floatingips-Be3zLoaD.mjs → floatingips-BUf_oLRl.mjs} +74 -75
- package/dist/client/{floatingips-Be3zLoaD.mjs.map → floatingips-BUf_oLRl.mjs.map} +1 -1
- package/dist/client/{formatBytes-D6oa0wU9.mjs → formatBytes-CZv_XyCY.mjs} +1 -1
- package/dist/client/{formatBytes-D6oa0wU9.mjs.map → formatBytes-CZv_XyCY.mjs.map} +1 -1
- package/dist/client/{helpers--JWXi40U.mjs → helpers-1PpYf-fC.mjs} +1 -1
- package/dist/client/{helpers--JWXi40U.mjs.map → helpers-1PpYf-fC.mjs.map} +1 -1
- package/dist/client/hooks-dSArr2Ca.mjs +2 -0
- package/dist/client/images-CsonlmFx.mjs +8 -0
- package/dist/client/images-CsonlmFx.mjs.map +1 -0
- package/dist/client/{images-CCYBAphP2.mjs → images-Da1t5KPh.mjs} +509 -536
- package/dist/client/images-Da1t5KPh.mjs.map +1 -0
- package/dist/client/{images-DM9I8G0p.mjs → images-NBf2bV43.mjs} +2 -2
- package/dist/client/images-NBf2bV43.mjs.map +1 -0
- package/dist/client/{images-BiEBENaj.mjs → images-QnWf63uj.mjs} +2 -2
- package/dist/client/{images-BiEBENaj.mjs.map → images-QnWf63uj.mjs.map} +1 -1
- package/dist/client/index.js +232 -236
- package/dist/client/index.js.map +1 -1
- package/dist/client/{md-BivyCkGC.mjs → md-sBiSNVSQ.mjs} +7 -7
- package/dist/client/{md-BivyCkGC.mjs.map → md-sBiSNVSQ.mjs.map} +1 -1
- package/dist/client/{network-nbSbl0X0.mjs → network-DuZm76BZ.mjs} +2 -2
- package/dist/client/{network-nbSbl0X0.mjs.map → network-DuZm76BZ.mjs.map} +1 -1
- package/dist/client/{objects-CU5ws07o.mjs → objects-B89dYCBq.mjs} +3 -3
- package/dist/client/objects-B89dYCBq.mjs.map +1 -0
- package/dist/client/{objects-GmuIOaHd.mjs → objects-CuFLUOe1.mjs} +2 -2
- package/dist/client/objects-CuFLUOe1.mjs.map +1 -0
- package/dist/client/objects-H0NN_Sja.mjs +5460 -0
- package/dist/client/objects-H0NN_Sja.mjs.map +1 -0
- package/dist/client/{pca-x9if8xU-.mjs → pca-C-UFjicP.mjs} +51 -51
- package/dist/client/pca-C-UFjicP.mjs.map +1 -0
- package/dist/client/{pca-DSM71LhW.mjs → pca-CtU6REww.mjs} +2 -2
- package/dist/client/{pca-DSM71LhW.mjs.map → pca-CtU6REww.mjs.map} +1 -1
- package/dist/client/{projects-B6BPo2Ar.mjs → projects-C-sjd9T5.mjs} +3 -3
- package/dist/client/{projects-B6BPo2Ar.mjs.map → projects-C-sjd9T5.mjs.map} +1 -1
- package/dist/client/{projects-CnmZIB2Q.mjs → projects-DNXsDnJM.mjs} +29 -25
- package/dist/client/projects-DNXsDnJM.mjs.map +1 -0
- package/dist/client/{projects-Bt0XptpG.mjs → projects-dhnQkuvV.mjs} +2 -2
- package/dist/client/{projects-Bt0XptpG.mjs.map → projects-dhnQkuvV.mjs.map} +1 -1
- package/dist/client/{projects-BilrmHLu.mjs → projects-yiK0HGSA.mjs} +2 -2
- package/dist/client/{projects-BilrmHLu.mjs.map → projects-yiK0HGSA.mjs.map} +1 -1
- package/dist/client/{securitygroups-BdzieS7Z.mjs → securitygroups-wHdrxZXd.mjs} +72 -73
- package/dist/client/{securitygroups-BdzieS7Z.mjs.map → securitygroups-wHdrxZXd.mjs.map} +1 -1
- package/dist/client/{trpcClient-BxguzNYF.mjs → trpcClient-BzPUgiM2.mjs} +1 -1
- package/dist/client/{trpcClient-BxguzNYF.mjs.map → trpcClient-BzPUgiM2.mjs.map} +1 -1
- package/dist/client/{useErrorTranslation-TZVwIAzq.mjs → useErrorTranslation-Dc0eE8Zt.mjs} +1 -1
- package/dist/client/{useErrorTranslation-TZVwIAzq.mjs.map → useErrorTranslation-Dc0eE8Zt.mjs.map} +1 -1
- package/dist/client/useListWithFiltering-DrgUwXef.mjs +157 -0
- package/dist/client/useListWithFiltering-DrgUwXef.mjs.map +1 -0
- package/dist/client/{useModal-DxxlilRm.mjs → useModal-DCs1OJh7.mjs} +1 -1
- package/dist/client/{useModal-DxxlilRm.mjs.map → useModal-DCs1OJh7.mjs.map} +1 -1
- package/dist/client/{useProjectId-CgOTejka.mjs → useProjectId-DBc5lpoU.mjs} +1 -1
- package/dist/client/{useProjectId-CgOTejka.mjs.map → useProjectId-DBc5lpoU.mjs.map} +1 -1
- package/dist/server/index.d.ts +7 -1
- package/dist/server/index.js +1363 -453
- package/package.json +7 -7
- package/dist/client/DeleteFlavorModal-BusYn32r.mjs.map +0 -1
- package/dist/client/FiltersInput-BgNaHFBt.mjs.map +0 -1
- package/dist/client/ListToolbar-BvtCo8dk.mjs +0 -129
- package/dist/client/ListToolbar-BvtCo8dk.mjs.map +0 -1
- package/dist/client/_flavorId-BRonXvCo.mjs +0 -188
- package/dist/client/_flavorId-BRonXvCo.mjs.map +0 -1
- package/dist/client/_flavorId-BoNcxYmF.mjs.map +0 -1
- package/dist/client/_imageId-CdOOJjw0.mjs +0 -527
- package/dist/client/_imageId-CdOOJjw0.mjs.map +0 -1
- package/dist/client/_pcaId-CwlH1Kvl.mjs +0 -369
- package/dist/client/_pcaId-CwlH1Kvl.mjs.map +0 -1
- package/dist/client/_projectId-D1gGribM.mjs.map +0 -1
- package/dist/client/_projectId-Dj_InfSc.mjs +0 -26
- package/dist/client/_projectId-Dj_InfSc.mjs.map +0 -1
- package/dist/client/about-DCe6LsKz.mjs +0 -92
- package/dist/client/aurora-CRcxVUCo.mjs +0 -19
- package/dist/client/containers-BuXUVb1N.mjs +0 -3031
- package/dist/client/containers-BuXUVb1N.mjs.map +0 -1
- package/dist/client/containers-Ca5V1EBS.mjs.map +0 -1
- package/dist/client/containers-NW7RnHTI.mjs.map +0 -1
- package/dist/client/flavors-qvgPSI7J.mjs.map +0 -1
- package/dist/client/hooks-D0krAKvo.mjs +0 -2
- package/dist/client/images-CCYBAphP2.mjs.map +0 -1
- package/dist/client/images-DM9I8G0p.mjs.map +0 -1
- package/dist/client/objects-CU5ws07o.mjs.map +0 -1
- package/dist/client/objects-FXN0VWLI.mjs +0 -4760
- package/dist/client/objects-FXN0VWLI.mjs.map +0 -1
- package/dist/client/objects-GmuIOaHd.mjs.map +0 -1
- package/dist/client/overview-B3gdnWTG.mjs +0 -15
- package/dist/client/overview-B3gdnWTG.mjs.map +0 -1
- package/dist/client/overview-DzYBiNfD.mjs +0 -15
- package/dist/client/overview-DzYBiNfD.mjs.map +0 -1
- package/dist/client/overview-EhfPY8Je.mjs +0 -15
- package/dist/client/overview-EhfPY8Je.mjs.map +0 -1
- package/dist/client/overview-XueZI4LQ.mjs +0 -173
- package/dist/client/overview-XueZI4LQ.mjs.map +0 -1
- package/dist/client/pca-x9if8xU-.mjs.map +0 -1
- package/dist/client/projects-CnmZIB2Q.mjs.map +0 -1
- package/dist/client/useListWithFiltering-CqQbAjEe.mjs +0 -32
- package/dist/client/useListWithFiltering-CqQbAjEe.mjs.map +0 -1
- package/permission_policies/compute.yaml +0 -975
- package/permission_policies/image.yaml +0 -71
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { j as e } from "./build-
|
|
1
|
+
import { j as e } from "./build-DracvfrJ.mjs";
|
|
2
2
|
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
3
|
import { useLingui as r } from "@lingui/react";
|
|
4
4
|
//#region src/client/components/Error/RouteError.tsx
|
|
5
5
|
function i({ error: i, title: a, helpText: o, safeErrorMessage: s }) {
|
|
6
6
|
let { i18n: c, _: l } = r(), u = c._({ id: "Gfx1qQ" }), d = c._({ id: "K9eC8x" }), f = c._({ id: "lxentK" }), p = s || (typeof i == "string" ? i : null) || (i && typeof i == "object" && "safeMessage" in i && typeof i.safeMessage == "string" ? i.safeMessage : null) || f;
|
|
7
|
-
return
|
|
7
|
+
return /*#__PURE__*/ n("div", {
|
|
8
8
|
className: "flex min-h-100 flex-col space-y-2 p-8",
|
|
9
9
|
children: [
|
|
10
|
-
|
|
10
|
+
/*#__PURE__*/ t(e, {
|
|
11
11
|
className: "text-theme-info",
|
|
12
12
|
children: a || u
|
|
13
13
|
}),
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/*#__PURE__*/ t("p", { children: p }),
|
|
15
|
+
/*#__PURE__*/ t("p", {
|
|
16
16
|
className: "text-theme-light text-sm",
|
|
17
17
|
children: o || d
|
|
18
18
|
})
|
|
@@ -22,4 +22,4 @@ function i({ error: i, title: a, helpText: o, safeErrorMessage: s }) {
|
|
|
22
22
|
//#endregion
|
|
23
23
|
export { i as t };
|
|
24
24
|
|
|
25
|
-
//# sourceMappingURL=RouteError-
|
|
25
|
+
//# sourceMappingURL=RouteError-CUj_m3gu.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteError-
|
|
1
|
+
{"version":3,"file":"RouteError-CUj_m3gu.mjs","names":["ContentHeading","RouteError","error","title","helpText","safeErrorMessage","useLingui","defaultTitle","t","defaultHelpText","defaultErrorMessage","errorMessage","safeMessage","div","className","p"],"sources":["../../src/client/components/Error/RouteError.tsx"],"sourcesContent":["import { ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { useLingui } from \"@lingui/react/macro\"\n\ninterface RouteErrorProps {\n error: unknown\n title?: string\n helpText?: string\n /** Explicitly pass a safe error message to display. Use this when you want to show specific error details. */\n safeErrorMessage?: string\n}\n\nexport function RouteError({ error, title, helpText, safeErrorMessage }: RouteErrorProps) {\n const { t } = useLingui()\n\n const defaultTitle = t`Unable to Load Content`\n const defaultHelpText = t`This could be due to insufficient permissions or a temporary service issue. Please check your access rights or try refreshing the page.`\n const defaultErrorMessage = t`An unexpected error occurred`\n\n // Security: Do not expose raw Error.message by default as it may contain sensitive information.\n // Only display:\n // 1. Explicitly passed safeErrorMessage\n // 2. String errors (when caller explicitly passes a safe string)\n // 3. error.safeMessage if present (for controlled error exposure)\n // 4. Default translated message for all other cases\n const errorMessage =\n safeErrorMessage ||\n (typeof error === \"string\" ? error : null) ||\n (error && typeof error === \"object\" && \"safeMessage\" in error && typeof error.safeMessage === \"string\"\n ? error.safeMessage\n : null) ||\n defaultErrorMessage\n\n return (\n <div className=\"flex min-h-100 flex-col space-y-2 p-8\">\n <ContentHeading className=\"text-theme-info\">{title || defaultTitle}</ContentHeading>\n <p>{errorMessage}</p>\n <p className=\"text-theme-light text-sm\">{helpText || defaultHelpText}</p>\n </div>\n )\n}\n"],"mappings":";;;;AAWA,SAAgBC,EAAW,EAAEC,UAAOC,UAAOC,aAAUC,uBAAmC;CACtF,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GAERC,IAAeC,EAAAA,EAAC,EAAA,IAAA,SAAuB,CAAA,GACvCC,IAAkBD,EAAAA,EAAC,EAAA,IAAA,SAAwI,CAAA,GAC3JE,IAAsBF,EAAAA,EAAC,EAAA,IAAA,SAA6B,CAAA,GAQpDG,IACJN,MACC,OAAOH,KAAU,WAAWA,IAAQ,UACpCA,KAAS,OAAOA,KAAU,YAAY,iBAAiBA,KAAS,OAAOA,EAAMU,eAAgB,WAC1FV,EAAMU,cACN,SACJF;CAEF,OACE,gBAACG,OAAAA;EAAIC,WAAU;;GACb,gBAACd,GAAAA;IAAec,WAAU;cAAmBX,KAASI;;GACtD,gBAACQ,KAAAA,EAAAA,UAAGJ,EAAAA,CAAAA;GACJ,gBAACI,KAAAA;IAAED,WAAU;cAA4BV,KAAYK;;;;AAG3D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { F as e, d as t, r as n, st as r } from "./build-
|
|
1
|
+
import { F as e, d as t, r as n, st as r } from "./build-DracvfrJ.mjs";
|
|
2
2
|
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
3
3
|
import { useLingui as o } from "@lingui/react";
|
|
4
4
|
//#region src/client/components/ListToolbar/SortInput.tsx
|
|
@@ -14,15 +14,15 @@ var s = ({ sortBy: s, onSortByChange: c, sortDirection: l, onSortDirectionChange
|
|
|
14
14
|
order: l,
|
|
15
15
|
onChange: u
|
|
16
16
|
});
|
|
17
|
-
return
|
|
17
|
+
return /*#__PURE__*/ a(r, {
|
|
18
18
|
className: "flex w-full items-end sm:w-auto",
|
|
19
|
-
children: [
|
|
19
|
+
children: [/*#__PURE__*/ i(n, {
|
|
20
20
|
...m(),
|
|
21
|
-
children: d.map((e) =>
|
|
21
|
+
children: d.map((e) => /*#__PURE__*/ i(t, {
|
|
22
22
|
value: e.value,
|
|
23
23
|
children: e.label
|
|
24
24
|
}, e.value))
|
|
25
|
-
}),
|
|
25
|
+
}), /*#__PURE__*/ i(e, {
|
|
26
26
|
...h(),
|
|
27
27
|
className: "shadow-none"
|
|
28
28
|
})]
|
|
@@ -31,4 +31,4 @@ var s = ({ sortBy: s, onSortByChange: c, sortDirection: l, onSortDirectionChange
|
|
|
31
31
|
//#endregion
|
|
32
32
|
export { s as t };
|
|
33
33
|
|
|
34
|
-
//# sourceMappingURL=SortInput-
|
|
34
|
+
//# sourceMappingURL=SortInput-GQlQBlAj.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SortInput-
|
|
1
|
+
{"version":3,"file":"SortInput-GQlQBlAj.mjs","names":["React","Select","SelectOption","SortButton","InputGroup","SortInput","sortBy","onSortByChange","sortDirection","onSortDirectionChange","options","useLingui","getSelectProps","className","onChange","value","label","t","getSortButtonProps","order","map","option"],"sources":["../../src/client/components/ListToolbar/SortInput.tsx"],"sourcesContent":["import React from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n Select,\n SelectOption,\n SortButton,\n InputGroup,\n SelectProps,\n ButtonProps,\n} from \"@cloudoperators/juno-ui-components\"\nimport { SortOption } from \"./types\"\n\nexport interface SortInputProps {\n sortBy?: string | number | string[]\n onSortByChange: (param?: string | number | string[]) => void\n sortDirection: \"asc\" | \"desc\"\n onSortDirectionChange: (direction: \"asc\" | \"desc\") => void\n options: SortOption[]\n}\n\nexport const SortInput: React.FC<SortInputProps> = ({\n sortBy,\n onSortByChange,\n sortDirection,\n onSortDirectionChange,\n options,\n}) => {\n const { t } = useLingui()\n\n const getSelectProps = (): SelectProps & { \"data-testid\"?: string } => ({\n className: \"flex-grow\",\n onChange: onSortByChange,\n value: sortBy,\n \"data-testid\": \"sort-select\",\n label: t`Sort by`,\n })\n\n const getSortButtonProps = (): Omit<ButtonProps, \"onChange\"> & {\n \"data-testid\"?: string\n order: \"asc\" | \"desc\"\n onChange: (order: \"asc\" | \"desc\") => void\n } => ({\n \"data-testid\": \"direction-toggle\",\n order: sortDirection,\n onChange: onSortDirectionChange,\n })\n\n return (\n <InputGroup className=\"flex w-full items-end sm:w-auto\">\n <Select {...getSelectProps()}>\n {options.map((option) => (\n <SelectOption key={option.value} value={option.value}>\n {option.label}\n </SelectOption>\n ))}\n </Select>\n <SortButton {...getSortButtonProps()} className=\"shadow-none\" />\n </InputGroup>\n )\n}\n"],"mappings":";;;;AAoBA,IAAaK,KAAuC,EAClDC,WACAC,mBACAC,kBACAC,0BACAC,iBACD;CACC,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GAERC,WAAkE;EACtEC,WAAW;EACXC,UAAUP;EACVQ,OAAOT;EACP,eAAe;EACfU,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAQ,CAAA;CAClB,IAEMC,WAIA;EACJ,eAAe;EACfC,OAAOX;EACPM,UAAUL;CACZ;CAEA,OACE,gBAACL,GAAAA;EAAWS,WAAU;aACpB,gBAACZ,GAAAA;GAAQ,GAAGW,EAAAA;aACTF,EAAQU,KAAKC,MACZ,gBAACnB,GAAAA;IAAgCa,OAAOM,EAAON;cAC5CM,EAAOL;MADSK,EAAON,KAAK,CAAA;MAKnC,gBAACZ,GAAAA;GAAY,GAAGe,EAAAA;GAAsBL,WAAU;;;AAGtD"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { n as e } from "./AuthProvider-
|
|
1
|
+
import { n as e } from "./AuthProvider-Co4d0WzB.mjs";
|
|
2
2
|
import { jsx as t } from "react/jsx-runtime";
|
|
3
3
|
import { Outlet as n } from "@tanstack/react-router";
|
|
4
4
|
//#region src/client/routes/_auth.tsx?tsr-split=component
|
|
5
5
|
function r() {
|
|
6
|
-
return e(),
|
|
6
|
+
return e(), /*#__PURE__*/ t(n, {});
|
|
7
7
|
}
|
|
8
8
|
//#endregion
|
|
9
9
|
export { r as component };
|
|
10
10
|
|
|
11
|
-
//# sourceMappingURL=_auth-
|
|
11
|
+
//# sourceMappingURL=_auth-DXJkv9QO.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_auth-
|
|
1
|
+
{"version":3,"file":"_auth-DXJkv9QO.mjs","names":["Outlet","useAuth","RouteComponent","component"],"sources":["../../src/client/routes/_auth.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Outlet, redirect } from \"@tanstack/react-router\"\nimport { useAuth } from \"../store/AuthProvider\"\n\nexport const Route = createFileRoute(\"/_auth\")({\n component: RouteComponent,\n beforeLoad: async ({ context, location }) => {\n if (!context.auth?.isAuthenticated) {\n const token = await context.trpcClient?.auth.getCurrentUserSession.query()\n if (!token) {\n const redirectPath = location.pathname ? location.pathname : \"\"\n\n throw redirect({\n to: \"/\",\n search: { redirect: redirectPath },\n })\n }\n context.auth?.login(token.user, token.expires_at)\n }\n },\n})\n\nfunction RouteComponent() {\n useAuth()\n\n return <Outlet />\n}\n"],"mappings":";;;;AAqBA,SAASE,IAAAA;CAGP,OAFAD,EAAAA,GAEO,gBAAC,GAAA,CAAA,CAAA;AACV"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { E as e, L as t, N as n, Q as r, R as i, W as a, Y as o, c as s, et as c, h as l, j as u, nt as d } from "./build-DracvfrJ.mjs";
|
|
2
|
+
import { r as f } from "./trpcClient-BzPUgiM2.mjs";
|
|
3
|
+
import { n as p, t as m } from "./_flavorId-sUWG0xuy.mjs";
|
|
4
|
+
import { t as h } from "./useErrorTranslation-Dc0eE8Zt.mjs";
|
|
5
|
+
import { n as g, t as _ } from "./ContentHeader-xQVhO2yT.mjs";
|
|
6
|
+
import { n as v, r as y, t as b } from "./DeleteFlavorModal-CHTUZ3YV.mjs";
|
|
7
|
+
import { t as x } from "./useModal-DCs1OJh7.mjs";
|
|
8
|
+
import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
9
|
+
import T from "react";
|
|
10
|
+
import { useNavigate as E, useParams as D } from "@tanstack/react-router";
|
|
11
|
+
import { Trans as O, useLingui as k } from "@lingui/react";
|
|
12
|
+
//#region src/client/routes/_auth/projects/$projectId/compute/flavors/-components/FlavorDetailsView.tsx
|
|
13
|
+
function A({ flavor: e }) {
|
|
14
|
+
let r = (e, t = "MB") => e === 0 ? `0 ${t}` : `${e} ${t}`;
|
|
15
|
+
return /*#__PURE__*/ w(d, {
|
|
16
|
+
direction: "vertical",
|
|
17
|
+
gap: "6",
|
|
18
|
+
className: "mt-6",
|
|
19
|
+
children: [
|
|
20
|
+
/*#__PURE__*/ w(d, {
|
|
21
|
+
direction: "vertical",
|
|
22
|
+
gap: "2",
|
|
23
|
+
children: [/*#__PURE__*/ C(u, { children: /*#__PURE__*/ C(O, { id: "jIPNJG" }) }), /*#__PURE__*/ w(a, {
|
|
24
|
+
alignTerms: "right",
|
|
25
|
+
children: [
|
|
26
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "S0kLOH" }) }),
|
|
27
|
+
/*#__PURE__*/ C(t, { children: /*#__PURE__*/ C(g, { text: e.id }) }),
|
|
28
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "6YtxFj" }) }),
|
|
29
|
+
/*#__PURE__*/ C(t, { children: e.name }),
|
|
30
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "Nu4oKW" }) }),
|
|
31
|
+
/*#__PURE__*/ C(t, { children: e?.description }),
|
|
32
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "7d1a0d" }) }),
|
|
33
|
+
/*#__PURE__*/ C(t, { children: e["os-flavor-access:is_public"] ? /*#__PURE__*/ C(O, { id: "l75CjT" }) : /*#__PURE__*/ C(O, { id: "1UzENP" }) }),
|
|
34
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "E/QGRL" }) }),
|
|
35
|
+
/*#__PURE__*/ C(t, { children: e["OS-FLV-DISABLED:disabled"] ? /*#__PURE__*/ C(O, { id: "l75CjT" }) : /*#__PURE__*/ C(O, { id: "1UzENP" }) })
|
|
36
|
+
]
|
|
37
|
+
})]
|
|
38
|
+
}),
|
|
39
|
+
/*#__PURE__*/ w(d, {
|
|
40
|
+
direction: "vertical",
|
|
41
|
+
gap: "2",
|
|
42
|
+
children: [/*#__PURE__*/ C(u, { children: /*#__PURE__*/ C(O, { id: "qQ1QBh" }) }), /*#__PURE__*/ w(a, {
|
|
43
|
+
alignTerms: "right",
|
|
44
|
+
children: [
|
|
45
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "MZGbkp" }) }),
|
|
46
|
+
/*#__PURE__*/ C(t, { children: e.vcpus }),
|
|
47
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "RGhYAo" }) }),
|
|
48
|
+
/*#__PURE__*/ C(t, { children: r(e.ram, "MiB") }),
|
|
49
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "sPFHpI" }) }),
|
|
50
|
+
/*#__PURE__*/ C(t, { children: r(e.disk, "GiB") }),
|
|
51
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "r9Aac8" }) }),
|
|
52
|
+
/*#__PURE__*/ C(t, { children: r(e["OS-FLV-EXT-DATA:ephemeral"] || 0, "GiB") }),
|
|
53
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "vH2C/2" }) }),
|
|
54
|
+
/*#__PURE__*/ C(t, { children: e.swap === 0 || e.swap === "" ? /*#__PURE__*/ C(O, { id: "EdQY6l" }) : r(Number(e.swap), "MiB") }),
|
|
55
|
+
/*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "u5HztT" }) }),
|
|
56
|
+
/*#__PURE__*/ C(t, { children: e.rxtx_factor })
|
|
57
|
+
]
|
|
58
|
+
})]
|
|
59
|
+
}),
|
|
60
|
+
e.extra_specs && Object.keys(e.extra_specs).length > 0 && /*#__PURE__*/ w(d, {
|
|
61
|
+
direction: "vertical",
|
|
62
|
+
gap: "2",
|
|
63
|
+
children: [/*#__PURE__*/ C(u, { children: /*#__PURE__*/ C(O, { id: "DKkOPx" }) }), /*#__PURE__*/ C(a, {
|
|
64
|
+
alignTerms: "right",
|
|
65
|
+
children: Object.entries(e.extra_specs).map(([e, r]) => /*#__PURE__*/ w(T.Fragment, { children: [/*#__PURE__*/ C(n, { children: e }), /*#__PURE__*/ C(t, { children: r })] }, e))
|
|
66
|
+
})]
|
|
67
|
+
})
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
//#region src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx?tsr-split=component
|
|
73
|
+
function j() {
|
|
74
|
+
let { projectId: t, flavorId: n } = D({ from: "/_auth/projects/$projectId/compute/flavors/$flavorId" }), { trpcClient: a } = m.useRouteContext(), u = E(), { i18n: g, _: T } = k(), { translateError: j, isRetryableError: M } = h(), { data: N, status: P, error: F, refetch: I } = f.compute.getFlavorById.useQuery({
|
|
75
|
+
project_id: t,
|
|
76
|
+
flavorId: n
|
|
77
|
+
}), { data: L } = f.compute.canUser.useQuery({
|
|
78
|
+
project_id: t,
|
|
79
|
+
permission: [
|
|
80
|
+
"flavors:delete",
|
|
81
|
+
"flavors:list_projects",
|
|
82
|
+
"flavor_specs:create",
|
|
83
|
+
"flavor_specs:delete",
|
|
84
|
+
"flavor_specs:list"
|
|
85
|
+
]
|
|
86
|
+
}), R = L?.[0] ?? !1, z = L?.[1] ?? !1, B = (L?.[2] ?? !1) || (L?.[3] ?? !1), V = L?.[4] ?? !1, [H, U] = x(), [W, G] = x(), [K, q] = x(), J = () => {
|
|
87
|
+
u({
|
|
88
|
+
to: "/projects/$projectId/compute/flavors",
|
|
89
|
+
params: { projectId: t }
|
|
90
|
+
});
|
|
91
|
+
}, Y = () => {
|
|
92
|
+
u({
|
|
93
|
+
to: "/projects/$projectId",
|
|
94
|
+
params: { projectId: t }
|
|
95
|
+
});
|
|
96
|
+
}, X = () => {
|
|
97
|
+
I();
|
|
98
|
+
};
|
|
99
|
+
if (P === "pending") return /*#__PURE__*/ w(d, {
|
|
100
|
+
className: "fixed inset-0",
|
|
101
|
+
distribution: "center",
|
|
102
|
+
alignment: "center",
|
|
103
|
+
direction: "vertical",
|
|
104
|
+
children: [/*#__PURE__*/ C(r, {
|
|
105
|
+
variant: "primary",
|
|
106
|
+
size: "large",
|
|
107
|
+
className: "mb-2"
|
|
108
|
+
}), /*#__PURE__*/ C(O, { id: "YNgcgc" })]
|
|
109
|
+
});
|
|
110
|
+
if (P === "error") {
|
|
111
|
+
let e = F?.message || "UNKNOWN_ERROR", t = j(e), n = M(e);
|
|
112
|
+
return /*#__PURE__*/ C(p, {
|
|
113
|
+
message: t,
|
|
114
|
+
statusCode: ((e) => {
|
|
115
|
+
if (e.includes("UNAUTHORIZED")) return 401;
|
|
116
|
+
if (e.includes("FORBIDDEN")) return 403;
|
|
117
|
+
if (e.includes("NOT_FOUND")) return 404;
|
|
118
|
+
if (e.includes("SERVER_ERROR")) return 500;
|
|
119
|
+
})(e),
|
|
120
|
+
title: g._({ id: "FjONW3" }),
|
|
121
|
+
onBackClick: J,
|
|
122
|
+
onHomeClick: Y,
|
|
123
|
+
reset: n ? X : void 0
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (!N) return /*#__PURE__*/ C(p, {
|
|
127
|
+
message: g._({ id: "y0u86k" }),
|
|
128
|
+
statusCode: 404,
|
|
129
|
+
title: g._({ id: "bpme7e" }),
|
|
130
|
+
onBackClick: J,
|
|
131
|
+
onHomeClick: Y
|
|
132
|
+
});
|
|
133
|
+
let Z = N["os-flavor-access:is_public"] !== !1, Q = z || R || B || V ? /*#__PURE__*/ C(l, { children: /*#__PURE__*/ w(c, { children: [/*#__PURE__*/ C(i, {
|
|
134
|
+
as: "div",
|
|
135
|
+
children: /*#__PURE__*/ C(s, {
|
|
136
|
+
icon: "moreVert",
|
|
137
|
+
children: /*#__PURE__*/ C(O, { id: "PgNNGl" })
|
|
138
|
+
})
|
|
139
|
+
}), /*#__PURE__*/ w(e, { children: [
|
|
140
|
+
(B || V) && /*#__PURE__*/ C(o, {
|
|
141
|
+
label: B ? g._({ id: "SIfYq6" }) : g._({ id: "6GBt0m" }),
|
|
142
|
+
onClick: U
|
|
143
|
+
}),
|
|
144
|
+
z && /*#__PURE__*/ C(o, {
|
|
145
|
+
label: g._({ id: "cWbW6w" }),
|
|
146
|
+
onClick: G,
|
|
147
|
+
disabled: Z
|
|
148
|
+
}),
|
|
149
|
+
R && /*#__PURE__*/ C(o, {
|
|
150
|
+
label: g._({ id: "JT3I1g" }),
|
|
151
|
+
onClick: q
|
|
152
|
+
})
|
|
153
|
+
] })] }) }) : void 0;
|
|
154
|
+
return /*#__PURE__*/ w(S, { children: [
|
|
155
|
+
/*#__PURE__*/ C(_, {
|
|
156
|
+
title: N.name,
|
|
157
|
+
projectId: t,
|
|
158
|
+
actions: Q
|
|
159
|
+
}),
|
|
160
|
+
/*#__PURE__*/ C(d, {
|
|
161
|
+
direction: "vertical",
|
|
162
|
+
children: /*#__PURE__*/ C(A, { flavor: N })
|
|
163
|
+
}),
|
|
164
|
+
a && /*#__PURE__*/ w(S, { children: [
|
|
165
|
+
H && /*#__PURE__*/ C(y, {
|
|
166
|
+
client: a,
|
|
167
|
+
isOpen: H,
|
|
168
|
+
onClose: U,
|
|
169
|
+
project: t,
|
|
170
|
+
flavor: N,
|
|
171
|
+
canEdit: B
|
|
172
|
+
}),
|
|
173
|
+
W && /*#__PURE__*/ C(v, {
|
|
174
|
+
client: a,
|
|
175
|
+
isOpen: W,
|
|
176
|
+
onClose: G,
|
|
177
|
+
project: t,
|
|
178
|
+
flavor: N
|
|
179
|
+
}),
|
|
180
|
+
K && /*#__PURE__*/ C(b, {
|
|
181
|
+
client: a,
|
|
182
|
+
isOpen: K,
|
|
183
|
+
onClose: q,
|
|
184
|
+
project: t,
|
|
185
|
+
flavor: N,
|
|
186
|
+
onSuccess: J
|
|
187
|
+
})
|
|
188
|
+
] })
|
|
189
|
+
] });
|
|
190
|
+
}
|
|
191
|
+
//#endregion
|
|
192
|
+
export { j as component };
|
|
193
|
+
|
|
194
|
+
//# sourceMappingURL=_flavorId-C5dc1N_j.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_flavorId-C5dc1N_j.mjs","names":["React","Stack","DescriptionList","DescriptionTerm","DescriptionDefinition","ContentHeading","ClipboardText","FlavorDetailsView","flavor","formatBytes","bytes","unit","direction","gap","className","alignTerms","text","id","name","description","vcpus","ram","disk","swap","Number","rxtx_factor","extra_specs","Object","keys","length","entries","map","key","value","Fragment","Button","ButtonRow","Stack","Spinner","PopupMenu","PopupMenuToggle","PopupMenuOptions","PopupMenuItem","useNavigate","useParams","Trans","useLingui","trpcReact","FlavorDetailsView","StatusError","useErrorTranslation","EditSpecModal","ManageAccessModal","DeleteFlavorModal","useModal","ContentHeader","Route","RouteComponent","projectId","flavorId","from","trpcClient","useRouteContext","navigate","t","translateError","isRetryableError","data","flavor","status","error","refetch","compute","getFlavorById","useQuery","project_id","permissionsData","canUser","permission","canDeleteFlavor","canManageAccess","canManageSpecs","canListSpecs","specModalOpen","toggleSpecModal","accessModalOpen","toggleAccessModal","deleteModalOpen","toggleDeleteModal","handleBack","to","params","handleHome","handleRetry","errorCode","message","translatedError","canRetry","getStatusCode","code","includes","undefined","isPublicFlavor","hasMoreActions","headerActions","name","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/flavors/-components/FlavorDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx?tsr-split=component"],"sourcesContent":["import React from \"react\"\nimport {\n Stack,\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n ContentHeading,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { Trans } from \"@lingui/react/macro\"\nimport type { Flavor } from \"@/server/Compute/types/flavor\"\nimport ClipboardText from \"@/client/components/ClipboardText\"\n\ninterface FlavorDetailsViewProps {\n flavor: Flavor\n}\n\nexport function FlavorDetailsView({ flavor }: FlavorDetailsViewProps) {\n const formatBytes = (bytes: number, unit: string = \"MB\") => {\n if (bytes === 0) return `0 ${unit}`\n return `${bytes} ${unit}`\n }\n\n return (\n <Stack direction=\"vertical\" gap=\"6\" className=\"mt-6\">\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>Basic Information</Trans>\n </ContentHeading>\n <DescriptionList alignTerms=\"right\">\n <DescriptionTerm>\n <Trans>ID</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>\n <ClipboardText text={flavor.id} />\n </DescriptionDefinition>\n\n <DescriptionTerm>\n <Trans>Name</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>{flavor.name}</DescriptionDefinition>\n\n <DescriptionTerm>\n <Trans>Description</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>{flavor?.description}</DescriptionDefinition>\n\n <DescriptionTerm>\n <Trans>Public</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>\n {flavor[\"os-flavor-access:is_public\"] ? <Trans>Yes</Trans> : <Trans>No</Trans>}\n </DescriptionDefinition>\n\n <DescriptionTerm>\n <Trans>Disabled</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>\n {flavor[\"OS-FLV-DISABLED:disabled\"] ? <Trans>Yes</Trans> : <Trans>No</Trans>}\n </DescriptionDefinition>\n </DescriptionList>\n </Stack>\n\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>Hardware Specifications</Trans>\n </ContentHeading>\n <DescriptionList alignTerms=\"right\">\n <DescriptionTerm>\n <Trans>VCPUs</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>{flavor.vcpus}</DescriptionDefinition>\n\n <DescriptionTerm>\n <Trans>RAM</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>{formatBytes(flavor.ram, \"MiB\")}</DescriptionDefinition>\n\n <DescriptionTerm>\n <Trans>Disk</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>{formatBytes(flavor.disk, \"GiB\")}</DescriptionDefinition>\n\n <DescriptionTerm>\n <Trans>Ephemeral Disk</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>{formatBytes(flavor[\"OS-FLV-EXT-DATA:ephemeral\"] || 0, \"GiB\")}</DescriptionDefinition>\n\n <DescriptionTerm>\n <Trans>Swap</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>\n {flavor.swap === 0 || flavor.swap === \"\" ? <Trans>None</Trans> : formatBytes(Number(flavor.swap), \"MiB\")}\n </DescriptionDefinition>\n\n <DescriptionTerm>\n <Trans>RX/TX Factor</Trans>\n </DescriptionTerm>\n <DescriptionDefinition>{flavor.rxtx_factor}</DescriptionDefinition>\n </DescriptionList>\n </Stack>\n\n {flavor.extra_specs && Object.keys(flavor.extra_specs).length > 0 && (\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>Extra Specs</Trans>\n </ContentHeading>\n <DescriptionList alignTerms=\"right\">\n {Object.entries(flavor.extra_specs).map(([key, value]) => (\n <React.Fragment key={key}>\n <DescriptionTerm>{key}</DescriptionTerm>\n <DescriptionDefinition>{value}</DescriptionDefinition>\n </React.Fragment>\n ))}\n </DescriptionList>\n </Stack>\n )}\n </Stack>\n )\n}\n","import {\n Button,\n ButtonRow,\n Stack,\n Spinner,\n PopupMenu,\n PopupMenuToggle,\n PopupMenuOptions,\n PopupMenuItem,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { createFileRoute, redirect, useNavigate, useParams } from \"@tanstack/react-router\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { FlavorDetailsView } from \"./-components/FlavorDetailsView\"\nimport { StatusError } from \"@/client/components/Error/StatusError\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport { EditSpecModal } from \"../-components/Flavors/-components/EditSpecModal\"\nimport { ManageAccessModal } from \"../-components/Flavors/-components/ManageAccessModal\"\nimport { DeleteFlavorModal } from \"../-components/Flavors/-components/DeleteFlavorModal\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/flavors/$flavorId\")({\n staticData: {\n section: \"compute\",\n service: \"flavors\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Compute\" },\n crumb: { labelKey: \"Flavors\", to: \"/projects/$projectId/compute/flavors\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const flavor = await context.trpcClient?.compute.getFlavorById.query({\n project_id: params.projectId,\n flavorId: params.flavorId,\n })\n return { flavorName: flavor?.name ?? null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.flavorName ?? \"Flavor Details\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const { projectId } = params\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n\n const serviceIndex = getServiceIndex(availableServices)\n\n if (!serviceIndex[\"flavor\"] && !serviceIndex[\"compute\"]) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { projectId, flavorId } = useParams({\n from: \"/_auth/projects/$projectId/compute/flavors/$flavorId\",\n })\n const { trpcClient } = Route.useRouteContext()\n const navigate = useNavigate()\n const { t } = useLingui()\n const { translateError, isRetryableError } = useErrorTranslation()\n\n const {\n data: flavor,\n status,\n error,\n refetch,\n } = trpcReact.compute.getFlavorById.useQuery({\n project_id: projectId,\n flavorId,\n })\n\n const { data: permissionsData } = trpcReact.compute.canUser.useQuery({\n project_id: projectId,\n permission: [\n \"flavors:delete\",\n \"flavors:list_projects\",\n \"flavor_specs:create\",\n \"flavor_specs:delete\",\n \"flavor_specs:list\",\n ],\n })\n\n const canDeleteFlavor = permissionsData?.[0] ?? false\n const canManageAccess = permissionsData?.[1] ?? false\n const canManageSpecs = (permissionsData?.[2] ?? false) || (permissionsData?.[3] ?? false)\n const canListSpecs = permissionsData?.[4] ?? false\n\n const [specModalOpen, toggleSpecModal] = useModal()\n const [accessModalOpen, toggleAccessModal] = useModal()\n const [deleteModalOpen, toggleDeleteModal] = useModal()\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/compute/flavors\",\n params: { projectId },\n })\n }\n\n const handleHome = () => {\n navigate({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n const handleRetry = () => {\n refetch()\n }\n\n if (status === \"pending\") {\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 Flavor Details...</Trans>\n </Stack>\n )\n }\n\n if (status === \"error\") {\n const errorCode = error?.message || \"UNKNOWN_ERROR\"\n const translatedError = translateError(errorCode)\n const canRetry = isRetryableError(errorCode)\n\n const getStatusCode = (code: string): number | undefined => {\n if (code.includes(\"UNAUTHORIZED\")) return 401\n if (code.includes(\"FORBIDDEN\")) return 403\n if (code.includes(\"NOT_FOUND\")) return 404\n if (code.includes(\"SERVER_ERROR\")) return 500\n return undefined\n }\n\n return (\n <StatusError\n message={translatedError}\n statusCode={getStatusCode(errorCode)}\n title={t`Error Loading Flavor`}\n onBackClick={handleBack}\n onHomeClick={handleHome}\n reset={canRetry ? handleRetry : undefined}\n />\n )\n }\n\n if (!flavor) {\n return (\n <StatusError\n message={t`The requested flavor could not be found. It may have been deleted or you may not have access to it.`}\n statusCode={404}\n title={t`Flavor Not Found`}\n onBackClick={handleBack}\n onHomeClick={handleHome}\n />\n )\n }\n\n const isPublicFlavor = flavor[\"os-flavor-access:is_public\"] !== false\n const hasMoreActions = canManageAccess || canDeleteFlavor || canManageSpecs || canListSpecs\n\n const headerActions = hasMoreActions ? (\n <ButtonRow>\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button icon=\"moreVert\">\n <Trans>More Actions</Trans>\n </Button>\n </PopupMenuToggle>\n <PopupMenuOptions>\n {(canManageSpecs || canListSpecs) && (\n <PopupMenuItem label={canManageSpecs ? t`Edit Metadata` : t`Metadata`} onClick={toggleSpecModal} />\n )}\n {canManageAccess && (\n <PopupMenuItem label={t`Manage Access`} onClick={toggleAccessModal} disabled={isPublicFlavor} />\n )}\n {canDeleteFlavor && <PopupMenuItem label={t`Delete Flavor`} onClick={toggleDeleteModal} />}\n </PopupMenuOptions>\n </PopupMenu>\n </ButtonRow>\n ) : undefined\n\n return (\n <>\n <ContentHeader title={flavor.name} projectId={projectId} actions={headerActions} />\n <Stack direction=\"vertical\">\n <FlavorDetailsView flavor={flavor} />\n </Stack>\n\n {trpcClient && (\n <>\n {specModalOpen && (\n <EditSpecModal\n client={trpcClient}\n isOpen={specModalOpen}\n onClose={toggleSpecModal}\n project={projectId}\n flavor={flavor}\n canEdit={canManageSpecs}\n />\n )}\n\n {accessModalOpen && (\n <ManageAccessModal\n client={trpcClient}\n isOpen={accessModalOpen}\n onClose={toggleAccessModal}\n project={projectId}\n flavor={flavor}\n />\n )}\n\n {deleteModalOpen && (\n <DeleteFlavorModal\n client={trpcClient}\n isOpen={deleteModalOpen}\n onClose={toggleDeleteModal}\n project={projectId}\n flavor={flavor}\n onSuccess={handleBack}\n />\n )}\n </>\n )}\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { c as e, h as t, j as n, z as r } from "./build-
|
|
2
|
-
import { t as i } from "./helpers
|
|
1
|
+
import { c as e, h as t, j as n, z as r } from "./build-DracvfrJ.mjs";
|
|
2
|
+
import { t as i } from "./helpers-1PpYf-fC.mjs";
|
|
3
3
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
4
4
|
import { createFileRoute as s, lazyRouteComponent as c, redirect as l } from "@tanstack/react-router";
|
|
5
5
|
import { Trans as u } from "@lingui/react";
|
|
6
6
|
//#region src/client/components/Error/StatusError.tsx
|
|
7
7
|
function d({ message: i, statusCode: s, onHomeClick: c, onBackClick: l, title: d, reset: f }) {
|
|
8
|
-
return
|
|
8
|
+
return /*#__PURE__*/ o(r, {
|
|
9
9
|
className: "mx-auto flex min-h-full max-w-3xl flex-col items-center justify-center px-6 py-12 sm:px-12 md:px-20",
|
|
10
10
|
children: [
|
|
11
|
-
s &&
|
|
11
|
+
s && /*#__PURE__*/ a("div", {
|
|
12
12
|
className: "text-theme-high text-6xl font-bold",
|
|
13
13
|
children: s
|
|
14
14
|
}),
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
(l || c || f) &&
|
|
15
|
+
/*#__PURE__*/ a(n, { children: d }),
|
|
16
|
+
/*#__PURE__*/ a("p", { children: i }),
|
|
17
|
+
(l || c || f) && /*#__PURE__*/ o(t, {
|
|
18
18
|
className: "mt-6",
|
|
19
19
|
children: [
|
|
20
|
-
l &&
|
|
20
|
+
l && /*#__PURE__*/ a(e, {
|
|
21
21
|
onClick: l,
|
|
22
22
|
variant: "primary",
|
|
23
|
-
children:
|
|
23
|
+
children: /*#__PURE__*/ a(u, { id: "iH8pgl" })
|
|
24
24
|
}),
|
|
25
|
-
c &&
|
|
25
|
+
c && /*#__PURE__*/ a(e, {
|
|
26
26
|
onClick: c,
|
|
27
|
-
children:
|
|
27
|
+
children: /*#__PURE__*/ a(u, { id: "i0qMbr" })
|
|
28
28
|
}),
|
|
29
|
-
f &&
|
|
29
|
+
f && /*#__PURE__*/ a(e, {
|
|
30
30
|
onClick: f,
|
|
31
|
-
children:
|
|
31
|
+
children: /*#__PURE__*/ a(u, { id: "qJb6G2" })
|
|
32
32
|
})
|
|
33
33
|
]
|
|
34
34
|
})
|
|
@@ -51,7 +51,7 @@ var f = s("/_auth/projects/$projectId/compute/flavors/$flavorId")({
|
|
|
51
51
|
flavorId: t.flavorId
|
|
52
52
|
}))?.name ?? null }),
|
|
53
53
|
head: ({ loaderData: e }) => ({ meta: [{ title: e?.flavorName ?? "Flavor Details" }] }),
|
|
54
|
-
component: c(() => import("./_flavorId-
|
|
54
|
+
component: c(() => import("./_flavorId-C5dc1N_j.mjs"), "component"),
|
|
55
55
|
beforeLoad: async ({ context: e, params: t }) => {
|
|
56
56
|
let { trpcClient: n } = e, { projectId: r } = t, a = i(await n?.auth.getAvailableServices.query() || []);
|
|
57
57
|
if (!a.flavor && !a.compute) throw l({
|
|
@@ -63,4 +63,4 @@ var f = s("/_auth/projects/$projectId/compute/flavors/$flavorId")({
|
|
|
63
63
|
//#endregion
|
|
64
64
|
export { d as n, f as t };
|
|
65
65
|
|
|
66
|
-
//# sourceMappingURL=_flavorId-
|
|
66
|
+
//# sourceMappingURL=_flavorId-sUWG0xuy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_flavorId-sUWG0xuy.mjs","names":["Button","ButtonRow","Container","ContentHeading","StatusError","message","statusCode","onHomeClick","onBackClick","title","reset","className","div","p","onClick","variant","createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","flavor","trpcClient","compute","getFlavorById","query","project_id","projectId","flavorId","flavorName","name","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex"],"sources":["../../src/client/components/Error/StatusError.tsx","../../src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx"],"sourcesContent":["import { Button, ButtonRow, Container, ContentHeading } from \"@cloudoperators/juno-ui-components/index\"\nimport { Trans } from \"@lingui/react/macro\"\n\ninterface StatusErrorProps {\n message: string\n statusCode?: number\n onHomeClick?: () => void\n onBackClick?: () => void\n title: string\n showHeader?: boolean\n reset?: () => void\n}\n\nexport function StatusError({ message, statusCode, onHomeClick, onBackClick, title, reset }: StatusErrorProps) {\n return (\n <Container className=\"mx-auto flex min-h-full max-w-3xl flex-col items-center justify-center px-6 py-12 sm:px-12 md:px-20\">\n {statusCode && <div className=\"text-theme-high text-6xl font-bold\">{statusCode}</div>}\n <ContentHeading>{title}</ContentHeading>\n <p>{message}</p>\n {(onBackClick || onHomeClick || reset) && (\n <ButtonRow className=\"mt-6\">\n {onBackClick && (\n <Button onClick={onBackClick} variant=\"primary\">\n <Trans>Back</Trans>\n </Button>\n )}\n {onHomeClick && (\n <Button onClick={onHomeClick}>\n <Trans>Home</Trans>\n </Button>\n )}\n\n {reset && (\n <Button onClick={reset}>\n <Trans>Try Again</Trans>\n </Button>\n )}\n </ButtonRow>\n )}\n </Container>\n )\n}\n","import {\n Button,\n ButtonRow,\n Stack,\n Spinner,\n PopupMenu,\n PopupMenuToggle,\n PopupMenuOptions,\n PopupMenuItem,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { createFileRoute, redirect, useNavigate, useParams } from \"@tanstack/react-router\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { FlavorDetailsView } from \"./-components/FlavorDetailsView\"\nimport { StatusError } from \"@/client/components/Error/StatusError\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport { EditSpecModal } from \"../-components/Flavors/-components/EditSpecModal\"\nimport { ManageAccessModal } from \"../-components/Flavors/-components/ManageAccessModal\"\nimport { DeleteFlavorModal } from \"../-components/Flavors/-components/DeleteFlavorModal\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/flavors/$flavorId\")({\n staticData: {\n section: \"compute\",\n service: \"flavors\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Compute\" },\n crumb: { labelKey: \"Flavors\", to: \"/projects/$projectId/compute/flavors\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const flavor = await context.trpcClient?.compute.getFlavorById.query({\n project_id: params.projectId,\n flavorId: params.flavorId,\n })\n return { flavorName: flavor?.name ?? null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.flavorName ?? \"Flavor Details\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const { projectId } = params\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n\n const serviceIndex = getServiceIndex(availableServices)\n\n if (!serviceIndex[\"flavor\"] && !serviceIndex[\"compute\"]) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { projectId, flavorId } = useParams({\n from: \"/_auth/projects/$projectId/compute/flavors/$flavorId\",\n })\n const { trpcClient } = Route.useRouteContext()\n const navigate = useNavigate()\n const { t } = useLingui()\n const { translateError, isRetryableError } = useErrorTranslation()\n\n const {\n data: flavor,\n status,\n error,\n refetch,\n } = trpcReact.compute.getFlavorById.useQuery({\n project_id: projectId,\n flavorId,\n })\n\n const { data: permissionsData } = trpcReact.compute.canUser.useQuery({\n project_id: projectId,\n permission: [\n \"flavors:delete\",\n \"flavors:list_projects\",\n \"flavor_specs:create\",\n \"flavor_specs:delete\",\n \"flavor_specs:list\",\n ],\n })\n\n const canDeleteFlavor = permissionsData?.[0] ?? false\n const canManageAccess = permissionsData?.[1] ?? false\n const canManageSpecs = (permissionsData?.[2] ?? false) || (permissionsData?.[3] ?? false)\n const canListSpecs = permissionsData?.[4] ?? false\n\n const [specModalOpen, toggleSpecModal] = useModal()\n const [accessModalOpen, toggleAccessModal] = useModal()\n const [deleteModalOpen, toggleDeleteModal] = useModal()\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/compute/flavors\",\n params: { projectId },\n })\n }\n\n const handleHome = () => {\n navigate({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n const handleRetry = () => {\n refetch()\n }\n\n if (status === \"pending\") {\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 Flavor Details...</Trans>\n </Stack>\n )\n }\n\n if (status === \"error\") {\n const errorCode = error?.message || \"UNKNOWN_ERROR\"\n const translatedError = translateError(errorCode)\n const canRetry = isRetryableError(errorCode)\n\n const getStatusCode = (code: string): number | undefined => {\n if (code.includes(\"UNAUTHORIZED\")) return 401\n if (code.includes(\"FORBIDDEN\")) return 403\n if (code.includes(\"NOT_FOUND\")) return 404\n if (code.includes(\"SERVER_ERROR\")) return 500\n return undefined\n }\n\n return (\n <StatusError\n message={translatedError}\n statusCode={getStatusCode(errorCode)}\n title={t`Error Loading Flavor`}\n onBackClick={handleBack}\n onHomeClick={handleHome}\n reset={canRetry ? handleRetry : undefined}\n />\n )\n }\n\n if (!flavor) {\n return (\n <StatusError\n message={t`The requested flavor could not be found. It may have been deleted or you may not have access to it.`}\n statusCode={404}\n title={t`Flavor Not Found`}\n onBackClick={handleBack}\n onHomeClick={handleHome}\n />\n )\n }\n\n const isPublicFlavor = flavor[\"os-flavor-access:is_public\"] !== false\n const hasMoreActions = canManageAccess || canDeleteFlavor || canManageSpecs || canListSpecs\n\n const headerActions = hasMoreActions ? (\n <ButtonRow>\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button icon=\"moreVert\">\n <Trans>More Actions</Trans>\n </Button>\n </PopupMenuToggle>\n <PopupMenuOptions>\n {(canManageSpecs || canListSpecs) && (\n <PopupMenuItem label={canManageSpecs ? t`Edit Metadata` : t`Metadata`} onClick={toggleSpecModal} />\n )}\n {canManageAccess && (\n <PopupMenuItem label={t`Manage Access`} onClick={toggleAccessModal} disabled={isPublicFlavor} />\n )}\n {canDeleteFlavor && <PopupMenuItem label={t`Delete Flavor`} onClick={toggleDeleteModal} />}\n </PopupMenuOptions>\n </PopupMenu>\n </ButtonRow>\n ) : undefined\n\n return (\n <>\n <ContentHeader title={flavor.name} projectId={projectId} actions={headerActions} />\n <Stack direction=\"vertical\">\n <FlavorDetailsView flavor={flavor} />\n </Stack>\n\n {trpcClient && (\n <>\n {specModalOpen && (\n <EditSpecModal\n client={trpcClient}\n isOpen={specModalOpen}\n onClose={toggleSpecModal}\n project={projectId}\n flavor={flavor}\n canEdit={canManageSpecs}\n />\n )}\n\n {accessModalOpen && (\n <ManageAccessModal\n client={trpcClient}\n isOpen={accessModalOpen}\n onClose={toggleAccessModal}\n project={projectId}\n flavor={flavor}\n />\n )}\n\n {deleteModalOpen && (\n <DeleteFlavorModal\n client={trpcClient}\n isOpen={deleteModalOpen}\n onClose={toggleDeleteModal}\n project={projectId}\n flavor={flavor}\n onSuccess={handleBack}\n />\n )}\n </>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;AAaA,SAAgBI,EAAY,EAAEC,YAASC,eAAYC,gBAAaC,gBAAaC,UAAOC,YAAyB;CAC3G,OACE,gBAACR,GAAAA;EAAUS,WAAU;;GAClBL,KAAc,gBAACM,OAAAA;IAAID,WAAU;cAAsCL;;GACpE,gBAACH,GAAAA,EAAAA,UAAgBM,EAAAA,CAAAA;GACjB,gBAACI,KAAAA,EAAAA,UAAGR,EAAAA,CAAAA;IACFG,KAAeD,KAAeG,MAC9B,gBAACT,GAAAA;IAAUU,WAAU;;KAClBH,KACC,gBAACR,GAAAA;MAAOc,SAASN;MAAaO,SAAQ;gBACpC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;KAGHR,KACC,gBAACP,GAAAA;MAAOc,SAASP;gBACf,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;KAIHG,KACC,gBAACV,GAAAA;MAAOc,SAASJ;gBACf,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;;;AAOd;ACjBA,IAAaS,IAAQH,EAAgB,sDAAA,EAAwD;CAC3FI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,UAAU;EACpCC,OAAO;GAAED,UAAU;GAAWE,IAAI;EAAuC;CAC3E;CACAE,QAAQ,OAAO,EAAEC,YAASC,iBAKjB,EAAES,aAAYR,MAJAF,EAAQG,YAAYC,QAAQC,cAAcC,MAAM;EACnEC,YAAYN,EAAOO;EACnBC,UAAUR,EAAOQ;CACnB,CAAA,IAC6BE,QAAQ,KAAK;CAE5CC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYH,cAAc,iBAAiB,CAAA,EAC7D;CACAM,WAASC,4CAAA,WAAA;CACTE,YAAY,OAAO,EAAEnB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GACjB,EAAEQ,iBAAcP,GAIhBsB,IAAenC,EAFK,MAAOe,GAAYkB,KAAKC,qBAAqBhB,MAAAA,KAAY,CAAA,CAE9Cc;EAErC,IAAI,CAACG,EAAa,UAAa,CAACA,EAAa,SAC3C,MAAMpC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,aAAU;EACtB,CAAA;CAEJ;AACF,CAAA"}
|