Git Product home page Git Product logo

formtastic-grouped-checkboxes's Introduction

Formtastic grouped checkboxes

Gem Version

Group your Formtastic checkboxes like grouped select via “grouped_collection_select” in Rails.

Installation

Add this line to your application's Gemfile:

gem "formtastic_grouped_check_boxes"

Import our Sass file “formtastic-grouped-check-boxes.css” in your CSS entrypoint that compiles CSS files:

// app/assets/stylesheets/application.sass

// Your regular ActiveAdmin files
@import ...
@import ...

// This gem’s files
@import "formtastic-grouped-check-boxes"

Use

This gem adds a new input type :grouped_check_boxes.

It also adds 3 new input options, 2 of which follow the Rails naming convention from grouped_collection_select (docs):

  • group_method — The name of a method which, when called on a member of collection, returns an array of child objects. It can also be a Proc / lambda, that will be called for each member of the collection to retrieve the value.
  • group_label_method — The name of a method which, when called on a member of collection, returns a string to be used as the group name. No Proc support here yet.
  • group_label_parent — Whether to prepend the fieldset label with the parent input title (on: “Technologies / Marketing”, off: “Marketing”).

Example

Providing that our models look like so:

class Project < ApplicationRecord
  has_many :technologies # details omitted
  accepts_nested_attributes_for :technologies
end
class Technology < ApplicationRecord
  has_many :projects # details omitted
  belongs_to :area, foreign_key: :area_id, class_name: "TechnologyArea", optional: true
end

# Table name: technologies
#  id       :bigint  not null, primary key
#  name     :string  not null
#  area_id  :bigint
class TechnologyArea < ApplicationRecord
  has_many :technologies
end

# Table name: technology_areas
#  id    :bigint  not null, primary key
#  name  :string  not null

In ActiveAdmin you can do the following

ActiveAdmin.register Project do
  permit_params technology_ids: [], ...

  form do |f|
    f.inputs "Technologies" do
      f.input :technologies,
              as: :grouped_check_boxes, \
              collection: Technology.order(:name) \
                          .select(:id, :name, :area_id) \ # note the `:area_id`
                          .includes(:area), \ # prevent N+1
              group_method: :area, \ # calls `.area` on each instance of `Technology` (that’s why we need `:area_id`)
              group_label_method: :name, \ # calls `.name` on each instance of `TechnologyArea`
              group_label_parent: true # not required
    end
  end
end

Results in:

screenshot-1

While producing such code:

<fieldset class="inputs">
  <legend><span>Technologies</span></legend>
  <ol>
    <li class="grouped_check_boxes check_boxes input optional" id="project_technologies_input">
      <input type="hidden" name="project[technology_ids][]" id="project_technologies_none" value="" autocomplete="off">

      <fieldset class="choices grouped_check_boxes__choices">
        <legend class="label grouped_check_boxes__legend">
          <label class="grouped_check_boxes__legend__label">Technologies / No subgroup</label>
        </legend>

        <ol class="choices-group grouped_check_boxes__choices-group">
          <li class="choice grouped_check_boxes__choice">
            <label for="project_technology_ids_46">
              <input type="checkbox" name="project[technology_ids][]" id="project_technology_ids_46" value="46">BitBucket
            </label>
          </li>
          <li class="choice grouped_check_boxes__choice">
            <label for="project_technology_ids_138">
              <input type="checkbox" name="project[technology_ids][]" id="project_technology_ids_138" value="138">BrainTree API (Ruby SDK)
            </label>
          </li>
        </ol>
      </fieldset>

      <fieldset class="choices grouped_check_boxes__choices">
        <legend class="label grouped_check_boxes__legend">
          <label class="grouped_check_boxes__legend__label">Technologies / Marketing</label>
        </legend>

        <ol class="choices-group grouped_check_boxes__choices-group">
          <li class="choice grouped_check_boxes__choice">
            <label for="project_technology_ids_59">
              <input type="checkbox" name="project[technology_ids][]" id="project_technology_ids_59" value="59">Direct sales
            </label>
          </li>
          <li class="choice grouped_check_boxes__choice">
            <label for="project_technology_ids_89">
              <input type="checkbox" name="project[technology_ids][]" id="project_technology_ids_89" value="89">Google Analytics
            </label>
          </li>
        </ol>
      </fieldset>
    </li>
  </ol>
</fieldset>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.