Editorial Workflow skeleton

This commit is contained in:
Cássio Zen
2016-09-06 13:04:17 -03:00
parent b0e62d1ca9
commit f0e608a209
14 changed files with 139 additions and 26 deletions

View File

@ -0,0 +1,37 @@
import { Map, List, fromJS } from 'immutable';
import {
UNPUBLISHED_ENTRIES_REQUEST, UNPUBLISHED_ENTRIES_SUCCESS
} from '../actions/editorialWorkflow';
const unpublishedEntries = (state = Map({ entities: Map(), pages: Map() }), action) => {
switch (action.type) {
case UNPUBLISHED_ENTRIES_REQUEST:
return state.setIn(['pages', 'isFetching'], true);
case UNPUBLISHED_ENTRIES_SUCCESS:
const { entries, pages } = action.payload;
return state.withMutations((map) => {
entries.forEach((entry) => (
map.setIn(['entities', `${entry.metadata.status}.${entry.slug}`], fromJS(entry).set('isFetching', false))
));
map.set('pages', Map({
...pages,
ids: List(entries.map((entry) => entry.slug))
}));
});
default:
return state;
}
};
export const selectUnpublishedEntry = (state, status, slug) => (
state.getIn(['entities', `${status}.${slug}`], null)
);
export const selectUnpublishedEntries = (state, status) => {
const slugs = state.getIn(['pages', 'ids']);
return slugs && slugs.map((slug) => selectUnpublishedEntry(state, status, slug));
};
export default unpublishedEntries;

View File

@ -7,13 +7,16 @@ const entries = (state = Map({ entities: Map(), pages: Map() }), action) => {
switch (action.type) {
case ENTRY_REQUEST:
return state.setIn(['entities', `${action.payload.collection}.${action.payload.slug}`, 'isFetching'], true);
case ENTRY_SUCCESS:
return state.setIn(
['entities', `${action.payload.collection}.${action.payload.entry.slug}`],
fromJS(action.payload.entry)
);
case ENTRIES_REQUEST:
return state.setIn(['pages', action.payload.collection, 'isFetching'], true);
case ENTRIES_SUCCESS:
const { collection, entries, pages } = action.payload;
return state.withMutations((map) => {
@ -25,6 +28,7 @@ const entries = (state = Map({ entities: Map(), pages: Map() }), action) => {
ids: List(entries.map((entry) => entry.slug))
}));
});
default:
return state;
}

View File

@ -2,6 +2,7 @@ import auth from './auth';
import config from './config';
import editor from './editor';
import entries, * as fromEntries from './entries';
import editorialWorkflow, * as fromEditorialWorkflow from './editorialWorkflow';
import entryDraft from './entryDraft';
import collections from './collections';
import medias, * as fromMedias from './medias';
@ -12,18 +13,27 @@ const reducers = {
collections,
editor,
entries,
editorialWorkflow,
entryDraft,
medias
};
export default reducers;
/*
* Selectors
*/
export const selectEntry = (state, collection, slug) =>
fromEntries.selectEntry(state.entries, collection, slug);
export const selectEntries = (state, collection) =>
fromEntries.selectEntries(state.entries, collection);
export const selectUnpublishedEntry = (state, status, slug) =>
fromEditorialWorkflow.selectUnpublishedEntry(state.editorialWorkflow, status, slug);
export const selectUnpublishedEntries = (state, status) =>
fromEditorialWorkflow.selectUnpublishedEntries(state.editorialWorkflow, status);
export const getMedia = (state, path) =>
fromMedias.getMedia(state.medias, path);