grafana/public/app/features/dashboard/components/DeleteDashboard/DeleteDashboardModal.tsx
Torkel Ödegaard 10badea19e
Emotion: Upgrades emotion from 10 to 11 and updates all import paths (#32541)
* Babel: Updates babel dependencies to latest version

* Emotion: Upgrade form 10 to 11

* Fixing tests

* Updated to use emotion/css instead in test
2021-04-01 14:15:23 +02:00

98 lines
2.6 KiB
TypeScript

import React from 'react';
import { css } from '@emotion/css';
import sumBy from 'lodash/sumBy';
import { Modal, ConfirmModal, HorizontalGroup, Button } from '@grafana/ui';
import { DashboardModel, PanelModel } from '../../state';
import { useDashboardDelete } from './useDashboardDelete';
import useAsyncFn from 'react-use/lib/useAsyncFn';
type DeleteDashboardModalProps = {
hideModal(): void;
dashboard: DashboardModel;
};
export const DeleteDashboardModal: React.FC<DeleteDashboardModalProps> = ({ hideModal, dashboard }) => {
const isProvisioned = dashboard.meta.provisioned;
const { onDeleteDashboard } = useDashboardDelete(dashboard.uid);
const [, onConfirm] = useAsyncFn(async () => {
await onDeleteDashboard();
hideModal();
}, [hideModal]);
const modalBody = getModalBody(dashboard.panels, dashboard.title);
if (isProvisioned) {
return <ProvisionedDeleteModal hideModal={hideModal} provisionedId={dashboard.meta.provisionedExternalId!} />;
}
return (
<ConfirmModal
isOpen={true}
body={modalBody}
onConfirm={onConfirm}
onDismiss={hideModal}
title="Delete"
icon="trash-alt"
confirmText="Delete"
/>
);
};
const getModalBody = (panels: PanelModel[], title: string) => {
const totalAlerts = sumBy(panels, (panel) => (panel.alert ? 1 : 0));
return totalAlerts > 0 ? (
<>
<p>Do you want to delete this dashboard?</p>
<p>
This dashboard contains {totalAlerts} alert{totalAlerts > 1 ? 's' : ''}. Deleting this dashboard will also
delete those alerts
</p>
</>
) : (
<>
<p>Do you want to delete this dashboard?</p>
<p>{title}</p>
</>
);
};
const ProvisionedDeleteModal = ({ hideModal, provisionedId }: { hideModal(): void; provisionedId: string }) => (
<Modal
isOpen={true}
title="Cannot delete provisioned dashboard"
icon="trash-alt"
onDismiss={hideModal}
className={css`
text-align: center;
width: 500px;
`}
>
<p>
This dashboard is managed by Grafanas provisioning and cannot be deleted. Remove the dashboard from the config
file to delete it.
</p>
<p>
<i>
See{' '}
<a
className="external-link"
href="http://docs.grafana.org/administration/provisioning/#dashboards"
target="_blank"
rel="noreferrer"
>
documentation
</a>{' '}
for more information about provisioning.
</i>
<br />
File path: {provisionedId}
</p>
<HorizontalGroup justify="center">
<Button variant="secondary" onClick={hideModal}>
OK
</Button>
</HorizontalGroup>
</Modal>
);