| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- // The index file for the spa running on the summary page
- const React = require('react');
- const ReactDOM = require('react-dom');
- const SummaryTableHeader = require('./summaryTableHeader');
- const SummaryTableLine = require('./summaryTableLine');
- const SummaryHeader = require('./summaryHeader');
- const getChildData = require('./getChildData');
- const FlattenToggle = require('./flattenToggle');
- const FilterToggle = require('./filterToggle');
- const FileBreadcrumbs = require('./fileBreadcrumbs');
- const { setLocation, decodeLocation } = require('./routing');
- const { useState, useMemo, useEffect } = React;
- const sourceData = window.data;
- const metricsToShow = {};
- for (let i = 0; i < window.metricsToShow.length; i++) {
- metricsToShow[window.metricsToShow[i]] = true;
- }
- let firstMount = true;
- function App() {
- const routingDefaults = decodeLocation();
- const [activeSort, setSort] = useState(
- (routingDefaults && routingDefaults.activeSort) || {
- sortKey: 'file',
- order: 'desc'
- }
- );
- const [isFlat, setIsFlat] = useState(
- (routingDefaults && routingDefaults.isFlat) || false
- );
- const [activeFilters, setFilters] = useState(
- (routingDefaults && routingDefaults.activeFilters) || {
- low: true,
- medium: true,
- high: true
- }
- );
- const [expandedLines, setExpandedLines] = useState(
- (routingDefaults && routingDefaults.expandedLines) || []
- );
- const [fileFilter, setFileFilter] = useState(
- (routingDefaults && routingDefaults.fileFilter) || ''
- );
- const childData = useMemo(
- () =>
- getChildData(
- sourceData,
- metricsToShow,
- activeSort,
- isFlat,
- activeFilters,
- fileFilter
- ),
- [activeSort, isFlat, activeFilters, fileFilter]
- );
- const overallMetrics = sourceData.metrics;
- useEffect(() => {
- setLocation(
- firstMount,
- activeSort,
- isFlat,
- activeFilters,
- fileFilter,
- expandedLines
- );
- firstMount = false;
- }, [activeSort, isFlat, activeFilters, fileFilter, expandedLines]);
- useEffect(() => {
- window.onpopstate = () => {
- const routingState = decodeLocation();
- if (routingState) {
- // make sure all the state is set before rendering to avoid url updates
- // alternative is to merge all the states into one so it can be set in one go
- // https://github.com/facebook/react/issues/14259
- ReactDOM.unstable_batchedUpdates(() => {
- setFilters(routingState.activeFilters);
- setSort(routingState.activeSort);
- setIsFlat(routingState.isFlat);
- setExpandedLines(routingState.expandedLines);
- setFileFilter(routingState.fileFilter);
- });
- }
- };
- }, []);
- return (
- <div className="layout">
- <div className="layout__section">
- <SummaryHeader
- metrics={overallMetrics}
- metricsToShow={metricsToShow}
- />
- </div>
- <div className="layout__section">
- <div className="toolbar">
- <div className="toolbar__item">
- <FlattenToggle setIsFlat={setIsFlat} isFlat={isFlat} />
- </div>
- <div className="toolbar__item">
- <FilterToggle
- activeFilters={activeFilters}
- setFilters={setFilters}
- />
- </div>
- </div>
- </div>
- <div className="layout__section">
- <h1>
- <FileBreadcrumbs
- fileFilter={fileFilter}
- setFileFilter={setFileFilter}
- />
- </h1>
- </div>
- <div className="layout__section layout__section--fill">
- <table className="coverage-summary">
- <SummaryTableHeader
- onSort={newSort => {
- setSort(newSort);
- }}
- activeSort={activeSort}
- metricsToShow={metricsToShow}
- />
- <tbody>
- {childData.map(child => (
- <SummaryTableLine
- {...child}
- key={child.file}
- metricsToShow={metricsToShow}
- expandedLines={expandedLines}
- setExpandedLines={setExpandedLines}
- fileFilter={fileFilter}
- setFileFilter={setFileFilter}
- />
- ))}
- </tbody>
- </table>
- </div>
- <div className="layout__section center small quiet">
- Code coverage generated by{' '}
- <a
- href="https://istanbul.js.org/"
- target="_blank"
- rel="noopener noreferrer"
- >
- istanbul
- </a>{' '}
- at {window.generatedDatetime}
- </div>
- </div>
- );
- }
- ReactDOM.render(<App />, document.getElementById('app'));
|