diff --git a/frontend/src/pages/shared-libs/shared-libs.js b/frontend/src/pages/shared-libs/shared-libs.js index a50d943a0a..d7ef6eee9c 100644 --- a/frontend/src/pages/shared-libs/shared-libs.js +++ b/frontend/src/pages/shared-libs/shared-libs.js @@ -1,15 +1,31 @@ import React, { Component } from 'react'; +import PropTypes from 'prop-types'; import moment from 'moment'; import { Link } from '@reach/router'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; +import Repo from '../../models/repo'; import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; import Loading from '../../components/loading'; class Content extends Component { + sortByName = (e) => { + e.preventDefault(); + const sortBy = 'name'; + const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc'; + this.props.sortItems(sortBy, sortOrder); + } + + sortByTime = (e) => { + e.preventDefault(); + const sortBy = 'time'; + const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc'; + this.props.sortItems(sortBy, sortOrder); + } + render() { - const {loading, errorMsg, items} = this.props.data; + const { loading, errorMsg, items, sortBy, sortOrder } = this.props; if (loading) { return ; @@ -23,14 +39,19 @@ class Content extends Component { ); + // sort + const sortByName = sortBy == 'name'; + const sortByTime = sortBy == 'time'; + const sortIcon = sortOrder == 'asc' ? : ; + const desktopThead = ( {gettext("Library Type")} - {gettext("Name")}{/*TODO: sort*/} + {gettext('Name')} {sortByName && sortIcon} {gettext("Actions")} {gettext("Size")} - {gettext("Last Update")}{/*TODO: sort*/} + {gettext('Last Update')} {sortByTime && sortIcon} {gettext("Owner")} @@ -41,9 +62,9 @@ class Content extends Component { {gettext("Library Type")} - {gettext("Sort:")} {/* TODO: sort */} - {gettext("name")} - {gettext("last update")} + {gettext("Sort:")} + {gettext("name")} {sortByName && sortIcon} + {gettext("last update")} {sortByTime && sortIcon} {gettext("Actions")} @@ -62,18 +83,20 @@ class Content extends Component { } } -class TableBody extends Component { +Content.propTypes = { + loading: PropTypes.bool.isRequired, + errorMsg: PropTypes.string.isRequired, + items: PropTypes.array.isRequired, + sortBy: PropTypes.string.isRequired, + sortOrder: PropTypes.string.isRequired, + sortItems: PropTypes.func.isRequired +}; - constructor(props) { - super(props); - this.state = { - items: this.props.items - }; - } +class TableBody extends Component { render() { - let listItems = this.state.items.map(function(item, index) { + let listItems = this.props.items.map(function(item, index) { return ; }, this); @@ -83,6 +106,10 @@ class TableBody extends Component { } } +TableBody.propTypes = { + items: PropTypes.array.isRequired +}; + class Item extends Component { constructor(props) { @@ -181,7 +208,7 @@ class Item extends Component { : ''} - {Utils.bytesToSize(data.size)} + {data.size} {moment(data.last_modified).fromNow()} {data.owner_name} @@ -193,7 +220,7 @@ class Item extends Component { {data.repo_name}
{data.owner_name} - {Utils.bytesToSize(data.size)} + {data.size} {moment(data.last_modified).fromNow()} @@ -209,22 +236,31 @@ class Item extends Component { } } +Item.propTypes = { + data: PropTypes.object.isRequired +}; + class SharedLibraries extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', - items: [] + items: [], + sortBy: 'name', // 'name' or 'time' + sortOrder: 'asc' // 'asc' or 'desc' }; } componentDidMount() { seafileAPI.listRepos({type:'shared'}).then((res) => { // res: {data: {...}, status: 200, statusText: "OK", headers: {…}, config: {…}, …} + let repoList = res.data.repos.map((item) => { + return new Repo(item); + }); this.setState({ loading: false, - items: res.data.repos + items: Utils.sortRepos(repoList, this.state.sortBy, this.state.sortOrder) }); }).catch((error) => { if (error.response) { @@ -250,6 +286,14 @@ class SharedLibraries extends Component { }); } + sortItems = (sortBy, sortOrder) => { + this.setState({ + sortBy: sortBy, + sortOrder: sortOrder, + items: Utils.sortRepos(this.state.items, sortBy, sortOrder) + }); + } + render() { return (
@@ -258,7 +302,14 @@ class SharedLibraries extends Component {

{gettext("Shared with me")}

- +