@cobaltcore-dev/aurora 0.2.2 → 0.3.1

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 (130) hide show
  1. package/dist/client/AuroraApp.d.ts +10 -0
  2. package/dist/client/{ContentHeader-DtBiIwRY.mjs → ContentHeader-BXZoN3B9.mjs} +15 -15
  3. package/dist/client/{ContentHeader-DtBiIwRY.mjs.map → ContentHeader-BXZoN3B9.mjs.map} +1 -1
  4. package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs → DeleteFlavorModal-BusYn32r.mjs} +148 -148
  5. package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs.map → DeleteFlavorModal-BusYn32r.mjs.map} +1 -1
  6. package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs → EditSecurityGroupModal-Dl6m7wUe.mjs} +16 -16
  7. package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs.map → EditSecurityGroupModal-Dl6m7wUe.mjs.map} +1 -1
  8. package/dist/client/FiltersInput-BgNaHFBt.mjs +81 -0
  9. package/dist/client/FiltersInput-BgNaHFBt.mjs.map +1 -0
  10. package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs → FloatingIpActionModals-By2hXR9m.mjs} +51 -51
  11. package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs.map → FloatingIpActionModals-By2hXR9m.mjs.map} +1 -1
  12. package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs → ImageToastNotifications-fHI8jB2j.mjs} +369 -369
  13. package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs.map → ImageToastNotifications-fHI8jB2j.mjs.map} +1 -1
  14. package/dist/client/ListToolbar-BvtCo8dk.mjs +129 -0
  15. package/dist/client/ListToolbar-BvtCo8dk.mjs.map +1 -0
  16. package/dist/client/{RouteError-Cyto623-.mjs → RouteError-pDEWC_k7.mjs} +2 -2
  17. package/dist/client/{RouteError-Cyto623-.mjs.map → RouteError-pDEWC_k7.mjs.map} +1 -1
  18. package/dist/client/SortInput-DXWSqSny.mjs +34 -0
  19. package/dist/client/SortInput-DXWSqSny.mjs.map +1 -0
  20. package/dist/client/{_flavorId-B-1fYadl.mjs → _flavorId-BRonXvCo.mjs} +46 -46
  21. package/dist/client/_flavorId-BRonXvCo.mjs.map +1 -0
  22. package/dist/client/{_flavorId-BYfIHIV_.mjs → _flavorId-BoNcxYmF.mjs} +10 -10
  23. package/dist/client/_flavorId-BoNcxYmF.mjs.map +1 -0
  24. package/dist/client/_floatingIpId-BpUfL8Im2.mjs +228 -0
  25. package/dist/client/_floatingIpId-BpUfL8Im2.mjs.map +1 -0
  26. package/dist/client/{_floatingIpId-IrnN-ozB.mjs → _floatingIpId-CwHiXazi.mjs} +2 -2
  27. package/dist/client/{_floatingIpId-IrnN-ozB.mjs.map → _floatingIpId-CwHiXazi.mjs.map} +1 -1
  28. package/dist/client/{_imageId-Tx_9bqEc.mjs → _imageId-CdOOJjw0.mjs} +158 -158
  29. package/dist/client/_imageId-CdOOJjw0.mjs.map +1 -0
  30. package/dist/client/{_pcaId-CFuKY82d.mjs → _pcaId-CwlH1Kvl.mjs} +132 -132
  31. package/dist/client/{_pcaId-CFuKY82d.mjs.map → _pcaId-CwlH1Kvl.mjs.map} +1 -1
  32. package/dist/client/{_pcaId-Bck7S7gJ.mjs → _pcaId-D1ZEaCdp.mjs} +2 -2
  33. package/dist/client/{_pcaId-Bck7S7gJ.mjs.map → _pcaId-D1ZEaCdp.mjs.map} +1 -1
  34. package/dist/client/_projectId-D1gGribM.mjs +316 -0
  35. package/dist/client/_projectId-D1gGribM.mjs.map +1 -0
  36. package/dist/client/{_projectId-PSpuCKO7.mjs → _projectId-DhLpIalx.mjs} +9 -9
  37. package/dist/client/{_projectId-PSpuCKO7.mjs.map → _projectId-DhLpIalx.mjs.map} +1 -1
  38. package/dist/client/{_projectId-B1VjDd0Z.mjs → _projectId-Dj_InfSc.mjs} +3 -3
  39. package/dist/client/{_projectId-B1VjDd0Z.mjs.map → _projectId-Dj_InfSc.mjs.map} +1 -1
  40. package/dist/client/{_projectId-Pxp-RXK4.mjs → _projectId-OW2xkK43.mjs} +2 -2
  41. package/dist/client/{_projectId-Pxp-RXK4.mjs.map → _projectId-OW2xkK43.mjs.map} +1 -1
  42. package/dist/client/{_securityGroupId-VV2lUcGQ.mjs → _securityGroupId-B0llWH9A.mjs} +2 -2
  43. package/dist/client/{_securityGroupId-VV2lUcGQ.mjs.map → _securityGroupId-B0llWH9A.mjs.map} +1 -1
  44. package/dist/client/{_securityGroupId-Dqi6ddw4.mjs → _securityGroupId-gbUnd5Wv.mjs} +363 -363
  45. package/dist/client/{_securityGroupId-Dqi6ddw4.mjs.map → _securityGroupId-gbUnd5Wv.mjs.map} +1 -1
  46. package/dist/client/{about-B2AzqxFI.mjs → about-DCe6LsKz.mjs} +8 -8
  47. package/dist/client/{about-B2AzqxFI.mjs.map → about-DCe6LsKz.mjs.map} +1 -1
  48. package/dist/client/{build-Cf7iWbpH.mjs → build-BJDfnAyi.mjs} +1573 -1564
  49. package/dist/client/{build-Cf7iWbpH.mjs.map → build-BJDfnAyi.mjs.map} +1 -1
  50. package/dist/client/{buildFilterParams-ngVK3ybs.mjs → buildFilterParams-By33pG59.mjs} +1 -1
  51. package/dist/client/{buildFilterParams-ngVK3ybs.mjs.map → buildFilterParams-By33pG59.mjs.map} +1 -1
  52. package/dist/client/{constants-CCgR6fKI.mjs → constants-CAjjRTo_.mjs} +9 -9
  53. package/dist/client/{constants-CCgR6fKI.mjs.map → constants-CAjjRTo_.mjs.map} +1 -1
  54. package/dist/client/{containers-BWERuY0O.mjs → containers-BuXUVb1N.mjs} +811 -811
  55. package/dist/client/{containers-BWERuY0O.mjs.map → containers-BuXUVb1N.mjs.map} +1 -1
  56. package/dist/client/{containers-Cs5vOeR2.mjs → containers-Ca5V1EBS.mjs} +1 -1
  57. package/dist/client/containers-Ca5V1EBS.mjs.map +1 -0
  58. package/dist/client/{containers-DovytjVP.mjs → containers-NW7RnHTI.mjs} +6 -6
  59. package/dist/client/containers-NW7RnHTI.mjs.map +1 -0
  60. package/dist/client/flavors-BXPYAFyQ.mjs.map +1 -1
  61. package/dist/client/{flavors-CUiALHcB.mjs → flavors-D8oElC2K.mjs} +2 -2
  62. package/dist/client/{flavors-CUiALHcB.mjs.map → flavors-D8oElC2K.mjs.map} +1 -1
  63. package/dist/client/flavors-qvgPSI7J.mjs +613 -0
  64. package/dist/client/flavors-qvgPSI7J.mjs.map +1 -0
  65. package/dist/client/{floatingips-BrjDiY2t.mjs → floatingips-Be3zLoaD.mjs} +126 -126
  66. package/dist/client/{floatingips-BrjDiY2t.mjs.map → floatingips-Be3zLoaD.mjs.map} +1 -1
  67. package/dist/client/{images-BZP3pBqj.mjs → images-BiEBENaj.mjs} +2 -2
  68. package/dist/client/{images-BZP3pBqj.mjs.map → images-BiEBENaj.mjs.map} +1 -1
  69. package/dist/client/images-CCYBAphP2.mjs +1900 -0
  70. package/dist/client/images-CCYBAphP2.mjs.map +1 -0
  71. package/dist/client/images-DM9I8G0p.mjs.map +1 -1
  72. package/dist/client/index.d.ts +2 -1
  73. package/dist/client/index.js +410 -412
  74. package/dist/client/index.js.map +1 -1
  75. package/dist/client/{network-SCVadZsv.mjs → network-nbSbl0X0.mjs} +1 -1
  76. package/dist/client/{network-SCVadZsv.mjs.map → network-nbSbl0X0.mjs.map} +1 -1
  77. package/dist/client/{objects-D4zBka5e.mjs → objects-CU5ws07o.mjs} +6 -6
  78. package/dist/client/objects-CU5ws07o.mjs.map +1 -0
  79. package/dist/client/objects-FXN0VWLI.mjs +4760 -0
  80. package/dist/client/{objects-Cw4Vu01M.mjs.map → objects-FXN0VWLI.mjs.map} +1 -1
  81. package/dist/client/{objects-B4yrYf_a.mjs → objects-GmuIOaHd.mjs} +1 -1
  82. package/dist/client/objects-GmuIOaHd.mjs.map +1 -0
  83. package/dist/client/{overview-BtIXpYBo.mjs → overview-B3gdnWTG.mjs} +2 -2
  84. package/dist/client/{overview-BtIXpYBo.mjs.map → overview-B3gdnWTG.mjs.map} +1 -1
  85. package/dist/client/{overview-2J54-loz.mjs → overview-DzYBiNfD.mjs} +2 -2
  86. package/dist/client/{overview-2J54-loz.mjs.map → overview-DzYBiNfD.mjs.map} +1 -1
  87. package/dist/client/{overview-D0AAvsmL.mjs → overview-EhfPY8Je.mjs} +2 -2
  88. package/dist/client/{overview-D0AAvsmL.mjs.map → overview-EhfPY8Je.mjs.map} +1 -1
  89. package/dist/client/{overview-BnmukbFh.mjs → overview-XueZI4LQ.mjs} +7 -7
  90. package/dist/client/{overview-BnmukbFh.mjs.map → overview-XueZI4LQ.mjs.map} +1 -1
  91. package/dist/client/{pca-BqZycwCu.mjs → pca-DSM71LhW.mjs} +2 -2
  92. package/dist/client/{pca-BqZycwCu.mjs.map → pca-DSM71LhW.mjs.map} +1 -1
  93. package/dist/client/{pca-V2aaOxZA.mjs → pca-x9if8xU-.mjs} +59 -59
  94. package/dist/client/{pca-V2aaOxZA.mjs.map → pca-x9if8xU-.mjs.map} +1 -1
  95. package/dist/client/{projects-jyIHL6DE.mjs → projects-B6BPo2Ar.mjs} +2 -2
  96. package/dist/client/projects-B6BPo2Ar.mjs.map +1 -0
  97. package/dist/client/{projects-BsN4bvU2.mjs → projects-BilrmHLu.mjs} +1 -1
  98. package/dist/client/projects-BilrmHLu.mjs.map +1 -0
  99. package/dist/client/{projects-0feOw_b6.mjs → projects-Bt0XptpG.mjs} +2 -2
  100. package/dist/client/projects-Bt0XptpG.mjs.map +1 -0
  101. package/dist/client/projects-CnmZIB2Q.mjs +95 -0
  102. package/dist/client/projects-CnmZIB2Q.mjs.map +1 -0
  103. package/dist/client/{securitygroups-B4MkSBtI.mjs → securitygroups-BdzieS7Z.mjs} +121 -121
  104. package/dist/client/{securitygroups-B4MkSBtI.mjs.map → securitygroups-BdzieS7Z.mjs.map} +1 -1
  105. package/dist/client/{useListWithFiltering-CEDh1LO-.mjs → useListWithFiltering-CqQbAjEe.mjs} +1 -1
  106. package/dist/client/{useListWithFiltering-CEDh1LO-.mjs.map → useListWithFiltering-CqQbAjEe.mjs.map} +1 -1
  107. package/package.json +2 -2
  108. package/dist/client/ListToolbar-DuazvsAu.mjs +0 -223
  109. package/dist/client/ListToolbar-DuazvsAu.mjs.map +0 -1
  110. package/dist/client/_flavorId-B-1fYadl.mjs.map +0 -1
  111. package/dist/client/_flavorId-BYfIHIV_.mjs.map +0 -1
  112. package/dist/client/_floatingIpId-FQ5P2qMV.mjs +0 -228
  113. package/dist/client/_floatingIpId-FQ5P2qMV.mjs.map +0 -1
  114. package/dist/client/_imageId-Tx_9bqEc.mjs.map +0 -1
  115. package/dist/client/_projectId-Bs4W9hos.mjs +0 -283
  116. package/dist/client/_projectId-Bs4W9hos.mjs.map +0 -1
  117. package/dist/client/containers-Cs5vOeR2.mjs.map +0 -1
  118. package/dist/client/containers-DovytjVP.mjs.map +0 -1
  119. package/dist/client/flavors-Bovz-I2U.mjs +0 -565
  120. package/dist/client/flavors-Bovz-I2U.mjs.map +0 -1
  121. package/dist/client/images-DaaCUXMI.mjs +0 -1797
  122. package/dist/client/images-DaaCUXMI.mjs.map +0 -1
  123. package/dist/client/objects-B4yrYf_a.mjs.map +0 -1
  124. package/dist/client/objects-Cw4Vu01M.mjs +0 -4760
  125. package/dist/client/objects-D4zBka5e.mjs.map +0 -1
  126. package/dist/client/projects-0feOw_b6.mjs.map +0 -1
  127. package/dist/client/projects-BsN4bvU2.mjs.map +0 -1
  128. package/dist/client/projects-C1IYOvFQ.mjs +0 -144
  129. package/dist/client/projects-C1IYOvFQ.mjs.map +0 -1
  130. package/dist/client/projects-jyIHL6DE.mjs.map +0 -1
