decidim-admin 0.31.3 → 0.32.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -12
  3. data/app/cells/decidim/admin/attachments_privacy_warning/show.erb +1 -1
  4. data/app/cells/decidim/admin/attachments_privacy_warning_cell.rb +2 -6
  5. data/app/commands/decidim/admin/content_blocks/reorder_content_blocks.rb +1 -1
  6. data/app/commands/decidim/admin/create_attachment.rb +1 -0
  7. data/app/commands/decidim/admin/participatory_space/create_member.rb +99 -0
  8. data/app/commands/decidim/admin/participatory_space/destroy_member.rb +30 -0
  9. data/app/commands/decidim/admin/participatory_space/import_member_csv.rb +46 -0
  10. data/app/commands/decidim/admin/participatory_space/publish_all_members.rb +52 -0
  11. data/app/commands/decidim/admin/participatory_space/unpublish_all_members.rb +52 -0
  12. data/app/commands/decidim/admin/participatory_space/update_member.rb +13 -0
  13. data/app/commands/decidim/admin/reorder_components.rb +1 -1
  14. data/app/commands/decidim/admin/reorder_taxonomies.rb +1 -1
  15. data/app/commands/decidim/admin/update_organization.rb +1 -1
  16. data/app/controllers/concerns/decidim/admin/content_blocks/landing_page.rb +1 -0
  17. data/app/controllers/concerns/decidim/admin/content_blocks/landing_page_content_blocks.rb +3 -2
  18. data/app/controllers/concerns/decidim/admin/filterable.rb +4 -4
  19. data/app/controllers/concerns/decidim/admin/participatory_space_admin_context.rb +1 -0
  20. data/app/controllers/concerns/decidim/admin/participatory_space_export.rb +1 -1
  21. data/app/controllers/decidim/admin/area_types_controller.rb +2 -2
  22. data/app/controllers/decidim/admin/areas_controller.rb +3 -2
  23. data/app/controllers/decidim/admin/block_user_controller.rb +2 -2
  24. data/app/controllers/decidim/admin/component_permissions_controller.rb +1 -1
  25. data/app/controllers/decidim/admin/components/base_controller.rb +13 -9
  26. data/app/controllers/decidim/admin/components_controller.rb +3 -2
  27. data/app/controllers/decidim/admin/concerns/has_attachment_collections.rb +2 -2
  28. data/app/controllers/decidim/admin/concerns/has_attachments.rb +2 -2
  29. data/app/controllers/decidim/admin/conflicts_controller.rb +1 -1
  30. data/app/controllers/decidim/admin/exports_controller.rb +1 -1
  31. data/app/controllers/decidim/admin/impersonations_controller.rb +1 -1
  32. data/app/controllers/decidim/admin/imports_controller.rb +2 -1
  33. data/app/controllers/decidim/admin/managed_users/promotions_controller.rb +1 -1
  34. data/app/controllers/decidim/admin/newsletters_controller.rb +9 -8
  35. data/app/controllers/decidim/admin/organization_appearance_controller.rb +1 -1
  36. data/app/controllers/decidim/admin/organization_controller.rb +1 -1
  37. data/app/controllers/decidim/admin/organization_external_domain_allowlist_controller.rb +1 -1
  38. data/app/controllers/decidim/admin/participatory_space/concerns/has_members.rb +166 -0
  39. data/app/controllers/decidim/admin/participatory_space/concerns/has_members_csv_import.rb +67 -0
  40. data/app/controllers/decidim/admin/participatory_space/concerns/members_filterable.rb +36 -0
  41. data/app/controllers/decidim/admin/participatory_space/user_role_controller.rb +2 -2
  42. data/app/controllers/decidim/admin/reminders_controller.rb +1 -1
  43. data/app/controllers/decidim/admin/resource_permissions_controller.rb +1 -1
  44. data/app/controllers/decidim/admin/scope_types_controller.rb +2 -2
  45. data/app/controllers/decidim/admin/scopes_controller.rb +3 -2
  46. data/app/controllers/decidim/admin/share_tokens_controller.rb +2 -2
  47. data/app/controllers/decidim/admin/space_publications_controller.rb +2 -2
  48. data/app/controllers/decidim/admin/static_page_topics_controller.rb +2 -2
  49. data/app/controllers/decidim/admin/static_pages_controller.rb +2 -2
  50. data/app/controllers/decidim/admin/taxonomies_controller.rb +3 -3
  51. data/app/controllers/decidim/admin/taxonomy_filters_controller.rb +3 -3
  52. data/app/controllers/decidim/admin/taxonomy_items_controller.rb +3 -3
  53. data/app/controllers/decidim/admin/users_controller.rb +1 -1
  54. data/app/forms/decidim/admin/content_block_form.rb +28 -1
  55. data/app/forms/decidim/admin/organization_form.rb +0 -1
  56. data/app/forms/decidim/admin/participatory_space/member_csv_import_form.rb +33 -0
  57. data/app/forms/decidim/admin/participatory_space/member_form.rb +26 -0
  58. data/app/forms/decidim/admin/participatory_space_admin_user_form.rb +1 -1
  59. data/app/forms/decidim/admin/selective_newsletter_form.rb +7 -7
  60. data/app/forms/decidim/admin/taxonomy_filter_form.rb +1 -0
  61. data/app/helpers/decidim/admin/newsletters_helper.rb +8 -5
  62. data/app/helpers/decidim/admin/search_form_helper.rb +17 -0
  63. data/app/helpers/decidim/admin/settings_helper.rb +2 -0
  64. data/app/jobs/decidim/admin/newsletter_job.rb +2 -2
  65. data/app/jobs/decidim/admin/participatory_space/destroy_members_follows_job.rb +36 -0
  66. data/app/jobs/decidim/admin/participatory_space/import_member_csv_job.rb +29 -0
  67. data/app/packs/src/decidim/admin/controllers/access_mode/access_mode.test.js +68 -0
  68. data/app/packs/src/decidim/admin/controllers/access_mode/controller.js +52 -0
  69. data/app/packs/src/decidim/admin/newsletters.js +2 -2
  70. data/app/packs/stylesheets/decidim/admin/_datepicker.scss +0 -4
  71. data/app/queries/decidim/admin/newsletter_recipients.rb +8 -8
  72. data/app/views/decidim/admin/admin_terms/show.html.erb +3 -1
  73. data/app/views/decidim/admin/area_types/index.html.erb +3 -2
  74. data/app/views/decidim/admin/areas/index.html.erb +3 -2
  75. data/app/views/decidim/admin/attachment_collections/edit.html.erb +2 -2
  76. data/app/views/decidim/admin/attachment_collections/index.html.erb +2 -2
  77. data/app/views/decidim/admin/attachment_collections/new.html.erb +2 -2
  78. data/app/views/decidim/admin/attachments/index.html.erb +3 -2
  79. data/app/views/decidim/admin/authorization_workflows/index.html.erb +2 -2
  80. data/app/views/decidim/admin/block_user/new.html.erb +1 -0
  81. data/app/views/decidim/admin/components/index.html.erb +2 -2
  82. data/app/views/decidim/admin/components/manage_trash.html.erb +2 -2
  83. data/app/views/decidim/admin/conflicts/edit.html.erb +3 -1
  84. data/app/views/decidim/admin/conflicts/index.html.erb +3 -2
  85. data/app/views/decidim/admin/dashboard/show.html.erb +4 -4
  86. data/app/views/decidim/admin/help_sections/update.html.erb +2 -0
  87. data/app/views/decidim/admin/impersonatable_users/index.html.erb +3 -2
  88. data/app/views/decidim/admin/impersonations/_form.html.erb +2 -2
  89. data/app/views/decidim/admin/impersonations/new.html.erb +3 -2
  90. data/app/views/decidim/admin/imports/new.html.erb +1 -0
  91. data/app/views/decidim/admin/logs/_logs_list.html.erb +1 -1
  92. data/app/views/decidim/admin/logs/index.html.erb +1 -1
  93. data/app/views/decidim/admin/managed_users/impersonation_logs/index.html.erb +6 -5
  94. data/app/views/decidim/admin/managed_users/promotions/new.html.erb +3 -2
  95. data/app/views/decidim/admin/{participatory_space_private_users → members}/edit.html.erb +2 -2
  96. data/app/views/decidim/admin/{participatory_space_private_users → members}/index.html.erb +25 -25
  97. data/app/views/decidim/admin/{participatory_space_private_users → members}/new.html.erb +2 -2
  98. data/app/views/decidim/admin/{participatory_space_private_users_csv_imports → members_csv_imports}/new.html.erb +2 -2
  99. data/app/views/decidim/admin/moderations/_moderation-tr.html.erb +2 -6
  100. data/app/views/decidim/admin/moderations/_moderations-thead.html.erb +0 -1
  101. data/app/views/decidim/admin/moderations/reports/index.html.erb +1 -1
  102. data/app/views/decidim/admin/newsletter_templates/show.html.erb +3 -2
  103. data/app/views/decidim/admin/newsletters/confirm_recipients.html.erb +4 -6
  104. data/app/views/decidim/admin/newsletters/index.html.erb +2 -2
  105. data/app/views/decidim/admin/newsletters/select_recipients_to_deliver.html.erb +2 -2
  106. data/app/views/decidim/admin/newsletters/show.html.erb +3 -2
  107. data/app/views/decidim/admin/officializations/index.html.erb +6 -4
  108. data/app/views/decidim/admin/officializations/show_email.html.erb +2 -0
  109. data/app/views/decidim/admin/organization/form/_extra_features.html.erb +0 -4
  110. data/app/views/decidim/admin/organization_external_domain_allowlist/_form.html.erb +2 -2
  111. data/app/views/decidim/admin/organization_external_domain_allowlist/edit.html.erb +2 -2
  112. data/app/views/decidim/admin/reminders/new.html.erb +8 -1
  113. data/app/views/decidim/admin/resource_permissions/edit.html.erb +2 -2
  114. data/app/views/decidim/admin/scope_types/index.html.erb +3 -2
  115. data/app/views/decidim/admin/scopes/index.html.erb +2 -2
  116. data/app/views/decidim/admin/share_tokens/index.html.erb +2 -0
  117. data/app/views/decidim/admin/shared/landing_page/_content_blocks.html.erb +0 -2
  118. data/app/views/decidim/admin/shared/landing_page/edit.html.erb +2 -0
  119. data/app/views/decidim/admin/shared/landing_page_content_blocks/edit.html.erb +1 -0
  120. data/app/views/decidim/admin/static_page_topics/index.html.erb +2 -2
  121. data/app/views/decidim/admin/static_pages/edit.html.erb +2 -1
  122. data/app/views/decidim/admin/static_pages/index.html.erb +2 -2
  123. data/app/views/decidim/admin/statistics/_statistics.html.erb +1 -1
  124. data/app/views/decidim/admin/statistics/index.html.erb +2 -0
  125. data/app/views/decidim/admin/taxonomies/_row.html.erb +1 -1
  126. data/app/views/decidim/admin/taxonomies/_row_children.html.erb +1 -1
  127. data/app/views/decidim/admin/taxonomies/_table.html.erb +1 -1
  128. data/app/views/decidim/admin/taxonomies/edit.html.erb +2 -2
  129. data/app/views/decidim/admin/taxonomies/index.html.erb +4 -4
  130. data/app/views/decidim/admin/taxonomy_filters/index.html.erb +2 -2
  131. data/app/views/decidim/admin/taxonomy_filters_selector/index.html.erb +2 -0
  132. data/app/views/decidim/admin/taxonomy_filters_selector/new.html.erb +2 -0
  133. data/app/views/decidim/admin/taxonomy_filters_selector/show.html.erb +2 -0
  134. data/app/views/decidim/admin/taxonomy_items/edit.html.erb +2 -0
  135. data/app/views/decidim/admin/taxonomy_items/new.html.erb +2 -0
  136. data/app/views/decidim/admin/users/index.html.erb +3 -2
  137. data/config/locales/ar.yml +4 -49
  138. data/config/locales/bg.yml +4 -55
  139. data/config/locales/bs-BA.yml +0 -24
  140. data/config/locales/ca-IT.yml +127 -100
  141. data/config/locales/ca.yml +127 -100
  142. data/config/locales/cs.yml +122 -94
  143. data/config/locales/de.yml +109 -87
  144. data/config/locales/el.yml +11 -45
  145. data/config/locales/en.yml +126 -98
  146. data/config/locales/eo.yml +0 -7
  147. data/config/locales/es-MX.yml +126 -99
  148. data/config/locales/es-PY.yml +126 -99
  149. data/config/locales/es.yml +126 -99
  150. data/config/locales/eu.yml +126 -99
  151. data/config/locales/fi-plain.yml +132 -87
  152. data/config/locales/fi.yml +132 -87
  153. data/config/locales/fr-CA.yml +87 -91
  154. data/config/locales/fr.yml +87 -91
  155. data/config/locales/ga-IE.yml +0 -13
  156. data/config/locales/gl.yml +4 -41
  157. data/config/locales/he-IL.yml +0 -5
  158. data/config/locales/hu.yml +4 -52
  159. data/config/locales/id-ID.yml +4 -34
  160. data/config/locales/is-IS.yml +1 -16
  161. data/config/locales/it.yml +4 -68
  162. data/config/locales/ja.yml +124 -99
  163. data/config/locales/kaa.yml +0 -16
  164. data/config/locales/ko.yml +0 -40
  165. data/config/locales/lb.yml +4 -41
  166. data/config/locales/lt.yml +4 -52
  167. data/config/locales/lv.yml +4 -38
  168. data/config/locales/nl.yml +4 -46
  169. data/config/locales/no.yml +4 -46
  170. data/config/locales/pl.yml +4 -54
  171. data/config/locales/pt-BR.yml +109 -97
  172. data/config/locales/pt.yml +4 -42
  173. data/config/locales/ro-RO.yml +9 -51
  174. data/config/locales/ru.yml +4 -35
  175. data/config/locales/sk.yml +4 -38
  176. data/config/locales/sl.yml +0 -7
  177. data/config/locales/sq-AL.yml +0 -21
  178. data/config/locales/sr-CS.yml +0 -24
  179. data/config/locales/sv.yml +74 -87
  180. data/config/locales/th-TH.yml +0 -8
  181. data/config/locales/tr-TR.yml +21 -58
  182. data/config/locales/uk.yml +0 -26
  183. data/config/locales/val-ES.yml +0 -1
  184. data/config/locales/zh-CN.yml +4 -38
  185. data/config/locales/zh-TW.yml +4 -52
  186. data/decidim-admin.gemspec +7 -10
  187. data/lib/decidim/admin/engine.rb +5 -2
  188. data/lib/decidim/admin/menu.rb +1 -1
  189. data/lib/decidim/admin/test/admin_members_shared_examples.rb +119 -0
  190. data/lib/decidim/admin/test/admin_participatory_space_access_examples.rb +3 -3
  191. data/lib/decidim/admin/test/filterable_examples.rb +20 -11
  192. data/lib/decidim/admin/test/invite_participatory_space_admins_shared_examples.rb +17 -17
  193. data/lib/decidim/admin/test/invite_participatory_space_collaborators_shared_examples.rb +1 -1
  194. data/lib/decidim/admin/test/invite_participatory_space_moderators_shared_examples.rb +1 -1
  195. data/lib/decidim/admin/test/invite_participatory_space_users_shared_context.rb +1 -1
  196. data/lib/decidim/admin/test/manage_attachment_collections_examples.rb +3 -3
  197. data/lib/decidim/admin/test/manage_attachments_examples.rb +6 -6
  198. data/lib/decidim/admin/test/manage_component_permissions_examples.rb +5 -5
  199. data/lib/decidim/admin/test/manage_moderations_examples.rb +6 -6
  200. data/lib/decidim/admin/test/manage_participatory_space_publications_examples.rb +2 -2
  201. data/lib/decidim/admin/test/manage_resource_soft_deletion_examples.rb +3 -3
  202. data/lib/decidim/admin/version.rb +1 -1
  203. data/lib/decidim/admin.rb +0 -2
  204. metadata +39 -35
  205. data/app/commands/decidim/admin/create_participatory_space_private_user.rb +0 -98
  206. data/app/commands/decidim/admin/destroy_participatory_space_private_user.rb +0 -28
  207. data/app/commands/decidim/admin/process_participatory_space_private_user_import_csv.rb +0 -44
  208. data/app/commands/decidim/admin/publish_all_participatory_space_private_users.rb +0 -50
  209. data/app/commands/decidim/admin/unpublish_all_participatory_space_private_users.rb +0 -50
  210. data/app/commands/decidim/admin/update_participatory_space_private_user.rb +0 -11
  211. data/app/controllers/concerns/decidim/participatory_space_private_users/admin/filterable.rb +0 -34
  212. data/app/controllers/decidim/admin/concerns/has_private_users.rb +0 -169
  213. data/app/controllers/decidim/admin/concerns/has_private_users_csv_import.rb +0 -65
  214. data/app/forms/decidim/admin/participatory_space_private_user_csv_import_form.rb +0 -31
  215. data/app/forms/decidim/admin/participatory_space_private_user_form.rb +0 -24
  216. data/app/jobs/decidim/admin/destroy_private_users_follows_job.rb +0 -37
  217. data/app/jobs/decidim/admin/import_participatory_space_private_user_csv_job.rb +0 -27
  218. data/app/views/decidim/admin/devise/mailers/password_change.html.erb +0 -3
  219. data/app/views/decidim/admin/devise/mailers/reset_password_instructions.html.erb +0 -8
  220. /data/app/views/decidim/admin/{participatory_space_private_users → members}/_form.html.erb +0 -0
