decidim-budgets 0.30.2 → 0.31.0.rc1

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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/budgets/budget_list_item/show.erb +19 -9
  3. data/app/cells/decidim/budgets/budget_list_item/vote_action.erb +2 -2
  4. data/app/cells/decidim/budgets/budget_list_item_cell.rb +44 -10
  5. data/app/cells/decidim/budgets/budgets_list/card_list.erb +0 -2
  6. data/app/cells/decidim/budgets/budgets_list/main_list.erb +2 -2
  7. data/app/cells/decidim/budgets/budgets_list/show.erb +3 -3
  8. data/app/cells/decidim/budgets/budgets_list/voted.erb +12 -10
  9. data/app/cells/decidim/budgets/budgets_list_cell.rb +22 -0
  10. data/app/cells/decidim/budgets/project_budget_amount_cell.rb +14 -0
  11. data/app/cells/decidim/budgets/project_l/extra_data.erb +8 -2
  12. data/app/cells/decidim/budgets/project_l/metadata.erb +1 -1
  13. data/app/cells/decidim/budgets/project_l_cell.rb +2 -4
  14. data/app/cells/decidim/budgets/project_metadata_cell.rb +11 -19
  15. data/app/cells/decidim/budgets/project_selected_status_cell.rb +1 -11
  16. data/app/cells/decidim/budgets/project_vote_button/show.erb +5 -5
  17. data/app/cells/decidim/budgets/project_vote_button_cell.rb +14 -9
  18. data/app/cells/decidim/budgets/project_votes_count_cell.rb +8 -14
  19. data/app/commands/decidim/budgets/cancel_order.rb +5 -0
  20. data/app/controllers/decidim/budgets/admin/budgets_controller.rb +2 -2
  21. data/app/controllers/decidim/budgets/admin/projects_controller.rb +2 -2
  22. data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +1 -1
  23. data/app/controllers/decidim/budgets/application_controller.rb +13 -1
  24. data/app/controllers/decidim/budgets/budgets_controller.rb +1 -3
  25. data/app/controllers/decidim/budgets/line_items_controller.rb +19 -0
  26. data/app/controllers/decidim/budgets/orders_controller.rb +20 -0
  27. data/app/controllers/decidim/budgets/projects_controller.rb +3 -1
  28. data/app/forms/decidim/budgets/admin/component_form.rb +4 -30
  29. data/app/helpers/decidim/budgets/application_helper.rb +1 -0
  30. data/app/helpers/decidim/budgets/projects_helper.rb +11 -7
  31. data/app/models/decidim/budgets/order.rb +2 -2
  32. data/app/packs/entrypoints/decidim_budgets.js +1 -0
  33. data/app/packs/src/decidim/budgets/admin/projects.js +2 -2
  34. data/app/packs/src/decidim/budgets/budgetSummaryBackdrop.js +41 -0
  35. data/app/packs/src/decidim/budgets/exit_handler.js +7 -2
  36. data/app/packs/src/decidim/budgets/progressFixed.js +1 -1
  37. data/app/packs/src/decidim/budgets/projects.js +1 -1
  38. data/app/packs/stylesheets/budgets.scss +57 -37
  39. data/app/permissions/decidim/budgets/permissions.rb +17 -13
  40. data/app/presenters/decidim/budgets/project_presenter.rb +2 -4
  41. data/app/views/decidim/budgets/admin/budgets/_actions.html.erb +65 -18
  42. data/app/views/decidim/budgets/admin/budgets/_budget-tr.html.erb +4 -4
  43. data/app/views/decidim/budgets/admin/budgets/_form.html.erb +1 -1
  44. data/app/views/decidim/budgets/admin/budgets/index.html.erb +14 -11
  45. data/app/views/decidim/budgets/admin/budgets/manage_trash.html.erb +2 -1
  46. data/app/views/decidim/budgets/admin/projects/_actions.html.erb +66 -22
  47. data/app/views/decidim/budgets/admin/projects/_bulk-actions.html.erb +15 -17
  48. data/app/views/decidim/budgets/admin/projects/_form.html.erb +1 -1
  49. data/app/views/decidim/budgets/admin/projects/_project-tr.html.erb +7 -7
  50. data/app/views/decidim/budgets/admin/projects/bulk_actions/_dropdown.html.erb +23 -30
  51. data/app/views/decidim/budgets/admin/projects/index.html.erb +2 -2
  52. data/app/views/decidim/budgets/admin/projects/manage_trash.html.erb +2 -1
  53. data/app/views/decidim/budgets/line_items/update_budget.js.erb +6 -5
  54. data/app/views/decidim/budgets/orders/status.html.erb +30 -30
  55. data/app/views/decidim/budgets/projects/_addition_selector.html.erb +1 -1
  56. data/app/views/decidim/budgets/projects/_budget_summary.html.erb +5 -1
  57. data/app/views/decidim/budgets/projects/_exit_modal.html.erb +1 -1
  58. data/app/views/decidim/budgets/projects/_project.html.erb +5 -1
  59. data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +1 -9
  60. data/app/views/decidim/budgets/projects/_projects.html.erb +3 -1
  61. data/app/views/decidim/budgets/projects/index.html.erb +28 -6
  62. data/app/views/decidim/budgets/projects/order_progress_summary/_content.html.erb +30 -0
  63. data/app/views/decidim/budgets/projects/order_progress_summary/_content_responsive.html.erb +56 -0
  64. data/app/views/decidim/budgets/projects/order_progress_summary/_progress_box.html.erb +43 -0
  65. data/app/views/decidim/budgets/projects/order_progress_summary/_progress_box_buttons.html.erb +12 -0
  66. data/app/views/decidim/budgets/projects/order_progress_summary/_progress_box_sticky.html.erb +25 -0
  67. data/app/views/decidim/budgets/projects/show.html.erb +30 -17
  68. data/config/assets.rb +2 -2
  69. data/config/locales/ar.yml +0 -8
  70. data/config/locales/bg.yml +2 -18
  71. data/config/locales/ca-IT.yml +26 -14
  72. data/config/locales/ca.yml +26 -14
  73. data/config/locales/cs.yml +10 -18
  74. data/config/locales/de.yml +26 -14
  75. data/config/locales/el.yml +0 -7
  76. data/config/locales/en.yml +26 -14
  77. data/config/locales/es-MX.yml +26 -14
  78. data/config/locales/es-PY.yml +26 -14
  79. data/config/locales/es.yml +25 -13
  80. data/config/locales/eu.yml +26 -14
  81. data/config/locales/fi-plain.yml +26 -14
  82. data/config/locales/fi.yml +26 -14
  83. data/config/locales/fr-CA.yml +26 -14
  84. data/config/locales/fr.yml +26 -14
  85. data/config/locales/ga-IE.yml +0 -5
  86. data/config/locales/gl.yml +0 -7
  87. data/config/locales/hu.yml +2 -18
  88. data/config/locales/id-ID.yml +0 -7
  89. data/config/locales/is-IS.yml +0 -6
  90. data/config/locales/it.yml +0 -7
  91. data/config/locales/ja.yml +26 -14
  92. data/config/locales/kaa.yml +0 -1
  93. data/config/locales/ko.yml +0 -5
  94. data/config/locales/lb.yml +0 -7
  95. data/config/locales/lt.yml +2 -18
  96. data/config/locales/lv.yml +0 -7
  97. data/config/locales/nl.yml +0 -7
  98. data/config/locales/no.yml +0 -7
  99. data/config/locales/pl.yml +2 -18
  100. data/config/locales/pt-BR.yml +2 -18
  101. data/config/locales/pt.yml +0 -7
  102. data/config/locales/ro-RO.yml +7 -7
  103. data/config/locales/ru.yml +0 -7
  104. data/config/locales/sk.yml +0 -7
  105. data/config/locales/sq-AL.yml +0 -3
  106. data/config/locales/sv.yml +25 -13
  107. data/config/locales/tr-TR.yml +0 -8
  108. data/config/locales/uk.yml +0 -7
  109. data/config/locales/zh-CN.yml +0 -8
  110. data/config/locales/zh-TW.yml +0 -7
  111. data/db/migrate/20250912110212_move_voting_rules_to_radio_buttons.rb +22 -0
  112. data/lib/decidim/api/budget_type.rb +7 -0
  113. data/lib/decidim/api/project_type.rb +29 -1
  114. data/lib/decidim/budgets/budget_order_pdf.rb +73 -0
  115. data/lib/decidim/budgets/component.rb +26 -13
  116. data/lib/decidim/budgets/engine.rb +3 -11
  117. data/lib/decidim/budgets/seeds.rb +16 -5
  118. data/lib/decidim/budgets/test/factories.rb +3 -18
  119. data/lib/decidim/budgets/version.rb +1 -1
  120. data/lib/decidim/budgets/workflows/base.rb +0 -14
  121. data/lib/decidim/budgets.rb +1 -5
  122. metadata +22 -16
  123. data/app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb +0 -32
  124. data/app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb +0 -27
  125. data/app/views/decidim/budgets/projects/_order_progress_summary_content.html.erb +0 -122
  126. /data/app/views/decidim/budgets/projects/{_order_progress_progressbar_marks_right.html.erb → order_progress_summary/_progressbar_marks_right.html.erb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6bf98a0370260000cd9211217fb78f77b92f1cc9a52c50b7681b01fc48b6375e
4
- data.tar.gz: aa9846b0a0cfeae924b10b3b9ffd8c97645713ea5db922849fe8093fd8052f50
3
+ metadata.gz: 1f852affad4369e3d28a45187e0298f90f0cbaea28cf7a16dbdba276b4320e98
4
+ data.tar.gz: 393fd5e0272ec16d86f3c74ab7bbcba6188418c1ce877640b9ebc4aa5b73361f
5
5
  SHA512:
6
- metadata.gz: 06b58dbf6582fc3bb58abc17c822435cfffe13907ff8fa0a952f26f4a64ba095d20658127c00650610211a9023982f64336ac895ea19625f89fdf309ed83636a
7
- data.tar.gz: 52b0765bde954b92c6910e179e2c167791ac84aa1682b5a3e7e113ae6530a225c32641599a5f5c1528f373faa7eb007530d3ac073767107ba127f036a5a75419
6
+ metadata.gz: 0474a624715529696457175cd5f371f1bc9bee9ca1fa601a20fc286812ad3865c30332ed973dda35f242c4a8a19f18ae7f6b90f7948ba430f04eae107e220fe3
7
+ data.tar.gz: 4393b8036c89f0ee549193e50f75d4619247650f4b96143a497471ce2d2a656bf0dfbf3dec2ec41e63a13ef182b1e7f6310e3ab3145070d2c5bfd177aa3071a2
@@ -5,7 +5,16 @@
5
5
  <%= decidim_escape_translated(title) %>
6
6
  </h3>
7
7
  <% if voted? %>
8
- <%= icon "check-double-line", class: "inline-block align-middle fill-success ml-2 h-[1.5em] w-[1.5em]" %>
8
+ <div class="float-right">
9
+ <%= icon "check-double-line", class: "inline-block align-middle fill-success ml-2 h-[1.5em] w-[1.5em]" %>
10
+ <span class="text-success font-bold"><%= t("completed", scope: "decidim.budgets.budgets_list") %></span>
11
+ </div>
12
+ <% end %>
13
+ <% if progress? %>
14
+ <div class="float-right">
15
+ <%= icon "progress-2-line", class: "inline-block align-middle fill-warning ml-2 h-[1.5em] w-[1.5em]" %>
16
+ <span class="text-warning font-bold"><%= t("incomplete", scope: "decidim.budgets.budgets_list") %></span>
17
+ </div>
9
18
  <% end %>
10
19
  <div class="my-2">
11
20
  <%= decidim_sanitize html_truncate(translated_attribute(description), length: 70) %>
@@ -24,20 +33,21 @@
24
33
  </div>
25
34
  <% end %>
26
35
  </div>
36
+
27
37
  <% if voting_context? %>
28
- <%= link_to resource_path, class: "budget__card__highlight-vote" do %>
38
+ <%= link_to_resource_or_vote("budget__card__highlight-vote") do %>
29
39
  <div class="budget__card__highlight-vote__header">
30
- <span class="budget__card__highlight-vote__text">
31
- <%= t("name", scope: "decidim.budgets.admin.models.budget") %>
32
- </span>
33
40
  <span class="budget__card__highlight-vote__number">
34
41
  <%= budget_to_currency(total_budget) %>
35
42
  </span>
36
43
  </div>
37
- <%= button_tag class: "button button__sm #{button_class} #{voted? ? "button__transparent-secondary" : "button__secondary"} budget__card__highlight-vote__button" do %>
38
- <span><%= button_text %></span>
39
- <%= icon "arrow-right-line" %>
40
- <% end %>
44
+
45
+ <div class="w-2/3 px-4">
46
+ <%= button_tag class: button_class do %>
47
+ <span><%= button_text %></span>
48
+ <%= icon "arrow-right-line" %>
49
+ <% end %>
50
+ </div>
41
51
  <% end %>
42
52
  <% end %>
43
53
  </div>
@@ -1,4 +1,4 @@
1
- <% if voted? %>
1
+ <% if voted? && voting_open? %>
2
2
  <%= link_to(
3
3
  budget_order_path(budget),
4
4
  method: :delete,
@@ -6,7 +6,7 @@
6
6
  data: { confirm: t(:are_you_sure, scope: "decidim.budgets.projects.budget_summary") }
7
7
  ) do %>
8
8
  <%= icon "delete-bin-line", class: "inline-block align-middle text-gray fill-secondary" %>
9
- <span class="inline-block align-middle underline text-secondary">
9
+ <span class="inline-block align-middle text-secondary font-semibold">
10
10
  <%= t("cancel_order", scope: "decidim.budgets.projects.budget_summary") %>
11
11
  </span>
12
12
  <% end %>
@@ -7,6 +7,7 @@ module Decidim
7
7
  include Decidim::Budgets::ProjectsHelper
8
8
 
9
9
  delegate :highlighted, to: :current_workflow
10
+ delegate :voting_finished?, to: :controller
10
11
 
11
12
  property :title, :description, :total_budget
12
13
  alias budget model
@@ -14,13 +15,12 @@ module Decidim
14
15
  private
15
16
 
16
17
  def card_class
17
- ["card--list__item"].tap do |list|
18
- unless voting_finished?
19
- list << "card--list__data-added" if voted?
20
- list << "card--list__data-progress" if progress?
21
- end
22
- list << "budget--highlighted" if highlighted?
23
- end.join(" ")
18
+ css_classes = "card--list__item"
19
+ css_classes += " budget__card__list-budget--highlighted" if highlighted?
20
+ css_classes += " budget__card__list-budget--progress" if progress?
21
+ css_classes += " budget__card__list-budget--voted" if voted?
22
+
23
+ css_classes
24
24
  end
25
25
 
26
26
  def link_class
@@ -32,7 +32,7 @@ module Decidim
32
32
  end
33
33
 
34
34
  def progress?
35
- current_user && status == :progress
35
+ current_user && status == :progress && voting_open?
36
36
  end
37
37
 
38
38
  def highlighted?
@@ -43,12 +43,38 @@ module Decidim
43
43
  @status ||= current_workflow.status(budget)
44
44
  end
45
45
 
46
+ # If the voting is open, then do the link for the authorized focus mode
47
+ # If not (i.e. voting is disabled or finished), then link to the resource itself
48
+ def link_to_resource_or_vote(css_class)
49
+ if voting_open?
50
+ action_authorized_link_to "vote",
51
+ budget_projects_path(budget, start_voting: true),
52
+ resource: budget,
53
+ data: { "redirect-url": budget_projects_path(budget) },
54
+ class: css_class do
55
+ yield
56
+ end
57
+ else
58
+ link_to resource_path, class: css_class do
59
+ yield
60
+ end
61
+ end
62
+ end
63
+
46
64
  def button_class
47
- "hollow" if voted? || !highlighted?
65
+ css_classes = "button button__sm w-full budget__card__highlight-vote__button "
66
+ css_classes += voted? ? "button__transparent-secondary" : "button__secondary"
67
+ css_classes += " hollow" if voted? || !highlighted?
68
+
69
+ css_classes
48
70
  end
49
71
 
50
72
  def button_text
51
- key = if current_workflow.vote_allowed?(budget) && !voted?
73
+ key = if voting_disabled?
74
+ :see_projects
75
+ elsif voting_finished?
76
+ :see_results
77
+ elsif voting_allowed? && !voted?
52
78
  progress? ? :progress : :vote
53
79
  else
54
80
  :show
@@ -75,6 +101,14 @@ module Decidim
75
101
  @component ||= controller.try(:current_component) || budget.component
76
102
  end
77
103
 
104
+ def voting_disabled?
105
+ current_settings.votes == "disabled"
106
+ end
107
+
108
+ def voting_allowed?
109
+ current_workflow.vote_allowed?(budget)
110
+ end
111
+
78
112
  def voting_context?
79
113
  controller.respond_to?(:voting_finished?)
80
114
  end
@@ -4,8 +4,6 @@
4
4
  <% end %>
5
5
  <% end %>
6
6
 
7
- <% non_highlighted = reorder(budgets).where.not(id: (highlighted + voted).map(&:id)) %>
8
-
9
7
  <% if non_highlighted.exists? %>
10
8
  <% non_highlighted.each do |budget| %>
11
9
  <%= cell("decidim/budgets/budget_list_item", budget) %>
@@ -1,5 +1,5 @@
1
- <h2 class="h5 md:h3 decorator"><%= t(:count, scope: i18n_scope, count: budgets.length) %></h2>
1
+ <h2 class="h5 md:h3 decorator"><%= t(:count, scope: i18n_scope, count: (highlighted + non_highlighted).length) %></h2>
2
2
 
3
- <%= render partial: "decidim/shared/orders", formats: [:html], locals: { orders: AVAILABLE_ORDERS, i18n_scope: "decidim.budgets.budgets_list.orders", css_class: "items-start ml-6", b_css_class: "!justify-start pb-0 pl-0" } %>
3
+ <%= render partial: "decidim/shared/orders", formats: [:html], locals: { orders: AVAILABLE_ORDERS, i18n_scope: "decidim.budgets.budgets_list.orders", css_class: "items-start ml-6", b_css_class: "!justify-start pb-0 pl-0" } %>
4
4
 
5
5
  <%= render :card_list %>
@@ -1,12 +1,12 @@
1
- <% if !voting_finished? && voted? %>
2
- <h2 class="h5 md:h3 decorator mb-8">
1
+ <% if voted? || progress? %>
2
+ <h2 class="h5 md:h3 decorator">
3
3
  <%= t("voted_budgets", scope: "decidim.budgets.budgets_list") %>
4
4
  </h2>
5
5
 
6
6
  <%= render :voted %>
7
7
  <% end %>
8
8
 
9
- <% if budgets.where.not(id: voted.map(&:id)).exists? %>
9
+ <% if non_voted_budgets.any? %>
10
10
  <div id="budgets" class="card__list-list !space-y-5 w-full">
11
11
  <%= main_list %>
12
12
  </div>
@@ -1,13 +1,15 @@
1
- <% if voted? %>
2
- <p><%= t(:voted_on, scope: i18n_scope, links: budgets_link_list(voted)) %></p>
1
+ <p><%= t(:voted_on, scope: i18n_scope, links: budgets_link_list(voted)) %></p>
3
2
 
4
- <div id="voted-budgets" class="card__list-list">
5
- <% voted.each do |budget| %>
6
- <%= cell("decidim/budgets/budget_list_item", budget) %>
7
- <% end %>
8
- </div>
3
+ <% if finished? %>
4
+ <%= cell("decidim/announcement", { body: t(:finished_message, scope: i18n_scope) }, callout_class: "success w-full") %>
5
+ <% end %>
9
6
 
10
- <% if finished? %>
11
- <p><%= t(:finished_message, scope: i18n_scope) %></p>
7
+ <div id="voted-budgets" class="card__list-list w-full">
8
+ <% voted.each do |budget| %>
9
+ <%= cell("decidim/budgets/budget_list_item", budget) %>
12
10
  <% end %>
13
- <% end %>
11
+
12
+ <% progress_budgets.each do |budget| %>
13
+ <%= cell("decidim/budgets/budget_list_item", budget) %>
14
+ <% end %>
15
+ </div>
@@ -26,6 +26,18 @@ module Decidim
26
26
 
27
27
  private
28
28
 
29
+ def progress?
30
+ current_user && voting_open? && progress_budgets.any?
31
+ end
32
+
33
+ def progress_budgets
34
+ budgets.select { |budget| current_workflow.status(budget) == :progress }
35
+ end
36
+
37
+ def non_voted_budgets
38
+ budgets.where.not(id: voted.map(&:id))
39
+ end
40
+
29
41
  def highlighted?
30
42
  current_user && highlighted.any?
31
43
  end
@@ -34,6 +46,16 @@ module Decidim
34
46
  current_user && voted.any?
35
47
  end
36
48
 
49
+ def non_highlighted
50
+ budgets_to_exclude = if voting_finished?
51
+ highlighted + voted
52
+ else
53
+ highlighted + voted + progress_budgets
54
+ end
55
+
56
+ reorder(budgets).where.not(id: budgets_to_exclude.map(&:id))
57
+ end
58
+
37
59
  def finished?
38
60
  return unless budgets.any?
39
61
 
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ # This cell renders the project budget amount
6
+ class ProjectBudgetAmountCell < Decidim::ViewModel
7
+ delegate :voting_finished?, to: :controller
8
+
9
+ def show
10
+ budget_to_currency(model.budget_amount)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,6 +1,12 @@
1
1
  <div class="budget__card__list-project">
2
2
  <span class="budget__card__list-project__amount">
3
- <%= budget_to_currency(project.budget_amount) %>
3
+ <% if show_votes_count? %>
4
+ <%= cell "decidim/budgets/project_votes_count", project, layout: :with_count_label %>
5
+ <% else %>
6
+ <%= budget_to_currency_with_html(project.budget_amount) %>
7
+ <% end %>
4
8
  </span>
5
- <%= cell("decidim/budgets/project_vote_button", project, show_only_added:) %>
9
+ <% if voting_open? %>
10
+ <%= cell("decidim/budgets/project_vote_button", project, show_only_added:) %>
11
+ <% end %>
6
12
  </div>
@@ -1,4 +1,4 @@
1
1
  <div class="card__list-metadata">
2
2
  <%= cell metadata_cell, project %>
3
3
  </div>
4
- <%= cell("decidim/budgets/project_voted_hint", project, class: "margin-left-1") if current_order_checked_out? && resource_added? %>
4
+ <%= cell("decidim/budgets/project_voted_hint", project, class: "margin-left-1") if current_order_checked_out? && resource_added?(project) %>
@@ -9,6 +9,8 @@ module Decidim
9
9
  class ProjectLCell < Decidim::CardLCell
10
10
  include Decidim::Budgets::ProjectsHelper
11
11
 
12
+ delegate :voting_open?, :resource_added?, to: :controller
13
+
12
14
  alias project model
13
15
 
14
16
  private
@@ -17,10 +19,6 @@ module Decidim
17
19
  resource_locator([project.budget, project]).path(url_extra_params)
18
20
  end
19
21
 
20
- def resource_added?
21
- current_order && current_order.projects.include?(model)
22
- end
23
-
24
22
  def current_order
25
23
  @current_order ||= controller.try(:current_order)
26
24
  end
@@ -7,6 +7,7 @@ module Decidim
7
7
  include Decidim::Budgets::ProjectsHelper
8
8
 
9
9
  delegate :selected?, to: :model
10
+ delegate :show_votes_count?, :resource_added?, to: :controller
10
11
 
11
12
  alias project model
12
13
 
@@ -19,7 +20,7 @@ module Decidim
19
20
  private
20
21
 
21
22
  def project_items
22
- [voted_item] + taxonomy_items + [status_item]
23
+ [status_item] + taxonomy_items + [budget_amount]
23
24
  end
24
25
 
25
26
  def items_for_map
@@ -34,31 +35,26 @@ module Decidim
34
35
  def voted_item_for_map
35
36
  {
36
37
  text: "#{model.confirmed_orders_count} #{t("decidim.budgets.projects.project.votes", count: model.confirmed_orders_count)}",
37
- icon: current_order_checked_out? && resource_added? ? "check-double-line" : "check-line"
38
+ icon: current_order_checked_out? && resource_added?(model) ? "check-double-line" : "check-line"
38
39
  }
39
40
  end
40
41
 
41
- def show_votes_count?
42
- project.component.current_settings.show_votes?
43
- end
44
-
45
- def voted_item
46
- return unless show_votes_count? && model.confirmed_orders_count.positive?
42
+ def status_item
43
+ return unless controller.try(:voting_finished?) && selected?
47
44
 
48
45
  {
49
- cell: "decidim/budgets/project_votes_count",
50
- args: [model, { layout: :one_line }],
51
- icon: current_order_checked_out? && resource_added? ? "check-double-line" : "check-line"
46
+ cell: "decidim/budgets/project_selected_status",
47
+ args: model
52
48
  }
53
49
  end
54
50
 
55
- def status_item
56
- return unless controller.try(:voting_finished?) && selected?
51
+ def budget_amount
52
+ return unless show_votes_count?
57
53
 
58
54
  {
59
- cell: "decidim/budgets/project_selected_status",
55
+ cell: "decidim/budgets/project_budget_amount",
60
56
  args: model,
61
- icon: "question-line"
57
+ icon: "coin-line"
62
58
  }
63
59
  end
64
60
 
@@ -66,10 +62,6 @@ module Decidim
66
62
  @current_order ||= controller.try(:current_order)
67
63
  end
68
64
 
69
- def resource_added?
70
- current_order && current_order.projects.include?(model)
71
- end
72
-
73
65
  def current_order_checked_out?
74
66
  current_order&.checked_out?
75
67
  end
@@ -8,21 +8,11 @@ module Decidim
8
8
 
9
9
  def show
10
10
  if voting_finished? && model.selected?
11
- content_tag :span, class: css_class do
11
+ content_tag :span, class: "label success" do
12
12
  t("decidim.budgets.projects.project.selected")
13
13
  end
14
14
  end
15
15
  end
16
-
17
- private
18
-
19
- def css_class
20
- if options[:as_label] == true
21
- "success label project-status"
22
- else
23
- "success card__text--status"
24
- end
25
- end
26
16
  end
27
17
  end
28
18
  end
@@ -2,20 +2,20 @@
2
2
  budget_order_line_item_path(model.budget, project_id: model, show_only_added: options[:show_only_added]),
3
3
  method: vote_button_method,
4
4
  remote: true,
5
- resource: model,
5
+ resource: model.budget,
6
6
  class: "button #{vote_button_classes}",
7
7
  id: "project-vote-button-#{model.id}",
8
8
  data: {
9
- add: !resource_added?,
9
+ add: !resource_added?(model),
10
10
  disable: true,
11
11
  budget: model.budget_amount,
12
12
  allocation: resource_allocation,
13
- "redirect-url": resource_path,
14
- onboarding_redirect_path: resource_index_path
13
+ "redirect-url": authorization_redirect_path,
14
+ onboarding_redirect_path: authorization_redirect_path
15
15
  },
16
16
  disabled: vote_button_disabled?,
17
17
  title: vote_button_label do %>
18
- <% if resource_added? %>
18
+ <% if resource_added?(model) %>
19
19
  <%= t("added", scope: "decidim.budgets.projects.project_budget_button") %>
20
20
  <%= icon "checkbox-circle-line", class: "inline-block" %>
21
21
  <% else %>
@@ -8,7 +8,7 @@ module Decidim
8
8
  include Decidim::Budgets::ProjectsHelper
9
9
  include Decidim::Budgets::Engine.routes.url_helpers
10
10
 
11
- delegate :current_user, :current_order, :current_component, :can_have_order?, to: :parent_controller
11
+ delegate :current_user, :current_order, :current_component, :can_have_order?, :resource_added?, to: :parent_controller
12
12
 
13
13
  private
14
14
 
@@ -16,6 +16,10 @@ module Decidim
16
16
  options[:project_item]
17
17
  end
18
18
 
19
+ def button_extra_classes
20
+ options[:button_extra_classes] || []
21
+ end
22
+
19
23
  def resource_path
20
24
  resource_locator([model.budget, model]).path
21
25
  end
@@ -28,10 +32,6 @@ module Decidim
28
32
  translated_attribute model.title
29
33
  end
30
34
 
31
- def resource_added?
32
- current_order && current_order.projects.include?(model)
33
- end
34
-
35
35
  def resource_allocation
36
36
  current_order.allocation_for(model)
37
37
  end
@@ -41,9 +41,9 @@ module Decidim
41
41
  end
42
42
 
43
43
  def vote_button_classes
44
- classes = []
44
+ classes = ["xl:w-40"]
45
45
 
46
- classes << if resource_added?
46
+ classes << if resource_added?(model)
47
47
  "success button__secondary budget-list__data--added"
48
48
  else
49
49
  "hollow button__transparent-secondary"
@@ -56,18 +56,23 @@ module Decidim
56
56
  end
57
57
 
58
58
  classes << "budget-list__action" unless vote_button_disabled?
59
+ classes << button_extra_classes
59
60
 
60
61
  classes.join(" ")
61
62
  end
62
63
 
63
64
  def vote_button_method
64
- return :delete if resource_added?
65
+ return :delete if resource_added?(model)
65
66
 
66
67
  :post
67
68
  end
68
69
 
70
+ def authorization_redirect_path
71
+ budget_projects_path(budget, start_voting: true)
72
+ end
73
+
69
74
  def vote_button_label
70
- if resource_added?
75
+ if resource_added?(model)
71
76
  return t(
72
77
  "decidim.budgets.projects.project.remove",
73
78
  resource_name: resource_title
@@ -3,25 +3,25 @@
3
3
  module Decidim
4
4
  module Budgets
5
5
  # This cell renders the vote count.
6
- # Two possible layouts: One or two lines
6
+ # Two possible layouts:
7
+ # - with the count label ("0 votes", "1 vote", "999 votes")
8
+ # - without the count label ("0", "1", "999")
7
9
  class ProjectVotesCountCell < Decidim::ViewModel
10
+ delegate :show_votes_count?, to: :controller
11
+
8
12
  def show
9
13
  return unless show_votes_count?
10
14
 
11
- content_tag :span, content, class: css_class
15
+ content
12
16
  end
13
17
 
14
18
  private
15
19
 
16
- def show_votes_count?
17
- model.component.current_settings.show_votes?
18
- end
19
-
20
20
  def content
21
- if options[:layout] == :one_line
21
+ if options[:layout] == :with_count_label
22
22
  safe_join([model.confirmed_orders_count, " ", count_label])
23
23
  else
24
- safe_join([number, count_label])
24
+ number
25
25
  end
26
26
  end
27
27
 
@@ -32,12 +32,6 @@ module Decidim
32
32
  def count_label
33
33
  content_tag(:span, t("decidim.budgets.projects.project.votes", count: model.confirmed_orders_count))
34
34
  end
35
-
36
- def css_class
37
- css = ["project-votes"]
38
- css << options[:class] if options[:class]
39
- css.join(" ")
40
- end
41
35
  end
42
36
  end
43
37
  end
@@ -19,6 +19,7 @@ module Decidim
19
19
  # Returns nothing.
20
20
  def call
21
21
  return broadcast(:invalid) if invalid_order?
22
+ return broadcast(:invalid) unless voting_open?
22
23
 
23
24
  cancel_order!
24
25
  broadcast(:ok, @order)
@@ -33,6 +34,10 @@ module Decidim
33
34
  def cancel_order!
34
35
  @order.destroy!
35
36
  end
37
+
38
+ def voting_open?
39
+ @order.budget.component.current_settings.votes == "enabled"
40
+ end
36
41
  end
37
42
  end
38
43
  end
@@ -26,7 +26,7 @@ module Decidim
26
26
 
27
27
  on(:invalid) do
28
28
  flash.now[:alert] = I18n.t("budgets.create.invalid", scope: "decidim.budgets.admin")
29
- render action: "new"
29
+ render action: "new", status: :unprocessable_entity
30
30
  end
31
31
  end
32
32
  end
@@ -48,7 +48,7 @@ module Decidim
48
48
 
49
49
  on(:invalid) do
50
50
  flash.now[:alert] = I18n.t("budgets.update.invalid", scope: "decidim.budgets.admin")
51
- render action: "edit"
51
+ render action: "edit", status: :unprocessable_entity
52
52
  end
53
53
  end
54
54
  end
@@ -39,7 +39,7 @@ module Decidim
39
39
 
40
40
  on(:invalid) do
41
41
  flash.now[:alert] = I18n.t("projects.create.invalid", scope: "decidim.budgets.admin")
42
- render action: "new"
42
+ render action: "new", status: :unprocessable_entity
43
43
  end
44
44
  end
45
45
  end
@@ -62,7 +62,7 @@ module Decidim
62
62
 
63
63
  on(:invalid) do
64
64
  flash.now[:alert] = I18n.t("projects.update.invalid", scope: "decidim.budgets.admin")
65
- render action: "edit"
65
+ render action: "edit", status: :unprocessable_entity
66
66
  end
67
67
  end
68
68
  end
@@ -24,7 +24,7 @@ module Decidim
24
24
 
25
25
  on(:invalid) do
26
26
  flash[:alert] = I18n.t("proposals_imports.create.invalid", scope: "decidim.budgets.admin")
27
- render action: "new"
27
+ render action: "new", status: :unprocessable_entity
28
28
  end
29
29
  end
30
30
  end
@@ -8,7 +8,7 @@ module Decidim
8
8
  # Note that it inherits from `Decidim::Components::BaseController`, which
9
9
  # override its layout and provide all kinds of useful methods.
10
10
  class ApplicationController < Decidim::Components::BaseController
11
- helper_method :current_workflow, :voting_finished?, :voting_open?
11
+ helper_method :current_workflow, :voting_finished?, :voting_open?, :show_votes_count?
12
12
 
13
13
  def current_workflow
14
14
  @current_workflow ||= Decidim::Budgets.workflows[workflow_name].new(current_component, current_user)
@@ -22,11 +22,23 @@ module Decidim
22
22
  current_settings.votes == "finished"
23
23
  end
24
24
 
25
+ def show_votes_count?
26
+ current_settings.show_votes?
27
+ end
28
+
29
+ def resource_added?(project)
30
+ current_order && current_order.projects.include?(project)
31
+ end
32
+
25
33
  private
26
34
 
27
35
  def workflow_name
28
36
  @workflow_name ||= current_component.settings.workflow.to_sym
29
37
  end
38
+
39
+ def set_focus_mode_if_voting_open
40
+ @focus_mode = true if voting_open?
41
+ end
30
42
  end
31
43
  end
32
44
  end