active_scaffold 3.5.5 → 3.6.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +18 -2
  3. data/README.md +17 -7
  4. data/app/assets/javascripts/jquery/active_scaffold.js +28 -2
  5. data/app/views/active_scaffold_overrides/_base_form.html.erb +2 -2
  6. data/app/views/active_scaffold_overrides/_form.html.erb +1 -1
  7. data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +3 -2
  8. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +6 -6
  9. data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +1 -1
  10. data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +1 -1
  11. data/app/views/active_scaffold_overrides/_list.html.erb +2 -1
  12. data/app/views/active_scaffold_overrides/_list_messages.html.erb +1 -0
  13. data/app/views/active_scaffold_overrides/_messages.html.erb +1 -0
  14. data/app/views/active_scaffold_overrides/_render_field.js.erb +2 -1
  15. data/app/views/active_scaffold_overrides/_show_association_horizontal.html.erb +2 -1
  16. data/app/views/active_scaffold_overrides/_show_columns.html.erb +2 -2
  17. data/app/views/active_scaffold_overrides/_show_horizontal_record.html.erb +4 -4
  18. data/app/views/active_scaffold_overrides/_update_calculations.js.erb +1 -1
  19. data/app/views/active_scaffold_overrides/_update_column.js.erb +2 -2
  20. data/app/views/active_scaffold_overrides/action_confirmation.html.erb +2 -2
  21. data/app/views/active_scaffold_overrides/delete.html.erb +2 -2
  22. data/app/views/active_scaffold_overrides/on_action_update.js.erb +16 -6
  23. data/app/views/active_scaffold_overrides/on_update.js.erb +1 -1
  24. data/app/views/active_scaffold_overrides/row.js.erb +1 -1
  25. data/app/views/active_scaffold_overrides/update_column.js.erb +1 -1
  26. data/lib/active_scaffold.rb +11 -13
  27. data/lib/active_scaffold/actions/core.rb +25 -35
  28. data/lib/active_scaffold/actions/create.rb +1 -1
  29. data/lib/active_scaffold/actions/delete.rb +2 -2
  30. data/lib/active_scaffold/actions/field_search.rb +2 -2
  31. data/lib/active_scaffold/actions/list.rb +8 -7
  32. data/lib/active_scaffold/actions/nested.rb +9 -9
  33. data/lib/active_scaffold/actions/search.rb +1 -1
  34. data/lib/active_scaffold/actions/show.rb +1 -1
  35. data/lib/active_scaffold/actions/subform.rb +3 -1
  36. data/lib/active_scaffold/actions/update.rb +5 -4
  37. data/lib/active_scaffold/active_record_permissions.rb +2 -11
  38. data/lib/active_scaffold/attribute_params.rb +16 -23
  39. data/lib/active_scaffold/bridges.rb +8 -8
  40. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +1 -1
  41. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +1 -1
  42. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +3 -18
  43. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +1 -1
  44. data/lib/active_scaffold/bridges/chosen/helpers.rb +7 -6
  45. data/lib/active_scaffold/bridges/date_picker/ext.rb +0 -13
  46. data/lib/active_scaffold/bridges/date_picker/helper.rb +3 -3
  47. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +1 -1
  48. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +3 -3
  49. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +8 -7
  50. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +2 -4
  51. data/lib/active_scaffold/bridges/paper_trail.rb +1 -1
  52. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
  53. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +1 -1
  54. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +2 -2
  55. data/lib/active_scaffold/bridges/record_select/helpers.rb +9 -9
  56. data/lib/active_scaffold/bridges/shared/date_bridge.rb +3 -3
  57. data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +1 -1
  58. data/lib/active_scaffold/config/base.rb +89 -21
  59. data/lib/active_scaffold/config/core.rb +127 -18
  60. data/lib/active_scaffold/config/delete.rb +2 -0
  61. data/lib/active_scaffold/config/field_search.rb +7 -1
  62. data/lib/active_scaffold/config/form.rb +10 -1
  63. data/lib/active_scaffold/config/list.rb +27 -11
  64. data/lib/active_scaffold/config/mark.rb +3 -1
  65. data/lib/active_scaffold/config/nested.rb +16 -17
  66. data/lib/active_scaffold/config/search.rb +9 -0
  67. data/lib/active_scaffold/config/show.rb +4 -0
  68. data/lib/active_scaffold/config/update.rb +4 -0
  69. data/lib/active_scaffold/configurable.rb +11 -6
  70. data/lib/active_scaffold/constraints.rb +1 -1
  71. data/lib/active_scaffold/core.rb +46 -16
  72. data/lib/active_scaffold/data_structures/action_columns.rb +50 -59
  73. data/lib/active_scaffold/data_structures/action_link.rb +20 -8
  74. data/lib/active_scaffold/data_structures/action_links.rb +6 -2
  75. data/lib/active_scaffold/data_structures/association/abstract.rb +9 -5
  76. data/lib/active_scaffold/data_structures/association/active_record.rb +1 -1
  77. data/lib/active_scaffold/data_structures/column.rb +51 -33
  78. data/lib/active_scaffold/data_structures/nested_info.rb +1 -1
  79. data/lib/active_scaffold/data_structures/set.rb +8 -0
  80. data/lib/active_scaffold/data_structures/sorting.rb +5 -2
  81. data/lib/active_scaffold/delayed_setup.rb +2 -1
  82. data/lib/active_scaffold/extensions/action_controller_rendering.rb +2 -1
  83. data/lib/active_scaffold/extensions/action_view_rendering.rb +1 -1
  84. data/lib/active_scaffold/extensions/cow_proxy.rb +43 -0
  85. data/lib/active_scaffold/extensions/ice_nine.rb +36 -0
  86. data/lib/active_scaffold/extensions/left_outer_joins.rb +8 -33
  87. data/lib/active_scaffold/extensions/routing_mapper.rb +4 -43
  88. data/lib/active_scaffold/extensions/unsaved_record.rb +2 -4
  89. data/lib/active_scaffold/finder.rb +26 -30
  90. data/lib/active_scaffold/helpers/action_link_helpers.rb +16 -16
  91. data/lib/active_scaffold/helpers/association_helpers.rb +5 -5
  92. data/lib/active_scaffold/helpers/controller_helpers.rb +11 -1
  93. data/lib/active_scaffold/helpers/form_column_helpers.rb +25 -24
  94. data/lib/active_scaffold/helpers/id_helpers.rb +2 -2
  95. data/lib/active_scaffold/helpers/list_column_helpers.rb +8 -6
  96. data/lib/active_scaffold/helpers/search_column_helpers.rb +4 -4
  97. data/lib/active_scaffold/helpers/view_helpers.rb +7 -13
  98. data/lib/active_scaffold/marked_model.rb +2 -2
  99. data/lib/active_scaffold/orm_checks.rb +1 -5
  100. data/lib/active_scaffold/paginator.rb +6 -4
  101. data/lib/active_scaffold/registry.rb +22 -0
  102. data/lib/active_scaffold/responds_to_parent.rb +2 -6
  103. data/lib/active_scaffold/tableless.rb +63 -59
  104. data/lib/active_scaffold/version.rb +2 -2
  105. data/lib/generators/active_scaffold/controller_generator.rb +2 -2
  106. data/lib/generators/active_scaffold/install_generator.rb +1 -1
  107. data/lib/generators/active_scaffold/resource_generator.rb +2 -2
  108. data/test/bridges/date_picker_test.rb +1 -2
  109. data/test/bridges/paperclip_test.rb +5 -5
  110. data/test/class_with_finder.rb +2 -2
  111. data/test/company.rb +2 -2
  112. data/test/config/create_test.rb +4 -2
  113. data/test/config/nested_test.rb +1 -1
  114. data/test/config/show_test.rb +1 -1
  115. data/test/config/update_test.rb +7 -6
  116. data/test/data_structures/action_links_test.rb +1 -1
  117. data/test/data_structures/sorting_test.rb +7 -0
  118. data/test/misc/active_record_permissions_test.rb +1 -9
  119. data/test/misc/attribute_params_test.rb +8 -8
  120. data/test/misc/calculation_test.rb +1 -1
  121. data/test/misc/constraints_test.rb +2 -2
  122. data/test/misc/convert_numbers_format_test.rb +3 -3
  123. data/test/misc/lang_test.rb +1 -1
  124. data/test/misc/parse_datetime_test.rb +3 -4
  125. data/test/misc/tableless_test.rb +6 -0
  126. data/test/mock_app/Rakefile +1 -1
  127. data/test/mock_app/config/application.rb +1 -1
  128. data/test/mock_app/config/boot.rb +1 -1
  129. data/test/mock_app/config/environment.rb +2 -2
  130. data/test/test_helper.rb +8 -1
  131. metadata +38 -13
