app/addons/documents/sidebar/components/SidebarController.js (119 lines of code) (raw):

// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. import PropTypes from 'prop-types'; import React from 'react'; import ComponentsActions from "../../../components/actions"; import Components from '../../../components/react-components'; import ComponentsStore from '../../../components/stores'; import GeneralComponents from '../../../fauxton/components'; import CloneIndexModal from './CloneIndexModal'; import DesignDocList from './DesignDocList'; import MainSidebar from './MainSidebar'; const { DeleteDatabaseModal, LoadLines } = Components; const { ConfirmationModal } = GeneralComponents; const { deleteDbModalStore } = ComponentsStore; export default class SidebarController extends React.Component { static propTypes = { selectedNav: PropTypes.shape({ designDocName: PropTypes.string, designDocSection: PropTypes.string, indexName: PropTypes.string, navItem: PropTypes.string }).isRequired }; constructor(props) { super(props); this.state = this.getDeleteDbStoreState(); this.deleteIndex = this.deleteIndex.bind(this); this.cloneIndex = this.cloneIndex.bind(this); } componentDidMount() { deleteDbModalStore.on('change', this.onChange, this); } componentWillUnmount() { deleteDbModalStore.off('change', this.onChange, this); } getDeleteDbStoreState() { return { deleteDbModalProperties: deleteDbModalStore.getShowDeleteDatabaseModal() }; } onChange = () => { const newState = this.getDeleteDbStoreState(); this.setState(newState); }; showDeleteDatabaseModal = (payload) => { ComponentsActions.showDeleteDatabaseModal(payload); }; // handles deleting of any index regardless of type. The delete handler and all relevant info is set when the user // clicks the delete action for a particular index deleteIndex = () => { // if the user is currently on the index that's being deleted, pass that info along to the delete handler. That can // be used to redirect the user to somewhere appropriate const isOnIndex = this.props.selectedNav.navItem === 'designDoc' && ('_design/' + this.props.selectedNav.designDocName) === this.props.deleteIndexModalDesignDoc.id && this.props.selectedNav.indexName === this.props.deleteIndexModalIndexName; this.props.deleteIndexModalOnSubmit({ isOnIndex: isOnIndex, indexName: this.props.deleteIndexModalIndexName, designDoc: this.props.deleteIndexModalDesignDoc, designDocs: this.props.designDocs, database: this.props.database }); }; cloneIndex = () => { this.props.cloneIndexModalOnSubmit({ sourceIndexName: this.props.cloneIndexSourceIndexName, sourceDesignDocName: this.props.cloneIndexSourceDesignDocName, targetDesignDocName: this.props.cloneIndexModalSelectedDesignDoc, newDesignDocName: this.props.cloneIndexModalNewDesignDocName, newDesignDocPartitioned: this.props.cloneIndexModalNewDesignDocPartitioned, isDbPartitioned: this.props.isDbPartitioned, newIndexName: this.props.cloneIndexModalNewIndexName, designDocs: this.props.designDocs, database: this.props.database, onComplete: this.props.hideCloneIndexModal }); }; render() { if (this.props.isLoading) { return <LoadLines />; } return ( <nav className="sidenav"> <MainSidebar selectedNavItem={this.props.selectedNav.navItem} databaseName={this.props.database.id} selectedPartitionKey={this.props.selectedPartitionKey}/> <DesignDocList selectedNav={this.props.selectedNav} selectedPartitionKey={this.props.selectedPartitionKey} isDbPartitioned={this.props.isDbPartitioned} toggle={this.props.toggleContent} toggledSections={this.props.toggledSections} designDocs={this.props.designDocList} database={this.props.database} showDeleteIndexModal={this.props.showDeleteIndexModal} showCloneIndexModal={this.props.showCloneIndexModal} /> <DeleteDatabaseModal showHide={this.showDeleteDatabaseModal} modalProps={this.state.deleteDbModalProperties} /> {/* the delete and clone index modals handle all index types, hence the props all being pulled from the store */} <ConfirmationModal title="Confirm Deletion" visible={this.props.deleteIndexModalVisible} text={this.props.deleteIndexModalText} onClose={this.props.hideDeleteIndexModal} onSubmit={this.deleteIndex} /> <CloneIndexModal visible={this.props.cloneIndexModalVisible} title={this.props.cloneIndexModalTitle} close={this.props.hideCloneIndexModal} submit={this.cloneIndex} designDocArray={this.props.availableDesignDocIds} selectedDesignDoc={this.props.cloneIndexModalSelectedDesignDoc} selectedDesignDocPartitioned={this.props.cloneIndexModalSelectedDesignDocPartitioned} newDesignDocName={this.props.cloneIndexModalNewDesignDocName} newDesignDocPartitioned={this.props.cloneIndexModalNewDesignDocPartitioned} newIndexName={this.props.cloneIndexModalNewIndexName} indexLabel={this.props.cloneIndexModalIndexLabel} selectDesignDoc={this.props.selectDesignDoc} updateNewDesignDocName={this.props.updateNewDesignDocName} updateNewDesignDocPartitioned={this.props.updateNewDesignDocPartitioned} setNewCloneIndexName={this.props.setNewCloneIndexName} isDbPartitioned={this.props.isDbPartitioned} /> </nav> ); } }