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
@@ -52,7 +52,7 @@ describe Field do
52
52
  :label => "Availability",
53
53
  :name => "availability"
54
54
  )
55
- object = mock('Object')
55
+ object = double('Object')
56
56
 
57
57
  # as | value | expected
58
58
  [["check_boxes", [1, 2, 3], "1, 2<br />3"],
@@ -60,7 +60,7 @@ describe Field do
60
60
  ["checkbox", 1, "yes"],
61
61
  ["date", DateTime.new(2011,4,19), DateTime.new(2011,4,19).strftime(I18n.t("date.formats.mmddyy")) ]].each do |as, value, expected|
62
62
  field.as = as
63
- object.stub!(field.name).and_return(value)
63
+ object.stub(field.name).and_return(value)
64
64
  field.render_value(object).should == expected
65
65
  end
66
66
  end
@@ -11,7 +11,7 @@ describe EntityObserver do
11
11
  let(:assignee) { FactoryGirl.create(:user) }
12
12
  let(:assigner) { FactoryGirl.create(:user) }
13
13
  let!(:entity) { FactoryGirl.build(entity_type, :user => assigner, :assignee => assignee) }
14
- let(:mail) { mock('mail', :deliver => true) }
14
+ let(:mail) { double('mail', :deliver => true) }
15
15
 
16
16
  before :each do
17
17
  PaperTrail.stub(:whodunnit).and_return(assigner)
@@ -40,7 +40,7 @@ describe EntityObserver do
40
40
  let(:assignee) { FactoryGirl.create(:user) }
41
41
  let(:assigner) { FactoryGirl.create(:user) }
42
42
  let!(:entity) { FactoryGirl.create(entity_type, :user => FactoryGirl.create(:user)) }
43
- let(:mail) { mock('mail', :deliver => true) }
43
+ let(:mail) { double('mail', :deliver => true) }
44
44
 
45
45
  before :each do
46
46
  PaperTrail.stub(:whodunnit).and_return(assigner)
@@ -60,14 +60,14 @@ describe User do
60
60
  it "should not destroy the user if she owns #{asset}" do
61
61
  FactoryGirl.create(asset, :user => @user)
62
62
  @user.destroy
63
- lambda { User.find(@user) }.should_not raise_error(ActiveRecord::RecordNotFound)
63
+ expect { User.find(@user) }.to_not raise_error()
64
64
  @user.destroyed?.should == false
65
65
  end
66
66
 
67
67
  it "should not destroy the user if she has #{asset} assigned" do
68
68
  FactoryGirl.create(asset, :assignee => @user)
69
69
  @user.destroy
70
- lambda { User.find(@user) }.should_not raise_error(ActiveRecord::RecordNotFound)
70
+ expect { User.find(@user) }.to_not raise_error()
71
71
  @user.destroyed?.should == false
72
72
  end
73
73
  end
@@ -77,20 +77,20 @@ describe User do
77
77
  account = FactoryGirl.create(:account, :user => current_user)
78
78
  FactoryGirl.create(:comment, :user => @user, :commentable => account)
79
79
  @user.destroy
80
- lambda { User.find(@user) }.should_not raise_error(ActiveRecord::RecordNotFound)
80
+ expect { User.find(@user) }.to_not raise_error()
81
81
  @user.destroyed?.should == false
82
82
  end
83
83
 
84
84
  it "should not destroy the current user" do
85
85
  login
86
86
  current_user.destroy
87
- lambda { current_user.reload }.should_not raise_error(ActiveRecord::RecordNotFound)
87
+ expect { current_user.reload }.to_not raise_error()
88
88
  current_user.should_not be_destroyed
89
89
  end
90
90
 
91
91
  it "should destroy the user" do
92
92
  @user.destroy
93
- lambda { User.find(@user) }.should raise_error(ActiveRecord::RecordNotFound)
93
+ expect { User.find(@user) }.to raise_error(ActiveRecord::RecordNotFound)
94
94
  @user.should be_destroyed
95
95
  end
96
96
 
