From 5d3e8a4d0c2ce2ad8f22df857ab3ce54fcfc38ac Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Fri, 3 Nov 2023 12:22:47 +0100 Subject: refactor(components): replace Toolbar with Navbar component * remove SearchModal and SettingsModal components * add a generic NavbarItem component (instead of the previous toolbar items to avoid unreadable styles...) * move FlippingLabel component logic into NavbarItem since it is only used here --- .../forms/fields/boolean-field/boolean-field.tsx | 43 +++-- .../atoms/forms/fields/checkbox/checkbox.tsx | 15 +- src/components/atoms/forms/label/label.tsx | 49 +++--- .../flipping-label/flipping-label.module.scss | 17 -- .../flipping-label/flipping-label.stories.tsx | 98 ----------- .../forms/flipping-label/flipping-label.test.tsx | 18 --- .../forms/flipping-label/flipping-label.tsx | 54 ------- .../molecules/forms/flipping-label/index.ts | 1 - src/components/molecules/forms/index.ts | 1 - .../organisms/forms/search-form/search-form.tsx | 6 +- src/components/organisms/index.ts | 3 +- src/components/organisms/modals/index.ts | 2 - .../organisms/modals/search-modal.module.scss | 11 -- .../organisms/modals/search-modal.stories.tsx | 47 ------ .../organisms/modals/search-modal.test.tsx | 10 -- src/components/organisms/modals/search-modal.tsx | 45 ------ .../organisms/modals/settings-modal.module.scss | 19 --- .../organisms/modals/settings-modal.stories.tsx | 51 ------ .../organisms/modals/settings-modal.test.tsx | 29 ---- src/components/organisms/modals/settings-modal.tsx | 45 ------ src/components/organisms/navbar/index.ts | 1 + .../organisms/navbar/navbar-item/index.ts | 1 + .../navbar/navbar-item/navbar-item.module.scss | 173 ++++++++++++++++++++ .../navbar/navbar-item/navbar-item.stories.tsx | 55 +++++++ .../navbar/navbar-item/navbar-item.test.tsx | 79 +++++++++ .../organisms/navbar/navbar-item/navbar-item.tsx | 179 +++++++++++++++++++++ src/components/organisms/navbar/navbar.module.scss | 53 ++++++ src/components/organisms/navbar/navbar.stories.tsx | 110 +++++++++++++ src/components/organisms/navbar/navbar.test.tsx | 42 +++++ src/components/organisms/navbar/navbar.tsx | 65 ++++++++ src/components/organisms/toolbar/index.ts | 1 - .../organisms/toolbar/main-nav.module.scss | 86 ---------- .../organisms/toolbar/main-nav.stories.tsx | 91 ----------- src/components/organisms/toolbar/main-nav.test.tsx | 45 ------ src/components/organisms/toolbar/main-nav.tsx | 75 --------- .../organisms/toolbar/search.module.scss | 11 -- .../organisms/toolbar/search.stories.tsx | 88 ---------- src/components/organisms/toolbar/search.test.tsx | 15 -- src/components/organisms/toolbar/search.tsx | 77 --------- .../organisms/toolbar/settings.module.scss | 9 -- .../organisms/toolbar/settings.stories.tsx | 88 ---------- src/components/organisms/toolbar/settings.test.tsx | 23 --- src/components/organisms/toolbar/settings.tsx | 62 ------- .../organisms/toolbar/toolbar-items.module.scss | 91 ----------- .../organisms/toolbar/toolbar.module.scss | 63 -------- .../organisms/toolbar/toolbar.stories.tsx | 68 -------- src/components/organisms/toolbar/toolbar.test.tsx | 17 -- src/components/organisms/toolbar/toolbar.tsx | 86 ---------- src/components/templates/layout/layout.module.scss | 27 +--- src/components/templates/layout/layout.tsx | 130 ++++++++++++++- src/i18n/en.json | 54 +++---- src/i18n/fr.json | 54 +++---- 52 files changed, 1005 insertions(+), 1578 deletions(-) delete mode 100644 src/components/molecules/forms/flipping-label/flipping-label.module.scss delete mode 100644 src/components/molecules/forms/flipping-label/flipping-label.stories.tsx delete mode 100644 src/components/molecules/forms/flipping-label/flipping-label.test.tsx delete mode 100644 src/components/molecules/forms/flipping-label/flipping-label.tsx delete mode 100644 src/components/molecules/forms/flipping-label/index.ts delete mode 100644 src/components/organisms/modals/index.ts delete mode 100644 src/components/organisms/modals/search-modal.module.scss delete mode 100644 src/components/organisms/modals/search-modal.stories.tsx delete mode 100644 src/components/organisms/modals/search-modal.test.tsx delete mode 100644 src/components/organisms/modals/search-modal.tsx delete mode 100644 src/components/organisms/modals/settings-modal.module.scss delete mode 100644 src/components/organisms/modals/settings-modal.stories.tsx delete mode 100644 src/components/organisms/modals/settings-modal.test.tsx delete mode 100644 src/components/organisms/modals/settings-modal.tsx create mode 100644 src/components/organisms/navbar/index.ts create mode 100644 src/components/organisms/navbar/navbar-item/index.ts create mode 100644 src/components/organisms/navbar/navbar-item/navbar-item.module.scss create mode 100644 src/components/organisms/navbar/navbar-item/navbar-item.stories.tsx create mode 100644 src/components/organisms/navbar/navbar-item/navbar-item.test.tsx create mode 100644 src/components/organisms/navbar/navbar-item/navbar-item.tsx create mode 100644 src/components/organisms/navbar/navbar.module.scss create mode 100644 src/components/organisms/navbar/navbar.stories.tsx create mode 100644 src/components/organisms/navbar/navbar.test.tsx create mode 100644 src/components/organisms/navbar/navbar.tsx delete mode 100644 src/components/organisms/toolbar/index.ts delete mode 100644 src/components/organisms/toolbar/main-nav.module.scss delete mode 100644 src/components/organisms/toolbar/main-nav.stories.tsx delete mode 100644 src/components/organisms/toolbar/main-nav.test.tsx delete mode 100644 src/components/organisms/toolbar/main-nav.tsx delete mode 100644 src/components/organisms/toolbar/search.module.scss delete mode 100644 src/components/organisms/toolbar/search.stories.tsx delete mode 100644 src/components/organisms/toolbar/search.test.tsx delete mode 100644 src/components/organisms/toolbar/search.tsx delete mode 100644 src/components/organisms/toolbar/settings.module.scss delete mode 100644 src/components/organisms/toolbar/settings.stories.tsx delete mode 100644 src/components/organisms/toolbar/settings.test.tsx delete mode 100644 src/components/organisms/toolbar/settings.tsx delete mode 100644 src/components/organisms/toolbar/toolbar-items.module.scss delete mode 100644 src/components/organisms/toolbar/toolbar.module.scss delete mode 100644 src/components/organisms/toolbar/toolbar.stories.tsx delete mode 100644 src/components/organisms/toolbar/toolbar.test.tsx delete mode 100644 src/components/organisms/toolbar/toolbar.tsx (limited to 'src') diff --git a/src/components/atoms/forms/fields/boolean-field/boolean-field.tsx b/src/components/atoms/forms/fields/boolean-field/boolean-field.tsx index 5476cf5..009635d 100644 --- a/src/components/atoms/forms/fields/boolean-field/boolean-field.tsx +++ b/src/components/atoms/forms/fields/boolean-field/boolean-field.tsx @@ -1,4 +1,8 @@ -import type { FC, InputHTMLAttributes } from 'react'; +import { + forwardRef, + type InputHTMLAttributes, + type ForwardRefRenderFunction, +} from 'react'; import styles from './boolean-field.module.scss'; export type BooleanFieldProps = Omit< @@ -56,20 +60,21 @@ export type BooleanFieldProps = Omit< value: string; }; -/** - * BooleanField component - * - * Render a checkbox or a radio input type. - */ -export const BooleanField: FC = ({ - className = '', - isChecked = false, - isDisabled = false, - isHidden = false, - isReadOnly = false, - isRequired = false, - ...props -}) => { +const BooleanFieldWithRef: ForwardRefRenderFunction< + HTMLInputElement, + BooleanFieldProps +> = ( + { + className = '', + isChecked = false, + isDisabled = false, + isHidden = false, + isReadOnly = false, + isRequired = false, + ...props + }, + ref +) => { const visibilityClass = isHidden ? styles['field--hidden'] : ''; const inputClass = `${visibilityClass} ${className}`; @@ -80,7 +85,15 @@ export const BooleanField: FC = ({ className={inputClass} disabled={isDisabled} readOnly={isReadOnly} + ref={ref} required={isRequired} /> ); }; + +/** + * BooleanField component + * + * Render a checkbox or a radio input type. + */ +export const BooleanField = forwardRef(BooleanFieldWithRef); diff --git a/src/components/atoms/forms/fields/checkbox/checkbox.tsx b/src/components/atoms/forms/fields/checkbox/checkbox.tsx index 9c175b7..2a8424e 100644 --- a/src/components/atoms/forms/fields/checkbox/checkbox.tsx +++ b/src/components/atoms/forms/fields/checkbox/checkbox.tsx @@ -1,14 +1,19 @@ -import type { FC } from 'react'; +import { forwardRef, type ForwardRefRenderFunction } from 'react'; import { BooleanField, type BooleanFieldProps } from '../boolean-field'; export type CheckboxProps = Omit; +const CheckboxWithRef: ForwardRefRenderFunction< + HTMLInputElement, + CheckboxProps +> = (props, ref) => ( + // eslint-disable-next-line react/jsx-no-literals -- Type allowed + +); + /** * Checkbox component * * Render a checkbox input type. */ -export const Checkbox: FC = (props) => ( - // eslint-disable-next-line react/jsx-no-literals -- Type allowed - -); +export const Checkbox = forwardRef(CheckboxWithRef); diff --git a/src/components/atoms/forms/label/label.tsx b/src/components/atoms/forms/label/label.tsx index 6692205..bfd1a59 100644 --- a/src/components/atoms/forms/label/label.tsx +++ b/src/components/atoms/forms/label/label.tsx @@ -1,4 +1,9 @@ -import type { FC, LabelHTMLAttributes, ReactNode } from 'react'; +import { + forwardRef, + type ForwardRefRenderFunction, + type LabelHTMLAttributes, + type ReactNode, +} from 'react'; import styles from './label.module.scss'; export type LabelSize = 'md' | 'sm'; @@ -31,26 +36,27 @@ export type LabelProps = Omit< size?: LabelSize; }; -/** - * Label Component - * - * Render a HTML label element. - */ -export const Label: FC = ({ - children, - className = '', - isHidden = false, - isRequired = false, - size = 'sm', - ...props -}) => { - const visibilityClass = isHidden ? 'screen-reader-text' : ''; - const sizeClass = styles[`label--${size}`]; - const labelClass = `${styles.label} ${sizeClass} ${visibilityClass} ${className}`; +const LabelWithRef: ForwardRefRenderFunction = ( + { + children, + className = '', + isHidden = false, + isRequired = false, + size = 'sm', + ...props + }, + ref +) => { + const labelClass = [ + styles.label, + styles[`label--${size}`], + isHidden ? 'screen-reader-text' : '', + className, + ].join(' '); const requiredSymbol = ' *'; return ( -