Add cmdk-based combobox to portal header for inline company switching with search by name or Epicor ID. Also update select-company page to use the same pattern. Fix admin company switching by allowing admins to switch to any active company without requiring a quest_user_company link. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
import {
|
|
getQuestSession,
|
|
getActiveCompany,
|
|
getUserCompanies,
|
|
} from '@/lib/permissions';
|
|
import { PortalSidebar } from '@/components/layout/portal-sidebar';
|
|
import { PortalHeader } from '@/components/layout/portal-header';
|
|
import { Breadcrumb } from '@/components/layout/breadcrumb';
|
|
import { redirect } from 'next/navigation';
|
|
import { db } from '@/lib/db';
|
|
|
|
export default async function PortalLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode;
|
|
}) {
|
|
// Check authentication
|
|
const session = await getQuestSession();
|
|
|
|
if (!session) {
|
|
redirect('/login');
|
|
}
|
|
|
|
// Get active company
|
|
const activeCompany = await getActiveCompany();
|
|
|
|
// Get unread notifications count
|
|
const unreadNotifications = await db.quest_user_notification_alert_read.count(
|
|
{
|
|
where: {
|
|
auth_user_id: session.user.id,
|
|
},
|
|
}
|
|
);
|
|
|
|
const isAdmin =
|
|
session.userType === 'Admin' || session.userType === 'Super Admin';
|
|
|
|
// Get available companies for the switcher
|
|
const companies = await getUserCompanies();
|
|
|
|
return (
|
|
<div className="flex min-h-screen">
|
|
<PortalSidebar isAdmin={isAdmin} permissions={session.permissionRules} />
|
|
<div className="flex-1 pl-64">
|
|
<PortalHeader
|
|
companyName={activeCompany?.display_name}
|
|
activeCompanyId={activeCompany?.id}
|
|
companies={companies.map((c) => ({
|
|
id: c.id,
|
|
display_name: c.display_name,
|
|
epicor_cust_id: c.epicor_cust_id,
|
|
}))}
|
|
userEmail={session.user.email}
|
|
isAdmin={isAdmin}
|
|
unreadNotifications={unreadNotifications}
|
|
/>
|
|
<main className="p-6">
|
|
<Breadcrumb />
|
|
{children}
|
|
</main>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|