import React, { useRef, useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; import { ArrowRightIcon, FolderIcon } from '@heroicons/react/24/outline'; import ProjectDropdown from '../../Shared/ProjectDropdown'; import { Project } from '../../../entities/Project'; import { Task } from '../../../entities/Task'; interface TaskProjectCardProps { task: Task; projects: Project[]; onProjectSelect: (project: Project) => Promise; onProjectClear: () => Promise; onProjectCreate: (name: string) => Promise; getProjectLink: (project: Project) => string; } const TaskProjectCard: React.FC = ({ task, projects, onProjectSelect, onProjectClear, onProjectCreate, getProjectLink, }) => { const { t } = useTranslation(); const [projectDropdownOpen, setProjectDropdownOpen] = useState(false); const [projectName, setProjectName] = useState(''); const [filteredProjects, setFilteredProjects] = useState([]); const [isCreatingProject, setIsCreatingProject] = useState(false); const projectDropdownRef = useRef(null); useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if ( projectDropdownOpen && projectDropdownRef.current && !projectDropdownRef.current.contains(e.target as Node) ) { setProjectDropdownOpen(false); setProjectName(''); } }; if (projectDropdownOpen) { document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); } }, [projectDropdownOpen]); const handleProjectSearch = (query: string) => { setProjectName(query); const filtered = projects.filter((p) => p.name.toLowerCase().includes(query.toLowerCase()) ); setFilteredProjects(filtered); }; const handleProjectSelection = async (project: Project) => { await onProjectSelect(project); setProjectDropdownOpen(false); setProjectName(''); }; const handleClearProject = async () => { await onProjectClear(); setProjectDropdownOpen(false); setProjectName(''); }; const handleCreateProjectInline = async (name: string) => { setIsCreatingProject(true); try { await onProjectCreate(name); setProjectDropdownOpen(false); setProjectName(''); } finally { setIsCreatingProject(false); } }; const handleShowAllProjects = () => { setFilteredProjects(projects); }; const containerClasses = [ 'rounded-lg', 'shadow-sm', 'bg-white', 'dark:bg-gray-900', 'transition-colors', ]; if (task.Project || projectDropdownOpen) { containerClasses.push( 'border-2', 'border-gray-50', 'dark:border-gray-800', 'hover:border-gray-200', 'dark:hover:border-gray-700' ); } return (
{projectDropdownOpen ? ( ) : task.Project ? (
setProjectDropdownOpen(true)} > {task.Project.image_url ? ( {task.Project.name} ) : (
)}
setProjectDropdownOpen(true)} > {task.Project.name}
e.stopPropagation()} className="p-1.5 rounded-full text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 hover:bg-blue-50 dark:hover:bg-blue-900/30 transition-colors flex-shrink-0" title={t( 'project.viewProject', 'Go to project' )} > {t( 'project.viewProject', 'Go to project' )}
) : (
setProjectDropdownOpen(true)} className="rounded-lg shadow-sm bg-white dark:bg-gray-900 p-6 cursor-pointer transition-colors" >
{t('task.noProject', 'Assign to a project')}
)}
); }; export default TaskProjectCard;