From ead021b7895c1827ab293de58731476dcdb8742d Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Tue, 14 Apr 2015 23:50:50 +0200 Subject: [PATCH 01/12] replace element instead nesting another div inside existing div --- app/views/todos/_update_successful.js.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/todos/_update_successful.js.erb b/app/views/todos/_update_successful.js.erb index 40315920..730b1d58 100644 --- a/app/views/todos/_update_successful.js.erb +++ b/app/views/todos/_update_successful.js.erb @@ -55,7 +55,7 @@ add_to_existing_container: function(next_steps) { <% end -%> }, replace_todo: function(next_steps) { - $('#<%= dom_id(@todo) %>').html(<%=object_name%>.html_for_todo()); + $('#<%= dom_id(@todo) %>').replaceWith(<%=object_name%>.html_for_todo()); next_steps.go(); }, hide_container: function(next_steps) { From 0b00f36c6097537958718b253b7596cc120e140d Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Thu, 16 Apr 2015 23:10:36 +0200 Subject: [PATCH 02/12] sort after creating --- app/assets/javascripts/tracks_pages.js | 16 ++++++++++++++++ app/helpers/todos_helper.rb | 12 ++++++++++++ app/views/todos/_todo.html.erb | 2 +- app/views/todos/create.js.erb | 5 ++++- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/tracks_pages.js b/app/assets/javascripts/tracks_pages.js index fbd5c0e4..754931b0 100644 --- a/app/assets/javascripts/tracks_pages.js +++ b/app/assets/javascripts/tracks_pages.js @@ -193,5 +193,21 @@ var TracksPages = { /* fade flashes and alerts in automatically */ $(".alert").fadeOut(8000); + }, sort_container: function(container) { + function comparator(a, b) { + var contentA = $(a).attr('data-sort') || ''; + var contentB = $(b).attr('data-sort') || ''; + if (contentA > contentB) { + return 1; + } + if (contentB > contentA) { + return -1; + } + return 0; + } + + var unsortedActions = container.children(); + var sortedChildren = unsortedActions.sort(comparator); + container.append(sortedChildren); } }; diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index 1c99fc9b..f54e01e8 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -357,6 +357,18 @@ module TodosHelper text_field_tag name, value, {"size" => 12, "id" => id, "class" => "Date", "autocomplete" => "off"}.update(options.stringify_keys) end + def sort_key(todo) + # actions are sorted using {order("todos.due IS NULL, todos.due ASC, todos.created_at ASC")} + # the JavaScript frontend sorts using unicode/ascii + format = "%Y%m%d%H%M%S%L" + if todo.due? + sort_by_due = todo.due.strftime format + else + sort_by_due = "Z" * 17 # length of format string + end + sort_by_due + todo.created_at.strftime(format) + end + # === helpers for default layout def default_contexts_for_autocomplete diff --git a/app/views/todos/_todo.html.erb b/app/views/todos/_todo.html.erb index 07e8da70..714aee6b 100644 --- a/app/views/todos/_todo.html.erb +++ b/app/views/todos/_todo.html.erb @@ -12,7 +12,7 @@ parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag' # also make different caches per source_view to handle difference in showing [C] and [P] cache [todo, current_user.date.strftime("%Y%m%d"), @source_view, current_user.prefs.verbose_action_descriptors] do %> -
+
<%= remote_star_icon(todo) %> <%= remote_toggle_checkbox(todo) %> diff --git a/app/views/todos/create.js.erb b/app/views/todos/create.js.erb index 2caaa66b..c1a67199 100644 --- a/app/views/todos/create.js.erb +++ b/app/views/todos/create.js.erb @@ -49,7 +49,10 @@ function add_todo_to_existing_container(next_steps) { $('#<%= empty_container_msg_div_id %>').hide(); - $('#<%= item_container_id(@todo) %>_items').append(html_for_new_todo()); + var container = $('#<%= item_container_id(@todo) %>_items'); + container.append(html_for_new_todo()); + TracksPages.sort_container(container); + $('#<%= item_container_id(@todo) %>').slideDown(500, function() { $('#<%= dom_id(@todo) %>').effect('highlight', {}, 2000 ); next_steps.go(); From eb7b1e9ab65186f700162e8353063492ee23235f Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Thu, 16 Apr 2015 23:10:45 +0200 Subject: [PATCH 03/12] sort after editing an action --- app/views/todos/_update_successful.js.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/todos/_update_successful.js.erb b/app/views/todos/_update_successful.js.erb index 730b1d58..a180aa67 100644 --- a/app/views/todos/_update_successful.js.erb +++ b/app/views/todos/_update_successful.js.erb @@ -56,6 +56,7 @@ add_to_existing_container: function(next_steps) { }, replace_todo: function(next_steps) { $('#<%= dom_id(@todo) %>').replaceWith(<%=object_name%>.html_for_todo()); + TracksPages.sort_container($('#<%= item_container_id(@todo) %>_items')); next_steps.go(); }, hide_container: function(next_steps) { From 021d53f3599abd27b11d19f78343c715d03bde8e Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Wed, 15 Apr 2015 22:57:57 +0200 Subject: [PATCH 04/12] sort when a pending todo is activated --- app/views/todos/toggle_check.js.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/todos/toggle_check.js.erb b/app/views/todos/toggle_check.js.erb index 74aa9167..0e4b8cd6 100644 --- a/app/views/todos/toggle_check.js.erb +++ b/app/views/todos/toggle_check.js.erb @@ -64,7 +64,9 @@ var <%= object_name %> = { next_steps.go(); }, add_todo_to_container: function(next_steps) { - $('#<%= item_container_id(@todo) %>_items').append(<%=object_name%>.html_for_todo()); + var container = $('#<%= item_container_id(@todo) %>_items'); + container.append(<%=object_name%>.html_for_todo()); + TracksPages.sort_container(container); <% if should_make_context_visible -%> $('#<%= item_container_id(@todo) %>').slideDown(500, function() { $("#<%= empty_container_msg_div_id %>").slideUp(100); From 00bd19b4ff3c8b3ec2d652c0dd100a95b474c533 Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Wed, 15 Apr 2015 22:58:12 +0200 Subject: [PATCH 05/12] sort when the next instance of a recurring todo is added --- app/views/todos/toggle_check.js.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/todos/toggle_check.js.erb b/app/views/todos/toggle_check.js.erb index 0e4b8cd6..75543a2e 100644 --- a/app/views/todos/toggle_check.js.erb +++ b/app/views/todos/toggle_check.js.erb @@ -84,7 +84,9 @@ var <%= object_name %> = { <% # show new todo if the completed todo was recurring if @todo.from_recurring_todo? unless @new_recurring_todo.nil? || (@new_recurring_todo.deferred? && !source_view_is(:deferred)) -%> - $('#<%= item_container_id(@new_recurring_todo) %>_items').append(<%=object_name%>.html_for_recurring_todo()); + var container = $('#<%= item_container_id(@new_recurring_todo) %>_items'); + conainer.append(<%=object_name%>.html_for_recurring_todo()); + TracksPages.sort_container(container); $('#c<%= @new_recurring_todo.context_id %>').slideDown(500, function() { <%=object_name%>.highlight_updated_recurring_todo(next_steps); }); From 8fd8158840c37cc94ffa3ab840568ecaa0e61837 Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Wed, 15 Apr 2015 23:00:07 +0200 Subject: [PATCH 06/12] sort when a pending successor is activated --- app/views/todos/toggle_check.js.erb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views/todos/toggle_check.js.erb b/app/views/todos/toggle_check.js.erb index 75543a2e..c703fde7 100644 --- a/app/views/todos/toggle_check.js.erb +++ b/app/views/todos/toggle_check.js.erb @@ -127,11 +127,15 @@ var <%= object_name %> = { if source_view_is_one_of(:project,:tag) -%> $('#<%= dom_id(t) %>').slideUp(400, function() { $('#<%= dom_id(t) %>').remove(); - $('#<%= item_container_id(t) %>_items').append("<%= html %>"); + var container = $('#<%= item_container_id(t) %>_items'); + container.append("<%= html %>"); + TracksPages.sort_container(container); <%= "$('#deferred_pending_container-empty-d').show();".html_safe if @remaining_deferred_or_pending_count==0 -%> }); <% else -%> - $('#<%= item_container_id(t) %>_items').append("<%= html%>"); + var container = $('#<%= item_container_id(t) %>_items'); + container.append("<%= html%>"); + TracksPages.sort_container(container); <% end -%> TodoItems.highlight_todo('#<%= dom_id(t)%>'); <% end -%> From 0469a990c5547e00654f431ddbbbfb3ff215ebad Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Wed, 15 Apr 2015 23:02:52 +0200 Subject: [PATCH 07/12] sort when activating pending successors of deleted action --- app/views/todos/destroy.js.erb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views/todos/destroy.js.erb b/app/views/todos/destroy.js.erb index 5848f716..e9f006c4 100644 --- a/app/views/todos/destroy.js.erb +++ b/app/views/todos/destroy.js.erb @@ -75,11 +75,15 @@ function activate_pending_todos() { if source_view_is_one_of(:project,:tag) -%> $('#<%= dom_id(t) %>').fadeOut(400, function() { $('#<%= dom_id(t) %>').remove(); - $('#<%= item_container_id(t) %>_items').append("<%= html %>"); + var container = $('#<%= item_container_id(t) %>_items'); + container.append("<%= html %>"); + TracksPages.sort_container(container); <%= "$('#deferred_pending_container-empty-d').show();".html_safe if @remaining_deferred_or_pending_count==0 -%> }); <% else -%> - $('#<%= item_container_id(t) %>_items').append("<%= html%>"); + var container = $('#<%= item_container_id(t) %>_items'); + container.append("<%= html%>"); + TracksPages.sort_container(container); <% end -%> TodoItems.highlight_todo('#<%= dom_id(t, 'line')%>'); <% end -%> From e451e2ed5e6db7d0445ec98dff91ed5484a4c0fd Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Thu, 16 Apr 2015 22:15:08 +0200 Subject: [PATCH 08/12] sort after adding to existing container --- app/views/todos/_update_successful.js.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/todos/_update_successful.js.erb b/app/views/todos/_update_successful.js.erb index a180aa67..2403adb0 100644 --- a/app/views/todos/_update_successful.js.erb +++ b/app/views/todos/_update_successful.js.erb @@ -29,7 +29,9 @@ remove_todo: function(next_steps) { }); }, add_to_existing_container: function(next_steps) { - $('#<%= item_container_id(@todo) %>_items').append(<%=object_name%>.html_for_todo()); + var container = $('#<%= item_container_id(@todo) %>_items'); + container.append(<%=object_name%>.html_for_todo()); + TracksPages.sort_container(container); <% if source_view_is_one_of(:calendar) -%> next_steps.go(); <% if (@target_context_count==1) || ( (@todo.deferred? || @todo.pending?) && @remaining_deferred_or_pending_count == 1) -%> From 164cee695cab8a4199f44abf3d1fa01e0d828942 Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Thu, 16 Apr 2015 22:15:30 +0200 Subject: [PATCH 09/12] sort after deleting recurring action --- app/views/todos/destroy.js.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/todos/destroy.js.erb b/app/views/todos/destroy.js.erb index e9f006c4..add321c2 100644 --- a/app/views/todos/destroy.js.erb +++ b/app/views/todos/destroy.js.erb @@ -54,7 +54,9 @@ function show_new_todo_if_todo_was_recurring() { <% if @todo.from_recurring_todo? -%> <% unless @new_recurring_todo.nil? || @new_recurring_todo.deferred? -%> TodoItemsContainer.ensureVisibleWithEffectAppear("<%=item_container_id(@new_recurring_todo)%>"); - $('#<%=item_container_id(@new_recurring_todo)%>_items').append(html_for_new_recurring_todo()); + var container = $('#<%=item_container_id(@new_recurring_todo)%>_items'); + container.append(html_for_new_recurring_todo()); + TracksPages.sort_container(container); $('#<%= dom_id(@new_recurring_todo, 'line')%>').effect('highlight', {}, 2000 ); TracksPages.page_inform("<%=t('todos.recurring_action_deleted')%>"); <% else -%> From 32a573d60b641e2320e7dde0b7af3b616e8135b2 Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Thu, 16 Apr 2015 22:47:45 +0200 Subject: [PATCH 10/12] add in list instead of below --- app/views/todos/remove_predecessor.js.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/todos/remove_predecessor.js.erb b/app/views/todos/remove_predecessor.js.erb index 803baa91..ee446684 100644 --- a/app/views/todos/remove_predecessor.js.erb +++ b/app/views/todos/remove_predecessor.js.erb @@ -33,7 +33,7 @@ function update_successor() { $('#c<%= @successor.context_id %>').fadeIn(500, function() {}); $('#no_todos_in_view').slideUp(100); <% end -%> - $('#<%=item_container_id(@successor)%>').append(html_for_new_successor()); + $('#<%=item_container_id(@successor)%>_items').append(html_for_new_successor()); $('#<%= dom_id(@successor, 'line')%>').effect('highlight', {}, 2000 ); <% elsif @successor.deferred? -%> $('#<%= dom_id(@successor)%>').html(html_for_new_successor()); <% From d5b695d73399d0168837825ad9871d0b63de081b Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Thu, 16 Apr 2015 22:55:31 +0200 Subject: [PATCH 11/12] replace instead of nesting div inside div --- app/views/todos/remove_predecessor.js.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/todos/remove_predecessor.js.erb b/app/views/todos/remove_predecessor.js.erb index ee446684..c967ff2b 100644 --- a/app/views/todos/remove_predecessor.js.erb +++ b/app/views/todos/remove_predecessor.js.erb @@ -10,7 +10,7 @@ <% end -%> function replace_updated_predecessor() { - $('#<%= dom_id(@predecessor) %>').html( html_for_predecessor() ); + $('#<%= dom_id(@predecessor) %>').replaceWith( html_for_predecessor() ); } function regenerate_predecessor_family() { From 5c3c2f80b7cb299aa43cfede45429ef01c0ddf17 Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Sun, 10 May 2015 14:09:06 +0200 Subject: [PATCH 12/12] sort when deleting a dependency in the tree --- app/views/todos/remove_predecessor.js.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/todos/remove_predecessor.js.erb b/app/views/todos/remove_predecessor.js.erb index c967ff2b..7733cc99 100644 --- a/app/views/todos/remove_predecessor.js.erb +++ b/app/views/todos/remove_predecessor.js.erb @@ -33,7 +33,9 @@ function update_successor() { $('#c<%= @successor.context_id %>').fadeIn(500, function() {}); $('#no_todos_in_view').slideUp(100); <% end -%> - $('#<%=item_container_id(@successor)%>_items').append(html_for_new_successor()); + var container = $('#<%=item_container_id(@successor)%>_items'); + container.append(html_for_new_successor()); + TracksPages.sort_container(container); $('#<%= dom_id(@successor, 'line')%>').effect('highlight', {}, 2000 ); <% elsif @successor.deferred? -%> $('#<%= dom_id(@successor)%>').html(html_for_new_successor()); <%