shlink-web-client/src/visits/GraphCard.js

59 lines
1.4 KiB
JavaScript
Raw Normal View History

import { Card, CardHeader, CardBody } from 'reactstrap';
import { Doughnut, HorizontalBar } from 'react-chartjs-2';
import PropTypes from 'prop-types';
import React from 'react';
2018-09-08 10:06:18 +03:00
import { keys, values } from 'ramda';
const propTypes = {
title: PropTypes.string,
isBarChart: PropTypes.bool,
stats: PropTypes.object,
};
export function GraphCard({ title, isBarChart, stats }) {
const generateGraphData = (stats) => ({
2018-09-08 10:06:18 +03:00
labels: keys(stats),
datasets: [
{
title,
2018-09-08 10:06:18 +03:00
data: values(stats),
backgroundColor: isBarChart ? 'rgba(70, 150, 229, 0.4)' : [
'#97BBCD',
'#DCDCDC',
'#F7464A',
'#46BFBD',
'#FDB45C',
'#949FB1',
'#4D5360',
],
borderColor: isBarChart ? 'rgba(70, 150, 229, 1)' : 'white',
borderWidth: 2,
},
],
});
const renderGraph = () => {
const Component = isBarChart ? HorizontalBar : Doughnut;
2018-09-08 21:34:04 +03:00
const options = {
legend: isBarChart ? { display: false } : { position: 'right' },
scales: isBarChart ? {
xAxes: [
{
ticks: { beginAtZero: true },
},
],
} : null,
};
2018-09-08 21:34:04 +03:00
return <Component data={generateGraphData(stats)} options={options} />;
};
return (
<Card className="mt-4">
<CardHeader>{title}</CardHeader>
<CardBody>{renderGraph()}</CardBody>
</Card>
);
}
GraphCard.propTypes = propTypes;