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
-
-
+
+
+
+ {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 */}
-
-
-
-
)