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;
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;
+ }
+
}
},
// fixme: suspend events ?
var rootnode = me.store.getRootNode();
-
+ me.setIconCls(rootnode.data);
// remember selected node (and all parents)
var sm = me.getSelectionModel();
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)) {
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;
}
// 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);
}
}
}
me.selectById(lastsel.data.id);
}
+ // on first tree load set the selection from the stateful provider
if (!pdata.updateCount) {
rootnode.collapse();
rootnode.expand();
sp.on('statechange', statechange);
Ext.apply(me, {
+ allowSelection: true,
store: store,
viewConfig: {
// note: animate cause problems with applyState
//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;
cn.expand();
}
}
+ me.getView().focusRow(node);
}
},
selectById: function(nodeid) {