/**
* Project : AMDA-NG
* Name : MyDataUI.js
* @class : amdaUI.MyDataUI
* @extends Ext.container.Container
* @brief MyData Module UI definition (View)
* @author Elena
* @version $Id: MyDataUI.js 2895 2015-05-05 14:38:28Z elena $
*/
Ext.define('amdaUI.MyDataUI', {
extend: 'Ext.container.Container',
alias: 'widget.panelMyData',
requires: [
'amdaUI.TableDefPlugUI'
],
object : null,
fileObject : null,
module : null,
fields : [],
columns : [],
constructor: function(config) {
this.module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);
this.init(config);
this.callParent(arguments);
this.setObject(this.module.linkedNode.get('object'));
},
/*
* linked node should be MyDataParamNode
*/
resetLinkedNode: function()
{
this.linkedNode = null;
this.module.createLinkedNode();
this.module.createObject();
this.module.linkedNode.set('fileObject',this.fileObject);
},
getObjectCallback: function(result,remoteEvent)
{
var t = remoteEvent.getTransaction();
if (result && !result.error) {
//this.tmpNode.set('contextNode',mask!!! if exists
this.fileObject = Ext.create('amdaModel.FileObject', result);
var panelConfig = this.initPanel();
}
else {
// EXCEPTION : parameter not found !
myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '"
+this.tmpNode.get('text')+"' found!");
}
},
/*
* Update info in the form on another parameter selection (cdf, cef formats);
*/
updateInfo : function(res, e)
{
if (res.success){
// info panel
this.items.getAt(1).update(res.info.name+': '+res.info.type+' '+res.info.size+' '+res.info.n_records);
var form = this.items.getAt(0).getForm();
//keep old name and mask if they exist
if (this.object.get('format') == 'vot')
{
res.info.ytitle = res.info.name;
if ((res.info.id === this.object.get('realvar'))) {
if (this.object.get('realvar') != this.object.get('name')) {
res.info.name = this.object.get('name');
}
if (res.info.mask != this.object.get('mask')) {
res.info.mask = this.object.get('mask');
}
}
}
else
{
if ((res.info.name === this.object.get('realvar'))) {
if (this.object.get('realvar') != this.object.get('name')) {
res.info.name = this.object.get('name');
}
if (res.info.mask != this.object.get('mask')) {
res.info.mask = this.object.get('mask');
}
}
res.info.ytitle = res.info.name;
}
form.setValues(res.info);
}
else {
myDesktopApp.errorMsg("System Error
Error at AMDA Server");
}
},
/*
* Check if changes were made before closing window
* @return false
*/
fclose : function() {
return false;
},
/**
* set object into form
*/
setObject : function (object)
{
// edit in module from FileUpload Module and ExplorerModule (edit param)
if (this.module.linkedNode) {
if (this.module.linkedNode.get('fileObject')) {
this.fileObject = this.module.linkedNode.get('fileObject');
}
// edit in module from Explorer Module (edit file)
else if (this.module.linkedNode.get('object')) {
this.fileObject = this.module.linkedNode.get('object');
this.resetLinkedNode();
}
else {
myDesktopApp.errorMsg("System Error
No FileObject and Object");
}
}
else {
myDesktopApp.errorMsg("System Error
No Linked Node");
}
var form = this.down('form');
form.getForm().reset();
// remove and DESTROY right panel if it exists
if (form.items.length == 2)
form.remove(form.items.getAt(1),true);
// create right panel depending on file
var rightPanel = this.initPanel();
form.add(rightPanel);
this.object = this.module.linkedNode.get('object');
// load object into form
if (object.$className == 'amdaModel.FileObject' || !this.object.get('name')) {
form.getForm().loadRecord(this.fileObject);
if (this.fileObject.get('format') == 'txt')
this.disablePredefined(false);
else
this.disablePredefined(true);
}
else
form.getForm().loadRecord(this.object);
// if it is not newly created empty myParamData node
if (this.object.get('name')) {
// file panel work around
if (this.fileObject.get('format') == 'txt') {
form.getForm().findField('start').setValue(this.object.get('realvar'));
this.disablePredefined(false);
}
else if (this.object.get('format') == 'vot')
{
var radio = this.down('radiogroup');
radio.setValue({'votvar' : this.object.get('realvar')});
}
else { // cdf, cef, nc
// select parameter
var radio = this.down('radiogroup');
radio.suspendEvent('change');
radio.setValue({'cdfvar' : this.object.get('realvar')});
radio.resumeEvent('change');
// disable form fields defined in file
this.disablePredefined(true);
}
}
//Set table definition
if (object.get('tableDef'))
this.getPlugin('tabledef').setTableDefinition(object.get('tableDef'));
},
/*
* // disable form fields defined in file ( cdf, nc, cef )
*/
disablePredefined: function(disable)
{
var form = this.down('form');
form.getForm().findField('start').setDisabled(disable);
form.getForm().findField('size').setReadOnly(disable);
this.down('combobox').setReadOnly(disable);
},
/*
* highlight selected columns in case of param (ASCII) edit
*/
updateSelection: function()
{
var start = parseInt(this.object.get('realvar'));
var size = parseInt(this.object.get('size'));
if (start && size) {
var columns = this.down('gridpanel').columns;
for (var i = start; i < start+size; i++) {
var selected = Ext.select(columns[i].getCellSelector(i));
selected.addCls('meow');
columns[i].selected = true;
}
}
},
/*
* update this.object from form
*/
updateObject : function(nameField)
{
// get the basic form
var basicForm = this.down('form').getForm();
var updateStatus = true;
var fieldsWithoutName = basicForm.getFields().items;
Ext.Array.each(fieldsWithoutName, function(item, index,allItems){
if(item !== nameField) {
if (!item.isValid()) {
// set update isn't allowed
updateStatus = false;
}
}
}, this);
// if the update is allowed
if (updateStatus) {
// real object update
// updateobject with the content of form
var values = basicForm.getValues();
basicForm.updateRecord(this.object);
this.object.set('file',this.fileObject.get('fileName'));
this.object.set('format', this.fileObject.get('format'));
if (this.object.get('format') == 'cdf' || this.object.get('format') == 'cef' || this.object.get('format') == 'nc') this.object.set('realvar',values.cdfvar);
if (this.object.get('format') == 'vot') this.object.set('realvar',values.votvar);
if (this.object.get('format') == 'txt') this.object.set('realvar',values.start);
this.object.set('tableDef', this.getPlugin('tabledef').getTableDefinitionObject());
}
// return the update status
return updateStatus;
},
/**
* Check mask - length, existed....
* @return true/false
*/
validateMask : function(value)
{
// length
if (value.length < 6) return 'mask length is too small (< 6)';
// first *
if (value.indexOf('*') === 0) return '"*" could not be the first letter in mask';
// several *
if (value.indexOf('*') !== value.lastIndexOf('*')) return 'several "*" are not allowed in mask';
// less common
var paramModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);
var oldmask = paramModule.linkedNode.get('object').get('mask');
// no old mask
if (oldmask.length === 0) return true;
if (value.length > oldmask.length) return 'new mask is less common than old one';
return true;
},
/*
* save parameter
*/
saveProcess : function(toRename)
{
var values = this.down('form').getForm().getValues();
// Parameter Module
var paramModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);
// if the name has been modified this is a creation
if (this.object.isModified('name'))
{
var contextNode = paramModule.linkedNode.parentNode;
// if object already has an id : it's a 'rename' of an existing
if (this.object.get('id'))
{
// get file object of the first node linked this file
var fileObject = paramModule.linkedNode.get('fileObject');
paramModule.createLinkedNode();
// create a new object linked
var paramobj = Ext.create(paramModule.linkedNode.get('objectDataModel'), values);
paramobj.set('format', this.fileObject.get('format'));
if (paramobj.get('format') == 'cdf' || paramobj.get('format') == 'cef' ||
paramobj.get('format') == 'nc')
paramobj.set('realvar',values.cdfvar);
if (paramobj.get('format') == 'vot')
paramobj.set('realvar',values.votvar);
if (paramobj.get('format') == 'txt')
paramobj.set('realvar',values.start);
paramobj.set('file', this.fileObject.get('fileName'));
paramobj.set('tableDef', this.getPlugin('tabledef').getTableDefinitionObject());
paramModule.linkedNode.set('object',paramobj);
//synchronize objects
this.object = paramobj;
paramModule.linkedNode.set('fileObject',fileObject);
if (toRename)
paramModule.linkedNode.toRename = true;
}
paramModule.linkedNode.set('contextNode',contextNode);
paramModule.linkedNode.create();
paramModule.linkedNode.set('isParameter', true);
if (values.size == 1) {
paramModule.linkedNode.set('iconCls', 'icon-scalar');
paramModule.linkedNode.set('isSpectra', false);
}
else if (values.size == 3) {
paramModule.linkedNode.set('iconCls', 'icon-vector');
paramModule.linkedNode.set('isSpectra', false);
}
else {
if (values.plottype == 'Spectra') {
paramModule.linkedNode.set('isSpectra', true);
paramModule.linkedNode.set('iconCls', 'icon-spectra');
}
else {
paramModule.linkedNode.set('iconCls', 'icon-unknowntype');
paramModule.linkedNode.set('isSpectra', false);
}
}
} else {
paramModule.linkedNode.set('contextNode',paramModule.contextNode);
paramModule.linkedNode.update();
}
},
/*
* overwrite method called by Save button
*/
overwriteProcess : function(btn){
if (btn == 'cancel') return;
var basicForm = this.down('form').getForm();
basicForm.clearInvalid();
this.saveProcess(true);
},
updateForm : function() {
var basicForm = this.down('form').getForm();
var columns = this.down('gridpanel').columns;
var start;
var size = 0;
Ext.Array.each(columns, function(column,index){
if (!start && column.selected) start = index;
if (column.selected) size += 1;
});
basicForm.setValues({start: start, size : size});
},
checkMask : function(mask) {
if (mask.indexOf('*') < 0) {
if (mask.length < 6) {
myDesktopApp.warningMsg('Mask cannot be shorter than 6 letters');
return false;
}
if (this.fileObject.get('fileName').indexOf(mask) !== 0) {
myDesktopApp.warningMsg('No correspondance between '+mask+' and '+this.fileObject.get('fileName'));
return false;
}
}
if (mask.indexOf('*') == 0) {
myDesktopApp.warningMsg("Mask should not start with *");
return false;
}
if (mask.indexOf('*') != mask.lastIndexOf('*')) {
myDesktopApp.warningMsg("Mask can include only one *");
return false;
}
var maskParts = mask.split('*');
if (this.fileObject.get('fileName').indexOf(maskParts[0]) !== 0) {
myDesktopApp.warningMsg('No correspondance between '+mask+' and '+this.fileObject.get('fileName'));
return false;
}
if (maskParts.length == 2) {
if (this.fileObject.get('fileName').indexOf(maskParts[1]) < 0) {
myDesktopApp.warningMsg('No correspondance between ' +mask+' and '+this.fileObject.get('fileName'));
return false;
}
if ((maskParts[0].length + maskParts[1].length) < 6) {
myDesktopApp.warningMsg('Mask cannot be shorter than 6 letters');
return false;
}
}
return true;
},
/*
* Configurations
*
*/
initPanel : function()
{
var format = this.fileObject.get('format');
if (format == 'cdf' || format == 'cef' || format == 'nc') return this.cdfPanel(format);
if (format == 'txt') return this.txtPanel();
if (format == 'vot') return this.votPanel();
},
txtPanel: function()
{
var fileName = this.fileObject.get('fileName');
//FOR INFO
// Null out built in convert functions for performance *because the raw data is known to be valid*
// Specifying defaultValue as undefined will also save code.
// As long as there will always be values in the data, or the app tolerates undefined field values*
// Dynamically created fields and columns
var n_col = this.fileObject.get('vars');
// reset
this.fields = [];
this.columns = [];
for (var i = 0; i < n_col; i++)
{
var name = i === 0 ? 'Time' : 'n'+i;
//TODO width dependent on data?
var width = i === 0 ? 120 : 75;
this.fields[i] = { name: name };
this.columns[i] = { text: name, sortable : false, dataIndex: name, width : width,
menuDisabled: true, selected : false,
listeners:
{
scope : this,
headerclick: function(ct, column)
{
if (column.text != 'Time') {
var selected = Ext.select(column.getCellSelector(1));
if (column.selected) {
selected.removeCls('meow');
column.selected = false;
}
else {
selected.addCls('meow');
column.selected = true;
}
this.updateForm();
}
}
}
};
}
// Dynamically created model
Ext.define('myData', {
extend: 'Ext.data.Model',
fields: this.fields,
idProperty: 'Time'
});
var store = Ext.create('Ext.data.ArrayStore', {
model: 'myData',
autoLoad: true,
proxy: {
type: 'direct',
directFn: AmdaAction.getAsciiFile
},
listeners: {
scope: this,
beforeload: function(store){
store.proxy.extraParams = {
fileName: this.fileObject.get('fileName')
};
},
load: function(store, records, successful, eOpts) {
this.updateSelection();
}
}
});
// Dynamically created columns dependent of myData model
var panelConfig = {
xtype : 'gridpanel',
store : store,
title : fileName,
height: '100%',
flex : 2,
columnLines: true,
columns: this.columns,
listeners:
{
scope : this,
cellclick: function(view,td,cellIndex,record,tr,rowIndex,e)
{
var column = view.getGridColumns()[cellIndex];
if (cellIndex > 0) {
var selected = Ext.select(column.getCellSelector(cellIndex));
if (column.selected) {
selected.removeCls('meow');
column.selected = false;
}
else {
selected.addCls('meow');
column.selected = true;
}
this.updateForm();
}
},
select: function(selmodel, record, index, e) {
selmodel.deselectAll();
}
}
};
return panelConfig;
},
cdfPanel : function(format)
{
var vars = this.fileObject.get('vars');
var fileName = this.fileObject.get('fileName');
var items = [];
Ext.Array.each(vars, function(name, index) {
if (name) {
items[index] = { boxLabel: name, name: 'cdfvar', inputValue: name }
}
}, this);
var panelConfig = {
xtype : 'fieldset',
bodyStyle: { background : '#dfe8f6'},
flex : 2,
autoScroll : true,
height : '100%',
title: fileName,
items : [{
xtype: 'radiogroup',
cls: 'x-check-group-alt',
columns: 2,
vertical: true,
items: items,
listeners : {
scope: this,
change: function (cb, nv, ov) {
if (nv.cdfvar) {
AmdaAction.getMyParamInfo({format: format, file : fileName, varName : nv.cdfvar},
this.updateInfo, this);
}
}
}
}]
};
return panelConfig;
},
votPanel : function()
{
var vars = this.fileObject.get('vars');
var fileName = this.fileObject.get('fileName');
var items = [];
if (this.fileObject.get('foundTime'))
{
Ext.Array.each(vars, function(obj, index) {
items[index] = { boxLabel: obj.name, name: 'votvar', inputValue: obj.id,
listeners:
{
scope: this,
change: function (cb, nv, ov) {
if (nv) {
AmdaAction.getMyParamInfo({format: 'vot', file : fileName, varName : cb.inputValue},
this.updateInfo, this);
}
}
}
};
}, this);
}
else
myDesktopApp.errorMsg("Cannot find a valid time field!");
var panelConfig = {
xtype : 'fieldset',
bodyStyle: { background : '#dfe8f6'},
flex : 2,
autoScroll : true,
height : '100%',
title: fileName,
items : [{
xtype: 'radiogroup',
cls: 'x-check-group-alt',
columns: 2,
vertical: true,
items: items
}]
};
return panelConfig;
},
init : function(config) {
var store = Ext.create('Ext.data.Store', {
fields: ['value', 'name'],
data : [
{"value": "FLOAT", "name":"FLOAT"},
{"value": "INTEGER", "name":"INTEGER"},
{"value": "DOUBLE", "name":"DOUBLE"},
{"value": "SHORT", "name":"SHORT"}
]
});
var combo = {
xtype: 'combo',
fieldLabel: 'Parameter Data Type',
store: store,
queryMode: 'local',
displayField: 'name',
valueField: 'value',
name: 'type',
editable: false,
value: 'FLOAT'
};
var store1 = Ext.create('Ext.data.Store', {
fields: ['value', 'name'],
data : [
{"value": "TimeSerie", "name":"Time Serie"},
{"value": "Spectra", "name":"Spectra"}
]
});
var comboPlotType = {
xtype: 'combo',
fieldLabel: 'Display Type',
store: store1,
queryMode: 'local',
displayField: 'name',
valueField: 'value',
name: 'plottype',
editable: false,
value: 'Time Series'
};
// Parameter Form
var panelLeft = {
bodyStyle: { background : '#dfe8f6'},
flex : 1,
defaults: {
xtype:'textfield',
validateOnChange: false,
validateOnBlur: false,
padding : '0 10 0 5',
inputWidth : 80
},
items: [
{
id: 'mydataName',
fieldLabel: 'Parameter Name',
labelAlign: 'top',
name: 'name',
allowBlank : false,
stripCharsRe: /(^\s+|\s+$)/g,
validFlag: false,
validator : function() {
return this.validFlag;
},
inputWidth : 180
},
{
fieldLabel: 'File Name/Mask ',
{
scope : this,
text: 'Save',
handler: function()
{
var form = this.down('form').getForm();
// check if variable was selected
// cdf,...
var radio = this.down('radiogroup');
if (radio && radio.getChecked().length == 0) {
myDesktopApp.warningMsg('Select variable from the file, please');
return;
}
// ascii
if (!radio && this.columns.length > 0) {
if (!form.findField('start').getValue() || !form.findField('size').getValue()) {
myDesktopApp.warningMsg('Select column[s] from the file, please');
return;
}
}
var maskName = form.findField('mask').getValue();
if (maskName !== this.fileObject.get('fileName')) {
if (!this.checkMask(maskName)) {
form.findField('mask').setValue(this.fileObject.get('fileName'));
return;
}
}
var nameField = form.findField('mydataName');
if (this.updateObject(nameField))
{
var myDataModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);
if (!myDataModule)
return;
var me = this;
myDataModule.linkedNode.isValidName(nameField.getValue(), function (res) {
if (!res) {
nameField.validFlag = 'Error during object validation';
myDesktopApp.errorMsg(nameField.validFlag);
nameField.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
});
nameField.validFlag = true;
}
else
nameField.validFlag = res.error;
}
else
{
nameField.validFlag = 'Invalid object name';
myDesktopApp.errorMsg(nameField.validFlag);
}
nameField.validate();
return;
}
nameField.validFlag = true;
nameField.validate();
me.saveProcess();
});
}
}
},
{
scope : this,
text: 'Reset',
handler: function(){
this.down('form').getForm().reset();
}
}]
},
{
xtype: 'panel',
region: 'south',
title: 'Information',
collapsible: true,
height: 100,
autoHide: false,
iconCls: 'icon-information',
bodyStyle: 'padding:5px',
loader: {
autoLoad: true,
url: helpDir+'myDataHOWTO'
}
}],
plugins: [ {ptype: 'tabledef', pluginId: 'tabledef'} ]
};
Ext.apply (this, Ext.apply(arguments, myConf));
},
getParameterSize : function()
{
var form = this.down('form').getForm();
return form.findField('size').getValue();
}
});