decidim-decidim_awesome 0.12.3 → 0.12.5
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -1
- data/README.md +1 -1
- data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +39 -5
- data/app/commands/decidim/decidim_awesome/admin/create_authorization_group.rb +42 -0
- data/app/commands/decidim/decidim_awesome/admin/create_custom_redirect.rb +10 -14
- data/app/commands/decidim/decidim_awesome/admin/create_menu_hack.rb +9 -8
- data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +3 -8
- data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +4 -8
- data/app/commands/decidim/decidim_awesome/admin/create_scoped_style.rb +3 -7
- data/app/commands/decidim/decidim_awesome/admin/destroy_authorization_group.rb +37 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_custom_redirect.rb +10 -9
- data/app/commands/decidim/decidim_awesome/admin/destroy_menu_hack.rb +8 -7
- data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +7 -13
- data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +7 -10
- data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +6 -11
- data/app/commands/decidim/decidim_awesome/admin/update_config.rb +12 -1
- data/app/commands/decidim/decidim_awesome/admin/update_custom_redirect.rb +11 -11
- data/app/commands/decidim/decidim_awesome/admin/update_menu_hack.rb +10 -8
- data/app/controllers/concerns/decidim/decidim_awesome/enforce_access_authorizations.rb +49 -0
- data/app/controllers/concerns/decidim/decidim_awesome/needs_hashcash.rb +7 -5
- data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +2 -0
- data/app/controllers/decidim/decidim_awesome/admin/force_authorizations_controller.rb +44 -0
- data/app/controllers/decidim/decidim_awesome/required_authorizations_controller.rb +51 -13
- data/app/forms/concerns/decidim/decidim_awesome/proposals/admin/proposal_form_customizations.rb +59 -0
- data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_customizations.rb +28 -28
- data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_customizations_base.rb +36 -0
- data/app/forms/decidim/decidim_awesome/admin/authorization_group_form.rb +66 -0
- data/app/forms/decidim/decidim_awesome/admin/config_form.rb +12 -26
- data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +2 -0
- data/app/helpers/concerns/decidim/decidim_awesome/amendments_helper_override.rb +2 -1
- data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +20 -17
- data/app/overrides/decidim/assemblies/admin/assemblies/_form/add_visibility_callout.html.erb.deface +3 -0
- data/app/overrides/decidim/conferences/admin/conferences/_form/add_visibility_callout.html.erb.deface +3 -0
- data/app/overrides/decidim/participatory_processes/admin/participatory_process_groups/_form/add_visibility_callout.html.erb.deface +3 -0
- data/app/overrides/decidim/participatory_processes/admin/participatory_processes/_form/add_visibility_callout.html.erb.deface +3 -0
- data/app/overrides/decidim/shared/_login_modal/add_hashcash.html.erb.deface +3 -0
- data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +15 -0
- data/app/packs/src/decidim/decidim_awesome/awesome_admin.js +0 -1
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +6 -1
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/constraints.scss +5 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +1 -2
- data/app/queries/decidim/decidim_awesome/space_constraint_finder.rb +45 -0
- data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_methods.rb +3 -2
- data/app/services/decidim/decidim_awesome/access_authorization_service.rb +79 -0
- data/app/types/concerns/decidim/decidim_awesome/add_proposal_type_custom_fields.rb +2 -1
- data/app/views/decidim/decidim_awesome/admin/config/_authorization_options_form.html.erb +19 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +71 -9
- data/app/views/decidim/decidim_awesome/admin/constraints/_form.html.erb +5 -4
- data/app/views/decidim/decidim_awesome/admin/shared/_visibility_notice.html.erb +8 -0
- data/app/views/decidim/decidim_awesome/hashcash/_hidden_field.html.erb +0 -1
- data/app/views/decidim/decidim_awesome/required_authorizations/index.html.erb +14 -4
- data/config/i18n-tasks.yml +1 -0
- data/config/locales/ca.yml +32 -7
- data/config/locales/cs.yml +33 -7
- data/config/locales/de.yml +32 -7
- data/config/locales/en.yml +36 -12
- data/config/locales/es.yml +33 -7
- data/config/locales/eu.yml +99 -34
- data/config/locales/fr.yml +70 -7
- data/config/locales/hu.yml +1 -0
- data/config/locales/it.yml +1 -0
- data/config/locales/ja.yml +71 -7
- data/config/locales/lt.yml +1 -0
- data/config/locales/nl.yml +1 -0
- data/config/locales/pt-BR.yml +1 -0
- data/config/locales/pt-PT.yml +1 -0
- data/config/locales/ro-RO.yml +1 -0
- data/config/locales/sv.yml +50 -0
- data/lib/decidim/decidim_awesome/admin_engine.rb +1 -0
- data/lib/decidim/decidim_awesome/{authorizator.rb → authorizer.rb} +1 -1
- data/lib/decidim/decidim_awesome/awesome.rb +5 -17
- data/lib/decidim/decidim_awesome/awesome_helpers.rb +14 -5
- data/lib/decidim/decidim_awesome/checksums.yml +11 -0
- data/lib/decidim/decidim_awesome/config.rb +18 -7
- data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +1 -1
- data/lib/decidim/decidim_awesome/engine.rb +3 -1
- data/lib/decidim/decidim_awesome/menu.rb +1 -1
- data/lib/decidim/decidim_awesome/middleware/current_config.rb +5 -10
- data/lib/decidim/decidim_awesome/test/initializer.rb +1 -1
- data/lib/decidim/decidim_awesome/test/shared_examples/proposal_form_examples.rb +191 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +7 -3
- data/lib/decidim/decidim_awesome/version.rb +1 -1
- data/package.json +4 -4
- metadata +20 -5
- data/app/controllers/concerns/decidim/decidim_awesome/check_login_authorizations.rb +0 -60
- data/app/packs/src/decidim/decidim_awesome/admin/verification_selects.js +0 -21
|
@@ -16,6 +16,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
16
16
|
const attribute = target.dataset.var;
|
|
17
17
|
const inputFields = document.querySelectorAll(`[name="config[${attribute}][${key}]"]`);
|
|
18
18
|
const multipleFields = document.querySelectorAll(`[name="config[${attribute}][${key}][]"]`);
|
|
19
|
+
const subFields = document.querySelectorAll(`[name^="config[${attribute}[${key}]]"]`);
|
|
19
20
|
const container = document.querySelector(`.js-box-container[data-key="${key}"]`);
|
|
20
21
|
const deleteBox = container.querySelector(".awesome-auto-delete");
|
|
21
22
|
|
|
@@ -42,6 +43,14 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
42
43
|
multipleField.setAttribute("name", `config[${attribute}][${result.key}][]`);
|
|
43
44
|
});
|
|
44
45
|
}
|
|
46
|
+
if (subFields.length > 0) {
|
|
47
|
+
subFields.forEach((subField) => {
|
|
48
|
+
subField.setAttribute("name", subField.getAttribute("name").replace(
|
|
49
|
+
`config[${attribute}[${key}]]`,
|
|
50
|
+
`config[${attribute}[${result.key}]]`
|
|
51
|
+
));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
45
54
|
container.dataset.key = result.key;
|
|
46
55
|
container.setAttribute("data-key", result.key);
|
|
47
56
|
deleteBox.setAttribute("href", deleteBox.getAttribute("href").replace(`key=${key}`, `key=${result.key}`));
|
|
@@ -60,6 +69,12 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
60
69
|
if (container) {
|
|
61
70
|
// reloads dialogs (modals)
|
|
62
71
|
document.dispatchEvent(new CustomEvent("ajax:loaded", { detail: container }));
|
|
72
|
+
// If editor are created, they will be duplicated by the ajax:loaded event, so we remove them
|
|
73
|
+
document.querySelectorAll(".editor-toolbar").forEach((toolbar) => {
|
|
74
|
+
if (toolbar.nextElementSibling && toolbar.nextElementSibling.classList.contains("editor-toolbar")) {
|
|
75
|
+
toolbar.nextElementSibling.remove();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
63
78
|
}
|
|
64
79
|
// Rebuild the manual handling of remote modals
|
|
65
80
|
document.dispatchEvent(new CustomEvent("ajax:loaded:modals", { detail: [editModal, newModal] }));
|
|
@@ -9,6 +9,5 @@ import "src/decidim/decidim_awesome/admin/form_exit_warn"
|
|
|
9
9
|
|
|
10
10
|
import "src/decidim/decidim_awesome/proposals/custom_fields"
|
|
11
11
|
import "src/decidim/decidim_awesome/admin/custom_fields_builder"
|
|
12
|
-
import "src/decidim/decidim_awesome/admin/verification_selects"
|
|
13
12
|
|
|
14
13
|
window.DecidimAwesome = window.DecidimAwesome || {};
|
|
@@ -5,9 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
.awesome-edit-config {
|
|
7
7
|
.scoped_styles_container,
|
|
8
|
-
.proposal_custom_fields_container
|
|
8
|
+
.proposal_custom_fields_container,
|
|
9
|
+
.force_authorization_container {
|
|
9
10
|
@apply bg-background;
|
|
10
11
|
|
|
12
|
+
.editor-container {
|
|
13
|
+
@apply bg-white;
|
|
14
|
+
}
|
|
15
|
+
|
|
11
16
|
&.private {
|
|
12
17
|
@apply outline-2 outline-[#fca5a5] outline-dotted;
|
|
13
18
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module DecidimAwesome
|
|
5
|
+
class SpaceConstraintFinder
|
|
6
|
+
def initialize(config_var, participatory_space)
|
|
7
|
+
@config_var = config_var
|
|
8
|
+
@participatory_space = participatory_space
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
attr_reader :participatory_space, :config_var
|
|
12
|
+
|
|
13
|
+
def query
|
|
14
|
+
return Decidim::DecidimAwesome::AwesomeConfig.none if participatory_space.nil?
|
|
15
|
+
|
|
16
|
+
set_base_query
|
|
17
|
+
add_space_specific_conditions
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def set_base_query
|
|
23
|
+
@query = Decidim::DecidimAwesome::AwesomeConfig
|
|
24
|
+
.where("var LIKE ?", "#{config_var}_%")
|
|
25
|
+
.where(organization: participatory_space.organization)
|
|
26
|
+
.joins(:constraints)
|
|
27
|
+
.where("decidim_awesome_config_constraints.settings @> ?", { participatory_space_manifest: manifest_key }.to_json)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def add_space_specific_conditions
|
|
31
|
+
@query.where(
|
|
32
|
+
"(decidim_awesome_config_constraints.settings ->> 'participatory_space_slug' = ? OR " \
|
|
33
|
+
"decidim_awesome_config_constraints.settings ->> 'participatory_space_slug' IS NULL)",
|
|
34
|
+
participatory_space.try(:slug) || participatory_space.id.to_s
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def manifest_key
|
|
39
|
+
return participatory_space.manifest.name if participatory_space.respond_to?(:manifest)
|
|
40
|
+
|
|
41
|
+
:process_groups
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_methods.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Decidim
|
|
4
4
|
module DecidimAwesome
|
|
5
5
|
module Proposals
|
|
6
|
-
# Adds one custom field per column in export if custom fields are
|
|
6
|
+
# Adds one custom field per column in export if custom fields are activated
|
|
7
7
|
# Adds vote weights
|
|
8
8
|
module ProposalSerializerMethods
|
|
9
9
|
extend ActiveSupport::Concern
|
|
@@ -17,7 +17,8 @@ module Decidim
|
|
|
17
17
|
return @custom_config if @custom_config
|
|
18
18
|
|
|
19
19
|
@custom_config = Config.new(proposal.organization)
|
|
20
|
-
@custom_config.context_from_component(proposal.component)
|
|
20
|
+
@custom_config.context_from_component!(proposal.component)
|
|
21
|
+
@custom_config.application_context!(current_user: proposal.creator)
|
|
21
22
|
@custom_config
|
|
22
23
|
end
|
|
23
24
|
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module DecidimAwesome
|
|
5
|
+
class AccessAuthorizationService
|
|
6
|
+
def initialize(user, organization, authorization_groups = [])
|
|
7
|
+
@user = user
|
|
8
|
+
@organization = organization
|
|
9
|
+
@available_handlers = organization.available_authorizations & Decidim.authorization_workflows.map(&:name)
|
|
10
|
+
@authorization_groups = authorization_groups.filter_map do |group|
|
|
11
|
+
group.filter_map do |handler, options|
|
|
12
|
+
next unless @available_handlers.include?(handler)
|
|
13
|
+
|
|
14
|
+
[handler, options]
|
|
15
|
+
end.to_h
|
|
16
|
+
end.compact_blank
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
attr_reader :user, :organization, :authorization_groups
|
|
20
|
+
|
|
21
|
+
def granted?
|
|
22
|
+
return false unless user
|
|
23
|
+
return true if authorization_groups.blank?
|
|
24
|
+
|
|
25
|
+
# if one group is authorized that's ok
|
|
26
|
+
# inside a group, all adapters must be authorized
|
|
27
|
+
authorization_groups.detect do |group|
|
|
28
|
+
statuses = authorization_statuses_for(group)
|
|
29
|
+
next if statuses.blank?
|
|
30
|
+
|
|
31
|
+
statuses.all? { |status| status == :ok }
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def authorization_handlers
|
|
36
|
+
@authorization_handlers ||= authorization_groups.flat_map do |group|
|
|
37
|
+
next unless group.is_a?(Hash)
|
|
38
|
+
|
|
39
|
+
group.keys
|
|
40
|
+
end.uniq
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def adapters
|
|
44
|
+
@authorizations ||= adapters_for(authorization_handlers)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def authorization_status(method)
|
|
48
|
+
authorization_statuses_for({ method => authorization_groups.flat_map { |group| group[method] } }).first
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def adapters_for(handlers)
|
|
54
|
+
Decidim::Verifications::Adapter.from_collection(
|
|
55
|
+
handlers & organization.available_authorizations & Decidim.authorization_workflows.map(&:name)
|
|
56
|
+
)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def authorization_statuses_for(group)
|
|
60
|
+
@authorization_statuses_for ||= {}
|
|
61
|
+
|
|
62
|
+
adapters_for(group.keys).map do |adapter|
|
|
63
|
+
next @authorization_statuses_for[adapter.name] if @authorization_statuses_for.has_key?(adapter.name)
|
|
64
|
+
|
|
65
|
+
@authorization_statuses_for[adapter.name] = begin
|
|
66
|
+
authorization = Decidim::Verifications::Authorizations.new(
|
|
67
|
+
organization:,
|
|
68
|
+
user:,
|
|
69
|
+
name: adapter.name,
|
|
70
|
+
granted: true
|
|
71
|
+
).first
|
|
72
|
+
|
|
73
|
+
adapter.authorize(authorization, group[adapter.name]["options"], nil, nil)&.first
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -24,7 +24,8 @@ module Decidim
|
|
|
24
24
|
return @custom_config if @custom_config
|
|
25
25
|
|
|
26
26
|
@custom_config = Config.new(object.organization)
|
|
27
|
-
@custom_config.context_from_component(object.component)
|
|
27
|
+
@custom_config.context_from_component!(object.component)
|
|
28
|
+
@custom_config.application_context!(current_user: object.creator) if object.respond_to?(:creator)
|
|
28
29
|
@custom_config
|
|
29
30
|
end
|
|
30
31
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<%
|
|
2
|
+
handler_name = local_assigns[:handler_name]
|
|
3
|
+
schema = form.object.options_schema(handler_name)
|
|
4
|
+
attributes = form.object.options_attributes(handler_name)
|
|
5
|
+
%>
|
|
6
|
+
|
|
7
|
+
<%= form.fields_for(:authorization_handlers_options) do |options_form| %>
|
|
8
|
+
<%= options_form.fields_for(handler_name, schema) do |attribute_options_form| %>
|
|
9
|
+
<% attributes.each do |name, attribute| %>
|
|
10
|
+
<%= settings_attribute_input(
|
|
11
|
+
attribute_options_form,
|
|
12
|
+
attribute,
|
|
13
|
+
name,
|
|
14
|
+
"decidim.authorization_handlers.#{handler_name}.fields",
|
|
15
|
+
tabs_prefix: "#{name}_tabs_prefix"
|
|
16
|
+
) %>
|
|
17
|
+
<% end %>
|
|
18
|
+
<% end %>
|
|
19
|
+
<% end %>
|
|
@@ -1,15 +1,77 @@
|
|
|
1
|
+
<%
|
|
2
|
+
config_var = "force_authorizations"
|
|
3
|
+
field = "force_authorization"
|
|
4
|
+
%>
|
|
5
|
+
|
|
1
6
|
<div class="form__wrapper row column decidim_awesome-form">
|
|
2
|
-
|
|
7
|
+
<% if config_enabled?(config_var) %>
|
|
8
|
+
<div class="callout warning">
|
|
9
|
+
<%= t("help.verifications_html", scope: "decidim.decidim_awesome.admin.config.form") %>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<% form.object.force_authorizations&.each do |key, group| %>
|
|
13
|
+
<% group ||= Decidim::DecidimAwesome::Admin::AuthorizationGroupForm.new %>
|
|
3
14
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
15
|
+
<%= form.fields_for "#{config_var}[#{key}]", group do |group_form| %>
|
|
16
|
+
<div class="card p-4 js-box-container force_authorization_container" data-key="<%= key %>" data-var="<%= config_var %>">
|
|
17
|
+
<%= render "decidim/decidim_awesome/admin/config/autoedit_box_label", var: config_var, key:, scope: "#{field}_#{key}", delete_path: decidim_admin_decidim_awesome.force_authorization_path(key:) %>
|
|
18
|
+
<div class="card-section mt-2">
|
|
19
|
+
<div class="row column pt-4 pb-4">
|
|
20
|
+
<h5><%= t("title", scope: "decidim.decidim_awesome.admin.config.form_force_authorizations") %></h5>
|
|
21
|
+
<div class="mt-4 form__wrapper gap-1">
|
|
22
|
+
<%= group_form.collection_check_boxes :authorization_handlers_names, available_authorizations, :name, :description do |builder| %>
|
|
23
|
+
<div>
|
|
24
|
+
<%= builder.label do %>
|
|
25
|
+
<%= safe_join([builder.check_box(data: { group_key: key }), builder.text.to_s], " ") %>
|
|
26
|
+
<% end %>
|
|
27
|
+
<div id="authorization-handler-<%= key %>-<%= builder.value %>" class="authorization-handler my-4 ml-6" style="display: <%= group_form.object.authorization_handlers_names.include?(builder.value) ? "block" : "none" %>;">
|
|
28
|
+
<%= render "decidim/decidim_awesome/admin/config/authorization_options_form", form: group_form, handler_name: builder.value, key: %>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<% end %>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
8
35
|
|
|
9
|
-
|
|
36
|
+
<div class="mt-4">
|
|
37
|
+
<%= group_form.translated :editor, :force_authorization_help_text, lines: 10, label: t("force_authorization_help_text", scope: "decidim.decidim_awesome.admin.config.form") %>
|
|
38
|
+
<p class="help-text">
|
|
39
|
+
<%= t("help.force_authorization_help_text", scope: "decidim.decidim_awesome.admin.config.form") %>
|
|
40
|
+
</p>
|
|
41
|
+
</div>
|
|
10
42
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
43
|
+
<div class="mt-4">
|
|
44
|
+
<%= render "decidim/decidim_awesome/admin/config/constraints", key: "#{field}_#{key}", constraints: constraints_for("#{field}_#{key}") || [] %>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
<% end %>
|
|
48
|
+
<% end %>
|
|
49
|
+
|
|
50
|
+
<%= link_to decidim_admin_decidim_awesome.force_authorizations_path, method: :post, class: "button button__sm button__text-secondary mr-auto" do %>
|
|
51
|
+
<%= icon("add-box-line") %>
|
|
52
|
+
<%= t("new", scope: "decidim.decidim_awesome.admin.config.form_force_authorizations") %>
|
|
53
|
+
<% end %>
|
|
14
54
|
<% end %>
|
|
15
55
|
</div>
|
|
56
|
+
|
|
57
|
+
<script>
|
|
58
|
+
document.addEventListener("DOMContentLoaded", function() {
|
|
59
|
+
const checkboxes = document.querySelectorAll(
|
|
60
|
+
"input[type='checkbox'][name*='[authorization_handlers_names]']"
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
checkboxes.forEach((checkbox) => {
|
|
64
|
+
checkbox.addEventListener("change", function() {
|
|
65
|
+
const groupKey = this.dataset.groupKey;
|
|
66
|
+
const handlerId = `authorization-handler-${groupKey}-${this.value}`;
|
|
67
|
+
const handlerElement = document.getElementById(handlerId);
|
|
68
|
+
|
|
69
|
+
if (!handlerElement) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
handlerElement.style.display = this.checked ? "block" : "none";
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
</script>
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<div class="form__wrapper" id="constraint-form-<%= params[:id] %>">
|
|
2
2
|
|
|
3
|
-
<%= form.select :participatory_space_manifest, participatory_space_manifests.invert, include_blank:
|
|
4
|
-
<%= form.select :participatory_space_slug, participatory_spaces_list(@form.participatory_space_manifest).invert, include_blank:
|
|
5
|
-
<%= form.select :component_manifest, component_manifests(@form.participatory_space_manifest).invert, include_blank:
|
|
6
|
-
<%= form.select :component_id, components_list(@form.participatory_space_manifest, @form.participatory_space_slug).invert, include_blank:
|
|
3
|
+
<%= form.select :participatory_space_manifest, participatory_space_manifests.invert, include_blank: "---" %>
|
|
4
|
+
<%= form.select :participatory_space_slug, participatory_spaces_list(@form.participatory_space_manifest).invert, include_blank: "---" %>
|
|
5
|
+
<%= form.select :component_manifest, component_manifests(@form.participatory_space_manifest).invert, include_blank: "---" %>
|
|
6
|
+
<%= form.select :component_id, components_list(@form.participatory_space_manifest, @form.participatory_space_slug).invert, include_blank: "---" %>
|
|
7
|
+
<%= form.select :application_context, contexts_list.invert, include_blank: "---" %>
|
|
7
8
|
|
|
8
9
|
</div>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<% awesome_link = link_to("Decidim Awesome", decidim_admin_decidim_awesome.config_path(:verifications), target: "_blank", data: { external_domain_link: false }) %>
|
|
2
|
+
<% has_constraint = Decidim::DecidimAwesome::SpaceConstraintFinder.new("force_authorization", participatory_space).query.exists? %>
|
|
3
|
+
|
|
4
|
+
<div class="row column">
|
|
5
|
+
<div class="callout <%= has_constraint ? "alert" : "info" %> mt-2">
|
|
6
|
+
<%= t("decidim.decidim_awesome.admin.visibility.#{has_constraint ? "restricted_html" : "info_html"}", awesome_link:) %>
|
|
7
|
+
</div>
|
|
8
|
+
</div>
|
|
@@ -18,6 +18,11 @@
|
|
|
18
18
|
<h2 class="h5 text-secondary">
|
|
19
19
|
<%= method.fullname %>
|
|
20
20
|
</h2>
|
|
21
|
+
<% if service.authorization_status(method) != :ok %>
|
|
22
|
+
<p class="text-alert">
|
|
23
|
+
<%= t(".authorization_options_invalid") %>
|
|
24
|
+
</p>
|
|
25
|
+
<% end %>
|
|
21
26
|
</div>
|
|
22
27
|
</div>
|
|
23
28
|
<% end %>
|
|
@@ -58,9 +63,14 @@
|
|
|
58
63
|
</div>
|
|
59
64
|
|
|
60
65
|
<div class="space-y-8 prose-a:text-secondary mt-8">
|
|
61
|
-
|
|
66
|
+
<% help = authorization_help_text %>
|
|
67
|
+
<% if help.present? %>
|
|
68
|
+
<%= translated_attribute(help).html_safe %>
|
|
69
|
+
<% end %>
|
|
62
70
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
71
|
+
<% if current_user %>
|
|
72
|
+
<p class="prose-a:text-secondary italic">
|
|
73
|
+
<%= t(".cancel", link: link_to("#{icon("logout-box-r-line", class: "inline-block").html_safe} #{t(".logout")}".html_safe, decidim.destroy_user_session_path(redirect_url:), method: :delete).html_safe).html_safe %>
|
|
74
|
+
</p>
|
|
75
|
+
<% end %>
|
|
66
76
|
</div>
|
data/config/i18n-tasks.yml
CHANGED
|
@@ -20,6 +20,7 @@ ignore_unused:
|
|
|
20
20
|
- "activemodel.attributes.custom_redirect.*"
|
|
21
21
|
- "activemodel.attributes.user.*"
|
|
22
22
|
- activemodel.attributes.organization.awesome_admins_available_authorizations
|
|
23
|
+
- activemodel.attributes.force_authorization.*
|
|
23
24
|
- "decidim.components.decidim_awesome.name"
|
|
24
25
|
- "decidim.components.awesome_iframe.settings.*"
|
|
25
26
|
- "decidim.components.awesome_map.settings.*"
|
data/config/locales/ca.yml
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
---
|
|
1
2
|
ca:
|
|
2
3
|
active_hashcash:
|
|
3
4
|
submit_filter: Filtra
|
|
@@ -9,10 +10,9 @@ ca:
|
|
|
9
10
|
allow_images_in_editors: Permet imatges a l'editor HTML
|
|
10
11
|
allow_images_in_proposals: Permet imatges a l'editor de propostes
|
|
11
12
|
allow_videos_in_editors: Permet vídeos a l'editor HTML
|
|
13
|
+
authorization_options_form: Opcions d'autorització
|
|
12
14
|
auto_save_forms: Desa automàticament els formularis a l'emmagatzematge local
|
|
13
|
-
|
|
14
|
-
force_authorization_help_text: Text d'ajuda per la pàgina d'autorització
|
|
15
|
-
force_authorization_with_any_method: Permetre l'accés si es concedeix alguna de les autoritzacions (per defecte, totes són necessàries)
|
|
15
|
+
force_authorizations: Grup d'autorització %{id}
|
|
16
16
|
hashcash_login: Activa la protecció HashCash antibot per usuaris existents (inici sessió)
|
|
17
17
|
hashcash_login_bits: Nombre de bits per l'algoritme Hashcash (inici sessió)
|
|
18
18
|
hashcash_signup: Activa la protecció HashCash antibot per usuaris existents (registre)
|
|
@@ -42,6 +42,7 @@ ca:
|
|
|
42
42
|
validate_title_min_length: Nombre de caràcters mínims requerits pel títol de la proposta
|
|
43
43
|
validate_title_start_with_caps: Força que el text del títol s'inici amb una majúscula
|
|
44
44
|
constraint:
|
|
45
|
+
application_context: Només per
|
|
45
46
|
component_id: o específicament a
|
|
46
47
|
component_manifest: Només en components de tipus
|
|
47
48
|
participatory_space_manifest: Aplica-ho a espais participatius de tipus
|
|
@@ -213,7 +214,10 @@ ca:
|
|
|
213
214
|
index:
|
|
214
215
|
admin_head_tags: Etiquetes Awesome incloses a la capçalera de l'aplicació d'administració
|
|
215
216
|
decidim-admin: Del mòdul Admin
|
|
217
|
+
decidim-assemblies: Del mòdul Assemblies
|
|
218
|
+
decidim-conferences: Del mòdul Conferences
|
|
216
219
|
decidim-core: Del mòdul Core
|
|
220
|
+
decidim-participatory_processes: Del mòdul de Participatory Processes
|
|
217
221
|
decidim-proposals: Del mòdul Proposals
|
|
218
222
|
decidim_version: Versió de Decidim %{version}
|
|
219
223
|
errors:
|
|
@@ -228,6 +232,7 @@ ca:
|
|
|
228
232
|
Pots iniciar el procés ara i es durà a terme en segon pla.
|
|
229
233
|
start_image_migrations: "\U0001F449 Iniciar el procés de migració ara"
|
|
230
234
|
config:
|
|
235
|
+
anonymous: Usuaris no identificats
|
|
231
236
|
caution: 'NOTA: Aquesta funció modifica en gran mesura alguns comportaments predeterminats que podrien provocar resultats inesperats. Utilitzeu-lo amb precaució!'
|
|
232
237
|
constraints:
|
|
233
238
|
add_condition: Afegeix una restricció
|
|
@@ -236,6 +241,9 @@ ca:
|
|
|
236
241
|
delete: Esborra
|
|
237
242
|
edit: Edita
|
|
238
243
|
title: 'S''aplica només en aquests casos:'
|
|
244
|
+
create_force_authorization:
|
|
245
|
+
error: Error en crear un nou grup d'autorització! %{error}
|
|
246
|
+
success: Grup d'autorització %{key} creat correctament
|
|
239
247
|
create_proposal_custom_field:
|
|
240
248
|
error: Error en crear una nova caixa de "camps personalitzats"! %{error}
|
|
241
249
|
success: 'Caixa de "camps personalitzats" %{key} creada correctament'
|
|
@@ -245,6 +253,9 @@ ca:
|
|
|
245
253
|
create_scoped_style:
|
|
246
254
|
error: Error en crear una nova caixa CSS! %{error}
|
|
247
255
|
success: Caixa CSS %{key} creada correctament
|
|
256
|
+
destroy_force_authorization:
|
|
257
|
+
error: Error en eliminar el grup d'autorització! %{error}
|
|
258
|
+
success: Grup d'autorització %{key} eliminat correctament
|
|
248
259
|
destroy_proposal_custom_field:
|
|
249
260
|
error: Error en eliminar la caixa de "camps personalitzats"! %{error}
|
|
250
261
|
success: 'Caixa de "camps personalitzats" %{key} eliminada correctament'
|
|
@@ -254,6 +265,7 @@ ca:
|
|
|
254
265
|
destroy_scoped_style:
|
|
255
266
|
error: Error en eliminar una caixa CSS! %{error}
|
|
256
267
|
success: Caixa CSS %{key} eliminada correctament
|
|
268
|
+
force_authorizations: Grups d'autoritzacions
|
|
257
269
|
form:
|
|
258
270
|
additional_proposal_sortings:
|
|
259
271
|
enable_all: Activa totes les opcions d'ordenació addicionals
|
|
@@ -263,13 +275,13 @@ ca:
|
|
|
263
275
|
errors:
|
|
264
276
|
incorrect_css: 'El CSS de la caixa #%{key} no és vàlid'
|
|
265
277
|
incorrect_json: 'La sintaxi JSON de la caixa #%{key} és invàlida'
|
|
278
|
+
force_authorization_help_text: Text d'ajuda per la pàgina d'autorització
|
|
266
279
|
help:
|
|
267
280
|
allow_images_in_editors: Això afegirà una icona per pujar arxius a l'editor HTML
|
|
268
281
|
allow_images_in_proposals: Això permetrà pujar imatges a l'editor de propostes, disponible per qualsevol usuari
|
|
269
282
|
allow_videos_in_editors: Això afegirà una icona per enllaçar vídeos a l'editor HTML
|
|
270
283
|
auto_save_forms: Això farà servir l'emmagatzematge local del navegador per desar automàticament les dades introduïdes pels usuaris a les enquestes i altres formularis mentre les omplen. Les dades es restauraran en una futura visita amb el mateix navegador en cas que no s'enviï el formulari. Si s’envia el formulari, s’eliminaran les dades locals. Si els usuaris eliminen les seves dades del navegador, tampoc es restauraran.
|
|
271
284
|
drag_and_drop_supported: Quan es pugin imatges, es pot fer a través del mètode de "arrossegar i deixar anar". Les imatges seran pujades al servidor i inserides com recursos externs (no es fa servir codificació en línia base64).
|
|
272
|
-
force_authorization_after_login: 'Si està habilitat, les usuàries seran redireccionades a la pàgina d''autorització després de l''inici de sessió o registre si algunes de les autoritzacions especificades no són concedides. Això és útil si voleu forçar les usuàries a que es verifiquin a través d''una autorització específica abans que puguin iniciar sessió en qualsevol moment (per exemple: per prevenir spam).'
|
|
273
285
|
force_authorization_help_text: Afegeix un text personalitzat per explicar per què cal l'autorització. Assegureu-vos també d'afegir un mode de contacte en cas que les usuàries necessitin ajuda.
|
|
274
286
|
hashcash_i18n_key: 'Podeu personalitzar el text del botó que es mostra als usuaris a les pàgines d''iniciar sessió/registre amb la clau i18n %{key}'
|
|
275
287
|
hashcash_login: |
|
|
@@ -306,12 +318,20 @@ ca:
|
|
|
306
318
|
validate_title_max_marks_together: 'Limiteu el nombre de signes d''interrogació i d''exclamació que es poden escriure junts. És a dir: si és 2, aleshores ''!!!'' no es permetrà al text'
|
|
307
319
|
validate_title_min_length: El títol sempre és obligatori i aquest número no pot ser zero
|
|
308
320
|
verifications_html: |
|
|
309
|
-
Aquí
|
|
310
|
-
|
|
311
|
-
Tingues en compte també, que aquests paràmetres s'apliquen a totes les usuàries. Les administradores sempre tindran accés al tauler dadministració.
|
|
321
|
+
Aquí podeu establir restriccions d'accés addicionals a espais o components participatius que obligaran els usuaris a ser verificats abans d'accedir a determinades ubicacions (per exemple: per evitar correu brossa).<br>
|
|
322
|
+
Les restriccions s'apliquen a tots els usuaris, però els administradors sempre tindran accés al tauler /admin.
|
|
312
323
|
validators:
|
|
313
324
|
body: Validacions d'entrada per l'usuari en el camp cos de la proposta
|
|
314
325
|
title: Validacions d'entrada per l'usuari en el camp títol de la proposta
|
|
326
|
+
form_force_authorizations:
|
|
327
|
+
delete: Esborra
|
|
328
|
+
force_authorizations_html: |
|
|
329
|
+
Definiu grups de verificació. Cada grup pot requerir que els usuaris siguin verificats per un o més mètodes per accedir a àrees específiques de la plataforma.
|
|
330
|
+
help: Podeu definir grups de mètodes d'autorització i restringir l'accés en funció d'aquests.
|
|
331
|
+
new: Afegeix un nou grup d'autorització
|
|
332
|
+
remove: Elimina aquest grup d'autorització
|
|
333
|
+
sure_to_remove: Estàs segura que vols eliminar aquest grup d'autoritzacions?
|
|
334
|
+
title: 'Restringeix l''accés amb:'
|
|
315
335
|
form_proposal_custom_fields:
|
|
316
336
|
delete: Esborra
|
|
317
337
|
new: Afegeix una nova caixa de "camps personalitzats"
|
|
@@ -358,6 +378,7 @@ ca:
|
|
|
358
378
|
update:
|
|
359
379
|
error: Error actualitzant la configuració! %{error}
|
|
360
380
|
success: Configuració actualitzada correctament
|
|
381
|
+
user_logged_in: Usuaris amb la sessió iniciada
|
|
361
382
|
constraints:
|
|
362
383
|
create:
|
|
363
384
|
error: Error creant una nova restricció
|
|
@@ -539,6 +560,9 @@ ca:
|
|
|
539
560
|
scoped_styles:
|
|
540
561
|
menu:
|
|
541
562
|
title: Interfície pública
|
|
563
|
+
visibility:
|
|
564
|
+
info_html: Podeu gestionar restriccions d'accés addicionals mitjançant verificacions amb %{awesome_link}.
|
|
565
|
+
restricted_html: Aquest espai utilitza restriccions d'accés addicionals amb %{awesome_link}.
|
|
542
566
|
admin_log:
|
|
543
567
|
component:
|
|
544
568
|
destroy_private_data: "%{user_name} ha destruït %{count} elements de dades privades per a %{resource_name} a %{space_name}"
|
|
@@ -612,6 +636,7 @@ ca:
|
|
|
612
636
|
proposal_private_custom_fields_disclosure: Aquesta informació no es publicarà
|
|
613
637
|
required_authorizations:
|
|
614
638
|
index:
|
|
639
|
+
authorization_options_invalid: Malauradament, tot i que teniu aquesta autorització, les dades utilitzades per verificar-vos no són vàlides en aquest context.
|
|
615
640
|
cancel: Això ho faré en un altre moment, %{link}.
|
|
616
641
|
granted_title: Verificacions concedides
|
|
617
642
|
logout: deixa'm tancar la sessió
|