fat_free_crm 0.12.3 → 0.13.0

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.

Files changed (521) hide show
  1. checksums.yaml +5 -13
  2. data/.travis.yml +1 -11
  3. data/Gemfile +7 -19
  4. data/Gemfile.lock +166 -166
  5. data/Procfile +1 -1
  6. data/README.md +20 -20
  7. data/app/assets/javascripts/admin/fields.js.coffee +3 -3
  8. data/app/assets/javascripts/application.js.erb +3 -0
  9. data/app/assets/javascripts/crm.js +1 -0
  10. data/app/assets/javascripts/crm_comments.js.coffee +66 -0
  11. data/app/assets/javascripts/lists.js.coffee +45 -2
  12. data/app/assets/javascripts/search.js.coffee +2 -0
  13. data/app/assets/javascripts/timeago.js +17 -0
  14. data/app/assets/stylesheets/advanced_search.css.scss +49 -25
  15. data/app/assets/stylesheets/application.css.erb +3 -0
  16. data/app/assets/stylesheets/common.scss +13 -0
  17. data/app/assets/stylesheets/format_buttons.css.scss +15 -10
  18. data/app/assets/stylesheets/header.scss +3 -0
  19. data/app/assets/stylesheets/lists.css.scss +4 -0
  20. data/app/controllers/admin/fields_controller.rb +5 -5
  21. data/app/controllers/admin/users_controller.rb +1 -3
  22. data/app/controllers/application_controller.rb +23 -23
  23. data/app/controllers/comments_controller.rb +3 -31
  24. data/app/controllers/entities/accounts_controller.rb +3 -3
  25. data/app/controllers/entities/campaigns_controller.rb +4 -4
  26. data/app/controllers/entities/contacts_controller.rb +2 -2
  27. data/app/controllers/entities/leads_controller.rb +3 -3
  28. data/app/controllers/entities/opportunities_controller.rb +4 -3
  29. data/app/controllers/entities_controller.rb +6 -6
  30. data/app/controllers/home_controller.rb +1 -1
  31. data/app/controllers/lists_controller.rb +8 -1
  32. data/app/controllers/tasks_controller.rb +1 -1
  33. data/app/controllers/users_controller.rb +46 -23
  34. data/app/helpers/admin/application_helper.rb +1 -3
  35. data/app/helpers/admin/field_groups_helper.rb +2 -1
  36. data/app/helpers/application_helper.rb +37 -16
  37. data/app/helpers/home_helper.rb +1 -2
  38. data/app/helpers/leads_helper.rb +5 -6
  39. data/app/helpers/tasks_helper.rb +36 -50
  40. data/app/models/entities/account.rb +10 -7
  41. data/app/models/entities/campaign.rb +4 -4
  42. data/app/models/entities/contact.rb +8 -5
  43. data/app/models/entities/lead.rb +8 -8
  44. data/app/models/entities/opportunity.rb +13 -18
  45. data/app/models/fields/custom_field.rb +10 -0
  46. data/app/models/fields/field.rb +3 -3
  47. data/app/models/fields/field_group.rb +1 -1
  48. data/app/models/list.rb +1 -0
  49. data/app/models/polymorphic/address.rb +3 -3
  50. data/app/models/polymorphic/comment.rb +2 -4
  51. data/app/models/polymorphic/task.rb +32 -27
  52. data/app/models/setting.rb +3 -9
  53. data/app/models/users/ability.rb +2 -13
  54. data/app/models/users/user.rb +12 -15
  55. data/app/views/accounts/_edit.html.haml +1 -1
  56. data/app/views/accounts/_index_brief.html.haml +3 -3
  57. data/app/views/accounts/_index_long.html.haml +3 -3
  58. data/app/views/accounts/_new.html.haml +1 -1
  59. data/app/views/accounts/create.js.haml +17 -0
  60. data/app/views/accounts/destroy.js.haml +6 -0
  61. data/app/views/accounts/edit.js.haml +32 -0
  62. data/app/views/accounts/index.js.haml +11 -0
  63. data/app/views/accounts/index.xls.builder +9 -7
  64. data/app/views/accounts/new.js.haml +11 -0
  65. data/app/views/accounts/show.js.haml +5 -0
  66. data/app/views/accounts/update.js.haml +17 -0
  67. data/app/views/admin/field_groups/_edit.html.haml +1 -1
  68. data/app/views/admin/field_groups/_new.html.haml +1 -1
  69. data/app/views/admin/field_groups/confirm.js.haml +7 -0
  70. data/app/views/admin/field_groups/create.js.haml +20 -0
  71. data/app/views/admin/field_groups/destroy.js.haml +9 -0
  72. data/app/views/admin/field_groups/edit.js.haml +12 -0
  73. data/app/views/admin/field_groups/new.js.haml +8 -0
  74. data/app/views/admin/field_groups/update.js.haml +8 -0
  75. data/app/views/admin/fields/_field.html.haml +2 -2
  76. data/app/views/admin/fields/_form.html.haml +2 -2
  77. data/app/views/admin/fields/create.js.haml +17 -0
  78. data/app/views/admin/fields/destroy.js.haml +8 -0
  79. data/app/views/admin/fields/edit.js.haml +3 -0
  80. data/app/views/admin/fields/update.js.haml +13 -0
  81. data/app/views/admin/groups/_edit.html.haml +1 -1
  82. data/app/views/admin/groups/_new.html.haml +1 -1
  83. data/app/views/admin/groups/create.js.haml +10 -0
  84. data/app/views/admin/groups/destroy.js.haml +9 -0
  85. data/app/views/admin/groups/edit.js.haml +14 -0
  86. data/app/views/admin/groups/index.html.haml +1 -1
  87. data/app/views/admin/groups/index.js.haml +2 -0
  88. data/app/views/admin/groups/new.js.haml +9 -0
  89. data/app/views/admin/groups/update.js.haml +9 -0
  90. data/app/views/admin/tags/_edit.html.haml +1 -1
  91. data/app/views/admin/tags/_new.html.haml +1 -1
  92. data/app/views/admin/tags/confirm.js.haml +7 -0
  93. data/app/views/admin/tags/create.js.haml +11 -0
  94. data/app/views/admin/tags/destroy.js.haml +10 -0
  95. data/app/views/admin/tags/edit.js.haml +20 -0
  96. data/app/views/admin/tags/new.js.haml +7 -0
  97. data/app/views/admin/tags/update.js.haml +9 -0
  98. data/app/views/admin/users/_edit.html.haml +1 -1
  99. data/app/views/admin/users/_new.html.haml +1 -1
  100. data/app/views/admin/users/_user.html.haml +1 -1
  101. data/app/views/admin/users/confirm.js.haml +7 -0
  102. data/app/views/admin/users/create.js.haml +10 -0
  103. data/app/views/admin/users/destroy.js.haml +10 -0
  104. data/app/views/admin/users/edit.js.haml +20 -0
  105. data/app/views/admin/users/index.js.haml +2 -0
  106. data/app/views/admin/users/new.js.haml +9 -0
  107. data/app/views/admin/users/reactivate.js.haml +3 -0
  108. data/app/views/admin/users/suspend.js.haml +3 -0
  109. data/app/views/admin/users/update.js.haml +9 -0
  110. data/app/views/authentications/new.html.haml +1 -1
  111. data/app/views/campaigns/_edit.html.haml +1 -1
  112. data/app/views/campaigns/_new.html.haml +1 -1
  113. data/app/views/campaigns/create.js.haml +20 -0
  114. data/app/views/campaigns/destroy.js.haml +6 -0
  115. data/app/views/campaigns/edit.js.haml +33 -0
  116. data/app/views/campaigns/index.js.haml +11 -0
  117. data/app/views/campaigns/index.xls.builder +9 -7
  118. data/app/views/campaigns/new.js.haml +11 -0
  119. data/app/views/campaigns/show.js.haml +5 -0
  120. data/app/views/campaigns/update.js.haml +20 -0
  121. data/app/views/comments/_comment.html.haml +1 -1
  122. data/app/views/comments/_edit.html.haml +1 -1
  123. data/app/views/comments/_new.html.haml +3 -2
  124. data/app/views/comments/create.js.haml +14 -0
  125. data/app/views/comments/destroy.js.haml +5 -0
  126. data/app/views/comments/edit.js.haml +11 -0
  127. data/app/views/comments/update.js.haml +9 -0
  128. data/app/views/contacts/_edit.html.haml +1 -1
  129. data/app/views/contacts/_index_full.html.haml +1 -1
  130. data/app/views/contacts/_index_long.html.haml +2 -1
  131. data/app/views/contacts/_new.html.haml +1 -1
  132. data/app/views/contacts/_section_general.html.haml +3 -3
  133. data/app/views/contacts/create.js.haml +23 -0
  134. data/app/views/contacts/destroy.js.haml +9 -0
  135. data/app/views/contacts/edit.js.haml +35 -0
  136. data/app/views/contacts/index.js.haml +11 -0
  137. data/app/views/contacts/index.xls.builder +9 -7
  138. data/app/views/contacts/new.js.haml +13 -0
  139. data/app/views/contacts/show.js.haml +5 -0
  140. data/app/views/contacts/update.js.haml +22 -0
  141. data/app/views/emails/destroy.js.haml +5 -0
  142. data/app/views/entities/_permissions.html.haml +1 -1
  143. data/app/views/entities/attach.js.haml +21 -0
  144. data/app/views/entities/contacts.js.haml +3 -0
  145. data/app/views/entities/discard.js.haml +6 -0
  146. data/app/views/entities/leads.js.haml +3 -0
  147. data/app/views/entities/opportunities.js.haml +3 -0
  148. data/app/views/entities/subscription_update.js.haml +4 -0
  149. data/app/views/entities/versions.js.haml +3 -0
  150. data/app/views/fields/group.js.erb +3 -0
  151. data/app/views/home/_account.html.haml +3 -3
  152. data/app/views/home/_opportunity.html.haml +3 -3
  153. data/app/views/home/index.atom.builder +3 -3
  154. data/app/views/home/index.js.haml +7 -0
  155. data/app/views/home/index.rss.builder +2 -2
  156. data/app/views/home/options.js.haml +7 -0
  157. data/app/views/layouts/_footer.html.haml +0 -4
  158. data/app/views/layouts/_sidebar.html.haml +1 -0
  159. data/app/views/layouts/_tabbed.html.haml +1 -4
  160. data/app/views/layouts/admin/application.html.haml +0 -1
  161. data/app/views/layouts/application.html.haml +5 -7
  162. data/app/views/leads/_convert.html.haml +1 -1
  163. data/app/views/leads/_edit.html.haml +1 -1
  164. data/app/views/leads/_index_long.html.haml +2 -2
  165. data/app/views/leads/_new.html.haml +1 -1
  166. data/app/views/leads/convert.js.haml +35 -0
  167. data/app/views/leads/create.js.haml +21 -0
  168. data/app/views/leads/destroy.js.haml +9 -0
  169. data/app/views/leads/edit.js.haml +35 -0
  170. data/app/views/leads/index.js.haml +11 -0
  171. data/app/views/leads/index.xls.builder +9 -7
  172. data/app/views/leads/new.js.haml +11 -0
  173. data/app/views/leads/promote.js.haml +26 -0
  174. data/app/views/leads/reject.js.haml +12 -0
  175. data/app/views/leads/show.js.haml +5 -0
  176. data/app/views/leads/update.js.haml +26 -0
  177. data/app/views/lists/_personal_sidebar.html.haml +28 -0
  178. data/app/views/lists/_sidebar.html.haml +10 -7
  179. data/app/views/lists/create.js.haml +10 -0
  180. data/app/views/lists/destroy.js.haml +1 -0
  181. data/app/views/opportunities/_edit.html.haml +1 -1
  182. data/app/views/opportunities/_index_brief.html.haml +3 -3
  183. data/app/views/opportunities/_index_long.html.haml +3 -3
  184. data/app/views/opportunities/_new.html.haml +1 -2
  185. data/app/views/opportunities/_top_section.html.haml +4 -0
  186. data/app/views/opportunities/contacts.js.haml +3 -0
  187. data/app/views/opportunities/create.js.haml +29 -0
  188. data/app/views/opportunities/destroy.js.haml +13 -0
  189. data/app/views/opportunities/edit.js.haml +35 -0
  190. data/app/views/opportunities/index.js.haml +11 -0
  191. data/app/views/opportunities/index.xls.builder +9 -7
  192. data/app/views/opportunities/new.js.haml +13 -0
  193. data/app/views/opportunities/show.js.haml +5 -0
  194. data/app/views/opportunities/update.js.haml +25 -0
  195. data/app/views/passwords/edit.html.haml +1 -1
  196. data/app/views/passwords/new.html.haml +1 -1
  197. data/app/views/shared/_comment.html.haml +1 -1
  198. data/app/views/shared/_inline_styles.html.haml +1 -1
  199. data/app/views/tasks/_edit.html.haml +1 -1
  200. data/app/views/tasks/_new.html.haml +1 -1
  201. data/app/views/tasks/complete.js.haml +14 -0
  202. data/app/views/tasks/create.js.haml +39 -0
  203. data/app/views/tasks/destroy.js.haml +7 -0
  204. data/app/views/tasks/discard.js.haml +1 -0
  205. data/app/views/tasks/edit.js.haml +26 -0
  206. data/app/views/tasks/filter.js.haml +4 -0
  207. data/app/views/tasks/index.xls.builder +7 -5
  208. data/app/views/tasks/new.js.haml +8 -0
  209. data/app/views/tasks/update.js.haml +19 -0
  210. data/app/views/users/_password.html.haml +1 -1
  211. data/app/views/users/_profile.html.haml +1 -1
  212. data/app/views/users/avatar.js.haml +9 -0
  213. data/app/views/users/change_password.js.haml +13 -0
  214. data/app/views/users/edit.js.haml +9 -0
  215. data/app/views/users/new.html.haml +1 -1
  216. data/app/views/users/password.js.haml +10 -0
  217. data/app/views/users/update.js.haml +9 -0
  218. data/app/views/users/upload_avatar.js.haml +7 -0
  219. data/app/views/versions/_version.html.haml +1 -1
  220. data/config/application.rb +1 -4
  221. data/config/environments/production.rb +3 -2
  222. data/config/initializers/custom_field_ransack_translations.rb +15 -0
  223. data/config/initializers/locale.rb +9 -1
  224. data/config/initializers/secret_token.rb +1 -25
  225. data/config/initializers/views.rb +20 -20
  226. data/config/locales/cz.yml +245 -211
  227. data/config/locales/cz_fat_free_crm.yml +105 -181
  228. data/config/locales/de.yml +162 -118
  229. data/config/locales/de_fat_free_crm.yml +760 -731
  230. data/config/locales/de_ransack.yml +91 -0
  231. data/config/locales/en-GB.yml +158 -119
  232. data/config/locales/en-GB_fat_free_crm.yml +161 -279
  233. data/config/locales/en-US.yml +158 -121
  234. data/config/locales/en-US_fat_free_crm.yml +185 -179
  235. data/config/locales/en-US_ransack.yml +81 -82
  236. data/config/locales/es.yml +164 -123
  237. data/config/locales/es_fat_free_crm.yml +151 -209
  238. data/config/locales/fr-CA.yml +167 -130
  239. data/config/locales/fr-CA_fat_free_crm.yml +142 -202
  240. data/config/locales/fr.yml +170 -125
  241. data/config/locales/fr_fat_free_crm.yml +199 -302
  242. data/config/locales/it.yml +158 -122
  243. data/config/locales/it_fat_free_crm.yml +105 -168
  244. data/config/locales/ja.yml +162 -131
  245. data/config/locales/ja_fat_free_crm.yml +118 -188
  246. data/config/locales/pl.yml +168 -132
  247. data/config/locales/pl_fat_free_crm.yml +115 -186
  248. data/config/locales/pt-BR.yml +160 -127
  249. data/config/locales/pt-BR_fat_free_crm.yml +125 -182
  250. data/config/locales/ru.yml +256 -233
  251. data/config/locales/ru_fat_free_crm.yml +136 -193
  252. data/config/locales/sv-SE.yml +164 -181
  253. data/config/locales/sv-SE_fat_free_crm.yml +129 -193
  254. data/config/locales/th_fat_free_crm.yml +114 -194
  255. data/config/locales/zh-CN.yml +176 -149
  256. data/config/locales/zh-CN_fat_free_crm.yml +78 -167
  257. data/config/routes.rb +1 -1
  258. data/config/settings.default.yml +74 -23
  259. data/custom_plan.rb +11 -0
  260. data/db/migrate/20131207033244_add_user_id_to_lists.rb +6 -0
  261. data/db/schema.rb +4 -1
  262. data/fat_free_crm.gemspec +3 -3
  263. data/lib/fat_free_crm.rb +1 -11
  264. data/lib/fat_free_crm/export_csv.rb +3 -3
  265. data/lib/fat_free_crm/fields.rb +10 -0
  266. data/lib/fat_free_crm/gem_dependencies.rb +1 -2
  267. data/lib/fat_free_crm/i18n.rb +9 -5
  268. data/lib/fat_free_crm/version.rb +2 -2
  269. data/lib/fat_free_crm/view_factory.rb +8 -5
  270. data/lib/tasks/ffcrm/config.rake +9 -12
  271. data/lib/tasks/ffcrm/missing_translations.rake +2 -1
  272. data/spec/controllers/admin/users_controller_spec.rb +6 -4
  273. data/spec/controllers/applications_controller_spec.rb +4 -4
  274. data/spec/controllers/authentications_controller_spec.rb +15 -15
  275. data/spec/controllers/comments_controller_spec.rb +9 -87
  276. data/spec/controllers/emails_controller_spec.rb +1 -1
  277. data/spec/controllers/entities/accounts_controller_spec.rb +7 -7
  278. data/spec/controllers/entities/campaigns_controller_spec.rb +5 -5
  279. data/spec/controllers/entities/contacts_controller_spec.rb +7 -7
  280. data/spec/controllers/entities/leads_controller_spec.rb +14 -14
  281. data/spec/controllers/entities/opportunities_controller_spec.rb +8 -8
  282. data/spec/controllers/home_controller_spec.rb +6 -6
  283. data/spec/controllers/tasks_controller_spec.rb +7 -7
  284. data/spec/controllers/users_controller_spec.rb +22 -50
  285. data/spec/features/support/selector_helpers.rb +1 -6
  286. data/spec/features/tasks_spec.rb +2 -2
  287. data/spec/helpers/application_helper_spec.rb +15 -15
  288. data/spec/lib/fields_spec.rb +29 -29
  289. data/spec/lib/mail_processor/base_spec.rb +7 -7
  290. data/spec/lib/mail_processor/dropbox_spec.rb +3 -3
  291. data/spec/lib/view_factory_spec.rb +14 -14
  292. data/spec/models/entities/opportunity_spec.rb +1 -1
  293. data/spec/models/fields/custom_field_date_pair_spec.rb +14 -14
  294. data/spec/models/fields/custom_field_pair_spec.rb +13 -13
  295. data/spec/models/fields/custom_field_spec.rb +5 -5
  296. data/spec/models/fields/field_spec.rb +2 -2
  297. data/spec/models/observers/entity_observer_spec.rb +2 -2
  298. data/spec/models/users/user_spec.rb +7 -7
  299. data/spec/routing/comments_routing_spec.rb +0 -9
  300. data/spec/shared/controllers.rb +75 -77
  301. data/spec/shared/models.rb +1 -1
  302. data/spec/spec_helper.rb +1 -2
  303. data/spec/support/auth_macros.rb +3 -3
  304. data/spec/support/mail_processor_mocks.rb +13 -13
  305. data/spec/views/accounts/_edit.haml_spec.rb +1 -1
  306. data/spec/views/accounts/{create.rjs_spec.rb → create.js.haml_spec.rb} +9 -14
  307. data/spec/views/accounts/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +6 -8
  308. data/spec/views/accounts/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +10 -18
  309. data/spec/views/accounts/{index.rjs_spec.rb → index.js.haml_spec.rb} +7 -11
  310. data/spec/views/accounts/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  311. data/spec/views/accounts/show.haml_spec.rb +1 -1
  312. data/spec/views/accounts/{update.rjs_spec.rb → update.js.haml_spec.rb} +16 -25
  313. data/spec/views/admin/field_groups/create.js.haml_spec.rb +31 -0
  314. data/spec/views/admin/field_groups/destroy.js.haml_spec.rb +31 -0
  315. data/spec/views/admin/field_groups/edit.js.haml_spec.rb +24 -0
  316. data/spec/views/admin/field_groups/new.js.haml_spec.rb +25 -0
  317. data/spec/views/admin/field_groups/update.js.haml_spec.rb +30 -0
  318. data/spec/views/admin/users/_create.haml_spec.rb +1 -1
  319. data/spec/views/admin/users/{create.rjs_spec.rb → create.js.haml_spec.rb} +6 -9
  320. data/spec/views/admin/users/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +6 -7
  321. data/spec/views/admin/users/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +6 -12
  322. data/spec/views/admin/users/index.haml_spec.rb +0 -0
  323. data/spec/views/admin/users/{index.rjs_spec.rb → index.js.haml_spec.rb} +3 -5
  324. data/spec/views/admin/users/{new.rjs_spec.rb → new.js.haml_spec.rb} +4 -6
  325. data/spec/views/admin/users/{reactivate.rjs_spec.rb → reactivate.js.haml_spec.rb} +2 -4
  326. data/spec/views/admin/users/show.haml_spec.rb +0 -0
  327. data/spec/views/admin/users/{suspend.rjs_spec.rb → suspend.js.haml_spec.rb} +2 -4
  328. data/spec/views/admin/users/{update.rjs_spec.rb → update.js.haml_spec.rb} +6 -10
  329. data/spec/views/campaigns/{create.rjs_spec.rb → create.js.haml_spec.rb} +9 -14
  330. data/spec/views/campaigns/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +6 -7
  331. data/spec/views/campaigns/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +11 -19
  332. data/spec/views/campaigns/{index.rjs_spec.rb → index.js.haml_spec.rb} +5 -9
  333. data/spec/views/campaigns/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  334. data/spec/views/campaigns/{update.rjs_spec.rb → update.js.haml_spec.rb} +14 -21
  335. data/spec/views/comments/{new.rjs_spec.rb → edit.js.haml_spec.rb} +12 -9
  336. data/spec/views/contacts/{create.rjs_spec.rb → create.js.haml_spec.rb} +9 -16
  337. data/spec/views/contacts/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +6 -8
  338. data/spec/views/contacts/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +12 -19
  339. data/spec/views/contacts/index.haml_spec.rb +1 -1
  340. data/spec/views/contacts/{index.rjs_spec.rb → index.js.html_spec.rb} +7 -11
  341. data/spec/views/contacts/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -7
  342. data/spec/views/contacts/{update.rjs_spec.rb → update.js.haml_spec.rb} +20 -35
  343. data/spec/views/home/{index.rjs_spec.rb → index.js.haml_spec.rb} +2 -4
  344. data/spec/views/home/{options.rjs_spec.rb → options.js.haml_spec.rb} +7 -12
  345. data/spec/views/leads/{convert.rjs_spec.rb → convert.js.haml_spec.rb} +12 -20
  346. data/spec/views/leads/{create.rjs_spec.rb → create.js.haml_spec.rb} +13 -19
  347. data/spec/views/leads/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +9 -12
  348. data/spec/views/leads/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +12 -20
  349. data/spec/views/leads/{index.rjs_spec.rb → index.js.haml_spec.rb} +5 -9
  350. data/spec/views/leads/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  351. data/spec/views/leads/{promote.rjs_spec.rb → promote.js.haml_spec.rb} +28 -43
  352. data/spec/views/leads/{reject.rjs_spec.rb → reject.js.haml_spec.rb} +10 -17
  353. data/spec/views/leads/{update.rjs_spec.rb → update.js.haml_spec.rb} +25 -38
  354. data/spec/views/opportunities/{create.rjs_spec.rb → create.js.haml_spec.rb} +16 -26
  355. data/spec/views/opportunities/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +13 -16
  356. data/spec/views/opportunities/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +10 -18
  357. data/spec/views/opportunities/{index.rjs_spec.rb → index.js.haml_spec.rb} +7 -12
  358. data/spec/views/opportunities/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  359. data/spec/views/opportunities/{update.rjs_spec.rb → update.js.haml_spec.rb} +29 -46
  360. data/spec/views/tasks/_edit.haml_spec.rb +1 -1
  361. data/spec/views/tasks/{complete.rjs_spec.rb → complete.js.haml_spec.rb} +9 -14
  362. data/spec/views/tasks/{create.rjs_spec.rb → create.js.haml_spec.rb} +25 -33
  363. data/spec/views/tasks/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +9 -11
  364. data/spec/views/tasks/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +9 -14
  365. data/spec/views/tasks/index.haml_spec.rb +1 -2
  366. data/spec/views/tasks/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  367. data/spec/views/tasks/{update.rjs_spec.rb → update.js.haml_spec.rb} +28 -41
  368. data/spec/views/users/{avatar.rjs_spec.rb → avatar.js.haml_spec.rb} +7 -9
  369. data/spec/views/users/{change_password.rjs_spec.rb → change_password.js.haml_spec.rb} +10 -12
  370. data/spec/views/users/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +8 -10
  371. data/spec/views/users/{password.rjs_spec.rb → password.js.haml_spec.rb} +9 -11
  372. data/spec/views/users/{update.rjs_spec.rb → update.js.haml_spec.rb} +7 -15
  373. data/spec/views/users/{upload_avatar.rjs_spec.rb → upload_avatar.js.haml_spec.rb} +8 -10
  374. data/vendor/assets/javascripts/ajax-chosen-jquery.js +2 -0
  375. data/vendor/assets/javascripts/ajax-chosen-prototype.js +2 -0
  376. data/vendor/assets/javascripts/ajax-chosen.jquery.coffee +81 -0
  377. data/vendor/assets/javascripts/ajax-chosen.proto.coffee +98 -0
  378. data/vendor/assets/javascripts/jquery_timeago/index.js +17 -0
  379. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js +18 -0
  380. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js +18 -0
  381. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js +20 -0
  382. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js +20 -0
  383. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js +18 -0
  384. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js +17 -0
  385. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js +17 -0
  386. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js +16 -0
  387. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js +19 -0
  388. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.js +194 -0
  389. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js +31 -0
  390. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js +18 -0
  391. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js +34 -0
  392. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js +18 -0
  393. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js +20 -0
  394. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js +20 -0
  395. data/zeus.json +2 -1
  396. metadata +240 -245
  397. data/app/assets/images/delete.png +0 -0
  398. data/app/assets/images/iconset_attribution.png +0 -0
  399. data/app/views/accounts/create.js.rjs +0 -14
  400. data/app/views/accounts/destroy.js.rjs +0 -3
  401. data/app/views/accounts/edit.js.rjs +0 -33
  402. data/app/views/accounts/index.js.rjs +0 -8
  403. data/app/views/accounts/new.js.rjs +0 -9
  404. data/app/views/accounts/show.js.erb +0 -2
  405. data/app/views/accounts/update.js.rjs +0 -17
  406. data/app/views/admin/field_groups/confirm.js.rjs +0 -6
  407. data/app/views/admin/field_groups/create.js.rjs +0 -20
  408. data/app/views/admin/field_groups/destroy.js.rjs +0 -11
  409. data/app/views/admin/field_groups/edit.js.rjs +0 -14
  410. data/app/views/admin/field_groups/new.js.rjs +0 -9
  411. data/app/views/admin/field_groups/update.js.rjs +0 -9
  412. data/app/views/admin/fields/create.js.erb +0 -19
  413. data/app/views/admin/fields/destroy.js.erb +0 -9
  414. data/app/views/admin/fields/edit.js.erb +0 -1
  415. data/app/views/admin/fields/update.js.erb +0 -13
  416. data/app/views/admin/groups/create.js.rjs +0 -11
  417. data/app/views/admin/groups/destroy.js.rjs +0 -11
  418. data/app/views/admin/groups/edit.js.rjs +0 -21
  419. data/app/views/admin/groups/index.js.rjs +0 -2
  420. data/app/views/admin/groups/new.js.rjs +0 -9
  421. data/app/views/admin/groups/update.js.rjs +0 -10
  422. data/app/views/admin/tags/confirm.js.rjs +0 -6
  423. data/app/views/admin/tags/create.js.rjs +0 -12
  424. data/app/views/admin/tags/destroy.js.rjs +0 -11
  425. data/app/views/admin/tags/edit.js.rjs +0 -21
  426. data/app/views/admin/tags/new.js.rjs +0 -8
  427. data/app/views/admin/tags/update.js.rjs +0 -10
  428. data/app/views/admin/users/confirm.js.rjs +0 -6
  429. data/app/views/admin/users/create.js.rjs +0 -11
  430. data/app/views/admin/users/destroy.js.rjs +0 -11
  431. data/app/views/admin/users/edit.js.rjs +0 -21
  432. data/app/views/admin/users/index.js.rjs +0 -3
  433. data/app/views/admin/users/new.js.rjs +0 -8
  434. data/app/views/admin/users/reactivate.js.rjs +0 -3
  435. data/app/views/admin/users/suspend.js.rjs +0 -3
  436. data/app/views/admin/users/update.js.rjs +0 -10
  437. data/app/views/campaigns/create.js.rjs +0 -18
  438. data/app/views/campaigns/destroy.js.rjs +0 -3
  439. data/app/views/campaigns/edit.js.rjs +0 -34
  440. data/app/views/campaigns/index.js.rjs +0 -8
  441. data/app/views/campaigns/new.js.rjs +0 -9
  442. data/app/views/campaigns/show.js.erb +0 -2
  443. data/app/views/campaigns/update.js.rjs +0 -21
  444. data/app/views/comments/create.js.rjs +0 -11
  445. data/app/views/comments/destroy.js.rjs +0 -6
  446. data/app/views/comments/edit.js.rjs +0 -11
  447. data/app/views/comments/new.js.rjs +0 -14
  448. data/app/views/comments/update.js.rjs +0 -11
  449. data/app/views/contacts/create.js.rjs +0 -19
  450. data/app/views/contacts/destroy.js.rjs +0 -7
  451. data/app/views/contacts/edit.js.rjs +0 -36
  452. data/app/views/contacts/index.js.rjs +0 -8
  453. data/app/views/contacts/new.js.rjs +0 -11
  454. data/app/views/contacts/show.js.erb +0 -2
  455. data/app/views/contacts/update.js.rjs +0 -22
  456. data/app/views/emails/destroy.js.rjs +0 -6
  457. data/app/views/entities/attach.js.rjs +0 -24
  458. data/app/views/entities/contacts.js.rjs +0 -3
  459. data/app/views/entities/discard.js.rjs +0 -7
  460. data/app/views/entities/leads.js.rjs +0 -3
  461. data/app/views/entities/opportunities.js.rjs +0 -3
  462. data/app/views/entities/subscription_update.js.rjs +0 -4
  463. data/app/views/entities/versions.js.erb +0 -3
  464. data/app/views/fields/group.js.rjs +0 -7
  465. data/app/views/home/index.js.rjs +0 -7
  466. data/app/views/home/options.js.rjs +0 -8
  467. data/app/views/leads/convert.js.rjs +0 -37
  468. data/app/views/leads/create.js.rjs +0 -19
  469. data/app/views/leads/destroy.js.rjs +0 -7
  470. data/app/views/leads/edit.js.rjs +0 -36
  471. data/app/views/leads/index.js.rjs +0 -8
  472. data/app/views/leads/new.js.rjs +0 -9
  473. data/app/views/leads/promote.js.rjs +0 -27
  474. data/app/views/leads/reject.js.rjs +0 -10
  475. data/app/views/leads/show.js.erb +0 -2
  476. data/app/views/leads/update.js.rjs +0 -27
  477. data/app/views/lists/create.js.rjs +0 -9
  478. data/app/views/lists/destroy.js.rjs +0 -1
  479. data/app/views/opportunities/contacts.js.rjs +0 -3
  480. data/app/views/opportunities/create.js.rjs +0 -29
  481. data/app/views/opportunities/destroy.js.rjs +0 -11
  482. data/app/views/opportunities/edit.js.rjs +0 -36
  483. data/app/views/opportunities/index.js.rjs +0 -8
  484. data/app/views/opportunities/new.js.rjs +0 -12
  485. data/app/views/opportunities/show.js.erb +0 -2
  486. data/app/views/opportunities/update.js.rjs +0 -26
  487. data/app/views/tasks/complete.js.rjs +0 -17
  488. data/app/views/tasks/create.js.rjs +0 -41
  489. data/app/views/tasks/destroy.js.rjs +0 -7
  490. data/app/views/tasks/discard.rjs +0 -1
  491. data/app/views/tasks/edit.js.rjs +0 -23
  492. data/app/views/tasks/filter.js.rjs +0 -1
  493. data/app/views/tasks/new.js.rjs +0 -9
  494. data/app/views/tasks/update.js.rjs +0 -21
  495. data/app/views/users/avatar.js.rjs +0 -10
  496. data/app/views/users/change_password.js.rjs +0 -15
  497. data/app/views/users/edit.js.rjs +0 -10
  498. data/app/views/users/password.js.rjs +0 -11
  499. data/app/views/users/update.js.rjs +0 -10
  500. data/app/views/users/upload_avatar.js.rjs +0 -8
  501. data/lib/fat_free_crm/secret_token_generator.rb +0 -65
  502. data/spec/lib/secret_token_generator_spec.rb +0 -79
  503. data/spec/models/users/abilities/user_ability_spec.rb +0 -58
  504. data/spec/support/rjs_support.rb +0 -14
  505. data/vendor/assets/images/brief.png +0 -0
  506. data/vendor/assets/images/full.png +0 -0
  507. data/vendor/assets/images/long.png +0 -0
  508. data/vendor/assets/images/tab_icons/accounts.png +0 -0
  509. data/vendor/assets/images/tab_icons/accounts_active.png +0 -0
  510. data/vendor/assets/images/tab_icons/campaigns.png +0 -0
  511. data/vendor/assets/images/tab_icons/campaigns_active.png +0 -0
  512. data/vendor/assets/images/tab_icons/contacts.png +0 -0
  513. data/vendor/assets/images/tab_icons/contacts_active.png +0 -0
  514. data/vendor/assets/images/tab_icons/dashboard.png +0 -0
  515. data/vendor/assets/images/tab_icons/dashboard_active.png +0 -0
  516. data/vendor/assets/images/tab_icons/leads.png +0 -0
  517. data/vendor/assets/images/tab_icons/leads_active.png +0 -0
  518. data/vendor/assets/images/tab_icons/opportunities.png +0 -0
  519. data/vendor/assets/images/tab_icons/opportunities_active.png +0 -0
  520. data/vendor/assets/images/tab_icons/tasks.png +0 -0
  521. data/vendor/assets/images/tab_icons/tasks_active.png +0 -0
