widgets/distribution-reports/src/app/matrix-presentation.js (121 lines of code) (raw):
import './style/report-chart.scss';
import React from 'react';
import PropTypes from 'prop-types';
import Link from '@jetbrains/ring-ui/components/link/link';
import FilterFieldValue from '../../../../components/src/filter-field-value/filter-field-value';
import ReportModel from '../../../../components/src/report-model/report-model';
import DistributionReportModel from './distribution-report-model';
import './nv-flex-pie-chart';
class MatrixPresentation extends React.Component {
static propTypes = {
reportData: PropTypes.object,
homeUrl: PropTypes.string,
onActivateLine: PropTypes.func,
onResetActiveLine: PropTypes.func,
activeLineIdx: PropTypes.number
};
constructor(props) {
super(props);
this.state = {
matrixModel: DistributionReportModel.getBarsChartModel(props.reportData)
};
}
componentWillReceiveProps(props) {
if (props.reportData) {
this.setState({
matrixModel: DistributionReportModel.getBarsChartModel(props.reportData)
});
}
}
clearActiveLineIndex = () => {
if (this.props.onResetActiveLine) {
this.props.onResetActiveLine();
}
};
onActivateLine = lineIdx => {
if (this.props.onActivateLine) {
this.props.onActivateLine(lineIdx);
}
};
renderTableCell(row, rowIdx) {
const sizeValue = ReportModel.getSizeValue(
row.size
);
const sizePresentation = sizeValue
? ReportModel.getSizePresentation(row.size)
: '-';
const onClick = () => {
if (sizeValue) {
const url = ReportModel.getSearchUrl(
row.issuesQuery, this.props.homeUrl
);
window.open(url, '_blank');
}
};
const onMouseOver = () =>
this.onActivateLine(rowIdx);
const isActiveIdx = this.props.activeLineIdx === rowIdx;
return (
<div
key={`column-row-key-${rowIdx}`}
className={`report-chart__table-cell${isActiveIdx ? ' report-chart__table-cell_active' : ''}`}
onMouseOver={onMouseOver}
onClick={onClick}
>
{
(sizeValue > 0) &&
<Link pseudo={true}>
{sizePresentation}
</Link>
}
{
(sizeValue === 0) &&
<span>{sizePresentation}</span>
}
</div>
);
}
renderColumn(column) {
return (
<div
key={`column-value-${column.name}`}
className="report-chart__table-column"
>
{
column.values.map((row, idx) =>
this.renderTableCell(row, idx)
)
}
</div>
);
}
render() {
const {matrixModel} = this.state;
return (
<div
className="report-chart__body report-chart__body_matrix"
>
<div className="report-chart__table-header">
{
matrixModel.map(column => (
<div
key={`column-key-${column.name}`}
className="report-chart__table-header-cell"
>
<FilterFieldValue
value={column}
homeUrl={this.props.homeUrl}
/>
</div>
))
}
</div>
<div
className="report-chart__table"
onMouseLeave={this.clearActiveLineIndex}
>
{
matrixModel.map(column => this.renderColumn(column))
}
</div>
</div>
);
}
}
export default MatrixPresentation;