Skip to content
Snippets Groups Projects
Commit d8c47737 authored by Bogdan Cochior's avatar Bogdan Cochior
Browse files

Merge branch 'admin-formik' into 'develop'

Admin formik

See merge request !223
parents 07f92e45 80f35e31
No related branches found
No related tags found
3 merge requests!233S26 updates,!230S26 Updates,!223Admin formik
import React, { Fragment } from 'react'
import { get } from 'lodash'
import { Field } from 'formik'
import PropTypes from 'prop-types'
import styled from 'styled-components'
import { th } from '@pubsweet/ui-toolkit'
import {
compose,
withProps,
withHandlers,
shouldUpdate,
setDisplayName,
} from 'recompose'
const WrappedComponent = compose(
withHandlers({
onChange: ({ field: { onChange, name }, form: { setFieldValue } }) => v => {
if (typeof v === 'object') {
onChange(v)
} else {
setFieldValue(name, v)
}
},
}),
withProps(({ form: { errors, touched, submitCount }, name }) => ({
hasError: (get(touched, name) || submitCount > 0) && get(errors, name),
})),
withProps(({ name, hasError, form: { errors } }) => ({
error: hasError && get(errors, name),
validationStatus: hasError ? 'error' : 'default',
})),
shouldUpdate(
(prev, next) =>
get(prev, 'field.value') !== get(next, 'field.value') ||
get(prev, 'error') !== get(next, 'error'),
),
)(
({
error,
onChange,
validationStatus,
component: Component,
field: { name, value, onBlur },
form: { errors, setFieldValue, touched, values, submitCount },
...props
}) => (
<Fragment>
<Component
name={name}
onBlur={onBlur}
onChange={onChange}
value={value}
{...props}
validationStatus={validationStatus}
/>
<MessageWrapper role="alert">
{error && <ErrorMessage>{error}</ErrorMessage>}
</MessageWrapper>
</Fragment>
),
)
const ValidatedFormField = ({ name, component, validateFn, ...props }) => (
<Field name={name} validate={validateFn}>
{fieldProps => (
<WrappedComponent
component={component}
name={name}
{...props}
{...fieldProps}
/>
)}
</Field>
)
ValidatedFormField.propTypes = {
component: PropTypes.oneOfType([
PropTypes.node,
PropTypes.func,
PropTypes.string,
]).isRequired,
}
export default compose(
setDisplayName('ValidatedFormikField'),
withProps(({ validate = [] }) => ({
validateFn: (value = '') =>
validate.reduce((acc, fn) => acc || fn(value), ''),
})),
shouldUpdate(() => false),
)(ValidatedFormField)
// #region styles
const MessageWrapper = styled.div`
font-family: ${th('fontInterface')};
display: flex;
`
const Message = styled.div`
&:not(:last-child) {
margin-bottom: ${th('gridUnit')};
}
font-size: ${th('fontSizeBaseSmall')};
line-height: ${th('lineHeightBaseSmall')};
`
const ErrorMessage = styled(Message)`
color: ${th('colorError')};
`
// #endregion
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(field.name, v)
}}
options={options}
value={field.value}
/>
)}
</Field>
)
export default ValidatedMenuField
...@@ -51,7 +51,7 @@ export { default as EditorialReportCard } from './EditorialReportCard' ...@@ -51,7 +51,7 @@ export { default as EditorialReportCard } from './EditorialReportCard'
export { default as ReviewerReportAuthor } from './ReviewerReportAuthor' export { default as ReviewerReportAuthor } from './ReviewerReportAuthor'
export { default as PasswordValidation } from './PasswordValidation' export { default as PasswordValidation } from './PasswordValidation'
export { default as MenuCountry } from './MenuCountry' export { default as MenuCountry } from './MenuCountry'
export { default as ValidatedMenuField } from './ValidatedMenuField' export { default as ValidatedFormField } from './ValidatedFormField'
export { SubmitRevision } from './submissionRevision' export { SubmitRevision } from './submissionRevision'
......
...@@ -3,27 +3,22 @@ import { get } from 'lodash' ...@@ -3,27 +3,22 @@ import { get } from 'lodash'
import { Formik } from 'formik' import { Formik } from 'formik'
import styled from 'styled-components' import styled from 'styled-components'
import { th } from '@pubsweet/ui-toolkit' import { th } from '@pubsweet/ui-toolkit'
import { required } from 'xpub-validators' import { H2, Menu, Button, Spinner, TextField } from '@pubsweet/ui'
import { compose, setDisplayName, withHandlers, withProps } from 'recompose' import { compose, setDisplayName, withHandlers, withProps } from 'recompose'
import {
H2,
Button,
Spinner,
TextField,
ValidatedFieldFormik,
} from '@pubsweet/ui'
import { import {
Row, Row,
Item, Item,
Text, Text,
Label, Label,
IconButton, IconButton,
MenuCountry,
RowOverrideAlert, RowOverrideAlert,
ItemOverrideAlert, ItemOverrideAlert,
ValidatedMenuField, ValidatedFormField,
withRoles, withRoles,
withFetching, withFetching,
withCountries, withCountries,
validators,
} from 'pubsweet-component-faraday-ui' } from 'pubsweet-component-faraday-ui'
// #region helpers // #region helpers
...@@ -86,16 +81,21 @@ const FormModal = ({ ...@@ -86,16 +81,21 @@ const FormModal = ({
<Row alignItems="baseline" mb={1} mt={1}> <Row alignItems="baseline" mb={1} mt={1}>
<ItemOverrideAlert mr={1} vertical> <ItemOverrideAlert mr={1} vertical>
<Label required>Email</Label> <Label required>Email</Label>
<ValidatedFieldFormik <ValidatedFormField
component={TextField} component={TextField}
inline inline
name="email" name="email"
validate={[required]} validate={[validators.emailValidator]}
/> />
</ItemOverrideAlert> </ItemOverrideAlert>
<ItemOverrideAlert ml={1} vertical> <ItemOverrideAlert ml={1} vertical>
<Label required>Role</Label> <Label required>Role</Label>
<ValidatedMenuField name="role" options={roles} /> <ValidatedFormField
component={Menu}
name="role"
options={roles}
/>
</ItemOverrideAlert> </ItemOverrideAlert>
</Row> </Row>
)} )}
...@@ -103,15 +103,16 @@ const FormModal = ({ ...@@ -103,15 +103,16 @@ const FormModal = ({
<Row mb={2}> <Row mb={2}>
<Item mr={1} vertical> <Item mr={1} vertical>
<Label>First Name</Label> <Label>First Name</Label>
<ValidatedFieldFormik <ValidatedFormField
component={TextField} component={TextField}
inline inline
name="firstName" name="firstName"
/> />
</Item> </Item>
<Item ml={1} vertical> <Item ml={1} vertical>
<Label>Last Name</Label> <Label>Last Name</Label>
<ValidatedFieldFormik <ValidatedFormField
component={TextField} component={TextField}
inline inline
name="lastName" name="lastName"
...@@ -122,11 +123,16 @@ const FormModal = ({ ...@@ -122,11 +123,16 @@ const FormModal = ({
<RowOverrideAlert alignItems="center" mb={2}> <RowOverrideAlert alignItems="center" mb={2}>
<ItemOverrideAlert mr={1} vertical> <ItemOverrideAlert mr={1} vertical>
<Label>Title</Label> <Label>Title</Label>
<ValidatedMenuField name="title" options={titles} /> <ValidatedFormField
component={Menu}
name="title"
options={titles}
/>
</ItemOverrideAlert> </ItemOverrideAlert>
<ItemOverrideAlert ml={1} vertical> <ItemOverrideAlert ml={1} vertical>
<Label>Country</Label> <Label>Country</Label>
<ValidatedMenuField name="country" options={countries} /> <ValidatedFormField component={MenuCountry} name="country" />
</ItemOverrideAlert> </ItemOverrideAlert>
</RowOverrideAlert> </RowOverrideAlert>
...@@ -134,12 +140,16 @@ const FormModal = ({ ...@@ -134,12 +140,16 @@ const FormModal = ({
{edit && ( {edit && (
<ItemOverrideAlert mr={1} vertical> <ItemOverrideAlert mr={1} vertical>
<Label required>Role</Label> <Label required>Role</Label>
<ValidatedMenuField name="role" options={roles} /> <ValidatedFormField
component={Menu}
name="role"
options={roles}
/>
</ItemOverrideAlert> </ItemOverrideAlert>
)} )}
<Item ml={edit && 1} vertical> <Item ml={edit && 1} vertical>
<Label>Affiliation</Label> <Label>Affiliation</Label>
<ValidatedFieldFormik <ValidatedFormField
component={TextField} component={TextField}
inline inline
name="affiliation" name="affiliation"
......
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