I got the idea from this post: 
http://z3c.blogspot.com/2008/01/dynamic-calendar-helper-changing-months.html
If anyone has suggestions on a better way to do it, I'd love to know.
Thanks.


Basically, I just created a new route in routes.rb >
map.connect 'wkly_cal/:starts_at/:ends_at',
  :controller => 'wkly_cal',
  :action => 'index'

So, the url can set the date range.  Added this to the
wkly_cal_controller.rb: (under index)
a = params.include?(:starts_at) ? params[:starts_at] :
      Date.today - 2
    b = params.include?(:ends_at) ? params[:ends_at] :
      Date.today + 2

    @wkly_cal = Time.parse(a).to_date, Time.parse(b).to_date

So going to just "wkly_cal/" will show this week.  Then the following
code wen into wkly_cal_helper.rb
def weekly_options
    {
    :starts_at => @wkly_cal[0] ,
    :ends_at =>
@wkly_cal[1] }
end

So in the view (index) I now have this:
<h1>Weekly Calendar</h1>
<% for lesson in @lessons %><%end%>
<%= week_view(weekly_options) do |range|
        cell_text = ""
        cell_attrs = {}

        @lessons.each do |e|
          #if range.first.to_date == e.starts_at.to_date#range.include?
(e.starts_at.to_datetime)
         if range.include?(e.start_date.to_datetime)
            cell_text << "<div class='event-container'>\n"

                        cell_text << lesson.student_name
                        cell_text << "\n"
            cell_text << "</div>\n"
          end
        end
        [cell_text, cell_attrs]
      end
 -%>

The actual links is set in the WeekViewHelper: (cal << next_link, cal
<< prev_link)
require 'date'

  # Author: Josh Adams
  # This helper is based on CalendarHelper.
  # WeekViewHelper allows you to draw a databound week view calendar
with fine-grained CSS formatting
module WeekViewHelper
    VERSION = '0.0.1'

    # Returns an HTML week-view calendar. In its simplest form, this
method generates a plain
    # calendar (which can then be customized using CSS) for a given
span of days.
    # However, this may be customized in a variety of ways -- changing
the default CSS
    # classes, generating the individual day entries yourself, and so
on.
    #
    # The following options are required:
    #  :starts_at
    #  :ends_at
    #
    # The following are optional, available for customizing the
default behaviour:
    #   :table_class       => "week-view"        # The class for the
<table> tag.
    #   :day_name_class    => "dayName"         # The class is for the
names of the days, at the top.
    #   :day_class         => "day"             # The class for the
individual day number cells.
    #                                             This may or may not
be used if you specify a block (see below).
    #   :show_today        => true              # Highlights today on
the calendar using the CSS class 'today'.
    #                                           # Defaults to true.
    #   :previous_span_text   => nil            # Displayed left if
set
    #   :next_span_text   => nil                # Displayed right if
set
    #
    # For more customization, you can pass a code block to this
method, that will get two argument, both DateTime objects,
    # and return a values for the individual table cells. The block
can return an array, [cell_text, cell_attrs],
    # cell_text being the text that is displayed and cell_attrs a hash
containing the attributes for the <td> tag
    # (this can be used to change the <td>'s class for customization
with CSS).
    # This block can also return the cell_text only, in which case the
<td>'s class defaults to the value given in
    # +:day_class+. If the block returns nil, the default options are
used.
    #
    # Example usage:
    #   week_view(:starts_at => (Date.today - 5), :ends_at =>
Date.today) # This generates the simplest possible week-view.
    #   week_view(:starts_at => (Date.today - 5), :ends_at =>
Date.today, :table_class => "calendar_helper"}) # This generates a
week-view, as
 
#
# before, but the <table>'s class
 
#
# is set to "calendar_helper".
    #   week_view(:starts_at => (Date.today - 5), :ends_at =>
Date.today) do |s| # This generates a simple week-view, but gives
special spans
    #     if listOfSpecialSpans.include?(s)          # (spans that are
in the array listOfSpecialSpans) one CSS class,
    #       ["", {:class => "specialSpan"}]      # "specialSpan", and
gives the rest of the spans another CSS class,
    #     else                                      # "normalSpan".
You can also use this to highlight the current time differently
    #       ["", {:class => "normalSpan"}]       # from the rest of
the days, etc.
    #     end
    #   end
    #
    # For consistency with the themes provided in the calendar_styles
generator, use "specialSpan" as the CSS class for marked days.
    #
    def week_view(options = {}, &block)
      raise(ArgumentError, "No start date given")  unless
options.has_key?(:starts_at)
      raise(ArgumentError, "No end date given") unless options.has_key?
