Serghey Rodin 10 лет назад
Родитель
Сommit
7565e8217f

+ 99 - 0
web/css/file_manager.css

@@ -625,3 +625,102 @@ input[type="checkbox"] {
 .subcontext-menu li {
     /*float: left;*/
 }
+
+
+.shortcuts {
+  background: rgba(50, 50, 50, 0.9);
+  display: inline-block;
+  position: fixed;
+  right: 20%;
+  bottom: 0;
+  color: #eee;
+  width: 810px;
+  border: 1px solid #333;
+  font-family: arial;
+  font-size: 13px;
+}
+.shortcuts .header {
+  border-bottom: 1px solid #333;
+  height: 43px;
+}
+.shortcuts .title {
+  text-transform: uppercase;
+  color: #ffcc00;
+  padding: 7px 0 7px 14px;
+  display: inline-block;
+  float: left;
+  font-size: 11px;
+  letter-spacing: 3px;
+  font-weight: bold;
+  line-height: 30px;
+}
+.shortcuts .close {
+  background: url("/images/sprite.png") repeat scroll -408px -469px;
+  cursor: pointer;
+  display: inline-block;
+  float: right;
+  height: 32px;
+  padding-top: 11px;
+  width: 46px;
+}
+.shortcuts .close:hover {
+  background-color: #000;
+..
+}
+.shortcuts .close:active {
+  background-color: #55c9c0;
+}
+.shortcuts ul {
+  list-style-type: none;
+  padding: 30px 10px;
+  display: inline-block;
+  float: left;
+}
+.shortcuts ul li {
+  padding: 5px 20px;
+}
+.shortcuts ul li.step-top {
+  padding-top: 30px;
+}
+.shortcuts ul li span {
+  color: #48F4EF;
+  display: inline-block;
+  font-weight: bold;
+  padding: 0 20px 0 0;
+  text-align: right;
+  width: 140px;
+}
+.shortcuts ul li span.bigger {
+  font-size: 18px;
+}
+.shortcuts ul.note {
+  font-style: italic;
+  color: #9CA484;
+  width: 700px;
+  padding-left: 50px;
+}
+.shortcuts ul.note a { 
+  color: #9CA484;
+}
+
+.to-shortcuts {
+  display: inline-block;
+  position: fixed;
+  top: 95%;
+  right: 1%;
+}
+.l-icon-shortcuts {
+  display: inline-block;
+  vertical-align: middle;
+  background-image: url("/images/sprite.png");
+  width: 35px;
+  height: 35px;
+  background-position: -283px -68px;
+  border-radius: 18px;
+}
+.l-icon-shortcuts:hover {
+  background-color: #ccc;
+}
+.l-icon-shortcuts:active {
+  background-color: #98D5CD;
+}

+ 25 - 3
web/css/styles.min.css

@@ -1867,7 +1867,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
 }
 
 
