root / trunk / web / dojo / dojox / data / ItemExplorer.js
History | View | Annotate | Download (12.2 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["dojox.data.ItemExplorer"]){ |
| 9 |
dojo._hasResource["dojox.data.ItemExplorer"]=true; |
| 10 |
dojo.provide("dojox.data.ItemExplorer");
|
| 11 |
dojo.require("dijit.Tree");
|
| 12 |
dojo.require("dijit.Dialog");
|
| 13 |
dojo.require("dijit.Menu");
|
| 14 |
dojo.require("dijit.form.ValidationTextBox");
|
| 15 |
dojo.require("dijit.form.Textarea");
|
| 16 |
dojo.require("dijit.form.Button");
|
| 17 |
dojo.require("dijit.form.CheckBox");
|
| 18 |
dojo.require("dijit.form.FilteringSelect");
|
| 19 |
(function(){
|
| 20 |
var _1=function(_2,_3,_4){ |
| 21 |
var _5=_2.getValues(_3,_4);
|
| 22 |
if(_5.length<2){ |
| 23 |
_5=_2.getValue(_3,_4); |
| 24 |
} |
| 25 |
return _5;
|
| 26 |
}; |
| 27 |
dojo.declare("dojox.data.ItemExplorer",dijit.Tree,{useSelect:false,refSelectSearchAttr:null,constructor:function(_6){ |
| 28 |
dojo.mixin(this,_6);
|
| 29 |
var _7=this; |
| 30 |
var _8={};
|
| 31 |
var _9=this.rootModelNode={value:_8,id:"root"}; |
| 32 |
this._modelNodeIdMap={};
|
| 33 |
this._modelNodePropMap={};
|
| 34 |
var _a=1; |
| 35 |
this.model={getRoot:function(_b){ |
| 36 |
_b(_9); |
| 37 |
},mayHaveChildren:function(_c){ |
| 38 |
return _c.value&&typeof _c.value=="object"&&!(_c.value instanceof Date); |
| 39 |
},getChildren:function(_d,_e,_f){ |
| 40 |
var _10,_11,_12=_d.value;
|
| 41 |
var _13=[];
|
| 42 |
if(_12==_8){
|
| 43 |
_e([]); |
| 44 |
return;
|
| 45 |
} |
| 46 |
var _14=_7.store&&_7.store.isItem(_12,true); |
| 47 |
if(_14&&!_7.store.isItemLoaded(_12)){
|
| 48 |
_7.store.loadItem({item:_12,onItem:function(_15){
|
| 49 |
_12=_15; |
| 50 |
_16(); |
| 51 |
}}); |
| 52 |
}else{
|
| 53 |
_16(); |
| 54 |
} |
| 55 |
function _16(){ |
| 56 |
if(_14){
|
| 57 |
_10=_7.store.getAttributes(_12); |
| 58 |
_11=_12; |
| 59 |
}else{
|
| 60 |
if(_12&&typeof _12=="object"){ |
| 61 |
_11=_d.value; |
| 62 |
_10=[]; |
| 63 |
for(var i in _12){ |
| 64 |
if(_12.hasOwnProperty(i)&&i!="__id"&&i!="__clientId"){ |
| 65 |
_10.push(i); |
| 66 |
} |
| 67 |
} |
| 68 |
} |
| 69 |
} |
| 70 |
if(_10){
|
| 71 |
for(var key,k=0;key=_10[k++];){ |
| 72 |
_13.push({property:key,value:_14?_1(_7.store,_12,key):_12[key],parent:_11});
|
| 73 |
} |
| 74 |
_13.push({addNew:true,parent:_11,parentNode:_d});
|
| 75 |
} |
| 76 |
_e(_13); |
| 77 |
}; |
| 78 |
},getIdentity:function(_17){ |
| 79 |
if(!_17.id){
|
| 80 |
if(_17.addNew){
|
| 81 |
_17.property="--addNew";
|
| 82 |
} |
| 83 |
_17.id=_a++; |
| 84 |
if(_7.store){
|
| 85 |
if(_7.store.isItem(_17.value)){
|
| 86 |
var _18=_7.store.getIdentity(_17.value);
|
| 87 |
(_7._modelNodeIdMap[_18]=_7._modelNodeIdMap[_18]||[]).push(_17); |
| 88 |
} |
| 89 |
if(_17.parent){
|
| 90 |
_18=_7.store.getIdentity(_17.parent)+"."+_17.property;
|
| 91 |
(_7._modelNodePropMap[_18]=_7._modelNodePropMap[_18]||[]).push(_17); |
| 92 |
} |
| 93 |
} |
| 94 |
} |
| 95 |
return _17.id;
|
| 96 |
},getLabel:function(_19){ |
| 97 |
return _19===_9?"Object Properties":_19.addNew?(_19.parent instanceof Array?"Add new value":"Add new property"):_19.property+": "+(_19.value instanceof Array?"("+_19.value.length+" elements)":_19.value); |
| 98 |
},onChildrenChange:function(_1a){ |
| 99 |
},onChange:function(_1b){ |
| 100 |
}}; |
| 101 |
},postCreate:function(){ |
| 102 |
this.inherited(arguments); |
| 103 |
dojo.connect(this,"onClick",function(_1c,_1d){ |
| 104 |
this.lastFocused=_1d;
|
| 105 |
if(_1c.addNew){
|
| 106 |
this._addProperty();
|
| 107 |
}else{
|
| 108 |
this._editProperty();
|
| 109 |
} |
| 110 |
}); |
| 111 |
var _1e=new dijit.Menu({targetNodeIds:[this.rootNode.domNode],id:"contextMenu"}); |
| 112 |
dojo.connect(_1e,"_openMyself",this,function(e){ |
| 113 |
var _1f=dijit.getEnclosingWidget(e.target);
|
| 114 |
if(_1f){
|
| 115 |
var _20=_1f.item;
|
| 116 |
if(this.store.isItem(_20.value,true)&&!_20.parent){ |
| 117 |
dojo.forEach(_1e.getChildren(),function(_21){
|
| 118 |
_21.attr("disabled",(_21.label!="Add")); |
| 119 |
}); |
| 120 |
this.lastFocused=_1f;
|
| 121 |
}else{
|
| 122 |
if(_20.value&&typeof _20.value=="object"&&!(_20.value instanceof Date)){ |
| 123 |
dojo.forEach(_1e.getChildren(),function(_22){
|
| 124 |
_22.attr("disabled",(_22.label!="Add")&&(_22.label!="Delete")); |
| 125 |
}); |
| 126 |
this.lastFocused=_1f;
|
| 127 |
}else{
|
| 128 |
if(_20.property&&dojo.indexOf(this.store.getIdentityAttributes(),_20.property)>=0){ |
| 129 |
this.focusNode(_1f);
|
| 130 |
alert("Cannot modify an Identifier node.");
|
| 131 |
}else{
|
| 132 |
if(_20.addNew){
|
| 133 |
this.focusNode(_1f);
|
| 134 |
}else{
|
| 135 |
dojo.forEach(_1e.getChildren(),function(_23){
|
| 136 |
_23.attr("disabled",(_23.label!="Edit")&&(_23.label!="Delete")); |
| 137 |
}); |
| 138 |
this.lastFocused=_1f;
|
| 139 |
} |
| 140 |
} |
| 141 |
} |
| 142 |
} |
| 143 |
} |
| 144 |
}); |
| 145 |
_1e.addChild(new dijit.MenuItem({label:"Add",onClick:dojo.hitch(this,"_addProperty")})); |
| 146 |
_1e.addChild(new dijit.MenuItem({label:"Edit",onClick:dojo.hitch(this,"_editProperty")})); |
| 147 |
_1e.addChild(new dijit.MenuItem({label:"Delete",onClick:dojo.hitch(this,"_destroyProperty")})); |
| 148 |
_1e.startup(); |
| 149 |
},store:null,setStore:function(_24){ |
| 150 |
this.store=_24;
|
| 151 |
var _25=this; |
| 152 |
if(this._editDialog){ |
| 153 |
this._editDialog.destroyRecursive();
|
| 154 |
delete this._editDialog; |
| 155 |
} |
| 156 |
dojo.connect(_24,"onSet",function(_26,_27,_28,_29){ |
| 157 |
var _2a,i,_2b=_25.store.getIdentity(_26);
|
| 158 |
_2a=_25._modelNodeIdMap[_2b]; |
| 159 |
if(_2a&&(_28===undefined||_29===undefined||_28 instanceof Array||_29 instanceof Array||typeof _28=="object"||typeof _29=="object")){ |
| 160 |
for(i=0;i<_2a.length;i++){ |
| 161 |
(function(_2c){
|
| 162 |
_25.model.getChildren(_2c,function(_2d){
|
| 163 |
_25.model.onChildrenChange(_2c,_2d); |
| 164 |
}); |
| 165 |
})(_2a[i]); |
| 166 |
} |
| 167 |
} |
| 168 |
_2a=_25._modelNodePropMap[_2b+"."+_27];
|
| 169 |
if(_2a){
|
| 170 |
for(i=0;i<_2a.length;i++){ |
| 171 |
_2a[i].value=_29; |
| 172 |
_25.model.onChange(_2a[i]); |
| 173 |
} |
| 174 |
} |
| 175 |
}); |
| 176 |
this.rootNode.setChildItems([]);
|
| 177 |
},setItem:function(_2e){ |
| 178 |
(this._modelNodeIdMap={})[this.store.getIdentity(_2e)]=[this.rootModelNode]; |
| 179 |
this._modelNodePropMap={};
|
| 180 |
this.rootModelNode.value=_2e;
|
| 181 |
var _2f=this; |
| 182 |
this.model.getChildren(this.rootModelNode,function(_30){ |
| 183 |
_2f.rootNode.setChildItems(_30); |
| 184 |
}); |
| 185 |
},refreshItem:function(){ |
| 186 |
this.setItem(this.rootModelNode.value); |
| 187 |
},_createEditDialog:function(){ |
| 188 |
this._editDialog=new dijit.Dialog({title:"Edit Property",execute:dojo.hitch(this,"_updateItem"),preload:true}); |
| 189 |
this._editDialog.placeAt(dojo.body());
|
| 190 |
this._editDialog.startup();
|
| 191 |
var _31=dojo.doc.createElement("div"); |
| 192 |
var _32=dojo.doc.createElement("label"); |
| 193 |
dojo.attr(_32,"for","property"); |
| 194 |
dojo.style(_32,"fontWeight","bold"); |
| 195 |
dojo.attr(_32,"innerHTML","Property:"); |
| 196 |
_31.appendChild(_32); |
| 197 |
var _33=new dijit.form.ValidationTextBox({name:"property",value:"",required:true,disabled:true}).placeAt(_31); |
| 198 |
_31.appendChild(dojo.doc.createElement("br"));
|
| 199 |
_31.appendChild(dojo.doc.createElement("br"));
|
| 200 |
var _34=new dijit.form.RadioButton({name:"itemType",value:"value",onClick:dojo.hitch(this,function(){ |
| 201 |
this._enableFields("value"); |
| 202 |
})}).placeAt(_31); |
| 203 |
var _35=dojo.doc.createElement("label"); |
| 204 |
dojo.attr(_35,"for","value"); |
| 205 |
dojo.attr(_35,"innerHTML","Value (JSON):"); |
| 206 |
_31.appendChild(_35); |
| 207 |
var _36=dojo.doc.createElement("div"); |
| 208 |
dojo.addClass(_36,"value");
|
| 209 |
var _37=new dijit.form.Textarea({name:"jsonVal"}).placeAt(_36); |
| 210 |
_31.appendChild(_36); |
| 211 |
var _38=new dijit.form.RadioButton({name:"itemType",value:"reference",onClick:dojo.hitch(this,function(){ |
| 212 |
this._enableFields("reference"); |
| 213 |
})}).placeAt(_31); |
| 214 |
var _39=dojo.doc.createElement("label"); |
| 215 |
dojo.attr(_39,"for","_reference"); |
| 216 |
dojo.attr(_39,"innerHTML","Reference (ID):"); |
| 217 |
_31.appendChild(_39); |
| 218 |
_31.appendChild(dojo.doc.createElement("br"));
|
| 219 |
var _3a=dojo.doc.createElement("div"); |
| 220 |
dojo.addClass(_3a,"reference");
|
| 221 |
if(this.useSelect){ |
| 222 |
var _3b=new dijit.form.FilteringSelect({name:"_reference",store:this.store,searchAttr:this.refSelectSearchAttr||this.store.getIdentityAttributes()[0],required:false,value:null,pageSize:10}).placeAt(_3a); |
| 223 |
}else{
|
| 224 |
var _3c=new dijit.form.ValidationTextBox({name:"_reference",value:"",promptMessage:"Enter the ID of the item to reference",isValid:dojo.hitch(this,function(_3d){ |
| 225 |
return true; |
| 226 |
})}).placeAt(_3a); |
| 227 |
} |
| 228 |
_31.appendChild(_3a); |
| 229 |
_31.appendChild(dojo.doc.createElement("br"));
|
| 230 |
_31.appendChild(dojo.doc.createElement("br"));
|
| 231 |
var _3e=document.createElement("div"); |
| 232 |
_3e.setAttribute("dir","rtl"); |
| 233 |
var _3f=new dijit.form.Button({type:"reset",label:"Cancel"}).placeAt(_3e); |
| 234 |
_3f.onClick=dojo.hitch(this._editDialog,"onCancel"); |
| 235 |
var _40=new dijit.form.Button({type:"submit",label:"OK"}).placeAt(_3e); |
| 236 |
_31.appendChild(_3e); |
| 237 |
this._editDialog.attr("content",_31); |
| 238 |
},_enableFields:function(_41){ |
| 239 |
switch(_41){
|
| 240 |
case "reference": |
| 241 |
dojo.query(".value [widgetId]",this._editDialog.containerNode).forEach(function(_42){ |
| 242 |
dijit.getEnclosingWidget(_42).attr("disabled",true); |
| 243 |
}); |
| 244 |
dojo.query(".reference [widgetId]",this._editDialog.containerNode).forEach(function(_43){ |
| 245 |
dijit.getEnclosingWidget(_43).attr("disabled",false); |
| 246 |
}); |
| 247 |
break;
|
| 248 |
case "value": |
| 249 |
dojo.query(".value [widgetId]",this._editDialog.containerNode).forEach(function(_44){ |
| 250 |
dijit.getEnclosingWidget(_44).attr("disabled",false); |
| 251 |
}); |
| 252 |
dojo.query(".reference [widgetId]",this._editDialog.containerNode).forEach(function(_45){ |
| 253 |
dijit.getEnclosingWidget(_45).attr("disabled",true); |
| 254 |
}); |
| 255 |
break;
|
| 256 |
} |
| 257 |
},_updateItem:function(_46){ |
| 258 |
var _47,_48,val,_49,_4a=this._editDialog.attr("title")=="Edit Property"; |
| 259 |
var _4b=this._editDialog; |
| 260 |
var _4c=this.store; |
| 261 |
function _4d(){ |
| 262 |
try{
|
| 263 |
var _4e,_4f=[];
|
| 264 |
var _50=_46.property;
|
| 265 |
if(_4a){
|
| 266 |
while(!_4c.isItem(_48.parent,true)){ |
| 267 |
_47=_47.getParent(); |
| 268 |
_4f.push(_48.property); |
| 269 |
_48=_47.item; |
| 270 |
} |
| 271 |
if(_4f.length==0){ |
| 272 |
_4c.setValue(_48.parent,_48.property,val); |
| 273 |
}else{
|
| 274 |
_49=_1(_4c,_48.parent,_48.property); |
| 275 |
if(_49 instanceof Array){ |
| 276 |
_49=_49.concat(); |
| 277 |
} |
| 278 |
_4e=_49; |
| 279 |
while(_4f.length>1){ |
| 280 |
_4e=_4e[_4f.pop()]; |
| 281 |
} |
| 282 |
_4e[_4f]=val; |
| 283 |
_4c.setValue(_48.parent,_48.property,_49); |
| 284 |
} |
| 285 |
}else{
|
| 286 |
if(_4c.isItem(_51,true)){ |
| 287 |
if(!_4c.isItemLoaded(_51)){
|
| 288 |
_4c.loadItem({item:_51,onItem:function(_52){
|
| 289 |
if(_52 instanceof Array){ |
| 290 |
_50=_52.length; |
| 291 |
} |
| 292 |
_4c.setValue(_52,_50,val); |
| 293 |
}}); |
| 294 |
}else{
|
| 295 |
if(_51 instanceof Array){ |
| 296 |
_50=_51.length; |
| 297 |
} |
| 298 |
_4c.setValue(_51,_50,val); |
| 299 |
} |
| 300 |
}else{
|
| 301 |
if(_48.value instanceof Array){ |
| 302 |
_4f.push(_48.value.length); |
| 303 |
}else{
|
| 304 |
_4f.push(_46.property); |
| 305 |
} |
| 306 |
while(!_4c.isItem(_48.parent,true)){ |
| 307 |
_47=_47.getParent(); |
| 308 |
_4f.push(_48.property); |
| 309 |
_48=_47.item; |
| 310 |
} |
| 311 |
_49=_1(_4c,_48.parent,_48.property); |
| 312 |
_4e=_49; |
| 313 |
while(_4f.length>1){ |
| 314 |
_4e=_4e[_4f.pop()]; |
| 315 |
} |
| 316 |
_4e[_4f]=val; |
| 317 |
_4c.setValue(_48.parent,_48.property,_49); |
| 318 |
} |
| 319 |
} |
| 320 |
} |
| 321 |
catch(e){
|
| 322 |
alert(e); |
| 323 |
} |
| 324 |
}; |
| 325 |
if(_4b.validate()){
|
| 326 |
_47=this.lastFocused;
|
| 327 |
_48=_47.item; |
| 328 |
var _51=_48.value;
|
| 329 |
if(_48.addNew){
|
| 330 |
_51=_47.item.parent; |
| 331 |
_47=_47.getParent(); |
| 332 |
_48=_47.item; |
| 333 |
} |
| 334 |
val=null;
|
| 335 |
switch(_46.itemType){
|
| 336 |
case "reference": |
| 337 |
this.store.fetchItemByIdentity({identity:_46._reference,onItem:function(_53){ |
| 338 |
val=_53; |
| 339 |
_4d(); |
| 340 |
},onError:function(){ |
| 341 |
alert("The id could not be found");
|
| 342 |
}}); |
| 343 |
break;
|
| 344 |
case "value": |
| 345 |
var _54=_46.jsonVal;
|
| 346 |
val=dojo.fromJson(_54); |
| 347 |
if(typeof val=="function"){ |
| 348 |
val.toString=function(){ |
| 349 |
return _54;
|
| 350 |
}; |
| 351 |
} |
| 352 |
_4d(); |
| 353 |
break;
|
| 354 |
} |
| 355 |
}else{
|
| 356 |
_4b.show(); |
| 357 |
} |
| 358 |
},_editProperty:function(){ |
| 359 |
var _55=dojo.mixin({},this.lastFocused.item); |
| 360 |
if(!this._editDialog){ |
| 361 |
this._createEditDialog();
|
| 362 |
}else{
|
| 363 |
this._editDialog.reset();
|
| 364 |
} |
| 365 |
if(dojo.indexOf(this.store.getIdentityAttributes(),_55.property)>=0){ |
| 366 |
alert("Cannot Edit an Identifier!");
|
| 367 |
}else{
|
| 368 |
this._editDialog.attr("title","Edit Property"); |
| 369 |
dijit.getEnclosingWidget(dojo.query("input",this._editDialog.containerNode)[0]).attr("disabled",true); |
| 370 |
if(this.store.isItem(_55.value,true)){ |
| 371 |
if(_55.parent){
|
| 372 |
_55.itemType="reference";
|
| 373 |
this._enableFields(_55.itemType);
|
| 374 |
_55._reference=this.store.getIdentity(_55.value);
|
| 375 |
this._editDialog.attr("value",_55); |
| 376 |
this._editDialog.show();
|
| 377 |
} |
| 378 |
}else{
|
| 379 |
if(_55.value&&typeof _55.value=="object"&&!(_55.value instanceof Date)){ |
| 380 |
}else{
|
| 381 |
_55.itemType="value";
|
| 382 |
this._enableFields(_55.itemType);
|
| 383 |
_55.jsonVal=typeof _55.value=="function"?_55.value.toString():_55.value instanceof Date?"new Date(\""+_55.value+"\")":dojo.toJson(_55.value); |
| 384 |
this._editDialog.attr("value",_55); |
| 385 |
this._editDialog.show();
|
| 386 |
} |
| 387 |
} |
| 388 |
} |
| 389 |
},_destroyProperty:function(){ |
| 390 |
var _56=this.lastFocused; |
| 391 |
var _57=_56.item;
|
| 392 |
var _58=[];
|
| 393 |
while(!this.store.isItem(_57.parent,true)||_57.parent instanceof Array){ |
| 394 |
_56=_56.getParent(); |
| 395 |
_58.push(_57.property); |
| 396 |
_57=_56.item; |
| 397 |
} |
| 398 |
if(dojo.indexOf(this.store.getIdentityAttributes(),_57.property)>=0){ |
| 399 |
alert("Cannot Delete an Identifier!");
|
| 400 |
}else{
|
| 401 |
try{
|
| 402 |
if(_58.length>0){ |
| 403 |
var _59,_5a=_1(this.store,_57.parent,_57.property); |
| 404 |
_59=_5a; |
| 405 |
while(_58.length>1){ |
| 406 |
_59=_59[_58.pop()]; |
| 407 |
} |
| 408 |
if(dojo.isArray(_59)){
|
| 409 |
_59.splice(_58,1);
|
| 410 |
}else{
|
| 411 |
delete _59[_58];
|
| 412 |
} |
| 413 |
this.store.setValue(_57.parent,_57.property,_5a);
|
| 414 |
}else{
|
| 415 |
this.store.unsetAttribute(_57.parent,_57.property);
|
| 416 |
} |
| 417 |
} |
| 418 |
catch(e){
|
| 419 |
alert(e); |
| 420 |
} |
| 421 |
} |
| 422 |
},_addProperty:function(){ |
| 423 |
var _5b=this.lastFocused.item; |
| 424 |
var _5c=_5b.value;
|
| 425 |
var _5d=dojo.hitch(this,function(){ |
| 426 |
var _5e=null; |
| 427 |
if(!this._editDialog){ |
| 428 |
this._createEditDialog();
|
| 429 |
}else{
|
| 430 |
this._editDialog.reset();
|
| 431 |
} |
| 432 |
if(_5c instanceof Array){ |
| 433 |
_5e=_5c.length; |
| 434 |
dijit.getEnclosingWidget(dojo.query("input",this._editDialog.containerNode)[0]).attr("disabled",true); |
| 435 |
}else{
|
| 436 |
dijit.getEnclosingWidget(dojo.query("input",this._editDialog.containerNode)[0]).attr("disabled",false); |
| 437 |
} |
| 438 |
this._editDialog.attr("title","Add Property"); |
| 439 |
this._enableFields("value"); |
| 440 |
this._editDialog.attr("value",{itemType:"value",property:_5e}); |
| 441 |
this._editDialog.show();
|
| 442 |
}); |
| 443 |
if(_5b.addNew){
|
| 444 |
_5b=this.lastFocused.getParent().item;
|
| 445 |
_5c=this.lastFocused.item.parent;
|
| 446 |
} |
| 447 |
if(_5b.property&&dojo.indexOf(this.store.getIdentityAttributes(),_5b.property)>=0){ |
| 448 |
alert("Cannot add properties to an ID node!");
|
| 449 |
}else{
|
| 450 |
if(this.store.isItem(_5c,true)&&!this.store.isItemLoaded(_5c)){ |
| 451 |
this.store.loadItem({item:_5c,onItem:function(_5f){ |
| 452 |
_5c=_5f; |
| 453 |
_5d(); |
| 454 |
}}); |
| 455 |
}else{
|
| 456 |
_5d(); |
| 457 |
} |
| 458 |
} |
| 459 |
}}); |
| 460 |
})(); |
| 461 |
} |