blob: 06c1757f0d9b25ced32b5a22db2c35951ac6c803 [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 app from '../../app';
import FauxtonAPI from "../../core/api";
import ActionTypes from "./actiontypes";
import Resources from "./resources";
import Helpers from "../../helpers";
function loadDatabasesPerPage() {
let dbsPerPage = app.utils.localStorageGet('fauxton:dbs_per_page');
if (!dbsPerPage) {
dbsPerPage = FauxtonAPI.constants.MISC.DEFAULT_PAGE_SIZE;
}
return dbsPerPage;
}
const Database = Resources.Model;
const DatabasesStoreConstructor = FauxtonAPI.Store.extend({
initialize: function () {
this.reset();
},
reset: function () {
this._loading = false;
this._promptVisible = false;
this._page = 1;
this._limit = loadDatabasesPerPage();
this._dbList = [];
this._databaseDetails = [];
this._failedDbs = [];
this._fullDbList = [];
this._partitionedDatabasesAvailable = false;
},
getPage: function () {
return this._page;
},
getLimit: function () {
return this._limit;
},
setLimit: function (limit) {
this._limit = limit;
app.utils.localStorageSet('fauxton:dbs_per_page', limit);
},
isLoading: function () {
return this._loading;
},
setLoading: function (loading) {
this._loading = loading;
},
isPromptVisible: function () {
return this._promptVisible;
},
setPromptVisible: function (promptVisible) {
this._promptVisible = promptVisible;
},
obtainNewDatabaseModel: function (databaseName, partitioned) {
const dbModel = new Database({
id: databaseName,
name: databaseName
});
dbModel.setPartitioned(partitioned);
return dbModel;
},
doesDatabaseExist: function (databaseName) {
return this._dbList.indexOf(databaseName) !== -1;
},
getTotalAmountOfDatabases: function () {
return this._fullDbList.length;
},
getDbList: function () {
return this._dbList.map((db) => {
const allDetails = this._databaseDetails.filter((el) => { return el.db_name === db; });
const data = {
id: db,
encodedId: encodeURIComponent(db),
url: FauxtonAPI.urls('allDocsSanitized', 'app', db),
failed: this._failedDbs.indexOf(db) !== -1
};
const res = Object.assign({}, data, this._getDetails(allDetails[0]));
return res;
});
},
_getDetails: function (details) {
if (!details) {
return {};
}
const {sizes} = details;
const dataSize = (sizes && sizes.active) || (sizes && sizes.external) || details.data_size || 0;
return {
dataSize: Helpers.formatSize(dataSize),
docCount: details.doc_count,
docDelCount: details.doc_del_count,
showTombstoneWarning: details.doc_del_count > details.doc_count,
isPartitioned: details.props && details.props.partitioned === true
};
},
isPartitionedDatabasesAvailable: function () {
return this._partitionedDatabasesAvailable;
},
dispatch: function (action) {
switch (action.type) {
case ActionTypes.DATABASES_SETPAGE:
this._page = action.options.page;
break;
case ActionTypes.DATABASES_SETLIMIT:
this.setLimit(action.options.limit);
break;
case ActionTypes.DATABASES_SET_PROMPT_VISIBLE:
this.setPromptVisible(action.options.visible);
break;
case ActionTypes.DATABASES_STARTLOADING:
this.setLoading(true);
break;
case ActionTypes.DATABASES_LOADCOMPLETE:
this.setLoading(false);
break;
case ActionTypes.DATABASES_UPDATE:
this._fullDbList = action.options.fullDbList;
this._dbList = action.options.dbList;
this._databaseDetails = action.options.databaseDetails;
this._failedDbs = action.options.failedDbs;
this.setLoading(false);
break;
case ActionTypes.DATABASES_PARTITIONED_DB_AVAILABLE:
this._partitionedDatabasesAvailable = action.options.available;
break;
default:
return;
}
this.triggerChange();
}
});
const databasesStore = new DatabasesStoreConstructor();
databasesStore.dispatchToken = FauxtonAPI.dispatcher.register(databasesStore.dispatch.bind(databasesStore));
export default {
databasesStore: databasesStore,
DatabasesStoreConstructor: DatabasesStoreConstructor
};