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
@@ -21,11 +21,20 @@ class CampaignsController < EntitiesController
21
21
  # GET /campaigns
22
22
  #----------------------------------------------------------------------------
23
23
  def index
24
- @campaigns = get_campaigns(:page => params[:page])
25
- respond_with(@campaigns)
24
+ @campaigns = get_campaigns(:page => params[:page], :per_page => params[:per_page])
25
+
26
+ respond_with @campaigns do |format|
27
+ format.xls { render :layout => 'header' }
28
+ end
26
29
  end
27
30
 
28
31
  # GET /campaigns/1
32
+ # AJAX /campaigns/1
33
+ # XLS /campaigns/1
34
+ # XLS /campaigns/1
35
+ # CSV /campaigns/1
36
+ # RSS /campaigns/1
37
+ # ATOM /campaigns/1
29
38
  #----------------------------------------------------------------------------
30
39
  def show
31
40
  respond_with(@campaign) do |format|
@@ -34,6 +43,31 @@ class CampaignsController < EntitiesController
34
43
  @comment = Comment.new
35
44
  @timeline = timeline(@campaign)
36
45
  end
46
+
47
+ format.js do
48
+ @stage = Setting.unroll(:opportunity_stage)
49
+ @comment = Comment.new
50
+ @timeline = timeline(@campaign)
51
+ end
52
+
53
+ format.xls do
54
+ @leads = @campaign.leads
55
+ render '/leads/index', :layout => 'header'
56
+ end
57
+
58
+ format.csv do
59
+ render :csv => @campaign.leads
60
+ end
61
+
62
+ format.rss do
63
+ @items = "leads"
64
+ @assets = @campaign.leads
65
+ end
66
+
67
+ format.atom do
68
+ @items = "leads"
69
+ @assets = @campaign.leads
70
+ end
37
71
  end
38
72
  end
39
73
 
@@ -42,8 +76,7 @@ class CampaignsController < EntitiesController
42
76
  # GET /campaigns/new.xml AJAX
43
77
  #----------------------------------------------------------------------------
44
78
  def new
45
- @campaign.attributes = {:user => @current_user, :access => Setting.default_access}
46
- @users = User.except(@current_user)
79
+ @campaign.attributes = {:user => current_user, :access => Setting.default_access, :assigned_to => nil}
47
80
 
48
81
  if params[:related]
49
82
  model, id = params[:related].split('_')
@@ -60,7 +93,6 @@ class CampaignsController < EntitiesController
60
93
  # GET /campaigns/1/edit AJAX
61
94
  #----------------------------------------------------------------------------
62
95
  def edit
63
- @users = User.except(@current_user)
64
96
  if params[:previous].to_s =~ /(\d+)\z/
65
97
  @previous = Campaign.my.find_by_id($1) || $1.to_i
66
98
  end
@@ -71,10 +103,11 @@ class CampaignsController < EntitiesController
71
103
  # POST /campaigns
72
104
  #----------------------------------------------------------------------------
73
105
  def create
74
- @users = User.except(@current_user)
106
+ @comment_body = params[:comment_body]
75
107
 
76
108
  respond_with(@campaign) do |format|
77
- if @campaign.save_with_permissions(params[:users])
109
+ if @campaign.save
110
+ @campaign.add_comment_by_user(@comment_body, current_user)
78
111
  @campaigns = get_campaigns
79
112
  get_data_for_sidebar
80
113
  end
@@ -85,11 +118,9 @@ class CampaignsController < EntitiesController
85
118
  #----------------------------------------------------------------------------
86
119
  def update
87
120
  respond_with(@campaign) do |format|
88
- if @campaign.update_with_permissions(params[:campaign], params[:users])
89
- get_data_for_sidebar if called_from_index_page?
90
- else
91
- @users = User.except(@current_user) # Need it to redraw [Edit Campaign] form.
92
- end
121
+ # Must set access before user_ids, because user_ids= method depends on access value.
122
+ @campaign.access = params[:campaign][:access] if params[:campaign][:access]
123
+ get_data_for_sidebar if @campaign.update_attributes(params[:campaign]) and called_from_index_page?
93
124
  end
94
125
  end
95
126
 
@@ -116,32 +147,28 @@ class CampaignsController < EntitiesController
116
147
  #----------------------------------------------------------------------------
