]> source.dussan.org Git - nextcloud-server.git/commitdiff
handle group restore
authorBjörn Schießle <schiessle@owncloud.com>
Fri, 18 Jan 2013 16:50:44 +0000 (17:50 +0100)
committerBjörn Schießle <schiessle@owncloud.com>
Fri, 18 Jan 2013 16:50:44 +0000 (17:50 +0100)
apps/files_trashbin/ajax/undelete.php
apps/files_trashbin/css/trash.css
apps/files_trashbin/js/trash.js
apps/files_trashbin/lib/trash.php
apps/files_trashbin/templates/index.php

index f55629d695c3316b6617cfb12fef09b0a27f63b0..05b5e7a5ee4885425d3ee8db58b7778f17489cea 100644 (file)
@@ -4,11 +4,34 @@ if(!OC_User::isLoggedIn()) {
        exit;\r
 }
 
-$timestamp = isset( $_REQUEST['timestamp'] ) ? $_REQUEST['timestamp'] : '';
-$filename = isset( $_REQUEST['filename'] ) ? trim($_REQUEST['filename'], '/\\') : '';
+$files = $_REQUEST['files'];
+$list = explode(';', $files);
 
-if ( OCA_Trash\Trashbin::restore($filename, $timestamp) ) {
-       OCP\JSON::success(array("data" => array('filename'=>$filename, 'timestamp' => $timestamp)));
+$error = array();
+
+$i = 0;
+foreach ($list as $file) {
+       $delimiter = strrpos($file, '.d');
+       $filename = substr($file, 0, $delimiter);
+       $timestamp =  substr($file, $delimiter+2);
+       
+       if ( !OCA_Trash\Trashbin::restore($filename, $timestamp) ) {
+               $error[] = $filename;
+       } else {
+               $success[$i]['filename'] = $filename;
+               $success[$i]['timestamp'] = $timestamp;
+               $i++;
+       }
+
+}
+
+if ( $error ) {
+       $filelist = '';
+       foreach ( $error as $e ) {
+               $filelist .= $e.', ';
+       }
+       OCP\JSON::error(array("data" => array("message" => "Couldn't restore ".rtrim($filelist,', '), "success" => $success, "error" => $error)));
 } else {
-       OCP\JSON::error(array("data" => array("message" => "Couldn't restore ".$filename)));    
+       OCP\JSON::success(array("data" => array("success" => $success)));
 }
+
index bd6341c6fb2ad7155ea0a78f98e7037939608704..e0dd8c6e939b6c59701e9113be99c488cd9c52c4 100644 (file)
@@ -19,12 +19,12 @@ body {
        color:#fff;
 }
 
-#header #download {
+#header #undelete {
        font-weight:700;
        margin-left:2em;
 }
 
-#header #download img {
+#header #undelete img {
        padding-left:.1em;
        padding-right:.3em;
        vertical-align:text-bottom;
index 075dc6c31596608c4d06eb912e6ad4033996a00b..8f3786f15e18f96ff1d0df7e38a58c71c975fc62 100644 (file)
+
 $(document).ready(function() {
 
        if (typeof FileActions !== 'undefined') {
                FileActions.register('all', 'Undelete', OC.PERMISSION_READ, '', function(filename) {
                        var tr=$('tr').filterAttr('data-file', filename);
                        $.post(OC.filePath('files_trashbin','ajax','undelete.php'),
-                               {timestamp:tr.attr('data-timestamp'),filename:tr.attr('data-filename')},
+                               {files:tr.attr('data-filename')+'.d'+tr.attr('data-timestamp')},
                                function(result){
-                                       if (result.status == 'success') {
-                                               var row = document.getElementById(result.data.filename+'.d'+result.data.timestamp);
+                                       for (var i = 0; i < result.data.success.length; i++) {
+                                               var row = document.getElementById(result.data.success[i].filename+'.d'+result.data.success[i].timestamp);
                                                row.parentNode.removeChild(row);
-                                       } else {
+                                       }
+                                       if (result.status != 'success') {
                                                OC.dialogs.alert(result.data.message, 'Error');
                                        }
                                });
                        
                        });
                };
+               
+               // 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();
+               });
+
+               $('td.filename input:checkbox').live('change',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();
+               });             
+               
+               $('.undelete').click('click',function(event) {
+                       var fileslist=getSelectedFiles('file').join(';');
+                       $.post(OC.filePath('files_trashbin','ajax','undelete.php'),
+                                       {files:fileslist},
+                                       function(result){
+                                               for (var i = 0; i < result.data.success.length; i++) {
+                                                       var row = document.getElementById(result.data.success[i].filename+'.d'+result.data.success[i].timestamp);
+                                                       row.parentNode.removeChild(row);
+                                               }
+                                               if (result.status != 'success') {
+                                                       OC.dialogs.alert(result.data.message, 'Error');
+                                               }
+                                       });             
+                       });
+       
+
+});
 
-});
\ No newline at end of file
+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'));
+               $('#modified').text(t('files','Deleted'));
+               $('table').removeClass('multiselect');
+               $('.selectedActions').hide();
+       }
+       else {
+               $('.selectedActions').show();
+               var selection='';
+               if(selectedFolders.length>0){
+                       if(selectedFolders.length==1){
+                               selection+=t('files','1 folder');
+                       }else{
+                               selection+=t('files','{count} folders',{count: selectedFolders.length});
+                       }
+                       if(selectedFiles.length>0){
+                               selection+=' & ';
+                       }
+               }
+               if(selectedFiles.length>0){
+                       if(selectedFiles.length==1){
+                               selection+=t('files','1 file');
+                       }else{
+                               selection+=t('files','{count} files',{count: 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-filename'),
+                       file:$(element).attr('data-file'),
+                       timestamp:$(element).attr('data-timestamp'),
+                       type:$(element).attr('data-type')
+               };
+               if(property){
+                       files.push(file[property]);
+               }else{
+                       files.push(file);
+               }
+       });
+       return files;
+}
\ No newline at end of file
index 1b0b9cef4bdbf7ac67ae3f78646a7a3c9077d05e..abfcf847ac4250c7746fa0676ccb20c036c63d59 100644 (file)
@@ -77,7 +77,7 @@ class Trashbin {
         * @param $timestamp time when the file was deleted
         */
        public static function restore($filename, $timestamp) {
-               
+
                $user = \OCP\User::getUser();
                $view = new \OC_FilesystemView('/'.$user);
                
index a412379d533f82aa6ba05134ac30d0e3126777ab..a9cb216b1f77ffed872cbba6917b3e0bdf7e22ec 100644 (file)
                                <input type="checkbox" id="select_all" />
                                <span class='name'><?php echo $l->t( 'Name' ); ?></span>
                                <span class='selectedActions'>
-                                       <?php if($_['allowZipDownload']) : ?>
-                                               <a href="" class="download">
-                                                       <img class="svg" alt="Download"
+                                               <a href="" class="undelete">
+                                                       <!-- <img class="svg" alt="Undelete"
                                                                 src="<?php echo OCP\image_path("core", "actions/download.svg"); ?>" />
-                                                       <?php echo $l->t('Download')?>
+                                                       -->
+                                                       <?php echo $l->t('Undelete')?>
                                                </a>
-                                       <?php endif; ?>
                                </span>
                        </th>
                        <th id="headerDate">