active_scaffold 3.2.17 → 3.2.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (246) hide show
  1. data/CHANGELOG +5 -1
  2. metadata +17 -261
  3. data/app/assets/images/active_scaffold/add.png +0 -0
  4. data/app/assets/images/active_scaffold/arrow_down.png +0 -0
  5. data/app/assets/images/active_scaffold/arrow_up.png +0 -0
  6. data/app/assets/images/active_scaffold/close.png +0 -0
  7. data/app/assets/images/active_scaffold/close_touch.png +0 -0
  8. data/app/assets/images/active_scaffold/config.png +0 -0
  9. data/app/assets/images/active_scaffold/cross.png +0 -0
  10. data/app/assets/images/active_scaffold/gears.png +0 -0
  11. data/app/assets/images/active_scaffold/indicator-small.gif +0 -0
  12. data/app/assets/images/active_scaffold/indicator.gif +0 -0
  13. data/app/assets/images/active_scaffold/magnifier.png +0 -0
  14. data/app/assets/javascripts/active_scaffold.js.erb +0 -19
  15. data/app/assets/javascripts/jquery/active_scaffold.js +0 -1113
  16. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +0 -24
  17. data/app/assets/javascripts/jquery/draggable_lists.js +0 -27
  18. data/app/assets/javascripts/jquery/jquery.editinplace.js +0 -743
  19. data/app/assets/javascripts/jquery/tiny_mce_bridge.js +0 -7
  20. data/app/assets/javascripts/prototype/active_scaffold.js +0 -1107
  21. data/app/assets/javascripts/prototype/dhtml_history.js +0 -870
  22. data/app/assets/javascripts/prototype/form_enhancements.js +0 -117
  23. data/app/assets/javascripts/prototype/rico_corner.js +0 -370
  24. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +0 -7
  25. data/app/assets/stylesheets/active_scaffold-ie.css.scss +0 -54
  26. data/app/assets/stylesheets/active_scaffold.css.scss +0 -14
  27. data/app/assets/stylesheets/active_scaffold_colors.css.scss +0 -395
  28. data/app/assets/stylesheets/active_scaffold_extensions.css.erb +0 -2
  29. data/app/assets/stylesheets/active_scaffold_images.css.scss +0 -40
  30. data/app/assets/stylesheets/active_scaffold_layout.css +0 -936
  31. data/app/assets/stylesheets/blue-theme.css +0 -74
  32. data/config/locales/de.yml +0 -125
  33. data/config/locales/en.yml +0 -127
  34. data/config/locales/es.yml +0 -128
  35. data/config/locales/fr.yml +0 -131
  36. data/config/locales/hu.yml +0 -126
  37. data/config/locales/ja.yml +0 -126
  38. data/config/locales/ru.yml +0 -135
  39. data/frontends/default/views/_action_group.html.erb +0 -24
  40. data/frontends/default/views/_add_existing_form.html.erb +0 -30
  41. data/frontends/default/views/_base_form.html.erb +0 -53
  42. data/frontends/default/views/_create_form.html.erb +0 -8
  43. data/frontends/default/views/_create_form_on_list.html.erb +0 -6
  44. data/frontends/default/views/_field_search.html.erb +0 -32
  45. data/frontends/default/views/_form.html.erb +0 -28
  46. data/frontends/default/views/_form_association.html.erb +0 -17
  47. data/frontends/default/views/_form_association_footer.html.erb +0 -47
  48. data/frontends/default/views/_form_attribute.html.erb +0 -23
  49. data/frontends/default/views/_form_hidden_attribute.html.erb +0 -7
  50. data/frontends/default/views/_form_messages.html.erb +0 -5
  51. data/frontends/default/views/_horizontal_subform.html.erb +0 -22
  52. data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
  53. data/frontends/default/views/_horizontal_subform_header.html.erb +0 -11
  54. data/frontends/default/views/_horizontal_subform_record.html.erb +0 -43
  55. data/frontends/default/views/_human_conditions.html.erb +0 -1
  56. data/frontends/default/views/_list.html.erb +0 -18
  57. data/frontends/default/views/_list_actions.html.erb +0 -15
  58. data/frontends/default/views/_list_calculations.html.erb +0 -16
  59. data/frontends/default/views/_list_column_headings.html.erb +0 -12
  60. data/frontends/default/views/_list_header.html.erb +0 -10
  61. data/frontends/default/views/_list_inline_adapter.html.erb +0 -21
  62. data/frontends/default/views/_list_messages.html.erb +0 -28
  63. data/frontends/default/views/_list_pagination.html.erb +0 -11
  64. data/frontends/default/views/_list_pagination_links.html.erb +0 -9
  65. data/frontends/default/views/_list_record.html.erb +0 -13
  66. data/frontends/default/views/_list_record_columns.html.erb +0 -8
  67. data/frontends/default/views/_list_with_header.html.erb +0 -36
  68. data/frontends/default/views/_messages.html.erb +0 -10
  69. data/frontends/default/views/_refresh_list.js.erb +0 -1
  70. data/frontends/default/views/_render_field.js.erb +0 -20
  71. data/frontends/default/views/_row.html.erb +0 -1
  72. data/frontends/default/views/_search.html.erb +0 -34
  73. data/frontends/default/views/_search_attribute.html.erb +0 -10
  74. data/frontends/default/views/_show.html.erb +0 -8
  75. data/frontends/default/views/_show_columns.html.erb +0 -15
  76. data/frontends/default/views/_update_actions.html.erb +0 -9
  77. data/frontends/default/views/_update_calculations.js.erb +0 -4
  78. data/frontends/default/views/_update_form.html.erb +0 -6
  79. data/frontends/default/views/_update_messages.js.erb +0 -2
  80. data/frontends/default/views/_vertical_subform.html.erb +0 -12
  81. data/frontends/default/views/_vertical_subform_record.html.erb +0 -43
  82. data/frontends/default/views/action_confirmation.html.erb +0 -13
  83. data/frontends/default/views/add_existing.js.erb +0 -14
  84. data/frontends/default/views/add_existing_form.html.erb +0 -5
  85. data/frontends/default/views/create.html.erb +0 -5
  86. data/frontends/default/views/delete.html.erb +0 -13
  87. data/frontends/default/views/destroy.js.erb +0 -26
  88. data/frontends/default/views/edit_associated.js.erb +0 -12
  89. data/frontends/default/views/field_search.html.erb +0 -5
  90. data/frontends/default/views/form_messages.js.erb +0 -1
  91. data/frontends/default/views/list.html.erb +0 -1
  92. data/frontends/default/views/on_action_update.js.erb +0 -22
  93. data/frontends/default/views/on_create.js.erb +0 -38
  94. data/frontends/default/views/on_mark.js.erb +0 -6
  95. data/frontends/default/views/on_update.js.erb +0 -29
  96. data/frontends/default/views/refresh_list.js.erb +0 -2
  97. data/frontends/default/views/render_field.js.erb +0 -1
  98. data/frontends/default/views/row.js.erb +0 -2
  99. data/frontends/default/views/search.html.erb +0 -5
  100. data/frontends/default/views/show.html.erb +0 -5
  101. data/frontends/default/views/update.html.erb +0 -8
  102. data/frontends/default/views/update_column.js.erb +0 -15
  103. data/frontends/default/views/update_row.js.erb +0 -1
  104. data/lib/active_scaffold.rb +0 -373
  105. data/lib/active_scaffold/actions/common_search.rb +0 -22
  106. data/lib/active_scaffold/actions/core.rb +0 -203
  107. data/lib/active_scaffold/actions/create.rb +0 -139
  108. data/lib/active_scaffold/actions/delete.rb +0 -74
  109. data/lib/active_scaffold/actions/field_search.rb +0 -78
  110. data/lib/active_scaffold/actions/list.rb +0 -208
  111. data/lib/active_scaffold/actions/mark.rb +0 -89
  112. data/lib/active_scaffold/actions/nested.rb +0 -244
  113. data/lib/active_scaffold/actions/search.rb +0 -48
  114. data/lib/active_scaffold/actions/show.rb +0 -61
  115. data/lib/active_scaffold/actions/subform.rb +0 -23
  116. data/lib/active_scaffold/actions/update.rb +0 -156
  117. data/lib/active_scaffold/active_record_permissions.rb +0 -135
  118. data/lib/active_scaffold/attribute_params.rb +0 -200
  119. data/lib/active_scaffold/bridges.rb +0 -61
  120. data/lib/active_scaffold/bridges/ancestry.rb +0 -5
  121. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +0 -39
  122. data/lib/active_scaffold/bridges/bitfields.rb +0 -6
  123. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +0 -37
  124. data/lib/active_scaffold/bridges/calendar_date_select.rb +0 -24
  125. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +0 -66
  126. data/lib/active_scaffold/bridges/cancan.rb +0 -15
  127. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +0 -127
  128. data/lib/active_scaffold/bridges/carrierwave.rb +0 -12
  129. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +0 -31
  130. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +0 -10
  131. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +0 -45
  132. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +0 -17
  133. data/lib/active_scaffold/bridges/country_helper.rb +0 -9
  134. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +0 -358
  135. data/lib/active_scaffold/bridges/date_picker.rb +0 -23
  136. data/lib/active_scaffold/bridges/date_picker/ext.rb +0 -63
  137. data/lib/active_scaffold/bridges/date_picker/helper.rb +0 -180
  138. data/lib/active_scaffold/bridges/dragonfly.rb +0 -9
  139. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +0 -34
  140. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +0 -10
  141. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +0 -27
  142. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +0 -16
  143. data/lib/active_scaffold/bridges/file_column.rb +0 -11
  144. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +0 -46
  145. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +0 -57
  146. data/lib/active_scaffold/bridges/file_column/form_ui.rb +0 -34
  147. data/lib/active_scaffold/bridges/file_column/list_ui.rb +0 -26
  148. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +0 -43
  149. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +0 -9
  150. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +0 -15
  151. data/lib/active_scaffold/bridges/paperclip.rb +0 -12
  152. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +0 -27
  153. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +0 -16
  154. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +0 -36
  155. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +0 -24
  156. data/lib/active_scaffold/bridges/record_select.rb +0 -11
  157. data/lib/active_scaffold/bridges/record_select/helpers.rb +0 -92
  158. data/lib/active_scaffold/bridges/semantic_attributes.rb +0 -5
  159. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +0 -20
  160. data/lib/active_scaffold/bridges/shared/date_bridge.rb +0 -209
  161. data/lib/active_scaffold/bridges/tiny_mce.rb +0 -17
  162. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +0 -46
  163. data/lib/active_scaffold/config/base.rb +0 -75
  164. data/lib/active_scaffold/config/core.rb +0 -236
  165. data/lib/active_scaffold/config/create.rb +0 -32
  166. data/lib/active_scaffold/config/delete.rb +0 -32
  167. data/lib/active_scaffold/config/field_search.rb +0 -79
  168. data/lib/active_scaffold/config/form.rb +0 -64
  169. data/lib/active_scaffold/config/list.rb +0 -247
  170. data/lib/active_scaffold/config/mark.rb +0 -30
  171. data/lib/active_scaffold/config/nested.rb +0 -42
  172. data/lib/active_scaffold/config/search.rb +0 -73
  173. data/lib/active_scaffold/config/show.rb +0 -31
  174. data/lib/active_scaffold/config/subform.rb +0 -35
  175. data/lib/active_scaffold/config/update.rb +0 -33
  176. data/lib/active_scaffold/configurable.rb +0 -29
  177. data/lib/active_scaffold/constraints.rb +0 -171
  178. data/lib/active_scaffold/data_structures/action_columns.rb +0 -142
  179. data/lib/active_scaffold/data_structures/action_link.rb +0 -185
  180. data/lib/active_scaffold/data_structures/action_links.rb +0 -191
  181. data/lib/active_scaffold/data_structures/actions.rb +0 -45
  182. data/lib/active_scaffold/data_structures/bridge.rb +0 -22
  183. data/lib/active_scaffold/data_structures/column.rb +0 -401
  184. data/lib/active_scaffold/data_structures/columns.rb +0 -75
  185. data/lib/active_scaffold/data_structures/error_message.rb +0 -24
  186. data/lib/active_scaffold/data_structures/nested_info.rb +0 -171
  187. data/lib/active_scaffold/data_structures/set.rb +0 -61
  188. data/lib/active_scaffold/data_structures/sorting.rb +0 -167
  189. data/lib/active_scaffold/engine.rb +0 -4
  190. data/lib/active_scaffold/extensions/action_controller_rendering.rb +0 -20
  191. data/lib/active_scaffold/extensions/action_controller_rescueing.rb +0 -7
  192. data/lib/active_scaffold/extensions/action_view_rendering.rb +0 -115
  193. data/lib/active_scaffold/extensions/active_record_offset.rb +0 -12
  194. data/lib/active_scaffold/extensions/array.rb +0 -7
  195. data/lib/active_scaffold/extensions/cache_association.rb +0 -16
  196. data/lib/active_scaffold/extensions/localize.rb +0 -10
  197. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +0 -12
  198. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +0 -7
  199. data/lib/active_scaffold/extensions/paginator_extensions.rb +0 -26
  200. data/lib/active_scaffold/extensions/reverse_associations.rb +0 -64
  201. data/lib/active_scaffold/extensions/routing_mapper.rb +0 -48
  202. data/lib/active_scaffold/extensions/to_label.rb +0 -8
  203. data/lib/active_scaffold/extensions/unsaved_associated.rb +0 -61
  204. data/lib/active_scaffold/extensions/unsaved_record.rb +0 -20
  205. data/lib/active_scaffold/extensions/usa_state.rb +0 -46
  206. data/lib/active_scaffold/finder.rb +0 -399
  207. data/lib/active_scaffold/helpers/association_helpers.rb +0 -42
  208. data/lib/active_scaffold/helpers/controller_helpers.rb +0 -94
  209. data/lib/active_scaffold/helpers/form_column_helpers.rb +0 -322
  210. data/lib/active_scaffold/helpers/human_condition_helpers.rb +0 -64
  211. data/lib/active_scaffold/helpers/id_helpers.rb +0 -131
  212. data/lib/active_scaffold/helpers/list_column_helpers.rb +0 -374
  213. data/lib/active_scaffold/helpers/pagination_helpers.rb +0 -62
  214. data/lib/active_scaffold/helpers/search_column_helpers.rb +0 -257
  215. data/lib/active_scaffold/helpers/show_column_helpers.rb +0 -44
  216. data/lib/active_scaffold/helpers/view_helpers.rb +0 -398
  217. data/lib/active_scaffold/marked_model.rb +0 -38
  218. data/lib/active_scaffold/paginator.rb +0 -136
  219. data/lib/active_scaffold/responds_to_parent.rb +0 -70
  220. data/lib/active_scaffold/tableless.rb +0 -83
  221. data/lib/active_scaffold/version.rb +0 -9
  222. data/lib/active_scaffold_env.rb +0 -13
  223. data/lib/generators/active_scaffold/USAGE +0 -29
  224. data/lib/generators/active_scaffold/active_scaffold_generator.rb +0 -21
  225. data/lib/generators/active_scaffold_controller/USAGE +0 -19
  226. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +0 -29
  227. data/lib/generators/active_scaffold_controller/templates/controller.rb +0 -4
  228. data/lib/generators/active_scaffold_controller/templates/helper.rb +0 -2
  229. data/public/blank.html +0 -33
  230. data/shoulda_macros/macros.rb +0 -136
  231. data/vendor/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  232. data/vendor/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  233. data/vendor/assets/images/ui-bg_flat_10_000000_40x100.png +0 -0
  234. data/vendor/assets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  235. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  236. data/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  237. data/vendor/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  238. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  239. data/vendor/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  240. data/vendor/assets/images/ui-icons_222222_256x240.png +0 -0
  241. data/vendor/assets/images/ui-icons_228ef1_256x240.png +0 -0
  242. data/vendor/assets/images/ui-icons_ef8c08_256x240.png +0 -0
  243. data/vendor/assets/images/ui-icons_ffd27a_256x240.png +0 -0
  244. data/vendor/assets/images/ui-icons_ffffff_256x240.png +0 -0
  245. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +0 -1276
  246. data/vendor/assets/stylesheets/jquery-ui.css +0 -568
