decidim 0.0.4 → 0.0.5

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.json +2 -5
  3. data/.mention-bot +2 -1
  4. data/.yardopts +8 -0
  5. data/Gemfile.lock +64 -62
  6. data/README.md +11 -9
  7. data/decidim-admin/app/assets/javascripts/decidim/admin/sort_steps.js.es6 +3 -3
  8. data/decidim-admin/app/assets/stylesheets/decidim/admin/_email_preview.scss +5 -0
  9. data/decidim-admin/app/assets/stylesheets/decidim/admin/application.scss +1 -0
  10. data/decidim-admin/app/commands/decidim/admin/create_newsletter.rb +30 -0
  11. data/decidim-admin/app/commands/decidim/admin/deliver_newsletter.rb +29 -0
  12. data/decidim-admin/app/commands/decidim/admin/destroy_participatory_process_step.rb +9 -0
  13. data/decidim-admin/app/commands/decidim/admin/update_newsletter.rb +33 -0
  14. data/decidim-admin/app/constraints/decidim/admin/organization_dashboard_constraint.rb +1 -1
  15. data/decidim-admin/app/controllers/decidim/admin/features_controller.rb +2 -2
  16. data/decidim-admin/app/controllers/decidim/admin/newsletters_controller.rb +115 -0
  17. data/decidim-admin/app/controllers/decidim/admin/participatory_processes_controller.rb +4 -4
  18. data/decidim-admin/app/forms/decidim/admin/newsletter_form.rb +15 -0
  19. data/decidim-admin/app/jobs/decidim/admin/newsletter_delivery_job.rb +18 -0
  20. data/decidim-admin/app/jobs/decidim/admin/newsletter_job.rb +32 -0
  21. data/decidim-admin/app/models/decidim/admin/abilities/admin_user.rb +4 -0
  22. data/decidim-admin/app/models/decidim/admin/abilities/base.rb +4 -0
  23. data/decidim-admin/app/models/decidim/admin/abilities/collaborator_user.rb +19 -0
  24. data/decidim-admin/app/models/decidim/admin/abilities/participatory_process_admin.rb +1 -1
  25. data/decidim-admin/app/queries/decidim/admin/manageable_participatory_processes_for_user.rb +1 -1
  26. data/decidim-admin/app/views/decidim/admin/newsletters/_form.html.erb +5 -0
  27. data/decidim-admin/app/views/decidim/admin/newsletters/edit.html.erb +11 -0
  28. data/decidim-admin/app/views/decidim/admin/newsletters/index.html.erb +47 -0
  29. data/decidim-admin/app/views/decidim/admin/newsletters/new.html.erb +11 -0
  30. data/decidim-admin/app/views/decidim/admin/newsletters/show.html.erb +14 -0
  31. data/decidim-admin/app/views/decidim/admin/participatory_process_steps/_form.html.erb +1 -1
  32. data/decidim-admin/app/views/decidim/admin/participatory_processes/_form.html.erb +1 -1
  33. data/decidim-admin/app/views/decidim/admin/static_pages/_form.html.erb +1 -1
  34. data/decidim-admin/app/views/layouts/decidim/admin/_sidebar.html.erb +1 -0
  35. data/decidim-admin/config/locales/ca.yml +40 -0
  36. data/decidim-admin/config/locales/en.yml +40 -0
  37. data/decidim-admin/config/locales/es.yml +40 -0
  38. data/decidim-admin/config/routes.rb +7 -0
  39. data/decidim-admin/decidim-admin.gemspec +0 -1
  40. data/decidim-admin/lib/decidim/admin/engine.rb +1 -0
  41. data/decidim-admin/lib/decidim/admin/features/base_controller.rb +5 -1
  42. data/decidim-admin/spec/commands/create_newsletter_spec.rb +62 -0
  43. data/decidim-admin/spec/commands/deliver_newsletter_spec.rb +45 -0
  44. data/decidim-admin/spec/commands/destroy_participatory_process_step_spec.rb +12 -0
  45. data/decidim-admin/spec/commands/update_newsletter_spec.rb +64 -0
  46. data/decidim-admin/spec/features/admin_manages_newsletters_spec.rb +147 -0
  47. data/decidim-admin/spec/features/admin_manages_participatory_processes_spec.rb +1 -5
  48. data/decidim-admin/spec/features/static_pages_spec.rb +16 -0
  49. data/decidim-admin/spec/forms/newsletter_form_spec.rb +47 -0
  50. data/decidim-admin/spec/jobs/newsletter_delivery_job_spec.rb +25 -0
  51. data/decidim-admin/spec/jobs/newsletter_job_spec.rb +29 -0
  52. data/decidim-admin/spec/models/abilities/collaborator_user_spec.rb +66 -0
  53. data/decidim-admin/spec/organization_dashboard_constraint_spec.rb +55 -0
  54. data/decidim-admin/spec/queries/manageable_participatory_processes_for_user_spec.rb +8 -0
  55. data/decidim-admin/spec/shared/manage_processes_examples.rb +1 -5
  56. data/decidim-api/lib/decidim/api.rb +2 -7
  57. data/decidim-api/lib/decidim/api/{types/mutation.rb → mutation_type.rb} +0 -0
  58. data/decidim-api/lib/decidim/api/{types/query.rb → query_type.rb} +0 -0
  59. data/decidim-budgets/app/assets/javascripts/decidim/budgets/projects.js.es6 +4 -4
  60. data/decidim-budgets/app/commands/decidim/budgets/add_line_item.rb +4 -2
  61. data/decidim-budgets/app/commands/decidim/budgets/checkout.rb +7 -3
  62. data/decidim-budgets/app/models/decidim/budgets/order.rb +16 -1
  63. data/decidim-budgets/app/models/decidim/budgets/project.rb +16 -0
  64. data/decidim-budgets/app/views/decidim/budgets/line_items/update_budget.js.erb +7 -7
  65. data/decidim-budgets/app/views/decidim/budgets/projects/_budget_confirm.html.erb +27 -25
  66. data/decidim-budgets/app/views/decidim/budgets/projects/_budget_summary.html.erb +4 -13
  67. data/decidim-budgets/app/views/decidim/budgets/projects/_order_progress.html.erb +23 -21
  68. data/decidim-budgets/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +25 -23
  69. data/decidim-budgets/app/views/decidim/budgets/projects/_order_total_budget.html.erb +3 -1
  70. data/decidim-budgets/app/views/decidim/budgets/projects/_project.html.erb +32 -30
  71. data/decidim-budgets/app/views/decidim/budgets/projects/_projects.html.erb +1 -3
  72. data/decidim-budgets/app/views/decidim/budgets/projects/index.html.erb +0 -4
  73. data/decidim-budgets/app/views/decidim/budgets/projects/show.html.erb +5 -6
  74. data/decidim-budgets/config/i18n-tasks.yml +1 -0
  75. data/decidim-budgets/config/locales/ca.yml +7 -2
  76. data/decidim-budgets/config/locales/en.yml +17 -6
  77. data/decidim-budgets/config/locales/es.yml +7 -2
  78. data/decidim-budgets/lib/decidim/budgets/feature.rb +2 -2
  79. data/decidim-budgets/spec/commands/add_line_item_spec.rb +16 -3
  80. data/decidim-budgets/spec/commands/cancel_order_spec.rb +7 -1
  81. data/decidim-budgets/spec/commands/checkout_spec.rb +9 -2
  82. data/decidim-budgets/spec/commands/remove_line_item_spec.rb +16 -5
  83. data/decidim-budgets/spec/features/orders_spec.rb +8 -2
  84. data/decidim-budgets/spec/models/order_spec.rb +31 -2
  85. data/decidim-budgets/spec/shared/admin_shared_context.rb +1 -1
  86. data/decidim-comments/README.md +1 -1
  87. data/decidim-comments/app/assets/javascripts/decidim/comments/bundle.js +0 -0
  88. data/decidim-comments/app/frontend/comments/add_comment_form.component.jsx +156 -93
  89. data/decidim-comments/app/frontend/comments/add_comment_form.component.test.jsx +36 -23
  90. data/decidim-comments/app/frontend/comments/add_comment_form.mutation.graphql +5 -3
  91. data/decidim-comments/app/frontend/comments/add_comment_form_commentable.fragment.graphql +4 -0
  92. data/decidim-comments/app/frontend/comments/add_comment_form_session.fragment.graphql +6 -0
  93. data/decidim-comments/app/frontend/comments/comment.component.jsx +11 -13
  94. data/decidim-comments/app/frontend/comments/comment.component.test.jsx +22 -21
  95. data/decidim-comments/app/frontend/comments/comment.fragment.graphql +4 -4
  96. data/decidim-comments/app/frontend/comments/comment_data.fragment.graphql +4 -3
  97. data/decidim-comments/app/frontend/comments/comment_order_selector.component.jsx +1 -1
  98. data/decidim-comments/app/frontend/comments/comment_thread.component.jsx +3 -3
  99. data/decidim-comments/app/frontend/comments/comment_thread.component.test.jsx +3 -3
  100. data/decidim-comments/app/frontend/comments/comment_thread.fragment.graphql +1 -1
  101. data/decidim-comments/app/frontend/comments/comments.component.jsx +47 -39
  102. data/decidim-comments/app/frontend/comments/comments.component.test.jsx +51 -38
  103. data/decidim-comments/app/frontend/comments/comments.query.graphql +10 -4
  104. data/decidim-comments/app/frontend/comments/down_vote_button.component.jsx +6 -3
  105. data/decidim-comments/app/frontend/comments/up_vote_button.component.jsx +7 -4
  106. data/decidim-comments/app/frontend/support/generate_comments_data.js +4 -4
  107. data/decidim-comments/app/models/decidim/comments/comment.rb +7 -9
  108. data/decidim-comments/app/queries/decidim/comments/{comments_with_replies.rb → sorted_comments.rb} +3 -8
  109. data/decidim-comments/app/types/decidim/comments/commentable_interface.rb +44 -0
  110. data/decidim-comments/app/types/decidim/comments/commentable_mutation_type.rb +29 -0
  111. data/decidim-comments/app/types/decidim/comments/commentable_type.rb +14 -0
  112. data/decidim-comments/config/locales/ca.yml +3 -1
  113. data/decidim-comments/config/locales/en.yml +5 -2
  114. data/decidim-comments/config/locales/es.yml +3 -1
  115. data/decidim-comments/lib/decidim/comments.rb +4 -0
  116. data/decidim-comments/{app/types/decidim/comments → lib/decidim/comments/api}/add_comment_type.rb +0 -0
  117. data/decidim-comments/{app/types/decidim/comments → lib/decidim/comments/api}/comment_mutation_type.rb +0 -0
  118. data/decidim-comments/{app/types/decidim/comments → lib/decidim/comments/api}/comment_type.rb +11 -17
  119. data/decidim-comments/lib/decidim/comments/commentable.rb +45 -0
  120. data/decidim-comments/lib/decidim/comments/comments_helper.rb +15 -10
  121. data/decidim-comments/lib/decidim/comments/mutation_extensions.rb +8 -16
  122. data/decidim-comments/lib/decidim/comments/query_extensions.rb +5 -8
  123. data/decidim-comments/lib/decidim/comments/test/factories.rb +3 -3
  124. data/decidim-comments/spec/commands/vote_comment_spec.rb +3 -1
  125. data/decidim-comments/spec/features/comments_spec.rb +28 -14
  126. data/decidim-comments/spec/features/notifications_spec.rb +1 -1
  127. data/decidim-comments/spec/helpers/comments_helper_spec.rb +4 -27
  128. data/decidim-comments/spec/models/comment_spec.rb +7 -11
  129. data/decidim-comments/spec/models/comment_vote_spec.rb +3 -1
  130. data/decidim-comments/spec/models/seed_spec.rb +3 -4
  131. data/decidim-comments/spec/queries/{comments_with_replies_spec.rb → sorted_comments_spec.rb} +12 -29
  132. data/decidim-comments/spec/types/comment_type_spec.rb +23 -17
  133. data/decidim-comments/spec/types/commentable_mutation_type_spec.rb +34 -0
  134. data/decidim-comments/spec/types/commentable_type_spec.rb +48 -0
  135. data/decidim-comments/spec/types/mutation_type_spec.rb +5 -22
  136. data/decidim-comments/spec/types/query_type_spec.rb +0 -24
  137. data/decidim-dev/config/i18n-tasks.yml +4 -0
  138. data/decidim-dev/decidim-dev.gemspec +1 -1
  139. data/decidim-dev/lib/decidim/dev/test/rspec_support/action_mailer.rb +10 -4
  140. data/decidim-dev/lib/decidim/dev/test/rspec_support/feature.rb +6 -5
  141. data/decidim-dev/lib/decidim/dev/test/rspec_support/i18n.rb +0 -1
  142. data/decidim-meetings/app/assets/javascripts/decidim/meetings/map.js.es6.erb +8 -3
  143. data/decidim-meetings/app/assets/stylesheets/decidim/meetings/map.css +3 -1
  144. data/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb +2 -2
  145. data/decidim-meetings/app/forms/decidim/meetings/admin/close_meeting_form.rb +2 -1
  146. data/decidim-meetings/app/helpers/decidim/meetings/map_helper.rb +1 -0
  147. data/decidim-meetings/app/services/decidim/meetings/meeting_search.rb +7 -3
  148. data/decidim-meetings/app/views/decidim/meetings/meetings/_datetime.html.erb +1 -1
  149. data/decidim-meetings/app/views/decidim/meetings/meetings/_filters.html.erb +5 -5
  150. data/decidim-meetings/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +1 -1
  151. data/decidim-meetings/app/views/decidim/meetings/meetings/index.html.erb +1 -5
  152. data/decidim-meetings/app/views/decidim/meetings/meetings/show.html.erb +16 -9
  153. data/decidim-meetings/config/locales/ca.yml +2 -3
  154. data/decidim-meetings/config/locales/en.yml +2 -3
  155. data/decidim-meetings/config/locales/es.yml +2 -3
  156. data/decidim-meetings/spec/features/explore_meetings_spec.rb +75 -24
  157. data/decidim-meetings/spec/forms/close_meeting_form_spec.rb +1 -1
  158. data/decidim-meetings/spec/services/meeting_search_spec.rb +15 -12
  159. data/decidim-meetings/vendor/assets/javascripts/leaflet.markercluster.js +7 -0
  160. data/decidim-meetings/vendor/assets/stylesheets/MarkerCluster.Default.css +60 -0
  161. data/decidim-meetings/vendor/assets/stylesheets/MarkerCluster.css +14 -0
  162. data/decidim-pages/app/models/decidim/pages/page.rb +22 -0
  163. data/decidim-pages/app/views/decidim/pages/application/show.html.erb +2 -6
  164. data/decidim-pages/config/locales/ca.yml +2 -2
  165. data/decidim-pages/config/locales/en.yml +2 -2
  166. data/decidim-pages/config/locales/es.yml +2 -2
  167. data/decidim-pages/lib/decidim/pages/feature.rb +2 -2
  168. data/decidim-pages/spec/features/page_show_spec.rb +0 -33
  169. data/decidim-proposals/app/controllers/decidim/proposals/admin/proposal_answers_controller.rb +2 -0
  170. data/decidim-proposals/app/controllers/decidim/proposals/admin/proposals_controller.rb +2 -0
  171. data/decidim-proposals/app/models/decidim/proposals/abilities/admin_user.rb +45 -0
  172. data/decidim-proposals/app/models/decidim/proposals/abilities/process_admin_user.rb +57 -0
  173. data/decidim-proposals/app/models/decidim/proposals/proposal.rb +21 -0
  174. data/decidim-proposals/app/views/decidim/proposals/admin/proposals/_form.html.erb +1 -1
  175. data/decidim-proposals/app/views/decidim/proposals/admin/proposals/index.html.erb +16 -10
  176. data/decidim-proposals/app/views/decidim/proposals/proposal_votes/update_buttons_and_counters.js.erb +4 -4
  177. data/decidim-proposals/app/views/decidim/proposals/proposals/_filters.html.erb +7 -3
  178. data/decidim-proposals/app/views/decidim/proposals/proposals/_proposal.html.erb +2 -6
  179. data/decidim-proposals/app/views/decidim/proposals/proposals/_remaining_votes_count.html.erb +3 -1
  180. data/decidim-proposals/app/views/decidim/proposals/proposals/_tags.html.erb +1 -1
  181. data/decidim-proposals/app/views/decidim/proposals/proposals/_vote_button.html.erb +23 -21
  182. data/decidim-proposals/app/views/decidim/proposals/proposals/_votes_count.html.erb +9 -6
  183. data/decidim-proposals/app/views/decidim/proposals/proposals/_votes_limit.html.erb +1 -3
  184. data/decidim-proposals/app/views/decidim/proposals/proposals/index.html.erb +0 -4
  185. data/decidim-proposals/app/views/decidim/proposals/proposals/new.html.erb +1 -1
  186. data/decidim-proposals/app/views/decidim/proposals/proposals/show.html.erb +2 -6
  187. data/decidim-proposals/config/locales/ca.yml +8 -1
  188. data/decidim-proposals/config/locales/en.yml +8 -1
  189. data/decidim-proposals/config/locales/es.yml +8 -1
  190. data/decidim-proposals/lib/decidim/proposals/admin_engine.rb +7 -0
  191. data/decidim-proposals/lib/decidim/proposals/feature.rb +6 -2
  192. data/decidim-proposals/spec/features/proposals_spec.rb +226 -40
  193. data/decidim-proposals/spec/models/decidim/proposals/abilities/admin_user_spec.rb +62 -0
  194. data/decidim-proposals/spec/models/decidim/proposals/abilities/process_admin_user_spec.rb +63 -0
  195. data/decidim-proposals/spec/shared/manage_proposals_examples.rb +161 -50
  196. data/decidim-results/app/models/decidim/results/result.rb +21 -0
  197. data/decidim-results/app/views/decidim/results/results/index.html.erb +0 -4
  198. data/decidim-results/app/views/decidim/results/results/show.html.erb +2 -8
  199. data/decidim-results/config/i18n-tasks.yml +1 -0
  200. data/decidim-results/config/locales/ca.yml +5 -2
  201. data/decidim-results/config/locales/en.yml +5 -2
  202. data/decidim-results/config/locales/es.yml +5 -2
  203. data/decidim-results/lib/decidim/results/feature.rb +2 -2
  204. data/decidim-results/spec/services/result_stats_calculator_spec.rb +2 -2
  205. data/decidim-results/spec/shared/admin_shared_context.rb +1 -1
  206. data/decidim-system/config/i18n-tasks.yml +1 -1
  207. data/package.json +50 -51
  208. data/yarn.lock +198 -151
  209. metadata +69 -36
  210. data/decidim-admin/spec/features/admin_access_control.rb +0 -52
  211. data/decidim-api/lib/decidim/api/types/author_interface.rb +0 -13
  212. data/decidim-api/lib/decidim/api/types/localized_string.rb +0 -13
  213. data/decidim-api/lib/decidim/api/types/translated_field.rb +0 -44
  214. data/decidim-api/spec/types/localized_string_type_spec.rb +0 -31
  215. data/decidim-api/spec/types/translated_field_type_spec.rb +0 -69
  216. data/decidim-comments/app/frontend/comments/add_comment_form.fragment.graphql +0 -6
