]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/tree/ResourceTree.js
open vm console on doubleclick in tree
[pve-manager.git] / www / manager6 / tree / ResourceTree.js
index 711a38616a662e10fd15dec7d54e9da3908ba75d..ac487c6c30adf7ba6d75fd6dfe78000fb9a550a5 100644 (file)
@@ -8,28 +8,37 @@ Ext.define('PVE.tree.ResourceTree', {
     statics: {
        typeDefaults: {
            node: { 
-               iconCls: 'x-tree-node-server',
-               text: gettext('Node list')
+               iconCls: 'fa fa-building  x-fa-tree',
+               text: gettext('Nodes')
            },
            pool: { 
-               iconCls: 'x-tree-node-pool',
+               iconCls: 'fa fa-tags fa-dark  x-fa-tree',
                text: gettext('Resource Pool')
            },
            storage: {
-               iconCls: 'x-tree-node-harddisk',
-               text: gettext('Storage list')
+               iconCls: 'fa fa-database fa-dark  x-fa-tree',
+               text: gettext('Storage')
            },
            qemu: {
-               iconCls: 'x-tree-node-computer',
+               iconCls: 'fa fa-desktop  x-fa-tree',
                text: gettext('Virtual Machine')
            },
            lxc: {
-               iconCls: 'x-tree-node-lxc',
+               //iconCls: 'x-tree-node-lxc',
+               iconCls: 'fa fa-cube  x-fa-tree',
                text: gettext('LXC Container')
-           } 
+           },
+           template: {
+               iconCls: 'fa fa-file-o fa-dark  x-fa-tree-template'
+           },
+           datacenter: {
+               iconCls: 'fa fa-server x-fa-tree-datacenter'
+           }
        }
     },
 
+    useArrows: true,
+
     // private
     nodeSortFn: function(node1, node2) {
        var n1 = node1.data;
@@ -94,10 +103,34 @@ Ext.define('PVE.tree.ResourceTree', {
        var me = this;
 
        var defaults = PVE.tree.ResourceTree.typeDefaults[info.type];
+       if (info.id === 'root') {
+           defaults = PVE.tree.ResourceTree.typeDefaults.datacenter;
+       } else if (info.type === 'type') {
+           defaults = PVE.tree.ResourceTree.typeDefaults[info.groupbyid];
+       }
        if (defaults && defaults.iconCls) {
-           var running = info.running ? '-running' : '';
-           var template = info.template ? '-template' : '';
-           info.iconCls = defaults.iconCls + running + template;
+           var iconClsAdd = '';
+
+           if (info.running && info.type === 'node') {
+               iconClsAdd = '-online';
+           } else if (info.running) {
+               iconClsAdd = '-running';
+               if (info.status === 'paused') {
+                   iconClsAdd = '-paused';
+               }
+           } else if (info.type === 'lxc' || info.type === 'qemu') {
+               iconClsAdd = '-stopped';
+           } else if (info.type === 'node') {
+               iconClsAdd = '-offline';
+           }
+
+           info.iconCls = defaults.iconCls + iconClsAdd;
+
+           if (info.template) {
+               iconClsAdd = '-template';
+               info.iconCls = PVE.tree.ResourceTree.typeDefaults.template.iconCls + '-' + info.type;
+           }
+
        }
     },
 
@@ -201,7 +234,7 @@ Ext.define('PVE.tree.ResourceTree', {
            // fixme: suspend events ?
 
            var rootnode = me.store.getRootNode();
-           
+           me.setIconCls(rootnode.data);
            // remember selected node (and all parents)
            var sm = me.getSelectionModel();
 
@@ -217,7 +250,8 @@ Ext.define('PVE.tree.ResourceTree', {
            var groups = me.viewFilter.groups || [];
            var filterfn = me.viewFilter.filterfn;
 
-           // remove vanished or changed items
+           // remove vanished or moved items
+           // update in place changed items
            var key;
            for (key in index) {
                if (index.hasOwnProperty(key)) {
@@ -228,21 +262,33 @@ Ext.define('PVE.tree.ResourceTree', {
                    var item = rstore.data.get(olditem.data.id);
 
                    var changed = false;
+                   var moved = false;
                    if (item) {
                        // test if any grouping attributes changed
+                       // this will also catch migrated nodes
+                       // in server view
                        var i, len;
                        for (i = 0, len = groups.length; i < len; i++) {
                            var attr = groups[i];
                            if (item.data[attr] != olditem.data[attr]) {
                                //console.log("changed " + attr);
-                               changed = true;
+                               moved = true;
                                break;
                            }
                        }
+
+                       // explicitely check for node, since
+                       // in some views, node is not a grouping
+                       // attribute
+                       if (!moved && item.data.node !== olditem.data.node) {
+                           moved = true;
+                       }
+
+                       // tree item has been updated
                        if ((item.data.text !== olditem.data.text) ||
-                           (item.data.node !== olditem.data.node) ||
                            (item.data.running !== olditem.data.running) ||
-                           (item.data.template !== olditem.data.template)) {
+                           (item.data.template !== olditem.data.template) ||
+                           (item.data.status !== olditem.data.status)) {
                            //console.log("changed node/text/running " + olditem.data.id);
                            changed = true;
                        }
@@ -250,22 +296,19 @@ Ext.define('PVE.tree.ResourceTree', {
                        // fixme: also test filterfn()?
                    }
 
-                   if (!item || changed) {
+                   if (changed) {
+                       olditem.beginEdit();
+                       //console.log("REM UPDATE UID: " + key + " ITEM " + item.data.running);
+                       var info = olditem.data;
+                       Ext.apply(info, item.data);
+                       me.setIconCls(info);
+                       olditem.commit();
+                   }
+                   if ((!item || moved) && olditem.isLeaf()) {
                        //console.log("REM UID: " + key + " ITEM " + olditem.data.id);
-                       if (olditem.isLeaf()) {
-                           delete index[key];
-                           var parentNode = olditem.parentNode;
-                           parentNode.removeChild(olditem, true);
-                       } else {
-                           if (item && changed) {
-                               olditem.beginEdit();
-                               //console.log("REM UPDATE UID: " + key + " ITEM " + item.data.running);
-                               var info = olditem.data;
-                               Ext.apply(info, item.data);
-                               me.setIconCls(info);
-                               olditem.commit();
-                           }
-                       }
+                       delete index[key];
+                       var parentNode = olditem.parentNode;
+                       parentNode.removeChild(olditem, true);
                    }
                }
            }
@@ -303,6 +346,7 @@ Ext.define('PVE.tree.ResourceTree', {
                me.selectById(lastsel.data.id);
            }
 
+           // on first tree load set the selection from the stateful provider
            if (!pdata.updateCount) {
                rootnode.collapse();
                rootnode.expand();
@@ -321,6 +365,7 @@ Ext.define('PVE.tree.ResourceTree', {
        sp.on('statechange', statechange);
 
        Ext.apply(me, {
+           allowSelection: true,
            store: store,
            viewConfig: {
                // note: animate cause problems with applyState
@@ -330,32 +375,20 @@ Ext.define('PVE.tree.ResourceTree', {
             //rootVisible: false,
             //title: 'Resource Tree',
            listeners: {
-               itemcontextmenu: function(v, record, item, index, event) {
-                   event.stopEvent();
-                   //v.select(record);
-                   var menu;
-                   
-                   if (record.data.type === 'qemu' && !record.data.template) {
-                       menu = Ext.create('PVE.qemu.CmdMenu', {
-                           pveSelNode: record
-                       });
-                   } else if (record.data.type === 'qemu' && record.data.template) {
-                       menu = Ext.create('PVE.qemu.TemplateMenu', {
-                           pveSelNode: record
-                       });
-                   } else if (record.data.type === 'lxc') {
-                       menu = Ext.create('PVE.lxc.CmdMenu', {
-                           pveSelNode: record
-                       });
-                   } else {
-                       return;
-                   }
-
-                   menu.showAt(event.getXY());
-               },
+               itemcontextmenu: PVE.Utils.createCmdMenu,
                destroy: function() {
                    rstore.un("load", updateTree);
-               }
+               },
+               beforecellmousedown: function (tree, td, cellIndex, record, tr, rowIndex, ev) {
+                   // disable selection when right clicking
+                   me.allowSelection = (ev.button !== 2);
+               },
+               beforeselect: function (tree, record, index, eopts) {
+                   var allow = me.allowSelection;
+                   me.allowSelection = true;
+                   return allow;
+               },
+               itemdblclick: PVE.Utils.openTreeConsole
            },
            setViewFilter: function(view) {
                me.viewFilter = view;
@@ -380,6 +413,7 @@ Ext.define('PVE.tree.ResourceTree', {
                            cn.expand();
                        }
                    }
+                   me.getView().focusRow(node);
                }
            },
            selectById: function(nodeid) {