decidim 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of decidim might be problematic. Click here for more details.

Files changed (313) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +4 -5
  3. data/.eslintignore +2 -0
  4. data/.eslintrc.json +2 -0
  5. data/.gitignore +1 -0
  6. data/.inch.yml +5 -0
  7. data/.mention-bot +8 -0
  8. data/.rubocop.yml +8 -31
  9. data/.ruby-version +1 -1
  10. data/.travis.yml +24 -14
  11. data/Dockerfile +1 -3
  12. data/Gemfile +1 -3
  13. data/Gemfile.lock +175 -138
  14. data/README.md +63 -5
  15. data/Rakefile +1 -1
  16. data/codecov.yml +1 -0
  17. data/decidim-admin/Rakefile +1 -1
  18. data/decidim-admin/app/assets/javascripts/decidim/admin/application.js.es6 +0 -1
  19. data/decidim-admin/app/assets/stylesheets/decidim/admin/_foundation_and_overrides.scss +1 -0
  20. data/decidim-admin/app/assets/stylesheets/decidim/admin/_icons.scss +9 -0
  21. data/decidim-admin/app/assets/stylesheets/decidim/admin/application.scss +1 -0
  22. data/decidim-admin/app/commands/decidim/admin/create_feature.rb +3 -1
  23. data/decidim-admin/app/commands/decidim/admin/create_participatory_process.rb +26 -14
  24. data/decidim-admin/app/commands/decidim/admin/destroy_feature.rb +5 -0
  25. data/decidim-admin/app/commands/decidim/admin/destroy_participatory_process_step.rb +29 -0
  26. data/decidim-admin/app/commands/decidim/admin/update_feature.rb +47 -0
  27. data/decidim-admin/app/commands/decidim/admin/update_organization.rb +3 -1
  28. data/decidim-admin/app/controllers/decidim/admin/features_controller.rb +37 -2
  29. data/decidim-admin/app/controllers/decidim/admin/participatory_process_step_activations_controller.rb +0 -16
  30. data/decidim-admin/app/controllers/decidim/admin/participatory_process_steps_controller.rb +10 -3
  31. data/decidim-admin/app/controllers/decidim/admin/static_pages_controller.rb +4 -4
  32. data/decidim-admin/app/controllers/decidim/admin/user_groups_controller.rb +32 -0
  33. data/decidim-admin/app/controllers/decidim/admin/users_controller.rb +87 -0
  34. data/decidim-admin/app/forms/decidim/admin/category_form.rb +1 -7
  35. data/decidim-admin/app/forms/decidim/admin/feature_form.rb +26 -0
  36. data/decidim-admin/app/forms/decidim/admin/organization_form.rb +2 -0
  37. data/decidim-admin/app/forms/decidim/admin/participatory_process_step_form.rb +1 -1
  38. data/decidim-admin/app/forms/decidim/admin/static_page_form.rb +2 -3
  39. data/decidim-admin/app/models/decidim/admin/abilities/admin_user.rb +6 -0
  40. data/decidim-admin/app/views/decidim/admin/features/_feature.html.erb +4 -1
  41. data/decidim-admin/app/views/decidim/admin/features/_form.html.erb +49 -0
  42. data/decidim-admin/app/views/decidim/admin/features/_settings_fields.html.erb +5 -0
  43. data/decidim-admin/app/views/decidim/admin/features/edit.html.erb +9 -0
  44. data/decidim-admin/app/views/decidim/admin/features/index.html.erb +6 -0
  45. data/decidim-admin/app/views/decidim/admin/features/new.html.erb +1 -1
  46. data/decidim-admin/app/views/decidim/admin/organization/_form.html.erb +8 -0
  47. data/decidim-admin/app/views/decidim/admin/participatory_process_attachments/_form.html.erb +1 -1
  48. data/decidim-admin/app/views/decidim/admin/participatory_process_steps/index.html.erb +2 -6
  49. data/decidim-admin/app/views/decidim/admin/user_groups/index.html.erb +32 -0
  50. data/decidim-admin/app/views/decidim/admin/users/_form.html.erb +6 -0
  51. data/decidim-admin/app/views/decidim/admin/users/index.html.erb +54 -0
  52. data/decidim-admin/app/views/decidim/admin/users/new.html.erb +11 -0
  53. data/decidim-admin/app/views/layouts/decidim/admin/_sidebar.html.erb +2 -0
  54. data/decidim-admin/app/views/layouts/decidim/admin/participatory_process.html.erb +1 -1
  55. data/decidim-admin/config/i18n-tasks.yml +1 -0
  56. data/decidim-admin/config/locales/ca.yml +103 -5
  57. data/decidim-admin/config/locales/en.yml +57 -4
  58. data/decidim-admin/config/locales/es.yml +103 -5
  59. data/decidim-admin/config/routes.rb +11 -0
  60. data/decidim-admin/decidim-admin.gemspec +2 -3
  61. data/decidim-admin/lib/decidim/admin/features/base_controller.rb +7 -3
  62. data/decidim-admin/lib/decidim/admin/test/factories.rb +8 -0
  63. data/decidim-admin/spec/commands/create_category_spec.rb +2 -1
  64. data/decidim-admin/spec/commands/create_feature_spec.rb +21 -2
  65. data/decidim-admin/spec/commands/create_participatory_process_spec.rb +13 -1
  66. data/decidim-admin/spec/commands/create_static_page_spec.rb +1 -1
  67. data/decidim-admin/spec/commands/destroy_participatory_process_step_spec.rb +45 -0
  68. data/decidim-admin/spec/commands/update_category_spec.rb +2 -1
  69. data/decidim-admin/spec/commands/update_feature_spec.rb +79 -0
  70. data/decidim-admin/spec/commands/update_organization_spec.rb +3 -2
  71. data/decidim-admin/spec/commands/update_static_page_spec.rb +3 -2
  72. data/decidim-admin/spec/factories.rb +2 -9
  73. data/decidim-admin/spec/features/admin_manages_features_spec.rb +84 -2
  74. data/decidim-admin/spec/features/admin_manages_organization_admins_spec.rb +71 -0
  75. data/decidim-admin/spec/features/admin_manages_user_groups_spec.rb +24 -0
  76. data/decidim-admin/spec/forms/category_form_spec.rb +3 -7
  77. data/decidim-admin/spec/forms/organization_form_spec.rb +8 -2
  78. data/decidim-admin/spec/forms/participatory_process_form_spec.rb +2 -1
  79. data/decidim-admin/spec/forms/participatory_process_step_form_spec.rb +2 -21
  80. data/decidim-admin/spec/forms/scope_form_spec.rb +1 -1
  81. data/decidim-admin/spec/forms/static_page_form_spec.rb +2 -7
  82. data/decidim-admin/spec/models/abilities/admin_user_spec.rb +22 -0
  83. data/decidim-admin/spec/shared/manage_process_attachments_examples.rb +2 -1
  84. data/decidim-admin/spec/shared/manage_process_steps_examples.rb +2 -15
  85. data/decidim-admin/spec/spec_helper.rb +3 -1
  86. data/decidim-api/Rakefile +1 -1
  87. data/decidim-api/decidim-api.gemspec +3 -3
  88. data/decidim-api/spec/factories.rb +2 -2
  89. data/decidim-api/spec/spec_helper.rb +3 -1
  90. data/decidim-comments/Rakefile +1 -1
  91. data/decidim-comments/app/assets/javascripts/decidim/comments/bundle.js +0 -0
  92. data/decidim-comments/app/commands/decidim/comments/vote_comment.rb +38 -0
  93. data/decidim-comments/app/frontend/application/icon.component.jsx +9 -4
  94. data/decidim-comments/app/frontend/application/icon.component.test.jsx +12 -2
  95. data/decidim-comments/app/frontend/comments/add_comment_form.component.jsx +43 -11
  96. data/decidim-comments/app/frontend/comments/add_comment_form.mutation.graphql +1 -4
  97. data/decidim-comments/app/frontend/comments/comment.component.jsx +67 -7
  98. data/decidim-comments/app/frontend/comments/comment.component.test.jsx +49 -1
  99. data/decidim-comments/app/frontend/comments/comment_data.fragment.graphql +3 -0
  100. data/decidim-comments/app/frontend/comments/comment_order_selector.component.jsx +51 -6
  101. data/decidim-comments/app/frontend/comments/comment_order_selector.component.test.jsx +12 -1
  102. data/decidim-comments/app/frontend/comments/comment_thread.component.jsx +11 -5
  103. data/decidim-comments/app/frontend/comments/comment_thread.component.test.jsx +13 -3
  104. data/decidim-comments/app/frontend/comments/comment_thread.fragment.graphql +1 -3
  105. data/decidim-comments/app/frontend/comments/comments.component.jsx +37 -11
  106. data/decidim-comments/app/frontend/comments/comments.component.test.jsx +44 -7
  107. data/decidim-comments/app/frontend/comments/comments.query.graphql +2 -2
  108. data/decidim-comments/app/frontend/comments/down_vote.fragment.graphql +6 -0
  109. data/decidim-comments/app/frontend/comments/down_vote.mutation.graphql +7 -0
  110. data/decidim-comments/app/frontend/comments/down_vote_button.component.jsx +84 -0
  111. data/decidim-comments/app/frontend/comments/down_vote_button.component.test.jsx +48 -0
  112. data/decidim-comments/app/frontend/comments/up_vote.fragment.graphql +6 -0
  113. data/decidim-comments/app/frontend/comments/up_vote.mutation.graphql +7 -0
  114. data/decidim-comments/app/frontend/comments/up_vote_button.component.jsx +84 -0
  115. data/decidim-comments/app/frontend/comments/up_vote_button.component.test.jsx +48 -0
  116. data/decidim-comments/app/frontend/comments/vote_button.component.jsx +19 -0
  117. data/decidim-comments/app/frontend/comments/vote_button_component.test.jsx +38 -0
  118. data/decidim-comments/app/frontend/support/generate_comments_data.js +7 -2
  119. data/decidim-comments/app/helpers/decidim/comments/comments_helper.rb +1 -1
  120. data/decidim-comments/app/models/decidim/comments/application_record.rb +9 -0
  121. data/decidim-comments/app/models/decidim/comments/comment.rb +19 -4
  122. data/decidim-comments/app/models/decidim/comments/comment_vote.rb +22 -0
  123. data/decidim-comments/app/models/decidim/comments/seed.rb +27 -0
  124. data/decidim-comments/app/queries/decidim/comments/comments_with_replies.rb +88 -0
  125. data/decidim-comments/app/resolvers/decidim/comments/vote_comment_resolver.rb +20 -0
  126. data/decidim-comments/app/types/decidim/comments/comment_mutation_type.rb +19 -0
  127. data/decidim-comments/app/types/decidim/comments/comment_type.rb +38 -2
  128. data/decidim-comments/config/locales/en.yml +1 -0
  129. data/decidim-comments/db/migrate/20161130143508_create_comments.rb +4 -2
  130. data/decidim-comments/db/migrate/20161219150806_create_comment_votes.rb +13 -0
  131. data/decidim-comments/decidim-comments.gemspec +0 -3
  132. data/decidim-comments/lib/decidim/comments/mutation_extensions.rb +9 -0
  133. data/decidim-comments/lib/decidim/comments/query_extensions.rb +3 -5
  134. data/decidim-comments/lib/decidim/comments/test/factories.rb +22 -0
  135. data/decidim-comments/spec/commands/vote_comment_spec.rb +124 -0
  136. data/decidim-comments/spec/factories.rb +2 -9
  137. data/decidim-comments/spec/features/comments_spec.rb +37 -0
  138. data/decidim-comments/spec/models/comment_spec.rb +34 -0
  139. data/decidim-comments/spec/models/comment_vote_spec.rb +44 -0
  140. data/decidim-comments/spec/models/seed_spec.rb +19 -0
  141. data/decidim-comments/spec/queries/comments_with_replies_spec.rb +86 -0
  142. data/decidim-comments/spec/spec_helper.rb +3 -1
  143. data/decidim-comments/spec/support/dummy.rb +1 -1
  144. data/decidim-comments/spec/types/comment_mutation_type_spec.rb +46 -0
  145. data/decidim-comments/spec/types/comment_type_spec.rb +57 -3
  146. data/{decidim-api → decidim-comments}/spec/types/mutation_type_spec.rb +11 -0
  147. data/decidim-dev/README.md +7 -11
  148. data/decidim-dev/decidim-dev.gemspec +5 -4
  149. data/decidim-dev/lib/decidim/dev.rb +20 -0
  150. data/decidim-dev/lib/decidim/dev/assets/Exampledocument.docx +0 -0
  151. data/decidim-dev/lib/decidim/dev/assets/Exampledocument.odt +0 -0
  152. data/decidim-dev/lib/decidim/dev/assets/Exampledocument.pdf +0 -0
  153. data/decidim-dev/lib/decidim/dev/assets/avatar.svg +14 -0
  154. data/decidim-dev/lib/decidim/dev/assets/city.jpeg +0 -0
  155. data/decidim-dev/lib/decidim/dev/assets/city2.jpeg +0 -0
  156. data/decidim-dev/lib/decidim/dev/assets/city3.jpeg +0 -0
  157. data/decidim-dev/lib/decidim/dev/assets/malicious.jpg +0 -0
  158. data/decidim-dev/lib/decidim/{common_rake.rb → dev/common_rake.rb} +1 -1
  159. data/decidim-dev/lib/decidim/{dummy_authorization_handler.rb → dev/dummy_authorization_handler.rb} +4 -4
  160. data/decidim-dev/lib/decidim/{test → dev/test}/authorization_shared_examples.rb +0 -8
  161. data/decidim-dev/lib/decidim/{test → dev/test}/base_spec_helper.rb +4 -1
  162. data/decidim-dev/lib/decidim/{test → dev/test}/i18n_spec.rb +1 -1
  163. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/action_mailer.rb +0 -0
  164. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/active_job.rb +0 -0
  165. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/authenticated_controller_context.rb +0 -0
  166. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/authorization_handlers.rb +1 -1
  167. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/capybara.rb +3 -10
  168. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/database_cleaner.rb +0 -0
  169. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/engine_routes.rb +0 -0
  170. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/factory_girl.rb +0 -0
  171. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/feature.rb +10 -0
  172. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/feature_context.rb +2 -2
  173. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/helpers.rb +4 -0
  174. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/i18n.rb +1 -0
  175. data/decidim-dev/lib/decidim/dev/test/rspec_support/phantomjs_polyfills/bind-polyfill.js +18 -0
  176. data/decidim-dev/lib/decidim/dev/test/rspec_support/phantomjs_polyfills/object-assign-polyfill.js +24 -0
  177. data/decidim-dev/lib/decidim/dev/test/rspec_support/phantomjs_polyfills/promise.js +233 -0
  178. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/translation_helpers.rb +0 -0
  179. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/warden.rb +0 -0
  180. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/wisper.rb +0 -0
  181. data/decidim-dev/lib/generators/decidim/dummy_generator.rb +2 -2
  182. data/decidim-dev/lib/generators/decidim/templates/decidim_dev.rb +2 -0
  183. data/decidim-meetings/Rakefile +1 -1
  184. data/decidim-meetings/app/assets/images/decidim/meetings/icon.svg +1 -0
  185. data/decidim-meetings/app/commands/decidim/meetings/admin/create_meeting.rb +2 -0
  186. data/decidim-meetings/app/commands/decidim/meetings/admin/update_meeting.rb +2 -0
  187. data/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb +30 -6
  188. data/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb +14 -0
  189. data/decidim-meetings/app/helpers/decidim/meetings/application_helper.rb +10 -0
  190. data/decidim-meetings/app/models/decidim/meetings/meeting.rb +18 -1
  191. data/decidim-meetings/app/services/decidim/meetings/meeting_search.rb +48 -0
  192. data/decidim-meetings/app/views/decidim/meetings/admin/meetings/_form.html.erb +9 -2
  193. data/decidim-meetings/app/views/decidim/meetings/meetings/_filters.html.erb +24 -0
  194. data/decidim-meetings/app/views/decidim/meetings/meetings/_meetings.html.erb +30 -0
  195. data/decidim-meetings/app/views/decidim/meetings/meetings/_tags.html.erb +10 -0
  196. data/decidim-meetings/app/views/decidim/meetings/meetings/index.html.erb +8 -26
  197. data/decidim-meetings/app/views/decidim/meetings/meetings/index.js.erb +2 -0
  198. data/decidim-meetings/app/views/decidim/meetings/meetings/show.html.erb +1 -0
  199. data/decidim-meetings/config/locales/ca.yml +7 -0
  200. data/decidim-meetings/config/locales/en.yml +7 -0
  201. data/decidim-meetings/config/locales/es.yml +7 -0
  202. data/decidim-meetings/db/migrate/20161130121354_create_meetings.rb +2 -0
  203. data/decidim-meetings/decidim-meetings.gemspec +2 -0
  204. data/decidim-meetings/lib/decidim/meetings/feature.rb +7 -2
  205. data/decidim-meetings/lib/decidim/meetings/list_engine.rb +3 -0
  206. data/decidim-meetings/spec/commands/create_meeting_spec.rb +21 -0
  207. data/decidim-meetings/spec/commands/update_meeting_spec.rb +17 -2
  208. data/decidim-meetings/spec/factories.rb +3 -3
  209. data/decidim-meetings/spec/features/explore_meetings_spec.rb +53 -0
  210. data/decidim-meetings/spec/forms/meeting_form_spec.rb +19 -1
  211. data/decidim-meetings/spec/models/meeting_spec.rb +20 -0
  212. data/decidim-meetings/spec/services/meeting_search_spec.rb +146 -0
  213. data/decidim-meetings/spec/shared/admin_shared_context.rb +4 -2
  214. data/decidim-meetings/spec/shared/manage_meetings_examples.rb +5 -2
  215. data/decidim-meetings/spec/spec_helper.rb +1 -1
  216. data/decidim-pages/Rakefile +1 -1
  217. data/decidim-pages/app/assets/images/decidim/pages/icon.svg +3 -0
  218. data/decidim-pages/app/commands/decidim/pages/admin/update_page.rb +1 -2
  219. data/decidim-pages/app/forms/decidim/pages/admin/page_form.rb +0 -1
  220. data/decidim-pages/app/views/decidim/pages/admin/pages/_form.html.erb +0 -1
  221. data/decidim-pages/app/views/decidim/pages/application/show.html.erb +3 -3
  222. data/decidim-pages/config/i18n-tasks.yml +1 -0
  223. data/decidim-pages/config/locales/ca.yml +5 -1
  224. data/decidim-pages/config/locales/en.yml +5 -1
  225. data/decidim-pages/config/locales/es.yml +5 -1
  226. data/decidim-pages/db/migrate/20170110145040_remove_commentable_flag_from_pages.rb +5 -0
  227. data/decidim-pages/lib/decidim/pages/feature.rb +13 -3
  228. data/decidim-pages/spec/commands/update_page_spec.rb +2 -1
  229. data/decidim-pages/spec/factories.rb +2 -2
  230. data/decidim-pages/spec/features/admin_spec.rb +0 -11
  231. data/decidim-pages/spec/features/page_show_spec.rb +13 -10
  232. data/decidim-pages/spec/forms/page_form_spec.rb +4 -4
  233. data/decidim-pages/spec/spec_helper.rb +3 -1
  234. data/decidim-proposals/Rakefile +1 -1
  235. data/decidim-proposals/app/assets/config/decidim_proposals_manifest.css +1 -0
  236. data/decidim-proposals/app/assets/config/decidim_proposals_manifest.js +1 -0
  237. data/decidim-proposals/app/assets/images/decidim/proposals/icon.svg +1 -0
  238. data/decidim-proposals/app/assets/javascripts/decidim/proposals/social_share.js +2 -0
  239. data/decidim-proposals/app/assets/stylesheets/decidim/proposals/social_share.css.scss +14 -0
  240. data/decidim-proposals/app/commands/decidim/proposals/create_proposal.rb +5 -3
  241. data/decidim-proposals/app/controllers/decidim/proposals/admin/proposals_controller.rb +3 -3
  242. data/decidim-proposals/app/controllers/decidim/proposals/proposal_votes_controller.rb +25 -0
  243. data/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb +33 -6
  244. data/decidim-proposals/app/forms/decidim/proposals/admin/proposal_form.rb +7 -6
  245. data/decidim-proposals/app/forms/decidim/proposals/proposal_form.rb +6 -6
  246. data/decidim-proposals/app/helpers/decidim/proposals/application_helper.rb +3 -1
  247. data/decidim-proposals/app/helpers/decidim/proposals/proposal_votes_helper.rb +27 -0
  248. data/decidim-proposals/app/models/decidim/proposals/proposal.rb +8 -0
  249. data/decidim-proposals/app/models/decidim/proposals/proposal_vote.rb +20 -0
  250. data/decidim-proposals/app/services/decidim/proposals/proposal_search.rb +39 -11
  251. data/decidim-proposals/app/views/decidim/proposals/admin/proposals/_form.html.erb +2 -2
  252. data/decidim-proposals/app/views/decidim/proposals/proposal_votes/create.js.erb +5 -0
  253. data/decidim-proposals/app/views/decidim/proposals/proposals/_count.html.erb +1 -0
  254. data/decidim-proposals/app/views/decidim/proposals/proposals/_filters.html.erb +26 -0
  255. data/decidim-proposals/app/views/decidim/proposals/proposals/_proposal.html.erb +11 -2
  256. data/decidim-proposals/app/views/decidim/proposals/proposals/_proposals.html.erb +4 -0
  257. data/decidim-proposals/app/views/decidim/proposals/proposals/_share.html.erb +33 -0
  258. data/decidim-proposals/app/views/decidim/proposals/proposals/_vote_button.html.erb +13 -0
  259. data/decidim-proposals/app/views/decidim/proposals/proposals/_votes_count.html.erb +6 -0
  260. data/decidim-proposals/app/views/decidim/proposals/proposals/index.html.erb +11 -11
  261. data/decidim-proposals/app/views/decidim/proposals/proposals/index.js.erb +5 -0
  262. data/decidim-proposals/app/views/decidim/proposals/proposals/show.html.erb +31 -4
  263. data/decidim-proposals/config/i18n-tasks.yml +1 -0
  264. data/decidim-proposals/config/initializers/social_share_button.rb +4 -0
  265. data/decidim-proposals/config/locales/ca.yml +28 -2
  266. data/decidim-proposals/config/locales/en.yml +27 -1
  267. data/decidim-proposals/config/locales/es.yml +28 -2
  268. data/decidim-proposals/db/migrate/20170112115253_create_proposal_votes.rb +12 -0
  269. data/decidim-proposals/db/migrate/20170113114245_add_text_search_indexes.rb +6 -0
  270. data/decidim-proposals/db/migrate/20170118120151_add_counter_cache_votes_to_proposals.rb +5 -0
  271. data/decidim-proposals/decidim-proposals.gemspec +2 -1
  272. data/decidim-proposals/lib/decidim/proposals/engine.rb +8 -1
  273. data/decidim-proposals/lib/decidim/proposals/feature.rb +30 -4
  274. data/decidim-proposals/spec/commands/decidim/proposals/create_proposal_spec.rb +10 -3
  275. data/decidim-proposals/spec/factories.rb +9 -4
  276. data/decidim-proposals/spec/features/admin_manages_proposals_spec.rb +2 -0
  277. data/decidim-proposals/spec/features/process_admin_manages_proposals_spec.rb +2 -0
  278. data/decidim-proposals/spec/features/proposals_spec.rb +41 -31
  279. data/decidim-proposals/spec/features/vote_proposal_spec.rb +78 -0
  280. data/decidim-proposals/spec/forms/decidim/proposals/proposal_form_spec.rb +11 -10
  281. data/decidim-proposals/spec/helpers/proposal_votes_helper_spec.rb +28 -0
  282. data/decidim-proposals/spec/lib/decidim/proposals/feature_spec.rb +1 -1
  283. data/decidim-proposals/spec/models/decidim/proposals/proposal_spec.rb +20 -3
  284. data/decidim-proposals/spec/models/decidim/proposals/proposal_vote_spec.rb +43 -0
  285. data/decidim-proposals/spec/services/decidim/proposals/proposal_search_spec.rb +50 -4
  286. data/decidim-proposals/spec/shared/manage_proposals_examples.rb +1 -1
  287. data/decidim-proposals/spec/spec_helper.rb +1 -1
  288. data/decidim-system/Rakefile +1 -1
  289. data/decidim-system/app/commands/decidim/system/register_organization.rb +13 -12
  290. data/decidim-system/decidim-system.gemspec +2 -3
  291. data/decidim-system/spec/factories.rb +1 -1
  292. data/decidim-system/spec/spec_helper.rb +3 -1
  293. data/docs/social_providers.md +41 -0
  294. data/karma.conf.js +4 -2
  295. data/lib/generators/decidim/app_generator.rb +6 -0
  296. data/lib/generators/decidim/demo_generator.rb +2 -2
  297. data/lib/generators/decidim/install_generator.rb +5 -4
  298. data/lib/generators/decidim/templates/Gemfile.erb +3 -5
  299. data/lib/generators/decidim/templates/initializer.rb +1 -1
  300. data/lib/generators/decidim/templates/secrets.yml.erb +26 -0
  301. data/lib/generators/decidim/templates/social_share_button.rb +7 -0
  302. data/package.json +16 -6
  303. data/webpack.config.js +23 -8
  304. data/yarn.lock +401 -345
  305. metadata +130 -48
  306. data/Gemfile.common +0 -1
  307. data/decidim-admin/Gemfile +0 -6
  308. data/decidim-comments/Gemfile +0 -6
  309. data/decidim-comments/package.json +0 -21
  310. data/decidim-dev/Gemfile +0 -6
  311. data/decidim-dev/lib/decidim/test/rspec_support/bullet.rb +0 -15
  312. data/decidim-dev/lib/generators/decidim/templates/bullet.rb +0 -6
  313. data/decidim-system/Gemfile +0 -6
@@ -5,13 +5,18 @@ require_dependency "decidim/features/namer"
5
5
  Decidim.register_feature(:proposals) do |feature|
6
6
  feature.engine = Decidim::Proposals::Engine
7
7
  feature.admin_engine = Decidim::Proposals::AdminEngine
8
+ feature.icon = "decidim/proposals/icon.svg"
8
9
 
9
- feature.on(:destroy) do |instance|
10
+ feature.on(:before_destroy) do |instance|
10
11
  if Decidim::Proposals::Proposal.where(feature: instance).any?
11
12
  raise "Can't destroy this feature when there are proposals"
12
13
  end
13
14
  end
14
15
 
16
+ feature.settings(:step) do |settings|
17
+ settings.attribute :votes_enabled, type: :boolean
18
+ end
19
+
15
20
  feature.seeds do
16
21
  Decidim::ParticipatoryProcess.all.each do |process|
17
22
  next unless process.steps.any?
@@ -19,16 +24,37 @@ Decidim.register_feature(:proposals) do |feature|
19
24
  feature = Decidim::Feature.create!(
20
25
  name: Decidim::Features::Namer.new(process.organization.available_locales, :proposals).i18n_name,
21
26
  manifest_name: :proposals,
22
- participatory_process: process
27
+ participatory_process: process,
28
+ step_settings: {
29
+ process.active_step.id => { votes_enabled: true }
30
+ }
23
31
  )
24
32
 
25
- 20.times do
26
- Decidim::Proposals::Proposal.create!(
33
+ 20.times do |n|
34
+ proposal = Decidim::Proposals::Proposal.create!(
27
35
  feature: feature,
28
36
  title: Faker::Lorem.sentence(2),
29
37
  body: Faker::Lorem.paragraphs(2).join("\n"),
30
38
  author: Decidim::User.where(organization: feature.organization).all.sample
31
39
  )
40
+
41
+ rand(3).times do |m|
42
+ email = "vote-author-#{process.id}-#{n}-#{m}@decidim.org"
43
+ name = "#{Faker::Name.name} #{process.id} #{n} #{m}"
44
+
45
+ author = Decidim::User.create!(email: email,
46
+ password: "password1234",
47
+ password_confirmation: "password1234",
48
+ name: name,
49
+ organization: feature.organization,
50
+ tos_agreement: "1",
51
+ confirmed_at: Time.now)
52
+
53
+ Decidim::Proposals::ProposalVote.create!(proposal: proposal,
54
+ author: author)
55
+ end
56
+
57
+ Decidim::Comments::Seed.comments_for(proposal)
32
58
  end
33
59
  end
34
60
  end
@@ -12,18 +12,25 @@ module Decidim
12
12
  {
13
13
  title: "Proposal title",
14
14
  body: "Proposal body",
15
- author: create(:user, organization: organization),
16
15
  feature: feature
17
16
  }
18
17
  end
18
+
19
+ let(:author) do
20
+ create(:user, organization: organization)
21
+ end
22
+
19
23
  let(:form) do
20
24
  ProposalForm.from_params(
21
- form_params,
25
+ form_params
26
+ ).with_context(
22
27
  current_organization: organization,
28
+ current_feature: feature,
23
29
  current_process: participatory_process
24
30
  )
25
31
  end
26
- let(:command) { described_class.new(form) }
32
+
33
+ let(:command) { described_class.new(form, author) }
27
34
 
28
35
  describe "when the form is not valid" do
29
36
  before do
@@ -1,10 +1,10 @@
1
- require_relative "../../decidim-core/spec/factories"
2
- require_relative "../../decidim-admin/spec/factories"
3
- require_relative "../../decidim-comments/spec/factories"
1
+ require "decidim/core/test/factories"
2
+ require "decidim/admin/test/factories"
3
+ require "decidim/comments/test/factories"
4
4
 
5
5
  FactoryGirl.define do
6
6
  factory :proposal_feature, class: Decidim::Feature do
7
- name { Decidim::Features::Namer.new(I18n.locales, :proposals).i18n_name }
7
+ name { Decidim::Features::Namer.new(participatory_process.organization.available_locales, :proposals).i18n_name }
8
8
  manifest_name :proposals
9
9
  participatory_process
10
10
  end
@@ -15,4 +15,9 @@ FactoryGirl.define do
15
15
  feature
16
16
  author { create(:user, organization: feature.organization) }
17
17
  end
18
+
19
+ factory :proposal_vote, class: Decidim::Proposals::ProposalVote do
20
+ proposal { build(:proposal) }
21
+ author { build(:user, organization: proposal.organization) }
22
+ end
18
23
  end
@@ -7,6 +7,8 @@ require_relative "../shared/manage_proposals_examples"
7
7
  describe "Admin manages proposals", type: :feature do
8
8
  include_context "admin"
9
9
  it_behaves_like "manage proposals"
10
+ include_context "feature"
11
+ let(:manifest_name) { "proposals" }
10
12
 
11
13
  before do
12
14
  switch_to_host(organization.host)
@@ -8,6 +8,8 @@ describe "Process admin manages proposals", type: :feature do
8
8
  include_context "admin"
9
9
  let(:user) { process_admin }
10
10
  it_behaves_like "manage proposals"
11
+ include_context "feature"
12
+ let(:manifest_name) { "proposals" }
11
13
 
12
14
  before do
13
15
  switch_to_host(organization.host)
@@ -2,36 +2,33 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe "Proposals", type: :feature do
5
- let(:feature) { create(:proposal_feature) }
6
- let(:organization) { feature.organization }
7
- let(:participatory_process) { feature.participatory_process }
5
+ include_context "feature"
6
+ let(:manifest_name) { "proposals" }
7
+
8
8
  let!(:proposals) { create_list(:proposal, 3, feature: feature) }
9
9
  let!(:category) { create :category, participatory_process: participatory_process }
10
10
  let!(:scope) { create :scope, organization: organization }
11
11
  let!(:user) { create :user, :confirmed, organization: organization }
12
12
 
13
13
  before do
14
- switch_to_host(organization.host)
15
- visit decidim.root_path
14
+ visit_feature
16
15
  end
17
16
 
18
17
  context "creating a new proposal" do
19
18
  context "when the user is logged in" do
20
19
  before do
21
20
  login_as user, scope: :user
21
+ visit_feature
22
22
  end
23
23
 
24
24
  it "creates a new proposal" do
25
- click_link "Processes"
26
- click_link participatory_process.title["en"]
27
- click_link "Proposals"
28
25
  click_link "New proposal"
29
26
 
30
27
  within ".new_proposal" do
31
28
  fill_in :proposal_title, with: "Oriol for president"
32
29
  fill_in :proposal_body, with: "He will solve everything"
33
30
  select category.name["en"], from: :proposal_category_id
34
- select scope.name["en"], from: :proposal_scope_id
31
+ select scope.name, from: :proposal_scope_id
35
32
 
36
33
  find("*[type=submit]").click
37
34
  end
@@ -40,7 +37,7 @@ describe "Proposals", type: :feature do
40
37
  expect(page).to have_content("Oriol for president")
41
38
  expect(page).to have_content("He will solve everything")
42
39
  expect(page).to have_content(category.name["en"])
43
- expect(page).to have_content(scope.name["en"])
40
+ expect(page).to have_content(scope.name)
44
41
  end
45
42
  end
46
43
  end
@@ -49,11 +46,8 @@ describe "Proposals", type: :feature do
49
46
  let!(:official_proposal) { create(:proposal, feature: feature, author: nil) }
50
47
 
51
48
  it "shows the author as official" do
52
- click_link "Processes"
53
- click_link participatory_process.title["en"]
54
- click_link "Proposals"
49
+ visit_feature
55
50
  click_link official_proposal.title
56
-
57
51
  expect(page).to have_content("Official proposal")
58
52
  end
59
53
  end
@@ -63,13 +57,8 @@ describe "Proposals", type: :feature do
63
57
  let(:author) { create(:user, :confirmed, organization: feature.organization)}
64
58
  let!(:comments) { create_list(:comment, 3, commentable: proposal) }
65
59
 
66
- before do
67
- click_link "Processes"
68
- click_link participatory_process.title["en"]
69
- click_link "Proposals"
70
- end
71
-
72
60
  it "shows the comments" do
61
+ visit_feature
73
62
  click_link proposal.title
74
63
 
75
64
  comments.each do |comment|
@@ -79,14 +68,8 @@ describe "Proposals", type: :feature do
79
68
  end
80
69
 
81
70
  context "listing proposals in a participatory process" do
82
- before do
83
- click_link "Processes"
84
- click_link participatory_process.title["en"]
85
- click_link "Proposals"
86
- end
87
-
88
71
  it "lists all the proposals" do
89
- expect(page).to have_css(".card--proposal", 3)
72
+ expect(page).to have_css(".card--proposal", count: 3)
90
73
  end
91
74
 
92
75
  it "allows viewing a single proposal" do
@@ -101,16 +84,43 @@ describe "Proposals", type: :feature do
101
84
 
102
85
  context "when there are a lot of proposals" do
103
86
  before do
104
- create_list(:proposal, 20, feature: feature)
105
- visit current_path
87
+ create_list(:proposal, 17, feature: feature)
88
+ visit_feature
106
89
  end
107
90
 
108
91
  it "paginates them" do
109
- expect(page).to have_css(".card--proposal", 12)
92
+ expect(page).to have_css(".card--proposal", count: 12)
110
93
 
111
94
  find(".pagination-next a").click
112
95
 
113
- expect(page).to have_css(".card--proposal", 8)
96
+ expect(page).to have_css(".card--proposal", count: 8)
97
+ end
98
+ end
99
+
100
+ context "when filtering" do
101
+ context "by origin 'official'" do
102
+ it "lists the filtered proposals" do
103
+ create(:proposal, feature: feature, scope: scope, decidim_author_id: nil)
104
+ visit_feature
105
+
106
+ within ".filters" do
107
+ choose "Official"
108
+ end
109
+
110
+ expect(page).to have_css(".card--proposal", count: 1)
111
+ expect(page).to have_content("1 PROPOSAL")
112
+ end
113
+ end
114
+
115
+ context "by origin 'citizenship'" do
116
+ it "lists the filtered proposals" do
117
+ within ".filters" do
118
+ choose "Citizenship"
119
+ end
120
+
121
+ expect(page).to have_css(".card--proposal", count: proposals.size)
122
+ expect(page).to have_content("#{proposals.size} PROPOSALS")
123
+ end
114
124
  end
115
125
  end
116
126
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe "Vote Proposal", type: :feature do
5
+ include_context "feature"
6
+ let(:manifest_name) { "proposals" }
7
+
8
+ let!(:proposals) { create_list(:proposal, 3, feature: feature) }
9
+ let!(:proposal) { Decidim::Proposals::Proposal.where(feature: feature).first }
10
+ let!(:user) { create :user, :confirmed, organization: organization }
11
+
12
+ let(:votes_enabled) { false }
13
+
14
+ before do
15
+ feature.step_settings = { participatory_process.active_step.id => { votes_enabled: votes_enabled } }
16
+ feature.save
17
+ visit_feature
18
+ end
19
+
20
+ context "when votes are not enabled" do
21
+ it "doesn't show the vote proposal button and counts" do
22
+ expect(page).not_to have_css('.card__button', text: "Vote")
23
+ expect(page).not_to have_css('.card__support__data span', text: "0 VOTES")
24
+ end
25
+ end
26
+
27
+ context "when votes are enabled" do
28
+ let(:votes_enabled) { true }
29
+
30
+ context "when the user is not logged in" do
31
+ it "should be given the option to sign in" do
32
+ within ".card__support", match: :first do
33
+ page.find('.card__button').click
34
+ end
35
+
36
+ expect(page).to have_css('#loginModal', visible: true)
37
+ end
38
+ end
39
+
40
+ context "when the user is logged in" do
41
+ before do
42
+ login_as user, scope: :user
43
+ visit_feature
44
+ end
45
+
46
+ context "when the proposal is not voted yet" do
47
+ it "should be able to vote the proposal" do
48
+ within "#proposal-#{proposal.id}-vote-button" do
49
+ page.find('.card__button').click
50
+ expect(page).to have_css('.card__button.success', text: "Already voted")
51
+ end
52
+
53
+ within "#proposal-#{proposal.id}-votes-count" do
54
+ expect(page).to have_content("1 VOTE")
55
+ end
56
+ end
57
+ end
58
+
59
+ context "when the proposal is already voted" do
60
+ before do
61
+ create(:proposal_vote, proposal: proposal, author: user)
62
+ visit_feature
63
+ end
64
+
65
+ it "should not be able to vote it again" do
66
+ within "#proposal-#{proposal.id}-vote-button" do
67
+ expect(page).to have_css('.card__button.success', text: "Already voted")
68
+ page.find('.card__button').click
69
+ end
70
+
71
+ within "#proposal-#{proposal.id}-votes-count" do
72
+ expect(page).to have_content("1 VOTE")
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -18,12 +18,18 @@ module Decidim
18
18
  body: body,
19
19
  author: author,
20
20
  category_id: category_id,
21
- scope_id: scope_id,
22
- feature: feature
21
+ scope_id: scope_id
23
22
  }
24
23
  end
25
24
 
26
- subject { described_class.from_params(params) }
25
+ let(:form) do
26
+ described_class.from_params(params).with_context(
27
+ current_feature: feature,
28
+ current_organization: feature.organization
29
+ )
30
+ end
31
+
32
+ subject { form }
27
33
 
28
34
  context "when everything is OK" do
29
35
  it { is_expected.to be_valid }
@@ -39,11 +45,6 @@ module Decidim
39
45
  it { is_expected.to be_invalid }
40
46
  end
41
47
 
42
- context "when there's no author" do
43
- let(:author) { nil }
44
- it { is_expected.to be_invalid }
45
- end
46
-
47
48
  context "when no category_id" do
48
49
  let(:category_id) { nil }
49
50
  it { is_expected.to be_valid }
@@ -65,7 +66,7 @@ module Decidim
65
66
  end
66
67
 
67
68
  describe "category" do
68
- subject { described_class.from_params(params).category }
69
+ subject { form.category }
69
70
 
70
71
  context "when the category exists" do
71
72
  it { is_expected.to be_kind_of(Decidim::Category) }
@@ -83,7 +84,7 @@ module Decidim
83
84
  end
84
85
 
85
86
  describe "scope" do
86
- subject { described_class.from_params(params).scope }
87
+ subject { form.scope }
87
88
 
88
89
  context "when the scope exists" do
89
90
  it { is_expected.to be_kind_of(Decidim::Scope) }
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ module Decidim
5
+ module Proposals
6
+ describe ProposalVotesHelper do
7
+ describe "#vote_button_classes" do
8
+ it "returns small buttons classes from proposals list" do
9
+ expect(helper.vote_button_classes(true)).to eq("small")
10
+ end
11
+
12
+ it "returns expanded buttons classes if it's not from proposals list'" do
13
+ expect(helper.vote_button_classes(false)).to eq("expanded button--sc")
14
+ end
15
+ end
16
+
17
+ describe "#votes_count_classes" do
18
+ it "returns small count classes from proposals list" do
19
+ expect(helper.votes_count_classes(true)).to eq(number: "card__support__number", label: "")
20
+ end
21
+
22
+ it "returns expanded count classes if it's not from proposals list'" do
23
+ expect(helper.votes_count_classes(false)).to eq(number: "extra__suport-number", label: "extra__suport-text")
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -22,7 +22,7 @@ describe "Proposals feature" do
22
22
  it "raises an error" do
23
23
  expect do
24
24
  Decidim::Admin::DestroyFeature.call(feature)
25
- end.to raise_error
25
+ end.to broadcast(:invalid)
26
26
 
27
27
  expect(feature).to_not be_destroyed
28
28
  end