@@ -6,9 +6,9 @@ en:
6
6
  name: Page
7
7
  settings:
8
8
  global:
9
- comments_always_enabled: Comments always enabled
10
- step:
11
9
  comments_enabled: Comments enabled
10
+ step:
11
+ comments_blocked: Comments blocked
12
12
  pages:
13
13
  admin:
14
14
  models:
@@ -5,9 +5,9 @@ es:
5
5
  name: Página
6
6
  settings:
7
7
  global:
8
- comments_always_enabled: Comentarios siempre habilitados
9
- step:
10
8
  comments_enabled: Comentarios habilitados
9
+ step:
10
+ comments_blocked: Comentarios bloqueados
11
11
  pages:
12
12
  admin:
13
13
  models:
@@ -20,11 +20,11 @@ Decidim.register_feature(:pages) do |feature|
20
20
  end
21
21
 
22
22
  feature.settings(:global) do |settings|
23
- settings.attribute :comments_always_enabled, type: :boolean
23
+ settings.attribute :comments_enabled, type: :boolean, default: true
24
24
  end
25
25
 
26
26
  feature.settings(:step) do |settings|
27
- settings.attribute :comments_enabled, type: :boolean
27
+ settings.attribute :comments_blocked, type: :boolean, default: false
28
28
  end
