decidim-budgets 0.21.0 → 0.23.2

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 (190) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -3
  3. data/app/assets/images/decidim/budgets/icon.svg +1 -11
  4. data/app/assets/javascripts/decidim/budgets/projects.js.es6 +26 -4
  5. data/app/assets/stylesheets/decidim/budgets/budget/_budget-list.scss +152 -24
  6. data/app/cells/decidim/budgets/base_cell.rb +22 -0
  7. data/app/cells/decidim/budgets/budget_cell.rb +21 -0
  8. data/app/cells/decidim/budgets/budget_information_modal/show.erb +28 -0
  9. data/app/cells/decidim/budgets/budget_information_modal_cell.rb +22 -0
  10. data/app/cells/decidim/budgets/budget_list_item/show.erb +22 -0
  11. data/app/cells/decidim/budgets/budget_list_item_cell.rb +40 -0
  12. data/app/cells/decidim/budgets/budget_m/data.erb +12 -0
  13. data/app/cells/decidim/budgets/budget_m/footer.erb +5 -0
  14. data/app/cells/decidim/budgets/budget_m_cell.rb +16 -0
  15. data/app/cells/decidim/budgets/budgets_header/show.erb +7 -0
  16. data/app/cells/decidim/budgets/budgets_header_cell.rb +14 -0
  17. data/app/cells/decidim/budgets/budgets_list/card_list.erb +7 -0
  18. data/app/cells/decidim/budgets/budgets_list/highlighted.erb +11 -0
  19. data/app/cells/decidim/budgets/budgets_list/show.erb +20 -0
  20. data/app/cells/decidim/budgets/budgets_list/voted.erb +43 -0
  21. data/app/cells/decidim/budgets/budgets_list_cell.rb +39 -0
  22. data/app/cells/decidim/budgets/limit_announcement_cell.rb +52 -0
  23. data/app/cells/decidim/budgets/project_list_item/project_data.erb +19 -0
  24. data/app/cells/decidim/budgets/project_list_item/project_data_vote_button.erb +15 -0
  25. data/app/cells/decidim/budgets/project_list_item/project_image.erb +5 -0
  26. data/app/cells/decidim/budgets/project_list_item/project_text.erb +23 -0
  27. data/app/cells/decidim/budgets/project_list_item/show.erb +5 -0
  28. data/app/cells/decidim/budgets/project_list_item_cell.rb +66 -0
  29. data/app/cells/decidim/budgets/project_m/data.erb +3 -3
  30. data/app/cells/decidim/budgets/project_m/footer.erb +1 -1
  31. data/app/cells/decidim/budgets/project_m_cell.rb +4 -0
  32. data/app/cells/decidim/budgets/project_selected_status_cell.rb +28 -0
  33. data/app/cells/decidim/budgets/project_tags/show.erb +5 -0
  34. data/app/cells/decidim/budgets/project_tags_cell.rb +18 -0
  35. data/app/cells/decidim/budgets/project_voted_hint_cell.rb +33 -0
  36. data/app/cells/decidim/budgets/project_votes_count_cell.rb +44 -0
  37. data/app/commands/decidim/budgets/add_line_item.rb +7 -10
  38. data/app/commands/decidim/budgets/admin/create_budget.rb +48 -0
  39. data/app/commands/decidim/budgets/admin/create_project.rb +26 -11
  40. data/app/commands/decidim/budgets/admin/destroy_budget.rb +42 -0
  41. data/app/commands/decidim/budgets/admin/import_proposals_to_budgets.rb +26 -25
  42. data/app/commands/decidim/budgets/admin/update_budget.rb +48 -0
  43. data/app/commands/decidim/budgets/admin/update_project.rb +20 -2
  44. data/app/commands/decidim/budgets/checkout.rb +7 -6
  45. data/app/commands/decidim/budgets/remove_line_item.rb +3 -2
  46. data/app/controllers/concerns/decidim/budgets/needs_current_order.rb +18 -2
  47. data/app/controllers/concerns/decidim/budgets/orderable.rb +57 -0
  48. data/app/controllers/decidim/budgets/admin/application_controller.rb +10 -2
  49. data/app/controllers/decidim/budgets/admin/attachment_collections_controller.rb +1 -1
  50. data/app/controllers/decidim/budgets/admin/attachments_controller.rb +2 -2
  51. data/app/controllers/decidim/budgets/admin/budgets_controller.rb +82 -0
  52. data/app/controllers/decidim/budgets/admin/projects_controller.rb +15 -12
  53. data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +10 -2
  54. data/app/controllers/decidim/budgets/application_controller.rb +23 -0
  55. data/app/controllers/decidim/budgets/budgets_controller.rb +24 -0
  56. data/app/controllers/decidim/budgets/line_items_controller.rb +10 -6
  57. data/app/controllers/decidim/budgets/orders_controller.rb +20 -6
  58. data/app/controllers/decidim/budgets/projects_controller.rb +24 -19
  59. data/app/forms/decidim/budgets/admin/budget_form.rb +39 -0
  60. data/app/forms/decidim/budgets/admin/component_form.rb +44 -0
  61. data/app/forms/decidim/budgets/admin/project_form.rb +25 -9
  62. data/app/forms/decidim/budgets/admin/project_import_proposals_form.rb +4 -0
  63. data/app/helpers/decidim/budgets/admin/application_helper.rb +13 -0
  64. data/app/helpers/decidim/budgets/application_helper.rb +10 -0
  65. data/app/helpers/decidim/budgets/projects_helper.rb +13 -0
  66. data/app/jobs/decidim/budgets/send_order_summary_job.rb +15 -0
  67. data/app/mailers/decidim/budgets/order_summary_mailer.rb +36 -0
  68. data/app/models/decidim/budgets/budget.rb +34 -0
  69. data/app/models/decidim/budgets/line_item.rb +4 -4
  70. data/app/models/decidim/budgets/order.rb +47 -16
  71. data/app/models/decidim/budgets/project.rb +37 -4
  72. data/app/permissions/decidim/budgets/admin/permissions.rb +23 -10
  73. data/app/permissions/decidim/budgets/permissions.rb +28 -6
  74. data/app/presenters/decidim/budgets/admin_log/budget_presenter.rb +42 -0
  75. data/app/queries/decidim/budgets/filtered_projects.rb +9 -1
  76. data/app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb +3 -2
  77. data/app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb +6 -5
  78. data/app/serializers/decidim/budgets/data_portability_budgets_order_serializer.rb +3 -2
  79. data/app/services/decidim/budgets/project_search.rb +12 -24
  80. data/app/types/decidim/budgets/budget_type.rb +24 -0
  81. data/app/types/decidim/budgets/budgets_type.rb +6 -6
  82. data/app/types/decidim/budgets/project_type.rb +2 -1
  83. data/app/views/decidim/budgets/admin/budgets/_form.html.erb +23 -0
  84. data/app/views/decidim/budgets/admin/budgets/edit.html.erb +7 -0
  85. data/app/views/decidim/budgets/admin/budgets/index.html.erb +58 -0
  86. data/app/views/decidim/budgets/admin/budgets/new.html.erb +7 -0
  87. data/app/views/decidim/budgets/admin/projects/_form.html.erb +15 -10
  88. data/app/views/decidim/budgets/admin/projects/edit.html.erb +2 -2
  89. data/app/views/decidim/budgets/admin/projects/index.html.erb +20 -7
  90. data/app/views/decidim/budgets/admin/projects/new.html.erb +2 -2
  91. data/app/views/decidim/budgets/admin/projects/proposals_picker.html.erb +1 -0
  92. data/app/views/decidim/budgets/admin/proposals_imports/new.html.erb +1 -1
  93. data/app/views/decidim/budgets/budgets/index.html.erb +5 -0
  94. data/app/views/decidim/budgets/order_summary_mailer/order_summary.html.erb +22 -0
  95. data/app/views/decidim/budgets/projects/_budget_confirm.html.erb +3 -3
  96. data/app/views/decidim/budgets/projects/_budget_summary.html.erb +26 -7
  97. data/app/views/decidim/budgets/projects/_filters.html.erb +15 -7
  98. data/app/views/decidim/budgets/projects/_linked_projects.html.erb +2 -2
  99. data/app/views/decidim/budgets/projects/_order_progress.html.erb +14 -18
  100. data/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +3 -3
  101. data/app/views/decidim/budgets/projects/_project.html.erb +1 -57
  102. data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +36 -7
  103. data/app/views/decidim/budgets/projects/_projects.html.erb +8 -1
  104. data/app/views/decidim/budgets/projects/index.html.erb +15 -7
  105. data/app/views/decidim/budgets/projects/index.js.erb +8 -0
  106. data/app/views/decidim/budgets/projects/show.html.erb +22 -13
  107. data/config/locales/am-ET.yml +1 -0
  108. data/config/locales/ar.yml +2 -16
  109. data/config/locales/bg-BG.yml +7 -0
  110. data/config/locales/bg.yml +6 -0
  111. data/config/locales/ca.yml +125 -11
  112. data/config/locales/cs.yml +148 -34
  113. data/config/locales/da-DK.yml +1 -0
  114. data/config/locales/da.yml +1 -0
  115. data/config/locales/de.yml +143 -29
  116. data/config/locales/el.yml +168 -0
  117. data/config/locales/en.yml +125 -11
  118. data/config/locales/eo.yml +1 -0
  119. data/config/locales/es-MX.yml +125 -11
  120. data/config/locales/es-PY.yml +125 -11
  121. data/config/locales/es.yml +125 -11
  122. data/config/locales/et-EE.yml +1 -0
  123. data/config/locales/et.yml +1 -0
  124. data/config/locales/eu.yml +5 -13
  125. data/config/locales/fi-plain.yml +126 -12
  126. data/config/locales/fi.yml +136 -22
  127. data/config/locales/fr-CA.yml +267 -0
  128. data/config/locales/fr.yml +125 -11
  129. data/config/locales/ga-IE.yml +1 -0
  130. data/config/locales/gl.yml +70 -15
  131. data/config/locales/hr-HR.yml +1 -0
  132. data/config/locales/hr.yml +1 -0
  133. data/config/locales/hu.yml +18 -12
  134. data/config/locales/id-ID.yml +2 -11
  135. data/config/locales/is-IS.yml +0 -11
  136. data/config/locales/is.yml +114 -0
  137. data/config/locales/it.yml +96 -12
  138. data/config/locales/ja-JP.yml +172 -0
  139. data/config/locales/ja.yml +262 -0
  140. data/config/locales/ko-KR.yml +1 -0
  141. data/config/locales/ko.yml +1 -0
  142. data/config/locales/lt-LT.yml +1 -0
  143. data/config/locales/lt.yml +1 -0
  144. data/config/locales/lv.yml +164 -0
  145. data/config/locales/mt-MT.yml +1 -0
  146. data/config/locales/mt.yml +1 -0
  147. data/config/locales/nl.yml +112 -12
  148. data/config/locales/no.yml +42 -13
  149. data/config/locales/om-ET.yml +1 -0
  150. data/config/locales/pl.yml +175 -61
  151. data/config/locales/pt-BR.yml +3 -13
  152. data/config/locales/pt.yml +62 -46
  153. data/config/locales/ro-RO.yml +172 -0
  154. data/config/locales/ru.yml +2 -14
  155. data/config/locales/si-LK.yml +1 -0
  156. data/config/locales/sk-SK.yml +180 -0
  157. data/config/locales/sk.yml +166 -0
  158. data/config/locales/sl.yml +1 -0
  159. data/config/locales/so-SO.yml +1 -0
  160. data/config/locales/sr-CS.yml +27 -0
  161. data/config/locales/sv.yml +125 -11
  162. data/config/locales/sw-KE.yml +1 -0
  163. data/config/locales/ti-ER.yml +1 -0
  164. data/config/locales/tr-TR.yml +152 -38
  165. data/config/locales/uk.yml +2 -14
  166. data/config/locales/vi-VN.yml +1 -0
  167. data/config/locales/vi.yml +1 -0
  168. data/config/locales/zh-CN.yml +260 -0
  169. data/config/locales/zh-TW.yml +1 -0
  170. data/db/migrate/20200617105120_create_decidim_budgets.rb +15 -0
  171. data/db/migrate/20200629072626_rename_budget_to_budget_ammount.rb +7 -0
  172. data/db/migrate/20200629134013_add_budget_reference_to_project.rb +7 -0
  173. data/db/migrate/20200706142609_add_budget_reference_to_order.rb +7 -0
  174. data/db/migrate/20200714103519_move_budgets_to_own_model.rb +109 -0
  175. data/db/migrate/20200717140012_add_scope_to_budgets.rb +7 -0
  176. data/db/migrate/20200728075039_add_selected_at_to_project.rb +7 -0
  177. data/db/migrate/20200804175222_votes_enabled_to_votes_choices.rb +35 -0
  178. data/db/migrate/20200827154129_add_commentable_counter_cache_to_projects.rb +9 -0
  179. data/lib/decidim/budgets.rb +1 -0
  180. data/lib/decidim/budgets/admin_engine.rb +12 -5
  181. data/lib/decidim/budgets/component.rb +87 -38
  182. data/lib/decidim/budgets/engine.rb +8 -6
  183. data/lib/decidim/budgets/seeds/city.jpeg +0 -0
  184. data/lib/decidim/budgets/test/factories.rb +71 -9
  185. data/lib/decidim/budgets/version.rb +1 -1
  186. data/lib/decidim/budgets/workflows.rb +17 -0
  187. data/lib/decidim/budgets/workflows/all.rb +20 -0
  188. data/lib/decidim/budgets/workflows/base.rb +132 -0
  189. data/lib/decidim/budgets/workflows/one.rb +33 -0
  190. metadata +123 -19
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ # This cell renders the budget item list in the budgets list
6
+ class BudgetListItemCell < BaseCell
7
+ delegate :voting_finished?, to: :controller
8
+
9
+ property :title
10
+ alias budget model
11
+
12
+ private
13
+
14
+ def card_class
15
+ ["card--list__item"].tap do |list|
16
+ unless voting_finished?
17
+ list << "card--list__data-added" if voted?
18
+ list << "card--list__data-progress" if progress?
19
+ end
20
+ end.join(" ")
21
+ end
22
+
23
+ def link_class
24
+ "card__link card--list__heading"
25
+ end
26
+
27
+ def voted?
28
+ current_user && status == :voted
29
+ end
30
+
31
+ def progress?
32
+ current_user && status == :progress
33
+ end
34
+
35
+ def status
36
+ @status ||= current_workflow.status(budget)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,12 @@
1
+ <div class="card__icondata">
2
+ <ul class="card-data">
3
+ <li class="card-data__item">
4
+ <%= icon "euro-outline", class: "icon--big", role: "img", "aria-hidden": true %>
5
+ </li>
6
+ <li class="card-data__item">
7
+ <div class="text-left">
8
+ <strong class="heading4"><%= budget_to_currency model.total_budget %></strong>
9
+ </div>
10
+ </li>
11
+ </ul>
12
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="card__footer">
2
+ <div class="card__support">
3
+ <%= link_to t("view", scope: "decidim.budgets.budget"), resource_path, class: "card__button button button--sc small" %>
4
+ </div>
5
+ </div>
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ # This cell renders the Medium (:m) budget card
6
+ # for an given instance of a Decidim::Budgets::Budget
7
+ class BudgetMCell < Decidim::CardMCell
8
+ include ActiveSupport::NumberHelper
9
+ include Decidim::Budgets::ProjectsHelper
10
+
11
+ def statuses
12
+ []
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ <div class="row">
2
+ <div class="columns medium-7 mediumlarge-8">
3
+ <div class="section">
4
+ <%= decidim_sanitize(landing_page_content) %>
5
+ </div>
6
+ </div>
7
+ </div>
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ # This cell renders the Budgets component header
6
+ class BudgetsHeaderCell < BaseCell
7
+ private
8
+
9
+ def landing_page_content
10
+ translated_attribute(current_settings.landing_page_content).presence || translated_attribute(settings.landing_page_content)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ <div id="budgets" class="card card--list card--list--mini">
2
+ <% budgets.each do |budget| %>
3
+ <% next if highlighted.include?(budget) && !voting_finished? %>
4
+
5
+ <%= cell("decidim/budgets/budget_list_item", budget) %>
6
+ <% end %>
7
+ </div>
@@ -0,0 +1,11 @@
1
+ <% if highlighted? %>
2
+ <p id="highlighted-budget">
3
+ <% highlighted.each do |budget| %>
4
+ <%= link_to(
5
+ t("highlighted_cta", scope: i18n_scope,
6
+ name: translated_attribute(budget.title)),
7
+ resource_locator(budget).path,
8
+ class: :button ) %>
9
+ <% end %>
10
+ </p>
11
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <div class="row">
2
+ <div class="columns medium-7 mediumlarge-8">
3
+ <% if !voting_finished? && (highlighted? || voted?) %>
4
+ <div class="section">
5
+ <h3 class="section-heading">
6
+ <%= t(:my_budgets, scope: i18n_scope) %>
7
+ </h3>
8
+
9
+ <%= render :highlighted %>
10
+ <%= render :voted %>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div class="row">
15
+ <div class="columns mediumlarge-6">
16
+ <%= render :card_list %>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </div>
@@ -0,0 +1,43 @@
1
+ <% if voted? %>
2
+ <div id="voted-budgets">
3
+ <p class="lead">
4
+ <%= t(:voted_on, scope: i18n_scope, links: budgets_link_list(voted)) %>
5
+ </p>
6
+
7
+ <% if finished? %>
8
+ <p class="lead">
9
+ <%= t(:finished_message, scope: i18n_scope) %>
10
+ </p>
11
+ <% end %>
12
+
13
+ <% if voting_open? %>
14
+ <div>
15
+ <p>
16
+ <%= t(:if_change_opinion, scope: i18n_scope) %>
17
+ <%= link_to(
18
+ t("cancel_order.only_one", scope: i18n_scope),
19
+ budget_order_path(voted.first),
20
+ method: :delete,
21
+ data: { confirm: t("projects.budget_summary.are_you_sure", scope: "decidim.budgets") }) if voted.one? %>
22
+ </p>
23
+
24
+ <% if !voted.one? && voted.any? %>
25
+ <ul>
26
+ <% voted.each do |budget| %>
27
+ <li>
28
+ <%= link_to(
29
+ t("cancel_order.more_than_one", scope: i18n_scope, name: translated_attribute(budget.title)),
30
+ budget_order_path(budget),
31
+ method: :delete,
32
+ class: "cancel-order",
33
+ data: {
34
+ confirm: t("projects.budget_summary.are_you_sure", scope: "decidim.budgets")
35
+ }) %>
36
+ </li>
37
+ <% end %>
38
+ </ul>
39
+ <% end %>
40
+ </div>
41
+ <% end %>
42
+ </div>
43
+ <% end %>
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ # This cell renders the budgets list of a Budget component
6
+ class BudgetsListCell < BaseCell
7
+ alias current_workflow model
8
+
9
+ delegate :allowed, :budgets, :highlighted, :voted, to: :current_workflow
10
+ delegate :voting_open?, :voting_finished?, to: :controller
11
+
12
+ def show
13
+ return unless budgets
14
+
15
+ render
16
+ end
17
+
18
+ private
19
+
20
+ def highlighted?
21
+ current_user && highlighted.any?
22
+ end
23
+
24
+ def voted?
25
+ current_user && voted.any?
26
+ end
27
+
28
+ def finished?
29
+ return unless budgets.any?
30
+
31
+ current_user && (allowed - voted).none?
32
+ end
33
+
34
+ def i18n_scope
35
+ "decidim.budgets.budgets_list"
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ # This cell renders information when current user can't create more budgets orders.
6
+ class LimitAnnouncementCell < BaseCell
7
+ alias budget model
8
+ delegate :voted?, :vote_allowed?, :discardable, :limit_reached?, to: :current_workflow
9
+ delegate :voting_open?, to: :controller
10
+
11
+ def show
12
+ cell("decidim/announcement", announcement_args) if announce?
13
+ end
14
+
15
+ private
16
+
17
+ def announce?
18
+ return unless voting_open?
19
+ return unless current_user
20
+ return if vote_allowed?(budget)
21
+ return if voted?(budget)
22
+
23
+ discardable.any? || !vote_allowed?(budget, false)
24
+ end
25
+
26
+ def announcement_args
27
+ {
28
+ callout_class: "warning",
29
+ announcement: announcement_message
30
+ }
31
+ end
32
+
33
+ def announcement_message
34
+ if discardable.any?
35
+ t(:limit_reached, scope: i18n_scope,
36
+ links: budgets_link_list(discardable),
37
+ landing_path: budgets_path)
38
+ else
39
+ t(:cant_vote, scope: i18n_scope, landing_path: budgets_path)
40
+ end
41
+ end
42
+
43
+ def should_discard_to_vote?
44
+ limit_reached? && discardable.any?
45
+ end
46
+
47
+ def i18n_scope
48
+ "decidim.budgets.limit_announcement"
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,19 @@
1
+ <div class="budget-list__data <%= data_class %>">
2
+ <% if voting_finished? %>
3
+ <div class="budget-list__data__votes">
4
+ <%= cell("decidim/budgets/project_votes_count", model) %>
5
+
6
+ <%= cell("decidim/budgets/project_voted_hint", model, class: "display-block margin-top-1") %>
7
+ </div>
8
+ <% else %>
9
+ <span class="budget-list__data__number budget-list__number show-for-medium">
10
+ <%= budget_to_currency(model.budget_amount) %>
11
+
12
+ <%= cell("decidim/budgets/project_votes_count", model, layout: :one_line, class: "display-inline-block") %>
13
+
14
+ <%= cell("decidim/budgets/project_voted_hint", model, class: "display-block margin-top-1") if current_order_checked_out? && resource_added? %>
15
+ </span>
16
+
17
+ <%= render :project_data_vote_button if !current_order_checked_out? && voting_open? %>
18
+ <% end %>
19
+ </div>
@@ -0,0 +1,15 @@
1
+ <%= action_authorized_button_to "vote",
2
+ budget_order_line_item_path(model.budget, project_id: model),
3
+ method: vote_button_method,
4
+ remote: true,
5
+ class: "button tiny budget-list__action #{vote_button_class}",
6
+ data: {
7
+ add: !resource_added?,
8
+ disable: true,
9
+ budget: model.budget_amount,
10
+ "redirect-url": resource_path
11
+ },
12
+ disabled: vote_button_disabled?,
13
+ title: vote_button_label do %>
14
+ <%= icon(resource_added? ? "x" : "check", class: "icon--small", aria_label: vote_button_label, role: "img") %>
15
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <% if model.photos.first %>
2
+ <div class="budget-list__image">
3
+ <%= image_tag model.photos.first.thumbnail_url, alt: resource_title %>
4
+ </div>
5
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <div class="budget-list__text card__text">
2
+ <div>
3
+ <%= link_to resource_path, class: "card__link" do %>
4
+ <h5 class="card__title budget-list__title">
5
+ <%= cell("decidim/budgets/project_selected_status", model) %>
6
+
7
+ <%= resource_title %>
8
+ </h5>
9
+ <% end %>
10
+
11
+ <div class="show-for-medium">
12
+ <%= cell "decidim/budgets/project_tags", model, context: { extra_classes: ["tags--project"] } %>
13
+ </div>
14
+
15
+ <div class="budget-list__data__number budget-list__number hide-for-medium">
16
+ <%= cell("decidim/budgets/project_votes_count",
17
+ model,
18
+ layout: :one_line) %>
19
+
20
+ <%= cell("decidim/budgets/project_voted_hint", model, class: "margin-left-1") if current_order_checked_out? && resource_added? %>
21
+ </div>
22
+ </div>
23
+ </div>
@@ -0,0 +1,5 @@
1
+ <div id="project-<%= model.id %>-item" class="budget-list__item">
2
+ <%= render :project_image %>
3
+ <%= render :project_text %>
4
+ <%= render :project_data %>
5
+ </div>
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ # This cell renders a horizontal project card
6
+ # for an given instance of a Project in a budget list
7
+ class ProjectListItemCell < Decidim::ViewModel
8
+ include ActiveSupport::NumberHelper
9
+ include Decidim::LayoutHelper
10
+ include Decidim::ActionAuthorizationHelper
11
+ include Decidim::Budgets::ProjectsHelper
12
+ include Decidim::Budgets::Engine.routes.url_helpers
13
+
14
+ delegate :current_user, :current_settings, :current_order, :current_component,
15
+ :current_participatory_space, :can_have_order?, :voting_open?, :voting_finished?, to: :parent_controller
16
+
17
+ private
18
+
19
+ def resource_path
20
+ resource_locator([model.budget, model]).path(filter_link_params)
21
+ end
22
+
23
+ def resource_title
24
+ translated_attribute model.title
25
+ end
26
+
27
+ def resource_added?
28
+ current_order && current_order.projects.include?(model)
29
+ end
30
+
31
+ def data_class
32
+ [].tap do |list|
33
+ list << "budget-list__data--added" if can_have_order? && resource_added?
34
+ list << "show-for-medium" if voting_finished? || (current_order_checked_out? && !resource_added?)
35
+ end.join(" ")
36
+ end
37
+
38
+ def vote_button_disabled?
39
+ current_user && !can_have_order?
40
+ end
41
+
42
+ def vote_button_class
43
+ return "success" if resource_added?
44
+
45
+ "hollow"
46
+ end
47
+
48
+ def vote_button_method
49
+ return :delete if resource_added?
50
+
51
+ :post
52
+ end
53
+
54
+ def vote_button_label
55
+ if resource_added?
56
+ return t(
57
+ "decidim.budgets.projects.project.remove",
58
+ resource_name: resource_title
59
+ )
60
+ end
61
+
62
+ t("decidim.budgets.projects.project.add", resource_name: resource_title)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,11 +1,11 @@
1
1
  <div class="card__icondata">
2
2
  <ul class="card-data">
3
3
  <li class="card-data__item">
4
- <%= icon "euro-outline", class: "icon--big" %>
4
+ <%= icon "euro-outline", class: "icon--big", role: "img", "aria-hidden": true %>
5
5
  </li>
6
6
  <li class="card-data__item">
7
- <div class="text-left text-uppercase">
8
- <strong class="heading4"><%= budget_to_currency model.budget %></strong>
7
+ <div class="text-left">
8
+ <strong class="heading4"><%= budget_to_currency model.budget_amount %></strong>
9
9
  </div>
10
10
  </li>
11
11
  </ul>