mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-07 09:51:26 +00:00
[shared dir view] sort dirents by name/size/time (#4421)
This commit is contained in:
@@ -29,6 +29,9 @@ class SharedDirView extends React.Component {
|
|||||||
errorMsg: '',
|
errorMsg: '',
|
||||||
items: [],
|
items: [],
|
||||||
|
|
||||||
|
sortBy: 'name', // 'name' or 'time' or 'size'
|
||||||
|
sortOrder: 'asc', // 'asc' or 'desc'
|
||||||
|
|
||||||
isZipDialogOpen: false,
|
isZipDialogOpen: false,
|
||||||
zipFolderPath: '',
|
zipFolderPath: '',
|
||||||
|
|
||||||
@@ -50,7 +53,7 @@ class SharedDirView extends React.Component {
|
|||||||
this.setState({
|
this.setState({
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
errorMsg: '',
|
errorMsg: '',
|
||||||
items: items
|
items: Utils.sortDirentsInSharedDir(items, this.state.sortBy, this.state.sortOrder)
|
||||||
});
|
});
|
||||||
this.getThumbnails();
|
this.getThumbnails();
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
@@ -62,6 +65,14 @@ class SharedDirView extends React.Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sortItems = (sortBy, sortOrder) => {
|
||||||
|
this.setState({
|
||||||
|
sortBy: sortBy,
|
||||||
|
sortOrder: sortOrder,
|
||||||
|
items: Utils.sortDirentsInSharedDir(this.state.items, sortBy, sortOrder)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
getThumbnails = () => {
|
getThumbnails = () => {
|
||||||
let items = this.state.items.filter((item) => {
|
let items = this.state.items.filter((item) => {
|
||||||
return !item.is_dir && Utils.imageCheck(item.file_name) && !item.encoded_thumbnail_src;
|
return !item.is_dir && Utils.imageCheck(item.file_name) && !item.encoded_thumbnail_src;
|
||||||
@@ -209,7 +220,12 @@ class SharedDirView extends React.Component {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Content
|
<Content
|
||||||
data={this.state}
|
isLoading={this.state.isLoading}
|
||||||
|
errorMsg={this.state.errorMsg}
|
||||||
|
items={this.state.items}
|
||||||
|
sortBy={this.state.sortBy}
|
||||||
|
sortOrder={this.state.sortOrder}
|
||||||
|
sortItems={this.sortItems}
|
||||||
zipDownloadFolder={this.zipDownloadFolder}
|
zipDownloadFolder={this.zipDownloadFolder}
|
||||||
showImagePopup={this.showImagePopup}
|
showImagePopup={this.showImagePopup}
|
||||||
/>
|
/>
|
||||||
@@ -243,8 +259,29 @@ class SharedDirView extends React.Component {
|
|||||||
|
|
||||||
class Content extends React.Component {
|
class Content extends React.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);
|
||||||
|
}
|
||||||
|
|
||||||
|
sortBySize = (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const sortBy = 'size';
|
||||||
|
const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc';
|
||||||
|
this.props.sortItems(sortBy, sortOrder);
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { isLoading, errorMsg, items } = this.props.data;
|
const { isLoading, errorMsg, items, sortBy, sortOrder } = this.props;
|
||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return <Loading />;
|
return <Loading />;
|
||||||
@@ -254,14 +291,15 @@ class Content extends React.Component {
|
|||||||
return <p className="error mt-6 text-center">{errorMsg}</p>;
|
return <p className="error mt-6 text-center">{errorMsg}</p>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sortIcon = <span className={`fas ${sortOrder == 'asc' ? 'fa-caret-up' : 'fa-caret-down'}`}></span>;
|
||||||
return mode == 'list' ? (
|
return mode == 'list' ? (
|
||||||
<table className="table-hover">
|
<table className="table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th width="5%"></th>
|
<th width="5%"></th>
|
||||||
<th width="55%">{gettext('Name')}</th>
|
<th width="55%"><a className="d-block table-sort-op" href="#" onClick={this.sortByName}>{gettext('Name')} {sortBy == 'name' && sortIcon}</a></th>
|
||||||
<th width="14%">{gettext('Size')}</th>
|
<th width="14%"><a className="d-block table-sort-op" href="#" onClick={this.sortBySize}>{gettext('Size')} {sortBy == 'size' && sortIcon}</a></th>
|
||||||
<th width="16%">{gettext('Last Update')}</th>
|
<th width="16%"><a className="d-block table-sort-op" href="#" onClick={this.sortByTime}>{gettext('Last Update')} {sortBy == 'time' && sortIcon}</a></th>
|
||||||
<th width="10%">{gettext('Operations')}</th>
|
<th width="10%">{gettext('Operations')}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@@ -968,6 +968,76 @@ export const Utils = {
|
|||||||
return items;
|
return items;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// sort dirents in shared folder
|
||||||
|
sortDirentsInSharedDir: function(items, sortBy, sortOrder) {
|
||||||
|
const _this = this;
|
||||||
|
let comparator;
|
||||||
|
|
||||||
|
switch (`${sortBy}-${sortOrder}`) {
|
||||||
|
case 'name-asc':
|
||||||
|
comparator = function(a, b) {
|
||||||
|
let result;
|
||||||
|
if (a.is_dir) {
|
||||||
|
result = _this.compareTwoWord(a.folder_name, b.folder_name);
|
||||||
|
} else {
|
||||||
|
result = _this.compareTwoWord(a.file_name, b.file_name);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case 'name-desc':
|
||||||
|
comparator = function(a, b) {
|
||||||
|
let result;
|
||||||
|
if (a.is_dir) {
|
||||||
|
result = _this.compareTwoWord(a.folder_name, b.folder_name);
|
||||||
|
} else {
|
||||||
|
result = _this.compareTwoWord(a.file_name, b.file_name);
|
||||||
|
}
|
||||||
|
return -result;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case 'time-asc':
|
||||||
|
comparator = function(a, b) {
|
||||||
|
return a.last_modified < b.last_modified ? -1 : 1;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case 'time-desc':
|
||||||
|
comparator = function(a, b) {
|
||||||
|
return a.last_modified < b.last_modified ? 1 : -1;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case 'size-asc':
|
||||||
|
comparator = function(a, b) {
|
||||||
|
if (a.is_dir) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return a.size < b.size ? -1 : 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case 'size-desc':
|
||||||
|
comparator = function(a, b) {
|
||||||
|
if (a.is_dir) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return a.size < b.size ? 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;
|
||||||
|
},
|
||||||
|
|
||||||
sortTraffic(items, sortBy, sortOrder) {
|
sortTraffic(items, sortBy, sortOrder) {
|
||||||
let comparator;
|
let comparator;
|
||||||
switch(sortOrder) {
|
switch(sortOrder) {
|
||||||
|
Reference in New Issue
Block a user