Class: EventCalendar
- Inherits:
-
Object
- Object
- EventCalendar
- Extended by:
- ActiveSupport::Memoizable
- Defined in:
- lib/event_calendar.rb,
lib/event_calendar/week.rb,
lib/event_calendar/event.rb
Overview
Generates HTML calendars
Defined Under Namespace
Instance Attribute Summary collapse
-
#events ⇒ Object
Returns the value of attribute events.
-
#month ⇒ Object
readonly
Returns the value of attribute month.
-
#options ⇒ Object
Returns the value of attribute options.
-
#year ⇒ Object
readonly
Returns the value of attribute year.
Class Method Summary collapse
-
.default_options ⇒ Object
The default options used when generating event calendars.
Instance Method Summary collapse
-
#date ⇒ Object
Returns a date object representing the first day of this EventCalendar instance's specified year and month.
-
#evaluate_date_format_option(option, *args) ⇒ Object
Looks up the specified option representing a date format and returns the evaluated the result.
-
#initialize(year = Time.now.year, month = Time.now.month, options = {}) {|_self| ... } ⇒ EventCalendar
constructor
Optionally accepts a year as the first argument, a month (integer) as the second argument, and a hash of options as the third argument.
-
#method_missing(method, *args) ⇒ Object
Allows you to read and write options using method notation.
-
#to_s ⇒ Object
(also: #to_html)
Returns the HTML representation of this EventCalendar.
-
#weeks ⇒ Object
Returns an array of week objects which contain date objects for every day that this calendar displays.
Constructor Details
#initialize(year = Time.now.year, month = Time.now.month, options = {}) {|_self| ... } ⇒ EventCalendar
Optionally accepts a year as the first argument, a month (integer) as the second argument, and a hash of options as the third argument. It also accepts a block which it passes itself to.
For example:
@event_calendar = EventCalendar.new
@event_calendar = EventCalendar.new(2009, 10, :id => 'calendar', :events => Event.all)
@event_calendar = EventCalendar.new(2009, 10) do |c|
c.id = 'calendar'
c.events = Event.all
end
82 83 84 85 86 |
# File 'lib/event_calendar.rb', line 82 def initialize(year = Time.now.year, month = Time.now.month, = {}) @year, @month, self. = year, month, self.class..merge() @events = self..delete(:events).collect { |event| Event.new(event, self.) }.sort_by(&:start) yield self if block_given? end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args) ⇒ Object
Allows you to read and write options using method notation.
For example:
@event_calendar = EventCalendar.new(2009, 10)
@event_calendar.template = '/path/to/some/other/template.mab'
puts @event_calendar.beginning_of_week
132 133 134 135 136 137 138 139 |
# File 'lib/event_calendar.rb', line 132 def method_missing(method, *args) if method.to_s =~ /^([^=]+)(=?)$/ && .has_key?($1.to_sym) [$1.to_sym] = args.first unless $2.empty? [$1.to_sym] else super end end |
Instance Attribute Details
#events ⇒ Object
Returns the value of attribute events.
17 18 19 |
# File 'lib/event_calendar.rb', line 17 def events @events end |
#month ⇒ Object (readonly)
Returns the value of attribute month.
18 19 20 |
# File 'lib/event_calendar.rb', line 18 def month @month end |
#options ⇒ Object
Returns the value of attribute options.
17 18 19 |
# File 'lib/event_calendar.rb', line 17 def @options end |
#year ⇒ Object (readonly)
Returns the value of attribute year.
18 19 20 |
# File 'lib/event_calendar.rb', line 18 def year @year end |
Class Method Details
.default_options ⇒ Object
The default options used when generating event calendars
:id => The HTML id of the generated container div for this event calendar. Defaults to 'event_calendar'.
:beginning_of_week => The day number to use as the beginning of the week. For example, 0 is for Sunday, 1 is for Monday, etc.
Defaults to 0.
:day_label * => The label to use for each day. Defaults to the day number.
:event_class ** => The HTML class to add to each event. Defaults to nil.
:event_id ** => The id (object_id or database id) of an event. Defaults to :id.
:event_title ** => The title of an event. Defaults to :title.
:event_start ** => The start date or datetime of an event. Defaults to :starts_at.
:event_end ** => The end date or datetime of an event. Defaults to :ends_at.
:event_url ** => The url of an event to use as the HTML href attribute. Defaults to '#'.
:event_output ** => The HTML to output for an event. Defaults to a link to the :event_url using the :event_title
as its label and title attributes.
:event_fields ** => The event fields to output as hidden attributes into the calendar so that they can be accessed with
javascript. Defaults to [:id, :title, :start, :end].
:events => An array of events to display in the calendar. Defaults to [].
:header_label * => The label to use as the header of the calendar. Defaults to the month name and year like 'October 2009'.
:header_day_label * => The label to use as the header of each day. Defaults to the abbreviated day name like 'Thu'.
:navigation_label * => The label to use as the inner HTML for the navigation links. Defaults to the full month name like 'November'.
:navigation_url => A proc which returns the url to use as the HTML href attribute for the previous and next month links.
This proc is passed a date object representing the first day of the previous or next months. Defaults to '#'.
:template => A path to the Markaby template file to use when rendering the calendar. Defaults to the 'event_calendar/template.mab'
file found in this directory.
- See the EventCalendar.evaluate_date_format_option method for possible values. ** See the Event#evaluate_option method for possible values.
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/event_calendar.rb', line 47 def self. @default_options ||= { :id => 'event_calendar', :beginning_of_week => 0, :day_label => proc { |date| date.strftime('%d').gsub(/^0/, '') }, :event_class => nil, :event_id => :id, :event_title => :title, :event_start => :starts_at, :event_end => :ends_at, :event_url => '#', :event_output => proc { |event| "<a href=\"#{event.url}\" title=\"#{event.title}\">#{event.title}</a>" }, :event_fields => [:id, :title, :start, :end], :events => [], :header_label => '%B %Y', :header_day_label => '%a', :navigation_label => '%B', :navigation_url => proc { |date| '#' }, :template => File.join(File.dirname(__FILE__), 'event_calendar', 'template.mab') } end |
Instance Method Details
#date ⇒ Object
Returns a date object representing the first day of this EventCalendar instance's specified year and month.
89 90 91 |
# File 'lib/event_calendar.rb', line 89 def date Date.civil(year, month, 1) end |
#evaluate_date_format_option(option, *args) ⇒ Object
Looks up the specified option representing a date format and returns the evaluated the result.
This is used inside the Markaby template. For example, we have an option :header_label which represents the content at the top of the calendar that outputs the month name and year by default, like "October 2009".
Inside the template, we call event_calendar.evaluate_date_format_option(:header_label, event_calendar.date).
If options is a string, it takes event_calendar.date and calls strftime(options) on it.
If it's a symbol, it takes event_calendar.date and calls send(options) on it.
If it's a proc, it calls the proc and passes event_calendar.date to it. You can pass any number of args to this method and they'll passed to the proc.
Any other value for options is simply returned.
111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/event_calendar.rb', line 111 def evaluate_date_format_option(option, *args) value = self.send(option) case value when String args.first.strftime(value) when Symbol args.first.send(value) when Proc value.call(*args) else value end end |
#to_s ⇒ Object Also known as: to_html
Returns the HTML representation of this EventCalendar.
aliased as to_html
144 145 146 |
# File 'lib/event_calendar.rb', line 144 def to_s render end |
#weeks ⇒ Object
Returns an array of week objects which contain date objects for every day that this calendar displays. It may contain a few days from the previous and next months.
The EventCalendar::Week class inherits from Array.
For example:
puts EventCalendar.new(2009, 10).weeks.inspect
# [
# [Sun, 27 Sep 2009, Mon, 28 Sep 2009, Tue, 29 Sep 2009, Wed, 30 Sep 2009, Thu, 01 Oct 2009, Fri, 02 Oct 2009, Sat, 03 Oct 2009],
# [Sun, 04 Oct 2009, Mon, 05 Oct 2009, Tue, 06 Oct 2009, Wed, 07 Oct 2009, Thu, 08 Oct 2009, Fri, 09 Oct 2009, Sat, 10 Oct 2009],
# [Sun, 11 Oct 2009, Mon, 12 Oct 2009, Tue, 13 Oct 2009, Wed, 14 Oct 2009, Thu, 15 Oct 2009, Fri, 16 Oct 2009, Sat, 17 Oct 2009],
# [Sun, 18 Oct 2009, Mon, 19 Oct 2009, Tue, 20 Oct 2009, Wed, 21 Oct 2009, Thu, 22 Oct 2009, Fri, 23 Oct 2009, Sat, 24 Oct 2009],
# [Sun, 25 Oct 2009, Mon, 26 Oct 2009, Tue, 27 Oct 2009, Wed, 28 Oct 2009, Thu, 29 Oct 2009, Fri, 30 Oct 2009, Sat, 31 Oct 2009]
# ]
165 166 167 168 169 170 |
# File 'lib/event_calendar.rb', line 165 def weeks days_in_month = Time.days_in_month(month, year) starting_day = date.beginning_of_week() -1.day + beginning_of_week.days ending_day = (date + days_in_month).end_of_week() -1.day + beginning_of_week.days (starting_day..ending_day).to_a.in_groups_of(7).collect { |week| Week.new(week, events) } end |