Compare commits

...

10 commits

Author SHA1 Message Date
3b2cf657b5 Change app name 2025-04-06 17:05:07 -06:00
b4a328554c Update translations 2025-04-06 17:05:07 -06:00
dc01cb61ad Require at least 2 candidates to open a vote 2025-04-06 17:05:07 -06:00
440013890e Add Chartkick 2025-04-06 17:05:07 -06:00
b7bcd661b8 Add missing template 2025-04-06 17:05:07 -06:00
cef9c51835 Update translations 2025-04-06 17:05:07 -06:00
4faa4fd555 Validate email and password 2025-04-06 17:05:07 -06:00
069d565ba9 Format headings as th 2025-04-06 17:05:07 -06:00
058b512b7d Add color to ratings 2025-04-06 17:05:07 -06:00
c4ebe12408 Add bar chart 2025-04-06 17:05:07 -06:00
15 changed files with 26814 additions and 91 deletions

View file

@ -8,3 +8,4 @@ gem 'puma'
gem 'sqlite3' gem 'sqlite3'
gem 'bcrypt' gem 'bcrypt'
gem 'gettext' gem 'gettext'
gem 'chartkick'

View file

@ -23,6 +23,7 @@ GEM
bcrypt (3.1.20) bcrypt (3.1.20)
benchmark (0.4.0) benchmark (0.4.0)
bigdecimal (3.1.9) bigdecimal (3.1.9)
chartkick (5.1.4)
concurrent-ruby (1.3.5) concurrent-ruby (1.3.5)
connection_pool (2.5.0) connection_pool (2.5.0)
drb (2.2.1) drb (2.2.1)
@ -91,6 +92,7 @@ PLATFORMS
DEPENDENCIES DEPENDENCIES
bcrypt bcrypt
chartkick
gettext gettext
puma puma
rackup rackup

View file

