unpublished items dashboard
This commit is contained in:
parent
04c50d8def
commit
b6874152d9
45
src/components/UnpublishedListing.js
Normal file
45
src/components/UnpublishedListing.js
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
|
import { Card } from './UI';
|
||||||
|
import { statusDescriptions } from '../constants/publishModes';
|
||||||
|
|
||||||
|
export default class UnpublishedListing extends React.Component {
|
||||||
|
renderColumn(entries) {
|
||||||
|
if (!entries) return;
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{entries.map(entry => {
|
||||||
|
return <Card key={entry.get('slug')}><h4>{entry.getIn(['data', 'title'])}</h4></Card>;
|
||||||
|
}
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { entries } = this.props;
|
||||||
|
const columns = entries.entrySeq().map(([key, currEntries]) => (
|
||||||
|
<div key={key}>
|
||||||
|
<h3>{statusDescriptions.get(key)}</h3>
|
||||||
|
{this.renderColumn(currEntries)}
|
||||||
|
</div>
|
||||||
|
));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{columns}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UnpublishedListing.propTypes = {
|
||||||
|
entries: ImmutablePropTypes.map,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h3>Drafts</h3>
|
||||||
|
<card>Cool Recipe</card>
|
||||||
|
</div>
|
@ -1,9 +1,12 @@
|
|||||||
import React, { PropTypes } from 'react';
|
import React, { PropTypes } from 'react';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
|
import { Map } from 'immutable';
|
||||||
import { init, loadUnpublishedEntries } from '../actions/editorialWorkflow';
|
import { init, loadUnpublishedEntries } from '../actions/editorialWorkflow';
|
||||||
import { selectUnpublishedEntries } from '../reducers';
|
import { selectUnpublishedEntries } from '../reducers';
|
||||||
import { EDITORIAL_WORKFLOW } from '../constants/publishModes';
|
import { EDITORIAL_WORKFLOW, status } from '../constants/publishModes';
|
||||||
|
import UnpublishedListing from '../components/UnpublishedListing';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
export default function EditorialWorkflow(WrappedComponent) {
|
export default function EditorialWorkflow(WrappedComponent) {
|
||||||
class EditorialWorkflow extends WrappedComponent {
|
class EditorialWorkflow extends WrappedComponent {
|
||||||
@ -18,12 +21,12 @@ export default function EditorialWorkflow(WrappedComponent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { isEditorialWorkflow } = this.props;
|
const { isEditorialWorkflow, unpublishedEntries } = this.props;
|
||||||
if (!isEditorialWorkflow) return super.render();
|
if (!isEditorialWorkflow) return super.render();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h2>HOC</h2>
|
<UnpublishedListing entries={unpublishedEntries}/>
|
||||||
{super.render()}
|
{super.render()}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -33,7 +36,7 @@ export default function EditorialWorkflow(WrappedComponent) {
|
|||||||
EditorialWorkflow.propTypes = {
|
EditorialWorkflow.propTypes = {
|
||||||
dispatch: PropTypes.func.isRequired,
|
dispatch: PropTypes.func.isRequired,
|
||||||
isEditorialWorkflow: PropTypes.bool.isRequired,
|
isEditorialWorkflow: PropTypes.bool.isRequired,
|
||||||
unpublishedEntries: ImmutablePropTypes.list,
|
unpublishedEntries: ImmutablePropTypes.map,
|
||||||
};
|
};
|
||||||
|
|
||||||
function mapStateToProps(state) {
|
function mapStateToProps(state) {
|
||||||
@ -42,7 +45,9 @@ export default function EditorialWorkflow(WrappedComponent) {
|
|||||||
const returnObj = { isEditorialWorkflow };
|
const returnObj = { isEditorialWorkflow };
|
||||||
|
|
||||||
if (isEditorialWorkflow) {
|
if (isEditorialWorkflow) {
|
||||||
returnObj.unpublishedEntries = selectUnpublishedEntries(state, 'draft');
|
returnObj.unpublishedEntries = _.reduce(status, (acc, currStatus) => {
|
||||||
|
return acc.set(currStatus, selectUnpublishedEntries(state, currStatus));
|
||||||
|
}, Map());
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnObj;
|
return returnObj;
|
||||||
|
@ -28,13 +28,22 @@ const unpublishedEntries = (state = null, action) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const selectUnpublishedEntry = (state, status, slug) => (
|
export const selectUnpublishedEntry = (state, status, slug) => (
|
||||||
state.getIn(['entities', `${status}.${slug}`], null)
|
state.getIn(['entities', `${status}.${slug}`])
|
||||||
);
|
);
|
||||||
|
|
||||||
export const selectUnpublishedEntries = (state, status) => {
|
export const selectUnpublishedEntries = (state, status) => {
|
||||||
if (!state) return;
|
if (!state) return;
|
||||||
const slugs = state.getIn(['pages', 'ids']);
|
const slugs = state.getIn(['pages', 'ids']);
|
||||||
return slugs && slugs.map((slug) => selectUnpublishedEntry(state, status, slug));
|
|
||||||
|
return slugs && slugs.reduce((acc, slug) => {
|
||||||
|
const entry = selectUnpublishedEntry(state, status, slug);
|
||||||
|
if (entry) {
|
||||||
|
return acc.push(entry);
|
||||||
|
} else {
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
}, List());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default unpublishedEntries;
|
export default unpublishedEntries;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user