/**
* 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 (