Files
superset2/superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx
Lyndsi Kay Williams 8a04536f9d feat(SqlLab): Change Save Dataset Button to Split Save Query Button IV (#20852)
* Moving entire split save btn PR

* Addressed review comments

* Remove arbitrary div from ErrorBoundary in Chart

* Added accidentally removed comment

* Fix act errors in SaveQuery tests

* Fix SaveDatasetActionButton test

* SaveDatasetModal test almost working

* SaveDatasetModal tests all passing

* Clean SaveDatasetModal test

* Fix create chart button and SaveDatasetModal text in SQL Lab

* Fix untitled dataset name on SaveDatasetModal in explore

* Fix styling on split save button
2022-08-01 14:36:34 -05:00

152 lines
4.0 KiB
TypeScript

/**
* 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, { useMemo } from 'react';
import { t, styled, useTheme } from '@superset-ui/core';
import { Menu } from 'src/components/Menu';
import Button from 'src/components/Button';
import Icons from 'src/components/Icons';
import { DropdownButton } from 'src/components/DropdownButton';
import { detectOS } from 'src/utils/common';
import { QueryButtonProps } from 'src/SqlLab/types';
interface Props {
allowAsync: boolean;
queryState?: string;
runQuery: (c?: boolean) => void;
selectedText?: string;
stopQuery: () => void;
sql: string;
overlayCreateAsMenu: typeof Menu | null;
}
const buildText = (
shouldShowStopButton: boolean,
selectedText: string | undefined,
): string | JSX.Element => {
if (shouldShowStopButton) {
return (
<>
<i className="fa fa-stop" /> {t('Stop')}
</>
);
}
if (selectedText) {
return t('Run selection');
}
return t('Run');
};
const onClick = (
shouldShowStopButton: boolean,
allowAsync: boolean,
runQuery: (c?: boolean) => void = () => undefined,
stopQuery = () => {},
): void => {
if (shouldShowStopButton) return stopQuery();
if (allowAsync) {
return runQuery(true);
}
return runQuery(false);
};
const StyledButton = styled.span`
button {
line-height: 13px;
// this is to over ride a previous transition built into the component
transition: background-color 0ms;
&:last-of-type {
margin-right: ${({ theme }) => theme.gridUnit * 2}px;
}
span[name='caret-down'] {
display: flex;
margin-left: ${({ theme }) => theme.gridUnit * 1}px;
}
}
`;
const RunQueryActionButton = ({
allowAsync = false,
queryState,
selectedText,
sql = '',
overlayCreateAsMenu,
runQuery,
stopQuery,
}: Props) => {
const theme = useTheme();
const userOS = detectOS();
const shouldShowStopBtn =
!!queryState && ['running', 'pending'].indexOf(queryState) > -1;
const ButtonComponent: React.FC<QueryButtonProps> = overlayCreateAsMenu
? (DropdownButton as React.FC)
: Button;
const isDisabled = !sql.trim();
const stopButtonTooltipText = useMemo(
() =>
userOS === 'MacOS'
? t('Stop running (Ctrl + x)')
: t('Stop running (Ctrl + e)'),
[userOS],
);
return (
<StyledButton>
<ButtonComponent
onClick={() =>
onClick(shouldShowStopBtn, allowAsync, runQuery, stopQuery)
}
disabled={isDisabled}
tooltip={
(!isDisabled &&
(shouldShowStopBtn
? stopButtonTooltipText
: t('Run query (Ctrl + Return)'))) as string
}
cta
{...(overlayCreateAsMenu
? {
overlay: overlayCreateAsMenu,
icon: (
<Icons.CaretDown
iconColor={
isDisabled
? theme.colors.grayscale.base
: theme.colors.grayscale.light5
}
name="caret-down"
/>
),
trigger: 'click',
}
: { buttonStyle: 'primary' })}
>
{buildText(shouldShowStopBtn, selectedText)}
</ButtonComponent>
</StyledButton>
);
};
export default RunQueryActionButton;