]>
Commit | Line | Data |
---|---|---|
86e432b0 DC |
1 | Ext.define('pbs-sync-jobs-status', { |
2 | extend: 'Ext.data.Model', | |
3 | fields: [ | |
4 | 'id', 'remote', 'remote-store', 'store', '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 | }, | |
15 | ], | |
16 | idProperty: 'id', | |
17 | proxy: { | |
18 | type: 'proxmox', | |
19 | url: '/api2/json/admin/sync', | |
20 | }, | |
21 | }); | |
22 | ||
23 | Ext.define('PBS.config.SyncJobView', { | |
24 | extend: 'Ext.grid.GridPanel', | |
25 | alias: 'widget.pbsSyncJobView', | |
26 | ||
27 | stateful: true, | |
28 | stateId: 'grid-sync-jobs', | |
29 | ||
30 | title: gettext('Sync Jobs'), | |
31 | ||
32 | controller: { | |
33 | xclass: 'Ext.app.ViewController', | |
34 | ||
35 | addSyncJob: function() { | |
36 | let me = this; | |
37 | Ext.create('PBS.window.SyncJobEdit', { | |
38 | listeners: { | |
39 | destroy: function() { | |
40 | me.reload(); | |
41 | }, | |
42 | }, | |
43 | }).show(); | |
44 | }, | |
45 | ||
46 | editSyncJob: function() { | |
47 | let me = this; | |
48 | let view = me.getView(); | |
49 | let selection = view.getSelection(); | |
50 | if (selection.length < 1) return; | |
51 | ||
52 | Ext.create('PBS.window.SyncJobEdit', { | |
53 | id: selection[0].data.id, | |
54 | listeners: { | |
55 | destroy: function() { | |
56 | me.reload(); | |
57 | }, | |
58 | }, | |
59 | }).show(); | |
60 | }, | |
61 | ||
62 | openTaskLog: function() { | |
63 | let me = this; | |
64 | let view = me.getView(); | |
65 | let selection = view.getSelection(); | |
66 | if (selection.length < 1) return; | |
67 | ||
68 | let upid = selection[0].data['last-run-upid']; | |
69 | if (!upid) return; | |
70 | ||
71 | Ext.create('Proxmox.window.TaskViewer', { | |
72 | upid | |
73 | }).show(); | |
74 | }, | |
75 | ||
76 | runSyncJob: function() { | |
77 | let me = this; | |
78 | let view = me.getView(); | |
79 | let selection = view.getSelection(); | |
80 | if (selection.length < 1) return; | |
81 | ||
82 | let id = selection[0].data.id; | |
83 | Proxmox.Utils.API2Request({ | |
84 | method: 'POST', | |
85 | url: `/admin/sync/${id}/run`, | |
86 | success: function(response, opt) { | |
87 | Ext.create('Proxmox.window.TaskViewer', { | |
88 | upid: response.result.data, | |
89 | taskDone: function(success) { | |
90 | me.reload(); | |
91 | }, | |
92 | }).show(); | |
93 | }, | |
94 | failure: function(response, opt) { | |
95 | Ext.Msg.alert(gettext('Error'), response.htmlStatus); | |
96 | }, | |
97 | }); | |
98 | }, | |
99 | ||
100 | render_sync_status: function(value, metadata, record) { | |
101 | if (!record.data['last-run-upid']) { | |
102 | return '-'; | |
103 | } | |
104 | ||
105 | if (!record.data['last-run-endtime']) { | |
106 | metadata.tdCls = 'x-grid-row-loading'; | |
107 | return ''; | |
108 | } | |
109 | ||
c9160231 DC |
110 | let parsed = Proxmox.Utils.parse_task_status(value); |
111 | let text = value; | |
112 | let icon = ''; | |
113 | switch (parsed) { | |
114 | case 'unknown': | |
115 | icon = 'question faded'; | |
116 | text = Proxmox.Utils.unknownText; | |
117 | break; | |
118 | case 'error': | |
119 | icon = 'times critical'; | |
120 | text = Proxmox.Utils.errorText + ': ' + value; | |
121 | break; | |
122 | case 'warning': | |
123 | icon = 'exclamation warning'; | |
124 | break; | |
125 | case 'ok': | |
126 | icon = 'check good'; | |
127 | text = gettext("OK"); | |
86e432b0 DC |
128 | } |
129 | ||
c9160231 | 130 | return `<i class="fa fa-${icon}"></i> ${text}`; |
86e432b0 DC |
131 | }, |
132 | ||
8d785899 DC |
133 | render_next_run: function(value, metadat, record) { |
134 | if (!value) return '-'; | |
135 | ||
136 | let now = new Date(); | |
137 | let next = new Date(value*1000); | |
138 | ||
139 | if (next < now) { | |
140 | return gettext('pending'); | |
141 | } | |
142 | return Proxmox.Utils.render_timestamp(value); | |
143 | }, | |
144 | ||
145 | render_optional_timestamp: function(value, metadata, record) { | |
86e432b0 DC |
146 | if (!value) return '-'; |
147 | return Proxmox.Utils.render_timestamp(value); | |
148 | }, | |
149 | ||
150 | reload: function() { this.getView().getStore().rstore.load(); }, | |
151 | ||
152 | init: function(view) { | |
153 | Proxmox.Utils.monStoreErrors(view, view.getStore().rstore); | |
154 | }, | |
155 | }, | |
156 | ||
157 | listeners: { | |
158 | activate: 'reload', | |
159 | itemdblclick: 'editSyncJob', | |
160 | }, | |
161 | ||
162 | store: { | |
163 | type: 'diff', | |
164 | autoDestroy: true, | |
165 | autoDestroyRstore: true, | |
166 | sorters: 'id', | |
167 | rstore: { | |
168 | type: 'update', | |
169 | storeid: 'pbs-sync-jobs-status', | |
170 | model: 'pbs-sync-jobs-status', | |
171 | autoStart: true, | |
172 | interval: 5000, | |
173 | }, | |
174 | }, | |
175 | ||
176 | tbar: [ | |
177 | { | |
178 | xtype: 'proxmoxButton', | |
179 | text: gettext('Add'), | |
180 | handler: 'addSyncJob', | |
181 | selModel: false, | |
182 | }, | |
183 | { | |
184 | xtype: 'proxmoxButton', | |
185 | text: gettext('Edit'), | |
186 | handler: 'editSyncJob', | |
187 | disabled: true, | |
188 | }, | |
189 | { | |
190 | xtype: 'proxmoxStdRemoveButton', | |
191 | baseurl: '/config/sync/', | |
192 | callback: 'reload', | |
193 | }, | |
194 | '-', | |
195 | { | |
196 | xtype: 'proxmoxButton', | |
197 | text: gettext('Log'), | |
198 | handler: 'openTaskLog', | |
199 | enableFn: (rec) => !!rec.data['last-run-upid'], | |
200 | disabled: true, | |
201 | }, | |
202 | { | |
203 | xtype: 'proxmoxButton', | |
204 | text: gettext('Run now'), | |
205 | handler: 'runSyncJob', | |
206 | disabled: true, | |
207 | }, | |
208 | ], | |
209 | ||
210 | viewConfig: { | |
211 | trackOver: false, | |
212 | }, | |
213 | ||
214 | columns: [ | |
215 | { | |
216 | header: gettext('Sync Job'), | |
217 | width: 200, | |
218 | sortable: true, | |
219 | renderer: Ext.String.htmlEncode, | |
220 | dataIndex: 'id', | |
221 | }, | |
222 | { | |
223 | header: gettext('Remote'), | |
224 | width: 200, | |
225 | sortable: true, | |
226 | dataIndex: 'remote', | |
227 | }, | |
228 | { | |
229 | header: gettext('Remote Store'), | |
230 | width: 200, | |
231 | sortable: true, | |
232 | dataIndex: 'remote-store', | |
233 | }, | |
234 | { | |
235 | header: gettext('Local Store'), | |
236 | width: 200, | |
237 | sortable: true, | |
238 | dataIndex: 'store', | |
239 | }, | |
240 | { | |
241 | header: gettext('Schedule'), | |
242 | sortable: true, | |
243 | dataIndex: 'schedule', | |
244 | }, | |
245 | { | |
246 | header: gettext('Status'), | |
247 | dataIndex: 'last-run-state', | |
248 | flex: 1, | |
249 | renderer: 'render_sync_status', | |
250 | }, | |
251 | { | |
252 | header: gettext('Last Sync'), | |
253 | sortable: true, | |
254 | minWidth: 200, | |
255 | renderer: 'render_optional_timestamp', | |
256 | dataIndex: 'last-run-endtime', | |
257 | }, | |
258 | { | |
259 | text: gettext('Duration'), | |
260 | dataIndex: 'duration', | |
261 | width: 60, | |
262 | renderer: Proxmox.Utils.render_duration, | |
263 | }, | |
264 | { | |
265 | header: gettext('Next Run'), | |
266 | sortable: true, | |
267 | minWidth: 200, | |
8d785899 | 268 | renderer: 'render_next_run', |
86e432b0 DC |
269 | dataIndex: 'next-run', |
270 | }, | |
271 | { | |
272 | header: gettext('Comment'), | |
273 | hidden: true, | |
274 | sortable: true, | |
275 | renderer: Ext.String.htmlEncode, | |
276 | dataIndex: 'comment', | |
277 | }, | |
278 | ], | |
279 | }); |