diff --git a/ui/src/dashboards/components/ImportDashboardOverlay.tsx b/ui/src/dashboards/components/ImportDashboardOverlay.tsx index 604fe7126..ed13800e7 100644 --- a/ui/src/dashboards/components/ImportDashboardOverlay.tsx +++ b/ui/src/dashboards/components/ImportDashboardOverlay.tsx @@ -6,7 +6,10 @@ import {getDeep} from 'src/utils/wrappers' import Container from 'src/shared/components/overlay/OverlayContainer' import Heading from 'src/shared/components/overlay/OverlayHeading' import Body from 'src/shared/components/overlay/OverlayBody' -import {notifyDashboardImportFailed} from 'src/shared/copy/notifications' +import { + notifyDashboardImportFailed, + notifyDashboardUploadFailed, +} from 'src/shared/copy/notifications' import {Dashboard} from 'src/types' import {DashboardFile} from 'src/types/dashboard' @@ -25,6 +28,7 @@ interface DashboardFromFile { interface State { dashboardFromFile: DashboardFromFile + isImportable: boolean } interface File extends Blob { @@ -42,6 +46,7 @@ class ImportDashboardOverlay extends PureComponent { this.state = { dashboardFromFile: null, + isImportable: false, } } @@ -63,7 +68,12 @@ class ImportDashboardOverlay extends PureComponent { />
- +
@@ -71,18 +81,32 @@ class ImportDashboardOverlay extends PureComponent { ) } + private get isDisabled(): boolean { + const {isImportable} = this.state + if (isImportable) { + return false + } + return true + } + private handleChooseFile = (e: ChangeEvent): void => { const file: File = getDeep(e, 'target.files[0]', null) + const fileName = file.name const fileReader = new FileReader() fileReader.onloadend = () => { - const result: DashboardFile = JSON.parse(fileReader.result) - const dashboard = getDeep(result, 'dashboard', null) - const fileName = file.name - const dashboardFromFile: DashboardFromFile = { - dashboard, - fileName, + try { + const result: DashboardFile = JSON.parse(fileReader.result) + const dashboard = getDeep(result, 'dashboard', null) + const dashboardFromFile: DashboardFromFile = { + dashboard, + fileName, + } + this.setState({dashboardFromFile}) + this.setState({isImportable: true}) + } catch (error) { + this.props.notify(notifyDashboardUploadFailed(fileName, error)) + this.setState({isImportable: false}) } - this.setState({dashboardFromFile}) } fileReader.readAsText(file) } diff --git a/ui/src/shared/copy/notifications.ts b/ui/src/shared/copy/notifications.ts index 32bc1fc6c..a6b6f9d03 100644 --- a/ui/src/shared/copy/notifications.ts +++ b/ui/src/shared/copy/notifications.ts @@ -426,6 +426,12 @@ export const notifyDashboardImportFailed = (fileName, errorMessage) => ({ message: `Failed to import Dashboard from file ${fileName}: ${errorMessage}.`, }) +export const notifyDashboardUploadFailed = (fileName, errorMessage) => ({ + ...defaultErrorNotification, + duration: INFINITE, + message: `Failed to upload Dashboard from file ${fileName}: ${errorMessage}.`, +}) + export const notifyDashboardDeleteFailed = (name, errorMessage) => `Failed to delete Dashboard ${name}: ${errorMessage}.`