active_scaffold 3.4.43 → 3.5.0

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.
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
@@ -13,13 +13,14 @@ module ActiveScaffold::Config
13
13
  def self.link
14
14
  @@link
15
15
  end
16
+
16
17
  def self.link=(val)
17
18
  @@link = val
18
19
  end
19
20
  @@link = ActiveScaffold::DataStructures::ActionLink.new('new', :label => :create_new, :type => :collection, :security_method => :create_authorized?, :ignore_method => :create_ignore?)
20
21
 
21
22
  # whether update form is opened after a create or not
22
- cattr_accessor :action_after_create
23
+ cattr_accessor :action_after_create, instance_accessor: false
23
24
  @@action_after_create = nil
24
25
 
25
26
  # instance-level configuration
@@ -11,11 +11,11 @@ module ActiveScaffold::Config
11
11
  # --------------------------
12
12
 
13
13
  # the ActionLink for this action
14
- cattr_accessor :link
14
+ cattr_accessor :link, instance_accessor: false
15
15
  @@link = ActiveScaffold::DataStructures::ActionLink.new('destroy', :label => :delete, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :crud_type => :delete, :position => false, :parameters => {:destroy_action => true}, :security_method => :delete_authorized?, :ignore_method => :delete_ignore?)
16
16
 
17
17
  # whether we should refresh list after destroy or not
18
- cattr_accessor :refresh_list
18
+ cattr_accessor :refresh_list, instance_accessor: false
19
19
  @@refresh_list = false
20
20
 
21
21
  # instance-level configuration
@@ -11,7 +11,7 @@ module ActiveScaffold::Config
11
11
  # global level configuration
12
12
  # --------------------------
13
13
  # the ActionLink for this action
14
- cattr_reader :link
14
+ cattr_reader :link, instance_accessor: false
15
15
  @@link = ActiveScaffold::DataStructures::ActionLink.new('show_search', :label => :search, :type => :collection, :security_method => :search_authorized?, :ignore_method => :field_search_ignore?)
16
16
 
17
17
  # A flag for how the search should do full-text searching in the database:
@@ -20,12 +20,12 @@ module ActiveScaffold::Config
20
20
  # * :end: LIKE %?
21
21
  # * false: LIKE ?
22
22
  # Default is :full
23
- cattr_accessor :text_search
23
+ cattr_accessor :text_search, instance_accessor: false
24
24
  @@text_search = :full
25
25
 
26
26
  # human conditions
27
27
  # instead of just filtered you may show the user a humanized search condition statment
28
- cattr_accessor :human_conditions
28
+ cattr_accessor :human_conditions, instance_accessor: false
29
29
  @@human_conditions = false
30
30
 
31
31
  # instance-level configuration
@@ -55,6 +55,12 @@ module ActiveScaffold::Config
55
55
  @optional_columns ||= []
56
56
  end
57
57
 
58
+ # add array of columns as options for group by to get aggregated listings
59
+ attr_accessor :group_options
60
+
61
+ # columns to display on aggregated listing
62
+ attr_accessor :grouped_columns
63
+
58
64
  # default search params
59
65
  # default_params = {:title => {"from"=>"test", "to"=>"", "opt"=>"%?%"}}
60
66
  attr_accessor :default_params
@@ -13,14 +13,14 @@ module ActiveScaffold::Config
13
13
  # global level configuration
14
14
  # --------------------------
15
15
  # show value of unauthorized columns instead of skip them
16
- class_attribute :show_unauthorized_columns
16
+ class_attribute :show_unauthorized_columns, instance_accessor: false
17
17
 
18
18
  # whether the form stays open after an update or not
19
- cattr_accessor :persistent
19
+ class_attribute :persistent, instance_accessor: false
20
20
  @@persistent = false
21
21
 
22
22
  # whether we should refresh list after update or not
23
- cattr_accessor :refresh_list
23
+ class_attribute :refresh_list, instance_accessor: false
24
24
  @@refresh_list = false
25
25
 
26
26
  # instance-level configuration
@@ -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.polymorphic_association? }.compact
46
+ columns.exclude(*@core.columns.collect { |c| c.name if c.association.try(:polymorphic?) }.compact)
47
47
  end
