blob: 663818fcae1472cb98fd7d20d0ab3582b63ca081 [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 ActionTypes from './actiontypes';
import Resources from "../resources";
const defaultMap = 'function (doc) {\n emit(doc._id, 1);\n}';
const defaultReduce = 'function (keys, values, rereduce) {\n if (rereduce) {\n return sum(values);\n } else {\n return values.length;\n }\n}';
const builtInReducers = ['_sum', '_count', '_stats'];
const initialState = {
designDocs: new Backbone.Collection(),
isLoading: true,
view: { reduce: '', map: defaultMap },
database: { id: '0' },
designDocId: '',
isNewDesignDoc: false,
newDesignDocName: '',
isNewView: false,
viewName: '',
originalViewName: '',
originalDesignDocName: '',
reduceOptions: builtInReducers.concat(['CUSTOM', 'NONE'])
};
function editIndex(state, options) {
const newState = {
...state,
isLoading: false,
newDesignDocName: '',
isNewView: options.isNewView,
viewName: options.viewName || 'viewName',
isNewDesignDoc: options.isNewDesignDoc || false,
designDocs: options.designDocs,
designDocId: options.designDocId,
originalDesignDocName: options.designDocId,
database: options.database
};
newState.originalViewName = newState.viewName;
newState.view = getView(newState);
return newState;
}
function getView(state) {
if (state.isNewView || state.isNewDesignDoc) {
return { reduce: '', map: defaultMap };
}
const designDoc = state.designDocs.find(ddoc => {
return state.designDocId == ddoc.id;
}).dDocModel();
return designDoc.get('views')[state.viewName];
}
export function reduceSelectedOption(state) {
if (!state.view.reduce) {
return 'NONE';
}
if (hasCustomReduce(state)) {
return 'CUSTOM';
}
return state.view.reduce;
}
export function hasCustomReduce(state) {
if (state.view.reduce) {
return !builtInReducers.includes(state.view.reduce);
}
return false;
}
export function getSaveDesignDoc(state) {
if (state.designDocId === 'new-doc') {
const doc = {
_id: '_design/' + state.newDesignDocName,
views: {},
language: 'javascript'
};
return new Resources.Doc(doc, { database: state.database });
}
if (!state.designDocs) {
return null;
}
const foundDoc = state.designDocs.find(ddoc => {
return ddoc.id === state.designDocId;
});
return foundDoc ? foundDoc.dDocModel() : null;
}
// returns a simple array of design doc IDs. Omits mango docs
export function getDesignDocIds(state) {
if (!state.designDocs) {
return [];
}
return state.designDocs.filter(doc => {
return !doc.isMangoDoc();
}).map(doc => {
return doc.id;
});
}
export default function indexEditor(state = initialState, action) {
const { options } = action;
switch (action.type) {
case ActionTypes.CLEAR_INDEX:
return {
...initialState
};
case ActionTypes.EDIT_INDEX:
return editIndex(state, options);
case ActionTypes.EDIT_NEW_INDEX:
return editIndex(state, options);
case ActionTypes.VIEW_NAME_CHANGE:
return {
...state,
viewName: action.name
};
case ActionTypes.SELECT_REDUCE_CHANGE:
let newReduce = action.reduceSelectedOption;
if (newReduce === 'NONE') {
newReduce = '';
}
if (newReduce === 'CUSTOM') {
newReduce = defaultReduce;
}
return {
...state,
view: {
...state.view,
reduce: newReduce
}
};
case ActionTypes.DESIGN_DOC_CHANGE:
return {
...state,
designDocId: options.value
};
case ActionTypes.VIEW_SAVED:
return state;
case ActionTypes.VIEW_CREATED:
return state;
case ActionTypes.VIEW_ADD_DESIGN_DOC:
return {
...state,
designDocId: action.designDoc._id
};
case ActionTypes.VIEW_UPDATE_MAP_CODE:
return {
...state,
view: {
...state.view,
map: action.code
}
};
case ActionTypes.VIEW_UPDATE_REDUCE_CODE:
return {
...state,
view: {
...state.view,
reduce: action.code
}
};
case ActionTypes.DESIGN_DOC_NEW_NAME_UPDATED:
return {
...state,
newDesignDocName: options.value
};
default:
return state;
}
}