= ({
return (
{title}{' '}
- {validateCheckStatus ? (
-
- ) : (
-
- *
-
- )}
+ {validateCheckStatus !== undefined &&
+ (validateCheckStatus ? (
+
+ ) : (
+
+ *
+
+ ))}
{subtitle}
diff --git a/superset-frontend/packages/superset-ui-core/src/components/ConfirmStatusChange/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/ConfirmStatusChange/index.tsx
index ff2ba0cf63d..dd52b99fd64 100644
--- a/superset-frontend/packages/superset-ui-core/src/components/ConfirmStatusChange/index.tsx
+++ b/superset-frontend/packages/superset-ui-core/src/components/ConfirmStatusChange/index.tsx
@@ -68,6 +68,7 @@ export function ConfirmStatusChange({
onConfirm={confirm}
onHide={hide}
open={open}
+ name="please confirm"
title={title}
/>
>
diff --git a/superset-frontend/packages/superset-ui-core/src/components/DeleteModal/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/DeleteModal/index.tsx
index 0eb482b0d83..1e9518091c7 100644
--- a/superset-frontend/packages/superset-ui-core/src/components/DeleteModal/index.tsx
+++ b/superset-frontend/packages/superset-ui-core/src/components/DeleteModal/index.tsx
@@ -37,6 +37,7 @@ export function DeleteModal({
onHide,
open,
title,
+ name,
}: DeleteModalProps) {
const [disableChange, setDisableChange] = useState(true);
const [confirmation, setConfirmation] = useState('');
@@ -78,6 +79,7 @@ export function DeleteModal({
primaryButtonName={t('Delete')}
primaryButtonStyle="danger"
show={open}
+ name={name}
title={title}
centered
>
diff --git a/superset-frontend/packages/superset-ui-core/src/components/DeleteModal/types.ts b/superset-frontend/packages/superset-ui-core/src/components/DeleteModal/types.ts
index f0ba7ff188b..20210780f15 100644
--- a/superset-frontend/packages/superset-ui-core/src/components/DeleteModal/types.ts
+++ b/superset-frontend/packages/superset-ui-core/src/components/DeleteModal/types.ts
@@ -25,4 +25,5 @@ export interface DeleteModalProps {
onHide: () => void;
open: boolean;
title: ReactNode;
+ name?: string;
}
diff --git a/superset-frontend/packages/superset-ui-core/src/components/Modal/FormModal.tsx b/superset-frontend/packages/superset-ui-core/src/components/Modal/FormModal.tsx
index 3a177f6e408..9c9ea61f413 100644
--- a/superset-frontend/packages/superset-ui-core/src/components/Modal/FormModal.tsx
+++ b/superset-frontend/packages/superset-ui-core/src/components/Modal/FormModal.tsx
@@ -33,6 +33,7 @@ export function FormModal({
formSubmitHandler,
bodyStyle = {},
requiredFields = [],
+ name,
}: FormModalProps) {
const [form] = Form.useForm();
const [isSaving, setIsSaving] = useState(false);
@@ -78,6 +79,7 @@ export function FormModal({
return (
`
.ant-modal-body {
flex: 0 1 auto;
- padding: ${theme.sizeUnit * 4}px;
- padding-bottom: ${theme.sizeUnit * 2}px;
+ padding: ${theme.sizeUnit * 4}px ${theme.sizeUnit * 6}px;
+
overflow: auto;
${!resizable && height && `height: ${height};`}
}
@@ -333,7 +333,7 @@ const CustomModal = ({
}
footer={!hideFooter ? modalFooter : null}
hideFooter={hideFooter}
- wrapProps={{ 'data-test': `${name || title}-modal`, ...wrapProps }}
+ wrapProps={{ 'data-test': `${name || 'antd'}-modal`, ...wrapProps }}
modalRender={modal =>
resizable || draggable ? (
css`
- padding: 0 ${theme.sizeUnit * 2}px;
-
- && {
- margin: 0;
- }
- `}
-`;
-
-const StyledDiscardBtn = styled(Button)`
- ${({ theme }) => css`
- min-width: ${theme.sizeUnit * 22}px;
- height: ${theme.sizeUnit * 8}px;
- `}
-`;
-
-const StyledSaveBtn = styled(Button)`
- ${({ theme }) => css`
- min-width: ${theme.sizeUnit * 17}px;
- height: ${theme.sizeUnit * 8}px;
- span > :first-of-type {
- margin-right: 0;
- }
- `}
-`;
-
-const StyledWarningIcon = styled(Icons.WarningOutlined)`
- ${({ theme }) => css`
- color: ${theme.colorWarning};
- margin-right: ${theme.sizeUnit * 4}px;
- `}
-`;
-
export type UnsavedChangesModalProps = {
showModal: boolean;
onHide: () => void;
@@ -78,52 +42,66 @@ export const UnsavedChangesModal: FC = ({
onConfirmNavigation,
title = 'Unsaved Changes',
body = "If you don't save, changes will be lost.",
-}: UnsavedChangesModalProps): ReactElement => (
-
-
-
- {title}
-
-
- }
- footer={
-
- {
+ const theme = useTheme();
+
+ return (
+
+
+
+ {title}
+
+
+ }
+ footer={
+
- {t('Discard')}
-
-
- {t('Save')}
-
-
- }
- >
- {body}
-
-);
+
+
+
+ }
+ >
+ {body}
+
+ );
+};
diff --git a/superset-frontend/packages/superset-ui-core/src/components/index.ts b/superset-frontend/packages/superset-ui-core/src/components/index.ts
index f7eda5e3332..e149906997b 100644
--- a/superset-frontend/packages/superset-ui-core/src/components/index.ts
+++ b/superset-frontend/packages/superset-ui-core/src/components/index.ts
@@ -148,6 +148,7 @@ export {
Typography,
type TypographyProps,
type ParagraphProps,
+ type TitleProps,
} from './Typography';
export { Image, type ImageProps } from './Image';
diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx
index f3d34d75c8b..6186a1e900b 100644
--- a/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx
+++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx
@@ -18,7 +18,7 @@
*/
import { useCallback, useState, FormEvent } from 'react';
-
+import { ModalTitleWithIcon } from 'src/components/ModalTitleWithIcon';
import { Radio, RadioChangeEvent } from '@superset-ui/core/components/Radio';
import {
AsyncSelect,
@@ -27,6 +27,8 @@ import {
Modal,
Input,
type SelectValue,
+ Icons,
+ Flex,
} from '@superset-ui/core/components';
import {
styled,
@@ -372,17 +374,17 @@ export const SaveDatasetModal = ({
return (
}
+ data-test="save-or-overwrite-dataset-title"
+ />
+ }
onHide={onHide}
footer={
-
+
{isFeatureEnabled(FeatureFlag.EnableTemplateProcessing) && (
>
)}
-
+
}
>
diff --git a/superset-frontend/src/SqlLab/components/SaveQuery/index.tsx b/superset-frontend/src/SqlLab/components/SaveQuery/index.tsx
index c5918d1b7c1..dec0de19da8 100644
--- a/superset-frontend/src/SqlLab/components/SaveQuery/index.tsx
+++ b/superset-frontend/src/SqlLab/components/SaveQuery/index.tsx
@@ -17,7 +17,6 @@
* under the License.
*/
import { useState, useEffect, useMemo, ChangeEvent } from 'react';
-
import type { DatabaseObject } from 'src/features/databases/types';
import { t, styled } from '@superset-ui/core';
import {
@@ -28,6 +27,7 @@ import {
Modal,
Row,
Col,
+ Icons,
} from '@superset-ui/core/components';
import { Menu } from '@superset-ui/core/components/Menu';
import SaveDatasetActionButton from 'src/SqlLab/components/SaveDatasetActionButton';
@@ -43,6 +43,7 @@ import {
LOG_ACTIONS_SQLLAB_CREATE_CHART,
LOG_ACTIONS_SQLLAB_SAVE_QUERY,
} from 'src/logger/LogUtils';
+import { ModalTitleWithIcon } from 'src/components/ModalTitleWithIcon';
interface SaveQueryProps {
queryEditorId: string;
@@ -224,7 +225,14 @@ const SaveQuery = ({
primaryButtonName={isSaved ? t('Save') : t('Save as')}
width="620px"
show={showSave}
- title={{t('Save query')}
}
+ name={t('Save query')}
+ title={
+ }
+ data-test="save-query-modal-title"
+ />
+ }
footer={
<>