volt-fields 0.1.3 → 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
  SHA1:
3
- metadata.gz: 367e338964108d7f1191e201bd9abe726b9092e2
4
- data.tar.gz: 834a3bd03171d6b49c77c090f5295a0c0ca82467
3
+ metadata.gz: 4c9d96aca673395cee2c2ee656eb50fe29c44301
4
+ data.tar.gz: c8d8b64589e87542026de04cf4b0a6f1e93902c6
5
5
  SHA512:
6
- metadata.gz: ee7343ee75568268dc8837ef993c0e15d3ef9b82263a1df5340d45df7ee90978c40693aeb6edb8244aebc2d32b6f01e2f47d63a2c0bffedb45406d5aafd22729
7
- data.tar.gz: d70a0b032a2e7b71c715c8d3f3b2ea1620dfbb4e2af22be79df751b389014211df1691b4f59f5d20829fbbc29f10072372992de6d7bd4349fc2401bd691badf2
6
+ metadata.gz: e63b11644a0d388832d24b48a0309900955a442dbea06f765a81e5563163ec525e2e9529d65e9c50ee607ae93ab5bf2f6c73bbef36896aa444f812d05656af9c
7
+ data.tar.gz: e9bf741a68f1ba7140c4eb8e30cd12f60f5e71170e48a5b1dd4475fef323d0db8a00cda033bc24fb704f1ce180df1786bbde6e4320d03739b0d5e6ea0303700d
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  *.gem
2
2
  *.rbc
3
+ *.DS_Store
3
4
  .bundle
4
5
  .config
5
6
  .yardoc
data/README.md CHANGED
@@ -12,9 +12,10 @@ Currently supported control types:
12
12
  * Select
13
13
  * Radio
14
14
  * Checkbox
15
+ * Button groups / bar
15
16
 
16
17
  ## How to Use
17
- ### Setup
18
+ #### Setup
18
19
  Include in your gemfile:
19
20
 
20
21
  ```
@@ -26,20 +27,46 @@ Then use fields as tags in your views:
26
27
  <:fields:text value="{{ model.first_name }}"/>
27
28
  ```
28
29
 
29
- ### Text and Textarea
30
+ #### Options common to all controls
31
+ Attribute | Description | Required/Optional | Default
32
+ ----- | ----- | -----
33
+ value | The model field to bind to. | Required | None |
34
+ label | A label for the field. Pass 'false' for no label. | Optional | Name of the field on the model.
35
+
36
+ ### Control Types
37
+
38
+ #### Text and Textarea
30
39
  ```
31
40
  <:fields:text value="{{ model.first_name }}"/>
32
41
  ```
42
+ ##### Alternative formats
43
+ * <:fields:textarea />
33
44
 
34
- ### Select
35
- Select fields accept either an array of options, or an array of {label: '', value: ''} hashes.
45
+ #### Select
46
+ Select fields accept either an array of options, or an array of {label: '', value: ''} hashes. You can pass promises and the options will be populated when the promise resolves.
36
47
 
37
48
  ```
38
49
  <:fields:select value="{{ model.role }}" options="{{ ['User', 'Admin', 'Something Else']}}"/>
39
50
  ```
