import React, { Component } from "react"; import styled from "styled-components"; import { MenuItem, Menu, ControlGroup, InputGroup } from "@blueprintjs/core"; import { BaseButton } from "../designSystems/blueprint/ButtonComponent"; import { ItemRenderer, Select, ItemListRenderer, IItemListRendererProps, } from "@blueprintjs/select"; import { DropdownOption } from "../../widgets/DropdownWidget"; const Dropdown = Select.ofType(); const StyledDropdown = styled(Dropdown)``; class DropdownComponent extends Component { private newItemTextInput: HTMLInputElement | null = null; private setNewItemTextInput = (element: HTMLInputElement | null) => { this.newItemTextInput = element; }; public state = { isEditing: false, }; showTextBox = (): void => { this.setState({ isEditing: true, }); }; handleAddItem = (): void => { this.props.addItem && this.newItemTextInput && this.props.addItem.addItemHandler(this.newItemTextInput.value); this.setState({ isEditing: false, }); }; renderItemList: ItemListRenderer = ( props: IItemListRendererProps, ) => { if (this.props.addItem) { const renderItems = props.items.map(props.renderItem).filter(Boolean); const displayMode = ( ); const editMode = ( ); return ( {renderItems} {!this.state.isEditing ? displayMode : editMode} ); } return ; }; searchItem = (query: string, option: DropdownOption): boolean => { return ( option.label.toLowerCase().indexOf(query.toLowerCase()) > -1 || option.value.toLowerCase().indexOf(query.toLowerCase()) > -1 || (!!option.label && option.label.toLowerCase().indexOf(query.toLowerCase()) > -1) ); }; onItemSelect = (item: DropdownOption): void => { this.props.selectHandler(item.value); }; renderItem: ItemRenderer = ( option: DropdownOption, { handleClick, modifiers }, ) => { if (!modifiers.matchesPredicate) { return null; } return ( ); }; getSelectedDisplayText = () => { if (this.props.selected) { const selectedValue = this.props.selected.value; const item: DropdownOption | undefined = this.props.options.find( option => option.value === selectedValue, ); return item && (item.label || item.label); } return ""; }; render() { return ( } > ); } } export interface DropdownComponentProps { options: DropdownOption[]; selectHandler: (selectedValue: string) => void; selected?: DropdownOption; multiselectDisplayType?: "TAGS" | "CHECKBOXES"; checked?: boolean; multi?: boolean; autocomplete?: boolean; addItem?: { displayText: string; addItemHandler: (name: string) => void; }; } export default DropdownComponent;