48
48
 
49
49
  # whether the form should be multipart
@@ -11,8 +11,8 @@ module ActiveScaffold::Config
11
11
  @page_links_outer_window = self.class.page_links_outer_window
12
12
 
13
13
  # originates here
14
- @sorting = ActiveScaffold::DataStructures::Sorting.new(@core.columns)
15
- @sorting.set_default_sorting(@core.model)
14
+ @sorting = ActiveScaffold::DataStructures::Sorting.new(@core.columns, @core.model)
15
+ @sorting.set_default_sorting
16
16
 
17
17
  # inherit from global scope
18
18
  @empty_field_text = self.class.empty_field_text
@@ -33,74 +33,74 @@ module ActiveScaffold::Config
33
33
  # global level configuration
34
34
  # --------------------------
35
35
  # include list header on refresh
36
- cattr_accessor :refresh_with_header
36
+ cattr_accessor :refresh_with_header, instance_accessor: false
37
37
  @@refresh_with_header = false
38
38
 
39
39
  # how many records to show per page
40
- cattr_accessor :per_page
40
+ cattr_accessor :per_page, instance_accessor: false
41
41
  @@per_page = 15
42
42
 
43
43
  # how many page links around current page to show
44
- cattr_accessor :page_links_inner_window
44
+ cattr_accessor :page_links_inner_window, instance_accessor: false
45
45
  @@page_links_inner_window = 2
46
46
 
47
47
  # how many page links around first and last page to show
48
- cattr_accessor :page_links_outer_window
48
+ cattr_accessor :page_links_outer_window, instance_accessor: false
49
49
  @@page_links_outer_window = 0
50
50
 
51
51
  # what string to use when a field is empty
52
- cattr_accessor :empty_field_text
52
+ cattr_accessor :empty_field_text, instance_accessor: false
53
53
  @@empty_field_text = '-'
54
54
 
55
55
  # display messages above table header
56
- cattr_accessor :messages_above_header
56
+ cattr_accessor :messages_above_header, instance_accessor: false
57
57
  @@messages_above_header = false
58
58
 
59
59
  # what string to use to join records from plural associations
60
- cattr_accessor :association_join_text
60
+ cattr_accessor :association_join_text, instance_accessor: false
61
61
  @@association_join_text = ', '
62
62
 
63
63
  # What kind of pagination to use:
64
64
  # * true: The usual pagination
65
65
  # * :infinite: Treat the source as having an infinite number of pages (i.e. don't count the records; useful for large tables where counting is slow and we don't really care anyway)
66
66
  # * false: Disable pagination
67
- cattr_accessor :pagination
67
+ cattr_accessor :pagination, instance_accessor: false
68
68
  @@pagination = true
69
69
 
70
70
  # Auto paginate, only can be used with pagination enabled
71
71
  # * true: First page will be loaded on first request, next pages will be requested by AJAX until all items are loaded
72
72
  # * false: Disable auto pagination
73
- cattr_accessor :auto_pagination
73
+ cattr_accessor :auto_pagination, instance_accessor: false
74
74
  @@auto_pagination = false
75
75
 
76
76
  # show a link to reset the search next to filtered message
77
- cattr_accessor :show_search_reset
77
+ cattr_accessor :show_search_reset, instance_accessor: false
78
78
  @@show_search_reset = true
79
79
 
80
80
  # the ActionLink to reset search
81
- cattr_reader :reset_link
81
+ cattr_reader :reset_link, instance_reader: false
82
82
  @@reset_link = ActiveScaffold::DataStructures::ActionLink.new('index', :label => :click_to_reset, :type => :collection, :position => false, :parameters => {:search => ''})
83
83
 
84
84
  # wrap normal cells (not inplace editable columns or with link) with a tag
85
85
  # it allows for more css styling
86
- cattr_accessor :wrap_tag
86
+ cattr_accessor :wrap_tag, instance_accessor: false
87
87
  @@wrap_tag = nil
88
88
 
89
89
  # Show search form in the list header instead of display the link