@@ -47,7 +47,7 @@ module Decidim
47
47
 
48
48
  on(:invalid) do
49
49
  flash.now[:alert] = I18n.t("error", scope: "decidim.admin.conflicts.transfer")
50
- render action: "edit", status: :unprocessable_entity
50
+ render action: "edit", status: :unprocessable_content
51
51
  end
52
52
  end
53
53
  end
@@ -15,7 +15,7 @@ module Decidim
15
15
 
16
16
  flash[:notice] = t("decidim.admin.exports.notice")
17
17
 
18
- redirect_back(fallback_location: manage_component_path(component))
18
+ redirect_back_or_to(manage_component_path(component))
19
19
  end
20
20
 
21
21
  private
@@ -46,7 +46,7 @@ module Decidim
46
46
 
47
47
  on(:invalid) do
48
48
  flash.now[:alert] = I18n.t("impersonations.create.error", scope: "decidim.admin")
49
- render :new, status: :unprocessable_entity
49
+ render :new, status: :unprocessable_content
50
50
  end
51
51
  end
52
52
  end
@@ -5,6 +5,7 @@ module Decidim
5
5
  # This controller allows admins to import resources from a file.
6
6
  class ImportsController < Decidim::Admin::ApplicationController
7
7
  include Decidim::ComponentPathHelper
