active_scaffold 3.4.43 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +39 -0
  3. data/{LICENSE → LICENSE.md} +1 -1
  4. data/README.md +27 -19
  5. data/app/assets/javascripts/active_scaffold.js.erb +1 -1
  6. data/app/assets/javascripts/jquery/active_scaffold.js +95 -43
  7. data/app/assets/javascripts/jquery/tiny_mce_bridge.js +30 -6
  8. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +11 -1
  9. data/app/assets/stylesheets/active_scaffold_colors.scss +2 -2
  10. data/app/assets/stylesheets/active_scaffold_layout.css +36 -28
  11. data/app/views/active_scaffold_overrides/_base_form.html.erb +2 -3
  12. data/app/views/active_scaffold_overrides/_field_search.html.erb +8 -7
  13. data/app/views/active_scaffold_overrides/_form_association.html.erb +9 -9
  14. data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +6 -6
  15. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +52 -50
  16. data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +1 -1
  17. data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +1 -1
  18. data/app/views/active_scaffold_overrides/_human_conditions.html.erb +3 -1
  19. data/app/views/active_scaffold_overrides/_list_calculations.html.erb +1 -1
  20. data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +2 -0
  21. data/app/views/active_scaffold_overrides/_list_messages.html.erb +5 -3
  22. data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -1
  23. data/app/views/active_scaffold_overrides/_list_with_header.html.erb +9 -9
  24. data/app/views/active_scaffold_overrides/_messages.html.erb +1 -1
  25. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +18 -10
  26. data/app/views/active_scaffold_overrides/_render_field.js.erb +3 -3
  27. data/app/views/active_scaffold_overrides/_search.html.erb +7 -6
  28. data/app/views/active_scaffold_overrides/_show_actions.html.erb +14 -0
  29. data/app/views/active_scaffold_overrides/_show_association.html.erb +1 -1
  30. data/app/views/active_scaffold_overrides/_update_actions.html.erb +6 -2
  31. data/app/views/active_scaffold_overrides/_update_column.js.erb +1 -1
  32. data/app/views/active_scaffold_overrides/_update_form.html.erb +1 -1
  33. data/app/views/active_scaffold_overrides/destroy.js.erb +2 -3
  34. data/app/views/active_scaffold_overrides/edit_associated.js.erb +4 -3
  35. data/app/views/active_scaffold_overrides/on_action_update.js.erb +5 -3
  36. data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
  37. data/app/views/active_scaffold_overrides/on_update.js.erb +6 -6
  38. data/app/views/active_scaffold_overrides/show.html.erb +6 -0
  39. data/app/views/active_scaffold_overrides/update.html.erb +1 -1
  40. data/app/views/active_scaffold_overrides/update_column.js.erb +1 -1
  41. data/config/brakeman.ignore +26 -0
  42. data/config/brakeman.yml +3 -0
  43. data/config/i18n-tasks.yml +121 -0
  44. data/config/locales/de.yml +81 -70
  45. data/config/locales/en.yml +83 -74
  46. data/config/locales/es.yml +82 -73
  47. data/config/locales/fr.yml +86 -75
  48. data/config/locales/hu.yml +81 -70
  49. data/config/locales/ja.yml +71 -60
  50. data/config/locales/ru.yml +85 -74
  51. data/lib/active_scaffold.rb +3 -0
  52. data/lib/active_scaffold/actions/common_search.rb +11 -7
  53. data/lib/active_scaffold/actions/core.rb +119 -47
  54. data/lib/active_scaffold/actions/create.rb +1 -1
  55. data/lib/active_scaffold/actions/delete.rb +11 -8
  56. data/lib/active_scaffold/actions/field_search.rb +104 -6
  57. data/lib/active_scaffold/actions/list.rb +25 -21
  58. data/lib/active_scaffold/actions/mark.rb +12 -4
  59. data/lib/active_scaffold/actions/nested.rb +26 -26
  60. data/lib/active_scaffold/actions/search.rb +2 -2
  61. data/lib/active_scaffold/actions/show.rb +4 -5
  62. data/lib/active_scaffold/actions/subform.rb +9 -7
  63. data/lib/active_scaffold/actions/update.rb +20 -13
  64. data/lib/active_scaffold/active_record_permissions.rb +24 -5
  65. data/lib/active_scaffold/attribute_params.rb +68 -49
  66. data/lib/active_scaffold/bridges.rb +1 -1
  67. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +15 -19
  68. data/lib/active_scaffold/bridges/bitfields.rb +1 -1
  69. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +10 -14
  70. data/lib/active_scaffold/bridges/calendar_date_select.rb +0 -7
  71. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +19 -22
  72. data/lib/active_scaffold/bridges/cancan.rb +4 -3
  73. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +11 -21
  74. data/lib/active_scaffold/bridges/carrierwave.rb +2 -1
  75. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +2 -6
  76. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +6 -39
  77. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +1 -1
  78. data/lib/active_scaffold/bridges/chosen.rb +4 -1
  79. data/lib/active_scaffold/bridges/chosen/helpers.rb +3 -2
  80. data/lib/active_scaffold/bridges/country_select/country_select_bridge_helper.rb +2 -2
  81. data/lib/active_scaffold/bridges/date_picker.rb +3 -0
  82. data/lib/active_scaffold/bridges/date_picker/ext.rb +43 -38
  83. data/lib/active_scaffold/bridges/date_picker/helper.rb +24 -23
  84. data/lib/active_scaffold/bridges/dragonfly.rb +1 -1
  85. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +3 -7
  86. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +3 -25
  87. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +2 -2
  88. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +6 -8
  89. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +1 -1
  90. data/lib/active_scaffold/bridges/file_column/form_ui.rb +0 -2
  91. data/lib/active_scaffold/bridges/file_column/list_ui.rb +2 -1
  92. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +1 -1
  93. data/lib/active_scaffold/bridges/paper_trail/actions.rb +1 -1
  94. data/lib/active_scaffold/bridges/paper_trail/helper.rb +1 -2
  95. data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +3 -7
  96. data/lib/active_scaffold/bridges/paperclip.rb +1 -1
  97. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +3 -28
  98. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
  99. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +3 -7
  100. data/lib/active_scaffold/bridges/record_select.rb +2 -0
  101. data/lib/active_scaffold/bridges/record_select/helpers.rb +14 -18
  102. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +4 -8
  103. data/lib/active_scaffold/bridges/shared/date_bridge.rb +20 -20
  104. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +7 -22
  105. data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +14 -14
  106. data/lib/active_scaffold/config/base.rb +9 -6
  107. data/lib/active_scaffold/config/core.rb +30 -21
  108. data/lib/active_scaffold/config/create.rb +2 -1
  109. data/lib/active_scaffold/config/delete.rb +2 -2
  110. data/lib/active_scaffold/config/field_search.rb +9 -3
  111. data/lib/active_scaffold/config/form.rb +4 -4
  112. data/lib/active_scaffold/config/list.rb +27 -23
  113. data/lib/active_scaffold/config/nested.rb +4 -4
  114. data/lib/active_scaffold/config/search.rb +6 -6
  115. data/lib/active_scaffold/config/show.rb +11 -1
  116. data/lib/active_scaffold/config/subform.rb +1 -1
  117. data/lib/active_scaffold/config/update.rb +4 -2
  118. data/lib/active_scaffold/constraints.rb +39 -36
  119. data/lib/active_scaffold/core.rb +36 -15
  120. data/lib/active_scaffold/data_structures/action_columns.rb +14 -9
  121. data/lib/active_scaffold/data_structures/action_link.rb +4 -5
  122. data/lib/active_scaffold/data_structures/action_links.rb +5 -4
  123. data/lib/active_scaffold/data_structures/actions.rb +2 -2
  124. data/lib/active_scaffold/data_structures/association.rb +8 -0
  125. data/lib/active_scaffold/data_structures/association/abstract.rb +147 -0
  126. data/lib/active_scaffold/data_structures/association/active_mongoid.rb +42 -0
  127. data/lib/active_scaffold/data_structures/association/active_record.rb +94 -0
  128. data/lib/active_scaffold/data_structures/association/mongoid.rb +45 -0
  129. data/lib/active_scaffold/data_structures/bridge.rb +3 -6
  130. data/lib/active_scaffold/data_structures/column.rb +100 -82
  131. data/lib/active_scaffold/data_structures/columns.rb +21 -3
  132. data/lib/active_scaffold/data_structures/nested_info.rb +22 -37
  133. data/lib/active_scaffold/data_structures/set.rb +4 -4
  134. data/lib/active_scaffold/data_structures/sorting.rb +29 -15
  135. data/lib/active_scaffold/engine.rb +3 -1
  136. data/lib/active_scaffold/extensions/action_controller_rendering.rb +10 -5
  137. data/lib/active_scaffold/extensions/action_view_rendering.rb +65 -59
  138. data/lib/active_scaffold/extensions/left_outer_joins.rb +48 -53
  139. data/lib/active_scaffold/extensions/localize.rb +3 -4
  140. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +7 -11
  141. data/lib/active_scaffold/extensions/paginator_extensions.rb +20 -18
  142. data/lib/active_scaffold/extensions/routing_mapper.rb +104 -40
  143. data/lib/active_scaffold/extensions/to_label.rb +1 -1
  144. data/lib/active_scaffold/extensions/unsaved_associated.rb +4 -13
  145. data/lib/active_scaffold/extensions/unsaved_record.rb +12 -1
  146. data/lib/active_scaffold/finder.rb +200 -134
  147. data/lib/active_scaffold/helpers/action_link_helpers.rb +398 -0
  148. data/lib/active_scaffold/helpers/association_helpers.rb +12 -30
  149. data/lib/active_scaffold/helpers/controller_helpers.rb +74 -24
  150. data/lib/active_scaffold/helpers/form_column_helpers.rb +205 -112
  151. data/lib/active_scaffold/helpers/human_condition_helpers.rb +21 -11
  152. data/lib/active_scaffold/helpers/id_helpers.rb +1 -1
  153. data/lib/active_scaffold/helpers/list_column_helpers.rb +117 -39
  154. data/lib/active_scaffold/helpers/pagination_helpers.rb +11 -14
  155. data/lib/active_scaffold/helpers/search_column_helpers.rb +69 -32
  156. data/lib/active_scaffold/helpers/show_column_helpers.rb +9 -3
  157. data/lib/active_scaffold/helpers/view_helpers.rb +41 -426
  158. data/lib/active_scaffold/orm_checks.rb +109 -0
  159. data/lib/active_scaffold/paginator.rb +1 -1
  160. data/lib/active_scaffold/responds_to_parent.rb +12 -10
  161. data/lib/active_scaffold/tableless.rb +81 -43
  162. data/lib/active_scaffold/version.rb +2 -2
  163. data/lib/generators/active_scaffold/controller_generator.rb +49 -0
  164. data/lib/generators/active_scaffold/install_generator.rb +45 -0
  165. data/lib/generators/active_scaffold/resource_generator.rb +56 -0
  166. data/lib/generators/{active_scaffold_controller/templates → templates}/controller.rb +0 -0
  167. data/lib/generators/{active_scaffold_controller/templates → templates}/helper.rb +0 -0
  168. data/shoulda_macros/macros.rb +3 -3
  169. data/test/active_scaffold_config_mock.rb +33 -0
  170. data/test/bridges/bridge_test.rb +9 -9
  171. data/test/bridges/date_picker_test.rb +3 -1
  172. data/test/bridges/paper_trail_test.rb +2 -3
  173. data/test/bridges/paperclip_test.rb +21 -10
  174. data/test/bridges/tiny_mce_test.rb +20 -21
  175. data/test/class_with_finder.rb +42 -0
  176. data/test/company.rb +6 -4
  177. data/test/config/core_test.rb +1 -1
  178. data/test/config/create_test.rb +1 -1
  179. data/test/config/list_test.rb +3 -3
  180. data/test/config/update_test.rb +3 -3
  181. data/test/data_structures/action_columns_test.rb +3 -3
  182. data/test/data_structures/association_column_test.rb +5 -5
  183. data/test/data_structures/column_test.rb +14 -14
  184. data/test/data_structures/columns_test.rb +2 -2
  185. data/test/data_structures/set_test.rb +2 -2
  186. data/test/data_structures/sorting_test.rb +6 -4
  187. data/test/extensions/active_record_test.rb +1 -1
  188. data/test/extensions/routing_mapper_test.rb +64 -13
  189. data/test/helpers/form_column_helpers_test.rb +6 -6
  190. data/test/helpers/list_column_helpers_test.rb +9 -5
  191. data/test/helpers/pagination_helpers_test.rb +1 -0
  192. data/test/misc/active_record_permissions_test.rb +18 -1
  193. data/test/misc/attribute_params_test.rb +26 -17
  194. data/test/misc/calculation_test.rb +8 -31
  195. data/test/misc/configurable_test.rb +3 -2
  196. data/test/misc/constraints_test.rb +33 -22
  197. data/test/misc/convert_numbers_format_test.rb +28 -10
  198. data/test/misc/finder_test.rb +6 -29
  199. data/test/misc/parse_datetime_test.rb +160 -0
  200. data/test/misc/render_test.rb +1 -1
  201. data/test/misc/tableless_test.rb +24 -0
  202. data/test/mock_app/app/models/building.rb +2 -1
  203. data/test/mock_app/config.ru +1 -1
  204. data/test/mock_app/config/environments/test.rb +1 -1
  205. data/test/mock_app/config/routes.rb +11 -3
  206. data/test/model_stub.rb +11 -6
  207. data/test/run_all.rb +1 -1
  208. data/test/test_helper.rb +19 -4
  209. metadata +42 -23
  210. data/lib/active_scaffold/data_structures/error_message.rb +0 -22
  211. data/lib/active_scaffold/extensions/reverse_associations.rb +0 -119
  212. data/lib/generators/active_scaffold/USAGE +0 -29
  213. data/lib/generators/active_scaffold/active_scaffold_generator.rb +0 -21
  214. data/lib/generators/active_scaffold_controller/USAGE +0 -19
  215. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +0 -29
  216. data/test/data_structures/error_message_test.rb +0 -25
