@cobaltcore-dev/aurora 0.7.0 → 0.8.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 (101) hide show
  1. package/README.md +101 -7
  2. package/dist/client/AuroraApp.d.ts +38 -0
  3. package/dist/client/{ContentHeader-kx1Th5Sq.mjs → ContentHeader-DqsGNvtD.mjs} +17 -17
  4. package/dist/client/{ContentHeader-kx1Th5Sq.mjs.map → ContentHeader-DqsGNvtD.mjs.map} +1 -1
  5. package/dist/client/{DeleteFlavorModal-C3cb7YiJ.mjs → DeleteFlavorModal-C3m7bQJu.mjs} +163 -163
  6. package/dist/client/{DeleteFlavorModal-C3cb7YiJ.mjs.map → DeleteFlavorModal-C3m7bQJu.mjs.map} +1 -1
  7. package/dist/client/{EditSecurityGroupModal-CpP54WIK.mjs → EditSecurityGroupModal-DKusxfta.mjs} +18 -18
  8. package/dist/client/{EditSecurityGroupModal-CpP54WIK.mjs.map → EditSecurityGroupModal-DKusxfta.mjs.map} +1 -1
  9. package/dist/client/{FiltersInput-DxcyR6Bp.mjs → FiltersInput-GzR4D0q6.mjs} +21 -21
  10. package/dist/client/{FiltersInput-DxcyR6Bp.mjs.map → FiltersInput-GzR4D0q6.mjs.map} +1 -1
  11. package/dist/client/{FloatingIpActionModals-BP8RWHbu.mjs → FloatingIpActionModals-CRvROJ3H.mjs} +51 -51
  12. package/dist/client/{FloatingIpActionModals-BP8RWHbu.mjs.map → FloatingIpActionModals-CRvROJ3H.mjs.map} +1 -1
  13. package/dist/client/{ImageToastNotifications-TZ3EfQg-.mjs → ImageToastNotifications-BuDXpTkl.mjs} +344 -344
  14. package/dist/client/{ImageToastNotifications-TZ3EfQg-.mjs.map → ImageToastNotifications-BuDXpTkl.mjs.map} +1 -1
  15. package/dist/client/{RouteError-QSV7qOoJ.mjs → RouteError-DVAiT0mT.mjs} +2 -2
  16. package/dist/client/{RouteError-QSV7qOoJ.mjs.map → RouteError-DVAiT0mT.mjs.map} +1 -1
  17. package/dist/client/{SortInput-CYv2_Pur.mjs → SortInput-VK7IYqQv.mjs} +6 -6
  18. package/dist/client/{SortInput-CYv2_Pur.mjs.map → SortInput-VK7IYqQv.mjs.map} +1 -1
  19. package/dist/client/{_flavorId-C2x43-6S.mjs → _flavorId-B9Vqkraj.mjs} +8 -8
  20. package/dist/client/{_flavorId-C2x43-6S.mjs.map → _flavorId-B9Vqkraj.mjs.map} +1 -1
  21. package/dist/client/{_flavorId-CR8ZUI-P.mjs → _flavorId-CFpNGz52.mjs} +62 -62
  22. package/dist/client/{_flavorId-CR8ZUI-P.mjs.map → _flavorId-CFpNGz52.mjs.map} +1 -1
  23. package/dist/client/{_floatingIpId-BCk41_Lb.mjs → _floatingIpId-B5GMSLeQ.mjs} +2 -2
  24. package/dist/client/{_floatingIpId-BCk41_Lb.mjs.map → _floatingIpId-B5GMSLeQ.mjs.map} +1 -1
  25. package/dist/client/{_floatingIpId-BGrOAmPT.mjs → _floatingIpId-C2-BeRmF.mjs} +27 -27
  26. package/dist/client/{_floatingIpId-BGrOAmPT.mjs.map → _floatingIpId-C2-BeRmF.mjs.map} +1 -1
  27. package/dist/client/_imageId-9NZytfNs.mjs +534 -0
  28. package/dist/client/{_imageId-CvfD832b.mjs.map → _imageId-9NZytfNs.mjs.map} +1 -1
  29. package/dist/client/_pcaId-BwTvJJgh.mjs +479 -0
  30. package/dist/client/_pcaId-BwTvJJgh.mjs.map +1 -0
  31. package/dist/client/{_pcaId-DOHycvCf.mjs → _pcaId-DUHQd0rB.mjs} +2 -2
  32. package/dist/client/{_pcaId-DOHycvCf.mjs.map → _pcaId-DUHQd0rB.mjs.map} +1 -1
  33. package/dist/client/{_projectId-DOgwFiqD.mjs → _projectId-B_2sZKk-.mjs} +2 -2
  34. package/dist/client/{_projectId-DOgwFiqD.mjs.map → _projectId-B_2sZKk-.mjs.map} +1 -1
  35. package/dist/client/{_projectId-MxcHrXW4.mjs → _projectId-CLgClx24.mjs} +3 -3
  36. package/dist/client/{_projectId-MxcHrXW4.mjs.map → _projectId-CLgClx24.mjs.map} +1 -1
  37. package/dist/client/_projectId-cW9aQ4Ag.mjs +271 -0
  38. package/dist/client/_projectId-cW9aQ4Ag.mjs.map +1 -0
  39. package/dist/client/{_securityGroupId-KKw4RPdH.mjs → _securityGroupId-DYxmXUOP.mjs} +319 -319
  40. package/dist/client/{_securityGroupId-KKw4RPdH.mjs.map → _securityGroupId-DYxmXUOP.mjs.map} +1 -1
  41. package/dist/client/{_securityGroupId-CJJanWiY.mjs → _securityGroupId-fhK1CuZh.mjs} +2 -2
  42. package/dist/client/{_securityGroupId-CJJanWiY.mjs.map → _securityGroupId-fhK1CuZh.mjs.map} +1 -1
  43. package/dist/client/{_storageType-DYjo-6ej.mjs → _storageType-2_fau4B5.mjs} +698 -698
  44. package/dist/client/{_storageType-DYjo-6ej.mjs.map → _storageType-2_fau4B5.mjs.map} +1 -1
  45. package/dist/client/{_storageType-4wSxI__0.mjs → _storageType-dRTFMKG3.mjs} +2 -2
  46. package/dist/client/{_storageType-4wSxI__0.mjs.map → _storageType-dRTFMKG3.mjs.map} +1 -1
  47. package/dist/client/{about-Bo9vxGHy.mjs → about-Nsxkyh9U.mjs} +2 -2
  48. package/dist/client/{about-Bo9vxGHy.mjs.map → about-Nsxkyh9U.mjs.map} +1 -1
  49. package/dist/client/{build-DeJcDjPi.mjs → build-BdRRmNf5.mjs} +3290 -3274
  50. package/dist/client/{build-DeJcDjPi.mjs.map → build-BdRRmNf5.mjs.map} +1 -1
  51. package/dist/client/{constants-BmcGYeR-.mjs → constants-J5nm9hbP.mjs} +15 -15
  52. package/dist/client/{constants-BmcGYeR-.mjs.map → constants-J5nm9hbP.mjs.map} +1 -1
  53. package/dist/client/{flavors-BxFVqgnb.mjs → flavors-_P7R-CeT.mjs} +2 -2
  54. package/dist/client/{flavors-BxFVqgnb.mjs.map → flavors-_P7R-CeT.mjs.map} +1 -1
  55. package/dist/client/{flavors-CfdgjsZY.mjs → flavors-m1qDHzeS.mjs} +238 -221
  56. package/dist/client/flavors-m1qDHzeS.mjs.map +1 -0
  57. package/dist/client/{floatingips-ByRb82wS.mjs → floatingips-Dq4DXQYb.mjs} +90 -90
  58. package/dist/client/{floatingips-ByRb82wS.mjs.map → floatingips-Dq4DXQYb.mjs.map} +1 -1
  59. package/dist/client/{images-CenluYV8.mjs → images-CpM-T_jM.mjs} +2 -2
  60. package/dist/client/{images-CenluYV8.mjs.map → images-CpM-T_jM.mjs.map} +1 -1
  61. package/dist/client/images-DHmVgQAh2.mjs +1890 -0
  62. package/dist/client/images-DHmVgQAh2.mjs.map +1 -0
  63. package/dist/client/{images-C_dX7nY6.mjs → images-Dbjo4yKn.mjs} +2 -2
  64. package/dist/client/{images-C_dX7nY6.mjs.map → images-Dbjo4yKn.mjs.map} +1 -1
  65. package/dist/client/index.d.ts +1 -1
  66. package/dist/client/index.js +382 -351
  67. package/dist/client/index.js.map +1 -1
  68. package/dist/client/{objects-gxSjvbvF.mjs → objects-DKWp9RtR.mjs} +2 -2
  69. package/dist/client/{objects-gxSjvbvF.mjs.map → objects-DKWp9RtR.mjs.map} +1 -1
  70. package/dist/client/{objects-BJM6YeuF.mjs → objects-DaCuy_CB.mjs} +1156 -1156
  71. package/dist/client/{objects-BJM6YeuF.mjs.map → objects-DaCuy_CB.mjs.map} +1 -1
  72. package/dist/client/{pca-Bl8NmoVZ.mjs → pca-C8zWTSSt.mjs} +2 -2
  73. package/dist/client/{pca-Bl8NmoVZ.mjs.map → pca-C8zWTSSt.mjs.map} +1 -1
  74. package/dist/client/pca-CK5-j7Kk.mjs +202 -0
  75. package/dist/client/pca-CK5-j7Kk.mjs.map +1 -0
  76. package/dist/client/{projects-pe2_dCnV.mjs → projects-CHYn7L5e.mjs} +2 -2
  77. package/dist/client/{projects-pe2_dCnV.mjs.map → projects-CHYn7L5e.mjs.map} +1 -1
  78. package/dist/client/{projects-D2iewAzu.mjs → projects-CeLhtLvf.mjs} +2 -2
  79. package/dist/client/{projects-D2iewAzu.mjs.map → projects-CeLhtLvf.mjs.map} +1 -1
  80. package/dist/client/{projects-CgclWI16.mjs → projects-ClViaUuv.mjs} +11 -11
  81. package/dist/client/{projects-CgclWI16.mjs.map → projects-ClViaUuv.mjs.map} +1 -1
  82. package/dist/client/{_projectId-BDSWnMGj.mjs → routeInfo-DlDJZnpg.mjs} +34 -8
  83. package/dist/client/routeInfo-DlDJZnpg.mjs.map +1 -0
  84. package/dist/client/{securitygroups-DahZkVYQ.mjs → securitygroups-CNFLu9zS.mjs} +112 -112
  85. package/dist/client/{securitygroups-DahZkVYQ.mjs.map → securitygroups-CNFLu9zS.mjs.map} +1 -1
  86. package/dist/client/{useListWithFiltering-DaYcu5AB.mjs → useListWithFiltering-v2A0-SZb.mjs} +9 -9
  87. package/dist/client/{useListWithFiltering-DaYcu5AB.mjs.map → useListWithFiltering-v2A0-SZb.mjs.map} +1 -1
  88. package/dist/server/index.d.ts +6 -1
  89. package/dist/server/index.js +37 -12
  90. package/package.json +4 -4
  91. package/dist/client/_imageId-CvfD832b.mjs +0 -534
  92. package/dist/client/_pcaId-BxBt5DXi.mjs +0 -459
  93. package/dist/client/_pcaId-BxBt5DXi.mjs.map +0 -1
  94. package/dist/client/_projectId-BDSWnMGj.mjs.map +0 -1
  95. package/dist/client/_projectId-DS4nR59B.mjs +0 -299
  96. package/dist/client/_projectId-DS4nR59B.mjs.map +0 -1
  97. package/dist/client/flavors-CfdgjsZY.mjs.map +0 -1
  98. package/dist/client/images-CKqIXUq52.mjs +0 -1873
  99. package/dist/client/images-CKqIXUq52.mjs.map +0 -1
  100. package/dist/client/pca-RSiWpJs9.mjs +0 -182
  101. package/dist/client/pca-RSiWpJs9.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { b as e, d as t, lt as n, u as r } from "./build-DeJcDjPi.mjs";
