{"version":3,"file":"NotificationsPage.d26b90d7348139106351.js","mappings":"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","sources":["webpack://grafana/./node_modules/date-fns/formatDistance.mjs","webpack://grafana/./node_modules/date-fns/formatDistanceToNow.mjs","webpack://grafana/./public/app/core/components/AppNotifications/StoredNotificationItem.tsx","webpack://grafana/./public/app/features/notifications/StoredNotifications.tsx","webpack://grafana/./public/app/features/notifications/NotificationsPage.tsx"],"sourcesContent":["import { compareAsc } from \"./compareAsc.mjs\";\nimport { minutesInDay, minutesInMonth } from \"./constants.mjs\";\nimport { differenceInMonths } from \"./differenceInMonths.mjs\";\nimport { differenceInSeconds } from \"./differenceInSeconds.mjs\";\nimport { toDate } from \"./toDate.mjs\";\nimport { defaultLocale } from \"./_lib/defaultLocale.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\nimport { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.mjs\";\n\n/**\n * The {@link formatDistance} function options.\n */\n\n/**\n * @name formatDistance\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words.\n *\n * | Distance between dates | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance between dates | Result |\n * |------------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date\n * @param baseDate - The date to compare with\n * @param options - An object with options\n *\n * @returns The distance in words\n *\n * @throws `date` must not be Invalid Date\n * @throws `baseDate` must not be Invalid Date\n * @throws `options.locale` must contain `formatDistance` property\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * const result = formatDistance(new Date(2014, 6, 2), new Date(2015, 0, 1))\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00, including seconds?\n * const result = formatDistance(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0),\n * { includeSeconds: true }\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * const result = formatDistance(new Date(2015, 0, 1), new Date(2016, 0, 1), {\n * addSuffix: true\n * })\n * //=> 'about 1 year ago'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = formatDistance(new Date(2016, 7, 1), new Date(2015, 0, 1), {\n * locale: eoLocale\n * })\n * //=> 'pli ol 1 jaro'\n */\n\nexport function formatDistance(date, baseDate, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n const minutesInAlmostTwoDays = 2520;\n\n const comparison = compareAsc(date, baseDate);\n\n if (isNaN(comparison)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n const localizeOptions = Object.assign({}, options, {\n addSuffix: options?.addSuffix,\n comparison: comparison,\n });\n\n let dateLeft;\n let dateRight;\n if (comparison > 0) {\n dateLeft = toDate(baseDate);\n dateRight = toDate(date);\n } else {\n dateLeft = toDate(date);\n dateRight = toDate(baseDate);\n }\n\n const seconds = differenceInSeconds(dateRight, dateLeft);\n const offsetInSeconds =\n (getTimezoneOffsetInMilliseconds(dateRight) -\n getTimezoneOffsetInMilliseconds(dateLeft)) /\n 1000;\n const minutes = Math.round((seconds - offsetInSeconds) / 60);\n let months;\n\n // 0 up to 2 mins\n if (minutes < 2) {\n if (options?.includeSeconds) {\n if (seconds < 5) {\n return locale.formatDistance(\"lessThanXSeconds\", 5, localizeOptions);\n } else if (seconds < 10) {\n return locale.formatDistance(\"lessThanXSeconds\", 10, localizeOptions);\n } else if (seconds < 20) {\n return locale.formatDistance(\"lessThanXSeconds\", 20, localizeOptions);\n } else if (seconds < 40) {\n return locale.formatDistance(\"halfAMinute\", 0, localizeOptions);\n } else if (seconds < 60) {\n return locale.formatDistance(\"lessThanXMinutes\", 1, localizeOptions);\n } else {\n return locale.formatDistance(\"xMinutes\", 1, localizeOptions);\n }\n } else {\n if (minutes === 0) {\n return locale.formatDistance(\"lessThanXMinutes\", 1, localizeOptions);\n } else {\n return locale.formatDistance(\"xMinutes\", minutes, localizeOptions);\n }\n }\n\n // 2 mins up to 0.75 hrs\n } else if (minutes < 45) {\n return locale.formatDistance(\"xMinutes\", minutes, localizeOptions);\n\n // 0.75 hrs up to 1.5 hrs\n } else if (minutes < 90) {\n return locale.formatDistance(\"aboutXHours\", 1, localizeOptions);\n\n // 1.5 hrs up to 24 hrs\n } else if (minutes < minutesInDay) {\n const hours = Math.round(minutes / 60);\n return locale.formatDistance(\"aboutXHours\", hours, localizeOptions);\n\n // 1 day up to 1.75 days\n } else if (minutes < minutesInAlmostTwoDays) {\n return locale.formatDistance(\"xDays\", 1, localizeOptions);\n\n // 1.75 days up to 30 days\n } else if (minutes < minutesInMonth) {\n const days = Math.round(minutes / minutesInDay);\n return locale.formatDistance(\"xDays\", days, localizeOptions);\n\n // 1 month up to 2 months\n } else if (minutes < minutesInMonth * 2) {\n months = Math.round(minutes / minutesInMonth);\n return locale.formatDistance(\"aboutXMonths\", months, localizeOptions);\n }\n\n months = differenceInMonths(dateRight, dateLeft);\n\n // 2 months up to 12 months\n if (months < 12) {\n const nearestMonth = Math.round(minutes / minutesInMonth);\n return locale.formatDistance(\"xMonths\", nearestMonth, localizeOptions);\n\n // 1 year up to max Date\n } else {\n const monthsSinceStartOfYear = months % 12;\n const years = Math.trunc(months / 12);\n\n // N years up to 1 years 3 months\n if (monthsSinceStartOfYear < 3) {\n return locale.formatDistance(\"aboutXYears\", years, localizeOptions);\n\n // N years 3 months up to N years 9 months\n } else if (monthsSinceStartOfYear < 9) {\n return locale.formatDistance(\"overXYears\", years, localizeOptions);\n\n // N years 9 months up to N year 12 months\n } else {\n return locale.formatDistance(\"almostXYears\", years + 1, localizeOptions);\n }\n }\n}\n\n// Fallback for modularized imports:\nexport default formatDistance;\n","import { formatDistance } from \"./formatDistance.mjs\";\n\n/**\n * The {@link formatDistanceToNow} function options.\n */\n\n/**\n * @name formatDistanceToNow\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n * @pure false\n *\n * @description\n * Return the distance between the given date and now in words.\n *\n * | Distance to now | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance to now | Result |\n * |---------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n * @param options - The object with options\n *\n * @returns The distance in words\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `formatDistance` property\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * const result = formatDistanceToNow(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * const result = formatDistanceToNow(\n * new Date(2015, 0, 1, 0, 0, 15),\n * {includeSeconds: true}\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * const result = formatDistanceToNow(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in about 1 year'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * const eoLocale = require('date-fns/locale/eo')\n * const result = formatDistanceToNow(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> 'pli ol 1 jaro'\n */\nexport function formatDistanceToNow(date, options) {\n return formatDistance(date, Date.now(), options);\n}\n\n// Fallback for modularized imports:\nexport default formatDistanceToNow;\n","import { css } from '@emotion/css';\nimport { formatDistanceToNow } from 'date-fns';\nimport React, { ReactNode } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Card, Checkbox, useTheme2 } from '@grafana/ui';\n\nexport type AlertVariant = 'success' | 'warning' | 'error' | 'info';\n\nexport interface Props {\n children?: ReactNode;\n className?: string;\n isSelected: boolean;\n onClick: () => void;\n severity?: AlertVariant;\n title: string;\n timestamp?: number;\n traceId?: string;\n}\n\nexport const StoredNotificationItem = ({\n children,\n className,\n isSelected,\n onClick,\n severity = 'error',\n title,\n traceId,\n timestamp,\n}: Props) => {\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n \n {title}\n {children}\n \n \n \n \n {traceId && {`Trace ID: ${traceId}`}}\n {timestamp && formatDistanceToNow(timestamp, { addSuffix: true })}\n \n \n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n trace: css({\n alignItems: 'flex-end',\n alignSelf: 'flex-end',\n color: theme.colors.text.secondary,\n display: 'flex',\n flexDirection: 'column',\n fontSize: theme.typography.pxToRem(10),\n justifySelf: 'flex-end',\n }),\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { useRef, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Alert, Button, Checkbox, Icon, useStyles2 } from '@grafana/ui';\nimport { StoredNotificationItem } from 'app/core/components/AppNotifications/StoredNotificationItem';\nimport {\n clearAllNotifications,\n clearNotification,\n readAllNotifications,\n selectWarningsAndErrors,\n selectLastReadTimestamp,\n} from 'app/core/reducers/appNotification';\nimport { useDispatch, useSelector } from 'app/types';\n\nexport function StoredNotifications() {\n const dispatch = useDispatch();\n const notifications = useSelector((state) => selectWarningsAndErrors(state.appNotifications));\n const [selectedNotificationIds, setSelectedNotificationIds] = useState([]);\n const allNotificationsSelected = notifications.every((notification) =>\n selectedNotificationIds.includes(notification.id)\n );\n const lastReadTimestamp = useRef(useSelector((state) => selectLastReadTimestamp(state.appNotifications)));\n const styles = useStyles2(getStyles);\n\n useEffectOnce(() => {\n dispatch(readAllNotifications(Date.now()));\n });\n\n const clearSelectedNotifications = () => {\n if (allNotificationsSelected) {\n dispatch(clearAllNotifications());\n } else {\n selectedNotificationIds.forEach((id) => {\n dispatch(clearNotification(id));\n });\n }\n setSelectedNotificationIds([]);\n };\n\n const handleAllCheckboxToggle = (isChecked: boolean) => {\n setSelectedNotificationIds(isChecked ? notifications.map((n) => n.id) : []);\n };\n\n const handleCheckboxToggle = (id: string) => {\n setSelectedNotificationIds((prevState) => {\n if (!prevState.includes(id)) {\n return [...prevState, id];\n } else {\n return prevState.filter((notificationId) => notificationId !== id);\n }\n });\n };\n\n if (notifications.length === 0) {\n return (\n
\n \n Notifications you have received will appear here.\n
\n );\n }\n\n return (\n
\n \n
\n ) => handleAllCheckboxToggle(event.target.checked)}\n />\n \n
\n
    \n {notifications.map((notif) => (\n
  • \n lastReadTimestamp.current })}\n isSelected={selectedNotificationIds.includes(notif.id)}\n onClick={() => handleCheckboxToggle(notif.id)}\n severity={notif.severity}\n title={notif.title}\n timestamp={notif.timestamp}\n traceId={notif.traceId}\n >\n {notif.text}\n \n
  • \n ))}\n
