fat_free_crm 0.11.3 → 0.11.4

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 (637) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +2 -2
  3. data/CHANGELOG +6 -1
  4. data/CONTRIBUTORS +40 -1
  5. data/Capfile +5 -0
  6. data/Gemfile +25 -6
  7. data/Gemfile.lock +128 -86
  8. data/README.md +23 -16
  9. data/{vendor → app}/assets/images/delete.png +0 -0
  10. data/app/assets/javascripts/admin/fields.js.coffee +62 -0
  11. data/app/assets/javascripts/application.js.erb +8 -1
  12. data/app/assets/javascripts/crm.js +44 -46
  13. data/app/assets/javascripts/crm_chosen.js.coffee +10 -7
  14. data/app/assets/javascripts/datepicker.js.coffee +15 -0
  15. data/app/assets/javascripts/format_buttons.js.coffee +48 -0
  16. data/app/assets/javascripts/{admin/field_groups.js.coffee → groups.js.coffee} +0 -0
  17. data/app/assets/javascripts/lists.js.coffee +1 -1
  18. data/app/assets/javascripts/search.js.coffee +56 -38
  19. data/app/assets/stylesheets/admin/{field_groups.css.scss → fields.css.scss} +4 -0
  20. data/app/assets/stylesheets/advanced_search.css.scss +79 -0
  21. data/app/assets/stylesheets/application.css.erb +4 -0
  22. data/app/assets/stylesheets/base.scss +3 -3
  23. data/app/assets/stylesheets/common.scss +72 -25
  24. data/app/assets/stylesheets/fields.scss +14 -0
  25. data/app/assets/stylesheets/format_buttons.css.scss +30 -0
  26. data/app/assets/stylesheets/groups.css.scss +3 -0
  27. data/app/assets/stylesheets/header.scss +7 -6
  28. data/{vendor/plugins/.gitkeep → app/assets/stylesheets/index_headers.css.scss} +0 -0
  29. data/app/assets/stylesheets/print.css.scss +12 -3
  30. data/app/assets/stylesheets/rails.scss +12 -3
  31. data/app/controllers/admin/application_controller.rb +1 -1
  32. data/app/controllers/admin/field_groups_controller.rb +2 -0
  33. data/app/controllers/admin/fields_controller.rb +41 -17
  34. data/app/controllers/admin/groups_controller.rb +70 -0
  35. data/app/controllers/admin/tags_controller.rb +1 -0
  36. data/app/controllers/admin/users_controller.rb +8 -7
  37. data/app/controllers/application_controller.rb +34 -5
  38. data/app/controllers/comments_controller.rb +2 -3
  39. data/app/controllers/entities/accounts_controller.rb +30 -37
  40. data/app/controllers/entities/campaigns_controller.rb +56 -29
  41. data/app/controllers/entities/contacts_controller.rb +24 -26
  42. data/app/controllers/entities/leads_controller.rb +38 -37
  43. data/app/controllers/entities/opportunities_controller.rb +28 -34
  44. data/app/controllers/entities_controller.rb +71 -43
  45. data/app/controllers/home_controller.rb +29 -27
  46. data/app/controllers/tasks_controller.rb +18 -17
  47. data/app/controllers/users_controller.rb +12 -8
  48. data/app/helpers/accounts_helper.rb +58 -16
  49. data/app/helpers/addresses_helper.rb +4 -1
  50. data/app/helpers/admin/fields_helper.rb +3 -4
  51. data/app/helpers/application_helper.rb +147 -100
  52. data/app/helpers/campaigns_helper.rb +2 -9
  53. data/app/helpers/fields_helper.rb +0 -1
  54. data/app/helpers/groups_helper.rb +2 -0
  55. data/app/helpers/home_helper.rb +11 -0
  56. data/app/helpers/leads_helper.rb +2 -9
  57. data/app/helpers/opportunities_helper.rb +2 -9
  58. data/app/helpers/{crm_tags_helper.rb → tags_helper.rb} +9 -8
  59. data/app/helpers/tasks_helper.rb +5 -21
  60. data/app/helpers/users_helper.rb +14 -7
  61. data/app/helpers/versions_helper.rb +46 -0
  62. data/app/inputs/date_time_input.rb +8 -25
  63. data/app/inputs/datepair_input.rb +77 -0
  64. data/app/inputs/datetimepair_input.rb +37 -0
  65. data/app/mailers/user_mailer.rb +10 -0
  66. data/app/models/entities/account.rb +18 -11
  67. data/app/models/entities/account_contact.rb +4 -3
  68. data/app/models/entities/account_opportunity.rb +0 -1
  69. data/app/models/entities/campaign.rb +6 -7
  70. data/app/models/entities/contact.rb +53 -25
  71. data/app/models/entities/contact_opportunity.rb +0 -1
  72. data/app/models/entities/lead.rb +24 -13
  73. data/app/models/entities/opportunity.rb +34 -16
  74. data/app/models/fields/custom_field.rb +29 -13
  75. data/app/models/fields/custom_field_date_pair.rb +58 -0
  76. data/app/models/fields/custom_field_datetime_pair.rb +28 -0
  77. data/app/models/fields/custom_field_pair.rb +54 -0
  78. data/app/models/fields/field.rb +60 -43
  79. data/app/models/fields/field_group.rb +0 -9
  80. data/app/models/observers/entity_observer.rb +29 -0
  81. data/app/models/observers/opportunity_observer.rb +3 -0
  82. data/app/models/polymorphic/address.rb +14 -0
  83. data/app/models/polymorphic/avatar.rb +13 -1
  84. data/app/models/polymorphic/email.rb +1 -1
  85. data/app/models/polymorphic/task.rb +14 -13
  86. data/app/models/setting.rb +14 -21
  87. data/app/models/users/ability.rb +25 -4
  88. data/app/models/users/group.rb +13 -0
  89. data/app/models/users/permission.rb +3 -1
  90. data/app/models/users/preference.rb +1 -2
  91. data/app/models/users/user.rb +25 -3
  92. data/app/views/accounts/_account.html.haml +5 -39
  93. data/app/views/accounts/_edit.html.haml +3 -2
  94. data/app/views/accounts/_index_brief.html.haml +32 -0
  95. data/app/views/accounts/_index_long.html.haml +42 -0
  96. data/app/views/accounts/_new.html.haml +3 -2
  97. data/app/views/accounts/_sidebar_index.html.haml +3 -4
  98. data/app/views/accounts/_sidebar_show.html.haml +2 -2
  99. data/app/views/accounts/_title_bar.html.haml +11 -0
  100. data/app/views/accounts/_top_section.html.haml +1 -1
  101. data/app/views/accounts/create.js.rjs +1 -2
  102. data/app/views/accounts/destroy.js.rjs +1 -1
  103. data/app/views/accounts/edit.js.rjs +0 -2
  104. data/app/views/accounts/index.html.haml +6 -13
  105. data/app/views/accounts/index.js.rjs +3 -1
  106. data/app/views/accounts/index.xls.builder +82 -0
  107. data/app/views/accounts/new.js.rjs +0 -2
  108. data/app/views/accounts/show.html.haml +17 -15
  109. data/app/views/accounts/show.js.erb +2 -0
  110. data/app/views/admin/custom_fields/_base_field.html.haml +21 -0
  111. data/app/views/admin/custom_fields/_check_boxes_field.html.haml +6 -0
  112. data/app/views/admin/custom_fields/_date_field.html.haml +14 -0
  113. data/app/views/admin/custom_fields/_date_pair_field.html.haml +21 -0
  114. data/app/views/admin/custom_fields/_datetime_field.html.haml +14 -0
  115. data/app/views/admin/custom_fields/_datetime_pair_field.html.haml +21 -0
  116. data/app/views/admin/custom_fields/_radio_field.html.haml +6 -0
  117. data/app/views/admin/custom_fields/_select_field.html.haml +25 -0
  118. data/app/views/admin/custom_fields/_string_field.html.haml +2 -0
  119. data/app/views/admin/field_groups/_field_group.html.haml +7 -5
  120. data/app/views/admin/field_groups/_top_section.html.haml +4 -3
  121. data/app/views/admin/field_groups/create.js.rjs +1 -2
  122. data/app/views/admin/fields/_field.html.haml +5 -3
  123. data/app/views/admin/fields/_form.html.haml +35 -0
  124. data/app/views/admin/fields/_subform.html.haml +6 -0
  125. data/app/views/admin/fields/create.js.erb +19 -0
  126. data/app/views/admin/fields/destroy.js.erb +9 -0
  127. data/app/views/admin/fields/edit.js.erb +1 -0
  128. data/app/views/admin/fields/index.html.haml +11 -8
  129. data/app/views/admin/fields/update.js.erb +13 -0
  130. data/app/views/admin/groups/_edit.html.haml +12 -0
  131. data/app/views/admin/groups/_form.html.haml +13 -0
  132. data/app/views/admin/groups/_group.html.haml +15 -0
  133. data/app/views/admin/groups/_new.html.haml +12 -0
  134. data/app/views/admin/groups/create.js.rjs +11 -0
  135. data/app/views/admin/{fields → groups}/destroy.js.rjs +3 -3
  136. data/app/views/admin/groups/edit.js.rjs +21 -0
  137. data/app/views/admin/groups/index.html.haml +18 -0
  138. data/app/views/admin/groups/index.js.rjs +2 -0
  139. data/app/views/admin/groups/new.js.rjs +9 -0
  140. data/app/views/admin/groups/show.html.haml +11 -0
  141. data/app/views/admin/groups/update.js.rjs +10 -0
  142. data/app/views/admin/users/_profile.html.haml +13 -1
  143. data/app/views/admin/users/_user.html.haml +7 -2
  144. data/app/views/admin/users/index.js.rjs +1 -0
  145. data/app/views/application/index.atom.builder +1 -1
  146. data/app/views/application/index.rss.builder +1 -1
  147. data/app/views/application/show.atom.builder +32 -0
  148. data/app/views/application/show.rss.builder +29 -0
  149. data/app/views/campaigns/_campaign.html.haml +5 -21
  150. data/app/views/campaigns/_edit.html.haml +3 -2
  151. data/app/views/campaigns/_index_brief.html.haml +15 -0
  152. data/app/views/campaigns/_index_long.html.haml +20 -0
  153. data/app/views/campaigns/_new.html.haml +4 -2
  154. data/app/views/campaigns/_sidebar_index.html.haml +3 -3
  155. data/app/views/campaigns/_title_bar.html.haml +11 -0
  156. data/app/views/campaigns/_top_section.html.haml +2 -2
  157. data/app/views/campaigns/create.js.rjs +1 -4
  158. data/app/views/campaigns/destroy.js.rjs +1 -1
  159. data/app/views/campaigns/edit.js.rjs +0 -4
  160. data/app/views/campaigns/index.html.haml +6 -13
  161. data/app/views/campaigns/index.js.rjs +3 -1
  162. data/app/views/campaigns/index.xls.builder +75 -0
  163. data/app/views/campaigns/new.js.rjs +0 -4
  164. data/app/views/campaigns/show.html.haml +17 -15
  165. data/app/views/campaigns/show.js.erb +2 -0
  166. data/app/views/campaigns/update.js.rjs +0 -2
  167. data/app/views/comments/_comment.html.haml +6 -5
  168. data/app/views/comments/_edit.html.haml +5 -5
  169. data/app/views/comments/_new.html.haml +6 -5
  170. data/app/views/comments/create.js.rjs +1 -1
  171. data/app/views/contacts/_contact.html.haml +5 -52
  172. data/app/views/contacts/_contacts.html.haml +1 -0
  173. data/app/views/contacts/_edit.html.haml +3 -2
  174. data/app/views/contacts/_index_brief.html.haml +25 -0
  175. data/app/views/contacts/_index_full.html.haml +57 -0
  176. data/app/views/contacts/_index_long.html.haml +43 -0
  177. data/app/views/contacts/_new.html.haml +4 -2
  178. data/app/views/contacts/_section_extra.html.haml +26 -0
  179. data/app/views/contacts/_section_general.html.haml +22 -0
  180. data/app/views/contacts/_sidebar_index.html.haml +0 -3
  181. data/app/views/contacts/_sidebar_show.html.haml +2 -10
  182. data/app/views/contacts/_title_bar.html.haml +11 -0
  183. data/app/views/contacts/_top_section.html.haml +1 -1
  184. data/app/views/contacts/create.js.rjs +1 -2
  185. data/app/views/contacts/destroy.js.rjs +1 -1
  186. data/app/views/contacts/edit.js.rjs +0 -2
  187. data/app/views/contacts/index.html.haml +6 -14
  188. data/app/views/contacts/index.js.rjs +3 -1
  189. data/app/views/contacts/index.xls.builder +102 -0
  190. data/app/views/contacts/new.js.rjs +0 -2
  191. data/app/views/contacts/show.html.haml +15 -15
  192. data/app/views/contacts/show.js.erb +2 -0
  193. data/app/views/entities/_basic_search.html.haml +22 -0
  194. data/app/views/entities/_permissions.html.haml +41 -0
  195. data/app/views/entities/_search.html.haml +15 -0
  196. data/app/views/entities/_section_custom_fields.html.haml +11 -0
  197. data/app/views/entities/_title_bar.html.haml +12 -0
  198. data/app/views/entities/attach.js.rjs +1 -1
  199. data/app/views/entities/opportunities.js.rjs +1 -1
  200. data/app/views/entities/versions.js.erb +3 -0
  201. data/app/views/fields/_edit_custom_field_group.html.haml +8 -0
  202. data/app/views/fields/_group.html.haml +11 -20
  203. data/app/views/fields/_group_table.html.haml +13 -0
  204. data/app/views/fields/_group_view.html.haml +7 -0
  205. data/app/views/fields/_groups.html.haml +1 -4
  206. data/app/views/fields/_sidebar_show.html.haml +5 -4
  207. data/app/views/home/_account.html.haml +29 -0
  208. data/app/views/home/_activity.html.haml +16 -6
  209. data/app/views/home/_opportunity.html.haml +41 -0
  210. data/app/views/home/_options.html.haml +1 -1
  211. data/app/views/home/_task.html.haml +46 -0
  212. data/app/views/home/index.html.haml +32 -1
  213. data/app/views/home/index.js.rjs +1 -0
  214. data/app/views/layouts/_header.html.haml +3 -3
  215. data/app/views/layouts/_sidebar.html.haml +1 -3
  216. data/app/views/layouts/_tabbed.html.haml +2 -3
  217. data/app/views/layouts/_tabless.html.haml +1 -1
  218. data/app/views/layouts/admin/_header.html.haml +1 -1
  219. data/app/views/layouts/application.html.haml +7 -8
  220. data/app/views/layouts/header.xls.builder +8 -0
  221. data/app/views/leads/_contact.html.haml +1 -2
  222. data/app/views/leads/_convert.html.haml +1 -2
  223. data/app/views/leads/_convert_permissions.html.haml +21 -11
  224. data/app/views/leads/_edit.html.haml +3 -2
  225. data/app/views/leads/_index_brief.html.haml +41 -0
  226. data/app/views/leads/_index_long.html.haml +62 -0
  227. data/app/views/leads/_lead.html.haml +5 -62
  228. data/app/views/leads/_new.html.haml +4 -2
  229. data/app/views/leads/_opportunity.html.haml +1 -1
  230. data/app/views/leads/_sidebar_index.html.haml +3 -3
  231. data/app/views/leads/_sidebar_show.html.haml +3 -3
  232. data/app/views/leads/_status.html.haml +1 -1
  233. data/app/views/leads/_title_bar.html.haml +16 -0
  234. data/app/views/leads/convert.js.rjs +0 -1
  235. data/app/views/leads/create.js.rjs +1 -2
  236. data/app/views/leads/destroy.js.rjs +1 -1
  237. data/app/views/leads/edit.js.rjs +0 -2
  238. data/app/views/leads/index.html.haml +6 -13
  239. data/app/views/leads/index.js.rjs +3 -1
  240. data/app/views/leads/index.xls.builder +100 -0
  241. data/app/views/leads/new.js.rjs +0 -2
  242. data/app/views/leads/promote.js.rjs +0 -1
  243. data/app/views/leads/show.html.haml +13 -18
  244. data/app/views/leads/show.js.erb +2 -0
  245. data/app/views/{shared/_lists.html.haml → lists/_sidebar.html.haml} +0 -0
  246. data/app/views/lists/create.js.rjs +1 -1
  247. data/app/views/opportunities/_edit.html.haml +3 -2
  248. data/app/views/opportunities/_index_brief.html.haml +29 -0
  249. data/app/views/opportunities/_index_long.html.haml +59 -0
  250. data/app/views/opportunities/_new.html.haml +4 -2
  251. data/app/views/opportunities/_opportunity.html.haml +5 -57
  252. data/app/views/opportunities/_sidebar_index.html.haml +3 -3
  253. data/app/views/opportunities/_sidebar_show.html.haml +2 -2
  254. data/app/views/opportunities/_title_bar.html.haml +11 -0
  255. data/app/views/opportunities/_top_section.html.haml +2 -2
  256. data/app/views/opportunities/create.js.rjs +4 -6
  257. data/app/views/opportunities/destroy.js.rjs +1 -1
  258. data/app/views/opportunities/edit.js.rjs +0 -3
  259. data/app/views/opportunities/index.html.haml +6 -14
  260. data/app/views/opportunities/index.js.rjs +3 -1
  261. data/app/views/opportunities/index.xls.builder +69 -0
  262. data/app/views/opportunities/new.js.rjs +1 -5
  263. data/app/views/opportunities/show.html.haml +14 -14
  264. data/app/views/opportunities/show.js.erb +2 -0
  265. data/app/views/opportunities/update.js.rjs +0 -1
  266. data/app/views/passwords/new.html.haml +1 -1
  267. data/app/views/shared/_add_comment.html.haml +8 -0
  268. data/app/views/shared/_address.html.haml +1 -1
  269. data/app/views/shared/_address_show.html.haml +1 -1
  270. data/app/views/shared/_edit_comment.html.haml +2 -2
  271. data/app/views/shared/_export.html.haml +2 -1
  272. data/app/views/shared/_paginate_with_per_page.html.haml +14 -0
  273. data/app/views/shared/_recently.html.haml +1 -1
  274. data/app/views/shared/_search.html.haml +1 -1
  275. data/app/views/shared/_tags.html.haml +1 -2
  276. data/app/views/shared/_tasks.html.haml +2 -2
  277. data/app/views/tasks/_completed.html.haml +3 -3
  278. data/app/views/tasks/_new.html.haml +1 -1
  279. data/app/views/tasks/_pending.html.haml +2 -3
  280. data/app/views/tasks/_sidebar_index.html.haml +2 -2
  281. data/app/views/tasks/_top_section.html.haml +5 -3
  282. data/app/views/tasks/create.js.rjs +3 -4
  283. data/app/views/tasks/edit.js.rjs +2 -4
  284. data/app/views/tasks/index.html.haml +1 -1
  285. data/app/views/tasks/index.xls.builder +47 -0
  286. data/app/views/tasks/new.js.rjs +0 -2
  287. data/app/views/tasks/update.js.rjs +0 -1
  288. data/app/views/user_mailer/assigned_entity_notification.html.haml +3 -0
  289. data/app/views/users/_user.html.haml +2 -2
  290. data/app/views/users/_user_report.html.haml +6 -0
  291. data/app/views/users/opportunities_overview.html.haml +16 -0
  292. data/app/views/users/show.html.haml +2 -3
  293. data/app/views/users/update.js.rjs +1 -1
  294. data/app/views/versions/_version.html.haml +4 -19
  295. data/app/views/versions/_version_item.html.haml +8 -0
  296. data/app/views/versions/_versions.html.haml +9 -9
  297. data/config/application.rb +10 -2
  298. data/config/deploy.example.rb +47 -0
  299. data/config/environments/development.rb +1 -0
  300. data/config/environments/production.rb +1 -3
  301. data/config/environments/staging.rb +1 -1
  302. data/config/initializers/action_mailer.rb +10 -8
  303. data/config/initializers/custom_fields.rb +21 -0
  304. data/config/initializers/gravatar.rb +7 -0
  305. data/config/initializers/paper_trail.rb +1 -0
  306. data/config/initializers/ransack.rb +15 -0
  307. data/config/initializers/simple_form.rb +1 -2
  308. data/config/initializers/views.rb +42 -0
  309. data/config/locales/cz_fat_free_crm.yml +0 -10
  310. data/config/locales/de_fat_free_crm.yml +23 -21
  311. data/config/locales/en-GB_fat_free_crm.yml +241 -25
  312. data/config/locales/en-US_fat_free_crm.yml +139 -57
  313. data/config/locales/en-US_ransack.yml +92 -0
  314. data/config/locales/es_fat_free_crm.yml +0 -6
  315. data/config/locales/fr-CA_fat_free_crm.yml +0 -6
  316. data/config/locales/fr_fat_free_crm.yml +3 -14
  317. data/config/locales/it_fat_free_crm.yml +0 -11
  318. data/config/locales/ja_fat_free_crm.yml +0 -10
  319. data/config/locales/pl_fat_free_crm.yml +0 -6
  320. data/config/locales/pt-BR_fat_free_crm.yml +0 -6
  321. data/config/locales/ru_fat_free_crm.yml +0 -9
  322. data/config/locales/sv-SE_fat_free_crm.yml +0 -10
  323. data/config/locales/th_fat_free_crm.yml +0 -6
  324. data/config/locales/zh-CN.yml +4 -0
  325. data/config/locales/zh-CN_fat_free_crm.yml +78 -47
  326. data/config/routes.rb +13 -0
  327. data/config/settings.default.yml +20 -20
  328. data/db/demo/addresses.yml +2 -2
  329. data/db/migrate/20100928030598_create_sessions.rb +5 -0
  330. data/db/migrate/20100928030627_acts_as_taggable_on_migration.rb +6 -6
  331. data/db/migrate/20111201030535_add_field_groups_klass_name.rb +2 -1
  332. data/db/migrate/20120406082136_create_groups.rb +19 -0
  333. data/db/migrate/20120510025219_add_not_null_constraints_for_timestamp_columns.rb +21 -0
  334. data/db/migrate/20120528102124_increase_length_of_version_events.rb +9 -0
  335. data/db/migrate/20120801032706_add_pair_id_to_fields.rb +5 -0
  336. data/db/migrate/20121003063155_add_settings_to_custom_fields.rb +5 -0
  337. data/db/migrate/20121221033947_fix_country_mapping.rb +32 -0
  338. data/db/schema.rb +25 -6
  339. data/fat_free_crm.gemspec +16 -13
  340. data/lib/fat_free_crm.rb +2 -0
  341. data/lib/fat_free_crm/comment_extensions.rb +23 -0
  342. data/lib/fat_free_crm/core_ext/array.rb +8 -2
  343. data/lib/fat_free_crm/fields.rb +24 -2
  344. data/lib/fat_free_crm/gem_dependencies.rb +7 -1
  345. data/lib/fat_free_crm/permissions.rb +47 -26
  346. data/lib/fat_free_crm/version.rb +1 -1
  347. data/lib/fat_free_crm/view_factory.rb +95 -0
  348. data/lib/plugins/country_select/lib/country_select.rb +393 -374
  349. data/lib/tasks/{plugins.rake → db/migrate.rake} +1 -1
  350. data/lib/tasks/{schema_upgrade.rake → db/schema.rake} +2 -1
  351. data/lib/tasks/{mail_processing.rake → ffcrm/comment_replies.rake} +2 -21
  352. data/lib/tasks/ffcrm/config.rake +33 -0
  353. data/lib/tasks/{demo.rake → ffcrm/demo.rake} +3 -2
  354. data/lib/tasks/ffcrm/dropbox.rake +42 -0
  355. data/lib/tasks/ffcrm/settings.rake +46 -0
  356. data/lib/tasks/{fat_free_crm.rake → ffcrm/setup.rake} +1 -39
  357. data/lib/tasks/ffcrm/update_data.rake +256 -0
  358. data/{acceptance → spec/acceptance}/acceptance_helper.rb +5 -4
  359. data/{acceptance → spec/acceptance}/accounts_spec.rb +36 -10
  360. data/spec/acceptance/admin/groups_spec.rb +26 -0
  361. data/spec/acceptance/admin/users_spec.rb +34 -0
  362. data/spec/acceptance/campaigns_spec.rb +101 -0
  363. data/spec/acceptance/contacts_spec.rb +101 -0
  364. data/spec/acceptance/dashboard_spec.rb +62 -0
  365. data/spec/acceptance/leads_spec.rb +109 -0
  366. data/spec/acceptance/opportunities_overview_spec.rb +82 -0
  367. data/spec/acceptance/opportunities_spec.rb +103 -0
  368. data/{acceptance → spec/acceptance}/support/browser.rb +0 -0
  369. data/{acceptance → spec/acceptance}/support/headless.rb +0 -0
  370. data/{acceptance → spec/acceptance}/support/helpers.rb +8 -1
  371. data/{acceptance → spec/acceptance}/support/maintain_sessions.rb +0 -0
  372. data/spec/acceptance/support/paths.rb +42 -0
  373. data/spec/acceptance/support/selector_helpers.rb +31 -0
  374. data/spec/acceptance/tasks_spec.rb +85 -0
  375. data/spec/controllers/admin/groups_controller_spec.rb +5 -0
  376. data/spec/controllers/admin/users_controller_spec.rb +2 -3
  377. data/spec/controllers/applications_controller_spec.rb +40 -0
  378. data/spec/controllers/comments_controller_spec.rb +5 -6
  379. data/spec/controllers/emails_controller_spec.rb +1 -2
  380. data/spec/controllers/entities/accounts_controller_spec.rb +65 -81
  381. data/spec/controllers/entities/campaigns_controller_spec.rb +69 -85
  382. data/spec/controllers/entities/contacts_controller_spec.rb +78 -95
  383. data/spec/controllers/entities/leads_controller_spec.rb +105 -127
  384. data/spec/controllers/entities/opportunities_controller_spec.rb +88 -103
  385. data/spec/controllers/entities_controller_spec.rb +39 -0
  386. data/spec/controllers/home_controller_spec.rb +101 -11
  387. data/spec/controllers/tasks_controller_spec.rb +27 -32
  388. data/spec/controllers/users_controller_spec.rb +95 -28
  389. data/spec/factories/account_factories.rb +2 -2
  390. data/spec/factories/opportunity_factories.rb +12 -4
  391. data/spec/factories/task_factories.rb +4 -0
  392. data/spec/factories/user_factories.rb +9 -2
  393. data/spec/helpers/application_helper_spec.rb +15 -1
  394. data/spec/helpers/groups_helper_spec.rb +15 -0
  395. data/spec/helpers/users_helper_spec.rb +26 -4
  396. data/spec/lib/comment_extensions_spec.rb +29 -0
  397. data/spec/lib/core_ext/{string.rb → string_spec.rb} +0 -1
  398. data/spec/lib/fields_spec.rb +104 -0
  399. data/spec/lib/permissions_spec.rb +144 -0
  400. data/spec/lib/view_factory_spec.rb +68 -0
  401. data/spec/mailers/subscription_mailer_spec.rb +18 -4
  402. data/spec/mailers/user_mailer_spec.rb +134 -0
  403. data/spec/models/entities/account_spec.rb +44 -4
  404. data/spec/models/entities/campaign_spec.rb +3 -4
  405. data/spec/models/entities/contact_spec.rb +45 -5
  406. data/spec/models/entities/lead_spec.rb +3 -4
  407. data/spec/models/entities/opportunity_spec.rb +105 -9
  408. data/spec/models/fields/custom_field_date_pair_spec.rb +106 -0
  409. data/spec/models/fields/custom_field_pair_spec.rb +94 -0
  410. data/spec/models/fields/custom_field_spec.rb +43 -23
  411. data/spec/models/fields/field_spec.rb +3 -5
  412. data/spec/models/observers/entity_observer_spec.rb +65 -0
  413. data/spec/models/polymorphic/task_spec.rb +74 -118
  414. data/spec/models/polymorphic/version_spec.rb +18 -18
  415. data/spec/models/users/group_spec.rb +5 -0
  416. data/spec/models/users/permission_spec.rb +18 -1
  417. data/spec/models/users/preference_spec.rb +5 -1
  418. data/spec/models/users/user_spec.rb +55 -8
  419. data/spec/shared/models.rb +54 -0
  420. data/spec/spec_helper.rb +82 -87
  421. data/spec/support/auth_macros.rb +2 -3
  422. data/spec/views/accounts/_edit.haml_spec.rb +1 -2
  423. data/spec/views/accounts/_new.haml_spec.rb +1 -2
  424. data/spec/views/accounts/create.rjs_spec.rb +1 -3
  425. data/spec/views/accounts/edit.rjs_spec.rb +3 -4
  426. data/spec/views/accounts/index.haml_spec.rb +9 -6
  427. data/spec/views/accounts/new.rjs_spec.rb +2 -9
  428. data/spec/views/accounts/show.haml_spec.rb +1 -2
  429. data/spec/views/accounts/update.rjs_spec.rb +2 -3
  430. data/spec/views/admin/users/_create.haml_spec.rb +1 -2
  431. data/spec/views/admin/users/create.rjs_spec.rb +1 -2
  432. data/spec/views/campaigns/_edit.haml_spec.rb +2 -3
  433. data/spec/views/campaigns/_new.haml_spec.rb +2 -3
  434. data/spec/views/campaigns/create.rjs_spec.rb +0 -3
  435. data/spec/views/campaigns/destroy.rjs_spec.rb +1 -2
  436. data/spec/views/campaigns/edit.rjs_spec.rb +3 -6
  437. data/spec/views/campaigns/index.haml_spec.rb +6 -3
  438. data/spec/views/campaigns/new.rjs_spec.rb +2 -13
  439. data/spec/views/campaigns/show.haml_spec.rb +4 -6
  440. data/spec/views/campaigns/update.rjs_spec.rb +2 -7
  441. data/spec/views/contacts/_edit.haml_spec.rb +6 -7
  442. data/spec/views/contacts/_new.haml_spec.rb +2 -3
  443. data/spec/views/contacts/create.rjs_spec.rb +1 -3
  444. data/spec/views/contacts/edit.rjs_spec.rb +3 -4
  445. data/spec/views/contacts/index.haml_spec.rb +6 -3
  446. data/spec/views/contacts/new.rjs_spec.rb +2 -11
  447. data/spec/views/contacts/show.haml_spec.rb +1 -2
  448. data/spec/views/contacts/update.rjs_spec.rb +2 -3
  449. data/spec/views/home/index.haml_spec.rb +6 -2
  450. data/spec/views/home/index.rjs_spec.rb +1 -2
  451. data/spec/views/home/options.rjs_spec.rb +1 -2
  452. data/spec/views/leads/_convert.haml_spec.rb +1 -2
  453. data/spec/views/leads/_edit.haml_spec.rb +2 -3
  454. data/spec/views/leads/_new.haml_spec.rb +2 -3
  455. data/spec/views/leads/_sidebar_show.haml_spec.rb +1 -2
  456. data/spec/views/leads/convert.rjs_spec.rb +3 -5
  457. data/spec/views/leads/edit.rjs_spec.rb +4 -5
  458. data/spec/views/leads/index.haml_spec.rb +6 -3
  459. data/spec/views/leads/new.rjs_spec.rb +2 -11
  460. data/spec/views/leads/promote.rjs_spec.rb +3 -5
  461. data/spec/views/leads/show.haml_spec.rb +1 -2
  462. data/spec/views/leads/update.rjs_spec.rb +2 -3
  463. data/spec/views/opportunities/_edit.haml_spec.rb +5 -6
  464. data/spec/views/opportunities/_new.haml_spec.rb +2 -4
  465. data/spec/views/opportunities/create.rjs_spec.rb +0 -2
  466. data/spec/views/opportunities/edit.rjs_spec.rb +3 -4
  467. data/spec/views/opportunities/index.haml_spec.rb +7 -4
  468. data/spec/views/opportunities/new.rjs_spec.rb +2 -12
  469. data/spec/views/opportunities/show.haml_spec.rb +1 -2
  470. data/spec/views/opportunities/update.rjs_spec.rb +2 -3
  471. data/spec/views/tasks/_edit.haml_spec.rb +1 -3
  472. data/spec/views/tasks/complete.rjs_spec.rb +2 -3
  473. data/spec/views/tasks/create.rjs_spec.rb +2 -2
  474. data/spec/views/tasks/edit.rjs_spec.rb +1 -2
  475. data/spec/views/tasks/new.rjs_spec.rb +1 -18
  476. data/spec/views/users/avatar.rjs_spec.rb +1 -2
  477. data/spec/views/users/change_password.rjs_spec.rb +1 -2
  478. data/spec/views/users/edit.rjs_spec.rb +1 -2
  479. data/spec/views/users/password.rjs_spec.rb +1 -1
  480. data/spec/views/users/update.rjs_spec.rb +1 -2
  481. data/spec/views/users/upload_avatar.rjs_spec.rb +6 -7
  482. data/vendor/assets/images/brief.png +0 -0
  483. data/vendor/assets/images/chosen-sprite.png +0 -0
  484. data/vendor/assets/images/full.png +0 -0
  485. data/vendor/assets/images/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  486. data/vendor/assets/images/jquery-ui/ui-bg_flat_0_eeeeee_40x100.png +0 -0
  487. data/vendor/assets/images/jquery-ui/ui-bg_flat_100_ffffff_40x100.png +0 -0
  488. data/vendor/assets/images/jquery-ui/ui-bg_flat_25_3875d7_40x100.png +0 -0
  489. data/vendor/assets/images/jquery-ui/ui-bg_flat_55_ffffff_40x100.png +0 -0
  490. data/vendor/assets/images/jquery-ui/ui-bg_flat_65_3875d7_40x100.png +0 -0
  491. data/vendor/assets/images/jquery-ui/ui-bg_flat_75_ffffff_40x100.png +0 -0
  492. data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
  493. data/vendor/assets/images/jquery-ui/{ui-icons_ef8c08_256x240.png → ui-icons_0073ea_256x240.png} +0 -0
  494. data/vendor/assets/images/jquery-ui/ui-icons_466bb1_256x240.png +0 -0
  495. data/vendor/assets/images/jquery-ui/{ui-icons_ffd27a_256x240.png → ui-icons_ff0084_256x240.png} +0 -0
  496. data/vendor/assets/images/long.png +0 -0
  497. data/vendor/assets/javascripts/chosen-jquery.js +3 -0
  498. data/vendor/assets/javascripts/chosen-prototype.js +3 -0
  499. data/vendor/assets/javascripts/chosen.jquery.coffee +574 -0
  500. data/vendor/assets/javascripts/chosen.proto.coffee +580 -0
  501. data/vendor/assets/javascripts/jquery.disable.js +23 -0
  502. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-addon.js +1882 -0
  503. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-af.js +20 -0
  504. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ca.js +20 -0
  505. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-cz.js +20 -0
  506. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-de.js +20 -0
  507. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-el.js +20 -0
  508. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-es.js +20 -0
  509. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-et.js +20 -0
  510. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-fi.js +20 -0
  511. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-fr-CA.js +20 -0
  512. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-fr.js +20 -0
  513. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-gl.js +20 -0
  514. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-he.js +20 -0
  515. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-hu.js +20 -0
  516. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-id.js +20 -0
  517. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-it.js +20 -0
  518. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ja.js +20 -0
  519. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ko.js +20 -0
  520. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-lt.js +20 -0
  521. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-nl.js +20 -0
  522. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-no.js +20 -0
  523. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-pl.js +20 -0
  524. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-pt.js +20 -0
  525. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ro.js +20 -0
  526. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ru.js +20 -0
  527. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-sk.js +20 -0
  528. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-sv.js +20 -0
  529. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-tr.js +20 -0
  530. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-vi.js +20 -0
  531. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-zh-CN.js +20 -0
  532. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-zh-TW.js +20 -0
  533. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-cz.js +23 -0
  534. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-de.js +23 -0
  535. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-en-GB.js +23 -0
  536. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-es.js +23 -0
  537. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-fr.js +23 -0
  538. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-it.js +23 -0
  539. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-ja.js +23 -0
  540. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-pl.js +23 -0
  541. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-pt-BR.js +23 -0
  542. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-ru.js +23 -0
  543. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-sv-SE.js +23 -0
  544. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-th.js +23 -0
  545. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-zh-CN.js +23 -0
  546. data/vendor/assets/javascripts/lib/abstract-chosen.coffee +110 -0
  547. data/vendor/assets/javascripts/lib/select-parser.coffee +51 -0
  548. data/vendor/assets/stylesheets/chosen.css.sass +361 -0
  549. data/vendor/assets/stylesheets/{jquery-ui.custom.css.erb → jquery-ui.custom.css} +70 -70
  550. data/zeus.json +21 -0
  551. metadata +304 -140
  552. data/acceptance/support/database_cleaner.rb +0 -16
  553. data/acceptance/support/paths.rb +0 -9
  554. data/app/views/accounts/_options.html.haml +0 -20
  555. data/app/views/accounts/_permissions.html.haml +0 -24
  556. data/app/views/accounts/options.js.rjs +0 -10
  557. data/app/views/admin/fields/_edit.html.haml +0 -9
  558. data/app/views/admin/fields/_new.html.haml +0 -10
  559. data/app/views/admin/fields/_options.html.haml +0 -12
  560. data/app/views/admin/fields/_top_section.html.haml +0 -54
  561. data/app/views/admin/fields/create.js.rjs +0 -16
  562. data/app/views/admin/fields/edit.js.rjs +0 -35
  563. data/app/views/admin/fields/index.js.rjs +0 -6
  564. data/app/views/admin/fields/new.js.rjs +0 -8
  565. data/app/views/admin/fields/options.js.rjs +0 -10
  566. data/app/views/admin/fields/update.js.rjs +0 -17
  567. data/app/views/campaigns/_options.html.haml +0 -20
  568. data/app/views/campaigns/_permissions.html.haml +0 -24
  569. data/app/views/campaigns/options.js.rjs +0 -10
  570. data/app/views/contacts/_options.html.haml +0 -21
  571. data/app/views/contacts/_permissions.html.haml +0 -24
  572. data/app/views/contacts/options.js.rjs +0 -10
  573. data/app/views/entities/_advanced_search.html.haml +0 -12
  574. data/app/views/entities/_condition_fields.html.haml +0 -14
  575. data/app/views/entities/_grouping_fields.html.haml +0 -12
  576. data/app/views/entities/advanced_search.js.rjs +0 -9
  577. data/app/views/entities/versions.js.rjs +0 -3
  578. data/app/views/leads/_options.html.haml +0 -21
  579. data/app/views/leads/_permissions.html.haml +0 -28
  580. data/app/views/leads/options.js.rjs +0 -10
  581. data/app/views/opportunities/_options.html.haml +0 -20
  582. data/app/views/opportunities/_permissions.html.haml +0 -24
  583. data/app/views/opportunities/options.js.rjs +0 -10
  584. data/app/views/shared/_outline.html.haml +0 -9
  585. data/app/views/shared/_per_page.html.haml +0 -10
  586. data/app/views/shared/_sort_by.html.haml +0 -10
  587. data/config/initializers/cancan.rb +0 -151
  588. data/config/initializers/squeel.rb +0 -5
  589. data/public/blank_iframe.html +0 -2
  590. data/spec/views/accounts/options.rjs_spec.rb +0 -59
  591. data/spec/views/campaigns/options.rjs_spec.rb +0 -60
  592. data/spec/views/contacts/options.rjs_spec.rb +0 -61
  593. data/spec/views/leads/options.rjs_spec.rb +0 -61
  594. data/spec/views/opportunities/options.rjs_spec.rb +0 -60
  595. data/vendor/assets/images/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  596. data/vendor/assets/images/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  597. data/vendor/assets/images/jquery-ui/ui-bg_flat_10_000000_40x100.png +0 -0
  598. data/vendor/assets/images/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  599. data/vendor/assets/images/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  600. data/vendor/assets/images/jquery-ui/ui-bg_glass_65_ffffff_1x400.png +0 -0
  601. data/vendor/assets/images/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  602. data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  603. data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  604. data/vendor/assets/images/jquery-ui/ui-icons_222222_256x240.png +0 -0
  605. data/vendor/assets/images/jquery-ui/ui-icons_228ef1_256x240.png +0 -0
  606. data/vendor/assets/javascripts/calendar_date_select/calendar_date_select.js +0 -446
  607. data/vendor/assets/javascripts/calendar_date_select/format_american.js +0 -35
  608. data/vendor/assets/javascripts/calendar_date_select/format_danish.js +0 -31
  609. data/vendor/assets/javascripts/calendar_date_select/format_db.js +0 -27
  610. data/vendor/assets/javascripts/calendar_date_select/format_euro_24hr.js +0 -7
  611. data/vendor/assets/javascripts/calendar_date_select/format_euro_24hr_ymd.js +0 -7
  612. data/vendor/assets/javascripts/calendar_date_select/format_finnish.js +0 -32
  613. data/vendor/assets/javascripts/calendar_date_select/format_french.js +0 -24
  614. data/vendor/assets/javascripts/calendar_date_select/format_hyphen_ampm.js +0 -37
  615. data/vendor/assets/javascripts/calendar_date_select/format_iso_date.js +0 -29
  616. data/vendor/assets/javascripts/calendar_date_select/format_italian.js +0 -24
  617. data/vendor/assets/javascripts/calendar_date_select/locale/ar.js +0 -10
  618. data/vendor/assets/javascripts/calendar_date_select/locale/da.js +0 -11
  619. data/vendor/assets/javascripts/calendar_date_select/locale/de.js +0 -11
  620. data/vendor/assets/javascripts/calendar_date_select/locale/es.js +0 -11
  621. data/vendor/assets/javascripts/calendar_date_select/locale/fi.js +0 -10
  622. data/vendor/assets/javascripts/calendar_date_select/locale/fr.js +0 -11
  623. data/vendor/assets/javascripts/calendar_date_select/locale/it.js +0 -9
  624. data/vendor/assets/javascripts/calendar_date_select/locale/ja.js +0 -11
  625. data/vendor/assets/javascripts/calendar_date_select/locale/nl.js +0 -11
  626. data/vendor/assets/javascripts/calendar_date_select/locale/pl.js +0 -11
  627. data/vendor/assets/javascripts/calendar_date_select/locale/pt.js +0 -11
  628. data/vendor/assets/javascripts/calendar_date_select/locale/ru.js +0 -10
  629. data/vendor/assets/javascripts/calendar_date_select/locale/sl.js +0 -11
  630. data/vendor/assets/javascripts/calendar_date_select/locale/sv.js +0 -9
  631. data/vendor/assets/stylesheets/calendar_date_select/blue.css +0 -130
  632. data/vendor/assets/stylesheets/calendar_date_select/default.css +0 -135
  633. data/vendor/assets/stylesheets/calendar_date_select/green.css +0 -142
  634. data/vendor/assets/stylesheets/calendar_date_select/plain.css +0 -128
  635. data/vendor/assets/stylesheets/calendar_date_select/red.css +0 -135
  636. data/vendor/assets/stylesheets/calendar_date_select/silver.css +0 -133
  637. data/vendor/plugins/.gitkeep~master +0 -0
