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