diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 8a56bca9..9c2fd4d1 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -14,6 +14,9 @@ //= require jquery_ujs //= require twitter/bootstrap/bootstrap-tooltip //= require twitter/bootstrap/bootstrap-popover +//= require twitter/bootstrap/bootstrap-modal +//= require twitter/bootstrap/bootstrap-tab +//= require twitter/bootstrap/bootstrap-button //= require mousetrap // Stuff in vendor/assets diff --git a/app/assets/javascripts/tracks.js.coffee.erb b/app/assets/javascripts/tracks.js.coffee.erb index daf6674f..67a0e202 100644 --- a/app/assets/javascripts/tracks.js.coffee.erb +++ b/app/assets/javascripts/tracks.js.coffee.erb @@ -75,12 +75,15 @@ TracksApp = selectTodo: (new_todo) -> selected_item = $("div.todo-item.selected-item") - selected_item.find("div.todo-sub-menu").addClass("hide") - selected_item.find("span.todo-item-detail").addClass("hide") - selected_item.removeClass("selected-item") - TracksApp.appendTodoSubMenu(new_todo) - new_todo.find("span.todo-item-detail").removeClass("hide") - new_todo.addClass("selected-item") + # do nothing if the new_todo is already selected + unless new_todo.attr("id") == selected_item.attr("id") + selected_item.find("div.todo-sub-menu").addClass("hide") + selected_item.find("span.todo-item-detail").addClass("hide") + TracksApp.noteOfTodo(selected_item).addClass("hide") + selected_item.removeClass("selected-item") + TracksApp.appendTodoSubMenu(new_todo) + new_todo.find("span.todo-item-detail").removeClass("hide") + new_todo.addClass("selected-item") selectPrevNext: (go_next) -> current = prev = next = null @@ -111,16 +114,16 @@ TracksApp = unless TracksApp.selectPrevNext(false)? TracksApp.selectTodo($("div.todo-item").first()) + noteOfTodo: (todo) -> + notes_id = todo.find("i.icon-book").attr("data-note-id") + $("div#" + notes_id ) + + toggleNoteOfTodo: (todo) -> + TracksApp.noteOfTodo(todo).toggleClass("hide") + toggleNoteOfSelectedTodo: -> selected_item = $("div.todo-item.selected-item") - notes_id = selected_item.find("i.icon-book").attr("data-note-id") - notes_div = $("div#" + notes_id ) - notes_div.toggleClass("hide") - - toggleNoteOfTodo: (node) -> - todo_item = $(this).parent().parent().parent().parent().parent() - TracksApp.selectTodo(todo_item) - TracksApp.toggleNoteOfSelectedTodo() + TracksApp.toggleNoteOfTodo(selected_item) refresh_page: -> location.reload(true) @@ -142,12 +145,12 @@ root = exports ? this root.TracksApp = TracksApp $ -> - $("a#menu-keyboard-shotcuts").click -> $('div#tracks-shortcuts-dialog').modal() - $("a.button-add-todo").click -> TracksApp.add_todo() - $("a.button-home").click -> TracksApp.go_home() - $("a.button-goto").click -> TracksApp.go_menu() - $("i.icon-book").click -> TracksApp.toggleNoteOfTodo( $(this) ) - $("span.todo-item-description-container").click -> TracksApp.selectTodo( $(this).parent().parent().parent() ) + $("a#menu-keyboard-shotcuts").click -> $('div#tracks-shortcuts-dialog').modal() + $("a.button-add-todo").click -> TracksApp.add_todo() + $("a.button-home").click -> TracksApp.go_home() + $("a.button-goto").click -> TracksApp.go_menu() + $("span.todo-description-icons i.icon-book").click -> TracksApp.toggleNoteOfTodo( $(this).parent().parent().parent().parent().parent() ) + $("span.todo-item-description-container").click -> TracksApp.selectTodo( $(this).parent().parent().parent() ) autocompleteDataset = new Dataset limit: 7 @@ -174,4 +177,12 @@ $ -> form.attr("action", base_url + base_id) form.submit() - $('a[rel="tracks-popover"]').popover() \ No newline at end of file + $('a[rel="tracks-popover"]').popover() + + $('div.project-description button.close').on "click", -> + $(this).parent().addClass("hide") + $("a.tracks-badge-description").removeClass("hide") + + $("a.tracks-badge-description").on "click", -> + $("div.project-description").removeClass("hide") + $(this).addClass("hide") diff --git a/app/assets/stylesheets/tracks.css.scss b/app/assets/stylesheets/tracks.css.scss index 247bc090..8960ddcb 100644 --- a/app/assets/stylesheets/tracks.css.scss +++ b/app/assets/stylesheets/tracks.css.scss @@ -164,6 +164,30 @@ div.todos-container { } } +/* Project */ + +div.project-details { + font-style: italic; +} + +div.project-description { + margin-top: 10px; + margin-bottom: 20px; +} + +h3.project-name-container { + margin: 15px 0 0 0; + line-height: 25px; +} + +div.project-badges { +} + +div#project-next-prev { + margin: 0 0 0 0; + text-align: center; +} + /* Dialogs */ .modal-body { diff --git a/app/controllers/contexts_controller.rb b/app/controllers/contexts_controller.rb index 3d0725c3..e14996c2 100644 --- a/app/controllers/contexts_controller.rb +++ b/app/controllers/contexts_controller.rb @@ -45,6 +45,8 @@ class ContextsController < ApplicationController @done = @context.todos.completed.limit(@max_completed).reorder("todos.completed_at DESC, todos.created_at DESC").includes(Todo::DEFAULT_INCLUDES) @not_done_todos = @context.todos.active.reorder("todos.due IS NULL, todos.due ASC, todos.created_at ASC").includes(Todo::DEFAULT_INCLUDES) @todos_without_project = @not_done_todos.select{|t| t.project.nil?} + @last_updated_todo_without_project = @todos_without_project + .inject(@todos_without_project.first){ |last, todo| todo.updated_at > last.updated_at ? todo : last } @deferred_todos = @context.todos.deferred.includes(Todo::DEFAULT_INCLUDES) @pending_todos = @context.todos.pending.includes(Todo::DEFAULT_INCLUDES) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index a6be59de..5b41d62a 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -8,13 +8,40 @@ module ProjectsHelper end end + def project_details(project) + + state = { + "complete" => "projects.was_marked_complete", + "hidden" => "projects.was_marked_hidden", + "active" => "projects.is_active"} + + default_context = project.default_context.nil? ? + t('projects.with_no_default_context') : + t('projects.with_default_context', :context_name => project.default_context.name) + + tags = project.default_tags.blank? ? t('projects.with_no_default_tags') : t('projects.with_default_tags', :tags => project.default_tags) + + created_at = format_date(project.created_at) + modified_at = format_date(project.updated_at) + + "#{t('projects.this_project')} #{t(state[project.state])} #{default_context} #{tags}." + + "#{t('projects.this_project')} was created at #{created_at} and last modified at #{modified_at}" + end + def project_next_prev - content_tag(:div, :id=>"project-next-prev") do - html = "" - html << link_to_project(@previous_project, "« #{@previous_project.shortened_name}".html_safe) if @previous_project - html << " | " if @previous_project && @next_project - html << link_to_project(@next_project, "#{@next_project.shortened_name} »".html_safe) if @next_project - html.html_safe + content_tag(:div, {class: "pagination", id: "project-next-prev"}) do + content_tag(:small) do + content_tag(:ul) do + html = "" + html << content_tag(:li) do + link_to_project(@previous_project, "« #{@previous_project.shortened_name}".html_safe) + end if @previous_project + html << content_tag(:li) do + link_to_project(@next_project, "#{@next_project.shortened_name} »".html_safe) + end if @next_project + html.html_safe + end + end end end diff --git a/app/views/contexts/show.html.erb b/app/views/contexts/show.html.erb index 2ca233e1..c1f5244a 100644 --- a/app/views/contexts/show.html.erb +++ b/app/views/contexts/show.html.erb @@ -8,16 +8,24 @@ show_empty_containers = (@group_view_by == 'context') -%> -<% cache("not_done_context", @not_done_todos.empty?) do -%> +<% cache ["not_done_context", @not_done_todos.empty?] do -%> <%= render partial: "todos/empty_message_container", locals: {:show => @not_done_todos.empty?, :container_name => "not_done"} %> <% end -%> <%= show_grouped_todos({:collapsible => false, :show_empty_containers => show_empty_containers, :parent_container_type => 'context'}) %> -<% if @group_view_by == 'project' -%> - <%= show_todos_without_project(@todos_without_project, {:collapsible => false, :parent_container_type => 'context', :title_param => @context.name}) -%> +<% if @group_view_by == 'project' + cache [@last_updated_todo_without_project, @context, "todos_without_project"] do -%> + <%= show_todos_without_project(@todos_without_project, + {:collapsible => false, :parent_container_type => 'context', :title_param => @context.name}) -%> + <% end -%> <% end -%> -<%= show_deferred_pending_todos(@deferred_todos, @pending_todos, deferred_pending_options) %> +<% cache [@context, "deferred_pending"] do -%> + <%= show_deferred_pending_todos(@deferred_todos, @pending_todos, deferred_pending_options) %> +<% end -%> -<%= show_done_todos(@done, done_todo_options) unless @done.nil? %> \ No newline at end of file +<% # use the first completed todo (which is the last one to be completed) as cache invariant + cache [@context, @done.first, "context_completed"] do -%> + <%= show_done_todos(@done, done_todo_options) unless @done.nil? %> +<% end -%> \ No newline at end of file diff --git a/app/views/projects/_project_settings.html.erb b/app/views/projects/_project_settings.html.erb deleted file mode 100644 index befc8cbc..00000000 --- a/app/views/projects/_project_settings.html.erb +++ /dev/null @@ -1,26 +0,0 @@ -<% project = project_settings -%> -