Merge pull request #8281 from bwlang/sortable_library

Sortable library
This commit is contained in:
Martin Cech
2019-07-07 11:39:24 +02:00
committed by GitHub
5 changed files with 42 additions and 37 deletions
@@ -741,7 +741,7 @@ var LibraryDatasetView = Backbone.View.extend({
<% } %>
<% if (item.get("message")) { %>
<tr>
<th scope="row">Message</th>
<th scope="row">Description</th>
<td scope="row"><%= _.escape(item.get("message")) %></td>
</tr>
<% } %>
@@ -25,7 +25,9 @@ var FolderListView = Backbone.View.extend({
"click .folder_row": "selectClickedRow",
"click .sort-folder-name": "sortColumnClicked",
"click .sort-folder-file_ext": "sortColumnClicked",
"click .sort-folder-description": "sortColumnClicked",
"click .sort-folder-message": "sortColumnClicked",
"click .sort-folder-update_time": "sortColumnClicked",
"click .sort-folder-raw_size": "sortColumnClicked",
"click .sort-folder-state": "sortColumnClicked"
},
@@ -337,10 +339,11 @@ var FolderListView = Backbone.View.extend({
},
renderSortIcon: function() {
$('[class*="sort-icon"]')
.removeClass("fa-sort-alpha-desc")
.removeClass("fa-sort-alpha-asc");
if (this.current_sort_order === "asc") {
$('[class*="sort-icon"]')
.removeClass("fa-sort-alpha-desc")
.removeClass("fa-sort-alpha-asc");
$(`.sort-icon-${this.current_sort_key}`).addClass("fa-sort-alpha-asc");
} else {
$(`.sort-icon-${this.current_sort_key}`).addClass("fa-sort-alpha-desc");
@@ -484,22 +487,27 @@ var FolderListView = Backbone.View.extend({
</th>
<th>
<a class="sort-folder-name" title="Click to reverse order" href="#">Name</a>
<span title="Sorted alphabetically"
class="sort-icon-name fa fa-sort-alpha-<%- order %>"></span>
<span title="Sorted by Name" class="sort-icon-name fa fa-sort-alpha-<%- order %>"></span>
</th>
<th style="width:20%;">
<a class="sort-folder-description" title="Click to reverse order" href="#">Description</a>
<span title="Sorted alphabetically" class="sort-icon-description fa"></span>
<a class="sort-folder-message" title="Click to reverse order" href="#">Description</a>
<span title="Sorted by Desc." class="sort-icon-message fa"></span>
</th>
<th style="width:5%;">
<a class="sort-folder-file_ext" title="Click to reverse order" href="#">Data Type</a>
<span title="Sorted alphabetically" class="sort-icon-file_ext fa"></span>
<span title="Sorted by Type" class="sort-icon-file_ext fa"></span>
</th>
<th style="width:10%;">
<a class="sort-folder-raw_size" title="Click to reverse order" href='#'>Size</a>
<span title="Sorted by Size" class="sort-icon-raw_size fa"></span>
</th>
<th style="width:160px;">
<a class="sort-folder-update_time" title="Click to reverse order" href='#'>Time Updated (UTC)</a>
<span title="Sorted by Date" class="sort-icon-update_time fa"></span>
</th>
<th style="width:10%;">Size</th>
<th style="width:160px;">Time Updated (UTC)</th>
<th style="width:5%;">
<a class="sort-folder-state" title="Click to reverse order" href="#">State</a>
<span title="Sorted alphabetically" class="sort-icon-state fa"></span>
<span title="Sorted by State" class="sort-icon-state fa"></span>
</th>
<th style="width:160px;"></th>
</thead>
@@ -55,7 +55,7 @@ var Libraries = Backbone.Collection.extend({
},
sortLibraries: function(sort_key, sort_order) {
this.comparator = mod_util.generateLibraryComparator(sort_key, sort_order);
this.comparator = mod_util.generateComparator(sort_key, sort_order);
this.sort();
}
});
@@ -77,7 +77,7 @@ var Folder = Backbone.Collection.extend({
model: LibraryItem,
sortFolder: function(sort_key, sort_order) {
this.comparator = mod_util.generateFolderComparator(sort_key, sort_order);
this.comparator = mod_util.generateComparator(sort_key, sort_order);
this.sort();
}
});
@@ -6,7 +6,7 @@
* @param {str} sort_order order to sort by (asc, desc)
* @return {function} two-argument comparator function
*/
var generateFolderComparator = (sort_key, sort_order) => (itemA, itemB) => {
var generateComparator = (sort_key, sort_order) => (itemA, itemB) => {
if (itemA.get("type") === itemB.get("type")) {
if (!itemA.has(sort_key) && !itemB.has(sort_key)) {
return 0;
@@ -15,12 +15,24 @@ var generateFolderComparator = (sort_key, sort_order) => (itemA, itemB) => {
} else if (!itemB.has(sort_key)) {
return -1;
}
if (itemA.get(sort_key).toLowerCase() > itemB.get(sort_key).toLowerCase()) {
var comparable_itemA_key;
var comparable_itemB_key;
if (typeof itemA.get(sort_key) === "number") {
comparable_itemA_key = itemA.get(sort_key);
comparable_itemB_key = itemB.get(sort_key);
}
else
{
comparable_itemA_key = itemA.get(sort_key).toLowerCase();
comparable_itemB_key = itemB.get(sort_key).toLowerCase();
}
if ( comparable_itemA_key > comparable_itemB_key) {
return sort_order === "asc" ? 1 : -1;
}
if (itemB.get(sort_key).toLowerCase() > itemA.get(sort_key).toLowerCase()) {
if (comparable_itemB_key > comparable_itemA_key) {
return sort_order === "asc" ? -1 : 1;
}
return 0; // equal
} else {
if (itemA.get("type") === "folder") {
@@ -29,22 +41,6 @@ var generateFolderComparator = (sort_key, sort_order) => (itemA, itemB) => {
return 1;
}
};
/**
* Create alphabetical based two-argument comparator
* @param {str} sort_key key to sort by
* @param {str} sort_order order to sort by (asc, desc)
* @return {function} two-argument comparator function
*/
var generateLibraryComparator = (sort_key, sort_order) => (libraryA, libraryB) => {
if (libraryA.get(sort_key).toLowerCase() > libraryB.get(sort_key).toLowerCase()) {
return sort_order === "asc" ? 1 : -1;
}
if (libraryB.get(sort_key).toLowerCase() > libraryA.get(sort_key).toLowerCase()) {
return sort_order === "asc" ? -1 : 1;
}
return 0; // equal
};
export default {
generateFolderComparator: generateFolderComparator,
generateLibraryComparator: generateLibraryComparator
generateComparator: generateComparator
};
@@ -105,8 +105,8 @@ class FolderContentsController(BaseAPIController, UsesLibraryMixin, UsesLibraryM
# Can user manage the permissions on the dataset?
can_manage = is_admin or (trans.user and trans.app.security_agent.can_manage_dataset(current_user_roles, content_item.library_dataset_dataset_association.dataset))
nice_size = util.nice_size(int(content_item.library_dataset_dataset_association.get_size()))
raw_size = int(content_item.library_dataset_dataset_association.get_size())
nice_size = util.nice_size(raw_size)
library_dataset_dict = content_item.to_dict()
encoded_ldda_id = trans.security.encode_id(content_item.library_dataset_dataset_association.id)
@@ -117,6 +117,7 @@ class FolderContentsController(BaseAPIController, UsesLibraryMixin, UsesLibraryM
can_manage=can_manage,
state=library_dataset_dict['state'],
file_size=nice_size,
raw_size=raw_size,
ldda_id=encoded_ldda_id))
if content_item.library_dataset_dataset_association.message:
return_item.update(dict(message=content_item.library_dataset_dataset_association.message))