[6a3a178] | 1 | const React = require('react');
|
---|
| 2 |
|
---|
| 3 | function MetricCells({ metrics }) {
|
---|
| 4 | const { classForPercent, pct, covered, missed, total } = metrics;
|
---|
| 5 |
|
---|
| 6 | return (
|
---|
| 7 | <>
|
---|
| 8 | <td className={'pct ' + classForPercent}>{Math.round(pct)}% </td>
|
---|
| 9 | <td className={classForPercent}>
|
---|
| 10 | <div className="bar">
|
---|
| 11 | <div
|
---|
| 12 | className={`bar__data ${classForPercent} ${classForPercent}--dark`}
|
---|
| 13 | style={{ width: pct + '%' }}
|
---|
| 14 | ></div>
|
---|
| 15 | </div>
|
---|
| 16 | </td>
|
---|
| 17 | <td className={'abs ' + classForPercent}>{covered}</td>
|
---|
| 18 | <td className={'abs ' + classForPercent}>{missed}</td>
|
---|
| 19 | <td className={'abs ' + classForPercent}>{total}</td>
|
---|
| 20 | </>
|
---|
| 21 | );
|
---|
| 22 | }
|
---|
| 23 |
|
---|
| 24 | function FileCell({
|
---|
| 25 | file,
|
---|
| 26 | prefix,
|
---|
| 27 | expandedLines,
|
---|
| 28 | setExpandedLines,
|
---|
| 29 | hasChildren,
|
---|
| 30 | setFileFilter
|
---|
| 31 | }) {
|
---|
| 32 | if (hasChildren) {
|
---|
| 33 | const expandedIndex = expandedLines.indexOf(prefix + file);
|
---|
| 34 | const isExpanded = expandedIndex >= 0;
|
---|
| 35 | const newExpandedLines = isExpanded
|
---|
| 36 | ? [
|
---|
| 37 | ...expandedLines.slice(0, expandedIndex),
|
---|
| 38 | ...expandedLines.slice(expandedIndex + 1)
|
---|
| 39 | ]
|
---|
| 40 | : [...expandedLines, prefix + file];
|
---|
| 41 |
|
---|
| 42 | return (
|
---|
| 43 | <>
|
---|
| 44 | <button
|
---|
| 45 | type="button"
|
---|
| 46 | onClick={() => setExpandedLines(newExpandedLines)}
|
---|
| 47 | className="expandbutton"
|
---|
| 48 | >
|
---|
| 49 | {isExpanded ? String.fromCharCode(0x2013) : '+'}
|
---|
| 50 | </button>
|
---|
| 51 | <a
|
---|
| 52 | href="javascript:void(0)"
|
---|
| 53 | onClick={() => setFileFilter(prefix + file)}
|
---|
| 54 | >
|
---|
| 55 | {file}
|
---|
| 56 | </a>
|
---|
| 57 | </>
|
---|
| 58 | );
|
---|
| 59 | } else {
|
---|
| 60 | return <a href={`./${prefix}${file}.html`}>{file}</a>;
|
---|
| 61 | }
|
---|
| 62 | }
|
---|
| 63 |
|
---|
| 64 | function getWorstMetricClassForPercent(metricsToShow, metrics) {
|
---|
| 65 | let classForPercent = 'none';
|
---|
| 66 | for (const metricToShow in metricsToShow) {
|
---|
| 67 | if (metricsToShow[metricToShow]) {
|
---|
| 68 | const metricClassForPercent = metrics[metricToShow].classForPercent;
|
---|
| 69 |
|
---|
| 70 | // ignore none metrics so they don't change whats shown
|
---|
| 71 | if (metricClassForPercent === 'none') {
|
---|
| 72 | continue;
|
---|
| 73 | }
|
---|
| 74 |
|
---|
| 75 | // if the metric low or lower than whats currently being used, replace it
|
---|
| 76 | if (
|
---|
| 77 | metricClassForPercent == 'low' ||
|
---|
| 78 | (metricClassForPercent === 'medium' &&
|
---|
| 79 | classForPercent !== 'low') ||
|
---|
| 80 | (metricClassForPercent === 'high' &&
|
---|
| 81 | classForPercent !== 'low' &&
|
---|
| 82 | classForPercent !== 'medium')
|
---|
| 83 | ) {
|
---|
| 84 | classForPercent = metricClassForPercent;
|
---|
| 85 | }
|
---|
| 86 | }
|
---|
| 87 | }
|
---|
| 88 | return classForPercent;
|
---|
| 89 | }
|
---|
| 90 |
|
---|
| 91 | module.exports = function SummaryTableLine({
|
---|
| 92 | prefix,
|
---|
| 93 | metrics,
|
---|
| 94 | file,
|
---|
| 95 | children,
|
---|
| 96 | tabSize,
|
---|
| 97 | metricsToShow,
|
---|
| 98 | expandedLines,
|
---|
| 99 | setExpandedLines,
|
---|
| 100 | fileFilter,
|
---|
| 101 | setFileFilter
|
---|
| 102 | }) {
|
---|
| 103 | tabSize = tabSize || 0;
|
---|
| 104 | if (children && tabSize > 0) {
|
---|
| 105 | tabSize--;
|
---|
| 106 | }
|
---|
| 107 | prefix = (fileFilter ? fileFilter + '/' : '') + (prefix || '');
|
---|
| 108 |
|
---|
| 109 | return (
|
---|
| 110 | <>
|
---|
| 111 | <tr>
|
---|
| 112 | <td
|
---|
| 113 | className={
|
---|
| 114 | 'file ' +
|
---|
| 115 | getWorstMetricClassForPercent(metricsToShow, metrics)
|
---|
| 116 | }
|
---|
| 117 | >
|
---|
| 118 | {/* eslint-disable-line prefer-spread */ Array.apply(null, {
|
---|
| 119 | length: tabSize
|
---|
| 120 | }).map((nothing, index) => (
|
---|
| 121 | <span className="filetab" key={index} />
|
---|
| 122 | ))}
|
---|
| 123 | <FileCell
|
---|
| 124 | file={file}
|
---|
| 125 | prefix={prefix}
|
---|
| 126 | expandedLines={expandedLines}
|
---|
| 127 | setExpandedLines={setExpandedLines}
|
---|
| 128 | hasChildren={Boolean(children)}
|
---|
| 129 | setFileFilter={setFileFilter}
|
---|
| 130 | />
|
---|
| 131 | </td>
|
---|
| 132 | {metricsToShow.statements && (
|
---|
| 133 | <MetricCells metrics={metrics.statements} />
|
---|
| 134 | )}
|
---|
| 135 | {metricsToShow.branches && (
|
---|
| 136 | <MetricCells metrics={metrics.branches} />
|
---|
| 137 | )}
|
---|
| 138 | {metricsToShow.functions && (
|
---|
| 139 | <MetricCells metrics={metrics.functions} />
|
---|
| 140 | )}
|
---|
| 141 | {metricsToShow.lines && <MetricCells metrics={metrics.lines} />}
|
---|
| 142 | </tr>
|
---|
| 143 | {children &&
|
---|
| 144 | expandedLines.indexOf(prefix + file) >= 0 &&
|
---|
| 145 | children.map(child => (
|
---|
| 146 | <SummaryTableLine
|
---|
| 147 | {...child}
|
---|
| 148 | tabSize={tabSize + 2}
|
---|
| 149 | key={child.file}
|
---|
| 150 | prefix={prefix + file + '/'}
|
---|
| 151 | metricsToShow={metricsToShow}
|
---|
| 152 | expandedLines={expandedLines}
|
---|
| 153 | setExpandedLines={setExpandedLines}
|
---|
| 154 | setFileFilter={setFileFilter}
|
---|
| 155 | />
|
---|
| 156 | ))}
|
---|
| 157 | </>
|
---|
| 158 | );
|
---|
| 159 | };
|
---|