/** * 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. */ import React from 'react'; import PropTypes from 'prop-types'; import { Input } from 'src/components/Input'; import Button from 'src/components/Button'; import { Select, Row, Col } from 'src/components'; import { t, styled } from '@superset-ui/core'; import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls'; import BoundsControl from '../BoundsControl'; import CheckboxControl from '../CheckboxControl'; import ControlPopover from '../ControlPopover/ControlPopover'; const propTypes = { label: PropTypes.string, tooltip: PropTypes.string, colType: PropTypes.string, width: PropTypes.string, height: PropTypes.string, timeLag: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), timeRatio: PropTypes.string, comparisonType: PropTypes.string, showYAxis: PropTypes.bool, yAxisBounds: PropTypes.array, bounds: PropTypes.array, d3format: PropTypes.string, dateFormat: PropTypes.string, onChange: PropTypes.func, }; const defaultProps = { label: t('Time series columns'), tooltip: '', colType: '', width: '', height: '', timeLag: '', timeRatio: '', comparisonType: '', showYAxis: false, yAxisBounds: [null, null], bounds: [null, null], d3format: '', dateFormat: '', }; const comparisonTypeOptions = [ { value: 'value', label: t('Actual value'), key: 'value' }, { value: 'diff', label: t('Difference'), key: 'diff' }, { value: 'perc', label: t('Percentage'), key: 'perc' }, { value: 'perc_change', label: t('Percentage change'), key: 'perc_change' }, ]; const colTypeOptions = [ { value: 'time', label: t('Time comparison'), key: 'time' }, { value: 'contrib', label: t('Contribution'), key: 'contrib' }, { value: 'spark', label: t('Sparkline'), key: 'spark' }, { value: 'avg', label: t('Period average'), key: 'avg' }, ]; const StyledRow = styled(Row)` margin-top: ${({ theme }) => theme.gridUnit * 2}px; display: flex; align-items: center; `; const StyledCol = styled(Col)` display: flex; align-items: center; `; const StyledTooltip = styled(InfoTooltipWithTrigger)` margin-left: ${({ theme }) => theme.gridUnit}px; color: ${({ theme }) => theme.colors.grayscale.light1}; `; const ButtonBar = styled.div` margin-top: ${({ theme }) => theme.gridUnit * 5}px; display: flex; justify-content: center; `; export default class TimeSeriesColumnControl extends React.Component { constructor(props) { super(props); this.onSave = this.onSave.bind(this); this.onClose = this.onClose.bind(this); this.resetState = this.resetState.bind(this); this.initialState = this.initialState.bind(this); this.onPopoverVisibleChange = this.onPopoverVisibleChange.bind(this); this.state = this.initialState(); } initialState() { return { label: this.props.label, tooltip: this.props.tooltip, colType: this.props.colType, width: this.props.width, height: this.props.height, timeLag: this.props.timeLag || 0, timeRatio: this.props.timeRatio, comparisonType: this.props.comparisonType, showYAxis: this.props.showYAxis, yAxisBounds: this.props.yAxisBounds, bounds: this.props.bounds, d3format: this.props.d3format, dateFormat: this.props.dateFormat, popoverVisible: false, }; } resetState() { const initialState = this.initialState(); this.setState({ ...initialState }); } onSave() { this.props.onChange(this.state); this.setState({ popoverVisible: false }); } onClose() { this.resetState(); } onSelectChange(attr, opt) { this.setState({ [attr]: opt }); } onTextInputChange(attr, event) { this.setState({ [attr]: event.target.value }); } onCheckboxChange(attr, value) { this.setState({ [attr]: value }); } onBoundsChange(bounds) { this.setState({ bounds }); } onPopoverVisibleChange(popoverVisible) { if (popoverVisible) { this.setState({ popoverVisible }); } else { this.resetState(); } } onYAxisBoundsChange(yAxisBounds) { this.setState({ yAxisBounds }); } textSummary() { return `${this.props.label}`; } formRow(label, tooltip, ttLabel, control) { return ( {label} {control} ); } renderPopover() { return (
{this.formRow( t('Label'), t('The column header label'), 'time-lag', , )} {this.formRow( t('Tooltip'), t('Column header tooltip'), 'col-tooltip', , )} {this.formRow( t('Type'), t('Type of comparison, value difference or percentage'), 'col-type', , )} {this.state.colType === 'spark' && this.formRow( t('Height'), t('Height of the sparkline'), 'spark-width', , )} {['time', 'avg'].indexOf(this.state.colType) >= 0 && this.formRow( t('Time lag'), t('Number of periods to compare against'), 'time-lag', , )} {['spark'].indexOf(this.state.colType) >= 0 && this.formRow( t('Time ratio'), t('Number of periods to ratio against'), 'time-ratio', , )} {this.state.colType === 'time' && this.formRow( t('Type'), t('Type of comparison, value difference or percentage'), 'comp-type', , )} {this.state.colType === 'spark' && this.formRow( t('Date format'), t('Optional d3 date format string'), 'date-format', , )}
); } render() { return ( {this.textSummary()}{' '} ); } } TimeSeriesColumnControl.propTypes = propTypes; TimeSeriesColumnControl.defaultProps = defaultProps;