decidim-admin 0.21.0 → 0.22.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of decidim-admin might be problematic. Click here for more details.

Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/decidim/admin/application.js.es6 +4 -0
  3. data/app/assets/javascripts/decidim/admin/budget_rule_toggler.component.js.es6 +52 -0
  4. data/app/assets/javascripts/decidim/admin/bundle.js +7 -7
  5. data/app/assets/javascripts/decidim/admin/bundle.js.map +1 -1
  6. data/app/assets/javascripts/decidim/admin/dynamic_fields.component.js.es6 +24 -5
  7. data/app/assets/javascripts/decidim/admin/form.js.es6 +23 -10
  8. data/app/assets/javascripts/decidim/admin/gallery.js.es6 +5 -0
  9. data/app/assets/javascripts/decidim/admin/officializations.js.es6 +20 -0
  10. data/app/assets/stylesheets/decidim/admin/_decidim.scss +2 -0
  11. data/app/assets/stylesheets/decidim/admin/_variables.scss +1 -1
  12. data/app/assets/stylesheets/decidim/admin/extra/_newsletter-templates-gallery.scss +3 -0
  13. data/app/assets/stylesheets/decidim/admin/extra/_organization-appearance.scss +141 -0
  14. data/app/assets/stylesheets/decidim/admin/extra/_show_email.scss +31 -0
  15. data/app/assets/stylesheets/decidim/admin/extra/_title_bar.scss +4 -0
  16. data/app/assets/stylesheets/decidim/admin/modules/_buttons.scss +10 -1
  17. data/app/assets/stylesheets/decidim/admin/modules/_cards.scss +2 -2
  18. data/app/assets/stylesheets/decidim/admin/modules/_filters.scss +2 -2
  19. data/app/assets/stylesheets/decidim/admin/modules/_forms.scss +2 -2
  20. data/app/assets/stylesheets/decidim/admin/modules/_import_result.scss +10 -0
  21. data/app/assets/stylesheets/decidim/admin/modules/_loading-spinner.scss +11 -0
  22. data/app/assets/stylesheets/decidim/admin/modules/_main-nav.scss +0 -1
  23. data/app/assets/stylesheets/decidim/admin/modules/_modules.scss +5 -1
  24. data/app/assets/stylesheets/decidim/admin/modules/_process-header.scss +0 -1
  25. data/app/assets/stylesheets/decidim/admin/modules/_secondary-nav.scss +0 -1
  26. data/app/assets/stylesheets/decidim/admin/modules/_table-list.scss +0 -5
  27. data/app/assets/stylesheets/decidim/admin/modules/_users_statistics.scss +18 -0
  28. data/app/assets/stylesheets/decidim/admin/utils/_mixins.scss +42 -0
  29. data/app/assets/stylesheets/decidim/admin/utils/_settings.scss +4 -1
  30. data/app/cells/decidim/admin/content_block/show.erb +2 -2
  31. data/app/commands/decidim/admin/create_newsletter.rb +34 -9
  32. data/app/commands/decidim/admin/reorder_content_blocks.rb +1 -1
  33. data/app/commands/decidim/admin/update_component.rb +27 -3
  34. data/app/commands/decidim/admin/update_content_block.rb +2 -1
  35. data/app/commands/decidim/admin/update_newsletter.rb +31 -9
  36. data/app/commands/decidim/admin/update_organization_appearance.rb +3 -1
  37. data/app/controllers/decidim/admin/authorization_workflows_controller.rb +6 -0
  38. data/app/controllers/decidim/admin/components_controller.rb +6 -5
  39. data/app/controllers/decidim/admin/dashboard_controller.rb +33 -1
  40. data/app/controllers/decidim/admin/metrics_controller.rb +22 -0
  41. data/app/controllers/decidim/admin/newsletter_templates_controller.rb +41 -0
  42. data/app/controllers/decidim/admin/newsletters_controller.rb +22 -4
  43. data/app/controllers/decidim/admin/officializations_controller.rb +8 -0
  44. data/app/controllers/decidim/admin/organization_appearance_controller.rb +1 -0
  45. data/app/controllers/decidim/admin/organization_controller.rb +4 -3
  46. data/app/controllers/decidim/admin/organization_homepage_content_blocks_controller.rb +1 -1
  47. data/app/forms/decidim/admin/component_form.rb +0 -23
  48. data/app/forms/decidim/admin/newsletter_form.rb +15 -3
  49. data/app/forms/decidim/admin/organization_appearance_form.rb +2 -0
  50. data/app/helpers/decidim/admin/filterable_helper.rb +35 -27
  51. data/app/helpers/decidim/admin/icon_link_helper.rb +1 -1
  52. data/app/helpers/decidim/admin/settings_helper.rb +47 -59
  53. data/app/helpers/decidim/admin/uploader_image_dimensions_helper.rb +30 -0
  54. data/app/models/decidim/admin/fake_newsletter.rb +49 -0
  55. data/app/permissions/decidim/admin/permissions.rb +6 -0
  56. data/app/presenters/decidim/admin/dashboard_metric_charts_presenter.rb +57 -0
  57. data/app/queries/decidim/admin/active_users_counter.rb +35 -0
  58. data/app/views/decidim/admin/attachment_collections/index.html.erb +1 -1
  59. data/app/views/decidim/admin/authorization_workflows/index.html.erb +1 -0
  60. data/app/views/decidim/admin/categories/index.html.erb +1 -1
  61. data/app/views/decidim/admin/components/_settings_fields.html.erb +2 -2
  62. data/app/views/decidim/admin/dashboard/show.html.erb +35 -10
  63. data/app/views/decidim/admin/impersonatable_users/index.html.erb +2 -2
  64. data/app/views/decidim/admin/metrics/_metrics.html.erb +21 -0
  65. data/app/views/decidim/admin/metrics/index.html.erb +7 -0
  66. data/app/views/decidim/admin/newsletter_templates/index.html.erb +28 -0
  67. data/app/views/decidim/admin/newsletter_templates/show.html.erb +12 -0
  68. data/app/views/decidim/admin/newsletters/_form.html.erb +1 -7
  69. data/app/views/decidim/admin/newsletters/edit.html.erb +1 -1
  70. data/app/views/decidim/admin/newsletters/index.html.erb +1 -1
  71. data/app/views/decidim/admin/newsletters/new.html.erb +1 -1
  72. data/app/views/decidim/admin/officializations/_show_email_modal.html.erb +31 -0
  73. data/app/views/decidim/admin/officializations/index.html.erb +7 -3
  74. data/app/views/decidim/admin/officializations/show_email.html.erb +2 -0
  75. data/app/views/decidim/admin/organization_appearance/_form.html.erb +2 -72
  76. data/app/views/decidim/admin/organization_appearance/form/_colors.html.erb +23 -0
  77. data/app/views/decidim/admin/organization_appearance/form/_images.html.erb +38 -0
  78. data/app/views/decidim/admin/organization_appearance/form/_minimap.html.erb +46 -0
  79. data/app/views/decidim/admin/resource_permissions/_options_form.html.erb +1 -1
  80. data/app/views/decidim/admin/shared/_filters.html.erb +3 -3
  81. data/app/views/decidim/admin/shared/_gallery.html.erb +21 -0
  82. data/app/views/decidim/admin/user_groups/index.html.erb +4 -4
  83. data/app/views/decidim/admin/users_statistics/_users_count.html.erb +39 -0
  84. data/app/views/layouts/decidim/admin/_application.html.erb +1 -0
  85. data/app/views/layouts/decidim/admin/_header.html.erb +2 -0
  86. data/app/views/layouts/decidim/admin/_title_bar.html.erb +20 -10
  87. data/app/views/layouts/decidim/admin/newsletters.erb +1 -1
  88. data/config/locales/ar.yml +12 -6
  89. data/config/locales/bg-BG.yml +16 -0
  90. data/config/locales/ca.yml +46 -6
  91. data/config/locales/cs.yml +89 -49
  92. data/config/locales/da-DK.yml +1 -0
  93. data/config/locales/de.yml +102 -6
  94. data/config/locales/el.yml +848 -0
  95. data/config/locales/en.yml +46 -6
  96. data/config/locales/eo-UY.yml +0 -1
  97. data/config/locales/es-MX.yml +46 -6
  98. data/config/locales/es-PY.yml +46 -6
  99. data/config/locales/es.yml +46 -6
  100. data/config/locales/et-EE.yml +1 -0
  101. data/config/locales/eu.yml +12 -6
  102. data/config/locales/fi-plain.yml +46 -6
  103. data/config/locales/fi.yml +61 -21
  104. data/config/locales/fr-CA.yml +849 -0
  105. data/config/locales/fr.yml +83 -6
  106. data/config/locales/ga-IE.yml +1 -0
  107. data/config/locales/gl.yml +12 -6
  108. data/config/locales/hr-HR.yml +1 -0
  109. data/config/locales/hu.yml +46 -6
  110. data/config/locales/id-ID.yml +12 -6
  111. data/config/locales/is-IS.yml +10 -5
  112. data/config/locales/it.yml +78 -38
  113. data/config/locales/ja-JP.yml +849 -0
  114. data/config/locales/lt-LT.yml +1 -0
  115. data/config/locales/lv-LV.yml +835 -0
  116. data/config/locales/mt-MT.yml +1 -0
  117. data/config/locales/nl.yml +63 -6
  118. data/config/locales/no.yml +80 -43
  119. data/config/locales/pl.yml +309 -185
  120. data/config/locales/pt-BR.yml +13 -7
  121. data/config/locales/pt.yml +331 -207
  122. data/config/locales/ro-RO.yml +844 -0
  123. data/config/locales/ru.yml +11 -5
  124. data/config/locales/sk-SK.yml +823 -0
  125. data/config/locales/sk.yml +842 -0
  126. data/config/locales/sl.yml +175 -0
  127. data/config/locales/sr-CS.yml +625 -0
  128. data/config/locales/sv.yml +94 -12
  129. data/config/locales/tr-TR.yml +12 -6
  130. data/config/locales/uk.yml +10 -5
  131. data/config/routes.rb +13 -2
  132. data/lib/decidim/admin/engine.rb +2 -1
  133. data/lib/decidim/admin/version.rb +1 -1
  134. metadata +53 -18
