}
};
+ /* 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);
}
"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)
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) {
}
};
+ 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(
};
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() {
},
"_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() {
});
},
+ "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);