]> git.proxmox.com Git - proxmox-widget-toolkit.git/blob - window/TaskViewer.js
add TimeView, TimeEdit and TaskViewer
[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 // fixme: ??
51 //var descr = Proxmox.Utils.format_task_description(task.type, task.id);
52
53 Ext.apply(me, {
54 title: "Task: " + me.upid,
55 width: 300,
56 layout: 'auto',
57 modal: true,
58 bodyPadding: 5,
59 items: pbar,
60 buttons: [
61 {
62 text: gettext('Details'),
63 handler: function() {
64 var win = Ext.create('Proxmox.window.TaskViewer', {
65 upid: me.upid
66 });
67 win.show();
68 me.close();
69 }
70 }
71 ]
72 });
73
74 me.callParent();
75
76 statstore.startUpdate();
77
78 pbar.wait();
79 }
80 });
81
82 // fixme: how can we avoid those lint errors?
83 /*jslint confusion: true */
84
85 Ext.define('Proxmox.window.TaskViewer', {
86 extend: 'Ext.window.Window',
87 alias: 'widget.proxmoxTaskViewer',
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('Proxmox.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('Proxmox.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 // fixme: better title
207 title: "Task viewer: " + me.upid,
208 width: 800,
209 height: 400,
210 layout: 'fit',
211 modal: true,
212 items: [{
213 xtype: 'tabpanel',
214 region: 'center',
215 items: [ logView, statgrid ]
216 }]
217 });
218
219 me.callParent();
220
221 logView.fireEvent('show', logView);
222 }
223 });
224