feat: add vehicle count column to admin user management
All checks were successful
Deploy to Staging / Build Images (push) Successful in 4m34s
Deploy to Staging / Deploy to Staging (push) Successful in 37s
Deploy to Staging / Verify Staging (push) Successful in 6s
Deploy to Staging / Notify Staging Ready (push) Successful in 5s
Deploy to Staging / Notify Staging Failure (push) Has been skipped

Add a new "Vehicles" column to the admin user management table showing
the count of active vehicles for each user.

Backend changes:
- Add vehicleCount to UserWithAdminStatus type
- Add SQL subquery to count active vehicles (is_active=true, not deleted)
- Add vehicleCount as sortable column option

Frontend changes:
- Add Vehicles column to desktop table (between Tier and Status)
- Add VehicleCountBadge component to mobile user cards
- Update ManagedUser type with vehicleCount field

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Eric Gullickson
2026-01-01 15:23:23 -06:00
parent aa441b185f
commit 0b16b8307f
5 changed files with 27 additions and 5 deletions

View File

@@ -81,6 +81,13 @@ const StatusBadge: React.FC<{ active: boolean }> = ({ active }) => (
</span>
);
// Vehicle count badge component
const VehicleCountBadge: React.FC<{ count: number }> = ({ count }) => (
<span className="px-2 py-1 rounded-full text-xs font-medium bg-slate-100 text-slate-700">
{count} {count === 1 ? 'vehicle' : 'vehicles'}
</span>
);
export const AdminUsersMobileScreen: React.FC = () => {
const { isAdmin, loading: adminLoading } = useAdminAccess();
@@ -453,6 +460,7 @@ export const AdminUsersMobileScreen: React.FC = () => {
)}
<div className="flex flex-wrap gap-2 mt-2">
<TierBadge tier={user.subscriptionTier} />
<VehicleCountBadge count={user.vehicleCount} />
<StatusBadge active={!user.deactivatedAt} />
{user.isAdmin && (
<span className="px-2 py-1 rounded-full text-xs font-medium bg-amber-100 text-amber-700">

View File

@@ -237,6 +237,7 @@ export interface ManagedUser {
updatedAt: string;
isAdmin: boolean;
adminRole: 'admin' | 'super_admin' | null;
vehicleCount: number;
}
// List users response with pagination
@@ -254,7 +255,7 @@ export interface ListUsersParams {
search?: string;
tier?: SubscriptionTier;
status?: 'active' | 'deactivated' | 'all';
sortBy?: 'email' | 'createdAt' | 'displayName' | 'subscriptionTier';
sortBy?: 'email' | 'createdAt' | 'displayName' | 'subscriptionTier' | 'vehicleCount';
sortOrder?: 'asc' | 'desc';
}

View File

@@ -420,6 +420,7 @@ export const AdminUsersPage: React.FC = () => {
<TableCell>Email</TableCell>
<TableCell>Display Name</TableCell>
<TableCell>Tier</TableCell>
<TableCell>Vehicles</TableCell>
<TableCell>Status</TableCell>
<TableCell>Admin</TableCell>
<TableCell>Created</TableCell>
@@ -450,6 +451,7 @@ export const AdminUsersPage: React.FC = () => {
</Select>
</FormControl>
</TableCell>
<TableCell>{user.vehicleCount}</TableCell>
<TableCell>
<Chip
label={user.deactivatedAt ? 'Deactivated' : 'Active'}