]> git.wh0rd.org - tt-rss.git/blobdiff - lib/dijit/form/_FormSelectWidget.js
lib: Upgrade Dojo and Dijit from 1.8.3 to 1.12.1
[tt-rss.git] / lib / dijit / form / _FormSelectWidget.js
index fbbf7226bb61ded557e8a81436c06fce1454c4a6..58c34e0a2a6ec0852ec237edb268cba5605eb0e6 100644 (file)
@@ -1,582 +1,2 @@
-/*
-       Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
-       Available via Academic Free License >= 2.1 OR the modified BSD license.
-       see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form._FormSelectWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form._FormSelectWidget"] = true;
-dojo.provide("dijit.form._FormSelectWidget");
-dojo.require("dijit.form._FormWidget");
-dojo.require("dojo.data.util.sorter");
-
-
-/*=====
-dijit.form.__SelectOption = function(){
-       // value: String
-       //              The value of the option.  Setting to empty (or missing) will
-       //              place a separator at that location
-       // label: String
-       //              The label for our option.  It can contain html tags.
-       // selected: Boolean
-       //              Whether or not we are a selected option
-       // disabled: Boolean
-       //              Whether or not this specific option is disabled
-       this.value = value;
-       this.label = label;
-       this.selected = selected;
-       this.disabled = disabled;
-}
-=====*/
-
-dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
-       // summary:
-       //              Extends _FormValueWidget in order to provide "select-specific"
-       //              values - i.e., those values that are unique to <select> elements.
-       //              This also provides the mechanism for reading the elements from
-       //              a store, if desired.
-
-       // multiple: [const] Boolean
-       //              Whether or not we are multi-valued
-       multiple: false,
-
-       // options: dijit.form.__SelectOption[]
-       //              The set of options for our select item.  Roughly corresponds to
-       //              the html <option> tag.
-       options: null,
-
-       // store: dojo.data.api.Identity
-       //              A store which, at the very least impelements dojo.data.api.Identity
-       //              to use for getting our list of options - rather than reading them
-       //              from the <option> html tags.
-       store: null,
-
-       // query: object
-       //              A query to use when fetching items from our store
-       query: null,
-
-       // queryOptions: object
-       //              Query options to use when fetching from the store
-       queryOptions: null,
-
-       // onFetch: Function
-       //              A callback to do with an onFetch - but before any items are actually
-       //              iterated over (i.e. to filter even futher what you want to add)
-       onFetch: null,
-
-       // sortByLabel: Boolean
-       //              Flag to sort the options returned from a store by the label of
-       //              the store.
-       sortByLabel: true,
-
-
-       // loadChildrenOnOpen: Boolean
-       //              By default loadChildren is called when the items are fetched from the
-       //              store.  This property allows delaying loadChildren (and the creation
-       //              of the options/menuitems) until the user clicks the button to open the
-       //              dropdown.
-       loadChildrenOnOpen: false,
-
-       getOptions: function(/*anything*/ valueOrIdx){
-               // summary:
-               //              Returns a given option (or options).
-               // valueOrIdx:
-               //              If passed in as a string, that string is used to look up the option
-               //              in the array of options - based on the value property.
-               //              (See dijit.form.__SelectOption).
-               //
-               //              If passed in a number, then the option with the given index (0-based)
-               //              within this select will be returned.
-               //
-               //              If passed in a dijit.form.__SelectOption, the same option will be
-               //              returned if and only if it exists within this select.
-               //
-               //              If passed an array, then an array will be returned with each element
-               //              in the array being looked up.
-               //
-               //              If not passed a value, then all options will be returned
-               //
-               // returns:
-               //              The option corresponding with the given value or index.  null
-               //              is returned if any of the following are true:
-               //                      - A string value is passed in which doesn't exist
-               //                      - An index is passed in which is outside the bounds of the array of options
-               //                      - A dijit.form.__SelectOption is passed in which is not a part of the select
-
-               // NOTE: the compare for passing in a dijit.form.__SelectOption checks
-               //              if the value property matches - NOT if the exact option exists
-               // NOTE: if passing in an array, null elements will be placed in the returned
-               //              array when a value is not found.
-               var lookupValue = valueOrIdx, opts = this.options || [], l = opts.length;
-
-               if(lookupValue === undefined){
-                       return opts; // dijit.form.__SelectOption[]
-               }
-               if(dojo.isArray(lookupValue)){
-                       return dojo.map(lookupValue, "return this.getOptions(item);", this); // dijit.form.__SelectOption[]
-               }
-               if(dojo.isObject(valueOrIdx)){
-                       // We were passed an option - so see if it's in our array (directly),
-                       // and if it's not, try and find it by value.
-                       if(!dojo.some(this.options, function(o, idx){
-                               if(o === lookupValue ||
-                                       (o.value && o.value === lookupValue.value)){
-                                       lookupValue = idx;
-                                       return true;
-                               }
-                               return false;
-                       })){
-                               lookupValue = -1;
-                       }
-               }
-               if(typeof lookupValue == "string"){
-                       for(var i=0; i<l; i++){
-                               if(opts[i].value === lookupValue){
-                                       lookupValue = i;
-                                       break;
-                               }
-                       }
-               }
-               if(typeof lookupValue == "number" && lookupValue >= 0 && lookupValue < l){
-                       return this.options[lookupValue] // dijit.form.__SelectOption
-               }
-               return null; // null
-       },
-
-       addOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ option){
-               // summary:
-               //              Adds an option or options to the end of the select.  If value
-               //              of the option is empty or missing, a separator is created instead.
-               //              Passing in an array of options will yield slightly better performance
-               //              since the children are only loaded once.
-               if(!dojo.isArray(option)){ option = [option]; }
-               dojo.forEach(option, function(i){
-                       if(i && dojo.isObject(i)){
-                               this.options.push(i);
-                       }
-               }, this);
-               this._loadChildren();
-       },
-
-       removeOption: function(/*String|dijit.form.__SelectOption|Number|Array*/ valueOrIdx){
-               // summary:
-               //              Removes the given option or options.  You can remove by string
-               //              (in which case the value is removed), number (in which case the
-               //              index in the options array is removed), or select option (in
-               //              which case, the select option with a matching value is removed).
-               //              You can also pass in an array of those values for a slightly
-               //              better performance since the children are only loaded once.
-               if(!dojo.isArray(valueOrIdx)){ valueOrIdx = [valueOrIdx]; }
-               var oldOpts = this.getOptions(valueOrIdx);
-               dojo.forEach(oldOpts, function(i){
-                       // We can get null back in our array - if our option was not found.  In
-                       // that case, we don't want to blow up...
-                       if(i){
-                               this.options = dojo.filter(this.options, function(node, idx){
-                                       return (node.value !== i.value || node.label !== i.label);
-                               });
-                               this._removeOptionItem(i);
-                       }
-               }, this);
-               this._loadChildren();
-       },
-
-       updateOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ newOption){
-               // summary:
-               //              Updates the values of the given option.  The option to update
-               //              is matched based on the value of the entered option.  Passing
-               //              in an array of new options will yeild better performance since
-               //              the children will only be loaded once.
-               if(!dojo.isArray(newOption)){ newOption = [newOption]; }
-               dojo.forEach(newOption, function(i){
-                       var oldOpt = this.getOptions(i), k;
-                       if(oldOpt){
-                               for(k in i){ oldOpt[k] = i[k]; }
-                       }
-               }, this);
-               this._loadChildren();
-       },
-
-       setStore: function(/*dojo.data.api.Identity*/ store,
-                                               /*anything?*/ selectedValue,
-                                               /*Object?*/ fetchArgs){
-               // summary:
-               //              Sets the store you would like to use with this select widget.
-               //              The selected value is the value of the new store to set.  This
-               //              function returns the original store, in case you want to reuse
-               //              it or something.
-               // store: dojo.data.api.Identity
-               //              The store you would like to use - it MUST implement Identity,
-               //              and MAY implement Notification.
-               // selectedValue: anything?
-               //              The value that this widget should set itself to *after* the store
-               //              has been loaded
-               // fetchArgs: Object?
-               //              The arguments that will be passed to the store's fetch() function
-               var oStore = this.store;
-               fetchArgs = fetchArgs || {};
-               if(oStore !== store){
-                       // Our store has changed, so update our notifications
-                       dojo.forEach(this._notifyConnections || [], dojo.disconnect);
-                       delete this._notifyConnections;
-                       if(store && store.getFeatures()["dojo.data.api.Notification"]){
-                               this._notifyConnections = [
-                                       dojo.connect(store, "onNew", this, "_onNewItem"),
-                                       dojo.connect(store, "onDelete", this, "_onDeleteItem"),
-                                       dojo.connect(store, "onSet", this, "_onSetItem")
-                               ];
-                       }
-                       this._set("store", store);
-               }
-
-               // Turn off change notifications while we make all these changes
-               this._onChangeActive = false;
-
-               // Remove existing options (if there are any)
-               if(this.options && this.options.length){
-                       this.removeOption(this.options);
-               }
-
-               // Add our new options
-               if(store){
-                       this._loadingStore = true;
-                       store.fetch(dojo.delegate(fetchArgs, {
-                               onComplete: function(items, opts){
-                                       if(this.sortByLabel && !fetchArgs.sort && items.length){
-                                               items.sort(dojo.data.util.sorter.createSortFunction([{
-                                                       attribute: store.getLabelAttributes(items[0])[0]
-                                               }], store));
-                                       }
-       
-                                       if(fetchArgs.onFetch){
-                                                       items = fetchArgs.onFetch.call(this, items, opts);
-                                       }
-                                       // TODO: Add these guys as a batch, instead of separately
-                                       dojo.forEach(items, function(i){
-                                               this._addOptionForItem(i);
-                                       }, this);
-       
-                                       // Set our value (which might be undefined), and then tweak
-                                       // it to send a change event with the real value
-                                       this._loadingStore = false;
-                                               this.set("value", "_pendingValue" in this ? this._pendingValue : selectedValue);
-                                       delete this._pendingValue;
-       
-                                       if(!this.loadChildrenOnOpen){
-                                               this._loadChildren();
-                                       }else{
-                                               this._pseudoLoadChildren(items);
-                                       }
-                                       this._fetchedWith = opts;
-                                       this._lastValueReported = this.multiple ? [] : null;
-                                       this._onChangeActive = true;
-                                       this.onSetStore();
-                                       this._handleOnChange(this.value);
-                               },
-                               scope: this
-                       }));
-               }else{
-                       delete this._fetchedWith;
-               }
-               return oStore;  // dojo.data.api.Identity
-       },
-
-       // TODO: implement set() and watch() for store and query, although not sure how to handle
-       // setting them individually rather than together (as in setStore() above)
-
-       _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){
-               // summary:
-               //              set the value of the widget.
-               //              If a string is passed, then we set our value from looking it up.
-               if(this._loadingStore){
-                       // Our store is loading - so save our value, and we'll set it when
-                       // we're done
-                       this._pendingValue = newValue;
-                       return;
-               }
-               var opts = this.getOptions() || [];
-               if(!dojo.isArray(newValue)){
-                       newValue = [newValue];
-               }
-               dojo.forEach(newValue, function(i, idx){
-                       if(!dojo.isObject(i)){
-                               i = i + "";
-                       }
-                       if(typeof i === "string"){
-                               newValue[idx] = dojo.filter(opts, function(node){
-                                       return node.value === i;
-                               })[0] || {value: "", label: ""};
-                       }
-               }, this);
-
-               // Make sure some sane default is set
-               newValue = dojo.filter(newValue, function(i){ return i && i.value; });
-               if(!this.multiple && (!newValue[0] || !newValue[0].value) && opts.length){
-                       newValue[0] = opts[0];
-               }
-               dojo.forEach(opts, function(i){
-                       i.selected = dojo.some(newValue, function(v){ return v.value === i.value; });
-               });
-               var val = dojo.map(newValue, function(i){ return i.value; }),
-                       disp = dojo.map(newValue, function(i){ return i.label; });
-
-               this._set("value", this.multiple ? val : val[0]);
-               this._setDisplay(this.multiple ? disp : disp[0]);
-               this._updateSelection();
-               this._handleOnChange(this.value, priorityChange);
-       },
-
-       _getDisplayedValueAttr: function(){
-               // summary:
-               //              returns the displayed value of the widget
-               var val = this.get("value");
-               if(!dojo.isArray(val)){
-                       val = [val];
-               }
-               var ret = dojo.map(this.getOptions(val), function(v){
-                       if(v && "label" in v){
-                               return v.label;
-                       }else if(v){
-                               return v.value;
-                       }
-                       return null;
-               }, this);
-               return this.multiple ? ret : ret[0];
-       },
-
-       _loadChildren: function(){
-               // summary:
-               //              Loads the children represented by this widget's options.
-               //              reset the menu to make it populatable on the next click
-               if(this._loadingStore){ return; }
-               dojo.forEach(this._getChildren(), function(child){
-                       child.destroyRecursive();
-               });
-               // Add each menu item
-               dojo.forEach(this.options, this._addOptionItem, this);
-
-               // Update states
-               this._updateSelection();
-       },
-
-       _updateSelection: function(){
-               // summary:
-               //              Sets the "selected" class on the item for styling purposes
-               this._set("value", this._getValueFromOpts());
-               var val = this.value;
-               if(!dojo.isArray(val)){
-                       val = [val];
-               }
-               if(val && val[0]){
-                       dojo.forEach(this._getChildren(), function(child){
-                               var isSelected = dojo.some(val, function(v){
-                                       return child.option && (v === child.option.value);
-                               });
-                               dojo.toggleClass(child.domNode, this.baseClass + "SelectedOption", isSelected);
-                               dijit.setWaiState(child.domNode, "selected", isSelected);
-                       }, this);
-               }
-       },
-
-       _getValueFromOpts: function(){
-               // summary:
-               //              Returns the value of the widget by reading the options for
-               //              the selected flag
-               var opts = this.getOptions() || [];
-               if(!this.multiple && opts.length){
-                       // Mirror what a select does - choose the first one
-                       var opt = dojo.filter(opts, function(i){
-                               return i.selected;
-                       })[0];
-                       if(opt && opt.value){
-                               return opt.value
-                       }else{
-                               opts[0].selected = true;
-                               return opts[0].value;
-                       }
-               }else if(this.multiple){
-                       // Set value to be the sum of all selected
-                       return dojo.map(dojo.filter(opts, function(i){
-                               return i.selected;
-                       }), function(i){
-                               return i.value;
-                       }) || [];
-               }
-               return "";
-       },
-
-       // Internal functions to call when we have store notifications come in
-       _onNewItem: function(/*item*/ item, /*Object?*/ parentInfo){
-               if(!parentInfo || !parentInfo.parent){
-                       // Only add it if we are top-level
-                       this._addOptionForItem(item);
-               }
-       },
-       _onDeleteItem: function(/*item*/ item){
-               var store = this.store;
-               this.removeOption(store.getIdentity(item));
-       },
-       _onSetItem: function(/*item*/ item){
-               this.updateOption(this._getOptionObjForItem(item));
-       },
-
-       _getOptionObjForItem: function(item){
-               // summary:
-               //              Returns an option object based off the given item.  The "value"
-               //              of the option item will be the identity of the item, the "label"
-               //              of the option will be the label of the item.  If the item contains
-               //              children, the children value of the item will be set
-               var store = this.store, label = store.getLabel(item),
-                       value = (label ? store.getIdentity(item) : null);
-               return {value: value, label: label, item:item}; // dijit.form.__SelectOption
-       },
-
-       _addOptionForItem: function(/*item*/ item){
-               // summary:
-               //              Creates (and adds) the option for the given item
-               var store = this.store;
-               if(!store.isItemLoaded(item)){
-                       // We are not loaded - so let's load it and add later
-                       store.loadItem({item: item, onComplete: function(i){
-                               this._addOptionForItem(item);
-                       },
-                       scope: this});
-                       return;
-               }
-               var newOpt = this._getOptionObjForItem(item);
-               this.addOption(newOpt);
-       },
-
-       constructor: function(/*Object*/ keywordArgs){
-               // summary:
-               //              Saves off our value, if we have an initial one set so we
-               //              can use it if we have a store as well (see startup())
-               this._oValue = (keywordArgs || {}).value || null;
-       },
-
-       buildRendering: function(){
-               this.inherited(arguments);
-               dojo.setSelectable(this.focusNode, false);
-       },
-
-       _fillContent: function(){
-               // summary:
-               //              Loads our options and sets up our dropdown correctly.  We
-               //              don't want any content, so we don't call any inherit chain
-               //              function.
-               var opts = this.options;
-               if(!opts){
-                       opts = this.options = this.srcNodeRef ? dojo.query(">",
-                                               this.srcNodeRef).map(function(node){
-                                                       if(node.getAttribute("type") === "separator"){
-                                                               return { value: "", label: "", selected: false, disabled: false };
-                                                       }
-                                                       return {
-                                                               value: (node.getAttribute("data-" + dojo._scopeName + "-value") || node.getAttribute("value")),
-                                                                               label: String(node.innerHTML),
-                                                               // FIXME: disabled and selected are not valid on complex markup children (which is why we're
-                                                               // looking for data-dojo-value above.  perhaps we should data-dojo-props="" this whole thing?)
-                                                               // decide before 1.6
-                                                                               selected: node.getAttribute("selected") || false,
-                                                               disabled: node.getAttribute("disabled") || false
-                                                       };
-                                               }, this) : [];
-               }
-               if(!this.value){
-                       this._set("value", this._getValueFromOpts());
-               }else if(this.multiple && typeof this.value == "string"){
-                       this_set("value", this.value.split(","));
-               }
-       },
-
-       postCreate: function(){
-               // summary:
-               //              sets up our event handling that we need for functioning
-               //              as a select
-               this.inherited(arguments);
-
-               // Make our event connections for updating state
-               this.connect(this, "onChange", "_updateSelection");
-               this.connect(this, "startup", "_loadChildren");
-
-               this._setValueAttr(this.value, null);
-       },
-
-       startup: function(){
-               // summary:
-               //              Connects in our store, if we have one defined
-               this.inherited(arguments);
-               var store = this.store, fetchArgs = {};
-               dojo.forEach(["query", "queryOptions", "onFetch"], function(i){
-                       if(this[i]){
-                               fetchArgs[i] = this[i];
-                       }
-                       delete this[i];
-               }, this);
-               if(store && store.getFeatures()["dojo.data.api.Identity"]){
-                       // Temporarily set our store to null so that it will get set
-                       // and connected appropriately
-                       this.store = null;
-                       this.setStore(store, this._oValue, fetchArgs);
-               }
-       },
-
-       destroy: function(){
-               // summary:
-               //              Clean up our connections
-               dojo.forEach(this._notifyConnections || [], dojo.disconnect);
-               this.inherited(arguments);
-       },
-
-       _addOptionItem: function(/*dijit.form.__SelectOption*/ option){
-               // summary:
-               //              User-overridable function which, for the given option, adds an
-               //              item to the select.  If the option doesn't have a value, then a
-               //              separator is added in that place.  Make sure to store the option
-               //              in the created option widget.
-       },
-
-       _removeOptionItem: function(/*dijit.form.__SelectOption*/ option){
-               // summary:
-               //              User-overridable function which, for the given option, removes
-               //              its item from the select.
-       },
-
-       _setDisplay: function(/*String or String[]*/ newDisplay){
-               // summary:
-               //              Overridable function which will set the display for the
-               //              widget.  newDisplay is either a string (in the case of
-               //              single selects) or array of strings (in the case of multi-selects)
-       },
-
-       _getChildren: function(){
-               // summary:
-               //              Overridable function to return the children that this widget contains.
-               return [];
-       },
-
-       _getSelectedOptionsAttr: function(){
-               // summary:
-               //              hooks into this.attr to provide a mechanism for getting the
-               //              option items for the current value of the widget.
-               return this.getOptions(this.get("value"));
-       },
-
-       _pseudoLoadChildren: function(/*item[]*/ items){
-               // summary:
-               //              a function that will "fake" loading children, if needed, and
-               //              if we have set to not load children until the widget opens.
-               // items:
-               //              An array of items that will be loaded, when needed
-       },
-
-       onSetStore: function(){
-               // summary:
-               //              a function that can be connected to in order to receive a
-               //              notification that the store has finished loading and all options
-               //              from that store are available
-       }
-});
-
-}
+//>>built
+define("dijit/form/_FormSelectWidget",["dojo/_base/array","dojo/_base/Deferred","dojo/aspect","dojo/data/util/sorter","dojo/_base/declare","dojo/dom","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/query","dojo/when","dojo/store/util/QueryResults","./_FormValueWidget"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d){var _e=_5("dijit.form._FormSelectWidget",_d,{multiple:false,options:null,store:null,_setStoreAttr:function(_f){if(this._created){this._deprecatedSetStore(_f);}},query:null,_setQueryAttr:function(_10){if(this._created){this._deprecatedSetStore(this.store,this.selectedValue,{query:_10});}},queryOptions:null,_setQueryOptionsAttr:function(_11){if(this._created){this._deprecatedSetStore(this.store,this.selectedValue,{queryOptions:_11});}},labelAttr:"",onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,onLoadDeferred:null,getOptions:function(_12){var _13=this.options||[];if(_12==null){return _13;}if(_9.isArrayLike(_12)){return _1.map(_12,"return this.getOptions(item);",this);}if(_9.isString(_12)){_12={value:_12};}if(_9.isObject(_12)){if(!_1.some(_13,function(_14,idx){for(var a in _12){if(!(a in _14)||_14[a]!=_12[a]){return false;}}_12=idx;return true;})){_12=-1;}}if(_12>=0&&_12<_13.length){return _13[_12];}return null;},addOption:function(_15){_1.forEach(_9.isArrayLike(_15)?_15:[_15],function(i){if(i&&_9.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_16){var _17=this.getOptions(_9.isArrayLike(_16)?_16:[_16]);_1.forEach(_17,function(_18){if(_18){this.options=_1.filter(this.options,function(_19){return (_19.value!==_18.value||_19.label!==_18.label);});this._removeOptionItem(_18);}},this);this._loadChildren();},updateOption:function(_1a){_1.forEach(_9.isArrayLike(_1a)?_1a:[_1a],function(i){var _1b=this.getOptions({value:i.value}),k;if(_1b){for(k in i){_1b[k]=i[k];}}},this);this._loadChildren();},setStore:function(_1c,_1d,_1e){_8.deprecated(this.declaredClass+"::setStore(store, selectedValue, fetchArgs) is deprecated. Use set('query', fetchArgs.query), set('queryOptions', fetchArgs.queryOptions), set('store', store), or set('value', selectedValue) instead.","","2.0");this._deprecatedSetStore(_1c,_1d,_1e);},_deprecatedSetStore:function(_1f,_20,_21){var _22=this.store;_21=_21||{};if(_22!==_1f){var h;while((h=this._notifyConnections.pop())){h.remove();}if(!_1f.get){_9.mixin(_1f,{_oldAPI:true,get:function(id){var _23=new _2();this.fetchItemByIdentity({identity:id,onItem:function(_24){_23.resolve(_24);},onError:function(_25){_23.reject(_25);}});return _23.promise;},query:function(_26,_27){var _28=new _2(function(){if(_29.abort){_29.abort();}});_28.total=new _2();var _29=this.fetch(_9.mixin({query:_26,onBegin:function(_2a){_28.total.resolve(_2a);},onComplete:function(_2b){_28.resolve(_2b);},onError:function(_2c){_28.reject(_2c);}},_27));return new _c(_28);}});if(_1f.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[_3.after(_1f,"onNew",_9.hitch(this,"_onNewItem"),true),_3.after(_1f,"onDelete",_9.hitch(this,"_onDeleteItem"),true),_3.after(_1f,"onSet",_9.hitch(this,"_onSetItem"),true)];}}this._set("store",_1f);}if(this.options&&this.options.length){this.removeOption(this.options);}if(this._queryRes&&this._queryRes.close){this._queryRes.close();}if(this._observeHandle&&this._observeHandle.remove){this._observeHandle.remove();this._observeHandle=null;}if(_21.query){this._set("query",_21.query);}if(_21.queryOptions){this._set("queryOptions",_21.queryOptions);}if(_1f&&_1f.query){this._loadingStore=true;this.onLoadDeferred=new _2();this._queryRes=_1f.query(this.query,this.queryOptions);_b(this._queryRes,_9.hitch(this,function(_2d){if(this.sortByLabel&&!_21.sort&&_2d.length){if(_1f.getValue){_2d.sort(_4.createSortFunction([{attribute:_1f.getLabelAttributes(_2d[0])[0]}],_1f));}else{var _2e=this.labelAttr;_2d.sort(function(a,b){return a[_2e]>b[_2e]?1:b[_2e]>a[_2e]?-1:0;});}}if(_21.onFetch){_2d=_21.onFetch.call(this,_2d,_21);}_1.forEach(_2d,function(i){this._addOptionForItem(i);},this);if(this._queryRes.observe){this._observeHandle=this._queryRes.observe(_9.hitch(this,function(_2f,_30,_31){if(_30==_31){this._onSetItem(_2f);}else{if(_30!=-1){this._onDeleteItem(_2f);}if(_31!=-1){this._onNewItem(_2f);}}}),true);}this._loadingStore=false;this.set("value","_pendingValue" in this?this._pendingValue:_20);delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_2d);}this.onLoadDeferred.resolve(true);this.onSetStore();}),_9.hitch(this,function(err){console.error("dijit.form.Select: "+err.toString());this.onLoadDeferred.reject(err);}));}return _22;},_setValueAttr:function(_32,_33){if(!this._onChangeActive){_33=null;}if(this._loadingStore){this._pendingValue=_32;return;}if(_32==null){return;}if(_9.isArrayLike(_32)){_32=_1.map(_32,function(_34){return _9.isObject(_34)?_34:{value:_34};});}else{if(_9.isObject(_32)){_32=[_32];}else{_32=[{value:_32}];}}_32=_1.filter(this.getOptions(_32),function(i){return i&&i.value;});var _35=this.getOptions()||[];if(!this.multiple&&(!_32[0]||!_32[0].value)&&!!_35.length){_32[0]=_35[0];}_1.forEach(_35,function(opt){opt.selected=_1.some(_32,function(v){return v.value===opt.value;});});var val=_1.map(_32,function(opt){return opt.value;});if(typeof val=="undefined"||typeof val[0]=="undefined"){return;}var _36=_1.map(_32,function(opt){return opt.label;});this._setDisplay(this.multiple?_36:_36[0]);this.inherited(arguments,[this.multiple?val:val[0],_33]);this._updateSelection();},_getDisplayedValueAttr:function(){var ret=_1.map([].concat(this.get("selectedOptions")),function(v){if(v&&"label" in v){return v.label;}else{if(v){return v.value;}}return null;},this);return this.multiple?ret:ret[0];},_setDisplayedValueAttr:function(_37){this.set("value",this.getOptions(typeof _37=="string"?{label:_37}:_37));},_loadChildren:function(){if(this._loadingStore){return;}_1.forEach(this._getChildren(),function(_38){_38.destroyRecursive();});_1.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this.focusedChild=null;this._set("value",this._getValueFromOpts());var val=[].concat(this.value);if(val&&val[0]){var _39=this;_1.forEach(this._getChildren(),function(_3a){var _3b=_1.some(val,function(v){return _3a.option&&(v===_3a.option.value);});if(_3b&&!_39.multiple){_39.focusedChild=_3a;}_7.toggle(_3a.domNode,this.baseClass.replace(/\s+|$/g,"SelectedOption "),_3b);_3a.domNode.setAttribute("aria-selected",_3b?"true":"false");},this);}},_getValueFromOpts:function(){var _3c=this.getOptions()||[];if(!this.multiple&&_3c.length){var opt=_1.filter(_3c,function(i){return i.selected;})[0];if(opt&&opt.value){return opt.value;}else{_3c[0].selected=true;return _3c[0].value;}}else{if(this.multiple){return _1.map(_1.filter(_3c,function(i){return i.selected;}),function(i){return i.value;})||[];}}return "";},_onNewItem:function(_3d,_3e){if(!_3e||!_3e.parent){this._addOptionForItem(_3d);}},_onDeleteItem:function(_3f){var _40=this.store;this.removeOption({value:_40.getIdentity(_3f)});},_onSetItem:function(_41){this.updateOption(this._getOptionObjForItem(_41));},_getOptionObjForItem:function(_42){var _43=this.store,_44=(this.labelAttr&&this.labelAttr in _42)?_42[this.labelAttr]:_43.getLabel(_42),_45=(_44?_43.getIdentity(_42):null);return {value:_45,label:_44,item:_42};},_addOptionForItem:function(_46){var _47=this.store;if(_47.isItemLoaded&&!_47.isItemLoaded(_46)){_47.loadItem({item:_46,onItem:function(i){this._addOptionForItem(i);},scope:this});return;}var _48=this._getOptionObjForItem(_46);this.addOption(_48);},constructor:function(_49){this._oValue=(_49||{}).value||null;this._notifyConnections=[];},buildRendering:function(){this.inherited(arguments);_6.setSelectable(this.focusNode,false);},_fillContent:function(){if(!this.options){this.options=this.srcNodeRef?_a("> *",this.srcNodeRef).map(function(_4a){if(_4a.getAttribute("type")==="separator"){return {value:"",label:"",selected:false,disabled:false};}return {value:(_4a.getAttribute("data-"+_8._scopeName+"-value")||_4a.getAttribute("value")),label:String(_4a.innerHTML),selected:_4a.getAttribute("selected")||false,disabled:_4a.getAttribute("disabled")||false};},this):[];}if(!this.value){this._set("value",this._getValueFromOpts());}else{if(this.multiple&&typeof this.value=="string"){this._set("value",this.value.split(","));}}},postCreate:function(){this.inherited(arguments);_3.after(this,"onChange",_9.hitch(this,"_updateSelection"));var _4b=this.store;if(_4b&&(_4b.getIdentity||_4b.getFeatures()["dojo.data.api.Identity"])){this.store=null;this._deprecatedSetStore(_4b,this._oValue,{query:this.query,queryOptions:this.queryOptions});}this._storeInitialized=true;},startup:function(){this._loadChildren();this.inherited(arguments);},destroy:function(){var h;while((h=this._notifyConnections.pop())){h.remove();}if(this._queryRes&&this._queryRes.close){this._queryRes.close();}if(this._observeHandle&&this._observeHandle.remove){this._observeHandle.remove();this._observeHandle=null;}this.inherited(arguments);},_addOptionItem:function(){},_removeOptionItem:function(){},_setDisplay:function(){},_getChildren:function(){return [];},_getSelectedOptionsAttr:function(){return this.getOptions({selected:true});},_pseudoLoadChildren:function(){},onSetStore:function(){}});return _e;});
\ No newline at end of file