@ -1,4 +1,4 @@
require_relative 'vote' require_relative 'vedia'
require 'sinatra/activerecord/rake' require 'sinatra/activerecord/rake'
desc "Update PO files" desc "Update PO files"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-30 12:01-0600\n" "POT-Creation-Date: 2025-04-06 16:13-0600\n"
"PO-Revision-Date: 2025-03-29 20:41-0600\n" "PO-Revision-Date: 2025-03-29 20:41-0600\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: ../views/home.erb:1 ../views/layout.erb:10 #: ../views/home.erb:1 ../views/layout.erb:13
msgid "Home" msgid "Home"
msgstr "Inici" msgstr "Inici"
@ -57,31 +57,43 @@ msgstr "Crear una nova votació"
msgid "Vote" msgid "Vote"
msgstr "Votació" msgstr "Votació"
#: ../views/layout.erb:9 #: ../views/layout.erb:12
msgid "Logged in as %{email}." msgid "Logged in as %{email}."
msgstr "Estàs connectada com a %{email}." msgstr "Estàs connectada com a %{email}."
#: ../views/layout.erb:9 #: ../views/layout.erb:12
msgid "Logout" msgid "Logout"
msgstr "Desconnexió" msgstr "Desconnexió"
#: ../views/layout.erb:12 ../views/login.erb:1 ../views/login.erb:14 #: ../views/layout.erb:15 ../views/login.erb:1 ../views/login.erb:16
msgid "Login" msgid "Login"
msgstr "Connexió" msgstr "Connexió"
#: ../views/login.erb:7 ../views/signup.erb:5 ../views/votes_edit.erb:51 #: ../views/login.erb:9 ../views/signup.erb:24 ../views/votes_edit.erb:51
#: ../views/votes_show_closed.erb:69 ../views/votes_show_open.erb:58 #: ../views/votes_show_closed.erb:85 ../views/votes_show_open.erb:58
msgid "Email" msgid "Email"
msgstr "Correu" msgstr "Correu"
#: ../views/login.erb:11 ../views/signup.erb:9 #: ../views/login.erb:13 ../views/signup.erb:28
msgid "Password" msgid "Password"
msgstr "Contrasenya" msgstr "Contrasenya"
#: ../views/login.erb:16 ../views/signup.erb:1 ../views/signup.erb:12 #: ../views/login.erb:18 ../views/signup.erb:1 ../views/signup.erb:31
msgid "Create account" msgid "Create account"
msgstr "Crear un compte" msgstr "Crear un compte"
#: ../views/signup.erb:6
msgid "Specify a password."
msgstr "Entra una contrasenya."
#: ../views/signup.erb:14
msgid "Email is not a valid email address."
msgstr "El correu no és una direcció de correu vàlida."
#: ../views/signup.erb:17
msgid "An account already exists for %{email}."
msgstr "Un compte ja existeix pel correu %{email}."
#: ../views/votes_edit.erb:1 #: ../views/votes_edit.erb:1
msgid "Edit draft vote" msgid "Edit draft vote"
msgstr "Editar un esborrany de votació" msgstr "Editar un esborrany de votació"
@ -116,30 +128,34 @@ msgid "Name"
msgstr "Nom" msgstr "Nom"
#: ../views/votes_edit.erb:36 ../views/votes_edit.erb:54 #: ../views/votes_edit.erb:36 ../views/votes_edit.erb:54
#: ../views/votes_show_closed.erb:72 ../views/votes_show_open.erb:61 #: ../views/votes_show_closed.erb:81 ../views/votes_show_closed.erb:88
#: ../views/votes_show_open.erb:61
msgid "Add" msgid "Add"
msgstr "Afegir" msgstr "Afegir"
#: ../views/votes_edit.erb:39 ../views/votes_show_closed.erb:49 #: ../views/votes_edit.erb:39 ../views/votes_show_closed.erb:65
#: ../views/votes_show_draft.erb:5 ../views/votes_show_open.erb:34 #: ../views/votes_show_draft.erb:5 ../views/votes_show_open.erb:34
msgid "Organizers" msgid "Organizers"
msgstr "Organitzadores" msgstr "Organitzadores"
#: ../views/votes_edit.erb:47 ../views/votes_show_closed.erb:65 #: ../views/votes_edit.erb:47 ../views/votes_show_open.erb:54
#: ../views/votes_show_open.erb:54
msgid "Add organizer" msgid "Add organizer"
msgstr "Afegeix organitzadora" msgstr "Afegeix organitzadora"
#: ../views/votes_edit.erb:57 ../views/votes_show_closed.erb:59 #: ../views/votes_edit.erb:57 ../views/votes_show_closed.erb:75
#: ../views/votes_show_open.erb:44 #: ../views/votes_show_open.erb:44
msgid "Actions for organizers" msgid "Actions for organizers"
msgstr "Accions per les organitzadores" msgstr "Accions per les organitzadores"
#: ../views/votes_edit.erb:60 #: ../views/votes_edit.erb:61 ../views/votes_edit.erb:64
msgid "Open vote to participants" msgid "Open vote to participants"
msgstr "Obrir la votació als participants" msgstr "Obrir la votació als participants"
#: ../views/votes_edit.erb:63 #: ../views/votes_edit.erb:62
msgid "Add at least 2 candidates before opening the vote to participants."
msgstr "Afegeix com a mínim 2 candidats abans d'obrir la votació als participants"
#: ../views/votes_edit.erb:68
msgid "Delete vote" msgid "Delete vote"
msgstr "Suprimir la votació" msgstr "Suprimir la votació"
@ -155,31 +171,31 @@ msgstr "Totes les valoracions"
msgid "Participant" msgid "Participant"
msgstr "Participant" msgstr "Participant"
#: ../views/votes_show_closed.erb:26 #: ../views/votes_show_closed.erb:27
msgid "Results" msgid "Results"
msgstr "Resultats" msgstr "Resultats"
#: ../views/votes_show_closed.erb:30 #: ../views/votes_show_closed.erb:31
msgid "Rank" msgid "Rank"
msgstr "Rang" msgstr "Rang"
#: ../views/votes_show_closed.erb:31 #: ../views/votes_show_closed.erb:32
msgid "Candidate" msgid "Candidate"
msgstr "Candidat" msgstr "Candidat"
#: ../views/votes_show_closed.erb:32 #: ../views/votes_show_closed.erb:33
msgid "Majority Judgment" msgid "Majority Judgment"
msgstr "Judici majoritari" msgstr "Judici majoritari"
#: ../views/votes_show_closed.erb:33 #: ../views/votes_show_closed.erb:34
msgid "Proponents" msgid "Proponents"
msgstr "Defensores" msgstr "Defensores"
#: ../views/votes_show_closed.erb:34 #: ../views/votes_show_closed.erb:35
msgid "Opponents" msgid "Opponents"
msgstr "Detractores" msgstr "Detractores"
#: ../views/votes_show_closed.erb:62 #: ../views/votes_show_closed.erb:78
msgid "Reopen voting period" msgid "Reopen voting period"
msgstr "Reobrir el període de votació" msgstr "Reobrir el període de votació"
@ -199,30 +215,30 @@ msgstr "Tornar a l'esborrany de votació"
msgid "Close votes and show results" msgid "Close votes and show results"
msgstr "Tancar la votació i veure els resultats" msgstr "Tancar la votació i veure els resultats"
#: ../vote.rb:59 #: ../vote.rb:62
msgid "Awful" msgid "Awful"
msgstr "Molt malament" msgstr "Molt malament"
#: ../vote.rb:60 #: ../vote.rb:63
msgid "Very bad" msgid "Very bad"
msgstr "Malament" msgstr "Malament"
#: ../vote.rb:61 #: ../vote.rb:64
msgid "Bad" msgid "Bad"
msgstr "Poc bé" msgstr "Poc bé"
#: ../vote.rb:62 #: ../vote.rb:65
msgid "Mediocre" msgid "Mediocre"
msgstr "Mig bé" msgstr "Mig bé"
#: ../vote.rb:63 #: ../vote.rb:66
msgid "Good" msgid "Good"
msgstr "Bé" msgstr "Bé"
#: ../vote.rb:64 #: ../vote.rb:67
msgid "Very good" msgid "Very good"
msgstr "Molt bé" msgstr "Molt bé"
#: ../vote.rb:65 #: ../vote.rb:114
msgid "Excellent" msgid "Incorrect email or password."
msgstr "Excel·lent" msgstr "Correu o contrasenya incorrecte."