@@ -102,7 +102,9 @@ module Decidim
102
102
  secondary: form.secondary_color,
103
103
  success: form.success_color,
104
104
  warning: form.warning_color,
105
- alert: form.alert_color
105
+ alert: form.alert_color,
106
+ highlight: form.highlight_color,
107
+ "highlight-alternative": form.highlight_alternative_color
106
108
  }
107
109
  }
108
110
  end
@@ -9,6 +9,12 @@ module Decidim
9
9
  enforce_permission_to :index, :authorization_workflow
10
10
 
11
11
  @workflows = Decidim::Verifications.admin_workflows
12
+
13
+ # Decidim::Verifications::Authorizations Query
14
+ @authorizations = Decidim::Verifications::Authorizations.new(
15
+ organization: current_organization,
16
+ granted: true
17
+ ).query
12
18
  end
13
19
  end
14
20
  end
@@ -23,11 +23,11 @@ module Decidim
23
23
  participatory_space: current_participatory_space
24
24
  )
25
25
 
26
- @form = form(ComponentForm).from_model(@component)
26
+ @form = form(@component.form_class).from_model(@component)
27
27
  end
28
28
 
29
29
  def create
30
- @form = form(ComponentForm).from_params(component_params)
30
+ @form = form(manifest.component_form_class).from_params(component_params)
31
31
  enforce_permission_to :create, :component
