bootstrap_form 2.0.1 → 2.1.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
  SHA1:
3
- metadata.gz: ca2f49082f337eb1dc61b216ffc2b0c29f2f432b
4
- data.tar.gz: 2e33b7c8f7af22cc53df4a8638bee6ade8a51fe8
3
+ metadata.gz: 311b2d08aa1d52ca0c3dc819c1f061916aa59708
4
+ data.tar.gz: 05a500f081ca6e0cfe8f452120d50f564ef0c353
5
5
  SHA512:
6
- metadata.gz: a84f353aba50af9ed2f66008b63d3ce286d441fe110fa0099c6e5e0b974b45af81b946971d823efdca1c69191c9cc7b52a60d9fec9429e25ab7cfcd7a3e9341d
7
- data.tar.gz: c52e0ee82e6c94ca1f585990635723761c4d3e2a6e027af1701b108bdc89bfc69ed20754bcffe65af41dd7fe8d48117a00755785efd034a7d8612f51c5ad4350
6
+ metadata.gz: d2cafdbe6823b47db0a1ee71ad330d9086a1c37d5eeda88a3e4c6764b0c25d948886ab76f25ec7fb5b82f3927e9a4a0bc44a610cfd37e41ea9209491f015ca7a
7
+ data.tar.gz: 8cfc0f84c79178a5f9da7706d0a93397544213d8e69a7096aa9dffeefe154e472514a90644091907d7cf4c9a6749492cc9fdd932c273d69589dbbc04cd67eda5
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2012 YOURNAME
1
+ Copyright 2012-2014 Stephen Potenza <potenza@gmail.com>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
- [![Build Status](https://travis-ci.org/potenza/bootstrap_form.png)](https://travis-ci.org/potenza/bootstrap_form) [![Code Climate](https://codeclimate.com/github/potenza/bootstrap_form.png)](https://codeclimate.com/github/potenza/bootstrap_form)
1
+ [![Build Status](https://travis-ci.org/bootstrap-ruby/rails-bootstrap-forms.png)](https://travis-ci.org/bootstrap-ruby/rails-bootstrap-forms) [![Code Climate](https://codeclimate.com/github/bootstrap-ruby/rails-bootstrap-forms.png)](https://codeclimate.com/github/bootstrap-ruby/rails-bootstrap-forms)
2
2
 
3
- # BootstrapForm
3
+ # Rails Bootstrap Forms
4
4
 
5
- **BootstrapForm** is a rails form builder that makes it super easy to integrate
5
+ **Rails Bootstrap Forms** is a rails form builder that makes it super easy to integrate
6
6
  twitter bootstrap-style forms into your rails application.
7
7
 
8
8
  ## Requirements
9
9
 
10
10
  * Ruby 1.9+
11
- * Rails 3+
11
+ * Rails 4.0+
12
12
  * Twitter Bootstrap 3.0+
13
13
 
14
14
  ## Installation
@@ -21,16 +21,20 @@ Then:
21
21
 
22
22
  `bundle`
23
23
 
24
+ Then require the CSS on your `application.css` file:
25
+
26
+ `//= require rails_bootstrap_forms`
27
+
24
28
  ## Usage
25
29
 
26
- To get started, just use the **BootstrapForm** form helper. Here's an example:
30
+ To get started, just use the `bootstrap_form_for` helper. Here's an example:
27
31
 
28
32
  ```erb
29
33
  <%= bootstrap_form_for(@user) do |f| %>
30
34
  <%= f.email_field :email %>
31
35
  <%= f.password_field :password %>
32
36
  <%= f.check_box :remember_me %>
33
- <%= f.submit "Log In" %>
37
+ <%= f.submit %>
34
38
  <% end %>
35
39
  ```
36
40
 
@@ -56,25 +60,50 @@ This generates the following HTML:
56
60
  </form>
57
61
  ```
58
62
 
63
+ ### bootstrap_form_tag
64
+
65
+ If your form is not backed by a model, use the `bootstrap_form_tag`. Usage of this helper is the same as `bootstrap_form_for`, except no model object is passed in as the first argument. Here's an example:
66
+
67
+ ```erb
68
+ <%= bootstrap_form_tag url: '/subscribe' do |f| %>
69
+ <%= f.email_field :email %>
70
+ <%= f.submit %>
71
+ <% end %>
72
+ ```
73
+
59
74
  ### Supported Form Helpers
60
75
 
61
76
  This gem wraps the following Rails form helpers:
62
77
 
63
- * text_field
64
- * password_field
65
- * text_area
66
- * file_field
67
- * number_field
68
- * email_field
69
- * telephone_field / phone_field
70
- * url_field
71
- * select
78
+ * check_box
79
+ * check_boxes_collection
72
80
  * collection_select
81
+ * color_field
82
+ * date_field
73
83
  * date_select
74
- * time_select
84
+ * datetime_field
85
+ * datetime_local_field
75
86
  * datetime_select
76
- * check_box
87
+ * email_field
88
+ * file_field
89
+ * grouped_collection_select
90
+ * hidden_field (not wrapped, but supported)
91
+ * month_field
92
+ * number_field
93
+ * password_field
94
+ * phone_field
77
95
  * radio_button
96
+ * radio_buttons_collection
97
+ * range_field
98
+ * search_field
99
+ * select
100
+ * telephone_field
101
+ * text_area
102
+ * text_field
103
+ * time_field
104
+ * time_select
105
+ * url_field
106
+ * week_field
78
107
 
79
108
  ### Default Form Style
80
109
 
@@ -83,48 +112,65 @@ will grow to 100% of the available width.
83
112
 
84
113
  ### Inline Forms
85
114
 
86
- To use an inline-style form, use the `style: :inline` option. To hide labels,
115
+ To use an inline-layout form, use the `layout: :inline` option. To hide labels,
87
116
  use the `hide_label: true` option, which keeps your labels accessible to those
88
117
  using screen readers.
89
118
 
90
119
  ```erb
91
- <%= bootstrap_form_for(@user, style: :inline) do |f| %>
120
+ <%= bootstrap_form_for(@user, layout: :inline) do |f| %>
92
121
  <%= f.email_field :email, hide_label: true %>
93
122
  <%= f.password_field :password, hide_label: true %>
94
123
  <%= f.check_box :remember_me %>
95
- <%= f.submit "Log In" %>
124
+ <%= f.submit %>
96
125
  <% end %>
97
126
  ```
98
127
 
99
128
  ### Horizontal Forms
100
129
 
101
- To use a horizontal-style form with labels to the left of the inputs, use the
102
- `style: :horizontal` option. You should specify both `left` and `right` css
103
- classes as well (they default to `col-sm-2` and `col-sm-10`).
130
+ To use a horizontal-layout form with labels to the left of the control, use the
131
+ `layout: :horizontal` option. You should specify both `label_col` and
132
+ `control_col` css classes as well (they default to `col-sm-2` and `col-sm-10`).
104
133
 
105
134
  In the example below, the checkbox and submit button have been wrapped in a
106
135
  `form_group` to keep them properly aligned.
107
136
 
108
137
  ```erb
109
- <%= bootstrap_form_for(@user, style: :horizontal, left: "col-sm-2", right: "col-sm-10") do |f| %>
138
+ <%= bootstrap_form_for(@user, layout: :horizontal, label_col: "col-sm-2", control_col: "col-sm-10") do |f| %>
110
139
  <%= f.email_field :email %>
111
140
  <%= f.password_field :password %>
112
141
  <%= f.form_group do %>
113
142
  <%= f.check_box :remember_me %>
114
143
  <% end %>
115
144
  <%= f.form_group do %>
116
- <%= f.submit "Log In" %>
145
+ <%= f.submit %>
117
146
  <% end %>
118
147
  <% end %>
119
148
  ```
120
149
 
121
- To create a static control in a horizontal form, use the following markup:
150
+ The `label_col` and `control_col` css classes can also be changed per control:
122
151
 
123
152
  ```erb
124
- <%= f.form_group :nil, label: { text: "Foo" } do %>
125
- <p class="form-control-static">
126
- Bar
127
- </p>
153
+ <%= bootstrap_form_for(@user, layout: :horizontal) do |f| %>
154
+ <%= f.email_field :email %>
155
+ <%= f.text_field :age, control_col: "col-sm-3" %>
156
+ <%= f.form_group do %>
157
+ <%= f.submit %>
158
+ <% end %>
159
+ <% end %>
160
+ ```
161
+
162
+ ### Custom Field Layout
163
+
164
+ The `layout` can be overriden per field:
165
+
166
+ ```erb
167
+ <%= bootstrap_form_for(@user, layout: :horizontal) do |f| %>
168
+ <%= f.email_field :email %>
169
+ <%= f.text_field :feet, layout: :inline %>
170
+ <%= f.text_field :inches, layout: :inline %>
171
+ <%= f.form_group do %>
172
+ <%= f.submit %>
173
+ <% end %>
128
174
  <% end %>
129
175
  ```
130
176
 
@@ -157,13 +203,20 @@ The `btn btn-default` css classes are automatically added to your submit
157
203
  buttons.
158
204
 
159
205
  ```erb
160
- <%= f.submit "Log In" %>
206
+ <%= f.submit %>
207
+ ```
208
+
209
+ You can also use the `primary` helper, which adds `btn btn-primary` to your
210
+ submit button **(master branch only)**:
211
+
212
+ ```erb
213
+ <%= f.primary "Optional Label" %>
161
214
  ```
162
215
 
163
216
  You can specify your own classes like this:
164
217
 
165
218
  ```erb
166
- <%= f.submit "Log In", class: "btn btn-primary" %>
219
+ <%= f.submit "Log In", class: "btn btn-success" %>
167
220
  ```
168
221
 
169
222
  ### Checkboxes and Radios
@@ -204,6 +257,22 @@ To display checkboxes and radios inline, pass the `inline: true` option:
204
257
  <% end %>
205
258
  ```
206
259
 
260
+ #### Collections
261
+
262
+ BootstrapForms also provide helpful helpers that automatically creates the
263
+ `form_group` and the `radio_button`s or `check_box`es for you:
264
+
265
+ ```erb
266
+ <%= f.radio_buttons_collection :skill_level, Skill.all, :id, :name %>
267
+ <%= f.check_boxes_collection :skills, Skill.all, :id, :name %>
268
+ ```
269
+
270
+ Collection methods accept these options:
271
+ * `:label`: Customize the `form_group`'s label;
272
+ * `:hide_label`: Pass true to hide the `form_group`'s label;
273
+ * `:help`: Add a help span to the `form_group`;
274
+ * Other options will be forwarded to the `radio_button`/`check_box` method;
275
+
207
276
  ### Prepending and Appending Inputs
208
277
 
209
278
  You can pass `prepend` and/or `append` options to input fields:
@@ -212,6 +281,41 @@ You can pass `prepend` and/or `append` options to input fields:
212
281
  <%= f.text_field :price, prepend: "$", append: ".00" %>
213
282
  ```
214
283
 
284
+ ### Static Controls **(master branch only)**
285
+
286
+ You can create a static control like this:
287
+
288
+ ```erb
289
+ <%= f.static_control :email %>
290
+ ```
291
+
292
+ Here's the output:
293
+
294
+ ```html
295
+ <div class="form-group">
296
+ <label class="col-sm-2 control-label" for="user_email">Email</label>
297
+ <div class="col-sm-10">
298
+ <p class="form-control-static">test@email.com</p>
299
+ </div>
300
+ </div>
301
+ ```
302
+
303
+ You can also create a static control that isn't based on a model attribute:
304
+
305
+ ```erb
306
+ <%= f.static_control nil, label: "Custom Static Control" do %>
307
+ Content Here
308
+ <% end %>
309
+ ```
310
+
311
+ ### Date helpers
312
+
313
+ The multiple selects that the date and time helpers (`date_select`,
314
+ `time_select`, `datetime_select`) generate are wrapped inside a
315
+ `div.rails-bootstrap-forms-[date|time|datetime]-select` tag. This is because
316
+ Boostrap automatically stylizes ours controls as `block`s. This wrapper fix
317
+ this defining these selects as `inline-block` and a width of `auto`.
318
+
215
319
  ### Validation Errors
216
320
 
217
321
  When a validation error is triggered, the field will be outlined and the error
@@ -219,20 +323,88 @@ will be displayed below the field. Rails normally wraps the fields in a div
219
323
  (field_with_errors), but this behavior is suppressed.
220
324
 
221
325
  To display an error message wrapped in `.alert` and `.alert-danger`
222
- classes, you can use the `alert_message` helper:
326
+ classes, you can use the `alert_message` helper. This won't output anything
327
+ unless a model validation has failed.
223
328
 
224
329
  ```erb
225
330
  <%= f.alert_message "Please fix the errors below." %>
226
331
  ```
227
332
 
333
+ You can turn off inline errors with the option `inline_errors: false`. Combine
334
+ this with `alert_message` to display an alert message with an error summary.
335
+
336
+ ```erb
337
+ <%= bootstrap_form_for(@user, inline_errors: false) do |f| %>
338
+ <%= f.alert_message "Please fix the following errors:" %>
339
+ <% end %>
340
+ ```
341
+
342
+ If you don't want an error summary, just send the `error_summary: false` option
343
+ to `alert_message`.
344
+
345
+ ```erb
346
+ <%= bootstrap_form_for(@user, inline_errors: false) do |f| %>
347
+ <%= f.alert_message "Please fix the following errors", error_summary: false %>
348
+ <% end %>
349
+ ```
350
+
351
+ To output a simple unordered list of errors, use `error_summary`.
352
+
353
+ ```erb
354
+ <%= bootstrap_form_for(@user, inline_errors: false) do |f| %>
355
+ <%= f.error_summary %>
356
+ <% end %>
357
+ ```
358
+
359
+ If you want to display a custom inline error for a specific attribute not represented by a form field, use the `errors_on` helper.
360
+
361
+ ```erb
362
+ <%= f.errors_on :tasks %>
363
+ ```
364
+
365
+ The error will be wrapped in a div with `.alert` and `.alert-danger`
366
+ classes.
367
+
368
+ ```html
369
+ <div class="alert alert-danger">Tasks must be added (at least one).</div>
370
+ ```
371
+
372
+ ### Internationalization
373
+
374
+ bootstrap_form follows standard rails conventions so it's i18n-ready. See more
375
+ here: http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models
376
+
228
377
  ## Code Triage page
229
378
 
230
379
  http://www.codetriage.com/potenza/bootstrap_form
231
380
 
381
+ ## Contributing
382
+
383
+ We love pull requests! Here's a quick guide for contributing:
384
+
385
+ 1. Fork the repo.
386
+
387
+ 2. Run the existing test suite:
388
+
389
+ `$ cd test/dummy && bundle exec rake db:create db:migrate RAILS_ENV=test && cd ../../`
390
+ `$ bundle exec rake`
391
+
392
+ 3. Add tests for your change.
393
+
394
+ 4. Add your changes and make your test(s) pass. Following the conventions you
395
+ see used in the source will increase the chance that your pull request is
396
+ accepted right away.
397
+
398
+ 5. Update the README if necessary.
399
+
400
+ 6. Add a line to the CHANGELOG for your bug fix or feature.
401
+
402
+ 7. Push to your fork and submit a pull request.
403
+
232
404
  ## Contributors
233
405
 
234
- https://github.com/potenza/bootstrap_form/graphs/contributors
406
+ https://github.com/bootstrap-ruby/rails-bootstrap-forms/graphs/contributors
235
407
 
236
408
  ## License
237
409
 
238
- MIT License. Copyright 2012-2013 Stephen Potenza (https://github.com/potenza)
410
+ MIT License. Copyright 2012-2014 Stephen Potenza (https://github.com/potenza)
@@ -0,0 +1,10 @@
1
+ .rails-bootstrap-forms-date-select select,
2
+ .rails-bootstrap-forms-time-select select,
3
+ .rails-bootstrap-forms-datetime-select select {
4
+ display: inline-block;
5
+ width: auto;
6
+ }
7
+
8
+ .rails-bootstrap-forms-error-summary {
9
+ margin-top: 10px;
10
+ }
@@ -1,7 +1,12 @@
1
+ require 'bootstrap_form/bootstrap_helpers'
1
2
  require 'bootstrap_form/form_builder'
2
3
  require 'bootstrap_form/helper'
3
4
 
4
5
  module BootstrapForm
6
+ module Rails
7
+ class Engine < ::Rails::Engine
8
+ end
9
+ end
5
10
  end
6
11
 
7
12
  ActionView::Base.send :include, BootstrapForm::Helper
@@ -0,0 +1,66 @@
1
+ module BootstrapForm
2
+ module BootstrapHelpers
3
+ def submit(name = nil, options = {})
4
+ options.merge! class: "btn btn-default" unless options.has_key? :class
5
+ super(name, options)
6
+ end
7
+
8
+ def primary(name = nil, options = {})
9
+ options.merge! class: "btn btn-primary"
10
+ submit(name, options)
11
+ end
12
+
13
+ def alert_message(title, options = {})
14
+ css = options[:class] || "alert alert-danger"
15
+
16
+ if object.respond_to?(:errors) && object.errors.full_messages.any?
17
+ content_tag :div, class: css do
18
+ concat content_tag :p, title
19
+ concat error_summary unless inline_errors || options[:error_summary] == false
20
+ end
21
+ end
22
+ end
23
+
24
+ def error_summary
25
+ content_tag :ul, class: "rails-bootstrap-forms-error-summary" do
26
+ object.errors.full_messages.each do |error|
27
+ concat content_tag(:li, error)
28
+ end
29
+ end
30
+ end
31
+
32
+ def errors_on(name)
33
+ if has_error?(name)
34
+ content_tag :div, class: "alert alert-danger" do
35
+ object.errors.full_messages_for(name).join(", ")
36
+ end
37
+ end
38
+ end
39
+
40
+ def static_control(name, options = {}, &block)
41
+ html = if block_given?
42
+ capture(&block)
43
+ else
44
+ object.send(name)
45
+ end
46
+
47
+ form_group_builder(name, options) do
48
+ content_tag(:p, html, class: static_class)
49
+ end
50
+ end
51
+
52
+ def prepend_and_append_input(options, &block)
53
+ options = options.extract!(:prepend, :append)
54
+ input = capture(&block)
55
+
56
+ input = content_tag(:span, options[:prepend], class: "input-group-addon") + input if options[:prepend]
57
+ input << content_tag(:span, options[:append], class: "input-group-addon") if options[:append]
58
+ input = content_tag(:div, input, class: "input-group") if options[:prepend] || options[:append]
59
+ input
60
+ end
61
+
62
+ def static_class
63
+ "form-control-static"
64
+ end
65
+ end
66
+ end