@cobaltcore-dev/aurora 2.1.0 → 2.2.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 (171) hide show
  1. package/README.md +31 -25
  2. package/dist/client/AuroraApp.d.ts +9 -2
  3. package/dist/client/context/AppConfigContext.d.ts +44 -0
  4. package/dist/client/index.d.ts +2 -0
  5. package/dist/client/index.js +41221 -844
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/client/trpcClient.d.ts +314 -1
  8. package/dist/client/utils/appConfigGating.d.ts +21 -0
  9. package/dist/server/index.d.ts +694 -4
  10. package/dist/server/index.js +2521 -1243
  11. package/package.json +2 -2
  12. package/dist/client/AuthProvider-CVSAwW9f.mjs +0 -83
  13. package/dist/client/AuthProvider-CVSAwW9f.mjs.map +0 -1
  14. package/dist/client/ContentHeader-fKKZVu-o.mjs +0 -116
  15. package/dist/client/ContentHeader-fKKZVu-o.mjs.map +0 -1
  16. package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs +0 -802
  17. package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs.map +0 -1
  18. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs +0 -26
  19. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs.map +0 -1
  20. package/dist/client/FiltersInput-Becwxo_J.mjs +0 -85
  21. package/dist/client/FiltersInput-Becwxo_J.mjs.map +0 -1
  22. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs +0 -466
  23. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs.map +0 -1
  24. package/dist/client/ImageToastNotifications-BWfzOUMc.mjs +0 -1135
  25. package/dist/client/ImageToastNotifications-BWfzOUMc.mjs.map +0 -1
  26. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +0 -26
  27. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +0 -1
  28. package/dist/client/Slot-CWb612-_.mjs +0 -28
  29. package/dist/client/Slot-CWb612-_.mjs.map +0 -1
  30. package/dist/client/SortInput-4g7nSTHW.mjs +0 -34
  31. package/dist/client/SortInput-4g7nSTHW.mjs.map +0 -1
  32. package/dist/client/StorageNotFound-B-zVinVD.mjs +0 -30
  33. package/dist/client/StorageNotFound-B-zVinVD.mjs.map +0 -1
  34. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs +0 -28
  35. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs.map +0 -1
  36. package/dist/client/_-CAsCx-Ay.mjs +0 -6
  37. package/dist/client/_-CAsCx-Ay.mjs.map +0 -1
  38. package/dist/client/_auth-SrDjHL6j.mjs +0 -12
  39. package/dist/client/_auth-SrDjHL6j.mjs.map +0 -1
  40. package/dist/client/_flavorId-0PioWpEp.mjs +0 -276
  41. package/dist/client/_flavorId-0PioWpEp.mjs.map +0 -1
  42. package/dist/client/_flavorId-B7fp6Nk8.mjs +0 -22
  43. package/dist/client/_flavorId-B7fp6Nk8.mjs.map +0 -1
  44. package/dist/client/_flavorId-CgueqKTs.mjs +0 -27
  45. package/dist/client/_flavorId-CgueqKTs.mjs.map +0 -1
  46. package/dist/client/_floatingIpId-B8r64AL9.mjs +0 -196
  47. package/dist/client/_floatingIpId-B8r64AL9.mjs.map +0 -1
  48. package/dist/client/_floatingIpId-lEobpOER.mjs +0 -26
  49. package/dist/client/_floatingIpId-lEobpOER.mjs.map +0 -1
  50. package/dist/client/_imageId-Ccv8PedW.mjs +0 -40
  51. package/dist/client/_imageId-Ccv8PedW.mjs.map +0 -1
  52. package/dist/client/_imageId-CiqEQB_J.mjs +0 -558
  53. package/dist/client/_imageId-CiqEQB_J.mjs.map +0 -1
  54. package/dist/client/_imageId-D9LR-02T.mjs +0 -22
  55. package/dist/client/_imageId-D9LR-02T.mjs.map +0 -1
  56. package/dist/client/_projectId-BDARsteX.mjs +0 -77
  57. package/dist/client/_projectId-BDARsteX.mjs.map +0 -1
  58. package/dist/client/_projectId-CtyAHqhH.mjs +0 -30
  59. package/dist/client/_projectId-CtyAHqhH.mjs.map +0 -1
  60. package/dist/client/_projectId-D3VOH5lN.mjs +0 -94
  61. package/dist/client/_projectId-D3VOH5lN.mjs.map +0 -1
  62. package/dist/client/_projectId-ZBk6vka0.mjs +0 -283
  63. package/dist/client/_projectId-ZBk6vka0.mjs.map +0 -1
  64. package/dist/client/_securityGroupId-BwgZnoiR.mjs +0 -29
  65. package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +0 -1
  66. package/dist/client/_securityGroupId-Cz2NUHdB.mjs +0 -1819
  67. package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +0 -1
  68. package/dist/client/_serviceType-DS8DxsrP.mjs +0 -20
  69. package/dist/client/_serviceType-DS8DxsrP.mjs.map +0 -1
  70. package/dist/client/_serviceType-M8d9rOT6.mjs +0 -6
  71. package/dist/client/_serviceType-M8d9rOT6.mjs.map +0 -1
  72. package/dist/client/_storageType-BNpP1A2N.mjs +0 -13
  73. package/dist/client/_storageType-BNpP1A2N.mjs.map +0 -1
  74. package/dist/client/_storageType-BxSGKhAI.mjs +0 -15
  75. package/dist/client/_storageType-BxSGKhAI.mjs.map +0 -1
  76. package/dist/client/_storageType-DZYCmiLt.mjs +0 -30
  77. package/dist/client/_storageType-DZYCmiLt.mjs.map +0 -1
  78. package/dist/client/_storageType-UqAMP-8d.mjs +0 -859
  79. package/dist/client/_storageType-UqAMP-8d.mjs.map +0 -1
  80. package/dist/client/_storageType-u51_7OwJ.mjs +0 -7
  81. package/dist/client/_storageType-u51_7OwJ.mjs.map +0 -1
  82. package/dist/client/about-BmQTyLWc.mjs +0 -92
  83. package/dist/client/about-BmQTyLWc.mjs.map +0 -1
  84. package/dist/client/assets/__mocks__/svgMock.d.ts +0 -3
  85. package/dist/client/aurora-CIml-f2f.mjs +0 -19
  86. package/dist/client/aurora-CIml-f2f.mjs.map +0 -1
  87. package/dist/client/build-WuxXRAqf.mjs +0 -14530
  88. package/dist/client/build-WuxXRAqf.mjs.map +0 -1
  89. package/dist/client/cn-DM4Cy3jv.mjs +0 -10
  90. package/dist/client/cn-DM4Cy3jv.mjs.map +0 -1
  91. package/dist/client/flavors-Ce3J-cFa.mjs +0 -15
  92. package/dist/client/flavors-Ce3J-cFa.mjs.map +0 -1
  93. package/dist/client/flavors-D5ThLaXO.mjs +0 -666
  94. package/dist/client/flavors-D5ThLaXO.mjs.map +0 -1
  95. package/dist/client/flavors-DWMZ6TuJ.mjs +0 -8
  96. package/dist/client/flavors-DWMZ6TuJ.mjs.map +0 -1
  97. package/dist/client/floatingips-Cz9k80cc.mjs +0 -8
  98. package/dist/client/floatingips-Cz9k80cc.mjs.map +0 -1
  99. package/dist/client/floatingips-DXnRlLvV.mjs +0 -551
  100. package/dist/client/floatingips-DXnRlLvV.mjs.map +0 -1
  101. package/dist/client/floatingips-HRbuLxiN.mjs +0 -22
  102. package/dist/client/floatingips-HRbuLxiN.mjs.map +0 -1
  103. package/dist/client/floatingips-nN1kQmsu.mjs +0 -14
  104. package/dist/client/floatingips-nN1kQmsu.mjs.map +0 -1
  105. package/dist/client/formatBytes-CZv_XyCY.mjs +0 -38
  106. package/dist/client/formatBytes-CZv_XyCY.mjs.map +0 -1
  107. package/dist/client/helpers-1PpYf-fC.mjs +0 -6
  108. package/dist/client/helpers-1PpYf-fC.mjs.map +0 -1
  109. package/dist/client/hooks-D0yKIumu.mjs +0 -22
  110. package/dist/client/hooks-D0yKIumu.mjs.map +0 -1
  111. package/dist/client/images-C8M3ysWR.mjs +0 -2023
  112. package/dist/client/images-C8M3ysWR.mjs.map +0 -1
  113. package/dist/client/images-Cf5R28NR.mjs +0 -15
  114. package/dist/client/images-Cf5R28NR.mjs.map +0 -1
  115. package/dist/client/images-NBf2bV43.mjs +0 -8
  116. package/dist/client/images-NBf2bV43.mjs.map +0 -1
  117. package/dist/client/md-kvaGCNAK.mjs +0 -336
  118. package/dist/client/md-kvaGCNAK.mjs.map +0 -1
  119. package/dist/client/network-DuZm76BZ.mjs +0 -8
  120. package/dist/client/network-DuZm76BZ.mjs.map +0 -1
  121. package/dist/client/objects-BudUAfWY.mjs +0 -12909
  122. package/dist/client/objects-BudUAfWY.mjs.map +0 -1
  123. package/dist/client/objects-Dc7sKUr8.mjs +0 -67
  124. package/dist/client/objects-Dc7sKUr8.mjs.map +0 -1
  125. package/dist/client/objects-Dw7oeTq2.mjs +0 -80
  126. package/dist/client/objects-Dw7oeTq2.mjs.map +0 -1
  127. package/dist/client/objects-_g7nGIn5.mjs +0 -25
  128. package/dist/client/objects-_g7nGIn5.mjs.map +0 -1
  129. package/dist/client/objects-eBxvY6_n.mjs +0 -78
  130. package/dist/client/objects-eBxvY6_n.mjs.map +0 -1
  131. package/dist/client/projects-yiK0HGSA.mjs +0 -7
  132. package/dist/client/projects-yiK0HGSA.mjs.map +0 -1
  133. package/dist/client/routeInfo-DP3v74Wg.mjs +0 -19
  134. package/dist/client/routeInfo-DP3v74Wg.mjs.map +0 -1
  135. package/dist/client/routes-CJj7SR_K.mjs +0 -10
  136. package/dist/client/routes-CJj7SR_K.mjs.map +0 -1
  137. package/dist/client/routes-xofA3ksU.mjs +0 -110
  138. package/dist/client/routes-xofA3ksU.mjs.map +0 -1
  139. package/dist/client/securitygroups-67fFxiwt.mjs +0 -15
  140. package/dist/client/securitygroups-67fFxiwt.mjs.map +0 -1
  141. package/dist/client/securitygroups-CtKne8UQ.mjs +0 -8
  142. package/dist/client/securitygroups-CtKne8UQ.mjs.map +0 -1
  143. package/dist/client/securitygroups-DXrfyuVF.mjs +0 -580
  144. package/dist/client/securitygroups-DXrfyuVF.mjs.map +0 -1
  145. package/dist/client/securitygroups-WLB1_IM6.mjs +0 -22
  146. package/dist/client/securitygroups-WLB1_IM6.mjs.map +0 -1
  147. package/dist/client/securitygroups-o0IXZM6S.mjs +0 -14
  148. package/dist/client/securitygroups-o0IXZM6S.mjs.map +0 -1
  149. package/dist/client/serviceCatalog-B3lKWC9V.mjs +0 -6
  150. package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +0 -1
  151. package/dist/client/services-D1PbooD1.mjs +0 -6
  152. package/dist/client/services-D1PbooD1.mjs.map +0 -1
  153. package/dist/client/services-DEMVtFyn.mjs +0 -9
  154. package/dist/client/services-DEMVtFyn.mjs.map +0 -1
  155. package/dist/client/storageProviders-CJ5rOh13.mjs +0 -15
  156. package/dist/client/storageProviders-CJ5rOh13.mjs.map +0 -1
  157. package/dist/client/trpcClient-D7gpR7YG.mjs +0 -71
  158. package/dist/client/trpcClient-D7gpR7YG.mjs.map +0 -1
  159. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs +0 -54
  160. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs.map +0 -1
  161. package/dist/client/useModal-DCs1OJh7.mjs +0 -12
  162. package/dist/client/useModal-DCs1OJh7.mjs.map +0 -1
  163. package/dist/client/useModalTracking-BYd37pXm.mjs +0 -37
  164. package/dist/client/useModalTracking-BYd37pXm.mjs.map +0 -1
  165. package/dist/client/useProjectId-DBc5lpoU.mjs +0 -11
  166. package/dist/client/useProjectId-DBc5lpoU.mjs.map +0 -1
  167. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +0 -294
  168. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +0 -1
  169. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs +0 -19
  170. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs.map +0 -1
  171. package/dist/client/utils/trpcErrors.d.ts +0 -13
@@ -1,276 +0,0 @@
1
- import { A as e, D as t, E as n, M as r, Q as i, at as a, c as o, g as s, i as c, n as l, r as u, rt as d, s as f, x as p } from "./build-WuxXRAqf.mjs";
2
- import { a as m } from "./trpcClient-D7gpR7YG.mjs";
3
- import { t as h } from "./_flavorId-CgueqKTs.mjs";
4
- import { t as g } from "./useProjectId-DBc5lpoU.mjs";
5
- import { n as _, t as v } from "./ContentHeader-fKKZVu-o.mjs";
6
- import { t as y } from "./useSetBreadcrumb-tn7lBaQV.mjs";
7
- import { a as b, n as x, o as S, t as C } from "./DeleteFlavorModal-Be2GFiB_.mjs";
8
- import { t as w } from "./useModal-DCs1OJh7.mjs";
9
- import { Fragment as T, jsx as E, jsxs as D } from "react/jsx-runtime";
10
- import { Fragment as O } from "react";
11
- import { useNavigate as k, useParams as ee } from "@tanstack/react-router";
12
- import { Trans as A, useLingui as j } from "@lingui/react";
13
- //#region src/client/routes/_auth/projects/$projectId/compute/flavors/-components/FlavorDetailsView.tsx
14
- function te({ flavor: e, canListSpecs: t = !1 }) {
15
- let { i18n: r, _: o } = j(), s = g(), c = (e, t) => `${e} ${t}`, { data: u, isLoading: p, isError: h } = m.compute.getExtraSpecs.useQuery({
16
- project_id: s,
17
- flavorId: e.id
18
- }, { enabled: !!s && !!e.id && t }), v = [
19
- {
20
- label: r._({ id: "S0kLOH" }),
21
- value: /*#__PURE__*/ E(_, { text: e.id })
22
- },
23
- {
24
- label: r._({ id: "6YtxFj" }),
25
- value: e.name
26
- },
27
- {
28
- label: r._({ id: "Nu4oKW" }),
29
- value: e?.description ?? ""
30
- },
31
- {
32
- label: r._({ id: "7d1a0d" }),
33
- value: e["os-flavor-access:is_public"] ? /*#__PURE__*/ E(A, { id: "l75CjT" }) : /*#__PURE__*/ E(A, { id: "1UzENP" })
34
- },
35
- {
36
- label: r._({ id: "E/QGRL" }),
37
- value: e["OS-FLV-DISABLED:disabled"] ? /*#__PURE__*/ E(A, { id: "l75CjT" }) : /*#__PURE__*/ E(A, { id: "1UzENP" })
38
- }
39
- ], y = [
40
- {
41
- label: r._({ id: "MZGbkp" }),
42
- value: e.vcpus
43
- },
44
- {
45
- label: r._({ id: "RGhYAo" }),
46
- value: c(e.ram, "MiB")
47
- },
48
- {
49
- label: r._({ id: "cJDQIO" }),
50
- value: c(e.disk, "GiB")
51
- },
52
- {
53
- label: r._({ id: "r9Aac8" }),
54
- value: c(e["OS-FLV-EXT-DATA:ephemeral"] || 0, "GiB")
55
- },
56
- {
57
- label: r._({ id: "vH2C/2" }),
58
- value: e.swap === 0 || e.swap === "" ? /*#__PURE__*/ E(A, { id: "EdQY6l" }) : c(Number(e.swap), "MiB")
59
- },
60
- {
61
- label: r._({ id: "u5HztT" }),
62
- value: e.rxtx_factor ?? ""
63
- }
64
- ], b = u ? Object.entries(u).map(([e, t]) => ({
65
- label: e,
66
- value: t
67
- })) : [];
68
- return /*#__PURE__*/ D(i, {
69
- direction: "vertical",
70
- gap: "6",
71
- className: "mt-6",
72
- children: [/*#__PURE__*/ D(i, {
73
- direction: "horizontal",
74
- gap: "6",
75
- className: "grid grid-cols-2",
76
- children: [/*#__PURE__*/ D(i, {
77
- direction: "vertical",
78
- gap: "2",
79
- children: [/*#__PURE__*/ E(a, { children: /*#__PURE__*/ E(A, { id: "JlSgnX" }) }), /*#__PURE__*/ E(f, {
80
- alignTerms: "right",
81
- children: v.map(({ label: e, value: t }, r) => /*#__PURE__*/ D(O, { children: [/*#__PURE__*/ E(l, { children: e }), /*#__PURE__*/ E(n, { children: /*#__PURE__*/ E("div", {
82
- className: "truncate",
83
- children: t
84
- }) })] }, `basic-${r}`))
85
- })]
86
- }), /*#__PURE__*/ D(i, {
87
- direction: "vertical",
88
- gap: "2",
89
- children: [/*#__PURE__*/ E(a, { children: /*#__PURE__*/ E(A, { id: "qQ1QBh" }) }), /*#__PURE__*/ E(f, {
90
- alignTerms: "right",
91
- children: y.map(({ label: e, value: t }, r) => /*#__PURE__*/ D(O, { children: [/*#__PURE__*/ E(l, { children: e }), /*#__PURE__*/ E(n, { children: /*#__PURE__*/ E("div", {
92
- className: "truncate",
93
- children: t
94
- }) })] }, `hardware-${r}`))
95
- })]
96
- })]
97
- }), t && /*#__PURE__*/ D(i, {
98
- direction: "vertical",
99
- gap: "2",
100
- children: [/*#__PURE__*/ E(a, { children: /*#__PURE__*/ E(A, { id: "6GBt0m" }) }), p ? /*#__PURE__*/ E(d, { status: "progress" }) : h ? /*#__PURE__*/ E(d, {
101
- status: "error",
102
- title: r._({ id: "mXHHga" })
103
- }) : u && Object.keys(u).length > 0 ? /*#__PURE__*/ E(f, {
104
- alignTerms: "right",
105
- className: "grid-cols-2",
106
- children: b.map(({ label: e, value: t }, r) => /*#__PURE__*/ D(O, { children: [/*#__PURE__*/ E(l, {
107
- className: "col-span-1 break-all",
108
- children: e
109
- }), /*#__PURE__*/ E(n, {
110
- className: "col-span-1",
111
- children: /*#__PURE__*/ E("div", {
112
- className: "break-all",
113
- children: t
114
- })
115
- })] }, `extra-${r}`))
116
- }) : /*#__PURE__*/ E(d, {
117
- status: "empty",
118
- title: r._({ id: "qTRcSX" })
119
- })]
120
- })]
121
- });
122
- }
123
- //#endregion
124
- //#region src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx?tsr-split=component
125
- function M() {
126
- let { projectId: n, flavorId: a } = ee({ from: "/_auth/projects/$projectId/compute/flavors/$flavorId" }), { trpcClient: l } = h.useRouteContext(), f = k(), { i18n: g, _ } = j(), { translateError: O, isRetryableError: M } = S(), N = m.useUtils(), { data: P, status: F, error: I, refetch: L } = m.compute.getFlavorById.useQuery({
127
- project_id: n,
128
- flavorId: a
129
- });
130
- y(h.id, P?.name);
131
- let { data: R } = m.compute.canUser.useQuery({
132
- project_id: n,
133
- permission: [
134
- "flavors:delete",
135
- "flavors:add_project",
136
- "flavors:remove_project",
137
- "flavor_specs:list",
138
- "flavor_specs:create",
139
- "flavor_specs:delete"
140
- ]
141
- }), z = R?.[0] ?? !1, B = (R?.[1] ?? !1) || (R?.[2] ?? !1), V = R?.[3] ?? !1, ne = (R?.[4] ?? !1) || (R?.[5] ?? !1), [H, U] = w(), [W, G] = w(), [K, q] = w(), J = () => {
142
- U(), N.compute.getExtraSpecs.invalidate({
143
- project_id: n,
144
- flavorId: a
145
- });
146
- }, Y = () => {
147
- f({
148
- to: "/projects/$projectId/compute/flavors",
149
- params: { projectId: n }
150
- });
151
- }, X = () => {
152
- f({
153
- to: "/projects/$projectId",
154
- params: { projectId: n }
155
- });
156
- }, re = () => {
157
- L();
158
- };
159
- if (F === "pending") return /*#__PURE__*/ E(d, {
160
- status: "progress",
161
- title: g._({ id: "YNgcgc" })
162
- });
163
- if (F === "error") {
164
- let t = I?.message || "UNKNOWN_ERROR", n = O(t), i = M(t);
165
- return /*#__PURE__*/ E(e, {
166
- className: "py-8",
167
- children: /*#__PURE__*/ E(d, {
168
- status: "error",
169
- code: ((e) => {
170
- if (e.includes("UNAUTHORIZED")) return 401;
171
- if (e.includes("FORBIDDEN")) return 403;
172
- if (e.includes("NOT_FOUND")) return 404;
173
- if (e.includes("SERVER_ERROR")) return 500;
174
- })(t),
175
- title: g._({ id: "FjONW3" }),
176
- body: n,
177
- action: /*#__PURE__*/ D(r, { children: [
178
- /*#__PURE__*/ E(c, {
179
- variant: "primary",
180
- onClick: Y,
181
- children: /*#__PURE__*/ E(A, { id: "iH8pgl" })
182
- }),
183
- /*#__PURE__*/ E(c, {
184
- onClick: X,
185
- children: /*#__PURE__*/ E(A, { id: "i0qMbr" })
186
- }),
187
- i && /*#__PURE__*/ E(c, {
188
- onClick: re,
189
- children: /*#__PURE__*/ E(A, { id: "qJb6G2" })
190
- })
191
- ] })
192
- })
193
- });
194
- }
195
- if (!P) return /*#__PURE__*/ E(e, {
196
- className: "py-8",
197
- children: /*#__PURE__*/ E(d, {
198
- status: "error",
199
- code: 404,
200
- title: g._({ id: "bpme7e" }),
201
- body: g._({ id: "y0u86k" }),
202
- action: /*#__PURE__*/ D(r, { children: [/*#__PURE__*/ E(c, {
203
- variant: "primary",
204
- onClick: Y,
205
- children: /*#__PURE__*/ E(A, { id: "iH8pgl" })
206
- }), /*#__PURE__*/ E(c, {
207
- onClick: X,
208
- children: /*#__PURE__*/ E(A, { id: "i0qMbr" })
209
- })] })
210
- })
211
- });
212
- let Z = P["os-flavor-access:is_public"] !== !1, Q = B && !Z || z, $ = ne && V, ie = Q || $ ? /*#__PURE__*/ D(i, {
213
- gap: "0.5",
214
- alignment: "center",
215
- children: [Q && /*#__PURE__*/ D(t, { children: [/*#__PURE__*/ E(o, {
216
- as: "div",
217
- children: /*#__PURE__*/ E(c, {
218
- icon: "moreVert",
219
- title: g._({ id: "PgNNGl" }),
220
- "aria-label": g._({ id: "PgNNGl" })
221
- })
222
- }), /*#__PURE__*/ D(s, { children: [B && !Z && /*#__PURE__*/ E(p, {
223
- label: g._({ id: "cWbW6w" }),
224
- onClick: G
225
- }), z && /*#__PURE__*/ D(T, { children: [/*#__PURE__*/ E(u, {}), /*#__PURE__*/ E(p, {
226
- label: g._({ id: "JT3I1g" }),
227
- onClick: q
228
- })] })] })] }), $ && /*#__PURE__*/ E(c, {
229
- variant: "primary",
230
- onClick: U,
231
- children: /*#__PURE__*/ E(A, { id: "SIfYq6" })
232
- })]
233
- }) : void 0;
234
- return /*#__PURE__*/ D(T, { children: [
235
- /*#__PURE__*/ E(v, {
236
- title: P.name,
237
- projectId: n,
238
- actions: ie
239
- }),
240
- /*#__PURE__*/ E(i, {
241
- direction: "vertical",
242
- children: /*#__PURE__*/ E(te, {
243
- flavor: P,
244
- canListSpecs: V
245
- })
246
- }),
247
- l && /*#__PURE__*/ D(T, { children: [
248
- H && /*#__PURE__*/ E(b, {
249
- client: l,
250
- isOpen: H,
251
- onClose: J,
252
- project: n,
253
- flavor: P
254
- }),
255
- W && /*#__PURE__*/ E(x, {
256
- client: l,
257
- isOpen: W,
258
- onClose: G,
259
- project: n,
260
- flavor: P
261
- }),
262
- K && /*#__PURE__*/ E(C, {
263
- client: l,
264
- isOpen: K,
265
- onClose: q,
266
- project: n,
267
- flavor: P,
268
- onSuccess: Y
269
- })
270
- ] })
271
- ] });
272
- }
273
- //#endregion
274
- export { M as component };
275
-
276
- //# sourceMappingURL=_flavorId-0PioWpEp.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_flavorId-0PioWpEp.mjs","names":["Stack","ContentHeading","DescriptionList","DescriptionTerm","DescriptionDefinition","Status","Fragment","ClipboardText","trpcReact","useProjectId","FlavorDetailsView","flavor","canListSpecs","useLingui","projectId","formatWithUnit","value","unit","data","extraSpecs","isLoading","isError","compute","getExtraSpecs","useQuery","project_id","flavorId","id","enabled","basicInfoItems","label","t","text","name","description","hardwareSpecItems","vcpus","ram","disk","swap","Number","rxtx_factor","extraSpecItems","Object","entries","map","key","direction","gap","className","alignTerms","index","div","status","title","keys","length","Button","ButtonRow","Stack","PopupMenu","PopupMenuToggle","PopupMenuOptions","PopupMenuItem","PopupMenuSectionSeparator","Container","Status","useNavigate","useParams","Trans","useLingui","trpcReact","useSetBreadcrumb","FlavorDetailsView","useErrorTranslation","EditSpecModal","ManageAccessModal","DeleteFlavorModal","useModal","ContentHeader","Route","RouteComponent","projectId","flavorId","from","trpcClient","useRouteContext","navigate","t","translateError","isRetryableError","utils","useUtils","data","flavor","status","error","refetch","compute","getFlavorById","useQuery","project_id","id","name","permissionsData","canUser","permission","canDeleteFlavor","canManageAccess","canListSpecs","canManageSpecs","specModalOpen","toggleSpecModal","accessModalOpen","toggleAccessModal","deleteModalOpen","toggleDeleteModal","handleSpecModalClose","getExtraSpecs","invalidate","handleBack","to","params","handleHome","handleRetry","errorCode","message","translatedError","canRetry","getStatusCode","code","includes","undefined","isPublicFlavor","hasPopupMenuItems","canEditMetadata","hasMoreActions","headerActions","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 {\n Stack,\n ContentHeading,\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n Status,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Fragment } from \"react\"\nimport type { Flavor } from \"@/server/Compute/types/flavor\"\nimport ClipboardText from \"@/client/components/ClipboardText\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\ninterface FlavorDetailsViewProps {\n flavor: Flavor\n canListSpecs?: boolean\n}\n\nexport function FlavorDetailsView({ flavor, canListSpecs = false }: FlavorDetailsViewProps) {\n const { t } = useLingui()\n const projectId = useProjectId()\n const formatWithUnit = (value: number, unit: string) => `${value} ${unit}`\n\n const {\n data: extraSpecs,\n isLoading,\n isError,\n } = trpcReact.compute.getExtraSpecs.useQuery(\n {\n project_id: projectId,\n flavorId: flavor.id,\n },\n {\n enabled: !!projectId && !!flavor.id && canListSpecs,\n }\n )\n\n const basicInfoItems = [\n { label: t`ID`, value: <ClipboardText text={flavor.id} /> },\n { label: t`Name`, value: flavor.name },\n { label: t`Description`, value: flavor?.description ?? \"\" },\n {\n label: t`Public`,\n value: flavor[\"os-flavor-access:is_public\"] ? <Trans>Yes</Trans> : <Trans>No</Trans>,\n },\n {\n label: t`Disabled`,\n value: flavor[\"OS-FLV-DISABLED:disabled\"] ? <Trans>Yes</Trans> : <Trans>No</Trans>,\n },\n ]\n\n const hardwareSpecItems = [\n { label: t`VCPUs`, value: flavor.vcpus },\n { label: t`RAM`, value: formatWithUnit(flavor.ram, \"MiB\") },\n { label: t`Root Disk`, value: formatWithUnit(flavor.disk, \"GiB\") },\n {\n label: t`Ephemeral Disk`,\n value: formatWithUnit(flavor[\"OS-FLV-EXT-DATA:ephemeral\"] || 0, \"GiB\"),\n },\n {\n label: t`Swap`,\n value: flavor.swap === 0 || flavor.swap === \"\" ? <Trans>None</Trans> : formatWithUnit(Number(flavor.swap), \"MiB\"),\n },\n { label: t`RX/TX Factor`, value: flavor.rxtx_factor ?? \"\" },\n ]\n\n const extraSpecItems = extraSpecs ? Object.entries(extraSpecs).map(([key, value]) => ({ label: key, value })) : []\n\n return (\n <Stack direction=\"vertical\" gap=\"6\" className=\"mt-6\">\n <Stack direction=\"horizontal\" gap=\"6\" className=\"grid grid-cols-2\">\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>Flavor Information</Trans>\n </ContentHeading>\n <DescriptionList alignTerms=\"right\">\n {basicInfoItems.map(({ label, value }, index) => (\n <Fragment key={`basic-${index}`}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>\n <div className=\"truncate\">{value}</div>\n </DescriptionDefinition>\n </Fragment>\n ))}\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 {hardwareSpecItems.map(({ label, value }, index) => (\n <Fragment key={`hardware-${index}`}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>\n <div className=\"truncate\">{value}</div>\n </DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n </Stack>\n </Stack>\n\n {canListSpecs && (\n <Stack direction=\"vertical\" gap=\"2\">\n <ContentHeading>\n <Trans>Metadata</Trans>\n </ContentHeading>\n {isLoading ? (\n <Status status=\"progress\" />\n ) : isError ? (\n <Status status=\"error\" title={t`Failed to Load Metadata`} />\n ) : extraSpecs && Object.keys(extraSpecs).length > 0 ? (\n <DescriptionList alignTerms=\"right\" className=\"grid-cols-2\">\n {extraSpecItems.map(({ label, value }, index) => (\n <Fragment key={`extra-${index}`}>\n <DescriptionTerm className=\"col-span-1 break-all\">{label}</DescriptionTerm>\n <DescriptionDefinition className=\"col-span-1\">\n <div className=\"break-all\">{value}</div>\n </DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n ) : (\n <Status status=\"empty\" title={t`No Metadata Properties Found`} />\n )}\n </Stack>\n )}\n </Stack>\n )\n}\n","import {\n Button,\n ButtonRow,\n Stack,\n PopupMenu,\n PopupMenuToggle,\n PopupMenuOptions,\n PopupMenuItem,\n PopupMenuSectionSeparator,\n Container,\n Status,\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 { useSetBreadcrumb } from \"@/client/hooks/useSetBreadcrumb\"\nimport { FlavorDetailsView } from \"./-components/FlavorDetailsView\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport { EditSpecModal } from \"./-components/EditSpecModal\"\nimport { ManageAccessModal } from \"./-components/ManageAccessModal\"\nimport { DeleteFlavorModal } from \"./-components/DeleteFlavorModal\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { RouteIdLevelDefaultError } from \"@/client/components/Errors/RouteIdLevelDefaultError\"\n\nfunction FlavorErrorComponent() {\n const { t } = useLingui()\n const navigate = useNavigate()\n const { projectId } = Route.useParams()\n\n return (\n <RouteIdLevelDefaultError\n action={\n <Button\n variant=\"primary\"\n onClick={() => navigate({ to: \"/projects/$projectId/compute/flavors\", params: { projectId } })}\n >\n {t`Back to Flavors`}\n </Button>\n }\n />\n )\n}\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/flavors/$flavorId\")({\n staticData: {\n section: \"compute\",\n service: \"flavors\",\n analytics: {\n name: \"compute.flavors.detail\",\n },\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 errorComponent: FlavorErrorComponent,\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 const utils = trpcReact.useUtils()\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 useSetBreadcrumb(Route.id, flavor?.name)\n\n const { data: permissionsData } = trpcReact.compute.canUser.useQuery({\n project_id: projectId,\n permission: [\n \"flavors:delete\",\n \"flavors:add_project\",\n \"flavors:remove_project\",\n \"flavor_specs:list\",\n \"flavor_specs:create\",\n \"flavor_specs:delete\",\n ],\n })\n\n const canDeleteFlavor = permissionsData?.[0] ?? false\n const canManageAccess = (permissionsData?.[1] ?? false) || (permissionsData?.[2] ?? false)\n const canListSpecs = permissionsData?.[3] ?? false\n const canManageSpecs = (permissionsData?.[4] ?? false) || (permissionsData?.[5] ?? false)\n\n const [specModalOpen, toggleSpecModal] = useModal()\n const [accessModalOpen, toggleAccessModal] = useModal()\n const [deleteModalOpen, toggleDeleteModal] = useModal()\n\n const handleSpecModalClose = () => {\n toggleSpecModal()\n utils.compute.getExtraSpecs.invalidate({ project_id: projectId, flavorId })\n }\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 <Status status=\"progress\" title={t`Loading Flavor Details...`} />\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 <Container className=\"py-8\">\n <Status\n status=\"error\"\n code={getStatusCode(errorCode)}\n title={t`Error Loading Flavor`}\n body={translatedError}\n action={\n <ButtonRow>\n <Button variant=\"primary\" onClick={handleBack}>\n <Trans>Back</Trans>\n </Button>\n <Button onClick={handleHome}>\n <Trans>Home</Trans>\n </Button>\n {canRetry && (\n <Button onClick={handleRetry}>\n <Trans>Try Again</Trans>\n </Button>\n )}\n </ButtonRow>\n }\n />\n </Container>\n )\n }\n\n if (!flavor) {\n return (\n <Container className=\"py-8\">\n <Status\n status=\"error\"\n code={404}\n title={t`Flavor Not Found`}\n body={t`The requested flavor could not be found. It may have been deleted or you may not have access to it.`}\n action={\n <ButtonRow>\n <Button variant=\"primary\" onClick={handleBack}>\n <Trans>Back</Trans>\n </Button>\n <Button onClick={handleHome}>\n <Trans>Home</Trans>\n </Button>\n </ButtonRow>\n }\n />\n </Container>\n )\n }\n\n const isPublicFlavor = flavor[\"os-flavor-access:is_public\"] !== false\n const hasPopupMenuItems = (canManageAccess && !isPublicFlavor) || canDeleteFlavor\n const canEditMetadata = canManageSpecs && canListSpecs\n const hasMoreActions = hasPopupMenuItems || canEditMetadata\n\n const headerActions = hasMoreActions ? (\n <Stack gap=\"0.5\" alignment=\"center\">\n {hasPopupMenuItems && (\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button icon=\"moreVert\" title={t`More Actions`} aria-label={t`More Actions`} />\n </PopupMenuToggle>\n <PopupMenuOptions>\n {canManageAccess && !isPublicFlavor && (\n <PopupMenuItem label={t`Manage Access`} onClick={toggleAccessModal} />\n )}\n {canDeleteFlavor && (\n <>\n <PopupMenuSectionSeparator />\n <PopupMenuItem label={t`Delete Flavor`} onClick={toggleDeleteModal} />\n </>\n )}\n </PopupMenuOptions>\n </PopupMenu>\n )}\n {canEditMetadata && (\n <Button variant=\"primary\" onClick={toggleSpecModal}>\n <Trans>Edit Metadata</Trans>\n </Button>\n )}\n </Stack>\n ) : undefined\n\n return (\n <>\n <ContentHeader title={flavor.name} projectId={projectId} actions={headerActions} />\n <Stack direction=\"vertical\">\n <FlavorDetailsView flavor={flavor} canListSpecs={canListSpecs} />\n </Stack>\n\n {trpcClient && (\n <>\n {specModalOpen && (\n <EditSpecModal\n client={trpcClient}\n isOpen={specModalOpen}\n onClose={handleSpecModalClose}\n project={projectId}\n flavor={flavor}\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,22 +0,0 @@
1
- import { i as e } from "./build-WuxXRAqf.mjs";
2
- import { t } from "./_flavorId-CgueqKTs.mjs";
3
- import { t as n } from "./RouteIdLevelDefaultError-DPF_x2tG.mjs";
4
- import { jsx as r } from "react/jsx-runtime";
5
- import { useNavigate as i } from "@tanstack/react-router";
6
- import { useLingui as a } from "@lingui/react";
7
- //#region src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx?tsr-split=errorComponent
8
- function o() {
9
- let { i18n: o, _: s } = a(), c = i(), { projectId: l } = t.useParams();
10
- return /*#__PURE__*/ r(n, { action: /*#__PURE__*/ r(e, {
11
- variant: "primary",
12
- onClick: () => c({
13
- to: "/projects/$projectId/compute/flavors",
14
- params: { projectId: l }
15
- }),
16
- children: o._({ id: "ergacm" })
17
- }) });
18
- }
19
- //#endregion
20
- export { o as errorComponent };
21
-
22
- //# sourceMappingURL=_flavorId-B7fp6Nk8.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_flavorId-B7fp6Nk8.mjs","names":["Button","useNavigate","useLingui","RouteIdLevelDefaultError","FlavorErrorComponent","t","navigate","projectId","Route","useParams","to","params","errorComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx?tsr-split=errorComponent"],"sourcesContent":["import {\n Button,\n ButtonRow,\n Stack,\n PopupMenu,\n PopupMenuToggle,\n PopupMenuOptions,\n PopupMenuItem,\n PopupMenuSectionSeparator,\n Container,\n Status,\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 { useSetBreadcrumb } from \"@/client/hooks/useSetBreadcrumb\"\nimport { FlavorDetailsView } from \"./-components/FlavorDetailsView\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport { EditSpecModal } from \"./-components/EditSpecModal\"\nimport { ManageAccessModal } from \"./-components/ManageAccessModal\"\nimport { DeleteFlavorModal } from \"./-components/DeleteFlavorModal\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { RouteIdLevelDefaultError } from \"@/client/components/Errors/RouteIdLevelDefaultError\"\n\nfunction FlavorErrorComponent() {\n const { t } = useLingui()\n const navigate = useNavigate()\n const { projectId } = Route.useParams()\n\n return (\n <RouteIdLevelDefaultError\n action={\n <Button\n variant=\"primary\"\n onClick={() => navigate({ to: \"/projects/$projectId/compute/flavors\", params: { projectId } })}\n >\n {t`Back to Flavors`}\n </Button>\n }\n />\n )\n}\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/flavors/$flavorId\")({\n staticData: {\n section: \"compute\",\n service: \"flavors\",\n analytics: {\n name: \"compute.flavors.detail\",\n },\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 errorComponent: FlavorErrorComponent,\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 const utils = trpcReact.useUtils()\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 useSetBreadcrumb(Route.id, flavor?.name)\n\n const { data: permissionsData } = trpcReact.compute.canUser.useQuery({\n project_id: projectId,\n permission: [\n \"flavors:delete\",\n \"flavors:add_project\",\n \"flavors:remove_project\",\n \"flavor_specs:list\",\n \"flavor_specs:create\",\n \"flavor_specs:delete\",\n ],\n })\n\n const canDeleteFlavor = permissionsData?.[0] ?? false\n const canManageAccess = (permissionsData?.[1] ?? false) || (permissionsData?.[2] ?? false)\n const canListSpecs = permissionsData?.[3] ?? false\n const canManageSpecs = (permissionsData?.[4] ?? false) || (permissionsData?.[5] ?? false)\n\n const [specModalOpen, toggleSpecModal] = useModal()\n const [accessModalOpen, toggleAccessModal] = useModal()\n const [deleteModalOpen, toggleDeleteModal] = useModal()\n\n const handleSpecModalClose = () => {\n toggleSpecModal()\n utils.compute.getExtraSpecs.invalidate({ project_id: projectId, flavorId })\n }\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 <Status status=\"progress\" title={t`Loading Flavor Details...`} />\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 <Container className=\"py-8\">\n <Status\n status=\"error\"\n code={getStatusCode(errorCode)}\n title={t`Error Loading Flavor`}\n body={translatedError}\n action={\n <ButtonRow>\n <Button variant=\"primary\" onClick={handleBack}>\n <Trans>Back</Trans>\n </Button>\n <Button onClick={handleHome}>\n <Trans>Home</Trans>\n </Button>\n {canRetry && (\n <Button onClick={handleRetry}>\n <Trans>Try Again</Trans>\n </Button>\n )}\n </ButtonRow>\n }\n />\n </Container>\n )\n }\n\n if (!flavor) {\n return (\n <Container className=\"py-8\">\n <Status\n status=\"error\"\n code={404}\n title={t`Flavor Not Found`}\n body={t`The requested flavor could not be found. It may have been deleted or you may not have access to it.`}\n action={\n <ButtonRow>\n <Button variant=\"primary\" onClick={handleBack}>\n <Trans>Back</Trans>\n </Button>\n <Button onClick={handleHome}>\n <Trans>Home</Trans>\n </Button>\n </ButtonRow>\n }\n />\n </Container>\n )\n }\n\n const isPublicFlavor = flavor[\"os-flavor-access:is_public\"] !== false\n const hasPopupMenuItems = (canManageAccess && !isPublicFlavor) || canDeleteFlavor\n const canEditMetadata = canManageSpecs && canListSpecs\n const hasMoreActions = hasPopupMenuItems || canEditMetadata\n\n const headerActions = hasMoreActions ? (\n <Stack gap=\"0.5\" alignment=\"center\">\n {hasPopupMenuItems && (\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button icon=\"moreVert\" title={t`More Actions`} aria-label={t`More Actions`} />\n </PopupMenuToggle>\n <PopupMenuOptions>\n {canManageAccess && !isPublicFlavor && (\n <PopupMenuItem label={t`Manage Access`} onClick={toggleAccessModal} />\n )}\n {canDeleteFlavor && (\n <>\n <PopupMenuSectionSeparator />\n <PopupMenuItem label={t`Delete Flavor`} onClick={toggleDeleteModal} />\n </>\n )}\n </PopupMenuOptions>\n </PopupMenu>\n )}\n {canEditMetadata && (\n <Button variant=\"primary\" onClick={toggleSpecModal}>\n <Trans>Edit Metadata</Trans>\n </Button>\n )}\n </Stack>\n ) : undefined\n\n return (\n <>\n <ContentHeader title={flavor.name} projectId={projectId} actions={headerActions} />\n <Stack direction=\"vertical\">\n <FlavorDetailsView flavor={flavor} canListSpecs={canListSpecs} />\n </Stack>\n\n {trpcClient && (\n <>\n {specModalOpen && (\n <EditSpecModal\n client={trpcClient}\n isOpen={specModalOpen}\n onClose={handleSpecModalClose}\n project={projectId}\n flavor={flavor}\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":";;;;;;;AA2BA,SAASI,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQF,EAAAA,GACRI,IAAWL,EAAAA,GACX,EAAEM,iBAAcC,EAAMC,UAAS;CAErC,OACE,gBAAC,GAAA,EACC,QACE,gBAAC,GAAA;EACC,SAAQ;EACR,eAAeH,EAAS;GAAEI,IAAI;GAAwCC,QAAQ,EAAEJ,aAAU;EAAE,CAAA;EAE3FF,UAAAA,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;;AAKZ"}
@@ -1,27 +0,0 @@
1
- import { t as e } from "./helpers-1PpYf-fC.mjs";
2
- import { createFileRoute as t, lazyRouteComponent as n, redirect as r } from "@tanstack/react-router";
3
- var i = t("/_auth/projects/$projectId/compute/flavors/$flavorId")({
4
- staticData: {
5
- section: "compute",
6
- service: "flavors",
7
- analytics: { name: "compute.flavors.detail" }
8
- },
9
- loader: async ({ context: e, params: t }) => ({ flavorName: (await e.trpcClient?.compute.getFlavorById.query({
10
- project_id: t.projectId,
11
- flavorId: t.flavorId
12
- }))?.name ?? null }),
13
- head: ({ loaderData: e }) => ({ meta: [{ title: e?.flavorName ?? "Flavor Details" }] }),
14
- component: n(() => import("./_flavorId-0PioWpEp.mjs"), "component"),
15
- beforeLoad: async ({ context: t, params: n }) => {
16
- let { trpcClient: i } = t, { projectId: a } = n, o = await i?.auth.getAvailableServices.query() || [], s = e(o);
17
- if (!s.flavor && !s.compute) throw r({
18
- to: "/projects/$projectId",
19
- params: { projectId: a }
20
- });
21
- },
22
- errorComponent: n(() => import("./_flavorId-B7fp6Nk8.mjs"), "errorComponent")
23
- });
24
- //#endregion
25
- export { i as t };
26
-
27
- //# sourceMappingURL=_flavorId-CgueqKTs.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_flavorId-CgueqKTs.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","analytics","name","RouteInfo","loader","context","params","flavor","trpcClient","compute","getFlavorById","query","project_id","projectId","flavorId","flavorName","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex","to","errorComponent","$$splitErrorComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx"],"sourcesContent":["import {\n Button,\n ButtonRow,\n Stack,\n PopupMenu,\n PopupMenuToggle,\n PopupMenuOptions,\n PopupMenuItem,\n PopupMenuSectionSeparator,\n Container,\n Status,\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 { useSetBreadcrumb } from \"@/client/hooks/useSetBreadcrumb\"\nimport { FlavorDetailsView } from \"./-components/FlavorDetailsView\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport { EditSpecModal } from \"./-components/EditSpecModal\"\nimport { ManageAccessModal } from \"./-components/ManageAccessModal\"\nimport { DeleteFlavorModal } from \"./-components/DeleteFlavorModal\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { RouteIdLevelDefaultError } from \"@/client/components/Errors/RouteIdLevelDefaultError\"\n\nfunction FlavorErrorComponent() {\n const { t } = useLingui()\n const navigate = useNavigate()\n const { projectId } = Route.useParams()\n\n return (\n <RouteIdLevelDefaultError\n action={\n <Button\n variant=\"primary\"\n onClick={() => navigate({ to: \"/projects/$projectId/compute/flavors\", params: { projectId } })}\n >\n {t`Back to Flavors`}\n </Button>\n }\n />\n )\n}\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/flavors/$flavorId\")({\n staticData: {\n section: \"compute\",\n service: \"flavors\",\n analytics: {\n name: \"compute.flavors.detail\",\n },\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 errorComponent: FlavorErrorComponent,\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 const utils = trpcReact.useUtils()\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 useSetBreadcrumb(Route.id, flavor?.name)\n\n const { data: permissionsData } = trpcReact.compute.canUser.useQuery({\n project_id: projectId,\n permission: [\n \"flavors:delete\",\n \"flavors:add_project\",\n \"flavors:remove_project\",\n \"flavor_specs:list\",\n \"flavor_specs:create\",\n \"flavor_specs:delete\",\n ],\n })\n\n const canDeleteFlavor = permissionsData?.[0] ?? false\n const canManageAccess = (permissionsData?.[1] ?? false) || (permissionsData?.[2] ?? false)\n const canListSpecs = permissionsData?.[3] ?? false\n const canManageSpecs = (permissionsData?.[4] ?? false) || (permissionsData?.[5] ?? false)\n\n const [specModalOpen, toggleSpecModal] = useModal()\n const [accessModalOpen, toggleAccessModal] = useModal()\n const [deleteModalOpen, toggleDeleteModal] = useModal()\n\n const handleSpecModalClose = () => {\n toggleSpecModal()\n utils.compute.getExtraSpecs.invalidate({ project_id: projectId, flavorId })\n }\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 <Status status=\"progress\" title={t`Loading Flavor Details...`} />\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 <Container className=\"py-8\">\n <Status\n status=\"error\"\n code={getStatusCode(errorCode)}\n title={t`Error Loading Flavor`}\n body={translatedError}\n action={\n <ButtonRow>\n <Button variant=\"primary\" onClick={handleBack}>\n <Trans>Back</Trans>\n </Button>\n <Button onClick={handleHome}>\n <Trans>Home</Trans>\n </Button>\n {canRetry && (\n <Button onClick={handleRetry}>\n <Trans>Try Again</Trans>\n </Button>\n )}\n </ButtonRow>\n }\n />\n </Container>\n )\n }\n\n if (!flavor) {\n return (\n <Container className=\"py-8\">\n <Status\n status=\"error\"\n code={404}\n title={t`Flavor Not Found`}\n body={t`The requested flavor could not be found. It may have been deleted or you may not have access to it.`}\n action={\n <ButtonRow>\n <Button variant=\"primary\" onClick={handleBack}>\n <Trans>Back</Trans>\n </Button>\n <Button onClick={handleHome}>\n <Trans>Home</Trans>\n </Button>\n </ButtonRow>\n }\n />\n </Container>\n )\n }\n\n const isPublicFlavor = flavor[\"os-flavor-access:is_public\"] !== false\n const hasPopupMenuItems = (canManageAccess && !isPublicFlavor) || canDeleteFlavor\n const canEditMetadata = canManageSpecs && canListSpecs\n const hasMoreActions = hasPopupMenuItems || canEditMetadata\n\n const headerActions = hasMoreActions ? (\n <Stack gap=\"0.5\" alignment=\"center\">\n {hasPopupMenuItems && (\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button icon=\"moreVert\" title={t`More Actions`} aria-label={t`More Actions`} />\n </PopupMenuToggle>\n <PopupMenuOptions>\n {canManageAccess && !isPublicFlavor && (\n <PopupMenuItem label={t`Manage Access`} onClick={toggleAccessModal} />\n )}\n {canDeleteFlavor && (\n <>\n <PopupMenuSectionSeparator />\n <PopupMenuItem label={t`Delete Flavor`} onClick={toggleDeleteModal} />\n </>\n )}\n </PopupMenuOptions>\n </PopupMenu>\n )}\n {canEditMetadata && (\n <Button variant=\"primary\" onClick={toggleSpecModal}>\n <Trans>Edit Metadata</Trans>\n </Button>\n )}\n </Stack>\n ) : undefined\n\n return (\n <>\n <ContentHeader title={flavor.name} projectId={projectId} actions={headerActions} />\n <Stack direction=\"vertical\">\n <FlavorDetailsView flavor={flavor} canListSpecs={canListSpecs} />\n </Stack>\n\n {trpcClient && (\n <>\n {specModalOpen && (\n <EditSpecModal\n client={trpcClient}\n isOpen={specModalOpen}\n onClose={handleSpecModalClose}\n project={projectId}\n flavor={flavor}\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":";;AA8CA,IAAaG,IAAQH,EAAgB,sDAAA,CAAA,CAAwD;CAC3FI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,WAAW,EACTC,MAAM,yBACR;CACF;CACAE,QAAQ,OAAO,EAAEC,YAASC,iBAKjB,EAAES,aAAYR,MAJAF,EAAQG,YAAYC,QAAQC,cAAcC,MAAM;EACnEC,YAAYN,EAAOO;EACnBC,UAAUR,EAAOQ;CACnB,CAAA,EAAA,EAC6BZ,QAAQ,KAAK;CAE5Cc,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYF,cAAc,iBAAiB,CAAC,EAC9D;CACAK,WAASC,4CAAA,WAAA;CACTE,YAAY,OAAO,EAAElB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GACjB,EAAEQ,iBAAcP,GAEhBkB,IAAoB,MAAOhB,GAAYiB,KAAKC,qBAAqBf,MAAAA,KAAY,CAAA,GAE7EgB,IAAe/B,EAAgB4B,CAAAA;EAErC,IAAI,CAACG,EAAa,UAAa,CAACA,EAAa,SAC3C,MAAMhC,EAAS;GACbiC,IAAI;GACJtB,QAAQ,EAAEO,aAAU;EACtB,CAAA;CAEJ;CACAgB,gBAAcR,4CAAA,gBAAA;AAChB,CAAA"}
@@ -1,196 +0,0 @@
1
- import { D as e, Q as t, at as n, c as r, g as i, i as a, rt as o, x as s } from "./build-WuxXRAqf.mjs";
2
- import { a as c } from "./trpcClient-D7gpR7YG.mjs";
3
- import { t as l } from "./_floatingIpId-lEobpOER.mjs";
4
- import { t as u } from "./useProjectId-DBc5lpoU.mjs";
5
- import { t as d } from "./ContentHeader-fKKZVu-o.mjs";
6
- import { t as f } from "./useSetBreadcrumb-tn7lBaQV.mjs";
7
- import "./hooks-D0yKIumu.mjs";
8
- import { t as p } from "./TwoColumnDescriptionList-DKS42RKa.mjs";
9
- import { t as m } from "./FloatingIpActionModals-Cq10WljB.mjs";
10
- import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
11
- import { useNavigate as v } from "@tanstack/react-router";
12
- import { Trans as y, useLingui as b } from "@lingui/react";
13
- //#region src/client/utils/formatFloatingIpStatus.ts
14
- var x = (e) => e.charAt(0) + e.slice(1).toLowerCase(), S = ({ floatingIp: o }) => {
15
- let { i18n: c, _: l } = b(), u = [
16
- {
17
- label: c._({ id: "S0kLOH" }),
18
- value: o.id
19
- },
20
- {
21
- label: c._({ id: "Nu4oKW" }),
22
- value: o.description || "—"
23
- },
24
- {
25
- label: c._({ id: "mSfwLL" }),
26
- value: o.project_id || "—"
27
- },
28
- {
29
- label: c._({ id: "uAQUqI" }),
30
- value: x(o.status)
31
- },
32
- {
33
- label: c._({ id: "88kg0+" }),
34
- value: o.created_at ? new Date(o.created_at).toLocaleString() : "—"
35
- },
36
- {
37
- label: c._({ id: "Llcakz" }),
38
- value: o.updated_at ? new Date(o.updated_at).toLocaleString() : "—"
39
- },
40
- {
41
- label: c._({ id: "OYHzN1" }),
42
- value: o.tags?.join(", ") || "—"
43
- }
44
- ], f = [
45
- {
46
- label: c._({ id: "xNG/3n" }),
47
- value: o.floating_ip_address || "—"
48
- },
49
- {
50
- label: c._({ id: "7AfIPZ" }),
51
- value: o.floating_network_id || "—"
52
- },
53
- {
54
- label: c._({ id: "Nc7QKU" }),
55
- value: o.fixed_ip_address || "—"
56
- },
57
- {
58
- label: c._({ id: "6sxz+g" }),
59
- value: o.port_details?.name || "—"
60
- },
61
- {
62
- label: c._({ id: "sNVNmf" }),
63
- value: o.port_details?.mac_address || "—"
64
- },
65
- {
66
- label: c._({ id: "hrBow7" }),
67
- value: o.port_details?.network_id || "—"
68
- },
69
- {
70
- label: c._({ id: "OaSktR" }),
71
- value: o.port_details?.device_owner || "—"
72
- },
73
- {
74
- label: c._({ id: "9rz81C" }),
75
- value: o.port_details?.device_id || "—"
76
- },
77
- {
78
- label: c._({ id: "/bUiYk" }),
79
- value: o.router_id || "—"
80
- },
81
- {
82
- label: c._({ id: "eks7oA" }),
83
- value: o.port_id || "—"
84
- },
85
- {
86
- label: c._({ id: "W9kfjU" }),
87
- value: o.qos_policy_id || "—"
88
- },
89
- {
90
- label: c._({ id: "mQSO1Y" }),
91
- value: o.port_forwardings?.map((e) => e.id).join(", ") || "—"
92
- }
93
- ], v = [{
94
- label: c._({ id: "WlpcJv" }),
95
- value: o.dns_domain || "—"
96
- }, {
97
- label: c._({ id: "eGEHJE" }),
98
- value: o.dns_name || "—"
99
- }];
100
- return /*#__PURE__*/ _(h, { children: [/*#__PURE__*/ g(d, {
101
- title: o.floating_ip_address ?? o.id,
102
- projectId: o.project_id,
103
- actions: /*#__PURE__*/ g(m, {
104
- floatingIp: o,
105
- children: ({ toggleEditModal: n, toggleAttachModal: o, toggleDetachModal: l, toggleReleaseModal: u }) => /*#__PURE__*/ _(t, {
106
- gap: "0.5",
107
- alignment: "center",
108
- children: [/*#__PURE__*/ _(e, {
109
- className: "flex items-center",
110
- children: [/*#__PURE__*/ g(r, {
111
- as: "div",
112
- children: /*#__PURE__*/ g(a, {
113
- icon: "moreVert",
114
- title: c._({ id: "6Nd4D3" })
115
- })
116
- }), /*#__PURE__*/ _(i, { children: [
117
- /*#__PURE__*/ g(s, {
118
- label: c._({ id: "n22YIM" }),
119
- onClick: n
120
- }),
121
- /*#__PURE__*/ g(s, {
122
- label: c._({ id: "FOcBn3" }),
123
- onClick: l
124
- }),
125
- /*#__PURE__*/ g(s, {
126
- label: c._({ id: "H+a5j6" }),
127
- onClick: u
128
- })
129
- ] })]
130
- }), /*#__PURE__*/ g(a, {
131
- variant: "primary",
132
- className: "whitespace-nowrap",
133
- onClick: o,
134
- children: c._({ id: "igVDFt" })
135
- })]
136
- })
137
- })
138
- }), /*#__PURE__*/ _(t, {
139
- direction: "vertical",
140
- gap: "6",
141
- className: "my-6",
142
- children: [
143
- /*#__PURE__*/ _(t, {
144
- direction: "vertical",
145
- gap: "2",
146
- children: [/*#__PURE__*/ g(n, { children: /*#__PURE__*/ g(y, { id: "SuX2Ca" }) }), /*#__PURE__*/ g(p, { items: u })]
147
- }),
148
- /*#__PURE__*/ _(t, {
149
- direction: "vertical",
150
- gap: "2",
151
- children: [/*#__PURE__*/ g(n, { children: /*#__PURE__*/ g(y, { id: "jKopCP" }) }), /*#__PURE__*/ g(p, { items: f })]
152
- }),
153
- /*#__PURE__*/ _(t, {
154
- direction: "vertical",
155
- gap: "2",
156
- children: [/*#__PURE__*/ g(n, { children: /*#__PURE__*/ g(y, { id: "5M4Te3" }) }), /*#__PURE__*/ g(p, { items: v })]
157
- })
158
- ]
159
- })] });
160
- };
161
- //#endregion
162
- //#region src/client/routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/index.tsx?tsr-split=component
163
- function C() {
164
- let { floatingIpId: e } = l.useParams(), t = u(), n = v(), { i18n: r, _: i } = b(), { data: s, isLoading: d, isError: p, error: m } = c.network.floatingIp.getById.useQuery({
165
- project_id: t,
166
- floatingip_id: e
167
- });
168
- f(l.id, s?.floating_ip_address);
169
- let h = () => {
170
- n({
171
- to: "/projects/$projectId/network/floatingips",
172
- params: { projectId: t }
173
- });
174
- };
175
- if (d) return /*#__PURE__*/ g(o, {
176
- status: "progress",
177
- title: r._({ id: "VLI9eO" })
178
- });
179
- if (p || !s) {
180
- let e = m?.message || r._({ id: "AjwnAt" });
181
- return /*#__PURE__*/ g(o, {
182
- status: "error",
183
- title: p ? e : r._({ id: "AZo+ca" }),
184
- action: /*#__PURE__*/ g(a, {
185
- onClick: h,
186
- variant: "primary",
187
- children: /*#__PURE__*/ g(y, { id: "z1JceR" })
188
- })
189
- });
190
- }
191
- return /*#__PURE__*/ g(S, { floatingIp: s });
192
- }
193
- //#endregion
194
- export { C as component };
195
-
196
- //# sourceMappingURL=_floatingIpId-B8r64AL9.mjs.map