Commit 915d6711fb5a158c886ac190dae0a50626341b98

Authored by Benjamin Renard
1 parent 2e4a962c

DownloadNode now inherits from ExecutableNode + first step for code cleanup

js/app/controllers/DownloadModule.js
... ... @@ -22,7 +22,6 @@ Ext.define('amdaDesktop.DownloadModule', {
22 22 * @cfg {String} data models
23 23 * @required
24 24 */
25   - objectDataModel : 'amdaModel.Download',
26 25 nodeDataModel : 'amdaModel.DownloadNode',
27 26  
28 27 /**
... ... @@ -30,21 +29,11 @@ Ext.define('amdaDesktop.DownloadModule', {
30 29 * @required
31 30 */
32 31 width: 600,
33   - height: 600,
  32 + height: 620,
34 33 uiType : 'panelDownload',
35 34 helpTitle : 'Help on Download Module',
36 35 helpFile : 'downloadHelp',
37 36  
38   - /**
39   - * @override
40   - */
41   - createWindow : function() {
42   - if (!this.linkedNode){
43   - this.setLinkedNode(amdaModel.DownloadNode);
44   - }
45   - this.callParent(arguments);
46   - },
47   -
48 37 saveState: function() {
49 38 var uiContent = this.getUiContent();
50 39 var form = uiContent.down('form').getForm();
... ... @@ -56,5 +45,20 @@ Ext.define('amdaDesktop.DownloadModule', {
56 45 getState : function() {
57 46 // return Ext.state.Manager.get(this.id + '_form');
58 47 return Ext.state.Manager.get('timeinterval');
  48 + },
  49 +
  50 + addParameter: function(paramNode) {
  51 + var me = this;
  52 + var desktop = this.app.getDesktop();
  53 + var win = desktop.getWindow(this.id);
  54 + if (win) {
  55 + me.getUiContent().addParameter(paramNode, false);
  56 + win.show();
  57 + }
  58 + else {
  59 + this.createWindow(function () {
  60 + me.getUiContent().addParameter(paramNode, true);
  61 + });
  62 + }
59 63 }
60   -});
61 64 \ No newline at end of file
  65 +});
... ...
js/app/models/BkgJobNode.js
... ... @@ -395,97 +395,5 @@ Ext.define('amdaModel.BkgJobNode', {
395 395 this.set('rootNode',this.myGetOwnerTree().getRootNode().findChild( 'id', rootNodeId, true));
396 396 }
397 397 return this.get('rootNode');
398   - },
399   -
400   - /**
401   - * @override amdaModel.ExecutableNode.execute PNG (interactive session only!!!)
402   - */
403   - execute : function(arguments)
404   - {
405   - // Not needed to send the whole request
406   - // var jsonObj = this.get('object').getJsonValues(true);
407   - //TODO append jsonObj.action at server side => history!!!
408   - var jsonObj = {};
409   - var isMulti = arguments[0];
410   - jsonObj.action = {name:arguments[1],arg1:arguments[2],arg2:arguments[3]};
411   - //AKKA replace resultID by folderId
412   - jsonObj.folderId = this.get('object').get('folderId');
413   - //jsonObj.resultId = this.get('object').get('resultFolder');
414   -
415   - this.action = jsonObj.action.name;
416   -
417   - // this.set('tabId', jsonObj.tabId);
418   -
419   - // Node exists already, interactive Session
420   - var isInteractive = true;
421   - var isNewTab = false;
422   -
423   - loadMask.show(this.get('object').get('tabId'));
424   - AmdaAction.execute({nodeType : this.get('nodeType')}, jsonObj, function(res,e)
425   - {
426   - loadMask.hide();
427   - //AKKA - Rework of the result treatment for the integration with the new kernel
428   - if (!e.status)
429   - {
430   - myDesktopApp.errorMsg('Internal error during request');
431   - return;
432   - }
433   - if (!res.success)
434   - {
435   - myDesktopApp.errorMsg(res.message);
436   - return;
437   - }
438   - // NO background jobs for PNG !!!!! Timeout KILL
439   - if (res.status == amdaModel.BkgJobNode.STATUS_LIST.DONE)
440   - {
441   - this.updateNode(res);
442   - this.updateObject(res);
443   - this.editNode(isNewTab, isInteractive);
444   - }
445   - else
446   - {
447   - myDesktopApp.warningMsg(res.message);
448   - // keep this for case of Background Job
449   - /* var id = res.id;
450   - var text = 'job_' + res.pid;
451   - var status = amdaModel.BkgJobNode.STATUS_LIST.IN_PROGRESS;
452   - var newobj = Ext.create('amdaModel.Plot',
453   - { resultId : id, name : res.rawname, resultId: res.rawname});
454   - var newNode = Ext.create(this.$className, { id : id, pid : res.pid, text : text, jobType : 'request',
455   - leaf : true, status : status, rawname : res.rawname, object : newobj});
456   - newNode.createJobNode(false);
457   - */
458   - }
459   - }, this);
460   - },
461   -
462   - updateNode : function(res)
463   - {
464   - var windowId = 'plot' + this.get('tabId')+'-win';
465   - var win = myDesktopApp.getDesktop().getWindow(windowId);
466   - //TODO if it is possible to close window before getting result?
467   - if (!win)
468   - myDesktopApp.errorMsg('You have closed window!!!');
469   - else
470   - {
471   - var panelResult = win.items.items[0];
472   - panelResult.setObjectIntoNode();
473   - }
474   - },
475   -
476   - updateObject : function(res)
477   - {
478   - var object = this.get('object');
479   - object.set('outputName', res.name);
480   - object.set('resultId', res.result);
481   - object.set('startDate', res.startDate);
482   - object.set('stopDate', res.stopDate);
483   -
484   - if (object.get('timesrc') == amdaModel.AmdaTimeObject.inputTimeSrc[0] && this.action != 'zoom')
485   - {
486   - object.set('intervalN', res.intervalN);
487   - object.set('totalN', res.totalN);
488   - object.set('ttName', res.tableName);
489   - }
490   - }
  398 + }
491 399 });
... ...
js/app/models/DownloadNode.js
... ... @@ -2,7 +2,7 @@
2 2 * Project : AMDA-NG4
3 3 * Name : DownloadNode.js
4 4 * @class amdaModel.DownloadNode
5   - * @extends Ext.data.Model
  5 + * @extends amdaModel.ExecutableNode
6 6 * @brief Basic Model of Node corresponding to a download request
7 7 * @author Myriam
8 8 * @version $Id: DownloadNode.js 2949 2015-06-23 10:25:59Z elena $
... ... @@ -10,70 +10,23 @@
10 10  
11 11 Ext.define('amdaModel.DownloadNode', {
12 12  
13   - extend: 'Ext.data.Model',
14   - singleton: true,
  13 + extend: 'amdaModel.ExecutableNode',
  14 +
  15 + statics: {
  16 + nodeType: 'download'
  17 + },
15 18  
16   - fields:[{name : 'downloadType', type : 'string'},
17   - {name: 'object', type: 'object'},
18   - {name: 'realLinkedNode', type: 'amdaModel.AmdaNode'},
19   - {name: 'moduleId', type: 'string', defaultValue:'down-win'},
20   - {name: 'nodeType', type: 'string', defaultValue: 'download'},
21   - {name: 'objectDataModel', type: 'string', defaultValue:'amdaModel.Download'},
22   - {name: 'jobNode', type: 'string', defaultValue: 'amdaModel.BkgJobNode'}
23   - ],
24   -
25   - isExecutable: function(){
26   - return true;
27   - },
28   -
29   - getObjectCallback : function(result,remoteEvent){
30   - var t = remoteEvent.getTransaction();
31   - if (result) {
32   - var paramObj = Ext.create(this.get('objectDataModel'), result);
33   - // set parameter into node
34   - this.set('object', paramObj);
35   - var downObject = amdaModel.DownloadNode.decodeObject();
36   - // Edition ;
37   - amdaModel.DownloadNode.set('object',Ext.create('amdaModel.Download',downObject));
38   - amdaModel.DownloadNode.editInModule();
39   - }
40   - else {
41   - myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '"
42   - +this.get('name')+"' found!");
43   - // EXCEPTION : parameter not found !?
44   - }
45   - },
46   -
47   - editInModule : function () {
48   - var me = this;
49   - myDesktopApp.getLoadedModule(this.get('moduleId'), true, function (module) {
50   - // If the node to edit is not already linked to this module
51   - if (module.getLinkedNode() != me) {
52   - // set relative node into parameter Module
53   - module.setLinkedNode(me);
54   - }
55   - else {// the node to edit is already edited
56   - //TODO: TBD : message to user
57   - //Sol1: msg alert: "warning this node is already edited! If you want to get the original, please press the 'reset' button"->'OK'
58   - //Sol2: msg with user choice: "warning this node is already edited! Would you confirm this action and lost your modification?"->'Confirm','Cancel'
59   - }
60   - // Opening parameter window
61   - module.createWindow();
62   - });
63   - },
  19 + constructor : function(config) {
  20 + this.callParent(arguments);
  21 + this.set('moduleId',myDesktopApp.dynamicModules.download.id);
  22 + this.set('objectDataModel',amdaModel.Download.$className);
  23 + },
64 24  
65 25 decodeObject: function(obj) {
66 26 var myValues = new Object();
67 27 myValues.list=[];
68 28  
69   - if (!obj) {
70   - var fullObject = this.get('realLinkedNode').get('object');
71   - }
72   - else {
73   - var fullObject = obj;
74   - }
75   -
76   - fullObject.panels().each(function (panel) {
  29 + obj.panels().each(function (panel) {
77 30 panel.params().each(function (param) {
78 31 var myParam = new Object();
79 32 myParam.paramid = param.get('paramid');
... ... @@ -98,13 +51,13 @@ Ext.define('amdaModel.DownloadNode', {
98 51 alert('Parameter '+ myParam.paramid + ' is PlotOnly');
99 52 });
100 53 });
101   - myValues.timesrc = fullObject.get('timesrc');
  54 + myValues.timesrc = obj.get('timesrc');
102 55 // if there's at least one timeTable name into 'timeTables' collection
103 56 if (myValues.timesrc == amdaModel.AmdaTimeObject.inputTimeSrc[0]
104   - && fullObject.get('timeTables')
105   - && fullObject.get('timeTables').length){
  57 + && obj.get('timeTables')
  58 + && obj.get('timeTables').length){
106 59 // get complete timeTables collection
107   - var timeTables = fullObject.get('timeTables');
  60 + var timeTables = obj.get('timeTables');
108 61 // init an empty array for timeTables
109 62 myValues.timeTables=[];
110 63 // for each interval record
... ... @@ -119,150 +72,15 @@ Ext.define('amdaModel.DownloadNode', {
119 72 });
120 73 }
121 74 else {
122   - myValues.startDate = fullObject.get('startDate');
123   - myValues.stopDate = fullObject.get('stopDate');
124   - myValues.durationDay = fullObject.get('durationDay');
125   - myValues.durationHour = fullObject.get('durationHour');
126   - myValues.durationMin = fullObject.get('durationMin');
127   - myValues.durationSec = fullObject.get('durationSec');
  75 + myValues.startDate = obj.get('startDate');
  76 + myValues.stopDate = obj.get('stopDate');
  77 + myValues.durationDay = obj.get('durationDay');
  78 + myValues.durationHour = obj.get('durationHour');
  79 + myValues.durationMin = obj.get('durationMin');
  80 + myValues.durationSec = obj.get('durationSec');
128 81 }
129 82  
130   - myValues.name = fullObject.get('name');
  83 + myValues.name = obj.get('name');
131 84 return myValues;
132   - },
133   -
134   - encodeObject: function() {
135   - },
136   -
137   - loadJobTree : function(sendToSamp, clientId) {
138   - //TBD - BRE - fix code duplication with ExecutableNode if possible
139   - var rootNode = Ext.getCmp(amdaUI.ExplorerUI.JOB_TAB.TREE_ID).getRootNode();
140   - var me = this;
141   - amdaModel.InteractiveNode.preloadNodes(rootNode,
142   - function()
143   - {
144   - amdaModel.InteractiveNode.jobTreeLoaded = true;
145   - me.realExecute(sendToSamp, clientId);
146   - });
147   - },
148   -
149   - execute : function(sendToSamp, clientId) {
150   -
151   - if (!amdaModel.ExecutableNode.jobTreeLoaded) this.loadJobTree(sendToSamp, clientId);
152   - else this.realExecute(sendToSamp, clientId);
153   - },
154   -
155   -/**
156   -* Method to execute this node
157   -*/
158   - realExecute : function(sendToSamp, clientId) {
159   - var jsonObject = this.get('object').getJsonValues();
160   - if (!jsonObject.list && !jsonObject.images) {
161   - myDesktopApp.warningMsg('Please select at least one Parameter (Get Data) or one Time Table (Get Time Table)');
162   - return;
163   - }
164   -
165   - if (sendToSamp) {
166   - jsonObject.sendToSamp = true;
167   - }
168   -
169   - loadMask.show();
170   - AmdaAction.execute({nodeType : this.get('nodeType')}, jsonObject, function(res,e)
171   - {
172   - loadMask.hide();
173   -
174   - //AKKA - Rework of the result treatment for the integration with the new kernel
175   - if (!e.status)
176   - {
177   - myDesktopApp.errorMsg('Internal error during download request');
178   - return;
179   - }
180   -
181   - if (!res.success)
182   - {
183   - myDesktopApp.errorMsg(res.message);
184   - return;
185   - }
186   - //TBD if such condition is OK ?
187   - if (!res.id && res.download) {
188   - if (res.sendToSamp) {
189   - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) {
190   - Ext.Array.each(res.download, function(download) {
191   - module.sendVOTable(download, clientId ? clientId : 'hub');
192   - });
193   - });
194   - return;
195   - } else if (res.compression) {
196   - window.location.href = res.download;
197   - }
198   - else {
199   - window.open(res.download, '_blank');
200   - }
201   - return;
202   - }
203   -
204   - if (logExecTime && res.exectime && (res.exectime != 0)) {
205   - console.log("CMD EXEC TIME FOR "+res.id+" = "+res.exectime+"ms");
206   - }
207   -
208   - var newobj = this.createJobObject(res);
209   - var newNode = Ext.create(this.get('jobNode'),
210   - {
211   - id : res.id,
212   - info : res.info,
213   - jobType : this.get('nodeType'),
214   - processId : res.id,
215   - text : res.name,
216   - status : res.status,
217   - stop : res.stop,
218   - leaf : true,
219   - object : newobj
220   -
221   - });
222   -
223   - // new Tab
224   - switch (res.status)
225   - {
226   - case amdaModel.BkgJobNode.STATUS_LIST.DONE :
227   - if (!res.sendToSamp) {
228   - // New tab, non-interactive session
229   - var isInteractive = false;
230   - var isNewTab = true;
231   - newNode.createJobNode(true);
232   - newNode.editNode(isNewTab, isInteractive);
233   - }
234   - else {
235   - var files = res.result.split(",");
236   - Ext.each(files, function(file) {
237   - var href = 'data/'+sessionID+'/RES/'+ res.folder + '/' + file;
238   - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) {
239   - module.sendVOTable(href, clientId ? clientId : 'hub');
240   - });
241   - });
242   - }
243   - break;
244   - case amdaModel.BkgJobNode.STATUS_LIST.IN_PROGRESS :
245   - newNode.createJobNode(false);
246   - break;
247   - default:
248   - newNode.createJobNode(true);
249   - }
250   - }, this );
251   - },
252   -
253   - createJobObject: function(res) {
254   -
255   - var obj = this.get('object').getJsonValues();
256   - //TODO text, name, outputName - if all is needed
257   - //new object to attach to new bkgJobNode
258   - //TODO Ext.clone()
259   -
260   - var newobj = Ext.copyTo({}, obj, this.get('object').propertiesToCopy);
261   - newobj.id = res.id;
262   - newobj.resultId = res.result;
263   - newobj.folderId = res.folder;
264   - newobj = Ext.create(this.get('object').$className, newobj);
265   -
266   - return newobj;
267   - }
  85 + }
