diff --git a/.changeset/fast-ears-know.md b/.changeset/fast-ears-know.md new file mode 100644 index 0000000000..fa56c4c99d --- /dev/null +++ b/.changeset/fast-ears-know.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-user-settings': patch +--- + +Improved the user experience of the feature flags list. It now sorts the enabled flags to the top of the list to increase the visibilities of the toggled flags. diff --git a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx index c58e637bd2..60b951ab60 100644 --- a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx +++ b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx @@ -25,6 +25,8 @@ import { import { EmptyFlags } from './EmptyFlags'; import { FlagItem } from './FeatureFlagsItem'; import { + FeatureFlag, + FeatureFlagsApi, featureFlagsApiRef, FeatureFlagState, useApi, @@ -32,10 +34,26 @@ import { import { InfoCard } from '@backstage/core-components'; import ClearIcon from '@material-ui/icons/Clear'; +export const sortFlags = ( + flags: FeatureFlag[], + featureFlagsApi: FeatureFlagsApi, +): FeatureFlag[] => { + const activeFlags = flags.filter(flag => featureFlagsApi.isActive(flag.name)); + const idleFlags = flags.filter(flag => !featureFlagsApi.isActive(flag.name)); + return [...activeFlags, ...idleFlags]; +}; + /** @public */ export const UserSettingsFeatureFlags = () => { const featureFlagsApi = useApi(featureFlagsApiRef); - const featureFlags = featureFlagsApi.getRegisteredFlags(); + const inputRef = React.useRef(); + + const initialFeatureFlags = featureFlagsApi.getRegisteredFlags(); + const initialFeatureFlagsSorted = sortFlags( + initialFeatureFlags, + featureFlagsApi, + ); + const [featureFlags] = useState(initialFeatureFlagsSorted); const initialFlagState = Object.fromEntries( featureFlags.map(({ name }) => [name, featureFlagsApi.isActive(name)]), @@ -43,7 +61,6 @@ export const UserSettingsFeatureFlags = () => { const [state, setState] = useState>(initialFlagState); const [filterInput, setFilterInput] = useState(''); - const inputRef = React.useRef(); const toggleFlag = useCallback( (flagName: string) => {