Skip to content

Instantly share code, notes, and snippets.

@otakustay
Created July 30, 2014 05:58
Show Gist options
  • Save otakustay/543fc4424937098f51f1 to your computer and use it in GitHub Desktop.
Save otakustay/543fc4424937098f51f1 to your computer and use it in GitHub Desktop.
for jscs test
/**
* ADM 2.0
* Copyright 2014 Baidu Inc. All rights reserved.
*
* @ignore
* @file 地域地图控件
* @author lixiang(lixiang05@baidu.com)
*/
define(
function (require) {
var lib = require('esui/lib');
var u = require('underscore');
var Control = require('esui/Control');
var echarts = require('echarts');
require('echarts/chart/map');
require('echarts/chart/pie');
var regionMap = [
{
regionName: '北京',
regionId: '1'
},
{
regionName: '天津',
regionId: '3'
},
{
regionName: '上海',
regionId: '2'
},
{
regionName: '重庆',
regionId: '4'
},
{
regionName: '河北',
regionId: '15'
},
{
regionName: '河南',
regionId: '16'
},
{
regionName: '云南',
regionId: '33'
},
{
regionName: '辽宁',
regionId: '23'
},
{
regionName: '黑龙江',
regionId: '17'
},
{
regionName: '湖南',
regionId: '19'
},
{
regionName: '安徽',
regionId: '8'
},
{
regionName: '山东',
regionId: '27'
},
{
regionName: '新疆',
regionId: '32'
},
{
regionName: '江苏',
regionId: '21'
},
{
regionName: '浙江',
regionId: '34'
},
{
regionName: '江西',
regionId: '22'
},
{
regionName: '湖北',
regionId: '18'
},
{
regionName: '广西',
regionId: '12'
},
{
regionName: '甘肃',
regionId: '10'
},
{
regionName: '山西',
regionId: '28'
},
{
regionName: '内蒙古',
regionId: '24'
},
{
regionName: '陕西',
regionId: '29'
},
{
regionName: '吉林',
regionId: '20'
},
{
regionName: '福建',
regionId: '9'
},
{
regionName: '贵州',
regionId: '13'
},
{
regionName: '广东',
regionId: '11'
},
{
regionName: '青海',
regionId: '26'
},
{
regionName: '西藏',
regionId: '31'
},
{
regionName: '四川',
regionId: '30'
},
{
regionName: '宁夏',
regionId: '25'
},
{
regionName: '海南',
regionId: '14'
},
{
regionName: '台湾',
regionId: '7'
},
{
regionName: '香港',
regionId: '6'
},
{
regionName: '澳门',
regionId: '5'
},
{
regionName: '其他地域',
regionId: '9999'
}
];
/**
* 控件类
*
* @constructor
* @param {Object} options 初始化参数
*/
function RegionChart(options) {
Control.apply(this, arguments);
}
lib.inherits(RegionChart, Control);
RegionChart.prototype.type = 'RegionChart';
/**
* 显示加载提示
*
* @param {BaseChart} chart 类实例
*/
function showLoading(chart) {
var mask = chart.helper.getPart('loading-mask');
chart.helper.addPartClasses('loading-mask-show', mask);
}
/**
* 隐藏加载提示
*
* @param {BaseChart} chart 类实例
*/
function hideLoading(chart) {
var mask = chart.helper.getPart('loading-mask');
chart.helper.removePartClasses('loading-mask-show', mask);
}
/**
* 绘制图表
*
* @param {BaseChart} control 类实例
*/
function draw(control) {
if (!control.chartOptions.series) {
return;
}
showLoading(control);
// 画图表
var chart = control.chart;
chart.setOption(control.chartOptions, true);
hideLoading(control);
}
RegionChart.prototype.initOptions = function (options) {
var mapSeries = {
name: '',
type: 'map',
mapType: 'china',
mapLocation: {
x: 'left'
},
selectedMode: 'multiple',
itemStyle: {
normal: {
label: { show: true }
},
emphasis: {
label: { show: true }
}
},
data: []
};
var pieSeries = {
name: '',
type: 'pie',
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)'
},
radius: [50, 120],
data: []
};
var properties = {
tooltip: {
trigger: 'item'
},
animation: false,
series: [
mapSeries,
pieSeries
]
};
this.chartOptions = properties;
var controlProperties = {
loadingText: '正在努力渲染...',
mapName: '',
mapData: [],
pieName: '',
pieData: []
};
lib.extend(controlProperties, options);
this.setProperties(controlProperties);
};
RegionChart.prototype.initStructure = function () {
var tpl = [
'<div class="${className}">',
'<div id="${chartId}"',
' style="height: 400px"',
' class="${chartMain}"></div>',
'<div id="${loadingMaskId}" style="line-height:250px;"',
' class="${loadingMask}">${loadingText}</div>',
'</div>'
];
var chartId = this.helper.getId('main');
var loadingMaskId = this.helper.getId('loading-mask');
this.main.innerHTML = lib.format(
tpl.join('\n'),
{
className:
this.helper.getPartClasses('frame').join(' '),
chartMain:
this.helper.getPartClasses('region-main').join(''),
chartId: chartId,
loadingMaskId: loadingMaskId,
loadingMask:
this.helper.getPartClasses('loading-mask').join(''),
loadingText: this.loadingText
}
);
var chart = echarts.init(lib.g(chartId));
this.chart = chart;
// 绑定resize事件
this.helper.addDOMEvent(window, 'resize', function () {
var pieSeries = this.chartOptions.series[1];
var chartMain = lib.g(this.helper.getId('main'));
if (chartMain) {
var pieLeftPosition = getPieLeftPosition(chartMain.offsetWidth);
pieSeries.center = [pieLeftPosition, 200];
chart.setOption(this.chartOptions, true);
}
chart.resize();
});
};
var paint = require('esui/painters');
/**
* 重新渲染视图
* 仅当生命周期处于RENDER时,该方法才重新渲染
*
* @param {Array=} 变更过的属性的集合
* @override
*/
RegionChart.prototype.repaint = paint.createRepaint(
Control.prototype.repaint,
{
name: ['mapData', 'mapName', 'pieData', 'pieName'],
// pieName和mapName分别是mapData和pieData的提示名称,随着
// data变化而变化
paint: function (chart, mapData, mapName, pieData, pieName) {
if (!mapData || !pieData){
return;
}
// 更新地图控件数据
var mapSeries = chart.chartOptions.series[0];
var pieSeries = chart.chartOptions.series[1];
var isMapEqual = u.isEqual(mapSeries.data, mapData);
var isPieEqual = u.isEqual(pieSeries.data, pieData);
var isMapEmpty = mapData.length === 0;
var isPieEmpty = pieData.length === 0;
if (isMapEqual && isPieEqual
&& !isPieEmpty && !isMapEmpty) {
return;
}
if (u.isArray(pieData)) {
// 更新饼图数据
pieSeries.data = chart.formatPieData(pieData);
pieSeries.name = pieName;
}
if (u.isArray(mapData)) {
//更新地图数据
mapSeries.data = chart.formatMapData(mapData);
mapSeries.name = mapName;
}
var maxItem = u.max(mapData, function (item) {
return item.value;
});
var minItem = u.min(mapData, function (item) {
return item.value;
});
var max = maxItem.value;
var min = minItem.value;
var dataRange = {
orient: 'horizontal',
min: min,
max: max,
text: ['高', '低'],
splitNumber: 0
};
var chartMain = lib.g(chart.helper.getId('main'));
var pieLeftPosition = getPieLeftPosition(chartMain.offsetWidth);
pieSeries.center = [pieLeftPosition, 200];
chart.chartOptions.dataRange = dataRange;
chart.chartOptions.series = [mapSeries, pieSeries];
draw(chart);
}
}
);
// PIE左边距极限值。小于这个的话,就和地图重叠了。
var LEFT_EXTREME_POSITION = 640;
// 容器宽度界定值。容器比这个大的话,可以放得更宽松。
var WINDOW_WIDTH = 1200;
function getPieLeftPosition(mainWidth) {
var pieLeftPosition = mainWidth - (mainWidth > WINDOW_WIDTH ? 400 : 220);
if (pieLeftPosition < LEFT_EXTREME_POSITION) {
pieLeftPosition = LEFT_EXTREME_POSITION;
}
return pieLeftPosition;
}
RegionChart.prototype.formatMapData = function (mapData) {
var len = regionMap.length;
var mapLen = mapData.length;
var results = [];
for (var i = 0; i < len; i++) {
var regionInfo = regionMap[i];
var regionId = regionInfo.regionId;
for (var j = mapLen - 1; j >= 0; j--) {
if (mapData[j].regionId == regionId) {
results.push({
name: regionInfo.regionName,
value: mapData[j].value
});
}
}
}
return results;
};
RegionChart.prototype.formatPieData = function (pieData) {
var results = this.formatMapData(pieData);
return results;
};
RegionChart.prototype.dispose = function () {
if (this.helper.isInStage('DISPOSED')) {
return;
}
if (this.chart) {
this.chart.dispose();
this.chart = null;
}
Control.prototype.dispose.apply(this, arguments);
};
require('esui').register(RegionChart);
return RegionChart;
}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment