]>
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, 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() {
41 // update the scrollbar on every store load since the total count might be different.
42 // the buffered grid plugin does this only on (user) scrolling itself and even reduces
43 // the scrollheight again when scrolling up
44 me
.getView().updateLayout();
47 sinceChange: function(field
, newval
) {
49 let vm
= me
.getViewModel();
51 vm
.set('since', newval
);
54 untilChange: function(field
, newval
, oldval
) {
56 let vm
= me
.getViewModel();
58 vm
.set('until', newval
);
63 let view
= me
.getView();
64 view
.getStore().load();
67 showFilter: function(btn
, pressed
) {
69 let vm
= me
.getViewModel();
70 vm
.set('showFilter', pressed
);
73 init: function(view
) {
75 Proxmox
.Utils
.monStoreErrors(view
, view
.getStore(), true);
81 itemdblclick
: 'showTaskLog',
95 filterIcon
: (get) => 'fa fa-filter' + (get('showFilter') ? ' info-blue' : ''),
96 extraParams: function(get) {
99 if (get('typefilter')) {
100 params
.typefilter
= get('typefilter');
102 if (get('statusfilter')) {
103 params
.statusfilter
= get('statusfilter');
106 if (get('extraFilter')) {
107 let extraFilter
= get('extraFilter');
108 for (const [name
, value
] of Object
.entries(extraFilter
)) {
109 if (value
!== undefined && value
!== null && value
!== "") {
110 params
[name
] = value
;
116 params
.since
= get('since').valueOf()/1000;
120 let until
= new Date(get('until').getTime()); // copy object
121 until
.setDate(until
.getDate() + 1); // end of the day
122 params
.until
= until
.valueOf()/1000;
125 me
.getView().getStore().load();
137 model
: 'proxmox-tasks',
142 extraParams
: '{extraParams}',
143 url
: "/api2/json/nodes/localhost/tasks",
146 prefetch
: 'updateLayout',
153 store
: '{bufferedstore}',
161 xtype
: 'proxmoxButton',
162 text
: gettext('View'),
163 iconCls
: 'fa fa-window-restore',
165 handler
: 'showTaskLog',
169 text
: gettext('Reload'),
170 iconCls
: 'fa fa-refresh',
178 iconCls
: '{filterIcon}',
180 text
: gettext('Filter'),
182 stateId
: 'task-showfilter',
183 stateEvents
: ['toggle'],
184 applyState: function(state
) {
185 if (state
.pressed
!== undefined) {
186 this.setPressed(state
.pressed
);
189 getState: function() {
191 pressed
: this.pressed
,
195 toggle
: 'showFilter',
203 reference
: 'filtertoolbar',
209 hidden
: '{!showFilter}',
222 // cannot bind the values directly, as it then changes also
223 // on blur, causing wrong reloads of the store
227 fieldLabel
: gettext('Since'),
233 change
: 'sinceChange',
238 fieldLabel
: gettext('Until'),
244 change
: 'untilChange',
261 xtype
: 'pmxTaskTypeSelector',
262 fieldLabel
: gettext('Task Type'),
263 emptyText
: gettext('All'),
265 value
: '{typefilter}',
270 fieldLabel
: gettext('Task Result'),
271 emptyText
: gettext('All'),
274 ['ok', gettext('OK')],
275 ['unknown', Proxmox
.Utils
.unknownText
],
276 ['warning', gettext('Warnings')],
277 ['error', gettext('Errors')],
280 value
: '{statusfilter}',
291 stripeRows
: false, // does not work with getRowClass()
292 emptyText
: gettext('No Tasks found'),
294 getRowClass: function(record
, index
) {
295 let status
= record
.get('status');
298 let parsed
= Proxmox
.Utils
.parse_task_status(status
);
299 if (parsed
=== 'error') {
300 return "proxmox-invalid-row";
301 } else if (parsed
=== 'warning') {
302 return "proxmox-warning-row";
311 header
: gettext("Start Time"),
312 dataIndex
: 'starttime',
314 renderer: function(value
) {
315 return Ext
.Date
.format(value
, "M d H:i:s");
319 header
: gettext("End Time"),
320 dataIndex
: 'endtime',
322 renderer: function(value
, metaData
, record
) {
324 metaData
.tdCls
= "x-grid-row-loading";
327 return Ext
.Date
.format(value
, "M d H:i:s");
331 header
: gettext("Duration"),
334 renderer: function(value
, metaData
, record
) {
335 let start
= record
.data
.starttime
;
337 let end
= record
.data
.endtime
|| Date
.now();
338 let duration
= end
- start
;
342 return Proxmox
.Utils
.format_duration_human(duration
);
344 return Proxmox
.Utils
.unknownText
;
348 header
: gettext("User name"),
353 header
: gettext("Description"),
356 renderer
: Proxmox
.Utils
.render_upid
,
359 header
: gettext("Status"),
362 renderer: function(value
, metaData
, record
) {
363 if (value
=== undefined && !record
.data
.endtime
) {
364 metaData
.tdCls
= "x-grid-row-loading";
368 let parsed
= Proxmox
.Utils
.parse_task_status(value
);
370 case 'unknown': return Proxmox
.Utils
.unknownText
;
371 case 'error': return Proxmox
.Utils
.errorText
+ ': ' + value
;
372 case 'ok': // fall-through
373 case 'warning': // fall-through
374 default: return value
;
380 initComponent: function() {
383 let updateExtraFilters = function(name
, value
) {
384 let vm
= me
.getViewModel();
385 let extraFilter
= Ext
.clone(vm
.get('extraFilter'));
386 extraFilter
[name
] = value
;
387 vm
.set('extraFilter', extraFilter
);
390 for (const [name
, value
] of Object
.entries(me
.preFilter
)) {
391 updateExtraFilters(name
, value
);
396 let addFields = function(items
) {
397 me
.lookup('filtertoolbar').add({
411 // start with a userfilter
415 fieldLabel
: gettext('User name'),
424 for (const filterTemplate
of me
.extraFilter
) {
425 let filter
= Ext
.clone(filterTemplate
);
427 filter
.listeners
= filter
.listeners
|| {};
428 filter
.listeners
.change
= Ext
.apply(filter
.changeOptions
|| {}, {
429 fn: function(field
, value
) {
430 updateExtraFilters(filter
.name
, value
);
435 if (items
.length
=== 2) {