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
@@ -17,6 +17,7 @@
17
17
 
18
18
  require 'rails/all'
19
19
  require 'jquery-rails'
20
+ require 'select2-rails'
20
21
  require 'prototype-rails'
21
22
  require 'haml'
22
23
  require 'sass'
@@ -32,9 +33,14 @@ require 'authlogic'
32
33
  require 'chosen-rails'
33
34
  require 'ajax-chosen-rails'
34
35
  require 'ransack'
36
+ require 'ransack_ui'
35
37
  require 'paper_trail'
36
38
  require 'cancan'
37
- require 'squeel'
39
+ require 'rails3-jquery-autocomplete'
40
+ require 'valium'
41
+ require 'ffaker'
42
+ require 'premailer'
43
+ require 'nokogiri'
38
44
 
39
45
  # Load redcloth if available (for textile markup in emails)
40
46
  begin
@@ -35,8 +35,7 @@ module FatFreeCRM
35
35
  has_many :permissions, :as => :asset
36
36
 
37
37
  scope :my, lambda {
38
- current_ability = Ability.new(User.current_user)
39
- accessible_by(current_ability).readonly(false)
38
+ accessible_by(User.current_ability)
40
39
  }
41
40
 
42
41
  include FatFreeCRM::Permissions::InstanceMethods
@@ -48,44 +47,67 @@ module FatFreeCRM
48
47
 
49
48
  module InstanceMethods
50
49
 
