]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - panel/LogView.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.LogView', {
7 extend
: 'Ext.panel.Panel',
8 xtype
: 'proxmoxLogView',
16 // callback for load failure, used for ceph
17 failCallback
: undefined,
20 xclass
: 'Ext.app.ViewController',
22 updateParams: function() {
24 var viewModel
= me
.getViewModel();
25 var since
= viewModel
.get('since');
26 var until
= viewModel
.get('until');
27 if (viewModel
.get('hide_timespan')) {
32 Ext
.Msg
.alert('Error', 'Since date must be less equal than Until date.');
36 viewModel
.set('params.since', Ext
.Date
.format(since
, 'Y-m-d'));
37 viewModel
.set('params.until', Ext
.Date
.format(until
, 'Y-m-d') + ' 23:59:59');
38 me
.getView().loadTask
.delay(200);
41 scrollPosBottom: function() {
42 var view
= this.getView();
43 var pos
= view
.getScrollY();
44 var maxPos
= view
.getScrollable().getMaxPosition().y
;
48 updateView: function(text
, first
, total
) {
50 var view
= me
.getView();
51 var viewModel
= me
.getViewModel();
52 var content
= me
.lookup('content');
53 var data
= viewModel
.get('data');
55 if (first
=== data
.first
&& total
=== data
.total
&& text
.length
=== data
.textlen
) {
56 return; // same content, skip setting and scrolling
58 viewModel
.set('data', {
64 var scrollPos
= me
.scrollPosBottom();
68 if (view
.scrollToEnd
&& scrollPos
<= 0) {
69 // we use setTimeout to work around scroll handling on touchscreens
70 setTimeout(function() { view
.scrollTo(0, Infinity
); }, 10);
76 var view
= me
.getView();
77 var viewModel
= me
.getViewModel();
78 Proxmox
.Utils
.API2Request({
79 url
: me
.getView().url
,
80 params
: viewModel
.get('params'),
82 success: function(response
) {
83 Proxmox
.Utils
.setErrorMask(me
, false);
84 var total
= response
.result
.total
;
85 var lines
= new Array();
88 Ext
.Array
.each(response
.result
.data
, function(line
) {
92 lines
[line
.n
- 1] = Ext
.htmlEncode(line
.t
);
96 me
.updateView(lines
.join('<br>'), first
- 1, total
);
98 failure: function(response
) {
99 if (view
.failCallback
) {
100 view
.failCallback(response
);
102 var msg
= response
.htmlStatus
;
103 Proxmox
.Utils
.setErrorMask(me
, msg
);
109 onScroll: function(x
, y
) {
111 var view
= me
.getView();
112 var viewModel
= me
.getViewModel();
114 var lineHeight
= view
.lineHeight
;
115 var line
= view
.getScrollY()/lineHeight
;
116 var start
= viewModel
.get('params.start');
117 var limit
= viewModel
.get('params.limit');
118 var viewLines
= view
.getHeight()/lineHeight
;
120 var viewStart
= Math
.max(parseInt(line
- 1 - view
.viewBuffer
, 10), 0);
121 var viewEnd
= parseInt(line
+ viewLines
+ 1 + view
.viewBuffer
, 10);
123 if (viewStart
< start
|| viewEnd
> (start
+limit
)) {
124 viewModel
.set('params.start',
125 Math
.max(parseInt(line
- limit
/2 + 10, 10), 0));
126 view
.loadTask
.delay(200);
130 init: function(view
) {
134 throw "no url specified";
137 var viewModel
= this.getViewModel();
138 var since
= new Date();
139 since
.setDate(since
.getDate() - 3);
140 viewModel
.set('until', new Date());
141 viewModel
.set('since', since
);
142 viewModel
.set('params.limit', view
.pageSize
);
143 viewModel
.set('hide_timespan', !view
.log_select_timespan
);
144 me
.lookup('content').setStyle('line-height', view
.lineHeight
+ 'px');
146 view
.loadTask
= new Ext
.util
.DelayedTask(me
.doLoad
, me
);
149 view
.task
= Ext
.TaskManager
.start({
151 if (!view
.isVisible() || !view
.scrollToEnd
) {
155 if (me
.scrollPosBottom() <= 1) {
156 view
.loadTask
.delay(200);
164 onDestroy: function() {
166 me
.loadTask
.cancel();
167 Ext
.TaskManager
.stop(me
.task
);
170 // for user to initiate a load from outside
171 requestUpdate: function() {
173 me
.loadTask
.delay(200);
180 hide_timespan
: false,
199 // we have to have this here, since we cannot listen to events
200 // of the scroller in the viewcontroller (extjs bug?), nor does
201 // the panel have a 'scroll' event'
203 fn: function(scroller
, x
, y
) {
204 var controller
= this.component
.getController();
205 if (controller
) { // on destroy, controller can be gone
206 controller
.onScroll(x
,y
);
216 hidden
: '{hide_timespan}'
245 handler
: 'updateParams'
253 reference
: 'content',
255 font
: 'normal 11px tahoma, arial, verdana, sans-serif',