active_scaffold 3.5.5 → 3.6.1
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} +75 -0
- data/README.md +21 -10
- data/app/assets/javascripts/active_scaffold.js.erb +0 -1
- data/app/assets/javascripts/jquery/active_scaffold.js +98 -7
- 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/_base_form.html.erb +2 -2
- data/app/views/active_scaffold_overrides/_form.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_form_association.html.erb +2 -1
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +3 -2
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +26 -10
- data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +4 -4
- data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +2 -1
- data/app/views/active_scaffold_overrides/_list.html.erb +2 -1
- data/app/views/active_scaffold_overrides/_list_header.html.erb +5 -7
- data/app/views/active_scaffold_overrides/_list_messages.html.erb +1 -0
- 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/_messages.html.erb +1 -0
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +4 -0
- data/app/views/active_scaffold_overrides/_render_field.js.erb +2 -1
- data/app/views/active_scaffold_overrides/_show_association_horizontal.html.erb +2 -1
- data/app/views/active_scaffold_overrides/_show_columns.html.erb +2 -2
- data/app/views/active_scaffold_overrides/_show_horizontal_record.html.erb +4 -4
- data/app/views/active_scaffold_overrides/_update_calculations.js.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_column.js.erb +2 -2
- data/app/views/active_scaffold_overrides/_vertical_subform.html.erb +2 -2
- data/app/views/active_scaffold_overrides/action_confirmation.html.erb +2 -2
- data/app/views/active_scaffold_overrides/delete.html.erb +2 -2
- data/app/views/active_scaffold_overrides/on_action_update.js.erb +16 -6
- data/app/views/active_scaffold_overrides/on_update.js.erb +1 -1
- data/app/views/active_scaffold_overrides/row.js.erb +1 -1
- data/app/views/active_scaffold_overrides/update_column.js.erb +2 -2
- 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 +19 -16
- data/lib/active_scaffold/actions/common_search.rb +11 -8
- data/lib/active_scaffold/actions/core.rb +91 -70
- data/lib/active_scaffold/actions/create.rb +28 -28
- data/lib/active_scaffold/actions/delete.rb +3 -3
- data/lib/active_scaffold/actions/field_search.rb +53 -43
- data/lib/active_scaffold/actions/list.rb +111 -27
- data/lib/active_scaffold/actions/nested.rb +65 -48
- data/lib/active_scaffold/actions/search.rb +1 -1
- data/lib/active_scaffold/actions/show.rb +4 -4
- data/lib/active_scaffold/actions/subform.rb +23 -22
- data/lib/active_scaffold/actions/update.rb +96 -77
- data/lib/active_scaffold/active_record_permissions.rb +2 -11
- data/lib/active_scaffold/attribute_params.rb +102 -94
- data/lib/active_scaffold/bridges.rb +8 -8
- data/lib/active_scaffold/bridges/active_storage.rb +6 -0
- data/lib/active_scaffold/bridges/active_storage/active_storage_bridge.rb +34 -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 +2 -1
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +12 -15
- data/lib/active_scaffold/bridges/bitfields/list_ui.rb +19 -0
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +3 -12
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +2 -2
- data/lib/active_scaffold/bridges/chosen/helpers.rb +7 -6
- data/lib/active_scaffold/bridges/date_picker/ext.rb +0 -13
- data/lib/active_scaffold/bridges/date_picker/helper.rb +49 -44
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +3 -3
- 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 +10 -7
- data/lib/active_scaffold/bridges/paper_trail.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/actions.rb +3 -1
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +2 -2
- data/lib/active_scaffold/bridges/record_select/helpers.rb +15 -17
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +20 -19
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -1
- data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +21 -4
- data/lib/active_scaffold/config/base.rb +133 -41
- data/lib/active_scaffold/config/core.rb +146 -18
- data/lib/active_scaffold/config/delete.rb +14 -1
- data/lib/active_scaffold/config/field_search.rb +7 -1
- data/lib/active_scaffold/config/form.rb +10 -1
- data/lib/active_scaffold/config/list.rb +39 -13
- data/lib/active_scaffold/config/mark.rb +4 -2
- data/lib/active_scaffold/config/nested.rb +16 -17
- data/lib/active_scaffold/config/search.rb +9 -0
- data/lib/active_scaffold/config/show.rb +4 -0
- data/lib/active_scaffold/config/update.rb +4 -0
- data/lib/active_scaffold/configurable.rb +14 -7
- data/lib/active_scaffold/constraints.rb +22 -20
- data/lib/active_scaffold/core.rb +67 -28
- data/lib/active_scaffold/data_structures/action_columns.rb +50 -59
- data/lib/active_scaffold/data_structures/action_link.rb +50 -20
- data/lib/active_scaffold/data_structures/action_links.rb +15 -13
- data/lib/active_scaffold/data_structures/association/abstract.rb +38 -15
- data/lib/active_scaffold/data_structures/association/active_mongoid.rb +2 -6
- data/lib/active_scaffold/data_structures/association/active_record.rb +6 -2
- data/lib/active_scaffold/data_structures/association/mongoid.rb +0 -3
- data/lib/active_scaffold/data_structures/column.rb +75 -66
- data/lib/active_scaffold/data_structures/columns.rb +3 -2
- data/lib/active_scaffold/data_structures/nested_info.rb +33 -19
- data/lib/active_scaffold/data_structures/set.rb +8 -0
- data/lib/active_scaffold/data_structures/sorting.rb +10 -2
- data/lib/active_scaffold/delayed_setup.rb +16 -5
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +3 -2
- data/lib/active_scaffold/extensions/action_view_rendering.rb +93 -32
- data/lib/active_scaffold/extensions/cow_proxy.rb +95 -0
- data/lib/active_scaffold/extensions/ice_nine.rb +36 -0
- data/lib/active_scaffold/extensions/left_outer_joins.rb +8 -33
- data/lib/active_scaffold/extensions/localize.rb +3 -1
- data/lib/active_scaffold/extensions/routing_mapper.rb +6 -45
- data/lib/active_scaffold/extensions/to_label.rb +3 -2
- data/lib/active_scaffold/extensions/unsaved_record.rb +2 -4
- data/lib/active_scaffold/finder.rb +110 -77
- data/lib/active_scaffold/helpers/action_link_helpers.rb +62 -36
- data/lib/active_scaffold/helpers/association_helpers.rb +18 -16
- data/lib/active_scaffold/helpers/controller_helpers.rb +34 -10
- data/lib/active_scaffold/helpers/form_column_helpers.rb +196 -124
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +1 -1
- data/lib/active_scaffold/helpers/id_helpers.rb +6 -2
- data/lib/active_scaffold/helpers/list_column_helpers.rb +90 -57
- data/lib/active_scaffold/helpers/pagination_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/search_column_helpers.rb +43 -41
- data/lib/active_scaffold/helpers/show_column_helpers.rb +3 -5
- data/lib/active_scaffold/helpers/view_helpers.rb +39 -36
- data/lib/active_scaffold/marked_model.rb +2 -2
- data/lib/active_scaffold/orm_checks.rb +3 -7
- data/lib/active_scaffold/paginator.rb +7 -7
- data/lib/active_scaffold/registry.rb +33 -0
- data/lib/active_scaffold/responds_to_parent.rb +8 -11
- data/lib/active_scaffold/tableless.rb +83 -67
- data/lib/active_scaffold/version.rb +2 -2
- data/lib/generators/active_scaffold/controller_generator.rb +2 -2
- data/lib/generators/active_scaffold/install_generator.rb +52 -4
- data/lib/generators/active_scaffold/resource_generator.rb +2 -2
- data/shoulda_macros/macros.rb +3 -1
- data/test/bridges/date_picker_test.rb +1 -2
- data/test/bridges/paperclip_test.rb +6 -6
- data/test/class_with_finder.rb +2 -2
- data/test/company.rb +4 -4
- data/test/config/create_test.rb +4 -2
- data/test/config/nested_test.rb +1 -1
- data/test/config/show_test.rb +1 -1
- data/test/config/update_test.rb +7 -6
- data/test/data_structures/action_columns_test.rb +2 -2
- data/test/data_structures/action_links_test.rb +1 -1
- data/test/data_structures/column_test.rb +3 -6
- data/test/data_structures/columns_test.rb +2 -2
- data/test/data_structures/sorting_test.rb +7 -0
- data/test/extensions/action_view_rendering_test.rb +20 -0
- 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 +3 -11
- data/test/misc/attribute_params_test.rb +12 -8
- data/test/misc/calculation_test.rb +1 -1
- data/test/misc/configurable_test.rb +10 -10
- data/test/misc/constraints_test.rb +3 -3
- data/test/misc/convert_numbers_format_test.rb +7 -3
- data/test/misc/lang_test.rb +1 -1
- data/test/misc/parse_datetime_test.rb +3 -4
- data/test/misc/tableless_test.rb +14 -0
- data/test/mock_app/Rakefile +1 -1
- 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 +5 -1
- data/test/mock_app/app/controllers/roles_controller.rb +4 -0
- data/test/mock_app/app/views/active_scaffold_overrides/_form.html.erb +2 -0
- data/test/mock_app/app/views/active_scaffold_overrides/list.html.erb +2 -0
- data/test/mock_app/app/views/people/_first_name_form_column.html.erb +2 -0
- data/test/mock_app/app/views/people/_form.html.erb +2 -0
- data/test/mock_app/app/views/people/list.html.erb +2 -0
- data/test/mock_app/config/application.rb +2 -1
- data/test/mock_app/config/boot.rb +1 -1
- data/test/mock_app/config/environment.rb +2 -2
- 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 +12 -4
- metadata +71 -15
- data/app/assets/javascripts/prototype/rico_corner.js +0 -370
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +0 -7
@@ -60,6 +60,11 @@ module ActiveScaffold::Config
|
|
60
60
|
ActiveScaffold::ActiveRecordPermissions
|
61
61
|
end
|
62
62
|
|
63
|
+
# access to default column configuration.
|
64
|
+
def self.column
|
65
|
+
ActiveScaffold::DataStructures::Column
|
66
|
+
end
|
67
|
+
|
63
68
|
# columns that should be ignored for every model. these should be metadata columns like change dates, versions, etc.
|
64
69
|
# values in this array may be symbols or strings.
|
65
70
|
def self.ignore_columns
|
@@ -83,6 +88,16 @@ module ActiveScaffold::Config
|
|
83
88
|
cattr_accessor :highlight_messages, instance_accessor: false
|
84
89
|
@@highlight_messages = nil
|
85
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
|
+
|
95
|
+
def self.freeze
|
96
|
+
super
|
97
|
+
security.freeze
|
98
|
+
column.freeze
|
99
|
+
end
|
100
|
+
|
86
101
|
# instance-level configuration
|
87
102
|
# ----------------------------
|
88
103
|
|
@@ -149,6 +164,7 @@ module ActiveScaffold::Config
|
|
149
164
|
def initialize(model_id)
|
150
165
|
# model_id is the only absolutely required configuration value. it is also not publicly accessible.
|
151
166
|
@model_id = model_id
|
167
|
+
setup_user_setting_key
|
152
168
|
|
153
169
|
# inherit the actions list directly from the global level
|
154
170
|
@actions = self.class.actions.clone
|
@@ -182,17 +198,20 @@ module ActiveScaffold::Config
|
|
182
198
|
@highlight_messages = self.class.highlight_messages
|
183
199
|
end
|
184
200
|
|
185
|
-
# To be called
|
186
|
-
def
|
187
|
-
|
201
|
+
# To be called before freezing
|
202
|
+
def _cache_lazy_values
|
203
|
+
action_links.each(&:name_to_cache) if cache_action_link_urls
|
204
|
+
columns.select(&:sortable?).each(&:sort)
|
205
|
+
columns.select(&:searchable?).each(&:search_sql)
|
188
206
|
actions.each do |action_name|
|
189
207
|
action = send(action_name)
|
190
|
-
action.
|
208
|
+
Array(action.class.columns_collections).each { |method| action.send(method) }
|
191
209
|
end
|
192
210
|
end
|
193
211
|
|
194
212
|
# To be called after your finished configuration
|
195
213
|
def _configure_sti
|
214
|
+
return if sti_children.nil?
|
196
215
|
column = model.inheritance_column
|
197
216
|
if sti_create_links
|
198
217
|
columns[column].form_ui ||= :hidden
|
@@ -205,28 +224,55 @@ module ActiveScaffold::Config
|
|
205
224
|
end
|
206
225
|
end
|
207
226
|
|
227
|
+
def _setup_action(action)
|
228
|
+
define_singleton_method action do
|
229
|
+
self[action]
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
208
233
|
# configuration routing.
|
209
234
|
# we want to route calls named like an activated action to that action's global or local Config class.
|
210
235
|
# ---------------------------
|
211
236
|
def method_missing(name, *args)
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
237
|
+
self[name] || super
|
238
|
+
end
|
239
|
+
|
240
|
+
def respond_to_missing?(name, include_all = false)
|
241
|
+
self.class.config_class?(name) && @actions.include?(name.to_sym) || super
|
242
|
+
end
|
243
|
+
|
244
|
+
def [](action_name)
|
245
|
+
klass = self.class.config_class(action_name)
|
246
|
+
return unless klass
|
247
|
+
|
248
|
+
underscored_name = action_name.to_s.underscore.to_sym
|
249
|
+
unless @actions.include? underscored_name
|
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 = [...])."
|
222
251
|
end
|
223
|
-
|
252
|
+
@action_configs ||= {}
|
253
|
+
@action_configs[underscored_name] ||= klass.new(self)
|
254
|
+
end
|
255
|
+
|
256
|
+
def []=(action_name, action_config)
|
257
|
+
@action_configs ||= {}
|
258
|
+
@action_configs[action_name] = action_config
|
224
259
|
end
|
260
|
+
private :[]=
|
225
261
|
|
226
262
|
def self.method_missing(name, *args)
|
227
|
-
|
228
|
-
|
229
|
-
|
263
|
+
config_class(name) || super
|
264
|
+
end
|
265
|
+
|
266
|
+
def self.config_class(name)
|
267
|
+
"ActiveScaffold::Config::#{name.to_s.camelcase}".constantize if config_class?(name)
|
268
|
+
end
|
269
|
+
|
270
|
+
def self.config_class?(name)
|
271
|
+
ActiveScaffold::Config.const_defined? name.to_s.camelcase
|
272
|
+
end
|
273
|
+
|
274
|
+
def self.respond_to_missing?(name, include_all = false)
|
275
|
+
config_class?(name) && @@actions.include?(name.to_s.underscore) || super
|
230
276
|
end
|
231
277
|
# some utility methods
|
232
278
|
# --------------------
|
@@ -247,6 +293,17 @@ module ActiveScaffold::Config
|
|
247
293
|
@inherited_view_paths ||= []
|
248
294
|
end
|
249
295
|
|
296
|
+
def build_action_columns(action, columns)
|
297
|
+
action_columns =
|
298
|
+
if columns.is_a?(ActiveScaffold::DataStructures::ActionColumns)
|
299
|
+
columns.dup
|
300
|
+
else
|
301
|
+
ActiveScaffold::DataStructures::ActionColumns.new(*columns)
|
302
|
+
end
|
303
|
+
action_columns.action = action.is_a?(Symbol) ? send(action) : action
|
304
|
+
action_columns
|
305
|
+
end
|
306
|
+
|
250
307
|
# must be a class method so the layout doesn't depend on a controller that uses active_scaffold
|
251
308
|
# note that this is unaffected by per-controller frontend configuration.
|
252
309
|
def self.asset_path(filename, frontend = self.frontend)
|
@@ -264,5 +321,76 @@ module ActiveScaffold::Config
|
|
264
321
|
frontends_dir = Rails.root.join('vendor', 'plugins', ActiveScaffold::Config::Core.plugin_directory, 'frontends')
|
265
322
|
Dir.entries(frontends_dir).reject { |e| e.match(/^\./) } # Get rid of files that start with .
|
266
323
|
end
|
324
|
+
|
325
|
+
class UserSettings < UserSettings
|
326
|
+
include ActiveScaffold::Configurable
|
327
|
+
user_attr :cache_action_link_urls, :cache_association_options, :conditional_get_support,
|
328
|
+
:timestamped_messages, :highlight_messages
|
329
|
+
|
330
|
+
def method_missing(name, *args)
|
331
|
+
value = @conf.actions.include?(name) ? @conf.send(name) : super
|
332
|
+
value.is_a?(Base) ? action_user_settings(value) : value
|
333
|
+
end
|
334
|
+
|
335
|
+
def respond_to_missing?(name, include_all = false)
|
336
|
+
super # avoid rubocop warning
|
337
|
+
end
|
338
|
+
|
339
|
+
def action_user_settings(action_config)
|
340
|
+
if action_config.user.nil? && action_config.respond_to?(:new_user_settings)
|
341
|
+
action_config.new_user_settings @storage, @params
|
342
|
+
end
|
343
|
+
action_config.user || action_config
|
344
|
+
end
|
345
|
+
|
346
|
+
def columns
|
347
|
+
@columns ||= UserColumns.new(@conf.columns)
|
348
|
+
end
|
349
|
+
|
350
|
+
def action_links
|
351
|
+
@action_links ||= CowProxy.wrap(@conf.action_links)
|
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
|
361
|
+
end
|
362
|
+
|
363
|
+
class UserColumns
|
364
|
+
include Enumerable
|
365
|
+
|
366
|
+
def initialize(columns)
|
367
|
+
@global_columns = columns
|
368
|
+
@columns = {}
|
369
|
+
end
|
370
|
+
|
371
|
+
def [](name)
|
372
|
+
return nil unless @global_columns[name]
|
373
|
+
@columns[name.to_sym] ||= CowProxy.wrap @global_columns[name]
|
374
|
+
end
|
375
|
+
|
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)
|
384
|
+
if @global_columns.respond_to?(name, true)
|
385
|
+
@global_columns.send(name, *args, &block)
|
386
|
+
else
|
387
|
+
super
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
def respond_to_missing?(name, include_all = false)
|
392
|
+
@global_columns.respond_to?(name, include_all) || super
|
393
|
+
end
|
394
|
+
end
|
267
395
|
end
|
268
396
|
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
|
@@ -26,5 +37,7 @@ module ActiveScaffold::Config
|
|
26
37
|
|
27
38
|
# whether we should refresh list after destroy or not
|
28
39
|
attr_accessor :refresh_list
|
40
|
+
|
41
|
+
undef_method :new_user_settings
|
29
42
|
end
|
30
43
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module ActiveScaffold::Config
|
2
2
|
class FieldSearch < Base
|
3
3
|
self.crud_type = :read
|
4
|
+
NO_COLUMNS = [].freeze
|
4
5
|
|
5
6
|
def initialize(core_config)
|
6
7
|
super
|
@@ -52,7 +53,8 @@ module ActiveScaffold::Config
|
|
52
53
|
end
|
53
54
|
|
54
55
|
def optional_columns
|
55
|
-
@optional_columns
|
56
|
+
return @optional_columns || NO_COLUMNS if frozen?
|
57
|
+
@optional_columns ||= NO_COLUMNS.dup
|
56
58
|
end
|
57
59
|
|
58
60
|
# add array of columns as options for group by to get aggregated listings
|
@@ -68,5 +70,9 @@ module ActiveScaffold::Config
|
|
68
70
|
# human conditions
|
69
71
|
# instead of just filtered you may show the user a humanized search condition statment
|
70
72
|
attr_accessor :human_conditions
|
73
|
+
|
74
|
+
UserSettings.class_eval do
|
75
|
+
user_attr :optional_columns, :group_options, :grouped_columns, :human_conditions
|
76
|
+
end
|
71
77
|
end
|
72
78
|
end
|
@@ -43,7 +43,7 @@ module ActiveScaffold::Config
|
|
43
43
|
|
44
44
|
columns_accessor :columns do
|
45
45
|
columns.exclude :created_on, :created_at, :updated_on, :updated_at, :as_marked
|
46
|
-
columns.exclude(*@core.columns.collect { |c| c.name if c.association
|
46
|
+
columns.exclude(*@core.columns.collect { |c| c.name if c.association&.polymorphic? }.compact)
|
47
47
|
end
|
48
48
|
|
49
49
|
# whether the form should be multipart
|
@@ -51,5 +51,14 @@ module ActiveScaffold::Config
|
|
51
51
|
def multipart?
|
52
52
|
@multipart ? true : false
|
53
53
|
end
|
54
|
+
|
55
|
+
UserSettings.class_eval do
|
56
|
+
user_attr :persistent, :refresh_list, :show_unauthorized_columns
|
57
|
+
|
58
|
+
attr_writer :multipart
|
59
|
+
def multipart?
|
60
|
+
defined?(@multipart) ? @multipart : @conf.multipart?
|
61
|
+
end
|
62
|
+
end
|
54
63
|
end
|
55
64
|
end
|
@@ -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,10 +219,16 @@ 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
|
224
|
+
user_attr :page_links_inner_window, :page_links_outer_window, :refresh_with_header, :empty_field_text,
|
225
|
+
:association_join_text, :messages_above_header, :wrap_tag, :auto_select_columns, :calculate_etag,
|
226
|
+
:no_entries_message, :filtered_message, :show_search_reset, :always_show_create, :always_show_search,
|
227
|
+
:hide_nested_column, :pagination, :auto_pagination
|
228
|
+
|
223
229
|
def initialize(conf, storage, params)
|
224
230
|
super(conf, storage, params, :list)
|
225
|
-
@
|
231
|
+
@_sorting = nil
|
226
232
|
end
|
227
233
|
|
228
234
|
attr_writer :label
|
@@ -232,7 +238,7 @@ module ActiveScaffold::Config
|
|
232
238
|
end
|
233
239
|
|
234
240
|
def embedded_label
|
235
|
-
@params
|
241
|
+
@params.dig :embedded, :label
|
236
242
|
end
|
237
243
|
|
238
244
|
def per_page
|
@@ -240,6 +246,10 @@ module ActiveScaffold::Config
|
|
240
246
|
self['per_page'] || @conf.per_page
|
241
247
|
end
|
242
248
|
|
249
|
+
def per_page=(value)
|
250
|
+
self['per_page'] = value
|
251
|
+
end
|
252
|
+
|
243
253
|
def page
|
244
254
|
self['page'] = @params['page'] || 1 if @params.key?('page') || @conf.auto_pagination
|
245
255
|
self['page'] || 1
|
@@ -252,41 +262,57 @@ module ActiveScaffold::Config
|
|
252
262
|
attr_reader :nested_default_sorting
|
253
263
|
|
254
264
|
def nested_default_sorting=(options)
|
255
|
-
@nested_default_sorting ||=
|
265
|
+
@nested_default_sorting ||= sorting_dup
|
256
266
|
@nested_default_sorting.set_nested_sorting(options[:table_name], options[:default_sorting])
|
257
267
|
end
|
258
268
|
|
259
269
|
def default_sorting
|
260
|
-
nested_default_sorting.nil?
|
270
|
+
nested_default_sorting.nil? || @sorting.present? ? sorting_dup : nested_default_sorting
|
261
271
|
end
|
262
272
|
|
273
|
+
# TODO: programatically set sorting, for per-request configuration, priority @params, then @sort
|
274
|
+
|
263
275
|
def user_sorting?
|
264
276
|
@params['sort'] && @params['sort_direction'] != 'reset'
|
265
277
|
end
|
266
278
|
|
279
|
+
# change list sorting for this request, unless sorting is defined
|
280
|
+
# {column => direction, column => direction}
|
281
|
+
attr_writer :sorting
|
282
|
+
|
267
283
|
def sorting
|
268
|
-
if @
|
284
|
+
if @_sorting.nil?
|
269
285
|
# we want to store as little as possible in the session, but we want to return a Sorting data structure. so we recreate it each page load based on session data.
|
270
286
|
self['sort'] = [@params['sort'], @params['sort_direction']] if @params['sort'] && @params['sort_direction']
|
271
287
|
self['sort'] = nil if @params['sort_direction'] == 'reset'
|
272
288
|
|
273
289
|
if self['sort'] && @conf.core.columns[self['sort'][0]]
|
274
|
-
sorting =
|
290
|
+
sorting = sorting_dup
|
275
291
|
sorting.set(*self['sort'])
|
276
|
-
@
|
292
|
+
@_sorting = sorting
|
277
293
|
else
|
278
|
-
@
|
294
|
+
@_sorting = default_sorting
|
295
|
+
@_sorting.set(@sorting) if @sorting
|
279
296
|
if @conf.columns.constraint_columns.present?
|
280
|
-
@
|
297
|
+
@_sorting.constraint_columns = @conf.columns.constraint_columns
|
281
298
|
end
|
282
299
|
end
|
283
300
|
end
|
284
|
-
@
|
301
|
+
@_sorting
|
285
302
|
end
|
286
303
|
|
287
304
|
def count_includes
|
288
305
|
@conf.count_includes
|
289
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
|
290
316
|
end
|
291
317
|
end
|
292
318
|
end
|
@@ -11,7 +11,7 @@ module ActiveScaffold::Config
|
|
11
11
|
attr_accessor :mark_all_mode
|
12
12
|
|
13
13
|
def initialize(core_config)
|
14
|
-
|
14
|
+
super
|
15
15
|
@mark_all_mode = self.class.mark_all_mode
|
16
16
|
@core.model.send(:include, ActiveScaffold::MarkedModel) unless @core.model < ActiveScaffold::MarkedModel
|
17
17
|
add_mark_column
|
@@ -24,7 +24,9 @@ module ActiveScaffold::Config
|
|
24
24
|
@core.columns[:as_marked].label = 'M'
|
25
25
|
@core.columns[:as_marked].list_ui = :marked
|
26
26
|
@core.columns[:as_marked].sort = false
|
27
|
-
@core.list.columns = [:as_marked] + @core.list.columns.
|
27
|
+
@core.list.columns = [:as_marked] + @core.list.columns.to_a unless @core.list.columns.include? :as_marked
|
28
28
|
end
|
29
|
+
|
30
|
+
undef_method :new_user_settings
|
29
31
|
end
|
30
32
|
end
|
@@ -25,23 +25,20 @@ module ActiveScaffold::Config
|
|
25
25
|
# Add a nested ActionLink
|
26
26
|
def add_link(attribute, options = {})
|
27
27
|
column = @core.columns[attribute.to_sym]
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
elsif column.association.nil?
|
43
|
-
raise ArgumentError, "column #{attribute} is not an association"
|
44
|
-
end
|
28
|
+
raise ArgumentError, "unknown column #{attribute}" if column.nil?
|
29
|
+
raise ArgumentError, "column #{attribute} is not an association" if column.association.nil?
|
30
|
+
|
31
|
+
label =
|
32
|
+
if column.association.polymorphic?
|
33
|
+
column.label
|
34
|
+
else
|
35
|
+
column.association.klass.model_name.human(:count => column.association.singular? ? 1 : 2, :default => column.association.klass.name.pluralize)
|
36
|
+
end
|
37
|
+
options.reverse_merge! :security_method => :nested_authorized?, :label => label
|
38
|
+
action_group = options.delete(:action_group) || self.action_group
|
39
|
+
action_link = @core.link_for_association(column, options)
|
40
|
+
@core.action_links.add_to_group(action_link, action_group) unless action_link.nil?
|
41
|
+
action_link
|
45
42
|
end
|
46
43
|
|
47
44
|
def add_scoped_link(named_scope, options = {})
|
@@ -51,5 +48,7 @@ module ActiveScaffold::Config
|
|
51
48
|
|
52
49
|
# the label for this Nested action. used for the header.
|
53
50
|
attr_writer :label
|
51
|
+
|
52
|
+
undef_method :new_user_settings
|
54
53
|
end
|
55
54
|
end
|