assoc_whisperer 2.0.3 → 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: ca1ca5cce6d22e7055f31b9b78882841b189f566
4
- data.tar.gz: 1c70ae286a41c2dc043d2c5473a4637c53cac426
3
+ metadata.gz: 809af461432f6d16ecf7c37cebefa320a0357a69
4
+ data.tar.gz: e938b814f1fe952c697c9118f2ccd7cc1069f6ca
5
5
  SHA512:
6
- metadata.gz: ec3f05c46e88412964b0184c6ce8629accca9e8c54bb5ed363b3c810e4f0b69a8ad138f94c558f2117bca923512fc9d3b88e81d35efdafc5710cb5aa1d9cbbf4
7
- data.tar.gz: 8724e1498fe5d2b3ac71a1a61f15e5bb6172b8010b3f78bbb32910d9e2f4d5b72da3abba55d101d413e033ccd74f00678b904449aaf339bb6a5be6f707292aa8
6
+ metadata.gz: a297dd703d02ba14ec9a31494fa42a9d3c454b663d5076e3fec44f0955b54de902abe598a3cd9869b0c17bcc09d7a145d86e691b1fac503ec15bfa3c7759eb80
7
+ data.tar.gz: 43766aeabec37ae636a8248aaff0bb2a8da670ae82b87a29247abde90887b5c1b70259602288e6a223c71d5c680f7a324eab1d94a945e61de52c8f1aa98d68ae
data/.gitignore CHANGED
@@ -1,4 +1,3 @@
1
- *.gem
2
1
  *.rbc
3
2
  .bundle
4
3
  .config
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in assoc_whisperer.gemspec
4
4
  gemspec
5
+
6
+ gem 'yard'
data/README.md CHANGED
@@ -1,24 +1,229 @@
1
1
  # AssocWhisperer
2
2
 
3
- TODO: Write a gem description
3
+ This library served me to bring together some code that was scatered around multiple projects build upon Ruby on Rails.
4
+ Many times I needed a way to let user enter an associated model into form, but users don't know the exact IDs,
5
+ they know a title or some part of name, etc. But a server needs exact ID. There comes whisperer, common input field,
6
+ using AJAX to show user a narrowed list of desired records.
7
+ This is my version build upon Rails form helpers syntax, encapsulating everything needed but beeing smallest possible.
4
8
 
5
9
  ## Installation
6
10
 
7
11
  Add this line to your application's Gemfile:
8
12
 
9
- gem 'assoc_whisperer'
13
+ gem 'assoc_whisperer', '~> 2.1.0'
14
+
15
+ ## Documentation
10
16
 
11
- And then execute:
17
+ Start up yard server and browse the documentation on local:
12
18
 
13
- $ bundle
19
+ bundle exec yard doc && bundle exec yard server
14
20
 
