From d0780afcb0ce94373897f798b64d3c8973509994 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 13 Sep 2012 11:07:03 +0200 Subject: [PATCH] improve snapshot tree GUI Add dynamic updates, sort correctly. --- www/css/ext-pve.css | 6 -- www/images/Makefile | 1 - www/images/now.png | Bin 948 -> 0 bytes www/manager/qemu/Snapshot.js | 9 ++- www/manager/qemu/SnapshotTree.js | 110 ++++++++++++++++++++++++------- 5 files changed, 90 insertions(+), 36 deletions(-) delete mode 100644 www/images/now.png diff --git a/www/css/ext-pve.css b/www/css/ext-pve.css index 7322bd4a..03f4b5db 100644 --- a/www/css/ext-pve.css +++ b/www/css/ext-pve.css @@ -90,12 +90,6 @@ background-image:url(../images/snapshot.png); } -.x-tree-node-now, -.x-grid-tree-node-expanded .x-tree-node-now -{ - background-image:url(../images/now.png); -} - .pve-itype-icon-pool, .x-tree-node-pool, .x-grid-tree-pool-expanded .x-tree-node-pool diff --git a/www/images/Makefile b/www/images/Makefile index 6873d20b..56373937 100644 --- a/www/images/Makefile +++ b/www/images/Makefile @@ -20,7 +20,6 @@ GNOME_IMAGES = \ IMAGES = ${GNOME_IMAGES} \ snapshot.png \ - now.png \ computer-on.png \ memory.png \ processor.png \ diff --git a/www/images/now.png b/www/images/now.png deleted file mode 100644 index 31d862460d2712872e0a123f7105090876e355e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmV;l155mgP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01egv01egwkZ*aM00007bV*G`2iyq@ z2sJVn%uxye00T5hL_t(I%f*vlOjCCp#n1QN+skb)w@@MUULfFrp(2{HO&3E_M;4he zY8(-Wn)qikYQlpry6gpGG+SnZ#)r8mOZ>AXOQ*)*AKbDnV|&0gj2Xl~Ad;@K*4rYL zTS^P%mizMoB}??(@7sC!eok_74)CUr{x29~V%LEK%LXoA+BvT4t4!0Z005g!7|vC- zzp5IW&eyfI-6f)#R{-Nro;a^HHZ+g^-E%}@OwDmP60%*I;W=(LkxWTOD&?FaimEGC zwr;p|NZLW+yjBrr@SLQ z{s!IeZ@<~x0LIvNM3m+Mpe_~nM6O?HFUfWAIh&imxm~~UqTiW6B!1R%SpWG(wfBN= zf6=z>J%SN4Fx3BkY~*q6q+$Ga{+3_o03g!Yu~ie9=2%vJ^;%KI)q|gY^6!Jeq3MMZ zoF!S53m{EIk1D@Bepaoi@o6GcBb^;v0e}Ml@tN*XWHIsdt%|ObZ6_iCNZvVY;^!^fOl zv@M$g!T&-fqFqc#R=R3FM3+ObESjZQIBWtS%d%MP;XsDU-|iMe0dKvX1Te;>B$-A= zBg#T%@-By90hu{~T&VU>MZ&e^{oRX@r-c#I>CVOPrvf*B`MRjA+{XY$M3m-jQ<+08 zZay=e?IZh)!zZYUiPfg^Nw;jHGI$p zD9Y01eYh2x%OHQto=&+~4HlTj=BBa1h7ao3$jH+y5YK^l9xjzuf3!BY1!GO_%tWJH ztOoP9?CG3uB4bP*KXY_%^z@OVfp~@<^UfR7dG0?Wi{Bjp0Cn)6B~mQ9x^#A8eOZpc z-1`o-y7so7A)=%J07R6uk_jK5tz>7N`)Y@4B-$7momi*n!2|#-;7vsnAgg8WK;Ev; zFDM`H_7PF?bz^eP4E3!^c6?hm-P=_@s|TyW0A4G-C$0E!Sl+bz53$noD-n&q{CN({ W&``b)J$E7i0000 v2 ? 1 : (v1 < v2 ? -1 : 0)); + }, + + reload: function(repeat) { var me = this; 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); + me.load_task.delay(me.load_delay); }, success: function(response, opts) { - + var digest = 'invalid'; var idhash = {}; var root = { name: '__root', expanded: true, children: [] }; Ext.Array.each(response.result.data, function(item) { item.leaf = true; item.children = []; - if (item.name === '__current') { - item.iconCls = 'x-tree-node-now'; + if (item.name === 'current') { + digest = item.digest + item.running; + if (item.running) { + item.iconCls = 'x-tree-node-computer-running'; + } else { + item.iconCls = 'x-tree-node-computer'; + } } else { item.iconCls = 'x-tree-node-snapshot'; } 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); - } - }); + if (digest !== me.old_digest) { + me.old_digest = digest; - me.setRootNode(root); + 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); + } + }); + + me.setRootNode(root); + } + + me.load_task.delay(me.load_delay); } }); }, @@ -56,12 +86,18 @@ Ext.define('PVE.qemu.SnapshotTree', { throw "no VM ID specified"; } + me.load_task = new Ext.util.DelayedTask(me.reload, me); + var sm = Ext.create('Ext.selection.RowModel', {}); var valid_snapshot = function(record) { return record && record.data && record.data.name && record.data.name !== '__current'; }; + var valid_snapshot_rollback = function(record) { + return record && record.data && record.data.name && + record.data.name !== '__current' && !record.data.snapstate; + }; var run_editor = function() { var rec = sm.getSelection()[0]; @@ -90,7 +126,7 @@ Ext.define('PVE.qemu.SnapshotTree', { text: gettext('Rollback'), disabled: true, selModel: sm, - enableFn: valid_snapshot, + enableFn: valid_snapshot_rollback, handler: function(btn, event) { var rec = sm.getSelection()[0]; if (!rec) { @@ -154,10 +190,11 @@ Ext.define('PVE.qemu.SnapshotTree', { layout: 'fit', rootVisible: false, animate: false, + sortableColumns: false, selModel: sm, tbar: [ snapshotBtn, rollbackBtn, removeBtn, editBtn ], fields: [ - 'name', 'description', + 'name', 'description', 'snapstate', 'vmstate', 'running', { name: 'snaptime', type: 'date', dateFormat: 'timestamp' } ], columns: [ @@ -167,7 +204,7 @@ Ext.define('PVE.qemu.SnapshotTree', { dataIndex: 'name', width: 200, renderer: function(value, metaData, record) { - if (value === '__current') { + if (value === 'current') { return "NOW"; } else { return value; @@ -175,18 +212,37 @@ Ext.define('PVE.qemu.SnapshotTree', { } }, { - xtype: 'datecolumn', - text: gettext('Date'), + text: gettext('RAM'), + align: 'center', + resizable: false, + dataIndex: 'vmstate', + width: 50, + renderer: function(value, metaData, record) { + if (record.data.name !== 'current') { + return PVE.Utils.format_boolean(value); + } + } + }, + { + text: gettext('Date') + "/" + gettext("State"), dataIndex: 'snaptime', - format: 'Y-m-d H:i:s', - width: 120 + resizable: false, + width: 120, + renderer: function(value, metaData, record) { + if (record.data.snapstate) { + return record.data.snapstate; + } + if (value) { + return Ext.Date.format(value,'Y-m-d H:i:s'); + } + } }, { text: gettext('Description'), dataIndex: 'description', flex: 1, renderer: function(value, metaData, record) { - if (record.data.name === '__current') { + if (record.data.name === 'current') { return gettext("You are here!"); } else { return value; @@ -197,11 +253,17 @@ Ext.define('PVE.qemu.SnapshotTree', { columnLines: true, // will work in 4.1? listeners: { show: me.reload, + hide: me.load_task.cancel, + destroy: me.load_task.cancel, itemdblclick: run_editor } }); me.callParent(); + + me.store.sorters.add(new Ext.util.Sorter({ + sorterFn: me.sorterFn + })); } });