From a519e806e536c485401bdbb64241a73a57f4a361 Mon Sep 17 00:00:00 2001 From: Krao Hasanee Date: Wed, 13 May 2026 12:05:03 -0400 Subject: [PATCH] Projects: collapse by default + company tabs - ProjectGroup starts collapsed (open=false) - Multi-company clients see tab switcher matching Invoices page style - Single-company clients: no tabs, no change Co-Authored-By: Claude Sonnet 4.6 --- src/pages/client/MyProjects.jsx | 82 +++++++++++++++++---------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/src/pages/client/MyProjects.jsx b/src/pages/client/MyProjects.jsx index 0c2ef7d..8ef3a47 100755 --- a/src/pages/client/MyProjects.jsx +++ b/src/pages/client/MyProjects.jsx @@ -9,7 +9,7 @@ import { withTimeout } from '../../lib/withTimeout'; const rLabel = (v) => 'R' + String(v || 0).padStart(2, '0'); function ProjectGroup({ project, tasks, submissions, currentUserId, filter }) { - const [open, setOpen] = useState(true); + const [open, setOpen] = useState(false); const filteredTasks = filter === 'mine' ? tasks.filter(task => { @@ -115,6 +115,8 @@ export default function MyProjects() { const [submissions, setSubmissions] = useState([]); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState('all'); // 'all' | 'mine' + const companies = currentUser.companies?.length ? currentUser.companies : (currentUser.company ? [currentUser.company] : []); + const [activeCompanyId, setActiveCompanyId] = useState(() => companies[0]?.id || null); useEffect(() => { async function load() { @@ -187,6 +189,27 @@ export default function MyProjects() { + {companies.length > 1 && ( +
+ {companies.map((company, index) => ( + + {index > 0 && |} + + + ))} +
+ )} + {projects.length === 0 ? (

No projects yet

@@ -194,47 +217,26 @@ export default function MyProjects() { + New Project
) : (() => { - const companies = currentUser.companies || (currentUser.company ? [currentUser.company] : []); - const multiCompany = companies.length > 1; - const companyMap = Object.fromEntries(companies.map(c => [c.id, c.name])); - const grouped = companies - .map(c => ({ company: c, projects: projects.filter(p => p.company_id === c.id) })) - .filter(g => g.projects.length > 0); - const ungrouped = projects.filter(p => !companies.some(c => c.id === p.company_id)); + const visibleProjects = companies.length > 1 + ? projects.filter(p => p.company_id === activeCompanyId) + : projects; - return ( - <> - {grouped.map(({ company, projects: groupProjects }) => ( -
- {multiCompany && ( -
- {company.name} -
- )} - {groupProjects.map(project => ( - t.project_id === project.id)} - submissions={submissions} - currentUserId={currentUser.id} - filter={filter} - /> - ))} -
- ))} - {ungrouped.map(project => ( - t.project_id === project.id)} - submissions={submissions} - currentUserId={currentUser.id} - filter={filter} - /> - ))} - + if (visibleProjects.length === 0) return ( +
+

No projects for this company

+
); + + return visibleProjects.map(project => ( + t.project_id === project.id)} + submissions={submissions} + currentUserId={currentUser.id} + filter={filter} + /> + )); })()} );