import * as React from 'react'; import { Observable } from 'rxjs'; import { BaseView, BaseViewProps } from '../../React'; import { CommonPanel, CommonPanelRenderProps, } from '../CommonPanel/CommonPanel'; import { DataGridProps, DataGridView } from '../DataGrid/DataGridView'; import { PanelItemContext } from '../Panel/Panel'; import { SearchProps, SearchView } from '../Search/SearchView'; import { ItemListPanelViewModel } from './ItemListPanelViewModel'; export interface ItemListPanelProps< T = {}, TContext extends PanelItemContext = PanelItemContext > extends DataGridProps, CommonPanelRenderProps { search?: boolean | SearchProps | {}; } export interface ItemListPanelViewProps extends BaseViewProps>, ItemListPanelProps {} export class ItemListPanelView extends BaseView< ItemListPanelViewProps, ItemListPanelViewModel<{}> > { public static displayName = 'ItemListPanelView'; static defaultProps: Partial = {}; constructor(props: any) { super(props); this.handleSearchClick = this.handleSearchClick.bind(this); } updateOn(viewModel: Readonly>) { return [viewModel.isLoading.changed]; } render() { const { className, children, props, rest } = this.restProps(x => { const { search, pager, loadingContent, view, viewProps, viewTemplate, itemsPanelTemplate, itemTemplate, itemClassName, itemStyle, itemProps, compact, emptyContent, } = x; return { search, pager, loadingContent, view, viewProps, viewTemplate, itemsPanelTemplate, itemTemplate, itemClassName, itemStyle, itemProps, compact, emptyContent, }; }); const searchView = props.search && this.viewModel.search && (React.isValidElement(props.search) ? ( props.search ) : ( )); const headerFormat = this.props.headerFormat == null && searchView != null ? (content: any) => this.renderPanelHeader(content, searchView) : undefined; return ( {this.renderDataGrid(props)} ); } protected renderPanelHeader(content: any, searchView: any) { return (
{content} {searchView}
); } protected renderDataGrid(props: ItemListPanelProps) { const { search, ...dataGridProps } = props; return ( {this.props.children} ); } protected handleSearchClick(e: React.MouseEvent) { e.stopPropagation(); } }