]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/node/Tasks.js
dfe93dc3687ec4eb00f21761032c5af41672d1e4
1 Ext
.define('Proxmox.node.Tasks', {
2 extend
: 'Ext.grid.GridPanel',
4 alias
: 'widget.proxmoxNodeTasks',
7 stateId
: 'pve-grid-node-tasks',
10 sortableColumns
: false,
12 // set extra filter components, must have a 'name' property for the parameter, and must
13 // trigger a 'change' event if the value is 'undefined', it will not be sent to the api
17 // fixed filters which cannot be changed after instantiation, for example:
22 xclass
: 'Ext.app.ViewController',
24 showTaskLog: function() {
26 let selection
= me
.getView().getSelection();
27 if (selection
.length
< 1) {
31 let rec
= selection
[0];
33 Ext
.create('Proxmox.window.TaskViewer', {
35 endtime
: rec
.data
.endtime
,
39 updateLayout: function(store
, records
, success
, operation
) {
41 let view
= me
.getView().getView(); // the table view, not the whole grid
42 Proxmox
.Utils
.setErrorMask(view
, false);
43 // update the scrollbar on every store load since the total count might be different.
44 // the buffered grid plugin does this only on (user) scrolling itself and even reduces
45 // the scrollheight again when scrolling up
46 me
.getView().updateLayout();
49 Proxmox
.Utils
.setErrorMask(view
, Proxmox
.Utils
.getResponseErrorMessage(operation
.getError()));
55 let view
= me
.getView();
57 let selection
= view
.getSelection();
58 let store
= me
.getViewModel().get('bufferedstore');
59 if (selection
&& selection
.length
> 0) {
60 // deselect if selection is not there anymore
61 if (!store
.contains(selection
[0])) {
62 view
.setSelection(undefined);
67 sinceChange: function(field
, newval
) {
69 let vm
= me
.getViewModel();
71 vm
.set('since', newval
);
74 untilChange: function(field
, newval
, oldval
) {
76 let vm
= me
.getViewModel();
78 vm
.set('until', newval
);
83 let view
= me
.getView();
84 view
.getStore().load();
87 showFilter: function(btn
, pressed
) {
89 let vm
= me
.getViewModel();
90 vm
.set('showFilter', pressed
);
95 itemdblclick
: 'showTaskLog',
109 filterIcon
: (get) => 'fa fa-filter' + (get('showFilter') ? ' info-blue' : ''),
110 extraParams: function(get) {
113 if (get('typefilter')) {
114 params
.typefilter
= get('typefilter');
116 if (get('statusfilter')) {
117 params
.statusfilter
= get('statusfilter');
120 if (get('extraFilter')) {
121 let extraFilter
= get('extraFilter');
122 for (const [name
, value
] of Object
.entries(extraFilter
)) {
123 if (value
!== undefined && value
!== null && value
!== "") {
124 params
[name
] = value
;
130 params
.since
= get('since').valueOf()/1000;
134 let until
= new Date(get('until').getTime()); // copy object
135 until
.setDate(until
.getDate() + 1); // end of the day
136 params
.until
= until
.valueOf()/1000;
139 me
.getView().getStore().load();
151 model
: 'proxmox-tasks',
156 extraParams
: '{extraParams}',
157 url
: "/api2/json/nodes/localhost/tasks",
160 prefetch
: 'updateLayout',
168 store
: '{bufferedstore}',
176 xtype
: 'proxmoxButton',
177 text
: gettext('View'),
178 iconCls
: 'fa fa-window-restore',
180 handler
: 'showTaskLog',
184 text
: gettext('Reload'),
185 iconCls
: 'fa fa-refresh',
193 iconCls
: '{filterIcon}',
195 text
: gettext('Filter'),
197 stateId
: 'task-showfilter',
198 stateEvents
: ['toggle'],
199 applyState: function(state
) {
200 if (state
.pressed
!== undefined) {
201 this.setPressed(state
.pressed
);
204 getState: function() {
206 pressed
: this.pressed
,
210 toggle
: 'showFilter',
218 reference
: 'filtertoolbar',
224 hidden
: '{!showFilter}',
237 // cannot bind the values directly, as it then changes also
238 // on blur, causing wrong reloads of the store
242 fieldLabel
: gettext('Since'),
248 change
: 'sinceChange',
253 fieldLabel
: gettext('Until'),
259 change
: 'untilChange',
276 xtype
: 'pmxTaskTypeSelector',
277 fieldLabel
: gettext('Task Type'),
278 emptyText
: gettext('All'),
280 value
: '{typefilter}',
285 fieldLabel
: gettext('Task Result'),
286 emptyText
: gettext('All'),
289 ['ok', gettext('OK')],
290 ['unknown', Proxmox
.Utils
.unknownText
],
291 ['warning', gettext('Warnings')],
292 ['error', gettext('Errors')],
295 value
: '{statusfilter}',
306 stripeRows
: false, // does not work with getRowClass()
307 emptyText
: gettext('No Tasks found'),
309 getRowClass: function(record
, index
) {
310 let status
= record
.get('status');
313 let parsed
= Proxmox
.Utils
.parse_task_status(status
);
314 if (parsed
=== 'error') {
315 return "proxmox-invalid-row";
316 } else if (parsed
=== 'warning') {
317 return "proxmox-warning-row";
326 header
: gettext("Start Time"),
327 dataIndex
: 'starttime',
329 renderer: function(value
) {
330 return Ext
.Date
.format(value
, "M d H:i:s");
334 header
: gettext("End Time"),
335 dataIndex
: 'endtime',
337 renderer: function(value
, metaData
, record
) {
339 metaData
.tdCls
= "x-grid-row-loading";
342 return Ext
.Date
.format(value
, "M d H:i:s");
346 header
: gettext("Duration"),
349 renderer: function(value
, metaData
, record
) {
350 let start
= record
.data
.starttime
;
352 let end
= record
.data
.endtime
|| Date
.now();
353 let duration
= end
- start
;
357 return Proxmox
.Utils
.format_duration_human(duration
);
359 return Proxmox
.Utils
.unknownText
;
363 header
: gettext("User name"),
368 header
: gettext("Description"),
371 renderer
: Proxmox
.Utils
.render_upid
,
374 header
: gettext("Status"),
377 renderer: function(value
, metaData
, record
) {
378 if (value
=== undefined && !record
.data
.endtime
) {
379 metaData
.tdCls
= "x-grid-row-loading";
383 let parsed
= Proxmox
.Utils
.parse_task_status(value
);
385 case 'unknown': return Proxmox
.Utils
.unknownText
;
386 case 'error': return Proxmox
.Utils
.errorText
+ ': ' + value
;
387 case 'ok': // fall-through
388 case 'warning': // fall-through
389 default: return value
;
395 initComponent: function() {
398 let updateExtraFilters = function(name
, value
) {
399 let vm
= me
.getViewModel();
400 let extraFilter
= Ext
.clone(vm
.get('extraFilter'));
401 extraFilter
[name
] = value
;
402 vm
.set('extraFilter', extraFilter
);
405 for (const [name
, value
] of Object
.entries(me
.preFilter
)) {
406 updateExtraFilters(name
, value
);
411 let addFields = function(items
) {
412 me
.lookup('filtertoolbar').add({
426 // start with a userfilter
430 fieldLabel
: gettext('User name'),
439 for (const filterTemplate
of me
.extraFilter
) {
440 let filter
= Ext
.clone(filterTemplate
);
442 filter
.listeners
= filter
.listeners
|| {};
443 filter
.listeners
.change
= Ext
.apply(filter
.changeOptions
|| {}, {
444 fn: function(field
, value
) {
445 updateExtraFilters(filter
.name
, value
);
450 if (items
.length
=== 2) {