admin_assistant 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +16 -0
- data/Rakefile +34 -6
- data/VERSION +1 -0
- data/admin_assistant.gemspec +440 -0
- data/doc/img/blog_posts-index.png +0 -0
- data/install.rb +25 -4
- data/lib/admin_assistant/active_record_column.rb +133 -45
- data/lib/admin_assistant/association_target.rb +16 -3
- data/lib/admin_assistant/belongs_to_column.rb +18 -10
- data/lib/admin_assistant/builder.rb +67 -30
- data/lib/admin_assistant/column.rb +153 -71
- data/lib/admin_assistant/date_time_range_end_point_selector.rb +340 -0
- data/lib/admin_assistant/default_search_column.rb +3 -7
- data/lib/admin_assistant/form_view.rb +114 -10
- data/lib/admin_assistant/has_many_column.rb +56 -0
- data/lib/admin_assistant/index.rb +220 -83
- data/lib/admin_assistant/polymorphic_belongs_to_column.rb +1 -1
- data/lib/admin_assistant/request/base.rb +196 -67
- data/lib/admin_assistant/request/create.rb +55 -7
- data/lib/admin_assistant/request/edit.rb +1 -2
- data/lib/admin_assistant/request/index.rb +16 -9
- data/lib/admin_assistant/request/new.rb +19 -7
- data/lib/admin_assistant/request/update.rb +28 -13
- data/lib/admin_assistant/search.rb +17 -2
- data/lib/admin_assistant/virtual_column.rb +15 -7
- data/lib/admin_assistant.rb +101 -81
- data/lib/javascripts/admin_assistant.js +1 -1
- data/lib/stylesheets/activescaffold.css +6 -1
- data/lib/stylesheets/default.css +17 -0
- data/lib/views/form.html.erb +7 -3
- data/lib/views/index.html.erb +13 -8
- data/lib/views/multi_form.html.erb +71 -0
- data/lib/views/show.html.erb +4 -4
- data/test_rails_app/README +256 -0
- data/test_rails_app/Rakefile +13 -0
- data/test_rails_app/app/controllers/admin/appointments2_controller.rb +15 -0
- data/test_rails_app/app/controllers/admin/appointments_controller.rb +11 -0
- data/test_rails_app/app/controllers/admin/blog_posts2_controller.rb +138 -0
- data/test_rails_app/app/controllers/admin/blog_posts3_controller.rb +76 -0
- data/test_rails_app/app/controllers/admin/blog_posts4_controller.rb +21 -0
- data/test_rails_app/app/controllers/admin/blog_posts5_controller.rb +27 -0
- data/test_rails_app/app/controllers/admin/blog_posts6_controller.rb +10 -0
- data/test_rails_app/app/controllers/admin/blog_posts_controller.rb +8 -0
- data/test_rails_app/app/controllers/admin/blog_posts_custom_new_and_edit_controller.rb +15 -0
- data/test_rails_app/app/controllers/admin/blog_posts_read_only_controller.rb +19 -0
- data/test_rails_app/app/controllers/admin/bookmarks_controller.rb +11 -0
- data/test_rails_app/app/controllers/admin/comments2_controller.rb +14 -0
- data/test_rails_app/app/controllers/admin/comments_controller.rb +12 -0
- data/test_rails_app/app/controllers/admin/file_column_images2_controller.rb +10 -0
- data/test_rails_app/app/controllers/admin/file_column_images_controller.rb +6 -0
- data/test_rails_app/app/controllers/admin/images2_controller.rb +11 -0
- data/test_rails_app/app/controllers/admin/images_controller.rb +6 -0
- data/test_rails_app/app/controllers/admin/misconfigured1_controller.rb +7 -0
- data/test_rails_app/app/controllers/admin/not_migrated_yets_controller.rb +9 -0
- data/test_rails_app/app/controllers/admin/product_categories2_controller.rb +7 -0
- data/test_rails_app/app/controllers/admin/product_categories_controller.rb +5 -0
- data/test_rails_app/app/controllers/admin/products2_controller.rb +15 -0
- data/test_rails_app/app/controllers/admin/products_controller.rb +31 -0
- data/test_rails_app/app/controllers/admin/television_airings_controller.rb +5 -0
- data/test_rails_app/app/controllers/admin/television_time_slots_controller.rb +5 -0
- data/test_rails_app/app/controllers/admin/users2_controller.rb +10 -0
- data/test_rails_app/app/controllers/admin/users_controller.rb +63 -0
- data/test_rails_app/app/controllers/application.rb +16 -0
- data/test_rails_app/app/controllers/application_controller.rb +16 -0
- data/test_rails_app/app/controllers/blog_posts_controller.rb +5 -0
- data/test_rails_app/app/helpers/admin/appointments2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/appointments_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/blog_posts2_helper.rb +27 -0
- data/test_rails_app/app/helpers/admin/blog_posts3_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/blog_posts4_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/blog_posts6_helper.rb +16 -0
- data/test_rails_app/app/helpers/admin/blog_posts_custom_new_and_edit_helper.rb +29 -0
- data/test_rails_app/app/helpers/admin/blog_posts_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/blog_posts_read_only_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/bookmarks_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/comments2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/comments_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/file_column_images2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/file_column_images_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/images2_helper.rb +8 -0
- data/test_rails_app/app/helpers/admin/images_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/misconfigured1_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/not_migrated_yets_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/product_categories2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/product_categories_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/products2_helper.rb +3 -0
- data/test_rails_app/app/helpers/admin/products_helper.rb +6 -0
- data/test_rails_app/app/helpers/admin/television_airings_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/television_time_slots_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/users2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/users_helper.rb +25 -0
- data/test_rails_app/app/helpers/application_helper.rb +3 -0
- data/test_rails_app/app/helpers/blog_posts_helper.rb +2 -0
- data/test_rails_app/app/models/appointment.rb +5 -0
- data/test_rails_app/app/models/blog_post.rb +14 -0
- data/test_rails_app/app/models/blog_post_tag.rb +6 -0
- data/test_rails_app/app/models/bookmark.rb +6 -0
- data/test_rails_app/app/models/comment.rb +4 -0
- data/test_rails_app/app/models/file_column_image.rb +3 -0
- data/test_rails_app/app/models/image.rb +3 -0
- data/test_rails_app/app/models/not_migrated_yet.rb +2 -0
- data/test_rails_app/app/models/product.rb +7 -0
- data/test_rails_app/app/models/product_category.rb +9 -0
- data/test_rails_app/app/models/tag.rb +4 -0
- data/test_rails_app/app/models/television_airing.rb +3 -0
- data/test_rails_app/app/models/television_time_slot.rb +11 -0
- data/test_rails_app/app/models/user.rb +14 -0
- data/test_rails_app/app/views/admin/appointments/_subject_input.html.erb +2 -0
- data/test_rails_app/app/views/admin/appointments2/_time_input.html.erb +31 -0
- data/test_rails_app/app/views/admin/blog_posts2/_after_form.html.erb +5 -0
- data/test_rails_app/app/views/admin/blog_posts2/_after_index.html.erb +1 -0
- data/test_rails_app/app/views/admin/blog_posts2/_after_tags_input.html.erb +16 -0
- data/test_rails_app/app/views/admin/blog_posts2/_before_index.html.erb +2 -0
- data/test_rails_app/app/views/admin/blog_posts5/_after_index_header.html.erb +8 -0
- data/test_rails_app/app/views/admin/blog_posts_read_only/_body_for_show.html.erb +1 -0
- data/test_rails_app/app/views/admin/products/_name_input.html.erb +2 -0
- data/test_rails_app/app/views/admin/products/_percent_off_input.html.erb +2 -0
- data/test_rails_app/app/views/admin/products/_price_input.html.erb +10 -0
- data/test_rails_app/app/views/blog_posts/show.html.erb +13 -0
- data/test_rails_app/app/views/layouts/admin.html.erb +31 -0
- data/test_rails_app/config/boot.rb +109 -0
- data/test_rails_app/config/database.yml +28 -0
- data/test_rails_app/config/environment.rb +78 -0
- data/test_rails_app/config/environments/development.rb +17 -0
- data/test_rails_app/config/environments/production.rb +24 -0
- data/test_rails_app/config/environments/test.rb +24 -0
- data/test_rails_app/config/initializers/inflections.rb +10 -0
- data/test_rails_app/config/initializers/mime_types.rb +5 -0
- data/test_rails_app/config/initializers/new_rails_defaults.rb +17 -0
- data/test_rails_app/config/locales/en.yml +5 -0
- data/test_rails_app/config/routes.rb +43 -0
- data/test_rails_app/db/migrate/20090213215514_create_blog_posts.rb +12 -0
- data/test_rails_app/db/migrate/20090217225542_add_body_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090221220917_create_tags.rb +13 -0
- data/test_rails_app/db/migrate/20090221220947_create_blog_post_tags.rb +14 -0
- data/test_rails_app/db/migrate/20090222162204_add_textile_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090222163231_add_published_at_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090301191722_create_images.rb +16 -0
- data/test_rails_app/db/migrate/20090305165345_create_accounts.rb +14 -0
- data/test_rails_app/db/migrate/20090307225027_rename_accounts_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20090307225750_add_user_id_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090309185114_change_blog_posts_textile.rb +9 -0
- data/test_rails_app/db/migrate/20090309193635_create_products.rb +14 -0
- data/test_rails_app/db/migrate/20090309203056_create_comments.rb +15 -0
- data/test_rails_app/db/migrate/20090323005947_create_file_column_images.rb +12 -0
- data/test_rails_app/db/migrate/20090326160049_add_birthday_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20090326223606_add_state_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20090503134004_add_file_column_image_to_products.rb +9 -0
- data/test_rails_app/db/migrate/20090617173651_create_bookmarks.rb +15 -0
- data/test_rails_app/db/migrate/20090624165355_add_tags_string_to_blog_post.rb +9 -0
- data/test_rails_app/db/migrate/20090625144313_add_avatar_fields_to_user.rb +11 -0
- data/test_rails_app/db/migrate/20090629202956_add_merged_into_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090701171857_add_force_textile_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20090704163647_add_deleted_at_to_products.rb +9 -0
- data/test_rails_app/db/migrate/20090704173800_add_sale_fields_to_products.rb +13 -0
- data/test_rails_app/db/migrate/20090714024501_create_product_categories.rb +15 -0
- data/test_rails_app/db/migrate/20090819162835_add_admin_level_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20091115134559_add_first_and_last_names_to_users.rb +11 -0
- data/test_rails_app/db/migrate/20091221011256_add_position_to_product_categories.rb +9 -0
- data/test_rails_app/db/migrate/20091222160814_create_appointments.rb +14 -0
- data/test_rails_app/db/migrate/20091227224547_add_user_id_to_appointments.rb +9 -0
- data/test_rails_app/db/migrate/20100214213359_create_television_time_slots.rb +13 -0
- data/test_rails_app/db/migrate/20100214213451_create_television_airings.rb +15 -0
- data/test_rails_app/doc/README_FOR_APP +5 -0
- data/test_rails_app/lib/tasks/rspec.rake +163 -0
- data/test_rails_app/public/404.html +30 -0
- data/test_rails_app/public/422.html +30 -0
- data/test_rails_app/public/500.html +33 -0
- data/test_rails_app/public/dispatch.cgi +10 -0
- data/test_rails_app/public/dispatch.fcgi +24 -0
- data/test_rails_app/public/dispatch.rb +10 -0
- data/test_rails_app/public/favicon.ico +0 -0
- data/test_rails_app/public/images/rails.png +0 -0
- data/test_rails_app/public/index.html +274 -0
- data/test_rails_app/public/javascripts/application.js +2 -0
- data/test_rails_app/public/javascripts/controls.js +963 -0
- data/test_rails_app/public/javascripts/dragdrop.js +973 -0
- data/test_rails_app/public/javascripts/effects.js +1128 -0
- data/test_rails_app/public/javascripts/prototype.js +4320 -0
- data/test_rails_app/public/robots.txt +5 -0
- data/test_rails_app/public/stylesheets/admin.css +3 -0
- data/test_rails_app/public/stylesheets/scaffold.css +54 -0
- data/test_rails_app/script/about +4 -0
- data/test_rails_app/script/autospec +5 -0
- data/test_rails_app/script/console +3 -0
- data/test_rails_app/script/dbconsole +3 -0
- data/test_rails_app/script/destroy +3 -0
- data/test_rails_app/script/generate +3 -0
- data/test_rails_app/script/performance/benchmarker +3 -0
- data/test_rails_app/script/performance/profiler +3 -0
- data/test_rails_app/script/performance/request +3 -0
- data/test_rails_app/script/plugin +3 -0
- data/test_rails_app/script/populate_tables.rb +49 -0
- data/test_rails_app/script/process/inspector +3 -0
- data/test_rails_app/script/process/reaper +3 -0
- data/test_rails_app/script/process/spawner +3 -0
- data/test_rails_app/script/runner +3 -0
- data/test_rails_app/script/server +3 -0
- data/test_rails_app/script/spec +5 -0
- data/test_rails_app/script/spec_server +125 -0
- data/test_rails_app/spec/controllers/admin/appointments2_controller_spec.rb +88 -0
- data/test_rails_app/spec/controllers/admin/appointments_controller_spec.rb +419 -0
- data/test_rails_app/spec/controllers/admin/blog_posts2_controller_spec.rb +1021 -0
- data/test_rails_app/spec/controllers/admin/blog_posts3_controller_spec.rb +532 -0
- data/test_rails_app/spec/controllers/admin/blog_posts4_controller_spec.rb +231 -0
- data/test_rails_app/spec/controllers/admin/blog_posts5_controller_spec.rb +77 -0
- data/test_rails_app/spec/controllers/admin/blog_posts6_controller_spec.rb +49 -0
- data/test_rails_app/spec/controllers/admin/blog_posts_controller_spec.rb +987 -0
- data/test_rails_app/spec/controllers/admin/blog_posts_custom_new_and_edit_controller_spec.rb +99 -0
- data/test_rails_app/spec/controllers/admin/blog_posts_read_only_controller_spec.rb +94 -0
- data/test_rails_app/spec/controllers/admin/bookmarks_controller_spec.rb +505 -0
- data/test_rails_app/spec/controllers/admin/comments2_controller_spec.rb +70 -0
- data/test_rails_app/spec/controllers/admin/comments_controller_spec.rb +82 -0
- data/test_rails_app/spec/controllers/admin/file_column_images2_controller_spec.rb +25 -0
- data/test_rails_app/spec/controllers/admin/file_column_images_controller_spec.rb +82 -0
- data/test_rails_app/spec/controllers/admin/images2_controller_spec.rb +44 -0
- data/test_rails_app/spec/controllers/admin/images_controller_spec.rb +97 -0
- data/test_rails_app/spec/controllers/admin/misconfigured1_controller_spec.rb +21 -0
- data/test_rails_app/spec/controllers/admin/not_migrated_yets_controller_spec.rb +10 -0
- data/test_rails_app/spec/controllers/admin/product_categories2_controller_spec.rb +215 -0
- data/test_rails_app/spec/controllers/admin/product_categories_controller_spec.rb +19 -0
- data/test_rails_app/spec/controllers/admin/products2_controller_spec.rb +203 -0
- data/test_rails_app/spec/controllers/admin/products_controller_spec.rb +255 -0
- data/test_rails_app/spec/controllers/admin/television_airings_controller_spec.rb +32 -0
- data/test_rails_app/spec/controllers/admin/television_time_slots_controller_spec.rb +10 -0
- data/test_rails_app/spec/controllers/admin/users2_controller_spec.rb +65 -0
- data/test_rails_app/spec/controllers/admin/users_controller_spec.rb +344 -0
- data/test_rails_app/spec/controllers/blog_posts_controller_spec.rb +13 -0
- data/test_rails_app/spec/data/ruby_throated.jpg +0 -0
- data/test_rails_app/spec/data/tweenbot.jpg +0 -0
- data/test_rails_app/spec/fixtures/appointments.yml +9 -0
- data/test_rails_app/spec/fixtures/blog_post_tags.yml +9 -0
- data/test_rails_app/spec/fixtures/blog_posts.yml +7 -0
- data/test_rails_app/spec/fixtures/bookmarks.yml +11 -0
- data/test_rails_app/spec/fixtures/comments.yml +11 -0
- data/test_rails_app/spec/fixtures/file_column_images.yml +7 -0
- data/test_rails_app/spec/fixtures/images.yml +7 -0
- data/test_rails_app/spec/fixtures/not_migrated_yets.yml +7 -0
- data/test_rails_app/spec/fixtures/product_categories.yml +7 -0
- data/test_rails_app/spec/fixtures/products.yml +9 -0
- data/test_rails_app/spec/fixtures/tags.yml +7 -0
- data/test_rails_app/spec/fixtures/television_airings.yml +11 -0
- data/test_rails_app/spec/fixtures/television_time_slots.yml +7 -0
- data/test_rails_app/spec/fixtures/users.yml +9 -0
- data/test_rails_app/spec/helpers/admin/appointments2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/appointments_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts3_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts4_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts_custom_new_and_edit_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts_read_only_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/bookmarks_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/comments2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/comments_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/file_column_images2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/file_column_images_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/images2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/images_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/misconfigured1_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/not_migrated_yets_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/product_categories2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/product_categories_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/products2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/products_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/television_airings_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/television_time_slots_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/users2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/users_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/blog_posts_helper_spec.rb +11 -0
- data/test_rails_app/spec/models/appointment_spec.rb +16 -0
- data/test_rails_app/spec/models/blog_post_spec.rb +13 -0
- data/test_rails_app/spec/models/blog_post_tag_spec.rb +14 -0
- data/test_rails_app/spec/models/bookmark_spec.rb +15 -0
- data/test_rails_app/spec/models/comment_spec.rb +15 -0
- data/test_rails_app/spec/models/file_column_image_spec.rb +12 -0
- data/test_rails_app/spec/models/image_spec.rb +12 -0
- data/test_rails_app/spec/models/not_migrated_yet_spec.rb +15 -0
- data/test_rails_app/spec/models/product_category_spec.rb +15 -0
- data/test_rails_app/spec/models/product_spec.rb +14 -0
- data/test_rails_app/spec/models/tag_spec.rb +13 -0
- data/test_rails_app/spec/models/television_airing_spec.rb +15 -0
- data/test_rails_app/spec/models/television_time_slot_spec.rb +13 -0
- data/test_rails_app/spec/models/user_spec.rb +14 -0
- data/test_rails_app/spec/rcov.opts +2 -0
- data/test_rails_app/spec/spec.opts +4 -0
- data/test_rails_app/spec/spec_helper.rb +88 -0
- data/test_rails_app/spec/spec_or_test_helper.rb +49 -0
- data/test_rails_app/test/fixtures/file_column_images.yml +7 -0
- data/test_rails_app/test/integration/admin_blog_posts2_integration_test.rb +16 -0
- data/test_rails_app/test/integration/admin_blog_posts5_integration_test.rb +19 -0
- data/test_rails_app/test/integration/admin_blog_posts_integration_test.rb +25 -0
- data/test_rails_app/test/test_helper.rb +28 -0
- data/test_rails_app/vendor/plugins/file_column/CHANGELOG +69 -0
- data/test_rails_app/vendor/plugins/file_column/README +54 -0
- data/test_rails_app/vendor/plugins/file_column/Rakefile +36 -0
- data/test_rails_app/vendor/plugins/file_column/TODO +6 -0
- data/test_rails_app/vendor/plugins/file_column/init.rb +13 -0
- data/test_rails_app/vendor/plugins/file_column/lib/file_column.rb +723 -0
- data/test_rails_app/vendor/plugins/file_column/lib/file_column_helper.rb +150 -0
- data/test_rails_app/vendor/plugins/file_column/lib/file_compat.rb +28 -0
- data/test_rails_app/vendor/plugins/file_column/lib/magick_file_column.rb +260 -0
- data/test_rails_app/vendor/plugins/file_column/lib/rails_file_column.rb +19 -0
- data/test_rails_app/vendor/plugins/file_column/lib/test_case.rb +124 -0
- data/test_rails_app/vendor/plugins/file_column/lib/validations.rb +112 -0
- data/test_rails_app/vendor/plugins/file_column/test/abstract_unit.rb +63 -0
- data/test_rails_app/vendor/plugins/file_column/test/connection.rb +17 -0
- data/test_rails_app/vendor/plugins/file_column/test/file_column_helper_test.rb +97 -0
- data/test_rails_app/vendor/plugins/file_column/test/file_column_test.rb +650 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/entry.rb +32 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/invalid-image.jpg +1 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/kerb.jpg +0 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/mysql.sql +25 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/schema.rb +10 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/skanthak.png +0 -0
- data/test_rails_app/vendor/plugins/file_column/test/magick_test.rb +380 -0
- data/test_rails_app/vendor/plugins/file_column/test/magick_view_only_test.rb +21 -0
- data/vendor/ar_query/ar_query.gemspec +16 -0
- data/website/_layouts/api.html +39 -0
- data/website/_layouts/default.html +34 -0
- data/website/api/core.markdown +106 -0
- data/website/api/destroy.markdown +25 -0
- data/website/api/form.markdown +291 -0
- data/website/api/idx.markdown +286 -0
- data/website/api/index.markdown +147 -0
- data/website/api/search.markdown +108 -0
- data/website/api/show.markdown +22 -0
- data/website/community.markdown +27 -0
- data/website/css/lightbox.css +29 -0
- data/website/css/main.css +70 -0
- data/website/design_principles.markdown +50 -0
- data/website/getting_started.markdown +10 -0
- data/website/img/blog_posts-index.png +0 -0
- data/website/img/blog_posts-search.png +0 -0
- data/website/img/lightbox/bullet.gif +0 -0
- data/website/img/lightbox/close.gif +0 -0
- data/website/img/lightbox/closelabel.gif +0 -0
- data/website/img/lightbox/donate-button.gif +0 -0
- data/website/img/lightbox/download-icon.gif +0 -0
- data/website/img/lightbox/image-1.jpg +0 -0
- data/website/img/lightbox/loading.gif +0 -0
- data/website/img/lightbox/nextlabel.gif +0 -0
- data/website/img/lightbox/prevlabel.gif +0 -0
- data/website/img/lightbox/thumb-1.jpg +0 -0
- data/website/img/screen1-thumb.png +0 -0
- data/website/img/screen1.png +0 -0
- data/website/img/screen10-thumb.png +0 -0
- data/website/img/screen10.png +0 -0
- data/website/img/screen11-thumb.png +0 -0
- data/website/img/screen11.png +0 -0
- data/website/img/screen2-thumb.png +0 -0
- data/website/img/screen2.png +0 -0
- data/website/img/screen3-thumb.png +0 -0
- data/website/img/screen3.png +0 -0
- data/website/img/screen4-thumb.png +0 -0
- data/website/img/screen4.png +0 -0
- data/website/img/screen5-thumb.png +0 -0
- data/website/img/screen5.png +0 -0
- data/website/img/screen6-thumb.png +0 -0
- data/website/img/screen6.png +0 -0
- data/website/img/screen7-thumb.png +0 -0
- data/website/img/screen7.png +0 -0
- data/website/img/screen8-thumb.png +0 -0
- data/website/img/screen8.png +0 -0
- data/website/img/screen9-thumb.png +0 -0
- data/website/img/screen9.png +0 -0
- data/website/img/user-form.png +0 -0
- data/website/index.markdown +35 -0
- data/website/js/builder.js +136 -0
- data/website/js/effects.js +1122 -0
- data/website/js/lightbox.js +497 -0
- data/website/js/prototype.js +4221 -0
- data/website/js/scriptaculous.js +58 -0
- data/website/quick_start.markdown +44 -0
- data/website/screenshots.markdown +27 -0
- data/website/tutorial.markdown +56 -0
- metadata +391 -23
@@ -0,0 +1,147 @@
|
|
1
|
+
---
|
2
|
+
layout: api
|
3
|
+
---
|
4
|
+
|
5
|
+
### Reference sections
|
6
|
+
|
7
|
+
The API reference is broken down into a few sections:
|
8
|
+
|
9
|
+
* [Core](./core.html): Settings that apply to an admin controller in general.
|
10
|
+
* [Destroy](./destroy.html): Settings that apply to destroying records. Note that `destroy` is turned off by default. To turn it on, use the core [actions](./core.html#builder_actions) method.
|
11
|
+
* [Form](./form.html): Settings that apply to creating or updating records.
|
12
|
+
* [Index](./idx.html): Settings that apply to the index view, which you use to view records, paginate, and sort.
|
13
|
+
* [Search](./search.html): Settings that apply to how searches work.
|
14
|
+
* [Show](./show.html): Settings that apply to how the show view.
|
15
|
+
|
16
|
+
|
17
|
+
### Configuration overview
|
18
|
+
|
19
|
+
|
20
|
+
There are a number of ways to configure admin\_assistant:
|
21
|
+
|
22
|
+
#### Through builder objects
|
23
|
+
|
24
|
+
`admin_assistant_for` takes a block that yields a core builder object:
|
25
|
+
|
26
|
+
class Admin::BlogPostsController < ApplicationController
|
27
|
+
layout 'admin'
|
28
|
+
|
29
|
+
admin_assistant_for BlogPost do |aa|
|
30
|
+
aa.model_class_name = 'post'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
For the actions `form` and `index`, you can get a nested builder from the core builder, which can be used to configure those individual action types.
|
35
|
+
|
36
|
+
admin_assistant_for BlogPost do |aa|
|
37
|
+
aa.index do |index|
|
38
|
+
index.sort_by "name asc"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
The nesting is intended to help organize your configuration code, but if you're in a hurry, you can also just chain the calls:
|
43
|
+
|
44
|
+
admin_assistant_for BlogPost do |aa|
|
45
|
+
aa.index.sort_by "name asc"
|
46
|
+
end
|
47
|
+
|
48
|
+
Since `search` is really a subset of `index`, its configuration builder is reached through the index builder.
|
49
|
+
|
50
|
+
admin_assistant_for BlogPost do |aa|
|
51
|
+
aa.index do |index|
|
52
|
+
index.search do |search|
|
53
|
+
search.columns :id, :title, :body
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
#### Columns on builder objects
|
59
|
+
|
60
|
+
Columns are specified on the action-types `index`, `form`, or `search`:
|
61
|
+
|
62
|
+
admin_assistant_for BlogPost do |aa|
|
63
|
+
aa.index.columns :id, :title, :body
|
64
|
+
end
|
65
|
+
|
66
|
+
There is no global `columns` setting.
|
67
|
+
|
68
|
+
These columns can be accessed with `[]`, either globally, or specific to an action-type, depending on what sort of setting is being altered.
|
69
|
+
|
70
|
+
admin_assistant_for BlogPost do |aa|
|
71
|
+
# this will apply to the :title column, both on form and index views
|
72
|
+
aa[:title].label = "Headline"
|
73
|
+
|
74
|
+
aa.form do |form|
|
75
|
+
form.columns :id, :title, :body
|
76
|
+
|
77
|
+
# This will only apply to the :title column in the form view
|
78
|
+
form[:title].description = "Enter the headline of your blog post here."
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
If you're dealing with an association, generally speaking, you'll use the column of the association name, not the foreign key ID in the database.
|
83
|
+
|
84
|
+
admin_assistant_for BlogPost do |aa|
|
85
|
+
aa.index.columns :id, :title, :user # as opposed to :user_id
|
86
|
+
end
|
87
|
+
|
88
|
+
#### Protected controller methods
|
89
|
+
|
90
|
+
For certain types of settings, the `form` and `index` action types can be customized through protected methods on the controller.
|
91
|
+
|
92
|
+
class Admin::BlogPostsController < ApplicationController
|
93
|
+
layout 'admin'
|
94
|
+
|
95
|
+
admin_assistant_for BlogPost
|
96
|
+
|
97
|
+
protected
|
98
|
+
|
99
|
+
# The index action only shows unpublished blog posts, unless somebody has
|
100
|
+
# clicked the custom "Show All" link
|
101
|
+
def conditions_for_index
|
102
|
+
"published_at is null" unless params[:all]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
Remember to make these methods protected so that Rails won't try to use them as public-facing actions, i.e. `http://www.example.com/admin/blog_posts/conditions_for_index`.
|
107
|
+
|
108
|
+
In a number of cases, you can get the same customization by passing a block to the builder object. For example, the code below works the same as the previous example:
|
109
|
+
|
110
|
+
class Admin::BlogPostsController < ApplicationController
|
111
|
+
layout 'admin'
|
112
|
+
|
113
|
+
admin_assistant_for BlogPost do |aa|
|
114
|
+
aa.index.conditions do |params|
|
115
|
+
"published_at is null" unless params[:all]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
The trade-off here is that customizing this behavior through a block is probably a little neater---fewer methods scattered all over your controller---but isn't bound to the controller. So if you find yourself needing some convenience methods on, say, `ApplicationController`, you'll be better off using a protected controller method.
|
121
|
+
|
122
|
+
#### Helper methods and partials
|
123
|
+
|
124
|
+
Other behaviors can be set by creating certain methods on the helper. Usually these behaviors have to do with presentation.
|
125
|
+
|
126
|
+
class Admin::UsersHelper
|
127
|
+
def password_input(user)
|
128
|
+
password_field_tag("user[password]", user.password, :disabled => true)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
Often you can accomplish the same thing with a partial. For example, the functionality in the above example could also be accomplished with the following saved in `app/views/admin/users/_password_input.html.erb`.
|
133
|
+
|
134
|
+
<%= password_field_tag("user[password]", user.password, :disabled => true) %>
|
135
|
+
|
136
|
+
#### Model methods
|
137
|
+
|
138
|
+
admin\_assistant can also look for methods to be defined on models, themselves. This is generally for behaviors that would apply across all admin controllers.
|
139
|
+
|
140
|
+
class ProductCategory < ActiveRecord::Base
|
141
|
+
def name_for_admin_assistant
|
142
|
+
self.category_name
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
Generally speaking there won't be many of these hooks, because in practice this can make the admin\_assistant API sort of invasive. Unless your Rails project is 99% the admin interface, it's going to get annoying to keep tripping over admin\_assistant-specific hooks when you're trying to write some front-facing code.
|
147
|
+
|
@@ -0,0 +1,108 @@
|
|
1
|
+
---
|
2
|
+
layout: api
|
3
|
+
title: Search
|
4
|
+
---
|
5
|
+
|
6
|
+
![index](../img/blog_posts-search.png)
|
7
|
+
|
8
|
+
Search restricts the records viewed in [Index] by various criteria. By default, search presents a single text field, and text entered in this field will be compared to all string and text fields in the table. By setting #columns you can have the search form specify which fields are being searched on.
|
9
|
+
|
10
|
+
Since search is closely related to [Index], its configuration is reached through the index builder:
|
11
|
+
|
12
|
+
class Admin::BlogPostsController < ApplicationController
|
13
|
+
admin_assistant_for BlogPost do |a|
|
14
|
+
a.index do |index|
|
15
|
+
index.search do |search|
|
16
|
+
search.columns :title, :user
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
You can chain calls to get to the search builder more quickly:
|
23
|
+
|
24
|
+
class Admin::BlogPostsController < ApplicationController
|
25
|
+
admin_assistant_for BlogPost do |a|
|
26
|
+
a.index.search do |search|
|
27
|
+
search.columns :title, :user
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
### Search config options
|
33
|
+
|
34
|
+
#### columns
|
35
|
+
<a name="builder_columns"></a>
|
36
|
+
|
37
|
+
search.columns :title, :user
|
38
|
+
|
39
|
+
Call this method to set the search to supply one input for each column. When you set multiple search columns, users get the option of searching on all entered columns or any of them.
|
40
|
+
|
41
|
+
You can also call this with Index#search:
|
42
|
+
|
43
|
+
index.search :title, :user
|
44
|
+
|
45
|
+
#### default\_search\_matches\_on
|
46
|
+
|
47
|
+
If you don't specify any columns, the search form is simply one field, and whatever text is entered in that field will be compared to every text and string field on the database table. If there are other fields you'd like the default search to compare with, you can add them using `default_search_matches_on`. For example, to give users the ability to search by ID:
|
48
|
+
|
49
|
+
index.search.default_search_matches_on :id
|
50
|
+
|
51
|
+
You can also pass in SQL fragments:
|
52
|
+
|
53
|
+
index.search.default_search_matches_on \
|
54
|
+
"concat_ws(' ', users.first_name, users.last_name)"
|
55
|
+
|
56
|
+
#### include\_params\_in\_form
|
57
|
+
|
58
|
+
index.search.include_params_in_form = true
|
59
|
+
|
60
|
+
This will put any custom page params in the search form to be posted with the search parameters. You might use this if you've got another way of filtering, say, blog posts by user, and you want the search form on that page to only search within blog posts by that user.
|
61
|
+
|
62
|
+
|
63
|
+
### Column config options
|
64
|
+
|
65
|
+
These are configurations that can be applied to specific columns in the search.
|
66
|
+
|
67
|
+
#### comparators
|
68
|
+
|
69
|
+
search[:price].comparators = false
|
70
|
+
|
71
|
+
By default, integer and datetime fields are presented with a list of options for comparing to the entered value: "greater than", "greater than or equal to", "equal to", "less than or equal to", and "less than". This way the user can do a search like "show me all products that cost more than $100."
|
72
|
+
|
73
|
+
To turn this off, set `comparators` to false.
|
74
|
+
|
75
|
+
#### compare\_to\_range
|
76
|
+
|
77
|
+
search[:price].compare_to_range = true
|
78
|
+
|
79
|
+
If you want to offer a ranged search, set `compare_to_range` to true. This will render two fields for greater-than and less-than in the search.
|
80
|
+
|
81
|
+
#### conditions
|
82
|
+
|
83
|
+
search[:has_short_title].field_type = :boolean
|
84
|
+
search[:has_short_title].conditions do |has_short_title|
|
85
|
+
if has_short_title
|
86
|
+
"length(title) < 10"
|
87
|
+
elsif has_short_title == false
|
88
|
+
"length(title) >= 10"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
To be used with a virtual column in search. The block should return a SQL fragment to add to the final query, or nil to not change anything.
|
93
|
+
|
94
|
+
#### match\_text\_fields\_for\_association
|
95
|
+
|
96
|
+
search[:user].match_text_fields_for_association
|
97
|
+
|
98
|
+
Only applies to belongs-to associations. By default, belongs-to associations will be searchable using a dropdown of the associated records that currently exist. Calling `match_text_fields_for_association` will mean the input for that association will be a text input instead, and that text will be matched against all text or string fields on the associated record.
|
99
|
+
|
100
|
+
For example, let's say you have a BlogPost that belongs to a User. With this configuration on Admin::BlogPostsController:
|
101
|
+
|
102
|
+
search.columns :user
|
103
|
+
search[:user].match_text_fields_for_association
|
104
|
+
|
105
|
+
... the search form will be one field, a text input labeled "User". If the user enters "an" in that field, it will match against all blog posts by the users with the username field of "Andy", "Andrew", and "Frank".
|
106
|
+
|
107
|
+
|
108
|
+
[Index]: ./idx.html
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
layout: api
|
3
|
+
title: Show
|
4
|
+
---
|
5
|
+
|
6
|
+
Show configuration affects what is displayed in a show page, e.g. `/admin/blog_posts/show/5`.
|
7
|
+
|
8
|
+
### Show config options
|
9
|
+
|
10
|
+
#### columns
|
11
|
+
|
12
|
+
admin_assistant_for BlogPost do |aa|
|
13
|
+
aa.show.columns :user, :title, :body
|
14
|
+
end
|
15
|
+
|
16
|
+
Shows only these columns in the show page.
|
17
|
+
|
18
|
+
### Partials
|
19
|
+
|
20
|
+
#### \_\[column\]\_for_show.html.erb
|
21
|
+
|
22
|
+
If this partial is present, it will be rendered instead of the default HTML for the column.
|
@@ -0,0 +1,27 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
title: Community
|
4
|
+
---
|
5
|
+
|
6
|
+
### Mailing list
|
7
|
+
|
8
|
+
We have a mailing list over at [Google Groups](http://groups.google.com/group/admin_assistant). If you have a question, please consider asking it there instead of a direct email, in the hopes that the next person who has the same question might find the answer by just Googling it.
|
9
|
+
|
10
|
+
<a name="whos_using"></a>
|
11
|
+
### Who's using admin\_assistant?
|
12
|
+
|
13
|
+
admin\_assistant is being used on the following sites:
|
14
|
+
|
15
|
+
* [boundlessny.com](http://www.boundlessny.com/) by [Michael Celona][mcelona]
|
16
|
+
* [casahelga.com](http://casahelga.com) by [Alex Farrill][afarrill]
|
17
|
+
* [fhwang.net](http://fhwang.net) by [Francis Hwang][fhwang]
|
18
|
+
* [sling.com](http://www.sling.com) by [Diversion Media](http://www.diversionmedia.com/)
|
19
|
+
* [stockblotter.com](http://stockblotter.com) by [Alex Farrill][afarrill]
|
20
|
+
|
21
|
+
If you're also using admin\_assistant, and would like to be listed here, please get in touch with us on the mailing list.
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
[afarrill]: http://www.linkedin.com/in/alexfarrill
|
26
|
+
[fhwang]: http://fhwang.net/
|
27
|
+
[mcelona]: http://www.linkedin.com/in/mcelona
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#lightbox{ position: absolute; left: 0; width: 100%; z-index: 100; text-align: center; line-height: 0;}
|
2
|
+
#lightbox img{ width: auto; height: auto;}
|
3
|
+
#lightbox a img{ border: none; }
|
4
|
+
|
5
|
+
#lightboxImage { border: 1px solid #008; }
|
6
|
+
|
7
|
+
#outerImageContainer{ position: relative; background-color: #fff; width: 250px; height: 250px; margin: 0 auto; }
|
8
|
+
#imageContainer{ padding: 10px; }
|
9
|
+
|
10
|
+
#loading{ position: absolute; top: 40%; left: 0%; height: 25%; width: 100%; text-align: center; line-height: 0; }
|
11
|
+
#hoverNav{ position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; }
|
12
|
+
#imageContainer>#hoverNav{ left: 0;}
|
13
|
+
#hoverNav a{ outline: none;}
|
14
|
+
|
15
|
+
#prevLink, #nextLink{ width: 49%; height: 100%; background-image: url(data:image/gif;base64,AAAA); /* Trick IE into showing hover */ display: block; }
|
16
|
+
#prevLink { left: 0; float: left;}
|
17
|
+
#nextLink { right: 0; float: right;}
|
18
|
+
#prevLink:hover, #prevLink:visited:hover { background: url(../img/lightbox/prevlabel.gif) left 15% no-repeat; }
|
19
|
+
#nextLink:hover, #nextLink:visited:hover { background: url(../img/lightbox/nextlabel.gif) right 15% no-repeat; }
|
20
|
+
|
21
|
+
#imageDataContainer{ font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; margin: 0 auto; line-height: 1.4em; overflow: auto; width: 100% ; }
|
22
|
+
|
23
|
+
#imageData{ padding:0 10px; color: #666; }
|
24
|
+
#imageData #imageDetails{ width: 70%; float: left; text-align: left; }
|
25
|
+
#imageData #caption{ font-weight: bold; }
|
26
|
+
#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em; }
|
27
|
+
#imageData #bottomNavClose{ width: 66px; float: right; padding-bottom: 0.7em; outline: none;}
|
28
|
+
|
29
|
+
#overlay{ position: absolute; top: 0; left: 0; z-index: 90; width: 100%; height: 500px; background-color: #000; }
|
@@ -0,0 +1,70 @@
|
|
1
|
+
body {
|
2
|
+
margin: 0;
|
3
|
+
font-family: Verdana, "Bitstream Vera Sans", sans-serif;
|
4
|
+
}
|
5
|
+
|
6
|
+
h1 {
|
7
|
+
width: 900px;
|
8
|
+
margin: auto;
|
9
|
+
padding: 10px;
|
10
|
+
}
|
11
|
+
|
12
|
+
h1 a, h1 a:visited {
|
13
|
+
text-decoration: none;
|
14
|
+
color: black;
|
15
|
+
}
|
16
|
+
|
17
|
+
h1 a:hover {
|
18
|
+
background: #ff3;
|
19
|
+
}
|
20
|
+
|
21
|
+
code {
|
22
|
+
background: #ffd;
|
23
|
+
border: #ff6 1px solid;
|
24
|
+
font-size: large;
|
25
|
+
}
|
26
|
+
|
27
|
+
pre {
|
28
|
+
background: #ffd;
|
29
|
+
border: #ff6 1px solid;
|
30
|
+
padding: 5px;
|
31
|
+
font-size: large;
|
32
|
+
}
|
33
|
+
|
34
|
+
pre code {
|
35
|
+
border: none;
|
36
|
+
}
|
37
|
+
|
38
|
+
#body {
|
39
|
+
width: 900px;
|
40
|
+
margin: auto;
|
41
|
+
padding-bottom: 25px;
|
42
|
+
}
|
43
|
+
|
44
|
+
#page_header {
|
45
|
+
background: #ffc
|
46
|
+
}
|
47
|
+
|
48
|
+
#page_header .nav {
|
49
|
+
width: 900px;
|
50
|
+
margin: auto;
|
51
|
+
padding-bottom: 10px;
|
52
|
+
}
|
53
|
+
|
54
|
+
#page_header .nav a, #page_header .nav a:visited {
|
55
|
+
text-decoration: none;
|
56
|
+
color: black;
|
57
|
+
}
|
58
|
+
|
59
|
+
#page_header .nav a:hover {
|
60
|
+
background: #ff3;
|
61
|
+
}
|
62
|
+
|
63
|
+
.subnav {
|
64
|
+
margin-top: -20px;
|
65
|
+
font-size: small;
|
66
|
+
}
|
67
|
+
|
68
|
+
.thumb {
|
69
|
+
margin-right: 10px;
|
70
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
title: Design principles
|
4
|
+
---
|
5
|
+
|
6
|
+
admin\_assistant is built with a few design principles in mind:
|
7
|
+
|
8
|
+
### Relentless full-stack testing
|
9
|
+
|
10
|
+
admin\_assistant is tested against a complete, self-contained Rails app in the `test_rails_app` directory. This app serves as the reference implementation of admin\_assistant, so new features can be added with minimal worry of breaking old features.
|
11
|
+
|
12
|
+
In addition, this test suite can be run against multiple versions of Rails, making multi-version support possible.
|
13
|
+
|
14
|
+
|
15
|
+
### Wide support of Rails versions
|
16
|
+
|
17
|
+
admin\_assistant currently supports six versions of Rails: 2.1.0, 2.1.2, 2.2.2, 2.3.2, 2.3.3, and 2.3.4. We offer this support by writing a test suite that can be run with different versions of Rails. After all, it doesn't make any sense to release a plugin intended for other programmers' convenience, and then tell them to drop everything and spend the next two weeks upgrading their whole app.
|
18
|
+
|
19
|
+
|
20
|
+
### Deeply customizable API
|
21
|
+
|
22
|
+
It's great to be able to do the quick boilerplate CRUD operations, but it doesn't take long before you need a lot of custom functionality. So, while admin\_assistant can be set up in a few lines, its real strength is all the hooks it offers you:
|
23
|
+
|
24
|
+
* Labeling of models and columns
|
25
|
+
* Links at a page level, record level, or field level
|
26
|
+
* Selection of columns to include in index views and in forms
|
27
|
+
* Field value display in index views
|
28
|
+
* Custom inputs, submit buttons, descriptions in forms
|
29
|
+
* Partials can be rendered before or after forms, or column inputs.
|
30
|
+
* Custom options for date selects, datetime selects, textarea tags, etc. can be set up on a per-column level and passed through to the underlying Rails method.
|
31
|
+
* Custom redirecting after successful saves
|
32
|
+
|
33
|
+
If you're copying and pasting something out of `vendor/plugins/admin_assistant`, that's a design flaw.
|
34
|
+
|
35
|
+
|
36
|
+
### Minimally invasive
|
37
|
+
|
38
|
+
If you like, you can use admin\_assistant in a very self-contained way, meaning that any admin functionality you add to your application doesn't have to affect any other parts of the code.
|
39
|
+
|
40
|
+
For example, standard ActiveRecord callbacks like `after_save` and `before_create` can be mimicked in the admin controller, in case you want to contain that code to one particular controller, instead of having to think about how it might affect other code that's using that model.
|
41
|
+
|
42
|
+
In addition, admin\_assistant doesn't override or `alias_method_chain` anything in Rails core, which greatly reduces the possibility that admin\_assistant would conflict with another plugin.
|
43
|
+
|
44
|
+
|
45
|
+
### Safe defaults
|
46
|
+
|
47
|
+
admin\_assistant is opinionated in its own way, much of which has to do with picking the most safe default behavior possible.
|
48
|
+
|
49
|
+
* The `destroy` action is turned off by default, since the decision to allow a way to erase production data should be taken seriously.
|
50
|
+
* Date selects and datetime selects in forms are blank by default, not the current date or time. This helps avoid a situation on models with many fields where dates and datetimes can be set by accident, changing the site's behavior in unexpected ways. The current date or time is usually not a useful default, anyway.
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,35 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
---
|
4
|
+
|
5
|
+
admin\_assistant is a Rails plugin that automates a lot of features typically needed in admin controllers. It is written and maintained by [Francis Hwang][fhwang].
|
6
|
+
|
7
|
+
admin\_assistant is in beta, meaning that it is stable, and being used in production sites, but there may be small API changes in the future.
|
8
|
+
|
9
|
+
It currently supports Rails 2.1.0, 2.1.2, 2.2.2, 2.3.2, 2.3.3, and 2.3.4. There are no plans to support Rails 2.0 or earlier.
|
10
|
+
|
11
|
+
|
12
|
+
## Features
|
13
|
+
|
14
|
+
* Built-in model creation, updating, and deletion.
|
15
|
+
* Live querying of models, which allows incremental development of controllers without the maintenance problems of generated code.
|
16
|
+
* Paginated indexes with built field-ordering.
|
17
|
+
* Highly customizable search that allows customization of individual fields, numerical comparators, and boolean operators.
|
18
|
+
* Built-in Ajax autocompleters for handling belongs-to associations.
|
19
|
+
* Built-in widgets for handling polymorphic belongs-to associations.
|
20
|
+
* Built-in support for images with either [Paperclip](http://thoughtbot.com/projects/paperclip) or [FileColumn](http://www.kanthak.net/opensource/file_column/).
|
21
|
+
* Heavily hookable interface allows customization of columns, search parameters, form inputs, parameter handling, and model creation.
|
22
|
+
|
23
|
+
|
24
|
+
## Still not convinced?
|
25
|
+
|
26
|
+
Check out our [screenshots](./screenshots.html), [who's using admin\_assistant](./community.html#whos_using), or our [design principles](./design_principles.html).
|
27
|
+
|
28
|
+
|
29
|
+
## Ready to give it a try?
|
30
|
+
|
31
|
+
[Getting started](./getting_started.html) is easy.
|
32
|
+
|
33
|
+
[afarrill]: http://github.com/alexfarrill
|
34
|
+
[fhwang]: http://fhwang.net/
|
35
|
+
[mcelona]: http://github.com/mcelona
|