15
- Or install it yourself as:
21
+ ## Usage
22
+
23
+ Let's say you have a bussines where to each project can be assigned only on of your many employees. Having a form
24
+ of a project you'd have to know IDs of those people id database to fill in. Using this whisperer:
25
+
26
+ ```
27
+ <%= form_for @project do |f| %>
28
+ assigned employee: <%= f.whisperer :employee, whisperer_template('get_employees') %>
29
+ <% end %>
30
+ ```
31
+
32
+ It will render the form with whisperer div that includes a hidden field for desired value and a text field for user input.
33
+ (And optionaly a drop down button).
34
+
35
+ For more generice use (i. e. without form builder), there's another helper:
36
+
37
+ ```
38
+ <%= form_tag create_project_path %>
39
+ assigned employee: <%= whisperer_tag :employee_id, whisperer_template('get_employees').from_params(params, :employee_id) %>
40
+ <% end %>
41
+ ```
42
+
43
+ There's quite a lot to adjust on the background so let's go step by step.
44
+
45
+ ## Basic case background
46
+
47
+ There's two things needed to set up - the path for that AJAX querry:
48
+
49
+ ```rb
50
+ # set up a controller
51
+ class WhispererController < ApplicationController
52
+ def get_employees
53
+ user_input = params[:input]
54
+ return render(nothing: true, status: :bad_request) unless user_input
55
+ @objects = Employee.limit 10
56
+ @objects = @objects.where Employee.arel_table[:surname].matches("%#{user_input}%") unless user_input.empty?
57
+ render 'assoc_whisperer/list', layout: false
58
+ end
59
+ end
60
+ # add to routes.rb
61
+ get 'whisp/:action', to: 'whisperer'
62
+ ```
63
+
64
+ And a way to include assets (js and css) on the page
65
+
66
+ ```
67
+ # add to application.js
68
+ //= require assoc_whisp
69
+ # add to application.css
70
+ *= require assoc_whisp_example
71
+ ```
72
+
73
+ Again, the most simple whisperer tag:
74
+
75
+ ```
76
+ <%= form_for @project do |f| %>
77
+ assigned employee: <%= f.whisperer :employee, whisperer_template('get_employees') %>
78
+ <% end %>
79
+ ```
80
+
81
+ User fills in 'mori', waits for options to pop up, selects from list the desired person and submits the form:
82
+
83
+ ```rb
84
+ # you'll receive these params
85
+ {'employee_id' => '5', 'employee_txt' => 'Dean Moriarty'}
86
+ # given this record exists:
87
+ Employee.find(5).to_s
88
+ # => "Dean Moriarty"
89
+ ```
90
+
91
+ ### Changing default settings
92
+
93
+ In the basic case, we were stuck with default options. First there's that you get ID behind #id of the object
94
+ and user sees string that returns #to_s method.
95
+
96
+ ```rb
97
+ AssocWhisperer.def_value = :my_id # def: :id
98
+ AssocWhisperer.def_text = :to_my_string # def: :to_s
99
+ ```
100
+
101
+ You can modify the path for AJAX request. reflect the change also in routes.rb
102
+
103
+ ```rb
104
+ AssocWhisperer.def_url = '/whisperer/path' # def: '/whisp'
105
+ ```
106
+
107
+ If you don't want to attach whisperers assets for every page (i.e. in application.js), there's option to define a method
108
+ that whisperer helpers call internally so it'll be attached only whether whisperer is present on the page.
109
+
110
+ ```rb
111
+ # in application_helper.rb
112
+ def attach_whisperer_assets
113
+ content_for :addon_assets, javascript_include_tag('assoc_whisp')
114
+ content_for :addon_assets, stylesheet_link_tag('assoc_whisp_example')
115
+ end
116
+ # to change the helper method
117
+ AssocWhisperer.attach_assets = :custom_whisperer_attach_method
118
+ ```
119
+
120
+ To make this work, you need insert that content into your layout file, within <head> preferably:
121
+
122
+ ```
123
+ <%= content_for :addon_assets %>
124
+ ```
125
+
126
+ ### Templates
127
+
128
+ If you wanth to whisper the same fing on multiple forms, you can save somewhere the template. The template is there
129
+ even for change things around.
130
+
131
+ ```rb
132
+ whisperer_template('action') # is just wrapper for AssocWhisperer::Template constructor
133
+ # you can change methods of text and value
134
+ f.whisperer :employee ,whisperer_template('get_employees', text: :full_name, value: :personal_key)
135
+ # you can show up the drop down button
136
+ f.whisperer :employee ,whisperer_template('get_employees', button: true)
137
+ # or define exact path
138
+ f.whisperer :employee ,whisperer_template('/whisperer/get_employees')
139
+ ```
140
+
141
+ ### Another way to set up path for AJAX:
142
+
143
+ There a way to send custom params with that particular whisperer. That's usefull if you want to completly
144
+ change controller side of AJAX calls.
145
+
146
+ ```rb
147
+ f.whisperer :employee ,whisperer_template('/whisperer').params('get' => 'employees')
148
+ # routes.rb
149
+ get 'whisperer', to: 'whisperer#whisper'
150
+ ```
151
+
152
+ ## More complex examples
153
+
154
+ For sequent examples we're going to use this controller set up:
155
+
156
+ ```rb
157
+ class WhispererController < ApplicationController
158
+ layout false
159
+ before_filter :get_input
160
+
161
+ def get_employees
162
+ @objects = Employee.limit 10
163
+ @objects = @objects.where deparatment: params[:department] if params[:department].present?
164
+ @objects = @objects.where Employee.arel_table[:surname].matches("%#{user_input}%") unless user_input.empty?
165
+ render 'assoc_whisperer/list', locales: {text: :full_name} # THIS IS IMPORTANT to show right text in list
166
+ end
167
+
168
+ private
169
+
170
+ def get_input
171
+ @input = params[:input]
172
+ render nothing: true, status: :bad_request unless @input
173
+ end
174
+
175
+ end
176
+ ```
177
+
178
+ ### Using the most convenient rails form building syntax
179
+
180
+ If it's the case that can use form builder for given object, it's easy to make things work. This way values will be filled
181
+ even if you return the form to user because some validation errors, for example. Since params will include following,
182
+ you can simply create object of Project and input field will fill automaticaly with what employee user selected:
183
+
184
+ ```rb
185
+ # params include:
186
+ {"project" => {"employee_id" => 5, "employee_txt" => "Dean Moriarty"}}
187
+
188
+ # in controller's particular action
189
+ @project = Project.new params.require(:project).permit(:employee_id)
190
+ ```
191
+
192
+ And whisperer tag only needs this:
193
+
194
+ ```
195
+ <%= form_for @project do |f| %>
196
+ assigned employee: <%= f.whisperer :employee, whisperer_template('get_employees', text: :full_name).
197
+ params(department: 'management') %>
198
+ <% end %>
199
+ ```
200
+
201
+ ### Use without form builder
202
+
203
+ Since whisperer tag is not bound to a project that holds association to selected employee, you have to fill in values
204
+ of that employee back manually. If you have the employee object or it's nil:
205
+
206
+ ```rb
207
+ whisperer_tag :employee_id, whisperer_template('get_employees', text: :full_name).
208
+ params(department: 'management').for_object(@selected_employee)
209
+ ```
210
+
211
+ Or set particular values:
212
+
213
+ ```rb
214
+ whisperer_tag :employee_id, whisperer_template('get_employees', text: :full_name).
215
+ params(department: 'management').value_text(params[:employee_id], params[:employee_id_text])
216
+ ```
217
+
218
+ There's this short cut for when those values are in some hash, that paramas exactly is:
219
+
220
+ ```rb
221
+ whisperer_tag :employee_id, whisperer_template('get_employees', text: :full_name).
222
+ params(department: 'management').from_params(params, :employee_id)
223
+ ```
16
224
 
