Change order: Saving filter sets
authorLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Wed, 12 Sep 2012 23:08:24 +0000 (19:08 -0400)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Fri, 21 Sep 2012 15:07:01 +0000 (11:07 -0400)
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Open-ILS/examples/fm_IDL.xml
Open-ILS/web/js/dojo/openils/widget/PCrudFilterPane.js
Open-ILS/web/js/dojo/openils/widget/nls/PCrudFilterPane.js

index aae4856..0d178c7 100644 (file)
@@ -9597,7 +9597,7 @@ SELECT  usr,
                oils_obj:fieldmapper="config::filter_dialog_filter_set"
                oils_persist:tablename="config.filter_dialog_filter_set"
                reporter:label="FilterDialog Filter Set">
-               <fields oils_persist:primary="id" oils_persist:sequence="config.filter_dialog_filter_set_pkey">
+               <fields oils_persist:primary="id" oils_persist:sequence="config.filter_dialog_filter_set_id_seq">
                        <field reporter:label="ID" name="id" reporter:datatype="id"/>
                        <field reporter:label="Name" name="name" reporter:datatype="text"/>
                        <field reporter:label="Owning Library" name="owning_lib" reporter:datatype="org_unit"/>
index 4b071a6..9aaa0b1 100644 (file)
@@ -360,6 +360,20 @@ if (!dojo._hasResource['openils.widget.PCrudFilterPane']) {
             }
         };
 
+        /* This is for generating a data structure so that we can store
+         * a representation of the state of the filter rows.  Not for
+         * generating a query to be used in search.  You want compile() for
+         * that. */
+        this.serialize = function() {
+            var serialized = [];
+            for (var rowkey in this.rows) { /* row order doesn't matter */
+                var row_ser = this.rows[rowkey].serialize();
+                if (row_ser)
+                    serialized.push(row_ser);
+            }
+            return dojo.toJson(serialized);
+        };
+
         this._init.apply(this, arguments);
     }
 
@@ -423,6 +437,11 @@ if (!dojo._hasResource['openils.widget.PCrudFilterPane']) {
                     "scrollOnFocus": false,
                     "onChange": function(value) {
                         self.update_selected_field(value);
+                        if (this.and_then) {    /* ugh. also, self != this. */
+                            var once = this.and_then;
+                            delete this.and_then;
+                            once();
+                        }
                     },
                     "store": this.filter_row_manager.field_store
                 }, dojo.create("span", {}, td)
