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

DS-1264: feat(checkbox, checkbox-group): add required state for checkboxes #1035

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

ogermain-kronos
Copy link
Contributor

https://equisoft.atlassian.net/browse/DS-1264

Single checkbox
image

Checkbox group
image

@ogermain-kronos ogermain-kronos requested a review from a team as a code owner November 18, 2024 01:31
Copy link

Storybook for this build: https://ds.equisoft.io/pr-1035/

Copy link

Webapp for this build: https://ds.equisoft.io/pr-1035/webapp/

@@ -116,49 +156,75 @@ export const Checkbox: FunctionComponent<PropsWithChildren<CheckboxProps>> = for
disabled,
id,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tu devrais faire comme on fait dans d'autres components

Suggested change
id,
id: providedId,

const checkboxRef = useRef<HTMLInputElement>(null);
const [isChecked, setIsChecked] = useState<boolean | undefined>(checked || false);
const validationAlertId = `${id || uuid()}_validationAlert`;
Copy link
Contributor

@meriouma meriouma Nov 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Et utiliser le hook useId. En gros ça fait un useMemo de uuid() si jamais providedId est undefined

const id = useId(providedId);

const checkboxRef = useRef<HTMLInputElement>(null);
const [isChecked, setIsChecked] = useState<boolean | undefined>(checked || false);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tu devrais pas tracker ça dans le state je crois. Si la prop checked est modifiée, le state interne sera plus valide.

Copy link
Contributor

@hebernardEquisoft hebernardEquisoft Nov 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça serait peut être intéressant de faire un shared custom hook qui vient gérer les différents uncontrolled/controlled props? 🤔
Mettons pour checked, value, valid...
On pourrait uniformiser le comportement de ces props au travers nos différents composantes d'inputs!

@@ -116,49 +156,75 @@ export const Checkbox: FunctionComponent<PropsWithChildren<CheckboxProps>> = for
disabled,
id,
indeterminate,
isInGroup = false,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je suis pas certain de cette prop. Si la checkbox est dans un group, il faudrait juste pas mettre de required sur les checkbox individuels il me semble?

defaultChecked={defaultChecked}
<>
{
required && !valid && !isChecked && !isInGroup
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça devrait juste être !valid je pense la condition


useImperativeHandle(ref, () => checkboxRef.current, [checkboxRef]);
const dataAttributes = useDataAttributes(otherProps);

useEffect(() => {
if (checkboxRef.current) {
checkboxRef.current.indeterminate = indeterminate || false;
checkboxRef.current.checked = checked || false;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je pense pas que ce soit nécessaire vu que la prop checked est passée à l'input

{
required && !valid && areAllCheckboxUnchecked
&& (
<ValidationErrorAlert id={validationAlertId} label={label || ''}>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Même question

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Et le message semble affiché dès le load du component. Je pense qu'on voulait pas ça, on l'avait enlevé sur le TextInput il me semble. @LarryMatte ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le message d'erreur devrait s'afficher si l'utilisateur n'a pas sélectionné de checkbox et qu'il submit le formulaire. La validation va fail et le message d'erreur va s'afficher.

Comment on lines +65 to +74
const [checkedState, setCheckedState] = useState(
new Array(checkboxGroup.length).fill(false),
);
const areAllCheckboxUnchecked = checkedState.every((e) => e === false);

const handleOnChange = (position: number): void => {
const updatedCheckedState = checkedState.map((item, index) => (index === position ? !item : item));

setCheckedState(updatedCheckedState);
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je suis pas certain qu'on doive gérer le state. Ça devrait être synchronisé avec les checkedValues. Ou sinon il faudrait gérer le mode controlled et uncontrolled. Là on est un peu entre les deux.
Vous en pensez quoi @pylafleur @savutsang ? Est-ce qu'on se sert tant que ça du mode uncontrolled?

/>,
);

const warning = wrapper.find('div#checkbox-group-test_validationAlert');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je pense que t'as pas besoin du div dans le sélecteur?

Comment on lines +75 to +76
const warningPreCheck = wrapper.find('div#checkbox-group-test_validationAlert');
expect(warningPreCheck).toBeDefined();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pas besoin de ce bout là, ton test précédent fait la même chose.

Copy link

@maboilard maboilard left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Au niveau visuel, tout baigne! Par contre, j'ai l'impression que lorsqu'un checkbox est sélectionné, les autres checkboxes du groupe devrait passer à l'état "Default" plutôt que de rester en erreur. Cet exemple de MUI illustre un peu ce que je veux dire. Lorsque la consigne est atteinte, le champ n'est plus en erreur ce qui renvoie un feedback positif à l'utilisateur. @LarryMatte qu'en penses-tu?

@LarryMatte
Copy link
Contributor

Au niveau visuel, tout baigne! Par contre, j'ai l'impression que lorsqu'un checkbox est sélectionné, les autres checkboxes du groupe devrait passer à l'état "Default" plutôt que de rester en erreur. Cet exemple de MUI illustre un peu ce que je veux dire. Lorsque la consigne est atteinte, le champ n'est plus en erreur ce qui renvoie un feedback positif à l'utilisateur. @LarryMatte qu'en penses-tu?

effectivement

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants