mirror of https://github.com/grafana/grafana
AngularMigration: Allow dashboard by dashboard migration (#84100)
parent
1ffeb7c365
commit
e5d1cd8ea5
@ -0,0 +1,50 @@ |
||||
import { render, screen } from '@testing-library/react'; |
||||
import userEvent from '@testing-library/user-event'; |
||||
import React from 'react'; |
||||
|
||||
import { AngularMigrationNotice } from './AngularMigrationNotice'; |
||||
|
||||
jest.mock('@grafana/runtime', () => ({ |
||||
...jest.requireActual('@grafana/runtime'), |
||||
})); |
||||
|
||||
describe('AngularMigrationNotice', () => { |
||||
const noticeText = |
||||
/This dashboard was migrated from Angular. Please make sure everything is behaving as expected and save and refresh this dashboard to persist the migration./i; |
||||
const dsUid = 'abc'; |
||||
|
||||
afterAll(() => { |
||||
jest.resetAllMocks(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
jest.clearAllMocks(); |
||||
}); |
||||
|
||||
it('should render', () => { |
||||
render(<AngularMigrationNotice dashboardUid={dsUid} />); |
||||
expect(screen.getByText(noticeText)).toBeInTheDocument(); |
||||
}); |
||||
|
||||
it('should be dismissable', async () => { |
||||
render(<AngularMigrationNotice dashboardUid={dsUid} />); |
||||
const closeButton = screen.getByRole('button', { name: /Close alert/i }); |
||||
expect(closeButton).toBeInTheDocument(); |
||||
await userEvent.click(closeButton); |
||||
expect(screen.queryByText(noticeText)).not.toBeInTheDocument(); |
||||
}); |
||||
|
||||
describe('Migration alert buttons', () => { |
||||
it('should display the "Revert migration" button', () => { |
||||
render(<AngularMigrationNotice dashboardUid={dsUid} />); |
||||
const revertMigrationButton = screen.getByRole('button', { name: /Revert migration/i }); |
||||
expect(revertMigrationButton).toBeInTheDocument(); |
||||
}); |
||||
|
||||
it('should display the "Report issue" button', () => { |
||||
render(<AngularMigrationNotice dashboardUid={dsUid} />); |
||||
const reportIssueButton = screen.getByRole('button', { name: /Report issue/i }); |
||||
expect(reportIssueButton).toBeInTheDocument(); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,66 @@ |
||||
import { css } from '@emotion/css'; |
||||
import React, { useState } from 'react'; |
||||
|
||||
import { GrafanaTheme2 } from '@grafana/data'; |
||||
import { Alert, Button, useStyles2 } from '@grafana/ui'; |
||||
|
||||
import { migrationFeatureFlags } from './utils'; |
||||
|
||||
interface Props { |
||||
dashboardUid: string; |
||||
} |
||||
|
||||
const revertAutoMigrateUrlFlag = () => { |
||||
const url = new URL(window.location.toString()); |
||||
const urlParams = new URLSearchParams(url.search); |
||||
|
||||
urlParams.forEach((value, key) => { |
||||
if (key.startsWith('__feature.')) { |
||||
const featureName = key.substring(10); |
||||
if (migrationFeatureFlags.has(featureName)) { |
||||
urlParams.delete(key); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
window.location.href = new URL(url.origin + url.pathname + '?' + urlParams.toString()).toString(); |
||||
}; |
||||
|
||||
const reportIssue = () => { |
||||
window.open( |
||||
'https://github.com/grafana/grafana/issues/new?assignees=&labels=&projects=&template=0-bug-report.yaml&title=Product+Area%3A+Short+description+of+bug' |
||||
); |
||||
}; |
||||
|
||||
export function AngularMigrationNotice({ dashboardUid }: Props) { |
||||
const styles = useStyles2(getStyles); |
||||
|
||||
const [showAlert, setShowAlert] = useState(true); |
||||
|
||||
if (showAlert) { |
||||
return ( |
||||
<Alert |
||||
severity="info" |
||||
title="This dashboard was migrated from Angular. Please make sure everything is behaving as expected and save and refresh this dashboard to persist the migration." |
||||
onRemove={() => setShowAlert(false)} |
||||
> |
||||
<div className="markdown-html"> |
||||
<Button fill="outline" size="sm" className={styles.linkButton} onClick={reportIssue}> |
||||
Report issue |
||||
</Button> |
||||
<Button fill="outline" size="sm" className={styles.linkButton} onClick={revertAutoMigrateUrlFlag}> |
||||
Revert migration |
||||
</Button> |
||||
</div> |
||||
</Alert> |
||||
); |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
const getStyles = (theme: GrafanaTheme2) => ({ |
||||
linkButton: css({ |
||||
marginRight: 10, |
||||
}), |
||||
}); |
Loading…
Reference in new issue