123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- /*
- Copyright (c) 2004-2012, 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);
- }
- }
- }
- });
- }
|