Skip to content
Snippets Groups Projects
Commit 95425049 authored by Yannis Barlas's avatar Yannis Barlas
Browse files

Merge branch 'multiple-rounds' into 'master'

Multiple rounds

See merge request xpub!97
parents ad276f15 3b5255f3
No related branches found
No related tags found
No related merge requests found
Showing
with 176 additions and 95 deletions
......@@ -43,6 +43,7 @@ const Dashboard = ({
{dashboard.owner.map(project => (
<OwnerItemWithVersion
deleteProject={() =>
// eslint-disable-next-line no-alert
window.confirm(
'Are you sure you want to delete this submission?',
) && deleteProject(project)
......
......@@ -16,7 +16,8 @@
color: var(--color-primary);
font-family: Vollkorn, serif;
font-size: 1.6em;
margin: 4em 0 2em;
// margin: 4em 0 2em;
margin: 1em 0 1em;
text-transform: uppercase;
}
......@@ -26,7 +27,7 @@
}
.section:not(:last-of-type) {
margin-bottom: 20px;
margin-bottom: 70px;
}
a {
......
......@@ -29,40 +29,46 @@ export default compose(
connect(
state => {
const { collections } = state
const { conversion, teams } = state
// const { conversion, teams } = state
const { conversion } = state
const currentUser = selectCurrentUser(state)
const sortedCollections = newestFirst(collections)
const unassignedCollections = sortedCollections.filter(
collection =>
collection.status === 'submitted' &&
!teams.some(
team =>
team.object.type === 'collection' &&
team.object.id === collection.id &&
team.teamType.name === 'handlingEditor',
),
)
const myCollections = teams
.filter(
team =>
team.group === 'editor' &&
team.object.type === 'collection' &&
team.members.includes(currentUser.id),
)
.map(team =>
collections.find(collection => collection.id === team.object.id),
)
// const unassignedCollections = sortedCollections.filter(
// collection =>
// collection.status === 'submitted' &&
// !teams.some(
// team =>
// team.object.type === 'collection' &&
// team.object.id === collection.id &&
// team.teamType.name === 'handlingEditor',
// ),
// )
// const myCollections = teams
// .filter(
// team =>
// team.group === 'editor' &&
// team.object.type === 'collection' &&
// team.members.includes(currentUser.id),
// )
// .map(team =>
// collections.find(collection => collection.id === team.object.id),
// )
const dashboard = {
editor: newestFirst(
unassignedCollections
.concat(myCollections)
.filter(
(collection, index, items) =>
items.findIndex(item => item.id === collection.id) === index,
),
// editor: newestFirst(
// unassignedCollections
// .concat(myCollections)
// .filter(
// (collection, index, items) =>
// items.findIndex(item => item.id === collection.id) === index,
// ),
// ),
editor: sortedCollections.filter(
collection =>
collection.status === 'submitted' ||
collection.status === 'revising',
),
owner: sortedCollections.filter(
collection =>
......
......@@ -8,7 +8,9 @@ const labels = {
assignedToEditor: 'Assigned to editor',
assigningReviewers: 'Assigning reviewers',
new: 'Unsubmitted',
rejected: 'Rejected',
submitted: 'Submitted',
revising: 'Under Revision',
}
const Status = ({ status }) => (
......
......@@ -11,6 +11,39 @@ import classes from './Item.local.scss'
import Reviews from '../Reviews'
import VersionTitle from './VersionTitle'
const Actions = ({ project, version }) => {
if (project.status === 'revising') return null
return (
<div className={classes.links}>
<div className={classes.link}>
{(!version.decision ||
version.decision.status !== 'revising' ||
version.decision.status !== 'submitted') && (
<span>
<ProjectLink page="reviewers" project={project} version={version}>
Assign Reviewers
</ProjectLink>
<Divider separator="|" />
</span>
)}
<ProjectLink
id={project.id}
page="decisions"
project={project}
version={version}
>
{version.decision && version.decision.status === 'submitted'
? `Decision: ${version.decision.recommendation}`
: 'Make decision'}
</ProjectLink>
</div>
</div>
)
}
const EditorItem = ({ AssignEditor, project, version, addUserToTeam }) => (
<div className={classes.root}>
<div className={classes.header}>
......@@ -31,32 +64,7 @@ const EditorItem = ({ AssignEditor, project, version, addUserToTeam }) => (
<div className={classes.main}>
<VersionTitle className={classes.versionTitle} version={version} />
<div className={classes.links}>
<div className={classes.link}>
{(!version.decision || version.decision.status !== 'submitted') && (
<span>
<ProjectLink page="reviewers" project={project} version={version}>
Assign Reviewers
</ProjectLink>
<Divider separator="|" />
</span>
)}
<ProjectLink
id={project.id}
page="decisions"
project={project}
version={version}
>
{version.decision && version.decision.status === 'submitted'
? `Decision: ${version.decision.recommendation}`
: 'Make decision'}
</ProjectLink>
</div>
</div>
<Actions project={project} version={version} />
<div className={classes.actions} />
</div>
......
......@@ -56,7 +56,7 @@ const handleDecision = (project, version) => dispatch =>
actions.updateCollection({
id: project.id,
rev: project.rev,
status: 'revise',
status: 'revising',
}),
).then(() =>
dispatch(
......
......@@ -9,13 +9,19 @@ import ReviewMetadata from '../metadata/ReviewMetadata'
import Decision from './Decision'
import Tabs from '../tabs/Tabs'
// TODO -- is passing arrays of react components as props an ok practice?
/*
TODO -- should we make an editor for each tab, or should we just rerender
the same one with different content?
*/
const DecisionLayout = ({
project,
versions,
currentVersion,
valid,
handleSubmit,
project,
uploadFile,
valid,
versions,
}) => {
const decisionSections = []
const editorSections = []
......@@ -43,7 +49,12 @@ const DecisionLayout = ({
editorSections.push({
content: (
<SimpleEditor content={version.source} layout="bare" readOnly />
<SimpleEditor
content={version.source}
key={key}
layout="bare"
readOnly
/>
),
key,
label,
......@@ -77,7 +88,12 @@ const DecisionLayout = ({
editorSections.push({
content: (
<SimpleEditor content={currentVersion.source} layout="bare" readOnly />
<SimpleEditor
content={currentVersion.source}
key={key}
layout="bare"
readOnly
/>
),
key,
label,
......
......@@ -4,39 +4,71 @@ import { withJournal } from 'xpub-journal'
import Review from '../review/Review'
import classes from './DecisionReview.local.scss'
const DecisionReview = ({ review, reviewer, journal, open, toggleOpen }) => (
<div>
<div className={classes.heading}>
<span
className={classes.indicator}
style={{
backgroundColor: review.recommendation
? journal.recommendations.find(
item => item.value === review.recommendation,
).color
: 'black',
}}
/>
const ToggleReview = ({ open, toggle }) => (
<button className={classes.toggle} onClick={toggle}>
{open ? 'Hide' : 'Show'}
</button>
)
<span className={classes.ordinal}>Review {reviewer.ordinal}</span>
const Bullet = ({ journal, recommendation }) => {
const recommendationColor = journal.recommendations.find(
item => item.value === recommendation,
).color
<span className={classes.name}>{reviewer.name || 'Anonymous'}</span>
return (
<span
className={classes.indicator}
style={{
backgroundColor: recommendation ? recommendationColor : 'black',
}}
/>
)
}
<span className={classes.dots} />
const ReviewHeading = ({
journal,
name,
open,
ordinal,
recommendation,
toggleOpen,
}) => (
<div className={classes.heading}>
<Bullet journal={journal} recommendation={recommendation} />
<button className={classes.toggle} onClick={toggleOpen}>
{open ? 'Hide' : 'Show'}
</button>
</div>
<span className={classes.ordinal}>Review {ordinal}</span>
<span className={classes.name}>{name || 'Anonymous'}</span>
{open && (
<div className={classes.review}>
<Review review={review} />
</div>
)}
<span className={classes.dots} />
<ToggleReview open toggle={toggleOpen} />
</div>
)
const DecisionReview = ({ review, reviewer, journal, open, toggleOpen }) => {
const { recommendation } = review.Recommendation
const { name, ordinal } = reviewer
return (
<div>
<ReviewHeading
journal={journal}
name={name}
open={open}
ordinal={ordinal}
recommendation={recommendation}
toggleOpen={toggleOpen}
/>
{open && (
<div className={classes.review}>
<Review review={review} />
</div>
)}
</div>
)
}
export default compose(
withJournal,
withState('open', 'setOpen', ({ open }) => open),
......
......@@ -13,6 +13,7 @@ const DecisionReviews = ({ journal, version }) => (
.map((review, index) => (
<div className={classes.review} key={review.id}>
<DecisionReview
open
review={review}
reviewer={{
name: null,
......
......@@ -40,7 +40,9 @@ const Review = ({ review }) => (
<div>
<div className={classes.heading}>Recommendation</div>
<div className={classes.recommendation}>{review.recommendation}</div>
<div className={classes.recommendation}>
{review.Recommendation.recommendation}
</div>
</div>
</div>
)
......
......@@ -22,9 +22,12 @@ const ReviewLayout = ({
const editorSections = []
versions.forEach(version => {
const review = version.reviewers.find(
review => review.reviewer === reviewer.id,
)
let review
if (version.reviewers) {
review = version.reviewers.find(
review => review.reviewer === reviewer._reviewer.id,
)
}
if (review && review.submitted) {
const submittedMoment = moment(review.submitted)
......@@ -48,7 +51,12 @@ const ReviewLayout = ({
// TODO: need to include unreviewed versions?
editorSections.push({
content: (
<SimpleEditor content={version.source} layout="bare" readOnly />
<SimpleEditor
content={version.source}
key={key}
layout="bare"
readOnly
/>
),
key,
label,
......@@ -86,7 +94,12 @@ const ReviewLayout = ({
editorSections.push({
content: (
<SimpleEditor content={currentVersion.source} layout="bare" readOnly />
<SimpleEditor
content={currentVersion.source}
key={key}
layout="bare"
readOnly
/>
),
key,
label,
......
......@@ -9,13 +9,12 @@ class Tabs extends React.Component {
super(props)
this.state = {
activeKey: null,
activeKey: props.activeKey || null,
}
}
componentDidMount() {
const { activeKey } = this.props
this.setState({ activeKey })
}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment