fat_free_crm 0.13.2 → 0.13.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fat_free_crm might be problematic. Click here for more details.
- checksums.yaml +5 -13
- data/.travis.yml +3 -3
- data/Gemfile +5 -2
- data/Gemfile.lock +137 -119
- data/MIT-LICENSE +1 -1
- data/README.md +5 -3
- data/app/assets/javascripts/admin/fields.js.coffee +31 -8
- data/app/assets/javascripts/application.js.erb +6 -10
- data/app/assets/javascripts/crm.js.coffee +426 -0
- data/app/assets/javascripts/crm_chosen.js.coffee +19 -38
- data/app/assets/javascripts/crm_classes.js.coffee +215 -0
- data/app/assets/javascripts/crm_comments.js.coffee +20 -58
- data/app/assets/javascripts/crm_loginout.js.coffee +27 -0
- data/app/assets/javascripts/crm_select2.js.coffee +29 -0
- data/app/assets/javascripts/crm_sortable.js.coffee +32 -0
- data/app/assets/javascripts/crm_tags.js.coffee +22 -0
- data/app/assets/javascripts/crm_textarea_autocomplete.js.coffee +33 -0
- data/app/assets/javascripts/datepicker.js.coffee +2 -2
- data/app/assets/javascripts/format_buttons.js.coffee +23 -24
- data/app/assets/javascripts/lists.js.coffee +45 -76
- data/app/assets/javascripts/pagination.js.coffee +16 -0
- data/app/assets/javascripts/search.js.coffee +6 -22
- data/app/assets/javascripts/timeago.js.coffee +21 -0
- data/app/assets/stylesheets/application.css.erb +0 -1
- data/app/assets/stylesheets/common.scss +36 -29
- data/app/assets/stylesheets/lists.css.scss +17 -3
- data/app/controllers/admin/groups_controller.rb +2 -1
- data/app/controllers/application_controller.rb +5 -5
- data/app/controllers/entities/accounts_controller.rb +1 -1
- data/app/controllers/entities/campaigns_controller.rb +1 -1
- data/app/controllers/entities/contacts_controller.rb +1 -1
- data/app/controllers/entities/leads_controller.rb +1 -1
- data/app/controllers/entities/opportunities_controller.rb +1 -1
- data/app/controllers/home_controller.rb +10 -7
- data/app/controllers/tasks_controller.rb +15 -0
- data/app/controllers/users_controller.rb +6 -4
- data/app/helpers/accounts_helper.rb +8 -5
- data/app/helpers/application_helper.rb +53 -39
- data/app/helpers/campaigns_helper.rb +1 -0
- data/app/helpers/leads_helper.rb +3 -3
- data/app/helpers/opportunities_helper.rb +15 -0
- data/app/helpers/remote_link_pagination_helper.rb +8 -0
- data/app/helpers/tags_helper.rb +2 -2
- data/app/helpers/tasks_helper.rb +22 -15
- data/app/helpers/users_helper.rb +3 -2
- data/app/mailers/user_mailer.rb +9 -3
- data/app/models/entities/account_contact.rb +1 -1
- data/app/models/fields/custom_field.rb +1 -1
- data/app/models/list.rb +1 -0
- data/app/models/observers/entity_observer.rb +10 -1
- data/app/models/observers/lead_observer.rb +2 -0
- data/app/models/observers/opportunity_observer.rb +2 -0
- data/app/models/observers/task_observer.rb +2 -0
- data/app/models/polymorphic/avatar.rb +2 -0
- data/app/models/polymorphic/comment.rb +0 -1
- data/app/models/polymorphic/task.rb +41 -9
- data/app/models/users/ability.rb +1 -0
- data/app/models/users/group.rb +0 -5
- data/app/models/users/user.rb +0 -7
- data/app/views/accounts/_edit.html.haml +1 -0
- data/app/views/accounts/_index_brief.html.haml +2 -2
- data/app/views/accounts/_index_long.html.haml +2 -2
- data/app/views/accounts/_new.html.haml +1 -0
- data/app/views/accounts/_sidebar_index.html.haml +1 -1
- data/app/views/accounts/_sidebar_show.html.haml +1 -1
- data/app/views/accounts/_top_section.html.haml +1 -1
- data/app/views/accounts/create.js.haml +9 -9
- data/app/views/accounts/destroy.js.haml +2 -2
- data/app/views/accounts/edit.js.haml +5 -5
- data/app/views/accounts/index.js.haml +5 -5
- data/app/views/accounts/new.js.haml +1 -1
- data/app/views/accounts/show.html.haml +1 -1
- data/app/views/accounts/show.js.haml +1 -1
- data/app/views/accounts/update.js.haml +7 -5
- data/app/views/admin/field_groups/_field_group.html.haml +4 -5
- data/app/views/admin/field_groups/confirm.js.haml +2 -2
- data/app/views/admin/field_groups/create.js.haml +6 -12
- data/app/views/admin/field_groups/destroy.js.haml +3 -3
- data/app/views/admin/field_groups/edit.js.haml +1 -1
- data/app/views/admin/field_groups/new.js.haml +1 -1
- data/app/views/admin/field_groups/update.js.haml +2 -2
- data/app/views/admin/fields/_field.html.haml +1 -1
- data/app/views/admin/fields/_sort_by.html.haml +3 -3
- data/app/views/admin/fields/create.js.haml +9 -9
- data/app/views/admin/fields/destroy.js.haml +4 -4
- data/app/views/admin/fields/edit.js.haml +2 -2
- data/app/views/admin/fields/index.html.haml +1 -8
- data/app/views/admin/fields/show.html.haml +1 -1
- data/app/views/admin/fields/update.js.haml +8 -8
- data/app/views/admin/groups/_form.html.haml +1 -3
- data/app/views/admin/groups/create.js.haml +8 -8
- data/app/views/admin/groups/destroy.js.haml +3 -3
- data/app/views/admin/groups/edit.js.haml +3 -3
- data/app/views/admin/groups/index.js.haml +2 -2
- data/app/views/admin/groups/new.js.haml +2 -2
- data/app/views/admin/groups/update.js.haml +5 -5
- data/app/views/admin/tags/confirm.js.haml +2 -2
- data/app/views/admin/tags/create.js.haml +8 -8
- data/app/views/admin/tags/destroy.js.haml +3 -3
- data/app/views/admin/tags/edit.js.haml +4 -4
- data/app/views/admin/tags/new.js.haml +1 -1
- data/app/views/admin/tags/update.js.haml +5 -5
- data/app/views/admin/users/_profile.html.haml +3 -4
- data/app/views/admin/users/confirm.js.haml +2 -2
- data/app/views/admin/users/create.js.haml +8 -8
- data/app/views/admin/users/destroy.js.haml +3 -3
- data/app/views/admin/users/edit.js.haml +4 -4
- data/app/views/admin/users/index.js.haml +2 -2
- data/app/views/admin/users/new.js.haml +2 -2
- data/app/views/admin/users/reactivate.js.haml +2 -2
- data/app/views/admin/users/suspend.js.haml +2 -2
- data/app/views/admin/users/update.js.haml +5 -5
- data/app/views/campaigns/_edit.html.haml +1 -0
- data/app/views/campaigns/_index_brief.html.haml +1 -1
- data/app/views/campaigns/_index_long.html.haml +1 -1
- data/app/views/campaigns/_new.html.haml +1 -0
- data/app/views/campaigns/_sidebar_index.html.haml +1 -1
- data/app/views/campaigns/_sidebar_show.html.haml +1 -1
- data/app/views/campaigns/_status.html.haml +1 -1
- data/app/views/campaigns/_top_section.html.haml +1 -1
- data/app/views/campaigns/create.js.haml +10 -10
- data/app/views/campaigns/destroy.js.haml +2 -2
- data/app/views/campaigns/edit.js.haml +6 -6
- data/app/views/campaigns/index.js.haml +5 -5
- data/app/views/campaigns/new.js.haml +1 -1
- data/app/views/campaigns/show.html.haml +1 -1
- data/app/views/campaigns/show.js.haml +1 -1
- data/app/views/campaigns/update.js.haml +8 -6
- data/app/views/comments/_edit.html.haml +1 -1
- data/app/views/comments/_new.html.haml +1 -1
- data/app/views/comments/create.js.haml +9 -9
- data/app/views/comments/destroy.js.haml +2 -2
- data/app/views/comments/edit.js.haml +3 -3
- data/app/views/comments/update.js.haml +5 -5
- data/app/views/contacts/_contacts.html.haml +1 -1
- data/app/views/contacts/_edit.html.haml +1 -0
- data/app/views/contacts/_index_brief.html.haml +2 -2
- data/app/views/contacts/_index_full.html.haml +2 -2
- data/app/views/contacts/_index_long.html.haml +2 -2
- data/app/views/contacts/_new.html.haml +1 -0
- data/app/views/contacts/_section_general.html.haml +4 -3
- data/app/views/contacts/_sidebar_show.html.haml +1 -1
- data/app/views/contacts/_top_section.html.haml +1 -1
- data/app/views/contacts/create.js.haml +10 -10
- data/app/views/contacts/destroy.js.haml +3 -3
- data/app/views/contacts/edit.js.haml +5 -5
- data/app/views/contacts/index.js.haml +5 -5
- data/app/views/contacts/new.js.haml +1 -1
- data/app/views/contacts/show.html.haml +1 -1
- data/app/views/contacts/show.js.haml +1 -1
- data/app/views/contacts/update.js.haml +8 -6
- data/app/views/emails/destroy.js.haml +2 -2
- data/app/views/entities/_basic_search.html.haml +15 -12
- data/app/views/entities/_permissions.html.haml +6 -11
- data/app/views/entities/attach.js.haml +3 -3
- data/app/views/entities/contacts.js.haml +2 -2
- data/app/views/entities/discard.js.haml +1 -1
- data/app/views/entities/leads.js.haml +2 -2
- data/app/views/entities/opportunities.js.haml +2 -2
- data/app/views/entities/subscription_update.js.haml +1 -1
- data/app/views/entities/versions.js.haml +2 -2
- data/app/views/fields/group.js.erb +1 -1
- data/app/views/home/_account.html.haml +2 -2
- data/app/views/home/_assets_menu.html.haml +3 -3
- data/app/views/home/_duration_menu.html.haml +3 -3
- data/app/views/home/_events_menu.html.haml +3 -3
- data/app/views/home/_opportunity.html.haml +2 -2
- data/app/views/home/_options.html.haml +0 -1
- data/app/views/home/_users_menu.html.haml +3 -3
- data/app/views/home/index.js.haml +4 -4
- data/app/views/home/options.js.haml +1 -1
- data/app/views/layouts/_about.html.haml +3 -3
- data/app/views/layouts/_footer.html.haml +1 -1
- data/app/views/layouts/_header.html.haml +1 -1
- data/app/views/layouts/_jumpbox.html.haml +23 -21
- data/app/views/layouts/_sidebar.html.haml +1 -2
- data/app/views/layouts/admin/application.html.haml +1 -1
- data/app/views/layouts/application.html.haml +3 -3
- data/app/views/leads/_convert.html.haml +1 -11
- data/app/views/leads/_convert_permissions.html.haml +4 -9
- data/app/views/leads/_edit.html.haml +1 -0
- data/app/views/leads/_index_brief.html.haml +1 -1
- data/app/views/leads/_index_long.html.haml +1 -1
- data/app/views/leads/_leads.html.haml +1 -1
- data/app/views/leads/_new.html.haml +1 -0
- data/app/views/leads/_sidebar_index.html.haml +1 -1
- data/app/views/leads/_sidebar_show.html.haml +1 -1
- data/app/views/leads/_top_section.html.haml +1 -1
- data/app/views/leads/convert.js.haml +5 -5
- data/app/views/leads/create.js.haml +9 -9
- data/app/views/leads/destroy.js.haml +2 -2
- data/app/views/leads/edit.js.haml +5 -5
- data/app/views/leads/index.js.haml +5 -5
- data/app/views/leads/new.js.haml +1 -1
- data/app/views/leads/promote.js.haml +7 -7
- data/app/views/leads/reject.js.haml +2 -2
- data/app/views/leads/show.html.haml +1 -1
- data/app/views/leads/show.js.haml +1 -1
- data/app/views/leads/update.js.haml +9 -7
- data/app/views/lists/_lists.html.haml +6 -0
- data/app/views/lists/_sidebar.html.haml +18 -17
- data/app/views/lists/create.js.haml +6 -7
- data/app/views/lists/destroy.js.haml +1 -1
- data/app/views/opportunities/_edit.html.haml +2 -1
- data/app/views/opportunities/_index_brief.html.haml +1 -1
- data/app/views/opportunities/_index_long.html.haml +1 -1
- data/app/views/opportunities/_new.html.haml +2 -1
- data/app/views/opportunities/_opportunities.html.haml +1 -1
- data/app/views/opportunities/_sidebar_index.html.haml +1 -1
- data/app/views/opportunities/_sidebar_show.html.haml +1 -1
- data/app/views/opportunities/_top_section.html.haml +2 -2
- data/app/views/opportunities/contacts.js.haml +2 -2
- data/app/views/opportunities/create.js.haml +10 -10
- data/app/views/opportunities/destroy.js.haml +3 -3
- data/app/views/opportunities/edit.js.haml +5 -5
- data/app/views/opportunities/index.html.haml +1 -1
- data/app/views/opportunities/index.js.haml +5 -5
- data/app/views/opportunities/new.js.haml +1 -1
- data/app/views/opportunities/show.html.haml +1 -1
- data/app/views/opportunities/show.js.haml +1 -1
- data/app/views/opportunities/update.js.haml +8 -6
- data/app/views/shared/_address.html.haml +1 -1
- data/app/views/shared/_inline_styles.html.haml +1 -1
- data/app/views/shared/_naming.html.haml +3 -3
- data/app/views/shared/_paginate.haml +2 -1
- data/app/views/shared/_paginate_with_per_page.html.haml +10 -12
- data/app/views/shared/_search.html.haml +7 -3
- data/app/views/shared/_select_popup.html.haml +9 -11
- data/app/views/shared/_tags.html.haml +5 -4
- data/app/views/tasks/_completed.html.haml +3 -1
- data/app/views/tasks/_selector.html.haml +1 -1
- data/app/views/tasks/_top_section.html.haml +1 -1
- data/app/views/tasks/complete.js.haml +7 -7
- data/app/views/tasks/create.js.haml +17 -17
- data/app/views/tasks/destroy.js.haml +2 -2
- data/app/views/tasks/discard.js.haml +1 -1
- data/app/views/tasks/edit.js.haml +4 -4
- data/app/views/tasks/filter.js.haml +2 -2
- data/app/views/tasks/new.js.haml +1 -1
- data/app/views/tasks/uncomplete.js.haml +12 -0
- data/app/views/tasks/update.js.haml +4 -4
- data/app/views/users/_avatar.html.haml +1 -1
- data/app/views/users/_languages.html.haml +3 -3
- data/app/views/users/_profile.html.haml +1 -1
- data/app/views/users/avatar.js.haml +1 -1
- data/app/views/users/change_password.js.haml +5 -5
- data/app/views/users/edit.js.haml +1 -1
- data/app/views/users/password.js.haml +2 -2
- data/app/views/users/show.html.haml +1 -1
- data/app/views/users/update.js.haml +5 -5
- data/app/views/users/upload_avatar.js.haml +3 -3
- data/app/views/versions/_versions.html.haml +1 -1
- data/config/application.rb +3 -0
- data/config/environments/production.rb +1 -1
- data/config/environments/staging.rb +58 -13
- data/config/initializers/locale.rb +2 -0
- data/config/locales/cz_fat_free_crm.yml +1 -0
- data/config/locales/de_fat_free_crm.yml +1 -0
- data/config/locales/en-GB_fat_free_crm.yml +1 -0
- data/config/locales/en-US_fat_free_crm.yml +2 -0
- data/config/locales/es_fat_free_crm.yml +1 -0
- data/config/locales/fr-CA_fat_free_crm.yml +1 -0
- data/config/locales/fr_fat_free_crm.yml +1 -0
- data/config/locales/it_fat_free_crm.yml +1 -0
- data/config/locales/ja_fat_free_crm.yml +1 -0
- data/config/locales/pl_fat_free_crm.yml +1 -0
- data/config/locales/pt-BR_fat_free_crm.yml +1 -0
- data/config/locales/ru_fat_free_crm.yml +444 -61
- data/config/locales/sv-SE_fat_free_crm.yml +1 -0
- data/config/locales/th_fat_free_crm.yml +1 -0
- data/config/locales/zh-CN_fat_free_crm.yml +1 -0
- data/config/routes.rb +20 -19
- data/config/settings.default.yml +11 -10
- data/fat_free_crm.gemspec +5 -4
- data/lib/{plugins/country_select/lib/country_select.rb → country_select.rb} +0 -0
- data/lib/fat_free_crm.rb +3 -1
- data/lib/fat_free_crm/engine.rb +2 -4
- data/lib/fat_free_crm/gem_dependencies.rb +1 -1
- data/lib/fat_free_crm/gem_ext.rb +0 -2
- data/lib/fat_free_crm/permissions.rb +2 -3
- data/lib/fat_free_crm/version.rb +1 -1
- data/lib/{plugins/gravatar_image_tag/lib/gravatar_image_tag.rb → gravatar_image_tag.rb} +0 -0
- data/lib/tasks/ffcrm/settings.rake +4 -16
- data/public/favicon.ico +0 -0
- data/spec/controllers/entities/accounts_controller_spec.rb +5 -5
- data/spec/controllers/entities/campaigns_controller_spec.rb +5 -5
- data/spec/controllers/entities/contacts_controller_spec.rb +42 -5
- data/spec/controllers/entities/leads_controller_spec.rb +7 -7
- data/spec/controllers/entities/opportunities_controller_spec.rb +5 -5
- data/spec/controllers/home_controller_spec.rb +3 -3
- data/spec/controllers/tasks_controller_spec.rb +29 -0
- data/spec/factories/shared_factories.rb +1 -3
- data/spec/features/support/selector_helpers.rb +4 -4
- data/spec/helpers/tasks_helper_spec.rb +10 -5
- data/spec/lib/permissions_spec.rb +10 -22
- data/spec/mailers/user_mailer_spec.rb +5 -4
- data/spec/models/observers/entity_observer_spec.rb +13 -8
- data/spec/models/polymorphic/task_spec.rb +111 -32
- data/spec/routing/accounts_routing_spec.rb +1 -1
- data/spec/routing/campaigns_routing_spec.rb +1 -1
- data/spec/routing/contacts_routing_spec.rb +1 -1
- data/spec/routing/leads_routing_spec.rb +1 -1
- data/spec/routing/opportunities_routing_spec.rb +1 -1
- data/spec/shared/controllers.rb +2 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/views/accounts/create.js.haml_spec.rb +3 -3
- data/spec/views/accounts/index.js.haml_spec.rb +4 -4
- data/spec/views/accounts/update.js.haml_spec.rb +5 -5
- data/spec/views/admin/field_groups/create.js.haml_spec.rb +2 -2
- data/spec/views/admin/field_groups/edit.js.haml_spec.rb +1 -1
- data/spec/views/admin/field_groups/new.js.haml_spec.rb +1 -1
- data/spec/views/admin/field_groups/update.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/create.js.haml_spec.rb +2 -2
- data/spec/views/admin/users/destroy.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/edit.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/index.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/new.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/reactivate.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/suspend.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/update.js.haml_spec.rb +3 -3
- data/spec/views/campaigns/create.js.haml_spec.rb +4 -4
- data/spec/views/campaigns/destroy.js.haml_spec.rb +1 -1
- data/spec/views/campaigns/edit.js.haml_spec.rb +4 -4
- data/spec/views/campaigns/index.js.haml_spec.rb +2 -2
- data/spec/views/campaigns/new.js.haml_spec.rb +1 -1
- data/spec/views/campaigns/update.js.haml_spec.rb +7 -7
- data/spec/views/contacts/create.js.haml_spec.rb +4 -4
- data/spec/views/contacts/edit.js.haml_spec.rb +4 -4
- data/spec/views/contacts/index.js.html_spec.rb +2 -2
- data/spec/views/contacts/new.js.haml_spec.rb +2 -2
- data/spec/views/contacts/update.js.haml_spec.rb +11 -11
- data/spec/views/home/index.js.haml_spec.rb +1 -1
- data/spec/views/home/options.js.haml_spec.rb +3 -3
- data/spec/views/leads/convert.js.haml_spec.rb +3 -3
- data/spec/views/leads/create.js.haml_spec.rb +5 -5
- data/spec/views/leads/destroy.js.haml_spec.rb +1 -1
- data/spec/views/leads/edit.js.haml_spec.rb +4 -4
- data/spec/views/leads/index.js.haml_spec.rb +2 -2
- data/spec/views/leads/new.js.haml_spec.rb +1 -1
- data/spec/views/leads/promote.js.haml_spec.rb +13 -13
- data/spec/views/leads/reject.js.haml_spec.rb +6 -6
- data/spec/views/leads/update.js.haml_spec.rb +11 -11
- data/spec/views/opportunities/create.js.haml_spec.rb +4 -4
- data/spec/views/opportunities/destroy.js.haml_spec.rb +1 -1
- data/spec/views/opportunities/edit.js.haml_spec.rb +4 -4
- data/spec/views/opportunities/index.js.haml_spec.rb +2 -2
- data/spec/views/opportunities/update.js.haml_spec.rb +11 -11
- data/spec/views/tasks/complete.js.haml_spec.rb +5 -5
- data/spec/views/tasks/create.js.haml_spec.rb +13 -13
- data/spec/views/tasks/destroy.js.haml_spec.rb +3 -3
- data/spec/views/tasks/edit.js.haml_spec.rb +4 -4
- data/spec/views/tasks/new.js.haml_spec.rb +2 -2
- data/spec/views/tasks/uncomplete.js.haml_spec.rb +44 -0
- data/spec/views/tasks/update.js.haml_spec.rb +17 -17
- data/spec/views/users/avatar.js.haml_spec.rb +1 -1
- data/spec/views/users/change_password.js.haml_spec.rb +4 -4
- data/spec/views/users/edit.js.haml_spec.rb +1 -1
- data/spec/views/users/password.js.haml_spec.rb +2 -2
- data/spec/views/users/update.js.haml_spec.rb +5 -5
- data/spec/views/users/upload_avatar.js.haml_spec.rb +2 -2
- data/vendor/assets/javascripts/ajax-chosen.jquery.coffee +166 -76
- data/vendor/assets/javascripts/chosen.jquery.coffee +2 -2
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-pt-BR.js +22 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/{jquery-ui-timepicker-sv.js → jquery-ui-timepicker-sv-SE.js} +0 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-th.js +19 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-fr-CA.js +21 -0
- data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-pt.js +21 -0
- data/vendor/assets/javascripts/rating.js +2 -2
- metadata +101 -122
- data/app/assets/images/facebook-close.gif +0 -0
- data/app/assets/javascripts/crm.js +0 -495
- data/app/assets/javascripts/crm_classes.js +0 -218
- data/app/assets/javascripts/crm_fields.js +0 -34
- data/app/assets/javascripts/crm_loginout.js +0 -29
- data/app/assets/javascripts/crm_textarea_autocomplete.js +0 -32
- data/app/assets/javascripts/groups.js.coffee +0 -8
- data/app/assets/javascripts/jquery-noconflict.js +0 -6
- data/app/assets/javascripts/timeago.js +0 -17
- data/app/views/lists/_personal_sidebar.html.haml +0 -28
- data/lib/fat_free_crm/gem_ext/active_model/serializers/xml/serializer/attribute.rb +0 -17
- data/lib/fat_free_crm/gem_ext/authlogic/session/cookies.rb +0 -16
- data/lib/fat_free_crm/plugin_dependencies.rb +0 -12
- data/lib/plugins/country_select/MIT-LICENSE +0 -20
- data/lib/plugins/country_select/README +0 -14
- data/lib/plugins/country_select/init.rb +0 -1
- data/lib/plugins/country_select/install.rb +0 -2
- data/lib/plugins/country_select/uninstall.rb +0 -2
- data/lib/plugins/gravatar_image_tag/Gemfile +0 -8
- data/lib/plugins/gravatar_image_tag/README.textile +0 -108
- data/lib/plugins/gravatar_image_tag/ROADMAP.textile +0 -33
- data/lib/plugins/gravatar_image_tag/Rakefile +0 -50
- data/lib/plugins/gravatar_image_tag/VERSION +0 -1
- data/lib/plugins/gravatar_image_tag/gravatar_image_tag.gemspec +0 -45
- data/lib/plugins/gravatar_image_tag/init.rb +0 -2
- data/lib/plugins/gravatar_image_tag/spec/gravatar_image_tag_spec.rb +0 -83
- data/lib/plugins/gravatar_image_tag/spec/test_helper.rb +0 -12
- data/lib/tasks/db/migrate.rake +0 -66
- data/lib/tasks/db/schema.rake +0 -20
- data/vendor/assets/javascripts/ajax-chosen-prototype.js +0 -2
- data/vendor/assets/javascripts/ajax-chosen.proto.coffee +0 -98
- data/vendor/assets/javascripts/chosen-prototype.js +0 -3
- data/vendor/assets/javascripts/chosen.proto.coffee +0 -580
- data/vendor/assets/javascripts/event.simulate.js +0 -64
- data/vendor/assets/javascripts/facebooklist.js +0 -548
- data/vendor/assets/javascripts/facebooklist.simulate.js +0 -28
- data/vendor/assets/javascripts/modalbox.js +0 -506
- data/vendor/assets/stylesheets/facebooklist.css +0 -47
@@ -30,4 +30,19 @@ module OpportunitiesHelper
|
|
30
30
|
end
|
31
31
|
summary.compact.join(', ')
|
32
32
|
end
|
33
|
+
|
34
|
+
# Generates a select list with the first 25 campaigns
|
35
|
+
# and prepends the currently selected campaign, if any.
|
36
|
+
#----------------------------------------------------------------------------
|
37
|
+
def opportunity_campaign_select(options = {})
|
38
|
+
options[:selected] ||= @opportunity.campaign_id || 0
|
39
|
+
selected_campaign = Campaign.find_by_id(options[:selected])
|
40
|
+
campaigns = ([selected_campaign] + Campaign.my.order(:name).limit(25)).compact.uniq
|
41
|
+
collection_select :opportunity, :campaign_id, campaigns, :id, :name, options,
|
42
|
+
{:"data-placeholder" => t(:select_a_campaign),
|
43
|
+
:"data-url" => auto_complete_campaigns_path(format: 'json'),
|
44
|
+
:style => "width:330px; display:none;",
|
45
|
+
:class => 'ajax_chosen' }
|
46
|
+
end
|
47
|
+
|
33
48
|
end
|
data/app/helpers/tags_helper.rb
CHANGED
data/app/helpers/tasks_helper.rb
CHANGED
@@ -11,12 +11,13 @@ module TasksHelper
|
|
11
11
|
def task_filter_checkbox(view, filter, count)
|
12
12
|
name = "filter_by_task_#{view}"
|
13
13
|
checked = (session[name] ? session[name].split(",").include?(filter.to_s) : count > 0)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
url = url_for(:action => :filter, :view => view)
|
15
|
+
onclick = %Q{
|
16
|
+
$('#loading').show();
|
17
|
+
$.post('#{url}', {filter: this.value, checked: this.checked}, function () {
|
18
|
+
$('#loading').hide();
|
19
|
+
});
|
20
|
+
}
|
20
21
|
check_box_tag("filters[]", filter, checked, :onclick => onclick, :id => "filters_#{filter.to_s.underscore}")
|
21
22
|
end
|
22
23
|
|
@@ -45,8 +46,14 @@ module TasksHelper
|
|
45
46
|
|
46
47
|
#----------------------------------------------------------------------------
|
47
48
|
def link_to_task_complete(pending, bucket)
|
48
|
-
onclick = %Q
|
49
|
-
onclick <<
|
49
|
+
onclick = %Q{$("##{dom_id(pending, :name)}").css({textDecoration: "line-through"});}
|
50
|
+
onclick << %Q{$.ajax("#{complete_task_path(pending)}", {type: "PUT", data: {bucket: "#{bucket}"}});}
|
51
|
+
end
|
52
|
+
|
53
|
+
#----------------------------------------------------------------------------
|
54
|
+
def link_to_task_uncomplete(task, bucket)
|
55
|
+
link_to(t(:task_uncomplete), uncomplete_task_path(task, :bucket => bucket, :view => @view),
|
56
|
+
:method => :put, :remote => true)
|
50
57
|
end
|
51
58
|
|
52
59
|
# Task summary for RSS/ATOM feed.
|
@@ -79,8 +86,8 @@ module TasksHelper
|
|
79
86
|
|
80
87
|
#----------------------------------------------------------------------------
|
81
88
|
def hide_task_and_possibly_bucket(task, bucket)
|
82
|
-
text = "
|
83
|
-
text << "
|
89
|
+
text = "$('##{dom_id(task)}').remove();\n"
|
90
|
+
text << "$('#list_#{h bucket.to_s}').fadeOut({ duration:500 });\n" if Task.bucket_empty?(bucket, current_user, @view)
|
84
91
|
text.html_safe
|
85
92
|
end
|
86
93
|
|
@@ -88,21 +95,21 @@ module TasksHelper
|
|
88
95
|
def replace_content(task, bucket = nil)
|
89
96
|
partial = (task.assigned_to && task.assigned_to != current_user.id) ? "assigned" : "pending"
|
90
97
|
html = render(:partial => "tasks/#{partial}", :collection => [ task ], :locals => { :bucket => bucket })
|
91
|
-
text = "
|
98
|
+
text = "$('##{dom_id(task)}').html('#{ j html }');\n".html_safe
|
92
99
|
end
|
93
100
|
|
94
101
|
#----------------------------------------------------------------------------
|
95
102
|
def insert_content(task, bucket, view)
|
96
|
-
text = "
|
103
|
+
text = "$('#list_#{bucket}').show();\n".html_safe
|
97
104
|
html = render(:partial => view, :collection => [ task ], :locals => { :bucket => bucket })
|
98
|
-
text << "
|
99
|
-
text << "
|
105
|
+
text << "$('##{h bucket.to_s}').prepend('#{ j html }');\n".html_safe
|
106
|
+
text << "$('##{dom_id(task)}').effect('highlight', { duration:1500 });\n".html_safe
|
100
107
|
text
|
101
108
|
end
|
102
109
|
|
103
110
|
#----------------------------------------------------------------------------
|
104
111
|
def tasks_flash(message)
|
105
|
-
text = "
|
112
|
+
text = "$('#flash').html('#{ message }');\n"
|
106
113
|
text << "crm.flash('notice', true)\n"
|
107
114
|
text.html_safe
|
108
115
|
end
|
data/app/helpers/users_helper.rb
CHANGED
@@ -17,7 +17,7 @@ module UsersHelper
|
|
17
17
|
%Q[{ name: "#{language}", on_select: function() { #{redraw(:locale, [ locale, language ], url_for(:action => :redraw, :id => current_user))} } }]
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def all_users
|
22
22
|
User.by_name
|
23
23
|
end
|
@@ -26,7 +26,8 @@ module UsersHelper
|
|
26
26
|
user_options = user_options_for_select(users, myself)
|
27
27
|
select(asset, :assigned_to, user_options,
|
28
28
|
{ :include_blank => t(:unassigned) },
|
29
|
-
{ :style => "width:160px"
|
29
|
+
{ :style => "width:160px",
|
30
|
+
:class => 'select2' })
|
30
31
|
end
|
31
32
|
|
32
33
|
def user_options_for_select(users, myself)
|
data/app/mailers/user_mailer.rb
CHANGED
@@ -10,7 +10,7 @@ class UserMailer < ActionMailer::Base
|
|
10
10
|
|
11
11
|
mail :subject => "Fat Free CRM: " + I18n.t(:password_reset_instruction),
|
12
12
|
:to => user.email,
|
13
|
-
:from =>
|
13
|
+
:from => from_address,
|
14
14
|
:date => Time.now
|
15
15
|
end
|
16
16
|
|
@@ -21,8 +21,14 @@ class UserMailer < ActionMailer::Base
|
|
21
21
|
@assigner_name = assigner.name
|
22
22
|
mail :subject => "Fat Free CRM: You have been assigned #{@entity_name} #{@entity_type}",
|
23
23
|
:to => entity.assignee.email,
|
24
|
-
:from =>
|
24
|
+
:from => from_address
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
private
|
28
|
+
|
29
|
+
def from_address
|
30
|
+
from = Setting.smtp[:from]
|
31
|
+
!from.blank? ? from : "Fat Free CRM <noreply@fatfreecrm.com>"
|
32
|
+
end
|
28
33
|
|
34
|
+
end
|
@@ -21,7 +21,7 @@ class AccountContact < ActiveRecord::Base
|
|
21
21
|
|
22
22
|
has_paper_trail :meta => { :related => :contact }, :ignore => [ :id, :created_at, :updated_at, :contact_id ]
|
23
23
|
|
24
|
-
validates_presence_of :account_id
|
24
|
+
validates_presence_of :account_id
|
25
25
|
|
26
26
|
ActiveSupport.run_load_hooks(:fat_free_crm_account_contact, self)
|
27
27
|
end
|
@@ -136,7 +136,7 @@ class CustomField < Field
|
|
136
136
|
ransack: {attributes: {klass.model_name.singular => {name => label}}}
|
137
137
|
})
|
138
138
|
# Reset Ransack cache
|
139
|
-
Ransack::Helpers::FormBuilder.cached_searchable_attributes_for_base = {}
|
139
|
+
# Ransack::Helpers::FormBuilder.cached_searchable_attributes_for_base = {}
|
140
140
|
end
|
141
141
|
|
142
142
|
# Change database column type only if safe to do so
|
data/app/models/list.rb
CHANGED
@@ -19,7 +19,14 @@ class EntityObserver < ActiveRecord::Observer
|
|
19
19
|
private
|
20
20
|
|
21
21
|
def send_notification_to_assignee(item)
|
22
|
-
|
22
|
+
if item.assignee.present? && current_user.present? && can_send_email?
|
23
|
+
UserMailer.assigned_entity_notification(item, current_user).deliver
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Need to have a host set before email can be sent
|
28
|
+
def can_send_email?
|
29
|
+
Setting.host.present?
|
23
30
|
end
|
24
31
|
|
25
32
|
def current_user
|
@@ -31,4 +38,6 @@ class EntityObserver < ActiveRecord::Observer
|
|
31
38
|
User.find_by_id(user_id_or_user.to_i)
|
32
39
|
end
|
33
40
|
end
|
41
|
+
|
42
|
+
ActiveSupport.run_load_hooks(:fat_free_crm_entity_observer, self)
|
34
43
|
end
|
@@ -24,4 +24,6 @@ class LeadObserver < ActiveRecord::Observer
|
|
24
24
|
def log_activity(item, event)
|
25
25
|
item.send(item.class.versions_association_name).create(:event => event, :whodunnit => PaperTrail.whodunnit)
|
26
26
|
end
|
27
|
+
|
28
|
+
ActiveSupport.run_load_hooks(:fat_free_crm_lead_observer, self)
|
27
29
|
end
|
@@ -42,4 +42,6 @@ class OpportunityObserver < ActiveRecord::Observer
|
|
42
42
|
def update_campaign_revenue(campaign, revenue)
|
43
43
|
campaign.update_attribute(:revenue, (campaign.revenue || 0) + revenue) if campaign
|
44
44
|
end
|
45
|
+
|
46
|
+
ActiveSupport.run_load_hooks(:fat_free_crm_opportunity_observer, self)
|
45
47
|
end
|
@@ -26,4 +26,6 @@ class TaskObserver < ActiveRecord::Observer
|
|
26
26
|
def log_activity(item, event)
|
27
27
|
item.send(item.class.versions_association_name).create(:event => event, :whodunnit => PaperTrail.whodunnit)
|
28
28
|
end
|
29
|
+
|
30
|
+
ActiveSupport.run_load_hooks(:fat_free_crm_task_observer, self)
|
29
31
|
end
|
@@ -36,6 +36,8 @@ class Avatar < ActiveRecord::Base
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
has_attached_file :image, :styles => STYLES.dup, :url => "/avatars/:entity_type/:id/:style_:filename", :default_url => "/assets/avatar.jpg"
|
39
|
+
validates_attachment :image, :presence => true,
|
40
|
+
:content_type => { :content_type => %w(image/jpeg image/jpg image/png image/gif) }
|
39
41
|
|
40
42
|
# Convert STYLE symbols to 'w x h' format for Gravatar and Rails
|
41
43
|
# e.g. Avatar.size_from_style(:size => :large) -> '75x75'
|
@@ -44,7 +44,6 @@ class Comment < ActiveRecord::Base
|
|
44
44
|
|
45
45
|
# Notify subscribed users when a comment is added, unless user created this comment
|
46
46
|
def notify_subscribers
|
47
|
-
return unless Rails.application.config.action_mailer.smtp_settings.present?
|
48
47
|
commentable.subscribed_users.reject{|user_id| user_id == user.id}.each do |subscriber_id|
|
49
48
|
if subscriber = User.find_by_id(subscriber_id)
|
50
49
|
SubscriptionMailer.comment_notification(subscriber, self).deliver
|
@@ -144,9 +144,7 @@ class Task < ActiveRecord::Base
|
|
144
144
|
# set by Time.now.end_of_week.
|
145
145
|
#----------------------------------------------------------------------------
|
146
146
|
def at_specific_time?
|
147
|
-
self.due_at &&
|
148
|
-
(self.due_at.hour != 0 || self.due_at.min != 0 || self.due_at.sec != 0) &&
|
149
|
-
(self.due_at.hour != 23 && self.due_at.min != 59 && self.due_at.sec != 59)
|
147
|
+
self.due_at.present? && !due_end_of_day? && !due_beginning_of_day?
|
150
148
|
end
|
151
149
|
|
152
150
|
# Convert specific due_date to "due_today", "due_tomorrow", etc. bucket name.
|
@@ -154,21 +152,20 @@ class Task < ActiveRecord::Base
|
|
154
152
|
def computed_bucket
|
155
153
|
return self.bucket if self.bucket != "specific_time"
|
156
154
|
case
|
157
|
-
when
|
155
|
+
when overdue?
|
158
156
|
"overdue"
|
159
|
-
when
|
157
|
+
when due_today?
|
160
158
|
"due_today"
|
161
|
-
when
|
159
|
+
when due_tomorrow?
|
162
160
|
"due_tomorrow"
|
163
|
-
when
|
161
|
+
when due_this_week? && !due_today? && !due_tomorrow?
|
164
162
|
"due_this_week"
|
165
|
-
when
|
163
|
+
when due_next_week?
|
166
164
|
"due_next_week"
|
167
165
|
else
|
168
166
|
"due_later"
|
169
167
|
end
|
170
168
|
end
|
171
|
-
|
172
169
|
# Returns list of tasks grouping them by due date as required by tasks/index.
|
173
170
|
#----------------------------------------------------------------------------
|
174
171
|
def self.find_all_grouped(user, view)
|
@@ -227,6 +224,41 @@ class Task < ActiveRecord::Base
|
|
227
224
|
end
|
228
225
|
end
|
229
226
|
|
227
|
+
#----------------------------------------------------------------------------
|
228
|
+
def due_end_of_day?
|
229
|
+
self.due_at.present? && (self.due_at == self.due_at.end_of_day)
|
230
|
+
end
|
231
|
+
|
232
|
+
#----------------------------------------------------------------------------
|
233
|
+
def due_beginning_of_day?
|
234
|
+
self.due_at.present? && (self.due_at == self.due_at.beginning_of_day)
|
235
|
+
end
|
236
|
+
|
237
|
+
#----------------------------------------------------------------------------
|
238
|
+
def overdue?
|
239
|
+
self.due_at < Time.zone.now.midnight
|
240
|
+
end
|
241
|
+
|
242
|
+
#----------------------------------------------------------------------------
|
243
|
+
def due_today?
|
244
|
+
self.due_at.between?(Time.zone.now.midnight, Time.zone.now.end_of_day)
|
245
|
+
end
|
246
|
+
|
247
|
+
#----------------------------------------------------------------------------
|
248
|
+
def due_tomorrow?
|
249
|
+
self.due_at.between?(Time.zone.now.midnight.tomorrow, Time.zone.now.tomorrow.end_of_day)
|
250
|
+
end
|
251
|
+
|
252
|
+
#----------------------------------------------------------------------------
|
253
|
+
def due_this_week?
|
254
|
+
self.due_at.between?(Time.zone.now.beginning_of_week, Time.zone.now.end_of_week)
|
255
|
+
end
|
256
|
+
|
257
|
+
#----------------------------------------------------------------------------
|
258
|
+
def due_next_week?
|
259
|
+
self.due_at.between?(Time.zone.now.next_week, Time.zone.now.next_week.end_of_week)
|
260
|
+
end
|
261
|
+
|
230
262
|
#----------------------------------------------------------------------------
|
231
263
|
def notify_assignee
|
232
264
|
if self.assigned_to
|
data/app/models/users/ability.rb
CHANGED
data/app/models/users/group.rb
CHANGED
@@ -11,10 +11,5 @@ class Group < ActiveRecord::Base
|
|
11
11
|
|
12
12
|
validates :name, :presence => true, :uniqueness => true
|
13
13
|
|
14
|
-
# TODO: Fix chosen bug that makes this necessary
|
15
|
-
def user_ids=(value)
|
16
|
-
super value.join.split(',')
|
17
|
-
end
|
18
|
-
|
19
14
|
ActiveSupport.run_load_hooks(:fat_free_crm_group, self)
|
20
15
|
end
|
data/app/models/users/user.rb
CHANGED
@@ -139,13 +139,6 @@ class User < ActiveRecord::Base
|
|
139
139
|
self.single_access_token ||= update_attribute(:single_access_token, Authlogic::Random.friendly_token)
|
140
140
|
end
|
141
141
|
|
142
|
-
# Massage value when using Chosen select box which gives values like ["", "1,2,3"]
|
143
|
-
#----------------------------------------------------------------------------
|
144
|
-
def group_ids=(value)
|
145
|
-
value = value.join.split(',').map(&:to_i) if value.map{|v| v.to_s.include?(',')}.any?
|
146
|
-
super(value)
|
147
|
-
end
|
148
|
-
|
149
142
|
def to_json(options = nil)
|
150
143
|
[name].to_json
|
151
144
|
end
|
@@ -10,6 +10,7 @@
|
|
10
10
|
= render "accounts/contact_info", :f => f, :edit => true
|
11
11
|
= render "fields/groups", :f => f, :edit => true
|
12
12
|
= render "entities/permissions", :f => f, :edit => true, :entity => @account
|
13
|
+
= hook(:entity_form, self, {f: f, entity: @account}) {}
|
13
14
|
|
14
15
|
.buttonbar
|
15
16
|
- if Setting.compound_address
|
@@ -6,7 +6,7 @@
|
|
6
6
|
.strip{:style => "color: gray;"} #{t :other}
|
7
7
|
|
8
8
|
%ul.tools
|
9
|
-
= hook(:account_tools_before, self, :account => account)
|
9
|
+
= hook(:account_tools_before, self, :account => account) {}
|
10
10
|
|
11
11
|
- if can?(:update, account)
|
12
12
|
%li= link_to_edit(account)
|
@@ -29,4 +29,4 @@
|
|
29
29
|
= t('pluralize.contact', account.contacts.count) << " | "
|
30
30
|
= t('pluralize.opportunity', account.opportunities.count)
|
31
31
|
|
32
|
-
= hook(:account_bottom, self, :account => account)
|
32
|
+
= hook(:account_bottom, self, :account => account) {}
|
@@ -6,7 +6,7 @@
|
|
6
6
|
.strip{:style => "color: gray;"} #{t :other}
|
7
7
|
|
8
8
|
%ul.tools
|
9
|
-
= hook(:account_tools_before, self, :account => account)
|
9
|
+
= hook(:account_tools_before, self, :account => account) {}
|
10
10
|
|
11
11
|
- if can?(:update, account)
|
12
12
|
%li= link_to_edit(account)
|
@@ -39,4 +39,4 @@
|
|
39
39
|
%dt
|
40
40
|
.tags= tags_for_index(account)
|
41
41
|
|
42
|
-
= hook(:account_bottom, self, :account => account)
|
42
|
+
= hook(:account_bottom, self, :account => account) {}
|
@@ -3,15 +3,15 @@
|
|
3
3
|
- create_id = "create_#{entity_name}" # create_account
|
4
4
|
|
5
5
|
- if @entity.valid?
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
$('##{create_id}_arrow').html(crm.COLLAPSED);
|
7
|
+
$('##{create_id}_title').html('#{ j t(entity_name.pluralize) }');
|
8
|
+
$('##{create_id}').slideUp(250);
|
9
|
+
$('##{entity_name.pluralize}').prepend('#{ j render(:partial => entity_name, :collection => [ @entity ]) }');
|
10
|
+
$('##{dom_id(@entity)}').effect("highlight", { duration:1500 });
|
11
11
|
= refresh_sidebar(:index, :filters)
|
12
|
-
|
12
|
+
$('#paginate').html('#{ j render(:partial => "shared/paginate_with_per_page") }');
|
13
13
|
crm.flick('empty', 'remove');
|
14
14
|
- else
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
$('##{create_id}').html('#{ j render(:partial => "new") }');
|
16
|
+
$('##{create_id}').effect("shake", { duration:250, distance: 6 });
|
17
|
+
$('#new_#{entity_name} input[type!=hidden]').first().focus();
|