feat: add "My Tasks" widget to home page#324
Conversation
- Implemented AssignedTasksList component to fetch and display tasks assigned to the current user across all projects. - Added translations for "My Tasks" section in multiple languages. - Updated interaction API to support fetching assigned tasks with pagination. - Enhanced task repository and service layers to handle assigned tasks retrieval. - Integrated the new widget into the home page layout, displaying a loading state and handling empty task scenarios. - Added tests for the new functionality, ensuring proper member ID resolution and task retrieval.
There was a problem hiding this comment.
ℹ️ No critical issues — one minor suggestion inline.
Reviewed changes — PR adds a cross-project "My Tasks" widget to the home page. A new ListAssignedToMe handler resolves the current user's per-project member IDs concurrently via errgroup, then queries open assigned tasks across all projects with importance-based keyset pagination. The frontend AssignedTasksList component groups results by project and renders them through the existing ListGroup/TaskRow infrastructure.
- New
GET /users/me/tasksendpoint —TaskHandler.ListAssignedToMeauthenticates, resolves per-project member IDs in parallel, and delegates to the repository'sListAssignedTasks - Postgres
ListAssignedTasksquery — filters non-deleted, non-done tasks assigned to the resolved member IDs, sorted by importance descending thencreated_atascending AssignedTasksListcomponent — fetches viauseInfiniteQuery, groups byproject_id, renders each project with the sharedListGroupcomponent and the same visible field set as the project list view- i18n — "My Tasks" section header and empty state translated across 9 languages
- Route loader — prefetches first page via
ensureInfiniteQueryData
DeepSeek Pro (free via Pullfrog for OSS) (Kimi K2 not used — the program covers this model; add its provider key to run your pick) | 𝕏
There was a problem hiding this comment.
ℹ️ No new issues in the incremental commits. One prior review thread remains open and is not addressed by these changes.
Reviewed changes — second commit adds test coverage and two defensive fixes. The frontend AssignedTasksList gets unit tests for grouping, navigation, and pagination; the endpoint gets e2e tests for cross-project aggregation and cursor pagination. The ListMembers fan-out is now capped at 20 concurrent lookups, and the service default limit is tightened from 20 to 10 to match the handler default.
- Frontend unit tests for
AssignedTasksList— covers empty state, task grouping by project with navigation wiring, and "Load more" pagination exhausted g.SetLimit(20)on errgroup — caps concurrent per-projectListMemberslookups so a user in many projects can't fire unbounded goroutines- Service default limit 20→10 — aligns
ListAssignedTasks's fallback with the handler'sparsePageSizedefault - E2E tests for
GET /users/me/tasks— verifies cross-project task aggregation (excludes done-status tasks and tasks assigned to others) and cursor pagination (no duplicates, no gaps) - E2E env wiring — passes
WithTaskAssignedProjectService(projectService)so the new endpoint is exercised
DeepSeek Pro (free via Pullfrog for OSS) (Kimi K2 not used — the program covers this model; add its provider key to run your pick) | 𝕏
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — this incremental commit adds error handling to the AssignedTasksList widget, addressing the prior review's open thread.
- Error state for failed fetches —
isErrorfromuseInfiniteQuerynow renders a destructive-styled banner with anAlertCircleicon and thehome.myTasks.loadErrorstring, preventing failed queries from silently showing the "all caught up" empty state loadErrori18n key — added to all 10 supported locale files with translated error messages- Error state test — verifies the error UI renders and the empty state / task groups do not when the fetch rejects
DeepSeek Pro (free via Pullfrog for OSS) (Kimi K2 not used — the program covers this model; add its provider key to run your pick) | 𝕏

Summary
Adds a "My Tasks" widget to the home page that shows open tasks assigned to the current user across every project they belong to.
Backend
GET /users/me/tasks(task_handler.goListAssignedToMe): resolves the caller's projects viaListAccessible, then their per-projectproject_members.idviaListMembers(task assignment is stored by member ID, not user ID), and queries assigned tasks across all of them.TaskRepository.ListAssignedTasks/TaskService.ListAssignedTasks: returns open (non-done-category) tasks assigned to any of a set of member IDs, ordered by importance (desc) then created_at (asc), keyset-paginated with the same opaque cursor format used byListTasks.page_sizedefaults to 10, capped at 100 (parsePageSize)./users/me/tasks, guarded bydeps.Task != nil; handler responds with an empty list if no project service is wired viaWithTaskAssignedProjectService.TaskRepository/TaskServiceinterfaces.Frontend
AssignedTasksListcomponent (assigned-tasks-list.tsx): fetches assigned tasks via an infinite query, groups them by project, and renders each group with the existingListGroup/task-row components so it looks like a filtered slice of the project task list rather than a bespoke summary. Handles loading (skeleton), empty ("you're all caught up"), and "load more" pagination states.listAssignedTasks/assignedTasksQueryOptionsadded to interaction-api.ts, backed byuseInfiniteQuerywith norefetchInterval(home page isn't a live board).home.myTasks.*translation strings (title, subtitle, empty state, load more/loading) to all 10 supported locales.Testing
sprint,task, and integration test packages to keep interfaces satisfied.AssignedTasksListitself.