@@ -1,7 +1,7 @@
1
1
  module ActiveScaffold::Actions
2
2
  module Create
3
3
  def self.included(base)
4
- base.before_filter :create_authorized_filter, :only => [:new, :create]
4
+ base.before_action :create_authorized_filter, :only => %i[new create]
5
5
  end
6
6
 
7
7
  def new
@@ -1,7 +1,7 @@
1
1
  module ActiveScaffold::Actions
2
2
  module Delete
3
3
  def self.included(base)
4
- base.before_filter :delete_authorized_filter, :only => [:destroy]
4
+ base.before_action :delete_authorized_filter, :only => [:destroy]
5
5
  end
6
6
 
7
7
  def destroy
@@ -14,7 +14,7 @@ module ActiveScaffold::Actions
14
14
  protected
15
15
 
16
16
  def destroy_respond_to_html
17
- flash[:info] = as_(:deleted_model, :model => ERB::Util.h(@record.to_label)) if self.successful?
17
+ flash[:info] = as_(:deleted_model, :model => ERB::Util.h(@record.to_label)) if successful?
18
18
  return_to_main
19
19
  end
20
20
 
@@ -41,29 +41,32 @@ module ActiveScaffold::Actions
41
41
  record ||= destroy_find_record
42
42
  begin
43
43
  self.successful = record.destroy
