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
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  # frozen_string_literal: true
2
3
  require "spec_helper"
3
4
 
@@ -6,7 +7,7 @@ module Decidim
6
7
  module Admin
7
8
  describe PageForm do
8
9
  let(:current_organization) { create(:organization) }
9
-
10
+
10
11
  let(:title) do
11
12
  {
12
13
  "en" => "Hello world",
@@ -36,8 +37,7 @@ module Decidim
36
37
  end
37
38
 
38
39
  subject do
39
- described_class.from_params(
40
- attributes,
40
+ described_class.from_params(attributes).with_context(
41
41
  current_organization: current_organization
42
42
  )
43
43
  end
@@ -60,4 +60,4 @@ module Decidim
60
60
  end
61
61
  end
62
62
  end
63
- end
63
+ end
@@ -1,2 +1,4 @@
1
1
  ENV["ENGINE_NAME"] = File.dirname(File.dirname(__FILE__)).split("/").last
2
- require "decidim/test/base_spec_helper"
2
+ require "decidim/dev/test/base_spec_helper"
3
+
4
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
@@ -1,2 +1,2 @@
1
1
  # frozen_string_literal: true
2
- require "decidim/common_rake"
2
+ require "decidim/dev/common_rake"
@@ -0,0 +1 @@
1
+ /*= link decidim/proposals/social_share.css.scss */
@@ -0,0 +1 @@
1
+ //= link decidim/proposals/social_share.js
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 35 35"><path d="M17.5 35A17.5 17.5 0 1 1 35 17.5 17.52 17.52 0 0 1 17.5 35zm0-33.06A15.56 15.56 0 1 0 33.06 17.5 15.57 15.57 0 0 0 17.5 1.94zm9.5 13.7H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zm0 3.68H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zM22.26 23H8a1 1 0 0 1 0-1.94h14.26a1 1 0 0 1 0 1.94z"/></svg>
@@ -0,0 +1,2 @@
1
+ // = require social-share-button
2
+ // = require_self
@@ -0,0 +1,14 @@
1
+ /*= require social-share-button */
2
+ $size: 45px;
3
+
4
+ .social-share-button {
5
+ display: inline-block;
6
+ vertical-align: top;
7
+ .ssb-icon {
8
+ margin-right: 5px;
9
+ background-size: $size $size;
10
+ height: $size;
11
+ width: $size;
12
+ }
13
+ }
14
+
@@ -5,9 +5,11 @@ module Decidim
5
5
  class CreateProposal < Rectify::Command
6
6
  # Public: Initializes the command.
7
7
  #
8
- # form - A form object with the params.
9
- def initialize(form)
8
+ # form - A form object with the params.
9
+ # current_user - The current user.
10
+ def initialize(form, current_user)
10
11
  @form = form
12
+ @current_user = current_user
11
13
  end
12
14
 
13
15
  # Executes the command. Broadcasts these events:
@@ -33,7 +35,7 @@ module Decidim
33
35
  body: form.body,
34
36
  category: form.category,
35
37
  scope: form.scope,
36
- author: form.author,
38
+ author: @current_user,
37
39
  feature: form.feature
38
40
  )
39
41
  end
@@ -7,13 +7,13 @@ module Decidim
7
7
  helper_method :proposals
8
8
 
9
9
  def new
10
- @form = form(ProposalForm).from_params({}, feature: current_feature)
10
+ @form = form(Admin::ProposalForm).from_params({})
11
11
  end
12
12
 
13
13
  def create
14
- @form = form(ProposalForm).from_params(params, feature: current_feature)
14
+ @form = form(Admin::ProposalForm).from_params(params)
15
15
 
16
- CreateProposal.call(@form) do
16
+ Admin::CreateProposal.call(@form) do
17
17
  on(:ok) do
18
18
  flash[:notice] = I18n.t("proposals.create.success", scope: "decidim.proposals.admin")
19
19
  redirect_to proposals_path
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Proposals
5
+ # Exposes the proposal vote resource so users can vote proposals.
6
+ class ProposalVotesController < Decidim::Proposals::ApplicationController
7
+ before_action :authenticate_user!
8
+ before_action :check_current_settings!
9
+
10
+ def create
11
+ @proposal = Proposal.where(feature: current_feature).find(params[:proposal_id])
12
+ @proposal.votes.create!(author: current_user)
13
+ @from_proposals_list = params[:from_proposals_list] == "true"
14
+ end
15
+
16
+ private
17
+
18
+ # The vote buttons should not be visible if the setting is not enabled.
19
+ # This ensure the votes cannot be created using a POST request directly.
20
+ def check_current_settings!
21
+ raise "This setting is not enabled for this step" unless current_settings.votes_enabled?
22
+ end
23
+ end
24
+ end
25
+ end
@@ -5,6 +5,8 @@ module Decidim
5
5
  # Exposes the proposal resource so users can view and create them.
6
6
  class ProposalsController < Decidim::Proposals::ApplicationController
7
7
  include FormFactory
8
+ include FilterResource
9
+
8
10
  before_action :authenticate_user!, only: [:new, :create]
9
11
 
10
12
  def show
@@ -12,19 +14,21 @@ module Decidim
12
14
  end
13
15
 
14
16
  def index
15
- @search = ProposalSearch.new(current_feature, params[:page], params[:random_seed])
16
- @proposals = @search.proposals
17
- @random_seed = @search.random_seed
17
+ @proposals = search
18
+ .results
19
+ .includes(:author)
20
+ .includes(votes: [:author])
21
+ @random_seed = search.random_seed
18
22
  end
19
23
 
20
24
  def new
21
- @form = form(ProposalForm).from_params({}, author: current_user, feature: current_feature)
25
+ @form = form(ProposalForm).from_params({})
22
26
  end
23
27
 
24
28
  def create
25
- @form = form(ProposalForm).from_params(params, author: current_user, feature: current_feature)
29
+ @form = form(ProposalForm).from_params(params)
26
30
 
27
- CreateProposal.call(@form) do
31
+ CreateProposal.call(@form, current_user) do
28
32
  on(:ok) do |proposal|
29
33
  flash[:notice] = I18n.t("proposals.create.success", scope: "decidim")
30
34
  redirect_to proposal_path(proposal)
@@ -36,6 +40,29 @@ module Decidim
36
40
  end
37
41
  end
38
42
  end
43
+
44
+ private
45
+
46
+ def search_klass
47
+ ProposalSearch
48
+ end
49
+
50
+ def default_search_params
51
+ {
52
+ page: params[:page],
53
+ per_page: 12
54
+ }
55
+ end
56
+
57
+ def default_filter_params
58
+ {
59
+ search_text: "",
60
+ origin: "all",
61
+ activity: "",
62
+ category_id: "",
63
+ random_seed: params[:random_seed]
64
+ }
65
+ end
39
66
  end
40
67
  end
41
68
  end
@@ -10,27 +10,28 @@ module Decidim
10
10
  attribute :body, String
11
11
  attribute :category_id, Integer
12
12
  attribute :scope_id, Integer
13
- attribute :feature, Decidim::Feature
14
13
 
15
- validates :title, :body, :feature, presence: true
14
+ validates :title, :body, presence: true
16
15
  validates :category, presence: true, if: ->(form) { form.category_id.present? }
17
16
  validates :scope, presence: true, if: ->(form) { form.scope_id.present? }
18
17
 
19
- delegate :categories, to: :feature
20
- delegate :scopes, to: :current_organization
18
+ delegate :categories, to: :current_feature, prefix: false
19
+ delegate :scopes, to: :current_organization, prefix: false
20
+
21
+ alias feature current_feature
21
22
 
22
23
  # Finds the Category from the category_id.
23
24
  #
24
25
  # Returns a Decidim::Category
25
26
  def category
26
- @category ||= feature.categories.where(id: category_id).first
27
+ @category ||= categories.where(id: category_id).first
27
28
  end
28
29
 
29
30
  # Finds the Scope from the scope_id.
30
31
  #
31
32
  # Returns a Decidim::Scope
32
33
  def scope
33
- @scope ||= feature.scopes.where(id: scope_id).first
34
+ @scope ||= scopes.where(id: scope_id).first
34
35
  end
35
36
  end
36
37
  end
@@ -7,30 +7,30 @@ module Decidim
7
7
 
8
8
  attribute :title, String
9
9
  attribute :body, String
10
- attribute :author, Decidim::User
11
10
  attribute :category_id, Integer
12
11
  attribute :scope_id, Integer
13
- attribute :feature, Decidim::Feature
14
12
 
15
- validates :title, :body, :author, :feature, presence: true
13
+ validates :title, :body, presence: true
16
14
  validates :category, presence: true, if: ->(form) { form.category_id.present? }
17
15
  validates :scope, presence: true, if: ->(form) { form.scope_id.present? }
18
16
 
19
- delegate :categories, to: :feature
17
+ delegate :categories, to: :current_feature
20
18
  delegate :scopes, to: :current_organization
21
19
 
20
+ alias feature current_feature
21
+
22
22
  # Finds the Category from the category_id.
23
23
  #
24
24
  # Returns a Decidim::Category
25
25
  def category
26
- @category ||= feature.categories.where(id: category_id).first
26
+ @category ||= categories.where(id: category_id).first
27
27
  end
28
28
 
29
29
  # Finds the Scope from the scope_id.
30
30
  #
31
31
  # Returns a Decidim::Scope
32
32
  def scope
33
- @scope ||= feature.scopes.where(id: scope_id).first
33
+ @scope ||= scopes.where(id: scope_id).first
34
34
  end
35
35
  end
36
36
  end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
  module Decidim
3
3
  module Proposals
4
- # Custom helpers, scoped to the pages engine.
4
+ # Custom helpers, scoped to the proposals engine.
5
5
  #
6
6
  module ApplicationHelper
7
7
  include Decidim::Comments::CommentsHelper
8
+ include PaginateHelper
9
+ include ProposalVotesHelper
8
10
  end
9
11
  end
10
12
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Proposals
4
+ # Simple helpers to handle markup variations for proposal votes partials
5
+ module ProposalVotesHelper
6
+ # Returns the css classes used for proposal votes count in both proposals list and show pages
7
+ #
8
+ # from_proposals_list - A boolean to indicate if the template is rendered from the proposals list page
9
+ #
10
+ # Returns a hash with the css classes for the count number and label
11
+ def votes_count_classes(from_proposals_list)
12
+ return { number: "card__support__number", label: "" } if from_proposals_list
13
+ { number: "extra__suport-number", label: "extra__suport-text" }
14
+ end
15
+
16
+ # Returns the css classes used for proposal vote button in both proposals list and show pages
17
+ #
18
+ # from_proposals_list - A boolean to indicate if the template is rendered from the proposals list page
19
+ #
20
+ # Returns a string with the value of the css classes.
21
+ def vote_button_classes(from_proposals_list)
22
+ return "small" if from_proposals_list
23
+ "expanded button--sc"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -8,6 +8,7 @@ module Decidim
8
8
  belongs_to :category, foreign_key: "decidim_category_id", class_name: Decidim::Category
9
9
  belongs_to :scope, foreign_key: "decidim_scope_id", class_name: Decidim::Scope
10
10
  has_one :organization, through: :feature
11
+ has_many :votes, foreign_key: "decidim_proposal_id", class_name: ProposalVote, dependent: :destroy
11
12
 
12
13
  validates :title, :feature, :body, presence: true
13
14
  validate :category_belongs_to_feature
@@ -32,6 +33,13 @@ module Decidim
32
33
  true
33
34
  end
34
35
 
36
+ # Public: Check if the user has voted the proposal
37
+ #
38
+ # Returns Boolean
39
+ def voted_by?(user)
40
+ votes.any? { |vote| vote.author == user }
41
+ end
42
+
35
43
  private
36
44
 
37
45
  def category_belongs_to_feature
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Proposals
4
+ # A proposal can include a vote per user.
5
+ class ProposalVote < ApplicationRecord
6
+ belongs_to :proposal, foreign_key: "decidim_proposal_id", class_name: Decidim::Proposals::Proposal, counter_cache: true
7
+ belongs_to :author, foreign_key: "decidim_author_id", class_name: Decidim::User
8
+
9
+ validates :proposal, uniqueness: { scope: :author }
10
+ validate :author_and_proposal_same_organization
11
+
12
+ private
13
+
14
+ # Private: check if the proposal and the author have the same organization
15
+ def author_and_proposal_same_organization
16
+ errors.add(:proposal, :invalid) unless author.organization == proposal.organization
17
+ end
18
+ end
19
+ end
20
+ end
@@ -3,26 +3,54 @@ module Decidim
3
3
  module Proposals
4
4
  # A service to encapsualte all the logic when searching and filtering
5
5
  # proposals in a participatory process.
6
- class ProposalSearch
7
- attr_reader :feature, :page, :per_page
8
-
6
+ class ProposalSearch < ResourceSearch
9
7
  # Public: Initializes the service.
10
8
  # feature - A Decidim::Feature to get the proposals from.
11
9
  # page - The page number to paginate the results.
12
- # random_seed - A random flaot number between -1 and 1 to be used as a random seed at the database.
13
10
  # per_page - The number of proposals to return per page.
14
- def initialize(feature, page = nil, random_seed = nil, per_page = nil)
15
- @feature = feature
16
- @page = (page || 1).to_i
17
- @per_page = (per_page || 12).to_i
18
- @random_seed = random_seed.to_f
11
+ # random_seed - A random flaot number between -1 and 1 to be used as a random seed at the database.
12
+ def initialize(options = {})
13
+ super(Proposal.all, options)
14
+ @random_seed = options[:random_seed].to_f
15
+ end
16
+
17
+ # Handle the search_text filter
18
+ def search_search_text
19
+ query
20
+ .where("title ILIKE ?", "%#{search_text}%")
21
+ .or(query.where("body ILIKE ?", "%#{search_text}%"))
22
+ end
23
+
24
+ # Handle the origin filter
25
+ # The 'official' proposals doesn't have an author id
26
+ def search_origin
27
+ if origin == "official"
28
+ query.where(decidim_author_id: nil)
29
+ elsif origin == "citizenship"
30
+ query.where.not(decidim_author_id: nil)
31
+ else # Assume 'all'
32
+ query
33
+ end
34
+ end
35
+
36
+ # Handle the activity filter
37
+ def search_activity
38
+ if activity.include? "voted"
39
+ query
40
+ .includes(:votes)
41
+ .where(decidim_proposals_proposal_votes: {
42
+ decidim_author_id: options[:current_user]
43
+ })
44
+ else
45
+ query
46
+ end
19
47
  end
20
48
 
21
49
  # Returns the random proposals for the current page.
22
- def proposals
50
+ def results
23
51
  @proposals ||= Proposal.transaction do
24
52
  Proposal.connection.execute("SELECT setseed(#{Proposal.connection.quote(random_seed)})")
25
- Proposal.where(feature: feature).reorder("RANDOM()").page(page).per(per_page).load
53
+ super.reorder("RANDOM()").load
26
54
  end
27
55
  end
28
56
 
@@ -8,12 +8,12 @@
8
8
 
9
9
  <% if @form.categories&.any? %>
10
10
  <div class="field">
11
- <%= form.categories_select :category_id, @form.categories, t(".select_a_category") %>
11
+ <%= form.categories_select :category_id, @form.categories, prompt: t(".select_a_category") %>
12
12
  </div>
13
13
  <% end %>
14
14
 
15
15
  <% if @form.scopes&.any? %>
16
16
  <div class="field">
17
- <%= form.select :scope_id, @form.scopes.map{|s| [translated_attribute(s.name), s.id]}, prompt: t(".select_a_scope") %>
17
+ <%= form.select :scope_id, @form.scopes.map{|s| [s.name, s.id]}, prompt: t(".select_a_scope") %>
18
18
  </div>
19
19
  <% end %>