This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 74451057355 fix(explore): explain disabled chart overwrite option
(#39796)
74451057355 is described below
commit 74451057355ac672d00971390996c5b13a9dd7fc
Author: yeaight <[email protected]>
AuthorDate: Tue May 12 21:53:59 2026 +0200
fix(explore): explain disabled chart overwrite option (#39796)
---
.../src/explore/components/SaveModal.test.tsx | 29 +++++++++++++++++++++-
.../src/explore/components/SaveModal.tsx | 17 ++++++++++++-
2 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/superset-frontend/src/explore/components/SaveModal.test.tsx
b/superset-frontend/src/explore/components/SaveModal.test.tsx
index e4fdf217ceb..9a3ba617ec0 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 6e72769f078..ec169671271 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<SaveModalProps,
SaveModalState> {
renderSaveChartModal = () => {
const info = this.info();
+ const canOverwriteSlice = this.canOverwriteSlice();
return (
<Form data-test="save-modal-body" layout="vertical">
<FormItem data-test="radio-group">
<Radio
id="overwrite-radio"
- disabled={!this.canOverwriteSlice()}
+ disabled={!canOverwriteSlice}
checked={this.state.action === 'overwrite'}
onChange={() => this.changeAction('overwrite')}
data-test="save-overwrite-radio"
>
{t('Save (Overwrite)')}
</Radio>
+ {this.props.slice && !canOverwriteSlice && (
+ <div>
+ <Typography.Text type="secondary">
+ {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.',
+ )}
+ </Typography.Text>
+ </div>
+ )}
<Radio
id="saveas-radio"
data-test="saveas-radio"