mirror of https://github.com/grafana/grafana
parent
9e33f8b7c4
commit
60f700a1d2
@ -0,0 +1,138 @@ |
||||
// Libraries
|
||||
import React, { Component } from 'react'; |
||||
import { hot } from 'react-hot-loader'; |
||||
import { connect } from 'react-redux'; |
||||
|
||||
// Utils & Services
|
||||
import locationUtil from 'app/core/utils/location_util'; |
||||
import { getBackendSrv } from 'app/core/services/backend_srv'; |
||||
import { createErrorNotification } from 'app/core/copy/appNotification'; |
||||
|
||||
// Components
|
||||
import { LoadingPlaceholder } from '@grafana/ui'; |
||||
|
||||
// Redux
|
||||
import { updateLocation } from 'app/core/actions'; |
||||
import { notifyApp } from 'app/core/actions'; |
||||
|
||||
// Types
|
||||
import { StoreState } from 'app/types'; |
||||
import { DashboardModel } from 'app/features/dashboard/state'; |
||||
|
||||
interface Props { |
||||
panelId: string; |
||||
urlUid?: string; |
||||
urlSlug?: string; |
||||
urlType?: string; |
||||
$scope: any; |
||||
$injector: any; |
||||
updateLocation: typeof updateLocation; |
||||
notifyApp: typeof notifyApp; |
||||
} |
||||
|
||||
interface State { |
||||
dashboard: DashboardModel | null; |
||||
notFound: boolean; |
||||
} |
||||
|
||||
export class DashboardPage extends Component<Props, State> { |
||||
state: State = { |
||||
dashboard: null, |
||||
notFound: false, |
||||
}; |
||||
|
||||
async componentDidMount() { |
||||
const { $injector, urlUid, urlType, urlSlug } = this.props; |
||||
|
||||
// handle old urls with no uid
|
||||
if (!urlUid && !(urlType === 'script' || urlType === 'snapshot')) { |
||||
this.redirectToNewUrl(); |
||||
return; |
||||
} |
||||
|
||||
const loaderSrv = $injector.get('dashboardLoaderSrv'); |
||||
const dashDTO = await loaderSrv.loadDashboard(urlType, urlSlug, urlUid); |
||||
|
||||
try { |
||||
this.initDashboard(dashDTO); |
||||
} catch (err) { |
||||
this.props.notifyApp(createErrorNotification('Failed to init dashboard', err.toString())); |
||||
console.log(err); |
||||
} |
||||
} |
||||
|
||||
redirectToNewUrl() { |
||||
getBackendSrv() |
||||
.getDashboardBySlug(this.props.urlSlug) |
||||
.then(res => { |
||||
if (res) { |
||||
const url = locationUtil.stripBaseFromUrl(res.meta.url.replace('/d/', '/d-solo/')); |
||||
this.props.updateLocation(url); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
initDashboard(dashDTO: any) { |
||||
const dashboard = new DashboardModel(dashDTO.dashboard, dashDTO.meta); |
||||
|
||||
// init services
|
||||
this.timeSrv.init(dashboard); |
||||
this.annotationsSrv.init(dashboard); |
||||
|
||||
// template values service needs to initialize completely before
|
||||
// the rest of the dashboard can load
|
||||
this.variableSrv |
||||
.init(dashboard) |
||||
// template values failes are non fatal
|
||||
.catch(this.onInitFailed.bind(this, 'Templating init failed', false)) |
||||
// continue
|
||||
.finally(() => { |
||||
this.dashboard = dashboard; |
||||
this.dashboard.processRepeats(); |
||||
this.dashboard.updateSubmenuVisibility(); |
||||
this.dashboard.autoFitPanels(window.innerHeight); |
||||
|
||||
this.unsavedChangesSrv.init(dashboard, this.$scope); |
||||
|
||||
// TODO refactor ViewStateSrv
|
||||
this.$scope.dashboard = dashboard; |
||||
this.dashboardViewState = this.dashboardViewStateSrv.create(this.$scope); |
||||
|
||||
this.keybindingSrv.setupDashboardBindings(this.$scope, dashboard); |
||||
this.setWindowTitleAndTheme(); |
||||
|
||||
appEvents.emit('dashboard-initialized', dashboard); |
||||
}) |
||||
.catch(this.onInitFailed.bind(this, 'Dashboard init failed', true)); |
||||
|
||||
this.setState({ dashboard }); |
||||
} |
||||
|
||||
render() { |
||||
const { notFound, dashboard } = this.state; |
||||
|
||||
if (notFound) { |
||||
return <div className="alert alert-error">Dashboard not found</div>; |
||||
} |
||||
|
||||
if (!dashboard) { |
||||
return <LoadingPlaceholder text="Loading dashboard" />; |
||||
} |
||||
|
||||
return <div>title: {dashboard.title}</div>; |
||||
} |
||||
} |
||||
|
||||
const mapStateToProps = (state: StoreState) => ({ |
||||
urlUid: state.location.routeParams.uid, |
||||
urlSlug: state.location.routeParams.slug, |
||||
urlType: state.location.routeParams.type, |
||||
panelId: state.location.query.panelId, |
||||
}); |
||||
|
||||
const mapDispatchToProps = { |
||||
updateLocation, |
||||
notifyApp, |
||||
}; |
||||
|
||||
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DashboardPage)); |
@ -0,0 +1,5 @@ |
||||
|
||||
|
||||
export function initDashboard(dashboard: DashboardModel, $injector: any, $scope: any) { |
||||
|
||||
} |
Loading…
Reference in new issue