decidim-elections 0.26.1 → 0.26.3
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.
- checksums.yaml +4 -4
- data/app/cells/decidim/elections/election_vote_cta_cell.rb +8 -3
- data/app/cells/decidim/votings/content_blocks/highlighted_votings/show.erb +1 -1
- data/app/cells/decidim/votings/content_blocks/highlighted_votings_cell.rb +1 -0
- data/app/cells/decidim/votings/content_blocks/landing_page/description/show.erb +2 -13
- data/app/cells/decidim/votings/content_blocks/landing_page/description_cell.rb +0 -8
- data/app/cells/decidim/votings/content_blocks/landing_page/header/show.erb +2 -2
- data/app/commands/decidim/elections/admin/add_user_as_trustee.rb +21 -11
- data/app/commands/decidim/elections/admin/create_question.rb +2 -6
- data/app/commands/decidim/elections/admin/setup_election.rb +3 -1
- data/app/commands/decidim/elections/admin/update_question.rb +0 -1
- data/app/commands/decidim/votings/admin/destroy_ballot_style.rb +1 -1
- data/app/controllers/decidim/elections/admin/questions_controller.rb +5 -0
- data/app/controllers/decidim/votings/census/admin/census_controller.rb +1 -1
- data/app/controllers/decidim/votings/votings_controller.rb +2 -0
- data/app/forms/decidim/elections/admin/question_form.rb +0 -2
- data/app/forms/decidim/elections/admin/setup_form.rb +43 -0
- data/app/forms/decidim/votings/census/admin/datum_form.rb +4 -0
- data/app/helpers/decidim/elections/votes_helper.rb +3 -1
- data/app/mailers/decidim/elections/trustee_mailer.rb +28 -0
- data/app/models/decidim/elections/election.rb +2 -2
- data/app/models/decidim/elections/question.rb +1 -1
- data/app/packs/src/decidim/elections/admin/pending_action.js +2 -0
- data/app/packs/src/decidim/elections/admin/trustees_process.js +2 -0
- data/app/packs/src/decidim/elections/broken_promises_handler.js +11 -0
- data/app/packs/src/decidim/elections/trustee/key_ceremony.js +3 -0
- data/app/packs/src/decidim/elections/trustee/tally.js +3 -0
- data/app/packs/src/decidim/elections/voter/casting-vote.js +3 -0
- data/app/packs/src/decidim/elections/voter/setup-vote.js +9 -0
- data/app/packs/src/decidim/votings/in-person-vote.js +3 -0
- data/app/packs/src/decidim/votings/voting-description-cell.js +1 -8
- data/app/permissions/decidim/votings/admin/permissions.rb +3 -1
- data/app/presenters/decidim/votings/admin_log/ballot_style_presenter.rb +5 -1
- data/app/views/decidim/elections/admin/questions/_form.html.erb +0 -4
- data/app/views/decidim/elections/admin/steps/_create_election.html.erb +14 -1
- data/app/views/decidim/elections/admin/steps/index.html.erb +2 -0
- data/app/views/decidim/elections/shared/_broken_promises_modal.html.erb +33 -0
- data/app/views/decidim/elections/trustee_mailer/notification.html.erb +5 -0
- data/app/views/decidim/elections/trustee_zone/elections/show.html.erb +3 -0
- data/app/views/decidim/elections/votes/_server_error_modal.html.erb +28 -0
- data/app/views/decidim/elections/votes/_show_casting.html.erb +2 -0
- data/app/views/decidim/elections/votes/new.html.erb +11 -6
- data/app/views/decidim/votings/admin/votings/_form.html.erb +6 -6
- data/app/views/decidim/votings/polling_officer_zone/in_person_votes/new.html.erb +2 -0
- data/app/views/decidim/votings/polling_officer_zone/in_person_votes/show.html.erb +2 -0
- data/app/views/decidim/votings/votings/_check_fields.html.erb +13 -15
- data/app/views/decidim/votings/votings/_promoted_voting.html.erb +1 -1
- data/app/views/decidim/votings/votings/check_census.html.erb +5 -1
- data/config/locales/ar.yml +9 -2
- data/config/locales/ca.yml +48 -13
- data/config/locales/cs.yml +55 -19
- data/config/locales/de.yml +38 -18
- data/config/locales/el.yml +0 -1
- data/config/locales/en.yml +48 -14
- data/config/locales/es-MX.yml +57 -22
- data/config/locales/es-PY.yml +52 -17
- data/config/locales/es.yml +52 -17
- data/config/locales/eu.yml +3 -16
- data/config/locales/fi-plain.yml +49 -15
- data/config/locales/fi.yml +49 -15
- data/config/locales/fr-CA.yml +50 -16
- data/config/locales/fr.yml +50 -16
- data/config/locales/ga-IE.yml +3 -0
- data/config/locales/gl.yml +10 -14
- data/config/locales/hu.yml +14 -1
- data/config/locales/it.yml +7 -18
- data/config/locales/ja.yml +49 -16
- data/config/locales/lt.yml +1427 -0
- data/config/locales/lv.yml +0 -1
- data/config/locales/nl.yml +15 -17
- data/config/locales/no.yml +8 -4
- data/config/locales/oc-FR.yml +1 -0
- data/config/locales/pl.yml +9 -17
- data/config/locales/pt-BR.yml +4 -17
- data/config/locales/pt.yml +4 -17
- data/config/locales/ro-RO.yml +2 -15
- data/config/locales/sv.yml +53 -10
- data/config/locales/tr-TR.yml +8 -1
- data/config/locales/zh-CN.yml +7 -1
- data/db/migrate/20220615102642_remove_description_from_elections_questions.rb +7 -0
- data/lib/decidim/api/election_question_type.rb +0 -1
- data/lib/decidim/elections/admin_engine.rb +4 -1
- data/lib/decidim/elections/component.rb +0 -12
- data/lib/decidim/elections/test/factories.rb +0 -1
- data/lib/decidim/elections/version.rb +1 -1
- metadata +19 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 79cbe0a072815eeb089fe22866c15107b9dd0f68e6a3a3cc3c45471f7186777c
|
|
4
|
+
data.tar.gz: d67f9a69166f20546353b2b40d7a19ce08a59f4837fde321d2c369c7c9a9ab3f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b2ef4df36d4b64aa1f6d26d01716d39ce15511c1c4c70be51c86830f29c43d4d854ab2b1a5d3f2fd38ee0f8f9c31d0c9542497b86cc261030cdb8278b739aa34
|
|
7
|
+
data.tar.gz: 6da057cd74be00affe5622b0b6de4be710838768b0ec778596bf8588b166d5a4c6ca8357563b396f62169a49c8a4449bfb7a9e653eceeecd21fdbfe65157210a
|
|
@@ -5,15 +5,20 @@ module Decidim
|
|
|
5
5
|
# This cell renders the results
|
|
6
6
|
# for a given instance of an Election
|
|
7
7
|
class ElectionVoteCtaCell < Decidim::ViewModel
|
|
8
|
+
include Decidim::Elections::HasVoteFlow
|
|
9
|
+
|
|
8
10
|
delegate :current_user,
|
|
9
11
|
:current_participatory_space,
|
|
10
|
-
:
|
|
11
|
-
:can_preview?,
|
|
12
|
-
:vote_flow,
|
|
12
|
+
:allowed_to?,
|
|
13
13
|
to: :controller
|
|
14
14
|
|
|
15
15
|
private
|
|
16
16
|
|
|
17
|
+
# This is needed by HasVoteFlow
|
|
18
|
+
def election
|
|
19
|
+
model
|
|
20
|
+
end
|
|
21
|
+
|
|
17
22
|
def last_vote
|
|
18
23
|
@last_vote ||= Decidim::Elections::Votes::LastVoteForVoter.for(model, vote_flow.voter_id) if vote_flow.has_voter?
|
|
19
24
|
end
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<div class="column">
|
|
9
9
|
<%= link_to decidim_votings.voting_path(voting), class: "card card--voting card--mini" do %>
|
|
10
10
|
<div aria-hidden="true" class="card__image-top"
|
|
11
|
-
style="background-image:url(<%= voting.attached_uploader(:banner_image).path %>)"></div>
|
|
11
|
+
style="background-image:url('<%= voting.attached_uploader(:banner_image).path %>')"></div>
|
|
12
12
|
<div class="card__content">
|
|
13
13
|
<span class="card__title card__link"><%= translated_attribute voting.title %></span>
|
|
14
14
|
</div>
|
|
@@ -1,25 +1,14 @@
|
|
|
1
|
-
<div class="row section voting-description-cell">
|
|
1
|
+
<div class="row section voting-description-cell mt-m">
|
|
2
2
|
<div class="columns">
|
|
3
3
|
<% if introductory_image.attached? %>
|
|
4
4
|
<div id="introductory-image" class="columns medium-4 mediumlarge-5">
|
|
5
5
|
<img src="<%= introductory_image.path %>" alt="">
|
|
6
6
|
</div>
|
|
7
7
|
<% end %>
|
|
8
|
-
<div class="columns medium-8 mediumlarge-7
|
|
8
|
+
<div class="columns medium-8 mediumlarge-7">
|
|
9
9
|
<h2 class="show-for-sr"><%= t("decidim.votings.content_blocks.landing_page.description.title") %></h2>
|
|
10
10
|
<div><%= description_text %></div>
|
|
11
11
|
</div>
|
|
12
|
-
<div class="content-height-toggler show-more">
|
|
13
|
-
<button class="button button--muted tiny">
|
|
14
|
-
<span class="button-text show-more-content">
|
|
15
|
-
<%= button_show_more_text %>
|
|
16
|
-
</span>
|
|
17
|
-
|
|
18
|
-
<span class="button-text show-less-content hide">
|
|
19
|
-
<%= button_show_less_text %>
|
|
20
|
-
</span>
|
|
21
|
-
</button>
|
|
22
|
-
</div>
|
|
23
12
|
</div>
|
|
24
13
|
</div>
|
|
25
14
|
|
|
@@ -18,14 +18,6 @@ module Decidim
|
|
|
18
18
|
def description_text
|
|
19
19
|
decidim_sanitize_editor(translated_attribute(current_participatory_space.description))
|
|
20
20
|
end
|
|
21
|
-
|
|
22
|
-
def button_show_more_text
|
|
23
|
-
t(:show_more, scope: "decidim.votings.content_blocks.landing_page.description")
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def button_show_less_text
|
|
27
|
-
t(:show_less, scope: "decidim.votings.content_blocks.landing_page.description")
|
|
28
|
-
end
|
|
29
21
|
end
|
|
30
22
|
end
|
|
31
23
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<section class="extended hero" style="background-image:url(<%= current_participatory_space.attached_uploader(:banner_image).path %>);">
|
|
1
|
+
<section class="extended hero" style="background-image:url('<%= current_participatory_space.attached_uploader(:banner_image).path %>');">
|
|
2
2
|
<div class="hero__container">
|
|
3
3
|
<div class="row">
|
|
4
4
|
<div class="columns large-10 text-left">
|
|
@@ -24,6 +24,6 @@
|
|
|
24
24
|
</div>
|
|
25
25
|
</section>
|
|
26
26
|
|
|
27
|
-
<section
|
|
27
|
+
<section>
|
|
28
28
|
<%= extended_navigation_bar(navigation_items) %>
|
|
29
29
|
</section>
|
|
@@ -11,6 +11,8 @@ module Decidim
|
|
|
11
11
|
# form - A form object with the params.
|
|
12
12
|
def initialize(form, current_user)
|
|
13
13
|
@form = form
|
|
14
|
+
@user = form.user
|
|
15
|
+
@participatory_space = form.current_participatory_space
|
|
14
16
|
@current_user = current_user
|
|
15
17
|
end
|
|
16
18
|
|
|
@@ -27,29 +29,31 @@ module Decidim
|
|
|
27
29
|
notify_user_about_trustee_role if new_trustee?
|
|
28
30
|
end
|
|
29
31
|
|
|
32
|
+
send_email
|
|
33
|
+
|
|
30
34
|
broadcast(:ok)
|
|
31
35
|
end
|
|
32
36
|
|
|
33
37
|
private
|
|
34
38
|
|
|
35
|
-
attr_reader :form, :current_user, :trustee
|
|
39
|
+
attr_reader :form, :current_user, :trustee, :participatory_space, :user
|
|
36
40
|
|
|
37
41
|
def add_user_as_trustee!
|
|
38
42
|
@trustee = Decidim.traceability.create!(
|
|
39
43
|
Trustee,
|
|
40
|
-
|
|
41
|
-
user:
|
|
42
|
-
organization:
|
|
44
|
+
current_user,
|
|
45
|
+
user: user,
|
|
46
|
+
organization: user.organization
|
|
43
47
|
)
|
|
44
48
|
end
|
|
45
49
|
|
|
46
50
|
# If a trustee exists for this participatory space, it won't get created again
|
|
47
51
|
def existing_trustee_participatory_spaces?
|
|
48
|
-
trustees_space = TrusteesParticipatorySpace.where(participatory_space:
|
|
52
|
+
trustees_space = TrusteesParticipatorySpace.where(participatory_space: participatory_space).includes(:trustee)
|
|
49
53
|
@existing_trustee_participatory_spaces ||= Decidim::Elections::Trustee.joins(:trustees_participatory_spaces)
|
|
50
54
|
.includes([:user])
|
|
51
55
|
.where(trustees_participatory_spaces: trustees_space)
|
|
52
|
-
.where(decidim_user_id:
|
|
56
|
+
.where(decidim_user_id: user.id).any?
|
|
53
57
|
end
|
|
54
58
|
|
|
55
59
|
# if there's no user - trustee relation, the trustee gets created and the notification
|
|
@@ -57,13 +61,13 @@ module Decidim
|
|
|
57
61
|
def new_trustee?
|
|
58
62
|
return @new_trustee if defined?(@new_trustee)
|
|
59
63
|
|
|
60
|
-
@new_trustee = Decidim::Elections::Trustee.where(decidim_user_id:
|
|
64
|
+
@new_trustee = Decidim::Elections::Trustee.where(decidim_user_id: user.id).empty?
|
|
61
65
|
end
|
|
62
66
|
|
|
63
67
|
def add_participatory_space
|
|
64
|
-
trustee = Decidim::Elections::Trustee.find_by(decidim_user_id:
|
|
68
|
+
trustee = Decidim::Elections::Trustee.find_by(decidim_user_id: user.id)
|
|
65
69
|
trustee.trustees_participatory_spaces.create!(
|
|
66
|
-
participatory_space:
|
|
70
|
+
participatory_space: participatory_space
|
|
67
71
|
)
|
|
68
72
|
end
|
|
69
73
|
|
|
@@ -71,11 +75,17 @@ module Decidim
|
|
|
71
75
|
data = {
|
|
72
76
|
event: "decidim.events.elections.trustees.new_trustee",
|
|
73
77
|
event_class: Decidim::Elections::Trustees::NotifyNewTrusteeEvent,
|
|
74
|
-
resource:
|
|
75
|
-
affected_users: [
|
|
78
|
+
resource: participatory_space,
|
|
79
|
+
affected_users: [user]
|
|
76
80
|
}
|
|
77
81
|
Decidim::EventsManager.publish(**data)
|
|
78
82
|
end
|
|
83
|
+
|
|
84
|
+
def send_email
|
|
85
|
+
Decidim::Elections::TrusteeMailer.notification(
|
|
86
|
+
user, participatory_space, I18n.locale.to_s
|
|
87
|
+
).deliver_later
|
|
88
|
+
end
|
|
79
89
|
end
|
|
80
90
|
end
|
|
81
91
|
end
|
|
@@ -14,7 +14,8 @@ module Decidim
|
|
|
14
14
|
#
|
|
15
15
|
# Broadcasts :ok if successful, :invalid otherwise.
|
|
16
16
|
def call
|
|
17
|
-
return broadcast(:
|
|
17
|
+
return broadcast(:election_started) if form.election.started?
|
|
18
|
+
return broadcast(:invalid) if form.invalid?
|
|
18
19
|
|
|
19
20
|
create_question!
|
|
20
21
|
|
|
@@ -25,15 +26,10 @@ module Decidim
|
|
|
25
26
|
|
|
26
27
|
attr_reader :form, :question
|
|
27
28
|
|
|
28
|
-
def invalid?
|
|
29
|
-
form.election.started? || form.invalid?
|
|
30
|
-
end
|
|
31
|
-
|
|
32
29
|
def create_question!
|
|
33
30
|
attributes = {
|
|
34
31
|
election: form.election,
|
|
35
32
|
title: form.title,
|
|
36
|
-
description: form.description,
|
|
37
33
|
max_selections: form.max_selections,
|
|
38
34
|
weight: form.weight,
|
|
39
35
|
random_answers_order: form.random_answers_order,
|
|
@@ -94,7 +94,9 @@ module Decidim
|
|
|
94
94
|
weight: question.weight,
|
|
95
95
|
max_selections: question.max_selections,
|
|
96
96
|
title: flatten_translations(question.title),
|
|
97
|
-
description
|
|
97
|
+
# the bulletin_board gem (ruby client) expects a description for the question
|
|
98
|
+
# as development is in a separate repository, let's send an empty content for the moment
|
|
99
|
+
description: {},
|
|
98
100
|
answers: question_answers_data(question)
|
|
99
101
|
}
|
|
100
102
|
end
|
|
@@ -26,6 +26,11 @@ module Decidim
|
|
|
26
26
|
flash.now[:alert] = I18n.t("questions.create.invalid", scope: "decidim.elections.admin")
|
|
27
27
|
render action: "new"
|
|
28
28
|
end
|
|
29
|
+
|
|
30
|
+
on(:election_started) do
|
|
31
|
+
flash.now[:alert] = I18n.t("questions.create.election_started", scope: "decidim.elections.admin")
|
|
32
|
+
render action: "new"
|
|
33
|
+
end
|
|
29
34
|
end
|
|
30
35
|
end
|
|
31
36
|
|
|
@@ -98,7 +98,7 @@ module Decidim
|
|
|
98
98
|
if current_census.access_codes_file.attached?
|
|
99
99
|
redirect_to Rails.application.routes.url_helpers.rails_blob_url(current_census.access_codes_file.blob, only_path: true)
|
|
100
100
|
else
|
|
101
|
-
flash[:error] = t("export_access_codes.
|
|
101
|
+
flash[:error] = t("export_access_codes.file_not_exist", scope: "decidim.votings.census.admin.census")
|
|
102
102
|
redirect_to admin_voting_census_path
|
|
103
103
|
end
|
|
104
104
|
end
|
|
@@ -103,6 +103,8 @@ module Decidim
|
|
|
103
103
|
end
|
|
104
104
|
|
|
105
105
|
def elections
|
|
106
|
+
raise ActionController::RoutingError, "Not Found" unless current_participatory_space
|
|
107
|
+
|
|
106
108
|
Decidim::Elections::Election.where(component: current_participatory_space.components).where.not(bb_status: nil)
|
|
107
109
|
end
|
|
108
110
|
|
|
@@ -8,14 +8,12 @@ module Decidim
|
|
|
8
8
|
include TranslatableAttributes
|
|
9
9
|
|
|
10
10
|
translatable_attribute :title, String
|
|
11
|
-
translatable_attribute :description, String
|
|
12
11
|
attribute :max_selections, Integer, default: 1
|
|
13
12
|
attribute :weight, Integer, default: 0
|
|
14
13
|
attribute :random_answers_order, Boolean, default: true
|
|
15
14
|
attribute :min_selections, Integer, default: 1
|
|
16
15
|
|
|
17
16
|
validates :title, translatable_presence: true
|
|
18
|
-
validates :description, translatable_presence: true
|
|
19
17
|
validates :max_selections, presence: true, numericality: { greater_than_or_equal_to: 1 }
|
|
20
18
|
|
|
21
19
|
def election
|
|
@@ -13,6 +13,12 @@ module Decidim
|
|
|
13
13
|
validations.each do |message, t_args, valid|
|
|
14
14
|
errors.add(message, I18n.t("steps.create_election.errors.#{message}", **t_args, scope: "decidim.elections.admin")) unless valid
|
|
15
15
|
end
|
|
16
|
+
|
|
17
|
+
if needs_census?
|
|
18
|
+
census_validations.each do |message, t_args, valid|
|
|
19
|
+
errors.add(message, I18n.t("steps.create_election.errors.#{message}", **t_args, scope: "decidim.elections.admin")) unless valid
|
|
20
|
+
end
|
|
21
|
+
end
|
|
16
22
|
end
|
|
17
23
|
|
|
18
24
|
def current_step; end
|
|
@@ -34,17 +40,34 @@ module Decidim
|
|
|
34
40
|
[:minimum_answers, {}, election.minimum_answers?],
|
|
35
41
|
[:max_selections, {}, election.valid_questions?],
|
|
36
42
|
[:published, {}, election.published_at.present?],
|
|
43
|
+
[:component_published, {}, election.component.published?],
|
|
37
44
|
[:time_before, { hours: Decidim::Elections.setup_minimum_hours_before_start }, election.minimum_hours_before_start?],
|
|
38
45
|
[:trustees_number, { number: bulletin_board.number_of_trustees }, participatory_space_trustees_with_public_key.size >= bulletin_board.number_of_trustees]
|
|
39
46
|
].freeze
|
|
40
47
|
end
|
|
41
48
|
|
|
49
|
+
def census_validations
|
|
50
|
+
return [] unless needs_census?
|
|
51
|
+
|
|
52
|
+
@census_validations ||= [
|
|
53
|
+
[:census_uploaded, {}, census.present? && census.data.exists?],
|
|
54
|
+
[:census_codes_generated, {}, census_codes_generated?],
|
|
55
|
+
[:census_frozen, {}, census&.freeze?]
|
|
56
|
+
].freeze
|
|
57
|
+
end
|
|
58
|
+
|
|
42
59
|
def messages
|
|
43
60
|
@messages ||= validations.map do |message, t_args, _valid|
|
|
44
61
|
[message, I18n.t("steps.create_election.requirements.#{message}", **t_args, scope: "decidim.elections.admin")]
|
|
45
62
|
end.to_h
|
|
46
63
|
end
|
|
47
64
|
|
|
65
|
+
def census_messages
|
|
66
|
+
@census_messages ||= census_validations.to_h do |message, t_args, _valid|
|
|
67
|
+
[message, I18n.t("steps.create_election.requirements.#{message}", **t_args, scope: "decidim.elections.admin")]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
48
71
|
def participatory_space_trustees
|
|
49
72
|
@participatory_space_trustees ||= Decidim::Elections::Trustees::ByParticipatorySpace.new(election.component.participatory_space).to_a
|
|
50
73
|
end
|
|
@@ -57,6 +80,26 @@ module Decidim
|
|
|
57
80
|
@bulletin_board ||= context[:bulletin_board] || Decidim::Elections.bulletin_board
|
|
58
81
|
end
|
|
59
82
|
|
|
83
|
+
def needs_census?
|
|
84
|
+
vote_flow.is_a?(Decidim::Votings::CensusVoteFlow)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def vote_flow
|
|
88
|
+
@vote_flow ||= election.participatory_space.try(:vote_flow_for, election)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def census_codes_generated?
|
|
92
|
+
return unless needs_census?
|
|
93
|
+
|
|
94
|
+
census&.codes_generated? || census&.exporting_codes? || census&.freeze?
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def census
|
|
98
|
+
return unless needs_census?
|
|
99
|
+
|
|
100
|
+
@census ||= election.component.participatory_space.dataset
|
|
101
|
+
end
|
|
102
|
+
|
|
60
103
|
def main_button?
|
|
61
104
|
true
|
|
62
105
|
end
|
|
@@ -17,9 +17,13 @@ module Decidim
|
|
|
17
17
|
attribute :email, String
|
|
18
18
|
attribute :ballot_style_code, String
|
|
19
19
|
|
|
20
|
+
validates :birthdate, format: { with: /\A\d{8}\z/ }
|
|
21
|
+
|
|
20
22
|
validates :full_name,
|
|
21
23
|
:full_address,
|
|
24
|
+
:birthdate,
|
|
22
25
|
presence: true
|
|
26
|
+
|
|
23
27
|
def ballot_style_code
|
|
24
28
|
@ballot_style_code&.upcase
|
|
25
29
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
# This mailer sends a notification email to a recently added trustee
|
|
6
|
+
class TrusteeMailer < Decidim::ApplicationMailer
|
|
7
|
+
include TranslatableAttributes
|
|
8
|
+
|
|
9
|
+
# Public: Sends an email to a trustee that just got added to a participatory space.
|
|
10
|
+
#
|
|
11
|
+
# user - The user to be notified
|
|
12
|
+
# participatory_space - The participatory space where the trustee was added.
|
|
13
|
+
# locale - The locale that will be used for the email content (optional).
|
|
14
|
+
#
|
|
15
|
+
# Returns nothing.
|
|
16
|
+
def notification(user, participatory_space, locale = nil)
|
|
17
|
+
@user = user
|
|
18
|
+
@participatory_space = participatory_space
|
|
19
|
+
@organization = user.organization
|
|
20
|
+
|
|
21
|
+
I18n.with_locale(locale || @organization.default_locale) do
|
|
22
|
+
@participatory_space_title = translated_attribute(participatory_space.title)
|
|
23
|
+
mail(to: user.email, subject: I18n.t("subject", scope: "decidim.elections.admin.mailers.trustee_mailer", resource_name: @participatory_space_title))
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -86,7 +86,7 @@ module Decidim
|
|
|
86
86
|
#
|
|
87
87
|
# Returns a boolean.
|
|
88
88
|
def minimum_answers?
|
|
89
|
-
questions.all? { |question| question.answers.size > 1 }
|
|
89
|
+
questions.any? && questions.all? { |question| question.answers.size > 1 }
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
# Public: Checks if the election results are published and election finished
|
|
@@ -107,7 +107,7 @@ module Decidim
|
|
|
107
107
|
#
|
|
108
108
|
# Returns a boolean.
|
|
109
109
|
def valid_questions?
|
|
110
|
-
questions.all?(&:valid_max_selection?)
|
|
110
|
+
questions.any? && questions.all?(&:valid_max_selection?)
|
|
111
111
|
end
|
|
112
112
|
|
|
113
113
|
# Public: Gets the voting period status of the election
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Decidim
|
|
4
4
|
module Elections
|
|
5
5
|
# The data store for a Question in the Decidim::Elections component. It stores a
|
|
6
|
-
# title
|
|
6
|
+
# title and a maximum number of selection that voters can choose.
|
|
7
7
|
class Question < ApplicationRecord
|
|
8
8
|
include Decidim::Resourceable
|
|
9
9
|
include Traceable
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/* Fallback for non-handled failed promises */
|
|
2
|
+
window.addEventListener("unhandledrejection", (event) => {
|
|
3
|
+
console.log("broken", event)
|
|
4
|
+
$("#server-failure .tech-info").html(event.reason);
|
|
5
|
+
if (event.reason.toString().indexOf("fetch") === -1) {
|
|
6
|
+
$("#server-failure .communication_error").addClass("hide");
|
|
7
|
+
$("#server-failure .generic_error").removeClass("hide");
|
|
8
|
+
}
|
|
9
|
+
$("#server-failure").foundation("open");
|
|
10
|
+
});
|
|
11
|
+
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/* eslint-disable require-jsdoc */
|
|
2
2
|
|
|
3
|
+
// show a message to the user if comunication is lost
|
|
4
|
+
import "src/decidim/elections/broken_promises_handler";
|
|
3
5
|
import { VoteComponent } from "@decidim/decidim-bulletin_board";
|
|
4
6
|
|
|
5
7
|
import * as VotingSchemesDummy from "@decidim/voting_schemes-dummy";
|
|
@@ -46,5 +48,12 @@ export default function setupVoteComponent($voteWrapper) {
|
|
|
46
48
|
});
|
|
47
49
|
}
|
|
48
50
|
|
|
51
|
+
/* Fallback for non-handled failed promises */
|
|
52
|
+
window.addEventListener("unhandledrejection", (event) => {
|
|
53
|
+
$("#server-failure .tech-info").html(event.reason);
|
|
54
|
+
$("#server-failure").foundation("open");
|
|
55
|
+
});
|
|
56
|
+
|
|
49
57
|
window.Decidim = window.Decidim || {};
|
|
50
58
|
window.Decidim.setupVoteComponent = setupVoteComponent;
|
|
59
|
+
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
$(() => {
|
|
2
|
-
const isShowMoreButton = ($button) => $button.hasClass("show-more-content");
|
|
3
|
-
|
|
4
2
|
const remToPx = (count) => {
|
|
5
3
|
const unit = $("html").css("font-size");
|
|
6
4
|
|
|
@@ -25,17 +23,12 @@ $(() => {
|
|
|
25
23
|
$content.css("max-height", contentMaxHeight);
|
|
26
24
|
}
|
|
27
25
|
|
|
28
|
-
$button.on("click", (
|
|
29
|
-
const $buttonTextMore = $button.find(".button-text.show-more-content");
|
|
26
|
+
$button.on("click", () => {
|
|
30
27
|
const $buttonTextLess = $button.find(".button-text.show-less-content");
|
|
31
28
|
|
|
32
29
|
let newHeight = contentMaxHeight;
|
|
33
|
-
if (isShowMoreButton($(event.target))) {
|
|
34
|
-
newHeight = contentHeight;
|
|
35
|
-
}
|
|
36
30
|
|
|
37
31
|
$content.css("max-height", newHeight);
|
|
38
32
|
$buttonTextLess.toggleClass("hide");
|
|
39
|
-
$buttonTextMore.toggleClass("hide");
|
|
40
33
|
});
|
|
41
34
|
});
|
|
@@ -8,6 +8,9 @@ module Decidim
|
|
|
8
8
|
return permission_action unless user
|
|
9
9
|
return user_allowed_to_read_admin_dashboard? if read_admin_dashboard_action?
|
|
10
10
|
return permission_action unless permission_action.scope == :admin
|
|
11
|
+
|
|
12
|
+
user_can_enter_space_area?
|
|
13
|
+
|
|
11
14
|
return permission_action if voting && !voting.is_a?(Decidim::Votings::Voting)
|
|
12
15
|
|
|
13
16
|
unless user_can_read_votings_admin_dashboard?
|
|
@@ -15,7 +18,6 @@ module Decidim
|
|
|
15
18
|
return permission_action
|
|
16
19
|
end
|
|
17
20
|
|
|
18
|
-
user_can_enter_space_area?
|
|
19
21
|
allowed_read_participatory_space?
|
|
20
22
|
allowed_voting_action?
|
|
21
23
|
|
|
@@ -17,10 +17,14 @@ module Decidim
|
|
|
17
17
|
|
|
18
18
|
def i18n_params
|
|
19
19
|
super.merge(
|
|
20
|
-
ballot_style_code:
|
|
20
|
+
ballot_style_code: ballot_style_code.to_s
|
|
21
21
|
)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
+
def ballot_style_code
|
|
25
|
+
action_log&.resource&.code || action_log.extra["code"]
|
|
26
|
+
end
|
|
27
|
+
|
|
24
28
|
def action_string
|
|
25
29
|
case action
|
|
26
30
|
when "create", "delete", "update"
|
|
@@ -8,10 +8,6 @@
|
|
|
8
8
|
<%= form.translated :text_field, :title, autofocus: true %>
|
|
9
9
|
</div>
|
|
10
10
|
|
|
11
|
-
<div class="row column">
|
|
12
|
-
<%= form.translated :editor, :description %>
|
|
13
|
-
</div>
|
|
14
|
-
|
|
15
11
|
<div class="row column">
|
|
16
12
|
<%= form.number_field :max_selections, step: 1, min: 0 %>
|
|
17
13
|
</div>
|
|
@@ -14,10 +14,23 @@
|
|
|
14
14
|
<% end %>
|
|
15
15
|
</ul>
|
|
16
16
|
|
|
17
|
+
<% if form.needs_census? %>
|
|
18
|
+
<h4><%= t(".census") %></h4>
|
|
19
|
+
<ul class="no-bullet-indented">
|
|
20
|
+
<% form.census_messages.each do |key, value| %>
|
|
21
|
+
<% if form.errors.include?(key) %>
|
|
22
|
+
<li><%= icon "x", class: "text-alert", role: "img", "aria-hidden": true %> <%= form.errors.messages[key][0].html_safe %></li>
|
|
23
|
+
<% else %>
|
|
24
|
+
<li><%= icon "check", class: "text-success", role: "img", "aria-hidden": true %> <%= value.html_safe %></li>
|
|
25
|
+
<% end %>
|
|
26
|
+
<% end %>
|
|
27
|
+
</ul>
|
|
28
|
+
<% end %>
|
|
29
|
+
|
|
17
30
|
<h4><%= t(".trustees") %></h4>
|
|
18
31
|
<ul class="no-bullet-indented">
|
|
19
32
|
<% if form.participatory_space_trustees.none? %>
|
|
20
|
-
<li><%= t(".no_trustees") %></li>
|
|
33
|
+
<li><%= icon "x", class: "text-alert", role: "img", "aria-hidden": true %> <%= t(".no_trustees") %></li>
|
|
21
34
|
<% end %>
|
|
22
35
|
|
|
23
36
|
<% form.participatory_space_trustees.map {|trustee| [trustee, form.trustees.none? || form.trustees.include?(trustee)] }
|