]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/panel/JournalView.js
2 * Display log entries in a panel with scrollbar
3 * The log entries are automatically refreshed via a background task,
4 * with newest entries coming at the bottom
6 Ext
.define('Proxmox.panel.JournalView', {
7 extend
: 'Ext.panel.Panel',
8 xtype
: 'proxmoxJournalView',
16 xclass
: 'Ext.app.ViewController',
18 updateParams: function() {
20 let viewModel
= me
.getViewModel();
21 let since
= viewModel
.get('since');
22 let until
= viewModel
.get('until');
24 since
.setHours(0, 0, 0, 0);
25 until
.setHours(0, 0, 0, 0);
26 until
.setDate(until
.getDate()+1);
28 me
.getView().loadTask
.delay(200, undefined, undefined, [
31 Ext
.Date
.format(since
, "U"),
32 Ext
.Date
.format(until
, "U"),
36 scrollPosBottom: function() {
37 let view
= this.getView();
38 let pos
= view
.getScrollY();
39 let maxPos
= view
.getScrollable().getMaxPosition().y
;
43 scrollPosTop: function() {
44 let view
= this.getView();
45 return view
.getScrollY();
48 updateScroll: function(livemode
, num
, scrollPos
, scrollPosTop
) {
50 let view
= me
.getView();
53 setTimeout(function() { view
.scrollTo(0, 0); }, 10);
54 } else if (view
.scrollToEnd
&& scrollPos
<= 5) {
55 setTimeout(function() { view
.scrollTo(0, Infinity
); }, 10);
56 } else if (!view
.scrollToEnd
&& scrollPosTop
< 20 * view
.lineHeight
) {
57 setTimeout(function() { view
.scrollTo(0, (num
* view
.lineHeight
) + scrollPosTop
); }, 10);
61 updateView: function(lines
, livemode
, top
) {
63 let view
= me
.getView();
64 let viewmodel
= me
.getViewModel();
65 if (!viewmodel
|| viewmodel
.get('livemode') !== livemode
) {
66 return; // we switched mode, do not update the content
68 let contentEl
= me
.lookup('content');
70 // save old scrollpositions
71 let scrollPos
= me
.scrollPosBottom();
72 let scrollPosTop
= me
.scrollPosTop();
74 let newend
= lines
.shift();
75 let newstart
= lines
.pop();
77 let num
= lines
.length
;
78 let text
= lines
.map(Ext
.htmlEncode
).join('<br>');
80 let contentChanged
= true;
86 view
.content
= 'nothing logged or no timespan selected';
91 view
.content
= view
.content
? text
+ '<br>' + view
.content
: text
;
92 } else if (!top
&& num
) {
93 view
.content
= view
.content
? view
.content
+ '<br>' + text
: text
;
95 contentChanged
= false;
99 if (!top
|| !view
.startcursor
) {
100 view
.startcursor
= newstart
;
103 if (top
|| !view
.endcursor
) {
104 view
.endcursor
= newend
;
108 if (contentChanged
) {
109 contentEl
.update(view
.content
);
112 me
.updateScroll(livemode
, num
, scrollPos
, scrollPosTop
);
115 doLoad: function(livemode
, top
, since
, until
) {
122 let view
= me
.getView();
124 lastentries
: view
.numEntries
|| 500,
127 if (!top
&& view
.startcursor
) {
129 startcursor
: view
.startcursor
,
131 } else if (view
.endcursor
) {
132 params
.endcursor
= view
.endcursor
;
140 Proxmox
.Utils
.API2Request({
143 waitMsgTarget
: !livemode
? view
: undefined,
145 success: function(response
) {
146 if (me
.isDestroyed
) {
149 Proxmox
.Utils
.setErrorMask(me
, false);
150 let lines
= response
.result
.data
;
151 me
.updateView(lines
, livemode
, top
);
154 me
.requested
= false;
155 view
.loadTask
.delay(200);
158 failure: function(response
) {
159 let msg
= response
.htmlStatus
;
160 Proxmox
.Utils
.setErrorMask(me
, msg
);
163 me
.requested
= false;
164 view
.loadTask
.delay(200);
170 onScroll: function(x
, y
) {
172 let view
= me
.getView();
173 let viewmodel
= me
.getViewModel();
174 let livemode
= viewmodel
.get('livemode');
179 if (me
.scrollPosTop() < 20*view
.lineHeight
) {
180 view
.scrollToEnd
= false;
181 view
.loadTask
.delay(200, undefined, undefined, [true, true]);
182 } else if (me
.scrollPosBottom() <= 5) {
183 view
.scrollToEnd
= true;
187 init: function(view
) {
191 throw "no url specified";
194 let viewmodel
= me
.getViewModel();
195 let viewModel
= this.getViewModel();
196 let since
= new Date();
197 since
.setDate(since
.getDate() - 3);
198 viewModel
.set('until', new Date());
199 viewModel
.set('since', since
);
200 me
.lookup('content').setStyle('line-height', view
.lineHeight
+ 'px');
202 view
.loadTask
= new Ext
.util
.DelayedTask(me
.doLoad
, me
, [true, false]);
204 view
.task
= Ext
.TaskManager
.start({
206 if (!view
.isVisible() || !view
.scrollToEnd
|| !viewmodel
.get('livemode')) {
210 if (me
.scrollPosBottom() <= 5) {
211 view
.loadTask
.delay(200, undefined, undefined, [true, false]);
218 onLiveMode: function() {
220 let view
= me
.getView();
221 delete view
.startcursor
;
222 delete view
.endcursor
;
224 me
.getViewModel().set('livemode', true);
225 view
.scrollToEnd
= true;
226 me
.updateView([], true, false);
229 onTimespan: function() {
231 me
.getViewModel().set('livemode', false);
232 me
.updateView([], false);
236 onDestroy: function() {
238 me
.loadTask
.cancel();
239 Ext
.TaskManager
.stop(me
.task
);
243 // for user to initiate a load from outside
244 requestUpdate: function() {
246 me
.loadTask
.delay(200);
263 // we have to have this here, since we cannot listen to events
264 // of the scroller in the viewcontroller (extjs bug?), nor does
265 // the panel have a 'scroll' event'
267 fn: function(scroller
, x
, y
) {
268 let controller
= this.component
.getController();
269 if (controller
) { // on destroy, controller can be gone
270 controller
.onScroll(x
, y
);
283 xtype
: 'segmentedbutton',
286 text
: gettext('Live Mode'),
288 pressed
: '{livemode}',
290 handler
: 'onLiveMode',
293 text
: gettext('Select Timespan'),
295 pressed
: '{!livemode}',
297 handler
: 'onTimespan',
303 bind
: { disabled
: '{livemode}' },
304 autoEl
: { cn
: gettext('Since') + ':' },
312 disabled
: '{livemode}',
319 bind
: { disabled
: '{livemode}' },
320 autoEl
: { cn
: gettext('Until') + ':' },
328 disabled
: '{livemode}',
336 reference
: 'updateBtn',
337 handler
: 'updateParams',
339 disabled
: '{livemode}',
348 reference
: 'content',
350 font
: 'normal 11px tahoma, arial, verdana, sans-serif',
351 'white-space': 'pre',