]> git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/node/Tasks.js
cleanly separate sources from package build, move to own folder
[proxmox-widget-toolkit.git] / src / node / Tasks.js
1 Ext.define('Proxmox.node.Tasks', {
2 extend: 'Ext.grid.GridPanel',
3
4 alias: ['widget.proxmoxNodeTasks'],
5 stateful: true,
6 stateId: 'grid-node-tasks',
7 loadMask: true,
8 sortableColumns: false,
9 vmidFilter: 0,
10
11 initComponent: function() {
12 let me = this;
13
14 if (!me.nodename) {
15 throw "no node name specified";
16 }
17
18 let store = Ext.create('Ext.data.BufferedStore', {
19 pageSize: 500,
20 autoLoad: true,
21 remoteFilter: true,
22 model: 'proxmox-tasks',
23 proxy: {
24 type: 'proxmox',
25 startParam: 'start',
26 limitParam: 'limit',
27 url: "/api2/json/nodes/" + me.nodename + "/tasks",
28 },
29 });
30
31 let userfilter = '';
32 let filter_errors = 0;
33
34 let updateProxyParams = function() {
35 let params = {
36 errors: filter_errors,
37 };
38 if (userfilter) {
39 params.userfilter = userfilter;
40 }
41 if (me.vmidFilter) {
42 params.vmid = me.vmidFilter;
43 }
44 store.proxy.extraParams = params;
45 };
46
47 updateProxyParams();
48
49 let reload_task = Ext.create('Ext.util.DelayedTask', function() {
50 updateProxyParams();
51 store.reload();
52 });
53
54 let run_task_viewer = function() {
55 let sm = me.getSelectionModel();
56 let rec = sm.getSelection()[0];
57 if (!rec) {
58 return;
59 }
60
61 let win = Ext.create('Proxmox.window.TaskViewer', {
62 upid: rec.data.upid,
63 });
64 win.show();
65 };
66
67 let view_btn = new Ext.Button({
68 text: gettext('View'),
69 disabled: true,
70 handler: run_task_viewer,
71 });
72
73 Proxmox.Utils.monStoreErrors(me, store, true);
74
75 Ext.apply(me, {
76 store: store,
77 viewConfig: {
78 trackOver: false,
79 stripeRows: false, // does not work with getRowClass()
80
81 getRowClass: function(record, index) {
82 let status = record.get('status');
83
84 if (status && status !== 'OK') {
85 return "proxmox-invalid-row";
86 }
87 return '';
88 },
89 },
90 tbar: [
91 view_btn,
92 {
93 text: gettext('Refresh'), // FIXME: smart-auto-refresh store
94 handler: () => store.reload(),
95 },
96 '->',
97 gettext('User name') +':',
98 ' ',
99 {
100 xtype: 'textfield',
101 width: 200,
102 value: userfilter,
103 enableKeyEvents: true,
104 listeners: {
105 keyup: function(field, e) {
106 userfilter = field.getValue();
107 reload_task.delay(500);
108 },
109 },
110 }, ' ', gettext('Only Errors') + ':', ' ',
111 {
112 xtype: 'checkbox',
113 hideLabel: true,
114 checked: filter_errors,
115 listeners: {
116 change: function(field, checked) {
117 filter_errors = checked ? 1 : 0;
118 reload_task.delay(10);
119 },
120 },
121 }, ' ',
122 ],
123 columns: [
124 {
125 header: gettext("Start Time"),
126 dataIndex: 'starttime',
127 width: 130,
128 renderer: function(value) {
129 return Ext.Date.format(value, "M d H:i:s");
130 },
131 },
132 {
133 header: gettext("End Time"),
134 dataIndex: 'endtime',
135 width: 130,
136 renderer: function(value, metaData, record) {
137 if (!value) {
138 metaData.tdCls = "x-grid-row-loading";
139 return '';
140 }
141 return Ext.Date.format(value, "M d H:i:s");
142 },
143 },
144 {
145 header: gettext("Node"),
146 dataIndex: 'node',
147 width: 120,
148 },
149 {
150 header: gettext("User name"),
151 dataIndex: 'user',
152 width: 150,
153 },
154 {
155 header: gettext("Description"),
156 dataIndex: 'upid',
157 flex: 1,
158 renderer: Proxmox.Utils.render_upid,
159 },
160 {
161 header: gettext("Status"),
162 dataIndex: 'status',
163 width: 200,
164 renderer: function(value, metaData, record) {
165 if (value === 'OK') {
166 return 'OK';
167 }
168 if (value === undefined && !record.data.endtime) {
169 metaData.tdCls = "x-grid-row-loading";
170 return '';
171 }
172 return "ERROR: " + value;
173 },
174 },
175 ],
176 listeners: {
177 itemdblclick: run_task_viewer,
178 selectionchange: function(v, selections) {
179 view_btn.setDisabled(!(selections && selections[0]));
180 },
181 show: function() { reload_task.delay(10); },
182 destroy: function() { reload_task.cancel(); },
183 },
184 });
185
186 me.callParent();
187 },
188 });