Both quickvotes and full-size elections use the same partial in views/voter
author<jlsharps@mit.edu> <>
Thu, 30 Aug 2007 07:55:04 +0000 (03:55 -0400)
committer<jlsharps@mit.edu> <>
Thu, 30 Aug 2007 07:55:04 +0000 (03:55 -0400)
('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
app/models/vote.rb
app/views/quickvote/_pref_tables.rhtml
app/views/quickvote/index.rhtml
app/views/quickvote/results.rhtml
app/views/voter/_sortable_vote.rhtml
app/views/voter/full_vote.rhtml
db/schema.rb
public/stylesheets/main.css

index b80b5d32e2605d99cad6ceaf6ac7f45f42a85db6..b019aeb52b91e230eab971af3b4e47d8ccf5a1ac 100644 (file)
@@ -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
index dcadcac91d5db2bcd4158825b9098ab7e788e708..8852fa5fe066e6ae47ea93dd2c21afc87e1c609c 100644 (file)
@@ -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
index 0d2b020f654c6de57a5f145d009da14c28e8d5d8..18e5aa38f81f3cc5d91aa23c76f4d4063fbb585f 100644 (file)
@@ -6,9 +6,9 @@
 
 <!-- This table shows how many times each choice was ranked above the other, 
        with percentages-->
-<table class="voterbox">
+<table class="preftable">
   <tr>
-       <td> </td>
+       <td></td>
        <% candidates.each do |candidate| -%>
          <th><%=h names[candidate] -%></th>
   <% end -%>
@@ -33,7 +33,7 @@
 </table>
 
 <!-- This table generates a margin of victory -->
-<table class="voterbox">
+<table class="preftable">
   <% candidates.each do |victor| %>
   <tr>
     <th><%=h names[victor] %></th>
index a96fc41c609633882b514fb39db8d5067b31f936..e13ea942a45a7e175e6b0120efc0bec7741d04f1 100644 (file)
 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)  %>
 
-<%= sortable_element 'rankings-list',
-    :url => { :action => "sort_candidates" , :id => @voter.vote.id },
-    :complete => visual_effect(:highlight, 'rankings-list') %> 
 
 <% end %>
 </div> <!-- end main-content -->
index a2da83de7c7fee449e26c3ccc46b4d0e0fe51d8a..c45fd2a5f147478a0edabd86f16b79908adc2163 100644 (file)
@@ -30,7 +30,8 @@
 
 <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">
index 41544827f8f7c26cc8dc4dfe53ac6058970c1070..79e95b52f548952d44a68a9d37d1dd1d8759e942 100644 (file)
@@ -1,4 +1,3 @@
-<% %>
 <div id="sortable_list">
 <ol id="rankings-list">
   <% for ranking in @voter.vote.rankings %>
index e6ccb26d16f8e55a04cc7d7bc601150a5ebb07ab..cfc20e3c0e40fbfd05cd935dec9238638ddfc906 100644 (file)
@@ -5,9 +5,6 @@
 <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 %>
-
index 590425d670859ee07aab24761a30d00f5c780eb2..6c038deadbd2983e1fb2073265ec989248421809 100644 (file)
@@ -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"
index 4e845796687b9667f41fea7218a9d75f3d475835..acdff30b59a552c68e5708f4536dc9ea246e937a 100644 (file)
@@ -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;

Benjamin Mako Hill || Want to submit a patch?