Getting Started
Components
- Animated Number
- Auto Submit
- Carousel
- Character Counter
- Chartjs
- Checkbox Select All
- Clipboard
- Color Picker
- Confirmation New
- Content Loader
- Dialog
- Dropdown
- Glow
- Lightbox
- Notification
- Password Visibility
- Places Autocomplete
- Popover
- Prefetch
- Rails Nested Form
- Read More
- Remote Rails
- Reveal Controller
- Scroll Progress
- Scroll Reveal
- Scroll To
- Sortable
- Sound
- Textarea Autogrow
- Timeago
Installation
Install the package
Terminal$ yarn add @stimulus-components/chartjs
Register the controller in your application
app/javascript/controllers/index.jsimport { Application } from '@hotwired/stimulus' import Chartjs from '@stimulus-components/chartjs' const application = Application.start() application.register('chartjs', Chartjs)
This component is based on the Chart.js library.
Example
Chartjs
Usage
Basic usage
app/views/index.html
<canvas
data-controller="chartjs"
data-chartjs-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>
If you extend this controller, it could be handy to use it with a target
:
app/views/index.html
<div
data-controller="chartjs"
data-chartjs-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 data-chartjs-target="canvas"></canvas>
<!-- You need to define this action -->
<button data-action="chartjs#update">Update me!</button>
</div>
It's much simpler with a framework.
With backend framework (optional)
app/controllers/charts_controller.rb
class ChartsController < ApplicationController
def index
@chart_data = {
labels: %w[January February March April May June July],
datasets: [{
label: 'My First dataset',
backgroundColor: 'transparent',
borderColor: '#3B82F6',
data: [37, 83, 78, 54, 12, 5, 99]
}]
}
@chart_options = {
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
}
}
end
end
app/views/index.html
<canvas
data-controller="chartjs"
data-chartjs-data-value="<%= @chart_data.to_json %>"
data-chartjs-options-value="<%= @chart_options.to_json %>"
></canvas>
Configuration
Attribute | Default | Description | Optional |
---|---|---|---|
data-chartjs-data-value | {} | The data for Chart.js | ❌ |
data-chartjs-type-value | line | Type of the chart | ✅ |
data-chartjs-options-value | {} | The options for Chart.js | ✅ |
Extending Controller
You can use inheritance to extend the functionality of any Stimulus component:
app/javascript/controllers/chartjs_controller.js
import Chartjs from "@stimulus-components/chartjs"
export default class extends Chartjs {
connect() {
super.connect()
console.log("Do what you want here.")
// The chart.js instance
this.chart
// Options from the data attribute.
this.options
// Default options for every charts.
this.defaultOptions
}
// Bind an action on this method
async update() {
const response = await fetch("https://example.com/chart_data.json")
const data = await response.json()
this.chart.data = data
this.chart.update()
}
// You can set default options in this getter for all your charts.
get defaultOptions() {
return {
maintainAspectRatio: false,
legend: {
display: false,
},
}
}
}
This controller will automatically have access to targets defined in the parent class.
If you override the connect
, disconnect
or any other methods from the parent, you'll want to call super.method()
to make sure the parent functionality is executed.