(:ends_at)
      span = (options[:ends_at] - options[:starts_at]).to_i # Get the
number of days represented by the span given
      dates = (options[:starts_at]..options[:ends_at])
      start_time = 13
      end_time   = 21
      time_range = (start_time..end_time).to_a
      duration = 15

      block                        ||= Proc.new {|d| nil}
      defaults = {
        :table_class => 'week-view',
        :day_name_class => 'dayName',
        :day_class => 'day',
        :show_today => true,
        :previous_span_text => nil,
        :next_span_text => nil


      }
      options = defaults.merge options




       #### NEXT AND PREVIOUS LINKS ####
       next_starts_at = options[:ends_at] + 1
       next_ends_at   = next_starts_at + 6
       next_link = link_to('Next &gt;&gt;', :starts_at =>
next_starts_at, :ends_at => next_ends_at)
       prev_starts_at = options[:starts_at] - (span + 1)
       prev_ends_at = options[:starts_at] - 1
       prev_link = link_to('&lt;&lt; Prev', :starts_at =>
prev_starts_at, :ends_at => prev_ends_at)


      cal = %(<table class="#{options[:table_class]}">\n)
      cal << %(\t<thead>\n\t\t<tr>\n)
      cal << %(\t\t\t<th>#{dates.first.strftime("%Y")}</th>\n)
      dates.each do |d|
        cal << "\t\t\t<th#{Date.today == d ? " class='today'" :
""}>#{d.strftime("%A")}<br />#{d.strftime("%m/%d")}</th>\n"
      end
      cal << "\t\t</tr>\n\t</thead>\n\t<tbody>\n"
      time_range.each do |hour|
        minutes = 0
        print_hour = hour.to_s.rjust(2, '0')
        4.times do |i|
          print_minutes = minutes.to_s.rjust(2, '0')
          cal << %(\t\t<tr class='m#{print_minutes} d#{duration}'>\n)
          if hour < 12
            cal << %(\t\t\t<th rowspan="4"><h3>#{hour}</h3>AM</th>\n)
if i==0
          end
          if hour == 12
            cal << %(\t\t\t<th rowspan="4"><h3>#{hour}</h3>PM</th>\n)
if i==0
          end
          if hour > 12
            hour = hour - 12
            cal << %(\t\t\t<th rowspan="4"><h3>#{hour}</h3>PM</th>\n)
if i==0
          end

          options[:starts_at].upto(options[:ends_at]) do |d|
            the_minutes = minutes
            print_start_minutes = the_minutes.to_s.ljust(2, '0')
            starts_attime_string = %
(#{d.to_s(:db)}T#{print_hour}:#{print_start_minutes}:00-06:00)
            starts_attime =
DateTime.parse(starts_attime_string).to_datetime
            ends_attime = (starts_attime +
duration.minutes).to_datetime
            range = (starts_attime...ends_attime)

            # cell_attrs should return a hash.
            cell_text, cell_attrs = block.call(range)
            cell_text ||= ""
            cell_attrs ||= {}
            cell_attrs[:class] = cell_attrs[:class].to_s + " today" if
Date.today == d
            cell_attrs = cell_attrs.map {|k, v| %
(#{k}="#{v}") }.join(" ")

            cal << "\t\t\t<td #{cell_attrs}>\n#{cell_text}&nbsp;\t\t
\t</td>\n"
          end
          minutes += duration
          cal << %(\t\t</tr>)
        end
      end
      cal << "\n\t</tbody>\n</table>\n"
      cal << "<br/>\n"
      cal << next_link
      cal << prev_link


    end

    private
 end






On Oct 3, 10:08 am, Bobnation <[EMAIL PROTECTED]> wrote:
> I'd love to read it. Looking forward to it.
>
> On Oct 3, 1:22 am, infinteVerve <[EMAIL PROTECTED]> wrote:
>
> > Nevermind, Just fixed it.
> > I will post the solution tomorrow, for anyone else tackling similar
> > issues.
>
> > On Oct 2, 11:34 pm, infinteVerve <[EMAIL PROTECTED]> wrote:
>
> > > issue #1. I'm a newb.
>
> > > So, I'm trying to set up a calendar of lessons using the
> > > WeekViewHelper snippet found 
> > > here:http://snippets.dzone.com/posts/show/5206(veryslightlyaltered). The
> > > problem only occurs when I try to set the :url option.  Without it
> > > works fine, except I haven't been able to (can't figure it out) create
> > > links to go to the next or previous weeks.
>
> > > Any help, or suggestions are greatly appreciated, or if you know of a
> > > different way to go about it.
>
> > > The code for the various files are posted below.  "start_date" and
> > > "end_date" are columns in the table "lessons", while "starts_at" and
> > > "ends_at" are options for the helper.
>
> > > WEEK_VIEW_HELPER.RB:
>
> > > require 'date'
>
> > >   # Author: Josh Adams
> > >   # This helper is based on CalendarHelper.
> > >   # WeekViewHelper allows you to draw a databound week view calendar
> > > with fine-grained CSS formatting
> > > module WeekViewHelper
> > >     VERSION = '0.0.1'
>
> > >     # Returns an HTML week-view calendar. In its simplest form, this
> > > method generates a plain
> > >     # calendar (which can then be customized using CSS) for a given
> > > span of days.
> > >     # However, this may be customized in a variety of ways -- changing
> > > the default CSS
> > >     # classes, generating the individual day entries yourself, and so
> > > on.
> > >     #
> > >     # The following options are required:
> > >     #  :starts_at
> > >     #  :ends_at
> > >     #
> > >     # The following are optional, available for customizing the
> > > default behaviour:
> > >     #   :table_class       => "week-view"        # The class for the
> > > <table> tag.
> > >     #   :day_name_class    => "dayName"         # The class is for the
> > > names of the days, at the top.
> > >     #   :day_class         => "day"             # The class for the
> > > individual day number cells.
> > >     #                                             This may or may not
> > > be used if you specify a block (see below).
> > >     #   :show_today        => true              # Highlights today on
> > > the calendar using the CSS class 'today'.
> > >     #                                           # Defaults to true.
> > >     #   :previous_span_text   => nil            # Displayed left if
> > > set
> > >     #   :next_span_text   => nil                # Displayed right if
> > > set
> > >     #
> > >     # For more customization, you can pass a code block to this
> > > method, that will get two argument, both DateTime objects,
> > >     # and return a values for the individual table cells. The block
> > > can return an array, [cell_text, cell_attrs],
> > >     # cell_text being the text that is displayed and cell_attrs a hash
> > > containing the attributes for the <td> tag
> > >     # (this can be used to change the <td>'s class for customization
> > > with CSS).
> > >     # This block can also return the cell_text only, in which case the
> > > <td>'s class defaults to the value given in
> > >     # +:day_class+. If the block returns nil, the default options are
> > > used.
> > >     #
> > >     # Example usage:
> > >     #   week_view(:starts_at => (Date.today - 5), :ends_at =>
> > > Date.today) # This generates the simplest possible week-view.
> > >     #   week_view(:starts_at => (Date.today - 5), :ends_at =>
> > > Date.today, :table_class => "calendar_helper"}) # This generates a
> > > week-view, as
>
> > > #
> > > # before, but the <table>'s class
>
> > > #
> > > # is set to "calendar_helper".
> > >     #   week_view(:starts_at => (Date.today - 5), :ends_at =>
> > > Date.today) do |s| # This generates a simple week-view, but gives
> > > special spans
> > >     #     if listOfSpecialSpans.include?(s)          # (spans that are
> > > in the array listOfSpecialSpans) one CSS class,
> > >     #       ["", {:class => "specialSpan"}]      # "specialSpan", and
> > > gives the rest of the spans another CSS class,
> > >     #     else                                      # "normalSpan".
> > > You can also use this to highlight the current time differently
> > >     #       ["", {:class => "normalSpan"}]       # from the rest of
> > > the days, etc.
> > >     #     end
> > >     #   end
> > >     #
> > >     # For consistency with the themes provided in the calendar_styles
> > > generator, use "specialSpan" as the CSS class for marked days.
> > >     #
> > >     def week_view(options = {}, &block)
> > >       raise(ArgumentError, "No start date given")  unless
> > > options.has_key?(:starts_at)
> > >       raise(ArgumentError, "No end date given") unless options.has_key?
> > > (:ends_at)
> > >       span = (options[:ends_at] - options[:starts_at]).to_i # Get the
> > > number of days represented by the span given
> > >       dates = (options[:starts_at]..options[:ends_at])
> > >       start_time = 13
> > >       end_time   = 21
> > >       time_range = (start_time..end_time).to_a
> > >       duration = 15
>
> > >       block                        ||= Proc.new {|d| nil}
> > >       defaults = {
> > >         :table_class => 'week-view',
> > >         :day_name_class => 'dayName',
> > >         :day_class => 'day',
> > >         :show_today => true,
> > >         :previous_span_text => nil,
> > >         :next_span_text => nil
>
> > >       }
> > >       options = defaults.merge options
>
> > >       if options[:url]
> > >        next_starts_at = options[:ends_at] + 1
> > >        next_ends_at   = next_starts_at + 7
> > >        next_link = link_to('>>',
> > > url_for(options[:url].merge({options[:starts_at] => next_starts_at,
> > > options[:ends_at] => next_ends_at})) + options[:url_append])
> > >        prev_starts_at = options[:starts_at] - span
> > >        prev_ends_at = options[:starts_at] - 1
> > >        #prev_link = link_to('<<',
> > > url_for(options[:url].merge(:starts_at => prev_starts_at, :ends_at =>
> > > prev_ends_at)) + options[:url_append])
> > >      end
>
> > >         #next_starts_at = options[:ends_at] + 1
> > >         #next_ends_at   = next_starts_at + 5
> > >         [EMAIL PROTECTED] = options[:starts_at] = next_starts_at
> > >         [EMAIL PROTECTED] = options[:ends_at] = next_ends_at
> > >         #redirect_to 'index'
>
> > >         #next_link = link_to('>>',
> > > url_for(options[:url].merge(:starts_at => next_starts_at, :ends_at =>
> > > next_ends_at)) + options[:url_append])
>
> > >       # TODO Use some kind of builder instead of straight HTML
>
> > >       cal = %(<table class="#{options[:table_class]}">\n)
> > >       cal << %(\t<thead>\n\t\t<tr>\n)
> > >       cal << %(\t\t\t<th>#{dates.first.strftime("%Y")}</th>\n)
> > >       dates.each do |d|
> > >         cal << "\t\t\t<th#{Date.today == d ? " class='today'" :
> > > ""}>#{d.strftime("%A")}<br />#{d.strftime("%m/%d")}</th>\n"
> > >       end
> > >       cal << "\t\t</tr>\n\t</thead>\n\t<tbody>\n"
> > >       time_range.each do |hour|
> > >         minutes = 0
> > >         print_hour = hour.to_s.rjust(2, '0')
> > >         4.times do |i|
> > >           print_minutes = minutes.to_s.rjust(2, '0')
> > >           cal << %(\t\t<tr class='m#{print_minutes} d#{duration}'>\n)
> > >           if hour < 12
> > >             cal << %(\t\t\t<th rowspan="4"><h3>#{hour}</h3>AM</th>\n)
> > > if i==0
> > >           end
> > >           if hour == 12
> > >             cal << %(\t\t\t<th rowspan="4"><h3>#{hour}</h3>PM</th>\n)
> > > if i==0
> > >           end
> > >           if hour > 12
> > >             hour = hour - 12
> > >             cal << %(\t\t\t<th rowspan="4"><h3>#{hour}</h3>PM</th>\n)
> > > if i==0
> > >           end
>
> > >           options[:starts_at].upto(options[:ends_at]) do |d|
> > >             the_minutes = minutes
> > >             print_start_minutes = the_minutes.to_s.ljust(2, '0')
> > >             starts_attime_string = %
> > > (#{d.to_s(:db)}T#{print_hour}:#{print_start_minutes}:00-06:00)
> > >             starts_attime =
> > > DateTime.parse(starts_attime_string).to_datetime
> > >             ends_attime = (starts_attime +
> > > duration.minutes).to_datetime
> > >             range = (starts_attime...ends_attime)
>
> > >             # cell_attrs should return a hash.
> > >             cell_text, cell_attrs = block.call(range)
> > >             cell_text ||= ""
> > >             cell_attrs ||= {}
> > >             cell_attrs[:class] = cell_attrs[:class].to_s + " today" if
> > > Date.today == d
> > >             cell_attrs = cell_attrs.map {|k, v| %
> > > (#{k}="#{v}") }.join(" ")
>
> > >             cal << "\t\t\t<td #{cell_attrs}>\n#{cell_text}&nbsp;\t\t
> > > \t</td>\n"
> > >           end
> > >           minutes += duration
> > >           cal << %(\t\t</tr>)
> > >         end
> > >       end
> > >       cal << "\n\t</tbody>\n</table>\n"
> > >       cal << "<br/>\n"
> > >       cal << %(#{hour})
>
> > >     end
>
> > >     private
> > >  end
>
> > > WKLY_CAL_CONTROLLER.RB:
> > > class WklyCalController < ApplicationController
>
> > >   def index
> > >     @lessons = Lesson.find(:all)
> > >   end
> > > end
>
> > > INDEX.HTML.ERB (WKLY_CAL)
> > > <h1>Weekly Calendar</h1>
> > > <% for lesson in @lessons %><%end%>
> > > <%= week_view  :starts_at => (Date.today - 2), :ends_at => (Date.today
> > > + 2), :url => wkly_cal_path do |range|
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to