Skip to content

Commit 7c2a3a5

Browse files
Merge pull request #515 from Fewwy/RHINENG-20424
RHINENG-20424: improved filters for severity and state
2 parents 20a5237 + 1d88d9d commit 7c2a3a5

File tree

6 files changed

+372
-189
lines changed

6 files changed

+372
-189
lines changed

web/src/actions/observe.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export enum ActionType {
3838
SetAlertsAreLoading = 'setAlertsAreLoading',
3939
SetIncidentsChartSelection = 'setIncidentsChartSelection',
4040
SetFilteredIncidentsData = 'setFilteredIncidentsData',
41+
SetIncidentPageFilterType = 'setIncidentPageFilterType',
4142
}
4243

4344
export type Perspective = 'admin' | 'dev' | 'acm' | 'virtualization-perspective';
@@ -160,6 +161,9 @@ export const setIncidentsChartSelection = (incidentsChartSelectedId) =>
160161
export const setFilteredIncidentsData = (filteredIncidentsData) =>
161162
action(ActionType.SetFilteredIncidentsData, filteredIncidentsData);
162163

164+
export const setIncidentPageFilterType = (filterTypeSelected) =>
165+
action(ActionType.SetIncidentPageFilterType, filterTypeSelected);
166+
163167
type Actions = {
164168
alertingErrored: typeof alertingErrored;
165169
alertingLoaded: typeof alertingLoaded;
@@ -198,6 +202,7 @@ type Actions = {
198202
setAlertsAreLoading: typeof setAlertsAreLoading;
199203
setIncidentsChartSelection: typeof setIncidentsChartSelection;
200204
setFilteredIncidentsData: typeof setFilteredIncidentsData;
205+
setIncidentPageFilterType: typeof setIncidentPageFilterType;
201206
};
202207

203208
export type ObserveAction = Action<Actions>;

web/src/components/Incidents/IncidentsPage.tsx

Lines changed: 139 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ import {
1212
Spinner,
1313
Toolbar,
1414
ToolbarContent,
15-
ToolbarFilter,
1615
ToolbarItem,
1716
MenuToggle,
18-
Badge,
1917
PageSection,
2018
Stack,
2119
StackItem,
20+
ToolbarGroup,
21+
Flex,
22+
FlexItem,
2223
} from '@patternfly/react-core';
2324
import { Helmet } from 'react-helmet';
2425
import { IncidentsTable } from './IncidentsTable';
@@ -29,7 +30,6 @@ import {
2930
} from './processIncidents';
3031
import {
3132
filterIncident,
32-
isIncidentFilter,
3333
onDeleteGroupIncidentFilterChip,
3434
onDeleteIncidentFilterChip,
3535
onIncidentFiltersSelect,
@@ -45,6 +45,7 @@ import {
4545
setAlertsTableData,
4646
setChooseIncident,
4747
setFilteredIncidentsData,
48+
setIncidentPageFilterType,
4849
setIncidents,
4950
setIncidentsActiveFilters,
5051
} from '../../actions/observe';
@@ -60,6 +61,7 @@ import { MonitoringState } from 'src/reducers/observe';
6061
import { Incident } from './model';
6162
import { useAlertsPoller } from '../hooks/useAlertsPoller';
6263
import { Rule } from '@openshift-console/dynamic-plugin-sdk';
64+
import IncidentFilterToolbarItem, { severityOptions, stateOptions } from './ToolbarItemFilter';
6365

6466
const IncidentsPage = () => {
6567
const { t } = useTranslation(process.env.I18N_NAMESPACE);
@@ -82,13 +84,24 @@ const IncidentsPage = () => {
8284
>([]);
8385
const [hideCharts, setHideCharts] = useState(false);
8486

85-
const [incidentFilterIsExpanded, setIncidentIsExpanded] = useState(false);
8687
const [daysFilterIsExpanded, setDaysFilterIsExpanded] = useState(false);
88+
const [filterTypeIsExpanded, setFilterTypeIsExpanded] = useState(false);
89+
const [severityFilterExpanded, setSeverityFilterExpanded] = useState(false);
90+
const [stateFilterExpanded, setStateFilterExpanded] = useState(false);
8791

88-
const onIncidentFilterToggle = (ev) => {
92+
const onFilterTypeToggle = (ev) => {
8993
ev.stopPropagation();
90-
setIncidentIsExpanded(!incidentFilterIsExpanded);
94+
setFilterTypeIsExpanded(!filterTypeIsExpanded);
9195
};
96+
const onSeverityFilterToggle = (ev) => {
97+
ev.stopPropagation();
98+
setSeverityFilterExpanded(!severityFilterExpanded);
99+
};
100+
const onStateFilterToggle = (ev) => {
101+
ev.stopPropagation();
102+
setStateFilterExpanded(!stateFilterExpanded);
103+
};
104+
92105
const onToggleClick = (ev) => {
93106
ev.stopPropagation();
94107
setDaysFilterIsExpanded(!daysFilterIsExpanded);
@@ -118,6 +131,11 @@ const IncidentsPage = () => {
118131
const filteredData = useSelector((state: MonitoringState) =>
119132
state.plugins.mcp.getIn(['incidentsData', 'filteredIncidentsData']),
120133
);
134+
135+
const incidentPageFilterTypeSelected = useSelector((state: MonitoringState) =>
136+
state.plugins.mcp.getIn(['incidentsData', 'incidentPageFilterType']),
137+
);
138+
121139
useEffect(() => {
122140
const hasUrlParams = Object.keys(urlParams).length > 0;
123141
if (hasUrlParams) {
@@ -126,7 +144,8 @@ const IncidentsPage = () => {
126144
setIncidentsActiveFilters({
127145
incidentsActiveFilters: {
128146
days: urlParams.days ? urlParams.days : ['7 days'],
129-
incidentFilters: urlParams.incidentFilters ? urlParams.incidentFilters : [],
147+
severity: urlParams.severity ? urlParams.severity : [],
148+
state: urlParams.state ? urlParams.state : [],
130149
},
131150
}),
132151
);
@@ -160,7 +179,7 @@ const IncidentsPage = () => {
160179
filteredIncidentsData: filterIncident(incidentsActiveFilters, incidents),
161180
}),
162181
);
163-
}, [incidentsActiveFilters.incidentFilters]);
182+
}, [incidentsActiveFilters.state, incidentsActiveFilters.severity]);
164183

165184
const now = Date.now();
166185
const safeFetch = useSafeFetch();
@@ -310,149 +329,137 @@ const IncidentsPage = () => {
310329
id="toolbar-with-filter"
311330
collapseListedFiltersBreakpoint="xl"
312331
clearAllFilters={() =>
313-
onDeleteIncidentFilterChip('', undefined, incidentsActiveFilters, dispatch)
332+
dispatch(
333+
setIncidentsActiveFilters({
334+
incidentsActiveFilters: {
335+
severity: [],
336+
days: ['7 days'],
337+
state: [],
338+
},
339+
}),
340+
)
314341
}
315342
>
316343
<ToolbarContent>
317-
<ToolbarItem>
318-
<ToolbarFilter
319-
labels={incidentsActiveFilters.incidentFilters}
320-
deleteLabel={(category, chip) => {
321-
if (isIncidentFilter(chip) && typeof category === 'string') {
322-
onDeleteIncidentFilterChip(
323-
category,
324-
chip,
325-
incidentsActiveFilters,
326-
dispatch,
327-
);
328-
}
329-
}}
330-
deleteLabelGroup={() =>
331-
onDeleteGroupIncidentFilterChip(incidentsActiveFilters, dispatch)
332-
}
333-
categoryName="Filters"
334-
>
344+
<ToolbarGroup>
345+
<ToolbarItem>
335346
<Select
336-
id="severity-select"
347+
aria-label="Filter type selection"
348+
isOpen={filterTypeIsExpanded}
337349
role="menu"
338-
aria-label="Filters"
339-
isOpen={incidentFilterIsExpanded}
340-
selected={incidentsActiveFilters.incidentFilters}
341-
onSelect={(event, selection) => {
342-
if (isIncidentFilter(selection)) {
343-
onIncidentFiltersSelect(
344-
event,
345-
selection,
346-
dispatch,
347-
incidentsActiveFilters,
348-
);
349-
}
350-
}}
351-
onOpenChange={(isOpen) => setIncidentIsExpanded(isOpen)}
350+
selected={incidentPageFilterTypeSelected}
351+
onOpenChange={(isOpen) => setFilterTypeIsExpanded(isOpen)}
352+
onSelect={(event, selection) =>
353+
dispatch(setIncidentPageFilterType({ incidentPageFilterType: selection }))
354+
}
355+
shouldFocusToggleOnSelect
352356
toggle={(toggleRef) => (
353357
<MenuToggle
354358
ref={toggleRef}
355-
onClick={onIncidentFilterToggle}
356-
isExpanded={incidentFilterIsExpanded}
359+
onClick={onFilterTypeToggle}
360+
isExpanded={filterTypeIsExpanded}
357361
icon={<FilterIcon />}
358-
badge={
359-
Object.entries(incidentsActiveFilters.incidentFilters).length > 0 ? (
360-
<Badge isRead>
361-
{Object.entries(incidentsActiveFilters.incidentFilters).length}
362-
</Badge>
363-
) : undefined
364-
}
365362
>
366-
Filters
363+
{incidentPageFilterTypeSelected}
367364
</MenuToggle>
368365
)}
369-
shouldFocusToggleOnSelect
370366
>
371-
<SelectList>
372-
<SelectOption
373-
value="Critical"
374-
isSelected={incidentsActiveFilters?.incidentFilters.includes('Critical')}
375-
description="The incident is critical."
376-
hasCheckbox
377-
>
378-
Critical
379-
</SelectOption>
380-
<SelectOption
381-
value="Warning"
382-
isSelected={incidentsActiveFilters?.incidentFilters.includes('Warning')}
383-
description="The incident might lead to critical."
384-
hasCheckbox
385-
>
386-
Warning
387-
</SelectOption>
388-
<SelectOption
389-
value="Informative"
390-
isSelected={incidentsActiveFilters.incidentFilters.includes(
391-
'Informative',
392-
)}
393-
description="The incident is not critical."
394-
hasCheckbox
395-
>
396-
Informative
397-
</SelectOption>
398-
<SelectOption
399-
value="Firing"
400-
isSelected={incidentsActiveFilters.incidentFilters.includes('Firing')}
401-
description="The incident is currently firing."
402-
hasCheckbox
403-
>
404-
Firing
405-
</SelectOption>
406-
<SelectOption
407-
value="Resolved"
408-
isSelected={incidentsActiveFilters.incidentFilters.includes('Resolved')}
409-
description="The incident is not currently firing."
410-
hasCheckbox
411-
>
412-
Resolved
413-
</SelectOption>
414-
</SelectList>
415-
</Select>
416-
</ToolbarFilter>
417-
</ToolbarItem>
418-
<ToolbarItem>
419-
<Select
420-
id="time-range-select"
421-
isOpen={daysFilterIsExpanded}
422-
selected={incidentsActiveFilters.days[0]}
423-
onSelect={onSelect}
424-
onOpenChange={(isOpen) => setDaysFilterIsExpanded(isOpen)}
425-
toggle={(toggleRef) => (
426-
<MenuToggle
427-
ref={toggleRef}
428-
onClick={onToggleClick}
429-
isExpanded={daysFilterIsExpanded}
367+
<SelectOption
368+
value="Severity"
369+
isSelected={incidentPageFilterTypeSelected?.includes('Severity')}
430370
>
431-
{incidentsActiveFilters.days[0]}
432-
</MenuToggle>
433-
)}
434-
shouldFocusToggleOnSelect
435-
>
436-
<SelectList>
437-
<SelectOption value="1 day">{t('1 day')}</SelectOption>
438-
<SelectOption value="3 days">{t('3 days')}</SelectOption>
439-
<SelectOption value="7 days">{t('7 days')}</SelectOption>
440-
<SelectOption value="15 days">{t('15 days')}</SelectOption>
441-
</SelectList>
442-
</Select>
443-
</ToolbarItem>
371+
Severity
372+
</SelectOption>
373+
<SelectOption
374+
value="State"
375+
isSelected={incidentPageFilterTypeSelected?.includes('State')}
376+
>
377+
State
378+
</SelectOption>
379+
</Select>
380+
</ToolbarItem>
381+
<ToolbarItem>
382+
<IncidentFilterToolbarItem
383+
categoryName="Severity"
384+
toggleLabel="Severity filters"
385+
options={severityOptions}
386+
incidentsActiveFilters={incidentsActiveFilters}
387+
onDeleteIncidentFilterChip={onDeleteIncidentFilterChip}
388+
onDeleteGroupIncidentFilterChip={onDeleteGroupIncidentFilterChip}
389+
incidentFilterIsExpanded={severityFilterExpanded}
390+
onIncidentFiltersSelect={onIncidentFiltersSelect}
391+
setIncidentIsExpanded={setSeverityFilterExpanded}
392+
onIncidentFilterToggle={onSeverityFilterToggle}
393+
dispatch={dispatch}
394+
showToolbarItem={incidentPageFilterTypeSelected?.includes('Severity')}
395+
/>
396+
</ToolbarItem>
397+
<ToolbarItem>
398+
<IncidentFilterToolbarItem
399+
categoryName="State"
400+
toggleLabel="State filters"
401+
options={stateOptions}
402+
incidentsActiveFilters={incidentsActiveFilters}
403+
onDeleteIncidentFilterChip={onDeleteIncidentFilterChip}
404+
onDeleteGroupIncidentFilterChip={onDeleteGroupIncidentFilterChip}
405+
incidentFilterIsExpanded={stateFilterExpanded}
406+
onIncidentFiltersSelect={onIncidentFiltersSelect}
407+
setIncidentIsExpanded={setStateFilterExpanded}
408+
onIncidentFilterToggle={onStateFilterToggle}
409+
dispatch={dispatch}
410+
showToolbarItem={incidentPageFilterTypeSelected?.includes('State')}
411+
/>
412+
</ToolbarItem>
413+
</ToolbarGroup>
444414
<ToolbarItem align={{ default: 'alignEnd' }}>
445-
<Button
446-
variant="link"
447-
icon={hideCharts ? <CompressArrowsAltIcon /> : <CompressIcon />}
448-
onClick={() => setHideCharts(!hideCharts)}
449-
>
450-
<span>{hideCharts ? t('Show graph') : t('Hide graph')}</span>
451-
</Button>
415+
<Stack>
416+
<StackItem>
417+
<span>Time range</span>
418+
</StackItem>
419+
<StackItem>
420+
<Select
421+
id="time-range-select"
422+
isOpen={daysFilterIsExpanded}
423+
selected={incidentsActiveFilters.days[0]}
424+
onSelect={onSelect}
425+
onOpenChange={(isOpen) => setDaysFilterIsExpanded(isOpen)}
426+
toggle={(toggleRef) => (
427+
<MenuToggle
428+
ref={toggleRef}
429+
onClick={onToggleClick}
430+
isExpanded={daysFilterIsExpanded}
431+
>
432+
{`Last ${incidentsActiveFilters.days[0]}`}
433+
</MenuToggle>
434+
)}
435+
shouldFocusToggleOnSelect
436+
>
437+
<SelectList>
438+
<SelectOption value="1 day">{t('Last 1 day')}</SelectOption>
439+
<SelectOption value="3 days">{t('Last 3 days')}</SelectOption>
440+
<SelectOption value="7 days">{t('Last 7 days')}</SelectOption>
441+
<SelectOption value="15 days">{t('Last 15 days')}</SelectOption>
442+
</SelectList>
443+
</Select>
444+
</StackItem>
445+
</Stack>
452446
</ToolbarItem>
453447
</ToolbarContent>
454448
</Toolbar>
455449
<Stack hasGutter>
450+
<StackItem>
451+
<Flex justifyContent={{ default: 'justifyContentFlexEnd' }}>
452+
<FlexItem>
453+
<Button
454+
variant="link"
455+
icon={hideCharts ? <CompressArrowsAltIcon /> : <CompressIcon />}
456+
onClick={() => setHideCharts(!hideCharts)}
457+
>
458+
<span>{hideCharts ? t('Show graph') : t('Hide graph')}</span>
459+
</Button>
460+
</FlexItem>
461+
</Flex>
462+
</StackItem>
456463
{!hideCharts && (
457464
<>
458465
<StackItem>

0 commit comments

Comments
 (0)