44
- rescue StandardError => ex
44
+ rescue StandardError => exception
45
45
  flash[:warning] = as_(:cant_destroy_record, :record => ERB::Util.h(record.to_label))
46
46
  self.successful = false
47
- logger.debug ex.message
48
- logger.debug ex.backtrace.join("\n")
47
+ logger.warn do
48
+ "\n\n#{exception.class} (#{exception.message}):\n " +
49
+ Rails.backtrace_cleaner.clean(exception.backtrace).join("\n ") +
50
+ "\n\n"
51
+ end
49
52
  end
50
53
  end
51
54
 
52
55
  # The default security delegates to ActiveRecordPermissions.
53
56
  # You may override the method to customize.
54
57
  def delete_authorized?(record = nil)
55
- (!nested? || !nested.readonly?) && (record || self).authorized_for?(:crud_type => :delete)
58
+ (!nested? || !nested.readonly?) && (record || self).authorized_for?(crud_type: :delete, reason: true)
56
59
  end
57
60
 
58
61
  def delete_ignore?(record = nil)
59
- (nested? && nested.readonly?) || !self.authorized_for?(:crud_type => :delete)
62
+ (nested? && nested.readonly?) || !authorized_for?(:crud_type => :delete)
60
63
  end
61
64
 
62
65
  private
