From 9794966b89f8d75b1d8287e3b00ba8f2e46276c5 Mon Sep 17 00:00:00 2001 From: llj Date: Wed, 2 Jan 2019 17:49:30 +0800 Subject: [PATCH] [share admin] share links: added 'sort' (#2747) --- frontend/src/pages/share-admin/folders.js | 4 +- frontend/src/pages/share-admin/share-links.js | 84 +++++++++++++++++-- 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/frontend/src/pages/share-admin/folders.js b/frontend/src/pages/share-admin/folders.js index 7a8b1ca432..4d99c0657e 100644 --- a/frontend/src/pages/share-admin/folders.js +++ b/frontend/src/pages/share-admin/folders.js @@ -188,13 +188,13 @@ class ShareAdminFolders extends Component { comparator = function(a, b) { var result = Utils.compareTwoWord(a.folder_name, b.folder_name); return result; - } + }; break; case 'name-desc': comparator = function(a, b) { var result = Utils.compareTwoWord(a.folder_name, b.folder_name); return -result; - } + }; break; } diff --git a/frontend/src/pages/share-admin/share-links.js b/frontend/src/pages/share-admin/share-links.js index b5b43e9f76..5e6dde174e 100644 --- a/frontend/src/pages/share-admin/share-links.js +++ b/frontend/src/pages/share-admin/share-links.js @@ -9,6 +9,20 @@ import SharedLinkInfo from '../../models/shared-link-info'; 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); + } + constructor(props) { super(props); this.state = { @@ -30,7 +44,7 @@ class Content extends Component { } render() { - const { loading, errorMsg, items } = this.props; + const { loading, errorMsg, items, sortBy, sortOrder } = this.props; if (loading) { return ; @@ -44,16 +58,21 @@ class Content extends Component { ); + // sort + const sortByName = sortBy == 'name'; + const sortByTime = sortBy == 'time'; + const sortIcon = sortOrder == 'asc' ? : ; + const table = ( - {/* TODO:sort */} + - {/*TODO:sort*/} + @@ -177,10 +196,60 @@ class ShareAdminShareLinks extends Component { this.state = { loading: true, errorMsg: '', - items: [] + items: [], + sortBy: 'name', // 'name' or 'time' + sortOrder: 'asc' // 'asc' or 'desc' }; } + _sortItems = (items, sortBy, sortOrder) => { + let comparator; + + switch (`${sortBy}-${sortOrder}`) { + case 'name-asc': + comparator = function(a, b) { + var result = Utils.compareTwoWord(a.obj_name, b.obj_name); + return result; + }; + break; + case 'name-desc': + comparator = function(a, b) { + var result = Utils.compareTwoWord(a.obj_name, b.obj_name); + return -result; + }; + break; + case 'time-asc': + comparator = function(a, b) { + return a.expire_date < b.expire_date ? -1 : 1; + }; + break; + case 'time-desc': + comparator = function(a, b) { + return a.expire_date < b.expire_date ? 1 : -1; + }; + break; + } + + items.sort((a, b) => { + if (a.is_dir && !b.is_dir) { + return -1; + } else if (!a.is_dir && b.is_dir) { + return 1; + } else { + return comparator(a, b); + } + }); + return items; + } + + sortItems = (sortBy, sortOrder) => { + this.setState({ + sortBy: sortBy, + sortOrder: sortOrder, + items: this._sortItems(this.state.items, sortBy, sortOrder) + }); + } + componentDidMount() { seafileAPI.listShareLinks().then((res) => { // res: {data: Array(2), status: 200, statusText: "OK", headers: {…}, config: {…}, …} @@ -189,7 +258,7 @@ class ShareAdminShareLinks extends Component { }); this.setState({ loading: false, - items: items + items: this._sortItems(items, this.state.sortBy, this.state.sortOrder) }); }).catch((error) => { if (error.response) { @@ -244,9 +313,12 @@ class ShareAdminShareLinks extends Component {
{/*icon*/}{gettext("Name")} {gettext('Name')} {sortByName && sortIcon} {gettext("Library")} {gettext("Visits")}{gettext("Expiration")} {gettext('Expiration')} {sortByTime && sortIcon} {/*Operations*/}