50
+ # Save shared permissions to the model, if any.
51
+ #--------------------------------------------------------------------------
52
+ %w(group user).each do |model|
53
+ class_eval %Q{
54
+
55
+ def #{model}_ids=(value)
56
+ if access != "Shared"
57
+ remove_permissions
58
+ else
59
+ value.map!{|c| c.split(',')} if value.map{|v| v.to_s.include?(',')}.any? # fix for a bug in "Chosen" which gives values like ["", "1,2,3"]
60
+ value = value.flatten.reject(&:blank?).uniq.map(&:to_i)
61
+ permissions_to_remove = Permission.find_all_by_#{model}_id_and_asset_id_and_asset_type(self.#{model}_ids - value, self.id, self.class)
62
+ permissions_to_remove.each {|p| (permissions.delete(p); p.destroy)}
63
+ (value - self.#{model}_ids).each {|id| permissions.build(:#{model}_id => id)}
64
+ end
65
+ end
66
+
67
+ def #{model}_ids
68
+ permissions.map(&:#{model}_id).compact
69
+ end
70
+ }
71
+ end
72
+
73
+ # Remove all shared permissions if no longer shared
74
+ #--------------------------------------------------------------------------
75
+ def access=(value)
76
+ remove_permissions unless value == 'Shared'
77
+ super(value)
78
+ end
79
+
80
+ # Removes all permissions on an object
81
+ #--------------------------------------------------------------------------
82
+ def remove_permissions
83
+ # we don't use dependent => :destroy so must manually remove
84
+ permissions_to_remove = Permission.find_all_by_asset_id_and_asset_type(self.id, self.class)
85
+ permissions_to_remove.each {|p| (permissions.delete(p); p.destroy)}
86
+ end
87
+
51
88
  # Save the model along with its permissions if any.
52
89
  #--------------------------------------------------------------------------
53
- def save_with_permissions(users)
54
- if users && self[:access] == "Shared"
55
- users.each { |id| self.permissions << Permission.new(:user_id => id, :asset => self) }
56
- end
90
+ def save_with_permissions(users = nil)
91
+ ActiveSupport::Deprecation.warn "save_with_permissions is deprecated and may be removed from future releases, use user_ids and group_ids inside attributes instead."
57
92
  save
58
93
  end
59
94
 
60
95
  # Update the model along with its permissions if any.
61
96
  #--------------------------------------------------------------------------
62
- def update_with_permissions(attributes, users)
63
- if attributes[:access] != "Shared"
64
- self.permissions.delete_all
65
- elsif !users.blank? # Check if we have the same users this time around.
66
- existing_users = self.permissions.map(&:user_id)
67
- if (existing_users.size != users.size) || (existing_users - users != [])
68
- self.permissions.delete_all
69
- users.each do |id|
70
- self.permissions << Permission.new(:user_id => id, :asset => self)
71
- end
72
- end
73
- end
97
+ def update_with_permissions(attributes, users = nil)
98
+ ActiveSupport::Deprecation.warn "update_with_permissions is deprecated and may be removed from future releases, use user_ids and group_ids inside attributes instead."
74
99
  update_attributes(attributes)
75
100
  end
76
101
 
77
102
  # Save the model copying other model's permissions.
78
103
  #--------------------------------------------------------------------------
79
104
  def save_with_model_permissions(model)
80
- self.access = model.access
81
- if model.access == "Shared"
82
- model.permissions.each do |permission|
83
- self.permissions << Permission.new(:user_id => permission.user_id, :asset => self)
84
- end
85
- end
105
+ self.access = model.access
106
+ self.user_ids = model.user_ids
107
+ self.group_ids = model.group_ids
86
108
  save
87
109
  end
88
-
110
+
89
111
  end
90
112
 
91
113
  module SingletonMethods
@@ -95,4 +117,3 @@ module FatFreeCRM
95
117
  end # FatFreeCRM
96
118
 
97
119
  ActiveRecord::Base.send(:include, FatFreeCRM::Permissions)
98
-
@@ -19,7 +19,7 @@ module FatFreeCRM
19
19
  module VERSION #:nodoc:
20
20
  MAJOR = 0
21
21
  MINOR = 11
22
- TINY = 3
22
+ TINY = 4
23
23
  PRE = nil
24
24
 
25
25
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
@@ -0,0 +1,95 @@
1
+ # Fat Free CRM
2
+ # Copyright (C) 2008-2011 by Michael Dvorkin
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU Affero General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU Affero General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Affero General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #------------------------------------------------------------------------------
17
+
18
+ module FatFreeCRM
19
+
20
+ # A view factory keeps track of views and the contexts in which they are available.
21
+ #----------------------------------------------------------------------------
22
+ #
23
+ # The context that a view is available for is defined by 'controllers' and 'actions'
24
+ # controllers => ['contacts'] means that the view is available when the contacts controller is used
25
+ # actions => [:index, show] means that the view is available for search listings AND individual records
26
+ # template => 'contacts/index_full' is the partial that is rendered for this view
27
+ # Icon is optional. If specified, it will be passed to asset_path.
28
+ #
29
+ class ViewFactory
30
+
31
+ include Comparable
32
+
33
+ @@views = []
34
+ attr_accessor :id, :name, :icon, :title, :controllers, :actions, :template
35
+
36
+ # Class methods
37
+ #----------------------------------------------------------------------------
38
+ class << self
39
+
40
+ # Register with the view factory
41
+ #----------------------------------------------------------------------------
42
+ def register(view)
43
+ @@views << view unless @@views.map(&:id).include?(view.id)
44
+ end
45
+
46
+ # Return views that are available based on context
47
+ #----------------------------------------------------------------------------
48
+ def views_for(options = {})
49
+ controller = options[:controller]
50
+ action = options[:action]
51
+ name = options[:name] #optional
52
+ @@views.select do |view|
53
+ view.controllers.include?(controller) and view.actions.include?(action) and (name.present? ? view.name == name : true)
54
+ end
55
+ end
56
+
57
+ # Return template name of the current view
58
+ # pass in options[:name] to specify view name
59
+ #----------------------------------------------------------------------------
60
+ def template_for_current_view(options = {})
61
+ view = views_for(options).first
62
+ view && view.template
63
+ end
64
+
65
+ end
66
+
67
+ # Instance methods
68
+ #----------------------------------------------------------------------------
69
+ def initialize(options = {})
70
+ self.name = options[:name]
71
+ self.title = options[:title]
72
+ self.icon = options[:icon] # optional
73
+ self.controllers = options[:controllers] || []
74
+ self.actions = options[:actions] || []
75
+ self.template = options[:template]
76
+ self.id = generate_id
77
+ self.class.register(self)
78
+ end
79
+
80
+ # Define view equivalence. They are the same if they have the same id.
81
+ #----------------------------------------------------------------------------
82
+ def <=>(other)
83
+ id <=> other.id
84
+ end
85
+
86
+ private
87
+
88
+ # This defines what it means for one view to be different to another
89
+ #----------------------------------------------------------------------------
90
+ def generate_id
91
+ [name, controllers.sort, actions.sort].flatten.map(&:to_s).map(&:underscore).join('_')
92
+ end
93
+
94
+ end
95
+ end
@@ -18,7 +18,15 @@ module ActionView
18
18
  priority_countries = ["United States", "Argentina", "Australia", "Brasil", "Canada", "Finland", "France", "Germany", "Italy", "Japan", "Mexico", "Norway", "Poland", "Portugal", "Spain", "Sweden", "Russia", "United Kingdom"]
19
19
  end
20
20
 
21
- country_options += options_for_select(priority_countries, selected)
21
+ # Add iso code for priority countries
22
+ priority_countries_iso = COUNTRIES.select{|c| priority_countries.include?(c[0]) }
23
+
24
+ # Add iso code for selected countries if not nil
25
+ unless selected.nil?
26
+ selected = COUNTRIES.select{|c| selected.include?(c[1]) }.flatten
27
+ end
28
+
29
+ country_options += options_for_select(priority_countries_iso, selected)
22
30
  country_options += "<option value=\"\" disabled=\"disabled\">-------------</option>\n"
23
31
 
24
32
  other_countries = COUNTRIES.select{|c| !priority_countries.include?(c[0]) }
@@ -27,497 +35,509 @@ module ActionView
27
35
  # All the countries included in the country_options output.
28
36
 
29
37
  COUNTRIES = [
30
- ['Andorra', 'AN'],
31
- ['United Arab Emirates', 'AE'],
32
38
  ['Afghanistan', 'AF'],
33
- ['Antigua and Barbuda', 'AC'],
34
- ['Anguilla', 'AV'],
39
+ ['Aland Islands', 'AX'],
35
40
  ['Albania', 'AL'],
36
- ['Armenia', 'AM'],
37
- ['Netherlands Antilles', 'NT'],
41
+ ['Algeria', 'DZ'],
42
+ ['American Samoa', 'AS'],
43
+ ['Andorra', 'AD'],
38
44
  ['Angola', 'AO'],
39
- ['Antarctica', 'AY'],
45
+ ['Anguilla', 'AI'],
46
+ ['Antarctica', 'AQ'],
47
+ ['Antigua and Barbuda', 'AG'],
40
48
  ['Argentina', 'AR'],
41
- ['American Samoa', 'AQ'],
42
- ['Austria', 'AU'],
43
- ['Australia', 'AS'],
44
- ['Aruba', 'AA'],
45
- ['Aland Islands', 'FI'],
46
- ['Azerbaijan', 'AJ'],
47
- ['Bosnia and Herzegovina', 'BK'],
49
+ ['Armenia', 'AM'],
50
+ ['Aruba', 'AW'],
51
+ ['Australia', 'AU'],
52
+ ['Austria', 'AT'],
53
+ ['Azerbaijan', 'AZ'],
54
+ ['Bahamas', 'BS'],
55
+ ['Bahrain', 'BH'],
56
+ ['Bangladesh', 'BD'],
48
57
  ['Barbados', 'BB'],
49
- ['Bangladesh', 'BG'],
58
+ ['Belarus', 'BY'],
50
59
  ['Belgium', 'BE'],
51
- ['Burkina Faso', 'UV'],
52
- ['Bulgaria', 'BU'],
53
- ['Bahrain', 'BA'],
54
- ['Burundi', 'BY'],
55
- ['Benin', 'BN'],
56
- ['Bermuda', 'BD'],
57
- ['Brunei', 'BX'],
58
- ['Bolivia', 'BL'],
59
- ['Brazil', 'BR'],
60
- ['Bahamas', 'BF'],
60
+ ['Belize', 'BZ'],
61
+ ['Benin', 'BJ'],
62
+ ['Bermuda', 'BM'],
61
63
  ['Bhutan', 'BT'],
64
+ ['Bolivia, Plurinational State of', 'BO'],
65
+ ['Bonaire, Sint Eustatius and Saba', 'BQ'],
66
+ ['Bosnia and Herzegovina', 'BA'],
67
+ ['Botswana', 'BW'],
62
68
  ['Bouvet Island', 'BV'],
63
- ['Botswana', 'BC'],
64
- ['Belarus', 'BO'],
65
- ['Belize', 'BH'],
66
- ['Canada', 'CA'],
67
- ['Cocos (Keeling) Islands', 'CK'],
68
- ['Congo (Kinshasa)', 'CG'],
69
- ['Central African Republic', 'CT'],
70
- ['Congo (Brazzaville)', 'CF'],
71
- ['Switzerland', 'SZ'],
72
- ['Ivory Coast', 'IV'],
73
- ['Cook Islands', 'CW'],
74
- ['Chile', 'CI'],
69
+ ['Brazil', 'BR'],
70
+ ['British Indian Ocean Territory', 'IO'],
71
+ ['Brunei Darussalam', 'BN'],
72
+ ['Bulgaria', 'BG'],
73
+ ['Burkina Faso', 'BF'],
74
+ ['Burundi', 'BI'],
75
+ ['Cambodia', 'KH'],
75
76
  ['Cameroon', 'CM'],
76
- ['China', 'CH'],
77
+ ['Canada', 'CA'],
78
+ ['Cape Verde', 'CV'],
79
+ ['Cayman Islands', 'KY'],
80
+ ['Central African Republic', 'CF'],
81
+ ['Chad', 'TD'],
82
+ ['Chile', 'CL'],
83
+ ['China', 'CN'],
84
+ ['Christmas Island', 'CX'],
85
+ ['Cocos (Keeling) Islands', 'CC'],
77
86
  ['Colombia', 'CO'],
78
- ['Costa Rica', 'CS'],
79
- ['Serbia And Montenegro', 'YI'],
87
+ ['Comoros', 'KM'],
88
+ ['Congo', 'CG'],
89
+ ['Congo, the Democratic Republic of the', 'CD'],
90
+ ['Cook Islands', 'CK'],
91
+ ['Costa Rica', 'CR'],
92
+ ['Cote d\'Ivoire', 'CI'],
93
+ ['Croatia', 'HR'],
80
94
  ['Cuba', 'CU'],
81
- ['Cape Verde', 'CV'],
82
- ['Christmas Island', 'KT'],
95
+ ['Curacao', 'CW'],
83
96
  ['Cyprus', 'CY'],
84
- ['Czech Republic', 'EZ'],
85
- ['Germany', 'GM'],
97
+ ['Czech Republic', 'CZ'],
98
+ ['Denmark', 'DK'],
86
99
  ['Djibouti', 'DJ'],
87
- ['Denmark', 'DA'],
88
- ['Dominica', 'DO'],
89
- ['Dominican Republic', 'DR'],
90
- ['Algeria', 'AG'],
100
+ ['Dominica', 'DM'],
101
+ ['Dominican Republic', 'DO'],
91
102
  ['Ecuador', 'EC'],
92
- ['Estonia', 'EN'],
93
103
  ['Egypt', 'EG'],
94
- ['Western Sahara', 'WI'],
104
+ ['El Salvador', 'SV'],
105
+ ['Equatorial Guinea', 'GQ'],
95
106
  ['Eritrea', 'ER'],
96
- ['Spain', 'SP'],
107
+ ['Estonia', 'EE'],
97
108
  ['Ethiopia', 'ET'],
98
- ['Finland', 'FI'],
99
- ['Fiji', 'FJ'],
100
- ['Falkland Islands', 'FK'],
101
- ['Micronesia', 'FM'],
109
+ ['Falkland Islands (Malvinas)', 'FK'],
102
110
  ['Faroe Islands', 'FO'],
111
+ ['Fiji', 'FJ'],
112
+ ['Finland', 'FI'],
103
113
  ['France', 'FR'],
104
- ['Gabon', 'GB'],
105
- ['United Kingdom', 'UK'],
106
- ['Grenada', 'GJ'],
107
- ['Georgia', 'GG'],
108
- ['French Guiana', 'FG'],
109
- ['Guernsey', 'GK'],
114
+ ['French Guiana', 'GF'],
115
+ ['French Polynesia', 'PF'],
116
+ ['French Southern Territories', 'TF'],
117
+ ['Gabon', 'GA'],
118
+ ['Gambia', 'GM'],
119
+ ['Georgia', 'GE'],
120
+ ['Germany', 'DE'],
110
121
  ['Ghana', 'GH'],
111
122
  ['Gibraltar', 'GI'],
123
+ ['Greece', 'GR'],
112
124
  ['Greenland', 'GL'],
113
- ['Gambia', 'GA'],
114
- ['Guinea', 'GV'],
125
+ ['Grenada', 'GD'],
115
126
  ['Guadeloupe', 'GP'],
116
- ['Equatorial Guinea', 'EK'],
117
- ['Greece', 'GR'],
118
- ['South Georgia and the South Sandwich Islands', 'SX'],
127
+ ['Guam', 'GU'],
119
128
  ['Guatemala', 'GT'],
120
- ['Guam', 'GQ'],
121
- ['Guinea-Bissau', 'PU'],
129
+ ['Guernsey', 'GG'],
130
+ ['Guinea', 'GN'],
131
+ ['Guinea-Bissau', 'GW'],
122
132
  ['Guyana', 'GY'],
123
- ['Hong Kong S.A.R., China', 'HK'],
133
+ ['Haiti', 'HT'],
124
134
  ['Heard Island and McDonald Islands', 'HM'],
125
- ['Honduras', 'HO'],
126
- ['Croatia', 'HR'],
127
- ['Haiti', 'HA'],
135
+ ['Holy See (Vatican City State)', 'VA'],
136
+ ['Honduras', 'HN'],
137
+ ['Hong Kong', 'HK'],
128
138
  ['Hungary', 'HU'],
139
+ ['Iceland', 'IS'],
140
+ ['India', 'IN'],
129
141
  ['Indonesia', 'ID'],
130
- ['Ireland', 'EI'],
131
- ['Israel', 'IS'],
142
+ ['Iran, Islamic Republic of', 'IR'],
143
+ ['Iraq', 'IQ'],
144
+ ['Ireland', 'IE'],
132
145
  ['Isle of Man', 'IM'],
133
- ['India', 'IN'],
134
- ['British Indian Ocean Territory', 'IO'],
135
- ['Iraq', 'IZ'],
136
- ['Iran', 'IR'],
137
- ['Iceland', 'IC'],
146
+ ['Israel', 'IL'],
138
147
  ['Italy', 'IT'],
139
- ['Jersey', 'JE'],
140
148
  ['Jamaica', 'JM'],
149
+ ['Japan', 'JP'],
150
+ ['Jersey', 'JE'],
141
151
  ['Jordan', 'JO'],
142
- ['Japan', 'JA'],
152
+ ['Kazakhstan', 'KZ'],
143
153
  ['Kenya', 'KE'],
154
+ ['Kiribati', 'KI'],
155
+ ['Korea, Democratic People\'s Republic of', 'KP'],
156
+ ['Korea, Republic of', 'KR'],
157
+ ['Kosovo', 'XK'],
158
+ ['Kuwait', 'KW'],
144
159
  ['Kyrgyzstan', 'KG'],
145
- ['Cambodia', 'CB'],
146
- ['Kiribati', 'KR'],
147
- ['Comoros', 'CN'],
148
- ['Saint Kitts and Nevis', 'SC'],
149
- ['North Korea', 'KN'],
150
- ['South Korea', 'KS'],
151
- ['Kuwait', 'KU'],
152
- ['Cayman Islands', 'CJ'],
153
- ['Kazakhstan', 'KZ'],
154
- ['Laos', 'LA'],
155
- ['Lebanon', 'LE'],
156
- ['Saint Lucia', 'ST'],
157
- ['Liechtenstein', 'LS'],
158
- ['Sri Lanka', 'CE'],
159
- ['Liberia', 'LI'],
160
- ['Lesotho', 'LT'],
161
- ['Lithuania', 'LH'],
162
- ['Luxembourg', 'LU'],
163
- ['Latvia', 'LG'],
160
+ ['Lao People\'s Democratic Republic', 'LA'],
161
+ ['Latvia', 'LV'],
162
+ ['Lebanon', 'LB'],
163
+ ['Lesotho', 'LS'],
164
+ ['Liberia', 'LR'],
164
165
  ['Libya', 'LY'],
165
- ['Morocco', 'MO'],
166
- ['Monaco', 'MN'],
167
- ['Moldova', 'MD'],
168
- ['Montenegro', 'MJ'],
169
- ['Madagascar', 'MA'],
170
- ['Marshall Islands', 'RM'],
171
- ['Macedonia', 'MK'],
166
+ ['Liechtenstein', 'LI'],
167
+ ['Lithuania', 'LT'],
168
+ ['Luxembourg', 'LU'],
169
+ ['Macao', 'MO'],
170
+ ['Macedonia, The Former Yugoslav Republic of', 'MK'],
171
+ ['Madagascar', 'MG'],
172
+ ['Malawi', 'MW'],
173
+ ['Malaysia', 'MY'],
174
+ ['Maldives', 'MV'],
172
175
  ['Mali', 'ML'],
173
- ['Myanmar', 'BM'],
174
- ['Mongolia', 'MG'],
175
- ['Macao S.A.R., China', 'MC'],
176
- ['Northern Mariana Islands', 'CQ'],
177
- ['Martinique', 'MB'],
178
- ['Mauritania', 'MR'],
179
- ['Montserrat', 'MH'],
180
176
  ['Malta', 'MT'],
181
- ['Mauritius', 'MP'],
182
- ['Maldives', 'MV'],
183
- ['Malawi', 'MI'],
177
+ ['Marshall Islands', 'MH'],
178
+ ['Martinique', 'MQ'],
179
+ ['Mauritania', 'MR'],
180
+ ['Mauritius', 'MU'],
181
+ ['Mayotte', 'YT'],
184
182
  ['Mexico', 'MX'],
185
- ['Malaysia', 'MY'],
183
+ ['Micronesia, Federated States of', 'FM'],
184
+ ['Moldova, Republic of', 'MD'],
185
+ ['Monaco', 'MC'],
186
+ ['Mongolia', 'MN'],
187
+ ['Montenegro', 'ME'],
188
+ ['Montserrat', 'MS'],
189
+ ['Morocco', 'MA'],
186
190
  ['Mozambique', 'MZ'],
187
- ['Namibia', 'WA'],
191
+ ['Myanmar', 'MM'],
192
+ ['Namibia', 'NA'],
193
+ ['Nauru', 'NR'],
194
+ ['Nepal', 'NP'],
195
+ ['Netherlands', 'NL'],
188
196
  ['New Caledonia', 'NC'],
189
- ['Niger', 'NG'],
197
+ ['New Zealand', 'NZ'],
198
+ ['Nicaragua', 'NI'],
199
+ ['Niger', 'NE'],
200
+ ['Nigeria', 'NG'],
201
+ ['Niue', 'NU'],
190
202
  ['Norfolk Island', 'NF'],
191
- ['Nigeria', 'NI'],
192
- ['Nicaragua', 'NU'],
193
- ['Netherlands', 'NL'],
203
+ ['Northern Mariana Islands', 'MP'],
194
204
  ['Norway', 'NO'],
195
- ['Nepal', 'NP'],
196
- ['Nauru', 'NR'],
197
- ['Niue', 'NE'],
198
- ['New Zealand', 'NZ'],
199
- ['Oman', 'MU'],
200
- ['Panama', 'PM'],
201
- ['Peru', 'PE'],
202
- ['French Polynesia', 'FP'],
203
- ['Papua New Guinea', 'PP'],
204
- ['Philippines', 'RP'],
205
+ ['Oman', 'OM'],
205
206
  ['Pakistan', 'PK'],
207
+ ['Palau', 'PW'],
208
+ ['Palestinian Territory, Occupied', 'PS'],
209
+ ['Panama', 'PA'],
210
+ ['Papua New Guinea', 'PG'],
211
+ ['Paraguay', 'PY'],
212
+ ['Peru', 'PE'],
213
+ ['Philippines', 'PH'],
214
+ ['Pitcairn', 'PN'],
206
215
  ['Poland', 'PL'],
207
- ['Saint Pierre and Miquelon', 'SB'],
208
- ['Pitcairn', 'PC'],
209
- ['Puerto Rico', 'RQ'],
210
- ['Palestinian Territory', 'WE'],
211
- ['Portugal', 'PO'],
212
- ['Palau', 'PS'],
213
- ['Paraguay', 'PA'],
216
+ ['Portugal', 'PT'],
217
+ ['Puerto Rico', 'PR'],
214
218
  ['Qatar', 'QA'],
215
219
  ['Reunion', 'RE'],
216
220
  ['Romania', 'RO'],
217
- ['Serbia', 'RB'],
218
- ['Russia', 'RS'],
221
+ ['Russian Federation', 'RU'],
219
222
  ['Rwanda', 'RW'],
223
+ ['Saint Barthelemy', 'BL'],
224
+ ['Saint Helena, Ascension and Tristan da Cunha', 'SH'],
225
+ ['Saint Kitts and Nevis', 'KN'],
226
+ ['Saint Lucia', 'LC'],
227
+ ['Saint Martin (French part)', 'MF'],
228
+ ['Saint Pierre and Miquelon', 'PM'],
229
+ ['Saint Vincent and the Grenadines', 'VC'],
230
+ ['Samoa', 'WS'],
231
+ ['San Marino', 'SM'],
232
+ ['Sao Tome and Principe', 'ST'],
220
233
  ['Saudi Arabia', 'SA'],
221
- ['Solomon Islands', 'BP'],
222
- ['Seychelles', 'SE'],
223
- ['Sudan', 'SU'],
224
- ['Sweden', 'SW'],
225
- ['Singapore', 'SN'],
226
- ['Saint Helena', 'SH'],
227
- ['Slovenia', 'SI'],
228
- ['Svalbard and Jan Mayen', 'SV'],
229
- ['Slovakia', 'LO'],
234
+ ['Senegal', 'SN'],
235
+ ['Serbia', 'RS'],
236
+ ['Seychelles', 'SC'],
230
237
  ['Sierra Leone', 'SL'],
231
- ['San Marino', 'SM'],
232
- ['Senegal', 'SG'],
238
+ ['Singapore', 'SG'],
239
+ ['Sint Maarten (Dutch part)', 'SX'],
240
+ ['Slovakia', 'SK'],
241
+ ['Slovenia', 'SI'],
242
+ ['Solomon Islands', 'SB'],
233
243
  ['Somalia', 'SO'],
234
- ['Suriname', 'NS'],
235
- ['Sao Tome and Principe', 'TP'],
236
- ['El Salvador', 'ES'],
237
- ['Syria', 'SY'],
238
- ['Swaziland', 'WZ'],
239
- ['Turks and Caicos Islands', 'TK'],
240
- ['Chad', 'CD'],
241
- ['French Southern Territories', 'FS'],
242
- ['Togo', 'TO'],
244
+ ['South Africa', 'ZA'],
245
+ ['South Georgia and the South Sandwich Islands', 'GS'],
246
+ ['South Sudan', 'SS'],
247
+ ['Spain', 'ES'],
248
+ ['Sri Lanka', 'LK'],
249
+ ['Sudan', 'SD'],
250
+ ['Suriname', 'SR'],
251
+ ['Svalbard and Jan Mayen', 'SJ'],
252
+ ['Swaziland', 'SZ'],
253
+ ['Sweden', 'SE'],
254
+ ['Switzerland', 'CH'],
255
+ ['Syrian Arab Republic', 'SY'],
256
+ ['Taiwan, Province of China', 'TW'],
257
+ ['Tajikistan', 'TJ'],
258
+ ['Tanzania, United Republic of', 'TZ'],
243
259
  ['Thailand', 'TH'],
244
- ['Tajikistan', 'TI'],
245
- ['Tokelau', 'TL'],
246
- ['East Timor', 'TT'],
247
- ['Turkmenistan', 'TX'],
248
- ['Tunisia', 'TS'],
249
- ['Tonga', 'TN'],
250
- ['Turkey', 'TU'],
251
- ['Trinidad and Tobago', 'TD'],
260
+ ['Timor-Leste', 'TL'],
261
+ ['Togo', 'TG'],
262
+ ['Tokelau', 'TK'],
263
+ ['Tonga', 'TO'],
264
+ ['Trinidad and Tobago', 'TT'],
265
+ ['Tunisia', 'TN'],
266
+ ['Turkey', 'TR'],
267
+ ['Turkmenistan', 'TM'],
268
+ ['Turks and Caicos Islands', 'TC'],
252
269
  ['Tuvalu', 'TV'],
253
- ['Taiwan', 'TW'],
254
- ['Tanzania', 'TZ'],
255
- ['Ukraine', 'UP'],
256
270
  ['Uganda', 'UG'],
271
+ ['Ukraine', 'UA'],
272
+ ['United Arab Emirates', 'AE'],
273
+ ['United Kingdom', 'GB'],
257
274
  ['United States', 'US'],
275
+ ['United States Minor Outlying Islands', 'UM'],
258
276
  ['Uruguay', 'UY'],
259
277
  ['Uzbekistan', 'UZ'],
260
- ['Vatican', 'VT'],
261
- ['Saint Vincent and the Grenadines', 'VC'],
262
- ['Venezuela', 'VE'],
263
- ['British Virgin Islands', 'VI'],
264
- ['U.S. Virgin Islands', 'VQ'],
265
- ['Vietnam', 'VM'],
266
- ['Vanuatu', 'NH'],
278
+ ['Vanuatu', 'VU'],
279
+ ['Venezuela, Bolivarian Republic of', 'VE'],
280
+ ['Viet Nam', 'VN'],
281
+ ['Virgin Islands, British', 'VG'],
282
+ ['Virgin Islands, U.S.', 'VI'],
267
283
  ['Wallis and Futuna', 'WF'],
268
- ['Samoa', 'WS'],
269
- ['Yemen', 'YM'],
270
- ['Mayotte', 'MF'],
271
- ['South Africa', 'SF'],
272
- ['Zambia', 'ZA'],
273
- ['Zimbabwe', 'ZI']
284
+ ['Western Sahara', 'EH'],
285
+ ['Yemen', 'YE'],
286
+ ['Zambia', 'ZM'],
287
+ ['Zimbabwe', 'ZW']
274
288
  ].sort unless const_defined?("COUNTRIES")
275
289
 
276
290
  COUNTRIES_HASH = {
277
- :AN => 'Andorra',
278
- :AE => 'United Arab Emirates',
279
291
  :AF => 'Afghanistan',
280
- :AC => 'Antigua and Barbuda',
281
- :AV => 'Anguilla',
292
+ :AX => 'Aland Islands',
282
293
  :AL => 'Albania',
283
- :AM => 'Armenia',
284
- :NT => 'Netherlands Antilles',
294
+ :DZ => 'Algeria',
295
+ :AS => 'American Samoa',
296
+ :AD => 'Andorra',
285
297
  :AO => 'Angola',
286
- :AY => 'Antarctica',
298
+ :AI => 'Anguilla',
299
+ :AQ => 'Antarctica',
300
+ :AG => 'Antigua and Barbuda',
287
301
  :AR => 'Argentina',
288
- :AQ => 'American Samoa',
289
- :AU => 'Austria',
290
- :AS => 'Australia',
291
- :AA => 'Aruba',
292
- :FI => 'Aland Islands',
293
- :AJ => 'Azerbaijan',
294
- :BK => 'Bosnia and Herzegovina',
302
+ :AM => 'Armenia',
303
+ :AW => 'Aruba',
304
+ :AU => 'Australia',
305
+ :AT => 'Austria',
306
+ :AZ => 'Azerbaijan',
307
+ :BS => 'Bahamas',
308
+ :BH => 'Bahrain',
309
+ :BD => 'Bangladesh',
295
310
  :BB => 'Barbados',
296
- :BG => 'Bangladesh',
311
+ :BY => 'Belarus',
297
312
  :BE => 'Belgium',
298
- :UV => 'Burkina Faso',
299
- :BU => 'Bulgaria',
300
- :BA => 'Bahrain',
301
- :BY => 'Burundi',
302
- :BN => 'Benin',
303
- :BD => 'Bermuda',
304
- :BX => 'Brunei',
305
- :BL => 'Bolivia',
306
- :BR => 'Brazil',
307
- :BF => 'Bahamas',
313
+ :BZ => 'Belize',
314
+ :BJ => 'Benin',
315
+ :BM => 'Bermuda',
308
316
  :BT => 'Bhutan',
317
+ :BO => 'Bolivia, Plurinational State of',
318
+ :BQ => 'Bonaire, Sint Eustatius and Saba',
319
+ :BA => 'Bosnia and Herzegovina',
320
+ :BW => 'Botswana',
309
321
  :BV => 'Bouvet Island',
310
- :BC => 'Botswana',
311
- :BO => 'Belarus',
312
- :BH => 'Belize',
313
- :CA => 'Canada',
314
- :CK => 'Cocos (Keeling) Islands',
315
- :CG => 'Congo (Kinshasa)',
316
- :CT => 'Central African Republic',
317
- :CF => 'Congo (Brazzaville)',
318
- :SZ => 'Switzerland',
319
- :IV => 'Ivory Coast',
320
- :CW => 'Cook Islands',
321
- :CI => 'Chile',
322
+ :BR => 'Brazil',
323
+ :IO => 'British Indian Ocean Territory',
324
+ :BN => 'Brunei Darussalam',
325
+ :BG => 'Bulgaria',
326
+ :BF => 'Burkina Faso',
327
+ :BI => 'Burundi',
328
+ :KH => 'Cambodia',
322
329
  :CM => 'Cameroon',
323
- :CH => 'China',
330
+ :CA => 'Canada',
331
+ :CV => 'Cape Verde',
332
+ :KY => 'Cayman Islands',
333
+ :CF => 'Central African Republic',
334
+ :TD => 'Chad',
335
+ :CL => 'Chile',
336
+ :CN => 'China',
337
+ :CX => 'Christmas Island',
338
+ :CC => 'Cocos (Keeling) Islands',
324
339
  :CO => 'Colombia',
325
- :CS => 'Costa Rica',
326
- :YI => 'Serbia And Montenegro',
340
+ :KM => 'Comoros',
341
+ :CG => 'Congo',
342
+ :CD => 'Congo, the Democratic Republic of the',
343
+ :CK => 'Cook Islands',
344
+ :CR => 'Costa Rica',
345
+ :CI => 'Cote d\'Ivoire',
346
+ :HR => 'Croatia',
327
347
  :CU => 'Cuba',
328
- :CV => 'Cape Verde',
329
- :KT => 'Christmas Island',
348
+ :CW => 'Curacao',
330
349
  :CY => 'Cyprus',
331
- :EZ => 'Czech Republic',
332
- :GM => 'Germany',
350
+ :CZ => 'Czech Republic',
351
+ :DK => 'Denmark',
333
352
  :DJ => 'Djibouti',
334
- :DA => 'Denmark',
335
- :DO => 'Dominica',
336
- :DR => 'Dominican Republic',
337
- :AG => 'Algeria',
353
+ :DM => 'Dominica',
354
+ :DO => 'Dominican Republic',
338
355
  :EC => 'Ecuador',
339
- :EN => 'Estonia',
340
356
  :EG => 'Egypt',
341
- :WI => 'Western Sahara',
357
+ :SV => 'El Salvador',
358
+ :GQ => 'Equatorial Guinea',
342
359
  :ER => 'Eritrea',
343
- :SP => 'Spain',
360
+ :EE => 'Estonia',
344
361
  :ET => 'Ethiopia',
345
- :FI => 'Finland',
346
- :FJ => 'Fiji',
347
- :FK => 'Falkland Islands',
348
- :FM => 'Micronesia',
362
+ :FK => 'Falkland Islands (Malvinas)',
349
363
  :FO => 'Faroe Islands',
364
+ :FJ => 'Fiji',
365
+ :FI => 'Finland',
350
366
  :FR => 'France',
351
- :GB => 'Gabon',
352
- :UK => 'United Kingdom',
353
- :GJ => 'Grenada',
354
- :GG => 'Georgia',
355
- :FG => 'French Guiana',
356
- :GK => 'Guernsey',
367
+ :GF => 'French Guiana',
368
+ :PF => 'French Polynesia',
369
+ :TF => 'French Southern Territories',
370
+ :GA => 'Gabon',
371
+ :GM => 'Gambia',
372
+ :GE => 'Georgia',
373
+ :DE => 'Germany',
357
374
  :GH => 'Ghana',
358
375
  :GI => 'Gibraltar',
376
+ :GR => 'Greece',
359
377
  :GL => 'Greenland',
360
- :GA => 'Gambia',
361
- :GV => 'Guinea',
378
+ :GD => 'Grenada',
362
379
  :GP => 'Guadeloupe',
363
- :EK => 'Equatorial Guinea',
364
- :GR => 'Greece',
365
- :SX => 'South Georgia and the South Sandwich Islands',
380
+ :GU => 'Guam',
366
381
  :GT => 'Guatemala',
367
- :GQ => 'Guam',
368
- :PU => 'Guinea-Bissau',
382
+ :GG => 'Guernsey',
383
+ :GN => 'Guinea',
384
+ :GW => 'Guinea-Bissau',
369
385
  :GY => 'Guyana',
370
- :HK => 'Hong Kong S.A.R., China',
386
+ :HT => 'Haiti',
371
387
  :HM => 'Heard Island and McDonald Islands',
372
- :HO => 'Honduras',
373
- :HR => 'Croatia',
374
- :HA => 'Haiti',
388
+ :VA => 'Holy See (Vatican City State)',
389
+ :HN => 'Honduras',
390
+ :HK => 'Hong Kong',
375
391
  :HU => 'Hungary',
392
+ :IS => 'Iceland',
393
+ :IN => 'India',
376
394
  :ID => 'Indonesia',
377
- :EI => 'Ireland',
378
- :IS => 'Israel',
395
+ :IR => 'Iran, Islamic Republic of',
396
+ :IQ => 'Iraq',
397
+ :IE => 'Ireland',
379
398
  :IM => 'Isle of Man',
380
- :IN => 'India',
381
- :IO => 'British Indian Ocean Territory',
382
- :IZ => 'Iraq',
383
- :IR => 'Iran',
384
- :IC => 'Iceland',
399
+ :IL => 'Israel',
385
400
  :IT => 'Italy',
386
- :JE => 'Jersey',
387
401
  :JM => 'Jamaica',
402
+ :JP => 'Japan',
403
+ :JE => 'Jersey',
388
404
  :JO => 'Jordan',
389
- :JA => 'Japan',
405
+ :KZ => 'Kazakhstan',
390
406
  :KE => 'Kenya',
407
+ :KI => 'Kiribati',
408
+ :KP => 'Korea, Democratic People\'s Republic of',
409
+ :KR => 'Korea, Republic of',
410
+ :XK => 'Kosovo',
411
+ :KW => 'Kuwait',
391
412
  :KG => 'Kyrgyzstan',
392
- :CB => 'Cambodia',
393
- :KR => 'Kiribati',
394
- :CN => 'Comoros',
395
- :SC => 'Saint Kitts and Nevis',
396
- :KN => 'North Korea',
397
- :KS => 'South Korea',
398
- :KU => 'Kuwait',
399
- :CJ => 'Cayman Islands',
400
- :KZ => 'Kazakhstan',
401
- :LA => 'Laos',
402
- :LE => 'Lebanon',
403
- :ST => 'Saint Lucia',
404
- :LS => 'Liechtenstein',
405
- :CE => 'Sri Lanka',
406
- :LI => 'Liberia',
407
- :LT => 'Lesotho',
408
- :LH => 'Lithuania',
409
- :LU => 'Luxembourg',
410
- :LG => 'Latvia',
413
+ :LA => 'Lao People\'s Democratic Republic',
414
+ :LV => 'Latvia',
415
+ :LB => 'Lebanon',
416
+ :LS => 'Lesotho',
417
+ :LR => 'Liberia',
411
418
  :LY => 'Libya',
412
- :MO => 'Morocco',
413
- :MN => 'Monaco',
414
- :MD => 'Moldova',
415
- :MJ => 'Montenegro',
416
- :MA => 'Madagascar',
417
- :RM => 'Marshall Islands',
418
- :MK => 'Macedonia',
419
+ :LI => 'Liechtenstein',
420
+ :LT => 'Lithuania',
421
+ :LU => 'Luxembourg',
422
+ :MO => 'Macao',
423
+ :MK => 'Macedonia, The Former Yugoslav Republic of',
424
+ :MG => 'Madagascar',
425
+ :MW => 'Malawi',
426
+ :MY => 'Malaysia',
427
+ :MV => 'Maldives',
419
428
  :ML => 'Mali',
420
- :BM => 'Myanmar',
421
- :MG => 'Mongolia',
422
- :MC => 'Macao S.A.R., China',
423
- :CQ => 'Northern Mariana Islands',
424
- :MB => 'Martinique',
425
- :MR => 'Mauritania',
426
- :MH => 'Montserrat',
427
429
  :MT => 'Malta',
428
- :MP => 'Mauritius',
429
- :MV => 'Maldives',
430
- :MI => 'Malawi',
430
+ :MH => 'Marshall Islands',
431
+ :MQ => 'Martinique',
432
+ :MR => 'Mauritania',
433
+ :MU => 'Mauritius',
434
+ :YT => 'Mayotte',
431
435
  :MX => 'Mexico',
432
- :MY => 'Malaysia',
436
+ :FM => 'Micronesia, Federated States of',
437
+ :MD => 'Moldova, Republic of',
438
+ :MC => 'Monaco',
439
+ :MN => 'Mongolia',
440
+ :ME => 'Montenegro',
441
+ :MS => 'Montserrat',
442
+ :MA => 'Morocco',
433
443
  :MZ => 'Mozambique',
434
- :WA => 'Namibia',
444
+ :MM => 'Myanmar',
445
+ :NA => 'Namibia',
446
+ :NR => 'Nauru',
447
+ :NP => 'Nepal',
448
+ :NL => 'Netherlands',
435
449
  :NC => 'New Caledonia',
436
- :NG => 'Niger',
450
+ :NZ => 'New Zealand',
451
+ :NI => 'Nicaragua',
452
+ :NE => 'Niger',
453
+ :NG => 'Nigeria',
454
+ :NU => 'Niue',
437
455
  :NF => 'Norfolk Island',
438
- :NI => 'Nigeria',
439
- :NU => 'Nicaragua',
440
- :NL => 'Netherlands',
456
+ :MP => 'Northern Mariana Islands',
441
457
  :NO => 'Norway',
442
- :NP => 'Nepal',
443
- :NR => 'Nauru',
444
- :NE => 'Niue',
445
- :NZ => 'New Zealand',
446
- :MU => 'Oman',
447
- :PM => 'Panama',
448
- :PE => 'Peru',
449
- :FP => 'French Polynesia',
450
- :PP => 'Papua New Guinea',
451
- :RP => 'Philippines',
458
+ :OM => 'Oman',
452
459
  :PK => 'Pakistan',
460
+ :PW => 'Palau',
461
+ :PS => 'Palestinian Territory, Occupied',
462
+ :PA => 'Panama',
463
+ :PG => 'Papua New Guinea',
464
+ :PY => 'Paraguay',
465
+ :PE => 'Peru',
466
+ :PH => 'Philippines',
467
+ :PN => 'Pitcairn',
453
468
  :PL => 'Poland',
454
- :SB => 'Saint Pierre and Miquelon',
455
- :PC => 'Pitcairn',
456
- :RQ => 'Puerto Rico',
457
- :WE => 'Palestinian Territory',
458
- :PO => 'Portugal',
459
- :PS => 'Palau',
460
- :PA => 'Paraguay',
469
+ :PT => 'Portugal',
470
+ :PR => 'Puerto Rico',
461
471
  :QA => 'Qatar',
462
472
  :RE => 'Reunion',
463
473
  :RO => 'Romania',
464
- :RB => 'Serbia',
465
- :RS => 'Russia',
474
+ :RU => 'Russian Federation',
466
475
  :RW => 'Rwanda',
476
+ :BL => 'Saint Barthelemy',
477
+ :SH => 'Saint Helena, Ascension and Tristan da Cunha',
478
+ :KN => 'Saint Kitts and Nevis',
479
+ :LC => 'Saint Lucia',
480
+ :MF => 'Saint Martin (French part)',
481
+ :PM => 'Saint Pierre and Miquelon',
482
+ :VC => 'Saint Vincent and the Grenadines',
483
+ :WS => 'Samoa',
484
+ :SM => 'San Marino',
485
+ :ST => 'Sao Tome and Principe',
467
486
  :SA => 'Saudi Arabia',
468
- :BP => 'Solomon Islands',
469
- :SE => 'Seychelles',
470
- :SU => 'Sudan',
471
- :SW => 'Sweden',
472
- :SN => 'Singapore',
473
- :SH => 'Saint Helena',
474
- :SI => 'Slovenia',
475
- :SV => 'Svalbard and Jan Mayen',
476
- :LO => 'Slovakia',
487
+ :SN => 'Senegal',
488
+ :RS => 'Serbia',
489
+ :SC => 'Seychelles',
477
490
  :SL => 'Sierra Leone',
478
- :SM => 'San Marino',
479
- :SG => 'Senegal',
491
+ :SG => 'Singapore',
492
+ :SX => 'Sint Maarten (Dutch part)',
493
+ :SK => 'Slovakia',
494
+ :SI => 'Slovenia',
495
+ :SB => 'Solomon Islands',
480
496
  :SO => 'Somalia',
481
- :NS => 'Suriname',
482
- :TP => 'Sao Tome and Principe',
483
- :ES => 'El Salvador',
484
- :SY => 'Syria',
485
- :WZ => 'Swaziland',
486
- :TK => 'Turks and Caicos Islands',
487
- :CD => 'Chad',
488
- :FS => 'French Southern Territories',
489
- :TO => 'Togo',
497
+ :ZA => 'South Africa',
498
+ :GS => 'South Georgia and the South Sandwich Islands',
499
+ :SS => 'South Sudan',
500
+ :ES => 'Spain',
501
+ :LK => 'Sri Lanka',
502
+ :SD => 'Sudan',
503
+ :SR => 'Suriname',
504
+ :SJ => 'Svalbard and Jan Mayen',
505
+ :SZ => 'Swaziland',
506
+ :SE => 'Sweden',
507
+ :CH => 'Switzerland',
508
+ :SY => 'Syrian Arab Republic',
509
+ :TW => 'Taiwan, Province of China',
510
+ :TJ => 'Tajikistan',
511
+ :TZ => 'Tanzania, United Republic of',
490
512
  :TH => 'Thailand',
491
- :TI => 'Tajikistan',
492
- :TL => 'Tokelau',
493
- :TT => 'East Timor',
494
- :TX => 'Turkmenistan',
495
- :TS => 'Tunisia',
496
- :TN => 'Tonga',
497
- :TU => 'Turkey',
498
- :TD => 'Trinidad and Tobago',
513
+ :TL => 'Timor-Leste',
514
+ :TG => 'Togo',
515
+ :TK => 'Tokelau',
516
+ :TO => 'Tonga',
517
+ :TT => 'Trinidad and Tobago',
518
+ :TN => 'Tunisia',
519
+ :TR => 'Turkey',
520
+ :TM => 'Turkmenistan',
521
+ :TC => 'Turks and Caicos Islands',
499
522
  :TV => 'Tuvalu',
500
- :TW => 'Taiwan',
501
- :TZ => 'Tanzania',
502
- :UP => 'Ukraine',
503
523
  :UG => 'Uganda',
524
+ :UA => 'Ukraine',
525
+ :AE => 'United Arab Emirates',
526
+ :GB => 'United Kingdom',
504
527
  :US => 'United States',
528
+ :UM => 'United States Minor Outlying Islands',
505
529
  :UY => 'Uruguay',
506
530
  :UZ => 'Uzbekistan',
507
- :VT => 'Vatican',
508
- :VC => 'Saint Vincent and the Grenadines',
509
- :VE => 'Venezuela',
510
- :VI => 'British Virgin Islands',
511
- :VQ => 'U.S. Virgin Islands',
512
- :VM => 'Vietnam',
513
- :NH => 'Vanuatu',
531
+ :VU => 'Vanuatu',
532
+ :VE => 'Venezuela, Bolivarian Republic of',
533
+ :VN => 'Viet Nam',
534
+ :VG => 'Virgin Islands, British',
535
+ :VI => 'Virgin Islands, U.S.',
514
536
  :WF => 'Wallis and Futuna',
515
- :WS => 'Samoa',
516
- :YM => 'Yemen',
517
- :MF => 'Mayotte',
518
- :SF => 'South Africa',
519
- :ZA => 'Zambia',
520
- :ZI => 'Zimbabwe',
537
+ :EH => 'Western Sahara',
538
+ :YE => 'Yemen',
539
+ :ZM => 'Zambia',
540
+ :ZW => 'Zimbabwe',
521
541
  :WW => 'Worldwide'
522
542
  }
523
543
  end
@@ -548,4 +568,3 @@ module ActionView
548
568
  end
549
569
  end
550
570
  end
551
-