@@ -22,7 +22,7 @@ Rails.application.routes.draw do
22
22
  match '/home/redraw', :as => :redraw
23
23
 
24
24
  resource :authentication
25
- resources :comments
25
+ resources :comments, :except => [:new, :show]
26
26
  resources :emails
27
27
  resources :passwords
28
28
 
@@ -72,8 +72,6 @@
72
72
  :authentication : :plain
73
73
  :user_name : ""
74
74
  :password : ""
75
- # :delivery_method : :smtp # This is the default. Can be :smtp, :sendmail, :test, :file
76
-
77
75
 
78
76
  # Settings for the Email dropbox (IMAP)
79
77
  # - Connection settings for the IMAP account, server and folders.
@@ -197,27 +195,80 @@
197
195
 
198
196
  # Main and Admin Tabs
199
197
  #------------------------------------------------------------------------------
200
- :tabs: [
201
- { :active : true, :text : :tab_dashboard, :url : { :controller : "home" } },
202
- { :active : false, :text : :tab_tasks, :url : { :controller : "tasks" } },
203
- { :active : false, :text : :tab_campaigns, :url : { :controller : "campaigns" } },
204
- { :active : false, :text : :tab_leads, :url : { :controller : "leads" } },
205
- { :active : false, :text : :tab_accounts, :url : { :controller : "accounts" } },
206
- { :active : false, :text : :tab_contacts, :url : { :controller : "contacts" } },
207
- { :active : false, :text : :tab_opportunities, :url : { :controller : "opportunities" } },
208
- { :active : false, :text : :tab_team, :url : { :controller : "users",
209
- :action : "opportunities_overview" } }
210
-
211
- ]
212
-
213
- :admin_tabs: [
214
- { :active : true, :text : :admin_tab_users, :url : { :controller : "admin/users" } },
215
- { :active : true, :text : :admin_tab_groups, :url : { :controller : "admin/groups" } },
216
- { :active : false, :text : :admin_tab_fields, :url : { :controller : "admin/fields" } },
217
- { :active : false, :text : :admin_tab_tags, :url : { :controller : "admin/tags" } },
218
- { :active : false, :text : :admin_tab_settings, :url : { :controller : "admin/settings" } },
219
- { :active : false, :text : :admin_tab_plugins, :url : { :controller : "admin/plugins" } }
220
- ]
198
+ :tabs:
199
+ - :active: true
200
+ :text: :tab_dashboard
201
+ :icon: :fa-dashboard
202
+ :url:
203
+ :controller: home
204
+ - :active: false
205
+ :text: :tab_tasks
206
+ :icon: :fa-check-square-o
207
+ :url:
208
+ :controller: tasks
209
+ - :active: false
210
+ :text: :tab_campaigns
211
+ :icon: :fa-bar-chart-o
212
+ :url:
213
+ :controller: campaigns
214
+ - :active: false
215
+ :text: :tab_leads
216
+ :icon: :fa-tasks
217
+ :url:
218
+ :controller: leads
219
+ - :active: false
220
+ :text: :tab_accounts
221
+ :icon: :fa-users
222
+ :url:
223
+ :controller: accounts
224
+ - :active: false
225
+ :text: :tab_contacts
226
+ :icon: :fa-user
227
+ :url:
228
+ :controller: contacts
229
+ - :active: false
230
+ :text: :tab_opportunities
231
+ :icon: :fa-money
232
+ :url:
233
+ :controller: opportunities
234
+ - :active: false
235
+ :text: :tab_team
236
+ :icon: :fa-globe
237
+ :url:
238
+ :controller: users
239
+ :action: opportunities_overview
240
+
241
+ :admin_tabs:
242
+ - :active: true
243
+ :text: :admin_tab_users
244
+ :icon: :fa-user
245
+ :url:
246
+ :controller: admin/users
247
+ - :active: true
248
+ :text: :admin_tab_groups
249
+ :icon: :fa-users
250
+ :url:
251
+ :controller: admin/groups
252
+ - :active: false
253
+ :text: :admin_tab_fields
254
+ :icon: :fa-list-alt
255
+ :url:
256
+ :controller: admin/fields
257
+ - :active: false
258
+ :text: :admin_tab_tags
259
+ :icon: :fa-tags
260
+ :url:
261
+ :controller: admin/tags
262
+ - :active: false
263
+ :text: :admin_tab_settings
264
+ :icon: :fa-cogs
265
+ :url:
266
+ :controller: admin/settings
267
+ - :active: false
268
+ :text: :admin_tab_plugins
269
+ :icon: :fa-plus-circle
270
+ :url:
271
+ :controller: admin/plugins
221
272
 
