]> git.wh0rd.org - tt-rss.git/blobdiff - lib/dijit/tree/TreeStoreModel.js
update dojo to 1.7.3
[tt-rss.git] / lib / dijit / tree / TreeStoreModel.js
index 5164176b7df7aa87aca748b8bdef9b6217204843..f61977c2fd85e28a29b8ac4481a634e18f67874f 100644 (file)
@@ -1,381 +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.tree.TreeStoreModel"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.tree.TreeStoreModel"] = true;
-dojo.provide("dijit.tree.TreeStoreModel");
-
-
-dojo.declare(
-               "dijit.tree.TreeStoreModel",
-               null,
-       {
-               // summary:
-               //              Implements dijit.Tree.model connecting to a store with a single
-               //              root item.  Any methods passed into the constructor will override
-               //              the ones defined here.
-
-               // store: dojo.data.Store
-               //              Underlying store
-               store: null,
-
-               // childrenAttrs: String[]
-               //              One or more attribute names (attributes in the dojo.data item) that specify that item's children
-               childrenAttrs: ["children"],
-
-               // newItemIdAttr: String
-               //              Name of attribute in the Object passed to newItem() that specifies the id.
-               //
-               //              If newItemIdAttr is set then it's used when newItem() is called to see if an
-               //              item with the same id already exists, and if so just links to the old item
-               //              (so that the old item ends up with two parents).
-               //
-               //              Setting this to null or "" will make every drop create a new item.
-               newItemIdAttr: "id",
-
-               // labelAttr: String
-               //              If specified, get label for tree node from this attribute, rather
-               //              than by calling store.getLabel()
-               labelAttr: "",
-
-               // root: [readonly] dojo.data.Item
-               //              Pointer to the root item (read only, not a parameter)
-               root: null,
-
-               // query: anything
-               //              Specifies datastore query to return the root item for the tree.
-               //              Must only return a single item.   Alternately can just pass in pointer
-               //              to root item.
-               // example:
-               //      |       {id:'ROOT'}
-               query: null,
-
-               // deferItemLoadingUntilExpand: Boolean
-               //              Setting this to true will cause the TreeStoreModel to defer calling loadItem on nodes
-               //              until they are expanded. This allows for lazying loading where only one
-               //              loadItem (and generally one network call, consequently) per expansion
-               //              (rather than one for each child).
-               //              This relies on partial loading of the children items; each children item of a
-               //              fully loaded item should contain the label and info about having children.
-               deferItemLoadingUntilExpand: false,
-
-               constructor: function(/* Object */ args){
-                       // summary:
-                       //              Passed the arguments listed above (store, etc)
-                       // tags:
-                       //              private
-
-                       dojo.mixin(this, args);
-
-                       this.connects = [];
-
-                       var store = this.store;
-                       if(!store.getFeatures()['dojo.data.api.Identity']){
-                               throw new Error("dijit.Tree: store must support dojo.data.Identity");
-                       }
-
-                       // if the store supports Notification, subscribe to the notification events
-                       if(store.getFeatures()['dojo.data.api.Notification']){
-                               this.connects = this.connects.concat([
-                                       dojo.connect(store, "onNew", this, "onNewItem"),
-                                       dojo.connect(store, "onDelete", this, "onDeleteItem"),
-                                       dojo.connect(store, "onSet", this, "onSetItem")
-                               ]);
-                       }
-               },
-
-               destroy: function(){
-                       dojo.forEach(this.connects, dojo.disconnect);
-                       // TODO: should cancel any in-progress processing of getRoot(), getChildren()
-               },
-
-               // =======================================================================
-               // Methods for traversing hierarchy
-
-               getRoot: function(onItem, onError){
-                       // summary:
-                       //              Calls onItem with the root item for the tree, possibly a fabricated item.
-                       //              Calls onError on error.
-                       if(this.root){
-                               onItem(this.root);
-                       }else{
-                               this.store.fetch({
-                                       query: this.query,
-                                       onComplete: dojo.hitch(this, function(items){
-                                               if(items.length != 1){
-                                                       throw new Error(this.declaredClass + ": query " + dojo.toJson(this.query) + " returned " + items.length +
-                                                               " items, but must return exactly one item");
-                                               }
-                                               this.root = items[0];
-                                               onItem(this.root);
-                                       }),
-                                       onError: onError
-                               });
-                       }
-               },
-
-               mayHaveChildren: function(/*dojo.data.Item*/ item){
-                       // summary:
-                       //              Tells if an item has or may have children.  Implementing logic here
-                       //              avoids showing +/- expando icon for nodes that we know don't have children.
-                       //              (For efficiency reasons we may not want to check if an element actually
-                       //              has children until user clicks the expando node)
-                       return dojo.some(this.childrenAttrs, function(attr){
-                               return this.store.hasAttribute(item, attr);
-                       }, this);
-               },
-
-               getChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete, /*function*/ onError){
-                       // summary:
-                       //              Calls onComplete() with array of child items of given parent item, all loaded.
-
-                       var store = this.store;
-                       if(!store.isItemLoaded(parentItem)){
-                               // The parent is not loaded yet, we must be in deferItemLoadingUntilExpand
-                               // mode, so we will load it and just return the children (without loading each
-                               // child item)
-                               var getChildren = dojo.hitch(this, arguments.callee);
-                               store.loadItem({
-                                       item: parentItem,
-                                       onItem: function(parentItem){
-                                               getChildren(parentItem, onComplete, onError);
-                                       },
-                                       onError: onError
-                               });
-                               return;
-                       }
-                       // get children of specified item
-                       var childItems = [];
-                       for(var i=0; i<this.childrenAttrs.length; i++){
-                               var vals = store.getValues(parentItem, this.childrenAttrs[i]);
-                               childItems = childItems.concat(vals);
-                       }
-
-                       // count how many items need to be loaded
-                       var _waitCount = 0;
-                       if(!this.deferItemLoadingUntilExpand){
-                               dojo.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } });
-                       }
-
-                       if(_waitCount == 0){
-                               // all items are already loaded (or we aren't loading them).  proceed...
-                               onComplete(childItems);
-                       }else{
-                               // still waiting for some or all of the items to load
-                               dojo.forEach(childItems, function(item, idx){
-                                       if(!store.isItemLoaded(item)){
-                                               store.loadItem({
-                                                       item: item,
-                                                       onItem: function(item){
-                                                               childItems[idx] = item;
-                                                               if(--_waitCount == 0){
-                                                                       // all nodes have been loaded, send them to the tree
-                                                                       onComplete(childItems);
-                                                               }
-                                                       },
-                                                       onError: onError
-                                               });
-                                       }
-                               });
-                       }
-               },
-
-               // =======================================================================
-               // Inspecting items
-
-               isItem: function(/* anything */ something){
-                       return this.store.isItem(something);    // Boolean
-               },
-
-               fetchItemByIdentity: function(/* object */ keywordArgs){
-                       this.store.fetchItemByIdentity(keywordArgs);
-               },
-
-               getIdentity: function(/* item */ item){
-                       return this.store.getIdentity(item);    // Object
-               },
-
-               getLabel: function(/*dojo.data.Item*/ item){
-                       // summary:
-                       //              Get the label for an item
-                       if(this.labelAttr){
-                               return this.store.getValue(item,this.labelAttr);        // String
-                       }else{
-                               return this.store.getLabel(item);       // String
-                       }
-               },
-
-               // =======================================================================
-               // Write interface
-
-               newItem: function(/* dojo.dnd.Item */ args, /*Item*/ parent, /*int?*/ insertIndex){
-                       // summary:
-                       //              Creates a new item.   See `dojo.data.api.Write` for details on args.
-                       //              Used in drag & drop when item from external source dropped onto tree.
-                       // description:
-                       //              Developers will need to override this method if new items get added
-                       //              to parents with multiple children attributes, in order to define which
-                       //              children attribute points to the new item.
-
-                       var pInfo = {parent: parent, attribute: this.childrenAttrs[0]}, LnewItem;
-
-                       if(this.newItemIdAttr && args[this.newItemIdAttr]){
-                               // Maybe there's already a corresponding item in the store; if so, reuse it.
-                               this.fetchItemByIdentity({identity: args[this.newItemIdAttr], scope: this, onItem: function(item){
-                                       if(item){
-                                               // There's already a matching item in store, use it
-                                               this.pasteItem(item, null, parent, true, insertIndex);
-                                       }else{
-                                               // Create new item in the tree, based on the drag source.
-                                               LnewItem=this.store.newItem(args, pInfo);
-                                               if (LnewItem && (insertIndex!=undefined)){
-                                                       // Move new item to desired position
-                                                       this.pasteItem(LnewItem, parent, parent, false, insertIndex);
-                                               }
-                                       }
-                               }});
-                       }else{
-                               // [as far as we know] there is no id so we must assume this is a new item
-                               LnewItem=this.store.newItem(args, pInfo);
-                               if (LnewItem && (insertIndex!=undefined)){
-                                       // Move new item to desired position
-                                       this.pasteItem(LnewItem, parent, parent, false, insertIndex);
-                               }
-                       }
-               },
-
-               pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy, /*int?*/ insertIndex){
-                       // summary:
-                       //              Move or copy an item from one parent item to another.
-                       //              Used in drag & drop
-                       var store = this.store,
-                               parentAttr = this.childrenAttrs[0];     // name of "children" attr in parent item
-
-                       // remove child from source item, and record the attribute that child occurred in
-                       if(oldParentItem){
-                               dojo.forEach(this.childrenAttrs, function(attr){
-                                       if(store.containsValue(oldParentItem, attr, childItem)){
-                                               if(!bCopy){
-                                                       var values = dojo.filter(store.getValues(oldParentItem, attr), function(x){
-                                                               return x != childItem;
-                                                       });
-                                                       store.setValues(oldParentItem, attr, values);
-                                               }
-                                               parentAttr = attr;
-                                       }
-                               });
-                       }
-
-                       // modify target item's children attribute to include this item
-                       if(newParentItem){
-                               if(typeof insertIndex == "number"){
-                                       // call slice() to avoid modifying the original array, confusing the data store
-                                       var childItems = store.getValues(newParentItem, parentAttr).slice();
-                                       childItems.splice(insertIndex, 0, childItem);
-                                       store.setValues(newParentItem, parentAttr, childItems);
-                               }else{
-                                       store.setValues(newParentItem, parentAttr,
-                                               store.getValues(newParentItem, parentAttr).concat(childItem));
-                               }
-                       }
-               },
-
-               // =======================================================================
-               // Callbacks
-
-               onChange: function(/*dojo.data.Item*/ item){
-                       // summary:
-                       //              Callback whenever an item has changed, so that Tree
-                       //              can update the label, icon, etc.   Note that changes
-                       //              to an item's children or parent(s) will trigger an
-                       //              onChildrenChange() so you can ignore those changes here.
-                       // tags:
-                       //              callback
-               },
-
-               onChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
-                       // summary:
-                       //              Callback to do notifications about new, updated, or deleted items.
-                       // tags:
-                       //              callback
-               },
-
-               onDelete: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
-                       // summary:
-                       //              Callback when an item has been deleted.
-                       // description:
-                       //              Note that there will also be an onChildrenChange() callback for the parent
-                       //              of this item.
-                       // tags:
-                       //              callback
-               },
-
-               // =======================================================================
-               // Events from data store
-
-               onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
-                       // summary:
-                       //              Handler for when new items appear in the store, either from a drop operation
-                       //              or some other way.   Updates the tree view (if necessary).
-                       // description:
-                       //              If the new item is a child of an existing item,
-                       //              calls onChildrenChange() with the new list of children
-                       //              for that existing item.
-                       //
-                       // tags:
-                       //              extension
-
-                       // We only care about the new item if it has a parent that corresponds to a TreeNode
-                       // we are currently displaying
-                       if(!parentInfo){
-                               return;
-                       }
-
-                       // Call onChildrenChange() on parent (ie, existing) item with new list of children
-                       // In the common case, the new list of children is simply parentInfo.newValue or
-                       // [ parentInfo.newValue ], although if items in the store has multiple
-                       // child attributes (see `childrenAttr`), then it's a superset of parentInfo.newValue,
-                       // so call getChildren() to be sure to get right answer.
-                       this.getChildren(parentInfo.item, dojo.hitch(this, function(children){
-                               this.onChildrenChange(parentInfo.item, children);
-                       }));
-               },
-
-               onDeleteItem: function(/*Object*/ item){
-                       // summary:
-                       //              Handler for delete notifications from underlying store
-                       this.onDelete(item);
-               },
-
-               onSetItem: function(/* item */ item,
-                                               /* attribute-name-string */ attribute,
-                                               /* object | array */ oldValue,
-                                               /* object | array */ newValue){
-                       // summary:
-                       //              Updates the tree view according to changes in the data store.
-                       // description:
-                       //              Handles updates to an item's children by calling onChildrenChange(), and
-                       //              other updates to an item by calling onChange().
-                       //
-                       //              See `onNewItem` for more details on handling updates to an item's children.
-                       // tags:
-                       //              extension
-
-                       if(dojo.indexOf(this.childrenAttrs, attribute) != -1){
-                               // item's children list changed
-                               this.getChildren(item, dojo.hitch(this, function(children){
-                                       // See comments in onNewItem() about calling getChildren()
-                                       this.onChildrenChange(item, children);
-                               }));
-                       }else{
-                               // item's label/icon/etc. changed.
-                               this.onChange(item);
-                       }
-               }
-       });
-
-}
+//>>built
+define("dijit/tree/TreeStoreModel",["dojo/_base/array","dojo/aspect","dojo/_base/declare","dojo/_base/json","dojo/_base/lang"],function(_1,_2,_3,_4,_5){return _3("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(_6){_5.mixin(this,_6);this.connects=[];var _7=this.store;if(!_7.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_7.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([_2.after(_7,"onNew",_5.hitch(this,"onNewItem"),true),_2.after(_7,"onDelete",_5.hitch(this,"onDeleteItem"),true),_2.after(_7,"onSet",_5.hitch(this,"onSetItem"),true)]);}},destroy:function(){var h;while(h=this.connects.pop()){h.remove();}},getRoot:function(_8,_9){if(this.root){_8(this.root);}else{this.store.fetch({query:this.query,onComplete:_5.hitch(this,function(_a){if(_a.length!=1){throw new Error(this.declaredClass+": query "+_4.stringify(this.query)+" returned "+_a.length+" items, but must return exactly one item");}this.root=_a[0];_8(this.root);}),onError:_9});}},mayHaveChildren:function(_b){return _1.some(this.childrenAttrs,function(_c){return this.store.hasAttribute(_b,_c);},this);},getChildren:function(_d,_e,_f){var _10=this.store;if(!_10.isItemLoaded(_d)){var _11=_5.hitch(this,arguments.callee);_10.loadItem({item:_d,onItem:function(_12){_11(_12,_e,_f);},onError:_f});return;}var _13=[];for(var i=0;i<this.childrenAttrs.length;i++){var _14=_10.getValues(_d,this.childrenAttrs[i]);_13=_13.concat(_14);}var _15=0;if(!this.deferItemLoadingUntilExpand){_1.forEach(_13,function(_16){if(!_10.isItemLoaded(_16)){_15++;}});}if(_15==0){_e(_13);}else{_1.forEach(_13,function(_17,idx){if(!_10.isItemLoaded(_17)){_10.loadItem({item:_17,onItem:function(_18){_13[idx]=_18;if(--_15==0){_e(_13);}},onError:_f});}});}},isItem:function(_19){return this.store.isItem(_19);},fetchItemByIdentity:function(_1a){this.store.fetchItemByIdentity(_1a);},getIdentity:function(_1b){return this.store.getIdentity(_1b);},getLabel:function(_1c){if(this.labelAttr){return this.store.getValue(_1c,this.labelAttr);}else{return this.store.getLabel(_1c);}},newItem:function(_1d,_1e,_1f){var _20={parent:_1e,attribute:this.childrenAttrs[0]},_21;if(this.newItemIdAttr&&_1d[this.newItemIdAttr]){this.fetchItemByIdentity({identity:_1d[this.newItemIdAttr],scope:this,onItem:function(_22){if(_22){this.pasteItem(_22,null,_1e,true,_1f);}else{_21=this.store.newItem(_1d,_20);if(_21&&(_1f!=undefined)){this.pasteItem(_21,_1e,_1e,false,_1f);}}}});}else{_21=this.store.newItem(_1d,_20);if(_21&&(_1f!=undefined)){this.pasteItem(_21,_1e,_1e,false,_1f);}}},pasteItem:function(_23,_24,_25,_26,_27){var _28=this.store,_29=this.childrenAttrs[0];if(_24){_1.forEach(this.childrenAttrs,function(_2a){if(_28.containsValue(_24,_2a,_23)){if(!_26){var _2b=_1.filter(_28.getValues(_24,_2a),function(x){return x!=_23;});_28.setValues(_24,_2a,_2b);}_29=_2a;}});}if(_25){if(typeof _27=="number"){var _2c=_28.getValues(_25,_29).slice();_2c.splice(_27,0,_23);_28.setValues(_25,_29,_2c);}else{_28.setValues(_25,_29,_28.getValues(_25,_29).concat(_23));}}},onChange:function(){},onChildrenChange:function(){},onDelete:function(){},onNewItem:function(_2d,_2e){if(!_2e){return;}this.getChildren(_2e.item,_5.hitch(this,function(_2f){this.onChildrenChange(_2e.item,_2f);}));},onDeleteItem:function(_30){this.onDelete(_30);},onSetItem:function(_31,_32){if(_1.indexOf(this.childrenAttrs,_32)!=-1){this.getChildren(_31,_5.hitch(this,function(_33){this.onChildrenChange(_31,_33);}));}else{this.onChange(_31);}}});});
\ No newline at end of file