decidim-decidim_awesome 0.12.0 → 0.12.3

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 (132) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/README.md +24 -14
  4. data/Rakefile +12 -0
  5. data/app/cells/concerns/decidim/decidim_awesome/global_menu_cell_override.rb +14 -2
  6. data/app/cells/concerns/decidim/decidim_awesome/proposal_l_cell_override.rb +5 -4
  7. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/show.erb +3 -3
  8. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/vote_block_for.erb +1 -1
  9. data/app/controllers/concerns/decidim/decidim_awesome/admin/maintenance_context.rb +0 -28
  10. data/app/controllers/concerns/decidim/decidim_awesome/needs_hashcash.rb +41 -0
  11. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +2 -2
  12. data/app/controllers/decidim/decidim_awesome/admin/admin_authorizations_controller.rb +2 -2
  13. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +0 -4
  14. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +2 -1
  15. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +1 -2
  16. data/app/controllers/decidim/decidim_awesome/admin/hashcash_controller.rb +39 -0
  17. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +1 -1
  18. data/app/controllers/decidim/decidim_awesome/admin/{maintenance_controller.rb → private_data_controller.rb} +9 -9
  19. data/app/controllers/decidim/decidim_awesome/utils_controller.rb +17 -0
  20. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_override.rb +7 -1
  21. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +13 -0
  22. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +1 -1
  23. data/app/helpers/decidim/decidim_awesome/map_helper.rb +4 -2
  24. data/app/models/decidim/decidim_awesome/paper_trail_version.rb +1 -1
  25. data/app/overrides/decidim/devise/registrations/new/add_hashcash.html.erb.deface +3 -0
  26. data/app/overrides/decidim/devise/sessions/new/add_hashcash.html.erb.deface +3 -0
  27. data/app/overrides/layouts/decidim/_head/add_awesome_custom_styles.html.erb.deface +3 -0
  28. data/app/overrides/layouts/decidim/_head/add_awesome_tags.html.erb.deface +0 -2
  29. data/app/packs/entrypoints/decidim_decidim_awesome_hashcash.js +4 -0
  30. data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +10 -6
  31. data/app/packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js +4 -2
  32. data/app/packs/src/decidim/decidim_awesome/admin/verifications.js +6 -3
  33. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +1 -1
  34. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +1 -1
  35. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +1 -1
  36. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +6 -6
  37. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +1 -1
  38. data/app/packs/src/decidim/decidim_awesome/forms/autosave.js +3 -3
  39. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +1 -113
  40. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +1 -1
  41. data/app/packs/src/vendor/form_builder_langs/ar-SA.lang +111 -0
  42. data/app/packs/src/vendor/form_builder_langs/ar-TN.lang +94 -0
  43. data/app/packs/src/vendor/form_builder_langs/ca-ES.lang +110 -0
  44. data/app/packs/src/vendor/form_builder_langs/cs-CZ.lang +105 -0
  45. data/app/packs/src/vendor/form_builder_langs/da-DK.lang +110 -0
  46. data/app/packs/src/vendor/form_builder_langs/de-DE.lang +109 -0
  47. data/app/packs/src/vendor/form_builder_langs/el-GR.lang +110 -0
  48. data/app/packs/src/vendor/form_builder_langs/en-US.lang +117 -0
  49. data/app/packs/src/vendor/form_builder_langs/es-ES.lang +103 -0
  50. data/app/packs/src/vendor/form_builder_langs/fa-IR.lang +108 -0
  51. data/app/packs/src/vendor/form_builder_langs/fi-FI.lang +107 -0
  52. data/app/packs/src/vendor/form_builder_langs/fr-FR.lang +117 -0
  53. data/app/packs/src/vendor/form_builder_langs/he-IL.lang +108 -0
  54. data/app/packs/src/vendor/form_builder_langs/hi-IN.lang +110 -0
  55. data/app/packs/src/vendor/form_builder_langs/hu-HU.lang +108 -0
  56. data/app/packs/src/vendor/form_builder_langs/id-ID.lang +110 -0
  57. data/app/packs/src/vendor/form_builder_langs/it-IT.lang +107 -0
  58. data/app/packs/src/vendor/form_builder_langs/ja-JP.lang +108 -0
  59. data/app/packs/src/vendor/form_builder_langs/my-MM.lang +108 -0
  60. data/app/packs/src/vendor/form_builder_langs/nb-NO.lang +94 -0
  61. data/app/packs/src/vendor/form_builder_langs/nl-NL.lang +94 -0
  62. data/app/packs/src/vendor/form_builder_langs/pl-PL.lang +122 -0
  63. data/app/packs/src/vendor/form_builder_langs/pt-BR.lang +110 -0
  64. data/app/packs/src/vendor/form_builder_langs/pu-IN.lang +110 -0
  65. data/app/packs/src/vendor/form_builder_langs/qz-MM.lang +108 -0
  66. data/app/packs/src/vendor/form_builder_langs/ro-RO.lang +94 -0
  67. data/app/packs/src/vendor/form_builder_langs/ru-RU.lang +110 -0
  68. data/app/packs/src/vendor/form_builder_langs/sl-SI.lang +110 -0
  69. data/app/packs/src/vendor/form_builder_langs/th-TH.lang +111 -0
  70. data/app/packs/src/vendor/form_builder_langs/tr-TR.lang +115 -0
  71. data/app/packs/src/vendor/form_builder_langs/uk-UA.lang +108 -0
  72. data/app/packs/src/vendor/form_builder_langs/vi-VN.lang +94 -0
  73. data/app/packs/src/vendor/form_builder_langs/zh-CN.lang +100 -0
  74. data/app/packs/src/vendor/form_builder_langs/zh-TW.lang +94 -0
  75. data/app/packs/src/vendor/hashcash.js +83 -0
  76. data/app/packs/src/vendor/sha1.js +143 -0
  77. data/app/packs/src/vendor/stamp.js +50 -0
  78. data/app/packs/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -12
  79. data/app/presenters/decidim/decidim_awesome/private_data_presenter.rb +2 -2
  80. data/app/views/decidim/decidim_awesome/admin/admin_accountability/index.html.erb +4 -4
  81. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/callout.html.erb +2 -2
  82. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/conflict.html.erb +4 -4
  83. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/edit.html.erb +6 -5
  84. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +6 -6
  85. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +2 -2
  86. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +3 -3
  87. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +4 -3
  88. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -1
  89. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +4 -4
  90. data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_styles.html.erb +3 -3
  91. data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +40 -2
  92. data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +1 -1
  93. data/app/views/decidim/decidim_awesome/admin/hashcash/_filters.html.erb +55 -0
  94. data/app/views/decidim/decidim_awesome/admin/hashcash/index.html.erb +33 -0
  95. data/app/views/decidim/decidim_awesome/admin/hashcash/ip_addresses.html.erb +29 -0
  96. data/app/views/decidim/decidim_awesome/admin/hashcash/show.html.erb +42 -0
  97. data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +2 -2
  98. data/app/views/decidim/decidim_awesome/admin/{maintenance → private_data}/_private_data.html.erb +2 -2
  99. data/app/views/decidim/decidim_awesome/admin/{maintenance/show.html.erb → private_data/index.html.erb} +2 -3
  100. data/app/views/decidim/decidim_awesome/admin/proposals/_private_body.html.erb +1 -1
  101. data/app/views/decidim/decidim_awesome/amendments/_modal.html.erb +2 -2
  102. data/app/views/decidim/decidim_awesome/hashcash/_hidden_field.html.erb +5 -0
  103. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +2 -2
  104. data/app/views/layouts/decidim/decidim_awesome/admin/maintenance.html.erb +2 -11
  105. data/config/assets.rb +1 -0
  106. data/config/i18n-tasks.yml +1 -0
  107. data/config/locales/ca.yml +69 -30
  108. data/config/locales/cs.yml +68 -29
  109. data/config/locales/de.yml +67 -28
  110. data/config/locales/en.yml +81 -32
  111. data/config/locales/es.yml +68 -29
  112. data/config/locales/eu.yml +31 -31
  113. data/config/locales/fr.yml +82 -31
  114. data/config/locales/ja.yml +31 -31
  115. data/lib/decidim/decidim_awesome/admin_engine.rb +8 -5
  116. data/lib/decidim/decidim_awesome/awesome.rb +29 -7
  117. data/lib/decidim/decidim_awesome/checksums.yml +15 -40
  118. data/lib/decidim/decidim_awesome/engine.rb +11 -2
  119. data/lib/decidim/decidim_awesome/menu.rb +151 -138
  120. data/lib/decidim/decidim_awesome/test/initializer.rb +4 -1
  121. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +1 -3
  122. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +2 -1
  123. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +8 -1
  124. data/lib/decidim/decidim_awesome/version.rb +1 -1
  125. data/lib/tasks/decidim_awesome_upgrade_tasks.rake +4 -1
  126. data/package.json +3 -4
  127. metadata +68 -10
  128. data/config/rubocop/disabled.yml +0 -11
  129. data/config/rubocop/faker.yml +0 -480
  130. data/config/rubocop/rails.yml +0 -88
  131. data/config/rubocop/rspec.yml +0 -65
  132. data/config/rubocop/ruby.yml +0 -1210