63
66
 
64
67
  def delete_authorized_filter
65
68
  link = active_scaffold_config.delete.link || active_scaffold_config.delete.class.link
66
- raise ActiveScaffold::ActionNotAllowed unless send(link.security_method)
69
+ raise ActiveScaffold::ActionNotAllowed unless Array(send(link.security_method))[0]
67
70
  end
68
71
 
69
72
  def destroy_formats
@@ -1,9 +1,11 @@
1
1
  module ActiveScaffold::Actions
2
2
  module FieldSearch
3
3
  def self.included(base)
4
- base.helper_method :field_search_params
5
- base.send :include, ActiveScaffold::Actions::CommonSearch
6
- base.send :include, InstanceMethods
4
+ base.class_eval do
5
+ helper_method :field_search_params, :grouped_search?, :search_group_column, :search_group_function
6
+ include ActiveScaffold::Actions::CommonSearch
7
+ include InstanceMethods
8
+ end
7
9
  end
8
10
 
9
11
  module InstanceMethods
@@ -30,6 +32,102 @@ module ActiveScaffold::Actions
30
32
  params[:search] = default_params.is_a?(Proc) ? instance_eval(&default_params) : default_params
31
33
  end
32
34
 
35
+ def grouped_search?
36
+ field_search_params.present? && field_search_params['active_scaffold_group'].present?
37
+ end
38
+
39
+ def setup_search_group
40
+ @_search_group_name, @_search_group_function = field_search_params['active_scaffold_group'].to_s.split('#')
41
+ end
42
+
43
+ def search_group_function
44
+ setup_search_group unless defined? @_search_group_function
45
+ @_search_group_function
46
+ end
47
+
48
+ def search_group_name
49
+ setup_search_group unless defined? @_search_group_name
50
+ @_search_group_name
51
+ end
52
+
53
+ def search_group_column
54
+ active_scaffold_config.columns[search_group_name] if search_group_name
55
+ end
56
+
57
+ def custom_finder_options
58
+ if grouped_search?
59
+ group_sql = calculation_for_group_by(search_group_column.try(:field) || search_group_name)
60
+ group_by = group_sql.respond_to?(:to_sql) ? group_sql.to_sql : group_sql
61
+
62
+ select_query = quoted_select_columns(search_group_column.try(:select_columns))
63
+ select_query << group_sql.as(search_group_column.name.to_s) if search_group_column && group_sql.respond_to?(:to_sql)
64
+ if active_scaffold_config.model.columns_hash.include?(active_scaffold_config.model.inheritance_column)
65
+ select_query << active_scaffold_config.columns[active_scaffold_config.model.inheritance_column].field
66
+ end
67
+ grouped_columns_calculations.each do |name, part|
68
+ select_query << (part.respond_to?(:as) ? part : Arel::Nodes::SqlLiteral.new(part)).as(name.to_s)
69
+ end
70
+
71
+ {group: group_by, select: select_query}
72
+ else
73
+ super
74
+ end
75
+ end
76
+
77
+ def grouped_columns_calculations
78
+ @grouped_columns_calculations ||= list_columns[1..-1].each_with_object({}) do |c, h|
79
+ h[c.name] = calculation_for_group_search(c)
80
+ end
81
+ end
82
+
83
+ def calculation_for_group_search(column)
84
+ sql_function column.calculate.to_s, column.active_record_class.arel_table[column.name]
85
+ end
86
+
87
+ def calculation_for_group_by(group_sql)
88
+ return group_sql unless search_group_function
89
+ group_sql = Arel::Nodes::SqlLiteral.new(group_sql)
90
+ case search_group_function
91
+ when 'year', 'month', 'quarter'
92
+ sql_function(search_group_function, group_sql)
93
+ when 'year_month'
94
+ sql_function('extract', sql_operator(Arel::Nodes::SqlLiteral.new('YEAR_MONTH'), 'FROM', group_sql))
95
+ when 'year_quarter'
96
+ sql_operator(sql_operator(sql_function('year', group_sql), '*', 10), '+', sql_function('quarter', group_sql))
97
+ else
98
+ raise "#{search_group_function} unsupported, override calculation_for_group_by in #{self.class.name}"
99
+ end
100
+ end
101
+
102
+ def sql_function(function, *args)
103
+ args.map! { |arg| quoted_arel_value(arg) }
104
+ Arel::Nodes::NamedFunction.new(function, args)
105
+ end
106
+
107
+ def sql_operator(arg1, operator, arg2)
108
+ Arel::Nodes::InfixOperation.new(operator, quoted_arel_value(arg1), quoted_arel_value(arg2))
109
+ end
110
+
111
+ def quoted_arel_value(value)
112
+ value.is_a?(Arel::Predications) ? value : Arel::Nodes::Quoted.new(value)
113
+ end
114
+
115
+ def list_columns
116
+ @list_columns ||= if grouped_search?
117
+ columns = grouped_columns || super.select(&:calculation?)
118
+ [search_group_column || search_group_name].concat columns
119
+ else
120
+ super
121
+ end
122
+ end
123
+
124
+ def grouped_columns
125
+ return if active_scaffold_config.field_search.grouped_columns.blank?
126
+ active_scaffold_config.field_search.grouped_columns.map do |col|
127
+ active_scaffold_config.columns[col]
128
+ end.compact
129
+ end
130
+
33
131
  def field_search_params
