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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -1
  3. data/README.md +1 -1
  4. data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +39 -5
  5. data/app/commands/decidim/decidim_awesome/admin/create_authorization_group.rb +42 -0
  6. data/app/commands/decidim/decidim_awesome/admin/create_custom_redirect.rb +10 -14
  7. data/app/commands/decidim/decidim_awesome/admin/create_menu_hack.rb +9 -8
  8. data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +3 -8
  9. data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +4 -8
  10. data/app/commands/decidim/decidim_awesome/admin/create_scoped_style.rb +3 -7
  11. data/app/commands/decidim/decidim_awesome/admin/destroy_authorization_group.rb +37 -0
  12. data/app/commands/decidim/decidim_awesome/admin/destroy_custom_redirect.rb +10 -9
  13. data/app/commands/decidim/decidim_awesome/admin/destroy_menu_hack.rb +8 -7
  14. data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +7 -13
  15. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +7 -10
  16. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +6 -11
  17. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +12 -1
  18. data/app/commands/decidim/decidim_awesome/admin/update_custom_redirect.rb +11 -11
  19. data/app/commands/decidim/decidim_awesome/admin/update_menu_hack.rb +10 -8
  20. data/app/controllers/concerns/decidim/decidim_awesome/enforce_access_authorizations.rb +49 -0
  21. data/app/controllers/concerns/decidim/decidim_awesome/needs_hashcash.rb +7 -5
  22. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +2 -0
  23. data/app/controllers/decidim/decidim_awesome/admin/force_authorizations_controller.rb +44 -0
  24. data/app/controllers/decidim/decidim_awesome/required_authorizations_controller.rb +51 -13
  25. data/app/forms/concerns/decidim/decidim_awesome/proposals/admin/proposal_form_customizations.rb +59 -0
  26. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_customizations.rb +28 -28
  27. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_customizations_base.rb +36 -0
  28. data/app/forms/decidim/decidim_awesome/admin/authorization_group_form.rb +66 -0
  29. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +12 -26
  30. data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +2 -0
  31. data/app/helpers/concerns/decidim/decidim_awesome/amendments_helper_override.rb +2 -1
  32. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +20 -17
  33. data/app/overrides/decidim/assemblies/admin/assemblies/_form/add_visibility_callout.html.erb.deface +3 -0
  34. data/app/overrides/decidim/conferences/admin/conferences/_form/add_visibility_callout.html.erb.deface +3 -0
  35. data/app/overrides/decidim/participatory_processes/admin/participatory_process_groups/_form/add_visibility_callout.html.erb.deface +3 -0
  36. data/app/overrides/decidim/participatory_processes/admin/participatory_processes/_form/add_visibility_callout.html.erb.deface +3 -0
  37. data/app/overrides/decidim/shared/_login_modal/add_hashcash.html.erb.deface +3 -0
  38. data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +15 -0
  39. data/app/packs/src/decidim/decidim_awesome/awesome_admin.js +0 -1
  40. data/app/packs/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +6 -1
  41. data/app/packs/stylesheets/decidim/decidim_awesome/admin/constraints.scss +5 -0
  42. data/app/packs/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +1 -2
  43. data/app/queries/decidim/decidim_awesome/space_constraint_finder.rb +43 -0
  44. data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_methods.rb +3 -2
  45. data/app/services/decidim/decidim_awesome/access_authorization_service.rb +79 -0
  46. data/app/types/concerns/decidim/decidim_awesome/add_proposal_type_custom_fields.rb +2 -1
  47. data/app/views/decidim/decidim_awesome/admin/config/_authorization_options_form.html.erb +19 -0
  48. data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +71 -9
  49. data/app/views/decidim/decidim_awesome/admin/constraints/_form.html.erb +5 -4
  50. data/app/views/decidim/decidim_awesome/admin/shared/_visibility_notice.html.erb +8 -0
  51. data/app/views/decidim/decidim_awesome/hashcash/_hidden_field.html.erb +0 -1
  52. data/app/views/decidim/decidim_awesome/required_authorizations/index.html.erb +14 -4
  53. data/config/i18n-tasks.yml +1 -0
  54. data/config/locales/ca.yml +31 -7
  55. data/config/locales/cs.yml +32 -7
  56. data/config/locales/de.yml +31 -7
  57. data/config/locales/en.yml +36 -12
  58. data/config/locales/es.yml +32 -7
  59. data/config/locales/eu.yml +3 -8
  60. data/config/locales/fr.yml +3 -8
  61. data/config/locales/ja.yml +70 -7
  62. data/config/locales/sv.yml +49 -0
  63. data/lib/decidim/decidim_awesome/admin_engine.rb +1 -0
  64. data/lib/decidim/decidim_awesome/{authorizator.rb → authorizer.rb} +1 -1
  65. data/lib/decidim/decidim_awesome/awesome.rb +5 -17
  66. data/lib/decidim/decidim_awesome/awesome_helpers.rb +14 -5
  67. data/lib/decidim/decidim_awesome/checksums.yml +11 -0
  68. data/lib/decidim/decidim_awesome/config.rb +18 -7
  69. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +1 -1
  70. data/lib/decidim/decidim_awesome/engine.rb +3 -1
  71. data/lib/decidim/decidim_awesome/menu.rb +1 -1
  72. data/lib/decidim/decidim_awesome/middleware/current_config.rb +5 -10
  73. data/lib/decidim/decidim_awesome/test/initializer.rb +1 -1
  74. data/lib/decidim/decidim_awesome/test/shared_examples/proposal_form_examples.rb +191 -0
  75. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +7 -3
  76. data/lib/decidim/decidim_awesome/version.rb +1 -1
  77. data/package.json +4 -4
  78. metadata +20 -5
  79. data/app/controllers/concerns/decidim/decidim_awesome/check_login_authorizations.rb +0 -60
  80. data/app/packs/src/decidim/decidim_awesome/admin/verification_selects.js +0 -21