90
- cattr_accessor :always_show_search
90
+ cattr_accessor :always_show_search, instance_accessor: false
91
91
  @@always_show_search = false
92
92
 
93
93
  # Show create form in the list header instead of display the link
94
- cattr_accessor :always_show_create
94
+ cattr_accessor :always_show_create, instance_accessor: false
95
95
  @@always_show_create = false
96
96
 
97
97
  # Enable auto select columns on list, so only columns needed for list columns are selected
98
- cattr_accessor :auto_select_columns
98
+ cattr_accessor :auto_select_columns, instance_accessor: false
99
99
  @@auto_select_columns = false
100
100
 
101
101
  # Enable ETag calculation (when conditional_get_support is enabled), it requires to load records for page, when is disabled query can be avoided when page is cached in browser
102
102
  # order clause will be used for ETag when calculate_etag is disabled, so query for records can be avoided
103
- cattr_accessor :calculate_etag
103
+ cattr_accessor :calculate_etag, instance_accessor: false
104
104
  @@calculate_etag = false
105
105
 
106
106
  # instance-level configuration
@@ -152,11 +152,11 @@ module ActiveScaffold::Config
152
152
  # to just sort on one column, you can simply provide a hash, e.g. {:a => 'desc'}.
153
153
  def sorting=(val)
154
154
  val = [val] if val.is_a? Hash
155
- sorting.set *val
155
+ sorting.set(*val)
156
156
  end
157
157
 
158
158
  def sorting
159
- @sorting ||= ActiveScaffold::DataStructures::Sorting.new(@core.columns)
159
+ @sorting ||= ActiveScaffold::DataStructures::Sorting.new(@core.columns, @core.model)
160
160
  end
161
161
 
162
162
  # overwrite the includes used for the count sql query
@@ -180,7 +180,7 @@ module ActiveScaffold::Config
180
180
 
181
181
  attr_writer :always_show_search
182
182
  def always_show_search
183
- @always_show_search && !search_partial.blank?
183
+ @always_show_search && search_partial.present?
184
184
  end
185
185
 
186
186
  def search_partial
@@ -228,7 +228,11 @@ module ActiveScaffold::Config
228
228
  attr_writer :label
229
229
  # This label has already been localized.
230
230
  def label
231
- self['label'] || @label || @conf.label
231
+ self['label'] || embedded_label || @label || @conf.label
232
+ end
233
+
234
+ def embedded_label
235
+ @params[:embedded][:label] if @params[:embedded]
232
236
  end
233
237
 
234
238
  def per_page
@@ -266,7 +270,7 @@ module ActiveScaffold::Config
266
270
  self['sort'] = [@params['sort'], @params['sort_direction']] if @params['sort'] && @params['sort_direction']
267
271
  self['sort'] = nil if @params['sort_direction'] == 'reset'
268
272
 
269
- if self['sort']
273
+ if self['sort'] && @conf.core.columns[self['sort'][0]]
270
274
  sorting = @conf.sorting.clone
271
275
  sorting.set(*self['sort'])
272
276
  @sorting = sorting
@@ -11,10 +11,10 @@ module ActiveScaffold::Config
11
11
 
12
12
  # global level configuration
13
13
  # --------------------------
14
- cattr_accessor :shallow_delete
14
+ cattr_accessor :shallow_delete, instance_accessor: false
15
15
  @@shallow_delete = true
16
16
 
17
- cattr_accessor :ignore_order_from_association
17
+ cattr_accessor :ignore_order_from_association, instance_accessor: false
18
18
 
19
19
  # instance-level configuration
20
20
  # ----------------------------
@@ -27,10 +27,10 @@ module ActiveScaffold::Config
27
27
  column = @core.columns[attribute.to_sym]
28
28
  if column && column.association
29
29
  label =
30
- if column.polymorphic_association?
30
+ if column.association.polymorphic?
31
31
  column.label
32
32
  else
33
- column.association.klass.model_name.human(:count => column.singular_association? ? 1 : 2, :default => column.association.klass.name.pluralize)
33
+ column.association.klass.model_name.human(:count => column.association.singular? ? 1 : 2, :default => column.association.klass.name.pluralize)
34
34
  end
