Module: Decidim::Proposals::ApplicationHelper

Includes:
CheckBoxesTreeHelper, Comments::CommentsHelper, EndorsableHelper, FollowableHelper, MapHelper, CollaborativeDraftHelper, ControlVersionHelper, MapHelper, ProposalVotesHelper, RichTextEditorHelper, PaginateHelper
Included in:
CollaborativeDraftCellsHelper, ProposalCellsHelper
Defined in:
app/helpers/decidim/proposals/application_helper.rb

Overview

Custom helpers, scoped to the proposals engine.

Instance Method Summary collapse

Methods included from ControlVersionHelper

#item_name

Methods included from CollaborativeDraftHelper

#accept_request_button_label, #filter_collaborative_drafts_state_values, #reject_request_button_label

Methods included from MapHelper

#has_position?, #proposal_data_for_map, #proposal_preview_data_for_map, #proposals_data_for_map

Methods included from ProposalVotesHelper

#can_accumulate_supports_beyond_threshold?, #current_user_can_vote?, #remaining_votes_count_for, #threshold_per_proposal, #threshold_per_proposal_enabled?, #vote_button_classes, #vote_limit, #vote_limit_enabled?, #votes_blocked?, #votes_count_classes, #votes_enabled?

Instance Method Details

#activity_filter_valuesObject

Options to filter Proposals by activity.



163
164
165
166
167
168
169
170
# File 'app/helpers/decidim/proposals/application_helper.rb', line 163

def activity_filter_values
  base = [
    ["all", t(".all")],
    ["my_proposals", t(".my_proposals")]
  ]
  base += [["voted", t(".voted")]] if current_settings.votes_enabled?
  base
end

#collaborative_draft_state_badge_css_class(state) ⇒ Object

Public: The css class applied based on the collaborative draft state.

state - The String state of the collaborative draft.

Returns a String.



68
69
70
71
72
73
74
75
76
77
# File 'app/helpers/decidim/proposals/application_helper.rb', line 68

def collaborative_draft_state_badge_css_class(state)
  case state
  when "open"
    "success"
  when "withdrawn"
    "alert"
  when "published"
    "secondary"
  end
end

#filter_origin_valuesObject



172
173
174
175
176
177
178
179
180
181
182
183
# File 'app/helpers/decidim/proposals/application_helper.rb', line 172

def filter_origin_values
  origin_values = []
  origin_values << TreePoint.new("official", t("decidim.proposals.application_helper.filter_origin_values.official")) if component_settings.official_proposals_enabled
  origin_values << TreePoint.new("citizens", t("decidim.proposals.application_helper.filter_origin_values.citizens"))
  origin_values << TreePoint.new("user_group", t("decidim.proposals.application_helper.filter_origin_values.user_groups")) if current_organization.user_groups_enabled?
  origin_values << TreePoint.new("meeting", t("decidim.proposals.application_helper.filter_origin_values.meetings"))

  TreeNode.new(
    TreePoint.new("", t("decidim.proposals.application_helper.filter_origin_values.all")),
    origin_values
  )
end

#filter_type_valuesObject



154
155
156
157
158
159
160
# File 'app/helpers/decidim/proposals/application_helper.rb', line 154

def filter_type_values
  [
    ["all", t("decidim.proposals.application_helper.filter_type_values.all")],
    ["proposals", t("decidim.proposals.application_helper.filter_type_values.proposals")],
    ["amendments", t("decidim.proposals.application_helper.filter_type_values.amendments")]
  ]
end

#form_has_address?Boolean

Returns:

  • (Boolean)


140
141
142
# File 'app/helpers/decidim/proposals/application_helper.rb', line 140

def form_has_address?
  @form.address.present? || @form.has_address
end

#humanize_collaborative_draft_state(state) ⇒ Object

Public: The state of a proposal in a way a human can understand.

state - The String state of the proposal.

Returns a String.



59
60
61
# File 'app/helpers/decidim/proposals/application_helper.rb', line 59

def humanize_collaborative_draft_state(state)
  I18n.t("decidim.proposals.collaborative_drafts.states.#{state}", default: :open)
end

#humanize_proposal_state(state) ⇒ Object

Public: The state of a proposal in a way a human can understand.

state - The String state of the proposal.

Returns a String.



27
28
29
# File 'app/helpers/decidim/proposals/application_helper.rb', line 27

def humanize_proposal_state(state)
  I18n.t(state, scope: "decidim.proposals.answers", default: :not_answered)
end

