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",