/** * 图表控件 * @class BI.Chart * @extends BI.Widget */ BI.Chart = BI.inherit(BI.Pane, { _defaultConfig: function () { return BI.extend(BI.Chart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-chart" }) }, _init: function () { BI.Chart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.isSetOptions = false; this.vanCharts = VanCharts.init(self.element[0]); this._resizer = BI.debounce(function () { if (self.element.width() > 0 && self.element.height() > 0) { self.vanCharts.resize(); } }, 30); BI.ResizeDetector.addResizeListener(this, function (e) { self._resizer(); }); }, resize: function () { if (this.isSetOptions === true) { this._resizer(); } }, magnify: function () { this.vanCharts.refreshRestore() }, populate: function (items, options) { var self = this, o = this.options; o.items = items; this.config = options || {}; this.config.series = o.items; var setOptions = function () { self.vanCharts.setOptions(self.config); self.isSetOptions = true; }; BI.nextTick(setOptions); } }); BI.Chart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.chart', BI.Chart);/** * 图表控件 * @class BI.CombineChart * @extends BI.Widget */ BI.CombineChart = BI.inherit(BI.Widget, { _defaultConfig: function () { return BI.extend(BI.CombineChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-combine-chart", items: [], xAxis: [{type: "category"}], yAxis: [{type: "value"}], types: [[], []], popupItemsGetter: BI.emptyFn, formatConfig: BI.emptyFn }) }, _init: function () { BI.CombineChart.superclass._init.apply(this, arguments); var self = this, o = this.options; //图可配置属性 this.CombineChart = BI.createWidget({ type: "bi.chart", element: this.element }); this.CombineChart.on(BI.Chart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.CombineChart.EVENT_CHANGE, obj); }); if (BI.isNotEmptyArray(o.items)) { this.populate(o.items); } }, _formatItems: function (items) { var result = [], self = this, o = this.options; var yAxisIndex = 0; BI.each(items, function (i, belongAxisItems) { var combineItems = BI.ChartCombineFormatItemFactory.combineItems(o.types[i], belongAxisItems); BI.each(combineItems, function (j, axisItems) { if (BI.isArray(axisItems)) { result = BI.concat(result, axisItems); } else { result.push(BI.extend(axisItems, {"yAxis": yAxisIndex})); } }); if (BI.isNotEmptyArray(combineItems)) { yAxisIndex++; } }); var config = BI.ChartCombineFormatItemFactory.combineConfig(); config.plotOptions.click = function () { var data = BI.clone(this.options); data.toolTipRect = this.getTooltipRect(); var items = o.popupItemsGetter(data); if (items && items.length === 1) { self.fireEvent(BI.CombineChart.EVENT_ITEM_CLICK, BI.extend({}, items[0], data)); } if (items && items.length > 1) { self._createPopup(items, data.toolTipRect, data); } self.fireEvent(BI.CombineChart.EVENT_CHANGE, data); }; return [result, config]; }, _createPopup: function (items, rect, opt) { var self = this; if (this.combo) { this.combo.destroy(); } this._doDestroy = true; this.combo = BI.createWidget({ type: "bi.combo", direction: "bottom", isNeedAdjustWidth: false, popup: { el: BI.createWidget({ type: "bi.vertical", cls: "bi-linkage-list", items: BI.map(items, function (i, item) { return { el: BI.extend({ type: "bi.text_button", cls: "bi-linkage-list-item", height: 30, handler: function () { self.fireEvent(BI.CombineChart.EVENT_ITEM_CLICK, BI.extend({}, item, opt)); self.combo.destroy(); }, hgap: 10 }, item) } }) }) }, width: 0 }); BI.createWidget({ type: "bi.absolute", element: this.element, items: [{ el: this.combo, top: rect.y, left: rect.x }] }); this.combo.element.hover(function () { self._doDestroy = false; }, function () { self._doDestroy = true; self._debounce2Destroy(); }); this._debounce2Destroy = BI.debounce(BI.bind(destroyCombo, this.combo), 3000); this.combo.showView(); this._debounce2Destroy(); function destroyCombo() { if (self._doDestroy) { this.destroy(); } } }, setTypes: function (types) { this.options.types = types || [[]]; }, populate: function (items, types) { var o = this.options; if (BI.isNotNull(types)) { this.setTypes(types); } var opts = this._formatItems(items); BI.extend(opts[1], { xAxis: o.xAxis, yAxis: o.yAxis }); var result = o.formatConfig(opts[1], opts[0]) || opts; this.CombineChart.populate(result[0], result[1]); }, resize: function () { this.CombineChart.resize(); }, magnify: function () { this.CombineChart.magnify(); } }); BI.CombineChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.CombineChart.EVENT_ITEM_CLICK = "EVENT_ITEM_CLICK"; BI.shortcut('bi.combine_chart', BI.CombineChart);BI.ChartCombineFormatItemFactory = { combineItems: function (types, items) { var calItems = BI.values(items); return BI.map(calItems, function (idx, item) { return BI.ChartCombineFormatItemFactory.formatItems(types[idx], item); }); }, formatItems: function (type, items) { var item = {}; switch (type) { case BICst.WIDGET.BAR: case BICst.WIDGET.ACCUMULATE_BAR: case BICst.WIDGET.COMPARE_BAR: item = BI.extend({"type": "bar"}, items); break; case BICst.WIDGET.BUBBLE: item = BI.extend({"type": "bubble"}, items); break; case BICst.WIDGET.FORCE_BUBBLE: item = BI.extend({"type": "forceBubble"}, items); break; case BICst.WIDGET.SCATTER: item = BI.extend({"type": "scatter"}, items); break; case BICst.WIDGET.AXIS: case BICst.WIDGET.ACCUMULATE_AXIS: case BICst.WIDGET.PERCENT_ACCUMULATE_AXIS: case BICst.WIDGET.COMPARE_AXIS: case BICst.WIDGET.FALL_AXIS: item = BI.extend({"type": "column"}, items); break; case BICst.WIDGET.LINE: item = BI.extend({"type": "line"}, items); break; case BICst.WIDGET.AREA: case BICst.WIDGET.ACCUMULATE_AREA: case BICst.WIDGET.COMPARE_AREA: case BICst.WIDGET.RANGE_AREA: case BICst.WIDGET.PERCENT_ACCUMULATE_AREA: item = BI.extend({"type": "area"}, items); break; case BICst.WIDGET.DONUT: item = BI.extend({"type": "pie"}, items); break; case BICst.WIDGET.RADAR: case BICst.WIDGET.ACCUMULATE_RADAR: item = BI.extend({"type": "radar"}, items); break; case BICst.WIDGET.PIE: item = BI.extend({"type": "pie"}, items); break; case BICst.WIDGET.DASHBOARD: item = BI.extend({"type": "gauge"}, items); break; case BICst.WIDGET.MAP: item = BI.extend({"type": "areaMap"}, items); break; case BICst.WIDGET.GIS_MAP: item = BI.extend({"type": "pointMap"}, items); break; default: item = BI.extend({"type": "column"}, items); break; } return item; }, combineConfig: function () { return { "title": "", "chartType": "column", "plotOptions": { "rotatable": false, "startAngle": 0, "borderRadius": 0, "endAngle": 360, "innerRadius": "0.0%", "layout": "horizontal", "hinge": "rgb(101,107,109)", "dataLabels": { "autoAdjust": true, "style": {"fontFamily": "inherit", "color": "inherit", "fontSize": "12px"}, "formatter": { "identifier": "${VALUE}", "valueFormat": this._contentFormat2Decimal, "seriesFormat": this._contentFormat, "percentFormat": this._contentFormatPercentage, "categoryFormat": this._contentFormat, "XFormat": this._contentFormat2Decimal, "YFormat": this._contentFormat2Decimal, "sizeFormat": this._contentFormat2Decimal }, "align": "outside", "enabled": false }, "percentageLabel": { "formatter": { "identifier": "${PERCENT}", "valueFormat": this._contentFormat2Decimal, "seriesFormat": this._contentFormat, "percentFormat": this._contentFormatPercentage, "categoryFormat": this._contentFormat }, "style": { "fontFamily": "inherit", "color": "inherit", "fontSize": "12px" }, "align": "bottom", "enabled": true }, "valueLabel": { "formatter": { "identifier": "${SERIES}${VALUE}", "valueFormat": this._contentFormat2Decimal, "seriesFormat": this._contentFormat, "percentFormat": this._contentFormatPercentage, "categoryFormat": this._contentFormat }, "backgroundColor": "rgb(255,255,0)", "style": { "fontFamily": "inherit", "color": "inherit", "fontSize": "12px" }, "align": "inside", "enabled": true }, "hingeBackgroundColor": "rgb(220,242,249)", "seriesLabel": { "formatter": { "identifier": "${CATEGORY}", "valueFormat": this._contentFormat2Decimal, "seriesFormat": this._contentFormat, "percentFormat": this._contentFormatPercentage, "categoryFormat": this._contentFormat }, "style": { "fontFamily": "inherit", "color": "inherit", "fontSize": "12px" }, "align": "bottom", "enabled": true }, "paneBackgroundColor": "rgb(252,252,252)", "needle": "rgb(229,113,90)", "large": false, "connectNulls": false, "shadow": true, "curve": false, "sizeBy": "area", "tooltip": { "formatter": { "identifier": "${SERIES}${X}${Y}${SIZE}{CATEGORY}${SERIES}${VALUE}", "valueFormat": this._contentFormat2Decimal, "seriesFormat": this._contentFormat, "percentFormat": this._contentFormatPercentage, "categoryFormat": this._contentFormat, "XFormat": this._contentFormat2Decimal, "sizeFormat": this._contentFormat2Decimal, "YFormat": this._contentFormat2Decimal }, "shared": false, "padding": 5, "backgroundColor": "rgba(0,0,0,0.4980392156862745)", "borderColor": "rgb(0,0,0)", "shadow": false, "borderRadius": 2, "borderWidth": 0, "follow": false, "enabled": true, "animation": true, "style": { "fontFamily": "Microsoft YaHei, Hiragino Sans GB W3", "color": "#c4c6c6", "fontSize": "12px", "fontWeight": "" } }, "maxSize": 80, "fillColorOpacity": 0.5, "step": false, "force": false, "minSize": 15, "displayNegative": true, "categoryGap": "16.0%", "borderColor": "rgb(255,255,255)", "borderWidth": 1, "gap": "22.0%", "animation": true, "lineWidth": 2, "bubble": { "large": false, "connectNulls": false, "shadow": true, "curve": false, "sizeBy": "area", "maxSize": 80, "minSize": 15, "lineWidth": 0, "animation": true, "fillColorOpacity": 0.699999988079071, "marker": { "symbol": "circle", "radius": 28.39695010101295, "enabled": true } } }, "dTools": { "enabled": false, "style": { "fontFamily": "Microsoft YaHei, Hiragino Sans GB W3", "color": "#1a1a1a", "fontSize": "12px" }, "backgroundColor": 'white' }, "dataSheet": { "enabled": false, "borderColor": "rgb(0,0,0)", "borderWidth": 1, "formatter": this._contentFormat2Decimal, "style": { "fontFamily": "inherit", "color": "inherit", "fontSize": "12px" } }, "borderColor": "rgb(238,238,238)", "shadow": false, "legend": { "borderColor": "rgb(204,204,204)", "borderRadius": 0, "shadow": false, "borderWidth": 0, "visible": true, "style": { "fontFamily": "inherit", "color": "inherit", "fontSize": "12px" }, "position": "right", "enabled": false }, "rangeLegend": { "range": { "min": 0, "color": [ [ 0, "rgb(182,226,255)" ], [ 0.5, "rgb(109,196,255)" ], [ 1, "rgb(36,167,255)" ] ], "max": 266393 }, "enabled": false }, "zoom": {"zoomType": "xy", "zoomTool": {"visible": false, "resize": true, "from": "", "to": ""}}, "plotBorderColor": "rgba(255,255,255,0)", "tools": { "hidden": false, "toImage": {"enabled": false}, "sort": {"enabled": false}, "fullScreen": {"enabled": false}, "refresh": { "enabled": false } }, "plotBorderWidth": 0, "style": "normal", "colors": ["rgb(99,178,238)", "rgb(118,218,145)"], "borderRadius": 0, "borderWidth": 0, "plotShadow": false, "plotBorderRadius": 0 }; }, _contentFormat: function () { return BI.contentFormat(arguments[0], '') }, _contentFormat2Decimal: function () { return BI.contentFormat(arguments[0], '#.##;-#.##') }, _contentFormatPercentage: function () { return BI.contentFormat(arguments[0], '#.##%;-#.##%') } };/** * 图表控件 * @class BI.AbstractChart * @extends BI.Widget */ BI.AbstractChart = BI.inherit(BI.Widget, { constants: { LEFT_AXIS: 0, RIGHT_AXIS: 1, RIGHT_AXIS_SECOND: 2, X_AXIS: 3, ROTATION: -90, NORMAL: 1, LEGEND_BOTTOM: 4, ZERO2POINT: 2, ONE2POINT: 3, TWO2POINT: 4, MINLIMIT: 1e-5, LEGEND_HEIGHT: 80, LEGEND_WIDTH: "30.0%", FIX_COUNT: 6, STYLE_NORMAL: 21, NO_PROJECT: 16, DASHBOARD_AXIS: 4, ONE_POINTER: 1, MULTI_POINTER: 2, HALF_DASHBOARD: 9, PERCENT_DASHBOARD: 10, PERCENT_SCALE_SLOT: 11, VERTICAL_TUBE: 12, HORIZONTAL_TUBE: 13, LNG_FIRST: 3, LAT_FIRST: 4, themeColor: "#65bce7", autoCustom: 1, POLYGON: 7, AUTO_CUSTOM: 1, AUTO: 1, NOT_SHOW: 2, LINE_WIDTH: 1, NUM_SEPARATORS: false, FONT_STYLE: { "fontFamily": "inherit", "color": "inherit", "fontSize": "12px" } }, _defaultConfig: function () { return BI.extend(BI.AbstractChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-abstract-chart", popupItemsGetter: BI.emptyFn }) }, _init: function () { BI.AbstractChart.superclass._init.apply(this, arguments); }, /** * 格式化坐标轴数量级及其所影响的系列的各项属性 * @param config 配置信息 * @param items 系列数据 * @param type 坐标轴数量级 * @param position 坐标轴位置 * @param formatter 系列tooltip格式化内容 */ formatNumberLevelInYaxis: function (config, items, type, position, formatter, isPercentChart) { var magnify = this.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { if (position === item.yAxis) { if (BI.isNotNull(da.y) && !BI.isNumber(da.y)) { da.y = BI.parseFloat(da.y); } if (BI.isNotNull(da.y)) { da.y = BI.contentFormat(BI.parseFloat(da.y.div(magnify).toFixed(4)), "#.####;-#.####"); } } }); if (position === item.yAxis) { item.tooltip = BI.deepClone(config.plotOptions.tooltip); item.tooltip.formatter.valueFormat = formatter; if(isPercentChart) { item.tooltip.formatter.percentFormat = formatter; item.tooltip.formatter.identifier = "${CATEGORY}${SERIES}${PERCENT}"; } } }); }, formatNumberLevelInXaxis: function (items, type) { var magnify = this.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { if (BI.isNotNull(da.x) && !BI.isNumber(da.x)) { da.x = BI.parseFloat(da.x); } if (BI.isNotNull(da.x)) { da.x = BI.contentFormat(BI.parseFloat(da.x.div(magnify).toFixed(4)), "#.####;-#.####"); } }); }) }, formatXYDataWithMagnify: function (number, magnify) { if (BI.isNull(number)) { return null } if (!BI.isNumber(number)) { number = BI.parseFloat(number); } return BI.contentFormat(BI.parseFloat(number.div(magnify).toFixed(4)), "#.####;-#.####"); }, calcMagnify: function (type) { var magnify = 1; switch (type) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: case BICst.TARGET_STYLE.NUM_LEVEL.PERCENT: magnify = 1; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: magnify = 10000; break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: magnify = 1000000; break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: magnify = 100000000; break; } return magnify; }, formatChartLegend: function (config, chartLegend) { switch (chartLegend) { case BICst.CHART_LEGENDS.BOTTOM: config.legend.enabled = true; config.legend.position = "bottom"; config.legend.maxHeight = this.constants.LEGEND_HEIGHT; break; case BICst.CHART_LEGENDS.RIGHT: config.legend.enabled = true; config.legend.position = "right"; config.legend.maxWidth = this.constants.LEGEND_WIDTH; break; case BICst.CHART_LEGENDS.NOT_SHOW: default: config.legend.enabled = false; break; } }, getXYAxisUnit: function (numberLevelType, axis_unit) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } return (BI.isEmptyString(unit) && BI.isEmptyString(axis_unit)) ? unit : "(" + unit + axis_unit + ")"; }, formatTickInXYaxis: function (type, number_level, separators, isCompareBar) { var formatter = '#.##'; switch (type) { case this.constants.NORMAL: formatter = '#.##'; if (separators) { formatter = '#,###.##' } break; case this.constants.ZERO2POINT: formatter = '#0'; if (separators) { formatter = '#,###'; } break; case this.constants.ONE2POINT: formatter = '#0.0'; if (separators) { formatter = '#,###.0'; } break; case this.constants.TWO2POINT: formatter = '#0.00'; if (separators) { formatter = '#,###.00'; } break; } if (number_level === BICst.TARGET_STYLE.NUM_LEVEL.PERCENT) { formatter += '%'; } formatter += ";-" + formatter; if(isCompareBar) { return function () { arguments[0] = arguments[0] > 0 ? arguments[0] : (-1) * arguments[0]; return BI.contentFormat(arguments[0], formatter); } } return function () { return BI.contentFormat(arguments[0], formatter) } }, formatDataLabel: function (state, items, config, style) { var self = this; if (state === true) { BI.each(items, function (idx, item) { item.dataLabels = { "align": "outside", "autoAdjust": true, style: style, enabled: true, formatter: { identifier: "${VALUE}", valueFormat: config.yAxis[item.yAxis].formatter } }; }); } }, formatDataLabelForAxis: function (state, items, format, style, isPercentChart) { var self = this; if (state === true) { BI.each(items, function (idx, item) { item.dataLabels = { "align": "outside", "autoAdjust": true, style: style, enabled: true, formatter: { identifier: "${VALUE}", valueFormat: format, } }; if(isPercentChart) { item.dataLabels.formatter.identifier = "${PERCENT}"; item.dataLabels.formatter.percentFormat = format; } }); } }, setFontStyle: function (fontStyle, config) { if (config.dataSheet) { config.dataSheet.style = fontStyle; } config.xAxis[0].title.style = fontStyle; config.xAxis[0].labelStyle = fontStyle; config.legend.style = fontStyle; BI.each(config.yAxis, function (idx, axis) { axis.labelStyle = fontStyle; axis.title.style = fontStyle; }) }, _formatItems: function (items) { return items; }, populate: function (items, options) { }, resize: function () { }, magnify: function () { } }); BI.AbstractChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.AbstractChart.EVENT_ITEM_CLICK = "EVENT_ITEM_CLICK"; /** * 图表控件 * @class BI.AccumulateAreaChart * @extends BI.Widget */ BI.AccumulateAreaChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.AccumulateAreaChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-accumulate-area-chart" }) }, _init: function () { BI.AccumulateAreaChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE }]; this.yAxis = []; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.AccumulateAreaChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this; config.colors = this.config.chartColor; config.style = formatChartStyle(this.config.chartStyle); formatChartLineStyle(this.config.chartLineType); formatCordon(this.config.cordon); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.each(config.yAxis, function (idx, axis) { var unit = ""; switch (axis.axisIndex) { case self.constants.LEFT_AXIS: unit = self.getXYAxisUnit(self.config.leftYAxisNumberLevel, self.config.leftYAxisUnit); axis.title.text = self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + unit : unit; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.leftYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.leftYAxisNumberLevel, idx, axis.formatter, self.config.numSeparators); break; case self.constants.RIGHT_AXIS: unit = self.getXYAxisUnit(self.config.rightYAxisNumberLevel, self.config.rightYAxisUnit); axis.title.text = self.config.showRightYAxisTitle === true ? self.config.rightYAxisTitle + unit : unit; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.rightYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisStyle, self.config.rightYAxisNumberLevel, self.config.rightNumSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.rightYAxisNumberLevel, idx, axis.formatter, self.config.rightNumSeparators); break; } }); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); config.chartType = "area"; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabel(config.plotOptions.dataLabels.enabled, items, config, this.config.chartFont); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle(v) { switch (v) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatChartLineStyle(v) { switch (v) { case BICst.CHART_SHAPE.RIGHT_ANGLE: config.plotOptions.curve = false; config.plotOptions.step = true; break; case BICst.CHART_SHAPE.CURVE: config.plotOptions.curve = true; config.plotOptions.step = false; break; case BICst.CHART_SHAPE.NORMAL: default: config.plotOptions.curve = false; config.plotOptions.step = false; break; } } function formatCordon(cordon) { BI.each(cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } }, _formatItems: function (items) { return BI.map(items, function (idx, item) { var i = BI.UUID(); return BI.map(item, function (id, it) { return BI.extend({}, it, {stack: i}); }); }); }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", rightYAxisTitle: options.rightYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.STYLE_NORMAL, chartLineType: options.chartLineType || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, rightYAxisStyle: options.rightYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, showRightYAxisTitle: options.showRightYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, rightYAxisReversed: options.rightYAxisReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, rightYAxisNumberLevel: options.rightYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", rightYAxisUnit: options.rightYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; this.yAxis = []; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.AREA); }); types.push(type); }); BI.each(types, function (idx, type) { if (BI.isEmptyArray(type)) { return; } var newYAxis = { type: "value", title: { style: self.constants.FONT_STYLE }, labelStyle: self.constants.FONT_STYLE, position: idx > 0 ? "right" : "left", lineWidth: 1, axisIndex: idx, gridLineWidth: 0 }; self.yAxis.push(newYAxis); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.AccumulateAreaChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.accumulate_area_chart', BI.AccumulateAreaChart);/** * 图表控件 * @class BI.AccumulateAxisChart * @extends BI.Widget */ BI.AccumulateAxisChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.AccumulateAxisChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-accumulate-axis-chart" }) }, _init: function () { BI.AccumulateAxisChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE }]; this.yAxis = []; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.AccumulateAxisChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.each(config.yAxis, function (idx, axis) { switch (axis.axisIndex) { case self.constants.LEFT_AXIS: axis.title.text = getTitleText(self.config.leftYAxisNumberLevel, self.constants.LEFT_AXIS, self.config.showLeftYAxisTitle, self.config.leftYAxisTitle); axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.leftYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.leftYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS: axis.title.text = getTitleText(self.config.rightYAxisNumberLevel, self.constants.RIGHT_AXIS, self.config.showRightYAxisTitle, self.config.rightYAxisTitle); axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.rightYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisStyle, self.config.rightYAxisNumberLevel, self.config.rightNumSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.rightYAxisNumberLevel, idx, axis.formatter); break; } }); config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; config.xAxis[0].title.align = "center"; BI.extend(config.xAxis[0], { lineWidth: self.config.lineWidth, enableTick: self.config.enableTick, labelRotation: this.config.textDirection, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); config.chartType = "column"; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabel(config.plotOptions.dataLabels.enabled, items, config, this.config.chartFont); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function getTitleText(numberLevelType, position, show, title) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } unit = unit === "" ? unit : "(" + unit + ")"; return show === true ? title + unit : unit; } }, _formatItems: function (items) { return BI.map(items, function (idx, item) { var i = BI.UUID(); return BI.map(item, function (id, it) { return BI.extend({}, it, {stack: i}); }); }); }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", rightYAxisTitle: options.rightYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.STYLE_NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, rightYAxisStyle: options.rightYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, showRightYAxisTitle: options.showRightYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, rightYAxisReversed: options.rightYAxisReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, rightYAxisNumberLevel: options.rightYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", rightYAxisUnit: options.rightYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; this.yAxis = []; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.AXIS); }); types.push(type); }); BI.each(types, function (idx, type) { if (BI.isEmptyArray(type)) { return; } var newYAxis = { type: "value", title: { style: self.constants.FONT_STYLE }, labelStyle: self.constants.FONT_STYLE, position: idx > 0 ? "right" : "left", lineWidth: 1, axisIndex: idx, gridLineWidth: 0 }; self.yAxis.push(newYAxis); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.AccumulateAxisChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.accumulate_axis_chart', BI.AccumulateAxisChart);/** * 图表控件 * @class BI.AccumulateBarChart * @extends BI.Widget */ BI.AccumulateBarChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.AccumulateBarChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-accumulate-bar-chart" }) }, _init: function () { BI.AccumulateBarChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, formatter: function () { return this > 0 ? this : (-1) * this }, gridLineWidth: 0 }]; this.yAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, gridLineWidth: 0, position: "left" }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.AccumulateBarChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this; var unit = getXYAxisUnit(this.config.xAxisNumberLevel, this.constants.LEFT_AXIS); var xTitle = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.X_AXIS); config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.yAxis = this.yAxis; config.yAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle + unit : unit; config.yAxis[0].title.rotation = this.constants.ROTATION; BI.extend(config.yAxis[0], { gridLineWidth: this.config.showGridLine === true ? 1 : 0, labelRotation: this.config.textDirection, lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, maxWidth: '40%' }); self.formatNumberLevelInXaxis(items, this.config.leftYAxisNumberLevel); config.xAxis[0].title.text = this.config.showLeftYAxisTitle === true ? this.config.leftYAxisTitle + xTitle : xTitle; config.xAxis[0].title.align = "center"; BI.extend(config.xAxis[0], { formatter: self.formatTickInXYaxis(this.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators), gridLineWidth: this.config.showGridLine === true ? 1 : 0, showLabel: this.config.showLabel, enableTick: this.config.enableTick, lineWidth: this.config.lineWidth, enableMinorTick: this.config.enableMinorTick }); config.chartType = "bar"; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabelForAxis(config.plotOptions.dataLabels.enabled, items, config.xAxis[0].formatter, this.config.chartFont); config.plotOptions.tooltip.formatter.valueFormat = config.xAxis[0].formatter; //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.xAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, _formatItems: function (items) { BI.each(items, function (idx, item) { var stackId = BI.UUID(); BI.each(item, function (id, it) { it.stack = stackId; BI.each(it.data, function (i, t) { var tmp = t.x; t.x = t.y; t.y = tmp; }) }); }); return items; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.STYLE_NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, xAxisStyle: options.xAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, xAxisNumberLevel: options.xAxisNumberLevel || c.NORMAL, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], minimalist_model: options.minimalist_model || false, lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.BAR); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.AccumulateBarChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.accumulate_bar_chart', BI.AccumulateBarChart);/** * 图表控件 * @class BI.AccumulateRadarChart * @extends BI.Widget */ BI.AccumulateRadarChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.AccumulateRadarChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-accumulate-radar-chart" }) }, _init: function () { BI.AccumulateRadarChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.radiusAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, formatter: function () { return this > 0 ? this : (-1) * this }, gridLineWidth: 0, position: "bottom" }]; this.angleAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.AccumulateRadarChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatItems: function (items) { return BI.map(items, function (idx, item) { var i = BI.UUID(); return BI.map(item, function (id, it) { return BI.extend({}, it, {stack: i}); }); }); }, _formatConfig: function (config, items) { var self = this; delete config.zoom; var title = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS); config.colors = this.config.chartColor; config.style = formatChartStyle(); formatChartRadarStyle(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.radiusAxis = this.radiusAxis; config.angleAxis = this.angleAxis; config.radiusAxis[0].formatter = self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators); formatNumberLevelInYaxis(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS, config.radiusAxis[0].formatter); config.radiusAxis[0].title.text = this.config.showLeftYAxisTitle === true ? this.config.leftYAxisTitle + title : title; config.radiusAxis[0].gridLineWidth = this.config.showGridLine === true ? 1 : 0; config.chartType = "radar"; config.plotOptions.columnType = true; delete config.xAxis; delete config.yAxis; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabelForAxis(config.plotOptions.dataLabels.enabled, items, config.radiusAxis[0].formatter, this.config.chartFont); //全局样式的图表文字 config.radiusAxis[0].labelStyle = config.radiusAxis[0].title.style = this.config.chartFont; config.angleAxis[0].labelStyle = config.angleAxis[0].title.style = this.config.chartFont; config.legend.style = this.config.chartFont; return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatChartRadarStyle() { switch (self.config.chartRadarType) { case BICst.CHART_SHAPE.POLYGON: config.plotOptions.shape = "polygon"; break; case BICst.CHART_SHAPE.CIRCLE: config.plotOptions.shape = "circle"; break; } } function formatNumberLevelInYaxis(type, position, formatter) { var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { if (position === item.yAxis) { da.y = self.formatXYDataWithMagnify(da.y, magnify); } }) }); config.plotOptions.tooltip.formatter.valueFormat = formatter; } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { chartRadarType: options.chartRadarType || c.NORMAL, chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.STYLE_NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, cordon: options.cordon || [], numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.RADAR); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.AccumulateRadarChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.accumulate_radar_chart', BI.AccumulateRadarChart);/** * 图表控件 * @class BI.AreaChart * @extends BI.Widget */ BI.AreaChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.AreaChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-area-chart" }) }, _init: function () { BI.AreaChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.AreaChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatChartLineStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.each(config.yAxis, function (idx, axis) { var title = ""; switch (axis.axisIndex) { case self.constants.LEFT_AXIS: title = getXYAxisUnit(self.config.leftYAxisNumberLevel, self.constants.LEFT_AXIS); axis.title.text = self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + title : title; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.leftYAxisReversed, enableMinorTick: self.config.enableMinorTick, formatter: self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators), gridLineWidth: self.config.showGridLine === true ? 1 : 0 }); self.formatNumberLevelInYaxis(config, items, self.config.leftYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS: title = getXYAxisUnit(self.config.rightYAxisNumberLevel, self.constants.RIGHT_AXIS); axis.title.text = self.config.showRightYAxisTitle === true ? self.config.rightYAxisTitle + title : title; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.rightYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisStyle, self.config.rightYAxisNumberLevel, self.config.rightNumSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.rightYAxisNumberLevel, idx, axis.formatter); break; } }); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); config.chartType = "area"; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabel(config.plotOptions.dataLabels.enabled, items, config, this.config.chartFont); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function formatChartLineStyle() { switch (self.config.chartLineType) { case BICst.CHART_SHAPE.RIGHT_ANGLE: config.plotOptions.curve = false; config.plotOptions.step = true; break; case BICst.CHART_SHAPE.CURVE: config.plotOptions.curve = true; config.plotOptions.step = false; break; case BICst.CHART_SHAPE.NORMAL: default: config.plotOptions.curve = false; config.plotOptions.step = false; break; } } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", rightYAxisTitle: options.rightYAxisTitle || "", rightYAxisSecondTitle: options.rightYAxisSecondTitle || "", chartLineType: options.chartLineType || c.NORMAL, chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, rightYAxisStyle: options.rightYAxisStyle || c.NORMAL, rightYAxisSecondStyle: options.rightYAxisSecondStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, showRightYAxisTitle: options.showRightYAxisTitle || false, showRightYAxisSecondTitle: options.showRightYAxisSecondTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, rightYAxisReversed: options.rightYAxisReversed || false, rightYAxisSecondReversed: options.rightYAxisSecondReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, rightYAxisNumberLevel: options.rightYAxisNumberLevel || c.NORMAL, rightYAxisSecondNumberLevel: options.rightYAxisSecondNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", rightYAxisUnit: options.rightYAxisUnit || "", rightYAxisSecondUnit: options.rightYAxisSecondUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.AREA); }); types.push(type); }); this.yAxis = []; BI.each(types, function (idx, type) { if (BI.isEmptyArray(type)) { return; } var newYAxis = { type: "value", title: { style: self.constants.FONT_STYLE }, labelStyle: self.constants.FONT_STYLE, position: idx > 0 ? "right" : "left", lineWidth: 1, axisIndex: idx, gridLineWidth: 0 }; self.yAxis.push(newYAxis); }); this.combineChart.populate(items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.AreaChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.area_chart', BI.AreaChart);/** * 图表控件 柱状 * @class BI.AxisChart * @extends BI.Widget * leftYxis 左值轴属性 * rightYxis 右值轴属性 * xAxis 分类轴属性 */ BI.AxisChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.AxisChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-axis-chart" }) }, _init: function () { BI.AxisChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.AxisChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.each(config.yAxis, function (idx, axis) { var title; switch (axis.axisIndex) { case self.constants.LEFT_AXIS: title = getXYAxisUnit(self.config.leftYAxisNumberLevel, self.constants.LEFT_AXIS); axis.title.text = self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + title : title; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.leftYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.leftYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS: title = getXYAxisUnit(self.config.rightYAxisNumberLevel, self.constants.RIGHT_AXIS); axis.title.text = self.config.showRightYAxisTitle === true ? self.config.rightYAxisTitle + title : title; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.rightYAxisReversed, enableMinorTIck: self.config.enableMinorTick, formatter: self.formatTickInXYaxis(self.config.rightYAxisStyle, self.config.rightYAxisNumberLevel, self.config.rightNumSeparators), gridLineWidth: self.config.showGridLine === true ? 1 : 0 }); self.formatNumberLevelInYaxis(config, items, self.config.rightYAxisNumberLevel, idx, axis.formatter); break; } }); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, enableMinorTick: this.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); var lineItem = []; var otherItem = []; BI.each(items, function (idx, item) { if (item.type === "line") { lineItem.push(item); } else { otherItem.push(item); } }); //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabel(config.plotOptions.dataLabels.enabled, items, config, this.config.chartFont); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [BI.concat(otherItem, lineItem), config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, populate: function (items, options, types) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", rightYAxisTitle: options.rightYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, rightYAxisStyle: options.rightYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, showRightYAxisTitle: options.showRightYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, rightYAxisReversed: options.rightYAxisReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, rightYAxisNumberLevel: options.rightYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", rightYAxisUnit: options.rightYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: true }; this.options.items = items; this.yAxis = []; BI.each(types, function (idx, type) { if (BI.isEmptyArray(type)) { return; } var newYAxis = { type: "value", title: { style: self.constants.FONT_STYLE }, labelStyle: self.constants.FONT_STYLE, position: idx > 0 ? "right" : "left", lineWidth: 1, axisIndex: idx, gridLineWidth: 0 }; self.yAxis.push(newYAxis); }); this.combineChart.populate(items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.AxisChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.axis_chart', BI.AxisChart);/** * 图表控件 * @class BI.BarChart * @extends BI.Widget */ BI.BarChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.BarChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-bar-chart" }) }, _init: function () { BI.BarChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, formatter: function () { return this > 0 ? this : (-1) * this }, gridLineWidth: 0 }]; this.yAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, gridLineWidth: 0, position: "left" }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { var tmp = obj.x; obj.x = obj.y; obj.y = tmp; self.fireEvent(BI.BarChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; //分类轴 config.yAxis = this.yAxis; config.yAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; config.yAxis[0].title.rotation = this.constants.ROTATION; BI.extend(config.yAxis[0], { gridLineWidth: this.config.showGridLine === true ? 1 : 0, labelRotation: this.config.textDirection, enableTick: this.config.enableTick, lineWidth: this.config.lineWidth, maxWidth: '40%' }); //值轴 self.formatNumberLevelInXaxis(items, this.config.leftYAxisNumberLevel); config.xAxis[0].title.text = getXAxisTitle(this.config.leftYAxisNumberLevel, this.constants.X_AXIS); config.xAxis[0].title.align = "center"; BI.extend(config.xAxis[0], { formatter: self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators), gridLineWidth: this.config.showGridLine === true ? 1 : 0, enableTick: this.config.enableTick, showLabel: this.config.showLabel, lineWidth: this.config.lineWidth, enableMinorTick: this.config.enableMinorTick }); config.chartType = "bar"; this.formatDataLabelForAxis(config.plotOptions.dataLabels.enabled, items, config.xAxis[0].formatter, this.config.chartFont); config.plotOptions.tooltip.formatter.valueFormat = config.xAxis[0].formatter; //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.xAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function getXAxisTitle(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } unit = unit === "" ? unit : "(" + unit + ")"; return self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + unit : unit; } }, _formatItems: function (items) { BI.each(items, function (idx, item) { BI.each(item, function (id, it) { BI.each(it.data, function (i, t) { var tmp = t.x; t.x = t.y; t.y = tmp; }) }); }); return items; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.STYLE_NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, xAxisStyle: options.xAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, xAxisNumberLevel: options.xAxisNumberLevel || c.NORMAL, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.BAR); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.BarChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.bar_chart', BI.BarChart);/** * 图表控件 * @class BI.BubbleChart * @extends BI.Widget */ BI.BubbleChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.BubbleChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-bubble-chart" }) }, _init: function () { BI.BubbleChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.yAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "left", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.BubbleChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; delete config.zoom; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.dataLabels.formatter.identifier = "${X}${Y}${SIZE}"; config.plotOptions.shadow = this.config.bubbleStyle !== this.constants.NO_PROJECT; config.yAxis = this.yAxis; config.yAxis[0].formatter = self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators); formatNumberLevelInYaxis(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS); config.yAxis[0].title.text = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS); config.yAxis[0].title.text = this.config.showLeftYAxisTitle === true ? this.config.leftYAxisTitle + config.yAxis[0].title.text : config.yAxis[0].title.text; config.yAxis[0].gridLineWidth = this.config.showGridLine === true ? 1 : 0; config.yAxis[0].lineWidth = 1; config.yAxis[0].title.rotation = this.constants.ROTATION; config.yAxis[0].maxWidth = '40%'; config.xAxis[0].formatter = self.formatTickInXYaxis(this.config.xAxisStyle, this.config.xAxisNumberLevel, this.config.rightNumSeparators); self.formatNumberLevelInXaxis(items, this.config.xAxisNumberLevel); config.xAxis[0].title.text = getXYAxisUnit(this.config.xAxisNumberLevel, this.constants.X_AXIS); config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle + config.xAxis[0].title.text : config.xAxis[0].title.text; config.xAxis[0].title.align = "center"; config.xAxis[0].gridLineWidth = this.config.showGridLine === true ? 1 : 0; config.xAxis[0].maxHeith = '40%'; config.chartType = "bubble"; if (BI.isNotEmptyArray(this.config.tooltip)) { config.plotOptions.bubble.tooltip = { useHtml: true, style: { color: 'RGB(184, 184, 184)' }, formatter: function () { var y = self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators)(this.y); var x = self.formatTickInXYaxis(self.config.xAxisStyle, self.config.xAxisNumberLevel, self.config.rightNumSeparators)(this.x); return this.seriesName + '
(X)' + self.config.tooltip[0] + ':' + x + '
(Y)' + self.config.tooltip[1] + ':' + y + '
(' + BI.i18nText("BI-Size") + ')' + self.config.tooltip[2] + ':' + this.size + '
'} }; } //为了给数据标签加个%,还要遍历所有的系列,唉 if (config.plotOptions.dataLabels.enabled === true) { BI.each(items, function (idx, item) { item.dataLabels = { "style" : self.config.chartFont, "align": "outside", "autoAdjust": true, enabled: true, formatter: { identifier: "${X}${Y}${SIZE}", "XFormat": function () { return BI.contentFormat(arguments[0], '#.##;-#.##') }, "YFormat": function () { return BI.contentFormat(arguments[0], '#.##;-#.##') }, "sizeFormat": function () { return BI.contentFormat(arguments[0], '#.##;-#.##') } } }; item.dataLabels.formatter.XFormat = config.xAxis[0].formatter; item.dataLabels.formatter.YFormat = config.yAxis[0].formatter; }); } //全局样式图表文字 config.yAxis[0].title.style = config.yAxis[0].labelStyle = this.config.chartFont; config.xAxis[0].title.style = config.xAxis[0].labelStyle = this.config.chartFont; config.legend.style = this.config.chartFont; return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function formatNumberLevelInYaxis(type, position) { var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { if (position === item.yAxis) { da.y = self.formatXYDataWithMagnify(da.y, magnify); } }) }); if (type === BICst.TARGET_STYLE.NUM_LEVEL.PERCENT) { //config.plotOptions.tooltip.formatter.valueFormat = "function(){return window.FR ? FR.contentFormat(arguments[0], '#0%') : arguments[0]}"; } } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, _formatItems: function (items) { BI.each(items, function (idx, item) { BI.each(item, function (id, it) { BI.each(it.data, function (i, da) { var data = da.size; da.size = BI.contentFormat(data, '#.##;-#.##') }) }) }); return items; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", chartColor: options.chartColor || [], leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, xAxisStyle: options.xAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, xAxisNumberLevel: options.xAxisNumberLevel || c.NORMAL, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, cordon: options.cordon || [], tooltip: options.tooltip || [], bubbleStyle: options.bubbleStyle || c.NO_PROJECT, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.BUBBLE); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.BubbleChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.bubble_chart', BI.BubbleChart); /** * 图表控件 * @class BI.CompareAreaChart * @extends BI.Widget */ BI.CompareAreaChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.CompareAreaChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-compare-area-chart" }) }, _init: function () { BI.CompareAreaChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.CompareAreaChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatChartLineStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.each(config.yAxis, function (idx, axis) { var title = ""; switch (axis.axisIndex) { case self.constants.LEFT_AXIS: title = getXYAxisUnit(self.config.leftYAxisNumberLevel, self.constants.LEFT_AXIS); axis.title.rotation = self.constants.ROTATION; axis.title.text = self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + title : title; BI.extend(axis, { reversed: false, lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators) }); formatNumberLevelInYaxis(self.config.leftYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS: title = getXYAxisUnit(self.config.rightYAxisNumberLevel, self.constants.RIGHT_AXIS); axis.title.rotation = self.constants.ROTATION; axis.title.text = self.config.showRightYAxisTitle === true ? self.config.rightYAxisTitle + title : title; BI.extend(axis, { reversed: true, lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisStyle, self.config.rightYAxisNumberLevel, self.config.rightNumSeparators) }); formatNumberLevelInYaxis(self.config.rightYAxisNumberLevel, idx, axis.formatter); break; } var res = _calculateValueNiceDomain(0, self.maxes[idx]); axis.max = res[1].mul(2); axis.min = res[0].mul(2); axis.tickInterval = BI.parseFloat((BI.parseFloat(axis.max).sub(BI.parseFloat(axis.min)))).div(5); }); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); config.chartType = "area"; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabel(config.plotOptions.dataLabels.enabled, items, config, this.config.chartFont); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function _calculateValueNiceDomain(minValue, maxValue) { minValue = Math.min(0, minValue); var tickInterval = _linearTickInterval(minValue, maxValue); return _linearNiceDomain(minValue, maxValue, tickInterval); } function _linearTickInterval(minValue, maxValue, m) { m = m || 5; var span = maxValue - minValue; var step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)); var err = m / span * step; if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; return step; } function _linearNiceDomain(minValue, maxValue, tickInterval) { minValue = VanUtils.accMul(Math.floor(minValue / tickInterval), tickInterval); maxValue = VanUtils.accMul(Math.ceil(maxValue / tickInterval), tickInterval); return [minValue, maxValue]; } function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function formatChartLineStyle() { switch (self.config.chartLineType) { case BICst.CHART_SHAPE.RIGHT_ANGLE: config.plotOptions.area = { curve: false, step: true }; break; case BICst.CHART_SHAPE.CURVE: config.plotOptions.area = { curve: true, step: false }; break; case BICst.CHART_SHAPE.NORMAL: default: config.plotOptions.area = { curve: false, step: false }; break; } } function formatNumberLevelInYaxis(type, position, formatter) { var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { var max = null; BI.each(item.data, function (id, da) { if (position === item.yAxis) { da.y = self.formatXYDataWithMagnify(da.y, magnify); if ((BI.isNull(max) || BI.parseFloat(da.y) > BI.parseFloat(max))) { max = da.y; } } }); if (position === item.yAxis) { item.tooltip = BI.deepClone(config.plotOptions.tooltip); item.tooltip.formatter.valueFormat = formatter; } if (BI.isNotNull(max)) { self.maxes.push(max); } }); } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, _formatItems: function (items) { var self = this; this.maxes = []; BI.each(items, function (idx, item) { BI.each(item, function (id, it) { if (idx > 0) { BI.extend(it, {reversed: true, xAxis: 0}); } else { BI.extend(it, {reversed: false, xAxis: 1}); } }); }); return items; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", rightYAxisTitle: options.rightYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, chartLineType: options.chartLineType || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, rightYAxisStyle: options.rightYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, showRightYAxisTitle: options.showRightYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, rightYAxisReversed: options.rightYAxisReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, rightYAxisNumberLevel: options.rightYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", rightYAxisUnit: options.rightYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.AREA); }); types.push(type); }); this.yAxis = []; BI.each(types, function (idx, type) { if (BI.isEmptyArray(type)) { return; } var newYAxis = { type: "value", title: { style: self.constants.FONT_STYLE }, labelStyle: self.constants.FONT_STYLE, position: idx > 0 ? "right" : "left", lineWidth: 1, axisIndex: idx, gridLineWidth: 0 }; self.yAxis.push(newYAxis); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.CompareAreaChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.compare_area_chart', BI.CompareAreaChart);/** * 图表控件 * @class BI.CompareAxisChart * @extends BI.Widget */ BI.CompareAxisChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.CompareAxisChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-compare-axis-chart" }) }, _init: function () { BI.CompareAxisChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }, { title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "top", gridLineWidth: 0, type: "category", showLabel: false }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.CompareAxisChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function(config, items){ var self = this, o = this.options; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatChartLineStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if(this.config.showZoom === true){ delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.each(config.yAxis, function(idx, axis){ var unit = ''; switch (axis.axisIndex){ case self.constants.LEFT_AXIS: unit = getXYAxisUnit(self.config.leftYAxisNumberLevel, self.constants.LEFT_AXIS); axis.title.rotation = self.constants.ROTATION; axis.title.text = self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + unit : unit; BI.extend(axis, { reversed: false, lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators) }); formatNumberLevelInYaxis(self.config.leftYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS: unit = getXYAxisUnit(self.config.rightYAxisNumberLevel, self.constants.RIGHT_AXIS); axis.title.rotation = self.constants.ROTATION; axis.title.text = self.config.showRightYAxisTitle === true ? self.config.rightYAxisTitle + unit : unit; BI.extend(axis, { reversed: true, lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisStyle, self.config.rightYAxisNumberLevel, self.config.rightNumSeparators) }); formatNumberLevelInYaxis(self.config.rightYAxisNumberLevel, idx, axis.formatter); break; } var res = _calculateValueNiceDomain(0, self.maxes[idx]); axis.max = res[1].mul(2); axis.min = res[0].mul(2); axis.tickInterval = BI.parseFloat((BI.parseFloat(axis.max).sub(BI.parseFloat(axis.min)))).div(5); }); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, enableMinorTick: this.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); BI.extend(config.xAxis[1], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, enableMinorTick: this.config.enableMinorTick }); //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabel(config.plotOptions.dataLabels.enabled, items, config, this.config.chartFont); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle(){ switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon(){ BI.each(self.config.cordon, function(idx, cor){ if(idx === 0 && self.xAxis.length > 0){ var magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function(i, t){ return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if(idx > 0 && self.yAxis.length >= idx){ var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function(i, t){ return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function formatChartLineStyle(){ switch (self.config.chartLineType) { case BICst.CHART_SHAPE.RIGHT_ANGLE: config.plotOptions.curve = false; config.plotOptions.step = true; break; case BICst.CHART_SHAPE.CURVE: config.plotOptions.curve = true; config.plotOptions.step = false; break; case BICst.CHART_SHAPE.NORMAL: default: config.plotOptions.curve = false; config.plotOptions.step = false; break; } } function formatNumberLevelInYaxis(type, position, formatter){ var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { var max = null; BI.each(item.data, function (id, da) { if (position === item.yAxis) { da.y = self.formatXYDataWithMagnify(da.y, magnify); if((BI.isNull(max) || BI.parseFloat(da.y) > BI.parseFloat(max))){ max = da.y; } } }); if(position === item.yAxis){ item.tooltip = BI.deepClone(config.plotOptions.tooltip); item.tooltip.formatter.valueFormat = formatter; } if(BI.isNotNull(max)){ self.maxes.push(max); } }); } function getXYAxisUnit(numberLevelType, position){ var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if(position === self.constants.X_AXIS){ self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if(position === self.constants.LEFT_AXIS){ self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if(position === self.constants.RIGHT_AXIS){ self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } function _calculateValueNiceDomain(minValue, maxValue){ minValue = Math.min(0, minValue); var tickInterval = _linearTickInterval(minValue, maxValue); return _linearNiceDomain(minValue, maxValue, tickInterval); } function _linearTickInterval(minValue, maxValue, m){ m = m || 5; var span = maxValue - minValue; var step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)); var err = m / span * step; if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; return step; } function _linearNiceDomain(minValue, maxValue, tickInterval){ minValue = VanUtils.accMul(Math.floor(minValue / tickInterval), tickInterval); maxValue = VanUtils.accMul(Math.ceil(maxValue / tickInterval), tickInterval); return [minValue, maxValue]; } }, _formatItems: function(items){ var self = this; this.maxes = []; BI.each(items, function(idx, item){ BI.each(item, function(id, it){ if(idx > 0){ BI.extend(it, {reversed: true, xAxis: 1}); }else{ BI.extend(it, {reversed: false, xAxis: 0}); } }); }); return items; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", rightYAxisTitle: options.rightYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, chartLineType: options.chartLineType || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, rightYAxisStyle: options.rightYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, showRightYAxisTitle: options.showRightYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, rightYAxisReversed: options.rightYAxisReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, rightYAxisNumberLevel: options.rightYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", rightYAxisUnit: options.rightYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; this.yAxis = []; var types = []; BI.each(items, function(idx, axisItems){ var type = []; BI.each(axisItems, function(id, item){ type.push(BICst.WIDGET.AXIS); }); types.push(type); }); BI.each(types, function(idx, type){ if(BI.isEmptyArray(type)){ return; } var newYAxis = { type: "value", title: { style: self.constants.FONT_STYLE }, labelStyle: self.constants.FONT_STYLE, position: idx > 0 ? "right" : "left", lineWidth: 1, axisIndex: idx, gridLineWidth: 0, reversed: idx > 0 }; self.yAxis.push(newYAxis); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function(){ this.combineChart.magnify(); } }); BI.CompareAxisChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.compare_axis_chart', BI.CompareAxisChart);/** * 图表控件 * @class BI.CompareBarChart * @extends BI.Widget */ BI.CompareBarChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.CompareBarChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-compare-bar-chart" }) }, _init: function () { BI.CompareBarChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, formatter: function () { return this > 0 ? this : (-1) * this; }, gridLineWidth: 0 }]; this.yAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, gridLineWidth: 0, position: "left" }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.CompareBarChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; var yTitle = getXYAxisUnit(this.config.xAxisNumberLevel, this.constants.LEFT_AXIS); var xTitle = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.X_AXIS); config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.yAxis = this.yAxis; config.yAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle + yTitle : yTitle; config.yAxis[0].title.rotation = this.constants.ROTATION; BI.extend(config.yAxis[0], { gridLineWidth: this.config.showGridLine === true ? 1 : 0, lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, maxWidth: '40%' }); self.formatNumberLevelInXaxis(items, this.config.leftYAxisNumberLevel); config.xAxis[0].title.text = this.config.showLeftYAxisTitle === true ? this.config.leftYAxisTitle + xTitle : xTitle; config.xAxis[0].title.align = "center"; BI.extend(config.xAxis[0], { formatter: self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators, true), gridLineWidth: this.config.showGridLine === true ? 1 : 0, lineWidth: this.config.lineWidth, showLabel: this.config.showLabel, enableTick: this.config.enableTick, enableMinorTick: this.config.enableMinorTick }); config.chartType = "bar"; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabelForAxis(config.plotOptions.dataLabels.enabled, items, config.xAxis[0].formatter, this.config.chartFont); config.plotOptions.tooltip.formatter.valueFormat = config.xAxis[0].formatter; //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.xAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, _formatItems: function (items) { var result = []; var i = BI.UUID(); BI.each(items, function (idx, item) { BI.each(item, function (id, it) { BI.each(it.data, function (i, t) { var tmp = t.x; t.x = t.y; t.y = tmp; if (idx === 0) { t.x = -t.x; } }); it.stack = i; }) }); BI.each(items, function (idx, item) { result = BI.concat(result, item); }); return [result]; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.STYLE_NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, xAxisStyle: options.xAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, xAxisNumberLevel: options.xAxisNumberLevel || c.NORMAL, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = this._formatItems(items); var types = []; BI.each(this.options.items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.BAR); }); types.push(type); }); this.combineChart.populate(this.options.items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.CompareBarChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.compare_bar_chart', BI.CompareBarChart);/** * 图表控件 * @class BI.DashboardChart * @extends BI.Widget */ BI.DashboardChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.DashboardChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-dashboard-chart" }) }, _init: function () { BI.DashboardChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.gaugeAxis = [{ "minorTickColor": "rgb(226,226,226)", "tickColor": "rgb(186,186,186)", labelStyle: this.constants.FONT_STYLE, "step": 0, "showLabel": true }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.DashboardChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; var isDashboard = BI.contains([self.constants.NORMAL, self.constants.HALF_DASHBOARD], self.config.chartDashboardType); var isMultiPointers = self.config.numberOfPointer === self.constants.MULTI_POINTER; formatChartDashboardStyle(); config.chartType = "gauge"; delete config.zoom; delete config.xAxis; delete config.yAxis; if (isDashboard && !isMultiPointers) { config.plotOptions.seriesLabel.enabled = false; if(BI.isNull(items[0].data[0].z)) { config.plotOptions.tooltip.formatter.identifier = "${SERIES}${X}${Y}${SIZE}${VALUE}" } } config.gaugeAxis[0].labelStyle = this.config.chartFont; return [items, config]; function formatChartDashboardStyle() { var bands = getBandsStyles(self.config.bandsStyles, self.config.autoCustomStyle); var percentageLabel = BI.extend(config.plotOptions.percentageLabel, { enabled: self.config.showPercentage === BICst.PERCENTAGE.SHOW }); config.gaugeAxis = self.gaugeAxis; var slotValueLAbel = { enabled: true, formatter: function () { var value = this.value; if (self.config.dashboardNumberLevel === BICst.TARGET_STYLE.NUM_LEVEL.PERCENT && self.config.numSeparators) { value = BI.contentFormat(this.value, "#,##0%;-#,##0%") } else if (self.config.dashboardNumberLevel === BICst.TARGET_STYLE.NUM_LEVEL.PERCENT && !self.config.numSeparators) { value = BI.contentFormat(this.value, "#0.00%"); } else if (!(self.config.dashboardNumberLevel === BICst.TARGET_STYLE.NUM_LEVEL.PERCENT) && self.config.numSeparators) { value = BI.contentFormat(this.value, "#,###.##;-#,###.##") } else { value = BI.contentFormat(this.value, "#.##;-#.##"); } var label = '
' + this.seriesName + '
' + '
' + value + getXYAxisUnit(self.config.dashboardNumberLevel, self.constants.DASHBOARD_AXIS) + '
'; if (isDashboard && items[0].data.length > 1) { if (isMultiPointers) { return '
' + this.seriesName + ':' + value + getXYAxisUnit(self.config.dashboardNumberLevel, self.constants.DASHBOARD_AXIS) + '
'; } return label } else if (isDashboard && BI.isNull(items[0].data[0].z)) { return label } return '
' + this.category + '
' + label; }, style: self.config.chartFont, useHtml: true }; switch (self.config.chartDashboardType) { case BICst.CHART_SHAPE.HALF_DASHBOARD: setPlotOptions("pointer_semi", bands, slotValueLAbel, percentageLabel); break; case BICst.CHART_SHAPE.PERCENT_DASHBOARD: setPlotOptions("ring", bands, slotValueLAbel, percentageLabel); break; case BICst.CHART_SHAPE.PERCENT_SCALE_SLOT: setPlotOptions("slot", bands, slotValueLAbel, percentageLabel); break; case BICst.CHART_SHAPE.HORIZONTAL_TUBE: BI.extend(slotValueLAbel, { align: "bottom" }); BI.extend(percentageLabel, { align: "bottom" }); setPlotOptions("thermometer", bands, slotValueLAbel, percentageLabel, "horizontal", "vertical"); break; case BICst.CHART_SHAPE.VERTICAL_TUBE: BI.extend(slotValueLAbel, { align: "left" }); BI.extend(percentageLabel, { align: "left" }); setPlotOptions("thermometer", bands, slotValueLAbel, percentageLabel, "vertical", "horizontal"); break; case BICst.CHART_SHAPE.NORMAL: default: setPlotOptions("pointer", bands, slotValueLAbel, percentageLabel); break; } changeMaxMinScale(); formatNumberLevelInYaxis(self.config.dashboardNumberLevel, self.constants.LEFT_AXIS); if (self.config.dashboardNumberLevel === BICst.TARGET_STYLE.NUM_LEVEL.PERCENT) { config.gaugeAxis[0].formatter = function () { var scaleValue = this; if (self.config.numSeparators) { scaleValue = BI.contentFormat(scaleValue, '#,##0%;-#,##0%') } else { scaleValue = BI.contentFormat(scaleValue, '#0.00%') } return scaleValue + getXYAxisUnit(self.config.dashboardNumberLevel, self.constants.DASHBOARD_AXIS); }; } else { config.gaugeAxis[0].formatter = function () { var value = this; if (self.config.numSeparators) { value = BI.contentFormat(value, "#,###;-#,###") } return value + getXYAxisUnit(self.config.dashboardNumberLevel, self.constants.DASHBOARD_AXIS); }; } } function setPlotOptions(style, bands, slotValueLAbel, percentageLabel, thermometerLayout, layout) { config.style = style; config.plotOptions.bands = bands; config.plotOptions.valueLabel = slotValueLAbel; config.plotOptions.percentageLabel = percentageLabel; config.plotOptions.thermometerLayout = thermometerLayout; config.plotOptions.layout = layout; } function changeMaxMinScale() { self.gaugeAxis[0].min = BI.parseFloat(self.config.minScale) || null; self.gaugeAxis[0].max = BI.parseFloat(self.config.maxScale) || null; } function formatNumberLevelInYaxis(type, position) { var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { if (position === item.yAxis) { da.y = self.formatXYDataWithMagnify(da.y, magnify); } }) }); config.plotOptions.tooltip.formatter.valueFormat = function () { return BI.contentFormat(this, '#.##;-#.##') + getXYAxisUnit(type, position) }; if (self.config.numSeparators) { config.plotOptions.tooltip.formatter.valueFormat = function () { return BI.contentFormat(arguments[0], '#,###.##;-#,###.##') }; } if (type === BICst.TARGET_STYLE.NUM_LEVEL.PERCENT) { config.plotOptions.tooltip.formatter.valueFormat = function () { return BI.contentFormat(arguments[0], '#0.00%') }; if (self.config.numSeparators) { config.plotOptions.tooltip.formatter.valueFormat = function () { return BI.contentFormat(arguments[0], '#,##0%;-#,##0%') }; } } } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.DASHBOARD_AXIS) { self.config.dashboardUnit !== "" && (unit = unit + self.config.dashboardUnit) } return unit; } function getBandsStyles(styles, change) { var min = 0, bands = [], color = null, max = null, conditionMax = null; BI.each(items, function (idx, item) { var data = item.data[0]; if ((BI.isNull(max) || data.y > max)) { max = data.y } }); switch (change) { case BICst.SCALE_SETTING.AUTO: break; case BICst.SCALE_SETTING.CUSTOM: if (styles.length === 0) { return bands } else { var maxScale = _calculateValueNiceDomain(0, max)[1]; BI.each(styles, function (idx, style) { if(BI.parseFloat(style.range.min) > BI.parseFloat(style.range.max)) { return bands.push({ color: color, from: conditionMax, to: maxScale }); } bands.push({ color: style.color, from: style.range.min, to: style.range.max }); color = style.color; conditionMax = style.range.max }); min = BI.parseInt(styles[0].range.min); bands.push({ color: "#808080", from: 0, to: min }); bands.push({ color: color, from: conditionMax, to: maxScale }); return bands; } } } function _calculateValueNiceDomain(minValue, maxValue) { minValue = Math.min(0, minValue); var tickInterval = _linearTickInterval(minValue, maxValue); return _linearNiceDomain(minValue, maxValue, tickInterval); } function _linearTickInterval(minValue, maxValue, m) { m = m || 5; var span = maxValue - minValue; var step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)); var err = m / span * step; if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; return step; } function _linearNiceDomain(minValue, maxValue, tickInterval) { minValue = VanUtils.accMul(Math.floor(minValue / tickInterval), tickInterval); maxValue = VanUtils.accMul(Math.ceil(maxValue / tickInterval), tickInterval); return [minValue, maxValue]; } }, _formatItems: function (items) { if (items.length === 0) { return []; } var c = this.constants; if (this.config.chartDashboardType === c.NORMAL || this.config.chartDashboardType === c.HALF_DASHBOARD) { var result = []; if (this.config.numberOfPointer === c.ONE_POINTER && items[0].length === 1) {//单个系列 BI.each(items[0][0].data, function (idx, da) { result.push({ data: [BI.extend({}, da, { x: items[0][0].name })], name: da.x }) }); return [result]; } else if(this.config.numberOfPointer === c.ONE_POINTER && items[0].length > 1) { BI.each(items[0], function (idx, item) { result.push({ data: [BI.extend(item.data[0], { x: item.name })], name: BI.UUID() }) }); return [result] } if (this.config.numberOfPointer === c.MULTI_POINTER && items[0].length > 1) {//多个系列 BI.each(items, function (idx, item) { BI.each(item, function (id, it) { var data = it.data[0]; data.x = it.name; result.push(data); }) }); return [[{ data: result, name: "" }]]; } } else { var others = []; if (BI.isNotNull(items[0][0].data[0].z)) { BI.each(items[0], function (idx, item) { BI.each(item.data, function (id, da) { others.push({ data: [BI.extend({}, da, { x: item.name, y: da.y })], name: da.x }) }) }); return [others]; } } return items; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants, o = this.options; this.config = { dashboardNumberLevel: options.dashboardNumberLevel || c.NORMAL, dashboardUnit: options.dashboardUnit || "", chartDashboardType: options.chartDashboardType || c.NORMAL, numberOfPointer: options.numberOfPointer || c.ONE_POINTER, bandsStyles: options.bandsStyles || [], autoCustomStyle: options.autoCustom || c.AUTO, minScale: options.minScale, maxScale: options.maxScale, showPercentage: options.showPercentage || c.NOT_SHOW, numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; o.items = this._formatItems(items); var types = []; BI.each(o.items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.DASHBOARD); }); types.push(type); }); this.combineChart.populate(o.items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.DashboardChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.dashboard_chart', BI.DashboardChart);/** * 图表控件 * @class BI.DonutChart * @extends BI.Widget */ BI.DonutChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.DonutChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-donut-chart" }) }, _init: function () { BI.DonutChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.combineChart = BI.createWidget({ type: "bi.combine_chart", popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.DonutChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function(config, items){ var self = this; delete config.zoom; config.colors = this.config.chartColor; config.style = formatChartStyle(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.innerRadius = "50.0%"; config.chartType = "pie"; config.plotOptions.dataLabels.align = "outside"; config.plotOptions.dataLabels.connectorWidth = "outside"; config.plotOptions.dataLabels.style = this.config.chartFont; config.plotOptions.dataLabels.formatter.identifier = "${VALUE}${PERCENT}"; delete config.xAxis; delete config.yAxis; BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { da.y = self.formatXYDataWithMagnify(da.y, 1); }) }); config.legend.style = this.config.chartFont; return [items, config]; function formatChartStyle(){ switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function(idx, axisItems){ var type = []; BI.each(axisItems, function(id, item){ type.push(BICst.WIDGET.DONUT); }); types.push(type); }); this.combineChart.populate(items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function(){ this.combineChart.magnify(); } }); BI.DonutChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.donut_chart', BI.DonutChart);/** * 图表控件 * @class BI.FallAxisChart * @extends BI.Widget */ BI.FallAxisChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.FallAxisChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-fall-axis-chart" }) }, _init: function () { BI.FallAxisChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.yAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "left", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.FallAxisChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function(config, items){ var self = this, o = this.options; var yTitle = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS); config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); config.legend.enabled = false; config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.dataSheet.enabled = this.config.showDataTable; if(config.dataSheet.enabled === true){ config.xAxis[0].showLabel = false; } config.zoom.zoomTool.enabled = this.config.showZoom; if(this.config.showZoom === true){ delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.extend(config.yAxis[0], { lineWidth: this.config.lineWidth, showLabel: this.config.showLabel, enableTick: this.config.enableTick, enableMinorTick: this.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators) }); formatNumberLevelInYaxis(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS, config.yAxis[0].formatter); config.yAxis[0].title.rotation = this.constants.ROTATION; config.yAxis[0].title.text = this.config.showLeftYAxisTitle === true ? this.config.leftYAxisTitle + yTitle : yTitle; config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, enableMinorTick: this.config.enableMinorTick, labelRotation: this.config.textDirection, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); //为了给数据标签加个%,还要遍历所有的系列,唉 if(config.plotOptions.dataLabels.enabled === true){ BI.each(items, function(idx, item){ if(idx === 0){ item.dataLabels = {}; return; } item.dataLabels = { "style": self.config.chartFont, "align": "outside", "autoAdjust": true, enabled: true, formatter: { identifier: "${VALUE}", valueFormat: config.yAxis[0].formatter } }; }); } //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle(){ switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon(){ BI.each(self.config.cordon, function(idx, cor){ if(idx === 0 && self.xAxis.length > 0){ var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function(i, t){ return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": self.config.chartFont, "text": t.text, "align": "top" } }); }); } if(idx > 0 && self.yAxis.length >= idx){ var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function(i, t){ return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function formatNumberLevelInYaxis(type, position, formatter){ var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { if (position === item.yAxis) { da.y = self.formatXYDataWithMagnify(da.y, magnify); } }) }); config.plotOptions.tooltip.formatter.valueFormat = formatter; } function getXYAxisUnit(numberLevelType, position){ var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if(position === self.constants.X_AXIS){ self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if(position === self.constants.LEFT_AXIS){ self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if(position === self.constants.RIGHT_AXIS){ self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, _formatItems: function(items){ var o = this.options; if(BI.isEmptyArray(items)){ return []; } items = items[0]; var tables = [], sum = 0; var colors = this.config.chartColor || []; if(BI.isEmptyArray(colors)){ colors = ["rgb(152, 118, 170)", "rgb(0, 157, 227)"]; } BI.each(items, function(idx, item){ BI.each(item.data, function(i, t){ if(t.y < 0){ tables.push([t.x, t.y, sum + t.y, t]); }else{ tables.push([t.x, t.y, sum, t]); } sum += t.y; }); }); return [BI.map(BI.makeArray(2, null), function(idx, item){ return { "data": BI.map(tables, function(id, cell){ var axis = BI.extend({}, cell[3], { x: cell[0], y: Math.abs(cell[2 - idx]) }); if(idx === 1){ axis.color = cell[2 - idx] < 0 ? colors[1] : colors[0]; }else{ axis.color = "rgba(0,0,0,0)"; axis.borderColor = "rgba(0,0,0,0)"; axis.borderWidth = 0; axis.clickColor = "rgba(0,0,0,0)"; axis.mouseOverColor = "rgba(0,0,0,0)"; axis.tooltip = { enable: false } } return axis; }), stack: "stackedFall", name: idx === 1 ? items[0].name : BI.UUID() }; })]; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", chartColor: options.chartColor || ["#5caae4", "#70cc7f", "#ebbb67", "#e97e7b", "#6ed3c9"], chartStyle: options.chartStyle || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function(idx, axisItems){ var type = []; BI.each(axisItems, function(id, item){ type.push(BICst.WIDGET.AXIS); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function(){ this.combineChart.magnify(); } }); BI.FallAxisChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.fall_axis_chart', BI.FallAxisChart);/** * 图表控件 * @class BI.ForceBubbleChart * @extends BI.Widget */ BI.ForceBubbleChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.ForceBubbleChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-force-bubble-chart" }) }, _init: function () { BI.ForceBubbleChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.combineChart = BI.createWidget({ type: "bi.combine_chart", popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.ForceBubbleChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; config.chartType = 'forceBubble'; config.colors = this.config.chartColor; this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.force = true; config.plotOptions.shadow = this.config.bubbleStyle !== this.constants.NO_PROJECT; config.plotOptions.dataLabels.enabled = true; config.plotOptions.dataLabels.align = "inside"; config.plotOptions.dataLabels.style = this.config.chartFont; config.plotOptions.dataLabels.formatter.identifier = "${CATEGORY}${VALUE}"; delete config.xAxis; delete config.yAxis; delete config.zoom; BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { da.y = self.formatXYDataWithMagnify(da.y, 1); }) }); config.legend.style = this.config.chartFont; return [items, config]; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { chartColor: options.chartColor || [], chartLegend: options.chartLegend || c.LEGEND_BOTTOM, bubbleStyle: options.bubbleStyle || c.NO_PROJECT, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.FORCE_BUBBLE); }); types.push(type); }); this.combineChart.populate(items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.ForceBubbleChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.force_bubble_chart', BI.ForceBubbleChart);/** * 图表控件 * @class BI.GISMapChart * @extends BI.Widget */ BI.GISMapChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.GISMapChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-gis-map-chart" }) }, _init: function () { BI.GISMapChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.combineChart = BI.createWidget({ type: "bi.combine_chart", popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.GISMapChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { delete config.dataSheet; delete config.legend; delete config.zoom; config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.dataLabels.useHtml = true; config.plotOptions.dataLabels.style = this.config.chartFont; config.plotOptions.dataLabels.formatter = function () { var name = (BI.isArray(this.name) ? '' : this.name + ',') + BI.contentFormat(this.value, '#.##;-#.##') ; var style = "padding: 5px; background-color: rgba(0,0,0,0.4980392156862745);border-color: rgb(0,0,0); border-radius:2px; border-width:0px;"; var a = '
' + name + '
'; return a; }; config.plotOptions.tooltip.shared = true; config.plotOptions.tooltip.formatter = function () { var tip = BI.isArray(this.name) ? '' : this.name; BI.each(this.points, function (idx, point) { tip += ('
' + point.seriesName + ':' + BI.contentFormat((point.size || point.y), '#.##;-#.##') + '
'); }); return tip; }; config.geo = { "tileLayer": "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}", "attribution": "© 2016 AutoNavi" }; if (this.config.showBackgroundLayer === true && BI.isNotNull(this.config.backgroundLayerInfo)) { config.geo = {}; if (this.config.backgroundLayerInfo.type === BICst.WMS_SERVER) { config.geo.tileLayer = false; config.geo.wmsUrl = this.config.backgroundLayerInfo.url; config.geo.wmsLayer = this.config.backgroundLayerInfo.wmsLayer } else { config.geo.tileLayer = this.config.backgroundLayerInfo.url; } } config.chartType = "pointMap"; config.plotOptions.icon = { iconUrl: BICst.GIS_ICON_PATH, iconSize: [24, 24] }; config.plotOptions.marker = { symbol: BICst.GIS_ICON_PATH, width: 24, height: 24, enable: true }; delete config.xAxis; delete config.yAxis; return [items, config]; }, _checkLngLatValid: function (lnglat) { if (lnglat.length < 2) { return false; } return lnglat[0] <= 180 && lnglat[0] >= -180 && lnglat[1] <= 90 && lnglat[1] >= -90; }, _formatItems: function (items) { var self = this; var results = []; BI.each(items, function (idx, item) { var result = []; BI.each(item, function (id, it) { var res = []; BI.each(it.data, function (i, da) { da.y = self.formatXYDataWithMagnify(da.y, 1); var lnglat = da.x.split(","); if (self.config.lnglat === self.constants.LAT_FIRST) { var lng = lnglat[1]; lnglat[1] = lnglat[0]; lnglat[0] = lng; } da.lnglat = lnglat; da.value = da.y; da.name = BI.isNotNull(da.z) ? da.z : da.lnglat; if (self._checkLngLatValid(da.lnglat)) { res.push(da); } }); if (BI.isNotEmptyArray(res)) { result.push(BI.extend(it, { data: res })); } }); if (BI.isNotEmptyArray(result)) { results.push(result); } }); return results; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, lnglat: options.lnglat || c.LNG_FIRST, chartFont: options.chartFont || c.FONT_STYLE, showBackgroundLayer: options.showBackgroundLayer || false, backgroundLayerInfo: options.backgroundLayerInfo }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function () { type.push(BICst.WIDGET.GIS_MAP); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.GISMapChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.gis_map_chart', BI.GISMapChart);/** * 图表控件 * @class BI.LineChart * @extends BI.Widget */ BI.LineChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.LineChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-line-chart" }) }, _init: function () { BI.LineChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.LineChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatChartLineStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.each(config.yAxis, function (idx, axis) { var title = ""; switch (axis.axisIndex) { case self.constants.LEFT_AXIS: axis.title.rotation = self.constants.ROTATION; title = getXYAxisUnit(self.config.leftYAxisNumberLevel, self.constants.LEFT_AXIS); axis.title.text = self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + title : title; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.leftYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.leftYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS: title = getXYAxisUnit(self.config.rightYAxisNumberLevel, self.constants.RIGHT_AXIS); axis.title.text = self.config.showRightYAxisTitle === true ? self.config.rightYAxisTitle + title : title; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.rightYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisStyle, self.config.rightYAxisNumberLevel, self.config.rightNumSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.rightYAxisNumberLevel, idx, axis.formatter); break; } }); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, enableMinorTick: self.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); config.chartType = "line"; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabel(config.plotOptions.dataLabels.enabled, items, config, this.config.chartFont); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function formatChartLineStyle() { switch (self.config.chartLineType) { case BICst.CHART_SHAPE.RIGHT_ANGLE: config.plotOptions.curve = false; config.plotOptions.step = true; break; case BICst.CHART_SHAPE.CURVE: config.plotOptions.curve = true; config.plotOptions.step = false; break; case BICst.CHART_SHAPE.NORMAL: default: config.plotOptions.curve = false; config.plotOptions.step = false; break; } } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", rightYAxisTitle: options.rightYAxisTitle || "", chartLineType: options.chartLineType || c.NORMAL, chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, rightYAxisStyle: options.rightYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, showRightYAxisTitle: options.showRightYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, rightYAxisReversed: options.rightYAxisReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, rightYAxisNumberLevel: options.rightYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", rightYAxisUnit: options.rightYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.LINE); }); types.push(type); }); this.yAxis = []; BI.each(types, function (idx, type) { if (BI.isEmptyArray(type)) { return; } var newYAxis = { type: "value", title: { style: self.constants.FONT_STYLE }, labelStyle: self.constants.FONT_STYLE, position: idx > 0 ? "right" : "left", lineWidth: 1, axisIndex: idx, gridLineWidth: 0 }; self.yAxis.push(newYAxis); }); this.combineChart.populate(items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.LineChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.line_chart', BI.LineChart);/** * 图表控件 * @class BI.MapChart * @extends BI.Widget */ BI.MapChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.MapChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-map-chart" }) }, _init: function () { BI.MapChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.combineChart = BI.createWidget({ type: "bi.combine_chart", popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.MapChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, c = this.constants; formatRangeLegend(); delete config.legend; delete config.zoom; config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.tooltip.shared = true; var formatterArray = []; BI.each(items, function (idx, item) { if (BI.has(item, "settings")) { formatterArray.push(formatToolTipAndDataLabel(item.settings.format || c.NORMAL, item.settings.num_level || c.NORMAL, item.settings.unit || "", item.settings.numSeparators || c.NUM_SEPARATORS)); } }); config.plotOptions.tooltip.formatter = function () { var tip = this.name; var point = this.points[0]; var index = BI.isNull(point.size) ? 0 : 1; tip += ('
' + point.seriesName + ':' + BI.contentFormat(point.size || point.y, formatterArray[index]) + '
'); return tip; }; config.plotOptions.dataLabels.formatter.valueFormat = function () { return BI.contentFormat(arguments[0], formatterArray[0]); }; config.plotOptions.dataLabels.style = this.config.chartFont; config.plotOptions.bubble.dataLabels = config.plotOptions.dataLabels; config.plotOptions.bubble.dataLabels.formatter.identifier = "${SIZE}"; config.plotOptions.bubble.tooltip = config.plotOptions.tooltip; config.geo = this.config.geo; if (this.config.showBackgroundLayer === true && BI.isNotNull(this.config.backgroundLayerInfo)) { if (this.config.backgroundLayerInfo.type === BICst.WMS_SERVER) { config.geo.tileLayer = false; config.geo.wmsUrl = this.config.backgroundLayerInfo.url; config.geo.wmsLayer = this.config.backgroundLayerInfo.wmsLayer } else { config.geo.tileLayer = this.config.backgroundLayerInfo.url; } } if (this.config.initDrillPath.length > 1) { config.initDrillPath = this.config.initDrillPath; } config.dTools.enabled = true; config.dTools.click = function (point) { point = point || {}; var pointOption = point.options || {}; self.fireEvent(BI.MapChart.EVENT_CLICK_DTOOL, pointOption); }; config.chartType = "areaMap"; delete config.xAxis; delete config.yAxis; var find = BI.find(items, function (idx, item) { return BI.has(item, "type") && item.type === "areaMap"; }); if (BI.isNull(find)) { items.push({ type: "areaMap", data: [] }) } return [items, config]; function formatRangeLegend() { config.rangeLegend.enabled = true; switch (self.config.chartLegend) { case BICst.CHART_LEGENDS.BOTTOM: config.rangeLegend.visible = true; config.rangeLegend.position = "bottom"; break; case BICst.CHART_LEGENDS.RIGHT: config.rangeLegend.visible = true; config.rangeLegend.position = "right"; break; case BICst.CHART_LEGENDS.NOT_SHOW: config.rangeLegend.visible = false; break; } config.rangeLegend.continuous = false; config.rangeLegend.range = getRangeStyle(self.config.mapStyles, self.config.autoCustom, self.config.themeColor); config.rangeLegend.formatter = function () { var to = this.to; if (BI.isNotEmptyArray(items) && BI.has(items[0], "settings")) { var settings = items[0].settings; var legendFormat = formatToolTipAndDataLabel(settings.format || c.NORMAL, settings.num_level || c.NORMAL, settings.unit || "", settings.numSeparators || c.NUM_SEPARATORS); to = BI.contentFormat(to, legendFormat) } return to }; } function formatToolTipAndDataLabel(format, numberLevel, unit, numSeparators) { var formatter = '#.##'; switch (format) { case self.constants.NORMAL: formatter = '#.##'; if (numSeparators) formatter = '#,###.##'; break; case self.constants.ZERO2POINT: formatter = '#0'; if (numSeparators) formatter = '#,###'; break; case self.constants.ONE2POINT: formatter = '#0.0'; if (numSeparators) formatter = '#,###.0'; break; case self.constants.TWO2POINT: formatter = '#0.00'; if (numSeparators) formatter = '#,###.00'; break; } switch (numberLevel) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: formatter += ''; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: formatter += BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: formatter += BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: formatter += BI.i18nText("BI-Yi"); break; case BICst.TARGET_STYLE.NUM_LEVEL.PERCENT: formatter += '%'; break; } return formatter + unit; } function getRangeStyle(styles, change, defaultColor) { var range = [], color = null, defaultStyle = {}; var conditionMax = null, conditionMin = null, min = null; BI.each(items, function (idx, item) { BI.each(item.data, function (id, it) { if (BI.isNull(min) || BI.parseFloat(min) > BI.parseFloat(it.y)) { min = it.y } }) }); switch (change) { case BICst.SCALE_SETTING.AUTO: defaultStyle.color = defaultColor; return defaultStyle; case BICst.SCALE_SETTING.CUSTOM: if (styles.length !== 0) { var maxScale = _calculateValueNiceDomain(0, self.max)[1]; BI.each(styles, function (idx, style) { if (style.range.max) { range.push({ color: style.color || "rgba(255,255,255,0)", from: style.range.min, to: style.range.max }); } else { var to = style.range.min < maxScale ? maxScale : 266396; range.push({ color: style.color || "rgba(255,255,255,0)", from: style.range.min, to: to, }); } color = style.color; conditionMax = style.range.max }); conditionMin = BI.parseFloat(styles[0].range.min); if (conditionMin !== 0) { range.push({ color: "#808080", from: 0, to: conditionMin }); } if (conditionMax && conditionMax < maxScale) { range.push({ color: color || "rgba(255,255,255,0)", from: conditionMax, to: maxScale }); } return range; } else { defaultStyle.color = defaultColor; return defaultStyle; } } } function _calculateValueNiceDomain(minValue, maxValue) { minValue = Math.min(0, minValue); var tickInterval = _linearTickInterval(minValue, maxValue); return _linearNiceDomain(minValue, maxValue, tickInterval); } function _linearTickInterval(minValue, maxValue, m) { m = m || 5; var span = maxValue - minValue; var step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)); var err = m / span * step; if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; return step; } function _linearNiceDomain(minValue, maxValue, tickInterval) { minValue = VanUtils.accMul(Math.floor(minValue / tickInterval), tickInterval); maxValue = VanUtils.accMul(Math.ceil(maxValue / tickInterval), tickInterval); return [minValue, maxValue]; } }, _formatDrillItems: function (items) { var self = this; BI.each(items.series, function (idx, da) { var hasArea = false; BI.each(da.data, function (idx, data) { data.y = self.formatXYDataWithMagnify(data.y, 1); if (BI.has(da, "settings")) { data.y = self.formatXYDataWithMagnify(data.y, self.calcMagnify(da.settings.num_level || self.constants.NORMAL)); } if (BI.has(da, "type") && da.type == "bubble") { data.name = data.x; data.size = data.y; } else { data.name = data.x; data.value = data.y; } if (BI.has(da, "type") && da.type === "areaMap") { hasArea = true; } if (BI.has(data, "drilldown")) { self._formatDrillItems(data.drilldown); } }); if (hasArea === false) { items.series.push({ type: "areaMap", data: [] }); } }); }, _formatItems: function (items) { var self = this; this.max = null; this.min = null; BI.each(items, function (idx, item) { BI.each(item, function (id, it) { BI.each(it.data, function (i, da) { da.y = self.formatXYDataWithMagnify(da.y, 1); if (BI.has(it, "settings")) { da.y = self.formatXYDataWithMagnify(da.y, self.calcMagnify(it.settings.num_level || self.constants.NORMAL)); } if ((BI.isNull(self.max) || BI.parseFloat(da.y) > BI.parseFloat(self.max)) && id === 0) { self.max = da.y; } if ((BI.isNull(self.min) || BI.parseFloat(da.y) < BI.parseFloat(self.min)) && id === 0) { self.min = da.y; } if (BI.has(it, "type") && it.type == "bubble") { da.name = da.x; da.size = da.y; } else { da.name = da.x; da.value = da.y; } if (BI.has(da, "drilldown")) { self._formatDrillItems(da.drilldown); } }); }) }); return items; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, geo: options.geo, initDrillPath: options.initDrillPath || [], tooltip: options.tooltip || "", themeColor: options.themeColor || "#65bce7", mapStyles: options.mapStyles || [], autoCustom: options.autoCustom || c.AUTO_CUSTOM, showBackgroundLayer: options.showBackgroundLayer || false, backgroundLayerInfo: options.backgroundLayerInfo, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.MAP); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.MapChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.MapChart.EVENT_CLICK_DTOOL = "EVENT_CLICK_DTOOL"; BI.shortcut('bi.map_chart', BI.MapChart);/** * 图表控件 * @class BI.MultiAxisChart * @extends BI.Widget * leftYxis 左值轴属性 * rightYxis 右值轴属性 * xAxis 分类轴属性 */ BI.MultiAxisChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.MultiAxisChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-multi-axis-chart" }) }, _init: function () { BI.MultiAxisChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: {"fontFamily": "inherit", "color": "#808080", "fontSize": "12px", "fontWeight": ""} }, labelStyle: { "fontFamily": "inherit", "color": "#808080", "fontSize": "12px" }, position: "bottom", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.MultiAxisChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; config.colors = this.config.chartColor; config.style = this.formatChartStyle(); this.formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.each(config.yAxis, function (idx, axis) { var title = ""; switch (axis.axisIndex) { case self.constants.LEFT_AXIS: title = self.getXYAxisUnit(self.config.leftYAxisNumberLevel, self.constants.LEFT_AXIS); axis.title.text = self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + title : title; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.leftYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.leftYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS: title = self.getXYAxisUnit(self.config.rightYAxisNumberLevel, self.constants.RIGHT_AXIS); axis.title.text = self.config.showRightYAxisTitle === true ? self.config.rightYAxisTitle + title : title; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.rightYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisStyle, self.config.rightYAxisNumberLevel, self.config.rightNumSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.rightYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS_SECOND: title = self.getXYAxisUnit(self.config.rightYAxisSecondNumberLevel, self.constants.RIGHT_AXIS_SECOND); axis.title.text = self.config.showRightYAxisSecondTitle === true ? self.config.rightYAxisSecondTitle + title : title; axis.title.rotation = self.constants.ROTATION; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.rightYAxisSecondReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisSecondStyle, self.config.rightYAxisSecondNumberLevel, self.config.rightNumSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.rightYAxisSecondNumberLevel, idx, axis.formatter); break; default: break; } }); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, enableMinorTick: this.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabel(config.plotOptions.dataLabels.enabled, items, config, this.config.chartFont); //全局样式的图表文字 if (config.dataSheet) { config.dataSheet.style = this.config.chartFont; } config.xAxis[0].title.style = config.xAxis[0].labelStyle = this.config.chartFont; config.legend.style = this.config.chartFont; config.plotOptions.dataLabels.style = this.config.chartFont; BI.each(config.yAxis, function (idx, axis) { axis.title.style = self.config.chartFont; }); return [items, config]; }, formatChartStyle: function () { switch (this.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } }, formatCordon: function () { var self = this; var magnify = 1; BI.each(this.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": { "fontFamily": "inherit", "color": "#808080", "fontSize": "12px", "fontWeight": "" }, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; default: break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": { "fontFamily": "inherit", "color": "#808080", "fontSize": "12px", "fontWeight": "" }, "text": t.text, "align": "left" } }); }); } }) }, getXYAxisUnit: function (numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; default: break; } if (position === this.constants.X_AXIS) { this.config.xAxisUnit !== "" && (unit = unit + this.config.xAxisUnit) } if (position === this.constants.LEFT_AXIS) { this.config.leftYAxisUnit !== "" && (unit = unit + this.config.leftYAxisUnit) } if (position === this.constants.RIGHT_AXIS) { this.config.rightYAxisUnit !== "" && (unit = unit + this.config.rightYAxisUnit) } if (position === this.constants.RIGHT_AXIS_SECOND) { this.config.rightYAxisSecondUnit !== "" && (unit = unit + this.config.rightYAxisSecondUnit) } return unit === "" ? unit : "(" + unit + ")"; }, populate: function (items, options, types) { var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", rightYAxisTitle: options.rightYAxisTitle || "", rightYAxisSecondTitle: options.rightYAxisSecondTitle || "", chartColor: options.chartColor || ["#5caae4", "#70cc7f", "#ebbb67", "#e97e7b", "#6ed3c9"], chartStyle: options.chartStyle || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, rightYAxisStyle: options.rightYAxisStyle || c.NORMAL, rightYAxisSecondStyle: options.rightYAxisSecondStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, showRightYAxisTitle: options.showRightYAxisTitle || false, showRightYAxisSecondTitle: options.showRightYAxisSecondTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, rightYAxisReversed: options.rightYAxisReversed || false, rightYAxisSecondReversed: options.rightYAxisSecondReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, rightYAxisNumberLevel: options.rightYAxisNumberLevel || c.NORMAL, rightYAxisSecondNumberLevel: options.rightYAxisSecondNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", rightYAxisUnit: options.rightYAxisUnit || "", rightYAxisSecondUnit: options.rightYAxisSecondUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; this.yAxis = []; BI.each(types, function (idx, type) { if (BI.isEmptyArray(type)) { return; } var newYAxis = { type: "value", title: { style: {"fontFamily": "inherit", "color": "#808080", "fontSize": "12px", "fontWeight": ""} }, labelStyle: { "fontFamily": "inherit", "color": "#808080", "fontSize": "12px" }, position: idx > 0 ? "right" : "left", lineWidth: 1, axisIndex: idx, gridLineWidth: 0 }; self.yAxis.push(newYAxis); }); this.combineChart.populate(items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.MultiAxisChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.multi_axis_chart', BI.MultiAxisChart);/** * 图表控件 * @class BI.MultiAxisChart * @extends BI.Widget * leftYxis 左值轴属性 * rightYxis 右值轴属性 * xAxis 分类轴属性 */ BI.MultiAxisCombineChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.MultiAxisCombineChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-multi-axis-combine-chart" }) }, _init: function () { BI.MultiAxisCombineChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: {"fontFamily": "inherit", "color": "#808080", "fontSize": "12px", "fontWeight": ""} }, labelStyle: { "fontFamily": "inherit", "color": "#808080", "fontSize": "12px" }, position: "bottom", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.MultiAxisCombineChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; config.colors = this.config.chartColor; config.style = this.formatChartStyle(); this.formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; BI.each(config.yAxis, function (idx, axis) { var title = ""; switch (axis.axisIndex) { case self.constants.LEFT_AXIS: title = self.getXYAxisUnit(self.config.leftYAxisNumberLevel, self.constants.LEFT_AXIS); axis.title.text = self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + title : title; axis.title.rotation = self.constants.ROTATION; axis.labelStyle.color = axis.lineColor = axis.tickColor = config.colors[0]; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.leftYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.leftYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS: title = self.getXYAxisUnit(self.config.rightYAxisNumberLevel, self.constants.RIGHT_AXIS); axis.title.text = self.config.showRightYAxisTitle === true ? self.config.rightYAxisTitle + title : title; axis.title.rotation = self.constants.ROTATION; axis.labelStyle.color = axis.lineColor = axis.tickColor = config.colors[1]; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.rightYAxisReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisStyle, self.config.rightYAxisNumberLevel, self.config.rightNumSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.rightYAxisNumberLevel, idx, axis.formatter); break; case self.constants.RIGHT_AXIS_SECOND: title = self.getXYAxisUnit(self.config.rightYAxisSecondNumberLevel, self.constants.RIGHT_AXIS_SECOND); axis.title.text = self.config.showRightYAxisSecondTitle === true ? self.config.rightYAxisSecondTitle + title : title; axis.title.rotation = self.constants.ROTATION; axis.labelStyle.color = axis.lineColor = axis.tickColor = config.colors[2]; BI.extend(axis, { lineWidth: self.config.lineWidth, showLabel: self.config.showLabel, enableTick: self.config.enableTick, reversed: self.config.rightYAxisSecondReversed, enableMinorTick: self.config.enableMinorTick, gridLineWidth: self.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(self.config.rightYAxisSecondStyle, self.config.rightYAxisSecondNumberLevel, self.config.rightNumSeparators) }); self.formatNumberLevelInYaxis(config, items, self.config.rightYAxisSecondNumberLevel, idx, axis.formatter); break; default: break; } }); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, enableMinorTick: this.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabel(config.plotOptions.dataLabels.enabled, items, config, this.config.chartFont); //全局样式的图表文字 if (config.dataSheet) { config.dataSheet.style = this.config.chartFont; } config.xAxis[0].title.style = config.xAxis[0].labelStyle = this.config.chartFont; config.legend.style = this.config.chartFont; config.plotOptions.dataLabels.style = this.config.chartFont; BI.each(config.yAxis, function (idx, axis) { axis.title.style = self.config.chartFont; }); return [items, config]; }, formatChartStyle: function () { switch (this.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } }, formatCordon: function () { var self = this; var magnify = 1; BI.each(this.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": { "fontFamily": "inherit", "color": "#808080", "fontSize": "12px", "fontWeight": "" }, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; default: break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": { "fontFamily": "inherit", "color": "#808080", "fontSize": "12px", "fontWeight": "" }, "text": t.text, "align": "left" } }); }); } }) }, getXYAxisUnit: function (numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; default: break; } if (position === this.constants.X_AXIS) { this.config.xAxisUnit !== "" && (unit = unit + this.config.xAxisUnit) } if (position === this.constants.LEFT_AXIS) { this.config.leftYAxisUnit !== "" && (unit = unit + this.config.leftYAxisUnit) } if (position === this.constants.RIGHT_AXIS) { this.config.rightYAxisUnit !== "" && (unit = unit + this.config.rightYAxisUnit) } if (position === this.constants.RIGHT_AXIS_SECOND) { this.config.rightYAxisSecondUnit !== "" && (unit = unit + this.config.rightYAxisSecondUnit) } return unit === "" ? unit : "(" + unit + ")"; }, populate: function (items, options, types) { var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", rightYAxisTitle: options.rightYAxisTitle || "", rightYAxisSecondTitle: options.rightYAxisSecondTitle || "", chartColor: options.chartColor || ["#5caae4", "#70cc7f", "#ebbb67", "#e97e7b", "#6ed3c9"], chartStyle: options.chartStyle || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, rightYAxisStyle: options.rightYAxisStyle || c.NORMAL, rightYAxisSecondStyle: options.rightYAxisSecondStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, showRightYAxisTitle: options.showRightYAxisTitle || false, showRightYAxisSecondTitle: options.showRightYAxisSecondTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, rightYAxisReversed: options.rightYAxisReversed || false, rightYAxisSecondReversed: options.rightYAxisSecondReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, rightYAxisNumberLevel: options.rightYAxisNumberLevel || c.NORMAL, rightYAxisSecondNumberLevel: options.rightYAxisSecondNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", rightYAxisUnit: options.rightYAxisUnit || "", rightYAxisSecondUnit: options.rightYAxisSecondUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; this.yAxis = []; BI.each(types, function (idx, type) { if (BI.isEmptyArray(type)) { return; } var newYAxis = { type: "value", title: { style: {"fontFamily": "inherit", "color": "#808080", "fontSize": "12px", "fontWeight": ""} }, labelStyle: { "fontFamily": "inherit", "color": "#808080", "fontSize": "12px" }, position: idx > 0 ? "right" : "left", lineWidth: 1, axisIndex: idx, gridLineWidth: 0 }; self.yAxis.push(newYAxis); }); this.combineChart.populate(items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.MultiAxisCombineChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.multi_axis_combine_chart', BI.MultiAxisCombineChart);/** * 图表控件 * @class BI.PercentAccumulateAreaChart * @extends BI.Widget */ BI.PercentAccumulateAreaChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.PercentAccumulateAreaChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-percent-accumulate-area-chart" }) }, _init: function () { BI.PercentAccumulateAreaChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.yAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "left", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.PercentAccumulateAreaChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; config.yAxis[0].title.text = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS); config.yAxis[0].title.rotation = this.constants.ROTATION; BI.extend(config.yAxis[0], { lineWidth: this.config.lineWidth, showLabel: this.config.showLabel, enableTick: this.config.enableTick, reversed: this.config.leftYAxisReversed, enableMinorTick: this.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators) }); self.formatNumberLevelInYaxis(config, items, this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS, config.yAxis[0].formatter, true); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); config.chartType = "area"; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabelForAxis(config.plotOptions.dataLabels.enabled, items, config.yAxis[0].formatter, this.config.chartFont, true); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } unit = unit === "" ? unit : "(" + unit + ")"; return self.config.showLeftYAxisTitle === true ? self.config.leftYAxisTitle + unit : unit } }, _formatItems: function (items) { return BI.map(items, function (idx, item) { var i = BI.UUID(); return BI.map(item, function (id, it) { return BI.extend({}, it, {stack: i, stackByPercent: true}); }); }); }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.AREA); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.PercentAccumulateAreaChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.percent_accumulate_area_chart', BI.PercentAccumulateAreaChart);/** * 图表控件 百分比堆积柱状 * @class BI.PercentAccumulateAxisChart * @extends BI.Widget */ BI.PercentAccumulateAxisChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.PercentAccumulateAxisChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-percent-accumulate-axis-chart" }) }, _init: function () { BI.PercentAccumulateAxisChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.yAxis = [{ type: "value", title: { style: self.constants.FONT_STYLE }, labelStyle: self.constants.FONT_STYLE, position: "left", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.PercentAccumulateAxisChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this, o = this.options; var yTitle = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS); config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.dataSheet.enabled = this.config.showDataTable; config.xAxis[0].showLabel = !config.dataSheet.enabled; config.zoom.zoomTool.enabled = this.config.showZoom; if (this.config.showZoom === true) { delete config.dataSheet; delete config.zoom.zoomType; } config.yAxis = this.yAxis; config.yAxis[0].title.rotation = this.constants.ROTATION; config.yAxis[0].title.text = this.config.showLeftYAxisTitle === true ? this.config.leftYAxisTitle + yTitle : yTitle; BI.extend(config.yAxis[0], { lineWidth: this.config.lineWidth, showLabel: this.config.showLabel, enableTick: this.config.enableTick, reversed: this.config.leftYAxisReversed, enableMinorTick: this.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, formatter: self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators) }); self.formatNumberLevelInYaxis(config, items, this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS, config.yAxis[0].formatter, true); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, enableMinorTick: this.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabelForAxis(config.plotOptions.dataLabels.enabled, items, config.yAxis[0].formatter, this.config.chartFont, true); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, _formatItems: function (items) { return BI.map(items, function (idx, item) { var i = BI.UUID(); return BI.map(item, function (id, it) { return BI.extend({}, it, {stack: i, stackByPercent: true}); }); }); }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showDataTable: options.showDataTable || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, showZoom: options.showZoom || false, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.AXIS); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.PercentAccumulateAxisChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.percent_accumulate_axis_chart', BI.PercentAccumulateAxisChart);/** * 图表控件 * @class BI.PieChart * @extends BI.Widget */ BI.PieChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.PieChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-pie-chart" }) }, _init: function () { BI.PieChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.combineChart = BI.createWidget({ type: "bi.combine_chart", popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.PieChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function(config, items){ var self = this, o = this.options; delete config.zoom; config.colors = this.config.chartColor; config.style = formatChartStyle(); formatChartPieStyle(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.tooltip.formatter.identifier = "${CATEGORY}${SERIES}${VALUE}${PERCENT}"; config.chartType = "pie"; delete config.xAxis; delete config.yAxis; config.plotOptions.dataLabels.align = "outside"; config.plotOptions.dataLabels.connectorWidth = "outside"; config.plotOptions.dataLabels.formatter.identifier = "${VALUE}${PERCENT}"; config.plotOptions.dataLabels.style = this.config.chartFont; BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { da.y = self.formatXYDataWithMagnify(da.y, 1); }) }); config.legend.style = this.config.chartFont; return [items, config]; function formatChartStyle(){ switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatChartPieStyle(){ switch (self.config.chartPieType){ case BICst.CHART_SHAPE.EQUAL_ARC_ROSE: config.plotOptions.roseType = "sameArc"; break; case BICst.CHART_SHAPE.NOT_EQUAL_ARC_ROSE: config.plotOptions.roseType = "differentArc"; break; case BICst.CHART_SHAPE.NORMAL: default: delete config.plotOptions.roseType; break; } config.plotOptions.innerRadius = self.config.chartInnerRadius + "%"; config.plotOptions.endAngle = self.config.chartTotalAngle; } }, //目前饼图不会有多个系列,如果有多个就要把它们合并在一起 _isNeedConvert: function(items){ var result = BI.find(items, function(idx, item){ return item.length > 1; }); return BI.isNotNull(result); }, _formatItems: function(items){ if(this._isNeedConvert(items)){ //把每个坐标轴所有的多个系列合并成一个系列 return BI.map(items, function(idx, item){ var seriesItem = []; var obj = {data: [], name: ""}; seriesItem.push(obj); BI.each(item, function(id, series){ BI.each(series.data, function(i, da){ obj.data.push(BI.extend({}, da, {x: series.name})); }); }); return seriesItem; }) }else{ return items; } }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, chartPieType: options.chartPieType || c.NORMAL, chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, chartInnerRadius: options.chartInnerRadius || 0, chartTotalAngle: options.chartTotalAngle || BICst.PIE_ANGLES.TOTAL, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function(idx, axisItems){ var type = []; BI.each(axisItems, function(id, item){ type.push(BICst.WIDGET.PIE); }); types.push(type); }); this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function(){ this.combineChart.magnify(); } }); BI.PieChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.pie_chart', BI.PieChart); /** * 图表控件 * @class BI.RadarChart * @extends BI.Widget */ BI.RadarChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.RadarChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-radar-chart" }) }, _init: function () { BI.RadarChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.radiusAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, formatter: function () { return this > 0 ? this : (-1) * this }, gridLineWidth: 0, position: "bottom" }]; this.angleAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.RadarChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this; delete config.zoom; var title = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS); config.colors = this.config.chartColor; config.style = formatChartStyle(); formatChartRadarStyle(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.radiusAxis = this.radiusAxis; config.angleAxis = this.angleAxis; config.radiusAxis[0].formatter = self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators); formatNumberLevelInYaxis(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS, config.radiusAxis[0].formatter); config.radiusAxis[0].title.text = this.config.showLeftYAxisTitle === true ? this.config.leftYAxisTitle + title : title; config.radiusAxis[0].gridLineWidth = this.config.showGridLine === true ? 1 : 0; config.chartType = "radar"; delete config.xAxis; delete config.yAxis; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabelForAxis(config.plotOptions.dataLabels.enabled, items, config.radiusAxis[0].formatter, this.config.chartFont); //全局样式 config.legend.style = this.config.chartFont; config.radiusAxis[0].title.style = config.radiusAxis[0].labelStyle = this.config.chartFont; config.angleAxis[0].title.style = config.angleAxis[0].labelStyle = this.config.chartFont; return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatChartRadarStyle() { switch (self.config.chartRadarType) { case BICst.CHART_SHAPE.POLYGON: config.plotOptions.shape = "polygon"; break; case BICst.CHART_SHAPE.CIRCLE: config.plotOptions.shape = "circle"; break; } } function formatNumberLevelInYaxis(type, position, formatter) { var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { if (position === item.yAxis) { da.y = self.formatXYDataWithMagnify(da.y, magnify); } }) }); config.plotOptions.tooltip.formatter.valueFormat = formatter; } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { chartRadarType: options.chartRadarType || c.POLYGON, chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.STYLE_NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, cordon: options.cordon || [], numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.RADAR); }); types.push(type); }); this.combineChart.populate(items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.RadarChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.radar_chart', BI.RadarChart);/** * 图表控件 * @class BI.RangeAreaChart * @extends BI.Widget * 范围面积图的构造范围的两组item的必须有对应y值item1完全大于item2 */ BI.RangeAreaChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.RangeAreaChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-range-area-chart" }) }, _init: function () { BI.RangeAreaChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "category", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.yAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "left", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.RangeAreaChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this; var title = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS); config.colors = this.config.chartColor; config.style = formatChartStyle(); formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.connectNulls = this.config.nullContinue; config.yAxis = this.yAxis; config.yAxis[0].title.rotation = this.constants.ROTATION; config.yAxis[0].title.text = this.config.showLeftYAxisTitle === true ? this.config.leftYAxisTitle + title : title; BI.extend(config.yAxis[0], { lineWidth: this.config.lineWidth, showLabel: this.config.showLabel, enableTick: this.config.enableTick, enableMinorTick: this.config.enableMinorTick, gridLineWidth: this.config.showGridLine === true ? 1 : 0, reversed: config.yAxis[0].reversed = this.config.leftYAxisReversed, formatter: self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators) }); formatNumberLevelInYaxis(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS, config.yAxis[0].formatter); config.xAxis[0].title.align = "center"; config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle : ""; BI.extend(config.xAxis[0], { lineWidth: this.config.lineWidth, enableTick: this.config.enableTick, labelRotation: this.config.textDirection, gridLineWidth: this.config.showGridLine === true ? 1 : 0, maxHeight: '40%' }); config.chartType = "area"; config.plotOptions.tooltip.formatter.identifier = "${CATEGORY}${VALUE}"; //为了给数据标签加个%,还要遍历所有的系列,唉 this.formatDataLabelForAxis(config.plotOptions.dataLabels.enabled, items, config.yAxis[0].formatter, this.config.chartFont); //全局样式的图表文字 this.setFontStyle(this.config.chartFont, config); return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style" : self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function formatNumberLevelInYaxis(type, position, formatter) { var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { if (position === item.yAxis) { da.y = self.formatXYDataWithMagnify(da.y, magnify); } }) }); config.plotOptions.tooltip.formatter.valueFormat = formatter; } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, _formatItems: function (data) { var o = this.options; var items = []; BI.each(data, function (idx, item) { items = BI.concat(items, item); }); if (BI.isEmptyArray(items)) { return []; } if (items.length === 1) { return [items]; } var colors = this.config.chartColor || []; if (BI.isEmptyArray(colors)) { colors = ["#5caae4"]; } var seriesMinus = []; BI.each(items[0].data, function (idx, item) { var res = items[1].data[idx].y - item.y; seriesMinus.push({ x: items[1].data[idx].x, y: res, targetIds: items[1].data[idx].targetIds }); }); items[1] = { data: seriesMinus, name: items[1].name, stack: "stackedArea", fillColor: colors[0] }; BI.each(items, function (idx, item) { if (idx === 0) { BI.extend(item, { name: items[0].name, fillColorOpacity: 0, stack: "stackedArea", marker: {enabled: false}, fillColor: "#000000" }); } }); return [items]; }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", chartColor: options.chartColor || [], chartStyle: options.chartStyle || c.NORMAL, leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, leftYAxisReversed: options.leftYAxisReversed || false, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, textDirection: options.textDirection || 0, cordon: options.cordon || [], lineWidth: BI.isNull(options.lineWidth) ? 1 : options.lineWidth, showLabel: BI.isNull(options.showLabel) ? true : options.showLabel, enableTick: BI.isNull(options.enableTick) ? true : options.enableTick, enableMinorTick: BI.isNull(options.enableMinorTick) ? true : options.enableMinorTick, numSeparators: options.numSeparators || false, chartFont: options.chartFont || c.FONT_STYLE, nullContinue: options.nullContinue || false }; this.options.items = items; var types = []; var type = []; BI.each(items, function (idx, axisItems) { type.push(BICst.WIDGET.AREA); }); if (BI.isNotEmptyArray(type)) { types.push(type); } this.combineChart.populate(this._formatItems(items), types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.RangeAreaChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.range_area_chart', BI.RangeAreaChart);/** * 图表控件 * @class BI.ScatterChart * @extends BI.Widget */ BI.ScatterChart = BI.inherit(BI.AbstractChart, { _defaultConfig: function () { return BI.extend(BI.ScatterChart.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-scatter-chart" }) }, _init: function () { BI.ScatterChart.superclass._init.apply(this, arguments); var self = this, o = this.options; this.xAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "bottom", gridLineWidth: 0 }]; this.yAxis = [{ type: "value", title: { style: this.constants.FONT_STYLE }, labelStyle: this.constants.FONT_STYLE, position: "left", gridLineWidth: 0 }]; this.combineChart = BI.createWidget({ type: "bi.combine_chart", xAxis: this.xAxis, popupItemsGetter: o.popupItemsGetter, formatConfig: BI.bind(this._formatConfig, this), element: this.element }); this.combineChart.on(BI.CombineChart.EVENT_CHANGE, function (obj) { self.fireEvent(BI.ScatterChart.EVENT_CHANGE, obj); }); this.combineChart.on(BI.CombineChart.EVENT_ITEM_CLICK, function (obj) { self.fireEvent(BI.AbstractChart.EVENT_ITEM_CLICK, obj) }); }, _formatConfig: function (config, items) { var self = this; delete config.zoom; config.colors = this.config.chartColor; config.style = formatChartStyle(); config.plotOptions.marker = {"symbol": "circle", "radius": 4.5, "enabled": true}; formatCordon(); this.formatChartLegend(config, this.config.chartLegend); config.plotOptions.dataLabels.enabled = this.config.showDataLabel; config.plotOptions.dataLabels.formatter.identifier = "${X}${Y}"; config.yAxis = this.yAxis; config.xAxis = this.xAxis; config.yAxis[0].formatter = self.formatTickInXYaxis(this.config.leftYAxisStyle, this.config.leftYAxisNumberLevel, this.config.numSeparators); formatNumberLevelInYaxis(this.config.leftYAxisNumberLevel); config.yAxis[0].title.text = getXYAxisUnit(this.config.leftYAxisNumberLevel, this.constants.LEFT_AXIS); config.yAxis[0].title.text = this.config.showLeftYAxisTitle === true ? this.config.leftYAxisTitle + config.yAxis[0].title.text : config.yAxis[0].title.text; config.yAxis[0].gridLineWidth = this.config.showGridLine === true ? 1 : 0; config.yAxis[0].title.rotation = this.constants.ROTATION; config.yAxis[0].maxWidth = '40%'; config.xAxis[0].formatter = self.formatTickInXYaxis(this.config.xAxisStyle, this.config.xAxisNumberLevel, this.config.rightNumSeparators); formatNumberLevelInXaxis(this.config.xAxisNumberLevel); config.xAxis[0].title.text = getXYAxisUnit(this.config.xAxisNumberLevel, this.constants.X_AXIS); config.xAxis[0].title.text = this.config.showXAxisTitle === true ? this.config.xAxisTitle + config.xAxis[0].title.text : config.xAxis[0].title.text; config.xAxis[0].title.align = "center"; config.xAxis[0].gridLineWidth = this.config.showGridLine === true ? 1 : 0; config.xAxis[0].maxHeight = '40%'; config.chartType = "scatter"; if (BI.isNotEmptyArray(this.config.tooltip)) { config.plotOptions.tooltip.formatter = function () { var y = self.formatTickInXYaxis(self.config.leftYAxisStyle, self.config.leftYAxisNumberLevel, self.config.numSeparators)(this.y); var x = self.formatTickInXYaxis(self.config.xAxisStyle, self.config.xAxisNumberLevel, self.config.rightNumSeparators)(this.x); return this.seriesName + '
(X)' + self.config.tooltip[0] + ':' + x + '
(Y)' + self.config.tooltip[1] + ':' + y + '
' }; } if (config.plotOptions.dataLabels.enabled === true) { BI.each(items, function (idx, item) { item.dataLabels = { "style": self.config.chartFont, "align": "outside", "autoAdjust": true, enabled: true, formatter: { identifier: "${X}${Y}", "XFormat": function () { return BI.contentFormat(arguments[0], '#.##;-#.##') }, "YFormat": function () { return BI.contentFormat(arguments[0], '#.##;-#.##') } } }; item.dataLabels.formatter.XFormat = config.xAxis[0].formatter; item.dataLabels.formatter.YFormat = config.yAxis[0].formatter; }); } //全局样式图表文字 config.legend.style = this.config.chartFont; config.yAxis[0].title.style = config.yAxis[0].labelStyle = this.config.chartFont; config.xAxis[0].title.style = config.xAxis[0].labelStyle = this.config.chartFont; return [items, config]; function formatChartStyle() { switch (self.config.chartStyle) { case BICst.CHART_STYLE.STYLE_GRADUAL: return "gradual"; case BICst.CHART_STYLE.STYLE_NORMAL: default: return "normal"; } } function formatCordon() { BI.each(self.config.cordon, function (idx, cor) { if (idx === 0 && self.xAxis.length > 0) { var magnify = self.calcMagnify(self.config.xAxisNumberLevel); self.xAxis[0].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": self.config.chartFont, "text": t.text, "align": "top" } }); }); } if (idx > 0 && self.yAxis.length >= idx) { var magnify = 1; switch (idx - 1) { case self.constants.LEFT_AXIS: magnify = self.calcMagnify(self.config.leftYAxisNumberLevel); break; case self.constants.RIGHT_AXIS: magnify = self.calcMagnify(self.config.rightYAxisNumberLevel); break; case self.constants.RIGHT_AXIS_SECOND: magnify = self.calcMagnify(self.config.rightYAxisSecondNumberLevel); break; } self.yAxis[idx - 1].plotLines = BI.map(cor, function (i, t) { return BI.extend(t, { value: t.value.div(magnify), width: 1, label: { "style": self.config.chartFont, "text": t.text, "align": "left" } }); }); } }) } function formatNumberLevelInXaxis(type) { var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { da.x = self.formatXYDataWithMagnify(da.x, magnify); }) }) } function formatNumberLevelInYaxis(type) { var magnify = self.calcMagnify(type); BI.each(items, function (idx, item) { BI.each(item.data, function (id, da) { da.y = self.formatXYDataWithMagnify(da.y, magnify); }) }); } function getXYAxisUnit(numberLevelType, position) { var unit = ""; switch (numberLevelType) { case BICst.TARGET_STYLE.NUM_LEVEL.NORMAL: unit = ""; break; case BICst.TARGET_STYLE.NUM_LEVEL.TEN_THOUSAND: unit = BI.i18nText("BI-Wan"); break; case BICst.TARGET_STYLE.NUM_LEVEL.MILLION: unit = BI.i18nText("BI-Million"); break; case BICst.TARGET_STYLE.NUM_LEVEL.YI: unit = BI.i18nText("BI-Yi"); break; } if (position === self.constants.X_AXIS) { self.config.xAxisUnit !== "" && (unit = unit + self.config.xAxisUnit) } if (position === self.constants.LEFT_AXIS) { self.config.leftYAxisUnit !== "" && (unit = unit + self.config.leftYAxisUnit) } if (position === self.constants.RIGHT_AXIS) { self.config.rightYAxisUnit !== "" && (unit = unit + self.config.rightYAxisUnit) } return unit === "" ? unit : "(" + unit + ")"; } }, populate: function (items, options) { options || (options = {}); var self = this, c = this.constants; this.config = { leftYAxisTitle: options.leftYAxisTitle || "", chartColor: options.chartColor || [], leftYAxisStyle: options.leftYAxisStyle || c.NORMAL, xAxisStyle: options.xAxisStyle || c.NORMAL, showXAxisTitle: options.showXAxisTitle || false, showLeftYAxisTitle: options.showLeftYAxisTitle || false, xAxisNumberLevel: options.xAxisNumberLevel || c.NORMAL, leftYAxisNumberLevel: options.leftYAxisNumberLevel || c.NORMAL, xAxisUnit: options.xAxisUnit || "", leftYAxisUnit: options.leftYAxisUnit || "", xAxisTitle: options.xAxisTitle || "", chartLegend: options.chartLegend || c.LEGEND_BOTTOM, showDataLabel: options.showDataLabel || false, showGridLine: BI.isNull(options.showGridLine) ? true : options.showGridLine, cordon: options.cordon || [], tooltip: options.tooltip || [], numSeparators: options.numSeparators || false, rightNumSeparators: options.rightNumSeparators || false, chartFont: options.chartFont || c.FONT_STYLE }; this.options.items = items; var types = []; BI.each(items, function (idx, axisItems) { var type = []; BI.each(axisItems, function (id, item) { type.push(BICst.WIDGET.SCATTER); }); types.push(type); }); this.combineChart.populate(items, types); }, resize: function () { this.combineChart.resize(); }, magnify: function () { this.combineChart.magnify(); } }); BI.ScatterChart.EVENT_CHANGE = "EVENT_CHANGE"; BI.shortcut('bi.scatter_chart', BI.ScatterChart);