fat_free_crm 0.11.3 → 0.11.4
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.
Potentially problematic release.
This version of fat_free_crm might be problematic. Click here for more details.
- data/.gitignore +1 -0
- data/.travis.yml +2 -2
- data/CHANGELOG +6 -1
- data/CONTRIBUTORS +40 -1
- data/Capfile +5 -0
- data/Gemfile +25 -6
- data/Gemfile.lock +128 -86
- data/README.md +23 -16
- data/{vendor → app}/assets/images/delete.png +0 -0
- data/app/assets/javascripts/admin/fields.js.coffee +62 -0
- data/app/assets/javascripts/application.js.erb +8 -1
- data/app/assets/javascripts/crm.js +44 -46
- data/app/assets/javascripts/crm_chosen.js.coffee +10 -7
- data/app/assets/javascripts/datepicker.js.coffee +15 -0
- data/app/assets/javascripts/format_buttons.js.coffee +48 -0
- data/app/assets/javascripts/{admin/field_groups.js.coffee → groups.js.coffee} +0 -0
- data/app/assets/javascripts/lists.js.coffee +1 -1
- data/app/assets/javascripts/search.js.coffee +56 -38
- data/app/assets/stylesheets/admin/{field_groups.css.scss → fields.css.scss} +4 -0
- data/app/assets/stylesheets/advanced_search.css.scss +79 -0
- data/app/assets/stylesheets/application.css.erb +4 -0
- data/app/assets/stylesheets/base.scss +3 -3
- data/app/assets/stylesheets/common.scss +72 -25
- data/app/assets/stylesheets/fields.scss +14 -0
- data/app/assets/stylesheets/format_buttons.css.scss +30 -0
- data/app/assets/stylesheets/groups.css.scss +3 -0
- data/app/assets/stylesheets/header.scss +7 -6
- data/{vendor/plugins/.gitkeep → app/assets/stylesheets/index_headers.css.scss} +0 -0
- data/app/assets/stylesheets/print.css.scss +12 -3
- data/app/assets/stylesheets/rails.scss +12 -3
- data/app/controllers/admin/application_controller.rb +1 -1
- data/app/controllers/admin/field_groups_controller.rb +2 -0
- data/app/controllers/admin/fields_controller.rb +41 -17
- data/app/controllers/admin/groups_controller.rb +70 -0
- data/app/controllers/admin/tags_controller.rb +1 -0
- data/app/controllers/admin/users_controller.rb +8 -7
- data/app/controllers/application_controller.rb +34 -5
- data/app/controllers/comments_controller.rb +2 -3
- data/app/controllers/entities/accounts_controller.rb +30 -37
- data/app/controllers/entities/campaigns_controller.rb +56 -29
- data/app/controllers/entities/contacts_controller.rb +24 -26
- data/app/controllers/entities/leads_controller.rb +38 -37
- data/app/controllers/entities/opportunities_controller.rb +28 -34
- data/app/controllers/entities_controller.rb +71 -43
- data/app/controllers/home_controller.rb +29 -27
- data/app/controllers/tasks_controller.rb +18 -17
- data/app/controllers/users_controller.rb +12 -8
- data/app/helpers/accounts_helper.rb +58 -16
- data/app/helpers/addresses_helper.rb +4 -1
- data/app/helpers/admin/fields_helper.rb +3 -4
- data/app/helpers/application_helper.rb +147 -100
- data/app/helpers/campaigns_helper.rb +2 -9
- data/app/helpers/fields_helper.rb +0 -1
- data/app/helpers/groups_helper.rb +2 -0
- data/app/helpers/home_helper.rb +11 -0
- data/app/helpers/leads_helper.rb +2 -9
- data/app/helpers/opportunities_helper.rb +2 -9
- data/app/helpers/{crm_tags_helper.rb → tags_helper.rb} +9 -8
- data/app/helpers/tasks_helper.rb +5 -21
- data/app/helpers/users_helper.rb +14 -7
- data/app/helpers/versions_helper.rb +46 -0
- data/app/inputs/date_time_input.rb +8 -25
- data/app/inputs/datepair_input.rb +77 -0
- data/app/inputs/datetimepair_input.rb +37 -0
- data/app/mailers/user_mailer.rb +10 -0
- data/app/models/entities/account.rb +18 -11
- data/app/models/entities/account_contact.rb +4 -3
- data/app/models/entities/account_opportunity.rb +0 -1
- data/app/models/entities/campaign.rb +6 -7
- data/app/models/entities/contact.rb +53 -25
- data/app/models/entities/contact_opportunity.rb +0 -1
- data/app/models/entities/lead.rb +24 -13
- data/app/models/entities/opportunity.rb +34 -16
- data/app/models/fields/custom_field.rb +29 -13
- data/app/models/fields/custom_field_date_pair.rb +58 -0
- data/app/models/fields/custom_field_datetime_pair.rb +28 -0
- data/app/models/fields/custom_field_pair.rb +54 -0
- data/app/models/fields/field.rb +60 -43
- data/app/models/fields/field_group.rb +0 -9
- data/app/models/observers/entity_observer.rb +29 -0
- data/app/models/observers/opportunity_observer.rb +3 -0
- data/app/models/polymorphic/address.rb +14 -0
- data/app/models/polymorphic/avatar.rb +13 -1
- data/app/models/polymorphic/email.rb +1 -1
- data/app/models/polymorphic/task.rb +14 -13
- data/app/models/setting.rb +14 -21
- data/app/models/users/ability.rb +25 -4
- data/app/models/users/group.rb +13 -0
- data/app/models/users/permission.rb +3 -1
- data/app/models/users/preference.rb +1 -2
- data/app/models/users/user.rb +25 -3
- data/app/views/accounts/_account.html.haml +5 -39
- data/app/views/accounts/_edit.html.haml +3 -2
- data/app/views/accounts/_index_brief.html.haml +32 -0
- data/app/views/accounts/_index_long.html.haml +42 -0
- data/app/views/accounts/_new.html.haml +3 -2
- data/app/views/accounts/_sidebar_index.html.haml +3 -4
- data/app/views/accounts/_sidebar_show.html.haml +2 -2
- data/app/views/accounts/_title_bar.html.haml +11 -0
- data/app/views/accounts/_top_section.html.haml +1 -1
- data/app/views/accounts/create.js.rjs +1 -2
- data/app/views/accounts/destroy.js.rjs +1 -1
- data/app/views/accounts/edit.js.rjs +0 -2
- data/app/views/accounts/index.html.haml +6 -13
- data/app/views/accounts/index.js.rjs +3 -1
- data/app/views/accounts/index.xls.builder +82 -0
- data/app/views/accounts/new.js.rjs +0 -2
- data/app/views/accounts/show.html.haml +17 -15
- data/app/views/accounts/show.js.erb +2 -0
- data/app/views/admin/custom_fields/_base_field.html.haml +21 -0
- data/app/views/admin/custom_fields/_check_boxes_field.html.haml +6 -0
- data/app/views/admin/custom_fields/_date_field.html.haml +14 -0
- data/app/views/admin/custom_fields/_date_pair_field.html.haml +21 -0
- data/app/views/admin/custom_fields/_datetime_field.html.haml +14 -0
- data/app/views/admin/custom_fields/_datetime_pair_field.html.haml +21 -0
- data/app/views/admin/custom_fields/_radio_field.html.haml +6 -0
- data/app/views/admin/custom_fields/_select_field.html.haml +25 -0
- data/app/views/admin/custom_fields/_string_field.html.haml +2 -0
- data/app/views/admin/field_groups/_field_group.html.haml +7 -5
- data/app/views/admin/field_groups/_top_section.html.haml +4 -3
- data/app/views/admin/field_groups/create.js.rjs +1 -2
- data/app/views/admin/fields/_field.html.haml +5 -3
- data/app/views/admin/fields/_form.html.haml +35 -0
- data/app/views/admin/fields/_subform.html.haml +6 -0
- data/app/views/admin/fields/create.js.erb +19 -0
- data/app/views/admin/fields/destroy.js.erb +9 -0
- data/app/views/admin/fields/edit.js.erb +1 -0
- data/app/views/admin/fields/index.html.haml +11 -8
- data/app/views/admin/fields/update.js.erb +13 -0
- data/app/views/admin/groups/_edit.html.haml +12 -0
- data/app/views/admin/groups/_form.html.haml +13 -0
- data/app/views/admin/groups/_group.html.haml +15 -0
- data/app/views/admin/groups/_new.html.haml +12 -0
- data/app/views/admin/groups/create.js.rjs +11 -0
- data/app/views/admin/{fields → groups}/destroy.js.rjs +3 -3
- data/app/views/admin/groups/edit.js.rjs +21 -0
- data/app/views/admin/groups/index.html.haml +18 -0
- data/app/views/admin/groups/index.js.rjs +2 -0
- data/app/views/admin/groups/new.js.rjs +9 -0
- data/app/views/admin/groups/show.html.haml +11 -0
- data/app/views/admin/groups/update.js.rjs +10 -0
- data/app/views/admin/users/_profile.html.haml +13 -1
- data/app/views/admin/users/_user.html.haml +7 -2
- data/app/views/admin/users/index.js.rjs +1 -0
- data/app/views/application/index.atom.builder +1 -1
- data/app/views/application/index.rss.builder +1 -1
- data/app/views/application/show.atom.builder +32 -0
- data/app/views/application/show.rss.builder +29 -0
- data/app/views/campaigns/_campaign.html.haml +5 -21
- data/app/views/campaigns/_edit.html.haml +3 -2
- data/app/views/campaigns/_index_brief.html.haml +15 -0
- data/app/views/campaigns/_index_long.html.haml +20 -0
- data/app/views/campaigns/_new.html.haml +4 -2
- data/app/views/campaigns/_sidebar_index.html.haml +3 -3
- data/app/views/campaigns/_title_bar.html.haml +11 -0
- data/app/views/campaigns/_top_section.html.haml +2 -2
- data/app/views/campaigns/create.js.rjs +1 -4
- data/app/views/campaigns/destroy.js.rjs +1 -1
- data/app/views/campaigns/edit.js.rjs +0 -4
- data/app/views/campaigns/index.html.haml +6 -13
- data/app/views/campaigns/index.js.rjs +3 -1
- data/app/views/campaigns/index.xls.builder +75 -0
- data/app/views/campaigns/new.js.rjs +0 -4
- data/app/views/campaigns/show.html.haml +17 -15
- data/app/views/campaigns/show.js.erb +2 -0
- data/app/views/campaigns/update.js.rjs +0 -2
- data/app/views/comments/_comment.html.haml +6 -5
- data/app/views/comments/_edit.html.haml +5 -5
- data/app/views/comments/_new.html.haml +6 -5
- data/app/views/comments/create.js.rjs +1 -1
- data/app/views/contacts/_contact.html.haml +5 -52
- data/app/views/contacts/_contacts.html.haml +1 -0
- data/app/views/contacts/_edit.html.haml +3 -2
- data/app/views/contacts/_index_brief.html.haml +25 -0
- data/app/views/contacts/_index_full.html.haml +57 -0
- data/app/views/contacts/_index_long.html.haml +43 -0
- data/app/views/contacts/_new.html.haml +4 -2
- data/app/views/contacts/_section_extra.html.haml +26 -0
- data/app/views/contacts/_section_general.html.haml +22 -0
- data/app/views/contacts/_sidebar_index.html.haml +0 -3
- data/app/views/contacts/_sidebar_show.html.haml +2 -10
- data/app/views/contacts/_title_bar.html.haml +11 -0
- data/app/views/contacts/_top_section.html.haml +1 -1
- data/app/views/contacts/create.js.rjs +1 -2
- data/app/views/contacts/destroy.js.rjs +1 -1
- data/app/views/contacts/edit.js.rjs +0 -2
- data/app/views/contacts/index.html.haml +6 -14
- data/app/views/contacts/index.js.rjs +3 -1
- data/app/views/contacts/index.xls.builder +102 -0
- data/app/views/contacts/new.js.rjs +0 -2
- data/app/views/contacts/show.html.haml +15 -15
- data/app/views/contacts/show.js.erb +2 -0
- data/app/views/entities/_basic_search.html.haml +22 -0
- data/app/views/entities/_permissions.html.haml +41 -0
- data/app/views/entities/_search.html.haml +15 -0
- data/app/views/entities/_section_custom_fields.html.haml +11 -0
- data/app/views/entities/_title_bar.html.haml +12 -0
- data/app/views/entities/attach.js.rjs +1 -1
- data/app/views/entities/opportunities.js.rjs +1 -1
- data/app/views/entities/versions.js.erb +3 -0
- data/app/views/fields/_edit_custom_field_group.html.haml +8 -0
- data/app/views/fields/_group.html.haml +11 -20
- data/app/views/fields/_group_table.html.haml +13 -0
- data/app/views/fields/_group_view.html.haml +7 -0
- data/app/views/fields/_groups.html.haml +1 -4
- data/app/views/fields/_sidebar_show.html.haml +5 -4
- data/app/views/home/_account.html.haml +29 -0
- data/app/views/home/_activity.html.haml +16 -6
- data/app/views/home/_opportunity.html.haml +41 -0
- data/app/views/home/_options.html.haml +1 -1
- data/app/views/home/_task.html.haml +46 -0
- data/app/views/home/index.html.haml +32 -1
- data/app/views/home/index.js.rjs +1 -0
- data/app/views/layouts/_header.html.haml +3 -3
- data/app/views/layouts/_sidebar.html.haml +1 -3
- data/app/views/layouts/_tabbed.html.haml +2 -3
- data/app/views/layouts/_tabless.html.haml +1 -1
- data/app/views/layouts/admin/_header.html.haml +1 -1
- data/app/views/layouts/application.html.haml +7 -8
- data/app/views/layouts/header.xls.builder +8 -0
- data/app/views/leads/_contact.html.haml +1 -2
- data/app/views/leads/_convert.html.haml +1 -2
- data/app/views/leads/_convert_permissions.html.haml +21 -11
- data/app/views/leads/_edit.html.haml +3 -2
- data/app/views/leads/_index_brief.html.haml +41 -0
- data/app/views/leads/_index_long.html.haml +62 -0
- data/app/views/leads/_lead.html.haml +5 -62
- data/app/views/leads/_new.html.haml +4 -2
- data/app/views/leads/_opportunity.html.haml +1 -1
- data/app/views/leads/_sidebar_index.html.haml +3 -3
- data/app/views/leads/_sidebar_show.html.haml +3 -3
- data/app/views/leads/_status.html.haml +1 -1
- data/app/views/leads/_title_bar.html.haml +16 -0
- data/app/views/leads/convert.js.rjs +0 -1
- data/app/views/leads/create.js.rjs +1 -2
- data/app/views/leads/destroy.js.rjs +1 -1
- data/app/views/leads/edit.js.rjs +0 -2
- data/app/views/leads/index.html.haml +6 -13
- data/app/views/leads/index.js.rjs +3 -1
- data/app/views/leads/index.xls.builder +100 -0
- data/app/views/leads/new.js.rjs +0 -2
- data/app/views/leads/promote.js.rjs +0 -1
- data/app/views/leads/show.html.haml +13 -18
- data/app/views/leads/show.js.erb +2 -0
- data/app/views/{shared/_lists.html.haml → lists/_sidebar.html.haml} +0 -0
- data/app/views/lists/create.js.rjs +1 -1
- data/app/views/opportunities/_edit.html.haml +3 -2
- data/app/views/opportunities/_index_brief.html.haml +29 -0
- data/app/views/opportunities/_index_long.html.haml +59 -0
- data/app/views/opportunities/_new.html.haml +4 -2
- data/app/views/opportunities/_opportunity.html.haml +5 -57
- data/app/views/opportunities/_sidebar_index.html.haml +3 -3
- data/app/views/opportunities/_sidebar_show.html.haml +2 -2
- data/app/views/opportunities/_title_bar.html.haml +11 -0
- data/app/views/opportunities/_top_section.html.haml +2 -2
- data/app/views/opportunities/create.js.rjs +4 -6
- data/app/views/opportunities/destroy.js.rjs +1 -1
- data/app/views/opportunities/edit.js.rjs +0 -3
- data/app/views/opportunities/index.html.haml +6 -14
- data/app/views/opportunities/index.js.rjs +3 -1
- data/app/views/opportunities/index.xls.builder +69 -0
- data/app/views/opportunities/new.js.rjs +1 -5
- data/app/views/opportunities/show.html.haml +14 -14
- data/app/views/opportunities/show.js.erb +2 -0
- data/app/views/opportunities/update.js.rjs +0 -1
- data/app/views/passwords/new.html.haml +1 -1
- data/app/views/shared/_add_comment.html.haml +8 -0
- data/app/views/shared/_address.html.haml +1 -1
- data/app/views/shared/_address_show.html.haml +1 -1
- data/app/views/shared/_edit_comment.html.haml +2 -2
- data/app/views/shared/_export.html.haml +2 -1
- data/app/views/shared/_paginate_with_per_page.html.haml +14 -0
- data/app/views/shared/_recently.html.haml +1 -1
- data/app/views/shared/_search.html.haml +1 -1
- data/app/views/shared/_tags.html.haml +1 -2
- data/app/views/shared/_tasks.html.haml +2 -2
- data/app/views/tasks/_completed.html.haml +3 -3
- data/app/views/tasks/_new.html.haml +1 -1
- data/app/views/tasks/_pending.html.haml +2 -3
- data/app/views/tasks/_sidebar_index.html.haml +2 -2
- data/app/views/tasks/_top_section.html.haml +5 -3
- data/app/views/tasks/create.js.rjs +3 -4
- data/app/views/tasks/edit.js.rjs +2 -4
- data/app/views/tasks/index.html.haml +1 -1
- data/app/views/tasks/index.xls.builder +47 -0
- data/app/views/tasks/new.js.rjs +0 -2
- data/app/views/tasks/update.js.rjs +0 -1
- data/app/views/user_mailer/assigned_entity_notification.html.haml +3 -0
- data/app/views/users/_user.html.haml +2 -2
- data/app/views/users/_user_report.html.haml +6 -0
- data/app/views/users/opportunities_overview.html.haml +16 -0
- data/app/views/users/show.html.haml +2 -3
- data/app/views/users/update.js.rjs +1 -1
- data/app/views/versions/_version.html.haml +4 -19
- data/app/views/versions/_version_item.html.haml +8 -0
- data/app/views/versions/_versions.html.haml +9 -9
- data/config/application.rb +10 -2
- data/config/deploy.example.rb +47 -0
- data/config/environments/development.rb +1 -0
- data/config/environments/production.rb +1 -3
- data/config/environments/staging.rb +1 -1
- data/config/initializers/action_mailer.rb +10 -8
- data/config/initializers/custom_fields.rb +21 -0
- data/config/initializers/gravatar.rb +7 -0
- data/config/initializers/paper_trail.rb +1 -0
- data/config/initializers/ransack.rb +15 -0
- data/config/initializers/simple_form.rb +1 -2
- data/config/initializers/views.rb +42 -0
- data/config/locales/cz_fat_free_crm.yml +0 -10
- data/config/locales/de_fat_free_crm.yml +23 -21
- data/config/locales/en-GB_fat_free_crm.yml +241 -25
- data/config/locales/en-US_fat_free_crm.yml +139 -57
- data/config/locales/en-US_ransack.yml +92 -0
- data/config/locales/es_fat_free_crm.yml +0 -6
- data/config/locales/fr-CA_fat_free_crm.yml +0 -6
- data/config/locales/fr_fat_free_crm.yml +3 -14
- data/config/locales/it_fat_free_crm.yml +0 -11
- data/config/locales/ja_fat_free_crm.yml +0 -10
- data/config/locales/pl_fat_free_crm.yml +0 -6
- data/config/locales/pt-BR_fat_free_crm.yml +0 -6
- data/config/locales/ru_fat_free_crm.yml +0 -9
- data/config/locales/sv-SE_fat_free_crm.yml +0 -10
- data/config/locales/th_fat_free_crm.yml +0 -6
- data/config/locales/zh-CN.yml +4 -0
- data/config/locales/zh-CN_fat_free_crm.yml +78 -47
- data/config/routes.rb +13 -0
- data/config/settings.default.yml +20 -20
- data/db/demo/addresses.yml +2 -2
- data/db/migrate/20100928030598_create_sessions.rb +5 -0
- data/db/migrate/20100928030627_acts_as_taggable_on_migration.rb +6 -6
- data/db/migrate/20111201030535_add_field_groups_klass_name.rb +2 -1
- data/db/migrate/20120406082136_create_groups.rb +19 -0
- data/db/migrate/20120510025219_add_not_null_constraints_for_timestamp_columns.rb +21 -0
- data/db/migrate/20120528102124_increase_length_of_version_events.rb +9 -0
- data/db/migrate/20120801032706_add_pair_id_to_fields.rb +5 -0
- data/db/migrate/20121003063155_add_settings_to_custom_fields.rb +5 -0
- data/db/migrate/20121221033947_fix_country_mapping.rb +32 -0
- data/db/schema.rb +25 -6
- data/fat_free_crm.gemspec +16 -13
- data/lib/fat_free_crm.rb +2 -0
- data/lib/fat_free_crm/comment_extensions.rb +23 -0
- data/lib/fat_free_crm/core_ext/array.rb +8 -2
- data/lib/fat_free_crm/fields.rb +24 -2
- data/lib/fat_free_crm/gem_dependencies.rb +7 -1
- data/lib/fat_free_crm/permissions.rb +47 -26
- data/lib/fat_free_crm/version.rb +1 -1
- data/lib/fat_free_crm/view_factory.rb +95 -0
- data/lib/plugins/country_select/lib/country_select.rb +393 -374
- data/lib/tasks/{plugins.rake → db/migrate.rake} +1 -1
- data/lib/tasks/{schema_upgrade.rake → db/schema.rake} +2 -1
- data/lib/tasks/{mail_processing.rake → ffcrm/comment_replies.rake} +2 -21
- data/lib/tasks/ffcrm/config.rake +33 -0
- data/lib/tasks/{demo.rake → ffcrm/demo.rake} +3 -2
- data/lib/tasks/ffcrm/dropbox.rake +42 -0
- data/lib/tasks/ffcrm/settings.rake +46 -0
- data/lib/tasks/{fat_free_crm.rake → ffcrm/setup.rake} +1 -39
- data/lib/tasks/ffcrm/update_data.rake +256 -0
- data/{acceptance → spec/acceptance}/acceptance_helper.rb +5 -4
- data/{acceptance → spec/acceptance}/accounts_spec.rb +36 -10
- data/spec/acceptance/admin/groups_spec.rb +26 -0
- data/spec/acceptance/admin/users_spec.rb +34 -0
- data/spec/acceptance/campaigns_spec.rb +101 -0
- data/spec/acceptance/contacts_spec.rb +101 -0
- data/spec/acceptance/dashboard_spec.rb +62 -0
- data/spec/acceptance/leads_spec.rb +109 -0
- data/spec/acceptance/opportunities_overview_spec.rb +82 -0
- data/spec/acceptance/opportunities_spec.rb +103 -0
- data/{acceptance → spec/acceptance}/support/browser.rb +0 -0
- data/{acceptance → spec/acceptance}/support/headless.rb +0 -0
- data/{acceptance → spec/acceptance}/support/helpers.rb +8 -1
- data/{acceptance → spec/acceptance}/support/maintain_sessions.rb +0 -0
- data/spec/acceptance/support/paths.rb +42 -0
- data/spec/acceptance/support/selector_helpers.rb +31 -0
- data/spec/acceptance/tasks_spec.rb +85 -0
- data/spec/controllers/admin/groups_controller_spec.rb +5 -0
- data/spec/controllers/admin/users_controller_spec.rb +2 -3
- data/spec/controllers/applications_controller_spec.rb +40 -0
- data/spec/controllers/comments_controller_spec.rb +5 -6
- data/spec/controllers/emails_controller_spec.rb +1 -2
- data/spec/controllers/entities/accounts_controller_spec.rb +65 -81
- data/spec/controllers/entities/campaigns_controller_spec.rb +69 -85
- data/spec/controllers/entities/contacts_controller_spec.rb +78 -95
- data/spec/controllers/entities/leads_controller_spec.rb +105 -127
- data/spec/controllers/entities/opportunities_controller_spec.rb +88 -103
- data/spec/controllers/entities_controller_spec.rb +39 -0
- data/spec/controllers/home_controller_spec.rb +101 -11
- data/spec/controllers/tasks_controller_spec.rb +27 -32
- data/spec/controllers/users_controller_spec.rb +95 -28
- data/spec/factories/account_factories.rb +2 -2
- data/spec/factories/opportunity_factories.rb +12 -4
- data/spec/factories/task_factories.rb +4 -0
- data/spec/factories/user_factories.rb +9 -2
- data/spec/helpers/application_helper_spec.rb +15 -1
- data/spec/helpers/groups_helper_spec.rb +15 -0
- data/spec/helpers/users_helper_spec.rb +26 -4
- data/spec/lib/comment_extensions_spec.rb +29 -0
- data/spec/lib/core_ext/{string.rb → string_spec.rb} +0 -1
- data/spec/lib/fields_spec.rb +104 -0
- data/spec/lib/permissions_spec.rb +144 -0
- data/spec/lib/view_factory_spec.rb +68 -0
- data/spec/mailers/subscription_mailer_spec.rb +18 -4
- data/spec/mailers/user_mailer_spec.rb +134 -0
- data/spec/models/entities/account_spec.rb +44 -4
- data/spec/models/entities/campaign_spec.rb +3 -4
- data/spec/models/entities/contact_spec.rb +45 -5
- data/spec/models/entities/lead_spec.rb +3 -4
- data/spec/models/entities/opportunity_spec.rb +105 -9
- data/spec/models/fields/custom_field_date_pair_spec.rb +106 -0
- data/spec/models/fields/custom_field_pair_spec.rb +94 -0
- data/spec/models/fields/custom_field_spec.rb +43 -23
- data/spec/models/fields/field_spec.rb +3 -5
- data/spec/models/observers/entity_observer_spec.rb +65 -0
- data/spec/models/polymorphic/task_spec.rb +74 -118
- data/spec/models/polymorphic/version_spec.rb +18 -18
- data/spec/models/users/group_spec.rb +5 -0
- data/spec/models/users/permission_spec.rb +18 -1
- data/spec/models/users/preference_spec.rb +5 -1
- data/spec/models/users/user_spec.rb +55 -8
- data/spec/shared/models.rb +54 -0
- data/spec/spec_helper.rb +82 -87
- data/spec/support/auth_macros.rb +2 -3
- data/spec/views/accounts/_edit.haml_spec.rb +1 -2
- data/spec/views/accounts/_new.haml_spec.rb +1 -2
- data/spec/views/accounts/create.rjs_spec.rb +1 -3
- data/spec/views/accounts/edit.rjs_spec.rb +3 -4
- data/spec/views/accounts/index.haml_spec.rb +9 -6
- data/spec/views/accounts/new.rjs_spec.rb +2 -9
- data/spec/views/accounts/show.haml_spec.rb +1 -2
- data/spec/views/accounts/update.rjs_spec.rb +2 -3
- data/spec/views/admin/users/_create.haml_spec.rb +1 -2
- data/spec/views/admin/users/create.rjs_spec.rb +1 -2
- data/spec/views/campaigns/_edit.haml_spec.rb +2 -3
- data/spec/views/campaigns/_new.haml_spec.rb +2 -3
- data/spec/views/campaigns/create.rjs_spec.rb +0 -3
- data/spec/views/campaigns/destroy.rjs_spec.rb +1 -2
- data/spec/views/campaigns/edit.rjs_spec.rb +3 -6
- data/spec/views/campaigns/index.haml_spec.rb +6 -3
- data/spec/views/campaigns/new.rjs_spec.rb +2 -13
- data/spec/views/campaigns/show.haml_spec.rb +4 -6
- data/spec/views/campaigns/update.rjs_spec.rb +2 -7
- data/spec/views/contacts/_edit.haml_spec.rb +6 -7
- data/spec/views/contacts/_new.haml_spec.rb +2 -3
- data/spec/views/contacts/create.rjs_spec.rb +1 -3
- data/spec/views/contacts/edit.rjs_spec.rb +3 -4
- data/spec/views/contacts/index.haml_spec.rb +6 -3
- data/spec/views/contacts/new.rjs_spec.rb +2 -11
- data/spec/views/contacts/show.haml_spec.rb +1 -2
- data/spec/views/contacts/update.rjs_spec.rb +2 -3
- data/spec/views/home/index.haml_spec.rb +6 -2
- data/spec/views/home/index.rjs_spec.rb +1 -2
- data/spec/views/home/options.rjs_spec.rb +1 -2
- data/spec/views/leads/_convert.haml_spec.rb +1 -2
- data/spec/views/leads/_edit.haml_spec.rb +2 -3
- data/spec/views/leads/_new.haml_spec.rb +2 -3
- data/spec/views/leads/_sidebar_show.haml_spec.rb +1 -2
- data/spec/views/leads/convert.rjs_spec.rb +3 -5
- data/spec/views/leads/edit.rjs_spec.rb +4 -5
- data/spec/views/leads/index.haml_spec.rb +6 -3
- data/spec/views/leads/new.rjs_spec.rb +2 -11
- data/spec/views/leads/promote.rjs_spec.rb +3 -5
- data/spec/views/leads/show.haml_spec.rb +1 -2
- data/spec/views/leads/update.rjs_spec.rb +2 -3
- data/spec/views/opportunities/_edit.haml_spec.rb +5 -6
- data/spec/views/opportunities/_new.haml_spec.rb +2 -4
- data/spec/views/opportunities/create.rjs_spec.rb +0 -2
- data/spec/views/opportunities/edit.rjs_spec.rb +3 -4
- data/spec/views/opportunities/index.haml_spec.rb +7 -4
- data/spec/views/opportunities/new.rjs_spec.rb +2 -12
- data/spec/views/opportunities/show.haml_spec.rb +1 -2
- data/spec/views/opportunities/update.rjs_spec.rb +2 -3
- data/spec/views/tasks/_edit.haml_spec.rb +1 -3
- data/spec/views/tasks/complete.rjs_spec.rb +2 -3
- data/spec/views/tasks/create.rjs_spec.rb +2 -2
- data/spec/views/tasks/edit.rjs_spec.rb +1 -2
- data/spec/views/tasks/new.rjs_spec.rb +1 -18
- data/spec/views/users/avatar.rjs_spec.rb +1 -2
- data/spec/views/users/change_password.rjs_spec.rb +1 -2
- data/spec/views/users/edit.rjs_spec.rb +1 -2
- data/spec/views/users/password.rjs_spec.rb +1 -1
- data/spec/views/users/update.rjs_spec.rb +1 -2
- data/spec/views/users/upload_avatar.rjs_spec.rb +6 -7
- data/vendor/assets/images/brief.png +0 -0
- data/vendor/assets/images/chosen-sprite.png +0 -0
- data/vendor/assets/images/full.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_flat_0_eeeeee_40x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_flat_100_ffffff_40x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_flat_25_3875d7_40x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_flat_55_ffffff_40x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_flat_65_3875d7_40x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
- data/vendor/assets/images/jquery-ui/{ui-icons_ef8c08_256x240.png → ui-icons_0073ea_256x240.png} +0 -0
- data/vendor/assets/images/jquery-ui/ui-icons_466bb1_256x240.png +0 -0
- data/vendor/assets/images/jquery-ui/{ui-icons_ffd27a_256x240.png → ui-icons_ff0084_256x240.png} +0 -0
- data/vendor/assets/images/long.png +0 -0
- data/vendor/assets/javascripts/chosen-jquery.js +3 -0
- data/vendor/assets/javascripts/chosen-prototype.js +3 -0
- data/vendor/assets/javascripts/chosen.jquery.coffee +574 -0
- data/vendor/assets/javascripts/chosen.proto.coffee +580 -0
- data/vendor/assets/javascripts/jquery.disable.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-addon.js +1882 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-af.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ca.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-cz.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-de.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-el.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-es.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-et.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-fi.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-fr-CA.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-fr.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-gl.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-he.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-hu.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-id.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-it.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ja.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ko.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-lt.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-nl.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-no.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-pl.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-pt.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ro.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ru.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-sk.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-sv.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-tr.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-vi.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-zh-CN.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-zh-TW.js +20 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-cz.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-de.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-en-GB.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-es.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-fr.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-it.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-ja.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-pl.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-pt-BR.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-ru.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-sv-SE.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-th.js +23 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-zh-CN.js +23 -0
- data/vendor/assets/javascripts/lib/abstract-chosen.coffee +110 -0
- data/vendor/assets/javascripts/lib/select-parser.coffee +51 -0
- data/vendor/assets/stylesheets/chosen.css.sass +361 -0
- data/vendor/assets/stylesheets/{jquery-ui.custom.css.erb → jquery-ui.custom.css} +70 -70
- data/zeus.json +21 -0
- metadata +304 -140
- data/acceptance/support/database_cleaner.rb +0 -16
- data/acceptance/support/paths.rb +0 -9
- data/app/views/accounts/_options.html.haml +0 -20
- data/app/views/accounts/_permissions.html.haml +0 -24
- data/app/views/accounts/options.js.rjs +0 -10
- data/app/views/admin/fields/_edit.html.haml +0 -9
- data/app/views/admin/fields/_new.html.haml +0 -10
- data/app/views/admin/fields/_options.html.haml +0 -12
- data/app/views/admin/fields/_top_section.html.haml +0 -54
- data/app/views/admin/fields/create.js.rjs +0 -16
- data/app/views/admin/fields/edit.js.rjs +0 -35
- data/app/views/admin/fields/index.js.rjs +0 -6
- data/app/views/admin/fields/new.js.rjs +0 -8
- data/app/views/admin/fields/options.js.rjs +0 -10
- data/app/views/admin/fields/update.js.rjs +0 -17
- data/app/views/campaigns/_options.html.haml +0 -20
- data/app/views/campaigns/_permissions.html.haml +0 -24
- data/app/views/campaigns/options.js.rjs +0 -10
- data/app/views/contacts/_options.html.haml +0 -21
- data/app/views/contacts/_permissions.html.haml +0 -24
- data/app/views/contacts/options.js.rjs +0 -10
- data/app/views/entities/_advanced_search.html.haml +0 -12
- data/app/views/entities/_condition_fields.html.haml +0 -14
- data/app/views/entities/_grouping_fields.html.haml +0 -12
- data/app/views/entities/advanced_search.js.rjs +0 -9
- data/app/views/entities/versions.js.rjs +0 -3
- data/app/views/leads/_options.html.haml +0 -21
- data/app/views/leads/_permissions.html.haml +0 -28
- data/app/views/leads/options.js.rjs +0 -10
- data/app/views/opportunities/_options.html.haml +0 -20
- data/app/views/opportunities/_permissions.html.haml +0 -24
- data/app/views/opportunities/options.js.rjs +0 -10
- data/app/views/shared/_outline.html.haml +0 -9
- data/app/views/shared/_per_page.html.haml +0 -10
- data/app/views/shared/_sort_by.html.haml +0 -10
- data/config/initializers/cancan.rb +0 -151
- data/config/initializers/squeel.rb +0 -5
- data/public/blank_iframe.html +0 -2
- data/spec/views/accounts/options.rjs_spec.rb +0 -59
- data/spec/views/campaigns/options.rjs_spec.rb +0 -60
- data/spec/views/contacts/options.rjs_spec.rb +0 -61
- data/spec/views/leads/options.rjs_spec.rb +0 -61
- data/spec/views/opportunities/options.rjs_spec.rb +0 -60
- data/vendor/assets/images/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_flat_10_000000_40x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-icons_222222_256x240.png +0 -0
- data/vendor/assets/images/jquery-ui/ui-icons_228ef1_256x240.png +0 -0
- data/vendor/assets/javascripts/calendar_date_select/calendar_date_select.js +0 -446
- data/vendor/assets/javascripts/calendar_date_select/format_american.js +0 -35
- data/vendor/assets/javascripts/calendar_date_select/format_danish.js +0 -31
- data/vendor/assets/javascripts/calendar_date_select/format_db.js +0 -27
- data/vendor/assets/javascripts/calendar_date_select/format_euro_24hr.js +0 -7
- data/vendor/assets/javascripts/calendar_date_select/format_euro_24hr_ymd.js +0 -7
- data/vendor/assets/javascripts/calendar_date_select/format_finnish.js +0 -32
- data/vendor/assets/javascripts/calendar_date_select/format_french.js +0 -24
- data/vendor/assets/javascripts/calendar_date_select/format_hyphen_ampm.js +0 -37
- data/vendor/assets/javascripts/calendar_date_select/format_iso_date.js +0 -29
- data/vendor/assets/javascripts/calendar_date_select/format_italian.js +0 -24
- data/vendor/assets/javascripts/calendar_date_select/locale/ar.js +0 -10
- data/vendor/assets/javascripts/calendar_date_select/locale/da.js +0 -11
- data/vendor/assets/javascripts/calendar_date_select/locale/de.js +0 -11
- data/vendor/assets/javascripts/calendar_date_select/locale/es.js +0 -11
- data/vendor/assets/javascripts/calendar_date_select/locale/fi.js +0 -10
- data/vendor/assets/javascripts/calendar_date_select/locale/fr.js +0 -11
- data/vendor/assets/javascripts/calendar_date_select/locale/it.js +0 -9
- data/vendor/assets/javascripts/calendar_date_select/locale/ja.js +0 -11
- data/vendor/assets/javascripts/calendar_date_select/locale/nl.js +0 -11
- data/vendor/assets/javascripts/calendar_date_select/locale/pl.js +0 -11
- data/vendor/assets/javascripts/calendar_date_select/locale/pt.js +0 -11
- data/vendor/assets/javascripts/calendar_date_select/locale/ru.js +0 -10
- data/vendor/assets/javascripts/calendar_date_select/locale/sl.js +0 -11
- data/vendor/assets/javascripts/calendar_date_select/locale/sv.js +0 -9
- data/vendor/assets/stylesheets/calendar_date_select/blue.css +0 -130
- data/vendor/assets/stylesheets/calendar_date_select/default.css +0 -135
- data/vendor/assets/stylesheets/calendar_date_select/green.css +0 -142
- data/vendor/assets/stylesheets/calendar_date_select/plain.css +0 -128
- data/vendor/assets/stylesheets/calendar_date_select/red.css +0 -135
- data/vendor/assets/stylesheets/calendar_date_select/silver.css +0 -133
- data/vendor/plugins/.gitkeep~master +0 -0
@@ -0,0 +1,82 @@
|
|
1
|
+
require File.expand_path("../acceptance_helper.rb", __FILE__)
|
2
|
+
|
3
|
+
feature 'Opportunities Overview', %q{
|
4
|
+
In order to keep track of my team's responsibilities
|
5
|
+
As a user
|
6
|
+
I want to see an overview of opportunities broken down by user
|
7
|
+
} do
|
8
|
+
|
9
|
+
background do
|
10
|
+
@me = FactoryGirl.create(:user)
|
11
|
+
|
12
|
+
login_as_user(@me)
|
13
|
+
end
|
14
|
+
|
15
|
+
scenario "Accessing Opportunity Overview via the nav" do
|
16
|
+
visit homepage
|
17
|
+
within ".tabs" do
|
18
|
+
click_link "Team"
|
19
|
+
end
|
20
|
+
|
21
|
+
current_path.should == opportunity_overview_page
|
22
|
+
end
|
23
|
+
|
24
|
+
scenario "Viewing Opportunity Overview when all opportunities have been assigned" do
|
25
|
+
user1 = FactoryGirl.create(:user, :first_name => "Brian", :last_name => 'Doyle-Murray')
|
26
|
+
FactoryGirl.create(:opportunity, :name => "Acting", :stage => 'prospecting', :assignee => user1)
|
27
|
+
FactoryGirl.create(:opportunity, :name => "Directing", :stage => 'won', :assignee => user1)
|
28
|
+
|
29
|
+
user2 = FactoryGirl.create(:user, :first_name => "Dean", :last_name => 'Stockwell')
|
30
|
+
account1 = FactoryGirl.create(:account, :name => 'Quantum Leap')
|
31
|
+
FactoryGirl.create(:opportunity, :name => "Leaping", :stage => 'prospecting', :account => account1, :assignee => user2)
|
32
|
+
FactoryGirl.create(:opportunity, :name => "Return Home", :stage => 'prospecting', :account => account1, :assignee => user2)
|
33
|
+
|
34
|
+
user3 = FactoryGirl.create(:user, :first_name => "Chris", :last_name => 'Jarvis')
|
35
|
+
FactoryGirl.create(:opportunity, :stage => 'won', :assignee => user3)
|
36
|
+
FactoryGirl.create(:opportunity, :stage => 'lost', :assignee => user3)
|
37
|
+
|
38
|
+
visit opportunity_overview_page
|
39
|
+
|
40
|
+
within "#user_#{user1.id}" do
|
41
|
+
page.should have_selector('.title', :text => 'Brian Doyle-Murray')
|
42
|
+
page.should have_content('Acting')
|
43
|
+
page.should_not have_content('Directing')
|
44
|
+
end
|
45
|
+
|
46
|
+
within "#user_#{user2.id}" do
|
47
|
+
page.should have_selector('.title', :text => 'Dean Stockwell')
|
48
|
+
page.should have_content('Leaping from Quantum Leap')
|
49
|
+
page.should have_content('Return Home from Quantum Leap')
|
50
|
+
end
|
51
|
+
|
52
|
+
page.should_not have_selector("#user_#{user3.id}")
|
53
|
+
|
54
|
+
page.should_not have_selector('#unassigned')
|
55
|
+
end
|
56
|
+
|
57
|
+
scenario "Viewing Opportunity Overview when all opportunities are unassigned" do
|
58
|
+
FactoryGirl.create(:opportunity, :name => "Acting", :stage => 'prospecting', :assignee => nil)
|
59
|
+
FactoryGirl.create(:opportunity, :name => "Presenting", :stage => 'won', :assignee => nil)
|
60
|
+
|
61
|
+
visit opportunity_overview_page
|
62
|
+
|
63
|
+
within "#unassigned" do
|
64
|
+
page.should have_selector('.title', :text => 'Unassigned Opportunities')
|
65
|
+
page.should have_content('Acting')
|
66
|
+
page.should_not have_content('Presenting')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
scenario "Viewing Opportunity Overview when there are no opportunities in the pipeline" do
|
71
|
+
FactoryGirl.create(:opportunity, :name => "Presenting", :stage => 'lost', :assignee => FactoryGirl.create(:user))
|
72
|
+
FactoryGirl.create(:opportunity, :name => "Eating", :stage => 'won', :assignee => nil)
|
73
|
+
|
74
|
+
visit opportunity_overview_page
|
75
|
+
|
76
|
+
page.should have_content('There are currently no outstanding opportunities.')
|
77
|
+
within "#main" do
|
78
|
+
page.should_not have_content("Presenting")
|
79
|
+
page.should_not have_content("Eating")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.expand_path("../acceptance_helper.rb", __FILE__)
|
2
|
+
|
3
|
+
feature 'Opportunities', %q{
|
4
|
+
In order to increase sales
|
5
|
+
As a user
|
6
|
+
I want to manage opportunities
|
7
|
+
} do
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
do_login_if_not_already(:first_name => 'Bill', :last_name => 'Murray')
|
11
|
+
end
|
12
|
+
|
13
|
+
scenario 'should view a list of opportunities' do
|
14
|
+
3.times { |i| FactoryGirl.create(:opportunity, :name => "Opportunity #{i}") }
|
15
|
+
visit opportunities_page
|
16
|
+
page.should have_content('Opportunity 0')
|
17
|
+
page.should have_content('Opportunity 1')
|
18
|
+
page.should have_content('Opportunity 2')
|
19
|
+
page.should have_content('Create Opportunity')
|
20
|
+
end
|
21
|
+
|
22
|
+
scenario 'should create a new opportunity', :js => true do
|
23
|
+
FactoryGirl.create(:account, :name => 'Example Account')
|
24
|
+
visit opportunities_page
|
25
|
+
click_link 'Create Opportunity'
|
26
|
+
page.should have_selector('#opportunity_name', :visible => true)
|
27
|
+
fill_in 'opportunity_name', :with => 'My Awesome Opportunity'
|
28
|
+
chosen_select('Example Account', :from => 'account_id')
|
29
|
+
select 'prospecting', :from => 'opportunity_stage'
|
30
|
+
click_link 'Comment'
|
31
|
+
fill_in 'comment_body', :with => 'This is a very important opportunity.'
|
32
|
+
click_button 'Create Opportunity'
|
33
|
+
page.should have_content('My Awesome Opportunity')
|
34
|
+
|
35
|
+
click_link 'My Awesome Opportunity'
|
36
|
+
page.should have_content('This is a very important opportunity.')
|
37
|
+
|
38
|
+
click_link "Dashboard"
|
39
|
+
page.should have_content("Bill Murray created opportunity My Awesome Opportunity")
|
40
|
+
page.should have_content("Bill Murray created comment on My Awesome Opportunity")
|
41
|
+
end
|
42
|
+
|
43
|
+
scenario "remembers the comment field when the creation was unsuccessful", :js => true do
|
44
|
+
visit opportunities_page
|
45
|
+
click_link 'Create Opportunity'
|
46
|
+
select 'prospecting', :from => 'opportunity_stage'
|
47
|
+
|
48
|
+
click_link 'Comment'
|
49
|
+
fill_in 'comment_body', :with => 'This is a very important opportunity.'
|
50
|
+
click_button 'Create Opportunity'
|
51
|
+
|
52
|
+
page.should have_field('comment_body', :with => 'This is a very important opportunity.')
|
53
|
+
end
|
54
|
+
|
55
|
+
scenario 'should view and edit an opportunity', :js => true do
|
56
|
+
FactoryGirl.create(:account, :name => 'Example Account')
|
57
|
+
FactoryGirl.create(:account, :name => 'Other Example Account')
|
58
|
+
FactoryGirl.create(:opportunity, :name => 'A Cool Opportunity')
|
59
|
+
visit opportunities_page
|
60
|
+
click_link 'A Cool Opportunity'
|
61
|
+
click_link 'Edit'
|
62
|
+
fill_in 'opportunity_name', :with => 'An Even Cooler Opportunity'
|
63
|
+
chosen_select('Other Example Account', :from => 'account_id')
|
64
|
+
select 'analysis', :from => 'opportunity_stage'
|
65
|
+
click_button 'Save Opportunity'
|
66
|
+
page.should have_content('An Even Cooler Opportunity')
|
67
|
+
click_link 'Opportunities'
|
68
|
+
page.should have_content('An Even Cooler Opportunity')
|
69
|
+
|
70
|
+
click_link "Dashboard"
|
71
|
+
page.should have_content("Bill Murray updated opportunity An Even Cooler Opportunity")
|
72
|
+
end
|
73
|
+
|
74
|
+
scenario 'should delete an opportunity', :js => true do
|
75
|
+
FactoryGirl.create(:opportunity, :name => 'Outdated Opportunity')
|
76
|
+
visit opportunities_page
|
77
|
+
click_link 'Outdated Opportunity'
|
78
|
+
click_link 'Delete?'
|
79
|
+
page.should have_content('Are you sure you want to delete this opportunity?')
|
80
|
+
click_link 'Yes'
|
81
|
+
page.should have_content('Outdated Opportunity has been deleted.')
|
82
|
+
click_link('Opportunities')
|
83
|
+
page.should_not have_content('Outdated Opportunity')
|
84
|
+
end
|
85
|
+
|
86
|
+
scenario 'should search for an opportunity', :js => true do
|
87
|
+
3.times { |i| FactoryGirl.create(:opportunity, :name => "Opportunity #{i}") }
|
88
|
+
visit opportunities_page
|
89
|
+
find('#opportunities').should have_content("Opportunity 0")
|
90
|
+
find('#opportunities').should have_content("Opportunity 1")
|
91
|
+
find('#opportunities').should have_content("Opportunity 2")
|
92
|
+
fill_in 'query', :with => "Opportunity 0"
|
93
|
+
find('#opportunities').should have_content("Opportunity 0")
|
94
|
+
find('#opportunities').has_selector?('li', :count => 1)
|
95
|
+
fill_in 'query', :with => "Opportunity"
|
96
|
+
find('#opportunities').should have_content("Opportunity 0")
|
97
|
+
find('#opportunities').should have_content("Opportunity 1")
|
98
|
+
find('#opportunities').should have_content("Opportunity 2")
|
99
|
+
find('#opportunities').has_selector?('li', :count => 3)
|
100
|
+
fill_in 'query', :with => "Non-existant opportunity"
|
101
|
+
find('#opportunities').has_selector?('li', :count => 0)
|
102
|
+
end
|
103
|
+
end
|
File without changes
|
File without changes
|
@@ -9,6 +9,13 @@ module HelperMethods
|
|
9
9
|
click_button "Login"
|
10
10
|
end
|
11
11
|
|
12
|
+
def login_as_user(user)
|
13
|
+
visit '/login'
|
14
|
+
fill_in "authentication_username", :with => user.username
|
15
|
+
fill_in "authentication_password", :with => user.password
|
16
|
+
click_button "Login"
|
17
|
+
end
|
18
|
+
|
12
19
|
# if we're already logged in, don't bother doing it again
|
13
20
|
def do_login_if_not_already(options = {})
|
14
21
|
do_login(options) unless @user.present?
|
@@ -16,4 +23,4 @@ module HelperMethods
|
|
16
23
|
|
17
24
|
end
|
18
25
|
|
19
|
-
RSpec.configuration.include HelperMethods, :type => :
|
26
|
+
RSpec.configuration.include HelperMethods, :type => :request
|
File without changes
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module NavigationHelpers
|
2
|
+
# Put helper methods related to the paths in your application here.
|
3
|
+
|
4
|
+
def homepage
|
5
|
+
"/"
|
6
|
+
end
|
7
|
+
|
8
|
+
def accounts_page
|
9
|
+
accounts_path
|
10
|
+
end
|
11
|
+
|
12
|
+
def leads_page
|
13
|
+
leads_path
|
14
|
+
end
|
15
|
+
|
16
|
+
def opportunities_page
|
17
|
+
opportunities_path
|
18
|
+
end
|
19
|
+
|
20
|
+
def contacts_page
|
21
|
+
contacts_path
|
22
|
+
end
|
23
|
+
|
24
|
+
def campaigns_page
|
25
|
+
campaigns_path
|
26
|
+
end
|
27
|
+
|
28
|
+
def tasks_page
|
29
|
+
tasks_path
|
30
|
+
end
|
31
|
+
|
32
|
+
def groups_page
|
33
|
+
admin_groups_path
|
34
|
+
end
|
35
|
+
|
36
|
+
def opportunity_overview_page
|
37
|
+
opportunities_overview_users_path
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
RSpec.configuration.include NavigationHelpers, :type => :request
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module SelectorHelpers
|
2
|
+
def chosen_select(item_text, options)
|
3
|
+
field_id = find_field(options[:from])[:id]
|
4
|
+
option_value = page.evaluate_script("jQuery(\"##{field_id} option:contains('#{item_text}')\").val()")#page.evaluate_script("$(\"##{field_id} option:contains('#{item_text}')\").val()")
|
5
|
+
page.execute_script("jQuery('##{field_id}').val('#{option_value}')")
|
6
|
+
end
|
7
|
+
|
8
|
+
def check_filter(filter_name)
|
9
|
+
filter_checkbox = find(:xpath, "//input[@type='checkbox'][@value='due_#{filter_name}']")
|
10
|
+
filter_checkbox.click
|
11
|
+
end
|
12
|
+
|
13
|
+
def click_filter_tab(filter_name)
|
14
|
+
tab = find(:xpath, "//div[@class='filters']//td[contains(text(), '#{filter_name}')]")
|
15
|
+
tab.click
|
16
|
+
end
|
17
|
+
|
18
|
+
def click_edit_for_task_id(task_id)
|
19
|
+
within("#task_#{task_id}") do
|
20
|
+
page.execute_script "jQuery('#task_#{task_id} a')[0].click()"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def click_delete_for_task_id(task_id)
|
25
|
+
within("#task_#{task_id}") do
|
26
|
+
page.execute_script "jQuery('#task_#{task_id} a')[1].click()"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
RSpec.configuration.include SelectorHelpers, :type => :request
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require File.expand_path("../acceptance_helper.rb", __FILE__)
|
2
|
+
|
3
|
+
feature 'Tasks', %q{
|
4
|
+
In order to increase keep track of things
|
5
|
+
As a user
|
6
|
+
I want to manage tasks
|
7
|
+
} do
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
do_login_if_not_already(:first_name => 'Bill', :last_name => 'Murray')
|
11
|
+
end
|
12
|
+
|
13
|
+
scenario 'should view a list of tasks which are assigned to the logged in user' do
|
14
|
+
4.times { |i| FactoryGirl.create(:task, :name => "Task #{i}", :user => @user) }
|
15
|
+
visit tasks_page
|
16
|
+
page.should have_content('Task 0')
|
17
|
+
page.should have_content('Task 1')
|
18
|
+
page.should have_content('Task 2')
|
19
|
+
page.should have_content('Task 3')
|
20
|
+
page.should have_content('Create Task')
|
21
|
+
end
|
22
|
+
|
23
|
+
scenario 'should create a new task', :js => true do
|
24
|
+
visit tasks_page
|
25
|
+
page.should have_content('Create Task')
|
26
|
+
click_link 'Create Task'
|
27
|
+
page.should have_selector('#task_name', :visible => true)
|
28
|
+
fill_in 'task_name', :with => 'Task I Need To Do'
|
29
|
+
chosen_select('Tomorrow', :from => 'task_bucket')
|
30
|
+
chosen_select('Myself', :from => 'task_assigned_to')
|
31
|
+
chosen_select('Call', :from => 'task_category')
|
32
|
+
click_button 'Create Task'
|
33
|
+
page.should have_content('Task I Need To Do')
|
34
|
+
|
35
|
+
click_link 'Dashboard'
|
36
|
+
page.should have_content('Bill Murray created task Task I Need To Do')
|
37
|
+
end
|
38
|
+
|
39
|
+
scenario 'creating a task for another user', :js => true do
|
40
|
+
FactoryGirl.create(:user, :first_name => 'Another', :last_name => 'User')
|
41
|
+
visit tasks_page
|
42
|
+
click_link 'Create Task'
|
43
|
+
page.should have_selector('#task_name', :visible => true)
|
44
|
+
fill_in 'task_name', :with => 'Task For Someone Else'
|
45
|
+
chosen_select('Tomorrow', :from => 'task_bucket')
|
46
|
+
chosen_select('Another User', :from => 'task_assigned_to')
|
47
|
+
chosen_select('Call', :from => 'task_category')
|
48
|
+
click_button 'Create Task'
|
49
|
+
page.should have_content('The task has been created and assigned to Another User')
|
50
|
+
|
51
|
+
click_link 'Tasks'
|
52
|
+
check_filter 'tomorrow'
|
53
|
+
page.should_not have_content('Task For Someone Else')
|
54
|
+
|
55
|
+
click_filter_tab('Assigned')
|
56
|
+
check_filter 'tomorrow'
|
57
|
+
page.should have_content('Task For Someone Else')
|
58
|
+
page.should have_content('Another User')
|
59
|
+
|
60
|
+
click_link 'Dashboard'
|
61
|
+
page.should have_content('Bill Murray created task Task For Someone Else')
|
62
|
+
end
|
63
|
+
|
64
|
+
scenario 'should view and edit a task', :js => true do
|
65
|
+
FactoryGirl.create(:task, :id => 42, :name => 'Example Task', :user => @user)
|
66
|
+
visit tasks_page
|
67
|
+
click_edit_for_task_id(42)
|
68
|
+
fill_in 'task_name', :with => 'Updated Task'
|
69
|
+
click_button 'Save Task'
|
70
|
+
page.should have_content('Updated Task')
|
71
|
+
click_link 'Task'
|
72
|
+
page.should have_content('Updated Task')
|
73
|
+
|
74
|
+
click_link 'Dashboard'
|
75
|
+
page.should have_content('Bill Murray updated task Updated Task')
|
76
|
+
end
|
77
|
+
|
78
|
+
scenario 'should delete a task', :js => true do
|
79
|
+
FactoryGirl.create(:task, :id => 42, :name => 'Outdated Task', :user => @user)
|
80
|
+
visit tasks_page
|
81
|
+
click_delete_for_task_id(42)
|
82
|
+
click_link 'Tasks'
|
83
|
+
page.should_not have_content('Outdated Task')
|
84
|
+
end
|
85
|
+
end
|
@@ -12,7 +12,7 @@ describe Admin::UsersController do
|
|
12
12
|
#----------------------------------------------------------------------------
|
13
13
|
describe "GET index" do
|
14
14
|
it "assigns all users as @users and renders [index] template" do
|
15
|
-
@users = [
|
15
|
+
@users = [ current_user, FactoryGirl.create(:user) ]
|
16
16
|
|
17
17
|
get :index
|
18
18
|
assigns[:users].first.should == @users.last # get_users() sorts by id DESC
|
@@ -264,7 +264,7 @@ describe Admin::UsersController do
|
|
264
264
|
end
|
265
265
|
|
266
266
|
it "doesn't suspend current user" do
|
267
|
-
@user =
|
267
|
+
@user = current_user
|
268
268
|
|
269
269
|
xhr :put, :suspend, :id => @user.id
|
270
270
|
assigns[:user].suspended?.should == false
|
@@ -304,4 +304,3 @@ describe Admin::UsersController do
|
|
304
304
|
end
|
305
305
|
|
306
306
|
end
|
307
|
-
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ApplicationController do
|
4
|
+
|
5
|
+
describe "auto_complete_ids_to_exclude" do
|
6
|
+
|
7
|
+
it "should return [] when related is nil" do
|
8
|
+
controller.send(:auto_complete_ids_to_exclude, nil).should == []
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should return [] when related is ''" do
|
12
|
+
controller.send(:auto_complete_ids_to_exclude, '').should == []
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should return campaign id 5 when related is '5' and controller is campaigns" do
|
16
|
+
controller.send(:auto_complete_ids_to_exclude, '5').sort.should == [5]
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should return [6, 9] when related is 'campaigns/7'" do
|
20
|
+
controller.stub!(:controller_name).and_return('opportunities')
|
21
|
+
campaign = mock(Campaign, :opportunities => [mock(:id => 6), mock(:id => 9)])
|
22
|
+
Campaign.should_receive(:find_by_id).with('7').and_return(campaign)
|
23
|
+
controller.send(:auto_complete_ids_to_exclude, 'campaigns/7').sort.should == [6, 9]
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return [] when related object is not found" do
|
27
|
+
Campaign.should_receive(:find_by_id).with('7').and_return(nil)
|
28
|
+
controller.send(:auto_complete_ids_to_exclude, 'campaigns/7').should == []
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should return [] when related object association is not found" do
|
32
|
+
controller.stub!(:controller_name).and_return('not_a_method_that_exists')
|
33
|
+
campaign = mock(Campaign)
|
34
|
+
Campaign.should_receive(:find_by_id).with('7').and_return(campaign)
|
35
|
+
controller.send(:auto_complete_ids_to_exclude, 'campaigns/7').should == []
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|