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.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -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 +45 -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 +32 -7
  55. data/config/locales/cs.yml +33 -7
  56. data/config/locales/de.yml +32 -7
  57. data/config/locales/en.yml +36 -12
  58. data/config/locales/es.yml +33 -7
  59. data/config/locales/eu.yml +99 -34
  60. data/config/locales/fr.yml +70 -7
  61. data/config/locales/hu.yml +1 -0
  62. data/config/locales/it.yml +1 -0
  63. data/config/locales/ja.yml +71 -7
  64. data/config/locales/lt.yml +1 -0
  65. data/config/locales/nl.yml +1 -0
  66. data/config/locales/pt-BR.yml +1 -0
  67. data/config/locales/pt-PT.yml +1 -0
  68. data/config/locales/ro-RO.yml +1 -0
  69. data/config/locales/sv.yml +50 -0
  70. data/lib/decidim/decidim_awesome/admin_engine.rb +1 -0
  71. data/lib/decidim/decidim_awesome/{authorizator.rb → authorizer.rb} +1 -1
  72. data/lib/decidim/decidim_awesome/awesome.rb +5 -17
  73. data/lib/decidim/decidim_awesome/awesome_helpers.rb +14 -5
  74. data/lib/decidim/decidim_awesome/checksums.yml +11 -0
  75. data/lib/decidim/decidim_awesome/config.rb +18 -7
  76. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +1 -1
  77. data/lib/decidim/decidim_awesome/engine.rb +3 -1
  78. data/lib/decidim/decidim_awesome/menu.rb +1 -1
  79. data/lib/decidim/decidim_awesome/middleware/current_config.rb +5 -10
  80. data/lib/decidim/decidim_awesome/test/initializer.rb +1 -1
  81. data/lib/decidim/decidim_awesome/test/shared_examples/proposal_form_examples.rb +191 -0
  82. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +7 -3
  83. data/lib/decidim/decidim_awesome/version.rb +1 -1
  84. data/package.json +4 -4
  85. metadata +20 -5
  86. data/app/controllers/concerns/decidim/decidim_awesome/check_login_authorizations.rb +0 -60
  87. 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,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
@@ -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.*"
@@ -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
- 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)
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í 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ó.
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ó