]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/node/Tasks.js
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,
13 // must have a 'name' property for the parameter,
14 // and must trigger a 'change' event
15 // if the value is 'undefined', it will not be sent to the api
19 // filters that should only be set once and is not changable
27 xclass
: 'Ext.app.ViewController',
29 showTaskLog: function() {
31 let selection
= me
.getView().getSelection();
32 if (selection
.length
< 1) {
36 let rec
= selection
[0];
38 Ext
.create('Proxmox.window.TaskViewer', {
40 endtime
: rec
.data
.endtime
,
44 updateLayout: function() {
46 // we want to update the scrollbar on every store load
47 // since the total count might be different
48 // the buffered grid plugin does this only on scrolling itself
49 // and even reduces the scrollheight again when scrolling up
50 me
.getView().updateLayout();
53 sinceChange: function(field
, newval
) {
55 let vm
= me
.getViewModel();
57 vm
.set('since', newval
);
60 untilChange: function(field
, newval
, oldval
) {
62 let vm
= me
.getViewModel();
64 vm
.set('until', newval
);
69 let view
= me
.getView();
70 view
.getStore().load();
73 showFilter: function(btn
, pressed
) {
75 let vm
= me
.getViewModel();
76 vm
.set('showFilter', pressed
);
79 init: function(view
) {
81 Proxmox
.Utils
.monStoreErrors(view
, view
.getStore(), true);
87 itemdblclick
: 'showTaskLog',
102 filterIcon
: (get) => 'fa fa-filter' + (get('showFilter') ? ' info-blue' : ''),
103 extraParams: function(get) {
106 if (get('typefilter')) {
107 params
.typefilter
= get('typefilter');
109 if (get('statusfilter')) {
110 params
.statusfilter
= get('statusfilter');
112 if (get('datastore')) {
113 params
.store
= get('datastore');
116 if (get('extraFilter')) {
117 let extraFilter
= get('extraFilter');
118 for (const [name
, value
] of Object
.entries(extraFilter
)) {
119 if (value
!== undefined && value
!== null && value
!== "") {
120 params
[name
] = value
;
126 params
.since
= get('since').valueOf()/1000;
130 let until
= new Date(get('until').getTime()); // copy object
131 until
.setDate(until
.getDate() + 1); // end of the day
132 params
.until
= until
.valueOf()/1000;
135 me
.getView().getStore().load();
147 model
: 'proxmox-tasks',
152 extraParams
: '{extraParams}',
153 url
: "/api2/json/nodes/localhost/tasks",
156 prefetch
: 'updateLayout',
163 store
: '{bufferedstore}',
171 xtype
: 'proxmoxButton',
172 text
: gettext('View'),
173 iconCls
: 'fa fa-window-restore',
175 handler
: 'showTaskLog',
179 text
: gettext('Reload'),
180 iconCls
: 'fa fa-refresh',
188 iconCls
: '{filterIcon}',
190 text
: gettext('Filter'),
192 stateId
: 'task-showfilter',
193 stateEvents
: ['toggle'],
194 applyState: function(state
) {
195 if (state
.pressed
!== undefined) {
196 this.setPressed(state
.pressed
);
199 getState: function() {
201 pressed
: this.pressed
,
205 toggle
: 'showFilter',
213 reference
: 'filtertoolbar',
219 hidden
: '{!showFilter}',
232 // cannot bind the values directly, as it then changes also
233 // on blur, causing wrong reloads of the store
237 fieldLabel
: gettext('Since'),
243 change
: 'sinceChange',
248 fieldLabel
: gettext('Until'),
254 change
: 'untilChange',
271 xtype
: 'pmxTaskTypeSelector',
272 fieldLabel
: gettext('Task Type'),
273 emptyText
: gettext('All'),
275 value
: '{typefilter}',
280 fieldLabel
: gettext('Task Result'),
281 emptyText
: gettext('All'),
284 ['ok', gettext('OK')],
285 ['unknown', Proxmox
.Utils
.unknownText
],
286 ['warning', gettext('Warnings')],
287 ['error', gettext('Errors')],
290 value
: '{statusfilter}',
301 stripeRows
: false, // does not work with getRowClass()
302 emptyText
: gettext('No Tasks found'),
304 getRowClass: function(record
, index
) {
305 let status
= record
.get('status');
308 let parsed
= Proxmox
.Utils
.parse_task_status(status
);
309 if (parsed
=== 'error') {
310 return "proxmox-invalid-row";
311 } else if (parsed
=== 'warning') {
312 return "proxmox-warning-row";
321 header
: gettext("Start Time"),
322 dataIndex
: 'starttime',
324 renderer: function(value
) {
325 return Ext
.Date
.format(value
, "M d H:i:s");
329 header
: gettext("End Time"),
330 dataIndex
: 'endtime',
332 renderer: function(value
, metaData
, record
) {
334 metaData
.tdCls
= "x-grid-row-loading";
337 return Ext
.Date
.format(value
, "M d H:i:s");
341 header
: gettext("Duration"),
344 renderer: function(value
, metaData
, record
) {
345 let start
= record
.data
.starttime
;
347 let end
= record
.data
.endtime
|| Date
.now();
348 let duration
= end
- start
;
352 return Proxmox
.Utils
.format_duration_human(duration
);
354 return Proxmox
.Utils
.unknownText
;
358 header
: gettext("User name"),
363 header
: gettext("Description"),
366 renderer
: Proxmox
.Utils
.render_upid
,
369 header
: gettext("Status"),
372 renderer: function(value
, metaData
, record
) {
373 if (value
=== undefined && !record
.data
.endtime
) {
374 metaData
.tdCls
= "x-grid-row-loading";
378 let parsed
= Proxmox
.Utils
.parse_task_status(value
);
380 case 'unknown': return Proxmox
.Utils
.unknownText
;
381 case 'error': return Proxmox
.Utils
.errorText
+ ': ' + value
;
382 case 'ok': // fall-through
383 case 'warning': // fall-through
384 default: return value
;
390 initComponent: function() {
393 let updateExtraFilters = function(name
, value
) {
394 let vm
= me
.getViewModel();
395 let extraFilter
= Ext
.clone(vm
.get('extraFilter'));
396 extraFilter
[name
] = value
;
397 vm
.set('extraFilter', extraFilter
);
400 for (const [name
, value
] of Object
.entries(me
.preFilter
)) {
401 updateExtraFilters(name
, value
);
406 let addFields = function(items
) {
407 me
.lookup('filtertoolbar').add({
421 // start with a userfilter
425 fieldLabel
: gettext('User name'),
434 for (const filterTemplate
of me
.extraFilter
) {
435 let filter
= Ext
.clone(filterTemplate
);
437 filter
.listeners
= filter
.listeners
|| {};
438 filter
.listeners
.change
= Ext
.apply(filter
.changeOptions
|| {}, {
439 fn: function(field
, value
) {
440 updateExtraFilters(filter
.name
, value
);
445 if (items
.length
=== 2) {