2023-09-07 16:30:43 +03:00
|
|
|
import { useMemo } from 'react';
|
2023-08-02 18:24:17 +03:00
|
|
|
|
2023-09-10 20:17:18 +03:00
|
|
|
import { CheckboxCheckedIcon } from '../Icons';
|
2023-07-15 17:46:19 +03:00
|
|
|
import Label from './Label';
|
|
|
|
|
2023-09-09 20:36:55 +03:00
|
|
|
export interface CheckboxProps
|
|
|
|
extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'className' | 'children' | 'title' | 'value' | 'onClick' > {
|
2023-07-20 17:11:03 +03:00
|
|
|
label?: string
|
2023-07-15 17:46:19 +03:00
|
|
|
disabled?: boolean
|
2023-09-15 23:29:52 +03:00
|
|
|
dimensions?: string
|
2023-07-31 22:38:58 +03:00
|
|
|
tooltip?: string
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-09-07 16:30:43 +03:00
|
|
|
value: boolean
|
|
|
|
setValue?: (newValue: boolean) => void
|
|
|
|
}
|
2023-08-02 18:24:17 +03:00
|
|
|
|
2023-09-09 20:36:55 +03:00
|
|
|
function Checkbox({
|
2023-10-14 23:46:36 +03:00
|
|
|
id, disabled, tooltip, label,
|
2023-11-27 13:50:56 +03:00
|
|
|
dimensions = 'w-fit', value, setValue, ...restProps
|
2023-09-09 20:36:55 +03:00
|
|
|
}: CheckboxProps) {
|
2023-09-07 16:30:43 +03:00
|
|
|
const cursor = useMemo(
|
|
|
|
() => {
|
|
|
|
if (disabled) {
|
|
|
|
return 'cursor-not-allowed';
|
|
|
|
} else if (setValue) {
|
|
|
|
return 'cursor-pointer';
|
|
|
|
} else {
|
|
|
|
return ''
|
|
|
|
}
|
|
|
|
}, [disabled, setValue]);
|
|
|
|
const bgColor = useMemo(
|
|
|
|
() => {
|
|
|
|
return value !== false ? 'clr-primary' : 'clr-app'
|
|
|
|
}, [value]);
|
2023-08-02 18:24:17 +03:00
|
|
|
|
2023-08-29 15:17:16 +03:00
|
|
|
function handleClick(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void {
|
2023-08-02 18:24:17 +03:00
|
|
|
event.preventDefault();
|
2023-09-07 16:30:43 +03:00
|
|
|
if (disabled || !setValue) {
|
|
|
|
return;
|
2023-08-02 18:24:17 +03:00
|
|
|
}
|
2023-09-07 16:30:43 +03:00
|
|
|
setValue(!value);
|
2023-09-04 20:37:55 +03:00
|
|
|
}
|
2023-08-02 18:24:17 +03:00
|
|
|
|
2023-07-15 17:46:19 +03:00
|
|
|
return (
|
2023-11-27 11:33:34 +03:00
|
|
|
<button type='button' id={id}
|
2023-12-07 23:08:49 +03:00
|
|
|
className={`flex items-center outline-none ${dimensions}`}
|
2023-08-29 15:17:16 +03:00
|
|
|
title={tooltip}
|
|
|
|
disabled={disabled}
|
|
|
|
onClick={handleClick}
|
2023-11-27 13:50:56 +03:00
|
|
|
{...restProps}
|
2023-08-29 15:17:16 +03:00
|
|
|
>
|
2023-09-09 20:36:55 +03:00
|
|
|
<div className={`max-w-[1rem] min-w-[1rem] h-4 mt-0.5 border rounded-sm ${bgColor} ${cursor}`} >
|
2023-11-27 11:33:34 +03:00
|
|
|
{value ?
|
|
|
|
<div className='mt-[1px] ml-[1px]'>
|
|
|
|
<CheckboxCheckedIcon />
|
|
|
|
</div> : null}
|
2023-09-09 20:36:55 +03:00
|
|
|
</div>
|
2023-11-27 11:33:34 +03:00
|
|
|
{label ?
|
2023-08-02 18:24:17 +03:00
|
|
|
<Label
|
2023-09-07 16:30:43 +03:00
|
|
|
className={`${cursor} px-2 text-start`}
|
2023-07-15 17:46:19 +03:00
|
|
|
text={label}
|
|
|
|
htmlFor={id}
|
2023-11-27 11:33:34 +03:00
|
|
|
/> : null}
|
2023-08-29 15:17:16 +03:00
|
|
|
</button>
|
2023-07-15 17:46:19 +03:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2023-07-25 20:27:29 +03:00
|
|
|
export default Checkbox;
|