You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by ov...@apache.org on 2020/05/19 09:30:27 UTC
[incubator-echarts] 01/01: fix(tooltip): richText for
series-specific formatters #12232
This is an automated email from the ASF dual-hosted git repository.
ovilia pushed a commit to branch fix-12232
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git
commit 5a94212c43f0a4b5a8da7c26cf20192d29fb1d02
Author: Ovilia <zw...@gmail.com>
AuthorDate: Tue May 19 17:27:43 2020 +0800
fix(tooltip): richText for series-specific formatters #12232
---
src/chart/radar/RadarSeries.js | 7 +-
src/component/tooltip/TooltipContent.js | 15 +-
src/component/tooltip/TooltipRichContent.js | 37 ++-
test/tooltip-textStyle.html | 455 ++++++++++++++++++++++++++++
4 files changed, 506 insertions(+), 8 deletions(-)
diff --git a/src/chart/radar/RadarSeries.js b/src/chart/radar/RadarSeries.js
index ba713d0..9533b23 100644
--- a/src/chart/radar/RadarSeries.js
+++ b/src/chart/radar/RadarSeries.js
@@ -49,16 +49,17 @@ var RadarSeries = SeriesModel.extend({
});
},
- formatTooltip: function (dataIndex) {
+ formatTooltip: function (dataIndex, multipleSeries, dataType, renderMode) {
var data = this.getData();
var coordSys = this.coordinateSystem;
var indicatorAxes = coordSys.getIndicatorAxes();
var name = this.getData().getName(dataIndex);
- return encodeHTML(name === '' ? this.name : name) + '<br/>'
+ var newLine = renderMode === 'html' ? '<br/>' : '\n';
+ return encodeHTML(name === '' ? this.name : name) + newLine
+ zrUtil.map(indicatorAxes, function (axis, idx) {
var val = data.get(data.mapDimension(axis.dim), dataIndex);
return encodeHTML(axis.name + ' : ' + val);
- }).join('<br />');
+ }).join(newLine);
},
/**
diff --git a/src/component/tooltip/TooltipContent.js b/src/component/tooltip/TooltipContent.js
index 6cdbc3f..ca29179 100644
--- a/src/component/tooltip/TooltipContent.js
+++ b/src/component/tooltip/TooltipContent.js
@@ -60,8 +60,21 @@ function assembleFont(textStyleModel) {
cssText.push('font:' + textStyleModel.getFont());
+ var lineHeight = textStyleModel.get('lineHeight');
+ if (lineHeight == null) {
+ lineHeight = Math.round(fontSize * 3 / 2);
+ }
+
fontSize
- && cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px');
+ && cssText.push('line-height:' + lineHeight + 'px');
+
+ var shadowColor = textStyleModel.get('textShadowColor');
+ var shadowBlur = textStyleModel.get('textShadowBlur') || 0;
+ var shadowOffsetX = textStyleModel.get('textShadowOffsetX') || 0;
+ var shadowOffsetY = textStyleModel.get('textShadowOffsetY') || 0;
+ shadowBlur
+ && cssText.push('text-shadow:' + shadowOffsetX + 'px ' + shadowOffsetY + 'px '
+ + shadowBlur + 'px ' + shadowColor);
each(['decoration', 'align'], function (name) {
var val = textStyleModel.get(name);
diff --git a/src/component/tooltip/TooltipRichContent.js b/src/component/tooltip/TooltipRichContent.js
index 34c0f75..6721d98 100644
--- a/src/component/tooltip/TooltipRichContent.js
+++ b/src/component/tooltip/TooltipRichContent.js
@@ -20,6 +20,7 @@
import * as zrUtil from 'zrender/src/core/util';
// import Group from 'zrender/src/container/Group';
import Text from 'zrender/src/graphic/Text';
+import * as graphicUtil from '../../util/graphic';
/**
* @alias module:echarts/component/tooltip/TooltipRichContent
@@ -106,16 +107,44 @@ TooltipRichContent.prototype = {
startId = text.indexOf('{marker');
}
+ var textStyleModel = tooltipModel.getModel('textStyle');
+ var fontSize = textStyleModel.get('fontSize');
+ var lineHeight = tooltipModel.get('textLineHeight');
+ if (lineHeight == null) {
+ lineHeight = Math.round(fontSize * 3 / 2);
+ }
+
this.el = new Text({
- style: {
+ // style: {
+ // rich: markers,
+ // text: content,
+ // textLineHeight: 20,
+ // textBackgroundColor: tooltipModel.get('backgroundColor'),
+ // textBorderRadius: tooltipModel.get('borderRadius'),
+ // textFill: tooltipModel.get('textStyle.color'),
+ // textPadding: tooltipModel.get('padding'),
+ // fontStyle: tooltipModel.get('fontStyle'),
+ // fontWeight: tooltipModel.get('fontWeight'),
+ // fontFamily: tooltipModel.get('fontFamily'),
+ // fontSize: tooltipModel.get('fontSize'),
+ // lineHeight: tooltipModel.get('lineHeight'),
+ // width: tooltipModel.get('width'),
+ // height: tooltipModel.get('height'),
+ // textBorderColor: tooltipModel.get('textBorderColor'),
+ // textBorderWidth: tooltipModel.get('textBorderWidth'),
+ // textShadowBlur: tooltipModel.get('textShadowBlur'),
+ // textShadowOffsetX: tooltipModel.get('textShadowOffsetX'),
+ // textShadowOffsetY: tooltipModel.get('textShadowOffsetY')
+ // },
+ style: graphicUtil.setTextStyle({}, textStyleModel, {
rich: markers,
text: content,
- textLineHeight: 20,
textBackgroundColor: tooltipModel.get('backgroundColor'),
textBorderRadius: tooltipModel.get('borderRadius'),
textFill: tooltipModel.get('textStyle.color'),
- textPadding: tooltipModel.get('padding')
- },
+ textPadding: tooltipModel.get('padding'),
+ textLineHeight: lineHeight
+ }),
z: tooltipModel.get('z')
});
this._zr.add(this.el);
diff --git a/test/tooltip-textStyle.html b/test/tooltip-textStyle.html
new file mode 100644
index 0000000..e111013
--- /dev/null
+++ b/test/tooltip-textStyle.html
@@ -0,0 +1,455 @@
+<!DOCTYPE html>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <script src="lib/esl.js"></script>
+ <script src="lib/config.js"></script>
+ <script src="lib/jquery.min.js"></script>
+ <script src="lib/facePrint.js"></script>
+ <script src="lib/testHelper.js"></script>
+ <!-- <script src="ut/lib/canteen.js"></script> -->
+ <link rel="stylesheet" href="lib/reset.css" />
+ </head>
+ <body>
+ <style>
+ </style>
+
+
+
+ <div id="main0"></div>
+
+
+ <div id="main1"></div>
+
+
+ <div id="main2"></div>
+
+
+ <div id="main3"></div>
+
+
+ <div id="main4"></div>
+
+
+ <div id="main5"></div>
+
+
+
+
+
+
+
+
+
+ <script>
+ require(['echarts'/*, 'map/js/china' */], function (echarts) {
+ var option;
+ // $.getJSON('./data/nutrients.json', function (data) {});
+
+ option = {
+ xAxis: {},
+ yAxis: {},
+ tooltip: {
+ textStyle: {
+ fontSize: 20,
+ textShadowColor: 'red',
+ textShadowBlur: 10
+ },
+ formatter: '{a}: {c}',
+ alwaysShowContent: true
+ },
+ series: {
+ type: 'line',
+ data: [[11, 22], [33, 44]]
+ }
+ };
+
+ var chart = testHelper.create(echarts, 'main0', {
+ title: [
+ 'trigger: **"item"**',
+ 'renderMode: **"html"**',
+ 'It should have red text shadow and font size being 20px'
+ ],
+ option: option
+ });
+
+ chart.dispatchAction({
+ type: 'showTip',
+ seriesIndex: 0,
+ dataIndex: 0
+ });
+ });
+ </script>
+
+
+
+
+
+
+
+
+ <script>
+ require(['echarts'/*, 'map/js/china' */], function (echarts) {
+ var option;
+ // $.getJSON('./data/nutrients.json', function (data) {});
+
+ option = {
+ xAxis: {},
+ yAxis: {},
+ tooltip: {
+ textStyle: {
+ fontSize: 20,
+ textShadowColor: 'red',
+ textShadowBlur: 10
+ },
+ formatter: '{a}: {c}',
+ alwaysShowContent: true,
+ renderMode: 'richText'
+ },
+ series: {
+ type: 'line',
+ data: [[11, 22], [33, 44]]
+ }
+ };
+
+ var chart = testHelper.create(echarts, 'main1', {
+ title: [
+ 'trigger: **"item"**',
+ 'renderMode: **"richText"**',
+ 'It should have red text shadow and font size being 20px'
+ ],
+ option: option
+ // height: 300,
+ // buttons: [{text: 'btn-txt', onclick: function () {}}],
+ // recordCanvas: true,
+ });
+
+ chart.dispatchAction({
+ type: 'showTip',
+ seriesIndex: 0,
+ dataIndex: 0
+ });
+ });
+ </script>
+
+
+
+
+
+
+
+
+ <script>
+ require(['echarts'/*, 'map/js/china' */], function (echarts) {
+ var option;
+ // $.getJSON('./data/nutrients.json', function (data) {});
+
+ option = {
+ xAxis: {},
+ yAxis: {},
+ tooltip: {
+ textStyle: {
+ color: '#fff',
+ fontStyle: 'italic',
+ fontWeight: 'bold',
+ fontFamily: 'monospace',
+ fontSize: 20,
+ textBorderColor: 'blue',
+ textBorderWidth: 1,
+ textShadowColor: 'red',
+ textShadowBlur: 10
+ },
+ formatter: function (params) {
+ return params.map(function (param) {
+ return param.seriesName + ': ' + param.value;
+ }).join('<br>');
+ },
+ alwaysShowContent: true,
+ trigger: 'axis'
+ },
+ series: [{
+ type: 'line',
+ data: [[11, 22], [33, 44]]
+ }, {
+ type: 'line',
+ data: [[11, 33], [22, 55]]
+ }]
+ };
+
+ var chart = testHelper.create(echarts, 'main2', {
+ title: [
+ 'trigger: **"axis"**',
+ 'renderMode: **"html"**',
+ 'It should have **two lines** of red text shadow and font size being 20px'
+ ],
+ option: option
+ // height: 300,
+ // buttons: [{text: 'btn-txt', onclick: function () {}}],
+ // recordCanvas: true,
+ });
+
+ chart.dispatchAction({
+ type: 'showTip',
+ // dataIndex: 0,
+ x: 300,
+ y: 100
+ });
+ });
+ </script>
+
+
+
+
+
+
+
+
+ <script>
+ require(['echarts'/*, 'map/js/china' */], function (echarts) {
+ var option;
+ // $.getJSON('./data/nutrients.json', function (data) {});
+
+ option = {
+ xAxis: {},
+ yAxis: {},
+ tooltip: {
+ textStyle: {
+ color: '#fff',
+ fontStyle: 'italic',
+ fontWeight: 'bold',
+ fontFamily: 'monospace',
+ fontSize: 20,
+ textBorderColor: 'blue',
+ textBorderWidth: 1,
+ textShadowColor: 'red',
+ textShadowBlur: 10
+ },
+ formatter: function (params) {
+ return params.map(function (param) {
+ return param.seriesName + ': ' + param.value;
+ }).join('\n');
+ },
+ alwaysShowContent: true,
+ trigger: 'axis',
+ renderMode: 'richText'
+ },
+ series: [{
+ type: 'line',
+ data: [[11, 22], [33, 44]]
+ }, {
+ type: 'line',
+ data: [[11, 33], [22, 55]]
+ }]
+ };
+
+ var chart = testHelper.create(echarts, 'main3', {
+ title: [
+ 'trigger: **"axis"**',
+ 'renderMode: **"richText"**',
+ 'It should have **two lines** of red text shadow and font size being 20px'
+ ],
+ option: option
+ // height: 300,
+ // buttons: [{text: 'btn-txt', onclick: function () {}}],
+ // recordCanvas: true,
+ });
+
+ chart.dispatchAction({
+ type: 'showTip',
+ // dataIndex: 0,
+ x: 300,
+ y: 100
+ });
+ });
+ </script>
+
+
+
+
+
+
+
+
+ <script>
+ require(['echarts'/*, 'map/js/china' */], function (echarts) {
+ var option;
+ // $.getJSON('./data/nutrients.json', function (data) {});
+
+ option = {
+ tooltip: {
+ alwaysShowContent: true,
+ textStyle: {
+ fontSize: 20,
+ textShadowColor: 'red',
+ textShadowBlur: 10
+ }
+ },
+ radar: {
+ radius: [50, '70%'],
+ name: {
+ formatter:'【{value}】',
+ color:'#72ACD1'
+ },
+ triggerEvent: true,
+ indicator: [
+ { text: '销售(sales)', max: 100},
+ { text: '管理(Administration)', max: 16000},
+ { text: '信息技术(Information Techology)', max: 30000},
+ { text: '客服(Customer Support)', max: 38000},
+ { text: '研发(Development)', max: 52000},
+ { text: '市场(Marketing)', max: 25000}
+ ]
+ },
+ series: [{
+ name: '预算 vs 开销(Budget vs spending)',
+ type: 'radar',
+ label: {
+ normal: {
+ show: true
+ }
+ },
+ // areaStyle: {normal: {}},
+ data : [
+ {
+ value : [0, 10000, 28000, 35000, 50000, 19000],
+ name : '预算分配(Allocated Budget)'
+ },
+ {
+ value : [50, 14000, 28000, 31000, '-', 21000],
+ name : '实际开销(Actual Spending)含有 "-" 数据'
+ },
+ {
+ value: ['-', 8000, 20000, 20000, 40000, 10000],
+ name: '第一个元素是 null'
+ }
+ ]
+ }]
+ };
+
+ var chart = testHelper.create(echarts, 'main4', {
+ title: [
+ 'renderMode: **"richText"**',
+ 'Radar series tooltip'
+ ],
+ option: option
+ // height: 300,
+ // buttons: [{text: 'btn-txt', onclick: function () {}}],
+ // recordCanvas: true,
+ });
+
+ chart.dispatchAction({
+ type: 'showTip',
+ seriesIndex: 0,
+ dataIndex: 0
+ });
+ });
+ </script>
+
+
+
+
+
+
+
+
+ <script>
+ require(['echarts'/*, 'map/js/china' */], function (echarts) {
+ var option;
+ // $.getJSON('./data/nutrients.json', function (data) {});
+
+ option = {
+ tooltip: {
+ renderMode: 'richText',
+ textStyle: {
+ alwaysShowContent: true,
+ fontSize: 20,
+ textShadowColor: 'red',
+ textShadowBlur: 10
+ }
+ },
+ radar: {
+ radius: [50, '70%'],
+ name: {
+ formatter:'【{value}】',
+ color:'#72ACD1'
+ },
+ triggerEvent: true,
+ indicator: [
+ { text: '销售(sales)', max: 100},
+ { text: '管理(Administration)', max: 16000},
+ { text: '信息技术(Information Techology)', max: 30000},
+ { text: '客服(Customer Support)', max: 38000},
+ { text: '研发(Development)', max: 52000},
+ { text: '市场(Marketing)', max: 25000}
+ ]
+ },
+ series: [{
+ name: '预算 vs 开销(Budget vs spending)',
+ type: 'radar',
+ label: {
+ normal: {
+ show: true
+ }
+ },
+ // areaStyle: {normal: {}},
+ data : [
+ {
+ value : [0, 10000, 28000, 35000, 50000, 19000],
+ name : '预算分配(Allocated Budget)'
+ },
+ {
+ value : [50, 14000, 28000, 31000, '-', 21000],
+ name : '实际开销(Actual Spending)含有 "-" 数据'
+ },
+ {
+ value: ['-', 8000, 20000, 20000, 40000, 10000],
+ name: '第一个元素是 null'
+ }
+ ]
+ }]
+ };
+
+ var chart = testHelper.create(echarts, 'main5', {
+ title: [
+ 'renderMode: **"richText"**',
+ 'Radar series tooltip'
+ ],
+ option: option
+ // height: 300,
+ // buttons: [{text: 'btn-txt', onclick: function () {}}],
+ // recordCanvas: true,
+ });
+
+ chart.dispatchAction({
+ type: 'showTip',
+ seriesIndex: 0,
+ dataIndex: 0
+ });
+ });
+ </script>
+
+
+ </body>
+</html>
+
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org