From 1ef3925927fb35483da98af08f9fc175d5502708 Mon Sep 17 00:00:00 2001 From: Date: Thu, 30 Aug 2007 03:55:04 -0400 Subject: [PATCH] Both quickvotes and full-size elections use the same partial in views/voter ('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? --- app/controllers/graph_controller.rb | 53 +++++++++++++++++++------- app/models/vote.rb | 2 +- app/views/quickvote/_pref_tables.rhtml | 6 +-- app/views/quickvote/index.rhtml | 14 +------ app/views/quickvote/results.rhtml | 3 +- app/views/voter/_sortable_vote.rhtml | 1 - app/views/voter/full_vote.rhtml | 3 -- db/schema.rb | 5 ++- public/stylesheets/main.css | 29 ++++++++++++++ 9 files changed, 79 insertions(+), 37 deletions(-) diff --git a/app/controllers/graph_controller.rb b/app/controllers/graph_controller.rb index b80b5d3..b019aeb 100644 --- a/app/controllers/graph_controller.rb +++ b/app/controllers/graph_controller.rb @@ -1,18 +1,36 @@ 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" - @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) + 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. @@ -74,7 +92,12 @@ class GraphController < ApplicationController :data => data, :interval_labels => labels, :title => "Voters Over Time", - :size => "270x230", + :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) @@ -90,6 +113,7 @@ class GraphController < ApplicationController :data => data, :interval_labels => labels, :title => "Points Per Candidate", + :marker_color => '#999999', :y_axis_label => "Points", :x_axis_label => "Candidate") send_data(*graph.output) @@ -258,15 +282,15 @@ class GraphController < ApplicationController # 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 - 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 @@ -278,6 +302,10 @@ class GraphController < ApplicationController 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 @@ -306,5 +334,4 @@ class GraphController < ApplicationController end return preference_tally end - end diff --git a/app/models/vote.rb b/app/models/vote.rb index dcadcac..8852fa5 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -95,7 +95,7 @@ class Vote < ActiveRecord::Base # 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 diff --git a/app/views/quickvote/_pref_tables.rhtml b/app/views/quickvote/_pref_tables.rhtml index 0d2b020..18e5aa3 100644 --- a/app/views/quickvote/_pref_tables.rhtml +++ b/app/views/quickvote/_pref_tables.rhtml @@ -6,9 +6,9 @@ - +
- + <% candidates.each do |candidate| -%> <% end -%> @@ -33,7 +33,7 @@
<%=h names[candidate] -%>
- +
<% candidates.each do |victor| %> diff --git a/app/views/quickvote/index.rhtml b/app/views/quickvote/index.rhtml index a96fc41..e13ea94 100644 --- a/app/views/quickvote/index.rhtml +++ b/app/views/quickvote/index.rhtml @@ -20,22 +20,10 @@ from most preferred at the top to least preferred at the bottom. When you are done, press confirm to record your vote.

-
-
    - <% for ranking in @voter.vote.rankings %> -
  1. - <%=h ranking.candidate.name.capitalize %>
  2. - <% end %> -
-
- -
+<%= render :partial => 'voter/sortable_vote' %> <%= 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 %> diff --git a/app/views/quickvote/results.rhtml b/app/views/quickvote/results.rhtml index a2da83d..c45fd2a 100644 --- a/app/views/quickvote/results.rhtml +++ b/app/views/quickvote/results.rhtml @@ -30,7 +30,8 @@
Winner - + The chosen method is: + <%= @election.election_method.capitalize %>
diff --git a/app/views/voter/_sortable_vote.rhtml b/app/views/voter/_sortable_vote.rhtml index 4154482..79e95b5 100644 --- a/app/views/voter/_sortable_vote.rhtml +++ b/app/views/voter/_sortable_vote.rhtml @@ -1,4 +1,3 @@ -<% %>
    <% for ranking in @voter.vote.rankings %> diff --git a/app/views/voter/full_vote.rhtml b/app/views/voter/full_vote.rhtml index e6ccb26..cfc20e3 100644 --- a/app/views/voter/full_vote.rhtml +++ b/app/views/voter/full_vote.rhtml @@ -5,9 +5,6 @@

    Description:

    <%= @voter.election.description %>
    -<%= render :partial => 'vote' %> - <%= render :partial => 'sortable_vote' %> <%= button_to "Submit Vote", :action => 'review', :id => @voter.password %> - diff --git a/db/schema.rb b/db/schema.rb index 590425d..6c038de 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -74,10 +74,11 @@ ActiveRecord::Schema.define() do 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 "type", :string, :limit => 100, :default => "", :null => false end add_index "voters", ["election_id"], :name => "fk_election_voter" diff --git a/public/stylesheets/main.css b/public/stylesheets/main.css index 4e84579..acdff30 100644 --- a/public/stylesheets/main.css +++ b/public/stylesheets/main.css @@ -265,6 +265,35 @@ li.moveable { float: left; } +.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; -- 2.30.2
<%=h names[victor] %>