]> git.proxmox.com Git - pve-manager.git/blame - www/manager/panel/LogView.js
Add descriptive header
[pve-manager.git] / www / manager / panel / LogView.js
CommitLineData
005153a6
EK
1/*
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
5 */
2db7bb6f 6Ext.define('PVE.panel.LogView', {
8815805e
DM
7 extend: 'Ext.panel.Panel',
8
9 alias: ['widget.pveLogView'],
10
11 pageSize: 500,
12
13 lineHeight: 16,
14
15 viewInfo: undefined,
16
17 scrollToEnd: true,
18
19 getMaxDown: function(scrollToEnd) {
20 var me = this;
21
22 var target = me.getTargetEl();
23 var dom = target.dom;
24 if (scrollToEnd) {
25 dom.scrollTop = dom.scrollHeight - dom.clientHeight;
26 }
27
28 var maxDown = dom.scrollHeight - dom.clientHeight -
29 dom.scrollTop;
30
31 return maxDown;
32 },
33
34 updateView: function(start, end, total, text) {
35 var me = this;
36 var el = me.dataCmp.el;
37
38 if (me.viewInfo && me.viewInfo.start === start &&
39 me.viewInfo.end === end && me.viewInfo.total === total &&
40 me.viewInfo.textLength === text.length) {
41 return; // same content
42 }
43
44 var maxDown = me.getMaxDown();
45 var scrollToEnd = (maxDown <= 0) && me.scrollToEnd;
46
233dafba 47 el.setStyle('padding-top', start*me.lineHeight + 'px');
8815805e
DM
48 el.update(text);
49 me.dataCmp.setHeight(total*me.lineHeight);
50
51 if (scrollToEnd) {
52 me.getMaxDown(true);
53 }
54
55 me.viewInfo = {
56 start: start,
57 end: end,
58 total: total,
59 textLength: text.length
60 };
61 },
62
63 doAttemptLoad: function(start) {
64 var me = this;
65
66 PVE.Utils.API2Request({
67 url: me.url,
68 params: {
69 start: start,
70 limit: me.pageSize
71 },
72 method: 'GET',
73 success: function(response) {
5f663f5f 74 PVE.Utils.setErrorMask(me, false);
8815805e
DM
75 var list = response.result.data;
76 var total = response.result.total;
77 var first = 0, last = 0;
78 var text = '';
79 Ext.Array.each(list, function(item) {
80 if (!first|| item.n < first) {
81 first = item.n;
82 }
83 if (!last || item.n > last) {
84 last = item.n;
85 }
86 text = text + Ext.htmlEncode(item.t) + "<br>";
87 });
88
89 if (first && last && total) {
90 me.updateView(first -1 , last -1, total, text);
91 } else {
92 me.updateView(0, 0, 0, '');
93 }
94 },
95 failure: function(response) {
96 var msg = response.htmlStatus;
5f663f5f 97 PVE.Utils.setErrorMask(me, msg);
8815805e
DM
98 }
99 });
100 },
101
102 attemptLoad: function(start) {
103 var me = this;
104 if (!me.loadTask) {
105 me.loadTask = Ext.create('Ext.util.DelayedTask', me.doAttemptLoad, me, []);
106 }
107 me.loadTask.delay(200, me.doAttemptLoad, me, [start]);
108 },
109
2db7bb6f
DM
110 requestUpdate: function(top, force) {
111 var me = this;
112
113 if (top === undefined) {
114 var target = me.getTargetEl();
115 top = target.dom.scrollTop;
116 }
117
db16032c 118 var viewStart = parseInt((top / me.lineHeight) - 1, 10);
2db7bb6f
DM
119 if (viewStart < 0) {
120 viewStart = 0;
121 }
db16032c 122 var viewEnd = parseInt(((top + me.getHeight())/ me.lineHeight) + 1, 10);
2db7bb6f 123 var info = me.viewInfo;
d8340bb4 124
2db7bb6f
DM
125 if (info && !force) {
126 if (viewStart >= info.start && viewEnd <= info.end) {
127 return;
128 }
129 }
d8340bb4 130
db16032c 131 var line = parseInt((top / me.lineHeight) - (me.pageSize / 2) + 10, 10);
2db7bb6f
DM
132 if (line < 0) {
133 line = 0;
134 }
135
136 me.attemptLoad(line);
137 },
8815805e 138
165a9668 139 afterRender: function() {
8815805e
DM
140 var me = this;
141
165a9668
DM
142 me.callParent(arguments);
143
144 Ext.Function.defer(function() {
145 var target = me.getTargetEl();
146 target.on('scroll', function(e) {
147 me.requestUpdate();
148 });
149 me.requestUpdate(0);
150 }, 20);
151 },
8815805e 152
d8340bb4 153 initComponent : function() {
b02087fd
DM
154 /*jslint confusion: true */
155
165a9668 156 var me = this;
8815805e 157
d8340bb4
DM
158 if (!me.url) {
159 throw "no url specified";
160 }
161
162 me.dataCmp = Ext.create('Ext.Component', {
163 style: 'font:normal 11px tahoma, arial, verdana, sans-serif;' +
164 'line-height: ' + me.lineHeight.toString() + 'px; white-space: pre;'
165 });
8815805e 166
165a9668 167 me.task = Ext.TaskManager.start({
8815805e 168 run: function() {
d8340bb4 169 if (!me.isVisible() || !me.scrollToEnd || !me.viewInfo) {
8815805e
DM
170 return;
171 }
d8340bb4 172
2db7bb6f 173 var maxDown = me.getMaxDown();
8815805e
DM
174 if (maxDown > 0) {
175 return;
176 }
177
2db7bb6f 178 me.requestUpdate(undefined, true);
8815805e
DM
179 },
180 interval: 1000
165a9668 181 });
8815805e
DM
182
183 Ext.apply(me, {
184 autoScroll: true,
185 layout: 'auto',
186 items: me.dataCmp,
d8340bb4
DM
187 bodyStyle: 'padding: 5px;',
188 listeners: {
189 show: function() {
190 var target = me.getTargetEl();
191 if (target && target.dom) {
192 target.dom.scrollTop = me.savedScrollTop;
193 }
194 },
195 beforehide: function() {
196 // Hack: chrome reset scrollTop to 0, so we save/restore
197 var target = me.getTargetEl();
198 if (target && target.dom) {
199 me.savedScrollTop = target.dom.scrollTop;
200 }
201 },
202 destroy: function() {
203 Ext.TaskManager.stop(me.task);
204 }
205 }
8815805e
DM
206 });
207
208 me.callParent();
209 }
210});