From b990f8a01520c67aa82a725b57ec221f403b6d84 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sat, 18 Apr 2009 23:50:12 +0200 Subject: [PATCH] make project settings editable from the project page We're using the edit form instead of several separate fields to edit settings --- app/controllers/application.rb | 8 +-- app/controllers/projects_controller.rb | 49 ++++++++--------- app/controllers/todos_controller.rb | 4 +- app/models/project.rb | 16 +++++- app/models/user.rb | 2 + app/views/projects/_project.rhtml | 37 ++++++------- app/views/projects/_project_form.rhtml | 14 ++--- app/views/projects/_project_listing.rhtml | 51 +++++++++--------- app/views/projects/_project_settings.rhtml | 31 +++++++++++ app/views/projects/edit.js.rjs | 9 ++-- app/views/projects/show.html.erb | 63 +--------------------- app/views/projects/update.js.rjs | 32 ++++++----- app/views/todos/_todo.html.erb | 2 +- config/environments/test.rb | 1 + 14 files changed, 150 insertions(+), 169 deletions(-) create mode 100644 app/views/projects/_project_settings.rhtml diff --git a/app/controllers/application.rb b/app/controllers/application.rb index 0d24b1c3..2aea80e1 100644 --- a/app/controllers/application.rb +++ b/app/controllers/application.rb @@ -13,7 +13,7 @@ require 'time' # run because this tag went looking for the taggings table that did not exist # when you feshly create a new database Old comment: We need this in development # mode, or you get 'method missing' errors -# +# # Tag class CannotAccessContext < RuntimeError; end @@ -86,7 +86,7 @@ class ApplicationController < ActionController::Base # Returns a count of next actions in the given context or project The result # is count and a string descriptor, correctly pluralised if there are no # actions or multiple actions - # + # def count_undone_todos_phrase(todos_parent, string="actions") count = count_undone_todos(todos_parent) if count == 1 @@ -110,7 +110,7 @@ class ApplicationController < ActionController::Base # Convert a date object to the format specified in the user's preferences in # config/settings.yml - # + # def format_date(date) if date date_format = prefs.date_format @@ -124,7 +124,7 @@ class ApplicationController < ActionController::Base # Uses RedCloth to transform text using either Textile or Markdown Need to # require redcloth above RedCloth 3.0 or greater is needed to use Markdown, # otherwise it only handles Textile - # + # def markdown(text) RedCloth.new(text).to_html end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 845c15ec..52e3b644 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -9,14 +9,15 @@ class ProjectsController < ApplicationController session :off, :only => :index, :if => Proc.new { |req| ['rss','atom','txt'].include?(req.parameters[:format]) } def index - @projects = current_user.projects(true) + @source_view = params['_source_view'] || 'project_list' + @projects = current_user.projects if params[:projects_and_actions] projects_and_actions else - @contexts = current_user.contexts(true) + @contexts = current_user.contexts init_not_done_counts(['project']) if params[:only_active_with_no_next_actions] - @projects = @projects.select { |p| p.active? && count_undone_todos(p) == 0 } + @projects = current_user.projects.active.select { |p| count_undone_todos(p) == 0 } end init_project_hidden_todo_counts(['project']) respond_to do |format| @@ -31,7 +32,7 @@ class ProjectsController < ApplicationController end def projects_and_actions - @projects = @projects.active + @projects = current_user.projects.active respond_to do |format| format.text { render :action => 'index_text_projects_and_actions', :layout => false, :content_type => Mime::TEXT @@ -40,24 +41,19 @@ class ProjectsController < ApplicationController end def show - @contexts = current_user.contexts(true) - init_data_for_sidebar unless mobile? - @projects = current_user.projects - @contexts = current_user.contexts - @page_title = "TRACKS::Project: #{@project.name}" - @project.todos.send :with_scope, :find => { :include => [:context] } do - @not_done = @project.not_done_todos(:include_project_hidden_todos => true) - @deferred = @project.deferred_todos.sort_by { |todo| todo.show_from } - @done = @project.done_todos - end - @max_completed = current_user.prefs.show_number_completed + init_data_for_sidebar unless mobile? + @page_title = "TRACKS::Project: #{@project.name}" + @not_done = @project.not_done_todos_including_hidden + @deferred = @project.deferred_todos + @done = @project.todos.find_in_state(:all, :completed, :order => "todos.completed_at DESC", :limit => current_user.prefs.show_number_completed, :include => [:context]) + @count = @not_done.size @down_count = @count + @deferred.size @next_project = current_user.projects.next_from(@project) @previous_project = current_user.projects.previous_from(@project) - @default_project_context_name_map = build_default_project_context_name_map(@projects).to_json + @default_project_context_name_map = build_default_project_context_name_map(current_user.projects).to_json respond_to do |format| format.html format.m &render_project_mobile @@ -70,7 +66,7 @@ class ProjectsController < ApplicationController # -u username:password # -d 'new project_name' # http://our.tracks.host/projects - # + # def create if params[:format] == 'application/xml' && params['exception'] render_failure "Expected post format is valid xml like so: project name." @@ -102,7 +98,7 @@ class ProjectsController < ApplicationController end # Edit the details of the project - # + # def update params['project'] ||= {} if params['project']['state'] @@ -121,10 +117,10 @@ class ProjectsController < ApplicationController if boolean_param('wants_render') if (@project.hidden?) @project_project_hidden_todo_counts = Hash.new - @project_project_hidden_todo_counts[@project.id] = @project.reload().not_done_todo_count(:include_project_hidden_todos => true) + @project_project_hidden_todo_counts[@project.id] = @project.reload().not_done_todos_including_hidden.count else @project_not_done_counts = Hash.new - @project_not_done_counts[@project.id] = @project.reload().not_done_todo_count(:include_project_hidden_todos => true) + @project_not_done_counts[@project.id] = @project.reload().not_done_todos_including_hidden.count end @contexts = current_user.contexts @active_projects_count = current_user.projects.active.count @@ -159,7 +155,6 @@ class ProjectsController < ApplicationController end def edit - @contexts = current_user.contexts respond_to do |format| format.js end @@ -205,11 +200,11 @@ class ProjectsController < ApplicationController lambda do @page_title = "TRACKS::List Projects" @count = current_user.projects.size - @active_projects = @projects.active - @hidden_projects = @projects.hidden - @completed_projects = @projects.completed - @no_projects = @projects.empty? - @projects.cache_note_counts + @active_projects = current_user.projects.active + @hidden_projects = current_user.projects.hidden + @completed_projects = current_user.projects.completed + @no_projects = current_user.projects.empty? + current_user.projects.cache_note_counts @new_project = current_user.projects.build render end @@ -297,4 +292,4 @@ class ProjectsController < ApplicationController project_description end -end +end \ No newline at end of file diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index 8442763f..f4a6e527 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -659,8 +659,8 @@ class TodosController < ApplicationController end from.project do unless @todo.project_id == nil - @down_count = current_user.projects.find(@todo.project_id).not_done_todo_count(:include_project_hidden_todos => true) - @deferred_count = current_user.projects.find(@todo.project_id).deferred_todo_count + @down_count = current_user.projects.find(@todo.project_id).not_done_todos_including_hidden.count + @deferred_count = current_user.projects.find(@todo.project_id).deferred_todos.count end end from.deferred do diff --git a/app/models/project.rb b/app/models/project.rb index 4013e985..6458c7b3 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,6 +1,18 @@ class Project < ActiveRecord::Base - has_many :todos, :dependent => :delete_all, :include => :context + has_many :todos, :dependent => :delete_all, :include => [:context,:tags] + has_many :not_done_todos_including_hidden, + :include => [:context,:tags,:project], + :class_name => 'Todo', + :order => "todos.due IS NULL, todos.due ASC, todos.created_at ASC", + :conditions => ["(todos.state = ? OR todos.state = ?)", 'active', 'project_hidden'] + has_many :deferred_todos, + :include => [:context,:tags,:project], + :class_name => 'Todo', + :conditions => ["todos.state = ? ", "deferred"], + :order => "show_from" + has_many :notes, :dependent => :delete_all, :order => "created_at DESC" + belongs_to :default_context, :class_name => "Context", :foreign_key => "default_context_id" belongs_to :user @@ -16,7 +28,7 @@ class Project < ActiveRecord::Base acts_as_list :scope => 'user_id = #{user_id} AND state = \'#{state}\'' acts_as_state_machine :initial => :active, :column => 'state' extend NamePartFinder - include Tracks::TodoList + #include Tracks::TodoList state :active state :hidden, :enter => :hide_todos, :exit => :unhide_todos diff --git a/app/models/user.rb b/app/models/user.rb index 01f4bf0f..ce96c267 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -78,6 +78,8 @@ class User < ActiveRecord::Base has_many :todos, :order => 'todos.completed_at DESC, todos.created_at DESC', :dependent => :delete_all + has_many :project_hidden_todos, + :conditions => ['(state = ? OR state = ?)', 'project_hidden', 'active'] has_many :recurring_todos, :order => 'recurring_todos.completed_at DESC, recurring_todos.created_at DESC', :dependent => :delete_all diff --git a/app/views/projects/_project.rhtml b/app/views/projects/_project.rhtml index aad75cd0..1fc98ef5 100644 --- a/app/views/projects/_project.rhtml +++ b/app/views/projects/_project.rhtml @@ -1,34 +1,27 @@ -<% #@not_done = project.not_done_todos -%> - -
+

