/** * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * Materialize dropdown inspired quickselect list. * * *requires materialize js & css to be included on your html page. * * USAGE: * * class MyQuickSelect extends React.Component { * generateActiveView = (item: any) => { * return
{item.foo}
; * } * generateListView = (item: any) => { * return
{item.foo}
; * } * onSelectedItemChanged = (item: any) => { * console.log('selected item is ' + item.foo); * } * render() { * let items = [{foo:'Hello'},{foo:'World'}]; * return ; * } * } * */ import * as React from 'react'; export interface QuickSelectProps { items: Array; selectedItemIndex?: any; activeViewComponentGenerator: (item: any) => any; listViewComponentGenerator: (item: any) => any; onSelectedItemChanged: (item: any) => void; } export interface QuickSelectState { selectedIndex: number; } class QuickSelect extends React.Component { private static idCounter: number = 0; private uniqueId: string = 'QuickSelect-' + QuickSelect.idCounter++; constructor(props: QuickSelectProps) { super(props); this.state = { selectedIndex: 0 }; } onItemSelect = (item: any, itemIndex: number) => { this.setState({selectedIndex: itemIndex}); this.props.onSelectedItemChanged(item); } buildListItem = (item: any, itemIndex: number) => { return (
{this.props.listViewComponentGenerator(item)}
); } render() { if (this.props.items.length == 0) return
No Elements
; const selectedIndex = this.props.selectedItemIndex !== undefined ? this.props.selectedItemIndex : this.state.selectedIndex; return(
{this.props.activeViewComponentGenerator(this.props.items[selectedIndex])}
{this.props.items.map(this.buildListItem)}
); } } export default QuickSelect;