From 13b25b7a62d543de71459c96fe3c30c43db92cc3 Mon Sep 17 00:00:00 2001
From: Bogdan Cochior <bogdan.cochior@thinslices.com>
Date: Thu, 23 Aug 2018 15:24:30 +0300
Subject: [PATCH] refactor(manuscript-details): refactor components

---
 .../component-faraday-selectors/src/index.js  |   8 +-
 .../src/ManuscriptDetailsTop.js               |  47 --------
 .../src/gridItems/Item.js                     |   2 +-
 packages/component-faraday-ui/src/index.js    |   4 +-
 .../manuscriptDetails/ManuscriptDetailsTop.js | 114 ++++++++++++++++++
 .../ManuscriptDetailsTop.md                   |   0
 .../src/manuscriptDetails/index.js            |   1 +
 .../src/components/index.js                   |   2 -
 packages/styleguide/styleguide.config.js      |   5 +
 9 files changed, 127 insertions(+), 56 deletions(-)
 delete mode 100644 packages/component-faraday-ui/src/ManuscriptDetailsTop.js
 create mode 100644 packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.js
 rename packages/component-faraday-ui/src/{ => manuscriptDetails}/ManuscriptDetailsTop.md (100%)
 create mode 100644 packages/component-faraday-ui/src/manuscriptDetails/index.js