17
- $ gem install assoc_whisperer
18
225
 
19
- ## Usage
20
226
 
21
- TODO: Write usage instructions here
22
227
 
23
228
  ## Contributing
24
229
 
@@ -3,6 +3,43 @@ module ActionView
3
3
 
4
4
  module AssocWhispererHelper
5
5
 
6
+ # This gets called for the most common case of using {FormBuilder#whisperer}, but directly useful for those situations
7
+ # when you have a custom class that has a model as an attribute and you cannot use +form_for+ for this class.
8
+ #
9
+ # # Borrow helper class:
10
+ # class Borrow
11
+ # attr_accessor :book_id, :client
12
+ # def book
13
+ # @book ||= Book.find_by(id: book_id)
14
+ # end
15
+ # end
16
+ #
17
+ # # Book model:
18
+ # class Book < ActiveRecord::Base
19
+ # validates_presence_of :title
20
+ # end
21
+ #
22
+ # # in controller
23
+ # def request_borrow
24
+ # @borrow = Borrow.new
25
+ # @borrow.client = Client.find_by id: params[:client_id]
26
+ # @borrow.book_id = params[:book_id]
27
+ # # do what ever you want with the @borrow
28
+ # end
29
+ #
30
+ # # the form
31
+ # <%= form_tag request_borrow_path do %>
32
+ # <%= hidden_field_tag :client_id, @borrow.client.id %>
33
+ # book: <%= whisperer :borrow, :book, whisperer_template('get_books', text: :title) %>
34
+ # <% end %>
35
+ #
36
+ # #params will look like this: {"borrow" => {"client_id" => 1, "book_id" => 5, "book_title" => "On the road"}}
37
+ #
38
+ # @param [Symbol, String] object_name name of variable that holds the object
39
+ # @param [Symbol, String] method name of method to get desired model
40
+ # @param [AssocWhisperer::Template] template whisperer template that specifies resulting tags.
41
+ # @param [Hash] field_attrs additional attributes for text field input.
42
+ # @return [String] a html content of asscociation whisperer
6
43
  def whisperer(object_name, method, template, field_attrs={})
7
44
  raise "Helper '#whisperer' cannot be used in Rails < 4.x. Use '#whisperer_tag' instead." if Rails::VERSION::STRING.to_i < 4
8
45
  wrapper_whisperer_assets
@@ -10,6 +47,32 @@ module ActionView
10
47
  Tags::AssocWhispererField.new(object_name, method, self, template, field_attrs).render
11
48
  end
12
49
 
