From 251f2715a2edea310561b793b2de67270c69b13d Mon Sep 17 00:00:00 2001 From: Mihoub Date: Wed, 2 Oct 2024 14:16:31 +0200 Subject: [PATCH] fix(checkbox): add checked props and rework stories --- .../src/pages/components/Checkboxes.tsx | 320 ++++++++---------- src/components/Checkbox/Checkbox.tsx | 91 +++-- 2 files changed, 192 insertions(+), 219 deletions(-) diff --git a/example-ts/src/pages/components/Checkboxes.tsx b/example-ts/src/pages/components/Checkboxes.tsx index c561038..4bbcb3e 100644 --- a/example-ts/src/pages/components/Checkboxes.tsx +++ b/example-ts/src/pages/components/Checkboxes.tsx @@ -1,140 +1,39 @@ -import { Checkbox, Fieldset, Container, Title, Text, Row, Col, Breadcrumb, Link } from '@dataesr/dsfr-plus'; +import { + Checkbox, + Fieldset, + Container, + Title, + Text, + Row, + Col, + Breadcrumb, + Link, +} from "@dataesr/dsfr-plus"; +import Playground from "../../components/Playground"; +import { useState } from "react"; -import Playground from '../../components/Playground'; +const checkboxData = [ + { value: "1", label: "Checkbox 1", hint: "Je suis la valeur numéro 1" }, + { value: "2", label: "Checkbox 2", hint: "Je suis la valeur numéro 2" }, + { value: "3", label: "Checkbox 3", hint: "Je suis la valeur numéro 3" }, +]; -const checkboxSimple = ` - -`; -const checkboxDefaultSimple = ` - -`; - -const state = ` -
- - - -
-`; - -const disabled = ` -
- - - -
-`; - -const hint = ` -
- - - -
-`; - -const inline = ` -
- - - -
-`; -const checkboxGroup = ` -
- - - -
-`; -const checkboxGroupSM = ` -
- - - -
-`; +const useCheckboxState = (initialState: boolean) => { + const [isChecked, setIsChecked] = useState(initialState); + const handleChange = (event: { target: { checked: boolean } }) => { + setIsChecked(event.target.checked); + }; + return { isChecked, handleChange }; +}; export function Checkboxes() { + const checkboxStates = checkboxData.map((_, index) => + useCheckboxState(index === 0 || index === 2) + ); + return ( -
- - - -
Accueil Composants @@ -145,69 +44,120 @@ export function Checkboxes() { Case à cocher - Checkbox - Les cases à cocher permettent à l’utilisateur de sélectionner une ou plusieurs options dans une liste. - Elles sont utilisées pour effectuer des sélections multiples (de 0 à N éléments) ou bien pour permettre - un choix binaire, lorsque l’utilisateur peut sélectionner ou désélectionner une seule option. - - - La case à cocher peut être utilisée seule ou en liste. - Évitez les listes de plus de 5 éléments et lorsque vous souhaitez contraindre - le choix à un seul élément - utilisez les boutons radio. - - - - Bouton Checkbox simple - - - - Checkbox - État cochée par défaut - - - - Groupe de boutons Checkbox - - Comme pour le composant Checkbox, plusieurs boutons Checkbox sont - regroupés sous un composant `Fieldset`, qui permet de gérer la - légende ainsi que l'erreur sur le champ. - - - - - Gestion de l'état - - Vous devez gérer l'état du champ directement dans le composant `Fieldset` : + Les cases à cocher permettent à l’utilisateur de sélectionner une ou + plusieurs options dans une liste. - - - - Avec des textes d'explication - - Vous pouvez ajouter des textes explicatifs dans chaque bouton Checkbox et dans le Fieldset : - - + + {/* Groupe de boutons Checkbox */} - Désactivé - - Appliquez simplement l'attribut `disabled` sur le Fieldset : - - + + Groupe de boutons Checkbox + + + + ${checkboxData + .map( + (checkbox, index) => `` + ) + .join("\n")} + + `} + scope={{ + Checkbox, + Fieldset, + checkboxData, + handleCheckboxChange1: checkboxStates[0].handleChange, + handleCheckboxChange2: checkboxStates[1].handleChange, + handleCheckboxChange3: checkboxStates[2].handleChange, + }} + /> + + {/* Checkbox avec Hint */} - En ligne - - Vous pouvez ajouter la propriété `isInline` pour afficher les boutons Checkbox sur une ligne. - - + + Checkbox avec Hint + + + + ${checkboxData + .map( + (checkbox, index) => `` + ) + .join("\n")} + + `} + scope={{ + Checkbox, + Fieldset, + checkboxData, + handleCheckboxChange1: checkboxStates[0].handleChange, + handleCheckboxChange2: checkboxStates[1].handleChange, + handleCheckboxChange3: checkboxStates[2].handleChange, + }} + /> + + {/* Checkbox avec Size */} - En taille "sm" - - Vous pouvez réduire la taille des checkboxes avec l'option `size`. - - + + Checkbox avec Taille + + + + ${checkboxData + .map( + (checkbox, index) => `` + ) + .join("\n")} + + `} + scope={{ + Checkbox, + Fieldset, + checkboxData, + handleCheckboxChange1: checkboxStates[0].handleChange, + handleCheckboxChange2: checkboxStates[1].handleChange, + handleCheckboxChange3: checkboxStates[2].handleChange, + }} + />
); -} \ No newline at end of file +} diff --git a/src/components/Checkbox/Checkbox.tsx b/src/components/Checkbox/Checkbox.tsx index 9e93d4c..0db3bff 100644 --- a/src/components/Checkbox/Checkbox.tsx +++ b/src/components/Checkbox/Checkbox.tsx @@ -1,12 +1,12 @@ -import { forwardRef, useId } from 'react'; -import cn, { Argument } from 'classnames'; -import { Merge } from '../../types/polymophic'; +import { forwardRef, useId } from "react"; +import cn, { Argument } from "classnames"; +import { Merge } from "../../types/polymophic"; type CheckboxCss = { label?: Argument; labelHint?: Argument; input?: Argument; -} +}; type CheckboxBaseProps = { className?: Argument; @@ -14,35 +14,58 @@ type CheckboxBaseProps = { hint?: string; id?: string; label?: string; - size?: 'sm' | 'md'; -} + size?: "sm" | "md"; + checked?: boolean; + onChange?: (event: React.ChangeEvent) => void; +}; -export type CheckboxProps = Merge, CheckboxBaseProps>; +export type CheckboxProps = Merge< + React.InputHTMLAttributes, + CheckboxBaseProps +>; -export const Checkbox = forwardRef(({ - className, - css = {}, - hint, - id, - label, - size, - ...props -}, ref) => { - const _id = useId(); - const checkboxId = id || _id; - return ( -
- - -
- ); -}); \ No newline at end of file +export const Checkbox = forwardRef( + ( + { + className, + css = {}, + hint, + id, + label, + size, + checked = false, + onChange, + ...props + }, + ref + ) => { + const _id = useId(); + const checkboxId = id || _id; + + return ( +
+ + +
+ ); + } +);