diff --git a/packages/component-faraday-selectors/src/index.js b/packages/component-faraday-selectors/src/index.js
index 0b9b1ab4d..6e1c18975 100644
--- a/packages/component-faraday-selectors/src/index.js
+++ b/packages/component-faraday-selectors/src/index.js
@@ -16,7 +16,7 @@ const canMakeRecommendationStatuses = [
 export const canMakeRecommendation = (state, collection, fragment = {}) => {
   if (fragment.id !== last(collection.fragments)) return false
   const isHE = isHEToManuscript(state, collection.id)
-  const status = get(collection, 'status')
+  const status = get(collection, 'status', 'draft')
   return isHE && canMakeRecommendationStatuses.includes(status)
 }
 
@@ -74,7 +74,7 @@ export const getHERecommendation = (state, collectionId, fragmentId) => {
 const canMakeDecisionStatuses = ['submitted', 'pendingApproval']
 export const canMakeDecision = (state, collection, fragment = {}) => {
   if (fragment.id !== last(collection.fragments)) return false
-  const status = get(collection, 'status')
+  const status = get(collection, 'status', 'draft')
 
   const isEIC = currentUserIs(state, 'adminEiC')
   return isEIC && canMakeDecisionStatuses.includes(status)
@@ -84,7 +84,7 @@ const canEditManuscriptStatuses = ['draft', 'technicalChecks', 'inQA']
 export const canEditManuscript = (state, collection, fragment = {}) => {
   const isAdmin = currentUserIs(state, 'isAdmin')
   if (!isAdmin || fragment.id !== last(collection.fragments)) return false
-  const status = get(collection, 'status')
+  const status = get(collection, 'status', 'draft')
 
   return canEditManuscriptStatuses.includes(status)
 }
@@ -93,7 +93,7 @@ const canOverrideTechnicalChecksStatuses = ['technicalChecks', 'inQA']
 export const canOverrideTechnicalChecks = (state, collection) => {
   const isAdmin = currentUserIs(state, 'isAdmin')
   if (!isAdmin) return false
-  const status = get(collection, 'status')
+  const status = get(collection, 'status', 'draft')
 
   return canOverrideTechnicalChecksStatuses.includes(status)
 }
diff --git a/packages/component-faraday-ui/src/ManuscriptDetailsTop.js b/packages/component-faraday-ui/src/ManuscriptDetailsTop.js
deleted file mode 100644
index beb249fab..000000000
--- a/packages/component-faraday-ui/src/ManuscriptDetailsTop.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import React from 'react'
-import { get } from 'lodash'
-import {
-  Row,
-  Item,
-  Text,
-  ActionLink,
-  IconButton,
-  DownloadZipFiles,
-  PreviewFile,
-  ManuscriptVersion,
-} from 'pubsweet-component-faraday-ui'
-import { DateParser } from '@pubsweet/ui'
-
-const ManuscriptDetailsTop = ({
-  history,
-  getSignedUrl,
-  collection = {},
-  fragment = {},
-}) => (
-  <Row alignItems="center" mb={1}>
-    <Item justify="flex-start">
-      <ActionLink icon="arrow-left" onClick={() => history.push('/')}>
-        Dashboard
-      </ActionLink>
-    </Item>
-    <Item justify="flex-end">
-      <PreviewFile
-        file={get(fragment, 'files.manuscripts[0]', {})}
-        getSignedUrl={getSignedUrl}
-      />
-      <DownloadZipFiles
-        archiveName={`ID-${collection.customId}`}
-        collectionId={collection.id}
-        fragmentId={fragment.id}
-      >
-        <IconButton icon="download" iconSize={2} mr={3} secondary />
-      </DownloadZipFiles>
-      <DateParser durationThreshold={0} timestamp={fragment.submitted || ''}>
-        {timestamp => <Text mr={1}>Updated on {timestamp}</Text>}
-      </DateParser>
-      <ManuscriptVersion collection={collection} fragment={fragment} />
-    </Item>
-  </Row>
-)
-
-export default ManuscriptDetailsTop
diff --git a/packages/component-faraday-ui/src/gridItems/Item.js b/packages/component-faraday-ui/src/gridItems/Item.js
index 282ec34e7..b289d76c7 100644
--- a/packages/component-faraday-ui/src/gridItems/Item.js
+++ b/packages/component-faraday-ui/src/gridItems/Item.js
@@ -11,7 +11,7 @@ export default styled.div.attrs({
   flex: ${({ flex }) => (isNumber(flex) ? flex : 1)};
   flex-direction: ${({ vertical }) => (vertical ? 'column' : 'row')};
   justify-content: ${({ justify }) => justify || 'initial'};
-  align-items: ${({ alignItems }) => alignItems || 'center'};
+  align-items: ${({ alignItems }) => alignItems || 'initial'};
 
   ${marginHelper};
 `
diff --git a/packages/component-faraday-ui/src/index.js b/packages/component-faraday-ui/src/index.js
index a8aafac48..e2c492c80 100644
--- a/packages/component-faraday-ui/src/index.js
+++ b/packages/component-faraday-ui/src/index.js
@@ -23,10 +23,10 @@ export { default as WizardAuthors } from './WizardAuthors'
 export { default as WizardFiles } from './WizardFiles'
 export { default as PreviewFile } from './PreviewFile'
 export { default as DownloadZipFiles } from './DownloadZipFiles'
+export { default as ManuscriptVersion } from './ManuscriptVersion'
 
 // Manuscript Details
-export { default as ManuscriptVersion } from './ManuscriptVersion'
-export { default as ManuscriptDetailsTop } from './ManuscriptDetailsTop'
+export * from './manuscriptDetails'
 
 export * from './styledHelpers'
 
diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.js
new file mode 100644
index 000000000..5ffa60c3d
--- /dev/null
+++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.js
@@ -0,0 +1,114 @@
+import React from 'react'
+import { get } from 'lodash'
+import { connect } from 'react-redux'
+import { DateParser } from '@pubsweet/ui'
+import { withRouter } from 'react-router-dom'
+import { compose, withHandlers } from 'recompose'
+import {
+  canMakeDecision,
+  canMakeRecommendation,
+  canEditManuscript,
+  canOverrideTechnicalChecks,
+} from 'pubsweet-component-faraday-selectors/src'
+
+import {
+  Row,
+  Item,
+  Text,
+  ActionLink,
+  IconButton,
+  DownloadZipFiles,
+  PreviewFile,
+  ManuscriptVersion,
+} from 'pubsweet-component-faraday-ui'
+
+const ManuscriptDetailsTop = ({
+  history,
+  getSignedUrl,
+  collection = {},
+  fragment = {},
+  goToEdit,
+  canEditManuscript,
+  goToTechnicalCheck,
+  canOverrideTechChecks,
+}) => (
+  <Row alignItems="center" mb={1}>
+    <Item alignItems="center" justify="flex-start">
+      <ActionLink icon="arrow-left" onClick={() => history.push('/')}>
+        Dashboard
+      </ActionLink>
+    </Item>
+    <Item alignItems="center" justify="flex-end">
+      {canOverrideTechChecks && (
+        <IconButton
+          data-test-id={`button-qa-manuscript-${fragment.id}`}
+          icon="check-square"
+          iconSize={2}
+          mr={1}
+          onClick={goToTechnicalCheck(collection)}
+          secondary
+          title="Technical Checks"
+        />
+      )}
+      {canEditManuscript && (
+        <IconButton
+          data-test-id={`button-edit-manuscript-${fragment.id}`}
+          icon="edit"
+          iconSize={2}
+          mr={2}
+          onClick={goToEdit(collection, fragment)}
+          secondary
+          title="Edit Manuscript"
+        />
+      )}
+      <PreviewFile
+        file={get(fragment, 'files.manuscripts[0]', {})}
+        getSignedUrl={getSignedUrl}
+      />
+      <DownloadZipFiles
+        archiveName={`ID-${collection.customId}`}
+        collectionId={collection.id}
+        fragmentId={fragment.id}
+      >
+        <IconButton icon="download" iconSize={2} mr={3} secondary />
+      </DownloadZipFiles>
+      <DateParser durationThreshold={0} timestamp={fragment.submitted || ''}>
+        {timestamp => <Text mr={1}>Updated on {timestamp}</Text>}
+      </DateParser>
+      <ManuscriptVersion collection={collection} fragment={fragment} />
+    </Item>
+  </Row>
+)
+
+export default compose(
+  withRouter,
+  connect((state, { collection, fragment }) => ({
+    canMakeDecision: canMakeDecision(state, collection, fragment),
+    canMakeRecommendation: canMakeRecommendation(state, collection, fragment),
+    canEditManuscript: canEditManuscript(state, collection, fragment),
+    canOverrideTechChecks: canOverrideTechnicalChecks(state, collection),
+  })),
+  withHandlers({
+    goToEdit: ({ history }) => (collection, fragment) => () => {
+      history.push(
+        `/projects/${collection.id}/versions/${fragment.id}/submit`,
+        {
+          editMode: true,
+        },
+      )
+    },
+    goToTechnicalCheck: ({ history }) => collection => () => {
+      const {
+        status,
+        id,
+        customId,
+        technicalChecks: { token = '' },
+      } = collection
+      const stage = status === 'technicalChecks' ? 'eqs' : 'eqa'
+      history.push({
+        pathname: `/${stage}-decision`,
+        search: `?collectionId=${id}&customId=${customId}&token=${token}`,
+      })
+    },
+  }),
+)(ManuscriptDetailsTop)
diff --git a/packages/component-faraday-ui/src/ManuscriptDetailsTop.md b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.md
similarity index 100%
rename from packages/component-faraday-ui/src/ManuscriptDetailsTop.md
rename to packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.md
diff --git a/packages/component-faraday-ui/src/manuscriptDetails/index.js b/packages/component-faraday-ui/src/manuscriptDetails/index.js
new file mode 100644
index 000000000..624245e73
--- /dev/null
+++ b/packages/component-faraday-ui/src/manuscriptDetails/index.js
@@ -0,0 +1 @@
+export { default as ManuscriptDetailsTop } from './ManuscriptDetailsTop'
diff --git a/packages/components-faraday/src/components/index.js b/packages/components-faraday/src/components/index.js
index fc041eee2..eb71acbe3 100644
--- a/packages/components-faraday/src/components/index.js
+++ b/packages/components-faraday/src/components/index.js
@@ -1,6 +1,5 @@
 import { Decision } from './MakeDecision'
 import * as Components from './UIComponents'
-import { Recommendation } from './MakeRecommendation'
 
 export { FormItems } from './UIComponents'
 export { default as withVersion } from './Dashboard/withVersion.js'
@@ -9,5 +8,4 @@ export { default as ChangePasswordPage } from './UserProfile/ChangePasswordPage'
 
 export { Decision }
 export { Components }
-export { Recommendation }
 export { DateParser } from './UIComponents'
diff --git a/packages/styleguide/styleguide.config.js b/packages/styleguide/styleguide.config.js
index c53042e29..859cc8deb 100644
--- a/packages/styleguide/styleguide.config.js
+++ b/packages/styleguide/styleguide.config.js
@@ -17,6 +17,11 @@ module.exports = {
       sectionDepth: 1,
       components: ['../component-faraday-ui/src/gridItems/[A-Z]*.js'],
     },
+    {
+      name: 'Manuscript Details',
+      sectionDepth: 1,
+      components: ['../component-faraday-ui/src/manuscriptDetails/[A-Z]*.js'],
+    },
   ],
   skipComponentsWithoutExample: true,
   pagePerSection: true,
-- 
GitLab