decidim-admin 0.18.1 → 0.19.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of decidim-admin might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/assets/javascripts/decidim/admin/form.js.es6 +24 -8
- data/app/assets/stylesheets/decidim/admin/modules/_forms.scss +8 -0
- data/app/assets/stylesheets/decidim/admin/modules/_modules.scss +1 -0
- data/app/commands/decidim/admin/create_component.rb +4 -7
- data/app/commands/decidim/admin/create_participatory_space_private_user.rb +4 -2
- data/app/commands/decidim/admin/destroy_newsletter.rb +1 -0
- data/app/commands/decidim/admin/process_participatory_space_private_user_import_csv.rb +41 -0
- data/app/commands/decidim/admin/process_user_group_verification_csv.rb +1 -0
- data/app/commands/decidim/admin/reject_user_group.rb +1 -0
- data/app/commands/decidim/admin/remove_admin.rb +1 -1
- data/app/commands/decidim/admin/update_component_permissions.rb +1 -1
- data/app/commands/decidim/admin/update_organization.rb +1 -0
- data/app/commands/decidim/admin/verify_user_group.rb +1 -0
- data/app/controllers/decidim/admin/areas_controller.rb +1 -0
- data/app/controllers/decidim/admin/components_controller.rb +29 -5
- data/app/controllers/decidim/admin/concerns/has_private_users_csv_import.rb +58 -0
- data/app/controllers/decidim/admin/impersonations_controller.rb +19 -2
- data/app/controllers/decidim/admin/resource_permissions_controller.rb +4 -1
- data/app/controllers/decidim/admin/scopes_controller.rb +2 -0
- data/app/forms/decidim/admin/component_form.rb +41 -16
- data/app/forms/decidim/admin/managed_user_promotion_form.rb +1 -0
- data/app/forms/decidim/admin/participatory_space_private_user_csv_import_form.rb +13 -0
- data/app/forms/decidim/admin/selective_newsletter_form.rb +1 -0
- data/app/helpers/decidim/admin/application_helper.rb +1 -1
- data/app/helpers/decidim/admin/attributes_display_helper.rb +2 -0
- data/app/helpers/decidim/admin/newsletters_helper.rb +6 -0
- data/app/helpers/decidim/admin/resource_permissions_helper.rb +1 -1
- data/app/helpers/decidim/admin/settings_helper.rb +52 -10
- data/app/jobs/decidim/admin/expire_impersonation_job.rb +1 -0
- data/app/jobs/decidim/admin/import_participatory_space_private_user_csv_job.rb +27 -0
- data/app/jobs/decidim/admin/newsletter_job.rb +1 -0
- data/app/jobs/decidim/admin/verify_user_group_from_csv_job.rb +1 -0
- data/app/permissions/decidim/admin/permissions.rb +4 -0
- data/app/permissions/decidim/admin/user_manager_permissions.rb +2 -0
- data/app/queries/decidim/admin/newsletter_recipients.rb +3 -0
- data/app/queries/decidim/admin/user_filter.rb +1 -0
- data/app/queries/decidim/admin/user_groups_evaluation.rb +1 -0
- data/app/views/decidim/admin/attachment_collections/index.html.erb +1 -1
- data/app/views/decidim/admin/attachment_collections/show.html.erb +1 -1
- data/app/views/decidim/admin/attachments/index.html.erb +1 -1
- data/app/views/decidim/admin/attachments/show.html.erb +1 -1
- data/app/views/decidim/admin/categories/index.html.erb +2 -2
- data/app/views/decidim/admin/categories/show.html.erb +1 -1
- data/app/views/decidim/admin/components/_form.html.erb +6 -6
- data/app/views/decidim/admin/components/_settings_fields.html.erb +6 -5
- data/app/views/decidim/admin/impersonations/_form.html.erb +1 -3
- data/app/views/decidim/admin/newsletters/select_recipients_to_deliver.html.erb +1 -1
- data/app/views/decidim/admin/organization_appearance/_form.html.erb +0 -7
- data/app/views/decidim/admin/participatory_space_private_users/index.html.erb +4 -3
- data/app/views/decidim/admin/participatory_space_private_users_csv_imports/new.html.erb +19 -0
- data/app/views/decidim/admin/resource_permissions/edit.html.erb +1 -1
- data/app/views/decidim/admin/static_pages/_topic.html.erb +1 -1
- data/app/views/decidim/admin/static_pages/show.html.erb +1 -1
- data/app/views/layouts/decidim/admin/_application.html.erb +6 -6
- data/app/views/layouts/decidim/admin/_header.html.erb +1 -1
- data/config/locales/ar.yml +7 -1
- data/config/locales/ca.yml +23 -11
- data/config/locales/cs.yml +13 -2
- data/config/locales/de.yml +9 -0
- data/config/locales/en.yml +14 -2
- data/config/locales/es-MX.yml +13 -2
- data/config/locales/es-PY.yml +13 -2
- data/config/locales/es.yml +13 -1
- data/config/locales/fi-plain.yml +13 -2
- data/config/locales/fi.yml +14 -2
- data/config/locales/fr.yml +13 -2
- data/config/locales/hu.yml +13 -1
- data/config/locales/it.yml +12 -2
- data/config/locales/nl.yml +13 -1
- data/config/locales/sv.yml +0 -1
- data/config/locales/tr-TR.yml +0 -2
- data/lib/decidim/admin/test/manage_attachments_examples.rb +1 -1
- data/lib/decidim/admin/version.rb +1 -1
- metadata +14 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fe9da64e350f8f333b98343743715f137e5f48ed586e9c397bad527caff7738
|
4
|
+
data.tar.gz: 22ae4dbc9bdaf872065dd3b3ca4c4458b5e0d824bb1c7f6a8dc12db7926abed7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9459a7af134d40568c3f9d53b4edd9f45dbbab101a9d093597ae9ab81a82288876a574d23fe0ab05986c9d7f904bad4058e957eb8e159fa34f614f13a6619db2
|
7
|
+
data.tar.gz: 5188ed41e3f8cf190a64315add75292008af12766a0a1a33307d38f3b5404c2a667b2993ef94eb8738a54e3e76d9693867aefa5b4702585d80f15731334503af
|
@@ -1,17 +1,33 @@
|
|
1
|
-
// Checks if the form contains
|
2
|
-
// Decidim::Admin::SettingsHelper
|
3
|
-
// extracts the stored text and adds a new paragraph after the field.
|
1
|
+
// Checks if the form contains fields with special CSS classes added in
|
2
|
+
// Decidim::Admin::SettingsHelper and acts accordingly.
|
4
3
|
$(() => {
|
5
|
-
|
4
|
+
// Prevents checkbox with ".participatory_texts_disabled" class from being clicked.
|
5
|
+
const $participatoryTexts = $(".participatory_texts_disabled");
|
6
6
|
|
7
|
-
$
|
7
|
+
$participatoryTexts.click((event) => {
|
8
8
|
event.preventDefault();
|
9
9
|
return false;
|
10
10
|
});
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
// Target fields:
|
13
|
+
// - amendments_wizard_help_text
|
14
|
+
// - all fields with ".amendments_step_settings" class
|
15
|
+
// (1) Hides target fields if amendments_enabled component setting is NOT checked.
|
16
|
+
// (2) Toggles visibilty of target fields when amendments_enabled component setting is clicked.
|
17
|
+
const $amendmentsEnabled = $("input#component_settings_amendments_enabled");
|
14
18
|
|
15
|
-
|
19
|
+
if ($amendmentsEnabled.length > 0) {
|
20
|
+
const $amendmentWizardHelpText = $("[id*='amendments_wizard_help_text']").parent();
|
21
|
+
const $amendmentStepSettings = $(".amendments_step_settings").parent();
|
22
|
+
|
23
|
+
if ($amendmentsEnabled.is(":not(:checked)")) {
|
24
|
+
$amendmentWizardHelpText.hide();
|
25
|
+
$amendmentStepSettings.hide().siblings(".help-text").hide();
|
26
|
+
}
|
27
|
+
|
28
|
+
$amendmentsEnabled.click(() => {
|
29
|
+
$amendmentWizardHelpText.toggle();
|
30
|
+
$amendmentStepSettings.toggle().siblings(".help-text").toggle();
|
31
|
+
});
|
16
32
|
}
|
17
33
|
});
|
@@ -8,13 +8,10 @@ module Decidim
|
|
8
8
|
|
9
9
|
# Public: Initializes the command.
|
10
10
|
#
|
11
|
-
#
|
12
|
-
|
13
|
-
# participatory_space - The participatory space that will hold this component.
|
14
|
-
def initialize(manifest, form, participatory_space)
|
15
|
-
@manifest = manifest
|
11
|
+
# form - The form from which the data in this component comes from.
|
12
|
+
def initialize(form)
|
16
13
|
@form = form
|
17
|
-
@
|
14
|
+
@manifest = form.manifest
|
18
15
|
end
|
19
16
|
|
20
17
|
# Public: Creates the Component.
|
@@ -39,7 +36,7 @@ module Decidim
|
|
39
36
|
form.current_user,
|
40
37
|
manifest_name: manifest.name,
|
41
38
|
name: form.name,
|
42
|
-
participatory_space: participatory_space,
|
39
|
+
participatory_space: form.participatory_space,
|
43
40
|
weight: form.weight,
|
44
41
|
settings: form.settings,
|
45
42
|
default_step_settings: form.default_step_settings,
|
@@ -10,10 +10,11 @@ module Decidim
|
|
10
10
|
# form - A form object with the params.
|
11
11
|
# private_user_to - The private_user_to that will hold the
|
12
12
|
# user role
|
13
|
-
def initialize(form, current_user, private_user_to)
|
13
|
+
def initialize(form, current_user, private_user_to, via_csv = false)
|
14
14
|
@form = form
|
15
15
|
@current_user = current_user
|
16
16
|
@private_user_to = private_user_to
|
17
|
+
@via_csv = via_csv
|
17
18
|
end
|
18
19
|
|
19
20
|
# Executes the command. Broadcasts these events:
|
@@ -41,8 +42,9 @@ module Decidim
|
|
41
42
|
attr_reader :form, :private_user_to, :current_user, :user
|
42
43
|
|
43
44
|
def create_private_user
|
45
|
+
action = @via_csv ? "create_via_csv" : "create"
|
44
46
|
Decidim.traceability.perform_action!(
|
45
|
-
|
47
|
+
action,
|
46
48
|
Decidim::ParticipatorySpacePrivateUser,
|
47
49
|
current_user,
|
48
50
|
resource: {
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "csv"
|
4
|
+
|
5
|
+
module Decidim
|
6
|
+
module Admin
|
7
|
+
class ProcessParticipatorySpacePrivateUserImportCsv < Rectify::Command
|
8
|
+
# Public: Initializes the command.
|
9
|
+
#
|
10
|
+
# form - the form object containing the uploaded file
|
11
|
+
# current_user - the user performing the action
|
12
|
+
# private_users_to - The private_users_to that will hold the user role
|
13
|
+
def initialize(form, current_user, private_users_to)
|
14
|
+
@form = form
|
15
|
+
@current_user = current_user
|
16
|
+
@private_users_to = private_users_to
|
17
|
+
end
|
18
|
+
|
19
|
+
# Executes the command. Broadcasts these events:
|
20
|
+
#
|
21
|
+
# - :ok when everything is valid.
|
22
|
+
# - :invalid if the form wasn't valid and we couldn't proceed.
|
23
|
+
#
|
24
|
+
# Returns nothing.
|
25
|
+
def call
|
26
|
+
return broadcast(:invalid) unless @form.valid?
|
27
|
+
|
28
|
+
process_csv
|
29
|
+
broadcast(:ok)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def process_csv
|
35
|
+
CSV.foreach(@form.file.path) do |email, user_name|
|
36
|
+
ImportParticipatorySpacePrivateUserCsvJob.perform_later(email, user_name, @private_users_to, @current_user) if email.present? && user_name.present?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -75,7 +75,7 @@ module Decidim
|
|
75
75
|
return permissions unless component.permissions
|
76
76
|
|
77
77
|
permissions.deep_stringify_keys.reject do |action, config|
|
78
|
-
|
78
|
+
Hashdiff.diff(config, component.permissions[action]).empty?
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -27,10 +27,10 @@ module Decidim
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def create
|
30
|
-
@form = form(ComponentForm).from_params(
|
30
|
+
@form = form(ComponentForm).from_params(form_params)
|
31
31
|
enforce_permission_to :create, :component
|
32
32
|
|
33
|
-
CreateComponent.call(
|
33
|
+
CreateComponent.call(@form) do
|
34
34
|
on(:ok) do
|
35
35
|
flash[:notice] = I18n.t("components.create.success", scope: "decidim.admin")
|
36
36
|
redirect_to action: :index
|
@@ -52,7 +52,7 @@ module Decidim
|
|
52
52
|
|
53
53
|
def update
|
54
54
|
@component = query_scope.find(params[:id])
|
55
|
-
@form = form(ComponentForm).from_params(
|
55
|
+
@form = form(ComponentForm).from_params(form_params)
|
56
56
|
enforce_permission_to :update, :component, component: @component
|
57
57
|
|
58
58
|
UpdateComponent.call(@form, @component) do
|
@@ -65,7 +65,7 @@ module Decidim
|
|
65
65
|
|
66
66
|
on(:invalid) do
|
67
67
|
flash[:alert] = I18n.t("components.update.error", scope: "decidim.admin")
|
68
|
-
|
68
|
+
render action: :edit
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
@@ -113,12 +113,36 @@ module Decidim
|
|
113
113
|
|
114
114
|
private
|
115
115
|
|
116
|
+
# Returns a Class with the attributes sanitized, coerced and filtered
|
117
|
+
# to the right type. See Decidim::SettingsManifest#schema.
|
118
|
+
def new_settings_schema(name, data)
|
119
|
+
manifest.settings(name).schema.new(data, current_organization.default_locale)
|
120
|
+
end
|
121
|
+
|
122
|
+
# Processes the component params so Decidim::Admin::ComponentForm
|
123
|
+
# can assign and validate the attributes when using #from_params.
|
124
|
+
def form_params
|
125
|
+
form_params = params[:component].permit!
|
126
|
+
form_params[:id] = params[:id]
|
127
|
+
form_params[:manifest] = manifest
|
128
|
+
form_params[:participatory_space] = current_participatory_space
|
129
|
+
form_params[:settings] = new_settings_schema(:global, form_params[:settings])
|
130
|
+
if form_params[:default_step_settings]
|
131
|
+
form_params[:default_step_settings] = new_settings_schema(:step, form_params[:default_step_settings])
|
132
|
+
else
|
133
|
+
form_params[:step_settings].each do |key, value|
|
134
|
+
form_params[:step_settings][key] = new_settings_schema(:step, value)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
form_params
|
138
|
+
end
|
139
|
+
|
116
140
|
def query_scope
|
117
141
|
current_participatory_space.components
|
118
142
|
end
|
119
143
|
|
120
144
|
def manifest
|
121
|
-
Decidim.find_component_manifest(params[:type])
|
145
|
+
@component&.manifest || Decidim.find_component_manifest(params[:type])
|
122
146
|
end
|
123
147
|
|
124
148
|
def default_name(manifest)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
module Concerns
|
6
|
+
# PrivateUsers can be related to any ParticipatorySpace, in order to
|
7
|
+
# import private users from csv for a given type, you should create a new
|
8
|
+
# controller and include this concern.
|
9
|
+
#
|
10
|
+
# The only requirement is to define a `privatable_to` method that
|
11
|
+
# returns an instance of the model to relate the private_user to.
|
12
|
+
module HasPrivateUsersCsvImport
|
13
|
+
extend ActiveSupport::Concern
|
14
|
+
|
15
|
+
included do
|
16
|
+
helper_method :privatable_to
|
17
|
+
|
18
|
+
def new
|
19
|
+
enforce_permission_to :csv_import, :space_private_user
|
20
|
+
@form = form(ParticipatorySpacePrivateUserCsvImportForm).from_params({}, privatable_to: privatable_to)
|
21
|
+
render template: "decidim/admin/participatory_space_private_users_csv_imports/new"
|
22
|
+
end
|
23
|
+
|
24
|
+
def create
|
25
|
+
enforce_permission_to :csv_import, :space_private_user
|
26
|
+
@form = form(ParticipatorySpacePrivateUserCsvImportForm).from_params(params, privatable_to: privatable_to)
|
27
|
+
|
28
|
+
ProcessParticipatorySpacePrivateUserImportCsv.call(@form, current_user, current_participatory_space) do
|
29
|
+
on(:ok) do
|
30
|
+
flash[:notice] = I18n.t("participatory_space_private_users_csv_imports.create.success", scope: "decidim.admin")
|
31
|
+
redirect_to after_import_path
|
32
|
+
end
|
33
|
+
|
34
|
+
on(:invalid) do
|
35
|
+
flash[:alert] = I18n.t("participatory_space_private_users_csv_imports.create.invalid", scope: "decidim.admin")
|
36
|
+
render template: "decidim/admin/participatory_space_private_users_csv_imports/new"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Public: Returns a String or Object that will be passed to `redirect_to` after
|
42
|
+
# importing private users. By default it redirects to the privatable_to.
|
43
|
+
#
|
44
|
+
# It can be redefined at controller level if you need to redirect elsewhere.
|
45
|
+
def after_import_path
|
46
|
+
privatable_to
|
47
|
+
end
|
48
|
+
|
49
|
+
# Public: The only method to be implemented at the controller. You need to
|
50
|
+
# return the object where the attachment will be attached to.
|
51
|
+
def privatable_to
|
52
|
+
raise NotImplementedError
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -68,14 +68,31 @@ module Decidim
|
|
68
68
|
|
69
69
|
def user
|
70
70
|
@user ||= if creating_managed_user?
|
71
|
-
new_managed_user
|
71
|
+
existing_managed_user || new_managed_user
|
72
72
|
else
|
73
73
|
current_organization.users.find(params[:impersonatable_user_id])
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
+
def existing_managed_user
|
78
|
+
handler = Decidim::AuthorizationHandler.handler_for(
|
79
|
+
handler_name,
|
80
|
+
params.dig(:impersonate_user, :authorization)
|
81
|
+
)
|
82
|
+
return nil unless handler.unique_id
|
83
|
+
|
84
|
+
existing_authorization = Authorization.find_by(
|
85
|
+
name: handler_name,
|
86
|
+
unique_id: handler.unique_id
|
87
|
+
)
|
88
|
+
return nil unless existing_authorization
|
89
|
+
return nil unless existing_authorization.user.managed?
|
90
|
+
|
91
|
+
existing_authorization.user
|
92
|
+
end
|
93
|
+
|
77
94
|
def new_managed_user
|
78
|
-
Decidim::User.
|
95
|
+
Decidim::User.new(
|
79
96
|
organization: current_organization,
|
80
97
|
managed: true,
|
81
98
|
name: params.dig(:impersonate_user, :name)
|
@@ -75,7 +75,10 @@ module Decidim
|
|
75
75
|
return if params[:resource_name].blank?
|
76
76
|
|
77
77
|
resource_id = params["#{params[:resource_name]}_id"]
|
78
|
-
|
78
|
+
resource_slug = params["#{params[:resource_name]}_slug"]
|
79
|
+
|
80
|
+
find_by = resource_slug.present? ? { slug: resource_slug } : { id: resource_id }
|
81
|
+
@resource ||= Decidim.find_resource_manifest(params[:resource_name])&.model_class&.find_by(find_by)
|
79
82
|
@resource if @resource&.allow_resource_permissions?
|
80
83
|
end
|
81
84
|
|
@@ -75,11 +75,13 @@ module Decidim
|
|
75
75
|
|
76
76
|
def parent_scope
|
77
77
|
return @parent_scope if defined?(@parent_scope)
|
78
|
+
|
78
79
|
@parent_scope = scope ? scope.parent : organization_scopes.find_by(id: params[:scope_id])
|
79
80
|
end
|
80
81
|
|
81
82
|
def scope
|
82
83
|
return @scope if defined?(@scope)
|
84
|
+
|
83
85
|
@scope = organization_scopes.find_by(id: params[:id])
|
84
86
|
end
|
85
87
|
|
@@ -13,15 +13,18 @@ module Decidim
|
|
13
13
|
translatable_attribute :name, String
|
14
14
|
validates :name, translatable_presence: true
|
15
15
|
|
16
|
-
attribute :settings, Object
|
17
|
-
attribute :default_step_settings, Object
|
18
|
-
attribute :manifest
|
19
16
|
attribute :weight, Integer, default: 0
|
20
17
|
|
18
|
+
attribute :manifest, Object
|
19
|
+
attribute :participatory_space, Object
|
20
|
+
validates :manifest, :participatory_space, presence: true
|
21
|
+
|
22
|
+
attribute :settings, Object
|
23
|
+
attribute :default_step_settings, Object
|
21
24
|
attribute :step_settings, Hash[String => Object]
|
22
|
-
attribute :participatory_space
|
23
25
|
|
24
|
-
validate :must_be_able_to_change_participatory_texts_setting
|
26
|
+
validate :must_be_able_to_change_participatory_texts_setting
|
27
|
+
validate :amendments_visibility_options_must_be_valid
|
25
28
|
|
26
29
|
def settings?
|
27
30
|
settings.manifest.attributes.any?
|
@@ -31,23 +34,45 @@ module Decidim
|
|
31
34
|
default_step_settings.manifest.attributes.any?
|
32
35
|
end
|
33
36
|
|
34
|
-
|
35
|
-
|
37
|
+
private
|
38
|
+
|
39
|
+
# Overwrites Rectify::Form#form_attributes_valid? to validate nested `step_settings` attributes.
|
40
|
+
def form_attributes_valid?
|
41
|
+
return false unless errors.empty? && settings_errors_empty? # Preserves errors from custom validation methods
|
42
|
+
|
43
|
+
attributes_that_respond_to(:valid?).concat(
|
44
|
+
step_settings.each_value.select { |attribute| attribute.respond_to?(:valid?) }
|
45
|
+
).all?(&:valid?)
|
36
46
|
end
|
37
47
|
|
38
|
-
def
|
39
|
-
|
48
|
+
def settings_errors_empty?
|
49
|
+
validations = [settings.errors.empty?]
|
50
|
+
validations << if default_step_settings.present?
|
51
|
+
default_step_settings.errors.empty?
|
52
|
+
else
|
53
|
+
step_settings.each_value.map(&:errors).all?(&:empty?)
|
54
|
+
end
|
55
|
+
validations.all?
|
40
56
|
end
|
41
57
|
|
42
|
-
#
|
43
|
-
# setting `participatory_texts_enabled` when there are proposals.
|
44
|
-
# Does not add a custom error message as it would be unused, because
|
45
|
-
# the setting's checkbox is automatically being disabled on the frontend.
|
58
|
+
# Validates setting `participatory_texts_enabled` is not changed when there are proposals for the component.
|
46
59
|
def must_be_able_to_change_participatory_texts_setting
|
47
|
-
|
48
|
-
return
|
60
|
+
return unless manifest&.name == :proposals && (component = Component.find_by(id: id))
|
61
|
+
return unless settings.participatory_texts_enabled != component.settings.participatory_texts_enabled
|
62
|
+
|
63
|
+
settings.errors.add(:participatory_texts_enabled) if Decidim::Proposals::Proposal.where(component: component).any?
|
64
|
+
end
|
65
|
+
|
66
|
+
# Validates setting `amendments_visibility` is included in Decidim::Amendment::VisibilityStepSetting.options.
|
67
|
+
def amendments_visibility_options_must_be_valid
|
68
|
+
return unless manifest&.name == :proposals && settings.amendments_enabled
|
69
|
+
|
70
|
+
visibility_options = Decidim::Amendment::VisibilityStepSetting.options.map(&:last)
|
71
|
+
step_settings.each do |step, settings|
|
72
|
+
next unless visibility_options.exclude? settings[:amendments_visibility]
|
49
73
|
|
50
|
-
|
74
|
+
step_settings[step].errors.add(:amendments_visibility, :inclusion)
|
75
|
+
end
|
51
76
|
end
|
52
77
|
end
|
53
78
|
end
|