2016-11-25 23:09:17 +00:00
|
|
|
import {createSelector} from 'reselect';
|
2016-11-26 08:29:16 +00:00
|
|
|
|
2016-11-25 23:09:17 +00:00
|
|
|
// ~~~~~~~~~ //
|
|
|
|
// Selectors //
|
|
|
|
// ~~~~~~~~~ //
|
|
|
|
|
|
|
|
export const selectEntitiesLists = createSelector(
|
|
|
|
state => state.entities,
|
|
|
|
entities => {
|
|
|
|
const entitiesLists = {};
|
|
|
|
|
|
|
|
for (const k of Object.keys(entities)) {
|
|
|
|
const entityMap = entities[k];
|
|
|
|
entitiesLists[k] = Object.keys(entityMap).map(id => entityMap[id]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return entitiesLists;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
export const selectActiveWorkspace = createSelector(
|
|
|
|
state => selectEntitiesLists(state).workspaces,
|
|
|
|
state => state.entities,
|
|
|
|
state => state.global.activeWorkspaceId,
|
|
|
|
(workspaces, entities, activeWorkspaceId) => {
|
|
|
|
return entities.workspaces[activeWorkspaceId] || workspaces[0];
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2017-02-01 03:01:27 +00:00
|
|
|
export const selectActiveWorkspaceMeta = createSelector(
|
|
|
|
selectActiveWorkspace,
|
|
|
|
selectEntitiesLists,
|
|
|
|
(activeWorkspace, entities) => {
|
|
|
|
const id = activeWorkspace ? activeWorkspace._id : 'n/a';
|
|
|
|
return entities.workspaceMetas.find(m => m.parentId === id);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2016-11-25 23:09:17 +00:00
|
|
|
export const selectRequestsAndRequestGroups = createSelector(
|
|
|
|
selectEntitiesLists,
|
|
|
|
entities => [...entities.requests, ...entities.requestGroups]
|
|
|
|
);
|
|
|
|
|
2016-12-01 01:50:59 +00:00
|
|
|
export const selectCollapsedRequestGroups = createSelector(
|
|
|
|
selectEntitiesLists,
|
|
|
|
entities => {
|
|
|
|
const collapsed = {};
|
2017-06-15 17:08:24 +00:00
|
|
|
|
|
|
|
// Default all to collapsed
|
|
|
|
for (const requestGroup of entities.requestGroups) {
|
|
|
|
collapsed[requestGroup._id] = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update those that have metadata (not all do)
|
2016-12-01 01:50:59 +00:00
|
|
|
for (const meta of entities.requestGroupMetas) {
|
2017-06-15 17:08:24 +00:00
|
|
|
collapsed[meta.parentId] = meta.collapsed;
|
2016-12-01 01:50:59 +00:00
|
|
|
}
|
2017-06-15 17:08:24 +00:00
|
|
|
|
2016-12-01 01:50:59 +00:00
|
|
|
return collapsed;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2016-11-25 23:09:17 +00:00
|
|
|
export const selectSidebarChildren = createSelector(
|
2016-12-01 01:50:59 +00:00
|
|
|
selectCollapsedRequestGroups,
|
2016-11-25 23:09:17 +00:00
|
|
|
selectRequestsAndRequestGroups,
|
|
|
|
selectActiveWorkspace,
|
2017-02-01 03:01:27 +00:00
|
|
|
selectActiveWorkspaceMeta,
|
|
|
|
(collapsed, requestsAndRequestGroups, activeWorkspace, activeWorkspaceMeta) => {
|
2017-02-02 15:04:51 +00:00
|
|
|
const sidebarFilter = activeWorkspaceMeta ? activeWorkspaceMeta.sidebarFilter : '';
|
2017-02-01 03:01:27 +00:00
|
|
|
|
2016-11-25 23:09:17 +00:00
|
|
|
function next (parentId) {
|
2016-12-01 01:50:59 +00:00
|
|
|
const children = requestsAndRequestGroups
|
2016-11-25 23:09:17 +00:00
|
|
|
.filter(e => e.parentId === parentId)
|
|
|
|
.sort((a, b) => {
|
|
|
|
if (a.metaSortKey === b.metaSortKey) {
|
|
|
|
return a._id > b._id ? -1 : 1;
|
|
|
|
} else {
|
|
|
|
return a.metaSortKey < b.metaSortKey ? -1 : 1;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
if (children.length > 0) {
|
|
|
|
return children.map(c => ({
|
|
|
|
doc: c,
|
2017-02-01 03:01:27 +00:00
|
|
|
children: next(c._id),
|
|
|
|
hidden: false,
|
2017-03-03 20:09:08 +00:00
|
|
|
collapsed: !!collapsed[c._id]
|
2016-11-25 23:09:17 +00:00
|
|
|
}));
|
|
|
|
} else {
|
|
|
|
return children;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-01 03:01:27 +00:00
|
|
|
function matchChildren (children, parentNames = []) {
|
|
|
|
// Bail early if no filter defined
|
|
|
|
if (!sidebarFilter) {
|
|
|
|
return children;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const child of children) {
|
|
|
|
// Gather all parents so we can match them too
|
|
|
|
matchChildren(child.children, [...parentNames, child.doc.name]);
|
|
|
|
|
|
|
|
const hasMatchedChildren = child.children.find(c => c.hidden === false);
|
|
|
|
|
|
|
|
// Build the monster string to match on
|
|
|
|
const method = child.doc.method || '';
|
|
|
|
const name = child.doc.name;
|
|
|
|
const toMatch = `${method}❅${name}❅${parentNames.join('❅')}`.toLowerCase();
|
|
|
|
|
|
|
|
// Try to match name
|
|
|
|
let hasMatchedName = true;
|
|
|
|
for (const token of sidebarFilter.trim().toLowerCase().split(' ')) {
|
|
|
|
// Filter failed. Don't render children
|
|
|
|
if (toMatch.indexOf(token) === -1) {
|
|
|
|
hasMatchedName = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update hidden state depending on whether it matched
|
|
|
|
const matched = hasMatchedChildren || hasMatchedName;
|
|
|
|
child.hidden = !matched;
|
|
|
|
}
|
|
|
|
|
|
|
|
return children;
|
|
|
|
}
|
|
|
|
|
|
|
|
const childrenTree = next(activeWorkspace._id, false);
|
|
|
|
return matchChildren(childrenTree);
|
2016-11-25 23:09:17 +00:00
|
|
|
}
|
|
|
|
);
|
2016-11-26 07:33:55 +00:00
|
|
|
|
|
|
|
export const selectWorkspaceRequestsAndRequestGroups = createSelector(
|
|
|
|
selectActiveWorkspace,
|
|
|
|
selectEntitiesLists,
|
|
|
|
(activeWorkspace, entities) => {
|
|
|
|
function getChildren (doc) {
|
|
|
|
const requests = entities.requests.filter(r => r.parentId === doc._id);
|
|
|
|
const requestGroups = entities.requestGroups.filter(rg => rg.parentId === doc._id);
|
|
|
|
const requestGroupChildren = [];
|
|
|
|
|
|
|
|
for (const requestGroup of requestGroups) {
|
|
|
|
for (const requestGroupChild of getChildren(requestGroup)) {
|
|
|
|
requestGroupChildren.push(requestGroupChild);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return [...requests, ...requestGroups, ...requestGroupChildren];
|
|
|
|
}
|
|
|
|
|
|
|
|
return getChildren(activeWorkspace);
|
|
|
|
}
|
|
|
|
);
|
2016-12-01 01:50:59 +00:00
|
|
|
|
|
|
|
export const selectActiveRequest = createSelector(
|
|
|
|
state => state.entities,
|
|
|
|
selectActiveWorkspaceMeta,
|
|
|
|
(entities, workspaceMeta) => {
|
|
|
|
const id = workspaceMeta ? workspaceMeta.activeRequestId : 'n/a';
|
|
|
|
return entities.requests[id] || null;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2017-03-23 22:10:42 +00:00
|
|
|
export const selectActiveOAuth2Token = createSelector(
|
|
|
|
selectEntitiesLists,
|
|
|
|
selectActiveWorkspaceMeta,
|
|
|
|
(entities, workspaceMeta) => {
|
|
|
|
const id = workspaceMeta ? workspaceMeta.activeRequestId : 'n/a';
|
|
|
|
return entities.oAuth2Tokens.find(t => t.parentId === id);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2016-12-01 01:50:59 +00:00
|
|
|
export const selectActiveRequestMeta = createSelector(
|
|
|
|
selectActiveRequest,
|
|
|
|
selectEntitiesLists,
|
|
|
|
(activeRequest, entities) => {
|
|
|
|
const id = activeRequest ? activeRequest._id : 'n/a';
|
|
|
|
return entities.requestMetas.find(m => m.parentId === id);
|
|
|
|
}
|
|
|
|
);
|
2017-07-17 18:20:38 +00:00
|
|
|
|
|
|
|
export const selectActiveRequestResponses = createSelector(
|
|
|
|
selectActiveRequest,
|
|
|
|
selectEntitiesLists,
|
|
|
|
(activeRequest, entities) => {
|
|
|
|
const requestId = activeRequest ? activeRequest._id : 'n/a';
|
|
|
|
return entities.responses
|
|
|
|
.filter(response => requestId === response.parentId)
|
|
|
|
.sort((a, b) => a.created > b.created ? -1 : 1);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
export const selectActiveResponse = createSelector(
|
|
|
|
selectActiveRequestMeta,
|
|
|
|
selectActiveRequestResponses,
|
|
|
|
(activeRequestMeta, responses) => {
|
|
|
|
const activeResponseId = activeRequestMeta ? activeRequestMeta.activeResponseId : 'n/a';
|
|
|
|
const activeResponse = responses.find(response => response._id === activeResponseId);
|
|
|
|
|
|
|
|
if (activeResponse) {
|
|
|
|
return activeResponse;
|
|
|
|
}
|
|
|
|
|
|
|
|
return responses[0] || null;
|
|
|
|
}
|
|
|
|
);
|