Compare commits
8 commits
a93ae1269b
...
38a37137d0
| Author | SHA1 | Date | |
|---|---|---|---|
| 38a37137d0 | |||
| d55dc53ade | |||
| d2e07630d5 | |||
| 45c8e9b6b4 | |||
| 33bc3e1446 | |||
| ec173f450d | |||
| 876d46bc67 | |||
| da30b02405 |
10 changed files with 88 additions and 40 deletions
52
vedia.rb
52
vedia.rb
|
|
@ -133,17 +133,18 @@ post '/login' do
|
||||||
end
|
end
|
||||||
session.clear
|
session.clear
|
||||||
session[:user_id] = user.id
|
session[:user_id] = user.id
|
||||||
redirect '/'
|
session[:timezone] = params[:timezone]
|
||||||
|
if params[:r]
|
||||||
|
redirect params[:r]
|
||||||
|
else
|
||||||
|
redirect '/'
|
||||||
|
end
|
||||||
else
|
else
|
||||||
@error = _("Incorrect email or password.")
|
@error = _("Incorrect email or password.")
|
||||||
erb :login
|
erb :login
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
post '/timezone' do
|
|
||||||
session[:timezone] = JSON.parse(request.body.read)['timezone']
|
|
||||||
end
|
|
||||||
|
|
||||||
get '/reset' do
|
get '/reset' do
|
||||||
erb :reset
|
erb :reset
|
||||||
end
|
end
|
||||||
|
|
@ -317,19 +318,26 @@ post '/votes/new' do
|
||||||
end
|
end
|
||||||
|
|
||||||
get '/votes/:id' do
|
get '/votes/:id' do
|
||||||
require_login
|
|
||||||
find_vote
|
find_vote
|
||||||
case @vote.state
|
if not @vote
|
||||||
when 'draft'
|
erb :votes_show_unknown
|
||||||
if @vote.users.exists?(current_user.id)
|
else
|
||||||
erb :votes_edit
|
if not current_user
|
||||||
|
erb :votes_show_unauthenticated
|
||||||
else
|
else
|
||||||
erb :votes_show_draft
|
case @vote.state
|
||||||
|
when 'draft'
|
||||||
|
if @vote.users.exists?(current_user.id)
|
||||||
|
erb :votes_edit
|
||||||
|
else
|
||||||
|
erb :votes_show_draft
|
||||||
|
end
|
||||||
|
when 'open'
|
||||||
|
erb :votes_show_open
|
||||||
|
when 'closed'
|
||||||
|
erb :votes_show_closed
|
||||||
|
end
|
||||||
end
|
end
|
||||||
when 'open'
|
|
||||||
erb :votes_show_open
|
|
||||||
when 'closed'
|
|
||||||
erb :votes_show_closed
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -510,15 +518,15 @@ post '/votes/:id/ratings' do
|
||||||
end
|
end
|
||||||
if not @errors.empty?
|
if not @errors.empty?
|
||||||
@params = params
|
@params = params
|
||||||
erb :votes_show_open
|
|
||||||
else
|
else
|
||||||
@vote.candidates.each do |candidate|
|
@vote.candidates.each do |candidate|
|
||||||
rating = Rating.find_or_initialize_by(vote: @vote, user: current_user, candidate: candidate)
|
rating = Rating.find_or_initialize_by(vote: @vote, user: current_user, candidate: candidate)
|
||||||
rating.value = params[candidate.id.to_s]
|
rating.value = params[candidate.id.to_s]
|
||||||
rating.save
|
rating.save
|
||||||
end
|
end
|
||||||
redirect '/votes/' + @vote.secure_id
|
@voted = true
|
||||||
end
|
end
|
||||||
|
erb :votes_show_open
|
||||||
end
|
end
|
||||||
|
|
||||||
get '/votes/:id/organizers' do
|
get '/votes/:id/organizers' do
|
||||||
|
|
@ -594,10 +602,11 @@ helpers do
|
||||||
end
|
end
|
||||||
|
|
||||||
def require_login
|
def require_login
|
||||||
redirect '/login' unless current_user
|
redirect "/login?r=#{request.path}" unless current_user
|
||||||
end
|
end
|
||||||
|
|
||||||
def require_admin
|
def require_admin
|
||||||
|
require_login
|
||||||
redirect '/' unless is_admin
|
redirect '/' unless is_admin
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -634,12 +643,7 @@ helpers do
|
||||||
end
|
end
|
||||||
|
|
||||||
def format_date(timestamp)
|
def format_date(timestamp)
|
||||||
if session[:timezone]
|
"#{TZInfo::Timezone.get(session[:timezone]).to_local(timestamp).strftime('%F')}"
|
||||||
"#{TZInfo::Timezone.get(session[:timezone]).to_local(timestamp).strftime('%F')}"
|
|
||||||
else
|
|
||||||
# Otherwise, format_date fails on first page after login. Not sure why...
|
|
||||||
"#{timestamp.strftime('%F')}"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def format_date_and_time(timestamp)
|
def format_date_and_time(timestamp)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<h2 class="mb-4"><%= _("Users") %></h2>
|
<h2 class="mb-4"><%= _("Users") %></h2>
|
||||||
|
|
||||||
<ul class="mb-5">
|
<ul class="mb-5">
|
||||||
<% @users.reverse.each do |user| %>
|
<% @users.sort_by { |user| user.email }.each do |user| %>
|
||||||
<li>
|
<li>
|
||||||
<a href="/admin/users/<%= user.id %>"><%= user.email %></a>
|
<a href="/admin/users/<%= user.id %>"><%= user.email %></a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
<% unless @vote.ratings.blank? %>
|
<% unless @vote.ratings.blank? %>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<% @vote.ratings.collect { |rating| rating.user }.uniq.each do |user| %>
|
<% @vote.ratings.collect { |rating| rating.user }.uniq.sort_by { |user| user.email }.each do |user| %>
|
||||||
<li>
|
<li>
|
||||||
<%= user.email %>
|
<%= user.email %>
|
||||||
<a href="/admin/votes/<%= @vote.id %>/ratings/<%= user.id %>/delete"><%= _("Delete") %></a>
|
<a href="/admin/votes/<%= @vote.id %>/ratings/<%= user.id %>/delete"><%= _("Delete") %></a>
|
||||||
|
|
|
||||||
|
|
@ -3,22 +3,18 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>Vedia</title>
|
<% if @vote %>
|
||||||
|
<title>Vedia · <%= @vote.title %></title>
|
||||||
|
<meta property="og:title" content="<%= @vote.title %>"/>
|
||||||
|
<% else %>
|
||||||
|
<title>Vedia</title>
|
||||||
|
<% end %>
|
||||||
<script src="/chartkick.js"></script>
|
<script src="/chartkick.js"></script>
|
||||||
<script src="/Chart.bundle.js"></script>
|
<script src="/Chart.bundle.js"></script>
|
||||||
<link rel="stylesheet" href="/bootstrap.css">
|
<link rel="stylesheet" href="/bootstrap.css">
|
||||||
<link rel="stylesheet" href="/bootstrap-icons.css">
|
<link rel="stylesheet" href="/bootstrap-icons.css">
|
||||||
<link rel="stylesheet" href="/style.css">
|
<link rel="stylesheet" href="/style.css">
|
||||||
</head>
|
</head>
|
||||||
<script>
|
|
||||||
fetch('/timezone', {
|
|
||||||
method: 'post',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone })
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<body>
|
<body>
|
||||||
<div class="container py-4">
|
<div class="container py-4">
|
||||||
|
|
||||||
|
|
@ -46,6 +42,8 @@
|
||||||
<div class="d-flex flex-wrap justify-content-end pe-3 py-3 mb-4">
|
<div class="d-flex flex-wrap justify-content-end pe-3 py-3 mb-4">
|
||||||
<% if current_user %>
|
<% if current_user %>
|
||||||
<%= current_user.email %>
|
<%= current_user.email %>
|
||||||
|
<% else %>
|
||||||
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
<p class="alert alert-warning mb-4"><%= @error %></p>
|
<p class="alert alert-warning mb-4"><%= @error %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<form action="/login" method="post" class="mb-5">
|
<form action="/login" name="login" method="post" class="mb-5">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="email" class="form-label"><%= _("Email") %></label>
|
<label for="email" class="form-label"><%= _("Email") %></label>
|
||||||
<input type="text" name="email" class="form-control">
|
<input type="text" name="email" class="form-control">
|
||||||
|
|
@ -14,6 +14,12 @@
|
||||||
<input type="password" name="password" class="form-control">
|
<input type="password" name="password" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="btn btn-primary"><%= _("Login") %></button>
|
<button type="submit" class="btn btn-primary"><%= _("Login") %></button>
|
||||||
|
<input type="hidden" name="r" value="<%= @params[:r] %>">
|
||||||
|
<input type="hidden" name="timezone" value="UTC">
|
||||||
</form>
|
</form>
|
||||||
<p><a href="/signup"><%= _("Create account") %></a></p>
|
<p><a href="/signup"><%= _("Create account") %></a></p>
|
||||||
<p><a href="/reset"><%= _("Reset password") %></a></p>
|
<p><a href="/reset"><%= _("Reset password") %></a></p>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.login.timezone.value = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||||
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,11 @@
|
||||||
<% when 'closed' %>
|
<% when 'closed' %>
|
||||||
<SPAN class="badge bg-dark"><%= _("Closed") %></span>
|
<SPAN class="badge bg-dark"><%= _("Closed") %></span>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<% if vote.ratings.find { |rating| rating.user == current_user } %>
|
||||||
|
<span class="badge bg-success"><%= _("Voted") %></span>
|
||||||
|
<% elsif vote.state == 'open' %>
|
||||||
|
<span class="badge bg-danger"><%= _("Not voted") %></span>
|
||||||
|
<% end %>
|
||||||
<% if vote.users.exists?(current_user.id) %>
|
<% if vote.users.exists?(current_user.id) %>
|
||||||
<span class="badge bg-warning text-bg-warning"><%= _("Organizer") %></span>
|
<span class="badge bg-warning text-bg-warning"><%= _("Organizer") %></span>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ end
|
||||||
<% end %>
|
<% end %>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<% @vote.ratings.collect { |rating| rating.user }.uniq.each do |user| %>
|
<% @vote.ratings.collect { |rating| rating.user }.uniq.sort_by { |user| user.email }.each do |user| %>
|
||||||
<tr>
|
<tr>
|
||||||
<td><%= user.email %></td>
|
<td><%= user.email %></td>
|
||||||
<% @vote.candidates.each do |candidate| %>
|
<% @vote.candidates.each do |candidate| %>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,11 @@
|
||||||
<ul class="list-unstyled">
|
<ul class="list-unstyled">
|
||||||
<li>
|
<li>
|
||||||
<span class="badge bg-primary"><%= _("Open") %></span>
|
<span class="badge bg-primary"><%= _("Open") %></span>
|
||||||
|
<% if @vote.ratings.find { |rating| rating.user == current_user } %>
|
||||||
|
<span class="badge bg-success"><%= _("Voted") %></span>
|
||||||
|
<% else %>
|
||||||
|
<span class="badge bg-danger"><%= _("Not voted") %></span>
|
||||||
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
<% if @vote.expire_on %>
|
<% if @vote.expire_on %>
|
||||||
<li><%= _("Closes on %{date}") % { date: format_date_and_time(@vote.expire_on) } %></li>
|
<li><%= _("Closes on %{date}") % { date: format_date_and_time(@vote.expire_on) } %></li>
|
||||||
|
|
@ -26,6 +31,10 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<% if @voted %>
|
||||||
|
<p class="alert alert-success mb-4"><%= _("Gràcies per votar!") %></p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<form action="/votes/<%= @vote.secure_id %>/ratings" method="post" class="mb-5">
|
<form action="/votes/<%= @vote.secure_id %>/ratings" method="post" class="mb-5">
|
||||||
|
|
||||||
<% @vote.candidates.each do |candidate| %>
|
<% @vote.candidates.each do |candidate| %>
|
||||||
|
|
@ -54,10 +63,10 @@
|
||||||
<button type="submit" class="btn btn-primary"><%= _("Vote") %></button>
|
<button type="submit" class="btn btn-primary"><%= _("Vote") %></button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<h2 class="mb-4"><%= _("Participants") %></h2>
|
<h2 class="mb-4"><%= _("Participants") + " (#{@vote.ratings.collect { |rating| rating.user }.uniq.count})" %></h2>
|
||||||
|
|
||||||
<ul class="mb-5">
|
<ul class="mb-5">
|
||||||
<% @vote.ratings.collect { |rating| rating.user }.uniq.each do |user| %>
|
<% @vote.ratings.collect { |rating| rating.user }.uniq.sort_by { |user| user.email }.each do |user| %>
|
||||||
<li><%= user.email %></li>
|
<li><%= user.email %></li>
|
||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
||||||
23
views/votes_show_unauthenticated.erb
Normal file
23
views/votes_show_unauthenticated.erb
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
<div class="mb-5">
|
||||||
|
<h1><%= @vote.title %></h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="alert alert-warning mb-4"><%= _("You need to log in to see the details of this vote.") %></p>
|
||||||
|
|
||||||
|
<form action="/login" method="post" class="mb-5">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="email" class="form-label"><%= _("Email") %></label>
|
||||||
|
<input type="text" name="email" class="form-control">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="password" class="form-label"><%= _("Password") %></label>
|
||||||
|
<input type="password" name="password" class="form-control">
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary"><%= _("Login") %></button>
|
||||||
|
<input type="hidden" name="r" value="votes/<%= @vote.secure_id %>">
|
||||||
|
<input type="hidden" name="timezone" value="UTC">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.login.timezone.value = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||||
|
</script>
|
||||||
3
views/votes_show_unknown.erb
Normal file
3
views/votes_show_unknown.erb
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<div class="mb-5">
|
||||||
|
<h1><%= _("Vote not found...") %></h1>
|
||||||
|
</div>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue