decidim-participatory_processes 0.22.0 → 0.23.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/participatory_processes/process_m/footer.erb +3 -3
  3. data/app/cells/decidim/participatory_processes/process_m_cell.rb +19 -0
  4. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_group.rb +3 -3
  5. data/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb +10 -5
  6. data/app/controllers/decidim/participatory_processes/admin/participatory_process_exports_controller.rb +4 -0
  7. data/app/controllers/decidim/participatory_processes/admin/participatory_process_user_roles_controller.rb +2 -1
  8. data/app/controllers/decidim/participatory_processes/{participatory_process_widgets_controller.rb → widgets_controller.rb} +2 -2
  9. data/app/forms/decidim/participatory_processes/admin/participatory_process_form.rb +5 -6
  10. data/app/forms/decidim/participatory_processes/admin/participatory_process_group_form.rb +4 -1
  11. data/app/forms/decidim/participatory_processes/admin/participatory_process_import_form.rb +3 -0
  12. data/app/forms/decidim/participatory_processes/admin/participatory_process_user_role_form.rb +3 -2
  13. data/app/helpers/decidim/participatory_processes/participatory_process_helper.rb +11 -0
  14. data/app/models/decidim/participatory_process.rb +13 -1
  15. data/app/models/decidim/participatory_process_group.rb +5 -0
  16. data/app/models/decidim/participatory_process_step.rb +3 -0
  17. data/app/permissions/decidim/participatory_processes/permissions.rb +1 -0
  18. data/app/presenters/decidim/participatory_processes/admin_log/participatory_process_group_presenter.rb +2 -2
  19. data/app/presenters/decidim/participatory_processes/admin_log/participatory_process_presenter.rb +2 -2
  20. data/app/presenters/decidim/participatory_processes/admin_log/participatory_process_user_role_presenter.rb +2 -2
  21. data/app/presenters/decidim/participatory_processes/participatory_process_metric_charts_presenter.rb +2 -2
  22. data/app/queries/decidim/participatory_processes/stats_participants_count.rb +6 -4
  23. data/app/serializers/decidim/participatory_processes/participatory_process_importer.rb +6 -4
  24. data/app/views/decidim/participatory_processes/participatory_processes/_promoted_process.html.erb +9 -4
  25. data/app/views/decidim/participatory_processes/participatory_processes/show.html.erb +1 -1
  26. data/app/views/layouts/decidim/participatory_process.html.erb +1 -0
  27. data/config/locales/am-ET.yml +1 -0
  28. data/config/locales/bg.yml +19 -0
  29. data/config/locales/ca.yml +4 -1
  30. data/config/locales/cs.yml +16 -13
  31. data/config/locales/da.yml +1 -0
  32. data/config/locales/de.yml +33 -30
  33. data/config/locales/en.yml +3 -0
  34. data/config/locales/eo.yml +1 -0
  35. data/config/locales/es-MX.yml +3 -0
  36. data/config/locales/es-PY.yml +3 -0
  37. data/config/locales/es.yml +5 -2
  38. data/config/locales/et.yml +1 -0
  39. data/config/locales/fi-plain.yml +4 -1
  40. data/config/locales/fi.yml +7 -4
  41. data/config/locales/fr-CA.yml +3 -0
  42. data/config/locales/fr.yml +9 -6
  43. data/config/locales/hr.yml +1 -0
  44. data/config/locales/is.yml +215 -0
  45. data/config/locales/it.yml +3 -3
  46. data/config/locales/ja-JP.yml +122 -122
  47. data/config/locales/ja.yml +445 -0
  48. data/config/locales/ko-KR.yml +1 -0
  49. data/config/locales/ko.yml +1 -0
  50. data/config/locales/lt.yml +1 -0
  51. data/config/locales/{lv-LV.yml → lv.yml} +0 -0
  52. data/config/locales/mt.yml +1 -0
  53. data/config/locales/nl.yml +4 -1
  54. data/config/locales/om-ET.yml +1 -0
  55. data/config/locales/pl.yml +152 -152
  56. data/config/locales/si-LK.yml +1 -0
  57. data/config/locales/sl.yml +4 -0
  58. data/config/locales/so-SO.yml +1 -0
  59. data/config/locales/sv.yml +11 -8
  60. data/config/locales/sw-KE.yml +1 -0
  61. data/config/locales/ti-ER.yml +1 -0
  62. data/config/locales/tr-TR.yml +53 -1
  63. data/config/locales/vi-VN.yml +1 -0
  64. data/config/locales/vi.yml +1 -0
  65. data/config/locales/zh-CN.yml +445 -0
  66. data/config/locales/zh-TW.yml +1 -0
  67. data/db/migrate/20201006072346_fix_attachments_titles.rb +38 -0
  68. data/lib/decidim/participatory_processes/admin_engine.rb +1 -0
  69. data/lib/decidim/participatory_processes/engine.rb +1 -1
  70. data/lib/decidim/participatory_processes/participatory_space.rb +11 -11
  71. data/lib/decidim/participatory_processes/test/factories.rb +3 -3
  72. data/lib/decidim/participatory_processes/version.rb +1 -1
  73. metadata +37 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4c87d3748ed5ddda107431eccbde08c257a669a9b0b6b87010cfc6dd1f6f5450