34
132
  search_params.is_a?(Hash) ? search_params : {}
35
133
  end
@@ -43,7 +141,7 @@ module ActiveScaffold::Actions
43
141
  end
44
142
 
45
143
  def do_search
46
- if search_params.is_a?(Hash) && search_params.present?
144
+ if field_search_params.present?
47
145
  filtered_columns = []
48
146
  text_search = active_scaffold_config.field_search.text_search
49
147
  columns = active_scaffold_config.field_search.columns
@@ -54,7 +152,7 @@ module ActiveScaffold::Actions
54
152
  search_condition = self.class.condition_for_column(column, value, text_search)
55
153
  next if search_condition.blank?
56
154
 
57
- if count_includes.nil? && column.includes.present? && list_columns.include?(column)
155
+ if count_includes.nil? && column.includes.present? && list_columns.include?(column) && !grouped_search?
58
156
  active_scaffold_references << column.includes
59
157
  elsif column.search_joins.present?
60
158
  active_scaffold_outer_joins << column.search_joins
@@ -62,7 +160,7 @@ module ActiveScaffold::Actions
62
160
  active_scaffold_conditions << search_condition
63
161
  filtered_columns << column
64
162
  end
65
- unless filtered_columns.blank?
163
+ if filtered_columns.present? || grouped_search?
66
164
  @filtered = active_scaffold_config.field_search.human_conditions ? filtered_columns : true
67
165
  end