\n
\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n topRow: css({\n alignItems: 'center',\n display: 'flex',\n gap: theme.spacing(2),\n }),\n list: css({\n display: 'flex',\n flexDirection: 'column',\n }),\n listItem: css({\n alignItems: 'center',\n display: 'flex',\n gap: theme.spacing(2),\n listStyle: 'none',\n position: 'relative',\n }),\n newItem: css({\n '&::before': {\n content: '\"\"',\n height: '100%',\n position: 'absolute',\n left: '-7px',\n top: 0,\n background: theme.colors.gradients.brandVertical,\n width: theme.spacing(0.5),\n borderRadius: theme.shape.radius.default,\n },\n }),\n noNotifsWrapper: css({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: theme.spacing(1),\n }),\n wrapper: css({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n }),\n };\n}\n","import React from 'react';\n\nimport { Page } from 'app/core/components/Page/Page';\n\nimport { StoredNotifications } from './StoredNotifications';\n\nexport const NotificationsPage = () => {\n return (\n \n \n \n \n \n );\n};\n\nexport default NotificationsPage;\n"],"names":["formatDistance","date","baseDate","options","defaultOptions","locale","minutesInAlmostTwoDays","comparison","compareAsc","localizeOptions","dateLeft","dateRight","toDate","seconds","differenceInSeconds","offsetInSeconds","getTimezoneOffsetInMilliseconds","minutes","months","hours","days","differenceInMonths","nearestMonth","monthsSinceStartOfYear","years","formatDistanceToNow","StoredNotificationItem","children","className","isSelected","onClick","severity","title","traceId","timestamp","theme","styles","getStyles","Card","Checkbox","StoredNotifications","dispatch","notifications","state","selectedNotificationIds","setSelectedNotificationIds","allNotificationsSelected","notification","lastReadTimestamp","useEffectOnce","clearSelectedNotifications","id","handleAllCheckboxToggle","isChecked","n","handleCheckboxToggle","prevState","notificationId","Icon","Alert","event","Button","notif","NotificationsPage","Page"],"sourceRoot":""}