decidim-admin 0.23.2 → 0.24.0
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.
Potentially problematic release.
This version of decidim-admin might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/assets/config/decidim_admin_manifest.js +1 -0
- data/app/assets/javascripts/decidim/admin/application.js.es6 +3 -1
- data/app/assets/javascripts/decidim/admin/budget_rule_toggler.component.js.es6 +23 -20
- data/app/assets/javascripts/decidim/admin/bundle.js +10 -17
- data/app/assets/javascripts/decidim/admin/bundle.js.map +1 -1
- data/app/assets/javascripts/decidim/admin/form.js.es6 +1 -0
- data/app/assets/javascripts/decidim/admin/import_guidance.js.es6 +29 -0
- data/app/assets/javascripts/decidim/admin/moderations.js.es6 +24 -0
- data/app/assets/javascripts/decidim/admin/proposal_infinite_edit.js.es6 +20 -0
- data/app/assets/javascripts/decidim/admin/subform_multi_toggler.component.js.es6 +2 -2
- data/app/assets/javascripts/decidim/admin/subform_toggler.component.js.es6 +2 -2
- data/app/assets/javascripts/decidim/admin/user_moderations.js +2 -0
- data/app/assets/stylesheets/decidim/admin/_variables.scss +9 -0
- data/app/assets/stylesheets/decidim/admin/components/_dropdown-menu.scss +3 -0
- data/app/assets/stylesheets/decidim/admin/extra/_action-icon.scss +13 -0
- data/app/assets/stylesheets/decidim/admin/extra/_block_user.scss +5 -0
- data/app/assets/stylesheets/decidim/admin/extra/_title_bar.scss +1 -0
- data/app/assets/stylesheets/decidim/admin/modules/_moderations.scss +39 -0
- data/app/assets/stylesheets/decidim/admin/modules/_modules.scss +2 -0
- data/app/assets/stylesheets/decidim/admin/modules/_reveal.scss +5 -0
- data/app/assets/stylesheets/decidim/admin/modules/_secondary-nav.scss +6 -3
- data/app/assets/stylesheets/decidim/admin/modules/_user-login.scss +2 -2
- data/app/assets/stylesheets/decidim/admin/user_moderations.scss +3 -0
- data/app/assets/stylesheets/decidim/admin/utils/_settings.scss +1 -0
- data/app/cells/decidim/admin/content_block/show.erb +1 -1
- data/app/cells/decidim/admin/content_block_cell.rb +4 -0
- data/app/commands/decidim/admin/block_user.rb +70 -0
- data/app/commands/decidim/admin/create_import.rb +29 -0
- data/app/commands/decidim/admin/create_participatory_space_admin_user_actions.rb +98 -0
- data/app/commands/decidim/admin/create_participatory_space_private_user.rb +1 -1
- data/app/commands/decidim/admin/create_static_page.rb +2 -1
- data/app/commands/decidim/admin/hide_resource.rb +21 -0
- data/app/commands/decidim/admin/impersonate_user.rb +17 -1
- data/app/commands/decidim/admin/promote_managed_user.rb +10 -0
- data/app/commands/decidim/admin/reorder_content_blocks.rb +6 -3
- data/app/commands/decidim/admin/transfer_user.rb +78 -0
- data/app/commands/decidim/admin/unblock_user.rb +48 -0
- data/app/commands/decidim/admin/unreport_user.rb +46 -0
- data/app/commands/decidim/admin/update_organization_appearance.rb +12 -4
- data/app/commands/decidim/admin/update_static_page.rb +2 -1
- data/app/commands/decidim/admin/verify_user_group.rb +1 -1
- data/app/controllers/concerns/decidim/admin/filterable.rb +1 -1
- data/app/controllers/concerns/decidim/admin/global_moderation_context.rb +47 -0
- data/app/controllers/concerns/decidim/admin/landing_page.rb +105 -0
- data/app/controllers/concerns/decidim/admin/landing_page_content_blocks.rb +118 -0
- data/app/controllers/concerns/decidim/moderations/admin/filterable.rb +54 -0
- data/app/controllers/decidim/admin/block_user_controller.rb +60 -0
- data/app/controllers/decidim/admin/components/base_controller.rb +1 -0
- data/app/controllers/decidim/admin/conflicts_controller.rb +46 -0
- data/app/controllers/decidim/admin/exports_controller.rb +1 -2
- data/app/controllers/decidim/admin/global_moderations/reports_controller.rb +18 -0
- data/app/controllers/decidim/admin/global_moderations_controller.rb +32 -0
- data/app/controllers/decidim/admin/impersonations_controller.rb +1 -1
- data/app/controllers/decidim/admin/imports_controller.rb +52 -0
- data/app/controllers/decidim/admin/moderated_users_controller.rb +44 -0
- data/app/controllers/decidim/admin/moderations/reports_controller.rb +39 -0
- data/app/controllers/decidim/admin/moderations_controller.rb +31 -7
- data/app/controllers/decidim/admin/officializations_controller.rb +3 -3
- data/app/controllers/decidim/admin/organization_homepage_controller.rb +6 -2
- data/app/controllers/decidim/admin/static_pages_controller.rb +7 -0
- data/app/events/decidim/resource_hidden_event.rb +37 -0
- data/app/forms/decidim/admin/block_user_form.rb +25 -0
- data/app/forms/decidim/admin/import_form.rb +85 -0
- data/app/forms/decidim/admin/organization_appearance_form.rb +1 -2
- data/app/forms/decidim/admin/static_page_form.rb +6 -1
- data/app/forms/decidim/admin/transfer_user_form.rb +19 -0
- data/app/helpers/decidim/admin/admin_terms_helper.rb +0 -7
- data/app/helpers/decidim/admin/application_helper.rb +5 -4
- data/app/helpers/decidim/admin/exports_helper.rb +2 -2
- data/app/helpers/decidim/admin/filterable_helper.rb +3 -2
- data/app/helpers/decidim/admin/imports_helper.rb +43 -0
- data/app/helpers/decidim/admin/menu_helper.rb +10 -0
- data/app/helpers/decidim/admin/moderations/reports_helper.rb +40 -0
- data/app/helpers/decidim/admin/moderations_helper.rb +36 -0
- data/app/helpers/decidim/admin/newsletters_helper.rb +4 -10
- data/app/helpers/decidim/admin/settings_helper.rb +2 -1
- data/app/helpers/decidim/admin/sidebar_menu_helper.rb +13 -0
- data/app/helpers/decidim/admin/user_moderations_helper.rb +6 -0
- data/app/jobs/decidim/admin/import_participatory_space_private_user_csv_job.rb +1 -1
- data/app/jobs/decidim/admin/verify_user_group_from_csv_job.rb +1 -1
- data/app/permissions/decidim/admin/permissions.rb +7 -6
- data/app/presenters/decidim/admin/dashboard_metric_charts_presenter.rb +1 -1
- data/app/presenters/decidim/admin/secondary_menu_presenter.rb +26 -0
- data/app/queries/decidim/admin/active_users_counter.rb +1 -2
- data/app/queries/decidim/admin/user_filter.rb +1 -2
- data/app/views/decidim/admin/admin_terms/show.html.erb +1 -1
- data/app/views/decidim/admin/attachment_collections/index.html.erb +1 -1
- data/app/views/decidim/admin/attachments/index.html.erb +1 -1
- data/app/views/decidim/admin/block_user/new.html.erb +22 -0
- data/app/views/decidim/admin/categories/index.html.erb +1 -1
- data/app/views/decidim/admin/components/_component.html.erb +12 -0
- data/app/views/decidim/admin/components/_form.html.erb +1 -1
- data/app/views/decidim/admin/conflicts/edit.html.erb +46 -0
- data/app/views/decidim/admin/conflicts/index.html.erb +34 -0
- data/app/views/decidim/admin/dashboard/show.html.erb +2 -1
- data/app/views/decidim/admin/exports/_dropdown.html.erb +1 -1
- data/app/views/decidim/admin/imports/_dropdown.html.erb +9 -0
- data/app/views/decidim/admin/imports/new.html.erb +57 -0
- data/app/views/decidim/admin/moderated_users/_report.html.erb +10 -0
- data/app/views/decidim/admin/moderated_users/index.html.erb +78 -0
- data/app/views/decidim/admin/moderations/_report.html.erb +1 -1
- data/app/views/decidim/admin/moderations/index.html.erb +28 -9
- data/app/views/decidim/admin/moderations/reports/index.html.erb +102 -0
- data/app/views/decidim/admin/moderations/reports/show.html.erb +62 -0
- data/app/views/decidim/admin/newsletters/index.html.erb +1 -1
- data/app/views/decidim/admin/newsletters/select_recipients_to_deliver.html.erb +2 -2
- data/app/views/decidim/admin/officializations/index.html.erb +13 -4
- data/app/views/decidim/admin/organization_appearance/_form.html.erb +0 -4
- data/app/views/decidim/admin/organization_appearance/form/_colors.html.erb +1 -1
- data/app/views/decidim/admin/organization_appearance/form/_images.html.erb +4 -4
- data/app/views/decidim/admin/participatory_space_private_users/index.html.erb +1 -1
- data/app/views/decidim/admin/shared/landing_page/edit.html.erb +47 -0
- data/app/views/decidim/admin/shared/landing_page_content_blocks/edit.html.erb +15 -0
- data/app/views/decidim/admin/static_pages/_form.html.erb +6 -0
- data/app/views/decidim/admin/users/index.html.erb +1 -1
- data/app/views/layouts/decidim/admin/_application.html.erb +5 -1
- data/app/views/layouts/decidim/admin/_title_bar.html.erb +2 -2
- data/app/views/layouts/decidim/admin/global_moderations.html.erb +7 -0
- data/app/views/layouts/decidim/admin/newsletters.erb +1 -1
- data/app/views/layouts/decidim/admin/settings.html.erb +2 -33
- data/app/views/layouts/decidim/admin/users.html.erb +11 -0
- data/config/locales/ar.yml +0 -5
- data/config/locales/bg.yml +0 -1
- data/config/locales/ca.yml +149 -4
- data/config/locales/cs.yml +151 -6
- data/config/locales/de.yml +150 -5
- data/config/locales/el.yml +62 -5
- data/config/locales/en.yml +150 -5
- data/config/locales/es-MX.yml +148 -3
- data/config/locales/es-PY.yml +148 -3
- data/config/locales/es.yml +148 -3
- data/config/locales/eu.yml +0 -3
- data/config/locales/fi-plain.yml +148 -3
- data/config/locales/fi.yml +148 -3
- data/config/locales/fr-CA.yml +139 -4
- data/config/locales/fr.yml +139 -4
- data/config/locales/gl.yml +121 -5
- data/config/locales/hu.yml +13 -5
- data/config/locales/id-ID.yml +0 -3
- data/config/locales/is-IS.yml +36 -3
- data/config/locales/it.yml +59 -5
- data/config/locales/ja.yml +41 -8
- data/config/locales/lv.yml +0 -5
- data/config/locales/nl.yml +120 -7
- data/config/locales/no.yml +11 -5
- data/config/locales/pl.yml +166 -20
- data/config/locales/pt-BR.yml +0 -3
- data/config/locales/pt.yml +0 -5
- data/config/locales/ro-RO.yml +21 -5
- data/config/locales/ru.yml +0 -3
- data/config/locales/sk.yml +0 -5
- data/config/locales/sl.yml +0 -1
- data/config/locales/sr-CS.yml +0 -3
- data/config/locales/sv.yml +50 -4
- data/config/locales/tr-TR.yml +81 -4
- data/config/locales/uk.yml +0 -3
- data/config/locales/zh-CN.yml +0 -5
- data/config/routes.rb +21 -1
- data/lib/decidim/admin.rb +6 -0
- data/lib/decidim/admin/engine.rb +76 -1
- data/lib/decidim/admin/import.rb +12 -0
- data/lib/decidim/admin/import/creator.rb +82 -0
- data/lib/decidim/admin/import/importer.rb +82 -0
- data/lib/decidim/admin/import/importer_factory.rb +17 -0
- data/lib/decidim/admin/import/readers.rb +39 -0
- data/lib/decidim/admin/import/readers/base.rb +31 -0
- data/lib/decidim/admin/import/readers/csv.rb +23 -0
- data/lib/decidim/admin/import/readers/json.rb +25 -0
- data/lib/decidim/admin/import/readers/xls.rb +25 -0
- data/lib/decidim/admin/test/commands/create_attachment_collection_examples.rb +6 -6
- data/lib/decidim/admin/test/commands/create_category_examples.rb +6 -6
- data/lib/decidim/admin/test/filterable_examples.rb +1 -8
- data/lib/decidim/admin/test/manage_moderations_examples.rb +68 -4
- data/lib/decidim/admin/version.rb +1 -1
- metadata +71 -15
- data/app/assets/javascripts/decidim/admin/gallery.js.es6 +0 -5
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
class UnblockUser < Rectify::Command
|
6
|
+
# Public: Initializes the command.
|
7
|
+
#
|
8
|
+
# blocked_user - the user that is unblocked
|
9
|
+
# current_user - the user performing the action
|
10
|
+
def initialize(blocked_user, current_user)
|
11
|
+
@blocked_user = blocked_user
|
12
|
+
@current_user = current_user
|
13
|
+
end
|
14
|
+
|
15
|
+
# Executes the command. Broadcasts these events:
|
16
|
+
#
|
17
|
+
# - :ok when everything is valid, together with the resource.
|
18
|
+
# - :invalid if the resource is not reported
|
19
|
+
#
|
20
|
+
# Returns nothing.
|
21
|
+
def call
|
22
|
+
return broadcast(:invalid) unless @blocked_user.blocked?
|
23
|
+
|
24
|
+
unblock!
|
25
|
+
broadcast(:ok, @blocked_user)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def unblock!
|
31
|
+
Decidim.traceability.perform_action!(
|
32
|
+
"unblock",
|
33
|
+
@blocked_user,
|
34
|
+
@current_user,
|
35
|
+
extra: {
|
36
|
+
reportable_type: @blocked_user.class.name
|
37
|
+
}
|
38
|
+
) do
|
39
|
+
@blocked_user.blocked = false
|
40
|
+
@blocked_user.blocked_at = nil
|
41
|
+
@blocked_user.block_id = nil
|
42
|
+
@blocked_user.name = @blocked_user.user_name
|
43
|
+
@blocked_user.save!
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
class UnreportUser < Rectify::Command
|
6
|
+
# Public: Initializes the command.
|
7
|
+
#
|
8
|
+
# reportable - A Decidim::User - The user reported
|
9
|
+
# current_user - the user performing the action
|
10
|
+
def initialize(reportable, current_user)
|
11
|
+
@reportable = reportable
|
12
|
+
@current_user = current_user
|
13
|
+
end
|
14
|
+
|
15
|
+
# Executes the command. Broadcasts these events:
|
16
|
+
#
|
17
|
+
# - :ok when everything is valid, together with the resource.
|
18
|
+
# - :invalid if the resource is not reported
|
19
|
+
#
|
20
|
+
# Returns nothing.
|
21
|
+
def call
|
22
|
+
return broadcast(:invalid) unless @reportable.reported?
|
23
|
+
|
24
|
+
unreport!
|
25
|
+
broadcast(:ok, @reportable)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def unreport!
|
31
|
+
Decidim.traceability.perform_action!(
|
32
|
+
"unreport",
|
33
|
+
@reportable.user_moderation,
|
34
|
+
@current_user,
|
35
|
+
extra: {
|
36
|
+
reportable_type: @reportable.class.name,
|
37
|
+
username: @reportable.name,
|
38
|
+
user_id: @reportable.id
|
39
|
+
}
|
40
|
+
) do
|
41
|
+
@reportable.user_moderation.destroy!
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -10,6 +10,9 @@ module Decidim
|
|
10
10
|
# organization - The Organization that will be updated.
|
11
11
|
# form - A form object with the params.
|
12
12
|
def initialize(organization, form)
|
13
|
+
image_fields.each do |field|
|
14
|
+
form.send("#{field}=".to_sym, organization.send(field)) if form.send(field).blank?
|
15
|
+
end
|
13
16
|
@organization = organization
|
14
17
|
@form = form
|
15
18
|
end
|
@@ -27,14 +30,19 @@ module Decidim
|
|
27
30
|
update_organization
|
28
31
|
broadcast(:ok, organization)
|
29
32
|
rescue ActiveRecord::RecordInvalid
|
30
|
-
|
31
|
-
|
33
|
+
image_fields.each do |field|
|
34
|
+
form.errors.add(field, organization.errors[field]) if organization.errors.include? field
|
35
|
+
end
|
32
36
|
broadcast(:invalid)
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
36
40
|
private
|
37
41
|
|
42
|
+
def image_fields
|
43
|
+
[:highlighted_content_banner_image, :logo, :favicon, :official_img_header, :official_img_footer]
|
44
|
+
end
|
45
|
+
|
38
46
|
attr_reader :form, :organization
|
39
47
|
|
40
48
|
def update_organization
|
@@ -50,6 +58,7 @@ module Decidim
|
|
50
58
|
.merge(highlighted_content_banner_attributes)
|
51
59
|
.merge(omnipresent_banner_attributes)
|
52
60
|
.merge(colors_attributes)
|
61
|
+
.delete_if { |_k, val| val.is_a?(Decidim::ApplicationUploader) }
|
53
62
|
.tap do |attributes|
|
54
63
|
attributes[:header_snippets] = form.header_snippets if Decidim.enable_html_header_snippets
|
55
64
|
end
|
@@ -68,8 +77,7 @@ module Decidim
|
|
68
77
|
remove_official_img_header: form.remove_official_img_header,
|
69
78
|
official_img_footer: form.official_img_footer,
|
70
79
|
remove_official_img_footer: form.remove_official_img_footer,
|
71
|
-
official_url: form.official_url
|
72
|
-
show_statistics: form.show_statistics
|
80
|
+
official_url: form.official_url
|
73
81
|
}
|
74
82
|
end
|
75
83
|
|
@@ -8,7 +8,7 @@ module Decidim
|
|
8
8
|
#
|
9
9
|
# user_group - The user_group to verify
|
10
10
|
# current_user - the user performing the action
|
11
|
-
def initialize(user_group, current_user, via_csv
|
11
|
+
def initialize(user_group, current_user, via_csv: false)
|
12
12
|
@user_group = user_group
|
13
13
|
@current_user = current_user
|
14
14
|
@via_csv = via_csv
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Decidim
|
6
|
+
module Admin
|
7
|
+
module GlobalModerationContext
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
# Private: Overwrites the method from the parent controller so that the
|
12
|
+
# permission system does not overwrite permissions.
|
13
|
+
def permission_resource
|
14
|
+
:global_moderation
|
15
|
+
end
|
16
|
+
|
17
|
+
# Private: Finds the participatory spaces the current user is admin to.
|
18
|
+
# This method will later be used to find out what moderations the
|
19
|
+
# current user can manage.
|
20
|
+
#
|
21
|
+
# Returns an Array.
|
22
|
+
def spaces_user_is_admin_to
|
23
|
+
@spaces_user_is_admin_to ||=
|
24
|
+
Decidim.participatory_space_manifests.flat_map do |manifest|
|
25
|
+
Decidim
|
26
|
+
.find_participatory_space_manifest(manifest.name)
|
27
|
+
.participatory_spaces
|
28
|
+
.call(current_organization)&.select do |space|
|
29
|
+
space.moderators.exists?(id: current_user.id) ||
|
30
|
+
space.admins.exists?(id: current_user.id)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Private: finds the moderations the current user can manage, taking into
|
36
|
+
# account whether the user is an organization-wide admin or a
|
37
|
+
# "participatory space admin".
|
38
|
+
#
|
39
|
+
# Returns an `ActiveRecord::Relation`
|
40
|
+
def moderations_for_user
|
41
|
+
@moderations_for_user ||=
|
42
|
+
Decidim::Moderation.where(participatory_space: spaces_user_is_admin_to)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
module LandingPage
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
included do
|
8
|
+
helper_method :active_blocks, :active_content_blocks_title, :inactive_blocks,
|
9
|
+
:inactive_content_blocks_title, :resource_content_block_cell,
|
10
|
+
:resource_landing_page_content_block_path, :resource_sort_url,
|
11
|
+
:scoped_resource
|
12
|
+
def edit
|
13
|
+
enforce_permission_to_update_resource
|
14
|
+
|
15
|
+
render "decidim/admin/shared/landing_page/edit"
|
16
|
+
end
|
17
|
+
|
18
|
+
def update
|
19
|
+
enforce_permission_to_update_resource
|
20
|
+
|
21
|
+
Decidim::Admin::ReorderContentBlocks.call(current_organization, content_block_scope, params[:manifests], scoped_resource.id) do
|
22
|
+
on(:ok) do
|
23
|
+
head :ok
|
24
|
+
end
|
25
|
+
on(:invalid) do
|
26
|
+
head :bad_request
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# Method to be implemented at the controller. You need to
|
34
|
+
# return a symbol that defines the content block scope.
|
35
|
+
# Examples of scopes could be `:homepage` or `:landing_page`.
|
36
|
+
def content_block_scope
|
37
|
+
raise "#{self.class.name} is expected to implement #content_block_scope"
|
38
|
+
end
|
39
|
+
|
40
|
+
# Method to be implemented at the controller. Defines the permissions for
|
41
|
+
# edit and update actions.
|
42
|
+
# For example `enforce_permission_to :manage_landing_page, :voting, voting: current_space`.
|
43
|
+
def enforce_permission_to_update_resource
|
44
|
+
raise "#{self.class.name} is expected to implement #enforce_permission_to_update_resource"
|
45
|
+
end
|
46
|
+
|
47
|
+
# Method to be implemented at the controller. Returns the URL
|
48
|
+
# where the ordered/activated content_blocks is submitted to.
|
49
|
+
def resource_sort_url
|
50
|
+
raise "#{self.class.name} is expected to implement #resource_sort_url"
|
51
|
+
end
|
52
|
+
|
53
|
+
# Method to be implemented at the controller. Returns a string
|
54
|
+
# with the header text for the active content_block column.
|
55
|
+
#
|
56
|
+
# Example: `t("landing_page.edit.active_content_blocks", scope: "decidim.votings.admin")`
|
57
|
+
def active_content_blocks_title
|
58
|
+
raise "#{self.class.name} is expected to implement #active_content_blocks_title"
|
59
|
+
end
|
60
|
+
|
61
|
+
# Method to be implemented at the controller. Returns a string
|
62
|
+
# with the header text for the inactive content_block column.
|
63
|
+
#
|
64
|
+
# Example: `t("landing_page.edit.inactive_content_blocks", scope: "decidim.votings.admin")`
|
65
|
+
def inactive_content_blocks_title
|
66
|
+
raise "#{self.class.name} is expected to implement #inactive_content_blocks_title"
|
67
|
+
end
|
68
|
+
|
69
|
+
# Method to be implemented at the controller. Returns a string
|
70
|
+
# with the cell name to be used for the drag'n'drop for each content_block.
|
71
|
+
#
|
72
|
+
# Example: "decidim/votings/content_block"
|
73
|
+
def resource_content_block_cell
|
74
|
+
raise "#{self.class.name} is expected to implement #resource_content_block_cell"
|
75
|
+
end
|
76
|
+
|
77
|
+
# Shared methods
|
78
|
+
def content_blocks
|
79
|
+
@content_blocks ||= Decidim::ContentBlock.for_scope(
|
80
|
+
content_block_scope,
|
81
|
+
organization: current_organization
|
82
|
+
).where(scoped_resource_id: scoped_resource.id)
|
83
|
+
end
|
84
|
+
|
85
|
+
def active_blocks
|
86
|
+
@active_blocks ||= content_blocks.published
|
87
|
+
end
|
88
|
+
|
89
|
+
def inactive_blocks
|
90
|
+
@inactive_blocks ||= content_blocks.unpublished + unused_manifests
|
91
|
+
end
|
92
|
+
|
93
|
+
def used_manifests
|
94
|
+
@used_manifests ||= content_blocks.map(&:manifest_name)
|
95
|
+
end
|
96
|
+
|
97
|
+
def unused_manifests
|
98
|
+
@unused_manifests ||= Decidim.content_blocks.for(content_block_scope).reject do |manifest|
|
99
|
+
used_manifests.include?(manifest.name.to_s)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
module LandingPageContentBlocks
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
included do
|
8
|
+
helper_method :content_block, :resource_landing_page_content_block_path,
|
9
|
+
:scoped_resource, :submit_button_text
|
10
|
+
|
11
|
+
def edit
|
12
|
+
enforce_permission_to_update_resource
|
13
|
+
@form = form(Decidim::Admin::ContentBlockForm).from_model(content_block)
|
14
|
+
|
15
|
+
render "decidim/admin/shared/landing_page_content_blocks/edit"
|
16
|
+
end
|
17
|
+
|
18
|
+
def update
|
19
|
+
enforce_permission_to_update_resource
|
20
|
+
@form = form(Decidim::Admin::ContentBlockForm).from_params(params)
|
21
|
+
|
22
|
+
Decidim::Admin::UpdateContentBlock.call(@form, content_block, content_block_scope) do
|
23
|
+
on(:ok) do
|
24
|
+
redirect_to edit_resource_landing_page_path
|
25
|
+
end
|
26
|
+
on(:invalid) do
|
27
|
+
render "decidim/admin/shared/landing_page_content_blocks/edit"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# Method to be implemented at the controller. You need to
|
35
|
+
# return a symbol that defines the content block scope.
|
36
|
+
# Examples of scopes could be `:homepage` or `:voting_landing_page`.
|
37
|
+
def content_block_scope
|
38
|
+
raise "#{self.class.name} is expected to implement #content_block_scope"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Method to be implemented at the controller. You need to
|
42
|
+
# return an Object to filter the content blocks for the given resource.
|
43
|
+
#
|
44
|
+
# For example a `Voting` record.
|
45
|
+
def scoped_resource
|
46
|
+
raise "#{self.class.name} is expected to implement #scoped_resource"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Method to be implemented at the controller. Defines the permissions for
|
50
|
+
# edit and update actions.
|
51
|
+
#
|
52
|
+
# Example: `enforce_permission_to :manage_landing_page, :voting, voting: current_space`.
|
53
|
+
def enforce_permission_to_update_resource
|
54
|
+
raise "#{self.class.name} is expected to implement #enforce_permission_to_update_resource"
|
55
|
+
end
|
56
|
+
|
57
|
+
# Method to be implemented at the controller. Returns the URL
|
58
|
+
# to the edit landing page path.
|
59
|
+
#
|
60
|
+
# Example: `edit_voting_landing_page_path(scoped_resource)`
|
61
|
+
def edit_resource_landing_page_path
|
62
|
+
raise "#{self.class.name} is expected to implement #edit_resource_landing_page_path"
|
63
|
+
end
|
64
|
+
|
65
|
+
# Method to be implemented at the controller. Returns the URL
|
66
|
+
# where the ContentBlockForm is submitted.
|
67
|
+
#
|
68
|
+
# Example: `voting_landing_page_content_block_path(scoped_resource, params[:id])`
|
69
|
+
def resource_landing_page_content_block_path
|
70
|
+
raise "#{self.class.name} is expected to implement #resource_landing_page_content_block_path"
|
71
|
+
end
|
72
|
+
|
73
|
+
# Method to be implemented at the controller. Returns a string
|
74
|
+
# with the text for the submit button of the ContentBlockForm.
|
75
|
+
#
|
76
|
+
# Example: t("landing_page.content_blocks.edit.update", scope: "decidim.votings.admin")
|
77
|
+
def submit_button_text
|
78
|
+
raise "#{self.class.name} is expected to implement #submit_button_text"
|
79
|
+
end
|
80
|
+
|
81
|
+
# Shared methods
|
82
|
+
def content_block
|
83
|
+
@content_block ||= content_blocks.find_by(manifest_name: params[:id]) || content_block_from_manifest
|
84
|
+
end
|
85
|
+
|
86
|
+
def content_block_manifest
|
87
|
+
@content_block_manifest = unused_content_block_manifests.find { |manifest| manifest.name.to_s == params[:id] }
|
88
|
+
end
|
89
|
+
|
90
|
+
def content_blocks
|
91
|
+
@content_blocks ||= Decidim::ContentBlock.for_scope(
|
92
|
+
content_block_scope,
|
93
|
+
organization: current_organization
|
94
|
+
).where(scoped_resource_id: scoped_resource.id)
|
95
|
+
end
|
96
|
+
|
97
|
+
def used_content_block_manifests
|
98
|
+
@used_content_block_manifests ||= content_blocks.map(&:manifest_name)
|
99
|
+
end
|
100
|
+
|
101
|
+
def unused_content_block_manifests
|
102
|
+
@unused_content_block_manifests ||= Decidim.content_blocks.for(content_block_scope).reject do |manifest|
|
103
|
+
used_content_block_manifests.include?(manifest.name.to_s)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def content_block_from_manifest
|
108
|
+
Decidim::ContentBlock.create!(
|
109
|
+
organization: current_organization,
|
110
|
+
scope_name: content_block_scope,
|
111
|
+
scoped_resource_id: scoped_resource.id,
|
112
|
+
manifest_name: params[:id]
|
113
|
+
)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|