68
166
 
@@ -1,7 +1,7 @@
1
1
  module ActiveScaffold::Actions
2
2
  module List
3
3
  def self.included(base)
4
- base.before_filter :list_authorized_filter, :only => :index
4
+ base.before_action :list_authorized_filter, :only => :index
5
5
  base.helper_method :list_columns
6
6
  end
7
7
 
@@ -22,7 +22,7 @@ module ActiveScaffold::Actions
22
22
  end
23
23
 
24
24
  def list
25
- if %w(index list).include? action_name
25
+ if %w[index list].include? action_name
26
26
  do_list
27
27
  else
28
28
  do_refresh_list
@@ -43,6 +43,7 @@ module ActiveScaffold::Actions
43
43
  render(:partial => 'list_with_header')
44
44
  else
45
45
  @auto_pagination = params[:auto_pagination]
46
+ @popstate = params.delete(:_popstate)
46
47
  render :partial => 'refresh_list', :formats => [:js]
47
48
  end
48
49
  end
@@ -73,21 +74,20 @@ module ActiveScaffold::Actions
73
74
  active_scaffold_config.send(action).columns.collect_visible(:flatten => true)
74
75
  end
75
76
  joins_cols, preload_cols = columns.select { |c| c.includes.present? }.partition do |col|
76
- includes_need_join?(col, sorting)
77
+ includes_need_join?(col, sorting) && !grouped_search?
77
78
  end
78
79
  active_scaffold_references.concat joins_cols.map(&:includes).flatten.uniq
79
80
  active_scaffold_preload.concat preload_cols.map(&:includes).flatten.uniq
80
- set_includes_for_sorting(columns, sorting) if Rails::VERSION::MAJOR >= 4 && sorting.sorts_by_sql?
81
+ set_includes_for_sorting(columns, sorting) if sorting.sorts_by_sql?
81
82
  end
82
83
 
83
84
  def set_includes_for_sorting(columns, sorting)
84
85
  sorting.each do |col, _|
85
- if col.includes.present? && !columns.include?(col)
86
- if active_scaffold_config.model.connection.needs_order_expressions_in_select?
87
- active_scaffold_references << col.includes
88
- else
89
- active_scaffold_outer_joins << col.includes
90
- end
86
+ next unless col.includes.present? && !columns.include?(col)
87
+ if active_scaffold_config.model.connection.needs_order_expressions_in_select?
88
+ active_scaffold_references << col.includes
89
+ else
90
+ active_scaffold_outer_joins << col.includes
91
91
  end
92
92
  end
93
93
  end
@@ -97,8 +97,8 @@ module ActiveScaffold::Actions
97
97
  end
98
98
 
99
99
  def scoped_habtm?(column)
100
- assoc = column.association if column.plural_association?
101
- assoc && assoc.macro == :has_and_belongs_to_many && assoc.respond_to?(:scope) && assoc.scope
100
+ assoc = column.association if column.association.try :collection?
101
+ assoc && assoc.habtm? && assoc.scope
102
102
  end
103
103
 
104
104
  def get_row(crud_type_or_security_options = :read)
@@ -108,17 +108,18 @@ module ActiveScaffold::Actions
108
108
 
109
109
  # The actual algorithm to prepare for the list view
110
110
  def do_list
111
+ # id: nil needed in params_for because rails reuse it even
112
+ # if it was deleted from params (like do_refresh_list does)
113
+ @remove_id_from_list_links = params[:id].blank?
111
114
  set_includes_for_columns
112
115
 
113
116
  options = {:sorting => active_scaffold_config.list.user.sorting,
114
117
  :count_includes => active_scaffold_config.list.user.count_includes}
115
- paginate = (params[:format].nil?) ? (accepts? :html, :js) : %w(html js).include?(params[:format])
118
+ paginate = params[:format].nil? ? (accepts? :html, :js) : %w[html js].include?(params[:format])
116
119
  options[:pagination] = active_scaffold_config.list.pagination if paginate
117
120
  if options[:pagination]
118
- options.merge!(
119
- :per_page => active_scaffold_config.list.user.per_page,
120
- :page => active_scaffold_config.list.user.page
121
- )
121
+ options[:per_page] = active_scaffold_config.list.user.per_page
122
+ options[:page] = active_scaffold_config.list.user.page
122
123
  end
123
124
  if active_scaffold_config.list.auto_select_columns
124
125
  auto_select_columns = list_columns + [active_scaffold_config.columns[active_scaffold_config.model.primary_key]]
@@ -140,7 +141,10 @@ module ActiveScaffold::Actions
140
141
 
141
142
  def do_refresh_list
142
143
  params.delete(:id)
143
- do_search if respond_to? :do_search, true
144
+ if respond_to? :do_search, true
145
+ store_search_params_into_session if search_params.blank?
146
+ do_search
147
+ end
144
148
  do_list
