@@ -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' ;
2324import { Helmet } from 'react-helmet' ;
2425import { IncidentsTable } from './IncidentsTable' ;
@@ -29,7 +30,6 @@ import {
2930} from './processIncidents' ;
3031import {
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';
6061import { Incident } from './model' ;
6162import { useAlertsPoller } from '../hooks/useAlertsPoller' ;
6263import { Rule } from '@openshift-console/dynamic-plugin-sdk' ;
64+ import IncidentFilterToolbarItem , { severityOptions , stateOptions } from './ToolbarItemFilter' ;
6365
6466const 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