feat(ratecard-assignee-selector): add assignedMembers prop to handle member assignment across job titles
This commit is contained in:
@@ -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" />
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user