222
273
  # Account Category. To add custom account type use string value, for example:
223
274
  #
@@ -0,0 +1,11 @@
1
+ require 'zeus/rails'
2
+
3
+ class CustomPlan < Zeus::Rails
4
+
5
+ # def my_custom_command
6
+ # # see https://github.com/burke/zeus/blob/master/docs/ruby/modifying.md
7
+ # end
8
+
9
+ end
10
+
11
+ Zeus.plan = CustomPlan.new
@@ -0,0 +1,6 @@
1
+ class AddUserIdToLists < ActiveRecord::Migration
2
+ def change
3
+ add_column :lists, :user_id, :integer, :default => nil
4
+ add_index :lists, :user_id
5
+ end
6
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20121221033947) do
14
+ ActiveRecord::Schema.define(:version => 20131207033244) do
15
15
 
16
16
  create_table "account_contacts", :force => true do |t|
17
17
  t.integer "account_id"
@@ -282,8 +282,11 @@ ActiveRecord::Schema.define(:version => 20121221033947) do
282
282
  t.text "url"
283
283
  t.datetime "created_at", :null => false
284
284
  t.datetime "updated_at", :null => false
285
+ t.integer "user_id"
285
286
  end
286
287
 
288
+ add_index "lists", ["user_id"], :name => "index_lists_on_user_id"
289
+
287
290
  create_table "opportunities", :force => true do |t|
