active_scaffold-sequel 0.3.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/CHANGELOG +179 -0
- data/MIT-LICENSE +20 -0
- data/README +36 -0
- data/app/assets/images/active_scaffold/add.gif +0 -0
- data/app/assets/images/active_scaffold/arrow_down.gif +0 -0
- data/app/assets/images/active_scaffold/arrow_up.gif +0 -0
- data/app/assets/images/active_scaffold/close.gif +0 -0
- data/app/assets/images/active_scaffold/close_touch.png +0 -0
- data/app/assets/images/active_scaffold/config.png +0 -0
- data/app/assets/images/active_scaffold/cross.png +0 -0
- data/app/assets/images/active_scaffold/gears.png +0 -0
- data/app/assets/images/active_scaffold/indicator-small.gif +0 -0
- data/app/assets/images/active_scaffold/indicator.gif +0 -0
- data/app/assets/images/active_scaffold/magnifier.png +0 -0
- data/app/assets/javascripts/active_scaffold.js.erb +19 -0
- data/app/assets/javascripts/jquery/active_scaffold.js +1057 -0
- data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +24 -0
- data/app/assets/javascripts/jquery/draggable_lists.js +27 -0
- data/app/assets/javascripts/jquery/jquery.editinplace.js +743 -0
- data/app/assets/javascripts/jquery/tiny_mce_bridge.js +7 -0
- data/app/assets/javascripts/prototype/active_scaffold.js +1052 -0
- data/app/assets/javascripts/prototype/dhtml_history.js +870 -0
- data/app/assets/javascripts/prototype/form_enhancements.js +117 -0
- data/app/assets/javascripts/prototype/rico_corner.js +370 -0
- data/app/assets/javascripts/prototype/tiny_mce_bridge.js +7 -0
- data/app/assets/stylesheets/active_scaffold-ie.css +35 -0
- data/app/assets/stylesheets/active_scaffold.css.scss +14 -0
- data/app/assets/stylesheets/active_scaffold_colors.css.scss +395 -0
- data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -0
- data/app/assets/stylesheets/active_scaffold_images.css.scss +43 -0
- data/app/assets/stylesheets/active_scaffold_layout.css +912 -0
- data/app/assets/stylesheets/blue-theme.css +74 -0
- data/config/locales/de.yml +114 -0
- data/config/locales/en.yml +118 -0
- data/config/locales/es.yml +120 -0
- data/config/locales/fr.yml +121 -0
- data/config/locales/hu.yml +74 -0
- data/config/locales/ja.yml +73 -0
- data/config/locales/ru.yml +123 -0
- data/frontends/default/views/_action_group.html.erb +24 -0
- data/frontends/default/views/_add_existing_form.html.erb +30 -0
- data/frontends/default/views/_base_form.html.erb +51 -0
- data/frontends/default/views/_create_form.html.erb +8 -0
- data/frontends/default/views/_create_form_on_list.html.erb +6 -0
- data/frontends/default/views/_field_search.html.erb +32 -0
- data/frontends/default/views/_form.html.erb +24 -0
- data/frontends/default/views/_form_association.html.erb +15 -0
- data/frontends/default/views/_form_association_footer.html.erb +47 -0
- data/frontends/default/views/_form_attribute.html.erb +20 -0
- data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
- data/frontends/default/views/_form_messages.html.erb +5 -0
- data/frontends/default/views/_horizontal_subform.html.erb +28 -0
- data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
- data/frontends/default/views/_horizontal_subform_header.html.erb +11 -0
- data/frontends/default/views/_horizontal_subform_record.html.erb +38 -0
- data/frontends/default/views/_human_conditions.html.erb +1 -0
- data/frontends/default/views/_list.html.erb +18 -0
- data/frontends/default/views/_list_actions.html.erb +15 -0
- data/frontends/default/views/_list_calculations.html.erb +16 -0
- data/frontends/default/views/_list_column_headings.html.erb +12 -0
- data/frontends/default/views/_list_header.html.erb +10 -0
- data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
- data/frontends/default/views/_list_messages.html.erb +30 -0
- data/frontends/default/views/_list_pagination.html.erb +11 -0
- data/frontends/default/views/_list_pagination_links.html.erb +9 -0
- data/frontends/default/views/_list_record.html.erb +14 -0
- data/frontends/default/views/_list_record_columns.html.erb +8 -0
- data/frontends/default/views/_list_with_header.html.erb +36 -0
- data/frontends/default/views/_messages.html.erb +10 -0
- data/frontends/default/views/_render_field.js.erb +20 -0
- data/frontends/default/views/_row.html.erb +6 -0
- data/frontends/default/views/_search.html.erb +34 -0
- data/frontends/default/views/_search_attribute.html.erb +10 -0
- data/frontends/default/views/_show.html.erb +8 -0
- data/frontends/default/views/_show_columns.html.erb +15 -0
- data/frontends/default/views/_update_actions.html.erb +9 -0
- data/frontends/default/views/_update_form.html.erb +6 -0
- data/frontends/default/views/_vertical_subform.html.erb +12 -0
- data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
- data/frontends/default/views/action_confirmation.html.erb +13 -0
- data/frontends/default/views/add_existing.js.erb +18 -0
- data/frontends/default/views/add_existing_form.html.erb +5 -0
- data/frontends/default/views/create.html.erb +5 -0
- data/frontends/default/views/delete.html.erb +13 -0
- data/frontends/default/views/destroy.js.erb +24 -0
- data/frontends/default/views/edit_associated.js.erb +12 -0
- data/frontends/default/views/field_search.html.erb +5 -0
- data/frontends/default/views/form_messages.js.erb +1 -0
- data/frontends/default/views/list.html.erb +1 -0
- data/frontends/default/views/on_action_update.js.erb +13 -0
- data/frontends/default/views/on_create.js.erb +47 -0
- data/frontends/default/views/on_mark_all.js.erb +12 -0
- data/frontends/default/views/on_update.js.erb +31 -0
- data/frontends/default/views/refresh_list.js.erb +1 -0
- data/frontends/default/views/render_field.js.erb +1 -0
- data/frontends/default/views/search.html.erb +5 -0
- data/frontends/default/views/show.html.erb +5 -0
- data/frontends/default/views/update.html.erb +8 -0
- data/frontends/default/views/update_column.js.erb +16 -0
- data/frontends/default/views/update_row.js.erb +1 -0
- data/lib/active_scaffold/actions/common_search.rb +25 -0
- data/lib/active_scaffold/actions/core.rb +197 -0
- data/lib/active_scaffold/actions/create.rb +148 -0
- data/lib/active_scaffold/actions/delete.rb +76 -0
- data/lib/active_scaffold/actions/field_search.rb +82 -0
- data/lib/active_scaffold/actions/list.rb +196 -0
- data/lib/active_scaffold/actions/mark.rb +75 -0
- data/lib/active_scaffold/actions/nested.rb +245 -0
- data/lib/active_scaffold/actions/search.rb +48 -0
- data/lib/active_scaffold/actions/show.rb +61 -0
- data/lib/active_scaffold/actions/subform.rb +23 -0
- data/lib/active_scaffold/actions/update.rb +150 -0
- data/lib/active_scaffold/active_record_permissions.rb +136 -0
- data/lib/active_scaffold/attribute_params.rb +208 -0
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +39 -0
- data/lib/active_scaffold/bridges/ancestry.rb +5 -0
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +67 -0
- data/lib/active_scaffold/bridges/calendar_date_select.rb +24 -0
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +107 -0
- data/lib/active_scaffold/bridges/cancan.rb +15 -0
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +31 -0
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +10 -0
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +45 -0
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +17 -0
- data/lib/active_scaffold/bridges/carrierwave.rb +12 -0
- data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +358 -0
- data/lib/active_scaffold/bridges/country_helper.rb +9 -0
- data/lib/active_scaffold/bridges/date_picker/ext.rb +45 -0
- data/lib/active_scaffold/bridges/date_picker/helper.rb +180 -0
- data/lib/active_scaffold/bridges/date_picker.rb +23 -0
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +34 -0
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +10 -0
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +27 -0
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +16 -0
- data/lib/active_scaffold/bridges/dragonfly.rb +9 -0
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +48 -0
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +57 -0
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +34 -0
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +26 -0
- data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
- data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
- data/lib/active_scaffold/bridges/file_column.rb +11 -0
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +27 -0
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +16 -0
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +36 -0
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +24 -0
- data/lib/active_scaffold/bridges/paperclip.rb +12 -0
- data/lib/active_scaffold/bridges/record_select/helpers.rb +86 -0
- data/lib/active_scaffold/bridges/record_select.rb +11 -0
- data/lib/active_scaffold/bridges/semantic_attributes/column.rb +20 -0
- data/lib/active_scaffold/bridges/semantic_attributes.rb +5 -0
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +46 -0
- data/lib/active_scaffold/bridges/tiny_mce.rb +17 -0
- data/lib/active_scaffold/bridges.rb +61 -0
- data/lib/active_scaffold/config/base.rb +71 -0
- data/lib/active_scaffold/config/core.rb +219 -0
- data/lib/active_scaffold/config/create.rb +44 -0
- data/lib/active_scaffold/config/delete.rb +33 -0
- data/lib/active_scaffold/config/field_search.rb +76 -0
- data/lib/active_scaffold/config/form.rb +48 -0
- data/lib/active_scaffold/config/list.rb +196 -0
- data/lib/active_scaffold/config/mark.rb +35 -0
- data/lib/active_scaffold/config/nested.rb +42 -0
- data/lib/active_scaffold/config/search.rb +73 -0
- data/lib/active_scaffold/config/show.rb +32 -0
- data/lib/active_scaffold/config/subform.rb +35 -0
- data/lib/active_scaffold/config/update.rb +41 -0
- data/lib/active_scaffold/configurable.rb +29 -0
- data/lib/active_scaffold/constraints.rb +170 -0
- data/lib/active_scaffold/data_structures/action_columns.rb +140 -0
- data/lib/active_scaffold/data_structures/action_link.rb +179 -0
- data/lib/active_scaffold/data_structures/action_links.rb +185 -0
- data/lib/active_scaffold/data_structures/actions.rb +45 -0
- data/lib/active_scaffold/data_structures/bridge.rb +22 -0
- data/lib/active_scaffold/data_structures/column.rb +389 -0
- data/lib/active_scaffold/data_structures/columns.rb +75 -0
- data/lib/active_scaffold/data_structures/error_message.rb +24 -0
- data/lib/active_scaffold/data_structures/nested_info.rb +130 -0
- data/lib/active_scaffold/data_structures/set.rb +57 -0
- data/lib/active_scaffold/data_structures/sorting.rb +172 -0
- data/lib/active_scaffold/engine.rb +4 -0
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +22 -0
- data/lib/active_scaffold/extensions/action_view_rendering.rb +115 -0
- data/lib/active_scaffold/extensions/active_record_offset.rb +12 -0
- data/lib/active_scaffold/extensions/array.rb +7 -0
- data/lib/active_scaffold/extensions/cache_association.rb +16 -0
- data/lib/active_scaffold/extensions/localize.rb +10 -0
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +12 -0
- data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +7 -0
- data/lib/active_scaffold/extensions/paginator_extensions.rb +26 -0
- data/lib/active_scaffold/extensions/routing_mapper.rb +48 -0
- data/lib/active_scaffold/extensions/to_label.rb +8 -0
- data/lib/active_scaffold/extensions/unsaved_associated.rb +60 -0
- data/lib/active_scaffold/extensions/unsaved_record.rb +20 -0
- data/lib/active_scaffold/extensions/usa_state.rb +46 -0
- data/lib/active_scaffold/finder.rb +372 -0
- data/lib/active_scaffold/helpers/association_helpers.rb +48 -0
- data/lib/active_scaffold/helpers/controller_helpers.rb +88 -0
- data/lib/active_scaffold/helpers/form_column_helpers.rb +321 -0
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -0
- data/lib/active_scaffold/helpers/id_helpers.rb +127 -0
- data/lib/active_scaffold/helpers/list_column_helpers.rb +340 -0
- data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
- data/lib/active_scaffold/helpers/search_column_helpers.rb +267 -0
- data/lib/active_scaffold/helpers/show_column_helpers.rb +50 -0
- data/lib/active_scaffold/helpers/view_helpers.rb +342 -0
- data/lib/active_scaffold/marked_model.rb +38 -0
- data/lib/active_scaffold/paginator.rb +136 -0
- data/lib/active_scaffold/responds_to_parent.rb +70 -0
- data/lib/active_scaffold/version.rb +9 -0
- data/lib/active_scaffold.rb +368 -0
- data/lib/active_scaffold_env.rb +11 -0
- data/lib/generators/active_scaffold/USAGE +29 -0
- data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
- data/lib/generators/active_scaffold_controller/USAGE +19 -0
- data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +29 -0
- data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
- data/lib/generators/active_scaffold_controller/templates/helper.rb +2 -0
- data/public/blank.html +33 -0
- data/shoulda_macros/macros.rb +136 -0
- data/test/bridges/active_scaffold_dependent_protect_test.rb +34 -0
- data/test/bridges/bridge_test.rb +90 -0
- data/test/bridges/company.rb +81 -0
- data/test/bridges/paperclip_test.rb +68 -0
- data/test/bridges/tiny_mce_test.rb +27 -0
- data/test/bridges/unobtrusive_date_picker_test.rb +49 -0
- data/test/bridges/validation_reflection_test.rb +57 -0
- data/test/config/base_test.rb +15 -0
- data/test/config/core_test.rb +58 -0
- data/test/config/create_test.rb +58 -0
- data/test/config/delete_test.rb +33 -0
- data/test/config/field_search_test.rb +47 -0
- data/test/config/list_test.rb +129 -0
- data/test/config/nested_test.rb +62 -0
- data/test/config/search_test.rb +60 -0
- data/test/config/show_test.rb +43 -0
- data/test/config/subform_test.rb +17 -0
- data/test/config/update_test.rb +40 -0
- data/test/const_mocker.rb +36 -0
- data/test/data_structures/action_columns_test.rb +113 -0
- data/test/data_structures/action_link_test.rb +78 -0
- data/test/data_structures/action_links_test.rb +78 -0
- data/test/data_structures/actions_test.rb +25 -0
- data/test/data_structures/association_column_test.rb +42 -0
- data/test/data_structures/column_test.rb +185 -0
- data/test/data_structures/columns_test.rb +69 -0
- data/test/data_structures/error_message_test.rb +28 -0
- data/test/data_structures/set_test.rb +86 -0
- data/test/data_structures/sorting_test.rb +126 -0
- data/test/data_structures/standard_column_test.rb +24 -0
- data/test/data_structures/virtual_column_test.rb +23 -0
- data/test/extensions/active_record_test.rb +45 -0
- data/test/extensions/array_test.rb +12 -0
- data/test/helpers/form_column_helpers_test.rb +31 -0
- data/test/helpers/list_column_helpers_test.rb +42 -0
- data/test/helpers/pagination_helpers_test.rb +59 -0
- data/test/misc/active_record_permissions_test.rb +154 -0
- data/test/misc/attribute_params_test.rb +146 -0
- data/test/misc/configurable_test.rb +96 -0
- data/test/misc/constraints_test.rb +193 -0
- data/test/misc/finder_test.rb +92 -0
- data/test/misc/lang_test.rb +11 -0
- data/test/mock_app/app/controllers/application_controller.rb +10 -0
- data/test/mock_app/app/helpers/application_helper.rb +3 -0
- data/test/mock_app/config/boot.rb +110 -0
- data/test/mock_app/config/database.yml +16 -0
- data/test/mock_app/config/environment.rb +43 -0
- data/test/mock_app/config/environments/development.rb +17 -0
- data/test/mock_app/config/environments/production.rb +28 -0
- data/test/mock_app/config/environments/test.rb +28 -0
- data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
- data/test/mock_app/config/initializers/inflections.rb +10 -0
- data/test/mock_app/config/initializers/mime_types.rb +5 -0
- data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
- data/test/mock_app/config/initializers/session_store.rb +15 -0
- data/test/mock_app/config/locales/en.yml +5 -0
- data/test/mock_app/config/routes.rb +43 -0
- data/test/mock_app/db/test.sqlite3 +1 -0
- data/test/mock_app/public/blank.html +33 -0
- data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
- data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
- data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
- data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
- data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
- data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
- data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
- data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
- data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
- data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +848 -0
- data/test/model_stub.rb +55 -0
- data/test/run_all.rb +8 -0
- data/test/test_helper.rb +39 -0
- data/vendor/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/vendor/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/vendor/assets/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/vendor/assets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/vendor/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/vendor/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/vendor/assets/images/ui-icons_222222_256x240.png +0 -0
- data/vendor/assets/images/ui-icons_228ef1_256x240.png +0 -0
- data/vendor/assets/images/ui-icons_ef8c08_256x240.png +0 -0
- data/vendor/assets/images/ui-icons_ffd27a_256x240.png +0 -0
- data/vendor/assets/images/ui-icons_ffffff_256x240.png +0 -0
- data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1276 -0
- data/vendor/assets/stylesheets/jquery-ui.css +568 -0
- metadata +502 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
module ActiveScaffold::DataStructures
|
|
2
|
+
class ActionLink
|
|
3
|
+
# provides a quick way to set any property of the object from a hash
|
|
4
|
+
def initialize(action, options = {})
|
|
5
|
+
# set defaults
|
|
6
|
+
self.action = action
|
|
7
|
+
self.label = action
|
|
8
|
+
self.confirm = false
|
|
9
|
+
self.type = :collection
|
|
10
|
+
self.inline = true
|
|
11
|
+
self.method = :get
|
|
12
|
+
self.crud_type = :delete if [:destroy].include?(action.try(:to_sym))
|
|
13
|
+
self.crud_type = :create if [:create, :new].include?(action.try(:to_sym))
|
|
14
|
+
self.crud_type = :update if [:edit, :update].include?(action.try(:to_sym))
|
|
15
|
+
self.crud_type ||= :read
|
|
16
|
+
self.parameters = {}
|
|
17
|
+
self.html_options = {}
|
|
18
|
+
self.column = nil
|
|
19
|
+
self.image = nil
|
|
20
|
+
self.dynamic_parameters = nil
|
|
21
|
+
|
|
22
|
+
# apply quick properties
|
|
23
|
+
options.each_pair do |k, v|
|
|
24
|
+
setter = "#{k}="
|
|
25
|
+
self.send(setter, v) if self.respond_to? setter
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# the action-path for this link. what page to request? this is required!
|
|
30
|
+
attr_accessor :action
|
|
31
|
+
|
|
32
|
+
# the controller for this action link. if nil, the current controller should be assumed.
|
|
33
|
+
attr_writer :controller
|
|
34
|
+
|
|
35
|
+
def controller
|
|
36
|
+
@controller = @controller.call if @controller.is_a?(Proc)
|
|
37
|
+
@controller
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def static_controller?
|
|
41
|
+
!@controller.is_a?(Proc)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# a hash of request parameters
|
|
45
|
+
attr_accessor :parameters
|
|
46
|
+
|
|
47
|
+
# a block for dynamic_parameters
|
|
48
|
+
attr_accessor :dynamic_parameters
|
|
49
|
+
|
|
50
|
+
# the RESTful method
|
|
51
|
+
attr_accessor :method
|
|
52
|
+
|
|
53
|
+
# what string to use to represent this action
|
|
54
|
+
attr_writer :label
|
|
55
|
+
def label
|
|
56
|
+
@label.is_a?(Symbol) ? as_(@label) : @label
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# image to use {:name => 'arrow.png', :size => '16x16'}
|
|
60
|
+
attr_accessor :image
|
|
61
|
+
|
|
62
|
+
# if the action requires confirmation
|
|
63
|
+
def confirm=(value)
|
|
64
|
+
@dhtml_confirm = nil if value
|
|
65
|
+
@confirm = value
|
|
66
|
+
end
|
|
67
|
+
def confirm(label = '')
|
|
68
|
+
@confirm.is_a?(String) ? @confirm : as_(@confirm, :label => label)
|
|
69
|
+
end
|
|
70
|
+
def confirm?
|
|
71
|
+
!!@confirm
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# if the action uses a DHTML based (i.e. 2-phase) confirmation
|
|
75
|
+
attr_accessor :dhtml_confirm
|
|
76
|
+
def dhtml_confirm=(value)
|
|
77
|
+
@confirm = nil if value
|
|
78
|
+
@dhtml_confirm = value
|
|
79
|
+
end
|
|
80
|
+
def dhtml_confirm?
|
|
81
|
+
!!@dhtml_confirm
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# what method to call on the controller to see if this action_link should be visible
|
|
85
|
+
# note that this is only the UI part of the security. to prevent URL hax0rz, you also need security on requests (e.g. don't execute update method unless authorized).
|
|
86
|
+
attr_writer :security_method
|
|
87
|
+
def security_method
|
|
88
|
+
@security_method || "#{self.action}_authorized?"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def security_method_set?
|
|
92
|
+
!!@security_method
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
attr_accessor :ignore_method
|
|
96
|
+
|
|
97
|
+
# the crud type of the (eventual?) action. different than :method, because this crud action may not be imminent.
|
|
98
|
+
# this is used to determine record-level authorization (e.g. record.authorized_for?(:crud_type => link.crud_type).
|
|
99
|
+
# options are :create, :read, :update, and :delete
|
|
100
|
+
attr_accessor :crud_type
|
|
101
|
+
|
|
102
|
+
# an "inline" link is inserted into the existing page
|
|
103
|
+
# exclusive with popup? and page?
|
|
104
|
+
def inline=(val)
|
|
105
|
+
@inline = (val == true)
|
|
106
|
+
self.popup = self.page = false if @inline
|
|
107
|
+
end
|
|
108
|
+
def inline?; @inline end
|
|
109
|
+
|
|
110
|
+
# a "popup" link displays in a separate (browser?) window. this will eventually take arguments.
|
|
111
|
+
# exclusive with inline? and page?
|
|
112
|
+
def popup=(val)
|
|
113
|
+
@popup = (val == true)
|
|
114
|
+
if @popup
|
|
115
|
+
self.inline = self.page = false
|
|
116
|
+
|
|
117
|
+
# the :method parameter doesn't mix with the :popup parameter
|
|
118
|
+
# when/if we start using DHTML popups, we can bring :method back
|
|
119
|
+
self.method = nil
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
def popup?; @popup end
|
|
123
|
+
|
|
124
|
+
# a "page" link displays by reloading the current page
|
|
125
|
+
# exclusive with inline? and popup?
|
|
126
|
+
def page=(val)
|
|
127
|
+
@page = (val == true)
|
|
128
|
+
if @page
|
|
129
|
+
self.inline = self.popup = false
|
|
130
|
+
|
|
131
|
+
# when :method is defined, ActionView adds an onclick to use a form ...
|
|
132
|
+
# so it's best to just empty out :method whenever possible.
|
|
133
|
+
# we only ever need to know @method = :get for things that default to POST.
|
|
134
|
+
# the only things that default to POST are forms and ajax calls.
|
|
135
|
+
# when @page = true, we don't use ajax.
|
|
136
|
+
self.method = nil if method == :get
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
def page?; @page end
|
|
140
|
+
|
|
141
|
+
# where the result of this action should insert in the display.
|
|
142
|
+
# for :type => :collection, supported values are:
|
|
143
|
+
# :top
|
|
144
|
+
# :bottom
|
|
145
|
+
# :replace (for updating the entire table)
|
|
146
|
+
# false (no attempt at positioning)
|
|
147
|
+
# for :type => :member, supported values are:
|
|
148
|
+
# :before
|
|
149
|
+
# :replace
|
|
150
|
+
# :after
|
|
151
|
+
# false (no attempt at positioning)
|
|
152
|
+
attr_writer :position
|
|
153
|
+
def position
|
|
154
|
+
return @position unless @position.nil? or @position == true
|
|
155
|
+
return :replace if self.type == :member
|
|
156
|
+
return :top if self.type == :collection
|
|
157
|
+
raise "what should the default position be for #{self.type}?"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# what type of link this is. currently supported values are :collection and :member.
|
|
161
|
+
attr_accessor :type
|
|
162
|
+
|
|
163
|
+
# html options for the link
|
|
164
|
+
attr_accessor :html_options
|
|
165
|
+
|
|
166
|
+
# nested action_links are referencing a column
|
|
167
|
+
attr_accessor :column
|
|
168
|
+
|
|
169
|
+
# indicates that this a nested_link
|
|
170
|
+
def nested_link?
|
|
171
|
+
@column || (parameters && parameters[:named_scope])
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Internal use: generated eid for this action_link
|
|
175
|
+
attr_accessor :eid
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
end
|
|
179
|
+
end
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
module ActiveScaffold::DataStructures
|
|
2
|
+
class ActionLinks
|
|
3
|
+
include Enumerable
|
|
4
|
+
|
|
5
|
+
def initialize
|
|
6
|
+
@set = []
|
|
7
|
+
@name = :root
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# adds an ActionLink, creating one from the arguments if need be
|
|
11
|
+
def add(action, options = {})
|
|
12
|
+
link = if action.is_a?(ActiveScaffold::DataStructures::ActionLink) || action.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
|
13
|
+
action
|
|
14
|
+
else
|
|
15
|
+
ActiveScaffold::DataStructures::ActionLink.new(action, options)
|
|
16
|
+
end
|
|
17
|
+
# NOTE: this duplicate check should be done by defining the comparison operator for an Action data structure
|
|
18
|
+
existing = find_duplicate(link)
|
|
19
|
+
unless existing
|
|
20
|
+
# That s for backwards compatibility if we are in root of action_links
|
|
21
|
+
# we have to move actionlink into members or collection subgroup
|
|
22
|
+
group = (name == :root ? subgroup(link.type, link.type) : self)
|
|
23
|
+
group.add_to_set(link)
|
|
24
|
+
link
|
|
25
|
+
else
|
|
26
|
+
existing
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
alias_method :<<, :add
|
|
30
|
+
|
|
31
|
+
def add_to_set(link)
|
|
32
|
+
@set << link
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# adds a link to a specific group
|
|
36
|
+
# groups are represented as a string separated by a dot
|
|
37
|
+
# eg member.crud
|
|
38
|
+
def add_to_group(link, group = nil)
|
|
39
|
+
add_to = root
|
|
40
|
+
add_to = group.split('.').inject(root){|group, group_name| group.send(group_name)} if group
|
|
41
|
+
add_to << link unless link.nil?
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# finds an ActionLink by matching the action
|
|
45
|
+
def [](val)
|
|
46
|
+
links = []
|
|
47
|
+
@set.each do |item|
|
|
48
|
+
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
|
49
|
+
collected = item[val]
|
|
50
|
+
links << collected unless collected.nil?
|
|
51
|
+
else
|
|
52
|
+
links << item if item.action == val.to_s
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
links.first
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def find_duplicate(link)
|
|
59
|
+
links = []
|
|
60
|
+
@set.each do |item|
|
|
61
|
+
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
|
62
|
+
collected = item.find_duplicate(link)
|
|
63
|
+
links << collected unless collected.nil?
|
|
64
|
+
else
|
|
65
|
+
links << item if item.action == link.action and item.static_controller? && item.controller == link.controller and item.parameters == link.parameters
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
links.first
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def delete(val)
|
|
72
|
+
self.each({:include_set => true}) do |link, set|
|
|
73
|
+
if link.action == val.to_s
|
|
74
|
+
set.delete_if {|item| item.is_a?(ActiveScaffold::DataStructures::ActionLink) && item.action == val.to_s}
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def delete_group(name)
|
|
80
|
+
@set.each do |group|
|
|
81
|
+
if group.name == name
|
|
82
|
+
@set.delete_if {|item| item.is_a?(ActiveScaffold::DataStructures::ActionLinks) && item.name == name}
|
|
83
|
+
else
|
|
84
|
+
group.delete_group(name)
|
|
85
|
+
end if group.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# iterates over the links, possibly by type
|
|
90
|
+
def each(options = {}, &block)
|
|
91
|
+
@set.each {|item|
|
|
92
|
+
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
|
93
|
+
item.each(options, &block)
|
|
94
|
+
else
|
|
95
|
+
if options[:include_set]
|
|
96
|
+
yield item, @set
|
|
97
|
+
else
|
|
98
|
+
yield item
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
}
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def collect_by_type(type = nil)
|
|
105
|
+
links = []
|
|
106
|
+
subgroup(type).each(type) {|link| links << link}
|
|
107
|
+
links
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def traverse(controller, options = {}, &block)
|
|
111
|
+
traverse_method = options.delete(:reverse).nil? ? :each : :reverse_each
|
|
112
|
+
options[:level] ||= -1
|
|
113
|
+
options[:level] += 1
|
|
114
|
+
first_action = true
|
|
115
|
+
@set.send(traverse_method) do |link|
|
|
116
|
+
if link.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
|
117
|
+
unless link.empty?
|
|
118
|
+
yield(link, nil, {:node => :start_traversing, :first_action => first_action, :level => options[:level]})
|
|
119
|
+
link.traverse(controller,options, &block)
|
|
120
|
+
yield(link, nil, {:node => :finished_traversing, :first_action => first_action, :level => options[:level]})
|
|
121
|
+
first_action = false
|
|
122
|
+
end
|
|
123
|
+
elsif controller.nil? || !skip_action_link(controller, link, *(Array(options[:for])))
|
|
124
|
+
authorized = options[:for].nil? ? true : options[:for].authorized_for?(:crud_type => link.crud_type, :action => link.action)
|
|
125
|
+
yield(self, link, {:authorized => authorized, :first_action => first_action, :level => options[:level]})
|
|
126
|
+
first_action = false
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
options[:level] -= 1
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def collect
|
|
133
|
+
@set
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def empty?
|
|
137
|
+
@set.size == 0
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def subgroup(name, label = nil)
|
|
141
|
+
group = self if name == self.name
|
|
142
|
+
group ||= @set.find do |item|
|
|
143
|
+
name == item.name if item.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
if group.nil?
|
|
147
|
+
group = ActiveScaffold::DataStructures::ActionLinks.new
|
|
148
|
+
group.label = label || name
|
|
149
|
+
group.name = name
|
|
150
|
+
add_to_set group
|
|
151
|
+
end
|
|
152
|
+
group
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
attr_writer :label
|
|
156
|
+
def label
|
|
157
|
+
as_(@label) if @label
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def method_missing(name, *args, &block)
|
|
161
|
+
class_eval %{
|
|
162
|
+
def #{name}
|
|
163
|
+
@#{name} ||= subgroup('#{name}'.to_sym)
|
|
164
|
+
yield @#{name} if block_given?
|
|
165
|
+
@#{name}
|
|
166
|
+
end
|
|
167
|
+
}
|
|
168
|
+
send(name, &block)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
attr_accessor :name
|
|
172
|
+
|
|
173
|
+
protected
|
|
174
|
+
|
|
175
|
+
def skip_action_link(controller, link, *args)
|
|
176
|
+
(!link.ignore_method.nil? && controller.respond_to?(link.ignore_method) && controller.send(link.ignore_method, *args)) || ((link.security_method_set? or controller.respond_to? link.security_method) and !controller.send(link.security_method, *args))
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# called during clone or dup. makes the clone/dup deeper.
|
|
180
|
+
def initialize_copy(from)
|
|
181
|
+
@set = []
|
|
182
|
+
from.instance_variable_get('@set').each { |link| @set << link.clone }
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
class ActiveScaffold::DataStructures::Actions
|
|
2
|
+
include Enumerable
|
|
3
|
+
|
|
4
|
+
def initialize(*args)
|
|
5
|
+
@set = []
|
|
6
|
+
self.add *args
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def exclude(*args)
|
|
10
|
+
args.collect! { |a| a.to_sym } # symbolize the args
|
|
11
|
+
@set.reject! { |m| args.include? m } # reject all actions specified
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def add(*args)
|
|
15
|
+
args.each { |arg| @set << arg.to_sym unless @set.include? arg.to_sym }
|
|
16
|
+
end
|
|
17
|
+
alias_method :<<, :add
|
|
18
|
+
|
|
19
|
+
def each
|
|
20
|
+
@set.each {|item| yield item}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def include?(val)
|
|
24
|
+
super val.to_sym
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# swaps one element in the list with the other.
|
|
28
|
+
# accepts arguments in any order. it just figures out which one is in the list and which one is not.
|
|
29
|
+
def swap(one, two)
|
|
30
|
+
if include? one
|
|
31
|
+
exclude one
|
|
32
|
+
add two
|
|
33
|
+
else
|
|
34
|
+
exclude two
|
|
35
|
+
add one
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
|
|
41
|
+
# called during clone or dup. makes the clone/dup deeper.
|
|
42
|
+
def initialize_copy(from)
|
|
43
|
+
@set = from.instance_variable_get('@set').clone
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module ActiveScaffold::DataStructures
|
|
2
|
+
class Bridge
|
|
3
|
+
def self.install
|
|
4
|
+
raise(RunTimeError, "install not defined for bridge #{name}")
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
# by convention and default, use the bridge name as the required constant for installation
|
|
8
|
+
def self.install?
|
|
9
|
+
Object.const_defined? name.demodulize
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.run
|
|
13
|
+
install if install?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.stylesheets
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.javascripts
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|