diff --git a/app/components/component-kanban-modal/index.js b/app/components/component-kanban-modal/index.js index 79121da5d79f9d2feedc0a3af504681d366fff01..1954eeb21386d26084b457ea6ac86261cc98e713 100644 --- a/app/components/component-kanban-modal/index.js +++ b/app/components/component-kanban-modal/index.js @@ -28,56 +28,58 @@ const styles = { } const MainHeader = styled.div` + align-items: center; + border-bottom-width: 1.5px; + border-color: #d3d3d3; + border-style: solid; display: flex; justify-content: space-between; line-height: 22px; - align-items: center; - z-index: 10000; padding: ${grid(2)} ${grid(3)}; - border-color: #d3d3d3; - border-style: solid; - border-bottom-width: 1.5px; + z-index: 10000; ` const RowHeaderContainer = styled.div` - display: flex; align-items: center; - gap: 16px; + display: flex; font-family: ${th('fontHeading')}; + gap: 16px; ` const StackedHeaderContainer = styled.div` - display: flex; - flex-direction: column; align-items: flex-start; column-gap: 180px; + display: flex; + flex-direction: column; font-family: ${th('fontHeading')}; font-weight: 600; ` const Title = styled.div` - font-weight: 500; font-size: ${th('fontSizeHeading5')}; + font-weight: 500; ` const Subtitle = styled.div` + color: grey; font-size: ${th('fontSizeHeading6')}; font-weight: normal; - color: grey; ` const CloseButton = styled(Button)` - display: flex; align-items: center; - justify-content: center; background-color: #ffffff; border-radius: 50%; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; min-width: unset; width: 30px; - height: 30px; - cursor: pointer; + &:hover { background-color: #d7efd4; + svg { stroke: white; } @@ -85,10 +87,10 @@ const CloseButton = styled(Button)` ` const ButtonPanel = styled.div` - display: flex; align-items: center; - justify-content: space-between; + display: flex; flex-direction: row; + justify-content: space-between; padding: 1rem ${grid(1.5)}; width: 100%; z-index: 10001; @@ -99,37 +101,37 @@ const ButtonContainer = styled.div` ` const PrimaryActionButton = styled(ActionButton)` - color: white; background-color: ${th('colorPrimary')}; border-radius: 6px; + color: white; cursor: pointer; margin: 0px 5px; ` const SecondaryActionButton = styled(ActionButton)` - color: white; background-color: grey; border-radius: 6px; + color: white; cursor: pointer; margin: 0px 5px; ` const CheckBoxContainer = styled.div` - display: flex; align-items: center; - margin: 10px 5px; cursor: pointer; + display: flex; + margin: 10px 5px; ` const ModalContainer = styled.div` background-color: ${th('colorBackground')}; - padding: ${grid(2.5)} ${grid(3)}; - z-index: 10000; - overflow-y: auto; border-radius: 0; margin: 0; - width: 100%; max-height: calc(80vh - 10em); + overflow-y: auto; + padding: ${grid(2.5)} ${grid(3)}; + width: 100%; + z-index: 10000; ` export const PrimaryButton = ({ onClick, children }) => { diff --git a/app/components/component-manuscripts-table/src/style.js b/app/components/component-manuscripts-table/src/style.js index f2b3c0b6bcf9bc48e61060db955f5dfc10352fc3..4b5e18e165521b277abf4dd8f6f5b557634349d3 100644 --- a/app/components/component-manuscripts-table/src/style.js +++ b/app/components/component-manuscripts-table/src/style.js @@ -146,8 +146,8 @@ export const SortArrow = styled.span` ` export const StyledAlertCircle = styled(AlertCircle)` - height: 20px; - width: 20px; color: white; fill: red; + height: 20px; + width: 20px; ` diff --git a/app/components/component-review/src/components/DecisionVersion.js b/app/components/component-review/src/components/DecisionVersion.js index d4bb539d6a11ea9a1ce13e861e32888a17a5ebf1..428ae257f79ac29709b8a7c5995db5af233b2717 100644 --- a/app/components/component-review/src/components/DecisionVersion.js +++ b/app/components/component-review/src/components/DecisionVersion.js @@ -19,6 +19,7 @@ import { import DecisionAndReviews from '../../../component-submit/src/components/DecisionAndReviews' import FormTemplate from '../../../component-submit/src/components/FormTemplate' import TaskList from '../../../component-task-manager/src/TaskList' +import KanbanBoard from './KanbanBoard' import InviteReviewer from './reviewers/InviteReviewer' const createBlankSubmissionBasedOnForm = form => { @@ -36,6 +37,7 @@ const DecisionVersion = ({ currentDecisionData, currentUser, version, + versionNumber, isCurrentVersion, parent, updateManuscript, // To handle manuscript editing @@ -268,6 +270,7 @@ const DecisionVersion = ({ )} + {isCurrentVersion && ( ))} diff --git a/app/components/component-review/src/components/KanbanBoard.js b/app/components/component-review/src/components/KanbanBoard.js new file mode 100644 index 0000000000000000000000000000000000000000..9623708020cef4f931dc8a477d1b626460ec717d --- /dev/null +++ b/app/components/component-review/src/components/KanbanBoard.js @@ -0,0 +1,89 @@ +import React from 'react' +import styled from 'styled-components' +import PropTypes from 'prop-types' +import { AdminSection } from './style' +import { + SectionContent, + SectionHeader, + SectionRow, + Title, +} from '../../../shared' + +import statuses from '../../../../../config/journal/review-status' + +const Kanban = styled.div` + margin: 15px 7.5px; +` + +const Column = styled.div` + display: inline-block; + height: 300px; + margin-inline: 7.5px; + width: calc(${100 / (statuses.length - 1)}% - 15px); +` + +const StatusLabel = styled.div` + background-color: ${props => props.statusColor || '#ffffff'}; + border-radius: 12px; + color: rgba(0, 0, 0, 0.6); + display: inline-block; + font-weight: bold; + margin-block: 4px; + padding: 4px 10px 4px 10px; +` + +const CardsWrapper = styled.div` + background-color: #f8f8f9; + border-radius: 8px; + height: 100%; + margin-top: 8px; + overflow-x: hidden; + overflow-y: auto; + width: 100%; +` + +const ReviewerStatusHeader = styled.div` + display: flex; + justify-content: space-between; +` + +const VersionNumber = styled.div` + color: rgba(0, 0, 0, 0.5); +` + +const KanbanBoard = ({ versionNumber }) => { + return ( + + + + + Reviewer Status + + <VersionNumber>Version {versionNumber}</VersionNumber> + + + + + + {statuses + .filter(status => status.label !== 'Declined') + .map(status => ( + + + {status.label} + + + + ))} + + + + + ) +} + +KanbanBoard.propTypes = { + versionNumber: PropTypes.number.isRequired, +} + +export default KanbanBoard diff --git a/config/journal/review-status.js b/config/journal/review-status.js new file mode 100644 index 0000000000000000000000000000000000000000..1b67027d5c0497786717e0e07f4f6add600d21c2 --- /dev/null +++ b/config/journal/review-status.js @@ -0,0 +1,27 @@ +module.exports = [ + { + color: '#fff2cd', + label: 'Invited', + value: 'invited', + }, + { + color: '#d7efd4', + label: 'Accepted', + value: 'accepted', + }, + { + color: '#ffcc37', + label: 'In Progress', + value: 'inProgress', + }, + { + color: '#56b984', + label: 'Completed', + value: 'completed', + }, + { + color: '#c23d20', + label: 'Declined', + value: 'rejected', + }, +]