50
+ # Form helper for generic associaction whisperer tag. It includes a hidden value field, a text field for user input
51
+ # and optionaly a dropdown button. The list with options that server returns is appended into this tag.
52
+ #
53
+ # This generic version is suitable for most situations. For Rails 3 there's no other option anyway.
54
+ # Arguments sets html name of the value field (the text field has suffix +_txt+ by default),
55
+ # {AssocWhisperer::Template a whisperer template}
56
+ # and additional custom attributes for the text field. Thus the latter example overrides text field
57
+ # name to +book_title+ instead +book_id_txt+ as in the former.
58
+ #
59
+ # my_book_template = AssocWhisperer::Template.new 'get_books'
60
+ # whisperer_tag :book_id, my_book_template
61
+ # whisperer_tag :book_id, my_book_template, name: :book_title, placeholder: "book's title outset"
62
+ #
63
+ # If you want to send additional parametrs with the request please refer to {AssocWhisperer::Template#params}.
64
+ # If you want to preset some value, e.g. in the case you're returning a form back to user, use either
65
+ # {AssocWhisperer::Template#from_params} or {AssocWhisperer::Template#value_text} or {AssocWhisperer::Template#for_object}.
66
+ # The last case depends on what text and value methods are set for given {AssocWhisperer::Template template}.
67
+ #
68
+ # whisperer_tag :book_id, whisperer_tempate('get_books').from_params(params, 'book_id') # params or any Hash
69
+ # whisperer_tag :book_id, whisperer_tempate('get_books').value_text(@book.id, @book.to_s)
70
+ # whisperer_tag :book_id, whisperer_tempate('get_books').for_object(@book)
71
+ #
72
+ # @param [String, Symbol] name base name for the html form inputs.
73
+ # @param [AssocWhisperer::Template] template whisperer template that specifies resulting tags.
74
+ # @param [Hash] field_attrs additional attributes for text field input.
75
+ # @return [String] a html content of asscociation whisperer
13
76
  def whisperer_tag(name, template, field_attrs={})
14
77
  wrapper_whisperer_assets
15
78
 
@@ -17,12 +80,16 @@ module ActionView
17
80
  'data-opts' => template.whisperer_settings.to_json
18
81
  end
19
82
 
83
+ # Wrapper for {AssocWhisperer::Template} constructor
84
+ # @return [AssocWhisperer::Template]
20
85
  def whisperer_template(action, opts={})
21
86
  AssocWhisperer::Template.new action, opts
22
87
  end
23
88
 
24
89
  private
25
90
 
91
+ # This is wraper for attaching assets (calls a method specified by {AssocWhisperer.attach_assets} - default
92
+ # is +attach_whisperer_assets+). Gets be called by every whisperer helper but only once assets are attached.
26
93
  def wrapper_whisperer_assets
27
94
  unless @assoc_whisp_attached
28
95
  attach_method = AssocWhisperer.attach_assets
@@ -34,6 +101,37 @@ module ActionView
34
101
  end
35
102
 
36
103
  class FormBuilder
104
+ # Wraps {AssocWhispererHelper#whisperer} for defaul +FormBuilder+. This enables standard Rails
105
+ # form building syntax for nested models.
106
+ #
107
+ # # Borrow model:
108
+ # class Borrow < ActiveRecord::Base
109
+ # belongs_to :client
110
+ # belongs_to :book
111
+ # validates_presence_of :client, :book
112
+ # end
113
+ #
114
+ # # Book model:
115
+ # class Book < ActiveRecord::Base
116
+ # has_many :borrow
117
+ # validates_presence_of :title
118
+ # end
119
+ #
120
+ # # in controller
121
+ # @borrow = Borrow.new params.require(:borrow).permit(%i(client_id, book_id))
122
+ #
123
+ # # A form for request new borrow in library
124
+ # <%= form_for @borrow do |f| %>
125
+ # <%= f.hidden_field :client_id %>
126
+ # book: <%= f.whisperer :book, whisperer_template('get_books', text: :title) %>
127
+ # <% end %>
128
+ #
129
+ # #params will look like this: {"borrow" => {"client_id" => 1, "book_id" => 5, "book_title" => "On the road"}}
130
+ #
131
+ # @param [Symbol, String] method name of form object's nested object
132
+ # @param [AssocWhisperer::Template] template whisperer template that specifies resulting tags.
133
+ # @param [Hash] field_attrs additional attributes for text field input.
134
+ # @return [String] a html content of asscociation whisperer
37
135
  def whisperer(method, template, field_attrs={})
38
136
  @template.whisperer @object_name, method, template, objectify_options(field_attrs)
39
137
  end
@@ -9,7 +9,7 @@ module ActionView
9
9
  end
10
10
 
11
11
  def render
