Merge all role-dispatcher pages into single files; add FileBrowser with file-type icons

- DashboardPage, Projects, RequestsPage, ProjectDetailPage, RequestDetail: each now handles team/external/client in one file via role flags — removed 10 old role-specific sub-files
- Layout: client Company nav link goes directly to /company/:id when user has a single company
- FileBrowser: replace emoji icons with colored extension-text badges (square); folder icon stays 📁; Adobe/Figma/design-tool colors for design files
- CompaniesPage: merged team Companies + client company routing (single-company redirect, multi-company list)
- FileSharing: integrated FileBrowser component
- Removed: seafile API + lib, old ServerStatus, TaskDetail, role-split page files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Krao Hasanee
2026-05-19 22:11:34 -04:00
parent f9e66dfced
commit b9a4c4a353
47 changed files with 5202 additions and 7217 deletions
+31 -14
View File
@@ -3,12 +3,13 @@ import { NavLink, useNavigate, useLocation } from 'react-router-dom';
import { useAuth } from '../context/AuthContext';
function TeamNav({ onNav }) {
const location = useLocation();
const primaryLinks = [
{ to: '/dashboard', label: 'Dashboard' },
{ to: '/requests', label: 'Requests' },
{ to: '/team-projects', label: 'Projects' },
{ to: '/projects', label: 'Projects' },
{ to: '/file-sharing', label: 'File Sharing' },
{ to: '/companies', label: 'Clients & Users' },
];
const utilityLinks = [
@@ -18,9 +19,11 @@ function TeamNav({ onNav }) {
{ to: '/brand-book', label: 'Brand Book Maker' },
{ to: '/converters', label: 'Image Converter' },
{ to: '/fourge-passwords', label: 'Fourge Passwords' },
{ to: '/server-status', label: 'Server Status' },
];
const isCompaniesActive = location.pathname === '/company' && !location.search.includes('tab=users');
const isUsersActive = location.pathname === '/company' && location.search.includes('tab=users');
return (
<div className="sidebar-section">
{primaryLinks.map(({ to, label }) => (
@@ -37,22 +40,36 @@ function TeamNav({ onNav }) {
{label}
</NavLink>
))}
<NavLink to="/company" onClick={onNav} className={() => `sidebar-link${isCompaniesActive ? ' active' : ''}`}>
Companies
</NavLink>
<NavLink to="/company?tab=users" onClick={onNav} className={() => `sidebar-link${isUsersActive ? ' active' : ''}`}>
Users
</NavLink>
</div>
);
}
function ClientNav({ onNav }) {
const { currentUser } = useAuth();
const companies = currentUser?.companies?.length
? currentUser.companies
: currentUser?.company ? [currentUser.company] : [];
const companyTo = companies.length === 1 ? `/company/${companies[0].id}` : '/company';
const links = [
{ to: '/dashboard', label: 'Dashboard' },
{ to: '/projects', label: 'Projects' },
{ to: '/requests', label: 'Requests' },
{ to: '/file-sharing', label: 'File Sharing' },
{ to: '/my-invoices', label: 'Invoices' },
{ to: companyTo, label: 'Company' },
];
return (
<div className="sidebar-section">
{[
{ to: '/my-dashboard', label: 'Dashboard' },
{ to: '/my-projects', label: 'Projects' },
{ to: '/my-requests', label: 'Requests' },
{ to: '/file-sharing', label: 'File Sharing' },
{ to: '/my-invoices', label: 'Invoices' },
{ to: '/my-company', label: 'Company' },
].map(({ to, label }) => (
<NavLink key={to} to={to} onClick={onNav} className={({ isActive }) => `sidebar-link${isActive ? ' active' : ''}`}>
{links.map(({ to, label }) => (
<NavLink key={label} to={to} onClick={onNav} className={({ isActive }) => `sidebar-link${isActive ? ' active' : ''}`}>
{label}
</NavLink>
))}
@@ -63,8 +80,8 @@ function ClientNav({ onNav }) {
function ExternalNav({ onNav }) {
const links = [
{ to: '/dashboard', label: 'Dashboard' },
{ to: '/assigned-requests', label: 'Requests' },
{ to: '/my-projects-sub', label: 'Projects' },
{ to: '/requests', label: 'Requests' },
{ to: '/projects', label: 'Projects' },
{ to: '/my-invoices-sub', label: 'Invoices' },
{ to: '/file-sharing', label: 'File Sharing' },
{ to: '/survey-maker', label: 'Survey Maker' },