active_scaffold-sequel 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +179 -0
- data/MIT-LICENSE +20 -0
- data/README +36 -0
- data/app/assets/images/active_scaffold/add.gif +0 -0
- data/app/assets/images/active_scaffold/arrow_down.gif +0 -0
- data/app/assets/images/active_scaffold/arrow_up.gif +0 -0
- data/app/assets/images/active_scaffold/close.gif +0 -0
- data/app/assets/images/active_scaffold/close_touch.png +0 -0
- data/app/assets/images/active_scaffold/config.png +0 -0
- data/app/assets/images/active_scaffold/cross.png +0 -0
- data/app/assets/images/active_scaffold/gears.png +0 -0
- data/app/assets/images/active_scaffold/indicator-small.gif +0 -0
- data/app/assets/images/active_scaffold/indicator.gif +0 -0
- data/app/assets/images/active_scaffold/magnifier.png +0 -0
- data/app/assets/javascripts/active_scaffold.js.erb +19 -0
- data/app/assets/javascripts/jquery/active_scaffold.js +1057 -0
- data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +24 -0
- data/app/assets/javascripts/jquery/draggable_lists.js +27 -0
- data/app/assets/javascripts/jquery/jquery.editinplace.js +743 -0
- data/app/assets/javascripts/jquery/tiny_mce_bridge.js +7 -0
- data/app/assets/javascripts/prototype/active_scaffold.js +1052 -0
- data/app/assets/javascripts/prototype/dhtml_history.js +870 -0
- data/app/assets/javascripts/prototype/form_enhancements.js +117 -0
- data/app/assets/javascripts/prototype/rico_corner.js +370 -0
- data/app/assets/javascripts/prototype/tiny_mce_bridge.js +7 -0
- data/app/assets/stylesheets/active_scaffold-ie.css +35 -0
- data/app/assets/stylesheets/active_scaffold.css.scss +14 -0
- data/app/assets/stylesheets/active_scaffold_colors.css.scss +395 -0
- data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -0
- data/app/assets/stylesheets/active_scaffold_images.css.scss +43 -0
- data/app/assets/stylesheets/active_scaffold_layout.css +912 -0
- data/app/assets/stylesheets/blue-theme.css +74 -0
- data/config/locales/de.yml +114 -0
- data/config/locales/en.yml +118 -0
- data/config/locales/es.yml +120 -0
- data/config/locales/fr.yml +121 -0
- data/config/locales/hu.yml +74 -0
- data/config/locales/ja.yml +73 -0
- data/config/locales/ru.yml +123 -0
- data/frontends/default/views/_action_group.html.erb +24 -0
- data/frontends/default/views/_add_existing_form.html.erb +30 -0
- data/frontends/default/views/_base_form.html.erb +51 -0
- data/frontends/default/views/_create_form.html.erb +8 -0
- data/frontends/default/views/_create_form_on_list.html.erb +6 -0
- data/frontends/default/views/_field_search.html.erb +32 -0
- data/frontends/default/views/_form.html.erb +24 -0
- data/frontends/default/views/_form_association.html.erb +15 -0
- data/frontends/default/views/_form_association_footer.html.erb +47 -0
- data/frontends/default/views/_form_attribute.html.erb +20 -0
- data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
- data/frontends/default/views/_form_messages.html.erb +5 -0
- data/frontends/default/views/_horizontal_subform.html.erb +28 -0
- data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
- data/frontends/default/views/_horizontal_subform_header.html.erb +11 -0
- data/frontends/default/views/_horizontal_subform_record.html.erb +38 -0
- data/frontends/default/views/_human_conditions.html.erb +1 -0
- data/frontends/default/views/_list.html.erb +18 -0
- data/frontends/default/views/_list_actions.html.erb +15 -0
- data/frontends/default/views/_list_calculations.html.erb +16 -0
- data/frontends/default/views/_list_column_headings.html.erb +12 -0
- data/frontends/default/views/_list_header.html.erb +10 -0
- data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
- data/frontends/default/views/_list_messages.html.erb +30 -0
- data/frontends/default/views/_list_pagination.html.erb +11 -0
- data/frontends/default/views/_list_pagination_links.html.erb +9 -0
- data/frontends/default/views/_list_record.html.erb +14 -0
- data/frontends/default/views/_list_record_columns.html.erb +8 -0
- data/frontends/default/views/_list_with_header.html.erb +36 -0
- data/frontends/default/views/_messages.html.erb +10 -0
- data/frontends/default/views/_render_field.js.erb +20 -0
- data/frontends/default/views/_row.html.erb +6 -0
- data/frontends/default/views/_search.html.erb +34 -0
- data/frontends/default/views/_search_attribute.html.erb +10 -0
- data/frontends/default/views/_show.html.erb +8 -0
- data/frontends/default/views/_show_columns.html.erb +15 -0
- data/frontends/default/views/_update_actions.html.erb +9 -0
- data/frontends/default/views/_update_form.html.erb +6 -0
- data/frontends/default/views/_vertical_subform.html.erb +12 -0
- data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
- data/frontends/default/views/action_confirmation.html.erb +13 -0
- data/frontends/default/views/add_existing.js.erb +18 -0
- data/frontends/default/views/add_existing_form.html.erb +5 -0
- data/frontends/default/views/create.html.erb +5 -0
- data/frontends/default/views/delete.html.erb +13 -0
- data/frontends/default/views/destroy.js.erb +24 -0
- data/frontends/default/views/edit_associated.js.erb +12 -0
- data/frontends/default/views/field_search.html.erb +5 -0
- data/frontends/default/views/form_messages.js.erb +1 -0
- data/frontends/default/views/list.html.erb +1 -0
- data/frontends/default/views/on_action_update.js.erb +13 -0
- data/frontends/default/views/on_create.js.erb +47 -0
- data/frontends/default/views/on_mark_all.js.erb +12 -0
- data/frontends/default/views/on_update.js.erb +31 -0
- data/frontends/default/views/refresh_list.js.erb +1 -0
- data/frontends/default/views/render_field.js.erb +1 -0
- data/frontends/default/views/search.html.erb +5 -0
- data/frontends/default/views/show.html.erb +5 -0
- data/frontends/default/views/update.html.erb +8 -0
- data/frontends/default/views/update_column.js.erb +16 -0
- data/frontends/default/views/update_row.js.erb +1 -0
- data/lib/active_scaffold/actions/common_search.rb +25 -0
- data/lib/active_scaffold/actions/core.rb +197 -0
- data/lib/active_scaffold/actions/create.rb +148 -0
- data/lib/active_scaffold/actions/delete.rb +76 -0
- data/lib/active_scaffold/actions/field_search.rb +82 -0
- data/lib/active_scaffold/actions/list.rb +196 -0
- data/lib/active_scaffold/actions/mark.rb +75 -0
- data/lib/active_scaffold/actions/nested.rb +245 -0
- data/lib/active_scaffold/actions/search.rb +48 -0
- data/lib/active_scaffold/actions/show.rb +61 -0
- data/lib/active_scaffold/actions/subform.rb +23 -0
- data/lib/active_scaffold/actions/update.rb +150 -0
- data/lib/active_scaffold/active_record_permissions.rb +136 -0
- data/lib/active_scaffold/attribute_params.rb +208 -0
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +39 -0
- data/lib/active_scaffold/bridges/ancestry.rb +5 -0
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +67 -0
- data/lib/active_scaffold/bridges/calendar_date_select.rb +24 -0
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +107 -0
- data/lib/active_scaffold/bridges/cancan.rb +15 -0
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +31 -0
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +10 -0
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +45 -0
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +17 -0
- data/lib/active_scaffold/bridges/carrierwave.rb +12 -0
- data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +358 -0
- data/lib/active_scaffold/bridges/country_helper.rb +9 -0
- data/lib/active_scaffold/bridges/date_picker/ext.rb +45 -0
- data/lib/active_scaffold/bridges/date_picker/helper.rb +180 -0
- data/lib/active_scaffold/bridges/date_picker.rb +23 -0
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +34 -0
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +10 -0
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +27 -0
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +16 -0
- data/lib/active_scaffold/bridges/dragonfly.rb +9 -0
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +48 -0
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +57 -0
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +34 -0
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +26 -0
- data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
- data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
- data/lib/active_scaffold/bridges/file_column.rb +11 -0
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +27 -0
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +16 -0
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +36 -0
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +24 -0
- data/lib/active_scaffold/bridges/paperclip.rb +12 -0
- data/lib/active_scaffold/bridges/record_select/helpers.rb +86 -0
- data/lib/active_scaffold/bridges/record_select.rb +11 -0
- data/lib/active_scaffold/bridges/semantic_attributes/column.rb +20 -0
- data/lib/active_scaffold/bridges/semantic_attributes.rb +5 -0
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +46 -0
- data/lib/active_scaffold/bridges/tiny_mce.rb +17 -0
- data/lib/active_scaffold/bridges.rb +61 -0
- data/lib/active_scaffold/config/base.rb +71 -0
- data/lib/active_scaffold/config/core.rb +219 -0
- data/lib/active_scaffold/config/create.rb +44 -0
- data/lib/active_scaffold/config/delete.rb +33 -0
- data/lib/active_scaffold/config/field_search.rb +76 -0
- data/lib/active_scaffold/config/form.rb +48 -0
- data/lib/active_scaffold/config/list.rb +196 -0
- data/lib/active_scaffold/config/mark.rb +35 -0
- data/lib/active_scaffold/config/nested.rb +42 -0
- data/lib/active_scaffold/config/search.rb +73 -0
- data/lib/active_scaffold/config/show.rb +32 -0
- data/lib/active_scaffold/config/subform.rb +35 -0
- data/lib/active_scaffold/config/update.rb +41 -0
- data/lib/active_scaffold/configurable.rb +29 -0
- data/lib/active_scaffold/constraints.rb +170 -0
- data/lib/active_scaffold/data_structures/action_columns.rb +140 -0
- data/lib/active_scaffold/data_structures/action_link.rb +179 -0
- data/lib/active_scaffold/data_structures/action_links.rb +185 -0
- data/lib/active_scaffold/data_structures/actions.rb +45 -0
- data/lib/active_scaffold/data_structures/bridge.rb +22 -0
- data/lib/active_scaffold/data_structures/column.rb +389 -0
- data/lib/active_scaffold/data_structures/columns.rb +75 -0
- data/lib/active_scaffold/data_structures/error_message.rb +24 -0
- data/lib/active_scaffold/data_structures/nested_info.rb +130 -0
- data/lib/active_scaffold/data_structures/set.rb +57 -0
- data/lib/active_scaffold/data_structures/sorting.rb +172 -0
- data/lib/active_scaffold/engine.rb +4 -0
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +22 -0
- data/lib/active_scaffold/extensions/action_view_rendering.rb +115 -0
- data/lib/active_scaffold/extensions/active_record_offset.rb +12 -0
- data/lib/active_scaffold/extensions/array.rb +7 -0
- data/lib/active_scaffold/extensions/cache_association.rb +16 -0
- data/lib/active_scaffold/extensions/localize.rb +10 -0
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +12 -0
- data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +7 -0
- data/lib/active_scaffold/extensions/paginator_extensions.rb +26 -0
- data/lib/active_scaffold/extensions/routing_mapper.rb +48 -0
- data/lib/active_scaffold/extensions/to_label.rb +8 -0
- data/lib/active_scaffold/extensions/unsaved_associated.rb +60 -0
- data/lib/active_scaffold/extensions/unsaved_record.rb +20 -0
- data/lib/active_scaffold/extensions/usa_state.rb +46 -0
- data/lib/active_scaffold/finder.rb +372 -0
- data/lib/active_scaffold/helpers/association_helpers.rb +48 -0
- data/lib/active_scaffold/helpers/controller_helpers.rb +88 -0
- data/lib/active_scaffold/helpers/form_column_helpers.rb +321 -0
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -0
- data/lib/active_scaffold/helpers/id_helpers.rb +127 -0
- data/lib/active_scaffold/helpers/list_column_helpers.rb +340 -0
- data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
- data/lib/active_scaffold/helpers/search_column_helpers.rb +267 -0
- data/lib/active_scaffold/helpers/show_column_helpers.rb +50 -0
- data/lib/active_scaffold/helpers/view_helpers.rb +342 -0
- data/lib/active_scaffold/marked_model.rb +38 -0
- data/lib/active_scaffold/paginator.rb +136 -0
- data/lib/active_scaffold/responds_to_parent.rb +70 -0
- data/lib/active_scaffold/version.rb +9 -0
- data/lib/active_scaffold.rb +368 -0
- data/lib/active_scaffold_env.rb +11 -0
- data/lib/generators/active_scaffold/USAGE +29 -0
- data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
- data/lib/generators/active_scaffold_controller/USAGE +19 -0
- data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +29 -0
- data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
- data/lib/generators/active_scaffold_controller/templates/helper.rb +2 -0
- data/public/blank.html +33 -0
- data/shoulda_macros/macros.rb +136 -0
- data/test/bridges/active_scaffold_dependent_protect_test.rb +34 -0
- data/test/bridges/bridge_test.rb +90 -0
- data/test/bridges/company.rb +81 -0
- data/test/bridges/paperclip_test.rb +68 -0
- data/test/bridges/tiny_mce_test.rb +27 -0
- data/test/bridges/unobtrusive_date_picker_test.rb +49 -0
- data/test/bridges/validation_reflection_test.rb +57 -0
- data/test/config/base_test.rb +15 -0
- data/test/config/core_test.rb +58 -0
- data/test/config/create_test.rb +58 -0
- data/test/config/delete_test.rb +33 -0
- data/test/config/field_search_test.rb +47 -0
- data/test/config/list_test.rb +129 -0
- data/test/config/nested_test.rb +62 -0
- data/test/config/search_test.rb +60 -0
- data/test/config/show_test.rb +43 -0
- data/test/config/subform_test.rb +17 -0
- data/test/config/update_test.rb +40 -0
- data/test/const_mocker.rb +36 -0
- data/test/data_structures/action_columns_test.rb +113 -0
- data/test/data_structures/action_link_test.rb +78 -0
- data/test/data_structures/action_links_test.rb +78 -0
- data/test/data_structures/actions_test.rb +25 -0
- data/test/data_structures/association_column_test.rb +42 -0
- data/test/data_structures/column_test.rb +185 -0
- data/test/data_structures/columns_test.rb +69 -0
- data/test/data_structures/error_message_test.rb +28 -0
- data/test/data_structures/set_test.rb +86 -0
- data/test/data_structures/sorting_test.rb +126 -0
- data/test/data_structures/standard_column_test.rb +24 -0
- data/test/data_structures/virtual_column_test.rb +23 -0
- data/test/extensions/active_record_test.rb +45 -0
- data/test/extensions/array_test.rb +12 -0
- data/test/helpers/form_column_helpers_test.rb +31 -0
- data/test/helpers/list_column_helpers_test.rb +42 -0
- data/test/helpers/pagination_helpers_test.rb +59 -0
- data/test/misc/active_record_permissions_test.rb +154 -0
- data/test/misc/attribute_params_test.rb +146 -0
- data/test/misc/configurable_test.rb +96 -0
- data/test/misc/constraints_test.rb +193 -0
- data/test/misc/finder_test.rb +92 -0
- data/test/misc/lang_test.rb +11 -0
- data/test/mock_app/app/controllers/application_controller.rb +10 -0
- data/test/mock_app/app/helpers/application_helper.rb +3 -0
- data/test/mock_app/config/boot.rb +110 -0
- data/test/mock_app/config/database.yml +16 -0
- data/test/mock_app/config/environment.rb +43 -0
- data/test/mock_app/config/environments/development.rb +17 -0
- data/test/mock_app/config/environments/production.rb +28 -0
- data/test/mock_app/config/environments/test.rb +28 -0
- data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
- data/test/mock_app/config/initializers/inflections.rb +10 -0
- data/test/mock_app/config/initializers/mime_types.rb +5 -0
- data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
- data/test/mock_app/config/initializers/session_store.rb +15 -0
- data/test/mock_app/config/locales/en.yml +5 -0
- data/test/mock_app/config/routes.rb +43 -0
- data/test/mock_app/db/test.sqlite3 +1 -0
- data/test/mock_app/public/blank.html +33 -0
- data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
- data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
- data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
- data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
- data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
- data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
- data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
- data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
- data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
- data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +848 -0
- data/test/model_stub.rb +55 -0
- data/test/run_all.rb +8 -0
- data/test/test_helper.rb +39 -0
- data/vendor/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/vendor/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/vendor/assets/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/vendor/assets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/vendor/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/vendor/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/vendor/assets/images/ui-icons_222222_256x240.png +0 -0
- data/vendor/assets/images/ui-icons_228ef1_256x240.png +0 -0
- data/vendor/assets/images/ui-icons_ef8c08_256x240.png +0 -0
- data/vendor/assets/images/ui-icons_ffd27a_256x240.png +0 -0
- data/vendor/assets/images/ui-icons_ffffff_256x240.png +0 -0
- data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1276 -0
- data/vendor/assets/stylesheets/jquery-ui.css +568 -0
- metadata +502 -0
@@ -0,0 +1,368 @@
|
|
1
|
+
unless Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR >= 1
|
2
|
+
raise "This version of ActiveScaffold requires Rails 3.1 or higher. Please use an earlier version."
|
3
|
+
end
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'render_component'
|
7
|
+
rescue LoadError
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
require 'active_scaffold/version'
|
12
|
+
require 'active_scaffold/engine' unless defined? ACTIVE_SCAFFOLD_PLUGIN
|
13
|
+
require 'json' # for js_config
|
14
|
+
|
15
|
+
module ActiveScaffold
|
16
|
+
require 'active_scaffold/paginator'
|
17
|
+
require 'active_scaffold/responds_to_parent'
|
18
|
+
require 'active_scaffold/active_record_permissions'
|
19
|
+
|
20
|
+
autoload :AttributeParams, 'active_scaffold/attribute_params'
|
21
|
+
autoload :Configurable, 'active_scaffold/configurable'
|
22
|
+
autoload :Constraints, 'active_scaffold/constraints'
|
23
|
+
autoload :Finder, 'active_scaffold/finder'
|
24
|
+
autoload :MarkedModel, 'active_scaffold/marked_model'
|
25
|
+
autoload :Bridges, 'active_scaffold/bridges'
|
26
|
+
|
27
|
+
mattr_accessor :stylesheets
|
28
|
+
self.stylesheets = []
|
29
|
+
mattr_accessor :javascripts
|
30
|
+
self.javascripts = []
|
31
|
+
|
32
|
+
def self.autoload_subdir(dir, mod=self, root = File.dirname(__FILE__))
|
33
|
+
Dir["#{root}/active_scaffold/#{dir}/*.rb"].each { |file|
|
34
|
+
basename = File.basename(file, ".rb")
|
35
|
+
mod.module_eval {
|
36
|
+
autoload basename.camelcase.to_sym, "active_scaffold/#{dir}/#{basename}"
|
37
|
+
}
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
module Actions
|
42
|
+
ActiveScaffold.autoload_subdir('actions', self)
|
43
|
+
end
|
44
|
+
|
45
|
+
module Config
|
46
|
+
ActiveScaffold.autoload_subdir('config', self)
|
47
|
+
end
|
48
|
+
|
49
|
+
module DataStructures
|
50
|
+
ActiveScaffold.autoload_subdir('data_structures', self)
|
51
|
+
end
|
52
|
+
|
53
|
+
module Helpers
|
54
|
+
ActiveScaffold.autoload_subdir('helpers', self)
|
55
|
+
end
|
56
|
+
|
57
|
+
class ControllerNotFound < RuntimeError; end
|
58
|
+
class DependencyFailure < RuntimeError; end
|
59
|
+
class MalformedConstraint < RuntimeError; end
|
60
|
+
class RecordNotAllowed < SecurityError; end
|
61
|
+
class ActionNotAllowed < SecurityError; end
|
62
|
+
class ReverseAssociationRequired < RuntimeError; end
|
63
|
+
|
64
|
+
def self.included(base)
|
65
|
+
base.extend(ClassMethods)
|
66
|
+
base.module_eval do
|
67
|
+
# TODO: these should be in actions/core
|
68
|
+
before_filter :handle_user_settings
|
69
|
+
before_filter :check_input_device
|
70
|
+
end
|
71
|
+
|
72
|
+
base.helper_method :touch_device?
|
73
|
+
base.helper_method :hover_via_click?
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.set_defaults(&block)
|
77
|
+
ActiveScaffold::Config::Core.configure &block
|
78
|
+
end
|
79
|
+
|
80
|
+
def active_scaffold_config
|
81
|
+
self.class.active_scaffold_config
|
82
|
+
end
|
83
|
+
|
84
|
+
def active_scaffold_config_for(klass)
|
85
|
+
self.class.active_scaffold_config_for(klass)
|
86
|
+
end
|
87
|
+
|
88
|
+
def active_scaffold_session_storage(id = nil)
|
89
|
+
id ||= params[:eid] || "#{params[:controller]}#{"_#{nested.parent_id}" if nested?}"
|
90
|
+
session_index = "as:#{id}"
|
91
|
+
session[session_index] ||= {}
|
92
|
+
session[session_index]
|
93
|
+
end
|
94
|
+
|
95
|
+
# at some point we need to pass the session and params into config. we'll just take care of that before any particular action occurs by passing those hashes off to the UserSettings class of each action.
|
96
|
+
def handle_user_settings
|
97
|
+
if self.class.uses_active_scaffold?
|
98
|
+
active_scaffold_config.actions.each do |action_name|
|
99
|
+
conf_instance = active_scaffold_config.send(action_name) rescue next
|
100
|
+
next if conf_instance.class::UserSettings == ActiveScaffold::Config::Base::UserSettings # if it hasn't been extended, skip it
|
101
|
+
active_scaffold_session_storage[action_name] ||= {}
|
102
|
+
conf_instance.user = conf_instance.class::UserSettings.new(conf_instance, active_scaffold_session_storage[action_name], params)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def check_input_device
|
108
|
+
if request.env["HTTP_USER_AGENT"] && request.env["HTTP_USER_AGENT"][/(iPhone|iPod|iPad)/i]
|
109
|
+
session[:input_device_type] = 'TOUCH'
|
110
|
+
session[:hover_supported] = false
|
111
|
+
else
|
112
|
+
session[:input_device_type] = 'MOUSE'
|
113
|
+
session[:hover_supported] = true
|
114
|
+
end if session[:input_device_type].nil?
|
115
|
+
end
|
116
|
+
|
117
|
+
def touch_device?
|
118
|
+
session[:input_device_type] == 'TOUCH'
|
119
|
+
end
|
120
|
+
|
121
|
+
def hover_via_click?
|
122
|
+
session[:hover_supported] == false
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.js_framework=(framework)
|
126
|
+
@@js_framework = framework
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.js_framework
|
130
|
+
@@js_framework ||= if defined? Jquery
|
131
|
+
:jquery
|
132
|
+
elsif defined? PrototypeRails
|
133
|
+
:prototype
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.js_config=(config)
|
138
|
+
@@js_config = config
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.js_config
|
142
|
+
@@js_config ||= {:scroll_on_close => true}
|
143
|
+
end
|
144
|
+
|
145
|
+
# exclude bridges you do not need
|
146
|
+
# name of bridge subdir should be used to exclude it
|
147
|
+
# eg
|
148
|
+
# ActiveScaffold.exclude_bridges = [:cancan, :ancestry]
|
149
|
+
# if you are using Activescaffold as a gem add to initializer
|
150
|
+
# if you are using Activescaffold as a plugin add to active_scaffold_env.rb
|
151
|
+
def self.exclude_bridges=(bridges)
|
152
|
+
@@exclude_bridges = bridges
|
153
|
+
end
|
154
|
+
|
155
|
+
def self.exclude_bridges
|
156
|
+
@@exclude_bridges ||= []
|
157
|
+
end
|
158
|
+
|
159
|
+
def self.root
|
160
|
+
File.dirname(__FILE__) + "/.."
|
161
|
+
end
|
162
|
+
|
163
|
+
module ClassMethods
|
164
|
+
def active_scaffold(model_id = nil, &block)
|
165
|
+
# initialize bridges here
|
166
|
+
ActiveScaffold::Bridges.run_all
|
167
|
+
|
168
|
+
# converts Foo::BarController to 'bar' and FooBarsController to 'foo_bar' and AddressController to 'address'
|
169
|
+
model_id = self.to_s.split('::').last.sub(/Controller$/, '').pluralize.singularize.underscore unless model_id
|
170
|
+
|
171
|
+
# run the configuration
|
172
|
+
@active_scaffold_config = ActiveScaffold::Config::Core.new(model_id)
|
173
|
+
@active_scaffold_config_block = block
|
174
|
+
self.links_for_associations
|
175
|
+
|
176
|
+
@active_scaffold_frontends = []
|
177
|
+
if active_scaffold_config.frontend.to_sym != :default
|
178
|
+
active_scaffold_custom_frontend_path = File.join(ActiveScaffold::Config::Core.plugin_directory, 'frontends', active_scaffold_config.frontend.to_s , 'views')
|
179
|
+
@active_scaffold_frontends << active_scaffold_custom_frontend_path
|
180
|
+
end
|
181
|
+
active_scaffold_default_frontend_path = File.join(ActiveScaffold::Config::Core.plugin_directory, 'frontends', 'default' , 'views')
|
182
|
+
@active_scaffold_frontends << active_scaffold_default_frontend_path
|
183
|
+
@active_scaffold_custom_paths = []
|
184
|
+
|
185
|
+
self.active_scaffold_superclasses_blocks.each {|superblock| self.active_scaffold_config.configure &superblock}
|
186
|
+
self.active_scaffold_config.sti_children = nil # reset sti_children if set in parent block
|
187
|
+
self.active_scaffold_config.configure &block if block_given?
|
188
|
+
self.active_scaffold_config._configure_sti unless self.active_scaffold_config.sti_children.nil?
|
189
|
+
self.active_scaffold_config._load_action_columns
|
190
|
+
|
191
|
+
# include the rest of the code into the controller: the action core and the included actions
|
192
|
+
module_eval do
|
193
|
+
include ActiveScaffold::Finder
|
194
|
+
include ActiveScaffold::Constraints
|
195
|
+
include ActiveScaffold::AttributeParams
|
196
|
+
include ActiveScaffold::Actions::Core
|
197
|
+
active_scaffold_config.actions.each do |mod|
|
198
|
+
name = mod.to_s.camelize
|
199
|
+
include "ActiveScaffold::Actions::#{name}".constantize
|
200
|
+
|
201
|
+
# sneak the action links from the actions into the main set
|
202
|
+
if link = active_scaffold_config.send(mod).link rescue nil
|
203
|
+
if link.is_a? Array
|
204
|
+
link.each {|current| active_scaffold_config.action_links.add_to_group(current, active_scaffold_config.send(mod).action_group)}
|
205
|
+
elsif link.is_a? ActiveScaffold::DataStructures::ActionLink
|
206
|
+
active_scaffold_config.action_links.add_to_group(link, active_scaffold_config.send(mod).action_group)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
self.append_view_path active_scaffold_paths
|
212
|
+
self._add_sti_create_links if self.active_scaffold_config.add_sti_create_links?
|
213
|
+
end
|
214
|
+
|
215
|
+
def parent_prefixes
|
216
|
+
@parent_prefixes ||= super << 'active_scaffold_overrides' << ''
|
217
|
+
end
|
218
|
+
|
219
|
+
# To be called after include action modules
|
220
|
+
def _add_sti_create_links
|
221
|
+
new_action_link = active_scaffold_config.action_links.collection['new']
|
222
|
+
unless new_action_link.nil? || active_scaffold_config.sti_children.empty?
|
223
|
+
active_scaffold_config.action_links.collection.delete('new')
|
224
|
+
active_scaffold_config.sti_children.each do |child|
|
225
|
+
new_sti_link = Marshal.load(Marshal.dump(new_action_link)) # deep clone
|
226
|
+
new_sti_link.label = child.to_s.camelize.constantize.model_name.human
|
227
|
+
new_sti_link.parameters = {:parent_sti => controller_path}
|
228
|
+
new_sti_link.controller = Proc.new { active_scaffold_controller_for(child.to_s.camelize.constantize).controller_path }
|
229
|
+
active_scaffold_config.action_links.collection.create.add(new_sti_link)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
# Create the automatic column links. Note that this has to happen when configuration is *done*, because otherwise the Nested module could be disabled. Actually, it could still be disabled later, couldn't it?
|
235
|
+
def links_for_associations
|
236
|
+
return unless active_scaffold_config.actions.include? :list and active_scaffold_config.actions.include? :nested
|
237
|
+
active_scaffold_config.columns.each do |column|
|
238
|
+
next unless column.link.nil? and column.autolink?
|
239
|
+
#lazy load of action_link, cause it was really slowing down app in dev mode
|
240
|
+
#and might lead to trouble cause of cyclic constantization of controllers
|
241
|
+
#and might be unnecessary cause it is done before columns are configured
|
242
|
+
column.set_link(Proc.new {|col| link_for_association(col)})
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
def active_scaffold_controller_for_column(column, options = {})
|
247
|
+
begin
|
248
|
+
if options.include?(:controller)
|
249
|
+
"#{options[:controller].to_s.camelize}Controller".constantize
|
250
|
+
else
|
251
|
+
active_scaffold_controller_for(column.association.associated_class)
|
252
|
+
end
|
253
|
+
rescue ActiveScaffold::ControllerNotFound
|
254
|
+
nil
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def link_for_association(column, options = {})
|
259
|
+
controller = active_scaffold_controller_for_column(column, options)
|
260
|
+
|
261
|
+
unless controller.nil?
|
262
|
+
options.reverse_merge! :label => column.label, :position => :after, :type => :member, :controller => controller.controller_path, :column => column
|
263
|
+
options[:parameters] ||= {}
|
264
|
+
options[:parameters].reverse_merge! :parent_scaffold => controller_path, :association => column.association[:name]
|
265
|
+
if column.plural_association?
|
266
|
+
# note: we can't create nested scaffolds on :through associations because there's no reverse association.
|
267
|
+
|
268
|
+
ActiveScaffold::DataStructures::ActionLink.new('index', options) #unless column.through_association?
|
269
|
+
else
|
270
|
+
actions = [:create, :update, :show]
|
271
|
+
actions = controller.active_scaffold_config.actions
|
272
|
+
column.actions_for_association_links.delete :new unless actions.include? :create
|
273
|
+
column.actions_for_association_links.delete :edit unless actions.include? :update
|
274
|
+
column.actions_for_association_links.delete :show unless actions.include? :show
|
275
|
+
ActiveScaffold::DataStructures::ActionLink.new(nil, options.merge(:html_options => {:class => column.name}))
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
def link_for_association_as_scope(scope, options = {})
|
281
|
+
options.reverse_merge! :label => scope, :position => :after, :type => :member, :controller => controller_path
|
282
|
+
options[:parameters] ||= {}
|
283
|
+
options[:parameters].reverse_merge! :parent_scaffold => controller_path, :named_scope => scope
|
284
|
+
ActiveScaffold::DataStructures::ActionLink.new('index', options)
|
285
|
+
end
|
286
|
+
|
287
|
+
def add_active_scaffold_path(path)
|
288
|
+
@active_scaffold_paths = nil # Force active_scaffold_paths to rebuild
|
289
|
+
@active_scaffold_custom_paths << path
|
290
|
+
end
|
291
|
+
|
292
|
+
def active_scaffold_paths
|
293
|
+
return @active_scaffold_paths unless @active_scaffold_paths.nil?
|
294
|
+
|
295
|
+
@active_scaffold_paths = []
|
296
|
+
@active_scaffold_paths.concat @active_scaffold_custom_paths unless @active_scaffold_custom_paths.nil?
|
297
|
+
@active_scaffold_paths.concat @active_scaffold_frontends unless @active_scaffold_frontends.nil?
|
298
|
+
@active_scaffold_paths
|
299
|
+
end
|
300
|
+
|
301
|
+
def active_scaffold_config
|
302
|
+
if @active_scaffold_config.nil?
|
303
|
+
self.superclass.active_scaffold_config if self.superclass.respond_to? :active_scaffold_config
|
304
|
+
else
|
305
|
+
@active_scaffold_config
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
def active_scaffold_config_block
|
310
|
+
@active_scaffold_config_block
|
311
|
+
end
|
312
|
+
|
313
|
+
def active_scaffold_superclasses_blocks
|
314
|
+
blocks = []
|
315
|
+
klass = self.superclass
|
316
|
+
while klass.respond_to? :active_scaffold_superclasses_blocks
|
317
|
+
blocks << klass.active_scaffold_config_block
|
318
|
+
klass = klass.superclass
|
319
|
+
end
|
320
|
+
blocks.compact.reverse
|
321
|
+
end
|
322
|
+
|
323
|
+
def active_scaffold_config_for(klass)
|
324
|
+
begin
|
325
|
+
controller = active_scaffold_controller_for(klass)
|
326
|
+
rescue ActiveScaffold::ControllerNotFound
|
327
|
+
config = ActiveScaffold::Config::Core.new(klass)
|
328
|
+
config._load_action_columns
|
329
|
+
config
|
330
|
+
else
|
331
|
+
controller.active_scaffold_config
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
# Tries to find a controller for the given ActiveRecord model.
|
336
|
+
# Searches in the namespace of the current controller for singular and plural versions of the conventional "#{model}Controller" syntax.
|
337
|
+
# You may override this method to customize the search routine.
|
338
|
+
def active_scaffold_controller_for(klass)
|
339
|
+
controller_namespace = self.to_s.split('::')[0...-1].join('::') + '::'
|
340
|
+
error_message = []
|
341
|
+
[controller_namespace, ''].each do |namespace|
|
342
|
+
["#{klass.to_s.underscore.pluralize}", "#{klass.to_s.underscore.pluralize.singularize}"].each do |controller_name|
|
343
|
+
begin
|
344
|
+
controller = "#{namespace}#{controller_name.camelize}Controller".constantize
|
345
|
+
rescue NameError => error
|
346
|
+
# Only rescue NameError associated with the controller constant not existing - not other compile errors
|
347
|
+
if error.message["uninitialized constant #{controller}"]
|
348
|
+
error_message << "#{namespace}#{controller_name.camelize}Controller"
|
349
|
+
next
|
350
|
+
else
|
351
|
+
raise
|
352
|
+
end
|
353
|
+
end
|
354
|
+
raise ActiveScaffold::ControllerNotFound, "#{controller} missing ActiveScaffold", caller unless controller.uses_active_scaffold?
|
355
|
+
raise ActiveScaffold::ControllerNotFound, "ActiveScaffold on #{controller} is not for #{klass} model.", caller unless controller.active_scaffold_config.model.to_s == klass.to_s
|
356
|
+
return controller
|
357
|
+
end
|
358
|
+
end
|
359
|
+
raise ActiveScaffold::ControllerNotFound, "Could not find " + error_message.join(" or "), caller
|
360
|
+
end
|
361
|
+
|
362
|
+
def uses_active_scaffold?
|
363
|
+
!active_scaffold_config.nil?
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
require 'active_scaffold_env'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# TODO: clean up extensions. some could be organized for autoloading, and others could be removed entirely.
|
2
|
+
Dir["#{File.dirname __FILE__}/active_scaffold/extensions/*.rb"].each { |file| require file }
|
3
|
+
|
4
|
+
ActionController::Base.send(:include, ActiveScaffold)
|
5
|
+
ActionController::Base.send(:include, ActiveScaffold::RespondsToParent)
|
6
|
+
ActionController::Base.send(:include, ActiveScaffold::Helpers::ControllerHelpers)
|
7
|
+
ActionView::Base.send(:include, ActiveScaffold::Helpers::ViewHelpers)
|
8
|
+
|
9
|
+
ActionController::Base.class_eval {include ActiveScaffold::ModelPermissions::ModelUserAccess::Controller}
|
10
|
+
Sequel::Model.class_eval {include ActiveScaffold::ModelPermissions::ModelUserAccess::Model}
|
11
|
+
Sequel::Model.class_eval {include ActiveScaffold::ModelPermissions::Permissions}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Description:
|
2
|
+
Scaffolds an entire resource, from model and migration to controller,
|
3
|
+
along with a full test suite and configured to use active_scaffold.
|
4
|
+
The resource is ready to use as a starting point for your RESTful,
|
5
|
+
resource-oriented application.
|
6
|
+
|
7
|
+
Pass the name of the model (in singular form), either CamelCased or
|
8
|
+
under_scored, as the first argument, and an optional list of attribute
|
9
|
+
pairs.
|
10
|
+
|
11
|
+
Attribute pairs are field:type arguments specifying the
|
12
|
+
model's attributes. Timestamps are added by default, so you don't have to
|
13
|
+
specify them by hand as 'created_at:datetime updated_at:datetime'.
|
14
|
+
|
15
|
+
You don't have to think up every attribute up front, but it helps to
|
16
|
+
sketch out a few so you can start working with the resource immediately.
|
17
|
+
|
18
|
+
For example, 'active_scaffold post title:string body:text published:boolean'
|
19
|
+
gives you a model with those three attributes, a controller configured to use active_scaffold,
|
20
|
+
as well as a resources :posts with additional active_scaffold routes
|
21
|
+
declaration in config/routes.rb.
|
22
|
+
|
23
|
+
If you want to remove all the generated files, run
|
24
|
+
'rails destroy active_scaffold ModelName'.
|
25
|
+
|
26
|
+
Examples:
|
27
|
+
`rails generate active_scaffold post`
|
28
|
+
`rails generate active_scaffold post title:string body:text published:boolean`
|
29
|
+
`rails generate active_scaffold purchase order_id:integer amount:decimal`
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rails/generators/rails/resource/resource_generator'
|
2
|
+
#require 'generators/active_scaffold_controller/active_scaffold_controller_generator'
|
3
|
+
|
4
|
+
module Rails
|
5
|
+
module Generators
|
6
|
+
class ActiveScaffoldGenerator < ResourceGenerator #metagenerator
|
7
|
+
remove_hook_for :resource_controller
|
8
|
+
remove_class_option :actions
|
9
|
+
|
10
|
+
def add_resource_route
|
11
|
+
route_config = class_path.collect{|namespace| "namespace :#{namespace} do " }.join(" ")
|
12
|
+
route_config << "resources :#{file_name.pluralize} do as_routes end"
|
13
|
+
route_config << " end" * class_path.size
|
14
|
+
route route_config
|
15
|
+
end
|
16
|
+
|
17
|
+
invoke "active_scaffold_controller"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Description:
|
2
|
+
Stubs out a active_scaffolded controller. Pass the model name,
|
3
|
+
either CamelCased or under_scored.
|
4
|
+
The controller name is retrieved as a pluralized version of the model
|
5
|
+
name.
|
6
|
+
|
7
|
+
To create a controller within a module, specify the model name as a
|
8
|
+
path like 'parent_module/controller_name'.
|
9
|
+
|
10
|
+
This generates a controller class in app/controllers and invokes helper,
|
11
|
+
template engine and test framework generators.
|
12
|
+
|
13
|
+
Example:
|
14
|
+
`rails generate active_scaffold_controller CreditCard`
|
15
|
+
|
16
|
+
Credit card controller with URLs like /credit_card/debit.
|
17
|
+
Controller: app/controllers/credit_cards_controller.rb
|
18
|
+
Functional Test: test/functional/credit_cards_controller_test.rb
|
19
|
+
Helper: app/helpers/credit_cards_helper.rb
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#require 'rails/generators/rails/scaffold_controller/scaffold_controller_generator'
|
2
|
+
|
3
|
+
module Rails
|
4
|
+
module Generators
|
5
|
+
class ActiveScaffoldControllerGenerator < NamedBase #metagenerator
|
6
|
+
include ResourceHelpers
|
7
|
+
|
8
|
+
def self.source_root
|
9
|
+
@source_root ||= File.join(File.dirname(__FILE__), 'templates')
|
10
|
+
end
|
11
|
+
|
12
|
+
check_class_collision :suffix => "Controller"
|
13
|
+
|
14
|
+
class_option :orm, :banner => "NAME", :type => :string, :required => true,
|
15
|
+
:desc => "ORM to generate the controller for"
|
16
|
+
|
17
|
+
def create_controller_files
|
18
|
+
template 'controller.rb', File.join('app/controllers', class_path, "#{controller_file_name}_controller.rb")
|
19
|
+
template 'helper.rb', File.join('app/helpers', class_path, "#{controller_file_name}_helper.rb")
|
20
|
+
end
|
21
|
+
|
22
|
+
hook_for :test_framework, :as => :scaffold
|
23
|
+
|
24
|
+
def create_view_root_folder
|
25
|
+
empty_directory File.join("app/views", controller_file_path)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/public/blank.html
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
<!--
|
2
|
+
Copyright (c) 2005, Brad Neuberg, bkn3@columbia.edu
|
3
|
+
http://codinginparadise.org
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the "Software"),
|
7
|
+
to deal in the Software without restriction, including without limitation
|
8
|
+
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
9
|
+
and/or sell copies of the Software, and to permit persons to whom the
|
10
|
+
Software is furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
18
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
19
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
|
20
|
+
OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
21
|
+
THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
-->
|
23
|
+
|
24
|
+
<html>
|
25
|
+
<script language="JavaScript">
|
26
|
+
function pageLoaded() {
|
27
|
+
window.parent.dhtmlHistory.iframeLoaded(window.location);
|
28
|
+
}
|
29
|
+
</script>
|
30
|
+
<body onload="pageLoaded()">
|
31
|
+
<h1>blank.html - Needed for Internet Explorer's hidden IFrame</h1>
|
32
|
+
</body>
|
33
|
+
</html>
|
@@ -0,0 +1,136 @@
|
|
1
|
+
class ActiveSupport::TestCase
|
2
|
+
def self.should_have_columns_in(action, *columns)
|
3
|
+
should "have #{columns.to_sentence} columns in #{action}" do
|
4
|
+
assert_equal columns, column_names(action)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.should_include_columns_in(action, *columns)
|
9
|
+
should "include #{columns.to_sentence} columns in #{action}" do
|
10
|
+
action_columns = column_names(action)
|
11
|
+
columns.each do |column|
|
12
|
+
assert action_columns.include?(column.to_sym), "#{column} is not included in #{action}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.should_not_include_columns_in(action, *columns)
|
18
|
+
should "not include #{columns.to_sentence} columns in #{action}" do
|
19
|
+
action_columns = column_names(action)
|
20
|
+
columns.each do |column|
|
21
|
+
assert !action_columns.include?(column.to_sym), "#{column} is included in #{action}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.should_render_as_form_ui(column_name, form_ui)
|
27
|
+
should "render column #{column_name} as #{form_ui} form_ui", :before => lambda{
|
28
|
+
@rendered_columns = []
|
29
|
+
@controller.view_context_class.any_instance.expects(:"active_scaffold_input_#{form_ui}").at_least_once.with {|column, options|
|
30
|
+
@rendered_columns << column.name
|
31
|
+
true
|
32
|
+
}
|
33
|
+
} do
|
34
|
+
assert_equal form_ui, @controller.active_scaffold_config.columns[column_name].form_ui
|
35
|
+
assert @rendered_columns.include?(column_name)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.should_render_with_options_for_select(column_name, *options)
|
40
|
+
should "render column #{column_name} with options for select" do
|
41
|
+
converting_sort = lambda{|a,b| a.to_s <=> b.to_s}
|
42
|
+
assert_equal options.sort(&converting_sort), @controller.active_scaffold_config.columns[column_name].options[:options].sort(&converting_sort)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.should_render_as_form_override(column_name)
|
47
|
+
should "render column #{column_name} as form override" do
|
48
|
+
column = @controller.active_scaffold_config.columns[column_name]
|
49
|
+
assert @response.template.override_form_field?(column)
|
50
|
+
assert_template :partial => "_#{column_name}_form_column", :count => 0
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.should_render_as_form_partial_override(column_name)
|
55
|
+
should "render column #{column_name} as form partial override" do
|
56
|
+
assert_template :partial => "_#{column_name}_form_column"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.should_render_as_form_hidden(column_name)
|
61
|
+
should "render column #{column_name} as form hidden", :before => lambda{
|
62
|
+
@rendered_columns = []
|
63
|
+
@controller.view_context_class.any_instance.expects(:"hidden_field").at_least_once.with {|object, method, options|
|
64
|
+
@rendered_columns << method
|
65
|
+
true
|
66
|
+
}
|
67
|
+
} do
|
68
|
+
assert_template :partial => "_form_hidden_attribute"
|
69
|
+
assert @rendered_columns.include?(column_name)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.should_render_as_list_ui(column_name, list_ui)
|
74
|
+
should "render column #{column_name} as #{list_ui} list_ui", :before => lambda{
|
75
|
+
@rendered_columns = []
|
76
|
+
@controller.view_context_class.any_instance.expects(:"active_scaffold_column_#{list_ui}").at_least_once.with {|column, options|
|
77
|
+
@rendered_columns << column.name
|
78
|
+
true
|
79
|
+
}
|
80
|
+
} do
|
81
|
+
assert_equal list_ui, @controller.active_scaffold_config.columns[column_name].list_ui
|
82
|
+
assert @rendered_columns.include?(column_name)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.should_render_as_field_override(column_name)
|
87
|
+
should "render column #{column_name} as field override" do
|
88
|
+
column = @controller.active_scaffold_config.columns[column_name]
|
89
|
+
assert @response.template.override_form_field?(column)
|
90
|
+
assert_template :partial => "_#{column_name}_column", :count => 0
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.should_render_as_field_partial_override(column_name)
|
95
|
+
should "render column #{column_name} as field partial override" do
|
96
|
+
assert_template :partial => "_#{column_name}_column"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.should_render_as_inplace_edit(column_name)
|
101
|
+
should "render column #{column_name} as inplace edit", :before => lambda{
|
102
|
+
@column = @controller.active_scaffold_config.columns[column_name]
|
103
|
+
@rendered_columns = []
|
104
|
+
method = @column.list_ui == :checkbox ? :format_column_checkbox : :active_scaffold_inplace_edit
|
105
|
+
@controller.view_context_class.any_instance.expects(method).at_least_once.with {|model, column, options|
|
106
|
+
@rendered_columns << column.name
|
107
|
+
true
|
108
|
+
}
|
109
|
+
} do
|
110
|
+
assert @column.inplace_edit
|
111
|
+
assert @rendered_columns.include?(column_name)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.should_respond_to_parent_redirecting_to(description, &block)
|
116
|
+
should_respond_to_parent("redirecting to #{description}") { "document.location.href = \"#{instance_eval(&block)}\"" }
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.should_respond_to_parent(description = nil, &block)
|
120
|
+
should "respond to parent #{description}" do
|
121
|
+
script = block ? instance_eval(&block) : /.*/
|
122
|
+
script = script.is_a?(Regexp) ? script.source : Regexp.quote(script)
|
123
|
+
script = script.gsub('\n', '\\\\\\n').
|
124
|
+
gsub(/['"]/, '\\\\\\\\\&').
|
125
|
+
gsub('</script>','</scr"+"ipt>')
|
126
|
+
assert_select 'script[type=text/javascript]', Regexp.new('.*' + Regexp.quote("with(window.parent) { setTimeout(function() { window.eval('") + script + Regexp.quote("'); if (typeof(loc) !== 'undefined') loc.replace('about:blank'); }, 1) };") + '.*')
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
def column_names(action)
|
132
|
+
columns = []
|
133
|
+
@controller.active_scaffold_config.send(action).columns.each(:flatten => true) {|col| columns << col.name}
|
134
|
+
columns
|
135
|
+
end
|
136
|
+
end
|