summaryrefslogtreecommitdiffstats
path: root/src/components/molecules/forms/labelled-boolean-field.tsx
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-05-30 19:27:21 +0200
committerArmand Philippot <git@armandphilippot.com>2022-05-31 23:15:07 +0200
commit782cc0a31a866519fb7c3e18a523b347d3e40238 (patch)
tree34fb984e8dc356cd013e5e0d6f203a8c8907b9fe /src/components/molecules/forms/labelled-boolean-field.tsx
parent519b1439dce3f25dd38cd0d0f82fecd10f28dcc8 (diff)
chore: replace Checkbox component with a BooleanField component
Checkbox and radio buttons are working the same way so I decided to group them in a same component.
Diffstat (limited to 'src/components/molecules/forms/labelled-boolean-field.tsx')
-rw-r--r--src/components/molecules/forms/labelled-boolean-field.tsx92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/components/molecules/forms/labelled-boolean-field.tsx b/src/components/molecules/forms/labelled-boolean-field.tsx
new file mode 100644
index 0000000..46eb080
--- /dev/null
+++ b/src/components/molecules/forms/labelled-boolean-field.tsx
@@ -0,0 +1,92 @@
+import BooleanField, {
+ type BooleanFieldProps,
+} from '@components/atoms/forms/boolean-field';
+import Label, { type LabelProps } from '@components/atoms/forms/label';
+import { FC } from 'react';
+import styles from './labelled-boolean-field.module.scss';
+
+export type LabelledBooleanFieldProps = Omit<
+ BooleanFieldProps,
+ 'aria-labelledby' | 'className'
+> & {
+ /**
+ * Set additional classnames to the labelled field wrapper.
+ */
+ className?: string;
+ /**
+ * Set additional classnames to the field.
+ */
+ fieldClassName?: LabelledBooleanFieldProps['className'];
+ /**
+ * The field label.
+ */
+ label: LabelProps['children'];
+ /**
+ * Set additional classnames to the label.
+ */
+ labelClassName?: LabelProps['className'];
+ /**
+ * The label position. Default: left.
+ */
+ labelPosition?: 'left' | 'right';
+ /**
+ * The label size.
+ */
+ labelSize?: LabelProps['size'];
+};
+
+/**
+ * LabelledBooleanField component
+ *
+ * Render a checkbox or radio button with a label.
+ */
+const LabelledBooleanField: FC<LabelledBooleanFieldProps> = ({
+ className = '',
+ fieldClassName,
+ hidden,
+ id,
+ label,
+ labelClassName,
+ labelPosition = 'left',
+ labelSize,
+ ...props
+}) => {
+ const labelHiddenModifier = hidden ? 'label--hidden' : 'label--visible';
+ const labelPositionModifier = `label--${labelPosition}`;
+
+ return labelPosition === 'left' ? (
+ <span className={`${styles.wrapper} ${className}`}>
+ <Label
+ className={`${styles[labelPositionModifier]} ${styles[labelHiddenModifier]} ${labelClassName}`}
+ htmlFor={id}
+ size={labelSize}
+ >
+ {label}
+ </Label>
+ <BooleanField
+ className={fieldClassName}
+ hidden={hidden}
+ id={id}
+ {...props}
+ />
+ </span>
+ ) : (
+ <span className={`${styles.wrapper} ${className}`}>
+ <BooleanField
+ className={fieldClassName}
+ hidden={hidden}
+ id={id}
+ {...props}
+ />
+ <Label
+ className={`${styles[labelPositionModifier]} ${styles[labelHiddenModifier]} ${labelClassName}`}
+ htmlFor={id}
+ size={labelSize}
+ >
+ {label}
+ </Label>
+ </span>
+ );
+};
+
+export default LabelledBooleanField;