obitum-rails_admin 0.0.1
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/Gemfile +57 -0
- data/LICENSE.md +20 -0
- data/README.md +206 -0
- data/Rakefile +14 -0
- data/app/assets/images/rails_admin/aristo/images/bg_fallback.png +0 -0
- data/app/assets/images/rails_admin/aristo/images/icon_sprite.png +0 -0
- data/app/assets/images/rails_admin/aristo/images/progress_bar.gif +0 -0
- data/app/assets/images/rails_admin/aristo/images/slider_handles.png +0 -0
- data/app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
- data/app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
- data/app/assets/images/rails_admin/bullet_black.png +0 -0
- data/app/assets/images/rails_admin/bullet_white.png +0 -0
- data/app/assets/images/rails_admin/calendar.png +0 -0
- data/app/assets/images/rails_admin/clock.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
- data/app/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/select.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/select2.png +0 -0
- data/app/assets/images/rails_admin/colorpicker/slider.png +0 -0
- data/app/assets/images/rails_admin/logo.png +0 -0
- data/app/assets/images/rails_admin/magnifier.png +0 -0
- data/app/assets/images/rails_admin/multiselect/icon_sprite.png +0 -0
- data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png +0 -0
- data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-light.png +0 -0
- data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png +0 -0
- data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png +0 -0
- data/app/assets/javascripts/rails_admin/custom/ui.js +12 -0
- data/app/assets/javascripts/rails_admin/jquery-ui-1.8.16.custom.js +5271 -0
- data/app/assets/javascripts/rails_admin/jquery.colorpicker.js +484 -0
- data/app/assets/javascripts/rails_admin/jquery.pjax.js +266 -0
- data/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js +1219 -0
- data/app/assets/javascripts/rails_admin/jquery_nested_form.js +58 -0
- data/app/assets/javascripts/rails_admin/ra.datetimepicker.js +67 -0
- data/app/assets/javascripts/rails_admin/ra.filter-box.js +120 -0
- data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +280 -0
- data/app/assets/javascripts/rails_admin/ra.filtering-select.js +181 -0
- data/app/assets/javascripts/rails_admin/ra.remote-form.js +148 -0
- data/app/assets/javascripts/rails_admin/rails_admin.js.erb +19 -0
- data/app/assets/javascripts/rails_admin/themes/default/ui.js +12 -0
- data/app/assets/javascripts/rails_admin/ui.js.coffee +33 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/icon_sprite.png +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/progress_bar.gif +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
- data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.css.scss +733 -0
- data/app/assets/stylesheets/rails_admin/base/README +2 -0
- data/app/assets/stylesheets/rails_admin/base/mixins.css.scss +1 -0
- data/app/assets/stylesheets/rails_admin/base/theming.css.scss +145 -0
- data/app/assets/stylesheets/rails_admin/base/variables.css.scss +1 -0
- data/app/assets/stylesheets/rails_admin/custom/mixins.css.scss +12 -0
- data/app/assets/stylesheets/rails_admin/custom/theming.css.scss +13 -0
- data/app/assets/stylesheets/rails_admin/custom/variables.css.scss +15 -0
- data/app/assets/stylesheets/rails_admin/imports.css.scss.erb +41 -0
- data/app/assets/stylesheets/rails_admin/jquery.colorpicker.css.scss +180 -0
- data/app/assets/stylesheets/rails_admin/jquery.ui.timepicker.css.scss +53 -0
- data/app/assets/stylesheets/rails_admin/ra.calendar-additions.css.scss +25 -0
- data/app/assets/stylesheets/rails_admin/ra.filtering-multiselect.css.scss +85 -0
- data/app/assets/stylesheets/rails_admin/rails_admin.css +4 -0
- data/app/assets/stylesheets/rails_admin/themes/default/mixins.css.scss +8 -0
- data/app/assets/stylesheets/rails_admin/themes/default/theming.css.scss +11 -0
- data/app/assets/stylesheets/rails_admin/themes/default/variables.css.scss +12 -0
- data/app/controllers/rails_admin/application_controller.rb +87 -0
- data/app/controllers/rails_admin/main_controller.rb +148 -0
- data/app/helpers/rails_admin/application_helper.rb +97 -0
- data/app/helpers/rails_admin/form_builder.rb +106 -0
- data/app/helpers/rails_admin/main_helper.rb +36 -0
- data/app/views/kaminari/twitter-bootstrap/_gap.html.haml +2 -0
- data/app/views/kaminari/twitter-bootstrap/_next_page.html.haml +4 -0
- data/app/views/kaminari/twitter-bootstrap/_page.html.haml +4 -0
- data/app/views/kaminari/twitter-bootstrap/_paginator.html.haml +10 -0
- data/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml +4 -0
- data/app/views/layouts/rails_admin/_navigation.html.haml +17 -0
- data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +11 -0
- data/app/views/layouts/rails_admin/application.html.haml +39 -0
- data/app/views/rails_admin/main/_dashboard_history.html.haml +10 -0
- data/app/views/rails_admin/main/_delete_notice.html.haml +19 -0
- data/app/views/rails_admin/main/_form_colorpicker.html.haml +23 -0
- data/app/views/rails_admin/main/_form_datetime.html.haml +4 -0
- data/app/views/rails_admin/main/_form_enumeration.html.haml +4 -0
- data/app/views/rails_admin/main/_form_field.html.haml +1 -0
- data/app/views/rails_admin/main/_form_file_upload.html.haml +17 -0
- data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +57 -0
- data/app/views/rails_admin/main/_form_filtering_select.html.haml +46 -0
- data/app/views/rails_admin/main/_form_nested_many.html.haml +6 -0
- data/app/views/rails_admin/main/_form_nested_one.html.haml +6 -0
- data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +34 -0
- data/app/views/rails_admin/main/_form_text.html.haml +9 -0
- data/app/views/rails_admin/main/_submit_buttons.html.haml +13 -0
- data/app/views/rails_admin/main/bulk_delete.html.haml +7 -0
- data/app/views/rails_admin/main/dashboard.html.haml +31 -0
- data/app/views/rails_admin/main/delete.html.haml +14 -0
- data/app/views/rails_admin/main/edit.html.haml +2 -0
- data/app/views/rails_admin/main/export.html.haml +71 -0
- data/app/views/rails_admin/main/history.html.haml +42 -0
- data/app/views/rails_admin/main/index.html.haml +123 -0
- data/app/views/rails_admin/main/new.html.haml +2 -0
- data/app/views/rails_admin/main/show.html.haml +14 -0
- data/config/initializers/active_record_extensions.rb +19 -0
- data/config/initializers/devise_patch.rb +9 -0
- data/config/initializers/haml.rb +3 -0
- data/config/locales/rails_admin.en.yml +129 -0
- data/config/routes.rb +12 -0
- data/lib/generators/rails_admin/install_generator.rb +84 -0
- data/lib/generators/rails_admin/templates/drop.rb +18 -0
- data/lib/generators/rails_admin/templates/initializer.erb +101 -0
- data/lib/generators/rails_admin/templates/migration.rb +18 -0
- data/lib/generators/rails_admin/uninstall_generator.rb +22 -0
- data/lib/generators/rails_admin/utils.rb +30 -0
- data/lib/rails_admin.rb +39 -0
- data/lib/rails_admin/abstract_model.rb +73 -0
- data/lib/rails_admin/abstract_object.rb +28 -0
- data/lib/rails_admin/adapters/active_record.rb +347 -0
- data/lib/rails_admin/config.rb +293 -0
- data/lib/rails_admin/config/actions.rb +121 -0
- data/lib/rails_admin/config/actions/base.rb +105 -0
- data/lib/rails_admin/config/actions/bulk_delete.rb +56 -0
- data/lib/rails_admin/config/actions/dashboard.rb +40 -0
- data/lib/rails_admin/config/actions/delete.rb +50 -0
- data/lib/rails_admin/config/actions/edit.rb +52 -0
- data/lib/rails_admin/config/actions/export.rb +37 -0
- data/lib/rails_admin/config/actions/history_index.rb +34 -0
- data/lib/rails_admin/config/actions/history_show.rb +34 -0
- data/lib/rails_admin/config/actions/index.rb +73 -0
- data/lib/rails_admin/config/actions/new.rb +60 -0
- data/lib/rails_admin/config/actions/show.rb +27 -0
- data/lib/rails_admin/config/actions/show_in_app.rb +23 -0
- data/lib/rails_admin/config/base.rb +111 -0
- data/lib/rails_admin/config/fields.rb +97 -0
- data/lib/rails_admin/config/fields/association.rb +115 -0
- data/lib/rails_admin/config/fields/base.rb +274 -0
- data/lib/rails_admin/config/fields/factories/carrierwave.rb +12 -0
- data/lib/rails_admin/config/fields/factories/devise.rb +30 -0
- data/lib/rails_admin/config/fields/factories/dragonfly.rb +21 -0
- data/lib/rails_admin/config/fields/factories/enum.rb +11 -0
- data/lib/rails_admin/config/fields/factories/paperclip.rb +27 -0
- data/lib/rails_admin/config/fields/factories/password.rb +17 -0
- data/lib/rails_admin/config/fields/group.rb +65 -0
- data/lib/rails_admin/config/fields/groupable.rb +25 -0
- data/lib/rails_admin/config/fields/types.rb +26 -0
- data/lib/rails_admin/config/fields/types/all.rb +23 -0
- data/lib/rails_admin/config/fields/types/belongs_to_association.rb +43 -0
- data/lib/rails_admin/config/fields/types/boolean.rb +29 -0
- data/lib/rails_admin/config/fields/types/carrierwave.rb +40 -0
- data/lib/rails_admin/config/fields/types/color.rb +37 -0
- data/lib/rails_admin/config/fields/types/date.rb +24 -0
- data/lib/rails_admin/config/fields/types/datetime.rb +165 -0
- data/lib/rails_admin/config/fields/types/decimal.rb +14 -0
- data/lib/rails_admin/config/fields/types/dragonfly.rb +59 -0
- data/lib/rails_admin/config/fields/types/enum.rb +35 -0
- data/lib/rails_admin/config/fields/types/file_upload.rb +65 -0
- data/lib/rails_admin/config/fields/types/float.rb +14 -0
- data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +14 -0
- data/lib/rails_admin/config/fields/types/has_many_association.rb +37 -0
- data/lib/rails_admin/config/fields/types/has_one_association.rb +35 -0
- data/lib/rails_admin/config/fields/types/hidden.rb +19 -0
- data/lib/rails_admin/config/fields/types/integer.rb +20 -0
- data/lib/rails_admin/config/fields/types/paperclip.rb +46 -0
- data/lib/rails_admin/config/fields/types/password.rb +42 -0
- data/lib/rails_admin/config/fields/types/polymorphic_association.rb +76 -0
- data/lib/rails_admin/config/fields/types/string.rb +43 -0
- data/lib/rails_admin/config/fields/types/text.rb +38 -0
- data/lib/rails_admin/config/fields/types/time.rb +36 -0
- data/lib/rails_admin/config/fields/types/timestamp.rb +18 -0
- data/lib/rails_admin/config/has_fields.rb +135 -0
- data/lib/rails_admin/config/has_groups.rb +23 -0
- data/lib/rails_admin/config/hideable.rb +28 -0
- data/lib/rails_admin/config/model.rb +82 -0
- data/lib/rails_admin/config/proxy.rb +40 -0
- data/lib/rails_admin/config/sections.rb +38 -0
- data/lib/rails_admin/config/sections/base.rb +19 -0
- data/lib/rails_admin/config/sections/create.rb +11 -0
- data/lib/rails_admin/config/sections/edit.rb +11 -0
- data/lib/rails_admin/config/sections/export.rb +11 -0
- data/lib/rails_admin/config/sections/list.rb +27 -0
- data/lib/rails_admin/config/sections/nested.rb +10 -0
- data/lib/rails_admin/config/sections/show.rb +10 -0
- data/lib/rails_admin/config/sections/update.rb +10 -0
- data/lib/rails_admin/engine.rb +21 -0
- data/lib/rails_admin/extension.rb +29 -0
- data/lib/rails_admin/extensions/cancan.rb +5 -0
- data/lib/rails_admin/extensions/cancan/authorization_adapter.rb +59 -0
- data/lib/rails_admin/extensions/history.rb +5 -0
- data/lib/rails_admin/extensions/history/auditing_adapter.rb +37 -0
- data/lib/rails_admin/extensions/history/history.rb +68 -0
- data/lib/rails_admin/extensions/paper_trail.rb +5 -0
- data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +92 -0
- data/lib/rails_admin/generic_support.rb +18 -0
- data/lib/rails_admin/i18n_support.rb +43 -0
- data/lib/rails_admin/support/core_extensions.rb +44 -0
- data/lib/rails_admin/support/csv_converter.rb +109 -0
- data/lib/rails_admin/version.rb +6 -0
- data/lib/tasks/prepare_ci_env.rake +27 -0
- data/lib/tasks/rails_admin.rake +18 -0
- data/spec/ci.sh +2 -0
- data/spec/controllers/application_controller_spec.rb +30 -0
- data/spec/controllers/main_controller_spec.rb +114 -0
- data/spec/database_helpers.rb +15 -0
- data/spec/dummy_app/Gemfile +53 -0
- data/spec/dummy_app/Rakefile +7 -0
- data/spec/dummy_app/app/controllers/application_controller.rb +3 -0
- data/spec/dummy_app/app/controllers/players_controller.rb +5 -0
- data/spec/dummy_app/app/helpers/application_helper.rb +2 -0
- data/spec/dummy_app/app/locales/models.en.yml +16 -0
- data/spec/dummy_app/app/models/abstract.rb +5 -0
- data/spec/dummy_app/app/models/ball.rb +8 -0
- data/spec/dummy_app/app/models/category.rb +3 -0
- data/spec/dummy_app/app/models/cms.rb +5 -0
- data/spec/dummy_app/app/models/cms/basic_page.rb +7 -0
- data/spec/dummy_app/app/models/cms/unscoped_page.rb +3 -0
- data/spec/dummy_app/app/models/comment.rb +3 -0
- data/spec/dummy_app/app/models/division.rb +8 -0
- data/spec/dummy_app/app/models/draft.rb +11 -0
- data/spec/dummy_app/app/models/fan.rb +5 -0
- data/spec/dummy_app/app/models/field_test.rb +20 -0
- data/spec/dummy_app/app/models/hardball.rb +2 -0
- data/spec/dummy_app/app/models/league.rb +10 -0
- data/spec/dummy_app/app/models/nested_field_test.rb +3 -0
- data/spec/dummy_app/app/models/player.rb +23 -0
- data/spec/dummy_app/app/models/rel_test.rb +6 -0
- data/spec/dummy_app/app/models/team.rb +25 -0
- data/spec/dummy_app/app/models/user.rb +21 -0
- data/spec/dummy_app/app/uploaders/carrierwave_uploader.rb +53 -0
- data/spec/dummy_app/app/views/layouts/application.html.erb +13 -0
- data/spec/dummy_app/app/views/players/show.html.haml +1 -0
- data/spec/dummy_app/config.ru +4 -0
- data/spec/dummy_app/config/application.rb +47 -0
- data/spec/dummy_app/config/boot.rb +6 -0
- data/spec/dummy_app/config/database.yml +22 -0
- data/spec/dummy_app/config/environment.rb +5 -0
- data/spec/dummy_app/config/environments/development.rb +27 -0
- data/spec/dummy_app/config/environments/production.rb +51 -0
- data/spec/dummy_app/config/environments/test.rb +39 -0
- data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy_app/config/initializers/devise.rb +142 -0
- data/spec/dummy_app/config/initializers/inflections.rb +10 -0
- data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
- data/spec/dummy_app/config/initializers/quiet_assets.rb +10 -0
- data/spec/dummy_app/config/initializers/rails_admin.rb +11 -0
- data/spec/dummy_app/config/initializers/secret_token.rb +7 -0
- data/spec/dummy_app/config/initializers/session_store.rb +8 -0
- data/spec/dummy_app/config/routes.rb +10 -0
- data/spec/dummy_app/db/migrate/00000000000001_create_divisions_migration.rb +13 -0
- data/spec/dummy_app/db/migrate/00000000000002_create_drafts_migration.rb +19 -0
- data/spec/dummy_app/db/migrate/00000000000003_create_leagues_migration.rb +12 -0
- data/spec/dummy_app/db/migrate/00000000000004_create_players_migration.rb +20 -0
- data/spec/dummy_app/db/migrate/00000000000005_create_teams_migration.rb +22 -0
- data/spec/dummy_app/db/migrate/00000000000006_devise_create_users.rb +19 -0
- data/spec/dummy_app/db/migrate/00000000000007_create_histories_table.rb +16 -0
- data/spec/dummy_app/db/migrate/00000000000008_create_fans_migration.rb +12 -0
- data/spec/dummy_app/db/migrate/00000000000009_create_fans_teams_migration.rb +11 -0
- data/spec/dummy_app/db/migrate/00000000000010_add_revenue_to_team_migration.rb +9 -0
- data/spec/dummy_app/db/migrate/00000000000011_add_suspended_to_player_migration.rb +9 -0
- data/spec/dummy_app/db/migrate/00000000000012_add_avatar_columns_to_user.rb +16 -0
- data/spec/dummy_app/db/migrate/00000000000013_add_roles_to_user.rb +9 -0
- data/spec/dummy_app/db/migrate/00000000000014_add_color_to_team_migration.rb +9 -0
- data/spec/dummy_app/db/migrate/20101223222233_create_rel_tests.rb +15 -0
- data/spec/dummy_app/db/migrate/20110103205808_create_comments.rb +15 -0
- data/spec/dummy_app/db/migrate/20110123042530_rename_histories_to_rails_admin_histories.rb +9 -0
- data/spec/dummy_app/db/migrate/20110224184303_create_field_tests.rb +22 -0
- data/spec/dummy_app/db/migrate/20110328193014_create_cms_basic_pages.rb +14 -0
- data/spec/dummy_app/db/migrate/20110329183136_remove_league_id_from_teams.rb +9 -0
- data/spec/dummy_app/db/migrate/20110607152842_add_format_to_field_test.rb +9 -0
- data/spec/dummy_app/db/migrate/20110714095433_create_balls.rb +12 -0
- data/spec/dummy_app/db/migrate/20110831090841_add_protected_field_and_restricted_field_to_field_tests.rb +6 -0
- data/spec/dummy_app/db/migrate/20110901131551_change_division_primary_key.rb +19 -0
- data/spec/dummy_app/db/migrate/20110901142530_rename_league_id_foreign_key_on_divisions.rb +5 -0
- data/spec/dummy_app/db/migrate/20110901150912_set_primary_key_not_null_for_divisions.rb +21 -0
- data/spec/dummy_app/db/migrate/20110901154834_change_length_for_rails_admin_histories.rb +9 -0
- data/spec/dummy_app/db/migrate/20111103174459_create_unscoped_pages.rb +9 -0
- data/spec/dummy_app/db/migrate/20111108143642_add_dragonfly_and_carrierwave_to_field_tests.rb +7 -0
- data/spec/dummy_app/db/migrate/20111115041025_add_type_to_balls.rb +5 -0
- data/spec/dummy_app/db/migrate/20111123092549_create_nested_field_tests.rb +10 -0
- data/spec/dummy_app/db/migrate/20111130075338_add_dragonfly_asset_name_to_field_tests.rb +5 -0
- data/spec/dummy_app/db/migrate/20111215083258_create_foo_bars.rb +8 -0
- data/spec/dummy_app/db/migrate/20120117151733_add_custom_field_to_teams.rb +5 -0
- data/spec/dummy_app/db/migrate/20120118122004_add_categories.rb +7 -0
- data/spec/dummy_app/db/seeds.rb +18 -0
- data/spec/dummy_app/foo/Gemfile +17 -0
- data/spec/dummy_app/foo/MIT-LICENSE +20 -0
- data/spec/dummy_app/foo/README.rdoc +3 -0
- data/spec/dummy_app/foo/Rakefile +39 -0
- data/spec/dummy_app/foo/app/assets/javascripts/foo/application.js +9 -0
- data/spec/dummy_app/foo/app/assets/stylesheets/foo/application.css +7 -0
- data/spec/dummy_app/foo/app/controllers/foo/application_controller.rb +4 -0
- data/spec/dummy_app/foo/app/helpers/foo/application_helper.rb +4 -0
- data/spec/dummy_app/foo/app/models/foo/bar.rb +4 -0
- data/spec/dummy_app/foo/app/views/layouts/foo/application.html.erb +14 -0
- data/spec/dummy_app/foo/config/routes.rb +2 -0
- data/spec/dummy_app/foo/foo.gemspec +23 -0
- data/spec/dummy_app/foo/lib/foo.rb +4 -0
- data/spec/dummy_app/foo/lib/foo/engine.rb +5 -0
- data/spec/dummy_app/foo/lib/foo/version.rb +3 -0
- data/spec/dummy_app/foo/lib/tasks/foo_tasks.rake +4 -0
- data/spec/dummy_app/foo/script/rails +6 -0
- data/spec/dummy_app/foo/test/dummy/Rakefile +7 -0
- data/spec/dummy_app/foo/test/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy_app/foo/test/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy_app/foo/test/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy_app/foo/test/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy_app/foo/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy_app/foo/test/dummy/config.ru +4 -0
- data/spec/dummy_app/foo/test/dummy/config/application.rb +45 -0
- data/spec/dummy_app/foo/test/dummy/config/boot.rb +10 -0
- data/spec/dummy_app/foo/test/dummy/config/database.yml +25 -0
- data/spec/dummy_app/foo/test/dummy/config/environment.rb +5 -0
- data/spec/dummy_app/foo/test/dummy/config/environments/development.rb +30 -0
- data/spec/dummy_app/foo/test/dummy/config/environments/production.rb +60 -0
- data/spec/dummy_app/foo/test/dummy/config/environments/test.rb +39 -0
- data/spec/dummy_app/foo/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy_app/foo/test/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy_app/foo/test/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy_app/foo/test/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy_app/foo/test/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy_app/foo/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy_app/foo/test/dummy/config/locales/en.yml +5 -0
- data/spec/dummy_app/foo/test/dummy/config/routes.rb +4 -0
- data/spec/dummy_app/foo/test/dummy/db/schema.rb +21 -0
- data/spec/dummy_app/foo/test/dummy/public/404.html +26 -0
- data/spec/dummy_app/foo/test/dummy/public/422.html +26 -0
- data/spec/dummy_app/foo/test/dummy/public/500.html +26 -0
- data/spec/dummy_app/foo/test/dummy/public/favicon.ico +0 -0
- data/spec/dummy_app/foo/test/dummy/script/rails +6 -0
- data/spec/dummy_app/foo/test/fixtures/foo/bars.yml +11 -0
- data/spec/dummy_app/foo/test/foo_test.rb +7 -0
- data/spec/dummy_app/foo/test/integration/navigation_test.rb +10 -0
- data/spec/dummy_app/foo/test/test_helper.rb +10 -0
- data/spec/dummy_app/foo/test/unit/foo/bar_test.rb +9 -0
- data/spec/dummy_app/public/404.html +0 -0
- data/spec/dummy_app/public/favicon.ico +0 -0
- data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg +0 -0
- data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg.meta +1 -0
- data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg +0 -0
- data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg.meta +1 -0
- data/spec/dummy_app/public/system/paperclip_assets/1/original/Boston City Flow.jpg +0 -0
- data/spec/dummy_app/public/system/paperclip_assets/1/thumb/Boston City Flow.jpg +0 -0
- data/spec/dummy_app/public/system/paperclip_assets/3/original/Costa Rican Frog.jpg +0 -0
- data/spec/dummy_app/public/system/paperclip_assets/3/thumb/Costa Rican Frog.jpg +0 -0
- data/spec/dummy_app/public/system/paperclip_assets/6/original/liste-electorale.pdf +0 -0
- data/spec/dummy_app/public/system/paperclip_assets/6/thumb/liste-electorale.pdf +148 -0
- data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/Boston_City_Flow.jpg +0 -0
- data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/thumb_Boston_City_Flow.jpg +0 -0
- data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/Costa_Rican_Frog.jpg +0 -0
- data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/thumb_Costa_Rican_Frog.jpg +0 -0
- data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/Pensive_Parakeet.jpg +0 -0
- data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/thumb_Pensive_Parakeet.jpg +0 -0
- data/spec/dummy_app/script/rails +6 -0
- data/spec/factories.rb +66 -0
- data/spec/generator_helpers.rb +30 -0
- data/spec/generators/install_generator_spec.rb +85 -0
- data/spec/generators/uninstall_generator_spec.rb +35 -0
- data/spec/helpers/application_helper_spec.rb +212 -0
- data/spec/lib/abstract_object_spec.rb +119 -0
- data/spec/lib/custom_field.rb +7 -0
- data/spec/lib/rails_admin_spec.rb +301 -0
- data/spec/requests/actions.rb +161 -0
- data/spec/requests/authorization/cancan_spec.rb +350 -0
- data/spec/requests/basic/bulk_action/rails_admin_basic_bulk_action_spec.rb +25 -0
- data/spec/requests/basic/bulk_destroy/rails_admin_basic_bulk_destroy_spec.rb +57 -0
- data/spec/requests/basic/create/rails_admin_basic_create_spec.rb +143 -0
- data/spec/requests/basic/create/rails_admin_namespaced_model_create_spec.rb +39 -0
- data/spec/requests/basic/delete/rails_admin_basic_delete_spec.rb +27 -0
- data/spec/requests/basic/destroy/rails_admin_basic_destroy_spec.rb +56 -0
- data/spec/requests/basic/edit/rails_admin_basic_edit_spec.rb +109 -0
- data/spec/requests/basic/export/rails_admin_basic_export_spec.rb +87 -0
- data/spec/requests/basic/list/rails_admin_basic_list_spec.rb +417 -0
- data/spec/requests/basic/new/rails_admin_basic_new_spec.rb +74 -0
- data/spec/requests/basic/new/rails_admin_namespaced_model_new_spec.rb +31 -0
- data/spec/requests/basic/show/rails_admin_basic_show_spec.rb +92 -0
- data/spec/requests/basic/update/rails_admin_basic_update_spec.rb +191 -0
- data/spec/requests/config/edit/rails_admin_config_edit_spec.rb +913 -0
- data/spec/requests/config/list/rails_admin_config_list_spec.rb +509 -0
- data/spec/requests/config/navigation/rails_admin_config_navigation_spec.rb +107 -0
- data/spec/requests/config/rails_admin_config_spec.rb +227 -0
- data/spec/requests/config/show/rails_admin_config_show_spec.rb +282 -0
- data/spec/requests/history/rails_admin_history_spec.rb +66 -0
- data/spec/requests/rails_admin_spec.rb +146 -0
- data/spec/requests/relation_spec.rb +26 -0
- data/spec/spec_helper.rb +91 -0
- metadata +967 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module RailsAdmin
|
|
2
|
+
module Config
|
|
3
|
+
module Actions
|
|
4
|
+
class Show < RailsAdmin::Config::Actions::Base
|
|
5
|
+
RailsAdmin::Config::Actions.register(self)
|
|
6
|
+
|
|
7
|
+
register_instance_option :member do
|
|
8
|
+
true
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
register_instance_option :route_fragment do
|
|
12
|
+
''
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
register_instance_option :breadcrumb_parent do
|
|
16
|
+
:index
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
register_instance_option :controller do
|
|
20
|
+
Proc.new do
|
|
21
|
+
render @action.template_name
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module RailsAdmin
|
|
2
|
+
module Config
|
|
3
|
+
module Actions
|
|
4
|
+
class ShowInApp < RailsAdmin::Config::Actions::Base
|
|
5
|
+
RailsAdmin::Config::Actions.register(self)
|
|
6
|
+
|
|
7
|
+
register_instance_option :member do
|
|
8
|
+
true
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
register_instance_option :visible? do
|
|
12
|
+
bindings[:controller].main_app.url_for(bindings[:object]) rescue false
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
register_instance_option :controller do
|
|
16
|
+
Proc.new do
|
|
17
|
+
redirect_to main_app.url_for(@object)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require 'rails_admin/config/proxy'
|
|
2
|
+
|
|
3
|
+
module RailsAdmin
|
|
4
|
+
module Config
|
|
5
|
+
# A base class for all configurables.
|
|
6
|
+
#
|
|
7
|
+
# Each configurable has a parent object. This parent object must provide
|
|
8
|
+
# the configurable with abstract_model and bindings.
|
|
9
|
+
#
|
|
10
|
+
# Bindings is a hash of variables bound by the querying context. For
|
|
11
|
+
# example the list view's template will bind an object to key
|
|
12
|
+
# :object for each row it outputs. This object is the actual row object
|
|
13
|
+
# which is then used as the receiver of queries for property values.
|
|
14
|
+
#
|
|
15
|
+
# @see RailsAdmin::AbstractModel
|
|
16
|
+
# @see RailsAdmin::Config::Model#abstract_model
|
|
17
|
+
class Base
|
|
18
|
+
attr_reader :abstract_model, :bindings, :parent, :root
|
|
19
|
+
|
|
20
|
+
def initialize(parent = nil)
|
|
21
|
+
@abstract_model = parent && parent.abstract_model
|
|
22
|
+
@bindings = {}
|
|
23
|
+
@parent = parent
|
|
24
|
+
@root = parent && parent.root
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def has_option?(name)
|
|
28
|
+
options = self.class.instance_variable_get("@config_options")
|
|
29
|
+
options && options.has_key?(name)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Register an instance option for this object only
|
|
33
|
+
def register_instance_option(option_name, &default)
|
|
34
|
+
scope = class << self; self; end;
|
|
35
|
+
self.class.register_instance_option(option_name, scope, &default)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def register_deprecated_instance_option(option_name, replacement_option_name)
|
|
39
|
+
scope = class << self; self; end;
|
|
40
|
+
self.class.register_deprecated_instance_option(option_name, replacement_option_name, scope)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def with(bindings = {})
|
|
44
|
+
RailsAdmin::Config::Proxy.new(self, bindings)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Register an instance option. Instance option is a configuration
|
|
48
|
+
# option that stores its value within an instance variable and is
|
|
49
|
+
# accessed by an instance method. Both go by the name of the option.
|
|
50
|
+
def self.register_instance_option(option_name, scope = self, &default)
|
|
51
|
+
unless options = scope.instance_variable_get("@config_options")
|
|
52
|
+
options = scope.instance_variable_set("@config_options", {})
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
option_name = option_name.to_s
|
|
56
|
+
|
|
57
|
+
options[option_name] = nil
|
|
58
|
+
|
|
59
|
+
# If it's a boolean create an alias for it and remove question mark
|
|
60
|
+
if "?" == option_name[-1, 1]
|
|
61
|
+
scope.send(:define_method, "#{option_name.chop!}?") do
|
|
62
|
+
send(option_name)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Define getter/setter by the option name
|
|
67
|
+
scope.send(:define_method, option_name) do |*args, &block|
|
|
68
|
+
if !args[0].nil? || block
|
|
69
|
+
# Invocation with args --> This is the declaration of the option, i.e. setter
|
|
70
|
+
instance_variable_set("@#{option_name}_registered", args[0].nil? ? block : args[0])
|
|
71
|
+
else
|
|
72
|
+
# Invocation without args nor block --> It's the use of the option, i.e. getter
|
|
73
|
+
value = instance_variable_get("@#{option_name}_registered")
|
|
74
|
+
case value
|
|
75
|
+
when Proc
|
|
76
|
+
# Track recursive invocation with an instance variable. This prevents run-away recursion
|
|
77
|
+
# and allows configurations such as
|
|
78
|
+
# label { "#{label}".upcase }
|
|
79
|
+
# This will use the default definition when called recursively.
|
|
80
|
+
if instance_variable_get("@#{option_name}_recurring")
|
|
81
|
+
value = instance_eval &default
|
|
82
|
+
else
|
|
83
|
+
instance_variable_set("@#{option_name}_recurring", true)
|
|
84
|
+
value = instance_eval &value
|
|
85
|
+
instance_variable_set("@#{option_name}_recurring", false)
|
|
86
|
+
end
|
|
87
|
+
when nil
|
|
88
|
+
value = instance_eval &default
|
|
89
|
+
end
|
|
90
|
+
value
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def self.register_deprecated_instance_option(option_name, replacement_option_name, scope = self)
|
|
96
|
+
scope.send(:define_method, option_name) do |*args, &block|
|
|
97
|
+
ActiveSupport::Deprecation.warn("The #{option_name} configuration option is deprecated, please use #{replacement_option_name}.")
|
|
98
|
+
send(replacement_option_name, *args, &block)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Register a class option. Class option is a configuration
|
|
103
|
+
# option that stores it's value within a class object's instance variable
|
|
104
|
+
# and is accessed by a class method. Both go by the name of the option.
|
|
105
|
+
def self.register_class_option(option_name, &default)
|
|
106
|
+
scope = class << self; self; end;
|
|
107
|
+
self.register_instance_option(option_name, scope, &default)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
module RailsAdmin
|
|
2
|
+
module Config
|
|
3
|
+
module Fields
|
|
4
|
+
# Default field factory loads fields based on their property type or
|
|
5
|
+
# association type.
|
|
6
|
+
#
|
|
7
|
+
# @see RailsAdmin::Config::Fields.registry
|
|
8
|
+
mattr_reader :default_factory
|
|
9
|
+
@@default_factory = lambda do |parent, properties, fields|
|
|
10
|
+
# If it's an association
|
|
11
|
+
if properties.has_key?(:parent_model)
|
|
12
|
+
association = parent.abstract_model.associations.find {|a| a[:name].to_s == properties[:name].to_s}
|
|
13
|
+
field = RailsAdmin::Config::Fields::Types.load("#{association[:polymorphic] ? :polymorphic : properties[:type]}_association").new(parent, properties[:name], association)
|
|
14
|
+
fields << field
|
|
15
|
+
|
|
16
|
+
# If it's a column
|
|
17
|
+
elsif !properties.has_key?(:parent_model)
|
|
18
|
+
fields << (field = RailsAdmin::Config::Fields::Types.load(properties[:type]).new(parent, properties[:name], properties))
|
|
19
|
+
# hide _type columns (handled as associations)
|
|
20
|
+
if parent.abstract_model.belongs_to_associations.find {|a| a[:foreign_type] == properties[:name] }
|
|
21
|
+
field.hide
|
|
22
|
+
end
|
|
23
|
+
# hide _id column
|
|
24
|
+
if parent.abstract_model.belongs_to_associations.find {|a| a[:child_key] == properties[:name] }
|
|
25
|
+
field.hide
|
|
26
|
+
field.filterable(false) # filtering is handled on the association itself
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Registry of field factories.
|
|
32
|
+
#
|
|
33
|
+
# Field factory is an anonymous function that recieves the parent object,
|
|
34
|
+
# an array of field properties and an array of fields already instantiated.
|
|
35
|
+
#
|
|
36
|
+
# If the factory returns true then that property will not be run through
|
|
37
|
+
# the rest of the registered factories. If it returns false then the
|
|
38
|
+
# arguments will be passed to the next factory.
|
|
39
|
+
#
|
|
40
|
+
# By default a basic factory is registered which loads fields by their
|
|
41
|
+
# database column type. Also a password factory is registered which
|
|
42
|
+
# loads fields if their name is password. Third default factory is a
|
|
43
|
+
# devise specific factory which loads fields for devise user models.
|
|
44
|
+
#
|
|
45
|
+
# @see RailsAdmin::Config::Fields.register_factory
|
|
46
|
+
# @see rails_admin/config/fields/factories/password.rb
|
|
47
|
+
# @see rails_admin/config/fields/factories/devise.rb
|
|
48
|
+
@@registry = [@@default_factory]
|
|
49
|
+
|
|
50
|
+
# Build an array of fields by the provided parent object's abstract_model's
|
|
51
|
+
# property and association information. Each property and association is
|
|
52
|
+
# passed to the registered field factories which will populate the fields
|
|
53
|
+
# array that will be returned.
|
|
54
|
+
#
|
|
55
|
+
# @see RailsAdmin::Config::Fields.registry
|
|
56
|
+
def self.factory(parent)
|
|
57
|
+
fields = []
|
|
58
|
+
return fields unless parent.abstract_model.model_store_exists?
|
|
59
|
+
# Load fields for all properties (columns)
|
|
60
|
+
|
|
61
|
+
parent.abstract_model.properties.each do |properties|
|
|
62
|
+
# Unless a previous factory has already loaded current field as well
|
|
63
|
+
unless fields.find {|f| f.name == properties[:name] }
|
|
64
|
+
# Loop through factories until one returns true
|
|
65
|
+
@@registry.find {|factory| factory.call(parent, properties, fields) }
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
# Load fields for all associations (relations)
|
|
69
|
+
parent.abstract_model.associations.each do |association|
|
|
70
|
+
# Unless a previous factory has already loaded current field as well
|
|
71
|
+
unless fields.find {|f| f.name == association[:name] }
|
|
72
|
+
# Loop through factories until one returns true
|
|
73
|
+
@@registry.find {|factory| factory.call(parent, association, fields) }
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
fields
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Register a field factory to be included in the factory stack.
|
|
80
|
+
#
|
|
81
|
+
# Factories are invoked lifo (last in first out).
|
|
82
|
+
#
|
|
83
|
+
# @see RailsAdmin::Config::Fields.registry
|
|
84
|
+
def self.register_factory(&block)
|
|
85
|
+
@@registry.unshift(block)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
require 'rails_admin/config/fields/types'
|
|
92
|
+
require 'rails_admin/config/fields/factories/password'
|
|
93
|
+
require 'rails_admin/config/fields/factories/enum'
|
|
94
|
+
require 'rails_admin/config/fields/factories/devise'
|
|
95
|
+
require 'rails_admin/config/fields/factories/paperclip'
|
|
96
|
+
require 'rails_admin/config/fields/factories/dragonfly'
|
|
97
|
+
require 'rails_admin/config/fields/factories/carrierwave'
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
require 'rails_admin/config'
|
|
2
|
+
require 'rails_admin/config/fields/base'
|
|
3
|
+
|
|
4
|
+
module RailsAdmin
|
|
5
|
+
module Config
|
|
6
|
+
module Fields
|
|
7
|
+
class Association < RailsAdmin::Config::Fields::Base
|
|
8
|
+
|
|
9
|
+
def self.inherited(klass)
|
|
10
|
+
super(klass)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Reader for the association information hash
|
|
14
|
+
def association
|
|
15
|
+
@properties
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
register_instance_option(:pretty_value) do
|
|
19
|
+
v = bindings[:view]
|
|
20
|
+
[value].flatten.select(&:present?).map do |associated|
|
|
21
|
+
amc = polymorphic? ? RailsAdmin::Config.model(associated) : associated_model_config # perf optimization for non-polymorphic associations
|
|
22
|
+
am = amc.abstract_model
|
|
23
|
+
wording = associated.send(amc.object_label_method)
|
|
24
|
+
can_see = v.authorized?(:show, am, associated)
|
|
25
|
+
can_see = can_see && (show_action = RailsAdmin::Config::Actions.find(:show, { :controller => v.controller, :abstract_model => am, :object => associated }))
|
|
26
|
+
can_see ? v.link_to(wording, v.url_for(:action => show_action.action_name, :model_name => am.to_param, :id => associated.id)) : wording
|
|
27
|
+
end.to_sentence.html_safe
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
register_instance_option(:sortable) do
|
|
31
|
+
false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
register_instance_option(:searchable) do
|
|
35
|
+
false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Accessor whether association is visible or not. By default
|
|
39
|
+
# association checks whether the child model is excluded in
|
|
40
|
+
# configuration or not.
|
|
41
|
+
register_instance_option(:visible?) do
|
|
42
|
+
@visible ||= !self.associated_model_config.excluded?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# use the association name as a key, not the association key anymore!
|
|
46
|
+
register_instance_option(:label) do
|
|
47
|
+
(@label ||= {})[::I18n.locale] ||= abstract_model.model.human_attribute_name association[:name]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# scope for possible associable records
|
|
51
|
+
register_instance_option :associated_collection_scope do
|
|
52
|
+
# bindings[:object] & bindings[:controller] available
|
|
53
|
+
associated_collection_scope_limit = (self.associated_collection_cache_all ? nil : 30)
|
|
54
|
+
Proc.new do |scope|
|
|
55
|
+
scope.limit(associated_collection_scope_limit)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# preload entire associated collection (per associated_collection_scope) on load
|
|
60
|
+
# Be sure to set limit in associated_collection_scope if set is large
|
|
61
|
+
register_instance_option :associated_collection_cache_all do
|
|
62
|
+
@associated_collection_cache_all ||= (associated_model_config.abstract_model.count < 100)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Reader for the association's child model's configuration
|
|
66
|
+
def associated_model_config
|
|
67
|
+
@associated_model_config ||= RailsAdmin.config(association[:child_model])
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Reader for the association's child model object's label method
|
|
71
|
+
def associated_label_method
|
|
72
|
+
@associated_label_method ||= associated_model_config.object_label_method
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Reader for the association's child key
|
|
76
|
+
def child_key
|
|
77
|
+
association[:child_key]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Reader for the inverse relationship
|
|
81
|
+
def inverse_of
|
|
82
|
+
association[:inverse_of]
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# we need to check for validation on method and on association
|
|
86
|
+
register_instance_option :required? do
|
|
87
|
+
@required ||= !!(abstract_model.model.validators_on(name) + abstract_model.model.validators_on(method_name)).find do |v|
|
|
88
|
+
v.is_a?(ActiveModel::Validations::PresenceValidator) && !v.options[:allow_nil] ||
|
|
89
|
+
v.is_a?(ActiveModel::Validations::NumericalityValidator) && !v.options[:allow_nil]
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Reader for validation errors of the bound object
|
|
94
|
+
def errors
|
|
95
|
+
bindings[:object].errors[association[:name]] + bindings[:object].errors[child_key]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Reader whether this is a polymorphic association
|
|
99
|
+
def polymorphic?
|
|
100
|
+
association[:polymorphic]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Reader for nested attributes
|
|
104
|
+
register_instance_option :nested_form do
|
|
105
|
+
association[:nested_form]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Reader for the association's value unformatted
|
|
109
|
+
def value
|
|
110
|
+
bindings[:object].send(association[:name])
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
require 'active_support/core_ext/string/inflections'
|
|
2
|
+
require 'rails_admin/config/base'
|
|
3
|
+
require 'rails_admin/config/hideable'
|
|
4
|
+
require 'rails_admin/config/fields'
|
|
5
|
+
require 'rails_admin/config/fields/association'
|
|
6
|
+
require 'rails_admin/config/fields/groupable'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
module RailsAdmin
|
|
10
|
+
module Config
|
|
11
|
+
module Fields
|
|
12
|
+
class Base < RailsAdmin::Config::Base
|
|
13
|
+
attr_reader :name, :properties
|
|
14
|
+
attr_accessor :defined, :order, :section
|
|
15
|
+
|
|
16
|
+
def self.inherited(klass)
|
|
17
|
+
klass.instance_variable_set("@view_helper", :text_field)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
include RailsAdmin::Config::Hideable
|
|
21
|
+
|
|
22
|
+
def initialize(parent, name, properties)
|
|
23
|
+
super(parent)
|
|
24
|
+
|
|
25
|
+
@defined = false
|
|
26
|
+
@name = name
|
|
27
|
+
@order = 0
|
|
28
|
+
@properties = properties
|
|
29
|
+
@section = parent
|
|
30
|
+
|
|
31
|
+
extend RailsAdmin::Config::Fields::Groupable
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
register_instance_option(:css_class) do
|
|
35
|
+
"#{self.name}_field"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def type_css_class
|
|
39
|
+
"#{type}_type"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def virtual?
|
|
43
|
+
properties.blank?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
register_instance_option(:column_width) do
|
|
47
|
+
nil
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
register_instance_option(:sortable) do
|
|
51
|
+
!virtual?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
register_instance_option(:searchable) do
|
|
55
|
+
!virtual?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
register_instance_option(:queryable?) do
|
|
59
|
+
!!searchable
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
register_instance_option(:filterable?) do
|
|
63
|
+
!!searchable
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
register_instance_option(:search_operator) do
|
|
67
|
+
@search_operator ||= RailsAdmin::Config.default_search_operator
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# serials and dates are reversed in list, which is more natural (last modified items first).
|
|
71
|
+
register_instance_option(:sort_reverse?) do
|
|
72
|
+
false
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# list of columns I should search for that field [{ :column => 'table_name.column', :type => field.type }, {..}]
|
|
76
|
+
register_instance_option(:searchable_columns) do
|
|
77
|
+
@searchable_columns ||= case self.searchable
|
|
78
|
+
when true
|
|
79
|
+
[{ :column => "#{self.abstract_model.model.table_name}.#{self.name}", :type => self.type }]
|
|
80
|
+
when false
|
|
81
|
+
[]
|
|
82
|
+
when :all # valid only for associations
|
|
83
|
+
table_name = self.associated_model_config.abstract_model.model.table_name
|
|
84
|
+
self.associated_model_config.list.fields.map { |f| { :column => "#{table_name}.#{f.name}", :type => f.type } }
|
|
85
|
+
else
|
|
86
|
+
[self.searchable].flatten.map do |f|
|
|
87
|
+
if f.is_a?(String) && f.include?('.') # table_name.column
|
|
88
|
+
table_name, column = f.split '.'
|
|
89
|
+
type = nil
|
|
90
|
+
elsif f.is_a?(Hash) # <Model|table_name> => <attribute|column>
|
|
91
|
+
am = AbstractModel.new(f.keys.first.to_s.classify)
|
|
92
|
+
table_name = am && am.model.table_name || f.keys.first
|
|
93
|
+
column = f.values.first
|
|
94
|
+
property = am && am.properties.find{ |p| p[:name] == f.values.first.to_sym }
|
|
95
|
+
type = property && property[:type]
|
|
96
|
+
else # <attribute|column>
|
|
97
|
+
am = (self.association? ? self.associated_model_config.abstract_model : self.abstract_model)
|
|
98
|
+
table_name = am.model.table_name
|
|
99
|
+
column = f
|
|
100
|
+
property = am.properties.find{ |p| p[:name] == f.to_sym }
|
|
101
|
+
type = property && property[:type]
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
{ :column => "#{table_name}.#{column}", :type => (type || :string) }
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
register_instance_option(:formatted_value) do
|
|
110
|
+
value.to_s
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# output for pretty printing (show, list)
|
|
114
|
+
register_instance_option(:pretty_value) do
|
|
115
|
+
formatted_value.presence || ' - '
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# output for printing in export view (developers beware: no bindings[:view] and no data!)
|
|
119
|
+
register_instance_option(:export_value) do
|
|
120
|
+
pretty_value
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# Accessor for field's help text displayed below input field.
|
|
125
|
+
register_instance_option(:help) do
|
|
126
|
+
(@help ||= {})[::I18n.locale] ||= (required? ? I18n.translate("admin.form.required") : I18n.translate("admin.form.optional")) + '. '
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
register_instance_option(:html_attributes) do
|
|
130
|
+
{}
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
register_instance_option :default_value do
|
|
134
|
+
nil
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Accessor for field's label.
|
|
138
|
+
#
|
|
139
|
+
# @see RailsAdmin::AbstractModel.properties
|
|
140
|
+
register_instance_option(:label) do
|
|
141
|
+
(@label ||= {})[::I18n.locale] ||= abstract_model.model.human_attribute_name name
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Accessor for field's maximum length per database.
|
|
145
|
+
#
|
|
146
|
+
# @see RailsAdmin::AbstractModel.properties
|
|
147
|
+
register_instance_option(:length) do
|
|
148
|
+
@length ||= properties && properties[:length]
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Accessor for field's length restrictions per validations
|
|
152
|
+
#
|
|
153
|
+
register_instance_option(:valid_length) do
|
|
154
|
+
@valid_length ||= abstract_model.model.validators_on(name).find{|v|
|
|
155
|
+
v.is_a?(ActiveModel::Validations::LengthValidator)}.try{|v| v.options} || {}
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
register_instance_option(:partial) do
|
|
159
|
+
:form_field
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Accessor for whether this is field is mandatory.
|
|
163
|
+
#
|
|
164
|
+
# @see RailsAdmin::AbstractModel.properties
|
|
165
|
+
register_instance_option(:required?) do
|
|
166
|
+
@required ||= !!abstract_model.model.validators_on(name).find do |v|
|
|
167
|
+
v.is_a?(ActiveModel::Validations::PresenceValidator) && !v.options[:allow_nil] ||
|
|
168
|
+
v.is_a?(ActiveModel::Validations::NumericalityValidator) && !v.options[:allow_nil]
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Accessor for whether this is a serial field (aka. primary key, identifier).
|
|
173
|
+
#
|
|
174
|
+
# @see RailsAdmin::AbstractModel.properties
|
|
175
|
+
register_instance_option(:serial?) do
|
|
176
|
+
properties && properties[:serial?]
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
register_instance_option(:view_helper) do
|
|
180
|
+
@view_helper ||= self.class.instance_variable_get("@view_helper")
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
register_instance_option :read_only do
|
|
184
|
+
not editable
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
register_instance_option :visible? do
|
|
188
|
+
returned = true
|
|
189
|
+
(RailsAdmin.config.default_hidden_fields || {}).each do |section, fields|
|
|
190
|
+
if self.section.is_a?("RailsAdmin::Config::Sections::#{section.to_s.camelize}".constantize)
|
|
191
|
+
returned = false if fields.include?(self.name)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
returned
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def editable
|
|
198
|
+
return false if @properties && @properties[:read_only]
|
|
199
|
+
role = bindings[:view].controller.send(:_attr_accessible_role)
|
|
200
|
+
klass = bindings[:object].class
|
|
201
|
+
whitelist = klass.accessible_attributes(role).map(&:to_s)
|
|
202
|
+
blacklist = klass.protected_attributes(role).map(&:to_s)
|
|
203
|
+
!self.method_name.to_s.in?(blacklist) && (whitelist.any? ? self.method_name.to_s.in?(whitelist) : true)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def render
|
|
207
|
+
bindings[:view].render :partial => partial.to_s, :locals => {:field => self, :form => bindings[:form] }
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Is this an association
|
|
211
|
+
def association?
|
|
212
|
+
kind_of?(RailsAdmin::Config::Fields::Association)
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Reader for validation errors of the bound object
|
|
216
|
+
def errors
|
|
217
|
+
bindings[:object].errors[name]
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Reader whether field is optional.
|
|
221
|
+
#
|
|
222
|
+
# @see RailsAdmin::Config::Fields::Base.register_instance_option(:required?)
|
|
223
|
+
def optional?
|
|
224
|
+
not required
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# Inverse accessor whether this field is required.
|
|
228
|
+
#
|
|
229
|
+
# @see RailsAdmin::Config::Fields::Base.register_instance_option(:required?)
|
|
230
|
+
def optional(state = nil, &block)
|
|
231
|
+
if !state.nil? || block
|
|
232
|
+
required state.nil? ? proc { false == (instance_eval &block) } : false == state
|
|
233
|
+
else
|
|
234
|
+
optional?
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# Writer to make field optional.
|
|
239
|
+
#
|
|
240
|
+
# @see RailsAdmin::Config::Fields::Base.optional
|
|
241
|
+
def optional=(state)
|
|
242
|
+
optional(state)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
# Reader for field's type
|
|
246
|
+
def type
|
|
247
|
+
@type ||= self.class.name.to_s.demodulize.underscore.to_sym
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# Reader for field's value
|
|
251
|
+
def value
|
|
252
|
+
bindings[:object].safe_send(name)
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# Reader for nested attributes
|
|
256
|
+
def nested_form
|
|
257
|
+
false
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def inverse_of
|
|
261
|
+
nil
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def method_name
|
|
265
|
+
name
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def _html_attributes
|
|
269
|
+
html_attributes.merge(!default_value.nil? ? { :value => default_value } : {})
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|