288
291
  t.integer "user_id"
289
292
  t.integer "campaign_id"
@@ -23,7 +23,7 @@ Gem::Specification.new do |gem|
23
23
  gem.add_dependency 'paperclip'
24
24
  # Manually added paperclip gem dependency "cocaine" in order to fix load error: "no such file to load -- cocaine"
25
25
  gem.add_dependency 'cocaine'
26
- gem.add_dependency 'paper_trail'
26
+ gem.add_dependency 'paper_trail', '~> 2.7.0' # not ready for v3 yet
27
27
  gem.add_dependency 'authlogic', '3.1.0'
28
28
  gem.add_dependency 'acts_as_commentable', '~> 3.0.1'
29
29
  gem.add_dependency 'acts-as-taggable-on', '~> 2.3.3'
@@ -33,16 +33,16 @@ Gem::Specification.new do |gem|
33
33
  gem.add_dependency 'acts_as_list', '~> 0.1.4'
34
34
  gem.add_dependency 'ffaker', '>= 1.12.0'
35
35
  gem.add_dependency 'cancan'
36
+ gem.add_dependency 'font-awesome-rails'
36
37
  gem.add_dependency 'premailer'
37
38
  gem.add_dependency 'nokogiri'
38
39
  gem.add_dependency 'responds_to_parent', '>= 1.1.0'
