Module: RecordSelectHelper

Defined in:
lib/record_select/helpers/record_select_helper.rb

Instance Method Summary collapse

Instance Method Details

#full_text_search?Boolean

Returns:

  • (Boolean)


170
171
172
# File 'lib/record_select/helpers/record_select_helper.rb', line 170

def full_text_search?
  controller.send :full_text_search?
end

Adds a link on the page that toggles a RecordSelect widget from the given controller.

Options

onselect

JavaScript code to handle selections client-side. This code has access to two variables: id, label. If the code returns false, the dialog will not close automatically.

params

Extra URL parameters. If any parameter is a column name, the parameter will be used as a search term to filter the result set.

html

Options for A tag

rs

Options for RecordSelect constructor



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/record_select/helpers/record_select_helper.rb', line 18

def link_to_record_select(name, controller, options = {})
  options[:params] ||= {}
  options[:params].merge!(:controller => controller, :action => :browse)
  options[:onselect] = "(function(id, label) {#{options[:onselect]}})" if options[:onselect]
  options[:html] ||= {}
  options[:html][:id] ||= "rs_#{rand(9999)}"
  js = options.include?(:js) ? options[:js] : request.xhr?

  controller = assert_controller_responds(options[:params][:controller])
  record_select_options = {id: record_select_id(controller.controller_path), onselect: options[:onselect] || ''}
  record_select_options.merge! options[:rs] if options[:rs]

  rs_data = {type: 'Dialog', id: options[:html][:id], url: url_for(options[:params]), options: record_select_options}
  options[:html][:data] = rs_data.transform_keys { |k| "rs_#{k}" } unless js
  html = link_to(name, '#', options[:html])
  html << record_select_js(**rs_data) if js

  html
end

#permit_rs_browse_paramsObject

If you use :params option, define this helper in your controller helpers to return array with those params, so _list partial permits them



4
5
# File 'lib/record_select/helpers/record_select_helper.rb', line 4

def permit_rs_browse_params
end

#record_multi_select_field(name, current, options = {}) ⇒ Object

Adds a RecordSelect-based form field for multiple selections. The values submit using a list of hidden inputs.

Arguments

name

the input name that will be used to submit the selected records’ ids. empty brackets will be appended to the name.

current

pass a collection of existing associated records

Options

controller

The controller configured to provide the result set.

params

A hash of extra URL parameters

id

The id to use for the input. Defaults based on the input’s name.

rs

Options for RecordSelect constructor



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/record_select/helpers/record_select_helper.rb', line 131

def record_multi_select_field(name, current, options = {})
  options[:controller] ||= current.first.class.to_s.pluralize.underscore
  options[:params] ||= {}
  options[:id] ||= name.gsub(/[\[\]]/, '_')
  options[:class] ||= ''
  options[:class] << ' recordselect'
  options.delete(:name)
  js = options.include?(:js) ? options.delete(:js) : request.xhr?

  controller = assert_controller_responds(options.delete(:controller))
  params = options.delete(:params)
  record_select_options = {id: record_select_id(controller.controller_path)}
  record_select_options[:current] = current.inject([]) { |memo, record| memo.push({:id => record.id, :label => label_for_field(record, controller)}) }
  record_select_options.merge! options.delete(:rs) if options[:rs]

  options.merge!(autocomplete: 'off', onfocus: "this.focused=true", onblur: "this.focused=false")
  url = url_for({action: :browse, controller: controller.controller_path}.merge(params))
  rs_data = {type: 'Multiple', id: options[:id], url: url, options: record_select_options}
  options[:data] = rs_data.transform_keys { |k| "rs_#{k}" } unless js
  html = text_field_tag("#{name}[]", nil, options)
  html << hidden_field_tag("#{name}[]", '', id: nil)
  html << (:ul, '', class: 'record-select-list')
  html << record_select_js(**rs_data) if js

  html
end

#record_select_autocomplete(name, current, options = {}) ⇒ Object

Adds a RecordSelect-based form field. The field is autocompleted.

Arguments

name

the input name that will be used to submit the selected value.

current

the current object. provide a new record if there’re none currently selected and you have not passed the optional :controller argument.

Options

controller

The controller configured to provide the result set. Optional if you have standard resource controllers (e.g. UsersController for the User model), in which case the controller will be inferred from the class of current (the second argument)

params

A hash of extra URL parameters

id

The id to use for the input. Defaults based on the input’s name.

rs

Options for RecordSelect constructor



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/record_select/helpers/record_select_helper.rb', line 94

