diff --git a/src/components/Form/Fields.tsx b/src/components/Form/Fields.tsx index dab1ddd451..3eb5b9d888 100644 --- a/src/components/Form/Fields.tsx +++ b/src/components/Form/Fields.tsx @@ -1,5 +1,10 @@ import * as React from 'react' -import { TextAreaStyled, Input, TextAreaDisabled } from './elements' +import { + TextAreaStyled, + Input, + TextAreaDisabled, + ErrorMessage, +} from './elements' import { FieldRenderProps } from 'react-final-form' import Calendar, { CalendarProps } from 'react-calendar' @@ -17,9 +22,10 @@ type YearPickerProps = IFieldProps & CalendarProps export const InputField = ({ input, meta, ...rest }: IFieldProps) => ( <> - - {/* CC - removed clunky error reporting until better solution implemented */} - {/* {meta.error && meta.touched && {meta.error}} */} + + {meta.error && meta.touched ? ( + {meta.error} + ) : null} ) @@ -28,18 +34,20 @@ export const TextAreaField = ({ meta, disabled, ...rest -}: IFieldProps) => ( - <> - {disabled ? ( - // want disabled textarea to just render as styled div to remove scrollbars - {input.value} - ) : ( - - )} - - {/* {meta.error && meta.touched && {meta.error}} */} - -) +}: IFieldProps) => + disabled ? ( + // want disabled textarea to just render as styled div to remove scrollbars + {input.value} + ) : ( + <> + + {meta.error && meta.touched && {meta.error}} + + ) export const YearPicker = ({ input, meta, ...rest }: YearPickerProps) => ( <> @@ -53,7 +61,6 @@ export const YearPicker = ({ input, meta, ...rest }: YearPickerProps) => ( input.onChange(v) }} /> - - {/* {meta.error && meta.touched && {meta.error}} */} + {/* meta.error && meta.touched && {meta.error} */} ) diff --git a/src/components/Form/ImageInput.field.tsx b/src/components/Form/ImageInput.field.tsx index 8ed9a7e1cc..74a63291e1 100644 --- a/src/components/Form/ImageInput.field.tsx +++ b/src/components/Form/ImageInput.field.tsx @@ -1,18 +1,21 @@ import React from 'react' import { ImageInput } from '../ImageInput/ImageInput' import { IFieldProps } from './Fields' -import { FieldContainer } from './elements' +import { FieldContainer, ErrorMessage } from './elements' export const ImageInputField = ({ input, meta, ...rest }: IFieldProps) => ( - - { - input.onChange(files) - input.onBlur() - }} - /> - + <> + + { + input.onChange(files) + input.onBlur() + }} + /> + + {meta.error && meta.touched && {meta.error}} + ) diff --git a/src/components/Form/LocationSearch.field.tsx b/src/components/Form/LocationSearch.field.tsx index 99dc3ded9a..8abf2088ba 100644 --- a/src/components/Form/LocationSearch.field.tsx +++ b/src/components/Form/LocationSearch.field.tsx @@ -25,5 +25,6 @@ export const LocationSearchField = ({ } input.onBlur() }} + placeholder="Search for a location *" /> ) diff --git a/src/components/Form/Select.field.tsx b/src/components/Form/Select.field.tsx index 9dd1cf493d..5e5f2ae478 100644 --- a/src/components/Form/Select.field.tsx +++ b/src/components/Form/Select.field.tsx @@ -1,12 +1,13 @@ import * as React from 'react' +import ReactFlagsSelect from 'react-flags-select' import Select from 'react-select' -import { IFieldProps } from './Fields' -import { Styles } from 'react-select/lib/styles' import { Props as SelectProps } from 'react-select/lib/Select' -import { FieldContainer } from './elements' +import { Styles } from 'react-select/lib/styles' import theme from 'src/themes/styled.theme' -import ReactFlagsSelect from 'react-flags-select' import { getCountryName } from 'src/utils/helpers' +import { FlexContainer } from '../Layout/FlexContainer' +import { ErrorMessage, FieldContainer } from './elements' +import { IFieldProps } from './Fields' interface ISelectOption { value: string @@ -63,19 +64,22 @@ const defaultProps: Partial = { } export const SelectField = ({ input, meta, ...rest }: ISelectFieldProps) => ( // note, we first use a div container so that default styles can be applied - - { + input.onChange(getValueFromSelect(v)) + }} + onBlur={input.onBlur} + onFocus={input.onFocus} + value={getValueForSelect(rest.options, input.value)} + {...defaultProps} + {...rest} + /> + + {meta.error && meta.touched && {meta.error}} + ) export const FlagSelector = ({ input, meta, ...rest }: ISelectFieldProps) => ( @@ -89,7 +93,6 @@ export const FlagSelector = ({ input, meta, ...rest }: ISelectFieldProps) => ( {...defaultProps} {...rest} /> - - {/* {meta.error && meta.touched && {meta.error}} */} + {/* meta.error && meta.touched && {meta.error} */} ) diff --git a/src/components/Form/elements.ts b/src/components/Form/elements.ts index ec5f770982..668e549654 100644 --- a/src/components/Form/elements.ts +++ b/src/components/Form/elements.ts @@ -1,8 +1,12 @@ import styled, { css } from 'styled-components' import theme from 'src/themes/styled.theme' -export const inputStyles = css` - border: 1px solid ${theme.colors.black}; +interface IFormElement { + invalid?: boolean +} + +export const inputStyles = ({ invalid }: IFormElement) => css` + border: 1px solid ${invalid ? theme.colors.error : theme.colors.black}; border-radius: 4px; font-size: ${theme.fontSizes[2] + 'px'}; background: white; @@ -16,12 +20,12 @@ export const inputStyles = css` } ` -export const Input = styled.input` +export const Input = styled.input` ${inputStyles}; height: 40px; ` -export const TextAreaStyled = styled.textarea` +export const TextAreaStyled = styled.textarea` ${inputStyles}; height: 150px; font-family: inherit; @@ -32,8 +36,15 @@ export const TextAreaDisabled = styled.div` ` // generic container used for some custom component fields -export const FieldContainer = styled.div` +export const FieldContainer = styled.div` ${inputStyles}; border: 'none'; padding: 0; ` +export const ErrorMessage = styled.span` + position: relative; + bottom: ${theme.space[2]}px; + color: ${theme.colors.error}; + font-size: ${theme.fontSizes[0]}px; + height: ${theme.space[0]}; +` diff --git a/src/pages/Events/Content/EventsCreate/EventsCreate.tsx b/src/pages/Events/Content/EventsCreate/EventsCreate.tsx index 6a29137c0d..68767c03e2 100644 --- a/src/pages/Events/Content/EventsCreate/EventsCreate.tsx +++ b/src/pages/Events/Content/EventsCreate/EventsCreate.tsx @@ -90,7 +90,7 @@ export class EventsCreate extends React.Component { validate={value => this.validateTitle(value)} validateFields={[]} component={InputField} - placeholder="Title of your event" + placeholder="Title of your event *" /> { validateFields={[]} validate={value => this.validateUrl(value)} component={InputField} - placeholder="URL to offsite link (Facebook, Meetup, etc)" + placeholder="URL to offsite link (Facebook, Meetup, etc) *" /> diff --git a/src/pages/Howto/Content/CreateHowto/Step/Step.tsx b/src/pages/Howto/Content/CreateHowto/Step/Step.tsx index 8fa51bef9e..09b26e8609 100644 --- a/src/pages/Howto/Content/CreateHowto/Step/Step.tsx +++ b/src/pages/Howto/Content/CreateHowto/Step/Step.tsx @@ -65,30 +65,36 @@ class Step extends Component { - {/* Left */} - - + + {/* Left */} + + + + {/* right */} + + + + - {/* right */} - - - - )