diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2007-09-11 02:57:19 +0000 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2007-09-11 02:57:19 +0000 |
commit | bc290c083c6a8d8ec1b30de423c751f451f51d6f (patch) | |
tree | c1e45c4018e24fd52842f0a9aa5199f0ee3e573a /actionpack | |
parent | b611c685d92038b199149e8eec900c3058523ab7 (diff) | |
download | rails-bc290c083c6a8d8ec1b30de423c751f451f51d6f.tar.gz rails-bc290c083c6a8d8ec1b30de423c751f451f51d6f.tar.bz2 rails-bc290c083c6a8d8ec1b30de423c751f451f51d6f.zip |
Moved ActionController::Macros::AutoComplete into the auto_complete plugin on the official Rails svn #9512 [lifofifo]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7450 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rwxr-xr-x | actionpack/lib/action_controller.rb | 2 | ||||
-rw-r--r-- | actionpack/lib/action_controller/macros/auto_complete.rb | 53 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/java_script_macros_helper.rb | 160 | ||||
-rw-r--r-- | actionpack/test/template/java_script_macros_helper_test.rb | 67 |
5 files changed, 2 insertions, 282 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 551cc753d9..d2d0212cbd 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -2,6 +2,8 @@ * Fixed that resource namespaces wouldn't stick to all nested resources #9399 [pixeltrix] +* Moved ActionController::Macros::AutoComplete into the auto_complete plugin on the official Rails svn #9512 [lifofifo] + * Moved ActionController::Macros::InPlaceEditing into the in_place_editor plugin on the official Rails svn #9513 [lifofifo] * Removed deprecated form of calling xml_http_request/xhr without the first argument being the http verb [DHH] diff --git a/actionpack/lib/action_controller.rb b/actionpack/lib/action_controller.rb index 10c8591b51..14d1539e17 100755 --- a/actionpack/lib/action_controller.rb +++ b/actionpack/lib/action_controller.rb @@ -54,7 +54,6 @@ require 'action_controller/session_management' require 'action_controller/http_authentication' require 'action_controller/components' require 'action_controller/record_identifier' -require 'action_controller/macros/auto_complete' require 'action_view' ActionController::Base.template_class = ActionView::Base @@ -75,5 +74,4 @@ ActionController::Base.class_eval do include ActionController::HttpAuthentication::Basic::ControllerMethods include ActionController::Components include ActionController::RecordIdentifier - include ActionController::Macros::AutoComplete end diff --git a/actionpack/lib/action_controller/macros/auto_complete.rb b/actionpack/lib/action_controller/macros/auto_complete.rb index 8282e2c10c..e69de29bb2 100644 --- a/actionpack/lib/action_controller/macros/auto_complete.rb +++ b/actionpack/lib/action_controller/macros/auto_complete.rb @@ -1,53 +0,0 @@ -module ActionController - # Macros are class-level calls that add pre-defined actions to the controller based on the parameters passed in. - # Currently, they're used to bridge the JavaScript macros, like autocompletion and in-place editing, with the controller - # backing. - module Macros - module AutoComplete #:nodoc: - def self.included(base) #:nodoc: - base.extend(ClassMethods) - end - - # DEPRECATION WARNING: This method will become a separate plugin when Rails 2.0 ships. - # - # Example: - # - # # Controller - # class BlogController < ApplicationController - # auto_complete_for :post, :title - # end - # - # # View - # <%= text_field_with_auto_complete :post, title %> - # - # By default, auto_complete_for limits the results to 10 entries, - # and sorts by the given field. - # - # auto_complete_for takes a third parameter, an options hash to - # the find method used to search for the records: - # - # auto_complete_for :post, :title, :limit => 15, :order => 'created_at DESC' - # - # For help on defining text input fields with autocompletion, - # see ActionView::Helpers::JavaScriptHelper. - # - # For more examples, see script.aculo.us: - # * http://script.aculo.us/demos/ajax/autocompleter - # * http://script.aculo.us/demos/ajax/autocompleter_customized - module ClassMethods - def auto_complete_for(object, method, options = {}) - define_method("auto_complete_for_#{object}_#{method}") do - find_options = { - :conditions => [ "LOWER(#{method}) LIKE ?", '%' + params[object][method].downcase + '%' ], - :order => "#{method} ASC", - :limit => 10 }.merge!(options) - - @items = object.to_s.camelize.constantize.find(:all, find_options) - - render :inline => "<%= auto_complete_result @items, '#{method}' %>" - end - end - end - end - end -end
\ No newline at end of file diff --git a/actionpack/lib/action_view/helpers/java_script_macros_helper.rb b/actionpack/lib/action_view/helpers/java_script_macros_helper.rb index 2109478909..e69de29bb2 100644 --- a/actionpack/lib/action_view/helpers/java_script_macros_helper.rb +++ b/actionpack/lib/action_view/helpers/java_script_macros_helper.rb @@ -1,160 +0,0 @@ -require 'action_view/helpers/tag_helper' - -module ActionView - module Helpers - # Provides a set of helpers for creating JavaScript macros that rely on and often bundle methods from JavaScriptHelper into - # larger units. These macros also rely on counterparts in the controller that provide them with their backing. The in-place - # editing relies on ActionController::Base.in_place_edit_for and the autocompletion relies on - # ActionController::Base.auto_complete_for. - module JavaScriptMacrosHelper - # DEPRECATION WARNING: This method will become a separate plugin when Rails 2.0 ships. - # - # Adds AJAX autocomplete functionality to the text input field with the - # DOM ID specified by +field_id+. - # - # This function expects that the called action returns an HTML <ul> list, - # or nothing if no entries should be displayed for autocompletion. - # - # You'll probably want to turn the browser's built-in autocompletion off, - # so be sure to include an <tt>autocomplete="off"</tt> attribute with your text - # input field. - # - # The autocompleter object is assigned to a Javascript variable named <tt>field_id</tt>_auto_completer. - # This object is useful if you for example want to trigger the auto-complete suggestions through - # other means than user input (for that specific case, call the <tt>activate</tt> method on that object). - # - # Required +options+ are: - # <tt>:url</tt>:: URL to call for autocompletion results - # in url_for format. - # - # Addtional +options+ are: - # <tt>:update</tt>:: Specifies the DOM ID of the element whose - # innerHTML should be updated with the autocomplete - # entries returned by the AJAX request. - # Defaults to <tt>field_id</tt> + '_auto_complete' - # <tt>:with</tt>:: A JavaScript expression specifying the - # parameters for the XMLHttpRequest. This defaults - # to 'fieldname=value'. - # <tt>:frequency</tt>:: Determines the time to wait after the last keystroke - # for the AJAX request to be initiated. - # <tt>:indicator</tt>:: Specifies the DOM ID of an element which will be - # displayed while autocomplete is running. - # <tt>:tokens</tt>:: A string or an array of strings containing - # separator tokens for tokenized incremental - # autocompletion. Example: <tt>:tokens => ','</tt> would - # allow multiple autocompletion entries, separated - # by commas. - # <tt>:min_chars</tt>:: The minimum number of characters that should be - # in the input field before an Ajax call is made - # to the server. - # <tt>:on_hide</tt>:: A Javascript expression that is called when the - # autocompletion div is hidden. The expression - # should take two variables: element and update. - # Element is a DOM element for the field, update - # is a DOM element for the div from which the - # innerHTML is replaced. - # <tt>:on_show</tt>:: Like on_hide, only now the expression is called - # then the div is shown. - # <tt>:after_update_element</tt>:: A Javascript expression that is called when the - # user has selected one of the proposed values. - # The expression should take two variables: element and value. - # Element is a DOM element for the field, value - # is the value selected by the user. - # <tt>:select</tt>:: Pick the class of the element from which the value for - # insertion should be extracted. If this is not specified, - # the entire element is used. - # <tt>:method</tt>:: Specifies the HTTP verb to use when the autocompletion - # request is made. Defaults to POST. - def auto_complete_field(field_id, options = {}) - function = "var #{field_id}_auto_completer = new Ajax.Autocompleter(" - function << "'#{field_id}', " - function << "'" + (options[:update] || "#{field_id}_auto_complete") + "', " - function << "'#{url_for(options[:url])}'" - - js_options = {} - js_options[:tokens] = array_or_string_for_javascript(options[:tokens]) if options[:tokens] - js_options[:callback] = "function(element, value) { return #{options[:with]} }" if options[:with] - js_options[:indicator] = "'#{options[:indicator]}'" if options[:indicator] - js_options[:select] = "'#{options[:select]}'" if options[:select] - js_options[:paramName] = "'#{options[:param_name]}'" if options[:param_name] - js_options[:frequency] = "#{options[:frequency]}" if options[:frequency] - js_options[:method] = "'#{options[:method].to_s}'" if options[:method] - - { :after_update_element => :afterUpdateElement, - :on_show => :onShow, :on_hide => :onHide, :min_chars => :minChars }.each do |k,v| - js_options[v] = options[k] if options[k] - end - - function << (', ' + options_for_javascript(js_options) + ')') - - javascript_tag(function) - end - - # DEPRECATION WARNING: This method will become a separate plugin when Rails 2.0 ships. - # - # Use this method in your view to generate a return for the AJAX autocomplete requests. - # - # Example action: - # - # def auto_complete_for_item_title - # @items = Item.find(:all, - # :conditions => [ 'LOWER(description) LIKE ?', - # '%' + request.raw_post.downcase + '%' ]) - # render :inline => "<%= auto_complete_result(@items, 'description') %>" - # end - # - # The auto_complete_result can of course also be called from a view belonging to the - # auto_complete action if you need to decorate it further. - def auto_complete_result(entries, field, phrase = nil) - return unless entries - items = entries.map { |entry| content_tag("li", phrase ? highlight(entry[field], phrase) : h(entry[field])) } - content_tag("ul", items.uniq) - end - - # DEPRECATION WARNING: This method will become a separate plugin when Rails 2.0 ships. - # - # Wrapper for text_field with added AJAX autocompletion functionality. - # - # In your controller, you'll need to define an action called - # auto_complete_for to respond the AJAX calls, - # - # See the RDoc on ActionController::Macros::AutoComplete to learn more about this. - def text_field_with_auto_complete(object, method, tag_options = {}, completion_options = {}) - (completion_options[:skip_style] ? "" : auto_complete_stylesheet) + - text_field(object, method, tag_options) + - content_tag("div", "", :id => "#{object}_#{method}_auto_complete", :class => "auto_complete") + - auto_complete_field("#{object}_#{method}", { :url => { :action => "auto_complete_for_#{object}_#{method}" } }.update(completion_options)) - end - - private - def auto_complete_stylesheet - content_tag('style', <<-EOT, :type => Mime::CSS) - div.auto_complete { - width: 350px; - background: #fff; - } - div.auto_complete ul { - border:1px solid #888; - margin:0; - padding:0; - width:100%; - list-style-type:none; - } - div.auto_complete ul li { - margin:0; - padding:3px; - } - div.auto_complete ul li.selected { - background-color: #ffb; - } - div.auto_complete ul strong.highlight { - color: #800; - margin:0; - padding:0; - } - EOT - end - - end - end -end diff --git a/actionpack/test/template/java_script_macros_helper_test.rb b/actionpack/test/template/java_script_macros_helper_test.rb index bba851e9a6..e69de29bb2 100644 --- a/actionpack/test/template/java_script_macros_helper_test.rb +++ b/actionpack/test/template/java_script_macros_helper_test.rb @@ -1,67 +0,0 @@ -require "#{File.dirname(__FILE__)}/../abstract_unit" - -class JavaScriptMacrosHelperTest < Test::Unit::TestCase - include ActionView::Helpers::JavaScriptHelper - include ActionView::Helpers::JavaScriptMacrosHelper - - include ActionView::Helpers::UrlHelper - include ActionView::Helpers::TagHelper - include ActionView::Helpers::TextHelper - include ActionView::Helpers::FormHelper - include ActionView::Helpers::CaptureHelper - - def setup - @controller = Class.new do - def url_for(options) - url = "http://www.example.com/" - url << options[:action].to_s if options and options[:action] - url - end - end - @controller = @controller.new - end - - - def test_auto_complete_field - assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nvar some_input_auto_completer = new Ajax.Autocompleter('some_input', 'some_input_auto_complete', 'http://www.example.com/autocomplete', {})\n//]]>\n</script>), - auto_complete_field("some_input", :url => { :action => "autocomplete" }); - assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nvar some_input_auto_completer = new Ajax.Autocompleter('some_input', 'some_input_auto_complete', 'http://www.example.com/autocomplete', {tokens:','})\n//]]>\n</script>), - auto_complete_field("some_input", :url => { :action => "autocomplete" }, :tokens => ','); - assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nvar some_input_auto_completer = new Ajax.Autocompleter('some_input', 'some_input_auto_complete', 'http://www.example.com/autocomplete', {tokens:[',']})\n//]]>\n</script>), - auto_complete_field("some_input", :url => { :action => "autocomplete" }, :tokens => [',']); - assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nvar some_input_auto_completer = new Ajax.Autocompleter('some_input', 'some_input_auto_complete', 'http://www.example.com/autocomplete', {minChars:3})\n//]]>\n</script>), - auto_complete_field("some_input", :url => { :action => "autocomplete" }, :min_chars => 3); - assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nvar some_input_auto_completer = new Ajax.Autocompleter('some_input', 'some_input_auto_complete', 'http://www.example.com/autocomplete', {onHide:function(element, update){alert('me');}})\n//]]>\n</script>), - auto_complete_field("some_input", :url => { :action => "autocomplete" }, :on_hide => "function(element, update){alert('me');}"); - assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nvar some_input_auto_completer = new Ajax.Autocompleter('some_input', 'some_input_auto_complete', 'http://www.example.com/autocomplete', {frequency:2})\n//]]>\n</script>), - auto_complete_field("some_input", :url => { :action => "autocomplete" }, :frequency => 2); - assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nvar some_input_auto_completer = new Ajax.Autocompleter('some_input', 'some_input_auto_complete', 'http://www.example.com/autocomplete', {afterUpdateElement:function(element,value){alert('You have chosen: '+value)}})\n//]]>\n</script>), - auto_complete_field("some_input", :url => { :action => "autocomplete" }, - :after_update_element => "function(element,value){alert('You have chosen: '+value)}"); - assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nvar some_input_auto_completer = new Ajax.Autocompleter('some_input', 'some_input_auto_complete', 'http://www.example.com/autocomplete', {paramName:'huidriwusch'})\n//]]>\n</script>), - auto_complete_field("some_input", :url => { :action => "autocomplete" }, :param_name => 'huidriwusch'); - assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nvar some_input_auto_completer = new Ajax.Autocompleter('some_input', 'some_input_auto_complete', 'http://www.example.com/autocomplete', {method:'get'})\n//]]>\n</script>), - auto_complete_field("some_input", :url => { :action => "autocomplete" }, :method => :get); - end - - def test_auto_complete_result - result = [ { :title => 'test1' }, { :title => 'test2' } ] - assert_equal %(<ul><li>test1</li><li>test2</li></ul>), - auto_complete_result(result, :title) - assert_equal %(<ul><li>t<strong class=\"highlight\">est</strong>1</li><li>t<strong class=\"highlight\">est</strong>2</li></ul>), - auto_complete_result(result, :title, "est") - - resultuniq = [ { :title => 'test1' }, { :title => 'test1' } ] - assert_equal %(<ul><li>t<strong class=\"highlight\">est</strong>1</li></ul>), - auto_complete_result(resultuniq, :title, "est") - end - - def test_text_field_with_auto_complete - assert_match %(<style type="text/css">), - text_field_with_auto_complete(:message, :recipient) - - assert_dom_equal %(<input id=\"message_recipient\" name=\"message[recipient]\" size=\"30\" type=\"text\" /><div class=\"auto_complete\" id=\"message_recipient_auto_complete\"></div><script type=\"text/javascript\">\n//<![CDATA[\nvar message_recipient_auto_completer = new Ajax.Autocompleter('message_recipient', 'message_recipient_auto_complete', 'http://www.example.com/auto_complete_for_message_recipient', {})\n//]]>\n</script>), - text_field_with_auto_complete(:message, :recipient, {}, :skip_style => true) - end - -end |