decidim-elections 0.22.0
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 +7 -0
- data/README.md +31 -0
- data/Rakefile +3 -0
- data/app/assets/config/decidim_elections_manifest.js +0 -0
- data/app/assets/images/decidim/elections/icon.svg +1 -0
- data/app/commands/decidim/elections/admin/create_answer.rb +71 -0
- data/app/commands/decidim/elections/admin/create_election.rb +48 -0
- data/app/commands/decidim/elections/admin/create_question.rb +52 -0
- data/app/commands/decidim/elections/admin/destroy_answer.rb +50 -0
- data/app/commands/decidim/elections/admin/destroy_election.rb +46 -0
- data/app/commands/decidim/elections/admin/destroy_question.rb +46 -0
- data/app/commands/decidim/elections/admin/update_answer.rb +73 -0
- data/app/commands/decidim/elections/admin/update_election.rb +48 -0
- data/app/commands/decidim/elections/admin/update_question.rb +52 -0
- data/app/controllers/decidim/elections/admin/answers_controller.rb +92 -0
- data/app/controllers/decidim/elections/admin/application_controller.rb +15 -0
- data/app/controllers/decidim/elections/admin/elections_controller.rb +82 -0
- data/app/controllers/decidim/elections/admin/questions_controller.rb +86 -0
- data/app/controllers/decidim/elections/application_controller.rb +13 -0
- data/app/controllers/decidim/elections/elections_controller.rb +9 -0
- data/app/forms/decidim/elections/admin/answer_form.rb +53 -0
- data/app/forms/decidim/elections/admin/election_form.rb +24 -0
- data/app/forms/decidim/elections/admin/question_form.rb +26 -0
- data/app/helpers/decidim/elections/application_helper.rb +10 -0
- data/app/models/decidim/elections/answer.rb +26 -0
- data/app/models/decidim/elections/application_record.rb +10 -0
- data/app/models/decidim/elections/election.rb +22 -0
- data/app/models/decidim/elections/question.rb +20 -0
- data/app/permissions/decidim/elections/admin/permissions.rb +42 -0
- data/app/permissions/decidim/elections/permissions.rb +16 -0
- data/app/types/decidim/elections/election_answer_type.rb +24 -0
- data/app/types/decidim/elections/election_question_type.rb +25 -0
- data/app/types/decidim/elections/election_type.rb +26 -0
- data/app/types/decidim/elections/elections_type.rb +32 -0
- data/app/views/decidim/elections/admin/answers/_form.html.erb +25 -0
- data/app/views/decidim/elections/admin/answers/edit.html.erb +7 -0
- data/app/views/decidim/elections/admin/answers/index.html.erb +46 -0
- data/app/views/decidim/elections/admin/answers/new.html.erb +7 -0
- data/app/views/decidim/elections/admin/answers/proposals_picker.html.erb +1 -0
- data/app/views/decidim/elections/admin/elections/_form.html.erb +28 -0
- data/app/views/decidim/elections/admin/elections/edit.html.erb +7 -0
- data/app/views/decidim/elections/admin/elections/index.html.erb +54 -0
- data/app/views/decidim/elections/admin/elections/new.html.erb +7 -0
- data/app/views/decidim/elections/admin/questions/_form.html.erb +27 -0
- data/app/views/decidim/elections/admin/questions/edit.html.erb +7 -0
- data/app/views/decidim/elections/admin/questions/index.html.erb +53 -0
- data/app/views/decidim/elections/admin/questions/new.html.erb +7 -0
- data/app/views/decidim/elections/elections/index.html.erb +1 -0
- data/app/views/decidim/elections/elections/show.html.erb +0 -0
- data/config/i18n-tasks.yml +10 -0
- data/config/locales/ar.yml +1 -0
- data/config/locales/bg-BG.yml +7 -0
- data/config/locales/ca.yml +132 -0
- data/config/locales/cs.yml +138 -0
- data/config/locales/da-DK.yml +1 -0
- data/config/locales/de.yml +132 -0
- data/config/locales/el.yml +132 -0
- data/config/locales/en.yml +133 -0
- data/config/locales/eo-UY.yml +1 -0
- data/config/locales/es-MX.yml +132 -0
- data/config/locales/es-PY.yml +132 -0
- data/config/locales/es.yml +132 -0
- data/config/locales/et-EE.yml +1 -0
- data/config/locales/eu.yml +1 -0
- data/config/locales/fi-plain.yml +132 -0
- data/config/locales/fi.yml +132 -0
- data/config/locales/fr-CA.yml +132 -0
- data/config/locales/fr.yml +132 -0
- data/config/locales/ga-IE.yml +1 -0
- data/config/locales/gl.yml +1 -0
- data/config/locales/hr-HR.yml +1 -0
- data/config/locales/hu.yml +1 -0
- data/config/locales/id-ID.yml +1 -0
- data/config/locales/is-IS.yml +1 -0
- data/config/locales/it.yml +132 -0
- data/config/locales/ja-JP.yml +129 -0
- data/config/locales/lt-LT.yml +1 -0
- data/config/locales/lv-LV.yml +135 -0
- data/config/locales/mt-MT.yml +1 -0
- data/config/locales/nl.yml +132 -0
- data/config/locales/no.yml +9 -0
- data/config/locales/pl.yml +138 -0
- data/config/locales/pt-BR.yml +1 -0
- data/config/locales/pt.yml +132 -0
- data/config/locales/ro-RO.yml +135 -0
- data/config/locales/ru.yml +1 -0
- data/config/locales/sk.yml +1 -0
- data/config/locales/sl.yml +5 -0
- data/config/locales/sr-CS.yml +1 -0
- data/config/locales/sv.yml +132 -0
- data/config/locales/tr-TR.yml +1 -0
- data/config/locales/uk.yml +1 -0
- data/db/migrate/20200430083618_create_decidim_elections_elections.rb +15 -0
- data/db/migrate/20200518082327_create_decidim_elections_questions.rb +14 -0
- data/db/migrate/20200518084144_create_decidim_elections_answers.rb +12 -0
- data/lib/decidim/elections.rb +13 -0
- data/lib/decidim/elections/admin.rb +10 -0
- data/lib/decidim/elections/admin_engine.rb +29 -0
- data/lib/decidim/elections/component.rb +123 -0
- data/lib/decidim/elections/engine.rb +23 -0
- data/lib/decidim/elections/seeds/city.jpeg +0 -0
- data/lib/decidim/elections/test/factories.rb +52 -0
- data/lib/decidim/elections/version.rb +10 -0
- metadata +201 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
# The data store for an Answer in the Decidim::Elections component. It stores a
|
|
6
|
+
# title, description and related resources and attachments.
|
|
7
|
+
class Answer < ApplicationRecord
|
|
8
|
+
include Decidim::Resourceable
|
|
9
|
+
include Decidim::HasAttachments
|
|
10
|
+
include Decidim::HasAttachmentCollections
|
|
11
|
+
include Traceable
|
|
12
|
+
include Loggable
|
|
13
|
+
|
|
14
|
+
delegate :component, to: :question
|
|
15
|
+
delegate :organization, :participatory_space, to: :component
|
|
16
|
+
|
|
17
|
+
belongs_to :question, foreign_key: "decidim_elections_question_id", class_name: "Decidim::Elections::Question", inverse_of: :answers
|
|
18
|
+
|
|
19
|
+
default_scope { order(weight: :asc, id: :asc) }
|
|
20
|
+
|
|
21
|
+
def proposals
|
|
22
|
+
linked_resources(:proposals, "related_proposals")
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
# The data store for an Election in the Decidim::Elections component. It stores a
|
|
6
|
+
# title, description and any other useful information to perform an election.
|
|
7
|
+
class Election < ApplicationRecord
|
|
8
|
+
include Decidim::Resourceable
|
|
9
|
+
include Decidim::HasComponent
|
|
10
|
+
include Traceable
|
|
11
|
+
include Loggable
|
|
12
|
+
|
|
13
|
+
component_manifest_name "elections"
|
|
14
|
+
|
|
15
|
+
has_many :questions, foreign_key: "decidim_elections_election_id", class_name: "Decidim::Elections::Question", inverse_of: :election, dependent: :destroy
|
|
16
|
+
|
|
17
|
+
def started?
|
|
18
|
+
start_time <= Time.current
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
# The data store for a Question in the Decidim::Elections component. It stores a
|
|
6
|
+
# title, description and a maximum number of selection that voters can choose.
|
|
7
|
+
class Question < ApplicationRecord
|
|
8
|
+
include Decidim::Resourceable
|
|
9
|
+
include Traceable
|
|
10
|
+
include Loggable
|
|
11
|
+
|
|
12
|
+
delegate :component, to: :election
|
|
13
|
+
|
|
14
|
+
belongs_to :election, foreign_key: "decidim_elections_election_id", class_name: "Decidim::Elections::Election", inverse_of: :questions
|
|
15
|
+
has_many :answers, foreign_key: "decidim_elections_question_id", class_name: "Decidim::Elections::Answer", inverse_of: :question, dependent: :destroy
|
|
16
|
+
|
|
17
|
+
default_scope { order(weight: :asc, id: :asc) }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
module Admin
|
|
6
|
+
class Permissions < Decidim::DefaultPermissions
|
|
7
|
+
def permissions
|
|
8
|
+
return permission_action if permission_action.scope != :admin
|
|
9
|
+
|
|
10
|
+
case permission_action.subject
|
|
11
|
+
when :question, :answer
|
|
12
|
+
case permission_action.action
|
|
13
|
+
when :create, :update, :delete
|
|
14
|
+
allow_if_not_started
|
|
15
|
+
end
|
|
16
|
+
when :election
|
|
17
|
+
case permission_action.action
|
|
18
|
+
when :create, :read
|
|
19
|
+
allow!
|
|
20
|
+
when :update
|
|
21
|
+
toggle_allow(election)
|
|
22
|
+
when :delete
|
|
23
|
+
allow_if_not_started
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
permission_action
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def election
|
|
33
|
+
@election ||= context.fetch(:election, nil)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def allow_if_not_started
|
|
37
|
+
toggle_allow(election && !election.started?)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
class Permissions < Decidim::DefaultPermissions
|
|
6
|
+
def permissions
|
|
7
|
+
return permission_action unless user
|
|
8
|
+
|
|
9
|
+
# Delegate the admin permission checks to the admin permissions class
|
|
10
|
+
return Decidim::Elections::Admin::Permissions.new(user, permission_action, context).permissions if permission_action.scope == :admin
|
|
11
|
+
|
|
12
|
+
permission_action
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
# This type represents an answer to an election question.
|
|
6
|
+
# The name is different from the model because to enforce consistency with Question type name.
|
|
7
|
+
ElectionAnswerType = GraphQL::ObjectType.define do
|
|
8
|
+
interfaces [
|
|
9
|
+
-> { Decidim::Core::AttachableInterface },
|
|
10
|
+
-> { Decidim::Core::TraceableInterface }
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
name "ElectionAnswer"
|
|
14
|
+
description "An answer for an election's question"
|
|
15
|
+
|
|
16
|
+
field :id, !types.ID, "The internal ID of this answer"
|
|
17
|
+
field :title, !Decidim::Core::TranslatedFieldType, "The title for this answer"
|
|
18
|
+
field :description, Decidim::Core::TranslatedFieldType, "The description for this answer"
|
|
19
|
+
field :weight, types.Int, "The ordering weight for this answer"
|
|
20
|
+
|
|
21
|
+
field :proposals, types[Decidim::Proposals::ProposalType], "The proposals related to this answer"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
# This type represents an election Question.
|
|
6
|
+
# The name is different from the model because the Question type is already defined on the Forms module.
|
|
7
|
+
ElectionQuestionType = GraphQL::ObjectType.define do
|
|
8
|
+
interfaces [
|
|
9
|
+
-> { Decidim::Core::TraceableInterface }
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
name "ElectionQuestion"
|
|
13
|
+
description "A question for an election"
|
|
14
|
+
|
|
15
|
+
field :id, !types.ID, "The internal ID of this question"
|
|
16
|
+
field :title, !Decidim::Core::TranslatedFieldType, "The title for this question"
|
|
17
|
+
field :description, !Decidim::Core::TranslatedFieldType, "The description for this question"
|
|
18
|
+
field :maxSelections, !types.Int, "The maximum number of posible selections for this question", property: :max_selections
|
|
19
|
+
field :weight, types.Int, "The ordering weight for this question"
|
|
20
|
+
field :randomAnswersOrder, types.Boolean, "Should this question order answers in random order?", property: :random_answers_order
|
|
21
|
+
|
|
22
|
+
field :answers, !types[Decidim::Elections::ElectionAnswerType], "The answers for this question"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
# This type represents an Election.
|
|
6
|
+
ElectionType = GraphQL::ObjectType.define do
|
|
7
|
+
interfaces [
|
|
8
|
+
-> { Decidim::Core::TraceableInterface }
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
name "Election"
|
|
12
|
+
description "An election"
|
|
13
|
+
|
|
14
|
+
field :id, !types.ID, "The internal ID of this election"
|
|
15
|
+
field :title, !Decidim::Core::TranslatedFieldType, "The title for this election"
|
|
16
|
+
field :subtitle, !Decidim::Core::TranslatedFieldType, "The subtitle for this election"
|
|
17
|
+
field :description, !Decidim::Core::TranslatedFieldType, "The description for this election"
|
|
18
|
+
field :startTime, !Decidim::Core::DateTimeType, "The start time for this election", property: :start_time
|
|
19
|
+
field :endTime, !Decidim::Core::DateTimeType, "The end time for this election", property: :end_time
|
|
20
|
+
field :createdAt, Decidim::Core::DateTimeType, "When this election was created", property: :created_at
|
|
21
|
+
field :updatedAt, Decidim::Core::DateTimeType, "When this election was updated", property: :updated_at
|
|
22
|
+
|
|
23
|
+
field :questions, !types[Decidim::Elections::ElectionQuestionType], "The questions for this election"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Elections
|
|
5
|
+
ElectionsType = GraphQL::ObjectType.define do
|
|
6
|
+
interfaces [-> { Decidim::Core::ComponentInterface }]
|
|
7
|
+
|
|
8
|
+
name "Elections"
|
|
9
|
+
description "An elections component of a participatory space."
|
|
10
|
+
|
|
11
|
+
connection :elections, ElectionType.connection_type do
|
|
12
|
+
resolve ->(component, _args, _ctx) {
|
|
13
|
+
ElectionsTypeHelper.base_scope(component).includes(:component)
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
field(:election, ElectionType) do
|
|
18
|
+
argument :id, !types.ID
|
|
19
|
+
|
|
20
|
+
resolve ->(component, args, _ctx) {
|
|
21
|
+
ElectionsTypeHelper.base_scope(component).find_by(id: args[:id])
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
module ElectionsTypeHelper
|
|
27
|
+
def self.base_scope(component)
|
|
28
|
+
Election.where(component: component)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<div class="card">
|
|
2
|
+
<div class="card-divider">
|
|
3
|
+
<h2 class="card-title"><%= title %></h2>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<div class="card-section">
|
|
7
|
+
<div class="row column">
|
|
8
|
+
<%= form.translated :text_field, :title, autofocus: true %>
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
<div class="row column">
|
|
12
|
+
<%= form.translated :editor, :description %>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="row column">
|
|
16
|
+
<%= form.number_field :weight %>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<%= render partial: "decidim/admin/shared/gallery", locals: { form: form } %>
|
|
20
|
+
|
|
21
|
+
<div class="row column">
|
|
22
|
+
<%= proposals_picker(form, :proposals, proposals_picker_election_question_answers_path(election, question)) %>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<%= decidim_form_for([election, question, @form], html: { class: "form edit_answer" }) do |f| %>
|
|
2
|
+
<%= render partial: "form", object: f, locals: { title: t(".title") } %>
|
|
3
|
+
|
|
4
|
+
<div class="button--double form-general-submit">
|
|
5
|
+
<%= f.submit t(".update") %>
|
|
6
|
+
</div>
|
|
7
|
+
<% end %>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<div class="card">
|
|
2
|
+
<div class="card-divider">
|
|
3
|
+
<h2 class="card-title">
|
|
4
|
+
<%= link_to translated_attribute(election.title), elections_path %> >
|
|
5
|
+
<%= link_to translated_attribute(question.title), election_questions_path(election) %> >
|
|
6
|
+
<%= t(".title") %>
|
|
7
|
+
|
|
8
|
+
<%= link_to t("actions.new", scope: "decidim.elections", name: t("models.answer.name", scope: "decidim.elections.admin")), new_election_question_answer_path(election, question), class: "button tiny button--title" if allowed_to? :create, :answer, election: election, question: question %>
|
|
9
|
+
</h2>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<div class="card-section">
|
|
13
|
+
<div class="table-scroll">
|
|
14
|
+
<table class="table-list">
|
|
15
|
+
<thead>
|
|
16
|
+
<tr>
|
|
17
|
+
<th><%= t("models.answer.fields.title", scope: "decidim.elections") %></th>
|
|
18
|
+
<th><%= t("models.answer.fields.proposals", scope: "decidim.elections") %></th>
|
|
19
|
+
<th class="actions"><%= t("actions.title", scope: "decidim.elections") %></th>
|
|
20
|
+
</tr>
|
|
21
|
+
</thead>
|
|
22
|
+
<tbody>
|
|
23
|
+
<% answers.each do |answer| %>
|
|
24
|
+
<tr data-id="<%= question.id %>">
|
|
25
|
+
<td>
|
|
26
|
+
<%= link_to translated_attribute(answer.title), edit_election_question_answer_path(election, question, answer) %>
|
|
27
|
+
</td>
|
|
28
|
+
<td>
|
|
29
|
+
<%= answer.linked_resources(:proposals, "related_proposals").count %>
|
|
30
|
+
</td>
|
|
31
|
+
<td class="table-list__actions">
|
|
32
|
+
<% if allowed_to? :update, :answer, election: election, question: question, answer: answer %>
|
|
33
|
+
<%= icon_link_to "pencil", edit_election_question_answer_path(election, question, answer), t("actions.edit", scope: "decidim.elections"), class: "action-icon--edit" %>
|
|
34
|
+
<% end %>
|
|
35
|
+
|
|
36
|
+
<% if allowed_to? :delete, :answer, election: election, question: question, answer: answer %>
|
|
37
|
+
<%= icon_link_to "circle-x", election_question_answer_path(election, question, answer), t("actions.destroy", scope: "decidim.elections"), method: :delete, class: "action-icon--remove", data: { confirm: t("actions.confirm_destroy", scope: "decidim.elections") } %>
|
|
38
|
+
<% end %>
|
|
39
|
+
</td>
|
|
40
|
+
</tr>
|
|
41
|
+
<% end %>
|
|
42
|
+
</tbody>
|
|
43
|
+
</table>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<%= decidim_form_for([election, question, @form], html: { class: "form new_answer" }) do |f| %>
|
|
2
|
+
<%= render partial: "form", object: f, locals: { title: t(".title") } %>
|
|
3
|
+
|
|
4
|
+
<div class="button--double form-general-submit">
|
|
5
|
+
<%= f.submit t(".create") %>
|
|
6
|
+
</div>
|
|
7
|
+
<% end %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= cell "decidim/proposals/proposals_picker", current_component %>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<div class="card">
|
|
2
|
+
<div class="card-divider">
|
|
3
|
+
<h2 class="card-title"><%= title %></h2>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<div class="card-section">
|
|
7
|
+
<div class="row column">
|
|
8
|
+
<%= form.translated :text_field, :title, autofocus: true %>
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
<div class="row column">
|
|
12
|
+
<%= form.translated :text_field, :subtitle %>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="row column">
|
|
16
|
+
<%= form.translated :editor, :description %>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<div class="row">
|
|
20
|
+
<div class="column xlarge-6">
|
|
21
|
+
<%= form.datetime_field :start_time %>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="column xlarge-6">
|
|
24
|
+
<%= form.datetime_field :end_time %>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<div class="card">
|
|
2
|
+
<div class="card-divider">
|
|
3
|
+
<h2 class="card-title">
|
|
4
|
+
<%= t(".title") %>
|
|
5
|
+
|
|
6
|
+
<%= link_to t("actions.new", scope: "decidim.elections", name: t("models.election.name", scope: "decidim.elections.admin")), new_election_path, class: "button tiny button--title" if allowed_to? :create, :election %>
|
|
7
|
+
</h2>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<div class="card-section">
|
|
11
|
+
<div class="table-scroll">
|
|
12
|
+
<table class="table-list">
|
|
13
|
+
<thead>
|
|
14
|
+
<tr>
|
|
15
|
+
<th><%= t("models.election.fields.title", scope: "decidim.elections") %></th>
|
|
16
|
+
<th><%= t("models.election.fields.start_time", scope: "decidim.elections") %></th>
|
|
17
|
+
<th><%= t("models.election.fields.end_time", scope: "decidim.elections") %></th>
|
|
18
|
+
<th class="actions"><%= t("actions.title", scope: "decidim.elections") %></th>
|
|
19
|
+
</tr>
|
|
20
|
+
</thead>
|
|
21
|
+
<tbody>
|
|
22
|
+
<% elections.each do |election| %>
|
|
23
|
+
<tr data-id="<%= election.id %>">
|
|
24
|
+
<td>
|
|
25
|
+
<%= link_to translated_attribute(election.title), election_questions_path(election) %>
|
|
26
|
+
</td>
|
|
27
|
+
<td>
|
|
28
|
+
<% if election.start_time %>
|
|
29
|
+
<%= l election.start_time, format: :long %>
|
|
30
|
+
<% end %>
|
|
31
|
+
</td>
|
|
32
|
+
<td>
|
|
33
|
+
<% if election.end_time %>
|
|
34
|
+
<%= l election.end_time, format: :long %>
|
|
35
|
+
<% end %>
|
|
36
|
+
</td>
|
|
37
|
+
<td class="table-list__actions">
|
|
38
|
+
<%= icon_link_to "eye", resource_locator(election).path, t("actions.preview", scope: "decidim.elections"), class: "action-icon--preview", target: :blank %>
|
|
39
|
+
|
|
40
|
+
<% if allowed_to? :update, :election, election: election %>
|
|
41
|
+
<%= icon_link_to "pencil", edit_election_path(election), t("actions.edit", scope: "decidim.elections"), class: "action-icon--edit" %>
|
|
42
|
+
<% end %>
|
|
43
|
+
|
|
44
|
+
<% if allowed_to? :delete, :election, election: election %>
|
|
45
|
+
<%= icon_link_to "circle-x", election_path(election), t("actions.destroy", scope: "decidim.elections"), method: :delete, class: "action-icon--remove", data: { confirm: t("actions.confirm_destroy", scope: "decidim.elections") } %>
|
|
46
|
+
<% end %>
|
|
47
|
+
</td>
|
|
48
|
+
</tr>
|
|
49
|
+
<% end %>
|
|
50
|
+
</tbody>
|
|
51
|
+
</table>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|