4
- data.tar.gz: 5a984b08e37fb702a0f8cc425189782e7acc298fe0f933d02b68c2f171ec9106
3
+ metadata.gz: 8a7d9401a97e25072d4fa8d7d7c93c350bd317a73254a7e2af1e545069975091
4
+ data.tar.gz: 169180c333f2fd47ec242f0c97e20fef22d23d9cf0bcf3d8b70c5ba83c06fdf5
5
5
  SHA512:
6
- metadata.gz: 04cb2351dd62f27e32155fe620953c7524216925686bef5be09d6fe30bfdebcdc12d45a79e577f414438c06cee0bc0a7f8396976386058bc2f40a21e5e21baa5
7
- data.tar.gz: 30dbc6a09f4f3f5c5f417b0a1c9be50c4bca044b415aea17364dd9623bd86f4c188635528e87f74a9d4ed97a0cb8a0f8142eed1706415f3264118d9237585eb7
6
+ metadata.gz: d608d180a2b8a66432202f038fe96be994146e192d00dc7e43bea6289e5ddefd9092827660bdf4bcd56954892bee8f577abd1124c382a534448316f17d2cdb27
7
+ data.tar.gz: bd3297b8df7165257e95f8a0f99e5f4e3a24375713bd005ce99261a8d2f14e3363a18610fa4fabb2dcc6aff7d9c8236bc5efd17a5916eb4339c2d6d2642030e3
@@ -6,9 +6,9 @@
6
6
  <div class="text-ellipsis"><strong><%= step_title %></strong></div>
7
7
  </div>
8
8
  <% end %>
9
- <%= link_to(resource_path, class: "card__button button button--sc small") do %>
10
- <span class="show-for-sr"><%= t(model.cta_button_text_key_accessible, resource_name: title, scope: "layouts.decidim.participatory_processes.participatory_process") %></span>
11
- <%= t(model.cta_button_text_key, scope: "layouts.decidim.participatory_processes.participatory_process") %>
9
+ <%= link_to(step_cta_path, class: "card__button button button--sc small") do %>
10
+ <span class="show-for-sr"><%= step_cta_text %></span>
11
+ <%= step_cta_text %>
12
12
  <% end %>
13
13
  </div>
14
14
  </div>
@@ -6,6 +6,7 @@ module Decidim
6
6
  # for an given instance of a Process
7
7
  class ProcessMCell < Decidim::CardMCell
8
8
  include Decidim::SanitizeHelper
9
+ include Decidim::TranslationsHelper
9
10
 
10
11
  private
11
12
 
@@ -39,6 +40,24 @@ module Decidim
39
40
  model.hero_image.url
40
41
  end
41
42
 
43
+ def step_cta_text
44
+ if translated_in_current_locale?(model.active_step&.cta_text)
45
+ translated_attribute(model.active_step.cta_text)
46
+ else
47
+ t(model.cta_button_text_key_accessible, resource_name: title, scope: "layouts.decidim.participatory_processes.participatory_process")
48
+ end
49
+ end
50
+
51
+ def step_cta_path
52
+ if model.active_step&.cta_path.present?
53
+ path, params = resource_path.split("?")
54
+
55
+ "#{path}/#{model.active_step.cta_path}" + (params.present? ? "?#{params}" : "")
56
+ else
57
+ resource_path
58
+ end
59
+ end
60
+
42
61
  def step_title
