source: Dev/trunk/src/client/dojox/data/StoreExplorer.js

Last change on this file was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 5.4 KB
Line 
1dojo.provide("dojox.data.StoreExplorer");
2dojo.require("dojox.grid.DataGrid");
3dojo.require("dojox.data.ItemExplorer");
4dojo.require("dijit.layout.BorderContainer");
5dojo.require("dijit.layout.ContentPane");
6
7dojo.declare("dojox.data.StoreExplorer", dijit.layout.BorderContainer, {
8        constructor: function(options){
9                dojo.mixin(this, options);
10        },
11        store: null,
12        columnWidth: '',
13        stringQueries: false,
14        showAllColumns: false,
15        postCreate: function(){
16                var self = this;
17                this.inherited(arguments);
18                var contentPane = new dijit.layout.ContentPane({
19                        region:'top'
20                }).placeAt(this);
21                function addButton(name, action){
22                        var button = new dijit.form.Button({label: name});
23                        contentPane.containerNode.appendChild(button.domNode);
24                        button.onClick = action;
25                        return button;
26                }
27                var queryText = contentPane.containerNode.appendChild(document.createElement("span"));
28                queryText.innerHTML = "Enter query:  ";
29                queryText.id = "queryText";
30                var queryTextBox = contentPane.containerNode.appendChild(document.createElement("input"));
31                queryTextBox.type = "text";
32                queryTextBox.id = "queryTextBox";
33                addButton("Query",function(){
34                        var query = queryTextBox.value;
35                        self.setQuery(self.stringQueries ? query : dojo.fromJson(query));
36                });
37                contentPane.containerNode.appendChild(document.createElement("span")).innerHTML = "   ";
38                var createNewButton = addButton("Create New", dojo.hitch(this, "createNew"));
39                var deleteButton = addButton("Delete",function(){
40                        var items = grid.selection.getSelected();
41                        for(var i = 0; i < items.length; i++){
42                                self.store.deleteItem(items[i]);
43                        }
44                });
45                this.setItemName = function(name){
46                        createNewButton.attr('label',"<img style='width:12px; height:12px' src='" + dojo.moduleUrl("dijit.themes.tundra.images","dndCopy.png") + "' /> Create New " + name);
47                        deleteButton.attr('label',"Delete " + name);
48                };
49                addButton("Save",function(){
50                        self.store.save({onError:function(error){
51                                alert(error);
52                        }});
53                        //refresh the tree
54                        self.tree.refreshItem();
55                });
56                addButton("Revert",function(){
57                        self.store.revert();
58                });
59                addButton("Add Column", function(){
60                        var columnName = prompt("Enter column name:","property");
61                        if(columnName){
62                                self.gridLayout.push({
63                                                field: columnName,
64                                                name: columnName,
65                                                formatter: dojo.hitch(self,"_formatCell"),
66                                                editable: true
67                                        });
68                                self.grid.attr("structure",self.gridLayout);
69                        }
70                });
71                var centerCP = new dijit.layout.ContentPane({
72                        region:'center'
73                }).placeAt(this);
74                var grid = this.grid = new dojox.grid.DataGrid(
75                                {store: this.store}
76                        );
77                centerCP.attr("content", grid);
78                grid.canEdit = function(inCell, inRowIndex){
79                        var value = this._copyAttr(inRowIndex, inCell.field);
80                        return !(value && typeof value == 'object') || value instanceof Date;
81                }
82
83                var trailingCP = new dijit.layout.ContentPane({
84                        region: 'trailing',
85                        splitter: true,
86                        style: "width: 300px"
87                }).placeAt(this);
88
89                var tree = this.tree = new dojox.data.ItemExplorer({
90                        store: this.store}
91                        );
92                trailingCP.attr("content", tree);
93
94                dojo.connect(grid, "onCellClick", function(){
95                        var selected = grid.selection.getSelected()[0];
96                        tree.setItem(selected);
97                });
98
99                this.gridOnFetchComplete = grid._onFetchComplete;
100                this.setStore(this.store);
101        },
102        setQuery: function(query, options){
103                this.grid.setQuery(query, options);
104        },
105        _formatCell: function(value){
106                if(this.store.isItem(value)){
107                        return this.store.getLabel(value) || this.store.getIdentity(value);
108                }
109                return value;
110        },
111        setStore: function(store){
112                this.store = store;
113                var self = this;
114                var grid = this.grid;
115                grid._pending_requests[0] = false;
116                function formatCell(value){
117                        return self._formatCell(value);
118                }
119                var defaultOnComplete = this.gridOnFetchComplete;
120                grid._onFetchComplete = function(items, req){
121                        var layout = self.gridLayout = [];
122                        var column, key, item, i, j, k, idAttributes = store.getIdentityAttributes();
123                        for(i = 0; i < idAttributes.length; i++){
124                                key = idAttributes[i];
125                                layout.push({
126                                        field: key,
127                                        name: key,
128                                        _score: 100,
129                                        formatter: formatCell,
130                                        editable: false
131                                });
132
133                        }
134                        for(i=0; item = items[i++];){
135                                var keys = store.getAttributes(item);
136                                for(k=0; key = keys[k++];){
137                                        var found = false;
138                                        for(j=0; column = layout[j++];){
139                                                if(column.field == key){
140                                                        column._score++;
141                                                        found = true;
142                                                        break;
143                                                }
144                                        }
145                                        if(!found){
146                                                layout.push({
147                                                        field: key,
148                                                        name: key,
149                                                        _score: 1,
150                                                        formatter: formatCell,
151                                                        styles: "white-space:nowrap; ",
152                                                        editable: true
153                                                });
154                                        }
155                                }
156                        }
157                        layout = layout.sort(function(a, b){
158                                return  b._score - a._score;
159                        });
160                        if(!self.showAllColumns){
161                                for(j=0; column=layout[j]; j++){
162                                        if(column._score < items.length/40 * j) {
163                                                layout.splice(j, layout.length-j);
164                                                break;
165                                        }
166                                }
167                        }
168                        for(j=0; column = layout[j++];){
169                                column.width=self.columnWidth || Math.round(100/layout.length) + '%';
170                        }
171                        grid._onFetchComplete = defaultOnComplete;
172                        grid.attr("structure",layout);
173                        var retValue = defaultOnComplete.apply(this, arguments);
174
175                }
176                grid.setStore(store);
177                this.queryOptions = {cache:true};
178                this.tree.setStore(store);
179        },
180        createNew: function(){
181                var props = prompt("Enter any properties (in JSON literal form) to put in the new item (passed to the newItem constructor):","{ }");
182                if(props){
183                        try{
184                                this.store.newItem(dojo.fromJson(props));
185                        }catch(e){
186                                alert(e);
187                        }
188
189                }
190        }
191});
Note: See TracBrowser for help on using the repository browser.