@@ -182,9 +182,9 @@ describe User do
182
182
  end
183
183
 
184
184
  it "should update I18n.locale if proference[:locale] is set" do
185
- @user.preference[:locale] = :esperanto
185
+ @user.preference[:locale] = :es
186
186
  @user.set_individual_locale
187
- I18n.locale.should == :esperanto
187
+ I18n.locale.should == :es
188
188
  end
189
189
 
190
190
  it "should not update I18n.locale if proference[:locale] is not set" do
@@ -12,14 +12,6 @@ describe CommentsController do
12
12
  { :get => "/comments" }.should route_to(:controller => "comments", :action => "index")
13
13
  end
14
14
 
15
- it "recognizes and generates #new" do
16
- { :get => "/comments/new" }.should route_to(:controller => "comments", :action => "new")
17
- end
18
-
19
- it "recognizes and generates #show" do
20
- { :get => "/comments/1" }.should route_to(:controller => "comments", :action => "show", :id => "1")
21
- end
22
-
23
15
  it "recognizes and generates #edit" do
24
16
  { :get => "/comments/1/edit" }.should route_to(:controller => "comments", :action => "edit", :id => "1")
25
17
  end
@@ -37,4 +29,3 @@ describe CommentsController do
37
29
  end
38
30
  end
39
31
  end
40
-
@@ -3,103 +3,101 @@
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
- module SharedControllerSpecs
7
6
 
8
- shared_examples "auto complete" do
9
- before(:each) do
10
- @query = "Hello"
11
- end
7
+ shared_examples "auto complete" do
8
+ before(:each) do
9
+ @query = "Hello"
10
+ end
12
11
 
13
- it "should do the search and find records that match autocomplete query" do
14
- post :auto_complete, :auto_complete_query => @query
15
- assigns[:query].should == @query
16
- assigns[:auto_complete].should == @auto_complete_matches # Each controller must define it.
17
- end
12
+ it "should do the search and find records that match autocomplete query" do
13
+ post :auto_complete, :auto_complete_query => @query
14
+ assigns[:query].should == @query
15
+ assigns[:auto_complete].should == @auto_complete_matches # Each controller must define it.
16
+ end
18
17
 
19
- it "should save current autocomplete controller in a session" do
20
- post :auto_complete, :auto_complete_query => @query
18
+ it "should save current autocomplete controller in a session" do
19
+ post :auto_complete, :auto_complete_query => @query
21
20
 
22
- # We don't save Admin/Users autocomplete controller in a session since Users are not
23
- # exposed through the Jumpbox.
24
- unless controller.class.to_s.starts_with?("Admin::")
25
- session[:auto_complete].should == @controller.controller_name.to_sym
26
- end
21
+ # We don't save Admin/Users autocomplete controller in a session since Users are not
22
+ # exposed through the Jumpbox.
23
+ unless controller.class.to_s.starts_with?("Admin::")
24
+ session[:auto_complete].should == @controller.controller_name.to_sym
27
25
  end
26
+ end
28
27
 
29
- it "should render application/_auto_complete template" do
30
- post :auto_complete, :auto_complete_query => @query
31
- response.should render_template("application/_auto_complete")
32
- end
28
+ it "should render application/_auto_complete template" do
29
+ post :auto_complete, :auto_complete_query => @query
30
+ response.should render_template("application/_auto_complete")
33
31
  end
32
+ end
34
33
 
35
- shared_examples "attach" do
36
- it "should attach existing asset to the parent asset of different type" do
37
- xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id
38
- @model.send(@attachment.class.name.tableize).should include(@attachment)
39
- assigns[:attachment].should == @attachment
40
- assigns[:attached].should == [ @attachment ]
41
- if @model.is_a?(Campaign) && (@attachment.is_a?(Lead) || @attachment.is_a?(Opportunity))
42
- assigns[:campaign].should == @attachment.reload.campaign
43
- end
44
- if @model.is_a?(Account) && @attachment.respond_to?(:account) # Skip Tasks...
45
- assigns[:account].should == @attachment.reload.account
46
- end
47
- response.should render_template("entities/attach")
34
+ shared_examples "attach" do
35
+ it "should attach existing asset to the parent asset of different type" do
36
+ xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id
37
+ @model.send(@attachment.class.name.tableize).should include(@attachment)
38
+ assigns[:attachment].should == @attachment
39
+ assigns[:attached].should == [ @attachment ]
40
+ if @model.is_a?(Campaign) && (@attachment.is_a?(Lead) || @attachment.is_a?(Opportunity))
41
+ assigns[:campaign].should == @attachment.reload.campaign
48
42
  end
