]> git.proxmox.com Git - proxmox-backup.git/blame - www/config/VerifyView.js
ui: make Sync/VerifyView and Edit usable without datastore
[proxmox-backup.git] / www / config / VerifyView.js
CommitLineData
29615fe8
HL
1Ext.define('pbs-verify-jobs-status', {
2 extend: 'Ext.data.Model',
3 fields: [
4 'id', 'store', 'outdated-after', 'ignore-verified', 'schedule',
5 'next-run', 'last-run-upid', 'last-run-state', 'last-run-endtime',
6 {
7 name: 'duration',
8 calculate: function(data) {
9 let endtime = data['last-run-endtime'];
10 if (!endtime) return undefined;
11 let task = Proxmox.Utils.parse_task_upid(data['last-run-upid']);
12 return endtime - task.starttime;
13 },
14 },
028d0a13 15 'comment',
29615fe8
HL
16 ],
17 idProperty: 'id',
18 proxy: {
19 type: 'proxmox',
20 url: '/api2/json/admin/verify',
21 },
22});
23
24Ext.define('PBS.config.VerifyJobView', {
25 extend: 'Ext.grid.GridPanel',
26 alias: 'widget.pbsVerifyJobView',
27
28 stateful: true,
0ccdd1b6 29 stateId: 'grid-verify-jobs-v1',
29615fe8
HL
30
31 title: gettext('Verify Jobs'),
32
33 controller: {
34 xclass: 'Ext.app.ViewController',
35
36 addVerifyJob: function() {
37 let me = this;
028d0a13 38 let view = me.getView();
29615fe8 39 Ext.create('PBS.window.VerifyJobEdit', {
028d0a13 40 datastore: view.datastore,
29615fe8
HL
41 listeners: {
42 destroy: function() {
43 me.reload();
44 },
45 },
46 }).show();
47 },
48
49 editVerifyJob: function() {
50 let me = this;
51 let view = me.getView();
52 let selection = view.getSelection();
53 if (selection.length < 1) return;
54
55 Ext.create('PBS.window.VerifyJobEdit', {
028d0a13 56 datastore: view.datastore,
29615fe8
HL
57 id: selection[0].data.id,
58 listeners: {
59 destroy: function() {
60 me.reload();
61 },
62 },
63 }).show();
64 },
65
66 openTaskLog: function() {
67 let me = this;
68 let view = me.getView();
69 let selection = view.getSelection();
70 if (selection.length < 1) return;
71
72 let upid = selection[0].data['last-run-upid'];
73 if (!upid) return;
74
75 Ext.create('Proxmox.window.TaskViewer', {
12bcbf07 76 upid,
29615fe8
HL
77 }).show();
78 },
79
80 runVerifyJob: function() {
81 let me = this;
82 let view = me.getView();
83 let selection = view.getSelection();
84 if (selection.length < 1) return;
85
86 let id = selection[0].data.id;
87 Proxmox.Utils.API2Request({
88 method: 'POST',
89 url: `/admin/verify/${id}/run`,
90 success: function(response, opt) {
91 Ext.create('Proxmox.window.TaskViewer', {
92 upid: response.result.data,
93 taskDone: function(success) {
94 me.reload();
95 },
96 }).show();
97 },
98 failure: function(response, opt) {
99 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
100 },
101 });
102 },
103
104 render_verify_status: function(value, metadata, record) {
105 if (!record.data['last-run-upid']) {
106 return '-';
107 }
108
109 if (!record.data['last-run-endtime']) {
110 metadata.tdCls = 'x-grid-row-loading';
111 return '';
112 }
113
114 let parsed = Proxmox.Utils.parse_task_status(value);
115 let text = value;
116 let icon = '';
117 switch (parsed) {
118 case 'unknown':
119 icon = 'question faded';
120 text = Proxmox.Utils.unknownText;
121 break;
122 case 'error':
123 icon = 'times critical';
124 text = Proxmox.Utils.errorText + ': ' + value;
125 break;
126 case 'warning':
127 icon = 'exclamation warning';
128 break;
129 case 'ok':
130 icon = 'check good';
131 text = gettext("OK");
132 }
133
134 return `<i class="fa fa-${icon}"></i> ${text}`;
135 },
136
137 render_next_run: function(value, metadat, record) {
138 if (!value) return '-';
139
140 let now = new Date();
141 let next = new Date(value*1000);
142
143 if (next < now) {
144 return gettext('pending');
145 }
146 return Proxmox.Utils.render_timestamp(value);
147 },
148
149 render_optional_timestamp: function(value, metadata, record) {
150 if (!value) return '-';
151 return Proxmox.Utils.render_timestamp(value);
152 },
153
028d0a13
DC
154 startStore: function() { this.getView().getStore().rstore.startUpdate(); },
155 stopStore: function() { this.getView().getStore().rstore.stopUpdate(); },
156
29615fe8
HL
157 reload: function() { this.getView().getStore().rstore.load(); },
158
159 init: function(view) {
ab81bb13
DC
160 let params = {};
161 if (view.datastore !== undefined) {
162 params.store = view.datastore;
163 }
164 view.getStore().rstore.getProxy().setExtraParams(params);
29615fe8
HL
165 Proxmox.Utils.monStoreErrors(view, view.getStore().rstore);
166 },
167 },
168
169 listeners: {
028d0a13
DC
170 activate: 'startStore',
171 deactivate: 'stopStore',
29615fe8
HL
172 itemdblclick: 'editVerifyJob',
173 },
174
175 store: {
176 type: 'diff',
177 autoDestroy: true,
178 autoDestroyRstore: true,
179 sorters: 'id',
180 rstore: {
181 type: 'update',
182 storeid: 'pbs-verify-jobs-status',
183 model: 'pbs-verify-jobs-status',
29615fe8
HL
184 interval: 5000,
185 },
186 },
187
188 tbar: [
189 {
190 xtype: 'proxmoxButton',
191 text: gettext('Add'),
192 handler: 'addVerifyJob',
193 selModel: false,
194 },
195 {
196 xtype: 'proxmoxButton',
197 text: gettext('Edit'),
198 handler: 'editVerifyJob',
199 disabled: true,
200 },
201 {
202 xtype: 'proxmoxStdRemoveButton',
203 baseurl: '/config/verify/',
6b7688aa 204 confirmMsg: gettext('Remove entry?'),
29615fe8
HL
205 callback: 'reload',
206 },
207 '-',
208 {
209 xtype: 'proxmoxButton',
f26080fa 210 text: gettext('Show Log'),
29615fe8
HL
211 handler: 'openTaskLog',
212 enableFn: (rec) => !!rec.data['last-run-upid'],
213 disabled: true,
214 },
215 {
216 xtype: 'proxmoxButton',
217 text: gettext('Run now'),
218 handler: 'runVerifyJob',
219 disabled: true,
220 },
221 ],
222
223 viewConfig: {
224 trackOver: false,
225 },
226
227 columns: [
228 {
f26080fa 229 header: gettext('Job ID'),
29615fe8 230 dataIndex: 'id',
f26080fa 231 renderer: Ext.String.htmlEncode,
aae4c30c
TL
232 maxWidth: 220,
233 minWidth: 75,
234 flex: 1,
f26080fa 235 sortable: true,
29615fe8 236 },
29615fe8 237 {
f26080fa
TL
238 header: gettext('Skip Verified'),
239 dataIndex: 'ignore-verified',
240 renderer: Proxmox.Utils.format_boolean,
aae4c30c 241 width: 100,
29615fe8 242 sortable: true,
29615fe8
HL
243 },
244 {
aae4c30c 245 header: gettext('Re-Verify After'),
f26080fa
TL
246 dataIndex: 'outdated-after',
247 renderer: v => v ? v +' '+ gettext('Days') : gettext('Never'),
aae4c30c 248 width: 125,
29615fe8 249 sortable: true,
29615fe8
HL
250 },
251 {
252 header: gettext('Schedule'),
29615fe8 253 dataIndex: 'schedule',
f26080fa 254 sortable: true,
aae4c30c
TL
255 maxWidth: 220,
256 minWidth: 80,
257 flex: 1,
29615fe8
HL
258 },
259 {
260 header: gettext('Last Verification'),
29615fe8 261 dataIndex: 'last-run-endtime',
f26080fa 262 renderer: 'render_optional_timestamp',
aae4c30c 263 width: 150,
f26080fa 264 sortable: true,
29615fe8
HL
265 },
266 {
267 text: gettext('Duration'),
268 dataIndex: 'duration',
29615fe8 269 renderer: Proxmox.Utils.render_duration,
aae4c30c
TL
270 width: 80,
271 },
272 {
273 header: gettext('Status'),
274 dataIndex: 'last-run-state',
275 renderer: 'render_verify_status',
276 flex: 3,
29615fe8
HL
277 },
278 {
279 header: gettext('Next Run'),
29615fe8 280 dataIndex: 'next-run',
f26080fa 281 renderer: 'render_next_run',
aae4c30c 282 width: 150,
f26080fa 283 sortable: true,
29615fe8
HL
284 },
285 {
286 header: gettext('Comment'),
29615fe8 287 dataIndex: 'comment',
f26080fa 288 renderer: Ext.String.htmlEncode,
aae4c30c 289 flex: 2,
f26080fa 290 sortable: true,
29615fe8
HL
291 },
292 ],
293});