]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/lxc/SnapshotTree.js
1 Ext
.define('PVE.lxc.SnapshotTree', {
2 extend
: 'Ext.tree.Panel',
3 alias
: ['widget.pveLxcSnapshotTree'],
5 onlineHelp
: 'pct_snapshots',
12 stateId
: 'grid-lxc-snapshots',
14 sorterFn: function(rec1
, rec2
) {
15 var v1
= rec1
.data
.snaptime
;
16 var v2
= rec2
.data
.snaptime
;
18 if (rec1
.data
.name
=== 'current') {
21 if (rec2
.data
.name
=== 'current') {
25 return (v1
> v2
? 1 : (v1
< v2
? -1 : 0));
28 reload: function(repeat
) {
31 Proxmox
.Utils
.API2Request({
32 url
: '/nodes/' + me
.nodename
+ '/lxc/' + me
.vmid
+ '/snapshot',
34 failure: function(response
, opts
) {
35 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
36 me
.load_task
.delay(me
.load_delay
);
38 success: function(response
, opts
) {
39 Proxmox
.Utils
.setErrorMask(me
, false);
40 var digest
= 'invalid';
42 var root
= { name
: '__root', expanded
: true, children
: [] };
43 Ext
.Array
.each(response
.result
.data
, function(item
) {
46 if (item
.name
=== 'current') {
47 digest
= item
.digest
+ item
.running
;
49 item
.iconCls
= 'fa fa-fw fa-desktop x-fa-tree-running';
51 item
.iconCls
= 'fa fa-fw fa-desktop x-fa-tree';
54 item
.iconCls
= 'fa fa-fw fa-history x-fa-tree';
56 idhash
[item
.name
] = item
;
59 if (digest
!== me
.old_digest
) {
60 me
.old_digest
= digest
;
62 Ext
.Array
.each(response
.result
.data
, function(item
) {
63 if (item
.parent
&& idhash
[item
.parent
]) {
64 var parent_item
= idhash
[item
.parent
];
65 parent_item
.children
.push(item
);
66 parent_item
.leaf
= false;
67 parent_item
.expanded
= true;
68 parent_item
.expandable
= false;
70 root
.children
.push(item
);
77 me
.load_task
.delay(me
.load_delay
);
81 Proxmox
.Utils
.API2Request({
82 url
: '/nodes/' + me
.nodename
+ '/lxc/' + me
.vmid
+ '/feature',
83 params
: { feature
: 'snapshot' },
85 success: function(response
, options
) {
86 var res
= response
.result
.data
;
88 var snpBtns
= Ext
.ComponentQuery
.query('#snapshotBtn');
89 snpBtns
.forEach(function(item
){
100 beforestatesave: function(grid
, state
, eopts
) {
101 // extjs cannot serialize functions,
102 // so a the sorter with only the sorterFn will
103 // not be a valid sorter when restoring the state
104 delete state
.storeState
.sorters
;
108 initComponent: function() {
111 me
.nodename
= me
.pveSelNode
.data
.node
;
113 throw "no node name specified";
116 me
.vmid
= me
.pveSelNode
.data
.vmid
;
118 throw "no VM ID specified";
121 me
.load_task
= new Ext
.util
.DelayedTask(me
.reload
, me
);
123 var sm
= Ext
.create('Ext.selection.RowModel', {});
125 var valid_snapshot = function(record
) {
126 return record
&& record
.data
&& record
.data
.name
&&
127 record
.data
.name
!== 'current';
130 var valid_snapshot_rollback = function(record
) {
131 return record
&& record
.data
&& record
.data
.name
&&
132 record
.data
.name
!== 'current' && !record
.data
.snapstate
;
135 var run_editor = function() {
136 var rec
= sm
.getSelection()[0];
137 if (valid_snapshot(rec
)) {
138 var win
= Ext
.create('PVE.window.LxcSnapshot', {
139 snapname
: rec
.data
.name
,
140 nodename
: me
.nodename
,
144 me
.mon(win
, 'close', me
.reload
, me
);
148 var editBtn
= new Proxmox
.button
.Button({
149 text
: gettext('Edit'),
152 enableFn
: valid_snapshot
,
156 var rollbackBtn
= new Proxmox
.button
.Button({
157 text
: gettext('Rollback'),
161 enableFn
: valid_snapshot_rollback
,
162 confirmMsg: function(rec
) {
163 var taskdescription
= Proxmox
.Utils
.format_task_description('vzrollback', me
.vmid
);
164 var snaptime
= Ext
.Date
.format(rec
.data
.snaptime
,'Y-m-d H:i:s');
165 var snapname
= rec
.data
.name
;
167 var msg
= Ext
.String
.format(gettext('{0} to {1} ({2})'),
168 taskdescription
, snapname
, snaptime
);
169 msg
+= '<p>' + gettext('Note: Rollback stops CT') + '</p>';
173 handler: function(btn
, event
) {
174 var rec
= sm
.getSelection()[0];
178 var snapname
= rec
.data
.name
;
180 Proxmox
.Utils
.API2Request({
181 url
: '/nodes/' + me
.nodename
+ '/lxc/' + me
.vmid
+ '/snapshot/' + snapname
+ '/rollback',
184 callback: function() {
187 failure: function (response
, opts
) {
188 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
190 success: function(response
, options
) {
191 var upid
= response
.result
.data
;
192 var win
= Ext
.create('Proxmox.window.TaskProgress', { upid
: upid
});
199 var removeBtn
= new Proxmox
.button
.Button({
200 text
: gettext('Remove'),
203 confirmMsg: function(rec
) {
204 var msg
= Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
205 "'" + rec
.data
.name
+ "'");
208 enableFn
: valid_snapshot
,
209 handler: function(btn
, event
) {
210 var rec
= sm
.getSelection()[0];
214 var snapname
= rec
.data
.name
;
216 Proxmox
.Utils
.API2Request({
217 url
: '/nodes/' + me
.nodename
+ '/lxc/' + me
.vmid
+ '/snapshot/' + snapname
,
220 callback: function() {
223 failure: function (response
, opts
) {
224 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
226 success: function(response
, options
) {
227 var upid
= response
.result
.data
;
228 var win
= Ext
.create('Proxmox.window.TaskProgress', { upid
: upid
});
235 var snapshotBtn
= Ext
.create('Ext.Button', {
236 itemId
: 'snapshotBtn',
237 text
: gettext('Take Snapshot'),
239 handler: function() {
240 var win
= Ext
.create('PVE.window.LxcSnapshot', {
241 nodename
: me
.nodename
,
252 sortableColumns
: false,
254 tbar
: [ snapshotBtn
, rollbackBtn
, removeBtn
, editBtn
],
256 'name', 'description', 'snapstate', 'vmstate', 'running',
257 { name
: 'snaptime', type
: 'date', dateFormat
: 'timestamp' }
262 text
: gettext('Name'),
265 renderer: function(value
, metaData
, record
) {
266 if (value
=== 'current') {
274 // text: gettext('RAM'),
277 // dataIndex: 'vmstate',
279 // renderer: function(value, metaData, record) {
280 // if (record.data.name !== 'current') {
281 // return Proxmox.Utils.format_boolean(value);
286 text
: gettext('Date') + "/" + gettext("Status"),
287 dataIndex
: 'snaptime',
290 renderer: function(value
, metaData
, record
) {
291 if (record
.data
.snapstate
) {
292 return record
.data
.snapstate
;
295 return Ext
.Date
.format(value
,'Y-m-d H:i:s');
300 text
: gettext('Description'),
301 dataIndex
: 'description',
303 renderer: function(value
, metaData
, record
) {
304 if (record
.data
.name
=== 'current') {
305 return gettext("You are here!");
307 return Ext
.String
.htmlEncode(value
);
315 destroy
: me
.load_task
.cancel
,
316 itemdblclick
: run_editor
322 me
.store
.sorters
.add(new Ext
.util
.Sorter({
323 sorterFn
: me
.sorterFn