- <% if collapsible %> - <%= image_tag("collapse.png") %> - <% end %> - <%= project.name %> - <%= in_place_editor 'project_name_in_place_editor', { - :url => { :controller => 'projects', :action => 'update', :id => project.id, :field => 'name', :update_project_name => true, :escape => false} , - :options=>"{method:'put'}", :script => true} %> + <% if collapsible -%> + <%= image_tag("collapse.png") %> + <% end -%> + <%= project.name -%>

- <% unless project.description.blank? -%> -
<%= sanitize(project.description) %>
- <% end -%> - - <% if project.completed? -%> -

Project has been marked as completed

- <% elsif project.completed? -%> -

Project has been marked as hidden

- <% end -%> +
"> + <%= render :partial => "projects/project_settings", :locals => { :project => project, :collapsible => collapsible } %> +
+
+ +
+

Actions in this project

Currently there are no incomplete actions in this project

<%= render :partial => "todos/todo", :collection => @not_done, :locals => { :parent_container_type => "project" } %> - <% if @not_done.empty? + <% if @not_done.empty? # fix (hack) for #713 set_behavior_for_star_icon set_behavior_for_toggle_checkbox end -%> -
-
+
+ diff --git a/app/views/projects/_project_form.rhtml b/app/views/projects/_project_form.rhtml index 10aa601a..c8926735 100644 --- a/app/views/projects/_project_form.rhtml +++ b/app/views/projects/_project_form.rhtml @@ -1,8 +1,10 @@ <% - project = project_form +project = project_form %> <% form_tag project_path(project), { :id => dom_id(project, 'edit_form'), :class => "inline-form "+dom_id(project, 'edit_form')+"-edit-project-form", :method => :put } do -%> + <%= source_view_tag( @source_view ) -%> +
<%= text_field :project, 'name', :class => 'project-name' %>
@@ -11,7 +13,7 @@
<% ['active', 'hidden', 'completed'].each do | state | %> - <%= radio_button(:project, 'state', state) %> <%= state.titlecase %> + <%= radio_button(:project, 'state', state) %> <%= state.titlecase %> <% end %>

