import React, {PropTypes, Component} from 'react'; import classnames from 'classnames'; import Link from '../base/Link'; import EnvironmentEditor from '../editors/EnvironmentEditor'; import Editable from '../base/Editable'; import Modal from '../base/Modal'; import ModalBody from '../base/ModalBody'; import ModalHeader from '../base/ModalHeader'; import ModalFooter from '../base/ModalFooter'; import * as db from '../../database' class WorkspaceEnvironmentsEditModal extends Component { constructor (props) { super(props); this.state = { workspace: null, isValid: true, subEnvironments: [], rootEnvironment: null, activeEnvironmentId: null } } show (workspace) { this.modal.show(); this._load(workspace); } toggle (workspace) { this.modal.toggle(); this._load(workspace); } _load (workspace, environmentToActivate = null) { db.environmentGetOrCreateForWorkspace(workspace).then(rootEnvironment => { db.environmentFindByParentId(rootEnvironment._id).then(subEnvironments => { let activeEnvironmentId; if (environmentToActivate) { activeEnvironmentId = environmentToActivate._id } else { activeEnvironmentId = this.state.activeEnvironmentId || rootEnvironment._id; } this.setState({workspace, rootEnvironment, subEnvironments, activeEnvironmentId}); }); }); } _handleAddEnvironment () { const {rootEnvironment, workspace} = this.state; db.environmentCreate({parentId: rootEnvironment._id}).then(environment => { this._load(workspace, environment); }); } _handleActivateEnvironment (environment) { // Don't allow switching if the current one has errors if (!this._envEditor.isValid()) { return; } this.setState({activeEnvironmentId: environment._id}); } _handleDeleteEnvironment (environment) { const {rootEnvironment, workspace} = this.state; // Don't delete the root environment if (environment === rootEnvironment) { return; } // Delete the current one, then activate the root environment db.environmentRemove(environment).then(() => { this._load(workspace, rootEnvironment); }); } _handleChangeEnvironmentName (environment, name) { const {workspace} = this.state; db.environmentUpdate(environment, {name}).then(() => { this._load(workspace); }); } _didChange () { const isValid = this._envEditor.isValid(); if (this.state.isValid === isValid) { this.setState({isValid}); } this._saveChanges(); } _getActiveEnvironment () { const {activeEnvironmentId, subEnvironments, rootEnvironment} = this.state; if (rootEnvironment && rootEnvironment._id === activeEnvironmentId) { return rootEnvironment; } else { return subEnvironments.find(e => e._id === activeEnvironmentId); } } _saveChanges () { // Only save if it's valid if (!this._envEditor.isValid()) { return; } const environment = this._envEditor.getValue(); const activeEnvironment = this._getActiveEnvironment(); db.environmentUpdate(activeEnvironment, {data: environment}); } render () { const {subEnvironments, rootEnvironment, isValid} = this.state; const activeEnvironment = this._getActiveEnvironment(); return ( this.modal = m} wide={true} top={true} tall={true} {...this.props}> Manage Environments (JSON Format)
  • this._handleActivateEnvironment(rootEnvironment)} className={classnames( 'env-modal__sidebar-root-item', {'env-modal__sidebar-item--active': activeEnvironment === rootEnvironment} )}>
  • Sub Environments

      {subEnvironments.map(environment => { const classes = classnames( 'env-modal__sidebar-item', {'env-modal__sidebar-item--active': activeEnvironment === environment} ); return (
    • ) })}

    this._handleChangeEnvironmentName(activeEnvironment, name)} value={activeEnvironment ? activeEnvironment.name : ''} />

    {rootEnvironment !== activeEnvironment ? ( ) : null}
    this._envEditor = n} key={activeEnvironment ? activeEnvironment._id : 'n/a'} environment={activeEnvironment ? activeEnvironment.data : {}} didChange={this._didChange.bind(this)} lightTheme={true} />
    * environment data can be used for  Nunjucks Templating in your requests
    ); } } WorkspaceEnvironmentsEditModal.propTypes = { onChange: PropTypes.func.isRequired }; export default WorkspaceEnvironmentsEditModal; export let show = null;