1 | dojo.provide("dojox.data.StoreExplorer"); |
---|
2 | dojo.require("dojox.grid.DataGrid"); |
---|
3 | dojo.require("dojox.data.ItemExplorer"); |
---|
4 | dojo.require("dijit.layout.BorderContainer"); |
---|
5 | dojo.require("dijit.layout.ContentPane"); |
---|
6 | |
---|
7 | dojo.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 | }); |
---|