fat_free_crm 0.19.2 → 0.20.0

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 (226) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/brakeman-analysis.yml +46 -0
  3. data/.github/workflows/rubocop-analysis.yml +40 -0
  4. data/.github/workflows/ruby.yml +52 -0
  5. data/.rubocop_todo.yml +49 -43
  6. data/.travis.yml +1 -20
  7. data/CHANGELOG.md +13 -0
  8. data/Gemfile +9 -5
  9. data/Gemfile.lock +163 -119
  10. data/README.md +4 -3
  11. data/SECURITY.md +11 -0
  12. data/app/assets/javascripts/application.js.erb +3 -0
  13. data/app/assets/stylesheets/application.css.erb +1 -0
  14. data/app/assets/stylesheets/base.scss +9 -2
  15. data/app/assets/stylesheets/bootstrap-custom.scss +206 -0
  16. data/app/assets/stylesheets/common.scss +87 -67
  17. data/app/assets/stylesheets/header.scss +0 -8
  18. data/app/controllers/admin/field_groups_controller.rb +1 -1
  19. data/app/controllers/admin/fields_controller.rb +1 -1
  20. data/app/controllers/admin/groups_controller.rb +1 -1
  21. data/app/controllers/admin/tags_controller.rb +2 -2
  22. data/app/controllers/admin/users_controller.rb +2 -1
  23. data/app/controllers/application_controller.rb +10 -0
  24. data/app/controllers/comments_controller.rb +1 -1
  25. data/app/controllers/entities/accounts_controller.rb +1 -1
  26. data/app/controllers/entities/campaigns_controller.rb +1 -1
  27. data/app/controllers/home_controller.rb +3 -1
  28. data/app/controllers/lists_controller.rb +1 -1
  29. data/app/controllers/tasks_controller.rb +3 -3
  30. data/app/controllers/users_controller.rb +3 -1
  31. data/app/helpers/accounts_helper.rb +12 -0
  32. data/app/helpers/application_helper.rb +3 -5
  33. data/app/helpers/tasks_helper.rb +2 -2
  34. data/app/models/entities/account.rb +1 -1
  35. data/app/models/entities/account_contact.rb +1 -1
  36. data/app/models/entities/account_opportunity.rb +1 -1
  37. data/app/models/entities/campaign.rb +1 -1
  38. data/app/models/entities/contact.rb +1 -1
  39. data/app/models/entities/lead.rb +1 -1
  40. data/app/models/entities/opportunity.rb +1 -1
  41. data/app/models/fields/custom_field_pair.rb +2 -2
  42. data/app/models/observers/opportunity_observer.rb +1 -1
  43. data/app/models/polymorphic/address.rb +1 -1
  44. data/app/models/polymorphic/comment.rb +1 -1
  45. data/app/models/polymorphic/email.rb +1 -1
  46. data/app/models/polymorphic/task.rb +1 -1
  47. data/app/models/setting.rb +4 -2
  48. data/app/models/users/preference.rb +2 -2
  49. data/app/models/users/user.rb +2 -2
  50. data/app/views/accounts/_edit.html.haml +2 -2
  51. data/app/views/accounts/_new.html.haml +2 -2
  52. data/app/views/accounts/_sidebar_index.html.haml +2 -2
  53. data/app/views/accounts/_sidebar_show.html.haml +19 -19
  54. data/app/views/accounts/create.js.haml +1 -2
  55. data/app/views/accounts/destroy.js.haml +1 -1
  56. data/app/views/accounts/show.html.haml +1 -0
  57. data/app/views/accounts/update.js.haml +2 -3
  58. data/app/views/admin/field_groups/create.js.haml +0 -1
  59. data/app/views/admin/field_groups/destroy.js.haml +0 -1
  60. data/app/views/admin/field_groups/update.js.haml +0 -1
  61. data/app/views/admin/fields/create.js.haml +0 -1
  62. data/app/views/admin/fields/destroy.js.haml +0 -1
  63. data/app/views/admin/fields/update.js.haml +0 -1
  64. data/app/views/admin/groups/create.js.haml +0 -1
  65. data/app/views/admin/groups/destroy.js.haml +0 -1
  66. data/app/views/admin/groups/update.js.haml +0 -1
  67. data/app/views/admin/tags/create.js.haml +0 -1
  68. data/app/views/admin/tags/destroy.js.haml +0 -1
  69. data/app/views/admin/tags/update.js.haml +0 -1
  70. data/app/views/admin/users/create.js.haml +0 -1
  71. data/app/views/admin/users/destroy.js.haml +0 -1
  72. data/app/views/admin/users/update.js.haml +0 -1
  73. data/app/views/campaigns/_edit.html.haml +1 -1
  74. data/app/views/campaigns/_new.html.haml +1 -1
  75. data/app/views/campaigns/_sidebar_index.html.haml +2 -2
  76. data/app/views/campaigns/_sidebar_show.html.haml +68 -67
  77. data/app/views/campaigns/create.js.haml +1 -2
  78. data/app/views/campaigns/destroy.js.haml +1 -1
  79. data/app/views/campaigns/show.html.haml +1 -0
  80. data/app/views/campaigns/update.js.haml +3 -4
  81. data/app/views/comments/_edit.html.haml +1 -1
  82. data/app/views/comments/_new.html.haml +1 -1
  83. data/app/views/comments/update.js.haml +0 -1
  84. data/app/views/contacts/_edit.html.haml +1 -1
  85. data/app/views/contacts/_new.html.haml +1 -1
  86. data/app/views/contacts/_sidebar_show.html.haml +18 -18
  87. data/app/views/contacts/create.js.haml +0 -1
  88. data/app/views/contacts/destroy.js.haml +1 -1
  89. data/app/views/contacts/show.html.haml +1 -0
  90. data/app/views/contacts/update.js.haml +2 -3
  91. data/app/views/entities/_title_bar.html.haml +1 -1
  92. data/app/views/entities/attach.js.haml +2 -2
  93. data/app/views/entities/discard.js.haml +2 -2
  94. data/app/views/home/_opportunity.html.haml +1 -1
  95. data/app/views/home/_task.html.haml +1 -1
  96. data/app/views/home/index.xls.builder +51 -0
  97. data/app/views/layouts/_sidebar.html.haml +2 -2
  98. data/app/views/layouts/_tabbed.html.haml +14 -11
  99. data/app/views/layouts/application.html.haml +2 -2
  100. data/app/views/leads/_edit.html.haml +2 -2
  101. data/app/views/leads/_new.html.haml +2 -2
  102. data/app/views/leads/_sidebar_index.html.haml +2 -2
  103. data/app/views/leads/_sidebar_show.html.haml +30 -30
  104. data/app/views/leads/create.js.haml +2 -3
  105. data/app/views/leads/destroy.js.haml +2 -2
  106. data/app/views/leads/promote.js.haml +3 -4
  107. data/app/views/leads/reject.js.haml +3 -3
  108. data/app/views/leads/show.html.haml +1 -1
  109. data/app/views/leads/update.js.haml +4 -5
  110. data/app/views/lists/create.js.haml +0 -1
  111. data/app/views/opportunities/_edit.html.haml +1 -1
  112. data/app/views/opportunities/_index_brief.html.haml +1 -1
  113. data/app/views/opportunities/_index_long.html.haml +1 -1
  114. data/app/views/opportunities/_new.html.haml +1 -1
  115. data/app/views/opportunities/_sidebar_index.html.haml +2 -2
  116. data/app/views/opportunities/_sidebar_show.html.haml +47 -46
  117. data/app/views/opportunities/create.js.haml +3 -4
  118. data/app/views/opportunities/destroy.js.haml +3 -3
  119. data/app/views/opportunities/show.html.haml +1 -0
  120. data/app/views/opportunities/update.js.haml +5 -6
  121. data/app/views/shared/_inline_styles.html.haml +0 -26
  122. data/app/views/tasks/_assigned.html.haml +1 -1
  123. data/app/views/tasks/_completed.html.haml +1 -1
  124. data/app/views/tasks/_edit.html.haml +1 -1
  125. data/app/views/tasks/_new.html.haml +1 -1
  126. data/app/views/tasks/_pending.html.haml +1 -1
  127. data/app/views/tasks/_related.html.haml +1 -1
  128. data/app/views/tasks/_selector.html.haml +7 -8
  129. data/app/views/tasks/_sidebar_index.html.haml +2 -2
  130. data/app/views/tasks/_title.html.haml +1 -1
  131. data/app/views/tasks/complete.js.haml +1 -1
  132. data/app/views/tasks/create.js.haml +1 -2
  133. data/app/views/tasks/destroy.js.haml +1 -1
  134. data/app/views/tasks/uncomplete.js.haml +1 -2
  135. data/app/views/tasks/update.js.haml +0 -1
  136. data/app/views/users/change_password.js.haml +0 -1
  137. data/app/views/users/update.js.haml +0 -1
  138. data/app/views/users/upload_avatar.js.haml +0 -1
  139. data/app/views/versions/_version_item.html.haml +1 -1
  140. data/bin/setup +6 -6
  141. data/config/application.rb +1 -1
  142. data/config/environment.rb +1 -1
  143. data/config/initializers/content_security_policy.rb +5 -0
  144. data/config/initializers/new_framework_defaults_6_0.rb +46 -0
  145. data/config/initializers/simple_form.rb +135 -55
  146. data/config/initializers/simple_form_bootstrap.rb +433 -0
  147. data/config/locales/fat_free_crm.cs.yml +86 -47
  148. data/config/locales/fat_free_crm.ru.yml +1 -0
  149. data/config/settings.default.yml +0 -41
  150. data/db/migrate/20200806004152_add_pattern_to_fields.rb +7 -0
  151. data/db/migrate/20200806004459_add_html5_to_fields.rb +10 -0
  152. data/db/schema.rb +11 -6
  153. data/fat_free_crm.gemspec +4 -4
  154. data/lib/fat_free_crm/core_ext.rb +1 -1
  155. data/lib/fat_free_crm/gem_ext.rb +0 -1
  156. data/lib/fat_free_crm/tabs.rb +2 -2
  157. data/lib/fat_free_crm/version.rb +2 -2
  158. data/lib/gravatar_image_tag.rb +1 -1
  159. data/lib/tasks/ffcrm/preference_update.rake +19 -0
  160. data/lib/tasks/ffcrm/setup.rake +1 -1
  161. data/lib/templates/erb/scaffold/_form.html.erb +4 -2
  162. data/spec/controllers/comments_controller_spec.rb +6 -6
  163. data/spec/controllers/home_controller_spec.rb +3 -3
  164. data/spec/controllers/users_controller_spec.rb +13 -1
  165. data/spec/factories/user_factories.rb +5 -2
  166. data/spec/features/acceptance_helper.rb +1 -1
  167. data/spec/features/accounts_spec.rb +2 -2
  168. data/spec/features/admin/groups_spec.rb +1 -1
  169. data/spec/features/admin/users_spec.rb +1 -1
  170. data/spec/features/campaigns_spec.rb +2 -2
  171. data/spec/features/contacts_spec.rb +2 -5
  172. data/spec/features/leads_spec.rb +11 -7
  173. data/spec/features/opportunities_spec.rb +4 -4
  174. data/spec/features/support/browser.rb +6 -2
  175. data/spec/features/support/selector_helpers.rb +10 -1
  176. data/spec/features/tasks_spec.rb +6 -6
  177. data/spec/helpers/accounts_helper_spec.rb +57 -0
  178. data/spec/models/entities/opportunity_spec.rb +2 -2
  179. data/spec/models/fields/custom_field_pair_spec.rb +2 -2
  180. data/spec/models/observers/entity_observer_spec.rb +3 -3
  181. data/spec/models/polymorphic/task_spec.rb +11 -11
  182. data/spec/models/polymorphic/version_spec.rb +2 -2
  183. data/spec/models/users/preference_spec.rb +1 -1
  184. data/spec/views/accounts/_edit.haml_spec.rb +1 -1
  185. data/spec/views/accounts/_new.haml_spec.rb +1 -1
  186. data/spec/views/accounts/create.js.haml_spec.rb +0 -1
  187. data/spec/views/accounts/update.js.haml_spec.rb +2 -5
  188. data/spec/views/admin/field_groups/create.js.haml_spec.rb +0 -1
  189. data/spec/views/admin/field_groups/update.js.haml_spec.rb +0 -1
  190. data/spec/views/admin/users/create.js.haml_spec.rb +0 -1
  191. data/spec/views/admin/users/destroy.js.haml_spec.rb +0 -6
  192. data/spec/views/admin/users/update.js.haml_spec.rb +1 -2
  193. data/spec/views/campaigns/_edit.haml_spec.rb +1 -1
  194. data/spec/views/campaigns/_new.haml_spec.rb +1 -1
  195. data/spec/views/campaigns/create.js.haml_spec.rb +0 -1
  196. data/spec/views/campaigns/destroy.js.haml_spec.rb +0 -1
  197. data/spec/views/campaigns/update.js.haml_spec.rb +2 -6
  198. data/spec/views/contacts/_edit.haml_spec.rb +1 -1
  199. data/spec/views/contacts/_new.haml_spec.rb +1 -1
  200. data/spec/views/contacts/create.js.haml_spec.rb +0 -1
  201. data/spec/views/contacts/update.js.haml_spec.rb +3 -7
  202. data/spec/views/home/index.haml_spec.rb +2 -2
  203. data/spec/views/leads/_edit.haml_spec.rb +1 -1
  204. data/spec/views/leads/_new.haml_spec.rb +1 -1
  205. data/spec/views/leads/create.js.haml_spec.rb +0 -3
  206. data/spec/views/leads/destroy.js.haml_spec.rb +0 -2
  207. data/spec/views/leads/promote.js.haml_spec.rb +3 -11
  208. data/spec/views/leads/reject.js.haml_spec.rb +0 -3
  209. data/spec/views/leads/update.js.haml_spec.rb +3 -11
  210. data/spec/views/opportunities/_edit.haml_spec.rb +1 -1
  211. data/spec/views/opportunities/_new.haml_spec.rb +1 -1
  212. data/spec/views/opportunities/create.js.haml_spec.rb +0 -2
  213. data/spec/views/opportunities/destroy.js.haml_spec.rb +0 -3
  214. data/spec/views/opportunities/update.js.haml_spec.rb +3 -11
  215. data/spec/views/tasks/_edit.haml_spec.rb +1 -1
  216. data/spec/views/tasks/complete.js.haml_spec.rb +0 -1
  217. data/spec/views/tasks/create.js.haml_spec.rb +0 -2
  218. data/spec/views/tasks/destroy.js.haml_spec.rb +0 -1
  219. data/spec/views/tasks/uncomplete.js.haml_spec.rb +0 -1
  220. data/spec/views/tasks/update.js.haml_spec.rb +1 -4
  221. data/spec/views/users/change_password.js.haml_spec.rb +1 -2
  222. data/spec/views/users/update.js.haml_spec.rb +1 -2
  223. data/spec/views/users/upload_avatar.js.haml_spec.rb +1 -2
  224. metadata +23 -14
  225. data/config/initializers/new_framework_defaults_5_2.rb +0 -40
  226. data/lib/fat_free_crm/gem_ext/simple_form/action_view_extensions/form_helper.rb +0 -24
