]>
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 coming 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(lines
, 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
&& lines
.length
=== data
.lines
) {
56 return; // same content, skip setting and scrolling
58 viewModel
.set('data', {
64 let scrollPos
= me
.scrollPosBottom();
65 let scrollToBottom
= view
.scrollToEnd
&& scrollPos
<= 5;
67 if (!scrollToBottom
) {
68 // so that we have the 'correct' height for the text
72 content
.update(lines
.join('<br>'));
75 let scroller
= view
.getScrollable();
76 scroller
.suspendEvent('scroll');
77 view
.scrollTo(0, Infinity
);
79 scroller
.resumeEvent('scroll');
90 let view
= me
.getView();
91 let viewModel
= me
.getViewModel();
92 Proxmox
.Utils
.API2Request({
93 url
: me
.getView().url
,
94 params
: viewModel
.get('params'),
96 success: function(response
) {
97 Proxmox
.Utils
.setErrorMask(me
, false);
98 let total
= response
.result
.total
;
100 let first
= Infinity
;
102 Ext
.Array
.each(response
.result
.data
, function(line
) {
103 if (first
> line
.n
) {
106 lines
[line
.n
- 1] = Ext
.htmlEncode(line
.t
);
109 me
.updateView(lines
, first
- 1, total
);
112 me
.requested
= false;
113 view
.loadTask
.delay(200);
116 failure: function(response
) {
117 if (view
.failCallback
) {
118 view
.failCallback(response
);
120 let msg
= response
.htmlStatus
;
121 Proxmox
.Utils
.setErrorMask(me
, msg
);
125 me
.requested
= false;
126 view
.loadTask
.delay(200);
132 updateStart: function(scrolledToBottom
, targetLine
) {
134 let view
= me
.getView(), viewModel
= me
.getViewModel();
136 let limit
= viewModel
.get('params.limit');
137 let total
= viewModel
.get('data.total');
139 // heuristic: scroll up? -> load more in front; scroll down? -> load more at end
140 let startRatio
= view
.lastTargetLine
&& view
.lastTargetLine
> targetLine
? 2/3 : 1/3;
141 view
.lastTargetLine
= targetLine
;
143 let newStart
= scrolledToBottom
144 ? Math
.trunc(total
- limit
, 10)
145 : Math
.trunc(targetLine
- (startRatio
* limit
) + 10);
147 viewModel
.set('params.start', Math
.max(newStart
, 0));
149 view
.loadTask
.delay(200);
152 onScroll: function(x
, y
) {
154 let view
= me
.getView(), viewModel
= me
.getViewModel();
156 let line
= view
.getScrollY() / view
.lineHeight
;
157 let viewLines
= view
.getHeight() / view
.lineHeight
;
159 let viewStart
= Math
.max(Math
.trunc(line
- 1 - view
.viewBuffer
), 0);
160 let viewEnd
= Math
.trunc(line
+ viewLines
+ 1 + view
.viewBuffer
);
162 let { start
, limit
} = viewModel
.get('params');
164 let margin
= start
< 20 ? 0 : 20;
166 if (viewStart
< start
+ margin
|| viewEnd
> start
+ limit
- margin
) {
167 me
.updateStart(false, line
);
171 init: function(view
) {
175 throw "no url specified";
178 let viewModel
= this.getViewModel();
179 let since
= new Date();
180 since
.setDate(since
.getDate() - 3);
181 viewModel
.set('until', new Date());
182 viewModel
.set('since', since
);
183 viewModel
.set('params.limit', view
.pageSize
);
184 viewModel
.set('hide_timespan', !view
.log_select_timespan
);
185 me
.lookup('content').setStyle('line-height', `${view.lineHeight}px`);
187 view
.loadTask
= new Ext
.util
.DelayedTask(me
.doLoad
, me
);
190 view
.task
= Ext
.TaskManager
.start({
192 if (!view
.isVisible() || !view
.scrollToEnd
) {
195 if (me
.scrollPosBottom() <= 5) {
196 view
.loadTask
.delay(200);
204 onDestroy: function() {
206 me
.loadTask
.cancel();
207 Ext
.TaskManager
.stop(me
.task
);
210 // for user to initiate a load from outside
211 requestUpdate: function() {
213 me
.loadTask
.delay(200);
220 hide_timespan
: false,
239 // we have to have this here, since we cannot listen to events of the scroller in
240 // the viewcontroller (extjs bug?), nor does the panel have a 'scroll' event'
242 fn: function(scroller
, x
, y
) {
243 let controller
= this.component
.getController();
244 if (controller
) { // on destroy, controller can be gone
245 controller
.onScroll(x
, y
);
255 hidden
: '{hide_timespan}',
284 handler
: 'updateParams',
292 reference
: 'content',
294 font
: 'normal 11px tahoma, arial, verdana, sans-serif',
295 'white-space': 'pre',