fat_free_crm 0.13.4 → 0.13.5

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.

Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.teatro.yml +3 -0
  4. data/.travis.yml +11 -4
  5. data/Capfile +25 -2
  6. data/Dockerfile +18 -0
  7. data/Gemfile +6 -2
  8. data/Gemfile.lock +108 -91
  9. data/README.md +6 -4
  10. data/app/assets/javascripts/crm.js.coffee +4 -1
  11. data/app/assets/javascripts/crm_select2.js.coffee +4 -2
  12. data/app/controllers/users_controller.rb +1 -1
  13. data/app/helpers/application_helper.rb +15 -6
  14. data/app/helpers/tags_helper.rb +3 -3
  15. data/app/mailers/user_mailer.rb +1 -1
  16. data/app/models/setting.rb +1 -1
  17. data/app/models/users/user.rb +1 -1
  18. data/app/views/authentications/new.html.haml +0 -12
  19. data/app/views/contacts/_index_full.html.haml +1 -1
  20. data/app/views/contacts/_section_general.html.haml +6 -3
  21. data/app/views/fields/_group_view.html.haml +2 -1
  22. data/app/views/home/_activity.html.haml +1 -1
  23. data/app/views/layouts/500.html.haml +0 -12
  24. data/config/database.postgres.docker.yml +25 -0
  25. data/config/deploy.example.rb +68 -41
  26. data/config/initializers/custom_field_ransack_translations.rb +6 -4
  27. data/config/locales/cz_fat_free_crm.yml +1 -1
  28. data/config/locales/de_fat_free_crm.yml +1 -1
  29. data/config/locales/en-GB_fat_free_crm.yml +201 -28
  30. data/config/locales/en-GB_ransack.yml +91 -0
  31. data/config/locales/en-US_fat_free_crm.yml +1 -1
  32. data/config/locales/es_fat_free_crm.yml +1 -1
  33. data/config/locales/fr-CA_fat_free_crm.yml +1 -1
  34. data/config/locales/fr_fat_free_crm.yml +1 -1
  35. data/config/locales/it_fat_free_crm.yml +1 -1
  36. data/config/locales/ja_fat_free_crm.yml +1 -1
  37. data/config/locales/ja_ransack.yml +91 -0
  38. data/config/locales/pl_fat_free_crm.yml +1 -1
  39. data/config/locales/pt-BR_fat_free_crm.yml +1 -1
  40. data/config/locales/ru_fat_free_crm.yml +1 -1
  41. data/config/locales/sv-SE_fat_free_crm.yml +1 -1
  42. data/config/locales/th_fat_free_crm.yml +1 -1
  43. data/config/locales/zh-CN_fat_free_crm.yml +430 -66
  44. data/config/locales/zh-CN_ransack.yml +91 -0
  45. data/config/settings.default.yml +9 -8
  46. data/db/demo/field_groups.yml +14 -0
  47. data/db/migrate/20140916011927_add_created_at_index_on_versions.rb +5 -0
  48. data/db/migrate/20140916012922_add_indexes_to_model_associations.rb +6 -0
  49. data/db/migrate/20141126031837_increase_email_to254_chars.rb +21 -0
  50. data/db/schema.rb +27 -22
  51. data/fig.yml +13 -0
  52. data/lib/fat_free_crm/callback.rb +9 -4
  53. data/lib/fat_free_crm/gem_dependencies.rb +1 -0
  54. data/lib/fat_free_crm/version.rb +1 -1
  55. data/spec/factories/user_factories.rb +4 -4
  56. data/spec/models/users/user_spec.rb +13 -0
  57. data/spec/views/admin/users/create.js.haml_spec.rb +0 -2
  58. metadata +14 -3
data/README.md CHANGED
@@ -44,13 +44,14 @@ contact lists, and opportunity tracking.
44
44
  </tr>
45
45
  </table>
46
46
 
47
- Active development started in November 2008.
48
- New features, enhancements, and updates appear on regular basis.
49
-
50
47
  Pull requests and bug reports are always welcome!
51
48
 
52
49
  Visit our website at http://www.fatfreecrm.com/
53
50
 
