blob: f5b2dabf85319f075f59a30f311611d303b62be1 [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.
define([
'app',
'api',
'react',
'addons/compaction/stores',
'addons/compaction/actions',
'addons/components/react-components.react'
],
function (app, FauxtonAPI, React, Stores, Actions, Components, ReactComponents) {
var compactionStore = Stores.compactionStore;
var CompactDatabase = React.createClass({
run: function (e) {
this.props.compactDatabase();
},
render: function () {
var btnText = 'Run';
if (this.props.isCompacting) {
btnText = 'Compacting...';
}
return (
<div className="row-fluid">
<div className="span12 compaction-option">
<h3>Compact Database</h3>
<p>Compacting a database removes deleted documents and previous revisions. It is an irreversible operation and may take a while to complete for large databases.</p>
<button id="compact-db" disabled={this.props.isCompacting} onClick={this.run} className="btn btn-large btn-primary">{btnText}</button>
</div>
</div>
);
}
});
var CleanView = React.createClass({
run: function (e) {
this.props.cleanupView();
},
render: function () {
var btnText = 'Run';
if (this.props.isCleaningView) {
btnText = 'Cleaning Views...';
}
return (
<div className="row-fluid">
<div className="span12 compaction-option">
<h3>Cleanup Views</h3>
<p>Cleaning up views in a database removes old view files still stored on the filesystem. It is an irreversible operation.</p>
<button id="cleanup-views" onClick={this.run} className="btn btn-large btn-primary">{btnText}</button>
</div>
</div>
);
}
});
var CompactionController = React.createClass({
getStoreState: function () {
return {
database: compactionStore.getDatabase(),
isCompacting: compactionStore.isCompacting(),
isCleaningViews: compactionStore.isCleaningViews()
};
},
getInitialState: function () {
return this.getStoreState();
},
componentDidMount: function () {
compactionStore.on('change', this.onChange, this);
},
componentWillUnmount: function () {
compactionStore.off('change', this.onChange);
},
onChange: function () {
this.setState(this.getStoreState());
},
compactDatabase: function () {
Actions.compactDatabase(this.state.database);
},
cleanupView: function () {
Actions.cleanupViews(this.state.database);
},
render: function () {
return (
<div className="compaction-page flex-body">
<CompactDatabase isCompacting={this.state.isCompacting} compactDatabase={this.compactDatabase} />
<CleanView isCleaningView={this.state.isCleaningViews} cleanupView={this.cleanupView}/>
</div>
);
}
});
var ViewCompactionButton = React.createClass({
onClick: function (e) {
e.preventDefault();
Actions.compactView(this.props.database, this.props.designDoc);
},
getStoreState: function () {
return {
isCompactingView: compactionStore.isCompactingView()
};
},
getInitialState: function () {
return this.getStoreState();
},
componentDidMount: function () {
compactionStore.on('change', this.onChange, this);
},
componentWillUnmount: function () {
compactionStore.off('change', this.onChange);
},
onChange: function () {
this.setState(this.getStoreState());
},
render: function () {
var btnMsg = 'Compact View';
if (this.state.isCompactingView) {
btnMsg = 'Compacting View';
}
return (
<button disabled={this.state.isCompactingView}
className="btn btn-info pull-right"
onClick={this.onClick}>{btnMsg}</button>
);
}
});
return {
CompactDatabase: CompactDatabase,
CleanView: CleanView,
CompactionController: CompactionController,
ViewCompactionButton: ViewCompactionButton
};
});