Make openils.PermaCrud.Store use a default order_by clause in common situations
authorsenator <senator@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 7 Jan 2011 23:05:29 +0000 (23:05 +0000)
committersenator <senator@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 7 Jan 2011 23:05:29 +0000 (23:05 +0000)
This avoids an issue where, using a FilteringSelect dijit, sometimes you type a
couple letters, let's says "ABC", and you get a set of matches like this:

"ABCDE"
"ABCD"
"ABC"

just because there happens to be no specific ordering.  If you click the ABC
match and tab away too quickly, the dijit will reset itself to the first match,
"ABCDE".  This is probably a Dojo/Dijit bug, as I've been able to duplicate the
problem with other stores, but that's all murky.

This avoids the issue by making sure the shortest match is at the top of the
list.

git-svn-id: svn://svn.open-ils.org/ILS/trunk@19137 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/web/js/dojo/openils/PermaCrud/Store.js

index 205cc38..df982ec 100644 (file)
@@ -236,6 +236,7 @@ if (!dojo._hasResource["openils.PermaCrud.Store"]) {
             if (qkeys.length < 1)
                 throw new PCSError("Not enough meat on that query");
 
+            var first_term;
             for (var qkey in req.query) {
                 var value = req.query[qkey];
                 var type = typeof value;
@@ -282,6 +283,7 @@ if (!dojo._hasResource["openils.PermaCrud.Store"]) {
                     if (req.queryOptions && req.queryOptions.ignoreCase)
                         op = "ilike";
 
+                    if (!first_term) first_term = key;
                     if (op) {
                         pcrud_query[key] = {};
                         pcrud_query[key][op] = term;
@@ -315,6 +317,9 @@ if (!dojo._hasResource["openils.PermaCrud.Store"]) {
                 /* XXX not sure whether multiple columns will work as such. */
                 hashkey = "order_by:" + opts.order_by[this.fmclass] + ":" +
                     hashkey;
+            } else if (first_term) {
+                opts.order_by = {};
+                opts.order_by[this.fmclass] = first_term + " ASC";
             }
 
             opts.id_list = this.stubby;