]> git.proxmox.com Git - proxmox-widget-toolkit.git/blame - src/window/TaskViewer.js
window: task viewer: code refactoring
[proxmox-widget-toolkit.git] / src / window / TaskViewer.js
CommitLineData
06694509
DM
1Ext.define('Proxmox.window.TaskProgress', {
2 extend: 'Ext.window.Window',
3 alias: 'widget.proxmoxTaskProgress',
4
fde8e8bb
TL
5 taskDone: Ext.emptyFn,
6
5dc3b0fa
TL
7 width: 300,
8 layout: 'auto',
9 modal: true,
10 bodyPadding: 5,
11
06694509 12 initComponent: function() {
05a977a2 13 let me = this;
06694509
DM
14
15 if (!me.upid) {
16 throw "no task specified";
17 }
18
05a977a2 19 let task = Proxmox.Utils.parse_task_upid(me.upid);
06694509 20
05a977a2 21 let statstore = Ext.create('Proxmox.data.ObjectStore', {
5dc3b0fa 22 url: `/api2/json/nodes/${task.node}/tasks/${encodeURIComponent(me.upid)}/status`,
06694509
DM
23 interval: 1000,
24 rows: {
25 status: { defaultValue: 'unknown' },
01031528
TL
26 exitstatus: { defaultValue: 'unknown' },
27 },
06694509
DM
28 });
29
13fc756d 30 me.on('destroy', statstore.stopUpdate);
06694509 31
05a977a2
TL
32 let getObjectValue = function(key, defaultValue) {
33 let rec = statstore.getById(key);
06694509
DM
34 if (rec) {
35 return rec.data.value;
36 }
37 return defaultValue;
38 };
39
05a977a2 40 let pbar = Ext.create('Ext.ProgressBar', { text: 'running...' });
06694509
DM
41
42 me.mon(statstore, 'load', function() {
05a977a2 43 let status = getObjectValue('status');
06694509 44 if (status === 'stopped') {
05a977a2
TL
45 let exitstatus = getObjectValue('exitstatus');
46 if (exitstatus === 'OK') {
06694509
DM
47 pbar.reset();
48 pbar.updateText("Done!");
49 Ext.Function.defer(me.close, 1000, me);
50 } else {
51 me.close();
52 Ext.Msg.alert('Task failed', exitstatus);
53 }
05a977a2 54 me.taskDone(exitstatus === 'OK');
06694509
DM
55 }
56 });
57
05a977a2 58 let descr = Proxmox.Utils.format_task_description(task.type, task.id);
06694509
DM
59
60 Ext.apply(me, {
d7139140 61 title: gettext('Task') + ': ' + descr,
06694509
DM
62 items: pbar,
63 buttons: [
13fc756d 64 {
06694509 65 text: gettext('Details'),
13fc756d 66 handler: function() {
5dc3b0fa
TL
67 Ext.create('Proxmox.window.TaskViewer', {
68 autoShow: true,
fde8e8bb 69 taskDone: me.taskDone,
01031528 70 upid: me.upid,
06694509 71 });
06694509 72 me.close();
01031528
TL
73 },
74 },
75 ],
06694509
DM
76 });
77
78 me.callParent();
79
80 statstore.startUpdate();
81
82 pbar.wait();
01031528 83 },
06694509
DM
84});
85
86// fixme: how can we avoid those lint errors?
06694509
DM
87
88Ext.define('Proxmox.window.TaskViewer', {
89 extend: 'Ext.window.Window',
90 alias: 'widget.proxmoxTaskViewer',
91
641df09e
TL
92 extraTitle: '', // string to prepend after the generic task title
93
fde8e8bb
TL
94 taskDone: Ext.emptyFn,
95
06694509 96 initComponent: function() {
05a977a2 97 let me = this;
06694509
DM
98
99 if (!me.upid) {
100 throw "no task specified";
101 }
102
05a977a2 103 let task = Proxmox.Utils.parse_task_upid(me.upid);
06694509 104
05a977a2 105 let statgrid;
06694509 106
05a977a2 107 let rows = {
06694509
DM
108 status: {
109 header: gettext('Status'),
110 defaultValue: 'unknown',
111 renderer: function(value) {
05a977a2 112 if (value !== 'stopped') {
06694509
DM
113 return value;
114 }
05a977a2 115 let es = statgrid.getObjectValue('exitstatus');
06694509
DM
116 if (es) {
117 return value + ': ' + es;
118 }
05a977a2 119 return 'unknown';
01031528 120 },
06694509 121 },
13fc756d 122 exitstatus: {
01031528 123 visible: false,
06694509
DM
124 },
125 type: {
126 header: gettext('Task type'),
01031528 127 required: true,
06694509
DM
128 },
129 user: {
130 header: gettext('User name'),
8e3f2973
TL
131 renderer: function(value) {
132 let user = value;
133 let tokenid = statgrid.getObjectValue('tokenid');
134 if (tokenid) {
135 user += `!${tokenid} (API Token)`;
136 }
137 return Ext.String.htmlEncode(user);
138 },
01031528 139 required: true,
06694509 140 },
c2ad5266
FG
141 tokenid: {
142 header: gettext('API Token'),
143 renderer: Ext.String.htmlEncode,
8e3f2973 144 visible: false,
c2ad5266 145 },
06694509
DM
146 node: {
147 header: gettext('Node'),
01031528 148 required: true,
06694509
DM
149 },
150 pid: {
151 header: gettext('Process ID'),
01031528 152 required: true,
06694509 153 },
21efafeb
TL
154 task_id: {
155 header: gettext('Task ID'),
156 },
06694509
DM
157 starttime: {
158 header: gettext('Start Time'),
13fc756d 159 required: true,
01031528 160 renderer: Proxmox.Utils.render_timestamp,
06694509
DM
161 },
162 upid: {
92d1c20d
DC
163 header: gettext('Unique task ID'),
164 renderer: Ext.String.htmlEncode,
01031528 165 },
06694509
DM
166 };
167
c9d603af
DC
168 if (me.endtime) {
169 if (typeof me.endtime === 'object') {
170 // convert to epoch
171 me.endtime = parseInt(me.endtime.getTime()/1000, 10);
172 }
173 rows.endtime = {
174 header: gettext('End Time'),
175 required: true,
176 renderer: function() {
177 return Proxmox.Utils.render_timestamp(me.endtime);
178 },
179 };
180 }
181
182 rows.duration = {
183 header: gettext('Duration'),
184 required: true,
185 renderer: function() {
186 let starttime = statgrid.getObjectValue('starttime');
187 let endtime = me.endtime || Date.now()/1000;
188 let duration = endtime - starttime;
189 return Proxmox.Utils.format_duration_human(duration);
190 },
191 };
192
05a977a2 193 let statstore = Ext.create('Proxmox.data.ObjectStore', {
9427d6a9 194 url: "/api2/json/nodes/" + task.node + "/tasks/" + encodeURIComponent(me.upid) + "/status",
06694509 195 interval: 1000,
01031528 196 rows: rows,
06694509
DM
197 });
198
13fc756d 199 me.on('destroy', statstore.stopUpdate);
06694509 200
05a977a2 201 let stop_task = function() {
06694509 202 Proxmox.Utils.API2Request({
9427d6a9 203 url: "/nodes/" + task.node + "/tasks/" + encodeURIComponent(me.upid),
06694509
DM
204 waitMsgTarget: me,
205 method: 'DELETE',
206 failure: function(response, opts) {
207 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
01031528 208 },
06694509
DM
209 });
210 };
211
05a977a2 212 let stop_btn1 = new Ext.Button({
06694509
DM
213 text: gettext('Stop'),
214 disabled: true,
01031528 215 handler: stop_task,
06694509
DM
216 });
217
05a977a2 218 let stop_btn2 = new Ext.Button({
06694509
DM
219 text: gettext('Stop'),
220 disabled: true,
01031528 221 handler: stop_task,
06694509
DM
222 });
223
224 statgrid = Ext.create('Proxmox.grid.ObjectGrid', {
225 title: gettext('Status'),
226 layout: 'fit',
01031528 227 tbar: [stop_btn1],
06694509
DM
228 rstore: statstore,
229 rows: rows,
01031528 230 border: false,
06694509
DM
231 });
232
05a977a2 233 let logView = Ext.create('Proxmox.panel.LogView', {
06694509 234 title: gettext('Output'),
01031528 235 tbar: [stop_btn2],
06694509 236 border: false,
9427d6a9 237 url: "/api2/extjs/nodes/" + task.node + "/tasks/" + encodeURIComponent(me.upid) + "/log",
06694509
DM
238 });
239
240 me.mon(statstore, 'load', function() {
05a977a2 241 let status = statgrid.getObjectValue('status');
13fc756d 242
06694509 243 if (status === 'stopped') {
06694509 244 logView.scrollToEnd = false;
65bb3b67 245 logView.requestUpdate();
06694509 246 statstore.stopUpdate();
05a977a2 247 me.taskDone(statgrid.getObjectValue('exitstatus') === 'OK');
06694509
DM
248 }
249
250 stop_btn1.setDisabled(status !== 'running');
251 stop_btn2.setDisabled(status !== 'running');
252 });
253
254 statstore.startUpdate();
255
256 Ext.apply(me, {
641df09e 257 title: "Task viewer: " + task.desc + me.extraTitle,
06694509 258 width: 800,
be3e4b4c 259 height: 500,
06694509
DM
260 layout: 'fit',
261 modal: true,
262 items: [{
263 xtype: 'tabpanel',
264 region: 'center',
01031528
TL
265 items: [logView, statgrid],
266 }],
06694509
DM
267 });
268
269 me.callParent();
270
271 logView.fireEvent('show', logView);
01031528 272 },
06694509
DM
273});
274