diff --git a/superset-frontend/src/explore/components/SaveModal.test.tsx b/superset-frontend/src/explore/components/SaveModal.test.tsx index e4fdf217ceb5..9a3ba617ec0c 100644 --- a/superset-frontend/src/explore/components/SaveModal.test.tsx +++ b/superset-frontend/src/explore/components/SaveModal.test.tsx @@ -282,7 +282,7 @@ test('disables overwrite option for new slice', () => { }); test('disables overwrite option for non-owner', () => { - const { getByRole } = setup( + const { getByRole, getByText } = setup( {}, mockStore({ ...initialState, @@ -290,6 +290,33 @@ test('disables overwrite option for non-owner', () => { }), ); expect(getByRole('radio', { name: 'Save (Overwrite)' })).toBeDisabled(); + expect( + getByText( + 'Must be a chart owner to overwrite this chart. Save as a new chart instead.', + ), + ).toBeInTheDocument(); +}); + +test('disables overwrite option for externally managed slice', () => { + const { getByRole, getByText } = setup( + {}, + mockStore({ + ...initialState, + explore: { + ...initialState.explore, + slice: { + ...initialState.explore.slice, + is_managed_externally: true, + }, + }, + }), + ); + expect(getByRole('radio', { name: 'Save (Overwrite)' })).toBeDisabled(); + expect( + getByText( + "This chart is managed externally and can't be overwritten in Superset.", + ), + ).toBeInTheDocument(); }); test('updates slice name and selected dashboard', async () => { diff --git a/superset-frontend/src/explore/components/SaveModal.tsx b/superset-frontend/src/explore/components/SaveModal.tsx index 6e72769f0780..ec1696712715 100755 --- a/superset-frontend/src/explore/components/SaveModal.tsx +++ b/superset-frontend/src/explore/components/SaveModal.tsx @@ -34,6 +34,7 @@ import { Loading, Divider, Flex, + Typography, TreeSelect, } from '@superset-ui/core/components'; import { logging } from '@apache-superset/core/utils'; @@ -597,18 +598,32 @@ class SaveModal extends Component { renderSaveChartModal = () => { const info = this.info(); + const canOverwriteSlice = this.canOverwriteSlice(); return (
this.changeAction('overwrite')} data-test="save-overwrite-radio" > {t('Save (Overwrite)')} + {this.props.slice && !canOverwriteSlice && ( +
+ + {this.props.slice.is_managed_externally + ? t( + "This chart is managed externally and can't be overwritten in Superset.", + ) + : t( + 'Must be a chart owner to overwrite this chart. Save as a new chart instead.', + )} + +
+ )}