UNPKG

@hackoregon/component-library

Version:

Official repo for Hack Oregon React component library

202 lines (196 loc) 6.98 kB
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } import PropTypes from "prop-types"; import React from "react"; import { groupBy } from "lodash"; import { VictoryAxis, VictoryChart, VictoryLabel, VictoryPortal, VictoryScatter, VictoryTooltip, VictoryStack, VictoryArea } from "victory"; import ChartContainer from "../ChartContainer"; import SimpleLegend from "../SimpleLegend"; import civicFormat from "../utils/civicFormat"; import DataChecker from "../utils/DataChecker"; import { chartEvents, getDefaultStackedDomain, getDefaultDataSeriesLabels, getDefaultAreaStyle } from "../utils/chartHelpers"; import CivicVictoryTheme from "../VictoryTheme/VictoryThemeIndex"; var StackedAreaChart = function StackedAreaChart(_ref) { var data = _ref.data, dataKey = _ref.dataKey, dataKeyLabel = _ref.dataKeyLabel, dataValue = _ref.dataValue, dataValueLabel = _ref.dataValueLabel, dataSeries = _ref.dataSeries, dataSeriesLabel = _ref.dataSeriesLabel, domain = _ref.domain, size = _ref.size, style = _ref.style, subtitle = _ref.subtitle, title = _ref.title, xLabel = _ref.xLabel, yLabel = _ref.yLabel, xNumberFormatter = _ref.xNumberFormatter, yNumberFormatter = _ref.yNumberFormatter, legendComponent = _ref.legendComponent; var chartDomain = domain || getDefaultStackedDomain(data, dataKey, dataValue); var dataSeriesLabels = dataSeries ? dataSeriesLabel || getDefaultDataSeriesLabels(data, dataSeries) : null; var scatterPlotStyle = style || _objectSpread({}, CivicVictoryTheme.civic.areaScatter.style); var legendData = dataSeriesLabels && dataSeriesLabels.length ? dataSeriesLabels.map(function (series) { return { name: series.label }; }) : null; var lineData = dataSeries ? groupBy(data, dataSeries) : { category: data }; var areas = lineData ? Object.keys(lineData).map(function (category, index) { return React.createElement(VictoryArea, { key: category, data: lineData[category].map(function (d) { return { dataKey: d[dataKey], dataValue: d[dataValue], series: d[dataSeries] }; }), x: "dataKey", y: "dataValue", style: getDefaultAreaStyle(index), standalone: false, animate: true }); }) : null; var dots = lineData ? Object.keys(lineData).map(function (category) { return React.createElement(VictoryScatter, { key: category, data: lineData[category].map(function (d) { return { dataKey: d[dataKey], dataValue: d[dataValue], series: d[dataSeries], label: "".concat(dataKeyLabel || xLabel, ": ").concat(xNumberFormatter(d[dataKey]), " \u2022 ").concat(dataValueLabel || yLabel, ": ").concat(yNumberFormatter(d[dataValue])), size: size ? d[size.key] || size.value : 3 }; }), x: "dataKey", y: "dataValue", standalone: false, size: function size(d) { return d.size; }, style: scatterPlotStyle, title: "Scatter Plot", events: chartEvents, labelComponent: React.createElement(VictoryTooltip, { x: 325, y: 0, orientation: "bottom", pointerLength: 0, cornerRadius: 0, theme: CivicVictoryTheme.civic }), animate: true }); }) : null; return React.createElement(ChartContainer, { title: title, subtitle: subtitle }, React.createElement(DataChecker, { dataAccessors: { dataKey: dataKey, dataValue: dataValue }, data: data }, legendData && (legendComponent ? legendComponent(legendData) : React.createElement(SimpleLegend, { className: "legend", legendData: legendData })), React.createElement(VictoryChart, { domain: chartDomain, padding: { left: 75, right: 50, bottom: 50, top: 50 }, theme: CivicVictoryTheme.civic }, React.createElement(VictoryAxis, { style: { grid: { stroke: "none" } }, tickFormat: function tickFormat(x) { return xNumberFormatter(x); }, title: "X Axis" }), React.createElement(VictoryAxis, { dependentAxis: true, tickFormat: function tickFormat(y) { return yNumberFormatter(y); }, title: "Y Axis" }), React.createElement(VictoryPortal, null, React.createElement(VictoryLabel, { style: _objectSpread({}, CivicVictoryTheme.civic.axisLabel.style), text: yLabel, textAnchor: "middle", title: "Y Axis Label", verticalAnchor: "end", x: 75, y: 45 })), React.createElement(VictoryPortal, null, React.createElement(VictoryLabel, { style: _objectSpread({}, CivicVictoryTheme.civic.axisLabel.style), text: xLabel, textAnchor: "end", title: "X Axis Label", verticalAnchor: "end", x: 600, y: 295 })), React.createElement(VictoryStack, null, areas), React.createElement(VictoryStack, null, dots)))); }; StackedAreaChart.propTypes = { data: PropTypes.arrayOf(PropTypes.shape({ x: PropTypes.number, y: PropTypes.number })), dataKey: PropTypes.string, dataKeyLabel: PropTypes.arrayOf(PropTypes.string), dataValue: PropTypes.string, dataValueLabel: PropTypes.arrayOf(PropTypes.string), dataSeries: PropTypes.string, dataSeriesLabel: PropTypes.arrayOf(PropTypes.shape({ category: PropTypes.string, label: PropTypes.string })), domain: PropTypes.shape({ x: PropTypes.arrayOf(PropTypes.number), y: PropTypes.arrayOf(PropTypes.number) }), size: PropTypes.shape({ key: PropTypes.string, value: PropTypes.string }), style: PropTypes.arrayOf(PropTypes.shape({})), subtitle: PropTypes.string, title: PropTypes.string, xLabel: PropTypes.string, yLabel: PropTypes.string, xNumberFormatter: PropTypes.func, yNumberFormatter: PropTypes.func, legendComponent: PropTypes.func }; StackedAreaChart.defaultProps = { data: null, dataKey: "x", dataKeyLabel: null, dataValue: "y", dataValueLabel: null, dataSeries: null, dataSeriesLabel: null, domain: null, size: null, style: null, subtitle: null, title: null, xLabel: "X", yLabel: "Y", xNumberFormatter: civicFormat.numeric, yNumberFormatter: civicFormat.numeric, legendComponent: null }; export default StackedAreaChart;