diff --git a/src/pages/ProjectDetailPage.tsx b/src/pages/ProjectDetailPage.tsx index b0522ce..6cdaa12 100644 --- a/src/pages/ProjectDetailPage.tsx +++ b/src/pages/ProjectDetailPage.tsx @@ -11,6 +11,13 @@ export default function ProjectDetailPage() { const [members, setMembers] = useState([]) const [milestones, setMilestones] = useState([]) const [allProjects, setAllProjects] = useState([]) + const [showAddMember, setShowAddMember] = useState(false) + const [showAddMilestone, setShowAddMilestone] = useState(false) + const [newMemberUserId, setNewMemberUserId] = useState(1) + const [newMemberRole, setNewMemberRole] = useState('developer') + const [newMilestoneTitle, setNewMilestoneTitle] = useState('') + const [users, setUsers] = useState([]) + const [roles, setRoles] = useState([]) const [editing, setEditing] = useState(false) const [editForm, setEditForm] = useState({ owner: '', description: '', sub_projects: [] as string[], related_projects: [] as string[] }) @@ -27,6 +34,8 @@ export default function ProjectDetailPage() { api.get(`/projects/${id}/members`).then(({ data }) => setMembers(data)) api.get(`/milestones?project_id=${id}`).then(({ data }) => setMilestones(data)) api.get('/projects').then(({ data }) => setAllProjects(data)) + api.get('/users').then(r => setUsers(r.data)).catch(() => {}) + api.get('/roles').then(r => setRoles(r.data)).catch(() => {}) }, [id]) const handleMulti = (e: React.ChangeEvent, field: 'sub_projects' | 'related_projects') => { @@ -41,6 +50,21 @@ export default function ProjectDetailPage() { setEditing(false) } + const addMember = async () => { + if (!newMemberUserId) return + await api.post(`/projects/${id}/members`, { user_id: newMemberUserId, role: newMemberRole }) + setShowAddMember(false) + api.get(`/projects/${id}/members`).then(({ data }) => setMembers(data)) + } + + const addMilestone = async () => { + if (!newMilestoneTitle.trim()) return + await api.post(`/projects/${id}/milestones`, { title: newMilestoneTitle, status: 'open' }) + setShowAddMilestone(false) + setNewMilestoneTitle('') + api.get(`/projects/${id}/milestones`).then(({ data }) => setMilestones(data)).catch(() => {}) + } + const deleteProject = async () => { if (!confirm('Delete this project?')) return await api.delete(`/projects/${id}`) @@ -91,7 +115,7 @@ export default function ProjectDetailPage() {
-

Members ({members.length})

+

Members ({members.length})

{members.length > 0 ? (
{members.map((m) => ( @@ -104,7 +128,7 @@ export default function ProjectDetailPage() {
-

Milestones ({milestones.length})

+

Milestones ({milestones.length})

{milestones.map((ms) => (
navigate(`/milestones/${ms.id}`)}> {ms.status} @@ -114,6 +138,37 @@ export default function ProjectDetailPage() { ))} {milestones.length === 0 &&

No milestones

}
+ + {showAddMember && ( +
setShowAddMember(false)}> +
e.stopPropagation()}> +

Add Member

+ + +
+ + +
+
+
+ )} + + {showAddMilestone && ( +
setShowAddMilestone(false)}> +
e.stopPropagation()}> +

New Milestone

+ setNewMilestoneTitle(e.target.value)} placeholder="Milestone title" /> +
+ + +
+
+
+ )}
) }