@@ -2,7 +2,7 @@
2
2
  <% if config_enabled? :auto_save_forms %>
3
3
  <div class="row column">
4
4
  <%= form.check_box :auto_save_forms %>
5
- <span class="help-text mb-4" style="margin-top: -1rem;">
5
+ <span class="help-text mb-4">
6
6
  <%= t("help.auto_save_forms", scope: "decidim.decidim_awesome.admin.config.form") %>
7
7
  </span>
8
8
  <%= render(partial: "decidim/decidim_awesome/admin/config/constraints", locals: { key: :auto_save_forms, constraints: constraints_for(:auto_save_forms) }) %>
@@ -11,9 +11,47 @@
11
11
  <% if config_enabled? :user_timezone %>
12
12
  <div class="row column">
13
13
  <%= form.check_box :user_timezone %>
14
- <span class="help-text mb-4" style="margin-top: -1rem;">
14
+ <span class="help-text mb-4">
15
15
  <%= t("help.user_timezone", scope: "decidim.decidim_awesome.admin.config.form") %>
16
16
  </span>
17
17
  </div>
18
18
  <% end %>
19
+
20
+ <% if config_enabled?(:hashcash_login, :hashcash_signup) %>
21
+ <div class="row column">
22
+ <% if config_enabled? :hashcash_signup %>
23
+ <div>
24
+ <%= form.check_box :hashcash_signup %>
25
+ <span class="help-text mb-4">
26
+ <%= t("help.hashcash_signup", scope: "decidim.decidim_awesome.admin.config.form") %>
27
+ </span>
28
+ </div>
29
+ <div>
30
+ <%= form.number_field :hashcash_signup_bits %>
31
+ <span class="help-text mb-4">
32
+ <%= t("help.hashcash_signup_bits", scope: "decidim.decidim_awesome.admin.config.form", bits: Decidim::DecidimAwesome.hashcash_signup_bits) %>
33
+ </span>
34
+ </div>
35
+ <% end %>
36
+
37
+ <% if config_enabled? :hashcash_login %>
38
+ <div>
39
+ <%= form.check_box :hashcash_login %>
40
+ <span class="help-text mb-4">
41
+ <%= t("help.hashcash_login", scope: "decidim.decidim_awesome.admin.config.form") %>
42
+ </span>
43
+ </div>
44
+ <div>
45
+ <%= form.number_field :hashcash_login_bits %>
46
+ <span class="help-text mb-4">
47
+ <%= t("help.hashcash_login_bits", scope: "decidim.decidim_awesome.admin.config.form", bits: Decidim::DecidimAwesome.hashcash_login_bits) %>
48
+ </span>
49
+ </div>
50
+ <% end %>
51
+
52
+ <p class="help-text pt-0 pb-4 label">
53
+ <%= t("help.hashcash_i18n_key", scope: "decidim.decidim_awesome.admin.config.form", key: "<code>active_hashcash.waiting_label</code>").html_safe %>
54
+ </p>
55
+ </div>
56
+ <% end %>
19
57
  </div>
