]>
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) { | |
028d0a13 DC |
160 | view.getStore().rstore.getProxy().setExtraParams({ |
161 | store: view.datastore, | |
162 | }); | |
29615fe8 HL |
163 | Proxmox.Utils.monStoreErrors(view, view.getStore().rstore); |
164 | }, | |
165 | }, | |
166 | ||
167 | listeners: { | |
028d0a13 DC |
168 | activate: 'startStore', |
169 | deactivate: 'stopStore', | |
29615fe8 HL |
170 | itemdblclick: 'editVerifyJob', |
171 | }, | |
172 | ||
173 | store: { | |
174 | type: 'diff', | |
175 | autoDestroy: true, | |
176 | autoDestroyRstore: true, | |
177 | sorters: 'id', | |
178 | rstore: { | |
179 | type: 'update', | |
180 | storeid: 'pbs-verify-jobs-status', | |
181 | model: 'pbs-verify-jobs-status', | |
29615fe8 HL |
182 | interval: 5000, |
183 | }, | |
184 | }, | |
185 | ||
186 | tbar: [ | |
187 | { | |
188 | xtype: 'proxmoxButton', | |
189 | text: gettext('Add'), | |
190 | handler: 'addVerifyJob', | |
191 | selModel: false, | |
192 | }, | |
193 | { | |
194 | xtype: 'proxmoxButton', | |
195 | text: gettext('Edit'), | |
196 | handler: 'editVerifyJob', | |
197 | disabled: true, | |
198 | }, | |
199 | { | |
200 | xtype: 'proxmoxStdRemoveButton', | |
201 | baseurl: '/config/verify/', | |
6b7688aa | 202 | confirmMsg: gettext('Remove entry?'), |
29615fe8 HL |
203 | callback: 'reload', |
204 | }, | |
205 | '-', | |
206 | { | |
207 | xtype: 'proxmoxButton', | |
f26080fa | 208 | text: gettext('Show Log'), |
29615fe8 HL |
209 | handler: 'openTaskLog', |
210 | enableFn: (rec) => !!rec.data['last-run-upid'], | |
211 | disabled: true, | |
212 | }, | |
213 | { | |
214 | xtype: 'proxmoxButton', | |
215 | text: gettext('Run now'), | |
216 | handler: 'runVerifyJob', | |
217 | disabled: true, | |
218 | }, | |
219 | ], | |
220 | ||
221 | viewConfig: { | |
222 | trackOver: false, | |
223 | }, | |
224 | ||
225 | columns: [ | |
226 | { | |
f26080fa | 227 | header: gettext('Job ID'), |
29615fe8 | 228 | dataIndex: 'id', |
f26080fa | 229 | renderer: Ext.String.htmlEncode, |
aae4c30c TL |
230 | maxWidth: 220, |
231 | minWidth: 75, | |
232 | flex: 1, | |
f26080fa | 233 | sortable: true, |
29615fe8 | 234 | }, |
29615fe8 | 235 | { |
f26080fa TL |
236 | header: gettext('Skip Verified'), |
237 | dataIndex: 'ignore-verified', | |
238 | renderer: Proxmox.Utils.format_boolean, | |
aae4c30c | 239 | width: 100, |
29615fe8 | 240 | sortable: true, |
29615fe8 HL |
241 | }, |
242 | { | |
aae4c30c | 243 | header: gettext('Re-Verify After'), |
f26080fa TL |
244 | dataIndex: 'outdated-after', |
245 | renderer: v => v ? v +' '+ gettext('Days') : gettext('Never'), | |
aae4c30c | 246 | width: 125, |
29615fe8 | 247 | sortable: true, |
29615fe8 HL |
248 | }, |
249 | { | |
250 | header: gettext('Schedule'), | |
29615fe8 | 251 | dataIndex: 'schedule', |
f26080fa | 252 | sortable: true, |
aae4c30c TL |
253 | maxWidth: 220, |
254 | minWidth: 80, | |
255 | flex: 1, | |
29615fe8 HL |
256 | }, |
257 | { | |
258 | header: gettext('Last Verification'), | |
29615fe8 | 259 | dataIndex: 'last-run-endtime', |
f26080fa | 260 | renderer: 'render_optional_timestamp', |
aae4c30c | 261 | width: 150, |
f26080fa | 262 | sortable: true, |
29615fe8 HL |
263 | }, |
264 | { | |
265 | text: gettext('Duration'), | |
266 | dataIndex: 'duration', | |
29615fe8 | 267 | renderer: Proxmox.Utils.render_duration, |
aae4c30c TL |
268 | width: 80, |
269 | }, | |
270 | { | |
271 | header: gettext('Status'), | |
272 | dataIndex: 'last-run-state', | |
273 | renderer: 'render_verify_status', | |
274 | flex: 3, | |
29615fe8 HL |
275 | }, |
276 | { | |
277 | header: gettext('Next Run'), | |
29615fe8 | 278 | dataIndex: 'next-run', |
f26080fa | 279 | renderer: 'render_next_run', |
aae4c30c | 280 | width: 150, |
f26080fa | 281 | sortable: true, |
29615fe8 HL |
282 | }, |
283 | { | |
284 | header: gettext('Comment'), | |
29615fe8 | 285 | dataIndex: 'comment', |
f26080fa | 286 | renderer: Ext.String.htmlEncode, |
aae4c30c | 287 | flex: 2, |
f26080fa | 288 | sortable: true, |
29615fe8 HL |
289 | }, |
290 | ], | |
291 | }); |