diff --git a/app/react/components/form-components/ReactSelect.tsx b/app/react/components/form-components/ReactSelect.tsx index a9f4e6282..c7ea47366 100644 --- a/app/react/components/form-components/ReactSelect.tsx +++ b/app/react/components/form-components/ReactSelect.tsx @@ -5,12 +5,14 @@ import ReactSelectAsync, { AsyncProps as ReactSelectAsyncProps, } from 'react-select/async'; import ReactSelect, { + components, GroupBase, + InputProps, OptionsOrGroups, Props as ReactSelectProps, } from 'react-select'; import clsx from 'clsx'; -import { RefAttributes, useMemo } from 'react'; +import { RefAttributes, useMemo, useCallback } from 'react'; import ReactSelectType from 'react-select/dist/declarations/src/Select'; import './ReactSelect.css'; @@ -52,6 +54,9 @@ type Props< | CreatableProps | RegularProps; +/** + * DO NOT use this component directly, use PortainerSelect instead. + */ export function Select< Option = DefaultOption, IsMulti extends boolean = false, @@ -68,24 +73,37 @@ export function Select< id: string; }) { const Component = isCreatable ? ReactSelectCreatable : ReactSelect; - const { options } = props; + const { + options, + 'data-cy': dataCy, + components: componentsProp, + ...rest + } = props; + + const memoizedComponents = useMemoizedSelectComponents< + Option, + IsMulti, + Group + >(dataCy, componentsProp); if ((options?.length || 0) > 1000) { return ( ); } return ( ); } @@ -94,13 +112,25 @@ export function Creatable< Option = DefaultOption, IsMulti extends boolean = false, Group extends GroupBase