2014-02-11 15:52:56 +00:00
/ * *
* ownCloud
*
* @ author Vincent Petry
* @ copyright 2014 Vincent Petry < pvince81 @ owncloud . com >
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Affero General Public
* License along with this library . If not , see < http : //www.gnu.org/licenses/>.
*
* /
( function ( ) {
/ * *
* The FileSummary class encapsulates the file summary values and
* the logic to render it in the given container
2014-06-23 21:56:10 +00:00
*
* @ constructs FileSummary
* @ memberof OCA . Files
*
2014-02-11 15:52:56 +00:00
* @ param $tr table row element
* /
2014-04-04 16:46:08 +00:00
var FileSummary = function ( $tr ) {
2014-02-11 15:52:56 +00:00
this . $el = $tr ;
2014-04-04 16:46:08 +00:00
this . clear ( ) ;
2014-02-11 15:52:56 +00:00
this . render ( ) ;
} ;
FileSummary . prototype = {
summary : {
totalFiles : 0 ,
totalDirs : 0 ,
2014-12-18 22:11:42 +00:00
totalSize : 0 ,
filter : ''
2014-02-11 15:52:56 +00:00
} ,
/ * *
* Adds file
* @ param file file to add
* @ param update whether to update the display
* /
add : function ( file , update ) {
2014-12-31 13:36:48 +00:00
if ( file . name && file . name . toLowerCase ( ) . indexOf ( this . summary . filter ) === - 1 ) {
2014-12-18 22:11:42 +00:00
return ;
}
2014-02-11 15:52:56 +00:00
if ( file . type === 'dir' || file . mime === 'httpd/unix-directory' ) {
this . summary . totalDirs ++ ;
}
else {
this . summary . totalFiles ++ ;
}
this . summary . totalSize += parseInt ( file . size , 10 ) || 0 ;
if ( ! ! update ) {
this . update ( ) ;
}
} ,
/ * *
* Removes file
* @ param file file to remove
* @ param update whether to update the display
* /
remove : function ( file , update ) {
2014-12-31 13:36:48 +00:00
if ( file . name && file . name . toLowerCase ( ) . indexOf ( this . summary . filter ) === - 1 ) {
2014-12-18 22:11:42 +00:00
return ;
}
2014-02-11 15:52:56 +00:00
if ( file . type === 'dir' || file . mime === 'httpd/unix-directory' ) {
this . summary . totalDirs -- ;
}
else {
this . summary . totalFiles -- ;
}
this . summary . totalSize -= parseInt ( file . size , 10 ) || 0 ;
if ( ! ! update ) {
this . update ( ) ;
}
} ,
2014-12-18 22:11:42 +00:00
setFilter : function ( filter , files ) {
this . summary . filter = filter . toLowerCase ( ) ;
this . calculate ( files ) ;
} ,
2014-04-04 16:46:08 +00:00
/ * *
* Returns the total of files and directories
* /
getTotal : function ( ) {
return this . summary . totalDirs + this . summary . totalFiles ;
} ,
2014-02-11 15:52:56 +00:00
/ * *
* Recalculates the summary based on the given files array
* @ param files array of files
* /
calculate : function ( files ) {
var file ;
var summary = {
totalDirs : 0 ,
totalFiles : 0 ,
2014-12-18 22:11:42 +00:00
totalSize : 0 ,
filter : this . summary . filter
2014-02-11 15:52:56 +00:00
} ;
for ( var i = 0 ; i < files . length ; i ++ ) {
file = files [ i ] ;
2014-12-31 15:15:57 +00:00
if ( file . name && file . name . toLowerCase ( ) . indexOf ( this . summary . filter ) === - 1 ) {
2014-12-18 22:11:42 +00:00
continue ;
}
2014-02-11 15:52:56 +00:00
if ( file . type === 'dir' || file . mime === 'httpd/unix-directory' ) {
summary . totalDirs ++ ;
}
else {
summary . totalFiles ++ ;
}
summary . totalSize += parseInt ( file . size , 10 ) || 0 ;
}
this . setSummary ( summary ) ;
} ,
2014-04-04 16:46:08 +00:00
/ * *
* Clears the summary
* /
clear : function ( ) {
this . calculate ( [ ] ) ;
} ,
2014-02-11 15:52:56 +00:00
/ * *
* Sets the current summary values
* @ param summary map
* /
setSummary : function ( summary ) {
this . summary = summary ;
2014-12-31 13:36:48 +00:00
if ( typeof this . summary . filter === 'undefined' ) {
this . summary . filter = '' ;
}
2014-02-11 15:52:56 +00:00
this . update ( ) ;
} ,
/ * *
* Renders the file summary element
* /
update : function ( ) {
2014-04-04 16:46:08 +00:00
if ( ! this . $el ) {
return ;
}
2014-02-11 15:52:56 +00:00
if ( ! this . summary . totalFiles && ! this . summary . totalDirs ) {
this . $el . addClass ( 'hidden' ) ;
return ;
}
// There's a summary and data -> Update the summary
this . $el . removeClass ( 'hidden' ) ;
var $dirInfo = this . $el . find ( '.dirinfo' ) ;
var $fileInfo = this . $el . find ( '.fileinfo' ) ;
var $connector = this . $el . find ( '.connector' ) ;
2014-12-18 22:11:42 +00:00
var $filterInfo = this . $el . find ( '.filter' ) ;
2014-02-11 15:52:56 +00:00
// Substitute old content with new translations
$dirInfo . html ( n ( 'files' , '%n folder' , '%n folders' , this . summary . totalDirs ) ) ;
$fileInfo . html ( n ( 'files' , '%n file' , '%n files' , this . summary . totalFiles ) ) ;
this . $el . find ( '.filesize' ) . html ( OC . Util . humanFileSize ( this . summary . totalSize ) ) ;
// Show only what's necessary (may be hidden)
if ( this . summary . totalDirs === 0 ) {
$dirInfo . addClass ( 'hidden' ) ;
$connector . addClass ( 'hidden' ) ;
} else {
$dirInfo . removeClass ( 'hidden' ) ;
}
if ( this . summary . totalFiles === 0 ) {
$fileInfo . addClass ( 'hidden' ) ;
$connector . addClass ( 'hidden' ) ;
} else {
$fileInfo . removeClass ( 'hidden' ) ;
}
if ( this . summary . totalDirs > 0 && this . summary . totalFiles > 0 ) {
$connector . removeClass ( 'hidden' ) ;
}
2014-12-18 22:11:42 +00:00
if ( this . summary . filter === '' ) {
2014-12-31 13:36:48 +00:00
$filterInfo . html ( '' ) ;
2014-12-18 22:11:42 +00:00
$filterInfo . addClass ( 'hidden' ) ;
} else {
2014-12-31 13:36:48 +00:00
$filterInfo . html ( n ( 'files' , ' matches \'{filter}\'' , ' match \'{filter}\'' , this . summary . totalDirs + this . summary . totalFiles , { filter : this . summary . filter } ) ) ;
2014-12-18 22:11:42 +00:00
$filterInfo . removeClass ( 'hidden' ) ;
}
2014-02-11 15:52:56 +00:00
} ,
render : function ( ) {
2014-04-04 16:46:08 +00:00
if ( ! this . $el ) {
return ;
}
// TODO: ideally this should be separate to a template or something
2014-02-11 15:52:56 +00:00
var summary = this . summary ;
var directoryInfo = n ( 'files' , '%n folder' , '%n folders' , summary . totalDirs ) ;
var fileInfo = n ( 'files' , '%n file' , '%n files' , summary . totalFiles ) ;
2014-12-31 13:36:48 +00:00
if ( this . summary . filter === '' ) {
var filterInfo = '' ;
} else {
var filterInfo = n ( 'files' , ' matches \'{filter}\'' , ' match \'{filter}\'' , summary . totalFiles + summary . totalDirs , { filter : summary . filter } ) ;
}
2014-02-11 15:52:56 +00:00
var infoVars = {
dirs : '<span class="dirinfo">' + directoryInfo + '</span><span class="connector">' ,
files : '</span><span class="fileinfo">' + fileInfo + '</span>'
} ;
// don't show the filesize column, if filesize is NaN (e.g. in trashbin)
var fileSize = '' ;
if ( ! isNaN ( summary . totalSize ) ) {
fileSize = '<td class="filesize">' + OC . Util . humanFileSize ( summary . totalSize ) + '</td>' ;
}
var info = t ( 'files' , '{dirs} and {files}' , infoVars ) ;
2014-12-31 13:36:48 +00:00
var $summary = $ ( '<td><span class="info">' + info + '<span class="filter">' + filterInfo + '</span></span></td>' + fileSize + '<td class="date"></td>' ) ;
2014-02-11 15:52:56 +00:00
if ( ! this . summary . totalFiles && ! this . summary . totalDirs ) {
this . $el . addClass ( 'hidden' ) ;
}
this . $el . append ( $summary ) ;
}
} ;
2014-05-08 20:06:30 +00:00
OCA . Files . FileSummary = FileSummary ;
2014-02-11 15:52:56 +00:00
} ) ( ) ;