/** * 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 { t } from '@superset-ui/core'; import { ControlPanelConfig, ControlPanelsContainerProps, ControlSubSectionHeader, D3_TIME_FORMAT_DOCS, getStandardizedControls, sections, sharedControls, } from '@superset-ui/chart-controls'; import { EchartsTimeseriesSeriesType } from '../../types'; import { DEFAULT_FORM_DATA, TIME_SERIES_DESCRIPTION_TEXT } from '../constants'; import { legendSection, richTooltipSection, seriesOrderSection, showValueSection, } from '../../controls'; const { area, logAxis, markerEnabled, markerSize, minorSplitLine, opacity, rowLimit, truncateYAxis, yAxisBounds, zoomable, xAxisLabelRotation, } = DEFAULT_FORM_DATA; const config: ControlPanelConfig = { controlPanelSections: [ sections.genericTime, sections.echartsTimeSeriesQueryWithXAxisSort, sections.advancedAnalyticsControls, sections.annotationsAndLayersControls, sections.forecastIntervalControls, sections.titleControls, { label: t('Chart Options'), expanded: true, controlSetRows: [ ...seriesOrderSection, ['color_scheme'], [ { name: 'seriesType', config: { type: 'SelectControl', label: t('Step type'), renderTrigger: true, default: EchartsTimeseriesSeriesType.Start, choices: [ [EchartsTimeseriesSeriesType.Start, t('Start')], [EchartsTimeseriesSeriesType.Middle, t('Middle')], [EchartsTimeseriesSeriesType.End, t('End')], ], description: t( 'Defines whether the step should appear at the beginning, middle or end between two data points', ), }, }, ], ...showValueSection, [ { name: 'area', config: { type: 'CheckboxControl', label: t('Area Chart'), renderTrigger: true, default: area, description: t( 'Draw area under curves. Only applicable for line types.', ), }, }, ], [ { name: 'opacity', config: { type: 'SliderControl', label: t('Area chart opacity'), renderTrigger: true, min: 0, max: 1, step: 0.1, default: opacity, description: t( 'Opacity of Area Chart. Also applies to confidence band.', ), visibility: ({ controls }: ControlPanelsContainerProps) => Boolean(controls?.area?.value), }, }, ], [ { name: 'markerEnabled', config: { type: 'CheckboxControl', label: t('Marker'), renderTrigger: true, default: markerEnabled, description: t( 'Draw a marker on data points. Only applicable for line types.', ), }, }, ], [ { name: 'markerSize', config: { type: 'SliderControl', label: t('Marker Size'), renderTrigger: true, min: 0, max: 20, default: markerSize, description: t( 'Size of marker. Also applies to forecast observations.', ), visibility: ({ controls }: ControlPanelsContainerProps) => Boolean(controls?.markerEnabled?.value), }, }, ], [ { name: 'zoomable', config: { type: 'CheckboxControl', label: t('Data Zoom'), default: zoomable, renderTrigger: true, description: t('Enable data zooming controls'), }, }, ], ...legendSection, [{t('X Axis')}], [ { name: 'x_axis_time_format', config: { ...sharedControls.x_axis_time_format, default: 'smart_date', description: `${D3_TIME_FORMAT_DOCS}. ${TIME_SERIES_DESCRIPTION_TEXT}`, }, }, ], [ { name: 'xAxisLabelRotation', config: { type: 'SelectControl', freeForm: true, clearable: false, label: t('Rotate x axis label'), choices: [ [0, '0°'], [45, '45°'], [90, '90°'], ], default: xAxisLabelRotation, renderTrigger: true, description: t( 'Input field supports custom rotation. e.g. 30 for 30°', ), }, }, ], ...richTooltipSection, // eslint-disable-next-line react/jsx-key [{t('Y Axis')}], ['y_axis_format'], ['currency_format'], [ { name: 'logAxis', config: { type: 'CheckboxControl', label: t('Logarithmic y-axis'), renderTrigger: true, default: logAxis, description: t('Logarithmic y-axis'), }, }, ], [ { name: 'minorSplitLine', config: { type: 'CheckboxControl', label: t('Minor Split Line'), renderTrigger: true, default: minorSplitLine, description: t('Draw split lines for minor y-axis ticks'), }, }, ], [ { name: 'truncateYAxis', config: { type: 'CheckboxControl', label: t('Truncate Y Axis'), default: truncateYAxis, renderTrigger: true, description: t( 'Truncate Y Axis. Can be overridden by specifying a min or max bound.', ), }, }, ], [ { name: 'y_axis_bounds', config: { type: 'BoundsControl', label: t('Y Axis Bounds'), renderTrigger: true, default: yAxisBounds, description: t( 'Bounds for the Y-axis. When left empty, the bounds are ' + 'dynamically defined based on the min/max of the data. Note that ' + "this feature will only expand the axis range. It won't " + "narrow the data's extent.", ), visibility: ({ controls }: ControlPanelsContainerProps) => Boolean(controls?.truncateYAxis?.value), }, }, ], ], }, ], controlOverrides: { row_limit: { default: rowLimit, }, }, formDataOverrides: formData => ({ ...formData, metrics: getStandardizedControls().popAllMetrics(), groupby: getStandardizedControls().popAllColumns(), }), }; export default config;