@cobaltcore-dev/aurora 0.2.2 → 0.3.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 (105) hide show
  1. package/dist/client/AuroraApp.d.ts +10 -0
  2. package/dist/client/{ContentHeader-DtBiIwRY.mjs → ContentHeader-B_PWrxbw.mjs} +17 -17
  3. package/dist/client/{ContentHeader-DtBiIwRY.mjs.map → ContentHeader-B_PWrxbw.mjs.map} +1 -1
  4. package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs → DeleteFlavorModal-BkPrQKyE.mjs} +146 -146
  5. package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs.map → DeleteFlavorModal-BkPrQKyE.mjs.map} +1 -1
  6. package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs → EditSecurityGroupModal-ad4uzlt0.mjs} +14 -14
  7. package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs.map → EditSecurityGroupModal-ad4uzlt0.mjs.map} +1 -1
  8. package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs → FloatingIpActionModals-lKMwLuL8.mjs} +51 -51
  9. package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs.map → FloatingIpActionModals-lKMwLuL8.mjs.map} +1 -1
  10. package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs → ImageToastNotifications--U13YiQ_.mjs} +328 -328
  11. package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs.map → ImageToastNotifications--U13YiQ_.mjs.map} +1 -1
  12. package/dist/client/{ListToolbar-DuazvsAu.mjs → ListToolbar-C5lzTrit.mjs} +56 -56
  13. package/dist/client/{ListToolbar-DuazvsAu.mjs.map → ListToolbar-C5lzTrit.mjs.map} +1 -1
  14. package/dist/client/{RouteError-Cyto623-.mjs → RouteError-iP1Vd6bY.mjs} +2 -2
  15. package/dist/client/{RouteError-Cyto623-.mjs.map → RouteError-iP1Vd6bY.mjs.map} +1 -1
  16. package/dist/client/{_flavorId-B-1fYadl.mjs → _flavorId-BaNXUJhA.mjs} +49 -49
  17. package/dist/client/_flavorId-BaNXUJhA.mjs.map +1 -0
  18. package/dist/client/{_flavorId-BYfIHIV_.mjs → _flavorId-CnO76tuy.mjs} +10 -10
  19. package/dist/client/_flavorId-CnO76tuy.mjs.map +1 -0
  20. package/dist/client/{_floatingIpId-IrnN-ozB.mjs → _floatingIpId-C8G20nNt.mjs} +2 -2
  21. package/dist/client/{_floatingIpId-IrnN-ozB.mjs.map → _floatingIpId-C8G20nNt.mjs.map} +1 -1
  22. package/dist/client/{_floatingIpId-FQ5P2qMV.mjs → _floatingIpId-DdKnjdIV.mjs} +36 -36
  23. package/dist/client/{_floatingIpId-FQ5P2qMV.mjs.map → _floatingIpId-DdKnjdIV.mjs.map} +1 -1
  24. package/dist/client/{_imageId-Tx_9bqEc.mjs → _imageId-DdSbxFqG.mjs} +135 -135
  25. package/dist/client/_imageId-DdSbxFqG.mjs.map +1 -0
  26. package/dist/client/{_pcaId-CFuKY82d.mjs → _pcaId-DFkYJEb5.mjs} +136 -136
  27. package/dist/client/{_pcaId-CFuKY82d.mjs.map → _pcaId-DFkYJEb5.mjs.map} +1 -1
  28. package/dist/client/{_pcaId-Bck7S7gJ.mjs → _pcaId-DX_S-3hE.mjs} +2 -2
  29. package/dist/client/{_pcaId-Bck7S7gJ.mjs.map → _pcaId-DX_S-3hE.mjs.map} +1 -1
  30. package/dist/client/{_projectId-PSpuCKO7.mjs → _projectId-DYrcZ3E3.mjs} +9 -9
  31. package/dist/client/{_projectId-PSpuCKO7.mjs.map → _projectId-DYrcZ3E3.mjs.map} +1 -1
  32. package/dist/client/{_projectId-B1VjDd0Z.mjs → _projectId-Dha4XqX4.mjs} +3 -3
  33. package/dist/client/{_projectId-B1VjDd0Z.mjs.map → _projectId-Dha4XqX4.mjs.map} +1 -1
  34. package/dist/client/_projectId-DsSVV2EA.mjs +316 -0
  35. package/dist/client/_projectId-DsSVV2EA.mjs.map +1 -0
  36. package/dist/client/{_projectId-Pxp-RXK4.mjs → _projectId-KH5si25Q.mjs} +2 -2
  37. package/dist/client/{_projectId-Pxp-RXK4.mjs.map → _projectId-KH5si25Q.mjs.map} +1 -1
  38. package/dist/client/{_securityGroupId-VV2lUcGQ.mjs → _securityGroupId-DgaSqYex.mjs} +2 -2
  39. package/dist/client/{_securityGroupId-VV2lUcGQ.mjs.map → _securityGroupId-DgaSqYex.mjs.map} +1 -1
  40. package/dist/client/{_securityGroupId-Dqi6ddw4.mjs → _securityGroupId-O7FXfx0M.mjs} +306 -306
  41. package/dist/client/{_securityGroupId-Dqi6ddw4.mjs.map → _securityGroupId-O7FXfx0M.mjs.map} +1 -1
  42. package/dist/client/{about-B2AzqxFI.mjs → about-DN8n8sN8.mjs} +8 -8
  43. package/dist/client/{about-B2AzqxFI.mjs.map → about-DN8n8sN8.mjs.map} +1 -1
  44. package/dist/client/{build-Cf7iWbpH.mjs → build-CZRvXrAL.mjs} +1047 -1042
  45. package/dist/client/{build-Cf7iWbpH.mjs.map → build-CZRvXrAL.mjs.map} +1 -1
  46. package/dist/client/{constants-CCgR6fKI.mjs → constants-akdIBeTX.mjs} +6 -6
  47. package/dist/client/{constants-CCgR6fKI.mjs.map → constants-akdIBeTX.mjs.map} +1 -1
  48. package/dist/client/{containers-BWERuY0O.mjs → containers-BE2QiLBs.mjs} +748 -748
  49. package/dist/client/{containers-BWERuY0O.mjs.map → containers-BE2QiLBs.mjs.map} +1 -1
  50. package/dist/client/containers-Cs5vOeR2.mjs.map +1 -1
  51. package/dist/client/{containers-DovytjVP.mjs → containers-DmwhE9Uz.mjs} +6 -6
  52. package/dist/client/containers-DmwhE9Uz.mjs.map +1 -0
  53. package/dist/client/flavors-BXPYAFyQ.mjs.map +1 -1
  54. package/dist/client/{flavors-CUiALHcB.mjs → flavors-CY7A6--v.mjs} +2 -2
  55. package/dist/client/{flavors-CUiALHcB.mjs.map → flavors-CY7A6--v.mjs.map} +1 -1
  56. package/dist/client/{flavors-Bovz-I2U.mjs → flavors-pEcGkCut.mjs} +150 -150
  57. package/dist/client/{flavors-Bovz-I2U.mjs.map → flavors-pEcGkCut.mjs.map} +1 -1
  58. package/dist/client/{floatingips-BrjDiY2t.mjs → floatingips-BtL4d4m-.mjs} +118 -118
  59. package/dist/client/{floatingips-BrjDiY2t.mjs.map → floatingips-BtL4d4m-.mjs.map} +1 -1
  60. package/dist/client/{images-DaaCUXMI.mjs → images-C19gCFSy.mjs} +389 -389
  61. package/dist/client/{images-DaaCUXMI.mjs.map → images-C19gCFSy.mjs.map} +1 -1
  62. package/dist/client/images-DM9I8G0p.mjs.map +1 -1
  63. package/dist/client/{images-BZP3pBqj.mjs → images-I9gQfRa7.mjs} +2 -2
  64. package/dist/client/{images-BZP3pBqj.mjs.map → images-I9gQfRa7.mjs.map} +1 -1
  65. package/dist/client/index.d.ts +2 -1
  66. package/dist/client/index.js +416 -418
  67. package/dist/client/index.js.map +1 -1
  68. package/dist/client/objects-B4yrYf_a.mjs.map +1 -1
  69. package/dist/client/{objects-D4zBka5e.mjs → objects-BrYe_RaJ.mjs} +6 -6
  70. package/dist/client/objects-BrYe_RaJ.mjs.map +1 -0
  71. package/dist/client/{objects-Cw4Vu01M.mjs → objects-DOYFFn3Y.mjs} +1013 -1013
  72. package/dist/client/{objects-Cw4Vu01M.mjs.map → objects-DOYFFn3Y.mjs.map} +1 -1
  73. package/dist/client/{overview-2J54-loz.mjs → overview-BjRSFSBh.mjs} +2 -2
  74. package/dist/client/{overview-2J54-loz.mjs.map → overview-BjRSFSBh.mjs.map} +1 -1
  75. package/dist/client/{overview-BnmukbFh.mjs → overview-C4gjtc2q.mjs} +7 -7
  76. package/dist/client/{overview-BnmukbFh.mjs.map → overview-C4gjtc2q.mjs.map} +1 -1
  77. package/dist/client/{overview-D0AAvsmL.mjs → overview-CmQkJ4Hh.mjs} +2 -2
  78. package/dist/client/{overview-D0AAvsmL.mjs.map → overview-CmQkJ4Hh.mjs.map} +1 -1
  79. package/dist/client/{overview-BtIXpYBo.mjs → overview-DTLIAKkJ.mjs} +2 -2
  80. package/dist/client/{overview-BtIXpYBo.mjs.map → overview-DTLIAKkJ.mjs.map} +1 -1
  81. package/dist/client/{pca-V2aaOxZA.mjs → pca-CYFJxSZ2.mjs} +70 -70
  82. package/dist/client/{pca-V2aaOxZA.mjs.map → pca-CYFJxSZ2.mjs.map} +1 -1
  83. package/dist/client/{pca-BqZycwCu.mjs → pca-DzixU9Dl.mjs} +2 -2
  84. package/dist/client/{pca-BqZycwCu.mjs.map → pca-DzixU9Dl.mjs.map} +1 -1
  85. package/dist/client/projects-BsN4bvU2.mjs.map +1 -1
  86. package/dist/client/{projects-0feOw_b6.mjs → projects-BtyjXGq2.mjs} +2 -2
  87. package/dist/client/projects-BtyjXGq2.mjs.map +1 -0
  88. package/dist/client/projects-D3hOC1cy.mjs +95 -0
  89. package/dist/client/projects-D3hOC1cy.mjs.map +1 -0
  90. package/dist/client/{projects-jyIHL6DE.mjs → projects-DwVawmll.mjs} +2 -2
  91. package/dist/client/projects-DwVawmll.mjs.map +1 -0
  92. package/dist/client/{securitygroups-B4MkSBtI.mjs → securitygroups-DMCIDHQS.mjs} +114 -114
  93. package/dist/client/{securitygroups-B4MkSBtI.mjs.map → securitygroups-DMCIDHQS.mjs.map} +1 -1
  94. package/package.json +3 -3
  95. package/dist/client/_flavorId-B-1fYadl.mjs.map +0 -1
  96. package/dist/client/_flavorId-BYfIHIV_.mjs.map +0 -1
  97. package/dist/client/_imageId-Tx_9bqEc.mjs.map +0 -1
  98. package/dist/client/_projectId-Bs4W9hos.mjs +0 -283
  99. package/dist/client/_projectId-Bs4W9hos.mjs.map +0 -1
  100. package/dist/client/containers-DovytjVP.mjs.map +0 -1
  101. package/dist/client/objects-D4zBka5e.mjs.map +0 -1
  102. package/dist/client/projects-0feOw_b6.mjs.map +0 -1
  103. package/dist/client/projects-C1IYOvFQ.mjs +0 -144
  104. package/dist/client/projects-C1IYOvFQ.mjs.map +0 -1
  105. package/dist/client/projects-jyIHL6DE.mjs.map +0 -1