145
149
  end
146
150
 
@@ -172,7 +176,7 @@ module ActiveScaffold::Actions
172
176
  end
173
177
 
174
178
  def action_update_respond_to_js
175
- do_refresh_list unless @record.present?
179
+ do_refresh_list if @record.blank?
176
180
  super
177
181
  end
178
182
 
@@ -197,10 +201,10 @@ module ActiveScaffold::Actions
197
201
  def list_formats
198
202
  (default_formats + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
199
203
  end
200
- alias_method :index_formats, :list_formats
204
+ alias index_formats list_formats
201
205
 
202
206
  def row_formats
203
- ([:html, :js] + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
207
+ (%i[html js] + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
204
208
  end
205
209
 
206
210
  def action_update_formats
@@ -1,8 +1,8 @@
1
1
  module ActiveScaffold::Actions
2
2
  module Mark
3
3
  def self.included(base)
4
- base.before_filter :mark_authorized?, :only => :mark
5
- base.before_filter :assign_marked_records_to_model
4
+ base.before_action :mark_authorized_filter, :only => :mark
5
+ base.before_action :assign_marked_records_to_model
6
6
  base.helper_method :marked_records
7
7
  end
8
8
 
@@ -45,7 +45,11 @@ module ActiveScaffold::Actions
45
45
  end
46
46
 
47
47
  def mark?
48
- @mark ||= [true, 'true', 1, '1', 'T', 't'].include?(params[:value].class == String ? params[:value].downcase : params[:value])
48
+ @mark ||= begin
49
+ value = params.delete :value
50
+ value.downcase! if value.is_a? String
51
+ [true, 'true', 1, '1', 't'].include? value
52
+ end
49
53
  end
50
54
 
51
55
  def mark_all_scope_forced?
@@ -80,7 +84,11 @@ module ActiveScaffold::Actions
80
84
  # The default security delegates to ActiveRecordPermissions.
81
85
  # You may override the method to customize.
82
86
  def mark_authorized?
83
- authorized_for?(:crud_type => :read)
87
+ authorized_for?(crud_type: :read)
88
+ end
89
+
90
+ def mark_authorized_filter
91
+ raise ActiveScaffold::ActionNotAllowed unless mark_authorized?
84
92
  end
85
93
 
86
94
  def mark_formats
@@ -4,11 +4,11 @@ module ActiveScaffold::Actions
4
4
  def self.included(base)
5
5
  super
6
6
  base.module_eval do
7
- before_filter :set_nested
8
- before_filter :configure_nested
7
+ before_action :set_nested
8
+ before_action :configure_nested
9
9
  include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.model.reflect_on_all_associations.any? { |a| a.macro == :has_and_belongs_to_many }
10
10
  end
11
- base.before_filter :include_habtm_actions
11
+ base.before_action :include_habtm_actions
12
12
  base.helper_method :nested
13
13
  base.helper_method :nested_parent_record
14
14
  end
@@ -25,6 +25,7 @@ module ActiveScaffold::Actions
25
25
  end
26
26
 
27
27
  def set_nested
28
+ @nested = nil
28
29
  return unless params[:parent_scaffold] && (params[:association] || params[:named_scope])
29
30
  @nested = ActiveScaffold::DataStructures::NestedInfo.get(active_scaffold_config.model, params)
30
31
  register_constraints_with_action_columns(@nested.constrained_fields) unless @nested.nil?
@@ -33,7 +34,10 @@ module ActiveScaffold::Actions
33
34
  def configure_nested
34
35
  return unless nested?
35
36
  active_scaffold_config.list.user.label = nested_label
36
- active_scaffold_config.list.user.nested_default_sorting = nested_default_sorting if nested.sorted? && !active_scaffold_config.nested.ignore_order_from_association
37
+ unless active_scaffold_config.nested.ignore_order_from_association
38
+ chain = beginning_of_chain
39
+ active_scaffold_config.list.user.nested_default_sorting = nested_default_sorting(chain) if nested.sorted?(chain)
40
+ end
37
41
  end
38
42
 
39
43
  def nested_label
@@ -44,8 +48,8 @@ module ActiveScaffold::Actions
44
48
  end
45
49
  end
46
50
 
47
- def nested_default_sorting
48
- {:table_name => active_scaffold_config.model.model_name, :default_sorting => nested.default_sorting}
51
+ def nested_default_sorting(chain)
52
+ {:table_name => active_scaffold_config._table_name, :default_sorting => nested.default_sorting(chain)}
49
53
  end
50
54
 
51
55
  def nested_authorized?(record = nil)
@@ -59,7 +63,7 @@ module ActiveScaffold::Actions
59
63
  if active_scaffold_config.nested.shallow_delete
60
64
  active_scaffold_config.action_links.add('destroy_existing', :label => :remove, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :position => false, :security_method => :delete_existing_authorized?) unless active_scaffold_config.action_links['destroy_existing']
61
65
  if active_scaffold_config.actions.include?(:delete)
62
- active_scaffold_config.action_links.delete('delete') if active_scaffold_config.action_links['delete']
66
+ active_scaffold_config.action_links.delete('destroy') if active_scaffold_config.action_links['destroy']
63
67
  end
64
68
  end
65
69
  else
@@ -69,7 +73,7 @@ module ActiveScaffold::Actions
69
73
  if active_scaffold_config.nested.shallow_delete
70
74
  active_scaffold_config.action_links.delete('destroy_existing') if active_scaffold_config.action_links['destroy_existing']
71
75
  if active_scaffold_config.actions.include?(:delete) && active_scaffold_config.delete.link
72
- active_scaffold_config.action_links.add(active_scaffold_config.delete.link) unless active_scaffold_config.action_links['delete']
76
+ active_scaffold_config.action_links.add(active_scaffold_config.delete.link) unless active_scaffold_config.action_links['destroy']
73
77
  end
74
78
  end
75
79
  end
@@ -79,22 +83,14 @@ module ActiveScaffold::Actions
79
83
  if nested? && nested.association
80
84
  if nested.association.collection?
81
85
  nested_parent_record.send(nested.association.name)
82
- elsif nested.association.options[:through] # has_one :through
86
+ elsif nested.association.through? # has_one :through
83
87
  active_scaffold_config.model.where(active_scaffold_config.model.primary_key => nested_parent_record.send(nested.association.name).try(:id))
84
- elsif nested.child_association.nil? # without child_association is not possible to add conditions
85
- active_scaffold_config.model
86
- elsif nested.child_association.belongs_to?
88
+ elsif nested.association.has_one?
87
89
  active_scaffold_config.model.where(nested.child_association.foreign_key => nested_parent_record.send(nested.association.association_primary_key))
88
90
  elsif nested.association.belongs_to?
89
- chain = active_scaffold_config.model.joins(nested.child_association.name)
90
- table_name =
91
- if active_scaffold_config.model == nested.association.active_record
92
- dependency = ActiveRecord::Associations::JoinDependency.new(chain.klass, chain.joins_values, [])
93
- join_associations = Rails.version >= '4.1.0' ? dependency.join_root.children : dependency.join_associations
94
- join_associations.find {|join| join.try(:reflection).try(:name) == nested.child_association.name}.try(:table).try(:right)
95
- end
96
- table_name ||= nested.association.active_record.table_name
97
- chain.where(table_name => {nested.association.active_record.primary_key => nested_parent_record}).readonly(false)
91
+ nested_belongs_to_chain
92
+ else # never should get here
93
+ active_scaffold_config.model
98
94
  end
99
95
  elsif nested? && nested.scope
100
96
  nested_parent_record.send(nested.scope)
@@ -103,6 +99,11 @@ module ActiveScaffold::Actions
103
99
  end
104
100
  end
105
101
 
102
+ def nested_belongs_to_chain
103
+ primary_key = active_scaffold_config.mongoid? ? '_id' : active_scaffold_config.model.primary_key
104
+ active_scaffold_config.model.where(primary_key => nested_parent_record.send(nested.association.name))
105
+ end
106
+
106
107
  def nested_parent_record(crud = :read)
107
108
  @nested_parent_record ||= find_if_allowed(nested.parent_id, crud, nested.parent_model)
108
109
  end
@@ -111,11 +112,10 @@ module ActiveScaffold::Actions
111
112
  # has_many is done by beginning_of_chain and rails
112
113
  return unless (nested.belongs_to? || nested.has_one? || nested.habtm?) && nested.child_association
113
114
  return if (parent = nested_parent_record).nil?
114
- case nested.child_association.macro
115
- when :has_one, :belongs_to
115
+ if nested.child_association.singular?
116
116
  record.send("#{nested.child_association.name}=", parent)
117
- when :has_many, :has_and_belongs_to_many
118
- record.send("#{nested.child_association.name}").send(:<<, parent)
117
+ else
118
+ record.send(nested.child_association.name) << parent
119
119
  end
120
120
  end
121
121
 
@@ -210,7 +210,7 @@ module ActiveScaffold::Actions::Nested
210
210
  end
211
211
 
212
212
  def delete_existing_authorized?(record = nil)
213
- nested_parent_record.authorized_for?(:crud_type => :update, :column => nested.association.try(:name))
213
+ nested_parent_record.authorized_for?(:crud_type => :update, :column => nested.association.try(:name), :reason => true)
214
214
  end
215
215
 
216
216
  def after_create_save(record)