import React, { PureComponent } from 'react'; import { hot } from 'react-hot-loader'; import { connect } from 'react-redux'; import { DataSource, DataSourceTest, NavModel, Plugin } from 'app/types/'; import PageHeader from '../../../core/components/PageHeader/PageHeader'; 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 { clearTesting, 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'; export interface Props { navModel: NavModel; dataSource: DataSource; dataSourceMeta: Plugin; pageId: number; testing: DataSourceTest; deleteDataSource: typeof deleteDataSource; loadDataSource: typeof loadDataSource; setDataSourceName: typeof setDataSourceName; updateDataSource: typeof updateDataSource; clearTesting: typeof clearTesting; } interface State { dataSource: DataSource; hasClosedTest: boolean; } enum DataSourceStates { Alpha = 'alpha', Beta = 'beta', } export class DataSourceSettings extends PureComponent { state = { dataSource: {} as DataSource, hasClosedTest: false, }; async componentDidMount() { const { loadDataSource, pageId } = this.props; await loadDataSource(pageId); } componentDidUpdate(prevProps) { const { clearTesting } = this.props; if (!this.state.hasClosedTest && prevProps.testing.status === 'success') { this.setState({ hasClosedTest: true }); setTimeout(() => { clearTesting(); this.setState({ hasClosedTest: false }); }, 3000); } } componentWillUnmount() { this.props.clearTesting(); } onSubmit = event => { event.preventDefault(); this.props.updateDataSource({ ...this.state.dataSource, name: this.props.dataSource.name }); }; onDelete = () => { appEvents.emit('confirm-modal', { title: 'Delete', text: 'Are you sure you want to delete this data source?', yesText: 'Delete', icon: 'fa-trash', onConfirm: () => { this.confirmDelete(); }, }); }; confirmDelete = () => { this.props.deleteDataSource(); }; onModelChange = dataSource => { this.setState({ dataSource: dataSource, }); }; isReadOnly() { return this.props.dataSource.readOnly === true; } shouldRenderInfoBox() { const { state } = this.props.dataSourceMeta; return state === DataSourceStates.Alpha || state === DataSourceStates.Beta; } getInfoText() { const { dataSourceMeta } = this.props; switch (dataSourceMeta.state) { case DataSourceStates.Alpha: return ( 'This plugin is marked as being in alpha state, which means it is in early development phase and updates' + ' will include breaking changes.' ); case DataSourceStates.Beta: return ( 'This plugin is marked as being in a beta development state. This means it is in currently in active' + ' development and could be missing important features.' ); } return null; } renderIsReadOnlyMessage() { return (
This datasource was added by config and cannot be modified using the UI. Please contact your server admin to update this datasource.
); } render() { const { dataSource, dataSourceMeta, navModel, testing } = this.props; return (
{Object.keys(dataSource).length === 0 ? ( ) : (
this.props.setDataSourceName(name)} /> {this.shouldRenderInfoBox() &&
{this.getInfoText()}
} {this.isReadOnly() && this.renderIsReadOnlyMessage()} {dataSourceMeta.module && ( )}
{testing.inProgress && (
Testing....
)} {!testing.inProgress && testing.status && (
{testing.status === 'error' ? ( ) : ( )}
{testing.message}
)}
this.onSubmit(event)} isReadOnly={this.isReadOnly()} onDelete={this.onDelete} />
)}
); } } function mapStateToProps(state) { const pageId = getRouteParamsId(state.location); const dataSource = getDataSource(state.dataSources, pageId); return { navModel: getNavModel(state.navIndex, `datasource-settings-${pageId}`), dataSource: getDataSource(state.dataSources, pageId), dataSourceMeta: getDataSourceMeta(state.dataSources, dataSource.type), pageId: pageId, testing: state.dataSources.testing, }; } const mapDispatchToProps = { deleteDataSource, loadDataSource, setDataSourceName, updateDataSource, clearTesting, }; export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DataSourceSettings));