From: Lebbeous Fogle-Weekley Date: Wed, 12 Sep 2012 23:08:24 +0000 (-0400) Subject: Change order: Saving filter sets X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=d359400082f8f2984e5651c76d36ddce5f14e4af;p=evergreen%2Fequinox.git Change order: Saving filter sets Signed-off-by: Lebbeous Fogle-Weekley --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index aae485648f..0d178c721e 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -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"> - + diff --git a/Open-ILS/web/js/dojo/openils/widget/PCrudFilterPane.js b/Open-ILS/web/js/dojo/openils/widget/PCrudFilterPane.js index 4b071a6161..9aaa0b1832 100644 --- a/Open-ILS/web/js/dojo/openils/widget/PCrudFilterPane.js +++ b/Open-ILS/web/js/dojo/openils/widget/PCrudFilterPane.js @@ -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 + - " " - }); - 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); diff --git a/Open-ILS/web/js/dojo/openils/widget/nls/PCrudFilterPane.js b/Open-ILS/web/js/dojo/openils/widget/nls/PCrudFilterPane.js index 7e7128df8d..f86ba33885 100644 --- a/Open-ILS/web/js/dojo/openils/widget/nls/PCrudFilterPane.js +++ b/Open-ILS/web/js/dojo/openils/widget/nls/PCrudFilterPane.js @@ -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." }