import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { Alert, LinkButton, LoadingPlaceholder, useStyles2, withErrorBoundary } from '@grafana/ui'; import Page from 'app/core/components/Page/Page'; import { contextSrv } from 'app/core/services/context_srv'; import { useCleanup } from 'app/core/hooks/useCleanup'; import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; import { RuleIdentifier } from 'app/types/unified-alerting'; import React, { FC, useEffect } from 'react'; import { useDispatch } from 'react-redux'; import { AlertRuleForm } from './components/rule-editor/AlertRuleForm'; import { useIsRuleEditable } from './hooks/useIsRuleEditable'; import { useUnifiedAlertingSelector } from './hooks/useUnifiedAlertingSelector'; import { fetchEditableRuleAction } from './state/actions'; import * as ruleId from './utils/rule-id'; interface ExistingRuleEditorProps { identifier: RuleIdentifier; } const ExistingRuleEditor: FC = ({ identifier }) => { useCleanup((state) => state.unifiedAlerting.ruleForm.existingRule); const { loading, result, error, dispatched } = useUnifiedAlertingSelector((state) => state.ruleForm.existingRule); const dispatch = useDispatch(); const { isEditable } = useIsRuleEditable(ruleId.ruleIdentifierToRuleSourceName(identifier), result?.rule); useEffect(() => { if (!dispatched) { dispatch(fetchEditableRuleAction(identifier)); } }, [dispatched, dispatch, identifier]); if (loading || isEditable === undefined) { return ( ); } if (error) { return ( {error.message} ); } if (!result) { return Sorry! This rule does not exist.; } if (isEditable === false) { return Sorry! You do not have permission to edit this rule.; } return ; }; type RuleEditorProps = GrafanaRouteComponentProps<{ id?: string }>; const RuleEditor: FC = ({ match }) => { const { id } = match.params; const identifier = ruleId.tryParse(id, true); if (identifier) { return ; } if (!(contextSrv.hasEditPermissionInFolders || contextSrv.isEditor)) { return Sorry! You are not allowed to create rules.; } return ; }; const AlertWarning: FC<{ title: string }> = ({ title, children }) => (

{children}

To rule list
); const warningStyles = (theme: GrafanaTheme2) => ({ warning: css` margin: ${theme.spacing(4)}; `, }); export default withErrorBoundary(RuleEditor, { style: 'page' });