@@ -4,29 +4,40 @@
4
4
  ---
5
5
  cs:
6
6
  language: Český (CZ)
7
+
8
+ # Generic terms.
9
+ #----------------------------------------------------------------------------
10
+ id: Id
7
11
  all: Vše
8
12
  at: v
9
13
  here: zde
10
14
  no_button: Ne
11
- not_implemented: Čeká na vytvoření.
15
+ not_implemented: Nelze použít.
12
16
  or: nebo
13
17
  select_none: -- nic --
14
- select_blank: -- vyber --
18
+ select_blank: -- vyberte --
15
19
  yes_button: Ano
20
+
21
+
22
+ # Settings.
23
+ #----------------------------------------------------------------------------
16
24
  tab_dashboard: Hlavní panel
17
25
  tab_tasks: Úkoly
18
26
  tab_campaigns: Kampaně
19
- tab_leads: Možní klienti
27
+ tab_leads: Potenciální klienti
20
28
  tab_accounts: Klienti
21
29
  tab_contacts: Kontakty
22
30
  tab_opportunities: Příležitosti
31
+ tab_team: Tým
32
+ admin_tab_groups: Skupiny
23
33
  admin_tab_users: Uživatelé
24
34
  admin_tab_fields: Pole
35
+ admin_tab_tags: Štítky
25
36
  admin_tab_settings: Nastavení
26
37
  admin_tab_plugins: Pluginy
27
38
  affiliate: Pobočka
28
39
  competitor: Konkurent
29
- customer: Zákazník
40
+ customer: Klient
30
41
  partner: Partner
31
42
  reseller: Přeprodejce
32
43
  vendor: Prodejce
@@ -42,10 +53,10 @@ cs:
42
53
  cold_call: První zavolání
43
54
  conference: Konference
44
55
  online: Online Marketing
45
- referral: Odkazující
46
- self: Samogenerovaný
47
- web: Website
48
- word_of_mouth: O čem se mluví
56
+ referral: Na doporučení
57
+ self: Samovolně získaný
58
+ web: Webová stránka
59
+ word_of_mouth: Šuškanda
49
60
  other: Ostatní
50
61
  prospecting: Průzkum
51
62
  analysis: Analýza
@@ -53,11 +64,11 @@ cs:
53
64
  proposal: Nabídka
54
65
  negotiation: Jednání
55
66
  final_review: Závěrečné hodnocení
56
- won: Uzavřené/Výhra
57
- lost: Uzavřené/Prohra
67
+ won: Uzavřeno/Získáno
68
+ lost: Uzavřeno/Nezískáno
58
69
  call: Volání
59
70
  email: Email
60
- follow_up: Pokračování
71
+ follow_up: Připomenutí
61
72
  lunch: Oběd
