selections 0.1.7 → 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.1.11
2
+
3
+ * https://github.com/nigelr/selections/issues/2 - Added feature of radios for radio_buttons
4
+
1
5
  ## 0.1.7
2
6
 
3
7
  * https://github.com/nigelr/selections/issues/5 - issue with forgetting selected item when page was invalid
data/README.md CHANGED
@@ -1,12 +1,14 @@
1
- # Selections
1
+ # Selections [![Gem Version](https://badge.fury.io/rb/selections.png)](http://badge.fury.io/rb/selections)
2
2
 
3
3
  Selection list management and form and view helpers.
4
4
 
5
5
  ##Key Features
6
6
 
7
- * Manages one table to hold all selections items/ dropdown lists ( tree )
7
+ * Manages one table to hold all selections items/dropdown lists or Radio Buttons ( tree )
8
8
  * Dynamic lookup to find parent or children ( eg. Selection.priorities )
9
- * Form helper to display lists ( eg. f.selections :priorities )
9
+ * Form helper to display lists
10
+ - f.selections :priorities # dropdowns
11
+ - f.radios :priorities # radio buttons
10
12
  * Model helpers for joining tables ( eg. belongs_to_selection :priority )
11
13
  * Handling of archived items ( displaying if selected only )
12
14
  * Ordering of lists based on alpha or numbered
@@ -69,9 +71,9 @@ Dynamic lookups support pluralization and will then return the children:
69
71
  Selection.priorities -> [high,med,low] records
70
72
  ```
71
73
 
72
- #### Form Helper
74
+ ## Form Helper
73
75
 
74
- if we had a controller for Ticket model with fields of:
76
+ If we had a controller for Ticket model with fields of:
75
77
 
76
78
  * name
77
79
  * priority_id
@@ -97,7 +99,7 @@ within the _form.html.erb just use the selections helper method:
97
99
  <% end %>
98
100
  ```
99
101
 
100
- ### Form Helper Options
102
+ ### Selection List Options
101
103
 
102
104
  ```ruby
103
105
  f.selections :fieldname, options = {}, html_options = {}
@@ -113,6 +115,14 @@ If you have a selection named differently to the foreign key eg. the foreign key
113
115
  <%= f.selections :variety, :system_code => :category %>
114
116
  ```
115
117
 
118
+ ### Radio Buttons Options
119
+
120
+ ```ruby
121
+ f.radios :ticket, options = {}
122
+ ```
123
+
124
+ The radios method excepts all the standard Ruby on Rails form helper options and html formatting - http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-radio_button
125
+
116
126
  ### Scoped System Code
117
127
 
118
128
  If you have naming conflicts/duplicates system_codes (parent codes) eg. category_id field for user and ticket models
@@ -196,7 +206,6 @@ Selections.model { YourSelectionModel }
196
206
 
197
207
  * Add model generators
198
208
  * Add selections management scaffold/generator
199
- * Add Radio Button support
200
209
 
201
210
  ## Contributing
202
211
 
@@ -2,10 +2,9 @@ module Selections
2
2
  module FormBuilderExtensions
3
3
  # Create a select list based on the field name finding items within Selection.
4
4
  #
5
- #
6
5
  # Example
7
6
  # form_for(@ticket) do |f|
8
- # f. select("priority")
7
+ # f.select("priority")
9
8
  #
10
9
  # Uses priority_id from the ticket table and creates options list based on items in Selection table with a system_code of
11
10
  # either priority or ticket_priority
@@ -16,7 +15,21 @@ module Selections
16
15
  # * +system_code+ - Overrides the automatic system_code name based on the fieldname and looks up the list of items in Selection
17
16
 
18
17
  def selections(field, options = {}, html_options = {})