268 86 });
... ...
js/app/models/ExecutableNode.js
... ... @@ -22,35 +22,40 @@ Ext.define('amdaModel.ExecutableNode', {
22 22 this.set('jobNode', 'amdaModel.BkgJobNode');
23 23 },
24 24  
25   - loadJobTree : function()
  25 + loadJobTree : function(opts)
26 26 {
27 27 var rootNode = Ext.getCmp(amdaUI.ExplorerUI.JOB_TAB.TREE_ID).getRootNode();
28 28 var me = this;
29 29 amdaModel.InteractiveNode.preloadNodes(rootNode, function(){
30 30 amdaModel.ExecutableNode.jobTreeLoaded = true;
31   - me.realExecute();
  31 + me.realExecute(opts);
32 32 });
33 33 },
34 34  
35   - execute : function(isDirty)
  35 + execute : function(opts)
36 36 {
37 37 if (!amdaModel.ExecutableNode.jobTreeLoaded)
38   - this.loadJobTree();
  38 + this.loadJobTree(opts);
39 39 else
40   - this.realExecute();
  40 + this.realExecute(opts);
41 41 },
42 42  
43 43 /**
44 44 * Method to execute this node
45 45 */
46   - realExecute : function()
  46 + realExecute : function(opts)
47 47 {
48 48 var isInteractivePlot = (this.get('nodeType') == 'request') && (this.get('object').get('file-output') == 'INTERACTIVE') || (this.get('nodeType') == 'multiplot');
  49 +
  50 + var jsonObject = this.get('object').getJsonValues();
  51 + if (opts && opts.sendToSamp) {
  52 + opts.sendToSamp = true;
  53 + }
49 54  
50 55 if (!loadMask.isMasked())
51 56 loadMask.show(isInteractivePlot);
52 57  
53   - AmdaAction.execute({nodeType : this.get('nodeType')}, this.get('object').getJsonValues(true),
  58 + AmdaAction.execute({nodeType : this.get('nodeType')}, jsonObject,
54 59 function(res,e)
55 60 {
56 61 loadMask.hide();
... ... @@ -75,6 +80,15 @@ Ext.define('amdaModel.ExecutableNode', {
75 80 });
76 81 }
77 82 else {
  83 + /*if (res.sendToSamp) {
  84 + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) {
  85 + Ext.Array.each(res.download, function(download) {
  86 + module.sendVOTable(download, clientId ? clientId : 'hub');
  87 + });
  88 + });
  89 + return;
  90 + }*/
  91 +
78 92 if (logExecTime && res.exectime && (res.exectime != 0)) {
79 93 console.log("CMD EXEC TIME FOR "+res.id+" = "+res.exectime+"ms");
80 94 }
... ... @@ -96,7 +110,7 @@ Ext.define('amdaModel.ExecutableNode', {
96 110  
97 111 newNode.get('object').on('execute', function() {
98 112 // Then call the node creation method
99   - this.execute(arguments);
  113 + this.execute(opts);
100 114 }, newNode);
101 115  
102 116 switch (res.status)
... ...
js/app/models/InteractiveNode.js
... ... @@ -487,78 +487,7 @@ Ext.define('amdaModel.InteractiveNode', {
487 487 createDownload: function(node)
488 488 {
489 489 myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.download.id, true, function (module) {
490   - if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.download.id)) {
491   - var request = Ext.create(amdaModel.Download.$className);
492   - amdaModel.DownloadNode.set('object',request);
493   - // singleton!
494   - amdaModel.DownloadNode.editInModule();
495   - if ((node.get('globalStart') != null) && (node.get('globalStop') != null) && node.get('globalStart') != 'depending on mission' && node.get('isParameter')) {
496   - module.getUiContent().setTimeFromData(node.getTimeFromNode(node));
497   - }
498   - }
499   - var paramName;
500   - var components = null;
501   - switch (node.$className) {
502   - case 'amdaModel.AliasNode' :
503   - paramName = "#"+node.get('text');
504   - break;
505   - case 'amdaModel.DerivedParamComponentNode' :
506   -
507   - paramId = node.get('text');
508   - var parentId = paramId.substr(0, paramId.length - 3);
509   - paramName= "ws_" + parentId;
510   - var regExp = /\(([\d]+)\)/;
511   - var component_index = regExp.exec(paramId);
512   - if (component_index)
513   - {
514   - components = [];
515   - components['index1'] = component_index[1];
516   - }
517   - break;
518   - case 'amdaModel.MyDataParamComponentNode' :
519   - paramId = node.get('text');
520   - var parentId = paramId.substr(0, paramId.length - 3);
521   - paramName= "wsd_" + parentId;
522   - var regExp = /\(([\d]+)\)/;
523   - var component_index = regExp.exec(paramId);
524   - if (component_index)
525   - {
526   - components = [];
527   - components['index1'] = component_index[1];
528   - }
529   - break;
530   - case 'amdaModel.DerivedParamNode' :
531   - paramName = "ws_"+node.get('text');
532   - break;
533   - case 'amdaModel.MyDataParamNode' :
534   - paramName = 'wsd_'+node.get('text');
535   - break;
536   - default :
537   - if (node.get('alias')!= "" )
538   - paramName = "#"+node.get('alias');
539   - else
540   - paramName = node.get('id');
541   - }
542   - var component_info = node.get('component_info');
543   - var predefinedArgs = node.get('predefinedArgs');
544   - if (component_info && component_info.parentId) {
545   - //It's a component
546   - paramName = component_info.parentId;
547   - components = [];
548   - if (component_info.index1)
549   - components['index1'] = component_info.index1;
550   - if (component_info.index2)
551   - components['index2'] = component_info.index2;
552   - predefinedArgs = node.parentNode.get('predefinedArgs');
553   - }
554   - if (predefinedArgs) {
555   - module.parseTemplatedParam(paramName, function(param_info) {
556   - module.addParam(param_info.paramid, true, node.get('needsArgs'), components, param_info.template_args);
557   - });
558   - }
559   - else {
560   - module.addParam(paramName,true,node.get('needsArgs'),components);
561   - }
  490 + module.addParameter(node);
562 491 });
563 492 },
564 493  
... ...
js/app/models/StatisticsNode.js
... ... @@ -14,9 +14,7 @@ Ext.define('amdaModel.StatisticsNode', {
14 14 singleton: true,
15 15  
16 16 fields: [
17   - {name: 'downloadType', type : 'string'},
18 17 {name: 'object', type: 'object'},
19   - {name: 'realLinkedNode', type: 'amdaModel.AmdaNode'},
20 18 {name: 'moduleId', type: 'string', defaultValue:'statistics-win'},
21 19 {name: 'nodeType', type: 'string', defaultValue: 'statistics'},
22 20 {name: 'objectDataModel', type: 'string', defaultValue:'amdaModel.Stats'},
... ...
js/app/views/DownloadUI.js
... ... @@ -92,6 +92,12 @@ Ext.define('amdaUI.DownloadUI', {
92 92 this.timeSelector.intervalSel.updateDuration();
93 93 },
94 94  
  95 + addParameter: function(paramNode, updateTime)
  96 + {
  97 + //this.paramGrid.dropTarget.notifyOver(paramNode,null,'append');
  98 + //this.paramGrid.dropTarget.notifyDrop(paramNode,null,'append');
  99 + },
  100 +
95 101 addParam: function (paramId, isLeaf, needArgs, components, predefined_args)
96 102 {
97 103 // adding the parameter to the paramGrid
... ... @@ -299,7 +305,7 @@ Ext.define('amdaUI.DownloadUI', {
299 305 doDownload: function (sendToSamp, clientId) {
300 306 var downloadModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.download.id);
301 307 if (downloadModule)
302   - downloadModule.linkedNode.execute(sendToSamp, clientId);
  308 + downloadModule.linkedNode.execute({'sendToSamp': (sendToSamp == true), 'clientId': clientId});
303 309 },
304 310  
305 311 actionItem: function (grid, cell, cellIndex, record, row, recordIndex, e) {
... ... @@ -355,6 +361,11 @@ Ext.define('amdaUI.DownloadUI', {
355 361 }
356 362 },
357 363  
  364 + doParamDrop: function(paramNode)
  365 + {
  366 +
  367 + },
  368 +
358 369 /**
359 370 * Check if changes were made before closing window
360 371 * @return false
... ... @@ -401,7 +412,7 @@ Ext.define('amdaUI.DownloadUI', {
401 412 {
402 413 var me = this;
403 414 var el = me.body.dom;
404   - var dropTarget = Ext.create('Ext.dd.DropTarget', el, {
  415 + me.dropTarget = Ext.create('Ext.dd.DropTarget', el, {
405 416 ddGroup: 'explorerTree',
406 417 notifyEnter: function (ddSource, e, data) { },
407 418 notifyOver: function (ddSource, e, data)
... ...