()
| 6 | import CreateProjectDialog from "./CreateProjectDialog"; |
| 7 | |
| 8 | const ProjectOverview = () => { |
| 9 | const statusColors = { |
| 10 | PLANNING: "bg-zinc-200 text-zinc-800 dark:bg-zinc-600 dark:text-zinc-200", |
| 11 | ACTIVE: "bg-emerald-200 text-emerald-800 dark:bg-emerald-500 dark:text-emerald-900", |
| 12 | ON_HOLD: "bg-amber-200 text-amber-800 dark:bg-amber-500 dark:text-amber-900", |
| 13 | COMPLETED: "bg-blue-200 text-blue-800 dark:bg-blue-500 dark:text-blue-900", |
| 14 | CANCELLED: "bg-red-200 text-red-800 dark:bg-red-500 dark:text-red-900" |
| 15 | }; |
| 16 | |
| 17 | const priorityColors = { |
| 18 | LOW: "border-zinc-300 text-zinc-600 dark:border-zinc-600 dark:text-zinc-400", |
| 19 | MEDIUM: "border-amber-300 text-amber-700 dark:border-amber-500 dark:text-amber-400", |
| 20 | HIGH: "border-green-300 text-green-700 dark:border-green-500 dark:text-green-400", |
| 21 | }; |
| 22 | |
| 23 | const currentWorkspace = useSelector((state) => state?.workspace?.currentWorkspace || null); |
| 24 | const [isDialogOpen, setIsDialogOpen] = useState(false); |
| 25 | const [projects, setProjects] = useState([]); |
| 26 | |
| 27 | useEffect(() => { |
| 28 | setProjects(currentWorkspace?.projects || []); |
| 29 | }, [currentWorkspace]); |
| 30 | |
| 31 | return currentWorkspace && ( |
| 32 | <div className="bg-white dark:bg-zinc-950 dark:bg-gradient-to-br dark:from-zinc-800/70 dark:to-zinc-900/50 border border-zinc-200 dark:border-zinc-800 hover:border-zinc-300 dark:hover:border-zinc-700 transition-all duration-200 rounded-lg overflow-hidden"> |
| 33 | <div className="border-b border-zinc-200 dark:border-zinc-800 p-4 flex items-center justify-between"> |
| 34 | <h2 className="text-md text-zinc-800 dark:text-zinc-300">Project Overview</h2> |
| 35 | <Link to={'/projects'} className="text-sm text-zinc-600 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300 flex items-center"> |
| 36 | View all <ArrowRight className="w-4 h-4 ml-2" /> |
| 37 | </Link> |
| 38 | </div> |
| 39 | |
| 40 | <div className="p-0"> |
| 41 | {projects.length === 0 ? ( |
| 42 | <div className="p-12 text-center"> |
| 43 | <div className="w-16 h-16 mx-auto mb-4 bg-zinc-200 text-zinc-600 dark:bg-zinc-800 dark:text-zinc-500 rounded-full flex items-center justify-center"> |
| 44 | <FolderOpen size={32} /> |
| 45 | </div> |
| 46 | <p className="text-zinc-600 dark:text-zinc-400">No projects yet</p> |
| 47 | <button onClick={() => setIsDialogOpen(true)} className="mt-4 px-4 py-2 text-sm bg-gradient-to-br from-blue-500 to-blue-600 text-white dark:text-zinc-200 rounded hover:opacity-90 transition"> |
| 48 | Create your First Project |
| 49 | </button> |
| 50 | <CreateProjectDialog isDialogOpen={isDialogOpen} setIsDialogOpen={setIsDialogOpen} /> |
| 51 | </div> |
| 52 | ) : ( |
| 53 | <div className="divide-y divide-zinc-200 dark:divide-zinc-800"> |
| 54 | {projects.slice(0, 5).map((project) => ( |
| 55 | <Link key={project.id} to={`/projectsDetail?id=${project.id}&tab=tasks`} className="block p-6 hover:bg-zinc-50 dark:hover:bg-zinc-900/50 transition-colors"> |
| 56 | <div className="flex items-start justify-between mb-3"> |
| 57 | <div className="flex-1"> |
| 58 | <h3 className="font-semibold text-zinc-800 dark:text-zinc-300 mb-1"> |
| 59 | {project.name} |
| 60 | </h3> |
| 61 | <p className="text-sm text-zinc-600 dark:text-zinc-400 line-clamp-2"> |
| 62 | {project.description || 'No description'} |
| 63 | </p> |
| 64 | </div> |
| 65 | <div className="flex items-center gap-2 ml-4"> |
nothing calls this directly
no outgoing calls
no test coverage detected