117
148
  # Handled by ApplicationController :auto_complete
118
149
 
119
- # GET /campaigns/options AJAX
120
- #----------------------------------------------------------------------------
121
- def options
122
- unless params[:cancel].true?
123
- @per_page = @current_user.pref[:campaigns_per_page] || Campaign.per_page
124
- @outline = @current_user.pref[:campaigns_outline] || Campaign.outline
125
- @sort_by = @current_user.pref[:campaigns_sort_by] || Campaign.sort_by
126
- end
127
- end
128
-
129
150
  # POST /campaigns/redraw AJAX
130
151
  #----------------------------------------------------------------------------
131
152
  def redraw
132
- @current_user.pref[:campaigns_per_page] = params[:per_page] if params[:per_page]
133
- @current_user.pref[:campaigns_outline] = params[:outline] if params[:outline]
134
- @current_user.pref[:campaigns_sort_by] = Campaign::sort_by_map[params[:sort_by]] if params[:sort_by]
135
- @campaigns = get_campaigns(:page => 1)
136
- render :index
153
+ current_user.pref[:campaigns_per_page] = params[:per_page] if params[:per_page]
154
+ current_user.pref[:campaigns_sort_by] = Campaign::sort_by_map[params[:sort_by]] if params[:sort_by]
155
+ @campaigns = get_campaigns(:page => 1, :per_page => params[:per_page])
156
+ set_options # Refresh options
157
+
158
+ respond_with(@campaigns) do |format|
159
+ format.js { render :index }
160
+ end
137
161
  end
138
162
 
139
163
  # POST /campaigns/filter AJAX
140
164
  #----------------------------------------------------------------------------
141
165
  def filter
142
166
  session[:campaigns_filter] = params[:status]
143
- @campaigns = get_campaigns(:page => 1)
144
- render :index
167
+ @campaigns = get_campaigns(:page => 1, :per_page => params[:per_page])
168
+
169
+ respond_with(@campaigns) do |format|
170
+ format.js { render :index }
171
+ end
145
172
  end
146
173
 
147
174
  private
@@ -16,32 +16,32 @@
16
16
  #------------------------------------------------------------------------------
17
17
 
18
18
  class ContactsController < EntitiesController
19
- before_filter :get_users, :only => [ :new, :create, :edit, :update ]
20
19
  before_filter :get_accounts, :only => [ :new, :create, :edit, :update ]
21
20
 
22
21
  # GET /contacts
23
22
  #----------------------------------------------------------------------------
24
23
  def index
25
- @contacts = get_contacts(:page => params[:page])
26
- respond_with(@contacts)
24
+ @contacts = get_contacts(:page => params[:page], :per_page => params[:per_page])
25
+
26
+ respond_with @contacts do |format|
27
+ format.xls { render :layout => 'header' }
28
+ end
27
29
  end
28
30
 
29
31
  # GET /contacts/1
32
+ # AJAX /contacts/1
30
33
  #----------------------------------------------------------------------------
31
34
  def show
32
- respond_with(@contact) do |format|
33
- format.html do
34
- @stage = Setting.unroll(:opportunity_stage)
35
- @comment = Comment.new
36
- @timeline = timeline(@contact)
37
- end
38
- end
35
+ @stage = Setting.unroll(:opportunity_stage)
36
+ @comment = Comment.new
37
+ @timeline = timeline(@contact)
38
+ respond_with(@contact)
39
39
  end
40
40
 
41
41
  # GET /contacts/new
42
42
  #----------------------------------------------------------------------------
43
43
  def new
44
- @contact.attributes = {:user => current_user, :access => Setting.default_access}
44
+ @contact.attributes = {:user => current_user, :access => Setting.default_access, :assigned_to => nil}
45
45
  @account = Account.new(:user => current_user)
46
46
 
47
47
  if params[:related]
@@ -70,8 +70,10 @@ class ContactsController < EntitiesController
70
70
  # POST /contacts
71
71
  #----------------------------------------------------------------------------
72
72
  def create
73
+ @comment_body = params[:comment_body]
73
74
  respond_with(@contact) do |format|
74
75
  if @contact.save_with_account_and_permissions(params)
76
+ @contact.add_comment_by_user(@comment_body, current_user)
75
77
  @contacts = get_contacts if called_from_index_page?
76
78
  else
77
79
  unless params[:account][:id].blank?
@@ -93,7 +95,6 @@ class ContactsController < EntitiesController
93
95
  def update
94
96
  respond_with(@contact) do |format|
95
97
  unless @contact.update_with_account_and_permissions(params)
96
- @users = User.except(current_user)
97
98
  if @contact.account
98
99
  @account = Account.find(@contact.account.id)
99
100
  else
@@ -126,22 +127,10 @@ class ContactsController < EntitiesController
126
127
  #----------------------------------------------------------------------------
127
128
  # Handled by ApplicationController :auto_complete
128
129
 
129
- # GET /contacts/options AJAX
130
- #----------------------------------------------------------------------------
131
- def options
132
- unless params[:cancel].true?
133
- @per_page = current_user.pref[:contacts_per_page] || Contact.per_page
134
- @outline = current_user.pref[:contacts_outline] || Contact.outline
135
- @sort_by = current_user.pref[:contacts_sort_by] || Contact.sort_by
136
- @naming = current_user.pref[:contacts_naming] || Contact.first_name_position
137
- end
138
- end
139
-
140
130
  # POST /contacts/redraw AJAX
141
131
  #----------------------------------------------------------------------------
142
132
  def redraw
143
133
  current_user.pref[:contacts_per_page] = params[:per_page] if params[:per_page]
144
- current_user.pref[:contacts_outline] = params[:outline] if params[:outline]
145
134
 
146
135
  # Sorting and naming only: set the same option for Leads if the hasn't been set yet.
147
136
  if params[:sort_by]
@@ -155,8 +144,12 @@ class ContactsController < EntitiesController
155
144
  current_user.pref[:leads_naming] ||= params[:naming]
156
145
  end
157
146
 
158
- @contacts = get_contacts(:page => 1) # Start one the first page.
159
- render :index
147
+ @contacts = get_contacts(:page => 1, :per_page => params[:per_page]) # Start on the first page.
148
+ set_options # Refresh options
149
+
150
+ respond_with(@contacts) do |format|
151
+ format.js { render :index }
152
+ end
160
153
  end
161
154
 
162
155
  private
@@ -168,6 +161,11 @@ class ContactsController < EntitiesController
168
161
  @accounts = Account.my.order('name')
169
162
  end
170
163
 
164
+ def set_options
165
+ super
166
+ @naming = (current_user.pref[:contacts_naming] || Contact.first_name_position) unless params[:cancel].true?
167
+ end
168
+
171
169
  #----------------------------------------------------------------------------
172
170
  def respond_to_destroy(method)
173
171
  if method == :ajax
@@ -17,30 +17,31 @@
17
17
 
18
18
  class LeadsController < EntitiesController
19
19
  before_filter :get_data_for_sidebar, :only => :index
20
+ autocomplete :account, :name, :full => true
20
21
 
21
22
  # GET /leads
22
23
  #----------------------------------------------------------------------------
23
24
  def index
24
25
  @leads = get_leads(:page => params[:page])
25
- respond_with(@leads)
26
+
27
+ respond_with @leads do |format|
28
+ format.xls { render :layout => 'header' }
29
+ end
26
30
  end
27
31
 
28
32
  # GET /leads/1
33
+ # AJAX /leads/1
29
34
  #----------------------------------------------------------------------------
30
35
  def show
31
- respond_with(@lead) do |format|
32
- format.html do
33
- @comment = Comment.new
34
- @timeline = timeline(@lead)
35
- end
36
- end
36
+ @comment = Comment.new
37
+ @timeline = timeline(@lead)
38
+ respond_with(@lead)
37
39
  end
38
40
 
39
41
  # GET /leads/new
40
42
  #----------------------------------------------------------------------------
41
43
  def new
42
- @lead.attributes = {:user => @current_user, :access => Setting.default_access}
43
- @users = User.except(@current_user)
44
+ @lead.attributes = {:user => current_user, :access => Setting.default_access, :assigned_to => nil}
44
45
  get_campaigns
45
46
 
46
47
  if params[:related]
@@ -58,7 +59,6 @@ class LeadsController < EntitiesController
58
59
  # GET /leads/1/edit AJAX
