Skip to content
This repository was archived by the owner on Mar 21, 2026. It is now read-only.

Commit 24752c6

Browse files
authored
Merge pull request #11 from OS-Builders/dev
Dev
2 parents 21372ac + 872232a commit 24752c6

20 files changed

Lines changed: 804 additions & 89 deletions

server/controllers/boardsController.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,74 @@ const boardsController = {
124124
});
125125
}
126126
},
127+
getBoardFromId: async (req: Request, res: Response, next: NextFunction) => {
128+
try {
129+
// obtain the user document
130+
const board = await Board.findOne({ _id: req.params.boardId });
131+
res.locals.board = board;
132+
return next();
133+
} catch (err) {
134+
// pass error through to global error handler
135+
return next({
136+
log: `boardssController.getBoardFromId ERROR: ${err}`,
137+
status: 500,
138+
message: { err: "Error getting board" },
139+
});
140+
}
141+
},
142+
deleteBoard: async (req: Request, _res: Response, next: NextFunction) => {
143+
try {
144+
await Board.findOneAndDelete({
145+
_id: req.params.boardId,
146+
});
147+
console.log("board deleted");
148+
return next();
149+
} catch (err) {
150+
// pass error through to global error handler
151+
return next({
152+
log: `tasksController.deleteBoard ERROR: ${err}`,
153+
status: 500,
154+
message: { err: "Error deleting board" },
155+
});
156+
}
157+
},
158+
editBoard: async (req: Request, res: Response, next: NextFunction) => {
159+
try {
160+
const editedBoard = await Board.findByIdAndUpdate(
161+
req.body.id,
162+
{
163+
name: req.body.name,
164+
},
165+
{ new: true }
166+
);
167+
console.log("editedBoard: ", editedBoard);
168+
res.locals.board = editedBoard;
169+
return next();
170+
} catch (err) {
171+
// pass error through to global error handler
172+
return next({
173+
log: `tasksController.editBoard ERROR: ${err}`,
174+
status: 500,
175+
message: { err: "Error editing Board" },
176+
});
177+
}
178+
},
179+
pullBoard: async (req: Request, res: Response, next: NextFunction) => {
180+
try {
181+
await User.updateOne(
182+
{ _id: res.locals.board.boardOwner },
183+
{ $pull: { boards: req.params.boardId } }
184+
);
185+
return next();
186+
} catch (err) {
187+
// pass error through to global error handler
188+
return next({
189+
log: `tasksController.pullTask ERROR: ${err}`,
190+
status: 500,
191+
message: { err: "Error pulling Task" },
192+
});
193+
}
194+
},
127195
};
128196

129197
export default boardsController;

server/controllers/tasksController.ts

Lines changed: 97 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const tasksController = {
1010
status: req.body.status,
1111
notes: req.body.tasknotes,
1212
});
13-
res.locals.createdTask = createdTask;
13+
res.locals.task = createdTask;
1414

1515
return next();
1616
} catch (err) {
@@ -27,18 +27,18 @@ const tasksController = {
2727
const column = req.body.status;
2828
let updateQuery;
2929
if (column === "backlog") {
30-
updateQuery = { $push: { backlog: res.locals.createdTask._id } };
30+
updateQuery = { $push: { backlog: res.locals.task._id } };
3131
} else if (column === "inProgress") {
3232
updateQuery = {
33-
$push: { inProgress: res.locals.createdTask._id },
33+
$push: { inProgress: res.locals.task._id },
3434
};
3535
} else if (column === "inReview") {
3636
updateQuery = {
37-
$push: { inReview: res.locals.createdTask._id },
37+
$push: { inReview: res.locals.task._id },
3838
};
3939
} else {
4040
updateQuery = {
41-
$push: { completed: res.locals.createdTask._id },
41+
$push: { completed: res.locals.task._id },
4242
};
4343
}
4444
await Board.updateOne({ _id: req.body.boardId }, updateQuery);
@@ -69,6 +69,98 @@ const tasksController = {
6969
});
7070
}
7171
},
72+
editTask: async (req: Request, res: Response, next: NextFunction) => {
73+
try {
74+
const taskEdits = req.body;
75+
const editedTask = await Card.findByIdAndUpdate(
76+
taskEdits.taskId,
77+
{
78+
name: taskEdits.taskname,
79+
status: taskEdits.status,
80+
notes: taskEdits.tasknotes,
81+
},
82+
{ new: true }
83+
);
84+
res.locals.task = editedTask;
85+
86+
return next();
87+
} catch (err) {
88+
// pass error through to global error handler
89+
return next({
90+
log: `tasksController.editTask ERROR: ${err}`,
91+
status: 500,
92+
message: { err: "Error editing Task" },
93+
});
94+
}
95+
},
96+
pullTask: async (req: Request, res: Response, next: NextFunction) => {
97+
try {
98+
const column = req.body.startColumn;
99+
let updateQuery;
100+
if (column === "backlog") {
101+
updateQuery = { $pull: { backlog: res.locals.task._id } };
102+
} else if (column === "inProgress") {
103+
updateQuery = {
104+
$pull: { inProgress: res.locals.task._id },
105+
};
106+
} else if (column === "inReview") {
107+
updateQuery = {
108+
$pull: { inReview: res.locals.task._id },
109+
};
110+
} else {
111+
updateQuery = {
112+
$pull: { completed: res.locals.task._id },
113+
};
114+
}
115+
await Board.updateOne({ _id: req.body.boardId }, updateQuery);
116+
return next();
117+
} catch (err) {
118+
// pass error through to global error handler
119+
return next({
120+
log: `tasksController.pullTask ERROR: ${err}`,
121+
status: 500,
122+
message: { err: "Error pulling Task" },
123+
});
124+
}
125+
},
126+
deleteTask: async (req: Request, res: Response, next: NextFunction) => {
127+
try {
128+
const deletedTask = await Card.findOneAndDelete({
129+
_id: req.params.taskId,
130+
});
131+
res.locals.task = deletedTask;
132+
return next();
133+
} catch (err) {
134+
// pass error through to global error handler
135+
return next({
136+
log: `tasksController.deleteTask ERROR: ${err}`,
137+
status: 500,
138+
message: { err: "Error deleting Task" },
139+
});
140+
}
141+
},
142+
clearTask: async (_req: Request, res: Response, next: NextFunction) => {
143+
try {
144+
await Card.deleteMany({
145+
_id: {
146+
$in: [
147+
...res.locals.board.backlog,
148+
...res.locals.board.inProgress,
149+
...res.locals.board.inReview,
150+
...res.locals.board.completed,
151+
],
152+
},
153+
});
154+
return next();
155+
} catch (err) {
156+
// pass error through to global error handler
157+
return next({
158+
log: `tasksController.clearTask ERROR: ${err}`,
159+
status: 500,
160+
message: { err: "Error clearing Tasks" },
161+
});
162+
}
163+
},
72164
};
73165

74166
export default tasksController;

server/routes/boardsRouter.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,25 @@ router.post(
3636
}
3737
);
3838

39+
// route for deleting a boardd
40+
router.delete(
41+
"/delete/:boardId",
42+
boardsController.getBoardFromId,
43+
tasksController.clearTask,
44+
boardsController.deleteBoard,
45+
boardsController.pullBoard,
46+
(_req: Request, res: Response) => {
47+
return res.status(200).json();
48+
}
49+
);
50+
51+
// route for editing a board
52+
router.put(
53+
"/edit",
54+
boardsController.editBoard,
55+
(_req: Request, res: Response) => {
56+
return res.status(200).json(res.locals.board);
57+
}
58+
);
59+
3960
export default router;

server/routes/tasksRouter.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,28 @@ router.post(
1313
tasksController.createTask,
1414
tasksController.assignTask,
1515
(_req: Request, res: Response) => {
16-
return res.status(200).json(res.locals.createdTask);
16+
return res.status(200).json(res.locals.task);
17+
}
18+
);
19+
20+
// route for editing a task card
21+
router.post(
22+
"/edit",
23+
tasksController.editTask,
24+
tasksController.pullTask,
25+
tasksController.assignTask,
26+
(_req: Request, res: Response) => {
27+
return res.status(200).json(res.locals.task);
28+
}
29+
);
30+
31+
// route for deleting a task card
32+
router.delete(
33+
"/delete/:taskId",
34+
tasksController.deleteTask,
35+
tasksController.pullTask,
36+
(_req: Request, res: Response) => {
37+
return res.status(200).json();
1738
}
1839
);
1940

Lines changed: 19 additions & 0 deletions
Loading

src/components/Card.tsx

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,34 @@
11
import { useState } from "react";
22
import { CardProps } from "../types";
33
import notesSvg from "../assets/note-text-svgrepo-com.svg";
4+
import editSvg from "../assets/edit-cover-1481-svgrepo-com.svg";
45
import "../scss/taskCard.scss";
56

6-
const Card = ({ info }: CardProps) => {
7+
const Card = ({ info, setEditingTask }: CardProps) => {
78
const [showNotes, setShowNotes] = useState<boolean>(false);
89
return (
910
<div className="task-card">
1011
<h3 className="task-name">{info.name}</h3>
1112
{showNotes ? <p className="task-notes">{info.notes}</p> : null}
12-
<button
13-
className="toggle-notes-btn"
14-
onClick={() => {
15-
setShowNotes(!showNotes);
16-
}}
17-
>
18-
<img src={notesSvg} alt="Notes SVG" className="notes-svg" />
19-
</button>
13+
<div className="task-btns-container">
14+
<button
15+
className="task-btn"
16+
id={info._id}
17+
onClick={() => {
18+
setEditingTask(info);
19+
}}
20+
>
21+
<img src={editSvg} alt="Edit SVG" className="task-svg" />
22+
</button>
23+
<button
24+
className="task-btn"
25+
onClick={() => {
26+
setShowNotes(!showNotes);
27+
}}
28+
>
29+
<img src={notesSvg} alt="Notes SVG" className="task-svg" />
30+
</button>
31+
</div>
2032
</div>
2133
);
2234
};

src/components/Column.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { useEffect, useState, ReactNode } from "react";
22
import { ColumnProps, TaskState } from "../types";
33
import NewTaskModal from "./NewTaskModal";
44
import Card from "./Card.tsx";
5+
import EditTaskModal from "./EditTaskModal.tsx";
56

67
const Column = ({
78
name,
89
create,
9-
user,
1010
currentBoard,
1111
boardState,
1212
setBoardState,
@@ -20,6 +20,9 @@ const Column = ({
2020
// state for storing task card components
2121
const [taskCards, setTaskCards] = useState<ReactNode[]>([]);
2222

23+
// state for editing a task card
24+
const [editingTask, setEditingTask] = useState<TaskState | null>(null);
25+
2326
// render new task modal on button click
2427
const handleNewTask = () => {
2528
setAddingTask(true);
@@ -32,13 +35,13 @@ const Column = ({
3235
setNumTasks(column.length);
3336
// map column to an array of task card components and then set as the state
3437
const cardsArray = column.map((task: TaskState) => {
35-
return <Card info={task} key={task._id} />;
38+
return (
39+
<Card info={task} setEditingTask={setEditingTask} key={task._id} />
40+
);
3641
});
3742
setTaskCards(cardsArray);
3843
}, [boardState, name]);
3944

40-
//effect for updating state as boardState changes, only update if need by comparing numTasks to column.length
41-
4245
return (
4346
<div className="column">
4447
<h2 className="column-title">
@@ -61,12 +64,19 @@ const Column = ({
6164
{addingTask ? (
6265
<NewTaskModal
6366
setAddingTask={setAddingTask}
64-
user={user}
6567
currentBoard={currentBoard}
66-
setTaskCards={setTaskCards}
6768
setBoardState={setBoardState}
6869
/>
6970
) : null}
71+
{editingTask ? (
72+
<EditTaskModal
73+
setEditingTask={setEditingTask}
74+
currentBoard={currentBoard}
75+
task={editingTask}
76+
setBoardState={setBoardState}
77+
startColumn={name}
78+
/>
79+
) : null}
7080
</div>
7181
);
7282
};

0 commit comments

Comments
 (0)