diff --git a/superset/assets/src/chart/Chart.jsx b/superset/assets/src/chart/Chart.jsx index 43d13b18451..0d550272d67 100644 --- a/superset/assets/src/chart/Chart.jsx +++ b/superset/assets/src/chart/Chart.jsx @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Tooltip } from 'react-bootstrap'; +import dompurify from 'dompurify'; import ChartBody from './ChartBody'; import Loading from '../components/Loading'; @@ -180,9 +181,13 @@ class Chart extends React.PureComponent { positionLeft={this.state.tooltip.x + 30} arrowOffsetTop={10} > -
+ {typeof (this.state.tooltip.content) === 'string' ? +
+ : + this.state.tooltip.content + } ); } diff --git a/superset/assets/src/visualizations/deckgl/layers/common.js b/superset/assets/src/visualizations/deckgl/layers/common.jsx similarity index 82% rename from superset/assets/src/visualizations/deckgl/layers/common.js rename to superset/assets/src/visualizations/deckgl/layers/common.jsx index 0a446dd0984..8a3ecc5c7c2 100644 --- a/superset/assets/src/visualizations/deckgl/layers/common.js +++ b/superset/assets/src/visualizations/deckgl/layers/common.jsx @@ -1,4 +1,4 @@ -import dompurify from 'dompurify'; +import React from 'react'; import { fitBounds } from 'viewport-mercator-project'; import d3 from 'd3'; @@ -37,10 +37,14 @@ export function commonLayerProps(formData, slice) { let onHover; let tooltipContentGenerator; if (fd.js_tooltip) { - const unsanitizedTooltipGenerator = sandboxedEval(fd.js_tooltip); - tooltipContentGenerator = o => dompurify.sanitize(unsanitizedTooltipGenerator(o)); + tooltipContentGenerator = sandboxedEval(fd.js_tooltip); } else if (fd.line_column && fd.line_type === 'geohash') { - tooltipContentGenerator = o => `${fd.line_column}: ${o.object[fd.line_column]}`; + tooltipContentGenerator = o => ( +
+
{fd.line_column}: {o.object[fd.line_column]}
+ {fd.metric && +
{fd.metric}: {o.object[fd.metric]}
} +
); } if (tooltipContentGenerator) { onHover = (o) => {