decidim-admin 0.26.5 → 0.27.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/app/cells/decidim/admin/attachments_privacy_warning/show.erb +3 -0
  3. data/app/cells/decidim/admin/attachments_privacy_warning_cell.rb +19 -0
  4. data/app/commands/decidim/admin/block_user.rb +1 -1
  5. data/app/commands/decidim/admin/close_session_managed_user.rb +1 -1
  6. data/app/commands/decidim/admin/create_area.rb +1 -1
  7. data/app/commands/decidim/admin/create_area_type.rb +6 -3
  8. data/app/commands/decidim/admin/create_attachment.rb +14 -6
  9. data/app/commands/decidim/admin/create_attachment_collection.rb +13 -4
  10. data/app/commands/decidim/admin/create_category.rb +6 -4
  11. data/app/commands/decidim/admin/create_component.rb +1 -1
  12. data/app/commands/decidim/admin/create_import.rb +4 -5
  13. data/app/commands/decidim/admin/create_import_example.rb +1 -1
  14. data/app/commands/decidim/admin/create_newsletter.rb +1 -1
  15. data/app/commands/decidim/admin/create_participatory_space_private_user.rb +1 -1
  16. data/app/commands/decidim/admin/create_scope.rb +1 -1
  17. data/app/commands/decidim/admin/create_scope_type.rb +6 -3
  18. data/app/commands/decidim/admin/create_static_page.rb +1 -1
  19. data/app/commands/decidim/admin/create_static_page_topic.rb +1 -1
  20. data/app/commands/decidim/admin/deliver_newsletter.rb +6 -6
  21. data/app/commands/decidim/admin/destroy_area.rb +1 -1
  22. data/app/commands/decidim/admin/destroy_category.rb +6 -3
  23. data/app/commands/decidim/admin/destroy_component.rb +1 -1
  24. data/app/commands/decidim/admin/destroy_newsletter.rb +1 -1
  25. data/app/commands/decidim/admin/destroy_participatory_space_private_user.rb +1 -1
  26. data/app/commands/decidim/admin/destroy_scope.rb +1 -1
  27. data/app/commands/decidim/admin/destroy_share_token.rb +1 -1
  28. data/app/commands/decidim/admin/destroy_static_page.rb +1 -1
  29. data/app/commands/decidim/admin/destroy_static_page_topic.rb +1 -1
  30. data/app/commands/decidim/admin/hide_resource.rb +2 -2
  31. data/app/commands/decidim/admin/impersonate_user.rb +1 -1
  32. data/app/commands/decidim/admin/invite_admin.rb +1 -1
  33. data/app/commands/decidim/admin/officialize_user.rb +1 -1
  34. data/app/commands/decidim/admin/process_participatory_space_private_user_import_csv.rb +7 -3
  35. data/app/commands/decidim/admin/process_user_group_verification_csv.rb +8 -4
  36. data/app/commands/decidim/admin/promote_managed_user.rb +1 -1
  37. data/app/commands/decidim/admin/publish_component.rb +1 -1
  38. data/app/commands/decidim/admin/reject_user_group.rb +1 -1
  39. data/app/commands/decidim/admin/remove_admin.rb +1 -1
  40. data/app/commands/decidim/admin/reorder_content_blocks.rb +1 -1
  41. data/app/commands/decidim/admin/transfer_user.rb +1 -1
  42. data/app/commands/decidim/admin/unblock_user.rb +2 -2
  43. data/app/commands/decidim/admin/unhide_resource.rb +1 -1
  44. data/app/commands/decidim/admin/unofficialize_user.rb +1 -1
  45. data/app/commands/decidim/admin/unpublish_component.rb +1 -1
  46. data/app/commands/decidim/admin/unreport_resource.rb +1 -1
  47. data/app/commands/decidim/admin/unreport_user.rb +1 -1
  48. data/app/commands/decidim/admin/update_area.rb +1 -1
  49. data/app/commands/decidim/admin/update_area_type.rb +8 -3
  50. data/app/commands/decidim/admin/update_attachment.rb +4 -3
  51. data/app/commands/decidim/admin/update_attachment_collection.rb +8 -3
  52. data/app/commands/decidim/admin/update_category.rb +9 -5
  53. data/app/commands/decidim/admin/update_component.rb +8 -5
  54. data/app/commands/decidim/admin/update_component_permissions.rb +9 -6
  55. data/app/commands/decidim/admin/update_content_block.rb +1 -1
  56. data/app/commands/decidim/admin/update_external_domain_whitelist.rb +6 -3
  57. data/app/commands/decidim/admin/update_help_sections.rb +17 -3
  58. data/app/commands/decidim/admin/update_newsletter.rb +1 -1
  59. data/app/commands/decidim/admin/update_organization.rb +1 -1
  60. data/app/commands/decidim/admin/update_organization_appearance.rb +1 -1
  61. data/app/commands/decidim/admin/update_organization_tos_version.rb +1 -1
  62. data/app/commands/decidim/admin/update_resource_permissions.rb +2 -2
  63. data/app/commands/decidim/admin/update_scope.rb +1 -1
  64. data/app/commands/decidim/admin/update_scope_type.rb +8 -3
  65. data/app/commands/decidim/admin/update_static_page.rb +1 -1
  66. data/app/commands/decidim/admin/update_static_page_topic.rb +1 -1
  67. data/app/commands/decidim/admin/update_user_groups.rb +1 -1
  68. data/app/commands/decidim/admin/verify_user_group.rb +1 -1
  69. data/app/controllers/concerns/decidim/admin/filterable.rb +1 -1
  70. data/app/controllers/concerns/decidim/admin/participatory_space_export.rb +3 -1
  71. data/app/controllers/decidim/admin/application_controller.rb +1 -0
  72. data/app/controllers/decidim/admin/area_types_controller.rb +6 -3
  73. data/app/controllers/decidim/admin/block_user_controller.rb +3 -3
  74. data/app/controllers/decidim/admin/categories_controller.rb +3 -3
  75. data/app/controllers/decidim/admin/component_permissions_controller.rb +1 -1
  76. data/app/controllers/decidim/admin/components/base_controller.rb +1 -0
  77. data/app/controllers/decidim/admin/components_controller.rb +1 -1
  78. data/app/controllers/decidim/admin/concerns/has_attachment_collections.rb +6 -3
  79. data/app/controllers/decidim/admin/concerns/has_attachments.rb +6 -3
  80. data/app/controllers/decidim/admin/concerns/has_private_users_csv_import.rb +7 -0
  81. data/app/controllers/decidim/admin/dashboard_controller.rb +4 -3
  82. data/app/controllers/decidim/admin/exports_controller.rb +4 -1
  83. data/app/controllers/decidim/admin/help_sections_controller.rb +1 -1
  84. data/app/controllers/decidim/admin/metrics_controller.rb +2 -1
  85. data/app/controllers/decidim/admin/moderations_controller.rb +9 -7
  86. data/app/controllers/decidim/admin/newsletter_templates_controller.rb +1 -1
  87. data/app/controllers/decidim/admin/newsletters_controller.rb +1 -1
  88. data/app/controllers/decidim/admin/organization_controller.rb +3 -4
  89. data/app/controllers/decidim/admin/organization_external_domain_whitelist_controller.rb +1 -1
  90. data/app/controllers/decidim/admin/reminders_controller.rb +61 -0
  91. data/app/controllers/decidim/admin/resource_permissions_controller.rb +3 -3
  92. data/app/controllers/decidim/admin/scope_types_controller.rb +6 -3
  93. data/app/controllers/decidim/admin/static_pages_controller.rb +1 -7
  94. data/app/forms/decidim/admin/block_user_form.rb +2 -2
  95. data/app/forms/decidim/admin/category_form.rb +1 -2
  96. data/app/forms/decidim/admin/component_form.rb +16 -7
  97. data/app/forms/decidim/admin/import_example_form.rb +1 -5
  98. data/app/forms/decidim/admin/import_form.rb +7 -10
  99. data/app/forms/decidim/admin/managed_user_promotion_form.rb +1 -1
  100. data/app/forms/decidim/admin/participatory_space_private_user_csv_import_form.rb +7 -4
  101. data/app/forms/decidim/admin/permission_form.rb +9 -8
  102. data/app/forms/decidim/admin/permissions_form.rb +1 -10
  103. data/app/forms/decidim/admin/user_group_csv_verification_form.rb +2 -2
  104. data/app/helpers/decidim/admin/bulk_actions_helper.rb +6 -5
  105. data/app/helpers/decidim/admin/moderations/reports_helper.rb +11 -2
  106. data/app/helpers/decidim/admin/reminders_helper.rb +12 -0
  107. data/app/helpers/decidim/admin/settings_helper.rb +11 -57
  108. data/app/models/decidim/admin/fake_newsletter.rb +0 -20
  109. data/app/packs/entrypoints/decidim_admin.js +3 -6
  110. data/app/packs/src/decidim/admin/admin_autocomplete.js +82 -0
  111. data/app/packs/src/decidim/admin/application.js +0 -16
  112. data/app/packs/src/decidim/admin/choose_language.js +9 -11
  113. data/app/packs/src/decidim/admin/dynamic_fields.component.js +0 -1
  114. data/app/packs/stylesheets/decidim/admin/_decidim.scss +0 -1
  115. data/app/packs/stylesheets/decidim/admin/modules/_autocomplete.scss +5 -0
  116. data/app/packs/stylesheets/decidim/admin/modules/_forms.scss +0 -6
  117. data/app/packs/stylesheets/decidim/admin/modules/_import_result.scss +10 -0
  118. data/app/packs/stylesheets/decidim/admin/modules/_modules.scss +3 -0
  119. data/app/packs/stylesheets/decidim/admin/modules/_upload_modal.scss +42 -0
  120. data/app/permissions/decidim/admin/permissions.rb +3 -32
  121. data/app/presenters/decidim/admin/dashboard_metric_charts_presenter.rb +3 -1
  122. data/app/queries/decidim/admin/active_users_counter.rb +1 -1
  123. data/app/queries/decidim/admin/newsletter_recipients.rb +2 -2
  124. data/app/queries/decidim/admin/user_filter.rb +1 -1
  125. data/app/queries/decidim/admin/user_groups_evaluation.rb +1 -1
  126. data/app/views/decidim/admin/attachments/index.html.erb +1 -0
  127. data/app/views/decidim/admin/categories/_form.html.erb +0 -4
  128. data/app/views/decidim/admin/categories/show.html.erb +1 -2
  129. data/app/views/decidim/admin/dashboard/show.html.erb +1 -1
  130. data/app/views/decidim/admin/imports/new.html.erb +1 -1
  131. data/app/views/decidim/admin/moderated_users/index.html.erb +1 -1
  132. data/app/views/decidim/admin/moderations/index.html.erb +4 -8
  133. data/app/views/decidim/admin/moderations/reports/index.html.erb +1 -5
  134. data/app/views/decidim/admin/organization_appearance/form/_images.html.erb +5 -4
  135. data/app/views/decidim/admin/participatory_space_private_users/index.html.erb +1 -1
  136. data/app/views/decidim/admin/participatory_space_private_users_csv_imports/new.html.erb +20 -1
  137. data/app/views/decidim/admin/reminders/new.html.erb +21 -0
  138. data/app/views/decidim/admin/resource_permissions/edit.html.erb +1 -1
  139. data/app/views/decidim/admin/shared/_gallery.html.erb +6 -1
  140. data/app/views/decidim/admin/shared/_js-callout.html.erb +6 -0
  141. data/app/views/decidim/admin/users_statistics/_users_count.html.erb +2 -2
  142. data/app/views/layouts/decidim/admin/_application.html.erb +2 -0
  143. data/config/locales/am-ET.yml +1 -0
  144. data/config/locales/ar.yml +28 -21
  145. data/config/locales/bg.yml +1 -0
  146. data/config/locales/ca.yml +27 -21
  147. data/config/locales/cs.yml +41 -33
  148. data/config/locales/da.yml +1 -0
  149. data/config/locales/de.yml +23 -18
  150. data/config/locales/el.yml +2 -5
  151. data/config/locales/en.yml +22 -17
  152. data/config/locales/eo.yml +1 -0
  153. data/config/locales/es-MX.yml +25 -19
  154. data/config/locales/es-PY.yml +25 -19
  155. data/config/locales/es.yml +27 -21
  156. data/config/locales/et.yml +1 -0
  157. data/config/locales/eu.yml +12 -35
  158. data/config/locales/fi-plain.yml +26 -20
  159. data/config/locales/fi.yml +28 -22
  160. data/config/locales/fr-CA.yml +25 -19
  161. data/config/locales/fr.yml +39 -33
  162. data/config/locales/ga-IE.yml +1 -0
  163. data/config/locales/gl.yml +17 -4
  164. data/config/locales/hr.yml +1 -0
  165. data/config/locales/hu.yml +16 -188
  166. data/config/locales/id-ID.yml +2 -7
  167. data/config/locales/is-IS.yml +3 -8
  168. data/config/locales/it.yml +8 -6
  169. data/config/locales/ja.yml +23 -18
  170. data/config/locales/ko.yml +1 -0
  171. data/config/locales/lb.yml +2 -5
  172. data/config/locales/lt.yml +13 -141
  173. data/config/locales/lv.yml +2 -4
  174. data/config/locales/mt.yml +1 -0
  175. data/config/locales/nl.yml +4 -67
  176. data/config/locales/no.yml +13 -10
  177. data/config/locales/om-ET.yml +1 -0
  178. data/config/locales/pl.yml +21 -6
  179. data/config/locales/pt-BR.yml +4 -7
  180. data/config/locales/pt.yml +2 -5
  181. data/config/locales/ro-RO.yml +12 -27
  182. data/config/locales/ru.yml +2 -7
  183. data/config/locales/si-LK.yml +1 -0
  184. data/config/locales/sk.yml +2 -4
  185. data/config/locales/sl.yml +1 -0
  186. data/config/locales/so-SO.yml +1 -0
  187. data/config/locales/sr-CS.yml +1 -10
  188. data/config/locales/sv.yml +24 -18
  189. data/config/locales/sw-KE.yml +1 -0
  190. data/config/locales/ti-ER.yml +1 -0
  191. data/config/locales/tr-TR.yml +2 -5
  192. data/config/locales/uk.yml +2 -6
  193. data/config/locales/val-ES.yml +1 -0
  194. data/config/locales/vi.yml +1 -0
  195. data/config/locales/zh-CN.yml +2 -4
  196. data/config/locales/zh-TW.yml +1 -0
  197. data/lib/decidim/admin/engine.rb +1 -12
  198. data/lib/decidim/admin/import/importer.rb +9 -7
  199. data/lib/decidim/admin/import/readers/json.rb +1 -1
  200. data/lib/decidim/admin/test/commands/create_attachment_collection_examples.rb +15 -2
  201. data/lib/decidim/admin/test/commands/create_category_examples.rb +16 -6
  202. data/lib/decidim/admin/test/commands/destroy_category_examples.rb +29 -1
  203. data/lib/decidim/admin/test/commands/update_attachment_collection_examples.rb +15 -2
  204. data/lib/decidim/admin/test/commands/update_category_examples.rb +16 -6
  205. data/lib/decidim/admin/test/filters_participatory_space_user_roles_examples.rb +4 -4
  206. data/lib/decidim/admin/test/filters_participatory_space_users_examples.rb +4 -4
  207. data/lib/decidim/admin/test/forms/category_form_examples.rb +1 -21
  208. data/lib/decidim/admin/test/manage_attachments_examples.rb +9 -2
  209. data/lib/decidim/admin/test/manage_categories_examples.rb +0 -10
  210. data/lib/decidim/admin/test/manage_component_permissions_examples.rb +0 -2
  211. data/lib/decidim/admin/test/manage_moderations_examples.rb +27 -79
  212. data/lib/decidim/admin/version.rb +1 -1
  213. metadata +22 -19
  214. data/app/packs/src/decidim/admin/autocomplete.component.js +0 -146
  215. data/app/packs/src/decidim/admin/autocomplete.component.test.js +0 -19
  216. data/app/packs/stylesheets/decidim/admin/components/_autocomplete_select.component.scss +0 -19
  217. data/config/locales/gn-PY.yml +0 -1
  218. data/config/locales/ka-GE.yml +0 -1
  219. data/config/locales/lo-LA.yml +0 -1
  220. data/config/locales/oc-FR.yml +0 -1
