Skip to content

Commit ed0552c

Browse files
committed
Add filters to Overview page: Filter by Broker, Time, and Topic
Signed-off-by: hemahg <[email protected]>
1 parent da30296 commit ed0552c

File tree

5 files changed

+216
-0
lines changed

5 files changed

+216
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import type { Meta, StoryObj } from "@storybook/nextjs";
2+
import { FilterByBroker } from "./FilterByBroker";
3+
4+
const meta: Meta<typeof FilterByBroker> = {
5+
component: FilterByBroker,
6+
args: {
7+
selectedBroker: "Broker1",
8+
brokerList: ["Broker1", "Broker2", "Broker3"],
9+
},
10+
} as Meta<typeof FilterByBroker>;
11+
12+
export default meta;
13+
type Story = StoryObj<typeof FilterByBroker>;
14+
15+
export const Default: Story = {};
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import {
2+
MenuToggle,
3+
MenuToggleElement,
4+
Select,
5+
SelectList,
6+
SelectOption,
7+
ToolbarItem,
8+
} from "@/libs/patternfly/react-core";
9+
import { useTranslations } from "next-intl";
10+
import { useState } from "react";
11+
12+
export function FilterByBroker({
13+
selectedBroker,
14+
brokerList,
15+
onSetSelectedBroker,
16+
disableToolbar,
17+
}: {
18+
selectedBroker: string | undefined;
19+
brokerList: string[];
20+
onSetSelectedBroker: (value: string | undefined) => void;
21+
disableToolbar: boolean;
22+
}) {
23+
const t = useTranslations("metrics");
24+
const [isBrokerSelectOpen, setIsBrokerSelectOpen] = useState(false);
25+
26+
const onToggleClick = () => setIsBrokerSelectOpen((prev) => !prev);
27+
28+
const onBrokerSelect = (
29+
_event: React.MouseEvent<Element, MouseEvent> | undefined,
30+
value: string | number | undefined,
31+
) => {
32+
if (value === t("all_brokers")) {
33+
onSetSelectedBroker(undefined);
34+
} else {
35+
onSetSelectedBroker(value as string);
36+
}
37+
setIsBrokerSelectOpen(false);
38+
};
39+
40+
// Define the toggle (new API pattern)
41+
const toggle = (toggleRef: React.Ref<MenuToggleElement>) => (
42+
<MenuToggle
43+
ref={toggleRef}
44+
onClick={onToggleClick}
45+
isExpanded={isBrokerSelectOpen}
46+
isDisabled={disableToolbar || brokerList.length === 0}
47+
style={{ width: "250px" }}
48+
>
49+
{selectedBroker || t("all_brokers")}
50+
</MenuToggle>
51+
);
52+
53+
return (
54+
<ToolbarItem>
55+
<Select
56+
id="broker-select"
57+
isOpen={isBrokerSelectOpen}
58+
selected={selectedBroker || t("all_brokers")}
59+
onSelect={onBrokerSelect}
60+
onOpenChange={setIsBrokerSelectOpen}
61+
toggle={toggle}
62+
shouldFocusToggleOnSelect
63+
>
64+
<SelectList>
65+
<SelectOption value={t("all_brokers")}>
66+
{t("all_brokers")}
67+
</SelectOption>
68+
{brokerList.map((broker, index) => (
69+
<SelectOption key={`broker-${index}`} value={broker}>
70+
{broker}
71+
</SelectOption>
72+
))}
73+
</SelectList>
74+
</Select>
75+
</ToolbarItem>
76+
);
77+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { Meta, StoryObj } from "@storybook/nextjs";
2+
import { FilterByTime } from "./FilterByTime";
3+
4+
const meta: Meta<typeof FilterByTime> = {
5+
component: FilterByTime,
6+
args: {
7+
keyText: "string",
8+
disableToolbar: false,
9+
ariaLabel: "the aria label",
10+
duration: 60,
11+
},
12+
} as Meta<typeof FilterByTime>;
13+
14+
export default meta;
15+
type Story = StoryObj<typeof FilterByTime>;
16+
17+
export const Default: Story = {};
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import {
2+
MenuToggle,
3+
MenuToggleElement,
4+
Select,
5+
SelectList,
6+
SelectOption,
7+
ToolbarItem,
8+
} from "@/libs/patternfly/react-core";
9+
import { useState } from "react";
10+
11+
export enum DurationOptions {
12+
Last5minutes = 5,
13+
Last15minutes = 15,
14+
Last30minutes = 30,
15+
Last1hour = 60,
16+
Last3hours = 3 * 60,
17+
Last6hours = 6 * 60,
18+
Last12hours = 12 * 60,
19+
Last24hours = 24 * 60,
20+
Last2days = 2 * 24 * 60,
21+
Last7days = 7 * 24 * 60,
22+
}
23+
24+
export const DurationOptionsMap = {
25+
[DurationOptions.Last5minutes]: "Last 5 minutes",
26+
[DurationOptions.Last15minutes]: "Last 15 minutes",
27+
[DurationOptions.Last30minutes]: "Last 30 minutes",
28+
[DurationOptions.Last1hour]: "Last 1 hour",
29+
[DurationOptions.Last3hours]: "Last 3 hours",
30+
[DurationOptions.Last6hours]: "Last 6 hours",
31+
[DurationOptions.Last12hours]: "Last 12 hours",
32+
[DurationOptions.Last24hours]: "Last 24 hours",
33+
[DurationOptions.Last2days]: "Last 2 days",
34+
[DurationOptions.Last7days]: "Last 7 days",
35+
} as const;
36+
37+
export function FilterByTime({
38+
duration,
39+
keyText,
40+
ariaLabel,
41+
disableToolbar,
42+
onDurationChange,
43+
}: {
44+
duration: DurationOptions;
45+
onDurationChange: (value: DurationOptions) => void;
46+
keyText: string;
47+
ariaLabel: string;
48+
disableToolbar: boolean;
49+
}) {
50+
const [isTimeSelectOpen, setIsTimeSelectOpen] = useState(false);
51+
52+
const onToggleClick = () => setIsTimeSelectOpen((prev) => !prev);
53+
54+
const onTimeSelect = (
55+
_event: React.MouseEvent<Element, MouseEvent> | undefined,
56+
value: string | number | undefined,
57+
) => {
58+
const mapping = Object.entries(DurationOptionsMap).find(
59+
([, label]) => label === value,
60+
);
61+
if (mapping) {
62+
onDurationChange(parseInt(mapping[0], 10) as DurationOptions);
63+
}
64+
setIsTimeSelectOpen(false);
65+
};
66+
67+
// Menu toggle (new PF6 API)
68+
const toggle = (toggleRef: React.Ref<MenuToggleElement>) => (
69+
<MenuToggle
70+
ref={toggleRef}
71+
onClick={onToggleClick}
72+
isExpanded={isTimeSelectOpen}
73+
isDisabled={disableToolbar}
74+
style={{ width: "250px" }}
75+
>
76+
{DurationOptionsMap[duration]}
77+
</MenuToggle>
78+
);
79+
80+
return (
81+
<ToolbarItem>
82+
<label hidden id={`${keyText}-label`}>
83+
{ariaLabel}
84+
</label>
85+
<Select
86+
id={`filter-by-time-${keyText}`}
87+
isOpen={isTimeSelectOpen}
88+
selected={DurationOptionsMap[duration]}
89+
onSelect={onTimeSelect}
90+
onOpenChange={setIsTimeSelectOpen}
91+
toggle={toggle}
92+
shouldFocusToggleOnSelect
93+
>
94+
<SelectList>
95+
{Object.values(DurationOptionsMap).map((label, idx) => (
96+
<SelectOption key={`${keyText}-${idx}`} value={label}>
97+
{label}
98+
</SelectOption>
99+
))}
100+
</SelectList>
101+
</Select>
102+
</ToolbarItem>
103+
);
104+
}

ui/messages/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,9 @@
414414
"no_data": "No clusters available.",
415415
"not_available": "n/a"
416416
},
417+
"metrics": {
418+
"all_brokers": "All Brokers"
419+
},
417420
"ColumnsModal": {
418421
"title": "Manage columns",
419422
"description": "Chosen fields will be displayed in the table.",

0 commit comments

Comments
 (0)