StoreExplorer.js 5.8 KB

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