('sortable_vote') for the ajax voting. One gimmick seems to be that the button
is appearing above the actual list of candidates which is kinda odd, but
doesn't seem to be affecting wah'ts being committed in anyway. Also made some
modifications to the graphs and the graphs to help with how their displayed in
the new theme, hopefully it looks a litle better. Don't quite know how to
improve the results page further for quickvotes... will try keeping them
uncomputed until people ask for them?
require 'date'
class GraphController < ApplicationController
class GruffGraff
require 'date'
class GraphController < ApplicationController
class GruffGraff
+
+ COLORS = ['#74CE00', '#005CD9', '#DC0D13', '#131313', '#990033']
+ BACKGROUND_COLORS = ['#74CE00', '#FFFFFF'] #for green and white background
+
def initialize(options)
size = options[:size] ? options[:size] : "400x300" #allow custom sizing
@graph = options[:graph_type].new(size)
@graph.no_data_message = "No Voters"
def initialize(options)
size = options[:size] ? options[:size] : "400x300" #allow custom sizing
@graph = options[:graph_type].new(size)
@graph.no_data_message = "No Voters"
- @graph.theme = { :colors => ['#005CD9', '#DC0D13', '#131313', '#990033'],
- :background_colors => ['#74CE00', '#FFFFFF'] }
+ @graph.theme = { :colors => COLORS,
+ :background_colors => ['#e5e5e5', '#FFFFFF'] }
@graph.font = File.expand_path('/usr/X11R6/lib/X11/fonts/TTF/Vera.ttf',
RAILS_ROOT)
@graph.font = File.expand_path('/usr/X11R6/lib/X11/fonts/TTF/Vera.ttf',
RAILS_ROOT)
+ if options[:legend_font_size]
+ @graph.legend_font_size = options[:legend_font_size]
+ end
+
+ if options[:title_font_size]
+ @graph.title_font_size = options[:title_font_size]
+ end
+
+ #marker count doesn't include minimum value line, default is 4
+ @graph.marker_count = options[:marker_count] if options[:marker_count]
+
+ @graph.marker_font_size = options[:marker_font_size] if options[:marker_font_size]
+
+ @graph.marker_color = options[:marker_color] if options[:marker_color]
+
# fill in the data with the optional data name
#Check to see if multiple datasets, if so, fill them all!
#Sort by biggest first piece of data.
# fill in the data with the optional data name
#Check to see if multiple datasets, if so, fill them all!
#Sort by biggest first piece of data.
:data => data,
:interval_labels => labels,
:title => "Voters Over Time",
:data => data,
:interval_labels => labels,
:title => "Voters Over Time",
+ :size => "330x232",
+ :legend_font_size => 40,
+ :title_font_size => 50,
+ :marker_count => 2,
+ :marker_font_size => 30,
+ :marker_color => '#999999',
:x_axis_label => scale,
:y_axis_label => "Number of Votes")
send_data(*graph.output)
:x_axis_label => scale,
:y_axis_label => "Number of Votes")
send_data(*graph.output)
:data => data,
:interval_labels => labels,
:title => "Points Per Candidate",
:data => data,
:interval_labels => labels,
:title => "Points Per Candidate",
+ :marker_color => '#999999',
:y_axis_label => "Points",
:x_axis_label => "Candidate")
send_data(*graph.output)
:y_axis_label => "Points",
:x_axis_label => "Candidate")
send_data(*graph.output)
# Create the hash for the labels. Each graph has ten columns, and three
# will be labeled
if timedelta < 2.hours #under two hours use minutes for labels
# Create the hash for the labels. Each graph has ten columns, and three
# will be labeled
if timedelta < 2.hours #under two hours use minutes for labels
- labels_hash[0] = starttime.min.to_s
- labels_hash[(numcols/2)-1] = (starttime + (timedelta/2)).min.to_s
- labels_hash[numcols-1] = Time.now.min.to_s
- interval_type = "Minute of the Hour"
+ labels_hash[0] = "Start"
+ labels_hash[(numcols/2)-1] = fmt_decimal((timedelta/120)) #halfway
+ labels_hash[numcols-1] = fmt_decimal((timedelta/60))
+ interval_type = "Minutes After Start"
elsif timedelta < 2.days #more than 2 hours means use hours for labels
elsif timedelta < 2.days #more than 2 hours means use hours for labels
- labels_hash[0] = starttime.hour.to_s
- labels_hash[(numcols/2)-1] = (starttime + (timedelta/2)).hour.to_s
- labels_hash[numcols-1] = Time.now.hour.to_s
- interval_type = "Hour of the Day on 24 hour scale"
+ labels_hash[0] = "Start"
+ labels_hash[(numcols/2)-1] = fmt_decimal((timedelta/7200))
+ labels_hash[numcols-1] = fmt_decimal((timedelta/3600))
+ interval_type = "Hours After Start (Up to 48)"
else #more than 2 days means use dates for labels
labels_hash[0] = (Date.parse(starttime.to_s)).to_s
labels_hash[(numcols/2)-1] = (Date.parse((starttime + (timedelta/2)).to_s)).to_s
else #more than 2 days means use dates for labels
labels_hash[0] = (Date.parse(starttime.to_s)).to_s
labels_hash[(numcols/2)-1] = (Date.parse((starttime + (timedelta/2)).to_s)).to_s
return total_per_interval, labels_hash, interval_type
end
return total_per_interval, labels_hash, interval_type
end
+ def fmt_decimal(number)
+ sprintf( "%0.1f", number)
+ end
+
def get_borda_points(result)
points = Array.new
labels = Hash.new
def get_borda_points(result)
points = Array.new
labels = Hash.new
end
return preference_tally
end
end
return preference_tally
end
# the following subroutine is used for quickvotes, but need for elections now
# too. It creates a vote with the candidates listed in order of preference
# the following subroutine is used for quickvotes, but need for elections now
# too. It creates a vote with the candidates listed in order of preference
- # based on alphabetical order. It is meant to be manipulated and then confirmed
+ # based on alphabetical order. Meant to be manipulated and then confirmed
def set_defaults!
self.votes = voter.election.candidates.sort.collect {|c| c.id }
self.save
def set_defaults!
self.votes = voter.election.candidates.sort.collect {|c| c.id }
self.save
<!-- This table shows how many times each choice was ranked above the other,
with percentages-->
<!-- This table shows how many times each choice was ranked above the other,
with percentages-->
-<table class="voterbox">
+<table class="preftable">
<% candidates.each do |candidate| -%>
<th><%=h names[candidate] -%></th>
<% end -%>
<% candidates.each do |candidate| -%>
<th><%=h names[candidate] -%></th>
<% end -%>
</table>
<!-- This table generates a margin of victory -->
</table>
<!-- This table generates a margin of victory -->
-<table class="voterbox">
+<table class="preftable">
<% candidates.each do |victor| %>
<tr>
<th><%=h names[victor] %></th>
<% candidates.each do |victor| %>
<tr>
<th><%=h names[victor] %></th>
from <em>most preferred at the top</em> to <em>least preferred at the
bottom</em>. When you are done, press confirm to record your vote.</p>
from <em>most preferred at the top</em> to <em>least preferred at the
bottom</em>. When you are done, press confirm to record your vote.</p>
-<div id="sortable_list">
-<ol id="rankings-list">
- <% for ranking in @voter.vote.rankings %>
- <li class="moveable" id="ranking_<%= ranking.candidate.id %>">
- <%=h ranking.candidate.name.capitalize %></li>
- <% end %>
-</ol>
-</div>
-
-<div class="clear-div"></div>
+<%= render :partial => 'voter/sortable_vote' %>
<%= button_to "Confirm Vote", quickaction_url( :action => 'confirm', :ident => @voter.election.name) %>
<%= button_to "Confirm Vote", quickaction_url( :action => 'confirm', :ident => @voter.election.name) %>
-<%= sortable_element 'rankings-list',
- :url => { :action => "sort_candidates" , :id => @voter.vote.id },
- :complete => visual_effect(:highlight, 'rankings-list') %>
<% end %>
</div> <!-- end main-content -->
<% end %>
</div> <!-- end main-content -->
<div class="plain-header">
<span class="header">Winner</span>
<div class="plain-header">
<span class="header">Winner</span>
- <span class="subheader"></span>
+ <span class="subheader">The chosen method is:
+ <%= @election.election_method.capitalize %></span>
</div>
<div class="mainresultbox">
</div>
<div class="mainresultbox">
<div id="sortable_list">
<ol id="rankings-list">
<% for ranking in @voter.vote.rankings %>
<div id="sortable_list">
<ol id="rankings-list">
<% for ranking in @voter.vote.rankings %>
<p><strong>Description:</strong></p>
<blockquote><%= @voter.election.description %></blockquote>
<p><strong>Description:</strong></p>
<blockquote><%= @voter.election.description %></blockquote>
-<%= render :partial => 'vote' %>
-
<%= render :partial => 'sortable_vote' %>
<%= button_to "Submit Vote", :action => 'review', :id => @voter.password %>
<%= render :partial => 'sortable_vote' %>
<%= button_to "Submit Vote", :action => 'review', :id => @voter.password %>
create_table "voters", :force => true do |t|
t.column "email", :string, :limit => 100
t.column "password", :string, :limit => 100
create_table "voters", :force => true do |t|
t.column "email", :string, :limit => 100
t.column "password", :string, :limit => 100
- t.column "contacted", :integer, :limit => 4, :default => 0, :null => false
- t.column "election_id", :integer, :null => false
+ t.column "contacted", :integer, :limit => 4, :default => 0, :null => false
+ t.column "election_id", :integer, :null => false
t.column "session_id", :string, :limit => 32
t.column "ipaddress", :string, :limit => 32
t.column "session_id", :string, :limit => 32
t.column "ipaddress", :string, :limit => 32
+ t.column "type", :string, :limit => 100, :default => "", :null => false
end
add_index "voters", ["election_id"], :name => "fk_election_voter"
end
add_index "voters", ["election_id"], :name => "fk_election_voter"
+.preftable {
+ border-spacing: 0px;
+ border-width: 2px;
+ border-color: #999999;
+ border-style: solid;
+}
+
+.preftable th {
+ border-width: 2px;
+ border-color: #999999;
+ border-style: solid;
+ text-align: center;
+ font-weight: bold;
+ padding: 5px 5px 5px 15px;
+ background-color: #999999;
+ color: #fff;
+}
+
+.preftable td {
+ border-collapse: collapse;
+ border-width: 1px;
+ border-color: #999999;
+ border-style: solid;
+
+ text-align: right;
+ padding-right: 5px;
+ padding-left: 5px;
+}
+
.voterbox {
border-spacing: 0px;
border-width: 2px;
.voterbox {
border-spacing: 0px;
border-width: 2px;