59
60
  #----------------------------------------------------------------------------
60
61
  def edit
61
- @users = User.except(@current_user)
62
62
  get_campaigns
63
63
 
64
64
  if params[:previous].to_s =~ /(\d+)\z/
@@ -71,11 +71,12 @@ class LeadsController < EntitiesController
71
71
  # POST /leads
72
72
  #----------------------------------------------------------------------------
73
73
  def create
74
- @users = User.except(@current_user)
75
74
  get_campaigns
75
+ @comment_body = params[:comment_body]
76
76
 
77
77
  respond_with(@lead) do |format|
78
78
  if @lead.save_with_permissions(params)
79
+ @lead.add_comment_by_user(@comment_body, current_user)
79
80
  if called_from_index_page?
80
81
  @leads = get_leads
81
82
  get_data_for_sidebar
@@ -90,10 +91,11 @@ class LeadsController < EntitiesController
90
91
  #----------------------------------------------------------------------------
91
92
  def update
92
93
  respond_with(@lead) do |format|
93
- if @lead.update_with_permissions(params[:lead], params[:users])
94
+ # Must set access before user_ids, because user_ids= method depends on access value.
95
+ @lead.access = params[:lead][:access] if params[:lead][:access]
96
+ if @lead.update_with_lead_counters(params[:lead])
94
97
  update_sidebar
95
98
  else
96
- @users = User.except(@current_user)
97
99
  @campaigns = Campaign.my.order('name')
98
100
  end
99
101
  end
@@ -113,10 +115,9 @@ class LeadsController < EntitiesController
113
115
  # GET /leads/1/convert
114
116
  #----------------------------------------------------------------------------
115
117
  def convert
116
- @users = User.except(@current_user)
117
- @account = Account.new(:user => @current_user, :name => @lead.company, :access => "Lead")
118
+ @account = Account.new(:user => current_user, :name => @lead.company, :access => "Lead")
118
119
  @accounts = Account.my.order('name')
119
- @opportunity = Opportunity.new(:user => @current_user, :access => "Lead", :stage => "prospecting", :campaign => @lead.campaign, :source => @lead.source)
120
+ @opportunity = Opportunity.new(:user => current_user, :access => "Lead", :stage => "prospecting", :campaign => @lead.campaign, :source => @lead.source)
120
121
 
121
122
  if params[:previous].to_s =~ /(\d+)\z/
122
123
  @previous = Lead.my.find_by_id($1) || $1.to_i
@@ -128,7 +129,6 @@ class LeadsController < EntitiesController
128
129
  # PUT /leads/1/promote
129
130
  #----------------------------------------------------------------------------
130
131
  def promote
131
- @users = User.except(@current_user)
132
132
  @account, @opportunity, @contact = @lead.promote(params)
133
133
  @accounts = Account.my.order('name')
134
134
  @stage = Setting.unroll(:opportunity_stage)
@@ -167,45 +167,41 @@ class LeadsController < EntitiesController
167
167
  #----------------------------------------------------------------------------
168
168
  # Handled by ApplicationController :auto_complete
169
169
 
170
- # GET /leads/options AJAX
171
- #----------------------------------------------------------------------------
172
- def options
173
- unless params[:cancel].true?
174
- @per_page = @current_user.pref[:leads_per_page] || Lead.per_page
175
- @outline = @current_user.pref[:leads_outline] || Lead.outline
176
- @sort_by = @current_user.pref[:leads_sort_by] || Lead.sort_by
177
- @naming = @current_user.pref[:leads_naming] || Lead.first_name_position
178
- end
179
- end
180
170
 
181
171
  # POST /leads/redraw AJAX
182
172
  #----------------------------------------------------------------------------
183
173
  def redraw
184
- @current_user.pref[:leads_per_page] = params[:per_page] if params[:per_page]
185
- @current_user.pref[:leads_outline] = params[:outline] if params[:outline]
174
+ current_user.pref[:leads_per_page] = params[:per_page] if params[:per_page]
186
175
 
187
176
  # Sorting and naming only: set the same option for Contacts if the hasn't been set yet.
188
177
  if params[:sort_by]
189
- @current_user.pref[:leads_sort_by] = Lead::sort_by_map[params[:sort_by]]
178
+ current_user.pref[:leads_sort_by] = Lead::sort_by_map[params[:sort_by]]
190
179
  if Contact::sort_by_fields.include?(params[:sort_by])
