decidim-core 0.29.4 → 0.29.6

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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity/show.erb +6 -6
  3. data/app/cells/decidim/author/badge.erb +6 -0
  4. data/app/cells/decidim/author/show.erb +8 -2
  5. data/app/cells/decidim/author_cell.rb +10 -0
  6. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +11 -2
  7. data/app/cells/decidim/footer_topics/show.erb +2 -2
  8. data/app/cells/decidim/group_admins/show.erb +3 -1
  9. data/app/cells/decidim/group_members/show.erb +6 -2
  10. data/app/cells/decidim/images_panel/show.erb +5 -2
  11. data/app/cells/decidim/profile/avatar.erb +0 -2
  12. data/app/cells/decidim/profile/badge.erb +3 -3
  13. data/app/cells/decidim/profile/details.erb +2 -1
  14. data/app/cells/decidim/report_button/flag_modal.erb +11 -9
  15. data/app/cells/decidim/report_user_button/flag_modal.erb +11 -10
  16. data/app/cells/decidim/upload_modal/files.erb +4 -4
  17. data/app/cells/decidim/upload_modal_cell.rb +5 -3
  18. data/app/cells/decidim/user_activity_cell.rb +6 -1
  19. data/app/commands/decidim/amendable/accept.rb +2 -1
  20. data/app/controllers/concerns/decidim/headers/browser_feature_permissions.rb +50 -0
  21. data/app/controllers/decidim/amendments_controller.rb +3 -3
  22. data/app/controllers/decidim/application_controller.rb +1 -0
  23. data/app/forms/decidim/user_group_form.rb +2 -0
  24. data/app/helpers/decidim/amendments_helper.rb +2 -1
  25. data/app/helpers/decidim/filters_helper.rb +25 -0
  26. data/app/helpers/decidim/layout_helper.rb +6 -0
  27. data/app/helpers/decidim/map_helper.rb +1 -1
  28. data/app/packs/images/decidim/default-avatar.svg +1 -1
  29. data/app/packs/src/decidim/callout.js +13 -8
  30. data/app/packs/src/decidim/confirm.js +79 -59
  31. data/app/packs/src/decidim/datepicker/generate_datepicker.js +2 -0
  32. data/app/packs/src/decidim/datepicker/generate_timepicker.js +2 -0
  33. data/app/packs/src/decidim/direct_uploads/upload_field.js +3 -4
  34. data/app/packs/src/decidim/direct_uploads/upload_modal.js +8 -9
  35. data/app/packs/src/decidim/dropdown_menu.js +18 -0
  36. data/app/packs/src/decidim/editor/common/suggestion.js +11 -1
  37. data/app/packs/src/decidim/form_filter.js +6 -0
  38. data/app/packs/src/decidim/form_remote.js +1 -1
  39. data/app/packs/src/decidim/impersonation.js +1 -1
  40. data/app/packs/src/decidim/index.js +5 -1
  41. data/app/packs/src/decidim/session_timeouter.js +1 -1
  42. data/app/packs/src/decidim/utilities/dom.js +148 -0
  43. data/app/packs/stylesheets/decidim/_activity.scss +4 -4
  44. data/app/packs/stylesheets/decidim/_author.scss +8 -0
  45. data/app/packs/stylesheets/decidim/_cards.scss +10 -2
  46. data/app/packs/stylesheets/decidim/_filters.scss +1 -1
  47. data/app/packs/stylesheets/decidim/_header.scss +11 -3
  48. data/app/packs/stylesheets/decidim/_layout.scss +2 -2
  49. data/app/packs/stylesheets/decidim/_modal.scss +1 -5
  50. data/app/packs/stylesheets/decidim/_modal_update.scss +5 -1
  51. data/app/packs/stylesheets/decidim/_profile.scss +6 -6
  52. data/app/packs/stylesheets/decidim/editor.scss +3 -1
  53. data/app/permissions/decidim/permissions.rb +13 -1
  54. data/app/validators/password_validator.rb +3 -1
  55. data/app/views/decidim/application/_document.html.erb +2 -2
  56. data/app/views/decidim/errors/internal_server_error.html.erb +1 -1
  57. data/app/views/decidim/errors/not_found.html.erb +1 -1
  58. data/app/views/decidim/newsletters/unsubscribe.html.erb +16 -4
  59. data/app/views/decidim/searches/_filters.html.erb +48 -13
  60. data/app/views/decidim/shared/_component_announcement.html.erb +1 -1
  61. data/app/views/decidim/shared/_confirm_modal.html.erb +3 -5
  62. data/app/views/decidim/shared/_filters.html.erb +7 -5
  63. data/app/views/layouts/decidim/_application.html.erb +1 -1
  64. data/app/views/layouts/decidim/_js_configuration.html.erb +1 -0
  65. data/app/views/layouts/decidim/footer/_main.html.erb +1 -1
  66. data/app/views/layouts/decidim/footer/_main_intro.html.erb +1 -1
  67. data/app/views/layouts/decidim/footer/_mini.html.erb +2 -2
  68. data/app/views/layouts/decidim/header/_main.html.erb +2 -2
  69. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +6 -0
  70. data/app/views/layouts/decidim/header/_main_links_dropdown.html.erb +2 -0
  71. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +1 -1
  72. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +1 -1
  73. data/config/locales/ar.yml +0 -3
  74. data/config/locales/bg-BG.yml +2 -2
  75. data/config/locales/bg.yml +0 -5
  76. data/config/locales/ca-IT.yml +37 -13
  77. data/config/locales/ca.yml +37 -13
  78. data/config/locales/cs.yml +20 -6
  79. data/config/locales/de.yml +48 -23
  80. data/config/locales/el.yml +0 -4
  81. data/config/locales/en.yml +29 -5
  82. data/config/locales/es-MX.yml +29 -5
  83. data/config/locales/es-PY.yml +29 -5
  84. data/config/locales/es.yml +29 -5
  85. data/config/locales/eu.yml +94 -70
  86. data/config/locales/fi-plain.yml +58 -5
  87. data/config/locales/fi.yml +59 -6
  88. data/config/locales/fr-CA.yml +29 -5
  89. data/config/locales/fr-LU.yml +3 -3
  90. data/config/locales/fr.yml +29 -5
  91. data/config/locales/gl.yml +0 -3
  92. data/config/locales/hu.yml +0 -5
  93. data/config/locales/id-ID.yml +0 -3
  94. data/config/locales/is-IS.yml +0 -1
  95. data/config/locales/it.yml +124 -3
  96. data/config/locales/ja.yml +30 -5
  97. data/config/locales/lb-LU.yml +2 -2
  98. data/config/locales/lb.yml +0 -3
  99. data/config/locales/lt.yml +0 -5
  100. data/config/locales/lv.yml +0 -3
  101. data/config/locales/nl.yml +0 -3
  102. data/config/locales/no.yml +0 -3
  103. data/config/locales/pl.yml +0 -5
  104. data/config/locales/pt-BR.yml +1 -4
  105. data/config/locales/pt.yml +0 -3
  106. data/config/locales/ro-RO.yml +0 -4
  107. data/config/locales/ru.yml +0 -3
  108. data/config/locales/sk-SK.yml +3 -3
  109. data/config/locales/sk.yml +2 -3
  110. data/config/locales/sv.yml +28 -4
  111. data/config/locales/tr-TR.yml +0 -3
  112. data/config/locales/uk.yml +0 -2
  113. data/config/locales/zh-CN.yml +0 -3
  114. data/config/locales/zh-TW.yml +0 -5
  115. data/lib/decidim/asset_router/storage.rb +8 -8
  116. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +2 -1
  117. data/lib/decidim/core/test/factories.rb +2 -2
  118. data/lib/decidim/core/test/shared_examples/announcements_examples.rb +4 -0
  119. data/lib/decidim/core/version.rb +1 -1
  120. data/lib/decidim/form_builder.rb +15 -1
  121. metadata +10 -6
