Storybook: update Alert story (#63959)

This commit is contained in:
Laura Fernández 2023-03-30 18:11:30 +02:00 committed by GitHub
parent 15b76808b7
commit ce1298c947
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 284 additions and 226 deletions

View File

@ -6230,12 +6230,6 @@ exports[`no undocumented stories`] = {
"packages/grafana-ui/src/components/ColorPicker/ColorPickerPopover.story.tsx:5381": [
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
],
"packages/grafana-ui/src/components/ColorPicker/NamedColorsPalette.story.tsx:5381": [
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
],
"packages/grafana-ui/src/components/ColorPicker/SpectrumPalette.story.tsx:5381": [
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
],
"packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.story.tsx:5381": [
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
],
@ -6269,10 +6263,13 @@ exports[`no undocumented stories`] = {
"packages/grafana-ui/src/components/Segment/SegmentInput.story.tsx:5381": [
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
],
"packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx:5381": [
"packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx:5381": [
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
],
"packages/grafana-ui/src/components/Tabs/Tabs.story.tsx:5381": [
"packages/grafana-ui/src/components/Slider/Slider.story.tsx:5381": [
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
],
"packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx:5381": [
[0, 0, 0, "No undocumented stories are allowed, please add an .mdx file with some documentation", "5381"]
],
"packages/grafana-ui/src/components/ThemeDemos/ThemeDemo.story.tsx:5381": [

View File

@ -1,6 +1,6 @@
import { BettererFileTest } from '@betterer/betterer';
import { promises as fs } from 'fs';
import { ESLint, Linter } from 'eslint';
import { existsSync } from 'fs';
import path from 'path';
import glob from 'glob';
@ -14,14 +14,19 @@ export default {
function countUndocumentedStories() {
return new BettererFileTest(async (filePaths, fileTestResult) => {
filePaths.forEach((filePath) => {
if (!existsSync(filePath.replace(/\.story.tsx$/, '.mdx'))) {
// In this case the file contents don't matter:
const file = fileTestResult.addFile(filePath, '');
// Add the issue to the first character of the file:
file.addIssue(0, 0, 'No undocumented stories are allowed, please add an .mdx file with some documentation');
}
});
await Promise.all(
filePaths.map(async (filePath) => {
// look for .mdx import in the story file
const regex = new RegExp("^import.*.mdx';$", 'gm');
const fileText = await fs.readFile(filePath, 'utf8');
if (!regex.test(fileText)) {
// In this case the file contents don't matter:
const file = fileTestResult.addFile(filePath, '');
// Add the issue to the first character of the file:
file.addIssue(0, 0, 'No undocumented stories are allowed, please add an .mdx file with some documentation');
}
})
);
});
}

View File

@ -1,4 +1,4 @@
import { Meta, Props } from '@storybook/addon-docs/blocks';
import { Meta, Props, ArgsTable } from '@storybook/addon-docs/blocks';
import { Alert } from './Alert';
<Meta title="MDX|Alert" component={Alert} />
@ -6,12 +6,153 @@ import { Alert } from './Alert';
# Alert
An alert displays an important message in a way that attracts the user's attention without interrupting the user's task.
`onRemove` handler can be used to enable manually dismissing the alert.
# Usage
---
About Alert component:
1. [Behaviors](#behaviors)
2. [Types](#types)
3. [Message type](#message-type)
4. [Main elements](#main-elements)
5. [Usage:](#usage)\
5.1. [Inline banner](#alert-inline)\
5.2. [Toast](#alert-toast)
<br />
<br />
<br />
## <a name="behaviors" /> Behaviors
1. **Persistent**: They are usually urgent and intrusive, require immediate attention and require action to be dismissed.
2. **Passive**: Are informational, report a system issue that does not require any action by users.
<br />
## <a name="types"/>Types
Within Grafana, we have two different types of alerts and they can be used depending on the context and content.
1. **[Inline banner](#alert-inline)**:
- To notify users of the status of an action. They appear at the top or bottom of the main content area
- Passive or Persistent
1. **[Toast](#alert-toast)**:
- These temporary window elements are used to display short messages; they appear at the top-right corner of the screen and can be dismissed by clicking the [x] or it will disappear after a few seconds
- Passive
<br />
## <a name="message-type"/>Message Type
1. **Informational**
- To provide information to users, and dont interrupt any current actions
- Does not require immediate action and can be dismissed by a user clicking the [X] or passively display until the display timer expires
- Shows blue color on the background and uses the `info-circle` icon
2. **Success**
- To confirm a task is completed as expected or an action is successful.
- Typically does not require further action and can be dismissed automatically or persist in a nonintrusive manner
- Shows green color on the background and uses the `check` icon
3. **Warning**
- To inform users that an action is undesirable
- Often persists until users have taken action to dismiss the notification or taken steps to resolve the issue
- Shows yellow color on background and uses the `exclamation-triangle` icon
4. **Error**
- To inform that an action hasn't happened as expected, usually something has failed and the user is expected to take action
- Always persists until the user has taken steps to remedy the issue that triggered the notification
- Shows red color on background and uses the `exclamation-triangle` icon
<br />
## <a name="main-elements"/>Main elements
- Icon status: represents the importance of the message through the color and icon for each status.
- Alert title: should be explicit, clear and short, conveying the most important part of the information.
- Details: precise description for the notification, telling users what they need to do.
- Button and text links: only persistent notifications should contain text links or buttons.
- Close icon: appears when the notification can be dismissed by the user.
<br />
## <a name="usage"/>Usage
<br />
### <a name="alert-inline" /> Inline Banner
Inline Banners are task-oriented alerts that notify users of the status of an action or system. These alerts are contextual — appearing above or below main content areas — allowing users to address issues or to read messages quickly.
#### Do's
- Use the appropriate status for the message (info/success/warning/error).
- Use plain, simple language for the messages to ensure users understand them and know how to address them.
- Focus on notifications if they are relevant to the users' current workflow and should be addressed immediately.
#### Don'ts
- Do not use Primary calls to actions.
- Do not hide other content with inline notifications.
- Do not repeat the alert copy/title on the details message.
#### When to use
- To inform at that time how to continue a task in which users must perform an action.
- To provide some options for users to take action.
- To explain in detail the reasons why something cant be done by users.
#### Placement
- Should be placed immediately above or below the related element.
```jsx
<Alert title="Some very important message" severity="info" />
<Alert title={title} severity={severity} buttonContent={buttonContent} onRemove={onRemove}>
<VerticalGroup>
<div>Child content that includes some alert details, like maybe what actually happened.</div>
</VerticalGroup>
</Alert>
```
<Props of={Alert} />
### <a name="alert-toast"/>Toast
Toast notifications are short messages that appear in the top-right corner of the page and are automatically hidden after a certain amount of time they provide live notifications, without interrupting the user experience or requiring an action to be taken.
#### Do's
- Use this component using `AppEvents` and `getAppEvents()`.
- Show the `Toast` publishing the `appEvent` with the proper type and payload needed.
```jsx
import { AppEvents } from '@grafana/data';
import { getAppEvents } from '@grafana/runtime';
const appEvents = getAppEvents();
appEvents.publish({
type: AppEvents.alertSuccess.name,
payload: [text + ': ' + resp.status + ' (' + resp.statusText + ')'],
});
```
#### Don'ts
- Do not use this component directly. Instead, emit the `appEvent` to trigger it's appearance.
#### When to use
- To convey general confirmation or non-critical actions.
- Immediately after an event is taken, such as a permission is updated or some Dashboards are imported or deleted.
- Status according to use cases:
- *Success*: When any action is successful, it is confirmed when a task is completed as expected.
- *Warning*: It is used to report a current status that users should be aware of or that could have serious consequences.
- *Error*: Inform users of an error, and sometimes provide more information about how to fix the error.
#### Placement
- Slide in and out from the top right corner of the page.
```jsx
<Alert title={title} severity={severity} onRemove={onRemove} elevated>
<VerticalGroup>
<div>Child content that includes some alert details, like maybe what actually happened.</div>
</VerticalGroup>
</Alert>
```
<ArgsTable of={Alert} />

View File

@ -1,192 +0,0 @@
import { action } from '@storybook/addon-actions';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import React from 'react';
import { Alert, AlertVariant, VerticalGroup } from '@grafana/ui';
import { StoryExample } from '../../utils/storybook/StoryExample';
import { withCenteredStory, withHorizontallyCenteredStory } from '../../utils/storybook/withCenteredStory';
import mdx from '../Alert/Alert.mdx';
const severities: AlertVariant[] = ['error', 'warning', 'info', 'success'];
const meta: ComponentMeta<typeof Alert> = {
title: 'Overlays/Alert',
component: Alert,
decorators: [withCenteredStory, withHorizontallyCenteredStory],
parameters: {
docs: {
page: mdx,
},
knobs: {
disable: true,
},
controls: {
exclude: ['onRemove'],
},
},
argTypes: {
severity: { control: { type: 'select', options: severities } },
},
};
export const Examples: ComponentStory<typeof Alert> = ({ severity, title, buttonContent }) => {
return (
<VerticalGroup>
<StoryExample name="With buttonContent and children">
<Alert
title={title}
severity={severity}
buttonContent={<span>{buttonContent}</span>}
onRemove={action('Remove button clicked')}
>
<VerticalGroup>
<div>Child content that includes some alert details, like maybe what actually happened.</div>
</VerticalGroup>
</Alert>
</StoryExample>
<StoryExample name="No dismiss">
<Alert title={title} severity={severity} />
</StoryExample>
<StoryExample name="Elevated alert used for absolute positioned alerts">
<Alert title={title} severity={severity} elevated />
</StoryExample>
<StoryExample name="Severities">
<VerticalGroup>
{severities.map((severity) => (
<Alert
title={`Severity: ${severity}`}
severity={severity}
key={severity}
onRemove={action('Remove button clicked')}
/>
))}
</VerticalGroup>
</StoryExample>
<StoryExample name="With huge payload">
<Alert title={title} severity={severity}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam metus urna, aliquam eu scelerisque non,
facilisis eget est. Morbi eleifend egestas massa id vulputate. Fusce dignissim magna lacus, ut molestie odio
feugiat sed. Cras fringilla justo sit amet turpis scelerisque, a volutpat purus iaculis. Nunc sagittis
molestie faucibus. Curabitur at neque luctus, pellentesque urna eget, posuere urna. Nunc malesuada elit in
ipsum dictum egestas. Praesent convallis mauris massa, porta mattis ex gravida ut. Proin consectetur ultrices
tortor sit amet efficitur. Suspendisse nec turpis dapibus mauris venenatis maximus quis eget orci. Ut semper
enim magna, ullamcorper elementum sapien pharetra vitae. Vivamus at nulla ut metus bibendum ornare et ut leo.
Proin ante turpis, ornare a malesuada et, rutrum nec lorem. Maecenas vestibulum orci vel nibh convallis
eleifend. Quisque vitae consectetur massa, vitae elementum mauris. Pellentesque sit amet ligula lorem. Fusce
sit amet lorem non augue rutrum varius. Donec sed imperdiet libero, eget venenatis elit. Fusce porttitor
dapibus urna. Duis fringilla ante vel tempor tincidunt. In euismod vestibulum odio sit amet iaculis. Donec vel
dapibus libero. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lacinia commodo lectus. Aenean
in magna eget lectus luctus suscipit et vitae erat. Pellentesque quis ligula id lorem egestas sollicitudin sit
amet sed sem. Nullam et nibh a odio rhoncus efficitur sed nec est. Sed commodo lacus vitae sem congue,
accumsan dignissim metus iaculis. Praesent in dignissim nisl. Aliquam facilisis, sapien eget porttitor
ultrices, massa libero bibendum odio, at ornare diam arcu ac massa. Vestibulum egestas leo eget lorem congue
condimentum. Praesent egestas, neque id gravida vehicula, augue ex scelerisque lectus, finibus pellentesque
enim dolor vel ante. Cras convallis, sem at malesuada tincidunt, diam urna auctor leo, sed laoreet est ex in
libero. Ut condimentum ante eget ex gravida, id tempus metus ultricies. Pellentesque placerat, massa id
laoreet molestie, justo nisl varius metus, maximus vehicula erat libero vitae nulla. Mauris rhoncus ligula
vitae volutpat auctor. Suspendisse potenti. Quisque quis orci faucibus, ullamcorper dolor eget, mollis massa.
Etiam eu molestie ipsum. Sed laoreet diam metus, luctus maximus erat viverra quis. Ut eu felis dictum,
tincidunt erat sit amet, scelerisque neque. Orci varius natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Phasellus sit amet est tristique, fermentum massa ut, viverra metus. Interdum et
malesuada fames ac ante ipsum primis in faucibus. Nunc iaculis nunc elit, ut feugiat ipsum egestas eget.
Vestibulum pulvinar ligula mi, quis lacinia diam suscipit eget. Etiam consectetur vel nunc at hendrerit.
Pellentesque blandit eleifend aliquam. Etiam et malesuada purus, et bibendum sapien. Phasellus tincidunt
consequat eros consequat sodales. Vestibulum quis viverra neque. Integer sit amet lacinia nunc. Ut cursus,
elit id faucibus elementum, elit nunc dapibus tellus, non ornare nisi sapien et eros. Nunc sit amet suscipit
arcu. Nulla ut nunc tempor, auctor massa sed, consectetur orci. Pellentesque erat ante, placerat eget dictum
elementum, dapibus et ipsum. Nunc sit amet nulla gravida, finibus felis vel, tempus sem. In urna purus,
accumsan quis aliquam et, condimentum ac urna. Nullam volutpat ullamcorper sapien, quis ultricies purus
dignissim aliquam. Mauris quis enim ante. Etiam vulputate faucibus placerat. Ut pellentesque, purus vitae
euismod cursus, lacus enim vulputate sapien, in porttitor erat dui eu lectus. Duis eleifend, massa vel
vehicula gravida, magna urna rutrum ligula, vitae mollis ipsum neque id enim. Donec varius tristique nisi, et
vestibulum dolor efficitur eget. Cras mauris leo, bibendum eget pretium a, tincidunt faucibus massa.
Vestibulum hendrerit arcu magna, vel consequat est euismod nec. Vestibulum non lacus porttitor, congue tortor
ut, venenatis elit. Duis at lectus arcu. Nunc quis sapien eu ipsum rutrum accumsan. Orci varius natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus quis sapien luctus, volutpat nulla
eget, gravida nunc. Aenean placerat a felis quis imperdiet. Sed sapien tellus, ultrices non ipsum eget,
pretium rhoncus quam. Aliquam erat volutpat. Maecenas at interdum turpis, eu mattis ligula. Class aptent
taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In lobortis felis a leo
ultricies, venenatis mollis felis lobortis. Suspendisse placerat vel ante vel euismod. Aenean sit amet
ullamcorper mauris, id consectetur est. Ut ultricies enim non quam condimentum, et congue arcu commodo.
Praesent convallis eleifend turpis, vitae feugiat turpis imperdiet sit amet. Class aptent taciti sociosqu ad
litora torquent per conubia nostra, per inceptos himenaeos. Quisque vulputate porttitor mattis. Pellentesque
sed ullamcorper lectus. Suspendisse velit tortor, viverra eget facilisis condimentum, accumsan sit amet felis.
Cras lobortis mi fermentum ligula consectetur, vitae tincidunt mauris scelerisque. Aenean ac condimentum erat,
quis lacinia lacus. Ut magna nibh, tempor et ligula suscipit, placerat laoreet ipsum. In semper semper nisl.
Donec risus lorem, tempor sed sollicitudin vitae, fringilla et mi. Vivamus pulvinar quam nisl, et tincidunt
justo tempus quis. Duis semper magna nunc, vitae faucibus lectus facilisis sed. Phasellus consequat arcu vel
interdum fermentum. In condimentum euismod neque, sed aliquet mauris posuere nec. Etiam metus eros,
pellentesque eget scelerisque id, porttitor at ligula. Curabitur eget nibh maximus enim lobortis sodales.
Etiam vulputate ligula lobortis vestibulum pulvinar. Curabitur eros justo, accumsan sed elit ac, mattis
lacinia nisi. Suspendisse ullamcorper lectus sit amet tellus condimentum porttitor. Duis cursus, neque et
aliquam congue, odio lectus porta elit, id lacinia dolor justo non leo. Aliquam vehicula at tellus ullamcorper
tincidunt. Phasellus neque nibh, convallis sit amet arcu sit amet, convallis egestas tortor. Etiam sit amet
vehicula quam. Praesent id consequat lacus, ac facilisis quam. Integer tristique lorem eros, id consequat
lorem lobortis vitae. Aliquam luctus purus eget sem molestie iaculis. Duis nisl risus, sodales sit amet nunc
vitae, volutpat cursus augue. Pellentesque congue massa eu metus pellentesque consectetur at vel neque. Donec
bibendum hendrerit erat, vitae dictum enim lobortis a. Quisque ac dapibus tellus, sit amet facilisis orci.
Cras pretium tortor non condimentum semper. Phasellus mollis condimentum blandit. Pellentesque at arcu risus.
Vivamus sit amet dui semper, suscipit est nec, elementum arcu. Praesent ante turpis, convallis ac leo eget,
rutrum bibendum ante. Sed venenatis vehicula lobortis. Phasellus consectetur velit nec congue venenatis.
Interdum et malesuada fames ac ante ipsum primis in faucibus. Nullam sagittis, arcu quis sagittis vestibulum,
odio lorem tempus massa, non condimentum enim turpis ut orci. Vivamus sit amet dignissim eros. Vestibulum ante
ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Phasellus efficitur est eu semper
luctus. Nunc gravida tristique urna, et mollis leo porttitor suscipit. In hac habitasse platea dictumst. Etiam
tempus varius mattis. Suspendisse potenti. Duis finibus ornare tortor, a auctor lacus dictum id. Suspendisse
eget auctor lorem, sollicitudin placerat ipsum. Aliquam suscipit ante at gravida tincidunt. Donec vel turpis
dui. Ut facilisis, dui id fermentum ultrices, nunc mi pretium ex, eu lobortis sem tellus porttitor nulla. Nam
sit amet mauris justo. Maecenas libero est, dignissim vel dolor ac, rutrum accumsan tellus. Nulla in lacinia
orci, facilisis feugiat mi. Nunc sit amet ultricies dolor. Sed ac interdum lacus. Quisque facilisis viverra
orci vel tincidunt. Suspendisse feugiat ligula non justo molestie viverra. Cras sed ultricies quam. Duis
aliquam ante lacus, non posuere neque pretium id. Fusce at orci facilisis, pretium justo eu, vestibulum sem.
Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis at lorem ultrices,
tincidunt nulla ac, molestie ligula. Phasellus erat nunc, consectetur ut velit vel, porta fringilla ante.
Vestibulum laoreet lorem erat, ultricies porta ex venenatis vel. Donec vestibulum enim id suscipit
pellentesque. Donec vitae dictum arcu. In ac tellus dignissim, imperdiet tellus quis, malesuada nisl. Aliquam
finibus urna commodo purus ultricies, non vulputate risus ullamcorper. Cras semper ultrices posuere. Etiam
massa nisi, vehicula sit amet volutpat sit amet, commodo vel mi. Maecenas commodo consectetur ipsum nec
ultrices. Sed hendrerit quam nulla, ut tincidunt tortor commodo eget. Vestibulum euismod condimentum
porttitor. Mauris egestas posuere justo ac suscipit. Nulla auctor tellus nec eros rhoncus, a congue odio
accumsan. Phasellus tempus risus ut orci commodo, sed lobortis ex porta. Nullam ligula erat, pretium ut nibh
volutpat, tincidunt pellentesque purus. Vivamus cursus eget nisi id ornare. Phasellus ut aliquet turpis.
Vestibulum ornare ex eros, quis accumsan neque porta id. Pellentesque eleifend, tortor eget dignissim
convallis, nisl felis fringilla dolor, dapibus bibendum mauris lacus dignissim metus. Cras cursus faucibus
condimentum. Curabitur non libero risus. Morbi nisi augue, aliquam quis neque sit amet, commodo ullamcorper
justo. Aenean pulvinar accumsan nibh, vel bibendum turpis rutrum vitae. Donec condimentum justo vel luctus
consectetur. Donec id nisl eu erat sollicitudin venenatis at eget justo. Mauris ac nulla laoreet, semper
tortor sed, egestas odio. Fusce ex ligula, aliquet sed tortor sit amet, porta malesuada libero. Aenean varius
tellus in enim fringilla tristique. Duis risus diam, condimentum ac ornare sed, imperdiet non lectus. Mauris
auctor condimentum pulvinar. Pellentesque dapibus ultricies neque eu egestas. Phasellus molestie volutpat
tincidunt. Aenean tristique felis aliquam consectetur fringilla. Pellentesque a mauris nibh. Maecenas commodo
dignissim sem, eget laoreet purus laoreet eu. Sed arcu mi, facilisis quis finibus ac, pulvinar ut sem. Nulla
facilisi. Maecenas in elit diam. Vivamus aliquam enim eget enim condimentum fermentum. Sed convallis tellus
nisl, eget congue diam hendrerit et. Nulla posuere, sem non condimentum aliquet, leo arcu scelerisque leo, sit
amet maximus ante massa in odio. Nunc dictum nibh ac dui luctus, sit amet tempor massa imperdiet. Nunc dictum
ligula augue, a auctor odio rutrum a. Cras auctor, mi vitae maximus dictum, purus mauris ornare libero, ac
consequat mauris diam sit amet mauris. In egestas eu felis ut volutpat. Etiam dignissim justo vitae sagittis
venenatis. Vestibulum fermentum lectus nisl, vitae tempor ipsum lobortis nec. Nam porttitor est vel libero
mollis, vel accumsan nisi iaculis. Suspendisse interdum consequat sapien, quis aliquam leo condimentum ut. In
ut risus sit amet quam viverra facilisis. Mauris dapibus tortor id purus egestas mollis. Quisque vitae ornare
ex. Vivamus non accumsan lectus. Mauris at iaculis ex. Curabitur rutrum magna nibh, eu accumsan felis
tristique in. Donec in fringilla orci. Quisque ante dolor, tempor vitae lacinia non, malesuada at dui. Ut
tincidunt bibendum magna vitae ornare. Suspendisse a ipsum ut nulla ornare pretium. Donec malesuada rhoncus
facilisis. Integer nulla mi, sagittis vel purus non, viverra sodales lectus. Pellentesque habitant morbi
tristique senectus et netus et malesuada fames ac turpis egestas. Aenean tristique turpis neque, nec elementum
ipsum condimentum tempor. Pellentesque mauris magna, venenatis ac sodales et, fermentum sed nunc. Pellentesque
dignissim lacinia suscipit. Pellentesque mollis tellus justo, eu facilisis neque tempor a. Aenean id metus
gravida, consectetur ligula eget, tincidunt sapien. Morbi in tellus id ex vestibulum sagittis sed vitae risus.
In vehicula sed arcu auctor ullamcorper. Etiam elementum mollis fringilla.
</Alert>
</StoryExample>
</VerticalGroup>
);
};
Examples.args = {
severity: 'error',
title: 'Some very important message',
buttonContent: 'Close',
};
export default meta;

View File

@ -24,18 +24,6 @@ export interface Props extends HTMLAttributes<HTMLDivElement> {
topSpacing?: number;
}
export function getIconFromSeverity(severity: AlertVariant): IconName {
switch (severity) {
case 'error':
case 'warning':
return 'exclamation-triangle';
case 'info':
return 'info-circle';
case 'success':
return 'check';
}
}
export const Alert = React.forwardRef<HTMLDivElement, Props>(
(
{
@ -103,6 +91,18 @@ export const Alert = React.forwardRef<HTMLDivElement, Props>(
Alert.displayName = 'Alert';
export const getIconFromSeverity = (severity: AlertVariant): IconName => {
switch (severity) {
case 'error':
case 'warning':
return 'exclamation-triangle';
case 'info':
return 'info-circle';
case 'success':
return 'check';
}
};
const getStyles = (
theme: GrafanaTheme2,
severity: AlertVariant,

View File

@ -0,0 +1,63 @@
import { action } from '@storybook/addon-actions';
import { ComponentStory, Meta } from '@storybook/react';
import React from 'react';
import { Alert, AlertVariant, VerticalGroup } from '@grafana/ui';
import { withCenteredStory, withHorizontallyCenteredStory } from '../../utils/storybook/withCenteredStory';
import mdx from '../Alert/Alert.mdx';
const severities: AlertVariant[] = ['error', 'warning', 'info', 'success'];
const meta: Meta = {
title: 'Overlays/Alert/InlineBanner',
component: Alert,
decorators: [withCenteredStory, withHorizontallyCenteredStory],
parameters: {
docs: {
page: mdx,
},
controls: { exclude: ['onRemove'] },
},
argTypes: {
severity: {
control: { type: 'select', options: severities },
},
},
};
export const Basic: ComponentStory<typeof Alert> = (args) => {
return (
<div>
<Alert {...args}>
<VerticalGroup>
<div>Child content that includes some alert details, like maybe what actually happened.</div>
</VerticalGroup>
</Alert>
</div>
);
};
Basic.args = {
severity: 'error',
title: 'Basic',
};
export const WithActions: ComponentStory<typeof Alert> = (args) => {
return (
<Alert {...args}>
<VerticalGroup>
<div>Child content that includes some alert details, like maybe what actually happened.</div>
</VerticalGroup>
</Alert>
);
};
WithActions.args = {
title: 'With action',
severity: 'error',
onRemove: action('Remove button clicked'),
buttonContent: 'Close',
};
export default meta;

View File

@ -0,0 +1,44 @@
import { action } from '@storybook/addon-actions';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import React from 'react';
import { Alert, AlertVariant, VerticalGroup } from '@grafana/ui';
import { withCenteredStory, withHorizontallyCenteredStory } from '../../utils/storybook/withCenteredStory';
import mdx from '../Alert/Alert.mdx';
const severities: AlertVariant[] = ['error', 'warning', 'info', 'success'];
const meta: ComponentMeta<typeof Alert> = {
title: 'Overlays/Alert/Toast',
component: Alert,
decorators: [withCenteredStory, withHorizontallyCenteredStory],
parameters: {
docs: {
page: mdx,
},
controls: { exclude: ['onRemove'] },
},
argTypes: {
severity: { control: { type: 'select', options: severities } },
},
args: {
title: 'Toast',
severity: 'error',
onRemove: action('Remove button clicked'),
},
};
export const Toast: ComponentStory<typeof Alert> = (args) => {
return (
<div className="page-alert-list">
<Alert {...args} elevated>
<VerticalGroup>
<div>Child content that includes some alert details, like maybe what actually happened.</div>
</VerticalGroup>
</Alert>
</div>
);
};
export default meta;