import React, { useRef, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { MagnifyingGlassIcon, InformationCircleIcon, FunnelIcon, } from '@heroicons/react/24/outline'; import { SortOption } from './SortFilterButton'; export interface ViewOptionsBarProps { // Info/Description showInfo?: boolean; onToggleInfo?: () => void; isInfoExpanded?: boolean; // Search showSearch?: boolean; onToggleSearch?: () => void; isSearchExpanded?: boolean; // Show Completed Toggle showCompletedToggle?: boolean; showCompleted?: boolean; onToggleCompleted?: () => void; completedLabel?: string; // Sort/Filter Dropdown showSort?: boolean; sortOptions?: SortOption[]; sortValue?: string; onSortChange?: (value: string) => void; sortLabel?: string; // Custom buttons/elements to add customElements?: React.ReactNode; // Styling className?: string; position?: 'fixed' | 'relative'; // For upcoming view in Tasks fixedPosition?: string; // Custom position classes for fixed positioning } const ViewOptionsBar: React.FC = ({ showInfo = false, onToggleInfo, isInfoExpanded = false, showSearch = false, onToggleSearch, isSearchExpanded = false, showCompletedToggle = false, showCompleted = false, onToggleCompleted, completedLabel, showSort = false, sortOptions = [], sortValue = '', onSortChange, sortLabel, customElements, className = '', position = 'relative', fixedPosition = '', }) => { const { t } = useTranslation(); const [isSortDropdownOpen, setIsSortDropdownOpen] = React.useState(false); const sortDropdownRef = useRef(null); // Close sort dropdown when clicking outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( sortDropdownRef.current && !sortDropdownRef.current.contains(event.target as Node) ) { setIsSortDropdownOpen(false); } }; if (isSortDropdownOpen) { document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; } }, [isSortDropdownOpen]); const handleSortSelect = (value: string) => { if (onSortChange) { onSortChange(value); } setIsSortDropdownOpen(false); }; const containerClasses = position === 'fixed' ? `${fixedPosition} z-20 ${className}` : `flex items-center gap-2 ${className}`; return (
{/* Info Button */} {showInfo && onToggleInfo && ( )} {/* Search Button */} {showSearch && onToggleSearch && ( )} {/* Show Completed Toggle */} {showCompletedToggle && onToggleCompleted && (
{completedLabel || t('common.showCompleted', 'Show completed')}
)} {/* Sort/Filter Dropdown */} {showSort && sortOptions.length > 0 && onSortChange && (
{isSortDropdownOpen && (
{sortLabel || t('common.sortBy', 'Sort by')}
{sortOptions.map((option) => ( ))}
)}
)} {/* Custom Elements */} {customElements}
); }; export default ViewOptionsBar;