62
73
  meeting: Schůzka
63
74
  money: Peníze
@@ -71,16 +82,22 @@ cs:
71
82
  due_later: Někdy později
72
83
  due_specific_date: V konkrétní datum...
73
84
  completed_today: Dnes
74
- completed_yesterday: Vřera
85
+ completed_yesterday: Včera
75
86
  completed_last_week: Minulý týden
76
87
  completed_this_month: Tento měsíc
77
88
  completed_last_month: Minulý měsíc
78
- one_hour: Jedna hodina
79
- one_day: Jeden den
89
+
90
+ # Models/Activity.
91
+ #----------------------------------------------------------------------------
92
+ one_hour: Hodina
93
+ one_day: Den
80
94
  two_days: Dva dny
81
- one_week: Jeden týden
95
+ one_week: Týden
82
96
  two_weeks: Dva týdny
83
- one_month: Jeden měsíc
97
+ one_month: Měsíc
98
+
99
+ # Model Validations.
100
+ #----------------------------------------------------------------------------
84
101
  activerecord:
85
102
  errors:
86
103
  models:
@@ -95,11 +112,11 @@ cs:
95
112
  name:
96
113
  missing_account_name: ^Zadejte jméno klienta.
97
114
  access:
98
- share_account: ^Určete uživatele pro sdílení klienta..
115
+ share_account: ^Určete uživatele pro sdílení klienta.
99
116
  campaign:
100
117
  attributes:
101
118
  name:
102
- missing_campaign_name: ^Zadejte jméno kampaně.
119
+ missing_campaign_name: ^Zadejte název kampaně.
103
120
  ends_on:
104
121
  dates_not_in_sequence: ^Ujistěte se, že počáteční datum je před konečným.
105
122
  access:
@@ -125,7 +142,7 @@ cs:
125
142
  name:
126
143
  missing_opportunity_name: ^Zadejte název příležitosti.
127
144
  access:
128
- share_opportunity: ^Určete uživatele pro sdílení příležitosti.
145
+ share_opportunity: ^Zvolte uživatele pro sdílení příležitosti.
129
146
  task:
130
147
  attributes:
131
148
  name:
@@ -136,11 +153,11 @@ cs:
136
153
  attributes:
137
154
  username:
138
155
  missing_username: ^Zadejte jméno uživatele.
139
- username_taken: ^Takový uživatel již existuje.
156
+ username_taken: ^Uživatel již existuje.
140
157
  email:
141
158
  missing_email: ^Zadejte email.
142
159
  email_in_use: ^Uživatel s tímto emailem je již v systému zaveden.
143
- msg_account_suspended: Uživateslský účet byl pozastaven.
160
+ msg_account_suspended: Uživatelský účet byl pozastaven.
144
161
  password_reset_instruction: instrukce resetování hesla
145
162
  msg_account_created: Váš účet byl vytvořen a čeká na schválení administrátorem.
146
163
  msg_account_not_approved: Váš účet ještě nebyl schválen.
@@ -185,14 +202,14 @@ cs:
185
202
  option_ends_on: koncové datum
186
203
  option_first_name: Jméno
187
204
  option_last_name: Příjmení
188
- option_leads_count: aktuální z možných kl.
205
+ option_leads_count: aktuální z potenciálních klientů
189
206
  option_long: dlouhý
190
207
  option_name: Název
191
208
  option_probability: pravděpodobnost
192
209
  option_rating: hodnocení
193
210
  option_revenue: aktální výnos
194
211
  option_starts_on: počáteční datum
195
- option_target_leads: cíloví možní kl.
212
+ option_target_leads: cíloví potenciální klienti
196
213
  option_target_revenue: cílový výnos
197
214
  option_updated_at: upraveno
198
215
  all_events_past_participle: a všechny akce vytvořené
@@ -222,7 +239,7 @@ cs:
222
239
  image_help: Obrázek který nahrajete bude automaticky převeden na velikost 75 x 75
223
240
  pixelů. Podporované formáty jsou GIF, JPG, and PNG.
224
241
  job_title: Popis
225
- last_name: Příjmění
242
+ last_name: Příjmení
226
243
  login_now_link: Přihlašte se!
227
244
  mobile: Mobil