View file

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-30 12:01-0600\n" "POT-Creation-Date: 2025-04-06 16:13-0600\n"
"PO-Revision-Date: 2025-03-30 12:01-0600\n" "PO-Revision-Date: 2025-04-06 16:13-0600\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n" "Language: \n"
@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: ../views/home.erb:1 ../views/layout.erb:10 #: ../views/home.erb:1 ../views/layout.erb:13
msgid "Home" msgid "Home"
msgstr "" msgstr ""
@ -58,31 +58,43 @@ msgstr ""
msgid "Vote" msgid "Vote"
msgstr "" msgstr ""
#: ../views/layout.erb:9 #: ../views/layout.erb:12
msgid "Logged in as %{email}." msgid "Logged in as %{email}."
msgstr "" msgstr ""
#: ../views/layout.erb:9 #: ../views/layout.erb:12
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""
#: ../views/layout.erb:12 ../views/login.erb:1 ../views/login.erb:14 #: ../views/layout.erb:15 ../views/login.erb:1 ../views/login.erb:16
msgid "Login" msgid "Login"
msgstr "" msgstr ""
#: ../views/login.erb:7 ../views/signup.erb:5 ../views/votes_edit.erb:51 #: ../views/login.erb:9 ../views/signup.erb:24 ../views/votes_edit.erb:51
#: ../views/votes_show_closed.erb:69 ../views/votes_show_open.erb:58 #: ../views/votes_show_closed.erb:85 ../views/votes_show_open.erb:58
msgid "Email" msgid "Email"
msgstr "" msgstr ""
#: ../views/login.erb:11 ../views/signup.erb:9 #: ../views/login.erb:13 ../views/signup.erb:28
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: ../views/login.erb:16 ../views/signup.erb:1 ../views/signup.erb:12 #: ../views/login.erb:18 ../views/signup.erb:1 ../views/signup.erb:31
msgid "Create account" msgid "Create account"
msgstr "" msgstr ""
#: ../views/signup.erb:6
msgid "Specify a password."
msgstr ""
#: ../views/signup.erb:14
msgid "Email is not a valid email address."
msgstr ""
#: ../views/signup.erb:17
msgid "An account already exists for %{email}."
msgstr ""
#: ../views/votes_edit.erb:1 #: ../views/votes_edit.erb:1
msgid "Edit draft vote" msgid "Edit draft vote"
msgstr "" msgstr ""
@ -117,30 +129,34 @@ msgid "Name"
msgstr "" msgstr ""
#: ../views/votes_edit.erb:36 ../views/votes_edit.erb:54 #: ../views/votes_edit.erb:36 ../views/votes_edit.erb:54
#: ../views/votes_show_closed.erb:72 ../views/votes_show_open.erb:61 #: ../views/votes_show_closed.erb:81 ../views/votes_show_closed.erb:88
#: ../views/votes_show_open.erb:61
msgid "Add" msgid "Add"
msgstr "" msgstr ""
#: ../views/votes_edit.erb:39 ../views/votes_show_closed.erb:49 #: ../views/votes_edit.erb:39 ../views/votes_show_closed.erb:65
#: ../views/votes_show_draft.erb:5 ../views/votes_show_open.erb:34 #: ../views/votes_show_draft.erb:5 ../views/votes_show_open.erb:34
msgid "Organizers" msgid "Organizers"
msgstr "" msgstr ""
#: ../views/votes_edit.erb:47 ../views/votes_show_closed.erb:65 #: ../views/votes_edit.erb:47 ../views/votes_show_open.erb:54
#: ../views/votes_show_open.erb:54
msgid "Add organizer" msgid "Add organizer"
msgstr "" msgstr ""
#: ../views/votes_edit.erb:57 ../views/votes_show_closed.erb:59 #: ../views/votes_edit.erb:57 ../views/votes_show_closed.erb:75
#: ../views/votes_show_open.erb:44 #: ../views/votes_show_open.erb:44
msgid "Actions for organizers" msgid "Actions for organizers"
msgstr "" msgstr ""
#: ../views/votes_edit.erb:60 #: ../views/votes_edit.erb:61 ../views/votes_edit.erb:64
msgid "Open vote to participants" msgid "Open vote to participants"
msgstr "" msgstr ""
#: ../views/votes_edit.erb:63 #: ../views/votes_edit.erb:62
msgid "Add at least 2 candidates before opening the vote to participants."
msgstr ""
#: ../views/votes_edit.erb:68
msgid "Delete vote" msgid "Delete vote"
msgstr "" msgstr ""
@ -156,31 +172,31 @@ msgstr ""
msgid "Participant" msgid "Participant"
msgstr "" msgstr ""
#: ../views/votes_show_closed.erb:26 #: ../views/votes_show_closed.erb:27
msgid "Results" msgid "Results"
msgstr "" msgstr ""
#: ../views/votes_show_closed.erb:30 #: ../views/votes_show_closed.erb:31
msgid "Rank" msgid "Rank"
msgstr "" msgstr ""
#: ../views/votes_show_closed.erb:31 #: ../views/votes_show_closed.erb:32
msgid "Candidate" msgid "Candidate"
msgstr "" msgstr ""
#: ../views/votes_show_closed.erb:32 #: ../views/votes_show_closed.erb:33
msgid "Majority Judgment" msgid "Majority Judgment"
msgstr "" msgstr ""
#: ../views/votes_show_closed.erb:33 #: ../views/votes_show_closed.erb:34
msgid "Proponents" msgid "Proponents"
msgstr "" msgstr ""
#: ../views/votes_show_closed.erb:34 #: ../views/votes_show_closed.erb:35
msgid "Opponents" msgid "Opponents"
msgstr "" msgstr ""
#: ../views/votes_show_closed.erb:62 #: ../views/votes_show_closed.erb:78
msgid "Reopen voting period" msgid "Reopen voting period"
msgstr "" msgstr ""
@ -200,30 +216,30 @@ msgstr ""
msgid "Close votes and show results" msgid "Close votes and show results"
msgstr "" msgstr ""
#: ../vote.rb:59 #: ../vote.rb:62
msgid "Awful" msgid "Awful"
msgstr "" msgstr ""
#: ../vote.rb:60 #: ../vote.rb:63
msgid "Very bad" msgid "Very bad"
msgstr "" msgstr ""
#: ../vote.rb:61 #: ../vote.rb:64
msgid "Bad" msgid "Bad"
msgstr "" msgstr ""
#: ../vote.rb:62 #: ../vote.rb:65
msgid "Mediocre" msgid "Mediocre"
msgstr "" msgstr ""
#: ../vote.rb:63 #: ../vote.rb:66
msgid "Good" msgid "Good"
msgstr "" msgstr ""
#: ../vote.rb:64 #: ../vote.rb:67
msgid "Very good" msgid "Very good"
msgstr "" msgstr ""
#: ../vote.rb:65 #: ../vote.rb:114
msgid "Excellent" msgid "Incorrect email or password."
msgstr "" msgstr ""

