From 7fc4b1934b3f9721a723db6b48ad4f76a34cd5be Mon Sep 17 00:00:00 2001 From: Peter Holmberg Date: Thu, 1 Nov 2018 11:19:40 +0100 Subject: [PATCH] updating state and save --- .../settings/DataSourceSettings.tsx | 29 ++++++++++---- .../datasources/settings/PluginSettings.tsx | 39 ++++++++++++------- .../app/features/datasources/state/actions.ts | 6 +-- 3 files changed, 48 insertions(+), 26 deletions(-) diff --git a/public/app/features/datasources/settings/DataSourceSettings.tsx b/public/app/features/datasources/settings/DataSourceSettings.tsx index f7b870064c5..e5e9a60c03c 100644 --- a/public/app/features/datasources/settings/DataSourceSettings.tsx +++ b/public/app/features/datasources/settings/DataSourceSettings.tsx @@ -7,11 +7,11 @@ import PageLoader from '../../../core/components/PageLoader/PageLoader'; import PluginSettings from './PluginSettings'; import BasicSettings from './BasicSettings'; import ButtonRow from './ButtonRow'; +import appEvents from '../../../core/app_events'; import { deleteDataSource, loadDataSource, setDataSourceName, updateDataSource } from '../state/actions'; import { getNavModel } from '../../../core/selectors/navModel'; import { getRouteParamsId } from '../../../core/selectors/location'; import { getDataSource, getDataSourceMeta } from '../state/selectors'; -import appEvents from '../../../core/app_events'; export interface Props { navModel: NavModel; @@ -24,8 +24,7 @@ export interface Props { updateDataSource: typeof updateDataSource; } interface State { - name: string; - showNamePopover: boolean; + dataSource: DataSource; } enum DataSourceStates { @@ -34,6 +33,10 @@ enum DataSourceStates { } export class DataSourceSettings extends PureComponent { + state = { + dataSource: {} as DataSource, + }; + async componentDidMount() { const { loadDataSource, pageId } = this.props; @@ -43,7 +46,7 @@ export class DataSourceSettings extends PureComponent { onSubmit = event => { event.preventDefault(); - this.props.updateDataSource(); + this.props.updateDataSource({ ...this.state.dataSource, name: this.props.dataSource.name }); }; onDelete = () => { @@ -62,6 +65,12 @@ export class DataSourceSettings extends PureComponent { this.props.deleteDataSource(); }; + onModelChange = dataSource => { + this.setState({ + dataSource: dataSource, + }); + }; + isReadOnly() { return this.props.dataSource.readOnly === true; } @@ -120,10 +129,14 @@ export class DataSourceSettings extends PureComponent { {this.shouldRenderInfoBox() &&
{this.getInfoText()}
} - {this.isReadOnly() - ? this.renderIsReadOnlyMessage() - : dataSourceMeta.module && } - + {this.isReadOnly() && this.renderIsReadOnlyMessage()} + {dataSourceMeta.module && ( + + )} this.onSubmit(event)} isReadOnly={this.isReadOnly()} diff --git a/public/app/features/datasources/settings/PluginSettings.tsx b/public/app/features/datasources/settings/PluginSettings.tsx index d9906b449c9..c103e8c309c 100644 --- a/public/app/features/datasources/settings/PluginSettings.tsx +++ b/public/app/features/datasources/settings/PluginSettings.tsx @@ -1,35 +1,46 @@ -import _ from 'lodash'; import React, { PureComponent } from 'react'; +import _ from 'lodash'; import { DataSource, Plugin } from 'app/types/'; import { getAngularLoader, AngularComponent } from 'app/core/services/AngularLoader'; interface Props { dataSource: DataSource; dataSourceMeta: Plugin; + onModelChange: (dataSource: DataSource) => void; } export class PluginSettings extends PureComponent { element: any; component: AngularComponent; + scopeProps: { + ctrl: { datasourceMeta: Plugin; current: DataSource }; + onModelChanged: (dataSource: DataSource) => void; + }; + + constructor(props) { + super(props); + + this.scopeProps = { + ctrl: { datasourceMeta: props.dataSourceMeta, current: _.cloneDeep(props.dataSource) }, + onModelChanged: this.onModelChanged, + }; + } componentDidMount() { - const { dataSource, dataSourceMeta } = this.props; - if (!this.element) { return; } const loader = getAngularLoader(); const template = ''; - const scopeProps = { - ctrl: { - datasourceMeta: dataSourceMeta, - current: _.cloneDeep(dataSource), - }, - onModelChanged: this.onModelChanged, - }; - this.component = loader.load(this.element, scopeProps, template); + this.component = loader.load(this.element, this.scopeProps, template); + } + + componentDidUpdate(prevProps) { + if (this.props.dataSource !== prevProps.dataSource) { + this.scopeProps.ctrl.current = _.cloneDeep(this.props.dataSource); + } } componentWillUnmount() { @@ -38,9 +49,9 @@ export class PluginSettings extends PureComponent { } } - onModelChanged(dataSource: DataSource) { - console.log(dataSource); - } + onModelChanged = (dataSource: DataSource) => { + this.props.onModelChange(dataSource); + }; render() { return
(this.element = element)} />; diff --git a/public/app/features/datasources/state/actions.ts b/public/app/features/datasources/state/actions.ts index cb0030eb685..ff8af8b4c9d 100644 --- a/public/app/features/datasources/state/actions.ts +++ b/public/app/features/datasources/state/actions.ts @@ -157,10 +157,8 @@ export function loadDataSourceTypes(): ThunkResult { }; } -export function updateDataSource(): ThunkResult { - return async (dispatch, getStore) => { - const dataSource = getStore().dataSources.dataSource; - +export function updateDataSource(dataSource: DataSource): ThunkResult { + return async dispatch => { await getBackendSrv().put(`/api/datasources/${dataSource.id}`, dataSource); dispatch(loadDataSource(dataSource.id)); };