19
- SelectionTag.new(self, object, field, options, html_options).to_tag
18
+ SelectionTag.new(self, object, field, options, html_options).select_tag
19
+ end
20
+
21
+ # Build a radio button list based field name finding items within Selection
22
+ #
23
+ # Example
24
+ # form_for(@ticket) do |f|
25
+ # f.select :priority
26
+ # options
27
+ # * +system_code+ - Overrides the automatic system_code name based on the fieldname and looks up the list of items in Selection
28
+
29
+ def radios(field, options = {})
30
+ html_options = options.clone
31
+ html_options.delete_if {|key, value| key == :system_code}
32
+ SelectionTag.new(self, object, field, options, html_options).radio_tag
20
33
  end
21
34
 
22
35
  class SelectionTag #:nodoc:
@@ -51,7 +64,7 @@ module Selections
51
64
  @items ||= system_code.children.filter_archived_except_selected(object.send(field_id))
52
65
  end
53
66
 
54
- def to_tag
67
+ def select_tag
55
68
  if system_code
56
69
  #TODO add default style
57
70
  #html_options[:style] ||=
@@ -59,10 +72,30 @@ module Selections
59
72
  options[:selected] = selected_item
60
73
  form.select field_id, items.map { |item| [item.name, item.id] }, options, html_options
61
74
  else
62
- "Could not find system_code of '#{system_code_name}' or '#{form.object_name}_#{system_code_name}'"
75
+ error_message
63
76
  end
64
77
  end
65
78
 
79
+ def radio_tag
80
+ if system_code
81
+ items.unshift(selection.new(name: blank_content)) if include_blank?
82
+
83
+ items.inject('') do |build, item|
84
+ label_html_options = item.id ? html_options.merge(value: item.id.to_s) : html_options
85
+ html_options[:checked] = selected_item == item.id.to_s && !item.new_record?
86
+ build + form.label(field_id, label_html_options) do
87
+ form.radio_button(field_id, item.id, html_options) + item.name
88
+ end
89
+ end.html_safe
90
+ else
91
+ error_message
92
+ end
93
+ end
94
+
95
+ def error_message
96
+ "Could not find system_code of '#{system_code_name}' or '#{form.object_name}_#{system_code_name}'"
97
+ end
98
+
66
99
  def selected_item
67
100
  if object.new_record? && object.send(field_id).blank?
68
101
  default_item
@@ -74,6 +107,10 @@ module Selections
74
107
  def default_item
75
108
  items.where(:is_default => true).first.try(:id).to_s
76
109
  end
110
+
111
+ def blank_content
112
+ options[:blank_content] || 'none'
113
+ end
77
114
  end
78
115
 
79
116
  ActiveSupport.on_load :action_view do
@@ -1,3 +1,3 @@
1
1
  module Selections
2
- VERSION = '0.1.7'
2
+ VERSION = '0.1.11'
3
3
  end
@@ -1,4 +1,4 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  include Selections::FormBuilderExtensions
4
4
 
@@ -225,45 +225,102 @@ describe SelectionTag do
225
225
  end
226
226
  end
227
227
 
228
- describe ".to_tag" do
229
- context "invalid" do
230
- it "displays warning when system_code does not exist" do
231
- expect(edit_form.to_tag).to eq("Could not find system_code of 'priority' or 'ticket_priority'")
232
- end
233
- it "displays warning for system_code override" do
234
- expect(edit_form(options: {system_code: "hello"}).to_tag).to eq("Could not find system_code of 'hello' or 'ticket_hello'")
235
- end
228
+ describe '.blank_content' do
229
+ it 'when nothing set' do
230
+ expect(new_form.blank_content).to eq('none')
236
231
  end
237
- context "valid system_code" do
238
- before { all_selections }
232
+ it 'when set' do
233
+ expect(new_form(options: {blank_content: 'hello'}).blank_content).to eq('hello')
234
+ end
235
+ end
239
236
 
240
- context "new form" do
241
- context "no default" do
242
- it("has no selected item") { expect(Nokogiri::HTML(new_form.to_tag).search("option[selected]")).to be_empty }
243
- it("has a blank option") { expect(Nokogiri::HTML(new_form.to_tag).search("option[value='']").count).to eq(1) }
237
+ context 'html output' do
238
+ describe '.select_tag' do
239
+ context 'invalid' do
240
+ it 'displays warning when system_code does not exist' do
241
+ expect(edit_form.select_tag).to eq("Could not find system_code of 'priority' or 'ticket_priority'")
244
242
  end