1
+ import { h as e, l as t, r as n, v as r } from "./build-BdRRmNf5.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 /*#__PURE__*/ a(e, {
17
+ return /*#__PURE__*/ a(n, {
18
18
  className: "flex w-full items-end sm:w-auto",
19
- children: [/*#__PURE__*/ i(n, {
19
+ children: [/*#__PURE__*/ i(r, {
20
20
  ...m(),
21
- children: d.map((e) => /*#__PURE__*/ i(r, {
21
+ children: d.map((e) => /*#__PURE__*/ i(t, {
22
22
  value: e.value,
23
23
  children: e.label
24
24
  }, e.value))
25
- }), /*#__PURE__*/ i(t, {
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-CYv2_Pur.mjs.map
34
+ //# sourceMappingURL=SortInput-VK7IYqQv.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SortInput-CYv2_Pur.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
+ {"version":3,"file":"SortInput-VK7IYqQv.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,4 +1,4 @@
1
- import { Y as e, ct as t, i as n, q as r } from "./build-DeJcDjPi.mjs";
1
+ import { O as e, Q as t, _ as n, lt as r } from "./build-BdRRmNf5.mjs";
2
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";
@@ -12,21 +12,21 @@ function d({ message: i, statusCode: s, onHomeClick: c, onBackClick: l, title: d
12
12
  className: "text-theme-high text-6xl font-bold",
13
13
  children: s
14
14
  }),
15
- /*#__PURE__*/ a(r, { children: d }),
15
+ /*#__PURE__*/ a(t, { children: d }),
16
16
  /*#__PURE__*/ a("p", { children: i }),
17
- (l || c || f) && /*#__PURE__*/ o(n, {
17
+ (l || c || f) && /*#__PURE__*/ o(r, {
18
18
  className: "mt-6",
19
19
  children: [
20
- l && /*#__PURE__*/ a(t, {
20
+ l && /*#__PURE__*/ a(n, {
21
21
  onClick: l,
22
22
  variant: "primary",
23
23
  children: /*#__PURE__*/ a(u, { id: "iH8pgl" })
24
24
  }),
25
- c && /*#__PURE__*/ a(t, {
25
+ c && /*#__PURE__*/ a(n, {
26
26
  onClick: c,
27
27
  children: /*#__PURE__*/ a(u, { id: "i0qMbr" })
28
28
  }),
29
- f && /*#__PURE__*/ a(t, {
29
+ f && /*#__PURE__*/ a(n, {
30
30
  onClick: f,
31
31
  children: /*#__PURE__*/ a(u, { id: "qJb6G2" })
32
32
  })
@@ -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-CR8ZUI-P.mjs"), "component"),
54
+ component: c(() => import("./_flavorId-CFpNGz52.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-C2x43-6S.mjs.map
66
+ //# sourceMappingURL=_flavorId-B9Vqkraj.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_flavorId-C2x43-6S.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"}
1
+ {"version":3,"file":"_flavorId-B9Vqkraj.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"}
@@ -1,68 +1,68 @@
1
- import { A as e, C as t, K as n, P as r, Q as i, R as a, T as o, ct as s, i as c, it as l, q as u, tt as d } from "./build-DeJcDjPi.mjs";
1
+ import { D as e, F as t, H as n, K as r, Q as i, Y as a, _ as o, k as s, lt as c, nt as l, ot as u, tt as d } from "./build-BdRRmNf5.mjs";
2
2
  import { r as f } from "./trpcClient-BzPUgiM2.mjs";
3
- import { n as p, t as m } from "./_flavorId-C2x43-6S.mjs";
3
+ import { n as p, t as m } from "./_flavorId-B9Vqkraj.mjs";
4
4
  import { t as h } from "./useErrorTranslation-Dc0eE8Zt.mjs";
5
- import { n as g, t as _ } from "./ContentHeader-kx1Th5Sq.mjs";
6
- import { n as v, r as y, t as b } from "./DeleteFlavorModal-C3cb7YiJ.mjs";
5
+ import { n as g, t as _ } from "./ContentHeader-DqsGNvtD.mjs";
6
+ import { n as v, r as y, t as b } from "./DeleteFlavorModal-C3m7bQJu.mjs";
7
7
  import { t as x } from "./useModal-DCs1OJh7.mjs";
8
8
  import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
9
9
  import T from "react";
10
10
  import { useNavigate as E, useParams as D } from "@tanstack/react-router";
11
11
  import { Trans as O, useLingui as k } from "@lingui/react";
12
12
  //#region src/client/routes/_auth/projects/$projectId/compute/flavors/-components/FlavorDetailsView.tsx
13
- function A({ flavor: t }) {
14
- let r = (e, t = "MB") => e === 0 ? `0 ${t}` : `${e} ${t}`;
15
- return /*#__PURE__*/ w(i, {
13
+ function A({ flavor: e }) {
14
+ let n = (e, t = "MB") => e === 0 ? `0 ${t}` : `${e} ${t}`;
15
+ return /*#__PURE__*/ w(a, {
16
16
  direction: "vertical",
17
17
  gap: "6",
18
18
  className: "mt-6",
19
19
  children: [
20
- /*#__PURE__*/ w(i, {
20
+ /*#__PURE__*/ w(a, {
21
21
  direction: "vertical",
22
22
  gap: "2",
23
- children: [/*#__PURE__*/ C(u, { children: /*#__PURE__*/ C(O, { id: "jIPNJG" }) }), /*#__PURE__*/ w(e, {
23
+ children: [/*#__PURE__*/ C(i, { children: /*#__PURE__*/ C(O, { id: "jIPNJG" }) }), /*#__PURE__*/ w(d, {
24
24
  alignTerms: "right",
25
25
  children: [
26
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "S0kLOH" }) }),
27
- /*#__PURE__*/ C(o, { children: /*#__PURE__*/ C(g, { text: t.id }) }),
28
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "6YtxFj" }) }),
29
- /*#__PURE__*/ C(o, { children: t.name }),
30
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "Nu4oKW" }) }),
31
- /*#__PURE__*/ C(o, { children: t?.description }),
32
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "7d1a0d" }) }),
33
- /*#__PURE__*/ C(o, { children: t["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(o, { children: t["OS-FLV-DISABLED:disabled"] ? /*#__PURE__*/ C(O, { id: "l75CjT" }) : /*#__PURE__*/ C(O, { id: "1UzENP" }) })
26
+ /*#__PURE__*/ C(r, { children: /*#__PURE__*/ C(O, { id: "S0kLOH" }) }),
27
+ /*#__PURE__*/ C(t, { children: /*#__PURE__*/ C(g, { text: e.id }) }),
28
+ /*#__PURE__*/ C(r, { children: /*#__PURE__*/ C(O, { id: "6YtxFj" }) }),
29
+ /*#__PURE__*/ C(t, { children: e.name }),
30
+ /*#__PURE__*/ C(r, { children: /*#__PURE__*/ C(O, { id: "Nu4oKW" }) }),
31
+ /*#__PURE__*/ C(t, { children: e?.description }),
32
+ /*#__PURE__*/ C(r, { 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(r, { 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
36
  ]
37
37
  })]
38
38
  }),
39
- /*#__PURE__*/ w(i, {
39
+ /*#__PURE__*/ w(a, {
40
40
  direction: "vertical",
41
41
  gap: "2",
42
- children: [/*#__PURE__*/ C(u, { children: /*#__PURE__*/ C(O, { id: "qQ1QBh" }) }), /*#__PURE__*/ w(e, {
42
+ children: [/*#__PURE__*/ C(i, { children: /*#__PURE__*/ C(O, { id: "qQ1QBh" }) }), /*#__PURE__*/ w(d, {
43
43
  alignTerms: "right",
44
44
  children: [
45
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "MZGbkp" }) }),
46
- /*#__PURE__*/ C(o, { children: t.vcpus }),
47
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "RGhYAo" }) }),
48
- /*#__PURE__*/ C(o, { children: r(t.ram, "MiB") }),
49
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "sPFHpI" }) }),
50
- /*#__PURE__*/ C(o, { children: r(t.disk, "GiB") }),
51
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "r9Aac8" }) }),
52
- /*#__PURE__*/ C(o, { children: r(t["OS-FLV-EXT-DATA:ephemeral"] || 0, "GiB") }),
53
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "vH2C/2" }) }),
54
- /*#__PURE__*/ C(o, { children: t.swap === 0 || t.swap === "" ? /*#__PURE__*/ C(O, { id: "EdQY6l" }) : r(Number(t.swap), "MiB") }),
55
- /*#__PURE__*/ C(n, { children: /*#__PURE__*/ C(O, { id: "u5HztT" }) }),
56
- /*#__PURE__*/ C(o, { children: t.rxtx_factor })
45
+ /*#__PURE__*/ C(r, { children: /*#__PURE__*/ C(O, { id: "MZGbkp" }) }),
46
+ /*#__PURE__*/ C(t, { children: e.vcpus }),
47
+ /*#__PURE__*/ C(r, { children: /*#__PURE__*/ C(O, { id: "RGhYAo" }) }),
48
+ /*#__PURE__*/ C(t, { children: n(e.ram, "MiB") }),
49
+ /*#__PURE__*/ C(r, { children: /*#__PURE__*/ C(O, { id: "sPFHpI" }) }),
50
+ /*#__PURE__*/ C(t, { children: n(e.disk, "GiB") }),
51
+ /*#__PURE__*/ C(r, { children: /*#__PURE__*/ C(O, { id: "r9Aac8" }) }),
52
+ /*#__PURE__*/ C(t, { children: n(e["OS-FLV-EXT-DATA:ephemeral"] || 0, "GiB") }),
53
+ /*#__PURE__*/ C(r, { children: /*#__PURE__*/ C(O, { id: "vH2C/2" }) }),
54
+ /*#__PURE__*/ C(t, { children: e.swap === 0 || e.swap === "" ? /*#__PURE__*/ C(O, { id: "EdQY6l" }) : n(Number(e.swap), "MiB") }),
55
+ /*#__PURE__*/ C(r, { children: /*#__PURE__*/ C(O, { id: "u5HztT" }) }),
56
+ /*#__PURE__*/ C(t, { children: e.rxtx_factor })
57
57
  ]
58
58
  })]
59
59
  }),
60
- t.extra_specs && Object.keys(t.extra_specs).length > 0 && /*#__PURE__*/ w(i, {
60
+ e.extra_specs && Object.keys(e.extra_specs).length > 0 && /*#__PURE__*/ w(a, {
61
61
  direction: "vertical",
62
62
  gap: "2",
63
- children: [/*#__PURE__*/ C(u, { children: /*#__PURE__*/ C(O, { id: "DKkOPx" }) }), /*#__PURE__*/ C(e, {
63
+ children: [/*#__PURE__*/ C(i, { children: /*#__PURE__*/ C(O, { id: "DKkOPx" }) }), /*#__PURE__*/ C(d, {
64
64
  alignTerms: "right",
65
- children: Object.entries(t.extra_specs).map(([e, t]) => /*#__PURE__*/ w(T.Fragment, { children: [/*#__PURE__*/ C(n, { children: e }), /*#__PURE__*/ C(o, { children: t })] }, e))
65
+ children: Object.entries(e.extra_specs).map(([e, n]) => /*#__PURE__*/ w(T.Fragment, { children: [/*#__PURE__*/ C(r, { children: e }), /*#__PURE__*/ C(t, { children: n })] }, e))
66
66
  })]
67
67
  })
68
68
  ]
@@ -71,11 +71,11 @@ function A({ flavor: t }) {
71
71
  //#endregion
72
72
  //#region src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx?tsr-split=component
73
73
  function j() {
74
- let { projectId: e, flavorId: n } = D({ from: "/_auth/projects/$projectId/compute/flavors/$flavorId" }), { trpcClient: o } = 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: e,
76
- flavorId: n
74
+ let { projectId: t, flavorId: r } = D({ from: "/_auth/projects/$projectId/compute/flavors/$flavorId" }), { trpcClient: i } = m.useRouteContext(), d = 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: r
77
77
  }), { data: L } = f.compute.canUser.useQuery({
78
- project_id: e,
78
+ project_id: t,
79
79
  permission: [
80
80
  "flavors:delete",
81
81
  "flavors:list_projects",
@@ -84,24 +84,24 @@ function j() {
84
84
  "flavor_specs:list"
85
85
  ]
86
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({
87
+ d({
88
88
  to: "/projects/$projectId/compute/flavors",
89
- params: { projectId: e }
89
+ params: { projectId: t }
90
90
  });
91
91
  }, Y = () => {
92
- u({
92
+ d({
93
93
  to: "/projects/$projectId",
94
- params: { projectId: e }
94
+ params: { projectId: t }
95
95
  });
96
96
  }, X = () => {
97
97
  I();
98
98
  };
99
- if (P === "pending") return /*#__PURE__*/ w(i, {
99
+ if (P === "pending") return /*#__PURE__*/ w(a, {
100
100
  className: "fixed inset-0",
101
101
  distribution: "center",
102
102
  alignment: "center",
103
103
  direction: "vertical",
104
- children: [/*#__PURE__*/ C(a, {
104
+ children: [/*#__PURE__*/ C(n, {
105
105
  variant: "primary",
106
106
  size: "large",
107
107
  className: "mb-2"
@@ -130,23 +130,23 @@ function j() {
130
130
  onBackClick: J,
131
131
  onHomeClick: Y
132
132
  });
133
- let Z = N["os-flavor-access:is_public"] !== !1, Q = z || R || B || V ? /*#__PURE__*/ C(c, { children: /*#__PURE__*/ w(r, { children: [/*#__PURE__*/ C(t, {
133
+ let Z = N["os-flavor-access:is_public"] !== !1, Q = z || R || B || V ? /*#__PURE__*/ C(c, { children: /*#__PURE__*/ w(e, { children: [/*#__PURE__*/ C(l, {
134
134
  as: "div",
135
- children: /*#__PURE__*/ C(s, {
135
+ children: /*#__PURE__*/ C(o, {
136
136
  icon: "moreVert",
137
137
  children: /*#__PURE__*/ C(O, { id: "PgNNGl" })
138
138
  })
139
- }), /*#__PURE__*/ w(d, { children: [
140
- (B || V) && /*#__PURE__*/ C(l, {
139
+ }), /*#__PURE__*/ w(u, { children: [
140
+ (B || V) && /*#__PURE__*/ C(s, {
141
141
  label: B ? g._({ id: "SIfYq6" }) : g._({ id: "6GBt0m" }),
142
142
  onClick: U
143
143
  }),
144
- z && /*#__PURE__*/ C(l, {
144
+ z && /*#__PURE__*/ C(s, {
145
145
  label: g._({ id: "cWbW6w" }),
146
146
  onClick: G,
147
147
  disabled: Z
148
148
  }),
149
- R && /*#__PURE__*/ C(l, {
149
+ R && /*#__PURE__*/ C(s, {
150
150
  label: g._({ id: "JT3I1g" }),
151
151
  onClick: q
152
152
  })
@@ -154,34 +154,34 @@ function j() {
154
154
  return /*#__PURE__*/ w(S, { children: [
155
155
  /*#__PURE__*/ C(_, {
156
156
  title: N.name,
157
- projectId: e,
157
+ projectId: t,
158
158
  actions: Q
159
159
  }),
160
- /*#__PURE__*/ C(i, {
160
+ /*#__PURE__*/ C(a, {
161
161
  direction: "vertical",
162
162
  children: /*#__PURE__*/ C(A, { flavor: N })
163
163
  }),
164
- o && /*#__PURE__*/ w(S, { children: [
164
+ i && /*#__PURE__*/ w(S, { children: [
165
165
  H && /*#__PURE__*/ C(y, {
166
- client: o,
166
+ client: i,
167
167
  isOpen: H,
168
168
  onClose: U,
169
- project: e,
169
+ project: t,
170
170
  flavor: N,
171
171
  canEdit: B
172
172
  }),
173
173
  W && /*#__PURE__*/ C(v, {
174
- client: o,
174
+ client: i,
175
175
  isOpen: W,
176
176
  onClose: G,
177
- project: e,
177
+ project: t,
178
178
  flavor: N
179
179
  }),
180
180
  K && /*#__PURE__*/ C(b, {
181
- client: o,
181
+ client: i,
182
182
  isOpen: K,
183
183
  onClose: q,
184
- project: e,
184
+ project: t,
185
185
  flavor: N,
186
186
  onSuccess: J
187
187
  })
@@ -191,4 +191,4 @@ function j() {
191
191
  //#endregion
192
192
  export { j as component };
193
193
 
194
- //# sourceMappingURL=_flavorId-CR8ZUI-P.mjs.map
194
+ //# sourceMappingURL=_flavorId-CFpNGz52.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_flavorId-CR8ZUI-P.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
+ {"version":3,"file":"_flavorId-CFpNGz52.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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"}
@@ -16,7 +16,7 @@ var i = t("/_auth/projects/$projectId/network/floatingips/$floatingIpId/")({
16
16
  floatingip_id: t.floatingIpId
17
17
  }))?.floating_ip_address ?? null }),
18
18
  head: ({ loaderData: e }) => ({ meta: [{ title: e?.floatingIpAddress ?? "Floating IP" }] }),
19
- component: n(() => import("./_floatingIpId-BGrOAmPT.mjs"), "component"),
19
+ component: n(() => import("./_floatingIpId-C2-BeRmF.mjs"), "component"),
20
20
  beforeLoad: async ({ context: t, params: n }) => {
21
21
  let { trpcClient: i } = t, a = e(await i?.auth.getAvailableServices.query() || []);
22
22
  if (!a.network || !a.network.neutron) throw r({
@@ -28,4 +28,4 @@ var i = t("/_auth/projects/$projectId/network/floatingips/$floatingIpId/")({
28
28
  //#endregion
29
29
  export { i as t };
30
30
 
31
- //# sourceMappingURL=_floatingIpId-BCk41_Lb.mjs.map
31
+ //# sourceMappingURL=_floatingIpId-B5GMSLeQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_floatingIpId-BCk41_Lb.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","floatingIp","trpcClient","network","getById","query","project_id","projectId","floatingip_id","floatingIpId","floatingIpAddress","floating_ip_address","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Button, ContentHeading, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { FloatingIpDetailsView } from \"./-components/-details/FloatingIpDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/floatingips/$floatingIpId/\")({\n staticData: {\n section: \"network\",\n service: \"floatingips\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Network\" },\n crumb: { labelKey: \"Floating IPs\", to: \"/projects/$projectId/network/floatingips\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const floatingIp = await context.trpcClient?.network.floatingIp.getById.query({\n project_id: params.projectId,\n floatingip_id: params.floatingIpId,\n })\n return { floatingIpAddress: floatingIp?.floating_ip_address ?? null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.floatingIpAddress ?? \"Floating IP\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect if network service not available\n if (!serviceIndex[\"network\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n\n if (!serviceIndex[\"network\"][\"neutron\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { floatingIpId } = Route.useParams()\n const projectId = useProjectId()\n const navigate = useNavigate()\n\n // Fetch floating IP details\n const {\n data: floatingIp,\n isLoading,\n isError,\n error,\n } = trpcReact.network.floatingIp.getById.useQuery({\n project_id: projectId,\n floatingip_id: floatingIpId,\n })\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId },\n })\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 Floating IP Details...</Trans>\n </Stack>\n )\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 floating IP</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!floatingIp) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Floating IP not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // Success state\n return (\n <>\n <ContentHeading>{floatingIp.floating_ip_address}</ContentHeading>\n <FloatingIpDetailsView floatingIp={floatingIp} />\n </>\n )\n}\n"],"mappings":";;AASA,IAAaG,IAAQH,EAAgB,+DAAA,EAAiE;CACpGI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,UAAU;EACpCC,OAAO;GAAED,UAAU;GAAgBE,IAAI;EAA2C;CACpF;CACAE,QAAQ,OAAO,EAAEC,YAASC,iBAKjB,EAAEU,oBAAmBT,MAJHF,EAAQG,YAAYC,QAAQF,WAAWG,QAAQC,MAAM;EAC5EC,YAAYN,EAAOO;EACnBC,eAAeR,EAAOS;CACxB,CAAA,IACwCE,uBAAuB,KAAK;CAEtEC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYH,qBAAqB,cAAc,CAAA,EACjE;CACAM,WAASC,gDAAA,WAAA;CACTE,YAAY,OAAO,EAAEpB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAGjBwB,IAAepC,EADK,MAAOe,GAAYmB,KAAKC,qBAAqBjB,MAAAA,KAAY,CAAA,CAC9Ce;EAUrC,IAPI,CAACG,EAAa,WAOd,CAACA,EAAa,QAAW,SAC3B,MAAMrC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,WAAWP,EAAOO,UAAU;EACxC,CAAA;CAEJ;AACF,CAAA"}
1
+ {"version":3,"file":"_floatingIpId-B5GMSLeQ.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","floatingIp","trpcClient","network","getById","query","project_id","projectId","floatingip_id","floatingIpId","floatingIpAddress","floating_ip_address","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Button, ContentHeading, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { FloatingIpDetailsView } from \"./-components/-details/FloatingIpDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/floatingips/$floatingIpId/\")({\n staticData: {\n section: \"network\",\n service: \"floatingips\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Network\" },\n crumb: { labelKey: \"Floating IPs\", to: \"/projects/$projectId/network/floatingips\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const floatingIp = await context.trpcClient?.network.floatingIp.getById.query({\n project_id: params.projectId,\n floatingip_id: params.floatingIpId,\n })\n return { floatingIpAddress: floatingIp?.floating_ip_address ?? null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.floatingIpAddress ?? \"Floating IP\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect if network service not available\n if (!serviceIndex[\"network\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n\n if (!serviceIndex[\"network\"][\"neutron\"]) {\n throw redirect({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { floatingIpId } = Route.useParams()\n const projectId = useProjectId()\n const navigate = useNavigate()\n\n // Fetch floating IP details\n const {\n data: floatingIp,\n isLoading,\n isError,\n error,\n } = trpcReact.network.floatingIp.getById.useQuery({\n project_id: projectId,\n floatingip_id: floatingIpId,\n })\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/network/floatingips\",\n params: { projectId },\n })\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 Floating IP Details...</Trans>\n </Stack>\n )\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 floating IP</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!floatingIp) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Floating IP not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Floating IPs</Trans>\n </Button>\n </Stack>\n )\n }\n\n // Success state\n return (\n <>\n <ContentHeading>{floatingIp.floating_ip_address}</ContentHeading>\n <FloatingIpDetailsView floatingIp={floatingIp} />\n </>\n )\n}\n"],"mappings":";;AASA,IAAaG,IAAQH,EAAgB,+DAAA,EAAiE;CACpGI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,UAAU;EACpCC,OAAO;GAAED,UAAU;GAAgBE,IAAI;EAA2C;CACpF;CACAE,QAAQ,OAAO,EAAEC,YAASC,iBAKjB,EAAEU,oBAAmBT,MAJHF,EAAQG,YAAYC,QAAQF,WAAWG,QAAQC,MAAM;EAC5EC,YAAYN,EAAOO;EACnBC,eAAeR,EAAOS;CACxB,CAAA,IACwCE,uBAAuB,KAAK;CAEtEC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYH,qBAAqB,cAAc,CAAA,EACjE;CACAM,WAASC,gDAAA,WAAA;CACTE,YAAY,OAAO,EAAEpB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAGjBwB,IAAepC,EADK,MAAOe,GAAYmB,KAAKC,qBAAqBjB,MAAAA,KAAY,CAAA,CAC9Ce;EAUrC,IAPI,CAACG,EAAa,WAOd,CAACA,EAAa,QAAW,SAC3B,MAAMrC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,WAAWP,EAAOO,UAAU;EACxC,CAAA;CAEJ;AACF,CAAA"}