From 67041ab42e5ce916c5cab01d6dae27f847df0abc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 13:15:23 -0400 Subject: [PATCH 1/6] feat(people): add Agent Installed column and hide deactivated users by default (#2331) Add a color-coded "Agent" column to the People table showing device agent installation status (green dot for installed, red for not installed). Platform admins and deactivated members show a dash. Deactivated users are now hidden by default unless explicitly filtered. Migrates Laptop icon from lucide-react to @trycompai/design-system/icons. Co-authored-by: Mariano Fuentes Co-authored-by: Claude Opus 4.6 (1M context) --- .../people/all/components/MemberRow.tsx | 25 ++++++++++++++++--- .../all/components/PendingInvitationRow.tsx | 7 ++++++ .../all/components/TeamMembersClient.tsx | 17 +++++++------ 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/MemberRow.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/MemberRow.tsx index d9164f766..60f188a00 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/MemberRow.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/MemberRow.tsx @@ -1,6 +1,5 @@ 'use client'; -import { Laptop } from 'lucide-react'; import Link from 'next/link'; import { useParams } from 'next/navigation'; import { useState } from 'react'; @@ -33,7 +32,7 @@ import { TableRow, Text, } from '@trycompai/design-system'; -import { Checkmark, Edit, OverflowMenuVertical, TrashCan } from '@trycompai/design-system/icons'; +import { Checkmark, Edit, Laptop, OverflowMenuVertical, TrashCan } from '@trycompai/design-system/icons'; import { toast } from 'sonner'; import { MultiRoleCombobox } from './MultiRoleCombobox'; @@ -232,6 +231,26 @@ export function MemberRow({ + {/* AGENT */} + + {isPlatformAdmin || isDeactivated ? ( + + — + + ) : ( +
+ + + {hasDeviceAgentDevice ? 'Installed' : 'Not Installed'} + +
+ )} +
+ {/* TASKS */} {taskCompletion ? ( @@ -284,7 +303,7 @@ export function MemberRow({ setIsRemoveDeviceAlertOpen(true); }} > - + Remove Device )} diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/PendingInvitationRow.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/PendingInvitationRow.tsx index fc7b670f1..a06752cc8 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/PendingInvitationRow.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/PendingInvitationRow.tsx @@ -100,6 +100,13 @@ export function PendingInvitationRow({ + {/* AGENT */} + + + — + + + {/* TASKS */} diff --git a/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembersClient.tsx b/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembersClient.tsx index 1ec310de5..d5e574424 100644 --- a/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembersClient.tsx +++ b/apps/app/src/app/(app)/[orgId]/people/all/components/TeamMembersClient.tsx @@ -182,13 +182,15 @@ export function TeamMembersClient({ // Check if the role filter matches any of the member's roles const matchesRole = !roleFilter || item.processedRoles.includes(roleFilter); - // Status filter: 'active' shows non-deactivated members + pending invitations + // Status filter: by default (no filter), hide deactivated members + // 'active' explicitly shows non-deactivated members + pending invitations // 'deactivated' shows only deactivated members - // empty shows everything + // 'all' shows everything const matchesStatus = - !statusFilter || - (statusFilter === 'active' && item.displayStatus !== 'deactivated') || - (statusFilter === 'deactivated' && item.displayStatus === 'deactivated'); + (statusFilter === 'all') || + (statusFilter === 'deactivated' && item.displayStatus === 'deactivated') || + (!statusFilter && item.displayStatus !== 'deactivated') || + (statusFilter === 'active' && item.displayStatus !== 'deactivated'); return matchesSearch && matchesRole && matchesStatus; }); @@ -307,12 +309,12 @@ export function TeamMembersClient({