diff --git a/packages/component-faraday-ui/src/modals/FormModal.js b/packages/component-faraday-ui/src/modals/FormModal.js index c8d4ac798720641bdb4a4bff1c528aba143714ac..a9b280c64e42eaf7049db6b12a48aa2f6a8516bb 100644 --- a/packages/component-faraday-ui/src/modals/FormModal.js +++ b/packages/component-faraday-ui/src/modals/FormModal.js @@ -1,18 +1,11 @@ import React, { Fragment } from 'react' import { get } from 'lodash' +import { Formik } from 'formik' import styled from 'styled-components' import { th } from '@pubsweet/ui-toolkit' import { required } from 'xpub-validators' +import { H2, Button, TextField, ValidatedFieldFormik } from '@pubsweet/ui' import { compose, setDisplayName, withHandlers, withProps } from 'recompose' -import { - H2, - Menu, - Button, - Spinner, - Checkbox, - TextField, - ValidatedField, -} from '@pubsweet/ui' import { Row, Text, @@ -23,166 +16,173 @@ import { ItemOverrideAlert, } from 'pubsweet-component-faraday-ui' -import { Formik } from 'formik' +import ValidatedMenuField from './ValidatedMenuField' -const AddUserForm = ({ roles, countries, titles }) => ( - <Fragment> - <Row alignItems="baseline" mb={1} mt={1}> - <Item mr={1} vertical> - <Label required>Email</Label> - <ValidatedField - component={TextField} - name="email" - validate={[required]} - /> - </Item> - <ItemOverrideAlert ml={1} vertical> - <Label required>Role</Label> - <ValidatedField - component={input => ( - <Menu options={roles} {...input} placeholder="Please select" /> - )} - name="role" - validate={[required]} - /> - </ItemOverrideAlert> - </Row> +// #region Unused stuff - <Row mb={2}> - <Item mr={1} vertical> - <Label>First Name</Label> - <ValidatedField component={TextField} name="firstName" /> - </Item> - <Item ml={1} vertical> - <Label>Last Name</Label> - <ValidatedField component={TextField} name="lastName" /> - </Item> - </Row> +// const AddUserForm = ({ roles, countries, titles }) => ( +// <Fragment> +// <Row alignItems="baseline" mb={1} mt={1}> +// <Item mr={1} vertical> +// <Label required>Email</Label> +// <ValidatedField +// component={TextField} +// name="email" +// validate={[required]} +// /> +// </Item> +// <ItemOverrideAlert ml={1} vertical> +// <Label required>Role</Label> +// <ValidatedField +// component={input => ( +// <Menu options={roles} {...input} placeholder="Please select" /> +// )} +// name="role" +// validate={[required]} +// /> +// </ItemOverrideAlert> +// </Row> - <RowOverrideAlert alignItems="center" mb={2}> - <ItemOverrideAlert mr={1} vertical> - <Label>Title</Label> - <ValidatedField - component={input => ( - <Menu options={titles} {...input} placeholder="Please select" /> - )} - name="title" - /> - </ItemOverrideAlert> - <ItemOverrideAlert ml={1} vertical> - <Label>Country</Label> - <ValidatedField - component={input => ( - <Menu options={countries} {...input} placeholder="Please select" /> - )} - name="country" - /> - </ItemOverrideAlert> - </RowOverrideAlert> +// <Row mb={2}> +// <Item mr={1} vertical> +// <Label>First Name</Label> +// <ValidatedField component={TextField} name="firstName" /> +// </Item> +// <Item ml={1} vertical> +// <Label>Last Name</Label> +// <ValidatedField component={TextField} name="lastName" /> +// </Item> +// </Row> - <Row mb={3}> - <Item vertical> - <Label>Affiliation</Label> - <ValidatedField component={TextField} name="affiliation" /> - </Item> - </Row> - </Fragment> -) +// <RowOverrideAlert alignItems="center" mb={2}> +// <ItemOverrideAlert mr={1} vertical> +// <Label>Title</Label> +// <ValidatedField +// component={input => ( +// <Menu options={titles} {...input} placeholder="Please select" /> +// )} +// name="title" +// /> +// </ItemOverrideAlert> +// <ItemOverrideAlert ml={1} vertical> +// <Label>Country</Label> +// <ValidatedField +// component={input => ( +// <Menu options={countries} {...input} placeholder="Please select" /> +// )} +// name="country" +// /> +// </ItemOverrideAlert> +// </RowOverrideAlert> -const EditForm = ({ titles, countries }) => ( - <Fragment> - <Row alignItems="center" mb={2} mt={1}> - <Item mr={1} vertical> - <Label>First Name</Label> - <ValidatedField component={TextField} name="firstName" /> - </Item> - <Item ml={1} vertical> - <Label>Last Name</Label> - <ValidatedField component={TextField} name="lastName" /> - </Item> - </Row> +// <Row mb={3}> +// <Item vertical> +// <Label>Affiliation</Label> +// <ValidatedField component={TextField} name="affiliation" /> +// </Item> +// </Row> +// </Fragment> +// ) - <RowOverrideAlert alignItems="center" mb={2}> - <ItemOverrideAlert mr={1} vertical> - <Label>Title</Label> - <ValidatedField - component={input => ( - <Menu options={titles} {...input} placeholder="Please select" /> - )} - name="title" - /> - </ItemOverrideAlert> - <ItemOverrideAlert ml={1} vertical> - <Label>Country</Label> - <ValidatedField - component={input => ( - <Menu options={countries} {...input} placeholder="Please select" /> - )} - name="country" - /> - </ItemOverrideAlert> - </RowOverrideAlert> +// const EditForm = ({ titles, countries }) => ( +// <Fragment> +// <Row alignItems="center" mb={2} mt={1}> +// <Item mr={1} vertical> +// <Label>First Name</Label> +// <ValidatedField component={TextField} name="firstName" /> +// </Item> +// <Item ml={1} vertical> +// <Label>Last Name</Label> +// <ValidatedField component={TextField} name="lastName" /> +// </Item> +// </Row> - <Row mb={2}> - <Item vertical> - <Label>Affiliation</Label> - <ValidatedField component={TextField} name="affiliation" /> - </Item> - </Row> - <Row> - <Item> - <Label>Roles</Label> - </Item> - </Row> - <RowOverrideAlert mb={3} mt={1}> - <Item> - <ValidatedField - component={({ value, onChange }) => ( - <Checkbox - checked={value} - label="Editor in Chief" - onChange={onChange} - value={value} - /> - )} - name="editorInChief" - /> - </Item> - <Item> - <ValidatedField - component={({ value, onChange }) => ( - <Checkbox - checked={value} - label="Admin" - onChange={onChange} - value={value} - /> - )} - name="admin" - /> - </Item> - <Item> - <ValidatedField - component={({ value, onChange }) => ( - <Checkbox - checked={value} - label="Handling Editor" - onChange={onChange} - value={value} - /> - )} - name="handlingEditor" - /> - </Item> - </RowOverrideAlert> - </Fragment> -) +// <RowOverrideAlert alignItems="center" mb={2}> +// <ItemOverrideAlert mr={1} vertical> +// <Label>Title</Label> +// <ValidatedField +// component={input => ( +// <Menu options={titles} {...input} placeholder="Please select" /> +// )} +// name="title" +// /> +// </ItemOverrideAlert> +// <ItemOverrideAlert ml={1} vertical> +// <Label>Country</Label> +// <ValidatedField +// component={input => ( +// <Menu options={countries} {...input} placeholder="Please select" /> +// )} +// name="country" +// /> +// </ItemOverrideAlert> +// </RowOverrideAlert> -const FormikForm = () => ( - <Formik onSubmit={(...props) => console.log(props)}> - {ceva => console.log(ceva) || <span onClick={ceva.handleSubmit}>gg</span>} - </Formik> -) +// <Row mb={2}> +// <Item vertical> +// <Label>Affiliation</Label> +// <ValidatedField component={TextField} name="affiliation" /> +// </Item> +// </Row> +// <Row> +// <Item> +// <Label>Roles</Label> +// </Item> +// </Row> +// <RowOverrideAlert mb={3} mt={1}> +// <Item> +// <ValidatedField +// component={({ value, onChange }) => ( +// <Checkbox +// checked={value} +// label="Editor in Chief" +// onChange={onChange} +// value={value} +// /> +// )} +// name="editorInChief" +// /> +// </Item> +// <Item> +// <ValidatedField +// component={({ value, onChange }) => ( +// <Checkbox +// checked={value} +// label="Admin" +// onChange={onChange} +// value={value} +// /> +// )} +// name="admin" +// /> +// </Item> +// <Item> +// <ValidatedField +// component={({ value, onChange }) => ( +// <Checkbox +// checked={value} +// label="Handling Editor" +// onChange={onChange} +// value={value} +// /> +// )} +// name="handlingEditor" +// /> +// </Item> +// </RowOverrideAlert> +// </Fragment> +// ) + +// #endregion + +const parseUser = ({ email, role, ...rest }) => ({ + email, + username: email, + admin: role === 'admin', + editorInChief: role === 'editorInChief', + handlingEditor: role === 'handlingEditor', + ...rest, +}) const FormModal = ({ edit, @@ -199,30 +199,78 @@ const FormModal = ({ handleSubmit, confirmText = 'OK', cancelText = 'Cancel', + // + addUser, }) => ( <Root> <IconButton icon="x" onClick={onClose} right={5} secondary top={5} /> <H2>{title}</H2> + <Formik + onSubmit={values => { + addUser({ variables: { user: parseUser(values) } }) + }} + > + {ceva => ( + <Fragment> + <Row alignItems="baseline" mb={1} mt={1}> + <Item mr={1} vertical> + <Label required>Email</Label> + <ValidatedFieldFormik + component={TextField} + name="email" + validate={[required]} + /> + </Item> + <ItemOverrideAlert ml={1} vertical> + <Label required>Role</Label> + <ValidatedMenuField name="role" options={roles} /> + </ItemOverrideAlert> + </Row> + + <Row mb={2}> + <Item mr={1} vertical> + <Label>First Name</Label> + <ValidatedFieldFormik component={TextField} name="firstName" /> + </Item> + <Item ml={1} vertical> + <Label>Last Name</Label> + <ValidatedFieldFormik component={TextField} name="lastName" /> + </Item> + </Row> + + <RowOverrideAlert alignItems="center" mb={2}> + <ItemOverrideAlert mr={1} vertical> + <Label>Title</Label> + <ValidatedMenuField name="title" options={titles} /> + </ItemOverrideAlert> + <ItemOverrideAlert ml={1} vertical> + <Label>Country</Label> + <ValidatedMenuField name="country" options={countries} /> + </ItemOverrideAlert> + </RowOverrideAlert> - <FormikForm /> + <Row mb={3}> + <Item vertical> + <Label>Affiliation</Label> + <ValidatedFieldFormik component={TextField} name="affiliation" /> + </Item> + </Row> + + <Row> + <Button onClick={onClose}>Cancel</Button> + <Button onClick={ceva.handleSubmit} primary> + Save user + </Button> + </Row> + </Fragment> + )} + </Formik> {modalError && ( <Row mb={1}> <Text error>{modalError}</Text> </Row> )} - <Row> - {isFetching ? ( - <Spinner size={3} /> - ) : ( - <Fragment> - <Button onClick={onClose}>{cancelText}</Button> - <Button onClick={handleSubmit} primary> - {confirmText} - </Button> - </Fragment> - )} - </Row> </Root> ) diff --git a/packages/component-faraday-ui/src/modals/MyMenu.js b/packages/component-faraday-ui/src/modals/MyMenu.js new file mode 100644 index 0000000000000000000000000000000000000000..9fe37eb41ed0d80cc4c053850f8eecc5560a74cd --- /dev/null +++ b/packages/component-faraday-ui/src/modals/MyMenu.js @@ -0,0 +1,26 @@ +import React, { Fragment } from 'react' +import { compose, withStateHandlers } from 'recompose' + +const MyMenu = ({ open, toggleMenu, field, form }) => ( + <div onClick={toggleMenu}> + Click to open + {open && ( + <Fragment> + <span onClick={() => form.setFieldValue(field.name, 1)}>Option 1</span> + <span onClick={() => form.setFieldValue(field.name, 2)}>Option 2</span> + <span onClick={() => form.setFieldValue(field.name, 3)}>Option 3</span> + </Fragment> + )} + </div> +) + +export default compose( + withStateHandlers( + { open: false }, + { + toggleMenu: ({ open }) => () => ({ + open: !open, + }), + }, + ), +)(MyMenu) diff --git a/packages/component-faraday-ui/src/modals/ValidatedMenuField.js b/packages/component-faraday-ui/src/modals/ValidatedMenuField.js new file mode 100644 index 0000000000000000000000000000000000000000..b8b4c1efb0d05d1d3708ba8c0f3ca036adabf83a --- /dev/null +++ b/packages/component-faraday-ui/src/modals/ValidatedMenuField.js @@ -0,0 +1,19 @@ +import React from 'react' +import { Field } from 'formik' +import { Menu } from '@pubsweet/ui' + +const ValidatedMenuField = ({ options, name }) => ( + <Field name={name}> + {({ field, form }) => ( + <Menu + onChange={v => { + field.onChange(v) + form.setFieldValue(name, v) + }} + options={options} + /> + )} + </Field> +) + +export default ValidatedMenuField diff --git a/packages/components-faraday/src/components/Admin/AddUser.js b/packages/components-faraday/src/components/Admin/AddUser.js index 572e42f0755c5f0ae873b190c0d6864b1889139e..1a90ce17c2f887151261d1acd252ec8a141b8cb2 100644 --- a/packages/components-faraday/src/components/Admin/AddUser.js +++ b/packages/components-faraday/src/components/Admin/AddUser.js @@ -12,8 +12,9 @@ import { withCountries, } from 'pubsweet-component-faraday-ui' -const AddUser = ({ edit, journal, handleSubmit, ...rest }) => ( +const AddUser = ({ edit, journal, addUser, ...rest }) => ( <OpenModal + addUser={addUser} edit={edit} formModal title={edit ? 'Edit User' : 'Add User'} diff --git a/packages/components-faraday/src/components/Admin/AdminUsers.js b/packages/components-faraday/src/components/Admin/AdminUsers.js index 9c06664a67d14b3ed6f12138f02011061a540fe4..76664a223eee29a17cfe0645fd4b1a29ec8430d0 100644 --- a/packages/components-faraday/src/components/Admin/AdminUsers.js +++ b/packages/components-faraday/src/components/Admin/AdminUsers.js @@ -29,11 +29,13 @@ const GET_USERS = gql` users { id admin + email country username lastName isActive firstName + affiliation isConfirmed editorInChief handlingEditor @@ -41,6 +43,15 @@ const GET_USERS = gql` } ` +const ADD_USER = gql` + mutation addUser($user: UserInput) { + createUser(input: $user) { + id + email + } + } +` + const Users = ({ page, users, @@ -56,6 +67,8 @@ const Users = ({ getStatusLabel, paginatedItems, toggleUserStatus, + // + addUser, ...rest }) => ( <Fragment> @@ -70,10 +83,10 @@ const Users = ({ Admin Dashboard </ActionLink> <AddUser + addUser={addUser} form="add-user" getUsers={getUsers} modalKey="addUser" - onSubmit={onSubmit} /> </Item> @@ -162,6 +175,7 @@ export default compose( withJournal, withFetching, graphql(GET_USERS), + graphql(ADD_USER, { name: 'addUser' }), withProps(({ journal: { roles = {} }, data: { users } }) => ({ roles: Object.keys(roles), items: users, diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js index 6d1ac18d402b9baa6333ed22f7cfbe5d2f566cdf..8afc3c8a092b585a8e5499802e9b33fc993d550e 100644 --- a/packages/xpub-faraday/config/validations.js +++ b/packages/xpub-faraday/config/validations.js @@ -156,6 +156,7 @@ module.exports = { handlingEditor: Joi.boolean(), agreeTC: Joi.boolean(), isActive: Joi.boolean(), + passwordHash: Joi.string(), notifications: Joi.object({ email: Joi.object({ system: Joi.boolean().default(true),