@@ -3,7 +3,7 @@
3
3
 
4
4
  <% if config_enabled? :force_authorization_after_login %>
5
5
  <div>
6
- <%= form.select :force_authorization_after_login, available_authorizations.map {|workflow| [workflow.fullname, workflow.name]}, { include_blank: false }, { multiple: true } %>
6
+ <%= form.select :force_authorization_after_login, available_authorizations.map { |workflow| [workflow.fullname, workflow.name] }, { include_blank: false }, { multiple: true } %>
7
7
  <p class="help-text"><%= t("help.force_authorization_after_login", scope: "decidim.decidim_awesome.admin.config.form") %></p>
8
8
 
9
9
  <%= form.check_box :force_authorization_with_any_method %>
@@ -0,0 +1,55 @@
1
+ <div class="fcell search mb-4">
2
+ <%= form_tag nil, method: :get, class: "form form-defaults" do %>
3
+ <div class="form__wrapper block bg-gray-5 p-4">
4
+ <div class="grid grid-cols-3 gap-x-4 pt-4">
5
+ <div class="content-end">
6
+ <%= label_tag :created_from do %>
7
+ <%= t("created_at", scope: "decidim.decidim_awesome.admin.hashcash.index") + " ≥" %>
8
+ <%= date_field_tag :created_from, params[:created_from], autocomplete: :off %>
9
+ <% end %>
10
+ </div>
11
+ <div class="content-end">
12
+ <%= label_tag :created_from do %>
13
+ <%= t("created_at", scope: "decidim.decidim_awesome.admin.hashcash.index") + " ≤" %>
14
+ <%= date_field_tag :created_to, params[:created_to], autocomplete: :off %>
15
+ <% end %>
16
+ </div>
17
+ <div class="content-end grid grid-cols-2 gap-x-4 pt-8">
18
+ <div>
19
+ <%= label_tag :bits_from do %>
20
+ <%= t("bits", scope: "decidim.decidim_awesome.admin.hashcash.index") + " ≥" %>
21
+ <%= number_field_tag :bits_from, params[:bits_from], autocomplete: :off %>
22
+ <% end %>
23
+ </div>
24
+ <div>
25
+ <%= label_tag :bits_to do %>
26
+ <%= t("bits", scope: "decidim.decidim_awesome.admin.hashcash.index") + " ≤" %>
27
+ <%= number_field_tag :bits_to, params[:bits_to], autocomplete: :off %>
28
+ <% end %>
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <div class="grid grid-cols-3 gap-x-4 py-4">
34
+ <div class="content-end">
35
+ <%= label_tag :ip_address_starts_with, t("ip_address", scope: "decidim.decidim_awesome.admin.hashcash.index") %>
36
+ <%= text_field_tag :ip_address_starts_with, params[:ip_address_starts_with], autocomplete: :off %>
37
+ </div>
38
+ <div class="content-end">
39
+ <%= label_tag :request_path_starts_with, t("request_path", scope: "decidim.decidim_awesome.admin.hashcash.index") %>
40
+ <%= text_field_tag :request_path_starts_with, params[:request_path_starts_with], autocomplete: :off %>
41
+ </div>
42
+ <div class="content-end">
43
+ <div class="grid grid-cols-2 gap-x-4 mb-[4px]">
44
+ <%= submit_tag t("active_hashcash.submit_filter"), class: "button button__sm button__secondary" %>
45
+ <% if params[:action] == "index" %>
46
+ <%= link_to t(".ip_addresses"), ip_addresses_hashcashes_path, class: "button button__sm button__transparent-secondary" %>
47
+ <% else %>
48
+ <%= link_to t(".stamps"), hashcashes_path, class: "button button__sm button__transparent-secondary" %>
49
+ <% end %>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ <% end %>
55
+ </div>
@@ -0,0 +1,33 @@
1
+ <div class="mb-8">
2
+ <p class="help-text"><%= t(".help_html") %>
3
+ </div>
4
+
5
+ <%= render "filters" %>
6
+
7
+ <% if stamps.empty? %>
8
+ <div class="callout warning"><%= t(".no_data") %></div>
9
+ <% else %>
10
+ <div class="table-scroll">
11
+ <table class="table-list">
12
+ <thead>
13
+ <tr>
14
+ <th><%= t(".created_at") %></th>
15
+ <th><%= t(".ip_address") %></th>
16
+ <th><%= t(".request_path") %></th>
17
+ <th><%= t(".bits") %></th>
18
+ </tr>
19
+ </thead>
20
+
21
+ <tbody>
22
+ <% stamps.each do |stamp| %>
23
+ <tr>
24
+ <td><%= link_to stamp.created_at, hashcash_path(stamp) %></td>
25
+ <td><%= stamp.ip_address %></td>
26
+ <td><%= stamp.request_path %></td>
27
+ <td><%= stamp.bits %></td>
28
+ </tr>
29
+ <% end %>
30
+ </tbody>
31
+ </table>
32
+ </div>
33
+ <% end %>
@@ -0,0 +1,29 @@
1
+ <div class="mb-8">
2
+ <p class="help-text"><%= t(".help_html") %>
3
+ </div>
4
+
5
+ <%= render "filters" %>
6
+
7
+ <% if addresses.empty? %>
8
+ <div class="callout warning"><%= t(".no_data") %></div>
9
+ <% else %>
10
+ <div class="table-scroll">
11
+ <table class="table-list">
12
+ <thead>
13
+ <tr>
14
+ <th><%= t(".ip_address") %></th>
15
+ <th><%= t(".stamps") %></th>
16
+ </tr>
17
+ </thead>
18
+
19
+ <tbody>
20
+ <% addresses.each do |address, count| %>
21
+ <tr>
22
+ <td><%= link_to address, hashcashes_path(ip_address_starts_with: address) %></td>
23
+ <td><%= number_with_delimiter count %></td>
24
+ </tr>
25
+ <% end %>
26
+ </tbody>
27
+ </table>
28
+ </div>
29
+ <% end %>
@@ -0,0 +1,42 @@
1
+ <div>
2
+ <h3 class="h3"><%= stamp %></h3>
3
+ <dl class="divide-y divide-gray-100">
4
+ <div class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
5
+ <dt class="font-semibold"><%= stamp.class.human_attribute_name(:created_at) %></dt>
6
+ <dd mt-1 class="sm:col-span-2 sm:mt-0"><%= l stamp.created_at %></dd>
7
+ </div>
8
+
9
+ <div class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
10
+ <dt class="font-semibold"><%= stamp.class.human_attribute_name(:resource) %></dt>
11
+ <dd mt-1 class="sm:col-span-2 sm:mt-0"><%= stamp.resource %></dd>
12
+ </div>
13
+ <div class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
14
+ <dt class="font-semibold"><%= stamp.class.human_attribute_name(:bits) %></dt>
15
+ <dd mt-1 class="sm:col-span-2 sm:mt-0"><%= stamp.bits %></dd>
16
+ </div>
17
+
18
+ <div class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
19
+ <dt class="font-semibold"><%= stamp.class.human_attribute_name(:ip_address) %></dt>
20
+ <dd mt-1 class="sm:col-span-2 sm:mt-0"><%= stamp.ip_address %></dd>
21
+ </div>
22
+
23
+ <div class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
24
+ <dt class="font-semibold"><%= stamp.class.human_attribute_name(:request_path) %></dt>
25
+ <dd mt-1 class="sm:col-span-2 sm:mt-0"><%= stamp.request_path %></dd>
26
+ </div>
27
+
28
+ <div class="px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
29
+ <dt class="font-semibold"><%= stamp.class.human_attribute_name(:context) %></dt>
30
+ <dd mt-1 class="sm:col-span-2 sm:mt-0"><%= stamp.context %></dd>
31
+ </div>
32
+ </dl>
33
+
34
+ <div class="grid grid-cols-4 gap-x-4 mb-[4px]">
35
+ <button class="button button__sm button__transparent-secondary">
36
+ <%= link_to t("decidim.decidim_awesome.admin.hashcash.filters.stamps"), hashcashes_path %>
37
+ </button>
38
+ <button class="button button__sm button__transparent-secondary">
39
+ <%= link_to t("decidim.decidim_awesome.admin.hashcash.filters.ip_addresses"), ip_addresses_hashcashes_path %>
40
+ </button>
41
+ </div>
42
+ </div>
@@ -22,12 +22,12 @@
22
22
  <td><%= item.label %></td>