245
- context "default is set" do
246
- before { selection_3.update_attribute(:is_default, true) }
247
-
248
- it("has selection_3 selected") { expect(Nokogiri::HTML(new_form.to_tag).search("option[selected]").first.content).to eq(selection_3.name) }
249
- it("has no blank option") { expect(Nokogiri::HTML(new_form.to_tag).search("option[value='']").count).to eq(0) }
243
+ it 'displays warning for system_code override' do
244
+ expect(edit_form(options: {system_code: 'hello'}).select_tag).to eq("Could not find system_code of 'hello' or 'ticket_hello'")
250
245
  end
251
246
  end
247
+ context 'valid system_code' do
248
+ before { all_selections }
252
249
 
253
- context "edit form" do
254
- context "relation (priority_id) is nil" do
255
- it("has no selected item") { expect(Nokogiri::HTML(edit_form.to_tag).search("option[selected]")).to be_empty }
256
- it("has a blank option") { expect(Nokogiri::HTML(edit_form.to_tag).search("option[value='']").count).to eq(1) }
250
+ context 'new form' do
251
+ context 'no default' do
252
+ it('has no selected item') { expect(Nokogiri::HTML(new_form.select_tag).search('option[selected]')).to be_empty }
253
+ it('has a blank option') { expect(Nokogiri::HTML(new_form.select_tag).search("option[value='']").count).to eq(1) }
254
+ end
255
+ context 'default is set' do
256
+ before { selection_3.update_attribute(:is_default, true) }
257
+
258
+ it('has selection_3 selected') { expect(Nokogiri::HTML(new_form.select_tag).search('option[selected]').first.content).to eq(selection_3.name) }
259
+ it('has no blank option') { expect(Nokogiri::HTML(new_form.select_tag).search("option[value='']").count).to eq(0) }
260
+ end
257
261
  end
258
- context "when relation (priority_id) is set to selection_3" do
259
- before { ticket.update_attribute(:priority_id, selection_3.id) }
260
262
 
261
- it("item is selected") { expect(Nokogiri::HTML(edit_form.to_tag).search("option[selected]").first.content).to eq(selection_3.name) }
262
- it("has no blank option") { expect(Nokogiri::HTML(edit_form.to_tag).search("option[value='']").count).to eq(0) }
263
+ context 'edit form' do
264
+ context 'relation (priority_id) is nil' do
265
+ it('has no selected item') { expect(Nokogiri::HTML(edit_form.select_tag).search('option[selected]')).to be_empty }
266
+ it('has a blank option') { expect(Nokogiri::HTML(edit_form.select_tag).search("option[value='']").count).to eq(1) }
267
+ end
268
+ context 'when relation (priority_id) is set to selection_3' do
269
+ before { ticket.update_attribute(:priority_id, selection_3.id) }
270
+
271
+ it('item is selected') { expect(Nokogiri::HTML(edit_form.select_tag).search('option[selected]').first.content).to eq(selection_3.name) }
272
+ it('has no blank option') { expect(Nokogiri::HTML(edit_form.select_tag).search("option[value='']").count).to eq(0) }
273
+ end
274
+ end
275
+ it 'returns valid html' do
276
+ expect(edit_form.select_tag).to eq "<select id=\"ticket_priority_id\" name=\"ticket[priority_id]\"><option value=\"\"></option>\n<option value=\"4\">high</option>\n<option value=\"2\">low</option>\n<option value=\"3\">medium</option></select>"
263
277
  end
264
278
  end