35
35
  options.reverse_merge! :security_method => :nested_authorized?, :label => label
36
36
  action_group = options.delete(:action_group) || self.action_group
@@ -12,7 +12,7 @@ module ActiveScaffold::Config
12
12
  # global level configuration
13
13
  # --------------------------
14
14
  # the ActionLink for this action
15
- cattr_accessor :link
15
+ cattr_accessor :link, instance_accessor: false
16
16
  @@link = ActiveScaffold::DataStructures::ActionLink.new('show_search', :label => :search, :type => :collection, :security_method => :search_authorized?, :ignore_method => :search_ignore?)
17
17
 
18
18
  # A flag for how the search should do full-text searching in the database:
@@ -21,30 +21,30 @@ module ActiveScaffold::Config
21
21
  # * :end: LIKE %?
22
22
  # * false: LIKE ?
23
23
  # Default is :full
24
- cattr_accessor :text_search
24
+ cattr_accessor :text_search, instance_accessor: false
25
25
  @@text_search = :full
26
26
 
27
27
  # whether submits the search as you type
28
- cattr_writer :live
28
+ cattr_writer :live, instance_writer: false
29
29
  def self.live?
30
30
  @@live
31
31
  end
32
32
 
33
- cattr_accessor :split_terms
33
+ cattr_accessor :split_terms, instance_accessor: false
34
34
  @@split_terms = ' '
35
35
 
36
36
  # instance-level configuration
37
37
  # ----------------------------
38
38
 
39
- columns_accessor :columns
40
39
  # provides access to the list of columns specifically meant for the Search to use
41
40
  def columns
42
41
  # we want to delay initializing to the @core.columns set for as long as possible. Too soon and .search_sql will not be available to .searchable?
43
- unless @columns
42
+ unless defined? @columns
44
43
  self.columns = @core.columns.collect { |c| c.name if @core.columns._inheritable.include?(c.name) && c.searchable? && c.association.nil? && c.text? }.compact
45
44
  end
46
45
  @columns
47
46
  end
47
+ columns_accessor :columns
48
48
 
49
49
  # A flag for how the search should do full-text searching in the database:
50
50
  # * :full: LIKE %?%
@@ -1,14 +1,24 @@
1
1
  module ActiveScaffold::Config
2
2
  class Show < Base
3
3
  self.crud_type = :read
4
+ def initialize(core_config)
5
+ super
6
+ self.inline_links = self.class.inline_links
7
+ end
4
8
 
5
9
  # global level configuration
6
10
  # --------------------------
7
- cattr_accessor :link
11
+ cattr_accessor :link, instance_accessor: false
8
12
  @@link = ActiveScaffold::DataStructures::ActionLink.new('show', :label => :show, :type => :member, :security_method => :show_authorized?, :ignore_method => :show_ignore?)
13
+
14
+ cattr_accessor :inline_links, instance_accessor: false
15
+ @@inline_links = false
16
+
9
17
  # instance-level configuration
10
18
  # ----------------------------
11
19
 
20
+ attr_accessor :inline_links
21
+
12
22
  # the ActionLink for this action
13
23
  attr_accessor :link
14
24
  # the label for this action. used for the header.
@@ -8,7 +8,7 @@ module ActiveScaffold::Config
8
8
  # global level configuration
9
9
  # --------------------------
10
10
 
11
- cattr_accessor :layout
11
+ cattr_accessor :layout, instance_accessor: false
12
12
  @@layout = :horizontal
13
13
 
14
14
  # instance-level configuration
@@ -12,19 +12,21 @@ module ActiveScaffold::Config
12
12
  def self.link
13
13
  @@link
14
14
  end
15
+
15
16
  def self.link=(val)
16
17
  @@link = val
17
18
  end
18
19
  @@link = ActiveScaffold::DataStructures::ActionLink.new('edit', :label => :edit, :type => :member, :security_method => :update_authorized?, :ignore_method => :update_ignore?)
19
20
 
21
+ cattr_accessor :nested_links, instance_accessor: false
22
+ @@nested_links = false
23
+
20
24
  columns_accessor :columns, :copy => :create
