]> git.proxmox.com Git - proxmox-widget-toolkit.git/blob - window/TaskViewer.js
task view, progress: add taskDone callback
[proxmox-widget-toolkit.git] / window / TaskViewer.js
1 Ext.define('Proxmox.window.TaskProgress', {
2 extend: 'Ext.window.Window',
3 alias: 'widget.proxmoxTaskProgress',
4
5 taskDone: Ext.emptyFn,
6
7 initComponent: function() {
8 var me = this;
9
10 if (!me.upid) {
11 throw "no task specified";
12 }
13
14 var task = Proxmox.Utils.parse_task_upid(me.upid);
15
16 var statstore = Ext.create('Proxmox.data.ObjectStore', {
17 url: "/api2/json/nodes/" + task.node + "/tasks/" + me.upid + "/status",
18 interval: 1000,
19 rows: {
20 status: { defaultValue: 'unknown' },
21 exitstatus: { defaultValue: 'unknown' }
22 }
23 });
24
25 me.on('destroy', statstore.stopUpdate);
26
27 var getObjectValue = function(key, defaultValue) {
28 var rec = statstore.getById(key);
29 if (rec) {
30 return rec.data.value;
31 }
32 return defaultValue;
33 };
34
35 var pbar = Ext.create('Ext.ProgressBar', { text: 'running...' });
36
37 me.mon(statstore, 'load', function() {
38 var status = getObjectValue('status');
39 if (status === 'stopped') {
40 var exitstatus = getObjectValue('exitstatus');
41 if (exitstatus == 'OK') {
42 pbar.reset();
43 pbar.updateText("Done!");
44 Ext.Function.defer(me.close, 1000, me);
45 } else {
46 me.close();
47 Ext.Msg.alert('Task failed', exitstatus);
48 }
49 me.taskDone(exitstatus == 'OK');
50 }
51 });
52
53 var descr = Proxmox.Utils.format_task_description(task.type, task.id);
54
55 Ext.apply(me, {
56 title: gettext('Task') + ': ' + descr,
57 width: 300,
58 layout: 'auto',
59 modal: true,
60 bodyPadding: 5,
61 items: pbar,
62 buttons: [
63 {
64 text: gettext('Details'),
65 handler: function() {
66 var win = Ext.create('Proxmox.window.TaskViewer', {
67 taskDone: me.taskDone,
68 upid: me.upid
69 });
70 win.show();
71 me.close();
72 }
73 }
74 ]
75 });
76
77 me.callParent();
78
79 statstore.startUpdate();
80
81 pbar.wait();
82 }
83 });
84
85 // fixme: how can we avoid those lint errors?
86 /*jslint confusion: true */
87
88 Ext.define('Proxmox.window.TaskViewer', {
89 extend: 'Ext.window.Window',
90 alias: 'widget.proxmoxTaskViewer',
91
92 extraTitle: '', // string to prepend after the generic task title
93
94 taskDone: Ext.emptyFn,
95
96 initComponent: function() {
97 var me = this;
98
99 if (!me.upid) {
100 throw "no task specified";
101 }
102
103 var task = Proxmox.Utils.parse_task_upid(me.upid);
104
105 var statgrid;
106
107 var rows = {
108 status: {
109 header: gettext('Status'),
110 defaultValue: 'unknown',
111 renderer: function(value) {
112 if (value != 'stopped') {
113 return value;
114 }
115 var es = statgrid.getObjectValue('exitstatus');
116 if (es) {
117 return value + ': ' + es;
118 }
119 }
120 },
121 exitstatus: {
122 visible: false
123 },
124 type: {
125 header: gettext('Task type'),
126 required: true
127 },
128 user: {
129 header: gettext('User name'),
130 required: true
131 },
132 node: {
133 header: gettext('Node'),
134 required: true
135 },
136 pid: {
137 header: gettext('Process ID'),
138 required: true
139 },
140 starttime: {
141 header: gettext('Start Time'),
142 required: true,
143 renderer: Proxmox.Utils.render_timestamp
144 },
145 upid: {
146 header: gettext('Unique task ID')
147 }
148 };
149
150 var statstore = Ext.create('Proxmox.data.ObjectStore', {
151 url: "/api2/json/nodes/" + task.node + "/tasks/" + me.upid + "/status",
152 interval: 1000,
153 rows: rows
154 });
155
156 me.on('destroy', statstore.stopUpdate);
157
158 var stop_task = function() {
159 Proxmox.Utils.API2Request({
160 url: "/nodes/" + task.node + "/tasks/" + me.upid,
161 waitMsgTarget: me,
162 method: 'DELETE',
163 failure: function(response, opts) {
164 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
165 }
166 });
167 };
168
169 var stop_btn1 = new Ext.Button({
170 text: gettext('Stop'),
171 disabled: true,
172 handler: stop_task
173 });
174
175 var stop_btn2 = new Ext.Button({
176 text: gettext('Stop'),
177 disabled: true,
178 handler: stop_task
179 });
180
181 statgrid = Ext.create('Proxmox.grid.ObjectGrid', {
182 title: gettext('Status'),
183 layout: 'fit',
184 tbar: [ stop_btn1 ],
185 rstore: statstore,
186 rows: rows,
187 border: false
188 });
189
190 var logView = Ext.create('Proxmox.panel.LogView', {
191 title: gettext('Output'),
192 tbar: [ stop_btn2 ],
193 border: false,
194 url: "/api2/extjs/nodes/" + task.node + "/tasks/" + me.upid + "/log"
195 });
196
197 me.mon(statstore, 'load', function() {
198 var status = statgrid.getObjectValue('status');
199
200 if (status === 'stopped') {
201 logView.requestUpdate(undefined, true);
202 logView.scrollToEnd = false;
203 statstore.stopUpdate();
204 me.taskDone(statgrid.getObjectValue('exitstatus') == 'OK');
205 }
206
207 stop_btn1.setDisabled(status !== 'running');
208 stop_btn2.setDisabled(status !== 'running');
209 });
210
211 statstore.startUpdate();
212
213 Ext.apply(me, {
214 title: "Task viewer: " + task.desc + me.extraTitle,
215 width: 800,
216 height: 400,
217 layout: 'fit',
218 modal: true,
219 items: [{
220 xtype: 'tabpanel',
221 region: 'center',
222 items: [ logView, statgrid ]
223 }]
224 });
225
226 me.callParent();
227
228 logView.fireEvent('show', logView);
229 }
230 });
231