From ca526e63c8211fe308049f5d003a9826f5ebb50e Mon Sep 17 00:00:00 2001 From: "Michael S. Molina" <70410625+michael-s-molina@users.noreply.github.com> Date: Tue, 21 Jun 2022 15:13:37 -0300 Subject: [PATCH] feat: Adds support for clearing the Select cache (#20397) * feat: Adds support for clearing the Select cache * Fixes lint errors --- .../src/components/Select/Select.stories.tsx | 25 +++++++++++++++++-- .../src/components/Select/Select.test.tsx | 18 ++++++++++++- .../src/components/Select/Select.tsx | 16 +++++++++++- .../src/filters/components/GroupBy/types.ts | 3 ++- .../filters/components/TimeColumn/types.ts | 3 ++- .../src/filters/components/TimeGrain/types.ts | 3 ++- 6 files changed, 61 insertions(+), 7 deletions(-) diff --git a/superset-frontend/src/components/Select/Select.stories.tsx b/superset-frontend/src/components/Select/Select.stories.tsx index 5526c2fc2ac0..9b38586467ab 100644 --- a/superset-frontend/src/components/Select/Select.stories.tsx +++ b/superset-frontend/src/components/Select/Select.stories.tsx @@ -16,9 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -import React, { ReactNode, useState, useCallback } from 'react'; +import React, { ReactNode, useState, useCallback, useRef } from 'react'; +import Button from 'src/components/Button'; import ControlHeader from 'src/explore/components/ControlHeader'; -import Select, { SelectProps, OptionsTypePage, OptionsType } from './Select'; +import Select, { + SelectProps, + OptionsTypePage, + OptionsType, + SelectRef, +} from './Select'; export default { title: 'Select', @@ -387,6 +393,7 @@ export const AsyncSelect = ({ responseTime: number; }) => { const [requests, setRequests] = useState([]); + const ref = useRef(null); const getResults = (username?: string) => { let results: { label: string; value: string }[] = []; @@ -458,6 +465,7 @@ export const AsyncSelect = ({ > , + ); + await open(); + expect(mock).toHaveBeenCalledTimes(1); + ref.current?.clearCache(); + await type('{esc}'); + await open(); + expect(mock).toHaveBeenCalledTimes(2); +}); + /* TODO: Add tests that require scroll interaction. Needs further investigation. - Fetches more data when scrolling and more data is available diff --git a/superset-frontend/src/components/Select/Select.tsx b/superset-frontend/src/components/Select/Select.tsx index 3624f4a2b157..591fe350ce63 100644 --- a/superset-frontend/src/components/Select/Select.tsx +++ b/superset-frontend/src/components/Select/Select.tsx @@ -27,6 +27,7 @@ import React, { useState, useRef, useCallback, + useImperativeHandle, } from 'react'; import { ensureIsArray, styled, t } from '@superset-ui/core'; import AntdSelect, { @@ -81,6 +82,8 @@ export type OptionsPagePromise = ( pageSize: number, ) => Promise; +export type SelectRef = HTMLInputElement & { clearCache: () => void }; + export interface SelectProps extends PickedSelectProps { /** * It enables the user to create new options. @@ -315,7 +318,7 @@ const Select = ( value, ...props }: SelectProps, - ref: RefObject, + ref: RefObject, ) => { const isAsync = typeof options === 'function'; const isSingleMode = mode === 'single'; @@ -678,6 +681,17 @@ const Select = ( } }, [isLoading, loading]); + const clearCache = () => fetchedQueries.current.clear(); + + useImperativeHandle( + ref, + () => ({ + ...(ref.current as HTMLInputElement), + clearCache, + }), + [ref], + ); + return ( {header} diff --git a/superset-frontend/src/filters/components/GroupBy/types.ts b/superset-frontend/src/filters/components/GroupBy/types.ts index 5775edaa2f33..1e6d75649778 100644 --- a/superset-frontend/src/filters/components/GroupBy/types.ts +++ b/superset-frontend/src/filters/components/GroupBy/types.ts @@ -23,6 +23,7 @@ import { QueryFormData, } from '@superset-ui/core'; import { RefObject } from 'react'; +import { SelectRef } from 'src/components/Select/Select'; import { PluginFilterHooks, PluginFilterStylesProps } from '../types'; interface PluginFilterGroupByCustomizeProps { @@ -40,7 +41,7 @@ export type PluginFilterGroupByProps = PluginFilterStylesProps & { data: DataRecord[]; filterState: FilterState; formData: PluginFilterGroupByQueryFormData; - inputRef: RefObject; + inputRef: RefObject; } & PluginFilterHooks; export const DEFAULT_FORM_DATA: PluginFilterGroupByCustomizeProps = { diff --git a/superset-frontend/src/filters/components/TimeColumn/types.ts b/superset-frontend/src/filters/components/TimeColumn/types.ts index 95b1e5edfdc9..bc12cb87169c 100644 --- a/superset-frontend/src/filters/components/TimeColumn/types.ts +++ b/superset-frontend/src/filters/components/TimeColumn/types.ts @@ -23,6 +23,7 @@ import { QueryFormData, } from '@superset-ui/core'; import { RefObject } from 'react'; +import { SelectRef } from 'src/components/Select/Select'; import { PluginFilterHooks, PluginFilterStylesProps } from '../types'; interface PluginFilterTimeColumnCustomizeProps { @@ -39,7 +40,7 @@ export type PluginFilterTimeColumnProps = PluginFilterStylesProps & { data: DataRecord[]; filterState: FilterState; formData: PluginFilterTimeColumnQueryFormData; - inputRef: RefObject; + inputRef: RefObject; } & PluginFilterHooks; export const DEFAULT_FORM_DATA: PluginFilterTimeColumnCustomizeProps = { diff --git a/superset-frontend/src/filters/components/TimeGrain/types.ts b/superset-frontend/src/filters/components/TimeGrain/types.ts index 3dfa9a99d8dc..64a716657357 100644 --- a/superset-frontend/src/filters/components/TimeGrain/types.ts +++ b/superset-frontend/src/filters/components/TimeGrain/types.ts @@ -18,6 +18,7 @@ */ import { FilterState, QueryFormData, DataRecord } from '@superset-ui/core'; import { RefObject } from 'react'; +import { SelectRef } from 'src/components/Select/Select'; import { PluginFilterHooks, PluginFilterStylesProps } from '../types'; interface PluginFilterTimeGrainCustomizeProps { @@ -33,7 +34,7 @@ export type PluginFilterTimeGrainProps = PluginFilterStylesProps & { data: DataRecord[]; filterState: FilterState; formData: PluginFilterTimeGrainQueryFormData; - inputRef: RefObject; + inputRef: RefObject; } & PluginFilterHooks; export const DEFAULT_FORM_DATA: PluginFilterTimeGrainCustomizeProps = {