39
40
  gem.add_dependency 'rails3-jquery-autocomplete'
40
41
  gem.add_dependency 'valium'
42
+ gem.add_dependency 'psych', '~> 1' if RUBY_VERSION.to_f < 2.0
41
43
 
42
44
  # FatFreeCRM has released it's own versions of the following gems:
43
45
  #-----------------------------------------------------------------
44
- gem.add_dependency 'ransack_ffcrm', '~> 0.7.1'
45
46
  gem.add_dependency 'ransack_ui', '>= 1.1.0'
46
- gem.add_dependency 'ajax-chosen-rails', '>= 0.2.1' # (now depends on chosen-rails_ffcrm)
47
47
  gem.add_dependency 'email_reply_parser_ffcrm'
48
48
  end
@@ -9,22 +9,12 @@ module FatFreeCRM
9
9
  # Return either Application or Engine,
10
10
  # depending on how Fat Free CRM has been loaded
11
11
  def application
12
- engine? ? Engine : Application
12
+ defined?(FatFreeCRM::Engine) ? Engine : Application
13
13
  end
14
14
 
15
15
  def root
16
16
  application.root
17
17
  end
18
-
19
- # Are we running as an engine?
20
- def engine?
21
- defined?(FatFreeCRM::Engine).present?
22
- end
23
-
24
- def application?
25
- !engine?
26
- end
27
-
28
18
  end
