Summary
DailyForge's conflict detection prevents overlapping tasks on the same day — a core feature highlighted in the README. However, when a conflict is detected, the user receives no actionable information about which existing task is causing the conflict or what time slot is already occupied. This makes the feature feel like a black box and forces users to manually scan the grid to identify the problematic placement.
Problem
- When a task is dropped onto a conflicting time slot, the user sees a generic rejection (the task snaps back), but receives no toast, modal, or inline message identifying the conflict.
- The user does not know: which existing task occupies that slot, what time range is blocked, or which days are available for the dropped task.
- This is particularly problematic for tasks with long durations (e.g., a 3-hour task) where the overlap range is non-obvious from the grid.
Steps to Reproduce
- Create two tasks with overlapping durations.
- Drag the second task to the same day/time as the first task.
- Observe: the task is rejected without any user-facing explanation.
Impact
- New users may assume the drag-and-drop is broken rather than understanding that overlap protection is active.
- The silent rejection is especially confusing on mobile, where the drop zone is smaller and visual feedback is harder to perceive.
- This gap undermines one of the project's core selling points: "Automatically detects and prevents scheduling conflicts."
Proposed Solution
I would like to improve the conflict feedback mechanism as follows:
-
Toast Notification with Conflict Detail: When a drop is rejected, display a toast (using the existing UI pattern in the codebase) with a message such as: "Conflict with '[Task Name]' already scheduled at [Start Time]–[End Time] on [Day]." This requires passing the conflicting task's metadata back from the conflict detection function.
-
Visual Highlight of Conflicting Slot: Briefly highlight the existing conflicting task card with a pulsing red border (CSS @keyframes animation) for 2 seconds after the rejected drop, drawing the user's eye to the conflict source.
-
Suggested Free Slots (stretch goal): Display up to 2 available time slots on the same day where the dropped task would fit, making it easier to reschedule without leaving the drag context.
Tech scope: Frontend only. The conflict detection logic in the Routine Builder component will need to be refactored to return the conflicting task object in addition to a boolean flag.
I would be happy to take this on. Could you assign this issue to me?
Summary
DailyForge's conflict detection prevents overlapping tasks on the same day — a core feature highlighted in the README. However, when a conflict is detected, the user receives no actionable information about which existing task is causing the conflict or what time slot is already occupied. This makes the feature feel like a black box and forces users to manually scan the grid to identify the problematic placement.
Problem
Steps to Reproduce
Impact
Proposed Solution
I would like to improve the conflict feedback mechanism as follows:
Toast Notification with Conflict Detail: When a drop is rejected, display a toast (using the existing UI pattern in the codebase) with a message such as:
"Conflict with '[Task Name]' already scheduled at [Start Time]–[End Time] on [Day]."This requires passing the conflicting task's metadata back from the conflict detection function.Visual Highlight of Conflicting Slot: Briefly highlight the existing conflicting task card with a pulsing red border (CSS
@keyframesanimation) for 2 seconds after the rejected drop, drawing the user's eye to the conflict source.Suggested Free Slots (stretch goal): Display up to 2 available time slots on the same day where the dropped task would fit, making it easier to reschedule without leaving the drag context.
Tech scope: Frontend only. The conflict detection logic in the Routine Builder component will need to be refactored to return the conflicting task object in addition to a boolean flag.
I would be happy to take this on. Could you assign this issue to me?