From bf8d8a4a55e64bcc892a0fbef415cbb7bfbf8da8 Mon Sep 17 00:00:00 2001 From: "Michael S. Molina" Date: Fri, 16 Sep 2022 11:50:57 -0300 Subject: [PATCH] refactor: Rewrites ColorSchemeControl with Typescript --- .../ColorSchemeControl/ColorScheme.test.jsx | 43 ---- .../ColorSchemeControl.test.tsx | 4 +- .../controls/ColorSchemeControl/index.jsx | 184 ----------------- .../controls/ColorSchemeControl/index.tsx | 189 ++++++++++++++++++ 4 files changed, 191 insertions(+), 229 deletions(-) delete mode 100644 superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorScheme.test.jsx delete mode 100644 superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx create mode 100644 superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorScheme.test.jsx b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorScheme.test.jsx deleted file mode 100644 index 565c4f9f28b54..0000000000000 --- a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorScheme.test.jsx +++ /dev/null @@ -1,43 +0,0 @@ -/** - * 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. - */ -/* eslint-disable no-unused-expressions */ -import React from 'react'; -import { Select } from 'src/components'; -import { getCategoricalSchemeRegistry } from '@superset-ui/core'; -import { styledMount as mount } from 'spec/helpers/theming'; -import ColorSchemeControl from 'src/explore/components/controls/ColorSchemeControl'; - -const defaultProps = { - name: 'color_scheme', - label: 'Color Scheme', - options: getCategoricalSchemeRegistry() - .keys() - .map(s => [s, s]), -}; - -describe('ColorSchemeControl', () => { - let wrapper; - beforeEach(() => { - wrapper = mount(); - }); - - it('renders a Select', () => { - expect(wrapper.find(Select)).toExist(); - }); -}); diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx index 1f19d8a2c3a89..9e760aab13166 100644 --- a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx @@ -18,7 +18,7 @@ */ import React from 'react'; import { render, screen, waitFor } from 'spec/helpers/testing-library'; -import ColorSchemeControl from '.'; +import ColorSchemeControl, { ColorSchemes } from '.'; const defaultProps = { hasCustomLabelColors: false, @@ -28,7 +28,7 @@ const defaultProps = { value: 'supersetDefault', clearable: true, choices: [], - schemes: () => null, + schemes: () => ({} as ColorSchemes), isLinear: false, }; diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx b/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx deleted file mode 100644 index d5855207859d1..0000000000000 --- a/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx +++ /dev/null @@ -1,184 +0,0 @@ -/** - * 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 { isFunction } from 'lodash'; -import { Select } from 'src/components'; -import { Tooltip } from 'src/components/Tooltip'; -import { styled, t } from '@superset-ui/core'; -import Icons from 'src/components/Icons'; -import ControlHeader from 'src/explore/components/ControlHeader'; -import ColorSchemeLabel from './ColorSchemeLabel'; - -const propTypes = { - hasCustomLabelColors: PropTypes.bool, - dashboardId: PropTypes.number, - description: PropTypes.string, - label: PropTypes.string, - labelMargin: PropTypes.number, - name: PropTypes.string.isRequired, - onChange: PropTypes.func, - value: PropTypes.string, - clearable: PropTypes.bool, - default: PropTypes.string, - choices: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.array), - PropTypes.func, - ]), - schemes: PropTypes.oneOfType([PropTypes.object, PropTypes.func]), - isLinear: PropTypes.bool, -}; - -const defaultProps = { - choices: [], - hasCustomLabelColors: false, - label: t('Color scheme'), - schemes: {}, - clearable: false, - onChange: () => {}, -}; - -const StyledAlert = styled(Icons.AlertSolid)` - color: ${({ theme }) => theme.colors.alert.base}; -`; - -export default class ColorSchemeControl extends React.PureComponent { - constructor(props) { - super(props); - this.onChange = this.onChange.bind(this); - this.renderOption = this.renderOption.bind(this); - this.renderLabel = this.renderLabel.bind(this); - this.dashboardColorSchemeAlert = t( - `The color scheme is determined by the related dashboard. - Edit the color scheme in the dashboard properties.`, - ); - } - - onChange(value) { - this.props.onChange(value); - } - - renderOption(value) { - const { isLinear } = this.props; - const currentScheme = this.schemes[value]; - - // For categorical scheme, display all the colors - // For sequential scheme, show 10 or interpolate to 10. - // Sequential schemes usually have at most 10 colors. - let colors = []; - if (currentScheme) { - colors = isLinear ? currentScheme.getColors(10) : currentScheme.colors; - } - - return ( - - ); - } - - renderLabel() { - const { dashboardId, hasCustomLabelColors, label } = this.props; - - if (hasCustomLabelColors || dashboardId) { - const alertTitle = hasCustomLabelColors - ? t( - `This color scheme is being overriden by custom label colors. - Check the JSON metadata in the Advanced settings`, - ) - : this.dashboardColorSchemeAlert; - return ( - <> - {label}{' '} - - - - - ); - } - return label; - } - - render() { - const { choices, dashboardId, schemes } = this.props; - let options = dashboardId - ? [ - { - value: 'dashboard', - label: 'dashboard', - customLabel: ( - - {t('Dashboard scheme')} - - ), - }, - ] - : []; - let currentScheme = dashboardId ? 'dashboard' : undefined; - - // if related to a dashboard the scheme is dictated by the dashboard - if (!dashboardId) { - this.schemes = isFunction(schemes) ? schemes() : schemes; - const controlChoices = isFunction(choices) ? choices() : choices; - const allColorOptions = []; - const filteredColorOptions = controlChoices.filter(o => { - const option = o[0]; - const isValidColorOption = - option !== 'SUPERSET_DEFAULT' && !allColorOptions.includes(option); - allColorOptions.push(option); - return isValidColorOption; - }); - - options = filteredColorOptions.map(([value]) => ({ - customLabel: this.renderOption(value), - label: this.schemes?.[value]?.label || value, - value, - })); - - currentScheme = this.props.value || this.props.default; - - if (currentScheme === 'SUPERSET_DEFAULT') { - currentScheme = this.schemes?.SUPERSET_DEFAULT?.id; - } - } - - const selectProps = { - ariaLabel: t('Select color scheme'), - allowClear: this.props.clearable, - disabled: !!dashboardId, - name: `select-${this.props.name}`, - onChange: this.onChange, - options, - placeholder: t('Select scheme'), - value: currentScheme, - }; - - return ( - + } + /> + } + ariaLabel={t('Select color scheme')} + allowClear={clearable} + disabled={!!dashboardId} + name={`select-${name}`} + onChange={handleOnChange} + options={options} + placeholder={t('Select scheme')} + value={currentScheme} + /> + ); +}; + +export default ColorSchemeControl;