]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/grid/BackupView.js
add configuration button to backups
[pve-manager.git] / www / manager6 / grid / BackupView.js
1 Ext.define('PVE.grid.BackupView', {
2 extend: 'Ext.grid.GridPanel',
3
4 alias: ['widget.pveBackupView'],
5
6
7 initComponent : function() {
8 var me = this;
9
10 var nodename = me.pveSelNode.data.node;
11 if (!nodename) {
12 throw "no node name specified";
13 }
14
15 var vmid = me.pveSelNode.data.vmid;
16 if (!vmid) {
17 throw "no VM ID specified";
18 }
19
20 var vmtype = me.pveSelNode.data.type;
21 if (!vmtype) {
22 throw "no VM type specified";
23 }
24
25 var filterFn;
26 if (vmtype === 'openvz') {
27 filterFn = function(item) {
28 return item.data.volid.match(':backup/vzdump-openvz-');
29 };
30 } else if (vmtype === 'lxc') {
31 filterFn = function(item) {
32 return item.data.volid.match(':backup/vzdump-lxc-');
33 };
34 } else if (vmtype === 'qemu') {
35 filterFn = function(item) {
36 return item.data.volid.match(':backup/vzdump-qemu-');
37 };
38 } else {
39 throw "unsupported VM type '" + vmtype + "'";
40 }
41
42 me.store = Ext.create('Ext.data.Store', {
43 model: 'pve-storage-content',
44 sorters: {
45 property: 'volid',
46 order: 'DESC'
47 },
48 filters: { filterFn: filterFn }
49 });
50
51 var reload = Ext.Function.createBuffered(function() {
52 if (me.store && me.store.proxy.url) {
53 me.store.load();
54 }
55 }, 100);
56
57 var setStorage = function(storage) {
58 var url = '/api2/json/nodes/' + nodename + '/storage/' + storage + '/content';
59 url += '?content=backup';
60
61 me.store.setProxy({
62 type: 'pve',
63 url: url
64 });
65
66 reload();
67 };
68
69 var storagesel = Ext.create('PVE.form.StorageSelector', {
70 nodename: nodename,
71 fieldLabel: gettext('Storage'),
72 labelAlign: 'right',
73 storageContent: 'backup',
74 allowBlank: false,
75 listeners: {
76 change: function(f, value) {
77 setStorage(value);
78 }
79 }
80 });
81
82 var storagefilter = Ext.create('Ext.form.field.Text', {
83 fieldLabel: gettext('Search'),
84 labelWidth: 50,
85 labelAlign: 'right',
86 enableKeyEvents: true,
87 listeners: {
88 buffer: 500,
89 keyup: function(field) {
90 me.store.clearFilter(true);
91 me.store.filter([
92 filterFn,
93 {
94 property: 'volid',
95 value: field.getValue(),
96 anyMatch: true,
97 caseSensitive: false
98 }
99 ]);
100 }
101 }
102 });
103
104 var sm = Ext.create('Ext.selection.RowModel', {});
105
106 var backup_btn = Ext.create('Ext.button.Button', {
107 text: gettext('Backup now'),
108 handler: function() {
109 var win = Ext.create('PVE.window.Backup', {
110 nodename: nodename,
111 vmid: vmid,
112 vmtype: vmtype,
113 storage: storagesel.getValue()
114 });
115 win.show();
116 }
117 });
118
119 var restore_btn = Ext.create('PVE.button.Button', {
120 text: gettext('Restore'),
121 disabled: true,
122 selModel: sm,
123 enableFn: function(rec) {
124 return !!rec;
125 },
126 handler: function(b, e, rec) {
127 var volid = rec.data.volid;
128
129 var win = Ext.create('PVE.window.Restore', {
130 nodename: nodename,
131 vmid: vmid,
132 volid: rec.data.volid,
133 volidText: PVE.Utils.render_storage_content(rec.data.volid, {}, rec),
134 vmtype: vmtype
135 });
136 win.show();
137 win.on('destroy', reload);
138 }
139 });
140
141 var delete_btn = Ext.create('PVE.button.Button', {
142 text: gettext('Remove'),
143 disabled: true,
144 selModel: sm,
145 dangerous: true,
146 confirmMsg: function(rec) {
147 var msg = Ext.String.format(gettext('Are you sure you want to remove entry {0}'),
148 "'" + rec.data.volid + "'");
149 msg += " " + gettext('This will permanently erase all data.');
150
151 return msg;
152 },
153 enableFn: function(rec) {
154 return !!rec;
155 },
156 handler: function(b, e, rec){
157 var storage = storagesel.getValue();
158 if (!storage) {
159 return;
160 }
161
162 var volid = rec.data.volid;
163 PVE.Utils.API2Request({
164 url: "/nodes/" + nodename + "/storage/" + storage + "/content/" + volid,
165 method: 'DELETE',
166 waitMsgTarget: me,
167 failure: function(response, opts) {
168 Ext.Msg.alert('Error', response.htmlStatus);
169 },
170 success: function(response, options) {
171 reload();
172 }
173 });
174 }
175 });
176
177 var config_btn = Ext.create('PVE.button.Button', {
178 text: gettext('Show Configuration'),
179 disabled: true,
180 selModel: sm,
181 enableFn: function(rec) {
182 return !!rec;
183 },
184 handler: function(b, e, rec) {
185 var storage = storagesel.getValue();
186 if (!storage) {
187 return;
188 }
189
190 var win = Ext.create('Ext.window.Window', {
191 title: gettext('Configuration'),
192 width: 600,
193 height: 400,
194 layout: 'fit',
195 modal: true,
196 items: [{
197 itemId: 'configtext',
198 autoScroll: true,
199 style: {
200 'background-color': 'white',
201 'white-space': 'pre',
202 'font-family': 'monospace',
203 padding: '5px'
204 }
205 }]
206 });
207
208 PVE.Utils.API2Request({
209 url: "/nodes/" + nodename + "/vzdump/extractconfig",
210 method: 'GET',
211 params: {
212 volume: rec.data.volid
213 },
214 failure: function(response, opts) {
215 win.close();
216 Ext.Msg.alert('Error', response.htmlStatus);
217 },
218 success: function(response,options) {
219 win.show();
220 win.down('#configtext').update(Ext.htmlEncode(response.result.data));
221 }
222 });
223 }
224 });
225
226 Ext.apply(me, {
227 stateful: false,
228 selModel: sm,
229 tbar: [ backup_btn, restore_btn, delete_btn,config_btn, '->', storagesel, storagefilter ],
230 columns: [
231 {
232 header: gettext('Name'),
233 flex: 1,
234 sortable: true,
235 renderer: PVE.Utils.render_storage_content,
236 dataIndex: 'volid'
237 },
238 {
239 header: gettext('Format'),
240 width: 100,
241 dataIndex: 'format'
242 },
243 {
244 header: gettext('Size'),
245 width: 100,
246 renderer: PVE.Utils.format_size,
247 dataIndex: 'size'
248 }
249 ],
250 listeners: {
251 activate: reload
252 }
253 });
254
255 me.callParent();
256 }
257 });