diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb
index e456f366..f41046ef 100644
--- a/app/controllers/todos_controller.rb
+++ b/app/controllers/todos_controller.rb
@@ -264,6 +264,8 @@ class TodosController < ApplicationController
@remaining_undone_in_project = current_user.projects.find(@original_item_project_id).not_done_todo_count
end
determine_down_count
+ determine_deferred_tag_count(params['_tag_name']) if @source_view == 'tag'
+
respond_to do |format|
format.js
format.xml { render :xml => @todo.to_xml( :except => :user_id ) }
@@ -435,7 +437,7 @@ class TodosController < ApplicationController
@todo = Todo.find(params[:id])
@todo.show_from = (@todo.show_from || @todo.user.date) + numdays.days
@saved = @todo.save
-
+
determine_down_count
determine_remaining_in_context_count(@todo.context_id)
respond_to do |format|
@@ -693,6 +695,13 @@ class TodosController < ApplicationController
end
end
+ def determine_deferred_tag_count(tag)
+ tag_collection = Tag.find_by_name(tag).todos
+ @deferred_tag_count = tag_collection.count(:all,
+ :conditions => ['todos.user_id = ? and state = ?', current_user.id, 'deferred'],
+ :order => 'show_from ASC, todos.created_at DESC')
+ end
+
def render_todos_html
lambda do
@page_title = "TRACKS::List tasks"
diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb
index 1bf4eb13..3611cc17 100644
--- a/app/helpers/todos_helper.rb
+++ b/app/helpers/todos_helper.rb
@@ -1,287 +1,290 @@
-module TodosHelper
-
- # #require 'users_controller' Counts the number of incomplete items in the
- # specified context
- #
- def count_items(context)
- count = Todo.find_all("done=0 AND context_id=#{context.id}").length
- end
-
- def form_remote_tag_edit_todo( &block )
- form_tag(
- todo_path(@todo), {
- :method => :put,
- :id => dom_id(@todo, 'form'),
- :class => dom_id(@todo, 'form') + " inline-form edit_todo_form" },
- &block )
- apply_behavior 'form.edit_todo_form', make_remote_form(
- :method => :put,
- :before => "this.down('button.positive').startWaiting()",
- :loaded => "this.down('button.positive').stopWaiting()",
- :condition => "!(this.down('button.positive').isWaiting())"),
- :prevent_default => true
- end
-
- def set_behavior_for_delete_icon
- parameters = "_source_view=#{@source_view}"
- parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
- apply_behavior '.item-container a.delete_icon:click', :prevent_default => true do |page|
- page.confirming "'Are you sure that you want to ' + this.title + '?'" do
- page << "itemContainer = this.up('.item-container'); itemContainer.startWaiting();"
- page << remote_to_href(:method => 'delete', :with => "'#{parameters}'", :complete => "itemContainer.stopWaiting();")
- end
- end
- end
-
- def remote_delete_icon
- str = link_to( image_tag_for_delete,
- todo_path(@todo), :id => "delete_icon_"+@todo.id.to_s,
- :class => "icon delete_icon", :title => "delete the action '#{@todo.description}'")
- set_behavior_for_delete_icon
- str
- end
-
- def set_behavior_for_star_icon
- apply_behavior '.item-container a.star_item:click',
- remote_to_href(:method => 'put', :with => "{ _source_view : '#{@source_view}' }"),
- :prevent_default => true
- end
-
- def remote_star_icon
- str = link_to( image_tag_for_star(@todo),
- toggle_star_todo_path(@todo),
- :class => "icon star_item", :title => "star the action '#{@todo.description}'")
- set_behavior_for_star_icon
- str
- end
-
- def set_behavior_for_edit_icon
- parameters = "_source_view=#{@source_view}"
- parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
- apply_behavior '.item-container a.edit_icon:click', :prevent_default => true do |page|
- page << "Effect.Pulsate(this);"
- page << remote_to_href(:method => 'get', :with => "'#{parameters}'")
- end
- end
-
- def remote_edit_icon
- if !@todo.completed?
- str = link_to( image_tag_for_edit(@todo),
- edit_todo_path(@todo),
- :class => "icon edit_icon")
- set_behavior_for_edit_icon
- else
- str = '' + image_tag("blank.png") + " "
- end
- str
- end
-
- def set_behavior_for_toggle_checkbox
- parameters = "_source_view=#{@source_view}"
- parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
- apply_behavior '.item-container input.item-checkbox:click',
- remote_function(:url => javascript_variable('this.value'), :method => 'put',
- :with => "'#{parameters}'")
- end
-
- def remote_toggle_checkbox
- str = check_box_tag('item_id', toggle_check_todo_path(@todo), @todo.completed?, :class => 'item-checkbox')
- set_behavior_for_toggle_checkbox
- str
- end
-
- def date_span
- if @todo.completed?
- "#{format_date( @todo.completed_at )}"
- elsif @todo.deferred?
- show_date( @todo.show_from )
- else
- due_date( @todo.due )
- end
- end
-
- def tag_list_text
- @todo.tags.collect{|t| t.name}.join(', ')
- end
-
- def tag_list
- tags_except_starred = @todo.tags.reject{|t| t.name == Todo::STARRED_TAG_NAME}
- tag_list = tags_except_starred.collect{|t| "" + link_to(t.name, :controller => "todos", :action => "tag", :id => t.name) + ""}.join('')
- "#{tag_list}"
- end
-
- def tag_list_mobile
- tags_except_starred = @todo.tags.reject{|t| t.name == Todo::STARRED_TAG_NAME}
- # removed the link. TODO: add link to mobile view of tagged actions
- tag_list = tags_except_starred.collect{|t|
- "" +
- link_to(t.name, {:action => "tag", :controller => "todos", :id => t.name+".m"}) +
- ""}.join('')
- if tag_list.empty? then "" else "#{tag_list}" end
- end
-
- def deferred_due_date
- if @todo.deferred? && @todo.due
- "(action due on #{format_date(@todo.due)})"
- end
- end
-
- def project_and_context_links(parent_container_type, opts = {})
- str = ''
- if @todo.completed?
- str += @todo.context.name unless opts[:suppress_context]
- should_suppress_project = opts[:suppress_project] || @todo.project.nil?
- str += ", " unless str.blank? || should_suppress_project
- str += @todo.project.name unless should_suppress_project
- str = "(#{str})" unless str.blank?
- else
- if (['project', 'tag', 'stats', 'search'].include?(parent_container_type))
- str << item_link_to_context( @todo )
- end
- if (['context', 'tickler', 'tag', 'stats', 'search'].include?(parent_container_type)) && @todo.project_id
- str << item_link_to_project( @todo )
- end
- end
- return str
- end
-
- # Uses the 'staleness_starts' value from settings.yml (in days) to colour the
- # background of the action appropriately according to the age of the creation
- # date:
- # * l1: created more than 1 x staleness_starts, but < 2 x staleness_starts
- # * l2: created more than 2 x staleness_starts, but < 3 x staleness_starts
- # * l3: created more than 3 x staleness_starts
- #
- def staleness_class(item)
- if item.due || item.completed?
- return ""
- elsif item.created_at < user_time - (prefs.staleness_starts * 3).days
- return " stale_l3"
- elsif item.created_at < user_time - (prefs.staleness_starts * 2).days
- return " stale_l2"
- elsif item.created_at < user_time - (prefs.staleness_starts).days
- return " stale_l1"
- else
- return ""
- end
- end
-
- # Check show_from date in comparison to today's date Flag up date
- # appropriately with a 'traffic light' colour code
- #
- def show_date(d)
- if d == nil
- return ""
- end
-
- days = days_from_today(d)
-
- case days
- # overdue or due very soon! sound the alarm!
- when -1000..-1
- "Scheduled to show " + (days * -1).to_s + " days ago "
- when 0
- "Show Today "
- when 1
- "Show Tomorrow "
- # due 2-7 days away
- when 2..7
- if prefs.due_style == Preference.due_styles[:due_on]
- "Show on " + d.strftime("%A") + " "
- else
- "Show in " + days.to_s + " days "
- end
- # more than a week away - relax
- else
- "Show in " + days.to_s + " days "
- end
- end
-
- def calendar_setup( input_field )
- str = "Calendar.setup({ ifFormat:\"#{prefs.date_format}\""
- str << ",firstDay:#{prefs.week_starts},showOthers:true,range:[2004, 2010]"
- str << ",step:1,inputField:\"" + input_field + "\",cache:true,align:\"TR\" })\n"
- javascript_tag str
- end
-
- def item_container_id (todo)
- if source_view_is :project
- return "p#{todo.project_id}" if todo.active?
- return "tickler" if todo.deferred?
- end
- return "c#{todo.context_id}"
- end
-
- def should_show_new_item
-
- if @todo.project.nil? == false
- # do not show new actions that were added to hidden or completed projects
- # on home page and context page
- return false if source_view_is(:todo) && (@todo.project.hidden? || @todo.project.completed?)
- return false if source_view_is(:context) && (@todo.project.hidden? || @todo.project.completed?)
- end
-
- return true if source_view_is(:deferred) && @todo.deferred?
- return true if source_view_is(:project) && @todo.project.hidden? && @todo.project_hidden?
- return true if source_view_is(:project) && @todo.deferred?
- return true if !source_view_is(:deferred) && @todo.active?
- return false
- end
-
- def parent_container_type
- return 'tickler' if source_view_is :deferred
- return 'project' if source_view_is :project
- return 'stats' if source_view_is :stats
- return 'context'
- end
-
- def empty_container_msg_div_id
- return "tickler-empty-nd" if source_view_is(:project) && @todo.deferred?
- return "p#{@todo.project_id}empty-nd" if source_view_is :project
- return "c#{@todo.context_id}empty-nd"
- end
-
- def project_names_for_autocomplete
- array_or_string_for_javascript( ['None'] + current_user.projects.active.collect{|p| escape_javascript(p.name) } )
- end
-
- def context_names_for_autocomplete
- # #return array_or_string_for_javascript(['Create a new context']) if
- # @contexts.empty?
- array_or_string_for_javascript( current_user.contexts.collect{|c| escape_javascript(c.name) } )
- end
-
- def format_ical_notes(notes)
- split_notes = notes.split(/\n/)
- joined_notes = split_notes.join("\\n")
- end
-
- def formatted_pagination(total)
- s = will_paginate(@todos)
- (s.gsub(/(<\/[^<]+>)/, '\1 ')).chomp(' ')
- end
-
- def date_field_tag(name, id, value = nil, options = {})
- text_field_tag name, value, {"size" => 12, "id" => id, "class" => "Date", "onfocus" => "Calendar.setup", "autocomplete" => "off"}.update(options.stringify_keys)
- end
-
- private
-
- def image_tag_for_delete
- image_tag("blank.png", :title =>"Delete action", :class=>"delete_item")
- end
-
- def image_tag_for_edit(todo)
- image_tag("blank.png", :title =>"Edit action", :class=>"edit_item", :id=> dom_id(todo, 'edit_icon'))
- end
-
- def image_tag_for_star(todo)
- class_str = todo.starred? ? "starred_todo" : "unstarred_todo"
- image_tag("blank.png", :title =>"Star action", :class => class_str)
- end
-
- def defer_link(days)
- link_to_remote image_tag("defer_#{days}.png", :alt => "Defer #{pluralize(days, 'day')}"), :url => {:controller => 'todos', :action => 'defer', :id => @todo.id, :days => days, :_source_view => (@source_view.underscore.gsub(/\s+/,'_') rescue "")}
- end
-
-end
+module TodosHelper
+
+ # #require 'users_controller' Counts the number of incomplete items in the
+ # specified context
+ #
+ def count_items(context)
+ count = Todo.find_all("done=0 AND context_id=#{context.id}").length
+ end
+
+ def form_remote_tag_edit_todo( &block )
+ form_tag(
+ todo_path(@todo), {
+ :method => :put,
+ :id => dom_id(@todo, 'form'),
+ :class => dom_id(@todo, 'form') + " inline-form edit_todo_form" },
+ &block )
+ apply_behavior 'form.edit_todo_form', make_remote_form(
+ :method => :put,
+ :before => "this.down('button.positive').startWaiting()",
+ :loaded => "this.down('button.positive').stopWaiting()",
+ :condition => "!(this.down('button.positive').isWaiting())"),
+ :prevent_default => true
+ end
+
+ def set_behavior_for_delete_icon
+ parameters = "_source_view=#{@source_view}"
+ parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
+ apply_behavior '.item-container a.delete_icon:click', :prevent_default => true do |page|
+ page.confirming "'Are you sure that you want to ' + this.title + '?'" do
+ page << "itemContainer = this.up('.item-container'); itemContainer.startWaiting();"
+ page << remote_to_href(:method => 'delete', :with => "'#{parameters}'", :complete => "itemContainer.stopWaiting();")
+ end
+ end
+ end
+
+ def remote_delete_icon
+ str = link_to( image_tag_for_delete,
+ todo_path(@todo), :id => "delete_icon_"+@todo.id.to_s,
+ :class => "icon delete_icon", :title => "delete the action '#{@todo.description}'")
+ set_behavior_for_delete_icon
+ str
+ end
+
+ def set_behavior_for_star_icon
+ apply_behavior '.item-container a.star_item:click',
+ remote_to_href(:method => 'put', :with => "{ _source_view : '#{@source_view}' }"),
+ :prevent_default => true
+ end
+
+ def remote_star_icon
+ str = link_to( image_tag_for_star(@todo),
+ toggle_star_todo_path(@todo),
+ :class => "icon star_item", :title => "star the action '#{@todo.description}'")
+ set_behavior_for_star_icon
+ str
+ end
+
+ def set_behavior_for_edit_icon
+ parameters = "_source_view=#{@source_view}"
+ parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
+ apply_behavior '.item-container a.edit_icon:click', :prevent_default => true do |page|
+ page << "Effect.Pulsate(this);"
+ page << remote_to_href(:method => 'get', :with => "'#{parameters}'")
+ end
+ end
+
+ def remote_edit_icon
+ if !@todo.completed?
+ str = link_to( image_tag_for_edit(@todo),
+ edit_todo_path(@todo),
+ :class => "icon edit_icon")
+ set_behavior_for_edit_icon
+ else
+ str = '' + image_tag("blank.png") + " "
+ end
+ str
+ end
+
+ def set_behavior_for_toggle_checkbox
+ parameters = "_source_view=#{@source_view}"
+ parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
+ apply_behavior '.item-container input.item-checkbox:click',
+ remote_function(:url => javascript_variable('this.value'), :method => 'put',
+ :with => "'#{parameters}'")
+ end
+
+ def remote_toggle_checkbox
+ str = check_box_tag('item_id', toggle_check_todo_path(@todo), @todo.completed?, :class => 'item-checkbox')
+ set_behavior_for_toggle_checkbox
+ str
+ end
+
+ def date_span
+ if @todo.completed?
+ "#{format_date( @todo.completed_at )}"
+ elsif @todo.deferred?
+ show_date( @todo.show_from )
+ else
+ due_date( @todo.due )
+ end
+ end
+
+ def tag_list_text
+ @todo.tags.collect{|t| t.name}.join(', ')
+ end
+
+ def tag_list
+ tags_except_starred = @todo.tags.reject{|t| t.name == Todo::STARRED_TAG_NAME}
+ tag_list = tags_except_starred.collect{|t| "" + link_to(t.name, :controller => "todos", :action => "tag", :id => t.name) + ""}.join('')
+ "#{tag_list}"
+ end
+
+ def tag_list_mobile
+ tags_except_starred = @todo.tags.reject{|t| t.name == Todo::STARRED_TAG_NAME}
+ # removed the link. TODO: add link to mobile view of tagged actions
+ tag_list = tags_except_starred.collect{|t|
+ "" +
+ link_to(t.name, {:action => "tag", :controller => "todos", :id => t.name+".m"}) +
+ ""}.join('')
+ if tag_list.empty? then "" else "#{tag_list}" end
+ end
+
+ def deferred_due_date
+ if @todo.deferred? && @todo.due
+ "(action due on #{format_date(@todo.due)})"
+ end
+ end
+
+ def project_and_context_links(parent_container_type, opts = {})
+ str = ''
+ if @todo.completed?
+ str += @todo.context.name unless opts[:suppress_context]
+ should_suppress_project = opts[:suppress_project] || @todo.project.nil?
+ str += ", " unless str.blank? || should_suppress_project
+ str += @todo.project.name unless should_suppress_project
+ str = "(#{str})" unless str.blank?
+ else
+ if (['project', 'tag', 'stats', 'search'].include?(parent_container_type))
+ str << item_link_to_context( @todo )
+ end
+ if (['context', 'tickler', 'tag', 'stats', 'search'].include?(parent_container_type)) && @todo.project_id
+ str << item_link_to_project( @todo )
+ end
+ end
+ return str
+ end
+
+ # Uses the 'staleness_starts' value from settings.yml (in days) to colour the
+ # background of the action appropriately according to the age of the creation
+ # date:
+ # * l1: created more than 1 x staleness_starts, but < 2 x staleness_starts
+ # * l2: created more than 2 x staleness_starts, but < 3 x staleness_starts
+ # * l3: created more than 3 x staleness_starts
+ #
+ def staleness_class(item)
+ if item.due || item.completed?
+ return ""
+ elsif item.created_at < user_time - (prefs.staleness_starts * 3).days
+ return " stale_l3"
+ elsif item.created_at < user_time - (prefs.staleness_starts * 2).days
+ return " stale_l2"
+ elsif item.created_at < user_time - (prefs.staleness_starts).days
+ return " stale_l1"
+ else
+ return ""
+ end
+ end
+
+ # Check show_from date in comparison to today's date Flag up date
+ # appropriately with a 'traffic light' colour code
+ #
+ def show_date(d)
+ if d == nil
+ return ""
+ end
+
+ days = days_from_today(d)
+
+ case days
+ # overdue or due very soon! sound the alarm!
+ when -1000..-1
+ "Scheduled to show " + (days * -1).to_s + " days ago "
+ when 0
+ "Show Today "
+ when 1
+ "Show Tomorrow "
+ # due 2-7 days away
+ when 2..7
+ if prefs.due_style == Preference.due_styles[:due_on]
+ "Show on " + d.strftime("%A") + " "
+ else
+ "Show in " + days.to_s + " days "
+ end
+ # more than a week away - relax
+ else
+ "Show in " + days.to_s + " days "
+ end
+ end
+
+ def calendar_setup( input_field )
+ str = "Calendar.setup({ ifFormat:\"#{prefs.date_format}\""
+ str << ",firstDay:#{prefs.week_starts},showOthers:true,range:[2004, 2010]"
+ str << ",step:1,inputField:\"" + input_field + "\",cache:true,align:\"TR\" })\n"
+ javascript_tag str
+ end
+
+ def item_container_id (todo)
+ if source_view_is :project
+ return "p#{todo.project_id}" if todo.active?
+ return "tickler" if todo.deferred?
+ end
+ return "c#{todo.context_id}"
+ end
+
+ def should_show_new_item
+
+ if @todo.project.nil? == false
+ # do not show new actions that were added to hidden or completed projects
+ # on home page and context page
+ return false if source_view_is(:todo) && (@todo.project.hidden? || @todo.project.completed?)
+ return false if source_view_is(:context) && (@todo.project.hidden? || @todo.project.completed?)
+ end
+
+ return true if source_view_is(:deferred) && @todo.deferred?
+ return true if source_view_is(:project) && @todo.project.hidden? && @todo.project_hidden?
+ return true if source_view_is(:project) && @todo.deferred?
+ return true if !source_view_is(:deferred) && @todo.active?
+ return false
+ end
+
+ def parent_container_type
+ return 'tickler' if source_view_is :deferred
+ return 'project' if source_view_is :project
+ return 'stats' if source_view_is :stats
+ return 'context'
+ end
+
+ def empty_container_msg_div_id
+ return "tickler-empty-nd" if source_view_is_one_of(:project, :tag) && @todo.deferred?
+ return "p#{@todo.project_id}empty-nd" if source_view_is :project
+ return "c#{@todo.context_id}empty-nd"
+ end
+
+ def project_names_for_autocomplete
+ array_or_string_for_javascript( ['None'] + current_user.projects.active.collect{|p| escape_javascript(p.name) } )
+ end
+
+ def context_names_for_autocomplete
+ # #return array_or_string_for_javascript(['Create a new context']) if
+ # @contexts.empty?
+ array_or_string_for_javascript( current_user.contexts.collect{|c| escape_javascript(c.name) } )
+ end
+
+ def format_ical_notes(notes)
+ split_notes = notes.split(/\n/)
+ joined_notes = split_notes.join("\\n")
+ end
+
+ def formatted_pagination(total)
+ s = will_paginate(@todos)
+ (s.gsub(/(<\/[^<]+>)/, '\1 ')).chomp(' ')
+ end
+
+ def date_field_tag(name, id, value = nil, options = {})
+ text_field_tag name, value, {"size" => 12, "id" => id, "class" => "Date", "onfocus" => "Calendar.setup", "autocomplete" => "off"}.update(options.stringify_keys)
+ end
+
+ private
+
+ def image_tag_for_delete
+ image_tag("blank.png", :title =>"Delete action", :class=>"delete_item")
+ end
+
+ def image_tag_for_edit(todo)
+ image_tag("blank.png", :title =>"Edit action", :class=>"edit_item", :id=> dom_id(todo, 'edit_icon'))
+ end
+
+ def image_tag_for_star(todo)
+ class_str = todo.starred? ? "starred_todo" : "unstarred_todo"
+ image_tag("blank.png", :title =>"Star action", :class => class_str)
+ end
+
+ def defer_link(days)
+ url = {:controller => 'todos', :action => 'defer', :id => @todo.id, :days => days,
+ :_source_view => (@source_view.underscore.gsub(/\s+/,'_') rescue "")}
+ url[:_tag_name] = @tag_name if @source_view == 'tag'
+ link_to_remote image_tag("defer_#{days}.png", :alt => "Defer #{pluralize(days, 'day')}"), :url => url
+ end
+
+end
diff --git a/app/views/todos/update.js.rjs b/app/views/todos/update.js.rjs
index 60a236e9..e721bdf1 100644
--- a/app/views/todos/update.js.rjs
+++ b/app/views/todos/update.js.rjs
@@ -6,7 +6,8 @@ if @saved
status_message = 'Added new context / ' + status_message if @new_context_created
page.notify :notice, status_message, 5.0
- # update auto completer arrays for edit form in right column, only for pages with that form
+ # update auto completer arrays for edit form in right column, only for pages
+ # with that form
unless source_view_is_one_of(:calendar)
page << "contextAutoCompleter.options.array = #{context_names_for_autocomplete}; contextAutoCompleter.changed = true" if @new_context_created
page << "projectAutoCompleter.options.array = #{project_names_for_autocomplete}; projectAutoCompleter.changed = true" if @new_project_created
@@ -32,7 +33,7 @@ if @saved
end
end
end
-
+
if source_view_is_one_of(:todo, :tag) && @todo.active?
page.call "todoItems.ensureVisibleWithEffectAppear", "c#{@todo.context_id}"
page.call "todoItems.expandNextActionListingByContext", "c#{@todo.context_id}items", true
@@ -40,6 +41,12 @@ if @saved
# show all todos in context
page.insert_html :bottom, "c#{@todo.context_id}items", :partial => 'todos/todo', :locals => { :todo => @todo, :parent_container_type => parent_container_type }
end
+
+ if source_view_is(:tag) && @todo.deferred?
+ # show todo in deferred container
+ page.insert_html :bottom, "tickleritems", :partial => 'todos/todo', :locals => { :todo => @todo, :parent_container_type => parent_container_type }
+ page[empty_container_msg_div_id].hide unless empty_container_msg_div_id.nil?
+ end
# update badge count
page.replace_html("badge_count", @remaining_in_context) if source_view_is :context
@@ -54,9 +61,20 @@ if @saved
end
end
else
- page.replace dom_id(@todo), :partial => 'todos/todo', :locals => { :todo => @todo, :parent_container_type => parent_container_type }
+ if @original_item_was_deferred && source_view_is(:tag)
+ # we go from the deferred container to a context container in tag view
+ page[@todo].remove
+ page.call "todoItems.ensureVisibleWithEffectAppear", "c#{@todo.context_id}"
+ page.call "todoItems.expandNextActionListingByContext", "c#{@todo.context_id}items", true
+ page[empty_container_msg_div_id].hide unless empty_container_msg_div_id.nil?
+ # show all todos in context
+ page.insert_html :bottom, "c#{@todo.context_id}items", :partial => 'todos/todo', :locals => { :todo => @todo, :parent_container_type => parent_container_type }
+ page['tickler-empty-nd'].show if @deferred_tag_count == 0
+ else
+ page.replace dom_id(@todo), :partial => 'todos/todo', :locals => { :todo => @todo, :parent_container_type => parent_container_type }
+ end
page.visual_effect :highlight, dom_id(@todo), :duration => 3
- end
+ end
elsif source_view_is :project
if @project_changed
page[@todo].remove