-.l-icon-up-arrow, .l-icon-down-arrow, .l-icon-star, .l-icon-to-top, .l-icon-star-orange, .l-icon-star-blue {
+.l-icon-up-arrow, .l-icon-down-arrow, .l-icon-star, .l-icon-to-top, .l-icon-shortcuts, .l-icon-star-orange, .l-icon-star-blue {
   display: inline-block;
   vertical-align: middle;
   background-image: url("/images/sprite.png");
@@ -1928,6 +1928,19 @@ div.l-content > div.l-separator:nth-of-type(4) {
   background-position: -402px -68px;
 }
 
+.l-icon-shortcuts {
+  width: 35px;
+  height: 35px;
+  background-position: -283px -68px;
+  border-radius: 18px;
+}
+.l-icon-shortcuts:hover {
+  background-color: #ccc;
+}
+.l-icon-shortcuts:active {
+  background-color: #98D5CD;
+}
+
 .l-icon-star-orange {
   width: 13px;
   height: 13px;
@@ -1974,9 +1987,17 @@ div.l-content > div.l-separator:nth-of-type(4) {
   display: inline-block;
   position: fixed;
   top: 92%;
-  right: 3%;
+  right: 4%;
 }
 
+.to-shortcuts {
+  display: inline-block;
+  position: fixed;
+  top: 92%;
+  right: 1%;
+}
+
+
 /*
 #vstobjects {
   margin-top: -1px;
@@ -2737,6 +2758,7 @@ form#vstobjects.suspended {
   color: #eee;
   width: 800px;
   border: 1px solid #333;
+  font-size: 13px;
 }
 .shortcuts .header {
   border-bottom: 1px solid #333;
@@ -2777,7 +2799,7 @@ form#vstobjects.suspended {
   padding: 5px 20px;
 }
 .shortcuts ul li.step-top {
-  padding-bottom: 30px;
+  padding-top: 30px;
 }
 .shortcuts ul li span {
   color: #48F4EF;

+ 7 - 3
web/edit/file/index.php

@@ -57,20 +57,24 @@ if ((!isset($_SESSION['user'])) && (!defined('NO_AUTH_REQUIRED'))) {
                 if ($fn) {
                     $f = fopen ($fn, 'w+');
                     fwrite($f, $_POST['contents']);
+                    fclose($f);
+                    
+                    chmod($fn, 0644);
+                    
                     if ($f) {
                         //copy($fn, $path);
                         exec (VESTA_CMD . "v-copy-fs-file {$user} {$fn} {$path}", $output, $return_var);
 
                         $error = check_return_code($return_var, $output);
                         if ($return_var != 0) {
-                            var_dump(VESTA_CMD . "v-copy-fs-file {$user} {$fn} {$path}");
+                            /*var_dump(VESTA_CMD . "v-copy-fs-file {$user} {$fn} {$path}");
                             var_dump($path);
-                            var_dump($output);
+                            var_dump($output);*/
                             die('<p style="color: white">Error while saving file</p>');//echo '0';
                         }
                     }
                     unlink($fn);
-                  }
+                }
             }
             
             // $content = file_get_contents($path);

BIN
web/images/sprite.png


+ 50 - 0
web/inc/i18n/en.php

@@ -546,4 +546,54 @@ $LANG['en'] = array(
     'Create file' => 'Create file',
     'Create directory' => 'Create directory',
 
+
+    'Add New object' => 'Add New object',
+    'Save Form' => 'Save Form',
+    'Cancel saving form' => 'Cancel saving form',
+    'Go to USER list' => 'Go to USER list',
+    'Go to WEB list' => 'Go to WEB list',
+    'Go to DNS list' => 'Go to DNS list',
+    'Go to MAIL list' => 'Go to MAIL list',
+    'Go to DB list' => 'Go to DB list',
+    'Go to CRON list' => 'Go to CRON list',
+    'Go to BACKUP list' => 'Go to BACKUP list',
+    'Focus on search' => 'Focus on search',
+    'Display/Close shortcuts' => 'Display/Close shortcuts',
+    'Go to Packages' => 'Go to Packages',
+    'Go to IP' => 'Go to IP',
+    'Go to Graphs' => 'Go to Graphs',
+    'Go to Statistic' => 'Go to Statistic',
+    'Go to Log' => 'Go to Log',
+    'Go to Updates' => 'Go to Updates',
+    'Go to Firewall' => 'Go to Firewall',
+    'Go to File Manager' => 'Go to File Manager',
+    'Go to Server' => 'Go to Server',
+
+
+    'Upload' => 'Upload',
+    'New File' => 'New File',
+    'New Folder' => 'New Folder',
+    'Download' => 'Download',
+    'Rename' => 'Rename',
+    'Copy' => 'Copy',
+    'Archive' => 'Archive',
+    'Delete' => 'Delete',
+    'Save File (in text editor)' => 'Save File (in text editor)',
+    'Display Shortcuts Hel' => 'Display Shortcuts Hel',
+    'Close Popup / Cancel' => 'Close Popup / Cancel',
+    'Move Cursor Up' => 'Move Cursor Up',
+    'Move Cursor Dow' => 'Move Cursor Dow',
+    'Switch to Left Tab' => 'Switch to Left Tab',
+    'Switch to Right Tab' => 'Switch to Right Tab',
+    'Switch Tab' => 'Switch Tab',
+    'Go to the Top of File List' => 'Go to the Top of File List',
+    'Go to the Last File' => 'Go to the Last File',
+    'Open File/Enter Directory' => 'Open File/Enter Directory',
+    'Go to Parent Directory' => 'Go to Parent Directory',
+    'Select Current File' => 'Select Current File',
+    'Select Bunch of Files' => 'Select Bunch of Files',
+    'Append File to the Current Selection' => 'Append File to the Current Selection',
+    'Select All Files' => 'Select All Files',
+    'shortcuts are inspired by magnificent GNU <a href="https://www.midnight-commander.org/">Midnight Commander</a> file manager' => 'shortcuts are inspired by magnificent GNU <a href="https://www.midnight-commander.org/">Midnight Commander</a> file manager',
+
 );

