- Total Projects -
-- {stats.totalProjects} -
+ {/* Overview Stats - Enhanced 6 Cards */} ++ Total Projects +
++ {stats.totalProjects} +
++ {stats.activeProjects} active +
++ Contracts +
++ {stats.totalContracts} +
++ {stats.activeContracts} active +
++ Pending Tasks +
++ {stats.pendingTasks} +
+Awaiting start
++ In Progress +
++ {stats.inProgressTasks} +
+Active tasks
++ Completed +
++ {stats.completedTasks} +
+Tasks done
++ Overdue +
+0 ? "text-red-600" : "text-gray-900" + }`} + > + {stats.overdueTasks} +
++ {stats.overdueTasks > 0 ? "Need attention!" : "All on track"} +
+- Active Projects -
-- {stats.activeProjects} +
+ New Projects
+Added this week
- Pending Tasks +
+ New Tasks
-- {stats.pendingTasks} -
-Created this week
- Completed Tasks -
-- {stats.completedTasks} -
-No projects yet.
- - - -No upcoming deadlines
++ All projects on track! +
+- {project.city} • Due: {project.finish_date} -
+ {deadline.type} ++ {deadline.type === "project" + ? deadline.city + : deadline.customer}{" "} + • {deadline.date} +
+No projects yet.
+ + + ++ {project.city} +
++ Due: {project.finish_date} +
+ )} +No tasks yet.
+ + + +- Create a new project + {task.project_name} + +
+ {(() => { + try { + if (!task.date_added) return "No date"; + const taskDate = task.date_added.includes("T") + ? parseISO(task.date_added) + : new Date(task.date_added + "T00:00:00"); + + if (isNaN(taskDate.getTime())) + return "Invalid date"; + + return formatDistanceToNow(taskDate, { + addSuffix: true, + }); + } catch (error) { + return "Invalid date"; + } + })()}
- Add a new contract -
-Start a new project
+- Create task template -
-Add a new contract
+Create reusable template
+Monitor all tasks
+