]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - panel/LogView.js
aae7440f586cd88f3d6a24bf17e0a986e8a40d9e
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);
77 var view
= me
.getView();
78 var viewModel
= me
.getViewModel();
79 Proxmox
.Utils
.API2Request({
80 url
: me
.getView().url
,
81 params
: viewModel
.get('params'),
83 success: function(response
) {
84 Proxmox
.Utils
.setErrorMask(me
, false);
85 var total
= response
.result
.total
;
86 var lines
= new Array();
89 Ext
.Array
.each(response
.result
.data
, function(line
) {
93 lines
[line
.n
- 1] = Ext
.htmlEncode(line
.t
);
97 me
.updateView(lines
.join('<br>'), first
- 1, total
);
100 failure: function(response
) {
101 if (view
.failCallback
) {
102 view
.failCallback(response
);
104 var msg
= response
.htmlStatus
;
105 Proxmox
.Utils
.setErrorMask(me
, msg
);
112 onScroll: function(x
, y
) {
114 var view
= me
.getView();
115 var viewModel
= me
.getViewModel();
117 var lineHeight
= view
.lineHeight
;
118 var line
= view
.getScrollY()/lineHeight
;
119 var start
= viewModel
.get('params.start');
120 var limit
= viewModel
.get('params.limit');
121 var viewLines
= view
.getHeight()/lineHeight
;
123 var viewStart
= Math
.max(parseInt(line
- 1 - view
.viewBuffer
, 10), 0);
124 var viewEnd
= parseInt(line
+ viewLines
+ 1 + view
.viewBuffer
, 10);
126 if (viewStart
< start
|| viewEnd
> (start
+limit
)) {
127 viewModel
.set('params.start',
128 Math
.max(parseInt(line
- limit
/2 + 10, 10), 0));
129 view
.loadTask
.delay(200);
133 init: function(view
) {
137 throw "no url specified";
140 var viewModel
= this.getViewModel();
141 var since
= new Date();
142 since
.setDate(since
.getDate() - 3);
143 viewModel
.set('until', new Date());
144 viewModel
.set('since', since
);
145 viewModel
.set('params.limit', view
.pageSize
);
146 viewModel
.set('hide_timespan', !view
.log_select_timespan
);
147 me
.lookup('content').setStyle('line-height', view
.lineHeight
+ 'px');
149 view
.loadTask
= new Ext
.util
.DelayedTask(me
.doLoad
, me
);
152 view
.task
= Ext
.TaskManager
.start({
154 if (!view
.isVisible() || !view
.scrollToEnd
) {
158 if (me
.scrollPosBottom() <= 1) {
160 view
.loadTask
.delay(200);
169 onDestroy: function() {
171 me
.loadTask
.cancel();
172 Ext
.TaskManager
.stop(me
.task
);
175 // for user to initiate a load from outside
176 requestUpdate: function() {
178 me
.loadTask
.delay(200);
185 hide_timespan
: false,
204 // we have to have this here, since we cannot listen to events
205 // of the scroller in the viewcontroller (extjs bug?), nor does
206 // the panel have a 'scroll' event'
208 fn: function(scroller
, x
, y
) {
209 var controller
= this.component
.getController();
210 if (controller
) { // on destroy, controller can be gone
211 controller
.onScroll(x
,y
);
221 hidden
: '{hide_timespan}'
250 handler
: 'updateParams'
258 reference
: 'content',
260 font
: 'normal 11px tahoma, arial, verdana, sans-serif',