A Stimulus controller for managing checkbox lists.
Chris Oliver from GoRails has released a presentation video on how to use this package with a real life example with Ruby on Rails.
👉 Take a look: Bulk Operations in Rails
$ yarn add stimulus-checkbox-select-all
And use it in your JS file:
import { Application } from "stimulus"
import CheckboxSelectAll from "stimulus-checkbox-select-all"
const application = Application.start()
application.register("checkbox-select-all", CheckboxSelectAll)
<table>
<tbody>
<td class="block">
<label>
<input type="checkbox" data-target="checkbox-select-all.checkboxAll" />
<span>Select All / Deselect All</span>
</label>
</td>
<td class="block">
<label>
<input type="checkbox" data-target="checkbox-select-all.checkbox" value="1" />
<span>Team 1</span>
</label>
</td>
<td class="block">
<label>
<input type="checkbox" data-target="checkbox-select-all.checkbox" checked="checked" value="2" />
<span>Team 2</span>
</label>
</td>
<td class="block">
<label>
<input type="checkbox" data-target="checkbox-select-all.checkbox" value="3" />
<span>Team 3</span>
</label>
</td>
</tbody>
</table>
In your models:
class User < ApplicationRecord
has_many :teams
end
class Team < ApplicationRecord
belongs_to :user
end
In your controller:
class UsersController < ApplicationController
def update
if user.update(user_params)
redirect_to users_path
else
render :edit
end
end
private
def user_params
params
.require(:user)
.permit(
team_ids: []
)
end
end
In your view:
<%= form_with model: @user, data: { controller: 'checkbox-select-all' } do |f| %>
<label>
<input type="checkbox" data-target="checkbox-select-all.checkboxAll" />
<span>Select All / Deselect All</span>
</label>
<%= f.collection_check_boxes :team_ids, Team.all, :id, :name do |b| %>
<%= b.label do %>
<%= b.check_box data: { target: 'checkbox-select-all.checkbox' } %>
<%= b.text %>
<% end %>
<% end %>
<% end %>
You can use inheritance to extend the functionality of any Stimulus components.
import CheckboxSelectAll from "stimulus-checkbox-select-all"
export default class extends CheckboxSelectAll {
connect() {
super.connect()
console.log("Do what you want here.")
// Get all checked checkboxes
this.checked
// Get all unchecked checkboxes
this.unchecked
}
}
These controllers 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.
$ yarn install
$ yarn dev
Jest and Puppeteer are responsible to test this component:
$ yarn test
Prettier and ESLint are responsible to lint and format this component:
$ yarn lint
$ yarn format
Do not hesitate to contribute to the project by adapting or adding features ! Bug reports or pull requests are welcome.
This project is released under the MIT license.