active_scaffold_san 3.0.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.
- data/.autotest +27 -0
- data/.document +5 -0
- data/CHANGELOG +179 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +20 -0
- data/MIT-LICENSE +20 -0
- data/README +69 -0
- data/Rakefile +53 -0
- data/active_scaffold_vho.gemspec +388 -0
- data/frontends/default/images/add.gif +0 -0
- data/frontends/default/images/arrow_down.gif +0 -0
- data/frontends/default/images/arrow_up.gif +0 -0
- data/frontends/default/images/close.gif +0 -0
- data/frontends/default/images/config.png +0 -0
- data/frontends/default/images/cross.png +0 -0
- data/frontends/default/images/gears.png +0 -0
- data/frontends/default/images/indicator-small.gif +0 -0
- data/frontends/default/images/indicator.gif +0 -0
- data/frontends/default/images/magnifier.png +0 -0
- data/frontends/default/javascripts/jquery/active_scaffold.js +1004 -0
- data/frontends/default/javascripts/jquery/jquery.editinplace.js +743 -0
- data/frontends/default/javascripts/prototype/active_scaffold.js +1003 -0
- data/frontends/default/javascripts/prototype/dhtml_history.js +867 -0
- data/frontends/default/javascripts/prototype/form_enhancements.js +117 -0
- data/frontends/default/javascripts/prototype/rico_corner.js +370 -0
- data/frontends/default/stylesheets/stylesheet-ie.css +35 -0
- data/frontends/default/stylesheets/stylesheet.css +973 -0
- data/frontends/default/views/_action_group.html.erb +20 -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 +19 -0
- data/frontends/default/views/_form_association_footer.html.erb +40 -0
- data/frontends/default/views/_form_attribute.html.erb +15 -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 +29 -0
- data/frontends/default/views/_horizontal_subform_header.html.erb +10 -0
- data/frontends/default/views/_horizontal_subform_record.html.erb +37 -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 +32 -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 +32 -0
- data/frontends/default/views/_messages.html.erb +10 -0
- data/frontends/default/views/_render_field.js.rjs +10 -0
- data/frontends/default/views/_row.html.erb +12 -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.rjs +17 -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.rjs +23 -0
- data/frontends/default/views/edit_associated.js.rjs +11 -0
- data/frontends/default/views/field_search.html.erb +5 -0
- data/frontends/default/views/form_messages.js.rjs +1 -0
- data/frontends/default/views/list.html.erb +1 -0
- data/frontends/default/views/list.js.rjs +1 -0
- data/frontends/default/views/on_action_update.js.rjs +8 -0
- data/frontends/default/views/on_create.js.rjs +41 -0
- data/frontends/default/views/on_mark_all.js.rjs +4 -0
- data/frontends/default/views/on_update.js.rjs +28 -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.rjs +13 -0
- data/frontends/default/views/update_row.js.rjs +1 -0
- data/init.rb +8 -0
- data/lib/active_scaffold.rb +360 -0
- data/lib/active_scaffold/actions/common_search.rb +22 -0
- data/lib/active_scaffold/actions/core.rb +180 -0
- data/lib/active_scaffold/actions/create.rb +149 -0
- data/lib/active_scaffold/actions/delete.rb +75 -0
- data/lib/active_scaffold/actions/field_search.rb +82 -0
- data/lib/active_scaffold/actions/list.rb +184 -0
- data/lib/active_scaffold/actions/mark.rb +63 -0
- data/lib/active_scaffold/actions/nested.rb +250 -0
- data/lib/active_scaffold/actions/search.rb +47 -0
- data/lib/active_scaffold/actions/show.rb +61 -0
- data/lib/active_scaffold/actions/subform.rb +27 -0
- data/lib/active_scaffold/actions/update.rb +151 -0
- data/lib/active_scaffold/active_record_permissions.rb +134 -0
- data/lib/active_scaffold/attribute_params.rb +211 -0
- data/lib/active_scaffold/bridges/ancestry/bridge.rb +5 -0
- data/lib/active_scaffold/bridges/ancestry/lib/ancestry_bridge.rb +39 -0
- data/lib/active_scaffold/bridges/bridge.rb +59 -0
- data/lib/active_scaffold/bridges/calendar_date_select/bridge.rb +16 -0
- data/lib/active_scaffold/bridges/calendar_date_select/lib/as_cds_bridge.rb +83 -0
- data/lib/active_scaffold/bridges/cancan/bridge.rb +12 -0
- data/lib/active_scaffold/bridges/cancan/lib/cancan_bridge.rb +107 -0
- data/lib/active_scaffold/bridges/carrierwave/bridge.rb +9 -0
- data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge.rb +33 -0
- data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge_helpers.rb +12 -0
- data/lib/active_scaffold/bridges/carrierwave/lib/form_ui.rb +45 -0
- data/lib/active_scaffold/bridges/carrierwave/lib/list_ui.rb +17 -0
- data/lib/active_scaffold/bridges/date_picker/bridge.rb +24 -0
- data/lib/active_scaffold/bridges/date_picker/lib/datepicker_bridge.rb +225 -0
- data/lib/active_scaffold/bridges/date_picker/public/javascripts/date_picker_bridge.js +22 -0
- data/lib/active_scaffold/bridges/file_column/bridge.rb +11 -0
- data/lib/active_scaffold/bridges/file_column/lib/as_file_column_bridge.rb +46 -0
- data/lib/active_scaffold/bridges/file_column/lib/file_column_helpers.rb +59 -0
- data/lib/active_scaffold/bridges/file_column/lib/form_ui.rb +37 -0
- data/lib/active_scaffold/bridges/file_column/lib/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/paperclip/bridge.rb +12 -0
- data/lib/active_scaffold/bridges/paperclip/lib/form_ui.rb +27 -0
- data/lib/active_scaffold/bridges/paperclip/lib/list_ui.rb +16 -0
- data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge.rb +38 -0
- data/lib/active_scaffold/bridges/paperclip/lib/paperclip_bridge_helpers.rb +26 -0
- data/lib/active_scaffold/bridges/semantic_attributes/bridge.rb +5 -0
- data/lib/active_scaffold/bridges/semantic_attributes/lib/semantic_attributes_bridge.rb +20 -0
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
- data/lib/active_scaffold/bridges/tiny_mce/bridge.rb +5 -0
- data/lib/active_scaffold/bridges/tiny_mce/lib/tiny_mce_bridge.rb +61 -0
- data/lib/active_scaffold/bridges/validation_reflection/bridge.rb +8 -0
- data/lib/active_scaffold/bridges/validation_reflection/lib/validation_reflection_bridge.rb +21 -0
- data/lib/active_scaffold/config/base.rb +62 -0
- data/lib/active_scaffold/config/core.rb +220 -0
- data/lib/active_scaffold/config/create.rb +51 -0
- data/lib/active_scaffold/config/delete.rb +34 -0
- data/lib/active_scaffold/config/field_search.rb +75 -0
- data/lib/active_scaffold/config/form.rb +47 -0
- data/lib/active_scaffold/config/list.rb +174 -0
- data/lib/active_scaffold/config/mark.rb +22 -0
- data/lib/active_scaffold/config/nested.rb +44 -0
- data/lib/active_scaffold/config/search.rb +69 -0
- data/lib/active_scaffold/config/show.rb +35 -0
- data/lib/active_scaffold/config/subform.rb +35 -0
- data/lib/active_scaffold/config/update.rb +46 -0
- data/lib/active_scaffold/configurable.rb +29 -0
- data/lib/active_scaffold/constraints.rb +184 -0
- data/lib/active_scaffold/data_structures/action_columns.rb +137 -0
- data/lib/active_scaffold/data_structures/action_link.rb +175 -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/column.rb +355 -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 +123 -0
- data/lib/active_scaffold/data_structures/set.rb +62 -0
- data/lib/active_scaffold/data_structures/sorting.rb +168 -0
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +20 -0
- data/lib/active_scaffold/extensions/action_view_rendering.rb +123 -0
- data/lib/active_scaffold/extensions/action_view_resolver.rb +7 -0
- data/lib/active_scaffold/extensions/active_association_reflection.rb +13 -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/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/reverse_associations.rb +62 -0
- data/lib/active_scaffold/extensions/routing_mapper.rb +34 -0
- data/lib/active_scaffold/extensions/to_label.rb +8 -0
- data/lib/active_scaffold/extensions/unsaved_associated.rb +61 -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 +343 -0
- data/lib/active_scaffold/helpers/association_helpers.rb +40 -0
- data/lib/active_scaffold/helpers/controller_helpers.rb +87 -0
- data/lib/active_scaffold/helpers/country_helpers.rb +352 -0
- data/lib/active_scaffold/helpers/form_column_helpers.rb +350 -0
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +59 -0
- data/lib/active_scaffold/helpers/id_helpers.rb +127 -0
- data/lib/active_scaffold/helpers/list_column_helpers.rb +361 -0
- data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
- data/lib/active_scaffold/helpers/search_column_helpers.rb +249 -0
- data/lib/active_scaffold/helpers/show_column_helpers.rb +46 -0
- data/lib/active_scaffold/helpers/view_helpers.rb +360 -0
- data/lib/active_scaffold/locale/de.rb +120 -0
- data/lib/active_scaffold/locale/en.rb +119 -0
- data/lib/active_scaffold/locale/es.yml +115 -0
- data/lib/active_scaffold/locale/fr.rb +122 -0
- data/lib/active_scaffold/locale/hu.yml +63 -0
- data/lib/active_scaffold/locale/ja.yml +64 -0
- data/lib/active_scaffold/locale/ru.yml +119 -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_assets.rb +45 -0
- data/lib/active_scaffold_env.rb +14 -0
- data/lib/active_scaffold_vho.rb +2 -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/lib/generators/active_scaffold_setup/USAGE +10 -0
- data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +61 -0
- data/public/blank.html +33 -0
- data/shoulda_macros/macros.rb +136 -0
- data/test/bridges/bridge_test.rb +47 -0
- data/test/config/base_test.rb +15 -0
- data/test/config/create_test.rb +55 -0
- data/test/config/list_test.rb +74 -0
- data/test/config/show_test.rb +43 -0
- data/test/config/update_test.rb +17 -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 +31 -0
- data/test/helpers/pagination_helpers_test.rb +55 -0
- data/test/misc/active_record_permissions_test.rb +154 -0
- data/test/misc/attribute_params_test.rb +110 -0
- data/test/misc/configurable_test.rb +96 -0
- data/test/misc/constraints_test.rb +193 -0
- data/test/misc/finder_test.rb +93 -0
- data/test/misc/lang_test.rb +12 -0
- data/test/mock_app/.gitignore +2 -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 +842 -0
- data/test/model_stub.rb +55 -0
- data/test/run_all.rb +8 -0
- data/test/test_helper.rb +39 -0
- data/uninstall.rb +13 -0
- metadata +497 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
class ActiveScaffoldAssets
|
|
2
|
+
|
|
3
|
+
def self.copy_to_public(from, options = {})
|
|
4
|
+
unless defined?(ACTIVE_SCAFFOLD_INSTALL_ASSETS) && ACTIVE_SCAFFOLD_INSTALL_ASSETS == false
|
|
5
|
+
copy_files("/public", "/public", from)
|
|
6
|
+
available_frontends = Dir[File.join(from, 'frontends', '*')].collect { |d| File.basename d }
|
|
7
|
+
[:stylesheets, :javascripts, :images].each do |asset_type|
|
|
8
|
+
copy_asset_type(from, available_frontends, asset_type, options)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
protected
|
|
14
|
+
|
|
15
|
+
def self.copy_asset_type(from, available_frontends, asset_type, options = {})
|
|
16
|
+
path = "/public/#{asset_type}/active_scaffold"
|
|
17
|
+
copy_files(path, path, from)
|
|
18
|
+
|
|
19
|
+
File.open(File.join(Rails.root, path, 'DO_NOT_EDIT'), 'w') do |f|
|
|
20
|
+
f.puts "Any changes made to files in sub-folders will be lost."
|
|
21
|
+
f.puts "See http://activescaffold.com/tutorials/faq#custom-css."
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
available_frontends.each do |frontend|
|
|
25
|
+
if asset_type == :javascripts
|
|
26
|
+
file_mask = '*.js'
|
|
27
|
+
source = "/frontends/#{frontend}/#{asset_type}/#{ActiveScaffold.js_framework}"
|
|
28
|
+
else
|
|
29
|
+
file_mask = '*.*'
|
|
30
|
+
source = "/frontends/#{frontend}/#{asset_type}"
|
|
31
|
+
end
|
|
32
|
+
destination = "/public/#{asset_type}/active_scaffold/#{frontend}"
|
|
33
|
+
copy_files(source, destination, from, file_mask, options)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.copy_files(source_path, destination_path, directory, file_mask = '*.*', options = {})
|
|
38
|
+
source, destination = File.join(directory, source_path), File.join(Rails.root, destination_path)
|
|
39
|
+
FileUtils.mkdir_p(destination) unless File.exist?(destination)
|
|
40
|
+
Dir.glob('*.so')
|
|
41
|
+
|
|
42
|
+
FileUtils.rm Dir.glob("#{destination}/*") if options[:clean_up_destination]
|
|
43
|
+
FileUtils.cp_r(Dir.glob("#{source}/#{file_mask}"), destination)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
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, RespondsToParent)
|
|
6
|
+
ActionController::Base.send(:include, ActiveScaffold::Helpers::ControllerHelpers)
|
|
7
|
+
ActionView::Base.send(:include, ActiveScaffold::Helpers::ViewHelpers)
|
|
8
|
+
|
|
9
|
+
ActionController::Base.class_eval {include ActiveRecordPermissions::ModelUserAccess::Controller}
|
|
10
|
+
ActiveRecord::Base.class_eval {include ActiveRecordPermissions::ModelUserAccess::Model}
|
|
11
|
+
ActiveRecord::Base.class_eval {include ActiveRecordPermissions::Permissions}
|
|
12
|
+
|
|
13
|
+
I18n.load_path += Dir[File.join(File.dirname(__FILE__), 'active_scaffold', 'locale', '*.{rb,yml}')]
|
|
14
|
+
#ActiveScaffold.js_framework = :jquery
|
|
@@ -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
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Setup a new Rails 3 Application with active_scaffold.
|
|
3
|
+
Pass 'jquery' in case you would like to use it instead of prototype
|
|
4
|
+
|
|
5
|
+
This installs required plugins and configures active_scaffold to use
|
|
6
|
+
specified js lib and application layout file to include all required
|
|
7
|
+
assets
|
|
8
|
+
|
|
9
|
+
Example:
|
|
10
|
+
`rails generate active_scaffold_setup jquery`
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Rails
|
|
2
|
+
module Generators
|
|
3
|
+
class ActiveScaffoldSetupGenerator < Rails::Generators::Base #metagenerator
|
|
4
|
+
argument :js_lib, :type => :string, :default => 'prototype', :desc => 'js_lib for activescaffold (prototype|jquery)'
|
|
5
|
+
|
|
6
|
+
def self.source_root
|
|
7
|
+
@source_root ||= File.join(File.dirname(__FILE__), 'templates')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def install_plugins
|
|
11
|
+
unless defined?(ACTIVE_SCAFFOLD_GEM)
|
|
12
|
+
plugin 'verification', :git => 'git://github.com/rails/verification.git'
|
|
13
|
+
plugin 'render_component', :git => 'git://github.com/vhochstein/render_component.git'
|
|
14
|
+
end
|
|
15
|
+
if js_lib == 'prototype'
|
|
16
|
+
get "https://github.com/vhochstein/prototype-ujs/raw/master/src/rails.js", "public/javascripts/rails.js"
|
|
17
|
+
elsif js_lib == 'jquery'
|
|
18
|
+
get "https://github.com/vhochstein/jquery-ujs/raw/master/src/rails.js", "public/javascripts/rails_jquery.js"
|
|
19
|
+
get "https://github.com/vhochstein/jQuery-Timepicker-Addon/raw/master/jquery-ui-timepicker-addon.js", "public/javascripts/jquery-ui-timepicker-addon.js"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def configure_active_scaffold
|
|
24
|
+
unless defined?(ACTIVE_SCAFFOLD_GEM)
|
|
25
|
+
if js_lib == 'jquery'
|
|
26
|
+
gsub_file 'vendor/plugins/active_scaffold/lib/active_scaffold_env.rb', /#ActiveScaffold.js_framework = :jquery/, 'ActiveScaffold.js_framework = :jquery'
|
|
27
|
+
end
|
|
28
|
+
else
|
|
29
|
+
if js_lib == 'jquery'
|
|
30
|
+
create_file "config/initializers/active_scaffold.rb", "ActiveScaffold.js_framework = :jquery"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def configure_application_layout
|
|
36
|
+
if js_lib == 'prototype'
|
|
37
|
+
inject_into_file "app/views/layouts/application.html.erb",
|
|
38
|
+
" <%= active_scaffold_includes %>\n",
|
|
39
|
+
:after => "<%= javascript_include_tag :defaults %>\n"
|
|
40
|
+
elsif js_lib == 'jquery'
|
|
41
|
+
inject_into_file "app/views/layouts/application.html.erb",
|
|
42
|
+
" <%= stylesheet_link_tag 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/ui-lightness/jquery-ui.css' %>
|
|
43
|
+
<%= javascript_include_tag 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js' %>
|
|
44
|
+
<%= javascript_include_tag 'rails_jquery.js' %>
|
|
45
|
+
<%= javascript_include_tag 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.js' %>
|
|
46
|
+
<%= javascript_include_tag 'jquery-ui-timepicker-addon.js' %>
|
|
47
|
+
<%= javascript_include_tag 'application.js' %>
|
|
48
|
+
<%= active_scaffold_includes %>\n",
|
|
49
|
+
:after => "<%= javascript_include_tag :defaults %>\n"
|
|
50
|
+
|
|
51
|
+
inject_into_file "config/locales/en.yml",
|
|
52
|
+
" time:
|
|
53
|
+
formats:
|
|
54
|
+
default: \"%a, %d %b %Y %H:%M:%S\"",
|
|
55
|
+
:after => "hello: \"Hello world\"\n"
|
|
56
|
+
gsub_file 'app/views/layouts/application.html.erb', /<%= javascript_include_tag :defaults/, '<%# javascript_include_tag :defaults'
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
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
|
+
ActionView::Base.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
|
+
ActionView::Base.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
|
+
ActionView::Base.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
|
+
ActionView::Base.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
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
def dbg; require "ruby-debug"; debugger; end;
|
|
2
|
+
|
|
3
|
+
require File.join(File.dirname(__FILE__), '../test_helper.rb')
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Bridges::BridgeTest < Test::Unit::TestCase
|
|
7
|
+
def setup
|
|
8
|
+
@const_store = {}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def teardown
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test__shouldnt_throw_errors
|
|
15
|
+
ActiveScaffold::Bridge.run_all
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test__cds_bridge
|
|
19
|
+
ConstMocker.mock("CalendarDateSelect") do |cm|
|
|
20
|
+
cm.remove
|
|
21
|
+
assert(! bridge_will_be_installed("CalendarDateSelect"))
|
|
22
|
+
cm.declare
|
|
23
|
+
assert(bridge_will_be_installed("CalendarDateSelect"))
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test__file_column_bridge
|
|
28
|
+
ConstMocker.mock("FileColumn") do |cm|
|
|
29
|
+
cm.remove
|
|
30
|
+
assert(! bridge_will_be_installed("FileColumn"))
|
|
31
|
+
cm.declare
|
|
32
|
+
assert(bridge_will_be_installed("FileColumn"))
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
protected
|
|
37
|
+
|
|
38
|
+
def find_bridge(name)
|
|
39
|
+
ActiveScaffold::Bridge.bridges.find{|b| b.name.to_s==name.to_s}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def bridge_will_be_installed(name)
|
|
43
|
+
assert bridge=find_bridge(name), "No bridge found matching #{name}"
|
|
44
|
+
|
|
45
|
+
bridge.instance_variable_get("@install_if").call
|
|
46
|
+
end
|
|
47
|
+
end
|