@@ -1,7 +1,8 @@
1
- require File.expand_path("../../spec/spec_helper.rb", __FILE__)
2
-
3
- require 'steak'
4
- require 'capybara/rails'
1
+ require 'spec_helper'
5
2
 
6
3
  # Put your acceptance spec helpers inside /spec/acceptance/support
7
4
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
5
+
6
+ RSpec.configuration.before(:each, :type => :request) do
7
+ PaperTrail.enabled = true
8
+ end
@@ -7,46 +7,74 @@ feature 'Accounts', %q{
7
7
  } do
8
8
 
9
9
  before(:each) do
10
- do_login_if_not_already
10
+ do_login_if_not_already(:first_name => 'Bill', :last_name => 'Murray')
11
11
  end
12
12
 
13
13
  scenario 'should view a list of accounts' do
14
14
  2.times { |i| FactoryGirl.create(:account, :name => "Account #{i}") }
15
- visit accounts_path
15
+ visit accounts_page
16
16
  page.should have_content('Account 0')
17
17
  page.should have_content('Account 1')
18
- page.should have_content('Search accounts')
19
18
  page.should have_content('Create Account')
20
19
  end
21
20
 
22
21
  scenario 'should create a new account', :js => true do
23
- visit accounts_path
22
+ visit accounts_page
24
23
  page.should have_content('Create Account')
