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
@@ -2,7 +2,7 @@ module ActiveScaffold
2
2
  module Helpers
3
3
  module ListColumnHelpers
4
4
  def active_scaffold_column_paperclip(record, column)
5
- paperclip = record.send("#{column.name}")
5
+ paperclip = record.send(column.name.to_s)
6
6
  return nil unless paperclip.file?
7
7
  content =
8
8
  if paperclip.styles.include?(ActiveScaffold::Bridges::Paperclip::PaperclipBridgeHelpers.thumbnail_style)
@@ -2,8 +2,8 @@ module ActiveScaffold
2
2
  module Bridges
3
3
  class Paperclip
4
4
  module PaperclipBridge
5
- def initialize_with_paperclip(model_id)
6
- initialize_without_paperclip(model_id)
5
+ def initialize(model_id)
6
+ super
7
7
  return unless model.respond_to?(:attachment_definitions) && !model.attachment_definitions.nil?
8
8
 
9
9
  update.multipart = true
@@ -16,10 +16,6 @@ module ActiveScaffold
16
16
  end
17
17
  end
18
18
 
19
- def self.included(base)
20
- base.alias_method_chain :initialize, :paperclip
21
- end
22
-
23
19
  private
24
20
 
25
21
  def configure_paperclip_field(field)
@@ -27,7 +23,7 @@ module ActiveScaffold
27
23
  columns[field].form_ui ||= :paperclip
28
24
  columns[field].params.add "delete_#{field}"
29
25
 
30
- [:file_name, :content_type, :file_size, :updated_at].each do |f|
26
+ %i[file_name content_type file_size updated_at].each do |f|
31
27
  columns.exclude("#{field}_#{f}".to_sym)
32
28
  end
33
29
  end
@@ -2,9 +2,11 @@ class ActiveScaffold::Bridges::RecordSelect < ActiveScaffold::DataStructures::Br
2
2
  def self.install
3
3
  require File.join(File.dirname(__FILE__), 'record_select/helpers.rb')
4
4
  end
5
+
5
6
  def self.stylesheets
6
7
  'record_select'
7
8
  end
9
+
8
10
  def self.javascripts
9
11
  'record_select'
10
12
  end
@@ -11,13 +11,11 @@ class ActiveScaffold::Bridges::RecordSelect
11
11
  # requires RecordSelect plugin to be installed and configured.
12
12
  def active_scaffold_input_record_select(column, options)
13
13
  record = options.delete(:object)
14
- ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include :object in html_options with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
15
- record ||= @record # TODO: Remove when relying on @record is removed
16
- if column.singular_association?
14
+ if column.association.try(:singular?)
17
15
  multiple = false
18
- multiple = column.options[:html_options][:multiple] if column.options[:html_options] && column.options[:html_options][:multiple]
16
+ multiple = column.options[:html_options][:multiple] if column.options[:html_options] && column.options[:html_options][:multiple]
19
17
  active_scaffold_record_select(record, column, options, record.send(column.name), multiple)
20
- elsif column.plural_association?
18
+ elsif column.association.try(:collection?)
21
19
  active_scaffold_record_select(record, column, options, record.send(column.name), true)
22
20
  else
23
21
  active_scaffold_record_select_autocomplete(record, column, options)
@@ -29,7 +27,7 @@ class ActiveScaffold::Bridges::RecordSelect
29
27
  raise ArgumentError, "record_select can only work against associations (and #{column.name} is not). A common mistake is to specify the foreign key field (like :user_id), instead of the association (:user)."
30
28
  end
31
29
  klass =
32
- if column.polymorphic_association?
30
+ if column.association.polymorphic?
33
31
  record.send(column.association.foreign_type).constantize rescue nil
34
32
  else
35
33
  column.association.klass
@@ -40,8 +38,8 @@ class ActiveScaffold::Bridges::RecordSelect
40
38
 
41
39
  # if the opposite association is a :belongs_to (in that case association in this class must be has_one or has_many)
42
40
  # then only show records that have not been associated yet
