1{"version":3,"file":"AlertAmRoutes.0e38943fa459e872fe93.js","mappings":"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","sources":["webpack://grafana/./public/app/core/hooks/useCleanup.ts","webpack://grafana/./public/app/core/hooks/useQueryParams.ts","webpack://grafana/./public/app/features/alerting/unified/utils/amroutes.ts","webpack://grafana/./public/app/features/alerting/unified/components/amroutes/formStyles.ts","webpack://grafana/./public/app/features/alerting/unified/components/amroutes/AmRootRouteForm.tsx","webpack://grafana/./public/app/features/alerting/unified/components/amroutes/gridStyles.ts","webpack://grafana/./public/app/features/alerting/unified/components/amroutes/AmRootRouteRead.tsx","webpack://grafana/./public/app/features/alerting/unified/components/amroutes/AmRootRoute.tsx","webpack://grafana/./public/app/features/alerting/unified/components/EmptyArea.tsx","webpack://grafana/./public/app/features/alerting/unified/components/amroutes/AmRoutesExpandedForm.tsx","webpack://grafana/./public/app/features/alerting/unified/components/amroutes/AmRoutesExpandedRead.tsx","webpack://grafana/./public/app/features/alerting/unified/components/amroutes/AmRoutesTable.tsx","webpack://grafana/./public/app/features/alerting/unified/utils/dynamicTable.ts","webpack://grafana/./public/app/features/alerting/unified/components/EmptyAreaWithCTA.tsx","webpack://grafana/./public/app/features/alerting/unified/components/amroutes/AmSpecificRouting.tsx","webpack://grafana/./public/app/features/alerting/unified/AmRoutes.tsx","webpack://grafana/./public/app/features/alerting/unified/components/AlertingPageWrapper.tsx","webpack://grafana/./public/app/features/alerting/unified/components/DynamicTable.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/Matchers.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useAlertManagerSourceName.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { cleanUpAction, StateSelector } from '../actions/cleanUp';\n\nexport function useCleanup<T>(stateSelector: StateSelector<T>) {\n  const dispatch = useDispatch();\n  //bit of a hack to unburden user from having to wrap stateSelcetor in a useCallback. Otherwise cleanup would happen on every render\n  const selectorRef = useRef(stateSelector);\n  selectorRef.current = stateSelector;\n  useEffect(() => {\n    return () => {\n      dispatch(cleanUpAction({ stateSelector: selectorRef.current }));\n    };\n  }, [dispatch]);\n}\n","import { UrlQueryMap } from '@grafana/data';\nimport { locationSearchToObject, locationService } from '@grafana/runtime';\nimport { useCallback, useMemo } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport function useQueryParams(): [UrlQueryMap, (values: UrlQueryMap, replace?: boolean) => void] {\n  const { search } = useLocation();\n  const queryParams = useMemo(() => locationSearchToObject(search || ''), [search]);\n  const update = useCallback(\n    (values: UrlQueryMap, replace?: boolean) => setImmediate(() => locationService.partial(values, replace)),\n    []\n  );\n  return [queryParams, update];\n}\n","import { SelectableValue } from '@grafana/data';\nimport { Validate } from 'react-hook-form';\nimport { MatcherOperator, Route } from 'app/plugins/datasource/alertmanager/types';\nimport { FormAmRoute } from '../types/amroutes';\nimport { parseInterval, timeOptions } from './time';\nimport { isUndefined, omitBy } from 'lodash';\nimport { MatcherFieldValue } from '../types/silence-form';\nimport { matcherToMatcherField, parseMatcher } from './alertmanager';\nimport { GRAFANA_RULES_SOURCE_NAME } from './datasource';\n\nconst defaultValueAndType: [string, string] = ['', timeOptions[0].value];\n\nconst matchersToArrayFieldMatchers = (\n  matchers: Record<string, string> | undefined,\n  isRegex: boolean\n): MatcherFieldValue[] =>\n  Object.entries(matchers ?? {}).reduce<MatcherFieldValue[]>(\n    (acc, [name, value]) => [\n      ...acc,\n      {\n        name,\n        value,\n        operator: isRegex ? MatcherOperator.regex : MatcherOperator.equal,\n      },\n    ],\n    [] as MatcherFieldValue[]\n  );\n\nconst intervalToValueAndType = (strValue: string | undefined): [string, string] => {\n  if (!strValue) {\n    return defaultValueAndType;\n  }\n\n  const [value, valueType] = strValue ? parseInterval(strValue) : [undefined, undefined];\n\n  const timeOption = timeOptions.find((opt) => opt.value === valueType);\n\n  if (!value || !timeOption) {\n    return defaultValueAndType;\n  }\n\n  return [String(value), timeOption.value];\n};\n\nconst selectableValueToString = (selectableValue: SelectableValue<string>): string => selectableValue.value!;\n\nconst selectableValuesToStrings = (arr: Array<SelectableValue<string>> | undefined): string[] =>\n  (arr ?? []).map(selectableValueToString);\n\nexport const emptyArrayFieldMatcher: MatcherFieldValue = {\n  name: '',\n  value: '',\n  operator: MatcherOperator.equal,\n};\n\nexport const emptyRoute: FormAmRoute = {\n  id: '',\n  groupBy: [],\n  object_matchers: [],\n  routes: [],\n  continue: false,\n  receiver: '',\n  groupWaitValue: '',\n  groupWaitValueType: timeOptions[0].value,\n  groupIntervalValue: '',\n  groupIntervalValueType: timeOptions[0].value,\n  repeatIntervalValue: '',\n  repeatIntervalValueType: timeOptions[0].value,\n};\n\n//returns route, and a record mapping id to existing route route\nexport const amRouteToFormAmRoute = (route: Route | undefined): [FormAmRoute, Record<string, Route>] => {\n  if (!route || Object.keys(route).length === 0) {\n    return [emptyRoute, {}];\n  }\n\n  const [groupWaitValue, groupWaitValueType] = intervalToValueAndType(route.group_wait);\n  const [groupIntervalValue, groupIntervalValueType] = intervalToValueAndType(route.group_interval);\n  const [repeatIntervalValue, repeatIntervalValueType] = intervalToValueAndType(route.repeat_interval);\n\n  const id = String(Math.random());\n  const id2route = {\n    [id]: route,\n  };\n  const formRoutes: FormAmRoute[] = [];\n  route.routes?.forEach((subRoute) => {\n    const [subFormRoute, subId2Route] = amRouteToFormAmRoute(subRoute);\n    formRoutes.push(subFormRoute);\n    Object.assign(id2route, subId2Route);\n  });\n\n  // Frontend migration to use object_matchers instead of matchers\n  const matchers = route.matchers\n    ? route.matchers?.map((matcher) => matcherToMatcherField(parseMatcher(matcher))) ?? []\n    : route.object_matchers?.map(\n        (matcher) => ({ name: matcher[0], operator: matcher[1], value: matcher[2] } as MatcherFieldValue)\n      ) ?? [];\n\n  return [\n    {\n      id,\n      object_matchers: [\n        ...matchers,\n        ...matchersToArrayFieldMatchers(route.match, false),\n        ...matchersToArrayFieldMatchers(route.match_re, true),\n      ],\n      continue: route.continue ?? false,\n      receiver: route.receiver ?? '',\n      groupBy: route.group_by ?? [],\n      groupWaitValue,\n      groupWaitValueType,\n      groupIntervalValue,\n      groupIntervalValueType,\n      repeatIntervalValue,\n      repeatIntervalValueType,\n      routes: formRoutes,\n    },\n    id2route,\n  ];\n};\n\nexport const formAmRouteToAmRoute = (\n  alertManagerSourceName: string | undefined,\n  formAmRoute: FormAmRoute,\n  id2ExistingRoute: Record<string, Route>\n): Route => {\n  const existing: Route | undefined = id2ExistingRoute[formAmRoute.id];\n  const amRoute: Route = {\n    ...(existing ?? {}),\n    continue: formAmRoute.continue,\n    group_by: formAmRoute.groupBy,\n    object_matchers: formAmRoute.object_matchers.length\n      ? formAmRoute.object_matchers.map((matcher) => [matcher.name, matcher.operator, matcher.value])\n      : undefined,\n    match: undefined,\n    match_re: undefined,\n    group_wait: formAmRoute.groupWaitValue\n      ? `${formAmRoute.groupWaitValue}${formAmRoute.groupWaitValueType}`\n      : undefined,\n    group_interval: formAmRoute.groupIntervalValue\n      ? `${formAmRoute.groupIntervalValue}${formAmRoute.groupIntervalValueType}`\n      : undefined,\n    repeat_interval: formAmRoute.repeatIntervalValue\n      ? `${formAmRoute.repeatIntervalValue}${formAmRoute.repeatIntervalValueType}`\n      : undefined,\n    routes: formAmRoute.routes.map((subRoute) =>\n      formAmRouteToAmRoute(alertManagerSourceName, subRoute, id2ExistingRoute)\n    ),\n  };\n\n  if (alertManagerSourceName !== GRAFANA_RULES_SOURCE_NAME) {\n    amRoute.matchers = formAmRoute.object_matchers.map(({ name, operator, value }) => `${name}${operator}${value}`);\n    amRoute.object_matchers = undefined;\n  } else {\n    amRoute.matchers = undefined;\n  }\n\n  if (formAmRoute.receiver) {\n    amRoute.receiver = formAmRoute.receiver;\n  }\n\n  return omitBy(amRoute, isUndefined);\n};\n\nexport const stringToSelectableValue = (str: string): SelectableValue<string> => ({\n  label: str,\n  value: str,\n});\n\nexport const stringsToSelectableValues = (arr: string[] | undefined): Array<SelectableValue<string>> =>\n  (arr ?? []).map(stringToSelectableValue);\n\nexport const mapSelectValueToString = (selectableValue: SelectableValue<string>): string => {\n  if (!selectableValue) {\n    return '';\n  }\n\n  return selectableValueToString(selectableValue) ?? '';\n};\n\nexport const mapMultiSelectValueToStrings = (\n  selectableValues: Array<SelectableValue<string>> | undefined\n): string[] => {\n  if (!selectableValues) {\n    return [];\n  }\n\n  return selectableValuesToStrings(selectableValues);\n};\n\nexport const optionalPositiveInteger: Validate<string> = (value) => {\n  if (!value) {\n    return undefined;\n  }\n\n  return !/^\\d+$/.test(value) ? 'Must be a positive integer.' : undefined;\n};\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport const getFormStyles = (theme: GrafanaTheme2) => {\n  return {\n    container: css`\n      align-items: center;\n      display: flex;\n      flex-flow: row nowrap;\n\n      & > * + * {\n        margin-left: ${theme.spacing(1)};\n      }\n    `,\n    input: css`\n      flex: 1;\n    `,\n    timingContainer: css`\n      max-width: ${theme.spacing(33)};\n    `,\n    smallInput: css`\n      width: ${theme.spacing(6.5)};\n    `,\n    linkText: css`\n      text-decoration: underline;\n    `,\n    collapse: css`\n      border: none;\n      background: none;\n      color: ${theme.colors.text.primary};\n    `,\n  };\n};\n","import React, { FC, useState } from 'react';\nimport { cx } from '@emotion/css';\nimport { Button, Collapse, Field, Form, Input, InputControl, Link, MultiSelect, Select, useStyles2 } from '@grafana/ui';\nimport { AmRouteReceiver, FormAmRoute } from '../../types/amroutes';\nimport {\n  mapMultiSelectValueToStrings,\n  mapSelectValueToString,\n  optionalPositiveInteger,\n  stringToSelectableValue,\n  stringsToSelectableValues,\n} from '../../utils/amroutes';\nimport { makeAMLink } from '../../utils/misc';\nimport { timeOptions } from '../../utils/time';\nimport { getFormStyles } from './formStyles';\n\nexport interface AmRootRouteFormProps {\n  alertManagerSourceName: string;\n  onCancel: () => void;\n  onSave: (data: FormAmRoute) => void;\n  receivers: AmRouteReceiver[];\n  routes: FormAmRoute;\n}\n\nexport const AmRootRouteForm: FC<AmRootRouteFormProps> = ({\n  alertManagerSourceName,\n  onCancel,\n  onSave,\n  receivers,\n  routes,\n}) => {\n  const styles = useStyles2(getFormStyles);\n  const [isTimingOptionsExpanded, setIsTimingOptionsExpanded] = useState(false);\n  const [groupByOptions, setGroupByOptions] = useState(stringsToSelectableValues(routes.groupBy));\n\n  return (\n    <Form defaultValues={routes} onSubmit={onSave}>\n      {({ control, errors, setValue }) => (\n        <>\n          <Field label=\"Default contact point\" invalid={!!errors.receiver} error={errors.receiver?.message}>\n            <>\n              <div className={styles.container} data-testid=\"am-receiver-select\">\n                <InputControl\n                  render={({ field: { onChange, ref, ...field } }) => (\n                    <Select\n                      aria-label=\"Default contact point\"\n                      {...field}\n                      className={styles.input}\n                      onChange={(value) => onChange(mapSelectValueToString(value))}\n                      options={receivers}\n                      menuShouldPortal\n                    />\n                  )}\n                  control={control}\n                  name=\"receiver\"\n                  rules={{ required: { value: true, message: 'Required.' } }}\n                />\n                <span>or</span>\n                <Link\n                  className={styles.linkText}\n                  href={makeAMLink('/alerting/notifications/receivers/new', alertManagerSourceName)}\n                >\n                  Create a contact point\n                </Link>\n              </div>\n            </>\n          </Field>\n          <Field\n            label=\"Group by\"\n            description=\"Group alerts when you receive a notification based on labels.\"\n            data-testid=\"am-group-select\"\n          >\n            {/* @ts-ignore-check: react-hook-form made me do this */}\n            <InputControl\n              render={({ field: { onChange, ref, ...field } }) => (\n                <MultiSelect\n                  aria-label=\"Group by\"\n                  menuShouldPortal\n                  {...field}\n                  allowCustomValue\n                  className={styles.input}\n                  onCreateOption={(opt: string) => {\n                    setGroupByOptions((opts) => [...opts, stringToSelectableValue(opt)]);\n\n                    // @ts-ignore-check: react-hook-form made me do this\n                    setValue('groupBy', [...field.value, opt]);\n                  }}\n                  onChange={(value) => onChange(mapMultiSelectValueToStrings(value))}\n                  options={groupByOptions}\n                />\n              )}\n              control={control}\n              name=\"groupBy\"\n            />\n          </Field>\n          <Collapse\n            collapsible\n            className={styles.collapse}\n            isOpen={isTimingOptionsExpanded}\n            label=\"Timing options\"\n            onToggle={setIsTimingOptionsExpanded}\n          >\n            <Field\n              label=\"Group wait\"\n              description=\"The waiting time until the initial notification is sent for a new group created by an incoming alert. Default 30 seconds.\"\n              invalid={!!errors.groupWaitValue}\n              error={errors.groupWaitValue?.message}\n              data-testid=\"am-group-wait\"\n            >\n              <>\n                <div className={cx(styles.container, styles.timingContainer)}>\n                  <InputControl\n                    render={({ field, fieldState: { invalid } }) => (\n                      <Input\n                        {...field}\n                        className={styles.smallInput}\n                        invalid={invalid}\n                        placeholder={'Default 30 seconds'}\n                      />\n                    )}\n                    control={control}\n                    name=\"groupWaitValue\"\n                    rules={{\n                      validate: optionalPositiveInteger,\n                    }}\n                  />\n                  <InputControl\n                    render={({ field: { onChange, ref, ...field } }) => (\n                      <Select\n                        menuShouldPortal\n                        {...field}\n                        className={styles.input}\n                        onChange={(value) => onChange(mapSelectValueToString(value))}\n                        options={timeOptions}\n                        aria-label=\"Group wait type\"\n                      />\n                    )}\n                    control={control}\n                    name=\"groupWaitValueType\"\n                  />\n                </div>\n              </>\n            </Field>\n            <Field\n              label=\"Group interval\"\n              description=\"The waiting time to send a batch of new alerts for that group after the first notification was sent. Default 5 minutes.\"\n              invalid={!!errors.groupIntervalValue}\n              error={errors.groupIntervalValue?.message}\n              data-testid=\"am-group-interval\"\n            >\n              <>\n                <div className={cx(styles.container, styles.timingContainer)}>\n                  <InputControl\n                    render={({ field, fieldState: { invalid } }) => (\n                      <Input\n                        {...field}\n                        className={styles.smallInput}\n                        invalid={invalid}\n                        placeholder={'Default 5 minutes'}\n                      />\n                    )}\n                    control={control}\n                    name=\"groupIntervalValue\"\n                    rules={{\n                      validate: optionalPositiveInteger,\n                    }}\n                  />\n                  <InputControl\n                    render={({ field: { onChange, ref, ...field } }) => (\n                      <Select\n                        menuShouldPortal\n                        {...field}\n                        className={styles.input}\n                        onChange={(value) => onChange(mapSelectValueToString(value))}\n                        options={timeOptions}\n                        aria-label=\"Group interval type\"\n                      />\n                    )}\n                    control={control}\n                    name=\"groupIntervalValueType\"\n                  />\n                </div>\n              </>\n            </Field>\n            <Field\n              label=\"Repeat interval\"\n              description=\"The waiting time to resend an alert after they have successfully been sent. Default 4 hours.\"\n              invalid={!!errors.repeatIntervalValue}\n              error={errors.repeatIntervalValue?.message}\n              data-testid=\"am-repeat-interval\"\n            >\n              <>\n                <div className={cx(styles.container, styles.timingContainer)}>\n                  <InputControl\n                    render={({ field, fieldState: { invalid } }) => (\n                      <Input {...field} className={styles.smallInput} invalid={invalid} placeholder=\"Default 4 hours\" />\n                    )}\n                    control={control}\n                    name=\"repeatIntervalValue\"\n                    rules={{\n                      validate: optionalPositiveInteger,\n                    }}\n                  />\n                  <InputControl\n                    render={({ field: { onChange, ref, ...field } }) => (\n                      <Select\n                        menuShouldPortal\n                        {...field}\n                        className={styles.input}\n                        menuPlacement=\"top\"\n                        onChange={(value) => onChange(mapSelectValueToString(value))}\n                        options={timeOptions}\n                        aria-label=\"Repeat interval type\"\n                      />\n                    )}\n                    control={control}\n                    name=\"repeatIntervalValueType\"\n                  />\n                </div>\n              </>\n            </Field>\n          </Collapse>\n          <div className={styles.container}>\n            <Button type=\"submit\">Save</Button>\n            <Button onClick={onCancel} type=\"reset\" variant=\"secondary\" fill=\"outline\">\n              Cancel\n            </Button>\n          </div>\n        </>\n      )}\n    </Form>\n  );\n};\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport const getGridStyles = (theme: GrafanaTheme2) => {\n  return {\n    container: css`\n      display: grid;\n      font-style: ${theme.typography.fontSize};\n      grid-template-columns: ${theme.spacing(15.5)} auto;\n\n      ${theme.breakpoints.down('md')} {\n        grid-template-columns: 100%;\n      }\n    `,\n    titleCell: css`\n      color: ${theme.colors.text.primary};\n    `,\n    valueCell: css`\n      color: ${theme.colors.text.secondary};\n      margin-bottom: ${theme.spacing(1)};\n    `,\n  };\n};\n","import React, { FC } from 'react';\nimport { useStyles2 } from '@grafana/ui';\nimport { FormAmRoute } from '../../types/amroutes';\nimport { getGridStyles } from './gridStyles';\n\nexport interface AmRootRouteReadProps {\n  routes: FormAmRoute;\n}\n\nexport const AmRootRouteRead: FC<AmRootRouteReadProps> = ({ routes }) => {\n  const styles = useStyles2(getGridStyles);\n\n  const receiver = routes.receiver || '-';\n  const groupBy = routes.groupBy.join(', ') || '-';\n  const groupWait = routes.groupWaitValue ? `${routes.groupWaitValue}${routes.groupWaitValueType}` : '-';\n  const groupInterval = routes.groupIntervalValue\n    ? `${routes.groupIntervalValue}${routes.groupIntervalValueType}`\n    : '-';\n  const repeatInterval = routes.repeatIntervalValue\n    ? `${routes.repeatIntervalValue}${routes.repeatIntervalValueType}`\n    : '-';\n\n  return (\n    <div className={styles.container}>\n      <div className={styles.titleCell}>Contact point</div>\n      <div className={styles.valueCell} data-testid=\"am-routes-root-receiver\">\n        {receiver}\n      </div>\n      <div className={styles.titleCell}>Group by</div>\n      <div className={styles.valueCell} data-testid=\"am-routes-root-group-by\">\n        {groupBy}\n      </div>\n      <div className={styles.titleCell}>Timings</div>\n      <div className={styles.valueCell} data-testid=\"am-routes-root-timings\">\n        Group wait: {groupWait} | Group interval: {groupInterval} | Repeat interval: {repeatInterval}\n      </div>\n    </div>\n  );\n};\n","import React, { FC } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, useStyles2 } from '@grafana/ui';\nimport { AmRouteReceiver, FormAmRoute } from '../../types/amroutes';\nimport { AmRootRouteForm } from './AmRootRouteForm';\nimport { AmRootRouteRead } from './AmRootRouteRead';\nimport { isVanillaPrometheusAlertManagerDataSource } from '../../utils/datasource';\n\nexport interface AmRootRouteProps {\n  isEditMode: boolean;\n  onEnterEditMode: () => void;\n  onExitEditMode: () => void;\n  onSave: (data: Partial<FormAmRoute>) => void;\n  receivers: AmRouteReceiver[];\n  routes: FormAmRoute;\n  alertManagerSourceName: string;\n}\n\nexport const AmRootRoute: FC<AmRootRouteProps> = ({\n  isEditMode,\n  onSave,\n  onEnterEditMode,\n  onExitEditMode,\n  receivers,\n  routes,\n  alertManagerSourceName,\n}) => {\n  const styles = useStyles2(getStyles);\n\n  const isReadOnly = isVanillaPrometheusAlertManagerDataSource(alertManagerSourceName);\n\n  return (\n    <div className={styles.container} data-testid=\"am-root-route-container\">\n      <div className={styles.titleContainer}>\n        <h5 className={styles.title}>\n          Root policy - <i>default for all alerts</i>\n        </h5>\n        {!isEditMode && !isReadOnly && (\n          <Button icon=\"pen\" onClick={onEnterEditMode} size=\"sm\" type=\"button\" variant=\"secondary\">\n            Edit\n          </Button>\n        )}\n      </div>\n      <p>\n        All alerts will go to the default contact point, unless you set additional matchers in the specific routing\n        area.\n      </p>\n      {isEditMode ? (\n        <AmRootRouteForm\n          alertManagerSourceName={alertManagerSourceName}\n          onCancel={onExitEditMode}\n          onSave={onSave}\n          receivers={receivers}\n          routes={routes}\n        />\n      ) : (\n        <AmRootRouteRead routes={routes} />\n      )}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    container: css`\n      background-color: ${theme.colors.background.secondary};\n      color: ${theme.colors.text.secondary};\n      padding: ${theme.spacing(2)};\n    `,\n    titleContainer: css`\n      color: ${theme.colors.text.primary};\n      display: flex;\n      flex-flow: row nowrap;\n    `,\n    title: css`\n      flex: 100%;\n    `,\n  };\n};\n","import React, { FC } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { useStyles } from '@grafana/ui';\n\nexport const EmptyArea: FC = ({ children }) => {\n  const styles = useStyles(getStyles);\n\n  return <div className={styles.container}>{children}</div>;\n};\n\nconst getStyles = (theme: GrafanaTheme) => {\n  return {\n    container: css`\n      background-color: ${theme.colors.bg2};\n      color: ${theme.colors.textSemiWeak};\n      padding: ${theme.spacing.xl};\n      text-align: center;\n    `,\n  };\n};\n","import React, { FC, useState } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport {\n  Button,\n  Field,\n  FieldArray,\n  Form,\n  HorizontalGroup,\n  IconButton,\n  Input,\n  InputControl,\n  MultiSelect,\n  Select,\n  Switch,\n  useStyles2,\n} from '@grafana/ui';\nimport { AmRouteReceiver, FormAmRoute } from '../../types/amroutes';\nimport {\n  emptyArrayFieldMatcher,\n  mapMultiSelectValueToStrings,\n  mapSelectValueToString,\n  optionalPositiveInteger,\n  stringToSelectableValue,\n  stringsToSelectableValues,\n} from '../../utils/amroutes';\nimport { timeOptions } from '../../utils/time';\nimport { getFormStyles } from './formStyles';\nimport { matcherFieldOptions } from '../../utils/alertmanager';\n\nexport interface AmRoutesExpandedFormProps {\n  onCancel: () => void;\n  onSave: (data: FormAmRoute) => void;\n  receivers: AmRouteReceiver[];\n  routes: FormAmRoute;\n}\n\nexport const AmRoutesExpandedForm: FC<AmRoutesExpandedFormProps> = ({ onCancel, onSave, receivers, routes }) => {\n  const styles = useStyles2(getStyles);\n  const formStyles = useStyles2(getFormStyles);\n  const [overrideGrouping, setOverrideGrouping] = useState(routes.groupBy.length > 0);\n  const [overrideTimings, setOverrideTimings] = useState(\n    !!routes.groupWaitValue || !!routes.groupIntervalValue || !!routes.repeatIntervalValue\n  );\n  const [groupByOptions, setGroupByOptions] = useState(stringsToSelectableValues(routes.groupBy));\n\n  return (\n    <Form defaultValues={routes} onSubmit={onSave}>\n      {({ control, register, errors, setValue }) => (\n        <>\n          {/* @ts-ignore-check: react-hook-form made me do this */}\n          <input type=\"hidden\" {...register('id')} />\n          {/* @ts-ignore-check: react-hook-form made me do this */}\n          <FieldArray name=\"object_matchers\" control={control}>\n            {({ fields, append, remove }) => (\n              <>\n                <div>Matching labels</div>\n                <div className={styles.matchersContainer}>\n                  {fields.map((field, index) => {\n                    const localPath = `object_matchers[${index}]`;\n                    return (\n                      <HorizontalGroup key={field.id} align=\"flex-start\">\n                        <Field\n                          label=\"Label\"\n                          invalid={!!errors.object_matchers?.[index]?.name}\n                          error={errors.object_matchers?.[index]?.name?.message}\n                        >\n                          <Input\n                            {...register(`${localPath}.name`, { required: 'Field is required' })}\n                            defaultValue={field.name}\n                            placeholder=\"label\"\n                          />\n                        </Field>\n                        <Field label={'Operator'}>\n                          <InputControl\n                            render={({ field: { onChange, ref, ...field } }) => (\n                              <Select\n                                {...field}\n                                className={styles.matchersOperator}\n                                onChange={(value) => onChange(value?.value)}\n                                options={matcherFieldOptions}\n                                aria-label=\"Operator\"\n                              />\n                            )}\n                            defaultValue={field.operator}\n                            control={control}\n                            name={`${localPath}.operator` as const}\n                            rules={{ required: { value: true, message: 'Required.' } }}\n                          />\n                        </Field>\n                        <Field\n                          label=\"Value\"\n                          invalid={!!errors.object_matchers?.[index]?.value}\n                          error={errors.object_matchers?.[index]?.value?.message}\n                        >\n                          <Input\n                            {...register(`${localPath}.value`, { required: 'Field is required' })}\n                            defaultValue={field.value}\n                            placeholder=\"value\"\n                          />\n                        </Field>\n                        <IconButton\n                          className={styles.removeButton}\n                          tooltip=\"Remove matcher\"\n                          name={'trash-alt'}\n                          onClick={() => remove(index)}\n                        >\n                          Remove\n                        </IconButton>\n                      </HorizontalGroup>\n                    );\n                  })}\n                </div>\n                <Button\n                  className={styles.addMatcherBtn}\n                  icon=\"plus\"\n                  onClick={() => append(emptyArrayFieldMatcher)}\n                  variant=\"secondary\"\n                  type=\"button\"\n                >\n                  Add matcher\n                </Button>\n              </>\n            )}\n          </FieldArray>\n          <Field label=\"Contact point\">\n            {/* @ts-ignore-check: react-hook-form made me do this */}\n            <InputControl\n              render={({ field: { onChange, ref, ...field } }) => (\n                <Select\n                  aria-label=\"Contact point\"\n                  {...field}\n                  className={formStyles.input}\n                  onChange={(value) => onChange(mapSelectValueToString(value))}\n                  options={receivers}\n                  menuShouldPortal\n                />\n              )}\n              control={control}\n              name=\"receiver\"\n            />\n          </Field>\n          <Field label=\"Continue matching subsequent sibling nodes\">\n            <Switch id=\"continue-toggle\" {...register('continue')} />\n          </Field>\n          <Field label=\"Override grouping\">\n            <Switch\n              id=\"override-grouping-toggle\"\n              value={overrideGrouping}\n              onChange={() => setOverrideGrouping((overrideGrouping) => !overrideGrouping)}\n            />\n          </Field>\n          {overrideGrouping && (\n            <Field label=\"Group by\" description=\"Group alerts when you receive a notification based on labels.\">\n              <InputControl\n                render={({ field: { onChange, ref, ...field } }) => (\n                  <MultiSelect\n                    aria-label=\"Group by\"\n                    menuShouldPortal\n                    {...field}\n                    allowCustomValue\n                    className={formStyles.input}\n                    onCreateOption={(opt: string) => {\n                      setGroupByOptions((opts) => [...opts, stringToSelectableValue(opt)]);\n\n                      // @ts-ignore-check: react-hook-form made me do this\n                      setValue('groupBy', [...field.value, opt]);\n                    }}\n                    onChange={(value) => onChange(mapMultiSelectValueToStrings(value))}\n                    options={groupByOptions}\n                  />\n                )}\n                control={control}\n                name=\"groupBy\"\n              />\n            </Field>\n          )}\n          <Field label=\"Override general timings\">\n            <Switch\n              id=\"override-timings-toggle\"\n              value={overrideTimings}\n              onChange={() => setOverrideTimings((overrideTimings) => !overrideTimings)}\n            />\n          </Field>\n          {overrideTimings && (\n            <>\n              <Field\n                label=\"Group wait\"\n                description=\"The waiting time until the initial notification is sent for a new group created by an incoming alert.\"\n                invalid={!!errors.groupWaitValue}\n                error={errors.groupWaitValue?.message}\n              >\n                <>\n                  <div className={cx(formStyles.container, formStyles.timingContainer)}>\n                    <InputControl\n                      render={({ field, fieldState: { invalid } }) => (\n                        <Input\n                          {...field}\n                          className={formStyles.smallInput}\n                          invalid={invalid}\n                          placeholder=\"Time\"\n                          aria-label=\"Group wait value\"\n                        />\n                      )}\n                      control={control}\n                      name=\"groupWaitValue\"\n                      rules={{\n                        validate: optionalPositiveInteger,\n                      }}\n                    />\n                    <InputControl\n                      render={({ field: { onChange, ref, ...field } }) => (\n                        <Select\n                          menuShouldPortal\n                          {...field}\n                          className={formStyles.input}\n                          onChange={(value) => onChange(mapSelectValueToString(value))}\n                          options={timeOptions}\n                          aria-label=\"Group wait type\"\n                        />\n                      )}\n                      control={control}\n                      name=\"groupWaitValueType\"\n                    />\n                  </div>\n                </>\n              </Field>\n              <Field\n                label=\"Group interval\"\n                description=\"The waiting time to send a batch of new alerts for that group after the first notification was sent.\"\n                invalid={!!errors.groupIntervalValue}\n                error={errors.groupIntervalValue?.message}\n              >\n                <>\n                  <div className={cx(formStyles.container, formStyles.timingContainer)}>\n                    <InputControl\n                      render={({ field, fieldState: { invalid } }) => (\n                        <Input\n                          {...field}\n                          className={formStyles.smallInput}\n                          invalid={invalid}\n                          placeholder=\"Time\"\n                          aria-label=\"Group interval value\"\n                        />\n                      )}\n                      control={control}\n                      name=\"groupIntervalValue\"\n                      rules={{\n                        validate: optionalPositiveInteger,\n                      }}\n                    />\n                    <InputControl\n                      render={({ field: { onChange, ref, ...field } }) => (\n                        <Select\n                          menuShouldPortal\n                          {...field}\n                          className={formStyles.input}\n                          onChange={(value) => onChange(mapSelectValueToString(value))}\n                          options={timeOptions}\n                          aria-label=\"Group interval type\"\n                        />\n                      )}\n                      control={control}\n                      name=\"groupIntervalValueType\"\n                    />\n                  </div>\n                </>\n              </Field>\n              <Field\n                label=\"Repeat interval\"\n                description=\"The waiting time to resend an alert after they have successfully been sent.\"\n                invalid={!!errors.repeatIntervalValue}\n                error={errors.repeatIntervalValue?.message}\n              >\n                <>\n                  <div className={cx(formStyles.container, formStyles.timingContainer)}>\n                    <InputControl\n                      render={({ field, fieldState: { invalid } }) => (\n                        <Input\n                          {...field}\n                          className={formStyles.smallInput}\n                          invalid={invalid}\n                          placeholder=\"Time\"\n                          aria-label=\"Repeat interval value\"\n                        />\n                      )}\n                      control={control}\n                      name=\"repeatIntervalValue\"\n                      rules={{\n                        validate: optionalPositiveInteger,\n                      }}\n                    />\n                    <InputControl\n                      render={({ field: { onChange, ref, ...field } }) => (\n                        <Select\n                          menuShouldPortal\n                          {...field}\n                          className={formStyles.input}\n                          menuPlacement=\"top\"\n                          onChange={(value) => onChange(mapSelectValueToString(value))}\n                          options={timeOptions}\n                          aria-label=\"Repeat interval type\"\n                        />\n                      )}\n                      control={control}\n                      name=\"repeatIntervalValueType\"\n                    />\n                  </div>\n                </>\n              </Field>\n            </>\n          )}\n          <div className={styles.buttonGroup}>\n            <Button type=\"submit\">Save policy</Button>\n            <Button onClick={onCancel} fill=\"outline\" type=\"button\" variant=\"secondary\">\n              Cancel\n            </Button>\n          </div>\n        </>\n      )}\n    </Form>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  const commonSpacing = theme.spacing(3.5);\n\n  return {\n    addMatcherBtn: css`\n      margin-bottom: ${commonSpacing};\n    `,\n    matchersContainer: css`\n      background-color: ${theme.colors.background.secondary};\n      margin: ${theme.spacing(1, 0)};\n      padding: ${theme.spacing(1, 4.6, 1, 1.5)};\n      width: fit-content;\n    `,\n    matchersOperator: css`\n      min-width: 140px;\n    `,\n    nestedPolicies: css`\n      margin-top: ${commonSpacing};\n    `,\n    removeButton: css`\n      margin-left: ${theme.spacing(1)};\n      margin-top: ${theme.spacing(2.5)};\n    `,\n    buttonGroup: css`\n      margin: ${theme.spacing(6)} 0 ${commonSpacing};\n\n      & > * + * {\n        margin-left: ${theme.spacing(1.5)};\n      }\n    `,\n  };\n};\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport React, { FC, useState } from 'react';\nimport { Button, useStyles2 } from '@grafana/ui';\nimport { AmRouteReceiver, FormAmRoute } from '../../types/amroutes';\nimport { emptyRoute } from '../../utils/amroutes';\nimport { AmRoutesTable } from './AmRoutesTable';\nimport { getGridStyles } from './gridStyles';\n\nexport interface AmRoutesExpandedReadProps {\n  onChange: (routes: FormAmRoute) => void;\n  receivers: AmRouteReceiver[];\n  routes: FormAmRoute;\n  readOnly?: boolean;\n}\n\nexport const AmRoutesExpandedRead: FC<AmRoutesExpandedReadProps> = ({\n  onChange,\n  receivers,\n  routes,\n  readOnly = false,\n}) => {\n  const styles = useStyles2(getStyles);\n  const gridStyles = useStyles2(getGridStyles);\n\n  const groupWait = routes.groupWaitValue ? `${routes.groupWaitValue}${routes.groupWaitValueType}` : '-';\n  const groupInterval = routes.groupIntervalValue\n    ? `${routes.groupIntervalValue}${routes.groupIntervalValueType}`\n    : '-';\n  const repeatInterval = routes.repeatIntervalValue\n    ? `${routes.repeatIntervalValue}${routes.repeatIntervalValueType}`\n    : '-';\n\n  const [subroutes, setSubroutes] = useState(routes.routes);\n  const [isAddMode, setIsAddMode] = useState(false);\n\n  return (\n    <div className={gridStyles.container}>\n      <div className={gridStyles.titleCell}>Group wait</div>\n      <div className={gridStyles.valueCell}>{groupWait}</div>\n      <div className={gridStyles.titleCell}>Group interval</div>\n      <div className={gridStyles.valueCell}>{groupInterval}</div>\n      <div className={gridStyles.titleCell}>Repeat interval</div>\n      <div className={gridStyles.valueCell}>{repeatInterval}</div>\n      <div className={gridStyles.titleCell}>Nested policies</div>\n      <div className={gridStyles.valueCell}>\n        {!!subroutes.length ? (\n          <AmRoutesTable\n            isAddMode={isAddMode}\n            onCancelAdd={() => {\n              setIsAddMode(false);\n              setSubroutes((subroutes) => {\n                const newSubroutes = [...subroutes];\n                newSubroutes.pop();\n\n                return newSubroutes;\n              });\n            }}\n            onChange={(newRoutes) => {\n              onChange({\n                ...routes,\n                routes: newRoutes,\n              });\n\n              if (isAddMode) {\n                setIsAddMode(false);\n              }\n            }}\n            receivers={receivers}\n            routes={subroutes}\n          />\n        ) : (\n          <p>No nested policies configured.</p>\n        )}\n        {!isAddMode && !readOnly && (\n          <Button\n            className={styles.addNestedRoutingBtn}\n            icon=\"plus\"\n            onClick={() => {\n              setSubroutes((subroutes) => [...subroutes, emptyRoute]);\n              setIsAddMode(true);\n            }}\n            variant=\"secondary\"\n            type=\"button\"\n          >\n            Add nested policy\n          </Button>\n        )}\n      </div>\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    addNestedRoutingBtn: css`\n      margin-top: ${theme.spacing(2)};\n    `,\n  };\n};\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport { Button, HorizontalGroup, IconButton } from '@grafana/ui';\nimport { AmRouteReceiver, FormAmRoute } from '../../types/amroutes';\nimport { prepareItems } from '../../utils/dynamicTable';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\nimport { AmRoutesExpandedForm } from './AmRoutesExpandedForm';\nimport { AmRoutesExpandedRead } from './AmRoutesExpandedRead';\nimport { Matchers } from '../silences/Matchers';\nimport { matcherFieldToMatcher } from '../../utils/alertmanager';\n\nexport interface AmRoutesTableProps {\n  isAddMode: boolean;\n  onChange: (routes: FormAmRoute[]) => void;\n  onCancelAdd: () => void;\n  receivers: AmRouteReceiver[];\n  routes: FormAmRoute[];\n  readOnly?: boolean;\n}\n\ntype RouteTableColumnProps = DynamicTableColumnProps<FormAmRoute>;\ntype RouteTableItemProps = DynamicTableItemProps<FormAmRoute>;\n\nexport const AmRoutesTable: FC<AmRoutesTableProps> = ({\n  isAddMode,\n  onCancelAdd,\n  onChange,\n  receivers,\n  routes,\n  readOnly = false,\n}) => {\n  const [editMode, setEditMode] = useState(false);\n\n  const [expandedId, setExpandedId] = useState<string | number>();\n\n  const expandItem = useCallback((item: RouteTableItemProps) => setExpandedId(item.id), []);\n\n  const collapseItem = useCallback(() => setExpandedId(undefined), []);\n\n  const cols: RouteTableColumnProps[] = [\n    {\n      id: 'matchingCriteria',\n      label: 'Matching labels',\n      // eslint-disable-next-line react/display-name\n      renderCell: (item) => <Matchers matchers={item.data.object_matchers.map(matcherFieldToMatcher)} />,\n      size: 10,\n    },\n    {\n      id: 'groupBy',\n      label: 'Group by',\n      renderCell: (item) => item.data.groupBy.join(', ') || '-',\n      size: 5,\n    },\n    {\n      id: 'receiverChannel',\n      label: 'Contact point',\n      renderCell: (item) => item.data.receiver || '-',\n      size: 5,\n    },\n    ...(readOnly\n      ? []\n      : [\n          {\n            id: 'actions',\n            label: 'Actions',\n            // eslint-disable-next-line react/display-name\n            renderCell: (item, index) => {\n              if (item.renderExpandedContent) {\n                return null;\n              }\n\n              const expandWithCustomContent = () => {\n                expandItem(item);\n                setEditMode(true);\n              };\n\n              return (\n                <HorizontalGroup>\n                  <Button\n                    aria-label=\"Edit route\"\n                    icon=\"pen\"\n                    onClick={expandWithCustomContent}\n                    size=\"sm\"\n                    type=\"button\"\n                    variant=\"secondary\"\n                  >\n                    Edit\n                  </Button>\n                  <IconButton\n                    aria-label=\"Delete route\"\n                    name=\"trash-alt\"\n                    onClick={() => {\n                      const newRoutes = [...routes];\n\n                      newRoutes.splice(index, 1);\n\n                      onChange(newRoutes);\n                    }}\n                    type=\"button\"\n                  />\n                </HorizontalGroup>\n              );\n            },\n            size: '100px',\n          } as RouteTableColumnProps,\n        ]),\n  ];\n\n  const items = useMemo(() => prepareItems(routes), [routes]);\n\n  // expand the last item when adding\n  useEffect(() => {\n    if (isAddMode && items.length) {\n      setExpandedId(items[items.length - 1].id);\n    }\n  }, [isAddMode, items]);\n\n  return (\n    <DynamicTable\n      cols={cols}\n      isExpandable={true}\n      items={items}\n      testIdGenerator={() => 'am-routes-row'}\n      onCollapse={collapseItem}\n      onExpand={expandItem}\n      isExpanded={(item) => expandedId === item.id}\n      renderExpandedContent={(item: RouteTableItemProps, index) =>\n        isAddMode || editMode ? (\n          <AmRoutesExpandedForm\n            onCancel={() => {\n              if (isAddMode) {\n                onCancelAdd();\n              }\n              setEditMode(false);\n            }}\n            onSave={(data) => {\n              const newRoutes = [...routes];\n\n              newRoutes[index] = {\n                ...newRoutes[index],\n                ...data,\n              };\n              setEditMode(false);\n              onChange(newRoutes);\n            }}\n            receivers={receivers}\n            routes={item.data}\n          />\n        ) : (\n          <AmRoutesExpandedRead\n            onChange={(data) => {\n              const newRoutes = [...routes];\n\n              newRoutes[index] = {\n                ...item.data,\n                ...data,\n              };\n\n              onChange(newRoutes);\n            }}\n            receivers={receivers}\n            routes={item.data}\n            readOnly={readOnly}\n          />\n        )\n      }\n    />\n  );\n};\n","import { DynamicTableItemProps } from '../components/DynamicTable';\n\nexport const prepareItems = <T = unknown>(\n  items: T[],\n  idCreator?: (item: T) => number | string\n): Array<DynamicTableItemProps<T>> =>\n  items.map((item, index) => ({\n    id: idCreator?.(item) ?? index,\n    data: item,\n  }));\n","import React, { ButtonHTMLAttributes, FC } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Button, ButtonVariant, IconName, useStyles } from '@grafana/ui';\nimport { EmptyArea } from './EmptyArea';\n\nexport interface EmptyAreaWithCTAProps {\n  buttonLabel: string;\n  onButtonClick: ButtonHTMLAttributes<HTMLButtonElement>['onClick'];\n  text: string;\n\n  buttonIcon?: IconName;\n  buttonSize?: 'xs' | 'sm' | 'md' | 'lg';\n  buttonVariant?: ButtonVariant;\n}\n\nexport const EmptyAreaWithCTA: FC<EmptyAreaWithCTAProps> = ({\n  buttonIcon,\n  buttonLabel,\n  buttonSize = 'lg',\n  buttonVariant = 'primary',\n  onButtonClick,\n  text,\n}) => {\n  const styles = useStyles(getStyles);\n\n  return (\n    <EmptyArea>\n      <>\n        <p className={styles.text}>{text}</p>\n        <Button\n          className={styles.button}\n          icon={buttonIcon}\n          onClick={onButtonClick}\n          size={buttonSize}\n          type=\"button\"\n          variant={buttonVariant}\n        >\n          {buttonLabel}\n        </Button>\n      </>\n    </EmptyArea>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme) => {\n  return {\n    container: css`\n      background-color: ${theme.colors.bg2};\n      color: ${theme.colors.textSemiWeak};\n      padding: ${theme.spacing.xl};\n      text-align: center;\n    `,\n    text: css`\n      margin-bottom: ${theme.spacing.md};\n    `,\n    button: css`\n      margin: ${theme.spacing.md} 0 ${theme.spacing.sm};\n    `,\n  };\n};\n","import React, { FC, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, useStyles2 } from '@grafana/ui';\nimport { AmRouteReceiver, FormAmRoute } from '../../types/amroutes';\nimport { emptyArrayFieldMatcher, emptyRoute } from '../../utils/amroutes';\nimport { EmptyArea } from '../EmptyArea';\nimport { AmRoutesTable } from './AmRoutesTable';\nimport { EmptyAreaWithCTA } from '../EmptyAreaWithCTA';\n\nexport interface AmSpecificRoutingProps {\n  onChange: (routes: FormAmRoute) => void;\n  onRootRouteEdit: () => void;\n  receivers: AmRouteReceiver[];\n  routes: FormAmRoute;\n  readOnly?: boolean;\n}\n\nexport const AmSpecificRouting: FC<AmSpecificRoutingProps> = ({\n  onChange,\n  onRootRouteEdit,\n  receivers,\n  routes,\n  readOnly = false,\n}) => {\n  const [actualRoutes, setActualRoutes] = useState(routes.routes);\n  const [isAddMode, setIsAddMode] = useState(false);\n\n  const styles = useStyles2(getStyles);\n\n  const addNewRoute = () => {\n    setIsAddMode(true);\n    setActualRoutes((actualRoutes) => [\n      ...actualRoutes,\n      {\n        ...emptyRoute,\n        matchers: [emptyArrayFieldMatcher],\n      },\n    ]);\n  };\n\n  return (\n    <div className={styles.container}>\n      <h5>Specific routing</h5>\n      <p>Send specific alerts to chosen contact points, based on matching criteria</p>\n      {!routes.receiver ? (\n        readOnly ? (\n          <EmptyArea>\n            <p>There is no default contact point configured for the root route.</p>\n          </EmptyArea>\n        ) : (\n          <EmptyAreaWithCTA\n            buttonIcon=\"rocket\"\n            buttonLabel=\"Set a default contact point\"\n            onButtonClick={onRootRouteEdit}\n            text=\"You haven't set a default contact point for the root route yet.\"\n          />\n        )\n      ) : actualRoutes.length > 0 ? (\n        <>\n          {!isAddMode && !readOnly && (\n            <Button className={styles.addMatcherBtn} icon=\"plus\" onClick={addNewRoute} type=\"button\">\n              New policy\n            </Button>\n          )}\n          <AmRoutesTable\n            isAddMode={isAddMode}\n            readOnly={readOnly}\n            onCancelAdd={() => {\n              setIsAddMode(false);\n              setActualRoutes((actualRoutes) => {\n                const newRoutes = [...actualRoutes];\n                newRoutes.pop();\n\n                return newRoutes;\n              });\n            }}\n            onChange={(newRoutes) => {\n              onChange({\n                ...routes,\n                routes: newRoutes,\n              });\n\n              if (isAddMode) {\n                setIsAddMode(false);\n              }\n            }}\n            receivers={receivers}\n            routes={actualRoutes}\n          />\n        </>\n      ) : readOnly ? (\n        <EmptyArea>\n          <p>There are no specific policies configured.</p>\n        </EmptyArea>\n      ) : (\n        <EmptyAreaWithCTA\n          buttonIcon=\"plus\"\n          buttonLabel=\"New specific policy\"\n          onButtonClick={addNewRoute}\n          text=\"You haven't created any specific policies yet.\"\n        />\n      )}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    container: css`\n      display: flex;\n      flex-flow: column nowrap;\n    `,\n    addMatcherBtn: css`\n      align-self: flex-end;\n      margin-bottom: ${theme.spacing(3.5)};\n    `,\n  };\n};\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Alert, LoadingPlaceholder, useStyles2, withErrorBoundary } from '@grafana/ui';\nimport { useDispatch } from 'react-redux';\nimport { Redirect } from 'react-router-dom';\nimport { Receiver } from 'app/plugins/datasource/alertmanager/types';\nimport { useCleanup } from '../../../core/hooks/useCleanup';\nimport { AlertingPageWrapper } from './components/AlertingPageWrapper';\nimport { AlertManagerPicker } from './components/AlertManagerPicker';\nimport { AmRootRoute } from './components/amroutes/AmRootRoute';\nimport { AmSpecificRouting } from './components/amroutes/AmSpecificRouting';\nimport { useAlertManagerSourceName } from './hooks/useAlertManagerSourceName';\nimport { useUnifiedAlertingSelector } from './hooks/useUnifiedAlertingSelector';\nimport { fetchAlertManagerConfigAction, updateAlertManagerConfigAction } from './state/actions';\nimport { AmRouteReceiver, FormAmRoute } from './types/amroutes';\nimport { amRouteToFormAmRoute, formAmRouteToAmRoute, stringsToSelectableValues } from './utils/amroutes';\nimport { initialAsyncRequestState } from './utils/redux';\nimport { isVanillaPrometheusAlertManagerDataSource } from './utils/datasource';\n\nconst AmRoutes: FC = () => {\n  const dispatch = useDispatch();\n  const styles = useStyles2(getStyles);\n  const [isRootRouteEditMode, setIsRootRouteEditMode] = useState(false);\n  const [alertManagerSourceName, setAlertManagerSourceName] = useAlertManagerSourceName();\n\n  const readOnly = alertManagerSourceName ? isVanillaPrometheusAlertManagerDataSource(alertManagerSourceName) : true;\n\n  const amConfigs = useUnifiedAlertingSelector((state) => state.amConfigs);\n\n  const fetchConfig = useCallback(() => {\n    if (alertManagerSourceName) {\n      dispatch(fetchAlertManagerConfigAction(alertManagerSourceName));\n    }\n  }, [alertManagerSourceName, dispatch]);\n\n  useEffect(() => {\n    fetchConfig();\n  }, [fetchConfig]);\n\n  const { result, loading: resultLoading, error: resultError } =\n    (alertManagerSourceName && amConfigs[alertManagerSourceName]) || initialAsyncRequestState;\n\n  const config = result?.alertmanager_config;\n  const [rootRoute, id2ExistingRoute] = useMemo(() => amRouteToFormAmRoute(config?.route), [config?.route]);\n\n  const receivers = stringsToSelectableValues(\n    (config?.receivers ?? []).map((receiver: Receiver) => receiver.name)\n  ) as AmRouteReceiver[];\n\n  const enterRootRouteEditMode = () => {\n    setIsRootRouteEditMode(true);\n  };\n\n  const exitRootRouteEditMode = () => {\n    setIsRootRouteEditMode(false);\n  };\n\n  useCleanup((state) => state.unifiedAlerting.saveAMConfig);\n  const handleSave = (data: Partial<FormAmRoute>) => {\n    if (!result) {\n      return;\n    }\n\n    const newData = formAmRouteToAmRoute(\n      alertManagerSourceName,\n      {\n        ...rootRoute,\n        ...data,\n      },\n      id2ExistingRoute\n    );\n\n    if (isRootRouteEditMode) {\n      exitRootRouteEditMode();\n    }\n\n    dispatch(\n      updateAlertManagerConfigAction({\n        newConfig: {\n          ...result,\n          alertmanager_config: {\n            ...result.alertmanager_config,\n            route: newData,\n          },\n        },\n        oldConfig: result,\n        alertManagerSourceName: alertManagerSourceName!,\n        successMessage: 'Saved',\n        refetch: true,\n      })\n    );\n  };\n\n  if (!alertManagerSourceName) {\n    return <Redirect to=\"/alerting/routes\" />;\n  }\n\n  return (\n    <AlertingPageWrapper pageId=\"am-routes\">\n      <AlertManagerPicker current={alertManagerSourceName} onChange={setAlertManagerSourceName} />\n      {resultError && !resultLoading && (\n        <Alert severity=\"error\" title=\"Error loading Alertmanager config\">\n          {resultError.message || 'Unknown error.'}\n        </Alert>\n      )}\n      {resultLoading && <LoadingPlaceholder text=\"Loading Alertmanager config...\" />}\n      {result && !resultLoading && !resultError && (\n        <>\n          <AmRootRoute\n            alertManagerSourceName={alertManagerSourceName}\n            isEditMode={isRootRouteEditMode}\n            onSave={handleSave}\n            onEnterEditMode={enterRootRouteEditMode}\n            onExitEditMode={exitRootRouteEditMode}\n            receivers={receivers}\n            routes={rootRoute}\n          />\n          <div className={styles.break} />\n          <AmSpecificRouting\n            onChange={handleSave}\n            readOnly={readOnly}\n            onRootRouteEdit={enterRootRouteEditMode}\n            receivers={receivers}\n            routes={rootRoute}\n          />\n        </>\n      )}\n    </AlertingPageWrapper>\n  );\n};\n\nexport default withErrorBoundary(AmRoutes, { style: 'page' });\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  break: css`\n    width: 100%;\n    height: 0;\n    margin-bottom: ${theme.spacing(2)};\n  `,\n});\n","import React, { FC } from 'react';\nimport Page from 'app/core/components/Page/Page';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { useSelector } from 'react-redux';\nimport { StoreState } from 'app/types/store';\n\ninterface Props {\n  pageId: string;\n  isLoading?: boolean;\n}\n\nexport const AlertingPageWrapper: FC<Props> = ({ children, pageId, isLoading }) => {\n  const navModel = getNavModel(\n    useSelector((state: StoreState) => state.navIndex),\n    pageId\n  );\n\n  return (\n    <Page navModel={navModel}>\n      <Page.Contents isLoading={isLoading}>{children}</Page.Contents>\n    </Page>\n  );\n};\n","import React, { ReactNode, useState } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { IconButton, useStyles2 } from '@grafana/ui';\n\nexport interface DynamicTableColumnProps<T = unknown> {\n  id: string | number;\n  label: string;\n\n  renderCell: (item: DynamicTableItemProps<T>, index: number) => ReactNode;\n  size?: number | string;\n}\n\nexport interface DynamicTableItemProps<T = unknown> {\n  id: string | number;\n  data: T;\n  renderExpandedContent?: () => ReactNode;\n}\n\nexport interface DynamicTableProps<T = unknown> {\n  cols: Array<DynamicTableColumnProps<T>>;\n  items: Array<DynamicTableItemProps<T>>;\n\n  isExpandable?: boolean;\n\n  // provide these to manually control expanded status\n  onCollapse?: (item: DynamicTableItemProps<T>) => void;\n  onExpand?: (item: DynamicTableItemProps<T>) => void;\n  isExpanded?: (item: DynamicTableItemProps<T>) => boolean;\n\n  renderExpandedContent?: (\n    item: DynamicTableItemProps<T>,\n    index: number,\n    items: Array<DynamicTableItemProps<T>>\n  ) => ReactNode;\n  testIdGenerator?: (item: DynamicTableItemProps<T>, index: number) => string;\n  renderPrefixHeader?: () => ReactNode;\n  renderPrefixCell?: (\n    item: DynamicTableItemProps<T>,\n    index: number,\n    items: Array<DynamicTableItemProps<T>>\n  ) => ReactNode;\n}\n\nexport const DynamicTable = <T extends object>({\n  cols,\n  items,\n  isExpandable = false,\n  onCollapse,\n  onExpand,\n  isExpanded,\n  renderExpandedContent,\n  testIdGenerator,\n\n  // render a cell BEFORE expand icon for header/ each row.\n  // currently use by RuleList to render guidelines\n  renderPrefixCell,\n  renderPrefixHeader,\n}: DynamicTableProps<T>) => {\n  if ((onCollapse || onExpand || isExpanded) && !(onCollapse && onExpand && isExpanded)) {\n    throw new Error('either all of onCollapse, onExpand, isExpanded must be provided, or none');\n  }\n  if ((isExpandable || renderExpandedContent) && !(isExpandable && renderExpandedContent)) {\n    throw new Error('either both isExpanded and renderExpandedContent must be provided, or neither');\n  }\n  const styles = useStyles2(getStyles(cols, isExpandable, !!renderPrefixHeader));\n\n  const [expandedIds, setExpandedIds] = useState<Array<DynamicTableItemProps['id']>>([]);\n\n  const toggleExpanded = (item: DynamicTableItemProps<T>) => {\n    if (isExpanded && onCollapse && onExpand) {\n      isExpanded(item) ? onCollapse(item) : onExpand(item);\n    } else {\n      setExpandedIds(\n        expandedIds.includes(item.id) ? expandedIds.filter((itemId) => itemId !== item.id) : [...expandedIds, item.id]\n      );\n    }\n  };\n  return (\n    <div className={styles.container} data-testid=\"dynamic-table\">\n      <div className={styles.row} data-testid=\"header\">\n        {renderPrefixHeader && renderPrefixHeader()}\n        {isExpandable && <div className={styles.cell} />}\n        {cols.map((col) => (\n          <div className={styles.cell} key={col.id}>\n            {col.label}\n          </div>\n        ))}\n      </div>\n\n      {items.map((item, index) => {\n        const isItemExpanded = isExpanded ? isExpanded(item) : expandedIds.includes(item.id);\n        return (\n          <div className={styles.row} key={item.id} data-testid={testIdGenerator?.(item, index) ?? 'row'}>\n            {renderPrefixCell && renderPrefixCell(item, index, items)}\n            {isExpandable && (\n              <div className={cx(styles.cell, styles.expandCell)}>\n                <IconButton\n                  aria-label={`${isItemExpanded ? 'Collapse' : 'Expand'} row`}\n                  size=\"xl\"\n                  data-testid=\"collapse-toggle\"\n                  className={styles.expandButton}\n                  name={isItemExpanded ? 'angle-down' : 'angle-right'}\n                  onClick={() => toggleExpanded(item)}\n                  type=\"button\"\n                />\n              </div>\n            )}\n            {cols.map((col) => (\n              <div className={cx(styles.cell, styles.bodyCell)} data-column={col.label} key={`${item.id}-${col.id}`}>\n                {col.renderCell(item, index)}\n              </div>\n            ))}\n            {isItemExpanded && renderExpandedContent && (\n              <div className={styles.expandedContentRow} data-testid=\"expanded-content\">\n                {renderExpandedContent(item, index, items)}\n              </div>\n            )}\n          </div>\n        );\n      })}\n    </div>\n  );\n};\n\nconst getStyles = <T extends unknown>(\n  cols: Array<DynamicTableColumnProps<T>>,\n  isExpandable: boolean,\n  hasPrefixCell: boolean\n) => {\n  const sizes = cols.map((col) => {\n    if (!col.size) {\n      return 'auto';\n    }\n\n    if (typeof col.size === 'number') {\n      return `${col.size}fr`;\n    }\n\n    return col.size;\n  });\n\n  if (isExpandable) {\n    sizes.unshift('calc(1em + 16px)');\n  }\n\n  if (hasPrefixCell) {\n    sizes.unshift('0');\n  }\n\n  return (theme: GrafanaTheme2) => ({\n    container: css`\n      border: 1px solid ${theme.colors.border.strong};\n      border-radius: 2px;\n      color: ${theme.colors.text.secondary};\n    `,\n    row: css`\n      display: grid;\n      grid-template-columns: ${sizes.join(' ')};\n      grid-template-rows: 1fr auto;\n\n      &:nth-child(2n + 1) {\n        background-color: ${theme.colors.background.secondary};\n      }\n\n      &:nth-child(2n) {\n        background-color: ${theme.colors.background.primary};\n      }\n\n      ${theme.breakpoints.down('sm')} {\n        grid-template-columns: auto 1fr;\n        grid-template-areas: 'left right';\n        padding: 0 ${theme.spacing(0.5)};\n\n        &:first-child {\n          display: none;\n        }\n\n        ${hasPrefixCell\n          ? `\n            & > *:first-child {\n              display: none;\n            }\n          `\n          : ''}\n      }\n    `,\n    cell: css`\n      align-items: center;\n      padding: ${theme.spacing(1)};\n\n      ${theme.breakpoints.down('sm')} {\n        padding: ${theme.spacing(1)} 0;\n        grid-template-columns: 1fr;\n      }\n    `,\n    bodyCell: css`\n      overflow: hidden;\n      word-break: break-all;\n      ${theme.breakpoints.down('sm')} {\n        grid-column-end: right;\n        grid-column-start: right;\n\n        &::before {\n          content: attr(data-column);\n          display: block;\n          color: ${theme.colors.text.primary};\n        }\n      }\n    `,\n    expandCell: css`\n      justify-content: center;\n\n      ${theme.breakpoints.down('sm')} {\n        align-items: start;\n        grid-area: left;\n      }\n    `,\n    expandedContentRow: css`\n      grid-column-end: ${sizes.length + 1};\n      grid-column-start: ${hasPrefixCell ? 3 : 2};\n      grid-row: 2;\n      padding: 0 ${theme.spacing(3)} 0 ${theme.spacing(1)};\n      position: relative;\n\n      ${theme.breakpoints.down('sm')} {\n        grid-column-start: 2;\n        border-top: 1px solid ${theme.colors.border.strong};\n        grid-row: auto;\n        padding: ${theme.spacing(1)} 0 0 0;\n      }\n    `,\n    expandButton: css`\n      margin-right: 0;\n      display: block;\n    `,\n  });\n};\n","import React, { useCallback } from 'react';\nimport { GrafanaTheme } from '@grafana/data';\nimport { useStyles } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { Matcher } from 'app/plugins/datasource/alertmanager/types';\nimport { AlertLabel } from '../AlertLabel';\nimport { matcherToOperator } from '../../utils/alertmanager';\n\ntype MatchersProps = { matchers: Matcher[]; onRemoveLabel?(index: number): void };\n\nexport const Matchers = ({ matchers, onRemoveLabel }: MatchersProps) => {\n  const styles = useStyles(getStyles);\n\n  const removeLabel = useCallback(\n    (index: number) => {\n      if (!!onRemoveLabel) {\n        onRemoveLabel(index);\n      }\n    },\n    [onRemoveLabel]\n  );\n\n  return (\n    <div className={styles.wrapper}>\n      {matchers.map((matcher, index) => {\n        const { name, value } = matcher;\n        return (\n          <AlertLabel\n            key={`${name}-${value}-${index}`}\n            labelKey={name}\n            value={value}\n            operator={matcherToOperator(matcher)}\n            onRemoveLabel={!!onRemoveLabel ? () => removeLabel(index) : undefined}\n          />\n        );\n      })}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n  wrapper: css`\n    & > * {\n      margin-top: ${theme.spacing.xs};\n      margin-right: ${theme.spacing.xs};\n    }\n    padding-bottom: ${theme.spacing.xs};\n  `,\n});\n","import { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport store from 'app/core/store';\nimport { useCallback } from 'react';\nimport { ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, ALERTMANAGER_NAME_QUERY_KEY } from '../utils/constants';\nimport { getAlertManagerDataSources, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\nfunction isAlertManagerSource(alertManagerSourceName: string): boolean {\n  return (\n    alertManagerSourceName === GRAFANA_RULES_SOURCE_NAME ||\n    !!getAlertManagerDataSources().find((ds) => ds.name === alertManagerSourceName)\n  );\n}\n\n/* this will return am name either from query params or from local storage or a default (grafana).\n *\n * fallbackUrl - if provided, will redirect to this url if alertmanager provided in query no longer\n */\nexport function useAlertManagerSourceName(): [string | undefined, (alertManagerSourceName: string) => void] {\n  const [queryParams, updateQueryParams] = useQueryParams();\n\n  const update = useCallback(\n    (alertManagerSourceName: string) => {\n      if (!isAlertManagerSource(alertManagerSourceName)) {\n        return;\n      }\n      if (alertManagerSourceName === GRAFANA_RULES_SOURCE_NAME) {\n        store.delete(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);\n        updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: null });\n      } else {\n        store.set(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, alertManagerSourceName);\n        updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: alertManagerSourceName });\n      }\n    },\n    [updateQueryParams]\n  );\n\n  const querySource = queryParams[ALERTMANAGER_NAME_QUERY_KEY];\n\n  if (querySource && typeof querySource === 'string') {\n    if (isAlertManagerSource(querySource)) {\n      return [querySource, update];\n    } else {\n      // non existing alertmanager\n      return [undefined, update];\n    }\n  }\n  const storeSource = store.get(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);\n  if (storeSource && typeof storeSource === 'string' && isAlertManagerSource(storeSource)) {\n    update(storeSource);\n    return [storeSource, update];\n  }\n\n  return [GRAFANA_RULES_SOURCE_NAME, update];\n}\n"],"names":["useCleanup","stateSelector","dispatch","useDispatch","selectorRef","useRef","current","useEffect","cleanUpAction","useQueryParams","search","useLocation","useMemo","locationSearchToObject","useCallback","values","replace","setImmediate","locationService","defaultValueAndType","timeOptions","matchersToArrayFieldMatchers","matchers","isRegex","Object","entries","reduce","acc","name","value","operator","MatcherOperator","intervalToValueAndType","strValue","valueType","parseInterval","undefined","timeOption","opt","String","selectableValueToString","selectableValue","emptyArrayFieldMatcher","emptyRoute","id","groupBy","object_matchers","routes","continue","receiver","groupWaitValue","groupWaitValueType","groupIntervalValue","groupIntervalValueType","repeatIntervalValue","repeatIntervalValueType","amRouteToFormAmRoute","route","keys","length","group_wait","group_interval","repeat_interval","Math","random","id2route","formRoutes","forEach","subRoute","subFormRoute","subId2Route","push","assign","map","matcher","matcherToMatcherField","parseMatcher","match","match_re","group_by","formAmRouteToAmRoute","alertManagerSourceName","formAmRoute","id2ExistingRoute","existing","amRoute","GRAFANA_RULES_SOURCE_NAME","omitBy","isUndefined","stringToSelectableValue","str","label","stringsToSelectableValues","arr","mapSelectValueToString","mapMultiSelectValueToStrings","selectableValues","optionalPositiveInteger","test","getFormStyles","theme","container","css","spacing","input","timingContainer","smallInput","linkText","collapse","colors","text","primary","AmRootRouteForm","onCancel","onSave","receivers","styles","useStyles2","isTimingOptionsExpanded","setIsTimingOptionsExpanded","useState","groupByOptions","setGroupByOptions","Form","defaultValues","onSubmit","control","errors","setValue","Field","invalid","error","message","className","InputControl","render","field","onChange","Select","options","menuShouldPortal","rules","required","Link","href","makeAMLink","description","MultiSelect","allowCustomValue","onCreateOption","opts","Collapse","collapsible","isOpen","onToggle","cx","fieldState","Input","placeholder","validate","menuPlacement","Button","type","onClick","variant","fill","getGridStyles","typography","fontSize","breakpoints","down","titleCell","valueCell","secondary","AmRootRouteRead","join","groupWait","groupInterval","repeatInterval","AmRootRoute","isEditMode","onEnterEditMode","onExitEditMode","getStyles","isReadOnly","isVanillaPrometheusAlertManagerDataSource","titleContainer","title","icon","size","background","EmptyArea","children","useStyles","bg2","textSemiWeak","xl","AmRoutesExpandedForm","formStyles","overrideGrouping","setOverrideGrouping","overrideTimings","setOverrideTimings","register","FieldArray","fields","append","remove","matchersContainer","index","localPath","HorizontalGroup","align","defaultValue","matchersOperator","matcherFieldOptions","IconButton","removeButton","tooltip","addMatcherBtn","Switch","buttonGroup","commonSpacing","nestedPolicies","AmRoutesExpandedRead","readOnly","gridStyles","subroutes","setSubroutes","isAddMode","setIsAddMode","AmRoutesTable","onCancelAdd","newSubroutes","pop","newRoutes","addNestedRoutingBtn","editMode","setEditMode","expandedId","setExpandedId","expandItem","item","collapseItem","cols","renderCell","Matchers","data","matcherFieldToMatcher","renderExpandedContent","splice","items","idCreator","prepareItems","DynamicTable","isExpandable","testIdGenerator","onCollapse","onExpand","isExpanded","EmptyAreaWithCTA","buttonIcon","buttonLabel","buttonSize","buttonVariant","onButtonClick","button","md","sm","AmSpecificRouting","onRootRouteEdit","actualRoutes","setActualRoutes","addNewRoute","withErrorBoundary","isRootRouteEditMode","setIsRootRouteEditMode","setAlertManagerSourceName","useAlertManagerSourceName","amConfigs","useUnifiedAlertingSelector","state","fetchConfig","fetchAlertManagerConfigAction","result","loading","resultLoading","resultError","initialAsyncRequestState","config","alertmanager_config","rootRoute","enterRootRouteEditMode","exitRootRouteEditMode","unifiedAlerting","saveAMConfig","handleSave","newData","updateAlertManagerConfigAction","newConfig","oldConfig","successMessage","refetch","AlertingPageWrapper","pageId","AlertManagerPicker","Alert","severity","LoadingPlaceholder","break","to","style","isLoading","navModel","getNavModel","useSelector","navIndex","renderPrefixCell","renderPrefixHeader","Error","expandedIds","setExpandedIds","row","cell","col","isItemExpanded","includes","expandCell","expandButton","filter","itemId","toggleExpanded","bodyCell","expandedContentRow","hasPrefixCell","sizes","unshift","border","strong","onRemoveLabel","removeLabel","wrapper","labelKey","matcherToOperator","xs","isAlertManagerSource","getAlertManagerDataSources","find","ds","queryParams","updateQueryParams","update","store","ALERTMANAGER_NAME_LOCAL_STORAGE_KEY","ALERTMANAGER_NAME_QUERY_KEY","querySource","storeSource"],"sourceRoot":""}