43
62
  translated_attribute model.active_step.title
44
63
  end
@@ -45,11 +45,11 @@ module Decidim
45
45
  form.current_user
46
46
  ) do
47
47
  ParticipatoryProcessGroup.create(
48
+ organization: form.current_organization,
48
49
  name: form.name,
49
50
  description: form.description,
50
- hero_image: form.hero_image,
51
- participatory_processes: participatory_processes,
52
- organization: form.current_organization
51
+ hero_image: form.hero_image, # Keep after organization
52
+ participatory_processes: participatory_processes
53
53
  )
54
54
  end
55
55
  end
@@ -57,10 +57,6 @@ module Decidim
57
57
  subtitle: form.subtitle,
58
58
  slug: form.slug,
59
59
  hashtag: form.hashtag,
60
- hero_image: form.hero_image,
61
- remove_hero_image: form.remove_hero_image,
62
- banner_image: form.banner_image,
63
- remove_banner_image: form.remove_banner_image,
64
60
  promoted: form.promoted,
65
61
  description: form.description,
66
62
  short_description: form.short_description,
@@ -81,7 +77,16 @@ module Decidim
81
77
  show_metrics: form.show_metrics,
82
78
  show_statistics: form.show_statistics,
83
79
  announcement: form.announcement
84
- }
80
+ }.merge(uploader_attributes)
81
+ end
82
+
83
+ def uploader_attributes
84
+ {
85
+ hero_image: form.hero_image,
86
+ remove_hero_image: form.remove_hero_image,
87
+ banner_image: form.banner_image,
88
+ remove_banner_image: form.remove_banner_image
89
+ }.delete_if { |_k, val| val.is_a?(Decidim::ApplicationUploader) }
85
90
  end
86
91
 
87
92
  def related_processes
@@ -11,6 +11,10 @@ module Decidim
11
11
  current_participatory_process
12
12
  end
13
13
 
14
+ def manifest_name
15
+ current_participatory_process.manifest.name.to_s
16
+ end
17
+
14
18
  def after_export_path
15
19
  participatory_processes_path
16
20
  end
@@ -25,12 +25,13 @@ module Decidim
25
25
  CreateParticipatoryProcessAdmin.call(@form, current_user, current_participatory_process) do
26
26
  on(:ok) do
27
27
  flash[:notice] = I18n.t("participatory_process_user_roles.create.success", scope: "decidim.admin")
28
+ redirect_to participatory_process_user_roles_path(current_participatory_process)
28
29
  end
29
30
 
30
31
  on(:invalid) do
31
32
  flash[:alert] = I18n.t("participatory_process_user_roles.create.error", scope: "decidim.admin")
33
+ render :new
32
34
  end
33
- redirect_to participatory_process_user_roles_path(current_participatory_process)
34
35
  end
35
36
  end
36
37
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  module ParticipatoryProcesses
5
- class ParticipatoryProcessWidgetsController < Decidim::WidgetsController
5
+ class WidgetsController < Decidim::WidgetsController
6
6
  helper Decidim::SanitizeHelper
7
7
 
8
8
  private
@@ -20,7 +20,7 @@ module Decidim
20
20
  end
21
21
 
22
22
  def iframe_url
23
- @iframe_url ||= participatory_process_participatory_process_widget_url(model)
23
+ @iframe_url ||= participatory_process_widget_url(model)
24
24
  end
25
25
  end
26
26
  end
@@ -8,6 +8,7 @@ module Decidim
8
8
  #
9
9
  class ParticipatoryProcessForm < Form
10
10
  include TranslatableAttributes
11
+ include Decidim::HasUploadValidations
11
12
 
12
13
  mimic :participatory_process
13
14
 
@@ -54,12 +55,10 @@ module Decidim
54
55
 
55
56
  validates :title, :subtitle, :description, :short_description, translatable_presence: true
56
57
 
