active_scaffold 3.0.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 (272) hide show
  1. data/.autotest +27 -0
  2. data/CHANGELOG +152 -0
  3. data/Gemfile +4 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README +51 -0
  6. data/Rakefile +24 -0
  7. data/active_scaffold.gemspec +24 -0
  8. data/environment.rb +22 -0
  9. data/frontends/default/images/add.gif +0 -0
  10. data/frontends/default/images/arrow_down.gif +0 -0
  11. data/frontends/default/images/arrow_up.gif +0 -0
  12. data/frontends/default/images/close.gif +0 -0
  13. data/frontends/default/images/cross.png +0 -0
  14. data/frontends/default/images/indicator-small.gif +0 -0
  15. data/frontends/default/images/indicator.gif +0 -0
  16. data/frontends/default/images/magnifier.png +0 -0
  17. data/frontends/default/javascripts/jquery/active_scaffold.js +957 -0
  18. data/frontends/default/javascripts/jquery/jquery.editinplace.js +726 -0
  19. data/frontends/default/javascripts/prototype/active_scaffold.js +954 -0
  20. data/frontends/default/javascripts/prototype/dhtml_history.js +867 -0
  21. data/frontends/default/javascripts/prototype/form_enhancements.js +117 -0
  22. data/frontends/default/javascripts/prototype/rico_corner.js +370 -0
  23. data/frontends/default/stylesheets/stylesheet-ie.css +35 -0
  24. data/frontends/default/stylesheets/stylesheet.css +858 -0
  25. data/frontends/default/views/_add_existing_form.html.erb +30 -0
  26. data/frontends/default/views/_base_form.html.erb +41 -0
  27. data/frontends/default/views/_create_form.html.erb +6 -0
  28. data/frontends/default/views/_create_form_on_list.html.erb +5 -0
  29. data/frontends/default/views/_field_search.html.erb +32 -0
  30. data/frontends/default/views/_form.html.erb +24 -0
  31. data/frontends/default/views/_form_association.html.erb +14 -0
  32. data/frontends/default/views/_form_association_footer.html.erb +40 -0
  33. data/frontends/default/views/_form_attribute.html.erb +15 -0
  34. data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
  35. data/frontends/default/views/_form_messages.html.erb +5 -0
  36. data/frontends/default/views/_horizontal_subform.html.erb +19 -0
  37. data/frontends/default/views/_horizontal_subform_header.html.erb +10 -0
  38. data/frontends/default/views/_horizontal_subform_record.html.erb +37 -0
  39. data/frontends/default/views/_human_conditions.html.erb +1 -0
  40. data/frontends/default/views/_list.html.erb +18 -0
  41. data/frontends/default/views/_list_actions.html.erb +16 -0
  42. data/frontends/default/views/_list_calculations.html.erb +16 -0
  43. data/frontends/default/views/_list_column_headings.html.erb +12 -0
  44. data/frontends/default/views/_list_header.html.erb +12 -0
  45. data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
  46. data/frontends/default/views/_list_messages.html.erb +32 -0
  47. data/frontends/default/views/_list_pagination.html.erb +11 -0
  48. data/frontends/default/views/_list_pagination_links.html.erb +9 -0
  49. data/frontends/default/views/_list_record.html.erb +14 -0
  50. data/frontends/default/views/_list_record_columns.html.erb +8 -0
  51. data/frontends/default/views/_list_with_header.html.erb +32 -0
  52. data/frontends/default/views/_messages.html.erb +10 -0
  53. data/frontends/default/views/_render_field.js.rjs +13 -0
  54. data/frontends/default/views/_row.html.erb +12 -0
  55. data/frontends/default/views/_search.html.erb +34 -0
  56. data/frontends/default/views/_search_attribute.html.erb +10 -0
  57. data/frontends/default/views/_show.html.erb +8 -0
  58. data/frontends/default/views/_show_columns.html.erb +12 -0
  59. data/frontends/default/views/_update_actions.html.erb +9 -0
  60. data/frontends/default/views/_update_form.html.erb +5 -0
  61. data/frontends/default/views/_vertical_subform.html.erb +12 -0
  62. data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
  63. data/frontends/default/views/add_existing.js.rjs +17 -0
  64. data/frontends/default/views/add_existing_form.html.erb +5 -0
  65. data/frontends/default/views/create.html.erb +5 -0
  66. data/frontends/default/views/delete.html.erb +13 -0
  67. data/frontends/default/views/destroy.js.rjs +5 -0
  68. data/frontends/default/views/edit_associated.js.rjs +11 -0
  69. data/frontends/default/views/field_search.html.erb +5 -0
  70. data/frontends/default/views/form_messages.js.rjs +1 -0
  71. data/frontends/default/views/list.html.erb +1 -0
  72. data/frontends/default/views/list.js.rjs +1 -0
  73. data/frontends/default/views/on_action_update.js.rjs +8 -0
  74. data/frontends/default/views/on_create.js.rjs +24 -0
  75. data/frontends/default/views/on_update.js.rjs +15 -0
  76. data/frontends/default/views/search.html.erb +5 -0
  77. data/frontends/default/views/show.html.erb +5 -0
  78. data/frontends/default/views/update.html.erb +8 -0
  79. data/frontends/default/views/update_column.js.rjs +13 -0
  80. data/frontends/default/views/update_row.js.rjs +1 -0
  81. data/init.rb +1 -0
  82. data/install_assets.rb +44 -0
  83. data/lib/active_record_permissions.rb +134 -0
  84. data/lib/active_scaffold.rb +279 -0
  85. data/lib/active_scaffold/actions/common_search.rb +22 -0
  86. data/lib/active_scaffold/actions/core.rb +150 -0
  87. data/lib/active_scaffold/actions/create.rb +152 -0
  88. data/lib/active_scaffold/actions/delete.rb +72 -0
  89. data/lib/active_scaffold/actions/field_search.rb +82 -0
  90. data/lib/active_scaffold/actions/list.rb +128 -0
  91. data/lib/active_scaffold/actions/mark.rb +50 -0
  92. data/lib/active_scaffold/actions/nested.rb +241 -0
  93. data/lib/active_scaffold/actions/search.rb +47 -0
  94. data/lib/active_scaffold/actions/show.rb +54 -0
  95. data/lib/active_scaffold/actions/subform.rb +17 -0
  96. data/lib/active_scaffold/actions/update.rb +134 -0
  97. data/lib/active_scaffold/attribute_params.rb +207 -0
  98. data/lib/active_scaffold/bridges/ancestry/bridge.rb +5 -0
  99. data/lib/active_scaffold/bridges/ancestry/lib/ancestry_bridge.rb +38 -0
  100. data/lib/active_scaffold/bridges/bridge.rb +52 -0
  101. data/lib/active_scaffold/bridges/calendar_date_select/bridge.rb +16 -0
  102. data/lib/active_scaffold/bridges/calendar_date_select/lib/as_cds_bridge.rb +79 -0
  103. data/lib/active_scaffold/bridges/carrierwave/bridge.rb +7 -0
  104. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge.rb +38 -0
  105. data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge_helpers.rb +26 -0
  106. data/lib/active_scaffold/bridges/carrierwave/lib/form_ui.rb +35 -0
  107. data/lib/active_scaffold/bridges/carrierwave/lib/list_ui.rb +17 -0
  108. data/lib/active_scaffold/bridges/date_picker/bridge.rb +22 -0
  109. data/lib/active_scaffold/bridges/date_picker/lib/datepicker_bridge.rb +225 -0
  110. data/lib/active_scaffold/bridges/date_picker/public/javascripts/date_picker_bridge.js +22 -0
  111. data/lib/active_scaffold/bridges/file_column/bridge.rb +11 -0
  112. data/lib/active_scaffold/bridges/file_column/lib/as_file_column_bridge.rb +46 -0
  113. data/lib/active_scaffold/bridges/file_column/lib/file_column_helpers.rb +59 -0
  114. data/lib/active_scaffold/bridges/file_column/lib/form_ui.rb +37 -0
  115. data/lib/active_scaffold/bridges/file_column/lib/list_ui.rb +26 -0
  116. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  117. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
  118. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
  119. data/lib/active_scaffold/bridges/paperclip/bridge.rb +12 -0
  120. data/lib/active_scaffold/bridges/paperclip/lib/form_ui.rb +27 -0
  121. data/lib/active_scaffold/bridges/paperclip/lib/list_ui.rb +16 -0
  122. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge.rb +38 -0
  123. data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge_helpers.rb +26 -0
  124. data/lib/active_scaffold/bridges/semantic_attributes/bridge.rb +5 -0
  125. data/lib/active_scaffold/bridges/semantic_attributes/lib/semantic_attributes_bridge.rb +20 -0
  126. data/lib/active_scaffold/bridges/shared/date_bridge.rb +187 -0
  127. data/lib/active_scaffold/bridges/tiny_mce/bridge.rb +5 -0
  128. data/lib/active_scaffold/bridges/tiny_mce/lib/tiny_mce_bridge.rb +45 -0
  129. data/lib/active_scaffold/bridges/validation_reflection/bridge.rb +8 -0
  130. data/lib/active_scaffold/bridges/validation_reflection/lib/validation_reflection_bridge.rb +21 -0
  131. data/lib/active_scaffold/config/base.rb +54 -0
  132. data/lib/active_scaffold/config/core.rb +229 -0
  133. data/lib/active_scaffold/config/create.rb +43 -0
  134. data/lib/active_scaffold/config/delete.rb +25 -0
  135. data/lib/active_scaffold/config/field_search.rb +74 -0
  136. data/lib/active_scaffold/config/form.rb +46 -0
  137. data/lib/active_scaffold/config/list.rb +174 -0
  138. data/lib/active_scaffold/config/mark.rb +22 -0
  139. data/lib/active_scaffold/config/nested.rb +43 -0
  140. data/lib/active_scaffold/config/search.rb +68 -0
  141. data/lib/active_scaffold/config/show.rb +34 -0
  142. data/lib/active_scaffold/config/subform.rb +35 -0
  143. data/lib/active_scaffold/config/update.rb +38 -0
  144. data/lib/active_scaffold/configurable.rb +29 -0
  145. data/lib/active_scaffold/constraints.rb +179 -0
  146. data/lib/active_scaffold/data_structures/action_columns.rb +133 -0
  147. data/lib/active_scaffold/data_structures/action_link.rb +162 -0
  148. data/lib/active_scaffold/data_structures/action_links.rb +59 -0
  149. data/lib/active_scaffold/data_structures/actions.rb +45 -0
  150. data/lib/active_scaffold/data_structures/column.rb +348 -0
  151. data/lib/active_scaffold/data_structures/columns.rb +75 -0
  152. data/lib/active_scaffold/data_structures/error_message.rb +24 -0
  153. data/lib/active_scaffold/data_structures/nested_info.rb +108 -0
  154. data/lib/active_scaffold/data_structures/set.rb +62 -0
  155. data/lib/active_scaffold/data_structures/sorting.rb +168 -0
  156. data/lib/active_scaffold/finder.rb +333 -0
  157. data/lib/active_scaffold/helpers/association_helpers.rb +40 -0
  158. data/lib/active_scaffold/helpers/controller_helpers.rb +40 -0
  159. data/lib/active_scaffold/helpers/country_helpers.rb +352 -0
  160. data/lib/active_scaffold/helpers/form_column_helpers.rb +343 -0
  161. data/lib/active_scaffold/helpers/human_condition_helpers.rb +59 -0
  162. data/lib/active_scaffold/helpers/id_helpers.rb +131 -0
  163. data/lib/active_scaffold/helpers/list_column_helpers.rb +363 -0
  164. data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
  165. data/lib/active_scaffold/helpers/search_column_helpers.rb +238 -0
  166. data/lib/active_scaffold/helpers/show_column_helpers.rb +46 -0
  167. data/lib/active_scaffold/helpers/view_helpers.rb +315 -0
  168. data/lib/active_scaffold/locale/de.rb +113 -0
  169. data/lib/active_scaffold/locale/en.rb +118 -0
  170. data/lib/active_scaffold/locale/es.yml +112 -0
  171. data/lib/active_scaffold/locale/fr.rb +113 -0
  172. data/lib/active_scaffold/locale/hu.yml +63 -0
  173. data/lib/active_scaffold/locale/ja.yml +64 -0
  174. data/lib/active_scaffold/locale/ru.yml +62 -0
  175. data/lib/active_scaffold/marked_model.rb +38 -0
  176. data/lib/dhtml_confirm.rb +54 -0
  177. data/lib/extensions/action_controller_rendering.rb +20 -0
  178. data/lib/extensions/action_view_rendering.rb +113 -0
  179. data/lib/extensions/action_view_resolver.rb +7 -0
  180. data/lib/extensions/active_record_offset.rb +12 -0
  181. data/lib/extensions/array.rb +7 -0
  182. data/lib/extensions/localize.rb +10 -0
  183. data/lib/extensions/name_option_for_datetime.rb +12 -0
  184. data/lib/extensions/nil_id_in_url_params.rb +7 -0
  185. data/lib/extensions/paginator_extensions.rb +26 -0
  186. data/lib/extensions/reverse_associations.rb +62 -0
  187. data/lib/extensions/routing_mapper.rb +34 -0
  188. data/lib/extensions/to_label.rb +8 -0
  189. data/lib/extensions/unsaved_associated.rb +61 -0
  190. data/lib/extensions/unsaved_record.rb +20 -0
  191. data/lib/extensions/usa_state.rb +46 -0
  192. data/lib/generators/active_scaffold/USAGE +29 -0
  193. data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
  194. data/lib/generators/active_scaffold_controller/USAGE +19 -0
  195. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +28 -0
  196. data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
  197. data/lib/generators/active_scaffold_setup/USAGE +10 -0
  198. data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +53 -0
  199. data/lib/paginator.rb +136 -0
  200. data/lib/responds_to_parent.rb +70 -0
  201. data/public/blank.html +33 -0
  202. data/shoulda_macros/macros.rb +136 -0
  203. data/test/bridges/bridge_test.rb +47 -0
  204. data/test/config/base_test.rb +15 -0
  205. data/test/config/create_test.rb +55 -0
  206. data/test/config/list_test.rb +74 -0
  207. data/test/config/show_test.rb +43 -0
  208. data/test/config/update_test.rb +17 -0
  209. data/test/const_mocker.rb +36 -0
  210. data/test/data_structures/action_columns_test.rb +113 -0
  211. data/test/data_structures/action_link_test.rb +78 -0
  212. data/test/data_structures/action_links_test.rb +78 -0
  213. data/test/data_structures/actions_test.rb +25 -0
  214. data/test/data_structures/association_column_test.rb +42 -0
  215. data/test/data_structures/column_test.rb +185 -0
  216. data/test/data_structures/columns_test.rb +69 -0
  217. data/test/data_structures/error_message_test.rb +28 -0
  218. data/test/data_structures/set_test.rb +86 -0
  219. data/test/data_structures/sorting_test.rb +126 -0
  220. data/test/data_structures/standard_column_test.rb +24 -0
  221. data/test/data_structures/virtual_column_test.rb +23 -0
  222. data/test/extensions/active_record_test.rb +45 -0
  223. data/test/extensions/array_test.rb +12 -0
  224. data/test/helpers/form_column_helpers_test.rb +31 -0
  225. data/test/helpers/list_column_helpers_test.rb +31 -0
  226. data/test/helpers/pagination_helpers_test.rb +55 -0
  227. data/test/misc/active_record_permissions_test.rb +154 -0
  228. data/test/misc/attribute_params_test.rb +110 -0
  229. data/test/misc/configurable_test.rb +96 -0
  230. data/test/misc/constraints_test.rb +193 -0
  231. data/test/misc/finder_test.rb +93 -0
  232. data/test/misc/lang_test.rb +12 -0
  233. data/test/mock_app/.gitignore +2 -0
  234. data/test/mock_app/app/controllers/application_controller.rb +10 -0
  235. data/test/mock_app/app/helpers/application_helper.rb +3 -0
  236. data/test/mock_app/config/boot.rb +110 -0
  237. data/test/mock_app/config/database.yml +16 -0
  238. data/test/mock_app/config/environment.rb +43 -0
  239. data/test/mock_app/config/environments/development.rb +17 -0
  240. data/test/mock_app/config/environments/production.rb +28 -0
  241. data/test/mock_app/config/environments/test.rb +28 -0
  242. data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
  243. data/test/mock_app/config/initializers/inflections.rb +10 -0
  244. data/test/mock_app/config/initializers/mime_types.rb +5 -0
  245. data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
  246. data/test/mock_app/config/initializers/session_store.rb +15 -0
  247. data/test/mock_app/config/locales/en.yml +5 -0
  248. data/test/mock_app/config/routes.rb +43 -0
  249. data/test/mock_app/db/test.sqlite3 +1 -0
  250. data/test/mock_app/public/blank.html +33 -0
  251. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  252. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  253. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  254. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  255. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  256. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  257. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  258. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  259. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  260. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  261. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
  262. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
  263. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
  264. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  265. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  266. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  267. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +839 -0
  268. data/test/model_stub.rb +55 -0
  269. data/test/run_all.rb +8 -0
  270. data/test/test_helper.rb +39 -0
  271. data/uninstall.rb +13 -0
  272. metadata +478 -0
