]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/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 let viewModel
= me
.getViewModel();
25 let since
= viewModel
.get('since');
26 let 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 let view
= this.getView();
43 let pos
= view
.getScrollY();
44 let maxPos
= view
.getScrollable().getMaxPosition().y
;
48 updateView: function(text
, first
, total
) {
50 let view
= me
.getView();
51 let viewModel
= me
.getViewModel();
52 let content
= me
.lookup('content');
53 let 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 let scrollPos
= me
.scrollPosBottom();
68 if (view
.scrollToEnd
&& scrollPos
<= 5) {
69 // we use setTimeout to work around scroll handling on touchscreens
70 setTimeout(function() { view
.scrollTo(0, Infinity
); }, 10);
81 let view
= me
.getView();
82 let viewModel
= me
.getViewModel();
83 Proxmox
.Utils
.API2Request({
84 url
: me
.getView().url
,
85 params
: viewModel
.get('params'),
87 success: function(response
) {
88 Proxmox
.Utils
.setErrorMask(me
, false);
89 let total
= response
.result
.total
;
93 Ext
.Array
.each(response
.result
.data
, function(line
) {
97 lines
[line
.n
- 1] = Ext
.htmlEncode(line
.t
);
100 lines
.length
= total
;
101 me
.updateView(lines
.join('<br>'), first
- 1, total
);
104 me
.requested
= false;
105 view
.loadTask
.delay(200);
108 failure: function(response
) {
109 if (view
.failCallback
) {
110 view
.failCallback(response
);
112 let msg
= response
.htmlStatus
;
113 Proxmox
.Utils
.setErrorMask(me
, msg
);
117 me
.requested
= false;
118 view
.loadTask
.delay(200);
124 onScroll: function(x
, y
) {
126 let view
= me
.getView();
127 let viewModel
= me
.getViewModel();
129 let lineHeight
= view
.lineHeight
;
130 let line
= view
.getScrollY()/lineHeight
;
131 let start
= viewModel
.get('params.start');
132 let limit
= viewModel
.get('params.limit');
133 let viewLines
= view
.getHeight()/lineHeight
;
135 let viewStart
= Math
.max(parseInt(line
- 1 - view
.viewBuffer
, 10), 0);
136 let viewEnd
= parseInt(line
+ viewLines
+ 1 + view
.viewBuffer
, 10);
138 if (viewStart
< start
|| viewEnd
> start
+limit
) {
139 viewModel
.set('params.start',
140 Math
.max(parseInt(line
- (limit
/ 2) + 10, 10), 0));
141 view
.loadTask
.delay(200);
145 init: function(view
) {
149 throw "no url specified";
152 let viewModel
= this.getViewModel();
153 let since
= new Date();
154 since
.setDate(since
.getDate() - 3);
155 viewModel
.set('until', new Date());
156 viewModel
.set('since', since
);
157 viewModel
.set('params.limit', view
.pageSize
);
158 viewModel
.set('hide_timespan', !view
.log_select_timespan
);
159 me
.lookup('content').setStyle('line-height', view
.lineHeight
+ 'px');
161 view
.loadTask
= new Ext
.util
.DelayedTask(me
.doLoad
, me
);
164 view
.task
= Ext
.TaskManager
.start({
166 if (!view
.isVisible() || !view
.scrollToEnd
) {
170 if (me
.scrollPosBottom() <= 5) {
171 view
.loadTask
.delay(200);
179 onDestroy: function() {
181 me
.loadTask
.cancel();
182 Ext
.TaskManager
.stop(me
.task
);
185 // for user to initiate a load from outside
186 requestUpdate: function() {
188 me
.loadTask
.delay(200);
195 hide_timespan
: false,
214 // we have to have this here, since we cannot listen to events
215 // of the scroller in the viewcontroller (extjs bug?), nor does
216 // the panel have a 'scroll' event'
218 fn: function(scroller
, x
, y
) {
219 let controller
= this.component
.getController();
220 if (controller
) { // on destroy, controller can be gone
221 controller
.onScroll(x
, y
);
231 hidden
: '{hide_timespan}',
260 handler
: 'updateParams',
268 reference
: 'content',
270 font
: 'normal 11px tahoma, arial, verdana, sans-serif',
271 'white-space': 'pre',