GrafanaUI: Fix iconPlacement prop not being respected in LinkButton (#113708)

fix: iconPlacement now respected in LinkButton. Added tests.
This commit is contained in:
Chris Bedwell
2025-11-12 08:53:04 +00:00
committed by GitHub
parent 76ab09a6a2
commit 6401901e5d
2 changed files with 40 additions and 2 deletions
@@ -1,7 +1,7 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { Button } from './Button';
import { Button, LinkButton } from './Button';
const setup = (jsx: JSX.Element) => {
return {
@@ -64,3 +64,37 @@ describe('Button', () => {
expect(screen.getByRole('button', { name: 'Aria label' })).toBeInTheDocument();
});
});
describe('LinkButton', () => {
it('should place the icon on the right when iconPlacement is "right"', () => {
setup(
<LinkButton icon="cloud" iconPlacement="right" href="https://grafana.com">
Click me
</LinkButton>
);
const link = screen.getByRole('link');
const icon = screen.getByTitle('');
const textSpan = link.querySelector('span');
// Assert that the text span comes before the icon in the DOM
expect(link.childNodes[0]).toBe(textSpan);
expect(link.childNodes[1]).toBe(icon);
});
it('should place the icon on the left when iconPlacement is "left"', () => {
setup(
<LinkButton icon="cloud" iconPlacement="left" href="https://grafana.com">
Click me
</LinkButton>
);
const link = screen.getByRole('link');
const icon = screen.getByTitle('');
const textSpan = link.querySelector('span');
// Assert that the icon comes before the text span in the DOM
expect(link.childNodes[0]).toBe(icon);
expect(link.childNodes[1]).toBe(textSpan);
});
});
@@ -142,6 +142,7 @@ export const LinkButton = React.forwardRef<HTMLAnchorElement, ButtonLinkProps>(
size = 'md',
fill = 'solid',
icon,
iconPlacement = 'left',
fullWidth,
children,
className,
@@ -174,6 +175,8 @@ export const LinkButton = React.forwardRef<HTMLAnchorElement, ButtonLinkProps>(
className
);
const iconComponent = icon && <IconRenderer icon={icon} size={size} className={styles.icon} />;
// When using tooltip, ref is forwarded to Tooltip component instead for https://github.com/grafana/grafana/issues/65632
const button = (
<a
@@ -184,8 +187,9 @@ export const LinkButton = React.forwardRef<HTMLAnchorElement, ButtonLinkProps>(
ref={tooltip ? undefined : ref}
aria-label={ariaLabel ?? (!children && typeof tooltip === 'string' ? tooltip : undefined)}
>
<IconRenderer icon={icon} size={size} className={styles.icon} />
{iconPlacement === 'left' && iconComponent}
{children && <span className={styles.content}>{children}</span>}
{iconPlacement === 'right' && iconComponent}
</a>
);