feat(ratecard-assignee-selector): add assignedMembers prop to handle member assignment across job titles

This commit is contained in:
shancds
2025-05-28 12:38:19 +05:30
parent 5cb6548889
commit cae5524168
2 changed files with 40 additions and 28 deletions

View File

@@ -23,7 +23,8 @@ const RateCardAssigneeSelector = ({
onChange, onChange,
selectedMemberIds = [], selectedMemberIds = [],
memberlist = [], memberlist = [],
}: RateCardAssigneeSelectorProps) => { assignedMembers = [], // New prop: List of all assigned member IDs across all job titles
}: RateCardAssigneeSelectorProps & { assignedMembers: string[] }) => {
const membersInputRef = useRef<InputRef>(null); const membersInputRef = useRef<InputRef>(null);
const [searchQuery, setSearchQuery] = useState(''); const [searchQuery, setSearchQuery] = useState('');
const [members, setMembers] = useState<IProjectMemberViewModel[]>(memberlist); const [members, setMembers] = useState<IProjectMemberViewModel[]>(memberlist);
@@ -46,33 +47,39 @@ const RateCardAssigneeSelector = ({
/> />
<List style={{ padding: 0, maxHeight: 200, overflow: 'auto' }}> <List style={{ padding: 0, maxHeight: 200, overflow: 'auto' }}>
{filteredMembers.length ? ( {filteredMembers.length ? (
filteredMembers.map((member) => ( filteredMembers.map((member) => {
<List.Item const isAssignedToAnotherJobTitle =
key={member.id} assignedMembers.includes(member.id || '') &&
style={{ !selectedMemberIds.includes(member.id || ''); // Check if the member is assigned elsewhere
display: 'flex',
gap: 8, return (
alignItems: 'center', <List.Item
padding: '4px 8px', key={member.id}
border: 'none', style={{
opacity: member.pending_invitation ? 0.5 : 1, display: 'flex',
justifyContent: 'flex-start', gap: 8,
textAlign: 'left', alignItems: 'center',
}} padding: '4px 8px',
> border: 'none',
<Checkbox opacity: member.pending_invitation || isAssignedToAnotherJobTitle ? 0.5 : 1,
checked={selectedMemberIds.includes(member.id || '')} justifyContent: 'flex-start',
disabled={member.pending_invitation} textAlign: 'left',
onChange={() => onChange?.(member.id || '')} }}
/> >
<SingleAvatar <Checkbox
avatarUrl={member.avatar_url} checked={selectedMemberIds.includes(member.id || '')}
name={member.name} disabled={member.pending_invitation || isAssignedToAnotherJobTitle}
email={member.email} onChange={() => onChange?.(member.id || '')}
/> />
<span>{member.name}</span> <SingleAvatar
</List.Item> avatarUrl={member.avatar_url}
)) name={member.name}
email={member.email}
/>
<span>{member.name}</span>
</List.Item>
);
})
) : ( ) : (
<Empty description="No members found" /> <Empty description="No members found" />
)} )}

View File

@@ -191,6 +191,10 @@ const RatecardTable: React.FC = () => {
} }
}; };
const assignedMembers = roles
.flatMap((role) => role.members || [])
.filter((memberId, index, self) => self.indexOf(memberId) === index);
// Columns // Columns
const columns: TableProps<JobRoleType>['columns'] = [ const columns: TableProps<JobRoleType>['columns'] = [
{ {
@@ -267,6 +271,7 @@ const RatecardTable: React.FC = () => {
selectedMemberIds={memberscol || []} selectedMemberIds={memberscol || []}
onChange={(memberId) => handleMemberChange(memberId, index, record)} onChange={(memberId) => handleMemberChange(memberId, index, record)}
memberlist={members} memberlist={members}
assignedMembers={assignedMembers} // Pass assigned members here
/> />
</div> </div>
</div> </div>