]>
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
.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>');
81 view
.content
= num
? text
: 'no content';
85 view
.content
= view
.content
? text
+ '<br>' + view
.content
: text
;
86 } else if (!top
&& num
) {
87 view
.content
= view
.content
? view
.content
+ '<br>' + text
: text
;
91 if (!top
|| !view
.startcursor
) {
92 view
.startcursor
= newstart
;
95 if (top
|| !view
.endcursor
) {
96 view
.endcursor
= newend
;
100 contentEl
.update(view
.content
);
102 me
.updateScroll(livemode
, num
, scrollPos
, scrollPosTop
);
105 doLoad: function(livemode
, top
, since
, until
) {
112 var view
= me
.getView();
114 lastentries
: view
.numEntries
|| 500,
117 if (!top
&& view
.startcursor
) {
119 startcursor
: view
.startcursor
121 } else if (view
.endcursor
) {
122 params
.endcursor
= view
.endcursor
;
130 Proxmox
.Utils
.API2Request({
133 waitMsgTarget
: (!livemode
) ? view
: undefined,
135 success: function(response
) {
136 Proxmox
.Utils
.setErrorMask(me
, false);
137 var lines
= response
.result
.data
;
138 me
.updateView(lines
, livemode
, top
);
141 me
.requested
= false;
142 view
.loadTask
.delay(200);
145 failure: function(response
) {
146 var msg
= response
.htmlStatus
;
147 Proxmox
.Utils
.setErrorMask(me
, msg
);
150 me
.requested
= false;
151 view
.loadTask
.delay(200);
157 onScroll: function(x
, y
) {
159 var view
= me
.getView();
160 var viewmodel
= me
.getViewModel();
161 var livemode
= viewmodel
.get('livemode');
166 if (me
.scrollPosTop() < 20*view
.lineHeight
) {
167 view
.scrollToEnd
= false;
168 view
.loadTask
.delay(200, undefined, undefined, [true, true]);
169 } else if (me
.scrollPosBottom() <= 1) {
170 view
.scrollToEnd
= true;
174 init: function(view
) {
178 throw "no url specified";
181 var viewmodel
= me
.getViewModel();
182 var viewModel
= this.getViewModel();
183 var since
= new Date();
184 since
.setDate(since
.getDate() - 3);
185 viewModel
.set('until', new Date());
186 viewModel
.set('since', since
);
187 me
.lookup('content').setStyle('line-height', view
.lineHeight
+ 'px');
189 view
.loadTask
= new Ext
.util
.DelayedTask(me
.doLoad
, me
, [true, false]);
192 view
.task
= Ext
.TaskManager
.start({
194 if (!view
.isVisible() || !view
.scrollToEnd
|| !viewmodel
.get('livemode')) {
198 if (me
.scrollPosBottom() <= 1) {
199 view
.loadTask
.delay(200, undefined, undefined, [true, false]);
206 onLiveMode: function() {
208 var view
= me
.getView();
209 delete view
.startcursor
;
210 delete view
.endcursor
;
212 me
.getViewModel().set('livemode', true);
213 view
.scrollToEnd
= true;
214 me
.updateView([], true, false);
217 onTimespan: function() {
219 me
.getViewModel().set('livemode', false);
220 me
.updateView([], false);
224 onDestroy: function() {
226 me
.loadTask
.cancel();
227 Ext
.TaskManager
.stop(me
.task
);
231 // for user to initiate a load from outside
232 requestUpdate: function() {
234 me
.loadTask
.delay(200);
251 // we have to have this here, since we cannot listen to events
252 // of the scroller in the viewcontroller (extjs bug?), nor does
253 // the panel have a 'scroll' event'
255 fn: function(scroller
, x
, y
) {
256 var controller
= this.component
.getController();
257 if (controller
) { // on destroy, controller can be gone
258 controller
.onScroll(x
,y
);
271 xtype
: 'segmentedbutton',
274 text
: gettext('Live Mode'),
276 pressed
: '{livemode}'
278 handler
: 'onLiveMode',
281 text
: gettext('Select Timespan'),
283 pressed
: '{!livemode}'
285 handler
: 'onTimespan',
291 fieldLabel
: gettext('Since'),
296 disabled
: '{livemode}',
303 fieldLabel
: gettext('Until'),
308 disabled
: '{livemode}',
316 reference
: 'updateBtn',
317 handler
: 'updateParams',
319 disabled
: '{livemode}'
328 reference
: 'content',
330 font
: 'normal 11px tahoma, arial, verdana, sans-serif',