diff options
-rw-r--r-- | app/controllers/request_controller.rb | 32 | ||||
-rw-r--r-- | app/models/public_body.rb | 4 | ||||
-rw-r--r-- | app/views/layouts/default.rhtml | 1 | ||||
-rw-r--r-- | app/views/request/_public_body_query.rhtml | 5 | ||||
-rw-r--r-- | app/views/request/frontpage.rhtml | 34 | ||||
-rw-r--r-- | config/routes.rb | 5 | ||||
-rw-r--r-- | config/solr.yml-example | 10 | ||||
-rw-r--r-- | db/migrate/034_run_solr_indexing.rb | 8 | ||||
-rw-r--r-- | db/schema.rb | 2 | ||||
-rw-r--r-- | public/stylesheets/main.css | 41 | ||||
-rw-r--r-- | todo.txt | 2 | ||||
-rw-r--r-- | vendor/plugins/auto_complete/README | 23 | ||||
-rw-r--r-- | vendor/plugins/auto_complete/Rakefile | 22 | ||||
-rw-r--r-- | vendor/plugins/auto_complete/init.rb | 2 | ||||
-rw-r--r-- | vendor/plugins/auto_complete/lib/auto_complete.rb | 47 | ||||
-rw-r--r-- | vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb | 143 | ||||
-rw-r--r-- | vendor/plugins/auto_complete/test/auto_complete_test.rb | 67 |
17 files changed, 438 insertions, 10 deletions
diff --git a/app/controllers/request_controller.rb b/app/controllers/request_controller.rb index 5e69c7873..4c1366da2 100644 --- a/app/controllers/request_controller.rb +++ b/app/controllers/request_controller.rb @@ -4,7 +4,7 @@ # Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved. # Email: francis@mysociety.org; WWW: http://www.mysociety.org/ # -# $Id: request_controller.rb,v 1.52 2008-02-19 12:28:59 francis Exp $ +# $Id: request_controller.rb,v 1.53 2008-02-21 15:18:46 francis Exp $ class RequestController < ApplicationController @@ -25,7 +25,34 @@ class RequestController < ApplicationController @info_requests = InfoRequest.paginate :order => "created_at desc", :page => params[:page], :per_page => 25, :conditions => "prominence = 'normal'" end + # Fancy javascript smancy for auto complete search + def auto_complete_for_public_body_query + # @public_bodies = PublicBody.find_by_solr(params[:public_body][:query]).results + criteria = '%' + params[:public_body][:query] + '%' + @public_bodies = PublicBody.find(:all, + :conditions => ["name ilike ?", criteria], + :order => 'name', :limit=>10) + + render :partial => "public_body_query" + end def frontpage + # Public body search on the left + @public_bodies = [] + if params[:public_body] and params[:public_body][:query] + # Try and do exact match - redirect if it is made + @public_body = PublicBody.find_by_name(params[:public_body][:query]) + if not @public_body.nil? + redirect_to new_request_to_body_url(:public_body_id => @public_body.id.to_s) + end + # Otherwise use search engine to find public body + #@public_bodies = PublicBody.find_by_solr(params[:public_body][:query]).results + criteria = '%' + params[:public_body][:query] + '%' + @public_bodies = PublicBody.find(:all, + :conditions => ["name ilike ?", criteria], + :order => 'name', :limit=>10) + end + + # Get all successful requests for display on the right @info_requests = InfoRequest.find :all, :order => "created_at desc", :conditions => "prominence = 'normal' and described_state in ('successful', 'partially_successful')", :limit => 3 end @@ -34,6 +61,9 @@ class RequestController < ApplicationController # First time we get to the page, just display it if params[:submitted_new_request].nil? # Read parameters in - public body can be passed from front page + if params[:public_body_id] + params[:info_request] = { :public_body_id => params[:public_body_id] } + end @info_request = InfoRequest.new(params[:info_request]) @outgoing_message = OutgoingMessage.new(params[:outgoing_message]) render :action => 'new' diff --git a/app/models/public_body.rb b/app/models/public_body.rb index c26b98010..bcc31a04e 100644 --- a/app/models/public_body.rb +++ b/app/models/public_body.rb @@ -21,7 +21,7 @@ # Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved. # Email: francis@mysociety.org; WWW: http://www.mysociety.org/ # -# $Id: public_body.rb,v 1.17 2008-02-14 15:31:22 francis Exp $ +# $Id: public_body.rb,v 1.18 2008-02-21 15:18:46 francis Exp $ class PublicBody < ActiveRecord::Base validates_presence_of :name @@ -30,6 +30,8 @@ class PublicBody < ActiveRecord::Base has_many :info_requests + acts_as_solr :fields => [:name, :short_name] + def validate unless MySociety::Validate.is_valid_email(self.request_email) errors.add(:request_email, "doesn't look like a valid email address") diff --git a/app/views/layouts/default.rhtml b/app/views/layouts/default.rhtml index fde60cfcf..fda9a553b 100644 --- a/app/views/layouts/default.rhtml +++ b/app/views/layouts/default.rhtml @@ -2,6 +2,7 @@ <html lang="en-gb"> <head> <!-- <script type="text/javascript" src="/js.js"></script> --> + <%= javascript_include_tag :defaults %> <title><%=@title%> <%= @title ? "-" : "" %> foi.mysociety.org</title> <%= stylesheet_link_tag 'main' %> </head> diff --git a/app/views/request/_public_body_query.rhtml b/app/views/request/_public_body_query.rhtml new file mode 100644 index 000000000..77efdfcc1 --- /dev/null +++ b/app/views/request/_public_body_query.rhtml @@ -0,0 +1,5 @@ +<ul> +<% for public_body in @public_bodies %> +<li><%=h public_body.name %></li> +<% end %> +</ul> diff --git a/app/views/request/frontpage.rhtml b/app/views/request/frontpage.rhtml index fd2c92ca3..42e4a6975 100644 --- a/app/views/request/frontpage.rhtml +++ b/app/views/request/frontpage.rhtml @@ -1,13 +1,35 @@ <div id="make_requests"> <h1>Make requests for information from the UK Government</h1> - <% form_for(:info_request, @info_request, :url => new_request_url, :html => { :id => 'public_body_form', :class => 'plaque' } ) do |f| %> - <p>Choose which public body you would like information from.</p> - <p> - <%= @public_bodies = PublicBody.find(:all, :order => "name") - f.collection_select(:public_body_id, @public_bodies, :id, :name) %> + <% form_tag({:action => :frontpage}, :id => 'public_body_form', :class => 'plaque' ) do %> + <p> + <label for="public_body_query">Find the public body you would like information from:</label> </p> - <p><%= submit_tag "Submit >>" %></p> + + <div> + <%= text_field_with_auto_complete 'public_body', 'query', {}, { :skip_style => true } %> + </div> + <div class="public_body_search_note"> + Type to search e.g. Transport, Health, Defence + </div> + + <p> + <%= submit_tag "Submit" %> + </p> + + <% if @public_bodies.size > 0 %> + <div id="public_body_search"> + <ul> + <strong>Public bodies found</strong> + <% for public_body in @public_bodies %> + <li> + <%= link_to h(public_body.name), new_request_to_body_url(:public_body_id => public_body.id.to_s) %> + </li> + <% end %> + </ul> + </div> + <% end %> + <% end %> </div> diff --git a/config/routes.rb b/config/routes.rb index 494bfa41b..d230fed37 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,7 +4,7 @@ # Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved. # Email: francis@mysociety.org; WWW: http://www.mysociety.org/ # -# $Id: routes.rb,v 1.33 2008-02-20 12:51:30 francis Exp $ +# $Id: routes.rb,v 1.34 2008-02-21 15:18:47 francis Exp $ ActionController::Routing::Routes.draw do |map| # The priority is based upon order of creation: first created -> highest priority. @@ -15,8 +15,11 @@ ActionController::Routing::Routes.draw do |map| map.with_options :controller => 'request' do |request| request.home '/', :action => 'frontpage' + request.auto_complete_for_public_body_query 'auto_complete_for_public_body_query', :action => 'auto_complete_for_public_body_query' + request.request_list '/list', :action => 'list' request.new_request '/new', :action => 'new' + request.new_request_to_body '/new/:public_body_id', :action => 'new' request.show_request '/request/:id', :action => 'show' request.describe_state '/request/:id/describe', :action => 'describe_state' request.show_response '/request/:id/response/:incoming_message_id', :action => 'show_response' diff --git a/config/solr.yml-example b/config/solr.yml-example new file mode 100644 index 000000000..a6f861839 --- /dev/null +++ b/config/solr.yml-example @@ -0,0 +1,10 @@ +# Config file for the acts_as_solr plugin. +# +# If you change the host or port number here, make sure you update +# them in your Solr config file + +development: + url: http://localhost:8982/solr + +production: + url: http://localhost:8983/solr
\ No newline at end of file diff --git a/db/migrate/034_run_solr_indexing.rb b/db/migrate/034_run_solr_indexing.rb new file mode 100644 index 000000000..8a697905c --- /dev/null +++ b/db/migrate/034_run_solr_indexing.rb @@ -0,0 +1,8 @@ +class RunSolrIndexing < ActiveRecord::Migration + def self.up + PublicBody.rebuild_solr_index + end + + def self.down + end +end diff --git a/db/schema.rb b/db/schema.rb index ff159b5c4..4037e75cf 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 33) do +ActiveRecord::Schema.define(:version => 34) do create_table "incoming_messages", :force => true do |t| t.integer "info_request_id", :null => false diff --git a/public/stylesheets/main.css b/public/stylesheets/main.css index c459597b6..42c22b45a 100644 --- a/public/stylesheets/main.css +++ b/public/stylesheets/main.css @@ -232,6 +232,47 @@ div.fieldWithErrors { display:inline; } text-align: left; } +#public_body_search ul { + padding: 1em 0 1em 0; + border: solid 1px #4e451b; + list-style-type: none; + background-color: #ffffff; +} +#public_body_search li { + background-color: #ffffff; +} +.public_body_search_note { + font-style: italic; + text-align: center; +} + +/* from auto_complete plugin */ +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; +} + + + /* /new - submitting requests */ #writeForm { @@ -38,6 +38,8 @@ Go through all requests and check status is shiny Next ==== +Rename frontpage to home + Put the admin "Public page" link on request page somewhere clearer Lucene for search - use http://acts-as-solr.rubyforge.org/ diff --git a/vendor/plugins/auto_complete/README b/vendor/plugins/auto_complete/README new file mode 100644 index 000000000..e08a81518 --- /dev/null +++ b/vendor/plugins/auto_complete/README @@ -0,0 +1,23 @@ +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 more examples, see script.aculo.us: +* http://script.aculo.us/demos/ajax/autocompleter +* http://script.aculo.us/demos/ajax/autocompleter_customized + +Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license diff --git a/vendor/plugins/auto_complete/Rakefile b/vendor/plugins/auto_complete/Rakefile new file mode 100644 index 000000000..5af4e8264 --- /dev/null +++ b/vendor/plugins/auto_complete/Rakefile @@ -0,0 +1,22 @@ +require 'rake' +require 'rake/testtask' +require 'rake/rdoctask' + +desc 'Default: run unit tests.' +task :default => :test + +desc 'Test auto_complete plugin.' +Rake::TestTask.new(:test) do |t| + t.libs << 'lib' + t.pattern = 'test/**/*_test.rb' + t.verbose = true +end + +desc 'Generate documentation for auto_complete plugin.' +Rake::RDocTask.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'Auto Complete' + rdoc.options << '--line-numbers' << '--inline-source' + rdoc.rdoc_files.include('README') + rdoc.rdoc_files.include('lib/**/*.rb') +end diff --git a/vendor/plugins/auto_complete/init.rb b/vendor/plugins/auto_complete/init.rb new file mode 100644 index 000000000..87bf027de --- /dev/null +++ b/vendor/plugins/auto_complete/init.rb @@ -0,0 +1,2 @@ +ActionController::Base.send :include, AutoComplete +ActionController::Base.helper AutoCompleteMacrosHelper
\ No newline at end of file diff --git a/vendor/plugins/auto_complete/lib/auto_complete.rb b/vendor/plugins/auto_complete/lib/auto_complete.rb new file mode 100644 index 000000000..4afc7c2e8 --- /dev/null +++ b/vendor/plugins/auto_complete/lib/auto_complete.rb @@ -0,0 +1,47 @@ +module AutoComplete + + def self.included(base) + base.extend(ClassMethods) + end + + # + # 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
\ No newline at end of file diff --git a/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb b/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb new file mode 100644 index 000000000..1d25ee47b --- /dev/null +++ b/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb @@ -0,0 +1,143 @@ +module AutoCompleteMacrosHelper + # 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 + + # 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 + + # 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, + # + 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 diff --git a/vendor/plugins/auto_complete/test/auto_complete_test.rb b/vendor/plugins/auto_complete/test/auto_complete_test.rb new file mode 100644 index 000000000..dc9a5c91d --- /dev/null +++ b/vendor/plugins/auto_complete/test/auto_complete_test.rb @@ -0,0 +1,67 @@ +require File.expand_path(File.join(File.dirname(__FILE__), '../../../../test/test_helper')) + +class AutoCompleteTest < Test::Unit::TestCase + include AutoComplete + include AutoCompleteMacrosHelper + + 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 |