PDA

View Full Version : DD Question: Is this possible?



virtix
21 Feb 2008, 5:24 AM
Sorry if this sounds like I haven't done my homework, but I'm under the gun at work and have a meeting in a couple of hours and a decision will be made on whether or not to use ExtJs for a target app based on the answer.

What we are looking to do is to be able to Drag some data from a widget and Drop it on to a grid cell. In other words, instead of clicking an editable cell and entering data, the users would like to be able to drag and drop the data from another widget.

If you could point me to an example that would be much appreciated!

Thanks!
bill

TommyMaintz
21 Feb 2008, 5:30 AM
I don't know if there is an example somewhere, but i do know for sure that this is possible.

Animal
21 Feb 2008, 6:07 AM
As a quick and dirty bodge, here's the array-grid example hacked up to allow you to drag the data from that red div into a grid cell. Drop this file into examples/grid as array-grid.js:



Ext.onReady(function(){

Ext.state.Manager.setProvider(new Ext.state.CookieProvider());

var myData = [
['3m Co',71.72,0.02,0.03,'9/1 12:00am'],
['Alcoa Inc',29.01,0.42,1.47,'9/1 12:00am'],
['Altria Group Inc',83.81,0.28,0.34,'9/1 12:00am'],
['American Express Company',52.55,0.01,0.02,'9/1 12:00am'],
['American International Group, Inc.',64.13,0.31,0.49,'9/1 12:00am'],
['AT&T Inc.',31.61,-0.48,-1.54,'9/1 12:00am'],
['Boeing Co.',75.43,0.53,0.71,'9/1 12:00am'],
['Caterpillar Inc.',67.27,0.92,1.39,'9/1 12:00am'],
['Citigroup, Inc.',49.37,0.02,0.04,'9/1 12:00am'],
['E.I. du Pont de Nemours and Company',40.48,0.51,1.28,'9/1 12:00am'],
['Exxon Mobil Corp',68.1,-0.43,-0.64,'9/1 12:00am'],
['General Electric Company',34.14,-0.08,-0.23,'9/1 12:00am'],
['General Motors Corporation',30.27,1.09,3.74,'9/1 12:00am'],
['Hewlett-Packard Co.',36.53,-0.03,-0.08,'9/1 12:00am'],
['Honeywell Intl Inc',38.77,0.05,0.13,'9/1 12:00am'],
['Intel Corporation',19.88,0.31,1.58,'9/1 12:00am'],
['International Business Machines',81.41,0.44,0.54,'9/1 12:00am'],
['Johnson & Johnson',64.72,0.06,0.09,'9/1 12:00am'],
['JP Morgan & Chase & Co',45.73,0.07,0.15,'9/1 12:00am'],
['McDonald\'s Corporation',36.76,0.86,2.40,'9/1 12:00am'],
['Merck & Co., Inc.',40.96,0.41,1.01,'9/1 12:00am'],
['Microsoft Corporation',25.84,0.14,0.54,'9/1 12:00am'],
['Pfizer Inc',27.96,0.4,1.45,'9/1 12:00am'],
['The Coca-Cola Company',45.07,0.26,0.58,'9/1 12:00am'],
['The Home Depot, Inc.',34.64,0.35,1.02,'9/1 12:00am'],
['The Procter & Gamble Company',61.91,0.01,0.02,'9/1 12:00am'],
['United Technologies Corporation',63.26,0.55,0.88,'9/1 12:00am'],
['Verizon Communications',35.57,0.39,1.11,'9/1 12:00am'],
['Wal-Mart Stores, Inc.',45.45,0.73,1.63,'9/1 12:00am']
];

// example of custom renderer function
function change(val){
if(val > 0){
return '<span style="color:green;">' + val + '</span>';
}else if(val < 0){
return '<span style="color:red;">' + val + '</span>';
}
return val;
}

// example of custom renderer function
function pctChange(val){
if(val > 0){
return '<span style="color:green;">' + val + '%</span>';
}else if(val < 0){
return '<span style="color:red;">' + val + '%</span>';
}
return val;
}

// create the data store
var store = new Ext.data.SimpleStore({
fields: [
{name: 'company'},
{name: 'price', type: 'float'},
{name: 'change', type: 'float'},
{name: 'pctChange', type: 'float'},
{name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
]
});
store.loadData(myData);

Ext.ToolTip.prototype.onTargetOver =
Ext.ToolTip.prototype.onTargetOver.createInterceptor(function(e) {
this.baseTarget = e.getTarget();
});
Ext.ToolTip.prototype.onMouseMove =
Ext.ToolTip.prototype.onMouseMove.createInterceptor(function(e) {
if (!e.within(this.baseTarget)) {
this.onTargetOver(e);
return false;
}
});

// create the Grid
var grid = new Ext.grid.GridPanel({
sm: new Ext.grid.RowSelectionModel(),
store: store,
columns: [
{id:'company',header: "Company", width: 160, sortable: true, dataIndex: 'company'},
{header: "Price", width: 75, sortable: true, renderer: 'usMoney', dataIndex: 'price'},
{header: "Change", width: 75, sortable: true, renderer: change, dataIndex: 'change'},
{header: "% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: 'pctChange'},
{header: "Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
],
onRender: function() {
Ext.grid.GridPanel.prototype.onRender.apply(this, arguments);
this.addEvents("beforetooltipshow");

var v = this.view;
this.dropZone = new Ext.dd.DropZone(this.view.mainBody);
this.dropZone.getTargetFromEvent = function(e) {
return this.el.dom;
};
this.dropZone.onNodeDrop = function(node, dd, e, dragData) {
var t = e.getTarget();
var rowIndex = v.findRowIndex(t);
var columnIndex = v.findCellIndex(t);
var record = grid.getStore().getAt(rowIndex); // Get the Record for the row
var fieldName = grid.getColumnModel().getDataIndex(columnIndex); // Get field name for the column
record.set(fieldName, dragData.userData);
};
this.dropZone.onNodeOver = function(node, dd, e, data) {
return "x-dd-drop-ok";
}
},
stripeRows: true,
autoExpandColumn: 'company',
height:350,
width:600,
title:'Array Grid',
bbar: new Ext.PagingToolbar({
buttons: [{
text: "Click Me"
}],
store: store,
pageSize: 25
}),
listeners: {
render: function(g) {
g.on("beforetooltipshow", function(grid, row, col) {
grid.tooltip.body.update("Tooltip for (" + row + ", " + col + ")");
});
}
}
});

grid.render('grid-example');
var a = Ext.getBody().createChild("<div style='width:100px;background-color:red' id='dragSource'>Some data</div>");
var s = new Ext.dd.DragZone(a);
s.getDragData = function(e) {
var t = e.getTarget();
return {
userData: t.innerHTML,
ddel: this.el.dom.cloneNode(true)
};
}
grid.getSelectionModel().selectFirstRow();
});

virtix
21 Feb 2008, 7:20 AM
Thanks Tommy and Animal! This is exactly what I needed. I'll keep you posted and let you know how the meeting goes.

Here's a virtual beer on me ...




|OOOOO|_
| ~| |
| | |
| |/
\____/


Thanks again!
bill

Animal
21 Feb 2008, 7:46 AM
Obviously, you won't have the ux.MultiSelectionModel. I'll edit...

americos
22 Apr 2008, 1:01 PM
Animal, this is a great and simple example.

I think it should be in the Ext tutorial section.

Thanks again

mystix
22 Apr 2008, 5:37 PM
Animal, this is a great and simple example.

I think it should be in the Ext tutorial section.

Thanks again

moved to the Examples and Extras forum

Animal
23 Apr 2008, 2:57 AM
That example didn't work that great.

There is a fixed up version in the Ext 3.0 examples/dd directory... (Just to get you excited about 3.0!)

Premium members with access to SVN should be able to play with the 3.0 trunk branch from SVN and run the newest examples...

mjlecomte
23 Apr 2008, 12:21 PM
That example didn't work that great.

There is a fixed up version in the Ext 3.0 examples/dd directory... (Just to get you excited about 3.0!)

Premium members with access to SVN should be able to play with the 3.0 trunk branch from SVN and run the newest examples...

The SVN example works good.

Foggy
25 Apr 2008, 10:32 AM
Woah, the new buttons are really hot :)
But i cant find any ext-3.0-dev/examples/dd folder...

Animal
26 Apr 2008, 12:53 PM
It's ext/trunk/examples/dd

Foggy
28 Apr 2008, 12:09 AM
Ah, thanks for your response.
Thats a very nice example, thanks for this animal...