import * as React from 'react'; import styled from '../../styled-components'; import { IMenuItem } from '../../services/MenuStore'; import { SearchStore } from '../../services/SearchStore'; import { MenuItem } from '../SideMenu/MenuItem'; import { MenuItemLabel } from '../SideMenu/styled.elements'; import { MarkerService } from '../../services/MarkerService'; import { SearchDocument } from '../../services/SearchWorker.worker'; const SearchInput = styled.input.attrs({ className: 'search-input', })` width: calc(100% - ${props => props.theme.spacingUnit * 2}px); box-sizing: border-box; margin: 0 ${props => props.theme.spacingUnit}px; padding: 5px 0 5px ${props => props.theme.spacingUnit}px; border: 0; border-bottom: 1px solid #e1e1e1; font-weight: bold; font-size: 13px; color: ${props => props.theme.colors.text}; background-color: transparent; outline: none; `; const SearchIcon = styled((props: any) => ( )).attrs({ className: 'search-icon', })` position: absolute; left: ${props => props.theme.spacingUnit}px; height: 1.8em; width: 0.9em; path { fill: ${props => props.theme.colors.text}; } `; const SearchResultsBox = styled.div.attrs({ className: 'search-results', })` padding: ${props => props.theme.spacingUnit / 4}px 0; background-color: #ededed; min-height: 150px; max-height: 250px; border-top: 1px solid #e1e1e1; border-bottom: 1px solid #e1e1e1; margin-top: 10px; line-height: 1.4; font-size: 0.9em; overflow: auto; ${MenuItemLabel} { padding-top: 6px; padding-bottom: 6px; &:hover { background-color: #e1e1e1; } > svg { display: none; } } `; export interface SearchBoxProps { search: SearchStore; marker: MarkerService; getItemById: (id: string) => IMenuItem | undefined; onActivate: (item: IMenuItem) => void; } export interface SearchBoxState { results: any; term: string; } export class SearchBox extends React.PureComponent { constructor(props) { super(props); this.state = { results: [], term: '', }; } clearResults(term: string) { this.setState({ results: [], term, }); this.props.marker.unmark(); } clear() { this.setState({ results: [], term: '', }); this.props.marker.unmark(); } clearIfEsq = event => { if (event && event.keyCode === 27) { this.clear(); } }; setResults(results: SearchDocument[], term: string) { this.setState({ results, term, }); this.props.marker.mark(term); } search = (event: React.ChangeEvent) => { const q = event.target.value; if (q.length < 3) { this.clearResults(q); return; } this.setState({ term: q, }); this.props.search.search(event.target.value).then(res => { this.setResults(res, q); }); }; render() { const items: IMenuItem[] = this.state.results.map(res => this.props.getItemById(res.id)); items.sort((a, b) => (a.depth > b.depth ? 1 : a.depth < b.depth ? -1 : 0)); return (
{items.length > 0 && ( {items.map(item => ( ))} )}
); } }