@@ -32,11 +32,11 @@ module ActiveScaffold
32
32
  klass = association_klass_scoped(association, klass, record)
33
33
  relation = klass.where(conditions)
34
34
  column = column_for_association(association, record)
35
- if column && column.includes
35
+ if column&.includes
36
36
  include_assoc = column.includes.find { |assoc| assoc.is_a?(Hash) && assoc.include?(association.name) }
37
37
  relation = relation.includes(include_assoc[association.name]) if include_assoc
38
38
  end
39
- if column && column.sort && column.sort[:sql]
39
+ if column&.sort && column.sort&.dig(:sql)
40
40
  relation = relation.order(column.sort[:sql])
41
41
  end
42
42
  relation = yield(relation) if block_given?
@@ -49,12 +49,12 @@ module ActiveScaffold
49
49
  end
50
50
 
51
51
  def association_klass_scoped(association, klass, record)
52
- if nested? && nested.through_association? && nested.child_association.try(:through_reflection) == association
52
+ if nested? && nested.through_association? && nested.child_association&.through_reflection == association
53
53
  # only ActiveRecord associations
54
54
  if nested.association.through_reflection.collection?
55
55
  nested_parent_record.send(nested.association.through_reflection.name)
56
56
  else
57
- klass.where(association.association_primary_key => nested_parent_record.send(nested.association.through_reflection.name).try(:id))
57
+ klass.where(association.association_primary_key => nested_parent_record.send(nested.association.through_reflection.name)&.id)
58
58
  end
