Below please find a mod for adding an option to AutoComplete.

The option is 'afterNoMatch'. It specifies a function to call if the
value provided does not match any value in the dropdown box.  This has
been mentioned as a problem, and I needed a solution.  So, here it is.

If the autocomplete cannot return a value (it's not found by the JSON
lookup), the callback is called.  At this point, I reset the values of
a div and a hidden field holding the ID of the thing I was looking
for.

This may not be perfect, but it does get the job done.

NOTE:  This code is also on by blogspot blog ('justanyone') at
http://justanyone.blogspot.com .

First, how to call it:

<script type="text/javascript">

var autocompleteJSON = function(raw) {
    var json = typeof(raw) === "array" ? raw : raw.resultSet;
    var parsed = [];
    for (var i=0; i <json.length; i++) {
       var row =json[i];
       parsed.push({
           data: row,
          value: row["orgName"] + ' [' + row["id"] + ']',
         result: row["orgName"]
       });
    }
    return parsed;
 };

function afterNoMatch() {
    document.forms[0].mcOrgID.value = 'nomatch';
    locationDiv = document.getElementById('mcOrgLocationDiv')
    locationDiv.innerHTML = "<b>Manually Entered Organization Name -
No location.</b>";
    return;
    }

function formatCompanyName(row) {
    ret = row["orgName"] + " (id: " + row["id"] + ") " + row
["orgCity"] + ", " + row["orgState"]
    document.forms[0].mcOrgID.value = row['id'];
    return ret
    }

</script>

<script>
$(document).ready(function(){
    var data = "Core Selectors Attributes Traversing Manipulation CSS
Events Effects Ajax Utilities".split(" ");
    $("#mcOrgName").autocomplete('BrowseOrgsJSON.py')
        .result(function(event, data, formatted) {
        //alert("Got data back from server: name=" + data['orgName'] +
", id=" + data['id'] + ", city=" + data['orgCity'] + ", state=" + data
['orgState'] + ", formatted=" + formatted);
        $("#mcOrgLocationDiv").html('Location:  ' + data['orgCity'] +
', ' + data['orgState'] + '  (Textura Organization id: ' + data['id']
+ ')' );
        document.forms[0].mcOrgID.value = data['id'];
        });

    $("#mcOrgName").setOptions({scrollHeight    :
400                           });
    $("#mcOrgName").setOptions({queryArgument   :
"search"                      });
    $("#mcOrgName").setOptions({formatItem      :
formatCompanyName             });
    // $("#mcOrgName").setOptions({autoFill        :
true                          });  CANNOT DO THIS WITH SUBSTRING
SEARCH.
    $("#mcOrgName").setOptions({mustMatch       :
false                         });
    $("#mcOrgName").setOptions({dataType        :
"json"                        });
    $("#mcOrgName").setOptions({parse           :
autocompleteJSON              });
    $("#mcOrgName").setOptions({selectFirst     :
false                         });
    $("#mcOrgName").setOptions({extraParams     : {'includeOffSystem':
'False'} });
    $("#mcOrgName").setOptions({afterNoMatch    :
afterNoMatch                  });
  });
</script>


Now, here's the code.  I'll start off with the diff and then cut/paste
the section the code is in case the code changes between now and the
time you're reading this.

In jquery.autocomplete.js, the function hideResultsNow() is changed to
be the following:

function hideResultsNow() {
                var wasVisible = select.visible();
                select.hide();
                clearTimeout(timeout);
                stopLoading();
                if (options.mustMatch) {
                        // call search and run callback
                        $input.search(
                                function (result){
                                        // if no value found, clear the input 
box
                                        if( !result ) {
                                                if (options.multiple) {
                                                        var words = 
trimWords($input.val()).slice(0, -1);
                                                        $input.val( 
words.join(options.multipleSeparator) +
(words.length ? options.multipleSeparator : "") );
                                                }
                                                else
                                                        $input.val( "" );
                                        }
                                }
                        );
                }
                else
                {
                        // call search and run callback
                        $input.search(
                                function (result){
                                        if( !result ) {
                        options.afterNoMatch();
                                        }
                                }
                        );
        }

                if (wasVisible)
                        // position cursor at end of input field
                        $.Autocompleter.Selection(input, input.value.length,
input.value.length);

        };

and one option is added to the options section:
...
max: 100,
mustMatch: false,
afterNoMatch: function() { return; },
extraParams: {},
selectFirst: true,
...

Now for the technical diff:

Index: resources/js/jquery/autocomplete/jquery.autocomplete.js
==============================================================
307a308,319
>               else
>               {
>                       // call search and run callback
>                       $input.search(
>                               function (result){
>                                       if( !result ) {
>                         options.afterNoMatch();
>                                       }
>                               }
>                       );
>         }
>
310a323
>
403a417
>       afterNoMatch: function() { return; },

Reply via email to