From 0304493bd20a45f064a5e71afe6753eb8a826309 Mon Sep 17 00:00:00 2001 From: Dominik Prokop Date: Mon, 9 Mar 2020 18:16:10 +0100 Subject: [PATCH] DashboardSave: Correctly overwrite dashboard when saving (#22650) --- .../SaveDashboard/SaveDashboardAsModal.tsx | 18 ++++++++++++++---- .../SaveDashboard/SaveDashboardErrorProxy.tsx | 14 +++++++++++--- .../SaveDashboard/SaveDashboardModal.tsx | 17 ++++++++++++++--- .../SaveDashboard/useDashboardSave.tsx | 2 ++ 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/public/app/features/dashboard/components/SaveDashboard/SaveDashboardAsModal.tsx b/public/app/features/dashboard/components/SaveDashboard/SaveDashboardAsModal.tsx index cee452afc86..175e581aa16 100644 --- a/public/app/features/dashboard/components/SaveDashboard/SaveDashboardAsModal.tsx +++ b/public/app/features/dashboard/components/SaveDashboard/SaveDashboardAsModal.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import { css } from 'emotion'; import { Modal } from '@grafana/ui'; import { SaveDashboardAsForm } from './forms/SaveDashboardAsForm'; @@ -10,10 +10,17 @@ export const SaveDashboardAsModal: React.FC = ({ dashboard, onDismiss, isNew }) => { const { state, onDashboardSave } = useDashboardSave(dashboard); - + const [dashboardSaveModelClone, setDashboardSaveModelClone] = useState(); return ( <> - {state.error && } + {state.error && ( + + )} {!state.error && ( { + setDashboardSaveModelClone(clone); + return onDashboardSave(clone, options, dashboard); + }} isNew={isNew} /> diff --git a/public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx b/public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx index d742bd6c23b..40ecccee62a 100644 --- a/public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx +++ b/public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx @@ -8,12 +8,20 @@ import { SaveDashboardModalProps } from './types'; import { SaveDashboardAsButton } from './SaveDashboardButton'; interface SaveDashboardErrorProxyProps { + /** original dashboard */ dashboard: DashboardModel; + /** dashboard save model with applied modifications, i.e. title */ + dashboardSaveModel: any; error: any; onDismiss: () => void; } -export const SaveDashboardErrorProxy: React.FC = ({ dashboard, error, onDismiss }) => { +export const SaveDashboardErrorProxy: React.FC = ({ + dashboard, + dashboardSaveModel, + error, + onDismiss, +}) => { const { onDashboardSave } = useDashboardSave(dashboard); useEffect(() => { @@ -35,7 +43,7 @@ export const SaveDashboardErrorProxy: React.FC = ( } confirmText="Save & Overwrite" onConfirm={async () => { - await onDashboardSave(dashboard.getSaveModelClone(), { overwrite: true }, dashboard); + await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard); onDismiss(); }} onDismiss={onDismiss} @@ -53,7 +61,7 @@ export const SaveDashboardErrorProxy: React.FC = ( } confirmText="Save & Overwrite" onConfirm={async () => { - await onDashboardSave(dashboard.getSaveModelClone(), { overwrite: true }, dashboard); + await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard); onDismiss(); }} onDismiss={onDismiss} diff --git a/public/app/features/dashboard/components/SaveDashboard/SaveDashboardModal.tsx b/public/app/features/dashboard/components/SaveDashboard/SaveDashboardModal.tsx index 3095858ba80..b48f056c532 100644 --- a/public/app/features/dashboard/components/SaveDashboard/SaveDashboardModal.tsx +++ b/public/app/features/dashboard/components/SaveDashboard/SaveDashboardModal.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import { Modal } from '@grafana/ui'; import { css } from 'emotion'; import { SaveDashboardForm } from './forms/SaveDashboardForm'; @@ -8,9 +8,17 @@ import { SaveDashboardModalProps } from './types'; export const SaveDashboardModal: React.FC = ({ dashboard, onDismiss, onSaveSuccess }) => { const { state, onDashboardSave } = useDashboardSave(dashboard); + const [dashboardSaveModelClone, setDashboardSaveModelClone] = useState(); return ( <> - {state.error && } + {state.error && ( + + )} {!state.error && ( = ({ dashboar onSaveSuccess(); } }} - onSubmit={onDashboardSave} + onSubmit={(clone, options, dashboard) => { + setDashboardSaveModelClone(clone); + return onDashboardSave(clone, options, dashboard); + }} /> )} diff --git a/public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx b/public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx index ef897c62845..96b7e38db6b 100644 --- a/public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx +++ b/public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx @@ -39,6 +39,8 @@ export const useDashboardSave = (dashboard: DashboardModel) => { dispatch( updateLocation({ path: newUrl, + replace: true, + query: {}, }) ); }