From 52586927bb02dfa6f94f7387424e148213961b95 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Mon, 10 Sep 2012 13:30:38 +0200 Subject: [PATCH] add snapshot tree to GUI --- www/manager/Makefile | 1 + www/manager/StateProvider.js | 1 + www/manager/qemu/Config.js | 8 +++ www/manager/qemu/SnapshotTree.js | 98 ++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 www/manager/qemu/SnapshotTree.js diff --git a/www/manager/Makefile b/www/manager/Makefile index 19ccfa18a..f57391f88 100644 --- a/www/manager/Makefile +++ b/www/manager/Makefile @@ -100,6 +100,7 @@ JSSRC= \ qemu/StartupEdit.js \ qemu/ScsiHwEdit.js \ qemu/Options.js \ + qemu/SnapshotTree.js \ qemu/Config.js \ qemu/CreateWizard.js \ openvz/StatusView.js \ diff --git a/www/manager/StateProvider.js b/www/manager/StateProvider.js index 48d7c4ec7..b63c04ee4 100644 --- a/www/manager/StateProvider.js +++ b/www/manager/StateProvider.js @@ -49,6 +49,7 @@ Ext.define('PVE.StateProvider', { hprefix: 'v1', compDict: { + snapshot: 29, ha: 28, support: 27, pool: 26, diff --git a/www/manager/qemu/Config.js b/www/manager/qemu/Config.js index d0b5d4fcc..c55768796 100644 --- a/www/manager/qemu/Config.js +++ b/www/manager/qemu/Config.js @@ -152,6 +152,14 @@ Ext.define('PVE.qemu.Config', { }); } + if (caps.vms['VM.Snapshot']) { + me.items.push({ + title: gettext('Snapshots'), + xtype: 'pveQemuSnapshotTree', + itemId: 'snapshot' + }); + } + if (caps.vms['Permissions.Modify']) { me.items.push({ xtype: 'pveACLView', diff --git a/www/manager/qemu/SnapshotTree.js b/www/manager/qemu/SnapshotTree.js new file mode 100644 index 000000000..93629d38a --- /dev/null +++ b/www/manager/qemu/SnapshotTree.js @@ -0,0 +1,98 @@ +Ext.define('PVE.qemu.SnapshotTree', { + extend: 'Ext.tree.Panel', + alias: ['widget.pveQemuSnapshotTree'], + + reload: function() { + var me = this; + + console.log("RELOAD"); + + PVE.Utils.API2Request({ + url: '/nodes/' + me.nodename + '/qemu/' + me.vmid + '/snapshot', + waitMsgTarget: me, + method: 'GET', + failure: function(response, opts) { + PVE.Utils.setErrorMask(me, response.htmlStatus); + }, + success: function(response, opts) { + + var idhash = {}; + var root = { name: '__root', expanded: true, children: [] }; + Ext.Array.each(response.result.data, function(item) { + item.leaf = true; + item.children = []; + idhash[item.name] = item; + }); + + Ext.Array.each(response.result.data, function(item) { + if (item.parent && idhash[item.parent]) { + var parent_item = idhash[item.parent]; + parent_item.children.push(item); + parent_item.leaf = false; + parent_item.expanded = true; + } else { + root.children.push(item); + } + }); + + console.dir(root); + + me.setRootNode(root); + } + }); + }, + + initComponent: function() { + var me = this; + + me.nodename = me.pveSelNode.data.node; + if (!me.nodename) { + throw "no node name specified"; + } + + me.vmid = me.pveSelNode.data.vmid; + if (!me.vmid) { + throw "no VM ID specified"; + } + + Ext.apply(me, { + layout: 'fit', + rootVisible: false, + animate: false, + + fields: ['name', 'description' ], + columns: [ + { + xtype: 'treecolumn', + text: gettext('Name'), + dataIndex: 'name', + width: 200, + renderer: function(value, metaData, record) { + if (value === '__current') { + return "CWD"; + } else { + return value; + } + } + }, + { + text: gettext('Description'), + dataIndex: 'description', + flex: 1, + renderer: function(value, metaData, record) { + if (record.data.name === '__current') { + return gettext("You are here!"); + } else { + return value; + } + } + } + ] + }); + + me.callParent(); + + me.on('show', me.reload); + } +}); +