@@ -0,0 +1,129 @@
1
+ import { _ as e, f as t, nt as n, x as r } from "./build-BJDfnAyi.mjs";
2
+ import { t as i } from "./SortInput-DXWSqSny.mjs";
3
+ import { n as a, t as o } from "./FiltersInput-BgNaHFBt.mjs";
4
+ import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
5
+ import { useCallback as u, useEffect as d, useRef as f } from "react";
6
+ import { Trans as p, useLingui as m } from "@lingui/react";
7
+ //#region src/client/components/ListToolbar/index.tsx
8
+ var h = ({ filterSettings: h, onFilter: g, sortSettings: _, onSort: v, searchTerm: y, onSearch: b, searchInputProps: x = {}, actions: S, tabs: C, totalCount: w, filteredCount: T, itemName: E = "items", lastUpdated: D }) => {
9
+ let { i18n: O, _: k } = m(), A = f(void 0);
10
+ d(() => () => {
11
+ A.current && clearTimeout(A.current);
12
+ }, []);
13
+ let j = (e) => e ? (typeof e == "string" ? new Date(e) : e).toLocaleString() : "", M = w !== void 0 && T !== void 0, N = u((e) => {
14
+ !g || !h || g({
15
+ ...h,
16
+ selectedFilters: h.selectedFilters?.filter((t) => !(t.name === e.name && t.value === e.value))
17
+ });
18
+ }, [h, g]), P = (e) => {
19
+ if (!g || !h || h.selectedFilters?.some((t) => t.name === e.name && t.value === e.value)) return;
20
+ let t = h.filters.find((t) => e.name === t.filterName)?.supportsMultiValue ? [...h.selectedFilters || [], e] : [...(h.selectedFilters || []).filter((t) => t.name !== e.name), e];
21
+ g({
22
+ ...h,
23
+ selectedFilters: t
24
+ });
25
+ }, F = u((e) => {
26
+ let t = typeof e == "string" ? e : "";
27
+ A.current && clearTimeout(A.current), b?.(t);
28
+ }, [b]), I = u((e) => {
29
+ let t = e.currentTarget.value;
30
+ A.current && clearTimeout(A.current), A.current = window.setTimeout(() => b?.(t), 500);
31
+ }, [b]), L = u(() => {
32
+ A.current && clearTimeout(A.current), b?.("");
33
+ }, [b]), R = h && g ? {
34
+ filters: h.filters,
35
+ onChange: P
36
+ } : null, z = _ && v ? {
37
+ options: _.options,
38
+ sortBy: _.sortBy,
39
+ sortDirection: _.sortDirection || "asc",
40
+ onSortByChange: (e) => v({
41
+ ..._,
42
+ sortBy: e,
43
+ sortDirection: _.sortDirection || "asc"
44
+ }),
45
+ onSortDirectionChange: (e) => v({
46
+ ..._,
47
+ sortDirection: e
48
+ })
49
+ } : null, B = b ? {
50
+ placeholder: O._({ id: "YIix5Y" }),
51
+ "data-testid": "searchbar",
52
+ value: y,
53
+ onInput: I,
54
+ onClear: L,
55
+ onSearch: F,
56
+ ...x
57
+ } : null;
58
+ return /* @__PURE__ */ l(s, { children: [C && /* @__PURE__ */ c("div", {
59
+ className: "w-full",
60
+ children: /* @__PURE__ */ c(e, {
61
+ activeItem: C.activeItem,
62
+ onActiveItemChange: C.onActiveItemChange,
63
+ children: C.items.map((e) => /* @__PURE__ */ c(r, {
64
+ label: e.label,
65
+ value: e.value
66
+ }, e.value))
67
+ })
68
+ }), /* @__PURE__ */ l(n, {
69
+ alignment: "center",
70
+ gap: "6",
71
+ className: "bg-theme-background-lvl-1 flex w-full flex-col p-4",
72
+ children: [
73
+ S && /* @__PURE__ */ c(n, {
74
+ direction: "horizontal",
75
+ className: "w-full justify-end",
76
+ children: S
77
+ }),
78
+ /* @__PURE__ */ l("div", {
79
+ className: "flex w-full flex-col items-stretch gap-4 md:flex-row md:items-center",
80
+ children: [
81
+ R && /* @__PURE__ */ c("div", {
82
+ className: "w-full md:w-auto md:min-w-37.5",
83
+ children: /* @__PURE__ */ c(o, { ...R })
84
+ }),
85
+ z && /* @__PURE__ */ c("div", {
86
+ className: "w-full md:w-auto md:min-w-45",
87
+ children: /* @__PURE__ */ c(i, { ...z })
88
+ }),
89
+ B && /* @__PURE__ */ c("div", {
90
+ className: "w-full md:ml-auto md:w-auto md:min-w-25",
91
+ children: /* @__PURE__ */ c(t, { ...B })
92
+ })
93
+ ]
94
+ }),
95
+ h?.selectedFilters && h.selectedFilters.length > 0 && g && /* @__PURE__ */ c("div", {
96
+ className: "w-full",
97
+ children: /* @__PURE__ */ c(a, {
98
+ selectedFilters: h.selectedFilters,
99
+ onDelete: N,
100
+ onClear: () => g({
101
+ ...h,
102
+ selectedFilters: []
103
+ })
104
+ })
105
+ }),
106
+ (M || D) && /* @__PURE__ */ c("div", {
107
+ className: "text-theme-secondary flex w-full items-center justify-between text-sm",
108
+ children: /* @__PURE__ */ l("div", {
109
+ className: "flex items-center gap-2",
110
+ children: [M && /* @__PURE__ */ c("span", { children: /* @__PURE__ */ c(p, {
111
+ id: "Vg0k6h",
112
+ values: {
113
+ filteredCount: T,
114
+ totalCount: w,
115
+ itemName: E
116
+ }
117
+ }) }), D && /* @__PURE__ */ c("span", { children: /* @__PURE__ */ c(p, {
118
+ id: "wlUDbB",
119
+ values: { formattedDate: j(D) }
120
+ }) })]
121
+ })
122
+ })
123
+ ]
124
+ })] });
125
+ };
126
+ //#endregion
127
+ export { h as t };
128
+
129
+ //# sourceMappingURL=ListToolbar-BvtCo8dk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListToolbar-BvtCo8dk.mjs","names":["useCallback","useRef","useEffect","SearchInput","Stack","TabNavigation","TabNavigationItem","SelectedFilters","FiltersInput","SortInput","ListToolbar","filterSettings","onFilter","sortSettings","onSort","searchTerm","onSearch","searchInputProps","actions","tabs","totalCount","filteredCount","itemName","lastUpdated","useLingui","debounceTimerRef","undefined","current","clearTimeout","formatLastUpdated","date","dateObj","Date","toLocaleString","showCountInfo","handleFilterDelete","filterToRemove","selectedFilters","filter","name","value","handleSelect","selectedFilter","filterExists","some","supportsMultiValue","filters","find","filterName","newSelected","handleSearch","searchValue","handleSearchInput","event","currentTarget","window","setTimeout","handleSearchClear","filtersProps","onChange","sortProps","options","sortBy","sortDirection","onSortByChange","param","onSortDirectionChange","direction","searchProps","placeholder","t","onInput","onClear","div","className","activeItem","onActiveItemChange","items","map","item","label","alignment","gap","length","onDelete","span","formattedDate"],"sources":["../../src/client/components/ListToolbar/index.tsx"],"sourcesContent":["import { ReactNode, useCallback, useRef, useEffect } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n SearchInput,\n SearchInputProps,\n Stack,\n TabNavigation,\n TabNavigationItem,\n} from \"@cloudoperators/juno-ui-components\"\nimport { SelectedFilters } from \"./SelectedFilters\"\nimport { FiltersInput } from \"./FiltersInput\"\nimport { SortInput } from \"./SortInput\"\nimport { FilterSettings, SelectedFilter, SortSettings } from \"./types\"\n\nexport type ListToolbarProps = {\n filterSettings?: FilterSettings\n onFilter?: (filterSettings: FilterSettings) => void\n sortSettings?: SortSettings\n onSort?: (sortSettings: SortSettings) => void\n searchTerm?: string\n onSearch?: (searchTerm: string) => void\n searchInputProps?: Omit<SearchInputProps, \"value\" | \"onSearch\" | \"onClear\" | \"onInput\">\n actions?: ReactNode\n tabs?: {\n items: Array<{ label: string; value: string }>\n activeItem: string\n onActiveItemChange: (value: ReactNode) => void\n }\n // Count information\n totalCount?: number\n itemName?: string // e.g. \"items\", \"users\", \"projects\" - used in count display\n filteredCount?: number\n // Last updated timestamp\n lastUpdated?: Date | string\n}\n\nexport const ListToolbar = ({\n filterSettings,\n onFilter,\n sortSettings,\n onSort,\n searchTerm,\n onSearch,\n searchInputProps = {},\n actions,\n tabs,\n totalCount,\n filteredCount,\n itemName = \"items\",\n lastUpdated,\n}: ListToolbarProps) => {\n const { t } = useLingui()\n\n const debounceTimerRef = useRef<number | undefined>(undefined)\n\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n }\n }, [])\n\n // Format last updated time\n const formatLastUpdated = (date: Date | string | undefined): string => {\n if (!date) return \"\"\n const dateObj = typeof date === \"string\" ? new Date(date) : date\n return dateObj.toLocaleString()\n }\n\n const showCountInfo = totalCount !== undefined && filteredCount !== undefined\n\n const handleFilterDelete = useCallback(\n (filterToRemove: SelectedFilter) => {\n if (!onFilter || !filterSettings) return\n onFilter({\n ...filterSettings,\n selectedFilters: filterSettings.selectedFilters?.filter(\n (filter) => !(filter.name === filterToRemove.name && filter.value === filterToRemove.value)\n ),\n })\n },\n [filterSettings, onFilter]\n )\n\n const handleSelect = (selectedFilter: SelectedFilter) => {\n if (!onFilter || !filterSettings) return\n const filterExists = filterSettings.selectedFilters?.some(\n (filter) => filter.name === selectedFilter.name && filter.value === selectedFilter.value\n )\n if (filterExists) return\n\n const supportsMultiValue = filterSettings.filters.find(\n (filter) => selectedFilter.name === filter.filterName\n )?.supportsMultiValue\n\n const newSelected = supportsMultiValue\n ? [...(filterSettings.selectedFilters || []), selectedFilter]\n : [\n ...(filterSettings.selectedFilters || []).filter((filter) => filter.name !== selectedFilter.name),\n selectedFilter,\n ]\n\n onFilter({ ...filterSettings, selectedFilters: newSelected })\n }\n\n const handleSearch = useCallback(\n (value: string | number | string[] | undefined) => {\n const searchValue = typeof value === \"string\" ? value : \"\"\n\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n\n onSearch?.(searchValue)\n },\n [onSearch]\n )\n\n const handleSearchInput = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n const searchValue = event.currentTarget.value\n if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current)\n debounceTimerRef.current = window.setTimeout(() => onSearch?.(searchValue), 500)\n },\n [onSearch]\n )\n\n const handleSearchClear = useCallback(() => {\n if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current)\n onSearch?.(\"\")\n }, [onSearch])\n\n const filtersProps = filterSettings && onFilter ? { filters: filterSettings.filters, onChange: handleSelect } : null\n const sortProps =\n sortSettings && onSort\n ? {\n options: sortSettings.options,\n sortBy: sortSettings.sortBy,\n sortDirection: sortSettings.sortDirection || \"asc\",\n onSortByChange: (param: string | number | string[] | undefined) =>\n onSort({ ...sortSettings, sortBy: param, sortDirection: sortSettings.sortDirection || \"asc\" }),\n onSortDirectionChange: (direction: \"asc\" | \"desc\") => onSort({ ...sortSettings, sortDirection: direction }),\n }\n : null\n\n const searchProps: (SearchInputProps & { \"data-testid\"?: string }) | null = onSearch\n ? {\n placeholder: t`Search...`,\n \"data-testid\": \"searchbar\",\n value: searchTerm,\n onInput: handleSearchInput,\n onClear: handleSearchClear,\n onSearch: handleSearch,\n ...searchInputProps,\n }\n : null\n\n return (\n <>\n {tabs && (\n <div className=\"w-full\">\n <TabNavigation activeItem={tabs.activeItem} onActiveItemChange={tabs.onActiveItemChange}>\n {tabs.items.map((item) => (\n <TabNavigationItem key={item.value} label={item.label} value={item.value} />\n ))}\n </TabNavigation>\n </div>\n )}\n <Stack alignment=\"center\" gap=\"6\" className=\"bg-theme-background-lvl-1 flex w-full flex-col p-4\">\n {actions && (\n <Stack direction=\"horizontal\" className=\"w-full justify-end\">\n {actions}\n </Stack>\n )}\n\n <div className=\"flex w-full flex-col items-stretch gap-4 md:flex-row md:items-center\">\n {filtersProps && (\n <div className=\"w-full md:w-auto md:min-w-37.5\">\n <FiltersInput {...filtersProps} />\n </div>\n )}\n {sortProps && (\n <div className=\"w-full md:w-auto md:min-w-45\">\n <SortInput {...sortProps} />\n </div>\n )}\n {searchProps && (\n <div className=\"w-full md:ml-auto md:w-auto md:min-w-25\">\n <SearchInput {...searchProps} />\n </div>\n )}\n </div>\n\n {filterSettings?.selectedFilters && filterSettings.selectedFilters.length > 0 && onFilter && (\n <div className=\"w-full\">\n <SelectedFilters\n selectedFilters={filterSettings.selectedFilters}\n onDelete={handleFilterDelete}\n onClear={() => onFilter({ ...filterSettings, selectedFilters: [] })}\n />\n </div>\n )}\n {/* Count and Last Updated Info */}\n {(showCountInfo || lastUpdated) && (\n <div className=\"text-theme-secondary flex w-full items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n {showCountInfo && (\n <span>\n <Trans>\n Showing {filteredCount} of {totalCount} {itemName}\n </Trans>\n </span>\n )}\n {lastUpdated &&\n (() => {\n const formattedDate = formatLastUpdated(lastUpdated)\n return (\n <span>\n <Trans>Last updated: {formattedDate}</Trans>\n </span>\n )\n })()}\n </div>\n </div>\n )}\n </Stack>\n </>\n )\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { O as e } from "./build-Cf7iWbpH.mjs";
1
+ import { j as e } from "./build-BJDfnAyi.mjs";
2
2
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
3
  import { useLingui as r } from "@lingui/react";
