Skip to content

Commit ee85d21

Browse files
Copilottyler-dane
andcommitted
Address code review: restore task.test.util.ts, simplify conditionals, enforce required DND data fields, remove docstring
Co-authored-by: tyler-dane <30163055+tyler-dane@users.noreply.github.com>
1 parent 5af5d6e commit ee85d21

7 files changed

Lines changed: 66 additions & 27 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { act } from "react";
2+
import { screen, waitFor } from "@testing-library/react";
3+
import userEvent from "@testing-library/user-event";
4+
5+
type User = ReturnType<typeof userEvent.setup>;
6+
7+
export const addTasks = async (user: User, taskTitles: string[]) => {
8+
for (const title of taskTitles) {
9+
// Wait for the add button to be available
10+
await clickCreateTaskButton(user);
11+
12+
// Wait for the input to appear
13+
const input = await waitFor(() =>
14+
screen.getByPlaceholderText("Enter task title..."),
15+
);
16+
17+
await act(async () => {
18+
await user.type(input, `${title}{Enter}`);
19+
});
20+
21+
// Wait for the task to be created and appear in the DOM
22+
await waitFor(
23+
() => {
24+
const elements = screen.getAllByDisplayValue(title);
25+
expect(elements.length).toBeGreaterThan(0);
26+
},
27+
{ timeout: 5000 },
28+
);
29+
}
30+
};
31+
32+
export const clickCreateTaskButton = async (user: User) => {
33+
const addButton = await waitFor(() =>
34+
screen.getByRole("button", { name: "Create new task" }),
35+
);
36+
await act(async () => {
37+
await user.click(addButton);
38+
});
39+
};
40+
41+
export const focusOnTaskCheckbox = async (user: User, title: string) => {
42+
const checkbox = await waitFor(() =>
43+
screen.getByRole("checkbox", { name: `Toggle ${title}` }),
44+
);
45+
await act(async () => {
46+
checkbox.focus();
47+
});
48+
};

packages/web/src/common/hooks/useEventDNDActions.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -181,29 +181,24 @@ export function useEventDNDActions() {
181181

182182
switch (switchCase) {
183183
case `day-task-to-${ID_GRID_MAIN}`:
184-
if (task && deleteTask) {
185-
convertTaskToEventOnAgenda(task, active, over, deleteTask, false);
186-
}
184+
if (!task || !deleteTask) break;
185+
convertTaskToEventOnAgenda(task, active, over, deleteTask, false);
187186
break;
188187
case `day-task-to-${ID_GRID_ALLDAY_ROW}`:
189-
if (task && deleteTask) {
190-
convertTaskToEventOnAgenda(task, active, over, deleteTask, true);
191-
}
188+
if (!task || !deleteTask) break;
189+
convertTaskToEventOnAgenda(task, active, over, deleteTask, true);
192190
break;
193191
case `day-${Categories_Event.ALLDAY}-to-${ID_GRID_MAIN}`:
194-
if (event) {
195-
moveAllDayToMainGridDayView(event, active, over);
196-
}
192+
if (!event) break;
193+
moveAllDayToMainGridDayView(event, active, over);
197194
break;
198195
case `day-${Categories_Event.TIMED}-to-${ID_GRID_MAIN}`:
199-
if (event) {
200-
moveTimedAroundMainGridDayView(event, active, over);
201-
}
196+
if (!event) break;
197+
moveTimedAroundMainGridDayView(event, active, over);
202198
break;
203199
case `day-${Categories_Event.TIMED}-to-${ID_GRID_ALLDAY_ROW}`:
204-
if (event) {
205-
moveTimedToAllDayGridDayView(event);
206-
}
200+
if (!event) break;
201+
moveTimedToAllDayGridDayView(event);
207202
break;
208203
}
209204
},

packages/web/src/components/DND/Draggable.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ export type DraggableDataType = Categories_Event | "task";
2424

2525
export interface DraggableDNDData {
2626
type: DraggableDataType;
27-
event?: Schema_GridEvent | null;
28-
task?: Task | null;
27+
event: Schema_GridEvent | null;
28+
task: Task | null;
2929
view: "day" | "week" | "now";
30-
deleteTask?: () => void;
30+
deleteTask: (() => void) | null;
3131
}
3232

3333
export interface DNDChildProps

packages/web/src/views/Day/components/Agenda/Events/AllDayAgendaEvent/DraggableAllDayAgendaEvent.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ export const DraggableAllDayAgendaEvent = memo(
5353
data: {
5454
event,
5555
type: Categories_Event.ALLDAY,
56+
task: null,
5657
view: "day",
58+
deleteTask: null,
5759
},
5860
disabled: isDisabled,
5961
}}

packages/web/src/views/Day/components/Agenda/Events/TimedAgendaEvent/DraggableTimedAgendaEvent.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ export const DraggableTimedAgendaEvent = memo(
9292
data: {
9393
event: event,
9494
type: Categories_Event.TIMED,
95+
task: null,
9596
view: "day",
97+
deleteTask: null,
9698
},
9799
disabled: isDisabled,
98100
}}

packages/web/src/views/Day/components/Task/DraggableTask.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export function DraggableTask({
4949
id: task.id,
5050
data: {
5151
type: "task",
52+
event: null,
5253
task,
5354
view: "day",
5455
deleteTask: () => deleteTask(task.id),

packages/web/src/views/Day/util/task/convertTaskToEvent.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@ import { Schema_Event_Core } from "@core/types/event.types";
44
import dayjs, { Dayjs } from "@core/util/date/dayjs";
55
import { Task } from "@web/common/types/task.types";
66

7-
/**
8-
* Converts a task to an event
9-
* @param task - The task to convert
10-
* @param startTime - The start time for the event (should be snapped to the grid)
11-
* @param durationMinutes - The duration of the event in minutes (default: 30)
12-
* @param userId - The user ID
13-
* @param isAllDay - Whether the event is an all-day event (default: false)
14-
* @returns A new event schema
15-
*/
167
export function convertTaskToEvent(
178
task: Task,
189
startTime: Dayjs,

0 commit comments

Comments
 (0)