module Spud module Events class CalendarBuilder < Spud::Events::TableBuilder def initialize(objects, template, options) super(objects, template, options) @calendar = Spud::Events::Calendar.new(options) @today = options[:today] || Time.now end def day(*args,&block) raise ArgumentError, "Missing block" unless block_given? options = options_from_hash(args) day_method = options.delete(:day_method) || :start_at end_method = options.delete(:end_method) || :end_at id_pattern = options.delete(:id) activity_class = options.delete(:activity) output = "" @calendar.objects_for_days(@objects, day_method, end_method).to_a.sort{|a1, a2| a1.first <=> a2.first }.each do |o| key, array = o day, objects = array output << @template.tag(:tr,options,true) if (day.wday == @calendar.first_weekday) output << @template.tag(:td,td_options(day, id_pattern, (objects.empty? ? nil: activity_class)), true) output << @template.with_output_buffer{block.call(day, objects)} output << '' output << '' if (day.wday == @calendar.last_weekday) end @template.content_tag(:tbody, output.html_safe, {}, false) end private def objects_for_days @calendar.objects_for_days(@objects) end def td_options(day, id_pattern, activity_class) options = {} if(day.strftime("%Y-%m-%d") == @today.strftime("%Y-%m-%d")) options[:class] = 'today' elsif(day.month != @calendar.month) options[:class] = 'notmonth' elsif(day.wday == 0 or day.wday == 6) options[:class] = 'weekend' elsif activity_class options[:class] = activity_class end if id_pattern options[:id] = day.strftime(id_pattern) end options end end end end