decidim-debates 0.27.4 → 0.28.0.rc5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/debates/debate_activity_cell.rb +1 -12
  3. data/app/cells/decidim/debates/debate_card_metadata_cell.rb +43 -0
  4. data/app/cells/decidim/debates/debate_cell.rb +6 -1
  5. data/app/cells/decidim/debates/debate_l_cell.rb +49 -0
  6. data/app/cells/decidim/debates/debate_s_cell.rb +21 -0
  7. data/app/commands/decidim/debates/admin/close_debate.rb +1 -1
  8. data/app/commands/decidim/debates/close_debate.rb +1 -1
  9. data/app/commands/decidim/debates/create_debate.rb +13 -4
  10. data/app/commands/decidim/debates/update_debate.rb +15 -2
  11. data/app/controllers/decidim/debates/admin/debate_closes_controller.rb +2 -2
  12. data/app/controllers/decidim/debates/admin/debates_controller.rb +5 -5
  13. data/app/controllers/decidim/debates/debates_controller.rb +7 -8
  14. data/app/events/decidim/debates/close_debate_event.rb +1 -1
  15. data/app/events/decidim/debates/create_debate_event.rb +1 -1
  16. data/app/forms/decidim/debates/admin/close_debate_form.rb +1 -1
  17. data/app/forms/decidim/debates/close_debate_form.rb +2 -2
  18. data/app/forms/decidim/debates/debate_form.rb +2 -2
  19. data/app/helpers/decidim/debates/application_helper.rb +42 -17
  20. data/app/jobs/decidim/debates/hide_all_created_by_author_job.rb +13 -0
  21. data/app/jobs/decidim/debates/settings_change_job.rb +2 -2
  22. data/app/models/decidim/debates/debate.rb +4 -4
  23. data/app/packs/entrypoints/decidim_debates.js +2 -0
  24. data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_commented_debates.svg +42 -1
  25. data/app/presenters/decidim/debates/admin_log/debate_presenter.rb +2 -2
  26. data/app/views/decidim/debates/admin/debate_closes/edit.html.erb +26 -14
  27. data/app/views/decidim/debates/admin/debates/_form.html.erb +40 -39
  28. data/app/views/decidim/debates/admin/debates/edit.html.erb +16 -6
  29. data/app/views/decidim/debates/admin/debates/index.html.erb +60 -58
  30. data/app/views/decidim/debates/admin/debates/new.html.erb +16 -6
  31. data/app/views/decidim/debates/debates/_close_debate_modal.html.erb +22 -11
  32. data/app/views/decidim/debates/debates/_debates.html.erb +11 -9
  33. data/app/views/decidim/debates/debates/_form.html.erb +10 -19
  34. data/app/views/decidim/debates/debates/edit.html.erb +16 -20
  35. data/app/views/decidim/debates/debates/index.html.erb +19 -23
  36. data/app/views/decidim/debates/debates/index.js.erb +3 -4
  37. data/app/views/decidim/debates/debates/new.html.erb +16 -20
  38. data/app/views/decidim/debates/debates/show.html.erb +106 -109
  39. data/app/views/decidim/debates/versions/show.html.erb +14 -5
  40. data/config/environment.rb +3 -0
  41. data/config/locales/ar.yml +1 -17
  42. data/config/locales/bg.yml +0 -4
  43. data/config/locales/ca.yml +11 -29
  44. data/config/locales/cs.yml +11 -29
  45. data/config/locales/de.yml +12 -30
  46. data/config/locales/el.yml +3 -28
  47. data/config/locales/en.yml +12 -30
  48. data/config/locales/es-MX.yml +11 -29
  49. data/config/locales/es-PY.yml +12 -30
  50. data/config/locales/es.yml +11 -29
  51. data/config/locales/eu.yml +42 -60
  52. data/config/locales/fi-plain.yml +11 -29
  53. data/config/locales/fi.yml +11 -29
  54. data/config/locales/fr-CA.yml +12 -30
  55. data/config/locales/fr.yml +12 -30
  56. data/config/locales/ga-IE.yml +0 -15
  57. data/config/locales/gl.yml +0 -16
  58. data/config/locales/hu.yml +3 -29
  59. data/config/locales/id-ID.yml +0 -15
  60. data/config/locales/is-IS.yml +0 -12
  61. data/config/locales/it.yml +0 -31
  62. data/config/locales/ja.yml +10 -31
  63. data/config/locales/lb.yml +0 -21
  64. data/config/locales/lt.yml +8 -29
  65. data/config/locales/lv.yml +0 -17
  66. data/config/locales/nl.yml +0 -28
  67. data/config/locales/no.yml +0 -31
  68. data/config/locales/pl.yml +12 -30
  69. data/config/locales/pt-BR.yml +0 -31
  70. data/config/locales/pt.yml +0 -31
  71. data/config/locales/ro-RO.yml +3 -29
  72. data/config/locales/ru.yml +0 -12
  73. data/config/locales/sk.yml +0 -17
  74. data/config/locales/sl.yml +0 -3
  75. data/config/locales/sq-AL.yml +1 -0
  76. data/config/locales/sr-CS.yml +0 -6
  77. data/config/locales/sv.yml +4 -31
  78. data/config/locales/th-TH.yml +1 -0
  79. data/config/locales/tr-TR.yml +1 -30
  80. data/config/locales/uk.yml +0 -12
  81. data/config/locales/zh-CN.yml +0 -29
  82. data/config/locales/zh-TW.yml +2 -28
  83. data/lib/decidim/debates/component.rb +5 -89
  84. data/lib/decidim/debates/engine.rb +29 -7
  85. data/lib/decidim/debates/seeds.rb +104 -0
  86. data/lib/decidim/debates/test/factories.rb +6 -3
  87. data/lib/decidim/debates/version.rb +1 -1
  88. metadata +29 -27
  89. data/app/cells/decidim/debates/debate_m/data.erb +0 -10
  90. data/app/cells/decidim/debates/debate_m/footer.erb +0 -10
  91. data/app/cells/decidim/debates/debate_m/multiple_dates.erb +0 -17
  92. data/app/cells/decidim/debates/debate_m/open_date.erb +0 -7
  93. data/app/cells/decidim/debates/debate_m/single_date.erb +0 -9
  94. data/app/cells/decidim/debates/debate_m/tags.erb +0 -1
  95. data/app/cells/decidim/debates/debate_m_cell.rb +0 -86
  96. data/app/controllers/decidim/debates/widgets_controller.rb +0 -19
  97. data/app/views/decidim/debates/debates/_count.html.erb +0 -1
  98. data/app/views/decidim/debates/debates/_filters.html.erb +0 -34
  99. data/app/views/decidim/debates/debates/_filters_small_view.html.erb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5a2f7019ab08842724bb164d8f2d5ecb85e0a34aeedb402a81db8fd673de557
4
- data.tar.gz: 9b8daf222b44fb11537b5b4e74d8ce638a0f74c891581e134efd9c674d3b3369
3
+ metadata.gz: d540c81433e10767c7c0f297a01ee2804ce206f15ab8ed4c2914928ed284dc7b
4
+ data.tar.gz: b91d3ccab92f05351b17e796486c459ff9ed6ae74989e03940e279f0b10b379c
5
5
  SHA512:
6
- metadata.gz: cef664ea6feb9a7c8c1db98965cedf9349d4f8f057c9b09ed77133e018fdd7cc4420c9b58a6a5d514c56a6c4468796c254e202525bffb1469e9709f054457cdb
7
- data.tar.gz: d97e31c6b0e71db2e8e7ca223d221510d3972271436671b3cc612a48959a795808b52ae09597bd8b2a4d7d9fc511fde0112fddd5723367e2b2a21d31b489c046
6
+ metadata.gz: 53caeee5dd5e51022c2c9dfb9d55608e1dcf7e7a37388e7e712f0f8da82e42d7e12ce83555b71c8bfa6db8ef61fbceb97a4763cf2f38c612470bfbb8078acfa7
7
+ data.tar.gz: 074b6fc7f47c5dc1710d39d8543edb7a80f14ab53d81a6020ee083b8e3d702cce3c7cfecb9756d4d4daca91843b79f5832942f6a6b7a3c97f71010ec9ace8b4a
@@ -5,18 +5,7 @@ module Decidim
5
5
  # A cell to display when actions happen on a debate.
6
6
  class DebateActivityCell < ActivityCell
7
7
  def title
8
- case action
9
- when "update"
10
- I18n.t(
11
- "decidim.debates.last_activity.debate_updated_at_html",
12
- link: participatory_space_link
13
- )
14
- else
15
- I18n.t(
16
- "decidim.debates.last_activity.new_debate_at_html",
17
- link: participatory_space_link
18
- )
19
- end
8
+ action == "update" ? I18n.t("decidim.debates.last_activity.debate_updated") : I18n.t("decidim.debates.last_activity.new_debate")
20
9
  end
21
10
 
22
11
  def resource_link_text
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Debates
5
+ # This cell renders metadata for an instance of a Meeting
6
+ class DebateCardMetadataCell < Decidim::CardMetadataCell
7
+ include Decidim::LayoutHelper
8
+ include ActionView::Helpers::DateHelper
9
+
10
+ alias debate model
11
+
12
+ delegate :type_of_meeting, :start_time, :end_time, :category, :withdrawn?, to: :debate
13
+
14
+ def initialize(*)
15
+ super
16
+
17
+ @items.prepend(*debate_items)
18
+ end
19
+
20
+ def category_item
21
+ return if category.blank?
22
+
23
+ {
24
+ text: category.translated_name,
25
+ icon: resource_type_icon_key("Decidim::Category")
26
+ }
27
+ end
28
+
29
+ def debate_items
30
+ [duration, comments_count_item, endorsements_count_item, category_item, coauthors_item]
31
+ end
32
+
33
+ def duration
34
+ text = format_date_range(debate.start_time, debate.end_time) || t("open", scope: "decidim.debates.debates.show")
35
+
36
+ {
37
+ text:,
38
+ icon: "time-line"
39
+ }
40
+ end
41
+ end
42
+ end
43
+ end
@@ -15,7 +15,12 @@ module Decidim
15
15
  private
16
16
 
17
17
  def card_size
18
- "decidim/debates/debate_m"
18
+ case @options[:size]
19
+ when :s
20
+ "decidim/debates/debate_s"
21
+ else
22
+ "decidim/debates/debate_l"
23
+ end
19
24
  end
20
25
  end