23
23
  <td><%= item.url %></td>
24
24
  <td><%= item.position %></td>
25
- <td><%= target_options.invert[item.try(:target)||""] %></td>
25
+ <td><%= target_options.invert[item.try(:target) || ""] %></td>
26
26
  <td><%= visibility_options.invert[item.try(:visibility)] %></td>
27
27
  <td class="table-list__actions">
28
28
  <%= icon_link_to "pencil-line", decidim_admin_decidim_awesome.edit_menu_hack_path(params[:menu_id], md5(item.url)), t(".edit"), class: "action-icon--edit" %>
29
29
  <% if item.respond_to?(:overrided?) %>
30
- <%= icon_link_to "close-circle-line", decidim_admin_decidim_awesome.menu_hack_path(params[:menu_id], md5(item.url)), t(".remove#{'_hack' if item.overrided?}"), method: :delete, class: "action-icon--remove", data: { confirm: t(".confirm_destroy") } %>
30
+ <%= icon_link_to "close-circle-line", decidim_admin_decidim_awesome.menu_hack_path(params[:menu_id], md5(item.url)), t(".remove#{"_hack" if item.overrided?}"), method: :delete, class: "action-icon--remove", data: { confirm: t(".confirm_destroy") } %>
31
31
  <% else %>
32
32
  <span class="action-icon">
