Skip to content

Commit 51820db

Browse files
committed
better exception view and infinite scroll
1 parent 2562fe1 commit 51820db

File tree

6 files changed

+63
-24
lines changed

6 files changed

+63
-24
lines changed

build/.gitkeep

Whitespace-only changes.

css/app.css

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,20 @@ table.logs td, table.logs th {
1010
padding: .8em;
1111
text-align: left;
1212
font-weight: normal;
13+
position: relative;
1314
}
1415

15-
/*levels = ['Debug', 'Info', 'Warning', 'Error', 'Fatal'];*/
16+
table.logs .time {
17+
width: 100px;
18+
}
19+
20+
table.logs .app {
21+
width: 150px;
22+
}
23+
24+
table.logs .level {
25+
width: 100px;
26+
}
1627

1728
/*info*/
1829
table.logs tr.level_1 {
@@ -43,6 +54,21 @@ span.exceptionRow {
4354
width: 100%;
4455
}
4556

57+
span.exceptionRow.retracted::after, span.exceptionRow.expanded::after {
58+
position: absolute;
59+
top: 0px;
60+
right: 0px;
61+
margin: 10px;
62+
}
63+
64+
span.exceptionRow.retracted::after {
65+
content: '▼';
66+
}
67+
68+
span.exceptionRow.expanded::after {
69+
content: '▲';
70+
}
71+
4672
ol.trace {
4773
padding-top: 0.5em;
4874
}

js/App.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,49 @@
1-
import {Component} from 'react/addons';
1+
import React, {Component} from 'react/addons';
2+
import {decorate} from 'react-mixin';
3+
import ReactScrolla from 'react-scrolla';
24

35
import {LogProvider} from './Providers/LogProvider.js';
46
import {LogTable} from './Components/LogTable.js';
57
import {SideBar} from './Components/SideBar.js';
68

79
export class App extends Component {
810
state = {
9-
'entries': []
11+
'entries': [],
12+
'loading': false
1013
};
1114

1215
constructor () {
1316
super();
14-
this.logProvider = new LogProvider();
17+
this.logProvider = new LogProvider(25);
1518
this.logProvider.on('entries', entries => {
1619
this.setState({entries});
1720
});
1821
this.logProvider.load();
1922
}
2023

24+
fetchNextPage = async() => {
25+
this.setState({loading: true});
26+
this.logProvider.limit += 25;
27+
await this.logProvider.load();
28+
this.setState({loading: false});
29+
};
30+
2131
render () {
2232
return (
2333
<div id="content" role="main" className={"app-" + this.props.appId}>
2434
<SideBar>
25-
<p>test1</p>
35+
<p>Dummy 1</p>
2636

27-
<p>test2</p>
37+
<p>Dummy 2</p>
2838
</SideBar>
2939

30-
<div id="app-content">
40+
<ReactScrolla
41+
id="app-content"
42+
percentage={85}
43+
onPercentage={this.fetchNextPage}
44+
isLoading={this.state.loading}>
3145
<LogTable entries={this.state.entries}/>
32-
</div>
46+
</ReactScrolla>
3347
</div>
3448
);
3549
}

js/Components/Exception.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ export class Exception extends Component {
1616
var trace = this.props.Trace.split('\n');
1717
var traceElements;
1818
if (this.state.expanded) {
19-
traceElements = trace.map(line => {
19+
traceElements = trace.map((line, i) => {
2020
return (
21-
<TraceLine line={line}/>
21+
<TraceLine key={i} line={line}/>
2222
);
2323
});
2424
traceElements = (
@@ -30,10 +30,11 @@ export class Exception extends Component {
3030
traceElements = [];
3131
}
3232
return (
33-
<span className="exceptionRow" onClick={this.clickHandler}>
33+
<span
34+
className={"exceptionRow " + (this.state.expanded ? 'expanded':'retracted')}
35+
onClick={this.clickHandler}>
3436
<span className="exception">{this.props.Exception}</span>:&nbsp;
3537
<span className="message">{this.props.Message}</span>
36-
&nbsp;{this.state.expanded ? '▲' : '▼'}
3738
{traceElements}
3839
</span>
3940
);

js/Providers/LogProvider.js

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,29 @@ export class LogProvider extends EventEmitter {
77

88
_limit = 0;
99

10-
constructor (limit = 25) {
10+
constructor (limit = 50) {
1111
super();
12-
this._limit = limit;
13-
}
14-
15-
get limit () {
16-
return this._limit;
17-
}
18-
19-
set limit (newLimit) {
20-
this._limit = newLimit;
21-
this.load();
12+
this.loading = false;
13+
this.limit = limit;
2214
}
2315

2416
get entries () {
2517
return cachedEntries;
2618
}
2719

2820
async load () {
21+
this.loading = true;
2922
if (this.cachedEntries.length >= this.limit) {
23+
console.log('got ' + this.cachedEntries.length + 'entries');
3024
return;
3125
}
3226
var newData = await this.loadEntries(this.cachedEntries.length, this.limit - this.cachedEntries.length);
3327
this.cachedEntries = this.cachedEntries.concat(newData.data);
28+
this.loading = false;
3429
this.emit('entries', this.cachedEntries);
3530
}
3631

37-
loadEntries (offset, count = 25) {
32+
loadEntries (offset, count = 50) {
3833
return $.get(OC.generateUrl('/settings/admin/log/entries'), {
3934
offset,
4035
count

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020
},
2121
"dependencies": {
2222
"babel-runtime": "^5.8.3",
23+
"envify": "^3.4.0",
2324
"react": "^0.13.3",
25+
"react-mixin": "^1.6.0",
26+
"react-scrolla": "^0.1.0",
2427
"react-time": "^3.0.0"
2528
}
2629
}

0 commit comments

Comments
 (0)