【Designer脚本模板】
Code Block | ||
---|---|---|
| ||
//请勿修改此处命名参数
vsPluginComponentModule.factory('$vcPlugin_demo_demoEcharts', ['$vsPluginRegister', '$timeout', function ($vsPluginRegister, $timeout) {
//echarts的图形的默认option
var optionTemplate = {
title: {
show: false
},
legend: {
show: false,
orient : 'horizontal',
x : 'right',
y : 'top',
data:[],
textStyle: {
color: "#999",
fontSize: 12
}
},
grid: {
x: 42,
y: 34,
x2: 11,
y2: 25,
borderWidth: 0,
borderColor: "#f0f0f0"
},
tooltip : {
show:true,
confine: true,
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
position: function (pos, params, dom, rect, size) {
var obj = {top: 0};
obj['left'] = pos[0] < size.viewSize[0] / 2 ? pos[1] : pos[1]-size.contentSize[0];
return obj;
}
},
calculable : false,
confine: true,
animationDuration: 500,
xAxis : [{
type : 'category',
boundaryGap: true,
axisLine: {
lineStyle: {
color: '#DDD',
width: 1,
shadowBlur: 0,
shadowOffsetX: 0,
shadowOffsetY: 0
},
show: true
},
splitArea: {
show: false
},
splitLine: {
lineStyle: {
color: '#F6F6F6'
}
},
axisTick: {
show: false
},
axisLabel: {
textStyle:{
color: '#666',
fontSize: 12
}
},
data : ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
}],
yAxis : [{
name: "销售额",
type : 'value',
axisLine: {
lineStyle: {
color: '#B0B0B0',
width: 1,
shadowBlur: 0,
shadowOffsetX: 0,
shadowOffsetY: 0
},
show: true
},
splitArea: {
show: false
},
splitLine: {
lineStyle: {
color: '#F6F6F6'
}
},
axisTick: {
show: false
},
axisLabel: {
textStyle:{
color: '#666',
fontSize: 12
}
}
}],
series: [{
name: "销售额",
itemStyle: {
normal: {
color: "#006BB7",
lineStyle : {
color: "#006BB7"
}
}
},
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'bar'
}]
};
var factory = {
//配置面板中显示[数据]配置
showDataCategory: true,
//配置面板中显示[边框]配置
showBorderCategory: true,
//配置面板中显示[基本]配置
showBasicCategory: true,
//配置面板中显示[浮动]配置
showFixedCategory: true,
//配置面板中显示[事件]配置
showEventCategory: true,
//配置面板中显示[标题]配置
showTitleCategory: true,
//配置面板中显示[预警]配置
showThresholdCategory: true,
/* 控件的初始化 */
init: function(scope, element, component, $compile){
scope.element = element;
scope.component = component;
//关闭页面过滤
component.config.pageFilter = false;
//控件的图形维度数量
scope.component.config.chartDimensionCount = 1;
//控件至少需要1个维度
scope.component.config.minDimensionCount = 1;
//控件至少需要1个度量
scope.component.config.minMeasureCount = 1;
//检查控件高度
if(element.height() == 0){
$timeout(function(){
factory.init(scope, element, component, $compile, $sce, $timeout);
},100);
}else{
factory.initChart(scope, element, component, $compile);
}
},
initChart: function(scope, element, component, $compile){
var myChart = echarts.init(element[0]);
var option = component.config.chartConfig;
if(option == null){
//初始化echarts的option默认值
option = optionTemplate;
option.noDataLoadingOption = {};
//将option保存到chartConfig对象中
component.config.chartConfig = option;
component.config.legendOrient = "horizontal";
}
option.tooltip.position = function (pos, params, dom, rect, size) {
var obj = {top: 0};
obj['left'] = pos[0] < size.viewSize[0] / 2 ? pos[0] : pos[0]-size.contentSize[0];
return obj;
};
//调用echarts的setOption方法
try{
myChart.setOption(option);
}catch(e){
}
//将chart对象放到context中
component.context.chart = myChart;
//当控件尺寸改变时,改变echarts的尺寸
component.context.resize = function(){
$timeout(function(){
if(component.context.chart.resize){
component.context.chart.resize();
}
}, 100);
}
},
/*
* 构建数据描述,此方法中对控件的数据进行处理
*/
buildDataDescription: function(dataDescription, scope, element, component, $compile){
//接收控件刷新数据的事件
scope.$on(event_refreshComponentData, function(target, param){
scope.queryComponentData(param, {
onSuccess: function(){
refreshChartView(scope, element, component, $compile);
}
});
});
//接收维度联动事件
scope.$on(event_chartDimensionValueChange, function(s, event){
var dataIndex = -1;
var axisLabels = component.config.chartConfig.xAxis[0].data;
for(var i = 0; i < axisLabels.length; i++){
if(""+axisLabels[i] === ""+event.source.value){
dataIndex = i;
break;
}
}
if(dataIndex < 0){
component.context.chart.dispatchAction({
type: 'hideTip'
});
return;
}
if(dataIndex > -1){
component.context.chart.dispatchAction({
type: 'showTip',
dataIndex:dataIndex,
seriesIndex: 0
});
}
});
},
/*
* 构建图形描述,此方法中定义控件的配置面板
*/
buildChartDescription: function(scope, element, component, $compile){
//构建[图形]配置面板
buildChartDescription(scope, element, component, $compile);
//构建[轴线]配置面板
buildAxisDescription(scope, element, component, $compile);
//构建[度量]配置面板
buildMeasureDescription(scope, element, component, $compile);
}
};
//构建[轴线]配置面板
var buildAxisDescription = function(scope, element, component, $compile){
var category = {
name: "axis",
title: "轴线",
groups: []
};
component.description.categories.push(category);
}
//构建[度量]配置面板
var buildMeasureDescription = function(scope, element, component, $compile){
var category = {
name: "measures",
title: "度量",
groups: []
};
component.description.categories.push(category);
}
//构建[图形]配置面板
var buildChartDescription = function(scope, element, component, $compile){
var category = {
name: "chart",
title: "图形",
groups: []
};
component.description.categories.push(category);
//图例
category.groups.push({
title: {
text: "图例"
},
elements: [{
title: "显示",
type: "radio",
bind: "showLegend",
items: [{
name: "开启",
value: "show"
},{
name: "关闭",
value: "hide"
}]
}, {
title: "方向",
type: "radio-icon",
bind: "legendOrient",
items: [{
name: "垂直",
value: "vertical",
icon: "fa fa-ellipsis-v"
},{
name: "水平",
value: "horizontal",
icon: "fa fa-ellipsis-h"
}]
}, {
title: "垂直位置",
type: "radio-icon",
bind: "legendPosY",
items: [{
name: "顶部",
value: "top",
icon: "fa fa-minus",
pStyle: "padding-top:0;padding-bottom:12px;"
},{
name: "居中",
value: "center",
icon: "fa fa-minus",
pStyle: "padding-top:6px;padding-bottom:6px;"
},{
name: "底部",
value: "bottom",
icon: "fa fa-minus",
pStyle: "padding-top:12px;padding-bottom:0px;"
}],
show: function(ele){
return scope.component.config.legendOrient != null && scope.component.config.legendOrient === "vertical";
}
}, {
title: "水平位置",
type: "radio-icon",
bind: "legendPosX",
items: [{
name: "左对齐",
value: "left",
icon: "fa fa-align-left"
},{
name: "居中",
value: "center",
icon: "fa fa-align-center"
},{
name: "右对齐",
value: "right",
icon: "fa fa-align-right"
}],
show: function(ele){
return scope.component.config.legendOrient != null && scope.component.config.legendOrient === "horizontal";
}
}]
});
//监听showLegend属性
scope.$watch('component.config.showLegend', function(newValue, oldValue){
if(newValue != null && (oldValue == null || oldValue !== newValue)){
var option = component.config.chartConfig;
if(option.legend == null){
option.legend = {
show: false,
orient : 'horizontal',
x : 'right',
y : 'top',
data:["销售额"],
textStyle: {
color: "#999",
fontSize: 12
}
};
option.legend.show = newValue === "show";
refreshChartView();
}else{
option.legend.show = newValue === "show";
scope.component.context.chart.setOption(option, true);
}
}
});
}
//刷新控件渲染
var refreshChartView = function(scope, element, component, $compile){
//配置的维度
var dimensions = component.config.datasourceConfig.dimensions;
//配置的度量
var measures = component.config.datasourceConfig.measures;
//获取echarts的option配置对象
var option = component.config.chartConfig;
//服务器端返回的查询数据
var data = component.context.data;
if(data == null){
return;
}
//删掉多余的指标配置
if(option.series.length > measures.length){
var newSeries = [];
for(var i = 0; i < measures.length; i++){
newSeries.push(option.series[i]);
}
option.series = newSeries;
}
//X轴的文字
var xAxisLabels = [];
for(var i = 0; i < data.length; i++){
xAxisLabels.push(data[i][dimensions[dimensions.length-1].name]);
}
if(xAxisLabels.length == 0){
xAxisLabels = [""];
}
//图例的值
var legendData = [];
for(var m = 0; m < measures.length; m++){
var serieData = [];
for(var i = 0; i < data.length; i++){
if(isNaN(data[i][measures[m].name])){
data[i][measures[m].name] = null;
}
serieData.push(data[i][measures[m].name]);
}
if(serieData.length == 0){
serieData = [""];
}
if(option.series[m] == null){
var newOption = $.extend(true, {}, optionTemplate);
option.series[m] = newOption.series[0];
}
option.series[m].data = serieData;
option.series[m].name = measures[m].label;
//度量别名
if(component.config["measureAlias_"+m] != null){
option.yAxis[0].name = component.config["measureAlias_"+m];
}
if(option.yAxis[0].name == null || option.yAxis[0].name.length == 0){
option.yAxis[0].name = measures[m].label;
}
//柱子的颜色
if(component.config["columnColor_"+m] == null){
option.series[m].itemStyle.normal.color = "#4c87b5";
}else{
option.series[m].itemStyle.normal.color=component.config["columnColor_"+m];
}
//堆积
option.series[m].stack = component.config["stack_"+m];
if(VSUtils.isEmpty(option.series[m].stack) || !option.series[m].stack){
delete option.series[m].stack;
}
//图例
var legendValue = measures[m].label;
if(component.config["measureAlias_"+m] != null && component.config["measureAlias_"+m].length > 0){
option.series[m].name = component.config["measureAlias_"+m];
legendValue = component.config["measureAlias_"+m];
}
legendData.push(legendValue);
//series的name属性
if(option.series[m].name == null || option.series[m].name.length == 0){
option.series[m].name = measures[m].label;
}
}
option.xAxis[0].data = xAxisLabels;
if(option.legend != null){
option.legend.data = legendData;
}
//如果度量数量大于1,或者配置了图例,不显示Y轴上面的名称
if(measures.length > 1 || option.legend.show === true){
option.yAxis[0].name="";
}
setTimeout(function(){
component.context.chart.dispatchAction({
type: 'hideTip'
});
setTimeout(function(){
component.context.chart.setOption(option, true);
});
});
};
//请勿修改此处命名参数
$vsPluginRegister.register("demo", "demoEcharts", factory);
}]); |
【View脚本模板】
Code Block | ||
---|---|---|
| ||
var build_demoEcharts_component = function(scope, element, $compile, $timeout, $sce){
var component = scope.component;
var myChart = echarts.init(element[0]);
var option = component.config.chartConfig;
if(option == null){
//初始化echarts的option默认值
option = optionTemplate;
option.noDataLoadingOption = {};
//将option保存到chartConfig对象中
component.config.chartConfig = option;
component.config.legendOrient = "horizontal";
}
option.tooltip.position = function (pos, params, dom, rect, size) {
var obj = {top: 0};
obj['left'] = pos[0] < size.viewSize[0] / 2 ? pos[0] : pos[0]-size.contentSize[0];
return obj;
};
//调用echarts的setOption方法
try{
myChart.setOption(option);
}catch(e){
}
//将chart对象放到context中
component.context.chart = myChart;
//当控件尺寸改变时,改变echarts的尺寸
component.context.resize = function(){
$timeout(function(){
if(component.context.chart.resize){
component.context.chart.resize();
}
}, 100);
}
//刷新控件渲染,可直接将designer.js中的方法复制过来
var refreshChartView = function(){
//配置的维度
var dimensions = component.config.datasourceConfig.dimensions;
//配置的度量
var measures = component.config.datasourceConfig.measures;
//获取echarts的option配置对象
var option = component.config.chartConfig;
//服务器端返回的查询数据
var data = component.context.data;
if(data == null){
return;
}
//删掉多余的指标配置
if(option.series.length > measures.length){
var newSeries = [];
for(var i = 0; i < measures.length; i++){
newSeries.push(option.series[i]);
}
option.series = newSeries;
}
//X轴的文字
var xAxisLabels = [];
for(var i = 0; i < data.length; i++){
xAxisLabels.push(data[i][dimensions[dimensions.length-1].name]);
}
if(xAxisLabels.length == 0){
xAxisLabels = [""];
}
//图例的值
var legendData = [];
for(var m = 0; m < measures.length; m++){
var serieData = [];
for(var i = 0; i < data.length; i++){
if(isNaN(data[i][measures[m].name])){
data[i][measures[m].name] = null;
}
serieData.push(data[i][measures[m].name]);
}
if(serieData.length == 0){
serieData = [""];
}
if(option.series[m] == null){
var newOption = $.extend(true, {}, optionTemplate);
option.series[m] = newOption.series[0];
}
option.series[m].data = serieData;
option.series[m].name = measures[m].label;
//度量别名
if(component.config["measureAlias_"+m] != null){
option.yAxis[0].name = component.config["measureAlias_"+m];
}
if(option.yAxis[0].name == null || option.yAxis[0].name.length == 0){
option.yAxis[0].name = measures[m].label;
}
//柱子的颜色
if(component.config["columnColor_"+m] == null){
option.series[m].itemStyle.normal.color = "#4c87b5";
}else{
option.series[m].itemStyle.normal.color=component.config["columnColor_"+m];
}
//堆积
option.series[m].stack = component.config["stack_"+m];
if(VSUtils.isEmpty(option.series[m].stack) || !option.series[m].stack){
delete option.series[m].stack;
}
//图例
var legendValue = measures[m].label;
if(component.config["measureAlias_"+m] != null && component.config["measureAlias_"+m].length > 0){
option.series[m].name = component.config["measureAlias_"+m];
legendValue = component.config["measureAlias_"+m];
}
legendData.push(legendValue);
//series的name属性
if(option.series[m].name == null || option.series[m].name.length == 0){
option.series[m].name = measures[m].label;
}
}
component.context.originalXAxisLabels = null;
if(!VSUtils.isEmpty(component.config.xAxisLabelScript)){
component.context.originalXAxisLabels = angular.copy(xAxisLabels);
try{
var f = eval("(function(labelData){ "+Base64.decode(component.config.xAxisLabelScript)+"})");
f.call(null, xAxisLabels);
}catch(e){
console.log(e);
}
}
option.xAxis[0].data = xAxisLabels;
if(option.legend != null){
option.legend.data = legendData;
}
//如果度量数量大于1,或者配置了图例,不显示Y轴上面的名称
if(measures.length > 1 || option.legend.show === true){
option.yAxis[0].name="";
}
setTimeout(function(){
component.context.chart.dispatchAction({
type: 'hideTip'
});
setTimeout(function(){
component.context.chart.setOption(option, true);
});
});
};
//接收控件刷新数据的事件
scope.$on(event_refreshComponentData, function(target, param){
scope.queryComponentData(param, {
onSuccess: function(){
refreshChartView(scope, element, component, $compile);
}
});
});
//接收联动事件,可直接将designer.js中的方法复制过来
scope.$on(event_chartDimensionValueChange, function(s, event){
var dataIndex = -1;
var axisLabels = component.config.chartConfig.xAxis[0].data;
for(var i = 0; i < axisLabels.length; i++){
if(""+axisLabels[i] === ""+event.source.value){
dataIndex = i;
break;
}
}
if(dataIndex < 0){
component.context.chart.dispatchAction({
type: 'hideTip'
});
return;
}
if(dataIndex > -1){
component.context.chart.dispatchAction({
type: 'showTip',
dataIndex:dataIndex,
seriesIndex: 0
});
}
});
} |