From 3818e05d2f38dfeef5aa098d51a2b88204afdf02 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 13 Jun 2023 14:33:01 +0100 Subject: [PATCH 1/3] pastdue popout component added --- .../JobActions/PastDueJobAction.jsx | 171 +++++++++++++++++- 1 file changed, 168 insertions(+), 3 deletions(-) diff --git a/src/components/MyActiveJobs/JobActions/PastDueJobAction.jsx b/src/components/MyActiveJobs/JobActions/PastDueJobAction.jsx index f1ef05b..c26db4a 100644 --- a/src/components/MyActiveJobs/JobActions/PastDueJobAction.jsx +++ b/src/components/MyActiveJobs/JobActions/PastDueJobAction.jsx @@ -1,6 +1,59 @@ -import React from 'react' +import React,{useState} from 'react' +import ModalCom from '../../Helpers/ModalCom' +import LoadingSpinner from '../../Spinners/LoadingSpinner' + +function PastDueJobAction({jobDetails}) { + + const [checked, setChecked] = useState(false) + + const [extendedTime, setExtendedTime] = useState('') // VALUE OF NEW EXTENDED TIME + + const [action, setAction] = useState('') // VALUE OF NEW EXTENDED TIME + + const [reqStatus, setReqStatus] = useState({loading:false, status: false, message: ''}) + + let [popUp, setPopUp] = useState(false) + + const popUpHandler = () => { + if(popUp){ + setChecked(false) + } + setPopUp(prev => !prev) + } + + // FUNCTION TO HANDLE WHEN USER CLICKS ON SEND FOR REVIEW AND ACCEPTANCE + const cancelTask = () => { + setAction('cancel') + setReqStatus({loading:true, status: false, message: ''}) + + if(!checked){ // CHECKS IF CHECKBOX IS SELECTED + setReqStatus({loading:false, status: false, message: 'Please check the box above'}) + return setTimeout(()=>{ + setReqStatus({loading:false, status: false, message: ''}) + }, 3000) + } + setTimeout(()=>{ + setReqStatus({loading:false, status: false, message: ''}) + }, 3000) + } + + // FUNCTION TO HANDLE WHEN USER CLICKS ON SEND FOR REVIEW AND ACCEPTANCE + const extendTime = () => { + setAction('extend') + setReqStatus({loading:true, status: false, message: ''}) + + if(!extendedTime){ // CHECKS IF EXTENDED TIME IS SELECTED + setReqStatus({loading:false, status: false, message: 'Please select extension duration'}) + return setTimeout(()=>{ + setReqStatus({loading:false, status: false, message: ''}) + }, 3000) + } + + setTimeout(()=>{ + setReqStatus({loading:false, status: false, message: ''}) + }, 3000) + } -function PastDueJobAction() { return (
@@ -20,7 +73,7 @@ function PastDueJobAction() {
-
@@ -28,6 +81,118 @@ function PastDueJobAction() { + + {popUp && ( + +
+
+

+ Past Due Task +

+ +
+
+
+
+ {setChecked(prev => !prev)}} + className='w-6 h-6 text-sky-blue bg-gray-100 focus:ring-sky-blue' + /> +

I am ready to cancel this task

+
+ +
+ {reqStatus.loading && action=='cancel'? + + : + + } +
+ + {/* EXTEND TIMELINE SECTION */} +
+
+

Extend the timeline by:

+ +
+ {reqStatus.loading && action=='extend' ? + + : + +} +
+ + {/* FOR SUCCESS/ERROR DISPLAY SECTION*/} +
+ {reqStatus.message != "" && + (!reqStatus.status ? ( +
+ {reqStatus.message} +
+ ) : ( + reqStatus.status && ( +
+ {reqStatus.message} +
+ ) + ))} +
+ {/* END OF FOR SUCCESS/ERROR DISPLAY SECTION*/} +
+ + {/* cancel btn */} +
+ +
+
+
+
+ )}
) } From 976b4afbbfc6e9c1fe8c8cae1819dee119d7e02a Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 13 Jun 2023 15:28:12 +0100 Subject: [PATCH 2/3] API call for worker task completed added --- .../JobActions/CurrentTaskAction.jsx | 39 ++++++++++++++++--- src/services/UsersService.js | 12 ++++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/components/MyActiveJobs/JobActions/CurrentTaskAction.jsx b/src/components/MyActiveJobs/JobActions/CurrentTaskAction.jsx index 9fb4650..d18c17c 100644 --- a/src/components/MyActiveJobs/JobActions/CurrentTaskAction.jsx +++ b/src/components/MyActiveJobs/JobActions/CurrentTaskAction.jsx @@ -1,10 +1,16 @@ -import React, { useState, useRef } from 'react' +import React, { useState } from 'react' +import { useNavigate } from 'react-router-dom' import ModalCom from '../../Helpers/ModalCom' import LoadingSpinner from '../../Spinners/LoadingSpinner' +import usersService from '../../../services/UsersService' + function CurrentTaskAction({jobDetails}) { + const apiCall = new usersService() + const navigate = useNavigate() + const [checked, setChecked] = useState(false) const [reqStatus, setReqStatus] = useState({loading:false, status: false, message: ''}) @@ -20,16 +26,37 @@ function CurrentTaskAction({jobDetails}) { // FUNCTION TO HANDLE WHEN USER CLICKS ON SEND FOR REVIEW AND ACCEPTANCE const taskCompletedSubmit = () => { - setReqStatus({loading:true, status: false, message: ''}) - if(!checked){ + setReqStatus({loading:true, status: false, message: ''}) // Sets loading spinner active + let reqData = { + contract: jobDetails.contract, + contract_uid: jobDetails.contract_uid, + job_action: 'NOTIFY_COMPLETE', + } + if(!checked){ // checks that checkbox is selected setReqStatus({loading:false, status: false, message: 'Please check the box above'}) return setTimeout(()=>{ setReqStatus({loading:false, status: false, message: ''}) }, 3000) } - setTimeout(()=>{ - setReqStatus({loading:false, status: false, message: ''}) - }, 3000) + + // API CALL TO MARK TASK AS COMPLETED BY WORKER + apiCall.taskCompleted(reqData).then((res)=>{ + if(res.status != 200 || res.data.internal_return < 0){ + setReqStatus({loading:false, status: false, message: 'unable to complete request. Try again'}) + return + } + setReqStatus({loading:false, status: true, message: 'Task marked completed successfully'}) + setTimeout(()=>{ // Sets popout to false and navigates user to /mytask after 3 seconds + popUpHandler() + navigate('/mytask', {replace: true}) + }, 3000) + }).catch(err => { + setReqStatus({loading:false, status: false, message: 'Opps! Network error. Try again'}) + }).finally(()=>{ + setTimeout(()=>{ + setReqStatus({loading:false, status: false, message: ''}) + }, 3000) + }) } return ( diff --git a/src/services/UsersService.js b/src/services/UsersService.js index c7a5d74..fb09739 100644 --- a/src/services/UsersService.js +++ b/src/services/UsersService.js @@ -653,6 +653,18 @@ class usersService { return this.postAuxEnd("/offersresponse", postData); } + // END POINT FOR WORKER TO MARK TASK AS COMPLETED + taskCompleted(reqData) { + var postData = { + uid: localStorage.getItem("uid"), + member_id: localStorage.getItem("member_id"), + sessionid: localStorage.getItem("session_token"), + action: 14015, + ...reqData, + }; + return this.postAuxEnd("/activetaskstatus", postData); + } + /* - 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username) - 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(password) From 392e0394edd114b18d8ad29eb2e16c1107465015 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 13 Jun 2023 16:36:28 +0100 Subject: [PATCH 3/3] API for extend job by owner added --- .../JobActions/PastDueJobAction.jsx | 47 ++++++++++++++----- src/services/UsersService.js | 12 +++++ 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/components/MyActiveJobs/JobActions/PastDueJobAction.jsx b/src/components/MyActiveJobs/JobActions/PastDueJobAction.jsx index c26db4a..58e81db 100644 --- a/src/components/MyActiveJobs/JobActions/PastDueJobAction.jsx +++ b/src/components/MyActiveJobs/JobActions/PastDueJobAction.jsx @@ -1,9 +1,14 @@ import React,{useState} from 'react' import ModalCom from '../../Helpers/ModalCom' import LoadingSpinner from '../../Spinners/LoadingSpinner' +import { useNavigate } from 'react-router-dom' +import usersService from '../../../services/UsersService' function PastDueJobAction({jobDetails}) { + const apiCall = new usersService() + const navigate = useNavigate() + const [checked, setChecked] = useState(false) const [extendedTime, setExtendedTime] = useState('') // VALUE OF NEW EXTENDED TIME @@ -21,7 +26,7 @@ function PastDueJobAction({jobDetails}) { setPopUp(prev => !prev) } - // FUNCTION TO HANDLE WHEN USER CLICKS ON SEND FOR REVIEW AND ACCEPTANCE + // FUNCTION TO HANDLE WHEN OWNER CANCELS JOB const cancelTask = () => { setAction('cancel') setReqStatus({loading:true, status: false, message: ''}) @@ -37,21 +42,41 @@ function PastDueJobAction({jobDetails}) { }, 3000) } - // FUNCTION TO HANDLE WHEN USER CLICKS ON SEND FOR REVIEW AND ACCEPTANCE + // FUNCTION TO HANDLE WHEN USER/OWNER CLICKS ON EXTEND TIMELINE FOR A JOB const extendTime = () => { setAction('extend') - setReqStatus({loading:true, status: false, message: ''}) - - if(!extendedTime){ // CHECKS IF EXTENDED TIME IS SELECTED - setReqStatus({loading:false, status: false, message: 'Please select extension duration'}) + setReqStatus({loading:true, status: false, message: ''}) // Sets loading spinner active + let reqData = { + contract: jobDetails.contract, + contract_uid: jobDetails.contract_uid, + job_action: 'EXTEND_TIMELINE', + duration: Number(extendedTime) + } + if(!extendedTime){ // checks that timeline duration is selected + setReqStatus({loading:false, status: false, message: 'Please select timeline duration'}) return setTimeout(()=>{ setReqStatus({loading:false, status: false, message: ''}) }, 3000) } - - setTimeout(()=>{ - setReqStatus({loading:false, status: false, message: ''}) - }, 3000) + + // API CALL EXTEND TIMELINE BY OWNER + apiCall.extendJobTimeline(reqData).then((res)=>{ + if(res.status != 200 || res.data.internal_return < 0){ + setReqStatus({loading:false, status: false, message: 'unable to complete request. Try again'}) + return + } + setReqStatus({loading:false, status: true, message: 'Timeline extended successfully'}) + setTimeout(()=>{ // Sets popout to false and navigates user to /my-pastdue-jobs after 3 seconds + popUpHandler() + navigate('/my-pastdue-jobs', {replace: true}) + }, 3000) + }).catch(err => { + setReqStatus({loading:false, status: false, message: 'Opps! Network error. Try again'}) + }).finally(()=>{ + setTimeout(()=>{ + setReqStatus({loading:false, status: false, message: ''}) + }, 3000) + }) } return ( @@ -149,7 +174,7 @@ function PastDueJobAction({jobDetails}) { - + {reqStatus.loading && action=='extend' ? diff --git a/src/services/UsersService.js b/src/services/UsersService.js index fb09739..0e802d0 100644 --- a/src/services/UsersService.js +++ b/src/services/UsersService.js @@ -665,6 +665,18 @@ class usersService { return this.postAuxEnd("/activetaskstatus", postData); } + // END POINT FOR OWNER TO EXTEND TIMELINE/DURATON OF JOB + extendJobTimeline(reqData) { + var postData = { + uid: localStorage.getItem("uid"), + member_id: localStorage.getItem("member_id"), + sessionid: localStorage.getItem("session_token"), + action: 14015, + ...reqData, + }; + return this.postAuxEnd("/activejobstatus ", postData); + } + /* - 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username) - 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(password)