32
32
 
33
33
  CreateComponent.call(@form) do
@@ -47,12 +47,12 @@ module Decidim
47
47
  @component = query_scope.find(params[:id])
48
48
  enforce_permission_to :update, :component, component: @component
49
49
 
50
- @form = form(ComponentForm).from_model(@component)
50
+ @form = form(@component.form_class).from_model(@component)
51
51
  end
52
52
 
53
53
  def update
54
54
  @component = query_scope.find(params[:id])
55
- @form = form(ComponentForm).from_params(component_params)
55
+ @form = form(@component.form_class).from_params(component_params)
56
56
  enforce_permission_to :update, :component, component: @component
57
57
 
58
58
  UpdateComponent.call(@form, @component) do
@@ -113,7 +113,7 @@ module Decidim
113
113
 
114
114
  private
115
115
 
116
- # Processes the component params so Decidim::Admin::ComponentForm
116
+ # Processes the component params so the form object defined in the manifest (component_form_class_name)
117
117
  # can assign and validate the attributes when using #from_params.
118
118
  def component_params
119
119
  new_settings = proc { |name, data| Component.build_settings(manifest, name, data, current_organization) }
@@ -126,6 +126,7 @@ module Decidim
126
126
  if hsh[:default_step_settings]
127
127
  hsh[:default_step_settings] = new_settings.call(:step, hsh[:default_step_settings])