40
-
41
- ### Radio
42
- For radio buttons, pass an options array of {label: '', value: ''} hashes.
51
+
52
+ #### Button Groups / Bar
53
+ [Button groups](http://getbootstrap.com/components/#btn-groups) function just like select boxes, but provide a switch-like interface.
54
+
55
+ ```
56
+ <:fields:button_group selected_button_class="btn-primary" value="{{ model.status }}" options="{{ MyModel.something_that_returns_a_promise }}" />
57
+ ```
58
+
59
+ Attribute | Description | Default
60
+ ------ | ------ | -------
61
+ button_class | Class to apply to all buttons (unless selected_button_class is also supplied) (i.e. btn-default, btn-primary) | 'btn-default'
62
+ active_class | Class applied to the selected option (in addition to selected_button_class (i.e. 'active') | 'active'
63
+ selected_button_class | Class to apply to the selected button (i.e. btn-default, btn-primary) | 'btn-default'
64
+
65
+ ##### Alternative formats
66
+ * <:fields:button_group:justified />
67
+
68
+ #### Radio
69
+ Radio buttons accept either an array of options, or an array of {label: '', value: ''} hashes.
43
70
 
44
71
  ```
45
72
  <:fields:radio value="{{ model.active }}" options="{{[{label: 'Active', value: true},{label:'Inactive', value: false}]}}"/>
@@ -47,10 +74,11 @@ For radio buttons, pass an options array of {label: '', value: ''} hashes.
47
74
 
48
75
  For inline radio buttons, use ```:fields:radio:inline```.
49
76
 
50
- ### Checkbox
77
+ #### Checkbox
51
78
  For checkboxes, use 'checked' instead of 'value' to bind the checkbox to a boolean field.
52
79
  ```
53
80
  <:fields:checkbox checked="{{ model.active }}"/>
54
81
  ```
55
82
 
56
- For inline radio buttons, use ```:fields:radio:inline```.
83
+ ##### Alternative formats
84
+ * <:fields:checkbox:inline />
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
@@ -0,0 +1,28 @@
1
+ require 'fields/controllers/main_controller'
2
+ require 'fields/controllers/select_radio_controller'
3
+
4
+ module Fields
5
+ class ButtonGroupController < SelectRadioController
6
+
7
+ def selected?(value)
8
+ true if value == model_inst.send(@field_name)
9
+ end
10
+
11
+ def set_val(value)
12
+ model_inst.send("#{@field_name}=", value)
13
+ end
14
+
15
+ def button_class
16
+ attrs.button_class || 'btn-default'
17
+ end
18
+
19
+ def selected_button_class
20
+ attrs.selected_button_class || attrs.button_class || 'btn-default'
21
+ end
22
+
23
+ def active_class
24
+ attrs.active_class || 'active'
25
+ end
26
+
27
+ end
28
+ end
@@ -1,6 +1,7 @@
1
1
  module Fields
2
2
  class MainController < Volt::ModelController
3
3
  before_action :setup_field
4
+ reactive_accessor :options
4
5
 
5
6
  def setup_field
6
7
  # Default to text fields
@@ -26,7 +27,9 @@ module Fields
26
27
  end
27
28
 
28
29
  def label
29
- attrs.label || @field_name.titleize
30
+ unless ['false','False'].include?(attrs.label)
31
+ attrs.label || @field_name.titleize
32
+ end
30
33
  end
31
34
 
32
35
  # Find the errors for this field
@@ -34,6 +37,10 @@ module Fields
34
37
  model_inst.marked_errors[@field_name]
35
38
  end
36
39
 
40
+ def field_name
41
+ @field_name
42
+ end
43
+
37
44
  # When a field goes out of focus, then we want to start checking a field
38
45
  def blur
39
46
  model_inst.mark_field!(@field_name)
@@ -1,15 +1,18 @@
1
1
  require 'fields/controllers/main_controller'
2
+ require 'fields/controllers/select_radio_controller'
2
3
 
3
4
  module Fields
4
- class RadioController < MainController
5
- # When a radio button is clicked, set the value of the field and start checking the field
6
- def set_field(value)
7
- model_inst.send("#{@field_name}=", value)
8
- model_inst.mark_field!(@field_name)
5
+ class RadioController < SelectRadioController
6
+ def name
7
+ attrs.name || "#{field_name}_radio"
9
8
  end
10
9
 
11
- def checked?(value)
12
- value == model_inst.send(@field_name)
10
+ def selected?(option)
11
+ option[:value] == model_inst.send(@field_name) ? true : false
12
+ end
13
+
14
+ def set(option)
15
+ model_inst.send("#{@field_name}=", option[:value])
13
16
  end
14
17
  end
15
18
  end
@@ -1,18 +1,7 @@
1
1
  require 'fields/controllers/main_controller'
2
+ require 'fields/controllers/select_radio_controller'
2
3
 
3
4
  module Fields
4
- class SelectController < MainController
5
- def options
6
- if attrs.options[0].is_a?(Hash)
7
- options = attrs.options
8
- else
9
- options = attrs.options.collect { |option| { value: option, label: option } }
10
- end
11
- options
12
- end
13
-
14
- def selected?(value)
15
- true if value == model_inst.send(@field_name)
16
- end
5
+ class SelectController < SelectRadioController
17
6
  end
18
7
  end
@@ -0,0 +1,16 @@
1
+ require 'fields/controllers/main_controller'
2
+
3
+ module Fields
4
+ class SelectRadioController < MainController
5
+ def options
6
+ attrs.options.then do |options|
7
+ if options[0].is_a?(Hash)
8
+ options_hash = options
9
+ else
10
+ options_hash = options.collect { |option| {value: option, label: option }}
11
+ end
12
+ options_hash
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ <:Body>
2
+ <div class="form-group {{ if errors }}has-error{{ elsif marked }}has-success{{ end }} has-feedback">
3
+ {{ if label }}
4
+ <label class="control-label">{{ label }}</label>
5
+ {{ end }}
6
+ <div class="btn-group" role="group">
7
+ {{ options.each do |option| }}
8
+ {{ if selected?(option[:value]) }}
9
+ <button type="button" class="btn {{ selected_button_class }} {{ active_class }}" e-click="set_val(option[:value])"> {{ option[:label] }}</option>
10
+ {{ else }}
11
+ <button type="button" class="btn {{ button_class }}" e-click="set_val(option[:value])"> {{ option[:label] }}</option>
12
+ {{ end }}
13
+ {{ end }}
14
+ </div>
15
+ {{ if errors }}
16
+ <span class="glyphicon glyphicon-remove form-control-feedback"></span>
17
+ <span class="control-label errors">{{ (errors || []).join(', ') }}</span>
18
+ {{ elsif marked }}
19
+ <span class="glyphicon glyphicon-ok form-control-feedback"></span>
20
+ {{ end }}
21
+ </div>
@@ -0,0 +1,23 @@
1
+ <:Body>
2
+ <div class="form-group {{ if errors }}has-error{{ elsif marked }}has-success{{ end }} has-feedback">
3
+ {{ if label }}
4
+ <label class="control-label">{{ label }}</label>
5
+ {{ end }}
6
+ <div class="btn-group btn-group-justified" role="group">
7
+ <div class="btn-group" role="group">
8
+ {{ options.each do |option| }}
9
+ {{ if selected?(option[:value]) }}
10
+ <button type="button" class="btn {{ selected_button_class }} {{ active_class }}" e-click="set_val(option[:value])"> {{ option[:label] }}</option>
11
+ {{ else }}
12
+ <button type="button" class="btn {{ button_class }}" e-click="set_val(option[:value])"> {{ option[:label] }}</option>
13
+ {{ end }}
14
+ {{ end }}
15
+ </div>
16
+ </div>
17
+ {{ if errors }}
18
+ <span class="glyphicon glyphicon-remove form-control-feedback"></span>
19
+ <span class="control-label errors">{{ (errors || []).join(', ') }}</span>
20
+ {{ elsif marked }}
21
+ <span class="glyphicon glyphicon-ok form-control-feedback"></span>
22
+ {{ end }}
23
+ </div>
@@ -1,24 +1,24 @@
1
1
  <:Body>
2
2
  <div class="{{ if errors }}has-error{{ elsif marked }}has-success{{ end }} has-feedback">
3
- {{ attrs.options.each do |option| }}
3
+ {{ if label }}
4
+ <label class="control-label">{{ label }}</label>
5
+ {{ end }}
6
+ {{ options.each do |option| }}
4
7
  <div class="radio">
5
- {{ if checked?(option['value']) }}
6
- <label>
7
- <input type="radio" e-click="set_field(option['value'])" name="{{ @field_name }}_radio" value="{{option['value']}}" checked/>
8
- {{ option['label'] }}
9
- </label>
10
- {{ if errors }}
11
- <span class="glyphicon glyphicon-remove"></span>
12
- <span class="control-label errors">{{ (errors || []).join(', ') }}</span>
13
- {{ elsif marked }}
14
- <span class="glyphicon glyphicon-ok"></span>
8
+ <label>
9
+ {{ if selected?(option) }}
10
+ <input type="radio" e-click="set(option)" name="{{ name }}" value="{{ option[:value] }}" checked/>
11
+ {{ else }}
12
+ <input type="radio" e-click="set(option)" name="{{ name }}" value="{{ option[:value] }}"/>
15
13
  {{ end }}
16
- {{ else }}
17
- <label>
18
- <input type="radio" e-click="set_field(option['value'])" name="{{ @field_name }}_radio" value="{{option['value']}}"/>
19
- {{ option['label'] }}
20
- </label>
14
+ {{ option[:label] }}
15
+ </label>
16
+ {{ if errors }}
17
+ <span class="glyphicon glyphicon-remove"></span>
18
+ <span class="control-label errors">{{ (errors || []).join(', ') }}</span>
19
+ {{ elsif marked }}
20
+ <span class="glyphicon glyphicon-ok"></span>
21
21
  {{ end }}
22
+ </div>
22
23
  {{ end }}
23
- </div>
24
- </div>
24
+ </div>
@@ -1,24 +1,21 @@
1
1
  <:Body>
2
2
  <div class="{{ if errors }}has-error{{ elsif marked }}has-success{{ end }} has-feedback">
3
- {{ attrs.options.each do |option| }}
3
+ {{ options.each do |option| }}
4
4
  <div class="radio-inline">
5
- {{ if checked?(option['value']) }}
6
- <label class="radio-inline">
7
- <input type="radio" e-click="set_field(option['value'])" name="{{ @field_name }}_radio" value="{{option['value']}}" checked/>
8
- {{ option['label'] }}
9
- </label>
10
- {{ if errors }}
11
- <span class="glyphicon glyphicon-remove"></span>
12
- <span class="control-label errors">{{ (errors || []).join(', ') }}</span>
13
- {{ elsif marked }}
14
- <span class="glyphicon glyphicon-ok"></span>
5
+ <label>
6
+ {{ if selected?(option) }}
7
+ <input type="radio" e-click="set(option)" name="{{ name }}" value="{{ option[:value] }}" checked/>
8
+ {{ else }}
9
+ <input type="radio" e-click="set(option)" name="{{ name }}" value="{{ option[:value] }}"/>
15
10
  {{ end }}
16
- {{ else }}
17
- <label class="radio-inline">
18
- <input type="radio" e-click="set_field(option['value'])" name="{{ @field_name }}_radio" value="{{option['value']}}"/>
19
- {{ option['label'] }}
20
- </label>
11
+ {{ option[:label] }}
12
+ </label>
13
+ {{ if errors }}
14
+ <span class="glyphicon glyphicon-remove"></span>
15
+ <span class="control-label errors">{{ (errors || []).join(', ') }}</span>
16
+ {{ elsif marked }}
17
+ <span class="glyphicon glyphicon-ok"></span>
21
18
  {{ end }}
19
+ </div>
22
20
  {{ end }}
23
- </div>
24
- </div>
21
+ </div>
@@ -3,13 +3,15 @@
3
3
  {{ if label }}
4
4
  <label class="control-label">{{ label }}</label>
5
5
  {{ end }}
6
- <select value="{{ attrs.value }}" e-focusout="blur" class="form-control">
6
+ <select value="{{ attrs.value }}" e-change="blur" class="form-control">
7
+ {{ if attrs.value.nil? }}
8
+ <option value="" selected>
9
+ </option>
10
+ {{ end }}
7
11
  {{ options.each do |option| }}
8
- {{ if selected?(option[:value]) }}
9
- <option value="{{ option[:value] }}" selected> {{ option[:label] }}</option>
10
- {{ else }}
11
- <option value="{{ option[:value] }}"> {{ option[:label] }}</option>
12
- {{ end }}
12
+ <option value="{{ option[:value] }}">
13
+ {{ option[:label] }}
14
+ </option>
13
15
  {{ end }}
14
16
  </select>
15
17
  {{ if errors }}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: volt-fields
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Stout
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-01 00:00:00.000000000 Z
11
+ date: 2015-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -38,12 +38,16 @@ files:
38
38
  - VERSION
39
39
  - app/fields/config/dependencies.rb
40
40
  - app/fields/config/routes.rb
41
+ - app/fields/controllers/button_group_controller.rb
41
42
  - app/fields/controllers/checkbox_controller.rb
42
43
  - app/fields/controllers/main_controller.rb
43
44
  - app/fields/controllers/radio_controller.rb
44
45
  - app/fields/controllers/select_controller.rb
46
+ - app/fields/controllers/select_radio_controller.rb
45
47
  - app/fields/controllers/text_controller.rb
46
48
  - app/fields/controllers/textarea_controller.rb
49
+ - app/fields/views/button_group/index.html
50
+ - app/fields/views/button_group/justified.html
47
51
  - app/fields/views/checkbox/index.html
48
52
  - app/fields/views/checkbox/inline.html
49
53
  - app/fields/views/radio/index.html