]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/SnapshotTree.js
1 Ext
.define('PVE.qemu.SnapshotTree', {
2 extend
: 'Ext.tree.Panel',
3 alias
: ['widget.pveQemuSnapshotTree'],
10 stateId
: 'grid-qemu-snapshots',
12 sorterFn: function(rec1
, rec2
) {
13 var v1
= rec1
.data
.snaptime
;
14 var v2
= rec2
.data
.snaptime
;
16 if (rec1
.data
.name
=== 'current') {
19 if (rec2
.data
.name
=== 'current') {
23 return (v1
> v2
? 1 : (v1
< v2
? -1 : 0));
26 reload: function(repeat
) {
29 Proxmox
.Utils
.API2Request({
30 url
: '/nodes/' + me
.nodename
+ '/qemu/' + me
.vmid
+ '/snapshot',
32 failure: function(response
, opts
) {
33 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
34 me
.load_task
.delay(me
.load_delay
);
36 success: function(response
, opts
) {
37 Proxmox
.Utils
.setErrorMask(me
, false);
38 var digest
= 'invalid';
40 var root
= { name
: '__root', expanded
: true, children
: [] };
41 Ext
.Array
.each(response
.result
.data
, function(item
) {
44 if (item
.name
=== 'current') {
45 digest
= item
.digest
+ item
.running
;
47 item
.iconCls
= 'fa fa-fw fa-desktop x-fa-tree-running';
49 item
.iconCls
= 'fa fa-fw fa-desktop x-fa-tree';
52 item
.iconCls
= 'fa fa-fw fa-history x-fa-tree';
54 idhash
[item
.name
] = item
;
57 if (digest
!== me
.old_digest
) {
58 me
.old_digest
= digest
;
60 Ext
.Array
.each(response
.result
.data
, function(item
) {
61 if (item
.parent
&& idhash
[item
.parent
]) {
62 var parent_item
= idhash
[item
.parent
];
63 parent_item
.children
.push(item
);
64 parent_item
.leaf
= false;
65 parent_item
.expanded
= true;
66 parent_item
.expandable
= false;
68 root
.children
.push(item
);
75 me
.load_task
.delay(me
.load_delay
);
79 Proxmox
.Utils
.API2Request({
80 url
: '/nodes/' + me
.nodename
+ '/qemu/' + me
.vmid
+ '/feature',
81 params
: { feature
: 'snapshot' },
83 success: function(response
, options
) {
84 var res
= response
.result
.data
;
86 var snpBtns
= Ext
.ComponentQuery
.query('#snapshotBtn');
87 snpBtns
.forEach(function(item
){
98 beforestatesave: function(grid
, state
, eopts
) {
99 // extjs cannot serialize functions,
100 // so a the sorter with only the sorterFn will
101 // not be a valid sorter when restoring the state
102 delete state
.storeState
.sorters
;
106 initComponent: function() {
109 me
.nodename
= me
.pveSelNode
.data
.node
;
111 throw "no node name specified";
114 me
.vmid
= me
.pveSelNode
.data
.vmid
;
116 throw "no VM ID specified";
119 me
.load_task
= new Ext
.util
.DelayedTask(me
.reload
, me
);
121 var sm
= Ext
.create('Ext.selection.RowModel', {});
123 var valid_snapshot = function(record
) {
124 return record
&& record
.data
&& record
.data
.name
&&
125 record
.data
.name
!== 'current';
128 var valid_snapshot_rollback = function(record
) {
129 return record
&& record
.data
&& record
.data
.name
&&
130 record
.data
.name
!== 'current' && !record
.data
.snapstate
;
133 var run_editor = function() {
134 var rec
= sm
.getSelection()[0];
135 if (valid_snapshot(rec
)) {
136 var win
= Ext
.create('PVE.window.Snapshot', {
137 snapname
: rec
.data
.name
,
138 nodename
: me
.nodename
,
142 me
.mon(win
, 'close', me
.reload
, me
);
146 var editBtn
= new Proxmox
.button
.Button({
147 text
: gettext('Edit'),
150 enableFn
: valid_snapshot
,
154 var rollbackBtn
= new Proxmox
.button
.Button({
155 text
: gettext('Rollback'),
158 enableFn
: valid_snapshot_rollback
,
159 confirmMsg: function(rec
) {
160 return Proxmox
.Utils
.format_task_description('qmrollback', me
.vmid
) +
161 " '" + rec
.data
.name
+ "'";
163 handler: function(btn
, event
) {
164 var rec
= sm
.getSelection()[0];
168 var snapname
= rec
.data
.name
;
170 Proxmox
.Utils
.API2Request({
171 url
: '/nodes/' + me
.nodename
+ '/qemu/' + me
.vmid
+ '/snapshot/' + snapname
+ '/rollback',
174 callback: function() {
177 failure: function (response
, opts
) {
178 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
180 success: function(response
, options
) {
181 var upid
= response
.result
.data
;
182 var win
= Ext
.create('PVE.window.TaskProgress', { upid
: upid
});
189 var removeBtn
= new Proxmox
.button
.Button({
190 text
: gettext('Remove'),
193 confirmMsg: function(rec
) {
194 var msg
= Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
195 "'" + rec
.data
.name
+ "'");
198 enableFn
: valid_snapshot
,
199 handler: function(btn
, event
) {
200 var rec
= sm
.getSelection()[0];
204 var snapname
= rec
.data
.name
;
206 Proxmox
.Utils
.API2Request({
207 url
: '/nodes/' + me
.nodename
+ '/qemu/' + me
.vmid
+ '/snapshot/' + snapname
,
210 callback: function() {
213 failure: function (response
, opts
) {
214 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
216 success: function(response
, options
) {
217 var upid
= response
.result
.data
;
218 var win
= Ext
.create('PVE.window.TaskProgress', { upid
: upid
});
225 var snapshotBtn
= Ext
.create('Ext.Button', {
226 itemId
: 'snapshotBtn',
227 text
: gettext('Take Snapshot'),
229 handler: function() {
230 var win
= Ext
.create('PVE.window.Snapshot', {
231 nodename
: me
.nodename
,
242 sortableColumns
: false,
244 tbar
: [ snapshotBtn
, rollbackBtn
, removeBtn
, editBtn
],
246 'name', 'description', 'snapstate', 'vmstate', 'running',
247 { name
: 'snaptime', type
: 'date', dateFormat
: 'timestamp' }
252 text
: gettext('Name'),
255 renderer: function(value
, metaData
, record
) {
256 if (value
=== 'current') {
264 text
: gettext('RAM'),
267 dataIndex
: 'vmstate',
269 renderer: function(value
, metaData
, record
) {
270 if (record
.data
.name
!== 'current') {
271 return Proxmox
.Utils
.format_boolean(value
);
276 text
: gettext('Date') + "/" + gettext("Status"),
277 dataIndex
: 'snaptime',
279 renderer: function(value
, metaData
, record
) {
280 if (record
.data
.snapstate
) {
281 return record
.data
.snapstate
;
284 return Ext
.Date
.format(value
,'Y-m-d H:i:s');
289 text
: gettext('Description'),
290 dataIndex
: 'description',
292 renderer: function(value
, metaData
, record
) {
293 if (record
.data
.name
=== 'current') {
294 return gettext("You are here!");
296 return Ext
.String
.htmlEncode(value
);
301 columnLines
: true, // will work in 4.1?
304 destroy
: me
.load_task
.cancel
,
305 itemdblclick
: run_editor
311 me
.store
.sorters
.add(new Ext
.util
.Sorter({
312 sorterFn
: me
.sorterFn