Files
Ashley Harrison 266751b96d NestedFolders: stay in the modal whilst actions complete (#69730)
* stay in the modal whilst actions complete

* don't return anything here to fix types

* ensure we're always resetting button state
2023-06-12 16:53:17 +01:00

78 lines
2.4 KiB
TypeScript

import { css } from '@emotion/css';
import React, { useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { locationService } from '@grafana/runtime';
import { ConfirmModal, LinkButton, useStyles2 } from '@grafana/ui';
import { RuleIdentifier } from 'app/types/unified-alerting';
import * as ruleId from '../../utils/rule-id';
import { createUrl } from '../../utils/url';
interface CloneRuleButtonProps {
ruleIdentifier: RuleIdentifier;
isProvisioned: boolean;
text?: string;
className?: string;
}
export const CloneRuleButton = React.forwardRef<HTMLAnchorElement, CloneRuleButtonProps>(
({ text, ruleIdentifier, isProvisioned, className }, ref) => {
// For provisioned rules an additional confirmation step is required
// Users have to be aware that the cloned rule will NOT be marked as provisioned
const [provRuleCloneUrl, setProvRuleCloneUrl] = useState<string | undefined>(undefined);
const styles = useStyles2(getStyles);
const cloneUrl = createUrl('/alerting/new', { copyFrom: ruleId.stringifyIdentifier(ruleIdentifier) });
return (
<>
<LinkButton
title="Copy"
className={className}
size="sm"
key="clone"
variant="secondary"
icon="copy"
href={isProvisioned ? undefined : cloneUrl}
onClick={isProvisioned ? () => setProvRuleCloneUrl(cloneUrl) : undefined}
ref={ref}
>
{text}
</LinkButton>
<ConfirmModal
isOpen={!!provRuleCloneUrl}
title="Copy provisioned alert rule"
body={
<div>
<p>
The new rule will <span className={styles.bold}>NOT</span> be marked as a provisioned rule.
</p>
<p>
You will need to set a new alert group for the copied rule because the original one has been provisioned
and cannot be used for rules created in the UI.
</p>
</div>
}
confirmText="Copy"
onConfirm={() => {
if (provRuleCloneUrl) {
locationService.push(provRuleCloneUrl);
}
}}
onDismiss={() => setProvRuleCloneUrl(undefined)}
/>
</>
);
}
);
CloneRuleButton.displayName = 'CloneRuleButton';
const getStyles = (theme: GrafanaTheme2) => ({
bold: css`
font-weight: ${theme.typography.fontWeightBold};
`,
});