]>
Commit | Line | Data |
---|---|---|
8b349e01 TL |
1 | Ext.define('PMG.PBSConfig', { |
2 | extend: 'Ext.panel.Panel', | |
3 | xtype: 'pmgPBSConfig', | |
4 | ||
5 | controller: { | |
6 | xclass: 'Ext.app.ViewController', | |
7 | ||
8 | callRestore: function(grid, record) { | |
9 | let remote = this.getViewModel().get('remote'); | |
10 | Ext.create('PMG.RestoreWindow', { | |
11 | remote: remote, | |
12 | backup_id: record.data['backup-id'], | |
13 | backup_time: record.data['backup-time'], | |
14 | }).show(); | |
15 | }, | |
16 | ||
17 | restoreSnapshot: function(button) { | |
18 | let me = this; | |
d2b8eac4 | 19 | let view = me.lookup('snapshotsGrid'); |
8b349e01 TL |
20 | let record = view.getSelection()[0]; |
21 | me.callRestore(view, record); | |
22 | }, | |
23 | ||
24 | runBackup: function(button) { | |
25 | let me = this; | |
d2b8eac4 | 26 | let view = me.lookup('snapshotsGrid'); |
8b349e01 TL |
27 | let remote = me.getViewModel().get('remote'); |
28 | Proxmox.Utils.API2Request({ | |
29 | url: `/nodes/${Proxmox.NodeName}/pbs/${remote}/snapshot`, | |
30 | method: 'POST', | |
31 | waitMsgTarget: view, | |
32 | failure: function(response, opts) { | |
33 | Ext.Msg.alert(gettext('Error'), response.htmlStatus); | |
34 | }, | |
35 | success: function(response, opts) { | |
36 | let upid = response.result.data; | |
37 | ||
38 | let win = Ext.create('Proxmox.window.TaskViewer', { | |
39 | upid: upid, | |
40 | }); | |
41 | win.show(); | |
42 | me.mon(win, 'close', function() { view.getStore().load(); }); | |
43 | }, | |
44 | }); | |
45 | }, | |
46 | ||
47 | reload: function(grid) { | |
48 | let me = this; | |
49 | let selection = grid.getSelection(); | |
50 | me.showInfo(grid, selection); | |
51 | }, | |
52 | ||
53 | showInfo: function(grid, selected) { | |
54 | let me = this; | |
55 | let viewModel = me.getViewModel(); | |
56 | if (selected[0]) { | |
57 | let remote = selected[0].data.remote; | |
58 | viewModel.set('selected', true); | |
59 | viewModel.set('remote', remote); | |
60 | ||
61 | // set grid stores and load them | |
d2b8eac4 | 62 | let remstore = me.lookup('snapshotsGrid').getStore(); |
6ff66068 TL |
63 | remstore |
64 | .getProxy() | |
65 | .setUrl(`/api2/json/nodes/${Proxmox.NodeName}/pbs/${remote}/snapshot`); | |
8b349e01 | 66 | remstore.load(); |
d2b8eac4 TL |
67 | |
68 | let scheduleStore = me.lookup('schedulegrid').rstore; | |
69 | scheduleStore | |
70 | .getProxy() | |
71 | .setUrl(`/api2/json/nodes/${Proxmox.NodeName}/pbs/${remote}/timer`); | |
72 | scheduleStore.load(); | |
8b349e01 TL |
73 | } else { |
74 | viewModel.set('selected', false); | |
75 | } | |
76 | }, | |
77 | reloadSnapshots: function() { | |
78 | let me = this; | |
79 | let grid = me.lookup('grid'); | |
80 | let selection = grid.getSelection(); | |
81 | me.showInfo(grid, selection); | |
82 | }, | |
83 | init: function(view) { | |
84 | let me = this; | |
85 | me.lookup('grid').relayEvents(view, ['activate']); | |
8b349e01 | 86 | |
d2b8eac4 TL |
87 | let remoteGrid = me.lookup('grid'); |
88 | view.mon(remoteGrid.store, 'load', function(store, r, success, o) { | |
89 | if (success) { | |
90 | remoteGrid.getSelectionModel().select(0); | |
91 | } | |
92 | }); | |
93 | ||
94 | let snapshotGrid = me.lookup('snapshotsGrid'); | |
95 | let schedulegrid = me.lookup('schedulegrid'); | |
96 | ||
97 | Proxmox.Utils.monStoreErrors(snapshotGrid, snapshotGrid.getStore(), true); | |
98 | Proxmox.Utils.monStoreErrors(schedulegrid, schedulegrid.getStore(), true); | |
8b349e01 TL |
99 | }, |
100 | ||
101 | control: { | |
102 | 'grid[reference=grid]': { | |
103 | selectionchange: 'showInfo', | |
104 | load: 'reload', | |
105 | }, | |
d2b8eac4 | 106 | 'grid[reference=snapshotsGrid]': { |
8b349e01 TL |
107 | itemdblclick: 'restoreSnapshot', |
108 | }, | |
109 | }, | |
110 | }, | |
111 | ||
112 | viewModel: { | |
113 | data: { | |
114 | remote: '', | |
115 | selected: false, | |
116 | }, | |
117 | }, | |
118 | ||
119 | layout: 'border', | |
120 | ||
121 | items: [ | |
122 | { | |
8b349e01 | 123 | xtype: 'pmgPBSConfigGrid', |
d2b8eac4 TL |
124 | reference: 'grid', |
125 | title: gettext('Remote'), | |
126 | hidden: false, | |
127 | region: 'center', | |
128 | minHeight: 130, | |
8b349e01 TL |
129 | border: false, |
130 | }, | |
131 | { | |
d2b8eac4 | 132 | xtype: 'proxmoxObjectGrid', |
8b349e01 | 133 | region: 'south', |
d2b8eac4 TL |
134 | reference: 'schedulegrid', |
135 | title: gettext('Schedule'), | |
136 | height: 155, | |
137 | border: false, | |
8b349e01 | 138 | hidden: true, |
d2b8eac4 TL |
139 | emptyText: gettext('No schedule setup.'), |
140 | tbar: [ | |
141 | { | |
142 | text: gettext('Set Schedule'), | |
143 | handler: function() { | |
144 | let me = this; | |
145 | let remote = me.lookupViewModel().get('remote'); | |
146 | let win = Ext.createWidget('pmgPBSScheduleEdit', { | |
147 | remote: remote, | |
148 | autoShow: true, | |
149 | }); | |
150 | win.on('destroy', () => me.up('grid').rstore.load()); | |
151 | }, | |
152 | }, | |
153 | { | |
154 | xtype: 'proxmoxStdRemoveButton', | |
155 | baseurl: `/nodes/${Proxmox.NodeName}/pbs/`, | |
156 | callback: function() { | |
157 | this.up('grid').rstore.load(); | |
158 | }, | |
159 | text: gettext('Remove Schedule'), | |
160 | selModel: false, | |
161 | confirmMsg: function(_rec) { | |
162 | let me = this; | |
163 | let remote = me.lookupViewModel().get('remote'); | |
164 | return Ext.String.format( | |
165 | gettext('Are you sure you want to remove the schedule for {0}'), | |
166 | `'${remote}'`, | |
167 | ); | |
168 | }, | |
169 | getUrl: function(_rec) { | |
170 | let remote = this.lookupViewModel().get('remote'); | |
171 | return `${this.baseurl}/${remote}/timer`; | |
172 | }, | |
173 | }, | |
174 | '->', | |
175 | { | |
176 | text: gettext('Reload'), | |
177 | iconCls: 'fa fa-refresh', | |
178 | handler: function() { | |
179 | this.up('grid').rstore.load(); | |
180 | }, | |
181 | }, | |
182 | ], | |
183 | bind: { | |
184 | title: Ext.String.format(gettext("Schedule on '{0}'"), '{remote}'), | |
185 | hidden: '{!selected}', | |
186 | }, | |
187 | url: '/', // hack, obj. grid is a bit dumb.. | |
188 | rows: { | |
189 | schedule: { | |
190 | text: gettext('Schedule'), | |
191 | required: true, | |
192 | defaultValue: gettext('None'), | |
193 | }, | |
194 | delay: { | |
195 | text: gettext('Delay'), | |
196 | }, | |
197 | 'next-run': { | |
198 | text: gettext('Next Run'), | |
199 | }, | |
200 | }, | |
201 | }, | |
202 | { | |
203 | xtype: 'grid', | |
204 | region: 'south', | |
205 | reference: 'snapshotsGrid', | |
206 | height: '50%', | |
8b349e01 TL |
207 | border: false, |
208 | split: true, | |
d2b8eac4 | 209 | hidden: true, |
8b349e01 TL |
210 | emptyText: gettext('No backups on remote'), |
211 | tbar: [ | |
212 | { | |
22988ae4 | 213 | text: gettext('Backup Now'), |
8b349e01 | 214 | handler: 'runBackup', |
8b349e01 | 215 | }, |
22988ae4 | 216 | '-', |
8b349e01 TL |
217 | { |
218 | xtype: 'proxmoxButton', | |
219 | text: gettext('Restore'), | |
220 | handler: 'restoreSnapshot', | |
221 | disabled: true, | |
222 | }, | |
223 | { | |
224 | xtype: 'proxmoxStdRemoveButton', | |
225 | text: gettext('Forget Snapshot'), | |
226 | disabled: true, | |
227 | getUrl: function(rec) { | |
228 | let me = this; | |
229 | let remote = me.lookupViewModel().get('remote'); | |
230 | let snapshot = `${rec.data['backup-id']}/${rec.data['backup-time']}`; | |
231 | return `/nodes/${Proxmox.NodeName}/pbs/${remote}/snapshot/${snapshot}`; | |
232 | }, | |
233 | confirmMsg: function(rec) { | |
234 | let me = this; | |
235 | let snapshot = `${rec.data['backup-id']}/${rec.data['backup-time']}`; | |
236 | return Ext.String.format( | |
237 | gettext('Are you sure you want to forget snapshot {0}'), | |
238 | `'${snapshot}'`, | |
239 | ); | |
240 | }, | |
241 | callback: 'reloadSnapshots', | |
242 | }, | |
d2b8eac4 TL |
243 | '->', |
244 | { | |
245 | text: gettext('Reload'), | |
246 | iconCls: 'fa fa-refresh', | |
247 | handler: function() { | |
248 | this.up('grid').store.load(); | |
249 | }, | |
250 | }, | |
8b349e01 TL |
251 | ], |
252 | store: { | |
6ff66068 | 253 | fields: ['backup-id', 'backup-time', 'size', 'ctime', 'encrypted'], |
8b349e01 TL |
254 | proxy: { type: 'proxmox' }, |
255 | sorters: [ | |
256 | { | |
6ff66068 | 257 | property: 'backup-time', |
8b349e01 TL |
258 | direction: 'DESC', |
259 | }, | |
260 | ], | |
261 | }, | |
262 | bind: { | |
6ff66068 TL |
263 | title: Ext.String.format( |
264 | gettext("Backup snapshots on '{0}'"), | |
265 | '{remote}', | |
266 | ), | |
d2b8eac4 | 267 | hidden: '{!selected}', |
8b349e01 TL |
268 | }, |
269 | columns: [ | |
270 | { | |
271 | text: 'Group ID', | |
272 | dataIndex: 'backup-id', | |
273 | flex: 1, | |
274 | }, | |
275 | { | |
276 | text: 'Time', | |
277 | dataIndex: 'backup-time', | |
278 | width: 180, | |
279 | }, | |
280 | { | |
281 | text: 'Size', | |
282 | dataIndex: 'size', | |
283 | renderer: Proxmox.Utils.format_size, | |
284 | flex: 1, | |
285 | }, | |
286 | { | |
287 | text: 'Encrypted', | |
288 | dataIndex: 'encrypted', | |
289 | hidden: true, // FIXME: actually return from API | |
290 | renderer: Proxmox.Utils.format_boolean, | |
291 | flex: 1, | |
292 | }, | |
293 | ], | |
294 | }, | |
295 | ], | |
296 | ||
297 | }); |