29
19
  end
30
20
 
@@ -7,7 +7,7 @@ require "csv"
7
7
 
8
8
  module FatFreeCRM
9
9
  class ExportCSV
10
-
10
+
11
11
  # CSV export. Based on to_csv Rails plugin by Ary Djmal
12
12
  # https://github.com/arydjmal/to_csv
13
13
  #----------------------------------------------------------------------------
@@ -16,7 +16,7 @@ module FatFreeCRM
16
16
  # Infer column types from the first item in the array
17
17
  klass = items.first.class
18
18
  columns = klass.columns.map(&:name).reject { |column| column =~ /password|token/ }
19
- columns << 'tags'
19
+ columns << 'tags' if klass.taggable?
20
20
  CSV.generate do |csv|
21
21
  csv << columns.map { |column| klass.human_attribute_name(column) }
22
22
  items.each do |item|
@@ -30,6 +30,6 @@ module FatFreeCRM
30
30
  end
31
31
  end
32
32
  end
33
-
33
+
34
34
  end
35
35
  end
@@ -42,6 +42,16 @@ module FatFreeCRM
42
42
  end
43
43
  end
44
44
 
45
+ # Shows custom field select options in ransack search form
46
+ def ransack_column_select_options
47
+ field_groups.each_with_object({}) do |group, hash|
48
+ group.fields.select{|f| f.collection.present? }.each do |field|
49
+ hash[field.name] = field.collection.each_with_object({}) do |option, options|
50
+ options[option] = option
51
+ end
52
+ end
53
+ end
54
+ end
45
55
  end
