rowsPerPageOptions: number[];
page: number;
contextMenuColumn: boolean;
- noItemsPlaceholder?: React.ReactNode;
+ dataTableDefaultView?: React.ReactNode;
}
interface DataExplorerActionProps<T> {
columns, onContextMenu, onFiltersChange, onSortToggle, extractKey,
rowsPerPage, rowsPerPageOptions, onColumnToggle, searchValue, onSearch,
items, itemsAvailable, onRowClick, onRowDoubleClick, classes,
- noItemsPlaceholder
+ dataTableDefaultView
} = this.props;
return <Paper>
<Toolbar className={classes.toolbar}>
onFiltersChange={onFiltersChange}
onSortToggle={onSortToggle}
extractKey={extractKey}
- noItemsPlaceholder={noItemsPlaceholder}
+ defaultView={dataTableDefaultView}
/>
<Toolbar>
<Grid container justify="flex-end">
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as React from 'react';
+import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles';
+import { DefaultViewDataProps, DefaultView } from '~/components/default-view/default-view';
+import { ArvadosTheme } from '~/common/custom-theme';
+import { DetailsIcon } from '~/components/icon/icon';
+
+type CssRules = 'classRoot';
+
+const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
+ classRoot: {
+ marginTop: theme.spacing.unit * 4,
+ marginBottom: theme.spacing.unit * 4,
+ },
+});
+type DataTableDefaultViewDataProps = Partial<Pick<DefaultViewDataProps, 'icon' | 'messages'>>;
+type DataTableDefaultViewProps = DataTableDefaultViewDataProps & WithStyles<CssRules>;
+
+export const DataTableDefaultView = withStyles(styles)(
+ ({ classes, ...props }: DataTableDefaultViewProps) => {
+ const icon = props.icon || DetailsIcon;
+ const messages = props.messages || ['No items found'];
+ return <DefaultView {...classes} {...{ icon, messages }} />;
+ });
import { Table, TableBody, TableRow, TableCell, TableHead, TableSortLabel, StyleRulesCallback, Theme, WithStyles, withStyles } from '@material-ui/core';
import { DataColumn, SortDirection } from './data-column';
import { DataTableFilters, DataTableFilterItem } from "../data-table-filters/data-table-filters";
-import { DefaultView } from '~/components/default-view/default-view';
-import { DetailsIcon } from '~/components/icon/icon';
+import { DataTableDefaultView } from '../data-table-default-view/data-table-default-view';
export type DataColumns<T, F extends DataTableFilterItem = DataTableFilterItem> = Array<DataColumn<T, F>>;
onSortToggle: (column: DataColumn<T>) => void;
onFiltersChange: (filters: DataTableFilterItem[], column: DataColumn<T>) => void;
extractKey?: (item: T) => React.Key;
- noItemsPlaceholder?: React.ReactNode;
+ defaultView?: React.ReactNode;
}
-type CssRules = "tableBody" | "root" | "content" | "noItemsInfo" | "noItemsPlaceholder";
+type CssRules = "tableBody" | "root" | "content" | "noItemsInfo";
const styles: StyleRulesCallback<CssRules> = (theme: Theme) => ({
root: {
textAlign: "center",
padding: theme.spacing.unit
},
- noItemsPlaceholder: {
- marginTop: theme.spacing.unit * 4,
- marginBottom: theme.spacing.unit * 4,
- }
});
type DataTableProps<T> = DataTableDataProps<T> & WithStyles<CssRules>;
}
renderNoItemsPlaceholder = () => {
- return this.props.noItemsPlaceholder
- ? this.props.noItemsPlaceholder
- : <div className={this.props.classes.noItemsPlaceholder}>
- <DefaultView icon={DetailsIcon} messages={['No items found']} />
- </div>;
+ return this.props.defaultView
+ ? this.props.defaultView
+ : <DataTableDefaultView />;
}
renderHeadCell = (column: DataColumn<T>, index: number) => {
import { FavoritesState } from '../../store/favorites/favorites-reducer';
import { RootState } from '~/store/store';
import { PanelDefaultView } from '~/components/panel-default-view/panel-default-view';
+import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
type CssRules = "toolbar" | "button";
onRowClick={this.props.onItemClick}
onRowDoubleClick={this.props.onItemDoubleClick}
onContextMenu={this.props.onContextMenu}
- contextMenuColumn={true} />
+ contextMenuColumn={true}
+ dataTableDefaultView={<DataTableDefaultView icon={FavoriteIcon}/>} />
: <PanelDefaultView
icon={FavoriteIcon}
messages={['Your favorites list is empty.']} />;
import { openProjectCreateDialog } from '~/store/projects/project-create-actions';
import { filterResources } from '~/store/resources/resources';
import { PanelDefaultView } from '~/components/panel-default-view/panel-default-view';
+import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
type CssRules = 'root' | "toolbar" | "button";
onRowClick={this.handleRowClick}
onRowDoubleClick={this.handleRowDoubleClick}
onContextMenu={this.handleContextMenu}
- contextMenuColumn={true} />
+ contextMenuColumn={true}
+ dataTableDefaultView={<DataTableDefaultView icon={ProjectIcon}/>} />
: <PanelDefaultView
icon={ProjectIcon}
messages={['Your project is empty.', 'Please create a project or create a collection and upload a data.']} />
import { ContextMenuKind } from "~/views-components/context-menu/context-menu";
import { Dispatch } from "redux";
import { PanelDefaultView } from '~/components/panel-default-view/panel-default-view';
+import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
type CssRules = "toolbar" | "button";
onRowClick={this.handleRowClick}
onRowDoubleClick={this.handleRowDoubleClick}
onContextMenu={this.handleContextMenu}
- contextMenuColumn={false} />
+ contextMenuColumn={false}
+ dataTableDefaultView={<DataTableDefaultView icon={TrashIcon}/>} />
: <PanelDefaultView
icon={TrashIcon}
messages={['Your trash list is empty.']} />;