Module: Decidim::Budgets::ProjectsHelper

Includes:
ApplicationHelper, MapHelper
Included in:
ApplicationHelper, BudgetListItemCell, ProjectLCell, ProjectMetadataCell, ProjectVoteButtonCell
Defined in:
app/helpers/decidim/budgets/projects_helper.rb

Overview

A helper to render order and budgets actions

Instance Method Summary collapse

Instance Method Details

#budget_confirm_disabled_attrObject



33
34
35
36
37
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 33

def budget_confirm_disabled_attr
  return if current_order_can_be_checked_out?

  %( disabled="disabled" ).html_safe
end

#budget_to_currency(budget) ⇒ Object

Render a budget as a currency

budget - A integer to represent a budget



13
14
15
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 13

def budget_to_currency(budget)
  number_to_currency budget, unit: Decidim.currency_unit, precision: 0
end

#budgets_select_tag(name, options: {}) ⇒ Object



153
154
155
156
157
158
159
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 153

def budgets_select_tag(name, options: {})
  select_tag(
    name,
    options_for_select(reference_budgets_for_select),
    options.merge(include_blank: I18n.t("decidim.budgets.prompt"))
  )
end

#current_order_budget_percentObject

Return a percentage of the current order budget from the total budget



18
19
20
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 18

def current_order_budget_percent
  current_order&.budget_percent.to_f.floor
end

#current_order_budget_percent_minimumObject

Return the minimum percentage of the current order budget from the total budget



23
24
25
26
27
28
29
30
31
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 23

def current_order_budget_percent_minimum
  return 0 if current_order.minimum_projects_rule?

  if current_order.projects_rule?
    (current_order.minimum_projects.to_f / current_order.maximum_projects)
  else
    component_settings.vote_threshold_percent
  end
end

#current_order_can_be_checked_out?Boolean

Return true if the user can continue to the checkout process

Returns:

  • (Boolean)


43
44
45
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 43

def current_order_can_be_checked_out?
  current_order&.can_checkout?
end

#current_order_minimum_reached?Boolean

Returns false if the current order does not have a rule for minimum budget Returns false if the current order has not reached the minimum budget Otherwhise returns true

Returns:

  • (Boolean)


50
51
52
53
54
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 50

def current_order_minimum_reached?
  return false if current_order.minimum_budget.zero?

  current_order.total > current_order.minimum_budget
end

#current_rule_call_for_action_textObject



56
57
58
59
60
61
62
63
64
65
66
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 56

def current_rule_call_for_action_text
  return "" unless current_order

  if current_order_minimum_reached?
    t("minimum_reached", scope: "decidim.budgets.projects.order_progress.dynamic_help")
  elsif current_order.projects.empty?
    t("start_adding_projects", scope: "decidim.budgets.projects.order_progress.dynamic_help")
  else
    t("keep_adding_projects", scope: "decidim.budgets.projects.order_progress.dynamic_help")
  end
end

#current_rule_descriptionObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 68

def current_rule_description
  return unless current_order

  rule_text = if current_order_minimum_reached?
                ""
              elsif current_order.projects_rule?
                if current_order.minimum_projects.positive? && current_order.minimum_projects < current_order.maximum_projects
                  t(
                    "projects_rule.description",
                    scope: "decidim.budgets.projects.order_progress",
                    minimum_number: current_order.minimum_projects,
                    maximum_number: current_order.maximum_projects
                  )
                else
                  t(
                    "projects_rule_maximum_only.description",
                    scope: "decidim.budgets.projects.order_progress",
                    maximum_number: current_order.maximum_projects
                  )
                end
              elsif current_order.minimum_projects_rule?
                t(
                  "minimum_projects_rule.description",
                  scope: "decidim.budgets.projects.order_progress",
                  minimum_number: current_order.minimum_projects
                )
              else
                t(
                  "vote_threshold_percent_rule.description",
                  scope: "decidim.budgets.projects.order_progress",
                  minimum_budget: budget_to_currency(current_order.minimum_budget)
                )
              end
  %(<strong>#{current_rule_call_for_action_text}</strong>. #{rule_text}).html_safe
end

#filter_addition_type_values(added_count:) ⇒ Object



129
130
131
132
133
134
135
136
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 129

def filter_addition_type_values(added_count:)
  return [] if voting_finished?

  [
    ["all", { text: t("all", scope: "decidim.budgets.projects.project_filter"), count: nil }],
    ["added", { text: t("added", scope: "decidim.budgets.projects.project_filter"), count: added_count }]
  ]
end

#filter_sectionsObject



138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 138

def filter_sections
  @filter_sections ||= begin
    items = []
    items.append(method: :with_any_status, collection: filter_status_values, label_scope: "decidim.budgets.projects.filters", id: "status") if voting_finished?
    if current_component.has_subscopes?
      items.append(method: :with_any_scope, collection: resource_filter_scope_values(budget.scope), label_scope: "decidim.budgets.projects.filters", id: "scope")
    end
    if current_participatory_space.categories.any?
      items.append(method: :with_any_category, collection: filter_categories_values, label_scope: "decidim.budgets.projects.filters", id: "category")
    end
  end

  items.reject { |item| item[:collection].blank? }
end

#has_position?(project) ⇒ Boolean

Returns:

  • (Boolean)


123
124
125
126
127
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 123

def has_position?(project)
  return if project.address.blank?

  project.latitude.present? && project.longitude.present?
end

#project_data_for_map(project) ⇒ Object



113
114
115
116
117
118
119
120
121
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 113

def project_data_for_map(project)
  project
    .slice(:latitude, :longitude, :address)
    .merge(
      title: decidim_html_escape(translated_attribute(project.title)),
      link: ::Decidim::ResourceLocatorPresenter.new([project.budget, project]).path,
      items: cell("decidim/budgets/project_metadata", project).send(:project_items_for_map).to_json
    )
end

#projects_data_for_map(geocoded_projects) ⇒ Object

Serialize a collection of geocoded projects to be used by the dynamic map component

geocoded_projects - A collection of geocoded projects



107
108
109
110
111
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 107

def projects_data_for_map(geocoded_projects)
  geocoded_projects.map do |project|
    project_data_for_map(project)
  end
end

#reference_budgets_for_selectObject



161
162
163
164
165
166
167
# File 'app/helpers/decidim/budgets/projects_helper.rb', line 161

def reference_budgets_for_select
  references = Budget.joins(:component)
                     .where(component: { participatory_space: current_participatory_space }).order(weight: :asc)
  references.map do |budget|
    ["#{"&nbsp;" * 4} #{decidim_escape_translated(budget.title)}".html_safe, budget.id]
  end
end