@@ -1,46 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module FormOptionsHelper
4
-
5
- # Return a full select and option tags for the given object and method, using usa_state_options_for_select to generate the list of option <tags>.
6
- def usa_state_select(object, method, priority_states = nil, options = {}, html_options = {})
7
- InstanceTag.new(object, method, self, options.delete(:object)).to_usa_state_select_tag(priority_states, options, html_options)
8
- end
9
-
10
-
11
- # Returns a string of option tags for the states in the United States. Supply a state name as +selected to
12
- # have it marked as the selected option tag. Included also is the option to set a couple of +priority_states+
13
- # in case you want to highligh a local area
14
- # NOTE: Only the option tags are returned from this method, wrap it in a <select>
15
- def usa_state_options_for_select(selected = nil, priority_states = nil)
16
- state_options = ""
17
- if priority_states
18
- state_options += options_for_select(priority_states, selected)
19
- state_options += "<option>-------------</option>\n"
20
- end
21
-
22
- if priority_states && priority_states.include?(selected)
23
- state_options += options_for_select(USASTATES - priority_states, selected)
24
- else
25
- state_options += options_for_select(USASTATES, selected)
26
- end
27
-
28
- return state_options
29
- end
30
-
31
- USASTATES = [["Alabama", "AL"], ["Alaska", "AK"], ["Arizona", "AZ"], ["Arkansas", "AR"], ["California", "CA"], ["Colorado", "CO"], ["Connecticut", "CT"], ["Delaware", "DE"], ["District of Columbia", "DC"], ["Florida", "FL"], ["Georgia", "GA"], ["Hawaii", "HI"], ["Idaho", "ID"], ["Illinois", "IL"], ["Indiana", "IN"], ["Iowa", "IA"], ["Kansas", "KS"], ["Kentucky", "KY"], ["Louisiana", "LA"], ["Maine", "ME"], ["Maryland", "MD"], ["Massachusetts", "MA"], ["Michigan", "MI"], ["Minnesota", "MN"], ["Mississippi", "MS"], ["Missouri", "MO"], ["Montana", "MT"], ["Nebraska", "NE"], ["Nevada", "NV"], ["New Hampshire", "NH"], ["New Jersey", "NJ"], ["New Mexico", "NM"], ["New York", "NY"], ["North Carolina", "NC"], ["North Dakota", "ND"], ["Ohio", "OH"], ["Oklahoma", "OK"], ["Oregon", "OR"], ["Pennsylvania", "PA"], ["Rhode Island", "RI"], ["South Carolina", "SC"], ["South Dakota", "SD"], ["Tennessee", "TN"], ["Texas", "TX"], ["Utah", "UT"], ["Vermont", "VT"], ["Virginia", "VA"], ["Washington", "WA"], ["Wisconsin", "WI"], ["West Virginia", "WV"], ["Wyoming", "WY"]] unless const_defined?("USASTATES")
32
-
33
- end
34
-
35
- class InstanceTag #:nodoc:
36
- include FormOptionsHelper
37
-
38
- def to_usa_state_select_tag(priority_states, options, html_options)
39
- html_options = html_options.stringify_keys
40
- add_default_name_and_id(html_options)
41
- value = value(object) if method(:value).arity > 0
42
- content_tag("select", add_options(usa_state_options_for_select(value, priority_states), options, value), html_options)
43
- end
44
- end
45
- end
46
- end
@@ -1,399 +0,0 @@
1
- module ActiveScaffold
2
- module Finder
3
- def self.like_operator
4
- @@like_operator ||= ::ActiveRecord::Base.connection.adapter_name == "PostgreSQL" ? "ILIKE" : "LIKE"
5
- end
6
-
7
- module ClassMethods
8
- # Takes a collection of search terms (the tokens) and creates SQL that
9
- # searches all specified ActiveScaffold columns. A row will match if each
10
- # token is found in at least one of the columns.
11
- def create_conditions_for_columns(tokens, columns, text_search = :full)
12
- # if there aren't any columns, then just return a nil condition
13
- return unless columns.length > 0
14
- like_pattern = like_pattern(text_search)
15
-
16
- tokens = [tokens] if tokens.is_a? String
17
-
18
- where_clauses = []
19
- columns.each do |column|
20
- Array(column.search_sql).each do |search_sql|
21
- where_clauses << "#{search_sql} #{(column.column.nil? || column.column.text?) ? ActiveScaffold::Finder.like_operator : '='} ?"
22
- end
23
- end
24
- phrase = where_clauses.join(' OR ')
25
-
26
- tokens.collect do |value|
27
- columns.inject([phrase]) do |condition, column|
28
- Array(column.search_sql).size.times do
29
- condition.push((column.column.nil? || column.column.text?) ? like_pattern.sub('?', value) : column.column.type_cast(value))
30
- end
31
- condition
32
- end
33
- end
34
- end
35
-
36
- # Generates an SQL condition for the given ActiveScaffold column based on
37
- # that column's database type (or form_ui ... for virtual columns?).
38
- # TODO: this should reside on the column, not the controller
39
- def condition_for_column(column, value, text_search = :full)
40
- like_pattern = like_pattern(text_search)
41
- if self.respond_to?("condition_for_#{column.name}_column")
42
- return self.send("condition_for_#{column.name}_column", column, value, like_pattern)
43
- end
44
- return unless column and column.search_sql and not value.blank?
45
- search_ui = column.search_ui || column.column.try(:type)
46
- begin
47
- sql, *values = if search_ui && self.respond_to?("condition_for_#{search_ui}_type")
48
- self.send("condition_for_#{search_ui}_type", column, value, like_pattern)
49
- else
50
- if column.search_sql.instance_of? Proc
51
- column.search_sql.call(value)
52
- else
53
- case search_ui
54
- when :boolean, :checkbox
55
- ["%{search_sql} = ?", column.column ? column.column.type_cast(value) : value]
56
- when :integer, :decimal, :float
57
- condition_for_numeric(column, value)
58
- when :string, :range
59
- condition_for_range(column, value, like_pattern)
60
- when :date, :time, :datetime, :timestamp
61
- condition_for_datetime(column, value)
62
- when :select, :multi_select, :country, :usa_state, :chosen, :multi_chosen
63
- ["%{search_sql} in (?)", Array(value)]
64
- else
65
- if column.column.nil? || column.column.text?
66
- ["%{search_sql} #{ActiveScaffold::Finder.like_operator} ?", like_pattern.sub('?', value)]
67
- else
68
- ["%{search_sql} = ?", column.column.type_cast(value)]
69
- end
70
- end
71
- end
72
- end
73
- return nil unless sql
74
-
75
- conditions = [column.search_sql.collect { |search_sql| sql % {:search_sql => search_sql} }.join(' OR ')]
76
- conditions += values*column.search_sql.size if values.present?
77
- conditions
78
- rescue Exception => e
79
- logger.error Time.now.to_s + "#{e.inspect} -- on the ActiveScaffold column :#{column.name}, search_ui = #{search_ui} in #{self.name}"
80
- raise e
81
- end
82
- end
83
-
84
- def condition_for_numeric(column, value)
85
- if !value.is_a?(Hash)
86
- ["%{search_sql} = ?", condition_value_for_numeric(column, value)]
87
- elsif ActiveScaffold::Finder::NullComparators.include?(value[:opt])
88
- condition_for_null_type(column, value[:opt])
89
- elsif value[:from].blank? or not ActiveScaffold::Finder::NumericComparators.include?(value[:opt])
90
- nil
91
- elsif value[:opt] == 'BETWEEN'
92
- ["(%{search_sql} BETWEEN ? AND ?)", condition_value_for_numeric(column, value[:from]), condition_value_for_numeric(column, value[:to])]
93
- else
94
- ["%{search_sql} #{value[:opt]} ?", condition_value_for_numeric(column, value[:from])]
95
- end
96
- end
97
-
98
- def condition_for_range(column, value, like_pattern = nil)
99
- if !value.is_a?(Hash)
100
- if column.column.nil? || column.column.text?
101
- ["%{search_sql} #{ActiveScaffold::Finder.like_operator} ?", like_pattern.sub('?', value)]
102
- else
103
- ["%{search_sql} = ?", column.column.type_cast(value)]
104
- end
105
- elsif ActiveScaffold::Finder::NullComparators.include?(value[:opt])
106
- condition_for_null_type(column, value[:opt], like_pattern)
107
- elsif value[:from].blank?
108
- nil
109
- elsif ActiveScaffold::Finder::StringComparators.values.include?(value[:opt])
110
- ["%{search_sql} #{ActiveScaffold::Finder.like_operator} ?", value[:opt].sub('?', value[:from])]
111
- elsif value[:opt] == 'BETWEEN'
112
- ["(%{search_sql} BETWEEN ? AND ?)", value[:from], value[:to]]
113
- elsif ActiveScaffold::Finder::NumericComparators.include?(value[:opt])
114
- ["%{search_sql} #{value[:opt]} ?", value[:from]]
115
- else
116
- nil
117
- end
118
- end
119
-
120
- def condition_value_for_datetime(value, conversion = :to_time)
121
- if value.is_a? Hash
122
- Time.zone.local(*[:year, :month, :day, :hour, :minute, :second].collect {|part| value[part].to_i}) rescue nil
123
- elsif value.respond_to?(:strftime)
124
- if conversion == :to_time
125
- # Explicitly get the current zone, because TimeWithZone#to_time in rails 3.2.3 returns UTC.
126
- # https://github.com/rails/rails/pull/2453
127
- value.to_time.in_time_zone
128
- else
129
- value.send(conversion)
130
- end
131
- elsif conversion == :to_date
132
- Date.strptime(value, I18n.t('date.formats.default')) rescue nil
133
- else
134
- parts = Date._parse(value)
135
- format = I18n.translate 'time.formats.picker', :default => '' if ActiveScaffold.js_framework == :jquery
136
- if format.blank?
137
- time_parts = [[:hour, '%H'], [:min, '%M'], [:sec, '%S']].collect {|part, format_part| format_part if parts[part].present?}.compact
138
- format = "#{I18n.t('date.formats.default')} #{time_parts.join(':')} #{'%z' if parts[:offset].present?}"
139
- else
140
- format += ' %z' if parts[:offset].present? && format !~ /%z/i
141
- end
142
- time = DateTime.strptime(value, format)
143
- time = Time.zone.local_to_utc(time).in_time_zone unless parts[:offset]
144
- time = time.send(conversion) unless conversion == :to_time
145
- time
146
- end unless value.nil? || value.blank?
147
- end
148
-
149
- def condition_value_for_numeric(column, value)
150
- return value if value.nil?
151
- value = i18n_number_to_native_format(value) if [:i18n_number, :currency].include?(column.options[:format])
152
- case (column.search_ui || column.column.type)
153
- when :integer then value.to_i rescue value ? 1 : 0
154
- when :float then value.to_f
155
- when :decimal then ActiveRecord::ConnectionAdapters::Column.value_to_decimal(value)
156
- else
157
- value
158
- end
159
- end
160
-
161
- def i18n_number_to_native_format(value)
162
- native = '.'
163
- delimiter = I18n.t('number.format.delimiter')
164
- separator = I18n.t('number.format.separator')
165
- return value if value.blank? || !value.is_a?(String)
166
- unless delimiter == native && !value.include?(separator) && value !~ /\.\d{3}$/
167
- value.gsub(/[^0-9\-#{I18n.t('number.format.separator')}]/, '').gsub(I18n.t('number.format.separator'), native)
168
- else
169
- value
170
- end
171
- end
172
-
173
- def datetime_conversion_for_condition(column)
174
- if column.column
175
- column.column.type == :date ? :to_date : :to_time
176
- else
177
- :to_time
178
- end
179
- end
180
-
181
- def condition_for_datetime(column, value, like_pattern = nil)
182
- conversion = datetime_conversion_for_condition(column)
183
- from_value = condition_value_for_datetime(value[:from], conversion)
184
- to_value = condition_value_for_datetime(value[:to], conversion)
185
-
186
- if from_value.nil? and to_value.nil?
187
- nil
188
- elsif !from_value
189
- ["%{search_sql} <= ?", to_value.to_s(:db)]
190
- elsif !to_value
191
- ["%{search_sql} >= ?", from_value.to_s(:db)]
192
- else
193
- ["%{search_sql} BETWEEN ? AND ?", from_value.to_s(:db), to_value.to_s(:db)]
194
- end
195
- end
196
-
197
- def condition_for_record_select_type(column, value, like_pattern = nil)
198
- if value.is_a?(Array)
199
- ["%{search_sql} IN (?)", value]
200
- else
201
- ["%{search_sql} = ?", value]
202
- end
203
- end
204
-
205
- def condition_for_null_type(column, value, like_pattern = nil)
206
- case value.to_sym
207
- when :null
208
- ["%{search_sql} is null", []]
209
- when :not_null
210
- ["%{search_sql} is not null", []]
211
- else
212
- nil
213
- end
214
- end
215
-
216
- def like_pattern(text_search)
217
- case text_search
218
- when :full then '%?%'
219
- when :start then '?%'
220
- when :end then '%?'
221
- else '?'
222
- end
223
- end
224
- end
225
-
226
- NumericComparators = [
227
- '=',
228
- '>=',
229
- '<=',
230
- '>',
231
- '<',
232
- '!=',
233
- 'BETWEEN'
234
- ]
235
- StringComparators = {
236
- :contains => '%?%',
237
- :begins_with => '?%',
238
- :ends_with => '%?'
239
- }
240
- NullComparators = [
241
- 'null',
242
- 'not_null'
243
- ]
244
-
245
-
246
-
247
- def self.included(klass)
248
- klass.extend ClassMethods
249
- end
250
-
251
- protected
252
-
253
- attr_writer :active_scaffold_conditions
254
- def active_scaffold_conditions
255
- @active_scaffold_conditions ||= []
256
- end
257
-
258
- attr_writer :active_scaffold_includes
259
- def active_scaffold_includes
260
- @active_scaffold_includes ||= []
261
- end
262
-
263
- attr_writer :active_scaffold_habtm_joins
264
- def active_scaffold_habtm_joins
265
- @active_scaffold_habtm_joins ||= []
266
- end
267
-
268
- def all_conditions
269
- [
270
- active_scaffold_conditions, # from the search modules
271
- conditions_for_collection, # from the dev
272
- conditions_from_params, # from the parameters (e.g. /users/list?first_name=Fred)
273
- conditions_from_constraints, # from any constraints (embedded scaffolds)
274
- active_scaffold_session_storage[:conditions] # embedding conditions (weaker constraints)
275
- ]
276
- end
277
-
278
- # returns a single record (the given id) but only if it's allowed for the specified action.
279
- # accomplishes this by checking model.#{action}_authorized?
280
- # TODO: this should reside on the model, not the controller
281
- def find_if_allowed(id, crud_type, klass = beginning_of_chain)
282
- record = klass.find(id)
283
- raise ActiveScaffold::RecordNotAllowed, "#{klass} with id = #{id}" unless record.authorized_for?(:crud_type => crud_type.to_sym)
284
- return record
285
- end
286
- # valid options may include:
287
- # * :sorting - a Sorting DataStructure (basically an array of hashes of field => direction, e.g. [{:field1 => 'asc'}, {:field2 => 'desc'}]). please note that multi-column sorting has some limitations: if any column in a multi-field sort uses method-based sorting, it will be ignored. method sorting only works for single-column sorting.
288
- # * :per_page
289
- # * :page
290
- def finder_options(options = {})
291
- search_conditions = all_conditions
292
- full_includes = (active_scaffold_includes.blank? ? nil : active_scaffold_includes)
293
-
294
- # create a general-use options array that's compatible with Rails finders
295
- finder_options = { :reorder => options[:sorting].try(:clause),
296
- :conditions => search_conditions,
297
- :joins => joins_for_finder,
298
- :includes => full_includes}
299
-
300
- finder_options.merge! custom_finder_options
301
- finder_options
302
- end
303
-
304
- def count_items(find_options = {}, count_includes = nil)
305
- count_includes ||= find_options[:includes] unless find_options[:conditions].nil?
306
- options = find_options.reject{|k,v| [:select, :reorder].include? k}
307
- options[:includes] = count_includes
308
-
309
- # NOTE: we must use :include in the count query, because some conditions may reference other tables
310
- count_query = append_to_query(beginning_of_chain, options)
311
- count = count_query.count
312
-
313
- # Converts count to an integer if ActiveRecord returned an OrderedHash
314
- # that happens when find_options contains a :group key
315
- count = count.length if count.is_a? ActiveSupport::OrderedHash
316
- count
317
- end
318
-
319
- # returns a Paginator::Page (not from ActiveRecord::Paginator) for the given parameters
320
- # See finder_options for valid options
321
- def find_page(options = {})
322
- options.assert_valid_keys :sorting, :per_page, :page, :count_includes, :pagination
323
- options[:per_page] ||= 999999999
324
- options[:page] ||= 1
325
-
326
- find_options = finder_options(options)
327
-
328
- # NOTE: we must use :include in the count query, because some conditions may reference other tables
329
- if options[:pagination] && options[:pagination] != :infinite
330
- count = count_items(find_options, options[:count_includes])
331
- end
332
-
333
- klass = beginning_of_chain
334
- # we build the paginator differently for method- and sql-based sorting
335
- if options[:sorting] and options[:sorting].sorts_by_method?
336
- pager = ::Paginator.new(count, options[:per_page]) do |offset, per_page|
337
- sorted_collection = sort_collection_by_column(append_to_query(klass, find_options).all, *options[:sorting].first)
338
- sorted_collection = sorted_collection.slice(offset, per_page) if options[:pagination]
339
- sorted_collection
340
- end
341
- else
342
- pager = ::Paginator.new(count, options[:per_page]) do |offset, per_page|
343
- find_options.merge!(:offset => offset, :limit => per_page) if options[:pagination]
344
- append_to_query(klass, find_options).all
345
- end
346
- end
347
- pager.page(options[:page])
348
- end
349
-
350
- def calculate(column)
351
- conditions = all_conditions
352
- includes = active_scaffold_config.list.count_includes
353
- includes ||= active_scaffold_includes unless conditions.nil?
354
- append_to_query(beginning_of_chain, :conditions => conditions, :includes => includes,
355
- :joins => joins_for_collection).calculate(column.calculate, column.name)
356
- end
357
-
358
- def append_to_query(query, options)
359
- options.assert_valid_keys :where, :select, :group, :reorder, :limit, :offset, :joins, :includes, :lock, :readonly, :from, :conditions
360
- query = apply_conditions(query, *options.delete(:conditions)) if options[:conditions]
361
- options.reject{|k, v| v.blank?}.inject(query) do |query, (k, v)|
362
- query.send((k.to_sym), v)
363
- end
364
- end
365
-
366
- def joins_for_finder
367
- case joins_for_collection
368
- when String
369
- [ joins_for_collection ]
370
- when Array
371
- joins_for_collection
372
- else
373
- []
374
- end + active_scaffold_habtm_joins
375
- end
376
-
377
- def apply_conditions(query, *conditions)
378
- conditions.reject(&:blank?).inject(query) do |query, condition|
379
- if condition.is_a?(Array) && !condition.first.is_a?(String) # multiple conditions
380
- apply_conditions(query, *condition)
381
- else
382
- query.where(condition)
383
- end
384
- end
385
- end
386
-
387
- # TODO: this should reside on the column, not the controller
388
- def sort_collection_by_column(collection, column, order)
389
- sorter = column.sort[:method]
390
- collection = collection.sort_by { |record|
391
- value = (sorter.is_a? Proc) ? record.instance_eval(&sorter) : record.instance_eval(sorter)
392
- value = '' if value.nil?
393
- value
394
- }
395
- collection.reverse! if order.downcase == 'desc'
396
- collection
397
- end
398
- end
399
- end
@@ -1,42 +0,0 @@
1
- module ActiveScaffold
2
- module Helpers
3
- module AssociationHelpers
4
- # Provides a way to honor the :conditions on an association while searching the association's klass
5
- def association_options_find(association, conditions = nil)
6
- relation = association.klass.where(conditions).where(association.options[:conditions])
7
- relation = relation.includes(association.options[:include]) if association.options[:include]
8
- relation.all
9
- end
10
-
11
- def association_options_count(association, conditions = nil)
12
- association.klass.where(conditions).where(association.options[:conditions]).count
13
- end
14
-
15
- # returns options for the given association as a collection of [id, label] pairs intended for the +options_for_select+ helper.
16
- def options_for_association(association, include_all = false)
17
- available_records = association_options_find(association, include_all ? nil : options_for_association_conditions(association))
18
- available_records ||= []
19
- available_records.sort{|a,b| a.to_label <=> b.to_label}.collect { |model| [ model.to_label, model.id ] }
20
- end
21
-
22
- def options_for_association_count(association)
23
- association_options_count(association, options_for_association_conditions(association))
24
- end
25
-
26
- # A useful override for customizing the records present in an association dropdown.
27
- # Should work in both the subform and form_ui=>:select modes.
28
- # Check association.name to specialize the conditions per-column.
29
- def options_for_association_conditions(association)
30
- return nil if association.options[:through]
31
- case association.macro
32
- when :has_one, :has_many
33
- # Find only orphaned objects
34
- "#{association.foreign_key} IS NULL"
35
- when :belongs_to, :has_and_belongs_to_many
36
- # Find all
37
- nil
38
- end
39
- end
40
- end
41
- end
42
- end