mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Add tooltip to instances of IconButton (#68880)
* refactor: tooltip is required * refactor: add tooltips * refactor: add tooltips * refactor: add tooltips * refactor: add tooltips * refactor: add tooltips * refactor: add tooltips * refactor: adjust tests * refactor: apply changes from code review * refactor: adjust component for e2e test * refactor: adjust fallback * refactor: apply changes from code review * refactor: apply changes from code review * refactor: set IconButton default as type=button and remove from use cases * refactor: remove aria-labels when duplicated and type=button from use cases * refactor: clean up * refactor: fix tests * refactor: fix type errors * refactor: remove changes in order in order to add them to a separate PR * refactor: set IconButton default as type=button * refactor: remove tooltip * refactor: apply changes requested in review
This commit is contained in:
@@ -47,7 +47,12 @@ export const AddLibraryPanelWidget = ({ panel, dashboard }: Props) => {
|
||||
<Trans i18nKey="library-panel.add-widget.title">Add panel from panel library</Trans>
|
||||
</span>
|
||||
<div className="flex-grow-1" />
|
||||
<IconButton aria-label="Close 'Add Panel' widget" name="times" onClick={onCancelAddPanel} />
|
||||
<IconButton
|
||||
aria-label="Close 'Add Panel' widget"
|
||||
name="times"
|
||||
onClick={onCancelAddPanel}
|
||||
tooltip="Close widget"
|
||||
/>
|
||||
</div>
|
||||
<LibraryPanelsSearch onClick={onAddLibraryPanel} variant={LibraryPanelsSearchVariant.Tight} showPanelFilter />
|
||||
</div>
|
||||
|
||||
@@ -213,7 +213,7 @@ const AddPanelWidgetHandle = ({ children, onBack, onCancel, styles }: AddPanelWi
|
||||
<div className={cx(styles.headerRow, 'grid-drag-handle')}>
|
||||
{onBack && (
|
||||
<div className={styles.backButton}>
|
||||
<IconButton aria-label="Go back" name="arrow-left" onClick={onBack} size="xl" />
|
||||
<IconButton name="arrow-left" onClick={onBack} size="xl" tooltip="Go back" />
|
||||
</div>
|
||||
)}
|
||||
{!onBack && (
|
||||
@@ -223,7 +223,7 @@ const AddPanelWidgetHandle = ({ children, onBack, onCancel, styles }: AddPanelWi
|
||||
)}
|
||||
{children && <span>{children}</span>}
|
||||
<div className="flex-grow-1" />
|
||||
<IconButton aria-label="Close 'Add Panel' widget" name="times" onClick={onCancel} />
|
||||
<IconButton aria-label="Close 'Add Panel' widget" name="times" onClick={onCancel} tooltip="Close widget" />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -81,11 +81,11 @@ export const AnnotationSettingsList = ({ dashboard, onNew, onEdit }: Props) => {
|
||||
{dataSourceSrv.getInstanceSettings(annotation.datasource)?.name || annotation.datasource?.uid}
|
||||
</td>
|
||||
<td role="gridcell" style={{ width: '1%' }}>
|
||||
{idx !== 0 && <IconButton name="arrow-up" aria-label="arrow-up" onClick={() => onMove(idx, -1)} />}
|
||||
{idx !== 0 && <IconButton name="arrow-up" onClick={() => onMove(idx, -1)} tooltip="Move up" />}
|
||||
</td>
|
||||
<td role="gridcell" style={{ width: '1%' }}>
|
||||
{dashboard.annotations.list.length > 1 && idx !== dashboard.annotations.list.length - 1 ? (
|
||||
<IconButton name="arrow-down" aria-label="arrow-down" onClick={() => onMove(idx, 1)} />
|
||||
<IconButton name="arrow-down" onClick={() => onMove(idx, 1)} tooltip="Move down" />
|
||||
) : null}
|
||||
</td>
|
||||
<td role="gridcell" style={{ width: '1%' }}>
|
||||
|
||||
@@ -158,23 +158,23 @@ describe('AnnotationsSettings', () => {
|
||||
setup(dashboard);
|
||||
|
||||
// Check that we have sorting buttons
|
||||
expect(within(getTableBodyRows()[0]).queryByRole('button', { name: 'arrow-up' })).not.toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[0]).queryByRole('button', { name: 'arrow-down' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[0]).queryByRole('button', { name: 'Move up' })).not.toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[0]).queryByRole('button', { name: 'Move down' })).toBeInTheDocument();
|
||||
|
||||
expect(within(getTableBodyRows()[1]).queryByRole('button', { name: 'arrow-up' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[1]).queryByRole('button', { name: 'arrow-down' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[1]).queryByRole('button', { name: 'Move up' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[1]).queryByRole('button', { name: 'Move down' })).toBeInTheDocument();
|
||||
|
||||
expect(within(getTableBodyRows()[2]).queryByRole('button', { name: 'arrow-up' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[2]).queryByRole('button', { name: 'arrow-down' })).not.toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[2]).queryByRole('button', { name: 'Move up' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[2]).queryByRole('button', { name: 'Move down' })).not.toBeInTheDocument();
|
||||
|
||||
// Check the original order
|
||||
expect(within(getTableBodyRows()[0]).queryByText(/annotations & alerts/i)).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[1]).queryByText(/annotation 2/i)).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[2]).queryByText(/annotation 3/i)).toBeInTheDocument();
|
||||
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'arrow-down' })[0]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'arrow-down' })[1]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'arrow-up' })[0]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'Move down' })[0]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'Move down' })[1]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'Move up' })[0]);
|
||||
|
||||
// Checking if it has changed the sorting accordingly
|
||||
expect(within(getTableBodyRows()[0]).queryByText(/annotation 3/i)).toBeInTheDocument();
|
||||
|
||||
@@ -113,23 +113,23 @@ describe('LinksSettings', () => {
|
||||
setup(dashboard);
|
||||
|
||||
// Check that we have sorting buttons
|
||||
expect(within(getTableBodyRows()[0]).queryByRole('button', { name: 'arrow-up' })).not.toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[0]).queryByRole('button', { name: 'arrow-down' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[0]).queryByRole('button', { name: 'Move link up' })).not.toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[0]).queryByRole('button', { name: 'Move link down' })).toBeInTheDocument();
|
||||
|
||||
expect(within(getTableBodyRows()[1]).queryByRole('button', { name: 'arrow-up' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[1]).queryByRole('button', { name: 'arrow-down' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[1]).queryByRole('button', { name: 'Move link up' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[1]).queryByRole('button', { name: 'Move link down' })).toBeInTheDocument();
|
||||
|
||||
expect(within(getTableBodyRows()[2]).queryByRole('button', { name: 'arrow-up' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[2]).queryByRole('button', { name: 'arrow-down' })).not.toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[2]).queryByRole('button', { name: 'Move link up' })).toBeInTheDocument();
|
||||
expect(within(getTableBodyRows()[2]).queryByRole('button', { name: 'Move link down' })).not.toBeInTheDocument();
|
||||
|
||||
// Checking the original order
|
||||
assertRowHasText(0, links[0].title);
|
||||
assertRowHasText(1, links[1].title);
|
||||
assertRowHasText(2, links[2].url);
|
||||
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'arrow-down' })[0]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'arrow-down' })[1]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'arrow-up' })[0]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'Move link down' })[0]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'Move link down' })[1]);
|
||||
await userEvent.click(within(getTableBody()).getAllByRole('button', { name: 'Move link up' })[0]);
|
||||
|
||||
// Checking if it has changed the sorting accordingly
|
||||
assertRowHasText(0, links[2].url);
|
||||
|
||||
@@ -75,15 +75,15 @@ export const LinkSettingsList = ({ dashboard, onNew, onEdit }: LinkSettingsListP
|
||||
</HorizontalGroup>
|
||||
</td>
|
||||
<td style={{ width: '1%' }} role="gridcell">
|
||||
{idx !== 0 && <IconButton name="arrow-up" aria-label="arrow-up" onClick={() => moveLink(idx, -1)} />}
|
||||
{idx !== 0 && <IconButton name="arrow-up" onClick={() => moveLink(idx, -1)} tooltip="Move link up" />}
|
||||
</td>
|
||||
<td style={{ width: '1%' }} role="gridcell">
|
||||
{links.length > 1 && idx !== links.length - 1 ? (
|
||||
<IconButton name="arrow-down" aria-label="arrow-down" onClick={() => moveLink(idx, 1)} />
|
||||
<IconButton name="arrow-down" onClick={() => moveLink(idx, 1)} tooltip="Move link down" />
|
||||
) : null}
|
||||
</td>
|
||||
<td style={{ width: '1%' }} role="gridcell">
|
||||
<IconButton aria-label="copy" name="copy" onClick={() => duplicateLink(link, idx)} />
|
||||
<IconButton name="copy" onClick={() => duplicateLink(link, idx)} tooltip="Copy link" />
|
||||
</td>
|
||||
<td style={{ width: '1%' }} role="gridcell">
|
||||
<DeleteButton
|
||||
|
||||
@@ -66,7 +66,7 @@ export const DynamicConfigValueEditor = ({
|
||||
</Label>
|
||||
{!isSystemOverride && (
|
||||
<div>
|
||||
<IconButton name="times" onClick={onRemove} />
|
||||
<IconButton name="times" onClick={onRemove} tooltip="Remove label" />
|
||||
</div>
|
||||
)}
|
||||
</HorizontalGroup>
|
||||
|
||||
@@ -30,7 +30,7 @@ export const OverrideCategoryTitle = ({
|
||||
<div>
|
||||
<HorizontalGroup justify="space-between">
|
||||
<div>{overrideName}</div>
|
||||
<IconButton name="trash-alt" onClick={onOverrideRemove} title="Remove override" />
|
||||
<IconButton name="trash-alt" onClick={onOverrideRemove} tooltip="Remove override" />
|
||||
</HorizontalGroup>
|
||||
{!isExpanded && (
|
||||
<div className={styles.overrideDetails}>
|
||||
|
||||
@@ -249,6 +249,7 @@ class UnThemedTransformationsEditor extends React.PureComponent<TransformationsE
|
||||
onClick={() => {
|
||||
this.setState({ search: '' });
|
||||
}}
|
||||
tooltip="Clear search"
|
||||
/>
|
||||
</>
|
||||
);
|
||||
@@ -266,6 +267,7 @@ class UnThemedTransformationsEditor extends React.PureComponent<TransformationsE
|
||||
onClick={() => {
|
||||
this.setState({ showPicker: false });
|
||||
}}
|
||||
tooltip="Close picker"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ export const VersionHistoryHeader = ({
|
||||
|
||||
return (
|
||||
<h3 className={styles.header}>
|
||||
<IconButton name="arrow-left" size="xl" onClick={onClick} />
|
||||
<IconButton name="arrow-left" size="xl" onClick={onClick} tooltip="Reset version" />
|
||||
<span>
|
||||
Comparing {baseVersion} <Icon name="arrows-h" /> {newVersion}{' '}
|
||||
{isNewLatest && <cite className="muted">(Latest)</cite>}
|
||||
|
||||
Reference in New Issue
Block a user