@@ -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 /**
0 commit comments