fix(ui-components): make Alert not dismissable (#45291)
This commit is contained in:
@ -7,8 +7,7 @@ const story = {
|
|||||||
component: Alert,
|
component: Alert,
|
||||||
argTypes: {
|
argTypes: {
|
||||||
children: { control: { type: 'text' } },
|
children: { control: { type: 'text' } },
|
||||||
className: { control: { type: 'text' } },
|
className: { control: { type: 'text' } }
|
||||||
dismissLabel: { control: { type: 'text' } }
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -67,12 +66,4 @@ WithHeadingAndParagraphs.args = {
|
|||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Dismissable = Template.bind({});
|
|
||||||
Dismissable.args = {
|
|
||||||
children: 'Hello, Alert!',
|
|
||||||
variant: 'success',
|
|
||||||
dismissLabel: 'Close alert',
|
|
||||||
onDismiss: () => console.log('Close alert!')
|
|
||||||
};
|
|
||||||
|
|
||||||
export default story;
|
export default story;
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
import userEvent from '@testing-library/user-event';
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Alert } from './alert';
|
import { Alert } from './alert';
|
||||||
|
|
||||||
@ -31,41 +30,4 @@ describe('<Alert>', () => {
|
|||||||
|
|
||||||
expect(screen.getByRole('alert')).toHaveClass(expectedClass);
|
expect(screen.getByRole('alert')).toHaveClass(expectedClass);
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`renders a button when "onDismiss" prop is present, and calls "onDismiss" when the button is clicked`, () => {
|
|
||||||
const onDismiss = jest.fn();
|
|
||||||
render(
|
|
||||||
<Alert onDismiss={onDismiss} variant='info'>
|
|
||||||
Hello
|
|
||||||
</Alert>
|
|
||||||
);
|
|
||||||
const closeButton = screen.getByRole('button');
|
|
||||||
|
|
||||||
expect(screen.getByRole('alert')).toBeInTheDocument();
|
|
||||||
expect(closeButton).toBeInTheDocument();
|
|
||||||
|
|
||||||
userEvent.click(closeButton);
|
|
||||||
|
|
||||||
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('does NOT render a close button, when "onDismiss" prop is NOT used', () => {
|
|
||||||
render(<Alert variant='info'>Hello</Alert>);
|
|
||||||
|
|
||||||
expect(screen.getByRole('alert')).toBeInTheDocument();
|
|
||||||
expect(screen.queryByRole('button')).not.toBeInTheDocument();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('sets "aria-label" of close button to "dismissText" prop', () => {
|
|
||||||
const expectedLabel = 'custom dismiss alert message';
|
|
||||||
render(
|
|
||||||
<Alert dismissLabel={expectedLabel} onDismiss={jest.fn()} variant='info'>
|
|
||||||
Hello
|
|
||||||
</Alert>
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
|
||||||
screen.getByRole('button', { name: expectedLabel })
|
|
||||||
).toBeInTheDocument();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { CloseButton } from '../close-button';
|
|
||||||
|
|
||||||
type AlertVariant = 'success' | 'info' | 'warning' | 'danger';
|
type AlertVariant = 'success' | 'info' | 'warning' | 'danger';
|
||||||
|
|
||||||
@ -7,8 +6,6 @@ export interface AlertProps {
|
|||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
className?: string;
|
className?: string;
|
||||||
variant: AlertVariant;
|
variant: AlertVariant;
|
||||||
dismissLabel?: string;
|
|
||||||
onDismiss?: () => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const variantClasses: Record<AlertVariant, string> = {
|
const variantClasses: Record<AlertVariant, string> = {
|
||||||
@ -19,30 +16,26 @@ const variantClasses: Record<AlertVariant, string> = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Basic UI component that provides contextual feedback
|
* `Alert` is used to display a short, important message that does not interrupt the user's workflow.
|
||||||
|
*
|
||||||
|
* `Alert` is not dismissable.
|
||||||
*/
|
*/
|
||||||
export function Alert({
|
export function Alert({
|
||||||
children,
|
children,
|
||||||
className,
|
className,
|
||||||
variant,
|
variant
|
||||||
dismissLabel = 'Close',
|
|
||||||
onDismiss
|
|
||||||
}: AlertProps): JSX.Element {
|
}: AlertProps): JSX.Element {
|
||||||
const isDismissable = !!onDismiss;
|
|
||||||
const variantClass = variantClasses[variant];
|
const variantClass = variantClasses[variant];
|
||||||
|
|
||||||
const classes = [
|
const classes = [
|
||||||
'flex items-start p-4 mb-6 border border-transparent break-words',
|
'p-4 mb-6 border border-transparent break-words',
|
||||||
variantClass,
|
variantClass,
|
||||||
className
|
className
|
||||||
].join(' ');
|
].join(' ');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classes} role='alert'>
|
<div className={classes} role='alert'>
|
||||||
<div className='grow'>{children}</div>
|
{children}
|
||||||
{isDismissable && (
|
|
||||||
<CloseButton label={dismissLabel} onClick={onDismiss} />
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user