import * as React from 'react'; import { Icon } from 'react-fa'; import { Observable } from 'rxjs'; import { SortDirection } from '../../../Utils/Compare'; import { BaseView, BaseViewProps } from '../../React'; import { CommandButton } from '../CommandButton/CommandButton'; import { GridView } from '../ListItems/GridView'; import { GridViewColumns } from '../ListItems/GridViewColumn'; import { ListItemsProps, ListItemsView } from '../ListItems/ListItemsView'; import { Loading } from '../Loading/Loading'; import { PagerProps, PagerView } from '../Pager/PagerView'; import { PanelFragment, PanelItemContext } from '../Panel/Panel'; import { DataGridViewModel, DataSourceRequest } from './DataGridViewModel'; export interface DataGridProps< T = {}, TContext extends PanelItemContext = PanelItemContext > extends ListItemsProps { pager?: boolean | PagerProps | {}; loadingContent?: React.ReactNode | (() => React.ReactNode); } export interface DataGridViewProps extends BaseViewProps>, DataGridProps { fill?: boolean; } export class DataGridView extends BaseView< DataGridViewProps, DataGridViewModel<{}> > { public static displayName = 'DataGridView'; public static readonly Columns = GridViewColumns; static defaultProps: Partial = { loadingContent: 'Loading Data...', }; constructor(props: any) { super(props); this.renderHeader = this.renderHeader.bind(this); } updateOn(viewModel: Readonly>) { return [viewModel.isLoading.changed]; } render() { const { className, children, props, rest } = this.restProps(x => { const { pager, loadingContent, fill, view, viewProps, viewTemplate, itemsPanelTemplate, itemTemplate, itemClassName, itemStyle, itemProps, compact, emptyContent, } = x; return { pager, loadingContent, fill, view, viewProps, viewTemplate, itemsPanelTemplate, itemTemplate, itemClassName, itemStyle, itemProps, compact, emptyContent, }; }); return (
{Loading.renderLoadable( this.viewModel.isLoading, props.loadingContent!, () => { const dataGridView = ListItemsView.getListItemsView( this.props, this.renderDefaultDataGridView.bind(this), ); const pagerView = props.pager && this.viewModel.pager && (React.isValidElement(props.pager) ? ( props.pager ) : ( )); return (
{pagerView}
); }, )}
); } protected renderDefaultDataGridView(props: DataGridProps) { return ( {props.children} ); } protected renderHeader( fragment: PanelFragment, item: {} | undefined, field: string | undefined, ) { if (field == null) { return fragment; } return ( {fragment} {this.renderSortIcon(field, this.viewModel.requests.value)} ); } protected renderSortIcon( field: string | undefined, request: DataSourceRequest | undefined, ) { const iconName = this.getSortIconName(field, request); if (String.isNullOrEmpty(iconName)) { return null; } return ; } protected getSortIconName( field: string | undefined, request: DataSourceRequest | undefined, ) { if ( request == null || request.sort == null || request.sort.field == null || request.sort.direction == null || request.sort.field !== field ) { return undefined; } if (request.sort.direction === SortDirection.Ascending) { return 'sort-asc'; } else if (request.sort.direction === SortDirection.Descending) { return 'sort-desc'; } return undefined; } }