blob: 3e9f9143bdb5b312003f5dcec3c538714edfe27a [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 React from 'react';
import FauxtonAPI from '../../core/api';
import BaseRoute from './shared-routes';
import DatabaseActions from '../databases/actions';
import Databases from '../databases/base';
import Resources from './resources';
import {SidebarItemSelection} from './sidebar/helpers';
import ComponentsActions from '../components/actions';
import {DocsTabsSidebarLayout, ViewsTabsSidebarLayout, ChangesSidebarLayout} from './layouts';
var DocumentsRouteObject = BaseRoute.extend({
routes: {
"database/:database/_partition/:partitionkey/_all_docs": {
route: "partitionedAllDocs",
roles: ["fx_loggedIn"]
},
"database/:database/_all_docs(:extra)": {
route: "globalAllDocs",
roles: ["fx_loggedIn"]
},
"database/:database/_partition/:partitionkey/_design/:ddoc/_info": {
route: "designDocMetadata",
roles: ['fx_loggedIn']
},
"database/:database/_design/:ddoc/_info": {
route: "designDocMetadataNoPartition",
roles: ['fx_loggedIn']
},
'database/:database/_partition/:partitionKey/_changes': {
route: 'changes',
roles: ['fx_loggedIn']
},
'database/:database/_changes': {
route: 'changes',
roles: ['fx_loggedIn']
}
},
initialize (route, options) {
this.initViews(options[0]);
},
initViews: function (dbName) {
this.databaseName = dbName;
this.database = new Databases.Model({id: this.databaseName});
this.createDesignDocsCollection();
this.addSidebar();
},
designDocMetadataNoPartition: function (database, ddoc) {
return this.designDocMetadata(database, '', ddoc);
},
designDocMetadata: function (database, partitionKey, ddoc) {
const designDocInfo = new Resources.DdocInfo({ _id: "_design/" + ddoc }, { database: this.database });
const selectedNavItem = new SidebarItemSelection('designDoc', {
designDocName: ddoc,
designDocSection: 'metadata'
});
DatabaseActions.fetchSelectedDatabaseInfo(database);
const dropDownLinks = this.getCrumbs(this.database);
return <ViewsTabsSidebarLayout
showEditView={false}
docURL={designDocInfo.documentation()}
endpoint={designDocInfo.url('apiurl')}
dbName={this.database.id}
dropDownLinks={dropDownLinks}
database={this.database}
selectedNavItem={selectedNavItem}
designDocInfo={designDocInfo}
partitionKey={partitionKey}
/>;
},
globalAllDocs: function (databaseName, options) {
return this.allDocs(databaseName, '', options);
},
partitionedAllDocs: function (databaseName, partitionKey) {
return this.allDocs(databaseName, partitionKey);
},
/*
* docParams are the options fauxton uses to fetch from the server
* urlParams are what are shown in the url and to the user
* They are not the same when paginating
*/
allDocs: function (databaseName, partitionKey, options) {
const params = this.createParams(options);
const docParams = params.docParams;
const url = partitionKey ?
FauxtonAPI.urls('partitioned_allDocs', 'server', encodeURIComponent(databaseName), encodeURIComponent(partitionKey)) :
FauxtonAPI.urls('allDocsSanitized', 'server', databaseName);
// this is used for the header and sidebar
this.database.buildAllDocs(docParams);
const onlyShowDdocs = !!(docParams.startkey && docParams.startkey.indexOf("_design") > -1);
let tab = 'all-docs';
if (onlyShowDdocs) {
tab = 'design-docs';
}
const selectedNavItem = new SidebarItemSelection(tab);
ComponentsActions.showDeleteDatabaseModal({showDeleteModal: false, dbId: ''});
const endpoint = partitionKey ?
FauxtonAPI.urls('partitioned_allDocs', 'apiurl', encodeURIComponent(databaseName), encodeURIComponent(partitionKey)) :
this.database.allDocs.urlRef("apiurl", {});
const docURL = FauxtonAPI.constants.DOC_URLS.GENERAL;
const navigateToPartitionedAllDocs = (partKey) => {
const baseUrl = FauxtonAPI.urls('partitioned_allDocs', 'app', encodeURIComponent(databaseName),
encodeURIComponent(partKey));
FauxtonAPI.navigate('#/' + baseUrl);
};
const navigateToGlobalAllDocs = () => {
const baseUrl = FauxtonAPI.urls('allDocs', 'app', encodeURIComponent(databaseName));
FauxtonAPI.navigate('#/' + baseUrl);
};
const dropDownLinks = this.getCrumbs(this.database);
DatabaseActions.fetchSelectedDatabaseInfo(databaseName);
return <DocsTabsSidebarLayout
docURL={docURL}
endpoint={endpoint}
dbName={this.database.id}
dropDownLinks={dropDownLinks}
database={this.database}
designDocs={this.designDocs}
fetchUrl={url}
ddocsOnly={onlyShowDdocs}
selectedNavItem={selectedNavItem}
partitionKey={partitionKey}
onPartitionKeySelected={navigateToPartitionedAllDocs}
onGlobalModeSelected={navigateToGlobalAllDocs}
globalMode={partitionKey === ''}
/>;
},
changes: function (databaseName, partitionKey) {
const selectedNavItem = new SidebarItemSelection('changes');
DatabaseActions.fetchSelectedDatabaseInfo(databaseName);
return <ChangesSidebarLayout
endpoint={FauxtonAPI.urls('changes', 'apiurl', this.database.id, '')}
docURL={this.database.documentation()}
dbName={this.database.id}
dropDownLinks={this.getCrumbs(this.database)}
database={this.database}
selectedNavItem={selectedNavItem}
partitionKey={partitionKey}
/>;
}
});
export default DocumentsRouteObject;