59
59
  else
60
60
  klass
@@ -65,7 +65,7 @@ module ActiveScaffold
65
65
  def sorted_association_options_find(association, conditions = nil, record = nil)
66
66
  options = association_options_find(association, conditions, nil, record)
67
67
  column = column_for_association(association, record)
68
- unless column && column.try(:sort) && column.sort[:sql]
68
+ unless column&.sort && column.sort&.dig(:sql)
69
69
  method = column.options[:label_method] if column
70
70
  options = options.sort_by(&(method || :to_label).to_sym)
71
71
  end
@@ -8,13 +8,23 @@ module ActiveScaffold
8
8
  :main_path_to_return, :render_parent_options,
9
9
  :render_parent_action, :nested_singular_association?,
10
10
  :main_form_controller, :build_associated,
11
- :generate_temporary_id, :generated_id
11
+ :generate_temporary_id, :generated_id,
12
+ :active_scaffold_config_for
12
13
  end
13
14
  end
14
15
  end
15
16
 
16
17
  include ActiveScaffold::Helpers::IdHelpers
17
18
 
19
+ def active_scaffold_config_for(klass)
20
+ config = self.class.active_scaffold_config_for(klass)
21
+ if ActiveScaffold.threadsafe
22
+ config.user || config.new_user_settings({}, {})
23
+ else
24
+ config
25
+ end
26
+ end
27
+
18
28
  def generate_temporary_id(record = nil, generated_id = nil)
19
29
  (generated_id || (Time.now.to_f * 1000).to_i.to_s).tap do |id|
20
30
  (@temporary_ids ||= {})[record.class.name] = id if record
@@ -66,9 +66,7 @@ module ActiveScaffold
66
66
  col_class = col_class.join(' ')
67
67
  end
68
68
  if readonly && !record.new_record? || !record.authorized_for?(:crud_type => crud_type, :column => column.name)
69
- options = active_scaffold_input_options(column, scope).except(:name)
70
- options[:class] = "#{options[:class]} #{col_class}" if col_class
71
- content_tag :span, get_column_value(record, column), options
69
+ form_attribute(column, record, scope, true, col_class)
72
70
  else