8
+
8
9
  before_action :set_import_breadcrumb_item
9
10
 
10
11
  helper_method :import_manifest
@@ -39,7 +40,7 @@ module Decidim
39
40
 
40
41
  on(:invalid) do
41
42
  flash.now[:alert] = t("decidim.admin.imports.error")
42
- render :new, status: :unprocessable_entity
43
+ render :new, status: :unprocessable_content
43
44
  end
44
45
  end
45
46
  end
@@ -25,7 +25,7 @@ module Decidim
25
25
 
26
26
  on(:invalid) do
27
27
  flash.now[:alert] = I18n.t("managed_users.promotion.error", scope: "decidim.admin")
28
- render :new, status: :unprocessable_entity
28
+ render :new, status: :unprocessable_content
29
29
  end
30
30
  end
31
31
  end
@@ -7,6 +7,7 @@ module Decidim
7
7
  include Decidim::NewslettersHelper
8
8
  include Decidim::Admin::NewslettersHelper
9
9
  include Paginable
10
+
10
11
  helper_method :newsletter, :recipients_count_query, :content_block, :selected_options, :newsletter_params
11
12
 
12
13
  def index
@@ -31,7 +32,7 @@ module Decidim
31
32
  NewsletterMailer.newsletter(current_user, newsletter).deliver_later