@@ -539,7 +558,9 @@ if (!dojo._hasResource['openils.widget.PCrudFilterPane']) {
 
         this.get_selected_operator_name = function() {
             var op = this.get_selected_operator();
-            return op ? op.name : null;
+            return op ?
+                (dojo.isArray(op.name) ? op.name.shift() : op.name) :
+                null;
         };
 
         this.update_selected_operator = function(value) {
@@ -566,6 +587,32 @@ if (!dojo._hasResource['openils.widget.PCrudFilterPane']) {
             }
         };
 
+        this.serialize = function() {
+            if (!this.selected_field)
+                return;
+
+            var serialized = {
+                "field": this.selected_field,
+                "operator": this.get_selected_operator_name()
+            };
+
+            var values;
+
+            if (this.value_widgets) {
+                values = this.value_widgets.map(
+                    function(widg) { return widg.widget.attr("value"); }
+                );
+            }
+
+            if (values.length == 1) {
+                serialized.value = values[0];
+            } else if (values.length > 1) {
+                serialized.values = values;
+            }
+
+            return serialized;
+        };
+
         this.compile = function() {
             if (this.value_widgets) {
                 var values = this.value_widgets.map(
@@ -610,19 +657,27 @@ if (!dojo._hasResource['openils.widget.PCrudFilterPane']) {
         };
 
         this.initialize = function(initializer) {
-            this.field_selector.attr("value", initializer.field);
-            this.operator_selector.attr("value", initializer.operator);
-
-            /* Caller supplies value for one value, values (array) for
-             * multiple. */
-            if (!initializer.values || !dojo.isArray(initializer.values))
-                initializer.values = [initializer.values || initializer.value];
+            /* and_then is a nasty kludge callback called once at onChange */
+            this.field_selector.and_then = dojo.hitch(
+                this, function() {
+                    this.operator_selector.attr("value", initializer.operator);
+
+                    /* Caller supplies value for one value, values (array) for
+                     * multiple. */
+                    if (typeof initializer.value !== "undefined" &&
+                            !initializer.values) {
+                        initializer.values = [initializer.value];
+                    }
+                    initializer.values = initializer.values || [];
 
-            for (var i = 0; i < initializer.values.length; i++) {
-                this.value_widgets[i].widget.attr(
-                    "value", initializer.values[i]
-                );
-            }
+                    for (var i = 0; i < initializer.values.length; i++) {
+                        this.value_widgets[i].widget.attr(
+                            "value", initializer.values[i]
+                        );
+                    }
+                }
+            );
+            this.field_selector.attr("value", initializer.field);
         };
 
         this.is_unset = function() {
@@ -754,18 +809,22 @@ if (!dojo._hasResource['openils.widget.PCrudFilterPane']) {
             },
 
             "_buildSavedFilterSaver": function(holder) {
-
-                var save = new dijit.TooltipDialog({
-                    "content": pcFilterLocaleStrings.NAME_SAVED_FILTER_SET +
-                        " <span id='fd-save-hold-input'></span><span id='fd-save-hold-apply'></span>"
-                });
-                new dijit.form.DropDownButton(
-                    {
-                        "dropDown": save,
-                        "label": pcFilterLocaleStrings.SAVE_FILTERS
-                    }, dojo.create("button", {}, holder)
-                );
-
+                this.filter_set_loader = new dijit.form.Button({
+                    "onClick": dojo.hitch(
+                        this, function() {
+                            this.saveFilters(
+                                /* XXX I know some find prompt() objectionable
+                                 * somehow, but I can't seem to type into any
+                                 * text inputs that I put inside TooltipDialog
+                                 * instances, so meh. */
+                                prompt(
+                                    pcFilterLocaleStrings.NAME_SAVED_FILTER_SET
+                                )
+                            );
+                        }
+                    ),
+                    "label": pcFilterLocaleStrings.SAVE_FILTERS
+                }, dojo.create("span", {}, holder));
             },
 
             "_buildButtons": function() {
@@ -854,6 +913,35 @@ if (!dojo._hasResource['openils.widget.PCrudFilterPane']) {
                 });
             },
 
+            "saveFilters": function(name, oncomplete) {
+                var filters_value = this.filter_row_manager.serialize();
+                var filter_set = new cfdfs();
+                filter_set.name(name);
+                filter_set.interface(this.savedFiltersInterface);
+                filter_set.owning_lib(openils.User.user.ws_ou());
+                filter_set.creator(openils.User.user.id()); /* not reliable */
+                filter_set.filters(filters_value);
+
+                (new openils.PermaCrud()).create(
+                    filter_set, {
+                        "oncomplete": dojo.hitch(this, function() {
+                            var selector = dojo.query(
+                                "select[multiple]",
+                                this.filter_set_loader.dropDown.domNode
+                            )[0];
+                            dojo.create(
+                                "option", {
+                                    "innerHTML": name,
+                                    "value": dojo.toJson([-1,
+                                        dojo.fromJson(filters_value)])
+                                }, selector
+                            );
+                            if (oncomplete) oncomplete();
+                        })
+                    }
+                );
+            },
+
             "hide": function() {
                 try {
                     this.inherited(arguments);
index 7e7128d..f86ba33 100644 (file)
@@ -20,5 +20,6 @@
     "LOAD_FILTERS": "Load Filters",
     "SAVE_FILTERS": "Save Filters",
     "CHOOSE_FILTER_TO_LOAD": "Choose filter sets to load",
-    "NAME_SAVED_FILTER_SET": "Enter a name for your saved filter set:"
+    "NAME_SAVED_FILTER_SET": "Enter a name for your saved filter set:",
+    "NEED_NAME": "You must enter a name for the saved filters."
 }