feat(project-ratecard-member): ratecard member handle backend and frontend and all update fix bug

This commit is contained in:
shancds
2025-05-23 13:57:53 +05:30
parent 22d0fc7049
commit 659ede7fb5
5 changed files with 159 additions and 37 deletions

View File

@@ -1,7 +1,7 @@
import apiClient from '@api/api-client';
import { API_BASE_URL } from '@/shared/constants';
import { IServerResponse } from '@/types/common.types';
import { IJobType } from '@/types/project/ratecard.types';
import { IJobType, JobRoleType } from '@/types/project/ratecard.types';
const rootUrl = `${API_BASE_URL}/project-rate-cards`;
@@ -54,6 +54,19 @@ export const projectRateCardApiService = {
return response.data;
},
// Update project member rate card role
async updateMemberRateCardRole(
project_id: string,
member_id: string,
project_rate_card_role_id: string
): Promise<IServerResponse<JobRoleType>> {
const response = await apiClient.put<IServerResponse<JobRoleType>>(
`${rootUrl}/project/${project_id}/members/${member_id}/rate-card-role`,
{ project_rate_card_role_id }
);
return response.data;
},
// Delete a single role by id
async deleteFromId(id: string): Promise<IServerResponse<IProjectRateCardRole>> {
const response = await apiClient.delete<IServerResponse<IProjectRateCardRole>>(`${rootUrl}/${id}`);

View File

@@ -121,6 +121,14 @@ export const deleteProjectRateCardRoleById = createAsyncThunk(
}
);
export const assignMemberToRateCardRole = createAsyncThunk(
'projectFinance/assignMemberToRateCardRole',
async ({ project_id, member_id, project_rate_card_role_id }: { project_id: string; member_id: string; project_rate_card_role_id: string }) => {
const response = await projectRateCardApiService.updateMemberRateCardRole(project_id, member_id, project_rate_card_role_id);
return response.body;
}
);
export const deleteProjectRateCardRolesByProjectId = createAsyncThunk(
'projectFinance/deleteByProjectId',
async (project_id: string, { rejectWithValue }) => {

View File

@@ -7,6 +7,7 @@ import { useAppDispatch } from '../../../../../../hooks/useAppDispatch';
import { useTranslation } from 'react-i18next';
import { JobRoleType, IJobType, RatecardType } from '@/types/project/ratecard.types';
import {
assignMemberToRateCardRole,
deleteProjectRateCardRoleById,
fetchProjectRateCardRoles,
insertProjectRateCardRole,
@@ -150,27 +151,28 @@ const RatecardTable: React.FC = () => {
};
// Handle member change
const handleMemberChange = (memberId: string, rowIndex: number, record: JobRoleType) => {
if (!projectId && !memberId) return;
setRoles((prev) =>
prev.map((role, idx) => {
if (idx !== rowIndex) return role;
const members = Array.isArray(role.members) ? [...role.members] : [];
const memberIdx = members.indexOf(memberId);
if (memberIdx > -1) {
members.splice(memberIdx, 1); // Remove if exists
} else {
members.push(memberId); // Add if not exists
}
return { ...role, members };
})
);
// Log the required values
console.log({
project_id: projectId,
id: memberId,
project_rate_card_role_id: record.id,
});
const handleMemberChange = async (memberId: string, rowIndex: number, record: JobRoleType) => {
if (!projectId || !record.id) return; // Ensure required IDs are present
try {
const resultAction = await dispatch(
assignMemberToRateCardRole({
project_id: projectId,
member_id: memberId,
project_rate_card_role_id: record.id,
})
);
if (assignMemberToRateCardRole.fulfilled.match(resultAction)) {
const updatedMembers = resultAction.payload; // Array of member IDs
setRoles((prev) =>
prev.map((role, idx) => {
if (idx !== rowIndex) return role;
return { ...role, members: updatedMembers?.members || [] };
})
);
}
} catch (error) {
console.error('Error assigning member:', error);
}
};
// Columns