X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/9dcc70fc137fac02991f3ebe830748badb4eab35..e6039bec0497aa7e1391958e5c4f84bbaeef653e:/src/views/project-panel/project-panel.tsx diff --git a/src/views/project-panel/project-panel.tsx b/src/views/project-panel/project-panel.tsx index 3d7d89492c..2fdb715ffa 100644 --- a/src/views/project-panel/project-panel.tsx +++ b/src/views/project-panel/project-panel.tsx @@ -4,104 +4,69 @@ import * as React from 'react'; import { ProjectPanelItem } from './project-panel-item'; -import { Grid, Typography, Button, Toolbar, StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core'; +import { Grid, Typography, Button, StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core'; import { formatDate, formatFileSize } from '../../common/formatters'; import DataExplorer from "../../views-components/data-explorer/data-explorer"; -import { DataColumn, toggleSortDirection } from '../../components/data-table/data-column'; -import { DataTableFilterItem } from '../../components/data-table-filters/data-table-filters'; -import { ContextMenuAction } from '../../components/context-menu/context-menu'; import { DispatchProp, connect } from 'react-redux'; -import actions from "../../store/data-explorer/data-explorer-action"; import { DataColumns } from '../../components/data-table/data-table'; -import { ResourceKind } from "../../models/resource"; import { RouteComponentProps } from 'react-router'; import { RootState } from '../../store/store'; -import DialogProjectCreate from '../../components/dialog-create/dialog-project-create'; +import { DataTableFilterItem } from '../../components/data-table-filters/data-table-filters'; +import { ContainerRequestState } from '../../models/container-request'; +import { SortDirection } from '../../components/data-table/data-column'; +import { ResourceKind } from '../../models/resource'; +import { resourceLabel } from '../../common/labels'; export const PROJECT_PANEL_ID = "projectPanel"; +export interface ProjectPanelFilter extends DataTableFilterItem { + type: ResourceKind | ContainerRequestState; +} + type ProjectPanelProps = { currentItemId: string, onItemClick: (item: ProjectPanelItem) => void, - onItemRouteChange: (itemId: string) => void, - handleCreationDialogOpen: () => void; - handleCreationDialogClose: () => void; - isCreationDialogOpen: boolean; + onContextMenu: (event: React.MouseEvent, item: ProjectPanelItem) => void; + onDialogOpen: (ownerUuid: string) => void; + onItemDoubleClick: (item: ProjectPanelItem) => void, + onItemRouteChange: (itemId: string) => void } & DispatchProp & WithStyles & RouteComponentProps<{ id: string }>; -class ProjectPanel extends React.Component { - state = { - open: false, - }; +class ProjectPanel extends React.Component { render() { + const { classes, currentItemId, onItemClick, onItemDoubleClick, onContextMenu, onDialogOpen } = this.props; return
-
- - - -
; + onRowDoubleClick={this.props.onItemDoubleClick} + onContextMenu={this.props.onContextMenu} + extractKey={(item: ProjectPanelItem) => item.uuid} />
; } - - componentDidMount() { - this.props.dispatch(actions.SET_COLUMNS({ id: PROJECT_PANEL_ID, columns })); + + handleNewProjectClick = () => { + this.props.onDialogOpen(this.props.currentItemId); } - - componentWillReceiveProps({ match, currentItemId }: ProjectPanelProps) { + componentWillReceiveProps({ match, currentItemId, onItemRouteChange }: ProjectPanelProps) { if (match.params.id !== currentItemId) { - this.props.onItemRouteChange(match.params.id); + onItemRouteChange(match.params.id); } } - - toggleColumn = (toggledColumn: DataColumn) => { - this.props.dispatch(actions.TOGGLE_COLUMN({ id: PROJECT_PANEL_ID, columnName: toggledColumn.name })); - } - - toggleSort = (column: DataColumn) => { - this.props.dispatch(actions.TOGGLE_SORT({ id: PROJECT_PANEL_ID, columnName: column.name })); - } - - changeFilters = (filters: DataTableFilterItem[], column: DataColumn) => { - this.props.dispatch(actions.SET_FILTERS({ id: PROJECT_PANEL_ID, columnName: column.name, filters })); - } - - executeAction = (action: ContextMenuAction, item: ProjectPanelItem) => { - alert(`Executing ${action.name} on ${item.name}`); - } - - search = (searchValue: string) => { - this.props.dispatch(actions.SET_SEARCH_VALUE({ id: PROJECT_PANEL_ID, searchValue })); - } - - changePage = (page: number) => { - this.props.dispatch(actions.SET_PAGE({ id: PROJECT_PANEL_ID, page })); - } - - changeRowsPerPage = (rowsPerPage: number) => { - this.props.dispatch(actions.SET_ROWS_PER_PAGE({ id: PROJECT_PANEL_ID, rowsPerPage })); - } - } type CssRules = "toolbar" | "button"; @@ -135,10 +100,12 @@ const renderName = (item: ProjectPanelItem) => const renderIcon = (item: ProjectPanelItem) => { switch (item.kind) { - case ResourceKind.PROJECT: + case ResourceKind.Project: return ; - case ResourceKind.COLLECTION: - return ; + case ResourceKind.Collection: + return ; + case ResourceKind.Process: + return ; default: return ; } @@ -159,80 +126,87 @@ const renderOwner = (owner: string) => {owner} ; -const renderType = (type: string) => - - {type} +const renderType = (type: string) => { + return + {resourceLabel(type)} ; +}; const renderStatus = (item: ProjectPanelItem) => {item.status || "-"} ; -const columns: DataColumns = [{ - name: "Name", +export enum ProjectPanelColumnNames { + Name = "Name", + Status = "Status", + Type = "Type", + Owner = "Owner", + FileSize = "File size", + LastModified = "Last modified" + +} + +export const columns: DataColumns = [{ + name: ProjectPanelColumnNames.Name, selected: true, - sortDirection: "desc", + sortDirection: SortDirection.Asc, render: renderName, width: "450px" }, { name: "Status", selected: true, + filters: [{ + name: ContainerRequestState.Committed, + selected: true, + type: ContainerRequestState.Committed + }, { + name: ContainerRequestState.Final, + selected: true, + type: ContainerRequestState.Final + }, { + name: ContainerRequestState.Uncommitted, + selected: true, + type: ContainerRequestState.Uncommitted + }], render: renderStatus, width: "75px" }, { - name: "Type", + name: ProjectPanelColumnNames.Type, selected: true, filters: [{ - name: "Collection", - selected: true + name: resourceLabel(ResourceKind.Collection), + selected: true, + type: ResourceKind.Collection + }, { + name: resourceLabel(ResourceKind.Process), + selected: true, + type: ResourceKind.Process }, { - name: "Project", - selected: true + name: resourceLabel(ResourceKind.Project), + selected: true, + type: ResourceKind.Project }], render: item => renderType(item.kind), width: "125px" }, { - name: "Owner", + name: ProjectPanelColumnNames.Owner, selected: true, render: item => renderOwner(item.owner), width: "200px" }, { - name: "File size", + name: ProjectPanelColumnNames.FileSize, selected: true, render: item => renderFileSize(item.fileSize), width: "50px" }, { - name: "Last modified", + name: ProjectPanelColumnNames.LastModified, selected: true, - sortDirection: "none", + sortDirection: SortDirection.None, render: item => renderDate(item.lastModified), width: "150px" }]; -const contextMenuActions = [[{ - icon: "fas fa-users fa-fw", - name: "Share" -}, { - icon: "fas fa-sign-out-alt fa-fw", - name: "Move to" -}, { - icon: "fas fa-star fa-fw", - name: "Add to favourite" -}, { - icon: "fas fa-edit fa-fw", - name: "Rename" -}, { - icon: "fas fa-copy fa-fw", - name: "Make a copy" -}, { - icon: "fas fa-download fa-fw", - name: "Download" -}], [{ - icon: "fas fa-trash-alt fa-fw", - name: "Remove" -} -]]; export default withStyles(styles)( connect((state: RootState) => ({ currentItemId: state.projects.currentItemId }))(