32
33
  flash[:notice] = I18n.t("newsletters.send_to_user.sent_successfully", scope: "decidim.admin", email: current_user.email)
33
34
 
34
- redirect_back fallback_location: newsletters_path
35
+ redirect_back_or_to(newsletters_path)
35
36
  end
36
37
 
37
38
  def preview
@@ -44,7 +45,7 @@ module Decidim
44
45
 
45
46
  def create
46
47
  enforce_permission_to :create, :newsletter
47
- @form = form(NewsletterForm).from_params(params)
48
+ @form = form(NewsletterForm).from_params(params, content_block:)
48
49
  @form.images = images_block_context unless has_images_block_context?
49
50
 
50
51
  CreateNewsletter.call(@form, content_block) do
@@ -56,7 +57,7 @@ module Decidim
56
57
  on(:invalid) do |newsletter|
57
58
  @newsletter = newsletter
58
59
  flash.now[:error] = I18n.t("newsletters.create.error", scope: "decidim.admin")
59
- render action: :new, status: :unprocessable_entity
60
+ render action: :new, status: :unprocessable_content
60
61
  end
61
62
  end
62
63
  end
@@ -68,7 +69,7 @@ module Decidim
68
69
 
69
70
  def update
70
71
  enforce_permission_to(:update, :newsletter, newsletter:)
