Skip to content

Commit 2410e3c

Browse files
committed
tasks on gantt chart
1 parent dc69001 commit 2410e3c

22 files changed

Lines changed: 966 additions & 89 deletions

File tree

src/backend/src/controllers/tasks.controllers.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { validateWBS, WbsNumber } from 'shared';
55
export default class TasksController {
66
static async createTask(req: Request, res: Response, next: NextFunction) {
77
try {
8-
const { title, deadline, priority, status, assignees, notes } = req.body;
8+
const { title, deadline, startDate, priority, status, assignees, notes } = req.body;
99
const wbsNum: WbsNumber = validateWBS(req.params.wbsNum);
1010

1111
const task = await TasksService.createTask(
@@ -17,6 +17,7 @@ export default class TasksController {
1717
status,
1818
assignees,
1919
req.organization,
20+
startDate ? new Date(startDate) : undefined,
2021
deadline ? new Date(deadline) : undefined
2122
);
2223

@@ -28,7 +29,7 @@ export default class TasksController {
2829

2930
static async editTask(req: Request, res: Response, next: NextFunction) {
3031
try {
31-
const { title, notes, priority, deadline } = req.body;
32+
const { title, notes, priority, deadline, startDate } = req.body;
3233
const { taskId } = req.params;
3334

3435
const updateTask = await TasksService.editTask(
@@ -38,7 +39,8 @@ export default class TasksController {
3839
title,
3940
notes,
4041
priority,
41-
deadline
42+
startDate ? new Date(startDate) : undefined,
43+
deadline ? new Date(deadline) : undefined
4244
);
4345

4446
res.status(200).json(updateTask);
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "public"."Task" ADD COLUMN "startDate" TIMESTAMP(3);

src/backend/src/prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,7 @@ model Task {
630630
title String
631631
notes String
632632
deadline DateTime?
633+
startDate DateTime?
633634
assignees User[] @relation(name: "assignedTo")
634635
priority Task_Priority
635636
status Task_Status

src/backend/src/routes/tasks.routes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ tasksRouter.post(
99
'/:wbsNum',
1010
nonEmptyString(body('title')),
1111
isOptionalDate(body('deadline')),
12+
isOptionalDate(body('startDate')),
1213
body('notes').isString(),
1314
isTaskPriority(body('priority')),
1415
isTaskStatus(body('status')),
@@ -23,6 +24,7 @@ tasksRouter.post(
2324
nonEmptyString(body('title')),
2425
nonEmptyString(body('notes')),
2526
isOptionalDate(body('deadline')),
27+
isOptionalDate(body('startDate')),
2628
isTaskPriority(body('priority')),
2729
TasksController.editTask
2830
);

src/backend/src/services/tasks.services.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export default class TasksService {
4040
status: Task_Status,
4141
assignees: string[],
4242
organization: Organization,
43+
startDate?: Date,
4344
deadline?: Date
4445
): Promise<Task> {
4546
const requestedWbsElement = await prisma.wBS_Element.findUnique({
@@ -93,6 +94,7 @@ export default class TasksService {
9394
},
9495
title,
9596
notes,
97+
startDate,
9698
deadline,
9799
priority,
98100
status,
@@ -127,7 +129,8 @@ export default class TasksService {
127129
title: string,
128130
notes: string,
129131
priority: Task_Priority,
130-
deadline: Date
132+
startDate?: Date,
133+
deadline?: Date
131134
) {
132135
const hasPermission = await userHasPermission(user.userId, organizationId, notGuest);
133136
if (!hasPermission) throw new AccessDeniedException('Guests cannot edit tasks');
@@ -144,7 +147,7 @@ export default class TasksService {
144147

145148
const updatedTask = await prisma.task.update({
146149
where: { taskId },
147-
data: { title, notes, priority, deadline },
150+
data: { title, notes, priority, startDate, deadline },
148151
...getTaskQueryArgs(originalTask.wbsElement.organizationId)
149152
});
150153
return taskTransformer(updatedTask);

src/backend/src/transformers/tasks.transformer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const taskTransformer = (task: Prisma.TaskGetPayload<TaskQueryArgs>): Task => {
1313
title: task.title,
1414
notes: task.notes,
1515
deadline: task.deadline ?? undefined,
16+
startDate: task.startDate ?? undefined,
1617
priority: convertTaskPriority(task.priority),
1718
status: convertTaskStatus(task.status),
1819
createdBy: userTransformer(task.createdBy),

src/frontend/src/apis/tasks.api.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import { taskTransformer } from './transformers/tasks.transformers';
1212
* Api call to create a task.
1313
* @param wbsNum wbsNum of the wbsElement that the task is associated with
1414
* @param title the title of the task
15-
* @param deadline the datestring deadline of the task
1615
* @param priority the priority of the task
1716
* @param status the status of the task
1817
* @param assignees the ids of the users assigned to the task
18+
* @param notes the notes for the task
19+
* @param deadline the datestring deadline of the task
20+
* @param startDate the datestring start date of the task
1921
* @returns
2022
*/
2123
export const createSingleTask = (
@@ -25,13 +27,15 @@ export const createSingleTask = (
2527
status: TaskStatus,
2628
assignees: string[],
2729
notes: string,
28-
deadline?: string
30+
deadline?: string,
31+
startDate?: string
2932
) => {
3033
return axios.post<Task>(
3134
apiUrls.tasksCreate(wbsPipe(wbsNum)),
3235
{
3336
title,
3437
deadline,
38+
startDate,
3539
priority,
3640
status,
3741
assignees,
@@ -50,15 +54,23 @@ export const createSingleTask = (
5054
* @param notes the new notes
5155
* @param priority the new priority
5256
* @param deadline the new deadline
53-
* @param assignees the new assignees
57+
* @param startDate the new start date
5458
* @returns the edited task
5559
*/
56-
export const editTask = (taskId: string, title: string, notes: string, priority: TaskPriority, deadline?: Date) => {
60+
export const editTask = (
61+
taskId: string,
62+
title: string,
63+
notes: string,
64+
priority: TaskPriority,
65+
deadline?: Date,
66+
startDate?: Date
67+
) => {
5768
return axios.post<{ message: string }>(apiUrls.editTaskById(taskId), {
5869
title,
5970
notes,
6071
priority,
61-
deadline
72+
deadline,
73+
startDate
6274
});
6375
};
6476

src/frontend/src/apis/transformers/tasks.transformers.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const taskTransformer = (task: Task): Task => {
1111
...task,
1212
dateCreated: new Date(task.dateCreated),
1313
dateDeleted: task.dateDeleted ? new Date(task.dateDeleted) : undefined,
14-
deadline: task.deadline ? new Date(task.deadline) : undefined
14+
deadline: task.deadline ? new Date(task.deadline) : undefined,
15+
startDate: task.startDate ? new Date(task.startDate) : undefined
1516
};
1617
};

src/frontend/src/hooks/tasks.hooks.ts

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,46 @@ import { WbsNumber, TaskPriority, TaskStatus, Task } from 'shared';
88
import { createSingleTask, deleteSingleTask, editSingleTaskStatus, editTask, editTaskAssignees } from '../apis/tasks.api';
99

1010
export interface CreateTaskPayload {
11+
wbsNum: WbsNumber;
1112
title: string;
13+
startDate?: string;
1214
deadline?: string;
1315
priority: TaskPriority;
1416
status: TaskStatus;
1517
notes?: string;
1618
assignees: string[];
1719
}
1820

19-
export const useCreateTask = (wbsNum: WbsNumber) => {
20-
return useMutation<Task, Error, CreateTaskPayload>(['tasks'], async (createTaskPayload: CreateTaskPayload) => {
21-
const { data } = await createSingleTask(
22-
wbsNum,
23-
createTaskPayload.title,
24-
createTaskPayload.priority,
25-
createTaskPayload.status,
26-
createTaskPayload.assignees,
27-
createTaskPayload.notes ?? '',
28-
createTaskPayload.deadline
29-
);
30-
return data;
31-
});
21+
export const useCreateTask = () => {
22+
const queryClient = useQueryClient();
23+
return useMutation<Task, Error, CreateTaskPayload>(
24+
['tasks', 'create'],
25+
async (createTaskPayload: CreateTaskPayload) => {
26+
const { data } = await createSingleTask(
27+
createTaskPayload.wbsNum,
28+
createTaskPayload.title,
29+
createTaskPayload.priority,
30+
createTaskPayload.status,
31+
createTaskPayload.assignees,
32+
createTaskPayload.notes ?? '',
33+
createTaskPayload.deadline,
34+
createTaskPayload.startDate
35+
);
36+
return data;
37+
},
38+
{
39+
onSuccess: () => {
40+
queryClient.invalidateQueries(['projects']);
41+
}
42+
}
43+
);
3244
};
3345

3446
export interface TaskPayload {
3547
taskId: string;
3648
notes?: string;
3749
title: string;
50+
startDate?: Date;
3851
deadline?: Date;
3952
priority: TaskPriority;
4053
}
@@ -53,7 +66,8 @@ export const useEditTask = () => {
5366
taskPayload.title,
5467
taskPayload.notes ?? '',
5568
taskPayload.priority,
56-
taskPayload.deadline
69+
taskPayload.deadline,
70+
taskPayload.startDate
5771
);
5872

5973
return data;

0 commit comments

Comments
 (0)