Thanks for your really helpful advice.
I turned your suggestion into the following patch and also modified
the Rails auto_complete helper as well.
(the revision numbers unfortunately point at my local application
where I made the modification).
If you find this helpful, could you help me getting this committed
into the proper projects? :)
Thanks!
/Jesper Rønn-Jensen
Blog
http://justaddwater.dk/
--
Index: vendor/plugins/auto_complete/README
===================================================================
--- vendor/plugins/auto_complete/README (revision 878)
+++ vendor/plugins/auto_complete/README (working copy)
@@ -20,4 +20,6 @@
*
http://script.aculo.us/demos/ajax/autocompleter
*
http://script.aculo.us/demos/ajax/autocompleter_customized
+* Autocompleter URL:
http://github.com/rails/auto_complete/
+
Copyright (c) 2007 David Heinemeier Hansson, released under the MIT
license
Index: vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb
===================================================================
--- vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb
(revision 878)
+++ vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb
(working copy)
@@ -55,6 +55,9 @@
# the entire element is used.
# <tt>:method</tt>:: Specifies the HTTP verb to use
when the autocompletion
# request is made. Defaults to
POST.
+ # <tt>:auto_select_first</tt>:: Toggle auto selection of first
item found in autocompleter.
+ # 'true'~=mac style, 'false'~=pc
style
+ # (defaults to true)
def auto_complete_field(field_id, options = {})
function = "var #{field_id}_auto_completer = new
Ajax.Autocompleter("
function << "'#{field_id}', "
@@ -62,15 +65,16 @@
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]
+ 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]
+ js_options[:autoSelectFirst] =
"'#{options[:auto_select_first].to_s}'" || "true"
- { :after_update_element => :afterUpdateElement,
+ { :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
Index: public/javascripts/controls.js
===================================================================
--- public/javascripts/controls.js (revision 883)
+++ public/javascripts/controls.js (working copy)
@@ -40,14 +40,15 @@
var Autocompleter = { }
Autocompleter.Base = Class.create({
baseInitialize: function(element, update, options) {
- element = $(element)
- this.element = element;
- this.update = $(update);
- this.hasFocus = false;
- this.changed = false;
- this.active = false;
- this.index = 0;
- this.entryCount = 0;
+ element = $(element)
+ this.element = element;
+ this.update = $(update);
+ this.hasFocus = false;
+ this.changed = false;
+ this.active = false;
+ this.index = 0;
+ this.entryCount = 0;
+ this.autoSelectFirst = 'true';//toggle auto selection of first
item found in autocompleter.'true'~=mac, 'false'~=pc
this.oldElementValue = this.element.value;
if(this.setOptions)
@@ -55,11 +56,12 @@
else
this.options = options || { };
- this.options.paramName = this.options.paramName ||
this.element.name;
- this.options.tokens = this.options.tokens || [];
- this.options.frequency = this.options.frequency || 0.4;
- this.options.minChars = this.options.minChars || 1;
- this.options.onShow = this.options.onShow ||
+ this.options.paramName = this.options.paramName ||
this.element.name;
+ this.options.tokens = this.options.tokens || [];
+ this.options.frequency = this.options.frequency || 0.4;
+ this.options.minChars = this.options.minChars || 1;
+ this.options.autoSelectFirst = this.options.autoSelectFirst ||
this.autoSelectFirst;
+ this.options.onShow = this.options.onShow ||
function(element, update){
if(!update.style.position ||
update.style.position=='absolute') {
update.style.position = 'absolute';
@@ -281,8 +283,7 @@
}
this.stopIndicator();
- this.index = 0;
-
+ this.index = this.options.autoSelectFirst==='false' ? -1 : 0;
if(this.entryCount==1 && this.options.autoSelect) {
this.selectEntry();
this.hide();