29
29
 
30
30
  feature.seeds do
@@ -34,37 +34,4 @@ describe "Show a page", type: :feature do
34
34
  expect(page).to have_content("Content")
35
35
  end
36
36
  end
37
-
38
- describe "page show with comments" do
39
- let!(:comments) { create_list(:comment, 3, commentable: page_feature) }
40
-
41
- context "when the page is commentable" do
42
- before do
43
- feature.settings = { comments_always_enabled: true }
44
- feature.save
45
- visit_feature
46
- end
47
-
48
- it "renders the comments of the page" do
49
- expect(page).to have_selector('.comment', count: comments.length)
50
-
51
- comments.each do |comment|
52
- expect(page).to have_content comment.body
53
- end
54
- end
55
- end
56
-
57
- context "when the page is not commentable" do
58
- before do
59
- feature.settings = { comments_always_enabled: false }
60
- feature.save
61
- visit_feature
62
- end
63
-
64
- it "doesn't render the comments of the page" do
65
- visit_feature
66
- expect(page).not_to have_selector('.comment', count: comments.length)
67
- end
68
- end
69
- end
70
37
  end
@@ -7,10 +7,12 @@ module Decidim
7
7
  helper_method :proposal
8
8
 
9
9
  def edit
10
+ authorize! :update, proposal
10
11
  @form = form(Admin::ProposalAnswerForm).from_model(proposal)