57
- validates :banner_image,
58
- file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } },
59
- file_content_type: { allow: ["image/jpeg", "image/png"] }
60
- validates :hero_image,
61
- file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } },
62
- file_content_type: { allow: ["image/jpeg", "image/png"] }
58
+ validates :banner_image, passthru: { to: Decidim::ParticipatoryProcess }
59
+ validates :hero_image, passthru: { to: Decidim::ParticipatoryProcess }
60
+
61
+ alias organization current_organization
63
62
 
64
63
  def map_model(model)
65
64
  self.scope_id = model.decidim_scope_id
@@ -8,6 +8,7 @@ module Decidim
8
8
  #
9
9
  class ParticipatoryProcessGroupForm < Form
10
10
  include TranslatableAttributes
11
+ include Decidim::HasUploadValidations
11
12
 
12
13
  translatable_attribute :name, String
13
14
  translatable_attribute :description, String
@@ -20,7 +21,9 @@ module Decidim
20
21
 
21
22
  validates :name, :description, translatable_presence: true
22
23
 
23
- validates :hero_image, file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } }, file_content_type: { allow: ["image/jpeg", "image/png"] }
24
+ validates :hero_image, passthru: { to: Decidim::ParticipatoryProcessGroup }
25
+
26
+ alias organization current_organization
24
27
  end
25
28
  end
26
29
  end
@@ -13,6 +13,9 @@ module Decidim
13
13
  # Accepted mime types
14
14
  # keys: are used for dynamic help text on admin form.
15
15
  # values: are used to validate the file format of imported document.
16
+ #
17
+ # WARNING: consider adding/removing the relative translation key at
18
+ # decidim.participatory_processes.admin.new_import.accepted_types when modifying this hash
16
19
  ACCEPTED_TYPES = {
17
20
  json: JSON_MIME_TYPE
18
21
  }.freeze
@@ -13,10 +13,11 @@ module Decidim
13
13
  attribute :email, String
14
14
  attribute :role, String
15
15
 
16
- validates :email, :role, presence: true
17
- validates :name, presence: true
16
+ validates :name, :email, :role, presence: true
18
17
  validates :role, inclusion: { in: Decidim::ParticipatoryProcessUserRole::ROLES }
19
18
 
19
+ validates :name, format: { with: UserBaseEntity::REGEXP_NAME }
20
+
20
21
  def roles
21
22
  Decidim::ParticipatoryProcessUserRole::ROLES.map do |role|