12
- @whisp_template.value_text whispered_object
12
+ @whisp_template.for_object whispered_object
13
13
 
14
14
  contents = @whisp_template.value_field_tag value_tag_id, value_tag_name
15
15
  contents += @whisp_template.text_field_tag text_tag_id, text_tag_name, @options
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = AssocWhisperer::VERSION
9
9
  spec.authors = ["Ondřej Želazko"]
10
10
  spec.email = ["zelazk.o@email.cz"]
11
- spec.summary = %q{Rails tag assoc_whisperer for forms}
12
- spec.description = %q{You can associate two models together, while user inputs e.g. name and server recieves id}
13
- spec.homepage = ""
11
+ spec.summary = %q{Rails whisperer tag for forms}
12
+ spec.description = %q{Input associated models directly by id}
13
+ spec.homepage = "https://github.com/doooby/assoc_whisperer"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -1,36 +1,85 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module AssocWhisperer
4
+
5
+ # This object specifies what will a whisperer tag look like. {ActionView::Helpers::AssocWhispererHelper#whisperer_template}
6
+ # is a markup for this class.
4
7
  class Template
5
8
  attr_reader :opts
6
9
 
10
+ # Creates a template for whisperer.
11
+ # @param [String] action can be just a tail of url ({AssocWhisperer.def_url}
12
+ # will be prefix) or full path eg.: +'/whisperer/specific_path'+.
13
+ # Options may include:
14
+ # +:value+:: a method name that is called on given object to get the value the hidden field will be filled with.
15
+ # If not specified then {AssocWhisperer.def_value} is used.
16
+ # +:text+:: a method name that is called on given object to get the value for the text field.
17
+ # If not specified then {AssocWhisperer.def_text} is used.
18
+ # +:button+:: specifies whether dropdown button will be present. Defaults to false.
7
19
  def initialize(action, opts={})
8
20
  @action = action[0]=='/' ? action : "#{AssocWhisperer.def_url}/#{action}"
9
21
  @opts = opts
10
22
  @opts[:value] = AssocWhisperer.def_value unless @opts[:value]
11
23
  @opts[:text] = AssocWhisperer.def_text unless @opts[:text]
12
- @opts[:button] = true if @opts[:button].nil?
24
+ @opts[:button] = false if @opts[:button].nil?
13
25
  end
14
26
 
27
+ # Sets parameters that will be included to html request. Usefull to specify additional options. Because this returns
28
+ # the template object itself, it is easy to use in views.
29
+ # whisperer_tag :foo, whisperer_template('action').params(bar: 5)
30
+ # Whisperer will call something like this url +/whisp/action?bar=5+
31
+ # @param [Hash] params
32
+ # @return [Template]
15
33
  def params(params)
16
34
  @params = params
17
35
  self
18
36
  end
19
37
 
20
- def value_text(object_or_params, name=nil)
21
- if object_or_params.is_a?(Hash) && name
22
- @value = object_or_params[name]
23
- @text = object_or_params["#{name}_txt"]
24
- elsif object_or_params
25
- @value = (object_or_params.send @opts[:value] if object_or_params.respond_to? @opts[:value])
26
- @text = (object_or_params.send @opts[:text] if object_or_params.respond_to? @opts[:text])
27
- else
28
- @value = nil
29
- @text = nil
38
+ # Sets value and text for given object and returns tepmlate object itself for ease of use.
39
+ # whisperer_tag :foo, whisperer_template('action', text: :to_readable_text).value_text(@foo_object)
40
+ # # value => FooObject#id (since :id is default method for value specified in AssocWhisperer.def_value)
41
+ # # text => FooObject#to_readable_text
42
+ # @param [Object] object from which will be the value and text taken.
43
+ # @return [Template]
44
+ def for_object(object)
45
+ if object
46
+ @value = (object.send @opts[:value] if object.respond_to? @opts[:value])
47
+ @text = (object.send @opts[:text] if object.respond_to? @opts[:text])
30
48
  end
31
49
  self
32
50
  end
33
51
 
