/*
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.data.StoreExplorer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.data.StoreExplorer"] = true;
dojo.provide("dojox.data.StoreExplorer");
dojo.require("dojox.grid.DataGrid");
dojo.require("dojox.data.ItemExplorer");
dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.ContentPane");
dojo.declare("dojox.data.StoreExplorer", dijit.layout.BorderContainer, {
constructor: function(options){
dojo.mixin(this, options);
},
store: null,
columnWidth: '',
stringQueries: false,
showAllColumns: false,
postCreate: function(){
var self = this;
this.inherited(arguments);
var contentPane = new dijit.layout.ContentPane({
region:'top'
}).placeAt(this);
function addButton(name, action){
var button = new dijit.form.Button({label: name});
contentPane.containerNode.appendChild(button.domNode);
button.onClick = action;
return button;
}
var queryText = contentPane.containerNode.appendChild(document.createElement("span"));
queryText.innerHTML = "Enter query: ";
queryText.id = "queryText";
var queryTextBox = contentPane.containerNode.appendChild(document.createElement("input"));
queryTextBox.type = "text";
queryTextBox.id = "queryTextBox";
addButton("Query",function(){
var query = queryTextBox.value;
self.setQuery(self.stringQueries ? query : dojo.fromJson(query));
});
contentPane.containerNode.appendChild(document.createElement("span")).innerHTML = " ";
var createNewButton = addButton("Create New", dojo.hitch(this, "createNew"));
var deleteButton = addButton("Delete",function(){
var items = grid.selection.getSelected();
for(var i = 0; i < items.length; i++){
self.store.deleteItem(items[i]);
}
});
this.setItemName = function(name){
createNewButton.attr('label',"<img style='width:12px; height:12px' src='" + dojo.moduleUrl("dijit.themes.tundra.images","dndCopy.png") + "' /> Create New " + name);
deleteButton.attr('label',"Delete " + name);
};
addButton("Save",function(){
self.store.save({onError:function(error){
alert(error);
}});
//refresh the tree
self.tree.refreshItem();
});
addButton("Revert",function(){
self.store.revert();
});
addButton("Add Column", function(){
var columnName = prompt("Enter column name:","property");
if(columnName){
self.gridLayout.push({
field: columnName,
name: columnName,
formatter: dojo.hitch(self,"_formatCell"),
editable: true
});
self.grid.attr("structure",self.gridLayout);
}
});
var centerCP = new dijit.layout.ContentPane({
region:'center'
}).placeAt(this);
var grid = this.grid = new dojox.grid.DataGrid(
{store: this.store}
);
centerCP.attr("content", grid);
grid.canEdit = function(inCell, inRowIndex){
var value = this._copyAttr(inRowIndex, inCell.field);
return !(value && typeof value == 'object') || value instanceof Date;
}
var trailingCP = new dijit.layout.ContentPane({
region: 'trailing',
splitter: true,
style: "width: 300px"
}).placeAt(this);
var tree = this.tree = new dojox.data.ItemExplorer({
store: this.store}
);
trailingCP.attr("content", tree);
dojo.connect(grid, "onCellClick", function(){
var selected = grid.selection.getSelected()[0];
tree.setItem(selected);
});
this.gridOnFetchComplete = grid._onFetchComplete;
this.setStore(this.store);
},
setQuery: function(query, options){
this.grid.setQuery(query, options);
},
_formatCell: function(value){
if(this.store.isItem(value)){
return this.store.getLabel(value) || this.store.getIdentity(value);
}
return value;
},
setStore: function(store){
this.store = store;
var self = this;
var grid = this.grid;
grid._pending_requests[0] = false;
function formatCell(value){
return self._formatCell(value);
}
var defaultOnComplete = this.gridOnFetchComplete;
grid._onFetchComplete = function(items, req){
var layout = self.gridLayout = [];
var column, key, item, i, j, k, idAttributes = store.getIdentityAttributes();
for(i = 0; i < idAttributes.length; i++){
key = idAttributes[i];
layout.push({
field: key,
name: key,
_score: 100,
formatter: formatCell,
editable: false
});
}
for(i=0; item = items[i++];){
var keys = store.getAttributes(item);
for(k=0; key = keys[k++];){
var found = false;
for(j=0; column = layout[j++];){
if(column.field == key){
column._score++;
found = true;
break;
}
}
if(!found){
layout.push({
field: key,
name: key,
_score: 1,
formatter: formatCell,
styles: "white-space:nowrap; ",
editable: true
});
}
}
}
layout = layout.sort(function(a, b){
return b._score - a._score;
});
if(!self.showAllColumns){
for(j=0; column=layout[j]; j++){
if(column._score < items.length/40 * j) {
layout.splice(j, layout.length-j);
break;
}
}
}
for(j=0; column = layout[j++];){
column.width=self.columnWidth || Math.round(100/layout.length) + '%';
}
grid._onFetchComplete = defaultOnComplete;
grid.attr("structure",layout);
var retValue = defaultOnComplete.apply(this, arguments);
}
grid.setStore(store);
this.queryOptions = {cache:true};
this.tree.setStore(store);
},
createNew: function(){
var props = prompt("Enter any properties (in JSON literal form) to put in the new item (passed to the newItem constructor):","{ }");
if(props){
try{
this.store.newItem(dojo.fromJson(props));
}catch(e){
alert(e);
}
}
}
});
}