@@ -31,7 +31,7 @@ module Decidim
31
31
  enforce_permission_to :create, :attachment_collection
32
32
  @form = form(AttachmentCollectionForm).from_params(params, collection_for: collection_for)
33
33
 
34
- CreateAttachmentCollection.call(@form, collection_for) do
34
+ CreateAttachmentCollection.call(@form, collection_for, current_user) do
35
35
  on(:ok) do
36
36
  flash[:notice] = I18n.t("attachment_collections.create.success", scope: "decidim.admin")
37
37
  redirect_to action: :index
@@ -56,7 +56,7 @@ module Decidim
56
56
  enforce_permission_to :update, :attachment_collection, attachment_collection: @attachment_collection
57
57
  @form = form(AttachmentCollectionForm).from_params(params, collection_for: collection_for)
58
58
 
59
- UpdateAttachmentCollection.call(@attachment_collection, @form) do
59
+ UpdateAttachmentCollection.call(@attachment_collection, @form, current_user) do
60
60
  on(:ok) do
61
61
  flash[:notice] = I18n.t("attachment_collections.update.success", scope: "decidim.admin")
62
62
  redirect_to action: :index
@@ -78,7 +78,10 @@ module Decidim
78
78
  def destroy
79
79
  @attachment_collection = collection.find(params[:id])
