import * as React from "react"; import ReactSelect, * as ReactSelectModule from "react-select"; import defaultMenuRenderer from 'react-select/lib/utils/defaultMenuRenderer'; import DefaultOptionComponent from 'react-select/lib/Option'; declare function describe(desc: string, f: () => void): void; declare function it(desc: string, f: () => void): void; const EXAMPLE_OPTIONS: ReactSelectModule.Options = [ { value: "one", label: "One" }, { value: "two", label: "Two" } ]; interface CustomValueType { prop1: string; prop2: number; } /* * This JSX/TSX generic component workaround is needed because of this issue: * https://github.com/Microsoft/TypeScript/issues/3960 * If https://github.com/Microsoft/TypeScript/issues/6395 ever lands, this * workaround may become redundant. */ type CustomValueReactSelect = new (props: ReactSelectModule.ReactSelectProps) => ReactSelect; const CustomValueReactSelect = ReactSelect as CustomValueReactSelect; const EXAMPLE_CUSTOM_OPTIONS: ReactSelectModule.Options = [ { value: { prop1: "OneProp1", prop2: 1 }, label: "One" }, { value: { prop1: "TwoProp2", prop2: 2 }, label: "Two" } ]; const EXAMPLE_CUSTOM_VALUE: ReactSelectModule.Option = { value: { prop1: "ThreeProp1", prop2: 3 }, label: "Three" }; describe("react-select", () => { it("options", () => { const optionsString: ReactSelectModule.Options = [ { value: "one", label: "One" }, { value: "two", label: "Two", clearableValue: false } ]; const optionsNumber: ReactSelectModule.Options = [ { value: 1, label: "One" }, { value: 2, label: "Two", clearableValue: false } ]; const optionsMixed: ReactSelectModule.Options = [ { value: "one", label: "One" }, { value: 2, label: "Two", clearableValue: false } ]; }); it("async options", () => { const getAsyncLegacyOptions: ReactSelectModule.LoadOptionsLegacyHandler = (input, callback) => { setTimeout(() => { callback(null, { options: [ { value: "one", label: "Two" } ], complete: false }); }); }; const dummyRequest = async () => { return new Promise(resolve => { resolve(EXAMPLE_OPTIONS); }); }; const getAsyncOptions: ReactSelectModule.LoadOptionsAsyncHandler = async input => { const result = await dummyRequest(); return { options: result, complete: false }; }; }); it("Custom value async options", () => { const getAsyncLegacyOptions: ReactSelectModule.LoadOptionsLegacyHandler = (input, callback) => { setTimeout(() => { callback(null, { options: [ { value: { prop1: "One", prop2: 4 }, label: "Two" } ], complete: false }); }); }; const dummyRequest = async () => { return new Promise>(resolve => { resolve(EXAMPLE_CUSTOM_OPTIONS); }); }; const getAsyncOptions: ReactSelectModule.LoadOptionsAsyncHandler = async input => { const result = await dummyRequest(); return { options: result, complete: false }; }; }); it("creatable", () => { function Component(props: {}): JSX.Element { return ; } }); it("Focus method", () => { class Component extends React.PureComponent { private readonly selectRef = (component: ReactSelect) => { component.focus(); } render() { return ; } } }); it("setValue method", () => { class Component extends React.PureComponent { private readonly selectRef = (component: ReactSelect) => { component.setValue({ value: 'value' }); } render() { return ; } } }); it("Overriding default key-down behavior with onInputKeyDown", () => { const keyDownHandler: ReactSelectModule.OnInputKeyDownHandler = (event => { const divEvent = event as React.KeyboardEvent; const inputEvent = event as React.KeyboardEvent; }); }); it("Updating input values with onInputChange", () => { const cleanInput: ReactSelectModule.OnInputChangeHandler = inputValue => { return inputValue.replace(/[^0-9]/g, ""); }; }); }); describe("Focus events", () => { it("Passing custom onFocus", () => { class Component extends React.PureComponent { render() { return ( { const inputEvent = e as React.FocusEvent; const divEvent = e as React.FocusEvent; }} /> ); } } }); it("Passing custom onBlur", () => { class Component extends React.PureComponent { render() { return ( { const inputEvent = e as React.FocusEvent; const divEvent = e as React.FocusEvent; }} /> ); } } }); }); describe("Examples", () => { it("Simple example", () => { class Component extends React.Component { private readonly onSelectChange: ReactSelectModule.OnChangeSingleHandler = (option) => { const optionValue: string = option.value; } render() { return ; } } }); it("onValueClick", () => { class Component extends React.Component { private readonly onValueClick: ReactSelectModule.OnValueClickHandler = (option) => { const optionValue: number = option.value; } render() { const options = [ { value: 3, label: "Option 3" }, { value: 9, label: "Option 9" } ]; return ; } } }); it("Custom value onValueClick", () => { class Component extends React.Component { private readonly onValueClick: ReactSelectModule.OnValueClickHandler = (option) => { const optionValue: CustomValueType = option.value; } render() { return ; } } }); it("Custom value onChange", () => { class Component extends React.Component { private readonly onSelectChange: ReactSelectModule.OnChangeSingleHandler = (option) => { const optionValue: CustomValueType = option.value; } render() { return ; } } }); it("Menu renderer example", () => { class Component extends React.Component { private readonly onSelectChange: ReactSelectModule.OnChangeSingleHandler = option => { const optionValue: string = option.value; } private readonly menuRenderer: ReactSelectModule.MenuRendererHandler = props => { const options = props.options.map(option => { return (
{option.label}
{props.optionRenderer({})}
); }); return
{options}
; } render() { return ; } } }); it("Menu renderer with custom value type example", () => { class Component extends React.Component { private readonly menuRenderer: ReactSelectModule.MenuRendererHandler = props => { const options = props.options.map(option => { return (
props.selectValue(option)}> {option.label}
); }); return
{options}
; } render() { return ; } } }); it("Extend default menu renderer", () => { return class Component extends React.Component { private readonly menuRenderer: ReactSelectModule.MenuRendererHandler = props => { return
defaultMenuRenderer(props)
; } render() { return ; } }; }); it("Extend default Option component", () => { function OptionComponent(props: ReactSelectModule.OptionComponentProps) { const {option, isFocused, isSelected} = props; return ( {isSelected ? '+' : '-'} {option.label} ); } return ( ); }); it("Input render example", () => { class Component extends React.Component { private readonly onSelectChange: ReactSelectModule.OnChangeSingleHandler = option => { const optionValue: string = option.value; } private readonly inputRenderer: ReactSelectModule.InputRendererHandler = props => { return ; } render() { return ; } } }); it("Input render with false renderer props", () => { false} inputRenderer={props => false} menuRenderer={props => false} optionRenderer={props => false} valueRenderer={props => false} />; }); it("Input render with null renderer props", () => { null} inputRenderer={props => null} menuRenderer={props => null} optionRenderer={props => null} valueRenderer={props => null} />; }); it("Arrow render example", () => { return ( (
)} /> ); }); it("Option render with custom value option", () => { const optionRenderer = (option: ReactSelectModule.Option): ReactSelectModule.HandlerRendererResult => null; ; }); it("Custom option component", () => { class OptionComponent extends React.Component { render() { return
{this.props.option.label}
; } } ; }); it("Value render with custom value option", () => { const valueRenderer = (option: ReactSelectModule.Option): ReactSelectModule.HandlerRendererResult => null; ; }); it("Value render with custom value option and index", () => { const valueRenderer = (option: ReactSelectModule.Option, index: number): ReactSelectModule.HandlerRendererResult => null; ; }); it("No Results renderer with string", () => { ; }); it("No Results renderer with element", () => { no results} />; }); it("onSelectResetsInput", () => { ; }); it("onCloseResetsInput", () => { ; }); it("pageSize", () => { ; }); it("removeSelected", () => { ; }); it("rtl", () => { ; }); });