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
data/README.md CHANGED
@@ -1,44 +1,42 @@
1
- # Fat Free CRM
1
+ # Fat Free CRM [![TravisCI][travis-img-url]][travis-ci-url]
2
2
 
3
- [![TravisCI][travis-img]][travis-ci]
4
-
5
- [travis-img]: https://secure.travis-ci.org/fatfreecrm/fat_free_crm.png?branch=master
6
- [travis-ci]: http://travis-ci.org/fatfreecrm/fat_free_crm
7
- [gemnasium-img]: https://gemnasium.com/fatfreecrm/fat_free_crm.png?travis
8
- [gemnasium]: https://gemnasium.com/fatfreecrm/fat_free_crm
3
+ [travis-img-url]: https://secure.travis-ci.org/fatfreecrm/fat_free_crm.png?branch=master
4
+ [travis-ci-url]: http://travis-ci.org/fatfreecrm/fat_free_crm
9
5
 
10
6
  ### An open source, Ruby on Rails [customer relationship management][crm-wiki] platform (CRM).
11
7
 
12
8
  [crm-wiki]: http://en.wikipedia.org/wiki/Customer_relationship_management
13
9
 
14
- Out of the box it features group collaboration, campaign and lead management, contact lists, and opportunity tracking.
10
+
11
+ Out of the box it features group collaboration, campaign and lead management,
12
+ contact lists, and opportunity tracking.
15
13
 
16
14
  <table>
17
15
  <tr>
18
16
  <td align="center">
19
- <a href="http://fatfreecrm.com/images/contact_create.png" target="_blank" title="Create Contacts">
20
- <img src="http://fatfreecrm.com/images/contact_create_t.png" alt="Create Contacts">
17
+ <a href="https://github.com/fatfreecrm/fatfreecrm.github.com/raw/master/backup/images/contact_create.png" target="_blank" title="Create Contacts">
18
+ <img src="https://github.com/fatfreecrm/fatfreecrm.github.com/raw/master/backup/images/contact_create_t.png" alt="Create Contacts">
21
19
  </a>
22
20
  <br />
23
21
  <em>Contacts</em>
24
22
  </td>
25
23
  <td align="center">
26
- <a href="http://fatfreecrm.com/images/contact_opportunity.png" target="_blank" title="Manage Opportunities">
27
- <img src="http://fatfreecrm.com/images/contact_opportunity_t.png" alt="Manage Opportunities">
24
+ <a href="https://github.com/fatfreecrm/fatfreecrm.github.com/raw/master/backup/images/contact_opportunity.png" target="_blank" title="Manage Opportunities">
25
+ <img src="https://github.com/fatfreecrm/fatfreecrm.github.com/raw/master/backup/images/contact_opportunity_t.png" alt="Manage Opportunities">
28
26
  </a>
29
27
  <br />
30
28
  <em>Opportunities</em>
31
29
  </td>
32
30
  <td align="center">
33
- <a href="http://fatfreecrm.com/images/account_edit.png" target="_blank" title="Edit Accounts">
34
- <img src="http://fatfreecrm.com/images/account_edit_t.png" alt="Edit Accounts">
31
+ <a href="https://github.com/fatfreecrm/fatfreecrm.github.com/raw/master/backup/images/account_edit.png" target="_blank" title="Edit Accounts">
32
+ <img src="https://github.com/fatfreecrm/fatfreecrm.github.com/raw/master/backup/images/account_edit_t.png" alt="Edit Accounts">
35
33
  </a>
36
34
  <br />
37
35
  <em>Accounts</em>
38
36
  </td>
39
37
  <td align="center">
40
- <a href="http://fatfreecrm.com/images/task_create.png" target="_blank" title="Create Tasks">
41
- <img src="http://fatfreecrm.com/images/task_create_t.png" alt="Create Tasks">
38
+ <a href="https://github.com/fatfreecrm/fatfreecrm.github.com/raw/master/backup/images/task_create.png" target="_blank" title="Create Tasks">
39
+ <img src="https://github.com/fatfreecrm/fatfreecrm.github.com/raw/master/backup/images/task_create_t.png" alt="Create Tasks">
42
40
  </a>