43
+ if @model.is_a?(Account) && @attachment.respond_to?(:account) # Skip Tasks...
44
+ assigns[:account].should == @attachment.reload.account
45
+ end
46
+ response.should render_template("entities/attach")
47
+ end
49
48
 
50
- it "should not attach the asset that is already attached" do
51
- if @model.is_a?(Campaign) && (@attachment.is_a?(Lead) || @attachment.is_a?(Opportunity))
52
- @attachment.update_attribute(:campaign_id, @model.id)
53
- else
54
- @model.send(@attachment.class.name.tableize) << @attachment
55
- end
56
-
57
- xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id
58
- assigns[:attached].should == nil
59
- response.should render_template("entities/attach")
49
+ it "should not attach the asset that is already attached" do
50
+ if @model.is_a?(Campaign) && (@attachment.is_a?(Lead) || @attachment.is_a?(Opportunity))
51
+ @attachment.update_attribute(:campaign_id, @model.id)
52
+ else
53
+ @model.send(@attachment.class.name.tableize) << @attachment
60
54
  end
61
55
 
62
- it "should display flash warning when the model is no longer available" do
63
- @model.destroy
56
+ xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id
57
+ assigns[:attached].should == nil
58
+ response.should render_template("entities/attach")
59
+ end
64
60
 
65
- xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id
66
- flash[:warning].should_not == nil
67
- response.body.should == "window.location.reload();"
68
- end
69
- it "should display flash warning when the attachment is no longer available" do
70
- @attachment.destroy
61
+ it "should display flash warning when the model is no longer available" do
62
+ @model.destroy
71
63
 
72
- xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id
73
- flash[:warning].should_not == nil
74
- response.body.should == "window.location.reload();"
75
- end
64
+ xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id
65
+ flash[:warning].should_not == nil
66
+ response.body.should == "window.location.reload();"
76
67
  end
68
+ it "should display flash warning when the attachment is no longer available" do
69
+ @attachment.destroy
77
70
 
78
- shared_examples "discard" do
79
- it "should discard the attachment without deleting it" do
80
- xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id
81
- assigns[:attachment].should == @attachment.reload # The attachment should still exist.
82
- @model.reload.send("#{@attachment.class.name.tableize}").should == [] # But no longer associated with the model.
83
- assigns[:account].should == @model if @model.is_a?(Account)
84
- assigns[:campaign].should == @model if @model.is_a?(Campaign)
71
+ xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id
72
+ flash[:warning].should_not == nil
73
+ response.body.should == "window.location.reload();"
74
+ end
75
+ end
85
76
 
86
- response.should render_template("entities/discard")
87
- end
77
+ shared_examples "discard" do
78
+ it "should discard the attachment without deleting it" do
79
+ xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id
80
+ assigns[:attachment].should == @attachment.reload # The attachment should still exist.
81
+ @model.reload.send("#{@attachment.class.name.tableize}").should == [] # But no longer associated with the model.
82
+ assigns[:account].should == @model if @model.is_a?(Account)
83
+ assigns[:campaign].should == @model if @model.is_a?(Campaign)
88
84
 
89
- it "should display flash warning when the model is no longer available" do
90
- @model.destroy
85
+ response.should render_template("entities/discard")
86
+ end
91
87
 
92
- xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id
93
- flash[:warning].should_not == nil
94
- response.body.should == "window.location.reload();"
95
- end
88
+ it "should display flash warning when the model is no longer available" do
89
+ @model.destroy
96
90
 
