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
@@ -0,0 +1,38 @@
1
+ /* eslint-disable no-unused-expressions */
2
+ import { shallow } from 'enzyme';
3
+
4
+ import VoteButton from './vote_button.component';
5
+ import Icon from '../application/icon.component';
6
+
7
+ import stubComponent from '../support/stub_component';
8
+
9
+ describe("<VoteButton />", () => {
10
+ const voteAction = sinon.spy();
11
+ stubComponent(Icon);
12
+
13
+ it("should render the number of votes passed as a prop", () => {
14
+ const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} />);
15
+ expect(wrapper.find('button')).to.include.text(10);
16
+ });
17
+
18
+ it("should render a button with the given buttonClassName", () => {
19
+ const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} />);
20
+ expect(wrapper.find('button.vote-button')).to.be.present();
21
+ });
22
+
23
+ it("should render a Icon component with the correct name prop", () => {
24
+ const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} />);
25
+ expect(wrapper.find(Icon)).to.have.prop("name").equal('vote-icon');
26
+ });
27
+
28
+ it("should call the voteAction prop on click", () => {
29
+ const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} />);
30
+ wrapper.find('button').simulate('click');
31
+ expect(voteAction).to.have.been.called;
32
+ });
33
+
34
+ it("should disable the button based on the disabled prop", () => {
35
+ const wrapper = shallow(<VoteButton votes={10} buttonClassName="vote-button" iconName="vote-icon" voteAction={voteAction} disabled />);
36
+ expect(wrapper.find('button')).to.be.disabled();
37
+ })
38
+ });
@@ -12,14 +12,19 @@ const generateCommentsData = (num = 1) => {
12
12
  commentsData.push({
13
13
  id: random.uuid(),
14
14
  body: random.words(),
15
- createdAt: date.past().toString(),
15
+ createdAt: date.past().toISOString(),
16
16
  author: {
17
17
  name: name.findName(),
18
18
  avatarUrl: image.imageUrl()
19
19
  },
20
+ hasReplies: false,
20
21
  replies: [],
21
22
  canHaveReplies: true,
22
- alignment: 0
23
+ alignment: 0,
24
+ upVotes: random.number(),
25
+ upVoted: false,
26
+ downVotes: random.number(),
27
+ downVoted: false
23
28
  })
24
29
  }
25
30
 
@@ -18,7 +18,7 @@ module Decidim
18
18
 
19
19
  react_comments_component(node_id, commentableType: commentable_type,
20
20
  commentableId: commentable_id,
21
- options: options.slice(:arguable),
21
+ options: options.slice(:arguable, :votable),
22
22
  locale: I18n.locale)
23
23
  end
24
24
 
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Comments
4
+ # Abstract class from which all models in this engine inherit.
5
+ class ApplicationRecord < ActiveRecord::Base
6
+ self.abstract_class = true
7
+ end
8
+ end
9
+ end
@@ -13,10 +13,11 @@ module Decidim
13
13
  # |--R (depth 3)
14
14
  MAX_DEPTH = 3
15
15
 
16
- belongs_to :author, class_name: Decidim::User
17
- belongs_to :commentable, polymorphic: true
18
- has_many :replies, as: :commentable, class_name: Comment
19
-
16
+ belongs_to :author, foreign_key: "decidim_author_id", class_name: Decidim::User
17
+ belongs_to :commentable, foreign_key: "decidim_commentable_id", foreign_type: "decidim_commentable_type", polymorphic: true
18
+ has_many :replies, as: :commentable, foreign_key: "decidim_commentable_id", foreign_type: "decidim_commentable_type", class_name: Comment
19
+ has_many :up_votes, -> { where(weight: 1) }, foreign_key: "decidim_comment_id", class_name: CommentVote, dependent: :destroy
20
+ has_many :down_votes, -> { where(weight: -1) }, foreign_key: "decidim_comment_id", class_name: CommentVote, dependent: :destroy
20
21
  validates :author, :commentable, :body, presence: true
21
22
  validate :commentable_can_have_replies
22
23
  validates :depth, numericality: { greater_than_or_equal_to: 0 }
@@ -34,6 +35,20 @@ module Decidim
34
35
  depth < MAX_DEPTH
35
36
  end
36
37
 
38
+ # Public: Check if the user has upvoted the comment
39
+ #
40
+ # Returns a bool value to indicate if the condition is truthy or not
41
+ def up_voted_by?(user)
42
+ up_votes.any? { |vote| vote.author == user }
43
+ end
44
+
45
+ # Public: Check if the user has downvoted the comment
46
+ #
47
+ # Returns a bool value to indicate if the condition is truthy or not
48
+ def down_voted_by?(user)
49
+ down_votes.any? { |vote| vote.author == user }
50
+ end
51
+
37
52
  private
38
53
 
39
54
  # Private: Check if commentable can have replies and if not adds
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Comments
4
+ # A comment can include user votes. A user should be able to upVote, votes with
5
+ # weight 1 and downVote, votes with weight -1.
6
+ class CommentVote < ApplicationRecord
7
+ belongs_to :comment, foreign_key: "decidim_comment_id", class_name: Comment
8
+ belongs_to :author, foreign_key: "decidim_author_id", class_name: Decidim::User
9
+
10
+ validates :comment, uniqueness: { scope: :author }
11
+ validates :weight, inclusion: { in: [-1, 1] }
12
+ validate :author_and_comment_same_organization
13
+
14
+ private
15
+
16
+ # Private: check if the comment and the author have the same organization
17
+ def author_and_comment_same_organization
18
+ errors.add(:comment, :invalid) unless author.organization == comment.organization
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Comments
4
+ # A comment can belong to many Commentable models. This class is responsible
5
+ # to Seed those models in order to be able to use them in the development
6
+ # app.
7
+ class Seed
8
+ # Public: adds a random amount of comments for a given resource.
9
+ #
10
+ # resource - the resource to add the coments to.
11
+ #
12
+ # Returns nothing.
13
+ def self.comments_for(resource)
14
+ organization = resource.organization
15
+
16
+ rand(1..5).times do
17
+ random = rand(Decidim::User.count)
18
+ Comment.create(
19
+ commentable: resource,
20
+ body: ::Faker::Lorem.sentence,
21
+ author: Decidim::User.where(organization: organization).offset(random).first
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Comments
4
+ # A class used to find comments for a commentable resource
5
+ class CommentsWithReplies < Rectify::Query
6
+ attr_reader :commentable
7
+
8
+ # Syntactic sugar to initialize the class and return the queried objects.
9
+ #
10
+ # commentable - a resource that can have comments
11
+ # options - The Hash options is used to refine the selection ( default: {}):
12
+ # :order_by - The string order_by to sort by ( optional )
13
+ def self.for(commentable, options = {})
14
+ new(commentable, options).query
15
+ end
16
+
17
+ # Initializes the class.
18
+ #
19
+ # commentable = a resource that can have comments
20
+ # options - The Hash options is used to refine the selection ( default: {}):
21
+ # :order_by - The string order_by to sort by ( optional )
22
+ def initialize(commentable, options = {})
23
+ options[:order_by] ||= "older"
24
+ @commentable = commentable
25
+ @options = options
26
+ end
27
+
28
+ # Finds the Comments for a resource that can have comments and eager
29
+ # loads comments replies. It uses Comment's MAX_DEPTH to load a maximum
30
+ # level of nested replies.
31
+ def query
32
+ scope = Comment
33
+ .where(commentable: commentable)
34
+ .includes(:author, :up_votes, :down_votes)
35
+ .includes(
36
+ replies: [:author, :up_votes, :down_votes,
37
+ replies: [:author, :up_votes, :down_votes,
38
+ replies: [:author, :up_votes, :down_votes]]]
39
+ )
40
+
41
+ scope = case @options[:order_by]
42
+ when "older"
43
+ order_by_older(scope)
44
+ when "recent"
45
+ order_by_recent(scope)
46
+ when "best_rated"
47
+ order_by_best_rated(scope)
48
+ when "most_discussed"
49
+ order_by_most_discussed(scope)
50
+ else
51
+ order_by_older(scope)
52
+ end
53
+
54
+ scope
55
+ end
56
+
57
+ private
58
+
59
+ def order_by_older(scope)
60
+ scope.order(created_at: :asc)
61
+ end
62
+
63
+ def order_by_recent(scope)
64
+ scope.order(created_at: :desc)
65
+ end
66
+
67
+ def order_by_best_rated(scope)
68
+ scope.sort_by do |comment|
69
+ comment.up_votes.size - comment.down_votes.size
70
+ end.reverse
71
+ end
72
+
73
+ def order_by_most_discussed(scope)
74
+ scope.sort_by do |comment|
75
+ count_replies(comment)
76
+ end.reverse
77
+ end
78
+
79
+ def count_replies(comment)
80
+ if comment.replies.size.positive?
81
+ comment.replies.size + comment.replies.map { |reply| count_replies(reply) }.sum
82
+ else
83
+ 0
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Comments
4
+ # A GraphQL resolver to handle `upVote` and `downVote` mutations
5
+ # It creates a vote for a comment by the current user.
6
+ class VoteCommentResolver
7
+ def initialize(options = { weight: 1 })
8
+ @weight = options[:weight]
9
+ end
10
+
11
+ def call(obj, _args, ctx)
12
+ Decidim::Comments::VoteComment.call(obj, ctx[:current_user], weight: @weight) do
13
+ on(:ok) do |comment|
14
+ return comment
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Comments
4
+ CommentMutationType = GraphQL::ObjectType.define do
5
+ name "CommentMutation"
6
+ description "A comment which includes its available mutations"
7
+
8
+ field :id, !types.ID, "The Comment's unique ID"
9
+
10
+ field :upVote, Decidim::Comments::CommentType do
11
+ resolve VoteCommentResolver.new(weight: 1)
12
+ end
13
+
14
+ field :downVote, Decidim::Comments::CommentType do
15
+ resolve VoteCommentResolver.new(weight: -1)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -11,18 +11,54 @@ module Decidim
11
11
  field :body, !types.String, "The comment message"
12
12
 
13
13
  field :createdAt, !types.String, "The creation date of the comment" do
14
- property :created_at
14
+ resolve lambda { |obj, _args, _ctx|
15
+ obj.created_at.iso8601
16
+ }
15
17
  end
16
18
 
17
19
  field :author, !AuthorType, "The comment's author"
18
20
 
19
- field :replies, !types[CommentType], "The comment's replies"
21
+ field :replies, !types[CommentType], "The comment's replies" do
22
+ resolve lambda { |obj, _args, _ctx|
23
+ obj.replies.sort_by(&:created_at)
24
+ }
25
+ end
26
+
27
+ field :hasReplies, !types.Boolean, "Check if the comment has replies" do
28
+ resolve lambda { |obj, _args, _ctx|
29
+ obj.replies.size.positive?
30
+ }
31
+ end
20
32
 
21
33
  field :canHaveReplies, !types.Boolean, "Define if a comment can or not have replies" do
22
34
  property :can_have_replies?
23
35
  end
24
36
 
25
37
  field :alignment, types.Int, "The comment's alignment. Can be 0 (neutral), 1 (in favor) or -1 (against)'"
38
+
39
+ field :upVotes, !types.Int, "The number of comment's upVotes" do
40
+ resolve lambda { |obj, _args, _ctx|
41
+ obj.up_votes.size
42
+ }
43
+ end
44
+
45
+ field :upVoted, !types.Boolean, "Check if the current user has upvoted the comment" do
46
+ resolve lambda { |obj, _args, ctx|
47
+ obj.up_voted_by?(ctx[:current_user])
48
+ }
49
+ end
50
+
51
+ field :downVotes, !types.Int, "The number of comment's downVotes" do
52
+ resolve lambda { |obj, _args, _ctx|
53
+ obj.down_votes.size
54
+ }
55
+ end
56
+
57
+ field :downVoted, !types.Boolean, "Check if the current user has downvoted the comment" do
58
+ resolve lambda { |obj, _args, ctx|
59
+ obj.down_voted_by?(ctx[:current_user])
60
+ }
61
+ end
26
62
  end
27
63
  end
28
64
  end
@@ -31,6 +31,7 @@ en:
31
31
  comment_thread:
32
32
  title: Conversation with %{authorName}
33
33
  comments:
34
+ loading: Loading comments ...
34
35
  title: "%{count} comments"
35
36
  featured_comment:
36
37
  title: Featured comment
@@ -2,10 +2,12 @@ class CreateComments < ActiveRecord::Migration[5.0]
2
2
  def change
3
3
  create_table :decidim_comments_comments do |t|
4
4
  t.text :body, null: false
5
- t.references :commentable, null: false, polymorphic: true, index: { name: "decidim_comments_comment_commentable" }
6
- t.references :author, null: false, index: { name: "decidim_comments_comment_author" }
5
+ t.references :decidim_commentable, null: false, polymorphic: true, index: { name: "decidim_comments_comment_commentable" }
6
+ t.references :decidim_author, null: false, index: { name: "decidim_comments_comment_author" }
7
7
 
8
8
  t.timestamps
9
9
  end
10
+
11
+ add_index :decidim_comments_comments, :created_at
10
12
  end
11
13
  end
@@ -0,0 +1,13 @@
1
+ class CreateCommentVotes < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :decidim_comments_comment_votes do |t|
4
+ t.integer :weight, null: false
5
+ t.references :decidim_comment, null: false, index: { name: "decidim_comments_comment_vote_comment" }
6
+ t.references :decidim_author, null: false, index: { name: "decidim_comments_comment_vote_author" }
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :decidim_comments_comment_votes, [:decidim_comment_id, :decidim_author_id], unique: true, name: "decidim_comments_comment_vote_comment_author_unique"
12
+ end
13
+ end
@@ -15,11 +15,8 @@ Gem::Specification.new do |s|
15
15
 
16
16
  s.add_dependency "decidim-core", Decidim.version
17
17
  s.add_dependency "rails", *Decidim.rails_version
18
- s.add_dependency "foundation-rails", "~> 6.2.4.0"
19
- s.add_dependency "sassc-rails", "~> 1.3.0"
20
18
  s.add_dependency "jquery-rails", "~> 4.0"
21
19
  s.add_dependency "turbolinks", *Decidim.rails_version
22
- s.add_dependency "foundation_rails_helper", "~> 2.0.0"
23
20
 
24
21
  s.add_development_dependency "decidim-dev", Decidim.version
25
22
  end
@@ -29,6 +29,15 @@ module Decidim
29
29
  end
30
30
  }
31
31
  end
32
+
33
+ field :comment, Decidim::Comments::CommentMutationType do
34
+ description "A comment"
35
+ argument :id, !types.ID, "The comment's id"
36
+
37
+ resolve lambda { |_obj, args, _ctx|
38
+ Comment.find(args["id"])
39
+ }
40
+ end
32
41
  end
33
42
  end
34
43
  end
@@ -17,13 +17,11 @@ module Decidim
17
17
 
18
18
  argument :commentableId, !types.String, "The commentable's ID"
19
19
  argument :commentableType, !types.String, "The commentable's class name. i.e. `Decidim::ParticipatoryProcess`"
20
+ argument :orderBy, types.String, "Order the comments"
20
21
 
21
22
  resolve lambda { |_obj, args, _ctx|
22
- Comment
23
- .where(commentable_id: args[:commentableId])
24
- .where(commentable_type: args[:commentableType])
25
- .order(created_at: :asc)
26
- .all
23
+ commentable = args[:commentableType].constantize.find(args[:commentableId])
24
+ CommentsWithReplies.for(commentable, order_by: args[:orderBy])
27
25
  }
28
26
  end
29
27
  end