source: Dev/branches/rest-dojo-ui/client/dojox/grid/LazyTreeGridStoreModel.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 3.2 KB
Line 
1define([
2        "dojo/_base/declare",
3        "dojo/_base/array",
4        "dojo/_base/lang",
5        "dijit/tree/ForestStoreModel"], function(declare, array, lang, ForestStoreModel){
6
7return declare("dojox.grid.LazyTreeGridStoreModel", ForestStoreModel, {
8
9        // There are different approaches to get children for client-side
10        // DataStore (e.g. dojo.data.ItemFileReadStore) or server-side DataStore
11        // (e.g. dojox.data.QueryReadStore), so we need to be sure what kind of
12        // DataStore is being used
13        serverStore: false, // server side store
14       
15        constructor: function(/* Object */ args){
16                this.serverStore = !!args.serverStore;
17        },
18
19        mayHaveChildren: function(/*dojo.data.Item*/ item){
20                var children = null;
21                return array.some(this.childrenAttrs, function(attr){
22                                children = this.store.getValue(item, attr);
23                                if(lang.isString(children)){
24                                        return parseInt(children, 10) > 0 || children.toLowerCase() === "true" ? true : false;
25                                }else if(typeof children == "number"){
26                                        return children > 0;
27                                }else if(typeof children == "boolean"){
28                                        return children;
29                                }else if(this.store.isItem(children)){
30                                        children = this.store.getValues(item, attr);
31                                        return lang.isArray(children) ? children.length > 0 : false;
32                                }else{
33                                        return false;
34                                }
35                }, this);
36        },
37       
38        getChildren: function(/*dojo.data.Item*/parentItem, /*function(items, size)*/onComplete, /*function*/ onError, /*object*/queryObj){
39                if(queryObj){
40                        var start = queryObj.start || 0,
41                                count = queryObj.count,
42                                parentId = queryObj.parentId,
43                                sort = queryObj.sort;
44                        if(parentItem === this.root){
45                                this.root.size = 0;
46                                this.store.fetch({
47                                        start: start,
48                                        count: count,
49                                        sort: sort,
50                                        query: this.query,
51                                        onBegin: lang.hitch(this, function(size){
52                                                this.root.size = size;
53                                        }),
54                                        onComplete: lang.hitch(this, function(items){
55                                                onComplete(items, queryObj, this.root.size);
56                                        }),
57                                        onError: onError
58                                });
59                        }else{
60                                var store = this.store;
61                                if(!store.isItemLoaded(parentItem)){
62                                        var getChildren = lang.hitch(this, arguments.callee);
63                                        store.loadItem({
64                                                item: parentItem,
65                                                onItem: function(parentItem){
66                                                        getChildren(parentItem, onComplete, onError, queryObj);
67                                                },
68                                                onError: onError
69                                        });
70                                        return;
71                                }
72                                if(this.serverStore && !this._isChildrenLoaded(parentItem)){
73                                        this.childrenSize = 0;
74                                        this.store.fetch({
75                                                start: start,
76                                                count: count,
77                                                sort: sort,
78                                                query: lang.mixin({parentId: parentId}, this.query || {}),
79                                                onBegin: lang.hitch(this, function(size){
80                                                        this.childrenSize = size;
81                                                }),
82                                                onComplete: lang.hitch(this, function(items){
83                                                        onComplete(items, queryObj, this.childrenSize);
84                                                }),
85                                                onError: onError
86                                        });
87                                }else{
88                                        this.inherited(arguments);
89                                }
90                        }
91                }else{
92                        this.inherited(arguments);
93                }
94        },
95       
96        _isChildrenLoaded: function(parentItem){
97                // summary:
98                //              Check if all children of the given item have been loaded
99                var children = null;
100                return array.every(this.childrenAttrs, function(attr){
101                        children = this.store.getValues(parentItem, attr);
102                        return array.every(children, function(c){
103                                return this.store.isItemLoaded(c);
104                        }, this);
105                }, this);
106        },
107       
108        //overwritten
109        onNewItem: function(item, parentInfo){ },
110       
111        onDeleteItem: function(item){ }
112});
113});
Note: See TracBrowser for help on using the repository browser.