25
24
  click_link 'Create Account'
25
+ page.should have_selector('#account_name', :visible => true)
26
26
  fill_in 'account_name', :with => 'My new account'
27
- click_link("Contact Information")
27
+ click_link 'Contact Information'
28
28
  fill_in 'account_phone', :with => '+1 2345 6789'
29
29
  fill_in 'account_website', :with => 'http://www.example.com'
30
+ click_link 'Comment'
31
+ fill_in 'comment_body', :with => 'This account is very important'
30
32
  click_button 'Create Account'
33
+
31
34
  page.should have_content('My new account')
35
+ click_link 'My new account'
32
36
  page.should have_content('+1 2345 6789')
33
37
  page.should have_content('http://www.example.com')
38
+ page.should have_content('This account is very important')
39
+
40
+ click_link "Dashboard"
41
+ page.should have_content("Bill Murray created account My new account")
42
+ page.should have_content("Bill Murray created comment on My new account")
43
+ end
44
+
45
+ scenario "remembers the comment field when the creation was unsuccessful", :js => true do
46
+ visit accounts_page
47
+ page.should have_content('Create Account')
48
+ click_link 'Create Account'
49
+
50
+ click_link 'Contact Information'
51
+ fill_in 'account_phone', :with => '+1 2345 6789'
52
+
53
+ click_link 'Comment'
54
+ fill_in 'comment_body', :with => 'This account is very important'
55
+ click_button "Create Account"
56
+
57
+ page.should have_field("account_phone", :with => '+1 2345 6789')
58
+ page.should have_field("comment_body", :with => 'This account is very important')
34
59
  end