@@ -0,0 +1,24 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper.rb')
2
+ # require 'test/model_stub'
3
+
4
+ class StandardColumnTest < Test::Unit::TestCase
5
+ def setup
6
+ @standard_column = ActiveScaffold::DataStructures::Column.new(ModelStub.columns.first.name, ModelStub)
7
+ end
8
+
9
+ def test_virtuality
10
+ assert @standard_column.column
11
+ assert !@standard_column.virtual?
12
+ end
13
+
14
+ def test_sorting
15
+ hash = {:sql => '"model_stubs"."a"'}
16
+ assert @standard_column.sortable?
17
+ assert_equal hash, @standard_column.sort # check default
18
+ end
19
+
20
+ def test_searching
21
+ assert @standard_column.searchable?
22
+ assert_equal '"model_stubs"."a"', @standard_column.search_sql # check default
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper.rb')
2
+
3
+ class VirtualColumnTest < Test::Unit::TestCase
4
+ def setup
5
+ @virtual_column = ActiveScaffold::DataStructures::Column.new(:fake, ModelStub)
6
+ end
7
+
8
+ def test_virtuality
9
+ assert !@virtual_column.column
10
+ assert !@virtual_column.association
11
+ assert @virtual_column.virtual?
12
+ end
13
+
14
+ def test_sorting
15
+ # right now, there's no intelligent sorting on virtual columns
16
+ assert !@virtual_column.sortable?
17
+ end
18
+
19
+ def test_searching
20
+ # right now, there's no intelligent searching on virtual columns
21
+ assert !@virtual_column.searchable?
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper.rb')
2
+ #require 'test/model_stub'
3
+
4
+ class ActiveRecordTest < Test::Unit::TestCase
5
+ def setup
6
+ @record = ModelStub.new
7
+ end
8
+
9
+ def test_to_label
10
+ # without anything defined, it'll use the to_s method (e.g. #<ModelStub:0xb7379300>)
11
+ assert_match /^#<[a-z]+:0x[0-9a-f]+>$/i, @record.to_label
12
+
13
+ class << @record
14
+ def to_s
15
+ 'to_s'
16
+ end
17
+ end
18
+
19
+ assert_equal 'to_s', @record.to_label
20
+
21
+ class << @record
22
+ def title
23
+ 'title'
24
+ end
25
+ end
26
+
27
+ assert_equal 'title', @record.to_label
28
+
29
+ class << @record
30
+ def label
31
+ 'label'
32
+ end
33
+ end
34
+
35
+ assert_equal 'label', @record.to_label
36
+
37
+ class << @record
38
+ def name
39
+ 'name'
40
+ end
41
+ end
42
+
43
+ assert_equal 'name', @record.to_label
44
+ end
45
+ end
@@ -0,0 +1,12 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper.rb')
2
+
3
+ class ArrayTest < Test::Unit::TestCase
4
+ def test_after
5
+ @sequence = ['a', 'b', 'c']
6
+
7
+ assert_equal 'b', @sequence.after('a')
8
+ assert_equal 'c', @sequence.after('b')
9
+ assert_equal 'a', @sequence.after('c')
10
+ assert_equal nil, @sequence.after('d')
11
+ end
12
+ end
@@ -0,0 +1,31 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper.rb')
2
+
3
+ class FormColumnHelpersTest < ActionView::TestCase
4
+ include ActiveScaffold::Helpers::FormColumnHelpers
5
+
6
+ def setup
7
+ @column = ActiveScaffold::DataStructures::Column.new(:a, ModelStub)
8
+ @record = stub(:a => nil)
9
+ end
10
+
11
+ def test_choices_for_select_form_ui_for_simple_column
12
+ @column.options[:options] = [:value_1, :value_2, :value_3]
13
+ assert_dom_equal '<select name="record[a]" id="record_a"><option value="value_1">Value 1</option><option value="value_2">Value 2</option><option value="value_3">Value 3</option></select>', active_scaffold_input_select(@column, {})
14
+
15
+ @column.options[:options] = %w(value_1 value_2 value_3)
16
+ assert_dom_equal '<select name="record[a]" id="record_a"><option value="value_1">value_1</option><option value="value_2">value_2</option><option value="value_3">value_3</option></select>', active_scaffold_input_select(@column, {})
17
+
18
+ @column.options[:options] = [%w(text_1 value_1), %w(text_2 value_2), %w(text_3 value_3)]
19
+ assert_dom_equal '<select name="record[a]" id="record_a"><option value="value_1">text_1</option><option value="value_2">text_2</option><option value="value_3">text_3</option></select>', active_scaffold_input_select(@column, {})
20
+
21
+ @column.options[:options] = [[:text_1, :value_1], [:text_2, :value_2], [:text_3, :value_3]]
22
+ assert_dom_equal '<select name="record[a]" id="record_a"><option value="value_1">Text 1</option><option value="value_2">Text 2</option><option value="value_3">Text 3</option></select>', active_scaffold_input_select(@column, {})
23
+ end
24
+
25
+ def test_options_for_select_form_ui_for_simple_column
26
+ @column.options = {:include_blank => 'None', :selected => 'value_2', :disabled => %w(value_1 value_3)}
27
+ @column.options[:options] = %w(value_1 value_2 value_3)
28
+ @column.options[:html_options] = {:class => 'big'}
29
+ assert_dom_equal '<select name="record[a]" class="big" id="record_a"><option value="">None</option><option disabled="disabled" value="value_1">value_1</option><option selected="selected" value="value_2">value_2</option><option disabled="disabled" value="value_3">value_3</option></select>', active_scaffold_input_select(@column, {})
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper.rb')
2
+
3
+ class ListColumnHelpersTest < ActionView::TestCase
4
+ include ActiveScaffold::Helpers::ListColumnHelpers
5
+ include ActiveScaffold::Helpers::ViewHelpers
6
+
7
+ def setup
8
+ @column = ActiveScaffold::DataStructures::Column.new(:a, ModelStub)
9
+ @record = stub(:a => 'value_2')
10
+ @config = stub(:list => stub(:empty_field_text => '-'))
11
+ end
12
+
13
+ def test_options_for_select_list_ui_for_simple_column
14
+ @column.options[:options] = [:value_1, :value_2, :value_3]
15
+ assert_equal 'Value 2', active_scaffold_column_select(@column, @record)
16
+
17
+ @column.options[:options] = %w(value_1 value_2 value_3)
18
+ assert_equal 'value_2', active_scaffold_column_select(@column, @record)
19
+
20
+ @column.options[:options] = [%w(text_1 value_1), %w(text_2 value_2), %w(text_3 value_3)]
21
+ assert_equal 'text_2', active_scaffold_column_select(@column, @record)
22
+
23
+ @column.options[:options] = [[:text_1, :value_1], [:text_2, :value_2], [:text_3, :value_3]]
24
+ assert_equal 'Text 2', active_scaffold_column_select(@column, @record)
25
+ end
26
+
27
+ private
28
+ def active_scaffold_config
29
+ @config
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper.rb')
2
+
3
+ class PaginationHelpersTest < Test::Unit::TestCase
4
+ include ActiveScaffold::Helpers::PaginationHelpers
5
+
6
+ def test_links
7
+ self.stubs(:pagination_ajax_link).returns('l')
8
+
9
+ assert_equal '1', links(1, 1)
10
+ assert_equal '1 l', links(1, 2)
11
+ assert_equal '1 l l', links(1, 3)
12
+ assert_equal '1 l l l', links(1, 4)
13
+ assert_equal '1 l l .. l', links(1, 5)
14
+ assert_equal '1 l l .. l', links(1, 6)
15
+
16
+ assert_equal 'l 2 l l .. l', links(2, 10)
17
+ assert_equal 'l l 3 l l .. l', links(3, 10)
18
+ assert_equal 'l l l 4 l l .. l', links(4, 10)
19
+ assert_equal 'l .. l l 5 l l .. l', links(5, 10)
20
+ assert_equal 'l .. l l 6 l l .. l', links(6, 10)
21
+
22
+ assert_equal '1 l l l l', links(1, 5, 3)
23
+ assert_equal '1 l l l .. l', links(1, 6, 3)
24
+ assert_equal 'l l l l 5 l l l .. l', links(5, 10, 3)
25
+ assert_equal 'l .. l l l 6 l l l l', links(6, 10, 3)
26
+ assert_equal 'l .. l l l 6 l l l .. l', links(6, 20, 3)
27
+ end
28
+
29
+ def test_links_with_infinite_pagination
30
+ self.stubs(:pagination_ajax_link).returns('l')
31
+
32
+ assert_equal '1 l l .. l .. l', links(1, nil, 2, true)
33
+ assert_equal 'l 2 l l .. l .. l', links(2, nil, 2, true)
34
+ assert_equal 'l l 3 l l .. l .. l', links(3, nil, 2, true)
35
+ assert_equal 'l l l 4 l l .. l .. l', links(4, nil, 2, true)
36
+ assert_equal 'l .. l l 5 l l .. l .. l', links(5, nil, 2, true)
37
+
38
+ assert_equal 'l .. l l 20 l l .. l .. l', links(20, nil, 2, true)
39
+ assert_equal 'l .. l l 21 l l .. l .. l', links(21, nil, 2, true)
40
+ assert_equal 'l l .. l l 22 l l .. l .. l', links(22, nil, 2, true)
41
+ assert_equal 'l .. l .. l l 23 l l .. l .. l', links(23, nil, 2, true)
42
+
43
+ assert_equal 'l .. l .. l l 100 l l .. l .. l', links(100, nil, 2, true)
44
+ assert_equal 'l .. l .. l l 101 l l .. l .. l', links(101, nil, 2, true)
45
+ assert_equal 'l l .. l .. l l 102 l l .. l .. l', links(102, nil, 2, true)
46
+ assert_equal 'l .. l .. l .. l l 103 l l .. l .. l', links(103, nil, 2, true)
47
+ end
48
+
49
+ private
50
+ def links(current, last_page, window_size = 2, infinite = false)
51
+ paginator = stub(:last => last_page = stub(:number => last_page), :infinite? => infinite)
52
+ current_page = stub(:number => current, :pager => paginator)
53
+ pagination_ajax_links(current_page, {}, window_size)
54
+ end
55
+ end
@@ -0,0 +1,154 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper.rb')
2
+
3
+ class PermissionModel < ActiveRecord::Base
4
+ def self.columns; [] end
5
+
6
+ def authorized_for_read?; true; end
7
+ def authorized_for_update?; false; end
8
+ #def authorized_for_create?; end
9
+
10
+ def a1_authorized?; true; end
11
+ def a2_authorized?; false; end
12
+ #def a3_authorized?; end
13
+
14
+ def b1_authorized?; true; end
15
+ def b2_authorized?; false; end
16
+ #def b3_authorized?; end
17
+
18
+ def c1_authorized?; true; end
19
+ def c2_authorized?; false; end
20
+ #def c3_authorized?; end
21
+
22
+ def a3_authorized_for_create?; true; end
23
+ def b3_authorized_for_create?; false; end
24
+ #def c3_authorized_for_create?; end
25
+ def a2_authorized_for_create?; true; end
26
+ def b2_authorized_for_create?; false; end
27
+ #def c2_authorized_for_create?; end
28
+ def a1_authorized_for_create?; true; end
29
+ def b1_authorized_for_create?; false; end
30
+ #def c1_authorized_for_create?; end
31
+
32
+ def a3_authorized_for_read?; true; end
33
+ def b3_authorized_for_read?; false; end
34
+ #def c3_authorized_for_read?; end
35
+ def a2_authorized_for_read?; true; end
36
+ def b2_authorized_for_read?; false; end
37
+ #def c2_authorized_for_read?; end
38
+ def a1_authorized_for_read?; true; end
39
+ def b1_authorized_for_read?; false; end
40
+ #def c1_authorized_for_read?; end
41
+
42
+ def a3_authorized_for_update?; true; end
43
+ def b3_authorized_for_update?; false; end
44
+ #def c3_authorized_for_update?; end
45
+ def a2_authorized_for_update?; true; end
46
+ def b2_authorized_for_update?; false; end
47
+ #def c2_authorized_for_update?; end
48
+ def a1_authorized_for_update?; true; end
49
+ def b1_authorized_for_update?; false; end
50
+ #def c1_authorized_for_update?; end
51
+ end
52
+
53
+ class ActiveRecordPermissionsTest < Test::Unit::TestCase
54
+ def setup
55
+ @model = PermissionModel.new
56
+ end
57
+
58
+ # Combinations Legend:
59
+ # columns are: crud_type method, column method, crud_type/column method
60
+ # symbols are: is (a)bsent, returns (f)alse, returns (t)rue, or n/a (_)
61
+ def test_method_combinations_with_default_true
62
+ ActiveRecordPermissions.default_permission = true
63
+
64
+ pass(@model.authorized_for?(:column => :a3), '_a_')
65
+ fail(@model.authorized_for?(:column => :a2), '_f_')
66
+ pass(@model.authorized_for?(:column => :a1), '_t_')
67
+
68
+ pass(@model.authorized_for?(:crud_type => :create), 'a__')
69
+ fail(@model.authorized_for?(:crud_type => :update), 'f__')
70
+ pass(@model.authorized_for?(:crud_type => :read), 't__')
71
+
72
+ pass(@model.authorized_for?(:crud_type => :create, :column => :c3), 'aaa')
73
+ fail(@model.authorized_for?(:crud_type => :create, :column => :b3), 'aaf')
74
+ pass(@model.authorized_for?(:crud_type => :create, :column => :a3), 'aat')
75
+ fail(@model.authorized_for?(:crud_type => :create, :column => :c2), 'afa')
76
+ fail(@model.authorized_for?(:crud_type => :create, :column => :b2), 'aff')
77
+ pass(@model.authorized_for?(:crud_type => :create, :column => :a2), 'aft')
78
+ pass(@model.authorized_for?(:crud_type => :create, :column => :c1), 'ata')
79
+ fail(@model.authorized_for?(:crud_type => :create, :column => :b1), 'atf')
80
+ pass(@model.authorized_for?(:crud_type => :create, :column => :a1), 'att')
81
+
82
+ fail(@model.authorized_for?(:crud_type => :update, :column => :c3), 'faa')
83
+ fail(@model.authorized_for?(:crud_type => :update, :column => :b3), 'faf')
84
+ pass(@model.authorized_for?(:crud_type => :update, :column => :a3), 'fat')
85
+ fail(@model.authorized_for?(:crud_type => :update, :column => :c2), 'ffa')
86
+ fail(@model.authorized_for?(:crud_type => :update, :column => :b2), 'fff')
87
+ pass(@model.authorized_for?(:crud_type => :update, :column => :a2), 'fft')
88
+ fail(@model.authorized_for?(:crud_type => :update, :column => :c1), 'fta')
89
+ fail(@model.authorized_for?(:crud_type => :update, :column => :b1), 'ftf')
90
+ pass(@model.authorized_for?(:crud_type => :update, :column => :a1), 'ftt')
91
+
92
+ pass(@model.authorized_for?(:crud_type => :read, :column => :c3), 'taa')
93
+ fail(@model.authorized_for?(:crud_type => :read, :column => :b3), 'taf')
94
+ pass(@model.authorized_for?(:crud_type => :read, :column => :a3), 'tat')
95
+ fail(@model.authorized_for?(:crud_type => :read, :column => :c2), 'tfa')
96
+ fail(@model.authorized_for?(:crud_type => :read, :column => :b2), 'tff')
97
+ pass(@model.authorized_for?(:crud_type => :read, :column => :a2), 'tft')
98
+ pass(@model.authorized_for?(:crud_type => :read, :column => :c1), 'tta')
99
+ fail(@model.authorized_for?(:crud_type => :read, :column => :b1), 'ttf')
100
+ pass(@model.authorized_for?(:crud_type => :read, :column => :a1), 'ttt')
101
+ end
102
+
103
+ def test_method_combinations_with_default_false
104
+ ActiveRecordPermissions.default_permission = false
105
+
106
+ fail(@model.authorized_for?(:column => :a3), '_a_')
107
+ fail(@model.authorized_for?(:column => :a2), '_f_')
108
+ pass(@model.authorized_for?(:column => :a1), '_t_')
109
+
110
+ fail(@model.authorized_for?(:crud_type => :create), 'a__')
111
+ fail(@model.authorized_for?(:crud_type => :update), 'f__')
112
+ pass(@model.authorized_for?(:crud_type => :read), 't__')
113
+
114
+ fail(@model.authorized_for?(:crud_type => :create, :column => :c3), 'aaa')
115
+ fail(@model.authorized_for?(:crud_type => :create, :column => :b3), 'aaf')
116
+ pass(@model.authorized_for?(:crud_type => :create, :column => :a3), 'aat')
117
+ fail(@model.authorized_for?(:crud_type => :create, :column => :c2), 'afa')
118
+ fail(@model.authorized_for?(:crud_type => :create, :column => :b2), 'aff')
119
+ pass(@model.authorized_for?(:crud_type => :create, :column => :a2), 'aft')
120
+ pass(@model.authorized_for?(:crud_type => :create, :column => :c1), 'ata')
121
+ fail(@model.authorized_for?(:crud_type => :create, :column => :b1), 'atf')
122
+ pass(@model.authorized_for?(:crud_type => :create, :column => :a1), 'att')
123
+
124
+ fail(@model.authorized_for?(:crud_type => :update, :column => :c3), 'faa')
125
+ fail(@model.authorized_for?(:crud_type => :update, :column => :b3), 'faf')
126
+ pass(@model.authorized_for?(:crud_type => :update, :column => :a3), 'fat')
127
+ fail(@model.authorized_for?(:crud_type => :update, :column => :c2), 'ffa')
128
+ fail(@model.authorized_for?(:crud_type => :update, :column => :b2), 'fff')
129
+ pass(@model.authorized_for?(:crud_type => :update, :column => :a2), 'fft')
130
+ fail(@model.authorized_for?(:crud_type => :update, :column => :c1), 'fta')
131
+ fail(@model.authorized_for?(:crud_type => :update, :column => :b1), 'ftf')
132
+ pass(@model.authorized_for?(:crud_type => :update, :column => :a1), 'ftt')
133
+
134
+ pass(@model.authorized_for?(:crud_type => :read, :column => :c3), 'taa')
135
+ fail(@model.authorized_for?(:crud_type => :read, :column => :b3), 'taf')
136
+ pass(@model.authorized_for?(:crud_type => :read, :column => :a3), 'tat')
137
+ fail(@model.authorized_for?(:crud_type => :read, :column => :c2), 'tfa')
138
+ fail(@model.authorized_for?(:crud_type => :read, :column => :b2), 'tff')
139
+ pass(@model.authorized_for?(:crud_type => :read, :column => :a2), 'tft')
140
+ pass(@model.authorized_for?(:crud_type => :read, :column => :c1), 'tta')
141
+ fail(@model.authorized_for?(:crud_type => :read, :column => :b1), 'ttf')
142
+ pass(@model.authorized_for?(:crud_type => :read, :column => :a1), 'ttt')
143
+ end
144
+
145
+ private
146
+
147
+ def pass(value, message = nil)
148
+ assert value, "#{message} should pass"
149
+ end
150
+
151
+ def fail(value, message = nil)
152
+ assert !value, "#{message} should fail"
153
+ end
154
+ end
@@ -0,0 +1,110 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper.rb')
2
+
3
+ class NumberModel < ActiveRecord::Base
4
+ abstract_class = true
5
+ def self.columns
6
+ @columns ||= [ActiveRecord::ConnectionAdapters::Column.new('number', '', 'double(10,2)')]
7
+ end
8
+ end
9
+
10
+ class AttributeParamsTest < Test::Unit::TestCase
11
+ include ActiveScaffold::AttributeParams
12
+
13
+ def setup
14
+ I18n.backend.store_translations :en, :number => {:format => {
15
+ :delimiter => ',',
16
+ :separator => '.'
17
+ }}
18
+ I18n.backend.store_translations :es, :number => {:format => {
19
+ :delimiter => '.',
20
+ :separator => ','
21
+ }}
22
+
23
+ @config = config_for('number_model')
24
+ class << @config.list.columns
25
+ include ActiveScaffold::DataStructures::ActionColumns::AfterConfiguration
26
+ end
27
+ @config.list.columns.set_columns @config.columns
28
+ end
29
+
30
+ def teardown
31
+ I18n.locale = :en
32
+ end
33
+
34
+ def test_english_format_with_decimal_separator_using_english_language
35
+ I18n.locale = :en
36
+ assert_equal 0.1, convert_number('.1')
37
+ assert_equal 0.1, convert_number('.100')
38
+ assert_equal 0.1, convert_number('0.1')
39
+ assert_equal 0.345, convert_number('0.345')
40
+ assert_equal 0.345, convert_number('+0.345')
41
+ assert_equal -0.345, convert_number('-0.345')
42
+ assert_equal 9.345, convert_number('9.345')
43
+ assert_equal 9.1, convert_number('9.1')
44
+ assert_equal 90.1, convert_number('90.1')
45
+ end
46
+
47
+ def test_english_format_with_thousand_delimiter_using_english_language
48
+ I18n.locale = :en
49
+ assert_equal 1000, convert_number('1,000')
50
+ assert_equal 1000, convert_number('+1,000')
51
+ assert_equal -1000, convert_number('-1,000')
52
+ assert_equal 1000000, convert_number('1,000,000')
53
+ end
54
+
55
+ def test_english_format_with_separator_and_delimiter_using_english_language
56
+ I18n.locale = :en
57
+ assert_equal 1234.1, convert_number('1,234.1')
58
+ assert_equal 1234.1, convert_number('1,234.100')
59
+ assert_equal 1234.345, convert_number('+1,234.345')
60
+ assert_equal -1234.345, convert_number('-1,234.345')
61
+ assert_equal 1234000.1, convert_number('1,234,000.100')
62
+ end
63
+
64
+ def test_english_format_with_decimal_separator_using_spanish_language
65
+ I18n.locale = :es
66
+ assert_equal 0.1, convert_number('.1')
67
+ assert_equal 0.1, convert_number('0.1')
68
+ assert_equal 0.12, convert_number('+0.12')
69
+ assert_equal -0.12, convert_number('-0.12')
70
+ assert_equal 9.1, convert_number('9.1')
71
+ assert_equal 90.1, convert_number('90.1')
72
+ end
73
+
74
+ def test_spanish_format_with_decimal_separator_using_spanish_language
75
+ I18n.locale = :es
76
+ assert_equal 0.1, convert_number(',1')
77
+ assert_equal 0.1, convert_number(',100')
78
+ assert_equal 0.1, convert_number('0,1')
79
+ assert_equal 0.345, convert_number('0,345')
80
+ assert_equal 0.345, convert_number('+0,345')
81
+ assert_equal -0.345, convert_number('-0,345')
82
+ assert_equal 9.1, convert_number('9,1')
83
+ assert_equal 90.1, convert_number('90,1')
84
+ assert_equal 9.1, convert_number('9,100')
85
+ end
86
+
87
+ def test_spanish_format_with_thousand_delimiter_using_spanish_language
88
+ I18n.locale = :es
89
+ assert_equal 1000, convert_number('1.000')
90
+ assert_equal 1000, convert_number('+1.000')
91
+ assert_equal -1000, convert_number('-1.000')
92
+ assert_equal 1000000, convert_number('1.000.000')
93
+ end
94
+
95
+ def test_spanish_format_with_separator_and_decimal_using_spanish_language
96
+ I18n.locale = :es
97
+ assert_equal 1230.1, convert_number('1.230,1')
98
+ assert_equal 1230.1, convert_number('1.230,100')
99
+ assert_equal 1234.345, convert_number('+1.234,345')
100
+ assert_equal -1234.345, convert_number('-1.234,345')
101
+ assert_equal 1234000.1, convert_number('1.234.000,100')
102
+ end
103
+
104
+ private
105
+ def convert_number(value)
106
+ record = NumberModel.new
107
+ update_record_from_params(record, @config.list.columns, HashWithIndifferentAccess.new({:number => value}))
108
+ record.number
109
+ end
110
+ end