4
4
  //#region src/client/components/Error/RouteError.tsx
@@ -22,4 +22,4 @@ function i({ error: i, title: a, helpText: o, safeErrorMessage: s }) {
22
22
  //#endregion
23
23
  export { i as t };
24
24
 
25
- //# sourceMappingURL=RouteError-Cyto623-.mjs.map
25
+ //# sourceMappingURL=RouteError-pDEWC_k7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RouteError-Cyto623-.mjs","names":["ContentHeading","RouteError","error","title","helpText","safeErrorMessage","useLingui","defaultTitle","t","defaultHelpText","defaultErrorMessage","errorMessage","safeMessage","div","className","p"],"sources":["../../src/client/components/Error/RouteError.tsx"],"sourcesContent":["import { ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { useLingui } from \"@lingui/react/macro\"\n\ninterface RouteErrorProps {\n error: unknown\n title?: string\n helpText?: string\n /** Explicitly pass a safe error message to display. Use this when you want to show specific error details. */\n safeErrorMessage?: string\n}\n\nexport function RouteError({ error, title, helpText, safeErrorMessage }: RouteErrorProps) {\n const { t } = useLingui()\n\n const defaultTitle = t`Unable to Load Content`\n const defaultHelpText = t`This could be due to insufficient permissions or a temporary service issue. Please check your access rights or try refreshing the page.`\n const defaultErrorMessage = t`An unexpected error occurred`\n\n // Security: Do not expose raw Error.message by default as it may contain sensitive information.\n // Only display:\n // 1. Explicitly passed safeErrorMessage\n // 2. String errors (when caller explicitly passes a safe string)\n // 3. error.safeMessage if present (for controlled error exposure)\n // 4. Default translated message for all other cases\n const errorMessage =\n safeErrorMessage ||\n (typeof error === \"string\" ? error : null) ||\n (error && typeof error === \"object\" && \"safeMessage\" in error && typeof error.safeMessage === \"string\"\n ? error.safeMessage\n : null) ||\n defaultErrorMessage\n\n return (\n <div className=\"flex min-h-100 flex-col space-y-2 p-8\">\n <ContentHeading className=\"text-theme-info\">{title || defaultTitle}</ContentHeading>\n <p>{errorMessage}</p>\n <p className=\"text-theme-light text-sm\">{helpText || defaultHelpText}</p>\n </div>\n )\n}\n"],"mappings":";;;;AAWA,SAAgBC,EAAW,EAAEC,UAAOC,UAAOC,aAAUC,uBAAmC;CACtF,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EAERC,IAAeC,EAAAA,EAAC,EAAA,IAAA,UAAuB,CAAA,EACvCC,IAAkBD,EAAAA,EAAC,EAAA,IAAA,UAAwI,CAAA,EAC3JE,IAAsBF,EAAAA,EAAC,EAAA,IAAA,UAA6B,CAAA,EAQpDG,IACJN,MACC,OAAOH,KAAU,WAAWA,IAAQ,UACpCA,KAAS,OAAOA,KAAU,YAAY,iBAAiBA,KAAS,OAAOA,EAAMU,eAAgB,WAC1FV,EAAMU,cACN,SACJF;AAEF,QACE,kBAACG,OAAAA;EAAIC,WAAU;;GACb,kBAACd,GAAAA;IAAec,WAAU;cAAmBX,KAASI;;GACtD,kBAACQ,KAAAA,EAAAA,UAAGJ,GAAAA,CAAAA;GACJ,kBAACI,KAAAA;IAAED,WAAU;cAA4BV,KAAYK"}
1
+ {"version":3,"file":"RouteError-pDEWC_k7.mjs","names":["ContentHeading","RouteError","error","title","helpText","safeErrorMessage","useLingui","defaultTitle","t","defaultHelpText","defaultErrorMessage","errorMessage","safeMessage","div","className","p"],"sources":["../../src/client/components/Error/RouteError.tsx"],"sourcesContent":["import { ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { useLingui } from \"@lingui/react/macro\"\n\ninterface RouteErrorProps {\n error: unknown\n title?: string\n helpText?: string\n /** Explicitly pass a safe error message to display. Use this when you want to show specific error details. */\n safeErrorMessage?: string\n}\n\nexport function RouteError({ error, title, helpText, safeErrorMessage }: RouteErrorProps) {\n const { t } = useLingui()\n\n const defaultTitle = t`Unable to Load Content`\n const defaultHelpText = t`This could be due to insufficient permissions or a temporary service issue. Please check your access rights or try refreshing the page.`\n const defaultErrorMessage = t`An unexpected error occurred`\n\n // Security: Do not expose raw Error.message by default as it may contain sensitive information.\n // Only display:\n // 1. Explicitly passed safeErrorMessage\n // 2. String errors (when caller explicitly passes a safe string)\n // 3. error.safeMessage if present (for controlled error exposure)\n // 4. Default translated message for all other cases\n const errorMessage =\n safeErrorMessage ||\n (typeof error === \"string\" ? error : null) ||\n (error && typeof error === \"object\" && \"safeMessage\" in error && typeof error.safeMessage === \"string\"\n ? error.safeMessage\n : null) ||\n defaultErrorMessage\n\n return (\n <div className=\"flex min-h-100 flex-col space-y-2 p-8\">\n <ContentHeading className=\"text-theme-info\">{title || defaultTitle}</ContentHeading>\n <p>{errorMessage}</p>\n <p className=\"text-theme-light text-sm\">{helpText || defaultHelpText}</p>\n </div>\n )\n}\n"],"mappings":";;;;AAWA,SAAgBC,EAAW,EAAEC,UAAOC,UAAOC,aAAUC,uBAAmC;CACtF,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EAERC,IAAeC,EAAAA,EAAC,EAAA,IAAA,UAAuB,CAAA,EACvCC,IAAkBD,EAAAA,EAAC,EAAA,IAAA,UAAwI,CAAA,EAC3JE,IAAsBF,EAAAA,EAAC,EAAA,IAAA,UAA6B,CAAA,EAQpDG,IACJN,MACC,OAAOH,KAAU,WAAWA,IAAQ,UACpCA,KAAS,OAAOA,KAAU,YAAY,iBAAiBA,KAAS,OAAOA,EAAMU,eAAgB,WAC1FV,EAAMU,cACN,SACJF;AAEF,QACE,kBAACG,OAAAA;EAAIC,WAAU;;GACb,kBAACd,GAAAA;IAAec,WAAU;cAAmBX,KAASI;;GACtD,kBAACQ,KAAAA,EAAAA,UAAGJ,GAAAA,CAAAA;GACJ,kBAACI,KAAAA;IAAED,WAAU;cAA4BV,KAAYK"}
@@ -0,0 +1,34 @@
1
+ import { F as e, d as t, r as n, st as r } from "./build-BJDfnAyi.mjs";
2
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
3
+ import { useLingui as o } from "@lingui/react";
4
+ //#region src/client/components/ListToolbar/SortInput.tsx
5
+ var s = ({ sortBy: s, onSortByChange: c, sortDirection: l, onSortDirectionChange: u, options: d }) => {
6
+ let { i18n: f, _: p } = o(), m = () => ({
7
+ className: "flex-grow",
8
+ onChange: c,
9
+ value: s,
10
+ "data-testid": "sort-select",
11
+ label: f._({ id: "/HgF9q" })
12
+ }), h = () => ({
13
+ "data-testid": "direction-toggle",
14
+ order: l,
15
+ onChange: u
16
+ });
17
+ return /* @__PURE__ */ a(r, {
18
+ className: "flex w-full items-end sm:w-auto",
19
+ children: [/* @__PURE__ */ i(n, {
20
+ ...m(),
21
+ children: d.map((e) => /* @__PURE__ */ i(t, {
22
+ value: e.value,
23
+ children: e.label
24
+ }, e.value))
25
+ }), /* @__PURE__ */ i(e, {
26
+ ...h(),
27
+ className: "shadow-none"
28
+ })]
29
+ });
30
+ };
31
+ //#endregion
32
+ export { s as t };
33
+
34
+ //# sourceMappingURL=SortInput-DXWSqSny.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SortInput-DXWSqSny.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,GAAAA,EAERC,WAAkE;EACtEC,WAAW;EACXC,UAAUP;EACVQ,OAAOT;EACP,eAAe;EACfU,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAQ,CAAA;EAClB,GAEMC,WAIA;EACJ,eAAe;EACfC,OAAOX;EACPM,UAAUL;EACZ;AAEA,QACE,kBAACL,GAAAA;EAAWS,WAAU;aACpB,kBAACZ,GAAAA;GAAQ,GAAGW,GAAgB;aACzBF,EAAQU,KAAKC,MACZ,kBAACnB,GAAAA;IAAgCa,OAAOM,EAAON;cAC5CM,EAAOL;MADSK,EAAON,MAAK,CAAA;MAKnC,kBAACZ,GAAAA;GAAY,GAAGe,GAAoB;GAAEL,WAAU"}
@@ -1,68 +1,68 @@
1
- import { $ as e, B as t, F as n, K as r, O as i, P as a, T as o, W as s, Y as c, h as l, j as u, l as d } from "./build-Cf7iWbpH.mjs";
1
+ import { E as e, L as t, N as n, Q as r, R as i, W as a, Y as o, c as s, et as c, h as l, j as u, nt as d } from "./build-BJDfnAyi.mjs";
2
2
  import { r as f } from "./trpcClient-BxguzNYF.mjs";
3
- import { n as p, t as m } from "./_flavorId-BYfIHIV_.mjs";
3
+ import { n as p, t as m } from "./_flavorId-BoNcxYmF.mjs";
4
4
  import { t as h } from "./useErrorTranslation-TZVwIAzq.mjs";
5
- import { n as g, r as _, t as v } from "./DeleteFlavorModal-rmuYIafD.mjs";
5
+ import { n as g, r as _, t as v } from "./DeleteFlavorModal-BusYn32r.mjs";
6
6
  import { t as y } from "./useModal-DxxlilRm.mjs";
7
- import { t as b } from "./ContentHeader-DtBiIwRY.mjs";
7
+ import { t as b } from "./ContentHeader-BXZoN3B9.mjs";
8
8
  import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
9
9
  import w from "react";
10
10
  import { useNavigate as T, useParams as E } from "@tanstack/react-router";
11
11
  import { Trans as D, useLingui as O } from "@lingui/react";
12
12
  //#region src/client/routes/_auth/projects/$projectId/compute/flavors/-components/FlavorDetailsView.tsx
13
- function k({ flavor: n }) {
13
+ function k({ flavor: e }) {
14
14
  let r = (e, t = "MB") => e === 0 ? `0 ${t}` : `${e} ${t}`;
15
- return /* @__PURE__ */ C(e, {
15
+ return /* @__PURE__ */ C(d, {
16
16
  direction: "vertical",
17
17
  gap: "6",
18
18
  className: "mt-6",
19
19
  children: [
20
- /* @__PURE__ */ C(e, {
20
+ /* @__PURE__ */ C(d, {
21
21
  direction: "vertical",
22
22
  gap: "2",
23
- children: [/* @__PURE__ */ S(i, { children: /* @__PURE__ */ S(D, { id: "jIPNJG" }) }), /* @__PURE__ */ C(t, {
23
+ children: [/* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "jIPNJG" }) }), /* @__PURE__ */ C(a, {
24
24
  alignTerms: "right",
25
25
  children: [
26
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "S0kLOH" }) }),
27
- /* @__PURE__ */ S(a, { children: n.id }),
28
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "6YtxFj" }) }),
29
- /* @__PURE__ */ S(a, { children: n.name }),
30
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "Nu4oKW" }) }),
31
- /* @__PURE__ */ S(a, { children: n?.description }),
32
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "7d1a0d" }) }),
33
- /* @__PURE__ */ S(a, { children: n["os-flavor-access:is_public"] ? /* @__PURE__ */ S(D, { id: "l75CjT" }) : /* @__PURE__ */ S(D, { id: "1UzENP" }) }),
34
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "E/QGRL" }) }),
35
- /* @__PURE__ */ S(a, { children: n["OS-FLV-DISABLED:disabled"] ? /* @__PURE__ */ S(D, { id: "l75CjT" }) : /* @__PURE__ */ S(D, { id: "1UzENP" }) })
26
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "S0kLOH" }) }),
27
+ /* @__PURE__ */ S(t, { children: e.id }),
28
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "6YtxFj" }) }),
29
+ /* @__PURE__ */ S(t, { children: e.name }),
30
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "Nu4oKW" }) }),
31
+ /* @__PURE__ */ S(t, { children: e?.description }),
32
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "7d1a0d" }) }),
33
+ /* @__PURE__ */ S(t, { children: e["os-flavor-access:is_public"] ? /* @__PURE__ */ S(D, { id: "l75CjT" }) : /* @__PURE__ */ S(D, { id: "1UzENP" }) }),
34
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "E/QGRL" }) }),
35
+ /* @__PURE__ */ S(t, { children: e["OS-FLV-DISABLED:disabled"] ? /* @__PURE__ */ S(D, { id: "l75CjT" }) : /* @__PURE__ */ S(D, { id: "1UzENP" }) })
36
36
  ]