11
12
  end
12
13
 
13
14
  def update
15
+ authorize! :update, proposal
14
16
  @form = form(Admin::ProposalAnswerForm).from_params(params)
15
17
 
16
18
  Admin::AnswerProposal.call(@form, proposal) do
@@ -8,10 +8,12 @@ module Decidim
8
8
  helper_method :proposals
9
9
 
10
10
  def new
11
+ authorize! :create, Proposal
11
12
  @form = form(Admin::ProposalForm).from_params({})
12
13
  end
13
14
 
14
15
  def create
16
+ authorize! :create, Proposal
15
17
  @form = form(Admin::ProposalForm).from_params(params)
16
18
 
17
19
  Admin::CreateProposal.call(@form) do
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Proposals
4
+ module Abilities
5
+ # Defines the abilities related to proposals for a logged in admin user.
6
+ # Intended to be used with `cancancan`.
7
+ class AdminUser
8
+ include CanCan::Ability
9
+
10
+ attr_reader :user, :context
11
+
12
+ def initialize(user, context)
13
+ return unless user && user.role?(:admin)
14
+
15
+ @user = user
16
+ @context = context
17
+
18
+ can :manage, Proposal
19
+ cannot :create, Proposal unless can_create_proposal?
20
+ cannot :update, Proposal unless can_update_proposal?
21
+ end
22
+
23
+ private
24
+
25
+ def current_settings
26
+ context.fetch(:current_settings, nil)
27
+ end
28
+
29
+ def feature_settings
30
+ context.fetch(:feature_settings, nil)
31
+ end
32
+
33
+ def can_create_proposal?
34
+ current_settings.try(:creation_enabled?) &&
35
+ feature_settings.try(:official_proposals_enabled)
36
+ end
37
+
38
+ def can_update_proposal?
39
+ current_settings.try(:proposal_answering_enabled) &&
40
+ feature_settings.try(:proposal_answering_enabled)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Proposals
4
+ module Abilities
5
+ # Defines the abilities related to proposals for a logged in process admin user.
6
+ # Intended to be used with `cancancan`.
7
+ class ProcessAdminUser
8
+ include CanCan::Ability
9
+
10
+ attr_reader :user, :context
11
+
12
+ def initialize(user, context)
13
+ return unless user && !user.role?(:admin)
14
+
15
+ @user = user
16
+ @context = context
17
+
18
+ can :manage, Proposal do |proposal|
19
+ participatory_processes.include?(proposal.feature.participatory_process)
20
+ end
21
+
22
+ cannot :create, Proposal unless can_create_proposal?
23
+ cannot :update, Proposal unless can_update_proposal?
24
+ end
25
+
26
+ private
27
+
28
+ def current_settings
29
+ context.fetch(:current_settings, nil)
30
+ end
31
+
32
+ def feature_settings
33
+ context.fetch(:feature_settings, nil)
34
+ end
35
+
36
+ def current_feature
37
+ context.fetch(:current_feature, nil)
38
+ end
39
+
40
+ def can_create_proposal?
41
+ current_settings.try(:creation_enabled?) &&
42
+ feature_settings.try(:official_proposals_enabled) &&
43
+ participatory_processes.include?(current_feature.try(:participatory_process))
44
+ end
45
+
46
+ def can_update_proposal?
47
+ current_settings.try(:proposal_answering_enabled) &&
48
+ feature_settings.try(:proposal_answering_enabled)
49
+ end
50
+
51
+ def participatory_processes
52
+ @participatory_processes ||= Decidim::Admin::ManageableParticipatoryProcessesForUser.for(@user)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -8,6 +8,7 @@ module Decidim
8
8
  include Decidim::HasFeature