128
128
  else
129
+ hsh[:step_settings] ||= {}
129
130
  hsh[:step_settings].each do |key, value|
130
131
  hsh[:step_settings][key] = new_settings.call(:step, value)
131
132
  end
@@ -6,6 +6,8 @@ module Decidim
6
6
  #
7
7
  class DashboardController < Decidim::Admin::ApplicationController
8
8
  helper_method :latest_action_logs
9
+ helper_method :users_counter
10
+ helper_method :metrics_presenter
9
11
 
10
12
  def show
11
13
  enforce_permission_to :read, :admin_dashboard
@@ -19,7 +21,37 @@ module Decidim
19
21
  .includes(:participatory_space, :user, :resource, :component, :version)
20
22
  .for_admin
21
23
  .order(created_at: :desc)
22
- .first(20)
24
+ .first(5)
25
+ end
26
+
27
+ def metrics_presenter
28
+ @metrics_presenter ||= Decidim::Admin::DashboardMetricChartsPresenter.new(
29
+ summary: true,
30
+ organization: current_organization
31
+ )
32
+ end
33
+
34
+ def users_counter
35
+ last_day = Time.zone.yesterday
36
+ last_week = Time.zone.today.prev_week
37
+ last_month = Time.zone.today.prev_month
38
+
39
+ {
40
+ total_admins_last_24: users_count(last_day, true),
41
+ total_admins_last_week: users_count(last_week, true),
42
+ total_admins_last_month: users_count(last_month, true),
43
+ total_participants_last_24: users_count(last_day, false),
44
+ total_participants_last_week: users_count(last_week, false),
45
+ total_participants_last_month: users_count(last_month, false)
46
+ }
47
+ end
48
+
49
+ def users_count(date, admin)
50
+ @users_count = Decidim::Admin::ActiveUsersCounter.new(
51
+ organization: current_organization,
52
+ date: date,
53
+ admin: admin
54
+ ).query.count
23
55
  end
24
56
  end
