import * as React from 'react'; import * as classNames from 'classnames'; import * as numeral from 'numeral'; import * as _isEmpty from 'lodash.isempty'; import {ChangeEvent, Component, HTMLProps, MouseEvent, ReactEventHandler, ReactNode, SFC} from 'react'; import {Dropdown, DropdownItem, DropdownMenu, DropdownToggle, Icon} from './../'; import {SelectOption, ViewMode} from './models'; import {getIconName} from './utils/viewMode'; export interface HeaderProps { hideSearchByField: boolean; hideToggleFilterButton: boolean; hideViewModeButton: boolean; hideTotalInfo: boolean; mainButton: HTMLProps; noSearchBarCollapse: boolean; searchPropertyOptions: SelectOption[]; searchPropertyValue: string; searchInputPlaceholder: string; searchTerm: string; total: number; viewMode: ViewMode; viewModeButtons: ViewMode[]; viewModeCustomElement: ReactNode; onTypeSearchTerm: (term: string) => void; onChangeSearchProperty: (e: ChangeEvent) => void; onChangeViewMode: (viewMode: ViewMode) => void; onClickToggleFiltersButton: (e: MouseEvent) => void; } export interface State { showSearchInput: boolean; viewModeMenuActive: boolean; } export class DatagridHeader extends Component { private searchInput: HTMLInputElement; constructor(props: HeaderProps) { super(props); const {noSearchBarCollapse, viewMode} = props; this.state = { showSearchInput: noSearchBarCollapse, viewModeMenuActive: false, }; } render() { const { hideSearchByField, hideToggleFilterButton, hideViewModeButton, hideTotalInfo, mainButton, noSearchBarCollapse, searchInputPlaceholder, searchPropertyOptions, searchPropertyValue, searchTerm, total, viewMode, viewModeCustomElement, onTypeSearchTerm, onChangeSearchProperty, onChangeViewMode, onClickToggleFiltersButton} = this.props; const {showSearchInput, viewModeMenuActive} = this.state; return (
{this.renderMainButton()}
this.searchInput = instance} type="search" value={searchTerm} onChange={this.handleSearchTermChange} />
{(!hideSearchByField && searchPropertyOptions.length !== 0) && (
By
)} {!noSearchBarCollapse && ( )}
{!hideTotalInfo && ( {numeral(total).format('0,0')} found )} {viewModeCustomElement || !hideViewModeButton && ( {viewMode === ViewMode.Table && } {viewMode === ViewMode.Cards && } {viewMode === ViewMode.Map && } {this.renderViewModeButtons()} )} {!hideToggleFilterButton && ( )}
); } renderMainButton() { const {mainButton} = this.props; if (!mainButton) { return null; } const {children, ...otherMainButtonProps} = mainButton; return ( ); } renderOptions = () => { const options = this.props.searchPropertyOptions; return options.map(o => ); } renderViewModeButtons = () => { const {viewMode, viewModeButtons} = this.props; return viewModeButtons .filter(button => button !== viewMode) .map(button => ( )); } handleViewModeChange = (viewMode: ViewMode) => () => { this.props.onChangeViewMode(viewMode); this.toggleViewModeMenu(); } handleSearchTermChange = (e: ChangeEvent) => { this.props.onTypeSearchTerm(e.target.value); } handleRemoveIconClick = () => { this.props.onTypeSearchTerm(''); this.searchInput.focus(); } handleSearchIconClick = () => { this.searchInput.focus(); } toggleHeaderRightContainer = () => { this.setState({showSearchInput: !this.state.showSearchInput}); } toggleViewModeMenu = () => { this.setState({viewModeMenuActive: !this.state.viewModeMenuActive}); }; }