@@ -38,11 +40,9 @@

- <% end -%> +<% end -%> - <%= apply_behavior "."+dom_id(project, 'edit_form')+"-edit-project-form", make_remote_form( :before => "$('"+dom_id(project, 'submit')+"').startWaiting();", - :condition => "!$('"+dom_id(project, 'submit')+"').isWaiting()", - :external => false) %> - + :condition => "!$('"+dom_id(project, 'submit')+"').isWaiting()", + :external => false) %> \ No newline at end of file diff --git a/app/views/projects/_project_listing.rhtml b/app/views/projects/_project_listing.rhtml index f968ddf7..78a176c1 100644 --- a/app/views/projects/_project_listing.rhtml +++ b/app/views/projects/_project_listing.rhtml @@ -1,14 +1,14 @@ <% project = project_listing - suppress_drag_handle ||= false - suppress_edit_button ||= false +suppress_drag_handle ||= false +suppress_edit_button ||= false -%>
" class="list">
<% unless suppress_drag_handle -%>
- DRAG -
- <% end -%> + DRAG +
+ <% end -%>
<%= link_to_project( project ) %><%= " (" + count_undone_todos_and_notes_phrase(project,"actions") + ")" %>
@@ -17,22 +17,25 @@ <%= image_tag( "blank.png", - :title => "Delete project", - :class=>"delete_item") %> - <%= apply_behavior "a.delete_project_button:click", { :prevent_default => true, :external => true } do |page, element| - page.confirming "'Are you sure that you want to ' + this.title + '?'" do - element.up('.project').start_waiting - page << remote_to_href(:method => 'delete') - end - end -%> - <% unless suppress_edit_button -%> - <%= image_tag( "blank.png", :title => "Edit project", :class=>"edit_item") %> - <%= apply_behavior 'a.edit_project_button:click', { :prevent_default => true, :external => true } do |page, element| - element.up('div.project').start_waiting - page << remote_to_href(:method => 'get') - end - -%> - <% end -%> + :title => "Delete project", + :class=>"delete_item") %> + <%= apply_behavior "a.delete_project_button:click", { :prevent_default => true, :external => true } do |page, element| + page.confirming "'Are you sure that you want to ' + this.title + '?'" do + element.up('.project').start_waiting + page << remote_to_href(:method => 'delete') + end + end -%> + <% unless suppress_edit_button -%> + <%= link_to_remote( + image_tag( "blank.png", :title => "Edit project", :class=>"edit_item"), + :url => {:controller => 'projects', :action => 'edit', :id => project.id}, + :method => 'get', + :with => "'_source_view=#{@source_view}'", + :before => "$('#{dom_id(project)}').startWaiting();", + :complete => "$('#{dom_id(project)}').stopWaiting();" + ) %> + + <% end -%>
@@ -40,7 +43,7 @@ <% if controller.action_name == 'create' %> - + <% end %> diff --git a/app/views/projects/_project_settings.rhtml b/app/views/projects/_project_settings.rhtml new file mode 100644 index 00000000..fe7103af --- /dev/null +++ b/app/views/projects/_project_settings.rhtml @@ -0,0 +1,31 @@ +
+ <% unless project.description.blank? -%> +
<%= sanitize(project.description) %>
+ <% end -%> +