80
80
  enforce_permission_to :destroy, :attachment_collection, attachment_collection: @attachment_collection
81
- @attachment_collection.destroy!
81
+
82
+ Decidim.traceability.perform_action!("delete", @attachment_collection, current_user) do
83
+ @attachment_collection.destroy!
84
+ end
82
85
 
83
86
  flash[:notice] = I18n.t("attachment_collections.destroy.success", scope: "decidim.admin")
84
87
 
@@ -31,7 +31,7 @@ module Decidim
31
31
  enforce_permission_to :create, :attachment, attached_to: attached_to
32
32
  @form = form(::Decidim::Admin::AttachmentForm).from_params(params, attached_to: attached_to)
33
33
 
34
- CreateAttachment.call(@form, attached_to) do
34
+ CreateAttachment.call(@form, attached_to, current_user) do
35
35
  on(:ok) do
36
36
  flash[:notice] = I18n.t("attachments.create.success", scope: "decidim.admin")
37
37
  redirect_to action: :index
@@ -56,7 +56,7 @@ module Decidim
56
56
  enforce_permission_to :update, :attachment, attachment: attachment
57
57
  @form = form(::Decidim::Admin::AttachmentForm).from_params(attachment_params, attached_to: attached_to)
58
58
 
59
- UpdateAttachment.call(@attachment, @form) do
59
+ UpdateAttachment.call(@attachment, @form, current_user) do
60
60
  on(:ok) do
61
61
  flash[:notice] = I18n.t("attachments.update.success", scope: "decidim.admin")
62
62
  redirect_to action: :index
@@ -78,7 +78,10 @@ module Decidim
78
78
  def destroy
79
79
  @attachment = collection.find(params[:id])
80
80
  enforce_permission_to :destroy, :attachment, attachment: attachment
81
- @attachment.destroy!
81
+
82
+ Decidim.traceability.perform_action!("delete", @attachment, current_user) do
83
+ @attachment.destroy!
84
+ end
82
85
 
83
86
  flash[:notice] = I18n.t("attachments.destroy.success", scope: "decidim.admin")
84
87
 
@@ -18,6 +18,7 @@ module Decidim
18
18
  def new
19
19
  enforce_permission_to :csv_import, :space_private_user
20
20
  @form = form(ParticipatorySpacePrivateUserCsvImportForm).from_params({}, privatable_to: privatable_to)
21
+ @count = Decidim::ParticipatorySpacePrivateUser.by_participatory_space(privatable_to).count
21
22
  render template: "decidim/admin/participatory_space_private_users_csv_imports/new"
22
23
  end
23
24
 
@@ -38,6 +39,12 @@ module Decidim
38
39
  end
39
40
  end
40
41
 
42
+ def destroy_all
43
+ enforce_permission_to :csv_import, :space_private_user
44
+ Decidim::ParticipatorySpacePrivateUser.by_participatory_space(privatable_to).delete_all
45
+ redirect_to new_participatory_space_private_users_csv_imports_path
46
+ end
47
+
41
48
  # Public: Returns a String or Object that will be passed to `redirect_to` after
