+ )
+ }
+
+ render() {
+ return renderRows(row => this._renderRow(row), this.props.packageSourceFiles, false);
+ }
+}
diff --git a/src/CoverageListing.js b/src/CoverageListing.js
new file mode 100644
index 0000000..8b7830c
--- /dev/null
+++ b/src/CoverageListing.js
@@ -0,0 +1,93 @@
+/*
+ * JaCoCo Report Viewer, a web-based coverage report viewer
+ * Copyright (C) 2018 Pacien TRAN-GIRARD
+ * Adam NAILI
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+import React, { Component } from 'react';
+
+export class CoverageListing extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ listingContent: null,
+ coverageMap: null
+ };
+ }
+
+ componentDidMount() {
+ this._updateState();
+ }
+
+ componentDidUpdate(prevProps) {
+ if (this.props.fileName === prevProps.fileName &&
+ this.props.sourceSet === prevProps.sourceSet &&
+ this.props.coverage === prevProps.coverage) return;
+
+ this._updateState();
+ }
+
+ _updateState() {
+ if (!this.props.sourceSet || !(this.props.fileName in this.props.sourceSet)) {
+ this.setState({ listingContent: null });
+ return;
+ }
+
+ this._updateListingContent();
+ this._updateCoverageMap();
+ }
+
+ _updateCoverageMap() {
+ const coverageMap = this.props.coverage.reduce((map, line) => (map[parseInt(line.$.nr)] = line.$, map), {});
+ this.setState({ coverageMap: coverageMap });
+ }
+
+ _updateListingContent() {
+ this.props.sourceSet[this.props.fileName]
+ .async('text')
+ .then(content => this.setState({ listingContent: content }));
+ }
+
+ _renderNone() {
+ return (
);
+ }
+
+ render() {
+ return this.state.listingContent ? this._renderListing() : this._renderNone();
+ }
+}
diff --git a/src/Report.js b/src/Report.js
new file mode 100644
index 0000000..e79b832
--- /dev/null
+++ b/src/Report.js
@@ -0,0 +1,59 @@
+/*
+ * JaCoCo Report Viewer, a web-based coverage report viewer
+ * Copyright (C) 2018 Pacien TRAN-GIRARD
+ * Adam NAILI
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+import React, { Component } from 'react';
+import { Counters, SessionInfo, PackagesCoverage, PackagesSourceCoverage } from './Blocks.js';
+
+export class Report extends Component {
+ _renderNone() {
+ return (Please provide a JaCoCo XML report file to visualise.);
+ }
+
+ _renderReport() {
+ return (
+