97
- it "should display flash warning when the attachment is no longer available" do
98
- @attachment.destroy
91
+ xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id
92
+ flash[:warning].should_not == nil
93
+ response.body.should == "window.location.reload();"
94
+ end
99
95
 
100
- xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id
101
- flash[:warning].should_not == nil
102
- response.body.should == "window.location.reload();"
103
- end
96
+ it "should display flash warning when the attachment is no longer available" do
97
+ @attachment.destroy
98
+
99
+ xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id
100
+ flash[:warning].should_not == nil
101
+ response.body.should == "window.location.reload();"
104
102
  end
105
103
  end
@@ -5,7 +5,7 @@
5
5
  #------------------------------------------------------------------------------
6
6
  require "cancan/matchers"
7
7
 
8
- shared_examples "exportable" do
8
+ shared_examples_for "exportable" do
9
9
  it "Model#export returns all records with extra attributes added" do
10
10
 
11
11
  # User/assignee for the second record has no first/last name.
@@ -11,7 +11,7 @@ require 'rspec/rails'
11
11
  require 'capybara/rails'
12
12
 
13
13
  require 'acts_as_fu'
14
- require 'factory_girl_rails'
14
+ require 'factory_girl'
15
15
  require 'ffaker'
16
16
 
17
17
  require 'coveralls'
@@ -38,7 +38,6 @@ RSpec.configure do |config|
38
38
 
39
39
  # RSpec configuration options for Fat Free CRM.
40
40
  config.include RSpec::Rails::Matchers
41
- config.include(FactoryGirl::Syntax::Methods)
42
41
 
43
42
  config.before(:each) do
44
43
  # Overwrite locale settings within "config/settings.yml" if necessary.
@@ -17,8 +17,8 @@ end
17
17
  #----------------------------------------------------------------------------
18
18
  def login(user_stubs = {}, session_stubs = {})
19
19
  User.current_user = @current_user = FactoryGirl.create(:user, user_stubs)
20
- @current_user_session = mock(Authentication, {:record => current_user}.merge(session_stubs))
21
- Authentication.stub!(:find).and_return(@current_user_session)
20
+ @current_user_session = double(Authentication, {:record => current_user}.merge(session_stubs))
21
+ Authentication.stub(:find).and_return(@current_user_session)
22
22
  #set_timezone
23
23
  end
24
24
  alias :require_user :login
@@ -33,7 +33,7 @@ end
33
33
  def logout
34
34
  @current_user = nil
35
35
  @current_user_session = nil
36
- Authentication.stub!(:find).and_return(nil)
36
+ Authentication.stub(:find).and_return(nil)
37
37
  end
38
38
  alias :require_no_user :logout
39
39
 
@@ -5,31 +5,31 @@
5
5
  #------------------------------------------------------------------------------
6
6
  module MockIMAP
7
7
  def mock_imap
8
- @imap = mock
8
+ @imap = double
9
9
  @settings = @crawler.instance_variable_get("@settings")
10
10
  @settings[:address] = @mock_address
11
- Net::IMAP.stub!(:new).with(@settings[:server], @settings[:port], @settings[:ssl]).and_return(@imap)
11
+ Net::IMAP.stub(:new).with(@settings[:server], @settings[:port], @settings[:ssl]).and_return(@imap)
12
12
  end
13
13
 
14
14
  def mock_connect
15
15
  mock_imap
16
- @imap.stub!(:login).and_return(true)
17
- @imap.stub!(:select).and_return(true)
16
+ @imap.stub(:login).and_return(true)
17
+ @imap.stub(:select).and_return(true)
18
18
  end
19
19
 
20
20
  def mock_disconnect
21
- @imap.stub!(:disconnected?).and_return(false)
22
- @imap.stub!(:logout).and_return(true)
23
- @imap.stub!(:disconnect).and_return(true)
21
+ @imap.stub(:disconnected?).and_return(false)
22
+ @imap.stub(:logout).and_return(true)
23
+ @imap.stub(:disconnect).and_return(true)
24
24
  end
25
25
 
26
26
  def mock_message(body)
