@cobaltcore-dev/aurora 0.1.0 → 0.2.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 (172) hide show
  1. package/dist/client/{ContentHeader-H8KGY3Wd.mjs → ContentHeader-DtBiIwRY.mjs} +15 -15
  2. package/dist/client/{ContentHeader-H8KGY3Wd.mjs.map → ContentHeader-DtBiIwRY.mjs.map} +1 -1
  3. package/dist/client/{DeleteFlavorModal-B98oiHWx.mjs → DeleteFlavorModal-rmuYIafD.mjs} +142 -142
  4. package/dist/client/{DeleteFlavorModal-B98oiHWx.mjs.map → DeleteFlavorModal-rmuYIafD.mjs.map} +1 -1
  5. package/dist/client/{EditSecurityGroupModal-wQVNIVg1.mjs → EditSecurityGroupModal-B7Sz9puM.mjs} +15 -15
  6. package/dist/client/{EditSecurityGroupModal-wQVNIVg1.mjs.map → EditSecurityGroupModal-B7Sz9puM.mjs.map} +1 -1
  7. package/dist/client/{FloatingIpActionModals-qu1NMI5a.mjs → FloatingIpActionModals-CfRJiZqD.mjs} +59 -59
  8. package/dist/client/{FloatingIpActionModals-qu1NMI5a.mjs.map → FloatingIpActionModals-CfRJiZqD.mjs.map} +1 -1
  9. package/dist/client/{ImageToastNotifications-wsQDNEh7.mjs → ImageToastNotifications-Cw30RXsw.mjs} +374 -374
  10. package/dist/client/{ImageToastNotifications-wsQDNEh7.mjs.map → ImageToastNotifications-Cw30RXsw.mjs.map} +1 -1
  11. package/dist/client/{ListToolbar-CHlkZrpl.mjs → ListToolbar-DuazvsAu.mjs} +61 -61
  12. package/dist/client/{ListToolbar-CHlkZrpl.mjs.map → ListToolbar-DuazvsAu.mjs.map} +1 -1
  13. package/dist/client/{RouteError-BwgDIwJE.mjs → RouteError-Cyto623-.mjs} +2 -2
  14. package/dist/client/{RouteError-BwgDIwJE.mjs.map → RouteError-Cyto623-.mjs.map} +1 -1
  15. package/dist/client/{_auth-CsliQdkJ.mjs → _auth-CJj1Cnbm.mjs} +1 -1
  16. package/dist/client/{_auth-CsliQdkJ.mjs.map → _auth-CJj1Cnbm.mjs.map} +1 -1
  17. package/dist/client/_flavorId-B-1fYadl.mjs +188 -0
  18. package/dist/client/_flavorId-B-1fYadl.mjs.map +1 -0
  19. package/dist/client/{_flavorId-D_A53VYa.mjs → _flavorId-BYfIHIV_.mjs} +20 -10
  20. package/dist/client/_flavorId-BYfIHIV_.mjs.map +1 -0
  21. package/dist/client/_floatingIpId-FQ5P2qMV.mjs +228 -0
  22. package/dist/client/_floatingIpId-FQ5P2qMV.mjs.map +1 -0
  23. package/dist/client/{_floatingIpId-BGgftRBQ.mjs → _floatingIpId-IrnN-ozB.mjs} +13 -3
  24. package/dist/client/_floatingIpId-IrnN-ozB.mjs.map +1 -0
  25. package/dist/client/_imageId-Tx_9bqEc.mjs +527 -0
  26. package/dist/client/_imageId-Tx_9bqEc.mjs.map +1 -0
  27. package/dist/client/{_pcaId-DBgz5V_9.mjs → _pcaId-DWHfvMhT.mjs} +16 -3
  28. package/dist/client/_pcaId-DWHfvMhT.mjs.map +1 -0
  29. package/dist/client/{_pcaId-C7Lrv1H_.mjs → _pcaId-r2BTjN9y.mjs} +81 -81
  30. package/dist/client/_pcaId-r2BTjN9y.mjs.map +1 -0
  31. package/dist/client/{_projectId-INhedXor.mjs → _projectId-B1VjDd0Z.mjs} +3 -3
  32. package/dist/client/{_projectId-INhedXor.mjs.map → _projectId-B1VjDd0Z.mjs.map} +1 -1
  33. package/dist/client/_projectId-Bs4W9hos.mjs +283 -0
  34. package/dist/client/_projectId-Bs4W9hos.mjs.map +1 -0
  35. package/dist/client/{_projectId-C-E4NNgo.mjs → _projectId-PSpuCKO7.mjs} +9 -9
  36. package/dist/client/{_projectId-C-E4NNgo.mjs.map → _projectId-PSpuCKO7.mjs.map} +1 -1
  37. package/dist/client/{_projectId-B9fln31N.mjs → _projectId-Pxp-RXK4.mjs} +2 -2
  38. package/dist/client/{_projectId-B9fln31N.mjs.map → _projectId-Pxp-RXK4.mjs.map} +1 -1
  39. package/dist/client/{_securityGroupId-DQoRQ-yA.mjs → _securityGroupId-Dqi6ddw4.mjs} +499 -499
  40. package/dist/client/_securityGroupId-Dqi6ddw4.mjs.map +1 -0
  41. package/dist/client/{_securityGroupId-ihjy8Lcd.mjs → _securityGroupId-VV2lUcGQ.mjs} +16 -3
  42. package/dist/client/_securityGroupId-VV2lUcGQ.mjs.map +1 -0
  43. package/dist/client/{about-oT6ccz8T.mjs → about-B2AzqxFI.mjs} +8 -8
  44. package/dist/client/{about-oT6ccz8T.mjs.map → about-B2AzqxFI.mjs.map} +1 -1
  45. package/dist/client/{aurora-D_NPTbo-.mjs → aurora-CRcxVUCo.mjs} +1 -1
  46. package/dist/client/{aurora-D_NPTbo-.mjs.map → aurora-CRcxVUCo.mjs.map} +1 -1
  47. package/dist/client/{build-eu9eg0zF.mjs → build-Cf7iWbpH.mjs} +2727 -2646
  48. package/dist/client/build-Cf7iWbpH.mjs.map +1 -0
  49. package/dist/client/{buildFilterParams-BDOIRDeD.mjs → buildFilterParams-ngVK3ybs.mjs} +1 -1
  50. package/dist/client/{buildFilterParams-BDOIRDeD.mjs.map → buildFilterParams-ngVK3ybs.mjs.map} +1 -1
  51. package/dist/client/{constants-ByHCdNsI.mjs → constants-CCgR6fKI.mjs} +15 -15
  52. package/dist/client/{constants-ByHCdNsI.mjs.map → constants-CCgR6fKI.mjs.map} +1 -1
  53. package/dist/client/{containers-rn_ntCJu.mjs → containers-BWERuY0O.mjs} +978 -976
  54. package/dist/client/containers-BWERuY0O.mjs.map +1 -0
  55. package/dist/client/{containers-Dx7TYruP.mjs → containers-Cs5vOeR2.mjs} +1 -1
  56. package/dist/client/{containers-Dx7TYruP.mjs.map → containers-Cs5vOeR2.mjs.map} +1 -1
  57. package/dist/client/{containers-B_ozmVlx.mjs → containers-DovytjVP.mjs} +6 -3
  58. package/dist/client/containers-DovytjVP.mjs.map +1 -0
  59. package/dist/client/{flavors-DRZb9LJP.mjs → flavors-BXPYAFyQ.mjs} +1 -1
  60. package/dist/client/flavors-BXPYAFyQ.mjs.map +1 -0
  61. package/dist/client/{flavors-CT4auvLO.mjs → flavors-Bovz-I2U.mjs} +137 -137
  62. package/dist/client/flavors-Bovz-I2U.mjs.map +1 -0
  63. package/dist/client/flavors-CUiALHcB.mjs +16 -0
  64. package/dist/client/flavors-CUiALHcB.mjs.map +1 -0
  65. package/dist/client/floatingips-BrjDiY2t.mjs +435 -0
  66. package/dist/client/floatingips-BrjDiY2t.mjs.map +1 -0
  67. package/dist/client/{formatBytes-GYujK0dP.mjs → formatBytes-D6oa0wU9.mjs} +1 -1
  68. package/dist/client/{formatBytes-GYujK0dP.mjs.map → formatBytes-D6oa0wU9.mjs.map} +1 -1
  69. package/dist/client/{hooks-s-I8vWww.mjs → hooks-D0krAKvo.mjs} +1 -1
  70. package/dist/client/images-BZP3pBqj.mjs +16 -0
  71. package/dist/client/images-BZP3pBqj.mjs.map +1 -0
  72. package/dist/client/{images-DRTfx8k2.mjs → images-DM9I8G0p.mjs} +1 -1
  73. package/dist/client/images-DM9I8G0p.mjs.map +1 -0
  74. package/dist/client/{images-BTqRflJv2.mjs → images-DaaCUXMI.mjs} +413 -410
  75. package/dist/client/images-DaaCUXMI.mjs.map +1 -0
  76. package/dist/client/index.js +494 -414
  77. package/dist/client/index.js.map +1 -1
  78. package/dist/client/{md-CI9FmfYv.mjs → md-BivyCkGC.mjs} +1 -1
  79. package/dist/client/{md-CI9FmfYv.mjs.map → md-BivyCkGC.mjs.map} +1 -1
  80. package/dist/client/{network-DFVVVNS5.mjs → network-SCVadZsv.mjs} +1 -1
  81. package/dist/client/{network-DFVVVNS5.mjs.map → network-SCVadZsv.mjs.map} +1 -1
  82. package/dist/client/{objects-DkDKVSmQ.mjs → objects-B4yrYf_a.mjs} +1 -1
  83. package/dist/client/objects-B4yrYf_a.mjs.map +1 -0
  84. package/dist/client/objects-Cw4Vu01M.mjs +4760 -0
  85. package/dist/client/objects-Cw4Vu01M.mjs.map +1 -0
  86. package/dist/client/{objects-r_Vl31oj.mjs → objects-D4zBka5e.mjs} +9 -3
  87. package/dist/client/objects-D4zBka5e.mjs.map +1 -0
  88. package/dist/client/overview-2J54-loz.mjs +15 -0
  89. package/dist/client/overview-2J54-loz.mjs.map +1 -0
  90. package/dist/client/{overview-B7pXx6bt.mjs → overview-BnmukbFh.mjs} +5 -5
  91. package/dist/client/overview-BnmukbFh.mjs.map +1 -0
  92. package/dist/client/overview-BtIXpYBo.mjs +15 -0
  93. package/dist/client/overview-BtIXpYBo.mjs.map +1 -0
  94. package/dist/client/overview-D0AAvsmL.mjs +15 -0
  95. package/dist/client/overview-D0AAvsmL.mjs.map +1 -0
  96. package/dist/client/pca-BqZycwCu.mjs +16 -0
  97. package/dist/client/pca-BqZycwCu.mjs.map +1 -0
  98. package/dist/client/pca-V2aaOxZA.mjs +167 -0
  99. package/dist/client/pca-V2aaOxZA.mjs.map +1 -0
  100. package/dist/client/{projects-_Dfn6eQT.mjs → projects-0feOw_b6.mjs} +2 -2
  101. package/dist/client/{projects-_Dfn6eQT.mjs.map → projects-0feOw_b6.mjs.map} +1 -1
  102. package/dist/client/{projects-MbS1USl2.mjs → projects-BsN4bvU2.mjs} +1 -1
  103. package/dist/client/{projects-MbS1USl2.mjs.map → projects-BsN4bvU2.mjs.map} +1 -1
  104. package/dist/client/{projects-BuN69cxO.mjs → projects-C1IYOvFQ.mjs} +29 -29
  105. package/dist/client/{projects-BuN69cxO.mjs.map → projects-C1IYOvFQ.mjs.map} +1 -1
  106. package/dist/client/{projects-D1pP0XdA.mjs → projects-jyIHL6DE.mjs} +2 -2
  107. package/dist/client/{projects-D1pP0XdA.mjs.map → projects-jyIHL6DE.mjs.map} +1 -1
  108. package/dist/client/securitygroups-B4MkSBtI.mjs +441 -0
  109. package/dist/client/securitygroups-B4MkSBtI.mjs.map +1 -0
  110. package/dist/client/{useListWithFiltering-mMX_EfyI.mjs → useListWithFiltering-CEDh1LO-.mjs} +1 -1
  111. package/dist/client/{useListWithFiltering-mMX_EfyI.mjs.map → useListWithFiltering-CEDh1LO-.mjs.map} +1 -1
  112. package/dist/client/{useModal-Dg4CBeqL.mjs → useModal-DxxlilRm.mjs} +1 -1
  113. package/dist/client/{useModal-Dg4CBeqL.mjs.map → useModal-DxxlilRm.mjs.map} +1 -1
  114. package/dist/client/{useProjectId-BWaeJZOy.mjs → useProjectId-CgOTejka.mjs} +1 -1
  115. package/dist/client/{useProjectId-BWaeJZOy.mjs.map → useProjectId-CgOTejka.mjs.map} +1 -1
  116. package/package.json +8 -7
  117. package/permission_policies/compute.yaml +975 -0
  118. package/permission_policies/image.yaml +71 -0
  119. package/dist/client/_flavorId-D_A53VYa.mjs.map +0 -1
  120. package/dist/client/_flavorId-DbhYLFxY.mjs +0 -190
  121. package/dist/client/_flavorId-DbhYLFxY.mjs.map +0 -1
  122. package/dist/client/_floatingIpId-BGgftRBQ.mjs.map +0 -1
  123. package/dist/client/_floatingIpId-D5myuLFz.mjs +0 -228
  124. package/dist/client/_floatingIpId-D5myuLFz.mjs.map +0 -1
  125. package/dist/client/_imageId-BoHX155h.mjs +0 -27
  126. package/dist/client/_imageId-BoHX155h.mjs.map +0 -1
  127. package/dist/client/_imageId-CTa0c3Av.mjs +0 -530
  128. package/dist/client/_imageId-CTa0c3Av.mjs.map +0 -1
  129. package/dist/client/_pcaId-C7Lrv1H_.mjs.map +0 -1
  130. package/dist/client/_pcaId-DBgz5V_9.mjs.map +0 -1
  131. package/dist/client/_projectId-Be1Erj68.mjs +0 -300
  132. package/dist/client/_projectId-Be1Erj68.mjs.map +0 -1
  133. package/dist/client/_securityGroupId-DQoRQ-yA.mjs.map +0 -1
  134. package/dist/client/_securityGroupId-ihjy8Lcd.mjs.map +0 -1
  135. package/dist/client/build-eu9eg0zF.mjs.map +0 -1
  136. package/dist/client/containers-B_ozmVlx.mjs.map +0 -1
  137. package/dist/client/containers-rn_ntCJu.mjs.map +0 -1
  138. package/dist/client/flavors-CT4auvLO.mjs.map +0 -1
  139. package/dist/client/flavors-DRZb9LJP.mjs.map +0 -1
  140. package/dist/client/flavors-DtgMd0Ii.mjs +0 -12
  141. package/dist/client/flavors-DtgMd0Ii.mjs.map +0 -1
  142. package/dist/client/floatingips-DG5cFJSZ.mjs +0 -12
  143. package/dist/client/floatingips-DG5cFJSZ.mjs.map +0 -1
  144. package/dist/client/floatingips-iCMR0ZiL.mjs +0 -436
  145. package/dist/client/floatingips-iCMR0ZiL.mjs.map +0 -1
  146. package/dist/client/images-BTqRflJv2.mjs.map +0 -1
  147. package/dist/client/images-DRTfx8k2.mjs.map +0 -1
  148. package/dist/client/images-xBfsjxkX.mjs +0 -12
  149. package/dist/client/images-xBfsjxkX.mjs.map +0 -1
  150. package/dist/client/objects-CKk6cST_.mjs +0 -4762
  151. package/dist/client/objects-CKk6cST_.mjs.map +0 -1
  152. package/dist/client/objects-DkDKVSmQ.mjs.map +0 -1
  153. package/dist/client/objects-r_Vl31oj.mjs.map +0 -1
  154. package/dist/client/overview-B7pXx6bt.mjs.map +0 -1
  155. package/dist/client/overview-CKGLIu6W.mjs +0 -12
  156. package/dist/client/overview-CKGLIu6W.mjs.map +0 -1
  157. package/dist/client/overview-Ca8r3SAz.mjs +0 -16
  158. package/dist/client/overview-Ca8r3SAz.mjs.map +0 -1
  159. package/dist/client/overview-DkPM0Od5.mjs +0 -12
  160. package/dist/client/overview-DkPM0Od5.mjs.map +0 -1
  161. package/dist/client/overview-Dxm7Ef3X.mjs +0 -12
  162. package/dist/client/overview-Dxm7Ef3X.mjs.map +0 -1
  163. package/dist/client/overview-ag4Envez.mjs +0 -16
  164. package/dist/client/overview-ag4Envez.mjs.map +0 -1
  165. package/dist/client/pca-BGv7Mprl.mjs +0 -12
  166. package/dist/client/pca-BGv7Mprl.mjs.map +0 -1
  167. package/dist/client/pca-DpULpMu5.mjs +0 -167
  168. package/dist/client/pca-DpULpMu5.mjs.map +0 -1
  169. package/dist/client/securitygroups-DURjFfYK.mjs +0 -12
  170. package/dist/client/securitygroups-DURjFfYK.mjs.map +0 -1
  171. package/dist/client/securitygroups-KC2qvmH8.mjs +0 -442
  172. package/dist/client/securitygroups-KC2qvmH8.mjs.map +0 -1
