import { css } from '@emotion/css'; import React, { useEffect } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { FetchError } from '@grafana/runtime'; import { Button, ConfirmModal, Modal, useStyles2 } 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: DashboardModel; error: FetchError; onDismiss: () => void; } export const SaveDashboardErrorProxy = ({ dashboard, dashboardSaveModel, error, onDismiss, }: SaveDashboardErrorProxyProps) => { const { onDashboardSave } = useDashboardSave(dashboard); useEffect(() => { if (error.data && proxyHandlesError(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 = ({ onDismiss, dashboard }: SaveDashboardModalProps) => { const { onDashboardSave } = useDashboardSave(dashboard); const styles = useStyles2(getConfirmPluginDashboardSaveModalStyles); return (
Your changes will be lost when you update the plugin.
Use Save As to create custom version.
); }; export const proxyHandlesError = (errorStatus: string) => { switch (errorStatus) { case 'version-mismatch': case 'name-exists': case 'plugin-dashboard': return true; default: return false; } }; const getConfirmPluginDashboardSaveModalStyles = (theme: GrafanaTheme2) => ({ modal: css` width: 500px; `, modalText: css` font-size: ${theme.typography.h4.fontSize}; color: ${theme.colors.text.primary}; margin-bottom: ${theme.spacing(4)} padding-top: ${theme.spacing(2)}; `, modalButtonRow: css` margin-bottom: 14px; a, button { margin-right: ${theme.spacing(2)}; } `, });