33
33
  <%= icon "close-circle-line", class: "action-icon action-icon--disabled", role: "img" %>
@@ -5,7 +5,7 @@
5
5
  <% if collection.empty? %>
6
6
  <div class="callout warning"><%= t(".no_data", time_ago:) %></div>
7
7
  <% else %>
8
- <div class="table-scroll autorefresh" data-url="<%= maintenance_path(:private_data).split("?").first %>">
8
+ <div class="table-scroll autorefresh" data-url="<%= private_data_path.split("?").first %>">
9
9
  <table class="table-list">
10
10
  <thead>
11
11
  <tr>
@@ -27,7 +27,7 @@
27
27
  <% if item.locked? %>
28
28
  <span class="loading-spinner primary" title="<%= t(".removing") %>"></span>
29
29
  <% elsif item.destroyable? %>
30
- <%= link_to destroy_private_data_maintenance_path(:private_data, resource_id: item), method: :delete, class: "button button__primary button__xs tiny", data: { confirm: t(".confirm_delete") } do %>
30
+ <%= link_to private_datum_path(item), method: :delete, class: "button button__primary button__xs tiny", data: { confirm: t(".confirm_delete") } do %>
31
31
  <%= icon "delete-bin-line" %>
32
32
  <%= t(".delete") %>
33
33
  <% end %>
@@ -1,5 +1,5 @@
1
- <div class="card-section section_<%= current_view %>">
2
- <%= render current_view %>
1
+ <div class="card-section section_private_data">
2
+ <%= render "private_data" %>
3
3
  </div>
4
4
 
5
5
  <script>
@@ -41,4 +41,3 @@
41
41
  });
42
42
  });
43
43
  </script>
44
- </script>
@@ -12,7 +12,7 @@
12
12
  <div class="date_info">
13
13
  <%= t("decidim.decidim_awesome.admin.proposal_custom_fields.private_data_last_update", time_ago: time_ago_in_words(proposal.extra_fields.private_body_updated_at)) if proposal.extra_fields.private_body.present? %>
14
14
  <%= t("decidim.decidim_awesome.admin.proposal_custom_fields.private_data_last_remove", time_ago: time_ago_in_words(proposal.extra_fields.private_body_updated_at)) if proposal.extra_fields.private_body.blank? %>
15
- <%= link_to t("decidim.decidim_awesome.admin.proposal_custom_fields.remove_private_data"), decidim_admin_decidim_awesome.maintenance_path(:private_data) if proposal.extra_fields.private_body_updated_at && proposal.extra_fields.private_body_updated_at < Decidim::DecidimAwesome.private_data_expiration_time.ago %>
15
+ <%= link_to t("decidim.decidim_awesome.admin.proposal_custom_fields.remove_private_data"), decidim_admin_decidim_awesome.private_data_path if proposal.extra_fields.private_body_updated_at && proposal.extra_fields.private_body_updated_at < Decidim::DecidimAwesome.private_data_expiration_time.ago %>
16
16
  </div>
17
17
  <% end %>
18
18
  </div>
@@ -7,12 +7,12 @@
7
7
  <div>
8
8
  <div class="instructions">
9
9
  <%= t("decidim.decidim_awesome.amendments.modal.explanation_html",
10
- proposal_link: present(@proposal).proposal_path + "#comments") %>
10
+ proposal_link: present(@proposal).proposal_path + "#comments") %>
11
11
 
12
12
  <% emendations = @proposal.emendations.not_hidden.where(decidim_amendments: { state: Decidim::Amendment.states["evaluating"] }) %>
13
13
  <% if current_component.current_settings&.amendments_visibility == "all" && emendations %>
14
14
  <%= t("decidim.decidim_awesome.amendments.modal.current_amendment_html",
15
- amendment_link: present(emendations&.first).proposal_path) %>
15
+ amendment_link: present(emendations&.first).proposal_path) %>
16
16
  <% end %>
17
17
  </div>
18
18
  </div>
@@ -0,0 +1,5 @@
1
+
2
+ <% if defined?(awesome_hashcash_bits) && awesome_hashcash_bits(zone) %>
3
+ <% append_javascript_pack_tag("decidim_decidim_awesome_hashcash") %>
4
+ <%= hashcash_hidden_field_tag %>
5
+ <% end %>
@@ -4,7 +4,7 @@ window.DecidimAwesome.currentLocale = "<%= current_locale %>";
4
4
  window.DecidimAwesome.version = "<%= Decidim::DecidimAwesome::VERSION %>";