@@ -61,7 +61,7 @@ header {
61
61
  @apply hidden md:block col-span-2 col-start-5 xl:col-start-4;
62
62
 
63
63
  form {
64
- @apply block relative rounded text-md bg-background;
64
+ @apply block relative rounded text-md border border-neutral-200 outline outline-1 outline-transparent rounded bg-background-2 leading-relaxed;
65
65
  }
66
66
 
67
67
  input[type="text"] {
@@ -69,7 +69,7 @@ header {
69
69
  }
70
70
 
71
71
  button[type="submit"] {
72
- @apply absolute ltr:right-2 rtl:left-2 inset-y-2 text-secondary;
72
+ @apply absolute ltr:right-2 rtl:left-2 inset-y-0 text-secondary px-2;
73
73
  }
74
74
  }
75
75
 
@@ -404,7 +404,7 @@ header {
404
404
  @apply w-full px-4;
405
405
 
406
406
  &-menu {
407
- @apply w-full md:w-1/2 mt-0 grid md:grid-cols-2 gap-x-6 text-secondary;
407
+ @apply w-full md:w-[100%] mt-0 grid md:grid-cols-2 gap-x-6 text-secondary;
408
408
 
409
409
  > * {
410
410
  @apply py-3 md:py-3.5 border-b last:border-0 border-gray-3;
@@ -431,6 +431,14 @@ header {
431
431
 
432
432
  &__bottom {
433
433
  @apply hidden md:flex;
434
+
435
+ &-right {
436
+ @apply mr-2 mb-2;
437
+ }
438
+
439
+ &-left {
440
+ @apply mr-2 mt-1;
441
+ }
434
442
  }
435
443
 
436
444
  &__title {
@@ -2,11 +2,11 @@
2
2
  @apply flex flex-col min-h-screen;
3
3
 
4
4
  &__skip {
5
- @apply absolute z-10 left-0 -translate-x-full py-1 px-4 bg-primary rounded-br-lg text-white cursor-pointer transition focus:translate-x-0;
5
+ @apply absolute z-[9999] left-0 -translate-x-full py-1 px-4 bg-primary rounded-br-lg text-white cursor-pointer transition focus:translate-x-0;
6
6
  }
7
7
 
8
8
  [data-content] {
9
- @apply relative flex flex-col;
9
+ @apply relative flex flex-col flex-1;
10
10
  }
11
11
  }
12
12
 
@@ -18,15 +18,11 @@
18
18
  }
19
19
 
20
20
  [data-dialog-container] {
21
- @apply grid grid-cols-[auto_1fr] items-start md:items-center gap-2 text-left;
21
+ @apply grid grid-rows-[auto_1fr] items-start md:items-center gap-2 text-left;
22
22
 
23
23
  > svg {
24
24
  @apply w-6 h-6 text-gray fill-current flex-none;
25
25
  }
26
-
27
- > :last-child {
28
- @apply col-span-2 md:col-span-1 md:col-start-2;
29
- }
30
26
  }
31
27
 
32
28
  [data-dialog-title] {
@@ -132,8 +132,12 @@
132
132
  }
133
133
 
134
134
  span {
135
- @apply text-sm text-gray-2 mx-auto;
135
+ @apply text-sm text-gray-2 mx-auto w-full break-all mb-2;
136
136
  }
137
137
  }
138
138
  }
139
+
140
+ &__span {
141
+ @apply w-full break-all mb-2;
142
+ }
139
143
  }
@@ -9,18 +9,18 @@
9
9
  &-container {
10
10
  @apply w-24 h-24 relative;
11
11
  }
12
+ }
13
+
14
+ &__details {
15
+ @apply pb-3 space-y-2;
12
16
 
13
17
  &-badge {
14
- @apply absolute top-full right-0 -translate-y-full grid place-items-center w-6 h-6 rounded-full overflow-hidden bg-primary border border-white;
18
+ @apply flex items-center gap-1 text-sm text-gray-2;
15
19
 
16
20
  svg {
17
- @apply w-4 h-4 text-white fill-current;
21
+ @apply w-4 h-4 inline-block bg-primary rounded-full text-white fill-current;
18
22
  }
19
23
  }
20
- }
21
-
22
- &__details {
23
- @apply pb-3 space-y-2;
24
24
 
25
25
  &-data {
26
26
  @apply flex flex-wrap gap-x-6 gap-y-4;
@@ -89,7 +89,9 @@
89
89
  }
90
90
 
91
91
  .ProseMirror {
92
- @apply relative p-2.5 outline-0 min-h-full prose max-w-none prose-headings:first:mt-0 prose-p:first:mt-0 prose-ul:first:mt-0 prose-ol:first:mt-0 prose-blockquote:first:mt-0 prose-pre:first:mt-0;
92
+ @apply relative p-2.5 outline-0 resize-y overflow-hidden prose max-w-none prose-headings:first:mt-0 prose-p:first:mt-0 prose-ul:first:mt-0 prose-ol:first:mt-0 prose-blockquote:first:mt-0 prose-pre:first:mt-0;
93
+
94
+ min-height: inherit;
93
95
 
94
96
  &.ProseMirror-focused,
95
97
  &.dialog-open {
@@ -106,7 +106,19 @@ module Decidim
106
106
  return allow! if component.current_settings.amendment_creation_enabled
107
107
  when :accept,
108
108
  :reject
109
- return allow! if component.current_settings.amendment_reaction_enabled
109
+ return disallow! unless component.current_settings.amendment_reaction_enabled
110
+
111
+ amendable = context.fetch(:amendable, nil)
112
+
113
+ if amendable.respond_to?(:official?) && amendable.official?
114
+ return allow! if user.admin?
115
+
116
+ return disallow!
117
+ end
118
+
119
+ return disallow! unless amendable.authored_by?(user)
120
+
121
+ return allow!
110
122
  when :promote
111
123
  return allow! if component.current_settings.amendment_promotion_enabled
112
124
  end
@@ -55,7 +55,9 @@ class PasswordValidator < ActiveModel::EachValidator
55
55
  attr_reader :record, :attribute, :value
56
56
 
57
57
  def get_message(reason)
58
- I18n.t "password_validator.#{reason}"
58
+ I18n.t! "password_validator.#{reason}"
59
+ rescue I18n::MissingTranslationData
60
+ I18n.t "password_validator.fallback"
59
61
  end
60
62
 
61
63
  def organization
@@ -1,8 +1,8 @@
1
1
  <div id="<%= dom_id(document) %>">
2
2
  <div class="card__list-content">
3
- <%= link_to document.url, target: "_blank", rel: "noopener noreferrer", class: "card__list-title", title: t("decidim.application.document.download") do %>
3
+ <span class="card__list-title">
4
4
  <%= h attachment_title(document) %>
5
- <% end %>
5
+ </span>
6
6
  <% if document.description.present? %>
7
7
  <div class="card__list-text"><%= decidim_escape_translated(document.description) %></div>
8
8
  <% end %>
@@ -1,6 +1,6 @@
1
1
  <%= render layout: "layouts/decidim/shared/layout_center" do %>
2
2
 
3
- <div class="place-self-center">
3
+ <div class="flex flex-col items-center">
4
4
  <div class="flex justify-center">
5
5
  <h1 class="title-decorator my-12"><%= t("title", scope: "decidim.errors.internal_server_error") %></h1>
6
6
  </div>
@@ -1,6 +1,6 @@
1
1
  <%= render layout: "layouts/decidim/shared/layout_center" do %>
2
2
 
3
- <div class="place-self-center">
3
+ <div class="flex flex-col items-center">
4
4
  <div class="flex justify-center">
5
5
  <h1 class="title-decorator my-12"><%= t("title", scope: "decidim.errors.not_found") %></h1>
6
6
  </div>
@@ -1,4 +1,16 @@
1
- <div class="row">
2
- <h4><%== t ".unsubscribe" %></h4>
3
- <p><%== t ".check_subscription", link: decidim.notifications_settings_path %></p>
4
- </div>
1
+ <main class="layout-1col cols-6">
2
+ <div class="text-center py-12">
3
+ <h1 class="h1 decorator inline-block text-left"><%= t ".unsubscribe" %></h1>
4
+ </div>
5
+ <div class="page__container">
6
+ <div class="editor-content">
7
+ <div class="rich-text-display">
8
+ <%= t ".subscription_preferences", organization_name: translated_attribute(current_organization.name) %>
9
+ </div>
10
+ <br>
11
+ <div class="rich-text-display">
12
+ <%= t ".check_subscription_html", link: decidim.notifications_settings_path %>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ </main>
@@ -12,35 +12,70 @@
12
12
  <%= icon "arrow-down-s-line", class: "w-8 h-8 flex-none text-secondary fill-current" %>
13
13
  <%= icon "arrow-up-s-line", class: "w-8 h-8 flex-none text-secondary fill-current" %>
14
14
  </button>
15
- <div id="dropdown-menu-search" aria-hidden="true">
16
- <div>
17
- <%= link_to main_search_path, class: "filter#{" is-active" if params.dig(:filter, :with_resource_type) == nil}" do %>
15
+ <ul id="dropdown-menu-search" aria-hidden="true">
16
+ <li>
17
+ <%= link_to main_search_path, class: "filter#{" is-active" if params.dig(:filter, :with_resource_type) == nil}", "aria-current": params.dig(:filter, :with_resource_type) == nil ? "true" : "" do %>
18
18
  <%= resource_type_icon("all") %>
19
19
  <span><%= t("all", scope: "decidim.searches.filters.state") %></span>
20
20
  <span class="label ml-auto"><%= @results_count %></span>
21
21
  <% end %>
22
- </div>
22
+ </li>
23
23
  <% @blocks.each do |elements| %>
24
- <div>
25
- <% elements.each do |type, results| %>
26
- <div>
24
+ <li>
25
+ <ul>
26
+ <% elements.each do |type, results| %>
27
27
  <% if results[:count].positive? %>
28
- <%= link_to search_path_by_resource_type(type), class: "filter#{" is-active" if params.dig(:filter, :with_resource_type) == type}" do %>
28
+ <li>
29
+ <%= link_to search_path_by_resource_type(type), class: "filter#{" is-active" if params.dig(:filter, :with_resource_type) == type}", "aria-current": params.dig(:filter, :with_resource_type) == type ? "true" : "" do %>
29
30
  <%= resource_type_icon(type) %>
30
31
  <span><%= searchable_resource_human_name(type) %></span>
31
32
  <span class="label ml-auto"><%= results[:count] %></span>
32
33
  <% end %>
34
+ </li>
33
35
  <% else %>
34
- <%= content_tag :div, class: "filter#{" is-empty" if results[:count].zero?}" do %>
36
+ <%= content_tag :li, class: "filter#{" is-empty" if results[:count].zero?}" do %>
35
37
  <%= resource_type_icon(type) %>
36
38
  <span><%= searchable_resource_human_name(type) %></span>
37
39
  <span class="label ml-auto"><%= results[:count] %></span>
38
40
  <% end %>
39
41
  <% end %>
40
- </div>
41
- <% end %>
42
- </div>
42
+ <% end %>
43
+ </ul>
44
+ </li>
43
45
  <% end %>
44
- </div>
46
+ </ul>
45
47
  </div>
46
48
  </nav>
49
+ <script type="text/javascript">
50
+ const button = document.querySelector('#dropdown-trigger-search');
51
+ const arrowDown = button.querySelector('svg:first-of-type');
52
+ const arrowUp = button.querySelector('svg:last-of-type');
53
+ const list = document.querySelector('#dropdown-menu-search');
54
+ // the arrow is up when user arrives on the page, with the list displayed
55
+ arrowUp.addEventListener('click', function(){
56
+ setTimeout(() => {
57
+ button.setAttribute('aria-expanded', 'false');
58
+ list.style.display = "none";
59
+ }, 300)
60
+ })
61
+ arrowDown.addEventListener('click', function(){
62
+ setTimeout(() => {
63
+ button.setAttribute('aria-expanded', 'true');
64
+ list.style.display = "block";
65
+ }, 300)
66
+ })
67
+ // 32 is code for space bar and 13 is code for enter
68
+ button.addEventListener('keydown', function(e){
69
+ if ((e.keyCode === 13 || e.keyCode === 32) && button.getAttribute('aria-expanded') === 'true') {
70
+ setTimeout(() => {
71
+ button.setAttribute('aria-expanded', 'false');
72
+ list.style.display = "none";
73
+ }, 300)
74
+ } else if ((e.keyCode === 13 || e.keyCode === 32) && button.getAttribute('aria-expanded') === 'false'){
75
+ setTimeout(() => {
76
+ button.setAttribute('aria-expanded', 'true');
77
+ list.style.display = "block";
78
+ }, 300)
79
+ }
80
+ })
81
+ </script>
@@ -1,5 +1,5 @@
1
1
  <% announcement = translated_attribute(current_settings.announcement).presence || translated_attribute(component_settings.announcement).presence %>
2
- <% if announcement %>
2
+ <% if strip_tags(announcement).present? %>
3
3
  <section class="layout-main__section">
4
4
  <%= cell("decidim/announcement", announcement, local_assigns.merge(callout_class: "editor-content")) %>
5
5
  </section>
@@ -1,16 +1,14 @@
1
1
  <%= decidim_modal id: "confirm-modal" do %>
2
2
  <div data-dialog-container>
3
- <%= icon "delete-bin-line" %>
4
3
  <h2 class="h2" data-dialog-title id="dialog-title-confirm-modal"><%= t("title", scope: "decidim.shared.confirm_modal") %></h2>
5
-
6
4
  <div data-confirm-modal-content></div>
7
5
  </div>
8
6
 
9
- <div data-dialog-actions>
10
- <button class="button button__lg button__transparent-secondary" data-confirm-cancel data-dialog-close="confirm-modal">
7
+ <div data-dialog-actions class="flex flex-col-reverse md:flex-row">
8
+ <button class="button button__lg button__transparent-secondary w-full md:w-auto" data-confirm-cancel data-dialog-close="confirm-modal">
11
9
  <span><%= t("cancel", scope: "decidim.shared.confirm_modal") %></span>
12
10
  </button>
13
- <button class="button button__lg button__secondary" data-confirm-ok>
11
+ <button class="button button__lg button__secondary w-full md:w-auto" data-confirm-ok>
14
12
  <span><%= t("ok", scope: "decidim.shared.confirm_modal") %></span>
15
13
  </button>
16
14
  </div>
@@ -14,18 +14,20 @@
14
14
 
15
15
  <div id="dropdown-menu-filters">
16
16
  <% if local_assigns.has_key?(:skip_to_id) %>
17
- <%= link_to t("skip", scope: "decidim.shared.filter_form_help"), "##{skip_to_id}", class: "filter-skip", role: "menuitem" %>
17
+ <%= link_to t("skip", scope: "decidim.shared.filter_form_help"), "##{skip_to_id}", class: "filter-skip", role: "menuitem", "data-skip-to-content": true %>
18
18
  <% end %>
19
- <p class="filter-help" role="menuitem" aria-disabled="true"><%= t("help", scope: "decidim.shared.filter_form_help") %></p>
19
+
20
+ <p id="filter-help-text" class="filter-help" role="menuitem" aria-disabled="true"><%= t("help", scope: "decidim.shared.filter_form_help") %></p>
20
21
 
21
22
  <% if local_assigns.has_key?(:search_variable) %>
22
23
  <div class="filter-search filter-container" role="menuitem">
23
24
  <%= form.search_field search_variable,
24
25
  label: false,
25
26
  placeholder: search_label,
26
- title: search_label,
27
- "aria-label": search_label %>
28
- <button type="submit" aria-label="<%= search_label %>">
27
+ title: filter_search_label(search_label, skip_to_id),
28
+ "aria-label": filter_search_label(search_label, skip_to_id),
29
+ "aria-describedby": "filter-help-text" %>
30
+ <button type="submit" aria-label="<%= filter_search_label(search_label, skip_to_id) %>">
29
31
  <%= icon "search-line" %>
30
32
  </button>
31
33
  </div>
@@ -8,7 +8,7 @@
8
8
 
9
9
  <body class="text-black text-md form-defaults<%= yield (:body_class) %>">
10
10
  <!--noindex--><!--googleoff: all-->
11
- <%= link_to t("skip_button", scope: "decidim.accessibility"), "#content", class: "layout-container__skip" %>
11
+ <%= link_to t("skip_button", scope: "decidim.accessibility"), "#content", class: "layout-container__skip", "data-skip-to-content": true %>
12
12
  <%= cell("decidim/data_consent", current_organization) %>
13
13
  <!--googleon: all--><!--/noindex-->
14
14
 
@@ -7,6 +7,7 @@ js_configs = {
7
7
  "mentionsModal": {
8
8
  "removeRecipient": t("decidim.shared.mentions_modal.remove_recipient", name: "%name%")
9
9
  },
10
+ "confirmUnload": t("decidim.shared.confirm_unload"),
10
11
  emojis: I18n.t("emojis").deep_transform_keys { |k| k.to_s.camelize(:lower) },
11
12
  editor: I18n.t("editor"),
12
13
  date: I18n.t("date"),
@@ -11,7 +11,7 @@
11
11
  <nav class="md:w-1/2 lg:w-auto" role="navigation" aria-label="Legal">
12
12
  <%= render partial: "layouts/decidim/footer/main_legal" %>
13
13
  </nav>
14
- <nav class="w-full md:w-auto md:ml-auto" role="navigation" aria-label="Social media">
14
+ <nav class="w-full md:w-auto md:ml-auto" role="navigation" aria-label="<%= t("layouts.decidim.footer.social_media") %>">
15
15
  <%= render partial: "layouts/decidim/footer/main_social_media_links" %>
16
16
  </nav>
17
17
  <%= render partial: "layouts/decidim/footer/main_language_chooser" %>
@@ -1,6 +1,6 @@
1
1
  <% if current_organization.official_img_footer.attached? %>
2
2
  <%= link_to current_organization.official_url, class: "block mb-6" do %>
3
- <%= image_tag current_organization.attached_uploader(:official_img_footer).url, alt: current_organization_name, class: "max-h-16" %>
3
+ <%= image_tag current_organization.attached_uploader(:official_img_footer).url, alt: t("layouts.decidim.footer.current_organization_img", organization: current_organization_name), class: "max-h-16" %>
4
4
  <% end %>
5
5
  <% end %>
6
6
  <div class="text-sm text-white prose">
@@ -4,9 +4,9 @@
4
4
  <a rel="decidim noopener noreferrer" href="https://decidim.org/" target="_blank" data-external-link="text-only">
5
5
  <%= image_pack_tag("media/images/decidim-logo.svg", alt: t("layouts.decidim.footer.decidim_logo"), class: "max-h-8 block") %>
6
6
  </a>
7
- <div class="text-xs mt-2 [&_a]:underline">
7
+ <p class="text-xs mt-2 [&_a]:underline">
8
8
  <%= t("layouts.decidim.footer.made_with_open_source").html_safe %>
9
- </div>
9
+ </p>
10
10
  </div>
11
11
  <a class="flex gap-1 hover:opacity-50" rel="license noopener noreferrer" href="http://creativecommons.org/licenses/by-sa/4.0/" target="_blank" data-external-link="text-only">
12
12
  <span class="sr-only"><%= t("layouts.decidim.footer.cc_by_license") %></span>
@@ -8,10 +8,10 @@
8
8
  <%= render partial: "layouts/decidim/logo_mobile", locals: { organization: current_organization } %>
9
9
  </div>
10
10
  </div>
11
- <div class="main-bar__search">
11
+ <div role="search" class="main-bar__search">
12
12
  <%= render partial: "layouts/decidim/header/main_search" %>
13
13
  </div>
14
- <div class="main-bar__links-desktop">
14
+ <div role="navigation" class="main-bar__links-desktop">
15
15
  <%= render partial: "layouts/decidim/header/main_links_desktop" %>
16
16
  </div>
17
17
  <div class="main-bar__menu-mobile">
@@ -30,6 +30,12 @@
30
30
  <% unread_data = current_user_unread_data %>
31
31
  <% if unread_data[:unread_items] %>
32
32
  <%= content_tag :span, "", class: "main-bar__notification", data: unread_data %>
33
+ <% if unread_data[:unread_notifications] %>
34
+ <%= content_tag :span, t("layouts.decidim.user_menu.unread_notifications"), class: "sr-only" %>
35
+ <% end %>
36
+ <% if unread_data[:unread_conversations] %>
37
+ <%= content_tag :span, t("layouts.decidim.user_menu.unread_conversations"), class: "sr-only" %>
38
+ <% end %>
33
39
  <% end %>
34
40
  <% if current_user.avatar.attached? %>
35
41
  <span class="main-bar__avatar">
@@ -17,6 +17,7 @@
17
17
  <span class="text-secondary"><%= t("layouts.decidim.user_menu.notifications") %></span>
18
18
  <% if unread_data[:unread_notifications] %>
19
19
  <%= content_tag :span, "", class: "main-bar__dropdown-notification", data: unread_data %>
20
+ <%= content_tag :span, t("layouts.decidim.user_menu.unread_notifications"), class: "sr-only" %>
20
21
  <% end %>
21
22
  <% end %>
22
23
  </li>
@@ -26,6 +27,7 @@
26
27
  <span class="text-secondary"><%= t("layouts.decidim.user_menu.conversations") %></span>
27
28
  <% if unread_data[:unread_conversations] %>
28
29
  <%= content_tag :span, "", class: "main-bar__dropdown-notification", data: unread_data %>
30
+ <%= content_tag :span, t("layouts.decidim.user_menu.unread_conversations"), class: "sr-only" %>
29
31
  <% end %>
30
32
  <% end %>
31
33
  </li>
@@ -10,7 +10,7 @@
10
10
  </div>
11
11
 
12
12
  <div>
13
- <div class="main-bar__links-mobile__trigger" onclick="document.querySelector('#dropdown-trigger-links-mobile').click();">
13
+ <div class="main-bar__links-mobile__trigger" onclick="document.querySelector('#dropdown-trigger-links-mobile').click();document.querySelector('#dropdown-menu-account-mobile').removeAttribute('aria-modal')">
14
14
  <%= icon "close-line" %>
15
15
  </div>
16
16
  </div>
@@ -1,7 +1,7 @@
1
1
  <% if available_locales.length > 1 %>
2
2
  <div>
3
3
  <button id="dropdown-trigger-language-chooser-mobile" data-component="dropdown" data-target="dropdown-menu-language-chooser-mobile" class="mt-8 rounded-lg py-0 bg-gray-5 h-10 border border-gray outline outline-1 outline-transparent">
4
- <span><%= t("name", scope: "locale" ) %></span>
4
+ <span class="ml-2"><%= t("name", scope: "locale" ) %></span>
5
5
  <%= icon "arrow-down-s-line" %>
6
6
  <%= icon "arrow-up-s-line" %>
7
7
  <span class="sr-only">
@@ -864,7 +864,6 @@ ar:
864
864
  reject_invitation: رفض
865
865
  group_members:
866
866
  actions:
867
- are_you_sure: هل أنت واثق؟
868
867
  promote_to_admin: جعل المشرف
869
868
  remove_from_group: إزالة المشارك
870
869
  index:
@@ -1053,10 +1052,8 @@ ar:
1053
1052
  unsubscribe:
1054
1053
  success: أنت غير مشترك بنجاح.
1055
1054
  token_error: انتهت صلاحية الرابط.
1056
- unsubscribe: إلغاء الاشتراك
1057
1055
  newsletters_opt_in_mailer:
1058
1056
  notify:
1059
- body_1: تزداد أهمية معالجة البيانات الشخصية وحمايتها بالنسبة لنا جميعًا. مع اللائحة العامة الجديدة لحماية البيانات (GDPR) المؤرخة 25 مايو 2018 ، أصبح للأفراد سيطرة أفضل على بياناتهم الشخصية. لهذا السبب نحتاج إلى "موافق" لمواصلة إرسال المعلومات ذات الصلة حول أنشطة %{organization_name}.
1060
1057
  body_2: 'كيف يمكنك أن تعطينا موافقتك؟ فقط انقر على الزر التالي:'
1061
1058
  body_3: مع هذه الموافقة ، ستتمكن من متابعة تلقي معلومات حول خدمات النظام الأساسي. على العكس من ذلك ، إذا لم نتلق تأكيدًا إيجابيًا من جانبك ، فسنوقف إرسال رسائلنا إليك. إذا أكدت رغبتك في أن تظل على اطلاع ، فسيكون لديك دائمًا خيار الإلغاء في أي وقت.
1062
1059
  button: نعم ، أرغب في متابعة تلقي المعلومات ذات الصلة
@@ -405,7 +405,7 @@ bg:
405
405
  newsletter: Получавайте извънреден бюлетин с подходяща информация
406
406
  newsletter_title: Разрешение за контакт с Вас
407
407
  nickname_help: Вашя псевдоним в %{organization}
408
- password_help: "Минимум %{minimun_characters} символа, не трябва да са разпространени (например, 123456) и трябва да са различни от вашите име и ел. поща."
408
+ password_help: "Минимум %{minimum_characters} символа, не трябва да са разпространени (например, 123456) и трябва да са различни от вашите име и ел. поща."
409
409
  sign_in: Вход
410
410
  sign_up: Регистрация
411
411
  sign_up_as:
@@ -1315,7 +1315,7 @@ bg:
1315
1315
  change_your_password: Промени паролата си
1316
1316
  confirm_new_password: Потвърди нова парола
1317
1317
  new_password: Нова парола
1318
- password_help: "Минимум %{minimun_characters} символа, не трябва да са разпространени (например, 123456) и трябва да са различни от вашите име и ел. поща."
1318
+ password_help: "Минимум %{minimum_characters} символа, не трябва да са разпространени (например, 123456) и трябва да са различни от вашите име и ел. поща."
1319
1319
  new:
1320
1320
  forgot_your_password: Забравили сте паролата си?
1321
1321
  send_me_reset_password_instructions: Изпрати ми инструкции за възстановяване на паролата
@@ -955,7 +955,6 @@ bg:
955
955
  title: Какви са значките?
956
956
  group_admins:
957
957
  actions:
958
- are_you_sure: Сигурни ли сте? Това няма да премахне участника от групата.
959
958
  demote_admin: Премахни администратор
960
959
  demote:
961
960
  error: Възникна проблем при премахването на този участник от списъка с администратори.
@@ -985,7 +984,6 @@ bg:
985
984
  error: Възникна проблем при приемането на заявката за присъединяване.
986
985
  success: Заявката за присъединяване е приета успешно.
987
986
  actions:
988
- are_you_sure: Сигурни ли сте?
989
987
  promote_to_admin: Направи администратор
990
988
  remove_from_group: Премахни участник
991
989
  index:
@@ -1215,11 +1213,9 @@ bg:
1215
1213
  main_image: Основно изображение
1216
1214
  newsletters:
1217
1215
  unsubscribe:
1218
- check_subscription: За да зададете предпочитанията си, отидете в страницата <a href="%{link}" target="_blank">настройки</a>.
1219
1216
  error: Възникна проблем при прекратяването на абонамента.
1220
1217
  success: Отписахте се успешно.
1221
1218
  token_error: Срокът на връзката е изтекъл.
1222
- unsubscribe: Отписване
1223
1219
  newsletters_opt_in:
1224
1220
  unauthorized: Съжаляваме, този линк вече не е активен.
1225
1221
  update:
@@ -1227,7 +1223,6 @@ bg:
1227
1223
  success: Настройките за бюлетина са успешно обновени.
1228
1224
  newsletters_opt_in_mailer:
1229
1225
  notify:
1230
- body_1: Обработката на личните данни и тяхната защита стават все по-важни за всички нас. С новия Общ регламент за защита на данните (GDPR) от 25 май 2018 г. лицата имат по-добър контрол върху личните си данни. Поради тази причина се нуждаем от вашето съгласие, за да продължим да изпращаме подходяща информация за дейностите на %{organization_name}.
1231
1226
  body_2: 'Как можете да ни дадете своето съгласие? Просто щракнете върху следния бутон:'
1232
1227
  body_3: С това съгласие ще продължите да получавате информация за дейностите в платформата. Ако не получим потвърждение от Ваша страна, ще спрем да ви изпращаме нашите съобщения. Дори да потвърдите, че желаете да бъдете информирани, винаги ще имате възможност да се откажете по всяко време.
1233
1228
  button: Да, желая да продължа да получавам подбрана информация