This project + <% if project.completed? -%>has been marked as completed + <% elsif project.hidden? -%>has been marked as hidden + <% else -%>is active + <% end -%> + with <% if project.default_context.nil? -%> + no default context + <% else -%> + a default context of <%= project.default_context.name -%> + <% end -%> + and with <% if project.default_tags.nil? || project.default_tags.blank? -%> + no default tags. + <% else -%> + '<%= project.default_tags -%>' as the default tags. + <% end -%> + <%= link_to_remote( + "Edit Project Settings", + :url => {:controller => 'projects', :action => 'edit', :id => project.id}, + :method => 'get', + :with => "'_source_view=#{@source_view}'", + :before => "$('#{dom_id(project)}').startWaiting();", + :complete => "$('#{dom_id(project)}').stopWaiting();" + ) %> +

+
+ \ No newline at end of file diff --git a/app/views/projects/edit.js.rjs b/app/views/projects/edit.js.rjs index 2453bf38..a1a5125c 100644 --- a/app/views/projects/edit.js.rjs +++ b/app/views/projects/edit.js.rjs @@ -1,5 +1,4 @@ -page[dom_id(@project, 'edit')].replace_html :partial => 'project_form', :locals => { :project_form => @project } -page[@project].hide -page[@project].stop_waiting -page[dom_id(@project, 'edit')].show -page[dom_id(@project, 'edit_form')].down('input.project-name').focus +page[dom_id(@project, 'edit')].replace_html :partial => 'project_form', :locals => { :project_form => @project } +page[@project].hide +page[dom_id(@project, 'edit')].show +page[dom_id(@project, 'edit_form')].down('input.project-name').focus \ No newline at end of file diff --git a/app/views/projects/show.html.erb b/app/views/projects/show.html.erb index 94f8a468..f68a46a4 100644 --- a/app/views/projects/show.html.erb +++ b/app/views/projects/show.html.erb @@ -21,7 +21,6 @@ - - -
-
-

Status

-
- <% ['active', 'hidden', 'completed'].each do | state | %> - <% span_class = @project.current_state.to_s == state ? 'active_state' : 'inactive_state' %> - <%= radio_button(:project, 'state', state) %> <%= state.titlecase %> - <% end %> - <% apply_behavior "#project_status input:click", - remote_function(:url => project_path(@project), :method => :put, - :with => "'wants_render=false&update_status=true&project[state]='+this.value" ) - %> -
-
-
- -
-
-

Default Context

