DashboardSave: Correctly overwrite dashboard when saving (#22650)

pull/22657/head
Dominik Prokop 5 years ago committed by GitHub
parent 5d8fc6a1a9
commit 0304493bd2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 18
      public/app/features/dashboard/components/SaveDashboard/SaveDashboardAsModal.tsx
  2. 14
      public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx
  3. 17
      public/app/features/dashboard/components/SaveDashboard/SaveDashboardModal.tsx
  4. 2
      public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx

@ -1,4 +1,4 @@
import React from 'react'; import React, { useState } from 'react';
import { css } from 'emotion'; import { css } from 'emotion';
import { Modal } from '@grafana/ui'; import { Modal } from '@grafana/ui';
import { SaveDashboardAsForm } from './forms/SaveDashboardAsForm'; import { SaveDashboardAsForm } from './forms/SaveDashboardAsForm';
@ -10,10 +10,17 @@ export const SaveDashboardAsModal: React.FC<SaveDashboardModalProps & {
isNew?: boolean; isNew?: boolean;
}> = ({ dashboard, onDismiss, isNew }) => { }> = ({ dashboard, onDismiss, isNew }) => {
const { state, onDashboardSave } = useDashboardSave(dashboard); const { state, onDashboardSave } = useDashboardSave(dashboard);
const [dashboardSaveModelClone, setDashboardSaveModelClone] = useState();
return ( return (
<> <>
{state.error && <SaveDashboardErrorProxy error={state.error} dashboard={dashboard} onDismiss={onDismiss} />} {state.error && (
<SaveDashboardErrorProxy
error={state.error}
dashboard={dashboard}
dashboardSaveModel={dashboardSaveModelClone}
onDismiss={onDismiss}
/>
)}
{!state.error && ( {!state.error && (
<Modal <Modal
isOpen={true} isOpen={true}
@ -28,7 +35,10 @@ export const SaveDashboardAsModal: React.FC<SaveDashboardModalProps & {
dashboard={dashboard} dashboard={dashboard}
onCancel={onDismiss} onCancel={onDismiss}
onSuccess={onDismiss} onSuccess={onDismiss}
onSubmit={onDashboardSave} onSubmit={(clone, options, dashboard) => {
setDashboardSaveModelClone(clone);
return onDashboardSave(clone, options, dashboard);
}}
isNew={isNew} isNew={isNew}
/> />
</Modal> </Modal>

@ -8,12 +8,20 @@ import { SaveDashboardModalProps } from './types';
import { SaveDashboardAsButton } from './SaveDashboardButton'; import { SaveDashboardAsButton } from './SaveDashboardButton';
interface SaveDashboardErrorProxyProps { interface SaveDashboardErrorProxyProps {
/** original dashboard */
dashboard: DashboardModel; dashboard: DashboardModel;
/** dashboard save model with applied modifications, i.e. title */
dashboardSaveModel: any;
error: any; error: any;
onDismiss: () => void; onDismiss: () => void;
} }
export const SaveDashboardErrorProxy: React.FC<SaveDashboardErrorProxyProps> = ({ dashboard, error, onDismiss }) => { export const SaveDashboardErrorProxy: React.FC<SaveDashboardErrorProxyProps> = ({
dashboard,
dashboardSaveModel,
error,
onDismiss,
}) => {
const { onDashboardSave } = useDashboardSave(dashboard); const { onDashboardSave } = useDashboardSave(dashboard);
useEffect(() => { useEffect(() => {
@ -35,7 +43,7 @@ export const SaveDashboardErrorProxy: React.FC<SaveDashboardErrorProxyProps> = (
} }
confirmText="Save & Overwrite" confirmText="Save & Overwrite"
onConfirm={async () => { onConfirm={async () => {
await onDashboardSave(dashboard.getSaveModelClone(), { overwrite: true }, dashboard); await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard);
onDismiss(); onDismiss();
}} }}
onDismiss={onDismiss} onDismiss={onDismiss}
@ -53,7 +61,7 @@ export const SaveDashboardErrorProxy: React.FC<SaveDashboardErrorProxyProps> = (
} }
confirmText="Save & Overwrite" confirmText="Save & Overwrite"
onConfirm={async () => { onConfirm={async () => {
await onDashboardSave(dashboard.getSaveModelClone(), { overwrite: true }, dashboard); await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard);
onDismiss(); onDismiss();
}} }}
onDismiss={onDismiss} onDismiss={onDismiss}

@ -1,4 +1,4 @@
import React from 'react'; import React, { useState } from 'react';
import { Modal } from '@grafana/ui'; import { Modal } from '@grafana/ui';
import { css } from 'emotion'; import { css } from 'emotion';
import { SaveDashboardForm } from './forms/SaveDashboardForm'; import { SaveDashboardForm } from './forms/SaveDashboardForm';
@ -8,9 +8,17 @@ import { SaveDashboardModalProps } from './types';
export const SaveDashboardModal: React.FC<SaveDashboardModalProps> = ({ dashboard, onDismiss, onSaveSuccess }) => { export const SaveDashboardModal: React.FC<SaveDashboardModalProps> = ({ dashboard, onDismiss, onSaveSuccess }) => {
const { state, onDashboardSave } = useDashboardSave(dashboard); const { state, onDashboardSave } = useDashboardSave(dashboard);
const [dashboardSaveModelClone, setDashboardSaveModelClone] = useState();
return ( return (
<> <>
{state.error && <SaveDashboardErrorProxy error={state.error} dashboard={dashboard} onDismiss={onDismiss} />} {state.error && (
<SaveDashboardErrorProxy
error={state.error}
dashboard={dashboard}
dashboardSaveModel={dashboardSaveModelClone}
onDismiss={onDismiss}
/>
)}
{!state.error && ( {!state.error && (
<Modal <Modal
isOpen={true} isOpen={true}
@ -30,7 +38,10 @@ export const SaveDashboardModal: React.FC<SaveDashboardModalProps> = ({ dashboar
onSaveSuccess(); onSaveSuccess();
} }
}} }}
onSubmit={onDashboardSave} onSubmit={(clone, options, dashboard) => {
setDashboardSaveModelClone(clone);
return onDashboardSave(clone, options, dashboard);
}}
/> />
</Modal> </Modal>
)} )}

@ -39,6 +39,8 @@ export const useDashboardSave = (dashboard: DashboardModel) => {
dispatch( dispatch(
updateLocation({ updateLocation({
path: newUrl, path: newUrl,
replace: true,
query: {},
}) })
); );
} }

Loading…
Cancel
Save