mirror of
https://dev.azure.com/globalhealthx/EMR/_git/helix-engage
synced 2026-04-12 02:38:15 +00:00
fix: wire role-based views — sidebar auth, user display, table tabs, card actions
- Sidebar: use useAuth() for isAdmin and pass auth user to NavAccountCard - NavAccountCard: fix bug where items prop was ignored (used placeholderAccounts) - TopBar: replace hardcoded "SM" initials with user.initials from auth - All Leads: add "My Leads" tab filtering by assignedAgent matching user - Lead Card: add role-aware action buttons (Call/Disposition for assigned leads) - Lead Workspace: pass onLogCall/onUpdateStatus handlers to LeadCard Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -167,7 +167,7 @@ export const NavAccountCard = ({
|
||||
const triggerRef = useRef<HTMLDivElement>(null);
|
||||
const isDesktop = useBreakpoint("lg");
|
||||
|
||||
const selectedAccount = placeholderAccounts.find((account) => account.id === selectedAccountId);
|
||||
const selectedAccount = items.find((account) => account.id === selectedAccountId);
|
||||
|
||||
if (!selectedAccount) {
|
||||
console.warn(`Account with ID ${selectedAccountId} not found in <NavAccountCard />`);
|
||||
|
||||
@@ -110,7 +110,17 @@ export const Sidebar = ({ activeUrl = "/" }: SidebarProps) => {
|
||||
|
||||
{/* Account card */}
|
||||
<div className="mt-auto flex flex-col gap-5 px-2 py-4 lg:gap-6 lg:px-4 lg:py-4">
|
||||
<NavAccountCard onSignOut={handleSignOut} />
|
||||
<NavAccountCard
|
||||
items={[{
|
||||
id: 'current',
|
||||
name: user.name,
|
||||
email: user.email,
|
||||
avatar: '',
|
||||
status: 'online' as const,
|
||||
}]}
|
||||
selectedAccountId="current"
|
||||
onSignOut={handleSignOut}
|
||||
/>
|
||||
</div>
|
||||
</aside>
|
||||
);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { SearchLg } from "@untitledui/icons";
|
||||
import { Avatar } from "@/components/base/avatar/avatar";
|
||||
import { Input } from "@/components/base/input/input";
|
||||
import { useAuth } from "@/providers/auth-provider";
|
||||
|
||||
interface TopBarProps {
|
||||
title: string;
|
||||
@@ -8,6 +9,8 @@ interface TopBarProps {
|
||||
}
|
||||
|
||||
export const TopBar = ({ title, subtitle }: TopBarProps) => {
|
||||
const { user } = useAuth();
|
||||
|
||||
return (
|
||||
<header className="flex h-16 items-center justify-between border-b border-secondary bg-primary px-6">
|
||||
<div className="flex flex-col justify-center">
|
||||
@@ -23,7 +26,7 @@ export const TopBar = ({ title, subtitle }: TopBarProps) => {
|
||||
aria-label="Search"
|
||||
/>
|
||||
</div>
|
||||
<Avatar initials="SM" size="sm" />
|
||||
<Avatar initials={user.initials} size="sm" />
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
|
||||
@@ -14,6 +14,8 @@ interface LeadCardProps {
|
||||
onMessage: (lead: Lead) => void;
|
||||
onMarkSpam: (lead: Lead) => void;
|
||||
onMerge: (lead: Lead) => void;
|
||||
onLogCall?: (lead: Lead) => void;
|
||||
onUpdateStatus?: (lead: Lead) => void;
|
||||
}
|
||||
|
||||
const sourceLabelMap: Record<string, string> = {
|
||||
@@ -29,7 +31,7 @@ const sourceLabelMap: Record<string, string> = {
|
||||
OTHER: 'Other',
|
||||
};
|
||||
|
||||
export const LeadCard = ({ lead, onAssign, onMessage, onMarkSpam, onMerge }: LeadCardProps) => {
|
||||
export const LeadCard = ({ lead, onAssign, onMessage, onMarkSpam, onMerge, onLogCall, onUpdateStatus }: LeadCardProps) => {
|
||||
const firstName = lead.contactName?.firstName ?? '';
|
||||
const lastName = lead.contactName?.lastName ?? '';
|
||||
const name = `${firstName} ${lastName}`.trim() || 'Unknown';
|
||||
@@ -38,6 +40,7 @@ export const LeadCard = ({ lead, onAssign, onMessage, onMarkSpam, onMerge }: Lea
|
||||
const sourceLabel = lead.leadSource ? sourceLabelMap[lead.leadSource] ?? lead.leadSource : '';
|
||||
const isSpam = (lead.spamScore ?? 0) >= 60;
|
||||
const isDuplicate = lead.isDuplicate === true;
|
||||
const isAssigned = lead.assignedAgent !== null && lead.leadStatus !== 'NEW';
|
||||
|
||||
return (
|
||||
<div
|
||||
@@ -99,6 +102,15 @@ export const LeadCard = ({ lead, onAssign, onMessage, onMarkSpam, onMerge }: Lea
|
||||
Merge
|
||||
</Button>
|
||||
</>
|
||||
) : isAssigned ? (
|
||||
<>
|
||||
<Button size="sm" color="primary" onClick={() => onLogCall?.(lead)}>
|
||||
Call
|
||||
</Button>
|
||||
<Button size="sm" color="secondary" onClick={() => onUpdateStatus?.(lead)}>
|
||||
Disposition
|
||||
</Button>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Button size="sm" color="primary" onClick={() => onAssign(lead)}>
|
||||
|
||||
Reference in New Issue
Block a user