]>
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, | |
29 | stateId: 'grid-verify-jobs', | |
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/', | |
202 | callback: 'reload', | |
203 | }, | |
204 | '-', | |
205 | { | |
206 | xtype: 'proxmoxButton', | |
207 | text: gettext('Log'), | |
208 | handler: 'openTaskLog', | |
209 | enableFn: (rec) => !!rec.data['last-run-upid'], | |
210 | disabled: true, | |
211 | }, | |
212 | { | |
213 | xtype: 'proxmoxButton', | |
214 | text: gettext('Run now'), | |
215 | handler: 'runVerifyJob', | |
216 | disabled: true, | |
217 | }, | |
218 | ], | |
219 | ||
220 | viewConfig: { | |
221 | trackOver: false, | |
222 | }, | |
223 | ||
224 | columns: [ | |
225 | { | |
226 | header: gettext('Verify Job'), | |
227 | width: 100, | |
228 | sortable: true, | |
229 | renderer: Ext.String.htmlEncode, | |
230 | dataIndex: 'id', | |
231 | }, | |
29615fe8 HL |
232 | { |
233 | header: gettext('Days valid'), | |
234 | width: 125, | |
235 | sortable: true, | |
236 | dataIndex: 'outdated-after', | |
237 | }, | |
238 | { | |
239 | header: gettext('Ignore verified'), | |
240 | width: 125, | |
241 | sortable: true, | |
242 | renderer: Proxmox.Utils.format_boolean, | |
243 | dataIndex: 'ignore-verified', | |
244 | }, | |
245 | { | |
246 | header: gettext('Schedule'), | |
247 | sortable: true, | |
248 | dataIndex: 'schedule', | |
249 | }, | |
250 | { | |
251 | header: gettext('Status'), | |
252 | dataIndex: 'last-run-state', | |
253 | flex: 1, | |
254 | renderer: 'render_verify_status', | |
255 | }, | |
256 | { | |
257 | header: gettext('Last Verification'), | |
258 | sortable: true, | |
259 | minWidth: 200, | |
260 | renderer: 'render_optional_timestamp', | |
261 | dataIndex: 'last-run-endtime', | |
262 | }, | |
263 | { | |
264 | text: gettext('Duration'), | |
265 | dataIndex: 'duration', | |
266 | width: 60, | |
267 | renderer: Proxmox.Utils.render_duration, | |
268 | }, | |
269 | { | |
270 | header: gettext('Next Run'), | |
271 | sortable: true, | |
272 | minWidth: 200, | |
273 | renderer: 'render_next_run', | |
274 | dataIndex: 'next-run', | |
275 | }, | |
276 | { | |
277 | header: gettext('Comment'), | |
278 | hidden: true, | |
279 | sortable: true, | |
280 | renderer: Ext.String.htmlEncode, | |
281 | dataIndex: 'comment', | |
282 | }, | |
283 | ], | |
284 | }); |