From f118beb9ea5b63c3c0f03cb98ed7c35ca673c3bb Mon Sep 17 00:00:00 2001 From: "Michael S. Molina" <70410625+michael-s-molina@users.noreply.github.com> Date: Tue, 15 Jun 2021 05:10:23 -0300 Subject: [PATCH] chore: Scrolls top when opening a select filter (#15141) --- .../components/Select/SelectFilterPlugin.tsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx index 3051e3fffc8f..8b9b248e1f05 100644 --- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx +++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx @@ -29,12 +29,20 @@ import { t, tn, } from '@superset-ui/core'; -import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import React, { + RefObject, + ReactElement, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; import { Select } from 'src/common/components'; import debounce from 'lodash/debounce'; import { SLOW_DEBOUNCE } from 'src/constants'; import { useImmerReducer } from 'use-immer'; import Icons from 'src/components/Icons'; +import { usePrevious } from 'src/common/hooks/usePrevious'; import { PluginFilterSelectProps, SelectValue } from './types'; import { StyledSelect, Styles } from '../common'; import { getDataRecordFormatter, getSelectExtraFormData } from '../../utils'; @@ -115,6 +123,7 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { return [...firstData, ...restData]; }, [col, selectedValues, data]); const [isDropdownVisible, setIsDropdownVisible] = useState(false); + const wasDropdownVisible = usePrevious(isDropdownVisible); const [currentSuggestionSearch, setCurrentSuggestionSearch] = useState(''); const [dataMask, dispatchDataMask] = useImmerReducer(reducer, { extraFormData: {}, @@ -276,6 +285,14 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { onSelect={clearSuggestionSearch} onBlur={handleBlur} onDropdownVisibleChange={setIsDropdownVisible} + dropdownRender={( + originNode: ReactElement & { ref?: RefObject }, + ) => { + if (isDropdownVisible && !wasDropdownVisible) { + originNode.ref?.current?.scrollTo({ top: 0 }); + } + return originNode; + }} onFocus={setFocusedFilter} // @ts-ignore onChange={handleChange}