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