52
+ # Sets value and text that is specified in given hash (like params) and returns tepmlate object itself.
53
+ # In case text is under something else then value name with suffix +_txt+, specify it in last argument.
54
+ # params = {'foo' => '15', 'foo_txt' => 'Foo number 15'}
55
+ # whisperer_tag :foo, whisperer_template('action').from_params(params, 'foo')
56
+ # params = {'foo' => '15', 'foo_bar' => 'Foo number 15'}
57
+ # whisperer_tag :foo, whisperer_template('action').from_params(params, 'foo', 'foo_bar')
58
+ # @param [Hash] hash containing values (like params)
59
+ # @param [String] value_name the key under which is the value in the hash
60
+ # @param [String] text_name the key under which is the text in the hash
61
+ # @return [Template]
62
+ def from_params(hash, value_name, text_name=nil)
63
+ @value = hash[value_name]
64
+ @text = hash[text_name || "#{value_name}_txt"]
65
+ self
66
+ end
67
+
68
+ # Sets value and text and returns tepmlate object itself.
69
+ # whisperer_tag :foo, whisperer_template('action').value_text(foo.id, foo.to_s)
70
+ # @param [Object] value that will converted to string and filled into hidden input field
71
+ # @param [String] text that will be filled into text field
72
+ # @return [Template]
73
+ def value_text(value, text)
74
+ @value = value
75
+ @text = text
76
+ self
77
+ end
78
+
79
+ # Creates html contents for whisperer (used by {ActionView::Helpers::AssocWhispererHelper#whisperer_tag})
80
+ # @param [String] input_name for html form name of value and text field tags
81
+ # @param [Hash] field_attrs additional attributes for text field tag
82
+ # @return [String] tag html content
34
83
  def tag_contents(input_name, field_attrs={})
35
84
  input_name = input_name.to_s
36
85
  sanitized_id = input_name.dup.delete(']').gsub(/[^-a-zA-Z0-9:.]/, "_")
@@ -42,6 +91,8 @@ module AssocWhisperer
42
91
  contents + dropdown_button_tag
43
92
  end
44
93
 
94
+ # This is used for whisperer's +data-opts+ html attribute
95
+ # @return [Hash] whisperer's settings
45
96
  def whisperer_settings
46
97
  h = {action: @action}
47
98
  # h[:cs] = @opts[:client_side] if @opts[:client_side]
@@ -49,10 +100,14 @@ module AssocWhisperer
49
100
  h
50
101
  end
51
102
 
103
+ # Creates html contents for hidden field that holds a value
104
+ # @return [String] hidden field html
52
105
  def value_field_tag(id, name)
53
106
  %(<input type="hidden" id="#{id}" name="#{name}" value="#{@value}" class="value_field">)
54
107
  end
55
108
 
109
+ # Creates html contents for text field
110
+ # @return [String] text field html
56
111
  def text_field_tag(id, name, attrs={})
57
112
  attrs[:size] = 12 unless attrs.has_key? :size
58
113
  keys_whitelist = (attrs.keys & [:size, :placeholder, :maxlength, :title])
@@ -63,6 +118,9 @@ module AssocWhisperer
63
118
  %(<input type="text" autocomplete="off" id="#{id}" name="#{name}" value="#{@text}" class="text_field#{' unfilled' unless @value}"#{attrs * ' '}>)
64
119
  end
65
120
 
121
+ # Creates html contents for drop down button. If +:button+ option is anything else then TrueClass,
122
+ # empty string is returned.
123
+ # @return [String] span html
66
124
  def dropdown_button_tag
67
125
  return '' unless @opts[:button].is_a? TrueClass
68
126
  "<span class=\"dropdown_button querying\">\u25BE</span>"
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
  module AssocWhisperer
3
- VERSION = "2.0.3"
3
+ VERSION = "2.1.0"
4
4
 
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assoc_whisperer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ondřej Želazko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-30 00:00:00.000000000 Z
11
+ date: 2015-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,8 +38,7 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description: You can associate two models together, while user inputs e.g. name and
42
- server recieves id
41
+ description: Input associated models directly by id
43
42
  email:
44
43
  - zelazk.o@email.cz
45
44
  executables: []
@@ -62,7 +61,7 @@ files:
62
61
  - lib/assoc_whisperer.rb
63
62
  - lib/assoc_whisperer/template.rb
64
63
  - lib/assoc_whisperer/version.rb
65
- homepage: ''
64
+ homepage: https://github.com/doooby/assoc_whisperer
66
65
  licenses:
67
66
  - MIT
68
67
  metadata: {}
@@ -82,8 +81,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
81
  version: '0'
83
82
  requirements: []
84
83
  rubyforge_project:
85
- rubygems_version: 2.4.3
84
+ rubygems_version: 2.4.5
86
85
  signing_key:
87
86
  specification_version: 4
88
- summary: Rails tag assoc_whisperer for forms
87
+ summary: Rails whisperer tag for forms
89
88
  test_files: []
89
+ has_rdoc: