3 This file is part of Ext JS 4
5 Copyright (c) 2011 Sencha Inc
7 Contact: http://www.sencha.com/contact
9 GNU General Public License Usage
10 This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file. Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
12 If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.
17 // A DropZone which cooperates with DragZones whose dragData contains
18 // a "field" property representing a form Field. Fields may be dropped onto
19 // grid data cells containing a matching data type.
20 Ext.define('Ext.ux.CellFieldDropZone', {
21 extend: 'Ext.dd.DropZone',
23 constructor: function(){},
25 // Call the DropZone constructor using the View's scrolling element
26 // only after the grid has been rendered.
27 init: function(grid) {
35 Ext.ux.CellFieldDropZone.superclass.constructor.call(me, me.view.el);
40 grid.on('render', me.init, me, {single: true});
44 // Scroll the main configured Element when we drag close to the edge
45 containerScroll: true,
47 getTargetFromEvent: function(e) {
51 // Ascertain whether the mousemove is within a grid cell
52 var cell = e.getTarget(v.cellSelector);
55 // We *are* within a grid cell, so ask the View exactly which one,
56 // Extract data from the Model to create a target object for
57 // processing in subsequent onNodeXXXX methods. Note that the target does
58 // not have to be a DOM element. It can be whatever the noNodeXXX methods are
59 // programmed to expect.
60 var row = v.findItemByChild(cell),
61 columnIndex = cell.cellIndex;
63 if (row && Ext.isDefined(columnIndex)) {
66 record: v.getRecord(row),
67 fieldName: me.grid.columns[columnIndex].dataIndex
73 // On Node enter, see if it is valid for us to drop the field on that type of column.
74 onNodeEnter: function(target, dd, e, dragData) {
80 // Check that a field is being dragged.
81 var f = dragData.field;
86 // Check whether the data type of the column being dropped on accepts the
87 // dragged field type. If so, set dropOK flag, and highlight the target node.
88 var type = target.record.fields.get(target.fieldName).type,
89 types = Ext.data.Types;
93 if (!f.isXType('numberfield')) {
98 if (!f.isXType('datefield')) {
103 if (!f.isXType('checkbox')) {
108 Ext.fly(target.node).addCls('x-drop-target-active');
111 // Return the class name to add to the drag proxy. This provides a visual indication
112 // of drop allowed or not allowed.
113 onNodeOver: function(target, dd, e, dragData) {
114 return this.dropOK ? this.dropAllowed : this.dropNotAllowed;
117 // highlight the target node.
118 onNodeOut: function(target, dd, e, dragData) {
119 Ext.fly(target.node).removeCls('x-drop-target-active');
122 // Process the drop event if we have previously ascertained that a drop is OK.
123 onNodeDrop: function(target, dd, e, dragData) {
125 target.record.set(target.fieldName, dragData.field.getValue());
131 // A class which makes Fields within a Panel draggable.
132 // the dragData delivered to a cooperating DropZone's methods contains
133 // the dragged Field in the property "field".
134 Ext.define('Ext.ux.PanelFieldDragZone', {
136 extend: 'Ext.dd.DragZone',
138 constructor: function(){},
140 // Call the DRagZone's constructor. The Panel must have been rendered.
141 init: function(panel) {
142 if (panel.nodeType) {
143 Ext.ux.PanelFieldDragZone.superclass.init.apply(this, arguments);
145 if (panel.rendered) {
146 Ext.ux.PanelFieldDragZone.superclass.constructor.call(this, panel.getEl());
147 var i = Ext.fly(panel.getEl()).select('input');
150 panel.on('afterlayout', this.init, this, {single: true});
157 // On mousedown, we ascertain whether it is on one of our draggable Fields.
158 // If so, we collect data about the draggable object, and return a drag data
159 // object which contains our own data, plus a "ddel" property which is a DOM
160 // node which provides a "view" of the dragged data.
161 getDragData: function(e) {
162 var t = e.getTarget('input');
166 // Ugly code to "detach" the drag gesture from the input field.
167 // Without this, Opera never changes the mouseover target from the input field
168 // even when dragging outside of the field - it just keeps selecting.
170 Ext.fly(t).on('mousemove', function(e1){
171 t.style.visibility = 'hidden';
172 Ext.defer(function(){
173 t.style.visibility = '';
175 }, null, {single:true});
178 // Get the data we are dragging: the Field
179 // create a ddel for the drag proxy to display
180 var f = Ext.ComponentQuery.query('field[inputEl]{inputEl.id=="' + t.id + '"}')[0];
181 var d = document.createElement('div');
182 d.className = 'x-form-text';
183 d.appendChild(document.createTextNode(t.value));
184 Ext.fly(d).setWidth(f.getEl().getWidth());
192 // The coordinates to slide the drag proxy back to on failed drop.
193 getRepairXY: function() {
194 return this.dragData.field.getEl().getXY();
198 Ext.onReady(function(){
201 ['3m Co',71.72,0.02,0.03,'9/1 12:00am'],
202 ['Alcoa Inc',29.01,0.42,1.47,'9/1 12:00am'],
203 ['Altria Group Inc',83.81,0.28,0.34,'9/1 12:00am'],
204 ['American Express Company',52.55,0.01,0.02,'9/1 12:00am'],
205 ['American International Group, Inc.',64.13,0.31,0.49,'9/1 12:00am'],
206 ['AT&T Inc.',31.61,-0.48,-1.54,'9/1 12:00am'],
207 ['Boeing Co.',75.43,0.53,0.71,'9/1 12:00am'],
208 ['Caterpillar Inc.',67.27,0.92,1.39,'9/1 12:00am'],
209 ['Citigroup, Inc.',49.37,0.02,0.04,'9/1 12:00am'],
210 ['E.I. du Pont de Nemours and Company',40.48,0.51,1.28,'9/1 12:00am'],
211 ['Exxon Mobil Corp',68.1,-0.43,-0.64,'9/1 12:00am'],
212 ['General Electric Company',34.14,-0.08,-0.23,'9/1 12:00am'],
213 ['General Motors Corporation',30.27,1.09,3.74,'9/1 12:00am'],
214 ['Hewlett-Packard Co.',36.53,-0.03,-0.08,'9/1 12:00am'],
215 ['Honeywell Intl Inc',38.77,0.05,0.13,'9/1 12:00am'],
216 ['Intel Corporation',19.88,0.31,1.58,'9/1 12:00am'],
217 ['International Business Machines',81.41,0.44,0.54,'9/1 12:00am'],
218 ['Johnson & Johnson',64.72,0.06,0.09,'9/1 12:00am'],
219 ['JP Morgan & Chase & Co',45.73,0.07,0.15,'9/1 12:00am'],
220 ['McDonald\'s Corporation',36.76,0.86,2.40,'9/1 12:00am'],
221 ['Merck & Co., Inc.',40.96,0.41,1.01,'9/1 12:00am'],
222 ['Microsoft Corporation',25.84,0.14,0.54,'9/1 12:00am'],
223 ['Pfizer Inc',27.96,0.4,1.45,'9/1 12:00am'],
224 ['The Coca-Cola Company',45.07,0.26,0.58,'9/1 12:00am'],
225 ['The Home Depot, Inc.',34.64,0.35,1.02,'9/1 12:00am'],
226 ['The Procter & Gamble Company',61.91,0.01,0.02,'9/1 12:00am'],
227 ['United Technologies Corporation',63.26,0.55,0.88,'9/1 12:00am'],
228 ['Verizon Communications',35.57,0.39,1.11,'9/1 12:00am'],
229 ['Wal-Mart Stores, Inc.',45.45,0.73,1.63,'9/1 12:00am']
232 // example of custom renderer function
233 function change(val){
235 return '<span style="color:green;">' + val + '</span>';
237 return '<span style="color:red;">' + val + '</span>';
242 // example of custom renderer function
243 function pctChange(val){
245 return '<span style="color:green;">' + val + '%</span>';
247 return '<span style="color:red;">' + val + '%</span>';
252 // create the data store
253 var store = Ext.create('Ext.data.ArrayStore', {
256 {name: 'price', type: 'float'},
257 {name: 'change', type: 'float'},
258 {name: 'pctChange', type: 'float'},
259 {name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
264 var helpWindow = Ext.create('Ext.Window', {
265 title: 'Source code',
276 render: function(w) {
278 url: 'field-to-grid-dd.js',
279 success: function(r) {
280 w.items.first().setValue(r.responseText);
288 var grid = Ext.create('Ext.grid.Panel', {
291 {id:'company',header: "Company", width: 160, sortable: true, dataIndex: 'company'},
292 {header: "Price", width: 75, sortable: true, renderer: 'usMoney', dataIndex: 'price'},
293 {header: "Change", width: 75, sortable: true, renderer: change, dataIndex: 'change'},
294 {header: "% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: 'pctChange'},
295 {header: "Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
297 plugins: Ext.create('Ext.ux.CellFieldDropZone'),
299 autoExpandColumn: 'company',
308 handler: function() {
315 grid.render('grid-example');
317 var f = Ext.create('Ext.Panel', {
320 plugins: Ext.create('Ext.ux.PanelFieldDragZone'),
324 fieldLabel: 'Drag this text',
327 xtype: 'numberfield',
328 fieldLabel: 'Drag this number',
332 fieldLabel: 'Drag this date',
335 renderTo: Ext.getBody()