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,50 @@
|
|
|
1
|
+
module ActiveScaffold
|
|
2
|
+
module Helpers
|
|
3
|
+
# Helpers that assist with the rendering of a List Column
|
|
4
|
+
module ShowColumnHelpers
|
|
5
|
+
def show_column_value(record, column)
|
|
6
|
+
# check for an override helper
|
|
7
|
+
if show_column_override? column
|
|
8
|
+
# we only pass the record as the argument. we previously also passed the formatted_value,
|
|
9
|
+
# but mike perham pointed out that prohibited the usage of overrides to improve on the
|
|
10
|
+
# performance of our default formatting. see issue #138.
|
|
11
|
+
send(show_column_override(column), record)
|
|
12
|
+
# second, check if the dev has specified a valid list_ui for this column
|
|
13
|
+
elsif column.list_ui and override_show_column_ui?(column.list_ui)
|
|
14
|
+
send(override_show_column_ui(column.list_ui), column, record)
|
|
15
|
+
else
|
|
16
|
+
if column.column and override_show_column_ui?(column.column[:type])
|
|
17
|
+
send(override_show_column_ui(column.column[:type]), column, record)
|
|
18
|
+
else
|
|
19
|
+
get_column_value(record, column)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def active_scaffold_show_text(column, record)
|
|
25
|
+
simple_format(clean_column_value(record.send(column.name)))
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def show_column_override_name(column, class_prefix = false)
|
|
29
|
+
"#{clean_class_name(column.active_record_class.name) + '_' if class_prefix}#{clean_column_name(column.name)}_show_column"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def show_column_override(column)
|
|
33
|
+
method_with_class = show_column_override_name(column, true)
|
|
34
|
+
return method_with_class if respond_to?(method_with_class)
|
|
35
|
+
method = show_column_override_name(column)
|
|
36
|
+
method if respond_to?(method)
|
|
37
|
+
end
|
|
38
|
+
alias_method :show_column_override?, :show_column_override
|
|
39
|
+
|
|
40
|
+
def override_show_column_ui?(list_ui)
|
|
41
|
+
respond_to?(override_show_column_ui(list_ui))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# the naming convention for overriding show types with helpers
|
|
45
|
+
def override_show_column_ui(list_ui)
|
|
46
|
+
"active_scaffold_show_#{list_ui}"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
module ActiveScaffold
|
|
2
|
+
module Helpers
|
|
3
|
+
# All extra helpers that should be included in the View.
|
|
4
|
+
# Also a dumping ground for uncategorized helpers.
|
|
5
|
+
module ViewHelpers
|
|
6
|
+
include ActiveScaffold::Helpers::IdHelpers
|
|
7
|
+
include ActiveScaffold::Helpers::AssociationHelpers
|
|
8
|
+
include ActiveScaffold::Helpers::PaginationHelpers
|
|
9
|
+
include ActiveScaffold::Helpers::ListColumnHelpers
|
|
10
|
+
include ActiveScaffold::Helpers::ShowColumnHelpers
|
|
11
|
+
include ActiveScaffold::Helpers::FormColumnHelpers
|
|
12
|
+
include ActiveScaffold::Helpers::SearchColumnHelpers
|
|
13
|
+
include ActiveScaffold::Helpers::HumanConditionHelpers
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
## Delegates
|
|
17
|
+
##
|
|
18
|
+
|
|
19
|
+
# access to the configuration variable
|
|
20
|
+
def active_scaffold_config
|
|
21
|
+
controller.class.active_scaffold_config
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def active_scaffold_config_for(*args)
|
|
25
|
+
controller.class.active_scaffold_config_for(*args)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def active_scaffold_controller_for(*args)
|
|
29
|
+
controller.class.active_scaffold_controller_for(*args)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
## Uncategorized
|
|
34
|
+
##
|
|
35
|
+
|
|
36
|
+
def controller_path_for_activerecord(klass)
|
|
37
|
+
begin
|
|
38
|
+
controller = active_scaffold_controller_for(klass)
|
|
39
|
+
controller.controller_path
|
|
40
|
+
rescue ActiveScaffold::ControllerNotFound
|
|
41
|
+
controller = nil
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# This is the template finder logic, keep it updated with however we find stuff in rails
|
|
46
|
+
# currently this very similar to the logic in ActionBase::Base.render for options file
|
|
47
|
+
def template_exists?(template_name, partial = false)
|
|
48
|
+
lookup_context.exists? template_name, '', partial
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def generate_temporary_id
|
|
52
|
+
(Time.now.to_f*1000).to_i.to_s
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Turns [[label, value]] into <option> tags
|
|
56
|
+
# Takes optional parameter of :include_blank
|
|
57
|
+
def option_tags_for(select_options, options = {})
|
|
58
|
+
select_options.insert(0,[as_(:_select_),nil]) if options[:include_blank]
|
|
59
|
+
select_options.collect do |option|
|
|
60
|
+
label, value = option[0], option[1]
|
|
61
|
+
value.nil? ? "<option value="">#{label}</option>" : "<option value=\"#{value}\">#{label}</option>"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Should this column be displayed in the subform?
|
|
66
|
+
def in_subform?(column, parent_record)
|
|
67
|
+
# A column shouldn't be in the subform if it's the reverse association to the parent
|
|
68
|
+
not (column.association and column.association.associated_class == parent_record.class)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def form_remote_upload_tag(url_for_options = {}, options = {})
|
|
72
|
+
options[:target] = action_iframe_id(url_for_options)
|
|
73
|
+
options[:multipart] ||= true
|
|
74
|
+
options[:class] = "#{options[:class]} as_remote_upload".strip
|
|
75
|
+
output=""
|
|
76
|
+
output << form_tag(url_for_options, options)
|
|
77
|
+
(output << "<iframe id='#{action_iframe_id(url_for_options)}' name='#{action_iframe_id(url_for_options)}' style='display:none'></iframe>").html_safe
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# a general-use loading indicator (the "stuff is happening, please wait" feedback)
|
|
81
|
+
def loading_indicator_tag(options)
|
|
82
|
+
image_tag(active_scaffold_config.class.asset_path('indicator.gif'), :style => "visibility:hidden;", :id => loading_indicator_id(options), :alt => "loading indicator", :class => "loading-indicator")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Creates a javascript-based link that toggles the visibility of some element on the page.
|
|
86
|
+
# By default, it toggles the visibility of the sibling after the one it's nested in. You may pass custom javascript logic in options[:of] to change that, though. For example, you could say :of => '$("my_div_id")'.
|
|
87
|
+
# You may also flag whether the other element is visible by default or not, and the initial text will adjust accordingly.
|
|
88
|
+
def link_to_visibility_toggle(id, options = {})
|
|
89
|
+
options[:default_visible] = true if options[:default_visible].nil?
|
|
90
|
+
options[:hide_label] = as_(:hide)
|
|
91
|
+
options[:show_label] = as_(:show)
|
|
92
|
+
javascript_tag("ActiveScaffold.create_visibility_toggle('#{id}', #{options.to_json});")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def skip_action_link(link, *args)
|
|
96
|
+
(!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))
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def render_action_link(link, url_options, record = nil, html_options = {})
|
|
100
|
+
url_options = action_link_url_options(link, url_options, record)
|
|
101
|
+
html_options = action_link_html_options(link, url_options, record, html_options)
|
|
102
|
+
action_link_html(link, url_options, html_options, record)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def render_group_action_link(link, url_options, options, record = nil)
|
|
106
|
+
if link.type == :member && !options[:authorized]
|
|
107
|
+
action_link_html(link, nil, {:class => "disabled #{link.action}#{link.html_options[:class].blank? ? '' : (' ' + link.html_options[:class])}"}, record)
|
|
108
|
+
else
|
|
109
|
+
render_action_link(link, url_options, record)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def action_link_url_options(link, url_options, record, options = {})
|
|
114
|
+
url_options = url_options.clone
|
|
115
|
+
url_options[:action] = link.action
|
|
116
|
+
url_options[:controller] = link.controller.to_s if link.controller
|
|
117
|
+
url_options.delete(:search) if link.controller and link.controller.to_s != params[:controller]
|
|
118
|
+
url_options.merge! link.parameters if link.parameters
|
|
119
|
+
@link_record = record
|
|
120
|
+
url_options.merge! self.instance_eval(&(link.dynamic_parameters)) if link.dynamic_parameters.is_a?(Proc)
|
|
121
|
+
@link_record = nil
|
|
122
|
+
url_options_for_nested_link(link.column, record, link, url_options, options) if link.nested_link?
|
|
123
|
+
url_options_for_sti_link(link.column, record, link, url_options, options) unless record.nil? || active_scaffold_config.sti_children.nil?
|
|
124
|
+
url_options[:_method] = link.method if !link.confirm? && link.inline? && link.method != :get
|
|
125
|
+
url_options
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def action_link_html_options(link, url_options, record, html_options)
|
|
129
|
+
link_id = get_action_link_id(url_options, record, link.column)
|
|
130
|
+
html_options.reverse_merge! link.html_options.merge(:class => link.action.to_s)
|
|
131
|
+
|
|
132
|
+
# Needs to be in html_options to as the adding _method to the url is no longer supported by Rails
|
|
133
|
+
html_options[:method] = link.method if link.method != :get
|
|
134
|
+
|
|
135
|
+
html_options[:class] += ' as_action' if link.inline?
|
|
136
|
+
html_options[:data] = {}
|
|
137
|
+
html_options[:data][:confirm] = link.confirm(record.try(:to_label)) if link.confirm?
|
|
138
|
+
html_options[:data][:position] = link.position if link.position and link.inline?
|
|
139
|
+
html_options[:data][:action] = link.action if link.inline?
|
|
140
|
+
if link.popup?
|
|
141
|
+
html_options[:data][:popup] = true
|
|
142
|
+
html_options[:target] = '_blank'
|
|
143
|
+
end
|
|
144
|
+
html_options[:id] = link_id
|
|
145
|
+
html_options[:remote] = true unless link.page? || link.popup?
|
|
146
|
+
if link.dhtml_confirm?
|
|
147
|
+
html_options[:class] += ' as_action' if !link.inline?
|
|
148
|
+
html_options[:page_link] = 'true' if !link.inline?
|
|
149
|
+
html_options[:dhtml_confirm] = link.dhtml_confirm.value
|
|
150
|
+
html_options[:onclick] = link.dhtml_confirm.onclick_function(controller, link_id)
|
|
151
|
+
end
|
|
152
|
+
html_options[:class] += " #{link.html_options[:class]}" unless link.html_options[:class].blank?
|
|
153
|
+
html_options
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def get_action_link_id(url_options, record = nil, column = nil)
|
|
157
|
+
id = url_options[:id] || url_options[:parent_id]
|
|
158
|
+
id = "#{column.association[:name]}-#{record.id}" if column && column.plural_association?
|
|
159
|
+
if record.try(column.association[:name]).present?
|
|
160
|
+
id = "#{column.association[:name]}-#{record.send(column.association[:name]).id}-#{record.id}"
|
|
161
|
+
else
|
|
162
|
+
id = "#{column.association[:name]}-#{record.id}" unless record.nil?
|
|
163
|
+
end if column && column.singular_association?
|
|
164
|
+
id = "#{id}-#{url_options[:batch_scope].downcase}" if url_options[:batch_scope]
|
|
165
|
+
action_id = "#{id_from_controller(url_options[:controller]) + '-' if url_options[:parent_controller]}#{url_options[:action].to_s}"
|
|
166
|
+
action_link_id(action_id, id)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def action_link_html(link, url, html_options, record)
|
|
170
|
+
# issue 260, use url_options[:link] if it exists. This prevents DB data from being localized.
|
|
171
|
+
label = url.delete(:link) if url.is_a?(Hash)
|
|
172
|
+
label ||= link.label
|
|
173
|
+
if link.image.nil?
|
|
174
|
+
html = link_to(label, url, html_options)
|
|
175
|
+
else
|
|
176
|
+
html = link_to(image_tag(link.image[:name] , :size => link.image[:size], :alt => label), url, html_options)
|
|
177
|
+
end
|
|
178
|
+
# if url is nil we would like to generate an anchor without href attribute
|
|
179
|
+
url.nil? ? html.sub(/href=".*?"/, '').html_safe : html.html_safe
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def url_options_for_nested_link(column, record, link, url_options, options = {})
|
|
183
|
+
if column && column.association
|
|
184
|
+
url_options[column.association[:model].name.foreign_key.to_sym] = url_options.delete(:id)
|
|
185
|
+
url_options[:id] = record.send(column.association[:name]).id if column.singular_association? && record.send(column.association[:name]).present?
|
|
186
|
+
elsif link.parameters && link.parameters[:named_scope]
|
|
187
|
+
url_options[active_scaffold_config.model.name.foreign_key.to_sym] = url_options.delete(:id)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def url_options_for_sti_link(column, record, link, url_options, options = {})
|
|
192
|
+
#need to find out controller of current record type
|
|
193
|
+
#and set parameters
|
|
194
|
+
# its quite difficult to detect an sti link
|
|
195
|
+
# if link.column.nil? we are sure that it is nt an singular association inline autolink
|
|
196
|
+
# howver that will not work if a sti parent is an singular association inline autolink
|
|
197
|
+
if link.column.nil?
|
|
198
|
+
sti_controller_path = controller_path_for_activerecord(record.class)
|
|
199
|
+
if sti_controller_path
|
|
200
|
+
url_options[:controller] = sti_controller_path
|
|
201
|
+
url_options[:parent_sti] = controller_path
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def column_class(column, column_value, record)
|
|
207
|
+
classes = []
|
|
208
|
+
classes << "#{column.name}-column"
|
|
209
|
+
if column.css_class.is_a?(Proc)
|
|
210
|
+
css_class = column.css_class.call(column_value, record)
|
|
211
|
+
classes << css_class unless css_class.nil?
|
|
212
|
+
else
|
|
213
|
+
classes << column.css_class
|
|
214
|
+
end unless column.css_class.nil?
|
|
215
|
+
|
|
216
|
+
classes << 'empty' if column_empty? column_value
|
|
217
|
+
classes << 'sorted' if active_scaffold_config.list.user.sorting.sorts_on?(column)
|
|
218
|
+
classes << 'numeric' if column.number?
|
|
219
|
+
classes.join(' ').rstrip
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def column_heading_class(column, sorting)
|
|
223
|
+
classes = []
|
|
224
|
+
classes << "#{column.name}-column_heading"
|
|
225
|
+
classes << "sorted #{sorting.direction_of(column).downcase}" if sorting.sorts_on? column
|
|
226
|
+
classes << column.css_class unless column.css_class.nil? || column.css_class.is_a?(Proc)
|
|
227
|
+
classes.join(' ')
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def as_main_div_class
|
|
231
|
+
classes = ["active-scaffold", "active-scaffold-#{controller_id}", "#{id_from_controller params[:controller]}-view", "#{active_scaffold_config.theme}-theme"]
|
|
232
|
+
classes << "as_touch" if touch_device?
|
|
233
|
+
classes.join(' ')
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def column_empty?(column_value)
|
|
237
|
+
empty = column_value.nil?
|
|
238
|
+
empty ||= column_value.blank? if column_value.respond_to? :blank?
|
|
239
|
+
empty ||= [' ', active_scaffold_config.list.empty_field_text].include? column_value if String === column_value
|
|
240
|
+
return empty
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def column_calculation(column)
|
|
244
|
+
unless column.calculate.instance_of? Proc
|
|
245
|
+
conditions = controller.send(:all_conditions)
|
|
246
|
+
includes = active_scaffold_config.list.count_includes
|
|
247
|
+
includes ||= controller.send(:active_scaffold_includes) unless conditions.nil?
|
|
248
|
+
calculation = beginning_of_chain.calculate(column.calculate, column.name, :conditions => conditions,
|
|
249
|
+
:joins => controller.send(:joins_for_collection), :include => includes)
|
|
250
|
+
else
|
|
251
|
+
column.calculate.call(@records)
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def render_column_calculation(column)
|
|
256
|
+
calculation = column_calculation(column)
|
|
257
|
+
override_formatter = "render_#{column.name}_#{column.calculate.is_a?(Proc) ? :calculate : column.calculate}"
|
|
258
|
+
calculation = send(override_formatter, calculation) if respond_to? override_formatter
|
|
259
|
+
|
|
260
|
+
"#{"#{as_(column.calculate)}: " unless column.calculate.is_a? Proc}#{format_column_value nil, column, calculation}"
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def column_show_add_existing(column)
|
|
264
|
+
(column.allow_add_existing and options_for_association_count(column.association) > 0)
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def column_show_add_new(column, associated, record)
|
|
268
|
+
value = column.plural_association? || (column.singular_association? and associated.empty?)
|
|
269
|
+
value = false unless column.association.associated_class.authorized_for?(:crud_type => :create)
|
|
270
|
+
value
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def clean_column_name(name)
|
|
274
|
+
name.to_s.gsub('?', '')
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def clean_class_name(name)
|
|
278
|
+
name.underscore.gsub('/', '_')
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def active_scaffold_error_messages_for(*params)
|
|
282
|
+
options = params.extract_options!.symbolize_keys
|
|
283
|
+
options.reverse_merge!(:container_tag => :div, :list_type => :ul)
|
|
284
|
+
|
|
285
|
+
objects = Array.wrap(options.delete(:object) || params).map do |object|
|
|
286
|
+
object = instance_variable_get("@#{object}") unless object.respond_to?(:to_model)
|
|
287
|
+
object = convert_to_model(object)
|
|
288
|
+
|
|
289
|
+
if object.class.respond_to?(:model_name)
|
|
290
|
+
options[:object_name] ||= object.class.model_name.human.downcase
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
object
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
objects.compact!
|
|
297
|
+
count = objects.inject(0) {|sum, object| sum + object.errors.count }
|
|
298
|
+
|
|
299
|
+
unless count.zero?
|
|
300
|
+
html = {}
|
|
301
|
+
[:id, :class].each do |key|
|
|
302
|
+
if options.include?(key)
|
|
303
|
+
value = options[key]
|
|
304
|
+
html[key] = value unless value.blank?
|
|
305
|
+
else
|
|
306
|
+
html[key] = 'errorExplanation'
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
options[:object_name] ||= params.first
|
|
310
|
+
|
|
311
|
+
header_message = if options.include?(:header_message)
|
|
312
|
+
options[:header_message]
|
|
313
|
+
else
|
|
314
|
+
as_('errors.template.header', :count => count, :model => options[:object_name].to_s.gsub('_', ' '))
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
message = options.include?(:message) ? options[:message] : as_('errors.template.body')
|
|
318
|
+
|
|
319
|
+
error_messages = objects.sum do |object|
|
|
320
|
+
object.errors.full_messages.map do |msg|
|
|
321
|
+
options[:list_type] != :br ? content_tag(:li, msg) : msg
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
error_messages = if options[:list_type] == :br
|
|
325
|
+
error_messages.join('<br/>').html_safe
|
|
326
|
+
else
|
|
327
|
+
content_tag(options[:list_type], error_messages.join.html_safe)
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
contents = []
|
|
331
|
+
contents << content_tag(options[:header_tag] || :h2, header_message) unless header_message.blank?
|
|
332
|
+
contents << content_tag(:p, message) unless message.blank?
|
|
333
|
+
contents << error_messages
|
|
334
|
+
contents = contents.join.html_safe
|
|
335
|
+
options[:container_tag] ? content_tag(options[:container_tag], contents, html) : contents
|
|
336
|
+
else
|
|
337
|
+
''
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module ActiveScaffold
|
|
2
|
+
module MarkedModel
|
|
3
|
+
# This is a module aimed at making the make session_stored marked_records available to ActiveRecord models
|
|
4
|
+
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.extend ClassMethods
|
|
7
|
+
base.scope :marked, lambda {{:conditions => {:id => base.marked_records.to_a}}}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def marked
|
|
11
|
+
marked_records.include?(self.id)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def marked=(value)
|
|
15
|
+
value = [true, 'true', 1, '1', 'T', 't'].include?(value.class == String ? value.downcase : value)
|
|
16
|
+
if value == true
|
|
17
|
+
marked_records << self.id if !marked
|
|
18
|
+
else
|
|
19
|
+
marked_records.delete(self.id)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module ClassMethods
|
|
24
|
+
def marked_records
|
|
25
|
+
Thread.current[:marked_records] ||= Set.new
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def marked_records=(marked)
|
|
29
|
+
Thread.current[:marked_records] = marked
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Instance-level access to the marked_records
|
|
34
|
+
def marked_records
|
|
35
|
+
self.class.marked_records
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
class ActiveScaffold::Paginator
|
|
4
|
+
|
|
5
|
+
VERSION = '1.0.9'
|
|
6
|
+
|
|
7
|
+
class ArgumentError < ::ArgumentError; end
|
|
8
|
+
class MissingCountError < ArgumentError; end
|
|
9
|
+
class MissingSelectError < ArgumentError; end
|
|
10
|
+
|
|
11
|
+
attr_reader :per_page, :count
|
|
12
|
+
|
|
13
|
+
# Instantiate a new Paginator object
|
|
14
|
+
#
|
|
15
|
+
# Provide:
|
|
16
|
+
# * A total count of the number of objects to paginate
|
|
17
|
+
# * The number of objects in each page
|
|
18
|
+
# * A block that returns the array of items
|
|
19
|
+
# * The block is passed the item offset
|
|
20
|
+
# (and the number of items to show per page, for
|
|
21
|
+
# convenience, if the arity is 2)
|
|
22
|
+
def initialize(count, per_page, &select)
|
|
23
|
+
@count, @per_page = count, per_page
|
|
24
|
+
unless select
|
|
25
|
+
raise MissingSelectError, "Must provide block to select data for each page"
|
|
26
|
+
end
|
|
27
|
+
@select = select
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Total number of pages
|
|
31
|
+
def number_of_pages
|
|
32
|
+
(@count / @per_page).to_i + (@count % @per_page > 0 ? 1 : 0)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# First page object
|
|
36
|
+
def first
|
|
37
|
+
page 1
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Last page object
|
|
41
|
+
def last
|
|
42
|
+
page number_of_pages
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Iterate through pages
|
|
46
|
+
def each
|
|
47
|
+
each_with_index do |item, index|
|
|
48
|
+
yield item
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Iterate through pages with indices
|
|
53
|
+
def each_with_index
|
|
54
|
+
1.upto(number_of_pages) do |number|
|
|
55
|
+
yield(page(number), number - 1)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Retrieve page object by number
|
|
60
|
+
def page(number)
|
|
61
|
+
number = (n = number.to_i) > 0 ? n : 1
|
|
62
|
+
Page.new(self, number, lambda {
|
|
63
|
+
offset = (number - 1) * @per_page
|
|
64
|
+
args = [offset]
|
|
65
|
+
args << @per_page if @select.arity == 2
|
|
66
|
+
@select.call(*args)
|
|
67
|
+
})
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Page object
|
|
71
|
+
#
|
|
72
|
+
# Retrieves items for a page and provides metadata about the position
|
|
73
|
+
# of the page in the paginator
|
|
74
|
+
class Page
|
|
75
|
+
|
|
76
|
+
extend Forwardable
|
|
77
|
+
def_delegator :@pager, :first, :first
|
|
78
|
+
def_delegator :@pager, :last, :last
|
|
79
|
+
def_delegator :items, :each
|
|
80
|
+
def_delegator :items, :each_with_index
|
|
81
|
+
|
|
82
|
+
attr_reader :number, :pager
|
|
83
|
+
|
|
84
|
+
def initialize(pager, number, select) #:nodoc:
|
|
85
|
+
@pager, @number = pager, number
|
|
86
|
+
@offset = (number - 1) * pager.per_page
|
|
87
|
+
@select = select
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Retrieve the items for this page
|
|
91
|
+
# * Caches
|
|
92
|
+
def items
|
|
93
|
+
@items ||= @select.call
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Checks to see if there's a page before this one
|
|
97
|
+
def prev?
|
|
98
|
+
@number > 1
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Get previous page (if possible)
|
|
102
|
+
def prev
|
|
103
|
+
@pager.page(@number - 1) if prev?
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Checks to see if there's a page after this one
|
|
107
|
+
def next?
|
|
108
|
+
@number < @pager.number_of_pages
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Get next page (if possible)
|
|
112
|
+
def next
|
|
113
|
+
@pager.page(@number + 1) if next?
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# The "item number" of the first item on this page
|
|
117
|
+
def first_item_number
|
|
118
|
+
1 + @offset
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# The "item number" of the last item on this page
|
|
122
|
+
def last_item_number
|
|
123
|
+
if next?
|
|
124
|
+
@offset + @pager.per_page
|
|
125
|
+
else
|
|
126
|
+
@pager.count
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def ==(other) #:nodoc:
|
|
131
|
+
@pager == other.pager && self.number == other.number
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Copyright (c) 2006 Sean Treadway
|
|
2
|
+
#
|
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
# a copy of this software and associated documentation files (the
|
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
# the following conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be
|
|
12
|
+
# included in all copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Module containing the methods useful for child IFRAME to parent window communication
|
|
24
|
+
module ActiveScaffold::RespondsToParent
|
|
25
|
+
|
|
26
|
+
# Executes the response body as JavaScript in the context of the parent window.
|
|
27
|
+
# Use this method of you are posting a form to a hidden IFRAME or if you would like
|
|
28
|
+
# to use IFRAME base RPC.
|
|
29
|
+
def responds_to_parent(&block)
|
|
30
|
+
yield
|
|
31
|
+
|
|
32
|
+
if performed?
|
|
33
|
+
# We're returning HTML instead of JS or XML now
|
|
34
|
+
response.headers['Content-Type'] = 'text/html; charset=UTF-8'
|
|
35
|
+
|
|
36
|
+
# Either pull out a redirect or the request body
|
|
37
|
+
script = if response.headers['Location']
|
|
38
|
+
#TODO: erase_redirect_results is missing in rails 3.0 has to be implemented
|
|
39
|
+
#erase redirect
|
|
40
|
+
"document.location.href = #{location.to_s.inspect}"
|
|
41
|
+
else
|
|
42
|
+
response.body
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Escape quotes, linebreaks and slashes, maintaining previously escaped slashes
|
|
46
|
+
# Suggestions for improvement?
|
|
47
|
+
script = (script || '').
|
|
48
|
+
gsub('\\', '\\\\\\').
|
|
49
|
+
gsub(/\r\n|\r|\n/, '\\n').
|
|
50
|
+
gsub(/['"]/, '\\\\\&').
|
|
51
|
+
gsub('</script>','</scr"+"ipt>')
|
|
52
|
+
|
|
53
|
+
# Clear out the previous render to prevent double render
|
|
54
|
+
response.request.env['action_controller.instance'].instance_variable_set(:@_response_body, nil)
|
|
55
|
+
|
|
56
|
+
# Eval in parent scope and replace document location of this frame
|
|
57
|
+
# so back button doesn't replay action on targeted forms
|
|
58
|
+
# loc = document.location to be set after parent is updated for IE
|
|
59
|
+
# with(window.parent) - pull in variables from parent window
|
|
60
|
+
# setTimeout - scope the execution in the windows parent for safari
|
|
61
|
+
# window.eval - legal eval for Opera
|
|
62
|
+
render :text => "<html><body><script type='text/javascript' charset='utf-8'>
|
|
63
|
+
var loc = document.location;
|
|
64
|
+
with(window.parent) { setTimeout(function() { window.eval('#{script}'); if (typeof(loc) !== 'undefined') loc.replace('about:blank'); }, 1) };
|
|
65
|
+
</script></body></html>".html_safe
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
alias respond_to_parent responds_to_parent
|
|
69
|
+
end
|
|
70
|
+
|