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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.teatro.yml +3 -0
- data/.travis.yml +11 -4
- data/Capfile +25 -2
- data/Dockerfile +18 -0
- data/Gemfile +6 -2
- data/Gemfile.lock +108 -91
- data/README.md +6 -4
- data/app/assets/javascripts/crm.js.coffee +4 -1
- data/app/assets/javascripts/crm_select2.js.coffee +4 -2
- data/app/controllers/users_controller.rb +1 -1
- data/app/helpers/application_helper.rb +15 -6
- data/app/helpers/tags_helper.rb +3 -3
- data/app/mailers/user_mailer.rb +1 -1
- data/app/models/setting.rb +1 -1
- data/app/models/users/user.rb +1 -1
- data/app/views/authentications/new.html.haml +0 -12
- data/app/views/contacts/_index_full.html.haml +1 -1
- data/app/views/contacts/_section_general.html.haml +6 -3
- data/app/views/fields/_group_view.html.haml +2 -1
- data/app/views/home/_activity.html.haml +1 -1
- data/app/views/layouts/500.html.haml +0 -12
- data/config/database.postgres.docker.yml +25 -0
- data/config/deploy.example.rb +68 -41
- data/config/initializers/custom_field_ransack_translations.rb +6 -4
- data/config/locales/cz_fat_free_crm.yml +1 -1
- data/config/locales/de_fat_free_crm.yml +1 -1
- data/config/locales/en-GB_fat_free_crm.yml +201 -28
- data/config/locales/en-GB_ransack.yml +91 -0
- data/config/locales/en-US_fat_free_crm.yml +1 -1
- data/config/locales/es_fat_free_crm.yml +1 -1
- data/config/locales/fr-CA_fat_free_crm.yml +1 -1
- data/config/locales/fr_fat_free_crm.yml +1 -1
- data/config/locales/it_fat_free_crm.yml +1 -1
- data/config/locales/ja_fat_free_crm.yml +1 -1
- data/config/locales/ja_ransack.yml +91 -0
- data/config/locales/pl_fat_free_crm.yml +1 -1
- data/config/locales/pt-BR_fat_free_crm.yml +1 -1
- data/config/locales/ru_fat_free_crm.yml +1 -1
- data/config/locales/sv-SE_fat_free_crm.yml +1 -1
- data/config/locales/th_fat_free_crm.yml +1 -1
- data/config/locales/zh-CN_fat_free_crm.yml +430 -66
- data/config/locales/zh-CN_ransack.yml +91 -0
- data/config/settings.default.yml +9 -8
- data/db/demo/field_groups.yml +14 -0
- data/db/migrate/20140916011927_add_created_at_index_on_versions.rb +5 -0
- data/db/migrate/20140916012922_add_indexes_to_model_associations.rb +6 -0
- data/db/migrate/20141126031837_increase_email_to254_chars.rb +21 -0
- data/db/schema.rb +27 -22
- data/fig.yml +13 -0
- data/lib/fat_free_crm/callback.rb +9 -4
- data/lib/fat_free_crm/gem_dependencies.rb +1 -0
- data/lib/fat_free_crm/version.rb +1 -1
- data/spec/factories/user_factories.rb +4 -4
- data/spec/models/users/user_spec.rb +13 -0
- data/spec/views/admin/users/create.js.haml_spec.rb +0 -2
- 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(
|
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
|
-
|
410
|
-
|
411
|
-
|
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\-\.,@?^=%&:\/\+#]*[\w\-\@?^=%&\/\+#])?)/, "<a href=\"\\1\">\\1</a>")
|
415
423
|
end
|
416
|
-
|
417
|
-
|
424
|
+
out << content_tag(:td, fmt_value, class: last_class)
|
425
|
+
end
|
426
|
+
out
|
418
427
|
end
|
419
428
|
|
420
429
|
#----------------------------------------------------------------------------
|
data/app/helpers/tags_helper.rb
CHANGED
@@ -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(
|
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
|
-
|
20
|
-
end
|
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)
|
data/app/mailers/user_mailer.rb
CHANGED
data/app/models/setting.rb
CHANGED
@@ -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.
|
101
|
+
settings = YAML.load(ERB.new(File.read(file)).result)
|
102
102
|
@@yaml_settings.deep_merge!(settings)
|
103
103
|
end
|
104
104
|
|
data/app/models/users/user.rb
CHANGED
@@ -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
|
-
|
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
|
–
|
@@ -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)
|
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)
|
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)
|
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,
|
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
|
@@ -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
|
+
|
data/config/deploy.example.rb
CHANGED
@@ -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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
set :
|
18
|
-
|
19
|
-
|
20
|
-
set :
|
21
|
-
|
22
|
-
|
23
|
-
#
|
24
|
-
|
25
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|
-
|
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
|
-
|
9
|
-
|
10
|
-
|
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ď %{
|
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
|
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
|
-
|
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
|
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
|
-
|
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: ! '- "%{comment}"'
|
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
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
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
|
-
|
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: ! '← Previous'
|
679
825
|
next_label: Next →
|
@@ -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
|
-
|
725
|
-
|
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}
|