228
245
  my_profile: Můj profil
@@ -278,7 +295,7 @@ cs:
278
295
  budget: Rozpočet
279
296
  budget_label: Ropočet (CZK)
280
297
  campaign: Kampaň
281
- campaign_and_leads: Kampaň a možní klienti
298
+ campaign_and_leads: Kampaň a potenciální klienti
282
299
  campaign_small: kampaň
283
300
  campaign_summary: Přehled kampaně
284
301
  campaign_targets: Cíle kampaně
@@ -293,10 +310,10 @@ cs:
293
310
  finished_on: hotovo na %{value}
294
311
  finishes_in: hotovo za %{value}
295
312
  no_start_date: nebyl určeno počáteční datum
296
- number_of_leads: Možných klientů
313
+ number_of_leads: Potenciálních klientů
297
314
  objectives: Cíle
298
- objectives_help: Zadejte cílový počet budoucích možných klientů, poměr konverze
299
- z možných klientů do příležitostí, cílová tržba a rozpočet kampaně. Tato čísla
315
+ objectives_help: Zadejte cílový počet budoucích potenciálních klientů, poměr konverze
316
+ z potenciálních klientů do příležitostí, cílová tržba a rozpočet kampaně. Tato čísla
300
317
  pomohou určit výkonost kampaně.
301
318
  objectives_small: cíle kampaně
302
319
  revenue: tržba
@@ -342,37 +359,37 @@ cs:
342
359
  web_presence_small: webstránky
343
360
  works_at: ! '%{job_title} v %{company}'
344
361
  convert: Konvertovat
345
- convert_lead: Konvertovat možného klienta
362
+ convert_lead: Konvertovat potenciálního klienta
346
363
  convert_lead_permissions_intro: Oprávnění kontaktu budou přenesena. Oprávnění můžete
347
364
  změnit později.
348
- convert_lead_text: Zkonvertováním možného klienta %{value} vznikne kontkat pripojený
349
- na existujícího nebo nového klienta. Status možného klienta bude nastaven na konvertovaný.
350
- create_lead: Přidat možného klienta
365
+ convert_lead_text: Zkonvertováním potenciálního klienta %{value} vznikne kontkat pripojený
366
+ na existujícího nebo nového klienta. Status potenciálního klienta bude nastaven na konvertovaný.
367
+ create_lead: Přidat potenciálního klienta
351
368
  create_opp_for_contact: Můžete automaticky vytvořit příležitost pro kontkat %{value}
352
369
  tím že určíte jméno, aktuální stádium, očekávaný čas ukončení, prodejní pravděpodobnost,
353
370
  objem nabídky, a nabídnutý rabat.
354
- lead: Možný klient
355
- lead_info_small: kontakt možného klienta
371
+ lead: potenciální klient
372
+ lead_info_small: kontakt potenciálního klienta
356
373
  lead_permissions_intro_private: Standardně budou oprávnění zkopírována z kampaně
357
374
  nebo jako soukromá. Oprávnění můžete změnit později.
358
375
  lead_permissions_intro_public: Standardně budou oprávnění zkopírována z kampaně
359
376
  nebo jako veřejná. Oprávnění můžete změnit později.
360
377
  lead_permissions_intro_shared: Standardně budou oprávnění zkopírována z kampaně
361
378
  nebo sdílená s určenými uživateli. Oprávnění můžete změnit později.
362
- lead_small: možný klient
363
- lead_status_small: stav možného klienta
364
- lead_summary: Souhrn možného klienta
365
- leads: Možní klienti
366
- leads_options: Volby možných klientů
367
- leads_small: možní klienti
379
+ lead_small: potenciální klient
380
+ lead_status_small: stav potenciálního klienta
381
+ lead_summary: Souhrn potenciálního klienta
382
+ leads: Potenciální klienti
383
+ leads_options: Volby potenciálních klientů
384
+ leads_small: Potenciální klienti
368
385
  none: nic
369
386
  rating: Hodnocení
370
387
  reject: Odmítnutí
371
- reject_lead_confirm: Jste si jistý že chcete nastavit možného jako že odmítnul?
372
- save_lead: Uložit možného klienta
388
+ reject_lead_confirm: Jste si jistý že chcete nastavit potenciálního jako že odmítnul?
389
+ save_lead: Uložit potenciálního klienta
373
390
  source: Zdroj
374
391
  status: Stav
375
- total_leads: Celkem možných klientů
392
+ total_leads: Celkem potenciálních klientů
376
393
  amount: Množství
377
394
  close_date: Datum uzavření
378
395
  closed_ago_on: uzavřeno před %{time_ago} v %{date}
@@ -460,7 +477,7 @@ cs:
460
477
  subject_account: Klient
461
478
  subject_campaign: Kampaň
462
479
  subject_contact: Kontakt
463
- subject_lead: Možný klient
480
+ subject_lead: potenciální klient
464
481
  subject_opportunity: Příležitost
465
482
  subject_task: Úkol
466
483
  add_note: Přidat poznámku
@@ -495,7 +512,7 @@ cs:
495
512
  please_retry: zkuste prosím jiný dotaz.
496
513
  recent_items: Aktuální položky
497
514
  select_contact: Vyber kontakt
498
- select_lead: Vyber možného klienta
515
+ select_lead: Vyber potenciálního klienta
499
516
  select_task: Vyber úkol
500
517
  select_opportunity: Vyber příležitost
501
518
  search_assets: Vyhledat %{value}
@@ -578,8 +595,8 @@ cs:
578
595
  one: 1 příležitost
579
596
  other: ! '%{count} příležitostí'
580
597
  lead:
