Serghey Rodin 10 лет назад
Родитель
Сommit
6e193e0852
5 измененных файлов с 135 добавлено и 77 удалено
  1. 3 3
      web/file_manager/fm_core.php
  2. 73 42
      web/js/file_manager.js
  3. 26 0
      web/js/i18n.js.php
  4. 26 26
      web/js/templates.js
  5. 7 6
      web/upload/UploadHandler.php

+ 3 - 3
web/file_manager/fm_core.php

@@ -45,13 +45,13 @@ class FileManager {
     public function checkFileType($dir) {
         $dir = $this->formatFullPath($dir);
 
-        exec(VESTA_CMD . "v-delete-fs-file {$this->user} {$dir}", $output, $return_var);
+        exec(VESTA_CMD . "v-get-fs-file-type {$this->user} {$dir}", $output, $return_var);
         
         $error = self::check_return_code($return_var, $output);
-        
         if (empty($error)) {
             return array(
-                'result' => true
+                'result' => true,
+                'data'   => implode('', $output)
             );
         }
         else {

+ 73 - 42
web/js/file_manager.js

@@ -46,11 +46,37 @@ FM.EDITABLE_FILETYPES = [
     'txt', 'php', 'js', 'html'
 ];
 
+FM.EDITABLE_MIMETYPES = [
+    'application/emma+xml', 
+    'application/epp+xml',
+    'application/javascript',
+    'application/json',
+    'application/jsonml+json	',
+    'application/lost+xml',
+    'application/marc',
+    'application/msword',
+    'application/sru+xml',
+    'application/vnd.android.package-archive',
+    'text/csv',
+    'text/css',
+    'text/javascript',
+    'text/html',
+    'text/x-java-source'
+];
+
+FM.EDITABLE_MIMETYPES_MASKS = [
+    /(.)*text(.)*/,
+    /(.)*inode(.)*/
+];
+
 FM.preselectedItems = {'A': [], 'B': []};
 
 
 FM.directoryNotAvailable = function(reply) {
-    alert('Directory not available'); // todo: translate
+    var tpl = Tpl.get('popup_alert', 'FM');
+    tpl.set(':TEXT', App.Constants.FM_DIRECTORY_NOT_AVAILABLE);
+    
+    FM.popupOpen(tpl.finalize());
 }
 
 FM.showError = function(type, message) {
@@ -382,7 +408,8 @@ FM.sortItems = function(items, box) {
     return sorted;
 }
 
-FM.isFileEditable = function(src) {
+FM.isFileEditable = function(src, mime) {
+    
     if ('undefined' == typeof src.filetype) {
         return false;
     }
@@ -391,7 +418,21 @@ FM.isFileEditable = function(src) {
         return true;
     }
     
-    return false;
+    var mime_type = mime.split(';');
+    mime_type = mime_type[0];
+
+    if ($.inArray(mime_type, FM.EDITABLE_MIMETYPES) != -1) {
+        return true;
+    }
+
+    var editable = false;
+    $.each(FM.EDITABLE_MIMETYPES_MASKS, function(i, mask) {
+        if (mime_type.search(mask) != -1) {
+            editable = true;
+        }
+    });
+
+    return editable;
 }
 
 FM.editFileFromSubcontext = function(elm) {
@@ -414,26 +455,36 @@ FM.openFile = function(dir, box, elm) {
     var tab = FM.getTabLetter(box);
 
     FM['TAB_'+tab+'_CURRENT_PATH'] = dir;
-    
-    
-    
+
     var elm = $(elm).hasClass('dir') ? $(elm) : $(elm).closest('.dir');
     var src = $.parseJSON($(elm).find('.source').val());
-
-    if (FM.isItemPseudo(src)) {
-        FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], FM['TAB_' + tab]);
-    }
     
-    if (FM.isFileEditable(src)) {
-        var myWindow = window.open('/edit/file/?path=' + src.full_path, '_blank');//, src.full_path, "width=900, height=700");
-    }
-    else {
-        var path = src.full_path;
-        var win = window.open('/download/file/?path=' + path, '_blank');
-        win.focus();
+    if (FM.isItemPseudo(src)) {
+        return FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], FM['TAB_' + tab]);
     }
     
+    var params = {
+        dir: src.full_path
+    };
     
+    App.Ajax.request('check_file_type', params, function(reply) {
+        if (reply.result) {
+            if (FM.isFileEditable(src, reply.data)) {
+                var myWindow = window.open('/edit/file/?path=' + src.full_path, '_blank');//, src.full_path, "width=900, height=700");
+            }
+            else {
+                var path = src.full_path;
+                var win = window.open('/download/file/?path=' + path, '_blank');
+                //win.focus();
+            }
+        }
+        else {
+            // force download file
+            var path = src.full_path;
+            var win = window.open('/download/file/?path=' + path, '_blank');
+            //win.focus();
+        }
+    });
 }
 
 FM.getTabLetter = function(box) {
@@ -551,7 +602,6 @@ FM.generate_listing = function(reply, box) {
 FM.toggleCheck = function(uid) {
     var ref = $('#check' + uid);
     if (ref.length > 0) {
-        //ref.attr('checked', true);
         $(ref).hasClass('checkbox-selected') ? $(ref).addClass('checkbox-selected') : $(ref).removeClass('checkbox-selected');
     }
 }
@@ -605,7 +655,7 @@ FM.checkBulkStatus = function(bulkStatuses, acc) {
     }
 
     if (status == true) {
-        $('#popup .results').html('Done');
+        $('#popup .results').html(App.Constants.FM_DONE);
         $('.controls p').replaceWith('<p class="ok" onClick="FM.bulkPopupClose();">close</p>');
     }
     else {
@@ -665,7 +715,7 @@ FM.bulkCopy = function() {
         });
         
         var tpl = Tpl.get('popup_bulk', 'FM');
-        tpl.set(':ACTION', 'YOU ARE COPYING');
+        tpl.set(':ACTION', App.Constants.FM_YOU_ARE_COPYING);
         tpl.set(':TEXT',   cfr_html);
        
         FM.popupOpen(tpl.finalize());
@@ -740,7 +790,7 @@ FM.bulkRemove = function() {
         });
         
         var tpl = Tpl.get('popup_bulk', 'FM');
-        tpl.set(':ACTION', 'YOU ARE REMOVING');
+        tpl.set(':ACTION', App.Constants.FM_YOU_ARE_REMOVING);
         tpl.set(':TEXT',   cfr_html);
        
         FM.popupOpen(tpl.finalize());
@@ -750,10 +800,7 @@ FM.bulkRemove = function() {
             var ref = $(o);
             var src = $(ref).find('.source').val();
             src = $.parseJSON(src);
-          
-            /*if (!FM.isItemPseudo(o)) {
-                cfr_html += '<div>'+src.name+'</div>';
-            }*/
+
             var tab = FM.getTabLetter(FM.CURRENT_TAB);
 
             var opposite_tab = 'A';
@@ -1610,22 +1657,6 @@ FM.init();
 $(document).ready(function() {
     $('.progress-container').hide();
     
-    //return alert('statechange: Back');
-    /*$(document).bind('keydown.up', function() {
-        console.log(1);
-        //try{FM.goUp();}catch(e){console.log(e);}
-        //console.log(FM);
-        FM.goUp();
-    });
-    
-    $(document).bind('keydown.down', function() {
-        console.log(1);
-        //try{FM.goUp();}catch(e){console.log(e);}
-        //console.log(FM);
-        FM.goDown();
-    });*/
-
-
     var ph = $('.window .pwd').outerHeight();
     var mh = $('.window .menu').outerHeight();
     var wh = $(window).outerHeight();
@@ -1825,5 +1856,5 @@ $(document).ready(function() {
 $(window).bind('statechange', function(evt){
     $(evt).stopPropagation();
     // History.getState() 
-    alert('No way back yet');
+    //alert('No way back yet');
 })

+ 26 - 0
web/js/i18n.js.php

@@ -53,3 +53,29 @@ App.Constants.FM_NO_FILE_SELECTED               = '<?php echo __('No file select
 App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED  = '<?php echo __('No file or folder selected') ?>';
 App.Constants.FM_FILE_TYPE_NOT_SUPPORTED        = '<?php echo __('File type not supported') ?>';
 
+App.Constants.FM_DIRECTORY_NOT_AVAILABLE        = '<?php echo __('Directory not available') ?>';
+App.Constants.FM_DONE                           = '<?php echo __('Done') ?>';
+App.Constants.FM_CLOSE                          = '<?php echo __('Close') ?>';
+App.Constants.FM_COPY                           = '<?php echo __('Copy') ?>';
+App.Constants.FM_CANCEL                         = '<?php echo __('Cancel') ?>';
+App.Constants.FM_RENAME                         = '<?php echo __('Rename') ?>';
+App.Constants.FM_DELETE                         = '<?php echo __('Delete') ?>';
+App.Constants.FM_EXTRACT                        = '<?php echo __('Extract') ?>';
+App.Constants.FM_CREATE                         = '<?php echo __('Create') ?>';
+App.Constants.FM_PACK                           = '<?php echo __('Pack') ?>';
+App.Constants.FM_OK                             = '<?php echo __('OK') ?>';
+App.Constants.FM_YOU_ARE_COPYING                = '<?php echo __('YOU ARE COPYING') ?>';
+App.Constants.FM_YOU_ARE_REMOVING               = '<?php echo __('YOU ARE REMOVING') ?>';
+
+App.Constants.FM_CONFIRM_COPY                   = '<?php echo __('Are you sure you want to copy') ?>';
+App.Constants.FM_CONFIRM_DELETE                 = '<?php echo __('Are you sure you want to delete') ?>';
+App.Constants.FM_INTO_KEYWORD                   = '<?php echo __('into') ?>';
+App.Constants.FM_EXISTING_FILES_WILL_BE_DELETED = '<?php echo __('existing files will be deleted') ?>';
+App.Constants.FM_ORIGINAL_NAME                  = '<?php echo __('Original name') ?>';
+App.Constants.FM_FILE                           = '<?php echo __('File') ?>';
+App.Constants.FM_ALREADY_EXISTS                 = '<?php echo __('already exists') ?>';
+App.Constants.FM_EXTRACT                        = '<?php echo __('extract archive') ?>';
+App.Constants.FM_CREATE_FILE                    = '<?php echo __('Create file') ?>';
+
+
+

+ 26 - 26
web/js/templates.js

@@ -38,47 +38,47 @@ App.Templates.html = {
                             <div class="message">~!:ACTION~!: <br />~!:TEXT~!</div>\
                             <div class="results"></div>\
                                 <div class="controls">\
-                            <!-- p class="ok" onClick="FM.popupClose();">close</p -->\
+                            <!-- p class="ok" onClick="FM.popupClose();">'+App.Constants.FM_CLOSE+'</p -->\
                             <p><img src="/images/in_progress.gif"></p>\
                             </div>\
                         </div>'],
         popup_delete: ['<div class="confirm-box delete popup-box">\
-                            <div class="message">Are you sure you want to delete <span class="title">"~!:FILENAME~!"</span>?</div>\
+                            <div class="message">'+App.Constants.FM_CONFIRM_DELETE+' <span class="title">"~!:FILENAME~!"</span>?</div>\
                                 <div class="controls">\
-                            <p class="cancel" onClick="FM.popupClose();">cancel</p>\
-                            <p class="ok" onClick="FM.confirmDelete();">delete</p>\
+                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                            <p class="ok" onClick="FM.confirmDelete();">'+App.Constants.FM_DELETE+'</p>\
                             </div>\
                         </div>'],
         popup_copy: ['<div class="confirm-box copy popup-box">\
-                            <div class="message">Are you sure you want to copy <span class="title">"~!:SRC_FILENAME~!"</span> into:</div>\
+                            <div class="message">'+App.Constants.FM_CLOSE+' <span class="title">"~!:SRC_FILENAME~!"</span> '+App.Constants.FM_INTO_KEYWORD+':</div>\
                             <div class="actions">\
                                 <input type="text" id="copy_dest" value="~!:DST_FILENAME~!" class="new-title">\
                             </div>\
-                            <div class="message">existing files will be replaced</div>\
+                            <div class="message">'+App.Constants.FM_EXISTING_FILES_WILL_BE_DELETED+'</div>\
                                 <div class="controls">\
-                            <p class="cancel" onClick="FM.popupClose();">cancel</p>\
-                            <p class="ok" onClick="FM.confirmCopyItems();">copy</p>\
+                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                            <p class="ok" onClick="FM.confirmCopyItems();">'+App.Constants.FM_COPY+'</p>\
                             </div>\
                         </div>'],
         popup_rename: ['<div class="confirm-box rename warning">\
-                            <div class="message">Original name: <span class="title">"~!:FILENAME~!"</span></div>\
-                            <!-- div class="warning">File <span class="title">"reading.txt"</span> already exists</div -->\
+                            <div class="message">'+App.Constants.FM_ORIGINAL_NAME+': <span class="title">"~!:FILENAME~!"</span></div>\
+                            <!-- div class="warning">'+App.Constants.FM_FILE+' <span class="title">"reading.txt"</span> '+App.Constants.FM_ALREADY_EXISTS+'</div -->\
                             <div class="warning warning-message"></div>\
                             <div class="actions">\
                                 <input type="text" id="rename-title" class="new-title"  value="~!:NEW_NAME~!" />\
                             </div>\
                             <div class="controls">\
-                                <p class="cancel" onClick="FM.popupClose();">cancel</p>\
-                                <p class="ok" onClick="FM.confirmRename();">rename</p>\
+                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                                <p class="ok" onClick="FM.confirmRename();">'+App.Constants.FM_RENAME+'</p>\
                             </div>\
                             <div class="controls replace">\
-                                <p class="cancel" onClick="FM.popupClose();">cancel</p>\
-                                <p class="ok" onClick="FM.confirmRename();">rename</p>\
+                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                                <p class="ok" onClick="FM.confirmRename();">'+App.Constants.FM_Rename+'</p>\
                             </div>\
                         </div>'],
 
         popup_pack: ['<div class="confirm-box pack warning">\
-                            <div class="message">Pack <span class="title">"~!:FILENAME~!"</span> into:</div>\
+                            <div class="message">'+App.Constants.FM_PACK+' <span class="title">"~!:FILENAME~!"</span> '+App.Constants.FM_INTO_KEYWORD+':</div>\
                             <div class="actions">\
                                 <input type="text" id="pack-destination" class="new-title" value="~!:DST_DIRNAME~!">\
                             </div>\
@@ -87,13 +87,13 @@ App.Templates.html = {
                                 <label><input type="checkbox" name="overwrite" class="title" />Overwrite exising files</label>\
                             </div -->\
                             <div class="controls">\
-                                <p class="cancel" onClick="FM.popupClose();">cancel</p>\
-                                <p class="ok" onClick="FM.confirmPackItem();">Pack</p>\
+                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                                <p class="ok" onClick="FM.confirmPackItem();">'+App.Constants.FM_PACK+'</p>\
                             </div>\
                         </div>'],
 
         popup_unpack: ['<div class="confirm-box unpack warning">\
-                            <div class="message">Extract archive <span class="title">"~!:FILENAME~!"</span> to:</div>\
+                            <div class="message">'+App.Constants.FM_EXTRACT+' <span class="title">"~!:FILENAME~!"</span> '+App.Constants.FM_INTO_KEYWORD+':</div>\
                             <div class="actions">\
                                 <input type="text" id="unpack-destination" class="new-title" value="~!:DST_DIRNAME~!">\
                             </div>\
@@ -102,22 +102,22 @@ App.Templates.html = {
                                 <label><input type="checkbox" name="overwrite" class="title" />Overwrite exising files</label>\
                             </div -->\
                             <div class="controls">\
-                                <p class="cancel" onClick="FM.popupClose();">cancel</p>\
-                                <p class="ok" onClick="FM.confirmUnpackItem();">Extract</p>\
+                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                                <p class="ok" onClick="FM.confirmUnpackItem();">'+App.Constants.FM_EXTRACT+'</p>\
                             </div>\
                         </div>'],
 
 
         popup_create_file: ['<div class="confirm-box rename warning">\
-                            <div class="message">Create file</div>\
+                            <div class="message">'+App.Constants.FM_CREATE_FILE+'</div>\
                             <!-- div class="warning">File <span class="title">"reading.txt"</span> already exists</div -->\
                             <div class="warning warning-message"></div>\
                             <div class="actions">\
                                 <input type="text" id="rename-title" class="new-title" />\
                             </div>\
                             <div class="controls replace">\
-                                <p class="cancel" onClick="FM.popupClose();">cancel</p>\
-                                <p class="ok" onClick="FM.confirmCreateFile();">create</p>\
+                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                                <p class="ok" onClick="FM.confirmCreateFile();">'+App.Constants.FM_CREATE+'</p>\
                             </div>\
                         </div>'],
         popup_create_dir: ['<div class="confirm-box rename warning">\
@@ -128,14 +128,14 @@ App.Templates.html = {
                                 <input type="text" id="rename-title" class="new-title" />\
                             </div>\
                             <div class="controls replace">\
-                                <p class="cancel" onClick="FM.popupClose();">cancel</p>\
-                                <p class="ok" onClick="FM.confirmCreateDir();">create</p>\
+                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                                <p class="ok" onClick="FM.confirmCreateDir();">'+App.Constants.FM_CREATE+'</p>\
                             </div>\
                         </div>'],
         popup_no_file_selected: ['<div class="confirm-box no-file-selected">\
                             <div class="message">Please select a file</div>\
                             <div class="controls">\
-                                <p class="ok" onClick="FM.confirmCreateDir();">ok</p>\
+                                <p class="ok" onClick="FM.confirmCreateDir();">'+App.Constants.FM_OK+'</p>\
                             </div>\
                         </div>']
     }

+ 7 - 6
web/upload/UploadHandler.php

@@ -210,7 +210,7 @@ class UploadHandler
     protected function get_upload_path($file_name = null, $version = null) {
         $relocate_directory = $_GET['dir'];
         if (empty($relocate_directory)) {
-            $relocate_directory = '/home/admin/';
+            $relocate_directory = '/home/admin/'; // fallback dir
         }
         if ($relocate_directory[strlen($relocate_directory) -1] != '/') {
             $relocate_directory .= '/';
@@ -1041,7 +1041,7 @@ class UploadHandler
     }
 
     protected function handle_file_upload($uploaded_file, $name, $size, $type, $error,
-            $index = null, $content_range = null) {
+        $index = null, $content_range = null) {
         $file = new \stdClass();
         $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error,
             $index, $content_range);
@@ -1076,12 +1076,13 @@ class UploadHandler
                 );
             }
             $file_size = $this->get_file_size($file_path, $append_file);
-            //var_dump($file_size);die();
+
             if ($file_size === $file->size) {
                 $file->url = $this->get_download_url($file->name);
-                if ($this->is_valid_image_file($file_path)) {
-                    $this->handle_image_file($file_path, $file);
-                }
+                // uncomment if images also need to be resized
+                //if ($this->is_valid_image_file($file_path)) {
+                //    $this->handle_image_file($file_path, $file);
+                //}
             } else {
                 $file->size = $file_size;
                 if (!$content_range && $this->options['discard_aborted_uploads']) {