123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- import {Fragment, useState} from 'react';
- import {browserHistory} from 'react-router';
- import {css} from '@emotion/react';
- import {createDashboard} from 'sentry/actionCreators/dashboards';
- import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
- import {Button} from 'sentry/components/button';
- import {CodeSnippet} from 'sentry/components/codeSnippet';
- import {IconUpload} from 'sentry/icons';
- import {t} from 'sentry/locale';
- import {normalizeUrl} from 'sentry/utils/withDomainRequired';
- import {
- assignDefaultLayout,
- getInitialColumnDepths,
- } from 'sentry/views/dashboards/layoutUtils';
- import {Wrapper} from 'sentry/views/discover/table/quickContext/styles';
- // Internal feature - no specs written.
- function ImportDashboardFromFileModal({
- Header,
- Body,
- Footer,
- organization,
- api,
- location,
- }) {
- const [dashboardData, setDashboardData] = useState('');
- const [validated, setValidated] = useState(false);
- function validateFile(fileToUpload) {
- if (!fileToUpload || !(fileToUpload.type === 'application/json')) {
- addErrorMessage('You must upload a JSON file');
- setValidated(false);
- setDashboardData('');
- return false;
- }
- setValidated(true);
- return true;
- }
- const handleFileChange = e => {
- const fileToUpload = e.target.files[0];
- if (validateFile(fileToUpload)) {
- const fileReader = new FileReader();
- fileReader.readAsText(fileToUpload, 'UTF-8');
- fileReader.onload = event => {
- const target = event.target;
- if (target && typeof target.result === 'string') {
- const parsed = JSON.parse(target.result);
- const formatted = JSON.stringify(parsed, null, '\t');
- setDashboardData(formatted);
- }
- };
- }
- };
- const handleUploadClick = async () => {
- const dashboard = JSON.parse(dashboardData);
- try {
- const newDashboard = await createDashboard(
- api,
- organization.slug,
- {
- ...dashboard,
- widgets: assignDefaultLayout(dashboard.widgets, getInitialColumnDepths()),
- },
- true
- );
- addSuccessMessage(`${dashboard.title} dashboard template successfully added`);
- loadDashboard(newDashboard.id);
- } catch (error) {
- addErrorMessage('Could not upload dashboard, JSON may be invalid');
- }
- };
- const loadDashboard = (dashboardId: string) => {
- browserHistory.push(
- normalizeUrl({
- pathname: `/organizations/${organization.slug}/dashboards/${dashboardId}/`,
- query: location.query,
- })
- );
- };
- return (
- <Fragment>
- <Header closeButton>
- <h4>{t('Import Dashboard from JSON File')}</h4>
- </Header>
- <Body>
- <Wrapper>
- <input type="file" onChange={handleFileChange} />
- </Wrapper>
- <Wrapper>
- <Button
- onClick={handleUploadClick}
- size="md"
- disabled={!validated}
- priority="primary"
- icon={<IconUpload />}
- >
- {t('Import')}
- </Button>
- </Wrapper>
- </Body>
- {validated && (
- <Fragment>
- <Footer />
- <Wrapper>
- <h4>{t('Preview')}</h4>
- </Wrapper>
- <CodeSnippet language="json">{dashboardData}</CodeSnippet>
- </Fragment>
- )}
- </Fragment>
- );
- }
- export default ImportDashboardFromFileModal;
- export const modalCss = css`
- max-width: 700px;
- margin: 70px auto;
- `;
|