application/redux/reducers/workflow-section-reducers.js
import _ from 'lodash';
import Immutable from 'immutable';
import {
WORKFLOW_SECTIONS_REQUEST,
WORKFLOW_SECTIONS_RECEIVE,
WORKFLOW_SECTION_RECEIVE,
WORKFLOW_SECTIONS_INVALIDATE,
WORKFLOW_SECTION_SELECTED,
WORKFLOW_SECTIONS_FILTER_WEBONLY,
WORKFLOW_SECTIONS_FILTER_PRINTONLY
} from './../actions/workflow-section-actions';
export function workflowSections(state = null, action) {
if (state === null) {
state = {
isFetching: false,
didInvalidate: false,
items: Immutable.fromJS({}),
selected: false,
order: "name",
dir: "asc",
filters: {
webOnly: Immutable.fromJS({}),
printOnly: Immutable.fromJS({})
}
};
}
let newState;
switch (action.type) {
case WORKFLOW_SECTIONS_FILTER_WEBONLY:
// little expanation, filter -> sort -> map:
let _wo_filtered = state.items.filter((item) => {
// we only want web workflowSections
return parseInt(item.get('is_web')) === 1;
}).sort((a, b) => {
// and we sort by priority
if (parseInt(a.get('priority')) > parseInt(b.get('priority'))) {
return 1;
} else if (parseInt(a.get('priority')) < parseInt(b.get('priority'))) {
return -1;
}
return 0;
}).map((item) => {
/*
then only return the UUID
we'll use that to fetch the workflow
from the workflows.items iterable
check content-item.js:533 (line starts with {this.props.workflows.filters.webOnly.map((id, i) => {)
for info on how this works in the real world
*/
return item.get('uuid');
});
return Object.assign({}, state, {
filters: Object.assign({}, state.filters, {
webOnly: _wo_filtered
})
});
case WORKFLOW_SECTIONS_FILTER_PRINTONLY:
let _po_filtered = state.items.filter((item) => {
return parseInt(item.get('is_print')) === 1;
}).sort((a, b) => {
if (parseInt(a.get('priority')) > parseInt(b.get('priority'))) {
return 1;
} else if (parseInt(a.get('priority')) < parseInt(b.get('priority'))) {
return -1;
}
return 0;
}).map((item) => {
return item.get('uuid');
});
return Object.assign({}, state, {
filters: Object.assign({}, state.filters, {
printOnly: _po_filtered
})
});
case WORKFLOW_SECTIONS_INVALIDATE:
return Object.assign({}, state, {
didInvalidate: true,
});
case WORKFLOW_SECTIONS_REQUEST:
return Object.assign({}, state, {
isFetching: true,
didInvalidate: false
});
case WORKFLOW_SECTION_SELECTED: {
return Object.assign({}, state, {
selected: action.payload.selected
});
}
case WORKFLOW_SECTION_RECEIVE:
const workflowSection = action.payload.workflowSection;
const workflowSections = state.items.map((item, i) => {
if (item.get('uuid') == workflowSection.get('uuid')) {
return workflowSection;
}
return item;
});
action.payload.workflowSections = Immutable.fromJS(workflowSections);
case WORKFLOW_SECTIONS_RECEIVE:
return Object.assign({}, state, {
isFetching: false,
didInvalidate: false,
items: action.payload.workflowSections
});
}
return state;
};