Add admin panel for users and votes

Closes #2
This commit is contained in:
ricola 2025-06-08 20:46:37 -06:00
parent 9993d04ab0
commit 5fa73da51a
12 changed files with 484 additions and 82 deletions

29
views/admin.erb Normal file
View file

@ -0,0 +1,29 @@
<h1><%= _("Admin") %></h1>
<h2><%= _("Users") %></h2>
<ul>
<% @users.reverse.each do |user| %>
<li>
<a href="/admin/users/<%= user.id %>"><%= user.email %></a>
</li>
<% end %>
</ul>
<h2><%= _("Votes") %></h2>
<ul>
<% @votes.reverse.each do |vote| %>
<li>
<a href="/admin/votes/<%= vote.id %>"><%= vote.title %></a>
<% case vote.state
when 'draft' %>
<%= _("(Draft)") %>
<% when 'open' %>
<%= _("(Open)") %>
<% when 'closed' %>
<%= _("(Closed)") %>
<% end %>
</li>
<% end %>
</ul>

55
views/admin_users.erb Normal file
View file

@ -0,0 +1,55 @@
<h1><%= _("Admin") %></h1>
<h2><%= @user.email %></h2>
<p><%= _("Created: %{date}") % { date: format_date(@user.created_at) } %></p>
<p><%= _("Updated: %{date}") % { date: format_date(@user.updated_at) } %></p>
<p><%= _("Admin: %{admin}") % { admin: @user.admin ? _("Yes") : _("No") } %></p>
<h2><%= _("Organized votes") %></h2>
<% unless @user.organizers.blank? %>
<ul>
<% @user.organizers.each do |organizer| %>
<li>
<%= organizer.user.email %>
<a href="/admin/users/<%= @user.id %>/organizers/<%= organizer.vote.id %>/delete"><%= _("Delete") %></a>
</li>
<% end %>
</ul>
<% else %>
<p><%= _("No vote organized.") %></p>
<% end %>
<h2><%= _("Ratings") %></h2>
<% unless @user.ratings.blank? %>
<ul>
<% @user.ratings.collect { |rating| rating.vote }.uniq.each do |vote| %>
<li>
<%= vote.title %>
<a href="/admin/users/<%= @user.id %>/ratings/<%= vote.id %>/delete"><%= _("Delete") %></a>
</li>
<% end %>
</ul>
<% else %>
<p><%= _("No rating.") %></p>
<% end %>
<% if @user.ratings.blank? and @user.organizers.blank? %>
<form action="/admin/users/<%= @user.id %>/delete" method="post">
<button type="submit"><%= _("Delete user") %></button>
</form>
<% end %>

63
views/admin_votes.erb Normal file
View file

@ -0,0 +1,63 @@
<h1><%= _("Admin") %></h1>
<h2><%= @vote.title %></h2>
<p><a href="/votes/<%= @vote.secure_id %>"><%= _("View vote") %></a></p>
<p><%= _("Created: %{date}") % { date: format_date(@vote.created_at) } %></p>
<p><%= _("Updated: %{date}") % { date: format_date(@vote.updated_at) } %></p>
<p><%= _("Secure ID: %{secure_id}") % { secure_id: @vote.secure_id } %></p>
<p><%= _("Description: %{description}") % { description: @vote.description } %></p>
<p><%= _("Closing date: %{date}") % { date: @vote.expire_on ? format_date_and_time(@vote.expire_on) : _("None") } %></p>
<p><%= _("State: %{state}") % { state: @vote.state } %></p>
<h2><%= _("Organizers") %></h2>
<% unless @vote.organizers.blank? %>
<ul>
<% @vote.organizers.each do |organizer| %>
<li>
<%= organizer.user.email %>
<a href="/admin/votes/<%= @vote.id %>/organizers/<%= organizer.user.id %>/delete"><%= _("Delete") %></a>
</li>
<% end %>
</ul>
<% else %>
<p><%= _("No organizer.") %></p>
<% end %>
<h2><%= _("Ratings") %></h2>
<% unless @vote.ratings.blank? %>
<ul>
<% @vote.ratings.collect { |rating| rating.user }.uniq.each do |user| %>
<li>
<%= user.email %>
<a href="/admin/votes/<%= @vote.id %>/ratings/<%= user.id %>/delete"><%= _("Delete") %></a>
</li>
<% end %>
</ul>
<% else %>
<p><%= _("No rating.") %></p>
<% end %>
<% if @vote.ratings.blank? and @vote.organizers.blank? %>
<form action="/admin/votes/<%= @vote.id %>/delete" method="post">
<button type="submit"><%= _("Delete vote") %></button>
</form>
<% end %>

View file

@ -20,7 +20,12 @@
<body>
<% if current_user %>
<p><%= _("Logged in as %{email}.") % { email: current_user.email } %> <a href="/logout"><%= _("Logout") %></a></p>
<p><a href="/"><%= _("Home") %></a></p>
<p>
<a href="/"><%= _("Home") %></a>
<% if is_admin %>
<a href="/admin"><%= _("Admin") %></a>
<% end %>
</p>
<% else %>
<p><a href="/login"><%= _("Login") %></a></p>
<% end %>

View file

@ -1,6 +1,6 @@
<h1><%= _("Open vote") %></h1>
<p><%= _("Closing date: #{format_date(@expire_on)}") %></p>
<p><%= _("Closing date: %{date}" % { date: format_date_and_time(@expire_on) }) %></p>
<p><%= _("The vote will automatically close on that date and the results will
be sent to all users by email.") %></p>

View file

@ -1,12 +1,12 @@
<h1><%= @vote.title %></h1>
<% if @vote.expire_on %>
<p><%= _("Closing date: #{format_date(@vote.expire_on)}") %></p>
<p><%= _("Closing date: %{date}" % { date: format_date_and_time(@vote.expire_on) }) %></p>
<% end %>
<p><%= @vote.description %></p>
<% if @vote.ratings.length > 0 %>
<% unless @vote.ratings.blank? %>
<h2><%= _("All ratings") %></h2>

View file

@ -1,7 +1,7 @@
<h1><%= @vote.title %></h1>
<% if @vote.expire_on %>
<p><%= _("Closing date: #{format_date(@vote.expire_on)}") %></p>
<p><%= _("Closing date: %{date}" % { date: format_date_and_time(@vote.expire_on) }) %></p>
<% end %>
<p><%= @vote.description %></p>
@ -35,6 +35,8 @@
<% end %>
</ul>
<% unless @vote.organizers.blank? %>
<h2><%= _("Organizers") %></h2>
<ul>
@ -43,6 +45,8 @@
<% end %>
</ul>
<% end %>
<% if @vote.users.exists?(current_user.id) and @vote.expire_on.nil? %>
<h3><%= _("Actions for organizers") %></h3>