root / trunk / web / dojo / dijit / form / _FormSelectWidget.js
History | View | Annotate | Download (7.4 KB)
1 |
/*
|
---|---|
2 |
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
3 |
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
4 |
see: http://dojotoolkit.org/license for details
|
5 |
*/
|
6 |
|
7 |
|
8 |
if(!dojo._hasResource["dijit.form._FormSelectWidget"]){ |
9 |
dojo._hasResource["dijit.form._FormSelectWidget"]=true; |
10 |
dojo.provide("dijit.form._FormSelectWidget");
|
11 |
dojo.require("dijit.form._FormWidget");
|
12 |
dojo.require("dojo.data.util.sorter");
|
13 |
dojo.declare("dijit.form._FormSelectWidget",dijit.form._FormValueWidget,{multiple:false,options:null,store:null,query:null,queryOptions:null,onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,getOptions:function(_1){ |
14 |
var _2=_1,_3=this.options||[],l=_3.length; |
15 |
if(_2===undefined){ |
16 |
return _3;
|
17 |
} |
18 |
if(dojo.isArray(_2)){
|
19 |
return dojo.map(_2,"return this.getOptions(item);",this); |
20 |
} |
21 |
if(dojo.isObject(_1)){
|
22 |
if(!dojo.some(this.options,function(o,_4){ |
23 |
if(o===_2||(o.value&&o.value===_2.value)){
|
24 |
_2=_4; |
25 |
return true; |
26 |
} |
27 |
return false; |
28 |
})){ |
29 |
_2=-1;
|
30 |
} |
31 |
} |
32 |
if(typeof _2=="string"){ |
33 |
for(var i=0;i<l;i++){ |
34 |
if(_3[i].value===_2){
|
35 |
_2=i; |
36 |
break;
|
37 |
} |
38 |
} |
39 |
} |
40 |
if(typeof _2=="number"&&_2>=0&&_2<l){ |
41 |
return this.options[_2]; |
42 |
} |
43 |
return null; |
44 |
},addOption:function(_5){ |
45 |
if(!dojo.isArray(_5)){
|
46 |
_5=[_5]; |
47 |
} |
48 |
dojo.forEach(_5,function(i){
|
49 |
if(i&&dojo.isObject(i)){
|
50 |
this.options.push(i);
|
51 |
} |
52 |
},this);
|
53 |
this._loadChildren();
|
54 |
},removeOption:function(_6){ |
55 |
if(!dojo.isArray(_6)){
|
56 |
_6=[_6]; |
57 |
} |
58 |
var _7=this.getOptions(_6); |
59 |
dojo.forEach(_7,function(i){
|
60 |
if(i){
|
61 |
this.options=dojo.filter(this.options,function(_8,_9){ |
62 |
return (_8.value!==i.value);
|
63 |
}); |
64 |
this._removeOptionItem(i);
|
65 |
} |
66 |
},this);
|
67 |
this._loadChildren();
|
68 |
},updateOption:function(_a){ |
69 |
if(!dojo.isArray(_a)){
|
70 |
_a=[_a]; |
71 |
} |
72 |
dojo.forEach(_a,function(i){
|
73 |
var _b=this.getOptions(i),k; |
74 |
if(_b){
|
75 |
for(k in i){ |
76 |
_b[k]=i[k]; |
77 |
} |
78 |
} |
79 |
},this);
|
80 |
this._loadChildren();
|
81 |
},setStore:function(_c,_d,_e){ |
82 |
var _f=this.store; |
83 |
_e=_e||{}; |
84 |
if(_f!==_c){
|
85 |
dojo.forEach(this._notifyConnections||[],dojo.disconnect);
|
86 |
delete this._notifyConnections; |
87 |
if(_c&&_c.getFeatures()["dojo.data.api.Notification"]){ |
88 |
this._notifyConnections=[dojo.connect(_c,"onNew",this,"_onNewItem"),dojo.connect(_c,"onDelete",this,"_onDeleteItem"),dojo.connect(_c,"onSet",this,"_onSetItem")]; |
89 |
} |
90 |
this.store=_c;
|
91 |
} |
92 |
this._onChangeActive=false; |
93 |
if(this.options&&this.options.length){ |
94 |
this.removeOption(this.options); |
95 |
} |
96 |
if(_c){
|
97 |
var cb=function(_10){ |
98 |
if(this.sortByLabel&&!_e.sort&&_10.length){ |
99 |
_10.sort(dojo.data.util.sorter.createSortFunction([{attribute:_c.getLabelAttributes(_10[0])[0]}],_c)); |
100 |
} |
101 |
if(_e.onFetch){
|
102 |
_10=_e.onFetch(_10); |
103 |
} |
104 |
dojo.forEach(_10,function(i){
|
105 |
this._addOptionForItem(i);
|
106 |
},this);
|
107 |
this._loadingStore=false; |
108 |
this.set("value",(("_pendingValue" in this)?this._pendingValue:_d)); |
109 |
delete this._pendingValue; |
110 |
if(!this.loadChildrenOnOpen){ |
111 |
this._loadChildren();
|
112 |
}else{
|
113 |
this._pseudoLoadChildren(_10);
|
114 |
} |
115 |
this._fetchedWith=_11;
|
116 |
this._lastValueReported=this.multiple?[]:null; |
117 |
this._onChangeActive=true; |
118 |
this.onSetStore();
|
119 |
this._handleOnChange(this.value); |
120 |
}; |
121 |
var _11=dojo.mixin({onComplete:cb,scope:this},_e); |
122 |
this._loadingStore=true; |
123 |
_c.fetch(_11); |
124 |
}else{
|
125 |
delete this._fetchedWith; |
126 |
} |
127 |
return _f;
|
128 |
},_setValueAttr:function(_12,_13){ |
129 |
if(this._loadingStore){ |
130 |
this._pendingValue=_12;
|
131 |
return;
|
132 |
} |
133 |
var _14=this.getOptions()||[]; |
134 |
if(!dojo.isArray(_12)){
|
135 |
_12=[_12]; |
136 |
} |
137 |
dojo.forEach(_12,function(i,idx){
|
138 |
if(!dojo.isObject(i)){
|
139 |
i=i+"";
|
140 |
} |
141 |
if(typeof i==="string"){ |
142 |
_12[idx]=dojo.filter(_14,function(_15){
|
143 |
return _15.value===i;
|
144 |
})[0]||{value:"",label:""}; |
145 |
} |
146 |
},this);
|
147 |
_12=dojo.filter(_12,function(i){
|
148 |
return i&&i.value;
|
149 |
}); |
150 |
if(!this.multiple&&(!_12[0]||!_12[0].value)&&_14.length){ |
151 |
_12[0]=_14[0]; |
152 |
} |
153 |
dojo.forEach(_14,function(i){
|
154 |
i.selected=dojo.some(_12,function(v){
|
155 |
return v.value===i.value;
|
156 |
}); |
157 |
}); |
158 |
var val=dojo.map(_12,function(i){ |
159 |
return i.value;
|
160 |
}),_16=dojo.map(_12,function(i){
|
161 |
return i.label;
|
162 |
}); |
163 |
this.value=this.multiple?val:val[0]; |
164 |
this._setDisplay(this.multiple?_16:_16[0]); |
165 |
this._updateSelection();
|
166 |
this._handleOnChange(this.value,_13); |
167 |
},_getDisplayedValueAttr:function(){ |
168 |
var val=this.get("value"); |
169 |
if(!dojo.isArray(val)){
|
170 |
val=[val]; |
171 |
} |
172 |
var ret=dojo.map(this.getOptions(val),function(v){ |
173 |
if(v&&"label" in v){ |
174 |
return v.label;
|
175 |
}else{
|
176 |
if(v){
|
177 |
return v.value;
|
178 |
} |
179 |
} |
180 |
return null; |
181 |
},this);
|
182 |
return this.multiple?ret:ret[0]; |
183 |
},_getValueDeprecated:false,getValue:function(){ |
184 |
return this._lastValue; |
185 |
},undo:function(){ |
186 |
this._setValueAttr(this._lastValueReported,false); |
187 |
},_loadChildren:function(){ |
188 |
if(this._loadingStore){ |
189 |
return;
|
190 |
} |
191 |
dojo.forEach(this._getChildren(),function(_17){ |
192 |
_17.destroyRecursive(); |
193 |
}); |
194 |
dojo.forEach(this.options,this._addOptionItem,this); |
195 |
this._updateSelection();
|
196 |
},_updateSelection:function(){ |
197 |
this.value=this._getValueFromOpts(); |
198 |
var val=this.value; |
199 |
if(!dojo.isArray(val)){
|
200 |
val=[val]; |
201 |
} |
202 |
if(val&&val[0]){ |
203 |
dojo.forEach(this._getChildren(),function(_18){ |
204 |
var _19=dojo.some(val,function(v){ |
205 |
return _18.option&&(v===_18.option.value);
|
206 |
}); |
207 |
dojo.toggleClass(_18.domNode,this.baseClass+"SelectedOption",_19); |
208 |
dijit.setWaiState(_18.domNode,"selected",_19);
|
209 |
},this);
|
210 |
} |
211 |
this._handleOnChange(this.value); |
212 |
},_getValueFromOpts:function(){ |
213 |
var _1a=this.getOptions()||[]; |
214 |
if(!this.multiple&&_1a.length){ |
215 |
var opt=dojo.filter(_1a,function(i){ |
216 |
return i.selected;
|
217 |
})[0];
|
218 |
if(opt&&opt.value){
|
219 |
return opt.value;
|
220 |
}else{
|
221 |
_1a[0].selected=true; |
222 |
return _1a[0].value; |
223 |
} |
224 |
}else{
|
225 |
if(this.multiple){ |
226 |
return dojo.map(dojo.filter(_1a,function(i){ |
227 |
return i.selected;
|
228 |
}),function(i){
|
229 |
return i.value;
|
230 |
})||[]; |
231 |
} |
232 |
} |
233 |
return ""; |
234 |
},_onNewItem:function(_1b,_1c){ |
235 |
if(!_1c||!_1c.parent){
|
236 |
this._addOptionForItem(_1b);
|
237 |
} |
238 |
},_onDeleteItem:function(_1d){ |
239 |
var _1e=this.store; |
240 |
this.removeOption(_1e.getIdentity(_1d));
|
241 |
},_onSetItem:function(_1f){ |
242 |
this.updateOption(this._getOptionObjForItem(_1f)); |
243 |
},_getOptionObjForItem:function(_20){ |
244 |
var _21=this.store,_22=_21.getLabel(_20),_23=(_22?_21.getIdentity(_20):null); |
245 |
return {value:_23,label:_22,item:_20}; |
246 |
},_addOptionForItem:function(_24){ |
247 |
var _25=this.store; |
248 |
if(!_25.isItemLoaded(_24)){
|
249 |
_25.loadItem({item:_24,onComplete:function(i){ |
250 |
this._addOptionForItem(_24);
|
251 |
},scope:this}); |
252 |
return;
|
253 |
} |
254 |
var _26=this._getOptionObjForItem(_24); |
255 |
this.addOption(_26);
|
256 |
},constructor:function(_27){ |
257 |
this._oValue=(_27||{}).value||null; |
258 |
},_fillContent:function(){ |
259 |
var _28=this.options; |
260 |
if(!_28){
|
261 |
_28=this.options=this.srcNodeRef?dojo.query(">",this.srcNodeRef).map(function(_29){ |
262 |
if(_29.getAttribute("type")==="separator"){ |
263 |
return {value:"",label:"",selected:false,disabled:false}; |
264 |
} |
265 |
return {value:_29.getAttribute("value"),label:String(_29.innerHTML),selected:_29.getAttribute("selected")||false,disabled:_29.getAttribute("disabled")||false}; |
266 |
},this):[];
|
267 |
} |
268 |
if(!this.value){ |
269 |
this.value=this._getValueFromOpts(); |
270 |
}else{
|
271 |
if(this.multiple&&typeof this.value=="string"){ |
272 |
this.value=this.value.split(","); |
273 |
} |
274 |
} |
275 |
},postCreate:function(){ |
276 |
dojo.setSelectable(this.focusNode,false); |
277 |
this.inherited(arguments); |
278 |
this.connect(this,"onChange","_updateSelection"); |
279 |
this.connect(this,"startup","_loadChildren"); |
280 |
this._setValueAttr(this.value,null); |
281 |
},startup:function(){ |
282 |
this.inherited(arguments); |
283 |
var _2a=this.store,_2b={}; |
284 |
dojo.forEach(["query","queryOptions","onFetch"],function(i){ |
285 |
if(this[i]){ |
286 |
_2b[i]=this[i];
|
287 |
} |
288 |
delete this[i]; |
289 |
},this);
|
290 |
if(_2a&&_2a.getFeatures()["dojo.data.api.Identity"]){ |
291 |
this.store=null; |
292 |
this.setStore(_2a,this._oValue,_2b); |
293 |
} |
294 |
},destroy:function(){ |
295 |
dojo.forEach(this._notifyConnections||[],dojo.disconnect);
|
296 |
this.inherited(arguments); |
297 |
},_addOptionItem:function(_2c){ |
298 |
},_removeOptionItem:function(_2d){ |
299 |
},_setDisplay:function(_2e){ |
300 |
},_getChildren:function(){ |
301 |
return [];
|
302 |
},_getSelectedOptionsAttr:function(){ |
303 |
return this.getOptions(this.get("value")); |
304 |
},_pseudoLoadChildren:function(_2f){ |
305 |
},onSetStore:function(){ |
306 |
}}); |
307 |
} |