{"version":3,"file":"8057.c68ff85adcf9d233cf4f.js","mappings":"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","sources":["webpack://grafana/./public/app/features/alerting/unified/components/Provisioning.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/MatcherFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/StateHistory.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useManagedAlertStateHistory.ts","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsActionButtons.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useStateHistoryModal.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsAnnotations.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsDataSources.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Expression.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsExpression.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsMatchingInstances.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleHealth.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleState.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useCombinedRuleNamespaces.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useFolder.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useIsRuleEditable.ts"],"sourcesContent":["import React from 'react';\n\nimport { Alert, Badge } from '@grafana/ui';\n\nexport enum ProvisionedResource {\n ContactPoint = 'contact point',\n Template = 'template',\n MuteTiming = 'mute timing',\n AlertRule = 'alert rule',\n RootNotificationPolicy = 'root notification policy',\n}\n\ninterface ProvisioningAlertProps {\n resource: ProvisionedResource;\n}\n\nexport const ProvisioningAlert = ({ resource }: ProvisioningAlertProps) => {\n return (\n <Alert title={`This ${resource} cannot be edited through the UI`} severity=\"info\">\n This {resource} has been provisioned, that means it was created by config. Please contact your server admin to\n update this {resource}.\n </Alert>\n );\n};\n\nexport const ProvisioningBadge = () => {\n return <Badge text={'Provisioned'} color={'purple'} />;\n};\n","import { css } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport React, { FormEvent, useEffect, useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { logInfo } from '@grafana/runtime';\nimport { Label, Tooltip, Input, Icon, useStyles2 } from '@grafana/ui';\n\nimport { LogMessages } from '../../Analytics';\n\ninterface Props {\n className?: string;\n defaultQueryString?: string;\n onFilterChange: (filterString: string) => void;\n}\n\nexport const MatcherFilter = ({ className, onFilterChange, defaultQueryString }: Props) => {\n const styles = useStyles2(getStyles);\n\n const onSearchInputChanged = useMemo(\n () =>\n debounce((e: FormEvent<HTMLInputElement>) => {\n logInfo(LogMessages.filterByLabel);\n\n const target = e.target as HTMLInputElement;\n onFilterChange(target.value);\n }, 600),\n [onFilterChange]\n );\n\n useEffect(() => onSearchInputChanged.cancel(), [onSearchInputChanged]);\n\n const searchIcon = <Icon name={'search'} />;\n\n return (\n <div className={className}>\n <Label>\n <Stack gap={0.5}>\n <span>Search by label</span>\n <Tooltip\n content={\n <div>\n Filter alerts using label querying, ex:\n <pre>{`{severity=\"critical\", instance=~\"cluster-us-.+\"}`}</pre>\n </div>\n }\n >\n <Icon className={styles.icon} name=\"info-circle\" size=\"sm\" />\n </Tooltip>\n </Stack>\n </Label>\n <Input\n placeholder=\"Search\"\n defaultValue={defaultQueryString}\n onChange={onSearchInputChanged}\n data-testid=\"search-query-input\"\n prefix={searchIcon}\n className={styles.inputWidth}\n />\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n icon: css`\n margin-right: ${theme.spacing(0.5)};\n `,\n inputWidth: css`\n width: 340px;\n flex-grow: 0;\n `,\n});\n","import { css } from '@emotion/css';\nimport { groupBy } from 'lodash';\nimport React, { FC, FormEvent, useCallback, useState } from 'react';\n\nimport { AlertState, dateTimeFormat, GrafanaTheme2 } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Alert, Field, Icon, Input, Label, LoadingPlaceholder, Tooltip, useStyles2 } from '@grafana/ui';\nimport { StateHistoryItem, StateHistoryItemData } from 'app/types/unified-alerting';\nimport { GrafanaAlertStateWithReason, PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { useManagedAlertStateHistory } from '../../hooks/useManagedAlertStateHistory';\nimport { AlertLabel } from '../AlertLabel';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\n\nimport { AlertStateTag } from './AlertStateTag';\n\ntype StateHistoryRowItem = {\n id: string;\n state: PromAlertingRuleState | GrafanaAlertStateWithReason | AlertState;\n text?: string;\n data?: StateHistoryItemData;\n timestamp?: number;\n stringifiedLabels: string;\n};\n\ntype StateHistoryMap = Record<string, StateHistoryRowItem[]>;\n\ntype StateHistoryRow = DynamicTableItemProps<StateHistoryRowItem>;\n\ninterface RuleStateHistoryProps {\n alertId: string;\n}\n\nconst StateHistory: FC<RuleStateHistoryProps> = ({ alertId }) => {\n const [textFilter, setTextFilter] = useState<string>('');\n const handleTextFilter = useCallback((event: FormEvent<HTMLInputElement>) => {\n setTextFilter(event.currentTarget.value);\n }, []);\n\n const { loading, error, result = [] } = useManagedAlertStateHistory(alertId);\n\n const styles = useStyles2(getStyles);\n\n if (loading && !error) {\n return <LoadingPlaceholder text={'Loading history...'} />;\n }\n\n if (error && !loading) {\n return <Alert title={'Failed to fetch alert state history'}>{error.message}</Alert>;\n }\n\n const columns: Array<DynamicTableColumnProps<StateHistoryRowItem>> = [\n { id: 'state', label: 'State', size: 'max-content', renderCell: renderStateCell },\n { id: 'value', label: '', size: 'auto', renderCell: renderValueCell },\n { id: 'timestamp', label: 'Time', size: 'max-content', renderCell: renderTimestampCell },\n ];\n\n // group the state history list by unique set of labels\n const tables = Object.entries(groupStateByLabels(result))\n // sort and filter each table\n .sort()\n .filter(([groupKey]) => matchKey(groupKey, textFilter))\n .map(([groupKey, items]) => {\n const tableItems: StateHistoryRow[] = items.map((historyItem) => ({\n id: historyItem.id,\n data: historyItem,\n }));\n\n return (\n <div key={groupKey}>\n <header className={styles.tableGroupKey}>\n <code>{groupKey}</code>\n </header>\n <DynamicTable cols={columns} items={tableItems} />\n </div>\n );\n });\n\n return (\n <div>\n <nav>\n <Field\n label={\n <Label>\n <Stack gap={0.5}>\n <span>Filter group</span>\n <Tooltip\n content={\n <div>\n Filter each state history group either by exact match or a regular expression, ex:{' '}\n <code>{`region=eu-west-1`}</code> or <code>{`/region=us-.+/`}</code>\n </div>\n }\n >\n <Icon name=\"info-circle\" size=\"sm\" />\n </Tooltip>\n </Stack>\n </Label>\n }\n >\n <Input prefix={<Icon name={'search'} />} onChange={handleTextFilter} placeholder=\"Search\" />\n </Field>\n </nav>\n {tables}\n </div>\n );\n};\n\n// group state history by labels\nexport function groupStateByLabels(\n history: Array<Pick<StateHistoryItem, 'id' | 'newState' | 'text' | 'data' | 'updated'>>\n): StateHistoryMap {\n const items: StateHistoryRowItem[] = history.map((item) => {\n // let's grab the last matching set of `{<string>}` since the alert name could also contain { or }\n const LABELS_REGEX = /{.*?}/g;\n const stringifiedLabels = item.text.match(LABELS_REGEX)?.at(-1) ?? '';\n\n return {\n id: String(item.id),\n state: item.newState,\n // let's omit the labels for each entry since it's just added noise to each state history item\n text: item.text.replace(stringifiedLabels, ''),\n data: item.data,\n timestamp: item.updated,\n stringifiedLabels,\n };\n });\n\n // we have to group our state history items by their unique combination of tags since we want to display a DynamicTable for each alert instance\n // (effectively unique combination of labels)\n return groupBy(items, (item) => item.stringifiedLabels);\n}\n\n// match a string either by exact text match or with regular expression when in the form of \"/<regex>/\"\nexport function matchKey(groupKey: string, textFilter: string) {\n // if the text filter is empty we show all matches\n if (textFilter === '') {\n return true;\n }\n\n const isRegExp = textFilter.startsWith('/') && textFilter.endsWith('/');\n\n // not a regular expression, use normal text matching\n if (!isRegExp) {\n return groupKey.includes(textFilter);\n }\n\n // regular expression, try parsing and applying\n // when we fail to parse the text as a regular expression, we return no match\n try {\n return new RegExp(textFilter.slice(1, -1)).test(groupKey);\n } catch (err) {\n return false;\n }\n}\n\nfunction renderValueCell(item: StateHistoryRow) {\n const matches = item.data.data?.evalMatches ?? [];\n\n return (\n <>\n {item.data.text}\n <LabelsWrapper>\n {matches.map((match) => (\n <AlertLabel key={match.metric} labelKey={match.metric} value={String(match.value)} />\n ))}\n </LabelsWrapper>\n </>\n );\n}\n\nfunction renderStateCell(item: StateHistoryRow) {\n return <AlertStateTag state={item.data.state} />;\n}\n\nfunction renderTimestampCell(item: StateHistoryRow) {\n return (\n <div className={TimestampStyle}>{item.data.timestamp && <span>{dateTimeFormat(item.data.timestamp)}</span>}</div>\n );\n}\n\nconst LabelsWrapper = ({ children }: React.PropsWithChildren<{}>) => {\n const { wrapper } = useStyles2(getStyles);\n return <div className={wrapper}>{children}</div>;\n};\n\nconst TimestampStyle = css`\n display: flex;\n align-items: flex-end;\n flex-direction: column;\n`;\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n & > * {\n margin-right: ${theme.spacing(1)};\n }\n `,\n tableGroupKey: css`\n margin-top: ${theme.spacing(2)};\n margin-bottom: ${theme.spacing(2)};\n `,\n});\n\nexport { StateHistory };\n","import { useEffect } from 'react';\n\nimport { useDispatch } from 'app/types';\nimport { StateHistoryItem } from 'app/types/unified-alerting';\n\nimport { fetchGrafanaAnnotationsAction } from '../state/actions';\nimport { AsyncRequestState } from '../utils/redux';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\nexport function useManagedAlertStateHistory(alertId: string) {\n const dispatch = useDispatch();\n const history = useUnifiedAlertingSelector<AsyncRequestState<StateHistoryItem[]>>(\n (state) => state.managedAlertStateHistory\n );\n\n useEffect(() => {\n dispatch(fetchGrafanaAnnotationsAction(alertId));\n }, [dispatch, alertId]);\n\n return history;\n}\n","import { css } from '@emotion/css';\nimport React, { FC, Fragment, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { GrafanaTheme2, textUtil, urlUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Button, ClipboardButton, ConfirmModal, HorizontalGroup, LinkButton, useStyles2 } from '@grafana/ui';\nimport { useAppNotification } from 'app/core/copy/appNotification';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction, useDispatch } from 'app/types';\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { useIsRuleEditable } from '../../hooks/useIsRuleEditable';\nimport { useStateHistoryModal } from '../../hooks/useStateHistoryModal';\nimport { deleteRuleAction } from '../../state/actions';\nimport { getAlertmanagerByUid } from '../../utils/alertmanager';\nimport { Annotation } from '../../utils/constants';\nimport { getRulesSourceName, isCloudRulesSource, isGrafanaRulesSource } from '../../utils/datasource';\nimport { createExploreLink, makeRuleBasedSilenceLink } from '../../utils/misc';\nimport * as ruleId from '../../utils/rule-id';\nimport { isFederatedRuleGroup, isGrafanaRulerRule } from '../../utils/rules';\n\ninterface Props {\n rule: CombinedRule;\n rulesSource: RulesSource;\n isViewMode: boolean;\n}\n\nexport const RuleDetailsActionButtons: FC<Props> = ({ rule, rulesSource, isViewMode }) => {\n const style = useStyles2(getStyles);\n const { namespace, group, rulerRule } = rule;\n const alertId = isGrafanaRulerRule(rule.rulerRule) ? rule.rulerRule.grafana_alert.id ?? '' : '';\n const { StateHistoryModal, showStateHistoryModal } = useStateHistoryModal(alertId);\n const dispatch = useDispatch();\n const location = useLocation();\n const notifyApp = useAppNotification();\n\n const [ruleToDelete, setRuleToDelete] = useState<CombinedRule>();\n\n const alertmanagerSourceName = isGrafanaRulesSource(rulesSource)\n ? rulesSource\n : getAlertmanagerByUid(rulesSource.jsonData.alertmanagerUid)?.name;\n\n const hasExplorePermission = contextSrv.hasPermission(AccessControlAction.DataSourcesExplore);\n\n const buttons: JSX.Element[] = [];\n const rightButtons: JSX.Element[] = [];\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 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 const isFederated = isFederatedRuleGroup(group);\n const rulesSourceName = getRulesSourceName(rulesSource);\n const isProvisioned = isGrafanaRulerRule(rule.rulerRule) && Boolean(rule.rulerRule.grafana_alert.provenance);\n\n const { isEditable, isRemovable } = useIsRuleEditable(rulesSourceName, rulerRule);\n\n const returnTo = location.pathname + location.search;\n // explore does not support grafana rule queries atm\n // neither do \"federated rules\"\n if (isCloudRulesSource(rulesSource) && hasExplorePermission && !isFederated) {\n buttons.push(\n <LinkButton\n className={style.button}\n size=\"xs\"\n key=\"explore\"\n variant=\"primary\"\n icon=\"chart-line\"\n target=\"__blank\"\n href={createExploreLink(rulesSource.name, rule.query)}\n >\n See graph\n </LinkButton>\n );\n }\n if (rule.annotations[Annotation.runbookURL]) {\n buttons.push(\n <LinkButton\n className={style.button}\n size=\"xs\"\n key=\"runbook\"\n variant=\"primary\"\n icon=\"book\"\n target=\"__blank\"\n href={textUtil.sanitizeUrl(rule.annotations[Annotation.runbookURL])}\n >\n View runbook\n </LinkButton>\n );\n }\n if (rule.annotations[Annotation.dashboardUID]) {\n const dashboardUID = rule.annotations[Annotation.dashboardUID];\n if (dashboardUID) {\n buttons.push(\n <LinkButton\n className={style.button}\n size=\"xs\"\n key=\"dashboard\"\n variant=\"primary\"\n icon=\"apps\"\n target=\"__blank\"\n href={`d/${encodeURIComponent(dashboardUID)}`}\n >\n Go to dashboard\n </LinkButton>\n );\n const panelId = rule.annotations[Annotation.panelID];\n if (panelId) {\n buttons.push(\n <LinkButton\n className={style.button}\n size=\"xs\"\n key=\"panel\"\n variant=\"primary\"\n icon=\"apps\"\n target=\"__blank\"\n href={`d/${encodeURIComponent(dashboardUID)}?viewPanel=${encodeURIComponent(panelId)}`}\n >\n Go to panel\n </LinkButton>\n );\n }\n }\n }\n\n if (alertmanagerSourceName && contextSrv.hasAccess(AccessControlAction.AlertingInstanceCreate, contextSrv.isEditor)) {\n buttons.push(\n <LinkButton\n className={style.button}\n size=\"xs\"\n key=\"silence\"\n icon=\"bell-slash\"\n target=\"__blank\"\n href={makeRuleBasedSilenceLink(alertmanagerSourceName, rule)}\n >\n Silence\n </LinkButton>\n );\n }\n\n if (alertId) {\n buttons.push(\n <Fragment key=\"history\">\n <Button className={style.button} size=\"xs\" icon=\"history\" onClick={() => showStateHistoryModal()}>\n Show state history\n </Button>\n {StateHistoryModal}\n </Fragment>\n );\n }\n\n if (isViewMode) {\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 rightButtons.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 rightButtons.push(\n <LinkButton className={style.button} size=\"xs\" key=\"edit\" variant=\"secondary\" icon=\"pen\" href={editURL}>\n Edit\n </LinkButton>\n );\n }\n\n if (isRemovable && rulerRule && !isFederated && !isProvisioned) {\n rightButtons.push(\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 Delete\n </Button>\n );\n }\n }\n\n if (buttons.length || rightButtons.length) {\n return (\n <>\n <div className={style.wrapper}>\n <HorizontalGroup width=\"auto\">{buttons.length ? buttons : <div />}</HorizontalGroup>\n <HorizontalGroup width=\"auto\">{rightButtons.length ? rightButtons : <div />}</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 return null;\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n padding: ${theme.spacing(2)} 0;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n flex-wrap: wrap;\n border-bottom: solid 1px ${theme.colors.border.medium};\n `,\n button: css`\n height: 24px;\n font-size: ${theme.typography.size.sm};\n `,\n});\n","import React, { useMemo, useState } from 'react';\n\nimport { Modal } from '@grafana/ui';\n\nimport { StateHistory } from '../components/rules/StateHistory';\n\nfunction useStateHistoryModal(alertId: string) {\n const [showModal, setShowModal] = useState<boolean>(false);\n\n const StateHistoryModal = useMemo(\n () => (\n <Modal\n isOpen={showModal}\n onDismiss={() => setShowModal(false)}\n closeOnBackdropClick={true}\n closeOnEscape={true}\n title=\"State history\"\n >\n <StateHistory alertId={alertId} />\n </Modal>\n ),\n [alertId, showModal]\n );\n\n return {\n StateHistoryModal,\n showStateHistoryModal: () => setShowModal(true),\n hideStateHistoryModal: () => setShowModal(false),\n };\n}\n\nexport { useStateHistoryModal };\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { AnnotationDetailsField } from '../AnnotationDetailsField';\n\ntype Props = {\n annotations: Array<[string, string]>;\n};\n\nexport function RuleDetailsAnnotations(props: Props): JSX.Element | null {\n const { annotations } = props;\n const styles = useStyles2(getStyles);\n\n if (annotations.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.annotations}>\n {annotations.map(([key, value]) => (\n <AnnotationDetailsField key={key} annotationKey={key} value={value} />\n ))}\n </div>\n );\n}\n\nconst getStyles = () => ({\n annotations: css`\n margin-top: 46px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\nimport { ExpressionDatasourceUID } from 'app/features/expressions/ExpressionDatasource';\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { isCloudRulesSource } from '../../utils/datasource';\nimport { isGrafanaRulerRule } from '../../utils/rules';\nimport { DetailsField } from '../DetailsField';\n\ntype Props = {\n rule: CombinedRule;\n rulesSource: RulesSource;\n};\n\nexport function RuleDetailsDataSources(props: Props): JSX.Element | null {\n const { rulesSource, rule } = props;\n const styles = useStyles2(getStyles);\n\n const dataSources: Array<{ name: string; icon?: string }> = useMemo(() => {\n if (isCloudRulesSource(rulesSource)) {\n return [{ name: rulesSource.name, icon: rulesSource.meta.info.logos.small }];\n }\n\n if (isGrafanaRulerRule(rule.rulerRule)) {\n const { data } = rule.rulerRule.grafana_alert;\n const unique = data.reduce((dataSources, query) => {\n const ds = getDataSourceSrv().getInstanceSettings(query.datasourceUid);\n\n if (!ds || ds.uid === ExpressionDatasourceUID) {\n return dataSources;\n }\n\n dataSources[ds.name] = { name: ds.name, icon: ds.meta.info.logos.small };\n return dataSources;\n }, {} as Record<string, { name: string; icon?: string }>);\n\n return Object.values(unique);\n }\n\n return [];\n }, [rule, rulesSource]);\n\n if (dataSources.length === 0) {\n return null;\n }\n\n return (\n <DetailsField label=\"Data source\">\n {dataSources.map(({ name, icon }, index) => (\n <div key={name}>\n {icon && (\n <>\n <img alt={`${name} datasource logo`} className={styles.dataSourceIcon} src={icon} />{' '}\n </>\n )}\n {name}\n </div>\n ))}\n </DetailsField>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n const size = theme.spacing(2);\n\n return {\n dataSourceIcon: css`\n width: ${size};\n height: ${size};\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { LanguageMap, languages as prismLanguages } from 'prismjs';\nimport React, { FC, useMemo } from 'react';\nimport { Editor } from 'slate-react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { makeValue, SlatePrism, useStyles2 } from '@grafana/ui';\nimport LogqlSyntax from 'app/plugins/datasource/loki/syntax';\nimport PromqlSyntax from 'app/plugins/datasource/prometheus/promql';\nimport { RulesSource } from 'app/types/unified-alerting';\n\nimport { DataSourceType, isCloudRulesSource } from '../utils/datasource';\n\nimport { Well } from './Well';\n\ninterface Props {\n expression: string;\n rulesSource: RulesSource;\n}\n\nexport const HighlightedQuery: FC<{ language: 'promql' | 'logql'; expr: string }> = ({ language, expr }) => {\n const plugins = useMemo(\n () => [\n SlatePrism(\n {\n onlyIn: (node: any) => node.type === 'code_block',\n getSyntax: () => language,\n },\n { ...(prismLanguages as LanguageMap), [language]: language === 'logql' ? LogqlSyntax : PromqlSyntax }\n ),\n ],\n [language]\n );\n\n const slateValue = useMemo(() => makeValue(expr), [expr]);\n\n //We don't want to set readOnly={true} to the Editor to prevent unwanted charaters in the copied text. See https://github.com/grafana/grafana/pull/57839\n return <Editor data-testid={'expression-editor'} plugins={plugins} value={slateValue} />;\n};\n\nexport const Expression: FC<Props> = ({ expression: query, rulesSource }) => {\n const styles = useStyles2(getStyles);\n\n return (\n <Well className={cx(styles.well, 'slate-query-field')}>\n {isCloudRulesSource(rulesSource) ? (\n <HighlightedQuery expr={query} language={rulesSource.type === DataSourceType.Loki ? 'logql' : 'promql'} />\n ) : (\n query\n )}\n </Well>\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n well: css`\n font-family: ${theme.typography.fontFamilyMonospace};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { isCloudRulesSource } from '../../utils/datasource';\nimport { DetailsField } from '../DetailsField';\nimport { Expression } from '../Expression';\n\ntype Props = {\n rule: CombinedRule;\n rulesSource: RulesSource;\n annotations: Array<[string, string]>;\n};\n\nexport function RuleDetailsExpression(props: Props): JSX.Element | null {\n const { annotations, rulesSource, rule } = props;\n const styles = getStyles();\n\n if (!isCloudRulesSource(rulesSource)) {\n return null;\n }\n\n return (\n <DetailsField label=\"Expression\" horizontal={true} className={cx({ [styles.exprRow]: !!annotations.length })}>\n <Expression expression={rule.query} rulesSource={rulesSource} />\n </DetailsField>\n );\n}\n\nconst getStyles = () => ({\n exprRow: css`\n margin-bottom: 46px;\n `,\n});\n","import { css } from '@emotion/css';\nimport { capitalize } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data/src';\nimport { Label, RadioButtonGroup, Tag, useStyles2 } from '@grafana/ui';\nimport { GrafanaAlertState, PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nexport type InstanceStateFilter = GrafanaAlertState | PromAlertingRuleState.Pending | PromAlertingRuleState.Firing;\n\ninterface Props {\n className?: string;\n filterType: 'grafana' | 'prometheus';\n stateFilter?: InstanceStateFilter;\n onStateFilterChange: (value?: InstanceStateFilter) => void;\n itemPerStateStats?: Record<string, number>;\n}\n\nexport const AlertInstanceStateFilter = ({\n className,\n onStateFilterChange,\n stateFilter,\n filterType,\n itemPerStateStats,\n}: Props) => {\n const styles = useStyles2(getStyles);\n\n const getOptionComponent = (state: InstanceStateFilter) => {\n return function InstanceStateCounter() {\n return itemPerStateStats && itemPerStateStats[state] ? (\n <Tag name={itemPerStateStats[state].toFixed(0)} colorIndex={9} className={styles.tag} />\n ) : null;\n };\n };\n\n const grafanaOptions = Object.values(GrafanaAlertState).map((state) => ({\n label: state,\n value: state,\n component: getOptionComponent(state),\n }));\n\n const promOptionValues = [PromAlertingRuleState.Firing, PromAlertingRuleState.Pending] as const;\n const promOptions = promOptionValues.map((state) => ({\n label: capitalize(state),\n value: state,\n component: getOptionComponent(state),\n }));\n\n const stateOptions = filterType === 'grafana' ? grafanaOptions : promOptions;\n\n return (\n <div className={className} data-testid=\"alert-instance-state-filter\">\n <Label>State</Label>\n <RadioButtonGroup\n options={stateOptions}\n value={stateFilter}\n onChange={onStateFilterChange}\n onClick={(v) => {\n if (v === stateFilter) {\n onStateFilterChange(undefined);\n }\n }}\n />\n </div>\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n tag: css`\n font-size: 11px;\n font-weight: normal;\n padding: ${theme.spacing(0.25, 0.5)};\n vertical-align: middle;\n margin-left: ${theme.spacing(0.5)};\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { countBy } from 'lodash';\nimport React, { useMemo, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { LinkButton, useStyles2 } from '@grafana/ui';\nimport { MatcherFilter } from 'app/features/alerting/unified/components/alert-groups/MatcherFilter';\nimport {\n AlertInstanceStateFilter,\n InstanceStateFilter,\n} from 'app/features/alerting/unified/components/rules/AlertInstanceStateFilter';\nimport { labelsMatchMatchers, parseMatchers } from 'app/features/alerting/unified/utils/alertmanager';\nimport { createViewLink, sortAlerts } from 'app/features/alerting/unified/utils/misc';\nimport { SortOrder } from 'app/plugins/panel/alertlist/types';\nimport { Alert, CombinedRule, PaginationProps } from 'app/types/unified-alerting';\nimport { mapStateWithReasonToBaseState } from 'app/types/unified-alerting-dto';\n\nimport { GRAFANA_RULES_SOURCE_NAME, isGrafanaRulesSource } from '../../utils/datasource';\nimport { isAlertingRule } from '../../utils/rules';\nimport { DetailsField } from '../DetailsField';\n\nimport { AlertInstancesTable } from './AlertInstancesTable';\n\ninterface Props {\n rule: CombinedRule;\n pagination?: PaginationProps;\n itemsDisplayLimit?: number;\n}\n\ninterface ShowMoreStats {\n totalItemsCount: number;\n visibleItemsCount: number;\n}\n\nfunction ShowMoreInstances(props: { ruleViewPageLink: string; stats: ShowMoreStats }) {\n const styles = useStyles2(getStyles);\n const { ruleViewPageLink, stats } = props;\n\n return (\n <div className={styles.footerRow}>\n <div>\n Showing {stats.visibleItemsCount} out of {stats.totalItemsCount} instances\n </div>\n {ruleViewPageLink && (\n <LinkButton href={ruleViewPageLink} size=\"sm\" variant=\"secondary\">\n Show all {stats.totalItemsCount} alert instances\n </LinkButton>\n )}\n </div>\n );\n}\n\nexport function RuleDetailsMatchingInstances(props: Props): JSX.Element | null {\n const {\n rule: { promRule, namespace },\n itemsDisplayLimit = Number.POSITIVE_INFINITY,\n pagination,\n } = props;\n\n const [queryString, setQueryString] = useState<string>();\n const [alertState, setAlertState] = useState<InstanceStateFilter>();\n\n // This key is used to force a rerender on the inputs when the filters are cleared\n const [filterKey] = useState<number>(Math.floor(Math.random() * 100));\n const queryStringKey = `queryString-${filterKey}`;\n\n const styles = useStyles2(getStyles);\n\n const stateFilterType = isGrafanaRulesSource(namespace.rulesSource) ? GRAFANA_RULES_SOURCE_NAME : 'prometheus';\n\n const alerts = useMemo(\n (): Alert[] =>\n isAlertingRule(promRule) && promRule.alerts?.length\n ? filterAlerts(queryString, alertState, sortAlerts(SortOrder.Importance, promRule.alerts))\n : [],\n [promRule, alertState, queryString]\n );\n\n if (!isAlertingRule(promRule)) {\n return null;\n }\n\n const visibleInstances = alerts.slice(0, itemsDisplayLimit);\n\n const countAllByState = countBy(promRule.alerts, (alert) => mapStateWithReasonToBaseState(alert.state));\n const hiddenItemsCount = alerts.length - visibleInstances.length;\n\n const stats: ShowMoreStats = {\n totalItemsCount: alerts.length,\n visibleItemsCount: visibleInstances.length,\n };\n\n const ruleViewPageLink = createViewLink(namespace.rulesSource, props.rule, location.pathname + location.search);\n\n const footerRow = hiddenItemsCount ? (\n <ShowMoreInstances stats={stats} ruleViewPageLink={ruleViewPageLink} />\n ) : undefined;\n\n return (\n <DetailsField label=\"Matching instances\" horizontal={true}>\n <div className={cx(styles.flexRow, styles.spaceBetween)}>\n <div className={styles.flexRow}>\n <MatcherFilter\n className={styles.rowChild}\n key={queryStringKey}\n defaultQueryString={queryString}\n onFilterChange={(value) => setQueryString(value)}\n />\n <AlertInstanceStateFilter\n className={styles.rowChild}\n filterType={stateFilterType}\n stateFilter={alertState}\n onStateFilterChange={setAlertState}\n itemPerStateStats={countAllByState}\n />\n </div>\n </div>\n\n <AlertInstancesTable instances={visibleInstances} pagination={pagination} footerRow={footerRow} />\n </DetailsField>\n );\n}\n\nfunction filterAlerts(\n alertInstanceLabel: string | undefined,\n alertInstanceState: InstanceStateFilter | undefined,\n alerts: Alert[]\n): Alert[] {\n let filteredAlerts = [...alerts];\n if (alertInstanceLabel) {\n const matchers = parseMatchers(alertInstanceLabel || '');\n filteredAlerts = filteredAlerts.filter(({ labels }) => labelsMatchMatchers(labels, matchers));\n }\n if (alertInstanceState) {\n filteredAlerts = filteredAlerts.filter((alert) => {\n return mapStateWithReasonToBaseState(alert.state) === alertInstanceState;\n });\n }\n\n return filteredAlerts;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n flexRow: css`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n width: 100%;\n flex-wrap: wrap;\n margin-bottom: ${theme.spacing(1)};\n `,\n spaceBetween: css`\n justify-content: space-between;\n `,\n rowChild: css`\n margin-right: ${theme.spacing(1)};\n `,\n footerRow: css`\n display: flex;\n flex-direction: column;\n gap: ${theme.spacing(1)};\n justify-content: space-between;\n align-items: center;\n width: 100%;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, Tooltip, useStyles2 } from '@grafana/ui';\nimport { Rule } from 'app/types/unified-alerting';\n\ninterface Prom {\n rule: Rule;\n}\n\nexport const RuleHealth: FC<Prom> = ({ rule }) => {\n const style = useStyles2(getStyle);\n\n if (rule.health === 'err' || rule.health === 'error') {\n return (\n <Tooltip theme=\"error\" content={rule.lastError || 'No error message provided.'}>\n <div className={style.warn}>\n <Icon name=\"exclamation-triangle\" />\n <span>error</span>\n </div>\n </Tooltip>\n );\n }\n\n return <>{rule.health}</>;\n};\n\nconst getStyle = (theme: GrafanaTheme2) => ({\n warn: css`\n display: inline-flex;\n flex-direction: row;\n align-items: center;\n gap: ${theme.spacing(1)};\n\n color: ${theme.colors.warning.text};\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\n\nimport { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { HorizontalGroup, Spinner, useStyles2 } from '@grafana/ui';\nimport { CombinedRule } from 'app/types/unified-alerting';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { isAlertingRule, isRecordingRule, getFirstActiveAt } from '../../utils/rules';\n\nimport { AlertStateTag } from './AlertStateTag';\n\ninterface Props {\n rule: CombinedRule;\n isDeleting: boolean;\n isCreating: boolean;\n}\n\nexport const RuleState: FC<Props> = ({ rule, isDeleting, isCreating }) => {\n const style = useStyles2(getStyle);\n const { promRule } = rule;\n\n // return how long the rule has been in its firing state, if any\n const forTime = useMemo(() => {\n if (\n promRule &&\n isAlertingRule(promRule) &&\n promRule.alerts?.length &&\n promRule.state !== PromAlertingRuleState.Inactive\n ) {\n // find earliest alert\n const firstActiveAt = getFirstActiveAt(promRule);\n\n // calculate time elapsed from earliest alert\n if (firstActiveAt) {\n return (\n <span title={String(firstActiveAt)} className={style.for}>\n for{' '}\n {intervalToAbbreviatedDurationString(\n {\n start: firstActiveAt,\n end: new Date(),\n },\n false\n )}\n </span>\n );\n }\n }\n return null;\n }, [promRule, style]);\n\n if (isDeleting) {\n return (\n <HorizontalGroup align=\"flex-start\">\n <Spinner />\n deleting\n </HorizontalGroup>\n );\n } else if (isCreating) {\n return (\n <HorizontalGroup align=\"flex-start\">\n {' '}\n <Spinner />\n creating\n </HorizontalGroup>\n );\n } else if (promRule && isAlertingRule(promRule)) {\n return (\n <HorizontalGroup align=\"flex-start\">\n <AlertStateTag state={promRule.state} />\n {forTime}\n </HorizontalGroup>\n );\n } else if (promRule && isRecordingRule(promRule)) {\n return <>Recording rule</>;\n }\n return <>n/a</>;\n};\n\nconst getStyle = (theme: GrafanaTheme2) => ({\n for: css`\n font-size: ${theme.typography.bodySmall.fontSize};\n color: ${theme.colors.text.secondary};\n white-space: nowrap;\n padding-top: 2px;\n `,\n});\n","import { isEqual } from 'lodash';\nimport { useMemo, useRef } from 'react';\n\nimport {\n CombinedRule,\n CombinedRuleGroup,\n CombinedRuleNamespace,\n Rule,\n RuleGroup,\n RuleNamespace,\n RulesSource,\n} from 'app/types/unified-alerting';\nimport { RulerRuleDTO, RulerRuleGroupDTO, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto';\n\nimport {\n getAllRulesSources,\n getRulesSourceByName,\n isCloudRulesSource,\n isGrafanaRulesSource,\n} from '../utils/datasource';\nimport { isAlertingRule, isAlertingRulerRule, isRecordingRulerRule } from '../utils/rules';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\ninterface CacheValue {\n promRules?: RuleNamespace[];\n rulerRules?: RulerRulesConfigDTO | null;\n result: CombinedRuleNamespace[];\n}\n\n// this little monster combines prometheus rules and ruler rules to produce a unified data structure\n// can limit to a single rules source\nexport function useCombinedRuleNamespaces(rulesSourceName?: string): CombinedRuleNamespace[] {\n const promRulesResponses = useUnifiedAlertingSelector((state) => state.promRules);\n const rulerRulesResponses = useUnifiedAlertingSelector((state) => state.rulerRules);\n\n // cache results per rules source, so we only recalculate those for which results have actually changed\n const cache = useRef<Record<string, CacheValue>>({});\n\n const rulesSources = useMemo((): RulesSource[] => {\n if (rulesSourceName) {\n const rulesSource = getRulesSourceByName(rulesSourceName);\n if (!rulesSource) {\n throw new Error(`Unknown rules source: ${rulesSourceName}`);\n }\n return [rulesSource];\n }\n return getAllRulesSources();\n }, [rulesSourceName]);\n\n return useMemo(\n () =>\n rulesSources\n .map((rulesSource): CombinedRuleNamespace[] => {\n const rulesSourceName = isCloudRulesSource(rulesSource) ? rulesSource.name : rulesSource;\n const promRules = promRulesResponses[rulesSourceName]?.result;\n const rulerRules = rulerRulesResponses[rulesSourceName]?.result;\n\n const cached = cache.current[rulesSourceName];\n if (cached && cached.promRules === promRules && cached.rulerRules === rulerRules) {\n return cached.result;\n }\n const namespaces: Record<string, CombinedRuleNamespace> = {};\n\n // first get all the ruler rules in\n Object.entries(rulerRules || {}).forEach(([namespaceName, groups]) => {\n const namespace: CombinedRuleNamespace = {\n rulesSource,\n name: namespaceName,\n groups: [],\n };\n namespaces[namespaceName] = namespace;\n addRulerGroupsToCombinedNamespace(namespace, groups);\n });\n\n // then correlate with prometheus rules\n promRules?.forEach(({ name: namespaceName, groups }) => {\n const ns = (namespaces[namespaceName] = namespaces[namespaceName] || {\n rulesSource,\n name: namespaceName,\n groups: [],\n });\n\n addPromGroupsToCombinedNamespace(ns, groups);\n });\n\n const result = Object.values(namespaces);\n\n cache.current[rulesSourceName] = { promRules, rulerRules, result };\n return result;\n })\n .flat(),\n [promRulesResponses, rulerRulesResponses, rulesSources]\n );\n}\n\n// merge all groups in case of grafana managed, essentially treating namespaces (folders) as groups\nexport function flattenGrafanaManagedRules(namespaces: CombinedRuleNamespace[]) {\n return namespaces.map((namespace) => {\n const newNamespace: CombinedRuleNamespace = {\n ...namespace,\n groups: [],\n };\n\n // add default group with ungrouped rules\n newNamespace.groups.push({\n name: 'default',\n rules: sortRulesByName(namespace.groups.flatMap((group) => group.rules)),\n });\n\n return newNamespace;\n });\n}\n\nexport function sortRulesByName(rules: CombinedRule[]) {\n return rules.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction addRulerGroupsToCombinedNamespace(namespace: CombinedRuleNamespace, groups: RulerRuleGroupDTO[] = []): void {\n namespace.groups = groups.map((group) => {\n const combinedGroup: CombinedRuleGroup = {\n name: group.name,\n interval: group.interval,\n source_tenants: group.source_tenants,\n rules: [],\n };\n combinedGroup.rules = group.rules.map((rule) => rulerRuleToCombinedRule(rule, namespace, combinedGroup));\n return combinedGroup;\n });\n}\n\nfunction addPromGroupsToCombinedNamespace(namespace: CombinedRuleNamespace, groups: RuleGroup[]): void {\n const existingGroupsByName = new Map<string, CombinedRuleGroup>();\n namespace.groups.forEach((group) => existingGroupsByName.set(group.name, group));\n\n groups.forEach((group) => {\n let combinedGroup = existingGroupsByName.get(group.name);\n if (!combinedGroup) {\n combinedGroup = {\n name: group.name,\n rules: [],\n };\n namespace.groups.push(combinedGroup);\n existingGroupsByName.set(group.name, combinedGroup);\n }\n\n const combinedRulesByName = new Map<string, CombinedRule[]>();\n combinedGroup!.rules.forEach((r) => {\n // Prometheus rules do not have to be unique by name\n const existingRule = combinedRulesByName.get(r.name);\n existingRule ? existingRule.push(r) : combinedRulesByName.set(r.name, [r]);\n });\n\n (group.rules ?? []).forEach((rule) => {\n const existingRule = getExistingRuleInGroup(rule, combinedRulesByName, namespace.rulesSource);\n if (existingRule) {\n existingRule.promRule = rule;\n } else {\n combinedGroup!.rules.push(promRuleToCombinedRule(rule, namespace, combinedGroup!));\n }\n });\n });\n}\n\nfunction promRuleToCombinedRule(rule: Rule, namespace: CombinedRuleNamespace, group: CombinedRuleGroup): CombinedRule {\n return {\n name: rule.name,\n query: rule.query,\n labels: rule.labels || {},\n annotations: isAlertingRule(rule) ? rule.annotations || {} : {},\n promRule: rule,\n namespace: namespace,\n group,\n };\n}\n\nfunction rulerRuleToCombinedRule(\n rule: RulerRuleDTO,\n namespace: CombinedRuleNamespace,\n group: CombinedRuleGroup\n): CombinedRule {\n return isAlertingRulerRule(rule)\n ? {\n name: rule.alert,\n query: rule.expr,\n labels: rule.labels || {},\n annotations: rule.annotations || {},\n rulerRule: rule,\n namespace,\n group,\n }\n : isRecordingRulerRule(rule)\n ? {\n name: rule.record,\n query: rule.expr,\n labels: rule.labels || {},\n annotations: {},\n rulerRule: rule,\n namespace,\n group,\n }\n : {\n name: rule.grafana_alert.title,\n query: '',\n labels: rule.labels || {},\n annotations: rule.annotations || {},\n rulerRule: rule,\n namespace,\n group,\n };\n}\n\n// find existing rule in group that matches the given prom rule\nfunction getExistingRuleInGroup(\n rule: Rule,\n existingCombinedRulesMap: Map<string, CombinedRule[]>,\n rulesSource: RulesSource\n): CombinedRule | undefined {\n // Using Map of name-based rules is important performance optimization for the code below\n // Otherwise we would perform find method multiple times on (possibly) thousands of rules\n\n const nameMatchingRules = existingCombinedRulesMap.get(rule.name);\n if (!nameMatchingRules) {\n return undefined;\n }\n\n if (isGrafanaRulesSource(rulesSource)) {\n // assume grafana groups have only the one rule. check name anyway because paranoid\n return nameMatchingRules[0];\n }\n\n // try finding a rule that matches name, labels, annotations and query\n const strictlyMatchingRule = nameMatchingRules.find(\n (combinedRule) => !combinedRule.promRule && isCombinedRuleEqualToPromRule(combinedRule, rule, true)\n );\n if (strictlyMatchingRule) {\n return strictlyMatchingRule;\n }\n\n // if that fails, try finding a rule that only matches name, labels and annotations.\n // loki & prom can sometimes modify the query so it doesnt match, eg `2 > 1` becomes `1`\n const looselyMatchingRule = nameMatchingRules.find(\n (combinedRule) => !combinedRule.promRule && isCombinedRuleEqualToPromRule(combinedRule, rule, false)\n );\n if (looselyMatchingRule) {\n return looselyMatchingRule;\n }\n\n return undefined;\n}\n\nfunction isCombinedRuleEqualToPromRule(combinedRule: CombinedRule, rule: Rule, checkQuery = true): boolean {\n if (combinedRule.name === rule.name) {\n return isEqual(\n [checkQuery ? hashQuery(combinedRule.query) : '', combinedRule.labels, combinedRule.annotations],\n [checkQuery ? hashQuery(rule.query) : '', rule.labels || {}, isAlertingRule(rule) ? rule.annotations || {} : {}]\n );\n }\n return false;\n}\n\n// there can be slight differences in how prom & ruler render a query, this will hash them accounting for the differences\nfunction hashQuery(query: string) {\n // one of them might be wrapped in parens\n if (query.length > 1 && query[0] === '(' && query[query.length - 1] === ')') {\n query = query.slice(1, -1);\n }\n // whitespace could be added or removed\n query = query.replace(/\\s|\\n/g, '');\n // labels matchers can be reordered, so sort the enitre string, esentially comparing just the character counts\n return query.split('').sort().join('');\n}\n","import { useEffect } from 'react';\n\nimport { FolderDTO, useDispatch } from 'app/types';\n\nimport { fetchFolderIfNotFetchedAction } from '../state/actions';\nimport { initialAsyncRequestState } from '../utils/redux';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\ninterface ReturnBag {\n folder?: FolderDTO;\n loading: boolean;\n}\n\nexport function useFolder(uid?: string): ReturnBag {\n const dispatch = useDispatch();\n const folderRequests = useUnifiedAlertingSelector((state) => state.folders);\n useEffect(() => {\n if (uid) {\n dispatch(fetchFolderIfNotFetchedAction(uid));\n }\n }, [dispatch, uid]);\n\n if (uid) {\n const request = folderRequests[uid] || initialAsyncRequestState;\n return {\n folder: request.result,\n loading: request.loading,\n };\n }\n return {\n loading: false,\n };\n}\n","import { contextSrv } from 'app/core/services/context_srv';\nimport { RulerRuleDTO } from 'app/types/unified-alerting-dto';\n\nimport { getRulesPermissions } from '../utils/access-control';\nimport { isGrafanaRulerRule } from '../utils/rules';\n\nimport { useFolder } from './useFolder';\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\ninterface ResultBag {\n isEditable?: boolean;\n isRemovable?: boolean;\n loading: boolean;\n}\n\nexport function useIsRuleEditable(rulesSourceName: string, rule?: RulerRuleDTO): ResultBag {\n const dataSources = useUnifiedAlertingSelector((state) => state.dataSources);\n const folderUID = rule && isGrafanaRulerRule(rule) ? rule.grafana_alert.namespace_uid : undefined;\n\n const rulePermission = getRulesPermissions(rulesSourceName);\n const { folder, loading } = useFolder(folderUID);\n\n if (!rule) {\n return { isEditable: false, isRemovable: false, loading: false };\n }\n\n // Grafana rules can be edited if user can edit the folder they're in\n // When RBAC is disabled access to a folder is the only requirement for managing rules\n // When RBAC is enabled the appropriate alerting permissions need to be met\n if (isGrafanaRulerRule(rule)) {\n if (!folderUID) {\n throw new Error(\n `Rule ${rule.grafana_alert.title} does not have a folder uid, cannot determine if it is editable.`\n );\n }\n\n if (!folder) {\n // Loading or invalid folder UID\n return {\n isEditable: false,\n isRemovable: false,\n loading,\n };\n }\n const rbacDisabledFallback = folder.canSave;\n\n const canEditGrafanaRules = contextSrv.hasAccessInMetadata(rulePermission.update, folder, rbacDisabledFallback);\n const canRemoveGrafanaRules = contextSrv.hasAccessInMetadata(rulePermission.delete, folder, rbacDisabledFallback);\n\n return {\n isEditable: canEditGrafanaRules,\n isRemovable: canRemoveGrafanaRules,\n loading,\n };\n }\n\n // prom rules are only editable by users with Editor role and only if rules source supports editing\n const isRulerAvailable = Boolean(dataSources[rulesSourceName]?.result?.rulerConfig);\n const canEditCloudRules = contextSrv.hasAccess(rulePermission.update, contextSrv.isEditor);\n const canRemoveCloudRules = contextSrv.hasAccess(rulePermission.delete, contextSrv.isEditor);\n\n return {\n isEditable: canEditCloudRules && isRulerAvailable,\n isRemovable: canRemoveCloudRules && isRulerAvailable,\n loading: dataSources[rulesSourceName]?.loading,\n };\n}\n"],"names":["ProvisionedResource","ProvisioningAlert","resource","title","severity","ProvisioningBadge","text","color","MatcherFilter","className","onFilterChange","defaultQueryString","styles","useStyles2","getStyles","onSearchInputChanged","useMemo","debounce","e","logInfo","LogMessages","target","value","useEffect","cancel","searchIcon","name","Stack","gap","content","icon","size","I","placeholder","defaultValue","onChange","prefix","inputWidth","theme","css","spacing","StateHistory","alertId","textFilter","setTextFilter","useState","handleTextFilter","useCallback","event","currentTarget","loading","error","result","dispatch","useDispatch","history","useUnifiedAlertingSelector","state","managedAlertStateHistory","fetchGrafanaAnnotationsAction","useManagedAlertStateHistory","LoadingPlaceholder","Alert","message","columns","id","label","renderCell","renderStateCell","renderValueCell","renderTimestampCell","tables","Object","entries","items","map","item","LABELS_REGEX","stringifiedLabels","match","at","String","newState","replace","data","timestamp","updated","groupBy","groupStateByLabels","sort","filter","groupKey","startsWith","endsWith","includes","RegExp","slice","test","err","matchKey","tableItems","historyItem","tableGroupKey","DynamicTable","cols","Field","Label","Tooltip","Icon","Input","matches","evalMatches","LabelsWrapper","AlertLabel","labelKey","metric","AlertStateTag","TimestampStyle","dateTimeFormat","children","wrapper","RuleDetailsActionButtons","rule","rulesSource","isViewMode","style","namespace","group","rulerRule","isGrafanaRulerRule","grafana_alert","StateHistoryModal","showStateHistoryModal","showModal","setShowModal","Modal","isOpen","onDismiss","closeOnBackdropClick","closeOnEscape","hideStateHistoryModal","useStateHistoryModal","location","useLocation","notifyApp","useAppNotification","ruleToDelete","setRuleToDelete","alertmanagerSourceName","isGrafanaRulesSource","getAlertmanagerByUid","jsonData","alertmanagerUid","hasExplorePermission","contextSrv","AccessControlAction","buttons","rightButtons","deleteRule","identifier","ruleId","getRulesSourceName","deleteRuleAction","navigateTo","undefined","buildShareUrl","isCloudRulesSource","appUrl","appSubUrl","config","encodeURIComponent","window","href","split","isFederated","isFederatedRuleGroup","rulesSourceName","isProvisioned","Boolean","provenance","isEditable","isRemovable","useIsRuleEditable","returnTo","pathname","search","push","button","variant","createExploreLink","query","annotations","Annotation","textUtil","dashboardUID","panelId","makeRuleBasedSilenceLink","Fragment","Button","onClick","sourceName","editURL","urlUtil","ClipboardButton","onClipboardError","copiedText","getText","type","length","width","ConfirmModal","body","confirmText","onConfirm","colors","border","medium","typography","sm","RuleDetailsAnnotations","props","key","annotationKey","RuleDetailsDataSources","dataSources","meta","info","logos","small","unique","reduce","ds","getDataSourceSrv","getInstanceSettings","datasourceUid","uid","ExpressionDatasourceUID","values","index","alt","dataSourceIcon","src","HighlightedQuery","language","expr","plugins","SlatePrism","onlyIn","node","getSyntax","prismLanguages","LogqlSyntax","PromqlSyntax","slateValue","makeValue","Expression","expression","Well","cx","well","DataSourceType","fontFamilyMonospace","RuleDetailsExpression","DetailsField","horizontal","exprRow","AlertInstanceStateFilter","onStateFilterChange","stateFilter","filterType","itemPerStateStats","getOptionComponent","Tag","toFixed","colorIndex","tag","grafanaOptions","GrafanaAlertState","component","promOptions","PromAlertingRuleState","capitalize","stateOptions","RadioButtonGroup","options","v","ShowMoreInstances","ruleViewPageLink","stats","footerRow","visibleItemsCount","totalItemsCount","RuleDetailsMatchingInstances","promRule","itemsDisplayLimit","Number","POSITIVE_INFINITY","pagination","queryString","setQueryString","alertState","setAlertState","filterKey","Math","floor","random","queryStringKey","stateFilterType","GRAFANA_RULES_SOURCE_NAME","alerts","isAlertingRule","alertInstanceLabel","alertInstanceState","filteredAlerts","matchers","parseMatchers","labels","labelsMatchMatchers","alert","mapStateWithReasonToBaseState","filterAlerts","sortAlerts","SortOrder","visibleInstances","countAllByState","countBy","hiddenItemsCount","createViewLink","flexRow","spaceBetween","rowChild","AlertInstancesTable","instances","RuleHealth","getStyle","health","lastError","warn","warning","RuleState","isDeleting","isCreating","forTime","firstActiveAt","getFirstActiveAt","for","intervalToAbbreviatedDurationString","start","end","Date","align","isRecordingRule","bodySmall","fontSize","secondary","useCombinedRuleNamespaces","promRulesResponses","promRules","rulerRulesResponses","rulerRules","cache","useRef","rulesSources","getRulesSourceByName","Error","getAllRulesSources","cached","current","namespaces","forEach","namespaceName","groups","combinedGroup","interval","source_tenants","rules","rulerRuleToCombinedRule","addRulerGroupsToCombinedNamespace","existingGroupsByName","Map","set","get","combinedRulesByName","r","existingRule","existingCombinedRulesMap","nameMatchingRules","strictlyMatchingRule","find","combinedRule","isCombinedRuleEqualToPromRule","looselyMatchingRule","getExistingRuleInGroup","promRuleToCombinedRule","addPromGroupsToCombinedNamespace","flat","flattenGrafanaManagedRules","newNamespace","flatMap","a","b","localeCompare","isAlertingRulerRule","isRecordingRulerRule","record","checkQuery","isEqual","hashQuery","join","useFolder","folderRequests","folders","fetchFolderIfNotFetchedAction","request","initialAsyncRequestState","folder","folderUID","namespace_uid","rulePermission","getRulesPermissions","rbacDisabledFallback","canSave","update","delete","isRulerAvailable","rulerConfig"],"sourceRoot":""}