def record_select_autocomplete(name, current, options = {})
  options[:controller] ||= current.class.to_s.pluralize.underscore
  options[:params] ||= {}
  options[:id] ||= name.gsub(/[\[\]]/, '_')
  options[:class] ||= ''
  options[:class] << ' recordselect'
  js = options.include?(:js) ? options.delete(:js) : request.xhr?

  controller = assert_controller_responds(options.delete(:controller))
  params = options.delete(:params)
  record_select_options = {id: record_select_id(controller.controller_path), label: options.delete(:label)}
  if current
    record_select_options[:label] ||= label_for_field(current, controller)
  end
  record_select_options.merge! options.delete(:rs) if options[:rs]

  options.merge!(autocomplete: 'off', onfocus: "this.focused=true", onblur: "this.focused=false")
  url = url_for({action: :browse, controller: controller.controller_path}.merge(params))
  rs_data = {type: 'Autocomplete', id: options[:id], url: url, options: record_select_options}
  options[:data] = rs_data.transform_keys { |k| "rs_#{k}" } unless js
  html = text_field_tag(name, nil, options)
  html << record_select_js(**rs_data) if js

  html
end

#record_select_configObject

Provides view access to the RecordSelect configuration



166
167
168
# File 'lib/record_select/helpers/record_select_helper.rb', line 166

def record_select_config #:nodoc:
  controller.send :record_select_config
end

#record_select_field(name, current, options = {}) ⇒ Object

Adds a RecordSelect-based form field. The field submits the record’s id using a hidden input.

Arguments

name

the input name that will be used to submit the selected record’s id.

current

the currently selected object. provide a new record if there’re none currently selected and you have not passed the optional :controller argument.

Options

controller

The controller configured to provide the result set. Optional if you have standard resource controllers (e.g. UsersController for the User model), in which case the controller will be inferred from the class of current (the second argument)

params

A hash of extra URL parameters

id

The id to use for the input. Defaults based on the input’s name.

field_name

The name to use for the text input. Defaults to ”, so field is not submitted.

rs

Options for RecordSelect constructor



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/record_select/helpers/record_select_helper.rb', line 50

def record_select_field(name, current, options = {})
  options[:controller] ||= current.class.to_s.pluralize.underscore
  options[:params] ||= {}
  options[:id] ||= name.gsub(/[\[\]]/, '_')
  options[:class] ||= ''
  options[:class] << ' recordselect'
  options[:clear_button] = true unless options.include? :clear_button
  js = options.include?(:js) ? options.delete(:js) : request.xhr?

  controller = assert_controller_responds(options.delete(:controller))
  params = options.delete(:params)
  record_select_options = {id: record_select_id(controller.controller_path)}
  record_select_options[:field_name] = options.delete(:field_name) if options[:field_name]
  clear_button_class = 'clear-input-button'
  if current and not current.new_record?
    record_select_options[:id] = current.id
    record_select_options[:label] = label_for_field(current, controller)
    clear_button_class << ' enabled'
  end
  record_select_options.merge! options.delete(:rs) if options[:rs]

  clear_button = options.delete(:clear_button)
  options.merge!(autocomplete: 'off', onfocus: "this.focused=true", onblur: "this.focused=false")
  url = url_for({action: :browse, controller: controller.controller_path}.merge(params))
  rs_data = {type: 'Single', id: options[:id], url: url, options: record_select_options}
  options[:data] = rs_data.transform_keys { |k| "rs_#{k}" } unless js
  html = text_field_tag(name, nil, options)
  html << button_tag('x', type: :button, class: clear_button_class, aria_label: 'Clear input', title: 'Clear input') if clear_button
  html << record_select_js(**rs_data) if js

  html
end

#record_select_id(controller = nil) ⇒ Object

The id of the RecordSelect widget for the given controller.



175
176
177
178
# File 'lib/record_select/helpers/record_select_helper.rb', line 175

def record_select_id(controller = nil) #:nodoc:
  controller ||= params[:controller]
  "record-select-#{controller.gsub('/', '_')}"
end

#record_select_js(type:, id:, url:, options:) ⇒ Object



7
8
9
# File 'lib/record_select/helpers/record_select_helper.rb', line 7

def record_select_js(type:, id:, url:, options:)
  javascript_tag("new RecordSelect.#{type}(#{id.to_json}, #{url.to_json}, #{options.to_json});")
end

#record_select_search_id(controller = nil) ⇒ Object

:nodoc:



180
181
182
# File 'lib/record_select/helpers/record_select_helper.rb', line 180

def record_select_search_id(controller = nil) #:nodoc:
  "#{record_select_id(controller)}-search"
end

#render_record_select(options = {}) ⇒ Object

A helper to render RecordSelect partials



159
160
161
162
163
# File 'lib/record_select/helpers/record_select_helper.rb', line 159

def render_record_select(options = {}) #:nodoc:
  controller.send(:render_record_select, options) do |options|
    render options
  end
end