/** * Project AMDA-NG * Name CatalogVisuScatter.js * @class amdaUI.CatalogVisuScatter * @extends Ext.container.Container * @brief Scatter Visualization Module UI definition (View) * @author elena */ Ext.define('amdaUI.CatalogVisuScatter', { extend: 'Ext.form.Panel', alias: 'widget.panelCatalogVisuScatter', requires: [ 'amdaPlotObj.PlotObjectConfig', 'amdaPlotComp.PlotColorPicker' ], availableSymbolsTypes: [ { 'key': 'circle', 'value': 'Dot' }, { 'key': 'cross-open', 'value': 'Plus' }, { 'key': 'circle-open', 'value': 'Circle' }, { 'key': 'x-open', 'value': 'Crux' }, { 'key': 'square-open', 'value': 'Square' }, { 'key': 'triangle-up-open', 'value': 'Triangle Up' }, { 'key': 'triangle-down-open', 'value': 'Triangle Down' }, { 'key': 'triangle-left-open', 'value': 'Triangle Left' }, { 'key': 'triangle-right-open', 'value': 'Triangle Right' }, { 'key': 'circle-cross-open', 'value': 'Crux in circle' }, { 'key': 'circle-open-dot', 'value': 'Dot in circle' }, { 'key': 'diamond', 'value': 'Diamond' }, { 'key': 'star-open', 'value': 'Star' }, { 'key': 'hexagram-open', 'value': 'Hexagram' }, { 'key': 'square', 'value': 'Full square' }, { 'key': 'star', 'value': 'Full star' } ], constructor: function(config) { this.init(config); this.callParent(arguments); }, getChartConfig: function(catalogStore, isColorBar=true) { var plotTypeField = Ext.getCmp('visu-scatter-type'); var plotType = plotTypeField.getValue(); var plotColorField = Ext.getCmp('visu-scatter-color'); var plotColor=plotColorField.ownerCt.colorDisplayer.value; var plotSizeField = Ext.getCmp('visu-scatter-size'); var plotSize = plotSizeField.getValue(); var plotSymbolField = Ext.getCmp('visu-scatter-symbol'); var plotSymbol = plotSymbolField.getValue(); //plotColor = plotColorField.getValue(); var xAxisOpt = this.getAxisOptions('X'); var yAxisOpt = this.getAxisOptions('Y'); var zAxisOpt = this.getAxisOptions('Z'); if ((!xAxisOpt.paramId) || (xAxisOpt.paramId == '')) { //myDesktopApp.errorMsg('Missing parameter selection for X axis'); return null; } if ((!yAxisOpt.paramId) || (yAxisOpt.paramId == '')) { //myDesktopApp.errorMsg('Missing parameter selection for Y axis'); return null; } if ((!zAxisOpt.paramId) || (zAxisOpt.paramId == '')) { //myDesktopApp.errorMsg('Missing parameter selection for Y axis'); isColorBar= false; } var x=[]; var y=[]; var z=[]; var text=[]; catalogStore.each(function(item){ x.push(item.get(xAxisOpt.paramId)); y.push(item.get(yAxisOpt.paramId)); if (isColorBar){ if (zAxisOpt.logscale && zAxisOpt.range ){ if (Math.log10(item.get(zAxisOpt.paramId)) >= zAxisOpt.range.min && Math.log10(item.get(zAxisOpt.paramId)) <= zAxisOpt.range.max){ z.push(Math.log10(item.get(zAxisOpt.paramId))); } else { z.push(NaN); } } else if(zAxisOpt.logscale && !zAxisOpt.range){ z.push(Math.log10(item.get(zAxisOpt.paramId))); } else if( !zAxisOpt.logscale && zAxisOpt.range){ if (item.get(zAxisOpt.paramId) >= zAxisOpt.range.min && item.get(zAxisOpt.paramId) <= zAxisOpt.range.max){ z.push(item.get(zAxisOpt.paramId)); } else { z.push(NaN); } } else{ z.push(item.get(zAxisOpt.paramId)); } } text.push(''+item.get('start').toISOString()+'
'+item.get('stop').toISOString()); }); var data =[{ x: x, y: y, mode: (plotType=='point+line') ? 'lines+markers' : 'markers', hovertemplate: (isColorBar) ? '(%{x},%{y},%{marker.color})
%{text}': null, text: text, marker:{ color: (isColorBar) ? z : plotColor, colorbar:(isColorBar) ? { len:0.7, title: (zAxisOpt.logscale) ? 'log'+'10'.sub()+'('+zAxisOpt.title+')' : zAxisOpt.title, titleside:'right', titlefont:{size:10}, } : null, colorscale: (isColorBar) ?'Jet':null, showscale:isColorBar, symbol: plotSymbol, size : plotSize, }, type: 'scatter'}]; var layout = { margin: {l: 50,r: 40, b: 40,t: 40,pad: 5}, xaxis: { title: xAxisOpt.title, range: !xAxisOpt.range ? null : [xAxisOpt.range.min,xAxisOpt.range.max], type: xAxisOpt.logscale ? 'log' : null }, yaxis: { title: yAxisOpt.title, range: !yAxisOpt.range ? null : [yAxisOpt.range.min,yAxisOpt.range.max], type: yAxisOpt.logscale ? 'log' : null }, hovermode: "closest", hoverlabel :{ font:{size:10}} }; var result = {data:data,layout:layout} return result; }, getAxisOptions: function(axisName) { var opt = { paramId: '', title: axisName+' axis' }; var axisParamField = Ext.getCmp('visu-scatter-' + axisName + '-param'); var paramFieldId = axisParamField.getValue(); if (paramFieldId && (paramFieldId != "")) { var paramField = axisParamField.getStore().getById(axisParamField.getValue()); if (paramField) { opt.paramId = paramField.get('id'); opt.title = paramField.get('name'); } } var axisTitleField = Ext.getCmp('visu-scatter-'+axisName+'-title'); var axisTitle = axisTitleField.getValue(); if (axisTitle && (axisTitle != "")) { opt.title = axisTitle; } var axisScalingField = Ext.getCmp('visu-scatter-'+axisName+'-scaling'); if (axisScalingField){ var axisScaling = axisScalingField.getValue(); } if (axisScaling == 'manual') { var axisRangeMinField = Ext.getCmp('visu-scatter-' + axisName + '-range-min'); var axisRangeMin = axisRangeMinField.getValue(); var axisRangeMaxField = Ext.getCmp('visu-scatter-' + axisName + '-range-max'); var axisRangeMax = axisRangeMaxField.getValue(); opt.range = { 'min' : axisRangeMin, 'max' : axisRangeMax }; } if (Ext.getCmp('visu-scatter-' + axisName + '-logbox')){ opt.logscale = Ext.getCmp('visu-scatter-' + axisName + '-logbox').getValue(); } return opt; }, getAxisConfig: function(axisIndex, axisName, parametersStore, isColorbar = false) { var paramComboConfig = { xtype: 'combo', emptyText: 'select parameter', editable: false, store: parametersStore, queryMode: 'local', displayField: 'name', valueField: 'id', axisIndex: axisIndex, id: 'visu-scatter-' + axisName + '-param', listeners:{ change:function(){ var isNotColorBar = Ext.getCmp('Zaxis-fieldset'); this.visuUI.plotChart(!isNotColorBar.collapsed); }, scope: this } }; var comboRangeConfig = { xtype : 'combo', name:'scaling', valueField: 'scaling', queryMode:'local', store:['auto','manual'], forceSelection:true, value: 'auto', width: 80, id: 'visu-scatter-' + axisName + '-scaling', listeners : { scope : this, change : function(combo, newValue, oldValue) { var minValue = combo.next().next(); var maxValue = minValue.next().next(); var disabled = newValue == "auto"; minValue.reset(); maxValue.reset(); minValue.setDisabled(disabled); maxValue.setDisabled(disabled); } } }; var logbox={ xtype: 'fieldcontainer', fieldLabel: 'Log Scale', defaultType: 'checkboxfield', items: [ { name : 'logscale', inputValue: false, id : 'visu-scatter-' + axisName + '-logbox', listeners:{ change:function(){ var isNotColorBar = Ext.getCmp('Zaxis-fieldset'); this.visuUI.plotChart(!isNotColorBar.collapsed); }, scope: this } } ], }; var axisRangeConfig = { xtype : 'fieldcontainer', layout: 'hbox', items: [ { xtype:'fieldset', title: axisName + ' Range', border: false, layout: 'hbox', items: [ comboRangeConfig, { xtype: 'splitter' }, { xtype: 'numberfield', hideTrigger: true, width: 50, disabled: true, id: 'visu-scatter-' + axisName + '-range-min', listeners:{ change:function(){ var isNotColorBar = Ext.getCmp('Zaxis-fieldset'); this.visuUI.plotChart(!isNotColorBar.collapsed); }, scope: this } }, { xtype: 'splitter' }, { xtype: 'numberfield', hideTrigger: true, width: 50, disabled: true, id: 'visu-scatter-' + axisName + '-range-max', listeners:{ change:function(){ var isNotColorBar = Ext.getCmp('Zaxis-fieldset'); this.visuUI.plotChart(!isNotColorBar.collapsed); }, scope: this } }, ] }, ] }; return { xtype : 'fieldset', id:axisName + 'axis-fieldset', collapsed:isColorbar, collapsible:true, checkboxToggle:isColorbar, checkboxName:axisName + ' axis-checkbox', title : axisName + ' axis', items : [ paramComboConfig, axisRangeConfig, logbox, { xtype: 'textfield', fieldLabel: axisName + ' title', id: 'visu-scatter-' + axisName + '-title', listeners:{ change:function(){ var isNotColorBar = Ext.getCmp('Zaxis-fieldset'); this.visuUI.plotChart(!isNotColorBar.collapsed); }, scope: this }, } ], listeners: (isColorbar) ? { collapse:function(){ this.visuUI.plotChart(false); var colorPicker = Ext.getCmp('visu-scatter-color-fieldset'); colorPicker.show(true) }, expand : function(combo, newValue, oldValue){ this.visuUI.plotChart(); var colorPicker = Ext.getCmp('visu-scatter-color-fieldset'); colorPicker.hide(true) }, scope: this }: null, }; }, getPlottingOptionConfig: function() { var plotTypeComboConfig = { xtype: 'combo', fieldLabel:'Type', margin:'2 2 2 2', emptyText: 'select plot type', editable: false, store: ['point', 'point+line'], queryMode: 'local', valueField: 'type', value: 'point', id: 'visu-scatter-type', listeners : { scope : this, change : function(combo, newValue, oldValue) { //this.chartConfig.series[0].type = newValue; var isNotColorBar = Ext.getCmp('Zaxis-fieldset'); this.visuUI.plotChart(!isNotColorBar.collapsed); } },scope: this }; var colorPicker = this.addColorsPicker('visu-scatter-color', 'Color', amdaPlotObj.PlotObjectConfig.availableColorsNew, 'standard'); var plotThemeComboConfig = {xtype:'fieldset', id:'visu-scatter-color-fieldset', margin:'5 0 0 0', padding:0, border:false, items:[colorPicker], }; colorPicker.add({id:'visu-scatter-color'}); var comboStore = Ext.create('Ext.data.Store', { fields: [amdaPlotObj.PlotObjectConfig.fieldComboBox.key, amdaPlotObj.PlotObjectConfig.fieldComboBox.value], data: this.availableSymbolsTypes }); var plotSymbolConfig = { xtype: 'combo', store: comboStore, fieldLabel:'Symbol', editable:false, margin:'2 2 2 2', queryMode: 'local', displayField: 'value', valueField: 'key', value:'circle', id: 'visu-scatter-symbol', listeners: { scope : this, change : function(combo, newValue, oldValue) { //this.chartConfig.theme = newValue; var isNotColorBar = Ext.getCmp('Zaxis-fieldset'); this.visuUI.plotChart(!isNotColorBar.collapsed); } } }; var plotSizeNumber= { xtype: 'numberfield', layout:'hbox', hidden: true, width: 50, disabled: true, value: 5, id: 'visu-scatter-size' }; var plotSizeConfig = { xtype: 'slider', fieldLabel: 'Size', layout:'hbox', margin:'2 2 2 2', width: 80, value: 5, increment: 1, minValue: 1, maxValue: 20, id: 'visu-scatter-size2', listeners: { change: function ( slider, newValue, thumb, eOpts ) { var binValueField = Ext.getCmp('visu-scatter-size'); binValueField.setValue(newValue); }, changecomplete: function(){ var isNotColorBar = Ext.getCmp('Zaxis-fieldset'); this.visuUI.plotChart(!isNotColorBar.collapsed); }, scope: this } }; return { xtype : 'fieldset', collapsed:true, collapsible:true, layout:'fit', title : 'Plotting Options', items : [ plotTypeComboConfig, plotSymbolConfig, plotSizeConfig, plotSizeNumber, plotThemeComboConfig, ] }; }, addColorsPicker: function (name, label, availableColors, mode) { if (!mode) { mode = 'standard'; } var me =this; return new amdaPlotComp.PlotColorPicker({name: name, label: label, mode: mode, colors: availableColors, onChange: function(name, newValue, oldValue) { var isNotColorBar = Ext.getCmp('Zaxis-fieldset'); me.visuUI.plotChart(!isNotColorBar.collapsed); }}); }, init : function (config) { var myConf = { autoScroll:true, items: [ this.getAxisConfig(0,'X', config.parametersStore), this.getAxisConfig(0,'Y', config.parametersStore), this.getAxisConfig(0,'Z', config.parametersStore,true), this.getPlottingOptionConfig() ], }; Ext.apply (this, Ext.apply(arguments, myConf)); } });