42
49
  # importing private users. By default it redirects to the privatable_to.
43
50
  #
@@ -27,7 +27,8 @@ module Decidim
27
27
  def metrics_presenter
28
28
  @metrics_presenter ||= Decidim::Admin::DashboardMetricChartsPresenter.new(
29
29
  summary: true,
30
- organization: current_organization
30
+ organization: current_organization,
31
+ view_context: view_context
31
32
  )
32
33
  end
33
34
 
@@ -37,10 +38,10 @@ module Decidim
37
38
  last_month = Time.zone.today.prev_month
38
39
 
39
40
  {
40
- total_admins_last_24: users_count(last_day, true),
41
+ total_admins_last_day: users_count(last_day, true),
41
42
  total_admins_last_week: users_count(last_week, true),
42
43
  total_admins_last_month: users_count(last_month, true),
43
- total_participants_last_24: users_count(last_day, false),
44
+ total_participants_last_day: users_count(last_day, false),
44
45
  total_participants_last_week: users_count(last_week, false),
45
46
  total_participants_last_month: users_count(last_month, false)
46
47
  }
@@ -9,7 +9,10 @@ module Decidim
9
9
  def create
10
10
  enforce_permission_to :export, :component_data, component: component
11
11
  name = params[:id]
12
- ExportJob.perform_later(current_user, component, name, params[:format] || default_format, params[:resource_id].presence)
12
+
13
+ Decidim.traceability.perform_action!("export_component", component, current_user, { name: name, format: params[:format] || default_format }) do
14
+ ExportJob.perform_later(current_user, component, name, params[:format] || default_format, params[:resource_id].presence)
15
+ end
13
16
 
14
17
  flash[:notice] = t("decidim.admin.exports.notice")
15
18
 
@@ -25,7 +25,7 @@ module Decidim
25
25
  params[:help_sections]
26
26
  )
27
27
 
28
- UpdateHelpSections.call(@form, current_organization) do
28
+ UpdateHelpSections.call(@form, current_organization, current_user) do
29
29
  on(:ok) do
30
30
  flash[:notice] = t("help_sections.success", scope: "decidim.admin")
31
31
  redirect_to action: :show
@@ -14,7 +14,8 @@ module Decidim
14
14
  def metrics_presenter
15
15
  @metrics_presenter ||= Decidim::Admin::DashboardMetricChartsPresenter.new(
16
16
  summary: false,
17
- organization: current_organization
17
+ organization: current_organization,
18
+ view_context: view_context
18
19
  )
19
20
  end
20
21
  end
@@ -67,16 +67,18 @@ module Decidim
67
67
 
68
68
  private
69
69
 
70
+ def ransack_params
71
+ query_params[:q] || { s: "created_at desc" }
72
+ end
73
+
70
74
  # Private: This method is used by the `Filterable` concern as the base query
71
75
  # without applying filtering and/or sorting options.
72
76
  def collection
73
- @collection ||= begin
74
- if params[:hidden]
75
- participatory_space_moderations.hidden
76
- else
77
- participatory_space_moderations.not_hidden
78
- end
79
- end
77
+ @collection ||= if params[:hidden]
78
+ participatory_space_moderations.hidden
79
+ else
80
+ participatory_space_moderations.not_hidden
81
+ end
80
82
  end
81
83
 
82
84
  # Private: Returns a collection of `Moderation` filtered and/or sorted by
@@ -15,7 +15,7 @@ module Decidim
15
15
  def show; end
16
16
 
17
17
  def preview
18
- email = NewsletterMailer.newsletter(current_user, fake_newsletter, preview: true)
18
+ email = NewsletterMailer.newsletter(current_user, fake_newsletter)
19
19
  Premailer::Rails::Hook.perform(email)
20
20
  render html: email.html_part.body.decoded.html_safe
21
21
  end
@@ -28,7 +28,7 @@ module Decidim
28
28
  def preview
29
29
  enforce_permission_to :read, :newsletter, newsletter: newsletter
30
30
 
31
- email = NewsletterMailer.newsletter(current_user, newsletter, preview: true)
31
+ email = NewsletterMailer.newsletter(current_user, newsletter)
32
32
  Premailer::Rails::Hook.perform(email)
33
33
  render html: email.html_part.body.decoded.html_safe
34
34
  end
@@ -15,7 +15,6 @@ module Decidim
15
15
  def update
16
16
  enforce_permission_to :update, :organization, organization: current_organization
17
17
  @form = form(OrganizationForm).from_params(params)
18
- @form.id = current_organization.id
19
18
 
20
19
  UpdateOrganization.call(current_organization, @form) do
21
20
  on(:ok) do
@@ -31,11 +30,11 @@ module Decidim
31
30
  end
32
31
 
33
32
  def users
34
- search(current_organization.users.available)
33
+ search(current_organization.users)
35
34
  end
36
35
 
37
36
  def user_entities
38
- search(current_organization.user_entities.available)
37
+ search(current_organization.user_entities)
39
38
  end
40
39
 
41
40
  private
@@ -52,7 +51,7 @@ module Decidim
52
51
  query.where("email ILIKE ?", "%#{term}%")