35
60
 
36
61
  scenario 'should view and edit an account', :js => true do
37
62
  FactoryGirl.create(:account, :name => "A new account")
38
- visit accounts_path
63
+ visit accounts_page
39
64
  click_link 'A new account'
40
65
  page.should have_content('A new account')
41
66
  click_link 'Edit'
42
67
  fill_in 'account_name', :with => 'A new account *editted*'
43
68
  click_button 'Save Account'
44
69
  page.should have_content('A new account *editted*')
70
+
71
+ click_link "Dashboard"
72
+ page.should have_content("Bill Murray updated account A new account *editted*")
45
73
  end
46
74
 
47
75
  scenario 'should delete an account', :js => true do
48
76
  FactoryGirl.create(:account, :name => "My new account")
49
- visit accounts_path
77
+ visit accounts_page
50
78
  click_link 'My new account'
51
79
  click_link 'Delete?'
52
80
  page.should have_content('Are you sure you want to delete this account?')
@@ -56,7 +84,7 @@ feature 'Accounts', %q{
56
84
 
57
85
  scenario 'should search for an account', :js => true do
58
86
  2.times { |i| FactoryGirl.create(:account, :name => "Account #{i}") }
59
- visit accounts_path
87
+ visit accounts_page
60
88
  find('#accounts').should have_content("Account 0")
61
89
  find('#accounts').should have_content("Account 1")
62
90
  fill_in 'query', :with => "Account 0"
@@ -68,7 +96,5 @@ feature 'Accounts', %q{
68
96
  find('#accounts').has_selector?('li', :count => 2)
69
97
  fill_in 'query', :with => "Contact"
70
98
  find('#accounts').has_selector?('li', :count => 0)
71
-
72
99
  end
73
-
74
100
  end
@@ -0,0 +1,26 @@
1
+ require File.expand_path("../../acceptance_helper.rb", __FILE__)
2
+
3
+ feature 'Groups tab', %q{
4
+ In order to increase customer satisfaction
5
+ As an administrator
6
+ I want to manage groups
7
+ } do
8
+
9
+ before(:each) do
10
+ do_login(:first_name => 'Captain', :last_name => 'Kirk', :admin => true)
11
+ end
12
+
13
+ scenario 'should create a new group', :js => true do
14
+ FactoryGirl.create(:user, :first_name => "Mr", :last_name => "Spock")
15
+ visit admin_groups_path
16
+ page.should have_content("Couldn't find any Groups.")
17
+ click_link 'create a new group'
18
+ page.should have_selector('#group_name', :visible => true)
19
+ fill_in 'group_name', :with => 'The Enterprise Bridge'
20
+ chosen_select('Mr Spock', :from => 'group_user_ids')
21
+ click_button 'Create Group'
22
+ page.should have_content('The Enterprise Bridge')
23
+ page.should have_content('members: Mr Spock')
24
+ end
25
+
26
+ end
@@ -0,0 +1,34 @@
1
+ require File.expand_path("../../acceptance_helper.rb", __FILE__)
2
+
3
+ feature 'Users tab', %q{
4
+ In order to increase customer satisfaction
5
+ As an administrator
6
+ I want to manage users
7
+ } do
8
+
9
+ before(:each) do
10
+ do_login(:first_name => 'Captain', :last_name => 'Kirk', :admin => true)
11
+ end
12
+
13
+ scenario 'should create a new user', :js => true do
14
+ FactoryGirl.create(:group, :name => "Superheroes")
15
+ visit admin_users_path
16
+ click_link 'Create User'
17
+ page.should have_selector('#user_username', :visible => true)
18
+ fill_in 'user_username', :with => 'captainthunder'
19
+ fill_in 'user_email', :with => 'lightning@example.com'
20
+ fill_in 'user_first_name', :with => 'Captain'
21
+ fill_in 'user_last_name', :with => 'Thunder'
22
+ fill_in 'user_title', :with => 'Chief'
23
+ fill_in 'user_company', :with => 'Weather Inc.'
24
+ chosen_select('Superheroes', :from => 'user_group_ids')
25
+
26
+ click_button 'Create User'
27
+ page.should have_content('Captain Thunder')
28
+ page.should have_content('Weather Inc.')
29
+ page.should have_content('Superheroes')
30
+ page.should have_content('lightning@example.com')
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,101 @@
1
+ require File.expand_path("../acceptance_helper.rb", __FILE__)
2
+
3
+ feature 'Campaigns', %q{
4
+ In order to increase customer satisfaction
5
+ As a user
6
+ I want to manage campaigns
7
+ } do
8
+
9
+ before :each do
10
+ do_login_if_not_already(:first_name => 'Bill', :last_name => 'Murray')
11
+ end
12
+
13
+ scenario 'should view a list of campaigns' do
14
+ 3.times { |i| FactoryGirl.create(:campaign, :name => "Campaign #{i}") }
15
+ visit campaigns_page
16
+ page.should have_content('Campaign 0')
17
+ page.should have_content('Campaign 1')
18
+ page.should have_content('Campaign 2')
19
+ page.should have_content('Create Campaign')
20
+ end
21
+
22
+ scenario 'should create a campaign', :js => true do
23
+ visit campaigns_page
24
+ click_link 'Create Campaign'
25
+ page.should have_selector('#campaign_name', :visible => true)
26
+ fill_in 'campaign_name', :with => 'Cool Campaign'
27
+ select 'On Hold', :from => 'campaign_status'
28
+ click_link 'Comment'
29
+ fill_in 'comment_body', :with => 'This campaign is very important'
30
+ click_button 'Create Campaign'
31
+
32
+ page.should have_content('Cool Campaign')
33
+ page.should have_content('On Hold')
34
+
35
+ click_link 'Cool Campaign'
36
+ page.should have_content('This campaign is very important')
37
+
38
+ click_link "Dashboard"
39
+ page.should have_content("Bill Murray created campaign Cool Campaign")
40
+ page.should have_content("Bill Murray created comment on Cool Campaign")
41
+ end
42
+
43
+ scenario "remembers the comment field when the creation was unsuccessful", :js => true do
44
+ visit campaigns_page
45
+ click_link 'Create Campaign'
46
+
47
+ click_link 'Comment'
48
+ fill_in 'comment_body', :with => 'This campaign is very important'
49
+ click_button 'Create Campaign'
50
+
51
+ page.should have_field("comment_body", :with => 'This campaign is very important')
52
+ end
53
+
54
+ scenario 'should view and edit a campaign', :js => true do
55
+ FactoryGirl.create(:campaign, :name => "My Cool Campaign")
56
+ visit campaigns_page
57
+ click_link 'My Cool Campaign'
58
+ click_link 'Edit'
59
+ fill_in 'campaign_name', :with => 'My Even Cooler Campaign'
60
+ select 'Started', :from => 'campaign_status'
61
+ click_button 'Save Campaign'
62
+ page.should have_content('My Even Cooler Campaign')
63
+ click_link 'Campaigns'
64
+ page.should have_content('My Even Cooler Campaign')
65
+
66
+ click_link 'Dashboard'
67
+ page.should have_content("Bill Murray updated campaign My Even Cooler Campaign")
68
+ end
69
+
70
+ scenario 'should delete a campaign', :js => true do
71
+ FactoryGirl.create(:campaign, :name => "Old Campaign")
72
+ visit campaigns_page
73
+ click_link 'Old Campaign'
74
+ click_link 'Delete?'
75
+ page.should have_content('Are you sure you want to delete this campaign?')
76
+ click_link 'Yes'
77
+ page.should have_content('Old Campaign has been deleted.')
78
+ click_link 'Campaigns'
79
+ page.should_not have_content('Old Campaign')
80
+ end
81
+
82
+ scenario 'should search for a campaign', :js => true do
83
+ 4.times { |i| FactoryGirl.create(:campaign, :name => "Campaign #{i}") }
84
+ visit campaigns_page
85
+ find('#campaigns').should have_content("Campaign 0")
86
+ find('#campaigns').should have_content("Campaign 1")
87
+ find('#campaigns').should have_content("Campaign 2")
88
+ find('#campaigns').should have_content("Campaign 3")
89
+ fill_in 'query', :with => "Campaign 0"
90
+ find('#campaigns').should have_content("Campaign 0")
91
+ find('#campaigns').has_selector?('li', :count => 1)
92
+ fill_in 'query', :with => "Campaign"
93
+ find('#campaigns').should have_content("Campaign 0")
94
+ find('#campaigns').should have_content("Campaign 1")
95
+ find('#campaigns').should have_content("Campaign 2")
96
+ find('#campaigns').should have_content("Campaign 3")
97
+ find('#campaigns').has_selector?('li', :count => 4)
98
+ fill_in 'query', :with => "False campaign"
99
+ find('#campaigns').has_selector?('li', :count => 0)
100
+ end
101
+ end
@@ -0,0 +1,101 @@
1
+ require File.expand_path("../acceptance_helper.rb", __FILE__)
2
+
3
+ feature 'Contacts', %q{
4
+ In order to increase customer satisfaction
5
+ As a user
6
+ I want to manage contacts
7
+ } do
8
+
9
+ before :each do
10
+ do_login_if_not_already(:first_name => "Bill", :last_name => "Murray")
11
+ end
12
+
13
+ scenario 'should view a list of contacts' do
14
+ 4.times { |i| FactoryGirl.create(:contact, :first_name => "Test", :last_name => "Subject \##{i}") }
15
+ visit contacts_page
16
+ page.should have_content('Test Subject #0')
17
+ page.should have_content('Test Subject #1')
18
+ page.should have_content('Test Subject #2')
19
+ page.should have_content('Test Subject #3')
20
+ page.should have_content('Create Contact')
21
+ end
22
+
23
+ scenario 'should create a contact', :js => true do
24
+ visit contacts_page
25
+ click_link 'Create Contact'
26
+ page.should have_selector('#contact_first_name', :visible => true)
27
+ fill_in 'contact_first_name', :with => 'Testy'
28
+ fill_in 'contact_last_name', :with => 'McTest'
29
+ fill_in 'contact_email', :with => "testy.mctest@example.com"
30
+ fill_in 'contact_phone', :with => '+44 1234 567890'
31
+ click_link 'Comment'
32
+ fill_in 'comment_body', :with => 'This is a very important person.'
33
+ click_button 'Create Contact'
34
+ page.should have_content('Testy McTest')
35
+
36
+ click_link 'Testy McTest'
37
+ page.should have_content('This is a very important person.')
38
+
39
+ click_link "Dashboard"
40
+ page.should have_content('Bill Murray created contact Testy McTest')
41
+ page.should have_content('Bill Murray created comment on Testy McTest')
42
+ end
43
+
44
+ scenario "remembers the comment field when the creation was unsuccessful", :js => true do
45
+ visit contacts_page
46
+ click_link 'Create Contact'
47
+
48
+ click_link 'Comment'
49
+ fill_in 'comment_body', :with => 'This is a very important person.'
50
+ click_button 'Create Contact'
51
+
52
+ page.should have_field("comment_body", :with => 'This is a very important person.')
53
+ end
54
+
55
+ scenario 'should view and edit a contact', :js => true do
56
+ FactoryGirl.create(:contact, :first_name => "Testy", :last_name => "McTest")
57
+ visit contacts_page
58
+ click_link 'Testy McTest'
59
+ click_link 'Edit'
60
+ fill_in 'contact_first_name', :with => 'Test'
61
+ fill_in 'contact_last_name', :with => 'Subject'
62
+ fill_in 'contact_email', :with => "test.subject@example.com"
63
+ click_button 'Save Contact'
64
+ page.should have_content('Test Subject')
65
+ click_link 'Contacts'
66
+ page.should have_content('Test Subject')
67
+
68
+ click_link 'Dashboard'
69
+ page.should have_content("Bill Murray updated contact Test Subject")
70
+ end
71
+
72
+ scenario 'should delete a contact', :js => true do
73
+ FactoryGirl.create(:contact, :first_name => "Test", :last_name => "Subject")
74
+ visit contacts_page
75
+ click_link 'Test Subject'
76
+ click_link 'Delete?'
77
+ page.should have_content('Are you sure you want to delete this contact?')
78
+ click_link 'Yes'
79
+ page.should have_content('Test Subject has been deleted.')
80
+ click_link('Contacts')
81
+ page.should_not have_content('Test Subject')
82
+ end
83
+
84
+ scenario 'should search for a contact', :js => true do
85
+ 3.times { |i| FactoryGirl.create(:contact, :first_name => "Test", :last_name => "Subject \##{i}") }
86
+ visit contacts_page
87
+ find('#contacts').should have_content('Test Subject #0')
88
+ find('#contacts').should have_content('Test Subject #1')
89
+ find('#contacts').should have_content('Test Subject #2')
90
+ fill_in 'query', :with => 'Test Subject #2'
91
+ find('#contacts').should have_content('Test Subject #2')
92
+ find('#contacts').has_selector?('li', :count => 1)
93
+ fill_in 'query', :with => 'Test Subject'
94
+ find('#contacts').should have_content('Test Subject #0')
95
+ find('#contacts').should have_content('Test Subject #1')
96
+ find('#contacts').should have_content('Test Subject #2')
97
+ find('#contacts').has_selector?('li', :count => 3)
98
+ fill_in 'query', :with => "Fake contact"
99
+ find('#contacts').has_selector?('li', :count => 0)
100
+ end
101
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path("../acceptance_helper.rb", __FILE__)
2
+
3
+ feature 'Dashboard', %q{
4
+ In order to monitor activity
5
+ As a user
6
+ I want to see a dashboard
7
+ } do
8
+
9
+ background do
10
+ @me = FactoryGirl.create(:user)
11
+ login_as_user(@me)
12
+
13
+ FactoryGirl.create(:task, :name => 'Do your homework!', :assignee => @me)
14
+ FactoryGirl.create(:opportunity, :name => 'Work with the Dolphins', :assignee => @me, :stage => 'proposal')
15
+ FactoryGirl.create(:account, :name => 'Dolphin Manufacturer', :assignee => @me)
16
+ end
17
+
18
+ scenario "Viewing my dashboard" do
19
+ visit homepage
20
+
21
+ #My Tasks
22
+ within "#tasks" do
23
+ page.should have_content("Do your homework!")
24
+ end
25
+
26
+ #My Opportunities
27
+ within "#opportunities" do
28
+ page.should have_content("Work with the Dolphins")
29
+ end
30
+
31
+ #My Accounts
32
+ within "#accounts" do
33
+ page.should have_content("Dolphin Manufacturer")
34
+ end
35
+ end
36
+
37
+ scenario "Only show a maximum of 10 entities" do
38
+ 10.times do
39
+ FactoryGirl.create(:task, :assignee => @me)
40
+ FactoryGirl.create(:opportunity, :assignee => @me, :stage => 'proposal')
41
+ FactoryGirl.create(:account, :assignee => @me)
42
+ end
43
+
44
+ visit homepage
45
+
46
+ #My Tasks
47
+ within "#tasks" do
48
+ page.should have_content("Not showing 1 hidden task.")
49
+ end
50
+
51
+ #My Opportunities
52
+ within "#opportunities" do
53
+ page.should have_content("Not showing 1 hidden opportunity.")
54
+ end
55
+
56
+ #My Accounts
57
+ within "#accounts" do
58
+ page.should have_content("Not showing 1 hidden account.")
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,109 @@
1
+ require File.expand_path("../acceptance_helper.rb", __FILE__)
2
+
3
+ feature 'Leads', %q{
4
+ In order to increase sales
5
+ As a user
6
+ I want to manage leads
7
+ } do
8
+
9
+ before(:each) do
10
+ do_login_if_not_already(:first_name => 'Bill', :last_name => 'Murray')
11
+ end
12
+
13
+ scenario 'should view a list of leads' do
14
+ 4.times { |i| FactoryGirl.create(:lead, :first_name => "L", :last_name => "Ead #{i}") }
15
+ visit leads_page
16
+ page.should have_content('L Ead 0')
17
+ page.should have_content('L Ead 1')
18
+ page.should have_content('L Ead 2')
19
+ page.should have_content('L Ead 3')
20
+ page.should have_content('Create Lead')
21
+ end
22
+
23
+ scenario 'should create a new lead', :js => true do
24
+ visit leads_page
25
+ click_link 'Create Lead'
26
+ page.should have_selector('#lead_first_name', :visible => true)
27
+ fill_in 'lead_first_name', :with => 'Mr'
28
+ fill_in 'lead_last_name', :with => 'Lead'
29
+ fill_in 'lead_email', :with => 'mr_lead@example.com'
30
+ fill_in 'lead_phone', :with => '+44 1234 567890'
31
+ click_link 'Comment'
32
+ fill_in 'comment_body', :with => 'This is an important lead.'
33
+ click_link('Status')
34
+ select 'Contacted', :from => 'lead_status'
35
+ click_button 'Create Lead'
36
+ page.should have_content('Mr Lead')
37
+
38
+ click_link 'Mr Lead'
39
+ page.should have_content('Contacted')
40
+ page.should have_content('mr_lead@example.com')
41
+ page.should have_content('+44 1234 567890')
42
+ page.should have_content('This is an important lead.')
43
+
44
+ click_link "Dashboard"
45
+ page.should have_content("Bill Murray created lead Mr Lead")
46
+ page.should have_content("Bill Murray created comment on Mr Lead")
47
+ end
48
+
49
+ scenario "remembers the comment field when the creation was unsuccessful", :js => true do
50
+ visit leads_page
51
+ click_link 'Create Lead'
52
+
53
+ click_link 'Comment'
54
+ fill_in 'comment_body', :with => 'This is an important lead.'
55
+ click_button 'Create Lead'
56
+
57
+ page.should have_field('comment_body', :with => 'This is an important lead.')
58
+ end
59
+
60
+ scenario 'should view and edit a lead', :js => true do
61
+ FactoryGirl.create(:lead, :first_name => "Mr", :last_name => "Lead", :email => "mr_lead@example.com")
62
+ visit leads_page
63
+ click_link 'Mr Lead'
64
+ page.should have_content('Mr Lead')
65
+ click_link('Edit')
66
+ fill_in 'lead_first_name', :with => 'Mrs'
67
+ fill_in 'lead_phone', :with => '+44 0987 654321'
68
+ click_link('Status')
69
+ select 'Rejected', :from => 'lead_status'
70
+ click_button 'Save Lead'
71
+ page.should have_content('Mrs Lead')
72
+ click_link 'Leads'
73
+ page.should have_content('Mrs Lead')
74
+
75
+ click_link "Dashboard"
76
+ page.should have_content("Bill Murray updated lead Mrs Lead")
77
+ end
78
+
79
+ scenario 'should delete a lead', :js => true do
80
+ FactoryGirl.create(:lead, :first_name => "Mr", :last_name => "Lead", :email => "mr_lead@example.com")
81
+ visit leads_page
82
+ click_link 'Mr Lead'
83
+ click_link 'Delete?'
84
+ page.should have_content('Are you sure you want to delete this lead?')
85
+ click_link 'Yes'
86
+ page.should have_content('Mr Lead has been deleted.')
87
+ click_link 'Leads'
88
+ page.should_not have_content('Mr Lead')
89
+ page.should_not have_content('mr_lead@example.com')
90
+ end
91
+
92
+ scenario 'should search for a lead', :js => true do
93
+ 3.times { |i| FactoryGirl.create(:lead, :first_name => "Lead", :last_name => "\##{i}", :email => "lead#{i}@example.com") }
94
+ visit leads_page
95
+ find('#leads').should have_content('Lead #0')
96
+ find('#leads').should have_content('Lead #1')
97
+ find('#leads').should have_content('Lead #2')
98
+ fill_in 'query', :with => 'Lead #0'
99
+ find('#leads').should have_content('Lead #0')
100
+ find('#leads').has_selector?('li', :count => 1)
101
+ fill_in 'query', :with => 'Lead'
102
+ find('#leads').should have_content('Lead #0')
103
+ find('#leads').should have_content('Lead #1')
104
+ find('#leads').should have_content('Lead #2')
105
+ find('#leads').has_selector?('li', :count => 3)
106
+ fill_in 'query', :with => 'Non-existant lead'
107
+ find('#leads').has_selector?('li', :count => 0)
108
+ end
109
+ end