]>
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(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
);
93 clearFilter: function() {
95 me
.lookup('filtertoolbar').query('field').forEach((field
) => {
96 field
.setValue(undefined);
102 itemdblclick
: 'showTaskLog',
116 filterIcon
: (get) => 'fa fa-filter' + (get('showFilter') ? ' info-blue' : ''),
117 extraParams: function(get) {
120 if (get('typefilter')) {
121 params
.typefilter
= get('typefilter');
123 if (get('statusfilter')) {
124 params
.statusfilter
= get('statusfilter');
127 if (get('extraFilter')) {
128 let extraFilter
= get('extraFilter');
129 for (const [name
, value
] of Object
.entries(extraFilter
)) {
130 if (value
!== undefined && value
!== null && value
!== "") {
131 params
[name
] = value
;
137 params
.since
= get('since').valueOf()/1000;
141 let until
= new Date(get('until').getTime()); // copy object
142 until
.setDate(until
.getDate() + 1); // end of the day
143 params
.until
= until
.valueOf()/1000;
146 me
.getView().getStore().load();
150 filterCount: function(get) {
152 if (get('typefilter')) {
155 let status
= get('statusfilter');
156 if ((Ext
.isArray(status
) && status
.length
> 0) ||
157 (!Ext
.isArray(status
) && status
)) {
167 if (get('extraFilter')) {
168 let extraFilter
= get('extraFilter');
169 for (const value
of Object
.values(extraFilter
)) {
170 if (value
!== undefined && value
!== null && value
!== "") {
178 clearFilterText: function(get) {
179 let count
= get('filterCount');
182 fieldMsg
= ` (${count} ${gettext('Fields')})`;
183 } else if (count
> 0) {
184 fieldMsg
= ` (1 ${gettext('Field')})`;
186 return gettext('Clear Filter') + fieldMsg
;
196 model
: 'proxmox-tasks',
201 extraParams
: '{extraParams}',
205 prefetch
: 'updateLayout',
213 store
: '{bufferedstore}',
221 xtype
: 'proxmoxButton',
222 text
: gettext('View'),
223 iconCls
: 'fa fa-window-restore',
225 handler
: 'showTaskLog',
229 text
: gettext('Reload'),
230 iconCls
: 'fa fa-refresh',
237 text
: '{clearFilterText}',
238 disabled
: '{!filterCount}',
240 text
: gettext('Clear Filter'),
242 handler
: 'clearFilter',
248 iconCls
: '{filterIcon}',
250 text
: gettext('Filter'),
252 stateId
: 'task-showfilter',
253 stateEvents
: ['toggle'],
254 applyState: function(state
) {
255 if (state
.pressed
!== undefined) {
256 this.setPressed(state
.pressed
);
259 getState: function() {
261 pressed
: this.pressed
,
265 toggle
: 'showFilter',
273 reference
: 'filtertoolbar',
279 hidden
: '{!showFilter}',
292 // cannot bind the values directly, as it then changes also
293 // on blur, causing wrong reloads of the store
297 fieldLabel
: gettext('Since'),
303 change
: 'sinceChange',
308 fieldLabel
: gettext('Until'),
314 change
: 'untilChange',
331 xtype
: 'pmxTaskTypeSelector',
332 fieldLabel
: gettext('Task Type'),
333 emptyText
: gettext('All'),
335 value
: '{typefilter}',
340 fieldLabel
: gettext('Task Result'),
341 emptyText
: gettext('All'),
344 ['ok', gettext('OK')],
345 ['unknown', Proxmox
.Utils
.unknownText
],
346 ['warning', gettext('Warnings')],
347 ['error', gettext('Errors')],
350 value
: '{statusfilter}',
361 stripeRows
: false, // does not work with getRowClass()
362 emptyText
: gettext('No Tasks found'),
364 getRowClass: function(record
, index
) {
365 let status
= record
.get('status');
368 let parsed
= Proxmox
.Utils
.parse_task_status(status
);
369 if (parsed
=== 'error') {
370 return "proxmox-invalid-row";
371 } else if (parsed
=== 'warning') {
372 return "proxmox-warning-row";
381 header
: gettext("Start Time"),
382 dataIndex
: 'starttime',
384 renderer: function(value
) {
385 return Ext
.Date
.format(value
, "M d H:i:s");
389 header
: gettext("End Time"),
390 dataIndex
: 'endtime',
392 renderer: function(value
, metaData
, record
) {
394 metaData
.tdCls
= "x-grid-row-loading";
397 return Ext
.Date
.format(value
, "M d H:i:s");
401 header
: gettext("Duration"),
404 renderer: function(value
, metaData
, record
) {
405 let start
= record
.data
.starttime
;
407 let end
= record
.data
.endtime
|| Date
.now();
408 let duration
= end
- start
;
412 return Proxmox
.Utils
.format_duration_human(duration
);
414 return Proxmox
.Utils
.unknownText
;
418 header
: gettext("User name"),
423 header
: gettext("Description"),
426 renderer
: Proxmox
.Utils
.render_upid
,
429 header
: gettext("Status"),
432 renderer: function(value
, metaData
, record
) {
433 if (value
=== undefined && !record
.data
.endtime
) {
434 metaData
.tdCls
= "x-grid-row-loading";
438 return Proxmox
.Utils
.format_task_status(value
);
443 initComponent: function() {
446 let nodename
= me
.nodename
|| 'localhost';
447 let url
= me
.url
|| `/api2/json/nodes/${nodename}/tasks`;
448 me
.getViewModel().set('url', url
);
450 let updateExtraFilters = function(name
, value
) {
451 let vm
= me
.getViewModel();
452 let extraFilter
= Ext
.clone(vm
.get('extraFilter'));
453 extraFilter
[name
] = value
;
454 vm
.set('extraFilter', extraFilter
);
457 for (const [name
, value
] of Object
.entries(me
.preFilter
)) {
458 updateExtraFilters(name
, value
);
463 let addFields = function(items
) {
464 me
.lookup('filtertoolbar').add({
478 // start with a userfilter
482 fieldLabel
: gettext('User name'),
491 for (const filterTemplate
of me
.extraFilter
) {
492 let filter
= Ext
.clone(filterTemplate
);
494 filter
.listeners
= filter
.listeners
|| {};
495 filter
.listeners
.change
= Ext
.apply(filter
.changeOptions
|| {}, {
496 fn: function(field
, value
) {
497 updateExtraFilters(filter
.name
, value
);
502 if (items
.length
=== 2) {