/**
* Project : AMDA-NG
* Name : SearchUI.js
* @class amdaUI.SearchUI
* @extends Ext.container.Container
* @brief Search Module UI definition (View)
* @author CDA
* @version $Id: SearchUI.js 2467 2014-07-10 16:06:26Z myriam $
*/
Ext.define('amdaUI.SearchUI',
{
extend: 'Ext.container.Container',
alias: 'widget.panelSearch',
requires: [
'amdaUI.CalculatorUI',
'amdaUI.TimeSelectorUI',
'extensions.SelectableTextArea',
'amdaUI.ParamArgumentsPlug'
],
constructor: function(config)
{
this.init(config);
this.callParent(arguments);
// load object into view
this.loadObject();
var searchArgsPlug = this.getPlugin('search-param-components-plugin');
if (searchArgsPlug)
searchArgsPlug.onApply = this.onApplyParameterArgs;
},
addTT : function(newTTName,newTTid)
{
this.timeSelector.addTT(newTTName,newTTid);
},
addTTs : function(TTarray)
{
// set TTTab
this.timeSelector.setTTTab(TTarray);
},
addParam : function(newParamName, isLeaf, needArgs, components)
{
if (!isLeaf || needArgs || components)
this.editParameterArgs(newParamName, components);
else
this.addParamInEditor(newParamName);
},
addParamInEditor : function(param)
{
var selection = this.constructionField.getSelection();
this.constructionField.setValue(selection.beforeText + param + selection.afterText);
this.constructionField.focus();
this.constructionField.setCaretPosition(this.constructionField.getValue().length);
},
onApplyParameterArgs : function(uiScope, paramRequestObject)
{
var fullParam = paramRequestObject.getParamFullName();
uiScope.addParamInEditor(fullParam);
},
editParameterArgs: function(name, components)
{
var paramObj = {
paramid: name,
type: 0,
'dim1-is-range': false,
'dim1-min-range': 0.,
'dim1-max-range': 0.,
'dim1-index': '*',
'dim2-is-range': false,
'dim2-min-range': 0.,
'dim2-max-range': 0.,
'dim2-index': '*',
template_args: {}
};
if (components) {
if (components['index1']) {
paramObj['dim1-index'] = components['index1'];
++paramObj['type'];
}
if (components['index2']) {
paramObj['dim2-index'] = components['index2'];
++paramObj['type'];
}
}
var paramArgsPlug = this.getPlugin('search-param-components-plugin');
if (paramArgsPlug) {
var workinRequestParamObject = Ext.create('amdaModel.RequestParamObject', paramObj);
paramArgsPlug.show('search-param-components-plugin', workinRequestParamObject);
}
},
/**
* Set Start-Stop from parameter info (Local & MyData)
*/
setTimeFromData : function(obj)
{
var dateStart = new Date(obj.start.replace(/[T|Z]/g,' ').replace(/\-/g,'\/'));
var dateStop = new Date(obj.stop.replace(/[T|Z]/g,' ').replace(/\-/g,'\/'));
this.down('form').getForm().setValues({ startDate : dateStart, stopDate : dateStop });
},
setObject : function(obj)
{
this.object = obj;
this.loadObject();
},
/**
* update this.object from form
*/
updateObject : function()
{
// get the basic form
var basicForm = this.formPanel.getForm();
// get the timeSource selected
var timeSource = this.timeSelector.getActiveTimeSource();
var updateStatus = true;
var fieldsWithoutName = basicForm.getFields().items;
Ext.Array.each(fieldsWithoutName, function(item, index,allItems)
{
if(item !== this.fieldName)
{
if (!item.isValid())
{
if ((timeSource === amdaModel.AmdaTimeObject.inputTimeSrc[0]) &&
((item.name == 'startDate') || (item.name == 'stopDate') || (item.name == 'duration'))) {
updateStatus = true;
}
else {
// set update isn't allowed
updateStatus = false;
return false;
}
}
}
}, this);
if (timeSource === amdaModel.AmdaTimeObject.inputTimeSrc[0] // timeSource 'TimeTable'
&& this.timeSelector.TTGrid.getStore().count() == 0) {
Ext.Msg.show({
title: 'Warning', msg: 'You chose Time Selection `by TimeTable` but no timeTable was added!'
+'
You must add one or choose Time Selection `by Interval`',
icon: Ext.MessageBox.WARNING, buttons: Ext.Msg.OK
});
updateStatus = false;
}
// if the update is allowed
if (updateStatus)
{
/// real object update
// update TimeTable object with the content of form
basicForm.updateRecord(this.object);
this.object.set('timesrc', timeSource);
// set valid intervals into TimeTable object
if (timeSource === amdaModel.AmdaTimeObject.inputTimeSrc[0]) {
this.object.set('timeTables',this.timeSelector.TTGrid.getStore().data.items);
}
}
// return the update status
return updateStatus;
},
/**
* load this.object into form
*/
loadObject : function()
{
// load object into form
this.formPanel.getForm().loadRecord(this.object);
// set object's TTs into the timeselector
this.addTTs(this.object.get('timeTables'));
},
/**
* save method called by Save button to launch the save process
*/
saveProcess : function(toRename)
{
// if the TimeTable object has been modified
if (this.object.dirty)
{
// Search module
var searchModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.search.id);//('search-win');
// if the name has been modified this is a creation
if (this.object.isModified('name'))
{
// if object already has an id : it's a 'rename' of an existing Condition
if (this.object.get('id'))
{
// the context Node is the parent node of current edited one
var contextNode = searchModule.linkedNode.parentNode;
// link a new node to the TimeTableModule
searchModule.createLinkedNode();
// set the contextNode
searchModule.linkedNode.set('contextNode',contextNode);
// create a new object linked
searchModule.createObject(this.object.getJsonValues());
var searchObj = searchModule.linkedNode.get('object');
// synchronisation of objects
this.object = searchObj;
if (toRename) searchModule.linkedNode.toRename = true;
}
searchModule.linkedNode.create();
} else {
searchModule.linkedNode.set('contextNode',searchModule.contextNode);
// this.object.fireEvent('modify');
searchModule.linkedNode.update();
}
}
},
/**
* overwrite metod called by Save button
*/
overwriteProcess : function(btn)
{
if (btn == 'cancel') return;
this.fieldName.clearInvalid();
this.saveProcess(true);
},
/**
* search method called by 'Do Search' button to launch the search process
*/
doSearch : function()
{
var searchModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.search.id);
searchModule.linkedNode.execute();
// fire execution
// this.object.fireEvent('execute',this.object.dirty);
},
/**
* Check if brackets are balanced
*/
isBalanced : function(str)
{
str = (""+str).replace(/[^()\[\]{}]/g, "");
var bracket = {
"]": "[",
"}": "{",
")": "("
},
openBrackets = [],
isClean = true,
i = 0,
len = str.length;
for(; isClean && i*',
name : 'name',
width: 375,
colspan: 3,
allowBlank : false,
stripCharsRe: /(^\s+|\s+$)/g,
validateOnChange: false,
validateOnBlur: false,
validFlag: false,
validator : function()
{
return this.validFlag;
}
});
this.constructionField = new extensions.SelectableTextArea(
{
labelAlign: 'top',
itemId: 'formSearchCondition',
fieldLabel:'Data Mining Condition*',
allowBlank : false, blankText : 'Condition expression is required',
name: 'expression',
validateOnChange: false,
validateOnBlur: false,
validator : this.isBalanced,
flex : 2.5,
listeners :
{
render : function(o,op)
{
var me = this;
var el = me.bodyEl;
var dropTarget = Ext.create('Ext.dd.DropTarget', el,
{
ddGroup: 'explorerTree',
notifyEnter : function(ddSource, e, data){ },
notifyOver : function(ddSource, e, data)
{
if (data.records[0].data.nodeType == 'localParam' && data.records[0].get('notyet')) {
this.valid = false;
return this.dropNotAllowed;
}
if (((data.records[0].data.nodeType == 'localParam') ||
(data.records[0].data.nodeType == 'remoteParam') ||
(data.records[0].data.nodeType == 'remoteSimuParam') ||
(data.records[0].data.nodeType == 'derivedParam') ||
(data.records[0].data.nodeType == 'myDataParam') ||
(data.records[0].data.nodeType == 'alias'))&&
//(data.records[0].data.leaf) &&
!data.records[0].data.disable)
{
this.valid = true;
return this.dropAllowed;
}
this.valid = false;
return this.dropNotAllowed;
},
notifyDrop : function(ddSource, e, data)
{
if (!this.valid) return false;
var nameToSent;
var components = null;
switch (data.records[0].get('nodeType'))
{
case 'localParam' :
case 'remoteParam' :
case 'remoteSimuParam' :
nameToSent = data.records[0].get('id');
if (data.records[0].get('alias')!= "" )
nameToSent = "#"+data.records[0].get('alias');
var component_info = data.records[0].get('component_info');
if (component_info && component_info.parentId)
{
if ( component_info.index1 && component_info.index2 )
{
nameToSent = component_info.parentId;
components = [];
if (component_info.index1)
components['index1'] = component_info.index1;
if (component_info.index2)
components['index2'] = component_info.index2;
}
if ( data.records[0].get('needsArgs') )
{
nameToSent = component_info.parentId;
if (component_info.index1)
{
components = [];
components['index1'] = component_info.index1;
}
}
}
break;
case 'alias' :
nameToSent = "#"+data.records[0].get('text');
break;
case 'derivedParam' :
nameToSent = "ws_"+data.records[0].get('text');
break;
case 'myDataParam' :
var name = data.records[0].get('text');
nameToSent = "wsd_"+name;
var size = data.records[0].get('size');
if (size && size > 1) {
nameToSent += "(0)";
myDesktopApp.warningMsg("parameter "+name+" is array of size: "+size+"
Please put index");
}
break;
default :
return false;
}
var searchModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.search.id);
if (searchModule)
searchModule.addParam(nameToSent, data.records[0].get('leaf'), data.records[0].get('needsArgs'), components);
return true;
}
});
}
}
});
this.formPanel = new Ext.form.Panel(
{
region : 'center',
bodyStyle: { background : '#dfe8f6' },
border: false, buttonAlign: 'left',
trackResetOnLoad: true, //reset to the last loaded record
layout : {
type : 'vbox',
align: 'stretch',
defaultMargins : { top:15, bottom:0, left: 15, right:15}
},
id: 'formSearch',
defaults: {
border: false
},
items : [
{
xtype: 'container',
flex: 2.5,
layout: {
type: 'hbox',
align: 'stretch'
},
items: [
{
flex: 3,
xtype: 'container',
border: false,
layout: {
type: 'table',
columns: 3
},
defaultType: 'textfield',
defaults: {
labelAlign: 'top'
},
items: [
this.fieldName,
{
xtype :'displayfield', width: 165,
hideLabel: true,
value: 'Averaging/Interpolation'
},
{ xtype: 'component', width: 45 },
{
xtype :'displayfield', width: 165,
hideLabel: true,
value: 'Data Gap'
},
{
xtype: 'numberfield', name: 'sampling',
fieldLabel: 'Sampling Time Step (sec)*', minValue : 0,
labelAlign: 'top', hideTrigger: true, width: 165
},
{ xtype: 'component', width: 45 },
{
xtype: 'numberfield', name: 'gap',
fieldLabel: 'if no data for interval', minValue : 1,
labelAlign: 'top', hideTrigger : true, width: 165
},
{
xtype: 'textfield',
name: 'description',
xtype: 'textarea', fieldLabel:'Description',
width: 375, height: 70,
colspan: 3
}
]
},
this.timeSelector
]
},
this.constructionField
],
fbar: [
{
text: 'Do Search',
scope : this,
handler: function(button){
// update object with user's values
// if the return is true (object had been updated)
if(this.updateObject()){
// launch the search process
this.doSearch();
}
}
},
{
text: 'Save Request',
scope: this,
handler: function()
{
// update object with user's values
// if the return is true (object had been updated)
if (this.updateObject())
{
var searchModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.search.id);
if (!searchModule)
return;
var me = this;
searchModule.linkedNode.isValidName(this.fieldName.getValue(), function (res) {
if (!res)
{
me.fieldName.validFlag = 'Error during object validation';
myDesktopApp.errorMsg(me.fieldName.validFlag);
me.fieldName.validate();
return;
}
if (!res.valid)
{
if (res.error)
{
if (res.error.search('subtree') != -1) {
Ext.MessageBox.show({title:'Warning',
msg: res.error+'
Do you want to overwrite it?',
width: 300,
buttons: Ext.MessageBox.OKCANCEL,
fn : me.overwriteProcess,
icon: Ext.MessageBox.WARNING,
scope : me
});
me.fieldName.validFlag = true;
}
else
me.fieldName.validFlag = res.error;
}
else
{
me.fieldName.validFlag = 'Invalid object name';
myDesktopApp.errorMsg(me.fieldName.validFlag);
}
me.fieldName.validate();
return;
}
me.fieldName.validFlag = true;
me.fieldName.validate();
me.saveProcess(false);
});
}
}
},
{
text: 'Reset',
scope : this,
handler: function()
{
var searchModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.search.id);
searchModule.createLinkedNode();
searchModule.createObject();
this.setObject(searchModule.getLinkedNode().get('object'));
}
}
]
});
var myConf = {
layout: 'border',
defaults: { layout: 'fit', border: false },
items:
[
this.formPanel,
{
xtype: 'panel', region: 'south',
title: 'Information',
collapsible: true,
height: 100,
autoHide: false,
iconCls: 'icon-information',
bodyStyle: 'padding:5px',
loader:
{
autoLoad: true,
url: helpDir+'dataMiningHOWTO'
}
}
],
plugins: [
{ptype: 'calculator', myBtns:[], context: 'Condition'},
{ptype: 'paramArgumentsPlugin', pluginId: 'search-param-components-plugin'}
]
};
Ext.apply (this , Ext.apply (arguments, myConf));
}
});