Skip to content

Commit a5cbe91

Browse files
committed
search input with popper
1 parent ff787f5 commit a5cbe91

12 files changed

+523
-219
lines changed

web/locales/en/plugin__netobserv-plugin.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,6 @@
359359
"Show histogram": "Show histogram",
360360
"Hide advanced options": "Hide advanced options",
361361
"Show advanced options": "Show advanced options",
362-
"Filter already exists": "Filter already exists",
363362
"Hide filters": "Hide filters",
364363
"Show {{count}} filters": "Show {{count}} filters",
365364
"Show {{count}} filters_plural": "Show {{count}} filters",
@@ -372,6 +371,10 @@
372371
"Not equals": "Not equals",
373372
"More than": "More than",
374373
"Learn more": "Learn more",
374+
"Filter already exists": "Filter already exists",
375+
"Filter": "Filter",
376+
"Comparator": "Comparator",
377+
"Add filter": "Add filter",
375378
"Peer A": "Peer A",
376379
"Peer B": "Peer B",
377380
"Peer": "Peer",
@@ -391,6 +394,7 @@
391394
"Clear all": "Clear all",
392395
"Swap": "Swap",
393396
"Swap from and to filters": "Swap from and to filters",
397+
"Any direction": "Any direction",
394398
"Quick filters": "Quick filters",
395399
"More options": "More options",
396400
"Export overview": "Export overview",

web/src/components/toolbar/filters-toolbar.tsx

Lines changed: 16 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,17 @@
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';
102
import { CompressIcon, ExpandIcon } from '@patternfly/react-icons';
113
import * as _ from 'lodash';
124
import * as React from 'react';
135
import { useTranslation } from 'react-i18next';
14-
import { Filter, FilterDefinition, Filters, FilterValue, findFromFilters } from '../../model/filters';
6+
import { FilterDefinition, Filters } from '../../model/filters';
157
import { QuickFilter } from '../../model/quick-filters';
168
import { autoCompleteCache } from '../../utils/autocomplete-cache';
17-
import { findFilter } from '../../utils/filter-definitions';
18-
import { Indicator, swapFilterDefinition } from '../../utils/filters-helper';
199
import { localStorageShowFiltersKey, useLocalStorage } from '../../utils/local-storage-hook';
2010
import { QueryOptionsDropdown, QueryOptionsProps } from '../dropdowns/query-options-dropdown';
2111
import './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';
2513
import { FiltersChips } from './filters/filters-chips';
26-
import FiltersDropdown from './filters/filters-dropdown';
2714
import { QuickFilters } from './filters/quick-filters';
28-
import TextFilter from './filters/text-filter';
2915
import { LinksOverflow } from './links-overflow';
3016

3117
export 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()}

web/src/components/toolbar/filters/__tests__/autocomplete-filter.spec.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ describe('<AutocompleteFilter />', () => {
1010
const props: AutocompleteFilterProps = {
1111
filterDefinition: findFilter(FilterDefinitionSample, 'src_name')!,
1212
indicator: ValidatedOptions.default,
13+
currentValue: '',
14+
setCurrentValue: jest.fn(),
1315
addFilter: jest.fn(),
14-
setMessageWithDelay: jest.fn(),
16+
setMessage: jest.fn(),
1517
setIndicator: jest.fn()
1618
};
1719
beforeEach(() => {

web/src/components/toolbar/filters/__tests__/text-filter.spec.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ describe('<TextFilter />', () => {
1010
const props: TextFilterProps = {
1111
filterDefinition: findFilter(FilterDefinitionSample, 'src_name')!,
1212
indicator: ValidatedOptions.default,
13+
currentValue: '',
14+
setCurrentValue: jest.fn(),
1315
addFilter: jest.fn(),
14-
setMessageWithDelay: jest.fn(),
16+
setMessage: jest.fn(),
1517
setIndicator: jest.fn()
1618
};
1719
beforeEach(() => {
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
#autocomplete-menu-button {
2-
width: 30px;
2+
width: 2.2em;
3+
height: 2.2em;
4+
padding: 0;
5+
}
6+
7+
#autocomplete-container {
8+
margin: 0;
39
padding: 0;
410
}

0 commit comments

Comments
 (0)