API Docs for: 1.0.0
Show:

File: src/gallery-querybuilder/js/Select.js

/**
 * @module gallery-querybuilder
 */

/**********************************************************************
 * Plugin for choosing from a list of values.  In the `var_list`
 * configuration, specify `value_list` as a list of objects, each defining
 * `value` and `text`.
 * 
 * There must be exactly one operator specified for this plugin.
 * 
 * The `value` argument passed to `QueryBuilder.appendNew()` can be a
 * string (the value of the menu item to select) or an array with two
 * elements (`[ operator, value ]`).
 * 
 * @namespace QueryBuilder
 * @class Select
 */

QueryBuilder.Select = function(
	/* object */	query_builder,
	/* object */	config)
{
	this.qb = query_builder;

	this.val_input_name_pattern = config.field_prefix + 'query_val_{i}';
};

QueryBuilder.Select.prototype =
{
	create: function(
		/* int */		query_index,
		/* object */	var_config,
		/* array */		op_list,
		/* string */	value)
	{
		var value_cell = this.qb._createContainer();
		value_cell.set('className', this.qb.getClassName('value'));
		value_cell.set('innerHTML', this._valuesMenu(this.valueName(query_index)));
		this.value_menu = value_cell.one('select');

		var options    = this.value_menu.getDOMNode().options;
		var value_list = var_config.value_list;
		for (var i=0; i<value_list.length; i++)
		{
			options[i] = new Option(value_list[i].text, value_list[i].value);
		}

		var is_array = Y.Lang.isArray(value);
		if (is_array && value[0] == op_list[0])
		{
			this.value_menu.set('value', value[1]);
		}
		else if (!is_array && Y.Lang.isValue(value))
		{
			this.value_menu.set('value', value);
		}

		if (has_bubble_problem)
		{
			this.value_menu.on('change', this.qb._notifyChanged, this.qb);
		}

		this.db_query_equals = op_list[0];

		return [ value_cell ];
	},

	postCreate: function(
		/* int */		query_index,
		/* object */	var_config,
		/* array */		op_list,
		/* array */		value)
	{
		if (this.value_menu)		// could be destroyed
		{
			this.value_menu.focus();
		}
	},

	destroy: function()
	{
		this.value_menu.remove(true);
		this.value_menu = null;
	},

	updateName: function(
		/* int */	new_index)
	{
		this.value_menu.setAttribute('name', this.valueName(new_index));
	},

	toDatabaseQuery: function()
	{
		return [ [ this.db_query_equals, this.value_menu.get('value') ] ];
	},

	/* *********************************************************************
	 * Form element names.
	 */

	valueName: function(
		/* int */	i)
	{
		return Y.Lang.sub(this.val_input_name_pattern, {i:i});
	},

	//
	// Markup
	//

	_valuesMenu: function(
		/* string */	menu_name)
	{
		// This must use a select tag!

		var markup = '<select name="{n}" class="{f} {c}" />';

		return Y.Lang.sub(markup,
		{
			n: menu_name,
			f: Y.FormManager.field_marker_class,
			c: this.qb.getClassName('field')
		});
	}
};