51
+ ## Rails 4 support
52
+
53
+ Currently, the master branch and gem releases of Fat Free CRM run on Rails 3.2 However, we are in the midst of upgrading to Rails 4.2, please see the [rails4](https://github.com/fatfreecrm/fat_free_crm/tree/rails4) branch. If you're a developer, you're welcome to check that code out, search for bugs and file them in the issue tracker using the [rails4](https://github.com/fatfreecrm/fat_free_crm/labels/rails4) label.
54
+
54
55
  ## Important security note
55
56
 
56
57
  Please note that several severe vulnerabilities have been fixed recently. You should upgrade to versions 0.12.3 or 0.13.2 or higher. See the [**security vulnerabilities**](https://github.com/fatfreecrm/fat_free_crm/wiki/Security) page for more details.
@@ -58,6 +59,7 @@ Please note that several severe vulnerabilities have been fixed recently. You sh
58
59
  ## System Requirements
59
60
 
60
61
  * Ruby 2.1 (or 2.0) recommended (it's much faster!)
62
+ * Ruby 2.2 is not officially supported, but [reported to work for MySQL users](https://github.com/fatfreecrm/fat_free_crm/issues/362)
61
63
  * Ruby 1.9.3 is also compatible
62
64
  * Ruby 1.9.2 should be compatible but is not longer supported
63
65
  * Ruby v1.8.7 was supported until v0.11.4 (see https://github.com/fatfreecrm/fat_free_crm/tree/ruby1.8)
@@ -150,4 +152,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
150
152
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
151
153
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
152
154
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
153
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
155
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -164,7 +164,10 @@
164
164
  if value is "specific_time"
165
165
  $("#task_bucket").toggle() # Hide dropdown.
166
166
  $("#task_calendar").toggle() # Show editable date field.
167
- $("#task_calendar").datepicker().focus() # Focus to invoke calendar popup.
167
+ $("#task_calendar").datepicker({
168
+ showOn: 'focus',
169
+ changeMonth: true,
170
+ dateFormat: 'yy-mm-dd'}).focus() # Focus to invoke calendar popup.
168
171
 
169
172
 
170
173
  #----------------------------------------------------------------------------
@@ -10,10 +10,12 @@
10
10
  window.crm ||= {}
11
11
 
12
12
  crm.make_select2 = ->
13
- $(".select2").each ->
13
+ $(".select2").not(".select2-container, .select2-offscreen").each ->
14
+ #$(".select2").each ->
14
15
  $(this).select2 'width':'resolve'
15
16
 
16
- $(".select2_tag").each ->
17
+ $(".select2_tag").not(".select2-container, .select2-offscreen").each ->
18
+ #$(".select2_tag").each ->
17
19
  $(this).select2
18
20
  'width':'resolve'
19
21
  tags: $(this).data("tags")
@@ -129,7 +129,7 @@ class UsersController < ApplicationController
129
129
  #----------------------------------------------------------------------------
130
130
  def opportunities_overview
131
131
  @users_with_opportunities = User.have_assigned_opportunities.order(:first_name)
132
- @unassigned_opportunities = Opportunity.unassigned.pipeline.order(:stage)
132
+ @unassigned_opportunities = Opportunity.my.unassigned.pipeline.order(:stage)
133
133
  end
134
134
 
135
135
  end
@@ -404,17 +404,26 @@ module ApplicationHelper
404
404
  end
405
405
 
406
406
  # Create a column in the 'asset_attributes' table.
407
+ # If a block is given, render it inside the td
407
408
  #----------------------------------------------------------------------------
408
- def col(title, value, last = false, email = false)
409
- # Parse and format urls as links.
410
- fmt_value = (value.to_s || "").gsub("\n", "<br />")
411
- fmt_value = if email
409
+ def col(title, value = nil, last = false, email = false, &block)
410
+ last_class = (last ? 'last' : nil)
411
+ out = content_tag(:th, title, class: last_class)
412
+ if block_given?
413
+ out << content_tag(:td, class: last_class) do
414
+ yield
415
+ end
416
+ else
417
+ # Parse and format urls as links.
418
+ fmt_value = (value.to_s || "").gsub("\n", "<br />")
419
+ fmt_value = if email
412
420
  link_to_email(fmt_value)
413
421
  else
414
422
  fmt_value.gsub(/((http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:\/\+#]*[\w\-\@?^=%&amp;\/\+#])?)/, "<a href=\"\\1\">\\1</a>")
415
423
  end
416
- last_class = (last ? 'last' : nil)
417
- content_tag(:th, title, class: last_class) + content_tag(:td, fmt_value, class: last_class)
424
+ out << content_tag(:td, fmt_value, class: last_class)
425
+ end
426
+ out
418
427
  end
419
428
 
420
429
  #----------------------------------------------------------------------------
@@ -8,7 +8,7 @@ module TagsHelper
8
8
  # Generate tag links for use on asset index pages.
9
9
  #----------------------------------------------------------------------------
10
10
  def tags_for_index(model)
11
- model.tag_list.inject([]) do |arr, tag|
11
+ model.tag_list.inject("".html_safe) do |out, tag|
12
12
  query = controller.send(:current_query) || ""
13
13
  hashtag = "##{tag}"
14
14
  if query.empty?
@@ -16,8 +16,8 @@ module TagsHelper
16
16
  elsif !query.include?(hashtag)
17
17
  query += " #{hashtag}"
18
18
  end
19
- arr << link_to_function(tag, "crm.search_tagged('#{query}', '#{model.class.to_s.tableize}')", :title => tag)
20
- end.join(" ").html_safe
19
+ out << link_to_function(tag, "crm.search_tagged('#{query}', '#{model.class.to_s.tableize}')", :title => tag)
20
+ end
21
21
  end
22
22
 
23
23
  def tags_for_dashboard(model)
@@ -27,7 +27,7 @@ class UserMailer < ActionMailer::Base
27
27
  private
28
28
 
29
29
  def from_address
30
- from = Setting.smtp[:from]
30
+ from = (Setting.smtp || {})[:from]
31
31
  !from.blank? ? from : "Fat Free CRM <noreply@fatfreecrm.com>"
32
32
  end
33
33
 
@@ -98,7 +98,7 @@ class Setting < ActiveRecord::Base
98
98
 
99
99
  # Loads settings from YAML files
100
100
  def load_settings_from_yaml(file)
101
- settings = YAML.load_file(file)
101
+ settings = YAML.load(ERB.new(File.read(file)).result)
102
102
  @@yaml_settings.deep_merge!(settings)
103
103
  end
104
104
 
@@ -67,7 +67,7 @@ class User < ActiveRecord::Base
67
67
 
68
68
  scope :text_search, ->(query) {
69
69
  query = query.gsub(/[^\w\s\-\.'\p{L}]/u, '').strip
70
- where('upper(username) LIKE upper(:s) OR upper(first_name) LIKE upper(:s) OR upper(last_name) LIKE upper(:s)', :s => "%#{query}%")
70
+ where('upper(username) LIKE upper(:s) OR upper(email) LIKE upper(:s) OR upper(first_name) LIKE upper(:s) OR upper(last_name) LIKE upper(:s)', :s => "%#{query}%")
71
71
  }
72
72
 
73
73
  scope :my, -> { accessible_by(User.current_ability) }
@@ -1,15 +1,3 @@
1
- = content_for(:javascript_epilogue) do
2
- :plain
3
- document.observe("dom:loaded", function() {
4
- new Effect.Move("standalone", { x:0, y:-16, mode:"relative", fps:100, duration:0.15, afterFinishInternal: function(effect) {
5
- new Effect.Move("standalone", { x:0, y:16, mode:"relative", fps:100, duration:0.15, afterFinishInternal: function(effect) {
6
- new Effect.Move("standalone", { x:0, y:-8, mode:"relative", fps:100, duration:0.15, afterFinishInternal: function(effect) {
7
- new Effect.Move("standalone", { x:0, y:8, mode:"relative", fps:100, duration:0.15 });
8
- }});
9
- }});
10
- }});
11
- });
12
-
13
1
  .standalone#standalone
14
2
  -# The following form gets submitted to #create when @authentication is nil,
15
3
  -# or to #update when @authentication is not nil (ex. suspended).
@@ -22,7 +22,7 @@
22
22
  = contact.title if contact.title?
23
23
 
24
24
  - if (account = contact.account) and account.name?
25
- == #{t :at} #{link_to_if can?(:read, account), account.name, account_path(account)}
25
+ = #{t :at} #{link_to_if can?(:read, account), account.name, account_path(account)}
26
26
 
27
27
  - if (lead = contact.lead) and lead.referred_by?
28
28
  &ndash;
@@ -10,11 +10,14 @@
10
10
  = col(t(:email), contact.email, false, true)
11
11
  = col(t(:phone), contact.phone)
12
12
  %tr
13
- = col(t(:account), account_with_url_for(contact))
13
+ = col(t(:account)) do
14
+ = account_with_url_for(contact)
14
15
  - assigned_to_user = User.find_by_id(contact.assigned_to)
15
- = col(t(:assigned_to), assigned_to_user ? link_to(assigned_to_user.name, url_for(assigned_to_user)) : "")
16
+ = col(t(:assigned_to)) do
17
+ = link_to(assigned_to_user.name, url_for(assigned_to_user)) if assigned_to_user
16
18
  %tr
17
- = col(t(:tags), contact.tag_list.map{|tag| content_tag(:span, tag, :class => "fbtag")}.join(' '))
19
+ = col(t(:tags)) do
20
+ .tags= tags_for_index(contact)
18
21
 
19
22
  -# Show custom fields that are in the default field group
20
23
  - custom_field_group = contact.field_groups.select{|f| f.name == 'custom_fields'}.first
@@ -3,7 +3,8 @@
3
3
  - groups.each_with_index do |group, i|
4
4
  %tr
5
5
  - group.each do |field|
6
- = col(field.label, field.render_value(entity), (i == groups.size - 1) ? :last : nil)
6
+ = col(field.label, (i == groups.size - 1) ? :last : nil) do
7
+ = field.render_value(entity)
7
8
  - if group.size == 1
8
9
  %th.last
9
10
  %td.last
@@ -28,7 +28,7 @@
28
28
  - else
29
29
  - type = t(activity.item_type.downcase)
30
30
  - if item.respond_to? :email
31
- = avatar_for(item, :size => "16x16")
31
+ = avatar_for(item, :size => :thumb)
32
32
  = type
33
33
  = subject
34
34
  = ":"
@@ -15,15 +15,3 @@
15
15
  %h3= link_to("Fat Free CRM", '/')
16
16
  %center
17
17
  %p.flash_exception#msg= exception
18
-
19
- %script
20
- :plain
21
- document.observe("dom:loaded", function() {
22
- new Effect.Move("msg", { x:0, y:-50, mode:"relative", fps:100, duration:0.15, afterFinishInternal: function(effect) {
23
- new Effect.Move("msg", { x:0, y:50, mode:"relative", fps:100, duration:0.15, afterFinishInternal: function(effect) {
24
- new Effect.Move("msg", { x:0, y:-25, mode:"relative", fps:100, duration:0.15, afterFinishInternal: function(effect) {
25
- new Effect.Move("msg", { x:0, y:25, mode:"relative", fps:100, duration:0.15 });
26
- }});
27
- }});
28
- }});
29
- });
@@ -0,0 +1,25 @@
1
+ development: &development
2
+ adapter: postgresql
3
+ database: fat_free_crm_development
4
+ username: postgres
5
+ password:
6
+ host: db
7
+ port: 5432
8
+ schema_search_path: public
9
+ min_messages: warning
10
+
11
+ # Warning: The database defined as "test" will be erased and
12
+ # re-generated from your development database when you run "rake".
13
+ # Do not set this db to the same as development or production.
14
+ test:
15
+ <<: *development
16
+ database: fat_free_crm_test
17
+
18
+ production:
19
+ <<: *development
20
+ database: fat_free_crm_production
21
+
22
+ staging:
23
+ <<: *development
24
+ database: fat_free_crm_staging
25
+
@@ -3,50 +3,77 @@
3
3
  # Fat Free CRM is freely distributable under the terms of MIT license.
4
4
  # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
5
  #------------------------------------------------------------------------------
6
- $:.unshift File.expand_path('./lib', ENV['rvm_path'])
7
-
8
- require 'rvm/capistrano'
9
- require 'bundler/capistrano'
10
- load 'deploy/assets'
11
-
12
- set :application, 'fat_free_crm'
13
- set :repository, 'git://github.com/fatfreecrm/fat_free_crm.git'
14
- set :branch, 'master'
15
- set :scm, :git
16
- set :deploy_to, ''
17
- set :user, ''
18
- set :use_sudo, false
19
- set :rvm_type, :user
20
- set :rvm_ruby_string, '1.9.3'
21
- server '', :app, :web, :db, primary: true
22
-
23
- # Use local key instead of key installed on the server.
24
- # If not working run "ssh-add ~/.ssh/id_rsa" on your local machine.
25
- ssh_options[:forward_agent] = true
6
+
7
+ # config valid only for Capistrano 3.1
8
+ lock '3.2.1'
9
+
10
+ set :application, 'fat_free_crm'
11
+ set :repo_url, 'git://github.com/fatfreecrm/fat_free_crm.git'
12
+
13
+ # Default branch is :master
14
+ # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call
15
+
16
+ # Default deploy_to directory is /var/www/my_app
17
+ # set :deploy_to, '/var/www/my_app'
18
+
19
+ # Default value for :scm is :git
20
+ # set :scm, :git
21
+
22
+ # Default value for :format is :pretty
23
+ # set :format, :pretty
24
+
25
+ # Default value for :log_level is :debug
26
+ # set :log_level, :debug
27
+
28
+ # Default value for :pty is false
29
+ # set :pty, true
30
+
31
+ # Default value for :linked_files is []
32
+ set :linked_files, %w{config/database.yml config/settings.yml}
33
+
34
+ # Default value for linked_dirs is []
35
+ # set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
36
+
37
+ # Default value for default_env is {}
38
+ # set :default_env, { path: "/opt/ruby/bin:$PATH" }
39
+
40
+ # Default value for keep_releases is 5
41
+ # set :keep_releases, 5
42
+
43
+ set :rvm_ruby_version, '2.1.5'
26
44
 
27
45
  namespace :deploy do
28
- task :start, roles: :app do
29
- run "touch #{current_release}/tmp/restart.txt"
30
- end
31
-
32
- task :stop, roles: :app do
33
- # Do nothing.
34
- end
35
-
36
- desc 'Tell Passenger to restart the app.'
37
- task :restart, roles: :app, except: { no_release: true } do
38
- run "touch #{current_release}/tmp/restart.txt"
39
- run "cd #{current_release} && passenger stop -p 3001"
40
- run "cd #{current_release} && passenger start -a 127.0.0.1 -p 3001 -d -e production"
46
+
47
+ desc 'Restart application'
48
+ task :restart do
49
+ on roles(:app), in: :sequence, wait: 5 do
50
+ # Your restart mechanism here, for example:
51
+ # execute :touch, release_path.join('tmp/restart.txt')
52
+ end
41
53
  end
42
-
43
- desc 'Symlink shared configs and folders on each release.'
44
- task :symlink_shared do
45
- run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
46
- run "ln -nfs #{shared_path}/config/settings.yml #{release_path}/config/settings.yml"
47
- run "rm -rf #{release_path}/vendor/ruby"
48
- run "ln -nfs #{shared_path}/bundle/ruby #{release_path}/vendor/ruby"
54
+
55
+ after :publishing, :restart
56
+
57
+ after :restart, :clear_cache do
58
+ on roles(:web), in: :groups, limit: 3, wait: 10 do
59
+ # Here we can do anything such as:
60
+ # within release_path do
61
+ # execute :rake, 'cache:clear'
62
+ # end
63
+ end
49
64
  end
65
+
50
66
  end
51
67
 
52
- after 'deploy:finalize_update', 'deploy:symlink_shared'
68
+ # cap production invoke[db:migrate]
69
+ # cap production invoke[db:reset]
70
+ desc "Invoke a rake command on the remote server: cap production invoke[db:migrate]"
71
+ task :invoke, [:command] => 'deploy:set_rails_env' do |task, args|
72
+ on primary(:app) do
73
+ within current_path do
74
+ with :rails_env => fetch(:rails_env) do
75
+ rake args[:command]
76
+ end
77
+ end
78
+ end
79
+ end
@@ -5,11 +5,13 @@ if Setting.database_and_table_exists?
5
5
 
6
6
  translations = {ransack: { attributes: {}}}
7
7
  CustomField.find_each do |custom_field|
8
- model_key = custom_field.klass.model_name.singular
9
- translations[:ransack][:attributes][model_key] ||= {}
10
- translations[:ransack][:attributes][model_key][custom_field.name] = custom_field.label
8
+ if custom_field.field_group.present?
9
+ model_key = custom_field.klass.model_name.singular
10
+ translations[:ransack][:attributes][model_key] ||= {}
11
+ translations[:ransack][:attributes][model_key][custom_field.name] = custom_field.label
12
+ end
11
13
  end
12
14
 
13
15
  I18n.backend.store_translations(Setting.locale.to_sym, translations)
14
16
  end
15
- end
17
+ end
@@ -203,7 +203,7 @@ cz:
203
203
  commented_past_participle: okomentované
204
204
  email_past_participle: email
205
205
  show_per_page: Zobraz %{number} %{models} za stránku užívající %{fmt} format.
206
- sort_by: Setřiď %{models} podle %{field}.
206
+ sort_by: Setřiď %{field}.
207
207
  sort_by_displaying: Setřiď %{models} podle %{field} zobrazující jméno %{position}
208
208
  příjmení.
209
209
  aim: AOL IM
@@ -523,7 +523,7 @@ de:
523
523
  expanded: Erweitert
524
524
  alt_email: Alternative Email
525
525
  create_past_participle: Zuletzt erstellte Datensätze
526
- sort_by: Sortiere %{models} nach %{field}
526
+ sort_by: Sortiere nach %{field}
527
527
  aim: AOL IM
528
528
  update_past_participle: Aktualisierungen
529
529
  called_off: Abgesagt
@@ -1,6 +1,10 @@
1
1
  ---
2
2
  en-GB:
3
3
  language: English (UK)
4
+
5
+ # Generic terms.
6
+ #----------------------------------------------------------------------------
7
+ id: Id
4
8
  all: All
5
9
  at: at
6
10
  here: here
@@ -10,6 +14,10 @@ en-GB:
10
14
  select_none: -- None --
11
15
  select_blank: -- Select --
12
16
  yes_button: 'Yes'
17
+
18
+
19
+ # Settings.
20
+ #----------------------------------------------------------------------------
13
21
  tab_dashboard: Dashboard
14
22
  tab_tasks: Tasks
15
23
  tab_campaigns: Campaigns
@@ -75,12 +83,18 @@ en-GB:
75
83
  completed_last_week: Last week
76
84
  completed_this_month: This month
77
85
  completed_last_month: Last month
86
+
87
+ # Models/Activity.
88
+ #----------------------------------------------------------------------------
78
89
  one_hour: One Hour
79
90
  one_day: One Day
80
91
  two_days: Two Days
81
92
  one_week: One Week
82
93
  two_weeks: Two Weeks
83
94
  one_month: One Month
95
+
96
+ # Model Validations.
97
+ #----------------------------------------------------------------------------
84
98
  activerecord:
85
99
  errors:
86
100
  models:
@@ -141,14 +155,41 @@ en-GB:
141
155
  email:
142
156
  missing_email: ^Please specify email address.
143
157
  email_in_use: ^There is another user with the same email.
158
+ custom_field:
159
+ required: ^%{field} is required.
160
+ maxlength: ^%{field} is too long.
161
+ endbeforestart: ^%{field} cannot end before it begins.
162
+ attribute_options:
163
+ opportunity:
164
+ stage:
165
+ prospecting: Prospecting
166
+ analysis: Analysis
167
+ presentation: Presentation
168
+ proposal: Proposal
169
+ negotiation: Negotiation
170
+ final_review: Final Review
171
+ won: Closed/Won
172
+ lost: Closed/Lost
173
+ account:
174
+ rating:
175
+ "0": "-"
176
+ "1": "★"
177
+ "2": "★★"
178
+ "3": "★★★"
179
+ "4": "★★★★"
180
+ "5": "★★★★★"
181
+
144
182
  msg_account_suspended: User account has been suspended.
145
183
  password_reset_instruction: password reset instructions
184
+
185
+ # Controllers.
186
+ #----------------------------------------------------------------------------
146
187
  msg_account_created: Your account has been created and is awaiting approval by the
147
188
  system administrator.
148
189
  msg_account_not_approved: Your account has not been approved yet.
149
190
  msg_asset_deleted: ! '%{value} has been deleted.'
150
191
  msg_asset_not_available: This %{value} is no longer available.
151
- msg_asset_not_authorized: You are not authorized to view this %{value}.
192
+ msg_not_authorized: You are not authorized to take this action.
152
193
  msg_assets_not_available: The %{value} are not available.
153
194
  msg_asset_rejected: ! '%{value} has been rejected.'
154
195
  msg_bad_image_file: ^Could't upload or resize the image file you specified.
@@ -173,6 +214,9 @@ en-GB:
173
214
  msg_require_admin: You must be Administrator to access this page.
174
215
  msg_successful_signup: Successful signup, welcome to Fat Free CRM!
175
216
  msg_welcome: Welcome to Fat Free CRM!
217
+
218
+ # Options.
219
+ #----------------------------------------------------------------------------
176
220
  option_amount*probability: weighted amount
177
221
  activity_options: Show %{models} %{action_type} performed by %{user} in the past
178
222
  %{period}.
@@ -200,9 +244,20 @@ en-GB:
200
244
  option_target_revenue: target revenue
201
245
  option_updated_at: date updated
202
246
  show_per_page: Show %{number} %{models} per page using %{fmt} format.
203
- sort_by: Sort %{models} by %{field}.
247
+ sort_by: Sort by %{field}
204
248
  sort_by_displaying: Sort %{models} by %{field} displaying first name %{position}
205
249
  last name.
250
+ entities_per_page: ! '%{entity} per page:'
251
+ contacts_index_long: Long format
252
+ contacts_index_brief: Brief format
253
+ contacts_index_full: Full format
254
+ opportunities_index_normal: Normal format
255
+ accounts_index_normal: Normal format
256
+ leads_index_normal: Normal format
257
+ campaigns_index_normal: Normal format
258
+
259
+ # Views -> Profile.
260
+ #----------------------------------------------------------------------------
206
261
  aim: AOL IM
207
262
  already_signed_up: Already signed up?
208
263
  alt_email: Alternative email
@@ -241,16 +296,23 @@ en-GB:
241
296
  born_on: Born on
242
297
  reports_to: Reports to
243
298
  access: Access
244
- contacts_account: Contact's account
299
+
300
+ # Views -> Authenticate.
301
+ #----------------------------------------------------------------------------
245
302
  forgot_password: Forgot Password
246
303
  login: Login
247
304
  no_account: Do not have an account?
248
305
  remember_me: Remember Me
249
306
  sign_up_now: Sign Up Now!
307
+
308
+ # Views -> Accounts.
309
+ #----------------------------------------------------------------------------
250
310
  account: Account
311
+ account_id: Account
251
312
  select_an_account: Select an Account
252
313
  account_small: account
253
314
  account_summary: Account Summary
315
+ account_categories: Account Categories
254
316
  accounts: Accounts
255
317
  accounts_options: Accounts Options
256
318
  accounts_small: accounts
@@ -275,6 +337,11 @@ en-GB:
275
337
  shipping_address: Shipping address
276
338
  total_accounts: Total Accounts
277
339
  website: Website
340
+ account_with_title_department: ! '%{title}, %{department} at %{account}'
341
+ account_with_title: ! '%{title} at %{account}'
342
+
343
+ # Views -> Campaigns.
344
+ #----------------------------------------------------------------------------
278
345
  actual: Actual
279
346
  actual_performance: Actual Performance
280
347
  budget: Budget
@@ -284,12 +351,14 @@ en-GB:
284
351
  campaign_small: campaign
285
352
  campaign_summary: Campaign Summary
286
353
  campaign_targets: Campaign Targets
354
+ campaign_statuses: Campaign Statuses
287
355
  campaigns: Campaigns
288
356
  campaigns_options: Campaigns Options
289
357
  campaigns_small: campaigns
290
358
  conversion: Conversion
291
359
  conversion_label: Conversion (%)
292
360
  conversion_number: ! '%{value} conversion'
361
+ target_conversion: Target conversion
293
362
  create_campaign: Create Campaign
294
363
  end_date: End date
295
364
  finished_on: completed on %{value}
@@ -314,6 +383,10 @@ en-GB:
314
383
  was_supposed_to_finish: was supposed to finish on %{value}
315
384
  was_supposed_to_start: was supposed to start %{time_ago} ago on %{start_date}
316
385
  was_supposed_to_start_in: was supposed to start in %{starts_in} on %{start_date}
386
+ select_a_campaign: Select a campaign
387
+
388
+ # Views -> Contacts.
389
+ #----------------------------------------------------------------------------
317
390
  alt_email_small: Other
318
391
  blog: Website/Blog
319
392
  contact: Contact
@@ -321,6 +394,7 @@ en-GB:
321
394
  contacts: Contacts
322
395
  contacts_options: Contacts Options
323
396
  contacts_small: contacts
397
+ contact_summary: Contact Summary
324
398
  create_contact: Create Contact
325
399
  department: Department
326
400
  department_small: ! '%{value} department'
@@ -344,6 +418,17 @@ en-GB:
344
418
  web_presence: Web Presence
345
419
  web_presence_small: web presence
346
420
  works_at: ! '%{job_title} at %{company}'
421
+ general_info: General Information
422
+ show_general_info_small: Show general information for this contact.
423
+ show_extra_info_small: Show extra information for this contact.
424
+ tag_details: ! '%{tag} Details'
425
+ show_tag_info_small: Show %{tag} information for this contact.
426
+ shared_with_everyone: Shared with everyone
427
+ title: Title
428
+ subscriptions: Subscriptions
429
+
430
+ # Views -> Leads.
431
+ #----------------------------------------------------------------------------
347
432
  convert: Convert
348
433
  convert_lead: Convert Lead
349
434
  convert_lead_permissions_intro: Contact permissions will be copied from the lead
@@ -366,6 +451,7 @@ en-GB:
366
451
  lead_small: lead
367
452
  lead_status_small: lead status
368
453
  lead_summary: Lead Summary
454
+ lead_statuses: Lead Statuses
369
455
  leads: Leads
370
456
  leads_options: Leads Options
371
457
  leads_small: leads
@@ -377,8 +463,14 @@ en-GB:
377
463
  source: Source
378
464
  status: Status
379
465
  total_leads: Total Leads
466
+ show_status_info_small: Show status information for this lead.
467
+ show_contact_info_small: Show contact information for this lead.
468
+
469
+ # Views -> Opportunities.
470
+ #----------------------------------------------------------------------------
380
471
  amount: Amount
381
472
  close_date: Close date
473
+ closes_on: Closes on
382
474
  closed_ago_on: closed %{time_ago} ago on %{date}
383
475
  closes_today: expected to close today!
384
476
  closing_date: closing date is %{value}
@@ -397,6 +489,7 @@ en-GB:
397
489
  opportunities_small: opportunities
398
490
  opportunity: Opportunity
399
491
  opportunity_small: opportunity
492
+ opportunity_stages: Opportunity Stages
400
493
  opportunity_summary: Opportunity At a Glance
401
494
  opportunity_summary_text: ! '%{amount} with %{discount} discount and %{probability}
402
495
  probability'
@@ -407,6 +500,9 @@ en-GB:
407
500
  stage: Stage
408
501
  total_opportunities: Total Opportunities
409
502
  weighted_amount: Weighted amount
503
+
504
+ # Views -> Tasks.
505
+ #----------------------------------------------------------------------------
410
506
  task: Task
411
507
  task_small: task
412
508
  tasks: Tasks
@@ -447,8 +543,14 @@ en-GB:
447
543
  total_tasks: Total %{value}
448
544
  view_assigned_tasks: view assigned tasks
449
545
  view_pending_tasks: view pending tasks
546
+
547
+ # Views -> Team.
548
+ #----------------------------------------------------------------------------
450
549
  unassigned_opportunities: Unassigned Opportunities
451
550
  no_opportunities_found: There are currently no outstanding opportunities.
551
+
552
+ # Views -> Home.
553
+ #----------------------------------------------------------------------------
452
554
  action_completed: completed
453
555
  action_create: created
454
556
  action_destroy: deleted
@@ -472,11 +574,13 @@ en-GB:
472
574
  subject_opportunity: opportunity
473
575
  subject_task: task
474
576
  subject_user: user
577
+ tag_list: Tags
475
578
  create_past_participle: Record Creations
476
579
  view_past_participle: Views
477
580
  update_past_participle: Updates
478
581
  destroy_past_participle: Deletions
479
582
  all_events_past_participle: Activities
583
+ action_create_comment: ! '- &quot;%{comment}&quot;'
480
584
  my_tasks: My Tasks
481
585
  no_task_records: You have no tasks.
482
586
  my_opportunities: My Opportunities
@@ -484,6 +588,9 @@ en-GB:
484
588
  my_accounts: My Accounts
485
589
  no_account_records: You have no accounts
486
590
  not_showing_hidden_entities: Not showing %{count} hidden %{entity}.
591
+
592
+ # Views -> Common.
593
+ #----------------------------------------------------------------------------
487
594
  add_note: Add Note
488
595
  save_note: Save Note
489
596
  add_note_help: Add a new note...
@@ -535,6 +642,9 @@ en-GB:
535
642
  collapse_all: Collapse all
536
643
  expanded: Expanded
537
644
  collapsed: Collapsed
645
+
646
+ # Views -> Layout.
647
+ #----------------------------------------------------------------------------
538
648
  about: About
539
649
  about_dev_group: Discussion group for developers
540
650
  about_features: Features and bugs
@@ -551,28 +661,17 @@ en-GB:
551
661
  logout: Logout
552
662
  quick_find: Quick find
553
663
  welcome: Welcome
664
+
665
+ # Advanced search
554
666
  accounts_advanced_search: Accounts Advanced search
555
667
  advanced_search: Advanced search
556
- advanced_search_submit: Search
557
- advanced_search_add_group: Add a group of filters
558
- advanced_search_group_first: Show results where %{combinator} of the following match
559
- advanced_search_group_rest: ! '...and where %{combinator} of the following match'
560
- advanced_search_add_condition: Add a filter
561
- advanced_search_remove_condition: Remove filter
562
- ransack:
563
- predicates:
564
- eq: is
565
- not_eq: is not
566
- lt: is less than
567
- gt: is greater than
568
- matches: matches
569
- does_not_match: doesn't match
570
- cont: contains
571
- not_cont: doesn't contain
572
- blank: is blank
573
- present: is present
574
- 'null': is null
575
- not_null: is not null
668
+ basic_search: Basic search
669
+ search_results_count:
670
+ one: Search found %{count} result.
671
+ other: Search found %{count} results.
672
+
673
+ # Views -> Comments.
674
+ #----------------------------------------------------------------------------
576
675
  comment: Comment
577
676
  edit_comment: Editing comment
578
677
  show: Show
@@ -582,19 +681,34 @@ en-GB:
582
681
  subscribe_via_email: Subscribe via email
583
682
  disable_email_subscriptions: Disable email subscription
584
683
  added_note: added note %{value}
684
+
685
+ # Views -> Emails.
686
+ #----------------------------------------------------------------------------
687
+
688
+ # Views -> Passwords.
689
+ #----------------------------------------------------------------------------
585
690
  confirm_password_intro: Please type your new password and then confirm it.
586
691
  password_intro: Please specify your email address, and the instructions to reset
587
692
  your password will be sent to you.
588
693
  reset_password: Reset Password
589
694
  update_password_and_login: Update Password and Login
695
+
696
+ # Views -> Admin
697
+ #----------------------------------------------------------------------------
590
698
  back_to_crm: Back to Fat Free CRM
591
699
  crm_admin_page: Fat Free CRM Administration
700
+
701
+ # Views -> Admin -> Groups
702
+ #----------------------------------------------------------------------------
592
703
  create_group: Create Group
593
704
  save_group: Save Group
594
705
  group_members: members
595
706
  groups: Groups
596
707
  groups_small: groups
597
708
  group_small: group
709
+
710
+ # Views -> Admin -> Users
711
+ #----------------------------------------------------------------------------
598
712
  confirm_group_delete: Are you sure you wish to delete this group? There are %{count}
599
713
  items that still reference it.
600
714
  approve: Approve
@@ -602,6 +716,7 @@ en-GB:
602
716
  last_seen: last seen %{value} ago
603
717
  last_seen2: last seen %{value}
604
718
  personal_information: Personal Information
719
+ group_memberships: Group Memberships
605
720
  reactivate: Reactivate
606
721
  save_user: Save User
607
722
  suspend: Suspend
@@ -618,6 +733,9 @@ en-GB:
618
733
  user_suspended_on: suspended on %{value}
619
734
  users: Users
620
735
  users_small: users
736
+
737
+ # Views -> Versions
738
+ #----------------------------------------------------------------------------
621
739
  versions: History
622
740
  version:
623
741
  create: ! '%{item} created by %{by}'
@@ -627,25 +745,47 @@ en-GB:
627
745
  unset_html: ! '%{attr} unset'
628
746
  change_html: ! '%{attr} changed from %{from} to %{to}'
629
747
  anonymous: anonymous
748
+ account_contact_id: Account id
749
+ account_contact_name: Account name
750
+ user_id: User id
751
+ created_at: Created at
752
+ updated_at: Updated at
753
+
754
+ # Export.
755
+ #----------------------------------------------------------------------------
630
756
  to_xls: Export to Excel
631
757
  to_csv: Export to comma-delimited file format (including deleted records)
632
758
  to_rss: RSS feed
633
759
  to_atom: Atom feed
760
+ to_perm: Permalink
761
+
762
+ # Dropbox.
763
+ #----------------------------------------------------------------------------
634
764
  dropbox_notification_subject: dropbox - Added email - %{subject}
635
765
  dropbox_notification_intro: Succesfully added the email you sent to dropbox
636
766
  dropbox_notification_to: Added to
637
767
  subject: Subject
638
768
  body: Body
769
+
770
+ # Comment Inbox
771
+ #----------------------------------------------------------------------------
639
772
  comment_notification:
640
773
  intro: ! '%{user_full_name} commented on %{entity_type}: %{entity_name}'
641
774
  reply_instructions: Reply to this email directly to add a new comment, or view
642
775
  the %{entity} online
643
- lists: Lists
776
+
777
+ # Lists
778
+ #----------------------------------------------------------------------------
779
+ global_lists: Global lists
780
+ personal_lists: My lists
644
781
  list: List
645
782
  no_saved_lists: No saved lists
646
783
  make_current_view_list: Make current view a list
647
784
  list_name_info: If you use the name of an existing list, you will overwrite that
648
785
  list with your current settings
786
+
787
+ # Pluralizations.
788
+ #----------------------------------------------------------------------------
649
789
  pluralize:
650
790
  comment:
651
791
  one: 1 comment
@@ -665,6 +805,9 @@ en-GB:
665
805
  login:
666
806
  one: 1 login
667
807
  other: ! '%{count} logins'
808
+
809
+ # Custom date/time formats.
810
+ #----------------------------------------------------------------------------
668
811
  date:
669
812
  formats:
670
813
  mmddyyyy: ! '%Y-%m-%d'
@@ -674,6 +817,9 @@ en-GB:
674
817
  formats:
675
818
  mmddhhss: ! '%e %b at %l:%M%p'
676
819
  mmddyyyy_hhmm: ! '%e %b %Y at %l:%M%p'
820
+
821
+ # will_paginate translations copied for 'en-US'
822
+ #----------------------------------------------------------------------------
677
823
  will_paginate:
678
824
  previous_label: ! '&#8592; Previous'
679
825
  next_label: Next &#8594;
@@ -684,6 +830,9 @@ en-GB:
684
830
  one: Displaying 1 %{name}
685
831
  other: Displaying all %{count} %{plural}
686
832
  multi_page: Displaying %{plural} %{from} - %{to} of %{total} in total
833
+
834
+ # Views -> Admin -> Custom Fields
835
+ #----------------------------------------------------------------------------
687
836
  label: Label
688
837
  custom_fields: Custom Fields
689
838
  custom_field_options: Custom Field Options
@@ -694,8 +843,8 @@ en-GB:
694
843
  save_field_group: Save field group
695
844
  field_group_empty: There are no fields in this group.
696
845
  select_or_create_tags: Select some tags, or create a new tag by pressing 'enter'.
697
- restrict_by_tag: Restrict by Tag
698
- restrict_by_tag_info: Only show fields for %{assets} that are tagged with
846
+ restrict_by_tag: ! 'Restrict by Tag:'
847
+ restrict_by_tag_info: (Only show fields for %{assets} that are tagged with the following)
699
848
  field_group_tag_restriction: This field group applies to %{assets} tagged with "%{tag}"
700
849
  field_group_unrestricted: This field group applies to all %{assets}
701
850
  field_group_confirm_delete: If a field group is deleted, any fields will be moved
@@ -705,12 +854,21 @@ en-GB:
705
854
  Create a new field group, or add fields to one of the groups below.
706
855
  You can drag and drop fields to change their display order or move them between
707
856
  field groups.'
857
+ # Views -> Admin -> Tags
858
+ #----------------------------------------------------------------------------
859
+ admin_fields_info2: ! 'It is strongly recommended you restart your server after
860
+ adding or removing any custom field.
861
+
862
+ '
708
863
  tags: Tags
709
864
  tag_small: tag
710
865
  tagged: Tagged
711
866
  create_tag: Create Tag
712
867
  save_tag: Save Tag
713
868
  field_group_tags: Field Groups shown for this Tag
869
+
870
+ # Views -> Admin -> Plugins
871
+ #----------------------------------------------------------------------------
714
872
  tag_with_taggings_confirm_delete: If this tag is deleted, it will be removed from
715
873
  %{value} records.
716
874
  msg_cant_delete_tag: Couldn't delete '%{value}' since it has associated Field Groups.
@@ -720,14 +878,23 @@ en-GB:
720
878
  author: Author
721
879
  version: Version
722
880
  description: Description
881
+
882
+ # Simple Form translations
883
+ #----------------------------------------------------------------------------
723
884
  simple_form:
724
- 'yes': 'Yes'
725
- 'no': 'No'
885
+ yes: 'Yes'
886
+ no: 'No'
726
887
  required:
727
888
  text: required
728
889
  mark: ! '*'
890
+ # You can uncomment the line below if you need to overwrite the whole required html.
891
+ # When using html, text and mark won't be used.
892
+ # html: '<abbr title="required">*</abbr>'
729
893
  error_notification:
730
894
  default_message: ! 'Some errors were found, please take a look:'
895
+
896
+ # Form field types
897
+ #----------------------------------------------------------------------------
731
898
  field_types:
732
899
  string:
733
900
  title: Short Answer
@@ -763,3 +930,9 @@ en-GB:
763
930
  title: Number (Integer)
764
931
  float:
765
932
  title: Number (Floating Point)
933
+ pair:
934
+ start: Start
935
+ end: End
936
+ from_to: From %{from} to %{to}
937
+ from_only: From %{from}
938
+ to_only: Until %{to}