5
5
  window.DecidimAwesome.editorUploaderPath = "<%= decidim_decidim_awesome.editor_images_path %>";
6
6
  window.DecidimAwesome.renameScopeLabelPath = "<%= decidim_admin_decidim_awesome.rename_scope_label_path %>";
7
- window.DecidimAwesome.texts = {
7
+ window.DecidimAwesome.i18n = {
8
8
  "dragAndDropImage": "<%= j t(".drag_and_drop_image") %>",
9
9
  "autosavedSuccess": "<%= j t(".autosaved_success") %>",
10
10
  "autosavedError": "<%= j t(".autosaved_error") %>",
@@ -18,7 +18,7 @@ window.DecidimAwesome.texts = {
18
18
  "selectDeselectAll": "<%= j t(".select_deselect_all") %>",
19
19
  "officialAuthor": "<%= j t("decidim.blogs.models.post.fields.official_blog_post") %>",
20
20
  }
21
- window.DecidimAwesome.formBuilderLangsLocation = "<%= j Decidim::DecidimAwesome.form_builder_langs_location %>";
21
+ window.DecidimAwesome.formBuilderLangsLocation = "<%= decidim_decidim_awesome.form_builder_i18n_path(locale: nil) %>";
22
22
  <% if defined?(questionnaire) && questionnaire&.id %>
23
23
  window.DecidimAwesome.current_questionnaire = "edit_questionnaire_<%= questionnaire.id %>";
24
24
  <% if defined? visitor_already_answered? %>
@@ -1,19 +1,10 @@
1
1
  <%= render "layouts/decidim/decidim_awesome/admin/base" do %>
2
2
  <div class="item_show__header">
3
3
  <h2 class="item_show__header-title">
4
- <%= t("layouts.decidim.decidim_awesome.admin.maintenance.title", title: t(current_view, scope: "layouts.decidim.decidim_awesome.admin.maintenance.titles")) %>
5
-
6
- <% available_views.each do |view, parts| %>
7
- <% next if view == current_view %>
8
-
9
- <%= link_to parts[:path], class: "button button__secondary button__xs tiny button--title" do %>
10
- <%= icon parts[:icon] %>
11
- <%= parts[:title] %>
12
- <% end %>
13
- <% end %>
4
+ <%= t("layouts.decidim.decidim_awesome.admin.maintenance.title", title: t(controller_name, scope: "layouts.decidim.decidim_awesome.admin.maintenance.titles")) %>
14
5
  </h2>
15
6
  </div>
16
- <div class="card">
7
+ <div class="card mb-8">
17
8
  <%= yield %>
18
9
  </div>
19
10
  <% end %>
data/config/assets.rb CHANGED
@@ -8,6 +8,7 @@ Decidim::Webpacker.register_entrypoints(
8
8
  # override the Decidim entry point for decidim so we can define a custom createEditor method
9
9
  decidim_editor: "#{base_path}/app/packs/entrypoints/decidim_editor.js",
10
10
  decidim_decidim_awesome: "#{base_path}/app/packs/entrypoints/decidim_decidim_awesome.js",
11
+ decidim_decidim_awesome_hashcash: "#{base_path}/app/packs/entrypoints/decidim_decidim_awesome_hashcash.js",
11
12
  decidim_admin_decidim_awesome: "#{base_path}/app/packs/entrypoints/decidim_admin_decidim_awesome.js",
12
13
  decidim_admin_decidim_awesome_global: "#{base_path}/app/packs/entrypoints/decidim_admin_decidim_awesome_global.js",
13
14
  decidim_decidim_awesome_map: "#{base_path}/app/packs/entrypoints/decidim_decidim_awesome_map.js",
@@ -12,6 +12,7 @@ data:
12
12
  - "<%= %x[bundle info decidim-blogs --path].chomp %>/config/locales/%{locale}.yml"
13
13
 
14
14
  ignore_unused:
15
+ - "active_hashcash.*"
15
16
  - "decidim.admin.actions.manage"
16
17
  - "decidim.admin.filters.admin_accountability.*"
17
18
  - "decidim.admin.filters.search_placeholder.*"
@@ -1,4 +1,7 @@
1
1
  ca:
2
+ active_hashcash:
3
+ submit_filter: Filtra
4
+ waiting_label: Esperant verificació...
2
5
  activemodel:
3
6
  attributes:
4
7
  config:
@@ -10,6 +13,10 @@ ca:
10
13
  force_authorization_after_login: Forçar autorització després d'iniciat sessió/registre
11
14
  force_authorization_help_text: Text d'ajuda per la pàgina d'autorització
12
15
  force_authorization_with_any_method: Permetre l'accés si es concedeix alguna de les autoritzacions (per defecte, totes són necessàries)
16
+ hashcash_login: Activa la protecció HashCash antibot per usuaris existents (inici sessió)
17
+ hashcash_login_bits: Nombre de bits per l'algoritme Hashcash (inici sessió)
18
+ hashcash_signup: Activa la protecció HashCash antibot per usuaris existents (registre)
19
+ hashcash_signup_bits: Nombre de bits per l'algoritme Hashcash (registre)
13
20
  intergram_auto_no_response: Un missatge que s'envia un minut després que la usuària hagi enviat el seu primer missatge i no s'hagi rebut cap resposta
14
21
  intergram_auto_response: Un missatge que s'envia immediatament després que la usuària enviï el seu primer missatge
15
22
  intergram_chat_id: ID de xat
@@ -130,7 +137,7 @@ ca:
130
137
  sort_orders_enabled: Opcions d'ordenació actives
131
138
  voting_cards_box_title: Títol per la cabina de votació
132
139
  voting_cards_box_title_help: L'opció per defecte és 'Votar a aquesta proposta'. Utilitzeu '-' per amagar-la.
133
- voting_cards_instructions: Instruccions d'ajuda en el suport/votació (finestra modal que es pot tancar).
140
+ voting_cards_instructions: Instruccions d'ajuda en el suport/votació (finestra modal que es pot tancar)
134
141
  voting_cards_instructions_help: L'opció per defecte és 'Llegeix les normes de la votació amb atenció per entendre com s'utilitzarà el teu vot per %{organization}"
135
142
  voting_cards_show_abstain: Afegeix l'opció d'abstenció
136
143
  voting_cards_show_modal_help: Mostra la finestra modal d'instruccions/ajuda quan es faci clic al suport
@@ -264,6 +271,15 @@ ca:
264
271
  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).
265
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).'
266
273
  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
+ 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
+ hashcash_login: |
276
+ Protegeix les aplicacions Rails contra bots i atacs de força bruta sense molestar els humans.
277
+ Hashcash és un sistema de prova de treball que requereix que els usuaris resolguin un trencaclosques computacional (realitzat automàticament pel navegador) abans de poder registrar-se.
278
+ hashcash_login_bits: Aquest paràmetre defineix el nombre de bits que l'algoritme Hashcash utilitzarà per generar la prova de treball. Es recomana utilitzar un valor entre 16 (fàcil) i 30 (extremadament difícil) bits. El valor per defecte per als formularis d'inici de sessió és %{bits} bits.
279
+ hashcash_signup: |
280
+ Protegeix les aplicacions Rails contra bots i atacs de força bruta sense molestar els humans.
281
+ Hashcash és un sistema de prova de treball que requereix que els usuaris resolguin un trencaclosques computacional (realitzat automàticament pel navegador) abans de poder registrar-se.
282
+ hashcash_signup_bits: Aquest paràmetre defineix el nombre de bits que l'algoritme Hashcash utilitzarà per generar la prova de treball. Es recomana utilitzar un valor entre 16 (fàcil) i 30 (extremadament difícil) bits. El valor per defecte per als formularis de registre és %{bits} bits.
267
283
  intergram_about: Intergram utilitza el Telegram Messenger per gestionar un widget de xat en viu de suport incrustat a la part inferior de la pàgina.
268
284
  intergram_config: 'Convida a la <a href="https://web.telegram.org/#/im?p=@IntergramBot">@Intergram bot</a> al teu grup o comença un xat amb ella directament. <a href="https://github.com/idoco/intergram#embed-intergram-in-your-website-with-these-2-simple-steps">+ info</a>'
269
285
  original_editor_override: Desde la versió 0.26, és possible (per administradors només) pujar imatges als editors de text enriquit. Per tant, les opcions d'imatges disponibles en aquesta pàgina només afecten a la part pública de la web (les administradores sempre ho tenen activat).
@@ -398,37 +414,25 @@ ca:
398
414
  update:
399
415
  error: 'Error en actualitzar la redirecció: %{error}'
400
416
  success: Redirecció actualitzada correctament
401
- maintenance:
402
- private_data:
403
- component: Espai / Component
404
- confirm_delete: Segur que voleu suprimir totes les dades privades d'aquest recurs? Aquesta acció no es pot desfer.
405
- delete: Esborrar-ho tot
406
- destroying_private_data: Les dades privades de %{title} s'han programat per ser destruïdes. Si us plau, torneu a comprovar d'aquí a uns minuts.
407
- done: Fet
417
+ hashcash:
418
+ filters:
419
+ ip_addresses: Veure les adreces IP
420
+ stamps: Veure els segells de Hashcash
421
+ index:
422
+ bits: Bits
423
+ created_at: Creada el
408
424
  help_html: |
409
- Aquesta eina permet esborrar totes les dades privades d'un espai o component participatiu concret. Aquesta acció és irreversible i eliminarà totes les dades privades de la base de dades.
410
- <br><br>
411
- <strong>Què es consideren dades privades?</strong>
412
- <br>
413
- Les dades privades són qualsevol informació que no està disponible públicament i només és accessible per als administradors. Això, de moment, inclou la informació del camps personalitzats privats.
414
- <br><br>
415
- <strong>Què passa quan suprimeixo dades privades?</strong>
416
- <br>
417
- Quan suprimiu les dades privades, tota la informació privada de l'espai o component participatiu seleccionat s'eliminarà permanentment de la base de dades. Un registre d'aquesta acció s'emmagatzemarà al sistema amb finalitats d'auditoria (pero no les dades en si).
425
+ Aquesta pàgina mostra els segells Hashcash que s'han detectat al sistema. Hashcash és un sistema de prova de treball que requereix que els usuaris resolguin un trencaclosques computacional (realitzat automàticament pel navegador) abans de poder registrar-se.
418
426
  <br><br>
419
- <strong>Què passa amb les dades públiques?</strong>
420
- <br>
421
- Les dades públiques no es veuran afectades per aquesta acció. Només s'eliminaran les dades privades.
422
- <br><br>
423
- <strong>Hi ha un temps mínim d'espera abans de suprimir les dades privades?</strong>
424
- <br>
425
- Sí, no podeu suprimir dades privades si l'última actualització va ser fa menys de %{time_ago}. Podeu canviar aquesta configuració al fitxer inicialitzador.
426
- items_count: Total afectats
427
- last_date: Última actualització
428
- no_data: No s'han trobat dades privades més antigues que fa %{time_ago}
429
- not_destroyable: Aquest recurs encara no es pot destruir
430
- removing: Eliminant...
431
- time_ago: "fa %{time}"
427
+ Cada entrada d'aquesta llista representa un segell Hashcash que ha estat generat per un usuari cada vegada que s'ha registrat o ha iniciat la sessió.
428
+ ip_address: Adreça IP
429
+ no_data: No s'han trobat segells de Hashcash
430
+ request_path: Ruta de la sol·licitud
431
+ ip_addresses:
432
+ help_html: Aquesta pàgina enumera totes les adreces IP que s'han detectat al sistema, ordenades pel nombre de segells Hashcash que han generat. <br><br> Cada segell és una acció d'inici de sessió o de registre per part d'un usuari. Podeu utilitzar aquesta informació per detectar activitats sospitoses.
433
+ ip_address: Adreça IP
434
+ no_data: No s'han trobat adreces IP
435
+ stamps: Segells hashcash
432
436
  menu:
433
437
  admins: Administradores acotades
434
438
  custom_redirects: Redireccions personalitzades
@@ -436,6 +440,7 @@ ca:
436
440
  livechat: Xat en directe
437
441
  maintenance:
438
442
  checks: Compatibilitat de sistema
443
+ hashcash: Segells hashcash
439
444
  maintenance: Manteniment
440
445
  private_data: Dades privades
441
446
  menu_hacks: Retocs al menú
@@ -472,6 +477,8 @@ ca:
472
477
  title: Bloc de menú global a la home
473
478
  menu:
474
479
  title: Menú principal
480
+ mobile_menu:
481
+ title: Menú mòbil
475
482
  new: Nou ítem
476
483
  remove: Eliminar addició
477
484
  remove_hack: Eliminar retoc
@@ -487,6 +494,37 @@ ca:
487
494
  verification_modal:
488
495
  authorizations_for: Autoritzacions per a %{user}
489
496
  close: Tanca
497
+ private_data:
498
+ private_data:
499
+ component: Espai / Component
500
+ confirm_delete: Segur que voleu suprimir totes les dades privades d'aquest recurs? Aquesta acció no es pot desfer.
501
+ delete: Esborrar-ho tot
502
+ destroying: Les dades privades de %{title} s'han programat per ser destruïdes. Si us plau, torneu a comprovar d'aquí a uns minuts.
503
+ done: Fet
504
+ help_html: |
505
+ Aquesta eina permet esborrar totes les dades privades d'un espai o component participatiu concret. Aquesta acció és irreversible i eliminarà totes les dades privades de la base de dades.
506
+ <br><br>
507
+ <strong>Què es consideren dades privades?</strong>
508
+ <br>
509
+ Les dades privades són qualsevol informació que no està disponible públicament i només és accessible per als administradors. Això, de moment, inclou la informació del camps personalitzats privats.
510
+ <br><br>
511
+ <strong>Què passa quan suprimeixo dades privades?</strong>
512
+ <br>
513
+ Quan suprimiu les dades privades, tota la informació privada de l'espai o component participatiu seleccionat s'eliminarà permanentment de la base de dades. Un registre d'aquesta acció s'emmagatzemarà al sistema amb finalitats d'auditoria (pero no les dades en si).
514
+ <br><br>
515
+ <strong>Què passa amb les dades públiques?</strong>
516
+ <br>
517
+ Les dades públiques no es veuran afectades per aquesta acció. Només s'eliminaran les dades privades.
518
+ <br><br>
519
+ <strong>Hi ha un temps mínim d'espera abans de suprimir les dades privades?</strong>
520
+ <br>
521
+ Sí, no podeu suprimir dades privades si l'última actualització va ser fa menys de %{time_ago}. Podeu canviar aquesta configuració al fitxer inicialitzador.
522
+ items_count: Total afectats
523
+ last_date: Última actualització
524
+ no_data: No s'han trobat dades privades més antigues que fa %{time_ago}
525
+ not_destroyable: Aquest recurs encara no es pot destruir
526
+ removing: Eliminant...
527
+ time_ago: "fa %{time}"
490
528
  proposal_custom_fields:
491
529
  menu:
492
530
  title: Camps públics
@@ -640,6 +678,7 @@ ca:
640
678
  title: 'Eines de manteniment: %{title}'
641
679
  titles:
642
680
  checks: Anàlisi de compatibilitat amb el sistema
681
+ hashcash: Segells hashcash
643
682
  private_data: Neteja de dades privades
644
683
  awesome_config:
645
684
  amendments: Esmenes