581
- one: 1 možný klient
582
- other: ! '%{count} možných klientů'
598
+ one: 1 potenciální klient
599
+ other: ! '%{count} potenciálních klientů'
583
600
  day:
584
601
  one: 1 den
585
602
  other: ! '%{count} dní'
@@ -608,3 +625,25 @@ cs:
608
625
  custom_fields: Uživatelská pole
609
626
  create_custom_field: Vytvořit uživatelské pole
610
627
  create_new_custom_field_for: Vytvořit nové uživatelské pole pro %{klass_name}
628
+ no_saved_lists: Není uložený žádný seznam
629
+ personal_lists: Osobní seznam
630
+ global_lists: Sdílený seznam
631
+ basic_search: Vyhledávání
632
+ advanced_search: Pokročilé vyhledávání
633
+ opportunity_stages: Fáze příležitostí
634
+ no_opportunities_found: Nenalezeny žádné příležitosti
635
+ lead_statuses: Fáze potenciálních klientů
636
+ campaign_statuses: Fáze kampaní
637
+ my_accounts: Moji klienti
638
+ my_opportunities: Moje příležitosti
639
+ no_opportunity_records: Nenalezeny žádné příležitosti
640
+ my_tasks: Moje úkoly
641
+ versions: Aktualizace
642
+ unassigned: Nepřiřazeno
643
+ tags: Štítky
644
+ select_or_create_tags: Zvolte nebo vytvořte
645
+ comment: Komentáře
646
+ comment_intro: Přidejte komentář.
647
+ no_task_records: Nenalezeny žádné úlohy
648
+ no_account_records: Nenalezeny žádné záznamy
649
+ account_categories: Kategorie klientů
@@ -700,6 +700,7 @@ ru:
700
700
  one: Найден %{count} результат.
701
701
  other: Найдено %{count} результатов.
702
702
  many: Найдено %{count} результатов.
703
+ few: Найдено %{count} результатов.
703
704
 
704
705
  # Views -> Comments.
705
706
  #----------------------------------------------------------------------------
@@ -285,14 +285,6 @@ account_category:
285
285
  - :reseller
286
286
  - :vendor
287
287
 
288
- account_category_color:
289
- :affiliate : lavender
290
- :competitor : paleturquoise
291
- :customer : pink
292
- :partner : bisque
293
- :reseller : thistle
294
- :vendor : skyblue
295
-
296
288
  # Campaign Status. To add custom status use string value, for example:
297
289
  #
298
290
  # campaign_status:
@@ -306,13 +298,6 @@ campaign_status:
306
298
  - :on_hold
307
299
  - :called_off
308
300
 
309
- campaign_status_color:
310
- :planned : Gold
311
- :started : Turquoise
312
- :completed : Lime
313
- :on_hold : Orchid
314
- :called_off : OrangeRed
315
-
316
301
  # Lead Status and Source.
317
302
  #------------------------------------------------------------------------------
318
303
  lead_status:
@@ -321,12 +306,6 @@ lead_status:
321
306
  - :converted
322
307
  - :rejected
323
308
 
324
- lead_status_color:
325
- :new : Silver
326
- :contacted : Turquoise
327
- :converted : Lime
328
- :rejected : OrangeRed
329
-
330
309
  lead_source:
331
310
  - :campaign
332
311
  - :cold_call
@@ -351,16 +330,6 @@ opportunity_stage:
351
330
  - :won
352
331
  - :lost
353
332
 
354
- opportunity_stage_color:
355
- :prospecting : Silver
356
- :analysis : PaleGoldenRod
357
- :presentation : Salmon
358
- :proposal : Gold
359
- :negotiation : Orchid
360
- :final_review : Turquoise
361
- :won : Lime
362
- :lost : OrangeRed
363
-
364
333
  # Task Category, Due Date, and Completed Date.
365
334
  #------------------------------------------------------------------------------
366
335
  task_category:
@@ -373,16 +342,6 @@ task_category:
373
342
  - :presentation
374
343
  - :trip
375
344
 
376
- task_category_color:
377
- :call : Silver
378
- :email : Turquoise
379
- :follow_up : Gold
380
- :lunch : Tomato
381
- :meeting : Orchid
382
- :money : Lime
383
- :presentation : Salmon
384
- :trip : Turquoise
385
-
386
345
  task_bucket:
387
346
  - :overdue
388
347
  - :due_asap
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddPatternToFields < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :fields, :pattern, :string
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddHtml5ToFields < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :fields, :autofocus, :string
6
+ add_column :fields, :autocomplete, :string
7
+ add_column :fields, :list, :string
8
+ add_column :fields, :multiple, :string
9
+ end
10
+ end
data/db/schema.rb CHANGED
@@ -2,15 +2,15 @@
2
2
  # of editing this file, please use the migrations feature of Active Record to
3
3
  # incrementally modify your database, and then regenerate this schema definition.
4
4
  #
5
- # Note that this schema.rb definition is the authoritative source for your
6
- # database schema. If you need to create the application database on another
7
- # system, you should be using db:schema:load, not running all the migrations
8
- # from scratch. The latter is a flawed and unsustainable approach (the more migrations
9
- # you'll amass, the slower it'll run and the greater likelihood for issues).
5
+ # This file is the source Rails uses to define your schema when running `rails
6
+ # db:schema:load`. When creating a new database, `rails db:schema:load` tends to
7
+ # be faster and is potentially less error prone than running all of your
8
+ # migrations from scratch. Old migrations may fail to apply correctly if those
9
+ # migrations use external dependencies or application code.
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 2018_01_07_082701) do
13
+ ActiveRecord::Schema.define(version: 2020_08_06_004459) do
14
14
 
