408 lines
11 KiB
JavaScript
408 lines
11 KiB
JavaScript
import React, { useEffect, useState } from 'react';
|
|
import { Chart } from 'primereact/chart';
|
|
|
|
const lineData = {
|
|
labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
|
|
datasets: [
|
|
{
|
|
label: 'First Dataset',
|
|
data: [65, 59, 80, 81, 56, 55, 40],
|
|
fill: false,
|
|
backgroundColor: '#2f4860',
|
|
borderColor: '#2f4860',
|
|
tension: .4
|
|
},
|
|
{
|
|
label: 'Second Dataset',
|
|
data: [28, 48, 40, 19, 86, 27, 90],
|
|
fill: false,
|
|
backgroundColor: '#00bb7e',
|
|
borderColor: '#00bb7e',
|
|
tension: .4
|
|
}
|
|
]
|
|
};
|
|
|
|
const pieData = {
|
|
labels: ['A', 'B', 'C'],
|
|
datasets: [
|
|
{
|
|
data: [300, 50, 100],
|
|
backgroundColor: [
|
|
"#FF6384",
|
|
"#36A2EB",
|
|
"#FFCE56"
|
|
],
|
|
hoverBackgroundColor: [
|
|
"#FF6384",
|
|
"#36A2EB",
|
|
"#FFCE56"
|
|
]
|
|
}
|
|
]
|
|
};
|
|
|
|
const polarData = {
|
|
datasets: [{
|
|
data: [
|
|
11,
|
|
16,
|
|
7,
|
|
3,
|
|
14
|
|
],
|
|
backgroundColor: [
|
|
"#FF6384",
|
|
"#4BC0C0",
|
|
"#FFCE56",
|
|
"#E7E9ED",
|
|
"#36A2EB"
|
|
],
|
|
label: 'My dataset'
|
|
}],
|
|
labels: [
|
|
"Red",
|
|
"Green",
|
|
"Yellow",
|
|
"Grey",
|
|
"Blue"
|
|
]
|
|
};
|
|
|
|
const barData = {
|
|
labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
|
|
datasets: [
|
|
{
|
|
label: 'My First dataset',
|
|
backgroundColor: '#2f4860',
|
|
data: [65, 59, 80, 81, 56, 55, 40]
|
|
},
|
|
{
|
|
label: 'My Second dataset',
|
|
backgroundColor: '#00bb7e',
|
|
data: [28, 48, 40, 19, 86, 27, 90]
|
|
}
|
|
]
|
|
};
|
|
|
|
const doughnutData = {
|
|
labels: ['A', 'B', 'C'],
|
|
datasets: [
|
|
{
|
|
data: [300, 50, 100],
|
|
backgroundColor: [
|
|
"#FF6384",
|
|
"#36A2EB",
|
|
"#FFCE56"
|
|
],
|
|
hoverBackgroundColor: [
|
|
"#FF6384",
|
|
"#36A2EB",
|
|
"#FFCE56"
|
|
]
|
|
}
|
|
]
|
|
};
|
|
|
|
const radarData = {
|
|
labels: ['Eating', 'Drinking', 'Sleeping', 'Designing', 'Coding', 'Cycling', 'Running'],
|
|
datasets: [
|
|
{
|
|
label: 'My First dataset',
|
|
backgroundColor: 'rgba(179,181,198,0.2)',
|
|
borderColor: 'rgba(179,181,198,1)',
|
|
pointBackgroundColor: 'rgba(179,181,198,1)',
|
|
pointBorderColor: '#fff',
|
|
pointHoverBackgroundColor: '#fff',
|
|
pointHoverBorderColor: 'rgba(179,181,198,1)',
|
|
data: [65, 59, 90, 81, 56, 55, 40]
|
|
},
|
|
{
|
|
label: 'My Second dataset',
|
|
backgroundColor: 'rgba(255,99,132,0.2)',
|
|
borderColor: 'rgba(255,99,132,1)',
|
|
pointBackgroundColor: 'rgba(255,99,132,1)',
|
|
pointBorderColor: '#fff',
|
|
pointHoverBackgroundColor: '#fff',
|
|
pointHoverBorderColor: 'rgba(255,99,132,1)',
|
|
data: [28, 48, 40, 19, 96, 27, 100]
|
|
}
|
|
]
|
|
};
|
|
|
|
const ChartDemo = (props) => {
|
|
const [lineOptions, setLineOptions] = useState(null)
|
|
const [barOptions, setBarOptions] = useState(null)
|
|
const [pieOptions, setPieOptions] = useState(null)
|
|
const [polarOptions, setPolarOptions] = useState(null)
|
|
const [radarOptions, setRadarOptions] = useState(null)
|
|
|
|
const applyLightTheme = () => {
|
|
const lineOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#495057'
|
|
}
|
|
}
|
|
},
|
|
scales: {
|
|
x: {
|
|
ticks: {
|
|
color: '#495057'
|
|
},
|
|
grid: {
|
|
color: '#ebedef',
|
|
}
|
|
},
|
|
y: {
|
|
ticks: {
|
|
color: '#495057'
|
|
},
|
|
grid: {
|
|
color: '#ebedef',
|
|
}
|
|
},
|
|
}
|
|
};
|
|
|
|
const barOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#495057'
|
|
}
|
|
}
|
|
},
|
|
scales: {
|
|
x: {
|
|
ticks: {
|
|
color: '#495057'
|
|
},
|
|
grid: {
|
|
color: '#ebedef',
|
|
}
|
|
},
|
|
y: {
|
|
ticks: {
|
|
color: '#495057'
|
|
},
|
|
grid: {
|
|
color: '#ebedef',
|
|
}
|
|
},
|
|
}
|
|
};
|
|
|
|
const pieOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#495057'
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const polarOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#495057'
|
|
}
|
|
}
|
|
},
|
|
scales: {
|
|
r: {
|
|
grid: {
|
|
color: '#ebedef'
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const radarOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#495057'
|
|
}
|
|
}
|
|
},
|
|
scales: {
|
|
r: {
|
|
grid: {
|
|
color: '#ebedef'
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
setLineOptions(lineOptions)
|
|
setBarOptions(barOptions)
|
|
setPieOptions(pieOptions)
|
|
setPolarOptions(polarOptions)
|
|
setRadarOptions(radarOptions)
|
|
|
|
}
|
|
|
|
const applyDarkTheme = () => {
|
|
const lineOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#ebedef'
|
|
}
|
|
}
|
|
},
|
|
scales: {
|
|
x: {
|
|
ticks: {
|
|
color: '#ebedef'
|
|
},
|
|
grid: {
|
|
color: 'rgba(160, 167, 181, .3)',
|
|
}
|
|
},
|
|
y: {
|
|
ticks: {
|
|
color: '#ebedef'
|
|
},
|
|
grid: {
|
|
color: 'rgba(160, 167, 181, .3)',
|
|
}
|
|
},
|
|
}
|
|
};
|
|
|
|
const barOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#ebedef'
|
|
}
|
|
}
|
|
},
|
|
scales: {
|
|
x: {
|
|
ticks: {
|
|
color: '#ebedef'
|
|
},
|
|
grid: {
|
|
color: 'rgba(160, 167, 181, .3)',
|
|
}
|
|
},
|
|
y: {
|
|
ticks: {
|
|
color: '#ebedef'
|
|
},
|
|
grid: {
|
|
color: 'rgba(160, 167, 181, .3)',
|
|
}
|
|
},
|
|
}
|
|
};
|
|
|
|
const pieOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#ebedef'
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const polarOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#ebedef'
|
|
}
|
|
}
|
|
},
|
|
scales: {
|
|
r: {
|
|
grid: {
|
|
color: 'rgba(160, 167, 181, .3)'
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const radarOptions = {
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
color: '#ebedef'
|
|
}
|
|
}
|
|
},
|
|
scales: {
|
|
r: {
|
|
grid: {
|
|
color: 'rgba(160, 167, 181, .3)'
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
setLineOptions(lineOptions)
|
|
setBarOptions(barOptions)
|
|
setPieOptions(pieOptions)
|
|
setPolarOptions(polarOptions)
|
|
setRadarOptions(radarOptions)
|
|
}
|
|
|
|
useEffect(() => {
|
|
if (props.colorMode === 'light') {
|
|
applyLightTheme();
|
|
} else {
|
|
applyDarkTheme();
|
|
}
|
|
}, [props.colorMode]);
|
|
|
|
return (
|
|
<div className="grid p-fluid">
|
|
<div className="col-12 lg:col-6">
|
|
<div className="card">
|
|
<h5>Linear Chart</h5>
|
|
<Chart type="line" data={lineData} options={lineOptions} />
|
|
</div>
|
|
|
|
<div className="card flex flex-column align-items-center">
|
|
<h5>Pie Chart</h5>
|
|
<Chart type="pie" data={pieData} options={pieOptions} style={{ width: '50%' }} />
|
|
</div>
|
|
|
|
<div className="card flex flex-column align-items-center">
|
|
<h5>Polar Area Chart</h5>
|
|
<Chart type="polarArea" data={polarData} options={polarOptions} style={{ width: '50%' }} />
|
|
</div>
|
|
</div>
|
|
<div className="col-12 lg:col-6">
|
|
<div className="card">
|
|
<h5>Bar Chart</h5>
|
|
<Chart type="bar" data={barData} options={barOptions} />
|
|
</div>
|
|
|
|
<div className="card flex flex-column align-items-center">
|
|
<h5>Doughnut Chart</h5>
|
|
<Chart type="doughnut" data={doughnutData} options={pieOptions} style={{ width: '50%' }} />
|
|
</div>
|
|
|
|
<div className="card flex flex-column align-items-center">
|
|
<h5>Radar Chart</h5>
|
|
<Chart type="radar" data={radarData} options={radarOptions} style={{ width: '50%' }} />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const comparisonFn = function (prevProps, nextProps) {
|
|
return (prevProps.location.pathname === nextProps.location.pathname) && (prevProps.colorMode === nextProps.colorMode);
|
|
};
|
|
|
|
export default React.memo(ChartDemo, comparisonFn);
|