24043
public/Chart.bundle.js Normal file

File diff suppressed because it is too large Load diff

2570
public/chartkick.js Normal file

File diff suppressed because it is too large Load diff

View file

@ -3,6 +3,7 @@ require 'sinatra/activerecord'
require 'bcrypt' require 'bcrypt'
require 'gettext' require 'gettext'
require 'securerandom' require 'securerandom'
require 'chartkick'
require_relative 'mj' require_relative 'mj'
class Vote < ActiveRecord::Base class Vote < ActiveRecord::Base
@ -27,6 +28,8 @@ class User < ActiveRecord::Base
has_many :ratings has_many :ratings
has_many :organizers has_many :organizers
has_many :votes, through: :organizers has_many :votes, through: :organizers
validates :email, uniqueness: true
validates :email, format: URI::MailTo::EMAIL_REGEXP
end end
class Organizer < ActiveRecord::Base class Organizer < ActiveRecord::Base
@ -52,17 +55,16 @@ end
include GetText include GetText
set_output_charset('UTF-8') set_output_charset('UTF-8')
bindtextdomain('vote', 'locale') bindtextdomain('vedia', 'locale')
set_locale('ca') set_locale('ca')
enable :sessions enable :sessions
set :values, [ { :id => 1, :label => _("Awful") }, set :values, [ { :id => 1, :label => _("Awful"), :color => '#ff4500' },
{ :id => 2, :label => _("Very bad") }, { :id => 2, :label => _("Very bad"), :color => '#ffa500' },
{ :id => 3, :label => _("Bad") }, { :id => 3, :label => _("Bad"), :color => '#ffff00' },
{ :id => 4, :label => _("Mediocre") }, { :id => 4, :label => _("Mediocre"), :color => '#9acd32' },
{ :id => 5, :label => _("Good") }, { :id => 5, :label => _("Good"), :color => '#228b22' },
{ :id => 6, :label => _("Very good") }, { :id => 6, :label => _("Very good"), :color => '#006400' } ]
{ :id => 7, :label => _("Excellent") } ]
MajorityJudgment.values = settings.values MajorityJudgment.values = settings.values
get '/' do get '/' do
@ -71,14 +73,31 @@ get '/' do
erb :home erb :home
end end
get '/style.css' do
content_type 'text/css'
erb :style, :layout => false
end
get '/signup' do get '/signup' do
erb :signup erb :signup
end end
post '/signup' do post '/signup' do
@user = User.create(email: params[:email], @user = User.create(email: params[:email])
password: hash_password(params[:password])) @errors = []
if params[:password].empty?
@errors << OpenStruct.new(:attribute => :password, :type => :blank)
else
@user.password = hash_password(params[:password])
end
if @errors.empty? and @user.valid?
@user.save
session.clear
session[:user_id] = @user.id
redirect '/' redirect '/'
else
erb :signup
end
end end
get '/login' do get '/login' do
@ -92,7 +111,7 @@ post '/login' do
session[:user_id] = user.id session[:user_id] = user.id
redirect '/' redirect '/'
else else
@error = 'Username or password was incorrect' @error = _("Incorrect email or password.")
erb :login erb :login
end end
end end
@ -181,8 +200,10 @@ post '/votes/:id/open' do
find_vote find_vote
require_organizer require_organizer
require_draft_vote require_draft_vote
if not @vote.candidates.length < 2
@vote.state = 'open' @vote.state = 'open'
@vote.save @vote.save
end
redirect '/votes/' + @vote.secure_id redirect '/votes/' + @vote.secure_id
end end