71
- @form = form(NewsletterForm).from_params(params)
72
+ @form = form(NewsletterForm).from_params(params, content_block:)
72
73
  @form.images = images_block_context unless has_images_block_context?
73
74
 
74
75
  UpdateNewsletter.call(newsletter, @form) do
@@ -80,7 +81,7 @@ module Decidim
80
81
  on(:invalid) do |newsletter|
81
82
  @newsletter = newsletter
82
83
  flash.now[:error] = I18n.t("newsletters.update.error", scope: "decidim.admin")
83
- render action: :edit, status: :unprocessable_entity
84
+ render action: :edit, status: :unprocessable_content
84
85
  end
85
86
  end
86
87
  end
@@ -128,12 +129,12 @@ module Decidim
128
129
 
129
130
  on(:invalid) do
130
131
  flash.now[:error] = I18n.t("newsletters.deliver.error", scope: "decidim.admin")
131
- render action: :select_recipients_to_deliver, status: :unprocessable_entity
132
+ render action: :select_recipients_to_deliver, status: :unprocessable_content
132
133
  end
133
134
 
134
135
  on(:no_recipients) do
135
136
  flash.now[:error] = I18n.t("newsletters.send.no_recipients", scope: "decidim.admin")
136
- render action: :select_recipients_to_deliver, status: :unprocessable_entity
137
+ render action: :select_recipients_to_deliver, status: :unprocessable_content
137
138
  end
138
139
  end
139
140
  end
@@ -155,7 +156,7 @@ module Decidim
155
156
  :send_to_verified_users,
156
157
  :send_to_followers,
157
158
  :send_to_participants,
158
- :send_to_private_members,
159
+ :send_to_members,
159
160
  verification_types: [],
