123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- if (!dojo._hasResource["dijit.form.FilteringSelect"]) { // _hasResource checks
- // added by build. Do
- // not use _hasResource
- // directly in your
- // code.
- dojo._hasResource["dijit.form.FilteringSelect"] = true;
- dojo.provide("dijit.form.FilteringSelect");
- dojo.require("dijit.form.ComboBox");
- dojo.declare("dijit.form.FilteringSelect", [dijit.form.MappedTextBox,
- dijit.form.ComboBoxMixin], {
- /*
- * summary Enhanced version of HTML's <select> tag.
- *
- * Similar features: - There is a drop down list of possible
- * values. - You can only enter a value from the drop down list.
- * (You can't enter an arbitrary value.) - The value submitted
- * with the form is the hidden value (ex: CA), not the displayed
- * value a.k.a. label (ex: California)
- *
- * Enhancements over plain HTML version: - If you type in some
- * text then it will filter down the list of possible values in
- * the drop down list. - List can be specified either as a
- * static list or via a javascript function (that can get the
- * list from a server)
- */
- // searchAttr: String
- // Searches pattern match against this field
- // labelAttr: String
- // Optional. The text that actually appears in the drop down.
- // If not specified, the searchAttr text is used instead.
- labelAttr : "",
- // labelType: String
- // "html" or "text"
- labelType : "text",
- _isvalid : true,
- isValid : function() {
- return this._isvalid;
- },
- _callbackSetLabel : function(/* Array */result, /* Object */
- dataObject, /* Boolean, optional */priorityChange) {
- // summary
- // Callback function that dynamically sets the label of the
- // ComboBox
- // setValue does a synchronous lookup,
- // so it calls _callbackSetLabel directly,
- // and so does not pass dataObject
- // dataObject==null means do not test the lastQuery, just
- // continue
- if (dataObject
- && dataObject.query[this.searchAttr] != this._lastQuery) {
- return;
- }
- if (!result.length) {
- // #3268: do nothing on bad input
- // this._setValue("", "");
- // #3285: change CSS to indicate error
- if (!this._hasFocus) {
- this.valueNode.value = "";
- }
- dijit.form.TextBox.superclass.setValue.call(this,
- undefined, !this._hasFocus);
- this._isvalid = false;
- this.validate(this._hasFocus);
- } else {
- this._setValueFromItem(result[0], priorityChange);
- }
- },
- _openResultList : function(/* Object */results, /* Object */
- dataObject) {
- // #3285: tap into search callback to see if user's query
- // resembles a match
- if (dataObject.query[this.searchAttr] != this._lastQuery) {
- return;
- }
- this._isvalid = results.length != 0;
- this.validate(true);
- dijit.form.ComboBoxMixin.prototype._openResultList.apply(
- this, arguments);
- },
- getValue : function() {
- // don't get the textbox value but rather the previously set
- // hidden value
- return this.valueNode.value;
- },
- _getValueField : function() {
- // used for option tag selects
- return "value";
- },
- _setValue : function(/* String */value, /* String */
- displayedValue, /* Boolean, optional */priorityChange) {
- this.valueNode.value = value;
- dijit.form.FilteringSelect.superclass.setValue.call(this,
- value, priorityChange, displayedValue);
- this._lastDisplayedValue = displayedValue;
- },
- setValue : function(/* String */value, /* Boolean, optional */
- priorityChange) {
- // summary
- // Sets the value of the select.
- // Also sets the label to the corresponding value by reverse
- // lookup.
- // #3347: fetchItemByIdentity if no keyAttr specified
- var self = this;
- var handleFetchByIdentity = function(item, priorityChange) {
- if (item) {
- if (self.store.isItemLoaded(item)) {
- self._callbackSetLabel([item], undefined,
- priorityChange);
- } else {
- self.store.loadItem({
- item : item,
- onItem : function(result,
- dataObject) {
- self._callbackSetLabel(result,
- dataObject,
- priorityChange)
- }
- });
- }
- } else {
- self._isvalid = false;
- // prevent errors from Tooltip not being created yet
- self.validate(false);
- }
- }
- this.store.fetchItemByIdentity({
- identity : value,
- onItem : function(item) {
- handleFetchByIdentity(item, priorityChange)
- }
- });
- },
- _setValueFromItem : function(/* item */item, /* Boolean, optional */
- priorityChange) {
- // summary
- // Set the displayed valued in the input box, based on a
- // selected item.
- // Users shouldn't call this function; they should be
- // calling setDisplayedValue() instead
- this._isvalid = true;
- this._setValue(this.store.getIdentity(item), this
- .labelFunc(item, this.store),
- priorityChange);
- },
- labelFunc : function(/* item */item, /* dojo.data.store */store) {
- // summary: Event handler called when the label changes
- // returns the label that the ComboBox should display
- return store.getValue(item, this.searchAttr);
- },
- onkeyup : function(/* Event */evt) {
- // summary: internal function
- // FilteringSelect needs to wait for the complete label
- // before committing to a reverse lookup
- // this.setDisplayedValue(this.textbox.value);
- },
- _doSelect : function(/* Event */tgt) {
- // summary:
- // ComboBox's menu callback function
- // FilteringSelect overrides this to set both the visible
- // and hidden value from the information stored in the menu
- this.item = tgt.item;
- this._setValueFromItem(tgt.item, true);
- },
- setDisplayedValue : function(/* String */label) {
- // summary:
- // Set textbox to display label
- // Also performs reverse lookup to set the hidden value
- // Used in InlineEditBox
- if (this.store) {
- var query = {};
- this._lastQuery = query[this.searchAttr] = label;
- // if the label is not valid, the callback will never
- // set it,
- // so the last valid value will get the warning textbox
- // set the textbox value now so that the impending
- // warning will make sense to the user
- this.textbox.value = label;
- this._lastDisplayedValue = label;
- this.store.fetch({
- query : query,
- queryOptions : {
- ignoreCase : this.ignoreCase,
- deep : true
- },
- onComplete : dojo.hitch(this,
- this._callbackSetLabel)
- });
- }
- },
- _getMenuLabelFromItem : function(/* Item */item) {
- // internal function to help ComboBoxMenu figure out what to
- // display
- if (this.labelAttr) {
- return {
- html : this.labelType == "html",
- label : this.store.getValue(item, this.labelAttr)
- };
- } else {
- // because this function is called by ComboBoxMenu,
- // this.inherited tries to find the superclass of
- // ComboBoxMenu
- return dijit.form.ComboBoxMixin.prototype._getMenuLabelFromItem
- .apply(this, arguments);
- }
- },
- postMixInProperties : function() {
- dijit.form.ComboBoxMixin.prototype.postMixInProperties
- .apply(this, arguments);
- dijit.form.MappedTextBox.prototype.postMixInProperties
- .apply(this, arguments);
- }
- });
- }
|