StoreExplorer.js 5.6 KB

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