15
15
  create_table "account_contacts", force: :cascade do |t|
16
16
  t.integer "account_id"
@@ -223,6 +223,11 @@ ActiveRecord::Schema.define(version: 2018_01_07_082701) do
223
223
  t.integer "pair_id"
224
224
  t.text "settings"
225
225
  t.integer "minlength", limit: 4, default: 0
226
+ t.string "pattern"
227
+ t.string "autofocus"
228
+ t.string "autocomplete"
229
+ t.string "list"
230
+ t.string "multiple"
226
231
  t.index ["field_group_id"], name: "index_fields_on_field_group_id"
227
232
  t.index ["name"], name: "index_fields_on_name"
228
233
  end
data/fat_free_crm.gemspec CHANGED
@@ -21,12 +21,12 @@ Gem::Specification.new do |gem|
21
21
  gem.required_ruby_version = '>= 2.4.0'
22
22
  gem.license = 'MIT'
23
23
 
24
- gem.add_dependency 'rails', '~> 5.2.0'
24
+ gem.add_dependency 'rails', '~> 6.0.0'
25
25
  gem.add_dependency 'rails-i18n'
26
26
  gem.add_dependency 'rails-observers'
27
27
  gem.add_dependency 'activemodel-serializers-xml'
28
28
  gem.add_dependency 'sprockets-rails', '>= 3.0.0'
29
- gem.add_dependency 'responders', '~> 2.0'
29
+ gem.add_dependency 'responders', '~> 3.0'
30
30
  gem.add_dependency 'jquery-rails'
31
31
  gem.add_dependency 'jquery-migrate-rails'
32
32
  gem.add_dependency 'jquery-ui-rails'
@@ -34,10 +34,10 @@ Gem::Specification.new do |gem|
34
34
  gem.add_dependency 'simple_form'
35
35
  gem.add_dependency 'will_paginate'
36
36
  gem.add_dependency 'paperclip'
37
- gem.add_dependency 'paper_trail', '~> 10.0.0'
37
+ gem.add_dependency 'paper_trail', '~> 12.0.0'
38
38
  gem.add_dependency 'devise', '~> 4.6'
39
39
  gem.add_dependency 'devise-encryptable', '~> 0.2.0'
40
- gem.add_dependency 'acts_as_commentable'
40
+ gem.add_dependency 'acts_as_commentable', '~> 6.0.0'
41
41
  gem.add_dependency 'acts-as-taggable-on', '>= 3.4.3'
42
42
  gem.add_dependency 'dynamic_form'
43
43
  gem.add_dependency 'haml'
@@ -5,4 +5,4 @@
5
5
  # Fat Free CRM is freely distributable under the terms of MIT license.
6
6
  # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
7
7
  #------------------------------------------------------------------------------
8
- Dir[File.dirname(__FILE__) + "/core_ext/*.rb"].each { |file| require(file) }
8
+ Dir[File.dirname(__FILE__) + "/core_ext/*.rb"].sort.each { |file| require(file) }
@@ -7,5 +7,4 @@
7
7
  #------------------------------------------------------------------------------
8
8
  require "fat_free_crm/gem_ext/active_support/buffered_logger"
9
9
  require "fat_free_crm/gem_ext/action_controller/base"
10
- require "fat_free_crm/gem_ext/simple_form/action_view_extensions/form_helper"
11
10
  require "fat_free_crm/gem_ext/rake/task" if defined?(Rake)
@@ -14,11 +14,11 @@ module FatFreeCRM
14
14
  #----------------------------------------------------------------------------
15
15
  class << self
16
16
  def main
17
- @@main ||= (Setting[:tabs]&.dup)
17
+ @@main ||= Setting[:tabs]&.dup
18
18
  end
19
19
 
20
20
  def admin
21
- @@admin ||= (Setting[:admin_tabs]&.dup)
21
+ @@admin ||= Setting[:admin_tabs]&.dup
22
22
  end
23
23
  end
24
24
  end
@@ -8,8 +8,8 @@
8
8
  module FatFreeCRM
9
9
  module VERSION #:nodoc:
10
10
  MAJOR = 0
11
- MINOR = 19
12
- TINY = 2
11
+ MINOR = 20
12
+ TINY = 0
13
13
  PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
@@ -53,7 +53,7 @@ module GravatarImageTag
53
53
  def self.url_params(gravatar_params)
54
54
  return nil if gravatar_params.keys.empty?
55
55
 
56
- "?#{gravatar_params.map { |key, value| "#{key}=#{URI.escape(value.is_a?(String) ? value : value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}" }.join('&amp;')}"
56
+ "?#{gravatar_params.map { |key, value| "#{key}=#{CGI.escape(value.is_a?(String) ? value : value.to_s)}" }.join('&amp;')}"
57
57
  end
58
58
  end
59
59
 
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
4
+ #
5
+ # Fat Free CRM is freely distributable under the terms of MIT license.
6
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
7
+ #------------------------------------------------------------------------------
8
+ namespace :ffcrm do
9
+ namespace :preference_update do
10
+ desc "Take all Marshal serialized database entries and convert them into JSON serialized"
11
+ task run: :environment do
12
+ preferences = Preference.all
13
+ preferences.each do |preference|
14
+ val = JSON.parse(Base64.decode64(preference.value), symbolize_name: true)
15
+ preference.value = Base64.encode64(val.to_json)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -84,7 +84,7 @@ namespace :ffcrm do
84
84
  user = User.find_by_username(username) || User.new
85
85
  user.skip_confirmation!
86
86
  user.confirm
