]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - 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 comming 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 var viewModel
= me
.getViewModel();
21 var since
= viewModel
.get('since');
22 var 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 var view
= this.getView();
38 var pos
= view
.getScrollY();
39 var maxPos
= view
.getScrollable().getMaxPosition().y
;
43 scrollPosTop: function() {
44 var view
= this.getView();
45 return view
.getScrollY();
48 updateScroll: function(livemode
, num
, scrollPos
, scrollPosTop
) {
50 var view
= me
.getView();
53 setTimeout(function() { view
.scrollTo(0, 0); }, 10);
54 } else if (view
.scrollToEnd
&& scrollPos
<= 0) {
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 var view
= me
.getView();
64 var viewmodel
= me
.getViewModel();
65 if (!viewmodel
|| viewmodel
.get('livemode') !== livemode
) {
66 return; // we switched mode, do not update the content
68 var contentEl
= me
.lookup('content');
70 // save old scrollpositions
71 var scrollPos
= me
.scrollPosBottom();
72 var scrollPosTop
= me
.scrollPosTop();
74 var newend
= lines
.shift();
75 var newstart
= lines
.pop();
77 var num
= lines
.length
;
78 var text
= lines
.map(Ext
.htmlEncode
).join('<br>');
84 view
.content
= 'nothing logged or no timespan selected';
89 view
.content
= view
.content
? text
+ '<br>' + view
.content
: text
;
90 } else if (!top
&& num
) {
91 view
.content
= view
.content
? view
.content
+ '<br>' + text
: text
;
95 if (!top
|| !view
.startcursor
) {
96 view
.startcursor
= newstart
;
99 if (top
|| !view
.endcursor
) {
100 view
.endcursor
= newend
;
104 contentEl
.update(view
.content
);
106 me
.updateScroll(livemode
, num
, scrollPos
, scrollPosTop
);
109 doLoad: function(livemode
, top
, since
, until
) {
116 var view
= me
.getView();
118 lastentries
: view
.numEntries
|| 500,
121 if (!top
&& view
.startcursor
) {
123 startcursor
: view
.startcursor
125 } else if (view
.endcursor
) {
126 params
.endcursor
= view
.endcursor
;
134 Proxmox
.Utils
.API2Request({
137 waitMsgTarget
: (!livemode
) ? view
: undefined,
139 success: function(response
) {
140 Proxmox
.Utils
.setErrorMask(me
, false);
141 var lines
= response
.result
.data
;
142 me
.updateView(lines
, livemode
, top
);
145 me
.requested
= false;
146 view
.loadTask
.delay(200);
149 failure: function(response
) {
150 var msg
= response
.htmlStatus
;
151 Proxmox
.Utils
.setErrorMask(me
, msg
);
154 me
.requested
= false;
155 view
.loadTask
.delay(200);
161 onScroll: function(x
, y
) {
163 var view
= me
.getView();
164 var viewmodel
= me
.getViewModel();
165 var livemode
= viewmodel
.get('livemode');
170 if (me
.scrollPosTop() < 20*view
.lineHeight
) {
171 view
.scrollToEnd
= false;
172 view
.loadTask
.delay(200, undefined, undefined, [true, true]);
173 } else if (me
.scrollPosBottom() <= 1) {
174 view
.scrollToEnd
= true;
178 init: function(view
) {
182 throw "no url specified";
185 var viewmodel
= me
.getViewModel();
186 var viewModel
= this.getViewModel();
187 var since
= new Date();
188 since
.setDate(since
.getDate() - 3);
189 viewModel
.set('until', new Date());
190 viewModel
.set('since', since
);
191 me
.lookup('content').setStyle('line-height', view
.lineHeight
+ 'px');
193 view
.loadTask
= new Ext
.util
.DelayedTask(me
.doLoad
, me
, [true, false]);
196 view
.task
= Ext
.TaskManager
.start({
198 if (!view
.isVisible() || !view
.scrollToEnd
|| !viewmodel
.get('livemode')) {
202 if (me
.scrollPosBottom() <= 1) {
203 view
.loadTask
.delay(200, undefined, undefined, [true, false]);
210 onLiveMode: function() {
212 var view
= me
.getView();
213 delete view
.startcursor
;
214 delete view
.endcursor
;
216 me
.getViewModel().set('livemode', true);
217 view
.scrollToEnd
= true;
218 me
.updateView([], true, false);
221 onTimespan: function() {
223 me
.getViewModel().set('livemode', false);
224 me
.updateView([], false);
228 onDestroy: function() {
230 me
.loadTask
.cancel();
231 Ext
.TaskManager
.stop(me
.task
);
235 // for user to initiate a load from outside
236 requestUpdate: function() {
238 me
.loadTask
.delay(200);
255 // we have to have this here, since we cannot listen to events
256 // of the scroller in the viewcontroller (extjs bug?), nor does
257 // the panel have a 'scroll' event'
259 fn: function(scroller
, x
, y
) {
260 var controller
= this.component
.getController();
261 if (controller
) { // on destroy, controller can be gone
262 controller
.onScroll(x
,y
);
275 xtype
: 'segmentedbutton',
278 text
: gettext('Live Mode'),
280 pressed
: '{livemode}'
282 handler
: 'onLiveMode',
285 text
: gettext('Select Timespan'),
287 pressed
: '{!livemode}'
289 handler
: 'onTimespan',
295 bind
: { disabled
: '{livemode}' },
296 autoEl
: { cn
: gettext('Since') + ':' }
304 disabled
: '{livemode}',
311 bind
: { disabled
: '{livemode}' },
312 autoEl
: { cn
: gettext('Until') + ':' }
320 disabled
: '{livemode}',
328 reference
: 'updateBtn',
329 handler
: 'updateParams',
331 disabled
: '{livemode}'
340 reference
: 'content',
342 font
: 'normal 11px tahoma, arial, verdana, sans-serif',