blob: a578067e47bf3de37c9928e1634b8fe6829ad9a0 [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 FauxtonAPI from '../../core/api';
import Resources from './resources';
import SearchActions from './actions';
import DatabasesActions from '../databases/actions';
import Databases from '../databases/base';
import BaseRoute from '../documents/shared-routes';
import SidebarActions from '../documents/sidebar/actions';
import Actions from './actions';
import Layout from './layout';
import React from 'react';
import {SidebarItemSelection} from '../documents/sidebar/helpers';
var SearchRouteObject = BaseRoute.extend({
routes: {
'database/:database/_design/:ddoc/_search/:search(?*searchQuery)': {
route: 'searchNoPartition',
roles: ['fx_loggedIn']
},
'database/:database/_partition/:partitionkey/_design/:ddoc/_search/:search(?*searchQuery)': {
route: 'search',
roles: ['fx_loggedIn']
},
'database/:database/_design/:ddoc/_indexes/:search(?*searchQuery)': {
route: 'searchNoPartition',
roles: ['fx_loggedIn']
},
'database/:database/_partition/:partitionkey/_design/:ddoc/_indexes/:search(?*searchQuery)': {
route: 'search',
roles: ['fx_loggedIn']
},
'database/:database/_design/:ddoc/_search/:search/edit': {
route: 'editNoPartition',
roles: ['fx_loggedIn']
},
'database/:database/_partition/:partitionkey/_design/:ddoc/_search/:search/edit': {
route: 'edit',
roles: ['fx_loggedIn']
},
'database/:database/new_search': 'createNoPartition',
'database/:database/_partition/:partitionkey/new_search': 'create',
'database/:database/new_search/:designDoc': 'createNoPartition',
'database/:database/_partition/:partitionkey/new_search/:designDoc': 'create'
},
initialize: function (route, options) {
this.databaseName = options[0];
this.database = new Databases.Model({ id: this.databaseName });
this.data = {
database: new Databases.Model({ id: this.databaseName })
};
this.data.designDocs = new Resources.AllDocs(null, {
database: this.data.database,
params: {
startkey: '"_design"',
endkey: '"_design1"',
include_docs: true
}
});
SidebarActions.dispatchNewOptions({
database: this.data.database,
designDocs: this.data.designDocs
});
},
searchNoPartition: function (databaseName, ddocName, indexName, query) {
return this.search(databaseName, '', ddocName, indexName, query);
},
search: function (databaseName, partitionKey, ddocName, indexName, query) {
this.databaseName = databaseName;
this.ddocName = ddocName;
this.indexName = indexName;
const selectedNavItem = new SidebarItemSelection('designDoc', {
designDocName: ddocName,
designDocSection: 'Search Indexes',
indexName: indexName
});
SidebarActions.dispatchExpandSelectedItem(selectedNavItem);
const dropDownLinks = this.getCrumbs(this.database);
Actions.dispatchInitSearchIndex({
databaseName: databaseName,
partitionKey: partitionKey,
designDoc: ddocName,
indexName: indexName,
query: query
});
DatabasesActions.fetchSelectedDatabaseInfo(databaseName);
const encodedPartKey = partitionKey ? encodeURIComponent(partitionKey) : '';
const endpointUrl = FauxtonAPI.urls('search', 'apiurl', this.databaseName, encodedPartKey, this.ddocName,
this.indexName, (query ? query : '*:*'));
const encodedQuery = query ? `?${encodeURIComponent(query)}` : '';
const navigateToPartitionedView = (partKey) => {
const baseUrl = FauxtonAPI.urls('partitioned_search', 'app', encodeURIComponent(databaseName),
encodeURIComponent(partKey), encodeURIComponent(ddocName));
FauxtonAPI.navigate('#/' + baseUrl + encodeURIComponent(indexName) + encodedQuery);
};
const navigateToGlobalView = () => {
const baseUrl = FauxtonAPI.urls('search', 'app', encodeURIComponent(databaseName), encodeURIComponent(ddocName));
FauxtonAPI.navigate('#/' + baseUrl + encodeURIComponent(indexName) + encodedQuery);
};
return <Layout
section={'search'}
dropDownLinks={dropDownLinks}
endpoint={endpointUrl}
docURL={FauxtonAPI.constants.DOC_URLS.SEARCH_INDEXES}
database={this.database}
indexName={indexName}
selectedNavItem={selectedNavItem}
partitionKey={partitionKey}
onPartitionKeySelected={navigateToPartitionedView}
onGlobalModeSelected={navigateToGlobalView}
globalMode={partitionKey === ''}
/>;
},
editNoPartition: function (database, ddocName, indexName) {
return this.edit(database, '', ddocName, indexName);
},
edit: function (database, partitionKey, ddocName, indexName) {
const selectedNavItem = new SidebarItemSelection('designDoc', {
designDocName: ddocName,
designDocSection: 'Search Indexes',
indexName: indexName
});
SidebarActions.dispatchExpandSelectedItem(selectedNavItem);
SearchActions.dispatchEditSearchIndex({
ddocID: '_design/' + ddocName,
database: this.database,
indexName: indexName,
designDocs: this.data.designDocs
});
DatabasesActions.fetchSelectedDatabaseInfo(database);
const dropDownLinks = this.getCrumbs(this.database);
return <Layout
section={'edit'}
dropDownLinks={dropDownLinks}
database={this.database}
indexName={indexName}
ddocName={ddocName}
selectedNavItem={selectedNavItem}
partitionKey={partitionKey}
/>;
},
createNoPartition: function (database, ddoc) {
return this.create(database, '', ddoc);
},
create: function (database, partitionKey, ddoc) {
const selectedNavItem = new SidebarItemSelection('');
SearchActions.dispatchInitNewSearchIndex({
database: this.database,
designDocs: this.data.designDocs,
defaultDDoc: ddoc,
});
DatabasesActions.fetchSelectedDatabaseInfo(database);
const dropDownLinks = this.getCrumbs(this.database);
return <Layout
section={'create'}
dropDownLinks={dropDownLinks}
database={this.database}
designDocs={this.data.designDocs}
ddoc={ddoc}
selectedNavItem={selectedNavItem}
partitionKey={partitionKey}
/>;
},
getCrumbs: function (database) {
return [
{ type: "back", link: "/_all_dbs"},
{ name: database.id }
];
}
});
Resources.RouteObjects = [SearchRouteObject];
export default Resources;