From c3945a12b21445b157cfe3ea77f88134c670d88c Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Tue, 26 Jun 2018 15:05:55 +0200 Subject: [PATCH] Implement sorting in projet-panel Feature #13683 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- .../project-explorer/project-explorer.tsx | 30 +++++++------ src/views/project-panel/project-panel.tsx | 42 ++++++++++++++++++- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/src/views-components/project-explorer/project-explorer.tsx b/src/views-components/project-explorer/project-explorer.tsx index 94ae4389..e982553c 100644 --- a/src/views-components/project-explorer/project-explorer.tsx +++ b/src/views-components/project-explorer/project-explorer.tsx @@ -25,6 +25,7 @@ export interface ProjectExplorerContextActions { interface ProjectExplorerProps { items: ProjectExplorerItem[]; onRowClick: (item: ProjectExplorerItem) => void; + onToggleSort: (toggledColumn: DataColumn) => void; } interface ProjectExplorerState { @@ -42,7 +43,7 @@ class ProjectExplorer extends React.Component renderFileSize(item.fileSize), width: "50px" }, { name: "Last modified", selected: true, + sortDirection: "none", render: item => renderDate(item.lastModified), width: "150px" }] @@ -140,14 +141,17 @@ class ProjectExplorer extends React.Component) => { - this.setState({ - columns: this.state.columns.map(column => - column.name === toggledColumn.name - ? toggleSortDirection(column) - : resetSortDirection(column) - ) - }); + toggleSort = (column: DataColumn) => { + const columns = this.state.columns.map(c => + c.name === column.name + ? toggleSortDirection(c) + : resetSortDirection(c) + ); + this.setState({ columns }); + const toggledColumn = columns.find(c => c.name === column.name); + if (toggledColumn) { + this.props.onToggleSort(toggledColumn); + } } changeFilters = (filters: DataTableFilterItem[], updatedColumn: DataColumn) => { @@ -197,11 +201,11 @@ const renderName = (item: ProjectExplorerItem) => const renderIcon = (item: ProjectExplorerItem) => { switch (item.kind) { case ResourceKind.LEVEL_UP: - return ; + return ; case ResourceKind.PROJECT: - return ; + return ; case ResourceKind.COLLECTION: - return ; + return ; default: return ; } diff --git a/src/views/project-panel/project-panel.tsx b/src/views/project-panel/project-panel.tsx index a9fd378c..d44053da 100644 --- a/src/views/project-panel/project-panel.tsx +++ b/src/views/project-panel/project-panel.tsx @@ -13,6 +13,7 @@ import ProjectExplorer from "../../views-components/project-explorer/project-exp import { projectExplorerItems } from "./project-panel-selectors"; import { ProjectExplorerItem } from "../../views-components/project-explorer/project-explorer-item"; import { Button, StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core'; +import { DataColumn, SortDirection } from '../../components/data-table/data-column'; interface ProjectPanelDataProps { projects: ProjectState; @@ -21,13 +22,29 @@ interface ProjectPanelDataProps { type ProjectPanelProps = ProjectPanelDataProps & RouteComponentProps<{ name: string }> & DispatchProp; -class ProjectPanel extends React.Component> { +interface ProjectPanelState { + sort: { + columnName: string; + direction: SortDirection; + }; +} + +class ProjectPanel extends React.Component, ProjectPanelState> { + state: ProjectPanelState = { + sort: { + columnName: "Name", + direction: "desc" + } + }; + render() { const items = projectExplorerItems( this.props.projects.items, this.props.projects.currentItemId, this.props.collections ); + const [goBackItem, ...otherItems] = items; + const sortedItems = sortItems(this.state.sort, otherItems); return (
@@ -42,8 +59,9 @@ class ProjectPanel extends React.Component
); @@ -52,8 +70,28 @@ class ProjectPanel extends React.Component { this.props.dispatch(setProjectItem(this.props.projects.items, item.uuid, item.kind, ItemMode.BOTH)); } + + toggleSort = (column: DataColumn) => { + this.setState({sort: { + columnName: column.name, + direction: column.sortDirection || "none" + }}); + } } +const sortItems = (sort: {columnName: string, direction: SortDirection}, items: ProjectExplorerItem[]) => { + const sortedItems = items.slice(0); + const direction = sort.direction === "asc" ? -1 : 1; + sortedItems.sort((a, b) => { + if(sort.columnName === "Last modified") { + return ((new Date(a.lastModified)).getTime() - (new Date(b.lastModified)).getTime()) * direction; + } else { + return a.name.localeCompare(b.name) * direction; + } + }); + return sortedItems; +}; + type CssRules = "toolbar" | "button"; const styles: StyleRulesCallback = theme => ({ -- 2.30.2