]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/TaskViewer.js
use windowEdit from widget toolkit
[pve-manager.git] / www / manager6 / window / TaskViewer.js
1 Ext.define('PVE.window.TaskProgress', {
2 extend: 'Ext.window.Window',
3 alias: 'widget.pveTaskProgress',
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('PVE.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: "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('PVE.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('PVE.window.TaskViewer', {
85 extend: 'Ext.window.Window',
86 alias: 'widget.pveTaskViewer',
87 extraTitle: '', // string to prepend after the generic task title
88
89 initComponent: function() {
90 var me = this;
91
92 if (!me.upid) {
93 throw "no task specified";
94 }
95
96 var task = Proxmox.Utils.parse_task_upid(me.upid);
97
98 var statgrid;
99
100 var rows = {
101 status: {
102 header: gettext('Status'),
103 defaultValue: 'unknown',
104 renderer: function(value) {
105 if (value != 'stopped') {
106 return value;
107 }
108 var es = statgrid.getObjectValue('exitstatus');
109 if (es) {
110 return value + ': ' + es;
111 }
112 }
113 },
114 exitstatus: {
115 visible: false
116 },
117 type: {
118 header: gettext('Task type'),
119 required: true
120 },
121 user: {
122 header: gettext('User name'),
123 required: true
124 },
125 node: {
126 header: gettext('Node'),
127 required: true
128 },
129 pid: {
130 header: gettext('Process ID'),
131 required: true
132 },
133 starttime: {
134 header: gettext('Start Time'),
135 required: true,
136 renderer: Proxmox.Utils.render_timestamp
137 },
138 upid: {
139 header: gettext('Unique task ID')
140 }
141 };
142
143 var statstore = Ext.create('PVE.data.ObjectStore', {
144 url: "/api2/json/nodes/" + task.node + "/tasks/" + me.upid + "/status",
145 interval: 1000,
146 rows: rows
147 });
148
149 me.on('destroy', statstore.stopUpdate);
150
151 var stop_task = function() {
152 Proxmox.Utils.API2Request({
153 url: "/nodes/" + task.node + "/tasks/" + me.upid,
154 waitMsgTarget: me,
155 method: 'DELETE',
156 failure: function(response, opts) {
157 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
158 }
159 });
160 };
161
162 var stop_btn1 = new Ext.Button({
163 text: gettext('Stop'),
164 disabled: true,
165 handler: stop_task
166 });
167
168 var stop_btn2 = new Ext.Button({
169 text: gettext('Stop'),
170 disabled: true,
171 handler: stop_task
172 });
173
174 statgrid = Ext.create('Proxmox.grid.ObjectGrid', {
175 title: gettext('Status'),
176 layout: 'fit',
177 tbar: [ stop_btn1 ],
178 rstore: statstore,
179 rows: rows,
180 border: false
181 });
182
183 var logView = Ext.create('PVE.panel.LogView', {
184 title: gettext('Output'),
185 tbar: [ stop_btn2 ],
186 border: false,
187 url: "/api2/extjs/nodes/" + task.node + "/tasks/" + me.upid + "/log"
188 });
189
190 me.mon(statstore, 'load', function() {
191 var status = statgrid.getObjectValue('status');
192
193 if (status === 'stopped') {
194 logView.requestUpdate(undefined, true);
195 logView.scrollToEnd = false;
196 statstore.stopUpdate();
197 }
198
199 stop_btn1.setDisabled(status !== 'running');
200 stop_btn2.setDisabled(status !== 'running');
201 });
202
203 statstore.startUpdate();
204
205 Ext.apply(me, {
206 title: "Task viewer: " + task.desc + me.extraTitle,
207 width: 800,
208 height: 400,
209 layout: 'fit',
210 modal: true,
211 items: [{
212 xtype: 'tabpanel',
213 region: 'center',
214 items: [ logView, statgrid ]
215 }]
216 });
217
218 me.callParent();
219
220 logView.fireEvent('show', logView);
221 }
222 });
223