View file

@ -3,6 +3,9 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<title><%= _("Vote") %></title> <title><%= _("Vote") %></title>
<script src="/chartkick.js"></script>
<script src="/Chart.bundle.js"></script>
<link rel="stylesheet" href="/style.css">
</head> </head>
<body> <body>
<% if current_user %> <% if current_user %>

View file

@ -1,7 +1,9 @@
<h1><%= _("Login") %></h1> <h1><%= _("Login") %></h1>
<% if @error %> <% if @error %>
<p class="error"><%= @error %></p> <p class="error"><%= @error %></p>
<% end %> <% end %>
<form action="/login" method="POST"> <form action="/login" method="POST">
<p> <p>
<label for="email"><%= _("Email") %></label> <label for="email"><%= _("Email") %></label>

View file

@ -1,13 +1,32 @@
<h1><%= _("Create account") %></h1> <h1><%= _("Create account") %></h1>
<% if @errors %>
<% @errors.each do |error| %>
<% if error.attribute == :password and error.type == :blank %>
<p class="error"><%= _("Specify a password.") %></p>
<% end %>
<% end %>
<% end %>
<% if @user and @user.errors.any? %>
<% @user.errors.each do |error| %>
<% if error.attribute == :email and error.type == :invalid %>
<p class="error"><%= _("Email is not a valid email address.") %></p>
<% end %>
<% if error.attribute == :email and error.type == :taken %>
<p class="error"><%= _("An account already exists for %{email}.") % { email: @user.email } %></p>
<% end %>
<% end %>
<% end %>
<form action="/signup" method="post"> <form action="/signup" method="post">
<p> <p>
<label for="email"><%= _("Email") %></label> <label for="email"><%= _("Email") %></label>
<input type="text" name="email"> <input type="text" name="email" value="<%= params[:email] %>">
</p> </p>
<p> <p>
<label for="password"><%= _("Password") %></label> <label for="password"><%= _("Password") %></label>
<input type="password" name="password"> <input type="password" name="password" value="<%= params[:password] %>">
</p> </p>
<button type="submit"><%= _("Create account") %></button> <button type="submit"><%= _("Create account") %></button>
</form> </form>

