pcrudfilterdialog: avoid failures in itemfilereadstore by creating new stores
authorLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Sat, 7 Jan 2012 22:40:44 +0000 (17:40 -0500)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Sat, 7 Jan 2012 22:40:44 +0000 (17:40 -0500)
whenever we need them for the operator selector filteringselect

Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Open-ILS/web/js/dojo/openils/widget/PCrudFilterDialog.js

index 8ce549f..22194e0 100644 (file)
@@ -72,49 +72,54 @@ if(!dojo._hasResource['openils.widget.PCrudFilterDialog']) {
         }
     ];
 
-    var _minimal_operator_store = new dojo.data.ItemFileReadStore(
-        {
-            "data": {
-                "identifier": "name",
-                "items": _minimal_operators
-            }
-        }
-    );
+    var _operator_store_factory = {};
 
-    var _most_operator_store = new dojo.data.ItemFileReadStore(
-        {
-            "data": {
-                "identifier": "name",
-                "items": _minimal_operators.concat(_strict_operators)
-            }
-        }
-    );
-
-    var _all_operator_store = new dojo.data.ItemFileReadStore(
-        {
-            "data": {
-                "identifier": "name",
-                "items": _minimal_operators.
-                    concat(_strict_operators).
-                    concat(_fuzzy_operators)
-            }
-        }
-    );
-
-    var _operator_stores = {};
     ["bool", "link", "org_unit"].forEach(
         function(type) {
-            _operator_stores[type] = _minimal_operator_store;
+            _operator_store_factory[type] = function() {
+                return new dojo.data.ItemFileReadStore(
+                    {
+                        "data": {
+                            "identifier": "name",
+                            "items": _minimal_operators
+                        }
+                    }
+                );
+            };
         }
     );
 
     ["float", "id", "int", "interval", "money", "number", "timestamp"].forEach(
         function(type) {
-            _operator_stores[type] = _most_operator_store;
+            _operator_store_factory[type] = function() {
+                return new dojo.data.ItemFileReadStore(
+                    {
+                        "data": {
+                            "identifier": "name",
+                            "items": _minimal_operators.concat(
+                                _strict_operators
+                            )
+                        }
+                    }
+                );
+            };
         }
     );
 
-    _operator_stores.text = _all_operator_store;
+    _operator_store_factory.text = function() {
+        return new dojo.data.ItemFileReadStore(
+            {
+                "data": {
+                    "identifier": "name",
+                    "items": _minimal_operators.concat(
+                        _strict_operators
+                    ).concat(
+                        _fuzzy_operators
+                    )
+                }
+            }
+        );
+    };
 
     /* This is not the dijit per se. Search further in this file for
      * "dojo.declare" for the beginning of the dijit. */
@@ -231,7 +236,6 @@ if(!dojo._hasResource['openils.widget.PCrudFilterDialog']) {
 
                 if (typeof(value) != "undefined" &&
                     typeof(field) != "undefined") {
-
                     if (!first_pass[field])
                         first_pass[field] = [];
                     first_pass[field].push(value);
@@ -290,8 +294,10 @@ if(!dojo._hasResource['openils.widget.PCrudFilterDialog']) {
         this._remove_operator_selector = function() {
             if (this.operator_selector) {
                 var old_value = this.operator_selector.attr("value");
+
                 this.operator_selector.destroy();
                 dojo.empty(this.operator_slot);
+
                 return old_value;
             }
 
@@ -301,19 +307,19 @@ if(!dojo._hasResource['openils.widget.PCrudFilterDialog']) {
         this._replace_operator_selector = function() {
             var old_operator = this._remove_operator_selector();
 
-            var _operator_store = _operator_stores[this.selected_field_type];
-            var operator_selector_args = {
-                "labelAttr": "label",
-                "searchAttr": "label",
-                "scrollOnFocus": false,
-                "onChange": function(value) {
-                    self.update_selected_operator(value);
-                },
-                "store": _operator_store
-            };
+            var _operator_store =
+                _operator_store_factory[this.selected_field_type]();
 
             this.operator_selector = new dijit.form.FilteringSelect(
-                operator_selector_args,
+                {
+                    "labelAttr": "label",
+                    "searchAttr": "label",
+                    "scrollOnFocus": false,
+                    "onChange": function(value) {
+                        self.update_selected_operator(value);
+                    },
+                    "store": _operator_store
+                },
                 dojo.create("span", {}, this.operator_slot)
             );
 
@@ -322,7 +328,11 @@ if(!dojo._hasResource['openils.widget.PCrudFilterDialog']) {
                     {
                         "identity": old_operator,
                         "onItem": function(item) {
-                            self.operator_selector.attr("value", old_operator);
+                            if (item) { /* sic, necessary */
+                                self.operator_selector.attr(
+                                    "value", old_operator
+                                );
+                            }
                         }
                     }
                 );
@@ -364,13 +374,14 @@ if(!dojo._hasResource['openils.widget.PCrudFilterDialog']) {
 
             this._clear_value_slot();
 
-            var _operator_store = _operator_stores[this.selected_field_type];
+            var _operator_store = this.operator_selector.store;
 
             _operator_store.fetchItemByIdentity(
                 {
                     "identity": this.selected_operator,
                     "onItem": function(item) {
-                        self._rebuild_value_widgets_impl(item.param_count);
+                        if (item)
+                            self._rebuild_value_widgets_impl(item.param_count);
                     }
                 }
             );
@@ -412,7 +423,8 @@ if(!dojo._hasResource['openils.widget.PCrudFilterDialog']) {
                 {
                     "identity": value,
                     "onItem": function(item) {
-                        self._update_selected_field_impl(value, item.type);
+                        if (item)
+                            self._update_selected_field_impl(value, item.type);
                     }
                 }
             );
@@ -433,13 +445,13 @@ if(!dojo._hasResource['openils.widget.PCrudFilterDialog']) {
 
                 if (!values.length) {
                     return this._null_clause(); /* null/not null */
-                } else if (values.length == 1) {
-                    var clause = {};
-                    clause[self.selected_operator] = values.pop();
-                    return clause;
                 } else {
                     var clause = {};
-                    clause[self.selected_operator] = values;
+                    var op = this.selected_operator;
+                    if (values.length == 1)
+                        clause[op] = values.pop();
+                    else
+                        clause[op] = values;
                     return clause;
                 }
             } else {