rails_bootstrap_form 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2ee7dc67b6fc5b01acdcdda6bb86a228a3aaffa3279e4f13b512d806483a972
4
- data.tar.gz: 86387e4cf163ee56a24793b8ec4ac185b6faccd4862faeca3a652fd4b89144aa
3
+ metadata.gz: 7902b4c3c6edd102d01a2008a8d69a639b6afde3a93997c202e9267dcda93e4b
4
+ data.tar.gz: 4e65ba157ac848d45093d2aeda0673e840335bafd24b5861b0551dddc6cd130b
5
5
  SHA512:
6
- metadata.gz: 05f729ca9e103345b2f8d0dc95f0ed9e5a9e442c690a6a1b885162d9c31ae3b77fdd321d48aa8af7b23358e4e5bce8747e005bf88f6b2988e53ce5a97f71ea80
7
- data.tar.gz: 9cb29fb1b803ca07e28c033c1ece4b3116593c4438c646aef8f4c1b2b2ba7e2c1768b27086334cea66b2acf71cd9e20ccf6a4f91548beb90e8edaafb5e2f6985
6
+ metadata.gz: 1641aaa9fa84627e32bd9d5d59c7bfb6c89f12fd7498a6ed443309125ee11b4a79a8f7636b55da81e28a003146e00707c89df0d10c2e2d58957a975a035af3dc
7
+ data.tar.gz: 9ecea91f9b5c2af60282eb938e957e18cbfcbc7b089341b126db05728cdb44dd41cb4af9632e1cf6e6a14b6146a3b5c8841af3cd3c95a24b7c77af8dabcd6d10
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_bootstrap_form (0.1.1)
4
+ rails_bootstrap_form (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -0,0 +1,4 @@
1
+ c
2
+ @bootstrap_form_options
3
+ c
4
+ @bootstrap_form_options
@@ -0,0 +1,70 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class UsersController < ApplicationController
6
+
7
+ before_action :find_user, except: [:index, :new, :create]
8
+
9
+ def index
10
+ @users = ::User.all
11
+ end
12
+
13
+ def new
14
+ @user = ::User.new
15
+ end
16
+
17
+ def create
18
+ @user = ::User.new(user_params)
19
+ if @user.save
20
+ redirect_to users_path
21
+ else
22
+ render :new, status: :unprocessable_entity
23
+ end
24
+ end
25
+
26
+ def edit
27
+ end
28
+
29
+ def update
30
+ if @user.update(user_params)
31
+ redirect_to users_path
32
+ else
33
+ render :edit, status: :unprocessable_entity
34
+ end
35
+ end
36
+
37
+ def destroy
38
+ @user.destroy
39
+ redirect_to users_path
40
+ end
41
+
42
+ private
43
+
44
+ def user_params
45
+ params.require(:user).permit(
46
+ :name,
47
+ :email,
48
+ :password,
49
+ :mobile_number,
50
+ :birth_date,
51
+ :terms,
52
+ :excellence,
53
+ :blog_url,
54
+ :fruit_id,
55
+ :favorite_color,
56
+ skill_ids: [],
57
+ address_attributes: [
58
+ :street,
59
+ :state,
60
+ :city,
61
+ :postal_code,
62
+ :country_id,
63
+ ]
64
+ )
65
+ end
66
+
67
+ def find_user
68
+ @user = ::User.find(params.fetch(:id))
69
+ end
70
+ end
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class Address < ApplicationRecord
6
+ belongs_to :user
7
+ belongs_to :country
8
+
9
+ delegate :name, to: :country, prefix: true
10
+ end
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class Country < ApplicationRecord
6
+ DEFAULT_OPTIONS = [
7
+ "India",
8
+ "Ireland",
9
+ "United States",
10
+ "United Kingdom",
11
+ "Spain",
12
+ "France",
13
+ "Canada"
14
+ ].freeze
15
+
16
+ has_many :addresses, dependent: :restrict_with_exception
17
+ end
@@ -0,0 +1,14 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class Fruit < ApplicationRecord
6
+ DEFAULT_OPTIONS = [
7
+ "Mango",
8
+ "Apple",
9
+ "Orange",
10
+ "Watermelon"
11
+ ].freeze
12
+
13
+ has_many :users, dependent: :restrict_with_exception
14
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class Skill < ApplicationRecord
6
+ DEFAULT_OPTIONS = [
7
+ "Communication",
8
+ "Problem Solving",
9
+ "Leadership",
10
+ "Writing",
11
+ "Creativity",
12
+ "Time Management",
13
+ "Team Work",
14
+ "Negotiation",
15
+ "Decision Making",
16
+ "Management"
17
+ ].freeze
18
+
19
+ has_many :user_skills, dependent: :restrict_with_exception
20
+ has_many :users, through: :user_skills, source: :user
21
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class User < ApplicationRecord
6
+ has_one :address, dependent: :destroy
7
+
8
+ has_many :user_skills, dependent: :destroy
9
+ has_many :skills, through: :user_skills, source: :skill
10
+
11
+ belongs_to :fruit
12
+
13
+ delegate :name, to: :fruit, prefix: true
14
+
15
+ accepts_nested_attributes_for :address, update_only: true
16
+
17
+ def address
18
+ super.presence || build_address
19
+ end
20
+ end
@@ -0,0 +1,8 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class UserSkill < ApplicationRecord
6
+ belongs_to :user
7
+ belongs_to :skill
8
+ end
@@ -0,0 +1,5 @@
1
+ <% if false %>
2
+ <%= render partial: "users/form_without_bootstrap_helpers" %>
3
+ <% end %>
4
+
5
+ <%= render partial: "users/vertical_form" %>
@@ -0,0 +1,49 @@
1
+ <div class="card card-primary my-3">
2
+ <div class="card-header fw-bold">
3
+ Profile Form (Without RailsBootstrapForm)
4
+ </div>
5
+ <div class="card-body">
6
+ <%= form_for @user do |form| %>
7
+ <%= form.text_field :name, autocomplete: "new-name" %>
8
+ <%= form.email_field :email %>
9
+ <%= form.password_field :password, autocomplete: "new-password" %>
10
+ <%= form.phone_field :mobile_number %>
11
+ <%= form.date_field :birth_date %>
12
+ <%= form.check_box :terms %>
13
+ <%= form.range_field :excellence %>
14
+ <%= form.url_field :blog_url %>
15
+ <%= form.url_field :favorite_color %>
16
+ <%= form.select :fruit_id, options_for_select(::Fruit.pluck(:name, :id), form.object.fruit_id), include_blank: "Select Favorite Fruit" %>
17
+ <%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name do |b| %>
18
+ <%= b.check_box + b.text %>
19
+ <% end %>
20
+ <%= form.fields_for :address, include_id: false do |address_form| %>
21
+ <%= address_form.text_area :street %>
22
+ <%= address_form.text_field :state %>
23
+ <%= address_form.text_field :city %>
24
+ <%= address_form.text_field :postal_code %>
25
+ <%= address_form.select :country_id, options_for_select(::Country.pluck(:name, :id), address_form.object.country_id), include_blank: "Select Country" %>
26
+ <% end %>
27
+ <div class="mt-3">
28
+ <%= form.submit "Register", class: "btn btn-primary" %>
29
+ <%= link_to "Cancel", users_path, class: "btn btn-secondary" %>
30
+ </div>
31
+ <% end %>
32
+ </div>
33
+ </div>
34
+
35
+ <div class="card card-primary">
36
+ <div class="card-header fw-bold">
37
+ Login Form (Without RailsBootstrapForm)
38
+ </div>
39
+ <div class="card-body">
40
+ <%= form_for @user do |form| %>
41
+ <%= form.email_field :email %>
42
+ <%= form.password_field :password, autocomplete: "new-password" %>
43
+ <div class="mt-3">
44
+ <%= form.submit "Login", class: "btn btn-primary" %>
45
+ <%= link_to "Cancel", users_path, class: "btn btn-secondary" %>
46
+ </div>
47
+ <% end %>
48
+ </div>
49
+ </div>
@@ -0,0 +1,33 @@
1
+ <div class="card card-primary my-3">
2
+ <div class="card-header fw-bold">
3
+ Profile Form (Vertical layout)
4
+ </div>
5
+ <div class="card-body">
6
+ <%= bootstrap_form_for @user, bootstrap_form: {} do |form| %>
7
+ <%= form.text_field :name, autocomplete: "new-name", required: true, bootstrap_form: {} %>
8
+ <%= form.text_field :email, autocomplete: "new-email", bootstrap_form: {} %>
9
+ <%= form.text_field :password, autocomplete: "new-password" %>
10
+ <%= form.phone_field :mobile_number %>
11
+ <%= form.date_field :birth_date %>
12
+ <%= form.check_box :terms %>
13
+ <%= form.range_field :excellence %>
14
+ <%= form.url_field :blog_url %>
15
+ <%= form.url_field :favorite_color %>
16
+ <%= form.select :fruit_id, options_for_select(::Fruit.pluck(:name, :id), form.object.fruit_id), include_blank: "Select Favorite Fruit" %>
17
+ <%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name do |b| %>
18
+ <%= b.check_box + b.text %>
19
+ <% end %>
20
+ <%= form.fields_for :address, include_id: false do |address_form| %>
21
+ <%= address_form.text_area :street %>
22
+ <%= address_form.text_field :state %>
23
+ <%= address_form.text_field :city %>
24
+ <%= address_form.text_field :postal_code %>
25
+ <%= address_form.select :country_id, options_for_select(::Country.pluck(:name, :id), address_form.object.country_id), {include_blank: "Select Country", bootstrap: {}} %>
26
+ <% end %>
27
+ <div class="mt-3">
28
+ <%= form.submit "Register", class: "btn btn-primary" %>
29
+ <%= link_to "Cancel", users_path, class: "btn btn-secondary" %>
30
+ </div>
31
+ <% end %>
32
+ </div>
33
+ </div>
@@ -0,0 +1 @@
1
+ <%= render partial: "form" %>
@@ -0,0 +1,42 @@
1
+ <div class="card card-primary">
2
+ <div class="card-header">
3
+ <div class="text-end">
4
+ <%= link_to "New user", new_user_path, class: "btn btn-primary" %>
5
+ </div>
6
+ </div>
7
+ <div class="card-body">
8
+ <div class="table-responsive mt-3">
9
+ <table class="table table-bordered table-stripped">
10
+ <thead>
11
+ <tr>
12
+ <th scope="col">#</th>
13
+ <th scope="col">Name</th>
14
+ <th scope="col">Email</th>
15
+ <th scope="col">Mobile number</th>
16
+ <th scope="col">Favorite Fruit</th>
17
+ <th scope="col">Country</th>
18
+ <th scope="col" width="15%">Actions</th>
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ <% @users.each.with_index(1) do |user, index| %>
23
+ <tr style="vertical-align: middle;">
24
+ <td><%= index %></td>
25
+ <td><%= user.name %></td>
26
+ <td><%= user.email %></td>
27
+ <td><%= user.mobile_number %></td>
28
+ <td><%= user.fruit_name %></td>
29
+ <td><%= user.address.country_name %></td>
30
+ <td>
31
+ <%= link_to "Edit", edit_user_path(user), class: "btn btn-sm btn-secondary" %>
32
+ <div class="d-inline-block">
33
+ <%= button_to "Delete", user, class: "btn btn-sm btn-danger", method: :delete %>
34
+ </div>
35
+ </td>
36
+ </tr>
37
+ <% end %>
38
+ </tbody>
39
+ </table>
40
+ </div>
41
+ </div>
42
+ </div>
@@ -0,0 +1 @@
1
+ <%= render partial: "form" %>
@@ -3,4 +3,7 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  Rails.application.routes.draw do
6
+ root to: "users#index"
7
+
8
+ resources :users
6
9
  end
@@ -0,0 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class CreateCountries < ActiveRecord::Migration[7.0]
6
+ def change
7
+ create_table :countries do |t|
8
+ t.string :name
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class CreateFruits < ActiveRecord::Migration[7.0]
6
+ def change
7
+ create_table :fruits do |t|
8
+ t.string :name
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class CreateUsers < ActiveRecord::Migration[7.0]
6
+ def change
7
+ create_table :users do |t|
8
+ t.string :name
9
+ t.string :email
10
+ t.string :password
11
+ t.string :mobile_number
12
+ t.string :blog_url
13
+ t.date :birth_date
14
+ t.references :fruit
15
+ t.boolean :terms
16
+ t.string :excellence
17
+ t.string :favorite_color
18
+ t.timestamps
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class CreateAddresses < ActiveRecord::Migration[7.0]
6
+ def change
7
+ create_table :addresses, id: false do |t|
8
+ t.references :user, primary_key: true
9
+ t.references :country
10
+ t.string :street
11
+ t.string :city
12
+ t.string :state
13
+ t.string :postal_code
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class CreateSkills < ActiveRecord::Migration[7.0]
6
+ def change
7
+ create_table :skills do |t|
8
+ t.string :name
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ class CreateUserSkills < ActiveRecord::Migration[7.0]
6
+ def change
7
+ create_table :user_skills do |t|
8
+ t.references :user
9
+ t.references :skill
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
data/demo/db/schema.rb ADDED
@@ -0,0 +1,69 @@
1
+ # This file is auto-generated from the current state of the database. Instead
2
+ # of editing this file, please use the migrations feature of Active Record to
3
+ # incrementally modify your database, and then regenerate this schema definition.
4
+ #
5
+ # This file is the source Rails uses to define your schema when running `bin/rails
6
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
7
+ # be faster and is potentially less error prone than running all of your
8
+ # migrations from scratch. Old migrations may fail to apply correctly if those
9
+ # migrations use external dependencies or application code.
10
+ #
11
+ # It's strongly recommended that you check this file into your version control system.
12
+
13
+ ActiveRecord::Schema[7.0].define(version: 2023_05_14_061100) do
14
+ create_table "addresses", primary_key: "user_id", force: :cascade do |t|
15
+ t.integer "country_id"
16
+ t.string "street"
17
+ t.string "city"
18
+ t.string "state"
19
+ t.string "postal_code"
20
+ t.datetime "created_at", null: false
21
+ t.datetime "updated_at", null: false
22
+ t.index ["country_id"], name: "index_addresses_on_country_id"
23
+ t.index ["user_id"], name: "index_addresses_on_user_id"
24
+ end
25
+
26
+ create_table "countries", force: :cascade do |t|
27
+ t.string "name"
28
+ t.datetime "created_at", null: false
29
+ t.datetime "updated_at", null: false
30
+ end
31
+
32
+ create_table "fruits", force: :cascade do |t|
33
+ t.string "name"
34
+ t.datetime "created_at", null: false
35
+ t.datetime "updated_at", null: false
36
+ end
37
+
38
+ create_table "skills", force: :cascade do |t|
39
+ t.string "name"
40
+ t.datetime "created_at", null: false
41
+ t.datetime "updated_at", null: false
42
+ end
43
+
44
+ create_table "user_skills", force: :cascade do |t|
45
+ t.integer "user_id"
46
+ t.integer "skill_id"
47
+ t.datetime "created_at", null: false
48
+ t.datetime "updated_at", null: false
49
+ t.index ["skill_id"], name: "index_user_skills_on_skill_id"
50
+ t.index ["user_id"], name: "index_user_skills_on_user_id"
51
+ end
52
+
53
+ create_table "users", force: :cascade do |t|
54
+ t.string "name"
55
+ t.string "email"
56
+ t.string "password"
57
+ t.string "mobile_number"
58
+ t.string "blog_url"
59
+ t.date "birth_date"
60
+ t.integer "fruit_id"
61
+ t.boolean "terms"
62
+ t.string "excellence"
63
+ t.string "favorite_color"
64
+ t.datetime "created_at", null: false
65
+ t.datetime "updated_at", null: false
66
+ t.index ["fruit_id"], name: "index_users_on_fruit_id"
67
+ end
68
+
69
+ end
data/demo/db/seeds.rb CHANGED
@@ -1,3 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # -*- frozen_string_literal: true -*-
3
3
  # -*- warn_indent: true -*-
4
+
5
+ ::Country::DEFAULT_OPTIONS.each do |country|
6
+ ::Country.find_or_create_by(name: country)
7
+ end
8
+
9
+ ::Fruit::DEFAULT_OPTIONS.each do |fruit|
10
+ ::Fruit.find_or_create_by(name: fruit)
11
+ end
12
+
13
+ ::Skill::DEFAULT_OPTIONS.each do |skill|
14
+ ::Skill.find_or_create_by(name: skill)
15
+ end
@@ -0,0 +1,54 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module RailsBootstrapForm
6
+ module ActionViewExtensions
7
+ # This module creates `RailsBootstrapForm` wrappers around the default form_with
8
+ # and form_for methods.
9
+ #
10
+ # Example:
11
+ #
12
+ # bootstrap_form_for @user do |f|
13
+ # f.text_field :name
14
+ # end
15
+ #
16
+ # Example:
17
+ #
18
+ # bootstrap_form_with model: @user do |f|
19
+ # f.text_field :name
20
+ # end
21
+ #
22
+ module BootstrapFormHelper
23
+ def bootstrap_form_for(record, options = {}, &block)
24
+ options.reverse_merge!(builder: RailsBootstrapForm::BootstrapFormBuilder)
25
+
26
+ supress_form_field_errors do
27
+ form_for(record, options, &block)
28
+ end
29
+ end
30
+
31
+ def bootstrap_form_with(options = {}, &block)
32
+ options.reverse_merge!(builder: RailsBootstrapForm::BootstrapFormBuilder)
33
+
34
+ supress_form_field_errors do
35
+ form_with(**options, &block)
36
+ end
37
+ end
38
+
39
+ def supress_form_field_errors
40
+ original_proc = ActionView::Base.field_error_proc
41
+ ActionView::Base.field_error_proc = RailsBootstrapForm.field_error_proc
42
+ yield
43
+ ensure
44
+ ActionView::Base.field_error_proc = original_proc
45
+ end
46
+
47
+ private :supress_form_field_errors
48
+ end
49
+ end
50
+ end
51
+
52
+ ActiveSupport.on_load(:action_view) do
53
+ include RailsBootstrapForm::ActionViewExtensions::BootstrapFormHelper
54
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module RailsBootstrapForm
6
+ class BootstrapFormBuilder < ActionView::Helpers::FormBuilder
7
+ delegate :capture, :concat, :tag, to: :@template
8
+
9
+ attr_accessor :bootstrap_form_options
10
+
11
+ def initialize(object_name, object, template, options)
12
+ @bootstrap_form_options = RailsBootstrapForm::BootstrapFormOptions.new(options.delete(:bootstrap_form))
13
+ apply_default_form_options(options)
14
+ super(object_name, object, template, options)
15
+ end
16
+
17
+ def apply_default_form_options(options)
18
+ options[:html] ||= {}
19
+ options[:html].reverse_merge!(RailsBootstrapForm.config.default_form_attributes)
20
+ end
21
+
22
+ private :apply_default_form_options
23
+ end
24
+ end
@@ -0,0 +1,71 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module RailsBootstrapForm
6
+ # Container for bootstrap specific form builder options. It controls options
7
+ # that define form layout, grid sizing, and few other configurable options.
8
+ # They are passed-in into form builder helper and field helpers via
9
+ # `:bootstrap_form` option.
10
+ #
11
+ # For example:
12
+ #
13
+ # bootstrap_form_with model: @user, bootstrap_form: {layout: :inline} do |f|
14
+ # f.text_field :email, bootstrap_form: {label: {text: "Your email"}}
15
+ # end
16
+ #
17
+ class BootstrapFormOptions
18
+
19
+ # Controls form and field layout. It can be "vertical, "horizontal", or "inline".
20
+ # It can also be "floating" if field should have floating labels.
21
+ attr_accessor :layout
22
+
23
+ def initialize(options = {})
24
+ set_defaults
25
+ set_bootstrap_form_options(options)
26
+ end
27
+
28
+ def horizontal?
29
+ @layout.to_s == "horizontal"
30
+ end
31
+
32
+ def inline?
33
+ @layout.to_s == "inline"
34
+ end
35
+
36
+ def vertical?
37
+ @layout.to_s == "vertical"
38
+ end
39
+
40
+ def floating?
41
+ @layout.to_s == "floating"
42
+ end
43
+
44
+ # This will return a copy of `BootstrapFormOptions` object with new options set
45
+ # that don't affect original object. This way we can have options specific
46
+ # to a given form field. For example, we can change grid just for one field:
47
+ #
48
+ # bootstrap_form_with model: @user do |f|
49
+ # f.text_field :email, bootstrap_form: {label_col_class: "col-md-6", control_col_class: "col-md-6"}
50
+ # f.password_field :password
51
+ # end
52
+ #
53
+ def scoped(options = {})
54
+ scope = clone
55
+ scope.set_bootstrap_form_options(options)
56
+ scope
57
+ end
58
+
59
+ def set_bootstrap_form_options(options)
60
+ options.is_a?(Hash) && options.each do |key, value|
61
+ public_send("#{key}=", value)
62
+ end
63
+ end
64
+
65
+ def set_defaults
66
+ @layout = "vertical"
67
+ end
68
+
69
+ private :set_defaults
70
+ end
71
+ end
@@ -3,6 +3,6 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  module RailsBootstrapForm
6
- VERSION = "0.1.1".freeze
6
+ VERSION = "0.2.0".freeze
7
7
  REQUIRED_RAILS_VERSION = "~> 7.0".freeze
8
8
  end
@@ -4,12 +4,15 @@
4
4
 
5
5
  require "action_view"
6
6
  require "action_pack"
7
+ require "rails_bootstrap_form/action_view_extensions/bootstrap_form_helper"
7
8
 
8
9
  module RailsBootstrapForm
9
10
  extend ActiveSupport::Autoload
10
11
 
11
12
  eager_autoload do
12
13
  autoload :Configuration
14
+ autoload :BootstrapFormOptions
15
+ autoload :BootstrapFormBuilder
13
16
  end
14
17
 
15
18
  class << self
@@ -25,6 +28,14 @@ module RailsBootstrapForm
25
28
  yield config
26
29
  end
27
30
  end
31
+
32
+ # Override `field_error_proc` to suppress errors coming from user defined
33
+ # `field_error_proc`.
34
+ mattr_accessor :field_error_proc
35
+ @@field_error_proc = proc do |html_tag, _instance_tag|
36
+ html_tag
37
+ end
38
+
28
39
  end
29
40
 
30
41
  require "rails_bootstrap_form/engine" if defined?(Rails)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_bootstrap_form
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harshal LADHE (shivam091)
@@ -41,6 +41,7 @@ files:
41
41
  - README.md
42
42
  - Rakefile
43
43
  - app/assets/stylesheets/rails_bootstrap_form.css
44
+ - demo/.byebug_history
44
45
  - demo/.ruby-version
45
46
  - demo/Rakefile
46
47
  - demo/app/assets/config/manifest.js
@@ -48,11 +49,24 @@ files:
48
49
  - demo/app/channels/application_cable/channel.rb
49
50
  - demo/app/channels/application_cable/connection.rb
50
51
  - demo/app/controllers/application_controller.rb
52
+ - demo/app/controllers/users_controller.rb
51
53
  - demo/app/helpers/application_helper.rb
52
54
  - demo/app/jobs/application_job.rb
53
55
  - demo/app/mailers/application_mailer.rb
56
+ - demo/app/models/address.rb
54
57
  - demo/app/models/application_record.rb
58
+ - demo/app/models/country.rb
59
+ - demo/app/models/fruit.rb
60
+ - demo/app/models/skill.rb
61
+ - demo/app/models/user.rb
62
+ - demo/app/models/user_skill.rb
55
63
  - demo/app/views/layouts/application.html.erb
64
+ - demo/app/views/users/_form.html.erb
65
+ - demo/app/views/users/_form_without_bootstrap_helpers.html.erb
66
+ - demo/app/views/users/_vertical_form.html.erb
67
+ - demo/app/views/users/edit.html.erb
68
+ - demo/app/views/users/index.html.erb
69
+ - demo/app/views/users/new.html.erb
56
70
  - demo/bin/bundle
57
71
  - demo/bin/rails
58
72
  - demo/bin/rake
@@ -76,6 +90,13 @@ files:
76
90
  - demo/config/puma.rb
77
91
  - demo/config/routes.rb
78
92
  - demo/config/storage.yml
93
+ - demo/db/migrate/20230514054308_create_countries.rb
94
+ - demo/db/migrate/20230514054851_create_fruits.rb
95
+ - demo/db/migrate/20230514055237_create_users.rb
96
+ - demo/db/migrate/20230514055840_create_addresses.rb
97
+ - demo/db/migrate/20230514060556_create_skills.rb
98
+ - demo/db/migrate/20230514061100_create_user_skills.rb
99
+ - demo/db/schema.rb
79
100
  - demo/db/seeds.rb
80
101
  - demo/public/favicon.ico
81
102
  - gemfiles/7.0.gemfile
@@ -83,6 +104,9 @@ files:
83
104
  - lib/generators/rails_bootstrap_form/install_generator.rb
84
105
  - lib/generators/rails_bootstrap_form/templates/install.rb
85
106
  - lib/rails_bootstrap_form.rb
107
+ - lib/rails_bootstrap_form/action_view_extensions/bootstrap_form_helper.rb
108
+ - lib/rails_bootstrap_form/bootstrap_form_builder.rb
109
+ - lib/rails_bootstrap_form/bootstrap_form_options.rb
86
110
  - lib/rails_bootstrap_form/configuration.rb
87
111
  - lib/rails_bootstrap_form/engine.rb
88
112
  - lib/rails_bootstrap_form/version.rb