]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/node/Tasks.js
1fa6a8348b3e74793a31acb177baed152202aef5
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',
96 filterIcon
: (get) => 'fa fa-filter' + (get('showFilter') ? ' info-blue' : ''),
97 extraParams: function(get) {
100 if (get('typefilter')) {
101 params
.typefilter
= get('typefilter');
103 if (get('statusfilter')) {
104 params
.statusfilter
= get('statusfilter');
106 if (get('datastore')) {
107 params
.store
= get('datastore');
110 if (get('extraFilter')) {
111 let extraFilter
= get('extraFilter');
112 for (const [name
, value
] of Object
.entries(extraFilter
)) {
113 if (value
!== undefined && value
!== null && value
!== "") {
114 params
[name
] = value
;
120 params
.since
= get('since').valueOf()/1000;
124 let until
= new Date(get('until').getTime()); // copy object
125 until
.setDate(until
.getDate() + 1); // end of the day
126 params
.until
= until
.valueOf()/1000;
129 me
.getView().getStore().load();
141 model
: 'proxmox-tasks',
146 extraParams
: '{extraParams}',
147 url
: "/api2/json/nodes/localhost/tasks",
150 prefetch
: 'updateLayout',
157 store
: '{bufferedstore}',
165 xtype
: 'proxmoxButton',
166 text
: gettext('View'),
167 iconCls
: 'fa fa-window-restore',
169 handler
: 'showTaskLog',
173 text
: gettext('Reload'),
174 iconCls
: 'fa fa-refresh',
182 iconCls
: '{filterIcon}',
184 text
: gettext('Filter'),
186 stateId
: 'task-showfilter',
187 stateEvents
: ['toggle'],
188 applyState: function(state
) {
189 if (state
.pressed
!== undefined) {
190 this.setPressed(state
.pressed
);
193 getState: function() {
195 pressed
: this.pressed
,
199 toggle
: 'showFilter',
207 reference
: 'filtertoolbar',
213 hidden
: '{!showFilter}',
226 // cannot bind the values directly, as it then changes also
227 // on blur, causing wrong reloads of the store
231 fieldLabel
: gettext('Since'),
237 change
: 'sinceChange',
242 fieldLabel
: gettext('Until'),
248 change
: 'untilChange',
265 xtype
: 'pmxTaskTypeSelector',
266 fieldLabel
: gettext('Task Type'),
267 emptyText
: gettext('All'),
269 value
: '{typefilter}',
274 fieldLabel
: gettext('Task Result'),
275 emptyText
: gettext('All'),
278 ['ok', gettext('OK')],
279 ['unknown', Proxmox
.Utils
.unknownText
],
280 ['warning', gettext('Warnings')],
281 ['error', gettext('Errors')],
284 value
: '{statusfilter}',
295 stripeRows
: false, // does not work with getRowClass()
296 emptyText
: gettext('No Tasks found'),
298 getRowClass: function(record
, index
) {
299 let status
= record
.get('status');
302 let parsed
= Proxmox
.Utils
.parse_task_status(status
);
303 if (parsed
=== 'error') {
304 return "proxmox-invalid-row";
305 } else if (parsed
=== 'warning') {
306 return "proxmox-warning-row";
315 header
: gettext("Start Time"),
316 dataIndex
: 'starttime',
318 renderer: function(value
) {
319 return Ext
.Date
.format(value
, "M d H:i:s");
323 header
: gettext("End Time"),
324 dataIndex
: 'endtime',
326 renderer: function(value
, metaData
, record
) {
328 metaData
.tdCls
= "x-grid-row-loading";
331 return Ext
.Date
.format(value
, "M d H:i:s");
335 header
: gettext("Duration"),
338 renderer: function(value
, metaData
, record
) {
339 let start
= record
.data
.starttime
;
341 let end
= record
.data
.endtime
|| Date
.now();
342 let duration
= end
- start
;
346 return Proxmox
.Utils
.format_duration_human(duration
);
348 return Proxmox
.Utils
.unknownText
;
352 header
: gettext("User name"),
357 header
: gettext("Description"),
360 renderer
: Proxmox
.Utils
.render_upid
,
363 header
: gettext("Status"),
366 renderer: function(value
, metaData
, record
) {
367 if (value
=== undefined && !record
.data
.endtime
) {
368 metaData
.tdCls
= "x-grid-row-loading";
372 let parsed
= Proxmox
.Utils
.parse_task_status(value
);
374 case 'unknown': return Proxmox
.Utils
.unknownText
;
375 case 'error': return Proxmox
.Utils
.errorText
+ ': ' + value
;
376 case 'ok': // fall-through
377 case 'warning': // fall-through
378 default: return value
;
384 initComponent: function() {
387 let updateExtraFilters = function(name
, value
) {
388 let vm
= me
.getViewModel();
389 let extraFilter
= Ext
.clone(vm
.get('extraFilter'));
390 extraFilter
[name
] = value
;
391 vm
.set('extraFilter', extraFilter
);
394 for (const [name
, value
] of Object
.entries(me
.preFilter
)) {
395 updateExtraFilters(name
, value
);
400 let addFields = function(items
) {
401 me
.lookup('filtertoolbar').add({
415 // start with a userfilter
419 fieldLabel
: gettext('User name'),
428 for (const filterTemplate
of me
.extraFilter
) {
429 let filter
= Ext
.clone(filterTemplate
);
431 filter
.listeners
= filter
.listeners
|| {};
432 filter
.listeners
.change
= Ext
.apply(filter
.changeOptions
|| {}, {
433 fn: function(field
, value
) {
434 updateExtraFilters(filter
.name
, value
);
439 if (items
.length
=== 2) {