@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.
- package/dist/client/{ContentHeader-H8KGY3Wd.mjs → ContentHeader-DtBiIwRY.mjs} +15 -15
- package/dist/client/{ContentHeader-H8KGY3Wd.mjs.map → ContentHeader-DtBiIwRY.mjs.map} +1 -1
- package/dist/client/{DeleteFlavorModal-B98oiHWx.mjs → DeleteFlavorModal-rmuYIafD.mjs} +142 -142
- package/dist/client/{DeleteFlavorModal-B98oiHWx.mjs.map → DeleteFlavorModal-rmuYIafD.mjs.map} +1 -1
- package/dist/client/{EditSecurityGroupModal-wQVNIVg1.mjs → EditSecurityGroupModal-B7Sz9puM.mjs} +15 -15
- package/dist/client/{EditSecurityGroupModal-wQVNIVg1.mjs.map → EditSecurityGroupModal-B7Sz9puM.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-qu1NMI5a.mjs → FloatingIpActionModals-CfRJiZqD.mjs} +59 -59
- package/dist/client/{FloatingIpActionModals-qu1NMI5a.mjs.map → FloatingIpActionModals-CfRJiZqD.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-wsQDNEh7.mjs → ImageToastNotifications-Cw30RXsw.mjs} +374 -374
- package/dist/client/{ImageToastNotifications-wsQDNEh7.mjs.map → ImageToastNotifications-Cw30RXsw.mjs.map} +1 -1
- package/dist/client/{ListToolbar-CHlkZrpl.mjs → ListToolbar-DuazvsAu.mjs} +61 -61
- package/dist/client/{ListToolbar-CHlkZrpl.mjs.map → ListToolbar-DuazvsAu.mjs.map} +1 -1
- package/dist/client/{RouteError-BwgDIwJE.mjs → RouteError-Cyto623-.mjs} +2 -2
- package/dist/client/{RouteError-BwgDIwJE.mjs.map → RouteError-Cyto623-.mjs.map} +1 -1
- package/dist/client/{_auth-CsliQdkJ.mjs → _auth-CJj1Cnbm.mjs} +1 -1
- package/dist/client/{_auth-CsliQdkJ.mjs.map → _auth-CJj1Cnbm.mjs.map} +1 -1
- package/dist/client/_flavorId-B-1fYadl.mjs +188 -0
- package/dist/client/_flavorId-B-1fYadl.mjs.map +1 -0
- package/dist/client/{_flavorId-D_A53VYa.mjs → _flavorId-BYfIHIV_.mjs} +20 -10
- package/dist/client/_flavorId-BYfIHIV_.mjs.map +1 -0
- package/dist/client/_floatingIpId-FQ5P2qMV.mjs +228 -0
- package/dist/client/_floatingIpId-FQ5P2qMV.mjs.map +1 -0
- package/dist/client/{_floatingIpId-BGgftRBQ.mjs → _floatingIpId-IrnN-ozB.mjs} +13 -3
- package/dist/client/_floatingIpId-IrnN-ozB.mjs.map +1 -0
- package/dist/client/_imageId-Tx_9bqEc.mjs +527 -0
- package/dist/client/_imageId-Tx_9bqEc.mjs.map +1 -0
- package/dist/client/{_pcaId-DBgz5V_9.mjs → _pcaId-DWHfvMhT.mjs} +16 -3
- package/dist/client/_pcaId-DWHfvMhT.mjs.map +1 -0
- package/dist/client/{_pcaId-C7Lrv1H_.mjs → _pcaId-r2BTjN9y.mjs} +81 -81
- package/dist/client/_pcaId-r2BTjN9y.mjs.map +1 -0
- package/dist/client/{_projectId-INhedXor.mjs → _projectId-B1VjDd0Z.mjs} +3 -3
- package/dist/client/{_projectId-INhedXor.mjs.map → _projectId-B1VjDd0Z.mjs.map} +1 -1
- package/dist/client/_projectId-Bs4W9hos.mjs +283 -0
- package/dist/client/_projectId-Bs4W9hos.mjs.map +1 -0
- package/dist/client/{_projectId-C-E4NNgo.mjs → _projectId-PSpuCKO7.mjs} +9 -9
- package/dist/client/{_projectId-C-E4NNgo.mjs.map → _projectId-PSpuCKO7.mjs.map} +1 -1
- package/dist/client/{_projectId-B9fln31N.mjs → _projectId-Pxp-RXK4.mjs} +2 -2
- package/dist/client/{_projectId-B9fln31N.mjs.map → _projectId-Pxp-RXK4.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-DQoRQ-yA.mjs → _securityGroupId-Dqi6ddw4.mjs} +499 -499
- package/dist/client/_securityGroupId-Dqi6ddw4.mjs.map +1 -0
- package/dist/client/{_securityGroupId-ihjy8Lcd.mjs → _securityGroupId-VV2lUcGQ.mjs} +16 -3
- package/dist/client/_securityGroupId-VV2lUcGQ.mjs.map +1 -0
- package/dist/client/{about-oT6ccz8T.mjs → about-B2AzqxFI.mjs} +8 -8
- package/dist/client/{about-oT6ccz8T.mjs.map → about-B2AzqxFI.mjs.map} +1 -1
- package/dist/client/{aurora-D_NPTbo-.mjs → aurora-CRcxVUCo.mjs} +1 -1
- package/dist/client/{aurora-D_NPTbo-.mjs.map → aurora-CRcxVUCo.mjs.map} +1 -1
- package/dist/client/{build-eu9eg0zF.mjs → build-Cf7iWbpH.mjs} +2727 -2646
- package/dist/client/build-Cf7iWbpH.mjs.map +1 -0
- package/dist/client/{buildFilterParams-BDOIRDeD.mjs → buildFilterParams-ngVK3ybs.mjs} +1 -1
- package/dist/client/{buildFilterParams-BDOIRDeD.mjs.map → buildFilterParams-ngVK3ybs.mjs.map} +1 -1
- package/dist/client/{constants-ByHCdNsI.mjs → constants-CCgR6fKI.mjs} +15 -15
- package/dist/client/{constants-ByHCdNsI.mjs.map → constants-CCgR6fKI.mjs.map} +1 -1
- package/dist/client/{containers-rn_ntCJu.mjs → containers-BWERuY0O.mjs} +978 -976
- package/dist/client/containers-BWERuY0O.mjs.map +1 -0
- package/dist/client/{containers-Dx7TYruP.mjs → containers-Cs5vOeR2.mjs} +1 -1
- package/dist/client/{containers-Dx7TYruP.mjs.map → containers-Cs5vOeR2.mjs.map} +1 -1
- package/dist/client/{containers-B_ozmVlx.mjs → containers-DovytjVP.mjs} +6 -3
- package/dist/client/containers-DovytjVP.mjs.map +1 -0
- package/dist/client/{flavors-DRZb9LJP.mjs → flavors-BXPYAFyQ.mjs} +1 -1
- package/dist/client/flavors-BXPYAFyQ.mjs.map +1 -0
- package/dist/client/{flavors-CT4auvLO.mjs → flavors-Bovz-I2U.mjs} +137 -137
- package/dist/client/flavors-Bovz-I2U.mjs.map +1 -0
- package/dist/client/flavors-CUiALHcB.mjs +16 -0
- package/dist/client/flavors-CUiALHcB.mjs.map +1 -0
- package/dist/client/floatingips-BrjDiY2t.mjs +435 -0
- package/dist/client/floatingips-BrjDiY2t.mjs.map +1 -0
- package/dist/client/{formatBytes-GYujK0dP.mjs → formatBytes-D6oa0wU9.mjs} +1 -1
- package/dist/client/{formatBytes-GYujK0dP.mjs.map → formatBytes-D6oa0wU9.mjs.map} +1 -1
- package/dist/client/{hooks-s-I8vWww.mjs → hooks-D0krAKvo.mjs} +1 -1
- package/dist/client/images-BZP3pBqj.mjs +16 -0
- package/dist/client/images-BZP3pBqj.mjs.map +1 -0
- package/dist/client/{images-DRTfx8k2.mjs → images-DM9I8G0p.mjs} +1 -1
- package/dist/client/images-DM9I8G0p.mjs.map +1 -0
- package/dist/client/{images-BTqRflJv2.mjs → images-DaaCUXMI.mjs} +413 -410
- package/dist/client/images-DaaCUXMI.mjs.map +1 -0
- package/dist/client/index.js +494 -414
- package/dist/client/index.js.map +1 -1
- package/dist/client/{md-CI9FmfYv.mjs → md-BivyCkGC.mjs} +1 -1
- package/dist/client/{md-CI9FmfYv.mjs.map → md-BivyCkGC.mjs.map} +1 -1
- package/dist/client/{network-DFVVVNS5.mjs → network-SCVadZsv.mjs} +1 -1
- package/dist/client/{network-DFVVVNS5.mjs.map → network-SCVadZsv.mjs.map} +1 -1
- package/dist/client/{objects-DkDKVSmQ.mjs → objects-B4yrYf_a.mjs} +1 -1
- package/dist/client/objects-B4yrYf_a.mjs.map +1 -0
- package/dist/client/objects-Cw4Vu01M.mjs +4760 -0
- package/dist/client/objects-Cw4Vu01M.mjs.map +1 -0
- package/dist/client/{objects-r_Vl31oj.mjs → objects-D4zBka5e.mjs} +9 -3
- package/dist/client/objects-D4zBka5e.mjs.map +1 -0
- package/dist/client/overview-2J54-loz.mjs +15 -0
- package/dist/client/overview-2J54-loz.mjs.map +1 -0
- package/dist/client/{overview-B7pXx6bt.mjs → overview-BnmukbFh.mjs} +5 -5
- package/dist/client/overview-BnmukbFh.mjs.map +1 -0
- package/dist/client/overview-BtIXpYBo.mjs +15 -0
- package/dist/client/overview-BtIXpYBo.mjs.map +1 -0
- package/dist/client/overview-D0AAvsmL.mjs +15 -0
- package/dist/client/overview-D0AAvsmL.mjs.map +1 -0
- package/dist/client/pca-BqZycwCu.mjs +16 -0
- package/dist/client/pca-BqZycwCu.mjs.map +1 -0
- package/dist/client/pca-V2aaOxZA.mjs +167 -0
- package/dist/client/pca-V2aaOxZA.mjs.map +1 -0
- package/dist/client/{projects-_Dfn6eQT.mjs → projects-0feOw_b6.mjs} +2 -2
- package/dist/client/{projects-_Dfn6eQT.mjs.map → projects-0feOw_b6.mjs.map} +1 -1
- package/dist/client/{projects-MbS1USl2.mjs → projects-BsN4bvU2.mjs} +1 -1
- package/dist/client/{projects-MbS1USl2.mjs.map → projects-BsN4bvU2.mjs.map} +1 -1
- package/dist/client/{projects-BuN69cxO.mjs → projects-C1IYOvFQ.mjs} +29 -29
- package/dist/client/{projects-BuN69cxO.mjs.map → projects-C1IYOvFQ.mjs.map} +1 -1
- package/dist/client/{projects-D1pP0XdA.mjs → projects-jyIHL6DE.mjs} +2 -2
- package/dist/client/{projects-D1pP0XdA.mjs.map → projects-jyIHL6DE.mjs.map} +1 -1
- package/dist/client/securitygroups-B4MkSBtI.mjs +441 -0
- package/dist/client/securitygroups-B4MkSBtI.mjs.map +1 -0
- package/dist/client/{useListWithFiltering-mMX_EfyI.mjs → useListWithFiltering-CEDh1LO-.mjs} +1 -1
- package/dist/client/{useListWithFiltering-mMX_EfyI.mjs.map → useListWithFiltering-CEDh1LO-.mjs.map} +1 -1
- package/dist/client/{useModal-Dg4CBeqL.mjs → useModal-DxxlilRm.mjs} +1 -1
- package/dist/client/{useModal-Dg4CBeqL.mjs.map → useModal-DxxlilRm.mjs.map} +1 -1
- package/dist/client/{useProjectId-BWaeJZOy.mjs → useProjectId-CgOTejka.mjs} +1 -1
- package/dist/client/{useProjectId-BWaeJZOy.mjs.map → useProjectId-CgOTejka.mjs.map} +1 -1
- package/package.json +8 -7
- package/permission_policies/compute.yaml +975 -0
- package/permission_policies/image.yaml +71 -0
- package/dist/client/_flavorId-D_A53VYa.mjs.map +0 -1
- package/dist/client/_flavorId-DbhYLFxY.mjs +0 -190
- package/dist/client/_flavorId-DbhYLFxY.mjs.map +0 -1
- package/dist/client/_floatingIpId-BGgftRBQ.mjs.map +0 -1
- package/dist/client/_floatingIpId-D5myuLFz.mjs +0 -228
- package/dist/client/_floatingIpId-D5myuLFz.mjs.map +0 -1
- package/dist/client/_imageId-BoHX155h.mjs +0 -27
- package/dist/client/_imageId-BoHX155h.mjs.map +0 -1
- package/dist/client/_imageId-CTa0c3Av.mjs +0 -530
- package/dist/client/_imageId-CTa0c3Av.mjs.map +0 -1
- package/dist/client/_pcaId-C7Lrv1H_.mjs.map +0 -1
- package/dist/client/_pcaId-DBgz5V_9.mjs.map +0 -1
- package/dist/client/_projectId-Be1Erj68.mjs +0 -300
- package/dist/client/_projectId-Be1Erj68.mjs.map +0 -1
- package/dist/client/_securityGroupId-DQoRQ-yA.mjs.map +0 -1
- package/dist/client/_securityGroupId-ihjy8Lcd.mjs.map +0 -1
- package/dist/client/build-eu9eg0zF.mjs.map +0 -1
- package/dist/client/containers-B_ozmVlx.mjs.map +0 -1
- package/dist/client/containers-rn_ntCJu.mjs.map +0 -1
- package/dist/client/flavors-CT4auvLO.mjs.map +0 -1
- package/dist/client/flavors-DRZb9LJP.mjs.map +0 -1
- package/dist/client/flavors-DtgMd0Ii.mjs +0 -12
- package/dist/client/flavors-DtgMd0Ii.mjs.map +0 -1
- package/dist/client/floatingips-DG5cFJSZ.mjs +0 -12
- package/dist/client/floatingips-DG5cFJSZ.mjs.map +0 -1
- package/dist/client/floatingips-iCMR0ZiL.mjs +0 -436
- package/dist/client/floatingips-iCMR0ZiL.mjs.map +0 -1
- package/dist/client/images-BTqRflJv2.mjs.map +0 -1
- package/dist/client/images-DRTfx8k2.mjs.map +0 -1
- package/dist/client/images-xBfsjxkX.mjs +0 -12
- package/dist/client/images-xBfsjxkX.mjs.map +0 -1
- package/dist/client/objects-CKk6cST_.mjs +0 -4762
- package/dist/client/objects-CKk6cST_.mjs.map +0 -1
- package/dist/client/objects-DkDKVSmQ.mjs.map +0 -1
- package/dist/client/objects-r_Vl31oj.mjs.map +0 -1
- package/dist/client/overview-B7pXx6bt.mjs.map +0 -1
- package/dist/client/overview-CKGLIu6W.mjs +0 -12
- package/dist/client/overview-CKGLIu6W.mjs.map +0 -1
- package/dist/client/overview-Ca8r3SAz.mjs +0 -16
- package/dist/client/overview-Ca8r3SAz.mjs.map +0 -1
- package/dist/client/overview-DkPM0Od5.mjs +0 -12
- package/dist/client/overview-DkPM0Od5.mjs.map +0 -1
- package/dist/client/overview-Dxm7Ef3X.mjs +0 -12
- package/dist/client/overview-Dxm7Ef3X.mjs.map +0 -1
- package/dist/client/overview-ag4Envez.mjs +0 -16
- package/dist/client/overview-ag4Envez.mjs.map +0 -1
- package/dist/client/pca-BGv7Mprl.mjs +0 -12
- package/dist/client/pca-BGv7Mprl.mjs.map +0 -1
- package/dist/client/pca-DpULpMu5.mjs +0 -167
- package/dist/client/pca-DpULpMu5.mjs.map +0 -1
- package/dist/client/securitygroups-DURjFfYK.mjs +0 -12
- package/dist/client/securitygroups-DURjFfYK.mjs.map +0 -1
- package/dist/client/securitygroups-KC2qvmH8.mjs +0 -442
- package/dist/client/securitygroups-KC2qvmH8.mjs.map +0 -1
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import {
|
|
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:
|
|
7
|
-
let { i18n:
|
|
8
|
-
return /* @__PURE__ */ p(
|
|
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: [
|
|
13
|
+
children: [n.map((e) => /* @__PURE__ */ f(t, {
|
|
14
14
|
closeable: !0,
|
|
15
15
|
pillKey: e.name,
|
|
16
16
|
pillValue: e.value,
|
|
17
|
-
onClose: () =>
|
|
18
|
-
}, `${e.name}:${e.value}`)),
|
|
19
|
-
pillValue:
|
|
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:
|
|
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:
|
|
31
|
-
let { i18n:
|
|
32
|
-
h(e), !x(l) && !x(e) &&
|
|
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
|
-
|
|
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:
|
|
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(
|
|
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(
|
|
61
|
+
children: [/* @__PURE__ */ f(i, {
|
|
62
62
|
...b(),
|
|
63
|
-
children:
|
|
64
|
-
value:
|
|
63
|
+
children: e?.map(({ displayName: e, filterName: t }) => /* @__PURE__ */ f(r, {
|
|
64
|
+
value: t,
|
|
65
65
|
label: e,
|
|
66
|
-
"data-testid":
|
|
67
|
-
},
|
|
68
|
-
}), /* @__PURE__ */ f(
|
|
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:
|
|
78
|
-
let { i18n:
|
|
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:
|
|
80
|
+
onChange: t,
|
|
81
81
|
value: e,
|
|
82
82
|
"data-testid": "sort-select",
|
|
83
|
-
label:
|
|
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(
|
|
89
|
+
return /* @__PURE__ */ p(n, {
|
|
90
90
|
className: "flex w-full items-end sm:w-auto",
|
|
91
|
-
children: [/* @__PURE__ */ f(
|
|
91
|
+
children: [/* @__PURE__ */ f(i, {
|
|
92
92
|
...d(),
|
|
93
|
-
children:
|
|
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(
|
|
97
|
+
}), /* @__PURE__ */ f(l, {
|
|
98
98
|
...m(),
|
|
99
99
|
className: "shadow-none"
|
|
100
100
|
})]
|
|
101
101
|
});
|
|
102
|
-
}, w = ({ filterSettings:
|
|
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((
|
|
108
|
-
!
|
|
109
|
-
...
|
|
110
|
-
selectedFilters:
|
|
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
|
-
}, [
|
|
113
|
-
if (!
|
|
114
|
-
let r =
|
|
115
|
-
|
|
116
|
-
...
|
|
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 =
|
|
128
|
-
filters:
|
|
127
|
+
}, [o]), R = t && n ? {
|
|
128
|
+
filters: t.filters,
|
|
129
129
|
onChange: P
|
|
130
|
-
} : null, z =
|
|
131
|
-
options:
|
|
132
|
-
sortBy:
|
|
133
|
-
sortDirection:
|
|
134
|
-
onSortByChange: (e) =>
|
|
135
|
-
...
|
|
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:
|
|
137
|
+
sortDirection: r.sortDirection || "asc"
|
|
138
138
|
}),
|
|
139
|
-
onSortDirectionChange: (e) =>
|
|
140
|
-
...
|
|
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
|
-
...
|
|
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(
|
|
154
|
+
children: /* @__PURE__ */ f(c, {
|
|
155
155
|
activeItem: x.activeItem,
|
|
156
156
|
onActiveItemChange: x.onActiveItemChange,
|
|
157
|
-
children: x.items.map((e) => /* @__PURE__ */ f(
|
|
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(
|
|
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(
|
|
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(
|
|
185
|
+
children: /* @__PURE__ */ f(s, { ...B })
|
|
186
186
|
})
|
|
187
187
|
]
|
|
188
188
|
}),
|
|
189
|
-
|
|
189
|
+
t?.selectedFilters && t.selectedFilters.length > 0 && n && /* @__PURE__ */ f("div", {
|
|
190
190
|
className: "w-full",
|
|
191
191
|
children: /* @__PURE__ */ f(b, {
|
|
192
|
-
selectedFilters:
|
|
192
|
+
selectedFilters: t.selectedFilters,
|
|
193
193
|
onDelete: N,
|
|
194
|
-
onClear: () =>
|
|
195
|
-
...
|
|
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-
|
|
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":";;;;;AA6BA,IAAaE,KAAmB,EAAEC,oBAAiBC,aAAUC,iBAA+B;CAC1F,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA;AAEd,QACE,kBAACL,GAAAA;EAAMM,KAAI;EAAIC,MAAM;EAAMC,WAAU;EAAQC,cAAa;aAEvDP,EAAgBQ,KAAKC,MACpB,kBAACZ,GAAAA;GAECa,WAAS;GACTC,SAASF,EAAOG;GAChBC,WAAWJ,EAAOK;GAClBC,eAAed,EAASQ,EAAAA;KAJnB,GAAGA,EAAOG,KAAK,GAAGH,EAAOK,QAAO,CAAA,EAOxCd,EAAgBgB,SAAS,KAAK,kBAACnB,GAAAA;GAAKgB,WAAWI,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;GAAGC,WAAU;GAAOC,SAASjB;;;;;;AC1B9F,SAASyB,EAAQC,GAAc;AAK7B,QAJIA,KAAS,OAAa,KACtB,OAAOA,KAAU,YAAYC,MAAMC,QAAQF,EAAAA,GAAeA,EAAMG,WAAW,IAC3EH,aAAiBI,OAAOJ,aAAiBK,MAAYL,EAAMM,SAAS,IACpE,OAAON,KAAU,WAAiBO,OAAOC,KAAKR,EAAAA,CAAOG,WAAW,IAC7D;;AAGT,IAAaM,KAAgB,EAAEC,YAASC,kBAA6B;CACnE,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EAER,CAACC,GAAoBC,KAAyBrB,EAAiB,GAAA,EAC/D,CAACsB,GAAqBC,KAA0BvB,EAAiB,GAAA,EAEjEwB,IAAqCP,EACxCQ,MAAMC,MAAWA,EAAOC,eAAeP,EAAAA,EACtCQ,QAAQF,QAAQnB,MAAUA,EAAAA,EAExBsB,IAAoB9B,GACvBQ,MAAAA;AAQCwB,EAPAR,EAAuBhB,EAAAA,EACnB,CAACD,EAAQc,EAAAA,IAAuB,CAACd,EAAQC,EAAAA,IAC3CW,EAAS;GACPY,MAAMV;GACCb;GACT,CAAA,EAEFwB,iBAAW;AACTR,KAAuB,GAAA;KACtB,EAAA;IAEL;EAACH;EAAoBG;EAAwBL;EAAS,CAAA,EAGlDc,WAAkE;EACtEC,WAAW;EACXH,MAAM;EACN,eAAe;EACfI,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;EAClB5B,OAAOa;EACPF,WAAWX,MAAAA;AACTc,KAAsBe,OAAO7B,EAAAA,CAAAA;;EAEjC,GAEM8B,WAAsE;EAC1EJ,WAAW;EACXH,MAAM;EACN,eAAe;EACfvB,OAAOe;EACPgB,UAAU,CAAClB;EACXF,UAAUW;EACZ;AAEA,QACE,kBAAC5B,GAAAA;EAAWgC,WAAU;aACpB,kBAAC5B,GAAAA;GAAQ,GAAG2B,GAAgB;aACzBf,GAASsB,KAAK,EAAEC,gBAAab,oBAC5B,kBAACvB,GAAAA;IAAaG,OAAOoB;IAAYO,OAAOM;IAA8BC,eAAad;MAAzBA,EAAAA,CAAAA;MAG9D,kBAACzB,GAAAA;GAAU,GAAGmC,GAAkB;aAC7Bb,GAAce,KAAKhC,MAClB,kBAACJ,GAAAA;IAAsBI;IAAmB2B,OAAO3B;IAAOkC,eAAalC;MAAlCA,EAAAA,CAAAA;;;GC7DhCwC,KAAuC,EAClDC,WACAC,mBACAC,kBACAC,0BACAC,iBACD;CACC,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EAERC,WAAkE;EACtEC,WAAW;EACXC,UAAUP;EACVQ,OAAOT;EACP,eAAe;EACfU,OAAOC,EAAAA,EAAC,EAAA,IAAA,UAAQ,CAAA;EAClB,GAEMC,WAIA;EACJ,eAAe;EACfC,OAAOX;EACPM,UAAUL;EACZ;AAEA,QACE,kBAACL,GAAAA;EAAWS,WAAU;aACpB,kBAACZ,GAAAA;GAAQ,GAAGW,GAAgB;aACzBF,EAAQU,KAAKC,MACZ,kBAACnB,GAAAA;IAAgCa,OAAOM,EAAON;cAC5CM,EAAOL;MADSK,EAAON,MAAK,CAAA;MAKnC,kBAACZ,GAAAA;GAAY,GAAGe,GAAoB;GAAEL,WAAU;;;GCpBzCmB,KAAe,EAC1BC,mBACAC,aACAC,iBACAC,WACAC,eACAC,aACAC,sBAAmB,EAAE,EACrBC,YACAC,SACAC,eACAC,kBACAC,cAAW,SACXC,qBACiB;CACjB,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EAERC,IAAmBxB,EAA2ByB,KAAAA,EAAAA;AAEpDxB,eACS;AACL,EAAIuB,EAAiBE,WACnBC,aAAaH,EAAiBE,QAAO;IAGxC,EAAE,CAAA;CAGL,IAAME,KAAqBC,MACpBA,KACW,OAAOA,KAAS,WAAW,IAAIE,KAAKF,EAAAA,GAAQA,GAC7CG,gBAAc,GAFX,IAKdC,IAAgBd,MAAeM,KAAAA,KAAaL,MAAkBK,KAAAA,GAE9DS,IAAqBnC,GACxBoC,MAAAA;AACK,GAACxB,KAAY,CAACD,KAClBC,EAAS;GACP,GAAGD;GACH0B,iBAAiB1B,EAAe0B,iBAAiBC,QAC9CA,MAAW,EAAEA,EAAOC,SAASH,EAAeG,QAAQD,EAAOE,UAAUJ,EAAeI,OAAI;GAE7F,CAAA;IAEF,CAAC7B,GAAgBC,EAAS,CAAA,EAGtB6B,KAAgBC,MAAAA;AAKpB,MAJI,CAAC9B,KAAY,CAACD,KACGA,EAAe0B,iBAAiBO,MAClDN,MAAWA,EAAOC,SAASG,EAAeH,QAAQD,EAAOE,UAAUE,EAAeF,MAAK,CAExE;EAMlB,IAAMS,IAJqBtC,EAAemC,QAAQC,MAC/CT,MAAWI,EAAeH,SAASD,EAAOU,WAAU,EACpDH,qBAGC,CAAA,GAAKlC,EAAe0B,mBAAmB,EAAE,EAAGK,EAAe,GAC3D,CAAA,IACM/B,EAAe0B,mBAAmB,EAAE,EAAEC,QAAQA,MAAWA,EAAOC,SAASG,EAAeH,KAAI,EAChGG,EACD;AAEL9B,IAAS;GAAE,GAAGD;GAAgB0B,iBAAiBY;GAAY,CAAA;IAGvDC,IAAelD,GAClBwC,MAAAA;EACC,IAAMW,IAAc,OAAOX,KAAU,WAAWA,IAAQ;AAMxDxB,EAJIS,EAAiBE,WACnBC,aAAaH,EAAiBE,QAAO,EAGvCX,IAAWmC,EAAAA;IAEb,CAACnC,EAAS,CAAA,EAGNoC,IAAoBpD,GACvBqD,MAAAA;EACC,IAAMF,IAAcE,EAAMC,cAAcd;AAExCf,EADIA,EAAiBE,WAASC,aAAaH,EAAiBE,QAAO,EACnEF,EAAiBE,UAAU4B,OAAOC,iBAAiBxC,IAAWmC,EAAAA,EAAc,IAAA;IAE9E,CAACnC,EAAS,CAAA,EAGNyC,IAAoBzD,QAAY;AAEpCgB,EADIS,EAAiBE,WAASC,aAAaH,EAAiBE,QAAO,EACnEX,IAAW,GAAA;IACV,CAACA,EAAS,CAAA,EAEP0C,IAAe/C,KAAkBC,IAAW;EAAEkC,SAASnC,EAAemC;EAASa,UAAUlB;EAAa,GAAI,MAC1GmB,IACJ/C,KAAgBC,IACZ;EACE+C,SAAShD,EAAagD;EACtBC,QAAQjD,EAAaiD;EACrBC,eAAelD,EAAakD,iBAAiB;EAC7CC,iBAAiBC,MACfnD,EAAO;GAAE,GAAGD;GAAciD,QAAQG;GAAOF,eAAelD,EAAakD,iBAAiB;GAAM,CAAA;EAC9FG,wBAAwBC,MAA8BrD,EAAO;GAAE,GAAGD;GAAckD,eAAeI;GAAU,CAAA;EAC3G,GACA,MAEAC,IAAsEpD,IACxE;EACEqD,aAAaC,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;EACxB,eAAe;EACf9B,OAAOzB;EACPwD,SAASnB;EACToB,SAASf;EACTzC,UAAUkC;EACV,GAAGjC;EACL,GACA;AAEJ,QACE,kBAAA,GAAA,EAAA,UAAA,CACGE,KACC,kBAACsD,OAAAA;EAAIC,WAAU;YACb,kBAACrE,GAAAA;GAAcsE,YAAYxD,EAAKwD;GAAYC,oBAAoBzD,EAAKyD;aAClEzD,EAAK0D,MAAMC,KAAKC,MACf,kBAACzE,GAAAA;IAAmC0E,OAAOD,EAAKC;IAAOxC,OAAOuC,EAAKvC;MAA3CuC,EAAKvC,MAAK,CAAA;;KAK1C,kBAACpC,GAAAA;EAAM6E,WAAU;EAASC,KAAI;EAAIR,WAAU;;GACzCxD,KACC,kBAACd,GAAAA;IAAM+D,WAAU;IAAaO,WAAU;cACrCxD;;GAIL,kBAACuD,OAAAA;IAAIC,WAAU;;KACZhB,KACC,kBAACe,OAAAA;MAAIC,WAAU;gBACb,kBAAClE,GAAAA,EAAc,GAAGkD,GAAAA,CAAAA;;KAGrBE,KACC,kBAACa,OAAAA;MAAIC,WAAU;gBACb,kBAACjE,GAAAA,EAAW,GAAGmD,GAAAA,CAAAA;;KAGlBQ,KACC,kBAACK,OAAAA;MAAIC,WAAU;gBACb,kBAACvE,GAAAA,EAAa,GAAGiE,GAAAA,CAAAA;;;;GAKtBzD,GAAgB0B,mBAAmB1B,EAAe0B,gBAAgB8C,SAAS,KAAKvE,KAC/E,kBAAC6D,OAAAA;IAAIC,WAAU;cACb,kBAACnE,GAAAA;KACC8B,iBAAiB1B,EAAe0B;KAChC+C,UAAUjD;KACVqC,eAAe5D,EAAS;MAAE,GAAGD;MAAgB0B,iBAAiB,EAAE;MAAC,CAAA;;;IAKrEH,KAAiBX,MACjB,kBAACkD,OAAAA;IAAIC,WAAU;cACb,kBAACD,OAAAA;KAAIC,WAAU;gBACZxC,KACC,kBAACmD,QAAAA,EAAAA,UACC,kBAAA,GAAA;;;OACWhE;OAAmBD;OAAaE;;YAI9CC,KAIK,kBAAC8D,QAAAA,EAAAA,UACC,kBAAA,GAAA;;gBAAsBC,eAHJzD,EAAkBN,EAAAA,EAAAA"}
|
|
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 {
|
|
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-
|
|
25
|
+
//# sourceMappingURL=RouteError-Cyto623-.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteError-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_auth-
|
|
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
|