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,45 @@
|
|
|
1
|
+
module ActiveScaffold
|
|
2
|
+
module TinyMceBridge
|
|
3
|
+
module ViewHelpers
|
|
4
|
+
def active_scaffold_includes(*args)
|
|
5
|
+
tiny_mce_js = javascript_tag(%|
|
|
6
|
+
var action_link_close = ActiveScaffold.ActionLink.Abstract.prototype.close;
|
|
7
|
+
ActiveScaffold.ActionLink.Abstract.prototype.close = function() {
|
|
8
|
+
this.adapter.select('textarea.mceEditor').each(function(elem) {
|
|
9
|
+
tinyMCE.execCommand('mceRemoveControl', false, elem.id);
|
|
10
|
+
});
|
|
11
|
+
action_link_close.apply(this);
|
|
12
|
+
};
|
|
13
|
+
|) if using_tiny_mce?
|
|
14
|
+
super(*args) + (include_tiny_mce_if_needed || '') + (tiny_mce_js || '')
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
module FormColumnHelpers
|
|
19
|
+
def active_scaffold_input_text_editor(column, options)
|
|
20
|
+
options[:class] = "#{options[:class]} mceEditor #{column.options[:class]}".strip
|
|
21
|
+
html = []
|
|
22
|
+
html << send(override_input(:textarea), column, options)
|
|
23
|
+
html << javascript_tag("tinyMCE.execCommand('mceAddControl', false, '#{options[:id]}');") if request.xhr?
|
|
24
|
+
html.join "\n"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def onsubmit
|
|
28
|
+
submit_js = 'tinyMCE.triggerSave();this.select("textarea.mceEditor").each(function(elem) { tinyMCE.execCommand("mceRemoveControl", false, elem.id); });' if using_tiny_mce?
|
|
29
|
+
[super, submit_js].compact.join ';'
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
module SearchColumnHelpers
|
|
34
|
+
def self.included(base)
|
|
35
|
+
base.class_eval { alias_method :active_scaffold_search_text_editor, :active_scaffold_search_text }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
ActionView::Base.class_eval do
|
|
42
|
+
include ActiveScaffold::TinyMceBridge::FormColumnHelpers
|
|
43
|
+
include ActiveScaffold::TinyMceBridge::SearchColumnHelpers
|
|
44
|
+
include ActiveScaffold::TinyMceBridge::ViewHelpers
|
|
45
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module ActiveScaffold
|
|
2
|
+
module ValidationReflectionBridge
|
|
3
|
+
def self.included(base)
|
|
4
|
+
base.class_eval { alias_method_chain :initialize, :validation_reflection }
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def initialize_with_validation_reflection(name, active_record_class)
|
|
8
|
+
initialize_without_validation_reflection(name, active_record_class)
|
|
9
|
+
column_names = [name]
|
|
10
|
+
column_names << @association.primary_key_name if @association
|
|
11
|
+
self.required = column_names.any? do |column_name|
|
|
12
|
+
active_record_class.reflect_on_validations_for(column_name.to_sym).any? do |val|
|
|
13
|
+
val.macro == :validates_presence_of or (val.macro == :validates_inclusion_of and not val.options[:allow_nil] and not val.options[:allow_blank])
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
ActiveScaffold::DataStructures::Column.class_eval do
|
|
20
|
+
include ActiveScaffold::ValidationReflectionBridge
|
|
21
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module ActiveScaffold::Config
|
|
2
|
+
class Base
|
|
3
|
+
include ActiveScaffold::Configurable
|
|
4
|
+
extend ActiveScaffold::Configurable
|
|
5
|
+
|
|
6
|
+
def self.inherited(subclass)
|
|
7
|
+
class << subclass
|
|
8
|
+
# the crud type of the action. possible values are :create, :read, :update, :delete, and nil.
|
|
9
|
+
# this is not a setting for the developer. it's self-description for the actions.
|
|
10
|
+
def crud_type; @crud_type; end
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
|
|
14
|
+
def crud_type=(val)
|
|
15
|
+
raise ArgumentError, "unknown CRUD type #{val}" unless [:create, :read, :update, :delete].include?(val.to_sym)
|
|
16
|
+
@crud_type = val.to_sym
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
# delegate
|
|
21
|
+
def crud_type; self.class.crud_type end
|
|
22
|
+
|
|
23
|
+
# the user property gets set to the instantiation of the local UserSettings class during the automatic instantiation of this class.
|
|
24
|
+
attr_accessor :user
|
|
25
|
+
|
|
26
|
+
class UserSettings
|
|
27
|
+
def initialize(conf, storage, params)
|
|
28
|
+
# the session hash relevant to this action
|
|
29
|
+
@session = storage
|
|
30
|
+
# all the request params
|
|
31
|
+
@params = params
|
|
32
|
+
# the configuration object for this action
|
|
33
|
+
@conf = conf
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def formats
|
|
38
|
+
@formats ||= []
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def formats=(val)
|
|
42
|
+
@formats=val
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def columns=(val)
|
|
48
|
+
@columns = ActiveScaffold::DataStructures::ActionColumns.new(*val)
|
|
49
|
+
@columns.action = self
|
|
50
|
+
@columns.set_columns(@core.columns) if @columns.respond_to?(:set_columns)
|
|
51
|
+
@columns
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
module ActiveScaffold::Config
|
|
2
|
+
# to fix the ckeditor bridge problem
|
|
3
|
+
class Core < ActiveScaffold::Config::Base
|
|
4
|
+
# code commented out (see above)
|
|
5
|
+
#class Core < Base
|
|
6
|
+
# global level configuration
|
|
7
|
+
# --------------------------
|
|
8
|
+
|
|
9
|
+
# provides read/write access to the global Actions DataStructure
|
|
10
|
+
cattr_reader :actions
|
|
11
|
+
def self.actions=(val)
|
|
12
|
+
@@actions = ActiveScaffold::DataStructures::Actions.new(*val)
|
|
13
|
+
end
|
|
14
|
+
self.actions = [:create, :list, :search, :update, :delete, :show, :nested, :subform]
|
|
15
|
+
|
|
16
|
+
# configures where the ActiveScaffold plugin itself is located. there is no instance version of this.
|
|
17
|
+
cattr_accessor :plugin_directory
|
|
18
|
+
@@plugin_directory = File.expand_path(__FILE__).match(%{(^.*)/lib/active_scaffold/config/core.rb})[1]
|
|
19
|
+
|
|
20
|
+
# lets you specify a global ActiveScaffold frontend.
|
|
21
|
+
cattr_accessor :frontend
|
|
22
|
+
@@frontend = :default
|
|
23
|
+
|
|
24
|
+
# lets you specify a global ActiveScaffold theme for your frontend.
|
|
25
|
+
cattr_accessor :theme
|
|
26
|
+
@@theme = :default
|
|
27
|
+
|
|
28
|
+
# lets you disable the DHTML history
|
|
29
|
+
def self.dhtml_history=(val)
|
|
30
|
+
@@dhtml_history = val
|
|
31
|
+
end
|
|
32
|
+
def self.dhtml_history?
|
|
33
|
+
@@dhtml_history ? true : false
|
|
34
|
+
end
|
|
35
|
+
@@dhtml_history = true
|
|
36
|
+
|
|
37
|
+
# action links are used by actions to tie together. you can use them, too! this is a collection of ActiveScaffold::DataStructures::ActionLink objects.
|
|
38
|
+
cattr_reader :action_links
|
|
39
|
+
@@action_links = ActiveScaffold::DataStructures::ActionLinks.new
|
|
40
|
+
|
|
41
|
+
# access to the permissions configuration.
|
|
42
|
+
# configuration options include:
|
|
43
|
+
# * current_user_method - what method on the controller returns the current user. default: :current_user
|
|
44
|
+
# * default_permission - what the default permission is. default: true
|
|
45
|
+
def self.security
|
|
46
|
+
ActiveRecordPermissions
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# columns that should be ignored for every model. these should be metadata columns like change dates, versions, etc.
|
|
50
|
+
# values in this array may be symbols or strings.
|
|
51
|
+
def self.ignore_columns
|
|
52
|
+
@@ignore_columns
|
|
53
|
+
end
|
|
54
|
+
def self.ignore_columns=(val)
|
|
55
|
+
@@ignore_columns = ActiveScaffold::DataStructures::Set.new(*val)
|
|
56
|
+
end
|
|
57
|
+
@@ignore_columns = ActiveScaffold::DataStructures::Set.new
|
|
58
|
+
|
|
59
|
+
# lets you specify whether add a create link for each sti child
|
|
60
|
+
cattr_accessor :sti_create_links
|
|
61
|
+
|
|
62
|
+
# instance-level configuration
|
|
63
|
+
# ----------------------------
|
|
64
|
+
|
|
65
|
+
# provides read/write access to the local Actions DataStructure
|
|
66
|
+
attr_reader :actions
|
|
67
|
+
def actions=(args)
|
|
68
|
+
@actions = ActiveScaffold::DataStructures::Actions.new(*args)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# provides read/write access to the local Columns DataStructure
|
|
72
|
+
attr_reader :columns
|
|
73
|
+
def columns=(val)
|
|
74
|
+
@columns._inheritable = val.collect {|c| c.to_sym}
|
|
75
|
+
# Add virtual columns
|
|
76
|
+
@columns << val.collect {|c| c.to_sym unless @columns[c.to_sym]}.compact
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# lets you override the global ActiveScaffold frontend for a specific controller
|
|
80
|
+
attr_accessor :frontend
|
|
81
|
+
|
|
82
|
+
# lets you override the global ActiveScaffold theme for a specific controller
|
|
83
|
+
attr_accessor :theme
|
|
84
|
+
|
|
85
|
+
# lets you specify whether add a create link for each sti child for a specific controller
|
|
86
|
+
attr_accessor :sti_create_links
|
|
87
|
+
def add_sti_create_links?
|
|
88
|
+
self.sti_create_links and not self.sti_children.nil?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# action links are used by actions to tie together. they appear as links for each record, or general links for the ActiveScaffold.
|
|
92
|
+
attr_reader :action_links
|
|
93
|
+
|
|
94
|
+
# a generally-applicable name for this ActiveScaffold ... will be used for generating page/section headers
|
|
95
|
+
attr_writer :label
|
|
96
|
+
def label(options={})
|
|
97
|
+
as_(@label, options) || model.model_name.human(options.merge(options[:count].to_i == 1 ? {} : {:default => model.name.pluralize}))
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# STI children models, use an array of model names
|
|
101
|
+
attr_accessor :sti_children
|
|
102
|
+
|
|
103
|
+
##
|
|
104
|
+
## internal usage only below this point
|
|
105
|
+
## ------------------------------------
|
|
106
|
+
|
|
107
|
+
def initialize(model_id)
|
|
108
|
+
# model_id is the only absolutely required configuration value. it is also not publicly accessible.
|
|
109
|
+
@model_id = model_id.to_s.pluralize.singularize
|
|
110
|
+
|
|
111
|
+
# inherit the actions list directly from the global level
|
|
112
|
+
@actions = self.class.actions.clone
|
|
113
|
+
|
|
114
|
+
# create a new default columns datastructure, since it doesn't make sense before now
|
|
115
|
+
attribute_names = self.model.columns.collect{ |c| c.name.to_sym }.sort_by { |c| c.to_s }
|
|
116
|
+
association_column_names = self.model.reflect_on_all_associations.collect{ |a| a.name.to_sym }.sort_by { |c| c.to_s }
|
|
117
|
+
@columns = ActiveScaffold::DataStructures::Columns.new(self.model, attribute_names + association_column_names)
|
|
118
|
+
|
|
119
|
+
# and then, let's remove some columns from the inheritable set.
|
|
120
|
+
@columns.exclude(*self.class.ignore_columns)
|
|
121
|
+
@columns.exclude(*@columns.find_all { |c| c.column and (c.column.primary or c.column.name =~ /(_id|_count)$/) }.collect {|c| c.name})
|
|
122
|
+
@columns.exclude(*self.model.reflect_on_all_associations.collect{|a| :"#{a.name}_type" if a.options[:polymorphic]}.compact)
|
|
123
|
+
|
|
124
|
+
# inherit the global frontend
|
|
125
|
+
@frontend = self.class.frontend
|
|
126
|
+
@theme = self.class.theme
|
|
127
|
+
@sti_create_links = self.class.sti_create_links
|
|
128
|
+
|
|
129
|
+
# inherit from the global set of action links
|
|
130
|
+
@action_links = self.class.action_links.clone
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# To be called after your finished configuration
|
|
134
|
+
def _load_action_columns
|
|
135
|
+
ActiveScaffold::DataStructures::ActionColumns.class_eval {include ActiveScaffold::DataStructures::ActionColumns::AfterConfiguration}
|
|
136
|
+
|
|
137
|
+
# then, register the column objects
|
|
138
|
+
self.actions.each do |action_name|
|
|
139
|
+
action = self.send(action_name)
|
|
140
|
+
next unless action.respond_to? :columns
|
|
141
|
+
action.columns.set_columns(self.columns)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# To be called after your finished configuration
|
|
146
|
+
def _configure_sti
|
|
147
|
+
column = self.model.inheritance_column
|
|
148
|
+
if sti_create_links
|
|
149
|
+
self.columns[column].form_ui ||= :hidden
|
|
150
|
+
else
|
|
151
|
+
self.columns[column].form_ui ||= :select
|
|
152
|
+
self.columns[column].options ||= {}
|
|
153
|
+
self.columns[column].options[:options] = self.sti_children.collect do |model_name|
|
|
154
|
+
[model_name.to_s.camelize.constantize.human_name, model_name.to_s.camelize]
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# To be called after include action modules
|
|
160
|
+
def _add_sti_create_links
|
|
161
|
+
new_action_link = @action_links['new']
|
|
162
|
+
unless new_action_link.nil?
|
|
163
|
+
@action_links.delete('new')
|
|
164
|
+
self.sti_children.each do |child|
|
|
165
|
+
new_sti_link = Marshal.load(Marshal.dump(new_action_link)) # deep clone
|
|
166
|
+
new_sti_link.label = as_(:create_model, :model => child.to_s.camelize.constantize.human_name)
|
|
167
|
+
new_sti_link.parameters = {model.inheritance_column => child}
|
|
168
|
+
@action_links.add(new_sti_link)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# configuration routing.
|
|
174
|
+
# we want to route calls named like an activated action to that action's global or local Config class.
|
|
175
|
+
# ---------------------------
|
|
176
|
+
def method_missing(name, *args)
|
|
177
|
+
@action_configs ||= {}
|
|
178
|
+
titled_name = name.to_s.camelcase
|
|
179
|
+
underscored_name = name.to_s.underscore.to_sym
|
|
180
|
+
klass = "ActiveScaffold::Config::#{titled_name}".constantize rescue nil
|
|
181
|
+
if klass
|
|
182
|
+
if @actions.include? underscored_name
|
|
183
|
+
return @action_configs[underscored_name] ||= klass.new(self)
|
|
184
|
+
else
|
|
185
|
+
raise "#{titled_name} is not enabled. Please enable it or remove any references in your configuration (e.g. config.#{underscored_name}.columns = [...])."
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
super
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def self.method_missing(name, *args)
|
|
192
|
+
klass = "ActiveScaffold::Config::#{name.to_s.titleize}".constantize rescue nil
|
|
193
|
+
if @@actions.include? name.to_s.underscore and klass
|
|
194
|
+
return eval("ActiveScaffold::Config::#{name.to_s.titleize}")
|
|
195
|
+
end
|
|
196
|
+
super
|
|
197
|
+
end
|
|
198
|
+
# some utility methods
|
|
199
|
+
# --------------------
|
|
200
|
+
|
|
201
|
+
def model_id
|
|
202
|
+
@model_id
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def model
|
|
206
|
+
@model ||= @model_id.to_s.camelize.constantize
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# warning - this won't work as a per-request dynamic attribute in rails 2.0. You'll need to interact with Controller#generic_view_paths
|
|
210
|
+
def inherited_view_paths
|
|
211
|
+
@inherited_view_paths||=[]
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# must be a class method so the layout doesn't depend on a controller that uses active_scaffold
|
|
215
|
+
# note that this is unaffected by per-controller frontend configuration.
|
|
216
|
+
def self.asset_path(filename, frontend = self.frontend)
|
|
217
|
+
"active_scaffold/#{frontend}/#{filename}"
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# must be a class method so the layout doesn't depend on a controller that uses active_scaffold
|
|
221
|
+
# note that this is unaffected by per-controller frontend configuration.
|
|
222
|
+
def self.javascripts(frontend = self.frontend)
|
|
223
|
+
javascript_dir = File.join(Rails.public_path, "javascripts", asset_path('', frontend))
|
|
224
|
+
Dir.entries(javascript_dir).reject { |e| !e.match(/\.js$/) or (!self.dhtml_history? and e.match('dhtml_history')) }
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module ActiveScaffold::Config
|
|
2
|
+
class Create < ActiveScaffold::Config::Form
|
|
3
|
+
self.crud_type = :create
|
|
4
|
+
def initialize(*args)
|
|
5
|
+
super
|
|
6
|
+
self.persistent = self.class.persistent
|
|
7
|
+
self.edit_after_create = self.class.edit_after_create
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# global level configuration
|
|
11
|
+
# --------------------------
|
|
12
|
+
# the ActionLink for this action
|
|
13
|
+
def self.link
|
|
14
|
+
@@link
|
|
15
|
+
end
|
|
16
|
+
def self.link=(val)
|
|
17
|
+
@@link = val
|
|
18
|
+
end
|
|
19
|
+
@@link = ActiveScaffold::DataStructures::ActionLink.new('new', :label => :create_new, :type => :collection, :security_method => :create_authorized?, :ignore_method => :create_ignore?)
|
|
20
|
+
|
|
21
|
+
# whether the form stays open after a create or not
|
|
22
|
+
cattr_accessor :persistent
|
|
23
|
+
@@persistent = false
|
|
24
|
+
|
|
25
|
+
# whether update form is opened after a create or not
|
|
26
|
+
cattr_accessor :edit_after_create
|
|
27
|
+
@@edit_after_create = false
|
|
28
|
+
|
|
29
|
+
# instance-level configuration
|
|
30
|
+
# ----------------------------
|
|
31
|
+
# the label= method already exists in the Form base class
|
|
32
|
+
def label(model = nil)
|
|
33
|
+
model ||= @core.label(:count => 1)
|
|
34
|
+
@label ? as_(@label) : as_(:create_model, :model => model)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# whether the form stays open after a create or not
|
|
38
|
+
attr_accessor :persistent
|
|
39
|
+
|
|
40
|
+
# whether the form stays open after a create or not
|
|
41
|
+
attr_accessor :edit_after_create
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module ActiveScaffold::Config
|
|
2
|
+
class Delete < Base
|
|
3
|
+
self.crud_type = :delete
|
|
4
|
+
|
|
5
|
+
def initialize(core_config)
|
|
6
|
+
@core = core_config
|
|
7
|
+
|
|
8
|
+
# start with the ActionLink defined globally
|
|
9
|
+
@link = self.class.link.clone
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# global level configuration
|
|
13
|
+
# --------------------------
|
|
14
|
+
|
|
15
|
+
# the ActionLink for this action
|
|
16
|
+
cattr_accessor :link
|
|
17
|
+
@@link = ActiveScaffold::DataStructures::ActionLink.new('delete', :label => :delete, :type => :member, :confirm => :are_you_sure_to_delete, :crud_type => :delete, :position => false, :security_method => :delete_authorized?)
|
|
18
|
+
|
|
19
|
+
# instance-level configuration
|
|
20
|
+
# ----------------------------
|
|
21
|
+
|
|
22
|
+
# the ActionLink for this action
|
|
23
|
+
attr_accessor :link
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module ActiveScaffold::Config
|
|
2
|
+
class FieldSearch < Base
|
|
3
|
+
self.crud_type = :read
|
|
4
|
+
|
|
5
|
+
def initialize(core_config)
|
|
6
|
+
@core = core_config
|
|
7
|
+
|
|
8
|
+
@text_search = self.class.text_search
|
|
9
|
+
|
|
10
|
+
# start with the ActionLink defined globally
|
|
11
|
+
@link = self.class.link.clone
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# global level configuration
|
|
16
|
+
# --------------------------
|
|
17
|
+
# the ActionLink for this action
|
|
18
|
+
cattr_reader :link
|
|
19
|
+
@@link = ActiveScaffold::DataStructures::ActionLink.new('show_search', :label => :search, :type => :collection, :security_method => :search_authorized?, :ignore_method => :search_ignore?)
|
|
20
|
+
|
|
21
|
+
# A flag for how the search should do full-text searching in the database:
|
|
22
|
+
# * :full: LIKE %?%
|
|
23
|
+
# * :start: LIKE ?%
|
|
24
|
+
# * :end: LIKE %?
|
|
25
|
+
# * false: LIKE ?
|
|
26
|
+
# Default is :full
|
|
27
|
+
cattr_accessor :text_search
|
|
28
|
+
@@text_search = :full
|
|
29
|
+
|
|
30
|
+
# instance-level configuration
|
|
31
|
+
# ----------------------------
|
|
32
|
+
|
|
33
|
+
# provides access to the list of columns specifically meant for the Search to use
|
|
34
|
+
def columns
|
|
35
|
+
# we want to delay initializing to the @core.columns set for as long as possible. Too soon and .search_sql will not be available to .searchable?
|
|
36
|
+
unless @columns
|
|
37
|
+
self.columns = @core.columns._inheritable
|
|
38
|
+
self.columns.exclude @core.columns.active_record_class.locking_column.to_sym
|
|
39
|
+
end
|
|
40
|
+
@columns
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
public :columns=
|
|
44
|
+
|
|
45
|
+
# A flag for how the search should do full-text searching in the database:
|
|
46
|
+
# * :full: LIKE %?%
|
|
47
|
+
# * :start: LIKE ?%
|
|
48
|
+
# * :end: LIKE %?
|
|
49
|
+
# * false: LIKE ?
|
|
50
|
+
# Default is :full
|
|
51
|
+
attr_accessor :text_search
|
|
52
|
+
|
|
53
|
+
# the ActionLink for this action
|
|
54
|
+
attr_accessor :link
|
|
55
|
+
|
|
56
|
+
# rarely searched columns may be placed in a hidden subgroup
|
|
57
|
+
def optional_columns=(optionals)
|
|
58
|
+
@optional_columns= Array(optionals)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def optional_columns
|
|
62
|
+
@optional_columns ||= []
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# default search params
|
|
66
|
+
# default_params = {:title => {"from"=>"test", "to"=>"", "opt"=>"%?%"}}
|
|
67
|
+
attr_accessor :default_params
|
|
68
|
+
|
|
69
|
+
# human conditions
|
|
70
|
+
# instead of just filtered you may show the user a humanized search condition statment
|
|
71
|
+
attr_accessor :human_conditions
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
end
|