import { css } from '@emotion/css'; import React, { useEffect } from 'react'; import { GrafanaTheme } from '@grafana/data'; import { Button, ConfirmModal, Modal, stylesFactory, useTheme } from '@grafana/ui'; import { DashboardModel } from 'app/features/dashboard/state'; import { SaveDashboardAsButton } from './SaveDashboardButton'; import { SaveDashboardModalProps } from './types'; import { useDashboardSave } from './useDashboardSave'; 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, dashboardSaveModel, error, onDismiss, }) => { const { onDashboardSave } = useDashboardSave(dashboard); useEffect(() => { if (error.data && isHandledError(error.data.status)) { error.isHandled = true; } }, [error]); return ( <> {error.data && error.data.status === 'version-mismatch' && ( Someone else has updated this dashboard
Would you still like to save this dashboard? } confirmText="Save and overwrite" onConfirm={async () => { await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard); onDismiss(); }} onDismiss={onDismiss} /> )} {error.data && error.data.status === 'name-exists' && ( A dashboard with the same name in selected folder already exists.
Would you still like to save this dashboard? } confirmText="Save and overwrite" onConfirm={async () => { await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard); onDismiss(); }} onDismiss={onDismiss} /> )} {error.data && error.data.status === 'plugin-dashboard' && ( )} ); }; const ConfirmPluginDashboardSaveModal: React.FC = ({ onDismiss, dashboard }) => { const theme = useTheme(); const { onDashboardSave } = useDashboardSave(dashboard); const styles = getConfirmPluginDashboardSaveModalStyles(theme); return (
Your changes will be lost when you update the plugin.
Use Save As to create custom version.
); }; const isHandledError = (errorStatus: string) => { switch (errorStatus) { case 'version-mismatch': case 'name-exists': case 'plugin-dashboard': return true; default: return false; } }; const getConfirmPluginDashboardSaveModalStyles = stylesFactory((theme: GrafanaTheme) => ({ modal: css` width: 500px; `, modalText: css` font-size: ${theme.typography.heading.h4}; color: ${theme.colors.link}; margin-bottom: calc(${theme.spacing.d} * 2); padding-top: ${theme.spacing.d}; `, modalButtonRow: css` margin-bottom: 14px; a, button { margin-right: ${theme.spacing.d}; } `, }));