@@ -1,24 +1,24 @@
1
- import { $ as e, _ as t, at as n, f as r, i, m as a, o, p as s, v as c, x as l, y as u } from "./build-Cf7iWbpH.mjs";
1
+ import { P as e, _ as t, a as n, d as r, f as i, m as a, ot as o, r as s, tt as c, x as l, y as u } from "./build-CZRvXrAL.mjs";
2
2
  import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
3
3
  import { useCallback as m, useEffect as h, useRef as g, useState as _ } from "react";
4
4
  import { Trans as v, useLingui as y } from "@lingui/react";
5
5
  //#region src/client/components/ListToolbar/SelectedFilters.tsx
6
- var b = ({ selectedFilters: n, onDelete: r, onClear: i }) => {
7
- let { i18n: a, _: o } = y();
8
- return /* @__PURE__ */ p(e, {
6
+ var b = ({ selectedFilters: e, onDelete: t, onClear: n }) => {
7
+ let { i18n: r, _: i } = y();
8
+ return /* @__PURE__ */ p(c, {
9
9
  gap: "2",
10
10
  wrap: !0,
11
11
  alignment: "start",
12
12
  distribution: "start",
13
- children: [n.map((e) => /* @__PURE__ */ f(t, {
13
+ children: [e.map((e) => /* @__PURE__ */ f(u, {
14
14
  closeable: !0,
15
15
  pillKey: e.name,
16
16
  pillValue: e.value,
17
- onClose: () => r(e)
18
- }, `${e.name}:${e.value}`)), n.length > 1 && /* @__PURE__ */ f(t, {
19
- pillValue: a._({ id: "yYxB17" }),
17
+ onClose: () => t(e)
18
+ }, `${e.name}:${e.value}`)), e.length > 1 && /* @__PURE__ */ f(u, {
19
+ pillValue: r._({ id: "yYxB17" }),
20
20
  className: "ml-2",
21
- onClick: i
21
+ onClick: n
22
22
  })]
23
23
  });
24
24
  };
@@ -28,7 +28,7 @@ function x(e) {
28
28
  return e == null ? !0 : typeof e == "string" || Array.isArray(e) ? e.length === 0 : e instanceof Map || e instanceof Set ? e.size === 0 : typeof e == "object" ? Object.keys(e).length === 0 : !1;
29
29
  }
30
30
  var S = ({ filters: e, onChange: t }) => {
31
- let { i18n: s, _: c } = y(), [l, u] = _(""), [d, h] = _(""), g = e.find((e) => e.filterName === l)?.values?.filter((e) => e), v = m((e) => {
31
+ let { i18n: i, _: c } = y(), [l, u] = _(""), [d, h] = _(""), g = e.find((e) => e.filterName === l)?.values?.filter((e) => e), v = m((e) => {
32
32
  h(e), !x(l) && !x(e) && t({
33
33
  name: l,
34
34
  value: e
@@ -43,7 +43,7 @@ var S = ({ filters: e, onChange: t }) => {
43
43
  className: "w-full sm:flex-1 sm:min-w-0",
44
44
  name: "filter",
45
45
  "data-testid": "select-filterValue",
46
- label: s._({ id: "0cVgUw" }),
46
+ label: i._({ id: "0cVgUw" }),
47
47
  value: l,
48
48
  onChange: (e) => {
49
49
  u(String(e));
@@ -56,16 +56,16 @@ var S = ({ filters: e, onChange: t }) => {
56
56
  disabled: !l,
57
57
  onChange: v
58
58
  });
59
- return /* @__PURE__ */ p(n, {
59
+ return /* @__PURE__ */ p(o, {
60
60
  className: "flex w-full flex-col sm:w-auto sm:flex-row sm:items-end",
61
- children: [/* @__PURE__ */ f(i, {
61
+ children: [/* @__PURE__ */ f(s, {
62
62
  ...b(),
63
63
  children: e?.map(({ displayName: e, filterName: t }) => /* @__PURE__ */ f(r, {
64
64
  value: t,
65
65
  label: e,
66
66
  "data-testid": t
67
67
  }, t))
68
- }), /* @__PURE__ */ f(o, {
68
+ }), /* @__PURE__ */ f(n, {
69
69
  ...S(),
70
70
  children: g?.map((e) => /* @__PURE__ */ f(a, {
71
71
  value: e,
@@ -74,97 +74,97 @@ var S = ({ filters: e, onChange: t }) => {
74
74
  }, e))
75
75
  })]
76
76
  });
77
- }, C = ({ sortBy: e, onSortByChange: t, sortDirection: a, onSortDirectionChange: o, options: s }) => {
78
- let { i18n: c, _: u } = y(), d = () => ({
77
+ }, C = ({ sortBy: t, onSortByChange: n, sortDirection: i, onSortDirectionChange: a, options: c }) => {
78
+ let { i18n: l, _: u } = y(), d = () => ({
79
79
  className: "flex-grow",
80
- onChange: t,
81
- value: e,
80
+ onChange: n,
81
+ value: t,
82
82
  "data-testid": "sort-select",
83
- label: c._({ id: "/HgF9q" })
83
+ label: l._({ id: "/HgF9q" })
84
84
  }), m = () => ({
85
85
  "data-testid": "direction-toggle",
86
- order: a,
87
- onChange: o
86
+ order: i,
87
+ onChange: a
88
88
  });
89
- return /* @__PURE__ */ p(n, {
89
+ return /* @__PURE__ */ p(o, {
90
90
  className: "flex w-full items-end sm:w-auto",
91
- children: [/* @__PURE__ */ f(i, {
91
+ children: [/* @__PURE__ */ f(s, {
92
92
  ...d(),
93
- children: s.map((e) => /* @__PURE__ */ f(r, {
93
+ children: c.map((e) => /* @__PURE__ */ f(r, {
94
94
  value: e.value,
95
95
  children: e.label
96
96
  }, e.value))
97
- }), /* @__PURE__ */ f(l, {
97
+ }), /* @__PURE__ */ f(e, {
98
98
  ...m(),
99
99
  className: "shadow-none"
100
100
  })]
101
101
  });
102
- }, w = ({ filterSettings: t, onFilter: n, sortSettings: r, onSort: i, searchTerm: a, onSearch: o, searchInputProps: l = {}, actions: _, tabs: x, totalCount: w, filteredCount: T, itemName: E = "items", lastUpdated: D }) => {
102
+ }, w = ({ filterSettings: e, onFilter: n, sortSettings: r, onSort: a, searchTerm: o, onSearch: s, searchInputProps: u = {}, actions: _, tabs: x, totalCount: w, filteredCount: T, itemName: E = "items", lastUpdated: D }) => {
103
103
  let { i18n: O, _: k } = y(), A = g(void 0);
104
104
  h(() => () => {
105
105
  A.current && clearTimeout(A.current);
106
106
  }, []);
107
- let j = (e) => e ? (typeof e == "string" ? new Date(e) : e).toLocaleString() : "", M = w !== void 0 && T !== void 0, N = m((e) => {
108
- !n || !t || n({
109
- ...t,
110
- selectedFilters: t.selectedFilters?.filter((t) => !(t.name === e.name && t.value === e.value))
107
+ let j = (e) => e ? (typeof e == "string" ? new Date(e) : e).toLocaleString() : "", M = w !== void 0 && T !== void 0, N = m((t) => {
108
+ !n || !e || n({
109
+ ...e,
110
+ selectedFilters: e.selectedFilters?.filter((e) => !(e.name === t.name && e.value === t.value))
111
111
  });
112
- }, [t, n]), P = (e) => {
113
- if (!n || !t || t.selectedFilters?.some((t) => t.name === e.name && t.value === e.value)) return;
114
- let r = t.filters.find((t) => e.name === t.filterName)?.supportsMultiValue ? [...t.selectedFilters || [], e] : [...(t.selectedFilters || []).filter((t) => t.name !== e.name), e];
112
+ }, [e, n]), P = (t) => {
113
+ if (!n || !e || e.selectedFilters?.some((e) => e.name === t.name && e.value === t.value)) return;
114
+ let r = e.filters.find((e) => t.name === e.filterName)?.supportsMultiValue ? [...e.selectedFilters || [], t] : [...(e.selectedFilters || []).filter((e) => e.name !== t.name), t];
115
115
  n({
116
- ...t,
116
+ ...e,
117
117
  selectedFilters: r
118
118
  });
119
119
  }, F = m((e) => {
120
120
  let t = typeof e == "string" ? e : "";
121
- A.current && clearTimeout(A.current), o?.(t);
122
- }, [o]), I = m((e) => {
121
+ A.current && clearTimeout(A.current), s?.(t);
122
+ }, [s]), I = m((e) => {
123
123
  let t = e.currentTarget.value;
124
- A.current && clearTimeout(A.current), A.current = window.setTimeout(() => o?.(t), 500);
125
- }, [o]), L = m(() => {
126
- A.current && clearTimeout(A.current), o?.("");
127
- }, [o]), R = t && n ? {
128
- filters: t.filters,
124
+ A.current && clearTimeout(A.current), A.current = window.setTimeout(() => s?.(t), 500);
125
+ }, [s]), L = m(() => {
126
+ A.current && clearTimeout(A.current), s?.("");
127
+ }, [s]), R = e && n ? {
128
+ filters: e.filters,
129
129
  onChange: P
130
- } : null, z = r && i ? {
130
+ } : null, z = r && a ? {
131
131
  options: r.options,
132
132
  sortBy: r.sortBy,
133
133
  sortDirection: r.sortDirection || "asc",
134
- onSortByChange: (e) => i({
134
+ onSortByChange: (e) => a({
135
135
  ...r,
136
136
  sortBy: e,
137
137
  sortDirection: r.sortDirection || "asc"
138
138
  }),
139
- onSortDirectionChange: (e) => i({
139
+ onSortDirectionChange: (e) => a({
140
140
  ...r,
141
141
  sortDirection: e
142
142
  })
143
- } : null, B = o ? {
143
+ } : null, B = s ? {
144
144
  placeholder: O._({ id: "YIix5Y" }),
145
145
  "data-testid": "searchbar",
146
- value: a,
146
+ value: o,
147
147
  onInput: I,
148
148
  onClear: L,
149
149
  onSearch: F,
150
- ...l
150
+ ...u
151
151
  } : null;
152
152
  return /* @__PURE__ */ p(d, { children: [x && /* @__PURE__ */ f("div", {
153
153
  className: "w-full",
154
- children: /* @__PURE__ */ f(c, {
154
+ children: /* @__PURE__ */ f(t, {
155
155
  activeItem: x.activeItem,
156
156
  onActiveItemChange: x.onActiveItemChange,
157
- children: x.items.map((e) => /* @__PURE__ */ f(u, {
157
+ children: x.items.map((e) => /* @__PURE__ */ f(l, {
158
158
  label: e.label,
159
159
  value: e.value
160
160
  }, e.value))
161
161
  })
162
- }), /* @__PURE__ */ p(e, {
162
+ }), /* @__PURE__ */ p(c, {
163
163
  alignment: "center",
164
164
  gap: "6",
165
165
  className: "bg-theme-background-lvl-1 flex w-full flex-col p-4",
166
166
  children: [
167
- _ && /* @__PURE__ */ f(e, {
167
+ _ && /* @__PURE__ */ f(c, {
168
168
  direction: "horizontal",
169
169
  className: "w-full justify-end",
170
170
  children: _
@@ -182,17 +182,17 @@ var S = ({ filters: e, onChange: t }) => {
182
182
  }),
183
183
  B && /* @__PURE__ */ f("div", {
184
184
  className: "w-full md:ml-auto md:w-auto md:min-w-25",
185
- children: /* @__PURE__ */ f(s, { ...B })
185
+ children: /* @__PURE__ */ f(i, { ...B })
186
186
  })
187
187
  ]
188
188
  }),
189
- t?.selectedFilters && t.selectedFilters.length > 0 && n && /* @__PURE__ */ f("div", {
189
+ e?.selectedFilters && e.selectedFilters.length > 0 && n && /* @__PURE__ */ f("div", {
190
190
  className: "w-full",
191
191
  children: /* @__PURE__ */ f(b, {
192
- selectedFilters: t.selectedFilters,
192
+ selectedFilters: e.selectedFilters,
193
193
  onDelete: N,
194
194
  onClear: () => n({
195
- ...t,
195
+ ...e,
196
196
  selectedFilters: []
197
197
  })
198
198
  })
@@ -220,4 +220,4 @@ var S = ({ filters: e, onChange: t }) => {
220
220
  //#endregion
221
221
  export { w as t };
222
222
 
223
- //# sourceMappingURL=ListToolbar-DuazvsAu.mjs.map
223
+ //# sourceMappingURL=ListToolbar-C5lzTrit.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListToolbar-DuazvsAu.mjs","names":["Pill","Stack","SelectedFilters","selectedFilters","onDelete","onClear","useLingui","gap","wrap","alignment","distribution","map","filter","closeable","pillKey","name","pillValue","value","onClose","length","t","className","onClick","useCallback","useState","InputGroup","ComboBox","ComboBoxOption","SelectOption","Select","isEmpty","value","Array","isArray","length","Map","Set","size","Object","keys","FiltersInput","filters","onChange","useLingui","selectedFilterName","setSelectedFilterName","selectedFilterValue","setSelectedFilterValue","filterValues","find","filter","filterName","values","handleValueChange","name","setTimeout","getSelectProps","className","label","t","String","getComboBoxProps","disabled","map","displayName","data-testid","React","Select","SelectOption","SortButton","InputGroup","SortInput","sortBy","onSortByChange","sortDirection","onSortDirectionChange","options","useLingui","getSelectProps","className","onChange","value","label","t","getSortButtonProps","order","map","option","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/SelectedFilters.tsx","../../src/client/components/ListToolbar/FiltersInput.tsx","../../src/client/components/ListToolbar/SortInput.tsx","../../src/client/components/ListToolbar/index.tsx"],"sourcesContent":["import { useLingui } from \"@lingui/react/macro\"\nimport { Pill, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SelectedFilter } from \"./types\"\n\nexport type SelectedFiltersProps = {\n /**\n * Array of currently active filters to be displayed as closeable pills.\n */\n selectedFilters: SelectedFilter[]\n\n /**\n * Callback function invoked when a user removes an individual filter pill.\n */\n onDelete: (filter: SelectedFilter) => void\n\n /**\n * Callback function invoked when the \"Clear all\" button is clicked.\n */\n onClear: () => void\n}\n\n/**\n * SelectedFilters Component\n *\n * Displays currently active filters as closeable pill components with individual\n * remove buttons and an optional \"Clear all\" button (shown when 2+ filters are active).\n *\n * The pills are arranged in a flexible, wrapping layout that adapts to available space.\n */\nexport const SelectedFilters = ({ selectedFilters, onDelete, onClear }: SelectedFiltersProps) => {\n const { t } = useLingui()\n\n return (\n <Stack gap=\"2\" wrap={true} alignment=\"start\" distribution=\"start\">\n {/* Render a closeable pill for each selected filter */}\n {selectedFilters.map((filter) => (\n <Pill\n key={`${filter.name}:${filter.value}`}\n closeable\n pillKey={filter.name}\n pillValue={filter.value}\n onClose={() => onDelete(filter)}\n />\n ))}\n {selectedFilters.length > 1 && <Pill pillValue={t`Clear all`} className=\"ml-2\" onClick={onClear} />}\n </Stack>\n )\n}\n","import { useCallback, useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n InputGroup,\n ComboBox,\n ComboBoxProps,\n ComboBoxOption,\n SelectOption,\n Select,\n SelectProps,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Filter, SelectedFilter } from \"./types\"\n\nexport type FiltersInputProps = {\n filters: Filter[]\n onChange: (filter: SelectedFilter) => void\n}\n\nfunction isEmpty(value: unknown) {\n if (value == null) return true\n if (typeof value === \"string\" || Array.isArray(value)) return value.length === 0\n if (value instanceof Map || value instanceof Set) return value.size === 0\n if (typeof value === \"object\") return Object.keys(value).length === 0\n return false\n}\n\nexport const FiltersInput = ({ filters, onChange }: FiltersInputProps) => {\n const { t } = useLingui()\n\n const [selectedFilterName, setSelectedFilterName] = useState<string>(\"\")\n const [selectedFilterValue, setSelectedFilterValue] = useState<string>(\"\")\n\n const filterValues: string[] | undefined = filters\n .find((filter) => filter.filterName === selectedFilterName)\n ?.values?.filter((value) => value)\n\n const handleValueChange = useCallback(\n (value: string) => {\n setSelectedFilterValue(value)\n if (!isEmpty(selectedFilterName) && !isEmpty(value)) {\n onChange({\n name: selectedFilterName,\n value: value,\n })\n }\n setTimeout(() => {\n setSelectedFilterValue(\"\")\n }, 0)\n },\n [selectedFilterName, setSelectedFilterValue, onChange]\n )\n\n const getSelectProps = (): SelectProps & { \"data-testid\"?: string } => ({\n className: \"w-full sm:flex-1 sm:min-w-0\",\n name: \"filter\",\n \"data-testid\": \"select-filterValue\",\n label: t`Filter by`,\n value: selectedFilterName,\n onChange: (value: string | number | string[] | undefined) => {\n setSelectedFilterName(String(value))\n },\n })\n\n const getComboBoxProps = (): ComboBoxProps & { \"data-testid\"?: string } => ({\n className: \"w-full sm:flex-1 sm:min-w-0\",\n name: \"filterValue\",\n \"data-testid\": \"combobox-filterValue\",\n value: selectedFilterValue,\n disabled: !selectedFilterName,\n onChange: handleValueChange,\n })\n\n return (\n <InputGroup className=\"flex w-full flex-col sm:w-auto sm:flex-row sm:items-end\">\n <Select {...getSelectProps()}>\n {filters?.map(({ displayName, filterName }) => (\n <SelectOption value={filterName} label={displayName} key={filterName} data-testid={filterName} />\n ))}\n </Select>\n <ComboBox {...getComboBoxProps()}>\n {filterValues?.map((value) => (\n <ComboBoxOption value={value} key={value} label={value} data-testid={value} />\n ))}\n </ComboBox>\n </InputGroup>\n )\n}\n","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","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
+ {"version":3,"file":"ListToolbar-C5lzTrit.mjs","names":["Pill","Stack","SelectedFilters","selectedFilters","onDelete","onClear","useLingui","gap","wrap","alignment","distribution","map","filter","closeable","pillKey","name","pillValue","value","onClose","length","t","className","onClick","useCallback","useState","InputGroup","ComboBox","ComboBoxOption","SelectOption","Select","isEmpty","value","Array","isArray","length","Map","Set","size","Object","keys","FiltersInput","filters","onChange","useLingui","selectedFilterName","setSelectedFilterName","selectedFilterValue","setSelectedFilterValue","filterValues","find","filter","filterName","values","handleValueChange","name","setTimeout","getSelectProps","className","label","t","String","getComboBoxProps","disabled","map","displayName","data-testid","React","Select","SelectOption","SortButton","InputGroup","SortInput","sortBy","onSortByChange","sortDirection","onSortDirectionChange","options","useLingui","getSelectProps","className","onChange","value","label","t","getSortButtonProps","order","map","option","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/SelectedFilters.tsx","../../src/client/components/ListToolbar/FiltersInput.tsx","../../src/client/components/ListToolbar/SortInput.tsx","../../src/client/components/ListToolbar/index.tsx"],"sourcesContent":["import { useLingui } from \"@lingui/react/macro\"\nimport { Pill, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SelectedFilter } from \"./types\"\n\nexport type SelectedFiltersProps = {\n /**\n * Array of currently active filters to be displayed as closeable pills.\n */\n selectedFilters: SelectedFilter[]\n\n /**\n * Callback function invoked when a user removes an individual filter pill.\n */\n onDelete: (filter: SelectedFilter) => void\n\n /**\n * Callback function invoked when the \"Clear all\" button is clicked.\n */\n onClear: () => void\n}\n\n/**\n * SelectedFilters Component\n *\n * Displays currently active filters as closeable pill components with individual\n * remove buttons and an optional \"Clear all\" button (shown when 2+ filters are active).\n *\n * The pills are arranged in a flexible, wrapping layout that adapts to available space.\n */\nexport const SelectedFilters = ({ selectedFilters, onDelete, onClear }: SelectedFiltersProps) => {\n const { t } = useLingui()\n\n return (\n <Stack gap=\"2\" wrap={true} alignment=\"start\" distribution=\"start\">\n {/* Render a closeable pill for each selected filter */}\n {selectedFilters.map((filter) => (\n <Pill\n key={`${filter.name}:${filter.value}`}\n closeable\n pillKey={filter.name}\n pillValue={filter.value}\n onClose={() => onDelete(filter)}\n />\n ))}\n {selectedFilters.length > 1 && <Pill pillValue={t`Clear all`} className=\"ml-2\" onClick={onClear} />}\n </Stack>\n )\n}\n","import { useCallback, useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n InputGroup,\n ComboBox,\n ComboBoxProps,\n ComboBoxOption,\n SelectOption,\n Select,\n SelectProps,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Filter, SelectedFilter } from \"./types\"\n\nexport type FiltersInputProps = {\n filters: Filter[]\n onChange: (filter: SelectedFilter) => void\n}\n\nfunction isEmpty(value: unknown) {\n if (value == null) return true\n if (typeof value === \"string\" || Array.isArray(value)) return value.length === 0\n if (value instanceof Map || value instanceof Set) return value.size === 0\n if (typeof value === \"object\") return Object.keys(value).length === 0\n return false\n}\n\nexport const FiltersInput = ({ filters, onChange }: FiltersInputProps) => {\n const { t } = useLingui()\n\n const [selectedFilterName, setSelectedFilterName] = useState<string>(\"\")\n const [selectedFilterValue, setSelectedFilterValue] = useState<string>(\"\")\n\n const filterValues: string[] | undefined = filters\n .find((filter) => filter.filterName === selectedFilterName)\n ?.values?.filter((value) => value)\n\n const handleValueChange = useCallback(\n (value: string) => {\n setSelectedFilterValue(value)\n if (!isEmpty(selectedFilterName) && !isEmpty(value)) {\n onChange({\n name: selectedFilterName,\n value: value,\n })\n }\n setTimeout(() => {\n setSelectedFilterValue(\"\")\n }, 0)\n },\n [selectedFilterName, setSelectedFilterValue, onChange]\n )\n\n const getSelectProps = (): SelectProps & { \"data-testid\"?: string } => ({\n className: \"w-full sm:flex-1 sm:min-w-0\",\n name: \"filter\",\n \"data-testid\": \"select-filterValue\",\n label: t`Filter by`,\n value: selectedFilterName,\n onChange: (value: string | number | string[] | undefined) => {\n setSelectedFilterName(String(value))\n },\n })\n\n const getComboBoxProps = (): ComboBoxProps & { \"data-testid\"?: string } => ({\n className: \"w-full sm:flex-1 sm:min-w-0\",\n name: \"filterValue\",\n \"data-testid\": \"combobox-filterValue\",\n value: selectedFilterValue,\n disabled: !selectedFilterName,\n onChange: handleValueChange,\n })\n\n return (\n <InputGroup className=\"flex w-full flex-col sm:w-auto sm:flex-row sm:items-end\">\n <Select {...getSelectProps()}>\n {filters?.map(({ displayName, filterName }) => (\n <SelectOption value={filterName} label={displayName} key={filterName} data-testid={filterName} />\n ))}\n </Select>\n <ComboBox {...getComboBoxProps()}>\n {filterValues?.map((value) => (\n <ComboBoxOption value={value} key={value} label={value} data-testid={value} />\n ))}\n </ComboBox>\n </InputGroup>\n )\n}\n","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","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 { A as e } from "./build-CZRvXrAL.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-iP1Vd6bY.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-iP1Vd6bY.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,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 { $ as e, A as t, I as n, J as r, L as i, M as a, T as o, U as s, Z as c, c as l, h as u, tt as d } from "./build-CZRvXrAL.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-CnO76tuy.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-BkPrQKyE.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-B_PWrxbw.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(t, { children: /* @__PURE__ */ S(D, { id: "jIPNJG" }) }), /* @__PURE__ */ C(s, {
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(a, { children: /* @__PURE__ */ S(D, { id: "S0kLOH" }) }),
27
+ /* @__PURE__ */ S(n, { children: e.id }),
28
+ /* @__PURE__ */ S(a, { children: /* @__PURE__ */ S(D, { id: "6YtxFj" }) }),
29
+ /* @__PURE__ */ S(n, { children: e.name }),
30
+ /* @__PURE__ */ S(a, { children: /* @__PURE__ */ S(D, { id: "Nu4oKW" }) }),
31
+ /* @__PURE__ */ S(n, { children: e?.description }),
32
+ /* @__PURE__ */ S(a, { children: /* @__PURE__ */ S(D, { id: "7d1a0d" }) }),
33
+ /* @__PURE__ */ S(n, { children: e["os-flavor-access:is_public"] ? /* @__PURE__ */ S(D, { id: "l75CjT" }) : /* @__PURE__ */ S(D, { id: "1UzENP" }) }),
34
+ /* @__PURE__ */ S(a, { children: /* @__PURE__ */ S(D, { id: "E/QGRL" }) }),
35
+ /* @__PURE__ */ S(n, { 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(t, { children: /* @__PURE__ */ S(D, { id: "qQ1QBh" }) }), /* @__PURE__ */ C(s, {
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(a, { children: /* @__PURE__ */ S(D, { id: "MZGbkp" }) }),
46
+ /* @__PURE__ */ S(n, { children: e.vcpus }),
47
+ /* @__PURE__ */ S(a, { children: /* @__PURE__ */ S(D, { id: "RGhYAo" }) }),
48
+ /* @__PURE__ */ S(n, { children: r(e.ram, "MiB") }),
49
+ /* @__PURE__ */ S(a, { children: /* @__PURE__ */ S(D, { id: "sPFHpI" }) }),
50
+ /* @__PURE__ */ S(n, { children: r(e.disk, "GiB") }),
51
+ /* @__PURE__ */ S(a, { children: /* @__PURE__ */ S(D, { id: "r9Aac8" }) }),
52
+ /* @__PURE__ */ S(n, { children: r(e["OS-FLV-EXT-DATA:ephemeral"] || 0, "GiB") }),
53
+ /* @__PURE__ */ S(a, { children: /* @__PURE__ */ S(D, { id: "vH2C/2" }) }),
54
+ /* @__PURE__ */ S(n, { children: e.swap === 0 || e.swap === "" ? /* @__PURE__ */ S(D, { id: "EdQY6l" }) : r(Number(e.swap), "MiB") }),
55
+ /* @__PURE__ */ S(a, { children: /* @__PURE__ */ S(D, { id: "u5HztT" }) }),
56
+ /* @__PURE__ */ S(n, { 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(t, { children: /* @__PURE__ */ S(D, { id: "DKkOPx" }) }), /* @__PURE__ */ S(s, {
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, t]) => /* @__PURE__ */ C(w.Fragment, { children: [/* @__PURE__ */ S(a, { children: e }), /* @__PURE__ */ S(n, { children: t })] }, 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(), s = 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: [
@@ -83,24 +83,24 @@ function A() {
83
83
  "flavor_specs:delete"
84
84
  ]
85
85
  }), R = L?.[0] ?? !1, z = L?.[1] ?? !1, B = (L?.[2] ?? !1) || (L?.[3] ?? !1), [V, H] = y(), [U, W] = y(), [G, K] = y(), q = () => {
86
- u({
86
+ s({
87
87
  to: "/projects/$projectId/compute/flavors",
88
88
  params: { projectId: t }
89
89
  });
90
90
  }, J = () => {
91
- u({
92
- to: "/projects/$projectId/compute/overview",
91
+ s({
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",
102
102
  direction: "vertical",
103
- children: [/* @__PURE__ */ S(r, {
103
+ children: [/* @__PURE__ */ S(c, {
104
104
  variant: "primary",
105
105
  size: "large",
106
106
  className: "mb-2"
@@ -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(u, { children: [X && /* @__PURE__ */ C(e, { children: [/* @__PURE__ */ S(i, {
133
133
  as: "div",
134
- children: /* @__PURE__ */ S(d, {
134
+ children: /* @__PURE__ */ S(l, {
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(o, { children: [z && /* @__PURE__ */ S(r, {
139
139
  label: w._({ id: "cWbW6w" }),
140
140
  onClick: W
141
- }), R && /* @__PURE__ */ S(s, {
141
+ }), R && /* @__PURE__ */ S(r, {
142
142
  label: w._({ id: "JT3I1g" }),
143
143
  onClick: K
144
- })] })] }), B && /* @__PURE__ */ S(d, {
144
+ })] })] }), B && /* @__PURE__ */ S(l, {
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-BaNXUJhA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_flavorId-BaNXUJhA.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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"}