From 691646c97b09f9150ac823670d6c661358c81c1c Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Tue, 24 May 2022 17:54:23 +0200 Subject: chore: give autofocus to the toolbar search form --- src/components/atoms/forms/field.tsx | 24 +++++++++++++--------- src/components/molecules/forms/labelled-field.tsx | 21 +++++++++---------- src/components/organisms/forms/search-form.tsx | 24 ++++++++++++++-------- src/components/organisms/modals/search-modal.tsx | 25 ++++++++--------------- src/components/organisms/toolbar/search.tsx | 13 ++++++++++-- 5 files changed, 59 insertions(+), 48 deletions(-) (limited to 'src/components') diff --git a/src/components/atoms/forms/field.tsx b/src/components/atoms/forms/field.tsx index e45a8a7..377e1b0 100644 --- a/src/components/atoms/forms/field.tsx +++ b/src/components/atoms/forms/field.tsx @@ -1,4 +1,9 @@ -import { ChangeEvent, FC, SetStateAction } from 'react'; +import { + ChangeEvent, + forwardRef, + ForwardRefRenderFunction, + SetStateAction, +} from 'react'; import styles from './forms.module.scss'; export type FieldType = @@ -72,12 +77,10 @@ export type FieldProps = { * * Render either an input or a textarea. */ -const Field: FC = ({ - className = '', - setValue, - type, - ...props -}) => { +const Field: ForwardRefRenderFunction = ( + { className = '', setValue, type, ...props }, + ref +) => { /** * Update select value when an option is selected. * @param e - The option change event. @@ -96,12 +99,13 @@ const Field: FC = ({ /> ) : ( ); }; -export default Field; +export default forwardRef(Field); diff --git a/src/components/molecules/forms/labelled-field.tsx b/src/components/molecules/forms/labelled-field.tsx index ecc9255..6a00a3e 100644 --- a/src/components/molecules/forms/labelled-field.tsx +++ b/src/components/molecules/forms/labelled-field.tsx @@ -1,6 +1,6 @@ import Field, { type FieldProps } from '@components/atoms/forms/field'; import Label from '@components/atoms/forms/label'; -import { FC } from 'react'; +import { forwardRef, ForwardRefRenderFunction } from 'react'; import styles from './labelled-field.module.scss'; export type LabelledFieldProps = FieldProps & { @@ -23,14 +23,13 @@ export type LabelledFieldProps = FieldProps & { * * Render a field tied to a label. */ -const LabelledField: FC = ({ - hideLabel = false, - id, - label, - labelPosition = 'top', - required, - ...props -}) => { +const LabelledField: ForwardRefRenderFunction< + HTMLInputElement, + LabelledFieldProps +> = ( + { hideLabel = false, id, label, labelPosition = 'top', required, ...props }, + ref +) => { const positionModifier = `label--${labelPosition}`; const visibilityClass = hideLabel ? 'screen-reader-text' : ''; @@ -43,9 +42,9 @@ const LabelledField: FC = ({ > {label} - + ); }; -export default LabelledField; +export default forwardRef(LabelledField); diff --git a/src/components/organisms/forms/search-form.tsx b/src/components/organisms/forms/search-form.tsx index 56d3895..1b5f662 100644 --- a/src/components/organisms/forms/search-form.tsx +++ b/src/components/organisms/forms/search-form.tsx @@ -5,7 +5,7 @@ import LabelledField, { type LabelledFieldProps, } from '@components/molecules/forms/labelled-field'; import { useRouter } from 'next/router'; -import { FC, useState } from 'react'; +import { forwardRef, ForwardRefRenderFunction, useId, useState } from 'react'; import { useIntl } from 'react-intl'; import styles from './search-form.module.scss'; @@ -21,7 +21,10 @@ export type SearchFormProps = Pick & { * * Render a search form. */ -const SearchForm: FC = ({ hideLabel, searchPage }) => { +const SearchForm: ForwardRefRenderFunction< + HTMLInputElement, + SearchFormProps +> = ({ hideLabel, searchPage }, ref) => { const intl = useIntl(); const fieldLabel = intl.formatMessage({ defaultMessage: 'Search for:', @@ -42,17 +45,20 @@ const SearchForm: FC = ({ hideLabel, searchPage }) => { setValue(''); }; + const id = useId(); + return (