diff --git a/app/controllers/marks_controller.rb b/app/controllers/marks_controller.rb index 0b10f55..2ed15a8 100644 --- a/app/controllers/marks_controller.rb +++ b/app/controllers/marks_controller.rb @@ -1,7 +1,7 @@ class MarksController < ApplicationController def create @stamp = Stamp.find(params[:stamp_id]) - @mark = @stamp.marks.create!(:marked_on => params[:date], :position_x => params[:x], :position_y => params[:y]) + @mark = @stamp.marks.create!(:marked_on => params[:date], :position_x => params[:x], :position_y => params[:y], :skip => (params[:skip] == "true")) respond_to do |format| format.html { redirect_to root_url } format.js diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index fb3ed39..01b27a7 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -5,7 +5,7 @@ def mark_image(mark, size = 65) if mark.position_x && mark.position_y options[:style] = "margin-left: #{mark.position_x-size/2-6}px; margin-top: #{mark.position_y-size/2-6}px;" end - image_tag "mark.png", options + image_tag (mark.skip? ? "skip.png" : "mark.png"), options end def points(num) diff --git a/app/models/score_tracker.rb b/app/models/score_tracker.rb index 8a754b2..4a5b722 100644 --- a/app/models/score_tracker.rb +++ b/app/models/score_tracker.rb @@ -19,6 +19,11 @@ def mark @positive_points end + def skip + # keep scores as they are + 0 + end + def miss @position = 0 if @negative_points.zero? if @position == @negative_points diff --git a/app/models/stamp.rb b/app/models/stamp.rb index 7bb9039..643726e 100644 --- a/app/models/stamp.rb +++ b/app/models/stamp.rb @@ -12,7 +12,11 @@ def day_points(date) def month_points(date) @tracker = last_month_tracker(date) || ScoreTracker.new (date.beginning_of_month..date.end_of_month).map do |day| - mark_on_day(day) ? @tracker.mark : @tracker.miss + if mark_on_day(day) + mark_on_day(day).skip? ? @tracker.skip : @tracker.mark + else + @tracker.miss + end end end memoize :month_points @@ -32,7 +36,11 @@ def marks_in_month(date) def month_tracker(date) @tracker = last_month_tracker(date) || ScoreTracker.new (date.beginning_of_month..date.end_of_month).each do |day| - mark_on_day(day) ? @tracker.mark : @tracker.miss + if mark_on_day(day) + mark_on_day(day).skip? ? @tracker.skip : @tracker.mark + else + @tracker.miss + end end @tracker end diff --git a/public/images/skip.png b/public/images/skip.png new file mode 100644 index 0000000..f4dfad3 Binary files /dev/null and b/public/images/skip.png differ diff --git a/public/javascripts/stamp.js b/public/javascripts/stamp.js index 6a54428..2ca7eb3 100644 --- a/public/javascripts/stamp.js +++ b/public/javascripts/stamp.js @@ -14,7 +14,7 @@ $(function() { var p = $(this).position(); var x = (event.pageX - p.left); var y = (event.pageY - p.top); - $.post($(this).children("a.mark_link").attr("href"), { x: x, y: y}, null, "script"); + $.post($(this).children("a.mark_link").attr("href"), { x: x, y: y, skip: "true" }, null, "script"); } } return false; diff --git a/spec/controllers/marks_controller_spec.rb b/spec/controllers/marks_controller_spec.rb index a26d052..6c43e49 100644 --- a/spec/controllers/marks_controller_spec.rb +++ b/spec/controllers/marks_controller_spec.rb @@ -14,6 +14,13 @@ mark.position_y.should == 456 end + it "create action should create mark with skip" do + post :create, :stamp_id => Stamp.first.id, :date => "2009-02-01", :skip => "true" + response.should redirect_to(root_url) + mark = Mark.last + mark.skip.should be_true + end + it "create action should render template when js action" do post :create, :format => "js", :stamp_id => Stamp.first.id, :date => "2009-02-01" response.should render_template("create") diff --git a/spec/models/score_tracker_spec.rb b/spec/models/score_tracker_spec.rb index 54cf199..3b7fcb2 100644 --- a/spec/models/score_tracker_spec.rb +++ b/spec/models/score_tracker_spec.rb @@ -42,4 +42,8 @@ @tracker.miss, @tracker.miss, @tracker.miss, @tracker.miss, @tracker.mark].should == [1, 2, 2, -1, 2, 2, -1, -2, -2, -3, 1] end + + it "skip should continue on as if nothing happened" do + [@tracker.mark, @tracker.skip, @tracker.skip, @tracker.mark].should == [1, 0, 0, 2] + end end diff --git a/spec/models/stamp_spec.rb b/spec/models/stamp_spec.rb index ef46f5f..c99a34a 100644 --- a/spec/models/stamp_spec.rb +++ b/spec/models/stamp_spec.rb @@ -33,4 +33,11 @@ stamp.marks.create!(:marked_on => "2009-04-01") stamp.day_points(Date.new(2009, 4, 2)).should == -1 end + + it "month points should be 1 on first mark but -1 on next miss" do + stamp = Stamp.create! + stamp.marks.create!(:marked_on => "2009-04-01") + stamp.marks.create!(:marked_on => "2009-04-02", :skip => true) + stamp.month_points(Date.new(2009, 4)).should == [1, 0, -1] + [0]*27 + end end