#minimum_votes_per_user_enabled?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'app/helpers/decidim/proposals/application_helper.rb', line 83

def minimum_votes_per_user_enabled?
  minimum_votes_per_user.positive?
end

#not_from_collaborative_draft(proposal) ⇒ Object



87
88
89
# File 'app/helpers/decidim/proposals/application_helper.rb', line 87

def not_from_collaborative_draft(proposal)
  proposal.linked_resources(:proposals, "created_from_collaborative_draft").empty?
end

#not_from_participatory_text(proposal) ⇒ Object



91
92
93
# File 'app/helpers/decidim/proposals/application_helper.rb', line 91

def not_from_participatory_text(proposal)
  proposal.participatory_text_level.nil?
end

#proposal_limitObject



119
120
121
122
123
# File 'app/helpers/decidim/proposals/application_helper.rb', line 119

def proposal_limit
  return if component_settings.proposal_limit.zero?

  component_settings.proposal_limit
end

#proposal_limit_enabled?Boolean

Returns:

  • (Boolean)


79
80
81
# File 'app/helpers/decidim/proposals/application_helper.rb', line 79

def proposal_limit_enabled?
  proposal_limit.present?
end

#proposal_state_css_class(proposal) ⇒ Object

Public: The css class applied based on the proposal state.

proposal - The proposal to evaluate.

Returns a String.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'app/helpers/decidim/proposals/application_helper.rb', line 36

def proposal_state_css_class(proposal)
  state = proposal.state
  state = proposal.internal_state if proposal.answered? && !proposal.published_state?

  case state
  when "accepted"
    "text-success"
  when "rejected"
    "text-alert"
  when "evaluating"
    "text-warning"
  when "withdrawn"
    "text-alert"
  else
    "text-info"
  end
end

#render_proposal_body(proposal) ⇒ Object

If the content is safe, HTML tags are sanitized, otherwise, they are stripped.



104
105
106
# File 'app/helpers/decidim/proposals/application_helper.rb', line 104

def render_proposal_body(proposal)
  render_sanitized_content(proposal, :body)
end

#safe_content?Boolean

If the proposal is official or the rich text editor is enabled on the frontend, the proposal body is considered as safe content; that’s unless the proposal comes from a collaborative_draft or a participatory_text.

Returns:

  • (Boolean)


98
99
100
101
# File 'app/helpers/decidim/proposals/application_helper.rb', line 98

def safe_content?
  rich_text_editor_in_public_views? && not_from_collaborative_draft(@proposal) ||
    (@proposal.official? || @proposal.official_meeting?) && not_from_participatory_text(@proposal)
end

#show_voting_rules?Boolean

Returns:

  • (Boolean)


144
145
146
147
148
149
150
151
152
# File 'app/helpers/decidim/proposals/application_helper.rb', line 144

def show_voting_rules?
  return false unless votes_enabled?

  return true if vote_limit_enabled?
  return true if threshold_per_proposal_enabled?
  return true if proposal_limit_enabled?
  return true if can_accumulate_supports_beyond_threshold?
  return true if minimum_votes_per_user_enabled?
end

#text_editor_for_proposal_body(form) ⇒ Object

Returns :text_area or :editor based on the organization’ settings.



109
110
111
112
113
114
115
116
117
# File 'app/helpers/decidim/proposals/application_helper.rb', line 109

def text_editor_for_proposal_body(form)
  options = {
    class: "js-hashtags",
    hashtaggable: true,
    value: form_presenter.body(extras: false).strip
  }

  text_editor_for(form, :body, options)
end

#vote_button_for(model, from_proposals_list) ⇒ Object



136
137
138
# File 'app/helpers/decidim/proposals/application_helper.rb', line 136

def vote_button_for(model, from_proposals_list)
  render partial: "decidim/proposals/proposals/participatory_texts/proposal_vote_button.html", locals: { proposal: model, from_proposals_list: from_proposals_list }
end

#votes_count_for(model, from_proposals_list) ⇒ Object



132
133
134
# File 'app/helpers/decidim/proposals/application_helper.rb', line 132

def votes_count_for(model, from_proposals_list)
  render partial: "decidim/proposals/proposals/participatory_texts/proposal_votes_count.html", locals: { proposal: model, from_proposals_list: from_proposals_list }
end

#votes_givenObject



125
126
127
128
129
130
# File 'app/helpers/decidim/proposals/application_helper.rb', line 125

def votes_given
  @votes_given ||= ProposalVote.where(
    proposal: Proposal.where(component: current_component),
    author: current_user
  ).count
end