73
71
  renders_as = column_renders_as(column)
74
72
  html = render_column(column, record, renders_as, scope, false, col_class)
@@ -86,7 +84,7 @@ module ActiveScaffold
86
84
 
87
85
  # the standard active scaffold options used for textual inputs
88
86
  def active_scaffold_input_text_options(options = {})
89
- options[:autocomplete] = 'off'
87
+ options[:autocomplete] ||= 'off'
90
88
  options[:class] = "#{options[:class]} text-input".strip
91
89
  options
92
90
  end
@@ -97,7 +95,7 @@ module ActiveScaffold
97
95
  record = options[:object]
98
96
 
99
97
  # Add some HTML5 attributes for in-browser validation and better user experience
100
- if column.required? && (!@disable_required_for_new || scope.nil? || record.try(:persisted?))
98
+ if column.required? && (!@disable_required_for_new || scope.nil? || record&.persisted?)
101
99
  options[:required] = true
102
100
  end
103
101
  options[:placeholder] = column.placeholder if column.placeholder.present?
@@ -114,18 +112,20 @@ module ActiveScaffold
114
112
 
115
113
  def current_form_columns(record, scope, subform_controller = nil)
116
114
  if scope
117
- subform_controller.active_scaffold_config.subform.columns.names
115
+ subform_controller.active_scaffold_config.subform.columns.visible_columns_names
118
116
  elsif %i[new create edit update render_field].include? action_name.to_sym
119
117
  # disable update_columns for inplace_edit (GET render_field)
120
118
  return if action_name == 'render_field' && request.get?
121
- active_scaffold_config.send(record.new_record? ? :create : :update).columns.names
119
+ active_scaffold_config.send(record.new_record? ? :create : :update).columns.visible_columns_names
122
120
  end
123
121
  end
124
122
 
125
123
  def update_columns_options(column, scope, options, force = false)
126
124
  record = options[:object]
127
125
  subform_controller = controller.class.active_scaffold_controller_for(record.class) if scope
128
- form_columns = @main_columns.try(:names) if scope.nil? || subform_controller == controller.class
126
+ if @main_columns && (scope.nil? || subform_controller == controller.class)
127
+ form_columns = @main_columns.visible_columns_names
128
+ end
129
129
  form_columns ||= current_form_columns(record, scope, subform_controller)
130
130
  if force || (form_columns && column.update_columns && (column.update_columns & form_columns).present?)
131
131
  url_params = params_for(:action => 'render_field', :column => column.name, :id => record.to_param)
@@ -134,7 +134,7 @@ module ActiveScaffold
134
134
  url_params = url_params.except(:parent_scaffold, :association, nested.param_name)
135
135
  end
136
136
  if scope