27
- @fetch_data = mock
28
- @fetch_data.stub!(:attr).and_return("RFC822" => body)
29
- @imap.stub!(:uid_search).and_return([ :uid ])
30
- @imap.stub!(:uid_fetch).and_return([ @fetch_data ])
31
- @imap.stub!(:uid_copy).and_return(true)
32
- @imap.stub!(:uid_store).and_return(true)
27
+ @fetch_data = double
28
+ @fetch_data.stub(:attr).and_return("RFC822" => body)
29
+ @imap.stub(:uid_search).and_return([ :uid ])
30
+ @imap.stub(:uid_fetch).and_return([ @fetch_data ])
31
+ @imap.stub(:uid_copy).and_return(true)
32
+ @imap.stub(:uid_store).and_return(true)
33
33
  body
34
34
  end
35
35
  end
@@ -3,7 +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
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
6
+ require 'spec_helper'
7
7
 
8
8
  describe "/accounts/_edit" do
9
9
  include AccountsHelper
@@ -3,7 +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
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
6
+ require 'spec_helper'
7
7
 
8
8
  describe "/accounts/create" do
9
9
  include AccountsHelper
@@ -23,21 +23,18 @@ describe "/accounts/create" do
23
23
  end
24
24
 
25
25
  it "should hide [Create Account] form and insert account partial" do
26
- rendered.should have_rjs(:insert, :top) do |rjs|
27
- with_tag("li[id=account_#{@account.id}]")
28
- end
29
- rendered.should include(%Q/$("account_#{@account.id}").visualEffect("highlight"/)
26
+ rendered.should include("jQuery('#accounts').prepend('<li class=\\'account highlight\\' id=\\'account_#{@account.id}\\'")
27
+ rendered.should include(%Q/jQuery('#account_#{@account.id}').effect("highlight"/)
30
28
  end
31
29
 
32
30
  it "should update pagination" do
33
- rendered.should have_rjs("paginate")
31
+ rendered.should include("#paginate")
34
32
  end
35
33
 
36
34
  it "should refresh accounts sidebar" do
37
- rendered.should have_rjs("sidebar") do |rjs|
38
- with_tag("div[id=filters]")
39
- with_tag("div[id=recently]")
40
- end
35
+ rendered.should include("#sidebar")
36
+ rendered.should have_text("Account Categories")
37
+ rendered.should have_text("Recent Items")
41
38
  end
42
39
  end
43
40
 
@@ -47,10 +44,8 @@ describe "/accounts/create" do
47
44
  assign(:users, [ current_user ])
48
45
  render
49
46
 
50
- rendered.should have_rjs("create_account") do |rjs|
51
- with_tag("form[class=new_account]")
52
- end
53
- rendered.should include('$("create_account").visualEffect("shake"')
47
+ rendered.should include("#create_account")
48
+ rendered.should include(%Q/jQuery('#create_account').effect("shake"/)
54
49
  end
55
50
  end
56
51
 
@@ -3,7 +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
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
6
+ require 'spec_helper'
7
7
 
8
8
  describe "/accounts/destroy" do
9
9
  include AccountsHelper
@@ -17,19 +17,17 @@ describe "/accounts/destroy" do
17
17
  end
18
18
 
19
19
  it "should blind up destroyed account partial" do
20
- rendered.should include(%Q/$("account_#{@account.id}").visualEffect("blind_up"/)
20
+ rendered.should include("slideUp")
21
21
  end
22
22
 
23
23
  it "should update accounts pagination" do
24
- rendered.should have_rjs("paginate")
24
+ rendered.should include("#paginate")
25
25
  end
26
26
 
27
27
  it "should update accounts sidebar" do
28
- rendered.should have_rjs("sidebar") do |rjs|
29
- with_tag("div[id=filters]")
30
- with_tag("div[id=recently]")
31
- end
28
+ rendered.should include("#sidebar")
29
+ rendered.should have_text("Account Categories")
30
+ rendered.should have_text("Recent Items")
32
31
  end
33
32
 
34
33
  end
35
-