From a7b22a73b635f21ec80e0b7d9121339db409748a Mon Sep 17 00:00:00 2001 From: Peter Holmberg Date: Wed, 18 Aug 2021 14:25:56 +0200 Subject: [PATCH] Alerting: Add Copy link to Alert on View rule page (#37967) * add button to page * add url to getText * reorder imports * build url function * remove log * encode --- .../ClipboardButton.story.internal.tsx | 4 +- .../rules/RuleDetailsActionButtons.tsx | 41 ++++++++++++++++--- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/packages/grafana-ui/src/components/ClipboardButton/ClipboardButton.story.internal.tsx b/packages/grafana-ui/src/components/ClipboardButton/ClipboardButton.story.internal.tsx index 24b5532fb4d..8bc335d7e32 100644 --- a/packages/grafana-ui/src/components/ClipboardButton/ClipboardButton.story.internal.tsx +++ b/packages/grafana-ui/src/components/ClipboardButton/ClipboardButton.story.internal.tsx @@ -14,7 +14,7 @@ export default { page: mdx, }, controls: { - exclude: ['size', 'variant', 'icon', 'className', 'fullWidth', 'getText', 'onClipboardCopy', 'onClipboardError'], + exclude: ['variant', 'icon', 'className', 'fullWidth', 'getText', 'onClipboardCopy', 'onClipboardError'], }, }, } as Meta; @@ -32,6 +32,7 @@ const Wrapper: Story = (args) => {
args.inputText} onClipboardCopy={() => setCopyMessage(clipboardCopyMessage)} > @@ -47,4 +48,5 @@ export const CopyToClipboard = Wrapper.bind({}); CopyToClipboard.args = { inputText: 'go run build.go -goos linux -pkg-arch amd64 ${OPT} package-only', buttonText: 'Copy to clipboard', + size: 'md', }; diff --git a/public/app/features/alerting/unified/components/rules/RuleDetailsActionButtons.tsx b/public/app/features/alerting/unified/components/rules/RuleDetailsActionButtons.tsx index 724b0fbc1d5..b75e7f86587 100644 --- a/public/app/features/alerting/unified/components/rules/RuleDetailsActionButtons.tsx +++ b/public/app/features/alerting/unified/components/rules/RuleDetailsActionButtons.tsx @@ -1,17 +1,19 @@ -import { css } from '@emotion/css'; -import { GrafanaTheme2, urlUtil } from '@grafana/data'; -import { Button, ConfirmModal, HorizontalGroup, LinkButton, useStyles2 } from '@grafana/ui'; -import { contextSrv } from 'app/core/services/context_srv'; -import { CombinedRule, RulesSource } from 'app/types/unified-alerting'; import React, { FC, useState } from 'react'; import { useDispatch } from 'react-redux'; import { useLocation } from 'react-router-dom'; +import { css } from '@emotion/css'; +import { AppEvents, GrafanaTheme2, urlUtil } from '@grafana/data'; +import { config } from '@grafana/runtime'; +import { Button, ConfirmModal, ClipboardButton, HorizontalGroup, LinkButton, useStyles2 } from '@grafana/ui'; +import { contextSrv } from 'app/core/services/context_srv'; +import { appEvents } from 'app/core/core'; import { useIsRuleEditable } from '../../hooks/useIsRuleEditable'; -import { deleteRuleAction } from '../../state/actions'; import { Annotation } from '../../utils/constants'; import { getRulesSourceName, isCloudRulesSource } from '../../utils/datasource'; import { createExploreLink, createViewLink } from '../../utils/misc'; import * as ruleId from '../../utils/rule-id'; +import { deleteRuleAction } from '../../state/actions'; +import { CombinedRule, RulesSource } from 'app/types/unified-alerting'; interface Props { rule: CombinedRule; @@ -46,6 +48,15 @@ export const RuleDetailsActionButtons: FC = ({ rule, rulesSource }) => { } }; + const buildShareUrl = () => { + if (isCloudRulesSource(rulesSource)) { + const ruleUrl = `${encodeURIComponent(rulesSource.name)}/${encodeURIComponent(rule.name)}`; + return `${config.appUrl}${config.appSubUrl ? '/' + config.appSubUrl : ''}alerting/${ruleUrl}/find`; + } + + return window.location.href.split('?')[0]; + }; + // explore does not support grafana rule queries atm if (isCloudRulesSource(rulesSource) && contextSrv.isEditor) { leftButtons.push( @@ -135,6 +146,24 @@ export const RuleDetailsActionButtons: FC = ({ rule, rulesSource }) => { returnTo, }); + if (isViewMode) { + rightButtons.push( + { + appEvents.emit(AppEvents.alertSuccess, ['URL copied!']); + }} + onClipboardError={(e) => { + appEvents.emit(AppEvents.alertError, ['Error while copying URL', e.text]); + }} + className={style.button} + size="sm" + getText={buildShareUrl} + > + Copy link to rule + + ); + } + rightButtons.push( Edit