ransack_ui 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/javascripts/ransack/predicates.js.coffee +1 -1
- data/app/assets/javascripts/ransack_ui_jquery/search_form.js.coffee +71 -27
- data/app/views/ransack/_condition_fields.html.haml +1 -1
- data/lib/core_ext/enumerable.rb +3 -0
- data/lib/ransack_ui/ransack_overrides/adapters/active_record/base.rb +6 -0
- data/lib/ransack_ui/ransack_overrides/configuration.rb +4 -0
- data/lib/ransack_ui/ransack_overrides/helpers/form_builder.rb +43 -4
- data/lib/ransack_ui/version.rb +1 -1
- data/lib/ransack_ui.rb +1 -0
- metadata +5 -4
@@ -17,7 +17,7 @@ Ransack.predicates =
|
|
17
17
|
Ransack.type_predicates = {}
|
18
18
|
((o, f) -> f.call o) Ransack.type_predicates, ->
|
19
19
|
@text = @string = ['eq', 'cont', 'matches', 'start', 'end', 'present', 'in']
|
20
|
-
@boolean = ['true']
|
20
|
+
@boolean = ['true', 'null']
|
21
21
|
@integer = @float = @decimal = ['eq', 'null', 'lt', 'gt', 'in']
|
22
22
|
@date = @datetime = @time = ['eq', 'null', 'lt', 'gt']
|
23
23
|
|
@@ -26,37 +26,76 @@
|
|
26
26
|
|
27
27
|
predicate_changed: (e) ->
|
28
28
|
target = $(e.currentTarget)
|
29
|
-
|
29
|
+
query_input = $('input#' + target.attr('id').slice(0, -1) + "v_0_value")
|
30
30
|
if target.val() in ["true", "false", "blank", "present", "null", "not_null"]
|
31
|
-
|
32
|
-
|
31
|
+
query_input.val("true")
|
32
|
+
query_input.hide()
|
33
33
|
else
|
34
|
-
unless
|
35
|
-
|
36
|
-
|
34
|
+
unless query_input.is(":visible")
|
35
|
+
query_input.val("")
|
36
|
+
query_input.show()
|
37
37
|
|
38
38
|
attribute_changed: (e) ->
|
39
39
|
target = $(e.currentTarget)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
#
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
40
|
+
selected = target.find('option:selected')
|
41
|
+
|
42
|
+
base_id = target.attr('id').slice(0, -8)
|
43
|
+
predicate_select = this.element.find('select#' + base_id + 'p')
|
44
|
+
predicate_select2 = this.element.find('#s2id_' + base_id + 'p')
|
45
|
+
query_input = $('input#' + base_id + "v_0_value")
|
46
|
+
|
47
|
+
if selected.data('ajax-url') and Select2?
|
48
|
+
controller = selected.data('controller')
|
49
|
+
|
50
|
+
# Hide predicate Select2
|
51
|
+
predicate_select2.hide()
|
52
|
+
# Clear predicates, and set 'eq' predicate
|
53
|
+
predicate_select.find('option').each (i, o) -> $(o).remove()
|
54
|
+
predicate_select.append $('<option selected="selected" value="eq">is</option>')
|
55
|
+
|
56
|
+
# Set up Select2 for query input
|
57
|
+
query_input.val('')
|
58
|
+
query_input.select2
|
59
|
+
placeholder: "Search #{selected.data('ajax-entity')}"
|
60
|
+
minimumInputLength: 1
|
61
|
+
ajax:
|
62
|
+
url: selected.data('ajax-url')
|
63
|
+
dataType: 'json'
|
64
|
+
type: selected.data('ajax-type')
|
65
|
+
data: (query, page) ->
|
66
|
+
obj = {}
|
67
|
+
obj[selected.data('ajax-key')] = query
|
68
|
+
obj
|
69
|
+
results: (data, page) ->
|
70
|
+
{results: $.map(data, (text, id) -> {id: id, text: text}) }
|
71
|
+
else
|
72
|
+
predicate_select2.show()
|
73
|
+
# If Select2 is on query input, remove and set defaults
|
74
|
+
if query_select2 = this.element.find('#s2id_' + base_id + 'v_0_value')
|
75
|
+
query_input.select2('destroy')
|
76
|
+
query_input.val('')
|
77
|
+
previous_val = ''
|
78
|
+
else
|
79
|
+
previous_val = predicate_select.val()
|
80
|
+
|
81
|
+
# Build array of supported predicates
|
82
|
+
available = predicate_select.data['predicates']
|
83
|
+
predicates = Ransack.type_predicates[selected.data('type')] || []
|
84
|
+
predicates = $.map predicates, (p) -> [p, Ransack.predicates[p]]
|
85
|
+
|
86
|
+
# Remove all predicates, and add any supported predicates
|
87
|
+
predicate_select.find('option').each (i, o) -> $(o).remove()
|
88
|
+
|
89
|
+
$.each available, (i, p) ->
|
90
|
+
[val, label] = [p[0], p[1]]
|
91
|
+
if val in predicates
|
92
|
+
predicate_select.append $('<option value='+val+'>'+label+'</option>')
|
93
|
+
|
94
|
+
# Select first predicate if current selection is invalid
|
95
|
+
predicate_select.select2('val', previous_val)
|
96
|
+
|
97
|
+
# Run predicate_changed callback
|
98
|
+
predicate_select.change()
|
60
99
|
|
61
100
|
return true
|
62
101
|
|
@@ -109,5 +148,10 @@
|
|
109
148
|
placeholder: "Select a Field"
|
110
149
|
allowClear: true
|
111
150
|
formatSelection: (object, container) ->
|
112
|
-
|
151
|
+
# Return model name if column is AJAX auto-completed association
|
152
|
+
if $(object.element).data('ajax-url')
|
153
|
+
object.text
|
154
|
+
# Return 'Model: field' if regular column
|
155
|
+
else
|
156
|
+
$(object.element).parent().attr('label') + ': ' + object.text
|
113
157
|
) jQuery
|
@@ -16,8 +16,10 @@ module Ransack
|
|
16
16
|
base.class_eval do
|
17
17
|
class_attribute :_ransackers
|
18
18
|
class_attribute :_ransackable_associations
|
19
|
+
class_attribute :_ransack_can_autocomplete
|
19
20
|
self._ransackers ||= {}
|
20
21
|
self._ransackable_associations ||= []
|
22
|
+
self._ransack_can_autocomplete = false
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
@@ -25,6 +27,10 @@ module Ransack
|
|
25
27
|
self._ransackable_associations = associations
|
26
28
|
end
|
27
29
|
|
30
|
+
def ransack_can_autocomplete
|
31
|
+
self._ransack_can_autocomplete = true
|
32
|
+
end
|
33
|
+
|
28
34
|
def ransackable_associations(auth_object = nil)
|
29
35
|
all_associations = reflect_on_all_associations.map {|a| a.name.to_s}
|
30
36
|
if self._ransackable_associations.any?
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'ransack/helpers/form_builder'
|
1
|
+
require 'ransack/helpers/form_builder'
|
2
2
|
|
3
3
|
module Ransack
|
4
4
|
module Helpers
|
@@ -49,17 +49,56 @@ module Ransack
|
|
49
49
|
|
50
50
|
def attribute_collection_for_bases(bases)
|
51
51
|
bases.map do |base|
|
52
|
+
klass = object.context.traverse(base)
|
53
|
+
foreign_keys = klass.reflect_on_all_associations.select(&:belongs_to?).
|
54
|
+
map_to({}) {|r, h| h[r.foreign_key.to_sym] = r.class_name }
|
55
|
+
ajax_options = Ransack.options[:ajax_options] || {}
|
56
|
+
|
57
|
+
if base.present?
|
58
|
+
model = object.context.traverse(base).model_name
|
59
|
+
end
|
60
|
+
|
52
61
|
begin
|
53
62
|
[
|
54
63
|
Translate.association(base, :context => object.context),
|
55
64
|
object.context.searchable_attributes(base).map do |c, type|
|
65
|
+
# Don't show 'id' column for base model
|
66
|
+
next nil if base.blank? && c == 'id'
|
67
|
+
|
56
68
|
attribute = attr_from_base_and_column(base, c)
|
69
|
+
attribute_label = Translate.attribute(attribute, :context => object.context)
|
70
|
+
|
71
|
+
# Set model name as label for 'id' column on that model's table.
|
72
|
+
if c == 'id'
|
73
|
+
foreign_klass = object.context.traverse(base).model_name
|
74
|
+
# Check that model can autocomplete. If not, skip this id column.
|
75
|
+
next nil unless foreign_klass.constantize._ransack_can_autocomplete
|
76
|
+
attribute_label = I18n.translate(foreign_klass, :default => foreign_klass)
|
77
|
+
else
|
78
|
+
foreign_klass = foreign_keys[c.to_sym]
|
79
|
+
end
|
80
|
+
|
81
|
+
# Add column type as data attribute
|
82
|
+
html_options = {:'data-type' => type}
|
83
|
+
|
84
|
+
if foreign_klass
|
85
|
+
# If field is a foreign key, set up 'data-ajax-*' attributes for auto-complete
|
86
|
+
controller = foreign_klass.tableize
|
87
|
+
html_options[:'data-ajax-entity'] = I18n.translate(controller, :default => controller)
|
88
|
+
if ajax_options[:url]
|
89
|
+
html_options[:'data-ajax-url'] = ajax_options[:url].sub(':controller', controller)
|
90
|
+
else
|
91
|
+
html_options[:'data-ajax-url'] = "/#{controller}.json"
|
92
|
+
end
|
93
|
+
html_options[:'data-ajax-type'] = ajax_options[:type] || 'GET'
|
94
|
+
html_options[:'data-ajax-key'] = ajax_options[:key] || 'query'
|
95
|
+
end
|
57
96
|
[
|
58
|
-
|
97
|
+
attribute_label,
|
59
98
|
attribute,
|
60
|
-
|
99
|
+
html_options
|
61
100
|
]
|
62
|
-
end
|
101
|
+
end.compact
|
63
102
|
]
|
64
103
|
rescue UntraversableAssociationError => e
|
65
104
|
nil
|
data/lib/ransack_ui/version.rb
CHANGED
data/lib/ransack_ui.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ransack_ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
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: 2012-11-
|
12
|
+
date: 2012-11-12 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Framework for building a search UI with Ransack
|
15
15
|
email:
|
@@ -33,6 +33,7 @@ files:
|
|
33
33
|
- app/views/ransack/_condition_fields.html.haml
|
34
34
|
- app/views/ransack/_grouping_fields.html.haml
|
35
35
|
- app/views/ransack/_search.html.haml
|
36
|
+
- lib/core_ext/enumerable.rb
|
36
37
|
- lib/ransack_ui.rb
|
37
38
|
- lib/ransack_ui/rails/engine.rb
|
38
39
|
- lib/ransack_ui/ransack_overrides/adapters/active_record/base.rb
|
@@ -57,7 +58,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
57
58
|
version: '0'
|
58
59
|
segments:
|
59
60
|
- 0
|
60
|
-
hash:
|
61
|
+
hash: 739364888355864408
|
61
62
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
63
|
none: false
|
63
64
|
requirements:
|
@@ -66,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
67
|
version: '0'
|
67
68
|
segments:
|
68
69
|
- 0
|
69
|
-
hash:
|
70
|
+
hash: 739364888355864408
|
70
71
|
requirements: []
|
71
72
|
rubyforge_project:
|
72
73
|
rubygems_version: 1.8.24
|