@@ -0,0 +1,3 @@
1
+ <!-- insert_bottom "div#panel-title" -->
2
+
3
+ <%= render "decidim/decidim_awesome/admin/shared/visibility_notice", participatory_space: current_conference %>
@@ -0,0 +1,3 @@
1
+ <!-- insert_bottom "div#panel-visibility" -->
2
+
3
+ <%= render "decidim/decidim_awesome/admin/shared/visibility_notice", participatory_space: participatory_process_group %>
@@ -0,0 +1,3 @@
1
+ <!-- insert_bottom "div#panel-visibility" -->
2
+
3
+ <%= render "decidim/decidim_awesome/admin/shared/visibility_notice", participatory_space: current_participatory_process %>
@@ -0,0 +1,3 @@
1
+ <!-- insert_top ".login__modal-links" -->
2
+
3
+ <%= render partial: "decidim/decidim_awesome/hashcash/hidden_field", locals: { zone: :login } %>
@@ -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
  }
@@ -33,6 +33,11 @@
33
33
  color: #fff;
34
34
  }
35
35
 
36
+ &.application_context {
37
+ background-color: #007bff;
38
+ color: #fff;
39
+ }
40
+
36
41
  &.constraint {
37
42
  &-none {
38
43
  background-color: #ff3000;
@@ -15,8 +15,7 @@
15
15
  @apply bg-background mr-2;
16
16
  }
17
17
 
18
- border-top-left-radius: 5px;
19
- border-top-right-radius: 5px;
18
+ @apply rounded-tl-[5px] rounded-tr-[5px];
20
19
 
21
20
  svg {
22
21
  @apply fill-black;
@@ -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
@@ -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 activted
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
- <div class="callout warning"><%= t("help.verifications_html", scope: "decidim.decidim_awesome.admin.config.form") %></div>
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
- <% if config_enabled? :force_authorization_after_login %>
5
- <div>
6
- <%= form.select :force_authorization_after_login, available_authorizations.map { |workflow| [workflow.fullname, workflow.name] }, { include_blank: false }, { multiple: true } %>
7
- <p class="help-text"><%= t("help.force_authorization_after_login", scope: "decidim.decidim_awesome.admin.config.form") %></p>
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
- <%= form.check_box :force_authorization_with_any_method %>
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
- <%= form.translated :editor, :force_authorization_help_text, lines: 10, aria: { label: :force_authorization_help_text } %>
12
- <p class="help-text"><%= t("help.force_authorization_help_text", scope: "decidim.decidim_awesome.admin.config.form") %></p>
13
- </div>
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: true %>
4
- <%= form.select :participatory_space_slug, participatory_spaces_list(@form.participatory_space_manifest).invert, include_blank: true %>
5
- <%= form.select :component_manifest, component_manifests(@form.participatory_space_manifest).invert, include_blank: true %>
6
- <%= form.select :component_id, components_list(@form.participatory_space_manifest, @form.participatory_space_slug).invert, include_blank: true %>
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>
@@ -1,4 +1,3 @@
1
-
2
1
  <% if defined?(awesome_hashcash_bits) && awesome_hashcash_bits(zone) %>
3
2
  <% append_javascript_pack_tag("decidim_decidim_awesome_hashcash") %>
4
3
  <%= hashcash_hidden_field_tag %>
@@ -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
- <%= translated_attribute(awesome_config[:force_authorization_help_text]).html_safe %>
66
+ <% help = authorization_help_text %>
67
+ <% if help.present? %>
68
+ <%= translated_attribute(help).html_safe %>
69
+ <% end %>
62
70
 
63
- <p class="prose-a:text-secondary italic">
64
- <%= 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 %>
65
- </p>
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>
@@ -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.*"
@@ -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
- force_authorization_after_login: Forçar autorització després d'iniciat sessió/registre
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í pots fer alguns ajustaments en el procés de verificació.<br>
310
- <b>NOTA:</b> Tingues en compte que canviar aquests paràmetres pot impedir que algunes usuàries accedeixin a la plataforma. Fes-ho servir amb precaució!<br><br>
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ó