25
57
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ class MetricsController < Decidim::Admin::ApplicationController
6
+ helper_method :metrics_presenter
7
+
8
+ def index
9
+ enforce_permission_to :read, :metrics
10
+ end
11
+
12
+ private
13
+
14
+ def metrics_presenter
15
+ @metrics_presenter ||= Decidim::Admin::DashboardMetricChartsPresenter.new(
16
+ summary: false,
17
+ organization: current_organization
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # Controller that allows managing newsletters.
6
+ class NewsletterTemplatesController < Decidim::Admin::ApplicationController
7
+ helper_method :templates, :template_manifest
8
+
9
+ layout "decidim/admin/newsletters"
10
+
11
+ def index
12
+ enforce_permission_to :index, :newsletter
13
+ end
14
+
15
+ def show; end
16
+
17
+ def preview
18
+ email = NewsletterMailer.newsletter(current_user, fake_newsletter)
19
+ Premailer::Rails::Hook.perform(email)
20
+ render html: email.html_part.body.decoded.html_safe
21
+ end
22
+
23
+ private
24
+
25
+ def templates
26
+ @templates ||= Decidim.content_blocks.for(:newsletter_template)
27
+ end
28
+
29
+ def template_manifest
30
+ @template_manifest ||= Decidim
31
+ .content_blocks
32
+ .for(:newsletter_template)
33
+ .find { |manifest| manifest.name.to_s == params[:id] }
34
+ end
35
+
36
+ def fake_newsletter
37
+ @fake_newsletter ||= Decidim::Admin::FakeNewsletter.new(current_organization, template_manifest)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -7,7 +7,7 @@ module Decidim
7
7
  include Decidim::NewslettersHelper
8
8
  include Decidim::Admin::NewslettersHelper
9
9
  include Paginable
10
- helper_method :newsletter, :recipients_count_query
10
+ helper_method :newsletter, :recipients_count_query, :content_block
11
11
 
12
12
  def index
13
13
  enforce_permission_to :index, :newsletter
@@ -17,7 +17,7 @@ module Decidim
17
17
 
18
18
  def new
19
19
  enforce_permission_to :create, :newsletter
20
- @form = form(NewsletterForm).instance
20
+ @form = form(NewsletterForm).from_model(content_block)
21
21
  end
22
22
 
23
23
  def show
@@ -37,7 +37,7 @@ module Decidim
37
37
  enforce_permission_to :create, :newsletter
38
38
  @form = form(NewsletterForm).from_params(params)
39
39
 
40
- CreateNewsletter.call(@form, current_user) do
40
+ CreateNewsletter.call(@form, content_block, current_user) do
41
41
  on(:ok) do |newsletter|
42
42
  flash.now[:notice] = I18n.t("newsletters.create.success", scope: "decidim.admin")
43
43
  redirect_to action: :show, id: newsletter.id
@@ -53,7 +53,7 @@ module Decidim
53
53
 
54
54
  def edit
55
55
  enforce_permission_to :update, :newsletter, newsletter: newsletter
56
- @form = form(NewsletterForm).from_model(newsletter)
56
+ @form = form(NewsletterForm).from_model(content_block)
57
57
  end
58
58
 
59
59
  def update
@@ -138,6 +138,24 @@ module Decidim
138
138
  @form ||= form(SelectiveNewsletterForm).instance
139
139
  NewsletterRecipients.for(@form).size
140
140
  end
141
+
142
+ def content_block
143
+ @content_block ||= content_block_for_newsletter || content_block_from_manifest
144
+ end
145
+
146
+ def content_block_from_manifest
147
+ Decidim::ContentBlock.new(
148
+ organization: current_organization,
149
+ scope_name: :newsletter_template,
150
+ manifest_name: params[:newsletter_template_id]
151
+ )
152
+ end
153
+
154
+ def content_block_for_newsletter
155
+ return nil unless @newsletter
156
+
157
+ @content_block_for_newsletter ||= @newsletter.template
158
+ end
141
159
  end
142
160
  end
143
161
  end
@@ -49,6 +49,14 @@ module Decidim
49
49
  end
50
50
  end
51
51
 
52
+ def show_email
53
+ enforce_permission_to :show_email, :user, user: user
54
+
55
+ Decidim.traceability.perform_action! :show_email, user, current_user
56
+
57
+ render :show_email, layout: false
58
+ end
59
+
52
60
  private
53
61
 
54
62
  def collection
@@ -5,6 +5,7 @@ module Decidim
5
5
  # Controller that allows managing the appearance of the organization.
6
6
  class OrganizationAppearanceController < Decidim::Admin::ApplicationController
7
7
  layout "decidim/admin/settings"
8
+ helper Decidim::Admin::UploaderImageDimensionsHelper
8
9
 
9
10
  def edit
10
11
  enforce_permission_to :update, :organization, organization: current_organization
@@ -37,10 +37,11 @@ module Decidim
37
37
  query = if term.start_with?("@")
38
38
  query.where("nickname ILIKE ?", "#{term.delete("@")}%")
39
39
  else
40
- query.where("name ILIKE ?", "%#{term}%")
40
+ query.where("name ILIKE ?", "%#{term}%").or(
41
+ query.where("email ILIKE ?", "%#{term}%")
42
+ )
41
43
  end
42
-
43
- render json: query.all.collect { |u| { value: u.id, label: "#{u.name} (@#{u.nickname})" } }
44
+ render json: query.all.collect { |u| { value: u.id, label: "#{u.name} (@#{u.nickname}) #{u.email}" } }
44
45
  else
45
46
  render json: []
46
47
  end
@@ -55,7 +55,7 @@ module Decidim
55
55
  def content_block_from_manifest
56
56
  Decidim::ContentBlock.create!(
57
57
  organization: current_organization,
58
- scope: :homepage,
58
+ scope_name: :homepage,
59
59
  manifest_name: params[:id]
60
60
  )
61
61
  end
@@ -23,9 +23,6 @@ module Decidim
23
23
  attribute :default_step_settings, Object
24
24
  attribute :step_settings, Hash[String => Object]
25
25
 
26
- validate :must_be_able_to_change_participatory_texts_setting
27
- validate :amendments_visibility_options_must_be_valid
28
-
29
26
  def settings?
30
27
  settings.manifest.attributes.any?
31
28
  end
@@ -54,26 +51,6 @@ module Decidim
54
51
  end
55
52
  validations.all?
56
53
  end
57
-
58
- # Validates setting `participatory_texts_enabled` is not changed when there are proposals for the component.
59
- def must_be_able_to_change_participatory_texts_setting
60
- return unless manifest&.name == :proposals && (component = Component.find_by(id: id))
61
- return unless settings.participatory_texts_enabled != component.settings.participatory_texts_enabled
62
-
63
- settings.errors.add(:participatory_texts_enabled) if Decidim::Proposals::Proposal.where(component: component).any?
64
- end
65
-
66
- # Validates setting `amendments_visibility` is included in Decidim::Amendment::VisibilityStepSetting.options.
67
- def amendments_visibility_options_must_be_valid
68
- return unless manifest&.name == :proposals && settings.amendments_enabled
69
-
70
- visibility_options = Decidim::Amendment::VisibilityStepSetting.options.map(&:last)
71
- step_settings.each do |step, settings|
72
- next unless visibility_options.exclude? settings[:amendments_visibility]
73
-
74
- step_settings[step].errors.add(:amendments_visibility, :inclusion)
75
- end
76
- end
77
54
  end
78
55
  end
79
56
  end
@@ -3,14 +3,26 @@
3
3
  module Decidim
4
4
  module Admin
5
5
  # The form that validates the data to construct a valid Newsletter.
6
- class NewsletterForm < Decidim::Form
6
+ class NewsletterForm < ContentBlockForm
7
7
  mimic :newsletter
8
8
 
9
9
  include TranslatableAttributes
10
10
 
11
11
  translatable_attribute :subject, String
12
- translatable_attribute :body, String
13
- validates :subject, :body, translatable_presence: true
12
+ validates :subject, translatable_presence: true
13
+
14
+ def map_model(content_block)
15
+ super(content_block)
16
+ self.subject = newsletter_for(content_block).try(:subject)
17
+ end
18
+
19
+ private
20
+
21
+ def newsletter_for(content_block)
22
+ Decidim::Newsletter
23
+ .where(organization: content_block.organization)
24
+ .find_by(id: content_block.scoped_resource_id)
25
+ end
14
26
  end
15
27
  end
16
28
  end
@@ -34,6 +34,8 @@ module Decidim
34
34
  attribute :success_color, String, default: "#57d685"
35
35
  attribute :warning_color, String, default: "#ffae00"
36
36
  attribute :alert_color, String, default: "#ec5840"
37
+ attribute :highlight_color, String, default: "#be6400"
38
+ attribute :highlight_alternative_color, String, default: "#ff5731"
37
39
 
38
40
  translatable_attribute :cta_button_text, String
39
41
  translatable_attribute :description, String
@@ -5,44 +5,46 @@ module Decidim
5
5
  # Helper that provides methods related to Decidim::Admin::Filterable concern.
6
6
  module FilterableHelper
7
7
  # Renders the filters selector with tags in the admin panel.
8
- def admin_filter_selector
9
- render partial: "decidim/admin/shared/filters"
8
+ def admin_filter_selector(i18n_ctx = nil)
9
+ render partial: "decidim/admin/shared/filters", locals: { i18n_ctx: i18n_ctx }
10
10
  end
11
11
 
12
12
  # Builds a tree of links from Decidim::Admin::Filterable::filters_with_values
13
- def submenu_options_tree
13
+ def submenu_options_tree(i18n_ctx = nil)
14
+ i18n_scope = filterable_i18n_scope_from_ctx(i18n_ctx)
15
+
14
16
  filters_with_values.each_with_object({}) do |(filter, values), hash|
15
- link = filter_link_label(filter)
17
+ link = filter_link_label(filter, i18n_scope)
16
18
  hash[link] = if values.is_a?(Array)
17
- build_submenu_options_tree_from_array(filter, values)
19
+ build_submenu_options_tree_from_array(filter, values, i18n_scope)
18
20
  elsif values.is_a?(Hash)
19
- build_submenu_options_tree_from_hash(filter, values)
21
+ build_submenu_options_tree_from_hash(filter, values, i18n_scope)
20
22
  end
21
23
  end
22
24
  end
23
25
 
24
26
  # Builds a tree of links from an array. The tree will have only one level.
25
- def build_submenu_options_tree_from_array(filter, values)
27
+ def build_submenu_options_tree_from_array(filter, values, i18n_scope)
26
28
  links = []
27
- links += extra_dropdown_submenu_options_items(filter)
28
- links += values.map { |value| filter_link_value(filter, value) }
29
+ links += extra_dropdown_submenu_options_items(filter, i18n_scope)
30
+ links += values.map { |value| filter_link_value(filter, value, i18n_scope) }
29
31
  links.each_with_object({}) { |link, hash| hash[link] = nil }
30
32
  end
31
33
 
32
34
  # To be overriden. Useful for adding links that do not match with the filter.
33
35
  # Must return an Array.
34
- def extra_dropdown_submenu_options_items(_filter)
36
+ def extra_dropdown_submenu_options_items(_filter, _i18n_scope)
35
37
  []
36
38
  end
37
39
 
38
40
  # Builds a tree of links from an Hash. The tree can have many levels.
39
- def build_submenu_options_tree_from_hash(filter, values)
41
+ def build_submenu_options_tree_from_hash(filter, values, i18n_scope)
40
42
  values.each_with_object({}) do |(key, value), hash|
41
- link = filter_link_value(filter, key)
43
+ link = filter_link_value(filter, key, i18n_scope)
42
44
  hash[link] = if value.nil?
43
45
  nil
44
46
  elsif value.is_a?(Hash)
45
- build_submenu_options_tree_from_hash(filter, value)
47
+ build_submenu_options_tree_from_hash(filter, value, i18n_scope)
46
48
  end
47
49
  end
48
50
  end
@@ -63,21 +65,21 @@ module Decidim
63
65
  end
64
66
  end
65
67
 
66
- def filter_link_label(filter)
67
- link_to(i18n_filter_label(filter), href: "#")
68
+ def filter_link_label(filter, i18n_scope)
69
+ link_to(i18n_filter_label(filter, i18n_scope), href: "#")
68
70
  end
69
71
 
70
- def filter_link_value(filter, value)
71
- link_to(i18n_filter_value(filter, value), query_params_with(filter => value))
72
+ def filter_link_value(filter, value, i18n_scope)
73
+ link_to(i18n_filter_value(filter, value, i18n_scope), query_params_with(filter => value))
72
74
  end
73
75
 
74
- def i18n_filter_label(filter)
75
- t("decidim.admin.filters.#{filter}.label")
76
+ def i18n_filter_label(filter, i18n_scope)
77
+ t("#{i18n_scope}.#{filter}.label")
76
78
  end
77
79
 
78
- def i18n_filter_value(filter, value)
79
- if I18n.exists?("decidim.admin.filters.#{filter}.values.#{value}")
80
- t(value, scope: "decidim.admin.filters.#{filter}.values")
80
+ def i18n_filter_value(filter, value, i18n_scope)
81
+ if I18n.exists?("#{i18n_scope}.#{filter}.values.#{value}")
82
+ t(value, scope: "#{i18n_scope}.#{filter}.values")
81
83
  else
82
84
  find_dynamic_translation(filter, value)
83
85
  end
@@ -94,16 +96,16 @@ module Decidim
94
96
  html.join.html_safe
95
97
  end
96
98
 
97
- def applied_filters_tags
99
+ def applied_filters_tags(i18n_ctx)
98
100
  ransack_params.slice(*filters).map do |filter, value|
99
- applied_filter_tag(filter, value)
101
+ applied_filter_tag(filter, value, filterable_i18n_scope_from_ctx(i18n_ctx))
100
102
  end.join.html_safe
101
103
  end
102
104
 
103
- def applied_filter_tag(filter, value)
105
+ def applied_filter_tag(filter, value, i18n_scope)
104
106
  content_tag(:span, class: "label secondary") do
105
- concat "#{i18n_filter_label(filter)}: "
106
- concat i18n_filter_value(filter, value)
107
+ concat "#{i18n_filter_label(filter, i18n_scope)}: "
108
+ concat i18n_filter_value(filter, value, i18n_scope)
107
109
  concat remove_filter_icon_link(filter)
108
110
  end
109
111
  end
@@ -116,6 +118,12 @@ module Decidim
116
118
  class: "action-icon--remove"
117
119
  )
118
120
  end
121
+
122
+ def filterable_i18n_scope_from_ctx(i18n_ctx)
123
+ i18n_scope = "decidim.admin.filters"
124
+ i18n_scope += ".#{i18n_ctx}" if i18n_ctx
125
+ i18n_scope
126
+ end
119
127
  end
120
128
  end
121
129
  end