diff --git a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx index fd1520d926..a92ef43d32 100644 --- a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx +++ b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx @@ -15,7 +15,13 @@ */ import React, { useCallback, useState } from 'react'; -import { List, TextField, ListItem } from '@material-ui/core'; +import { + List, + TextField, + IconButton, + Grid, + Typography, +} from '@material-ui/core'; import { EmptyFlags } from './EmptyFlags'; import { FlagItem } from './FeatureFlagsItem'; @@ -25,6 +31,7 @@ import { useApi, } from '@backstage/core-plugin-api'; import { InfoCard } from '@backstage/core-components'; +import ClearIcon from '@material-ui/icons/Clear'; export const UserSettingsFeatureFlags = () => { const featureFlagsApi = useApi(featureFlagsApiRef); @@ -35,7 +42,8 @@ export const UserSettingsFeatureFlags = () => { ); const [state, setState] = useState>(initialFlagState); - const [searchInput, setSearchInput] = useState(''); + const [filterInput, setFilterInput] = useState(''); + const inputRef = React.useRef(); const toggleFlag = useCallback( (flagName: string) => { @@ -60,28 +68,69 @@ export const UserSettingsFeatureFlags = () => { return ; } - return ( - - - + const clearFilterInput = () => { + setFilterInput(''); + inputRef?.current?.focus(); + }; + + let filteredFeatureFlags = Array.from(featureFlags); + + const filterInputParts = filterInput + .split(/\s/) + .map(part => part.trim().toLowerCase()); + + filterInputParts.forEach( + part => + (filteredFeatureFlags = filteredFeatureFlags.filter(featureFlag => + featureFlag.name.toLowerCase().includes(part), + )), + ); + + const Header = () => ( + + + Feature Flags + + {featureFlags.length >= 10 && ( + setSearchInput(e.target.value)} - value={searchInput} + label="Filter" + style={{ display: 'flex', justifyContent: 'flex-end' }} + inputRef={ref => ref && ref.focus()} + InputProps={{ + ...(filterInput.length && { + endAdornment: ( + + + + ), + }), + }} + onChange={e => setFilterInput(e.target.value)} + value={filterInput} /> - - {featureFlags.map((featureFlag, index) => { + + )} + + ); + + return ( + }> + + {filteredFeatureFlags.map(featureFlag => { const enabled = Boolean(state[featureFlag.name]); return ( - featureFlag.name.includes(searchInput) && ( - - ) + ); })}