import * as React from "react"; import ReactSelect, * as ReactSelectModule from "react-select"; 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 selectRef = (component: ReactSelect) => { component.focus(); } 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 onSelectChange: ReactSelectModule.OnChangeSingleHandler = (option) => { const optionValue: string = option.value; } render() { return ; } } }); it("onValueClick", () => { class Component extends React.Component { private 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 onValueClick: ReactSelectModule.OnValueClickHandler = (option) => { const optionValue: CustomValueType = option.value; } render() { return ; } } }); it("Custom value onChange", () => { class Component extends React.Component { private onSelectChange: ReactSelectModule.OnChangeSingleHandler = (option) => { const optionValue: CustomValueType = option.value; } render() { return ; } } }); it("Menu renderer example", () => { class Component extends React.Component { private onSelectChange: ReactSelectModule.OnChangeSingleHandler = option => { const optionValue: string = option.value; } private menuRenderer: ReactSelectModule.MenuRendererHandler = props => { const options = props.options.map(option => { return
{option.label}
; }); return
{options}
; } render() { return ; } } }); it("Menu renderer with custom value type example", () => { class Component extends React.Component { private menuRenderer: ReactSelectModule.MenuRendererHandler = props => { const options = props.options.map(option => { return (
props.selectValue(option)}> {option.label}
); }); return
{options}
; } render() { return ; } } }); it("Input render example", () => { class Component extends React.Component { private onSelectChange: ReactSelectModule.OnChangeSingleHandler = option => { const optionValue: string = option.value; } private 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("Option render with custom value option", () => { const optionRenderer = (option: ReactSelectModule.Option): ReactSelectModule.HandlerRendererResult => null; ; }); it("Value render with custom value option", () => { const valueRenderer = (option: ReactSelectModule.Option): ReactSelectModule.HandlerRendererResult => null; ; }); it("No Results renderer with string", () => { ; }); it("No Results renderer with element", () => { no results} />; }); });