53
52
  )
54
53
  end
55
- render json: query.all.collect { |u| { value: u.id, label: "#{u.name} (@#{u.nickname})" } }
54
+ render json: query.all.collect { |u| { value: u.id, label: "#{u.name} (@#{u.nickname}) #{u.email}" } }
56
55
  else
57
56
  render json: []
58
57
  end
@@ -16,7 +16,7 @@ module Decidim
16
16
  enforce_permission_to :update, :organization, organization: current_organization
17
17
  @form = form(OrganizationExternalDomainWhitelistForm).from_params(params)
18
18
 
19
- UpdateExternalDomainWhitelist.call(@form, current_organization) do
19
+ UpdateExternalDomainWhitelist.call(@form, current_organization, current_user) do
20
20
  on(:ok) do
21
21
  flash[:notice] = t("domain_whitelist.update.success", scope: "decidim.admin")
22
22
  redirect_to edit_organization_external_domain_whitelist_path
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ class RemindersController < Admin::ApplicationController
6
+ include Decidim::ComponentPathHelper
7
+
8
+ helper_method :reminder_manifest
9
+
10
+ def new
11
+ enforce_permission_to :create, :reminder
12
+
13
+ @form = reminder_form_from_params(name: reminder_manifest.name)
14
+ render :new
15
+ end
16
+
17
+ def create
18
+ enforce_permission_to :create, :reminder
19
+
20
+ @form = reminder_form_from_params(params)
21
+
22
+ command_class.call(@form) do
23
+ on(:ok) do |reminders_queued|
24
+ flash[:notice] = t("decidim.admin.reminders.create.success", count: reminders_queued)
25
+ redirect_to manage_component_path(current_component)
26
+ end
27
+
28
+ on(:invalid) do
29
+ flash.now[:alert] = t("decidim.admin.reminders.create.error")
30
+ render :new
31
+ end
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def reminder_form_from_params(params)
38
+ form(reminder_manifest.form_class).from_params(
39
+ params,
40
+ current_component: current_component
41
+ )
42
+ end
43
+
44
+ def reminder_manifest
45
+ @reminder_manifest ||= Decidim.reminders_registry.for(reminder_name)
46
+ end
47
+
48
+ def reminder_name
49
+ params[:name]
50
+ end
51
+
52
+ def command_class
53
+ reminder_manifest.command_class
54
+ end
55
+
56
+ def current_component
57
+ @current_component ||= current_participatory_space.components.find(params[:component_id])
58
+ end
59
+ end
60
+ end
61
+ end
@@ -47,8 +47,8 @@ module Decidim
47
47
  def permission_forms
48
48
  actions.inject({}) do |result, action|
49
49
  form = PermissionForm.new(
50
- authorization_handlers: authorizations_for(action),
51
- authorizations_handlers_options: options_for(action)
50
+ authorization_handlers: authorizations_for(action).keys,
51
+ authorization_handlers_options: options_for(action)
52
52
  )
53
53
 
54
54
  result.update(action => form)
@@ -83,7 +83,7 @@ module Decidim
83
83
  end
84
84
 
85
85
  def manifest_name
86
- @manifest_name ||= resource.resource_manifest.name
86
+ @manifest_name ||= resource.manifest.name
87
87
  end
88
88
 
89
89
  def permissions
@@ -21,7 +21,7 @@ module Decidim
21
21
  enforce_permission_to :create, :scope_type
22
22
  @form = form(ScopeTypeForm).from_params(params)
23
23
 
24
- CreateScopeType.call(@form) do
24
+ CreateScopeType.call(@form, current_user) do
25
25
  on(:ok) do
26
26
  flash[:notice] = I18n.t("scope_types.create.success", scope: "decidim.admin")
27
27
  redirect_to scope_types_path
@@ -43,7 +43,7 @@ module Decidim
43
43
  enforce_permission_to :update, :scope_type, scope_type: scope_type
44
44
  @form = form(ScopeTypeForm).from_params(params)
45
45
 
46
- UpdateScopeType.call(scope_type, @form) do
46
+ UpdateScopeType.call(scope_type, @form, current_user) do
47
47
  on(:ok) do
48
48
  flash[:notice] = I18n.t("scope_types.update.success", scope: "decidim.admin")
49
49
  redirect_to scope_types_path
@@ -58,7 +58,10 @@ module Decidim
58
58
 
59
59
  def destroy
60
60
  enforce_permission_to :destroy, :scope_type, scope_type: scope_type
61
- scope_type.destroy!
61
+
62
+ Decidim.traceability.perform_action!("delete", scope_type, current_user) do
63
+ scope_type.destroy!
64
+ end
62
65
 
63
66
  flash[:notice] = I18n.t("scope_types.destroy.success", scope: "decidim.admin")
64
67
 
@@ -82,13 +82,7 @@ module Decidim
82
82
  form_params = params.to_unsafe_hash
83
83
  form_params["static_page"] ||= {}
84
84
  form_params["static_page"]["organization"] = current_organization
85
- form_params["static_page"]["allow_public_access"] ||= begin
86
- if page
87
- page.allow_public_access
88
- else
89
- false
90
- end
91
- end
85
+ form_params["static_page"]["allow_public_access"] ||= page ? page.allow_public_access : false
92
86
 
