]>
Commit | Line | Data |
---|---|---|
29615fe8 HL |
1 | Ext.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 | ||
24 | Ext.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 | }); |