active_scaffold 3.6.0.pre → 3.6.0.rc1
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 +4 -4
- data/{CHANGELOG → CHANGELOG.rdoc} +39 -0
- data/app/assets/javascripts/active_scaffold.js.erb +0 -1
- data/app/assets/javascripts/jquery/active_scaffold.js +35 -4
- data/app/assets/stylesheets/active_scaffold_colors.scss +1 -1
- data/app/assets/stylesheets/active_scaffold_layout.css +52 -29
- data/app/views/active_scaffold_overrides/_list_header.html.erb +5 -7
- data/app/views/active_scaffold_overrides/_list_record.html.erb +4 -5
- data/app/views/active_scaffold_overrides/_list_with_header.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +4 -0
- data/config/locales/de.yml +2 -1
- data/config/locales/en.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/config/locales/fr.yml +2 -1
- data/config/locales/hu.yml +1 -0
- data/config/locales/ja.yml +1 -0
- data/config/locales/ru.yml +1 -0
- data/lib/active_scaffold.rb +8 -3
- data/lib/active_scaffold/actions/common_search.rb +11 -8
- data/lib/active_scaffold/actions/core.rb +79 -51
- data/lib/active_scaffold/actions/create.rb +27 -27
- data/lib/active_scaffold/actions/delete.rb +1 -1
- data/lib/active_scaffold/actions/field_search.rb +52 -42
- data/lib/active_scaffold/actions/list.rb +106 -23
- data/lib/active_scaffold/actions/nested.rb +59 -42
- data/lib/active_scaffold/actions/show.rb +3 -3
- data/lib/active_scaffold/actions/subform.rb +9 -16
- data/lib/active_scaffold/actions/update.rb +95 -77
- data/lib/active_scaffold/attribute_params.rb +93 -68
- data/lib/active_scaffold/bridges/active_storage.rb +6 -0
- data/lib/active_scaffold/bridges/active_storage/active_storage_bridge.rb +33 -0
- data/lib/active_scaffold/bridges/active_storage/active_storage_helpers.rb +54 -0
- data/lib/active_scaffold/bridges/active_storage/form_ui.rb +22 -0
- data/lib/active_scaffold/bridges/active_storage/list_ui.rb +36 -0
- data/lib/active_scaffold/bridges/bitfields.rb +1 -0
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +12 -15
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +6 -0
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +2 -2
- data/lib/active_scaffold/bridges/date_picker/helper.rb +46 -41
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -2
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +3 -3
- data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +3 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +2 -2
- data/lib/active_scaffold/bridges/record_select/helpers.rb +3 -7
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +19 -18
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -1
- data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +20 -3
- data/lib/active_scaffold/config/base.rb +58 -34
- data/lib/active_scaffold/config/core.rb +31 -12
- data/lib/active_scaffold/config/delete.rb +12 -1
- data/lib/active_scaffold/config/list.rb +17 -7
- data/lib/active_scaffold/config/mark.rb +1 -1
- data/lib/active_scaffold/configurable.rb +5 -3
- data/lib/active_scaffold/constraints.rb +21 -19
- data/lib/active_scaffold/core.rb +35 -26
- data/lib/active_scaffold/data_structures/action_columns.rb +1 -1
- data/lib/active_scaffold/data_structures/action_link.rb +34 -16
- data/lib/active_scaffold/data_structures/action_links.rb +9 -11
- data/lib/active_scaffold/data_structures/association/abstract.rb +35 -13
- data/lib/active_scaffold/data_structures/association/active_mongoid.rb +2 -6
- data/lib/active_scaffold/data_structures/association/active_record.rb +5 -1
- data/lib/active_scaffold/data_structures/association/mongoid.rb +0 -3
- data/lib/active_scaffold/data_structures/column.rb +49 -58
- data/lib/active_scaffold/data_structures/columns.rb +3 -2
- data/lib/active_scaffold/data_structures/nested_info.rb +20 -18
- data/lib/active_scaffold/data_structures/sorting.rb +5 -0
- data/lib/active_scaffold/delayed_setup.rb +16 -6
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +1 -1
- data/lib/active_scaffold/extensions/action_view_rendering.rb +34 -14
- data/lib/active_scaffold/extensions/cow_proxy.rb +50 -2
- data/lib/active_scaffold/extensions/localize.rb +3 -1
- data/lib/active_scaffold/extensions/routing_mapper.rb +2 -2
- data/lib/active_scaffold/extensions/to_label.rb +3 -2
- data/lib/active_scaffold/finder.rb +81 -46
- data/lib/active_scaffold/helpers/action_link_helpers.rb +47 -21
- data/lib/active_scaffold/helpers/association_helpers.rb +13 -11
- data/lib/active_scaffold/helpers/controller_helpers.rb +14 -11
- data/lib/active_scaffold/helpers/form_column_helpers.rb +133 -99
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +1 -1
- data/lib/active_scaffold/helpers/id_helpers.rb +4 -0
- data/lib/active_scaffold/helpers/list_column_helpers.rb +76 -49
- data/lib/active_scaffold/helpers/pagination_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/search_column_helpers.rb +25 -30
- data/lib/active_scaffold/helpers/show_column_helpers.rb +3 -5
- data/lib/active_scaffold/helpers/view_helpers.rb +31 -22
- data/lib/active_scaffold/orm_checks.rb +2 -2
- data/lib/active_scaffold/paginator.rb +1 -3
- data/lib/active_scaffold/registry.rb +11 -0
- data/lib/active_scaffold/responds_to_parent.rb +6 -5
- data/lib/active_scaffold/tableless.rb +6 -8
- data/lib/active_scaffold/version.rb +1 -1
- data/shoulda_macros/macros.rb +3 -1
- data/test/bridges/paperclip_test.rb +1 -1
- data/test/company.rb +2 -2
- data/test/data_structures/action_columns_test.rb +2 -2
- data/test/data_structures/column_test.rb +3 -6
- data/test/data_structures/columns_test.rb +2 -2
- data/test/extensions/active_record_test.rb +4 -4
- data/test/extensions/routing_mapper_test.rb +2 -2
- data/test/helpers/list_column_helpers_test.rb +3 -1
- data/test/misc/active_record_permissions_test.rb +2 -2
- data/test/misc/attribute_params_test.rb +4 -0
- data/test/misc/configurable_test.rb +10 -10
- data/test/misc/convert_numbers_format_test.rb +4 -0
- data/test/mock_app/app/assets/config/manifest.js +0 -0
- data/test/mock_app/app/controllers/cars_controller.rb +1 -0
- data/test/mock_app/app/controllers/people_controller.rb +3 -1
- data/test/mock_app/config/application.rb +1 -0
- data/test/mock_app/config/routes.rb +4 -1
- data/test/mock_app/db/schema.rb +2 -0
- data/test/performance/list_cars_performance_test.rb +34 -0
- data/test/performance/list_people_performance_test.rb +31 -0
- data/test/performance_test_help.rb +3 -0
- data/test/test_helper.rb +2 -1
- metadata +22 -12
- data/app/assets/javascripts/prototype/rico_corner.js +0 -370
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +0 -5
@@ -24,14 +24,10 @@ class ActiveScaffold::Bridges::RecordSelect
|
|
24
24
|
|
25
25
|
def active_scaffold_record_select(record, column, options, value, multiple)
|
26
26
|
unless column.association
|
27
|
-
raise ArgumentError, "record_select can only work against associations (and #{column.name} is not).
|
27
|
+
raise ArgumentError, "record_select can only work against associations (and #{column.name} is not). "\
|
28
|
+
'A common mistake is to specify the foreign key field (like :user_id), instead of the association (:user).'
|
28
29
|
end
|
29
|
-
klass =
|
30
|
-
if column.association.polymorphic?
|
31
|
-
record.send(column.association.foreign_type).constantize rescue nil
|
32
|
-
else
|
33
|
-
column.association.klass
|
34
|
-
end
|
30
|
+
klass = column.association.klass(record)
|
35
31
|
return content_tag :span, '', :class => options[:class] unless klass
|
36
32
|
|
37
33
|
remote_controller = active_scaffold_controller_for(klass).controller_path
|
@@ -12,7 +12,7 @@ module ActiveScaffold
|
|
12
12
|
tags << active_scaffold_search_date_bridge_trend_tag(column, options, current_search)
|
13
13
|
tags << active_scaffold_search_date_bridge_numeric_tag(column, options, current_search)
|
14
14
|
tags << active_scaffold_search_date_bridge_range_tag(column, options, current_search)
|
15
|
-
safe_join tags, ' '.html_safe
|
15
|
+
safe_join tags, ' '.html_safe # rubocop:disable Rails/OutputSafety
|
16
16
|
end
|
17
17
|
|
18
18
|
def active_scaffold_search_date_bridge_comparator_options(column)
|
@@ -21,17 +21,18 @@ module ActiveScaffold
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def active_scaffold_search_date_bridge_comparator_tag(column, options, current_search)
|
24
|
-
|
24
|
+
choices = options_for_select(active_scaffold_search_date_bridge_comparator_options(column), current_search['opt'])
|
25
|
+
select_tag("#{options[:name]}[opt]", choices, :id => "#{options[:id]}_opt", :class => 'as_search_range_option as_search_date_time_option')
|
25
26
|
end
|
26
27
|
|
27
28
|
def active_scaffold_search_date_bridge_numeric_tag(column, options, current_search)
|
28
|
-
numeric_controls =
|
29
|
-
''
|
30
|
-
active_scaffold_search_date_bridge_calendar_control(column, options, current_search, '
|
31
|
-
content_tag(:span, (' - ' + active_scaffold_search_date_bridge_calendar_control(column, options, current_search, 'to')).html_safe,
|
29
|
+
numeric_controls = [
|
30
|
+
active_scaffold_search_date_bridge_calendar_control(column, options, current_search, 'from'),
|
31
|
+
content_tag(:span, safe_join([' - ', active_scaffold_search_date_bridge_calendar_control(column, options, current_search, 'to')]),
|
32
32
|
:id => "#{options[:id]}_between", :class => 'as_search_range_between',
|
33
33
|
:style => current_search['opt'] == 'BETWEEN' ? nil : 'display: none')
|
34
|
-
|
34
|
+
]
|
35
|
+
content_tag('span', safe_join(numeric_controls),
|
35
36
|
:id => "#{options[:id]}_numeric", :class => 'search-date-numeric',
|
36
37
|
:style => ActiveScaffold::Finder::NUMERIC_COMPARATORS.include?(current_search['opt']) ? nil : 'display: none')
|
37
38
|
end
|
@@ -44,12 +45,13 @@ module ActiveScaffold
|
|
44
45
|
end
|
45
46
|
|
46
47
|
def active_scaffold_date_bridge_trend_tag(column, options, trend_options)
|
47
|
-
trend_controls =
|
48
|
-
text_field_tag("#{options[:name]}[number]", trend_options[:number_value], :class => 'text-input', :size => 10, :autocomplete => 'off')
|
48
|
+
trend_controls = [
|
49
|
+
text_field_tag("#{options[:name]}[number]", trend_options[:number_value], :class => 'text-input', :size => 10, :autocomplete => 'off'),
|
49
50
|
select_tag("#{options[:name]}[unit]",
|
50
51
|
options_for_select(active_scaffold_search_date_bridge_trend_units(column), trend_options[:unit_value]),
|
51
52
|
:class => 'text-input')
|
52
|
-
|
53
|
+
]
|
54
|
+
content_tag('span', safe_join(trend_controls, ' '),
|
53
55
|
:id => "#{options[:id]}_trend", :class => 'search-date-trend',
|
54
56
|
:style => trend_options[:show] ? nil : 'display: none')
|
55
57
|
end
|
@@ -61,10 +63,11 @@ module ActiveScaffold
|
|
61
63
|
end
|
62
64
|
|
63
65
|
def active_scaffold_search_date_bridge_range_tag(column, options, current_search)
|
66
|
+
values = ActiveScaffold::Finder::DATE_RANGES.collect { |range| [as_(range.downcase.to_sym), range] }
|
64
67
|
range_controls = select_tag("#{options[:name]}[range]",
|
65
|
-
options_for_select(
|
68
|
+
options_for_select(values, current_search['range']),
|
66
69
|
:class => 'text-input', :id => nil)
|
67
|
-
content_tag('span', range_controls
|
70
|
+
content_tag('span', range_controls,
|
68
71
|
:id => "#{options[:id]}_range", :class => 'search-date-range',
|
69
72
|
:style => ('display: none' unless current_search['opt'] == 'RANGE'))
|
70
73
|
end
|
@@ -80,7 +83,7 @@ module ActiveScaffold
|
|
80
83
|
when 'RANGE'
|
81
84
|
range_type, range = value['range'].downcase.split('_')
|
82
85
|
format = active_scaffold_human_condition_date_bridge_range_format(range_type, range)
|
83
|
-
from,
|
86
|
+
from, = controller.class.date_bridge_from_to(column, value)
|
84
87
|
"#{column.active_record_class.human_attribute_name(column.name)} = #{as_(value['range'].downcase).downcase} (#{I18n.l(from, :format => format)})"
|
85
88
|
when 'PAST', 'FUTURE'
|
86
89
|
from, to = controller.class.date_bridge_from_to(column, value)
|
@@ -118,12 +121,10 @@ module ActiveScaffold
|
|
118
121
|
|
119
122
|
if column.search_sql.is_a? Proc
|
120
123
|
column.search_sql.call(from_value, to_value, operator)
|
124
|
+
elsif operator.nil?
|
125
|
+
['%<search_sql>s BETWEEN ? AND ?', from_value.to_s(:db), to_value.to_s(:db)] unless from_value.nil? || to_value.nil?
|
121
126
|
else
|
122
|
-
|
123
|
-
['%<search_sql>s BETWEEN ? AND ?', from_value.to_s(:db), to_value.to_s(:db)] unless from_value.nil? || to_value.nil?
|
124
|
-
else
|
125
|
-
["%<search_sql>s #{value['opt']} ?", from_value.to_s(:db)] unless from_value.nil?
|
126
|
-
end
|
127
|
+
["%<search_sql>s #{value['opt']} ?", from_value.to_s(:db)] unless from_value.nil?
|
127
128
|
end
|
128
129
|
end
|
129
130
|
|
@@ -24,7 +24,9 @@ class ActiveScaffold::Bridges::TinyMce
|
|
24
24
|
|
25
25
|
html = []
|
26
26
|
html << send(override_input(:textarea), column, options)
|
27
|
-
|
27
|
+
if ActiveScaffold.js_framework == :prototype && (request.xhr? || params[:iframe])
|
28
|
+
html << javascript_tag("tinyMCE.settings = #{settings.to_json}; tinyMCE.execCommand('mceAddEditor', false, '#{options[:id]}');")
|
29
|
+
end
|
28
30
|
safe_join html
|
29
31
|
end
|
30
32
|
|
@@ -32,15 +32,32 @@ module ActiveScaffold::Bridges
|
|
32
32
|
state_options
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
unless const_defined?('USASTATES')
|
36
|
+
USASTATES = [
|
37
|
+
%w[Alabama AL], %w[Alaska AK], %w[Arizona AZ], %w[Arkansas AR], %w[California CA], %w[Colorado CO],
|
38
|
+
%w[Connecticut CT], %w[Delaware DE], ['District of Columbia', 'DC'], %w[Florida FL], %w[Georgia GA],
|
39
|
+
%w[Hawaii HI], %w[Idaho ID], %w[Illinois IL], %w[Indiana IN], %w[Iowa IA], %w[Kansas KS], %w[Kentucky KY],
|
40
|
+
%w[Louisiana LA], %w[Maine ME], %w[Maryland MD], %w[Massachusetts MA], %w[Michigan MI], %w[Minnesota MN],
|
41
|
+
%w[Mississippi MS], %w[Missouri MO], %w[Montana MT], %w[Nebraska NE], %w[Nevada NV],
|
42
|
+
['New Hampshire', 'NH'], ['New Jersey', 'NJ'], ['New Mexico', 'NM'], ['New York', 'NY'],
|
43
|
+
['North Carolina', 'NC'], ['North Dakota', 'ND'], %w[Ohio OH], %w[Oklahoma OK], %w[Oregon OR],
|
44
|
+
%w[Pennsylvania PA], ['Rhode Island', 'RI'], ['South Carolina', 'SC'], ['South Dakota', 'SD'],
|
45
|
+
%w[Tennessee TN], %w[Texas TX], %w[Utah UT], %w[Vermont VT], %w[Virginia VA], %w[Washington WA],
|
46
|
+
%w[Wisconsin WI], ['West Virginia', 'WV'], %w[Wyoming WY]
|
47
|
+
].freeze
|
48
|
+
end
|
36
49
|
end
|
37
50
|
|
38
51
|
module InstanceTagMethods
|
39
52
|
def to_usa_state_select_tag(priority_states, options, html_options)
|
40
53
|
html_options = html_options.stringify_keys
|
41
54
|
add_default_name_and_id(html_options)
|
42
|
-
|
43
|
-
|
55
|
+
selected_value =
|
56
|
+
if options.key?(:selected)
|
57
|
+
options[:selected]
|
58
|
+
else
|
59
|
+
method(:value).parameters.any? ? value(object) : value
|
60
|
+
end
|
44
61
|
content_tag('select', add_options(usa_state_options_for_select(selected_value, priority_states), options, selected_value), html_options)
|
45
62
|
end
|
46
63
|
end
|
@@ -10,7 +10,13 @@ module ActiveScaffold::Config
|
|
10
10
|
|
11
11
|
# start with the ActionLink defined globally
|
12
12
|
@link = self.class.link.clone if self.class.respond_to?(:link) && self.class.link
|
13
|
+
setup_user_setting_key
|
13
14
|
end
|
15
|
+
|
16
|
+
def setup_user_setting_key
|
17
|
+
@user_settings_key = :"#{model_id}_#{self.class.name.underscore}"
|
18
|
+
end
|
19
|
+
|
14
20
|
attr_reader :core
|
15
21
|
|
16
22
|
def self.inherited(subclass)
|
@@ -42,9 +48,7 @@ module ActiveScaffold::Config
|
|
42
48
|
(core || self).model_id
|
43
49
|
end
|
44
50
|
|
45
|
-
|
46
|
-
:"#{model_id}_#{self.class.name.underscore}"
|
47
|
-
end
|
51
|
+
attr_reader :user_settings_key
|
48
52
|
|
49
53
|
# the user property gets set to the instantiation of the local UserSettings class during the automatic instantiation of this class.
|
50
54
|
def user
|
@@ -116,7 +120,7 @@ module ActiveScaffold::Config
|
|
116
120
|
|
117
121
|
def []=(key, value)
|
118
122
|
@storage[@action] ||= {}
|
119
|
-
if value
|
123
|
+
if value.present?
|
120
124
|
@storage[@action][key.to_s] = value
|
121
125
|
else
|
122
126
|
@storage[@action].delete key.to_s
|
@@ -129,11 +133,23 @@ module ActiveScaffold::Config
|
|
129
133
|
end
|
130
134
|
|
131
135
|
def method_missing(name, *args)
|
132
|
-
|
136
|
+
proxy_to_conf?(name, true) ? @conf.send(name, *args) : super
|
133
137
|
end
|
134
138
|
|
135
139
|
def respond_to_missing?(name, include_all = false)
|
136
|
-
|
140
|
+
proxy_to_conf?(name, include_all) || super
|
141
|
+
end
|
142
|
+
|
143
|
+
def proxy_to_conf?(name, include_all)
|
144
|
+
name !~ /=$/ && @conf.respond_to?(name, include_all)
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
def proxy_columns(columns)
|
150
|
+
proxy = ::CowProxy.wrap(columns)
|
151
|
+
proxy.action = self
|
152
|
+
proxy
|
137
153
|
end
|
138
154
|
end
|
139
155
|
|
@@ -145,52 +161,60 @@ module ActiveScaffold::Config
|
|
145
161
|
|
146
162
|
class_attribute :columns_collections
|
147
163
|
|
164
|
+
def self.columns_writer(name)
|
165
|
+
var = "@#{name}"
|
166
|
+
define_method "#{name}=" do |val|
|
167
|
+
if instance_variable_defined?(var)
|
168
|
+
instance_variable_get(var).set_values(*val)
|
169
|
+
instance_variable_get(var)
|
170
|
+
else
|
171
|
+
instance_variable_set(var, build_action_columns(val))
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def self.columns_reader(name, options, &block)
|
177
|
+
var = "@#{name}"
|
178
|
+
define_method name do
|
179
|
+
unless instance_variable_defined?(var) # lazy evaluation
|
180
|
+
action, columns = options[:copy] if options[:copy]
|
181
|
+
if action && @core.actions.include?(action)
|
182
|
+
action_columns = @core.send(action).send(columns || :columns).clone
|
183
|
+
action_columns.action = self
|
184
|
+
instance_variable_set(var, action_columns)
|
185
|
+
else
|
186
|
+
send("#{name}=", @core.columns._inheritable)
|
187
|
+
end
|
188
|
+
instance_exec(&block) if block
|
189
|
+
end
|
190
|
+
instance_variable_get(var)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
148
194
|
def self.columns_accessor(*names, &block)
|
149
195
|
options = names.extract_options!
|
150
196
|
self.columns_collections = ((columns_collections || []) + names).uniq
|
151
197
|
names.each do |name|
|
152
|
-
|
153
|
-
|
154
|
-
if instance_variable_defined?(var)
|
155
|
-
instance_variable_get(var).set_values(*val)
|
156
|
-
instance_variable_get(var)
|
157
|
-
else
|
158
|
-
instance_variable_set(var, build_action_columns(val))
|
159
|
-
end
|
160
|
-
end
|
198
|
+
columns_writer name
|
199
|
+
columns_reader name, options, &block unless method_defined? name
|
161
200
|
|
162
201
|
if self::UserSettings == ActiveScaffold::Config::Base::UserSettings
|
163
202
|
const_set 'UserSettings', Class.new(ActiveScaffold::Config::Base::UserSettings)
|
164
203
|
end
|
165
204
|
|
205
|
+
var = "@#{name}"
|
166
206
|
self::UserSettings.class_eval do
|
167
207
|
define_method "#{name}=" do |val|
|
168
|
-
instance_variable_set var,
|
208
|
+
instance_variable_set var, proxy_columns(build_action_columns(val))
|
169
209
|
end
|
170
210
|
define_method name do
|
171
211
|
instance_variable_get(var) ||
|
172
|
-
instance_variable_set(var,
|
212
|
+
instance_variable_set(var, proxy_columns(@conf.send(name)))
|
173
213
|
end
|
174
214
|
end
|
175
|
-
|
176
|
-
return if method_defined? name
|
177
|
-
define_method name do
|
178
|
-
unless instance_variable_defined?(var) # lazy evaluation
|
179
|
-
action, columns = options[:copy] if options[:copy]
|
180
|
-
if action && @core.actions.include?(action)
|
181
|
-
action_columns = @core.send(action).send(columns || :columns).clone
|
182
|
-
action_columns.action = self
|
183
|
-
instance_variable_set(var, action_columns)
|
184
|
-
else
|
185
|
-
send("#{name}=", @core.columns._inheritable)
|
186
|
-
end
|
187
|
-
instance_exec(&block) if block
|
188
|
-
end
|
189
|
-
instance_variable_get(var)
|
190
|
-
end
|
191
215
|
end
|
192
216
|
end
|
193
217
|
|
194
|
-
private_class_method :columns_accessor
|
218
|
+
private_class_method :columns_accessor, :columns_reader, :columns_writer
|
195
219
|
end
|
196
220
|
end
|
@@ -88,6 +88,10 @@ module ActiveScaffold::Config
|
|
88
88
|
cattr_accessor :highlight_messages, instance_accessor: false
|
89
89
|
@@highlight_messages = nil
|
90
90
|
|
91
|
+
# method names or procs to be called after all configure blocks
|
92
|
+
cattr_reader :after_config_callbacks, instance_accessor: false
|
93
|
+
@@after_config_callbacks = [:_configure_sti]
|
94
|
+
|
91
95
|
def self.freeze
|
92
96
|
super
|
93
97
|
security.freeze
|
@@ -160,6 +164,7 @@ module ActiveScaffold::Config
|
|
160
164
|
def initialize(model_id)
|
161
165
|
# model_id is the only absolutely required configuration value. it is also not publicly accessible.
|
162
166
|
@model_id = model_id
|
167
|
+
setup_user_setting_key
|
163
168
|
|
164
169
|
# inherit the actions list directly from the global level
|
165
170
|
@actions = self.class.actions.clone
|
@@ -196,9 +201,6 @@ module ActiveScaffold::Config
|
|
196
201
|
# To be called before freezing
|
197
202
|
def _cache_lazy_values
|
198
203
|
action_links.each(&:name_to_cache) if cache_action_link_urls
|
199
|
-
# ensure member and collection groups are cached, if no custom link has been added
|
200
|
-
action_links.member
|
201
|
-
action_links.collection
|
202
204
|
columns.select(&:sortable?).each(&:sort)
|
203
205
|
columns.select(&:searchable?).each(&:search_sql)
|
204
206
|
actions.each do |action_name|
|
@@ -209,6 +211,7 @@ module ActiveScaffold::Config
|
|
209
211
|
|
210
212
|
# To be called after your finished configuration
|
211
213
|
def _configure_sti
|
214
|
+
return if sti_children.nil?
|
212
215
|
column = model.inheritance_column
|
213
216
|
if sti_create_links
|
214
217
|
columns[column].form_ui ||= :hidden
|
@@ -235,7 +238,7 @@ module ActiveScaffold::Config
|
|
235
238
|
end
|
236
239
|
|
237
240
|
def respond_to_missing?(name, include_all = false)
|
238
|
-
self.class.config_class?(name) && @actions.include?(
|
241
|
+
self.class.config_class?(name) && @actions.include?(name.to_sym) || super
|
239
242
|
end
|
240
243
|
|
241
244
|
def [](action_name)
|
@@ -243,12 +246,11 @@ module ActiveScaffold::Config
|
|
243
246
|
return unless klass
|
244
247
|
|
245
248
|
underscored_name = action_name.to_s.underscore.to_sym
|
246
|
-
|
247
|
-
@action_configs ||= {}
|
248
|
-
@action_configs[underscored_name] ||= klass.new(self)
|
249
|
-
else
|
249
|
+
unless @actions.include? underscored_name
|
250
250
|
raise "#{action_name.to_s.camelcase} is not enabled. Please enable it or remove any references in your configuration (e.g. config.#{underscored_name}.columns = [...])."
|
251
251
|
end
|
252
|
+
@action_configs ||= {}
|
253
|
+
@action_configs[underscored_name] ||= klass.new(self)
|
252
254
|
end
|
253
255
|
|
254
256
|
def []=(action_name, action_config)
|
@@ -258,8 +260,7 @@ module ActiveScaffold::Config
|
|
258
260
|
private :[]=
|
259
261
|
|
260
262
|
def self.method_missing(name, *args)
|
261
|
-
|
262
|
-
klass || super
|
263
|
+
config_class(name) || super
|
263
264
|
end
|
264
265
|
|
265
266
|
def self.config_class(name)
|
@@ -349,21 +350,39 @@ module ActiveScaffold::Config
|
|
349
350
|
def action_links
|
350
351
|
@action_links ||= CowProxy.wrap(@conf.action_links)
|
351
352
|
end
|
353
|
+
|
354
|
+
def model
|
355
|
+
@conf.model # for performance, called many times, so we avoid method_missing
|
356
|
+
end
|
357
|
+
|
358
|
+
def actions
|
359
|
+
@conf.actions # for performance, called many times, so we avoid method_missing
|
360
|
+
end
|
352
361
|
end
|
353
362
|
|
354
363
|
class UserColumns
|
364
|
+
include Enumerable
|
365
|
+
|
355
366
|
def initialize(columns)
|
356
367
|
@global_columns = columns
|
357
368
|
@columns = {}
|
358
369
|
end
|
359
370
|
|
360
371
|
def [](name)
|
372
|
+
return nil unless @global_columns[name]
|
361
373
|
@columns[name.to_sym] ||= CowProxy.wrap @global_columns[name]
|
362
374
|
end
|
363
375
|
|
364
|
-
def
|
376
|
+
def each
|
377
|
+
return enum_for(:each) unless block_given?
|
378
|
+
@global_columns.each do |col|
|
379
|
+
yield self[col.name]
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
def method_missing(name, *args, &block)
|
365
384
|
if @global_columns.respond_to?(name, true)
|
366
|
-
@global_columns.send(name, *args)
|
385
|
+
@global_columns.send(name, *args, &block)
|
367
386
|
else
|
368
387
|
super
|
369
388
|
end
|
@@ -12,7 +12,18 @@ module ActiveScaffold::Config
|
|
12
12
|
|
13
13
|
# the ActionLink for this action
|
14
14
|
cattr_accessor :link, instance_accessor: false
|
15
|
-
@@link = ActiveScaffold::DataStructures::ActionLink.new(
|
15
|
+
@@link = ActiveScaffold::DataStructures::ActionLink.new(
|
16
|
+
'destroy',
|
17
|
+
:label => :delete,
|
18
|
+
:type => :member,
|
19
|
+
:method => :delete,
|
20
|
+
:crud_type => :delete,
|
21
|
+
:confirm => :are_you_sure_to_delete,
|
22
|
+
:position => false,
|
23
|
+
:parameters => {:destroy_action => true},
|
24
|
+
:security_method => :delete_authorized?,
|
25
|
+
:ignore_method => :delete_ignore?
|
26
|
+
)
|
16
27
|
|
17
28
|
# whether we should refresh list after destroy or not
|
18
29
|
cattr_accessor :refresh_list, instance_accessor: false
|
@@ -186,8 +186,8 @@ module ActiveScaffold::Config
|
|
186
186
|
def search_partial
|
187
187
|
if @always_show_search == true
|
188
188
|
auto_search_partial
|
189
|
-
|
190
|
-
@always_show_search.to_s
|
189
|
+
elsif @core.actions.include? @always_show_search
|
190
|
+
@always_show_search.to_s
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
@@ -219,11 +219,12 @@ module ActiveScaffold::Config
|
|
219
219
|
# order clause will be used for ETag when calculate_etag is disabled, so query for records can be avoided
|
220
220
|
attr_accessor :calculate_etag
|
221
221
|
|
222
|
-
|
222
|
+
# don't inherit, defined with columns_accessor, class_eval would complain about block too long
|
223
|
+
class UserSettings
|
223
224
|
user_attr :page_links_inner_window, :page_links_outer_window, :refresh_with_header, :empty_field_text,
|
224
225
|
:association_join_text, :messages_above_header, :wrap_tag, :auto_select_columns, :calculate_etag,
|
225
226
|
:no_entries_message, :filtered_message, :show_search_reset, :always_show_create, :always_show_search,
|
226
|
-
:hide_nested_column
|
227
|
+
:hide_nested_column, :pagination, :auto_pagination
|
227
228
|
|
228
229
|
def initialize(conf, storage, params)
|
229
230
|
super(conf, storage, params, :list)
|
@@ -261,12 +262,12 @@ module ActiveScaffold::Config
|
|
261
262
|
attr_reader :nested_default_sorting
|
262
263
|
|
263
264
|
def nested_default_sorting=(options)
|
264
|
-
@nested_default_sorting ||=
|
265
|
+
@nested_default_sorting ||= sorting_dup
|
265
266
|
@nested_default_sorting.set_nested_sorting(options[:table_name], options[:default_sorting])
|
266
267
|
end
|
267
268
|
|
268
269
|
def default_sorting
|
269
|
-
nested_default_sorting.nil? || @sorting.present? ?
|
270
|
+
nested_default_sorting.nil? || @sorting.present? ? sorting_dup : nested_default_sorting
|
270
271
|
end
|
271
272
|
|
272
273
|
# TODO: programatically set sorting, for per-request configuration, priority @params, then @sort
|
@@ -286,7 +287,7 @@ module ActiveScaffold::Config
|
|
286
287
|
self['sort'] = nil if @params['sort_direction'] == 'reset'
|
287
288
|
|
288
289
|
if self['sort'] && @conf.core.columns[self['sort'][0]]
|
289
|
-
sorting =
|
290
|
+
sorting = sorting_dup
|
290
291
|
sorting.set(*self['sort'])
|
291
292
|
@_sorting = sorting
|
292
293
|
else
|
@@ -303,6 +304,15 @@ module ActiveScaffold::Config
|
|
303
304
|
def count_includes
|
304
305
|
@conf.count_includes
|
305
306
|
end
|
307
|
+
|
308
|
+
protected
|
309
|
+
|
310
|
+
def sorting_dup
|
311
|
+
sorting = @conf.sorting.dup
|
312
|
+
# access to config instance columns instead of config class columns, in case columns are changed in this request
|
313
|
+
sorting.instance_variable_set :@columns, core.columns
|
314
|
+
sorting
|
315
|
+
end
|
306
316
|
end
|
307
317
|
end
|
308
318
|
end
|