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.
- data/.autotest +27 -0
- data/CHANGELOG +152 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README +51 -0
- data/Rakefile +24 -0
- data/active_scaffold.gemspec +24 -0
- data/environment.rb +22 -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/cross.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 +957 -0
- data/frontends/default/javascripts/jquery/jquery.editinplace.js +726 -0
- data/frontends/default/javascripts/prototype/active_scaffold.js +954 -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 +858 -0
- data/frontends/default/views/_add_existing_form.html.erb +30 -0
- data/frontends/default/views/_base_form.html.erb +41 -0
- data/frontends/default/views/_create_form.html.erb +6 -0
- data/frontends/default/views/_create_form_on_list.html.erb +5 -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 +14 -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 +19 -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 +16 -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 +12 -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 +13 -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 +12 -0
- data/frontends/default/views/_update_actions.html.erb +9 -0
- data/frontends/default/views/_update_form.html.erb +5 -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/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 +5 -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 +24 -0
- data/frontends/default/views/on_update.js.rjs +15 -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 +1 -0
- data/install_assets.rb +44 -0
- data/lib/active_record_permissions.rb +134 -0
- data/lib/active_scaffold.rb +279 -0
- data/lib/active_scaffold/actions/common_search.rb +22 -0
- data/lib/active_scaffold/actions/core.rb +150 -0
- data/lib/active_scaffold/actions/create.rb +152 -0
- data/lib/active_scaffold/actions/delete.rb +72 -0
- data/lib/active_scaffold/actions/field_search.rb +82 -0
- data/lib/active_scaffold/actions/list.rb +128 -0
- data/lib/active_scaffold/actions/mark.rb +50 -0
- data/lib/active_scaffold/actions/nested.rb +241 -0
- data/lib/active_scaffold/actions/search.rb +47 -0
- data/lib/active_scaffold/actions/show.rb +54 -0
- data/lib/active_scaffold/actions/subform.rb +17 -0
- data/lib/active_scaffold/actions/update.rb +134 -0
- data/lib/active_scaffold/attribute_params.rb +207 -0
- data/lib/active_scaffold/bridges/ancestry/bridge.rb +5 -0
- data/lib/active_scaffold/bridges/ancestry/lib/ancestry_bridge.rb +38 -0
- data/lib/active_scaffold/bridges/bridge.rb +52 -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 +79 -0
- data/lib/active_scaffold/bridges/carrierwave/bridge.rb +7 -0
- data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge.rb +38 -0
- data/lib/active_scaffold/bridges/carrierwave/lib/carrierwave_bridge_helpers.rb +26 -0
- data/lib/active_scaffold/bridges/carrierwave/lib/form_ui.rb +35 -0
- data/lib/active_scaffold/bridges/carrierwave/lib/list_ui.rb +17 -0
- data/lib/active_scaffold/bridges/date_picker/bridge.rb +22 -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 +187 -0
- data/lib/active_scaffold/bridges/tiny_mce/bridge.rb +5 -0
- data/lib/active_scaffold/bridges/tiny_mce/lib/tiny_mce_bridge.rb +45 -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 +54 -0
- data/lib/active_scaffold/config/core.rb +229 -0
- data/lib/active_scaffold/config/create.rb +43 -0
- data/lib/active_scaffold/config/delete.rb +25 -0
- data/lib/active_scaffold/config/field_search.rb +74 -0
- data/lib/active_scaffold/config/form.rb +46 -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 +43 -0
- data/lib/active_scaffold/config/search.rb +68 -0
- data/lib/active_scaffold/config/show.rb +34 -0
- data/lib/active_scaffold/config/subform.rb +35 -0
- data/lib/active_scaffold/config/update.rb +38 -0
- data/lib/active_scaffold/configurable.rb +29 -0
- data/lib/active_scaffold/constraints.rb +179 -0
- data/lib/active_scaffold/data_structures/action_columns.rb +133 -0
- data/lib/active_scaffold/data_structures/action_link.rb +162 -0
- data/lib/active_scaffold/data_structures/action_links.rb +59 -0
- data/lib/active_scaffold/data_structures/actions.rb +45 -0
- data/lib/active_scaffold/data_structures/column.rb +348 -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 +108 -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/finder.rb +333 -0
- data/lib/active_scaffold/helpers/association_helpers.rb +40 -0
- data/lib/active_scaffold/helpers/controller_helpers.rb +40 -0
- data/lib/active_scaffold/helpers/country_helpers.rb +352 -0
- data/lib/active_scaffold/helpers/form_column_helpers.rb +343 -0
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +59 -0
- data/lib/active_scaffold/helpers/id_helpers.rb +131 -0
- data/lib/active_scaffold/helpers/list_column_helpers.rb +363 -0
- data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
- data/lib/active_scaffold/helpers/search_column_helpers.rb +238 -0
- data/lib/active_scaffold/helpers/show_column_helpers.rb +46 -0
- data/lib/active_scaffold/helpers/view_helpers.rb +315 -0
- data/lib/active_scaffold/locale/de.rb +113 -0
- data/lib/active_scaffold/locale/en.rb +118 -0
- data/lib/active_scaffold/locale/es.yml +112 -0
- data/lib/active_scaffold/locale/fr.rb +113 -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 +62 -0
- data/lib/active_scaffold/marked_model.rb +38 -0
- data/lib/dhtml_confirm.rb +54 -0
- data/lib/extensions/action_controller_rendering.rb +20 -0
- data/lib/extensions/action_view_rendering.rb +113 -0
- data/lib/extensions/action_view_resolver.rb +7 -0
- data/lib/extensions/active_record_offset.rb +12 -0
- data/lib/extensions/array.rb +7 -0
- data/lib/extensions/localize.rb +10 -0
- data/lib/extensions/name_option_for_datetime.rb +12 -0
- data/lib/extensions/nil_id_in_url_params.rb +7 -0
- data/lib/extensions/paginator_extensions.rb +26 -0
- data/lib/extensions/reverse_associations.rb +62 -0
- data/lib/extensions/routing_mapper.rb +34 -0
- data/lib/extensions/to_label.rb +8 -0
- data/lib/extensions/unsaved_associated.rb +61 -0
- data/lib/extensions/unsaved_record.rb +20 -0
- data/lib/extensions/usa_state.rb +46 -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 +28 -0
- data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
- data/lib/generators/active_scaffold_setup/USAGE +10 -0
- data/lib/generators/active_scaffold_setup/active_scaffold_setup_generator.rb +53 -0
- data/lib/paginator.rb +136 -0
- data/lib/responds_to_parent.rb +70 -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 +839 -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 +478 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
module ActiveScaffold::Actions
|
|
2
|
+
module Create
|
|
3
|
+
def self.included(base)
|
|
4
|
+
base.before_filter :create_authorized_filter, :only => [:new, :create]
|
|
5
|
+
base.verify :method => :post,
|
|
6
|
+
:only => :create,
|
|
7
|
+
:redirect_to => { :action => :index }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def new
|
|
11
|
+
do_new
|
|
12
|
+
respond_to_action(:new)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def create
|
|
16
|
+
do_create
|
|
17
|
+
@insert_row = !(nested? && nested.belongs_to?) && params[:parent_controller].nil?
|
|
18
|
+
respond_to_action(:create)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
protected
|
|
22
|
+
def response_location
|
|
23
|
+
url_for(params_for(:action => "show", :id => @record.id)) if successful?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def new_respond_to_html
|
|
27
|
+
if successful?
|
|
28
|
+
render(:action => 'create')
|
|
29
|
+
else
|
|
30
|
+
return_to_main
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def new_respond_to_js
|
|
35
|
+
render(:partial => 'create_form')
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def create_respond_to_html
|
|
39
|
+
if params[:iframe]=='true' # was this an iframe post ?
|
|
40
|
+
responds_to_parent do
|
|
41
|
+
render :action => 'on_create.js', :layout => false
|
|
42
|
+
end
|
|
43
|
+
else
|
|
44
|
+
if successful?
|
|
45
|
+
flash[:info] = as_(:created_model, :model => @record.to_label)
|
|
46
|
+
if active_scaffold_config.create.edit_after_create
|
|
47
|
+
redirect_to params_for(:action => "edit", :id => @record.id)
|
|
48
|
+
elsif active_scaffold_config.create.persistent
|
|
49
|
+
redirect_to params_for(:action => "new")
|
|
50
|
+
else
|
|
51
|
+
return_to_main
|
|
52
|
+
end
|
|
53
|
+
else
|
|
54
|
+
if !nested? && active_scaffold_config.actions.include?(:list) && active_scaffold_config.list.always_show_create
|
|
55
|
+
do_list
|
|
56
|
+
render(:action => 'list')
|
|
57
|
+
else
|
|
58
|
+
render(:action => 'create')
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def create_respond_to_js
|
|
65
|
+
render :action => 'on_create'
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def create_respond_to_xml
|
|
69
|
+
render :xml => response_object.to_xml(:only => active_scaffold_config.create.columns.names), :content_type => Mime::XML, :status => response_status, :location => response_location
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def create_respond_to_json
|
|
73
|
+
render :text => response_object.to_json(:only => active_scaffold_config.create.columns.names), :content_type => Mime::JSON, :status => response_status, :location => response_location
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def create_respond_to_yaml
|
|
77
|
+
render :text => Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.create.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status, :location => response_location
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# A simple method to find and prepare an example new record for the form
|
|
81
|
+
# May be overridden to customize the behavior (add default values, for instance)
|
|
82
|
+
def do_new
|
|
83
|
+
@record = new_model
|
|
84
|
+
apply_constraints_to_record(@record)
|
|
85
|
+
if nested?
|
|
86
|
+
create_association_with_parent(@record)
|
|
87
|
+
register_constraints_with_action_columns(nested.constrained_fields)
|
|
88
|
+
end
|
|
89
|
+
@record
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# A somewhat complex method to actually create a new record. The complexity is from support for subforms and associated records.
|
|
93
|
+
# If you want to customize this behavior, consider using the +before_create_save+ and +after_create_save+ callbacks.
|
|
94
|
+
def do_create
|
|
95
|
+
begin
|
|
96
|
+
active_scaffold_config.model.transaction do
|
|
97
|
+
@record = update_record_from_params(new_model, active_scaffold_config.create.columns, params[:record])
|
|
98
|
+
apply_constraints_to_record(@record, :allow_autosave => true)
|
|
99
|
+
if nested?
|
|
100
|
+
create_association_with_parent(@record)
|
|
101
|
+
register_constraints_with_action_columns(nested.constrained_fields)
|
|
102
|
+
end
|
|
103
|
+
before_create_save(@record)
|
|
104
|
+
self.successful = [@record.valid?, @record.associated_valid?].all? {|v| v == true} # this syntax avoids a short-circuit
|
|
105
|
+
if successful?
|
|
106
|
+
@record.save! and @record.save_associated!
|
|
107
|
+
after_create_save(@record)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
rescue ActiveRecord::RecordInvalid
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def new_model
|
|
115
|
+
model = beginning_of_chain
|
|
116
|
+
if model.columns_hash[model.inheritance_column]
|
|
117
|
+
params = self.params # in new action inheritance_column must be in params
|
|
118
|
+
params = params[:record] || {} unless params[model.inheritance_column] # in create action must be inside record key
|
|
119
|
+
model = params.delete(model.inheritance_column).camelize.constantize if params[model.inheritance_column]
|
|
120
|
+
end
|
|
121
|
+
model.new
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# override this method if you want to inject data in the record (or its associated objects) before the save
|
|
125
|
+
def before_create_save(record); end
|
|
126
|
+
|
|
127
|
+
# override this method if you want to do something after the save
|
|
128
|
+
def after_create_save(record); end
|
|
129
|
+
|
|
130
|
+
# The default security delegates to ActiveRecordPermissions.
|
|
131
|
+
# You may override the method to customize.
|
|
132
|
+
|
|
133
|
+
def create_ignore?
|
|
134
|
+
nested? && active_scaffold_config.list.always_show_create
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def create_authorized?
|
|
138
|
+
(!nested? || !nested.readonly?) && authorized_for?(:crud_type => :create)
|
|
139
|
+
end
|
|
140
|
+
private
|
|
141
|
+
def create_authorized_filter
|
|
142
|
+
link = active_scaffold_config.create.link || active_scaffold_config.create.class.link
|
|
143
|
+
raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
|
|
144
|
+
end
|
|
145
|
+
def new_formats
|
|
146
|
+
(default_formats + active_scaffold_config.formats).uniq
|
|
147
|
+
end
|
|
148
|
+
def create_formats
|
|
149
|
+
(default_formats + active_scaffold_config.formats + active_scaffold_config.create.formats).uniq
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
module ActiveScaffold::Actions
|
|
2
|
+
module Delete
|
|
3
|
+
def self.included(base)
|
|
4
|
+
base.before_filter :delete_authorized_filter, :only => [:delete, :destroy]
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
# this method is for html mode. it provides "the missing action" (http://thelucid.com/articles/2006/07/26/simply-restful-the-missing-action).
|
|
8
|
+
# it also gives us delete confirmation for html mode. woo!
|
|
9
|
+
def delete
|
|
10
|
+
destroy_find_record
|
|
11
|
+
render :action => 'delete'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def destroy
|
|
15
|
+
return redirect_to(params.merge(:action => :delete)) if request.get?
|
|
16
|
+
do_destroy
|
|
17
|
+
respond_to_action(:destroy)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
protected
|
|
21
|
+
def destroy_respond_to_html
|
|
22
|
+
flash[:info] = as_(:deleted_model, :model => @record.to_label) if self.successful?
|
|
23
|
+
return_to_main
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def destroy_respond_to_js
|
|
27
|
+
render(:action => 'destroy')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def destroy_respond_to_xml
|
|
31
|
+
render :xml => successful? ? "" : response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def destroy_respond_to_json
|
|
35
|
+
render :text => successful? ? "" : response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def destroy_respond_to_yaml
|
|
39
|
+
render :text => successful? ? "" : Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.list.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def destroy_find_record
|
|
43
|
+
@record = find_if_allowed(params[:id], :delete)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# A simple method to handle the actual destroying of a record
|
|
47
|
+
# May be overridden to customize the behavior
|
|
48
|
+
def do_destroy
|
|
49
|
+
destroy_find_record
|
|
50
|
+
begin
|
|
51
|
+
self.successful = @record.destroy
|
|
52
|
+
rescue
|
|
53
|
+
flash[:warning] = as_(:cant_destroy_record, :record => @record.to_label)
|
|
54
|
+
self.successful = false
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# The default security delegates to ActiveRecordPermissions.
|
|
59
|
+
# You may override the method to customize.
|
|
60
|
+
def delete_authorized?(record = nil)
|
|
61
|
+
(!nested? || !nested.readonly?) && authorized_for?(:crud_type => :delete)
|
|
62
|
+
end
|
|
63
|
+
private
|
|
64
|
+
def delete_authorized_filter
|
|
65
|
+
link = active_scaffold_config.delete.link || active_scaffold_config.delete.class.link
|
|
66
|
+
raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
|
|
67
|
+
end
|
|
68
|
+
def destroy_formats
|
|
69
|
+
(default_formats + active_scaffold_config.formats + active_scaffold_config.delete.formats).uniq
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module ActiveScaffold::Actions
|
|
2
|
+
module FieldSearch
|
|
3
|
+
include ActiveScaffold::Actions::CommonSearch
|
|
4
|
+
def self.included(base)
|
|
5
|
+
base.before_filter :search_authorized_filter, :only => :show_search
|
|
6
|
+
base.before_filter :store_search_params_into_session, :only => [:index]
|
|
7
|
+
base.before_filter :do_search, :only => [:index]
|
|
8
|
+
base.helper_method :field_search_params
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# FieldSearch uses params[:search] and not @record because search conditions do not always pass the Model's validations.
|
|
12
|
+
# This facilitates for example, textual searches against associations via .search_sql
|
|
13
|
+
def show_search
|
|
14
|
+
@record = active_scaffold_config.model.new
|
|
15
|
+
respond_to_action(:field_search)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
protected
|
|
19
|
+
|
|
20
|
+
def store_search_params_into_session
|
|
21
|
+
set_field_search_default_params(active_scaffold_config.field_search.default_params) unless active_scaffold_config.field_search.default_params.nil?
|
|
22
|
+
super
|
|
23
|
+
active_scaffold_session_storage[:search] = nil if search_params.is_a?(String)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def set_field_search_default_params(default_params)
|
|
27
|
+
if (params[:search].nil? && search_params.nil?) || (params[:search].is_a?(String) && params[:search].blank?)
|
|
28
|
+
params[:search] = default_params.is_a?(Proc) ? self.instance_eval(&default_params) : default_params
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def field_search_params
|
|
33
|
+
search_params || {}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def field_search_respond_to_html
|
|
37
|
+
render(:action => "field_search")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def field_search_respond_to_js
|
|
41
|
+
render(:partial => "field_search")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def do_search
|
|
45
|
+
unless search_params.nil?
|
|
46
|
+
text_search = active_scaffold_config.field_search.text_search
|
|
47
|
+
search_conditions = []
|
|
48
|
+
human_condition_columns = [] if active_scaffold_config.field_search.human_conditions
|
|
49
|
+
columns = active_scaffold_config.field_search.columns
|
|
50
|
+
search_params.each do |key, value|
|
|
51
|
+
next unless columns.include? key
|
|
52
|
+
search_condition = self.class.condition_for_column(active_scaffold_config.columns[key], value, text_search)
|
|
53
|
+
unless search_condition.blank?
|
|
54
|
+
search_conditions << search_condition
|
|
55
|
+
human_condition_columns << active_scaffold_config.columns[key] unless human_condition_columns.nil?
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
self.active_scaffold_conditions = merge_conditions(self.active_scaffold_conditions, *search_conditions)
|
|
59
|
+
if search_conditions.blank?
|
|
60
|
+
@filtered = false
|
|
61
|
+
else
|
|
62
|
+
@filtered = human_condition_columns.nil? ? true : human_condition_columns
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
includes_for_search_columns = columns.collect{ |column| column.includes}.flatten.uniq.compact
|
|
66
|
+
self.active_scaffold_includes.concat includes_for_search_columns
|
|
67
|
+
|
|
68
|
+
active_scaffold_config.list.user.page = nil
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def search_authorized_filter
|
|
75
|
+
link = active_scaffold_config.field_search.link || active_scaffold_config.field_search.class.link
|
|
76
|
+
raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
|
|
77
|
+
end
|
|
78
|
+
def field_search_formats
|
|
79
|
+
(default_formats + active_scaffold_config.formats + active_scaffold_config.field_search.formats).uniq
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
module ActiveScaffold::Actions
|
|
2
|
+
module List
|
|
3
|
+
def self.included(base)
|
|
4
|
+
base.before_filter :list_authorized_filter, :only => [:index, :row]
|
|
5
|
+
base.helper_method :list_columns
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def index
|
|
9
|
+
list
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# get just a single row
|
|
13
|
+
def row
|
|
14
|
+
render :partial => 'row', :locals => {:record => find_if_allowed(params[:id], :read)}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def list
|
|
18
|
+
do_list
|
|
19
|
+
do_new if active_scaffold_config.list.always_show_create
|
|
20
|
+
@record ||= active_scaffold_config.model.new if active_scaffold_config.list.always_show_search
|
|
21
|
+
@nested_auto_open = active_scaffold_config.list.nested_auto_open
|
|
22
|
+
respond_to_action(:list)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
protected
|
|
26
|
+
def list_respond_to_html
|
|
27
|
+
if params.delete(:embedded)
|
|
28
|
+
render :action => 'list', :layout => false
|
|
29
|
+
else
|
|
30
|
+
render :action => 'list'
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
def list_respond_to_js
|
|
34
|
+
if params[:adapter]
|
|
35
|
+
render(:partial => 'list_with_header')
|
|
36
|
+
elsif params[:embedded]
|
|
37
|
+
params.delete(:embedded)
|
|
38
|
+
render(:partial => 'list_with_header')
|
|
39
|
+
else
|
|
40
|
+
render :action => 'list.js'
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
def list_respond_to_xml
|
|
44
|
+
render :xml => response_object.to_xml(:only => list_columns_names), :content_type => Mime::XML, :status => response_status
|
|
45
|
+
end
|
|
46
|
+
def list_respond_to_json
|
|
47
|
+
render :text => response_object.to_json(:only => list_columns_names), :content_type => Mime::JSON, :status => response_status
|
|
48
|
+
end
|
|
49
|
+
def list_respond_to_yaml
|
|
50
|
+
render :text => Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
|
|
51
|
+
end
|
|
52
|
+
# The actual algorithm to prepare for the list view
|
|
53
|
+
def do_list
|
|
54
|
+
includes_for_list_columns = active_scaffold_config.list.columns.collect{ |c| c.includes }.flatten.uniq.compact
|
|
55
|
+
self.active_scaffold_includes.concat includes_for_list_columns
|
|
56
|
+
|
|
57
|
+
options = { :sorting => active_scaffold_config.list.user.sorting,
|
|
58
|
+
:count_includes => active_scaffold_config.list.user.count_includes }
|
|
59
|
+
paginate = (params[:format].nil?) ? (accepts? :html, :js) : ['html', 'js'].include?(params[:format])
|
|
60
|
+
if paginate
|
|
61
|
+
options.merge!({
|
|
62
|
+
:per_page => active_scaffold_config.list.user.per_page,
|
|
63
|
+
:page => active_scaffold_config.list.user.page,
|
|
64
|
+
:pagination => active_scaffold_config.list.pagination
|
|
65
|
+
})
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
page = find_page(options);
|
|
69
|
+
if page.items.blank? && !page.pager.infinite?
|
|
70
|
+
page = page.pager.last
|
|
71
|
+
active_scaffold_config.list.user.page = page.number
|
|
72
|
+
end
|
|
73
|
+
@page, @records = page, page.items
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def each_record_in_scope
|
|
77
|
+
do_search if respond_to? :do_search
|
|
78
|
+
finder_options = { :order => "#{active_scaffold_config.model.primary_key} ASC",
|
|
79
|
+
:conditions => all_conditions,
|
|
80
|
+
:joins => joins_for_finder}
|
|
81
|
+
finder_options.merge! custom_finder_options
|
|
82
|
+
finder_options.merge! :include => (active_scaffold_includes.blank? ? nil : active_scaffold_includes)
|
|
83
|
+
klass = beginning_of_chain
|
|
84
|
+
klass.all(finder_options).each {|record| yield record}
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# The default security delegates to ActiveRecordPermissions.
|
|
88
|
+
# You may override the method to customize.
|
|
89
|
+
def list_authorized?
|
|
90
|
+
authorized_for?(:crud_type => :read)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def action_update_respond_to_js
|
|
94
|
+
render(:action => 'on_action_update')
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def action_update_respond_to_xml
|
|
98
|
+
render :xml => successful? ? "" : response_object.to_xml(:only => list_columns_names), :content_type => Mime::XML, :status => response_status
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def action_update_respond_to_json
|
|
102
|
+
render :text => successful? ? "" : response_object.to_json(:only => list_columns_names), :content_type => Mime::JSON, :status => response_status
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def action_update_respond_to_yaml
|
|
106
|
+
render :text => successful? ? "" : Hash.from_xml(response_object.to_xml(:only => list_columns_names)).to_yaml, :content_type => Mime::YAML, :status => response_status
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
def list_authorized_filter
|
|
111
|
+
raise ActiveScaffold::ActionNotAllowed unless list_authorized?
|
|
112
|
+
end
|
|
113
|
+
def list_formats
|
|
114
|
+
(default_formats + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
|
|
115
|
+
end
|
|
116
|
+
def action_update_formats
|
|
117
|
+
(default_formats + active_scaffold_config.formats).uniq
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def list_columns
|
|
121
|
+
active_scaffold_config.list.columns.collect_visible
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def list_columns_names
|
|
125
|
+
list_columns.collect(&:name)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module ActiveScaffold::Actions
|
|
2
|
+
module Mark
|
|
3
|
+
|
|
4
|
+
def self.included(base)
|
|
5
|
+
base.before_filter :mark_authorized?, :only => [:mark_all]
|
|
6
|
+
base.prepend_before_filter :assign_marked_records_to_model
|
|
7
|
+
base.helper_method :marked_records
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def mark_all
|
|
11
|
+
if mark_all?
|
|
12
|
+
do_mark_all
|
|
13
|
+
else
|
|
14
|
+
do_demark_all
|
|
15
|
+
end
|
|
16
|
+
do_list
|
|
17
|
+
respond_to_action(:list)
|
|
18
|
+
end
|
|
19
|
+
protected
|
|
20
|
+
|
|
21
|
+
# We need to give the ActiveRecord classes a handle to currently marked records. We don't want to just pass the object,
|
|
22
|
+
# because the object may change. So we give ActiveRecord a proc that ties to the
|
|
23
|
+
# marked_records_method on this ApplicationController.
|
|
24
|
+
def assign_marked_records_to_model
|
|
25
|
+
active_scaffold_config.model.marked_records_proc = proc {send(:marked_records)}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def marked_records
|
|
29
|
+
active_scaffold_session_storage[:marked_records] ||= Set.new
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def mark_all?
|
|
33
|
+
@mark_all ||= [true, 'true', 1, '1', 'T', 't'].include?(params[:value].class == String ? params[:value].downcase : params[:value])
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def do_mark_all
|
|
37
|
+
each_record_in_scope {|record| marked_records << record.id}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def do_demark_all
|
|
41
|
+
each_record_in_scope {|record| marked_records.delete(record.id)}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# The default security delegates to ActiveRecordPermissions.
|
|
45
|
+
# You may override the method to customize.
|
|
46
|
+
def mark_authorized?
|
|
47
|
+
authorized_for?(:action => :read)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|