37
37
  })]
38
38
  }),
39
- /* @__PURE__ */ C(e, {
39
+ /* @__PURE__ */ C(d, {
40
40
  direction: "vertical",
41
41
  gap: "2",
42
- children: [/* @__PURE__ */ S(i, { children: /* @__PURE__ */ S(D, { id: "qQ1QBh" }) }), /* @__PURE__ */ C(t, {
42
+ children: [/* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "qQ1QBh" }) }), /* @__PURE__ */ C(a, {
43
43
  alignTerms: "right",
44
44
  children: [
45
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "MZGbkp" }) }),
46
- /* @__PURE__ */ S(a, { children: n.vcpus }),
47
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "RGhYAo" }) }),
48
- /* @__PURE__ */ S(a, { children: r(n.ram, "MiB") }),
49
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "sPFHpI" }) }),
50
- /* @__PURE__ */ S(a, { children: r(n.disk, "GiB") }),
51
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "r9Aac8" }) }),
52
- /* @__PURE__ */ S(a, { children: r(n["OS-FLV-EXT-DATA:ephemeral"] || 0, "GiB") }),
53
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "vH2C/2" }) }),
54
- /* @__PURE__ */ S(a, { children: n.swap === 0 || n.swap === "" ? /* @__PURE__ */ S(D, { id: "EdQY6l" }) : r(Number(n.swap), "MiB") }),
55
- /* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "u5HztT" }) }),
56
- /* @__PURE__ */ S(a, { children: n.rxtx_factor })
45
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "MZGbkp" }) }),
46
+ /* @__PURE__ */ S(t, { children: e.vcpus }),
47
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "RGhYAo" }) }),
48
+ /* @__PURE__ */ S(t, { children: r(e.ram, "MiB") }),
49
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "sPFHpI" }) }),
50
+ /* @__PURE__ */ S(t, { children: r(e.disk, "GiB") }),
51
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "r9Aac8" }) }),
52
+ /* @__PURE__ */ S(t, { children: r(e["OS-FLV-EXT-DATA:ephemeral"] || 0, "GiB") }),
53
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "vH2C/2" }) }),
54
+ /* @__PURE__ */ S(t, { children: e.swap === 0 || e.swap === "" ? /* @__PURE__ */ S(D, { id: "EdQY6l" }) : r(Number(e.swap), "MiB") }),
55
+ /* @__PURE__ */ S(n, { children: /* @__PURE__ */ S(D, { id: "u5HztT" }) }),
56
+ /* @__PURE__ */ S(t, { children: e.rxtx_factor })
57
57
  ]