160
161
  participatory_space_types: {
161
162
  assemblies: [:manifest_name, { ids: [] }],
@@ -25,7 +25,7 @@ module Decidim
25
25
 
26
26
  on(:invalid) do
27
27
  flash.now[:alert] = I18n.t("organization.update.error", scope: "decidim.admin")
28
- render :edit, status: :unprocessable_entity
28
+ render :edit, status: :unprocessable_content
29
29
  end
30
30
  end
31
31
  end
@@ -29,7 +29,7 @@ module Decidim
29
29
 
30
30
  on(:invalid) do
31
31
  flash.now[:alert] = I18n.t("organization.update.error", scope: "decidim.admin")
32
- render :edit, status: :unprocessable_entity
32
+ render :edit, status: :unprocessable_content
33
33
  end
34
34
  end
35
35
  end
@@ -25,7 +25,7 @@ module Decidim
25
25
  end
26
26
  on(:invalid) do
27
27
  flash[:notice] = t("domain_allowlist.update.error", scope: "decidim.admin")
28
- render action: "edit", status: :unprocessable_entity
28
+ render action: "edit", status: :unprocessable_content
29
29
  end
30
30
  end
31
31
  end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ module ParticipatorySpace
6
+ module Concerns
7
+ # Members can be related to any ParticipatorySpace, in order to
8
+ # manage the members for a given type, you should create a new
9
+ # controller and include this concern.
10
+ #
11
+ # It takes the current_participatory_space that is defined
12
+ # in the controller, so there is no need to define any method
13
+ module HasMembers
14
+ extend ActiveSupport::Concern
15
+
16
+ included do
17
+ include Decidim::Admin::ParticipatorySpace::Concerns::MembersFilterable
18
+
19
+ helper PaginateHelper
20
+ helper_method :members
21
+
22
+ # rubocop:disable Rails/LexicallyScopedActionFilter
23
+ before_action :set_member, only: [:edit, :update, :destroy, :resend_invitation]
24
+ # rubocop:enable Rails/LexicallyScopedActionFilter
25
+
26
+ def index
27
+ enforce_permission_to :read, :space_member
28
+
29
+ render template: "decidim/admin/members/index"
30
+ end
31
+
32
+ def new
33
+ enforce_permission_to :create, :space_member
34
+ @form = form(MemberForm).from_params({})
35
+ render template: "decidim/admin/members/new"
36
+ end
37
+
38
+ def edit
39
+ enforce_permission_to :update, :space_member, member: @member
40
+ @form = form(MemberForm).from_model(@member)
41
+ render template: "decidim/admin/members/edit"
42
+ end
43
+
44
+ def update
45
+ enforce_permission_to :update, :space_member, member: @member
46
+ @form = form(MemberForm).from_params(params)
47
+
48
+ UpdateMember.call(@form, @member) do
49
+ on(:ok) do
50
+ flash[:notice] = I18n.t("members.update.success", scope: "decidim.admin")
51
+ redirect_to action: :index
52
+ end
53
+
54
+ on(:invalid) do
55
+ flash.now[:alert] = I18n.t("members.update.error", scope: "decidim.admin")
56
+ render template: "decidim/admin/members/edit", status: :unprocessable_content
57
+ end
58
+ end
59
+ end
60
+
61
+ def create
62
+ enforce_permission_to :create, :space_member
63
+ @form = form(MemberForm).from_params(params)
64
+
65
+ CreateMember.call(@form, current_participatory_space) do
66
+ on(:ok) do
67
+ flash[:notice] = I18n.t("members.create.success", scope: "decidim.admin")
68
+ redirect_to action: :index
69
+ end
70
+
71
+ on(:invalid) do
72
+ flash.now[:alert] = I18n.t("members.create.error", scope: "decidim.admin")
73
+ render template: "decidim/admin/members/new", status: :unprocessable_content
74
+ end
75
+ end
76
+ end
77
+
78
+ def destroy
79
+ enforce_permission_to :destroy, :space_member, member: @member
80
+
81
+ DestroyMember.call(@member, current_user) do
82
+ on(:ok) do
83
+ flash[:notice] = I18n.t("members.destroy.success", scope: "decidim.admin")
84
+ redirect_to after_destroy_path
85
+ end
86
+
87
+ on(:invalid) do
88
+ flash.now[:alert] = I18n.t("members.destroy.error", scope: "decidim.admin")
89
+ render template: "decidim/admin/members/index", status: :unprocessable_content
90
+ end
91
+ end
92
+ end
93
+
94
+ def resend_invitation
95
+ enforce_permission_to :invite, :space_member, member: @member
96
+ InviteUserAgain.call(@member.user, "invite_member") do
97
+ on(:ok) do
98
+ flash[:notice] = I18n.t("users.resend_invitation.success", scope: "decidim.admin")
99
+ end
100
+
101
+ on(:invalid) do
102
+ flash[:alert] = I18n.t("users.resend_invitation.error", scope: "decidim.admin")
103
+ end
104
+ end
105
+
106
+ redirect_to after_destroy_path
107
+ end
108
+
109
+ def publish_all
110
+ PublishAllMembers.call(current_participatory_space, current_user) do
111
+ on(:ok) do
112
+ flash[:notice] = I18n.t("members.publish_all.success", scope: "decidim.admin")
113
+ redirect_to action: :index
114
+ end
115
+
116
+ on(:invalid) do
117
+ flash[:alert] = I18n.t("members.publish_all.error", scope: "decidim.admin")
118
+ redirect_to action: :index
119
+ end
120
+ end
121
+ end
122
+
123
+ def unpublish_all
124
+ UnpublishAllMembers.call(current_participatory_space, current_user) do
125
+ on(:ok) do
126
+ flash[:notice] = I18n.t("members.unpublish_all.success", scope: "decidim.admin")
127
+ redirect_to action: :index
128
+ end
129
+
130
+ on(:invalid) do
131
+ flash[:alert] = I18n.t("members.unpublish_all.error", scope: "decidim.admin")
132
+ redirect_to action: :index
133
+ end
134
+ end
135
+ end
136
+
137
+ # Public: Returns a String or Object that will be passed to `redirect_to` after
138
+ # destroying a member. By default it redirects to the participatory_space.
139
+ #
140
+ # It can be redefined at controller level if you need to redirect elsewhere.
141
+ def after_destroy_path
142
+ members_path(current_participatory_space)
143
+ end
144
+
145
+ def collection
146
+ # there is an unidentified corner case where Decidim::User
147
+ # may have been destroyed, but the related Member
148
+ # remains in the database. That is why filtering by not null users
149
+ @collection ||= current_participatory_space
150
+ .members
151
+ .includes(:user).where.not("decidim_users.id" => nil)
152
+ end
153
+
154
+ def members
155
+ filtered_collection
156
+ end
157
+
158
+ def set_member
159
+ @member = collection.find(params[:id])
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ module ParticipatorySpace
6
+ module Concerns
7
+ # Members can be related to any ParticipatorySpace, in order to
8
+ # import members from csv for a given type, you should create a new
9
+ # controller and include this concern.
10
+ #
11
+ # The only requirement is to define a `participatory_space` method that
12
+ # returns an instance of the model to relate the member to.
13
+ module HasMembersCsvImport
14
+ extend ActiveSupport::Concern
15
+
16
+ included do
17
+ helper_method :participatory_space
18
+
19
+ def new
20
+ enforce_permission_to :csv_import, :space_member
21
+ @form = form(MemberCsvImportForm).from_params({}, participatory_space:)
22
+ @count = Decidim::ParticipatorySpace::Member.by_participatory_space(participatory_space).count
23
+ render template: "decidim/admin/members_csv_imports/new"
24
+ end
25
+
26
+ def create
27
+ enforce_permission_to :csv_import, :space_member
28
+ @form = form(MemberCsvImportForm).from_params(params, participatory_space:)
29
+
30
+ ImportMemberCsv.call(@form, current_participatory_space) do
31
+ on(:ok) do
32
+ flash[:notice] = I18n.t("members_csv_imports.create.success", scope: "decidim.admin")
33
+ redirect_to after_import_path
34
+ end
35
+
36
+ on(:invalid) do
37
+ flash[:alert] = I18n.t("members_csv_imports.create.invalid", scope: "decidim.admin")
38
+ render template: "decidim/admin/members_csv_imports/new", status: :unprocessable_content
39
+ end
40
+ end
41
+ end
42
+
43
+ def destroy_all
44
+ enforce_permission_to :csv_import, :space_member
45
+ Decidim::ParticipatorySpace::Member.by_participatory_space(participatory_space).delete_all
46
+ redirect_to new_members_csv_imports_path
47
+ end
48
+
49
+ # Public: Returns a String or Object that will be passed to `redirect_to` after
50
+ # importing members. By default it redirects to the participatory_space.
51
+ #
52
+ # It can be redefined at controller level if you need to redirect elsewhere.
53
+ def after_import_path
54
+ participatory_space
55
+ end
56
+
57
+ # Public: The only method to be implemented at the controller. You need to
58
+ # return the object where the attachment will be attached to.
59
+ def participatory_space
60
+ raise NotImplementedError
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Admin
7
+ module ParticipatorySpace
8
+ module Concerns
9
+ module MembersFilterable
10
+ extend ActiveSupport::Concern
11
+
12
+ included do
13
+ include Decidim::Admin::Filterable
14
+
15
+ private
16
+
17
+ def base_query
18
+ collection
19
+ end
20
+
21
+ def filters
22
+ [
23
+ :user_invitation_sent_at_not_null,
24
+ :user_invitation_accepted_at_not_null
25
+ ]
26
+ end
27
+
28
+ def search_field_predicate
29
+ :user_name_or_user_email_cont
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -38,7 +38,7 @@ module Decidim
38
38
 
39
39
  on(:invalid) do
40
40
  flash[:alert] = I18n.t("create.error", scope: i18n_scope)
41
- render :new, status: :unprocessable_entity
41
+ render :new, status: :unprocessable_content
42
42
  end
43
43
  end
44
44
  end
@@ -56,7 +56,7 @@ module Decidim
56
56
 
57
57
  on(:invalid) do
58
58
  flash.now[:alert] = I18n.t("update.error", scope: i18n_scope)
59
- render :edit, status: :unprocessable_entity
59
+ render :edit, status: :unprocessable_content
60
60
  end
61
61
  end
62
62
  end
@@ -27,7 +27,7 @@ module Decidim
27
27
 
28
28
  on(:invalid) do
29
29
  flash.now[:alert] = t("decidim.admin.reminders.create.error")
30
- render :new, status: :unprocessable_entity
30
+ render :new, status: :unprocessable_content
31
31
  end
32
32
  end
33
33
  end
@@ -25,7 +25,7 @@ module Decidim
25
25
  end
26
26
 
27
27
  on(:invalid) do
28
- render action: :edit, status: :unprocessable_entity
28
+ render action: :edit, status: :unprocessable_content
29
29
  end
30
30
  end
31
31
  end
@@ -34,7 +34,7 @@ module Decidim
34
34
 
35
35
  on(:invalid) do
36
36
  flash.now[:alert] = I18n.t("scope_types.create.error", scope: "decidim.admin")
37
- render :new, status: :unprocessable_entity
37
+ render :new, status: :unprocessable_content
38
38
  end
39
39
  end
40
40
  end
@@ -56,7 +56,7 @@ module Decidim
56
56
 
57
57
  on(:invalid) do
58
58
  flash.now[:alert] = I18n.t("scope_types.update.error", scope: "decidim.admin")
59
- render :edit, status: :unprocessable_entity
59
+ render :edit, status: :unprocessable_content
60
60
  end
61
61
  end
62
62
  end
@@ -6,6 +6,7 @@ module Decidim
6
6
  #
7
7
  class ScopesController < Decidim::Admin::ApplicationController
8
8
  include Decidim::Admin::Concerns::HasTabbedMenu
9
+
9
10
  helper Decidim::Admin::ScopesHelper
10
11
 
11
12
  layout "decidim/admin/settings"
@@ -36,7 +37,7 @@ module Decidim
36
37
 
37
38
  on(:invalid) do
38
39
  flash.now[:alert] = I18n.t("scopes.create.error", scope: "decidim.admin")
39
- render :new, status: :unprocessable_entity
40
+ render :new, status: :unprocessable_content
40
41
  end
41
42
  end
42
43
  end
@@ -58,7 +59,7 @@ module Decidim
58
59
 
59
60
  on(:invalid) do
60
61
  flash.now[:alert] = I18n.t("scopes.update.error", scope: "decidim.admin")
61
- render :edit, status: :unprocessable_entity
62
+ render :edit, status: :unprocessable_content
62
63
  end
63
64
  end
64
65
  end
@@ -31,7 +31,7 @@ module Decidim
31
31
 
32
32
  on(:invalid) do
33
33
  flash.now[:alert] = I18n.t("share_tokens.create.invalid", scope: "decidim.admin")
34
- render action: "new", status: :unprocessable_entity
34
+ render action: "new", status: :unprocessable_content
35
35
  end
36
36
  end
37
37
  end
@@ -53,7 +53,7 @@ module Decidim
53
53
 
54
54
  on(:invalid) do
55
55
  flash.now[:alert] = I18n.t("share_tokens.update.error", scope: "decidim.admin")
56
- render :edit, status: :unprocessable_entity
56
+ render :edit, status: :unprocessable_content
57
57
  end
58
58
  end
59
59
  end
@@ -17,7 +17,7 @@ module Decidim
17
17
  flash.now[:alert] = I18n.t("create.error", scope: i18n_scope)
18
18
  end
19
19
 
20
- redirect_back(fallback_location:)
20
+ redirect_back_or_to(fallback_location)
21
21
  end
22
22
  end
23
23
 
@@ -33,7 +33,7 @@ module Decidim
33
33
  flash.now[:alert] = I18n.t("destroy.error", scope: i18n_scope)
34
34
  end
35
35
 
36
- redirect_back(fallback_location:)
36
+ redirect_back_or_to(fallback_location)
37
37
  end
38
38
  end
39
39
 
@@ -30,7 +30,7 @@ module Decidim
30
30
 
31
31
  on(:invalid) do
32
32
  flash.now[:alert] = I18n.t("static_page_topics.create.error", scope: "decidim.admin")
33
- render :new, status: :unprocessable_entity
33
+ render :new, status: :unprocessable_content
34
34
  end
35
35
  end
36
36
  end
@@ -52,7 +52,7 @@ module Decidim
52
52
 
53
53
  on(:invalid) do
54
54
  flash.now[:alert] = I18n.t("static_page_topics.update.error", scope: "decidim.admin")
55
- render :edit, status: :unprocessable_entity
55
+ render :edit, status: :unprocessable_content
56
56
  end
57
57
  end
58
58
  end
@@ -62,7 +62,7 @@ module Decidim
62
62
 
63
63
  on(:invalid) do
64
64
  flash.now[:alert] = I18n.t("static_pages.create.error", scope: "decidim.admin")
65
- render :new, status: :unprocessable_entity
65
+ render :new, status: :unprocessable_content
66
66
  end
67
67
  end
68
68
  end
@@ -85,7 +85,7 @@ module Decidim
85
85
 
86
86
  on(:invalid) do
87
87
  flash.now[:alert] = I18n.t("static_pages.update.error", scope: "decidim.admin")
88
- render :edit, status: :unprocessable_entity
88
+ render :edit, status: :unprocessable_content
89
89
  end
90
90
  end
91
91
  end
@@ -39,7 +39,7 @@ module Decidim
39
39
 
40
40
  on(:invalid) do
41
41
  flash.now[:alert] = I18n.t("create.invalid", scope: "decidim.admin.taxonomies")
42
- render action: "new", status: :unprocessable_entity
42
+ render action: "new", status: :unprocessable_content
43
43
  end
44
44
  end
45
45
  end
@@ -66,7 +66,7 @@ module Decidim
66
66
 
67
67
  on(:invalid) do
68
68
  flash.now[:alert] = I18n.t("update.invalid", scope: "decidim.admin.taxonomies")
69
- render action: "edit", status: :unprocessable_entity
69
+ render action: "edit", status: :unprocessable_content
70
70
  end
71
71
  end
72
72
  end
@@ -83,7 +83,7 @@ module Decidim
83
83
  flash.now[:alert] = I18n.t("destroy.invalid", scope: "decidim.admin.taxonomies")
84
84
  end
85
85
  end
86
- redirect_back(fallback_location: taxonomies_path)
86
+ redirect_back_or_to(taxonomies_path)
87
87
  end
88
88
 
89
89
  def reorder
@@ -41,7 +41,7 @@ module Decidim
41
41
 
42
42
  on(:invalid) do
43
43
  flash.now[:alert] = I18n.t("create.error", scope: "decidim.admin.taxonomy_filters")
44
- render :new, status: :unprocessable_entity
44
+ render :new, status: :unprocessable_content
45
45
  end
46
46
  end
47
47
  end
@@ -63,7 +63,7 @@ module Decidim
63
63
  end
64
64
  on(:invalid) do
65
65
  flash.now[:alert] = I18n.t("update.error", scope: "decidim.admin.taxonomy_filters")
66
- render :edit, status: :unprocessable_entity
66
+ render :edit, status: :unprocessable_content
67
67
  end
68
68
  end
69
69
  end
@@ -78,7 +78,7 @@ module Decidim
78
78
  flash[:alert] = I18n.t("destroy.error", scope: "decidim.admin.taxonomy_filters")
79
79
  end
80
80
  end
81
- redirect_back(fallback_location: decidim_admin.taxonomy_filters_path(root_taxonomy))
81
+ redirect_back_or_to(decidim_admin.taxonomy_filters_path(root_taxonomy))
82
82
  end
83
83
 
84
84
  private