From 9ab69adb3882233b65a3b79b85998789f83226de Mon Sep 17 00:00:00 2001 From: Eric Allen Date: Fri, 2 Apr 2010 13:23:24 -0400 Subject: [PATCH] Dynamically load autocompletes This cuts something like 100ms off of page load times! Closes #1011 --- app/controllers/application_controller.rb | 5 +++++ app/controllers/contexts_controller.rb | 1 + app/controllers/projects_controller.rb | 1 + app/controllers/todos_controller.rb | 7 +++++++ app/helpers/todos_helper.rb | 14 -------------- app/views/layouts/standard.html.erb | 3 --- config/initializers/mime_types.rb | 3 ++- config/routes.rb | 3 +++ public/javascripts/application.js | 15 ++++++++++----- public/javascripts/jquery.autocomplete.js | 2 +- 10 files changed, 30 insertions(+), 24 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 56dc69f6..d451215d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -123,6 +123,11 @@ class ApplicationController < ActionController::Base formatted_date end + + def for_autocomplete(coll) + coll.map {|item| "#{item.name}|#{item.id}"}.join("\n") + end + # 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 diff --git a/app/controllers/contexts_controller.rb b/app/controllers/contexts_controller.rb index 75f3d1c5..bd6b900f 100644 --- a/app/controllers/contexts_controller.rb +++ b/app/controllers/contexts_controller.rb @@ -22,6 +22,7 @@ class ContextsController < ApplicationController format.rss &render_contexts_rss_feed format.atom &render_contexts_atom_feed format.text { render :action => 'index', :layout => false, :content_type => Mime::TEXT } + format.autocomplete { render :text => for_autocomplete(@active_contexts + @hidden_contexts)} end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index a6604cb3..454a7e6e 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -26,6 +26,7 @@ class ProjectsController < ApplicationController format.rss &render_rss_feed format.atom &render_atom_feed format.text &render_text_feed + format.autocomplete { render :text => for_autocomplete(@projects) } end end end diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index 67b983f2..e55298b9 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -526,6 +526,13 @@ class TodosController < ApplicationController } end end + + def tags + @tags = Tag.all + respond_to do |format| + format.autocomplete { render :text => for_autocomplete(@tags) } + end + end def defer @source_view = params['_source_view'] || 'todo' diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index 8eafc567..6c8703c6 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -276,20 +276,6 @@ module TodosHelper 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 tag_names_for_autocomplete - array_or_string_for_javascript( Tag.all.collect{|c| escape_javascript(c.name) } ) - end - def default_contexts_for_autocomplete projects = current_user.projects.find(:all, :conditions => ['default_context_id is not null']) Hash[*projects.map{ |p| [p.name, p.default_context.name] }.flatten].to_json diff --git a/app/views/layouts/standard.html.erb b/app/views/layouts/standard.html.erb index 6bdccf61..cf555a73 100644 --- a/app/views/layouts/standard.html.erb +++ b/app/views/layouts/standard.html.erb @@ -14,11 +14,8 @@ <%= javascript_tag "var SOURCE_VIEW = '#{@source_view}';" %> <%= javascript_tag "var TAG_NAME = '#{@tag_name}';" if @tag_name %>