// region Imports import * as React from 'react'; import * as ReactDOM from 'react-dom'; import Autosuggest = require('react-autosuggest'); // endregion interface Language { name: string; year: number; } // https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expression // s#Using_Special_Characters function escapeRegexCharacters(str: string): string { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } export class ReactAutosuggestBasicTest extends React.Component { // region Fields static languages: Language[] = [ { name: 'C', year: 1972 }, { name: 'C#', year: 2000 }, { name: 'C++', year: 1983 }, { name: 'Clojure', year: 2007 }, { name: 'Elm', year: 2012 }, { name: 'Go', year: 2009 }, { name: 'Haskell', year: 1990 }, { name: 'Java', year: 1995 }, { name: 'Javascript', year: 1995 }, { name: 'Perl', year: 1987 }, { name: 'PHP', year: 1995 }, { name: 'Python', year: 1991 }, { name: 'Ruby', year: 1995 }, { name: 'Scala', year: 2003 } ]; // endregion region Constructor state = { value: '', suggestions: this.getSuggestions('') }; // endregion region Rendering methods render(): JSX.Element { const {value, suggestions} = this.state; const theme = { input: 'themed-input-class', container: 'themed-container-class', suggestionFocused: 'active', sectionTitle: { color: 'blue' } }; return this.onChange(e, changeEvent), onBlur: (e) => { console.log(e.relatedTarget); } }} theme={theme}/>; } protected onSuggestionsSelected(event: React.FormEvent, data: Autosuggest.SuggestionSelectedEventData): void { alert(`Selected language is ${data.suggestion.name} (${data.suggestion.year}).`); } protected renderSuggestion(suggestion: Language, params: Autosuggest.RenderSuggestionParams): JSX.Element { const className = params.isHighlighted ? "highlighted" : undefined; return {suggestion.name}; } // endregion region Event handlers protected onChange(event: React.FormEvent, {newValue, method}: Autosuggest.ChangeEvent): void { this.setState({value: newValue}); } protected onSuggestionsFetchRequested({value}: any): void { this.setState({ suggestions: this.getSuggestions(value) }); } // endregion region Helper methods protected getSuggestions(value: string): Language[] { const escapedValue = escapeRegexCharacters(value.trim()); if (escapedValue === '') { return []; } const regex = new RegExp('^' + escapedValue, 'i'); return ReactAutosuggestBasicTest .languages .filter(language => regex.test(language.name)); } protected getSuggestionValue(suggestion: Language): string { return suggestion.name; } // endregion } const LanguageAutosuggestSingle = Autosuggest as { new (): Autosuggest }; const LanguageAutosuggestMulti = Autosuggest as { new (): Autosuggest }; export class ReactAutosuggestTypedTest extends React.Component { // region Fields static languages: Language[] = [ { name: 'C', year: 1972 }, { name: 'C#', year: 2000 }, { name: 'C++', year: 1983 }, { name: 'Clojure', year: 2007 }, { name: 'Elm', year: 2012 }, { name: 'Go', year: 2009 }, { name: 'Haskell', year: 1990 }, { name: 'Java', year: 1995 }, { name: 'Javascript', year: 1995 }, { name: 'Perl', year: 1987 }, { name: 'PHP', year: 1995 }, { name: 'Python', year: 1991 }, { name: 'Ruby', year: 1995 }, { name: 'Scala', year: 2003 } ]; // endregion region Constructor state = { value: '', suggestions: this.getSuggestions('') }; // endregion region Rendering methods render(): JSX.Element { const {value, suggestions} = this.state; const theme = { input: 'themed-input-class', container: 'themed-container-class', suggestionFocused: 'active', sectionTitle: { color: 'blue' } }; return this.onChange(e, changeEvent), }} theme={theme}/>; } protected onSuggestionsSelected(event: React.FormEvent, data: Autosuggest.SuggestionSelectedEventData): void { alert(`Selected language is ${data.suggestion.name} (${data.suggestion.year}).`); } protected renderSuggestion(suggestion: Language, params: Autosuggest.RenderSuggestionParams): JSX.Element { const className = params.isHighlighted ? "highlighted" : undefined; return {suggestion.name}; } // endregion region Event handlers protected onChange(event: React.FormEvent, {newValue, method}: Autosuggest.ChangeEvent): void { this.setState({value: newValue}); } protected onSuggestionsFetchRequested({value}: any): void { this.setState({ suggestions: this.getSuggestions(value) }); } // endregion region Helper methods protected getSuggestions(value: string): Language[] { const escapedValue = escapeRegexCharacters(value.trim()); if (escapedValue === '') { return []; } const regex = new RegExp('^' + escapedValue, 'i'); return ReactAutosuggestBasicTest .languages .filter(language => regex.test(language.name)); } protected getSuggestionValue(suggestion: Language): string { return suggestion.name; } // endregion } ReactDOM.render( , document.getElementById('app')); interface LanguageGroup { title: string; languages: Language[]; } export class ReactAutosuggestMultipleTest extends React.Component { // region Fields static languages: LanguageGroup[] = [ { title: '1970s', languages: [ { name: 'C', year: 1972 } ] }, { title: '1980s', languages: [ { name: 'C++', year: 1983 }, { name: 'Perl', year: 1987 } ] }, { title: '1990s', languages: [ { name: 'Haskell', year: 1990 }, { name: 'Python', year: 1991 }, { name: 'Java', year: 1995 }, { name: 'Javascript', year: 1995 }, { name: 'PHP', year: 1995 }, { name: 'Ruby', year: 1995 } ] }, { title: '2000s', languages: [ { name: 'C#', year: 2000 }, { name: 'Scala', year: 2003 }, { name: 'Clojure', year: 2007 }, { name: 'Go', year: 2009 } ] }, { title: '2010s', languages: [ { name: 'Elm', year: 2012 } ] } ]; state: any; // endregion region Constructor constructor(props: any) { super(props); this.state = { value: '', suggestions: this.getSuggestions(''), highlighted: '' }; } // endregion region Rendering methods render(): JSX.Element { const {value, suggestions} = this.state; return this.onChange(e, changeEvent), }}/>; } protected onSuggestionSelected(event: React.FormEvent, data: Autosuggest.SuggestionSelectedEventData): void { const language: Language = data.suggestion; alert(`Selected language is ${language.name} (${language.year}).`); } protected renderSuggestion(suggestion: Language, params: Autosuggest.RenderSuggestionParams): JSX.Element { const className = params.isHighlighted ? "highlighted" : undefined; return {suggestion.name}; } protected renderSectionTitle(section: LanguageGroup): JSX.Element { return {section.title}; } protected renderInputComponent(inputProps: Autosuggest.InputProps): JSX.Element { const { onChange, onBlur, ...restInputProps } = inputProps; return (
); } protected renderSuggestionsContainer({containerProps, children, query}: Autosuggest.RenderSuggestionsContainerParams): JSX.Element { return (
{children}
); } // endregion region Event handlers protected onChange(event: React.FormEvent, {newValue, method}: Autosuggest.ChangeEvent): void { this.setState({value: newValue}); } protected onSuggestionsFetchRequested({value}: any): void { this.setState({ suggestions: this.getSuggestions(value) }); } // endregion region Helper methods protected getSuggestions(value: string): LanguageGroup[] { const escapedValue = escapeRegexCharacters(value.trim()); if (escapedValue === '') { return []; } const regex = new RegExp('^' + escapedValue, 'i'); return ReactAutosuggestMultipleTest .languages .map(section => { return { title: section.title, languages: section .languages .filter(language => regex.test(language.name)) }; }) .filter(section => section.languages.length > 0); } protected getSuggestionValue(suggestion: Language) { return suggestion.name; } protected getSectionSuggestions(section: LanguageGroup) { return section.languages; } protected onSuggestionHighlighted(params: Autosuggest.SuggestionHighlightedParams): void { this.setState({ highlighted: params.suggestion }); } // endregion } ReactDOM.render( , document.getElementById('app')); interface Person { first: string; last: string; twitter: string; } const PersonAutosuggest = Autosuggest as { new (): Autosuggest }; export class ReactAutosuggestCustomTest extends React.Component { // region Fields static people: Person[] = [ { first: 'Charlie', last: 'Brown', twitter: 'dancounsell' }, { first: 'Charlotte', last: 'White', twitter: 'mtnmissy' }, { first: 'Chloe', last: 'Jones', twitter: 'ladylexy' }, { first: 'Cooper', last: 'King', twitter: 'steveodom' } ]; // endregion region Constructor state = { value: '', suggestions: this.getSuggestions('') }; // endregion region Rendering methods render(): JSX.Element { const {value, suggestions} = this.state; return this.onChange(e, changeEvent), }}/>; } protected renderSuggestion(suggestion: Person, params: Autosuggest.RenderSuggestionParams): JSX.Element { const suggestionText = `${suggestion.first} ${suggestion.last}`; const query = params.query.trim(); const parts = suggestionText .split(' ') .map((part: string) => { return { highlight: (Math.ceil(Math.random() * 10)) % 2, text: part }; }); return {parts.map((part, index) => { const className = part.highlight ? 'highlight' : undefined; return{part.text}; }) } ; } // endregion region Event handlers protected onChange(event: React.FormEvent, {newValue, method}: Autosuggest.ChangeEvent): void { this.setState({value: newValue}); } protected onSuggestionsFetchRequested({value}: any): void { this.setState({ suggestions: this.getSuggestions(value) }); } // endregion region Helper methods protected getSuggestions(value: string): Person[] { const escapedValue = escapeRegexCharacters(value.trim()); if (escapedValue === '') { return []; } const regex = new RegExp('\\b' + escapedValue, 'i'); return ReactAutosuggestCustomTest .people .filter(person => regex.test(this.getSuggestionValue(person))); } protected getSuggestionValue(suggestion: Person): string { return `${suggestion.first} ${suggestion.last}`; } // endregion } ReactDOM.render( , document.getElementById('app')); const test: Autosuggest.InputProps<{ foo: string }> = { onChange: () => {}, value: 'foo', anything: false // $ExpectError }; function testSingleSection() { const suggestions: string[] = []; suggestion} inputProps={{ onChange: () => {}, value: '' }} onSuggestionsFetchRequested={() => {}} renderSuggestion={suggestion => suggestion} />; } function testMultiSections() { interface Section { title: string; suggestions: string[]; } const sections: Section[] = []; section.suggestions} // Required getSuggestionValue={(suggestion: string) => suggestion} inputProps={{ onChange: () => {}, value: '' }} onSuggestionsFetchRequested={() => {}} renderSuggestion={suggestion => suggestion} />; }