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