{"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":""}