adds on /off commission for team members in jobs,when comm is on then owner can edit comm

This commit is contained in:
Satyam-Rastogi
2026-05-14 19:08:31 +05:30
parent ef9fa1a401
commit 00e9c2af00
2 changed files with 123 additions and 42 deletions
+86 -5
View File
@@ -1,10 +1,10 @@
import React, { useState, useMemo, useEffect, useRef } from 'react'; import React, { useState, useMemo, useEffect, useRef, useCallback } from 'react';
import { createPortal } from 'react-dom'; import { createPortal } from 'react-dom';
import { motion, AnimatePresence } from 'framer-motion'; import { motion, AnimatePresence } from 'framer-motion';
import { import {
UserPlus, UserMinus, Shield, ChevronDown, Search, Mail, UserPlus, UserMinus, Shield, ChevronDown, Search, Mail,
X as XIcon, Users, Briefcase, DollarSign, MoreVertical, X as XIcon, Users, Briefcase, DollarSign, MoreVertical,
Check, Clock, Crown, ChevronUp Check, Clock, Crown, ChevronUp, ToggleLeft, ToggleRight
} from 'lucide-react'; } from 'lucide-react';
const JOB_ROLES = [ const JOB_ROLES = [
@@ -100,6 +100,45 @@ const TeamManagementPanel = ({
const menuRef = useRef(null); const menuRef = useRef(null);
// ── Commission toggle default ─────────────────────────────────────────
// Reads commissionEnabled directly from the member data in mockStore.
// Falls back to true if a jobCommission override is explicitly set.
const getMemberCommissionDefault = useCallback((member) => {
if (typeof member.commissionEnabled === 'boolean') return member.commissionEnabled;
return !!member.jobCommission; // fallback for legacy data without the field
}, []);
// Per-member commission toggle: { [memberId]: boolean }
const [commissionToggle, setCommissionToggle] = useState(() => {
const init = {};
teamMembers.forEach(m => { init[m.id] = getMemberCommissionDefault(m); });
return init;
});
// Keep new members initialized when teamMembers changes
useEffect(() => {
setCommissionToggle(prev => {
const next = { ...prev };
let changed = false;
teamMembers.forEach(m => {
if (!(m.id in next)) {
next[m.id] = getMemberCommissionDefault(m);
changed = true;
}
});
return changed ? next : prev;
});
}, [teamMembers, getMemberCommissionDefault]);
// Toggle and persist back to store so the change survives re-renders
const toggleMemberCommission = useCallback((memberId) => {
setCommissionToggle(prev => {
const next = { ...prev, [memberId]: !prev[memberId] };
onUpdateMember(project.id, memberId, { commissionEnabled: next[memberId] });
return next;
});
}, [project.id, onUpdateMember]);
const canManageTeam = ['OWNER', 'ADMIN'].includes(userRole); const canManageTeam = ['OWNER', 'ADMIN'].includes(userRole);
const canManageCommissions = ['OWNER', 'ADMIN'].includes(userRole); const canManageCommissions = ['OWNER', 'ADMIN'].includes(userRole);
const canViewCommissions = ['OWNER', 'ADMIN', 'CONTRACTOR'].includes(userRole); const canViewCommissions = ['OWNER', 'ADMIN', 'CONTRACTOR'].includes(userRole);
@@ -258,25 +297,67 @@ const TeamManagementPanel = ({
animate={{ opacity: 1, scale: 1, y: 0 }} animate={{ opacity: 1, scale: 1, y: 0 }}
exit={{ opacity: 0, scale: 0.95, y: -4 }} exit={{ opacity: 0, scale: 0.95, y: -4 }}
transition={{ duration: 0.15 }} transition={{ duration: 0.15 }}
className="absolute right-0 top-8 z-30 w-44 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-white/10 rounded-xl shadow-2xl overflow-hidden" className="absolute right-0 top-8 z-30 w-52 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-white/10 rounded-xl shadow-2xl overflow-hidden"
> >
{/* Change Job Role */}
<button <button
onClick={() => { setEditingRole(member.id); setActionMenu(null); }} onClick={() => { setEditingRole(member.id); setActionMenu(null); }}
className="w-full px-3 py-2 text-left text-xs font-semibold text-zinc-700 dark:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-white/5 flex items-center gap-2 transition-colors" className="w-full px-3 py-2 text-left text-xs font-semibold text-zinc-700 dark:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-white/5 flex items-center gap-2 transition-colors"
> >
<Shield size={12} /> Change Job Role <Shield size={12} /> Change Job Role
</button> </button>
{/* Commission Toggle */}
{canManageCommissions && ( {canManageCommissions && (
<div className="px-3 py-2 flex items-center justify-between border-t border-zinc-100 dark:border-white/5">
<div className="flex items-center gap-2">
<DollarSign size={12} className={commissionToggle[member.id] ? 'text-amber-400' : 'text-zinc-400'} />
<span className="text-xs font-semibold text-zinc-700 dark:text-zinc-300">Commission</span>
</div>
<button
onClick={(e) => { e.stopPropagation(); toggleMemberCommission(member.id); }}
className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors duration-200 focus:outline-none
${commissionToggle[member.id]
? 'bg-amber-400'
: 'bg-zinc-300 dark:bg-zinc-700'
}`}
title={commissionToggle[member.id] ? 'Commission ON' : 'Commission OFF'}
>
<motion.span
layout
transition={{ type: 'spring', stiffness: 500, damping: 35 }}
className={`inline-block h-3.5 w-3.5 rounded-full bg-white shadow-sm transform transition-transform
${commissionToggle[member.id] ? 'translate-x-4' : 'translate-x-0.5'}`}
/>
</button>
</div>
)}
{/* Edit Commission — visible only when toggle is ON */}
<AnimatePresence>
{canManageCommissions && commissionToggle[member.id] && (
<motion.div
key="edit-commission"
initial={{ height: 0, opacity: 0 }}
animate={{ height: 'auto', opacity: 1 }}
exit={{ height: 0, opacity: 0 }}
transition={{ duration: 0.18 }}
className="overflow-hidden"
>
<button <button
onClick={() => { setEditingCommission(member); setActionMenu(null); }} onClick={() => { setEditingCommission(member); setActionMenu(null); }}
className="w-full px-3 py-2 text-left text-xs font-semibold text-zinc-700 dark:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-white/5 flex items-center gap-2 transition-colors" className="w-full px-3 py-2 text-left text-xs font-semibold text-amber-500 hover:bg-amber-50 dark:hover:bg-amber-500/10 flex items-center gap-2 transition-colors border-t border-zinc-100 dark:border-white/5"
> >
<DollarSign size={12} /> Edit Commission <DollarSign size={12} /> Edit Commission
</button> </button>
</motion.div>
)} )}
</AnimatePresence>
{/* Remove from Job */}
<button <button
onClick={() => { setRemoveConfirm(member); setActionMenu(null); }} onClick={() => { setRemoveConfirm(member); setActionMenu(null); }}
className="w-full px-3 py-2 text-left text-xs font-semibold text-red-500 hover:bg-red-50 dark:hover:bg-red-500/5 flex items-center gap-2 transition-colors" className="w-full px-3 py-2 text-left text-xs font-semibold text-red-500 hover:bg-red-50 dark:hover:bg-red-500/5 flex items-center gap-2 transition-colors border-t border-zinc-100 dark:border-white/5"
> >
<UserMinus size={12} /> Remove from Job <UserMinus size={12} /> Remove from Job
</button> </button>
+32 -32
View File
@@ -2068,11 +2068,11 @@ const MOCK_PROJECTS = [
{ name: 'Material Order PO-2604', url: '#', type: 'invoice' } { name: 'Material Order PO-2604', url: '#', type: 'invoice' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_001_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Sales Rep', status: 'active', jobCommission: { type: 'percent_gross', rate: 12 } }, { id: 'jtm_001_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Sales Rep', status: 'active', commissionEnabled: true, jobCommission: { type: 'percent_gross', rate: 12 } },
{ id: 'jtm_001_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', jobCommission: null }, { id: 'jtm_001_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', commissionEnabled: false, jobCommission: null },
{ id: 'jtm_001_3', userId: 'sub_001', name: 'Carlos Subcontractor', email: 'carlos@electricpro.com', orgRole: 'SUBCONTRACTOR', jobRole: 'Subcontractor', status: 'active', jobCommission: null }, { id: 'jtm_001_3', userId: 'sub_001', name: 'Carlos Subcontractor', email: 'carlos@electricpro.com', orgRole: 'SUBCONTRACTOR', jobRole: 'Subcontractor', status: 'active', commissionEnabled: false, jobCommission: null },
{ id: 'jtm_001_4', userId: 'e1', name: 'Frank Agent', email: 'agent1@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Canvasser', status: 'active', jobCommission: null }, { id: 'jtm_001_4', userId: 'e1', name: 'Frank Agent', email: 'agent1@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Canvasser', status: 'active', commissionEnabled: true, jobCommission: null },
{ id: 'jtm_001_5', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Estimator', status: 'pending', jobCommission: null } { id: 'jtm_001_5', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Estimator', status: 'pending', commissionEnabled: true, jobCommission: null }
] ]
}, },
@@ -2124,8 +2124,8 @@ const MOCK_PROJECTS = [
{ name: 'Warranty Registration', url: '#', type: 'warranty' } { name: 'Warranty Registration', url: '#', type: 'warranty' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_002_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Sales Rep', status: 'active', jobCommission: null }, { id: 'jtm_002_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Sales Rep', status: 'active', commissionEnabled: true, jobCommission: null },
{ id: 'jtm_002_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', jobCommission: null } { id: 'jtm_002_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', commissionEnabled: false, jobCommission: null }
] ]
}, },
@@ -2203,9 +2203,9 @@ const MOCK_PROJECTS = [
{ name: 'Equipment Spec Sheets', url: '#', type: 'specification' } { name: 'Equipment Spec Sheets', url: '#', type: 'specification' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_003_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Sales Rep', status: 'active', jobCommission: { type: 'flat', rate: 2000 } }, { id: 'jtm_003_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Sales Rep', status: 'active', commissionEnabled: true, jobCommission: { type: 'flat', rate: 2000 } },
{ id: 'jtm_003_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Project Manager', status: 'active', jobCommission: null }, { id: 'jtm_003_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Project Manager', status: 'active', commissionEnabled: false, jobCommission: null },
{ id: 'jtm_003_3', userId: 'sub_001', name: 'Carlos Subcontractor', email: 'carlos@electricpro.com', orgRole: 'SUBCONTRACTOR', jobRole: 'Subcontractor', status: 'active', jobCommission: null } { id: 'jtm_003_3', userId: 'sub_001', name: 'Carlos Subcontractor', email: 'carlos@electricpro.com', orgRole: 'SUBCONTRACTOR', jobRole: 'Subcontractor', status: 'active', commissionEnabled: false, jobCommission: null }
] ]
}, },
@@ -2294,9 +2294,9 @@ const MOCK_PROJECTS = [
{ name: 'Asbestos Abatement Report', url: '#', type: 'report' } { name: 'Asbestos Abatement Report', url: '#', type: 'report' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_004_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Project Manager', status: 'active', jobCommission: { type: 'percent_net', rate: 8 } }, { id: 'jtm_004_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Project Manager', status: 'active', commissionEnabled: true, jobCommission: { type: 'percent_net', rate: 8 } },
{ id: 'jtm_004_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', jobCommission: null }, { id: 'jtm_004_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', commissionEnabled: false, jobCommission: null },
{ id: 'jtm_004_3', userId: 'e2', name: 'Fiona Field', email: 'agent2@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Inspector', status: 'active', jobCommission: null } { id: 'jtm_004_3', userId: 'e2', name: 'Fiona Field', email: 'agent2@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Inspector', status: 'active', commissionEnabled: false, jobCommission: null }
] ]
}, },
@@ -2372,8 +2372,8 @@ const MOCK_PROJECTS = [
{ name: 'Site Photos - Defective Panels', url: '#', type: 'photos' } { name: 'Site Photos - Defective Panels', url: '#', type: 'photos' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_005_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Sales Rep', status: 'active', jobCommission: null }, { id: 'jtm_005_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Sales Rep', status: 'active', commissionEnabled: true, jobCommission: null },
{ id: 'jtm_005_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', jobCommission: null } { id: 'jtm_005_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', commissionEnabled: false, jobCommission: null }
] ]
}, },
@@ -2423,8 +2423,8 @@ const MOCK_PROJECTS = [
{ name: 'Load Calculation Report', url: '#', type: 'report' } { name: 'Load Calculation Report', url: '#', type: 'report' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_006_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Sales Rep', status: 'active', jobCommission: null }, { id: 'jtm_006_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Sales Rep', status: 'active', commissionEnabled: true, jobCommission: null },
{ id: 'jtm_006_2', userId: 'sub_001', name: 'Carlos Subcontractor', email: 'carlos@electricpro.com', orgRole: 'SUBCONTRACTOR', jobRole: 'Lead Installer', status: 'active', jobCommission: null } { id: 'jtm_006_2', userId: 'sub_001', name: 'Carlos Subcontractor', email: 'carlos@electricpro.com', orgRole: 'SUBCONTRACTOR', jobRole: 'Lead Installer', status: 'active', commissionEnabled: false, jobCommission: null }
] ]
}, },
@@ -2526,10 +2526,10 @@ const MOCK_PROJECTS = [
{ name: 'Safety Plan - Fall Protection', url: '#', type: 'safety' } { name: 'Safety Plan - Fall Protection', url: '#', type: 'safety' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_007_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Project Manager', status: 'active', jobCommission: { type: 'percent_gross', rate: 5 } }, { id: 'jtm_007_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Project Manager', status: 'active', commissionEnabled: true, jobCommission: { type: 'percent_gross', rate: 5 } },
{ id: 'jtm_007_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', jobCommission: null }, { id: 'jtm_007_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', commissionEnabled: false, jobCommission: null },
{ id: 'jtm_007_3', userId: 'sub_001', name: 'Carlos Subcontractor', email: 'carlos@electricpro.com', orgRole: 'SUBCONTRACTOR', jobRole: 'Subcontractor', status: 'active', jobCommission: null }, { id: 'jtm_007_3', userId: 'sub_001', name: 'Carlos Subcontractor', email: 'carlos@electricpro.com', orgRole: 'SUBCONTRACTOR', jobRole: 'Subcontractor', status: 'active', commissionEnabled: false, jobCommission: null },
{ id: 'jtm_007_4', userId: 'e4', name: 'Felicity Fast', email: 'agent4@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Canvasser', status: 'active', jobCommission: null } { id: 'jtm_007_4', userId: 'e4', name: 'Felicity Fast', email: 'agent4@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Canvasser', status: 'active', commissionEnabled: true, jobCommission: null }
] ]
}, },
@@ -2587,8 +2587,8 @@ const MOCK_PROJECTS = [
{ name: 'Soil Analysis Report', url: '#', type: 'report' } { name: 'Soil Analysis Report', url: '#', type: 'report' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_008_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Sales Rep', status: 'active', jobCommission: null }, { id: 'jtm_008_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Sales Rep', status: 'active', commissionEnabled: true, jobCommission: null },
{ id: 'jtm_008_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', jobCommission: null } { id: 'jtm_008_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', commissionEnabled: false, jobCommission: null }
] ]
}, },
@@ -2639,8 +2639,8 @@ const MOCK_PROJECTS = [
{ name: 'Energy Rating Certificates', url: '#', type: 'certificate' } { name: 'Energy Rating Certificates', url: '#', type: 'certificate' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_009_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Sales Rep', status: 'active', jobCommission: null }, { id: 'jtm_009_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Sales Rep', status: 'active', commissionEnabled: true, jobCommission: null },
{ id: 'jtm_009_2', userId: 'e2', name: 'Fiona Field', email: 'agent2@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Inspector', status: 'active', jobCommission: null } { id: 'jtm_009_2', userId: 'e2', name: 'Fiona Field', email: 'agent2@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Inspector', status: 'active', commissionEnabled: false, jobCommission: null }
] ]
}, },
@@ -2691,9 +2691,9 @@ const MOCK_PROJECTS = [
{ name: 'Final Payment Release', url: '#', type: 'invoice' } { name: 'Final Payment Release', url: '#', type: 'invoice' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_010_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Estimator', status: 'active', jobCommission: { type: 'flat', rate: 1500 } }, { id: 'jtm_010_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Estimator', status: 'active', commissionEnabled: true, jobCommission: { type: 'flat', rate: 1500 } },
{ id: 'jtm_010_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', jobCommission: null }, { id: 'jtm_010_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', commissionEnabled: false, jobCommission: null },
{ id: 'jtm_010_3', userId: 'e5', name: 'Felix Fixer', email: 'agent5@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Canvasser', status: 'pending', jobCommission: null } { id: 'jtm_010_3', userId: 'e5', name: 'Felix Fixer', email: 'agent5@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Canvasser', status: 'pending', commissionEnabled: false, jobCommission: null }
] ]
}, },
@@ -2752,8 +2752,8 @@ const MOCK_PROJECTS = [
{ name: 'RFI #2 - Waterproofing Method', url: '#', type: 'rfi' } { name: 'RFI #2 - Waterproofing Method', url: '#', type: 'rfi' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_011_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Project Manager', status: 'active', jobCommission: null }, { id: 'jtm_011_1', userId: 'p1', name: 'Jesus Gonzales', email: 'jesus@lynkeduppro.com', orgRole: 'W2_EMPLOYEE', jobRole: 'Project Manager', status: 'active', commissionEnabled: false, jobCommission: null },
{ id: 'jtm_011_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', jobCommission: null } { id: 'jtm_011_2', userId: 'con_001', name: 'Mike Contractor', email: 'mike@texasbuilders.com', orgRole: 'CONTRACTOR', jobRole: 'Lead Installer', status: 'active', commissionEnabled: false, jobCommission: null }
] ]
}, },
@@ -2806,8 +2806,8 @@ const MOCK_PROJECTS = [
{ name: 'Material Delivery Receipt', url: '#', type: 'receipt' } { name: 'Material Delivery Receipt', url: '#', type: 'receipt' }
], ],
teamMembers: [ teamMembers: [
{ id: 'jtm_012_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Sales Rep', status: 'active', jobCommission: null }, { id: 'jtm_012_1', userId: 'p2', name: 'Sarah Sales', email: 'sarah@lynkeduppro.com', orgRole: '1099_SALES_REP', jobRole: 'Sales Rep', status: 'active', commissionEnabled: true, jobCommission: null },
{ id: 'jtm_012_2', userId: 'e3', name: 'Fred Flyer', email: 'agent3@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Canvasser', status: 'active', jobCommission: null } { id: 'jtm_012_2', userId: 'e3', name: 'Fred Flyer', email: 'agent3@plano.com', orgRole: 'FIELD_AGENT', jobRole: 'Canvasser', status: 'active', commissionEnabled: false, jobCommission: null }
] ]
} }
]; ];