diff --git a/.eslintrc b/.eslintrc index acfa15464c596b9cdb22f86e4f3bd9adb5a710ce..8db623b85fc26abc113026782f77445e47a44b80 100644 --- a/.eslintrc +++ b/.eslintrc @@ -5,5 +5,31 @@ }, "extends": [ "pubsweet" - ] + ], + "parser": "babel-eslint", + "parserOptions": { + "allowImportExportEverywhere": true + }, + "rules": { + "camelcase": 0, + "consistent-return": 0, + "global-require": 0, + "jsx-a11y/anchor-is-valid": 0, + "jsx-a11y/click-events-have-key-events": 0, + "jsx-a11y/label-has-for": 0, + "jsx-a11y/no-static-element-interactions": 0, + "import/extensions": 0, + "import/no-dynamic-require": 0, + "import/no-extraneous-dependencies": 0, + "import/no-named-as-default": 0, + "import/no-named-as-default-member": 0, + "import/prefer-default-export": 0, + "no-console": ["error", { "allow": ["warn", "error"] }], + "no-param-reassign": 0, + "no-shadow": 0, + "no-underscore-dangle": 0, + "react/no-did-mount-set-state": 0, + "react/prop-types": 0, + "sort-keys": 0 + } } diff --git a/packages/component-app/src/components/App.js b/packages/component-app/src/components/App.js index 4143e96108a863f049f6e5d8e66c06da19b75fe2..35f4a9d234fbfc6c75341ee2df9b5cb9f60a46dc 100644 --- a/packages/component-app/src/components/App.js +++ b/packages/component-app/src/components/App.js @@ -1,7 +1,7 @@ import React from 'react' import { compose } from 'recompose' import { connect } from 'react-redux' -import PropTypes from 'prop-types' +// import PropTypes from 'prop-types' import { AppBar } from 'xpub-ui' import { withJournal } from 'xpub-journal' diff --git a/packages/component-authentication/src/components/Login.js b/packages/component-authentication/src/components/Login.js index 9b6f5763fe2b6b60eab3df24af8709402ffb194f..7441bbd33f141a8661da829422f6221046c3f0d2 100644 --- a/packages/component-authentication/src/components/Login.js +++ b/packages/component-authentication/src/components/Login.js @@ -24,7 +24,7 @@ const Login = ({ errorMessage, handleSubmit }) => ( </form> <div className={classes.alternate}> - <span className={classes.message}>You don't have an account?</span> + <span className={classes.message}>You don't have an account?</span> <Link className={classes.link} to="/signup"> Sign up </Link> diff --git a/packages/component-authentication/src/redux/currentUser.js b/packages/component-authentication/src/redux/currentUser.js index c752a9bb34a35b331843b2e2f498a1f47fd80e0e..93b4c12a858104bcd8a7db7fce1774f277902cab 100644 --- a/packages/component-authentication/src/redux/currentUser.js +++ b/packages/component-authentication/src/redux/currentUser.js @@ -27,9 +27,7 @@ export const getCurrentUserFailure = error => ({ export const getCurrentUser = () => dispatch => { dispatch(getCurrentUserRequest()) return api.get('/users/authenticate').then( - user => { - return dispatch(getCurrentUserSuccess(user)) - }, + user => dispatch(getCurrentUserSuccess(user)), error => { dispatch(getCurrentUserFailure(error)) throw error diff --git a/packages/component-dashboard/src/components/EmptySubmissions.js b/packages/component-dashboard/src/components/EmptySubmissions.js index 48e63c789761e88f4f3e3de94d177477a81d84bc..3b3f86b1335d38e06a205c6de9196b740af8e5c3 100644 --- a/packages/component-dashboard/src/components/EmptySubmissions.js +++ b/packages/component-dashboard/src/components/EmptySubmissions.js @@ -3,7 +3,7 @@ import classes from './EmptySubmissions.local.scss' const EmptySubmissions = () => ( <div className={classes.root}> - <div>You haven't submitted any manuscripts yet.</div> + <div>You haven't submitted any manuscripts yet.</div> </div> ) diff --git a/packages/component-dashboard/src/components/metadata/MetadataOwners.js b/packages/component-dashboard/src/components/metadata/MetadataOwners.js index 6971063fe5168c9f36598193529052d0a483aa22..40bb90e45ccbb5ca2b6e8abc2302c37361ae5aaa 100644 --- a/packages/component-dashboard/src/components/metadata/MetadataOwners.js +++ b/packages/component-dashboard/src/components/metadata/MetadataOwners.js @@ -3,7 +3,7 @@ import React from 'react' const MetadataOwners = ({ owners }) => ( <span> {owners.map((owner, index) => [ - index === 0 ? null : <span>{', '}</span>, + index === 0 ? null : <span>, </span>, <span>{owner.name || 'Anonymous'}</span>, ])} </span> diff --git a/packages/component-dashboard/src/components/metadata/MetadataSections.js b/packages/component-dashboard/src/components/metadata/MetadataSections.js index ca7e7ddb6ca4facaac2064bebf99a15b3e7b4383..84594432b4a99a984e9e059be153a8d19d77dc17 100644 --- a/packages/component-dashboard/src/components/metadata/MetadataSections.js +++ b/packages/component-dashboard/src/components/metadata/MetadataSections.js @@ -4,7 +4,7 @@ import { withJournal } from 'xpub-journal' const MetadataSections = ({ journal, sections }) => ( <span> {sections.map((section, index) => [ - index === 0 ? null : <span>{', '}</span>, + index === 0 ? null : <span>, </span>, <span> {journal.articleSections.find(item => item.value === section).label} </span>, diff --git a/packages/component-dashboard/src/components/sections/Divider.js b/packages/component-dashboard/src/components/sections/Divider.js index 0f64884bb356c70d79beb8ecb309826c72de0945..78f33a31662a5d0900da4d6b44e5453c4520eefb 100644 --- a/packages/component-dashboard/src/components/sections/Divider.js +++ b/packages/component-dashboard/src/components/sections/Divider.js @@ -2,5 +2,5 @@ import React from 'react' import classes from './Divider.local.scss' export default ({ separator }) => ( - <span className={classes.root}>{' ' + separator + ' '}</span> + <span className={classes.root}>{` ${separator} `}</span> ) diff --git a/packages/component-dashboard/src/components/sections/EditorItem.js b/packages/component-dashboard/src/components/sections/EditorItem.js index bac28d3f5822378f3b93e6ebde6ccf1a06656a93..902cec169cb1fffac36a2694f0311ff41b340d1e 100644 --- a/packages/component-dashboard/src/components/sections/EditorItem.js +++ b/packages/component-dashboard/src/components/sections/EditorItem.js @@ -30,13 +30,13 @@ const EditorItem = ({ AssignEditor, project, version, addUserToTeam }) => ( </div> <div className={classes.main}> - <VersionTitle version={version} className={classes.versionTitle} /> + <VersionTitle className={classes.versionTitle} version={version} /> <div className={classes.links}> <div className={classes.link}> {(!version.decision || version.decision.status !== 'submitted') && ( <span> - <ProjectLink project={project} version={version} page="reviewers"> + <ProjectLink page="reviewers" project={project} version={version}> Assign Reviewers </ProjectLink> @@ -45,10 +45,10 @@ const EditorItem = ({ AssignEditor, project, version, addUserToTeam }) => ( )} <ProjectLink + id={project.id} + page="decisions" project={project} version={version} - page="decisions" - id={project.id} > {version.decision && version.decision.status === 'submitted' ? `Decision: ${version.decision.recommendation}` @@ -63,17 +63,17 @@ const EditorItem = ({ AssignEditor, project, version, addUserToTeam }) => ( <div className={classes.roles}> <div className={classes.role}> <AssignEditor + addUserToTeam={addUserToTeam} project={project} teamTypeName="seniorEditor" - addUserToTeam={addUserToTeam} /> </div> <div className={classes.role}> <AssignEditor + addUserToTeam={addUserToTeam} project={project} teamTypeName="handlingEditor" - addUserToTeam={addUserToTeam} /> </div> </div> diff --git a/packages/component-dashboard/src/components/sections/OwnerItem.js b/packages/component-dashboard/src/components/sections/OwnerItem.js index c1836e4bc849043b7584fecadb77d89ed789ab53..d122fccc2214e4ad47da4c717175febf47c86ee3 100644 --- a/packages/component-dashboard/src/components/sections/OwnerItem.js +++ b/packages/component-dashboard/src/components/sections/OwnerItem.js @@ -12,11 +12,11 @@ const OwnerItem = ({ project, version, deleteProject }) => ( </div> <div className={classes.main}> - <VersionTitle version={version} className={classes.versionTitle} /> + <VersionTitle className={classes.versionTitle} version={version} /> <div className={classes.links}> <div className={classes.link}> - <ProjectLink project={project} version={version} page="submit"> + <ProjectLink page="submit" project={project} version={version}> Submission </ProjectLink> </div> @@ -24,7 +24,7 @@ const OwnerItem = ({ project, version, deleteProject }) => ( <Divider separator="|" /> <div className={classes.link}> - <ProjectLink project={project} version={version} page="manuscript"> + <ProjectLink page="manuscript" project={project} version={version}> Manuscript </ProjectLink> </div> diff --git a/packages/component-dashboard/src/components/sections/ReviewerItem.js b/packages/component-dashboard/src/components/sections/ReviewerItem.js index 74e2ec261a50f483035a88842d7766a4b84ba83f..a4e5f7f082aa8acbe08b85fca0a4eef5fb89fff8 100644 --- a/packages/component-dashboard/src/components/sections/ReviewerItem.js +++ b/packages/component-dashboard/src/components/sections/ReviewerItem.js @@ -16,7 +16,7 @@ const ReviewerItem = ({ project, version, currentUser, reviewerResponse }) => { return ( <div className={classes.root}> <div className={classes.main}> - <VersionTitle version={version} className={classes.versionTitle} /> + <VersionTitle className={classes.versionTitle} version={version} /> {reviewer && ( <div> @@ -24,10 +24,10 @@ const ReviewerItem = ({ project, version, currentUser, reviewerResponse }) => { <div className={classes.links}> <div className={classes.link}> <ProjectLink + id={reviewer.id} + page="reviews" project={project} version={version} - page="reviews" - id={reviewer.id} > {reviewer.submitted ? 'Reviewed' : 'Do Review'} </ProjectLink> diff --git a/packages/component-dashboard/src/lib/title.js b/packages/component-dashboard/src/lib/title.js index c31dca169c1cc95ebd6f438a1dc16a68ee1a63e9..7aae47d80f251b4a25f856dc77739ca626d280a9 100644 --- a/packages/component-dashboard/src/lib/title.js +++ b/packages/component-dashboard/src/lib/title.js @@ -1,8 +1,7 @@ -export const generateTitle = name => { - return name +export const generateTitle = name => + name .replace(/[_-]+/g, ' ') // convert hyphens/underscores to space .replace(/\.[^.]+$/, '') // remove file extension -} // TODO: preserve italics (use parse5?) export const extractTitle = source => { diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js index b4ae8eaaf46b86067433a35623959e32a96d7c0a..47ee62a0d974b4bf770aa3e4f9ce630c7a4e0ba0 100644 --- a/packages/component-manuscript/src/components/ManuscriptPage.js +++ b/packages/component-manuscript/src/components/ManuscriptPage.js @@ -33,12 +33,11 @@ export default compose( }, ), withHandlers({ - updateManuscript: ({ updateVersion, project, version }) => data => { - return updateVersion(project, { + updateManuscript: ({ updateVersion, project, version }) => data => + updateVersion(project, { id: version.id, rev: version.rev, ...data, - }) - }, + }), }), )(Manuscript) diff --git a/packages/component-review/src/components/DecisionPage.js b/packages/component-review/src/components/DecisionPage.js index 6ab6c342b5550c42ee84e3b75bc6ff8b4f1a14d8..3067b621f2cc90c7f60a5c24843b33191f159a5b 100644 --- a/packages/component-review/src/components/DecisionPage.js +++ b/packages/component-review/src/components/DecisionPage.js @@ -15,14 +15,23 @@ import uploadFile from 'xpub-upload' import DecisionLayout from './decision/DecisionLayout' // TODO: this should happen on the server -const handleDecision = (project, version) => dispatch => { - return dispatch( +const handleDecision = (project, version) => dispatch => + dispatch( actions.updateFragment(project, { decision: version.decision, id: version.id, rev: version.rev, }), ).then(() => { + const cloned = pick(version, [ + 'source', + 'metadata', + 'declarations', + 'suggestions', + 'files', + 'notes', + ]) + switch (version.decision.recommendation) { case 'accept': return dispatch( @@ -43,15 +52,6 @@ const handleDecision = (project, version) => dispatch => { ) case 'revise': - const cloned = pick(version, [ - 'source', - 'metadata', - 'declarations', - 'suggestions', - 'files', - 'notes', - ]) - return dispatch( actions.updateCollection({ id: project.id, @@ -73,7 +73,6 @@ const handleDecision = (project, version) => dispatch => { throw new Error('Unknown decision type') } }) -} const onSubmit = (values, dispatch, { project, version, history }) => { version.decision = { @@ -131,11 +130,9 @@ export default compose( }, ), withRouter, - withProps(({ decision }) => { - return { - initialValues: decision, - } - }), + withProps(({ decision }) => ({ + initialValues: decision, + })), reduxForm({ form: 'decision', onChange: debounce(onChange, 1000, { maxWait: 5000 }), diff --git a/packages/component-review/src/components/ReviewPage.js b/packages/component-review/src/components/ReviewPage.js index 9ff53e95333fc84f54a5ce5ea6337701ee9a79af..1666c989b6a8c2cf0f549cca347ad01791362d2f 100644 --- a/packages/component-review/src/components/ReviewPage.js +++ b/packages/component-review/src/components/ReviewPage.js @@ -103,11 +103,9 @@ export default compose( }, ), withRouter, - withProps(({ reviewer }) => { - return { - initialValues: reviewer, - } - }), + withProps(({ reviewer }) => ({ + initialValues: reviewer, + })), reduxForm({ form: 'review', onChange: debounce(onChange, 1000, { maxWait: 5000 }), diff --git a/packages/component-review/src/components/reviewers/Reviewer.js b/packages/component-review/src/components/reviewers/Reviewer.js index ec48c6c349a6fed49809f78b19982310bad9e37a..8ecc11ca0062d0e279fa0535c1bedff88e97f254 100644 --- a/packages/component-review/src/components/reviewers/Reviewer.js +++ b/packages/component-review/src/components/reviewers/Reviewer.js @@ -5,9 +5,8 @@ import { Avatar, Button } from 'xpub-ui' import classes from './Reviewer.local.scss' -const ordinalLetter = ordinal => { - return ordinal ? String.fromCharCode(96 + ordinal) : null -} +const ordinalLetter = ordinal => + ordinal ? String.fromCharCode(96 + ordinal) : null const Reviewer = ({ reviewer, removeReviewer }) => ( <div className={classes.root}> diff --git a/packages/component-review/src/components/reviewers/ReviewerFormContainer.js b/packages/component-review/src/components/reviewers/ReviewerFormContainer.js index fd2255d5beaaf9d63856ba2dc49f92d5e9babc37..da8aa28b6ea1aa64fcbe09a1f88b389ceb3ab42e 100644 --- a/packages/component-review/src/components/reviewers/ReviewerFormContainer.js +++ b/packages/component-review/src/components/reviewers/ReviewerFormContainer.js @@ -46,10 +46,10 @@ const addReviewer = (props, projectReviewer) => { .then(() => reviewer) } -const handleSubmit = props => reset => values => { +const handleSubmit = props => reset => values => // TODO: create a user account if values.user.id is null - return getProjectReviewer(props, values.user) + getProjectReviewer(props, values.user) .then(projectReviewer => { if (some(props.version.reviewers, { reviewer: projectReviewer.id })) { throw new SubmissionError('This reviewer has already been added') @@ -58,7 +58,6 @@ const handleSubmit = props => reset => values => { return addReviewer(props, projectReviewer) }) .then(() => reset()) -} const loadOptions = props => input => { const options = props.reviewerUsers diff --git a/packages/component-review/src/components/tabs/Tab.js b/packages/component-review/src/components/tabs/Tab.js index 96d92b928575bbff2564d3aa39a224efd126bf92..d54f5d35c2d7affc20258bc985af7a60b90c8260 100644 --- a/packages/component-review/src/components/tabs/Tab.js +++ b/packages/component-review/src/components/tabs/Tab.js @@ -1,6 +1,7 @@ +import classnames from 'classnames' import React from 'react' + import classes from './Tab.local.scss' -import classnames from 'classnames' const Tab = ({ active, children }) => ( <div diff --git a/packages/component-review/src/components/tabs/Tabs.js b/packages/component-review/src/components/tabs/Tabs.js index fabd3fbb5a397ebd6db0bc38b4bfb7bb9abf4ec8..19493a37b7aa766c7df2955707c0e428af715386 100644 --- a/packages/component-review/src/components/tabs/Tabs.js +++ b/packages/component-review/src/components/tabs/Tabs.js @@ -27,7 +27,9 @@ class Tabs extends React.Component { } } - setActiveKey = activeKey => this.setState({ activeKey }) + setActiveKey(activeKey) { + this.setState({ activeKey }) + } render() { const { sections, title } = this.props @@ -40,8 +42,8 @@ class Tabs extends React.Component { {sections.map(({ key, label }) => ( <span - key={key} className={classes.tab} + key={key} onClick={() => this.setActiveKey(key)} > <Tab active={activeKey === key}>{label || key}</Tab> diff --git a/packages/component-submit/src/components/Declarations.js b/packages/component-submit/src/components/Declarations.js index 2ccced010392f442d79e3cbee660507f6429782d..55497f1aa7cd21512edfacba8d804f9ac3ec2771 100644 --- a/packages/component-submit/src/components/Declarations.js +++ b/packages/component-submit/src/components/Declarations.js @@ -8,27 +8,25 @@ import classes from './Declarations.local.scss' const DeclarationInput = input => <YesOrNo inline {...input} /> -const Declarations = ({ journal }) => { - return ( - <FormSection name="declarations"> - {journal.declarations.questions.map(question => ( - <div - className={classnames(classes.section, classes.spread)} - id={`declarations.${question.id}`} - key={question.id} - > - <div className={classes.legend}>{question.legend}</div> +const Declarations = ({ journal }) => ( + <FormSection name="declarations"> + {journal.declarations.questions.map(question => ( + <div + className={classnames(classes.section, classes.spread)} + id={`declarations.${question.id}`} + key={question.id} + > + <div className={classes.legend}>{question.legend}</div> - <ValidatedField - component={DeclarationInput} - name={question.id} - required - validate={[required]} - /> - </div> - ))} - </FormSection> - ) -} + <ValidatedField + component={DeclarationInput} + name={question.id} + required + validate={[required]} + /> + </div> + ))} + </FormSection> +) export default withJournal(Declarations) diff --git a/packages/component-submit/src/components/SubmitPage.js b/packages/component-submit/src/components/SubmitPage.js index 7cf7c29b179004cd6889e980403dabe87e6eecb9..5102acb77cdc205db1562d57072dc2dc8d2471c3 100644 --- a/packages/component-submit/src/components/SubmitPage.js +++ b/packages/component-submit/src/components/SubmitPage.js @@ -8,10 +8,10 @@ import { ConnectPage } from 'xpub-connect' import { selectCollection, selectFragment } from 'xpub-selectors' import Submit from './Submit' -const onSubmit = (values, dispatch, { history, project, version }) => { +const onSubmit = (values, dispatch, { history, project, version }) => // console.log('submit', values) - return dispatch( + dispatch( actions.updateFragment(project, { id: version.id, rev: version.rev, @@ -19,15 +19,15 @@ const onSubmit = (values, dispatch, { history, project, version }) => { ...values, }), ) - .then(() => { - return dispatch( + .then(() => + dispatch( actions.updateCollection({ id: project.id, rev: project.rev, status: 'submitted', }), - ) - }) + ), + ) .then(() => { history.push('/') }) @@ -36,7 +36,6 @@ const onSubmit = (values, dispatch, { history, project, version }) => { throw new SubmissionError() } }) -} // TODO: this is only here because prosemirror would save the title in the // metadata as html instead of plain text. we need to maybe find a better diff --git a/packages/component-submit/src/components/Validots.js b/packages/component-submit/src/components/Validots.js index 70b3d649e3377a7e72f57291afa3e71e6e750db7..1b8307e35297db6af05e1ca88294ab9604b62a80 100644 --- a/packages/component-submit/src/components/Validots.js +++ b/packages/component-submit/src/components/Validots.js @@ -1,9 +1,10 @@ +import { map } from 'lodash' import React from 'react' import { Field } from 'redux-form' -import { map } from 'lodash' -import Validot from './Validot' import { connect } from 'react-redux' +import Validot from './Validot' + // TODO: is the order of map(form.registeredFields) guaranteed to be the same? // TODO: use journal config instead of form.registeredFields once using it to build the form // TODO: the Field rendered here overrides the validation in the other Field with the same name diff --git a/packages/xpub-collabra/app/app.js b/packages/xpub-collabra/app/app.js index a31b4dd496837656eb0a7b5c119589d665f55d85..a66d52c4d600fda898fc31ebcb401081a1edf639 100644 --- a/packages/xpub-collabra/app/app.js +++ b/packages/xpub-collabra/app/app.js @@ -3,12 +3,14 @@ import ReactDOM from 'react-dom' import { AppContainer } from 'react-hot-loader' import { Provider as StoreProvider } from 'react-redux' import { Router } from 'react-router-dom' -import { configureStore } from 'pubsweet-client' import createHistory from 'history/createBrowserHistory' + +import { configureStore } from 'pubsweet-client' import { JournalProvider } from 'xpub-journal' +import 'xpub-theme' + import * as journal from './config/journal' import Root from './routes' -import 'xpub-theme' const history = createHistory() const store = configureStore(history, {}) diff --git a/packages/xpub-collabra/app/routes.js b/packages/xpub-collabra/app/routes.js index 697d41e98d8ec6cb3aad52f4dbb6d45755f0bb65..88a0a092fe5d4c0636c872a1b82dea0365114429 100644 --- a/packages/xpub-collabra/app/routes.js +++ b/packages/xpub-collabra/app/routes.js @@ -39,39 +39,39 @@ const DecisionPage = loadable(() => const Root = () => ( <App> - <PrivateRoute exact path="/" component={DashboardPage} /> + <PrivateRoute component={DashboardPage} exact path="/" /> <PrivateRoute + component={SubmitPage} exact path="/projects/:project/versions/:version/submit" - component={SubmitPage} /> <PrivateRoute + component={ManuscriptPage} exact path="/projects/:project/versions/:version/manuscript" - component={ManuscriptPage} /> <PrivateRoute + component={ReviewersPage} exact path="/projects/:project/versions/:version/reviewers" - component={ReviewersPage} /> <PrivateRoute + component={ReviewPage} exact path="/projects/:project/versions/:version/reviews/:review" - component={ReviewPage} /> <PrivateRoute + component={DecisionPage} exact path="/projects/:project/versions/:version/decisions/:decision" - component={DecisionPage} /> - <PrivateRoute exact path="/logout" component={LogoutPage} /> + <PrivateRoute component={LogoutPage} exact path="/logout" /> - <Route exact path="/signup" component={SignupPage} /> - <Route exact path="/login" component={LoginPage} /> + <Route component={SignupPage} exact path="/signup" /> + <Route component={LoginPage} exact path="/login" /> - {/*<Redirect from="/" to="/dashboard"/>*/} + {/* <Redirect from="/" to="/dashboard"/> */} </App> ) diff --git a/packages/xpub-collabra/config/authsome.js b/packages/xpub-collabra/config/authsome.js index 316dac27440d44e314c06c2b8c3c3b7829f6109e..17447be2eaa63ecd8dc407122b67625b8676f1a1 100644 --- a/packages/xpub-collabra/config/authsome.js +++ b/packages/xpub-collabra/config/authsome.js @@ -1,4 +1,3 @@ -module.exports = (user, operation, project, version) => { +module.exports = (user, operation, project, version) => // console.log({ user, operation, project, version }) - return true // TODO -} + true // TODO diff --git a/packages/xpub-collabra/webpack/common-rules.js b/packages/xpub-collabra/webpack/common-rules.js index 543d3739dec0f10fb180903f458d300a793fe0c0..6abb4982adb068370ee63cc82260d764fd1fa83d 100644 --- a/packages/xpub-collabra/webpack/common-rules.js +++ b/packages/xpub-collabra/webpack/common-rules.js @@ -8,7 +8,7 @@ const requireComponentsString = components // "client" or "frontend" for backwards compatibility return component.client || component.frontend }) - .map(name => "require('" + name + "')") + .map(name => `require('${name}')`) .join(', ') // paths that use ES6 scripts and CSS modules @@ -31,7 +31,7 @@ module.exports = [ loader: 'string-replace-loader', options: { search: 'PUBSWEET_COMPONENTS', - replace: '[' + requireComponentsString + ']', + replace: `[${requireComponentsString}]`, }, }, diff --git a/packages/xpub-connect/src/components/ConnectPage.js b/packages/xpub-connect/src/components/ConnectPage.js index 8d89bd3e21855233972b04057a44942d3f11dedf..6725f331de45458da1028a4647d7c23b3de98fc9 100644 --- a/packages/xpub-connect/src/components/ConnectPage.js +++ b/packages/xpub-connect/src/components/ConnectPage.js @@ -6,21 +6,25 @@ import classes from './ConnectPage.local.scss' const ConnectPage = requirements => WrappedComponent => { class ConnectedComponent extends React.Component { - state = { - fetching: false, - complete: false, - error: null + constructor(props) { + super(props) + + this.state = { + complete: false, + error: null, + fetching: false, + } } - componentDidMount () { + componentDidMount() { this.fetch(this.props) } - componentWillReceiveProps (nextProps) { + componentWillReceiveProps(nextProps) { this.fetch(nextProps) } - fetch ({ isAuthenticated }) { + fetch({ isAuthenticated }) { if (!isAuthenticated) { return } @@ -31,49 +35,45 @@ const ConnectPage = requirements => WrappedComponent => { this.setState({ fetching: true, - complete: false + complete: false, }) const requests = requirements(this.props).map(this.props.dispatch) - Promise.all(requests).then(() => { - this.setState({ - fetching: false, - complete: true, + Promise.all(requests) + .then(() => { + this.setState({ + fetching: false, + complete: true, + }) }) - }).catch(error => { - console.error(error) + .catch(error => { + console.error(error) - this.setState({ - error: error.message - }) + this.setState({ + error: error.message, + }) - throw error // rethrow - }) + throw error // rethrow + }) } - render () { + render() { const { complete, error } = this.state - if (error) return ( - <div className={classes.error}>{error}</div> - ) + if (error) return <div className={classes.error}>{error}</div> - if (!complete) return ( - <div className={classes.bar}>loading…</div> - ) + if (!complete) return <div className={classes.bar}>loading…</div> - return <WrappedComponent {...this.props}/> + return <WrappedComponent {...this.props} /> } } return compose( withRouter, - connect( - state => ({ - isAuthenticated: state.currentUser.isAuthenticated - }) - ) + connect(state => ({ + isAuthenticated: state.currentUser.isAuthenticated, + })), )(ConnectedComponent) } diff --git a/packages/xpub-edit/src/components/Editor.js b/packages/xpub-edit/src/components/Editor.js index 4d7913beac5999bcc96b683e88ebb42128023811..a8a4672d5d0ddab6f497e9cf01935e09f3cc43cf 100644 --- a/packages/xpub-edit/src/components/Editor.js +++ b/packages/xpub-edit/src/components/Editor.js @@ -2,8 +2,9 @@ import React from 'react' import classnames from 'classnames' import { EditorState } from 'prosemirror-state' import { EditorView } from 'prosemirror-view' -import MenuBar from './MenuBar' import baseClasses from 'prosemirror-view/style/prosemirror.css' + +import MenuBar from './MenuBar' import classes from './Editor.local.css' import decorations from '../decorations' @@ -16,7 +17,7 @@ class Editor extends React.Component { } } - createEditorView = node => { + createEditorView(node) { const { state } = this.state this.view = new EditorView(node, { @@ -43,7 +44,7 @@ class Editor extends React.Component { } } - dispatchTransaction = transaction => { + dispatchTransaction(transaction) { const state = this.view.state.apply(transaction) this.view.updateState(state) this.setState({ state }) @@ -58,10 +59,10 @@ class Editor extends React.Component { <div> {menu && ( <MenuBar + dispatch={this.dispatchTransaction} menu={menu} - title={title} state={state} - dispatch={this.dispatchTransaction} + title={title} /> )} diff --git a/packages/xpub-edit/src/components/Viewer.js b/packages/xpub-edit/src/components/Viewer.js index c61a6591cc29893dadc89856bcad600dd182d970..93c324c81fbac7e7e3267a5f27305f7ffef97233 100644 --- a/packages/xpub-edit/src/components/Viewer.js +++ b/packages/xpub-edit/src/components/Viewer.js @@ -14,7 +14,7 @@ class Viewer extends React.Component { } } - createEditorView = node => { + createEditorView(node) { const { state } = this.state this.view = new EditorView(node, { diff --git a/packages/xpub-edit/src/components/abstract/config/menu.js b/packages/xpub-edit/src/components/abstract/config/menu.js index 2e607f0dac6ac8928e1f53fd244bad95f641e50d..0763cb8ee054c729ade21eb87ecb3606dc378e15 100644 --- a/packages/xpub-edit/src/components/abstract/config/menu.js +++ b/packages/xpub-edit/src/components/abstract/config/menu.js @@ -22,15 +22,15 @@ const blockActive = (type, attrs = {}) => state => { return to <= $from.end() && $from.parent.hasMarkup(type, attrs) } -const promptForURL = () => { - let url = window.prompt('Enter the URL', 'https://') +// const promptForURL = () => { +// let url = window.prompt('Enter the URL', 'https://') - if (url && !/^https?:\/\//i.test(url)) { - url = 'http://' + url - } +// if (url && !/^https?:\/\//i.test(url)) { +// url = `http://${url}` +// } - return url -} +// return url +// } export default { blocks: { diff --git a/packages/xpub-edit/src/components/abstract/config/nodes.js b/packages/xpub-edit/src/components/abstract/config/nodes.js index 3d59ea01e69b1ac921df1958a6cf570a048618f3..13ab00922d753773f59854a52895e1678c887b58 100644 --- a/packages/xpub-edit/src/components/abstract/config/nodes.js +++ b/packages/xpub-edit/src/components/abstract/config/nodes.js @@ -17,7 +17,7 @@ const heading = { defining: true, group: 'block', parseDOM: [{ tag: 'h1', attrs: { level: 1 } }], - toDOM: node => ['h' + node.attrs.level, 0], + toDOM: node => [`h${node.attrs.level}`, 0], } const text = { diff --git a/packages/xpub-edit/src/components/note/config/menu.js b/packages/xpub-edit/src/components/note/config/menu.js index c336d13f091db143cdfd03b2f534cda227b1f9e6..45ee363be49130fd150a2efd04bf955c181ff0fa 100644 --- a/packages/xpub-edit/src/components/note/config/menu.js +++ b/packages/xpub-edit/src/components/note/config/menu.js @@ -1,4 +1,4 @@ -import { setBlockType, toggleMark } from 'prosemirror-commands' +import { toggleMark } from 'prosemirror-commands' import { redo, undo } from 'prosemirror-history' import icons from './icons' import schema from './schema' @@ -11,25 +11,25 @@ const markActive = type => state => { : state.doc.rangeHasMark(from, to, type) } -const blockActive = (type, attrs = {}) => state => { - const { $from, to, node } = state.selection +// const blockActive = (type, attrs = {}) => state => { +// const { $from, to, node } = state.selection - if (node) { - return node.hasMarkup(type, attrs) - } +// if (node) { +// return node.hasMarkup(type, attrs) +// } - return to <= $from.end() && $from.parent.hasMarkup(type, attrs) -} +// return to <= $from.end() && $from.parent.hasMarkup(type, attrs) +// } -const promptForURL = () => { - let url = window.prompt('Enter the URL', 'https://') +// const promptForURL = () => { +// let url = window.prompt('Enter the URL', 'https://') - if (url && !/^https?:\/\//i.test(url)) { - url = 'http://' + url - } +// if (url && !/^https?:\/\//i.test(url)) { +// url = `http://${url}` +// } - return url -} +// return url +// } export default { marks: { diff --git a/packages/xpub-selectors/src/index.js b/packages/xpub-selectors/src/index.js index 28fb48e7f17d9e6f45d70084a7557cddf6e90263..c6df763d95d2369aaaecc006d9cbcd02259ecc9e 100644 --- a/packages/xpub-selectors/src/index.js +++ b/packages/xpub-selectors/src/index.js @@ -15,9 +15,8 @@ export const selectFragments = (state, ids) => export const selectFragment = (state, id) => state.fragments[id] -export const selectCurrentVersion = (state, project) => { - return newestFirst(selectFragments(state, project.fragments))[0] -} +export const selectCurrentVersion = (state, project) => + newestFirst(selectFragments(state, project.fragments))[0] export const getReviewerFromUser = (project, version, currentUser) => { if (!project.reviewers || !version.reviewers) return null diff --git a/packages/xpub-styleguide/src/components/StyleGuideRenderer.js b/packages/xpub-styleguide/src/components/StyleGuideRenderer.js index 0eb8109834c0e9bc421df5a8cd14950eaff2be23..b1a65700dfd22533f14e9ac59fc07e47849c3114 100644 --- a/packages/xpub-styleguide/src/components/StyleGuideRenderer.js +++ b/packages/xpub-styleguide/src/components/StyleGuideRenderer.js @@ -1,20 +1,18 @@ import React from 'react' import classes from './StyleGuideRenderer.local.scss' -const StyleGuideRenderer = ({ title, children, toc }) => { - return ( - <div className={classes.root}> - <div className={classes.sidebar}> - <header className={classes.header}> - <h1 className={classes.title}>{title}</h1> - </header> +const StyleGuideRenderer = ({ title, children, toc }) => ( + <div className={classes.root}> + <div className={classes.sidebar}> + <header className={classes.header}> + <h1 className={classes.title}>{title}</h1> + </header> - <nav className={classes.nav}>{toc}</nav> - </div> - - <div className={classes.content}>{children}</div> + <nav className={classes.nav}>{toc}</nav> </div> - ) -} + + <div className={classes.content}>{children}</div> + </div> +) export default StyleGuideRenderer diff --git a/packages/xpub-styleguide/src/components/Wrapper.js b/packages/xpub-styleguide/src/components/Wrapper.js index 638e124237ace8c32860b07a7a18cb2d47659505..b0df3e215880398c8f3c948ea2d3cab36ac5b270 100644 --- a/packages/xpub-styleguide/src/components/Wrapper.js +++ b/packages/xpub-styleguide/src/components/Wrapper.js @@ -4,10 +4,11 @@ import { BrowserRouter as Router } from 'react-router-dom' import { reducer as formReducer } from 'redux-form' import { createStore, combineReducers } from 'redux' import { JournalProvider } from 'xpub-journal' -import * as journal from '../config/journal' import 'xpub-theme' +import * as journal from '../config/journal' + import classes from './Wrapper.local.scss' const rootReducer = combineReducers({ diff --git a/packages/xpub-ui/src/atoms/Avatar.js b/packages/xpub-ui/src/atoms/Avatar.js index bd0256d21062c04c0429efd12e8cc945f56630f6..d30de999d717c895bce2afb93ef35a5877afd533 100644 --- a/packages/xpub-ui/src/atoms/Avatar.js +++ b/packages/xpub-ui/src/atoms/Avatar.js @@ -8,9 +8,9 @@ const Avatar = ({ status, width, height, reviewerLetter }) => { return ( <svg className={classes[classValue]} - height={height ? height : '70'} - viewBox={`0 0 ${width ? width + 5 : '105'} ${height ? height : '70'}`} - width={width ? width : '100'} + height={height || '70'} + viewBox={`0 0 ${width ? width + 5 : '105'} ${height || '70'}`} + width={width || '100'} xmlns="http://www.w3.org/2000/svg" > <path diff --git a/packages/xpub-ui/src/atoms/Menu.js b/packages/xpub-ui/src/atoms/Menu.js index 466ef18523516e85a97f083f1a6bf4345483ec82..75c8d29399d446a5d09fe5cec86ebbb84901d345 100644 --- a/packages/xpub-ui/src/atoms/Menu.js +++ b/packages/xpub-ui/src/atoms/Menu.js @@ -15,22 +15,22 @@ class Menu extends React.Component { } } - toggleMenu = () => { + toggleMenu() { this.setState({ open: !this.state.open, }) } - handleSelect = selected => { + handleSelect(selected) { this.setState({ - selected, open: false, + selected, }) this.props.onChange(selected) } - optionLabel = value => { + optionLabel(value) { const { options } = this.props return options.find(option => option.value === value).label @@ -51,9 +51,9 @@ class Menu extends React.Component { <div className={classes.main}> <div className={classes.openerContainer}> <button - type="button" className={classes.opener} onClick={this.toggleMenu} + type="button" > {selected ? ( <span>{this.optionLabel(selected)}</span> @@ -69,10 +69,10 @@ class Menu extends React.Component { <div className={classes.options}> {options.map(option => ( <div - key={option.value} className={classnames(classes.option, { [classes.active]: option.value === selected, })} + key={option.value} onClick={() => this.handleSelect(option.value)} > {option.label || option.value} diff --git a/packages/xpub-ui/src/atoms/Tags.js b/packages/xpub-ui/src/atoms/Tags.js index 1c863b81fc84d0bd96f76166e44dfa99b4d77552..70dbe35f7f3e6aaad2e5be6b2118e9009f80b38f 100644 --- a/packages/xpub-ui/src/atoms/Tags.js +++ b/packages/xpub-ui/src/atoms/Tags.js @@ -14,7 +14,7 @@ class Tags extends React.Component { } } - handleDelete = index => { + handleDelete(index) { const { tags } = this.state tags.splice(index, 1) @@ -24,7 +24,7 @@ class Tags extends React.Component { this.props.onChange(tags) } - handleAddition = tag => { + handleAddition(tag) { const { tags } = this.state tags.push(tag) @@ -40,17 +40,17 @@ class Tags extends React.Component { return ( <ReactTags - name={name} - tags={tags} - suggestions={suggestions} - placeholder={placeholder} + allowNew autofocus={false} - allowNew={true} // TODO: enable these when react-tag-autocomplete update is released // delimiters={[]} // delimiterChars={[',', ';']} - handleDelete={this.handleDelete} handleAddition={this.handleAddition} + handleDelete={this.handleDelete} + name={name} + placeholder={placeholder} + suggestions={suggestions} + tags={tags} /> ) } diff --git a/packages/xpub-ui/src/atoms/UploadingFile.js b/packages/xpub-ui/src/atoms/UploadingFile.js index cc08f6fed15e2c2e651ac46c9ad1ab3595f10273..b5f6b6ad6ec878e14af98a0760cdbb81a0b3b28e 100644 --- a/packages/xpub-ui/src/atoms/UploadingFile.js +++ b/packages/xpub-ui/src/atoms/UploadingFile.js @@ -13,7 +13,7 @@ const UploadingFile = ({ file, error, progress }) => ( {!!progress && ( <div className={classes.progress} - style={{ top: progress * 100 + '%' }} + style={{ top: `${progress * 100}%` }} /> )} diff --git a/packages/xpub-ui/src/molecules/Attachments.js b/packages/xpub-ui/src/molecules/Attachments.js index 8c7c62a6073c7af8cb942fc1c64a254c4b012586..c05eb487934d3afd84eb781165042e96655e562e 100644 --- a/packages/xpub-ui/src/molecules/Attachments.js +++ b/packages/xpub-ui/src/molecules/Attachments.js @@ -16,7 +16,7 @@ const Attachments = props => ( <span className={classes.icon}> <Icon color="var(--color-primary)">paperclip</Icon> </span> - <span className={classes.filename}>{error ? error : 'Uploading…'}</span> + <span className={classes.filename}>{error || 'Uploading…'}</span> </div> )} /> diff --git a/packages/xpub-ui/src/molecules/CheckboxGroup.js b/packages/xpub-ui/src/molecules/CheckboxGroup.js index 8874941661f4f3a47efbb429c25924eecbe3a51f..09c473a23f3596e4420ed466593ae9c0053072e9 100644 --- a/packages/xpub-ui/src/molecules/CheckboxGroup.js +++ b/packages/xpub-ui/src/molecules/CheckboxGroup.js @@ -2,18 +2,18 @@ import React from 'react' import Checkbox from '../atoms/Checkbox' class CheckboxGroup extends React.Component { - constructor (props) { + constructor(props) { super(props) this.state = { - values: props.value || [] + values: props.value || [], } } - handleChange = event => { + handleChange(event) { const { values } = this.state - const value = event.target.value + const { value } = event.target if (event.target.checked) { values.push(value) @@ -26,7 +26,7 @@ class CheckboxGroup extends React.Component { this.props.onChange(values) } - render () { + render() { const { inline, name, options, required } = this.props const { values } = this.state @@ -34,14 +34,15 @@ class CheckboxGroup extends React.Component { <div> {options.map(option => ( <Checkbox + checked={values.includes(option.value)} + inline={inline} key={option.value} + label={option.label} name={name} + onChange={this.handleChange} required={required} - inline={inline} value={option.value} - label={option.label} - checked={values.includes(option.value)} - onChange={this.handleChange}/> + /> ))} </div> ) diff --git a/packages/xpub-ui/src/molecules/Files.js b/packages/xpub-ui/src/molecules/Files.js index ed71b40748b3afd976afba45000626ae70bfeed2..438ba0b019048e7a057657c0167242dd3f1bbda8 100644 --- a/packages/xpub-ui/src/molecules/Files.js +++ b/packages/xpub-ui/src/molecules/Files.js @@ -12,11 +12,11 @@ class Files extends React.Component { } } - handleClick = () => { + handleClick() { this.fileInput.click() } - handleChange = event => { + handleChange(event) { const { uploads } = this.state Array.from(event.target.files).forEach(file => { @@ -29,15 +29,15 @@ class Files extends React.Component { this.setState({ uploads }) } - handleUploadedFile = ({ file, url }) => { + handleUploadedFile({ file, url }) { const values = this.state.values.concat({ name: file.name, url, }) - const uploads = this.state.uploads.filter(item => { - return item.file.name !== file.name - }) + const uploads = this.state.uploads.filter( + item => item.file.name !== file.name, + ) this.setState({ values, uploads }) @@ -52,20 +52,20 @@ class Files extends React.Component { <div className={classes.root}> <div className={classes.upload}> <button - type="button" className={classes.attach} onClick={() => this.fileInput.click()} + type="button" > {buttonText} </button> <input className={classes.input} - ref={input => (this.fileInput = input)} - type="file" - name={name} multiple + name={name} onChange={this.handleChange} + ref={input => (this.fileInput = input)} + type="file" /> </div> @@ -73,11 +73,11 @@ class Files extends React.Component { {uploads && uploads.map(upload => ( <Upload - key={upload.file.name} file={upload.file} - request={upload.request} handleUploadedFile={this.handleUploadedFile} + key={upload.file.name} render={uploadingFile} + request={upload.request} /> ))} diff --git a/packages/xpub-ui/src/molecules/RadioGroup.js b/packages/xpub-ui/src/molecules/RadioGroup.js index ecc19952f6931668e4c877b4ce152b9f45654bc9..f842a09b426660045e616c548871ec64c4e9616a 100644 --- a/packages/xpub-ui/src/molecules/RadioGroup.js +++ b/packages/xpub-ui/src/molecules/RadioGroup.js @@ -10,11 +10,9 @@ class RadioGroup extends React.Component { } } - handleChange = event => { - const value = event.target.value - + handleChange(event) { + const { value } = event.target this.setState({ value }) - this.props.onChange(value) } @@ -26,15 +24,15 @@ class RadioGroup extends React.Component { <div> {options.map(option => ( <Radio + checked={option.value === value} + color={option.color} + inline={inline} key={option.value} + label={option.label} name={name} + onChange={this.handleChange} required={required} - inline={inline} value={option.value} - label={option.label} - color={option.color} - checked={option.value === value} - onChange={this.handleChange} /> ))} </div> diff --git a/packages/xpub-ui/src/molecules/Upload.js b/packages/xpub-ui/src/molecules/Upload.js index b18c1332e665e77dd14ba21f00218a4b5371bae3..56c71639225f6f273ce1197cee7e850782d50c8a 100644 --- a/packages/xpub-ui/src/molecules/Upload.js +++ b/packages/xpub-ui/src/molecules/Upload.js @@ -4,9 +4,13 @@ import React from 'react' // TODO: make this a HOC for <UploadingFile>? class Upload extends React.Component { - state = { - progress: 0, - error: undefined, + constructor(props) { + super(props) + + this.state = { + progress: 0, + error: undefined, + } } componentDidMount() { @@ -19,7 +23,7 @@ class Upload extends React.Component { } // TODO: 'progress' event not being fired often enough? - handleProgress = event => { + handleProgress(event) { if (!event.lengthComputable) return this.setState({ @@ -27,7 +31,7 @@ class Upload extends React.Component { }) } - handleLoad = event => { + handleLoad(event) { if (this.props.request.status === 200) { this.setState({ progress: 1, @@ -44,13 +48,13 @@ class Upload extends React.Component { } } - handleError = event => { + handleError(event) { this.setState({ error: 'There was an error', }) } - handleAbort = event => { + handleAbort(event) { this.setState({ error: 'The upload was cancelled', })