87
- user.update_attributes(username: username, password: password, email: email)
87
+ user.update(username: username, password: password, email: email)
88
88
  user.update_attribute(:confirmed_at, Time.now.utc) # Skip confirmation
89
89
  user.update_attribute(:admin, true) # Mass assignments don't work for :admin because of the attr_protected
90
90
  user.update_attribute(:suspended_at, nil) # Mass assignments don't work for :suspended_at because of the attr_protected
@@ -1,13 +1,15 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <%%= simple_form_for(@<%= singular_table_name %>) do |f| %>
2
3
  <%%= f.error_notification %>
4
+ <%%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
3
5
 
4
- <div class="inputs">
6
+ <div class="form-inputs">
5
7
  <%- attributes.each do |attribute| -%>
6
8
  <%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>
7
9
  <%- end -%>
8
10
  </div>
9
11
 
10
- <div class="actions">
12
+ <div class="form-actions">
11
13
  <%%= f.button :submit %>
12
14
  </div>
13
15
  <%% end %>
@@ -133,18 +133,18 @@ describe CommentsController do
133
133
  # describe "with valid params" do
134
134
  # it "should update the requested comment" do
135
135
  # Comment.should_receive(:find).with("37").and_return(mock_comment)
136
- # mock_comment.should_receive(:update_attributes).with({'these' => 'params'})
136
+ # mock_comment.should_receive(:update).with({'these' => 'params'})
137
137
  # put :update, :id => "37", :comment => {:these => 'params'}
138
138
  # end
139
139
  #
140
140
  # it "should expose the requested comment as @comment" do
141
- # Comment.stub(:find).and_return(mock_comment(:update_attributes => true))
141
+ # Comment.stub(:find).and_return(mock_comment(:update => true))
142
142
  # put :update, :id => "1"
143
143
  # assigns(:comment).should equal(mock_comment)
144
144
  # end
145
145
  #
146
146
  # it "should redirect to the comment" do
147
- # Comment.stub(:find).and_return(mock_comment(:update_attributes => true))
147
+ # Comment.stub(:find).and_return(mock_comment(:update => true))
148
148
  # put :update, :id => "1"
149
149
  # response.should redirect_to(comment_path(mock_comment))
150
150
  # end
@@ -153,18 +153,18 @@ describe CommentsController do
153
153
  # describe "with invalid params" do
154
154
  # it "should update the requested comment" do
155
155
  # Comment.should_receive(:find).with("37").and_return(mock_comment)
156
- # mock_comment.should_receive(:update_attributes).with({'these' => 'params'})
156
+ # mock_comment.should_receive(:update).with({'these' => 'params'})
157
157
  # put :update, :id => "37", :comment => {:these => 'params'}
158
158
  # end
159
159
  #
160
160
  # it "should expose the comment as @comment" do
161
- # Comment.stub(:find).and_return(mock_comment(:update_attributes => false))
161
+ # Comment.stub(:find).and_return(mock_comment(:update => false))
162
162
  # put :update, :id => "1"
163
163
  # assigns(:comment).should equal(mock_comment)
164
164
  # end
165
165
  #
166
166
  # it "should re-render the 'edit' template" do
167
- # Comment.stub(:find).and_return(mock_comment(:update_attributes => false))
167
+ # Comment.stub(:find).and_return(mock_comment(:update => false))
168
168
  # put :update, :id => "1"
169
169
  # response.should render_template('edit')
170
170
  # end
@@ -87,9 +87,9 @@ describe HomeController do
87
87
  end
88
88
 
89
89
  it "should assign instance variables for user preferences" do
90
- @asset = create(:preference, user: current_user, name: "activity_asset", value: Base64.encode64(Marshal.dump("tasks")))
91
- @user = create(:preference, user: current_user, name: "activity_user", value: Base64.encode64(Marshal.dump("Billy Bones")))
92
- @duration = create(:preference, user: current_user, name: "activity_duration", value: Base64.encode64(Marshal.dump("two days")))
90
+ @asset = create(:preference, user: current_user, name: "activity_asset", value: Base64.encode64("tasks".to_json))
91
+ @user = create(:preference, user: current_user, name: "activity_user", value: Base64.encode64("Billy Bones".to_json))
92
+ @duration = create(:preference, user: current_user, name: "activity_duration", value: Base64.encode64("two days".to_json))
93
93
 
94
94
  get :options, xhr: true
95
95
  expect(assigns[:asset]).to eq("tasks")
@@ -130,6 +130,18 @@ describe UsersController do
130
130
  expect(response).to render_template("users/update")
131
131
  end
132
132
  end
133
+
134
+ describe "with a email with whitespace" do
135
+ it "should update the user information and render [update] template" do
136
+ put :update, params: { id: @user.id, user: { first_name: "Billy", last_name: "Bones", alt_email: " john@email.com " } }, xhr: true
137
+ @user.reload
138
+ expect(@user.first_name).to eq("Billy")
139
+ expect(@user.last_name).to eq("Bones")
140
+ expect(assigns[:user]).to eq(@user)
141
+ expect(response).to render_template("users/update")
142
+ expect(@user.alt_email).to eq("john@email.com")
143
+ end
144
+ end
133
145
 
134
146
  describe "with invalid params" do
135
147
  it "should not update the user information and redraw [update] template" do
@@ -299,7 +311,7 @@ describe UsersController do
299
311
  before(:each) do
300
312
  login
301
313
  @user = current_user
302
- @user.update_attributes(first_name: "Apple", last_name: "Boy")
314
+ @user.update(first_name: "Apple", last_name: "Boy")
303
315
  end
304
316
 
305
317
  it "should assign @users_with_opportunities" do