fat_free_crm 0.13.4 → 0.13.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of fat_free_crm might be problematic. Click here for more details.
- 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}
|