From 7d500cf67b108657e24df3bfaa5a0c3c26de9fe2 Mon Sep 17 00:00:00 2001 From: Nathanaël Jourdane Date: Thu, 14 Jun 2018 12:06:57 +0200 Subject: [PATCH] fix indentation --- js/app/models/InteractiveNode.js | 1528 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- js/app/views/ExplorerUI.js | 2046 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 2 files changed, 1745 insertions(+), 1829 deletions(-) diff --git a/js/app/models/InteractiveNode.js b/js/app/models/InteractiveNode.js index 07849a3..0bf8ce3 100644 --- a/js/app/models/InteractiveNode.js +++ b/js/app/models/InteractiveNode.js @@ -1,4 +1,4 @@ -/** +/** * Project : AMDA-NG4 * Name : InteractiveNode.js * @class amdaModel.InteractiveNode @@ -9,530 +9,515 @@ */ Ext.define('amdaModel.InteractiveNode', { - extend: 'amdaModel.AmdaNode', - - requires: [ - 'amdaPlotObj.PlotRequestObject' - ], - - fields: [ - {name: 'contextNode', type: 'amdaModel.AmdaNode', persist: false}, - {name: 'objectDataModel', type: 'string', persist: false}, - {name: 'object', type: 'object', persist: false}, - {name: 'moduleId', type: 'string', persist: false}, - {name: 'filtered', type: 'boolean', defaultValue: false, persist: false}, - {name: 'disable', type: 'boolean', defaultValue: false, persist: false} - ], - - statics: { - preloadNodes : function(node,onready) - { - var me = this; - - var nodesToLoad = new Array(); - nodesToLoad.push(node); - this.preloadTreeNode(node, nodesToLoad, function (node) - { - var isFinish = true; - nodesToLoad.forEach(function (element, index, array) - { - if (!element.isLoaded()) - isFinish = false; - }); - if (isFinish && onready) - onready.call(); - }); - }, - - preloadTreeNode : function(node, nodesToLoad, onloaded) - { - var me = this; - - if (node.isLoaded()) - { - node.eachChild(function(n) - { - if (!n.isLoaded() && !n.isLeaf()) - { - nodesToLoad.push(n); - me.preloadTreeNode(n,nodesToLoad,onloaded); - } - }); - - if (onloaded) - onloaded.call(me,node); - return; - } - - node.store.load({ - node : node, - callback : function(records, operation, successful) - { - records.forEach(function (record) - { - if (!record.isLoaded() && !record.isLeaf()) - { - nodesToLoad.push(record); - me.preloadTreeNode(record,nodesToLoad,onloaded); - } - }); - if (onloaded) - onloaded.call(me,node); - } - }); - } - }, - - onReady : null, - - constructor : function(config) - { - this.callParent(arguments); - this.set('nodeType',this.self.nodeType); - this.set('ownerTreeId',amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); - if (this.get('id')) { // TODO why sometimes (delete in remote interoper tree) this.get('id') = undefined ? - // if id of this node have root category suffix - if (Ext.util.Format.substr(this.get('id'), -(amdaUI.ExplorerUI.CAT_SUFFIX.length), this.get('id').length) === amdaUI.ExplorerUI.CAT_SUFFIX) - { - // set the expanded property to true - this.set('expanded',true); - } - } - }, - -/** -* this method is overriden into ExecutableNode to return true -*/ - isExecutable: function() - { - return false; - }, + extend: 'amdaModel.AmdaNode', -/** -* open Module with THIS NODE -*/ - editInModule : function (contextNode, onReady) - { - // set the contextNode of this node - this.set('contextNode',contextNode); - // parameter module - var me = this; - myDesktopApp.getLoadedModule(this.get('moduleId'),true, function (module) { - // If the node to edit is not already linked to this module - if (module.getLinkedNode() != me) - { - // set relative node into parameter Module - module.setLinkedNode(me); - if (contextNode==null) - { - // set the root node as contextNode - contextNode = me.getRootNode(); - } - module.setContextNode(contextNode); - - } else if (module.getLinkedNode() != null){ - //TODO the node to edit is already edited - // myDesktopApp.warningMsg('This object is being edited'); - //Sol1: msg alert: "warning this node is already edited! If you want to get the original, please press the 'reset' button"->'OK' - //Sol2: msg with user choice: "warning this node is already edited! Would you confirm this action and lost your modification?"->'Confirm','Cancel' - } - // Opening parameter window - module.createWindow(onReady); - }); - }, + requires: [ + 'amdaPlotObj.PlotRequestObject' + ], -/** -* Method to rename the workspace node -*/ - rename: function(value,callBackFn) - { - var dataToSend = {id : this.get('id'), old_name: this.modified.text, name: value, parent : this.parentNode.get('id'), leaf: this.isLeaf(), nodeType: this.get('nodeType')}; - AmdaAction.renameObject(dataToSend, callBackFn); - }, - -/** -* Method to rename the workspace node when D&D -*/ - renameDD: function(parentId, callBackFn) - { - var dataToSend = {id : this.get('id'), old_name: this.get('name'), name: this.get('name'), parent : parentId, leaf: this.isLeaf(), nodeType: this.get('nodeType')}; - AmdaAction.renameObject(dataToSend, callBackFn); - }, - -/** -* validation method on name (used in module forms) -* @param name the name to validate -* @returns -*/ - isValidName : function(name, callBackFn) - { - var dataToSend = {name: name, nodeType: this.get('nodeType'), leaf: this.isLeaf()}; - AmdaAction.validNameObject(dataToSend, callBackFn); - }, + fields: [ + {name: 'contextNode', type: 'amdaModel.AmdaNode', persist: false}, + {name: 'objectDataModel', type: 'string', persist: false}, + {name: 'object', type: 'object', persist: false}, + {name: 'moduleId', type: 'string', persist: false}, + {name: 'filtered', type: 'boolean', defaultValue: false, persist: false}, + {name: 'disable', type: 'boolean', defaultValue: false, persist: false} + ], -/** -* Method to persist modifications of an AmdaObject by Server side and update the workspace -* node linked to a Module -*/ - update : function(opt) - { - AmdaAction.modifyObject(this.get('object').getJsonValues(true), function(res,e){ - - if(e.status) { - if (res.id) { - if (!this.get('contextNode')) { - // set the root node of 'Derived Parameters' tree as contextNode - this.set('contextNode',this.getRootNode()); - } - this.get('contextNode').expand(false,false); - this.myGetOwnerTree().getSelectionModel().select(this); - - if (opt) - { - var scope = opt.scope ? opt.scope : this; - if (opt.callback) - opt.callback.call(scope,'update'); - } - - Ext.Msg.alert('Complete', 'Object '+this.get('object').get('name')+' has been modified'); - // fix the modifications for object - this.get('object').commit(); - - if (res.info) { - this.set('info',res.info); - } - - if (this.get('nodeType') == 'myDataParam') { - if (res.isSpectra) { - this.set('iconCls', 'icon-spectra'); - } - else { - if (res.size > 1) this.set('iconCls', 'icon-unknowntype'); - } - } - - // update my data on possibble mask change - if (res.updateMyData) { - this.updateMyData(); - this.updateMask(res.mask); - } - // reload object into the view of corresponding Module - var me = this; - myDesktopApp.getLoadedModule(this.get('moduleId'), true, function (module) { - module.getUiContent().setObject(me.get('object')); - }); - } - else { - //TODO proper error message handling - // error code from server; but e.status==true - // revert all modifications since last load or commit - this.get('object').reject(); - myDesktopApp.errorMsg(res.error); - } - } - else { - // revert all modifications since last load or commit - this.get('object').reject(); - myDesktopApp.errorMsg(e.message); - } - },this); - }, + statics: { + preloadNodes: function (node, onready) { + var me = this; -/** -* Method to create a new AmdaObject by server side and create the workspace node linked to a Module -* under its contextNode or the root node corresponding to this nodeType category -*/ - create : function(opt) - { - if (!this.get('contextNode') || (this.get('contextNode').data.id == 'sharedtimeTable-treeRootNode') || (this.get('contextNode').data.id == 'sharedcatalog-treeRootNode')) { - // set the root node of 'Derived Parameters' tree as contextNode - this.set('contextNode',this.getRootNode()); - } - // call the Ext.Direct method to create parameter - AmdaAction.createObject(this.get('object').getJsonValues(false), this.get('contextNode').get('id'), function(res,e){ - //success - if(e.status) - { - // if correct response received - if (res.id) { //if (res.id || res.error == 'NAME_EXISTS') { - // 'save as' case ; delete old node if it exists - if (this.toRename) - { - this.toRename = false; - var myRoot = this.getRootNode(); - // search the same named node to override - var updateNode = myRoot.findChild('text',this.get('object').get('name'),true); - // destroy the overrided node - updateNode.parentNode.removeChild(updateNode);//TODO ??if destroy==true => too many recursions.... - updateNode.destroy(); - } - // set text of this node - this.set('text',this.get('object').get('name')); - //set id of this node - this.set('id',res.id); - this.internalId = res.id; - // set id of node's object - this.get('object').set('id',res.id); - - if (res.created){ - // set the created date - this.get('object').set('created',res.created); - } - - if (res.info){ - // set the tooltip - this.set('info',res.info); - //set globalStart & global Stop to be used for time selection - if (this.get('nodeType') == 'myDataParam') - { - var startStop = res.info.split("
"); - var globalStart = startStop[1].substr(0,19); - var globalStop = startStop[1].substr(20); - - this.set('globalStart', globalStart); - this.set('globalStop', globalStop); - - if (res.mask) - this.set('linkedMask', res.mask); - if (res.size) - this.set('size', res.size); - - if (res.isSpectra) { - this.set('iconCls', 'icon-spectra'); - } - else { - if (res.size > 1) - this.set('iconCls', 'icon-unknowntype'); - } - } - } - //TODO do we need this commission ??? - // fix the modifications for object - this.get('object').commit(); - // if ownerTree panel is not active - if (this.myGetOwnerTree().ownerCt.getActiveTab()!==this.myGetOwnerTree()) - { - // set ownerTree panel as the active tab - to enable selection of this node his ownerTree must have a view - this.myGetOwnerTree().ownerCt.setActiveTab(this.myGetOwnerTree()); - } - - Ext.Msg.alert('Complete', 'New object '+this.get('object').get('name')+' has been created'); - // expand the contextNode - this.get('contextNode').expand(false, function() - { - if (!this.get('contextNode').findChild('text',this.get('text'))) { - // create node in tree as child of contextNode - this.get('contextNode').appendChild(this); - } - // select the new node - this.myGetOwnerTree().getSelectionModel().select(this); - if (opt) - { - var scope = opt.scope ? opt.scope : this; - if (opt.callback) - opt.callback.call(scope,'create'); - } - }, this); - - // myDataParamNode - update MyData subtree - //TODO put this in mydataparamnode - if (res.updateMyData) { - this.updateMyData(); - this.updateMask(res.mask); - } - - } - // error code from server; but e.status==true - else { - myDesktopApp.errorMsg(res.error); - // revert all modifications since last load or commit - this.get('object').reject(); - } - } - // failure: e.status == false - else { - // revert all modifications since last load or commit - this.get('object').reject(); - //TODO: this.destroy(); - myDesktopApp.errorMsg(e.message); - } - },this); - }, + var nodesToLoad = []; + nodesToLoad.push(node); + this.preloadTreeNode(node, nodesToLoad, function (node) { + var isFinish = true; + nodesToLoad.forEach(function (element, index, array) { + if (!element.isLoaded()) + isFinish = false; + }); + if (isFinish && onready) + onready.call(); + }); + }, -/** -* Generic part of Context Menu -* -*/ - allMenuItems : function() { - var src = this.self.objectName; - var menuItems = - [ { - fnId : 'root-createLeaf', - text : 'Create '+ src - }, { - fnId : 'root-createDir', - text : 'Create Folder' - }, { - fnId : 'dire-createLeaf', - text : 'Create ' + src - }, { - fnId : 'dire-createDir', - text : 'Create Folder' - }, { - fnId : 'dire-renameNode', - text : 'Rename Folder' - }, { - fnId : 'dire-deleteNode', - text : 'Delete Folder' - }, { - fnId : 'leaf-editLeaf', - text : 'Edit ' + src - }, { - fnId : 'leaf-renameNode', - text : 'Rename ' + src - }, { - fnId : 'leaf-deleteNode', - text : 'Delete '+ src - } ]; - return menuItems; - }, - - allMenuMultiItems : function() { - var menuMulti = [ - { - fnId : 'mult-deleteMulti', - text : 'Delete selected ' + this.self.objectName + 's' - } - ]; - return menuMulti; - }, - - getAllContextMenuItems: function(){ - return this.allMenuItems(); - }, - - getMultiContextMenuItems: function(){ - return this.allMenuMultiItems(); - }, - -/** -* default implementation -* no menu display if there's no override of this function -*/ - getMultiContextMenuItems: function(){ - return null; - }, - -/** -* Context Menu Actions -* -*/ - onMenuItemClick : function(menu,item,event) { - // fnId parsing : - var fnId = Ext.util.Format.substr(item.fnId, 5, item.fnId.length); - - switch (fnId) { - case 'deleteNode': - this.deleteNode(); - break; - case 'createDir': - this.createDir(); - break; - case 'createLeaf': - this.createLeaf(this); - break; - case 'renameNode': - this.renameNode(); - break; - case 'editLeaf': - this.editLeaf(); - break; - case 'deleteMulti': - this.deleteMulti(); - break; - case 'plotParam': - this.createPlot(this); - break; - case 'downParam': - this.createDownload(this); - break; - default: - break; - } // switch end - }, - - getTimeFromNode: function(node) { - var startString = new String(node.get('globalStart')); - var stopString = new String(node.get('globalStop')); - - var startDate = new Date(startString.replace(/\-/g,'\/').replace(/[T|Z]/g,' ')); - var stopDate = new Date(stopString.replace(/\-/g,'\/').replace(/[T|Z]/g,' ')); - - if (stopDate - startDate > 86400000 ) { - var startTime = Ext.Date.add(stopDate, Ext.Date.DAY, -1); - // var timeObj = {start: Ext.Date.format(startTime, 'Y/m/d H:i:s'), stop: Ext.Date.format(stopDate, 'Y/m/d H:i:s')}; - var timeObj = {start: Ext.Date.format(startTime, 'Y/m/d'), stop: Ext.Date.format(stopDate, 'Y/m/d')}; - } - else { - var timeObj = {start: node.get('globalStart'), stop: node.get('globalStop')}; - } - return timeObj; - }, - - createPlot: function(node) - { - if (node.get('disable')) return; - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.plot.id, true, function (module) { - if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.plot.id)) { - var request = Ext.create(amdaPlotObj.PlotRequestObject.$className); - var newNode = Ext.create(amdaModel.PlotNode.$className, { object : request }); - // edit newNode into Plot Module with node as contextNode - newNode.editInModule(); - if((node.get('globalStart') != null) && (node.get('globalStop') != null) && node.get('globalStart') != 'depending on mission' && node.get('isParameter')) { - module.getUiContent().setTimeFromData(node.getTimeFromNode(node)); - } - } - module.getUiContent().addParameter(node); - }); - }, - - createDownload: function(node) - { - if (node.get('disable')) return; - - if (node.get('notyet')) { - myDesktopApp.warningMsg('Sorry! access to this parameter is restricted.'); - return; - } - - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.download.id, true, function (module) { - if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.download.id)) { - var request = Ext.create(amdaModel.Download.$className); - amdaModel.DownloadNode.set('object',request); - // singleton! - amdaModel.DownloadNode.editInModule(); - if ((node.get('globalStart') != null) && (node.get('globalStop') != null) && node.get('globalStart') != 'depending on mission' && node.get('isParameter')) { - module.getUiContent().setTimeFromData(node.getTimeFromNode(node)); - } - } - var paramName; - var components = null; - switch (node.$className) { - case 'amdaModel.AliasNode' : - paramName = "#"+node.get('text'); - break; - case 'amdaModel.DerivedParamNode' : - paramName = "ws_"+node.get('text'); - break; - case 'amdaModel.MyDataParamNode' : - paramName = 'wsd_'+node.get('text'); - break; - default : - if (node.get('alias')!= "" ) - paramName = "#"+node.get('alias'); - else - paramName = node.get('id'); - } + preloadTreeNode: function (node, nodesToLoad, onloaded) { + var me = this; + + if (node.isLoaded()) { + node.eachChild(function (n) { + if (!n.isLoaded() && !n.isLeaf()) { + nodesToLoad.push(n); + me.preloadTreeNode(n, nodesToLoad, onloaded); + } + }); + + if (onloaded) + onloaded.call(me, node); + return; + } + + node.store.load({ + node: node, + callback: function (records, operation, successful) { + records.forEach(function (record) { + if (!record.isLoaded() && !record.isLeaf()) { + nodesToLoad.push(record); + me.preloadTreeNode(record, nodesToLoad, onloaded); + } + }); + if (onloaded) + onloaded.call(me, node); + } + }); + } + }, + + onReady: null, + + constructor: function (config) { + this.callParent(arguments); + this.set('nodeType', this.self.nodeType); + this.set('ownerTreeId', amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); + if (this.get('id')) { // TODO why sometimes (delete in remote interoper tree) this.get('id') = undefined ? + // if id of this node have root category suffix + if (Ext.util.Format.substr(this.get('id'), -(amdaUI.ExplorerUI.CAT_SUFFIX.length), this.get('id').length) === amdaUI.ExplorerUI.CAT_SUFFIX) { + // set the expanded property to true + this.set('expanded', true); + } + } + }, + + /** + * this method is overriden into ExecutableNode to return true + */ + isExecutable: function () { + return false; + }, + + /** + * open Module with THIS NODE + */ + editInModule: function (contextNode, onReady) { + // set the contextNode of this node + this.set('contextNode', contextNode); + // parameter module + var me = this; + myDesktopApp.getLoadedModule(this.get('moduleId'), true, function (module) { + // If the node to edit is not already linked to this module + if (module.getLinkedNode() != me) { + // set relative node into parameter Module + module.setLinkedNode(me); + if (contextNode == null) { + // set the root node as contextNode + contextNode = me.getRootNode(); + } + module.setContextNode(contextNode); + + } else if (module.getLinkedNode() != null) { + //TODO the node to edit is already edited + // myDesktopApp.warningMsg('This object is being edited'); + //Sol1: msg alert: "warning this node is already edited! If you want to get the original, please press the 'reset' button"->'OK' + //Sol2: msg with user choice: "warning this node is already edited! Would you confirm this action and lost your modification?"->'Confirm','Cancel' + } + // Opening parameter window + module.createWindow(onReady); + }); + }, + + /** + * Method to rename the workspace node + */ + rename: function (value, callBackFn) { + var dataToSend = { + id: this.get('id'), + old_name: this.modified.text, + name: value, + parent: this.parentNode.get('id'), + leaf: this.isLeaf(), + nodeType: this.get('nodeType') + }; + AmdaAction.renameObject(dataToSend, callBackFn); + }, + + /** + * Method to rename the workspace node when D&D + */ + renameDD: function (parentId, callBackFn) { + var dataToSend = { + id: this.get('id'), + old_name: this.get('name'), + name: this.get('name'), + parent: parentId, + leaf: this.isLeaf(), + nodeType: this.get('nodeType') + }; + AmdaAction.renameObject(dataToSend, callBackFn); + }, + + /** + * validation method on name (used in module forms) + * @param name the name to validate + * @returns + */ + isValidName: function (name, callBackFn) { + var dataToSend = {name: name, nodeType: this.get('nodeType'), leaf: this.isLeaf()}; + AmdaAction.validNameObject(dataToSend, callBackFn); + }, + + /** + * Method to persist modifications of an AmdaObject by Server side and update the workspace + * node linked to a Module + */ + update: function (opt) { + AmdaAction.modifyObject(this.get('object').getJsonValues(true), function (res, e) { + + if (e.status) { + if (res.id) { + if (!this.get('contextNode')) { + // set the root node of 'Derived Parameters' tree as contextNode + this.set('contextNode', this.getRootNode()); + } + this.get('contextNode').expand(false, false); + this.myGetOwnerTree().getSelectionModel().select(this); + + if (opt) { + var scope = opt.scope ? opt.scope : this; + if (opt.callback) + opt.callback.call(scope, 'update'); + } + + Ext.Msg.alert('Complete', 'Object ' + this.get('object').get('name') + ' has been modified'); + // fix the modifications for object + this.get('object').commit(); + + if (res.info) { + this.set('info', res.info); + } + + if (this.get('nodeType') == 'myDataParam') { + if (res.isSpectra) { + this.set('iconCls', 'icon-spectra'); + } + else { + if (res.size > 1) this.set('iconCls', 'icon-unknowntype'); + } + } + + // update my data on possibble mask change + if (res.updateMyData) { + this.updateMyData(); + this.updateMask(res.mask); + } + // reload object into the view of corresponding Module + var me = this; + myDesktopApp.getLoadedModule(this.get('moduleId'), true, function (module) { + module.getUiContent().setObject(me.get('object')); + }); + } + else { + //TODO proper error message handling + // error code from server; but e.status==true + // revert all modifications since last load or commit + this.get('object').reject(); + myDesktopApp.errorMsg(res.error); + } + } + else { + // revert all modifications since last load or commit + this.get('object').reject(); + myDesktopApp.errorMsg(e.message); + } + }, this); + }, + + /** + * Method to create a new AmdaObject by server side and create the workspace node linked to a Module + * under its contextNode or the root node corresponding to this nodeType category + */ + create: function (opt) { + if (!this.get('contextNode') || (this.get('contextNode').data.id == 'sharedtimeTable-treeRootNode') || (this.get('contextNode').data.id == 'sharedcatalog-treeRootNode')) { + // set the root node of 'Derived Parameters' tree as contextNode + this.set('contextNode', this.getRootNode()); + } + // call the Ext.Direct method to create parameter + AmdaAction.createObject(this.get('object').getJsonValues(false), this.get('contextNode').get('id'), function (res, e) { + //success + if (e.status) { + // if correct response received + if (res.id) { //if (res.id || res.error == 'NAME_EXISTS') { + // 'save as' case ; delete old node if it exists + if (this.toRename) { + this.toRename = false; + var myRoot = this.getRootNode(); + // search the same named node to override + var updateNode = myRoot.findChild('text', this.get('object').get('name'), true); + // destroy the overrided node + updateNode.parentNode.removeChild(updateNode);//TODO ??if destroy==true => too many recursions.... + updateNode.destroy(); + } + // set text of this node + this.set('text', this.get('object').get('name')); + //set id of this node + this.set('id', res.id); + this.internalId = res.id; + // set id of node's object + this.get('object').set('id', res.id); + + if (res.created) { + // set the created date + this.get('object').set('created', res.created); + } + + if (res.info) { + // set the tooltip + this.set('info', res.info); + //set globalStart & global Stop to be used for time selection + if (this.get('nodeType') == 'myDataParam') { + var startStop = res.info.split("
"); + var globalStart = startStop[1].substr(0, 19); + var globalStop = startStop[1].substr(20); + + this.set('globalStart', globalStart); + this.set('globalStop', globalStop); + + if (res.mask) + this.set('linkedMask', res.mask); + if (res.size) + this.set('size', res.size); + + if (res.isSpectra) { + this.set('iconCls', 'icon-spectra'); + } + else { + if (res.size > 1) + this.set('iconCls', 'icon-unknowntype'); + } + } + } + //TODO do we need this commission ??? + // fix the modifications for object + this.get('object').commit(); + // if ownerTree panel is not active + if (this.myGetOwnerTree().ownerCt.getActiveTab() !== this.myGetOwnerTree()) { + // set ownerTree panel as the active tab - to enable selection of this node his ownerTree must have a view + this.myGetOwnerTree().ownerCt.setActiveTab(this.myGetOwnerTree()); + } + + Ext.Msg.alert('Complete', 'New object ' + this.get('object').get('name') + ' has been created'); + // expand the contextNode + this.get('contextNode').expand(false, function () { + if (!this.get('contextNode').findChild('text', this.get('text'))) { + // create node in tree as child of contextNode + this.get('contextNode').appendChild(this); + } + // select the new node + this.myGetOwnerTree().getSelectionModel().select(this); + if (opt) { + var scope = opt.scope ? opt.scope : this; + if (opt.callback) + opt.callback.call(scope, 'create'); + } + }, this); + + // myDataParamNode - update MyData subtree + //TODO put this in mydataparamnode + if (res.updateMyData) { + this.updateMyData(); + this.updateMask(res.mask); + } + + } + // error code from server; but e.status==true + else { + myDesktopApp.errorMsg(res.error); + // revert all modifications since last load or commit + this.get('object').reject(); + } + } + // failure: e.status == false + else { + // revert all modifications since last load or commit + this.get('object').reject(); + //TODO: this.destroy(); + myDesktopApp.errorMsg(e.message); + } + }, this); + }, + + /** + * Generic part of Context Menu + * + */ + allMenuItems: function () { + var src = this.self.objectName; + var menuItems = [ + { + fnId: 'root-createLeaf', + text: 'Create ' + src + }, { + fnId: 'root-createDir', + text: 'Create Folder' + }, { + fnId: 'dire-createLeaf', + text: 'Create ' + src + }, { + fnId: 'dire-createDir', + text: 'Create Folder' + }, { + fnId: 'dire-renameNode', + text: 'Rename Folder' + }, { + fnId: 'dire-deleteNode', + text: 'Delete Folder' + }, { + fnId: 'leaf-editLeaf', + text: 'Edit ' + src + }, { + fnId: 'leaf-renameNode', + text: 'Rename ' + src + }, { + fnId: 'leaf-deleteNode', + text: 'Delete ' + src + } + ]; + return menuItems; + }, + + allMenuMultiItems: function () { + var menuMulti = [ + { + fnId: 'mult-deleteMulti', + text: 'Delete selected ' + this.self.objectName + 's' + } + ]; + return menuMulti; + }, + + getAllContextMenuItems: function () { + return this.allMenuItems(); + }, + + getMultiContextMenuItems: function () { + return this.allMenuMultiItems(); + }, + + /** + * default implementation + * no menu display if there's no override of this function + */ + getMultiContextMenuItems: function () { + return null; + }, + + /** + * Context Menu Actions + * + */ + onMenuItemClick: function (menu, item, event) { + // fnId parsing : + var fnId = Ext.util.Format.substr(item.fnId, 5, item.fnId.length); + + switch (fnId) { + case 'deleteNode': + this.deleteNode(); + break; + case 'createDir': + this.createDir(); + break; + case 'createLeaf': + this.createLeaf(this); + break; + case 'renameNode': + this.renameNode(); + break; + case 'editLeaf': + this.editLeaf(); + break; + case 'deleteMulti': + this.deleteMulti(); + break; + case 'plotParam': + this.createPlot(this); + break; + case 'downParam': + this.createDownload(this); + break; + default: + break; + } // switch end + }, + + getTimeFromNode: function (node) { + var startString = String(node.get('globalStart')); + var stopString = String(node.get('globalStop')); + + var startDate = new Date(startString.replace(/\-/g, '\/').replace(/[T|Z]/g, ' ')); + var stopDate = new Date(stopString.replace(/\-/g, '\/').replace(/[T|Z]/g, ' ')); + + if (stopDate - startDate > 86400000) { + var startTime = Ext.Date.add(stopDate, Ext.Date.DAY, -1); + // var timeObj = {start: Ext.Date.format(startTime, 'Y/m/d H:i:s'), stop: Ext.Date.format(stopDate, 'Y/m/d H:i:s')}; + var timeObj = {start: Ext.Date.format(startTime, 'Y/m/d'), stop: Ext.Date.format(stopDate, 'Y/m/d')}; + } + else { + var timeObj = {start: node.get('globalStart'), stop: node.get('globalStop')}; + } + return timeObj; + }, + + createPlot: function (node) { + if (node.get('disable')) return; + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.plot.id, true, function (module) { + if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.plot.id)) { + var request = Ext.create(amdaPlotObj.PlotRequestObject.$className); + var newNode = Ext.create(amdaModel.PlotNode.$className, {object: request}); + // edit newNode into Plot Module with node as contextNode + newNode.editInModule(); + if ((node.get('globalStart') != null) && (node.get('globalStop') != null) && node.get('globalStart') != 'depending on mission' && node.get('isParameter')) { + module.getUiContent().setTimeFromData(node.getTimeFromNode(node)); + } + } + module.getUiContent().addParameter(node); + }); + }, + + createDownload: function (node) { + if (node.get('disable')) return; + + if (node.get('notyet')) { + myDesktopApp.warningMsg('Sorry! access to this parameter is restricted.'); + return; + } + + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.download.id, true, function (module) { + if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.download.id)) { + var request = Ext.create(amdaModel.Download.$className); + amdaModel.DownloadNode.set('object', request); + // singleton! + amdaModel.DownloadNode.editInModule(); + if ((node.get('globalStart') != null) && (node.get('globalStop') != null) && node.get('globalStart') != 'depending on mission' && node.get('isParameter')) { + module.getUiContent().setTimeFromData(node.getTimeFromNode(node)); + } + } + var paramName; + var components = null; + switch (node.$className) { + case 'amdaModel.AliasNode' : + paramName = "#" + node.get('text'); + break; + case 'amdaModel.DerivedParamNode' : + paramName = "ws_" + node.get('text'); + break; + case 'amdaModel.MyDataParamNode' : + paramName = 'wsd_' + node.get('text'); + break; + default : + if (node.get('alias') != "") + paramName = "#" + node.get('alias'); + else + paramName = node.get('id'); + } // var component_info = node.get('component_info'); // if (component_info && component_info.parentId) { // //It's a component @@ -543,263 +528,248 @@ Ext.define('amdaModel.InteractiveNode', { // if (component_info.index2) // components['index2'] = component_info.index2; // } - module.addParam(paramName,true,node.get('needsArgs'),components); - }); - }, - - deleteNode: function() { - // if the target is a directory - if (!this.isLeaf()) { - // determine if this directory is empty before launching the delete confirmation method - this.isNotEmptyDir(this.confirmDirectoryDeletion); - // else (the target is a leaf) - } else { - // no confirmation prompt for leaves - this.confirmDirectoryDeletion(false); - } - }, - -/** -* this method return if node has Childs even if it was not already loaded -*/ - isNotEmptyDir : function(callbackFn) { - var hasChilds; - // if node not already loaded - if (!this.isLoaded()){ - // call directFunction to load this node - AmdaAction.getTree({node:this.get('id'),nodeType:this.get('nodeType')},function(res,e){ - callbackFn.call(this,res.length>0?true:false); - },this); - } - else { - callbackFn.call(this,this.hasChildNodes()); - } - }, - -/** -* this method is used to display a confirmation message -*/ - confirmDirectoryDeletion : function(isNotEmptyDir) - { - // if this is a non-empty directory - if (isNotEmptyDir) { - // Prompt to the user if he also wants to delete its content - Ext.Msg.confirm('non-empty directory', 'The target is a non-empty directory!
Do you want to continue and also delete its content?', function(btn, text){ - if (btn == 'yes'){ - // do delete - this.realDelete(); - } - },this); - } - else { - this.realDelete(); - } - }, - -/* -* Call the extDirect method to delete parameter -* Callback method needed to execute node deletion in tree if id in result or to show error msg -*/ - realDelete : function() - { - AmdaAction.deleteObject({id: this.get('id'), leaf: this.isLeaf(), nodeType: this.get('nodeType')}, function(res,e){ - //TODO proper errors handling - // node deletion in tree - if (res) { // if success - if (res.id) { - //Ext.Msg.show({title:'Warning', msg: 'Requests with parameter '+node.data.text+' are deleted', icon: Ext.MessageBox.ERROR, buttons: Ext.Msg.OK}); - if (this.parentNode) { - if (this.isLeaf()){ - var moduleId = this.get('moduleId'); - // if really interactive node - if (moduleId) { - var me = this; - myDesktopApp.getLoadedModule(moduleId, true, function (module) { - var editedNode = module.getLinkedNode(); - // file node is not linked directly to the module - var isThisFile = false; - - if (editedNode && editedNode.$className == 'amdaModel.MyDataParamNode') - if (editedNode.get('fileObject').get('fileName') == me.get('text')) - isThisFile = true; - - if (me.$className == 'amdaModel.DerivedParamNode') - { - var obj = { - paramId : 'ws_'+me.get('text') - }; - AmdaAction.compilParamDelete(obj); - } - - if (editedNode === me || isThisFile){ - var newNode = Ext.ModelManager.create({leaf : true}, me.$className); - // several tabs could be connected to one node - if (moduleId === myDesktopApp.dynamicModules.plot.id) { - var linkedNodes = module.linkedNodes; - - if (linkedNodes) { - linkedNodes.each(function(key, value){ - if (value === me) { - linkedNodes.replace(key,newNode); - var tabPanel = module.getUiContent().tabPanel.items.getByKey(key); - tabPanel.setObject(Ext.create(amdaModel.Plot.$className, {})); - } - }, me); - } - } - newNode.editInModule(); - } - }); - } - } - //update mask info in myData - if (res.maskDesc && !res.maskDeleted) { - this.parentNode.set('info', res.maskDesc); - this.updateMyDataParam(res.mask, res.maskDesc); - } - this.remove(); - } - //TODO Several special node-dependent actions - to move to node functions.. - // nodes of another nodeType to be deleted as they depend on deleted node - if (res.params) { - this.deleteDependence(res.params); - //TODO reset - } - // mask was deleted or updated - to update mydata tree - if (res.maskDeleted) { - this.updateMyData(); - } - } - else { - myDesktopApp.warningMsg(res.error); - } - } - else { - myDesktopApp.errorMsg(e.message); - } - }, this); - }, - -/* -* Delete musti selection -*/ - deleteMulti: function() - { - var selection = this.myGetOwnerTree().getSelectionModel().selected.items; - alert(selection.length +' to delete!'); - Ext.Array.each(selection,function(item,index,allItems){ - item.deleteNode(); - }) - }, - -/* -* Create Folder -*/ - createDir: function() { - var me = this; - amdaModel.InteractiveNode.preloadNodes(this.getRootNode(), - function() - { - var newNode = Ext.create(me.$className, - { - leaf : false, nodeType : me.get('nodeType'), - text : amdaModel.AmdaNode.NEW_DIR_NAME, - children : [] - }); - - // insert the new node as a child of node - me.insertChild(0, newNode); - // start text edition on this new directory node - me.expand(false); - newNode.expand(false); - - // select the new node - me.myGetOwnerTree().getSelectionModel().select(newNode); - // call the renameNode method for this new node - newNode.renameNode(); - }); - }, - -/* -* -*/ - createLeaf: function(contextNode) { - // create new node with the same type than the contextNode - var newNode = Ext.create(contextNode.$className, {leaf : true}); - - // load the rootNode and recursively all its child nodes - amdaModel.InteractiveNode.preloadNodes(contextNode.getRootNode(), - function() - { - // edit newNode into Parameter Module with node as contextNode - newNode.editInModule(contextNode); - }); - }, - - renameNode: function() - { - if (this.myGetOwnerTree()) - { - // load the rootNode and recursively all its child nodes if not already loaded - var me = this; - amdaModel.InteractiveNode.preloadNodes(this.getRootNode(), - function() - { - // fire the edition event on tree - me.myGetOwnerTree().fireEvent('edition',me.myGetOwnerTree().view, me.myGetOwnerTree().getSelectionModel().selected.items[0]); - }); - } - else - { - myDesktopApp.errorMsg('tree is undefined'); - } - }, - -/* -* load the rootNode and recursively all its child nodes -* to know all names of DerivedParameters -*/ - editLeaf: function(onReady) - { - var me = this; - amdaModel.InteractiveNode.preloadNodes(this.getRootNode(), - function() - { - if (me.get('object')) - { - // launch edition of parameter into parameter module - me.editInModule(null, onReady); - } - else - { - // call the ext method to get the details of parameter - // the edition of real parameter is done into callback method getObjectCallback - if (onReady) - me.onReady = onReady; - - AmdaAction.getObject(me.get('id'), me.get('nodeType'), me.getObjectCallback, me); - } - }); - }, - -/* -* -*/ - getObjectCallback : function(result,remoteEvent) - { - var t = remoteEvent.getTransaction(); - - if (result) { - var paramObj = Ext.create(this.get('objectDataModel'), result); - // set parameter into node - this.set('object',paramObj); - // Edition of parameter into parameter Module - this.editInModule(null, this.onReady); - } - else { - // EXCEPTION : parameter not found !? - myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '" - + this.get('name') + "' found!"); - } - } + module.addParam(paramName, true, node.get('needsArgs'), components); + }); + }, + + deleteNode: function () { + // if the target is a directory + if (!this.isLeaf()) { + // determine if this directory is empty before launching the delete confirmation method + this.isNotEmptyDir(this.confirmDirectoryDeletion); + // else (the target is a leaf) + } else { + // no confirmation prompt for leaves + this.confirmDirectoryDeletion(false); + } + }, + + /** + * this method return if node has Childs even if it was not already loaded + */ + isNotEmptyDir: function (callbackFn) { + var hasChilds; + // if node not already loaded + if (!this.isLoaded()) { + // call directFunction to load this node + AmdaAction.getTree({node: this.get('id'), nodeType: this.get('nodeType')}, function (res, e) { + callbackFn.call(this, res.length > 0 ? true : false); + }, this); + } + else { + callbackFn.call(this, this.hasChildNodes()); + } + }, + + /** + * this method is used to display a confirmation message + */ + confirmDirectoryDeletion: function (isNotEmptyDir) { + // if this is a non-empty directory + if (isNotEmptyDir) { + // Prompt to the user if he also wants to delete its content + Ext.Msg.confirm('non-empty directory', 'The target is a non-empty directory!
Do you want to continue and also delete its content?', function (btn, text) { + if (btn == 'yes') { + // do delete + this.realDelete(); + } + }, this); + } + else { + this.realDelete(); + } + }, + + /* + * Call the extDirect method to delete parameter + * Callback method needed to execute node deletion in tree if id in result or to show error msg + */ + realDelete: function () { + AmdaAction.deleteObject({ + id: this.get('id'), + leaf: this.isLeaf(), + nodeType: this.get('nodeType') + }, function (res, e) { + //TODO proper errors handling + // node deletion in tree + if (res) { // if success + if (res.id) { + //Ext.Msg.show({title:'Warning', msg: 'Requests with parameter '+node.data.text+' are deleted', icon: Ext.MessageBox.ERROR, buttons: Ext.Msg.OK}); + if (this.parentNode) { + if (this.isLeaf()) { + var moduleId = this.get('moduleId'); + // if really interactive node + if (moduleId) { + var me = this; + myDesktopApp.getLoadedModule(moduleId, true, function (module) { + var editedNode = module.getLinkedNode(); + // file node is not linked directly to the module + var isThisFile = false; + + if (editedNode && editedNode.$className == 'amdaModel.MyDataParamNode') + if (editedNode.get('fileObject').get('fileName') == me.get('text')) + isThisFile = true; + + if (me.$className == 'amdaModel.DerivedParamNode') { + var obj = { + paramId: 'ws_' + me.get('text') + }; + AmdaAction.compilParamDelete(obj); + } + + if (editedNode === me || isThisFile) { + var newNode = Ext.ModelManager.create({leaf: true}, me.$className); + // several tabs could be connected to one node + if (moduleId === myDesktopApp.dynamicModules.plot.id) { + var linkedNodes = module.linkedNodes; + + if (linkedNodes) { + linkedNodes.each(function (key, value) { + if (value === me) { + linkedNodes.replace(key, newNode); + var tabPanel = module.getUiContent().tabPanel.items.getByKey(key); + tabPanel.setObject(Ext.create(amdaModel.Plot.$className, {})); + } + }, me); + } + } + newNode.editInModule(); + } + }); + } + } + //update mask info in myData + if (res.maskDesc && !res.maskDeleted) { + this.parentNode.set('info', res.maskDesc); + this.updateMyDataParam(res.mask, res.maskDesc); + } + this.remove(); + } + //TODO Several special node-dependent actions - to move to node functions.. + // nodes of another nodeType to be deleted as they depend on deleted node + if (res.params) { + this.deleteDependence(res.params); + //TODO reset + } + // mask was deleted or updated - to update mydata tree + if (res.maskDeleted) { + this.updateMyData(); + } + } + else { + myDesktopApp.warningMsg(res.error); + } + } + else { + myDesktopApp.errorMsg(e.message); + } + }, this); + }, + + /* + * Delete musti selection + */ + deleteMulti: function () { + var selection = this.myGetOwnerTree().getSelectionModel().selected.items; + alert(selection.length + ' to delete!'); + Ext.Array.each(selection, function (item, index, allItems) { + item.deleteNode(); + }) + }, + + /* + * Create Folder + */ + createDir: function () { + var me = this; + amdaModel.InteractiveNode.preloadNodes(this.getRootNode(), function () { + var newNode = Ext.create(me.$className, + { + leaf: false, nodeType: me.get('nodeType'), + text: amdaModel.AmdaNode.NEW_DIR_NAME, + children: [] + }); + + // insert the new node as a child of node + me.insertChild(0, newNode); + // start text edition on this new directory node + me.expand(false); + newNode.expand(false); + + // select the new node + me.myGetOwnerTree().getSelectionModel().select(newNode); + // call the renameNode method for this new node + newNode.renameNode(); + }); + }, + + /* + * + */ + createLeaf: function (contextNode) { + // create new node with the same type than the contextNode + var newNode = Ext.create(contextNode.$className, {leaf: true}); + + // load the rootNode and recursively all its child nodes + amdaModel.InteractiveNode.preloadNodes(contextNode.getRootNode(), function () { + // edit newNode into Parameter Module with node as contextNode + newNode.editInModule(contextNode); + }); + }, + + renameNode: function () { + if (this.myGetOwnerTree()) { + // load the rootNode and recursively all its child nodes if not already loaded + var me = this; + amdaModel.InteractiveNode.preloadNodes(this.getRootNode(), function () { + // fire the edition event on tree + me.myGetOwnerTree().fireEvent('edition', me.myGetOwnerTree().view, me.myGetOwnerTree().getSelectionModel().selected.items[0]); + }); + } + else { + myDesktopApp.errorMsg('tree is undefined'); + } + }, + + /* + * load the rootNode and recursively all its child nodes + * to know all names of DerivedParameters + */ + editLeaf: function (onReady) { + var me = this; + amdaModel.InteractiveNode.preloadNodes(this.getRootNode(), function () { + if (me.get('object')) { + // launch edition of parameter into parameter module + me.editInModule(null, onReady); + } + else { + // call the ext method to get the details of parameter + // the edition of real parameter is done into callback method getObjectCallback + if (onReady) + me.onReady = onReady; + + AmdaAction.getObject(me.get('id'), me.get('nodeType'), me.getObjectCallback, me); + } + }); + }, + + /* + * + */ + getObjectCallback: function (result, remoteEvent) { + var t = remoteEvent.getTransaction(); + + if (result) { + var paramObj = Ext.create(this.get('objectDataModel'), result); + // set parameter into node + this.set('object', paramObj); + // Edition of parameter into parameter Module + this.editInModule(null, this.onReady); + } + else { + // EXCEPTION : parameter not found !? + myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '" + + this.get('name') + "' found!"); + } + } }); diff --git a/js/app/views/ExplorerUI.js b/js/app/views/ExplorerUI.js index 4d3f2a5..80a6dd4 100644 --- a/js/app/views/ExplorerUI.js +++ b/js/app/views/ExplorerUI.js @@ -1,7 +1,7 @@ /** * Project  : AMDA-NG4 * Name : ExplorerUI.js - * @class amdaUI.ExplorerUI + * @class amdaUI.ExplorerUI * @extends Ext.tab.Panel * @class amdaUI.TreeToolColumn * @extends Ext.tree.Column @@ -12,1067 +12,1013 @@ */ Ext.define('amdaUI.TreeToolColumn', { - extend: 'Ext.tree.Column', - alias: 'widget.treetoolcolumn', - - /** - * Add more tools here. These will be on the prototype for all TreeToolColumns - */ - tools: { - 'info': 'js/resources/images/16x16/info_mini.png' - }, - - initComponent: function() - { - var me = this; - me.addEvents('toolclick'); - me.callParent(); - me.on('toolclick', me.toolHandler, me); - }, - - renderer: function(value, metaData, record, rowIdx, colIdx, store, view) - { - var toolCol = view.getHeaderAtIndex(colIdx); - - if (!toolCol.toolIsVisible(record)) return value; - - var toolId = 'tool-' + rowIdx + '-' + colIdx, - toolImg = toolCol.tools[toolCol.tool], - imgHtml = Ext.DomHelper.markup({ - id : toolId, - tag : 'img', - tooltype: toolCol.tool, - src : toolImg, - style : 'cursor:hand;' - }); - - return value + ' ' + imgHtml; - }, - - processEvent: function(type, view, cell, recordIndex, cellIndex, e) - { - if(type === "click" && e.target.tagName === "IMG") - { - var tooltype = e.target.getAttribute("tooltype"); - if(tooltype) - return this.fireEvent("toolclick", view, cell, recordIndex, cellIndex, e); - } - return this.fireEvent.apply(this, arguments); - }, - - /** - * Override this when you add columns to the tree... see example below - */ + extend: 'Ext.tree.Column', + alias: 'widget.treetoolcolumn', + + /** + * Add more tools here. These will be on the prototype for all TreeToolColumns + */ + tools: { + 'info': 'js/resources/images/16x16/info_mini.png' + }, + + initComponent: function () { + var me = this; + me.addEvents('toolclick'); + me.callParent(); + me.on('toolclick', me.toolHandler, me); + }, + + renderer: function (value, metaData, record, rowIdx, colIdx, store, view) { + var toolCol = view.getHeaderAtIndex(colIdx); + + if (!toolCol.toolIsVisible(record)) return value; + + var toolId = 'tool-' + rowIdx + '-' + colIdx, + toolImg = toolCol.tools[toolCol.tool], + imgHtml = Ext.DomHelper.markup({ + id: toolId, + tag: 'img', + tooltype: toolCol.tool, + src: toolImg, + style: 'cursor:hand;' + }); + + return value + ' ' + imgHtml; + }, + + processEvent: function (type, view, cell, recordIndex, cellIndex, e) { + if (type === "click" && e.target.tagName === "IMG") { + var tooltype = e.target.getAttribute("tooltype"); + if (tooltype) + return this.fireEvent("toolclick", view, cell, recordIndex, cellIndex, e); + } + return this.fireEvent.apply(this, arguments); + }, + + /** + * Override this when you add columns to the tree... see example below + */ // toolHandler: function() { // alert("override this"); // }, - toolIsVisible : function(record) { - return false; - } + toolIsVisible: function (record) { + return false; + } }); // ExplorerUI Ext.define('amdaUI.ExplorerUI', { - extend: 'Ext.tab.Panel', - alias : 'widget.panelExplorer', - - statics: - { - RESRC_TAB : { - TREE_ID:'resourcesTree', - TREE_TYPE:'resources' - }, - OPE_TAB : { - TREE_ID:'operationsTree', - TREE_TYPE:'operations' - }, - JOB_TAB : { - TREE_ID:'jobsTree', - TREE_TYPE:'jobs' - }, - - CAT_SUFFIX: '-treeBase', - ROOT_SUFFIX: '-treeRootNode', - SUB_ROOT_SUFFIX : 'RootNode', - - ITEM_KIND_BASE : 'base', - ITEM_KIND_ROOT : 'root', - ITEM_KIND_LEAF : 'leaf', - ITEM_KIND_DIRE : 'dire', - ITEM_KIND_PARA : 'para', - ITEM_KIND_MISS : 'miss' - }, - - initComponent : function (config) - { - var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); - - var myConf = { - split : true, - width : '100%', - height : '100%', - autoScroll : true, - border : true, - header : false, - defaults : { - // applied to each contained panel - containerScroll : true - }, - stateful: true, - //stateId: 'tp1', - stateEvents: ['tabchange'], - getState: function() { - return { - activeTab: this.items.findIndex('id',this.getActiveTab().id) - }; - }, - applyState: function(s) { - this.setActiveTab(s.activeTab); - }, - items: [ - this.initTree(amdaUI.ExplorerUI.RESRC_TAB.TREE_TYPE), - this.initTree(amdaUI.ExplorerUI.OPE_TAB.TREE_TYPE), - this.initTree(amdaUI.ExplorerUI.JOB_TAB.TREE_TYPE) - ], - tbar : [ - { - xtype : 'combo', - fieldLabel: 'Filter', - labelWidth: 25, - width: 140, - store: explorerModule.filtersStore, - queryMode: 'local', - displayField: 'name', - valueField: 'id', - listeners : { - scope : this, - select: function(combo, records) { - AmdaAction.setCrtFilterId({id : records[0].get('id')}, - function (result, e) - { - var t = e.getTransaction(); - if (e.status) - { - if (result) - { - var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); - if (explorerModule) - explorerModule.setCrtFilter(); - } - else - Ext.Msg.show( { - title : 'Filter', - msg : 'Cannot apply filter', - modal : true, - icon : Ext.Msg.ERROR, - buttons : Ext.Msg.OK - }); - } - else - { - // FAILURE - Ext.Msg.show({title:'Error System', msg: e.message, icon: Ext.MessageBox.ERROR, buttons: Ext.Msg.OK}); - } - },this); - } - } - }, - { - text: '', - iconCls : 'icon-parameters', - tooltip: { text: 'Edit Filter', align: 'bl-tl' }, - handler: function(t){ - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.filters.id, true, function (module) { - module.createWindow(); - }); - } - }, - { - text: '', - iconCls : 'icon-remover', - tooltip: { text: 'Reset Filter', align: 'bl-tl' }, - handler: function(t){ - var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); - explorerModule.resetFilter(); - } - }, '-', - { - xtype: 'displayfield', - fieldLabel: 'SortBy', - width: 40 - }, - { - text: 'Name', - scope : this, - tooltip: { text: 'Sort out AMDA DataBase Data by Mission Name', align: 'bl-tl' }, - pressed: true, - enableToggle : true, - toggleGroup: 'sorting', - handler: function(){ - var tree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); - tree.getStore().sort([ - { sorterFn: function(o1, o2){ - if (o1.get('nodeType') !== 'localParam') - return; - - return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1; - } - }]); - this.updateFilter(); - } - }, - { - text: 'Target', - scope : this, - tooltip: {text: 'Sort out AMDA DataBase Data by Mission Main Target', align: 'bl-tl'}, - enableToggle : true, - toggleGroup: 'sorting', - handler: function(){ - var tree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); - tree.getStore().sort([{ property : 'rank' }]); - this.updateFilter(); - } - }] - }; - Ext.apply (this , Ext.apply (arguments, myConf)); - this.callParent(arguments); - }, - - initTree : function(treeType) - { - switch (treeType) - { - case amdaUI.ExplorerUI.RESRC_TAB.TREE_TYPE: - treeId = amdaUI.ExplorerUI.RESRC_TAB.TREE_ID; - break; - case amdaUI.ExplorerUI.OPE_TAB.TREE_TYPE: - treeId = amdaUI.ExplorerUI.OPE_TAB.TREE_ID; - break; - case amdaUI.ExplorerUI.JOB_TAB.TREE_TYPE: - treeId = amdaUI.ExplorerUI.JOB_TAB.TREE_ID; - break; - default: - treeId = amdaUI.ExplorerUI.RESRC_TAB.TREE_ID; - break; - } - - var store = Ext.create('Ext.data.TreeStore', { - root: { - expanded: true, - nodeType : treeType - }, - model: 'amdaModel.AmdaNode', - sorters:[{ direction: 'ASC' , - sorterFn: function(o1, o2){ - if (o1.get('nodeType') !== 'localParam') - return; - - return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1; - } - }], - listeners: { - beforeload: function(store, operation){ - store.proxy.extraParams = { - nodeType: operation.node.get('nodeType') - }; - } - } - }); - - var menu = new Ext.menu.Menu(); - - var tree = Ext.create('Ext.tree.Panel', { - id : treeId, - title: treeType, - store: store, - rootVisible: false, - animate: false, - hideHeaders : true, - selModel: Ext.create('Ext.selection.TreeModel', { - // ignoreRightMouseSelection: true, - mode: 'MULTI' - }), - viewConfig: - { - plugins: - { - ptype: 'treeviewdragdrop', - enableDrag:true, - enableDrop:true, - //TODO - BRE - Wait a fix for drag&drop issue - ddGroup:'explorerTree', - pluginId : 'ddplugin', - - isValidDropPoint : function (node, position, dragZone, e, data) - { - if (!node || !data.item) { - return false; - } - var view = this.view, - targetNode = view.getRecord(node), - draggedRecords = data.records, - dataLength = draggedRecords.length, - ln = draggedRecords.length, - i, record; - - // No drop position, or dragged records: invalid drop point - if (!(targetNode && position && dataLength)) { - return false; - } - // If the targetNode is within the folder we are dragging - for (i = 0; i < ln; i++) { - record = draggedRecords[i]; - if (record.isNode && record.contains(targetNode)) { - return false; - } - } - // Respect the allowDrop field on Tree nodes - if (position === 'append' && targetNode.get('allowDrop') === false) { - return false; - } - else if (position != 'append' && targetNode.parentNode.get('allowDrop') === false) { - return false; - } - // If the target record is in the dragged dataset, then invalid drop - if (Ext.Array.contains(draggedRecords, targetNode)) { - return false; - } - // - if (dataLength > 1) - return false; - - var draggedRecord = draggedRecords[0]; - // - switch (targetNode.data.nodeType) - { - case 'localParam' : - case 'remoteParam' : - case 'remoteSimuParam' : - case 'myData' : - return false; - default : - if (draggedRecord.data.id == targetNode.data.nodeType+'-treeRootNode') - return false; - if ((position == 'before') && (targetNode.data.id == targetNode.data.nodeType+'-treeRootNode')) - return false; - return (draggedRecord.data.nodeType == targetNode.data.nodeType); - } - return false; - }, - onViewRender : function(view) - { - var me = this; - - view.on('itemupdate', function(record,index,node,opts) - { - var forceHide = false; - var crtRec = record.parentNode; - while (crtRec && !forceHide) - { - if (crtRec.get('filtered')) - forceHide = crtRec.get('filtered'); - crtRec = crtRec.parentNode; - } - tree.setNodesVisibility(record,forceHide); - tree.applyDisableToNode(record); - }); - - view.on('itemadd', function(records,index,node,opts) - { - Ext.each(records,function (rec) - { - tree.applyFilterToNode(rec); - tree.applyDisableToNode(rec); - }); - }); - - view.on('afteritemexpand', function(record,index,node,opts) - { - var forceHide = false; - var crtRec = record.parentNode; - while (crtRec && !forceHide) - { - if (crtRec.get('filtered')) - forceHide = crtRec.get('filtered'); - crtRec = crtRec.parentNode; - - } - tree.setNodesVisibility(record,forceHide); - tree.applyDisableToNode(record); - }); - - if (me.enableDrag) - { - me.dragZone = Ext.create('Ext.tree.ViewDragZone', { - view: view, - ddGroup: me.dragGroup || me.ddGroup, - dragText: me.dragText, - repairHighlightColor: me.nodeHighlightColor, - repairHighlight: me.nodeHighlightOnRepair - }); - } - - if (me.enableDrop) - { - me.dropZone = Ext.create('Ext.tree.ViewDropZone', { - view: view, - ddGroup: me.dropGroup || me.ddGroup, - allowContainerDrops: me.allowContainerDrops, - appendOnly: me.appendOnly, - allowParentInserts: me.allowParentInserts, - expandDelay: me.expandDelay, - dropHighlightColor: me.nodeHighlightColor, - dropHighlight: me.nodeHighlightOnDrop, - isValidDropPoint : me.isValidDropPoint - }); - } - } - }, - listeners : - { - beforedrop : function(node, data, overModel, dropPosition) - { - var parentId; - switch(dropPosition) - { - case 'append' : - if (overModel.isLeaf()) - parentId = overModel.parentNode.get('id'); - else - parentId = overModel.get('id'); - - if(!overModel.isExpanded() && overModel.isExpandable()) { - myDesktopApp.warningMsg('Please open the folder before node adding'); - return false; - } - break; - case 'before' : - case 'after' : - parentId = overModel.parentNode.get('id'); - break; - } - - Ext.each(data.records, function(rec) - { - rec.renameDD(parentId,function(result) - { - if (result) - { - if (!result.id) - { - Ext.Msg.show({ - title : 'Drop is impossible', - msg : result.error, - buttons : Ext.Msg.OK, - icon : Ext.MessageBox.WARNING - }); - - return false; - } - } - else - { - Ext.Msg.show({ - title : 'Drop is impossible', - msg : 'Cannot connect to the server', - buttons : Ext.Msg.OK, - icon : Ext.MessageBox.WARNING - }); - - return false; - } - - return true; - }); - }); - } - } - }, - listeners: - { - itemmouseenter: function(view, record, item){ - if(record.get('isParameter')){ - var el = Ext.get(item), - td = el.down('td > div'); - td.setStyle('cursor', 'crosshair'); - } - else - { - var el = Ext.get(item), - td = el.down('td > div'); - td.setStyle('cursor', 'pointer'); - } - }, - - itemcontextmenu: function(view, rec, item, index, e){ - // Add record to selection model - view.ownerCt.getSelectionModel().select(rec); - - // block other events - e.stopEvent(); - - // clear menu items - menu.removeAll(); - var menuItems; - - // if it's a single selection - if (view.ownerCt.getSelectionModel().selected.length === 1) { - // get items menu corresponding to right clicked record - menuItems = rec.getContextMenuItems(this); - - } else if (view.ownerCt.getSelectionModel().selected.length > 1) { - // get items menu corresponding to right clicked record - menuItems = rec.getContextMenuMultiItems(this); - } - // if there's at least one item menu - if (menuItems && menuItems.length){ - // add the items - menu.add(menuItems); - // add listener on right clicked record - var onRecordClick = function (menu, item, e, eOpts) - { - if (this.myGetOwnerTree().getSelectionModel().isSelected(this)) { - //Dispatch click event to the record - this.onMenuItemClick(menu,item,e); - } - //Remove old click listener - menu.removeListener('click',onRecordClick,this); - }; - - menu.addListener('click',onRecordClick,rec); - // then show menu - menu.showAt(e.getXY()); - } - }, - - itemdblclick: function(view, record, item, index, event){ - event.stopEvent(); - // first check if it is for SAVE-START-STOP plugin... - if (Ext.PluginManager.getCount() > 0 && - record.get('nodeType') == amdaModel.TimeTableNode.nodeType && record.isLeaf()) { - var zmgr = myDesktopApp.desktop.getDesktopZIndexManager(); - var winActive = zmgr.getActive(); - var winId = winActive.getId(); - if (winId == 'explorer-win') { - zmgr.eachTopDown(function(win) { - var id = win.getId(); - if (id !== 'explorer-win') { - winId = id; - return false; - } - }); - } - } - - if (record.get('nodeType') == 'remoteParam' && !record.isLeaf() - && !record.get('isParameter')) { - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) { - module.createWindow(record.getBaseId()); - }); - } - - if (record.isLeaf() || record.data.isParameter) - switch (record.get('nodeType')) - { - case 'myData' : - case 'myDataParam' : - case 'derivedParam' : - case 'timeTable' : - case 'sharedtimeTable' : - case 'sharedcatalog' : - case 'catalog' : - case 'request' : - case 'condition' : - record.editLeaf(); - break; - case 'localParam' : - case 'remoteParam': - case 'remoteSimuParam': - record.createAlias(record); - break; - case 'bkgWorks' : - if (!record.get('object')) { - AmdaAction.getObject(record.get('id'), record.get('nodeType'), record.getObjectCallback, record); - } - else { - if (record.get('status') == 'done') { - var isInteractive = false; - var isNewTab = true; - record.editNode(isNewTab, isInteractive); - } - else { - myDesktopApp.infoMsg('Job Status: ' + record.get('status')); - } - } - break; - } - }, - - beforeselect: function(view,node,index,options){ - // if there's at least one node already selected - if(view.selected.length - //AND (the node which is beeing selected has a different nodeType than the first selected node OR the first selected node isn't a leaf - && ( node.get('nodeType')!== view.selected.items[0].get('nodeType') || !view.selected.items[0].isLeaf()) - // OR the node which is beeing selected has no nodeType OR it isn't a leaf OR - || !node.get('nodeType') || !node.isLeaf() - ){ - // clear old selection - view.deselectAll(); - } - }, - - afterrender: function(comp){ - var view = comp.getView(); - view.tip = Ext.create('Ext.tip.ToolTip', { - // The overall target element. - target: view.el, - // Each grid row causes its own seperate show and hide. - delegate: view.itemSelector, - dismissDelay : 0, - // showDelay: 100, - // anchor: 'left', - // Moving within the row should not hide the tip. - trackMouse: true, - autoRender: true, - listeners: { - // Change content dynamically depending on which element triggered the show. - beforeshow: function updateTipBody(tip) { - if (view.getRecord(tip.triggerElement)) { - var info = view.getRecord(tip.triggerElement).get('info'); - if (!info || info == '') { - tip.addCls('hide'); - } - else { - tip.removeCls('hide'); - tip.update(info); - } - } - } - } - }); - }, - // if remote base is empty - open interoperability module - itemexpand: function(node) { - if ( node.get('nodeType') == amdaModel.RemoteParamNode.nodeType - && node.getDepth() == 3 && !node.hasChildNodes()) { - node.addData(); - } - }, - scope: this - }, - - hideHeaders: true, - // must define a column with a field to enable editor - columns: [{ - xtype : 'treetoolcolumn', - text : 'Name', - flex : 1, - dataIndex: 'text', - tool: 'info', // this references the "tools" object on the prototype - toolHandler: function(view, cell, recordIndex, cellIndex, e) { - var tooltype = e.target.getAttribute("tooltype"); - var record = view.store.getAt(recordIndex); - switch (tooltype) - { - case 'info' : - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.info.id, true, function (module) { - module.createWindow(record.get('help'), record.get('text')); - }); - break; - } - }, - toolIsVisible : function(record) { - - switch (record.get('nodeType')) - { - case 'localParam' : - case 'remoteParam' : - case 'remoteSimuParam' : - - return record.get('help') != ''; - } - return false; - }, - field: { - validFlag: true, - listeners: { - change : function( field, newValue, oldValue, eOpts ) - { - var explModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); - var explUI = explModule.getUiContent(); - var activeTreePanel = explUI.getActiveTab(); - - var editedNode = activeTreePanel.getSelectionModel().selected.items[0]; - if (editedNode) { - editedNode.isValidName(newValue, function (res) { - var validFlag = true; - if(newValue === amdaModel.AmdaNode.NEW_DIR_NAME) { - validFlag = 'Field is not modified' - } else if (!res) { - validFlag = 'Error during object validation'; - } else if (!res.valid) { - if (res.error) { - validFlag = res.error; - } else { - validFlag = 'Invalid object name'; - } - } - if (validFlag === true) { - field.lastValid = newValue; - } else { - field.markInvalid(validFlag); - } - field.validFlag = validFlag; - }); - } - } - }, - scope: this - } - }], - //add our custom editor plugin - plugins: [ new MyTreeEditor({ - pluginId: 'treeEditor', - listeners: { - 'edit': function (editor, e) { - if(e.column.field.validFlag !== true) { - if(e.column.field.lastValid) { - e.record.data[e.field] = e.column.field.lastValid; - } else { - e.record.remove(true); + extend: 'Ext.tab.Panel', + alias: 'widget.panelExplorer', + + statics: { + RESRC_TAB: { + TREE_ID: 'resourcesTree', + TREE_TYPE: 'resources' + }, + OPE_TAB: { + TREE_ID: 'operationsTree', + TREE_TYPE: 'operations' + }, + JOB_TAB: { + TREE_ID: 'jobsTree', + TREE_TYPE: 'jobs' + }, + + CAT_SUFFIX: '-treeBase', + ROOT_SUFFIX: '-treeRootNode', + SUB_ROOT_SUFFIX: 'RootNode', + + ITEM_KIND_BASE: 'base', + ITEM_KIND_ROOT: 'root', + ITEM_KIND_LEAF: 'leaf', + ITEM_KIND_DIRE: 'dire', + ITEM_KIND_PARA: 'para', + ITEM_KIND_MISS: 'miss' + }, + + initComponent: function (config) { + var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); + + var myConf = { + split: true, + width: '100%', + height: '100%', + autoScroll: true, + border: true, + header: false, + defaults: { + // applied to each contained panel + containerScroll: true + }, + stateful: true, + //stateId: 'tp1', + stateEvents: ['tabchange'], + getState: function () { + return { + activeTab: this.items.findIndex('id', this.getActiveTab().id) + }; + }, + applyState: function (s) { + this.setActiveTab(s.activeTab); + }, + items: [ + this.initTree(amdaUI.ExplorerUI.RESRC_TAB.TREE_TYPE), + this.initTree(amdaUI.ExplorerUI.OPE_TAB.TREE_TYPE), + this.initTree(amdaUI.ExplorerUI.JOB_TAB.TREE_TYPE) + ], + tbar: [ + { + xtype: 'combo', + fieldLabel: 'Filter', + labelWidth: 25, + width: 140, + store: explorerModule.filtersStore, + queryMode: 'local', + displayField: 'name', + valueField: 'id', + listeners: { + scope: this, + select: function (combo, records) { + AmdaAction.setCrtFilterId({id: records[0].get('id')}, function (result, e) { + var t = e.getTransaction(); + if (e.status) { + if (result) { + var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); + if (explorerModule) + explorerModule.setCrtFilter(); } - } - }, - 'beforeedit': function (editor, e) { - e.column.field.fireEvent('change', e.column.field, e.value, ''); + else + Ext.Msg.show({ + title: 'Filter', + msg: 'Cannot apply filter', + modal: true, + icon: Ext.Msg.ERROR, + buttons: Ext.Msg.OK + }); + } + else { + // FAILURE + Ext.Msg.show({ + title: 'Error System', + msg: e.message, + icon: Ext.MessageBox.ERROR, + buttons: Ext.Msg.OK + }); + } + }, this); + } + } + }, + { + text: '', + iconCls: 'icon-parameters', + tooltip: {text: 'Edit Filter', align: 'bl-tl'}, + handler: function (t) { + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.filters.id, true, function (module) { + module.createWindow(); + }); + } + }, + { + text: '', + iconCls: 'icon-remover', + tooltip: {text: 'Reset Filter', align: 'bl-tl'}, + handler: function (t) { + var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); + explorerModule.resetFilter(); + } + }, '-', + { + xtype: 'displayfield', + fieldLabel: 'SortBy', + width: 40 + }, + { + text: 'Name', + scope: this, + tooltip: {text: 'Sort out AMDA DataBase Data by Mission Name', align: 'bl-tl'}, + pressed: true, + enableToggle: true, + toggleGroup: 'sorting', + handler: function () { + var tree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); + tree.getStore().sort([ + { + sorterFn: function (o1, o2) { + if (o1.get('nodeType') !== 'localParam') + return; + + return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1; + } } - }, - scope: this - })], - - setNodesVisibility : function(node,forceHide) - { - var isFiltered = node.get('filtered'); - - for (var i = 0; i < node.childNodes.length; i++) - this.setNodesVisibility(node.childNodes[i],forceHide || isFiltered); - - this.setNodeVisibility(node,!(forceHide || isFiltered)); - }, - - setNodeVisibility : function(node,isVisible) - { - var record = store.getNodeById(node.internalId); - var viewNode = Ext.fly(tree.getView().getNode(record)); - if (viewNode) - { - viewNode.setVisibilityMode(Ext.Element.DISPLAY); - if (isVisible) - { - viewNode.show(); - this.applyDisableToNode(record); - } - else - viewNode.hide(); - } - }, - - applyFilterToNode : function(node) - { - if (!node) - return; - - var filter = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id).filter; - - switch (node.get('nodeType')) - { - case 'localParam' : - if (!filter || !filter['param']) - { - //no filter applied - node.set('filtered',false); - return; - } - var pos = node.get('depth') - 3; //depth from local param root node - if (pos < 0 || pos > 2) - { - node.set('filtered',false); - return; - } - var isFiltered = true; - for (var i = 0; i < filter['param'].length; i++) - { - s = filter['param'][i].split(';'); - if (node.get('id') == s[pos]) - { - isFiltered = false; - break; - } - } - node.set('filtered',isFiltered); - break; - - case 'remoteSimuParam' : - if (!filter || !filter['simu'] ) - { - //no filter applied - node.set('filtered',false); - return; - } - var pos = node.get('depth') - 3; //depth from remote param root node - - if (pos < 0 || pos > 5) - { - node.set('filtered',false); - return; - } - var isFiltered = true; - - for (var i = 0; i < filter['simu'].length; i++) - { - s = filter['simu'][i].split(';'); - - if (node.get('id') == s[pos]) - { - isFiltered = false; - break; - } - } - node.set('filtered',isFiltered); - break; - /*case 'alias' : - if (!this.localParamFilter.result || this.localParamFilter.id == "" || - !node.isLeaf()) - { - //no filter applied - node.set('filtered',false); - return; - } - var crtParam = node.get('id'); - crtParam = crtParam.replace('alias_',''); - crtParam = crtParam.replace(/_/g,':'); - var isFiltered = true; - for (var i = 0; i < this.localParamFilter.result.length; i++) - { - s = this.localParamFilter.result[i].split(';'); - console.log(s[2]); - if (crtParam == s[2]) - { - isFiltered = false; - break; - } - } - node.set('filtered',isFiltered); - break;*/ - default : - return; - } - }, - - applyFilterToNodes : function(node) - { - node.eachChild(function (child){ - tree.applyFilterToNodes(child); - }); - tree.applyFilterToNode(node); - }, - - applyDisableToNode : function(node) - { - var crtNode = node; - var disable = false; - - do - { - if (crtNode.get('disable')) - { - disable = true; - break; - } - crtNode = crtNode.parentNode; - } while (crtNode); - - - var viewNode = Ext.fly(tree.getView().getNode(node)); - if (disable) - { - node.set('disable',true); - viewNode.setStyle('opacity',0.5); - } - } - }); - - tree.addEvents('edition'); - - return tree; - }, - - updateFilter : function() - { - var filter = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id).filter; - - var keys = []; - for (var f in filter) { - if (hasOwnProperty.call(filter, f)) - keys.push(f); - } - - var tree = this.query('#'+amdaUI.ExplorerUI.RESRC_TAB.TREE_ID)[0]; - tree.getView().refresh(); - - for (var i = 0; i < keys.length; i++) - { - if (keys[i] == "_empty_") - continue; - - switch (keys[i]) - { - case 'param' : - //apply filter to local datasets - var localNode = tree.getRootNode().findChild('id','myLocalData-treeRootNode',true); - tree.applyFilterToNodes(localNode); - tree.setNodesVisibility(localNode,false); - tree.applyDisableToNode(localNode); - - //apply filter to aliases - var aliasNode = tree.getRootNode().findChild('id','alias-treeRootNode',true); - tree.applyFilterToNodes(aliasNode); - tree.setNodesVisibility(aliasNode,false); - tree.applyDisableToNode(aliasNode); - break; - - case 'simu' : - //apply filter to simulation datasets (in remote data) - var remoteNode = tree.getRootNode().findChild('id','myRemoteSimuData-treeRootNode',true); - tree.applyFilterToNodes(remoteNode); - tree.setNodesVisibility(remoteNode,false); - tree.applyDisableToNode(remoteNode); - break; - } - } - - this.dockedItems.getAt(1).items.items[0].select(filter['name']); - } + ]); + this.updateFilter(); + } + }, + { + text: 'Target', + scope: this, + tooltip: {text: 'Sort out AMDA DataBase Data by Mission Main Target', align: 'bl-tl'}, + enableToggle: true, + toggleGroup: 'sorting', + handler: function () { + var tree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); + tree.getStore().sort([{property: 'rank'}]); + this.updateFilter(); + } + } + ] + }; + Ext.apply(this, Ext.apply(arguments, myConf)); + this.callParent(arguments); + }, + + initTree: function (treeType) { + switch (treeType) { + case amdaUI.ExplorerUI.RESRC_TAB.TREE_TYPE: + treeId = amdaUI.ExplorerUI.RESRC_TAB.TREE_ID; + break; + case amdaUI.ExplorerUI.OPE_TAB.TREE_TYPE: + treeId = amdaUI.ExplorerUI.OPE_TAB.TREE_ID; + break; + case amdaUI.ExplorerUI.JOB_TAB.TREE_TYPE: + treeId = amdaUI.ExplorerUI.JOB_TAB.TREE_ID; + break; + default: + treeId = amdaUI.ExplorerUI.RESRC_TAB.TREE_ID; + break; + } + + var store = Ext.create('Ext.data.TreeStore', { + root: { + expanded: true, + nodeType: treeType + }, + model: 'amdaModel.AmdaNode', + sorters: [ + { + direction: 'ASC', + sorterFn: function (o1, o2) { + if (o1.get('nodeType') !== 'localParam') + return; + + return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1; + } + } + ], + listeners: { + beforeload: function (store, operation) { + store.proxy.extraParams = { + nodeType: operation.node.get('nodeType') + }; + } + } + }); + + var menu = new Ext.menu.Menu(); + + var tree = Ext.create('Ext.tree.Panel', { + id: treeId, + title: treeType, + store: store, + rootVisible: false, + animate: false, + hideHeaders: true, + selModel: Ext.create('Ext.selection.TreeModel', { + // ignoreRightMouseSelection: true, + mode: 'MULTI' + }), + viewConfig: { + plugins: { + ptype: 'treeviewdragdrop', + enableDrag: true, + enableDrop: true, + //TODO - BRE - Wait a fix for drag&drop issue + ddGroup: 'explorerTree', + pluginId: 'ddplugin', + + isValidDropPoint: function (node, position, dragZone, e, data) { + if (!node || !data.item) { + return false; + } + var view = this.view, + targetNode = view.getRecord(node), + draggedRecords = data.records, + dataLength = draggedRecords.length, + ln = draggedRecords.length, + i, record; + + // No drop position, or dragged records: invalid drop point + if (!(targetNode && position && dataLength)) { + return false; + } + // If the targetNode is within the folder we are dragging + for (i = 0; i < ln; i++) { + record = draggedRecords[i]; + if (record.isNode && record.contains(targetNode)) { + return false; + } + } + // Respect the allowDrop field on Tree nodes + if (position === 'append' && targetNode.get('allowDrop') === false) { + return false; + } + else if (position != 'append' && targetNode.parentNode.get('allowDrop') === false) { + return false; + } + // If the target record is in the dragged dataset, then invalid drop + if (Ext.Array.contains(draggedRecords, targetNode)) { + return false; + } + // + if (dataLength > 1) + return false; + + var draggedRecord = draggedRecords[0]; + // + switch (targetNode.data.nodeType) { + case 'localParam' : + case 'remoteParam' : + case 'remoteSimuParam' : + case 'myData' : + return false; + default : + if (draggedRecord.data.id == targetNode.data.nodeType + '-treeRootNode') + return false; + if ((position == 'before') && (targetNode.data.id == targetNode.data.nodeType + '-treeRootNode')) + return false; + return (draggedRecord.data.nodeType == targetNode.data.nodeType); + } + return false; + }, + onViewRender: function (view) { + var me = this; + + view.on('itemupdate', function (record, index, node, opts) { + var forceHide = false; + var crtRec = record.parentNode; + while (crtRec && !forceHide) { + if (crtRec.get('filtered')) + forceHide = crtRec.get('filtered'); + crtRec = crtRec.parentNode; + } + tree.setNodesVisibility(record, forceHide); + tree.applyDisableToNode(record); + }); + + view.on('itemadd', function (records, index, node, opts) { + Ext.each(records, function (rec) { + tree.applyFilterToNode(rec); + tree.applyDisableToNode(rec); + }); + }); + + view.on('afteritemexpand', function (record, index, node, opts) { + var forceHide = false; + var crtRec = record.parentNode; + while (crtRec && !forceHide) { + if (crtRec.get('filtered')) + forceHide = crtRec.get('filtered'); + crtRec = crtRec.parentNode; + + } + tree.setNodesVisibility(record, forceHide); + tree.applyDisableToNode(record); + }); + + if (me.enableDrag) { + me.dragZone = Ext.create('Ext.tree.ViewDragZone', { + view: view, + ddGroup: me.dragGroup || me.ddGroup, + dragText: me.dragText, + repairHighlightColor: me.nodeHighlightColor, + repairHighlight: me.nodeHighlightOnRepair + }); + } + + if (me.enableDrop) { + me.dropZone = Ext.create('Ext.tree.ViewDropZone', { + view: view, + ddGroup: me.dropGroup || me.ddGroup, + allowContainerDrops: me.allowContainerDrops, + appendOnly: me.appendOnly, + allowParentInserts: me.allowParentInserts, + expandDelay: me.expandDelay, + dropHighlightColor: me.nodeHighlightColor, + dropHighlight: me.nodeHighlightOnDrop, + isValidDropPoint: me.isValidDropPoint + }); + } + } + }, + listeners: { + beforedrop: function (node, data, overModel, dropPosition) { + var parentId; + switch (dropPosition) { + case 'append' : + if (overModel.isLeaf()) + parentId = overModel.parentNode.get('id'); + else + parentId = overModel.get('id'); + + if (!overModel.isExpanded() && overModel.isExpandable()) { + myDesktopApp.warningMsg('Please open the folder before node adding'); + return false; + } + break; + case 'before' : + case 'after' : + parentId = overModel.parentNode.get('id'); + break; + } + + Ext.each(data.records, function (rec) { + rec.renameDD(parentId, function (result) { + if (result) { + if (!result.id) { + Ext.Msg.show({ + title: 'Drop is impossible', + msg: result.error, + buttons: Ext.Msg.OK, + icon: Ext.MessageBox.WARNING + }); + + return false; + } + } + else { + Ext.Msg.show({ + title: 'Drop is impossible', + msg: 'Cannot connect to the server', + buttons: Ext.Msg.OK, + icon: Ext.MessageBox.WARNING + }); + + return false; + } + + return true; + }); + }); + } + } + }, + listeners: { + itemmouseenter: function (view, record, item) { + if (record.get('isParameter')) { + var el = Ext.get(item), + td = el.down('td > div'); + td.setStyle('cursor', 'crosshair'); + } + else { + var el = Ext.get(item), + td = el.down('td > div'); + td.setStyle('cursor', 'pointer'); + } + }, + + itemcontextmenu: function (view, rec, item, index, e) { + // Add record to selection model + view.ownerCt.getSelectionModel().select(rec); + + // block other events + e.stopEvent(); + + // clear menu items + menu.removeAll(); + var menuItems; + + // if it's a single selection + if (view.ownerCt.getSelectionModel().selected.length === 1) { + // get items menu corresponding to right clicked record + menuItems = rec.getContextMenuItems(this); + + } else if (view.ownerCt.getSelectionModel().selected.length > 1) { + // get items menu corresponding to right clicked record + menuItems = rec.getContextMenuMultiItems(this); + } + // if there's at least one item menu + if (menuItems && menuItems.length) { + // add the items + menu.add(menuItems); + // add listener on right clicked record + var onRecordClick = function (menu, item, e, eOpts) { + if (this.myGetOwnerTree().getSelectionModel().isSelected(this)) { + //Dispatch click event to the record + this.onMenuItemClick(menu, item, e); + } + //Remove old click listener + menu.removeListener('click', onRecordClick, this); + }; + + menu.addListener('click', onRecordClick, rec); + // then show menu + menu.showAt(e.getXY()); + } + }, + + itemdblclick: function (view, record, item, index, event) { + event.stopEvent(); + // first check if it is for SAVE-START-STOP plugin... + if (Ext.PluginManager.getCount() > 0 && + record.get('nodeType') == amdaModel.TimeTableNode.nodeType && record.isLeaf()) { + var zmgr = myDesktopApp.desktop.getDesktopZIndexManager(); + var winActive = zmgr.getActive(); + var winId = winActive.getId(); + if (winId == 'explorer-win') { + zmgr.eachTopDown(function (win) { + var id = win.getId(); + if (id !== 'explorer-win') { + winId = id; + return false; + } + }); + } + } + + if (record.get('nodeType') == 'remoteParam' && !record.isLeaf() + && !record.get('isParameter')) { + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) { + module.createWindow(record.getBaseId()); + }); + } + + if (record.isLeaf() || record.data.isParameter) + switch (record.get('nodeType')) { + case 'myData' : + case 'myDataParam' : + case 'derivedParam' : + case 'timeTable' : + case 'sharedtimeTable' : + case 'sharedcatalog' : + case 'catalog' : + case 'request' : + case 'condition' : + record.editLeaf(); + break; + case 'localParam' : + case 'remoteParam': + case 'remoteSimuParam': + record.createAlias(record); + break; + case 'bkgWorks' : + if (!record.get('object')) { + AmdaAction.getObject(record.get('id'), record.get('nodeType'), record.getObjectCallback, record); + } + else { + if (record.get('status') == 'done') { + var isInteractive = false; + var isNewTab = true; + record.editNode(isNewTab, isInteractive); + } + else { + myDesktopApp.infoMsg('Job Status: ' + record.get('status')); + } + } + break; + } + }, + + beforeselect: function (view, node, index, options) { + // if there's at least one node already selected + if (view.selected.length + //AND (the node which is beeing selected has a different nodeType than the first selected node OR the first selected node isn't a leaf + && (node.get('nodeType') !== view.selected.items[0].get('nodeType') || !view.selected.items[0].isLeaf()) + // OR the node which is beeing selected has no nodeType OR it isn't a leaf OR + || !node.get('nodeType') || !node.isLeaf() + ) { + // clear old selection + view.deselectAll(); + } + }, + + afterrender: function (comp) { + var view = comp.getView(); + view.tip = Ext.create('Ext.tip.ToolTip', { + // The overall target element. + target: view.el, + // Each grid row causes its own seperate show and hide. + delegate: view.itemSelector, + dismissDelay: 0, + // showDelay: 100, + // anchor: 'left', + // Moving within the row should not hide the tip. + trackMouse: true, + autoRender: true, + listeners: { + // Change content dynamically depending on which element triggered the show. + beforeshow: function updateTipBody(tip) { + if (view.getRecord(tip.triggerElement)) { + var info = view.getRecord(tip.triggerElement).get('info'); + if (!info || info == '') { + tip.addCls('hide'); + } + else { + tip.removeCls('hide'); + tip.update(info); + } + } + } + } + }); + }, + // if remote base is empty - open interoperability module + itemexpand: function (node) { + if (node.get('nodeType') == amdaModel.RemoteParamNode.nodeType + && node.getDepth() == 3 && !node.hasChildNodes()) { + node.addData(); + } + }, + scope: this + }, + + hideHeaders: true, + // must define a column with a field to enable editor + columns: [ + { + xtype: 'treetoolcolumn', + text: 'Name', + flex: 1, + dataIndex: 'text', + tool: 'info', // this references the "tools" object on the prototype + toolHandler: function (view, cell, recordIndex, cellIndex, e) { + var tooltype = e.target.getAttribute("tooltype"); + var record = view.store.getAt(recordIndex); + switch (tooltype) { + case 'info' : + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.info.id, true, function (module) { + module.createWindow(record.get('help'), record.get('text')); + }); + break; + } + }, + toolIsVisible: function (record) { + + switch (record.get('nodeType')) { + case 'localParam' : + case 'remoteParam' : + case 'remoteSimuParam' : + + return record.get('help') != ''; + } + return false; + }, + field: { + validFlag: true, + listeners: { + change: function (field, newValue, oldValue, eOpts) { + var explModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); + var explUI = explModule.getUiContent(); + var activeTreePanel = explUI.getActiveTab(); + + var editedNode = activeTreePanel.getSelectionModel().selected.items[0]; + if (editedNode) { + editedNode.isValidName(newValue, function (res) { + var validFlag = true; + if (newValue === amdaModel.AmdaNode.NEW_DIR_NAME) { + validFlag = 'Field is not modified' + } else if (!res) { + validFlag = 'Error during object validation'; + } else if (!res.valid) { + if (res.error) { + validFlag = res.error; + } else { + validFlag = 'Invalid object name'; + } + } + if (validFlag === true) { + field.lastValid = newValue; + } else { + field.markInvalid(validFlag); + } + field.validFlag = validFlag; + }); + } + } + }, + scope: this + } + } + ], + //add our custom editor plugin + plugins: [new MyTreeEditor({ + pluginId: 'treeEditor', + listeners: { + 'edit': function (editor, e) { + if (e.column.field.validFlag !== true) { + if (e.column.field.lastValid) { + e.record.data[e.field] = e.column.field.lastValid; + } else { + e.record.remove(true); + } + } + }, + 'beforeedit': function (editor, e) { + e.column.field.fireEvent('change', e.column.field, e.value, ''); + } + }, + scope: this + })], + + setNodesVisibility: function (node, forceHide) { + var isFiltered = node.get('filtered'); + + for (var i = 0; i < node.childNodes.length; i++) + this.setNodesVisibility(node.childNodes[i], forceHide || isFiltered); + + this.setNodeVisibility(node, !(forceHide || isFiltered)); + }, + + setNodeVisibility: function (node, isVisible) { + var record = store.getNodeById(node.internalId); + var viewNode = Ext.fly(tree.getView().getNode(record)); + if (viewNode) { + viewNode.setVisibilityMode(Ext.Element.DISPLAY); + if (isVisible) { + viewNode.show(); + this.applyDisableToNode(record); + } + else + viewNode.hide(); + } + }, + + applyFilterToNode: function (node) { + if (!node) + return; + + var filter = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id).filter; + + switch (node.get('nodeType')) { + case 'localParam' : + if (!filter || !filter['param']) { + //no filter applied + node.set('filtered', false); + return; + } + var pos = node.get('depth') - 3; //depth from local param root node + if (pos < 0 || pos > 2) { + node.set('filtered', false); + return; + } + var isFiltered = true; + for (var i = 0; i < filter['param'].length; i++) { + s = filter['param'][i].split(';'); + if (node.get('id') == s[pos]) { + isFiltered = false; + break; + } + } + node.set('filtered', isFiltered); + break; + + case 'remoteSimuParam' : + if (!filter || !filter['simu']) { + //no filter applied + node.set('filtered', false); + return; + } + var pos = node.get('depth') - 3; //depth from remote param root node + + if (pos < 0 || pos > 5) { + node.set('filtered', false); + return; + } + var isFiltered = true; + + for (var i = 0; i < filter['simu'].length; i++) { + s = filter['simu'][i].split(';'); + + if (node.get('id') == s[pos]) { + isFiltered = false; + break; + } + } + node.set('filtered', isFiltered); + break; + /*case 'alias' : + if (!this.localParamFilter.result || this.localParamFilter.id == "" || + !node.isLeaf()) { + //no filter applied + node.set('filtered',false); + return; + } + var crtParam = node.get('id'); + crtParam = crtParam.replace('alias_',''); + crtParam = crtParam.replace(/_/g,':'); + var isFiltered = true; + for (var i = 0; i < this.localParamFilter.result.length; i++) { + s = this.localParamFilter.result[i].split(';'); + console.log(s[2]); + if (crtParam == s[2]) { + isFiltered = false; + break; + } + } + node.set('filtered',isFiltered); + break;*/ + default : + return; + } + }, + + applyFilterToNodes: function (node) { + node.eachChild(function (child) { + tree.applyFilterToNodes(child); + }); + tree.applyFilterToNode(node); + }, + + applyDisableToNode: function (node) { + var crtNode = node; + var disable = false; + + do { + if (crtNode.get('disable')) { + disable = true; + break; + } + crtNode = crtNode.parentNode; + } while (crtNode); + + + var viewNode = Ext.fly(tree.getView().getNode(node)); + if (disable) { + node.set('disable', true); + viewNode.setStyle('opacity', 0.5); + } + } + }); + + tree.addEvents('edition'); + + return tree; + }, + + updateFilter: function () { + var filter = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id).filter; + + var keys = []; + for (var f in filter) { + if (hasOwnProperty.call(filter, f)) + keys.push(f); + } + + var tree = this.query('#' + amdaUI.ExplorerUI.RESRC_TAB.TREE_ID)[0]; + tree.getView().refresh(); + + for (var i = 0; i < keys.length; i++) { + if (keys[i] == "_empty_") + continue; + + switch (keys[i]) { + case 'param' : + //apply filter to local datasets + var localNode = tree.getRootNode().findChild('id', 'myLocalData-treeRootNode', true); + tree.applyFilterToNodes(localNode); + tree.setNodesVisibility(localNode, false); + tree.applyDisableToNode(localNode); + + //apply filter to aliases + var aliasNode = tree.getRootNode().findChild('id', 'alias-treeRootNode', true); + tree.applyFilterToNodes(aliasNode); + tree.setNodesVisibility(aliasNode, false); + tree.applyDisableToNode(aliasNode); + break; + + case 'simu' : + //apply filter to simulation datasets (in remote data) + var remoteNode = tree.getRootNode().findChild('id', 'myRemoteSimuData-treeRootNode', true); + tree.applyFilterToNodes(remoteNode); + tree.setNodesVisibility(remoteNode, false); + tree.applyDisableToNode(remoteNode); + break; + } + } + + this.dockedItems.getAt(1).items.items[0].select(filter['name']); + } }); // MyTreeEditor -Ext.define( 'MyTreeEditor', { - extend: 'Ext.grid.plugin.CellEditing', - alias: 'editing.treeeditor', - - // initialization method of plugin - init: function(cmp) { - var me = this; - me.hostCmp = cmp; - // on parent event - me.hostCmp.on({ - // on edition event - edition : { - delay: 50, - fn : function(view, record, item, index, e){ - // view.getHeaderAtIndex(0).field.validFlag = 'Not modified'; - // call the start edition method - me.startEdit(record, view.getHeaderAtIndex(0)); - }, - scope: me - } - }); - me.callParent(arguments); - }, - - /** - * Cancel any active editing. - */ - cancelEdit: function() { - var me = this, - activeEd = me.getActiveEditor(), - viewEl = me.grid.getView().getEl(me.getActiveColumn()); - - me.setActiveEditor(null); - me.setActiveColumn(null); - me.setActiveRecord(null); - if (activeEd) { - activeEd.cancelEdit(); - viewEl.focus(); - this.fireEvent('canceledit', activeEd, me.context); - } - }, - - /** - * overwrite the initEditTriggers to disable edition on click/dblclick - * and to add custom - */ - initEditTriggers: function() - { - var me = this, - view = me.view; - - me.on({ - edit: function(editor,event){ - // if there is a modification - if (event.originalValue !== event.value) { - // delegate rename action on model - event.record.rename(event.value,function(result){ - // if a result has been returned : success - if(result) { - // delegate commit action to delete modification flag - event.record.commit(); - var rec = event.record.data; - // in case of directory - if (!rec.leaf){ - // set folder's ID returned by server - rec.id = result.id; - } - } else { // in case of transaction error - // reset originalValue - event.record.value = event.originalValue; - event.record.set('text', event.originalValue); - event.record.commit(); - } - }); - } - } - }); - - // enable Enter key and Esc Key - view.on('render', function() { - me.keyNav = Ext.create('Ext.util.KeyNav', view.el, { - enter: me.onEnterKey, - esc: me.onEscKey, - scope: me - }); - }, me, { single: true }); - }, - //overwrite the getEditing context because we do not need the rowId - getEditingContext: function(record, columnHeader) { - var me = this, - grid = me.grid, - store = grid.store, - colIdx, - view = grid.getView(), - value; - - // getting colIdx and real columnHeader - if (Ext.isNumber(columnHeader)) { - colIdx = columnHeader; - columnHeader = grid.headerCt.getHeaderAtIndex(colIdx); - } else { - colIdx = columnHeader.getIndex(); - } - // getting current value - value = record.get(columnHeader.dataIndex); - - // return editing context - return { - grid: grid, - record: record, - field: columnHeader.dataIndex, - value: value, - column: columnHeader, - colIdx: colIdx, - view: columnHeader.getOwnerHeaderCt().view - }; - } +Ext.define('MyTreeEditor', { + extend: 'Ext.grid.plugin.CellEditing', + alias: 'editing.treeeditor', + + // initialization method of plugin + init: function (cmp) { + var me = this; + me.hostCmp = cmp; + // on parent event + me.hostCmp.on({ + // on edition event + edition: { + delay: 50, + fn: function (view, record, item, index, e) { + // view.getHeaderAtIndex(0).field.validFlag = 'Not modified'; + // call the start edition method + me.startEdit(record, view.getHeaderAtIndex(0)); + }, + scope: me + } + }); + me.callParent(arguments); + }, + + /** + * Cancel any active editing. + */ + cancelEdit: function () { + var me = this, + activeEd = me.getActiveEditor(), + viewEl = me.grid.getView().getEl(me.getActiveColumn()); + + me.setActiveEditor(null); + me.setActiveColumn(null); + me.setActiveRecord(null); + if (activeEd) { + activeEd.cancelEdit(); + viewEl.focus(); + this.fireEvent('canceledit', activeEd, me.context); + } + }, + + /** + * overwrite the initEditTriggers to disable edition on click/dblclick + * and to add custom + */ + initEditTriggers: function () { + var me = this, + view = me.view; + + me.on({ + edit: function (editor, event) { + // if there is a modification + if (event.originalValue !== event.value) { + // delegate rename action on model + event.record.rename(event.value, function (result) { + // if a result has been returned : success + if (result) { + // delegate commit action to delete modification flag + event.record.commit(); + var rec = event.record.data; + // in case of directory + if (!rec.leaf) { + // set folder's ID returned by server + rec.id = result.id; + } + } else { // in case of transaction error + // reset originalValue + event.record.value = event.originalValue; + event.record.set('text', event.originalValue); + event.record.commit(); + } + }); + } + } + }); + + // enable Enter key and Esc Key + view.on('render', function () { + me.keyNav = Ext.create('Ext.util.KeyNav', view.el, { + enter: me.onEnterKey, + esc: me.onEscKey, + scope: me + }); + }, me, {single: true}); + }, + //overwrite the getEditing context because we do not need the rowId + getEditingContext: function (record, columnHeader) { + var me = this, + grid = me.grid, + store = grid.store, + colIdx, + view = grid.getView(), + value; + + // getting colIdx and real columnHeader + if (Ext.isNumber(columnHeader)) { + colIdx = columnHeader; + columnHeader = grid.headerCt.getHeaderAtIndex(colIdx); + } else { + colIdx = columnHeader.getIndex(); + } + // getting current value + value = record.get(columnHeader.dataIndex); + + // return editing context + return { + grid: grid, + record: record, + field: columnHeader.dataIndex, + value: value, + column: columnHeader, + colIdx: colIdx, + view: columnHeader.getOwnerHeaderCt().view + }; + } }); -- libgit2 0.21.2