]> git.proxmox.com Git - pmg-gui.git/blame - js/PBSSnapshotView.js
backup: rename manual backup button to "Backup Now"
[pmg-gui.git] / js / PBSSnapshotView.js
CommitLineData
8b349e01
TL
1Ext.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});