265
- it "returns valid html" do
266
- expect(edit_form.to_tag).to eq "<select id=\"ticket_priority_id\" name=\"ticket[priority_id]\"><option value=\"\"></option>\n<option value=\"4\">high</option>\n<option value=\"2\">low</option>\n<option value=\"3\">medium</option></select>"
279
+ end
280
+ describe '.radio_tag' do
281
+ context 'invalid' do
282
+ it 'displays warning when system_code does not exist' do
283
+ expect(edit_form.radio_tag).to eq("Could not find system_code of 'priority' or 'ticket_priority'")
284
+ end
285
+ it 'displays warning for system_code override' do
286
+ expect(edit_form(options: {system_code: "hello"}).radio_tag).to eq("Could not find system_code of 'hello' or 'ticket_hello'")
287
+ end
288
+ end
289
+ context 'valid system_code' do
290
+ before { all_selections }
291
+
292
+ context 'new form' do
293
+ context 'no default' do
294
+ it('has no selected item') { expect(Nokogiri::HTML(new_form.radio_tag).search('input[checked]')).to be_empty }
295
+ it('has a blank option') { expect(Nokogiri::HTML(new_form.radio_tag).search('label').first.content).to eq('none') }
296
+ it('has a custom blank option') { expect(Nokogiri::HTML(new_form(options: {blank_content: 'hello'}).radio_tag).search('label').first.content).to eq('hello') }
297
+ end
298
+ context 'default is set' do
299
+ before { selection_3.update_attribute(:is_default, true) }
300
+
301
+ it('has selection_3 selected') { expect(Nokogiri::HTML(new_form.radio_tag).search('input[checked]').first['value']).to eq(selection_3.id.to_s) }
302
+ it('has no blank option') { expect(Nokogiri::HTML(new_form.radio_tag).search('label').first.content).to eq(selection_3.name) }
303
+ end
304
+ end
305
+
306
+ context 'edit form' do
307
+ context 'relation (priority_id) is nil' do
308
+ it('has no selected item') { expect(Nokogiri::HTML(edit_form.radio_tag).search('input[checked]')).to be_empty }
309
+ it('has a blank option') { expect(Nokogiri::HTML(edit_form.radio_tag).search('label').first.content).to eq('none') }
310
+ end
311
+ context 'when relation (priority_id) is set to selection_3' do
312
+ before { ticket.update_attribute(:priority_id, selection_3.id) }
313
+
314
+ it('item is selected') { expect(Nokogiri::HTML(edit_form.radio_tag).search('input[checked]').first['value']).to eq(selection_3.id.to_s) }
315
+ it('has no blank option') { expect(Nokogiri::HTML(edit_form.radio_tag).search('label').first.content).to eq(selection_3.name) }
316
+ it('has a blank option when include_blank set') { expect(Nokogiri::HTML(edit_form(options: {include_blank: true}).radio_tag).search('label').first.content).to eq('none') }
317
+ end
318
+ end
319
+ it 'returns valid html' do
320
+ ticket.update_attribute(:priority_id, selection_3.id)
321
+ #p edit_form(options: {:include_blank => true}, html_options: {class: 'fred'}).radio_tag
322
+ expect(edit_form(options: {:include_blank => true}, html_options: {class: 'fred'}).radio_tag).to eq "<label class=\"fred\" for=\"ticket_priority_id\"><input class=\"fred\" id=\"ticket_priority_id\" name=\"ticket[priority_id]\" type=\"radio\" />none</label><label class=\"fred\" for=\"ticket_priority_id_4\"><input checked=\"checked\" class=\"fred\" id=\"ticket_priority_id_4\" name=\"ticket[priority_id]\" type=\"radio\" value=\"4\" />high</label><label checked=\"checked\" class=\"fred\" for=\"ticket_priority_id_2\"><input class=\"fred\" id=\"ticket_priority_id_2\" name=\"ticket[priority_id]\" type=\"radio\" value=\"2\" />low</label><label class=\"fred\" for=\"ticket_priority_id_3\"><input class=\"fred\" id=\"ticket_priority_id_3\" name=\"ticket[priority_id]\" type=\"radio\" value=\"3\" />medium</label>"
323
+ end
267
324
  end
268
325
  end
269
326
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: selections
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-20 00:00:00.000000000 Z
12
+ date: 2013-04-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord