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,233 @@
1
+ (function (root) {
2
+
3
+ // Store setTimeout reference so promise-polyfill will be unaffected by
4
+ // other code modifying setTimeout (like sinon.useFakeTimers())
5
+ var setTimeoutFunc = setTimeout;
6
+
7
+ function noop() {}
8
+
9
+ // Polyfill for Function.prototype.bind
10
+ function bind(fn, thisArg) {
11
+ return function () {
12
+ fn.apply(thisArg, arguments);
13
+ };
14
+ }
15
+
16
+ function Promise(fn) {
17
+ if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new');
18
+ if (typeof fn !== 'function') throw new TypeError('not a function');
19
+ this._state = 0;
20
+ this._handled = false;
21
+ this._value = undefined;
22
+ this._deferreds = [];
23
+
24
+ doResolve(fn, this);
25
+ }
26
+
27
+ function handle(self, deferred) {
28
+ while (self._state === 3) {
29
+ self = self._value;
30
+ }
31
+ if (self._state === 0) {
32
+ self._deferreds.push(deferred);
33
+ return;
34
+ }
35
+ self._handled = true;
36
+ Promise._immediateFn(function () {
37
+ var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
38
+ if (cb === null) {
39
+ (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
40
+ return;
41
+ }
42
+ var ret;
43
+ try {
44
+ ret = cb(self._value);
45
+ } catch (e) {
46
+ reject(deferred.promise, e);
47
+ return;
48
+ }
49
+ resolve(deferred.promise, ret);
50
+ });
51
+ }
52
+
53
+ function resolve(self, newValue) {
54
+ try {
55
+ // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
56
+ if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');
57
+ if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
58
+ var then = newValue.then;
59
+ if (newValue instanceof Promise) {
60
+ self._state = 3;
61
+ self._value = newValue;
62
+ finale(self);
63
+ return;
64
+ } else if (typeof then === 'function') {
65
+ doResolve(bind(then, newValue), self);
66
+ return;
67
+ }
68
+ }
69
+ self._state = 1;
70
+ self._value = newValue;
71
+ finale(self);
72
+ } catch (e) {
73
+ reject(self, e);
74
+ }
75
+ }
76
+
77
+ function reject(self, newValue) {
78
+ self._state = 2;
79
+ self._value = newValue;
80
+ finale(self);
81
+ }
82
+
83
+ function finale(self) {
84
+ if (self._state === 2 && self._deferreds.length === 0) {
85
+ Promise._immediateFn(function() {
86
+ if (!self._handled) {
87
+ Promise._unhandledRejectionFn(self._value);
88
+ }
89
+ });
90
+ }
91
+
92
+ for (var i = 0, len = self._deferreds.length; i < len; i++) {
93
+ handle(self, self._deferreds[i]);
94
+ }
95
+ self._deferreds = null;
96
+ }
97
+
98
+ function Handler(onFulfilled, onRejected, promise) {
99
+ this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
100
+ this.onRejected = typeof onRejected === 'function' ? onRejected : null;
101
+ this.promise = promise;
102
+ }
103
+
104
+ /**
105
+ * Take a potentially misbehaving resolver function and make sure
106
+ * onFulfilled and onRejected are only called once.
107
+ *
108
+ * Makes no guarantees about asynchrony.
109
+ */
110
+ function doResolve(fn, self) {
111
+ var done = false;
112
+ try {
113
+ fn(function (value) {
114
+ if (done) return;
115
+ done = true;
116
+ resolve(self, value);
117
+ }, function (reason) {
118
+ if (done) return;
119
+ done = true;
120
+ reject(self, reason);
121
+ });
122
+ } catch (ex) {
123
+ if (done) return;
124
+ done = true;
125
+ reject(self, ex);
126
+ }
127
+ }
128
+
129
+ Promise.prototype['catch'] = function (onRejected) {
130
+ return this.then(null, onRejected);
131
+ };
132
+
133
+ Promise.prototype.then = function (onFulfilled, onRejected) {
134
+ var prom = new (this.constructor)(noop);
135
+
136
+ handle(this, new Handler(onFulfilled, onRejected, prom));
137
+ return prom;
138
+ };
139
+
140
+ Promise.all = function (arr) {
141
+ var args = Array.prototype.slice.call(arr);
142
+
143
+ return new Promise(function (resolve, reject) {
144
+ if (args.length === 0) return resolve([]);
145
+ var remaining = args.length;
146
+
147
+ function res(i, val) {
148
+ try {
149
+ if (val && (typeof val === 'object' || typeof val === 'function')) {
150
+ var then = val.then;
151
+ if (typeof then === 'function') {
152
+ then.call(val, function (val) {
153
+ res(i, val);
154
+ }, reject);
155
+ return;
156
+ }
157
+ }
158
+ args[i] = val;
159
+ if (--remaining === 0) {
160
+ resolve(args);
161
+ }
162
+ } catch (ex) {
163
+ reject(ex);
164
+ }
165
+ }
166
+
167
+ for (var i = 0; i < args.length; i++) {
168
+ res(i, args[i]);
169
+ }
170
+ });
171
+ };
172
+
173
+ Promise.resolve = function (value) {
174
+ if (value && typeof value === 'object' && value.constructor === Promise) {
175
+ return value;
176
+ }
177
+
178
+ return new Promise(function (resolve) {
179
+ resolve(value);
180
+ });
181
+ };
182
+
183
+ Promise.reject = function (value) {
184
+ return new Promise(function (resolve, reject) {
185
+ reject(value);
186
+ });
187
+ };
188
+
189
+ Promise.race = function (values) {
190
+ return new Promise(function (resolve, reject) {
191
+ for (var i = 0, len = values.length; i < len; i++) {
192
+ values[i].then(resolve, reject);
193
+ }
194
+ });
195
+ };
196
+
197
+ // Use polyfill for setImmediate for performance gains
198
+ Promise._immediateFn = (typeof setImmediate === 'function' && function (fn) { setImmediate(fn); }) ||
199
+ function (fn) {
200
+ setTimeoutFunc(fn, 0);
201
+ };
202
+
203
+ Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
204
+ if (typeof console !== 'undefined' && console) {
205
+ console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
206
+ }
207
+ };
208
+
209
+ /**
210
+ * Set the immediate function to execute callbacks
211
+ * @param fn {function} Function to execute
212
+ * @deprecated
213
+ */
214
+ Promise._setImmediateFn = function _setImmediateFn(fn) {
215
+ Promise._immediateFn = fn;
216
+ };
217
+
218
+ /**
219
+ * Change the function to execute on unhandled rejection
220
+ * @param {function} fn Function to execute on unhandled rejection
221
+ * @deprecated
222
+ */
223
+ Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
224
+ Promise._unhandledRejectionFn = fn;
225
+ };
226
+
227
+ if (typeof module !== 'undefined' && module.exports) {
228
+ module.exports = Promise;
229
+ } else if (!root.Promise) {
230
+ root.Promise = Promise;
231
+ }
232
+
233
+ })(this);
@@ -49,8 +49,8 @@ module Decidim
49
49
  end
50
50
  end
51
51
 
52
- def bullet
53
- template "bullet.rb", "#{dummy_path}/config/initializers/bullet.rb"
52
+ def decidim_dev
53
+ template "decidim_dev.rb", "#{dummy_path}/config/initializers/decidim_dev.rb"
54
54
  end
55
55
 
56
56
  private
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ require "decidim/dev"
@@ -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
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36.02 36.02"><path d="M693.07,543.84a18,18,0,1,1,18-18A18,18,0,0,1,693.07,543.84Zm0-34a16,16,0,1,0,16,16A16,16,0,0,0,693.07,509.83Z" transform="translate(-675.07 -507.83)"/><path d="M693.07,526.93a4.1,4.1,0,1,1,4.1-4.1A4.1,4.1,0,0,1,693.07,526.93Zm0-6.19a2.1,2.1,0,1,0,2.1,2.1A2.1,2.1,0,0,0,693.07,520.74Z" transform="translate(-675.07 -507.83)"/><path d="M693.07,536.65a1,1,0,0,1-.67-0.26c-0.29-.26-7.11-6.5-7.11-14a7.78,7.78,0,0,1,15.57,0c0,7.46-6.82,13.71-7.11,14A1,1,0,0,1,693.07,536.65Zm0-20a5.79,5.79,0,0,0-5.78,5.78c0,5.29,4.13,10.11,5.78,11.82,1.65-1.72,5.78-6.54,5.78-11.82A5.79,5.79,0,0,0,693.07,516.64Z" transform="translate(-675.07 -507.83)"/></svg>
@@ -23,6 +23,8 @@ module Decidim
23
23
 
24
24
  def create_meeting
25
25
  Meeting.create!(
26
+ scope: @form.scope,
27
+ category: @form.category,
26
28
  title: @form.title,
27
29
  short_description: @form.short_description,
28
30
  description: @form.description,
@@ -28,6 +28,8 @@ module Decidim
28
28
 
29
29
  def update_meeting
30
30
  @meeting.update_attributes!(
31
+ scope: @form.scope,
32
+ category: @form.category,
31
33
  title: @form.title,
32
34
  short_description: @form.short_description,
33
35
  description: @form.description,
@@ -2,23 +2,47 @@
2
2
 
3
3
  module Decidim
4
4
  module Meetings
5
- # This controller is the abstract class from which all other controllers of
6
- # this engine inherit.
7
- #
8
- # Note that it inherits from `Decidim::Features::BaseController`, which
9
- # override its layout and provide all kinds of useful methods.
5
+ # Exposes the meeting resource so users can view them
10
6
  class MeetingsController < Decidim::Meetings::ApplicationController
7
+ include FilterResource
8
+
11
9
  helper_method :meetings, :meeting
12
10
 
11
+ def index; end
12
+
13
13
  private
14
14
 
15
15
  def meetings
16
- @meetings ||= Meeting.where(decidim_feature_id: current_feature.id).order(start_time: :asc)
16
+ @meetings ||= search.results
17
17
  end
18
18
 
19
19
  def meeting
20
20
  @meeting ||= meetings.find(params[:id])
21
21
  end
22
+
23
+ def search_klass
24
+ MeetingSearch
25
+ end
26
+
27
+ def default_search_params
28
+ {
29
+ page: params[:page],
30
+ per_page: 12
31
+ }
32
+ end
33
+
34
+ def default_filter_params
35
+ {
36
+ order_start_time: "asc",
37
+ search_text: "",
38
+ scope_id: "",
39
+ category_id: ""
40
+ }
41
+ end
42
+
43
+ def context_params
44
+ { feature: current_feature, organization: current_organization }
45
+ end
22
46
  end
23
47
  end
24
48
  end
@@ -14,6 +14,8 @@ module Decidim
14
14
  attribute :address, String
15
15
  attribute :start_time, DateTime
16
16
  attribute :end_time, DateTime
17
+ attribute :decidim_scope_id, Integer
18
+ attribute :decidim_category_id, Integer
17
19
 
18
20
  validates :title, translatable_presence: true
19
21
  validates :short_description, translatable_presence: true
@@ -24,6 +26,18 @@ module Decidim
24
26
  validates :end_time, presence: true, date: { after: :start_time }
25
27
 
26
28
  validates :current_feature, presence: true
29
+ validates :scope, presence: true, if: ->(form) { form.decidim_scope_id.present? }
30
+ validates :category, presence: true, if: ->(form) { form.decidim_category_id.present? }
31
+
32
+ def scope
33
+ return unless current_feature
34
+ @scope ||= current_feature.scopes.where(id: decidim_scope_id).first
35
+ end
36
+
37
+ def category
38
+ return unless current_feature
39
+ @category ||= current_feature.categories.where(id: decidim_category_id).first
40
+ end
27
41
  end
28
42
  end
29
43
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Meetings
4
+ # Custom helpers, scoped to the meetings engine.
5
+ #
6
+ module ApplicationHelper
7
+ include PaginateHelper
8
+ end
9
+ end
10
+ end
@@ -5,8 +5,25 @@ module Decidim
5
5
  # title, description and any other useful information to render a custom meeting.
6
6
  class Meeting < Meetings::ApplicationRecord
7
7
  belongs_to :feature, foreign_key: "decidim_feature_id", class_name: Decidim::Feature
8
-
8
+ belongs_to :scope, foreign_key: "decidim_scope_id", class_name: Decidim::Scope
9
+ belongs_to :category, foreign_key: "decidim_category_id", class_name: Decidim::Category
10
+ has_one :organization, through: :feature
9
11
  validates :title, presence: true
12
+
13
+ validate :scope_belongs_to_organization
14
+ validate :category_belongs_to_organization
15
+
16
+ private
17
+
18
+ def scope_belongs_to_organization
19
+ return unless scope
20
+ errors.add(:scope, :invalid) unless feature.scopes.where(id: scope.id).exists?
21
+ end
22
+
23
+ def category_belongs_to_organization
24
+ return unless category
25
+ errors.add(:category, :invalid) unless feature.categories.where(id: category.id).exists?
26
+ end
10
27
  end
11
28
  end
12
29
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Meetings
4
+ # This class handles search and filtering of meetings. Needs a
5
+ # `current_feature` param with a `Decidim::Feature` in order to
6
+ # find the meetings.
7
+ class MeetingSearch < ResourceSearch
8
+ # Public: Initializes the service.
9
+ # feature - A Decidim::Feature to get the meetings from.
10
+ # page - The page number to paginate the results.
11
+ # per_page - The number of proposals to return per page.
12
+ def initialize(options = {})
13
+ super(Meeting.all, options)
14
+ end
15
+
16
+ # Handle the search_text filter
17
+ def search_search_text
18
+ query
19
+ .where(localized_search_text_in(:title), text: "%#{search_text}%")
20
+ .or(query.where(localized_search_text_in(:description), text: "%#{search_text}%"))
21
+ .or(query.where(localized_search_text_in(:short_description), text: "%#{search_text}%"))
22
+ end
23
+
24
+ # Handle the order_start_time filter
25
+ def search_order_start_time
26
+ query.order(start_time: order_start_time)
27
+ end
28
+
29
+ # Handle the scope_id filter
30
+ def search_scope_id
31
+ query.where(decidim_scope_id: scope_id)
32
+ end
33
+
34
+ private
35
+
36
+ # Internal: builds the needed query to search for a text in the organization's
37
+ # available locales. Note that it is intended to be used as follows:
38
+ #
39
+ # Example:
40
+ # Resource.where(localized_search_text_for(:title, text: "my_query"))
41
+ #
42
+ # The Hash with the `:text` key is required or it won't work.
43
+ def localized_search_text_in(field)
44
+ options[:organization].available_locales.map { |l| "#{field} ->> '#{l}' ILIKE :text" }.join(" OR ")
45
+ end
46
+ end
47
+ end
48
+ end