blob: bda4bfa3ff5470f0acd1ac6f928543110cb6383c [file] [log] [blame]
// 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>
);
}
}