diff --git a/packages/component-app/src/index.js b/packages/component-app/src/index.js index 243220c28587a64c83710316cdaa8ec04ba8495d..6f1f42a64b1ecf4a71345e76fa416d89015cb96c 100644 --- a/packages/component-app/src/index.js +++ b/packages/component-app/src/index.js @@ -1,7 +1,5 @@ module.exports = { frontend: { - components: [ - () => require('./components') - ] + components: [() => require('./components')], }, } diff --git a/packages/component-authentication/src/components/Login.js b/packages/component-authentication/src/components/Login.js index e78b2582478af25694f2f60cde24c3df98f38a76..9b6f5763fe2b6b60eab3df24af8709402ffb194f 100644 --- a/packages/component-authentication/src/components/Login.js +++ b/packages/component-authentication/src/components/Login.js @@ -15,17 +15,17 @@ const Login = ({ errorMessage, handleSubmit }) => ( {errorMessage && <div className={classes.error}>{errorMessage}</div>} - <form onSubmit={handleSubmit} className={classes.form}> - <Field name="username" component={UsernameInput} /> - <Field name="password" component={PasswordInput} /> - <Button primary type="submit" className={classes.button}> + <form className={classes.form} onSubmit={handleSubmit}> + <Field component={UsernameInput} name="username" /> + <Field component={PasswordInput} name="password" /> + <Button className={classes.button} primary type="submit"> Login </Button> </form> <div className={classes.alternate}> <span className={classes.message}>You don't have an account?</span> - <Link to="/signup" className={classes.link}> + <Link className={classes.link} to="/signup"> Sign up </Link> </div> diff --git a/packages/component-authentication/src/components/Signup.js b/packages/component-authentication/src/components/Signup.js index 400eb800895717f6597b3729dd9d8582664a7353..8a95e222298f58b1a885c015faa5790d28dcb5ca 100644 --- a/packages/component-authentication/src/components/Signup.js +++ b/packages/component-authentication/src/components/Signup.js @@ -18,18 +18,18 @@ const Signup = ({ errorMessage, handleSubmit }) => ( {errorMessage && <div className={classes.error}>{errorMessage}</div>} - <form onSubmit={handleSubmit} className={classes.form}> - <Field name="username" component={UsernameInput} /> - <Field name="email" component={EmailInput} /> - <Field name="password" component={PasswordInput} /> - <Button primary type="submit" className={classes.button}> + <form className={classes.form} onSubmit={handleSubmit}> + <Field component={UsernameInput} name="username" /> + <Field component={EmailInput} name="email" /> + <Field component={PasswordInput} name="password" /> + <Button className={classes.button} primary type="submit"> Sign up </Button> </form> <div className={classes.alternate}> <span className={classes.message}>Already have an account?</span> - <Link to="/login" className={classes.link}> + <Link className={classes.link} to="/login"> Login </Link> </div> diff --git a/packages/component-authentication/src/index.js b/packages/component-authentication/src/index.js index 3f2b60b0c51bc7a695c7ca1f32e2b1c68fbfedb5..44c18796cbf37e9b2319ab74efbbcdcff5a1a5a8 100644 --- a/packages/component-authentication/src/index.js +++ b/packages/component-authentication/src/index.js @@ -2,9 +2,9 @@ module.exports = { frontend: { components: [() => require('./components')], reducers: { + currentUser: () => require('./redux/currentUser').default, login: () => require('./redux/login').default, signup: () => require('./redux/signup').default, - currentUser: () => require('./redux/currentUser').default, }, }, } diff --git a/packages/component-authentication/src/redux/currentUser.js b/packages/component-authentication/src/redux/currentUser.js index b0b0f8ffe9874dd7f065248a775f737074d8d4df..c752a9bb34a35b331843b2e2f498a1f47fd80e0e 100644 --- a/packages/component-authentication/src/redux/currentUser.js +++ b/packages/component-authentication/src/redux/currentUser.js @@ -20,8 +20,8 @@ export const getCurrentUserSuccess = user => ({ }) export const getCurrentUserFailure = error => ({ - type: GET_CURRENT_USER_FAILURE, error, + type: GET_CURRENT_USER_FAILURE, }) export const getCurrentUser = () => dispatch => { @@ -40,50 +40,50 @@ export const getCurrentUser = () => dispatch => { /* reducer */ const initialState = { - isFetching: false, - isFetched: false, + error: null, isAuthenticated: false, + isFetched: false, + isFetching: false, user: null, - error: null, } export default (state = initialState, action) => { switch (action.type) { case GET_CURRENT_USER_REQUEST: return { - isFetching: true, - isFetched: false, + error: null, isAuthenticated: false, + isFetched: false, + isFetching: true, user: null, - error: null, } case GET_CURRENT_USER_FAILURE: return { - isFetching: false, - isFetched: true, + error: action.error, isAuthenticated: false, + isFetched: true, + isFetching: false, user: null, - error: action.error, } case GET_CURRENT_USER_SUCCESS: return { - isFetching: false, - isFetched: true, + error: null, isAuthenticated: true, + isFetched: true, + isFetching: false, user: action.user, - error: null, } // clear the current user on logout case LOGOUT_SUCCESS: return { - isFetching: false, - isFetched: false, + error: null, isAuthenticated: false, + isFetched: false, + isFetching: false, user: null, - error: null, } default: diff --git a/packages/component-authentication/src/redux/login.js b/packages/component-authentication/src/redux/login.js index a1a051fed46431f07b557cf792b8caf430c7218d..706cb02549612e2b681d90706e927acc1416a3b5 100644 --- a/packages/component-authentication/src/redux/login.js +++ b/packages/component-authentication/src/redux/login.js @@ -21,8 +21,8 @@ export const loginSuccess = user => ({ }) export const loginFailure = error => ({ - type: LOGIN_FAILURE, error, + type: LOGIN_FAILURE, }) export const login = credentials => dispatch => { @@ -43,28 +43,28 @@ export const login = credentials => dispatch => { /* reducer */ const initialState = { - isFetching: false, error: null, + isFetching: false, } export default (state = initialState, action) => { switch (action.type) { case LOGIN_REQUEST: return { - isFetching: true, error: null, + isFetching: true, } case LOGIN_SUCCESS: return { - isFetching: false, error: null, + isFetching: false, } case LOGIN_FAILURE: return { - isFetching: false, error: action.error, + isFetching: false, } default: diff --git a/packages/component-authentication/src/redux/signup.js b/packages/component-authentication/src/redux/signup.js index be260253e09b0342938a98a880a9881e7b743155..daa23590f8d875ad7355547dc629f4ba1be515b9 100644 --- a/packages/component-authentication/src/redux/signup.js +++ b/packages/component-authentication/src/redux/signup.js @@ -19,8 +19,8 @@ export const signupSuccess = user => ({ }) export const signupFailure = error => ({ - type: SIGNUP_FAILURE, error, + type: SIGNUP_FAILURE, }) export const signup = credentials => dispatch => { @@ -40,28 +40,28 @@ export const signup = credentials => dispatch => { /* reducer */ const initialState = { - isFetching: false, error: null, + isFetching: false, } export default (state = initialState, action) => { switch (action.type) { case SIGNUP_REQUEST: return { - isFetching: true, error: null, + isFetching: true, } case SIGNUP_SUCCESS: return { - isFetching: false, error: null, + isFetching: false, } case SIGNUP_FAILURE: return { - isFetching: false, error: action.error, + isFetching: false, } default: diff --git a/packages/component-dashboard/src/components/AssignEditor.js b/packages/component-dashboard/src/components/AssignEditor.js index c8f27ff0db4a9e87a27f28e974f94e510fb2c8fa..a08077a9705faec48b409c7030237e485f7644c0 100644 --- a/packages/component-dashboard/src/components/AssignEditor.js +++ b/packages/component-dashboard/src/components/AssignEditor.js @@ -14,20 +14,20 @@ const AssignEditor = ({ addUserToTeam, }) => ( <Menu - value={team ? team.members[0] : null} label={teamName} - options={options} - placeholder="Assign an editor…" onChange={user => { addUserToTeam({ - team, - teamTypeName, - name: teamName, group: 'editor', + name: teamName, project, + team, + teamTypeName, user, }) }} + options={options} + placeholder="Assign an editor…" + value={team ? team.members[0] : null} /> ) diff --git a/packages/component-dashboard/src/components/AssignEditorContainer.js b/packages/component-dashboard/src/components/AssignEditorContainer.js index b14bd8c3da132e9e85c1d476d00e9811bd49e354..b39db3e709de8ee874e4a1fb72e1824625025d97 100644 --- a/packages/component-dashboard/src/components/AssignEditorContainer.js +++ b/packages/component-dashboard/src/components/AssignEditorContainer.js @@ -4,13 +4,19 @@ import AssignEditor from './AssignEditor' import { addUserToTeam } from '../redux/teams' const editorOption = user => ({ - value: user.id, label: user.username, // TODO: name + value: user.id, }) export default compose( connect( (state, { project, teamTypeName }) => ({ + options: + state.users && + !state.users.isFetching && + state.users.users + // .filter(user => user.roles.includes(teamType)) // TODO + .map(editorOption), team: state.teams && state.teams.find( @@ -19,12 +25,6 @@ export default compose( team.object.id === project.id && team.teamType.name === teamTypeName, ), - options: - state.users && - !state.users.isFetching && - state.users.users - // .filter(user => user.roles.includes(teamType)) // TODO - .map(editorOption), }), { addUserToTeam, diff --git a/packages/component-dashboard/src/components/Dashboard.js b/packages/component-dashboard/src/components/Dashboard.js index 1034a1d0f3f2db34893585e7eca6252ca1c6060f..4cb225f0c1fabaccf9e0923957ef590f51730c7a 100644 --- a/packages/component-dashboard/src/components/Dashboard.js +++ b/packages/component-dashboard/src/components/Dashboard.js @@ -42,9 +42,9 @@ const Dashboard = ({ <div className={classes.heading}>My Submissions</div> {dashboard.owner.map(project => ( <OwnerItemWithVersion + deleteProject={deleteProject} key={project.id} project={project} - deleteProject={deleteProject} /> ))} </div> @@ -55,9 +55,9 @@ const Dashboard = ({ <div className={classes.heading}>To review</div> {dashboard.reviewer.map(project => ( <ReviewerItemWithVersion + currentUser={currentUser} key={project.id} project={project} - currentUser={currentUser} reviewerResponse={reviewerResponse} /> ))} @@ -69,9 +69,9 @@ const Dashboard = ({ <div className={classes.heading}>My Manuscripts</div> {dashboard.editor.map(project => ( <EditorItemWithVersion + AssignEditor={AssignEditor} key={project.id} project={project} - AssignEditor={AssignEditor} /> ))} </div> diff --git a/packages/component-dashboard/src/components/DashboardPage.js b/packages/component-dashboard/src/components/DashboardPage.js index 0ff0ee7244f24de483285fcfa98868e36d8e0936..e8efaac3c80fbda1ddd7a9bd0a646e89b57f4505 100644 --- a/packages/component-dashboard/src/components/DashboardPage.js +++ b/packages/component-dashboard/src/components/DashboardPage.js @@ -28,10 +28,9 @@ export default compose( ]), connect( state => { - const collections = state.collections - const teams = state.teams + const { collections } = state + const { conversion, teams } = state const currentUser = selectCurrentUser(state) - const conversion = state.conversion const sortedCollections = newestFirst(collections) @@ -57,11 +56,6 @@ export default compose( ) const dashboard = { - owner: sortedCollections.filter( - collection => - collection.owners && - collection.owners.some(owner => owner.id === currentUser.id), - ), editor: newestFirst( unassignedCollections .concat(myCollections) @@ -70,6 +64,11 @@ export default compose( items.findIndex(item => item.id === collection.id) === index, ), ), + owner: sortedCollections.filter( + collection => + collection.owners && + collection.owners.some(owner => owner.id === currentUser.id), + ), // reviewer: newestFirst(teams // .filter(team => team.group === 'reviewer' // && team.object.type === 'collection' @@ -86,15 +85,15 @@ export default compose( ), } - return { collections, currentUser, conversion, dashboard } + return { collections, conversion, currentUser, dashboard } }, (dispatch, { history }) => ({ - uploadManuscript: acceptedFiles => - dispatch(uploadManuscript(acceptedFiles, history)), - reviewerResponse: (project, version, reviewer, status) => - dispatch(reviewerResponse(project, version, reviewer, status)), deleteProject: collection => dispatch(actions.deleteCollection(collection)), + reviewerResponse: (project, version, reviewer, status) => + dispatch(reviewerResponse(project, version, reviewer, status)), + uploadManuscript: acceptedFiles => + dispatch(uploadManuscript(acceptedFiles, history)), }), ), withProps({ diff --git a/packages/component-dashboard/src/components/Reviews.js b/packages/component-dashboard/src/components/Reviews.js index 7b40080a8fc8c91303496907af4d300d09faab80..7eb86d258b43a7ca0b3e1620fa48af7022b2e2ed 100644 --- a/packages/component-dashboard/src/components/Reviews.js +++ b/packages/component-dashboard/src/components/Reviews.js @@ -7,7 +7,7 @@ import classes from './Reviews.local.scss' const Reviews = ({ reviews }) => ( <div className={classes.root}> {Object.keys(reviews).map(status => ( - <span key={status} className={classes.badge}> + <span className={classes.badge} key={status}> <Badge count={reviews[status].length} label={status} /> </span> ))} diff --git a/packages/component-dashboard/src/components/Status.js b/packages/component-dashboard/src/components/Status.js index b5d2db1802273d88c5179f7982b922cac22c914c..cbac37d53e82b41b7dc501e173a0e31c9480d403 100644 --- a/packages/component-dashboard/src/components/Status.js +++ b/packages/component-dashboard/src/components/Status.js @@ -4,11 +4,11 @@ import classes from './Status.local.css' // TODO: move labels to journal config const labels = { - new: 'Unsubmitted', - submitted: 'Submitted', accepted: 'Accepted', assignedToEditor: 'Assigned to editor', assigningReviewers: 'Assigning reviewers', + new: 'Unsubmitted', + submitted: 'Submitted', } const Status = ({ status }) => ( diff --git a/packages/component-dashboard/src/components/UploadManuscript.js b/packages/component-dashboard/src/components/UploadManuscript.js index 51a1ae5adc8c90396cf2f29141437b2997afd349..eae6ef8c376792257d59b44bd95b0252fb8b8255 100644 --- a/packages/component-dashboard/src/components/UploadManuscript.js +++ b/packages/component-dashboard/src/components/UploadManuscript.js @@ -9,9 +9,9 @@ const isIdle = conversion => const UploadManuscript = ({ uploadManuscript, conversion }) => ( <Dropzone - onDrop={uploadManuscript} accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document" className={classes.dropzone} + onDrop={uploadManuscript} > <div className={classes.root}> <div diff --git a/packages/component-dashboard/src/redux/conversion.js b/packages/component-dashboard/src/redux/conversion.js index d4af1288f437e721422f056ac57e1ad45d59e7ec..34892de2231136dd3b583c6355c182648cbe2159 100644 --- a/packages/component-dashboard/src/redux/conversion.js +++ b/packages/component-dashboard/src/redux/conversion.js @@ -16,14 +16,14 @@ export const uploadManuscriptRequest = () => ({ }) export const uploadManuscriptSuccess = (collection, fragment) => ({ - type: UPLOAD_MANUSCRIPT_SUCCESS, collection, fragment, + type: UPLOAD_MANUSCRIPT_SUCCESS, }) export const uploadManuscriptFailure = error => ({ - type: UPLOAD_MANUSCRIPT_FAILURE, error, + type: UPLOAD_MANUSCRIPT_FAILURE, }) export const uploadManuscript = (acceptedFiles, history) => dispatch => { @@ -64,20 +64,20 @@ export const uploadManuscript = (acceptedFiles, history) => dispatch => { // TODO: rethrow errors so they can be caught here return dispatch( actions.createFragment(collection, { - fragmentType: 'version', created: new Date(), // TODO: set on server - version: 1, - source, - metadata: { - title, - }, files: { - supplementary: [], manuscript: { name: inputFile.name, url: fileURL, }, + supplementary: [], + }, + fragmentType: 'version', + metadata: { + title, }, + source, + version: 1, }), ).then(({ fragment }) => { dispatch(uploadManuscriptSuccess(collection, fragment)) @@ -105,8 +105,8 @@ export const uploadManuscript = (acceptedFiles, history) => dispatch => { /* reducer */ const initialState = { - converting: false, complete: undefined, + converting: false, error: undefined, } @@ -114,21 +114,21 @@ export default (state = initialState, action) => { switch (action.type) { case UPLOAD_MANUSCRIPT_REQUEST: return { - converting: true, complete: false, + converting: true, error: undefined, } case UPLOAD_MANUSCRIPT_SUCCESS: return { - converting: false, complete: true, + converting: false, } case UPLOAD_MANUSCRIPT_FAILURE: return { - converting: false, complete: false, + converting: false, error: action.error, } diff --git a/packages/component-manuscript/src/components/Manuscript.js b/packages/component-manuscript/src/components/Manuscript.js index af9097ad071ebbc32f160e6eea85be62d970c95d..722f4c2fa975f87781831e9d7c822de5a99f8091 100644 --- a/packages/component-manuscript/src/components/Manuscript.js +++ b/packages/component-manuscript/src/components/Manuscript.js @@ -15,13 +15,13 @@ const Manuscript = ({ <SimpleEditor classes={classes.fullscreen} content={content} - user={currentUser} fileUpload={fileUpload} history={history} + onSave={source => updateManuscript({ source })} readOnly={false} trackChanges={false} update={data => updateManuscript(data)} - onSave={source => updateManuscript({ source })} + user={currentUser} /> ) diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js index f59033cb5eacbd621b8c09ab805171026364db2a..b4ae8eaaf46b86067433a35623959e32a96d7c0a 100644 --- a/packages/component-manuscript/src/components/ManuscriptPage.js +++ b/packages/component-manuscript/src/components/ManuscriptPage.js @@ -25,7 +25,7 @@ export default compose( const content = version.source // TODO: load from a file - return { currentUser, project, version, content } + return { content, currentUser, project, version } }, { fileUpload: actions.fileUpload, diff --git a/packages/component-review/src/components/DecisionPage.js b/packages/component-review/src/components/DecisionPage.js index 95c1dc11ae02ebcd2b386e3cb1009ba2962b146e..6ab6c342b5550c42ee84e3b75bc6ff8b4f1a14d8 100644 --- a/packages/component-review/src/components/DecisionPage.js +++ b/packages/component-review/src/components/DecisionPage.js @@ -18,13 +18,11 @@ import DecisionLayout from './decision/DecisionLayout' const handleDecision = (project, version) => dispatch => { return dispatch( actions.updateFragment(project, { + decision: version.decision, id: version.id, rev: version.rev, - decision: version.decision, }), ).then(() => { - console.log(version) - switch (version.decision.recommendation) { case 'accept': return dispatch( @@ -78,13 +76,11 @@ const handleDecision = (project, version) => dispatch => { } const onSubmit = (values, dispatch, { project, version, history }) => { - console.log('submit', values) - version.decision = { ...version.decision, ...values, - submitted: new Date(), status: 'submitted', + submitted: new Date(), } return dispatch(handleDecision(project, version)) @@ -100,8 +96,6 @@ const onSubmit = (values, dispatch, { project, version, history }) => { } const onChange = (values, dispatch, { project, version }) => { - console.log('change', values) - version.decision = { ...version.decision, ...values, @@ -109,9 +103,9 @@ const onChange = (values, dispatch, { project, version }) => { return dispatch( actions.updateFragment(project, { + decision: version.decision, id: version.id, rev: version.rev, - decision: version.decision, }), ) @@ -130,7 +124,7 @@ export default compose( const version = selectFragment(state, match.params.version) const currentVersion = selectCurrentVersion(state, project) - return { project, versions, version, currentVersion } + return { currentVersion, project, version, versions } }, { uploadFile, @@ -144,7 +138,7 @@ export default compose( }), reduxForm({ form: 'decision', - onSubmit, onChange: debounce(onChange, 1000, { maxWait: 5000 }), + onSubmit, }), )(DecisionLayout) diff --git a/packages/component-review/src/components/ReviewPage.js b/packages/component-review/src/components/ReviewPage.js index ce0aa8309078f70740ef712fb4778bc9710fdf87..9ff53e95333fc84f54a5ce5ea6337701ee9a79af 100644 --- a/packages/component-review/src/components/ReviewPage.js +++ b/packages/component-review/src/components/ReviewPage.js @@ -22,11 +22,9 @@ const onSubmit = ( dispatch, { history, project, version, reviewer }, ) => { - console.log('submit', values) - Object.assign(reviewer, { - submitted: new Date(), status: 'reviewed', + submitted: new Date(), ...values, }) @@ -49,8 +47,6 @@ const onSubmit = ( } const onChange = (values, dispatch, { project, version, reviewer }) => { - console.log('change', values) - Object.assign(reviewer, { submitted: new Date(), ...values, @@ -94,12 +90,12 @@ export default compose( const reviewer = getReviewerFromUser(project, currentVersion, currentUser) return { - project, - versions, - version, currentVersion, - reviewer, handlingEditors, + project, + reviewer, + version, + versions, } }, { @@ -114,7 +110,7 @@ export default compose( }), reduxForm({ form: 'review', - onSubmit, onChange: debounce(onChange, 1000, { maxWait: 5000 }), + onSubmit, }), )(ReviewLayout) diff --git a/packages/component-review/src/components/ReviewersPage.js b/packages/component-review/src/components/ReviewersPage.js index f5b97db8f9df3091787419e358ee76a2ae15a571..3b8dfa8c4cd399e1910919d6fc047b2451ff08d2 100644 --- a/packages/component-review/src/components/ReviewersPage.js +++ b/packages/component-review/src/components/ReviewersPage.js @@ -40,10 +40,10 @@ export default compose( reviewer._reviewer = projectReviewer }) - return { project, version, reviewers, reviewerUsers } + return { project, reviewers, reviewerUsers, version } }), withProps({ - ReviewerForm: ReviewerFormContainer, Reviewer: ReviewerContainer, + ReviewerForm: ReviewerFormContainer, }), )(Reviewers) diff --git a/packages/component-review/src/components/decision/DecisionForm.js b/packages/component-review/src/components/decision/DecisionForm.js index 31417feb9560d2ca165316c735aae1c9fb380a65..ed32ac84f01625e70ba214cd120dab0d09d2abe5 100644 --- a/packages/component-review/src/components/decision/DecisionForm.js +++ b/packages/component-review/src/components/decision/DecisionForm.js @@ -1,14 +1,13 @@ import React from 'react' import { FormSection } from 'redux-form' -import { Button } from 'xpub-ui' import { NoteEditor } from 'xpub-edit' -import { Attachments, RadioGroup, ValidatedField } from 'xpub-ui' +import { Attachments, Button, RadioGroup, ValidatedField } from 'xpub-ui' import { withJournal } from 'xpub-journal' import { required } from 'xpub-validators' import classes from './DecisionForm.local.scss' const NoteInput = input => ( - <NoteEditor title="Decision" placeholder="Enter your decision…" {...input} /> + <NoteEditor placeholder="Enter your decision…" title="Decision" {...input} /> ) const AttachmentsInput = uploadFile => input => ( @@ -16,7 +15,7 @@ const AttachmentsInput = uploadFile => input => ( ) const RecommendationInput = journal => input => ( - <RadioGroup inline required options={journal.recommendations} {...input} /> + <RadioGroup inline options={journal.recommendations} required {...input} /> ) const DecisionForm = ({ journal, valid, handleSubmit, uploadFile }) => ( @@ -26,15 +25,15 @@ const DecisionForm = ({ journal, valid, handleSubmit, uploadFile }) => ( <div className={classes.note}> <div className={classes.content}> <ValidatedField + component={NoteInput} name="content" validate={[required]} - component={NoteInput} /> </div> <ValidatedField - name="attachments" component={AttachmentsInput(uploadFile)} + name="attachments" /> </div> </FormSection> @@ -42,14 +41,14 @@ const DecisionForm = ({ journal, valid, handleSubmit, uploadFile }) => ( <div className={classes.section}> <ValidatedField + component={RecommendationInput(journal)} name="recommendation" validate={[required]} - component={RecommendationInput(journal)} /> </div> <div> - <Button type="submit" primary disabled={!valid}> + <Button disabled={!valid} primary type="submit"> Submit </Button> </div> diff --git a/packages/component-review/src/components/decision/DecisionLayout.js b/packages/component-review/src/components/decision/DecisionLayout.js index a32f27291c4ab75c3859cf45813c448d29ac8f24..295bed8ad929a8878fc3075c6c19a20cbd9660c3 100644 --- a/packages/component-review/src/components/decision/DecisionLayout.js +++ b/packages/component-review/src/components/decision/DecisionLayout.js @@ -22,7 +22,7 @@ const DecisionLayout = ({ versions.forEach(version => { // TODO: allow multiple decisions, e.g. appeals - const decision = version.decision + const { decision } = version if (decision && decision.submitted) { const submittedMoment = moment(decision.submitted) @@ -30,8 +30,6 @@ const DecisionLayout = ({ const label = submittedMoment.format('YYYY-MM-DD') decisionSections.push({ - key, - label, content: ( <div> <ReviewMetadata version={version} /> @@ -39,23 +37,21 @@ const DecisionLayout = ({ <Decision decision={decision} /> </div> ), + key, + label, }) editorSections.push({ - key, - label, content: ( - <SimpleEditor - content={version.source} - layout="bare" - readOnly={true} - /> + <SimpleEditor content={version.source} layout="bare" readOnly /> ), + key, + label, }) } }, []) - const decision = currentVersion.decision + const { decision } = currentVersion if (!decision || !decision.submitted) { const submittedMoment = moment() @@ -63,32 +59,28 @@ const DecisionLayout = ({ const label = submittedMoment.format('YYYY-MM-DD') decisionSections.push({ - key, - label, content: ( <div> <ReviewMetadata version={currentVersion} /> <DecisionReviews version={currentVersion} /> <DecisionForm decision={decision} - valid={valid} handleSubmit={handleSubmit} uploadFile={uploadFile} + valid={valid} /> </div> ), + key, + label, }) editorSections.push({ - key, - label, content: ( - <SimpleEditor - content={currentVersion.source} - layout="bare" - readOnly={true} - /> + <SimpleEditor content={currentVersion.source} layout="bare" readOnly /> ), + key, + label, }) } @@ -96,16 +88,16 @@ const DecisionLayout = ({ <div className={classes.root}> <div className={classes.column}> <Tabs - sections={editorSections} activeKey={editorSections[editorSections.length - 1].key} + sections={editorSections} title="Versions" /> </div> <div className={classes.column}> <Tabs - sections={decisionSections} activeKey={decisionSections[decisionSections.length - 1].key} + sections={decisionSections} title="Versions" /> </div> diff --git a/packages/component-review/src/components/review/ReviewForm.js b/packages/component-review/src/components/review/ReviewForm.js index 6f40767b231d5c7697f205570f6818da93fc2598..0c4a38429ef1d502d06c6610817ddb425f812806 100644 --- a/packages/component-review/src/components/review/ReviewForm.js +++ b/packages/component-review/src/components/review/ReviewForm.js @@ -1,14 +1,13 @@ import React from 'react' import { FormSection } from 'redux-form' -import { Button } from 'xpub-ui' import { NoteEditor } from 'xpub-edit' -import { Attachments, RadioGroup, ValidatedField } from 'xpub-ui' +import { Attachments, Button, RadioGroup, ValidatedField } from 'xpub-ui' import { withJournal } from 'xpub-journal' import { required } from 'xpub-validators' import classes from './ReviewForm.local.scss' const NoteInput = input => ( - <NoteEditor title="Review" placeholder="Enter your review…" {...input} /> + <NoteEditor placeholder="Enter your review…" title="Review" {...input} /> ) const AttachmentsInput = uploadFile => input => ( @@ -17,16 +16,16 @@ const AttachmentsInput = uploadFile => input => ( const ConfidentialInput = input => ( <NoteEditor - title="Confidential" placeholder="Enter a confidential note to the editor (optional)…" + title="Confidential" {...input} /> ) const RecommendationInput = journal => input => ( <RadioGroup - inline class={classes.class} + inline options={journal.recommendations} {...input} /> @@ -39,15 +38,15 @@ const ReviewForm = ({ journal, valid, handleSubmit, uploadFile }) => ( <div className={classes.note}> <div className={classes.content}> <ValidatedField + component={NoteInput} name="content" validate={[required]} - component={NoteInput} /> </div> <ValidatedField - name="attachments" component={AttachmentsInput(uploadFile)} + name="attachments" /> </div> </FormSection> @@ -57,10 +56,10 @@ const ReviewForm = ({ journal, valid, handleSubmit, uploadFile }) => ( <FormSection name="confidential"> <div className={classes.note}> <div className={classes.content}> - <ValidatedField name="content" component={ConfidentialInput} /> + <ValidatedField component={ConfidentialInput} name="content" /> </div> - <ValidatedField name="attachments" component={AttachmentsInput} /> + <ValidatedField component={AttachmentsInput} name="attachments" /> </div> </FormSection> </div> @@ -69,15 +68,15 @@ const ReviewForm = ({ journal, valid, handleSubmit, uploadFile }) => ( <FormSection name="Recommendation"> <div className={classes.title}>Recommendation</div> <ValidatedField + component={RecommendationInput(journal)} name="recommendation" validate={[required]} - component={RecommendationInput(journal)} /> </FormSection> </div> <div> - <Button type="submit" primary disabled={!valid}> + <Button disabled={!valid} primary type="submit"> Submit </Button> </div> diff --git a/packages/component-review/src/components/review/ReviewLayout.js b/packages/component-review/src/components/review/ReviewLayout.js index 8dd8baf9260796a65f9bbf17962b485ee9453235..2c762bab596f251dcc4888375c47a8132d89c365 100644 --- a/packages/component-review/src/components/review/ReviewLayout.js +++ b/packages/component-review/src/components/review/ReviewLayout.js @@ -32,30 +32,26 @@ const ReviewLayout = ({ const label = submittedMoment.format('YYYY-MM-DD') reviewSections.push({ - key, - label, content: ( <div> <ReviewMetadata - version={version} handlingEditors={handlingEditors} + version={version} /> <Review review={review} /> </div> ), + key, + label, }) // TODO: need to include unreviewed versions? editorSections.push({ - key, - label, content: ( - <SimpleEditor - content={version.source} - layout="bare" - readOnly={true} - /> + <SimpleEditor content={version.source} layout="bare" readOnly /> ), + key, + label, }) } }, []) @@ -70,34 +66,30 @@ const ReviewLayout = ({ const label = submittedMoment.format('YYYY-MM-DD') reviewSections.push({ - key, - label, content: ( <div> <ReviewMetadata - version={currentVersion} handlingEditors={handlingEditors} + version={currentVersion} /> <ReviewForm - review={review} - valid={valid} handleSubmit={handleSubmit} + review={review} uploadFile={uploadFile} + valid={valid} /> </div> ), + key, + label, }) editorSections.push({ - key, - label, content: ( - <SimpleEditor - layout="bare" - content={currentVersion.source} - readOnly={true} - /> + <SimpleEditor content={currentVersion.source} layout="bare" readOnly /> ), + key, + label, }) } @@ -105,16 +97,16 @@ const ReviewLayout = ({ <div className={classes.root}> <div className={classes.manuscript}> <Tabs - sections={editorSections} activeKey={editorSections[editorSections.length - 1].key} + sections={editorSections} title="Versions" /> </div> <div className={classes.review}> <Tabs - sections={reviewSections} activeKey={reviewSections[reviewSections.length - 1].key} + sections={reviewSections} title="Versions" /> </div> diff --git a/packages/component-review/src/components/reviewers/Reviewer.js b/packages/component-review/src/components/reviewers/Reviewer.js index 49a2e9364f0d1d35fade35d46e332d30ba765c8d..ec48c6c349a6fed49809f78b19982310bad9e37a 100644 --- a/packages/component-review/src/components/reviewers/Reviewer.js +++ b/packages/component-review/src/components/reviewers/Reviewer.js @@ -1,9 +1,10 @@ import React from 'react' import { map } from 'lodash' import Moment from 'react-moment' -import classes from './Reviewer.local.scss' import { Avatar, Button } from 'xpub-ui' +import classes from './Reviewer.local.scss' + const ordinalLetter = ordinal => { return ordinal ? String.fromCharCode(96 + ordinal) : null } @@ -11,10 +12,10 @@ const ordinalLetter = ordinal => { const Reviewer = ({ reviewer, removeReviewer }) => ( <div className={classes.root}> <Avatar - status={reviewer.status} - width={100} height={70} reviewerLetter={ordinalLetter(reviewer._reviewer.ordinal)} + status={reviewer.status} + width={100} /> <div className={classes.name}>{reviewer._user.username}</div> <div> diff --git a/packages/component-review/src/components/reviewers/ReviewerContainer.js b/packages/component-review/src/components/reviewers/ReviewerContainer.js index 3f4f6408cd02c69f677784f8dae6bd21e4e253cb..f3ec7eb0c140c074a69d69f53b96d332165aa887 100644 --- a/packages/component-review/src/components/reviewers/ReviewerContainer.js +++ b/packages/component-review/src/components/reviewers/ReviewerContainer.js @@ -4,7 +4,7 @@ import { actions } from 'pubsweet-client' import Reviewer from './Reviewer' const removeReviewer = props => () => { - const id = props.reviewer.id + const { id } = props.reviewer return props.deleteFragment(props.project, { id }) } diff --git a/packages/component-review/src/components/reviewers/ReviewerForm.js b/packages/component-review/src/components/reviewers/ReviewerForm.js index fadd7992ff9c639bb7a130b6232da28e192bef92..6a94db20a78ebe5cadc2ea7d896890ccdda4aaf1 100644 --- a/packages/component-review/src/components/reviewers/ReviewerForm.js +++ b/packages/component-review/src/components/reviewers/ReviewerForm.js @@ -16,13 +16,13 @@ const OptionRenderer = option => ( const ReviewerInput = loadOptions => ({ input }) => ( <Select.AsyncCreatable {...input} - valueKey="id" - labelKey="username" + // autoload={false} filterOption={() => true} + labelKey="username" loadOptions={loadOptions} - promptTextCreator={label => `Add ${label}?`} optionRenderer={OptionRenderer} - // autoload={false} + promptTextCreator={label => `Add ${label}?`} + valueKey="id" /> ) @@ -35,13 +35,13 @@ const ReviewerForm = ({ }) => ( <form onSubmit={handleSubmit(onSubmit(reset))}> <Field + component={ReviewerInput(loadOptions)} name="user" validate={required} - component={ReviewerInput(loadOptions)} /> <div className={classes.actions}> - <Button type="submit" primary disabled={!valid}> + <Button disabled={!valid} primary type="submit"> Invite reviewer </Button> </div> diff --git a/packages/component-review/src/components/reviewers/ReviewerFormContainer.js b/packages/component-review/src/components/reviewers/ReviewerFormContainer.js index 1d0b68eb0f67c11eab9e38d2ba444cb798102a4b..fd2255d5beaaf9d63856ba2dc49f92d5e9babc37 100644 --- a/packages/component-review/src/components/reviewers/ReviewerFormContainer.js +++ b/packages/component-review/src/components/reviewers/ReviewerFormContainer.js @@ -29,12 +29,12 @@ const addProjectReviewer = (props, user) => { const addReviewer = (props, projectReviewer) => { const reviewer = { - id: uuid(), - reviewer: projectReviewer.id, - status: 'invited', events: { invited: new Date().toString(), }, + id: uuid(), + reviewer: projectReviewer.id, + status: 'invited', } return props diff --git a/packages/component-review/src/components/reviewers/Reviewers.js b/packages/component-review/src/components/reviewers/Reviewers.js index bb286e093ba1e14937b30c13c9c46258f49dabdf..923c82ed35b5d466f6bd3c92d6b4ed239097d57a 100644 --- a/packages/component-review/src/components/reviewers/Reviewers.js +++ b/packages/component-review/src/components/reviewers/Reviewers.js @@ -13,8 +13,8 @@ const Reviewers = ({ <div className={classes.form}> <ReviewerForm project={project} - version={version} reviewerUsers={reviewerUsers} + version={version} /> </div> diff --git a/packages/component-submit/src/components/Confirm.js b/packages/component-submit/src/components/Confirm.js index 1f03326d24fd1f9a548090388d36d63c51196501..80042aec6990bff5913ebcdf806515bfa9ad71bb 100644 --- a/packages/component-submit/src/components/Confirm.js +++ b/packages/component-submit/src/components/Confirm.js @@ -20,8 +20,8 @@ const Confirm = ({ toggleConfirming }) => ( proper attribution. (The journal employs{' '} <a href="https://www.crossref.org/services/similarity-check/" - target="_blank" rel="noopener noreferrer" + target="_blank" > CrossCheck </a>{' '} @@ -44,7 +44,7 @@ const Confirm = ({ toggleConfirming }) => ( </p> <div className={classes.actions}> - <Button type="submit" primary> + <Button primary type="submit"> Submit your manuscript </Button> <span className={classes.actionDivider}> or </span> diff --git a/packages/component-submit/src/components/Declarations.js b/packages/component-submit/src/components/Declarations.js index 0b8afc7ff8d378af07bd2f4d64de0640496075cd..2ccced010392f442d79e3cbee660507f6429782d 100644 --- a/packages/component-submit/src/components/Declarations.js +++ b/packages/component-submit/src/components/Declarations.js @@ -6,24 +6,24 @@ import { withJournal } from 'xpub-journal' import { required } from 'xpub-validators' import classes from './Declarations.local.scss' -const DeclarationInput = input => <YesOrNo inline={true} {...input} /> +const DeclarationInput = input => <YesOrNo inline {...input} /> const Declarations = ({ journal }) => { return ( <FormSection name="declarations"> {journal.declarations.questions.map(question => ( <div - key={question.id} - id={`declarations.${question.id}`} 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]} - component={DeclarationInput} /> </div> ))} diff --git a/packages/component-submit/src/components/Metadata.js b/packages/component-submit/src/components/Metadata.js index 231811b4ac70dc28c8676da8b895bc269e0d432a..4702c8536eab21a86adba3cd5ed8354cf7dffa9b 100644 --- a/packages/component-submit/src/components/Metadata.js +++ b/packages/component-submit/src/components/Metadata.js @@ -3,7 +3,6 @@ import { FormSection } from 'redux-form' import { AbstractEditor, TitleEditor } from 'xpub-edit' import { CheckboxGroup, Menu, TextField, ValidatedField } from 'xpub-ui' import { withJournal } from 'xpub-journal' -import classes from './Metadata.local.scss' import { join, required, @@ -13,6 +12,8 @@ import { split, } from 'xpub-validators' +import classes from './Metadata.local.scss' + const minSize1 = minSize(1) const minChars20 = minChars(20) const minChars100 = minChars(100) @@ -25,8 +26,8 @@ const TitleInput = input => ( const AbstractInput = input => ( <AbstractEditor - title="Abstract" placeholder="Enter the abstract…" + title="Abstract" {...input} /> ) @@ -51,19 +52,19 @@ const Metadata = ({ journal }) => ( <FormSection name="metadata"> <div className={classes.section} id="metadata.title"> <ValidatedField + component={TitleInput} name="title" required validate={[minChars20, maxChars500]} - component={TitleInput} /> </div> <div className={classes.section} id="metadata.abstract"> <ValidatedField + component={AbstractInput} name="abstract" required validate={[minChars100, maxChars5000]} - component={AbstractInput} /> </div> @@ -71,12 +72,12 @@ const Metadata = ({ journal }) => ( <div className={classes.label}>Authors</div> <ValidatedField - name="authors" - required + component={AuthorsInput} format={join()} + name="authors" parse={split()} + required validate={[minSize1]} - component={AuthorsInput} /> </div> @@ -84,12 +85,12 @@ const Metadata = ({ journal }) => ( <div className={classes.label}>Keywords</div> <ValidatedField - name="keywords" - required + component={KeywordsInput} format={join()} + name="keywords" parse={split()} + required validate={[minSize1]} - component={KeywordsInput} /> </div> @@ -97,10 +98,10 @@ const Metadata = ({ journal }) => ( <div className={classes.label}>Type of article</div> <ValidatedField + component={ArticleTypeInput(journal)} name="articleType" required validate={[required]} - component={ArticleTypeInput(journal)} /> </div> @@ -108,10 +109,10 @@ const Metadata = ({ journal }) => ( <div className={classes.label}>Section</div> <ValidatedField + component={ArticleSectionInput(journal)} name="articleSection" required validate={[required]} - component={ArticleSectionInput(journal)} /> </div> </FormSection> diff --git a/packages/component-submit/src/components/Notes.js b/packages/component-submit/src/components/Notes.js index d19bb304697d69c49f794b3cf233f563514dcbe9..3dd379f8a38cd2422dc4bfd517b9809c6523c3f3 100644 --- a/packages/component-submit/src/components/Notes.js +++ b/packages/component-submit/src/components/Notes.js @@ -25,16 +25,16 @@ const Notes = () => ( <FormSection name="notes"> <div className={classes.section} id="notes.fundingAcknowledgement"> <ValidatedField + component={FundingInput} name="fundingAcknowledgement" validate={[required]} - component={FundingInput} /> </div> <div className={classes.section} id="notes.specialInstructions"> <ValidatedField - name="specialInstructions" component={InstructionsInput} + name="specialInstructions" /> </div> </FormSection> diff --git a/packages/component-submit/src/components/Submit.js b/packages/component-submit/src/components/Submit.js index c150c7d0a7531ad4dffb572657df118c250eb69f..d1bbe7c2ce562a17cec3bf6adebddde3edbdee5d 100644 --- a/packages/component-submit/src/components/Submit.js +++ b/packages/component-submit/src/components/Submit.js @@ -50,7 +50,7 @@ const Submit = ({ <SupplementaryFiles uploadFile={uploadFile} /> <div> - <Button type="button" primary onClick={toggleConfirming}> + <Button onClick={toggleConfirming} primary type="button"> Submit your manuscript </Button> </div> @@ -62,11 +62,11 @@ const Submit = ({ )} </form> - {/*<div className={classes.validots}> + {/* <div className={classes.validots}> <Validots valid={valid} handleSubmit={handleSubmit}/> - </div>*/} + </div> */} </div> ) diff --git a/packages/component-submit/src/components/SubmitPage.js b/packages/component-submit/src/components/SubmitPage.js index 6b0449db843878d80d8db01427496738ebfddf79..7cf7c29b179004cd6889e980403dabe87e6eecb9 100644 --- a/packages/component-submit/src/components/SubmitPage.js +++ b/packages/component-submit/src/components/SubmitPage.js @@ -90,10 +90,10 @@ export default compose( } }), reduxForm({ - form: 'submit', // enableReinitialize: true, - onSubmit, + form: 'submit', onChange: debounce(onChange, 1000, { maxWait: 5000 }), + onSubmit, }), withState('confirming', 'setConfirming', false), withHandlers({ diff --git a/packages/component-submit/src/components/Suggestions.js b/packages/component-submit/src/components/Suggestions.js index c416eee36c06262527ea104a84c5e6265a3a9718..ecba81ed8dee0f3a01f6830fadd68487eecdf152 100644 --- a/packages/component-submit/src/components/Suggestions.js +++ b/packages/component-submit/src/components/Suggestions.js @@ -33,10 +33,10 @@ const Suggestions = () => ( <div className={classes.sublegend}>Suggested reviewers</div> <ValidatedField - name="suggested" + component={SuggestedReviewerInput} format={joinComma} + name="suggested" parse={splitComma} - component={SuggestedReviewerInput} /> </div> @@ -44,10 +44,10 @@ const Suggestions = () => ( <div className={classes.sublegend}>Opposed reviewers</div> <ValidatedField - name="opposed" + component={OpposedReviewerInput} format={joinComma} + name="opposed" parse={splitComma} - component={OpposedReviewerInput} /> </div> </FormSection> @@ -61,10 +61,10 @@ const Suggestions = () => ( <div className={classes.sublegend}>Suggested editors</div> <ValidatedField - name="suggested" + component={SuggestedEditorInput} format={joinComma} + name="suggested" parse={splitComma} - component={SuggestedEditorInput} /> </div> @@ -72,10 +72,10 @@ const Suggestions = () => ( <div className={classes.sublegend}>Opposed editors</div> <ValidatedField - name="opposed" + component={OpposedEditorInput} format={joinComma} + name="opposed" parse={splitComma} - component={OpposedEditorInput} /> </div> </FormSection> diff --git a/packages/component-submit/src/components/SupplementaryFiles.js b/packages/component-submit/src/components/SupplementaryFiles.js index 2330f254324bedad04c403e681772483cf86a83b..1fd8827a01d4a7b9c42b820fc6477374b6e5d6b9 100644 --- a/packages/component-submit/src/components/SupplementaryFiles.js +++ b/packages/component-submit/src/components/SupplementaryFiles.js @@ -14,7 +14,7 @@ const SupplementaryFiles = ({ uploadFile }) => ( Upload supplementary materials </div> - <ValidatedField name="supplementary" component={FileInput(uploadFile)} /> + <ValidatedField component={FileInput(uploadFile)} name="supplementary" /> </div> </FormSection> ) diff --git a/packages/component-submit/src/components/Validots.js b/packages/component-submit/src/components/Validots.js index 1a19c05353f0879b09b343134b643897a6ab2e45..70b3d649e3377a7e72f57291afa3e71e6e750db7 100644 --- a/packages/component-submit/src/components/Validots.js +++ b/packages/component-submit/src/components/Validots.js @@ -13,11 +13,11 @@ export const Validots = ({ form, valid, handleSubmit }) => ( {form.registeredFields && map(form.registeredFields, field => ( <div key={field.name}> - <Field name={field.name} component={Validot} /> + <Field component={Validot} name={field.name} /> </div> ))} - <button onClick={handleSubmit} disabled={!valid}> + <button disabled={!valid} onClick={handleSubmit}> Submit </button> </div> diff --git a/packages/xpub-edit/src/components/HtmlEditor.js b/packages/xpub-edit/src/components/HtmlEditor.js index b1584a44b4e60a48319777b260508483f3148184..48519fb4a81a3284a822099870619199936d27a0 100644 --- a/packages/xpub-edit/src/components/HtmlEditor.js +++ b/packages/xpub-edit/src/components/HtmlEditor.js @@ -58,13 +58,13 @@ class HtmlEditor extends React.Component { return ( <Editor - options={options} className={className} + onBlur={this.onBlur} + onChange={this.onChange} + options={options} placeholder={placeholder} placeholderClassName={placeholderClassName} title={title} - onChange={this.onChange} - onBlur={this.onBlur} /> ) } diff --git a/packages/xpub-edit/src/components/MenuBar.js b/packages/xpub-edit/src/components/MenuBar.js index 4510877e5c2d511f0c7a17877dd6772a2a7e3497..605c74af4dbc240dd852532a9deb0a939d9f3933 100644 --- a/packages/xpub-edit/src/components/MenuBar.js +++ b/packages/xpub-edit/src/components/MenuBar.js @@ -11,14 +11,14 @@ const MenuBar = ({ title, menu, state, dispatch }) => { const Button = (item, key) => ( <button - key={key} className={classnames({ [classes.button]: true, [classes.active]: item.active && item.active(state), })} - title={item.title} disabled={item.enable && !item.enable(state)} + key={key} onMouseDown={handle(item.run)} + title={item.title} > {item.content} </button> diff --git a/packages/xpub-edit/src/components/abstract/AbstractEditor.js b/packages/xpub-edit/src/components/abstract/AbstractEditor.js index 55ef57d60c6f6aa49dd3a01f38c4a0304c611b02..ea14634f7bd9795c7c8890468de8e7807127f6d1 100644 --- a/packages/xpub-edit/src/components/abstract/AbstractEditor.js +++ b/packages/xpub-edit/src/components/abstract/AbstractEditor.js @@ -12,14 +12,14 @@ const AbstractEditor = ({ onChange, }) => ( <HtmlEditor - options={options} - value={value} className={className} + onBlur={onBlur} + onChange={onChange} + options={options} placeholder={placeholder} placeholderClassName={placeholderClassName} title={title} - onBlur={onBlur} - onChange={onChange} + value={value} /> ) diff --git a/packages/xpub-edit/src/components/abstract/AbstractViewer.js b/packages/xpub-edit/src/components/abstract/AbstractViewer.js index 6a8ad3a01a8bc86578a0e3eaeca607247698df25..4f4e707b2d8b12b3b61858f1b5b3e7f4e7e5c556 100644 --- a/packages/xpub-edit/src/components/abstract/AbstractViewer.js +++ b/packages/xpub-edit/src/components/abstract/AbstractViewer.js @@ -3,7 +3,7 @@ import HtmlViewer from '../HtmlViewer' import * as options from './config' const AbstractViewer = ({ className, value }) => ( - <HtmlViewer className={className} value={value} options={options} /> + <HtmlViewer className={className} options={options} value={value} /> ) export default AbstractViewer diff --git a/packages/xpub-edit/src/components/abstract/config/icons.js b/packages/xpub-edit/src/components/abstract/config/icons.js index ac6303711a4370393d065bad4091cd64c7a20e40..83b21279502874cbee04674f86fec850022d7137 100644 --- a/packages/xpub-edit/src/components/abstract/config/icons.js +++ b/packages/xpub-edit/src/components/abstract/config/icons.js @@ -1,11 +1,13 @@ import React from 'react' export default { - italic: <i>Ital</i>, bold: <b>Bold</b>, - superscript: ( + heading: <span>Section Title</span>, + italic: <i>Ital</i>, + link: <span>Link</span>, + small_caps: ( <span> - t<sup>x</sup> + T<span style={{ fontSize: '70%', fontVariant: 'small-caps' }}>T</span> </span> ), subscript: ( @@ -13,11 +15,9 @@ export default { t<sub>x</sub> </span> ), - small_caps: ( + superscript: ( <span> - T<span style={{ fontVariant: 'small-caps', fontSize: '70%' }}>T</span> + t<sup>x</sup> </span> ), - heading: <span>Section Title</span>, - link: <span>Link</span>, } diff --git a/packages/xpub-edit/src/components/abstract/config/keys.js b/packages/xpub-edit/src/components/abstract/config/keys.js index aa83d95cebdf4505f6c4d937b2f63326f1183e53..96bd95922928de652706d13f065a69dcc9cf29ab 100644 --- a/packages/xpub-edit/src/components/abstract/config/keys.js +++ b/packages/xpub-edit/src/components/abstract/config/keys.js @@ -13,18 +13,18 @@ import { import schema from './schema' const keys = { - 'Mod-z': undo, - 'Shift-Mod-z': redo, Backspace: undoInputRule, - 'Mod-y': redo, + 'Ctrl-Enter': exitCode, Escape: selectParentNode, 'Mod-b': toggleMark(schema.marks.bold), - 'Mod-i': toggleMark(schema.marks.italic), 'Mod-Enter': exitCode, - 'Shift-Enter': exitCode, - 'Ctrl-Enter': exitCode, + 'Mod-i': toggleMark(schema.marks.italic), + 'Mod-y': redo, + 'Mod-z': undo, 'Shift-Ctrl-0': setBlockType(schema.nodes.paragraph), 'Shift-Ctrl-1': setBlockType(schema.nodes.heading, { level: 1 }), + 'Shift-Enter': exitCode, + 'Shift-Mod-z': redo, } Object.keys(baseKeymap).forEach(key => { diff --git a/packages/xpub-edit/src/components/abstract/config/marks.js b/packages/xpub-edit/src/components/abstract/config/marks.js index 823e598dee775d1255150ce02ce1b270efc0c5ab..5af69382a0b56ca4f464c016e275aeb8d5df4fc3 100644 --- a/packages/xpub-edit/src/components/abstract/config/marks.js +++ b/packages/xpub-edit/src/components/abstract/config/marks.js @@ -6,11 +6,11 @@ const link = { inclusive: false, parseDOM: [ { - tag: 'a[href]', getAttrs: dom => ({ href: dom.getAttribute('href'), title: dom.getAttribute('title'), }), + tag: 'a[href]', }, ], toDOM: node => ['a', node.attrs], @@ -25,12 +25,12 @@ const bold = { parseDOM: [ { tag: 'strong' }, { - tag: 'b', getAttrs: node => node.style.fontWeight !== 'normal' && null, + tag: 'b', }, { - style: 'font-weight', getAttrs: value => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null, + style: 'font-weight', }, ], toDOM: () => ['b'], @@ -52,10 +52,10 @@ const small_caps = { } export default { - link, - italic, bold, + italic, + link, + small_caps, subscript, superscript, - small_caps, } diff --git a/packages/xpub-edit/src/components/abstract/config/menu.js b/packages/xpub-edit/src/components/abstract/config/menu.js index aaf0b14faf1e93a55f25770c5afbe126b865d598..2e607f0dac6ac8928e1f53fd244bad95f641e50d 100644 --- a/packages/xpub-edit/src/components/abstract/config/menu.js +++ b/packages/xpub-edit/src/components/abstract/config/menu.js @@ -33,36 +33,48 @@ const promptForURL = () => { } export default { - marks: { - italic: { - title: 'Toggle italic', - content: icons.italic, - active: markActive(schema.marks.italic), - run: toggleMark(schema.marks.italic), + blocks: { + h1: { + active: blockActive(schema.nodes.heading, { level: 1 }), + content: icons.heading, + enable: setBlockType(schema.nodes.heading, { level: 1 }), + run: (state, dispatch) => { + if (blockActive(schema.marks.heading)(state)) { + setBlockType(schema.marks.paragraph)(state, dispatch) + return true + } + + setBlockType(schema.nodes.heading, { level: 1 })(state, dispatch) + }, + title: 'Change to heading level 1', + }, + }, + history: { + redo: { + content: icons.redo, + enable: redo, + run: redo, + title: 'Redo last undone change', }, + undo: { + content: icons.undo, + enable: undo, + run: undo, + title: 'Undo last change', + }, + }, + marks: { bold: { - title: 'Toggle bold', - content: icons.bold, active: markActive(schema.marks.bold), + content: icons.bold, run: toggleMark(schema.marks.bold), + title: 'Toggle bold', }, - subscript: { - title: 'Toggle subscript', - content: icons.subscript, - active: markActive(schema.marks.subscript), - run: toggleMark(schema.marks.subscript), - }, - superscript: { - title: 'Toggle superscript', - content: icons.superscript, - active: markActive(schema.marks.superscript), - run: toggleMark(schema.marks.superscript), - }, - small_caps: { - title: 'Toggle small caps', - content: icons.small_caps, - active: markActive(schema.marks.small_caps), - run: toggleMark(schema.marks.small_caps), + italic: { + active: markActive(schema.marks.italic), + content: icons.italic, + run: toggleMark(schema.marks.italic), + title: 'Toggle italic', }, // link: { // title: 'Add or remove link', @@ -82,35 +94,23 @@ export default { // // view.focus() // } // } - }, - blocks: { - h1: { - title: 'Change to heading level 1', - content: icons.heading, - active: blockActive(schema.nodes.heading, { level: 1 }), - enable: setBlockType(schema.nodes.heading, { level: 1 }), - run: (state, dispatch) => { - if (blockActive(schema.marks.heading)(state)) { - setBlockType(schema.marks.paragraph)(state, dispatch) - return true - } - - setBlockType(schema.nodes.heading, { level: 1 })(state, dispatch) - }, + small_caps: { + active: markActive(schema.marks.small_caps), + content: icons.small_caps, + run: toggleMark(schema.marks.small_caps), + title: 'Toggle small caps', }, - }, - history: { - undo: { - title: 'Undo last change', - content: icons.undo, - enable: undo, - run: undo, + subscript: { + active: markActive(schema.marks.subscript), + content: icons.subscript, + run: toggleMark(schema.marks.subscript), + title: 'Toggle subscript', }, - redo: { - title: 'Redo last undone change', - content: icons.redo, - enable: redo, - run: redo, + superscript: { + active: markActive(schema.marks.superscript), + content: icons.superscript, + run: toggleMark(schema.marks.superscript), + title: 'Toggle superscript', }, }, } diff --git a/packages/xpub-edit/src/components/abstract/config/nodes.js b/packages/xpub-edit/src/components/abstract/config/nodes.js index 1e7463337feb3d0d88bb06d1b61044f8fd12ba23..3d59ea01e69b1ac921df1958a6cf570a048618f3 100644 --- a/packages/xpub-edit/src/components/abstract/config/nodes.js +++ b/packages/xpub-edit/src/components/abstract/config/nodes.js @@ -14,8 +14,8 @@ const heading = { level: { default: 1 }, }, content: 'inline*', - group: 'block', defining: true, + group: 'block', parseDOM: [{ tag: 'h1', attrs: { level: 1 } }], toDOM: node => ['h' + node.attrs.level, 0], } @@ -26,7 +26,7 @@ const text = { export default { doc, - paragraph, heading, + paragraph, text, } diff --git a/packages/xpub-edit/src/components/abstract/config/schema.js b/packages/xpub-edit/src/components/abstract/config/schema.js index 5a0173ddd31dba187e4bbed9fd7114793555e504..2b1161ddfaf9f0cc7db40a23c525962908d2e30d 100644 --- a/packages/xpub-edit/src/components/abstract/config/schema.js +++ b/packages/xpub-edit/src/components/abstract/config/schema.js @@ -3,4 +3,4 @@ import { Schema } from 'prosemirror-model' import nodes from './nodes' import marks from './marks' -export default new Schema({ nodes, marks }) +export default new Schema({ marks, nodes }) diff --git a/packages/xpub-edit/src/components/note/NoteEditor.js b/packages/xpub-edit/src/components/note/NoteEditor.js index 8c31be95210579916a298f0e6d53741d74b559f8..9bddee2da20205222297e0ed1a616acc4aadfa9a 100644 --- a/packages/xpub-edit/src/components/note/NoteEditor.js +++ b/packages/xpub-edit/src/components/note/NoteEditor.js @@ -12,14 +12,14 @@ const NoteEditor = ({ onChange, }) => ( <HtmlEditor - options={options} className={className} - value={value} + onBlur={onBlur} + onChange={onChange} + options={options} placeholder={placeholder} placeholderClassName={placeholderClassName} title={title} - onBlur={onBlur} - onChange={onChange} + value={value} /> ) diff --git a/packages/xpub-edit/src/components/note/NoteViewer.js b/packages/xpub-edit/src/components/note/NoteViewer.js index e5adc8039bf2bba6746560e10aa91be708fae15a..c9b47a3c916b3bb16aa24226bb47e76183e5500d 100644 --- a/packages/xpub-edit/src/components/note/NoteViewer.js +++ b/packages/xpub-edit/src/components/note/NoteViewer.js @@ -3,7 +3,7 @@ import HtmlViewer from '../HtmlViewer' import * as options from './config' const NoteViewer = ({ className, value }) => ( - <HtmlViewer className={className} value={value} options={options} /> + <HtmlViewer className={className} options={options} value={value} /> ) export default NoteViewer diff --git a/packages/xpub-edit/src/components/note/config/icons.js b/packages/xpub-edit/src/components/note/config/icons.js index 54669c596d1a289b5ad6599ed83b66e8415a3c30..0e348d6ccf53d917241b7e2affe9223628984cb0 100644 --- a/packages/xpub-edit/src/components/note/config/icons.js +++ b/packages/xpub-edit/src/components/note/config/icons.js @@ -1,11 +1,12 @@ import React from 'react' export default { - italic: <i>Ital</i>, bold: <b>Bold</b>, - superscript: ( + italic: <i>Ital</i>, + link: <span>Link</span>, + small_caps: ( <span> - t<sup>x</sup> + T<span style={{ fontSize: '70%', fontVariant: 'small-caps' }}>T</span> </span> ), subscript: ( @@ -13,10 +14,9 @@ export default { t<sub>x</sub> </span> ), - small_caps: ( + superscript: ( <span> - T<span style={{ fontVariant: 'small-caps', fontSize: '70%' }}>T</span> + t<sup>x</sup> </span> ), - link: <span>Link</span>, } diff --git a/packages/xpub-edit/src/components/note/config/keys.js b/packages/xpub-edit/src/components/note/config/keys.js index 8919b93989a92e3bbe8c078cc890c8e941f08234..26b803102714ae65392cc6465cf64a0bc9ab91b0 100644 --- a/packages/xpub-edit/src/components/note/config/keys.js +++ b/packages/xpub-edit/src/components/note/config/keys.js @@ -12,16 +12,16 @@ import { import schema from './schema' const keys = { - 'Mod-z': undo, - 'Shift-Mod-z': redo, Backspace: undoInputRule, - 'Mod-y': redo, + 'Ctrl-Enter': exitCode, Escape: selectParentNode, 'Mod-b': toggleMark(schema.marks.bold), - 'Mod-i': toggleMark(schema.marks.italic), 'Mod-Enter': exitCode, + 'Mod-i': toggleMark(schema.marks.italic), + 'Mod-y': redo, + 'Mod-z': undo, 'Shift-Enter': exitCode, - 'Ctrl-Enter': exitCode, + 'Shift-Mod-z': redo, } Object.keys(baseKeymap).forEach(key => { diff --git a/packages/xpub-edit/src/components/note/config/marks.js b/packages/xpub-edit/src/components/note/config/marks.js index 823e598dee775d1255150ce02ce1b270efc0c5ab..5af69382a0b56ca4f464c016e275aeb8d5df4fc3 100644 --- a/packages/xpub-edit/src/components/note/config/marks.js +++ b/packages/xpub-edit/src/components/note/config/marks.js @@ -6,11 +6,11 @@ const link = { inclusive: false, parseDOM: [ { - tag: 'a[href]', getAttrs: dom => ({ href: dom.getAttribute('href'), title: dom.getAttribute('title'), }), + tag: 'a[href]', }, ], toDOM: node => ['a', node.attrs], @@ -25,12 +25,12 @@ const bold = { parseDOM: [ { tag: 'strong' }, { - tag: 'b', getAttrs: node => node.style.fontWeight !== 'normal' && null, + tag: 'b', }, { - style: 'font-weight', getAttrs: value => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null, + style: 'font-weight', }, ], toDOM: () => ['b'], @@ -52,10 +52,10 @@ const small_caps = { } export default { - link, - italic, bold, + italic, + link, + small_caps, subscript, superscript, - small_caps, } diff --git a/packages/xpub-edit/src/components/note/config/schema.js b/packages/xpub-edit/src/components/note/config/schema.js index 5a0173ddd31dba187e4bbed9fd7114793555e504..2b1161ddfaf9f0cc7db40a23c525962908d2e30d 100644 --- a/packages/xpub-edit/src/components/note/config/schema.js +++ b/packages/xpub-edit/src/components/note/config/schema.js @@ -3,4 +3,4 @@ import { Schema } from 'prosemirror-model' import nodes from './nodes' import marks from './marks' -export default new Schema({ nodes, marks }) +export default new Schema({ marks, nodes }) diff --git a/packages/xpub-edit/src/components/text/TextEditor.js b/packages/xpub-edit/src/components/text/TextEditor.js index 8e924c9f41f2c68b495ffee6460f708503c3abf6..ceff4e78f6d876e873f6d04b931be9b36a61b988 100644 --- a/packages/xpub-edit/src/components/text/TextEditor.js +++ b/packages/xpub-edit/src/components/text/TextEditor.js @@ -16,14 +16,14 @@ const TextEditor = ({ onChange, }) => ( <HtmlEditor - options={options} className={className} - value={value} + onBlur={onBlur} + onChange={onChange} + options={options} placeholder={placeholder} placeholderClassName={placeholderClassName} title={title} - onBlur={onBlur} - onChange={onChange} + value={value} /> ) diff --git a/packages/xpub-edit/src/components/text/TextViewer.js b/packages/xpub-edit/src/components/text/TextViewer.js index a839a047ea756effb0ee5ed0ae0c398e0b4ee257..5ec627f493dad5147ca10bee5f5547b72d0a56a9 100644 --- a/packages/xpub-edit/src/components/text/TextViewer.js +++ b/packages/xpub-edit/src/components/text/TextViewer.js @@ -4,7 +4,7 @@ import HtmlViewer from '../HtmlViewer' import * as options from './config' const TextViewer = ({ className, value }) => ( - <HtmlViewer className={className} value={value} options={options} /> + <HtmlViewer className={className} options={options} value={value} /> ) export default TextViewer diff --git a/packages/xpub-edit/src/components/text/config/schema.js b/packages/xpub-edit/src/components/text/config/schema.js index e5ee6b9635472f729a6ad8f117e82e3a3488fa99..3a13a3861363d3acf6ec620249b2869ddc179536 100644 --- a/packages/xpub-edit/src/components/text/config/schema.js +++ b/packages/xpub-edit/src/components/text/config/schema.js @@ -4,4 +4,4 @@ import nodes from './nodes' const marks = {} -export default new Schema({ nodes, marks }) +export default new Schema({ marks, nodes }) diff --git a/packages/xpub-edit/src/components/title/TitleEditor.js b/packages/xpub-edit/src/components/title/TitleEditor.js index 1edecf9a1072edb39ed539f38fba273e915001e7..fc10ccda8ee4e7d40102271e880ed47d23f1d1f7 100644 --- a/packages/xpub-edit/src/components/title/TitleEditor.js +++ b/packages/xpub-edit/src/components/title/TitleEditor.js @@ -12,14 +12,14 @@ const TitleEditor = ({ onChange, }) => ( <HtmlEditor - options={options} className={className} - value={value} + onBlur={onBlur} + onChange={onChange} + options={options} placeholder={placeholder} placeholderClassName={placeholderClassName} title={title} - onBlur={onBlur} - onChange={onChange} + value={value} /> ) diff --git a/packages/xpub-edit/src/components/title/TitleViewer.js b/packages/xpub-edit/src/components/title/TitleViewer.js index 475d8fb286c08d7ef867f2cee3b5e1b8bb5deeb2..d73bb2b7eb7c8bc80d1eb68c219f682c97e5e78d 100644 --- a/packages/xpub-edit/src/components/title/TitleViewer.js +++ b/packages/xpub-edit/src/components/title/TitleViewer.js @@ -3,7 +3,7 @@ import HtmlViewer from '../HtmlViewer' import * as options from './config' const TitleViewer = ({ className, value }) => ( - <HtmlViewer options={options} className={className} value={value} /> + <HtmlViewer className={className} options={options} value={value} /> ) export default TitleViewer diff --git a/packages/xpub-edit/src/components/title/config/icons.js b/packages/xpub-edit/src/components/title/config/icons.js index 8558c9c0a2509a1b4cf0c45b6f68bc5192315c2f..df1f1d484967ef41085365c69bf84a60212ab595 100644 --- a/packages/xpub-edit/src/components/title/config/icons.js +++ b/packages/xpub-edit/src/components/title/config/icons.js @@ -2,9 +2,9 @@ import React from 'react' export default { italic: <i>Ital</i>, - superscript: ( + small_caps: ( <span> - t<sup>x</sup> + T<span style={{ fontSize: '70%', fontVariant: 'small-caps' }}>T</span> </span> ), subscript: ( @@ -12,9 +12,9 @@ export default { t<sub>x</sub> </span> ), - small_caps: ( + superscript: ( <span> - T<span style={{ fontVariant: 'small-caps', fontSize: '70%' }}>T</span> + t<sup>x</sup> </span> ), } diff --git a/packages/xpub-edit/src/components/title/config/keys.js b/packages/xpub-edit/src/components/title/config/keys.js index c6b1becf103147b9fffecceda76b2ba0243a0548..620a35d9467759b588e1d0477c394644c787f9c2 100644 --- a/packages/xpub-edit/src/components/title/config/keys.js +++ b/packages/xpub-edit/src/components/title/config/keys.js @@ -6,11 +6,11 @@ import { baseKeymap, toggleMark, chainCommands } from 'prosemirror-commands' import schema from './schema' const keys = { - 'Mod-z': undo, - 'Shift-Mod-z': redo, Backspace: undoInputRule, - 'Mod-y': redo, 'Mod-i': toggleMark(schema.marks.italic), + 'Mod-y': redo, + 'Mod-z': undo, + 'Shift-Mod-z': redo, } Object.keys(baseKeymap).forEach(key => { diff --git a/packages/xpub-edit/src/components/title/config/marks.js b/packages/xpub-edit/src/components/title/config/marks.js index 148061a8942f6aed7185d7a564ab03bf0bdad286..4eec3d32c63246eb044ca7fd3196c57aab93f9d0 100644 --- a/packages/xpub-edit/src/components/title/config/marks.js +++ b/packages/xpub-edit/src/components/title/config/marks.js @@ -20,7 +20,7 @@ const small_caps = { export default { italic, + small_caps, subscript, superscript, - small_caps, } diff --git a/packages/xpub-edit/src/components/title/config/menu.js b/packages/xpub-edit/src/components/title/config/menu.js index 1983e79a765c6470ee652ad035552bd41c315c7e..4edbe4a7060669a806c0380dbfd7d6aba25ee984 100644 --- a/packages/xpub-edit/src/components/title/config/menu.js +++ b/packages/xpub-edit/src/components/title/config/menu.js @@ -14,28 +14,28 @@ const markActive = type => state => { export default { marks: { italic: { - title: 'Toggle italic', - content: icons.italic, active: markActive(schema.marks.italic), + content: icons.italic, run: toggleMark(schema.marks.italic), + title: 'Toggle italic', + }, + small_caps: { + active: markActive(schema.marks.small_caps), + content: icons.small_caps, + run: toggleMark(schema.marks.small_caps), + title: 'Toggle small caps', }, subscript: { - title: 'Toggle subscript', - content: icons.subscript, active: markActive(schema.marks.subscript), + content: icons.subscript, run: toggleMark(schema.marks.subscript), + title: 'Toggle subscript', }, superscript: { - title: 'Toggle superscript', - content: icons.superscript, active: markActive(schema.marks.superscript), + content: icons.superscript, run: toggleMark(schema.marks.superscript), - }, - small_caps: { - title: 'Toggle small caps', - content: icons.small_caps, - active: markActive(schema.marks.small_caps), - run: toggleMark(schema.marks.small_caps), + title: 'Toggle superscript', }, }, } diff --git a/packages/xpub-edit/src/components/title/config/schema.js b/packages/xpub-edit/src/components/title/config/schema.js index 5a0173ddd31dba187e4bbed9fd7114793555e504..2b1161ddfaf9f0cc7db40a23c525962908d2e30d 100644 --- a/packages/xpub-edit/src/components/title/config/schema.js +++ b/packages/xpub-edit/src/components/title/config/schema.js @@ -3,4 +3,4 @@ import { Schema } from 'prosemirror-model' import nodes from './nodes' import marks from './marks' -export default new Schema({ nodes, marks }) +export default new Schema({ marks, nodes }) diff --git a/packages/xpub-edit/src/decorations.js b/packages/xpub-edit/src/decorations.js index a88259e45f8a8ee949a1e4e3de245196760fb10d..221da8dfe744f83b51e10a309cc564ca56087d24 100644 --- a/packages/xpub-edit/src/decorations.js +++ b/packages/xpub-edit/src/decorations.js @@ -1,7 +1,7 @@ import { DecorationSet, Decoration } from 'prosemirror-view' export default ({ props, classes }) => state => { - const doc = state.doc + const { doc } = state const decorations = [] if ( diff --git a/packages/xpub-edit/styleguide.config.js b/packages/xpub-edit/styleguide.config.js index b4faf2a004f0882152f722c37566633a051fd2fd..b67773b617e1dd72514198951e0b24046d9c5cc8 100644 --- a/packages/xpub-edit/styleguide.config.js +++ b/packages/xpub-edit/styleguide.config.js @@ -1,22 +1,22 @@ module.exports = { - title: 'xpub-edit style guide', + context: { + faker: 'faker', + }, + serverPort: 6066, + skipComponentsWithoutExample: true, styleguideComponents: { StyleGuideRenderer: require.resolve( 'xpub-styleguide/src/components/StyleGuideRenderer', ), Wrapper: require.resolve('xpub-styleguide/src/components/Wrapper'), }, - serverPort: 6066, - skipComponentsWithoutExample: true, - context: { - faker: 'faker', - }, theme: { - fontFamily: { - base: '"Fira Sans", sans-serif', - }, color: { link: 'cornflowerblue', }, + fontFamily: { + base: '"Fira Sans", sans-serif', + }, }, + title: 'xpub-edit style guide', }