9
9
  include Decidim::HasScope
10
10
  include Decidim::HasCategory
11
+ include Decidim::Comments::Commentable
11
12
 
12
13
  feature_manifest_name "proposals"
13
14
 
@@ -53,6 +54,26 @@ module Decidim
53
54
  def rejected?
54
55
  state == "rejected"
55
56
  end
57
+
58
+ # Public: Overrides the `commentable?` Commentable concern method.
59
+ def commentable?
60
+ feature.settings.comments_enabled?
61
+ end
62
+
63
+ # Public: Overrides the `accepts_new_comments?` Commentable concern method.
64
+ def accepts_new_comments?
65
+ commentable? && !feature.active_step_settings.comments_blocked
66
+ end
67
+
68
+ # Public: Overrides the `comments_have_alignment?` Commentable concern method.
69
+ def comments_have_alignment?
70
+ true
71
+ end
72
+
73
+ # Public: Overrides the `comments_have_votes?` Commentable concern method.
74
+ def comments_have_votes?
75
+ true
76
+ end
56
77
  end
57
78
  end
58
79
  end
@@ -12,7 +12,7 @@
12
12
  </div>
13
13
  <% end %>
14
14
 
15
- <% if @form.scopes&.any? %>
15
+ <% if @form.scopes&.any? && feature_settings.scoped_proposals_enabled %>
16
16
  <div class="field">
17
17
  <%= form.select :scope_id, @form.scopes.map{|s| [s.name, s.id]}, prompt: t(".select_a_scope") %>
18
18
  </div>
@@ -1,15 +1,19 @@
1
1
  <h2><%= t(".title") %></h2>
2
2
 
3
- <div class="actions title">
4
- <%= link_to t("actions.new", scope: "decidim.proposals", name: t("models.proposal.name", scope: "decidim.proposals.admin")), new_proposal_path, class: 'new' if can? :manage, current_feature %>
5
- </div>
3
+ <% if feature_settings.official_proposals_enabled %>
4
+ <div class="actions title">
5
+ <%= link_to t("actions.new", scope: "decidim.proposals", name: t("models.proposal.name", scope: "decidim.proposals.admin")), new_proposal_path, class: 'new' if can? :manage, current_feature %>
6
+ </div>
7
+ <% end %>
6
8
 
7
9
  <table class="stack">
8
10
  <thead>
9
11
  <tr>
10
12
  <th><%= t("models.proposal.fields.title", scope: "decidim.proposals") %></th>
11
13
  <th><%= t("models.proposal.fields.category", scope: "decidim.proposals") %></th>
12
- <th><%= t("models.proposal.fields.scope", scope: "decidim.proposals") %></th>
14
+ <% if feature_settings.scoped_proposals_enabled %>
15
+ <th><%= t("models.proposal.fields.scope", scope: "decidim.proposals") %></th>
16
+ <% end %>
13
17
  <th><%= t("models.proposal.fields.state", scope: "decidim.proposals") %></th>
14
18
  <th class="actions"><%= t("actions.title", scope: "decidim.proposals") %></th>
15
19
  </tr>
@@ -25,16 +29,18 @@
25
29
  <%= translated_attribute proposal.category.name %>
26
30
  <% end %>
27
31
  </td>
28
- <td>
29
- <% if proposal.scope %>
30
- <%= translated_attribute proposal.scope.name %>
31
- <% end %>
32
- </td>
32
+ <% if feature_settings.scoped_proposals_enabled %>
33
+ <td>
34
+ <% if proposal.scope %>
35
+ <%= translated_attribute proposal.scope.name %>
36
+ <% end %>
37
+ </td>
38
+ <% end %>
33
39
  <td>
34
40
  <%= humanize_proposal_state proposal.state %>
35
41
  </td>
36
42
  <td class="actions">