-
- <% form_remote_tag( :url => project_path(@project), :method => :put, - :html=> { :id => 'set-default-context-action', - :name => 'default_context', - :class => 'inline-form' }, - :before => "$('default_context_submit').startWaiting()", - :loaded => "$('default_context_submit').stopWaiting()") do -%> - <%= hidden_field_tag("update_default_context", true) %> - <%= text_field_tag("project[default_context_name]", - @project.default_context.name, - { :tabindex => 9,:size => 25 }) %> - <%= submit_tag "Set Default Context for this Project", { :tabindex => 10, :id => "default_context_submit" } %> - <%= render :partial => 'default_context_autocomplete' %> - <% end -%> -
-
-
- -
-
-

Default Tags

-
- <% form_remote_tag( :url => project_path(@project), :method => :put, - :html=> { :id => 'set-default-tags-action', - :name => 'default_tags', - :class => 'inline-form' }, - :before => "$('default_tags_submit').startWaiting()", - :loaded => "$('default_tags_submit').stopWaiting()") do -%> - <%= hidden_field_tag("update_default_tags", true) %> - <%= text_field_tag("project[default_tags]", - @project.default_tags, - { :tabindex => 11,:size => 25 }) %> - <%= submit_tag "Set Default Tags for this Project", { :tabindex => 12, :id => "default_tags_submit"} %> - <% end -%> -
-
-
- - -
<%= render :partial => "shared/add_new_item_form" %> <%= render :file => "sidebar/sidebar.html.erb" %> -
+ \ No newline at end of file diff --git a/app/views/projects/update.js.rjs b/app/views/projects/update.js.rjs index 593575e1..47304d87 100644 --- a/app/views/projects/update.js.rjs +++ b/app/views/projects/update.js.rjs @@ -1,16 +1,22 @@ status_message = 'Project saved' page.notify :notice, status_message, 5.0 -if @state_changed - page[dom_id(@project, 'container')].remove - page.insert_html :bottom, "list-#{@project.state}-projects", :partial => 'project_listing', :object => @project -else - page.replace_html dom_id(@project, 'container'), :partial => 'project_listing', :object => @project -end -page.sortable "list-#{@project.state}-projects", get_listing_sortable_options("list-#{@project.state}-projects") -page.replace_html "active-projects-count", @active_projects_count -page.replace_html "hidden-projects-count", @hidden_projects_count -page.replace_html "completed-projects-count", @completed_projects_count +if source_view_is :project_list + if @state_changed + page[dom_id(@project, 'container')].remove + page.insert_html :bottom, "list-#{@project.state}-projects", :partial => 'project_listing', :object => @project + else + page.replace_html dom_id(@project, 'container'), :partial => 'project_listing', :object => @project + end + page.sortable "list-#{@project.state}-projects", get_listing_sortable_options("list-#{@project.state}-projects") + page.replace_html "active-projects-count", @active_projects_count + page.replace_html "hidden-projects-count", @hidden_projects_count + page.replace_html "completed-projects-count", @completed_projects_count -page.set_element_visible("list-hidden-projects-container", @hidden_projects_count > 0) -page.set_element_visible("list-active-projects-container", @active_projects_count > 0) -page.set_element_visible("list-completed-projects-container", @completed_projects_count > 0) + page.set_element_visible("list-hidden-projects-container", @hidden_projects_count > 0) + page.set_element_visible("list-active-projects-container", @active_projects_count > 0) + page.set_element_visible("list-completed-projects-container", @completed_projects_count > 0) +else + page[dom_id(@project, 'edit')].hide + page.replace_html dom_id(@project, 'container'), :partial => 'project_settings', :locals => { :project => @project } + page[dom_id(@project)].show +end diff --git a/app/views/todos/_todo.html.erb b/app/views/todos/_todo.html.erb index 321244cb..2de2c5c5 100644 --- a/app/views/todos/_todo.html.erb +++ b/app/views/todos/_todo.html.erb @@ -37,4 +37,4 @@ parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
<% end -%> - + \ No newline at end of file diff --git a/config/environments/test.rb b/config/environments/test.rb index 482a759b..fd337cec 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -49,6 +49,7 @@ end config.gem "flexmock" config.gem "ZenTest" config.gem "hpricot" +config.gem "hoe" config.gem "rspec", :lib => false, :version => ">=1.2.2" config.gem "rspec-rails", :lib => false, :version => ">=1.2.2"