- Added `indeterminate` state to Checkbox component for better visual representation of partial selections. - Updated TaskGroup and VirtualizedTaskList components to utilize the new Checkbox features, allowing for group selection with indeterminate states. - Implemented custom debounce function for saving task fields to localStorage, improving performance during user interactions. - Enhanced task row styling for better visibility and user experience, particularly in dark mode.
49 lines
1.7 KiB
TypeScript
49 lines
1.7 KiB
TypeScript
import React from 'react';
|
|
|
|
interface CheckboxProps {
|
|
checked: boolean;
|
|
onChange: (checked: boolean) => void;
|
|
isDarkMode?: boolean;
|
|
className?: string;
|
|
disabled?: boolean;
|
|
indeterminate?: boolean;
|
|
}
|
|
|
|
const Checkbox: React.FC<CheckboxProps> = ({
|
|
checked,
|
|
onChange,
|
|
isDarkMode = false,
|
|
className = '',
|
|
disabled = false,
|
|
indeterminate = false
|
|
}) => {
|
|
return (
|
|
<label className={`inline-flex items-center cursor-pointer ${disabled ? 'opacity-50 cursor-not-allowed' : ''} ${className}`}>
|
|
<input
|
|
type="checkbox"
|
|
checked={checked}
|
|
onChange={(e) => !disabled && onChange(e.target.checked)}
|
|
disabled={disabled}
|
|
className="sr-only"
|
|
/>
|
|
<div className={`w-4 h-4 border-2 rounded transition-all duration-200 flex items-center justify-center ${
|
|
checked || indeterminate
|
|
? `${isDarkMode ? 'bg-blue-600 border-blue-600' : 'bg-blue-500 border-blue-500'}`
|
|
: `${isDarkMode ? 'bg-gray-800 border-gray-600 hover:border-gray-500' : 'bg-white border-gray-300 hover:border-gray-400'}`
|
|
} ${disabled ? 'cursor-not-allowed' : ''}`}>
|
|
{checked && !indeterminate && (
|
|
<svg className="w-3 h-3 text-white" fill="currentColor" viewBox="0 0 20 20">
|
|
<path fillRule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clipRule="evenodd" />
|
|
</svg>
|
|
)}
|
|
{indeterminate && (
|
|
<svg className="w-3 h-3 text-white" fill="currentColor" viewBox="0 0 20 20">
|
|
<path fillRule="evenodd" d="M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clipRule="evenodd" />
|
|
</svg>
|
|
)}
|
|
</div>
|
|
</label>
|
|
);
|
|
};
|
|
|
|
export default Checkbox;
|