46
56
 
47
57
  module InstanceMethods
@@ -18,8 +18,6 @@ require 'paperclip'
18
18
  require 'simple_form'
19
19
  require 'will_paginate'
20
20
  require 'authlogic'
21
- require 'chosen-rails'
22
- require 'ajax-chosen-rails'
23
21
  require 'ransack'
24
22
  require 'ransack_ui'
25
23
  require 'paper_trail'
@@ -29,6 +27,7 @@ require 'valium'
29
27
  require 'ffaker'
30
28
  require 'premailer'
31
29
  require 'nokogiri'
30
+ require 'font-awesome-rails'
32
31
 
33
32
  # Load redcloth if available (for textile markup in emails)
34
33
  begin
@@ -3,34 +3,38 @@
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
+ require 'pathname'
7
+
6
8
  module FatFreeCRM
7
9
  module I18n
8
10
 
9
11
  #----------------------------------------------------------------------------
10
12
  def t(*args)
11
13
  if args.size == 1
12
- super(args.first, :default => args.first.to_s)
14
+ super(args.first, default: args.first.to_s)
13
15
  elsif args.second.is_a?(Hash)
14
16
  super(*args)
15
17
  elsif args.second.is_a?(Fixnum)
16
- super(args.first, :count => args.second)
18
+ super(args.first, count: args.second)
17
19
  else
18
- super(args.first, :value => args.second)
20
+ super(args.first, value: args.second)
19
21
  end
20
22
  end
21
23
 
22
24
  # Scan config/locales directory for Fat Free CRM localization files
23
25
  # (i.e. *_fat_free_crm.yml) and return locale part of the file name.
26
+ # We can't use ::I18n.available_locales because rails provides it's own
27
+ # translations too and we only want the locales that Fat Free CRM supports.
24
28
  #----------------------------------------------------------------------------
25
29
  def locales
26
- @@locales ||= Dir.entries("#{Rails.root}/config/locales").grep(/_fat_free_crm\.yml$/) { |f| f.sub("_fat_free_crm.yml", "") }
30
+ @@locales ||= ::I18n.load_path.grep(/_fat_free_crm\.yml$/).map{ |path| Pathname.new(path).basename.to_s.match(/(.*)_fat_free_crm\.yml/)[1] }.uniq
27
31
  end
