1- import {
2- Button ,
3- InputGroup ,
4- Toolbar ,
5- ToolbarContent ,
6- ToolbarItem ,
7- Tooltip ,
8- ValidatedOptions
9- } from '@patternfly/react-core' ;
1+ import { Button , Toolbar , ToolbarContent , ToolbarItem , Tooltip } from '@patternfly/react-core' ;
102import { CompressIcon , ExpandIcon } from '@patternfly/react-icons' ;
113import * as _ from 'lodash' ;
124import * as React from 'react' ;
135import { useTranslation } from 'react-i18next' ;
14- import { Filter , FilterDefinition , Filters , FilterValue , findFromFilters } from '../../model/filters' ;
6+ import { FilterDefinition , Filters } from '../../model/filters' ;
157import { QuickFilter } from '../../model/quick-filters' ;
168import { autoCompleteCache } from '../../utils/autocomplete-cache' ;
17- import { findFilter } from '../../utils/filter-definitions' ;
18- import { Indicator , swapFilterDefinition } from '../../utils/filters-helper' ;
199import { localStorageShowFiltersKey , useLocalStorage } from '../../utils/local-storage-hook' ;
2010import { QueryOptionsDropdown , QueryOptionsProps } from '../dropdowns/query-options-dropdown' ;
2111import './filters-toolbar.css' ;
22- import AutocompleteFilter from './filters/autocomplete-filter' ;
23- import CompareFilter , { FilterCompare } from './filters/compare-filter' ;
24- import { FilterHints } from './filters/filter-hints' ;
12+ import { FilterSearchInput } from './filters/filter-search-input' ;
2513import { FiltersChips } from './filters/filters-chips' ;
26- import FiltersDropdown from './filters/filters-dropdown' ;
2714import { QuickFilters } from './filters/quick-filters' ;
28- import TextFilter from './filters/text-filter' ;
2915import { LinksOverflow } from './links-overflow' ;
3016
3117export interface FiltersToolbarProps {
@@ -58,12 +44,8 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
5844 ...props
5945} ) => {
6046 const { t } = useTranslation ( 'plugin__netobserv-plugin' ) ;
61- const [ indicator , setIndicator ] = React . useState < Indicator > ( ValidatedOptions . default ) ;
6247 const [ message , setMessage ] = React . useState < string | undefined > ( ) ;
63- const [ selectedFilter , setSelectedFilter ] = React . useState < FilterDefinition | null > (
64- findFilter ( filterDefinitions , 'src_namespace' ) || filterDefinitions . length ? filterDefinitions [ 0 ] : null
65- ) ;
66- const [ selectedCompare , setSelectedCompare ] = React . useState < FilterCompare > ( FilterCompare . equal ) ;
48+
6749 const [ showFilters , setShowFilters ] = useLocalStorage < boolean > ( localStorageShowFiltersKey , true ) ;
6850
6951 // reset and delay message state to trigger tooltip properly
@@ -81,83 +63,7 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
8163 [ skipTipsDelay ]
8264 ) ;
8365
84- const setFiltersList = React . useCallback (
85- ( list : Filter [ ] ) => {
86- setFilters ( { ...filters ! , list : list } ) ;
87- } ,
88- [ setFilters , filters ]
89- ) ;
90-
91- const addFilter = React . useCallback (
92- ( filterValue : FilterValue ) => {
93- if ( selectedFilter === null ) {
94- console . error ( 'addFilter called with' , selectedFilter ) ;
95- return false ;
96- }
97- const def =
98- filters ?. match !== 'any' ? swapFilterDefinition ( filterDefinitions , selectedFilter , 'src' ) : selectedFilter ;
99- const newFilters = _ . cloneDeep ( filters ?. list ) || [ ] ;
100- const not = selectedCompare === FilterCompare . notEqual ;
101- const moreThan = selectedCompare === FilterCompare . moreThanOrEqual ;
102- const found = findFromFilters ( newFilters , { def, not, moreThan } ) ;
103- if ( found ) {
104- if ( found . values . map ( value => value . v ) . includes ( filterValue . v ) ) {
105- setMessageWithDelay ( t ( 'Filter already exists' ) ) ;
106- setIndicator ( ValidatedOptions . error ) ;
107- return false ;
108- } else {
109- found . values . push ( filterValue ) ;
110- }
111- } else {
112- newFilters . push ( { def, not, moreThan, values : [ filterValue ] } ) ;
113- }
114- setFiltersList ( newFilters ) ;
115- return true ;
116- } ,
117- // eslint-disable-next-line react-hooks/exhaustive-deps
118- [
119- filterDefinitions ,
120- filters ?. list ,
121- filters ?. match ,
122- selectedCompare ,
123- selectedFilter ,
124- setFiltersList ,
125- setMessageWithDelay
126- ]
127- ) ;
128-
129- const getFilterControl = React . useCallback ( ( ) => {
130- if ( selectedFilter === null ) {
131- return < > </ > ;
132- }
133-
134- const commonProps = {
135- filterDefinition : selectedFilter ,
136- addFilter : addFilter ,
137- setMessageWithDelay : setMessageWithDelay ,
138- indicator : indicator ,
139- setIndicator : setIndicator
140- } ;
141- switch ( selectedFilter . component ) {
142- case 'text' :
143- case 'number' :
144- return (
145- < TextFilter
146- { ...commonProps }
147- allowEmpty = { selectedCompare !== FilterCompare . moreThanOrEqual }
148- regexp = { selectedFilter . component === 'number' ? / \D / g : undefined }
149- />
150- ) ;
151- case 'autocomplete' :
152- return < AutocompleteFilter { ...commonProps } /> ;
153- }
154- } , [ selectedFilter , addFilter , setMessageWithDelay , indicator , selectedCompare ] ) ;
155-
15666 const getFilterToolbar = React . useCallback ( ( ) => {
157- if ( selectedFilter === null ) {
158- return < > </ > ;
159- }
160-
16167 return (
16268 < ToolbarItem className = "flex-start" >
16369 < Tooltip
@@ -169,26 +75,16 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
16975 enableFlip = { false }
17076 position = { 'top' }
17177 >
172- < div >
173- < InputGroup >
174- < FiltersDropdown
175- filterDefinitions = { filterDefinitions }
176- selectedFilter = { selectedFilter }
177- setSelectedFilter = { setSelectedFilter }
178- />
179- < CompareFilter
180- value = { selectedCompare }
181- setValue = { setSelectedCompare }
182- component = { selectedFilter . component }
183- />
184- { getFilterControl ( ) }
185- </ InputGroup >
186- < FilterHints def = { selectedFilter } />
187- </ div >
78+ < FilterSearchInput
79+ filterDefinitions = { filterDefinitions }
80+ filters = { filters }
81+ setFilters = { setFilters }
82+ setMessage = { setMessageWithDelay }
83+ />
18884 </ Tooltip >
18985 </ ToolbarItem >
19086 ) ;
191- } , [ filterDefinitions , getFilterControl , message , selectedCompare , selectedFilter ] ) ;
87+ } , [ filterDefinitions , filters , message , setFilters , setMessageWithDelay ] ) ;
19288
19389 const isForced = ! _ . isEmpty ( forcedFilters ) ;
19490 const filtersOrForced = isForced ? forcedFilters : filters ;
@@ -210,7 +106,11 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
210106 </ ToolbarItem >
211107 { ! isForced && quickFilters . length > 0 && (
212108 < ToolbarItem className = "flex-start" >
213- < QuickFilters quickFilters = { quickFilters } activeFilters = { filters ?. list || [ ] } setFilters = { setFiltersList } />
109+ < QuickFilters
110+ quickFilters = { quickFilters }
111+ activeFilters = { filters ?. list || [ ] }
112+ setFilters = { list => setFilters ( { ...filters ! , list } ) }
113+ />
214114 </ ToolbarItem >
215115 ) }
216116 { ! isForced && getFilterToolbar ( ) }
0 commit comments