43
41
  <br />
44
42
  <em>Tasks</em>
@@ -95,6 +93,8 @@ This is the best way to deploy Fat Free CRM if you need to add plugins or make a
95
93
 
96
94
  ## Upgrading from previous versions of Fat Free CRM
97
95
 
96
+ If you are upgrading from version 0.11.3 (Dec 21st 2012) or below, please see an [important fix for country data](https://github.com/fatfreecrm/fat_free_crm/wiki/The-Countries-Problem-and-How-to-Fix-It)
97
+
98
98
  If you are upgrading from version 0.10.1 or below to the latest Rails 3.x version, your database schema
99
99
  needs to be updated.
100
100
 
@@ -134,6 +134,13 @@ the concepts:
134
134
  * http://github.com/michaeldv/crm_web_to_lead/tree/master
135
135
  * http://github.com/michaeldv/crm_tags/tree/master
136
136
 
137
+ ## Contributors
138
+
139
+ * [Nathan Broadbent (@ndbroadbent)](https://github.com/ndbroadbent)
140
+ * [Ben Tillman (@warp)](https://github.com/warp)
141
+ * [Steve Kenworthy (@steveyken)](https://github.com/steveyken)
142
+
143
+ See the [contributors graph](https://github.com/fatfreecrm/fat_free_crm/graphs/contributors) for further details.
137
144
 
138
145
  ## License
139
146
 
File without changes
@@ -0,0 +1,62 @@
1
+ ###
2
+ Fat Free CRM
3
+ Copyright (C) 2008-2011 by Michael Dvorkin
4
+
5
+ This program is free software: you can redistribute it and/or modify
6
+ it under the terms of the GNU Affero General Public License as published by
7
+ the Free Software Foundation, either version 3 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU Affero General Public License for more details.
14
+
15
+ You should have received a copy of the GNU Affero General Public License
16
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ ------------------------------------------------------------------------------
18
+ ###
19
+
20
+ (($) ->
21
+
22
+ $('.fields select[name="field[as]"]').live 'change', ->
23
+ $.ajax(
24
+ url: '/admin/fields/subform?' + $(this).parents('form').serialize()
25
+ dataType: 'html'
26
+ context: $(this).closest('form').find('.subform')
27
+ success: (data) ->
28
+ $(this).html(data)
29
+ $(this).find('input').first().focus()
30
+ )
31
+
32
+ $('.fields a.create').live 'click', ->
33
+ $('.edit_field').hide()
34
+ field_group = $(this).closest('.field_group')
35
+ field_group.find('.empty').hide()
36
+ field_group.find('.arrow').html(crm.EXPANDED)
37
+ field_group.find('.create_field').slideDown().find('input[name="field[label]"]').focus()
38
+ false
39
+
40
+ $('.create_field a.close, .create_field a.cancel').live 'click', ->
41
+ $(this).closest('.create_field').hide()
42
+ $(this).closest('.field_group').find('.empty').show()
43
+ $(this).closest('.field_group').find('.arrow').html(crm.COLLAPSED)
44
+ false
45
+
46
+ $('.fields a.edit').live 'click', ->
47
+ $('.edit_field').hide()
48
+ $.ajax(
49
+ url: $(this).attr('href')
50
+ context: $(this).closest('li').find('div.edit_field')
51
+ success: (data) ->
52
+ $(this).replaceWith(data).first().focus()
53
+ )
54
+ false
55
+
56
+ $('.edit_field a.close, .edit_field a.cancel').live 'click', ->
57
+ $(this).closest('.edit_field').hide()
58
+ false
59
+
60
+ false
61
+
62
+ ) jQuery
@@ -18,6 +18,7 @@
18
18
  //= require jquery
19
19
  //= require jquery-ui
20
20
  //= require jquery-noconflict
21
+ //= require select2
21
22
  //= require prototype
22
23
  //= require effects
23
24
  //= require controls
@@ -30,12 +31,18 @@
30
31
  //= require crm_fields
31
32
  //= require textarea_autocomplete
32
33
  //= require crm_textarea_autocomplete
33
- //= require calendar_date_select/calendar_date_select
34
34
  //= require event.simulate
35
35
  //= require ajax-chosen-prototype
36
36
  //= require crm_chosen
37
+ //= require ransack_ui_jquery
37
38
  //= require search
38
39
  //= require lists
40
+ //= require autocomplete-rails
41
+ //= require datepicker
42
+ //= require jquery.disable
43
+ //= require jquery_ui_datepicker/jquery-ui-timepicker-addon
44
+ //= require admin/fields
45
+ //= require format_buttons
39
46
  //= require_self
40
47
 
41
48
  <%
@@ -19,36 +19,10 @@ var crm = {
19
19
 
20
20
  EXPANDED : "&#9660;",
21
21
  COLLAPSED : "&#9658;",
22
- request : null,
22
+ searchRequest : null,
23
23
  autocompleter : null,
24
24
  base_url : "",
25
25
 
26
- //----------------------------------------------------------------------------
27
- date_select_popup: function(id, dropdown_id, show_time) {
28
- $(id).observe("focus", function() {
29
- if (!$(id).calendar_was_shown) { // The field recieved initial focus, show the calendar.
30
- var calendar = new CalendarDateSelect(this, { month_year: "label", year_range: 10, time: show_time, before_close: function() { this.calendar_was_shown = true } });
31
- if (dropdown_id) {
32
- calendar.buttons_div.build("span", { innerHTML: " | ", className: "button_seperator" });
33
- calendar.buttons_div.build("a", { innerHTML: "Back to List", href: "#", onclick: function() {
34
- calendar.close(); // Hide calendar popup.
35
- $(id).hide(); // Hide date edit field.
36
- $(dropdown_id).show(); // Show dropdown.
37
- $(dropdown_id).selectedIndex = 0; // Select first dopdown item.
38
- $(id).update(""); // Reset date field value.
39
- return false;
40
- }.bindAsEventListener(this) });
41
- }
42
- } else {
43
- $(id).calendar_was_shown = null; // Focus is back from the closed calendar, make it show up again.
44
- }
45
- });
46
-
47
- $(id).observe("blur", function() {
48
- $(id).calendar_was_shown = null; // Get the calendar ready if we loose focus.
49
- });
50
- },
51
-
52
26
  //----------------------------------------------------------------------------
53
27
  find_form: function(class_name) {
54
28
  var forms = $$('form.' + class_name);
@@ -71,14 +45,14 @@ var crm = {
71
45
  hide_form: function(id) {
72
46
  if($('facebook-list')) $('facebook-list').remove();
73
47
  var arrow = $(id + "_arrow") || $("arrow");
74
- arrow.update(this.COLLAPSED);
48
+ if (arrow) arrow.update(this.COLLAPSED);
75
49
  $(id).hide().update("").setStyle({height: 'auto'});
76
50
  },
77
51
 
78
52
  //----------------------------------------------------------------------------
79
53
  show_form: function(id) {
80
54
  var arrow = $(id + "_arrow") || $("arrow");
81
- arrow.update(this.EXPANDED);
55
+ if (arrow) arrow.update(this.EXPANDED);
82
56
  Effect.BlindDown(id, { duration: 0.25, afterFinish: function() {
83
57
  var input = $(id).down("input[type=text]");
84
58
  if (input) input.focus();
@@ -317,7 +291,7 @@ var crm = {
317
291
  //----------------------------------------------------------------------------
318
292
  reschedule_task: function(id, bucket) {
319
293
  $("task_bucket").value = bucket;
320
- $("edit_task_" + id).onsubmit();
294
+ $$('#edit_task_' + id + ' input[type="submit"]')[0].click();
321
295
  },
322
296
 
323
297
  //----------------------------------------------------------------------------
@@ -348,6 +322,7 @@ var crm = {
348
322
  },
349
323
 
350
324
  //----------------------------------------------------------------------------
325
+ // Will be deprecated soon: html5 placeholder replaced it on address fields
351
326
  show_hint: function(el, hint) {
352
327
  if (el.value == '') {
353
328
  el.value = hint;
@@ -357,6 +332,7 @@ var crm = {
357
332
  },
358
333
 
359
334
  //----------------------------------------------------------------------------
335
+ // Will be deprecated soon: html5 placeholder replaced it on address fields
360
336
  hide_hint: function(el, value) {
361
337
  if (arguments.length == 2) {
362
338
  el.value = value;
@@ -370,6 +346,7 @@ var crm = {
370
346
  },
371
347
 
372
348
  //----------------------------------------------------------------------------
349
+ // Will be deprecated soon: html5 placeholder replaced it on address fields
373
350
  clear_all_hints: function() {
374
351
  $$("input[hint=true]").each( function(field) {
375
352
  field.value = '';
@@ -398,24 +375,25 @@ var crm = {
398
375
  },
399
376
 
400
377
  //----------------------------------------------------------------------------
378
+
401
379
  search: function(query, controller) {
402
- if (!this.request) {
403
- var list = controller; // ex. "users"
404
- if (list.indexOf("/") >= 0) { // ex. "admin/users"
405
- list = list.split("/")[1];
406
- }
407
- $("loading").show();
408
- $(list).setStyle({ opacity: 0.4 });
409
- new Ajax.Request(this.base_url + "/" + controller, {
410
- method : "get",
411
- parameters : { query : query },
412
- onSuccess : function() {
413
- $("loading").hide();
414
- $(list).setStyle({ opacity: 1 });
415
- },
416
- onComplete : (function() { this.request = null; }).bind(this)
417
- });
380
+ var list = controller; // ex. "users"
381
+ if (list.indexOf("/") >= 0) { // ex. "admin/users"
382
+ list = list.split("/")[1];
418
383
  }
384
+ $("loading").show();
385
+ $(list).setStyle({ opacity: 0.4 });
386
+ if (this.searchRequest && this.searchRequest.readyState != -4) { this.searchRequest.abort(); }
387
+ this.searchRequest = jQuery.ajax({
388
+ url: this.base_url + "/" + controller + '.js',
389
+ type: 'GET',
390
+ data: { query : query },
391
+ success : function() {
392
+ $("loading").hide();
393
+ $(list).setStyle({ opacity: 1 });
394
+ this.searchRequest = null;
395
+ }
396
+ });
419
397
  },
420
398
 
421
399
  //----------------------------------------------------------------------------
@@ -439,6 +417,21 @@ var crm = {
439
417
  }
440
418
  this.autocompleter = new Ajax.Autocompleter("auto_complete_query", "auto_complete_dropdown", this.base_url + "/" + controller + "/auto_complete", {
441
419
  frequency: 0.25,
420
+ parameters: (related) ? ('related=' + related) : null,
421
+ onShow: function(element, update) {
422
+ // overridding onShow to include a fix for IE browsers
423
+ // see https://prototype.lighthouseapp.com/projects/8887/tickets/263-displayinline-fixes-positioning-of-autocomplete-results-div-in-ie8
424
+ update.style.display = (Prototype.Browser.IE) ? 'inline':'absolute';
425
+ // below is default onShow from controls.js
426
+ if(!update.style.position || update.style.position=='absolute') {
427
+ update.style.position = 'absolute';
428
+ Position.clone(element, update, {
429
+ setHeight: false,
430
+ offsetTop: element.offsetHeight
431
+ });
432
+ }
433
+ Effect.Appear(update,{duration:0.15});
434
+ },
442
435
  afterUpdateElement: function(text, el) {
443
436
  if (el.id) { // Autocomplete entry found.
444
437
  if (related) { // Attach to related asset.
@@ -484,6 +477,11 @@ document.observe("dom:loaded", function() {
484
477
  new Ajax.Request(el.href, { method: 'get' });
485
478
  e.stop();
486
479
  }
480
+ if (el.match('.per_page_options a')) {
481
+ el.up('.per_page_options').update(createSpinner());
482
+ new Ajax.Request(el.href, { method: 'post' });
483
+ e.stop();
484
+ }
487
485
  });
488
486
  }
489
487
  });
@@ -8,8 +8,6 @@ crm.chosen_taglist = (asset, controller, id)->
8
8
  crm.remove_field_group(tag)
9
9
  }
10
10
 
11
-
12
- # Ensures initialization of ajaxChosen account selector
13
11
  crm.ensure_chosen_account = ->
14
12
  unless $("account_id_chzn")
15
13
  new ajaxChosen $("account_id"), {
@@ -20,9 +18,14 @@ crm.ensure_chosen_account = ->
20
18
  query_key: "auto_complete_query"
21
19
  }
22
20
 
21
+ (($j) ->
22
+
23
+ # Initialize any chosen select lists after every Ajax response
24
+ Ajax.Responders.register({
25
+ onComplete: ->
26
+ $j("select[name*='assigned_to'], select[name*='[country]'], .chzn-select").each ->
27
+ unless $j(this).hasClass('chzn-done')
28
+ new Chosen this, { allow_single_deselect: true }
29
+ })
23
30
 
24
- # Initialize chosen select lists for certain fields
25
- crm.init_chosen_fields = ->
26
- ['assigned_to', '[country]'].each (field) ->
27
- $$("select[name*='"+field+"']").each (el) ->
28
- new Chosen el, { allow_single_deselect: true }
31
+ ) (jQuery)
@@ -0,0 +1,15 @@
1
+ (($) ->
2
+
3
+ $('input.date').live 'click focus', ->
4
+ $(this).datepicker({
5
+ showOn: 'focus',
6
+ changeMonth: true,
7
+ dateFormat: 'yy-mm-dd'})
8
+
9
+ $('input.datetime').live 'click focus', ->
10
+ $(this).datetimepicker({
11
+ showOn: 'focus',
12
+ changeMonth: true,
13
+ dateFormat: 'yy-mm-dd'})
14
+
15
+ ) jQuery
@@ -0,0 +1,48 @@
1
+ (($j) ->
2
+
3
+ $j('a[data-view]').live 'click', ->
4
+
5
+ if $j(this).data('context') == 'show'
6
+ # replace the '#main' div with the new 'show' contents
7
+ $j.ajax(
8
+ url: $j(this).data('url'),
9
+ dataType: "script"
10
+ data:
11
+ view: $j(this).data('view')
12
+ beforeSend: ->
13
+ $j('#loading').show()
14
+ complete: ->
15
+ $j('#loading').hide()
16
+ )
17
+ else
18
+ # update the index view by firing off the searches again
19
+
20
+ if $j('#search .tabs li a[data-search-form="advanced_search"].active').length == 1
21
+ # handle view change via advanced search form by setting the hidden 'view' field
22
+ $j('#advanced_search_view').remove()
23
+ $j("#advanced_search form input:submit").before('<input id="advanced_search_view" name="view" type="hidden" value="' + $j(this).data('view') + '">')
24
+ $j("#advanced_search form input:submit").click()
25
+ else
26
+ # basic search
27
+ $j.ajax(
28
+ url: $j(this).data('url'),
29
+ type: "POST",
30
+ dataType: "script"
31
+ data:
32
+ view: $j(this).data('view')
33
+ query: $('query').value
34
+ beforeSend: ->
35
+ $j('#contacts').css({ opacity: 0.4 })
36
+ $j('#loading').show()
37
+ complete: ->
38
+ $j('#contacts').css({ opacity: 1 })
39
+ $j('#loading').hide()
40
+ )
41
+
42
+ # TODO: code for when viewing a single contact, not just index
43
+ # need to refresh the page or just the segment
44
+
45
+ $j('a[data-view]').removeClass('active')
46
+ $j(this).addClass('active')
47
+
48
+ ) jQuery
@@ -23,7 +23,7 @@
23
23
 
24
24
  $("input#save_list").live "click", ->
25
25
  # Set value of hidden list_url field to serialized search form
26
- $("#list_url").val(window.location.pathname + '?' + $('form.advanced_search').serialize())
26
+ $("#list_url").val(window.location.pathname + '?' + $('form.ransack_search').serialize())
27
27
  true
28
28
 
29
29
  # When mouseover on li, change asset icons to delete buttons
@@ -1,40 +1,58 @@
1
1
  (($) ->
2
- class @Search
3
- constructor: (@templates = {}) ->
4
-
5
- add_fields: (button, type, content) ->
6
- new_id = new Date().getTime()
7
- regexp = new RegExp('new_' + type, 'g')
8
- $(button).closest('p').before(content.replace(regexp, new_id))
9
-
10
- remove_fields: (button) ->
11
- container = $(button).closest('.fields')
12
- if (container.siblings().length > 1)
13
- container.remove()
14
- else
15
- container.parent().closest('.fields').remove()
16
-
17
- $(document).ready ->
18
- search = new Search()
19
-
20
- $(".add_fields").live "click", ->
21
- search.add_fields this, $(this).data("fieldType"), $(this).data("content")
22
- false
23
-
24
- $(".remove_fields").live "click", ->
25
- search.remove_fields this
26
- false
27
-
28
- $("select.predicate").live "change", ->
29
- value_el = $('input#' + $(this).attr('id').slice(0, -1) + "v_0_value");
30
- if $(this).val() in ["true", "false", "blank", "present", "null", "not_null"]
31
- value_el.val("true")
32
- value_el.hide()
33
- else
34
- unless value_el.is(":visible")
35
- value_el.val("")
36
- value_el.show()
37
-
38
- # Fire change event for existing search form.
39
- $("select.predicate").change()
2
+
3
+ $ ->
4
+ $("#advanced_search").ransack_search_form()
5
+
6
+ # For basic search, remove placeholder text on focus, restore on blur
7
+ $('#query').focusin (e) ->
8
+ $(this).data('placeholder', $(this).attr('placeholder')).attr('placeholder', '')
9
+ $('#query').focusout (e) ->
10
+ $(this).attr('placeholder', $(this).data('placeholder'))
11
+
12
+ # For advanced search we show a spinner and dim the page when loading results
13
+ # This method undoes that when the results are returned. Ideally, this should
14
+ # be converted to jQuery (using the 'live' method)
15
+ # but we have to move to jquery-ujs first as all ajax events are current
16
+ # registered with prototype
17
+ Event.observe document.body, 'ajax:complete', (e, el) ->
18
+ if e.findElement('.ransack_search')
19
+ $("#loading").hide()
20
+ $("#advanced_search").css('opacity', 1)
21
+
22
+ Event.observe document.body, 'ajax:failure', (e, el) ->
23
+ if e.findElement('.ransack_search')
24
+ $('#flash').html('An error occurred whilst trying to search') # no i18n
25
+ crm.flash('error')
26
+
27
+ # Search tabs
28
+ # -----------------------------------------------------
29
+ activate_search_form = (search_form) ->
30
+ # Hide all
31
+ $('#search .search_form').hide()
32
+ $('#search .tabs li a').removeClass('active')
33
+ # Show selected
34
+ $('#' + search_form).show()
35
+ $('a[data-search-form=' + search_form + ']').addClass('active')
36
+ # Run search for current query
37
+ switch search_form
38
+ when 'basic_search'
39
+ $('#lists .show_lists_save_form').hide()
40
+ query_input = $('#basic_search input#query')
41
+ if !query_input.is('.defaultTextActive')
42
+ value = query_input.val()
43
+ else
44
+ value = ""
45
+ crm.search(value, window.controller)
46
+ $('#filters').enable() # Enable filters panel (if present)
47
+
48
+ when 'advanced_search'
49
+ $('#lists .show_lists_save_form').show()
50
+ $("#advanced_search form input:submit").click()
51
+ $('#filters').disable() # Disable filters panel (if present)
52
+
53
+ return
54
+
55
+ $("#search .tabs a").click ->
56
+ activate_search_form($(this).data('search-form'))
57
+
40
58
  ) jQuery