9
views/style.erb Normal file
View file

@ -0,0 +1,9 @@
.error {
color: red;
}
<% settings.values.each do |v| %>
.value-<%= v[:id] %> {
background: <%= v[:color] %>;
}
<% end %>

View file

@ -57,7 +57,12 @@
<h3><%= _("Actions for organizers") %></h2> <h3><%= _("Actions for organizers") %></h2>
<form action="/votes/<%= @vote.secure_id %>/open" method="post"> <form action="/votes/<%= @vote.secure_id %>/open" method="post">
<% if @vote.candidates.length < 2 %>
<button type="submit" disabled><%= _("Open vote to participants") %></button>
<p><%= _("Add at least 2 candidates before opening the vote to participants.") %></p>
<% else %>
<button type="submit"><%= _("Open vote to participants") %></button> <button type="submit"><%= _("Open vote to participants") %></button>
<% end %>
</form> </form>
<form action="/votes/<%= @vote.secure_id %>/delete" method="post"> <form action="/votes/<%= @vote.secure_id %>/delete" method="post">
<button type="submit"><%= _("Delete vote") %></button> <button type="submit"><%= _("Delete vote") %></button>

View file

@ -16,7 +16,8 @@
<td><%= user.email %></td> <td><%= user.email %></td>
<% @vote.candidates.each do |candidate| %> <% @vote.candidates.each do |candidate| %>
<% if rating = @vote.ratings.find { |rating| rating.user == user and rating.candidate == candidate } %> <% if rating = @vote.ratings.find { |rating| rating.user == user and rating.candidate == candidate } %>
<td><%= settings.values.select { |e| e[:id] == rating.value }.first[:label] %></td> <% value = settings.values.select { |e| e[:id] == rating.value }.first %>
<td class="value-<%= value[:id] %>"><%= value[:label] %></td>
<% end %> <% end %>
<% end %> <% end %>
</tr> </tr>
@ -27,11 +28,11 @@
<table> <table>
<tr> <tr>
<td><%= _("Rank") %></td> <th><%= _("Rank") %></th>
<td><%= _("Candidate") %></td> <th><%= _("Candidate") %></th>
<td><%= _("Majority Judgment") %></td> <th><%= _("Majority Judgment") %></th>
<td><%= _("Proponents") %></td> <th><%= _("Proponents") %></th>
<td><%= _("Opponents") %></td> <th><%= _("Opponents") %></th>
</tr> </tr>
<% i = 0 %> <% i = 0 %>
<% @vote.candidates.sort { |a, b| a.mj <=> b.mj }.reverse.each do |candidate| %> <% @vote.candidates.sort { |a, b| a.mj <=> b.mj }.reverse.each do |candidate| %>
@ -39,13 +40,28 @@
<tr> <tr>
<td><%= i %></td> <td><%= i %></td>
<td><%= candidate.name %></td> <td><%= candidate.name %></td>
<td><%= settings.values.select { |e| e[:id] == candidate.mj.mj }.first[:label] %></td> <% value = settings.values.select { |e| e[:id] == candidate.mj.mj }.first %>
<td class="value-<%= value[:id] %>"><%= value[:label] %></td>
<td><%= candidate.mj.proponents %></td> <td><%= candidate.mj.proponents %></td>
<td><%= candidate.mj.opponents %></td> <td><%= candidate.mj.opponents %></td>
</tr> </tr>
<% end %> <% end %>
</table> </table>
<%
data = []
colors = []
settings.values.reverse.each do |v|
d = { name: v[:label], data: [] }
@vote.candidates.each do |c|
d[:data] << [c.name, c.mj.count[v[:id]]]
end
data << d
colors << v[:color]
end
%>
<%= bar_chart data, colors: colors, stacked: true, legend: 'bottom' %>
<h2><%= _("Organizers") %></h2> <h2><%= _("Organizers") %></h2>
<ul> <ul>

View file

@ -12,11 +12,11 @@
<li> <li>
<p><%= candidate.name %></p> <p><%= candidate.name %></p>
<p><%= candidate.description %></p> <p><%= candidate.description %></p>
<ol> <ul>
<% settings.values.reverse.each do |v| %> <% settings.values.reverse.each do |v| %>
<input type="radio" name="<%= candidate.id %>" id="<%= candidate.id %>-<%= v[:id] %>" value="<%= v[:id] %>" <% if value == v[:id] %>checked<% end %>><label for="<%= candidate.id %>-<%= v[:id] %>"><%= v[:label] %></label> <li><input type="radio" name="<%= candidate.id %>" id="<%= candidate.id %>-<%= v[:id] %>" value="<%= v[:id] %>" <% if value == v[:id] %>checked<% end %>><label for="<%= candidate.id %>-<%= v[:id] %>" class="value-<%= v[:id] %>"><%= v[:label] %></label></li>
<% end %> <% end %>
</ol> </ul>
</li> </li>
<% end %> <% end %>
</ul> </ul>