Skip to content
Snippets Groups Projects
Commit 47e6b159 authored by Alexandru Munteanu's avatar Alexandru Munteanu
Browse files

Add edit on list items

parent 0365fbfe
No related branches found
No related tags found
No related merge requests found
...@@ -4,7 +4,6 @@ import classnames from 'classnames' ...@@ -4,7 +4,6 @@ import classnames from 'classnames'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import { get } from 'lodash' import { get } from 'lodash'
import { reduxForm } from 'redux-form' import { reduxForm } from 'redux-form'
import { actions } from 'pubsweet-client'
import { required } from 'xpub-validators' import { required } from 'xpub-validators'
import { withRouter } from 'react-router-dom' import { withRouter } from 'react-router-dom'
import { selectCurrentUser } from 'xpub-selectors' import { selectCurrentUser } from 'xpub-selectors'
...@@ -125,6 +124,67 @@ const AuthorAdder = ({ authors, editMode, setEditMode, handleSubmit }) => ( ...@@ -125,6 +124,67 @@ const AuthorAdder = ({ authors, editMode, setEditMode, handleSubmit }) => (
</div> </div>
) )
const AuthorEdit = ({ setAuthorEdit, handleSubmit }) => (
<div className={classnames(classes['editor-body'])}>
<div className={classnames(classes.row)}>
<ValidatedTextField isRequired label="First name" name="edit.firstName" />
<ValidatedTextField label="Middle name" name="edit.middleName" />
<ValidatedTextField isRequired label="Last name" name="edit.lastName" />
</div>
<div className={classnames(classes.row)}>
<ValidatedTextField
isRequired
label="Email"
name="edit.email"
validators={[emailValidator]}
/>
<ValidatedTextField
isRequired
label="Affiliation"
name="edit.affiliation"
/>
<MenuItem label="Country" name="edit.country" options={countries} />
</div>
<div className={classnames(classes['form-buttons'])}>
<Button onClick={setAuthorEdit(-1)}>Cancel</Button>
<Button onClick={handleSubmit} primary>
Save
</Button>
</div>
</div>
)
const Editor = compose(
withRouter,
getContext({ version: PropTypes.object, project: PropTypes.object }),
connect(
(state, { match: { params: { version } } }) => ({
authors: getFragmentAuthors(state, version),
}),
{
setAuthors,
},
),
reduxForm({
form: 'edit',
onSubmit: (
values,
dispatch,
{ setAuthorEdit, setAuthors, project, version, authors, index, ...rest },
) => {
const newAuthors = [
...authors.slice(0, index),
values.edit,
...authors.slice(index + 1),
]
setAuthors(newAuthors, version.id)
setTimeout(setAuthorEdit(-1), 100)
},
}),
)(AuthorEdit)
const Adder = compose( const Adder = compose(
connect(state => ({ connect(state => ({
currentUser: selectCurrentUser(state), currentUser: selectCurrentUser(state),
...@@ -184,6 +244,7 @@ const Author = ({ ...@@ -184,6 +244,7 @@ const Author = ({
isCorresponding, isCorresponding,
setAsCorresponding, setAsCorresponding,
parseAuthorType, parseAuthorType,
...rest
}) => ( }) => (
<div <div
className={classnames({ className={classnames({
...@@ -229,6 +290,12 @@ const Author = ({ ...@@ -229,6 +290,12 @@ const Author = ({
<Icon>mail</Icon> <Icon>mail</Icon>
</div> </div>
)} )}
<div
className={classnames(classes.corresponding)}
onClick={rest.setAuthorEdit(rest.index)}
>
<Icon>edit-2</Icon>
</div>
</div> </div>
</div> </div>
) )
...@@ -257,6 +324,7 @@ const Authors = ({ ...@@ -257,6 +324,7 @@ const Authors = ({
<SortableList <SortableList
dragHandle={DragHandle} dragHandle={DragHandle}
dropItem={dropItem} dropItem={dropItem}
editItem={Editor}
items={authors} items={authors}
listItem={Author} listItem={Author}
moveItem={moveAuthor} moveItem={moveAuthor}
...@@ -276,7 +344,6 @@ export default compose( ...@@ -276,7 +344,6 @@ export default compose(
addAuthor, addAuthor,
setAuthors, setAuthors,
moveAuthors, moveAuthors,
updateFragment: actions.updateFragment,
}, },
), ),
lifecycle({ lifecycle({
...@@ -286,18 +353,17 @@ export default compose( ...@@ -286,18 +353,17 @@ export default compose(
}, },
}), }),
withState('editMode', 'setEditMode', false), withState('editMode', 'setEditMode', false),
withState('editedAuthor', 'setEditedAuthor', -1),
withHandlers({ withHandlers({
setAuthorEdit: ({ setEditedAuthor }) => editedAuthor => e => {
e && e.preventDefault && e.preventDefault()
setEditedAuthor(prev => editedAuthor)
},
setEditMode: ({ setEditMode }) => mode => e => { setEditMode: ({ setEditMode }) => mode => e => {
e && e.preventDefault() e && e.preventDefault()
setEditMode(v => mode) setEditMode(v => mode)
}, },
dropItem: ({ dropItem: ({ authors, project, version, setAuthors }) => () => {
updateFragment,
authors,
project,
version,
setAuthors,
}) => () => {
setAuthors(authors, version.id) setAuthors(authors, version.id)
}, },
countryParser: () => countryCode => countryParser: () => countryCode =>
...@@ -312,7 +378,6 @@ export default compose( ...@@ -312,7 +378,6 @@ export default compose(
moveAuthors, moveAuthors,
project, project,
version, version,
updateFragment,
match: { params }, match: { params },
}) => (dragIndex, hoverIndex) => { }) => (dragIndex, hoverIndex) => {
const newAuthors = SortableList.moveItem(authors, dragIndex, hoverIndex) const newAuthors = SortableList.moveItem(authors, dragIndex, hoverIndex)
...@@ -320,7 +385,6 @@ export default compose( ...@@ -320,7 +385,6 @@ export default compose(
}, },
removeAuthor: ({ removeAuthor: ({
authors, authors,
updateFragment,
project, project,
version, version,
setAuthors, setAuthors,
...@@ -330,7 +394,6 @@ export default compose( ...@@ -330,7 +394,6 @@ export default compose(
}, },
setAsCorresponding: ({ setAsCorresponding: ({
authors, authors,
updateFragment,
setAuthors, setAuthors,
version, version,
project, project,
......
...@@ -48,6 +48,18 @@ ...@@ -48,6 +48,18 @@
} }
} }
.editor-body {
border: 1px solid #444;
margin: 10px 0;
padding: 10px;
.form-buttons {
display: flex;
justify-content: space-around;
margin: 15px 0 0 0;
}
}
.adder { .adder {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
......
...@@ -47,9 +47,13 @@ const Item = ({ ...@@ -47,9 +47,13 @@ const Item = ({
connectDropTarget, connectDropTarget,
listItem, listItem,
dragHandle, dragHandle,
isEditing,
...rest ...rest
}) => }) => {
dragHandle if (isEditing) {
return <div style={{ flex: 1 }}>{React.createElement(listItem, rest)}</div>
}
return dragHandle
? connectDragPreview( ? connectDragPreview(
connectDropTarget( connectDropTarget(
<div style={{ flex: 1 }}> <div style={{ flex: 1 }}>
...@@ -69,6 +73,7 @@ const Item = ({ ...@@ -69,6 +73,7 @@ const Item = ({
<div style={{ flex: 1 }}>{React.createElement(listItem, rest)}</div>, <div style={{ flex: 1 }}>{React.createElement(listItem, rest)}</div>,
), ),
) )
}
const DecoratedItem = compose( const DecoratedItem = compose(
DropTarget('item', itemTarget, (connect, monitor) => ({ DropTarget('item', itemTarget, (connect, monitor) => ({
...@@ -82,19 +87,39 @@ const DecoratedItem = compose( ...@@ -82,19 +87,39 @@ const DecoratedItem = compose(
})), })),
)(Item) )(Item)
const SortableList = ({ items, moveItem, listItem, dragHandle, ...rest }) => ( const SortableList = ({
items,
moveItem,
listItem,
dragHandle,
editItem,
...rest
}) => (
<div> <div>
{items.map((item, i) => ( {items.map(
<DecoratedItem (item, i) =>
dragHandle={dragHandle} i === rest.editedAuthor ? (
index={i} React.createElement(editItem, {
key={item.name || Math.random()} key: item.name || Math.random(),
listItem={listItem} initialValues: {
moveItem={moveItem} edit: item,
{...item} },
{...rest} index: i,
/> ...rest,
))} })
) : (
<DecoratedItem
dragHandle={dragHandle}
index={i}
isEditing={rest.editedAuthor !== -1}
key={item.name || Math.random()}
listItem={listItem}
moveItem={moveItem}
{...item}
{...rest}
/>
),
)}
</div> </div>
) )
......
...@@ -14,8 +14,8 @@ const _setAuthors = (authors, fragmentId) => ({ ...@@ -14,8 +14,8 @@ const _setAuthors = (authors, fragmentId) => ({
// actions // actions
export const setAuthors = (authors, fragmentId) => dispatch => { export const setAuthors = (authors, fragmentId) => dispatch => {
dispatch(_setAuthors(authors, fragmentId))
dispatch(change('wizard', 'authors', authors)) dispatch(change('wizard', 'authors', authors))
dispatch(_setAuthors(authors, fragmentId))
} }
export const moveAuthors = (authors, fragmentId) => dispatch => { export const moveAuthors = (authors, fragmentId) => dispatch => {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment