From 958f4518369118e5fe48acfe1a30979ed583c4ad Mon Sep 17 00:00:00 2001 From: Krao Hasanee Date: Mon, 1 Jun 2026 20:35:13 -0400 Subject: [PATCH] fix: client file sharing access denied + task/project default tabs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FileSharing: rootPath for clients strips /Clients/ prefix — API resolveClientPath expects /{company} not /Clients/{company} - Tasks: default to To Do tab (not_started) instead of All Tasks - Projects: default to Active tab instead of All Projects Co-Authored-By: Claude Sonnet 4.6 --- src/pages/FileSharing.jsx | 8 ++++++-- src/pages/Tasks.jsx | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pages/FileSharing.jsx b/src/pages/FileSharing.jsx index 88e0d92..2cb16d8 100644 --- a/src/pages/FileSharing.jsx +++ b/src/pages/FileSharing.jsx @@ -270,12 +270,16 @@ async function fbqProxy(op, path, extra = {}) { throw new Error(`Unsupported operation: ${op}`); } +function safeName(v) { + return String(v || '').trim().replace(/[\\/:*?"<>|#%{}^~[\]`]+/g, '-').replace(/\s+/g, ' ').replace(/^-+|-+$/g, ''); +} + function rootPath(user) { if (!user || user.role === 'team' || user.role === 'external') return '/'; const companies = user.companies?.filter(Boolean) ?? []; - if (companies.length > 1) return '/Clients'; + if (companies.length > 1) return '/'; const name = companies[0]?.name ?? user.company?.name; - return name ? `/Clients/${name}` : '/'; + return name ? `/${safeName(name)}` : '/'; } function parsePath(path) { diff --git a/src/pages/Tasks.jsx b/src/pages/Tasks.jsx index fd93ba9..e277b74 100644 --- a/src/pages/Tasks.jsx +++ b/src/pages/Tasks.jsx @@ -73,7 +73,7 @@ function TasksStatsRow({ tasks = [] }) { function TasksPageShell({ statsTasks = [], projects = [], onAddProject = null, children }) { const [projSortKey, setProjSortKey] = useState('status'); const [projSortDir, setProjSortDir] = useState('asc'); - const [projTab, setProjTab] = useState('all'); + const [projTab, setProjTab] = useState('active'); const toggleProjSort = (col) => { if (projSortKey === col) setProjSortDir(d => d === 'asc' ? 'desc' : 'asc'); else { setProjSortKey(col); setProjSortDir('asc'); } @@ -193,7 +193,7 @@ export default function RequestsPage() { }); const [error, setError] = useState(''); const [loadError, setLoadError] = useState(false); - const [activeTab, setActiveTab] = useState('all'); + const [activeTab, setActiveTab] = useState('not_started'); const [filterCompany, setFilterCompany] = useState(''); const [filterProject, setFilterProject] = useState(''); const { sortKey, sortDir, toggle, sort } = useSortable('status', 'asc');