37
- <%= link_to t("actions.answer", scope: "decidim.proposals"), edit_proposal_proposal_answer_path(proposal_id: proposal.id, id: proposal.id) if can? :update, current_feature %>
43
+ <%= link_to t("actions.answer", scope: "decidim.proposals"), edit_proposal_proposal_answer_path(proposal_id: proposal.id, id: proposal.id) if can? :update, proposal %>
38
44
  </td>
39
45
  </tr>
40
46
  <% end %>
@@ -1,14 +1,14 @@
1
1
  var $proposalVotesCount = $('#proposal-<%= proposal.id %>-votes-count');
2
2
  var $proposalVoteButton = $('#proposal-<%= proposal.id %>-vote-button');
3
3
 
4
- $proposalVotesCount.html('<%= j(render partial: 'decidim/proposals/proposals/votes_count', locals: { proposal: proposal, from_proposals_list: @from_proposals_list }) %>');
5
- $proposalVoteButton.html('<%= j(render partial: 'decidim/proposals/proposals/vote_button', locals: { proposal: proposal, from_proposals_list: @from_proposals_list }) %>');
4
+ morphdom($proposalVotesCount[0], '<%= j(render partial: 'decidim/proposals/proposals/votes_count', locals: { proposal: proposal, from_proposals_list: @from_proposals_list }) %>');
5
+ morphdom($proposalVoteButton[0], '<%= j(render partial: 'decidim/proposals/proposals/vote_button', locals: { proposal: proposal, from_proposals_list: @from_proposals_list }) %>');
6
6
 
7
7
  <% if vote_limit_enabled? %>
8
8
  var $remainingVotesCount = $('#remaining-votes-count');
9
9
  var $notVotedButtons = $('.card__button.button').not('.success');
10
10
 
11
- $remainingVotesCount.html('<%= j(render partial: 'decidim/proposals/proposals/remaining_votes_count') %>');
11
+ morphdom($remainingVotesCount[0], '<%= j(render partial: 'decidim/proposals/proposals/remaining_votes_count') %>');
12
12
 
13
13
  <% if remaining_votes_count_for(current_user) == 0 %>
14
14
  $notVotedButtons.attr('disabled', true);
@@ -17,4 +17,4 @@ $proposalVoteButton.html('<%= j(render partial: 'decidim/proposals/proposals/vot
17
17
  $notVotedButtons.attr('disabled', false);
18
18
  $notVotedButtons.val('<%= t('decidim.proposals.proposals.vote_button.vote') %>');
19
19
  <% end %>
20
- <% end %>
20
+ <% end %>
@@ -12,9 +12,13 @@
12
12
  </div>
13
13
  </div>
14
14
 
15
- <%= form.collection_radio_buttons :origin, [["all", t('.all')], ["official", t('.official')], ["citizenship", t('.citizenship')]], :first, :last, legend_title: t('.origin') %>
15
+ <% if feature_settings.official_proposals_enabled %>
16
+ <%= form.collection_radio_buttons :origin, [["all", t('.all')], ["official", t('.official')], ["citizenship", t('.citizenship')]], :first, :last, legend_title: t('.origin') %>
17
+ <% end %>
16
18
 
17
- <%= form.collection_radio_buttons :state, [["all", t('.all')], ["accepted", t('.accepted')], ["rejected", t('.rejected')]], :first, :last, legend_title: t('.state') %>
19
+ <% if feature_settings.proposal_answering_enabled && current_settings.proposal_answering_enabled %>
20
+ <%= form.collection_radio_buttons :state, [["all", t('.all')], ["accepted", t('.accepted')], ["rejected", t('.rejected')]], :first, :last, legend_title: t('.state') %>
21
+ <% end %>
18
22
 
19
23
  <% if linked_classes_for(Decidim::Proposals::Proposal).any? %>
20
24
  <%= form.collection_radio_buttons :related_to, linked_classes_filter_values_for(Decidim::Proposals::Proposal), :first, :last, legend_title: t('.related_to') %>
@@ -24,7 +28,7 @@
24
28
  <%= form.collection_check_boxes :activity, [["voted", t('.voted')]], :first, :last, legend_title: t('.activity') %>
25
29
  <% end %>
26
30
 
27
- <% if current_organization.scopes.any? %>
31
+ <% if current_organization.scopes.any? && feature_settings.scoped_proposals_enabled %>
28
32
  <%= form.collection_check_boxes :scope_id, current_organization.scopes, lambda {|scope| scope.id.to_s}, :name, legend_title: t('.scopes') %>
29
33
  <% end %>
30
34
 
@@ -24,12 +24,8 @@
24
24
  <div class="card__footer">
25
25
  <div class="card__support">
26
26
  <% if current_settings.votes_enabled? %>
27
- <div id="proposal-<%= proposal.id %>-votes-count" class="card__support__data">
28
- <%= render partial: "votes_count", locals: { proposal: proposal, from_proposals_list: true } %>
29
- </div>
30
- <div id="proposal-<%= proposal.id %>-vote-button">
31
- <%= render partial: "vote_button", locals: { proposal: proposal, from_proposals_list: true } %>
32
- </div>
27
+ <%= render partial: "votes_count", locals: { proposal: proposal, from_proposals_list: true } %>
28
+ <%= render partial: "vote_button", locals: { proposal: proposal, from_proposals_list: true } %>
33
29
  <% elsif !current_settings.votes_enabled? || current_settings.votes_enabled? && current_settings.votes_blocked? %>
34
30
  <div class="card__support__data"></div>
35
31
  <%= link_to t(".view_proposal"), proposal, class: "card__button button small secondary" %>
@@ -1 +1,3 @@
1
- <%= remaining_votes_count_for(current_user) %>
1
+ <span id="remaining-votes-count" class="extra__suport-number">
2
+ <%= remaining_votes_count_for(current_user) %>
3
+ </span>
@@ -3,7 +3,7 @@
3
3
  <% if proposal.category.present? %>
4
4
  <li><%= link_to translated_attribute(proposal.category.name), decidim_proposals.proposals_path(filter: { category_id: proposal.category.id }) %></li>
5
5
  <% end %>
6
- <% if proposal.scope.present? %>
6
+ <% if proposal.scope.present? && feature_settings.scoped_proposals_enabled %>
7
7
  <li><%= link_to proposal.scope.name, decidim_proposals.proposals_path(filter: { scope_id: [proposal.scope.id] }) %></li>
8
8
  <% end %>
9
9
  </ul>
@@ -1,25 +1,27 @@
1
- <% if !current_user %>
2
- <button class="card__button button <%= vote_button_classes(from_proposals_list) %>" data-toggle="loginModal">
3
- <%= t('.vote') %>
4
- </button>
5
- <% else %>
6
- <% if @voted_proposals ? @voted_proposals.include?(proposal.id) : proposal.voted_by?(current_user) %>
7
- <% if vote_limit_enabled? %>
8
- <%= action_authorized_button_to :vote, t('.already_voted'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), method: :delete, remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)} success" %>
9
- <% else %>
10
- <button class="card__button button <%= vote_button_classes(from_proposals_list) %> success">
11
- <%= t('.already_voted') %>
12
- </button>
13
- <% end %>
1
+ <div id="proposal-<%= proposal.id %>-vote-button">
2
+ <% if !current_user %>
3
+ <button class="card__button button <%= vote_button_classes(from_proposals_list) %>" data-toggle="loginModal">
4
+ <%= t('.vote') %>
5
+ </button>
14
6
  <% else %>
