From 5d30512e9786ff75bf1dc114d30a4499bd411d0d Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sat, 4 Oct 2008 15:56:22 +0200 Subject: [PATCH] add message when there are no actions in a container and handle state changes --- app/controllers/todos_controller.rb | 81 +++++++++++++++++++++++------ app/views/todos/calendar.html.erb | 17 ++++++ app/views/todos/destroy.js.rjs | 1 + app/views/todos/toggle_check.js.rjs | 3 +- app/views/todos/update.js.rjs | 11 ++++ 5 files changed, 97 insertions(+), 16 deletions(-) diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index beceb67a..091fa85a 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -128,8 +128,10 @@ class TodosController < ApplicationController # Toggles the 'done' status of the action # def toggle_check + @source_view = params['_source_view'] || 'todo' + @original_item_due = @todo.due @saved = @todo.toggle_completion! - + # check if this todo has a related recurring_todo. If so, create next todo check_for_next_todo if @saved @@ -139,6 +141,8 @@ class TodosController < ApplicationController determine_remaining_in_context_count(@todo.context_id) determine_down_count determine_completed_count if @todo.completed? + @original_item_due_id = get_due_id_for_calendar(@original_item_due) + @old_due_empty = is_old_due_empty(@original_item_due_id) end render end @@ -173,6 +177,8 @@ class TodosController < ApplicationController @original_item_project_id = @todo.project_id @original_item_was_deferred = @todo.deferred? @original_item_due = @todo.due + @original_item_due_id = get_due_id_for_calendar(@todo.due) + if params['todo']['project_id'].blank? && !params['project_name'].nil? if params['project_name'] == 'None' project = Project.null_object @@ -225,21 +231,13 @@ class TodosController < ApplicationController @due_date_changed = @original_item_due != @todo.due if @due_date_changed - due_today_date = Time.zone.now - due_this_week_date = Time.zone.now.end_of_week - due_next_week_date = due_this_week_date + 7.days - due_this_month_date = Time.zone.now.end_of_month - if @todo.due <= due_today_date - @new_due_id = "due_today" - elsif @todo.due <= due_this_week_date - @new_due_id = "due_this_week" - elsif @todo.due <= due_next_week_date - @new_due_id = "due_next_week" - elsif @todo.due <= due_this_month_date - @new_due_id = "due_this_month_week" + @old_due_empty = is_old_due_empty(@original_item_due_id) + if @todo.due.nil? + # do not act further on date change when date is changed to nil + @due_date_changed = false else - @new_due_id = "due_after_this_month" - end + @new_due_id = get_due_id_for_calendar(@todo.due) + end end if @context_changed @@ -271,6 +269,7 @@ class TodosController < ApplicationController def destroy @todo = get_todo_from_params + @original_item_due = @todo.due @context_id = @todo.context_id @project_id = @todo.project_id @@ -297,6 +296,8 @@ class TodosController < ApplicationController if source_view_is_one_of(:todo, :deferred) determine_remaining_in_context_count(@context_id) end + @original_item_due_id = get_due_id_for_calendar(@original_item_due) + @old_due_empty = is_old_due_empty(@original_item_due_id) end render end @@ -435,18 +436,23 @@ class TodosController < ApplicationController due_this_month_date = Time.zone.now.end_of_month @due_today = current_user.todos.find(:all, + :include => [:taggings, :tags], :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due <= ?', 'active', 'deferred', due_today_date], :order => "due") @due_this_week = current_user.todos.find(:all, + :include => [:taggings, :tags], :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_today_date, due_this_week_date], :order => "due") @due_next_week = current_user.todos.find(:all, + :include => [:taggings, :tags], :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_this_week_date, due_next_week_date], :order => "due") @due_this_month = current_user.todos.find(:all, + :include => [:taggings, :tags], :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_next_week_date, due_this_month_date], :order => "due") @due_after_this_month = current_user.todos.find(:all, + :include => [:taggings, :tags], :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ?', 'active', 'deferred', due_this_month_date], :order => "due") @@ -773,6 +779,51 @@ class TodosController < ApplicationController end end end + + def get_due_id_for_calendar(due) + due_today_date = Time.zone.now + due_this_week_date = Time.zone.now.end_of_week + due_next_week_date = due_this_week_date + 7.days + due_this_month_date = Time.zone.now.end_of_month + if due <= due_today_date + new_due_id = "due_today" + elsif due <= due_this_week_date + new_due_id = "due_this_week" + elsif due <= due_next_week_date + new_due_id = "due_next_week" + elsif due <= due_this_month_date + new_due_id = "due_this_month" + else + new_due_id = "due_after_this_month" + end + return new_due_id + end + + def is_old_due_empty(id) + due_today_date = Time.zone.now + due_this_week_date = Time.zone.now.end_of_week + due_next_week_date = due_this_week_date + 7.days + due_this_month_date = Time.zone.now.end_of_month + case id + when "due_today" + return 0 == current_user.todos.count(:all, + :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due <= ?', 'active', 'deferred', due_today_date]) + when "due_this_week" + return 0 == current_user.todos.count(:all, + :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_today_date, due_this_week_date]) + when "due_next_week" + return 0 == current_user.todos.count(:all, + :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_this_week_date, due_next_week_date]) + when "due_this_month" + return 0 == current_user.todos.count(:all, + :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_next_week_date, due_this_month_date]) + when "due_after_this_month" + return 0 == current_user.todos.count(:all, + :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ?', 'active', 'deferred', due_this_month_date]) + else + raise Exception.new, "unknown due id for calendar: '#{id}'" + end + end class FindConditionBuilder diff --git a/app/views/todos/calendar.html.erb b/app/views/todos/calendar.html.erb index 29860508..056c0cff 100644 --- a/app/views/todos/calendar.html.erb +++ b/app/views/todos/calendar.html.erb @@ -2,6 +2,9 @@

Due today

+
> + No actions due today +
<%= render :partial => "todos/todo", :collection => @due_today %>
@@ -9,6 +12,9 @@

Due in rest of this week

+
> + No actions due in rest of this week +
<%= render :partial => "todos/todo", :collection => @due_this_week %>
@@ -16,6 +22,9 @@

Due next week

+
> + No actions due in next week +
<%= render :partial => "todos/todo", :collection => @due_next_week %>
@@ -23,6 +32,9 @@

Due in rest of this month

+
> + No actions due in rest of this month +
<%= render :partial => "todos/todo", :collection => @due_this_month %>
@@ -30,6 +42,9 @@

Due next month and later

+
> + No actions due after this month +
<%= render :partial => "todos/todo", :collection => @due_after_this_month %>
@@ -37,9 +52,11 @@
+

<%= link_to('iCal', {:format => 'ics', :token => current_user.token}, :title => "iCal feed" ) %> - Get this calendar in iCal format

diff --git a/app/views/todos/destroy.js.rjs b/app/views/todos/destroy.js.rjs index 7f37f87d..ac1ba3d4 100644 --- a/app/views/todos/destroy.js.rjs +++ b/app/views/todos/destroy.js.rjs @@ -1,5 +1,6 @@ if @saved page[@todo].remove + page.show "empty_"+@original_item_due_id if @old_due_empty page['badge_count'].replace_html @down_count # remove context if empty diff --git a/app/views/todos/toggle_check.js.rjs b/app/views/todos/toggle_check.js.rjs index 1462162a..d862862c 100644 --- a/app/views/todos/toggle_check.js.rjs +++ b/app/views/todos/toggle_check.js.rjs @@ -1,5 +1,6 @@ if @saved page[@todo].remove + page.show "empty_"+@original_item_due_id if @old_due_empty if @todo.completed? # completed todos move from their context to the completed container @@ -26,7 +27,7 @@ if @saved page.notify :notice, "There is no next action after the recurring action you just finished. The recurrence is completed", 6.0 if @new_recurring_todo.nil? end end - + else # todo is activated from completed container page.call "todoItems.ensureVisibleWithEffectAppear", item_container_id(@todo) diff --git a/app/views/todos/update.js.rjs b/app/views/todos/update.js.rjs index a5c8e147..2f263b54 100644 --- a/app/views/todos/update.js.rjs +++ b/app/views/todos/update.js.rjs @@ -104,8 +104,19 @@ if @saved elsif source_view_is :calendar if @due_date_changed page[@todo].remove + page.show "empty_"+@original_item_due_id if @old_due_empty + page.hide "empty_"+@new_due_id page.insert_html :bottom, @new_due_id, :partial => 'todos/todo' page.visual_effect :highlight, dom_id(@todo), :duration => 3 + else + if @todo.due.nil? + # due date removed + page[@todo].remove + page.show "empty_"+@original_item_due_id if @old_due_empty + else + page.replace dom_id(@todo), :partial => 'todos/todo', :locals => { :parent_container_type => parent_container_type } + page.visual_effect :highlight, dom_id(@todo), :duration => 3 + end end else logger.error "unexpected source_view '#{params[:_source_view]}'"