active_scaffold 3.2.17 → 3.2.18

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 (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