diff --git a/superset/assets/package.json b/superset/assets/package.json index c427a6dfc5212..7eaa845e4bf90 100644 --- a/superset/assets/package.json +++ b/superset/assets/package.json @@ -45,6 +45,7 @@ "dependencies": { "@data-ui/event-flow": "^0.0.54", "@data-ui/sparkline": "^0.0.54", + "@data-ui/xy-chart": "^0.0.61", "@vx/responsive": "0.0.153", "babel-register": "^6.24.1", "bootstrap": "^3.3.6", diff --git a/superset/assets/src/modules/visUtils.js b/superset/assets/src/modules/visUtils.js index 974417966c3ea..62e5725eebecf 100644 --- a/superset/assets/src/modules/visUtils.js +++ b/superset/assets/src/modules/visUtils.js @@ -1,14 +1,105 @@ -export function getTextWidth(text, fontDetails = '12px Roboto') { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('2d'); - if (context) { - // Won't work outside of a browser context (ie unit tests) - context.font = fontDetails; - return context.measureText(text).width; +const SVG_NS = 'http://www.w3.org/2000/svg'; + +function isDefined(x) { + return x !== null && x !== undefined; +} + +export function getTextDimension({ + text, + className, + style, + container = document.body, +}) { + const textNode = document.createElementNS(SVG_NS, 'text'); + textNode.textContent = text; + + if (isDefined(className)) { + textNode.setAttribute('class', className); + } + + if (isDefined(style)) { + ['font', 'fontWeight', 'fontStyle', 'fontSize', 'fontFamily'] + .filter(field => isDefined(style[field])) + .forEach((field) => { + textNode.style[field] = style[field]; + }); + } + + const svg = document.createElementNS(SVG_NS, 'svg'); + svg.style.position = 'absolute'; // so it won't disrupt page layout + svg.style.opacity = 0; // and not visible + svg.appendChild(textNode); + container.appendChild(svg); + let result; + if (textNode.getBBox) { + const bbox = textNode.getBBox(); + // round up + result = { + width: Math.ceil(bbox.width), + height: Math.ceil(bbox.height), + }; + } else { + // Handle when called from non-browser and do not support getBBox() + result = { + width: 100, + height: 100, + }; } - return 100; + container.removeChild(svg); + return result; +} + +/** + * Shim to support legacy calls + */ +export function getTextWidth(text, font = '12px Roboto') { + return getTextDimension({ text, style: { font } }).width; } -export default { - getTextWidth, -}; +export function computeMaxFontSize({ + text, + idealFontSize, + maxWidth, + maxHeight, + className, + style, + container, +}) { + let size = idealFontSize; + if (!isDefined(idealFontSize)) { + if (isDefined(maxHeight)) { + size = Math.floor(maxHeight); + } else { + throw new Error('You must specify at least one of maxHeight or idealFontSize'); + } + } + + function computeDimension(fontSize) { + return getTextDimension({ + text, + className, + style: { ...style, fontSize }, + container, + }); + } + + let textDimension = computeDimension(size); + + // Decrease size until textWidth is less than maxWidth + if (isDefined(maxWidth)) { + while (textDimension.width > maxWidth) { + size -= 2; + textDimension = computeDimension(size); + } + } + + // Decrease size until textHeight is less than maxHeight + if (isDefined(maxHeight)) { + while (textDimension.height > maxHeight) { + size -= 2; + textDimension = computeDimension(size); + } + } + + return size; +} diff --git a/superset/assets/src/visualizations/BigNumber.jsx b/superset/assets/src/visualizations/BigNumber.jsx new file mode 100644 index 0000000000000..6b3e5b79ce998 --- /dev/null +++ b/superset/assets/src/visualizations/BigNumber.jsx @@ -0,0 +1,274 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ReactDOM from 'react-dom'; +import { XYChart, AreaSeries, CrossHair, LinearGradient } from '@data-ui/xy-chart'; + +import { brandColor } from '../modules/colors'; +import { d3FormatPreset } from '../modules/utils'; +import { formatDateVerbose } from '../modules/dates'; +import { computeMaxFontSize } from '../modules/visUtils'; + +import './big_number.css'; + +const CHART_MARGIN = { + top: 4, + right: 4, + bottom: 4, + left: 4, +}; + +const PROPORTION = { + HEADER: 0.4, + SUBHEADER: 0.14, + HEADER_WITH_TRENDLINE: 0.3, + SUBHEADER_WITH_TRENDLINE: 0.125, + TRENDLINE: 0.3, +}; + +function renderTooltipFactory(formatValue) { + return function renderTooltip({ datum }) { // eslint-disable-line + const { x: rawDate, y: rawValue } = datum; + const formattedDate = formatDateVerbose(rawDate); + const value = formatValue(rawValue); + + return ( +
+ {formattedDate} +
+ {value} +
+ ); + }; +} + +function identity(x) { + return x; +} + +const propTypes = { + className: PropTypes.string, + width: PropTypes.number.isRequired, + height: PropTypes.number.isRequired, + bigNumber: PropTypes.number.isRequired, + formatBigNumber: PropTypes.func, + subheader: PropTypes.string, + showTrendline: PropTypes.bool, + trendlineData: PropTypes.array, + mainColor: PropTypes.string, + gradientId: PropTypes.string, + renderTooltip: PropTypes.func, +}; +const defaultProps = { + className: '', + formatBigNumber: identity, + subheader: '', + showTrendline: false, + trendlineData: null, + mainColor: brandColor, + gradientId: '', + renderTooltip: renderTooltipFactory(identity), +}; + +class BigNumberVis extends React.Component { + getClassName() { + const { className, showTrendline } = this.props; + const names = `big_number ${className}`; + if (showTrendline) { + return names; + } + return `${names} no_trendline`; + } + + createTemporaryContainer() { + const container = document.createElement('div'); + container.className = this.getClassName(); + container.style.position = 'absolute'; // so it won't disrupt page layout + container.style.opacity = 0; // and not visible + return container; + } + + renderHeader(maxHeight) { + const { bigNumber, formatBigNumber, width } = this.props; + const text = formatBigNumber(bigNumber); + + const container = this.createTemporaryContainer(); + document.body.appendChild(container); + const fontSize = computeMaxFontSize({ + text, + maxWidth: width, + maxHeight, + className: 'header_line', + container, + }); + document.body.removeChild(container); + + return ( +
+ {text} +
+ ); + } + + renderSubheader(maxHeight) { + const { subheader, width } = this.props; + let fontSize = 0; + if (subheader) { + const container = this.createTemporaryContainer(); + document.body.appendChild(container); + fontSize = computeMaxFontSize({ + text: subheader, + maxWidth: width, + maxHeight, + className: 'subheader_line', + container, + }); + document.body.removeChild(container); + } + + return ( +
+ {subheader} +
+ ); + } + + renderTrendline(maxHeight) { + const { + width, + trendlineData, + mainColor, + subheader, + renderTooltip, + gradientId, + } = this.props; + return ( + + + + + + ); + } + + render() { + const { showTrendline, height } = this.props; + const className = this.getClassName(); + + if (showTrendline) { + const chartHeight = Math.floor(PROPORTION.TRENDLINE * height); + const allTextHeight = height - chartHeight; + return ( +
+
+ {this.renderHeader(Math.ceil(PROPORTION.HEADER_WITH_TRENDLINE * height))} + {this.renderSubheader(Math.ceil(PROPORTION.SUBHEADER_WITH_TRENDLINE * height))} +
+ {this.renderTrendline(chartHeight)} +
+ ); + } + return ( +
+ {this.renderHeader(Math.ceil(PROPORTION.HEADER * height))} + {this.renderSubheader(Math.ceil(PROPORTION.SUBHEADER * height))} +
+ ); + } +} + +BigNumberVis.propTypes = propTypes; +BigNumberVis.defaultProps = defaultProps; + +function adaptor(slice, payload) { + const { formData, containerId } = slice; + const { data, subheader, compare_suffix: compareSuffix } = payload.data; + const compareLag = Number(payload.data.compare_lag); + const supportTrendline = formData.viz_type === 'big_number'; + const showTrendline = supportTrendline && formData.show_trend_line; + const formatValue = d3FormatPreset(formData.y_axis_format); + const bigNumber = supportTrendline ? data[data.length - 1][1] : data[0][0]; + + let percentChange = 0; + let formattedSubheader = subheader; + + if (supportTrendline && compareLag > 0) { + const compareIndex = data.length - (compareLag + 1); + if (compareIndex >= 0) { + const compareValue = data[compareIndex][1]; + percentChange = compareValue === 0 + ? 0 : (bigNumber - compareValue) / Math.abs(compareValue); + const formatPercentChange = d3.format('+.1%'); + formattedSubheader = `${formatPercentChange(percentChange)} ${compareSuffix}`; + } + } + + const trendlineData = showTrendline ? data.map(([x, y]) => ({ x, y })) : null; + + let className = ''; + if (percentChange > 0) { + className = 'positive'; + } else if (percentChange < 0) { + className = 'negative'; + } + + ReactDOM.render( + , + document.getElementById(containerId), + ); +} + +export default adaptor; diff --git a/superset/assets/src/visualizations/big_number.css b/superset/assets/src/visualizations/big_number.css index 8fd5345ee793e..d748137fd794d 100644 --- a/superset/assets/src/visualizations/big_number.css +++ b/superset/assets/src/visualizations/big_number.css @@ -1,31 +1,38 @@ -.big_number g.axis text, -.big_number_total g.axis text { - font-size: 10px; - font-weight: normal; - color: gray; - fill: gray; - text-anchor: middle; - alignment-baseline: middle; - font-weight: none; +.big_number { + font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif; + position: relative; + overflow: hidden; + display: flex; + flex-direction: column; + justify-content: center; } -.big_number text.big, -.big_number_total text.big{ - stroke: black; - text-anchor: middle; - fill: black; +.big_number.no_trendline .subheader_line { + padding-bottom: 0.3em; } -.big_number g.tick line, -.big_number_total g.tick line{ - stroke-width: 1px; - stroke: grey; +.big_number .text_container { + overflow: hidden; + display: flex; + flex-direction: column; + justify-content: center; } -.big_number .domain, -.big_number_total .domain{ - fill: none; - stroke: black; - stroke-width: 1; +.big_number .header_line { + position: relative; + line-height: 1em; + font-weight: 600; } +.big_number .header_line span { + position: absolute; + bottom: 0; + left: 0; + right: 0; +} + +.big_number .subheader_line { + line-height: 1em; + padding-bottom: 0; + font-weight: 200; +} diff --git a/superset/assets/src/visualizations/big_number.js b/superset/assets/src/visualizations/big_number.js deleted file mode 100644 index cd02ec915e2d1..0000000000000 --- a/superset/assets/src/visualizations/big_number.js +++ /dev/null @@ -1,231 +0,0 @@ -import d3 from 'd3'; -import d3tip from 'd3-tip'; -import dompurify from 'dompurify'; -import { d3FormatPreset, d3TimeFormatPreset } from '../modules/utils'; - -import './big_number.css'; -import '../../stylesheets/d3tip.css'; - -function bigNumberVis(slice, payload) { - const div = d3.select(slice.selector); - // Define the percentage bounds that define color from red to green - div.html(''); // reset - const fd = slice.formData; - const json = payload.data; - - const f = d3FormatPreset(fd.y_axis_format); - const fp = d3.format('+.1%'); - const formatDate = d3TimeFormatPreset('smart_date'); - const width = slice.width(); - const height = slice.height(); - const svg = div.append('svg'); - svg.attr('width', width); - svg.attr('height', height); - const data = json.data; - let vCompare; - let v; - if (fd.viz_type === 'big_number') { - v = data[data.length - 1][1]; - } else { - v = data[0][0]; - } - if (json.compare_lag > 0) { - const pos = data.length - (json.compare_lag + 1); - if (pos >= 0) { - const vAnchor = data[pos][1]; - if (vAnchor !== 0) { - vCompare = (v - vAnchor) / Math.abs(vAnchor); - } else { - vCompare = 0; - } - } - } - const dateExt = d3.extent(data, d => d[0]); - const valueExt = d3.extent(data, d => d[1]); - - const vMargin = 20; - const hMargin = 10; - const scaleX = d3.time.scale.utc().domain(dateExt).range([hMargin, width - hMargin]); - const scaleY = d3.scale.linear().domain(valueExt).range([height - (vMargin), vMargin]); - const colorRange = [d3.hsl(0, 1, 0.3), d3.hsl(120, 1, 0.3)]; - const scaleColor = d3.scale - .linear().domain([-1, 1]) - .interpolate(d3.interpolateHsl) - .range(colorRange) - .clamp(true); - const line = d3.svg.line() - .x(function (d) { - return scaleX(d[0]); - }) - .y(function (d) { - return scaleY(d[1]); - }) - .interpolate('cardinal'); - - let y = height / 2; - let g = svg.append('g'); - // Printing big number - g.append('g').attr('class', 'digits') - .attr('opacity', 1) - .append('text') - .attr('x', width / 2) - .attr('y', y) - .attr('class', 'big') - .attr('alignment-baseline', 'middle') - .attr('id', 'bigNumber') - .style('font-weight', 'bold') - .style('cursor', 'pointer') - .text(f(v)) - .style('font-size', d3.min([height, width]) / 3.5) - .style('text-anchor', 'middle') - .attr('fill', 'black'); - - // Printing big number subheader text - if (json.subheader !== null) { - g.append('text') - .attr('x', width / 2) - .attr('y', (height / 16) * 12) - .text(json.subheader) - .attr('id', 'subheader_text') - .style('font-size', d3.min([height, width]) / 8) - .style('text-anchor', 'middle'); - } - - if (fd.viz_type === 'big_number') { - // Drawing trend line - if (fd.show_trend_line) { - g.append('path') - .attr('d', function () { - return line(data); - }) - .attr('stroke-width', 5) - .attr('opacity', 0.5) - .attr('fill', 'none') - .attr('stroke-linecap', 'round') - .attr('stroke', 'grey'); - - g = svg.append('g') - .attr('class', 'digits') - .attr('opacity', 1); - - if (vCompare !== null) { - y = (height / 8) * 3; - } - } - - const c = scaleColor(vCompare); - - // Printing compare % - if (vCompare) { - g.append('text') - .attr('x', width / 2) - .attr('y', (height / 16) * 12) - .text(fp(vCompare) + json.compare_suffix) - .style('font-size', d3.min([height, width]) / 8) - .style('text-anchor', 'middle') - .attr('fill', c) - .attr('stroke', c); - } - - const gAxis = svg.append('g').attr('class', 'axis').attr('opacity', 0); - g = gAxis.append('g'); - const xAxis = d3.svg.axis() - .scale(scaleX) - .orient('bottom') - .ticks(Math.round(2 + (width / 150))) - .tickFormat(formatDate); - g.call(xAxis); - g.attr('transform', 'translate(0,' + (height - vMargin) + ')'); - - g = gAxis.append('g').attr('transform', 'translate(' + (width - hMargin) + ',0)'); - const yAxis = d3.svg.axis() - .scale(scaleY) - .orient('left') - .tickFormat(f) - .tickValues(valueExt); - - g.call(yAxis); - g.selectAll('text') - .style('text-anchor', 'end') - .attr('y', '-7') - .attr('x', '-4'); - - g.selectAll('text') - .style('font-size', '10px'); - - const renderTooltip = (d) => { - const date = formatDate(d[0]); - const value = dompurify.sanitize(f(d[1])); - return ` -
- ${date}: - ${value} -
- `; - }; - - const tip = d3tip() - .attr('class', 'd3-tip') - .direction('n') - .offset([-5, 0]) - .html(renderTooltip); - svg.call(tip); - - // Add the scatterplot and trigger the mouse events for the tooltips - svg - .selectAll('dot') - .data(data) - .enter() - .append('circle') - .attr('r', 3) - .attr('stroke-width', 15) - .attr('stroke', 'transparent') - .attr('stroke-location', 'outside') - .attr('cx', d => scaleX(d[0])) - .attr('cy', d => scaleY(d[1])) - .attr('fill-opacity', 0) - .on('mouseover', function (d) { - d3.select(this).attr('fill-opacity', 1); - tip.show(d, this); - }) - .on('mouseout', function (d) { - d3.select(this).attr('fill-opacity', 0); - tip.hide(d, this); - }); - - div.on('mouseover', function () { - const el = d3.select(this); - el.selectAll('path') - .transition() - .duration(500) - .attr('opacity', 1) - .style('stroke-width', '2px'); - el.selectAll('g.digits') - .transition() - .duration(500) - .attr('opacity', 0.1); - el.selectAll('g.axis') - .transition() - .duration(500) - .attr('opacity', 1); - }) - .on('mouseout', function () { - const el = d3.select(this); - el.select('path') - .transition() - .duration(500) - .attr('opacity', 0.5) - .style('stroke-width', '5px'); - el.selectAll('g.digits') - .transition() - .duration(500) - .attr('opacity', 1); - el.selectAll('g.axis') - .transition() - .duration(500) - .attr('opacity', 0); - }); - } -} - -module.exports = bigNumberVis; diff --git a/superset/assets/src/visualizations/index.js b/superset/assets/src/visualizations/index.js index 002db6386f415..098079ea500dd 100644 --- a/superset/assets/src/visualizations/index.js +++ b/superset/assets/src/visualizations/index.js @@ -65,9 +65,9 @@ const vizMap = { [VIZ_TYPES.area]: loadNvd3, [VIZ_TYPES.bar]: loadNvd3, [VIZ_TYPES.big_number]: () => - loadVis(import(/* webpackChunkName: 'big_number' */ './big_number.js')), + loadVis(import(/* webpackChunkName: 'big_number' */ './BigNumber.jsx')), [VIZ_TYPES.big_number_total]: () => - loadVis(import(/* webpackChunkName: "big_number" */ './big_number.js')), + loadVis(import(/* webpackChunkName: "big_number" */ './BigNumber.jsx')), [VIZ_TYPES.box_plot]: loadNvd3, [VIZ_TYPES.bubble]: loadNvd3, [VIZ_TYPES.bullet]: loadNvd3, diff --git a/superset/assets/yarn.lock b/superset/assets/yarn.lock index 11e645613fc7a..e27a87dd319da 100644 --- a/superset/assets/yarn.lock +++ b/superset/assets/yarn.lock @@ -32,6 +32,13 @@ dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-module-imports@^7.0.0-beta.49": + version "7.0.0-beta.54" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.54.tgz#c2d8e14ff034225bf431356db77ef467b8d35aac" + dependencies: + "@babel/types" "7.0.0-beta.54" + lodash "^4.17.5" + "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" @@ -78,6 +85,14 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" +"@babel/types@7.0.0-beta.54", "@babel/types@^7.0.0-beta.49": + version "7.0.0-beta.54" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.54.tgz#025ad68492fed542c13f14c579a44c848e531063" + dependencies: + esutils "^2.0.2" + lodash "^4.17.5" + to-fast-properties "^2.0.0" + "@data-ui/event-flow@^0.0.54": version "0.0.54" resolved "https://registry.yarnpkg.com/@data-ui/event-flow/-/event-flow-0.0.54.tgz#bb03e1fd2b5634248655b8df9d3c6c38a747e65e" @@ -143,6 +158,19 @@ d3-array "^1.2.1" prop-types "^15.5.10" +"@data-ui/shared@^0.0.61": + version "0.0.61" + resolved "https://registry.yarnpkg.com/@data-ui/shared/-/shared-0.0.61.tgz#717a1a1f7bd606c0f51573e65b6acdda51a1252b" + dependencies: + "@data-ui/theme" "^0.0.61" + "@vx/event" "^0.0.165" + "@vx/group" "^0.0.165" + "@vx/shape" "^0.0.168" + "@vx/tooltip" "0.0.165" + babel-runtime "^6.26.0" + d3-array "^1.2.1" + prop-types "^15.5.10" + "@data-ui/sparkline@^0.0.54": version "0.0.54" resolved "https://registry.yarnpkg.com/@data-ui/sparkline/-/sparkline-0.0.54.tgz#ce3d166d9e0b239a0ba02f3894cb9e8c84171cef" @@ -171,6 +199,37 @@ version "0.0.8" resolved "https://registry.yarnpkg.com/@data-ui/theme/-/theme-0.0.8.tgz#3116723d04b99f65c7750f81a500e9608b4837c3" +"@data-ui/theme@^0.0.61": + version "0.0.61" + resolved "https://registry.yarnpkg.com/@data-ui/theme/-/theme-0.0.61.tgz#2a792da6c384d08553d1794bdb16ce633bc02cbd" + dependencies: + babel-runtime "^6.26.0" + +"@data-ui/xy-chart@^0.0.61": + version "0.0.61" + resolved "https://registry.yarnpkg.com/@data-ui/xy-chart/-/xy-chart-0.0.61.tgz#ee4e47913116a03a7bc4fc0ff1b0d815f80ee736" + dependencies: + "@data-ui/shared" "^0.0.61" + "@data-ui/theme" "^0.0.61" + "@vx/axis" "^0.0.168" + "@vx/curve" "^0.0.165" + "@vx/event" "^0.0.165" + "@vx/glyph" "^0.0.165" + "@vx/gradient" "^0.0.165" + "@vx/grid" "^0.0.169" + "@vx/group" "^0.0.165" + "@vx/pattern" "^0.0.165" + "@vx/point" "^0.0.165" + "@vx/responsive" "^0.0.165" + "@vx/scale" "^0.0.165" + "@vx/shape" "^0.0.165" + "@vx/stats" "^0.0.165" + "@vx/tooltip" "^0.0.165" + "@vx/voronoi" "^0.0.165" + babel-runtime "^6.26.0" + d3-array "^1.2.0" + prop-types "^15.5.10" + "@deck.gl/core@^5.3.1": version "5.3.1" resolved "https://registry.yarnpkg.com/@deck.gl/core/-/core-5.3.1.tgz#acfc1e5fefd3b12e9142419b0aeb77c07885626c" @@ -282,6 +341,17 @@ classnames "^2.2.5" prop-types "15.5.10" +"@vx/axis@^0.0.168": + version "0.0.168" + resolved "https://registry.yarnpkg.com/@vx/axis/-/axis-0.0.168.tgz#fd8c88a2b584b314aaf1ce2023eaebad05304188" + dependencies: + "@vx/group" "0.0.165" + "@vx/point" "0.0.165" + "@vx/shape" "0.0.168" + "@vx/text" "0.0.165" + classnames "^2.2.5" + prop-types "^15.6.0" + "@vx/bounds@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/bounds/-/bounds-0.0.140.tgz#4ede9766aabb41b791a4fbf4c27fcc19ed83f910" @@ -294,6 +364,12 @@ dependencies: prop-types "^15.5.10" +"@vx/bounds@0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/bounds/-/bounds-0.0.165.tgz#75f107a6deb58223c6878db5053382eff3174567" + dependencies: + prop-types "^15.5.10" + "@vx/clip-path@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/clip-path/-/clip-path-0.0.140.tgz#b2623d004dd5c3c8a6afe8d060de59df51472d94" @@ -310,6 +386,12 @@ dependencies: d3-shape "^1.0.6" +"@vx/curve@0.0.165", "@vx/curve@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/curve/-/curve-0.0.165.tgz#330d1512dceae0af43dd3eb4c85523132030a3a0" + dependencies: + d3-shape "^1.0.6" + "@vx/event@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/event/-/event-0.0.140.tgz#658ec4de92cd61df40b883296168d4e0824015bf" @@ -322,6 +404,12 @@ dependencies: "@vx/point" "0.0.143" +"@vx/event@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/event/-/event-0.0.165.tgz#675d89fdfdc08d0c99c36ff1a381ea50fccfba2e" + dependencies: + "@vx/point" "0.0.165" + "@vx/glyph@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/glyph/-/glyph-0.0.140.tgz#f8323f82aee22192b675bef25789bbb7d74691ba" @@ -330,6 +418,14 @@ classnames "^2.2.5" d3-shape "^1.2.0" +"@vx/glyph@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/glyph/-/glyph-0.0.165.tgz#ba6fe31700dae852c60468e00dd732fa7521d1fc" + dependencies: + "@vx/group" "0.0.165" + classnames "^2.2.5" + d3-shape "^1.2.0" + "@vx/gradient@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/gradient/-/gradient-0.0.140.tgz#56b421016cbae0dcb00190cfffb9e860a28febf4" @@ -337,6 +433,13 @@ classnames "^2.2.5" prop-types "^15.5.7" +"@vx/gradient@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/gradient/-/gradient-0.0.165.tgz#0cc0fe873e6acded4943fa274f68601ad5a50a38" + dependencies: + classnames "^2.2.5" + prop-types "^15.5.7" + "@vx/grid@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/grid/-/grid-0.0.140.tgz#9dfd3071bc5d90d4b457dd55d7f795699233b230" @@ -346,6 +449,15 @@ "@vx/shape" "0.0.140" classnames "^2.2.5" +"@vx/grid@^0.0.169": + version "0.0.169" + resolved "https://registry.yarnpkg.com/@vx/grid/-/grid-0.0.169.tgz#241b9edb3894394af2e142a1280a05f6ccfd2163" + dependencies: + "@vx/group" "0.0.165" + "@vx/point" "0.0.165" + "@vx/shape" "0.0.168" + classnames "^2.2.5" + "@vx/group@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/group/-/group-0.0.140.tgz#cba9b0b3f2f007e5be7346f3c86f73f70e038a23" @@ -358,6 +470,12 @@ dependencies: classnames "^2.2.5" +"@vx/group@0.0.165", "@vx/group@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/group/-/group-0.0.165.tgz#2342523225de94859b5be49c3072dc6bb6795e78" + dependencies: + classnames "^2.2.5" + "@vx/legend@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/legend/-/legend-0.0.140.tgz#4062c27d6bc9c4d607309d77eff12b844727ae99" @@ -373,6 +491,13 @@ classnames "^2.2.5" prop-types "^15.5.10" +"@vx/pattern@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/pattern/-/pattern-0.0.165.tgz#0d317cb9a13205e35691f702442739ff0256711d" + dependencies: + classnames "^2.2.5" + prop-types "^15.5.10" + "@vx/point@0.0.136": version "0.0.136" resolved "https://registry.yarnpkg.com/@vx/point/-/point-0.0.136.tgz#93b325b4b95c9d5b96df740f4204017f57396559" @@ -381,6 +506,10 @@ version "0.0.143" resolved "https://registry.yarnpkg.com/@vx/point/-/point-0.0.143.tgz#7b6dfa611175ee1b74e3c392072589a79dadf265" +"@vx/point@0.0.165", "@vx/point@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/point/-/point-0.0.165.tgz#7ebde5da3d86954fe31a56f923f31550f0b4b867" + "@vx/responsive@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/responsive/-/responsive-0.0.140.tgz#c73ec68b9e89a181605f1ac9ecc09f35216779a8" @@ -394,12 +523,26 @@ lodash "^4.0.8" resize-observer-polyfill "1.5.0" +"@vx/responsive@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/responsive/-/responsive-0.0.165.tgz#04b17a52be102a75fc036a8ed3f5db1efd4e8ee5" + dependencies: + lodash "^4.17.10" + prop-types "^15.6.1" + resize-observer-polyfill "1.5.0" + "@vx/scale@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/scale/-/scale-0.0.140.tgz#1eb087d11d0000b250c2cdc4061b9e2212edb10d" dependencies: d3-scale "^1.0.5" +"@vx/scale@0.0.165", "@vx/scale@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/scale/-/scale-0.0.165.tgz#8575880c48296a80c0e9459057f826e8f903bc07" + dependencies: + d3-scale "^2.0.0" + "@vx/shape@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/shape/-/shape-0.0.140.tgz#6a282d5fdf3a5752b6e938bb3debe983e89ff6d3" @@ -422,6 +565,48 @@ d3-shape "^1.2.0" prop-types "^15.5.10" +"@vx/shape@0.0.168", "@vx/shape@^0.0.168": + version "0.0.168" + resolved "https://registry.yarnpkg.com/@vx/shape/-/shape-0.0.168.tgz#172bc1cf4dade47076018efd559e0ecc4e959aec" + dependencies: + "@vx/curve" "0.0.165" + "@vx/group" "0.0.165" + "@vx/point" "0.0.165" + classnames "^2.2.5" + d3-path "^1.0.5" + d3-shape "^1.2.0" + prop-types "^15.5.10" + +"@vx/shape@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/shape/-/shape-0.0.165.tgz#3424121f45d83dd8e7ba62b6adf8b0aea2fb9cf8" + dependencies: + "@vx/curve" "0.0.165" + "@vx/group" "0.0.165" + "@vx/point" "0.0.165" + classnames "^2.2.5" + d3-path "^1.0.5" + d3-shape "^1.2.0" + prop-types "^15.5.10" + +"@vx/stats@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/stats/-/stats-0.0.165.tgz#32413a144383367e51628bbea61b3b0ce980f1fd" + dependencies: + "@vx/group" "0.0.165" + "@vx/scale" "0.0.165" + classnames "^2.2.5" + d3-shape "^1.2.0" + +"@vx/text@0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/text/-/text-0.0.165.tgz#e7f22979a1e744216be1a535414752c2ceb2f97a" + dependencies: + babel-plugin-lodash "^3.3.2" + classnames "^2.2.5" + lodash "^4.17.4" + reduce-css-calc "^1.3.0" + "@vx/tooltip@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/tooltip/-/tooltip-0.0.140.tgz#c5c8306272877c1bbd4e8b478ea5291f1019ffe3" @@ -438,6 +623,23 @@ classnames "^2.2.5" prop-types "^15.5.10" +"@vx/tooltip@0.0.165", "@vx/tooltip@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/tooltip/-/tooltip-0.0.165.tgz#0d17a1b445a7bc70d7840e36593b780a6e7b40e2" + dependencies: + "@vx/bounds" "0.0.165" + classnames "^2.2.5" + prop-types "^15.5.10" + +"@vx/voronoi@^0.0.165": + version "0.0.165" + resolved "https://registry.yarnpkg.com/@vx/voronoi/-/voronoi-0.0.165.tgz#11ab585199b0dccf403544a6ad378a505bfb913b" + dependencies: + "@vx/group" "0.0.165" + classnames "^2.2.5" + d3-voronoi "^1.1.2" + prop-types "^15.6.1" + "@webassemblyjs/ast@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" @@ -1262,6 +1464,16 @@ babel-plugin-dynamic-import-node@^1.2.0: dependencies: babel-plugin-syntax-dynamic-import "^6.18.0" +babel-plugin-lodash@^3.3.2: + version "3.3.4" + resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" + dependencies: + "@babel/helper-module-imports" "^7.0.0-beta.49" + "@babel/types" "^7.0.0-beta.49" + glob "^7.1.1" + lodash "^4.17.10" + require-package-name "^2.0.1" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -2435,7 +2647,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@2.x, classnames@^2.1.2, classnames@^2.2.3, classnames@^2.2.4, classnames@^2.2.5: +classnames@^2.1.2, classnames@^2.2.3, classnames@^2.2.4, classnames@^2.2.5: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" @@ -3080,7 +3292,7 @@ d3-interpolate@1: dependencies: d3-color "1" -d3-path@1: +d3-path@1, d3-path@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764" @@ -3112,6 +3324,17 @@ d3-scale@^1.0.5: d3-time "1" d3-time-format "2" +d3-scale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.1.0.tgz#8d3fd3e2a7c9080782a523c08507c5248289eef8" + dependencies: + d3-array "^1.2.0" + d3-collection "1" + d3-format "1" + d3-interpolate "1" + d3-time "1" + d3-time-format "2" + d3-selection@1, d3-selection@^1.1.0, d3-selection@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d" @@ -3158,6 +3381,10 @@ d3-transition@1: d3-selection "^1.1.0" d3-timer "1" +d3-voronoi@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c" + d3-zoom@^1.3.0: version "1.7.1" resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.7.1.tgz#02f43b3c3e2db54f364582d7e4a236ccc5506b63" @@ -6400,7 +6627,7 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" -lodash.isequal@^4.0.0, lodash.isequal@^4.1.1: +lodash.isequal@^4.1.1: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -8842,7 +9069,7 @@ react-dom@^15.6.2: object-assign "^4.1.0" prop-types "^15.5.10" -react-draggable@3.x, "react-draggable@^2.2.6 || ^3.0.3": +"react-draggable@^2.2.6 || ^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-3.0.5.tgz#c031e0ed4313531f9409d6cd84c8ebcec0ddfe2d" dependencies: @@ -8857,16 +9084,6 @@ react-gravatar@^2.6.1: md5 "^2.1.0" query-string "^4.2.2" -react-grid-layout@0.16.6: - version "0.16.6" - resolved "https://registry.yarnpkg.com/react-grid-layout/-/react-grid-layout-0.16.6.tgz#9b2407a2b946c2260ebaf66f13b556e1da4efeb2" - dependencies: - classnames "2.x" - lodash.isequal "^4.0.0" - prop-types "15.x" - react-draggable "3.x" - react-resizable "1.x" - react-input-autosize@^2.1.2: version "2.2.1" resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.1.tgz#ec428fa15b1592994fb5f9aa15bb1eb6baf420f8" @@ -8938,7 +9155,7 @@ react-redux@^5.0.2: loose-envify "^1.1.0" prop-types "^15.6.0" -react-resizable@1.x, react-resizable@^1.3.3: +react-resizable@^1.3.3: version "1.7.5" resolved "https://registry.yarnpkg.com/react-resizable/-/react-resizable-1.7.5.tgz#83eb75bb3684da6989bbbf4f826e1470f0af902e" dependencies: @@ -9304,7 +9521,7 @@ redeyed@~0.4.0: dependencies: esprima "~1.0.4" -reduce-css-calc@^1.2.6: +reduce-css-calc@^1.2.6, reduce-css-calc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" dependencies: @@ -9581,6 +9798,10 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" +require-package-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000000..fb57ccd13afbd --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + +