ConceptPortal-public/rsconcept/frontend/src/components/Common/Checkbox.tsx

57 lines
1.7 KiB
TypeScript
Raw Normal View History

import { useRef } from 'react';
2023-07-15 17:46:19 +03:00
import Label from './Label';
2023-07-20 17:11:03 +03:00
export interface CheckboxProps {
id?: string
label?: string
2023-07-15 17:46:19 +03:00
required?: boolean
disabled?: boolean
widthClass?: string
tooltip?: string
value?: boolean
2023-07-15 17:46:19 +03:00
onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void
}
function Checkbox({ id, required, disabled, tooltip, label, widthClass = 'w-full', value, onChange }: CheckboxProps) {
const inputRef = useRef<HTMLInputElement | null>(null);
const cursor = disabled ? 'cursor-not-allowed' : 'cursor-pointer';
function handleLabelClick(event: React.MouseEvent<HTMLLabelElement, MouseEvent>): void {
event.preventDefault();
if (!disabled) {
inputRef.current?.click();
}
}
2023-07-15 17:46:19 +03:00
return (
<div className={'flex gap-2 [&:not(:first-child)]:mt-3 ' + widthClass} title={tooltip}>
<input id={id} type='checkbox' ref={inputRef}
className={`relative peer w-4 h-4 shrink-0 mt-0.5 border rounded-sm appearance-none clr-checkbox ${cursor}`}
2023-07-15 17:46:19 +03:00
required={required}
disabled={disabled}
checked={value}
2023-07-15 17:46:19 +03:00
onChange={onChange}
/>
{ label &&
<Label
className={`${cursor}`}
2023-07-15 17:46:19 +03:00
text={label}
required={required}
htmlFor={id}
onClick={handleLabelClick}
2023-07-20 17:11:03 +03:00
/>}
2023-07-15 17:46:19 +03:00
<svg
className='absolute hidden w-3 h-3 mt-1 ml-0.5 text-white pointer-events-none peer-checked:block'
viewBox='0 0 512 512'
fill='currentColor'
>
<path d='M470.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L192 338.7l233.4-233.3c12.5-12.5 32.8-12.5 45.3 0z' />
</svg>
</div>
);
}
2023-07-25 20:27:29 +03:00
export default Checkbox;