191
- @current_user.pref[:contacts_sort_by] ||= Contact::sort_by_map[params[:sort_by]]
180
+ current_user.pref[:contacts_sort_by] ||= Contact::sort_by_map[params[:sort_by]]
192
181
  end
193
182
  end
194
183
  if params[:naming]
195
- @current_user.pref[:leads_naming] = params[:naming]
196
- @current_user.pref[:contacts_naming] ||= params[:naming]
184
+ current_user.pref[:leads_naming] = params[:naming]
185
+ current_user.pref[:contacts_naming] ||= params[:naming]
197
186
  end
198
187
 
199
- @leads = get_leads(:page => 1) # Start one the first page.
200
- render :index
188
+ @leads = get_leads(:page => 1, :per_page => params[:per_page]) # Start one the first page.
189
+ set_options # Refresh options
190
+
191
+ respond_with(@leads) do |format|
192
+ format.js { render :index }
193
+ end
201
194
  end
202
195
 
203
196
  # POST /leads/filter AJAX
204
197
  #----------------------------------------------------------------------------
205
198
  def filter
206
199
  session[:leads_filter] = params[:status]
207
- @leads = get_leads(:page => 1) # Start one the first page.
208
- render :index
200
+ @leads = get_leads(:page => 1, :per_page => params[:per_page]) # Start one the first page.
201
+
202
+ respond_with(@leads) do |format|
203
+ format.js { render :index }
204
+ end
209
205
  end
210
206
 
211
207
  private
@@ -218,6 +214,11 @@ private
218
214
  @campaigns = Campaign.my.order('name')
219
215
  end
220
216
 
217
+ def set_options
218
+ super
219
+ @naming = (current_user.pref[:leads_naming] || Lead.first_name_position) unless params[:cancel].true?
220
+ end
221
+
221
222
  #----------------------------------------------------------------------------
222
223
  def respond_to_destroy(method)
223
224
  if method == :ajax
@@ -23,27 +23,27 @@ class OpportunitiesController < EntitiesController
23
23
  # GET /opportunities
24
24
  #----------------------------------------------------------------------------
25
25
  def index
26
- @opportunities = get_opportunities(:page => params[:page])
27
- respond_with(@opportunities)
26
+ @opportunities = get_opportunities(:page => params[:page], :per_page => params[:per_page])
27
+
28
+ respond_with @opportunities do |format|
29
+ format.xls { render :layout => 'header' }
30
+ end
28
31
  end
29
32
 
30
33
  # GET /opportunities/1
34
+ # AJAX /opportunities/1
31
35
  #----------------------------------------------------------------------------
32
36
  def show
33
- respond_with(@opportunity) do |format|
34
- format.html do
35
- @comment = Comment.new
36
- @timeline = timeline(@opportunity)
37
- end
38
- end
37
+ @comment = Comment.new
38
+ @timeline = timeline(@opportunity)
39
+ respond_with(@opportunity)
39
40
  end
40
41
 
41
42
  # GET /opportunities/new
42
43
  #----------------------------------------------------------------------------
43
44
  def new
44
- @opportunity.attributes = {:user => @current_user, :stage => "prospecting", :access => Setting.default_access}
45
- @users = User.except(@current_user)
46
- @account = Account.new(:user => @current_user, :access => Setting.default_access)
45
+ @opportunity.attributes = {:user => current_user, :stage => "prospecting", :access => Setting.default_access, :assigned_to => nil}
46
+ @account = Account.new(:user => current_user, :access => Setting.default_access)
47
47
  @accounts = Account.my.order('name')
48
48
 
49
49
  if params[:related]
@@ -61,8 +61,7 @@ class OpportunitiesController < EntitiesController
61
61
  # GET /opportunities/1/edit AJAX
62
62
  #----------------------------------------------------------------------------
63
63
  def edit
64
- @users = User.except(@current_user)
65
- @account = @opportunity.account || Account.new(:user => @current_user)
64
+ @account = @opportunity.account || Account.new(:user => current_user)
66
65
  @accounts = Account.my.order('name')
67
66
 
68
67
  if params[:previous].to_s =~ /(\d+)\z/
