Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "Add validation errors to form fields for callouts" #6746

Merged
merged 3 commits into from
Dec 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 5 additions & 16 deletions dotcom-rendering/src/web/components/Callout/CheckboxSelect.tsx
Original file line number Diff line number Diff line change
@@ -1,27 +1,17 @@
import { Checkbox, CheckboxGroup } from '@guardian/source-react-components';
import type { CampaignFieldCheckbox } from 'src/types/content';
import { CampaignFieldCheckbox } from '../../../types/content';
import { FieldLabel } from './FieldLabel';

type Props = {
formField: CampaignFieldCheckbox;
formData: { [key in string]: string[] };
setFormData: React.Dispatch<React.SetStateAction<{ [x: string]: any }>>;
validationErrors?: { [key in string]: string };
};

export const CheckboxSelect = ({
formField,
formData,
setFormData,
validationErrors,
}: Props) => (
export const CheckboxSelect = ({ formField, formData, setFormData }: Props) => (
<>
<CheckboxGroup
error={validationErrors?.[formField.id]}
hideLabel={formField.hideLabel}
name={formField.name}
label={formField.label}
supporting={formField.description}
>
<FieldLabel formField={formField} />
<CheckboxGroup name={formField.name}>
{formField.options.map((option, index) => {
// data related to this field is mapped to `formData` using `formField.id`
// We cannot assume that the data exists, so we need to check if `formField.id` key exists in `formData`
Expand Down Expand Up @@ -49,7 +39,6 @@ export const CheckboxSelect = ({
label={option.label}
value={option.value}
checked={isCheckboxChecked}
error={validationErrors?.[formField.id] ? true : false}
onChange={() => {
setFormData({
...formData,
Expand Down
25 changes: 7 additions & 18 deletions dotcom-rendering/src/web/components/Callout/FieldLabel.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import { css } from '@emotion/react';
import {
neutral,
textSans,
visuallyHidden,
} from '@guardian/source-foundations';
import type { CampaignFieldType } from 'src/types/content';
import { neutral, textSans } from '@guardian/source-foundations';
import { CampaignFieldType } from '../../../types/content';

const fieldLabelStyles = css`
${textSans.medium({ fontWeight: 'bold' })}
Expand All @@ -20,22 +16,15 @@ const optionalTextStyles = css`
padding-left: 5px;
`;

type Props = {
formField: CampaignFieldType;
hideLabel?: boolean;
};

export const FieldLabel = ({ formField, hideLabel }: Props) => (
<label
css={[fieldLabelStyles, hideLabel && visuallyHidden]}
htmlFor={formField.name}
hidden={formField.hideLabel}
>
export const FieldLabel = ({ formField }: { formField: CampaignFieldType }) => (
<label css={fieldLabelStyles} htmlFor={formField.name}>
{formField.label}
{!formField.required && <span css={optionalTextStyles}>Optional</span>}
{!!formField.description && (
<div>
<span css={fieldDescription}>{`${formField.description}`}</span>
<span css={fieldDescription}>
{`(${formField.description})`}
</span>
</div>
)}
</label>
Expand Down
4 changes: 2 additions & 2 deletions dotcom-rendering/src/web/components/Callout/FileUpload.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { css } from '@emotion/react';
import { space, text, textSans } from '@guardian/source-foundations';
import { useState } from 'react';
import type { CampaignFieldFile } from './../../../types/content';
import { stringifyFileBase64 } from './../../lib/stringifyFileBase64';
import { CampaignFieldFile } from '../../../types/content';
import { stringifyFileBase64 } from '../../lib/stringifyFileBase64';
import { FieldLabel } from './FieldLabel';

const fileUploadInputStyles = css`
Expand Down
2 changes: 1 addition & 1 deletion dotcom-rendering/src/web/components/Callout/Form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { css } from '@emotion/react';
import { text, textSans } from '@guardian/source-foundations';
import { Button, Link } from '@guardian/source-react-components';
import { useState } from 'react';
import type { CampaignFieldType } from '../../../types/content';
import { CampaignFieldType } from '../../../types/content';
import { FileUpload } from './FileUpload';
import { MultiSelect } from './MultiSelect';
import { Select } from './Select';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
import type {
CampaignFieldCheckbox,
CampaignFieldRadio,
} from 'src/types/content';
} from '../../../types/content';
import { CheckboxSelect } from './CheckboxSelect';
import { RadioSelect } from './RadioSelect';

type Props = {
validationErrors?: { [key in string]: string };
formField: CampaignFieldCheckbox | CampaignFieldRadio;
formData: { [key in string]: any };
setFormData: React.Dispatch<React.SetStateAction<{ [x: string]: any }>>;
multiple: boolean;
};

export const MultiSelect = ({
validationErrors,
formField,
formData,
setFormData,
Expand All @@ -23,14 +21,12 @@ export const MultiSelect = ({
<div data-testid={`form-field-${formField.id}`}>
{multiple ? (
<CheckboxSelect
validationErrors={validationErrors ?? undefined}
formField={formField as CampaignFieldCheckbox}
formData={formData}
setFormData={setFormData}
/>
) : (
<RadioSelect
validationErrors={validationErrors ?? undefined}
formField={formField as CampaignFieldRadio}
formData={formData}
setFormData={setFormData}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
import { css } from '@emotion/react';
import { Radio, RadioGroup } from '@guardian/source-react-components';
import type { CampaignFieldRadio } from 'src/types/content';
import type { CampaignFieldRadio } from '../../../types/content';
import { FieldLabel } from './FieldLabel';

type FieldProp = {
validationErrors?: { [key in string]: string };
formField: CampaignFieldRadio;
formData: { [key in string]: any };
setFormData: React.Dispatch<React.SetStateAction<{ [x: string]: any }>>;
};

export const RadioSelect = ({
validationErrors,
formField,
formData,
setFormData,
Expand All @@ -27,7 +25,6 @@ export const RadioSelect = ({
>
<FieldLabel formField={formField} />
<RadioGroup
error={validationErrors?.[formField.id]}
name={formField.name}
orientation={
formField.options.length > 2 ? 'vertical' : 'horizontal'
Expand Down
57 changes: 28 additions & 29 deletions dotcom-rendering/src/web/components/Callout/Select.tsx
Original file line number Diff line number Diff line change
@@ -1,37 +1,36 @@
import { Select as SourceSelect } from '@guardian/source-react-components';
import type { CampaignFieldSelect } from 'src/types/content';
import { CampaignFieldSelect } from '../../../types/content';
import { FieldLabel } from './FieldLabel';

type Props = {
validationErrors?: { [key in string]: string };
formField: CampaignFieldSelect;
formData: { [key in string]: any };
setFormData: React.Dispatch<React.SetStateAction<{ [x: string]: any }>>;
};

export const Select = ({
validationErrors,
formField,
formData,
setFormData,
}: Props) => (
<SourceSelect
hideLabel={formField.hideLabel}
data-testid={`form-field-${formField.id}`}
error={validationErrors?.[formField.id]}
label={formField.label}
supporting={formField.description}
value={formField.id in formData ? formData[formField.id] : ''}
onChange={(e) =>
setFormData({
...formData,
[formField.id]: e.target.value,
})
}
optional={!formField.required}
children={formField.options.map((option, index) => (
<option key={index} value={option.value}>
{option.value}
</option>
))}
/>
export const Select = ({ formField, formData, setFormData }: Props) => (
<>
<FieldLabel formField={formField} />
<select
data-testid={`form-field-${formField.id}`}
required={formField.required}
value={
formField.id && formField.id in formData
? formData[formField.id]
: ''
}
onChange={(e) =>
setFormData({
...formData,
[formField.id]: e.target.value,
})
}
>
{formField.options &&
formField.options.map((option, index) => (
<option key={index} value={option.value}>
{option.value}
</option>
))}
</select>
</>
);
13 changes: 2 additions & 11 deletions dotcom-rendering/src/web/components/Callout/TextArea.tsx
Original file line number Diff line number Diff line change
@@ -1,36 +1,27 @@
import { css } from '@emotion/react';
import { space } from '@guardian/source-foundations';
import { TextArea as SourceTextArea } from '@guardian/source-react-components';
import type { CampaignFieldTextArea } from 'src/types/content';
import { CampaignFieldTextArea } from '../../../types/content';

const textAreaStyles = css`
width: 100%;
margin-top: ${space[2]}px;
`;

type Props = {
validationErrors?: { [key in string]: string };
formField: CampaignFieldTextArea;
formData: { [key in string]: any };
setFormData: React.Dispatch<React.SetStateAction<{ [x: string]: any }>>;
};

export const TextArea = ({
validationErrors,
formField,
formData,
setFormData,
}: Props) => (
export const TextArea = ({ formField, formData, setFormData }: Props) => (
<>
<SourceTextArea
hideLabel={formField.hideLabel}
data-testid={`form-field-${formField.id}`}
label={formField.label}
supporting={formField.description}
css={textAreaStyles}
optional={!formField.required}
value={formField.id in formData ? formData[formField.id] : ''}
error={validationErrors?.[formField.id]}
onChange={(e) =>
setFormData({
...formData,
Expand Down
12 changes: 2 additions & 10 deletions dotcom-rendering/src/web/components/Callout/TextInput.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,20 @@
import { css } from '@emotion/react';
import { space } from '@guardian/source-foundations';
import { TextInput as SourceTextInput } from '@guardian/source-react-components';
import type { CampaignFieldText } from 'src/types/content';
import { CampaignFieldText } from '../../../types/content';

const textInputStyles = css`
margin-top: ${space[2]}px;
`;

type Props = {
validationErrors?: { [key in string]: string };
formField: CampaignFieldText;
formData: { [key in string]: any };
setFormData: React.Dispatch<React.SetStateAction<{ [x: string]: any }>>;
};

export const TextInput = ({
validationErrors,
formField,
formData,
setFormData,
}: Props) => (
export const TextInput = ({ formField, formData, setFormData }: Props) => (
<SourceTextInput
hideLabel={formField.hideLabel}
error={validationErrors?.[formField.id]}
css={textInputStyles}
data-testid={`form-field-${formField.id}`}
type={formField.type}
Expand Down