21
26
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cell/partial"
4
+
5
+ module Decidim
6
+ module Debates
7
+ # This cell renders the List (:l) debate card
8
+ # for a given instance of a Debate
9
+ class DebateLCell < Decidim::CardLCell
10
+ include Decidim::SanitizeHelper
11
+ delegate :component_settings, to: :controller
12
+
13
+ alias debate model
14
+
15
+ def has_description?
16
+ true
17
+ end
18
+
19
+ def author_presenter
20
+ if model.official?
21
+ Decidim::Core::OfficialAuthorPresenter.new
22
+ else
23
+ model.normalized_author.presenter
24
+ end
25
+ end
26
+
27
+ def title
28
+ presenter.title(html_escape: true)
29
+ end
30
+
31
+ def description
32
+ attribute = model.try(:short_description) || model.try(:body) || model.description
33
+ text = translated_attribute(attribute)
34
+
35
+ decidim_sanitize(html_truncate(text, length: 240))
36
+ end
37
+
38
+ private
39
+
40
+ def presenter
41
+ present(model)
42
+ end
43
+
44
+ def metadata_cell
45
+ "decidim/debates/debate_card_metadata"
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cell/partial"
4
+
5
+ module Decidim
6
+ module Debates
7
+ # This cell renders the Search (:s) debate card
8
+ # for a given instance of a Debate
9
+ class DebateSCell < Decidim::CardSCell
10
+ private
11
+
12
+ def title
13
+ present(model).title(html_escape: true)
14
+ end
15
+
16
+ def metadata_cell
17
+ "decidim/debates/debate_card_metadata"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -15,7 +15,7 @@ module Decidim
15
15
  # Executes the command. Broadcasts these events:
16
16
  #
17
17
  # - :ok when everything is valid, together with the debate.
18
- # - :invalid if the form wasn't valid and we couldn't proceed.
18
+ # - :invalid if the form was not valid and we could not proceed.
19
19
  #
20
20
  # Returns nothing.
21
21
  def call
@@ -14,7 +14,7 @@ module Decidim
14
14
  # Executes the command. Broadcasts these events:
15
15
  #
16
16
  # - :ok when everything is valid, together with the debate.
17
- # - :invalid if the form wasn't valid and we couldn't proceed.
17
+ # - :invalid if the form was not valid and we could not proceed.
18
18
  #
19
19
  # Returns nothing.
20
20
  def call
@@ -15,12 +15,11 @@ module Decidim
15
15
  def call
16
16
  return broadcast(:invalid) if form.invalid?
17
17
 
18
- transaction do
18
+ with_events(with_transaction: true) do
19
19
  create_debate
20
- send_notification_to_author_followers
21
- send_notification_to_space_followers
22
20
  end
23
-
21
+ send_notification_to_author_followers
22
+ send_notification_to_space_followers
24
23
  follow_debate
25
24
  broadcast(:ok, debate)
26
25
  end
@@ -29,6 +28,16 @@ module Decidim
29
28
 
30
29
  attr_reader :debate, :form
31
30
 
31
+ def event_arguments
32
+ {
33
+ resource: debate,
34
+ extra: {
35
+ event_author: form.current_user,
36
+ locale:
37
+ }
38
+ }
39
+ end
40
+
32
41
  def create_debate
33
42
  parsed_title = Decidim::ContentProcessor.parse_with_processor(:hashtag, form.title, current_organization: form.current_organization).rewrite
34
43
  parsed_description = Decidim::ContentProcessor.parse_with_processor(:hashtag, form.description, current_organization: form.current_organization).rewrite
@@ -14,14 +14,17 @@ module Decidim
14
14
  # Executes the command. Broadcasts these events:
15
15
  #
16
16
  # - :ok when everything is valid, together with the debate.
17
- # - :invalid if the form wasn't valid and we couldn't proceed.
17
+ # - :invalid if the form was not valid and we could not proceed.
18
18
  #
19
19
  # Returns nothing.
20
20
  def call
21
21
  return broadcast(:invalid) if form.invalid?
22
22
  return broadcast(:invalid) unless form.debate.editable_by?(form.current_user)
23
23
 
24
- update_debate
24
+ with_events(with_transaction: true) do
25
+ update_debate
26
+ end
27
+
25
28
  broadcast(:ok, @debate)
26
29
  end
27
30
 
@@ -29,6 +32,16 @@ module Decidim
29
32
 
30
33
  attr_reader :form
31
34
 
35
+ def event_arguments
36
+ {
37
+ resource: @debate,
38
+ extra: {
39
+ event_author: form.current_user,
40
+ locale:
41
+ }
42
+ }
43
+ end
44
+
32
45
  def update_debate
33
46
  @debate = Decidim.traceability.update!(
34
47
  @form.debate,
@@ -8,13 +8,13 @@ module Decidim
8
8
  helper_method :debate
9
9
 
10
10
  def edit
11
- enforce_permission_to :close, :debate, debate: debate
11
+ enforce_permission_to(:close, :debate, debate:)
12
12
 
13
13
  @form = form(Admin::CloseDebateForm).from_model(debate)
14
14
  end
15
15
 
16
16
  def update
17
- enforce_permission_to :close, :debate, debate: debate
17
+ enforce_permission_to(:close, :debate, debate:)
18
18
 
19
19
  @form = form(Admin::CloseDebateForm).from_params(params)
20
20
 
@@ -22,7 +22,7 @@ module Decidim
22
22
  def create
23
23
  enforce_permission_to :create, :debate
24
24
 
25
- @form = form(Decidim::Debates::Admin::DebateForm).from_params(params, current_component: current_component)
25
+ @form = form(Decidim::Debates::Admin::DebateForm).from_params(params, current_component:)
26
26
 
27
27
  CreateDebate.call(@form) do
28
28
  on(:ok) do
@@ -38,15 +38,15 @@ module Decidim
38
38
  end
39
39
 
40
40
  def edit
41
- enforce_permission_to :update, :debate, debate: debate
41
+ enforce_permission_to(:update, :debate, debate:)
42
42
 
43
43
  @form = form(Decidim::Debates::Admin::DebateForm).from_model(debate)
44
44
  end
45
45
 
46
46
  def update
47
- enforce_permission_to :update, :debate, debate: debate
47
+ enforce_permission_to(:update, :debate, debate:)
48
48
 
49
- @form = form(Decidim::Debates::Admin::DebateForm).from_params(params, current_component: current_component)
49
+ @form = form(Decidim::Debates::Admin::DebateForm).from_params(params, current_component:)
50
50
 
51
51
  UpdateDebate.call(@form, debate) do
52
52
  on(:ok) do
@@ -62,7 +62,7 @@ module Decidim
62
62
  end
63
63
 
64
64
  def destroy
65
- enforce_permission_to :delete, :debate, debate: debate
65
+ enforce_permission_to(:delete, :debate, debate:)
66
66
 
67
67
  debate.destroy!
68
68
 
@@ -6,7 +6,6 @@ module Decidim
6
6
  class DebatesController < Decidim::Debates::ApplicationController
7
7
  helper Decidim::ApplicationHelper
8
8
  helper Decidim::Messaging::ConversationHelper
9
- helper Decidim::WidgetUrlsHelper
10
9
  include FormFactory
11
10
  include FilterResource
12
11
  include Paginable
@@ -44,13 +43,13 @@ module Decidim
44
43
  end
45
44
 
46
45
  def edit
47
- enforce_permission_to :edit, :debate, debate: debate
46
+ enforce_permission_to(:edit, :debate, debate:)
48
47
 
49
48
  @form = form(DebateForm).from_model(debate)
50
49
  end
51
50
 
52
51
  def update
53
- enforce_permission_to :edit, :debate, debate: debate
52
+ enforce_permission_to(:edit, :debate, debate:)
54
53
 
55
54
  @form = form(DebateForm).from_params(params)
56
55
 
@@ -68,7 +67,7 @@ module Decidim
68
67
  end
69
68
 
70
69
  def close
71
- enforce_permission_to :close, :debate, debate: debate
70
+ enforce_permission_to(:close, :debate, debate:)
72
71
 
73
72
  @form = form(CloseDebateForm).from_params(params)
74
73
 
@@ -114,10 +113,10 @@ module Decidim
114
113
  def default_filter_params
115
114
  {
116
115
  search_text_cont: "",
117
- with_any_origin: %w(official participants user_group),
118
- activity: "all",
119
- with_any_category: default_filter_category_params,
120
- with_any_scope: default_filter_scope_params,
116
+ with_any_origin: nil,
117
+ activity: %w(all),
118
+ with_any_category: nil,
119
+ with_any_scope: nil,
121
120
  with_any_state: %w(open closed)
122
121
  }
123
122
  end
@@ -1,4 +1,4 @@
1
- # frozen-string_literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Decidim
4
4
  module Debates
@@ -1,4 +1,4 @@
1
- # frozen-string_literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Decidim
4
4
  module Debates
@@ -22,7 +22,7 @@ module Decidim
22
22
  end
23
23
 
24
24
  def debate
25
- @debate ||= Debate.find_by(id: id)
25
+ @debate ||= Debate.find_by(id:)
26
26
  end
27
27
 
28
28
  private
@@ -20,13 +20,13 @@ module Decidim
20
20
  super
21
21
 
22
22
  # Debates can be translated in different languages from the admin but
23
- # the public form doesn't allow it. When a user closes a debate the
23
+ # the public form does not allow it. When a user closes a debate the
24
24
  # user locale is taken as the text locale.
25
25
  self.conclusions = debate.conclusions&.values&.first
26
26
  end
27
27
 
28
28
  def debate
29
- @debate ||= Debate.find_by(id: id)
29
+ @debate ||= Debate.find_by(id:)
30
30
  end
31
31
 
32
32
  private
@@ -22,7 +22,7 @@ module Decidim
22
22
  def map_model(debate)
23
23
  super
24
24
  # Debates can be translated in different languages from the admin but
25
- # the public form doesn't allow it. When a user creates a debate the
25
+ # the public form does not allow it. When a user creates a debate the
26
26
  # user locale is taken as the text locale.
27
27
  self.title = debate.title.values.first
28
28
  self.description = debate.description.values.first
@@ -53,7 +53,7 @@ module Decidim
53
53
  end
54
54
 
55
55
  def debate
56
- @debate ||= Debate.find_by(id: id)
56
+ @debate ||= Debate.find_by(id:)
57
57
  end
58
58
 
59
59
  private
@@ -11,6 +11,7 @@ module Decidim
11
11
  include Decidim::EndorsableHelper
12
12
  include Decidim::FollowableHelper
13
13
  include Decidim::CheckBoxesTreeHelper
14
+ include Decidim::DateRangeHelper
14
15
 
15
16
  # If the debate is official or the rich text editor is enabled on the
16
17
  # frontend, the debate description is considered as safe content.
@@ -42,35 +43,59 @@ module Decidim
42
43
  # Returns a TreeNode to be used in the list filters to filter debates by
43
44
  # its origin.
44
45
  def filter_origin_values
45
- origin_values = []
46
- origin_values << TreePoint.new("official", t("decidim.debates.debates.filters.official"))
47
- origin_values << TreePoint.new("participants", t("decidim.debates.debates.filters.participants"))
48
- origin_values << TreePoint.new("user_group", t("decidim.debates.debates.filters.user_groups")) if current_organization.user_groups_enabled?
46
+ origin_keys = %w(official participants)
47
+ origin_keys << "user_group" if current_organization.user_groups_enabled?
49
48
 
50
- TreeNode.new(TreePoint.new("", t("decidim.debates.debates.filters.all")), origin_values)
49
+ origin_values = origin_keys.map { |key| [key, t(key, scope: "decidim.debates.debates.filters")] }
50
+ origin_values.prepend(["", all_filter_text])
51
+
52
+ filter_tree_from_array(origin_values)
51
53
  end
52
54
 
53
55
  # Options to filter Debates by activity.
54
56
  def activity_filter_values
55
- base = [
56
- ["all", t("decidim.debates.debates.filters.all")],
57
- ["my_debates", t("decidim.debates.debates.filters.my_debates")]
58
- ]
59
- base += [["commented", t("decidim.debates.debates.filters.commented")]]
60
- base
57
+ %w(all my_debates commented).map { |k| [k, t(k, scope: "decidim.debates.debates.filters")] }
61
58
  end
62
59
 
63
60
  # Returns a TreeNode to be used in the list filters to filter debates by
64
61
  # its state.
65
62
  def filter_debates_state_values
66
- Decidim::CheckBoxesTreeHelper::TreeNode.new(
67
- Decidim::CheckBoxesTreeHelper::TreePoint.new("", t("decidim.debates.debates.filters.all")),
68
- [
69
- Decidim::CheckBoxesTreeHelper::TreePoint.new("open", t("decidim.debates.debates.filters.state_values.open")),
70
- Decidim::CheckBoxesTreeHelper::TreePoint.new("closed", t("decidim.debates.debates.filters.state_values.closed"))
71
- ]
63
+ %w(open closed).map { |k| [k, t(k, scope: "decidim.debates.debates.filters.state_values")] }.prepend(
64
+ ["all", all_filter_text]
72
65
  )
73
66
  end
67
+
68
+ def all_filter_text
69
+ t("all", scope: "decidim.debates.debates.filters")
70
+ end
71
+
72
+ def filter_sections
73
+ @filter_sections ||= begin
74
+ items = [{
75
+ method: :with_any_state,
76
+ collection: filter_debates_state_values,
77
+ label_scope: "decidim.meetings.meetings.filters",
78
+ id: "date",
79
+ type: :radio_buttons
80
+ }]
81
+ if current_component.has_subscopes?
82
+ items.append(method: :with_any_scope, collection: filter_scopes_values, label_scope: "decidim.shared.participatory_space_filters.filters", id: "scope")
83
+ end
84
+ if current_participatory_space.categories.any?
85
+ items.append(method: :with_any_category, collection: filter_categories_values, label_scope: "decidim.debates.debates.filters", id: "category")
86
+ end
87
+ items.append(method: :with_any_origin, collection: filter_origin_values, label_scope: "decidim.debates.debates.filters", id: "origin")
88
+ items.append(method: :activity, collection: activity_filter_values, label_scope: "decidim.debates.debates.filters", id: "activity") if current_user
89
+
90
+ items.reject { |item| item[:collection].blank? }
91
+ end
92
+ end
93
+
94
+ def search_variable = :search_text_cont
95
+
96
+ def component_name
97
+ (defined?(current_component) && translated_attribute(current_component&.name).presence) || t("decidim.components.debates.name")
98
+ end
74
99
  end
75
100
  end
76
101
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Debates
5
+ class HideAllCreatedByAuthorJob < ::Decidim::HideAllCreatedByAuthorJob
6
+ protected
7
+
8
+ def base_query
9
+ Decidim::Debates::Debate.not_hidden.where(author:)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -19,8 +19,8 @@ module Decidim
19
19
  return unless event && event_class
20
20
 
21
21
  Decidim::EventsManager.publish(
22
- event: event,
23
- event_class: event_class,
22
+ event:,
23
+ event_class:,
24
24
  resource: component,
25
25
  followers: component.participatory_space.followers
26
26
  )
@@ -44,7 +44,7 @@ module Decidim
44
44
 
45
45
  scope :open, -> { where(closed_at: nil) }
46
46
  scope :closed, -> { where.not(closed_at: nil) }
47
- scope :authored_by, ->(author) { where(author: author) }
47
+ scope :authored_by, ->(author) { where(author:) }
48
48
  scope :commented_by, lambda { |author|
49
49
  joins(:comments).where(
50
50
  decidim_comments_comments:
@@ -147,12 +147,12 @@ module Decidim
147
147
  end
148
148
 
149
149
  def self.newsletter_participant_ids(component)
150
- authors_ids = Decidim::Debates::Debate.where(component: component)
150
+ authors_ids = Decidim::Debates::Debate.where(component:)
151
151
  .where(decidim_author_type: Decidim::UserBaseEntity.name)
152
152
  .where.not(author: nil)
153
153
  .group(:decidim_author_id)
154
154
  .pluck(:decidim_author_id).flatten.compact
155
- commentators_ids = Decidim::Comments::Comment.user_commentators_ids_in(Decidim::Debates::Debate.where(component: component))
155
+ commentators_ids = Decidim::Comments::Comment.user_commentators_ids_in(Decidim::Debates::Debate.where(component:))
156
156
  (authors_ids + commentators_ids).flatten.compact.uniq
157
157
  end
158
158
 
@@ -189,7 +189,7 @@ module Decidim
189
189
  last_comment_at: last_comment&.created_at,
190
190
  last_comment_by_id: last_comment&.decidim_user_group_id || last_comment&.decidim_author_id,
191
191
  last_comment_by_type: last_comment&.decidim_author_type,
192
- comments_count: comments_count,
192
+ comments_count:,
193
193
  updated_at: Time.current
194
194
  )
195
195
  end
@@ -0,0 +1,2 @@
1
+ // Images
2
+ require.context("../images", true)
@@ -1 +1,42 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="debates-svg" width="1080" height="1080" x="0" y="0" enable-background="new 0 0 1080 1080" version="1.1" viewBox="0 0 1080 1080" xml:space="preserve"><g id="debates" class="stroke-primary"><g id="bubble"><path fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="16" d="M787.237,226.039H282.916c-21.99,0-39.815,17.825-39.815,39.815v18.882l-97.325,60.747h97.325 c0,21.989,17.826,39.815,39.815,39.815h504.321c21.989,0,39.814-17.826,39.814-39.815v-79.629 C827.052,243.864,809.227,226.039,787.237,226.039z"/><circle id="_x35_0-pct_17_" cx="419.45" cy="304.983" r="28.217" fill="#31536E" fill-opacity=".5" class="fill-primary"/><circle id="_x35_0-pct_16_" cx="525.623" cy="304.983" r="28.217" fill="#31536E" fill-opacity=".5" class="fill-primary"/><circle id="_x35_0-pct_15_" cx="631.796" cy="304.983" r="28.217" fill="#31536E" fill-opacity=".5" class="fill-primary"/></g><g id="bubble_1_"><path id="_x32_5-pct_16_" fill="#31536E" fill-opacity=".25" d="M787.237,690.545H282.916c-25.857,0-46.894,21.036-46.894,46.894 v14.956l-93.995,58.67c-2.68,1.672-3.926,4.916-3.057,7.953c0.87,3.035,3.646,5.129,6.805,5.129h90.78 c3.422,22.511,22.908,39.814,46.36,39.814h504.321c25.856,0,46.892-21.036,46.892-46.894v-79.629 C834.129,711.581,813.094,690.545,787.237,690.545z" class="fill-primary"/><circle id="_x35_0-pct_12_" cx="419.45" cy="776.567" r="28.217" fill="#31536E" fill-opacity=".5" class="fill-primary"/><circle id="_x35_0-pct_13_" cx="525.623" cy="776.567" r="28.217" fill="#31536E" fill-opacity=".5" class="fill-primary"/><circle id="_x35_0-pct_14_" cx="631.796" cy="776.567" r="28.217" fill="#31536E" fill-opacity=".5" class="fill-primary"/></g><g id="bubble_black"><path fill="#31536E" d="M937.098,575.391l-101.198-66.172v-15.054c0-25.757-13.768-38.968-39.814-38.968H291.763 c-26.82,0-53.971,13.121-53.971,38.968v79.63c0,25.936,28.246,54.817,53.971,54.817h504.322c23.02,0,42.802-17.695,46.333-39.814 h90.806c3.131,0,5.89-2.26,6.784-5.26C940.902,580.536,939.719,577.104,937.098,575.391z" class="fill-primary"/><circle cx="641.854" cy="541.5" r="28.217" fill="#FFF" fill-opacity=".5"/><circle cx="535.682" cy="541.5" r="28.217" fill="#FFF" fill-opacity=".5"/><circle cx="429.509" cy="541.5" r="28.217" fill="#FFF" fill-opacity=".5"/></g><g id="stars_9" class="stars"><path fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4" d="M731.204,149.355c0-14.688-18.667-35.355-35.354-35.355c15.354,0,35.354-20.333,35.354-35.355 c0,15.022,16.666,35.355,35.354,35.355C747.537,114,731.204,134.667,731.204,149.355z"/><g><circle cx="937.586" cy="323.411" r="13.5" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="921.087" x2="899.874" y1="306.676" y2="285.463" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="955.028" x2="976.241" y1="340.617" y2="361.83" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="954.321" x2="975.534" y1="307.383" y2="286.17" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="921.087" x2="899.874" y1="340.617" y2="361.83" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/></g><g><line x1="169.816" x2="143.654" y1="626.094" y2="652.258" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="134.462" x2="108.299" y1="661.449" y2="687.613" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="169.109" x2="142.946" y1="687.613" y2="661.449" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="133.755" x2="107.592" y1="652.258" y2="626.094" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/></g><path fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4" d="M559.419,965.473c0,0-21.565,4.034-26.516,8.981c-4.948,4.948-8.982,26.517-8.982,26.517s-4.034-21.566-8.982-26.517 c-4.948-4.947-26.516-8.981-26.516-8.981s22.077-4.547,26.516-8.983c4.438-4.438,8.982-26.515,8.982-26.515 s4.034,21.564,8.982,26.515C537.852,961.438,559.419,965.473,559.419,965.473z"/><g><circle cx="949.705" cy="649.667" r="16.604" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><circle cx="913.805" cy="649.667" r="6.433" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><circle cx="949.705" cy="685.568" r="6.432" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><circle cx="985.605" cy="649.667" r="6.433" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><circle cx="949.705" cy="613.766" r="6.432" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/></g><g><line x1="314.95" x2="369.854" y1="78.973" y2="133.878" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="369.854" x2="314.95" y1="78.973" y2="133.878" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="324.204" x2="297.204" y1="106" y2="106" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="362.204" x2="389.204" y1="106" y2="106" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="343.204" x2="343.204" y1="125" y2="152" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="343.204" x2="343.204" y1="87" y2="60" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/></g><g><line x1="106.204" x2="106.204" y1="356" y2="435" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><line x1="145.204" x2="66.204" y1="396" y2="396" fill="none" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><circle cx="86.204" cy="415.5" r="7.039" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><circle cx="86.204" cy="375.5" r="7.039" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><circle cx="126.204" cy="415.5" r="7.039" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/><circle cx="126.204" cy="375.5" r="7.039" fill="#FFD92B" stroke="#31536E" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"/></g></g></g></svg>
1
+ <svg width="540" height="540" viewBox="0 0 540 540" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M393.617 113.02H141.457C130.462 113.02 121.549 121.932 121.549 132.927V142.368L72.8867 172.742H121.549C121.549 183.736 130.462 192.649 141.457 192.649H393.617C404.612 192.649 413.524 183.736 413.524 172.742V132.927C413.525 121.932 404.612 113.02 393.617 113.02Z" stroke="#3E4C5C" stroke-width="8" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
3
+ <path d="M209.724 166.6C217.516 166.6 223.832 160.283 223.832 152.491C223.832 144.699 217.516 138.383 209.724 138.383C201.932 138.383 195.615 144.699 195.615 152.491C195.615 160.283 201.932 166.6 209.724 166.6Z" fill="#3E4C5C" fill-opacity="0.5"/>
4
+ <path d="M262.81 166.6C270.602 166.6 276.918 160.283 276.918 152.491C276.918 144.699 270.602 138.383 262.81 138.383C255.018 138.383 248.701 144.699 248.701 152.491C248.701 160.283 255.018 166.6 262.81 166.6Z" fill="#3E4C5C" fill-opacity="0.5"/>
5
+ <path d="M315.898 166.6C323.689 166.6 330.006 160.283 330.006 152.491C330.006 144.699 323.689 138.383 315.898 138.383C308.106 138.383 301.789 144.699 301.789 152.491C301.789 160.283 308.106 166.6 315.898 166.6Z" fill="#3E4C5C" fill-opacity="0.5"/>
6
+ <path d="M393.618 345.273H141.458C128.529 345.273 118.011 355.791 118.011 368.72V376.198L71.0132 405.533C69.6732 406.369 69.0502 407.991 69.4847 409.51C69.9197 411.027 71.3077 412.074 72.8872 412.074H118.277C119.988 423.33 129.731 431.981 141.457 431.981H393.618C406.546 431.981 417.064 421.463 417.064 408.534V368.72C417.064 355.791 406.547 345.273 393.618 345.273Z" fill="#3E4C5C" fill-opacity="0.25"/>
7
+ <path d="M209.726 402.393C217.518 402.393 223.834 396.076 223.834 388.284C223.834 380.492 217.518 374.176 209.726 374.176C201.934 374.176 195.617 380.492 195.617 388.284C195.617 396.076 201.934 402.393 209.726 402.393Z" fill="#3E4C5C" fill-opacity="0.5"/>
8
+ <path d="M262.812 402.393C270.604 402.393 276.92 396.076 276.92 388.284C276.92 380.492 270.604 374.176 262.812 374.176C255.02 374.176 248.703 380.492 248.703 388.284C248.703 396.076 255.02 402.393 262.812 402.393Z" fill="#3E4C5C" fill-opacity="0.5"/>
9
+ <path d="M315.898 402.393C323.689 402.393 330.006 396.076 330.006 388.284C330.006 380.492 323.689 374.176 315.898 374.176C308.106 374.176 301.789 380.492 301.789 388.284C301.789 396.076 308.106 402.393 315.898 402.393Z" fill="#3E4C5C" fill-opacity="0.5"/>
10
+ <path d="M468.548 287.695L417.949 254.609V247.082C417.949 234.203 411.065 227.598 398.042 227.598H145.88C132.47 227.598 118.895 234.158 118.895 247.082V286.897C118.895 299.865 133.018 314.305 145.88 314.305H398.041C409.551 314.305 419.442 305.458 421.208 294.398H466.611C468.176 294.398 469.556 293.268 470.003 291.768C470.45 290.267 469.858 288.551 468.548 287.695Z" fill="#3E4C5C"/>
11
+ <path d="M320.925 284.858C328.717 284.858 335.033 278.541 335.033 270.749C335.033 262.957 328.717 256.641 320.925 256.641C313.133 256.641 306.816 262.957 306.816 270.749C306.816 278.541 313.133 284.858 320.925 284.858Z" fill="white" fill-opacity="0.5"/>
12
+ <path d="M267.839 284.858C275.631 284.858 281.947 278.541 281.947 270.749C281.947 262.957 275.631 256.641 267.839 256.641C260.047 256.641 253.73 262.957 253.73 270.749C253.73 278.541 260.047 284.858 267.839 284.858Z" fill="white" fill-opacity="0.5"/>
13
+ <path d="M214.753 284.858C222.545 284.858 228.862 278.541 228.862 270.749C228.862 262.957 222.545 256.641 214.753 256.641C206.961 256.641 200.645 262.957 200.645 270.749C200.645 278.541 206.961 284.858 214.753 284.858Z" fill="white" fill-opacity="0.5"/>
14
+ <path d="M365.601 74.6773C365.601 67.3333 356.267 56.9998 347.924 56.9998C355.601 56.9998 365.601 46.8333 365.601 39.3223C365.601 46.8333 373.934 56.9998 383.278 56.9998C373.767 56.9998 365.601 67.3333 365.601 74.6773Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
15
+ <path d="M468.793 168.455C472.521 168.455 475.543 165.433 475.543 161.705C475.543 157.977 472.521 154.955 468.793 154.955C465.065 154.955 462.043 157.977 462.043 161.705C462.043 165.433 465.065 168.455 468.793 168.455Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
16
+ <path d="M460.544 153.337L449.938 142.73" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
17
+ <path d="M477.514 170.307L488.12 180.913" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
18
+ <path d="M477.16 153.69L487.767 143.084" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
19
+ <path d="M460.544 170.307L449.938 180.913" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
20
+ <path d="M84.9072 313.047L71.8262 326.129" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
21
+ <path d="M67.2299 330.725L54.1484 343.807" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
22
+ <path d="M84.5542 343.807L71.4727 330.725" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
23
+ <path d="M66.8764 326.129L53.7949 313.047" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
24
+ <path d="M279.709 482.737C279.709 482.737 268.926 484.754 266.451 487.228C263.977 489.702 261.96 500.486 261.96 500.486C261.96 500.486 259.943 489.703 257.469 487.228C254.995 484.754 244.211 482.737 244.211 482.737C244.211 482.737 255.249 480.464 257.469 478.246C259.688 476.027 261.96 464.988 261.96 464.988C261.96 464.988 263.977 475.77 266.451 478.246C268.925 480.72 279.709 482.737 279.709 482.737Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
25
+ <path d="M474.853 333.137C479.438 333.137 483.155 329.42 483.155 324.835C483.155 320.25 479.438 316.533 474.853 316.533C470.268 316.533 466.551 320.25 466.551 324.835C466.551 329.42 470.268 333.137 474.853 333.137Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
26
+ <path d="M456.902 328.05C458.678 328.05 460.119 326.61 460.119 324.834C460.119 323.057 458.678 321.617 456.902 321.617C455.126 321.617 453.686 323.057 453.686 324.834C453.686 326.61 455.126 328.05 456.902 328.05Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
27
+ <path d="M474.853 346C476.629 346 478.069 344.561 478.069 342.784C478.069 341.008 476.629 339.568 474.853 339.568C473.077 339.568 471.637 341.008 471.637 342.784C471.637 344.561 473.077 346 474.853 346Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
28
+ <path d="M492.802 328.05C494.579 328.05 496.019 326.61 496.019 324.834C496.019 323.057 494.579 321.617 492.802 321.617C491.026 321.617 489.586 323.057 489.586 324.834C489.586 326.61 491.026 328.05 492.802 328.05Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
29
+ <path d="M474.853 310.1C476.629 310.1 478.069 308.66 478.069 306.884C478.069 305.108 476.629 303.668 474.853 303.668C473.077 303.668 471.637 305.108 471.637 306.884C471.637 308.66 473.077 310.1 474.853 310.1Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
30
+ <path d="M157.475 39.4863L184.927 66.9388" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
31
+ <path d="M184.927 39.4863L157.475 66.9388" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
32
+ <path d="M162.102 53H148.602" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
33
+ <path d="M181.102 53H194.602" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
34
+ <path d="M171.602 62.5V76" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
35
+ <path d="M171.602 43.5V30" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
36
+ <path d="M53.1016 178V217.5" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
37
+ <path d="M72.6016 198H33.1016" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
38
+ <path d="M43.1015 211.269C45.0453 211.269 46.621 209.694 46.621 207.75C46.621 205.806 45.0453 204.23 43.1015 204.23C41.1578 204.23 39.582 205.806 39.582 207.75C39.582 209.694 41.1578 211.269 43.1015 211.269Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
39
+ <path d="M43.1015 191.269C45.0453 191.269 46.621 189.694 46.621 187.75C46.621 185.806 45.0453 184.23 43.1015 184.23C41.1578 184.23 39.582 185.806 39.582 187.75C39.582 189.694 41.1578 191.269 43.1015 191.269Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
40
+ <path d="M63.1015 211.269C65.0453 211.269 66.621 209.694 66.621 207.75C66.621 205.806 65.0453 204.23 63.1015 204.23C61.1578 204.23 59.582 205.806 59.582 207.75C59.582 209.694 61.1578 211.269 63.1015 211.269Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
41
+ <path d="M63.1015 191.269C65.0453 191.269 66.621 189.694 66.621 187.75C66.621 185.806 65.0453 184.23 63.1015 184.23C61.1578 184.23 59.582 185.806 59.582 187.75C59.582 189.694 61.1578 191.269 63.1015 191.269Z" fill="#EBC34B" stroke="#3E4C5C" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
42
+ </svg>