@@ -75,8 +74,10 @@ class OpportunitiesController < EntitiesController
75
74
  # POST /opportunities
76
75
  #----------------------------------------------------------------------------
77
76
  def create
77
+ @comment_body = params[:comment_body]
78
78
  respond_with(@opportunity) do |format|
79
79
  if @opportunity.save_with_account_and_permissions(params)
80
+ @opportunity.add_comment_by_user(@comment_body, current_user)
80
81
  if called_from_index_page?
81
82
  @opportunities = get_opportunities
82
83
  get_data_for_sidebar
@@ -86,7 +87,6 @@ class OpportunitiesController < EntitiesController
86
87
  get_data_for_sidebar(:campaign)
87
88
  end
88
89
  else
89
- @users = User.except(@current_user)
90
90
  @accounts = Account.my.order('name')
91
91
  unless params[:account][:id].blank?
92
92
  @account = Account.find(params[:account][:id])
@@ -94,7 +94,7 @@ class OpportunitiesController < EntitiesController
94
94
  if request.referer =~ /\/accounts\/(.+)$/
95
95
  @account = Account.find($1) # related account
96
96
  else
97
- @account = Account.new(:user => @current_user)
97
+ @account = Account.new(:user => current_user)
98
98
  end
99
99
  end
100
100
  @contact = Contact.find(params[:contact]) unless params[:contact].blank?
@@ -116,12 +116,11 @@ class OpportunitiesController < EntitiesController
116
116
  get_data_for_sidebar(:campaign)
117
117
  end
118
118
  else
119
- @users = User.except(@current_user)
120
119
  @accounts = Account.my.order('name')
121
120
  if @opportunity.account
122
121
  @account = Account.find(@opportunity.account.id)
123
122
  else
124
- @account = Account.new(:user => @current_user)
123
+ @account = Account.new(:user => current_user)
125
124
  end
126
125
  end
127
126
  end
@@ -155,28 +154,24 @@ class OpportunitiesController < EntitiesController
155
154
  #----------------------------------------------------------------------------
156
155
  # Handled by ApplicationController :auto_complete
157
156
 
158
- # GET /opportunities/options AJAX
159
- #----------------------------------------------------------------------------
160
- def options
161
- unless params[:cancel].true?
162
- @per_page = @current_user.pref[:opportunities_per_page] || Opportunity.per_page
163
- @outline = @current_user.pref[:opportunities_outline] || Opportunity.outline
164
- @sort_by = @current_user.pref[:opportunities_sort_by] || Opportunity.sort_by
165
- end
166
- end
167
-
168
157
  # POST /opportunities/redraw AJAX
169
158
  #----------------------------------------------------------------------------
170
159
  def redraw
171
- @opportunities = get_opportunities(:page => 1)
172
- render :index
160
+ @opportunities = get_opportunities(:page => 1, :per_page => params[:per_page])
161
+ set_options # Refresh options
162
+
163
+ respond_with(@opportunities) do |format|
164
+ format.js { render :index }
165
+ end
173
166
  end
174
167
 
175
168
  # POST /opportunities/filter AJAX
176
169
  #----------------------------------------------------------------------------
177
170
  def filter
178
- @opportunities = get_opportunities(:page => 1)
179
- render :index
171
+ @opportunities = get_opportunities(:page => 1, :per_page => params[:per_page])
172
+ respond_with(@opportunities) do |format|
173
+ format.js { render :index }
174
+ end
180
175
  end
181
176
 
182
177
  private
@@ -226,9 +221,8 @@ private
226
221
 
227
222
  #----------------------------------------------------------------------------
228
223
  def set_params
229
- @current_user.pref[:opportunities_per_page] = params[:per_page] if params[:per_page]
230
- @current_user.pref[:opportunities_outline] = params[:outline] if params[:outline]
231
- @current_user.pref[:opportunities_sort_by] = Opportunity::sort_by_map[params[:sort_by]] if params[:sort_by]
224
+ current_user.pref[:opportunities_per_page] = params[:per_page] if params[:per_page]
225
+ current_user.pref[:opportunities_sort_by] = Opportunity::sort_by_map[params[:sort_by]] if params[:sort_by]
232
226
  session[:opportunities_filter] = params[:stage] if params[:stage]
233
227
  end
234
228
  end