bootstraps_bootstraps 0.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  *.swp
2
+ bootstraps_bootstraps-0.0.1.gem
data/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  To get the best experience out of both worlds Rails needs a bit of bootstrapping to get a form builder that plays nice with Bootstrap. This gem provides the bootstraps that Bootstrap needs to make Rails+Bootstrap a potent combination.
8
8
 
9
+ Development of this gem more or less follows [Bootstrap-sass](https://github.com/thomas-mcdonald/bootstrap-sass). As such the version number of this project correspond to the Twitter Bootstrap version numbers for both the Major and Minor. The Patch number will track independently.
10
+
9
11
  ##Current Features
10
12
 
11
13
  An extended form_for called `bootstrap_form` with all the classic functionality yet extended to provide correct Bootstrap 2 syntax for horizontal forms (classed with .form_horizontal) for most elements.
@@ -19,24 +21,33 @@ More or less I'm writing this library as needed. Each time I find myself trying
19
21
  Things that I know aren't in the library yet:
20
22
 
21
23
  - Collection methods (select box, check boxes, radio buttons)
22
- - Check boxes in general
23
- - Full implementation of an optional attribute to make bootstrapped_form silence and revert to the default for a specific form field
24
- - `.form-vertical`, `.form-search`, and `.form-inline` specific html syntax
25
24
 
26
25
  ##Use
27
26
 
28
- Add this to your gemfile: `gem 'bootstraps_bootstraps', git: 'git@github.com:robacarp/bootstraps_bootstraps.git'`
27
+ Add it to your gemfile: `gem 'bootstraps_bootstraps'`
29
28
 
30
29
  To use the Bootstrap 2 form helper in your views:
31
30
 
32
31
  ```ruby
33
- = bootstrapped_form @user do |f|
32
+
33
+ # set the form class as you would for the Bootstrap library. Bootstraps_bootstraps will use that to determine the html elements required.
34
+ = bootstrapped_form @user, html: {class: 'form-horizontal'} do |f|
35
+ # Labels are added automatically
34
36
  = f.text_field :first_name
35
37
  = f.text_field :last_name
38
+
39
+ # Override the label text with :label in the options hash
36
40
  = f.collection_select :occupations, Occupation.all, :id, :name, :label => 'Job'
37
41
  = f.text_field :address, :label => "Address Line 1"
38
42
  = f.text_field :address2, :label => "Line 2"
39
- = f.submit ("Shipping Options →").html_safe, :class=>'fright'
43
+
44
+ #make an inline field group inside of the horizontal form
45
+ = f.inline_inputs label: 'Expiration Date' do |inline|
46
+ = inline.collection_select :month, (1..12), :to_s, :to_s
47
+ \-
48
+ = inline.collection_select :year, (Time.now.year...Time.now.year + 10), :to_s, :to_s
49
+
50
+ = f.submit
40
51
  ```
41
52
 
42
53
  ## Contributing
@@ -4,7 +4,7 @@ require File.expand_path('../lib/version', __FILE__)
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Robert L. Carpenter"]
6
6
  gem.email = ["codemonkey@robacarp.com"]
7
- gem.description = %q{A gem to make working with Bootstrap 2.0 in Rails 3 easier and better. Includes a new bootstrapped_form replacement for form_for which wgives error text handling and html formatting to match Bootstrap's syntax.}
7
+ gem.description = %q{A gem to make working with Bootstrap 2.0 in Rails 3 easier and better. Includes a new bootstrapped_form replacement for form_for which gives error text handling and html formatting to match Bootstrap's syntax.}
8
8
  gem.summary = %q{Bootstrap 2.0 html helpers for Rails 3}
9
9
  gem.homepage = "https://github.com/robacarp/bootstraps_bootstraps"
10
10
 
@@ -1,7 +1,7 @@
1
1
  require 'version.rb'
2
2
 
3
3
  module BootstrapsBootstraps
4
- require 'bootstraps_bootstraps/bootstrap_form_builder.rb'
5
- require 'bootstraps_bootstraps/bootstrap_form_helper.rb'
6
- require 'bootstraps_bootstraps/railtie'
4
+ load 'bootstraps_bootstraps/bootstrap_form_builder.rb'
5
+ load 'bootstraps_bootstraps/bootstrap_form_helper.rb'
6
+ load 'bootstraps_bootstraps/railtie.rb'
7
7
  end
@@ -1,21 +1,46 @@
1
+ module ActionView
2
+ module Helpers
3
+ module FormHelper
4
+
5
+ def wrapped_inputs object_name, object = nil, options = {}, wrapper, &block
6
+ builder = instantiate_builder(object_name, object, options, &block)
7
+ fields = capture(builder, &block)
8
+ wrapper.call(fields)
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+
15
+
1
16
  module BootstrapsBootstraps
17
+ #
18
+ # This class started out as a gist somewhere but I can't seem to find the
19
+ # original. At any rate its been modified over time to make it not break
20
+ # and to update it to make it compatible with Bootstrap2.
21
+ #
22
+ # If I'm being brutally honest its a bit of a cluster of metaprogramming
23
+ # and it can be pretty difficult to understand. BUT it does seem to work
24
+ # so far.
25
+ #
2
26
  class BootstrapFormBuilder < ActionView::Helpers::FormBuilder
3
27
 
4
28
  delegate :capture, :content_tag, :tag, to: :@template
5
29
 
6
- #
7
- # This method started out as a gist somewhere but I can't seem to find the
8
- # original. At any rate its been modified over time to make it not break
9
- # and to update it to make it compatible with Bootstrap2.
10
- #
11
- # If I'm being brutally honest its a bit of a cluster of metaprogramming
12
- # and it can be pretty difficult to understand. BUT it does seem to work
13
- # so far.
14
- #
15
- %w[text_field text_area password_field collection_select].each do |method_name|
30
+ def initialize(object_name, object, template, options, block)
31
+ super(object_name, object, template, options, block)
32
+
33
+ @form_mode = :vertical #default value
34
+ @form_mode = :horizontal if options[:horizontal] || detect_html_class(options, 'form-horizontal')
35
+ @form_mode = :search if options[:search] || detect_html_class(options, 'form-search')
36
+ @form_mode = :inline if options[:inline] || detect_html_class(options, 'form-inline')
37
+ end
38
+
39
+ %w[text_field text_area password_field number_field telephone_field url_field email_field range_field collection_select].each do |method_name|
16
40
  define_method(method_name) do |name, *args|
17
41
  options = args.extract_options!
18
42
 
43
+ #abort and just let the rails formbuilder do its thing
19
44
  if options[:vanilla]
20
45
  return super(name, *(args.push(options)))
21
46
  end
@@ -24,35 +49,54 @@ module BootstrapsBootstraps
24
49
  error_msg = object.errors[name].any? ? content_tag(:span, object.errors[name].join(","), class: 'help-inline') : ''
25
50
 
26
51
  help_text = options[:help_text].blank? ? '' : content_tag(:span,options[:help_text], class: 'help-block')
27
- label = options[:label] == '' ? ''.html_safe : field_label(name, options)
28
52
 
29
- if options[:large] || method_name == 'text_area'
30
- options[:class] = [options[:class]] || []
31
- options[:class].push 'xxlarge'
32
- end
53
+ label = options[:label] == false ? ''.html_safe : field_label(name, options.except(:class))
33
54
 
34
- content_tag :div, class: "control-group #{errors}" do
35
- label + content_tag(:div, class: "controls #{errors}") do
36
- super(name, *(args.push(options))) + ' ' + error_msg
37
- end + help_text
38
- end
55
+ options[:class] = [options[:class]] unless options[:class].kind_of?(Array)
56
+ options[:class].push 'xxlarge' if options[:large] || method_name == 'text_area'
57
+ options[:class].push 'inline' if @form_mode == :inline
58
+
59
+ args.push(options).unshift(name)
60
+
61
+ field = super(*args) + ' ' + error_msg
62
+
63
+ #wrap it in div.controls
64
+ field = div_with_class(['controls',errors], :content => field) if @form_mode == :horizontal
65
+
66
+ #tack on the label
67
+ field = label + field unless @form_mode == :inline
68
+
69
+ #wrap it in div.control-group
70
+ field = div_with_class(['control-group',errors], :content => field) if @form_mode == :horizontal
71
+
72
+ field
39
73
  end
40
74
  end
41
75
 
42
76
  #TODO update for bootstrap 2
43
77
  def check_box(name, *args)
44
- content_tag :div, class:"clearfix" do
45
- content_tag(:div, class:"input") do
46
- content_tag(:ul, class:"inputs-list") do
47
- content_tag(:li) do
48
- content_tag(:label) do
49
- super(name, *args) + content_tag(:span) do
50
- field_label(name, *args)
51
- end
52
- end
53
- end
54
- end
78
+ if options[:vanilla]
79
+ return super *args
80
+ end
81
+
82
+ options = args.extract_options!
83
+ if options.has_key? :class
84
+ unless options[:class].kind_of? Array
85
+ options[:class] = [options[:class]]
55
86
  end
87
+ else
88
+ options[:class] = []
89
+ end
90
+
91
+ options[:class].push :checkbox
92
+
93
+ text = options[:label] || ''
94
+ options.delete :label
95
+
96
+ args = args.push options
97
+
98
+ field_label(name, *args) do
99
+ super(name, *args) + text
56
100
  end
57
101
  end
58
102
 
@@ -67,20 +111,67 @@ module BootstrapsBootstraps
67
111
  super *args
68
112
  end
69
113
  end
114
+ end
70
115
 
116
+ def inline_inputs field_options = {}, &block
117
+ field_options[:inline] = true
118
+ wrapper = lambda { |content|
119
+ field_group = div_with_class('controls', content: content)
120
+ field_group = label( field_options[:label], field_options[:label], class: 'control-label' ) + field_group
121
+ field_group = div_with_class('control-group', content: field_group)
122
+ }
123
+ @template.wrapped_inputs(@object_name, @object, @options.merge(field_options), wrapper, &block)
71
124
  end
72
125
 
73
126
  private
74
127
 
75
- def field_label(name, *args)
128
+ def field_label(name, *args, &block)
76
129
  options = args.extract_options!
130
+ clss = options[:class] || []
131
+
77
132
  required = object.class.validators_on(name).any? { |v| v.kind_of? ActiveModel::Validations::PresenceValidator}
78
- label(name, options[:label], class: ("required" if required))
133
+ clss.push 'required' if required
134
+
135
+
136
+ label(name, options[:label], class: clss, &block)
79
137
  end
80
138
 
81
139
  def objectify_options(options)
82
140
  super.except(:label)
83
141
  end
84
142
 
143
+ def detect_html_class options_hash, css_class
144
+ if options[:html] && options[:html][:class]
145
+ if options[:html][:class].kind_of? Array
146
+ options[:html][:class].include css_class
147
+ elsif options[:html][:class].kind_of? String
148
+ options[:html][:class] == css_class
149
+ else
150
+ false
151
+ end
152
+ else
153
+ false
154
+ end
155
+ end
156
+
157
+ def div_with_class clss, options = {}, &block
158
+ options[:class] = [options[:class]] || []
159
+ options[:class].push clss
160
+
161
+ classes = options[:class].join(' ').strip
162
+
163
+ if block_given?
164
+ content_tag :div, :class => classes, &block
165
+ elsif options[:content]
166
+ content_tag :div, :class => classes do
167
+ options[:content]
168
+ end
169
+ else
170
+ content_tag :div, :class => classes do
171
+ end
172
+ end
173
+ end
174
+
175
+
85
176
  end
86
177
  end
@@ -1,3 +1,5 @@
1
+ require 'ruby-debug'
2
+
1
3
  module BootstrapsBootstraps
2
4
  class Railtie < Rails::Railtie
3
5
  initializer "bootstraps_bootstraps.configure_rails_initialization" do |application|
@@ -8,6 +10,8 @@ module BootstrapsBootstraps
8
10
  end
9
11
 
10
12
  config.to_prepare do
13
+ #RELOAD THE GEM ALL THE TIME WITHOUT RESTARTING THE SERVER :O (without restarting the server)
14
+ ::ActionView::Helpers.send(:load, 'bootstraps_bootstraps/bootstrap_form_builder.rb')
11
15
  ::ActionView::Helpers.send(:include, BootstrapsBootstraps::BootstrapFormHelper)
12
16
  end
13
17
  end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module BootstrapsBootstraps
2
- VERSION = "0.0.1"
2
+ VERSION = "2.0.0"
3
3
  end
metadata CHANGED
@@ -3,10 +3,10 @@ name: bootstraps_bootstraps
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
+ - 2
6
7
  - 0
7
8
  - 0
8
- - 1
9
- version: 0.0.1
9
+ version: 2.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Robert L. Carpenter
@@ -14,11 +14,11 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2012-02-06 00:00:00 -07:00
17
+ date: 2012-02-09 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
21
- description: A gem to make working with Bootstrap 2.0 in Rails 3 easier and better. Includes a new bootstrapped_form replacement for form_for which wgives error text handling and html formatting to match Bootstrap's syntax.
21
+ description: A gem to make working with Bootstrap 2.0 in Rails 3 easier and better. Includes a new bootstrapped_form replacement for form_for which gives error text handling and html formatting to match Bootstrap's syntax.
22
22
  email:
23
23
  - codemonkey@robacarp.com
24
24
  executables: []