2012-03-27 23:38:55 +04:00
var uploadingFiles = { } ;
Files = {
cancelUpload : function ( filename ) {
if ( uploadingFiles [ filename ] ) {
uploadingFiles [ filename ] . abort ( ) ;
delete uploadingFiles [ filename ] ;
return true ;
}
return false ;
} ,
cancelUploads : function ( ) {
2012-04-16 01:52:36 +04:00
$ . each ( uploadingFiles , function ( index , file ) {
if ( typeof file [ 'abort' ] === 'function' ) {
file . abort ( ) ;
var filename = $ ( 'tr' ) . filterAttr ( 'data-file' , index ) ;
filename . hide ( ) ;
filename . find ( 'input[type="checkbox"]' ) . removeAttr ( 'checked' ) ;
filename . removeClass ( 'selected' ) ;
} else {
$ . each ( file , function ( i , f ) {
f . abort ( ) ;
delete file [ i ] ;
} ) ;
}
2012-03-27 23:38:55 +04:00
delete uploadingFiles [ index ] ;
} ) ;
procesSelection ( ) ;
2012-11-22 16:03:17 +04:00
} ,
2013-01-18 23:09:03 +04:00
updateMaxUploadFilesize : function ( response ) {
if ( response == undefined ) {
return ;
}
if ( response . data !== undefined && response . data . uploadMaxFilesize !== undefined ) {
$ ( '#max_upload' ) . val ( response . data . uploadMaxFilesize ) ;
2013-01-19 03:31:49 +04:00
$ ( '#upload.button' ) . attr ( 'original-title' , response . data . maxHumanFilesize ) ;
$ ( '#usedSpacePercent' ) . val ( response . data . usedSpacePercent ) ;
Files . displayStorageWarnings ( ) ;
2013-01-18 23:09:03 +04:00
}
if ( response [ 0 ] == undefined ) {
return ;
}
if ( response [ 0 ] . uploadMaxFilesize !== undefined ) {
$ ( '#max_upload' ) . val ( response [ 0 ] . uploadMaxFilesize ) ;
2013-01-19 03:31:49 +04:00
$ ( '#upload.button' ) . attr ( 'original-title' , response [ 0 ] . maxHumanFilesize ) ;
$ ( '#usedSpacePercent' ) . val ( response [ 0 ] . usedSpacePercent ) ;
Files . displayStorageWarnings ( ) ;
2013-01-18 23:09:03 +04:00
}
} ,
2013-01-07 13:39:35 +04:00
isFileNameValid : function ( name ) {
if ( name === '.' ) {
2013-01-11 18:02:34 +04:00
OC . Notification . show ( t ( 'files' , '\'.\' is an invalid file name.' ) ) ;
2013-01-07 13:39:35 +04:00
return false ;
}
if ( name . length == 0 ) {
2013-01-11 18:02:34 +04:00
OC . Notification . show ( t ( 'files' , 'File name cannot be empty.' ) ) ;
2013-01-07 13:39:35 +04:00
return false ;
}
2013-01-06 15:52:00 +04:00
2013-01-07 13:39:35 +04:00
// check for invalid characters
2012-11-22 16:03:17 +04:00
var invalid _characters = [ '\\' , '/' , '<' , '>' , ':' , '"' , '|' , '?' , '*' ] ;
for ( var i = 0 ; i < invalid _characters . length ; i ++ ) {
if ( name . indexOf ( invalid _characters [ i ] ) != - 1 ) {
2013-01-05 02:34:09 +04:00
OC . Notification . show ( t ( 'files' , "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." ) ) ;
2013-01-06 15:52:00 +04:00
return false ;
2012-11-22 16:03:17 +04:00
}
}
2013-01-11 18:02:34 +04:00
OC . Notification . hide ( ) ;
2013-01-06 15:52:00 +04:00
return true ;
2013-01-02 18:09:40 +04:00
} ,
2013-01-19 02:22:34 +04:00
displayStorageWarnings : function ( ) {
2013-01-19 03:31:49 +04:00
if ( ! OC . Notification . isHidden ( ) ) {
return ;
}
2013-01-19 02:22:34 +04:00
var usedSpacePercent = $ ( '#usedSpacePercent' ) . val ( ) ;
if ( usedSpacePercent > 98 ) {
2013-01-11 18:02:34 +04:00
OC . Notification . show ( t ( 'files' , 'Your storage is full, files can not be updated or synced anymore!' ) ) ;
return ;
2013-01-19 02:22:34 +04:00
}
if ( usedSpacePercent > 90 ) {
2013-01-11 18:02:34 +04:00
OC . Notification . show ( t ( 'files' , 'Your storage is almost full ({usedSpacePercent}%)' , { usedSpacePercent : usedSpacePercent } ) ) ;
2013-01-19 02:22:34 +04:00
}
2013-08-12 19:25:27 +04:00
} ,
displayEncryptionWarning : function ( ) {
if ( ! OC . Notification . isHidden ( ) ) {
return ;
}
var encryptedFiles = $ ( '#encryptedFiles' ) . val ( ) ;
if ( encryptedFiles === '1' ) {
2013-08-15 15:13:16 +04:00
OC . Notification . show ( t ( 'files_encryption' , 'Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.' ) ) ;
2013-08-12 19:25:27 +04:00
return ;
}
2012-03-27 23:38:55 +04:00
}
2012-09-06 00:17:33 +04:00
} ;
2011-03-03 01:06:23 +03:00
$ ( document ) . ready ( function ( ) {
2013-08-12 19:25:27 +04:00
Files . displayEncryptionWarning ( ) ;
2013-01-14 23:30:39 +04:00
Files . bindKeyboardShortcuts ( document , jQuery ) ;
2011-11-02 01:35:13 +04:00
$ ( '#fileList tr' ) . each ( function ( ) {
//little hack to set unescape filenames in attribute
2011-11-06 16:50:05 +04:00
$ ( this ) . attr ( 'data-file' , decodeURIComponent ( $ ( this ) . attr ( 'data-file' ) ) ) ;
2011-11-02 01:35:13 +04:00
} ) ;
2012-03-16 19:25:41 +04:00
2011-04-17 19:49:56 +04:00
$ ( '#file_action_panel' ) . attr ( 'activeAction' , false ) ;
2011-07-07 23:43:35 +04:00
//drag/drop of files
2012-08-31 03:09:18 +04:00
$ ( '#fileList tr td.filename' ) . each ( function ( i , e ) {
if ( $ ( e ) . parent ( ) . data ( 'permissions' ) & OC . PERMISSION _DELETE ) {
$ ( e ) . draggable ( dragOptions ) ;
}
} ) ;
$ ( '#fileList tr[data-type="dir"] td.filename' ) . each ( function ( i , e ) {
if ( $ ( e ) . parent ( ) . data ( 'permissions' ) & OC . PERMISSION _CREATE ) {
$ ( e ) . droppable ( folderDropOptions ) ;
}
} ) ;
2012-04-15 18:06:16 +04:00
$ ( 'div.crumb:not(.last)' ) . droppable ( crumbDropOptions ) ;
2011-11-24 00:31:27 +04:00
$ ( 'ul#apps>li:first-child' ) . data ( 'dir' , '' ) ;
2012-04-15 18:06:16 +04:00
if ( $ ( 'div.crumb' ) . length ) {
$ ( 'ul#apps>li:first-child' ) . droppable ( crumbDropOptions ) ;
}
2012-03-16 19:25:41 +04:00
2011-08-12 00:22:32 +04:00
// Triggers invisible file input
2013-01-19 01:38:44 +04:00
$ ( '#upload a' ) . on ( 'click' , function ( ) {
2012-12-05 14:17:41 +04:00
$ ( this ) . parent ( ) . children ( '#file_upload_start' ) . trigger ( 'click' ) ;
2011-08-12 00:22:32 +04:00
return false ;
} ) ;
2013-02-22 20:21:57 +04:00
2013-04-29 01:25:58 +04:00
// Trigger cancelling of file upload
2013-04-29 01:28:41 +04:00
$ ( '#uploadprogresswrapper .stop' ) . on ( 'click' , function ( ) {
2013-04-29 01:25:58 +04:00
Files . cancelUploads ( ) ;
} ) ;
2013-01-18 13:23:31 +04:00
// Show trash bin
2013-07-26 13:13:43 +04:00
$ ( '#trash' ) . on ( 'click' , function ( ) {
2013-01-18 13:23:31 +04:00
window . location = OC . filePath ( 'files_trashbin' , '' , 'index.php' ) ;
2013-01-15 23:35:15 +04:00
} ) ;
2013-07-29 19:15:20 +04:00
2011-08-28 23:21:53 +04:00
var lastChecked ;
2011-06-04 22:16:44 +04:00
// Sets the file link behaviour :
2013-01-30 20:10:40 +04:00
$ ( '#fileList' ) . on ( 'click' , 'td.filename a' , function ( event ) {
2011-08-28 23:21:53 +04:00
if ( event . ctrlKey || event . shiftKey ) {
2013-01-09 18:21:55 +04:00
event . preventDefault ( ) ;
2011-08-28 23:21:53 +04:00
if ( event . shiftKey ) {
var last = $ ( lastChecked ) . parent ( ) . parent ( ) . prevAll ( ) . length ;
var first = $ ( this ) . parent ( ) . parent ( ) . prevAll ( ) . length ;
var start = Math . min ( first , last ) ;
var end = Math . max ( first , last ) ;
var rows = $ ( this ) . parent ( ) . parent ( ) . parent ( ) . children ( 'tr' ) ;
for ( var i = start ; i < end ; i ++ ) {
$ ( rows ) . each ( function ( index ) {
if ( index == i ) {
var checkbox = $ ( this ) . children ( ) . children ( 'input:checkbox' ) ;
$ ( checkbox ) . attr ( 'checked' , 'checked' ) ;
$ ( checkbox ) . parent ( ) . parent ( ) . addClass ( 'selected' ) ;
}
} ) ;
}
}
2011-08-28 22:14:50 +04:00
var checkbox = $ ( this ) . parent ( ) . children ( 'input:checkbox' ) ;
2011-08-28 23:21:53 +04:00
lastChecked = checkbox ;
2011-08-28 22:14:50 +04:00
if ( $ ( checkbox ) . attr ( 'checked' ) ) {
$ ( checkbox ) . removeAttr ( 'checked' ) ;
$ ( checkbox ) . parent ( ) . parent ( ) . removeClass ( 'selected' ) ;
$ ( '#select_all' ) . removeAttr ( 'checked' ) ;
} else {
$ ( checkbox ) . attr ( 'checked' , 'checked' ) ;
$ ( checkbox ) . parent ( ) . parent ( ) . toggleClass ( 'selected' ) ;
var selectedCount = $ ( 'td.filename input:checkbox:checked' ) . length ;
if ( selectedCount == $ ( 'td.filename input:checkbox' ) . length ) {
$ ( '#select_all' ) . attr ( 'checked' , 'checked' ) ;
}
}
procesSelection ( ) ;
} else {
2011-11-02 23:26:17 +04:00
var filename = $ ( this ) . parent ( ) . parent ( ) . attr ( 'data-file' ) ;
2011-12-06 02:51:44 +04:00
var tr = $ ( 'tr' ) . filterAttr ( 'data-file' , filename ) ;
2012-01-01 05:14:00 +04:00
var renaming = tr . data ( 'renaming' ) ;
if ( ! renaming && ! FileList . isLoading ( filename ) ) {
2013-02-18 14:22:43 +04:00
FileActions . currentFile = $ ( this ) . parent ( ) ;
var mime = FileActions . getCurrentMimeType ( ) ;
var type = FileActions . getCurrentType ( ) ;
var permissions = FileActions . getCurrentPermissions ( ) ;
2012-07-26 00:33:08 +04:00
var action = FileActions . getDefault ( mime , type , permissions ) ;
2011-08-28 22:14:50 +04:00
if ( action ) {
2013-01-09 18:21:55 +04:00
event . preventDefault ( ) ;
2011-08-28 22:14:50 +04:00
action ( filename ) ;
}
2011-07-19 22:57:40 +04:00
}
2011-06-04 22:16:44 +04:00
}
2012-03-16 19:25:41 +04:00
2011-06-04 22:16:44 +04:00
} ) ;
2012-03-16 19:25:41 +04:00
2011-06-04 20:44:14 +04:00
// Sets the select_all checkbox behaviour :
$ ( '#select_all' ) . click ( function ( ) {
2011-07-07 04:28:57 +04:00
if ( $ ( this ) . attr ( 'checked' ) ) {
2011-06-04 20:44:14 +04:00
// Check all
2011-07-22 00:01:55 +04:00
$ ( 'td.filename input:checkbox' ) . attr ( 'checked' , true ) ;
$ ( 'td.filename input:checkbox' ) . parent ( ) . parent ( ) . addClass ( 'selected' ) ;
2011-07-07 04:28:57 +04:00
} else {
2011-06-04 20:44:14 +04:00
// Uncheck all
2011-07-22 00:01:55 +04:00
$ ( 'td.filename input:checkbox' ) . attr ( 'checked' , false ) ;
$ ( 'td.filename input:checkbox' ) . parent ( ) . parent ( ) . removeClass ( 'selected' ) ;
2011-07-07 04:28:57 +04:00
}
2011-07-22 00:01:55 +04:00
procesSelection ( ) ;
2011-06-04 20:44:14 +04:00
} ) ;
2012-03-16 19:25:41 +04:00
2013-01-19 01:38:44 +04:00
$ ( '#fileList' ) . on ( 'change' , 'td.filename input:checkbox' , function ( event ) {
2011-08-28 23:21:53 +04:00
if ( event . shiftKey ) {
var last = $ ( lastChecked ) . parent ( ) . parent ( ) . prevAll ( ) . length ;
var first = $ ( this ) . parent ( ) . parent ( ) . prevAll ( ) . length ;
var start = Math . min ( first , last ) ;
var end = Math . max ( first , last ) ;
var rows = $ ( this ) . parent ( ) . parent ( ) . parent ( ) . children ( 'tr' ) ;
for ( var i = start ; i < end ; i ++ ) {
$ ( rows ) . each ( function ( index ) {
if ( index == i ) {
var checkbox = $ ( this ) . children ( ) . children ( 'input:checkbox' ) ;
$ ( checkbox ) . attr ( 'checked' , 'checked' ) ;
$ ( checkbox ) . parent ( ) . parent ( ) . addClass ( 'selected' ) ;
}
} ) ;
}
}
2011-07-22 00:01:55 +04:00
var selectedCount = $ ( 'td.filename input:checkbox:checked' ) . length ;
2011-07-07 04:28:57 +04:00
$ ( this ) . parent ( ) . parent ( ) . toggleClass ( 'selected' ) ;
2011-04-18 14:49:52 +04:00
if ( ! $ ( this ) . attr ( 'checked' ) ) {
$ ( '#select_all' ) . attr ( 'checked' , false ) ;
} else {
2011-07-22 00:01:55 +04:00
if ( selectedCount == $ ( 'td.filename input:checkbox' ) . length ) {
2011-04-18 14:49:52 +04:00
$ ( '#select_all' ) . attr ( 'checked' , true ) ;
}
}
2011-07-22 00:01:55 +04:00
procesSelection ( ) ;
2011-04-18 14:49:52 +04:00
} ) ;
2012-03-16 19:25:41 +04:00
2011-07-26 18:14:20 +04:00
$ ( '.download' ) . click ( 'click' , function ( event ) {
2013-03-07 17:15:02 +04:00
var files = getSelectedFiles ( 'name' ) ;
var fileslist = JSON . stringify ( files ) ;
2011-04-18 17:40:17 +04:00
var dir = $ ( '#dir' ) . val ( ) || '/' ;
2013-01-19 18:58:15 +04:00
OC . Notification . show ( t ( 'files' , 'Your download is being prepared. This might take some time if the files are big.' ) ) ;
2012-10-05 18:12:04 +04:00
// use special download URL if provided, e.g. for public shared files
if ( ( downloadURL = document . getElementById ( "downloadURL" ) ) ) {
2013-03-13 14:15:17 +04:00
window . location = downloadURL . value + "&download&files=" + encodeURIComponent ( fileslist ) ;
2012-10-05 18:12:04 +04:00
} else {
2013-03-07 17:15:02 +04:00
window . location = OC . filePath ( 'files' , 'ajax' , 'download.php' ) + '?' + $ . param ( { dir : dir , files : fileslist } ) ;
2012-10-05 18:12:04 +04:00
}
2011-04-18 17:40:17 +04:00
return false ;
} ) ;
2012-03-16 19:25:41 +04:00
2013-03-26 19:27:56 +04:00
$ ( '.delete-selected' ) . click ( function ( event ) {
2011-08-04 02:22:44 +04:00
var files = getSelectedFiles ( 'name' ) ;
event . preventDefault ( ) ;
2011-08-28 03:32:48 +04:00
FileList . do _delete ( files ) ;
2011-04-18 18:48:35 +04:00
return false ;
} ) ;
2011-06-03 04:44:31 +04:00
2012-03-16 03:03:23 +04:00
// drag&drop support using jquery.fileupload
2012-04-15 18:47:53 +04:00
// TODO use OC.dialogs
2012-03-27 23:38:55 +04:00
$ ( document ) . bind ( 'drop dragover' , function ( e ) {
e . preventDefault ( ) ; // prevent browser from doing anything, if file isn't dropped in dropZone
} ) ;
2012-10-14 23:04:08 +04:00
2012-11-23 03:20:46 +04:00
//do a background scan if needed
scanFiles ( ) ;
2012-08-29 10:42:49 +04:00
2012-08-04 23:50:10 +04:00
var lastWidth = 0 ;
var breadcrumbs = [ ] ;
2012-10-04 16:31:06 +04:00
var breadcrumbsWidth = 0 ;
if ( document . getElementById ( "navigation" ) ) {
breadcrumbsWidth = $ ( '#navigation' ) . get ( 0 ) . offsetWidth ;
}
2012-08-04 23:50:10 +04:00
var hiddenBreadcrumbs = 0 ;
$ . each ( $ ( '.crumb' ) , function ( index , breadcrumb ) {
breadcrumbs [ index ] = breadcrumb ;
breadcrumbsWidth += $ ( breadcrumb ) . get ( 0 ) . offsetWidth ;
} ) ;
2013-02-10 15:38:16 +04:00
$ . each ( $ ( '#controls .actions>div' ) , function ( index , action ) {
breadcrumbsWidth += $ ( action ) . get ( 0 ) . offsetWidth ;
} ) ;
2012-08-07 01:33:50 +04:00
2012-08-04 23:50:10 +04:00
function resizeBreadcrumbs ( firstRun ) {
var width = $ ( this ) . width ( ) ;
if ( width != lastWidth ) {
2012-08-04 23:57:49 +04:00
if ( ( width < lastWidth || firstRun ) && width < breadcrumbsWidth ) {
2012-08-04 23:50:10 +04:00
if ( hiddenBreadcrumbs == 0 ) {
breadcrumbsWidth -= $ ( breadcrumbs [ 1 ] ) . get ( 0 ) . offsetWidth ;
$ ( breadcrumbs [ 1 ] ) . find ( 'a' ) . hide ( ) ;
$ ( breadcrumbs [ 1 ] ) . append ( '<span>...</span>' ) ;
breadcrumbsWidth += $ ( breadcrumbs [ 1 ] ) . get ( 0 ) . offsetWidth ;
hiddenBreadcrumbs = 2 ;
}
var i = hiddenBreadcrumbs ;
while ( width < breadcrumbsWidth && i > 1 && i < breadcrumbs . length - 1 ) {
breadcrumbsWidth -= $ ( breadcrumbs [ i ] ) . get ( 0 ) . offsetWidth ;
$ ( breadcrumbs [ i ] ) . hide ( ) ;
hiddenBreadcrumbs = i ;
i ++
}
} else if ( width > lastWidth && hiddenBreadcrumbs > 0 ) {
var i = hiddenBreadcrumbs ;
while ( width > breadcrumbsWidth && i > 0 ) {
if ( hiddenBreadcrumbs == 1 ) {
breadcrumbsWidth -= $ ( breadcrumbs [ 1 ] ) . get ( 0 ) . offsetWidth ;
$ ( breadcrumbs [ 1 ] ) . find ( 'span' ) . remove ( ) ;
$ ( breadcrumbs [ 1 ] ) . find ( 'a' ) . show ( ) ;
breadcrumbsWidth += $ ( breadcrumbs [ 1 ] ) . get ( 0 ) . offsetWidth ;
} else {
$ ( breadcrumbs [ i ] ) . show ( ) ;
breadcrumbsWidth += $ ( breadcrumbs [ i ] ) . get ( 0 ) . offsetWidth ;
if ( breadcrumbsWidth > width ) {
breadcrumbsWidth -= $ ( breadcrumbs [ i ] ) . get ( 0 ) . offsetWidth ;
$ ( breadcrumbs [ i ] ) . hide ( ) ;
break ;
}
}
i -- ;
hiddenBreadcrumbs = i ;
}
}
lastWidth = width ;
}
}
$ ( window ) . resize ( function ( ) {
resizeBreadcrumbs ( false ) ;
} ) ;
2012-08-29 10:42:49 +04:00
2012-08-04 23:50:10 +04:00
resizeBreadcrumbs ( true ) ;
2013-01-11 19:47:28 +04:00
2013-01-11 18:02:34 +04:00
// display storage warnings
setTimeout ( "Files.displayStorageWarnings()" , 100 ) ;
OC . Notification . setDefault ( Files . displayStorageWarnings ) ;
2013-01-19 02:22:34 +04:00
2013-01-11 19:47:28 +04:00
// file space size sync
function update _storage _statistics ( ) {
$ . getJSON ( OC . filePath ( 'files' , 'ajax' , 'getstoragestats.php' ) , function ( response ) {
Files . updateMaxUploadFilesize ( response ) ;
} ) ;
}
// start on load - we ask the server every 5 minutes
var update _storage _statistics _interval = 5 * 60 * 1000 ;
var update _storage _statistics _interval _id = setInterval ( update _storage _statistics , update _storage _statistics _interval ) ;
// Use jquery-visibility to de-/re-activate file stats sync
if ( $ . support . pageVisibility ) {
$ ( document ) . on ( {
'show.visibility' : function ( ) {
if ( ! update _storage _statistics _interval _id ) {
update _storage _statistics _interval _id = setInterval ( update _storage _statistics , update _storage _statistics _interval ) ;
}
} ,
'hide.visibility' : function ( ) {
clearInterval ( update _storage _statistics _interval _id ) ;
update _storage _statistics _interval _id = 0 ;
}
} ) ;
}
2011-03-03 01:06:23 +03:00
} ) ;
2011-04-17 00:56:40 +04:00
2013-06-19 03:26:08 +04:00
function scanFiles ( force , dir , users ) {
2013-02-01 02:26:40 +04:00
if ( ! OC . currentUser ) {
return ;
}
2012-04-26 00:42:00 +04:00
if ( ! dir ) {
2012-11-23 03:20:46 +04:00
dir = '' ;
2012-04-26 00:42:00 +04:00
}
2012-11-23 03:20:46 +04:00
force = ! ! force ; //cast to bool
scanFiles . scanning = true ;
2013-06-19 03:26:08 +04:00
var scannerEventSource ;
if ( users ) {
var usersString ;
if ( users === 'all' ) {
usersString = users ;
} else {
2013-06-19 17:02:18 +04:00
usersString = JSON . stringify ( users ) ;
2013-06-19 03:26:08 +04:00
}
scannerEventSource = new OC . EventSource ( OC . filePath ( 'files' , 'ajax' , 'scan.php' ) , { force : force , dir : dir , users : usersString } ) ;
} else {
scannerEventSource = new OC . EventSource ( OC . filePath ( 'files' , 'ajax' , 'scan.php' ) , { force : force , dir : dir } ) ;
}
2012-11-23 03:20:46 +04:00
scanFiles . cancel = scannerEventSource . close . bind ( scannerEventSource ) ;
scannerEventSource . listen ( 'count' , function ( count ) {
2013-05-24 16:31:06 +04:00
console . log ( count + ' files scanned' )
2012-11-23 03:20:46 +04:00
} ) ;
scannerEventSource . listen ( 'folder' , function ( path ) {
console . log ( 'now scanning ' + path )
2012-01-31 02:32:55 +04:00
} ) ;
2012-11-23 03:20:46 +04:00
scannerEventSource . listen ( 'done' , function ( count ) {
2012-02-01 18:33:12 +04:00
scanFiles . scanning = false ;
2013-05-24 16:31:06 +04:00
console . log ( 'done after ' + count + ' files' ) ;
2012-01-31 02:32:55 +04:00
} ) ;
2013-06-19 03:26:08 +04:00
scannerEventSource . listen ( 'user' , function ( user ) {
console . log ( 'scanning files for ' + user ) ;
} ) ;
2011-11-10 19:40:09 +04:00
}
2012-02-01 18:33:12 +04:00
scanFiles . scanning = false ;
2011-11-10 19:40:09 +04:00
2011-06-04 20:44:14 +04:00
function boolOperationFinished ( data , callback ) {
result = jQuery . parseJSON ( data . responseText ) ;
2013-01-18 23:09:03 +04:00
Files . updateMaxUploadFilesize ( result ) ;
2011-04-17 19:49:56 +04:00
if ( result . status == 'success' ) {
2011-06-04 20:44:14 +04:00
callback . call ( ) ;
2011-04-17 19:49:56 +04:00
} else {
alert ( result . data . message ) ;
}
}
2011-04-17 17:59:06 +04:00
function updateBreadcrumb ( breadcrumbHtml ) {
$ ( 'p.nav' ) . empty ( ) . html ( breadcrumbHtml ) ;
}
2013-01-19 00:49:38 +04:00
var createDragShadow = function ( event ) {
//select dragged file
2013-01-21 17:58:55 +04:00
var isDragSelected = $ ( event . target ) . parents ( 'tr' ) . find ( 'td input:first' ) . prop ( 'checked' ) ;
if ( ! isDragSelected ) {
//select dragged file
$ ( event . target ) . parents ( 'tr' ) . find ( 'td input:first' ) . prop ( 'checked' , true ) ;
}
2013-02-22 20:21:57 +04:00
2013-01-19 00:49:38 +04:00
var selectedFiles = getSelectedFiles ( ) ;
2013-02-22 20:21:57 +04:00
2013-01-21 17:58:55 +04:00
if ( ! isDragSelected && selectedFiles . length == 1 ) {
//revert the selection
$ ( event . target ) . parents ( 'tr' ) . find ( 'td input:first' ) . prop ( 'checked' , false ) ;
}
2013-02-22 20:21:57 +04:00
2013-01-19 00:49:38 +04:00
//also update class when we dragged more than one file
if ( selectedFiles . length > 1 ) {
$ ( event . target ) . parents ( 'tr' ) . addClass ( 'selected' ) ;
}
2013-02-22 20:21:57 +04:00
2013-01-19 00:49:38 +04:00
// build dragshadow
var dragshadow = $ ( '<table class="dragshadow"></table>' ) ;
var tbody = $ ( '<tbody></tbody>' ) ;
dragshadow . append ( tbody ) ;
2013-02-22 20:21:57 +04:00
2013-01-19 00:49:38 +04:00
var dir = $ ( '#dir' ) . val ( ) ;
2013-02-22 20:21:57 +04:00
2013-01-19 00:49:38 +04:00
$ ( selectedFiles ) . each ( function ( i , elem ) {
2013-04-22 23:54:25 +04:00
var newtr = $ ( '<tr/>' ) . attr ( 'data-dir' , dir ) . attr ( 'data-filename' , elem . name ) ;
newtr . append ( $ ( '<td/>' ) . addClass ( 'filename' ) . text ( elem . name ) ) ;
newtr . append ( $ ( '<td/>' ) . addClass ( 'size' ) . text ( humanFileSize ( elem . size ) ) ) ;
2013-01-19 00:49:38 +04:00
tbody . append ( newtr ) ;
if ( elem . type === 'dir' ) {
newtr . find ( 'td.filename' ) . attr ( 'style' , 'background-image:url(' + OC . imagePath ( 'core' , 'filetypes/folder.png' ) + ')' ) ;
} else {
getMimeIcon ( elem . mime , function ( path ) {
newtr . find ( 'td.filename' ) . attr ( 'style' , 'background-image:url(' + path + ')' ) ;
} ) ;
}
} ) ;
2013-02-22 20:21:57 +04:00
2013-01-19 00:49:38 +04:00
return dragshadow ;
}
//options for file drag/drop
2011-07-07 23:43:35 +04:00
var dragOptions = {
2013-01-21 17:58:55 +04:00
revert : 'invalid' , revertDuration : 300 ,
opacity : 0.7 , zIndex : 100 , appendTo : 'body' , cursorAt : { left : - 5 , top : - 5 } ,
2013-01-19 00:49:38 +04:00
helper : createDragShadow , cursor : 'move' ,
2011-07-07 23:43:35 +04:00
stop : function ( event , ui ) {
$ ( '#fileList tr td.filename' ) . addClass ( 'ui-draggable' ) ;
}
2013-01-19 00:49:38 +04:00
}
2013-02-25 18:08:14 +04:00
// sane browsers support using the distance option
2013-03-28 22:13:37 +04:00
if ( $ ( 'html.ie' ) . length === 0 ) {
2013-02-25 18:08:14 +04:00
dragOptions [ 'distance' ] = 20 ;
2013-06-25 14:24:14 +04:00
}
2013-01-19 00:49:38 +04:00
2011-07-07 23:43:35 +04:00
var folderDropOptions = {
drop : function ( event , ui ) {
2013-01-19 00:49:38 +04:00
//don't allow moving a file into a selected folder
if ( $ ( event . target ) . parents ( 'tr' ) . find ( 'td input:first' ) . prop ( 'checked' ) === true ) {
return false ;
}
2013-02-22 20:21:57 +04:00
2013-01-30 16:29:24 +04:00
var target = $ . trim ( $ ( this ) . find ( '.nametext' ) . text ( ) ) ;
2013-02-22 20:21:57 +04:00
2013-01-19 00:49:38 +04:00
var files = ui . helper . find ( 'tr' ) ;
$ ( files ) . each ( function ( i , row ) {
var dir = $ ( row ) . data ( 'dir' ) ;
var file = $ ( row ) . data ( 'filename' ) ;
2013-01-19 01:16:04 +04:00
$ . post ( OC . filePath ( 'files' , 'ajax' , 'move.php' ) , { dir : dir , file : file , target : dir + '/' + target } , function ( result ) {
2013-01-19 00:49:38 +04:00
if ( result ) {
if ( result . status === 'success' ) {
//recalculate folder size
var oldSize = $ ( '#fileList tr' ) . filterAttr ( 'data-file' , target ) . data ( 'size' ) ;
var newSize = oldSize + $ ( '#fileList tr' ) . filterAttr ( 'data-file' , file ) . data ( 'size' ) ;
$ ( '#fileList tr' ) . filterAttr ( 'data-file' , target ) . data ( 'size' , newSize ) ;
$ ( '#fileList tr' ) . filterAttr ( 'data-file' , target ) . find ( 'td.filesize' ) . text ( humanFileSize ( newSize ) ) ;
FileList . remove ( file ) ;
procesSelection ( ) ;
$ ( '#notification' ) . hide ( ) ;
} else {
$ ( '#notification' ) . hide ( ) ;
$ ( '#notification' ) . text ( result . data . message ) ;
$ ( '#notification' ) . fadeIn ( ) ;
}
} else {
2013-04-06 18:52:55 +04:00
OC . dialogs . alert ( t ( 'Error moving file' ) , t ( 'core' , 'Error' ) ) ;
2013-01-19 00:49:38 +04:00
}
} ) ;
2011-07-07 23:43:35 +04:00
} ) ;
2013-01-19 00:49:38 +04:00
} ,
tolerance : 'pointer'
2011-07-22 00:01:55 +04:00
}
2013-01-19 00:49:38 +04:00
2011-07-26 18:43:12 +04:00
var crumbDropOptions = {
drop : function ( event , ui ) {
var target = $ ( this ) . data ( 'dir' ) ;
var dir = $ ( '#dir' ) . val ( ) ;
while ( dir . substr ( 0 , 1 ) == '/' ) { //remove extra leading /'s
dir = dir . substr ( 1 ) ;
}
dir = '/' + dir ;
if ( dir . substr ( - 1 , 1 ) != '/' ) {
dir = dir + '/' ;
}
2012-04-15 18:06:16 +04:00
if ( target == dir || target + '/' == dir ) {
2011-07-26 18:43:12 +04:00
return ;
}
2013-01-19 00:49:38 +04:00
var files = ui . helper . find ( 'tr' ) ;
$ ( files ) . each ( function ( i , row ) {
var dir = $ ( row ) . data ( 'dir' ) ;
var file = $ ( row ) . data ( 'filename' ) ;
2013-01-19 01:16:04 +04:00
$ . post ( OC . filePath ( 'files' , 'ajax' , 'move.php' ) , { dir : dir , file : file , target : target } , function ( result ) {
2013-01-19 00:49:38 +04:00
if ( result ) {
if ( result . status === 'success' ) {
FileList . remove ( file ) ;
procesSelection ( ) ;
$ ( '#notification' ) . hide ( ) ;
} else {
$ ( '#notification' ) . hide ( ) ;
$ ( '#notification' ) . text ( result . data . message ) ;
$ ( '#notification' ) . fadeIn ( ) ;
}
} else {
2013-04-06 18:52:55 +04:00
OC . dialogs . alert ( t ( 'Error moving file' ) , t ( 'core' , 'Error' ) ) ;
2013-01-19 00:49:38 +04:00
}
} ) ;
2011-07-26 18:43:12 +04:00
} ) ;
} ,
tolerance : 'pointer'
}
2011-07-22 00:01:55 +04:00
function procesSelection ( ) {
2011-07-26 18:43:12 +04:00
var selected = getSelectedFiles ( ) ;
var selectedFiles = selected . filter ( function ( el ) { return el . type == 'file' } ) ;
var selectedFolders = selected . filter ( function ( el ) { return el . type == 'dir' } ) ;
2012-12-20 13:53:50 +04:00
if ( selectedFiles . length == 0 && selectedFolders . length == 0 ) {
2011-08-28 06:16:39 +04:00
$ ( '#headerName>span.name' ) . text ( t ( 'files' , 'Name' ) ) ;
$ ( '#headerSize' ) . text ( t ( 'files' , 'Size' ) ) ;
2011-08-09 19:54:02 +04:00
$ ( '#modified' ) . text ( t ( 'files' , 'Modified' ) ) ;
2012-12-13 22:44:55 +04:00
$ ( 'table' ) . removeClass ( 'multiselect' ) ;
2011-07-28 14:14:55 +04:00
$ ( '.selectedActions' ) . hide ( ) ;
2012-12-20 13:53:50 +04:00
}
else {
2011-07-28 14:14:55 +04:00
$ ( '.selectedActions' ) . show ( ) ;
2011-07-22 00:01:55 +04:00
var totalSize = 0 ;
2011-07-26 18:43:12 +04:00
for ( var i = 0 ; i < selectedFiles . length ; i ++ ) {
totalSize += selectedFiles [ i ] . size ;
} ;
for ( var i = 0 ; i < selectedFolders . length ; i ++ ) {
totalSize += selectedFolders [ i ] . size ;
} ;
2013-07-19 00:15:26 +04:00
$ ( '#headerSize' ) . text ( humanFileSize ( totalSize ) ) ;
2011-07-22 00:01:55 +04:00
var selection = '' ;
2011-07-28 02:21:11 +04:00
if ( selectedFolders . length > 0 ) {
2013-08-09 22:37:18 +04:00
selection += n ( 'files' , '%n folder' , '%n folders' , selectedFolders . length ) ;
2011-07-28 02:21:11 +04:00
if ( selectedFiles . length > 0 ) {
selection += ' & ' ;
2011-07-22 00:01:55 +04:00
}
}
2011-07-28 02:21:11 +04:00
if ( selectedFiles . length > 0 ) {
2013-08-09 22:37:18 +04:00
selection += n ( 'files' , '%n file' , '%n files' , selectedFiles . length ) ;
2011-07-22 00:01:55 +04:00
}
2011-07-28 02:21:11 +04:00
$ ( '#headerName>span.name' ) . text ( selection ) ;
2011-07-28 14:14:55 +04:00
$ ( '#modified' ) . text ( '' ) ;
2012-12-13 22:44:55 +04:00
$ ( 'table' ) . addClass ( 'multiselect' ) ;
2011-07-22 00:01:55 +04:00
}
2011-07-26 18:14:20 +04:00
}
2011-07-25 22:24:59 +04:00
/ * *
* @ brief get a list of selected files
* @ param string property ( option ) the property of the file requested
* @ return array
*
2011-07-26 18:43:12 +04:00
* possible values for property : name , mime , size and type
2011-07-25 22:24:59 +04:00
* if property is set , an array with that property for each file is returnd
* if it ' s ommited an array of objects with all properties is returned
* /
function getSelectedFiles ( property ) {
2011-07-26 18:43:12 +04:00
var elements = $ ( 'td.filename input:checkbox:checked' ) . parent ( ) . parent ( ) ;
2011-07-25 22:24:59 +04:00
var files = [ ] ;
elements . each ( function ( i , element ) {
var file = {
2011-11-05 02:44:41 +04:00
name : $ ( element ) . attr ( 'data-file' ) ,
2011-07-26 18:43:12 +04:00
mime : $ ( element ) . data ( 'mime' ) ,
type : $ ( element ) . data ( 'type' ) ,
2012-11-16 13:23:40 +04:00
size : $ ( element ) . data ( 'size' )
2011-07-25 22:24:59 +04:00
} ;
if ( property ) {
files . push ( file [ property ] ) ;
} else {
2011-07-26 18:43:12 +04:00
files . push ( file ) ;
2011-07-25 22:24:59 +04:00
}
} ) ;
return files ;
2011-07-28 02:21:11 +04:00
}
2011-07-29 03:10:08 +04:00
2011-10-08 23:18:47 +04:00
function getMimeIcon ( mime , ready ) {
if ( getMimeIcon . cache [ mime ] ) {
ready ( getMimeIcon . cache [ mime ] ) ;
} else {
2012-12-14 01:31:43 +04:00
$ . get ( OC . filePath ( 'files' , 'ajax' , 'mimeicon.php' ) , { mime : mime } , function ( path ) {
2011-10-08 23:18:47 +04:00
getMimeIcon . cache [ mime ] = path ;
ready ( getMimeIcon . cache [ mime ] ) ;
} ) ;
2011-07-29 03:36:31 +04:00
}
2011-07-30 14:14:09 +04:00
}
2011-10-08 23:18:47 +04:00
getMimeIcon . cache = { } ;
2012-04-15 19:30:07 +04:00
function getUniqueName ( name ) {
if ( $ ( 'tr' ) . filterAttr ( 'data-file' , name ) . length > 0 ) {
var parts = name . split ( '.' ) ;
2012-06-29 17:23:04 +04:00
var extension = "" ;
if ( parts . length > 1 ) {
extension = parts . pop ( ) ;
}
2012-04-15 19:30:07 +04:00
var base = parts . join ( '.' ) ;
numMatch = base . match ( /\((\d+)\)/ ) ;
var num = 2 ;
if ( numMatch && numMatch . length > 0 ) {
num = parseInt ( numMatch [ numMatch . length - 1 ] ) + 1 ;
base = base . split ( '(' )
base . pop ( ) ;
2013-01-30 16:29:24 +04:00
base = $ . trim ( base . join ( '(' ) ) ;
2012-04-15 19:30:07 +04:00
}
2012-06-29 17:23:04 +04:00
name = base + ' (' + num + ')' ;
if ( extension ) {
name = name + '.' + extension ;
}
2012-04-15 19:30:07 +04:00
return getUniqueName ( name ) ;
}
return name ;
}
2013-07-26 13:13:43 +04:00
function checkTrashStatus ( ) {
$ . post ( OC . filePath ( 'files_trashbin' , 'ajax' , 'isEmpty.php' ) , function ( result ) {
if ( result . data . isEmpty === false ) {
$ ( "input[type=button][id=trash]" ) . removeAttr ( "disabled" ) ;
}
} ) ;
2013-08-09 22:37:18 +04:00
}