aboutsummaryrefslogtreecommitdiff
path: root/src/App.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/App.js')
-rw-r--r--src/App.js55
1 files changed, 15 insertions, 40 deletions
diff --git a/src/App.js b/src/App.js
index 347d243..fb77d93 100644
--- a/src/App.js
+++ b/src/App.js
@@ -18,9 +18,10 @@
18 */ 18 */
19 19
20import React, { Component } from 'react'; 20import React, { Component } from 'react';
21import {Parser} from 'xml2js'; 21import { Parser } from 'xml2js';
22import JSZip from 'jszip';
22 23
23import {Counters, SessionInfo, PackagesCoverage} from './Blocks.js'; 24import { Report } from './Report.js';
24import './App.css'; 25import './App.css';
25 26
26class App extends Component { 27class App extends Component {
@@ -28,24 +29,31 @@ class App extends Component {
28 super(props); 29 super(props);
29 this.state = { 30 this.state = {
30 report: null, 31 report: null,
32 sourceSet: null,
31 hasError: false 33 hasError: false
32 }; 34 };
33 } 35 }
34 36
35 componentDidCatch(error, info) { 37 componentDidCatch(error, info) {
36 this.setState({ hasError: true }); 38 this.setState({ hasError: true });
37 console.err(error, info); 39 console.error(error, info);
38 } 40 }
39 41
40 _useReportFile(file) { 42 _useReportFile(file) {
41 const fileReader = new FileReader(); 43 const fileReader = new FileReader();
42 fileReader.onloadend = (readEvent) => this._useReport(readEvent.target.result); 44 fileReader.onloadend = readEvent => this._useReport(readEvent.target.result);
43 fileReader.readAsText(file); 45 fileReader.readAsText(file);
44 } 46 }
45 47
46 _useReport(xmlString) { 48 _useReport(xmlString) {
49 this.setState({ hasError: false });
47 const xmlParser = new Parser(); 50 const xmlParser = new Parser();
48 xmlParser.parseString(xmlString, (err, result) => this.setState({ report: result.report })); 51 xmlParser.parseString(xmlString, (_, result) => this.setState({ report: result.report }));
52 }
53
54 _useSourceArchive(file) {
55 this.setState({ hasError: false });
56 JSZip.loadAsync(file).then(zip => this.setState({ sourceSet: zip.files }));
49 } 57 }
50 58
51 _renderError() { 59 _renderError() {
@@ -58,7 +66,7 @@ class App extends Component {
58 } 66 }
59 67
60 _renderReport() { 68 _renderReport() {
61 return this.state.hasError ? this._renderError(): (<Report report={this.state.report} />); 69 return this.state.hasError ? this._renderError(): (<Report report={this.state.report} sourceSet={this.state.sourceSet} />);
62 } 70 }
63 71
64 render() { 72 render() {
@@ -73,7 +81,7 @@ class App extends Component {
73 81
74 <div> 82 <div>
75 <label htmlFor="sourceJar">Source JAR: </label> 83 <label htmlFor="sourceJar">Source JAR: </label>
76 <input id="sourceJar" type="file" accept=".jar" onChange={event => null} /> 84 <input id="sourceJar" type="file" accept=".jar" onChange={event => this._useSourceArchive(event.target.files[0])} />
77 </div> 85 </div>
78 86
79 <hr /> 87 <hr />
@@ -83,37 +91,4 @@ class App extends Component {
83 } 91 }
84} 92}
85 93
86class Report extends Component {
87 _renderNone() {
88 return (<span>Please provide a JaCoCo XML report file to visualise.</span>);
89 }
90
91 _renderReport() {
92 return (
93 <div>
94 <h2>Viewing report: "{this.props.report.$.name}"</h2>
95
96 <section>
97 <h3>Session info</h3>
98 <SessionInfo data={this.props.report.sessioninfo} />
99 </section>
100
101 <section>
102 <h3>Global coverage</h3>
103 <Counters data={this.props.report.counter} />
104 </section>
105
106 <section>
107 <h3>Details</h3>
108 <PackagesCoverage packages={this.props.report.package} />
109 </section>
110 </div>
111 );
112 }
113
114 render() {
115 return this.props.report ? this._renderReport() : this._renderNone();
116 }
117}
118
119export default App; 94export default App;