58
58
  })]
59
59
  }),
60
- n.extra_specs && Object.keys(n.extra_specs).length > 0 && /* @__PURE__ */ C(e, {
60
+ e.extra_specs && Object.keys(e.extra_specs).length > 0 && /* @__PURE__ */ C(d, {
61
61
  direction: "vertical",
62
62
  gap: "2",
63
- children: [/* @__PURE__ */ S(i, { children: /* @__PURE__ */ S(D, { id: "DKkOPx" }) }), /* @__PURE__ */ S(t, {
63
+ children: [/* @__PURE__ */ S(u, { children: /* @__PURE__ */ S(D, { id: "DKkOPx" }) }), /* @__PURE__ */ S(a, {
64
64
  alignTerms: "right",
65
- children: Object.entries(n.extra_specs).map(([e, t]) => /* @__PURE__ */ C(w.Fragment, { children: [/* @__PURE__ */ S(u, { children: e }), /* @__PURE__ */ S(a, { children: t })] }, e))
65
+ children: Object.entries(e.extra_specs).map(([e, r]) => /* @__PURE__ */ C(w.Fragment, { children: [/* @__PURE__ */ S(n, { children: e }), /* @__PURE__ */ S(t, { children: r })] }, e))
66
66
  })]
67
67
  })
68
68
  ]
@@ -71,9 +71,9 @@ function k({ flavor: n }) {
71
71
  //#endregion
72
72
  //#region src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx?tsr-split=component
73
73
  function A() {
74
- let { projectId: t, flavorId: i } = E({ from: "/_auth/projects/$projectId/compute/flavors/$flavorId" }), { trpcClient: a } = m.useRouteContext(), u = T(), { i18n: w, _: A } = O(), { translateError: j, isRetryableError: M } = h(), { data: N, status: P, error: F, refetch: I } = f.compute.getFlavorById.useQuery({
74
+ let { projectId: t, flavorId: n } = E({ from: "/_auth/projects/$projectId/compute/flavors/$flavorId" }), { trpcClient: a } = m.useRouteContext(), u = T(), { i18n: w, _: A } = O(), { translateError: j, isRetryableError: M } = h(), { data: N, status: P, error: F, refetch: I } = f.compute.getFlavorById.useQuery({
75
75
  project_id: t,
76
- flavorId: i
76
+ flavorId: n
77
77
  }), { data: L } = f.compute.canUser.useQuery({
78
78
  project_id: t,
79
79
  permission: [
@@ -89,13 +89,13 @@ function A() {
89
89
  });
90
90
  }, J = () => {
91
91
  u({
92
- to: "/projects/$projectId/compute/overview",
92
+ to: "/projects/$projectId",
93
93
  params: { projectId: t }
94
94
  });
95
95
  }, Y = () => {
96
96
  I();
97
97
  };
98
- if (P === "pending") return /* @__PURE__ */ C(e, {
98
+ if (P === "pending") return /* @__PURE__ */ C(d, {
99
99
  className: "fixed inset-0",
100
100
  distribution: "center",
101
101
  alignment: "center",
@@ -129,19 +129,19 @@ function A() {
129
129
  onBackClick: q,
130
130
  onHomeClick: J
131
131
  });
132
- let X = z || R, Z = X || B ? /* @__PURE__ */ C(l, { children: [X && /* @__PURE__ */ C(c, { children: [/* @__PURE__ */ S(n, {
132
+ let X = z || R, Z = X || B ? /* @__PURE__ */ C(l, { children: [X && /* @__PURE__ */ C(c, { children: [/* @__PURE__ */ S(i, {
133
133
  as: "div",
134
- children: /* @__PURE__ */ S(d, {
134
+ children: /* @__PURE__ */ S(s, {
135
135
  icon: "moreVert",
136
136
  children: /* @__PURE__ */ S(D, { id: "PgNNGl" })
137
137
  })
138
- }), /* @__PURE__ */ C(o, { children: [z && /* @__PURE__ */ S(s, {
138
+ }), /* @__PURE__ */ C(e, { children: [z && /* @__PURE__ */ S(o, {
139
139
  label: w._({ id: "cWbW6w" }),
140
140
  onClick: W
141
- }), R && /* @__PURE__ */ S(s, {
141
+ }), R && /* @__PURE__ */ S(o, {
142
142
  label: w._({ id: "JT3I1g" }),
143
143
  onClick: K
144
- })] })] }), B && /* @__PURE__ */ S(d, {
144
+ })] })] }), B && /* @__PURE__ */ S(s, {
145
145
  onClick: H,
146
146
  variant: "primary",
147
147
  children: /* @__PURE__ */ S(D, { id: "6GBt0m" })
@@ -152,7 +152,7 @@ function A() {
152
152
  projectId: t,
153
153
  actions: Z
154
154
  }),
155
- /* @__PURE__ */ S(e, {
155
+ /* @__PURE__ */ S(d, {
156
156
  direction: "vertical",
157
157
  children: /* @__PURE__ */ S(k, { flavor: N })
158
158
  }),
@@ -185,4 +185,4 @@ function A() {
185
185
  //#endregion
186
186
  export { A as component };
187
187
 
188
- //# sourceMappingURL=_flavorId-B-1fYadl.mjs.map
188
+ //# sourceMappingURL=_flavorId-BRonXvCo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_flavorId-BRonXvCo.mjs","names":["React","Stack","DescriptionList","DescriptionTerm","DescriptionDefinition","ContentHeading","FlavorDetailsView","flavor","formatBytes","bytes","unit","direction","gap","className","alignTerms","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","specModalOpen","toggleSpecModal","accessModalOpen","toggleAccessModal","deleteModalOpen","toggleDeleteModal","handleBack","to","params","handleHome","handleRetry","errorCode","message","translatedError","canRetry","getStatusCode","code","includes","undefined","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\"\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>{flavor.id}</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: [\"flavors:delete\", \"flavors:list_projects\", \"flavor_specs:create\", \"flavor_specs:delete\"],\n })\n\n const canDeleteFlavor = permissionsData?.[0] ?? false\n const canManageAccess = permissionsData?.[1] ?? false\n const canManageSpecs = (permissionsData?.[2] ?? false) || (permissionsData?.[3] ?? 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 hasMoreActions = canManageAccess || canDeleteFlavor\n\n const headerActions =\n hasMoreActions || canManageSpecs ? (\n <ButtonRow>\n {hasMoreActions && (\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button icon=\"moreVert\">\n <Trans>More Actions</Trans>\n </Button>\n </PopupMenuToggle>\n <PopupMenuOptions>\n {canManageAccess && <PopupMenuItem label={t`Manage Access`} onClick={toggleAccessModal} />}\n {canDeleteFlavor && <PopupMenuItem label={t`Delete Flavor`} onClick={toggleDeleteModal} />}\n </PopupMenuOptions>\n </PopupMenu>\n )}\n {canManageSpecs && (\n <Button onClick={toggleSpecModal} variant=\"primary\">\n <Trans>Metadata</Trans>\n </Button>\n )}\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 />\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,32 +1,32 @@
1
- import { I as e, O as t, h as n, l as r } from "./build-Cf7iWbpH.mjs";
1
+ import { c as e, h as t, j as n, z as r } from "./build-BJDfnAyi.mjs";
2
2
  import { t as i } from "./helpers--JWXi40U.mjs";
3
3
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
4
4
  import { createFileRoute as s, lazyRouteComponent as c, redirect as l } from "@tanstack/react-router";
5
5
  import { Trans as u } from "@lingui/react";
6
6
  //#region src/client/components/Error/StatusError.tsx
7
7
  function d({ message: i, statusCode: s, onHomeClick: c, onBackClick: l, title: d, reset: f }) {
8
- return /* @__PURE__ */ o(e, {
8
+ return /* @__PURE__ */ o(r, {
9
9
  className: "mx-auto flex min-h-full max-w-3xl flex-col items-center justify-center px-6 py-12 sm:px-12 md:px-20",
10
10
  children: [
11
11
  s && /* @__PURE__ */ a("div", {
12
12
  className: "text-theme-high text-6xl font-bold",
13
13
  children: s
14
14
  }),
15
- /* @__PURE__ */ a(t, { children: d }),
15
+ /* @__PURE__ */ a(n, { children: d }),
16
16
  /* @__PURE__ */ a("p", { children: i }),
17
- (l || c || f) && /* @__PURE__ */ o(n, {
17
+ (l || c || f) && /* @__PURE__ */ o(t, {
18
18
  className: "mt-6",
19
19
  children: [
20
- l && /* @__PURE__ */ a(r, {
20
+ l && /* @__PURE__ */ a(e, {
21
21
  onClick: l,
22
22
  variant: "primary",
23
23
  children: /* @__PURE__ */ a(u, { id: "iH8pgl" })
24
24
  }),
25
- c && /* @__PURE__ */ a(r, {
25
+ c && /* @__PURE__ */ a(e, {
26
26
  onClick: c,
27
27
  children: /* @__PURE__ */ a(u, { id: "i0qMbr" })
28
28
  }),
29
- f && /* @__PURE__ */ a(r, {
29
+ f && /* @__PURE__ */ a(e, {
30
30
  onClick: f,
31
31
  children: /* @__PURE__ */ a(u, { id: "qJb6G2" })
32
32
  })
@@ -51,11 +51,11 @@ 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-B-1fYadl.mjs"), "component"),
54
+ component: c(() => import("./_flavorId-BRonXvCo.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({
58
- to: "/projects/$projectId/compute/overview",
58
+ to: "/projects/$projectId",
59
59
  params: { projectId: r }
60
60
  });
61
61
  }
@@ -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-BYfIHIV_.mjs.map
66
+ //# sourceMappingURL=_flavorId-BoNcxYmF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_flavorId-BoNcxYmF.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: [\"flavors:delete\", \"flavors:list_projects\", \"flavor_specs:create\", \"flavor_specs:delete\"],\n })\n\n const canDeleteFlavor = permissionsData?.[0] ?? false\n const canManageAccess = permissionsData?.[1] ?? false\n const canManageSpecs = (permissionsData?.[2] ?? false) || (permissionsData?.[3] ?? 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 hasMoreActions = canManageAccess || canDeleteFlavor\n\n const headerActions =\n hasMoreActions || canManageSpecs ? (\n <ButtonRow>\n {hasMoreActions && (\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button icon=\"moreVert\">\n <Trans>More Actions</Trans>\n </Button>\n </PopupMenuToggle>\n <PopupMenuOptions>\n {canManageAccess && <PopupMenuItem label={t`Manage Access`} onClick={toggleAccessModal} />}\n {canDeleteFlavor && <PopupMenuItem label={t`Delete Flavor`} onClick={toggleDeleteModal} />}\n </PopupMenuOptions>\n </PopupMenu>\n )}\n {canManageSpecs && (\n <Button onClick={toggleSpecModal} variant=\"primary\">\n <Trans>Metadata</Trans>\n </Button>\n )}\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 />\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;AAC3G,QACE,kBAACR,GAAAA;EAAUS,WAAU;;GAClBL,KAAc,kBAACM,OAAAA;IAAID,WAAU;cAAsCL;;GACpE,kBAACH,GAAAA,EAAAA,UAAgBM,GAAAA,CAAAA;GACjB,kBAACI,KAAAA,EAAAA,UAAGR,GAAAA,CAAAA;IACFG,KAAeD,KAAeG,MAC9B,kBAACT,GAAAA;IAAUU,WAAU;;KAClBH,KACC,kBAACR,GAAAA;MAAOc,SAASN;MAAaO,SAAQ;gBACpC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;KAGHR,KACC,kBAACP,GAAAA;MAAOc,SAASP;gBACf,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;KAIHG,KACC,kBAACV,GAAAA;MAAOc,SAASJ;gBACf,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;;;;;;ACVd,IAAaS,IAAQH,EAAgB,uDAAA,CAAwD;CAC3FI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,WAAU;EACpCC,OAAO;GAAED,UAAU;GAAWE,IAAI;GAAuC;EAC3E;CACAE,QAAQ,OAAO,EAAEC,YAASC,iBAKjB,EAAES,aAJM,MAAMV,EAAQG,YAAYC,QAAQC,cAAcC,MAAM;EACnEC,YAAYN,EAAOO;EACnBC,UAAUR,EAAOQ;EACnB,CAAA,GAC6BE,QAAQ,MAAK;CAE5CC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYH,cAAc,kBAAiB,CAAC,EAC9D;CACAM,WAASC,4CAAA,YAAA;CACTE,YAAY,OAAO,EAAEnB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GACjB,EAAEQ,iBAAcP,GAIhBsB,IAAenC,EAFK,MAAOe,GAAYkB,KAAKC,qBAAqBhB,OAAAA,IAAY,EAAE,CAEhDc;AAErC,MAAI,CAACG,EAAa,UAAa,CAACA,EAAa,QAC3C,OAAMpC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,cAAU;GACtB,CAAA;;CAGN,CAAA"}