21
25
 
22
26
  # instance-level configuration
23
27
  # ----------------------------
24
28
 
25
29
  attr_accessor :nested_links
26
- cattr_accessor :nested_links
27
- @@nested_links = false
28
30
 
29
31
  attr_writer :hide_nested_column
30
32
  def hide_nested_column
@@ -8,7 +8,7 @@ module ActiveScaffold
8
8
 
9
9
  # Returns the current constraints
10
10
  def active_scaffold_constraints
11
- @active_scaffold_constraints ||= active_scaffold_session_storage['constraints'] || {}
11
+ @active_scaffold_constraints ||= active_scaffold_embedded_params[:constraints] || {}
12
12
  end
13
13
 
14
14
  # For each enabled action, adds the constrained columns to the ActionColumns object (if it exists).
@@ -17,9 +17,9 @@ module ActiveScaffold
17
17
  # If the constraint value is a Hash, then we assume the constraint is a multi-level association constraint (the reverse of a has_many :through) and we do NOT register the constraint column.
18
18
  def register_constraints_with_action_columns(constrained_fields = nil)
19
19
  constrained_fields ||= []
20
- constrained_fields |= active_scaffold_constraints.reject { |_, v| v.is_a? Hash }.keys.collect(&:to_sym)
20
+ constrained_fields |= active_scaffold_constraints.reject { |_, v| params_hash?(v) }.keys.collect(&:to_sym)
21
21
  exclude_actions = []
22
- [:list, :update].each do |action_name|
22
+ %i[list update].each do |action_name|
23
23
  if active_scaffold_config.actions.include? action_name
24
24
  exclude_actions << action_name unless active_scaffold_config.send(action_name).hide_nested_column
25
25
  end
@@ -51,26 +51,26 @@ module ActiveScaffold
51
51
  # example:
52
52
  # data model: Park -> Den -> Bear
53
53
  # constraint: :den => {:park => 5}
54
- if v.is_a? Hash
54
+ if params_hash? v
55
55
  far_association = column.association.klass.reflect_on_association(v.keys.first)
56
56
  field = far_association.klass.primary_key
57
57
  table = far_association.table_name
58
58
 
59
59
  active_scaffold_references.concat([{k => far_association.name}]) # e.g. {:den => :park}
60
- hash_conditions.merge!("#{table}.#{field}" => v.values.first)
60
+ hash_conditions.deep_merge!(table => {field => v.values.first})
61
61
 
62
62
  # association column constraint
63
63
  elsif column.association
64
- if column.association.macro == :has_and_belongs_to_many
64
+ if column.association.habtm?
65
65
  active_scaffold_habtm_joins.concat column.includes
66
- elsif !column.association.options[:polymorphic]
67
- if column.association.macro == :belongs_to
66
+ elsif !column.association.polymorphic?
67
+ if column.association.belongs_to?
68
68
  active_scaffold_preload.concat column.includes
69
69
  else
70
70
  active_scaffold_references.concat column.includes
71
71
  end
72
72
  end
73
- hash_conditions.merge!(condition_from_association_constraint(column.association, v))
73
+ hash_conditions.deep_merge!(condition_from_association_constraint(column.association, v))
74
74
 
75
75
  # regular column constraints
76
76
  elsif column.searchable? && params[column.name] != v
@@ -79,7 +79,7 @@ module ActiveScaffold
79
79
  end
80
80
  # unknown-to-activescaffold-but-real-database-column constraint
81
81
  elsif active_scaffold_config.model.columns_hash[k.to_s] && params[column.name] != v
82
- hash_conditions.merge!(k => v)
82
+ hash_conditions.deep_merge!(k => v)
83
83
  else
84
84
  raise ActiveScaffold::MalformedConstraint, constraint_error(active_scaffold_config.model, k), caller
85
85
  end
@@ -96,33 +96,32 @@ module ActiveScaffold
96
96
  #
97
97
  # please see the relevant tests for concrete examples.
98
98
 
