///////////////////////////////////////////////////////////////////////////
|
// Copyright © 2014 - 2018 Esri. All Rights Reserved.
|
//
|
// Licensed under the Apache License Version 2.0 (the "License");
|
// you may not use this file except in compliance with the License.
|
// You may obtain a copy of the License at
|
//
|
// http://www.apache.org/licenses/LICENSE-2.0
|
//
|
// Unless required by applicable law or agreed to in writing, software
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
// See the License for the specific language governing permissions and
|
// limitations under the License.
|
///////////////////////////////////////////////////////////////////////////
|
|
define([
|
'dojo/_base/declare',
|
'dijit/_WidgetBase',
|
'dojo/_base/lang',
|
'dojo/_base/html',
|
'dojo/Evented',
|
'libs/echarts/echarts',
|
'jimu/utils',
|
'./_chartUtils',
|
'./_Gauge',
|
'./_ChartOptionFactory',
|
'libs/echarts/light',
|
'libs/echarts/dark'
|
],
|
function(declare, _WidgetBase, lang, html, Evented, echarts,
|
jimuUtils, ChartUtils, Gauge, ChartOptionFactory) {
|
|
return declare([_WidgetBase, Evented], {
|
'baseClass': 'jimu-dijit-chart',
|
templateString: '<div></div>',
|
declaredClass: 'jimu.dijit.chart',
|
// constructor -> this.config, this.chartDom
|
|
//public methods:
|
//setConfig -> update the option of this.chart.
|
//updateConfig -> update this.config's value
|
//clear -> Removes all components and charts in this.chart.
|
//resize -> Resizes chart, which should be called manually when container size changes.
|
|
//config params:
|
// "type":"bar", //"column", "line", "pie", "radar", "funnel", "gauge"
|
// "title":"string",
|
// "legend":{show:true,textStyle:{}},
|
// "xAxis":{name:'',show:true,textStyle:{},nameTextStyle:{}},
|
// "yAxis":{name:'',show:true,nameTextStyle:{}},
|
// "dataLabel":{show:true,textStyle:{}},
|
// "confine":boolean,//Whether the tooltip is limited to canvas tag
|
// "theme":"",//A registered theme name, light or dark
|
// "toolbox": ["saveAsImage", "restore", "dataView", "magicType"],
|
// "color":[],//[#fff]
|
// "backgroundColor": "#fff",
|
// "scale": true, //if stack = true, force scale = false
|
// "dataZoom": ["slider"], //inside
|
// "events": [{
|
// "name": "", //"click"、"dblclick"、"mousedown"、"mousemove"、"mouseup"、"mouseover"、"mouseout"
|
// "callback": "function (params) {}"
|
// }],
|
// "labels": [],
|
// "series": [{}], //series:[{name,data:[number or serie obj}]
|
// /**pie*/
|
// "pieMode": "",//normal,rose
|
// "roseType":"",//radius, area
|
// "labelLine": "boolean",
|
// innerRadius:number,0-50
|
// /**bar line colmun*/
|
// "stack": 'normal','percent'
|
// /* line */
|
// area:true
|
// "axisPointer": true,
|
// /**funnel*/
|
// "funnelSort": "descending",
|
// /**funnel gauge*/
|
// "min": 0,
|
// //funnel gauge
|
// "max": 100,
|
// /**radar*/
|
// "radarShape": "circle", //["circle", "polygon"],
|
// "indicator": [{}], //{name,max} only for radar
|
// /**gauge*/
|
// shape:"curved" //horizontal,vertical,curved
|
// "gaugeOption": {
|
// "columnColor":"#000",
|
// "bgColor":"",
|
// "valueStyle":{
|
// textStyle:{
|
// color:"#fff",
|
// fontSize:20,
|
// fontWeight:'bold',
|
// fontStyle:'italic',
|
// fontFamily:'Avenir Next'
|
// },
|
// formatter:'function'
|
// },
|
// "labelColor":"#000",
|
// "targetValue:[]",
|
// "showDataRangeLabel":boolean,
|
// "showTargetValueLabel":boolean,
|
// },
|
// /**advance option*/
|
// "advanceOption": {},
|
// markLine:{
|
// data: [{
|
// "name": "",
|
// "label": {
|
// "show": "boolean",
|
// "position": "", //start, middle, end
|
// "color": "",
|
// "fontSize": 12
|
// },
|
// "lineStyle": {
|
// "color": "",
|
// "width": 12,
|
// "type": "solid", //dashed, dotted
|
// },
|
// "x/yAxis": 1,
|
// }]
|
//}
|
// markArea:[{
|
// "data": [{
|
// "name": "",
|
// "x/yAxis": 1,
|
// "label": {
|
// "show": "boolean",
|
// "position": "", //"top", "left","right","bottom",
|
// "inside","insideLeft","insideRight","insideTop",
|
// "insideBottom","insideTopLeft","insideBottomLeft",
|
// "insideTopRight","insideBottomRight",
|
// "color": "",
|
// "fontSize": 12
|
// },
|
// "itemStyle": {
|
// "color": "",
|
// "opacity": 1
|
// },
|
// }, {
|
// "x/yAxis": 1,
|
// }]
|
// }]
|
|
config: null,
|
|
postCreate: function() {
|
this.inherited(arguments);
|
this._initChart();
|
},
|
|
updateConfig: function(config) {
|
if (!config) {
|
return false;
|
}
|
this.config = config;
|
this._specialThemeByConfig(config);
|
var option = this._chartFactory(config);
|
this.chart.setOption(option, true);
|
|
this._settingByGrid(config, option);
|
|
return true;
|
},
|
|
_settingByGrid: function(config, option) {
|
if (config.type === 'gauge') {
|
return this._resetGaugePosition(config);
|
}
|
var position = this.chartUtils.getAxisZeroPosition();
|
config.layout = this.chartUtils.calcDefaultLayout(config);
|
if (this.chartUtils.isAxisChart(config)) {
|
option = this.chartUtils.settingGrid(option, config);
|
option = this.chartUtils.settingDataZoom(option, config, position);
|
}
|
option = this.chartUtils.settingChartLayout(option, config);
|
this.chart.setOption(option, false);
|
},
|
|
_resetGaugePosition: function(config) {
|
this._resetGaugeGrid(config);
|
this._resetGaugeGraphic(config);
|
},
|
|
setConfig: function(config) {
|
if (!config) {
|
return false;
|
}
|
|
this.config = config;
|
|
this._specialThemeByConfig(this.config);
|
this.clear();
|
var option = this._chartFactory(this.config);
|
this.chart.setOption(option, true);
|
|
this._setAixsGrid(config, option);
|
this._resetGaugePosition(config, option);
|
|
return true;
|
},
|
|
destroy: function() {
|
this._offEvents();
|
this.clear();
|
this.inherited(arguments);
|
},
|
|
_chartFactory: function(config) {
|
this.option = this.chartOptionFactory.produceOption(config);
|
return this.option;
|
},
|
|
bindEvents: function(config) {
|
if (!this.chart || !config.events || !config.events.length) {
|
return;
|
}
|
this._offEvents();
|
config.events.forEach(lang.hitch(this, function(event) {
|
this.chart.on(event.name, event.callback);
|
}));
|
|
},
|
|
_offEvents: function() {
|
if (this.config.events && this.config.events[0]) {
|
this.config.events.forEach(lang.hitch(this, function(event) {
|
this.chart.off(event.name);
|
}));
|
}
|
},
|
|
getDataURL: function() {
|
if (!this.chart) {
|
return;
|
}
|
return this.chart.getDataURL();
|
},
|
|
clear: function() {
|
if (!this.chart) {
|
return;
|
}
|
this.chart.clear();
|
},
|
|
resize: function(width, height) {
|
if (!this.chart) {
|
return;
|
}
|
|
html.setStyle(this.domNode, {
|
width: width || '100%',
|
height: height || '100%'
|
});
|
this.chart.resize();
|
//data zoom
|
this._resizeDataZoom();
|
this._resetGaugePosition(this.config);
|
},
|
|
_resizeDataZoom: function() {
|
var option = this.option;
|
var config = this.config;
|
if (!option || !config) {
|
return;
|
}
|
var position = this.chartUtils.getAxisZeroPosition();
|
option = this.chartUtils.settingDataZoom(option, config, position);
|
this.chart.setOption(option);
|
},
|
|
_setAixsGrid: function(config, option) {
|
if (this.chartUtils.isAxisChart(config)) {
|
option = this.chartUtils.settingGrid(option, config);
|
this.chart.setOption(option, false);
|
}
|
},
|
|
_resetGaugeGraphic: function(config) {
|
if (config.type === 'gauge') {
|
this.gauge.resetGraphic(config);
|
}
|
},
|
|
_resetGaugeGrid: function(config) {
|
if (config.type === 'gauge') {
|
this.gauge.resetGrid(config);
|
}
|
},
|
|
_specialChartTheme: function() {
|
if (!this.chart) {
|
return;
|
}
|
//_theme.axisPointer
|
this.chart._theme.tooltip.axisPointer = {
|
type: 'cross',
|
label: {
|
show: true,
|
precision: 2,
|
formatter: function(params) {
|
if (typeof params.value === 'number') {
|
var value = parseFloat(params.value).toFixed(2);
|
return this.chartUtils.tryLocaleNumber(value);
|
} else {
|
return params.value;
|
}
|
}.bind(this)
|
},
|
lineStyle: {
|
color: '#27727B',
|
type: 'dashed'
|
},
|
crossStyle: {
|
color: '#27727B'
|
},
|
shadowStyle: {
|
color: 'rgba(200,200,200,0.3)'
|
}
|
};
|
//value axis formatter
|
if (!this.chart._theme.valueAxis) {
|
this.chart._theme.valueAxis = {};
|
}
|
if (!this.chart._theme.valueAxis.axisLabel) {
|
this.chart._theme.valueAxis.axisLabel = {};
|
}
|
this.chart._theme.valueAxis.axisLabel.formatter = function(value) {
|
return jimuUtils.localizeNumber(value);
|
};
|
},
|
|
_specialThemeByConfig: function(config) {
|
this._initChartTheme();
|
//mixin color to _theme
|
if (config.color && config.color[0]) {
|
this.chart._theme.color = config.color;
|
}
|
// if (config.confine) {
|
this.chart._theme.tooltip.confine = true;
|
// }
|
|
var isPercent = config.stack === 'percent';
|
|
this.chart._theme.tooltip.formatter = function(params) {
|
return this.chartUtils.handleToolTip(params, null, false, isPercent);
|
}.bind(this);
|
},
|
|
_initChartTheme: function() {
|
if (!this.chart) {
|
return;
|
}
|
if (!this.chart._theme) {
|
this.chart._theme = {};
|
}
|
if (!this.chart._theme.tooltip) {
|
this.chart._theme.tooltip = {};
|
}
|
if (!this.chart._theme.valueAxis) {
|
this.chart._theme.valueAxis = {};
|
}
|
if (!this.chart._theme.valueAxis.axisLabel) {
|
this.chart._theme.valueAxis.axisLabel = {};
|
}
|
},
|
|
_initChart: function() {
|
var theme = this.config && this.config.theme;
|
theme = theme || 'light';
|
this.chart = echarts.init(this.domNode, theme);
|
|
this.chartUtils = new ChartUtils({
|
chart: this.chart
|
});
|
|
this.gauge = new Gauge({
|
chart: this.chart,
|
chartUtils: this.chartUtils
|
});
|
|
this.chartOptionFactory = new ChartOptionFactory({
|
chart: this.chart,
|
gauge: this.gauge,
|
chartUtils: this.chartUtils
|
});
|
this._specialChartTheme(this.config);
|
}
|
|
});
|
});
|