2009-02-05 21:55:33 +01:00
|
|
|
class RecurringTodosController < ApplicationController
|
|
|
|
|
|
|
|
helper :todos, :recurring_todos
|
|
|
|
|
2010-03-06 15:42:20 -05:00
|
|
|
append_before_filter :init, :only => [:index, :new, :edit, :create]
|
2014-02-03 11:10:06 +01:00
|
|
|
append_before_filter :get_recurring_todo_from_param, :only => [:destroy, :toggle_check, :toggle_star, :edit, :update]
|
2009-02-05 21:55:33 +01:00
|
|
|
|
|
|
|
def index
|
2010-12-03 17:52:24 +01:00
|
|
|
@page_title = t('todos.recurring_actions_title')
|
2011-06-21 11:03:23 +02:00
|
|
|
@source_view = params['_source_view'] || 'recurring_todo'
|
2010-12-03 17:52:24 +01:00
|
|
|
find_and_inactivate
|
2012-04-18 14:22:58 +02:00
|
|
|
@recurring_todos = current_user.recurring_todos.active.includes(:tags, :taggings)
|
|
|
|
@completed_recurring_todos = current_user.recurring_todos.completed.limit(10).includes(:tags, :taggings)
|
2010-12-03 17:52:24 +01:00
|
|
|
|
2012-04-18 14:22:58 +02:00
|
|
|
@no_recurring_todos = @recurring_todos.count == 0
|
|
|
|
@no_completed_recurring_todos = @completed_recurring_todos.count == 0
|
|
|
|
@count = @recurring_todos.count
|
2010-12-03 17:52:24 +01:00
|
|
|
|
|
|
|
@new_recurring_todo = RecurringTodo.new
|
2009-02-05 21:55:33 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def new
|
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
def show
|
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2011-06-20 06:50:25 +02:00
|
|
|
def done
|
|
|
|
@page_title = t('todos.completed_recurring_actions_title')
|
2011-06-21 11:03:23 +02:00
|
|
|
@source_view = params['_source_view'] || 'recurring_todo'
|
2011-06-20 06:50:25 +02:00
|
|
|
items_per_page = 20
|
2011-11-17 17:07:55 +01:00
|
|
|
page = params[:page] || 1
|
2011-06-20 06:50:25 +02:00
|
|
|
@completed_recurring_todos = current_user.recurring_todos.completed.paginate :page => params[:page], :per_page => items_per_page
|
|
|
|
@total = @count = current_user.recurring_todos.completed.count
|
|
|
|
@range_low = (page.to_i-1) * items_per_page + 1
|
|
|
|
@range_high = @range_low + @completed_recurring_todos.size - 1
|
|
|
|
end
|
2009-02-05 21:55:33 +01:00
|
|
|
|
|
|
|
def edit
|
2014-02-10 11:45:25 +01:00
|
|
|
@form_helper = RecurringTodos::FormHelper.new(@recurring_todo)
|
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
respond_to do |format|
|
|
|
|
format.js
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def update
|
2014-02-10 11:45:25 +01:00
|
|
|
updater = RecurringTodos::RecurringTodosBuilder.new(current_user, update_recurring_todo_params)
|
2014-02-03 10:48:21 +01:00
|
|
|
@saved = updater.update(@recurring_todo)
|
2014-02-03 11:10:06 +01:00
|
|
|
|
2014-02-03 10:48:21 +01:00
|
|
|
@recurring_todo.reload
|
2009-02-05 21:55:33 +01:00
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.js
|
|
|
|
end
|
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
def create
|
2014-01-27 16:42:54 +01:00
|
|
|
builder = RecurringTodos::RecurringTodosBuilder.new(current_user, all_recurring_todo_params)
|
|
|
|
@saved = builder.save
|
2009-02-05 21:55:33 +01:00
|
|
|
|
2010-12-03 17:52:24 +01:00
|
|
|
if @saved
|
2014-02-03 10:48:21 +01:00
|
|
|
@recurring_todo = builder.saved_recurring_todo
|
2014-02-03 11:10:06 +01:00
|
|
|
todo_saved = TodoFromRecurringTodo.new(current_user, @recurring_todo).create.nil? == false
|
2014-02-03 10:48:21 +01:00
|
|
|
|
2014-08-14 21:05:05 -05:00
|
|
|
@status_message =
|
|
|
|
t('todos.recurring_action_saved') + " / " +
|
2014-02-03 11:10:06 +01:00
|
|
|
t("todos.new_related_todo_#{todo_saved ? "" : "not_"}created_short")
|
2014-02-03 10:48:21 +01:00
|
|
|
|
2010-12-03 17:52:24 +01:00
|
|
|
@down_count = current_user.recurring_todos.active.count
|
|
|
|
@new_recurring_todo = RecurringTodo.new
|
2009-02-05 21:55:33 +01:00
|
|
|
else
|
2014-06-19 01:17:15 -04:00
|
|
|
@recurring_todo = builder.recurring_todo
|
2011-03-10 13:08:53 +01:00
|
|
|
@status_message = t('todos.error_saving_recurring')
|
2011-11-17 17:07:55 +01:00
|
|
|
end
|
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
respond_to do |format|
|
2011-11-17 17:07:55 +01:00
|
|
|
format.js
|
2009-02-05 21:55:33 +01:00
|
|
|
end
|
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
def destroy
|
2014-02-07 22:55:52 +01:00
|
|
|
@number_of_todos = @recurring_todo.todos.count
|
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
# remove all references to this recurring todo
|
2014-02-07 22:55:52 +01:00
|
|
|
@recurring_todo.clear_todos_association
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
# delete the recurring todo
|
|
|
|
@saved = @recurring_todo.destroy
|
2010-12-03 17:52:24 +01:00
|
|
|
|
|
|
|
# count remaining recurring todos
|
|
|
|
@active_remaining = current_user.recurring_todos.active.count
|
|
|
|
@completed_remaining = current_user.recurring_todos.completed.count
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
respond_to do |format|
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
format.html do
|
|
|
|
if @saved
|
2012-04-27 14:22:16 +02:00
|
|
|
notify :notice, t('todos.recurring_deleted_success')
|
2009-02-05 21:55:33 +01:00
|
|
|
else
|
2014-02-03 11:10:06 +01:00
|
|
|
notify :error, t('todos.error_deleting_recurring', :description => @recurring_todo.description)
|
2009-02-05 21:55:33 +01:00
|
|
|
end
|
2014-02-07 22:55:52 +01:00
|
|
|
redirect_to :action => 'index'
|
2009-02-05 21:55:33 +01:00
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
format.js do
|
|
|
|
render
|
2011-11-17 17:07:55 +01:00
|
|
|
end
|
2009-02-05 21:55:33 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def toggle_check
|
|
|
|
@saved = @recurring_todo.toggle_completion!
|
|
|
|
|
2010-12-03 17:52:24 +01:00
|
|
|
@down_count = current_user.recurring_todos.active.count
|
|
|
|
@active_remaining = @down_count
|
|
|
|
@completed_remaining = 0
|
2009-02-05 21:55:33 +01:00
|
|
|
|
|
|
|
if @recurring_todo.active?
|
2010-12-03 17:52:24 +01:00
|
|
|
@completed_remaining = current_user.recurring_todos.completed.count
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
# from completed back to active -> check if there is an active todo
|
|
|
|
@active_todos = @recurring_todo.todos.active.count
|
|
|
|
# create todo if there is no active todo belonging to the activated
|
|
|
|
# recurring_todo
|
2013-04-25 13:50:03 -05:00
|
|
|
@new_recurring_todo = TodoFromRecurringTodo.new(current_user, @recurring_todo).create if @active_todos == 0
|
2009-02-05 21:55:33 +01:00
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
respond_to do |format|
|
2011-11-17 17:07:55 +01:00
|
|
|
format.js
|
2009-02-05 21:55:33 +01:00
|
|
|
end
|
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
def toggle_star
|
|
|
|
@recurring_todo.toggle_star!
|
|
|
|
@saved = @recurring_todo.save!
|
|
|
|
respond_to do |format|
|
|
|
|
format.js
|
|
|
|
end
|
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
private
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2013-05-27 12:44:31 +02:00
|
|
|
def recurring_todo_params
|
|
|
|
params.require(:recurring_todo).permit(
|
|
|
|
# model attributes
|
2014-08-14 21:05:05 -05:00
|
|
|
:context_id, :project_id, :description, :notes, :state, :start_from,
|
|
|
|
:ends_on, :end_date, :number_of_occurences, :occurences_count, :target,
|
|
|
|
:show_from_delta, :recurring_period, :recurrence_selector, :every_other1,
|
|
|
|
:every_other2, :every_other3, :every_day, :only_work_days, :every_count,
|
2014-01-27 16:42:54 +01:00
|
|
|
:weekday, :show_always, :context_name, :project_name, :tag_list,
|
2013-05-27 12:44:31 +02:00
|
|
|
# form attributes
|
2014-08-14 21:05:05 -05:00
|
|
|
:recurring_period, :daily_selector, :monthly_selector, :yearly_selector,
|
|
|
|
:recurring_target, :daily_every_x_days, :monthly_day_of_week,
|
|
|
|
:monthly_every_x_day, :monthly_every_x_month2, :monthly_every_x_month,
|
|
|
|
:monthly_every_xth_day, :recurring_show_days_before,
|
2013-05-27 12:44:31 +02:00
|
|
|
:recurring_show_always, :weekly_every_x_week, :weekly_return_monday,
|
2014-08-14 21:05:05 -05:00
|
|
|
:yearly_day_of_week, :yearly_every_x_day, :yearly_every_xth_day,
|
2013-09-05 20:18:14 +02:00
|
|
|
:yearly_month_of_year2, :yearly_month_of_year,
|
|
|
|
# derived attribues
|
2014-08-14 21:05:05 -05:00
|
|
|
:weekly_return_monday, :weekly_return_tuesday, :weekly_return_wednesday,
|
2013-09-05 20:18:14 +02:00
|
|
|
:weekly_return_thursday, :weekly_return_friday, :weekly_return_saturday, :weekly_return_sunday
|
2013-05-27 12:44:31 +02:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2014-08-14 21:05:05 -05:00
|
|
|
def all_recurring_todo_params
|
2014-01-27 16:42:54 +01:00
|
|
|
# move context_name, project_name and tag_list into :recurring_todo hash for easier processing
|
2014-08-14 21:05:05 -05:00
|
|
|
{
|
|
|
|
context_name: :context_name,
|
|
|
|
project_name: :project_name,
|
2014-02-10 11:45:25 +01:00
|
|
|
tag_list: :tag_list
|
|
|
|
}.each do |target,source|
|
2014-02-03 10:48:21 +01:00
|
|
|
move_into_recurring_todo_param(params, target, source)
|
|
|
|
end
|
2014-01-27 16:42:54 +01:00
|
|
|
recurring_todo_params
|
|
|
|
end
|
|
|
|
|
2014-02-10 11:45:25 +01:00
|
|
|
def update_recurring_todo_params
|
2014-02-03 10:48:21 +01:00
|
|
|
# we needed to rename the recurring_period selector in the edit form because
|
|
|
|
# the form for a new recurring todo and the edit form are on the same page.
|
|
|
|
# Same goes for start_from and end_date
|
|
|
|
params['recurring_todo']['recurring_period'] = params['recurring_edit_todo']['recurring_period']
|
|
|
|
|
2014-08-14 21:05:05 -05:00
|
|
|
{
|
|
|
|
context_name: :context_name,
|
|
|
|
project_name: :project_name,
|
2014-02-03 10:48:21 +01:00
|
|
|
tag_list: :edit_recurring_todo_tag_list,
|
|
|
|
end_date: :recurring_todo_edit_end_date,
|
2014-02-10 11:45:25 +01:00
|
|
|
start_from: :recurring_todo_edit_start_from
|
|
|
|
}.each do |target,source|
|
2014-02-03 10:48:21 +01:00
|
|
|
move_into_recurring_todo_param(params, target, source)
|
2014-08-14 21:05:05 -05:00
|
|
|
end
|
2014-02-03 10:48:21 +01:00
|
|
|
|
|
|
|
# make sure that we set weekly_return_xxx to empty (space) when they are
|
|
|
|
# not checked (and thus not present in params["recurring_todo"])
|
|
|
|
%w{monday tuesday wednesday thursday friday saturday sunday}.each do |day|
|
|
|
|
params["recurring_todo"]["weekly_return_#{day}"]=' ' if params["recurring_todo"]["weekly_return_#{day}"].nil?
|
|
|
|
end
|
2014-02-10 11:45:25 +01:00
|
|
|
|
|
|
|
recurring_todo_params
|
2014-02-03 10:48:21 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def move_into_recurring_todo_param(params, target, source)
|
|
|
|
params[:recurring_todo][target] = params[source] unless params[source].blank?
|
|
|
|
end
|
|
|
|
|
2010-03-06 15:42:20 -05:00
|
|
|
def init
|
2014-02-03 11:10:06 +01:00
|
|
|
@days_of_week = (0..6).map{|i| [t('date.day_names')[i], i] }
|
|
|
|
@months_of_year = (1..12).map{|i| [t('date.month_names')[i], i] }
|
2011-03-10 13:08:53 +01:00
|
|
|
@xth_day = [[t('common.first'),1],[t('common.second'),2],[t('common.third'),3],[t('common.fourth'),4],[t('common.last'),5]]
|
2012-04-18 14:22:58 +02:00
|
|
|
@projects = current_user.projects.includes(:default_context)
|
|
|
|
@contexts = current_user.contexts
|
2009-02-05 21:55:33 +01:00
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-02-05 21:55:33 +01:00
|
|
|
def get_recurring_todo_from_param
|
|
|
|
@recurring_todo = current_user.recurring_todos.find(params[:id])
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_and_inactivate
|
|
|
|
# find active recurring todos without active todos and inactivate them
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2012-04-18 14:22:58 +02:00
|
|
|
current_user.recurring_todos.active.
|
|
|
|
select("recurring_todos.id, recurring_todos.state").
|
|
|
|
joins("LEFT JOIN todos fai_todos ON (recurring_todos.id = fai_todos.recurring_todo_id) AND (NOT fai_todos.state='completed')").
|
|
|
|
where("fai_todos.id IS NULL").
|
|
|
|
each { |rt| current_user.recurring_todos.find(rt.id).toggle_completion! }
|
2009-02-05 21:55:33 +01:00
|
|
|
end
|
2011-11-17 17:07:55 +01:00
|
|
|
|
2009-10-02 15:48:24 -04:00
|
|
|
end
|