15
- <% if vote_limit_enabled? && remaining_votes_count_for(current_user) == 0 %>
16
- <%= action_authorized_button_to :vote, t('.no_votes_remaining'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)}", disabled: true %>
17
- <% elsif current_settings.votes_blocked? %>
18
- <button class="card__button button <%= vote_button_classes(from_proposals_list) %> disabled">
19
- <%= t('.votes_blocked') %>
20
- </button>
7
+ <% if @voted_proposals ? @voted_proposals.include?(proposal.id) : proposal.voted_by?(current_user) %>
8
+ <% if vote_limit_enabled? %>
9
+ <%= action_authorized_button_to :vote, t('.already_voted'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), method: :delete, remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)} success" %>
10
+ <% else %>
11
+ <button class="card__button button <%= vote_button_classes(from_proposals_list) %> success">
12
+ <%= t('.already_voted') %>
13
+ </button>
14
+ <% end %>
21
15
  <% else %>
22
- <%= action_authorized_button_to "vote", t('.vote'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)}" %>
16
+ <% if vote_limit_enabled? && remaining_votes_count_for(current_user) == 0 %>
17
+ <%= action_authorized_button_to :vote, t('.no_votes_remaining'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)}", disabled: true %>
18
+ <% elsif current_settings.votes_blocked? %>
19
+ <button class="card__button button <%= vote_button_classes(from_proposals_list) %> disabled">
20
+ <%= t('.votes_blocked') %>
21
+ </button>
22
+ <% else %>
23
+ <%= action_authorized_button_to "vote", t('.vote'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)}" %>
24
+ <% end %>
23
25
  <% end %>
24
26
  <% end %>
25
- <% end %>
27
+ </div>
@@ -1,6 +1,9 @@
1
- <span class="<%= votes_count_classes(from_proposals_list)[:number] %>">
2
- <%= proposal.proposal_votes_count %>
3
- </span>
4
- <span class="<%= votes_count_classes(from_proposals_list)[:label] %>">
5
- <%= t('.count', count: proposal.proposal_votes_count) %>
6
- </span>
1
+ <div id="proposal-<%= proposal.id %>-votes-count" class="card__support__data">
2
+ <span class="<%= votes_count_classes(from_proposals_list)[:number] %>">
3
+ <%= proposal.proposal_votes_count %>
4
+ </span>
5
+ <span class="<%= votes_count_classes(from_proposals_list)[:label] %>">
6
+ <%= t('.count', count: proposal.proposal_votes_count) %>
7
+ </span>
8
+
9
+ </div>