diff --git a/src/containers/Projects/containers/ProjectAlerts/ProjectTaskDeleteAlert.tsx b/src/containers/Projects/containers/ProjectAlerts/ProjectTaskDeleteAlert.tsx index 86d4fa9f1..9a320da76 100644 --- a/src/containers/Projects/containers/ProjectAlerts/ProjectTaskDeleteAlert.tsx +++ b/src/containers/Projects/containers/ProjectAlerts/ProjectTaskDeleteAlert.tsx @@ -37,7 +37,7 @@ function ProjectTaskDeleteAlert({ deleteProjectTaskMutate(taskId) .then(() => { AppToaster.show({ - message: intl.get('projects.alert.delete_message'), + message: intl.get('project_task.alert.delete_message'), intent: Intent.SUCCESS, }); }) @@ -65,7 +65,7 @@ function ProjectTaskDeleteAlert({ loading={isLoading} >

- +

); diff --git a/src/containers/Projects/containers/ProjectDetails/ProjectTasks/ProjectTaskProvider.tsx b/src/containers/Projects/containers/ProjectDetails/ProjectTasks/ProjectTaskProvider.tsx index 8c365ac30..8b30aba57 100644 --- a/src/containers/Projects/containers/ProjectDetails/ProjectTasks/ProjectTaskProvider.tsx +++ b/src/containers/Projects/containers/ProjectDetails/ProjectTasks/ProjectTaskProvider.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { useParams } from 'react-router-dom'; -import { useProjectTasks } from '../../../hooks'; +import { useProjectTasks, useProject } from '../../../hooks'; const ProjectTaskContext = React.createContext(); @@ -12,6 +12,7 @@ function ProjectTaskProvider({ ...props }) { const { id } = useParams(); const projectId = parseInt(id, 10); + // Handle fetch project tasks. const { data: { projectTasks }, isFetching: isProjectTasksFetching, @@ -20,8 +21,15 @@ function ProjectTaskProvider({ ...props }) { enabled: !!projectId, }); + // Handle fetch project detail. + const { data: project, isLoading: isProjectLoading } = useProject(projectId, { + enabled: !!projectId, + }); + + console.log(project, 'XX'); // provider payload. const provider = { + project, projectId, projectTasks, isProjectTasksFetching, diff --git a/src/containers/Projects/containers/ProjectDetails/ProjectTasks/ProjectTasksHeader.tsx b/src/containers/Projects/containers/ProjectDetails/ProjectTasks/ProjectTasksHeader.tsx index 057b92781..2acf0531e 100644 --- a/src/containers/Projects/containers/ProjectDetails/ProjectTasks/ProjectTasksHeader.tsx +++ b/src/containers/Projects/containers/ProjectDetails/ProjectTasks/ProjectTasksHeader.tsx @@ -7,6 +7,7 @@ import { FinancialProgressBar, FinancialCardText, } from '../components'; +import { useProjectTaskContext } from './ProjectTaskProvider'; import { calculateStatus } from '@/utils'; /** @@ -14,9 +15,14 @@ import { calculateStatus } from '@/utils'; * @returns */ export function ProjectTasksHeader() { + const { project } = useProjectTaskContext(); + return ( - + 0% of project estimate diff --git a/src/containers/Projects/containers/ProjectDetails/ProjectTasks/components.tsx b/src/containers/Projects/containers/ProjectDetails/ProjectTasks/components.tsx index 1f5d380e5..9e74e0e31 100644 --- a/src/containers/Projects/containers/ProjectDetails/ProjectTasks/components.tsx +++ b/src/containers/Projects/containers/ProjectDetails/ProjectTasks/components.tsx @@ -37,9 +37,16 @@ export function TaskAccessor(row) { {row.charge_type === 'hourly_rate' - ? row.rate + ' / hour' - : row.charge_type} - {row.estimate_minutes} estimated + ? intl.get('project_task.rate', { + rate: row.rate, + }) + : intl.get(row.charge_type)} + + {row.estimate_minutes && + intl.get('project_task.estimate_minutes', { + estimate_minutes: row.estimate_minutes, + })} + ); @@ -55,7 +62,6 @@ const TaskHeader = styled.div` `; const TaskTitle = styled.span` font-weight: 500; - /* margin-right: 12px; */ line-height: 1.5rem; `; const TaskContent = styled.div` @@ -67,8 +73,5 @@ const TaskContent = styled.div` line-height: 1.2rem; `; const TaskDescription = styled.span` - &::before { - content: '•'; - margin: 0.3rem; - } + margin: 0.3rem; `; diff --git a/src/containers/Projects/containers/ProjectTaskFormDialog/ProjectTaskForm.tsx b/src/containers/Projects/containers/ProjectTaskFormDialog/ProjectTaskForm.tsx index 6df0a988b..831cc4f1f 100644 --- a/src/containers/Projects/containers/ProjectTaskFormDialog/ProjectTaskForm.tsx +++ b/src/containers/Projects/containers/ProjectTaskFormDialog/ProjectTaskForm.tsx @@ -7,14 +7,14 @@ import { CreateProjectTaskFormSchema } from './ProjectTaskForm.schema'; import { useProjectTaskFormContext } from './ProjectTaskFormProvider'; import ProjectTaskFormContent from './ProjectTaskFormContent'; import withDialogActions from '@/containers/Dialog/withDialogActions'; - +import { transformToValue } from './utils'; import { compose, transformToForm } from '@/utils'; const defaultInitialValues = { name: '', charge_type: 'fixed_price', estimate_minutes: '', - cost_estimate: '', + cost_estimate: 0, rate: '0.00', }; @@ -45,7 +45,7 @@ function ProjectTaskForm({ // Handles the form submit. const handleFormSubmit = (values, { setSubmitting, setErrors }) => { - const form = { ...values }; + const form = transformToValue(values); // Handle request response success. const onSuccess = (response) => { @@ -67,7 +67,7 @@ function ProjectTaskForm({ data: { errors }, }, }) => { - setSubmitting(false); + setSubmitting(false); }; if (isNewMode) { createProjectTaskMutate([projectId, form]).then(onSuccess).catch(onError); diff --git a/src/containers/Projects/containers/ProjectTaskFormDialog/utils.tsx b/src/containers/Projects/containers/ProjectTaskFormDialog/utils.tsx index 5c1e0416c..2825c5554 100644 --- a/src/containers/Projects/containers/ProjectTaskFormDialog/utils.tsx +++ b/src/containers/Projects/containers/ProjectTaskFormDialog/utils.tsx @@ -32,6 +32,28 @@ export function EstimateAmount() { ); } +export function transformToValue(values) { + switch (values.charge_type) { + case 'hourly_rate': { + return { + ...values, + cost_estimate: values.estimate_minutes * values.rate, + }; + } + case 'fixed_price': { + return { + ...values, + cost_estimate: values.rate, + }; + } + default: { + return { + ...values, + }; + } + } +} + const EstimatedAmountBase = styled.div` display: flex; justify-content: flex-end; diff --git a/src/lang/en/index.json b/src/lang/en/index.json index d70c68bfc..2ecb5a4dc 100644 --- a/src/lang/en/index.json +++ b/src/lang/en/index.json @@ -2063,9 +2063,9 @@ "projects.dialog.edit_project": "Edit Project", "projects.alert.delete_message": "The deleted project has been deleted successfully.", "projects.alert.once_delete_this_project": "Once you delete this project, you won't be able to restore it later. Are you sure you want to delete this project?", - "projects.empty_status.title":"", - "projects.empty_status.description":"", - "projects.empty_status.action":"New Project", + "projects.empty_status.title": "", + "projects.empty_status.description": "", + "projects.empty_status.action": "New Project", "project_task.dialog.new_task": "New Task", "project_task.dialog.edit_task": "Edit Task", "project_task.dialog.task_name": "Task Name", @@ -2076,10 +2076,16 @@ "project_task.dialog.hourly_rate": "Hourly rate", "project_task.dialog.fixed_price": "Fixed price", "project_task.dialog.non_chargeable": "Non-chargeable", - "project_task.dialog.success_message":"The task has been created successfully.", - "project_task.dialog.edit_success_message":"The task has been created successfully.", + "project_task.dialog.success_message": "The task has been created successfully.", + "project_task.dialog.edit_success_message": "The task has been created successfully.", "project_task.action.edit_task": "Edit Task", "project_task.action.delete_task": "Delete Task", + "project_task.rate": "{rate} /hour", + "project_task.estimate_minutes": "• {estimate_minutes}h 0m estimated", + "project_task.alert.delete_message": "The deleted task has been deleted successfully.", + "project_task.alert.once_delete_this_project": "Once you delete this task, you won't be able to restore it later. Are you sure you want to delete this task?", + "fixed_price": "Fixed price", + "non_chargeable": "Non-chargeable", "project.schema.label.contact": "Contact", "project.schema.label.project_name": "Project name", "project.schema.label.deadline": "Deadline",