43
- if [:has_one, :has_many].include?(column.association.macro)
44
- params.merge!(column.association.foreign_key => '')
41
+ if column.association.has_one? || column.association.has_many?
42
+ params[column.association.foreign_key] = ''
45
43
  end
46
44
 
47
45
  record_select_options = active_scaffold_input_text_options(options).merge(
@@ -51,7 +49,7 @@ class ActiveScaffold::Bridges::RecordSelect
51
49
 
52
50
  html =
53
51
  if multiple
54
- record_multi_select_field(options[:name], value || [], record_select_options)
52
+ record_multi_select_field(options[:name], value || [], record_select_options.except(:required))
55
53
  else
56
54
  record_select_field(options[:name], value || klass.new, record_select_options)
57
55
  end
@@ -71,18 +69,16 @@ class ActiveScaffold::Bridges::RecordSelect
71
69
 
72
70
  module SearchColumnHelpers
73
71
  def active_scaffold_search_record_select(column, options)
74
- value = field_search_record_select_value(column)
72
+ value = field_search_record_select_value(column, options[:value])
75
73
  active_scaffold_record_select(options[:object], column, options, value, column.options[:multiple])
76
74
  end
77
75
 
78
- def field_search_record_select_value(column)
79
- value = field_search_params[column.name]
80
- unless value.blank?
81
- if column.options[:multiple]
82
- column.association.klass.find value.collect!(&:to_i)
83
- else
84
- column.association.klass.find(value.to_i)
85
- end
76
+ def field_search_record_select_value(column, value)
77
+ return if value.blank?
78
+ if column.options[:multiple]
79
+ column.association.klass.find value.collect!(&:to_i)
80
+ else
81
+ column.association.klass.find(value.to_i)
86
82
  end
87
83
  rescue StandardError => e
88
84
  logger.error "#{e.class.name}: #{e.message} -- Sorry, we are not that smart yet. Attempted to restore search values to search fields :#{column.name} in #{controller.class}"
@@ -1,20 +1,16 @@
1
1
  class ActiveScaffold::Bridges::SemanticAttributes
2
2
  module Column
3
- def self.included(base)
4
- base.class_eval { alias_method_chain :initialize, :semantic_attributes }
5
- end
6
-
7
- def initialize_with_semantic_attributes(name, active_record_class)
8
- initialize_without_semantic_attributes(name, active_record_class)
3
+ def initialize(name, active_record_class)
4
+ super
9
5
  self.required = !active_record_class.semantic_attributes[self.name].predicates.find { |p| p.allow_empty? == false }.nil?
10
6
  active_record_class.semantic_attributes[self.name].predicates.find do |p|
11
7
  sem_type = p.class.to_s.split('::')[1].underscore.to_sym
12
- next if [:required, :association].include?(sem_type)
8
+ next if %i[required association].include?(sem_type)
13
9
  @form_ui = sem_type
14
10
  end
15
11
  end
16
12
  end
17
13
  end
18
14
  ActiveScaffold::DataStructures::Column.class_eval do
19
- include ActiveScaffold::Bridges::SemanticAttributes::Column
15
+ prepend ActiveScaffold::Bridges::SemanticAttributes::Column
20
16
  end
@@ -12,7 +12,7 @@ module ActiveScaffold
12
12
  tags << active_scaffold_search_date_bridge_trend_tag(column, options, current_search)
13
13
  tags << active_scaffold_search_date_bridge_numeric_tag(column, options, current_search)
14
14
  tags << active_scaffold_search_date_bridge_range_tag(column, options, current_search)
15
- tags.join('&nbsp;').html_safe
15
+ safe_join tags, '&nbsp;'.html_safe
16
16
  end
17
17
 
18
18
  def active_scaffold_search_date_bridge_comparator_options(column)
@@ -70,7 +70,7 @@ module ActiveScaffold
70
70
  end
71
71
 
72
72
  def column_datetime?(column)
73
- (!column.column.nil? && [:datetime, :time].include?(column.column.type))
73
+ (!column.column.nil? && %i[datetime time].include?(column.column.type))
74
74
  end
75
75
  end
76
76
 
@@ -141,7 +141,7 @@ module ActiveScaffold
141
141
  values.collect!(&conversion) if conversion != :to_time
142
142
  values
143
143
  else
144
- %w(from to).collect { |field| condition_value_for_datetime(column, value[field], conversion) }
144
+ %w[from to].collect { |field| condition_value_for_datetime(column, value[field], conversion) }
145
145
  end
146
146
  end
147
147
 
@@ -152,41 +152,41 @@ module ActiveScaffold
152
152
  def date_bridge_from_to_for_trend(column, value)
153
153
  case value['opt']
154
154
  when 'PAST'
155
- trend_number = [value['number'].to_i, 1].max
155
+ trend_number = [value['number'].to_i, 1].max
156
156
  now = date_bridge_now
157
157
  if date_bridge_column_date?(column)
158
- from = now.beginning_of_day.ago((trend_number).send(value['unit'].downcase.singularize.to_sym))
158
+ from = now.beginning_of_day.ago(trend_number.send(value['unit'].downcase.singularize.to_sym))
159
159
  to = now.end_of_day
160
160
  else
161
- from = now.ago((trend_number).send(value['unit'].downcase.singularize.to_sym))
161
+ from = now.ago(trend_number.send(value['unit'].downcase.singularize.to_sym))
162
162
  to = now
163
163
  end
164
- return from, to
164
+ [from, to]
165
165
  when 'FUTURE'
166
- trend_number = [value['number'].to_i, 1].max
166
+ trend_number = [value['number'].to_i, 1].max
167
167
  now = date_bridge_now
168
168
  if date_bridge_column_date?(column)
169
169
  from = now.beginning_of_day
170
- to = now.end_of_day.in((trend_number).send(value['unit'].downcase.singularize.to_sym))
170
+ to = now.end_of_day.in(trend_number.send(value['unit'].downcase.singularize.to_sym))
171
171
  else
172
172
  from = now
173
- to = now.in((trend_number).send(value['unit'].downcase.singularize.to_sym))
173
+ to = now.in(trend_number.send(value['unit'].downcase.singularize.to_sym))
174
174
  end
175
- return from, to
175
+ [from, to]
176
176
  end
177
177
  end
178
178
 
179
179
  def date_bridge_from_to_for_range(column, value)
180
180
  case value['range']
181
181
  when 'TODAY'
182
- return date_bridge_now.beginning_of_day, date_bridge_now.end_of_day
182
+ [date_bridge_now.beginning_of_day, date_bridge_now.end_of_day]
183
183
  when 'YESTERDAY'
184
- return date_bridge_now.ago(1.day).beginning_of_day, date_bridge_now.ago(1.day).end_of_day
184
+ [date_bridge_now.ago(1.day).beginning_of_day, date_bridge_now.ago(1.day).end_of_day]
185
185
  when 'TOMORROW'
186
- return date_bridge_now.in(1.day).beginning_of_day, date_bridge_now.in(1.day).end_of_day
186
+ [date_bridge_now.in(1.day).beginning_of_day, date_bridge_now.in(1.day).end_of_day]
187
187
  else
188
188
  range_type, range = value['range'].downcase.split('_')
189
- raise ArgumentError unless %w(week month year).include?(range)
189
+ raise ArgumentError unless %w[week month year].include?(range)
190
190
  case range_type
191
191
  when 'this'
192
192
  return date_bridge_now.send("beginning_of_#{range}".to_sym), date_bridge_now.send("end_of_#{range}")
@@ -201,7 +201,7 @@ module ActiveScaffold
201
201
  end
202
202
 
203
203
  def date_bridge_column_date?(column)
204
- if [:date_picker, :datetime_picker].include? column.form_ui
204
+ if %i[date_picker datetime_picker].include? column.form_ui
205
205
  column.form_ui == :date_picker
206
206
  else
207
207
  (!column.column.nil? && [:date].include?(column.column.type))
@@ -214,7 +214,7 @@ module ActiveScaffold
214
214
  end
215
215
  end
216
216
 
217
- ActiveScaffold::Finder.const_set('DATE_COMPARATORS', %w(PAST FUTURE RANGE))
218
- ActiveScaffold::Finder.const_set('DATE_UNITS', %w(DAYS WEEKS MONTHS YEARS))
219
- ActiveScaffold::Finder.const_set('TIME_UNITS', %w(SECONDS MINUTES HOURS))
220
- ActiveScaffold::Finder.const_set('DATE_RANGES', %w(TODAY YESTERDAY TOMORROW THIS_WEEK PREV_WEEK NEXT_WEEK THIS_MONTH PREV_MONTH NEXT_MONTH THIS_YEAR PREV_YEAR NEXT_YEAR))
217
+ ActiveScaffold::Finder.const_set('DATE_COMPARATORS', %w[PAST FUTURE RANGE])
218
+ ActiveScaffold::Finder.const_set('DATE_UNITS', %w[DAYS WEEKS MONTHS YEARS])
219
+ ActiveScaffold::Finder.const_set('TIME_UNITS', %w[SECONDS MINUTES HOURS])
220
+ ActiveScaffold::Finder.const_set('DATE_RANGES', %w[TODAY YESTERDAY TOMORROW THIS_WEEK PREV_WEEK NEXT_WEEK THIS_MONTH PREV_MONTH NEXT_MONTH THIS_YEAR PREV_YEAR NEXT_YEAR])
@@ -8,10 +8,6 @@ class ActiveScaffold::Bridges::TinyMce
8
8
  end
9
9
 
10
10
  module FormColumnHelpers
11
- def self.included(base)
12
- base.alias_method_chain :onsubmit, :tiny_mce
13
- end
14
-
15
11
  # The two column options that can be set specifically for the text_editor input
16
12
  # is :tinymce, which overrides single values in the tinymce config.
17
13
  # E.g. column[:foo].options[:tinymce] = {theme: 'other'} will change the theme
@@ -21,31 +17,20 @@ class ActiveScaffold::Bridges::TinyMce
21
17
  def active_scaffold_input_text_editor(column, options)
22
18
  options[:class] = "#{options[:class]} mceEditor #{column.options[:class]}".strip
23
19
 
24
- settings = tinymce_configuration(column.options[:tinymce_config] || :default).options.
25
- reject{|k,v| k =='selector'}.
26
- merge(column.options[:tinymce] || {})
27
- settings = settings.to_json
28
- settings = "tinyMCE.settings = #{settings};"
20
+ settings = tinymce_configuration(column.options[:tinymce_config] || :default).options
21
+ .reject { |k, _v| k == 'selector' }
22
+ .merge(column.options[:tinymce] || {})
23
+ options['data-tinymce'] = settings.to_json if ActiveScaffold.js_framework != :prototype
29
24
 
30
25
  html = []
31
26
  html << send(override_input(:textarea), column, options)
32
- html << javascript_tag(settings + "tinyMCE.execCommand('mceAddEditor', false, '#{options[:id]}');") if request.xhr? || params[:iframe]
33
- html.join "\n"
34
- end
35
-
36
- def onsubmit_with_tiny_mce
37
- case ActiveScaffold.js_framework
38
- when :jquery
39
- submit_js = 'tinyMCE.triggerSave();jQuery(\'textarea.mceEditor\').each(function(index, elem) { tinyMCE.execCommand(\'mceRemoveEditor\', false, jQuery(elem).attr(\'id\')); });'
40
- when :prototype
41
- submit_js = 'tinyMCE.triggerSave();this.select(\'textarea.mceEditor\').each(function(elem) { tinyMCE.execCommand(\'mceRemoveEditor\', false, elem.id); });'
42
- end
43
- [onsubmit_without_tiny_mce, submit_js].compact.join ';'
27
+ html << javascript_tag("tinyMCE.settings = #{settings.to_json}; tinyMCE.execCommand('mceAddEditor', false, '#{options[:id]}');") if ActiveScaffold.js_framework == :prototype && (request.xhr? || params[:iframe])
28
+ safe_join html
44
29
  end
45
30
 
46
31
  # The implementation is very tinymce specific, so it makes sense allowing :form_ui
47
32
  # to be :tinymce as well
48
- alias_method :active_scaffold_input_tinymce, :active_scaffold_input_text_editor
33
+ alias active_scaffold_input_tinymce active_scaffold_input_text_editor
49
34
  end
50
35
 
51
36
  module SearchColumnHelpers
@@ -2,7 +2,7 @@ module ActiveScaffold::Bridges
2
2
  class UsaStateSelect
3
3
  module UsaStateSelectHelpers
4
4
  def usa_state_select_options(options)
5
- # TODO remove when rails 3.2 support is dropped
5
+ # TODO: remove when rails 3.2 support is dropped
6
6
  defined?(ActionView::Helpers::InstanceTag) ? options[:object] : options
7
7
  end
8
8
 
@@ -17,22 +17,22 @@ module ActiveScaffold::Bridges
17
17
  # in case you want to highligh a local area
18
18
  # NOTE: Only the option tags are returned from this method, wrap it in a <select>
19
19
  def usa_state_options_for_select(selected = nil, priority_states = nil)
20
- if priority_states
21
- state_options = options_for_select(priority_states + [['-------------', '']], :selected => selected, :disabled => '')
22
- else
23
- state_options = options_for_select([])
24
- end
20
+ state_options = if priority_states
21
+ options_for_select(priority_states + [['-------------', '']], :selected => selected, :disabled => '')
22
+ else
23
+ options_for_select([])
24
+ end
25
25
 
26
- if priority_states && priority_states.include?(selected)
27
- state_options += options_for_select(USASTATES - priority_states, :selected => selected)
28
- else
29
- state_options += options_for_select(USASTATES, :selected => selected)
30
- end
26
+ state_options += if priority_states && priority_states.include?(selected)
27
+ options_for_select(USASTATES - priority_states, :selected => selected)
28
+ else
29
+ options_for_select(USASTATES, :selected => selected)
30
+ end
31
31
 
32
32
  state_options
33
33
  end
34
34
 
35
- USASTATES = [%w(Alabama AL), %w(Alaska AK), %w(Arizona AZ), %w(Arkansas AR), %w(California CA), %w(Colorado CO), %w(Connecticut CT), %w(Delaware DE), ['District of Columbia', 'DC'], %w(Florida FL), %w(Georgia GA), %w(Hawaii HI), %w(Idaho ID), %w(Illinois IL), %w(Indiana IN), %w(Iowa IA), %w(Kansas KS), %w(Kentucky KY), %w(Louisiana LA), %w(Maine ME), %w(Maryland MD), %w(Massachusetts MA), %w(Michigan MI), %w(Minnesota MN), %w(Mississippi MS), %w(Missouri MO), %w(Montana MT), %w(Nebraska NE), %w(Nevada NV), ['New Hampshire', 'NH'], ['New Jersey', 'NJ'], ['New Mexico', 'NM'], ['New York', 'NY'], ['North Carolina', 'NC'], ['North Dakota', 'ND'], %w(Ohio OH), %w(Oklahoma OK), %w(Oregon OR), %w(Pennsylvania PA), ['Rhode Island', 'RI'], ['South Carolina', 'SC'], ['South Dakota', 'SD'], %w(Tennessee TN), %w(Texas TX), %w(Utah UT), %w(Vermont VT), %w(Virginia VA), %w(Washington WA), %w(Wisconsin WI), ['West Virginia', 'WV'], %w(Wyoming WY)] unless const_defined?('USASTATES')
35
+ USASTATES = [%w[Alabama AL], %w[Alaska AK], %w[Arizona AZ], %w[Arkansas AR], %w[California CA], %w[Colorado CO], %w[Connecticut CT], %w[Delaware DE], ['District of Columbia', 'DC'], %w[Florida FL], %w[Georgia GA], %w[Hawaii HI], %w[Idaho ID], %w[Illinois IL], %w[Indiana IN], %w[Iowa IA], %w[Kansas KS], %w[Kentucky KY], %w[Louisiana LA], %w[Maine ME], %w[Maryland MD], %w[Massachusetts MA], %w[Michigan MI], %w[Minnesota MN], %w[Mississippi MS], %w[Missouri MO], %w[Montana MT], %w[Nebraska NE], %w[Nevada NV], ['New Hampshire', 'NH'], ['New Jersey', 'NJ'], ['New Mexico', 'NM'], ['New York', 'NY'], ['North Carolina', 'NC'], ['North Dakota', 'ND'], %w[Ohio OH], %w[Oklahoma OK], %w[Oregon OR], %w[Pennsylvania PA], ['Rhode Island', 'RI'], ['South Carolina', 'SC'], ['South Dakota', 'SD'], %w[Tennessee TN], %w[Texas TX], %w[Utah UT], %w[Vermont VT], %w[Virginia VA], %w[Washington WA], %w[Wisconsin WI], ['West Virginia', 'WV'], %w[Wyoming WY]].freeze unless const_defined?('USASTATES')
36
36
  end
37
37
 
38
38
  module InstanceTagMethods
@@ -50,7 +50,7 @@ module ActiveScaffold::Bridges
50
50
  select_options = {:prompt => as_(:_select_)}
51
51
  select_options.merge!(options)
52
52
  options.reverse_merge!(column.options).except!(:prompt, :priority)
53
- options[:name] += '[]' if options[:multiple]
53
+ active_scaffold_select_name_with_multiple options
54
54
  usa_state_select(:record, column.name, column.options[:priority], select_options, options.except(:object))
55
55
  end
56
56
  end
@@ -69,7 +69,7 @@ ActionView::Base.class_eval do
69
69
  include ActiveScaffold::Bridges::UsaStateSelect::FormColumnHelpers
70
70
  include ActiveScaffold::Bridges::UsaStateSelect::SearchColumnHelpers
71
71
  end
72
- if defined? ActionView::Helpers::InstanceTag # TODO remove when rails 3.2 support is dropped
72
+ if defined? ActionView::Helpers::InstanceTag # TODO: remove when rails 3.2 support is dropped
73
73
  module ActionView::Helpers::Tags
74
74
  class UsaStateSelect < ActionView::Helpers::InstanceTag
75
75
  include ActiveScaffold::Bridges::UsaStateSelect::UsaStateSelectOptionsHelpers
@@ -21,7 +21,7 @@ module ActiveScaffold::Config
21
21
  protected
22
22
 
23
23
  def crud_type=(val)
24
- raise ArgumentError, "unknown CRUD type #{val}" unless [:create, :read, :update, :delete].include?(val.to_sym)
24
+ raise ArgumentError, "unknown CRUD type #{val}" unless %i[create read update delete].include?(val.to_sym)
25
25
  @crud_type = val.to_sym
26
26
  end
27
27
  end
@@ -42,7 +42,7 @@ module ActiveScaffold::Config
42
42
 
43
43
  # define a default action_group for this action
44
44
  # e.g. 'members.crud'
45
- class_attribute :action_group
45
+ class_attribute :action_group, instance_accessor: false
46
46
 
47
47
  # action_group this action should belong to
48
48
  attr_accessor :action_group
@@ -97,7 +97,7 @@ module ActiveScaffold::Config
97
97
  names.each do |name|
98
98
  var = "@#{name}"
99
99
  define_method "#{name}=" do |val|
100
- if instance_variable_get(var)
100
+ if instance_variable_defined?(var)
101
101
  instance_variable_get(var).set_values(*val)
102
102
  else
103
103
  instance_variable_set(var, build_action_columns(val))
@@ -105,21 +105,24 @@ module ActiveScaffold::Config
105
105
  instance_variable_get(var)
106
106
  end
107
107
 
108
+ return if method_defined? name
108
109
  define_method name do
109
- unless instance_variable_get(var) # lazy evaluation
110
+ unless instance_variable_defined?(var) # lazy evaluation
110
111
  action, columns = options[:copy] if options[:copy]
111
112
  if action && @core.actions.include?(action)
112
113
  action_columns = @core.send(action).send(columns || :columns).clone
113
114
  action_columns.action = self
114
115
  instance_variable_set(var, action_columns)
115
116
  else
116
- self.send("#{name}=", @core.columns._inheritable)
117
+ send("#{name}=", @core.columns._inheritable)
117
118
  end
118
- instance_exec &block if block
119
+ instance_exec(&block) if block
119
120
  end
120
121
  instance_variable_get(var)
121
122
  end
122
123
  end
123
124
  end
125
+
126
+ private_class_method :columns_accessor
124
127
  end
125
128
  end
@@ -1,55 +1,55 @@
1
1
  module ActiveScaffold::Config
2
2
  # to fix the ckeditor bridge problem inherit from full class name
3
3
  class Core < ActiveScaffold::Config::Base
4
+ include ActiveScaffold::OrmChecks
4
5
  # global level configuration
5
6
  # --------------------------
6
7
 
7
8
  # provides read/write access to the global Actions DataStructure
8
- cattr_reader :actions
9
+ cattr_reader :actions, instance_accessor: false
9
10
  def self.actions=(val)
10
11
  @@actions = ActiveScaffold::DataStructures::Actions.new(*val)
11
12
  end
12
- self.actions = [:create, :list, :search, :update, :delete, :show, :nested, :subform]
13
+ self.actions = %i[create list search update delete show nested subform]
13
14
 
14
15
  # configures where the ActiveScaffold plugin itself is located. there is no instance version of this.
15
16
  cattr_accessor :plugin_directory
16
17
  @@plugin_directory = File.expand_path(__FILE__).match(%{(^.*)/lib/active_scaffold/config/core.rb})[1]
17
18
 
18
19
  # lets you specify a global ActiveScaffold frontend.
19
- cattr_accessor :frontend
20
+ cattr_accessor :frontend, instance_accessor: false
20
21
  @@frontend = :default
21
22
 
22
23
  # lets you specify a global ActiveScaffold theme for your frontend.
23
- cattr_accessor :theme
24
+ cattr_accessor :theme, instance_accessor: false
24
25
  @@theme = :default
25
26
 
26
27
  # enable caching of action link urls
27
- cattr_accessor :cache_action_link_urls
28
+ cattr_accessor :cache_action_link_urls, instance_accessor: false
28
29
  @@cache_action_link_urls = true
29
30
 
30
31
  # enable caching of association options
31
- cattr_accessor :cache_association_options
32
+ cattr_accessor :cache_association_options, instance_accessor: false
32
33
  @@cache_association_options = true
33
34
 
34
35
  # enable setting ETag and LastModified on responses and using fresh_when/stale? to respond with 304 and avoid rendering views
35
- cattr_accessor :conditional_get_support
36
+ cattr_accessor :conditional_get_support, instance_accessor: false
36
37
  @@conditional_get_support = false
37
38
 
38
39
  # enable saving user settings in session (per_page, limit, page, sort, search params)
39
- cattr_accessor :store_user_settings
40
+ cattr_accessor :store_user_settings, instance_accessor: false
40
41
  @@store_user_settings = true
41
42
 
42
43
  # lets you disable the DHTML history
43
- def self.dhtml_history=(val)
44
- @@dhtml_history = val
45
- end
44
+ cattr_writer :dhtml_history, instance_accessor: false
45
+
46
46
  def self.dhtml_history?
47
47
  @@dhtml_history ? true : false
48
48
  end
49
49
  @@dhtml_history = true
50
50
 
51
51
  # action links are used by actions to tie together. you can use them, too! this is a collection of ActiveScaffold::DataStructures::ActionLink objects.
52
- cattr_reader :action_links
52
+ cattr_reader :action_links, instance_reader: false
53
53
  @@action_links = ActiveScaffold::DataStructures::ActionLinks.new
54
54
 
55
55
  # access to the permissions configuration.
@@ -65,21 +65,22 @@ module ActiveScaffold::Config
65
65
  def self.ignore_columns
66
66
  @@ignore_columns
67
67
  end
68
+
68
69
  def self.ignore_columns=(val)
69
70
  @@ignore_columns = ActiveScaffold::DataStructures::Set.new(*val)
70
71
  end
71
72
  @@ignore_columns = ActiveScaffold::DataStructures::Set.new
72
73
 
73
74
  # lets you specify whether add a create link for each sti child
74
- cattr_accessor :sti_create_links
75
+ cattr_accessor :sti_create_links, instance_accessor: false
75
76
  @@sti_create_links = true
76
77
 
77
78
  # prefix messages with current timestamp, set the format to display (you can use I18n keys) or true and :short will be used
78
- cattr_accessor :timestamped_messages
79
+ cattr_accessor :timestamped_messages, instance_accessor: false
79
80
  @@timestamped_messages = false
80
81
 
81
82
  # a hash of string (or array of strings) and highlighter string to highlight words in messages. It will use highlight rails helper
82
- cattr_accessor :highlight_messages
83
+ cattr_accessor :highlight_messages, instance_accessor: false
83
84
  @@highlight_messages = nil
84
85
 
85
86
  # instance-level configuration
@@ -153,12 +154,15 @@ module ActiveScaffold::Config
153
154
  @actions = self.class.actions.clone
154
155
 
155
156
  # create a new default columns datastructure, since it doesn't make sense before now
156
- attribute_names = model.columns.collect { |c| c.name.to_sym }.sort_by(&:to_s)
157
- association_column_names = model.reflect_on_all_associations.collect { |a| a.name.to_sym }.sort_by(&:to_s)
158
- @columns = ActiveScaffold::DataStructures::Columns.new(model, attribute_names + association_column_names)
157
+ attribute_names = _columns.collect { |c| c.name.to_sym }.sort_by(&:to_s)
158
+ association_column_names = _reflect_on_all_associations.collect { |a| a.name.to_sym }
159
+ if defined?(ActiveMongoid) && model < ActiveMongoid::Associations
160
+ association_column_names.concat model.am_relations.keys.map(&:to_sym)
161
+ end
162
+ @columns = ActiveScaffold::DataStructures::Columns.new(model, attribute_names + association_column_names.sort_by(&:to_s))
159
163
 
160
164
  # and then, let's remove some columns from the inheritable set.
161
- content_columns = Set.new(model.content_columns.map(&:name))
165
+ content_columns = Set.new(_content_columns.map(&:name))
162
166
  @columns.exclude(*self.class.ignore_columns)
163
167
  @columns.exclude(*@columns.find_all { |c| c.column && content_columns.exclude?(c.column.name) }.collect(&:name))
164
168
  @columns.exclude(*model.reflect_on_all_associations.collect { |a| a.foreign_type.to_sym if a.options[:polymorphic] }.compact)
@@ -232,6 +236,11 @@ module ActiveScaffold::Config
232
236
  def model
233
237
  @model ||= @model_id.to_s.camelize.constantize
234
238
  end
239
+ alias active_record_class model
240
+
241
+ def primary_key
242
+ mongoid? ? '_id' : model.primary_key
243
+ end
235
244
 
236
245
  # warning - this won't work as a per-request dynamic attribute in rails 2.0. You'll need to interact with Controller#generic_view_paths
237
246
  def inherited_view_paths
@@ -248,11 +257,11 @@ module ActiveScaffold::Config
248
257
  # note that this is unaffected by per-controller frontend configuration.
249
258
  def self.javascripts(frontend = self.frontend)
250
259
  javascript_dir = File.join(Rails.public_path, 'javascripts', asset_path('', frontend))
251
- Dir.entries(javascript_dir).reject { |e| !e.match(/\.js$/) || (!self.dhtml_history? && e.match('dhtml_history')) }
260
+ Dir.entries(javascript_dir).reject { |e| !e.match(/\.js$/) || (!dhtml_history? && e.match('dhtml_history')) }
252
261
  end
253
262
 
254
263
  def self.available_frontends
255
- frontends_dir = File.join(Rails.root, 'vendor', 'plugins', ActiveScaffold::Config::Core.plugin_directory, 'frontends')
264
+ frontends_dir = Rails.root.join('vendor', 'plugins', ActiveScaffold::Config::Core.plugin_directory, 'frontends')
256
265
  Dir.entries(frontends_dir).reject { |e| e.match(/^\./) } # Get rid of files that start with .
257
266
  end
258
267
  end