active_scaffold 3.7.2 → 3.7.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.rdoc +9 -0
- data/app/assets/javascripts/active_scaffold.js.erb +1 -4
- data/app/assets/javascripts/jquery/active_scaffold.js +1421 -1396
- data/app/assets/javascripts/jquery/draggable_lists.js +6 -4
- data/app/assets/javascripts/jquery/tiny_mce_bridge.js +2 -2
- data/app/assets/stylesheets/active_scaffold_jquery_ui.css.erb +7 -8
- data/app/views/active_scaffold_overrides/_field_search.html.erb +10 -1
- data/app/views/active_scaffold_overrides/_search.html.erb +9 -1
- data/lib/active_scaffold/bridges/date_picker.rb +1 -1
- data/lib/active_scaffold/bridges/record_select/helpers.rb +3 -3
- data/lib/active_scaffold/config/field_search.rb +5 -0
- data/lib/active_scaffold/config/search.rb +5 -0
- data/lib/active_scaffold/finder.rb +14 -4
- data/lib/active_scaffold/helpers/id_helpers.rb +1 -1
- data/lib/active_scaffold/version.rb +1 -1
- data/lib/active_scaffold.rb +6 -0
- data/vendor/assets/javascripts/jquery.ba-throttle-debounce.js +10 -3
- metadata +2 -2
@@ -21,8 +21,10 @@
|
|
21
21
|
jQuery(element).sortable(jQuery.extend(options, {connectWith: '#'+list_selected.attr('id')}));
|
22
22
|
jQuery(list_selected).sortable(jQuery.extend(options, {connectWith: '#'+element.attr('id')}));
|
23
23
|
return element;
|
24
|
-
}
|
25
|
-
jQuery.fn.
|
26
|
-
|
27
|
-
|
24
|
+
}
|
25
|
+
if (typeof(jQuery.fn.sortable) !== 'undefined') {
|
26
|
+
jQuery.fn.draggableLists = function() {
|
27
|
+
this.each(function() { enableDraggableLists(jQuery(this)); });
|
28
|
+
};
|
29
|
+
}
|
28
30
|
})();
|
@@ -11,10 +11,10 @@
|
|
11
11
|
var global_settings = ActiveScaffold.config.tiny_mce_settings || {};
|
12
12
|
var local_settings = jQuery(this).data('tinymce');
|
13
13
|
var settings = {};
|
14
|
-
for (key in global_settings) {
|
14
|
+
for (let key in global_settings) {
|
15
15
|
settings[key] = global_settings[key];
|
16
16
|
}
|
17
|
-
for (key in local_settings) {
|
17
|
+
for (let key in local_settings) {
|
18
18
|
settings[key] = local_settings[key];
|
19
19
|
}
|
20
20
|
var id = jQuery(this).attr('id');
|
@@ -1,11 +1,10 @@
|
|
1
1
|
<% if Jquery::Rails.const_defined? 'JQUERY_UI_VERSION' %>
|
2
|
-
<% require_asset "jquery-ui" %>
|
3
|
-
<% require_asset "jquery-ui-theme" %>
|
2
|
+
<% require_asset "jquery-ui" %>
|
4
3
|
<% elsif Jquery.const_defined? 'Ui' %>
|
5
|
-
<% if Jquery::Ui::Rails::VERSION < '5.0.0' %>
|
6
|
-
<% require_asset "jquery.ui.datepicker" %>
|
7
|
-
<% else %>
|
8
|
-
<% require_asset "jquery-ui/datepicker" %>
|
9
|
-
<% end %>
|
10
|
-
<% require_asset "jquery-ui-theme" %>
|
4
|
+
<% if Jquery::Ui::Rails::VERSION < '5.0.0' %>
|
5
|
+
<% require_asset "jquery.ui.datepicker" %>
|
6
|
+
<% else %>
|
7
|
+
<% require_asset "jquery-ui/datepicker" %>
|
8
|
+
<% end %>
|
11
9
|
<% end %>
|
10
|
+
<% require_asset "jquery-ui-theme" if ActiveScaffold.jquery_ui_included? %>
|
@@ -41,8 +41,17 @@
|
|
41
41
|
<% end -%>
|
42
42
|
</ol>
|
43
43
|
<p class="form-footer">
|
44
|
+
<%
|
45
|
+
reset_attrs = {class: 'reset'}
|
46
|
+
if active_scaffold_config.field_search.reset_form
|
47
|
+
reset_attrs[:data] = {reset: true}
|
48
|
+
else
|
49
|
+
reset_attrs[:class] << ' as_cancel'
|
50
|
+
reset_attrs.merge! remote: true, data: {refresh: true}
|
51
|
+
end
|
52
|
+
%>
|
44
53
|
<%= submit_tag as_(submit_text), :class => "submit" %>
|
45
|
-
<%= link_to as_(:reset), url_for(url_options.merge(:search => '')),
|
54
|
+
<%= link_to as_(:reset), url_for(url_options.merge(:search => '')), reset_attrs unless local_assigns[:skip_reset] %>
|
46
55
|
<%= loading_indicator_tag(:action => :search) %>
|
47
56
|
</p>
|
48
57
|
</form>
|
@@ -21,6 +21,14 @@
|
|
21
21
|
<% end -%>
|
22
22
|
<%= search_field_tag :search, (search_params if search_params.is_a? String), :class => 'text-input', :id => search_input_id, :size => 50, :autocomplete => :off, :placeholder => as_(live_search ? :live_search : :search_terms) %>
|
23
23
|
<%= submit_tag as_(submit_text), :class => "submit", :style => ('display:none;' if live_search) %>
|
24
|
-
|
24
|
+
<%
|
25
|
+
reset_attrs = {class: 'as_cancel reset'}
|
26
|
+
if active_scaffold_config.field_search.reset_form
|
27
|
+
reset_attrs[:data] = {reset: true}
|
28
|
+
else
|
29
|
+
reset_attrs.merge! remote: true, data: {refresh: true}
|
30
|
+
end
|
31
|
+
%>
|
32
|
+
<%= link_to as_(:reset), url_for(url_options.merge(:search => '')), reset_attrs unless local_assigns[:skip_reset] %>
|
25
33
|
<%= loading_indicator_tag(:action => :search) %>
|
26
34
|
<% end %>
|
@@ -10,7 +10,7 @@ module ActiveScaffold::Bridges
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.jquery_ui_included?
|
13
|
-
|
13
|
+
ActiveScaffold.jquery_ui_included?
|
14
14
|
end
|
15
15
|
mattr_accessor :default_ui
|
16
16
|
@@default_ui = true
|
@@ -27,7 +27,7 @@ class ActiveScaffold::Bridges::RecordSelect
|
|
27
27
|
def active_scaffold_record_select(record, column, options, value, multiple, ui_options: column.options)
|
28
28
|
unless column.association
|
29
29
|
raise ArgumentError, "record_select can only work against associations (and #{column.name} is not). "\
|
30
|
-
|
30
|
+
'A common mistake is to specify the foreign key field (like :user_id), instead of the association (:user).'
|
31
31
|
end
|
32
32
|
klass = column.association.klass(record)
|
33
33
|
return content_tag :span, '', :class => options[:class] unless klass
|
@@ -68,13 +68,13 @@ class ActiveScaffold::Bridges::RecordSelect
|
|
68
68
|
module SearchColumnHelpers
|
69
69
|
def active_scaffold_search_record_select(column, options, ui_options: column.options)
|
70
70
|
value = field_search_record_select_value(column, options[:value], ui_options: ui_options)
|
71
|
-
active_scaffold_record_select(options[:object], column, options, value, ui_options[:multiple], ui_options: ui_options)
|
71
|
+
active_scaffold_record_select(options[:object], column, options.except(:value), value, ui_options[:multiple], ui_options: ui_options)
|
72
72
|
end
|
73
73
|
|
74
74
|
def field_search_record_select_value(column, value, ui_options: column.options)
|
75
75
|
return if value.blank?
|
76
76
|
if ui_options[:multiple]
|
77
|
-
column.association.klass.find value.collect!(&:to_i)
|
77
|
+
column.association.klass.find value.select(&:present?).collect!(&:to_i)
|
78
78
|
else
|
79
79
|
column.association.klass.find(value.to_i)
|
80
80
|
end
|
@@ -8,6 +8,7 @@ module ActiveScaffold::Config
|
|
8
8
|
@text_search = self.class.text_search
|
9
9
|
@human_conditions = self.class.human_conditions
|
10
10
|
@floating_footer = self.class.floating_footer
|
11
|
+
@reset_form = self.class.reset_form
|
11
12
|
end
|
12
13
|
|
13
14
|
# global level configuration
|
@@ -34,6 +35,8 @@ module ActiveScaffold::Config
|
|
34
35
|
class_attribute :floating_footer, instance_accessor: false
|
35
36
|
@@floating_footer = false
|
36
37
|
|
38
|
+
cattr_accessor :reset_form, instance_accessor: false
|
39
|
+
|
37
40
|
# instance-level configuration
|
38
41
|
# ----------------------------
|
39
42
|
|
@@ -79,6 +82,8 @@ module ActiveScaffold::Config
|
|
79
82
|
# whether footer should float when form is too long to fit in the screen, so footer is always available while scrolling
|
80
83
|
attr_accessor :floating_footer
|
81
84
|
|
85
|
+
attr_accessor :reset_form
|
86
|
+
|
82
87
|
UserSettings.class_eval do
|
83
88
|
user_attr :optional_columns, :group_options, :grouped_columns, :human_conditions, :floating_footer
|
84
89
|
end
|
@@ -7,6 +7,7 @@ module ActiveScaffold::Config
|
|
7
7
|
@text_search = self.class.text_search
|
8
8
|
@live = self.class.live?
|
9
9
|
@split_terms = self.class.split_terms
|
10
|
+
@reset_form = self.class.reset_form
|
10
11
|
end
|
11
12
|
|
12
13
|
# global level configuration
|
@@ -33,6 +34,8 @@ module ActiveScaffold::Config
|
|
33
34
|
cattr_accessor :split_terms, instance_accessor: false
|
34
35
|
@@split_terms = ' '
|
35
36
|
|
37
|
+
cattr_accessor :reset_form, instance_accessor: false
|
38
|
+
|
36
39
|
# instance-level configuration
|
37
40
|
# ----------------------------
|
38
41
|
|
@@ -56,6 +59,8 @@ module ActiveScaffold::Config
|
|
56
59
|
|
57
60
|
attr_accessor :split_terms
|
58
61
|
|
62
|
+
attr_accessor :reset_form
|
63
|
+
|
59
64
|
# the ActionLink for this action
|
60
65
|
attr_accessor :link
|
61
66
|
|
@@ -29,7 +29,12 @@ module ActiveScaffold
|
|
29
29
|
def type_casted_tokens(tokens, columns, like_pattern)
|
30
30
|
tokens.map do |value|
|
31
31
|
columns.each_with_object({}) do |column, column_tokens|
|
32
|
-
column_tokens[column.name] =
|
32
|
+
column_tokens[column.name] =
|
33
|
+
if column.text?
|
34
|
+
like_pattern.sub('?', column.active_record? ? column.active_record_class.sanitize_sql_like(value) : value)
|
35
|
+
else
|
36
|
+
ActiveScaffold::Core.column_type_cast(value, column.column)
|
37
|
+
end
|
33
38
|
end
|
34
39
|
end
|
35
40
|
end
|
@@ -165,6 +170,7 @@ module ActiveScaffold
|
|
165
170
|
['%<search_sql>s in (?)', values] if values.present?
|
166
171
|
else
|
167
172
|
if column.text?
|
173
|
+
value = column.active_record? ? column.active_record_class.sanitize_sql_like(value) : value
|
168
174
|
["%<search_sql>s #{ActiveScaffold::Finder.like_operator} ?", like_pattern.sub('?', value)]
|
169
175
|
else
|
170
176
|
['%<search_sql>s = ?', ActiveScaffold::Core.column_type_cast(value, column.column)]
|
@@ -189,6 +195,7 @@ module ActiveScaffold
|
|
189
195
|
def condition_for_range(column, value, like_pattern = nil)
|
190
196
|
if !value.is_a?(Hash)
|
191
197
|
if column.text?
|
198
|
+
value = column.active_record? ? column.active_record_class.sanitize_sql_like(value) : value
|
192
199
|
["%<search_sql>s #{ActiveScaffold::Finder.like_operator} ?", like_pattern.sub('?', value)]
|
193
200
|
else
|
194
201
|
['%<search_sql>s = ?', ActiveScaffold::Core.column_type_cast(value, column.column)]
|
@@ -198,9 +205,10 @@ module ActiveScaffold
|
|
198
205
|
elsif value[:from].blank?
|
199
206
|
nil
|
200
207
|
elsif ActiveScaffold::Finder::STRING_COMPARATORS.values.include?(value[:opt])
|
208
|
+
text = column.active_record? ? column.active_record_class.sanitize_sql_like(value[:from]) : value[:from]
|
201
209
|
[
|
202
210
|
"%<search_sql>s #{'NOT ' if value[:opt].start_with?('not_')}#{ActiveScaffold::Finder.like_operator} ?",
|
203
|
-
value[:opt].sub('not_', '').sub('?',
|
211
|
+
value[:opt].sub('not_', '').sub('?', text)
|
204
212
|
]
|
205
213
|
elsif value[:opt] == 'BETWEEN'
|
206
214
|
['(%<search_sql>s BETWEEN ? AND ?)', value[:from], value[:to]]
|
@@ -441,7 +449,8 @@ module ActiveScaffold
|
|
441
449
|
|
442
450
|
def condition_for_record_select_type(column, value, like_pattern = nil)
|
443
451
|
if value.is_a?(Array)
|
444
|
-
|
452
|
+
value = value.select(&:present?)
|
453
|
+
['%<search_sql>s IN (?)', value] if value.present?
|
445
454
|
else
|
446
455
|
['%<search_sql>s = ?', value]
|
447
456
|
end
|
@@ -609,7 +618,8 @@ module ActiveScaffold
|
|
609
618
|
options[:page] ||= 1
|
610
619
|
|
611
620
|
find_options = finder_options(options)
|
612
|
-
query = beginning_of_chain
|
621
|
+
query = beginning_of_chain
|
622
|
+
query = query.where(nil) if active_scaffold_config.active_record? # where(nil) is needed because we need a relation
|
613
623
|
|
614
624
|
# NOTE: we must use :include in the count query, because some conditions may reference other tables
|
615
625
|
if options[:pagination] && options[:pagination] != :infinite
|
data/lib/active_scaffold.rb
CHANGED
@@ -66,6 +66,12 @@ module ActiveScaffold
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
+
mattr_writer :jquery_ui_loaded, instance_writer: false
|
70
|
+
def self.jquery_ui_included?
|
71
|
+
return true if @@jquery_ui_loaded
|
72
|
+
Jquery::Rails.const_defined?('JQUERY_UI_VERSION') || Jquery.const_defined?('Ui') if Object.const_defined?('Jquery')
|
73
|
+
end
|
74
|
+
|
69
75
|
mattr_writer :js_config, instance_writer: false
|
70
76
|
def self.js_config
|
71
77
|
@@js_config ||= {:scroll_on_close => :checkInViewport}
|
@@ -60,7 +60,8 @@
|
|
60
60
|
// the `Cowboy` namespace. Usage will be exactly the same, but instead of
|
61
61
|
// $.method() or jQuery.method(), you'll need to use Cowboy.method().
|
62
62
|
|
63
|
-
(function(
|
63
|
+
(function() {
|
64
|
+
var jqueryThrottleDebounceInit = function($, undefined) {
|
64
65
|
'$:nomunge'; // Used by YUI compressor.
|
65
66
|
|
66
67
|
// Since jQuery really isn't required for this plugin, use `jQuery` as the
|
@@ -248,5 +249,11 @@
|
|
248
249
|
? jq_throttle( delay, at_begin, false )
|
249
250
|
: jq_throttle( delay, callback, at_begin !== false );
|
250
251
|
};
|
251
|
-
|
252
|
-
|
252
|
+
};
|
253
|
+
|
254
|
+
if (window.jQuery) {
|
255
|
+
jqueryThrottleDebounceInit(jQuery);
|
256
|
+
} else if (typeof exports === 'object' && typeof module === 'object') {
|
257
|
+
module.exports = jqueryThrottleDebounceInit;
|
258
|
+
}
|
259
|
+
})();
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_scaffold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.7.
|
4
|
+
version: 3.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Many, see README
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|