diff --git a/.changeset/shaggy-beds-relax.md b/.changeset/shaggy-beds-relax.md new file mode 100644 index 0000000000..caa6b90924 --- /dev/null +++ b/.changeset/shaggy-beds-relax.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-user-settings': patch +--- + +Add search to FeatureFlags diff --git a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx index 5a3f077920..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 } 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,6 +42,8 @@ export const UserSettingsFeatureFlags = () => { ); const [state, setState] = useState>(initialFlagState); + const [filterInput, setFilterInput] = useState(''); + const inputRef = React.useRef(); const toggleFlag = useCallback( (flagName: string) => { @@ -59,10 +68,60 @@ export const UserSettingsFeatureFlags = () => { 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 && ( + + ref && ref.focus()} + InputProps={{ + ...(filterInput.length && { + endAdornment: ( + + + + ), + }), + }} + onChange={e => setFilterInput(e.target.value)} + value={filterInput} + /> + + )} + + ); + return ( - + }> - {featureFlags.map(featureFlag => { + {filteredFeatureFlags.map(featureFlag => { const enabled = Boolean(state[featureFlag.name]); return (