decidim-decidim_awesome 0.12.3 → 0.12.4
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 +13 -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 +43 -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 +31 -7
- data/config/locales/cs.yml +32 -7
- data/config/locales/de.yml +31 -7
- data/config/locales/en.yml +36 -12
- data/config/locales/es.yml +32 -7
- data/config/locales/eu.yml +3 -8
- data/config/locales/fr.yml +3 -8
- data/config/locales/ja.yml +70 -7
- data/config/locales/sv.yml +49 -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,43 @@
|
|
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
|
+
set_base_query
|
15
|
+
add_space_specific_conditions
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def set_base_query
|
21
|
+
@query = Decidim::DecidimAwesome::AwesomeConfig
|
22
|
+
.where("var LIKE ?", "#{config_var}_%")
|
23
|
+
.where(organization: participatory_space.organization)
|
24
|
+
.joins(:constraints)
|
25
|
+
.where("decidim_awesome_config_constraints.settings @> ?", { participatory_space_manifest: manifest_key }.to_json)
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_space_specific_conditions
|
29
|
+
@query.where(
|
30
|
+
"(decidim_awesome_config_constraints.settings ->> 'participatory_space_slug' = ? OR " \
|
31
|
+
"decidim_awesome_config_constraints.settings ->> 'participatory_space_slug' IS NULL)",
|
32
|
+
participatory_space.try(:slug) || participatory_space.id.to_s
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def manifest_key
|
37
|
+
return participatory_space.manifest.name if participatory_space.respond_to?(:manifest)
|
38
|
+
|
39
|
+
:process_groups
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
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
@@ -9,10 +9,9 @@ ca:
|
|
9
9
|
allow_images_in_editors: Permet imatges a l'editor HTML
|
10
10
|
allow_images_in_proposals: Permet imatges a l'editor de propostes
|
11
11
|
allow_videos_in_editors: Permet vídeos a l'editor HTML
|
12
|
+
authorization_options_form: Opcions d'autorització
|
12
13
|
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)
|
14
|
+
force_authorizations: Grup d'autorització %{id}
|
16
15
|
hashcash_login: Activa la protecció HashCash antibot per usuaris existents (inici sessió)
|
17
16
|
hashcash_login_bits: Nombre de bits per l'algoritme Hashcash (inici sessió)
|
18
17
|
hashcash_signup: Activa la protecció HashCash antibot per usuaris existents (registre)
|
@@ -42,6 +41,7 @@ ca:
|
|
42
41
|
validate_title_min_length: Nombre de caràcters mínims requerits pel títol de la proposta
|
43
42
|
validate_title_start_with_caps: Força que el text del títol s'inici amb una majúscula
|
44
43
|
constraint:
|
44
|
+
application_context: Només per
|
45
45
|
component_id: o específicament a
|
46
46
|
component_manifest: Només en components de tipus
|
47
47
|
participatory_space_manifest: Aplica-ho a espais participatius de tipus
|
@@ -213,7 +213,10 @@ ca:
|
|
213
213
|
index:
|
214
214
|
admin_head_tags: Etiquetes Awesome incloses a la capçalera de l'aplicació d'administració
|
215
215
|
decidim-admin: Del mòdul Admin
|
216
|
+
decidim-assemblies: Del mòdul Assemblies
|
217
|
+
decidim-conferences: Del mòdul Conferences
|
216
218
|
decidim-core: Del mòdul Core
|
219
|
+
decidim-participatory_processes: Del mòdul de Participatory Processes
|
217
220
|
decidim-proposals: Del mòdul Proposals
|
218
221
|
decidim_version: Versió de Decidim %{version}
|
219
222
|
errors:
|
@@ -228,6 +231,7 @@ ca:
|
|
228
231
|
Pots iniciar el procés ara i es durà a terme en segon pla.
|
229
232
|
start_image_migrations: "\U0001F449 Iniciar el procés de migració ara"
|
230
233
|
config:
|
234
|
+
anonymous: Usuaris no identificats
|
231
235
|
caution: 'NOTA: Aquesta funció modifica en gran mesura alguns comportaments predeterminats que podrien provocar resultats inesperats. Utilitzeu-lo amb precaució!'
|
232
236
|
constraints:
|
233
237
|
add_condition: Afegeix una restricció
|
@@ -236,6 +240,9 @@ ca:
|
|
236
240
|
delete: Esborra
|
237
241
|
edit: Edita
|
238
242
|
title: 'S''aplica només en aquests casos:'
|
243
|
+
create_force_authorization:
|
244
|
+
error: Error en crear un nou grup d'autorització! %{error}
|
245
|
+
success: Grup d'autorització %{key} creat correctament
|
239
246
|
create_proposal_custom_field:
|
240
247
|
error: Error en crear una nova caixa de "camps personalitzats"! %{error}
|
241
248
|
success: 'Caixa de "camps personalitzats" %{key} creada correctament'
|
@@ -245,6 +252,9 @@ ca:
|
|
245
252
|
create_scoped_style:
|
246
253
|
error: Error en crear una nova caixa CSS! %{error}
|
247
254
|
success: Caixa CSS %{key} creada correctament
|
255
|
+
destroy_force_authorization:
|
256
|
+
error: Error en eliminar el grup d'autorització! %{error}
|
257
|
+
success: Grup d'autorització %{key} eliminat correctament
|
248
258
|
destroy_proposal_custom_field:
|
249
259
|
error: Error en eliminar la caixa de "camps personalitzats"! %{error}
|
250
260
|
success: 'Caixa de "camps personalitzats" %{key} eliminada correctament'
|
@@ -254,6 +264,7 @@ ca:
|
|
254
264
|
destroy_scoped_style:
|
255
265
|
error: Error en eliminar una caixa CSS! %{error}
|
256
266
|
success: Caixa CSS %{key} eliminada correctament
|
267
|
+
force_authorizations: Grups d'autoritzacions
|
257
268
|
form:
|
258
269
|
additional_proposal_sortings:
|
259
270
|
enable_all: Activa totes les opcions d'ordenació addicionals
|
@@ -263,13 +274,13 @@ ca:
|
|
263
274
|
errors:
|
264
275
|
incorrect_css: 'El CSS de la caixa #%{key} no és vàlid'
|
265
276
|
incorrect_json: 'La sintaxi JSON de la caixa #%{key} és invàlida'
|
277
|
+
force_authorization_help_text: Text d'ajuda per la pàgina d'autorització
|
266
278
|
help:
|
267
279
|
allow_images_in_editors: Això afegirà una icona per pujar arxius a l'editor HTML
|
268
280
|
allow_images_in_proposals: Això permetrà pujar imatges a l'editor de propostes, disponible per qualsevol usuari
|
269
281
|
allow_videos_in_editors: Això afegirà una icona per enllaçar vídeos a l'editor HTML
|
270
282
|
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
283
|
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
284
|
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
285
|
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
286
|
hashcash_login: |
|
@@ -306,12 +317,20 @@ ca:
|
|
306
317
|
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
318
|
validate_title_min_length: El títol sempre és obligatori i aquest número no pot ser zero
|
308
319
|
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ó.
|
320
|
+
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>
|
321
|
+
Les restriccions s'apliquen a tots els usuaris, però els administradors sempre tindran accés al tauler /admin.
|
312
322
|
validators:
|
313
323
|
body: Validacions d'entrada per l'usuari en el camp cos de la proposta
|
314
324
|
title: Validacions d'entrada per l'usuari en el camp títol de la proposta
|
325
|
+
form_force_authorizations:
|
326
|
+
delete: Esborra
|
327
|
+
force_authorizations_html: |
|
328
|
+
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.
|
329
|
+
help: Podeu definir grups de mètodes d'autorització i restringir l'accés en funció d'aquests.
|
330
|
+
new: Afegeix un nou grup d'autorització
|
331
|
+
remove: Elimina aquest grup d'autorització
|
332
|
+
sure_to_remove: Estàs segura que vols eliminar aquest grup d'autoritzacions?
|
333
|
+
title: 'Restringeix l''accés amb:'
|
315
334
|
form_proposal_custom_fields:
|
316
335
|
delete: Esborra
|
317
336
|
new: Afegeix una nova caixa de "camps personalitzats"
|
@@ -358,6 +377,7 @@ ca:
|
|
358
377
|
update:
|
359
378
|
error: Error actualitzant la configuració! %{error}
|
360
379
|
success: Configuració actualitzada correctament
|
380
|
+
user_logged_in: Usuaris amb la sessió iniciada
|
361
381
|
constraints:
|
362
382
|
create:
|
363
383
|
error: Error creant una nova restricció
|
@@ -539,6 +559,9 @@ ca:
|
|
539
559
|
scoped_styles:
|
540
560
|
menu:
|
541
561
|
title: Interfície pública
|
562
|
+
visibility:
|
563
|
+
info_html: Podeu gestionar restriccions d'accés addicionals mitjançant verificacions amb %{awesome_link}.
|
564
|
+
restricted_html: Aquest espai utilitza restriccions d'accés addicionals amb %{awesome_link}.
|
542
565
|
admin_log:
|
543
566
|
component:
|
544
567
|
destroy_private_data: "%{user_name} ha destruït %{count} elements de dades privades per a %{resource_name} a %{space_name}"
|
@@ -612,6 +635,7 @@ ca:
|
|
612
635
|
proposal_private_custom_fields_disclosure: Aquesta informació no es publicarà
|
613
636
|
required_authorizations:
|
614
637
|
index:
|
638
|
+
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
639
|
cancel: Això ho faré en un altre moment, %{link}.
|
616
640
|
granted_title: Verificacions concedides
|
617
641
|
logout: deixa'm tancar la sessió
|