mirror of https://github.com/grafana/grafana
Scenes: Refactor original snapshot button in a new component (#82199)
parent
ccb4533a86
commit
dbde08b03c
@ -0,0 +1,60 @@ |
||||
import { fireEvent, render, screen } from '@testing-library/react'; |
||||
import React from 'react'; |
||||
|
||||
import { config, locationService } from '@grafana/runtime'; |
||||
import { ConfirmModal } from '@grafana/ui'; |
||||
|
||||
import appEvents from '../../../core/app_events'; |
||||
import { ShowModalReactEvent } from '../../../types/events'; |
||||
|
||||
import { GoToSnapshotOriginButton } from './GoToSnapshotOriginButton'; |
||||
|
||||
describe('GoToSnapshotOriginButton component', () => { |
||||
beforeEach(async () => { |
||||
locationService.push('/'); |
||||
const location = window.location; |
||||
//@ts-ignore
|
||||
delete window.location; |
||||
window.location = { |
||||
...location, |
||||
href: 'http://snapshots.grafana.com/snapshots/dashboard/abcdefghi/my-dash', |
||||
}; |
||||
jest.spyOn(appEvents, 'publish'); |
||||
}); |
||||
config.appUrl = 'http://snapshots.grafana.com/'; |
||||
|
||||
it('renders button and triggers onClick redirects to the original dashboard', () => { |
||||
render(<GoToSnapshotOriginButton originalURL={'/d/c0d2742f-b827-466d-9269-fb34d6af24ff'} />); |
||||
|
||||
// Check if the button renders with the correct testid
|
||||
expect(screen.getByTestId('button-snapshot')).toBeInTheDocument(); |
||||
|
||||
// Simulate a button click
|
||||
fireEvent.click(screen.getByTestId('button-snapshot')); |
||||
|
||||
expect(appEvents.publish).toHaveBeenCalledTimes(0); |
||||
expect(locationService.getLocation().pathname).toEqual('/d/c0d2742f-b827-466d-9269-fb34d6af24ff'); |
||||
expect(window.location.href).toBe('http://snapshots.grafana.com/snapshots/dashboard/abcdefghi/my-dash'); |
||||
}); |
||||
|
||||
it('renders button and triggers onClick opens a confirmation modal', () => { |
||||
render(<GoToSnapshotOriginButton originalURL={'http://www.anotherdomain.com/'} />); |
||||
|
||||
// Check if the button renders with the correct testid
|
||||
expect(screen.getByTestId('button-snapshot')).toBeInTheDocument(); |
||||
|
||||
// Simulate a button click
|
||||
fireEvent.click(screen.getByTestId('button-snapshot')); |
||||
|
||||
expect(appEvents.publish).toHaveBeenCalledTimes(1); |
||||
expect(appEvents.publish).toHaveBeenCalledWith( |
||||
new ShowModalReactEvent( |
||||
expect.objectContaining({ |
||||
component: ConfirmModal, |
||||
}) |
||||
) |
||||
); |
||||
expect(locationService.getLocation().pathname).toEqual('/'); |
||||
expect(window.location.href).toBe('http://snapshots.grafana.com/snapshots/dashboard/abcdefghi/my-dash'); |
||||
}); |
||||
}); |
||||
@ -0,0 +1,62 @@ |
||||
import { css } from '@emotion/css'; |
||||
import React from 'react'; |
||||
|
||||
import { textUtil } from '@grafana/data'; |
||||
import { config, locationService } from '@grafana/runtime'; |
||||
import { ConfirmModal, ToolbarButton } from '@grafana/ui'; |
||||
|
||||
import appEvents from '../../../core/app_events'; |
||||
import { t } from '../../../core/internationalization'; |
||||
import { ShowModalReactEvent } from '../../../types/events'; |
||||
|
||||
export function GoToSnapshotOriginButton(props: { originalURL: string }) { |
||||
return ( |
||||
<ToolbarButton |
||||
key="button-snapshot" |
||||
data-testid="button-snapshot" |
||||
tooltip={t('dashboard.toolbar.open-original', 'Open original dashboard')} |
||||
icon="link" |
||||
onClick={() => onOpenSnapshotOriginalDashboard(props.originalURL)} |
||||
/> |
||||
); |
||||
} |
||||
|
||||
const onOpenSnapshotOriginalDashboard = (originalUrl: string) => { |
||||
const relativeURL = originalUrl ?? ''; |
||||
const sanitizedRelativeURL = textUtil.sanitizeUrl(relativeURL); |
||||
try { |
||||
const sanitizedAppUrl = new URL(sanitizedRelativeURL, config.appUrl); |
||||
const appUrl = new URL(config.appUrl); |
||||
if (sanitizedAppUrl.host !== appUrl.host) { |
||||
appEvents.publish( |
||||
new ShowModalReactEvent({ |
||||
component: ConfirmModal, |
||||
props: { |
||||
title: 'Proceed to external site?', |
||||
modalClass: css({ |
||||
width: 'max-content', |
||||
maxWidth: '80vw', |
||||
}), |
||||
body: ( |
||||
<> |
||||
<p> |
||||
{`This link connects to an external website at`} <code>{relativeURL}</code> |
||||
</p> |
||||
<p>{"Are you sure you'd like to proceed?"}</p> |
||||
</> |
||||
), |
||||
confirmVariant: 'primary', |
||||
confirmText: 'Proceed', |
||||
onConfirm: () => { |
||||
window.location.href = sanitizedAppUrl.href; |
||||
}, |
||||
}, |
||||
}) |
||||
); |
||||
} else { |
||||
locationService.push(sanitizedRelativeURL); |
||||
} |
||||
} catch (err) { |
||||
console.error('Failed to open original dashboard', err); |
||||
} |
||||
}; |
||||
Loading…
Reference in new issue