diff --git a/backend/routers/tasks.py b/backend/routers/tasks.py index 84e94cc..42ee6df 100644 --- a/backend/routers/tasks.py +++ b/backend/routers/tasks.py @@ -19,7 +19,7 @@ from schemas.task import ( TaskCreate, TaskUpdate, TaskResponse, TaskListResponse, TaskStatusUpdate, TaskAssignment, ProductionNoteCreate, ProductionNoteUpdate, ProductionNoteResponse, TaskAttachmentCreate, TaskAttachmentResponse, - SubmissionCreate, SubmissionUpdate, SubmissionResponse, + SubmissionCreate, SubmissionUpdate, SubmissionResponse, SubmissionDateInfo, BulkStatusUpdate, BulkAssignment, BulkActionResult ) from utils.auth import get_current_user_from_token, _get_user_from_db, require_role, require_permission, user_has_permission @@ -682,6 +682,26 @@ async def bulk_assign_tasks( ) +@router.get("/submission-dates", response_model=List[SubmissionDateInfo]) +async def get_submission_dates( + project_id: int = Query(..., description="Project ID to fetch submission dates for"), + db: Session = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """ + Get a lightweight list of (task_id, submitted_at) for every non-deleted + submission on a project's tasks, for rendering submission markers (e.g. + on the Schedule Gantt chart) without fetching full submission payloads. + """ + submissions = db.query(Submission.task_id, Submission.submitted_at).join(Task).filter( + Task.project_id == project_id, + Task.deleted_at.is_(None), + Submission.deleted_at.is_(None) + ).all() + + return [SubmissionDateInfo(task_id=task_id, submitted_at=submitted_at) for task_id, submitted_at in submissions] + + @router.get("/{task_id}", response_model=TaskResponse) async def get_task( task_id: int, diff --git a/backend/schemas/task.py b/backend/schemas/task.py index b823e8e..54bab00 100644 --- a/backend/schemas/task.py +++ b/backend/schemas/task.py @@ -195,6 +195,15 @@ class SubmissionResponse(SubmissionBase): from_attributes = True +class SubmissionDateInfo(BaseModel): + """Minimal per-task submission date, for lightweight bulk lookups (e.g. Gantt markers).""" + task_id: int + submitted_at: datetime + + class Config: + from_attributes = True + + # Review schemas class ReviewBase(BaseModel): decision: ReviewDecision diff --git a/frontend/src/components/schedule/ScheduleGantt.vue b/frontend/src/components/schedule/ScheduleGantt.vue index 68c98f7..5b13e22 100644 --- a/frontend/src/components/schedule/ScheduleGantt.vue +++ b/frontend/src/components/schedule/ScheduleGantt.vue @@ -67,129 +67,180 @@