ransack_ui 0.1.7 → 1.0.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.
- data/app/assets/javascripts/ransack_ui_bootstrap/button_group_select.js.coffee +26 -0
- data/app/assets/javascripts/ransack_ui_bootstrap/index.js.coffee +2 -0
- data/app/assets/javascripts/{ransack_ui_jquery.js → ransack_ui_jquery/index.js} +0 -0
- data/app/assets/javascripts/ransack_ui_jquery/search_form.js.coffee.erb +42 -12
- data/app/assets/stylesheets/ransack_ui_bootstrap/index.css +3 -0
- data/app/assets/stylesheets/ransack_ui_bootstrap/search.css.scss +32 -0
- data/app/views/ransack_ui/_condition_fields.html.haml +1 -1
- data/app/views/ransack_ui/_grouping_fields.html.haml +7 -6
- data/app/views/ransack_ui/_search.html.haml +18 -9
- data/app/views/ransack_ui/_sort_fields.html.haml +3 -0
- data/config/locales/en.yml +8 -1
- data/lib/ransack_ui/controller_helpers.rb +1 -1
- data/lib/ransack_ui/ransack_overrides/helpers/form_builder.rb +99 -53
- data/lib/ransack_ui/version.rb +1 -1
- data/lib/ransack_ui/view_helpers.rb +18 -7
- metadata +10 -5
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# Converts a select list into a bootstrap button-group with radio button behaviour
|
3
|
+
#
|
4
|
+
(($) ->
|
5
|
+
$.widget 'ransack.button_group_select',
|
6
|
+
options: {}
|
7
|
+
|
8
|
+
_create: ->
|
9
|
+
el = @element
|
10
|
+
val = el.val()
|
11
|
+
el.hide()
|
12
|
+
|
13
|
+
html = '<div class="btn-group btn-group-select" data-toggle="buttons-radio">'
|
14
|
+
el.find('option').each (i, o) ->
|
15
|
+
html += "<button class=\"btn#{if o.value == val then ' active' else ''}\" type=\"button\" value=\"#{o.value}\">#{o.text}</button>"
|
16
|
+
|
17
|
+
# Insert HTML after hidden select
|
18
|
+
el.after html
|
19
|
+
|
20
|
+
# Update select val when button is clicked
|
21
|
+
btn_group = el.next()
|
22
|
+
btn_group.on 'click', 'button.btn', (e) =>
|
23
|
+
@element.val $(e.currentTarget).val()
|
24
|
+
true
|
25
|
+
|
26
|
+
) jQuery
|
File without changes
|
@@ -1,5 +1,5 @@
|
|
1
1
|
(($) ->
|
2
|
-
$.widget 'ransack.
|
2
|
+
$.widget 'ransack.ransack_search_form',
|
3
3
|
options: {}
|
4
4
|
|
5
5
|
_create: ->
|
@@ -15,6 +15,9 @@
|
|
15
15
|
@init_select2(containers)
|
16
16
|
@store_initial_predicates(containers)
|
17
17
|
|
18
|
+
if $.ransack.button_group_select?
|
19
|
+
@init_button_group_select(@element)
|
20
|
+
|
18
21
|
# show spinner and disable the form when the search is underway
|
19
22
|
el.find("form input:submit").click $.proxy(@form_submit, this)
|
20
23
|
|
@@ -37,12 +40,7 @@
|
|
37
40
|
# Handle association columns with AJAX autocomplete
|
38
41
|
if selected.data('ajax-url') and Select2?
|
39
42
|
controller = selected.data('controller')
|
40
|
-
|
41
|
-
# Hide predicate Select2
|
42
|
-
predicate_select2.hide()
|
43
|
-
# Clear predicates, and set 'eq' predicate
|
44
|
-
predicate_select.find('option').each (i, o) -> $(o).remove()
|
45
|
-
predicate_select.append $('<option selected="selected" value="eq">is</option>')
|
43
|
+
@force_eq_predicate(base_id)
|
46
44
|
|
47
45
|
# Set up Select2 for query input
|
48
46
|
query_input.val('')
|
@@ -61,9 +59,18 @@
|
|
61
59
|
results: (data, page) ->
|
62
60
|
{results: $.map(data, (text, id) -> {id: id, text: text}) }
|
63
61
|
|
62
|
+
# Handle columns with options detected from validates :inclusion
|
63
|
+
else if selected.data('select-options') and Select2?
|
64
|
+
@force_eq_predicate(base_id)
|
65
|
+
query_input.val('')
|
66
|
+
query_input.select2
|
67
|
+
data: selected.data('select-options')
|
68
|
+
placeholder: "Please select a #{selected.val()}"
|
69
|
+
allowClear: true
|
70
|
+
|
64
71
|
# Handle regular columns
|
65
72
|
else
|
66
|
-
predicate_select2.
|
73
|
+
predicate_select2.select2("enable")
|
67
74
|
# If Select2 is on query input, remove and set defaults
|
68
75
|
if (query_select2 = @element.find("#s2id_#{base_id}v_0_value")).length > 0
|
69
76
|
query_input.select2('destroy')
|
@@ -139,6 +146,17 @@
|
|
139
146
|
query_input.parent().find('.ui-datepicker-trigger').show()
|
140
147
|
|
141
148
|
|
149
|
+
# Dsiables predicate choices and sets it to 'eq'
|
150
|
+
force_eq_predicate: (base_id) ->
|
151
|
+
predicate_select = @element.find("select##{base_id}p")
|
152
|
+
predicate_select2 = @element.find("#s2id_#{base_id}p")
|
153
|
+
# Disable predicate Select2
|
154
|
+
predicate_select2.select2('disable')
|
155
|
+
# Clear predicates, and set 'eq' predicate
|
156
|
+
predicate_select.find('option').each (i, o) -> $(o).remove()
|
157
|
+
predicate_select.append $('<option selected="selected" value="eq">is</option>')
|
158
|
+
predicate_select2.select2('val', 'eq')
|
159
|
+
|
142
160
|
# Attempts to find a predicate translation for the specific column type,
|
143
161
|
# or returns the default label.
|
144
162
|
# For example, 'lt' on an integer column will be translated to 'is less than',
|
@@ -208,9 +226,7 @@
|
|
208
226
|
'value="'+value+'" style="display:none;" />')
|
209
227
|
|
210
228
|
form_submit: (e) ->
|
211
|
-
$("#loading").show()
|
212
229
|
@element.css({ opacity: 0.4 })
|
213
|
-
$('div.list').html('')
|
214
230
|
true
|
215
231
|
|
216
232
|
add_fields: (e) ->
|
@@ -222,7 +238,12 @@
|
|
222
238
|
container = target.closest('p')
|
223
239
|
container.before content.replace(regexp, new_id)
|
224
240
|
prev_container = container.prev()
|
241
|
+
|
225
242
|
@init_select2(prev_container)
|
243
|
+
|
244
|
+
if $.ransack.button_group_select?
|
245
|
+
@init_button_group_select(prev_container)
|
246
|
+
|
226
247
|
@store_initial_predicates(prev_container)
|
227
248
|
# Fire change event on any new selects.
|
228
249
|
container.prev().find("select").change()
|
@@ -239,7 +260,7 @@
|
|
239
260
|
|
240
261
|
store_initial_predicates: (container) ->
|
241
262
|
# Store current predicates in data attribute
|
242
|
-
predicate_select = container.find('select.ransack_predicate')
|
263
|
+
predicate_select = container.find('select.ransack_predicate:first')
|
243
264
|
unless predicate_select.data['predicates']
|
244
265
|
predicates = []
|
245
266
|
predicate_select.find('option').each (i, o) ->
|
@@ -267,8 +288,17 @@
|
|
267
288
|
# Avoid labels like 'Contact: Contact'
|
268
289
|
if group_label == object.text
|
269
290
|
object.text
|
270
|
-
else
|
291
|
+
else if group_label?
|
271
292
|
group_label + ': ' + object.text
|
293
|
+
else
|
294
|
+
object.text
|
295
|
+
|
296
|
+
@element.find('select.ransack_sort').select2
|
297
|
+
width: '230px'
|
298
|
+
placeholder: "Select a Field"
|
299
|
+
|
300
|
+
init_button_group_select: (containers) ->
|
301
|
+
containers.find('select.ransack_combinator, select.ransack_sort_order').button_group_select()
|
272
302
|
|
273
303
|
init_datetimepicker: (base_id) ->
|
274
304
|
if $.ui?.timepicker?
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#ransack_search {
|
2
|
+
.remove_fields, .ransack_attribute, .ransack_predicate,
|
3
|
+
.ransack_query, .ransack_sort_order, .ransack_sort,
|
4
|
+
.btn-group-select {
|
5
|
+
margin: 0 5px;
|
6
|
+
vertical-align: middle;
|
7
|
+
margin-bottom: 0;
|
8
|
+
}
|
9
|
+
|
10
|
+
.btn-group-select { display: inline-block; }
|
11
|
+
|
12
|
+
.remove_fields {
|
13
|
+
margin-right: 4px;
|
14
|
+
img { margin-bottom: 4px; }
|
15
|
+
&:hover { opacity: 0.6; }
|
16
|
+
}
|
17
|
+
.remove_fields.btn {
|
18
|
+
padding: 0px 3px;
|
19
|
+
&:hover { opacity: 1; }
|
20
|
+
}
|
21
|
+
|
22
|
+
a.btn {
|
23
|
+
i { margin-bottom: 2px; }
|
24
|
+
span { margin-left: 5px; }
|
25
|
+
}
|
26
|
+
|
27
|
+
.combinator { margin-bottom: 20px; }
|
28
|
+
|
29
|
+
.filters > p {
|
30
|
+
margin-top: 20px;
|
31
|
+
}
|
32
|
+
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.fields.condition{ "data-object-name" => f.object_name }
|
2
2
|
%p
|
3
|
-
= link_to_remove_fields t(
|
3
|
+
= link_to_remove_fields t('ransack.remove_condition'), f, options
|
4
4
|
|
5
5
|
= f.attribute_fields do |a|
|
6
6
|
%span.fields{ "data-object-name" => f.object_name }
|
@@ -1,12 +1,13 @@
|
|
1
|
-
.fields{ 'data-object-name' => f.object_name }
|
2
|
-
|
3
|
-
- key = (f.object_name =~ /[0]/) ? :
|
4
|
-
=
|
1
|
+
.fields.well{ 'data-object-name' => f.object_name }
|
2
|
+
.combinator
|
3
|
+
- key = (f.object_name =~ /[0]/) ? :group_first : :group_rest
|
4
|
+
- combinator = f.combinator_select({}, :class => 'ransack_combinator')
|
5
|
+
= t("ransack.#{key}", :combinator => combinator).html_safe
|
5
6
|
|
6
7
|
.filters
|
7
8
|
- f.object.build_condition unless f.object.conditions.any?
|
8
9
|
= f.condition_fields do |c|
|
9
|
-
= render 'ransack_ui/condition_fields', :f => c
|
10
|
+
= render 'ransack_ui/condition_fields', :f => c, :options => options
|
10
11
|
|
11
12
|
%p
|
12
|
-
= link_to_add_fields t(
|
13
|
+
= link_to_add_fields t('ransack.add_condition'), f, :condition, options
|
@@ -1,16 +1,25 @@
|
|
1
|
-
= search_form_for @ransack_search, :url => url_for(:action => :index),
|
1
|
+
= search_form_for @ransack_search, :url => (options[:url] || url_for(:action => :index)),
|
2
|
+
:html => {:method => :get, :class => "ransack_search"}, :remote => !!options[:remote] do |f|
|
2
3
|
|
3
4
|
:javascript
|
4
5
|
if (window.Ransack == null) { window.Ransack = {}; }
|
5
6
|
Ransack.alt_predicates_i18n = #{I18n.translate(:"ransack.predicates.alt", :default => {}).to_json}
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
.row
|
9
|
+
.span12.well
|
10
|
+
= f.grouping_fields do |g|
|
11
|
+
= render 'ransack_ui/grouping_fields', :f => g, :options => options
|
9
12
|
|
10
|
-
|
11
|
-
|
13
|
+
%p
|
14
|
+
= link_to_add_fields t('ransack.add_group'), f, :grouping, options
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
%hr
|
17
|
+
|
18
|
+
.pull-left
|
19
|
+
= f.sort_fields do |s|
|
20
|
+
= render 'ransack_ui/sort_fields', :f => s
|
21
|
+
|
22
|
+
.pull-right
|
23
|
+
= hidden_field_tag :distinct, '1'
|
24
|
+
= hidden_field_tag :page, '1'
|
25
|
+
= f.submit t('ransack.submit'), :class => 'btn btn-primary btn-large'
|
data/config/locales/en.yml
CHANGED
@@ -14,4 +14,11 @@ en:
|
|
14
14
|
gt_all: "is after all"
|
15
15
|
gteq: "is after or on"
|
16
16
|
gteq_any: "is after or on any"
|
17
|
-
gteq_all: "is after or on all"
|
17
|
+
gteq_all: "is after or on all"
|
18
|
+
|
19
|
+
submit: Search
|
20
|
+
add_group: Add a filter group
|
21
|
+
group_first: "Show results where %{combinator} of the following match:"
|
22
|
+
group_rest: "...and where %{combinator} of the following match:"
|
23
|
+
add_condition: Add a filter
|
24
|
+
remove_condition: Remove filter
|
@@ -11,7 +11,7 @@ module RansackUI
|
|
11
11
|
def load_ransack_search(klass = nil)
|
12
12
|
klass ||= controller_name.classify.constantize
|
13
13
|
@ransack_search = klass.search(params[:q])
|
14
|
-
@ransack_search.build_grouping
|
14
|
+
@ransack_search.build_grouping if @ransack_search.groupings.empty?
|
15
15
|
@ransack_search
|
16
16
|
end
|
17
17
|
end
|
@@ -20,7 +20,29 @@ module Ransack
|
|
20
20
|
objectify_options(options), @default_options.merge(html_options)
|
21
21
|
)
|
22
22
|
else
|
23
|
-
|
23
|
+
@template.select(
|
24
|
+
@object_name, :name, attribute_collection_for_base(bases.first),
|
25
|
+
objectify_options(options), @default_options.merge(html_options)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def sort_select(options = {}, html_options = {})
|
31
|
+
raise ArgumentError, "sort_select must be called inside a search FormBuilder!" unless object.respond_to?(:context)
|
32
|
+
options[:include_blank] = true unless options.has_key?(:include_blank)
|
33
|
+
bases = [''] + association_array(options[:associations])
|
34
|
+
if bases.size > 1
|
35
|
+
@template.select(
|
36
|
+
@object_name, :name,
|
37
|
+
@template.grouped_options_for_select(attribute_collection_for_bases(bases), object.name),
|
38
|
+
objectify_options(options), @default_options.merge({class: 'ransack_sort'}).merge(html_options)
|
39
|
+
) + @template.collection_select(
|
40
|
+
@object_name, :dir, [['asc', object.translate('asc')], ['desc', object.translate('desc')]], :first, :last,
|
41
|
+
objectify_options(options.except(:include_blank)), @default_options.merge({class: 'ransack_sort_order'}).merge(html_options)
|
42
|
+
)
|
43
|
+
else
|
44
|
+
# searchable_attributes now returns [c, type]
|
45
|
+
collection = object.context.searchable_attributes(bases.first).map do |c, type|
|
24
46
|
[
|
25
47
|
attr_from_base_and_column(bases.first, c),
|
26
48
|
Translate.attribute(attr_from_base_and_column(bases.first, c), :context => object.context)
|
@@ -28,7 +50,10 @@ module Ransack
|
|
28
50
|
end
|
29
51
|
@template.collection_select(
|
30
52
|
@object_name, :name, collection, :first, :last,
|
31
|
-
objectify_options(options), @default_options.merge(html_options)
|
53
|
+
objectify_options(options), @default_options.merge({class: 'ransack_sort'}).merge(html_options)
|
54
|
+
) + @template.collection_select(
|
55
|
+
@object_name, :dir, [['asc', object.translate('asc')], ['desc', object.translate('desc')]], :first, :last,
|
56
|
+
objectify_options(options.except(:include_blank)), @default_options.merge({class: 'ransack_sort_order'}).merge(html_options)
|
32
57
|
)
|
33
58
|
end
|
34
59
|
end
|
@@ -49,63 +74,84 @@ module Ransack
|
|
49
74
|
|
50
75
|
def attribute_collection_for_bases(bases)
|
51
76
|
bases.map do |base|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
if base.present?
|
58
|
-
model = object.context.traverse(base).model_name
|
77
|
+
if collection = attribute_collection_for_base(base)
|
78
|
+
[
|
79
|
+
Translate.association(base, :context => object.context),
|
80
|
+
collection
|
81
|
+
]
|
59
82
|
end
|
83
|
+
end.compact
|
84
|
+
end
|
60
85
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
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
|
86
|
+
def attribute_collection_for_base(base)
|
87
|
+
klass = object.context.traverse(base)
|
88
|
+
foreign_keys = klass.reflect_on_all_associations.select(&:belongs_to?).
|
89
|
+
map_to({}) {|r, h| h[r.foreign_key.to_sym] = r.class_name }
|
90
|
+
|
91
|
+
ajax_options = Ransack.options[:ajax_options] || {}
|
80
92
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
controller = foreign_klass.tableize
|
89
|
-
html_options[:'data-ajax-entity'] = I18n.translate(controller, :default => controller)
|
90
|
-
if ajax_options[:url]
|
91
|
-
html_options[:'data-ajax-url'] = ajax_options[:url].sub(':controller', controller)
|
92
|
-
else
|
93
|
-
html_options[:'data-ajax-url'] = "/#{controller}.json"
|
94
|
-
end
|
95
|
-
html_options[:'data-ajax-type'] = ajax_options[:type] || 'GET'
|
96
|
-
html_options[:'data-ajax-key'] = ajax_options[:key] || 'query'
|
93
|
+
# Detect any inclusion validators to build list of options for a column
|
94
|
+
column_select_options = klass.validators.each_with_object({}) do |v, hash|
|
95
|
+
if v.is_a? ActiveModel::Validations::InclusionValidator
|
96
|
+
v.attributes.each do |a|
|
97
|
+
# Try to translate options from activerecord.attribute_options.<model>.<attribute>
|
98
|
+
hash[a.to_s] = v.send(:delimiter).each_with_object({}) do |o, options|
|
99
|
+
options[o] = I18n.translate("activerecord.attribute_options.#{klass.to_s.downcase}.#{a}.#{o}", :default => o)
|
97
100
|
end
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
object.context.searchable_attributes(base).map do |c, type|
|
106
|
+
# Don't show 'id' column for base model
|
107
|
+
next nil if base.blank? && c == 'id'
|
108
|
+
|
109
|
+
attribute = attr_from_base_and_column(base, c)
|
110
|
+
attribute_label = Translate.attribute(attribute, :context => object.context)
|
111
|
+
|
112
|
+
# Set model name as label for 'id' column on that model's table.
|
113
|
+
if c == 'id'
|
114
|
+
foreign_klass = object.context.traverse(base).model_name
|
115
|
+
# Check that model can autocomplete. If not, skip this id column.
|
116
|
+
next nil unless foreign_klass.constantize._ransack_can_autocomplete
|
117
|
+
attribute_label = I18n.translate(foreign_klass, :default => foreign_klass)
|
118
|
+
else
|
119
|
+
foreign_klass = foreign_keys[c.to_sym]
|
107
120
|
end
|
121
|
+
|
122
|
+
# Add column type as data attribute
|
123
|
+
html_options = {:'data-type' => type}
|
124
|
+
# Set 'base' attribute if attribute is on base model
|
125
|
+
html_options[:'data-root-model'] = true if base.blank?
|
126
|
+
# Set column options if detected from inclusion validator
|
127
|
+
if column_select_options[c]
|
128
|
+
# Format options as an array of hashes with id and text columns, for Select2
|
129
|
+
html_options[:'data-select-options'] = column_select_options[c].map {|id, text|
|
130
|
+
{:id => id, :text => text}
|
131
|
+
}.to_json
|
132
|
+
end
|
133
|
+
|
134
|
+
if foreign_klass
|
135
|
+
# If field is a foreign key, set up 'data-ajax-*' attributes for auto-complete
|
136
|
+
controller = foreign_klass.tableize
|
137
|
+
html_options[:'data-ajax-entity'] = I18n.translate(controller, :default => controller)
|
138
|
+
if ajax_options[:url]
|
139
|
+
html_options[:'data-ajax-url'] = ajax_options[:url].sub(':controller', controller)
|
140
|
+
else
|
141
|
+
html_options[:'data-ajax-url'] = "/#{controller}.json"
|
142
|
+
end
|
143
|
+
html_options[:'data-ajax-type'] = ajax_options[:type] || 'GET'
|
144
|
+
html_options[:'data-ajax-key'] = ajax_options[:key] || 'query'
|
145
|
+
end
|
146
|
+
|
147
|
+
[
|
148
|
+
attribute_label,
|
149
|
+
attribute,
|
150
|
+
html_options
|
151
|
+
]
|
108
152
|
end.compact
|
153
|
+
rescue UntraversableAssociationError => e
|
154
|
+
nil
|
109
155
|
end
|
110
156
|
end
|
111
157
|
end
|
data/lib/ransack_ui/version.rb
CHANGED
@@ -1,19 +1,30 @@
|
|
1
1
|
module RansackUI
|
2
2
|
module ViewHelpers
|
3
|
-
def ransack_ui_search
|
4
|
-
render 'ransack_ui/search'
|
3
|
+
def ransack_ui_search(options = {})
|
4
|
+
render 'ransack_ui/search', :options => options
|
5
5
|
end
|
6
6
|
|
7
|
-
def link_to_add_fields(name, f, type)
|
7
|
+
def link_to_add_fields(name, f, type, options)
|
8
8
|
new_object = f.object.send "build_#{type}"
|
9
9
|
fields = f.send("#{type}_fields", new_object, :child_index => "new_#{type}") do |builder|
|
10
|
-
render "ransack_ui/#{type.to_s}_fields", :f => builder
|
10
|
+
render "ransack_ui/#{type.to_s}_fields", :f => builder, :options => options
|
11
|
+
end
|
12
|
+
|
13
|
+
if options[:theme].to_s == 'bootstrap'
|
14
|
+
link_to nil, :class => "add_fields btn btn-small btn-primary", "data-field-type" => type, "data-content" => "#{fields}" do
|
15
|
+
"<i class=\"icon-plus icon-white\"></i><span>#{name}</span>".html_safe
|
16
|
+
end
|
17
|
+
else
|
18
|
+
link_to name, nil, :class => "add_fields", "data-field-type" => type, "data-content" => "#{fields}"
|
11
19
|
end
|
12
|
-
link_to name, nil, :class => "add_fields", "data-field-type" => type, "data-content" => "#{fields}"
|
13
20
|
end
|
14
21
|
|
15
|
-
def link_to_remove_fields(name, f)
|
16
|
-
|
22
|
+
def link_to_remove_fields(name, f, options)
|
23
|
+
if options[:theme].to_s == 'bootstrap'
|
24
|
+
link_to '<i class="icon-remove icon-white"></i>'.html_safe, nil, :class => "remove_fields btn btn-mini btn-danger"
|
25
|
+
else
|
26
|
+
link_to image_tag('ransack_ui/delete.png', :size => '16x16', :alt => name), nil, :class => "remove_fields"
|
27
|
+
end
|
17
28
|
end
|
18
29
|
end
|
19
30
|
end
|
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.
|
4
|
+
version: 1.0.0
|
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-
|
12
|
+
date: 2012-12-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ransack_chronic
|
@@ -42,11 +42,16 @@ files:
|
|
42
42
|
- app/assets/images/ransack_ui/calendar.png
|
43
43
|
- app/assets/images/ransack_ui/delete.png
|
44
44
|
- app/assets/javascripts/ransack/predicates.js.coffee
|
45
|
-
- app/assets/javascripts/
|
45
|
+
- app/assets/javascripts/ransack_ui_bootstrap/button_group_select.js.coffee
|
46
|
+
- app/assets/javascripts/ransack_ui_bootstrap/index.js.coffee
|
47
|
+
- app/assets/javascripts/ransack_ui_jquery/index.js
|
46
48
|
- app/assets/javascripts/ransack_ui_jquery/search_form.js.coffee.erb
|
49
|
+
- app/assets/stylesheets/ransack_ui_bootstrap/index.css
|
50
|
+
- app/assets/stylesheets/ransack_ui_bootstrap/search.css.scss
|
47
51
|
- app/views/ransack_ui/_condition_fields.html.haml
|
48
52
|
- app/views/ransack_ui/_grouping_fields.html.haml
|
49
53
|
- app/views/ransack_ui/_search.html.haml
|
54
|
+
- app/views/ransack_ui/_sort_fields.html.haml
|
50
55
|
- config/locales/en.yml
|
51
56
|
- lib/core_ext/enumerable.rb
|
52
57
|
- lib/ransack_ui.rb
|
@@ -76,7 +81,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
81
|
version: '0'
|
77
82
|
segments:
|
78
83
|
- 0
|
79
|
-
hash:
|
84
|
+
hash: -2240639429364373770
|
80
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
86
|
none: false
|
82
87
|
requirements:
|
@@ -85,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
90
|
version: '0'
|
86
91
|
segments:
|
87
92
|
- 0
|
88
|
-
hash:
|
93
|
+
hash: -2240639429364373770
|
89
94
|
requirements: []
|
90
95
|
rubyforge_project:
|
91
96
|
rubygems_version: 1.8.24
|