2012-03-27 19:38:55 +00:00
Files = {
2013-01-18 19:09:03 +00:00
updateMaxUploadFilesize : function ( response ) {
if ( response == undefined ) {
return ;
}
if ( response . data !== undefined && response . data . uploadMaxFilesize !== undefined ) {
$ ( '#max_upload' ) . val ( response . data . uploadMaxFilesize ) ;
2013-01-18 23:31:49 +00:00
$ ( '#upload.button' ) . attr ( 'original-title' , response . data . maxHumanFilesize ) ;
$ ( '#usedSpacePercent' ) . val ( response . data . usedSpacePercent ) ;
Files . displayStorageWarnings ( ) ;
2013-01-18 19:09:03 +00:00
}
if ( response [ 0 ] == undefined ) {
return ;
}
if ( response [ 0 ] . uploadMaxFilesize !== undefined ) {
$ ( '#max_upload' ) . val ( response [ 0 ] . uploadMaxFilesize ) ;
2013-01-18 23:31:49 +00:00
$ ( '#upload.button' ) . attr ( 'original-title' , response [ 0 ] . maxHumanFilesize ) ;
$ ( '#usedSpacePercent' ) . val ( response [ 0 ] . usedSpacePercent ) ;
Files . displayStorageWarnings ( ) ;
2013-01-18 19:09:03 +00:00
}
} ,
2013-01-07 09:39:35 +00:00
isFileNameValid : function ( name ) {
if ( name === '.' ) {
2013-01-11 14:02:34 +00:00
OC . Notification . show ( t ( 'files' , '\'.\' is an invalid file name.' ) ) ;
2013-01-07 09:39:35 +00:00
return false ;
}
if ( name . length == 0 ) {
2013-01-11 14:02:34 +00:00
OC . Notification . show ( t ( 'files' , 'File name cannot be empty.' ) ) ;
2013-01-07 09:39:35 +00:00
return false ;
}
2013-01-06 11:52:00 +00:00
2013-01-07 09:39:35 +00:00
// check for invalid characters
2012-11-22 12:03:17 +00:00
var invalid _characters = [ '\\' , '/' , '<' , '>' , ':' , '"' , '|' , '?' , '*' ] ;
for ( var i = 0 ; i < invalid _characters . length ; i ++ ) {
if ( name . indexOf ( invalid _characters [ i ] ) != - 1 ) {
2013-01-04 22:34:09 +00:00
OC . Notification . show ( t ( 'files' , "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." ) ) ;
2013-01-06 11:52:00 +00:00
return false ;
2012-11-22 12:03:17 +00:00
}
}
2013-01-11 14:02:34 +00:00
OC . Notification . hide ( ) ;
2013-01-06 11:52:00 +00:00
return true ;
2013-01-02 14:09:40 +00:00
} ,
2013-01-18 22:22:34 +00:00
displayStorageWarnings : function ( ) {
2013-01-18 23:31:49 +00:00
if ( ! OC . Notification . isHidden ( ) ) {
return ;
}
2013-01-18 22:22:34 +00:00
var usedSpacePercent = $ ( '#usedSpacePercent' ) . val ( ) ;
if ( usedSpacePercent > 98 ) {
2013-01-11 14:02:34 +00:00
OC . Notification . show ( t ( 'files' , 'Your storage is full, files can not be updated or synced anymore!' ) ) ;
return ;
2013-01-18 22:22:34 +00:00
}
if ( usedSpacePercent > 90 ) {
2013-01-11 14:02:34 +00:00
OC . Notification . show ( t ( 'files' , 'Your storage is almost full ({usedSpacePercent}%)' , { usedSpacePercent : usedSpacePercent } ) ) ;
2013-01-18 22:22:34 +00:00
}
2013-08-12 15:25:27 +00:00
} ,
displayEncryptionWarning : function ( ) {
if ( ! OC . Notification . isHidden ( ) ) {
return ;
}
var encryptedFiles = $ ( '#encryptedFiles' ) . val ( ) ;
2013-09-06 10:27:40 +00:00
var initStatus = $ ( '#encryptionInitStatus' ) . val ( ) ;
if ( initStatus === '0' ) { // enc not initialized, but should be
OC . Notification . show ( t ( 'files_encryption' , 'Encryption App is enabled but your keys are not initialized, please log-out and log-in again' ) ) ;
return ;
}
if ( initStatus === '1' ) { // encryption tried to init but failed
OC . Notification . show ( t ( 'files_encryption' , 'Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.' ) ) ;
return ;
}
2013-08-12 15:25:27 +00:00
if ( encryptedFiles === '1' ) {
2013-08-15 11:13:16 +00: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 15:25:27 +00:00
return ;
}
2013-08-17 11:07:18 +00:00
} ,
setupDragAndDrop : function ( ) {
var $fileList = $ ( '#fileList' ) ;
//drag/drop of files
$fileList . find ( 'tr td.filename' ) . each ( function ( i , e ) {
if ( $ ( e ) . parent ( ) . data ( 'permissions' ) & OC . PERMISSION _DELETE ) {
$ ( e ) . draggable ( dragOptions ) ;
}
} ) ;
$fileList . find ( 'tr[data-type="dir"] td.filename' ) . each ( function ( i , e ) {
if ( $ ( e ) . parent ( ) . data ( 'permissions' ) & OC . PERMISSION _CREATE ) {
$ ( e ) . droppable ( folderDropOptions ) ;
}
} ) ;
2013-08-27 11:13:00 +00:00
} ,
lastWidth : 0 ,
initBreadCrumbs : function ( ) {
Files . lastWidth = 0 ;
Files . breadcrumbs = [ ] ;
// initialize with some extra space
Files . breadcrumbsWidth = 64 ;
if ( document . getElementById ( "navigation" ) ) {
Files . breadcrumbsWidth += $ ( '#navigation' ) . get ( 0 ) . offsetWidth ;
}
Files . hiddenBreadcrumbs = 0 ;
$ . each ( $ ( '.crumb' ) , function ( index , breadcrumb ) {
Files . breadcrumbs [ index ] = breadcrumb ;
Files . breadcrumbsWidth += $ ( breadcrumb ) . get ( 0 ) . offsetWidth ;
} ) ;
$ . each ( $ ( '#controls .actions>div' ) , function ( index , action ) {
Files . breadcrumbsWidth += $ ( action ) . get ( 0 ) . offsetWidth ;
} ) ;
2013-09-01 12:24:01 +00:00
// event handlers for breadcrumb items
$ ( '#controls .crumb a' ) . on ( 'click' , onClickBreadcrumb ) ;
2013-08-27 11:13:00 +00:00
} ,
resizeBreadcrumbs : function ( width , firstRun ) {
if ( width != Files . lastWidth ) {
if ( ( width < Files . lastWidth || firstRun ) && width < Files . breadcrumbsWidth ) {
if ( Files . hiddenBreadcrumbs == 0 ) {
Files . breadcrumbsWidth -= $ ( Files . breadcrumbs [ 1 ] ) . get ( 0 ) . offsetWidth ;
$ ( Files . breadcrumbs [ 1 ] ) . find ( 'a' ) . hide ( ) ;
$ ( Files . breadcrumbs [ 1 ] ) . append ( '<span>...</span>' ) ;
Files . breadcrumbsWidth += $ ( Files . breadcrumbs [ 1 ] ) . get ( 0 ) . offsetWidth ;
Files . hiddenBreadcrumbs = 2 ;
}
var i = Files . hiddenBreadcrumbs ;
while ( width < Files . breadcrumbsWidth && i > 1 && i < Files . breadcrumbs . length - 1 ) {
Files . breadcrumbsWidth -= $ ( Files . breadcrumbs [ i ] ) . get ( 0 ) . offsetWidth ;
$ ( Files . breadcrumbs [ i ] ) . hide ( ) ;
Files . hiddenBreadcrumbs = i ;
i ++
}
} else if ( width > Files . lastWidth && Files . hiddenBreadcrumbs > 0 ) {
var i = Files . hiddenBreadcrumbs ;
while ( width > Files . breadcrumbsWidth && i > 0 ) {
if ( Files . hiddenBreadcrumbs == 1 ) {
Files . breadcrumbsWidth -= $ ( Files . breadcrumbs [ 1 ] ) . get ( 0 ) . offsetWidth ;
$ ( Files . breadcrumbs [ 1 ] ) . find ( 'span' ) . remove ( ) ;
$ ( Files . breadcrumbs [ 1 ] ) . find ( 'a' ) . show ( ) ;
Files . breadcrumbsWidth += $ ( Files . breadcrumbs [ 1 ] ) . get ( 0 ) . offsetWidth ;
} else {
$ ( Files . breadcrumbs [ i ] ) . show ( ) ;
Files . breadcrumbsWidth += $ ( Files . breadcrumbs [ i ] ) . get ( 0 ) . offsetWidth ;
if ( Files . breadcrumbsWidth > width ) {
Files . breadcrumbsWidth -= $ ( Files . breadcrumbs [ i ] ) . get ( 0 ) . offsetWidth ;
$ ( Files . breadcrumbs [ i ] ) . hide ( ) ;
break ;
}
}
i -- ;
Files . hiddenBreadcrumbs = i ;
}
}
Files . lastWidth = width ;
}
2012-03-27 19:38:55 +00:00
}
2012-09-05 20:17:33 +00:00
} ;
2011-03-02 22:06:23 +00:00
$ ( document ) . ready ( function ( ) {
2013-09-01 12:36:33 +00:00
// FIXME: workaround for trashbin app
if ( window . trashBinApp ) {
return ;
}
2013-08-12 15:25:27 +00:00
Files . displayEncryptionWarning ( ) ;
2013-01-14 19:30:39 +00:00
Files . bindKeyboardShortcuts ( document , jQuery ) ;
2013-08-17 11:07:18 +00:00
FileList . postProcessList ( ) ;
Files . setupDragAndDrop ( ) ;
2012-03-16 15:25:41 +00:00
2011-04-17 15:49:56 +00:00
$ ( '#file_action_panel' ) . attr ( 'activeAction' , false ) ;
2011-07-07 19:43:35 +00:00
2012-04-15 14:06:16 +00:00
$ ( 'div.crumb:not(.last)' ) . droppable ( crumbDropOptions ) ;
2011-11-23 20:31:27 +00:00
$ ( 'ul#apps>li:first-child' ) . data ( 'dir' , '' ) ;
2012-04-15 14:06:16 +00:00
if ( $ ( 'div.crumb' ) . length ) {
$ ( 'ul#apps>li:first-child' ) . droppable ( crumbDropOptions ) ;
}
2012-03-16 15:25:41 +00:00
2011-08-11 20:22:32 +00:00
// Triggers invisible file input
2013-01-18 21:38:44 +00:00
$ ( '#upload a' ) . on ( 'click' , function ( ) {
2012-12-05 10:17:41 +00:00
$ ( this ) . parent ( ) . children ( '#file_upload_start' ) . trigger ( 'click' ) ;
2011-08-11 20:22:32 +00:00
return false ;
} ) ;
2013-02-22 16:21:57 +00:00
2013-04-28 21:25:58 +00:00
// Trigger cancelling of file upload
2013-04-28 21:28:41 +00:00
$ ( '#uploadprogresswrapper .stop' ) . on ( 'click' , function ( ) {
2013-08-16 09:40:55 +00:00
OC . Upload . cancelUploads ( ) ;
procesSelection ( ) ;
2013-04-28 21:25:58 +00:00
} ) ;
2013-01-18 09:23:31 +00:00
// Show trash bin
2013-07-26 09:13:43 +00:00
$ ( '#trash' ) . on ( 'click' , function ( ) {
2013-01-18 09:23:31 +00:00
window . location = OC . filePath ( 'files_trashbin' , '' , 'index.php' ) ;
2013-01-15 19:35:15 +00:00
} ) ;
2011-08-11 20:22:32 +00:00
2011-08-28 19:21:53 +00:00
var lastChecked ;
2011-06-04 18:16:44 +00:00
// Sets the file link behaviour :
2013-01-30 16:10:40 +00:00
$ ( '#fileList' ) . on ( 'click' , 'td.filename a' , function ( event ) {
2011-08-28 19:21:53 +00:00
if ( event . ctrlKey || event . shiftKey ) {
2013-01-09 14:21:55 +00:00
event . preventDefault ( ) ;
2011-08-28 19:21:53 +00: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 18:14:50 +00:00
var checkbox = $ ( this ) . parent ( ) . children ( 'input:checkbox' ) ;
2011-08-28 19:21:53 +00:00
lastChecked = checkbox ;
2011-08-28 18:14:50 +00: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 19:26:17 +00:00
var filename = $ ( this ) . parent ( ) . parent ( ) . attr ( 'data-file' ) ;
2011-12-05 22:51:44 +00:00
var tr = $ ( 'tr' ) . filterAttr ( 'data-file' , filename ) ;
2012-01-01 01:14:00 +00:00
var renaming = tr . data ( 'renaming' ) ;
if ( ! renaming && ! FileList . isLoading ( filename ) ) {
2013-02-18 10:22:43 +00:00
FileActions . currentFile = $ ( this ) . parent ( ) ;
var mime = FileActions . getCurrentMimeType ( ) ;
var type = FileActions . getCurrentType ( ) ;
var permissions = FileActions . getCurrentPermissions ( ) ;
2012-07-25 20:33:08 +00:00
var action = FileActions . getDefault ( mime , type , permissions ) ;
2011-08-28 18:14:50 +00:00
if ( action ) {
2013-01-09 14:21:55 +00:00
event . preventDefault ( ) ;
2011-08-28 18:14:50 +00:00
action ( filename ) ;
}
2011-07-19 18:57:40 +00:00
}
2011-06-04 18:16:44 +00:00
}
2012-03-16 15:25:41 +00:00
2011-06-04 18:16:44 +00:00
} ) ;
2012-03-16 15:25:41 +00:00
2011-06-04 16:44:14 +00:00
// Sets the select_all checkbox behaviour :
$ ( '#select_all' ) . click ( function ( ) {
2011-07-07 00:28:57 +00:00
if ( $ ( this ) . attr ( 'checked' ) ) {
2011-06-04 16:44:14 +00:00
// Check all
2011-07-21 20:01:55 +00:00
$ ( 'td.filename input:checkbox' ) . attr ( 'checked' , true ) ;
$ ( 'td.filename input:checkbox' ) . parent ( ) . parent ( ) . addClass ( 'selected' ) ;
2011-07-07 00:28:57 +00:00
} else {
2011-06-04 16:44:14 +00:00
// Uncheck all
2011-07-21 20:01:55 +00:00
$ ( 'td.filename input:checkbox' ) . attr ( 'checked' , false ) ;
$ ( 'td.filename input:checkbox' ) . parent ( ) . parent ( ) . removeClass ( 'selected' ) ;
2011-07-07 00:28:57 +00:00
}
2011-07-21 20:01:55 +00:00
procesSelection ( ) ;
2011-06-04 16:44:14 +00:00
} ) ;
2012-03-16 15:25:41 +00:00
2013-01-18 21:38:44 +00:00
$ ( '#fileList' ) . on ( 'change' , 'td.filename input:checkbox' , function ( event ) {
2011-08-28 19:21:53 +00: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-21 20:01:55 +00:00
var selectedCount = $ ( 'td.filename input:checkbox:checked' ) . length ;
2011-07-07 00:28:57 +00:00
$ ( this ) . parent ( ) . parent ( ) . toggleClass ( 'selected' ) ;
2011-04-18 10:49:52 +00:00
if ( ! $ ( this ) . attr ( 'checked' ) ) {
$ ( '#select_all' ) . attr ( 'checked' , false ) ;
} else {
2011-07-21 20:01:55 +00:00
if ( selectedCount == $ ( 'td.filename input:checkbox' ) . length ) {
2011-04-18 10:49:52 +00:00
$ ( '#select_all' ) . attr ( 'checked' , true ) ;
}
}
2011-07-21 20:01:55 +00:00
procesSelection ( ) ;
2011-04-18 10:49:52 +00:00
} ) ;
2012-03-16 15:25:41 +00:00
2011-07-26 14:14:20 +00:00
$ ( '.download' ) . click ( 'click' , function ( event ) {
2013-03-07 13:15:02 +00:00
var files = getSelectedFiles ( 'name' ) ;
var fileslist = JSON . stringify ( files ) ;
2011-04-18 13:40:17 +00:00
var dir = $ ( '#dir' ) . val ( ) || '/' ;
2013-01-19 14:58:15 +00:00
OC . Notification . show ( t ( 'files' , 'Your download is being prepared. This might take some time if the files are big.' ) ) ;
2012-10-05 14:12:04 +00:00
// use special download URL if provided, e.g. for public shared files
if ( ( downloadURL = document . getElementById ( "downloadURL" ) ) ) {
2013-03-13 10:15:17 +00:00
window . location = downloadURL . value + "&download&files=" + encodeURIComponent ( fileslist ) ;
2012-10-05 14:12:04 +00:00
} else {
2013-03-07 13:15:02 +00:00
window . location = OC . filePath ( 'files' , 'ajax' , 'download.php' ) + '?' + $ . param ( { dir : dir , files : fileslist } ) ;
2012-10-05 14:12:04 +00:00
}
2011-04-18 13:40:17 +00:00
return false ;
} ) ;
2012-03-16 15:25:41 +00:00
2013-03-26 15:27:56 +00:00
$ ( '.delete-selected' ) . click ( function ( event ) {
2011-08-03 22:22:44 +00:00
var files = getSelectedFiles ( 'name' ) ;
event . preventDefault ( ) ;
2011-08-27 23:32:48 +00:00
FileList . do _delete ( files ) ;
2011-04-18 14:48:35 +00:00
return false ;
} ) ;
2011-06-03 00:44:31 +00:00
2012-03-15 23:03:23 +00:00
// drag&drop support using jquery.fileupload
2012-04-15 14:47:53 +00:00
// TODO use OC.dialogs
2012-03-27 19:38:55 +00:00
$ ( document ) . bind ( 'drop dragover' , function ( e ) {
e . preventDefault ( ) ; // prevent browser from doing anything, if file isn't dropped in dropZone
} ) ;
2012-10-14 19:04:08 +00:00
2012-11-22 23:20:46 +00:00
//do a background scan if needed
scanFiles ( ) ;
2012-08-29 06:42:49 +00:00
2013-08-27 11:13:00 +00:00
Files . initBreadCrumbs ( ) ;
2012-08-04 19:50:10 +00:00
$ ( window ) . resize ( function ( ) {
2013-08-27 11:13:00 +00:00
var width = $ ( this ) . width ( ) ;
Files . resizeBreadcrumbs ( width , false ) ;
2012-08-04 19:50:10 +00:00
} ) ;
2012-08-29 06:42:49 +00:00
2013-08-27 11:13:00 +00:00
var width = $ ( this ) . width ( ) ;
Files . resizeBreadcrumbs ( width , true ) ;
2013-01-11 15:47:28 +00:00
2013-01-11 14:02:34 +00:00
// display storage warnings
setTimeout ( "Files.displayStorageWarnings()" , 100 ) ;
OC . Notification . setDefault ( Files . displayStorageWarnings ) ;
2013-01-18 22:22:34 +00:00
2013-01-11 15:47:28 +00: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 ;
}
} ) ;
}
2013-07-31 20:24:52 +00:00
//scroll to and highlight preselected file
if ( getURLParameter ( 'scrollto' ) ) {
FileList . scrollTo ( getURLParameter ( 'scrollto' ) ) ;
}
2011-03-02 22:06:23 +00:00
} ) ;
2011-04-16 20:56:40 +00:00
2013-06-18 23:26:08 +00:00
function scanFiles ( force , dir , users ) {
2013-01-31 22:26:40 +00:00
if ( ! OC . currentUser ) {
return ;
}
2012-04-25 20:42:00 +00:00
if ( ! dir ) {
2012-11-22 23:20:46 +00:00
dir = '' ;
2012-04-25 20:42:00 +00:00
}
2012-11-22 23:20:46 +00:00
force = ! ! force ; //cast to bool
scanFiles . scanning = true ;
2013-06-18 23:26:08 +00:00
var scannerEventSource ;
if ( users ) {
var usersString ;
if ( users === 'all' ) {
usersString = users ;
} else {
2013-06-19 13:02:18 +00:00
usersString = JSON . stringify ( users ) ;
2013-06-18 23:26:08 +00: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-22 23:20:46 +00:00
scanFiles . cancel = scannerEventSource . close . bind ( scannerEventSource ) ;
scannerEventSource . listen ( 'count' , function ( count ) {
2013-05-24 12:31:06 +00:00
console . log ( count + ' files scanned' )
2012-11-22 23:20:46 +00:00
} ) ;
scannerEventSource . listen ( 'folder' , function ( path ) {
console . log ( 'now scanning ' + path )
2012-01-30 22:32:55 +00:00
} ) ;
2012-11-22 23:20:46 +00:00
scannerEventSource . listen ( 'done' , function ( count ) {
2012-02-01 14:33:12 +00:00
scanFiles . scanning = false ;
2013-05-24 12:31:06 +00:00
console . log ( 'done after ' + count + ' files' ) ;
2012-01-30 22:32:55 +00:00
} ) ;
2013-06-18 23:26:08 +00:00
scannerEventSource . listen ( 'user' , function ( user ) {
console . log ( 'scanning files for ' + user ) ;
} ) ;
2011-11-10 15:40:09 +00:00
}
2012-02-01 14:33:12 +00:00
scanFiles . scanning = false ;
2011-11-10 15:40:09 +00:00
2011-06-04 16:44:14 +00:00
function boolOperationFinished ( data , callback ) {
result = jQuery . parseJSON ( data . responseText ) ;
2013-01-18 19:09:03 +00:00
Files . updateMaxUploadFilesize ( result ) ;
2011-04-17 15:49:56 +00:00
if ( result . status == 'success' ) {
2011-06-04 16:44:14 +00:00
callback . call ( ) ;
2011-04-17 15:49:56 +00:00
} else {
alert ( result . data . message ) ;
}
}
2013-01-18 20:49:38 +00:00
var createDragShadow = function ( event ) {
//select dragged file
2013-01-21 13:58:55 +00: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 16:21:57 +00:00
2013-01-18 20:49:38 +00:00
var selectedFiles = getSelectedFiles ( ) ;
2013-02-22 16:21:57 +00:00
2013-01-21 13:58:55 +00:00
if ( ! isDragSelected && selectedFiles . length == 1 ) {
//revert the selection
$ ( event . target ) . parents ( 'tr' ) . find ( 'td input:first' ) . prop ( 'checked' , false ) ;
}
2013-02-22 16:21:57 +00:00
2013-01-18 20:49:38 +00:00
//also update class when we dragged more than one file
if ( selectedFiles . length > 1 ) {
$ ( event . target ) . parents ( 'tr' ) . addClass ( 'selected' ) ;
}
2013-02-22 16:21:57 +00:00
2013-01-18 20:49:38 +00:00
// build dragshadow
var dragshadow = $ ( '<table class="dragshadow"></table>' ) ;
var tbody = $ ( '<tbody></tbody>' ) ;
dragshadow . append ( tbody ) ;
2013-02-22 16:21:57 +00:00
2013-01-18 20:49:38 +00:00
var dir = $ ( '#dir' ) . val ( ) ;
2013-02-22 16:21:57 +00:00
2013-01-18 20:49:38 +00:00
$ ( selectedFiles ) . each ( function ( i , elem ) {
2013-04-22 19:54:25 +00: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-18 20:49:38 +00:00
tbody . append ( newtr ) ;
if ( elem . type === 'dir' ) {
newtr . find ( 'td.filename' ) . attr ( 'style' , 'background-image:url(' + OC . imagePath ( 'core' , 'filetypes/folder.png' ) + ')' ) ;
} else {
2013-08-23 21:19:21 +00:00
var path = getPathForPreview ( elem . name ) ;
2013-08-14 11:25:07 +00:00
lazyLoadPreview ( path , elem . mime , function ( previewpath ) {
2013-07-02 09:13:22 +00:00
newtr . find ( 'td.filename' ) . attr ( 'style' , 'background-image:url(' + previewpath + ')' ) ;
2013-01-18 20:49:38 +00:00
} ) ;
}
} ) ;
2013-02-22 16:21:57 +00:00
2013-01-18 20:49:38 +00:00
return dragshadow ;
}
//options for file drag/drop
2011-07-07 19:43:35 +00:00
var dragOptions = {
2013-01-21 13:58:55 +00:00
revert : 'invalid' , revertDuration : 300 ,
opacity : 0.7 , zIndex : 100 , appendTo : 'body' , cursorAt : { left : - 5 , top : - 5 } ,
2013-01-18 20:49:38 +00:00
helper : createDragShadow , cursor : 'move' ,
2011-07-07 19:43:35 +00:00
stop : function ( event , ui ) {
$ ( '#fileList tr td.filename' ) . addClass ( 'ui-draggable' ) ;
}
2013-01-18 20:49:38 +00:00
}
2013-02-25 14:08:14 +00:00
// sane browsers support using the distance option
2013-03-28 18:13:37 +00:00
if ( $ ( 'html.ie' ) . length === 0 ) {
2013-02-25 14:08:14 +00:00
dragOptions [ 'distance' ] = 20 ;
2013-06-25 10:24:14 +00:00
}
2013-01-18 20:49:38 +00:00
2011-07-07 19:43:35 +00:00
var folderDropOptions = {
drop : function ( event , ui ) {
2013-01-18 20:49:38 +00: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 16:21:57 +00:00
2013-01-30 12:29:24 +00:00
var target = $ . trim ( $ ( this ) . find ( '.nametext' ) . text ( ) ) ;
2013-02-22 16:21:57 +00:00
2013-01-18 20:49:38 +00:00
var files = ui . helper . find ( 'tr' ) ;
$ ( files ) . each ( function ( i , row ) {
var dir = $ ( row ) . data ( 'dir' ) ;
var file = $ ( row ) . data ( 'filename' ) ;
2013-01-18 21:16:04 +00:00
$ . post ( OC . filePath ( 'files' , 'ajax' , 'move.php' ) , { dir : dir , file : file , target : dir + '/' + target } , function ( result ) {
2013-01-18 20:49:38 +00: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-09-19 09:13:11 +00:00
OC . dialogs . alert ( t ( 'files' , 'Error moving file' ) , t ( 'files' , 'Error' ) ) ;
2013-01-18 20:49:38 +00:00
}
} ) ;
2011-07-07 19:43:35 +00:00
} ) ;
2013-01-18 20:49:38 +00:00
} ,
tolerance : 'pointer'
2011-07-21 20:01:55 +00:00
}
2013-01-18 20:49:38 +00:00
2011-07-26 14:43:12 +00: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 14:06:16 +00:00
if ( target == dir || target + '/' == dir ) {
2011-07-26 14:43:12 +00:00
return ;
}
2013-01-18 20:49:38 +00:00
var files = ui . helper . find ( 'tr' ) ;
$ ( files ) . each ( function ( i , row ) {
var dir = $ ( row ) . data ( 'dir' ) ;
var file = $ ( row ) . data ( 'filename' ) ;
2013-01-18 21:16:04 +00:00
$ . post ( OC . filePath ( 'files' , 'ajax' , 'move.php' ) , { dir : dir , file : file , target : target } , function ( result ) {
2013-01-18 20:49:38 +00: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-09-19 09:13:11 +00:00
OC . dialogs . alert ( t ( 'files' , 'Error moving file' ) , t ( 'files' , 'Error' ) ) ;
2013-01-18 20:49:38 +00:00
}
} ) ;
2011-07-26 14:43:12 +00:00
} ) ;
} ,
tolerance : 'pointer'
}
2011-07-21 20:01:55 +00:00
function procesSelection ( ) {
2011-07-26 14:43:12 +00: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 09:53:50 +00:00
if ( selectedFiles . length == 0 && selectedFolders . length == 0 ) {
2011-08-28 02:16:39 +00:00
$ ( '#headerName>span.name' ) . text ( t ( 'files' , 'Name' ) ) ;
$ ( '#headerSize' ) . text ( t ( 'files' , 'Size' ) ) ;
2011-08-09 15:54:02 +00:00
$ ( '#modified' ) . text ( t ( 'files' , 'Modified' ) ) ;
2012-12-13 18:44:55 +00:00
$ ( 'table' ) . removeClass ( 'multiselect' ) ;
2011-07-28 10:14:55 +00:00
$ ( '.selectedActions' ) . hide ( ) ;
2012-12-20 09:53:50 +00:00
}
else {
2011-07-28 10:14:55 +00:00
$ ( '.selectedActions' ) . show ( ) ;
2011-07-21 20:01:55 +00:00
var totalSize = 0 ;
2011-07-26 14:43:12 +00: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-18 20:15:26 +00:00
$ ( '#headerSize' ) . text ( humanFileSize ( totalSize ) ) ;
2011-07-21 20:01:55 +00:00
var selection = '' ;
2011-07-27 22:21:11 +00:00
if ( selectedFolders . length > 0 ) {
2013-08-09 18:37:18 +00:00
selection += n ( 'files' , '%n folder' , '%n folders' , selectedFolders . length ) ;
2011-07-27 22:21:11 +00:00
if ( selectedFiles . length > 0 ) {
selection += ' & ' ;
2011-07-21 20:01:55 +00:00
}
}
2011-07-27 22:21:11 +00:00
if ( selectedFiles . length > 0 ) {
2013-08-09 18:37:18 +00:00
selection += n ( 'files' , '%n file' , '%n files' , selectedFiles . length ) ;
2011-07-21 20:01:55 +00:00
}
2011-07-27 22:21:11 +00:00
$ ( '#headerName>span.name' ) . text ( selection ) ;
2011-07-28 10:14:55 +00:00
$ ( '#modified' ) . text ( '' ) ;
2012-12-13 18:44:55 +00:00
$ ( 'table' ) . addClass ( 'multiselect' ) ;
2011-07-21 20:01:55 +00:00
}
2011-07-26 14:14:20 +00:00
}
2011-07-25 18:24:59 +00:00
/ * *
* @ brief get a list of selected files
* @ param string property ( option ) the property of the file requested
* @ return array
*
2011-07-26 14:43:12 +00:00
* possible values for property : name , mime , size and type
2011-07-25 18:24:59 +00: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 14:43:12 +00:00
var elements = $ ( 'td.filename input:checkbox:checked' ) . parent ( ) . parent ( ) ;
2011-07-25 18:24:59 +00:00
var files = [ ] ;
elements . each ( function ( i , element ) {
var file = {
2011-11-04 22:44:41 +00:00
name : $ ( element ) . attr ( 'data-file' ) ,
2011-07-26 14:43:12 +00:00
mime : $ ( element ) . data ( 'mime' ) ,
type : $ ( element ) . data ( 'type' ) ,
2012-11-16 09:23:40 +00:00
size : $ ( element ) . data ( 'size' )
2011-07-25 18:24:59 +00:00
} ;
if ( property ) {
files . push ( file [ property ] ) ;
} else {
2011-07-26 14:43:12 +00:00
files . push ( file ) ;
2011-07-25 18:24:59 +00:00
}
} ) ;
return files ;
2011-07-27 22:21:11 +00:00
}
2011-07-28 23:10:08 +00:00
2011-10-08 19:18:47 +00:00
function getMimeIcon ( mime , ready ) {
if ( getMimeIcon . cache [ mime ] ) {
ready ( getMimeIcon . cache [ mime ] ) ;
} else {
2012-12-13 21:31:43 +00:00
$ . get ( OC . filePath ( 'files' , 'ajax' , 'mimeicon.php' ) , { mime : mime } , function ( path ) {
2011-10-08 19:18:47 +00:00
getMimeIcon . cache [ mime ] = path ;
ready ( getMimeIcon . cache [ mime ] ) ;
} ) ;
2011-07-28 23:36:31 +00:00
}
2011-07-30 10:14:09 +00:00
}
2011-10-08 19:18:47 +00:00
getMimeIcon . cache = { } ;
2012-04-15 15:30:07 +00:00
2013-08-23 21:19:21 +00:00
function getPathForPreview ( name ) {
var path = $ ( '#dir' ) . val ( ) + '/' + name ;
return path ;
}
2013-09-19 08:00:42 +00:00
function lazyLoadPreview ( path , mime , ready , width , height ) {
2013-09-19 12:46:33 +00:00
// get mime icon url
getMimeIcon ( mime , function ( iconURL ) {
ready ( iconURL ) ; // set mimeicon URL
// now try getting a preview thumbnail URL
if ( ! width ) {
width = $ ( '#filestable' ) . data ( 'preview-x' ) ;
}
if ( ! height ) {
height = $ ( '#filestable' ) . data ( 'preview-y' ) ;
}
2013-09-23 10:27:05 +00:00
if ( $ ( '#publicUploadButtonMock' ) . length ) {
var previewURL = OC . Router . generate ( 'core_ajax_public_preview' , { file : encodeURIComponent ( path ) , x : width , y : height , t : $ ( '#dirToken' ) . val ( ) } ) ;
} else {
var previewURL = OC . Router . generate ( 'core_ajax_preview' , { file : encodeURIComponent ( path ) , x : width , y : height } ) ;
}
2013-09-19 12:46:33 +00:00
$ . get ( previewURL , function ( ) {
previewURL = previewURL . replace ( '(' , '%28' ) ;
previewURL = previewURL . replace ( ')' , '%29' ) ;
//set preview thumbnail URL
ready ( previewURL + '&reload=true' ) ;
} ) ;
2013-08-14 11:25:07 +00:00
} ) ;
2013-07-02 09:13:22 +00:00
}
2012-04-15 15:30:07 +00:00
function getUniqueName ( name ) {
if ( $ ( 'tr' ) . filterAttr ( 'data-file' , name ) . length > 0 ) {
var parts = name . split ( '.' ) ;
2012-06-29 13:23:04 +00:00
var extension = "" ;
if ( parts . length > 1 ) {
extension = parts . pop ( ) ;
}
2012-04-15 15:30:07 +00: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 12:29:24 +00:00
base = $ . trim ( base . join ( '(' ) ) ;
2012-04-15 15:30:07 +00:00
}
2012-06-29 13:23:04 +00:00
name = base + ' (' + num + ')' ;
if ( extension ) {
name = name + '.' + extension ;
}
2012-04-15 15:30:07 +00:00
return getUniqueName ( name ) ;
}
return name ;
}
2013-07-26 09:13:43 +00: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-07-29 22:34:36 +00:00
}
2013-08-17 11:07:18 +00:00
function onClickBreadcrumb ( e ) {
var $el = $ ( e . target ) . closest ( '.crumb' ) ;
e . preventDefault ( ) ;
FileList . changeDirectory ( decodeURIComponent ( $el . data ( 'dir' ) ) ) ;
}