mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
wip: dashboard react
This commit is contained in:
parent
9e33f8b7c4
commit
60f700a1d2
@ -31,12 +31,6 @@ export class DashboardCtrl {
|
|||||||
// temp hack due to way dashboards are loaded
|
// temp hack due to way dashboards are loaded
|
||||||
// can't use controllerAs on route yet
|
// can't use controllerAs on route yet
|
||||||
$scope.ctrl = this;
|
$scope.ctrl = this;
|
||||||
|
|
||||||
// TODO: break out settings view to separate view & controller
|
|
||||||
this.editTab = 0;
|
|
||||||
|
|
||||||
// funcs called from React component bindings and needs this binding
|
|
||||||
this.getPanelContainer = this.getPanelContainer.bind(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setupDashboard(data) {
|
setupDashboard(data) {
|
||||||
|
138
public/app/features/dashboard/containers/DashboardPage.tsx
Normal file
138
public/app/features/dashboard/containers/DashboardPage.tsx
Normal file
@ -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));
|
5
public/app/features/dashboard/state/initDashboard.ts
Normal file
5
public/app/features/dashboard/state/initDashboard.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
|
||||||
|
export function initDashboard(dashboard: DashboardModel, $injector: any, $scope: any) {
|
||||||
|
|
||||||
|
}
|
@ -20,6 +20,7 @@ import DataSourceDashboards from 'app/features/datasources/DataSourceDashboards'
|
|||||||
import DataSourceSettingsPage from '../features/datasources/settings/DataSourceSettingsPage';
|
import DataSourceSettingsPage from '../features/datasources/settings/DataSourceSettingsPage';
|
||||||
import OrgDetailsPage from '../features/org/OrgDetailsPage';
|
import OrgDetailsPage from '../features/org/OrgDetailsPage';
|
||||||
import SoloPanelPage from '../features/dashboard/containers/SoloPanelPage';
|
import SoloPanelPage from '../features/dashboard/containers/SoloPanelPage';
|
||||||
|
import DashboardPage from '../features/dashboard/containers/DashboardPage';
|
||||||
import config from 'app/core/config';
|
import config from 'app/core/config';
|
||||||
|
|
||||||
/** @ngInject */
|
/** @ngInject */
|
||||||
@ -34,10 +35,12 @@ export function setupAngularRoutes($routeProvider, $locationProvider) {
|
|||||||
pageClass: 'page-dashboard',
|
pageClass: 'page-dashboard',
|
||||||
})
|
})
|
||||||
.when('/d/:uid/:slug', {
|
.when('/d/:uid/:slug', {
|
||||||
templateUrl: 'public/app/partials/dashboard.html',
|
template: '<react-container />',
|
||||||
controller: 'LoadDashboardCtrl',
|
|
||||||
reloadOnSearch: false,
|
|
||||||
pageClass: 'page-dashboard',
|
pageClass: 'page-dashboard',
|
||||||
|
reloadOnSearch: false,
|
||||||
|
resolve: {
|
||||||
|
component: () => DashboardPage,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
.when('/d/:uid', {
|
.when('/d/:uid', {
|
||||||
templateUrl: 'public/app/partials/dashboard.html',
|
templateUrl: 'public/app/partials/dashboard.html',
|
||||||
|
Loading…
Reference in New Issue
Block a user