137
- url_params[:parent_controller] ||= url_params[:controller].gsub(/^\//, '')
137
+ url_params[:parent_controller] ||= url_params[:controller].gsub(%r{/^//}, '')
138
138
  url_params[:controller] = subform_controller.controller_path
139
139
  url_params[:scope] = scope
140
140
  url_params[:parent_id] = params[:parent_id] || params[:id]
@@ -189,7 +189,7 @@ module ActiveScaffold
189
189
  end
190
190
 
191
191
  def label_for(column, options)
192
- options[:id] unless column.form_ui == :select && column.association.try(:collection?)
192
+ options[:id] unless column.form_ui == :select && column.association&.collection?
193
193
  end
194
194
 
195
195
  def subform_label(column, hidden)
@@ -205,7 +205,7 @@ module ActiveScaffold
205
205
 
206
206
  def form_hidden_field(column, record, scope)
207
207
  options = active_scaffold_input_options(column, scope)
208
- if column.association.try(:collection?)
208
+ if column.association&.collection?
209
209
  associated = record.send(column.name)
210
210
  if associated.blank?
211
211
  hidden_field_tag options[:name], '', options
@@ -217,7 +217,7 @@ module ActiveScaffold
217
217
  safe_join fields, ''
218
218
  end
219
219
  elsif column.association
220
- hidden_field_tag options[:name], record.send(column.name).try(:id), options
220
+ hidden_field_tag options[:name], record.send(column.name)&.id, options
221
221
  else
222
222
  hidden_field :record, column.name, options.merge(object: record)
223
223
  end
@@ -245,7 +245,7 @@ module ActiveScaffold
245
245
  end
246
246
 
247
247
  def column_show_add_existing(column, record = nil)
248
- column.allow_add_existing && options_for_association_count(column.association, record) > 0
248
+ column.allow_add_existing && options_for_association_count(column.association, record).positive?
249
249
  end
250
250
 
251
251
  def column_show_add_new(column, associated, record)
@@ -263,7 +263,7 @@ module ActiveScaffold
263
263
  def active_scaffold_grouped_options(column, select_options, optgroup)
264
264
  group_column = active_scaffold_config_for(column.association.klass).columns[optgroup]
265
265
  group_label = group_column.options[:label_method] if group_column
266
- group_label ||= group_column.try(:association) ? :to_label : :to_s
266
+ group_label ||= group_column&.association ? :to_label : :to_s
267
267
  select_options.group_by(&optgroup.to_sym).collect do |group, options|
268
268
  [group.send(group_label), options.collect { |r| [r.send(column.options[:label_method] || :to_label), r.id] }]
269
269
  end
@@ -289,7 +289,7 @@ module ActiveScaffold
289
289
  select_options.unshift(associated) unless associated.nil? || select_options.include?(associated)
290
290
 
291
291
  method = column.name
292
- options.merge! :selected => associated.try(:id), :include_blank => as_(:_select_), :object => record
292
+ options.merge! :selected => associated&.id, :include_blank => as_(:_select_), :object => record
293
293
 
294
294
  html_options.merge!(column.options[:html_options] || {})
295
295
  options.merge!(column.options)
@@ -345,7 +345,7 @@ module ActiveScaffold
345
345
  link_options['data-update_send_form'] = html_options['data-update_send_form']
346
346
  link_options['data-update_send_form_selector'] = html_options['data-update_send_form_selector']
347
347
  else
348
- scope = html_options[:name].scan(/^record((\[[^\]]*\])*)\[#{column.name}\]/)[0].try(:first) if html_options[:name]
348
+ scope = html_options[:name].scan(/^record((\[[^\]]*\])*)\[#{column.name}\]/).dig(0, 0) if html_options[:name]
349
349
  link_options = update_columns_options(column, scope.presence, link_options, true)
350
350
  end
351
351
  link_options[:class] = 'refresh-link'
@@ -418,9 +418,9 @@ module ActiveScaffold
418
418
  end
419
419
 
420
420
  def active_scaffold_input_select(column, html_options)
421
- if column.association.try :singular?
421
+ if column.association&.singular?
422
422
  active_scaffold_input_singular_association(column, html_options)
423
- elsif column.association.try :collection?
423
+ elsif column.association&.collection?
424
424
  active_scaffold_input_plural_association(column, html_options)
425
425
  else
426
426
  active_scaffold_input_enum(column, html_options)
@@ -430,7 +430,8 @@ module ActiveScaffold
430
430
  def active_scaffold_radio_option(option, selected, column, radio_options)
431
431
  if column.association
432
432
  label_method = column.options[:label_method] || :to_label
433
- text, value = [option.send(label_method), option.id]
433
+ text = option.send(label_method)
434
+ value = option.id
434
435
  checked = {:checked => selected == value}
435
436
  else
436
437
  text, value = active_scaffold_translated_option(column, *option)
@@ -452,7 +453,7 @@ module ActiveScaffold
452
453
  active_scaffold_enum_options(column, record)
453
454
  end
454
455
 
455
- selected = record.send(column.association.name).try(:id) if column.association
456
+ selected = record.send(column.association.name)&.id if column.association
456
457
  radios = options.map do |option|
457
458
  active_scaffold_radio_option(option, selected, column, html_options)
458
459
  end
@@ -464,7 +465,7 @@ module ActiveScaffold
464
465
  end
465
466
 
466
467
  def active_scaffold_input_password(column, options)
467
- active_scaffold_text_input :password_field, column, options
468
+ active_scaffold_text_input :password_field, column, options.reverse_merge(autocomplete: 'new-password')
468
469
  end
469
470
 
470
471
  def active_scaffold_input_textarea(column, options)
@@ -519,7 +520,7 @@ module ActiveScaffold
519
520
  # A color picker
520
521
  def active_scaffold_input_color(column, options)
521
522
  options = active_scaffold_input_text_options(options)
522
- if column.column.try(:null)
523
+ if column.column&.null
523
524
  no_color = options[:object].send(column.name).nil?
524
525
  method = no_color ? :hidden_field : :color_field
525
526
  html = content_tag(:label, check_box_tag('disable', '1', no_color, id: nil, name: nil, class: 'no-color') << " #{as_ column.options[:no_color] || :no_color}")
@@ -622,7 +623,7 @@ module ActiveScaffold
622
623
  end
623
624
 
624
625
  def column_scope(column, scope = nil, record = nil)
625
- if column.association.try(:collection?)
626
+ if column.association&.collection?
626
627
  "#{scope}[#{column.name}][#{record.id || generate_temporary_id(record)}]"
627
628
  else
628
629
  "#{scope}[#{column.name}]"
@@ -689,7 +690,7 @@ module ActiveScaffold
689
690
  only_odd_valid = validators.any? { |v| v.options[:odd] }
690
691
  only_even_valid = validators.any? { |v| v.options[:even] } unless only_odd_valid
691
692
  if !only_integer
692
- numerical_constraints[:step] ||= "0.#{'0' * (column.column.scale - 1)}1" if column.column && column.column.scale.to_i > 0
693
+ numerical_constraints[:step] ||= "0.#{'0' * (column.column.scale - 1)}1" if column.column&.scale.to_i.positive?
693
694
  elsif options[:min] && options[:min].respond_to?(:even?) && (only_odd_valid || only_even_valid)
694
695
  numerical_constraints[:step] = 2
695
696
  numerical_constraints[:min] += 1 if only_odd_valid && options[:min].even?
@@ -14,8 +14,8 @@ module ActiveScaffold
14
14
  nested_parent_record.id
15
15
  end
16
16
 
17
- def nested_id(controller = params[:controller])
18
- "#{nested.parent_scaffold.controller_path}-#{nested_parent_id}-#{controller}" if nested?
17
+ def nested_id(controller = nil)
18
+ "#{nested.parent_scaffold.controller_path}-#{nested_parent_id}-#{controller || params[:parent_controller] || params[:controller]}" if nested?
19
19
  end
20
20
 
21
21
  def active_scaffold_id
@@ -11,7 +11,7 @@ module ActiveScaffold
11
11
  value = nil
12
12
  end
13
13
  value = '&nbsp;'.html_safe if value.nil? || value.blank? # fix for IE 6
14
- return value
14
+ value
15
15
  rescue StandardError => e
16
16
  logger.error "#{e.class.name}: #{e.message} -- on the ActiveScaffold column = :#{column.name} in #{controller.class}, record: #{record.inspect}"
17
17
  raise e
@@ -249,7 +249,7 @@ module ActiveScaffold
249
249
  # we are not using eager loading, cache firsts records in order not to query the database for whole association in a future
250
250
  if column.associated_limit.nil?
251
251
  logger.warn "ActiveScaffold: Enable eager loading for #{column.name} association to reduce SQL queries"
252
- elsif column.associated_limit > 0
252
+ elsif column.associated_limit.positive?
253
253
  # load at least one record more, is needed to display '...'
254
254
  association.target = association.reader.limit(column.associated_limit + 1).select(column.select_associated_columns || "#{association.klass.quoted_table_name}.*").to_a
255
255
  elsif @cache_associations
@@ -295,8 +295,10 @@ module ActiveScaffold
295
295
 
296
296
  def inplace_edit_control(column)
297
297
  return unless inplace_edit?(active_scaffold_config.model, column) && inplace_edit_cloning?(column)
298
- column = column.clone
299
- column.options = column.options.clone
298
+ unless ActiveScaffold.threadsafe
299
+ column = column.dup
300
+ column.options = column.options.dup
301
+ end
300
302
  column.form_ui = :select if column.association && column.form_ui.nil?
301
303
  options = active_scaffold_input_options(column).merge(:object => column.active_record_class.new)
302
304
  options[:class] = "#{options[:class]} inplace_field"
@@ -316,7 +318,7 @@ module ActiveScaffold
316
318
  data[:ie_loading_text] = column.options[:loading_text] || as_(:loading)
317
319
  data[:ie_save_text] = column.options[:save_text] || as_(:update)
318
320
  data[:ie_saving_text] = column.options[:saving_text] || as_(:saving)
319
- data[:ie_rows] = column.options[:rows] || 5 if column.column.try(:type) == :text
321
+ data[:ie_rows] = column.options[:rows] || 5 if column.column&.type == :text
320
322
  data[:ie_cols] = column.options[:cols] if column.options[:cols]
321
323
  data[:ie_size] = column.options[:size] if column.options[:size]
322
324
  data[:ie_use_html] = column.options[:use_html] if column.options[:use_html]
@@ -327,7 +329,7 @@ module ActiveScaffold
327
329
  data[:ie_mode] = :clone
328
330
  elsif column.inplace_edit == :ajax
329
331
  url = url_for(params_for(:controller => params_for[:controller], :action => 'render_field', :id => '__id__', :update_column => column.name))
330
- plural = column.association.try(:collection?) && !override_form_field?(column) && %i[select record_select].include?(column.form_ui)
332
+ plural = column.association&.collection? && !override_form_field?(column) && %i[select record_select].include?(column.form_ui)
331
333
  data[:ie_render_url] = url
332
334
  data[:ie_mode] = :ajax
333
335
  data[:ie_plural] = plural
@@ -195,9 +195,9 @@ module ActiveScaffold
195
195
  def include_null_comparators?(column)
196
196
  return column.options[:null_comparators] if column.options.key? :null_comparators
197
197
  if column.association
198
- !column.association.belongs_to? || active_scaffold_config.columns[column.association.foreign_key].column.try(:null)
198
+ !column.association.belongs_to? || active_scaffold_config.columns[column.association.foreign_key].column&.null
199
199
  else
200
- column.column.try(:null)
200
+ column.column&.null
201
201
  end
202
202
  end
203
203
 
@@ -225,7 +225,7 @@ module ActiveScaffold
225
225
  content_tag(
226
226
  :span,
227
227
  safe_join([' - ', send(input_method, "#{options[:name]}[to]", to_value, to_options)]),
228
- :id => "#{options[:id]}_between", :class => 'as_search_range_between', :style => (opt_value == 'BETWEEN') ? nil : 'display: none'
228
+ :id => "#{options[:id]}_between", :class => 'as_search_range_between', :style => ('display: none' unless opt_value == 'BETWEEN')
229
229
  )
230
230
  end
231
231
  content_tag :span, html, :class => 'search_range'
@@ -292,7 +292,7 @@ module ActiveScaffold
292
292
  def visibles_and_hiddens(search_config)
293
293
  visibles = []
294
294
  hiddens = []
295
- search_config.columns.each do |column|
295
+ search_config.columns.each_column do |column|
296
296
  next unless column.search_sql
297
297
  if search_config.optional_columns.include?(column.name) && !searched_by?(column)
298
298
  hiddens << column
@@ -17,15 +17,6 @@ module ActiveScaffold
17
17
  ## Delegates
18
18
  ##
19
19
 
20
- # access to the configuration variable
21
- def active_scaffold_config
22
- controller.class.active_scaffold_config
23
- end
24
-
25
- def active_scaffold_config_for(*args)
26
- controller.class.active_scaffold_config_for(*args)
27
- end
28
-
29
20
  def active_scaffold_controller_for(*args)
30
21
  controller.class.active_scaffold_controller_for(*args)
31
22
  end
@@ -44,7 +35,10 @@ module ActiveScaffold
44
35
  # This is the template finder logic, keep it updated with however we find stuff in rails
45
36
  # currently this very similar to the logic in ActionBase::Base.render for options file
46
37
  def template_exists?(template_name, partial = false)
47
- restore_view_paths, lookup_context.view_paths = lookup_context.view_paths, @_view_paths if @_view_paths
38
+ if @_view_paths
39
+ restore_view_paths = lookup_context.view_paths
40
+ lookup_context.view_paths = @_view_paths
41
+ end
48
42
  lookup_context.exists?(template_name, '', partial).tap do
49
43
  lookup_context.view_paths = restore_view_paths if @_view_paths
50
44
  end
@@ -173,7 +167,7 @@ module ActiveScaffold
173
167
 
174
168
  def history_state
175
169
  if active_scaffold_config.store_user_settings
176
- state = {page: @page.try(:number)}
170
+ state = {page: @page&.number}
177
171
  state[:search] = search_params if respond_to?(:search_params) && search_params.present?
178
172
  if active_scaffold_config.list.user.user_sorting?
179
173
  column, state[:sort_direction] = active_scaffold_config.list.user.sorting.first
@@ -189,12 +183,12 @@ module ActiveScaffold
189
183
 
190
184
  def display_message(message)
191
185
  message = safe_join message, tag(:br) if message.is_a?(Array)
192
- if (highlights = active_scaffold_config.highlight_messages)
186
+ if (highlights = active_scaffold_config.user.highlight_messages)
193
187
  message = highlights.inject(message) do |msg, (phrases, highlighter)|
194
188
  highlight(msg, phrases, highlighter || {})
195
189
  end
196
190
  end
197
- if (format = active_scaffold_config.timestamped_messages)
191
+ if (format = active_scaffold_config.user.timestamped_messages)
198
192
  format = :short if format == true
199
193
  messages = [content_tag(:div, l(Time.current, :format => format), :class => 'timestamp')]
200
194
  messages << content_tag(:div, message, :class => 'message-content')
@@ -24,11 +24,11 @@ module ActiveScaffold
24
24
 
25
25
  module ClassMethods
26
26
  def marked_records
27
- Thread.current[:marked_records] ||= {}
27
+ ActiveScaffold::Registry.marked_records ||= {}
28
28
  end
29
29
 
30
30
  def marked_records=(marked)
31
- Thread.current[:marked_records] = marked
31
+ ActiveScaffold::Registry.marked_records = marked
32
32
  end
33
33
 
34
34
  def marked_record_ids
@@ -69,11 +69,7 @@ module ActiveScaffold
69
69
 
70
70
  def type_for_attribute(klass, column_name)
71
71
  if active_record? klass
72
- if klass.respond_to? :type_for_attribute
73
- klass.type_for_attribute column_name.to_s
74
- else # Rails.version < 4.2
75
- klass.column_types[column_name.to_s]
76
- end
72
+ klass.type_for_attribute column_name.to_s
77
73
  elsif mongoid? klass
78
74
  klass.fields[column_name.to_s].type
79
75
  end
@@ -19,7 +19,8 @@ class Paginator
19
19
  # (and the number of items to show per page, for
20
20
  # convenience, if the arity is 2)
21
21
  def initialize(count, per_page, &select)
22
- @count, @per_page = count, per_page
22
+ @count = count
23
+ @per_page = per_page
23
24
  unless select
24
25
  raise MissingSelectError, 'Must provide block to select data for each page'
25
26
  end
@@ -28,7 +29,7 @@ class Paginator
28
29
 
29
30
  # Total number of pages
30
31
  def number_of_pages
31
- (@count / @per_page).to_i + (@count % @per_page > 0 ? 1 : 0)
32
+ (@count / @per_page).to_i + ((@count % @per_page).positive? ? 1 : 0)
32
33
  end
33
34
 
34
35
  # First page object
@@ -57,7 +58,7 @@ class Paginator
57
58
 
58
59
  # Retrieve page object by number
59
60
  def page(number)
60
- number = (n = number.to_i) > 0 ? n : 1
61
+ number = [1, number.to_i].max
61
62
  Page.new(self, number) do
62
63
  offset = (number - 1) * @per_page
63
64
  args = [offset]
@@ -80,7 +81,8 @@ class Paginator
80
81
  attr_reader :number, :pager
81
82
 
82
83
  def initialize(pager, number, &select) #:nodoc:
83
- @pager, @number = pager, number
84
+ @pager = pager
85
+ @number = number
84
86
  @offset = (number - 1) * pager.per_page
85
87
  @select = select
86
88
  end