+ {/* Title */}
+
+ handleChange('title', e.target.value)}
+ autoFocus
+ required
+ className="w-full border-0 shadow-none p-0 text-base font-medium placeholder-gray-400 focus:ring-0 bg-transparent"
/>
- {/* Assignee */}
-
-
-
+ {/* Description */}
+
+
-
- {/* Actions */}
-
-
-
-
+ {/* Metadata Section */}
+
+
+ {/* Priority */}
+
+
+
+
+
+
+
+
+ {/* Due Date */}
+
+
+
+
+ handleChange('dueDate', e.target.value)}
+ className="w-full text-xs border border-gray-200 rounded-md py-1 px-2 focus:ring-1 focus:ring-blue-500 focus:border-blue-500 text-gray-700"
+ />
+
+
+
+ {/* Assignee */}
+
+
+
+
+
+
+
+
-
- Press Enter to save
+ {/* Actions */}
+
+
+
+
+
+
+
+ Press Enter to save
+
-
-
+
+
);
};
diff --git a/client/src/pages/Projects.jsx b/client/src/pages/Projects.jsx
index b0994d8..7ea8a57 100644
--- a/client/src/pages/Projects.jsx
+++ b/client/src/pages/Projects.jsx
@@ -3,6 +3,7 @@ import { Link } from 'react-router-dom';
import { projectService } from '../services/projectService';
import Layout from '../components/layout/Layout';
import ProjectModal from '../components/projects/ProjectModal';
+import ConfirmDialog from '../components/common/ConfirmDialog';
import toast from 'react-hot-toast';
import {
Plus,
@@ -30,6 +31,8 @@ const Projects = () => {
const [viewMode, setViewMode] = useState('grid'); // 'grid' or 'list'
const [showProjectModal, setShowProjectModal] = useState(false);
const [selectedProject, setSelectedProject] = useState(null);
+ const [showConfirmDialog, setShowConfirmDialog] = useState(false);
+ const [projectToDelete, setProjectToDelete] = useState(null);
useEffect(() => {
fetchProjects();
@@ -82,20 +85,32 @@ const Projects = () => {
}
};
- const handleDeleteProject = async (projectId) => {
- if (!window.confirm('Are you sure you want to delete this project?')) {
- return;
- }
+ const handleDeleteProject = (projectId) => {
+ const project = projects.find(p => p._id === projectId);
+ setProjectToDelete(project);
+ setShowConfirmDialog(true);
+ };
+
+ const confirmDeleteProject = async () => {
+ if (!projectToDelete) return;
try {
- await projectService.deleteProject(projectId);
- setProjects(prev => prev.filter(p => p._id !== projectId));
+ await projectService.deleteProject(projectToDelete._id);
+ setProjects(prev => prev.filter(p => p._id !== projectToDelete._id));
toast.success('Project deleted successfully');
} catch (error) {
toast.error(error.response?.data?.message || 'Failed to delete project');
+ } finally {
+ setShowConfirmDialog(false);
+ setProjectToDelete(null);
}
};
+ const cancelDeleteProject = () => {
+ setShowConfirmDialog(false);
+ setProjectToDelete(null);
+ };
+
const filterProjects = () => {
let filtered = [...projects];
@@ -459,6 +474,17 @@ const Projects = () => {
project={selectedProject}
onSave={handleSaveProject}
/>
+
+ {/* Delete Confirmation Dialog */}
+
);
};