From 119d896a5971a73564f216a475a74f471ec4cb11 Mon Sep 17 00:00:00 2001 From: Gabriel Santana de Menezes Date: Wed, 20 May 2026 15:51:40 -0400 Subject: [PATCH] feat: add "Mostrar apenas as minhas" checkbox to task filters Adds a pre-checked checkbox next to the employee filter that automatically filters tasks to the logged-in user on page load. Unchecking restores the free-select dropdown behavior. Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/components/TaskFilterBar.tsx | 19 ++++++++++- frontend/src/pages/TaskBoardPage.tsx | 41 +++++++++++++++++++---- frontend/src/pages/TaskListPage.tsx | 35 ++++++++++++++----- 3 files changed, 79 insertions(+), 16 deletions(-) diff --git a/frontend/src/components/TaskFilterBar.tsx b/frontend/src/components/TaskFilterBar.tsx index 7684be2..e02ab44 100644 --- a/frontend/src/components/TaskFilterBar.tsx +++ b/frontend/src/components/TaskFilterBar.tsx @@ -22,6 +22,7 @@ interface TaskFilterBarProps { projects: Project[] categories: Category[] assignees: TaskAssignee[] + currentUserId?: number isLoading?: boolean onRefresh?: () => void } @@ -32,6 +33,7 @@ export function TaskFilterBar({ projects, categories, assignees, + currentUserId, isLoading, onRefresh, }: TaskFilterBarProps) { @@ -98,7 +100,22 @@ export function TaskFilterBar({ {assignees.length > 0 && ( -
+
+ {currentUserId !== undefined && ( + + )} ([]) const [assignees, setAssignees] = useState([]) const [filters, setFilters] = useState(DEFAULT_TASK_FILTERS) + const [currentUserAssigneeId, setCurrentUserAssigneeId] = useState(null) const navigate = useNavigate() const { activeOrg, user } = useAuth() const debounceRef = useRef | null>(null) @@ -95,12 +97,38 @@ export function TaskBoardPage() { useEffect(() => { if (!activeOrg) return - setFilters(DEFAULT_TASK_FILTERS) - setProjects([]) - setAssignees([]) - setCategories([]) - void loadTasks(DEFAULT_TASK_FILTERS) - categoryService.listByOrganization(activeOrg.id).then(setCategories).catch(() => {}) + + const init = async () => { + setFilters(DEFAULT_TASK_FILTERS) + setProjects([]) + setAssignees([]) + setCategories([]) + + const [members] = await Promise.all([ + organizationService.listMembers(activeOrg.id), + categoryService.listByOrganization(activeOrg.id).then(setCategories).catch(() => {}), + ]) + + const assigneesData = members.map((m) => ({ + id: m.userId, + name: m.userName, + email: m.userEmail, + photo: m.userPhoto ?? null, + })) + setAssignees(assigneesData) + + const currentMember = members.find((m) => m.userEmail === user?.email) + const userId = currentMember?.userId ?? null + setCurrentUserAssigneeId(userId) + + const initialFilters = userId + ? { ...DEFAULT_TASK_FILTERS, userIds: [userId] } + : DEFAULT_TASK_FILTERS + setFilters(initialFilters) + void loadTasks(initialFilters) + } + + void init() }, [activeOrg]) const handleFiltersChange = (newFilters: TaskFilters) => { @@ -182,6 +210,7 @@ export function TaskBoardPage() { projects={projects} categories={categories} assignees={assignees} + currentUserId={currentUserAssigneeId ?? undefined} isLoading={isLoading} onRefresh={() => void loadTasks(filters)} /> diff --git a/frontend/src/pages/TaskListPage.tsx b/frontend/src/pages/TaskListPage.tsx index c50c812..177b58d 100644 --- a/frontend/src/pages/TaskListPage.tsx +++ b/frontend/src/pages/TaskListPage.tsx @@ -94,6 +94,7 @@ export function TaskListPage() { const [categories, setCategories] = useState([]) const [assignees, setAssignees] = useState([]) const [filters, setFilters] = useState(DEFAULT_TASK_FILTERS) + const [currentUserAssigneeId, setCurrentUserAssigneeId] = useState(null) const navigate = useNavigate() const { activeOrg, user } = useAuth() const debounceRef = useRef | null>(null) @@ -126,22 +127,37 @@ export function TaskListPage() { useEffect(() => { if (!activeOrg) return - setFilters(DEFAULT_TASK_FILTERS) - setCategories([]) - void loadTasks(DEFAULT_TASK_FILTERS) - categoryService.listByOrganization(activeOrg.id).then(setCategories).catch(() => {}) + const init = async () => { + setFilters(DEFAULT_TASK_FILTERS) + setCategories([]) - projectService.listByOrganization(activeOrg.id).then(setProjects).catch(() => {}) + const [members] = await Promise.all([ + organizationService.listMembers(activeOrg.id), + categoryService.listByOrganization(activeOrg.id).then(setCategories).catch(() => {}), + projectService.listByOrganization(activeOrg.id).then(setProjects).catch(() => {}), + ]) - organizationService.listMembers(activeOrg.id).then((members) => { - setAssignees(members.map((m) => ({ + const assigneesData = members.map((m) => ({ id: m.userId, name: m.userName, email: m.userEmail, photo: m.userPhoto ?? null, - }))) - }).catch(() => {}) + })) + setAssignees(assigneesData) + + const currentMember = members.find((m) => m.userEmail === user?.email) + const userId = currentMember?.userId ?? null + setCurrentUserAssigneeId(userId) + + const initialFilters = userId + ? { ...DEFAULT_TASK_FILTERS, userIds: [userId] } + : DEFAULT_TASK_FILTERS + setFilters(initialFilters) + void loadTasks(initialFilters) + } + + void init() }, [activeOrg]) const handleFiltersChange = (newFilters: TaskFilters) => { @@ -193,6 +209,7 @@ export function TaskListPage() { projects={projects} categories={categories} assignees={assignees} + currentUserId={currentUserAssigneeId ?? undefined} isLoading={isLoading} onRefresh={() => void loadTasks(filters)} />