22
23
  [
@@ -21,6 +21,17 @@ module Decidim
21
21
  dates = [participatory_process_step.start_date, participatory_process_step.end_date]
22
22
  dates.map { |date| date ? localize(date.to_date, format: :default) : "?" }.join(" - ")
23
23
  end
24
+
25
+ # Public: Returns the path for the participatory process cta button
26
+ #
27
+ # Returns a String with path.
28
+ def participatory_process_cta_path(process)
29
+ return participatory_process_path(process) if process.active_step&.cta_path.blank?
30
+
31
+ path, params = participatory_process_path(process).split("?")
32
+
33
+ "#{path}/#{process.active_step.cta_path}" + (params.present? ? "?#{params}" : "")
34
+ end
24
35
  end
25
36
  end
26
37
  end
@@ -11,7 +11,7 @@ module Decidim
11
11
  include Decidim::HasAttachmentCollections
12
12
  include Decidim::Participable
13
13
  include Decidim::Publicable
14
- include Decidim::Scopable
14
+ include Decidim::ScopableParticipatorySpace
15
15
  include Decidim::Followable
16
16
  include Decidim::HasReference
17
17
  include Decidim::Traceable
@@ -19,6 +19,11 @@ module Decidim
19
19
  include Decidim::Loggable
20
20
  include Decidim::ParticipatorySpaceResourceable
21
21
  include Decidim::Searchable
22
+ include Decidim::HasUploadValidations
23
+ include Decidim::TranslatableResource
24
+
25
+ translatable_fields :title, :subtitle, :short_description, :description, :developer_group, :meta_scope, :local_area,
26
+ :target, :participatory_scope, :participatory_structure, :announcement
22
27
 
23
28
  belongs_to :organization,
24
29
  foreign_key: "decidim_organization_id",
@@ -61,7 +66,10 @@ module Decidim
61
66
  validates :slug, uniqueness: { scope: :organization }
62
67
  validates :slug, presence: true, format: { with: Decidim::ParticipatoryProcess.slug_format }
63
68
 
69
+ validates_upload :hero_image
64
70
  mount_uploader :hero_image, Decidim::HeroImageUploader
71
+
72
+ validates_upload :banner_image
65
73
  mount_uploader :banner_image, Decidim::BannerImageUploader
66
74
 
67
75
  scope :past, -> { where(arel_table[:end_date].lt(Date.current)) }
@@ -160,6 +168,10 @@ module Decidim
160
168
  roles.where(role: role_name)
161
169
  end
162
170
 
171
+ def attachment_context
172
+ :admin
173
+ end
174
+
163
175
  # Allow ransacker to search for a key in a hstore column (`title`.`en`)
164
176
  ransacker :title do |parent|
165
177
  Arel::Nodes::InfixOperation.new("->>", parent.table[:title], Arel::Nodes.build_quoted(I18n.locale.to_s))
@@ -4,6 +4,10 @@ module Decidim
4
4
  class ParticipatoryProcessGroup < ApplicationRecord
5
5
  include Decidim::Resourceable
6
6
  include Decidim::Traceable
7
+ include Decidim::HasUploadValidations
8
+ include Decidim::TranslatableResource
9
+
10
+ translatable_fields :name, :description
7
11
 
8
12
  has_many :participatory_processes,
9
13
  foreign_key: "decidim_participatory_process_group_id",
@@ -15,6 +19,7 @@ module Decidim
15
19
  foreign_key: "decidim_organization_id",
16
20
  class_name: "Decidim::Organization"
17
21
 
22
+ validates_upload :hero_image
18
23
  mount_uploader :hero_image, Decidim::HeroImageUploader
19
24
 
20
25
  def self.log_presenter_class_for(_log)
@@ -5,9 +5,12 @@ module Decidim
5
5
  # components that will show up in the depending on what step is currently
6
6
  # active.
7
7
  class ParticipatoryProcessStep < ApplicationRecord
8
+ include Decidim::TranslatableResource
8
9
  include Traceable
9
10
  include Loggable
10
11
 
12
+ translatable_fields :title, :description, :cta_text
13
+
11
14
  belongs_to :participatory_process, foreign_key: "decidim_participatory_process_id", class_name: "Decidim::ParticipatoryProcess"
12
15
  has_one :organization, through: :participatory_process
13
16
 
@@ -233,6 +233,7 @@ module Decidim
233
233
  :process,
234
234
  :process_step,
235
235
  :process_user_role,
236
+ :space_private_user,
236
237
  :export_space,
237
238
  :import
238
239
  ].include?(permission_action.subject)
@@ -35,8 +35,8 @@ module Decidim
35
35
  "activemodel.attributes.participatory_process_group"
36
36
  end
37
37
 
38
- def has_diff?
39
- action == "unpublish" || super
38
+ def diff_actions
39
+ super + %w(unpublish)
40
40
  end
41
41
  end
42
42
  end
@@ -48,8 +48,8 @@ module Decidim
48
48
  "activemodel.attributes.participatory_process"
49
49
  end
50
50
 
51
- def has_diff?
52
- action == "unpublish" || super
51
+ def diff_actions
52
+ super + %w(unpublish)
53
53
  end
54
54
  end
55
55
  end
@@ -31,8 +31,8 @@ module Decidim
31
31
  ).changeset
32
32
  end
33
33
 
34
- def has_diff?
35
- action == "delete" || super
34
+ def diff_actions
35
+ super + %w(delete)
36
36
  end
37
37
 
38
38
  def action_string
@@ -8,8 +8,8 @@ module Decidim
8
8
 
9
9
  def params
10
10
  capture do
11
- concat(hidden_field_tag(:metrics_space_type, value: participatory_process.class, id: :"metrics-space_type"))
12
- concat(hidden_field_tag(:metrics_space_id, value: participatory_process.id, id: :"metrics-space_id"))
11
+ concat(hidden_field_tag(:metrics_space_type, participatory_process.class.name, id: :"metrics-space_type"))
12
+ concat(hidden_field_tag(:metrics_space_id, participatory_process.id, id: :"metrics-space_id"))
13
13
  end
14
14
  end
15
15
 
@@ -76,10 +76,12 @@ module Decidim
76
76
  end
77
77
 
