Skip to main content

Chart Solution

Chart.js​

Out chart solution is based on Chart.js, which is a lightweight library that is easy to use and requires minimal setup. It has a simple API and supports a wide range of chart types, including line, bar, pie, radar, and more.

A Stimulus controller chart_controller.ts is taking care of passing values from DOM element to Chart.js.

How to use​

Example 1​

We can set data attributes on the canvas element, to pass values to Chart.js directly.

<canvas
data-controller="chart"
data-chart-data-value='{ "labels": ["January", "February", "March", "April", "May", "June", "July"], "datasets": [{ "label": "My First dataset", "backgroundColor": "transparent", "borderColor": "#3B82F6", "data": [37, 83, 78, 54, 12, 5, 99] }] }'
></canvas>

Example 2​

Or we can use Javascript

<div class="chart-container"></div>

<script>
const data = {
labels: ["January", "February", "March", "April", "May", "June", "July"],
datasets: [{
label: 'My First Dataset',
data: [65, 59, 80, 81, 56, 55, 40],
fill: false,
borderColor: 'rgb(75, 192, 192)',
tension: 0.1
}]
};
const options = {
};

const container = document.querySelector('.chart-container');
const canvas = document.createElement("CANVAS");

canvas.setAttribute('data-controller', 'chart');
canvas.setAttribute('data-chart-type-value', 'line');
canvas.setAttribute('data-chart-data-value', JSON.stringify(data));
canvas.setAttribute('data-chart-options-value', JSON.stringify(options));

// Stimulus will use chart_controller to init the chart
container.appendChild(canvas);
</script>

</div>

To include data for Javascript in Django template, we can use json_script template tag.

{{ chart_data|json_script:"chartData" }}

<script>
const chartData = JSON.parse(document.getElementById('chartData').textContent);
</script>

And then we can set chartData on the data attributes of the canvas element to get the chart working.

Component Library​

You can find some chart demos in the component library.

Customization​

To customize the behavior, you can use inheritance to extend the Stimulus controller chart_controller.ts

For example, send Ajax request to get chart data from the backend.