import { Button, IconName, IPopoverProps, Menu, MenuDivider, MenuItem, Popover, Position, } from '@blueprintjs/core'; import { IconNames } from '@blueprintjs/icons'; import { ItemPredicate, ItemRenderer, MultiSelect } from '@blueprintjs/select'; import React from 'react'; import { defaultMemoize } from 'reselect'; import { LocationFilterMode } from './FlowMap.state'; import { Column } from './Boxes'; import { ClassNames } from '@emotion/core'; export interface Props { placeholder: string; items: Item[]; maxItems: number; selectedItems: Item[] | undefined; itemPredicate: ItemPredicate; itemRenderer: ItemRenderer; tagRenderer: (item: Item) => React.ReactNode; onSelected: (item: Item) => void; onRemoved: (item: Item) => void; onCleared: () => void; onQueryChange?: (query: string) => void; locationFilterMode: LocationFilterMode; onLocationFilterModeChange: (mode: LocationFilterMode) => void; } const NoResultsItem = ; const popoverProps: Partial = { minimal: true, usePortal: false, hoverOpenDelay: 0, }; interface State { query: string; } function filterItems( items: Item[], query: string, itemPredicate: ItemPredicate, maxLength: number ) { const matches: Item[] = []; if (!items || items.length === 0) { return matches; } for (const item of items) { if (itemPredicate(query, item)) { matches.push(item); } if (matches.length >= maxLength) { break; } } return matches; } export default class SearchBox extends React.PureComponent, State> { state = { query: '', }; getFilteredItems = defaultMemoize(filterItems); render() { const { items, selectedItems, itemRenderer, placeholder, tagRenderer, onCleared, onSelected, itemPredicate, maxItems, locationFilterMode, onLocationFilterModeChange, } = this.props; const { query } = this.state; const tagInputProps = { placeholder, onRemove: this.handleItemRemoved, leftIcon: IconNames.SEARCH as IconName, rightElement: selectedItems && selectedItems.length > 0 ? (