28
32
 
29
33
  # Return a hash where the key is locale name, and the value is language name
30
34
  # as defined in the locale_fat_free_crm.yml file.
31
35
  #----------------------------------------------------------------------------
32
36
  def languages
33
- @@languages ||= Hash[ locales.map{ |locale| [ locale, t(:language, :locale => locale) ] } ]
37
+ @@languages ||= Hash[ locales.map{ |locale| [ locale, t(:language, locale: locale) ] } ]
34
38
  end
35
39
  end
36
40
  end
@@ -6,8 +6,8 @@
6
6
  module FatFreeCRM
7
7
  module VERSION #:nodoc:
8
8
  MAJOR = 0
9
- MINOR = 12
10
- TINY = 3
9
+ MINOR = 13
10
+ TINY = 0
11
11
  PRE = nil
12
12
 
13
13
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
@@ -3,6 +3,7 @@
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
+
6
7
  module FatFreeCRM
7
8
 
8
9
  # A view factory keeps track of views and the contexts in which they are available.
@@ -15,7 +16,7 @@ module FatFreeCRM
15
16
  # Icon is optional. If specified, it will be passed to asset_path.
16
17
  #
17
18
  class ViewFactory
18
-
19
+
19
20
  include Comparable
20
21
 
21
22
  @@views = []
@@ -24,13 +25,13 @@ module FatFreeCRM
24
25
  # Class methods
25
26
  #----------------------------------------------------------------------------
26
27
  class << self
27
-
28
+
28
29
  # Register with the view factory
29
30
  #----------------------------------------------------------------------------
30
31
  def register(view)
31
32
  @@views << view unless @@views.map(&:id).include?(view.id)
32
33
  end
33
-
34
+
34
35
  # Return views that are available based on context
35
36
  #----------------------------------------------------------------------------
36
37
  def views_for(options = {})
@@ -41,7 +42,7 @@ module FatFreeCRM
41
42
  view.controllers.include?(controller) and view.actions.include?(action) and (name.present? ? view.name == name : true)
42
43
  end
43
44
  end
44
-
45
+
45
46
  # Return template name of the current view
46
47
  # pass in options[:name] to specify view name
47
48
  #----------------------------------------------------------------------------
@@ -72,12 +73,14 @@ module FatFreeCRM
72
73
  end
73
74
 
74
75
  private
75
-
76
+
76
77
  # This defines what it means for one view to be different to another
77
78
  #----------------------------------------------------------------------------
78
79
  def generate_id
79
80
  [name, controllers.sort, actions.sort].flatten.map(&:to_s).map(&:underscore).join('_')
80
81
  end
81
82
 
83
+ ActiveSupport.run_load_hooks(:fat_free_crm_view_factory, self)
84
+
82
85
  end
83
86
  end
@@ -25,20 +25,17 @@ namespace :ffcrm do
25
25
  #
26
26
  desc "Ensures all yaml files in the config folder are readable by Psych. If not, assumes file is in the Syck format and converts it for you [creates a new file]."
27
27
  task :syck_to_psych do
28
- error_count = 0
29
- total_files = 0
28
+ require 'fileutils'
29
+ require 'syck'
30
+ require 'psych'
30
31
  Dir[File.join(Rails.root, 'config', '**', '*.yml')].each do |file|
31
- begin
32
- Psych.load_file(file)
33
- rescue Psych::SyntaxError => e
34
- puts e # prints error message with line number
35
- File.open("#{file}.new", 'w') {|f| f.puts Psych.dump(Syck.load_file(file)) }
36
- puts "Have written Psych compatible file to #{file}.new"
37
- error_count += 1
38
- end
39
- total_files += 1
32
+ YAML::ENGINE.yamler = 'syck'
33
+ puts "Converting #{file}"
34
+ yml = YAML.load( File.read(file) )
35
+ FileUtils.cp file, "#{file}.bak"
36
+ YAML::ENGINE.yamler = 'psych'
37
+ File.open(file, 'w'){ |file| file.write(YAML.dump(yml)) }
40
38
  end
41
- puts "Scanned #{total_files} yml files. Found #{error_count} problems (see above)."
42
39
  end
43
40
 
44
41
  end
@@ -13,7 +13,8 @@ namespace :ffcrm do
13
13
  base_locale = 'en-US'
14
14
 
15
15
  [[base_locale, args[:locale]],
16
- ["#{base_locale}_fat_free_crm", "#{args[:locale]}_fat_free_crm"]].each do |locale_file_names|
16
+ ["#{base_locale}_fat_free_crm", "#{args[:locale]}_fat_free_crm"],
17
+ ["#{base_locale}_ransack", "#{args[:locale]}_ransack"]].each do |locale_file_names|
17
18
  detector = MissingTranslationDetector.new locale_file_names.first,
18
19
  locale_file_names.last
19
20
  detector.detect
@@ -54,8 +54,10 @@ describe Admin::UsersController do
54
54
  #----------------------------------------------------------------------------
55
55
  describe "GET new" do
56
56
  it "assigns a new user as @user and renders [new] template" do
57
+ @user = User.new
58
+
57
59
  xhr :get, :new
58
- expect(assigns[:user]).to be_new_record
60
+ assigns[:user].attributes.should == @user.attributes
59
61
  response.should render_template("admin/users/new")
60
62
  end
61
63
  end
@@ -115,7 +117,7 @@ describe Admin::UsersController do
115
117
 
116
118
  it "assigns a newly created user as @user and renders [create] template" do
117
119
  @user = FactoryGirl.build(:user, :username => @username, :email => @email)
118
- User.stub!(:new).and_return(@user)
120
+ User.stub(:new).and_return(@user)
119
121
 
120
122
  xhr :post, :create, :user => { :username => @username, :email => @email, :password => @password, :password_confirmation => @password }
121
123
  assigns[:user].should == @user
@@ -138,7 +140,7 @@ describe Admin::UsersController do
138
140
  describe "with invalid params" do
139
141
  it "assigns a newly created but unsaved user as @user and re-renders [create] template" do
140
142
  @user = FactoryGirl.build(:user, :username => "", :email => "")
141
- User.stub!(:new).and_return(@user)
143
+ User.stub(:new).and_return(@user)
142
144
 
143
145
  xhr :post, :create, :user => {}
144
146
  assigns[:user].should == @user
@@ -239,7 +241,7 @@ describe Admin::UsersController do
239
241
 
240
242
  xhr :delete, :destroy, :id => @user.id
241
243
  flash[:warning].should_not == nil
242
- lambda { User.find(@user) }.should_not raise_error(ActiveRecord::RecordNotFound)
244
+ expect { User.find(@user) }.not_to raise_error()
243
245
  response.should render_template("admin/users/destroy")
244
246
  end
245
247
  end