Skip to content

Commit

Permalink
Monthly scheduler
Browse files Browse the repository at this point in the history
  • Loading branch information
atd committed Dec 19, 2011
1 parent 5199625 commit f52d58c
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 24 deletions.
16 changes: 14 additions & 2 deletions app/assets/javascripts/scheduler.js
Expand Up @@ -14,15 +14,27 @@ Scheduler.form.init = function(form, startDate) {
});

if (startDate) {
var weekDay = (startDate.getDay() + 6) % 7; // monday is 0 in Rails
var weekDayOrder = Math.floor((startDate.getDate() - startDate.getDay() + 6) / 7);
if (weekDayOrder > 3) {
weekDayOrder = -1;
}

// check day of week
dayOfWeek = (startDate.getDay() + 6) % 7; // monday is 0 in Rails
form.find('#event_interval_days_' + dayOfWeek).attr('checked','checked');
form.find('#event_week_days_' + weekDay).attr('checked','checked');

// init day of month
form.find('#event_week_day_order').val(weekDayOrder);
form.find('#event_week_day').val(weekDay);
}
}

Scheduler.form.showFrequency = function(value) {
form = Scheduler.form.current;

form.find("#scheduler-options").children("div").hide();
form.find("#scheduler-options").find("select,input").attr('disabled', 'disabled');

form.find("#scheduler-frequency-" + value ).show();
form.find("#scheduler-frequency-" + value ).find("select,input").removeAttr('disabled');
}
25 changes: 25 additions & 0 deletions app/helpers/scheduler_helper.rb
@@ -0,0 +1,25 @@
module SchedulerHelper
def frequency_options
Scheduler::FREQUENCIES.each_with_index.map{ |value, index|
[ I18n.t("scheduler.frequency.#{ value }.form.option"), index ]
}
end

def week_day_order_options
[1, 2, 3, -1 ].map do |d|
[
t("scheduler.frequency.monthly.form.week_day_order_option.#{ d }"),
d
]
end
end

def week_day_options
7.times.map do |d|
[
l(Date.today.beginning_of_week + d, :format => "%A"),
d
]
end
end
end
14 changes: 9 additions & 5 deletions app/views/scheduler/_form.html.erb
@@ -1,6 +1,6 @@
<div class="scheduler_form">
<%= f.label :frequency %>
<%= f.select :frequency, Scheduler.frequency_options, {}, :class => 'scheduler-frequency' %>
<%= f.select :frequency, frequency_options, {}, :class => 'scheduler-frequency' %>

<div id="scheduler-options">
<div id="scheduler-frequency-0">
Expand All @@ -19,16 +19,20 @@

<div id="scheduler-weekly-days">
<% 7.times do |d| %>
<%= check_box_tag "#{ f.object_name }[interval_days][]",
<%= check_box_tag "#{ f.object_name }[week_days][]",
d,
f.object.interval_days.include?(d),
:id => "event_interval_days_#{ d }" %>
f.object.week_days.include?(d),
:id => "event_week_days_#{ d }" %>
<span><%= I18n.l Date.today.beginning_of_week + d, :format => "%a" %></span>
<% end %>
</div>
</div>

<div id="scheduler-frequency-3">
Comming soon..
<%= raw t('scheduler.frequency.monthly.form.week_day',
:order_field => f.select(:week_day_order, week_day_order_options),
:week_field => f.select(:week_day, week_day_options),
:interval_field => f.number_field(:interval, :size => 1))
%>
</div>
</div>
6 changes: 6 additions & 0 deletions config/locales/es.yml
Expand Up @@ -15,3 +15,9 @@ es:
monthly:
form:
option: "mensual"
week_day: "El %{order_field} %{week_field} de cada %{interval_field} mes(es)"
week_day_order_option:
"1": "primer"
"2": "segundo"
"3": "tercer"
"-1": "último"
1 change: 1 addition & 0 deletions db/migrate/20111204155637_add_scheduler.rb
Expand Up @@ -6,6 +6,7 @@ def up
t.date :start_date
t.date :end_date
t.integer :frequency, :default => 0
t.integer :days, :default => 0
t.integer :interval
t.integer :interval_flag, :default => 0
end
Expand Down
9 changes: 1 addition & 8 deletions lib/scheduler.rb
@@ -1,11 +1,4 @@
module Scheduler
FREQUENCIES = [ :one_off, :daily, :weekly, :monthly ]

class << self
def frequency_options
FREQUENCIES.each_with_index.map{ |value, index|
[ I18n.t("scheduler.frequency.#{ value }.form.option"), index ]
}
end
end
ORDER = [ :first, :second, :third, :last ]
end
52 changes: 43 additions & 9 deletions lib/scheduler/model.rb
Expand Up @@ -12,7 +12,7 @@ module Model
[ :weekly ].include? record.frequency_sym
}

validates_numericality_of :interval_flag,
validates_numericality_of :days,
:greater_than => 0,
:if => lambda { |record|
[ :weekly ].include? record.frequency_sym
Expand All @@ -30,24 +30,51 @@ def frequency_sym
end

# Get [ 0, 1, 6 ] (monday, tuesday, sunday) from byte
def interval_days
def week_days
7.times.map{ |i|
interval_flag[i] > 0 ?
days[i] > 0 ?
i :
nil
}.compact
end

def interval_days_sym
interval_days.map{ |d|
def week_day
week_days.first
end

def week_days_sym
week_days.map{ |d|
Date::DAYS_INTO_WEEK.invert[d]
}
end

def week_day_sym
week_days_sym.first
end

# Convert [ 0, 1, 6 ] (monday, tuesday, sunday) to byte
def interval_days= days
self.interval_flag =
days.map{ |d| 2 ** d.to_i }.inject(0, &:+)
def week_days= ds
self.days =
ds.map{ |d| 2 ** d.to_i }.inject(0, &:+)
end

def week_day= day
self.week_days = Array.wrap(day)
end

def week_day_order
interval_flag
end

def week_day_order_sym
index = interval_flag
index -= 1 if index > 0

Scheduler::ORDER[index]
end

def week_day_order= order
self.interval_flag = order
end

def recurrence
Expand All @@ -57,7 +84,14 @@ def recurrence
:starts => start_date.to_date,
:until => end_date.try(:to_date),
:interval => interval,
:on => interval_days_sym })
:on => week_days_sym })
when :monthly
Recurrence.new({ :every => :month,
:starts => start_date.to_date,
:until => end_date.try(:to_date),
:interval => interval,
:on => week_day_order_sym,
:weekday => week_day_sym })
end
end

Expand Down

0 comments on commit f52d58c

Please sign in to comment.