var uploadingFiles = {}; Files={ cancelUpload:function(filename) { if(uploadingFiles[filename]) { uploadingFiles[filename].abort(); delete uploadingFiles[filename]; return true; } return false; }, cancelUploads:function() { $.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]; }); } delete uploadingFiles[index]; }); procesSelection(); }, updateMaxUploadFilesize:function(response) { if(response == undefined) { return; } if(response.data !== undefined && response.data.uploadMaxFilesize !== undefined) { $('#max_upload').val(response.data.uploadMaxFilesize); $('#upload.button').attr('original-title', response.data.maxHumanFilesize); $('#usedSpacePercent').val(response.data.usedSpacePercent); Files.displayStorageWarnings(); } if(response[0] == undefined) { return; } if(response[0].uploadMaxFilesize !== undefined) { $('#max_upload').val(response[0].uploadMaxFilesize); $('#upload.button').attr('original-title', response[0].maxHumanFilesize); $('#usedSpacePercent').val(response[0].usedSpacePercent); Files.displayStorageWarnings(); } }, isFileNameValid:function (name) { if (name === '.') { OC.Notification.show(t('files', '\'.\' is an invalid file name.')); return false; } if (name.length == 0) { OC.Notification.show(t('files', 'File name cannot be empty.')); return false; } // check for invalid characters var invalid_characters = ['\\', '/', '<', '>', ':', '"', '|', '?', '*']; for (var i = 0; i < invalid_characters.length; i++) { if (name.indexOf(invalid_characters[i]) != -1) { OC.Notification.show(t('files', "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.")); return false; } } OC.Notification.hide(); return true; }, displayStorageWarnings: function() { if (!OC.Notification.isHidden()) { return; } var usedSpacePercent = $('#usedSpacePercent').val(); if (usedSpacePercent > 98) { OC.Notification.show(t('files', 'Your storage is full, files can not be updated or synced anymore!')); return; } if (usedSpacePercent > 90) { OC.Notification.show(t('files', 'Your storage is almost full ({usedSpacePercent}%)', {usedSpacePercent: usedSpacePercent})); } }, displayEncryptionWarning: function() { if (!OC.Notification.isHidden()) { return; } var encryptedFiles = $('#encryptedFiles').val(); 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; } if (encryptedFiles === '1') { 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.')); return; } } }; $(document).ready(function() { Files.displayEncryptionWarning(); Files.bindKeyboardShortcuts(document, jQuery); $('#fileList tr').each(function(){ //little hack to set unescape filenames in attribute $(this).attr('data-file',decodeURIComponent($(this).attr('data-file'))); }); $('#file_action_panel').attr('activeAction', false); //drag/drop of files $('#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); } }); $('div.crumb:not(.last)').droppable(crumbDropOptions); $('ul#apps>li:first-child').data('dir',''); if($('div.crumb').length){ $('ul#apps>li:first-child').droppable(crumbDropOptions); } // Triggers invisible file input $('#upload a').on('click', function() { $(this).parent().children('#file_upload_start').trigger('click'); return false; }); // Trigger cancelling of file upload $('#uploadprogresswrapper .stop').on('click', function() { Files.cancelUploads(); }); // Show trash bin $('#trash').on('click', function() { window.location=OC.filePath('files_trashbin', '', 'index.php'); }); var lastChecked; // Sets the file link behaviour : $('#fileList').on('click','td.filename a',function(event) { if (event.ctrlKey || event.shiftKey) { event.preventDefault(); 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'); } }); } } var checkbox = $(this).parent().children('input:checkbox'); lastChecked = checkbox; 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 { var filename=$(this).parent().parent().attr('data-file'); var tr=$('tr').filterAttr('data-file',filename); var renaming=tr.data('renaming'); if(!renaming && !FileList.isLoading(filename)){ FileActions.currentFile = $(this).parent(); var mime=FileActions.getCurrentMimeType(); var type=FileActions.getCurrentType(); var permissions = FileActions.getCurrentPermissions(); var action=FileActions.getDefault(mime,type, permissions); if(action){ event.preventDefault(); action(filename); } } } }); // Sets the select_all checkbox behaviour : $('#select_all').click(function() { if($(this).attr('checked')){ // Check all $('td.filename input:checkbox').attr('checked', true); $('td.filename input:checkbox').parent().parent().addClass('selected'); }else{ // Uncheck all $('td.filename input:checkbox').attr('checked', false); $('td.filename input:checkbox').parent().parent().removeClass('selected'); } procesSelection(); }); $('#fileList').on('change', 'td.filename input:checkbox',function(event) { 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'); } }); } } var selectedCount=$('td.filename input:checkbox:checked').length; $(this).parent().parent().toggleClass('selected'); if(!$(this).attr('checked')){ $('#select_all').attr('checked',false); }else{ if(selectedCount==$('td.filename input:checkbox').length){ $('#select_all').attr('checked',true); } } procesSelection(); }); $('.download').click('click',function(event) { var files=getSelectedFiles('name'); var fileslist = JSON.stringify(files); var dir=$('#dir').val()||'/'; OC.Notification.show(t('files','Your download is being prepared. This might take some time if the files are big.')); // use special download URL if provided, e.g. for public shared files if ( (downloadURL = document.getElementById("downloadURL")) ) { window.location=downloadURL.value+"&download&files="+encodeURIComponent(fileslist); } else { window.location=OC.filePath('files', 'ajax', 'download.php') + '?'+ $.param({ dir: dir, files: fileslist }); } return false; }); $('.delete-selected').click(function(event) { var files=getSelectedFiles('name'); event.preventDefault(); FileList.do_delete(files); return false; }); // drag&drop support using jquery.fileupload // TODO use OC.dialogs $(document).bind('drop dragover', function (e) { e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone }); //do a background scan if needed scanFiles(); var lastWidth = 0; var breadcrumbs = []; var breadcrumbsWidth = 0; if ( document.getElementById("navigation") ) { breadcrumbsWidth = $('#navigation').get(0).offsetWidth; } var hiddenBreadcrumbs = 0; $.each($('.crumb'), function(index, breadcrumb) { breadcrumbs[index] = breadcrumb; breadcrumbsWidth += $(breadcrumb).get(0).offsetWidth; }); $.each($('#controls .actions>div'), function(index, action) { breadcrumbsWidth += $(action).get(0).offsetWidth; }); function resizeBreadcrumbs(firstRun) { var width = $(this).width(); if (width != lastWidth) { if ((width < lastWidth || firstRun) && width < breadcrumbsWidth) { if (hiddenBreadcrumbs == 0) { breadcrumbsWidth -= $(breadcrumbs[1]).get(0).offsetWidth; $(breadcrumbs[1]).find('a').hide(); $(breadcrumbs[1]).append('...'); 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); }); resizeBreadcrumbs(true); // display storage warnings setTimeout ( "Files.displayStorageWarnings()", 100 ); OC.Notification.setDefault(Files.displayStorageWarnings); // 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; } }); } }); function scanFiles(force, dir, users){ if (!OC.currentUser) { return; } if(!dir){ dir = ''; } force = !!force; //cast to bool scanFiles.scanning = true; var scannerEventSource; if (users) { var usersString; if (users === 'all') { usersString = users; } else { usersString = JSON.stringify(users); } 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}); } scanFiles.cancel = scannerEventSource.close.bind(scannerEventSource); scannerEventSource.listen('count',function(count){ console.log(count + ' files scanned') }); scannerEventSource.listen('folder',function(path){ console.log('now scanning ' + path) }); scannerEventSource.listen('done',function(count){ scanFiles.scanning=false; console.log('done after ' + count + ' files'); }); scannerEventSource.listen('user',function(user){ console.log('scanning files for ' + user); }); } scanFiles.scanning=false; function boolOperationFinished(data, callback) { result = jQuery.parseJSON(data.responseText); Files.updateMaxUploadFilesize(result); if(result.status == 'success'){ callback.call(); } else { alert(result.data.message); } } function updateBreadcrumb(breadcrumbHtml) { $('p.nav').empty().html(breadcrumbHtml); } var createDragShadow = function(event){ //select dragged file 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); } var selectedFiles = getSelectedFiles(); if (!isDragSelected && selectedFiles.length == 1) { //revert the selection $(event.target).parents('tr').find('td input:first').prop('checked',false); } //also update class when we dragged more than one file if (selectedFiles.length > 1) { $(event.target).parents('tr').addClass('selected'); } // build dragshadow var dragshadow = $('