99
- field =
100
- if [:has_one, :has_many, :has_and_belongs_to_many].include?(association.macro)
101
- association.klass.primary_key
102
- else
103
- association.options[:foreign_key] || association.name.to_s.foreign_key
99
+ field = if association.belongs_to?
100
+ association.foreign_key
101
+ else
102
+ association.klass.primary_key
104
103
  end
105
104
 
106
- table = case association.macro
107
- when :belongs_to then active_scaffold_config.model.table_name
108
- else association.table_name
109
- end
105
+ table = association.belongs_to? ? active_scaffold_config.model.table_name : association.table_name
110
106
 
111
- if association.options[:primary_key]
112
- value = association.klass.find(value).send(association.options[:primary_key])
107
+ if association.primary_key
108
+ value = association.klass.find(value).send(association.primary_key)
113
109
  end
114
110
 
115
- condition = {"#{table}.#{field}" => value}
116
- if association.options[:polymorphic]
117
- raise ActiveScaffold::MalformedConstraint, polymorphic_constraint_error(association), caller unless params[:parent_model]
118
- condition["#{table}.#{association.name}_type"] = params[:parent_model].constantize.to_s
111
+ if association.polymorphic?
112
+ unless value.is_a?(Array) && value.size == 2
113
+ raise ActiveScaffold::MalformedConstraint, polymorphic_constraint_error(association), caller
114
+ end
115
+ condition = {table => {association.foreign_type => value[0], field => value[1]}}
116
+ else
117
+ condition = {table => {field.to_s => value}}
119
118
  end
120
119
 
121
120
  condition
122
121
  end
123
122
 
124
123
  def polymorphic_constraint_error(association)
125
- "Malformed constraint. You have added a constraint for #{association.name} polymorphic association but parent_model is not set."
124
+ "Malformed constraint. You have added a constraint for #{association.name} polymorphic association but value is not an array of class name and id."
126
125
  end
127
126
 
128
127
  def constraint_error(klass, column_name)
@@ -139,15 +138,19 @@ module ActiveScaffold
139
138
  # If it *is* ok (e.g. you're in a transaction), then set :allow_autosave to true.
140
139
  def apply_constraints_to_record(record, options = {})
141
140
  options[:allow_autosave] = false if options[:allow_autosave].nil?
141
+ constraints = options[:constraints] || active_scaffold_constraints
142
142
 
143
- active_scaffold_constraints.each do |k, v|
144
- column = active_scaffold_config.columns[k]
143
+ config = record.is_a?(active_scaffold_config.model) ? active_scaffold_config : active_scaffold_config_for(record.class)
144
+ constraints.each do |k, v|
145
+ column = config.columns[k]
145
146
  if column && column.association
146
- if column.plural_association?
147
- record.send("#{k}").send(:<<, column.association.klass.find(v))
148
- elsif column.association.options[:polymorphic]
149
- raise ActiveScaffold::MalformedConstraint, polymorphic_constraint_error(column.association), caller unless params[:parent_model]
150
- record.send("#{k}=", params[:parent_model].constantize.find(v))
147
+ if column.association.collection?
148
+ record.send(k.to_s).send(:<<, column.association.klass.find(v))
149
+ elsif column.association.polymorphic?
150
+ unless v.is_a?(Array) && v.size == 2
151
+ raise ActiveScaffold::MalformedConstraint, polymorphic_constraint_error(column.association), caller
152
+ end
153
+ record.send("#{k}=", v[0].constantize.find(v[1]))
151
154
  else # regular singular association
152
155
  record.send("#{k}=", column.association.klass.find(v))
153
156
 
@@ -156,9 +159,9 @@ module ActiveScaffold
156
159
  #
157
160
  # note that we can't take the extra step to correct this unless we're permitted to
158
161
  # run operations where activerecord auto-saves the object.
159
- reverse = column.association.klass.reflect_on_association(column.association.reverse)
160
- if reverse.macro == :has_one && options[:allow_autosave]
161
- record.send(k).send("#{column.association.reverse}=", record)
162
+ reverse = column.association.reverse_association
163
+ if reverse.singular? && !reverse.belongs_to? && options[:allow_autosave]
164
+ record.send(k).send("#{reverse.name}=", record)
162
165
  end
163
166
  end
164
167
  else