+ 168 - 26
web/js/file_manager.js

@@ -546,7 +546,7 @@ FM.downloadFileFromSubcontext = function(elm) {
 FM.openFile = function(dir, box, elm) {
     var tab = FM.getTabLetter(box);
 
-    FM['TAB_'+tab+'_CURRENT_PATH'] = dir;
+    //FM['TAB_'+tab+'_CURRENT_PATH'] = dir;
 
     var elm = $(elm).hasClass('dir') ? $(elm) : $(elm).closest('.dir');
     var src = $.parseJSON($(elm).find('.source').val());
@@ -754,11 +754,11 @@ FM.checkBulkStatus = function(bulkStatuses, acc) {
 
     if (status == true) {
         $('#popup .results').html(App.Constants.FM_DONE);
-        $('.controls p').replaceWith('<p class="ok" onClick="FM.bulkPopupClose();">close</p>');
+        $('.controls').html('<p class="ok" onClick="FM.bulkPopupClose();">'+App.Constants.FM_DONE+'</p>');
     }
     else {
         $('#popup .results').html(msg);
-        $('.controls p').replaceWith('<p class="ok" onClick="FM.bulkPopupClose();">close</p>');
+        $('.controls').html('<p class="ok" onClick="FM.bulkPopupClose();">'+App.Constants.FM_DONE+'</p>');
     }
 }
 
@@ -795,49 +795,47 @@ FM.humanFileSizeUnit = function(size) {
 }
 
 
-FM.bulkCopy = function() {
+FM.bulkCopyDo = function() {
     var acc = $(FM.CURRENT_TAB).find('.dir.selected');
     if (acc.length > 0) {
         //FM.popupClose();
-        
+
         var cfr_html = '';
-        
+        var numberOfItems = 0;
         $.each(acc, function(i, o) {
             var ref = $(o);
             var src = $(ref).find('.source').val();
             src = $.parseJSON(src);
-          
+
             if (!FM.isItemPseudo(o)) {
                 cfr_html += '<div>'+src.name+'</div>';
+                numberOfItems++;
             }
         });
         
-        var tpl = Tpl.get('popup_bulk', 'FM');
-        tpl.set(':ACTION', App.Constants.FM_YOU_ARE_COPYING);
-        tpl.set(':TEXT',   cfr_html);
-       
-        FM.popupOpen(tpl.finalize());
-        
+
         var bulkStatuses = [];
         $.each(acc, function(i, o) {
             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);
+            if (FM.isItemPseudo(src)) {
+                //cfr_html += '<div>'+src.name+'</div>';
+                return;
+            }
 
+            var tab = FM.getTabLetter(FM.CURRENT_TAB);
             var opposite_tab = 'A';
             if (tab == 'A') {
                 opposite_tab = 'B';
             }
 
             if (FM.isItemPseudo(src)) {
-                return FM.displayError(
+                /*return FM.displayError(
                     App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
-                );
+                );*/
+                return;
             }
             
             var dest = FM['TAB_' + opposite_tab + '_CURRENT_PATH' ];
@@ -863,6 +861,106 @@ FM.bulkCopy = function() {
                     bulkStatuses.push(reply.message);
                 }
                 
+                FM.checkBulkStatus(bulkStatuses, acc);
+            });
+        });
+    }
+}
+
+FM.bulkCopy = function() {
+    var acc = $(FM.CURRENT_TAB).find('.dir.selected');
+    if (acc.length > 0) {
+        FM.popupClose();
+
+        var cfr_html = '';
+        var numberOfItems = 0;
+        $.each(acc, function(i, o) {
+            var ref = $(o);
+            var src = $(ref).find('.source').val();
+            src = $.parseJSON(src);
+
+            if (!FM.isItemPseudo(o)) {
+                cfr_html += '<div>'+src.name+'</div>';
+                numberOfItems++;
+            }
+        });
+        
+        var tab = FM.getTabLetter(FM.CURRENT_TAB);
+        var opposite_tab = 'A';
+        if (tab == 'A') {
+            opposite_tab = 'B';
+        }
+        var dest = FM['TAB_' + opposite_tab + '_CURRENT_PATH' ];
+        if (dest == '') {
+            dest = GLOBAL.ROOT_DIR;
+        }
+
+        var tpl = Tpl.get('popup_bulk_copy', 'FM');
+        tpl.set(':NUMBER_OF_ITEMS', numberOfItems);
+        tpl.set(':DST_FILENAME', dest);
+        //popup_bulk_copy
+
+        FM.popupOpen(tpl.finalize());
+
+    }
+}
+
+FM.bulkRemoveDo = function() {
+    var acc = $(FM.CURRENT_TAB).find('.dir.selected');
+    if (acc.length > 0) {
+        //FM.popupClose();
+        
+        var cfr_html = '';
+        
+        $.each(acc, function(i, o) {
+            var ref = $(o);
+            var src = $(ref).find('.source').val();
+            src = $.parseJSON(src);
+          
+            if (!FM.isItemPseudo(o)) {
+                cfr_html += '<div>'+src.name+'</div>';
+            }
+        });
+
+        var bulkStatuses = [];
+        $.each(acc, function(i, o) {
+            var ref = $(o);
+            var src = $(ref).find('.source').val();
+            src = $.parseJSON(src);
+
+            var tab = FM.getTabLetter(FM.CURRENT_TAB);
+
+            var opposite_tab = 'A';
+            if (tab == 'A') {
+                opposite_tab = 'B';
+            }
+
+            if (FM.isItemPseudo(src)) {
+                return;
+                /*return FM.displayError(
+                    App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
+                );*/
+            }
+            
+            var dest = FM['TAB_' + opposite_tab + '_CURRENT_PATH' ];
+            if (dest == '') {
+                dest = GLOBAL.ROOT_DIR;
+            }
+            
+            var params = {
+                item: src.full_path,
+                dir:  FM['TAB_' + tab + '_CURRENT_PATH']
+            };
+            
+            App.Ajax.request('delete_files', params, function(reply) {
+                if (reply.result == true) {
+                    bulkStatuses.push(true);
+                }
+                else {
+                    //FM.showError('copy-items', reply.message);
+                    bulkStatuses.push(reply.message);
+                }
+                
                 FM.checkBulkStatus(bulkStatuses, acc);
             });
         });
@@ -871,6 +969,33 @@ FM.bulkCopy = function() {
 }
 
 FM.bulkRemove = function() {
+    var acc = $(FM.CURRENT_TAB).find('.dir.selected');
+    if (acc.length > 0) {
+        FM.popupClose();
+
+        var cfr_html = '';
+        var numberOfItems = 0;
+        $.each(acc, function(i, o) {
+            var ref = $(o);
+            var src = $(ref).find('.source').val();
+            src = $.parseJSON(src);
+          
+            if (!FM.isItemPseudo(o)) {
+                cfr_html += '<div>'+src.name+'</div>';
+                numberOfItems++;
+            }
+        });
+
+        var tpl = Tpl.get('popup_bulk_remove', 'FM');
+        tpl.set(':NUMBER_OF_ITEMS', numberOfItems);
+        //tpl.set(':DST_FILENAME', dest);
+
+        FM.popupOpen(tpl.finalize());
+    }
+}
+
+
+FM.bulkRemove11111 = function() {
     var acc = $(FM.CURRENT_TAB).find('.dir.selected');
     if (acc.length > 0) {
         //FM.popupClose();
@@ -907,9 +1032,10 @@ FM.bulkRemove = function() {
             }
 
             if (FM.isItemPseudo(src)) {
-                return FM.displayError(
+                return;
+                /*return FM.displayError(
                     App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
-                );
+                );*/
             }
             
             var dest = FM['TAB_' + opposite_tab + '_CURRENT_PATH' ];
@@ -1810,6 +1936,7 @@ $(document).ready(function() {
     shortcut.add("Esc",function() {
         FM.Env.RELOAD_IN_TIME = false;
         $('#reload-in-time').remove();
+        $('.shortcuts').hide();
         if (FM.isPopupOpened()) {
             return FM.handlePopupCancel();
         }
@@ -1820,6 +1947,15 @@ $(document).ready(function() {
         'target':           document
     });
 
+    shortcut.add("h", function(){
+        $('.shortcuts').toggle();
+    }, {
+        'type':             'keydown',
+        'propagate':        false,
+        'disable_in_input': true,
+        'target':           document
+    });
+
     shortcut.add("Down",function() {
         FM.goDown();
     },{
@@ -2014,6 +2150,7 @@ $(document).ready(function() {
         'disable_in_input': false,
         'target':           document
     });
+
     shortcut.add("a",function() {
         FM.packItem();
     },{
@@ -2023,8 +2160,6 @@ $(document).ready(function() {
         'target':           document
     });
 
-    
-
     shortcut.add("d",function() {
         FM.downloadFiles();
     },{
@@ -2098,15 +2233,22 @@ $(document).ready(function() {
     $('.context-menu.sort-order').on('click', 'span', function(evt){
         FM.reOrderList($(evt.target));
     });
-    
+
     $('.warning-box .close').on('click', function(evt){
         $(evt.target).closest('.warning-box').hide();
     });
 
     $('.menu-A .extract-btn').hide();
     $('.menu-B .extract-btn').hide();
-    
-    
+
+
+    $('.to-shortcuts').click(function(){
+        $('.shortcuts').toggle();
+    });
+
+    $('.shortcuts .close').click(function(){
+        $('.shortcuts').hide();
+    });
 
 });
 

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

@@ -63,6 +63,7 @@ App.Constants.FM_COPY                           = '<?=__('Copy') ?>';
 App.Constants.FM_CANCEL                         = '<?=__('Cancel')?>';
 App.Constants.FM_RENAME                         = '<?=__('Rename')?>';
 App.Constants.FM_DELETE                         = '<?=__('Delete')?>';
+App.Constants.FM_CONFIRM_DELETE_BULK            = '<?=__('Delete items')?>';
 App.Constants.FM_EXTRACT                        = '<?=__('Extract')?>';
 App.Constants.FM_CREATE                         = '<?=__('Create')?>';
 App.Constants.FM_PACK                           = '<?=__('Compress')?>';
@@ -71,6 +72,8 @@ App.Constants.FM_OK                             = '<?=__('OK')?>';
 App.Constants.FM_YOU_ARE_COPYING                = '<?=__('YOU ARE COPYING')?>';
 App.Constants.FM_YOU_ARE_REMOVING               = '<?=__('YOU ARE REMOVING')?>';
 
+App.Constants.FM_COPY_BULK                      = '<?=__('Copy files')?>';
+
 App.Constants.FM_CONFIRM_COPY                   = '<?=__('Are you sure you want to copy')?>';
 App.Constants.FM_CONFIRM_DELETE                 = '<?=__('Are you sure you want to delete')?>';
 App.Constants.FM_INTO_KEYWORD                   = '<?=__('into')?>';

+ 26 - 7
web/js/templates.js

@@ -10,11 +10,11 @@ App.Templates.html = {
     //
 
     FM: {
-		reload_in_time: [
-					'<div id="reload-in-time" class="warning-box reload">\
-						<div class="message-small">'+App.Constants.FM_HIT+' <span>F5</span> '+App.Constants.FM_TO_RELOAD_THE_PAGE+'</div>\
-					</div>'
-		],
+        reload_in_time: [
+                    '<div id="reload-in-time" class="warning-box reload">\
+                        <div class="message-small">'+App.Constants.FM_HIT+' <span>F5</span> '+App.Constants.FM_TO_RELOAD_THE_PAGE+'</div>\
+                    </div>'
+        ],
         entry_line: ['<li class="dir">\
                         <span class="marker">\
                         </span>\
@@ -37,14 +37,33 @@ App.Templates.html = {
                             <p class="ok" onClick="FM.popupClose();">'+App.Constants.FM_CLOSE+'</p>\
                             </div>\
                         </div>'],
-        popup_bulk: ['<div class="confirm-box alarm popup-box">\
+        popup_bulk_remove: ['<div class="confirm-box delete popup-box">\
+                            <div class="message">'+App.Constants.FM_CONFIRM_DELETE_BULK+' (~!:NUMBER_OF_ITEMS~!)?</div>\
+                                <div class="controls">\
+                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                            <p class="ok" onClick="FM.bulkRemoveDo();">'+App.Constants.FM_DELETE+'</p>\
+                            </div>\
+                        </div>'],
+        popup_bulk_copy: ['<div class="confirm-box copy popup-box">\
+                            <div class="message">'+App.Constants.FM_COPY_BULK+' (~!:NUMBER_OF_ITEMS~!) '+ App.Constants.FM_INTO_KEYWORD +':</div>\
+                            <div class="actions">\
+                                <input type="text" id="copy_dest" value="~!:DST_FILENAME~!" class="new-title">\
+                            </div>\
+                            <div class="results"></div>\
+                            <div class="message">'+App.Constants.FM_EXISTING_FILES_WILL_BE_REPLACED+'</div>\
+                                <div class="controls">\
+                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
+                            <p class="ok" onClick="FM.bulkCopyDo();">'+App.Constants.FM_COPY+'</p>\
+                            </div>\
+                        </div>'],
+        /*popup_bulk: ['<div class="confirm-box alarm popup-box">\
                             <div class="message">~!:ACTION~!: <br />~!:TEXT~!</div>\
                             <div class="results"></div>\
                                 <div class="controls">\
                             <!-- p class="ok" onClick="FM.popupClose();">'+App.Constants.FM_CLOSE+'</p -->\
                             <p><img src="/images/in_progress.gif"></p>\
                             </div>\
-                        </div>'],
+                        </div>'],*/
         popup_delete: ['<div class="confirm-box delete popup-box">\
                             <div class="message">'+App.Constants.FM_CONFIRM_DELETE+' <span class="title">"~!:FILENAME~!"</span>?</div>\
                                 <div class="controls">\

+ 4 - 0
web/templates/admin/panel.html

@@ -1,6 +1,10 @@
   <a href="#" class="to-top">
     <i class="l-icon-to-top"></i>
   </a>
+  <a href="#" class="to-shortcuts">
+    <i class="l-icon-shortcuts"></i>
+  </a>
+
   <div class="l-header">
     <div class="l-center">
       <a href="/" class="l-logo"></a>

+ 43 - 0
web/templates/file_manager/main.php

@@ -14,6 +14,10 @@
 <link rel="stylesheet" href="/css/jquery.fileupload.css">
 </head>
 <body>
+    <a href="#" class="to-shortcuts">
+        <i class="l-icon-shortcuts"></i>
+    </a>
+
     <div id="main">
         <div class="window active">
             <a href="/" class="l-logo"></a>
@@ -72,6 +76,43 @@
             <div class="progress-elm"><span class="title"><?=__('Initializing')?></span><span class="progress" style="backround-position: -96px;  backround-position:-10px"></span><span class="close hidden"></span></div>
         </div>
 
+    <div class="shortcuts" style="display:none">
+      <div class="header">
+        <div class="title">Shortcuts</div>
+        <div class="close"></div>
+      </div>
+      <ul>
+        <li><span class="key">u</span><?=__('Upload')?></li>
+        <li><span class="key">n</span><?=__('New File')?></li>
+        <li><span class="key">F7</span><?=__('New Folder')?></li>
+        <li><span class="key">d</span><?=__('Download')?></li>
+        <li><span class="key">F2 / &lt;Shift&gt;+F6</span><?=__('Rename')?></li>
+        <li><span class="key">F5</span><?=__('Copy')?></li>
+        <li><span class="key">a</span><?=__('Archive')?></li>
+        <li><span class="key">F8 / Del</span><?=__('Delete')?></li>
+        <li class="step-top"><span class="key">&lt;Ctrl&gt; + s</span><?=__('Save File (in text editor)')?></li>
+        <li class="step-top"><span class="key">h</span><?=__('Display Shortcuts Help')?></li>
+        <li class="step-top"><span class="key">Esc</span><?=__('Close Popup / Cancel')?></li>
+      </ul>
+      <ul>
+        <li><span class="key bigger">&uarr;</span><?=__('Move Cursor Up')?></li>
+        <li><span class="key bigger">&darr;</span><?=__('Move Cursor Down')?></li>
+        <li><span class="key bigger">&larr;</span><?=__('Switch to Left Tab')?></li>
+        <li><span class="key bigger">&rarr;</span><?=__('Switch to Right Tab')?></li>
+        <li><span class="key">&lt;Tab&gt;</span><?=__('Switch Tab')?></li>
+        <li><span class="key">&lt;Home&gt;</span><?=__('Go to the Top of the File List')?></li>
+        <li><span class="key">&lt;End&gt;</span><?=__('Go to the Last File')?></li>
+        <li class="step-top"><span class="key">&lt;Enter&gt;</span><?=__('Open File / Enter Directory')?></li>
+        <li><span class="key">&lt;Backspace&gt;</span><?=__('Go to Parent Directory')?></li>
+        <li class="step-top"><span class="key">&lt;Insert&gt; / &lt;Space&gt;</span><?=__('Select Current File')?></li>
+        <li><span class="key">&lt;Shift&gt; + click</span><?=__('Select Bunch of Files')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + click</span><?=__('Add File to the Current Selection')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + a</span><?=__('Select All Files')?></li>
+      </ul>
+      <ul class="note"><?=__('shortcuts are inspired by magnificent GNU <a href="https://www.midnight-commander.org/">Midnight Commander</a> file manager')?></ul>
+    </div>
+
+
         <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
         <script src="//cdnjs.cloudflare.com/ajax/libs/fotorama/4.6.2/fotorama.js"></script>
         <script type="text/javascript" src="/js/jquery-ui.min.js"></script>
@@ -346,6 +387,8 @@
 						FM['CURRENT_B_LINE'] = 0;
 					}
                 }
+
+
             });
             /*$(".listing-right").selectable({
                 selected: function (event, ui) {

+ 38 - 22
web/templates/footer.html

@@ -460,11 +460,26 @@
                   }
               );
 
+              shortcut.add("Esc", function(){
+                $('.shortcuts').hide();
+              }, {
+                  'type':             'keydown',
+                  'propagate':        false,
+                  'disable_in_input': true,
+                  'target':           document
+                  }
+              );
+
 
               $('.shortcuts .close').click(function(){
                 $('.shortcuts').hide();
               });
 
+              $('.to-shortcuts').click(function(){
+                $('.shortcuts').toggle();
+              });
+
+
             VE.core.register();
             if (location.href.search(/list/) != -1) {
                 var shift_select_ref = $('body').finderSelect({
@@ -511,30 +526,31 @@
         <div class="close"></div>
       </div>
       <ul>
-        <li><span class="key">n</span>Add New object</li>
-        <li><span class="key">&lt;Ctrl&gt; + Enter</span>Save Form</li>
-        <li class="step-top"><span class="key">&lt;Ctrl&gt; + Backspace</span>Cancel saving form</li>
-
-        <li><span class="key">1</span>Go to USER list</li>
-        <li><span class="key">2</span>Go to WEB list</li>
-        <li><span class="key">3</span>Go to DNS list</li>
-        <li><span class="key">4</span>Go to MAIL list</li>
-        <li><span class="key">5</span>Go to DB list</li>
-        <li><span class="key">6</span>Go to CRON list</li>
-        <li class="step-top"><span class="key">7</span>Go to BACKUP list</li>
+        <li><span class="key">n</span><?=__('Add New object')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + Enter</span><?=__('Save Form')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + Backspace</span><?=__('Cancel saving form')?></li>
+
+        <li class="step-top"><span class="key">1</span><?=__('Go to USER list')?></li>
+        <li><span class="key">2</span><?=__('Go to WEB list')?></li>
+        <li><span class="key">3</span><?=__('Go to DNS list')?></li>
+        <li><span class="key">4</span><?=__('Go to MAIL list')?></li>
+        <li><span class="key">5</span><?=__('Go to DB list')?></li>
+        <li><span class="key">6</span><?=__('Go to CRON list')?></li>
+        <li><span class="key">7</span><?=__('Go to BACKUP list')?></li>
       </ul>
       <ul>
-        <li class="step-top"><span class="key">f</span>Focus on search</li>
-        <li class="step-top"><span class="key">h</span>Display/Close shortcuts</li>
-
-        <li><span class="key">&lt;Ctrl&gt; + 1</span>Go to Packages</li>
-        <li><span class="key">&lt;Ctrl&gt; + 2</span>Go to IP</li>
-        <li><span class="key">&lt;Ctrl&gt; + 3</span>Go to Graphs</li>
-        <li><span class="key">&lt;Ctrl&gt; + 4</span>Go to Statistics</li>
-        <li><span class="key">&lt;Ctrl&gt; + 5</span>Go to Log</li>
-        <li><span class="key">&lt;Ctrl&gt; + 6</span>Go to Updates</li>
-        <li><span class="key">&lt;Ctrl&gt; + 7</span>Go to Firewall</li>
-        <li><span class="key">&lt;Ctrl&gt; + 8</span>Go to Server</li>
+        <li><span class="key">f</span><?=__('Focus on search')?></li>
+        <li class="step-top"><span class="key">h</span><?=__('Display/Close shortcuts')?></li>
+
+        <li class="step-top"><span class="key">&lt;Ctrl&gt; + 1</span><?=__('Go to Packages')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + 2</span><?=__('Go to IP')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + 3</span><?=__('Go to Graphs')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + 4</span><?=__('Go to Statistics')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + 5</span><?=__('Go to Log')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + 6</span><?=__('Go to Updates')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + 7</span><?=__('Go to Firewall')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + 8</span><?=__('Go to File Manager')?></li>
+        <li><span class="key">&lt;Ctrl&gt; + 9</span><?=__('Go to Server')?></li>
       </ul>
 
     </div>

+ 4 - 0
web/templates/user/panel.html

@@ -1,6 +1,9 @@
   <a href="#" class="to-top">
     <i class="l-icon-to-top"></i>
   </a>
+  <a href="#" class="to-shortcuts">
+    <i class="l-icon-shortcuts"></i>
+  </a>
   <div class="l-header">
     <div class="l-center">
       <a href="/" class="l-logo"></a>
@@ -8,6 +11,7 @@
       <div class="l-menu clearfix">
         <div class="l-menu__item <?php if($TAB == 'STATS' ) echo 'l-menu__item--active' ?>"><a href="/list/stats/"><?=__('Statistics')?></a></div>
         <div class="l-menu__item <?php if($TAB == 'LOG' ) echo 'l-menu__item--active' ?>"><a href="/list/log/"><?=__('Log')?></a></div>
+        <?php if ((isset($_SESSION['FILEMANAGER_KEY'])) && (!empty($_SESSION['FILEMANAGER_KEY']))) {?><div class="l-menu__item <?php if($TAB == 'FILEMANAGER' ) echo 'l-menu__item--active' ?>"><a href="/list/directory/"><?=__('File Manager')?></a></div><?php }?>
       </div>
       <!-- /.l-menu -->
 

+ 49 - 1
web/upload/UploadHandler.php

@@ -1,4 +1,36 @@
 <?php
+
+//session_start();
+
+include($_SERVER['DOCUMENT_ROOT']."/inc/main.php");
+
+//$user = $_SESSION['user'];
+
+if (empty($panel)) {
+    $command = VESTA_CMD."v-list-user '".$user."' 'json'";
+    exec ($command, $output, $return_var);
+    if ( $return_var > 0 ) {
+        header("Location: /error/");
+        exit;
+    }
+    $panel = json_decode(implode('', $output), true);
+}
+$user = array_keys($panel);
+$user = $user[0];
+
+define('USERNAME', $user);
+
+
+/*
+// Check user session
+if ((!isset($_SESSION['user'])) && (!defined('NO_AUTH_REQUIRED'))) {
+    $_SESSION['request_uri'] = $_SERVER['REQUEST_URI'];
+    header("Location: /login/");
+    exit;
+}
+*/
+
+
 /*
  * jQuery File Upload Plugin PHP Class 8.1.0
  * https://github.com/blueimp/jQuery-File-Upload
@@ -1042,6 +1074,8 @@ class UploadHandler
 
     protected function handle_file_upload($uploaded_file, $name, $size, $type, $error,
         $index = null, $content_range = null) {
+  
+        
         $file = new \stdClass();
         $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error,
             $index, $content_range);
@@ -1065,7 +1099,21 @@ class UploadHandler
                         FILE_APPEND
                     );
                 } else {
-                    move_uploaded_file($uploaded_file, $file_path);
+                    chmod($uploaded_file, 0644);
+                    //move_uploaded_file($uploaded_file, $file_path);
+                    exec (VESTA_CMD . "v-copy-fs-file ". USERNAME ." {$uploaded_file} {$file_path}", $output, $return_var);
+
+                    $error = check_return_code($return_var, $output);
+                    if ($return_var != 0) {
+                        //var_dump(VESTA_CMD . "v-copy-fs-file {$user} {$fn} {$path}");
+                        //var_dump($path);
+                        //var_dump($output);
+                        $file->error = 'Error while saving file';
+                        /*var_dump(VESTA_CMD . "v-copy-fs-file ". USERNAME ." {$uploaded_file} {$file_path}");
+                        var_dump($return_var);
+                        var_dump($output);
+                        die();*/
+                    }
                 }
             } else {
                 // Non-multipart uploads (PUT method support)