]> source.dussan.org Git - nextcloud-server.git/commitdiff
show readonly message in file conflict dialog, make it always selected
authorJörn Friedrich Dreyer <jfd@butonic.de>
Mon, 8 Dec 2014 14:26:31 +0000 (15:26 +0100)
committerJörn Friedrich Dreyer <jfd@butonic.de>
Thu, 11 Dec 2014 15:32:27 +0000 (16:32 +0100)
apps/files/ajax/upload.php
apps/files/css/upload.css
apps/files/js/file-upload.js
apps/files/templates/fileexists.html
core/js/oc-dialogs.js

index eb99d0644f7c312a52e6956ee35161a9f9df6ba5..fcee0166da60e462da18653b07b60317fe322804 100644 (file)
@@ -117,6 +117,12 @@ if (strpos($dir, '..') === false) {
        $fileCount = count($files['name']);
        for ($i = 0; $i < $fileCount; $i++) {
 
+               if (isset($_POST['resolution'])) {
+                       $resolution = $_POST['resolution'];
+               } else {
+                       $resolution = null;
+               }
+
                // target directory for when uploading folders
                $relativePath = '';
                if(!empty($_POST['file_directory'])) {
@@ -124,7 +130,7 @@ if (strpos($dir, '..') === false) {
                }
 
                // $path needs to be normalized - this failed within drag'n'drop upload to a sub-folder
-               if (isset($_POST['resolution']) && $_POST['resolution']==='autorename') {
+               if ($resolution === 'autorename') {
                        // append a number in brackets like 'filename (2).ext'
                        $target = OCP\Files::buildNotExistingFileName(stripslashes($dir . $relativePath), $files['name'][$i]);
                } else {
@@ -141,9 +147,12 @@ if (strpos($dir, '..') === false) {
                }
                $returnedDir = \OC\Files\Filesystem::normalizePath($returnedDir);
 
-               if ( ! \OC\Files\Filesystem::file_exists($target)
-                       || (isset($_POST['resolution']) && $_POST['resolution']==='replace')
-               ) {
+
+               $exists = \OC\Files\Filesystem::file_exists($target);
+               if ($exists) {
+                       $updatable = \OC\Files\Filesystem::isUpdatable($target);
+               }
+               if ( ! $exists || ($updatable && $resolution === 'replace' ) ) {
                        // upload and overwrite file
                        try
                        {
@@ -181,8 +190,11 @@ if (strpos($dir, '..') === false) {
                                $error = $l->t('Upload failed. Could not get file info.');
                        } else {
                                $data = \OCA\Files\Helper::formatFileInfo($meta);
-                               $data['permissions'] = $data['permissions'] & $allowedPermissions;
-                               $data['status'] = 'existserror';
+                               if ($updatable) {
+                                       $data['status'] = 'existserror';
+                               } else {
+                                       $data['status'] = 'readonly';
+                               }
                                $data['originalname'] = $files['tmp_name'][$i];
                                $data['uploadMaxFilesize'] = $maxUploadFileSize;
                                $data['maxHumanFilesize'] = $maxHumanFileSize;
index 98754b910ded8828c588b09876f562ddf0ad53ce..cc383879fb26a2178cf7f6eb2d04cb5bd950b32a 100644 (file)
        font-size: 13px;
 }
 
+.oc-dialog .fileexists {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -khtml-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+.oc-dialog .fileexists .conflict .filename,
+.oc-dialog .fileexists .conflict .mtime,
+.oc-dialog .fileexists .conflict .size {
+       -webkit-touch-callout: initial;
+       -webkit-user-select: initial;
+       -khtml-user-select: initial;
+       -moz-user-select: initial;
+       -ms-user-select: initial;
+       user-select: initial;
+}
+.oc-dialog .fileexists .conflict .message {
+       color: #e9322d;
+}
 .oc-dialog .fileexists table {
        width: 100%;
 }
index ab450dc5cac2134a8f808c22a405d911271da8cd..9fe623075bc5a9e9cc1e1da7e13214b43de8bb7f 100644 (file)
@@ -175,7 +175,14 @@ OC.Upload = {
         * @param {function} callbacks.onCancel
         */
        checkExistingFiles: function (selection, callbacks) {
-               // TODO check filelist before uploading and show dialog on conflicts, use callbacks
+               /*
+               $.each(selection.uploads, function(i, upload) {
+                       var $row = OCA.Files.App.fileList.findFileEl(upload.files[0].name);
+                       if ($row) {
+                               // TODO check filelist before uploading and show dialog on conflicts, use callbacks
+                       }
+               });
+               */
                callbacks.onNoConflicts(selection);
        },
 
@@ -417,11 +424,15 @@ OC.Upload = {
                                                data.textStatus = 'servererror';
                                                data.errorThrown = t('files', 'Could not get result from server.');
                                                fu._trigger('fail', e, data);
+                                       } else if (result[0].status === 'readonly') {
+                                               var original = result[0];
+                                               var replacement = data.files[0];
+                                               OC.dialogs.fileexists(data, original, replacement, OC.Upload);
                                        } else if (result[0].status === 'existserror') {
                                                //show "file already exists" dialog
                                                var original = result[0];
                                                var replacement = data.files[0];
-                                               OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu);
+                                               OC.dialogs.fileexists(data, original, replacement, OC.Upload);
                                        } else if (result[0].status !== 'success') {
                                                //delete data.jqXHR;
                                                data.textStatus = 'servererror';
index 79beccef3e507fa5e18962de1d578a8775adfc10..5360a7c8e8f439abac7ff27170bcfce986096614 100644 (file)
@@ -20,6 +20,7 @@
                                <span class="svg icon"></span>
                                <div class="mtime"></div>
                                <div class="size"></div>
+                               <div class="message"></div>
                        </div>
                </div>
        </div>
index 9e5afea1a6f6bc657a6a80b796ad3e0967895adf..0c046d8ef0efe2275829d88ba546537bc28e0a0c 100644 (file)
@@ -363,56 +363,69 @@ var OCdialogs = {
                        return canvas.toDataURL("image/png", 0.7);
                };
 
-               var addConflict = function(conflicts, original, replacement) {
+               var addConflict = function($conflicts, original, replacement) {
 
-                       var conflict = conflicts.find('.template').clone().removeClass('template').addClass('conflict');
+                       var $conflict = $conflicts.find('.template').clone().removeClass('template').addClass('conflict');
+                       var $originalDiv = $conflict.find('.original');
+                       var $replacementDiv = $conflict.find('.replacement');
 
-                       conflict.data('data',data);
+                       $conflict.data('data',data);
 
-                       conflict.find('.filename').text(original.name);
-                       conflict.find('.original .size').text(humanFileSize(original.size));
-                       conflict.find('.original .mtime').text(formatDate(original.mtime));
+                       $conflict.find('.filename').text(original.name);
+                       $originalDiv.find('.size').text(humanFileSize(original.size));
+                       $originalDiv.find('.mtime').text(formatDate(original.mtime));
                        // ie sucks
                        if (replacement.size && replacement.lastModifiedDate) {
-                               conflict.find('.replacement .size').text(humanFileSize(replacement.size));
-                               conflict.find('.replacement .mtime').text(formatDate(replacement.lastModifiedDate));
+                               $replacementDiv.find('.size').text(humanFileSize(replacement.size));
+                               $replacementDiv.find('.mtime').text(formatDate(replacement.lastModifiedDate));
                        }
                        var path = original.directory + '/' +original.name;
                        Files.lazyLoadPreview(path, original.mimetype, function(previewpath){
-                               conflict.find('.original .icon').css('background-image','url('+previewpath+')');
+                               $originalDiv.find('.icon').css('background-image','url('+previewpath+')');
                        }, 96, 96, original.etag);
                        getCroppedPreview(replacement).then(
                                function(path){
-                                       conflict.find('.replacement .icon').css('background-image','url(' + path + ')');
+                                       $replacementDiv.find('.icon').css('background-image','url(' + path + ')');
                                }, function(){
                                        Files.getMimeIcon(replacement.type,function(path){
-                                               conflict.find('.replacement .icon').css('background-image','url(' + path + ')');
+                                               $replacementDiv.find('.icon').css('background-image','url(' + path + ')');
                                        });
                                }
                        );
-                       conflicts.append(conflict);
+                       $conflicts.append($conflict);
 
                        //set more recent mtime bold
                        // ie sucks
                        if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() > original.mtime) {
-                               conflict.find('.replacement .mtime').css('font-weight', 'bold');
+                               $replacementDiv.find('.mtime').css('font-weight', 'bold');
                        } else if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() < original.mtime) {
-                               conflict.find('.original .mtime').css('font-weight', 'bold');
+                               $originalDiv.find('.mtime').css('font-weight', 'bold');
                        } else {
                                //TODO add to same mtime collection?
                        }
 
                        // set bigger size bold
                        if (replacement.size && replacement.size > original.size) {
-                               conflict.find('.replacement .size').css('font-weight', 'bold');
+                               $replacementDiv.find('.size').css('font-weight', 'bold');
                        } else if (replacement.size && replacement.size < original.size) {
-                               conflict.find('.original .size').css('font-weight', 'bold');
+                               $originalDiv.find('.size').css('font-weight', 'bold');
                        } else {
                                //TODO add to same size collection?
                        }
 
                        //TODO show skip action for files with same size and mtime in bottom row
 
+                       // always keep readonly files
+
+                       if (original.status === 'readonly') {
+                               $originalDiv
+                                       .addClass('readonly')
+                                       .find('input[type="checkbox"]')
+                                               .prop('checked', true)
+                                               .prop('disabled', true);
+                               $originalDiv.find('.message')
+                                       .text(t('core','read-only'))
+                       }
                };
                //var selection = controller.getSelection(data.originalFiles);
                //if (selection.defaultAction) {
@@ -423,8 +436,8 @@ var OCdialogs = {
                if (this._fileexistsshown) {
                        // add conflict
 
-                       var conflicts = $(dialogId+ ' .conflicts');
-                       addConflict(conflicts, original, replacement);
+                       var $conflicts = $(dialogId+ ' .conflicts');
+                       addConflict($conflicts, original, replacement);
 
                        var count = $(dialogId+ ' .conflict').length;
                        var title = n('core',
@@ -456,8 +469,8 @@ var OCdialogs = {
                                });
                                $('body').append($dlg);
 
-                               var conflicts = $($dlg).find('.conflicts');
-                               addConflict(conflicts, original, replacement);
+                               var $conflicts = $dlg.find('.conflicts');
+                               addConflict($conflicts, original, replacement);
 
                                var buttonlist = [{
                                                text: t('core', 'Cancel'),
@@ -496,20 +509,20 @@ var OCdialogs = {
 
                                //add checkbox toggling actions
                                $(dialogId).find('.allnewfiles').on('click', function() {
-                                       var checkboxes = $(dialogId).find('.conflict .replacement input[type="checkbox"]');
-                                       checkboxes.prop('checked', $(this).prop('checked'));
+                                       var $checkboxes = $(dialogId).find('.conflict .replacement input[type="checkbox"]');
+                                       $checkboxes.prop('checked', $(this).prop('checked'));
                                });
                                $(dialogId).find('.allexistingfiles').on('click', function() {
-                                       var checkboxes = $(dialogId).find('.conflict .original input[type="checkbox"]');
-                                       checkboxes.prop('checked', $(this).prop('checked'));
+                                       var $checkboxes = $(dialogId).find('.conflict .original:not(.readonly) input[type="checkbox"]');
+                                       $checkboxes.prop('checked', $(this).prop('checked'));
                                });
-                               $(dialogId).find('.conflicts').on('click', '.replacement,.original', function() {
-                                       var checkbox = $(this).find('input[type="checkbox"]');
-                                       checkbox.prop('checked', !checkbox.prop('checked'));
+                               $(dialogId).find('.conflicts').on('click', '.replacement,.original:not(.readonly)', function() {
+                                       var $checkbox = $(this).find('input[type="checkbox"]');
+                                       $checkbox.prop('checked', !$checkbox.prop('checked'));
                                });
-                               $(dialogId).find('.conflicts').on('click', 'input[type="checkbox"]', function() {
-                                       var checkbox = $(this);
-                                       checkbox.prop('checked', !checkbox.prop('checked'));
+                               $(dialogId).find('.conflicts').on('click', '.replacement input[type="checkbox"],.original:not(.readonly) input[type="checkbox"]', function() {
+                                       var $checkbox = $(this);
+                                       $checkbox.prop('checked', !checkbox.prop('checked'));
                                });
 
                                //update counters