]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/window/TaskViewer.js
1 Ext
.define('Proxmox.window.TaskProgress', {
2 extend
: 'Ext.window.Window',
3 alias
: 'widget.proxmoxTaskProgress',
12 initComponent: function() {
16 throw "no task specified";
19 let task
= Proxmox
.Utils
.parse_task_upid(me
.upid
);
21 let statstore
= Ext
.create('Proxmox.data.ObjectStore', {
22 url
: `/api2/json/nodes/${task.node}/tasks/${encodeURIComponent(me.upid)}/status`,
25 status
: { defaultValue
: 'unknown' },
26 exitstatus
: { defaultValue
: 'unknown' },
30 me
.on('destroy', statstore
.stopUpdate
);
32 let getObjectValue = function(key
, defaultValue
) {
33 let rec
= statstore
.getById(key
);
35 return rec
.data
.value
;
40 let pbar
= Ext
.create('Ext.ProgressBar');
42 me
.mon(statstore
, 'load', function() {
43 let status
= getObjectValue('status');
44 if (status
=== 'stopped') {
45 let exitstatus
= getObjectValue('exitstatus');
46 if (exitstatus
=== 'OK') {
48 pbar
.updateText("Done!");
49 Ext
.Function
.defer(me
.close
, 1000, me
);
52 Ext
.Msg
.alert('Task failed', exitstatus
);
54 me
.taskDone(exitstatus
=== 'OK');
58 let descr
= Proxmox
.Utils
.format_task_description(task
.type
, task
.id
);
61 title
: gettext('Task') + ': ' + descr
,
65 text
: gettext('Details'),
67 Ext
.create('Proxmox.window.TaskViewer', {
69 taskDone
: me
.taskDone
,
80 statstore
.startUpdate();
82 pbar
.wait({ text
: gettext('running...') });
86 Ext
.define('Proxmox.window.TaskViewer', {
87 extend
: 'Ext.window.Window',
88 alias
: 'widget.proxmoxTaskViewer',
90 extraTitle
: '', // string to prepend after the generic task title
92 taskDone
: Ext
.emptyFn
,
94 initComponent: function() {
98 throw "no task specified";
101 let task
= Proxmox
.Utils
.parse_task_upid(me
.upid
);
107 header
: gettext('Status'),
108 defaultValue
: 'unknown',
109 renderer: function(value
) {
110 if (value
!== 'stopped') {
113 let es
= statgrid
.getObjectValue('exitstatus');
115 return value
+ ': ' + es
;
124 header
: gettext('Task type'),
128 header
: gettext('User name'),
129 renderer: function(value
) {
131 let tokenid
= statgrid
.getObjectValue('tokenid');
133 user
+= `!${tokenid} (API Token)`;
135 return Ext
.String
.htmlEncode(user
);
140 header
: gettext('API Token'),
141 renderer
: Ext
.String
.htmlEncode
,
145 header
: gettext('Node'),
149 header
: gettext('Process ID'),
153 header
: gettext('Task ID'),
156 header
: gettext('Start Time'),
158 renderer
: Proxmox
.Utils
.render_timestamp
,
161 header
: gettext('Unique task ID'),
162 renderer
: Ext
.String
.htmlEncode
,
167 if (typeof me
.endtime
=== 'object') {
169 me
.endtime
= parseInt(me
.endtime
.getTime()/1000, 10);
172 header
: gettext('End Time'),
174 renderer: function() {
175 return Proxmox
.Utils
.render_timestamp(me
.endtime
);
181 header
: gettext('Duration'),
183 renderer: function() {
184 let starttime
= statgrid
.getObjectValue('starttime');
185 let endtime
= me
.endtime
|| Date
.now()/1000;
186 let duration
= endtime
- starttime
;
187 return Proxmox
.Utils
.format_duration_human(duration
);
191 let statstore
= Ext
.create('Proxmox.data.ObjectStore', {
192 url
: `/api2/json/nodes/${task.node}/tasks/${encodeURIComponent(me.upid)}/status`,
197 me
.on('destroy', statstore
.stopUpdate
);
199 let stop_task = function() {
200 Proxmox
.Utils
.API2Request({
201 url
: `/nodes/${task.node}/tasks/${encodeURIComponent(me.upid)}`,
204 failure
: response
=> Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
),
208 let stop_btn1
= new Ext
.Button({
209 text
: gettext('Stop'),
214 let stop_btn2
= new Ext
.Button({
215 text
: gettext('Stop'),
220 statgrid
= Ext
.create('Proxmox.grid.ObjectGrid', {
221 title
: gettext('Status'),
229 let downloadBtn
= new Ext
.Button({
230 text
: gettext('Download'),
231 iconCls
: 'fa fa-download',
232 handler
: () => Proxmox
.Utils
.downloadAsFile(
233 `/api2/json/nodes/${task.node}/tasks/${encodeURIComponent(me.upid)}/log?download=1`),
237 let logView
= Ext
.create('Proxmox.panel.LogView', {
238 title
: gettext('Output'),
239 tbar
: [stop_btn2
, '->', downloadBtn
],
241 url
: `/api2/extjs/nodes/${task.node}/tasks/${encodeURIComponent(me.upid)}/log`,
244 me
.mon(statstore
, 'load', function() {
245 let status
= statgrid
.getObjectValue('status');
247 if (status
=== 'stopped') {
248 logView
.scrollToEnd
= false;
249 logView
.requestUpdate();
250 statstore
.stopUpdate();
251 me
.taskDone(statgrid
.getObjectValue('exitstatus') === 'OK');
254 stop_btn1
.setDisabled(status
!== 'running');
255 stop_btn2
.setDisabled(status
!== 'running');
256 downloadBtn
.setDisabled(status
=== 'running');
259 statstore
.startUpdate();
262 title
: "Task viewer: " + task
.desc
+ me
.extraTitle
,
270 items
: [logView
, statgrid
],
276 logView
.fireEvent('show', logView
);