123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666 |
- 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();
- 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('<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);
- });
- 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 = $('<table class="dragshadow"></table>');
- var tbody = $('<tbody></tbody>');
- dragshadow.append(tbody);
- var dir=$('#dir').val();
- $(selectedFiles).each(function(i,elem){
- 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)));
- 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+')');
- });
- }
- });
- return dragshadow;
- }
- //options for file drag/drop
- var dragOptions={
- revert: 'invalid', revertDuration: 300,
- opacity: 0.7, zIndex: 100, appendTo: 'body', cursorAt: { left: -5, top: -5 },
- helper: createDragShadow, cursor: 'move',
- stop: function(event, ui) {
- $('#fileList tr td.filename').addClass('ui-draggable');
- }
- }
- // sane browsers support using the distance option
- if ( $('html.ie').length === 0) {
- dragOptions['distance'] = 20;
- }
- var folderDropOptions={
- drop: function( event, ui ) {
- //don't allow moving a file into a selected folder
- if ($(event.target).parents('tr').find('td input:first').prop('checked') === true) {
- return false;
- }
- var target=$.trim($(this).find('.nametext').text());
- var files = ui.helper.find('tr');
- $(files).each(function(i,row){
- var dir = $(row).data('dir');
- var file = $(row).data('filename');
- $.post(OC.filePath('files', 'ajax', 'move.php'), { dir: dir, file: file, target: dir+'/'+target }, function(result) {
- 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 {
- OC.dialogs.alert(t('Error moving file'), t('core', 'Error'));
- }
- });
- });
- },
- tolerance: 'pointer'
- }
- 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+'/';
- }
- if(target==dir || target+'/'==dir){
- return;
- }
- var files = ui.helper.find('tr');
- $(files).each(function(i,row){
- var dir = $(row).data('dir');
- var file = $(row).data('filename');
- $.post(OC.filePath('files', 'ajax', 'move.php'), { dir: dir, file: file, target: target }, function(result) {
- if (result) {
- if (result.status === 'success') {
- FileList.remove(file);
- procesSelection();
- $('#notification').hide();
- } else {
- $('#notification').hide();
- $('#notification').text(result.data.message);
- $('#notification').fadeIn();
- }
- } else {
- OC.dialogs.alert(t('Error moving file'), t('core', 'Error'));
- }
- });
- });
- },
- tolerance: 'pointer'
- }
- function procesSelection(){
- var selected=getSelectedFiles();
- var selectedFiles=selected.filter(function(el){return el.type=='file'});
- var selectedFolders=selected.filter(function(el){return el.type=='dir'});
- if(selectedFiles.length==0 && selectedFolders.length==0) {
- $('#headerName>span.name').text(t('files','Name'));
- $('#headerSize').text(t('files','Size'));
- $('#modified').text(t('files','Modified'));
- $('table').removeClass('multiselect');
- $('.selectedActions').hide();
- }
- else {
- $('.selectedActions').show();
- var totalSize=0;
- for(var i=0;i<selectedFiles.length;i++){
- totalSize+=selectedFiles[i].size;
- };
- for(var i=0;i<selectedFolders.length;i++){
- totalSize+=selectedFolders[i].size;
- };
- $('#headerSize').text(humanFileSize(totalSize));
- var selection='';
- if(selectedFolders.length>0){
- selection += n('files', '%n folder', '%n folders', selectedFolders.length);
- if(selectedFiles.length>0){
- selection+=' & ';
- }
- }
- if(selectedFiles.length>0){
- selection += n('files', '%n file', '%n files', selectedFiles.length);
- }
- $('#headerName>span.name').text(selection);
- $('#modified').text('');
- $('table').addClass('multiselect');
- }
- }
- /**
- * @brief get a list of selected files
- * @param string property (option) the property of the file requested
- * @return array
- *
- * possible values for property: name, mime, size and type
- * 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){
- var elements=$('td.filename input:checkbox:checked').parent().parent();
- var files=[];
- elements.each(function(i,element){
- var file={
- name:$(element).attr('data-file'),
- mime:$(element).data('mime'),
- type:$(element).data('type'),
- size:$(element).data('size')
- };
- if(property){
- files.push(file[property]);
- }else{
- files.push(file);
- }
- });
- return files;
- }
- function getMimeIcon(mime, ready){
- if(getMimeIcon.cache[mime]){
- ready(getMimeIcon.cache[mime]);
- }else{
- $.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path){
- getMimeIcon.cache[mime]=path;
- ready(getMimeIcon.cache[mime]);
- });
- }
- }
- getMimeIcon.cache={};
- function getUniqueName(name){
- if($('tr').filterAttr('data-file',name).length>0){
- var parts=name.split('.');
- var extension = "";
- if (parts.length > 1) {
- extension=parts.pop();
- }
- 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();
- base=$.trim(base.join('('));
- }
- name=base+' ('+num+')';
- if (extension) {
- name = name+'.'+extension;
- }
- return getUniqueName(name);
- }
- return name;
- }
- function checkTrashStatus() {
- $.post(OC.filePath('files_trashbin', 'ajax', 'isEmpty.php'), function(result){
- if (result.data.isEmpty === false) {
- $("input[type=button][id=trash]").removeAttr("disabled");
- }
- });
- }
|