{"version":3,"file":"8613.323a08f4647753ce344c.js","mappings":"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","sources":["webpack://grafana/./public/app/features/alerting/unified/components/DynamicTableWithGuidelines.tsx","webpack://grafana/./public/app/features/alerting/unified/components/RuleLocation.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleActionsButtons.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetails.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RulesTable.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useHasRuler.ts"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { DynamicTable, DynamicTableProps } from './DynamicTable';\n\nexport type DynamicTableWithGuidelinesProps<T> = Omit<DynamicTableProps<T>, 'renderPrefixHeader, renderPrefixCell'>;\n\n// DynamicTable, but renders visual guidelines on the left, for larger screen widths\nexport const DynamicTableWithGuidelines = <T extends object>({\n renderExpandedContent,\n ...props\n}: DynamicTableWithGuidelinesProps<T>) => {\n const styles = useStyles2(getStyles);\n return (\n <DynamicTable\n renderExpandedContent={\n renderExpandedContent\n ? (item, index, items) => (\n <>\n {!(index === items.length - 1) && <div className={cx(styles.contentGuideline, styles.guideline)} />}\n {renderExpandedContent(item, index, items)}\n </>\n )\n : undefined\n }\n renderPrefixHeader={() => (\n <div className={styles.relative}>\n <div className={cx(styles.headerGuideline, styles.guideline)} />\n </div>\n )}\n renderPrefixCell={(_, index, items) => (\n <div className={styles.relative}>\n <div className={cx(styles.topGuideline, styles.guideline)} />\n {!(index === items.length - 1) && <div className={cx(styles.bottomGuideline, styles.guideline)} />}\n </div>\n )}\n {...props}\n />\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n relative: css`\n position: relative;\n height: 100%;\n `,\n guideline: css`\n left: -19px;\n border-left: 1px solid ${theme.colors.border.medium};\n position: absolute;\n\n ${theme.breakpoints.down('md')} {\n display: none;\n }\n `,\n topGuideline: css`\n width: 18px;\n border-bottom: 1px solid ${theme.colors.border.medium};\n top: 0;\n bottom: 50%;\n `,\n bottomGuideline: css`\n top: 50%;\n bottom: 0;\n `,\n contentGuideline: css`\n top: 0;\n bottom: 0;\n left: -49px !important;\n `,\n headerGuideline: css`\n top: -25px;\n bottom: 0;\n `,\n});\n","import React, { FC } from 'react';\n\nimport { Icon } from '@grafana/ui';\n\ninterface RuleLocationProps {\n namespace: string;\n group?: string;\n}\n\nconst RuleLocation: FC<RuleLocationProps> = ({ namespace, group }) => {\n if (!group) {\n return <>{namespace}</>;\n }\n\n return (\n <>\n {namespace} <Icon name=\"angle-right\" /> {group}\n </>\n );\n};\n\nexport { RuleLocation };\n","import { css } from '@emotion/css';\nimport React, { FC, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { GrafanaTheme2, urlUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport {\n Button,\n ClipboardButton,\n ConfirmModal,\n HorizontalGroup,\n LinkButton,\n Tooltip,\n useStyles2,\n useTheme2,\n} from '@grafana/ui';\nimport { useAppNotification } from 'app/core/copy/appNotification';\nimport { useMediaQueryChange } from 'app/core/hooks/useMediaQueryChange';\nimport { useDispatch } from 'app/types';\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { useIsRuleEditable } from '../../hooks/useIsRuleEditable';\nimport { deleteRuleAction } from '../../state/actions';\nimport { getRulesSourceName, isCloudRulesSource } from '../../utils/datasource';\nimport { createViewLink } from '../../utils/misc';\nimport * as ruleId from '../../utils/rule-id';\nimport { isFederatedRuleGroup, isGrafanaRulerRule } from '../../utils/rules';\n\nexport const matchesWidth = (width: number) => window.matchMedia(`(max-width: ${width}px)`).matches;\n\ninterface Props {\n rule: CombinedRule;\n rulesSource: RulesSource;\n}\nfunction DontShowIfSmallDevice({ children }: { children: JSX.Element | string }) {\n const theme = useTheme2();\n const smBreakpoint = theme.breakpoints.values.xxl;\n const [isSmallScreen, setIsSmallScreen] = useState(matchesWidth(smBreakpoint));\n const style = useStyles2(getStyles);\n\n useMediaQueryChange({\n breakpoint: smBreakpoint,\n onChange: (e) => {\n setIsSmallScreen(e.matches);\n },\n });\n\n if (isSmallScreen) {\n return null;\n } else {\n return <div className={style.buttonText}>{children}</div>;\n }\n}\n\nexport const RuleActionsButtons: FC<Props> = ({ rule, rulesSource }) => {\n const dispatch = useDispatch();\n const location = useLocation();\n const notifyApp = useAppNotification();\n const style = useStyles2(getStyles);\n const { namespace, group, rulerRule } = rule;\n const [ruleToDelete, setRuleToDelete] = useState<CombinedRule>();\n\n const rulesSourceName = getRulesSourceName(rulesSource);\n\n const isProvisioned = isGrafanaRulerRule(rule.rulerRule) && Boolean(rule.rulerRule.grafana_alert.provenance);\n\n const buttons: JSX.Element[] = [];\n\n const isFederated = isFederatedRuleGroup(group);\n const { isEditable, isRemovable } = useIsRuleEditable(rulesSourceName, rulerRule);\n const returnTo = location.pathname + location.search;\n const isViewMode = inViewMode(location.pathname);\n\n const deleteRule = () => {\n if (ruleToDelete && ruleToDelete.rulerRule) {\n const identifier = ruleId.fromRulerRule(\n getRulesSourceName(ruleToDelete.namespace.rulesSource),\n ruleToDelete.namespace.name,\n ruleToDelete.group.name,\n ruleToDelete.rulerRule\n );\n\n dispatch(deleteRuleAction(identifier, { navigateTo: isViewMode ? '/alerting/list' : undefined }));\n setRuleToDelete(undefined);\n }\n };\n\n const buildShareUrl = () => {\n if (isCloudRulesSource(rulesSource)) {\n const { appUrl, appSubUrl } = config;\n const baseUrl = appSubUrl !== '' ? `${appUrl}${appSubUrl}/` : config.appUrl;\n const ruleUrl = `${encodeURIComponent(rulesSource.name)}/${encodeURIComponent(rule.name)}`;\n return `${baseUrl}alerting/${ruleUrl}/find`;\n }\n\n return window.location.href.split('?')[0];\n };\n\n if (!isViewMode) {\n buttons.push(\n <Tooltip placement=\"top\" content={'View'}>\n <LinkButton\n className={style.button}\n size=\"xs\"\n key=\"view\"\n variant=\"secondary\"\n icon=\"eye\"\n href={createViewLink(rulesSource, rule, returnTo)}\n >\n <DontShowIfSmallDevice>View</DontShowIfSmallDevice>\n </LinkButton>\n </Tooltip>\n );\n }\n\n if (isEditable && rulerRule && !isFederated && !isProvisioned) {\n const sourceName = getRulesSourceName(rulesSource);\n const identifier = ruleId.fromRulerRule(sourceName, namespace.name, group.name, rulerRule);\n\n const editURL = urlUtil.renderUrl(\n `${config.appSubUrl}/alerting/${encodeURIComponent(ruleId.stringifyIdentifier(identifier))}/edit`,\n {\n returnTo,\n }\n );\n\n if (isViewMode) {\n buttons.push(\n <ClipboardButton\n key=\"copy\"\n icon=\"copy\"\n onClipboardError={(copiedText) => {\n notifyApp.error('Error while copying URL', copiedText);\n }}\n className={style.button}\n size=\"sm\"\n getText={buildShareUrl}\n >\n Copy link to rule\n </ClipboardButton>\n );\n }\n\n buttons.push(\n <Tooltip placement=\"top\" content={'Edit'}>\n <LinkButton className={style.button} size=\"xs\" key=\"edit\" variant=\"secondary\" icon=\"pen\" href={editURL}>\n <DontShowIfSmallDevice>Edit</DontShowIfSmallDevice>\n </LinkButton>\n </Tooltip>\n );\n }\n\n if (isRemovable && rulerRule && !isFederated && !isProvisioned) {\n buttons.push(\n <Tooltip placement=\"top\" content={'Delete'}>\n <Button\n className={style.button}\n size=\"xs\"\n type=\"button\"\n key=\"delete\"\n variant=\"secondary\"\n icon=\"trash-alt\"\n onClick={() => setRuleToDelete(rule)}\n >\n <DontShowIfSmallDevice>Delete</DontShowIfSmallDevice>\n </Button>\n </Tooltip>\n );\n }\n\n if (buttons.length) {\n return (\n <>\n <div className={style.wrapper}>\n <HorizontalGroup width=\"auto\">\n {buttons.length ? buttons.map((button, index) => <div key={index}>{button}</div>) : <div />}\n </HorizontalGroup>\n </div>\n {!!ruleToDelete && (\n <ConfirmModal\n isOpen={true}\n title=\"Delete rule\"\n body=\"Deleting this rule will permanently remove it from your alert rule list. Are you sure you want to delete this rule?\"\n confirmText=\"Yes, delete\"\n icon=\"exclamation-triangle\"\n onConfirm={deleteRule}\n onDismiss={() => setRuleToDelete(undefined)}\n />\n )}\n </>\n );\n }\n\n return null;\n};\n\nfunction inViewMode(pathname: string): boolean {\n return pathname.endsWith('/view');\n}\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n flex-wrap: wrap;\n `,\n button: css`\n height: 24px;\n font-size: ${theme.typography.size.sm};\n svg {\n margin-right: 0;\n }\n `,\n buttonText: css`\n margin-left: 8px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data/src';\nimport { config } from '@grafana/runtime/src';\nimport { Icon, Tooltip, useStyles2 } from '@grafana/ui/src';\n\nimport { CombinedRule } from '../../../../../types/unified-alerting';\nimport { checkEvaluationIntervalGlobalLimit } from '../../utils/config';\n\ninterface RuleConfigStatusProps {\n rule: CombinedRule;\n}\n\nexport function RuleConfigStatus({ rule }: RuleConfigStatusProps) {\n const styles = useStyles2(getStyles);\n\n const { exceedsLimit } = useMemo(\n () => checkEvaluationIntervalGlobalLimit(rule.group.interval),\n [rule.group.interval]\n );\n\n if (!exceedsLimit) {\n return null;\n }\n\n return (\n <Tooltip\n theme=\"error\"\n content={\n <div>\n A minimum evaluation interval of{' '}\n <span className={styles.globalLimitValue}>{config.unifiedAlerting.minInterval}</span> has been configured in\n Grafana and will be used instead of the {rule.group.interval} interval configured for the Rule Group.\n </div>\n }\n >\n <Icon name=\"stopwatch-slash\" className={styles.icon} />\n </Tooltip>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n globalLimitValue: css`\n font-weight: ${theme.typography.fontWeightBold};\n `,\n icon: css`\n fill: ${theme.colors.warning.text};\n `,\n };\n}\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { CombinedRule } from 'app/types/unified-alerting';\n\nimport { isRecordingRulerRule } from '../../utils/rules';\nimport { AlertLabels } from '../AlertLabels';\nimport { DetailsField } from '../DetailsField';\n\nimport { RuleDetailsActionButtons } from './RuleDetailsActionButtons';\nimport { RuleDetailsAnnotations } from './RuleDetailsAnnotations';\nimport { RuleDetailsDataSources } from './RuleDetailsDataSources';\nimport { RuleDetailsExpression } from './RuleDetailsExpression';\nimport { RuleDetailsMatchingInstances } from './RuleDetailsMatchingInstances';\n\ninterface Props {\n rule: CombinedRule;\n}\n\n// The limit is set to 15 in order to upkeep the good performance\n// and to encourage users to go to the rule details page to see the rest of the instances\n// We don't want to paginate the instances list on the alert list page\nconst INSTANCES_DISPLAY_LIMIT = 15;\n\nexport const RuleDetails: FC<Props> = ({ rule }) => {\n const styles = useStyles2(getStyles);\n const {\n namespace: { rulesSource },\n } = rule;\n\n const annotations = Object.entries(rule.annotations).filter(([_, value]) => !!value.trim());\n\n return (\n <div>\n <RuleDetailsActionButtons rule={rule} rulesSource={rulesSource} isViewMode={false} />\n <div className={styles.wrapper}>\n <div className={styles.leftSide}>\n {<EvaluationBehaviorSummary rule={rule} />}\n {!!rule.labels && !!Object.keys(rule.labels).length && (\n <DetailsField label=\"Labels\" horizontal={true}>\n <AlertLabels labels={rule.labels} />\n </DetailsField>\n )}\n <RuleDetailsExpression rulesSource={rulesSource} rule={rule} annotations={annotations} />\n <RuleDetailsAnnotations annotations={annotations} />\n </div>\n <div className={styles.rightSide}>\n <RuleDetailsDataSources rulesSource={rulesSource} rule={rule} />\n </div>\n </div>\n <RuleDetailsMatchingInstances rule={rule} itemsDisplayLimit={INSTANCES_DISPLAY_LIMIT} />\n </div>\n );\n};\n\ninterface EvaluationBehaviorSummaryProps {\n rule: CombinedRule;\n}\n\nconst EvaluationBehaviorSummary = ({ rule }: EvaluationBehaviorSummaryProps) => {\n let forDuration: string | undefined;\n let every = rule.group.interval;\n\n // recording rules don't have a for duration\n if (!isRecordingRulerRule(rule.rulerRule)) {\n forDuration = rule.rulerRule?.for;\n }\n\n return (\n <>\n {every && (\n <DetailsField label=\"Evaluate\" horizontal={true}>\n Every {every}\n </DetailsField>\n )}\n {forDuration && (\n <DetailsField label=\"For\" horizontal={true}>\n {forDuration}\n </DetailsField>\n )}\n </>\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n display: flex;\n flex-direction: row;\n\n ${theme.breakpoints.down('md')} {\n flex-direction: column;\n }\n `,\n leftSide: css`\n flex: 1;\n `,\n rightSide: css`\n ${theme.breakpoints.up('md')} {\n padding-left: 90px;\n width: 300px;\n }\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { CombinedRule } from 'app/types/unified-alerting';\n\nimport { DEFAULT_PER_PAGE_PAGINATION } from '../../../../../core/constants';\nimport { useHasRuler } from '../../hooks/useHasRuler';\nimport { Annotation } from '../../utils/constants';\nimport { isGrafanaRulerRule } from '../../utils/rules';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\nimport { DynamicTableWithGuidelines } from '../DynamicTableWithGuidelines';\nimport { ProvisioningBadge } from '../Provisioning';\nimport { RuleLocation } from '../RuleLocation';\nimport { Tokenize } from '../Tokenize';\n\nimport { RuleActionsButtons } from './RuleActionsButtons';\nimport { RuleConfigStatus } from './RuleConfigStatus';\nimport { RuleDetails } from './RuleDetails';\nimport { RuleHealth } from './RuleHealth';\nimport { RuleState } from './RuleState';\n\ntype RuleTableColumnProps = DynamicTableColumnProps<CombinedRule>;\ntype RuleTableItemProps = DynamicTableItemProps<CombinedRule>;\n\ninterface Props {\n rules: CombinedRule[];\n showGuidelines?: boolean;\n showGroupColumn?: boolean;\n showSummaryColumn?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport const RulesTable: FC<Props> = ({\n rules,\n className,\n showGuidelines = false,\n emptyMessage = 'No rules found.',\n showGroupColumn = false,\n showSummaryColumn = false,\n}) => {\n const styles = useStyles2(getStyles);\n\n const wrapperClass = cx(styles.wrapper, className, { [styles.wrapperMargin]: showGuidelines });\n\n const items = useMemo((): RuleTableItemProps[] => {\n return rules.map((rule, ruleIdx) => {\n return {\n id: `${rule.namespace.name}-${rule.group.name}-${rule.name}-${ruleIdx}`,\n data: rule,\n };\n });\n }, [rules]);\n\n const columns = useColumns(showSummaryColumn, showGroupColumn);\n\n if (!rules.length) {\n return <div className={cx(wrapperClass, styles.emptyMessage)}>{emptyMessage}</div>;\n }\n\n const TableComponent = showGuidelines ? DynamicTableWithGuidelines : DynamicTable;\n\n return (\n <div className={wrapperClass} data-testid=\"rules-table\">\n <TableComponent\n cols={columns}\n isExpandable={true}\n items={items}\n renderExpandedContent={({ data: rule }) => <RuleDetails rule={rule} />}\n pagination={{ itemsPerPage: DEFAULT_PER_PAGE_PAGINATION }}\n paginationStyles={styles.pagination}\n />\n </div>\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapperMargin: css`\n ${theme.breakpoints.up('md')} {\n margin-left: 36px;\n }\n `,\n emptyMessage: css`\n padding: ${theme.spacing(1)};\n `,\n wrapper: css`\n width: auto;\n border-radius: ${theme.shape.borderRadius()};\n `,\n pagination: css`\n display: flex;\n margin: 0;\n padding-top: ${theme.spacing(1)};\n padding-bottom: ${theme.spacing(0.25)};\n justify-content: center;\n border-left: 1px solid ${theme.colors.border.strong};\n border-right: 1px solid ${theme.colors.border.strong};\n border-bottom: 1px solid ${theme.colors.border.strong};\n `,\n});\n\nfunction useColumns(showSummaryColumn: boolean, showGroupColumn: boolean) {\n const { hasRuler, rulerRulesLoaded } = useHasRuler();\n\n return useMemo((): RuleTableColumnProps[] => {\n const columns: RuleTableColumnProps[] = [\n {\n id: 'state',\n label: 'State',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => {\n const { namespace } = rule;\n const { rulesSource } = namespace;\n const { promRule, rulerRule } = rule;\n const isDeleting = !!(hasRuler(rulesSource) && rulerRulesLoaded(rulesSource) && promRule && !rulerRule);\n const isCreating = !!(hasRuler(rulesSource) && rulerRulesLoaded(rulesSource) && rulerRule && !promRule);\n return <RuleState rule={rule} isDeleting={isDeleting} isCreating={isCreating} />;\n },\n size: '165px',\n },\n {\n id: 'name',\n label: 'Name',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => rule.name,\n size: 5,\n },\n {\n id: 'provisioned',\n label: '',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => {\n const rulerRule = rule.rulerRule;\n const isGrafanaManagedRule = isGrafanaRulerRule(rulerRule);\n\n if (!isGrafanaManagedRule) {\n return null;\n }\n\n const provenance = rulerRule.grafana_alert.provenance;\n return provenance ? <ProvisioningBadge /> : null;\n },\n size: '100px',\n },\n {\n id: 'warnings',\n label: '',\n renderCell: ({ data: combinedRule }) => <RuleConfigStatus rule={combinedRule} />,\n size: '45px',\n },\n {\n id: 'health',\n label: 'Health',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: { promRule, group } }) => (promRule ? <RuleHealth rule={promRule} /> : null),\n size: '75px',\n },\n ];\n if (showSummaryColumn) {\n columns.push({\n id: 'summary',\n label: 'Summary',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => {\n return <Tokenize input={rule.annotations[Annotation.summary] ?? ''} />;\n },\n size: 5,\n });\n }\n if (showGroupColumn) {\n columns.push({\n id: 'group',\n label: 'Group',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => {\n const { namespace, group } = rule;\n // ungrouped rules are rules that are in the \"default\" group name\n const isUngrouped = group.name === 'default';\n const groupName = isUngrouped ? (\n <RuleLocation namespace={namespace.name} />\n ) : (\n <RuleLocation namespace={namespace.name} group={group.name} />\n );\n\n return groupName;\n },\n size: 5,\n });\n }\n columns.push({\n id: 'actions',\n label: 'Actions',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => {\n return <RuleActionsButtons rule={rule} rulesSource={rule.namespace.rulesSource} />;\n },\n size: '290px',\n });\n\n return columns;\n }, [showSummaryColumn, showGroupColumn, hasRuler, rulerRulesLoaded]);\n}\n","import { useCallback } from 'react';\n\nimport { RulesSource } from 'app/types/unified-alerting';\n\nimport { getRulesSourceName, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\n// datasource has ruler if it's grafana managed or if we're able to load rules from it\nexport function useHasRuler() {\n const rulerRules = useUnifiedAlertingSelector((state) => state.rulerRules);\n\n const hasRuler = useCallback(\n (rulesSource: string | RulesSource) => {\n const rulesSourceName = typeof rulesSource === 'string' ? rulesSource : rulesSource.name;\n return rulesSourceName === GRAFANA_RULES_SOURCE_NAME || !!rulerRules[rulesSourceName]?.result;\n },\n [rulerRules]\n );\n\n const rulerRulesLoaded = useCallback(\n (rulesSource: RulesSource) => {\n const rulesSourceName = getRulesSourceName(rulesSource);\n const result = rulerRules[rulesSourceName]?.result;\n\n return Boolean(result);\n },\n [rulerRules]\n );\n\n return { hasRuler, rulerRulesLoaded };\n}\n"],"names":["DynamicTableWithGuidelines","renderExpandedContent","props","styles","useStyles2","getStyles","item","index","items","length","className","cx","contentGuideline","guideline","undefined","renderPrefixHeader","relative","headerGuideline","renderPrefixCell","_","topGuideline","bottomGuideline","theme","css","colors","border","medium","breakpoints","down","RuleLocation","namespace","group","name","DontShowIfSmallDevice","children","smBreakpoint","useTheme2","values","xxl","isSmallScreen","setIsSmallScreen","useState","width","window","matchMedia","matches","style","useMediaQueryChange","breakpoint","onChange","e","buttonText","RuleActionsButtons","rule","rulesSource","dispatch","useDispatch","location","useLocation","notifyApp","useAppNotification","rulerRule","ruleToDelete","setRuleToDelete","rulesSourceName","getRulesSourceName","isProvisioned","isGrafanaRulerRule","Boolean","grafana_alert","provenance","buttons","isFederated","isFederatedRuleGroup","isEditable","isRemovable","useIsRuleEditable","returnTo","pathname","search","isViewMode","endsWith","deleteRule","identifier","ruleId","deleteRuleAction","navigateTo","buildShareUrl","isCloudRulesSource","appUrl","appSubUrl","config","encodeURIComponent","href","split","push","Tooltip","placement","content","button","size","variant","icon","createViewLink","sourceName","editURL","urlUtil","ClipboardButton","onClipboardError","copiedText","error","getText","Button","type","onClick","wrapper","map","ConfirmModal","isOpen","title","body","confirmText","onConfirm","onDismiss","typography","sm","RuleConfigStatus","exceedsLimit","useMemo","checkEvaluationIntervalGlobalLimit","interval","globalLimitValue","Icon","fontWeightBold","warning","text","RuleDetails","annotations","Object","entries","filter","value","trim","RuleDetailsActionButtons","leftSide","EvaluationBehaviorSummary","labels","keys","DetailsField","label","horizontal","AlertLabels","RuleDetailsExpression","RuleDetailsAnnotations","rightSide","RuleDetailsDataSources","RuleDetailsMatchingInstances","itemsDisplayLimit","forDuration","every","isRecordingRulerRule","for","up","RulesTable","rules","showGuidelines","emptyMessage","showGroupColumn","showSummaryColumn","wrapperClass","wrapperMargin","ruleIdx","id","data","columns","useColumns","TableComponent","DynamicTable","cols","isExpandable","pagination","itemsPerPage","DEFAULT_PER_PAGE_PAGINATION","paginationStyles","spacing","shape","borderRadius","strong","hasRuler","rulerRulesLoaded","useHasRuler","renderCell","promRule","isDeleting","isCreating","RuleState","Provisioning","combinedRule","RuleHealth","Tokenize","input","Annotation","rulerRules","useUnifiedAlertingSelector","state","useCallback","GRAFANA_RULES_SOURCE_NAME","result"],"sourceRoot":""}