78
78
  def project_supports_query
79
- Decidim::Budgets::Order
80
- .where(component: space_components)
81
- .pluck(:decidim_user_id)
82
- .uniq
79
+ Decidim::Budgets::Order.joins(budget: [:component])
80
+ .where(budget: {
81
+ decidim_components: { id: space_components.pluck(:id) }
82
+ })
83
+ .pluck(:decidim_user_id)
84
+ .uniq
83
85
  end
84
86
 
85
87
  def survey_answer_query
@@ -122,11 +122,11 @@ module Decidim
122
122
  attachment = Attachment.new(
123
123
  title: file["title"],
124
124
  description: file["description"],
125
- file: file_tmp,
126
- file_size: file_tmp.size,
127
125
  content_type: file_tmp.content_type,
128
126
  attached_to: @imported_process,
129
- weight: file["weight"]
127
+ weight: file["weight"],
128
+ file: file_tmp, # Define attached_to before this
129
+ file_size: file_tmp.size
130
130
  )
131
131
  attachment.create_attachment_collection(file["attachment_collection"])
132
132
  attachment.save!
@@ -169,7 +169,9 @@ module Decidim
169
169
 
170
170
  accepted = ["image", "application/pdf"]
171
171
  url = URI.parse(url)
172
- Net::HTTP.start(url.host, url.port) do |http|
172
+ http_connection = Net::HTTP.new(url.host, url.port)
173
+ http_connection.use_ssl = true if url.scheme == "https"
174
+ http_connection.start do |http|
173
175
  return http.head(url.request_uri)["Content-Type"].start_with?(*accepted)
174
176
  end
175
177
  rescue StandardError
@@ -3,7 +3,7 @@
3
3
  <div class="columns mediumlarge-8 large-6 card--process__column">
4
4
  <div class="card__content">
5
5
  <%= link_to participatory_process_path(promoted_process), class: "card__link" do %>
6
- <h2 class="card__title"><%= decidim_html_escape(translated_attribute(promoted_process.title)) %></h2>
6
+ <h2 class="card__title"><%= decidim_html_escape(translated_attribute(promoted_process.title)).html_safe %></h2>
7
7
  <% end %>
8
8
  <%= decidim_sanitize html_truncate(translated_attribute(promoted_process.short_description), length: 630, separator: "...") %>
9
9
  <%= link_to participatory_process_path(promoted_process), class: "button small hollow card__button" do %>
@@ -17,9 +17,14 @@
17
17
  style="background-image:url(<%= promoted_process.hero_image.url %>)">
18
18
  <div class="card__content row collapse">
19
19
  <div class="large-6 large-offset-6 columns">
20
- <%= link_to participatory_process_path(promoted_process), class: "button expanded button--sc" do %>
21
- <span class="show-for-sr"><%= t(promoted_process.cta_button_text_key_accessible, resource_name: translated_attribute(promoted_process.title), scope: "layouts.decidim.participatory_processes.promoted_process") %></span>
22
- <span aria-hidden="true"><%= t(promoted_process.cta_button_text_key, scope: "layouts.decidim.participatory_processes.promoted_process") %></span>
20
+ <%= link_to participatory_process_cta_path(promoted_process), class: "button expanded button--sc" do %>
21
+ <% if translated_in_current_locale?(promoted_process.active_step&.cta_text) %>
22
+ <span class="show-for-sr"><%= translated_attribute(promoted_process.active_step.cta_text) %></span>
23
+ <span aria-hidden="true"><%= translated_attribute(promoted_process.active_step.cta_text) %></span>
24
+ <% else %>
25
+ <span class="show-for-sr"><%= t(promoted_process.cta_button_text_key_accessible, resource_name: translated_attribute(promoted_process.title), scope: "layouts.decidim.participatory_processes.promoted_process") %></span>
26
+ <span aria-hidden="true"><%= t(promoted_process.cta_button_text_key, scope: "layouts.decidim.participatory_processes.promoted_process") %></span>
27
+ <% end %>
23
28
  <% if promoted_process.active_step %>
24
29
  <span class="button__info">
25
30
  <%= t("participatory_processes.promoted_process.active_step", scope: "layouts.decidim") %> <%= translated_attribute promoted_process.active_step.title %>