93
87
  return form_params unless page
94
88
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  module Admin
5
- # A form object used to block users or user groups on the admin dashboard.
5
+ # A form object used to officialize users from the admin dashboard.
6
6
  class BlockUserForm < Form
7
7
  attribute :user_id, Integer
8
8
  attribute :justification, String
@@ -15,7 +15,7 @@ module Decidim
15
15
  end
16
16
 
17
17
  def user
18
- @user ||= Decidim::UserBaseEntity.find_by(
18
+ @user ||= Decidim::User.find_by(
19
19
  id: user_id,
20
20
  organization: current_organization
21
21
  )
@@ -9,12 +9,11 @@ module Decidim
9
9
 
10
10
  translatable_attribute :name, String
11
11
  attribute :weight, Integer, default: 0
12
- translatable_attribute :description, String
13
12
  attribute :parent_id, Integer
14
13
 
15
14
  mimic :category
16
15
 
17
- validates :name, :description, translatable_presence: true
16
+ validates :name, translatable_presence: true
18
17
  validates :parent_id, inclusion: { in: :parent_categories_ids }, allow_blank: true
19
18
 
20
19
  delegate :current_participatory_space, to: :context, prefix: false
@@ -21,10 +21,12 @@ module Decidim
21
21
 
22
22
  attribute :settings, Object
23
23
  attribute :default_step_settings, Object
24
- attribute :step_settings, Hash[String => Object]
24
+ attribute(:step_settings, { String => Object })
25
25
 
26
26
  attribute :share_tokens, Array[ShareToken]
27
27
 
28
+ validate :validate_settings, :validate_step_settings
29
+
28
30
  def settings?
29
31
  settings.manifest.attributes.any?
30
32
  end
@@ -39,13 +41,20 @@ module Decidim
39
41
 
40
42
  private
41
43
 
42
- # Overwrites Rectify::Form#form_attributes_valid? to validate nested `step_settings` attributes.
43
- def form_attributes_valid?
44
- return false unless errors.empty? && settings_errors_empty? # Preserves errors from custom validation methods
44
+ def validate_settings
45
+ return unless errors.empty? && settings_errors_empty? # Preserves errors from custom validation methods
46
+
47
+ attributes.each do |key, value|
48
+ next unless value.respond_to?(:valid?)
49
+
50
+ errors.add(key, :invalid) unless value.valid?
51
+ end
52
+ end
53
+
54
+ def validate_step_settings
55
+ return unless step_settings.respond_to?(:attributes)
45
56
 
46
- attributes_that_respond_to(:valid?).concat(
47
- step_settings.each_value.select { |attribute| attribute.respond_to?(:valid?) }
48
- ).all?(&:valid?)
57
+ errors.add(:step_settings, :invalid) unless step_settings.attributes.values.all? { |v| !v.respond_to?(:valid?) || v.valid? }
49
58
  end
50
59
 
51
60
  def settings_errors_empty?
@@ -35,11 +35,7 @@ module Decidim
35
35
  end
36
36
 
37
37
  def reader
38
- @reader ||= begin
39
- return unless reader_klass
40
-
41
- reader_klass.new("/dev/null")
42
- end
38
+ @reader ||= reader_klass ? reader_klass.new("/dev/null") : nil
43
39
  end
44
40
 
45
41
  def reader_klass
@@ -5,9 +5,10 @@ module Decidim
5
5
  class ImportForm < Form
6
6
  ACCEPTED_MIME_TYPES = Decidim::Admin::Import::Readers::ACCEPTED_MIME_TYPES
7
7
  include Decidim::HasUploadValidations
8
+ include Decidim::ProcessesFileLocally
8
9
 
9
10
  attribute :name, String
10
- attribute :file
11
+ attribute :file, Decidim::Attributes::Blob
11
12
 
12
13
  validates :file, presence: true
13
14
  validates :name, presence: true
@@ -16,7 +17,7 @@ module Decidim
16
17
  validate :verify_import, if: -> { file.present? && accepted_mime_type? && !importer.invalid_file? }
17
18
 
18
19
  def importer
19
- @importer ||= importer_for(file_path, mime_type)
20
+ @importer ||= importer_for(file, mime_type)
20
21
  end
21
22
 
22
23
  private
@@ -44,15 +45,11 @@ module Decidim
44
45
  def verify_import
45
46
  return if importer.verify
46
47
 
47
- importer.errors.each do |_col, message|
48
- errors.add(:file, message)
48
+ importer.errors.each do |error|
49
+ errors.add(:file, error.message)
49
50
  end
50
51
  end
51
52
 
52
- def file_path
53
- file&.path
54
- end
55
-
56
53
  def mime_type
57
54
  file&.content_type
58
55
  end
@@ -61,9 +58,9 @@ module Decidim
61
58
  manifest.creator
62
59
  end
63
60
 
64
- def importer_for(filepath, mime_type)
61
+ def importer_for(path, mime_type)
65
62
  Import::ImporterFactory.build(
66
- filepath,
63
+ path,
67
64
  mime_type,
68
65
  context: importer_context,
69
66
  creator: creator_class
@@ -7,7 +7,7 @@ module Decidim
7
7
  class ManagedUserPromotionForm < Form
8
8
  attribute :email, String
9
9
 
10
- validates :email, presence: true, 'valid_email_2/email': { disposable: true }
10
+ validates :email, presence: true, "valid_email_2/email": { disposable: true }
11
11
  validate :unique_email
12
12
 
13
13
  private
@@ -8,19 +8,22 @@ module Decidim
8
8
  #
9
9
  class ParticipatorySpacePrivateUserCsvImportForm < Form
10
10
  include Decidim::HasUploadValidations
11
+ include Decidim::ProcessesFileLocally
11
12
 
12
- attribute :file
13
+ attribute :file, Decidim::Attributes::Blob
13
14
  attribute :user_name, String
14
15
  attribute :email, String
15
16
 
16
- validates :file, presence: true
17
+ validates :file, presence: true, file_content_type: { allow: ["text/csv"] }
17
18
  validate :validate_csv
18
19
 
19
20
  def validate_csv
20
21
  return if file.blank?
21
22
 
22
- CSV.foreach(file.path) do |_email, user_name|
23
- errors.add(:user_name, :invalid) unless user_name.match?(UserBaseEntity::REGEXP_NAME)
23
+ process_file_locally(file) do |file_path|
24
+ CSV.foreach(file_path) do |_email, user_name|
25
+ errors.add(:user_name, :invalid) unless user_name.match?(UserBaseEntity::REGEXP_NAME)
26
+ end
24
27
  end
25
28
  end
26
29
  end
@@ -4,15 +4,21 @@ module Decidim
4
4
  module Admin
5
5
  # This form handles permissions for a particular action in the admin panel.
6
6
  class PermissionForm < Form
7
- attribute :authorization_handlers, Hash
8
- attribute :authorization_handlers_options, Hash
7
+ attribute :authorization_handlers, Array[String]
8
+ attribute(:authorization_handlers_options, { String => Object })
9
+
10
+ def authorization_handlers
11
+ handlers = super || []
12
+
13
+ handlers.index_with { |name| { "options" => authorization_handler_options(name) } }
14
+ end
9
15
 
10
16
  def authorization_handlers_names
11
17
  authorization_handlers.keys.map(&:to_s)
12
18
  end
13
19
 
14
20
  def authorization_handler_options(handler_name)
15
- find_handler(handler_name)&.dig("options") || {}
21
+ authorization_handlers_options&.dig(handler_name.to_s) || {}
16
22
  end
17
23
 
18
24
  def manifest(handler_name)
@@ -33,11 +39,6 @@ module Decidim
33
39
  def options_manifest(handler_name)
34
40
  manifest(handler_name).options
35
41
  end
36
-
37
- def find_handler(handler_name)
38
- authorization_handlers[handler_name.to_s] ||
39
- authorization_handlers[handler_name.to_sym]
40
- end
41
42
  end
42
43
  end
43
44
  end
@@ -7,16 +7,7 @@ module Decidim
7
7
  class PermissionsForm < Form
8
8
  mimic :component_permissions
9
9
 
10
- attribute :permissions, Hash[String => PermissionForm]
11
-
12
- private
13
-
14
- # Overriding Rectify::Form#form_attributes_valid? to preserve errors from custom method validations.
15
- def form_attributes_valid?
16
- return false unless errors.empty? && permissions.each_value.map(&:errors).all?(&:empty?)
17
-
18
- super && permissions.values.all?(&:valid?)
19
- end
10
+ attribute(:permissions, { String => PermissionForm })
20
11
  end
21
12
  end
22
13
  end
@@ -7,9 +7,9 @@ module Decidim
7
7
  class UserGroupCsvVerificationForm < Form
8
8
  include Decidim::HasUploadValidations
9
9
 
10
- attribute :file
10
+ attribute :file, Decidim::Attributes::Blob
11
11
 
12
- validates :file, presence: true
12
+ validates :file, presence: true, file_content_type: { allow: ["text/csv"] }
13
13
  end
14
14
  end
15
15
  end
@@ -3,10 +3,6 @@
3
3
  module Decidim
4
4
  module Admin
5
5
  module BulkActionsHelper
6
- def proposal_find(id)
7
- Decidim::Proposals::Proposal.find(id)
8
- end
9
-
10
6
  # Public: Generates a select field with the categories. Only leaf categories can be set as selected.
11
7
  #
12
8
  # categories - A collection of categories.
@@ -14,8 +10,9 @@ module Decidim
14
10
  # Returns a String.
15
11
  def bulk_categories_select(collection)
16
12
  categories = bulk_categories_for_select collection
13
+ disabled = bulk_disabled_categories_for collection
17
14
  prompt = t("decidim.proposals.admin.proposals.index.change_category")
18
- select(:category, :id, options_for_select(categories, selected: []), prompt: prompt)
15
+ select(:category, :id, options_for_select(categories, selected: [], disabled: disabled), prompt: prompt)
19
16
  end
20
17
 
21
18
  def bulk_categories_for_select(scope)
@@ -38,6 +35,10 @@ module Decidim
38
35
  end
39
36
  end
40
37
 
38
+ def bulk_disabled_categories_for(scope)
39
+ scope.first_class.joins(:subcategories).pluck(:id)
40
+ end
41
+
41
42
  # Public: Generates a select field with the components.
42
43
  #
43
44
  # siblings - A collection of components.