@@ -1,24 +1,24 @@
1
- import { C as e, H as t, S as n, X as r, at as i, f as a, h as o, l as s, m as c, q as l, r as u } from "./build-eu9eg0zF.mjs";
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";
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: e, onDelete: t, onClear: n }) => {
7
- let { i18n: r, _: i } = y();
8
- return /* @__PURE__ */ p(l, {
6
+ var b = ({ selectedFilters: n, onDelete: r, onClear: i }) => {
7
+ let { i18n: a, _: o } = y();
8
+ return /* @__PURE__ */ p(e, {
9
9
  gap: "2",
10
10
  wrap: !0,
11
11
  alignment: "start",
12
12
  distribution: "start",
13
- children: [e.map((e) => /* @__PURE__ */ f(o, {
13
+ children: [n.map((e) => /* @__PURE__ */ f(t, {
14
14
  closeable: !0,
15
15
  pillKey: e.name,
16
16
  pillValue: e.value,
17
- onClose: () => t(e)
18
- }, `${e.name}:${e.value}`)), e.length > 1 && /* @__PURE__ */ f(o, {
19
- pillValue: r._({ id: "yYxB17" }),
17
+ onClose: () => r(e)
18
+ }, `${e.name}:${e.value}`)), n.length > 1 && /* @__PURE__ */ f(t, {
19
+ pillValue: a._({ id: "yYxB17" }),
20
20
  className: "ml-2",
21
- onClick: n
21
+ onClick: i
22
22
  })]
23
23
  });
24
24
  };
@@ -27,9 +27,9 @@ var b = ({ selectedFilters: e, onDelete: t, onClear: n }) => {
27
27
  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
- var S = ({ filters: r, onChange: i }) => {
31
- let { i18n: o, _: c } = y(), [l, u] = _(""), [d, h] = _(""), g = r.find((e) => e.filterName === l)?.values?.filter((e) => e), v = m((e) => {
32
- h(e), !x(l) && !x(e) && i({
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) => {
32
+ h(e), !x(l) && !x(e) && t({
33
33
  name: l,
34
34
  value: e
35
35
  }), setTimeout(() => {
@@ -38,12 +38,12 @@ var S = ({ filters: r, onChange: i }) => {
38
38
  }, [
39
39
  l,
40
40
  h,
41
- i
41
+ t
42
42
  ]), b = () => ({
43
43
  className: "w-full sm:flex-1 sm:min-w-0",
44
44
  name: "filter",
45
45
  "data-testid": "select-filterValue",
46
- label: o._({ id: "0cVgUw" }),
46
+ label: s._({ id: "0cVgUw" }),
47
47
  value: l,
48
48
  onChange: (e) => {
49
49
  u(String(e));
@@ -56,16 +56,16 @@ var S = ({ filters: r, onChange: i }) => {
56
56
  disabled: !l,
57
57
  onChange: v
58
58
  });
59
- return /* @__PURE__ */ p(s, {
59
+ return /* @__PURE__ */ p(n, {
60
60
  className: "flex w-full flex-col sm:w-auto sm:flex-row sm:items-end",
61
- children: [/* @__PURE__ */ f(n, {
61
+ children: [/* @__PURE__ */ f(i, {
62
62
  ...b(),
63
- children: r?.map(({ displayName: e, filterName: n }) => /* @__PURE__ */ f(t, {
64
- value: n,
63
+ children: e?.map(({ displayName: e, filterName: t }) => /* @__PURE__ */ f(r, {
64
+ value: t,
65
65
  label: e,
66
- "data-testid": n
67
- }, n))
68
- }), /* @__PURE__ */ f(e, {
66
+ "data-testid": t
67
+ }, t))
68
+ }), /* @__PURE__ */ f(o, {
69
69
  ...S(),
70
70
  children: g?.map((e) => /* @__PURE__ */ f(a, {
71
71
  value: e,
@@ -74,46 +74,46 @@ var S = ({ filters: r, onChange: i }) => {
74
74
  }, e))
75
75
  })]
76
76
  });
77
- }, C = ({ sortBy: e, onSortByChange: i, sortDirection: a, onSortDirectionChange: o, options: c }) => {
78
- let { i18n: l, _: u } = y(), d = () => ({
77
+ }, C = ({ sortBy: e, onSortByChange: t, sortDirection: a, onSortDirectionChange: o, options: s }) => {
78
+ let { i18n: c, _: u } = y(), d = () => ({
79
79
  className: "flex-grow",
80
- onChange: i,
80
+ onChange: t,
81
81
  value: e,
82
82
  "data-testid": "sort-select",
83
- label: l._({ id: "/HgF9q" })
83
+ label: c._({ id: "/HgF9q" })
84
84
  }), m = () => ({
85
85
  "data-testid": "direction-toggle",
86
86
  order: a,
87
87
  onChange: o
88
88
  });
89
- return /* @__PURE__ */ p(s, {
89
+ return /* @__PURE__ */ p(n, {
90
90
  className: "flex w-full items-end sm:w-auto",
91
- children: [/* @__PURE__ */ f(n, {
91
+ children: [/* @__PURE__ */ f(i, {
92
92
  ...d(),
93
- children: c.map((e) => /* @__PURE__ */ f(t, {
93
+ children: s.map((e) => /* @__PURE__ */ f(r, {
94
94
  value: e.value,
95
95
  children: e.label
96
96
  }, e.value))
97
- }), /* @__PURE__ */ f(r, {
97
+ }), /* @__PURE__ */ f(l, {
98
98
  ...m(),
99
99
  className: "shadow-none"
100
100
  })]
101
101
  });
102
- }, w = ({ filterSettings: e, onFilter: t, sortSettings: n, onSort: r, searchTerm: a, onSearch: o, searchInputProps: s = {}, actions: _, tabs: x, totalCount: w, filteredCount: T, itemName: E = "items", lastUpdated: D }) => {
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 }) => {
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((n) => {
108
- !t || !e || t({
109
- ...e,
110
- selectedFilters: e.selectedFilters?.filter((e) => !(e.name === n.name && e.value === n.value))
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))
111
111
  });
112
- }, [e, t]), P = (n) => {
113
- if (!t || !e || e.selectedFilters?.some((e) => e.name === n.name && e.value === n.value)) return;
114
- let r = e.filters.find((e) => n.name === e.filterName)?.supportsMultiValue ? [...e.selectedFilters || [], n] : [...(e.selectedFilters || []).filter((e) => e.name !== n.name), n];
115
- t({
116
- ...e,
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];
115
+ n({
116
+ ...t,
117
117
  selectedFilters: r
118
118
  });
119
119
  }, F = m((e) => {
@@ -124,20 +124,20 @@ var S = ({ filters: r, onChange: i }) => {
124
124
  A.current && clearTimeout(A.current), A.current = window.setTimeout(() => o?.(t), 500);
125
125
  }, [o]), L = m(() => {
126
126
  A.current && clearTimeout(A.current), o?.("");
127
- }, [o]), R = e && t ? {
128
- filters: e.filters,
127
+ }, [o]), R = t && n ? {
128
+ filters: t.filters,
129
129
  onChange: P
130
- } : null, z = n && r ? {
131
- options: n.options,
132
- sortBy: n.sortBy,
133
- sortDirection: n.sortDirection || "asc",
134
- onSortByChange: (e) => r({
135
- ...n,
130
+ } : null, z = r && i ? {
131
+ options: r.options,
132
+ sortBy: r.sortBy,
133
+ sortDirection: r.sortDirection || "asc",
134
+ onSortByChange: (e) => i({
135
+ ...r,
136
136
  sortBy: e,
137
- sortDirection: n.sortDirection || "asc"
137
+ sortDirection: r.sortDirection || "asc"
138
138
  }),
139
- onSortDirectionChange: (e) => r({
140
- ...n,
139
+ onSortDirectionChange: (e) => i({
140
+ ...r,
141
141
  sortDirection: e
142
142
  })
143
143
  } : null, B = o ? {
@@ -147,24 +147,24 @@ var S = ({ filters: r, onChange: i }) => {
147
147
  onInput: I,
148
148
  onClear: L,
149
149
  onSearch: F,
150
- ...s
150
+ ...l
151
151
  } : null;
152
152
  return /* @__PURE__ */ p(d, { children: [x && /* @__PURE__ */ f("div", {
153
153
  className: "w-full",
154
- children: /* @__PURE__ */ f(u, {
154
+ children: /* @__PURE__ */ f(c, {
155
155
  activeItem: x.activeItem,
156
156
  onActiveItemChange: x.onActiveItemChange,
157
- children: x.items.map((e) => /* @__PURE__ */ f(c, {
157
+ children: x.items.map((e) => /* @__PURE__ */ f(u, {
158
158
  label: e.label,
159
159
  value: e.value
160
160
  }, e.value))
161
161
  })
162
- }), /* @__PURE__ */ p(l, {
162
+ }), /* @__PURE__ */ p(e, {
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(l, {
167
+ _ && /* @__PURE__ */ f(e, {
168
168
  direction: "horizontal",
169
169
  className: "w-full justify-end",
170
170
  children: _
@@ -182,17 +182,17 @@ var S = ({ filters: r, onChange: i }) => {
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(i, { ...B })
185
+ children: /* @__PURE__ */ f(s, { ...B })
186
186
  })
187
187
  ]
188
188
  }),
189
- e?.selectedFilters && e.selectedFilters.length > 0 && t && /* @__PURE__ */ f("div", {
189
+ t?.selectedFilters && t.selectedFilters.length > 0 && n && /* @__PURE__ */ f("div", {
190
190
  className: "w-full",
191
191
  children: /* @__PURE__ */ f(b, {
192
- selectedFilters: e.selectedFilters,
192
+ selectedFilters: t.selectedFilters,
193
193
  onDelete: N,
194
- onClear: () => t({
195
- ...e,
194
+ onClear: () => n({
195
+ ...t,
196
196
  selectedFilters: []
197
197
  })
198
198
  })
@@ -220,4 +220,4 @@ var S = ({ filters: r, onChange: i }) => {
220
220
  //#endregion
221
221
  export { w as t };
222
222
 
223
- //# sourceMappingURL=ListToolbar-CHlkZrpl.mjs.map
223
+ //# sourceMappingURL=ListToolbar-DuazvsAu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListToolbar-CHlkZrpl.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-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,4 +1,4 @@
1
- import { w as e } from "./build-eu9eg0zF.mjs";
1
+ import { O as e } from "./build-Cf7iWbpH.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-BwgDIwJE.mjs.map
25
+ //# sourceMappingURL=RouteError-Cyto623-.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RouteError-BwgDIwJE.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-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"}
@@ -8,4 +8,4 @@ function r() {
8
8
  //#endregion
9
9
  export { r as component };
10
10
 
11
- //# sourceMappingURL=_auth-CsliQdkJ.mjs.map
11
+ //# sourceMappingURL=_auth-CJj1Cnbm.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_auth-CsliQdkJ.mjs","names":["Outlet","useAuth","RouteComponent","component"],"sources":["../../src/client/routes/_auth.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Outlet, redirect } from \"@tanstack/react-router\"\nimport { useAuth } from \"../store/AuthProvider\"\n\nexport const Route = createFileRoute(\"/_auth\")({\n component: RouteComponent,\n beforeLoad: async ({ context, location }) => {\n if (!context.auth?.isAuthenticated) {\n const token = await context.trpcClient?.auth.getCurrentUserSession.query()\n if (!token) {\n const redirectPath = location.pathname ? location.pathname : \"\"\n\n throw redirect({\n to: \"/\",\n search: { redirect: redirectPath },\n })\n }\n context.auth?.login(token.user, token.expires_at)\n }\n },\n})\n\nfunction RouteComponent() {\n useAuth()\n\n return <Outlet />\n}\n"],"mappings":";;;;AAqBA,SAASE,IAAAA;AAGP,QAFAD,GAAAA,EAEO,kBAAC,GAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"_auth-CJj1Cnbm.mjs","names":["Outlet","useAuth","RouteComponent","component"],"sources":["../../src/client/routes/_auth.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Outlet, redirect } from \"@tanstack/react-router\"\nimport { useAuth } from \"../store/AuthProvider\"\n\nexport const Route = createFileRoute(\"/_auth\")({\n component: RouteComponent,\n beforeLoad: async ({ context, location }) => {\n if (!context.auth?.isAuthenticated) {\n const token = await context.trpcClient?.auth.getCurrentUserSession.query()\n if (!token) {\n const redirectPath = location.pathname ? location.pathname : \"\"\n\n throw redirect({\n to: \"/\",\n search: { redirect: redirectPath },\n })\n }\n context.auth?.login(token.user, token.expires_at)\n }\n },\n})\n\nfunction RouteComponent() {\n useAuth()\n\n return <Outlet />\n}\n"],"mappings":";;;;AAqBA,SAASE,IAAAA;AAGP,QAFAD,GAAAA,EAEO,kBAAC,GAAA,EAAA,CAAA"}
@@ -0,0 +1,188 @@
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";
2
+ import { r as f } from "./trpcClient-BxguzNYF.mjs";
3
+ import { n as p, t as m } from "./_flavorId-BYfIHIV_.mjs";
4
+ import { t as h } from "./useErrorTranslation-TZVwIAzq.mjs";
5
+ import { n as g, r as _, t as v } from "./DeleteFlavorModal-rmuYIafD.mjs";
6
+ import { t as y } from "./useModal-DxxlilRm.mjs";
7
+ import { t as b } from "./ContentHeader-DtBiIwRY.mjs";
8
+ import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
9
+ import w from "react";
10
+ import { useNavigate as T, useParams as E } from "@tanstack/react-router";
11
+ import { Trans as D, useLingui as O } from "@lingui/react";
12
+ //#region src/client/routes/_auth/projects/$projectId/compute/flavors/-components/FlavorDetailsView.tsx
13
+ function k({ flavor: n }) {
14
+ let r = (e, t = "MB") => e === 0 ? `0 ${t}` : `${e} ${t}`;
15
+ return /* @__PURE__ */ C(e, {
16
+ direction: "vertical",
17
+ gap: "6",
18
+ className: "mt-6",
19
+ children: [
20
+ /* @__PURE__ */ C(e, {
21
+ direction: "vertical",
22
+ gap: "2",
23
+ children: [/* @__PURE__ */ S(i, { children: /* @__PURE__ */ S(D, { id: "jIPNJG" }) }), /* @__PURE__ */ C(t, {
24
+ alignTerms: "right",
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" }) })
36
+ ]
37
+ })]
38
+ }),
39
+ /* @__PURE__ */ C(e, {
40
+ direction: "vertical",
41
+ gap: "2",
42
+ children: [/* @__PURE__ */ S(i, { children: /* @__PURE__ */ S(D, { id: "qQ1QBh" }) }), /* @__PURE__ */ C(t, {
43
+ alignTerms: "right",
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 })
57
+ ]
58
+ })]
59
+ }),
60
+ n.extra_specs && Object.keys(n.extra_specs).length > 0 && /* @__PURE__ */ C(e, {
61
+ direction: "vertical",
62
+ gap: "2",
63
+ children: [/* @__PURE__ */ S(i, { children: /* @__PURE__ */ S(D, { id: "DKkOPx" }) }), /* @__PURE__ */ S(t, {
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))
66
+ })]
67
+ })
68
+ ]
69
+ });
70
+ }
71
+ //#endregion
72
+ //#region src/client/routes/_auth/projects/$projectId/compute/flavors/$flavorId.tsx?tsr-split=component
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({
75
+ project_id: t,
76
+ flavorId: i
77
+ }), { data: L } = f.compute.canUser.useQuery({
78
+ project_id: t,
79
+ permission: [
80
+ "flavors:delete",
81
+ "flavors:list_projects",
82
+ "flavor_specs:create",
83
+ "flavor_specs:delete"
84
+ ]
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({
87
+ to: "/projects/$projectId/compute/flavors",
88
+ params: { projectId: t }
89
+ });
90
+ }, J = () => {
91
+ u({
92
+ to: "/projects/$projectId/compute/overview",
93
+ params: { projectId: t }
94
+ });
95
+ }, Y = () => {
96
+ I();
97
+ };
98
+ if (P === "pending") return /* @__PURE__ */ C(e, {
99
+ className: "fixed inset-0",
100
+ distribution: "center",
101
+ alignment: "center",
102
+ direction: "vertical",
103
+ children: [/* @__PURE__ */ S(r, {
104
+ variant: "primary",
105
+ size: "large",
106
+ className: "mb-2"
107
+ }), /* @__PURE__ */ S(D, { id: "YNgcgc" })]
108
+ });
109
+ if (P === "error") {
110
+ let e = F?.message || "UNKNOWN_ERROR", t = j(e), n = M(e);
111
+ return /* @__PURE__ */ S(p, {
112
+ message: t,
113
+ statusCode: ((e) => {
114
+ if (e.includes("UNAUTHORIZED")) return 401;
115
+ if (e.includes("FORBIDDEN")) return 403;
116
+ if (e.includes("NOT_FOUND")) return 404;
117
+ if (e.includes("SERVER_ERROR")) return 500;
118
+ })(e),
119
+ title: w._({ id: "FjONW3" }),
120
+ onBackClick: q,
121
+ onHomeClick: J,
122
+ reset: n ? Y : void 0
123
+ });
124
+ }
125
+ if (!N) return /* @__PURE__ */ S(p, {
126
+ message: w._({ id: "y0u86k" }),
127
+ statusCode: 404,
128
+ title: w._({ id: "bpme7e" }),
129
+ onBackClick: q,
130
+ onHomeClick: J
131
+ });
132
+ let X = z || R, Z = X || B ? /* @__PURE__ */ C(l, { children: [X && /* @__PURE__ */ C(c, { children: [/* @__PURE__ */ S(n, {
133
+ as: "div",
134
+ children: /* @__PURE__ */ S(d, {
135
+ icon: "moreVert",
136
+ children: /* @__PURE__ */ S(D, { id: "PgNNGl" })
137
+ })
138
+ }), /* @__PURE__ */ C(o, { children: [z && /* @__PURE__ */ S(s, {
139
+ label: w._({ id: "cWbW6w" }),
140
+ onClick: W
141
+ }), R && /* @__PURE__ */ S(s, {
142
+ label: w._({ id: "JT3I1g" }),
143
+ onClick: K
144
+ })] })] }), B && /* @__PURE__ */ S(d, {
145
+ onClick: H,
146
+ variant: "primary",
147
+ children: /* @__PURE__ */ S(D, { id: "6GBt0m" })
148
+ })] }) : void 0;
149
+ return /* @__PURE__ */ C(x, { children: [
150
+ /* @__PURE__ */ S(b, {
151
+ title: N.name,
152
+ projectId: t,
153
+ actions: Z
154
+ }),
155
+ /* @__PURE__ */ S(e, {
156
+ direction: "vertical",
157
+ children: /* @__PURE__ */ S(k, { flavor: N })
158
+ }),
159
+ a && /* @__PURE__ */ C(x, { children: [
160
+ V && /* @__PURE__ */ S(_, {
161
+ client: a,
162
+ isOpen: V,
163
+ onClose: H,
164
+ project: t,
165
+ flavor: N
166
+ }),
167
+ U && /* @__PURE__ */ S(g, {
168
+ client: a,
169
+ isOpen: U,
170
+ onClose: W,
171
+ project: t,
172
+ flavor: N
173
+ }),
174
+ G && /* @__PURE__ */ S(v, {
175
+ client: a,
176
+ isOpen: G,
177
+ onClose: K,
178
+ project: t,
179
+ flavor: N,
180
+ onSuccess: q
181
+ })
182
+ ] })
183
+ ] });
184
+ }
185
+ //#endregion
186
+ export { A as component };
187
+
188
+ //# sourceMappingURL=_flavorId-B-1fYadl.mjs.map