diff --git a/src/index.css b/src/index.css index 4e9b71a..1e245d3 100755 --- a/src/index.css +++ b/src/index.css @@ -1254,3 +1254,19 @@ select option { background: #222; color: #fff; } /* Version timeline */ .version-item { padding: 12px; } } + +/* Tab bar */ +.tab-btn { + padding: 6px 14px; + border-radius: 20px; + border: 1px solid var(--border); + background: transparent; + color: var(--text-muted); + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: all 0.15s; + white-space: nowrap; +} +.tab-btn:hover { border-color: var(--interactive-hover-border); color: var(--text-secondary); } +.tab-btn.active { background: var(--accent); border-color: var(--accent); color: #000; font-weight: 600; } diff --git a/src/pages/team/TeamProjects.jsx b/src/pages/team/TeamProjects.jsx index c104f7b..b539373 100644 --- a/src/pages/team/TeamProjects.jsx +++ b/src/pages/team/TeamProjects.jsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useEffect, useState, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import Layout from '../../components/Layout'; import StatusBadge from '../../components/StatusBadge'; @@ -9,6 +9,7 @@ export default function TeamProjects() { const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(''); + const [activeTab, setActiveTab] = useState('all'); useEffect(() => { supabase @@ -21,11 +22,21 @@ export default function TeamProjects() { }); }, []); - const filtered = projects.filter(p => - !search || - p.name.toLowerCase().includes(search.toLowerCase()) || - p.company?.name?.toLowerCase().includes(search.toLowerCase()) - ); + const companies = useMemo(() => { + const seen = new Map(); + projects.forEach(p => { + if (p.company?.id && !seen.has(p.company.id)) seen.set(p.company.id, p.company.name); + }); + return [...seen.entries()].sort((a, b) => a[1].localeCompare(b[1])); + }, [projects]); + + const filtered = projects.filter(p => { + const matchesTab = activeTab === 'all' || p.company?.id === activeTab; + const matchesSearch = !search || + p.name.toLowerCase().includes(search.toLowerCase()) || + p.company?.name?.toLowerCase().includes(search.toLowerCase()); + return matchesTab && matchesSearch; + }); return ( @@ -36,13 +47,34 @@ export default function TeamProjects() { setSearch(e.target.value)} - style={{ width: 240 }} + style={{ width: 220 }} /> +
+ + {companies.map(([id, name]) => { + const count = projects.filter(p => p.company?.id === id).length; + return ( + + ); + })} +
+ {loading ? (

Loading...

) : filtered.length === 0 ? ( @@ -56,7 +88,7 @@ export default function TeamProjects() { Project - Client + {activeTab === 'all' && Client} Status Started @@ -65,7 +97,7 @@ export default function TeamProjects() { {filtered.map(p => ( navigate(`/projects/${p.id}`)}> {p.name} - {p.company?.name || '—'} + {activeTab === 'all' && {p.company?.name || '—'}} {new Date(p.created_at).toLocaleDateString()}