Skip to content

Commit a9de88e

Browse files
authored
Merge pull request #12350 from nextcloud/filepicker-sorting
Enable sorting in file picker
2 parents 53418f2 + 5e5cced commit a9de88e

File tree

3 files changed

+126
-18
lines changed

3 files changed

+126
-18
lines changed

core/css/styles.scss

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,47 @@ code {
773773
margin-bottom: 50px;
774774
}
775775
.filelist {
776+
thead {
777+
tr {
778+
border-bottom: 1px solid var(--color-border);
779+
background-color: var(--color-main-background);
780+
th {
781+
width: 80%;
782+
border: none;
783+
}
784+
}
785+
}
786+
th .columntitle {
787+
display: block;
788+
padding: 15px;
789+
height: 50px;
790+
box-sizing: border-box;
791+
-moz-box-sizing: border-box;
792+
vertical-align: middle;
793+
}
794+
th .columntitle.name {
795+
padding-left: 5px;
796+
margin-left: 50px;
797+
}
798+
799+
th .sort-indicator {
800+
width: 10px;
801+
height: 8px;
802+
margin-left: 5px;
803+
display: inline-block;
804+
vertical-align: text-bottom;
805+
opacity: .3;
806+
}
807+
.sort-indicator.hidden,
808+
th:hover .sort-indicator.hidden,
809+
th:focus .sort-indicator.hidden {
810+
visibility: hidden;
811+
}
812+
th:hover .sort-indicator.hidden,
813+
th:focus .sort-indicator.hidden {
814+
visibility: visible;
815+
}
816+
776817
td {
777818
padding: 14px;
778819
border-bottom: 1px solid var(--color-border);

core/js/oc-dialogs.js

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ var OCdialogs = {
192192
*/
193193
filepicker:function(title, callback, multiselect, mimetypeFilter, modal, type) {
194194
var self = this;
195+
196+
this.filepicker.sortField = 'name';
197+
this.filepicker.sortOrder = 'asc';
195198
// avoid opening the picker twice
196199
if (this.filepicker.loading) {
197200
return;
@@ -252,14 +255,22 @@ var OCdialogs = {
252255
}
253256

254257
self.$filePicker.ready(function() {
258+
self.$fileListHeader = self.$filePicker.find('.filelist thead tr');
255259
self.$filelist = self.$filePicker.find('.filelist tbody');
260+
self.$filelistContainer = self.$filePicker.find('.filelist-container');
256261
self.$dirTree = self.$filePicker.find('.dirtree');
257262
self.$dirTree.on('click', 'div:not(:last-child)', self, function (event) {
258263
self._handleTreeListSelect(event, type);
259264
});
260265
self.$filelist.on('click', 'tr', function(event) {
261266
self._handlePickerClick(event, $(this), type);
262267
});
268+
self.$fileListHeader.on('click', 'a', function(event) {
269+
var dir = self.$filePicker.data('path');
270+
self.filepicker.sortField = $(event.currentTarget).data('sort');
271+
self.filepicker.sortOrder = self.filepicker.sortOrder === 'asc' ? 'desc' : 'asc';
272+
self._fillFilePicker(dir);
273+
});
263274
self._fillFilePicker('');
264275
});
265276

@@ -824,7 +835,7 @@ var OCdialogs = {
824835
var self = this;
825836
$.get(OC.filePath('core', 'templates', 'filepicker.html'), function(tmpl) {
826837
self.$filePickerTemplate = $(tmpl);
827-
self.$listTmpl = self.$filePickerTemplate.find('.filelist tr:first-child').detach();
838+
self.$listTmpl = self.$filePickerTemplate.find('.filelist tbody tr:first-child').detach();
828839
defer.resolve(self.$filePickerTemplate);
829840
})
830841
.fail(function(jqXHR, textStatus, errorThrown) {
@@ -886,34 +897,68 @@ var OCdialogs = {
886897
*/
887898
_fillFilePicker:function(dir) {
888899
var self = this;
889-
this.$filelist.empty().addClass('icon-loading');
900+
this.$filelist.empty();
901+
this.$filePicker.find('.emptycontent').hide();
902+
this.$filelistContainer.addClass('icon-loading');
890903
this.$filePicker.data('path', dir);
891904
var filter = this.$filePicker.data('mimetype');
892905
if (typeof(filter) === "string") {
893906
filter = [filter];
894907
}
908+
self.$fileListHeader.find('.sort-indicator').addClass('hidden').removeClass('icon-triangle-n').removeClass('icon-triangle-s');
909+
self.$fileListHeader.find('[data-sort=' + self.filepicker.sortField + '] .sort-indicator').removeClass('hidden');
910+
if (self.filepicker.sortOrder === 'asc') {
911+
self.$fileListHeader.find('[data-sort=' + self.filepicker.sortField + '] .sort-indicator').addClass('icon-triangle-n');
912+
} else {
913+
self.$fileListHeader.find('[data-sort=' + self.filepicker.sortField + '] .sort-indicator').addClass('icon-triangle-s');
914+
}
895915
self.filepicker.filesClient.getFolderContents(dir).then(function(status, files) {
896916
if (filter && filter.length > 0 && filter.indexOf('*') === -1) {
897917
files = files.filter(function (file) {
898918
return file.type === 'dir' || filter.indexOf(file.mimetype) !== -1;
899919
});
900920
}
901-
files = files.sort(function(a, b) {
902-
if (a.type === 'dir' && b.type !== 'dir') {
921+
922+
var Comparators = {
923+
name: function(fileInfo1, fileInfo2) {
924+
if (fileInfo1.type === 'dir' && fileInfo2.type !== 'dir') {
925+
return -1;
926+
}
927+
if (fileInfo1.type !== 'dir' && fileInfo2.type === 'dir') {
928+
return 1;
929+
}
930+
return OC.Util.naturalSortCompare(fileInfo1.name, fileInfo2.name);
931+
},
932+
size: function(fileInfo1, fileInfo2) {
933+
return fileInfo1.size - fileInfo2.size;
934+
},
935+
mtime: function(fileInfo1, fileInfo2) {
936+
return fileInfo1.mtime - fileInfo2.mtime;
937+
}
938+
};
939+
var comparator = Comparators[self.filepicker.sortField] || Comparators.name;
940+
files = files.sort(function(file1, file2) {
941+
var isFavorite = function(fileInfo) {
942+
return fileInfo.tags && fileInfo.tags.indexOf(OC.TAG_FAVORITE) >= 0;
943+
};
944+
945+
if (isFavorite(file1) && !isFavorite(file2)) {
903946
return -1;
904-
} else if(a.type !== 'dir' && b.type === 'dir') {
947+
} else if (!isFavorite(file1) && isFavorite(file2)) {
905948
return 1;
906-
} else {
907-
return a.name.localeCompare(b.name, undefined, {numeric: true});
908949
}
950+
951+
return self.filepicker.sortOrder === 'asc' ? comparator(file1, file2) : -comparator(file1, file2);
909952
});
910953

911954
self._fillSlug();
912955

913956
if (files.length === 0) {
914957
self.$filePicker.find('.emptycontent').show();
958+
self.$fileListHeader.hide();
915959
} else {
916960
self.$filePicker.find('.emptycontent').hide();
961+
self.$fileListHeader.show();
917962
}
918963

919964
$.each(files, function(idx, entry) {
@@ -953,7 +998,7 @@ var OCdialogs = {
953998
self.$filelist.append($row);
954999
});
9551000

956-
self.$filelist.removeClass('icon-loading');
1001+
self.$filelistContainer.removeClass('icon-loading');
9571002
});
9581003
},
9591004
/**

core/templates/filepicker.html

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,39 @@
88
<h2>{emptytext}</h2>
99
</div>
1010
<table id="filestable" class="filelist list-container view-grid">
11+
<thead>
12+
<tr>
13+
<th id="headerName" class="column-name">
14+
<div id="headerName-container">
15+
<a class="name sort columntitle" data-sort="name">
16+
<span>Name</span>
17+
<span class="sort-indicator hidden icon-triangle-n"></span>
18+
</a>
19+
</div>
20+
</th>
21+
<th id="headerSize" class="column-size">
22+
<a class="size sort columntitle" data-sort="size">
23+
<span>Size</span>
24+
<span class="sort-indicator hidden icon-triangle-n"></span></a>
25+
</th>
26+
<th id="headerDate" class="column-mtime">
27+
<a id="modified" class="columntitle" data-sort="mtime">
28+
<span>Modified</span>
29+
<span class="sort-indicator hidden icon-triangle-n"></span></a>
30+
</th>
31+
</tr>
32+
</thead>
1133
<tbody>
12-
<tr data-entryname="{filename}" data-type="{type}">
13-
<td class="filename"
14-
style="background-image:url({icon})">{filename}
15-
</td>
16-
<td class="filesize"
17-
style="color:rgb({sizeColor}, {sizeColor}, {sizeColor})">
18-
{size}
19-
</td>
20-
<td class="date">{date}</td>
21-
</tr>
34+
<tr data-entryname="{filename}" data-type="{type}">
35+
<td class="filename"
36+
style="background-image:url({icon})">{filename}
37+
</td>
38+
<td class="filesize"
39+
style="color:rgb({sizeColor}, {sizeColor}, {sizeColor})">
40+
{size}
41+
</td>
42+
<td class="date">{date}</td>
43+
</tr>
2244
</tbody>
2345
</table>
2446
</div>

0 commit comments

Comments
 (0)