Compare commits

...

7 Commits

Author SHA1 Message Date
victorAnumudu 9e6b59624f Delivery detail bug fixed 2023-07-01 01:01:37 +01:00
ameye 1b6b4f17b0 Merge branch 'assign-task-revamp' of WrenchBoard/Users-Wrench into master 2023-06-30 23:12:55 +00:00
victorAnumudu 8a9ec35994 Assign family task API consumed 2023-07-01 00:06:22 +01:00
tokslaw fa2102eb61 Merge branch 'resources-page' of WrenchBoard/Users-Wrench into master 2023-06-30 18:21:38 +00:00
tokslaw bf73461c64 Merge branch 'price-fix' of WrenchBoard/Users-Wrench into master 2023-06-30 18:21:25 +00:00
Ebube 5a0d8aebdb 1280 width fixed 2023-06-30 13:48:52 +01:00
Ebube e8ed10ddbf Added link to Family Market 2023-06-30 13:28:44 +01:00
5 changed files with 157 additions and 47 deletions
@@ -7,15 +7,66 @@ import { PriceFormatter } from '../../Helpers/PriceFormatter'
function AssignTaskPopout({action, situation, familyDetails}) { function AssignTaskPopout({action, situation, familyDetails}) {
const apiCall = new usersService() const apiCall = new usersService()
let [requestStatus, setRequestStatus] = useState({loading: false, status: false, message: ''}) // HOLDS RESPONSE FOR SENDING API REQUEST
let [familyTask, setFamilyTask] = useState({loading: true, data: []}) let [familyTask, setFamilyTask] = useState({loading: true, data: []})
let [activeTask, setActiveTask] = useState({id: 0, data: {}}) let [taskType, setTaskType] = useState('select') // SWITCHES BTW SELECT TASK AND NEW TASK
console.log('TESTING',activeTask.data)
const handleActiveTask = (id=0, data={}) => { let [activeTask, setActiveTask] = useState({id: 0, data: {}}) // HOLDS SELECTED TASK
const switchTaskType = ({target:{value}}) => { // FUNCTION TO CHANGE SELECTED ACTIVE TASK
setTaskType(value)
}
const handleActiveTask = (id=0, data={}) => { // FUNCTION TO CHANGE SELECTED ACTIVE TASK
setActiveTask({id, data}) setActiveTask({id, data})
} }
const assignFamilyTask = () => {
setRequestStatus({loading: true, status: false, message: ''})
let reqData = {}
if(taskType == 'select'){ // RUNS HERE IF TASK TYPE IS SELECT
if(!Object.keys(activeTask.data).length){
setRequestStatus({loading: false, status: false, message: 'No Task is seleted'})
return setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
}, 3000)
}
reqData = { // API PAYLOADS
job_id: activeTask.data?.job_id,
job_uid: activeTask.data?.job_uid,
family_uid: familyDetails.uid,
job_description: activeTask.data?.description,
assign_mode: 110011,
}
apiCall.assignFamilyTask(reqData).then(res => {
if(res.status != 200 || res.data.internal_return < 0){
setRequestStatus({loading: false, status: false, message: 'failed to assign task'})
return setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
}, 5000)
}
setRequestStatus({loading: false, status: true, message: 'action successful'})
setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
action() // FUNCTION THAT CLOSES THE MODAL BOX
}, 5000)
}).catch(err => {
setRequestStatus({loading: false, status: false, message: 'An Error occured, try again'})
setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
}, 5000)
})
}
if(taskType == 'new'){ // RUNS HERE IF TASK TYPE IS NEW TASK
console.log('TESTING')
}
}
useEffect(()=>{ useEffect(()=>{
const reqData = { const reqData = {
limit: 30, limit: 30,
@@ -25,7 +76,9 @@ console.log('TESTING',activeTask.data)
} }
apiCall.getMyJobList(reqData).then(res => { apiCall.getMyJobList(reqData).then(res => {
setFamilyTask({loading: false, data: res?.data?.result_list}) setFamilyTask({loading: false, data: res?.data?.result_list})
setActiveTask(prev => ({...prev, data:res?.data?.result_list[0]})) if(res?.data?.result_list?.length){
setActiveTask(prev => ({...prev, data:res?.data?.result_list[0]}))
}
}).catch(err => { }).catch(err => {
setFamilyTask({loading: false, data: []}) setFamilyTask({loading: false, data: []})
console.log('Error', err) console.log('Error', err)
@@ -37,7 +90,7 @@ console.log('TESTING',activeTask.data)
action={action} action={action}
situation={situation} situation={situation}
> >
<div className="w-full h-full lg:min-w-[700px] lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl"> <div className="w-full h-full lg:w-[700px] lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl">
<div className="w-full flex items-center justify-between lg:px-10 lg:py-8 px-[30px] py-[23px] border-b dark:border-[#5356fb29] border-light-purple"> <div className="w-full flex items-center justify-between lg:px-10 lg:py-8 px-[30px] py-[23px] border-b dark:border-[#5356fb29] border-light-purple">
<h1 className="text-26 font-bold text-dark-gray dark:text-white tracking-wide"> <h1 className="text-26 font-bold text-dark-gray dark:text-white tracking-wide">
Assign task to {familyDetails?.firstname} Assign task to {familyDetails?.firstname}
@@ -69,55 +122,64 @@ console.log('TESTING',activeTask.data)
</button> </button>
</div> </div>
{familyTask.loading ? {familyTask.loading ?
<div className='h-[100px] flex justify-center items-center'> <div className='h-[100px] w-full flex justify-center items-center'>
<LoadingSpinner color='sky-blue' size='16' /> <LoadingSpinner color='sky-blue' size='16' />
</div> </div>
: :
familyTask.data.length ?
<> <>
<div className="job-action-modal-body w-full md:grid md:grid-cols-2"> <div className="job-action-modal-body w-full md:grid md:grid-cols-2">
<div className="p-4"> <div className="p-4">
<div className="mb-2 w-full flex items-center gap-4"> <div className="mb-2 w-full flex items-center gap-4">
<div className="flex items-center gap-2 text-sky-blue text-base"> <div className="flex items-center gap-2 text-sky-blue text-base">
<input type="radio" name='task-type' className="w-[20px] h-[20px]" /><span>Select Task</span> <input type="radio" name='task-type' value='select' className="w-[20px] h-[20px] cursor-pointer" checked={taskType=='select'} onChange={switchTaskType}/>
<span>Select Task</span>
</div> </div>
<div className="flex items-center gap-2 text-sky-blue text-base"> <div className="flex items-center gap-2 text-sky-blue text-base">
<input type="radio" name='task-type' className="w-[20px] h-[20px]" /><span>New Task</span> <input type="radio" name='task-type' value='new' className="w-[20px] h-[20px] cursor-pointer" checked={taskType=='new'} onChange={switchTaskType}/>
<span>New Task</span>
</div> </div>
</div> </div>
<div className='p-4 w-full h-[400px] overflow-y-auto bg-slate-100'> <div className='p-4 w-full h-[400px] overflow-y-auto bg-slate-100'>
{familyTask?.data?.map((item, index)=>( {
<div key={item.job_uid} className="mb-2 flex justify-start items-center gap-2 text-sky-blue text-base cursor-pointer" onClick={()=>handleActiveTask(item.job_uid, item)}> taskType == 'select' ?
<input familyTask?.data?.length ?
type="radio" familyTask?.data?.map((item, index)=>(
name='task-list' <div key={item.job_uid} className="mb-2 flex justify-start items-center gap-2 text-sky-blue text-base cursor-pointer" onClick={()=>handleActiveTask(item.job_uid, item)}>
checked={(activeTask.id == item.job_uid) || (activeTask.id==index)&& true} <input
onChange={()=>handleActiveTask(item.job_uid, item)} type="radio"
className="w-[15px] h-[15px] cursor-pointer" name='task-list'
/> checked={(activeTask.id == item.job_uid) || (activeTask.id==index)&& true}
<p className="text-dark-gray tracking-wide">{item?.title}</p> onChange={()=>handleActiveTask(item.job_uid, item)}
</div> className="w-[15px] h-[15px] cursor-pointer"
)) />
<p className="text-dark-gray tracking-wide">{item?.title}</p>
</div>
))
:
<p className="p-8 text-lg text-dark-gray dark:text-white tracking-wide text-center">No Task found!</p>
:
<p className="p-8 text-lg text-dark-gray dark:text-white tracking-wide text-center">SPACE FOR NEW TASK</p>
} }
</div> </div>
</div> </div>
{familyTask?.data?.length > 0 ?
<div className="p-4"> <div className="p-4">
<div className="w-full"> <div className="w-full">
<p className="text-lg font-bold text-dark-gray dark:text-white tracking-wide border-b-2">{activeTask?.data?.title}</p> <p className="text-lg font-bold text-dark-gray dark:text-white tracking-wide border-b-2">{activeTask?.data?.title}</p>
<div className="my-3 sm:flex items-center"> <div className="my-3">
<Detail label="Description" value={activeTask?.data?.description} /> <Detail label="Description" value={activeTask?.data?.description} />
</div> </div>
<div className='flex items-center'>
<div className="my-3 w-full flex items-center gap-1">
<label className='text-slate-900 dark:text-white tracking-wide font-semibold'>Price</label>
<p className='p-1 text-sm text-slate-900 dark:text-white'>{PriceFormatter(activeTask?.data?.price*0.01, activeTask?.data?.currency, activeTask?.data?.curreny_code)}</p>
</div>
<div className="my-3 sm:flex items-center"> <div className="my-3 w-full flex items-center gap-1">
<Detail label="Price" value={PriceFormatter(activeTask?.data?.price*0.01, activeTask?.data?.currency, activeTask?.data?.curreny_code)} /> <label className='text-slate-900 dark:text-white tracking-wide font-semibold'>Timeline</label>
</div> <p className='p-1 text-sm text-slate-900 dark:text-white'>{`${activeTask?.data?.timeline_days} day(s)`}</p>
</div>
<div className="my-3 sm:flex items-center">
<Detail
label="Timeline"
value={`${activeTask?.data?.timeline_days} day(s)`}
/>
</div> </div>
<div className="my-3 sm:flex items-center"> <div className="my-3 sm:flex items-center">
@@ -135,30 +197,62 @@ console.log('TESTING',activeTask.data)
className={`p-1 w-full text-sm text-slate-900 outline-none border border-slate-300 rounded-md`} className={`p-1 w-full text-sm text-slate-900 outline-none border border-slate-300 rounded-md`}
rows="5" rows="5"
style={{ resize: "none" }} style={{ resize: "none" }}
defaultValue={activeTask?.data?.job_detail} value={activeTask?.data?.job_detail}
readOnly
// onChange={handleInputChange} // onChange={handleInputChange}
/> />
{/* <p>{errMsg.deliveryDetail}</p> */} {/* <p>{}</p> */}
</div> </div>
</div> </div>
</div> </div>
:
<></>
}
</div> </div>
{/* BTN */} {/* BTN */}
<div className='p-2 border-t-2 flex justify-end items-center gap-3'> <div className='p-2 border-t-2 flex justify-end items-center gap-3'>
<button onClick={action} type="button" className="w-20 h-11 flex justify-center items-center border-gradient text-base rounded-full text-white"> {/* error or success display */}
<span className='text-gradient'>Close</span> {requestStatus.message != "" &&
</button> (!requestStatus.status ? (
<div
className={`relative p-2 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
) : (
requestStatus.status && (
<div
className={`relative p-2 text-green-700 bg-slate-200 border-slate-800 mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
)
))}
{/* End of error or success display */}
<button
disabled={requestStatus.loading}
onClick={action} type="button"
className="w-20 h-11 flex justify-center items-center border-gradient text-base rounded-full text-white cursor-pointer"
>
<span className='text-gradient'>Close</span>
</button>
<div className=''>
{requestStatus.loading ?
<LoadingSpinner color='sky-blue' size='8' />
:
<button <button
type="button" type="button"
className="px-1 w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white" disabled={requestStatus.loading}
onClick={assignFamilyTask}
className="px-1 w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white cursor-pointer"
> >
Assign Assign
</button> </button>
}
</div>
</div> </div>
</> </>
:
<p className="p-8 text-lg text-dark-gray dark:text-white tracking-wide text-center">No Task found!</p>
} }
</div> </div>
</ModalCom> </ModalCom>
+1 -2
View File
@@ -3,11 +3,10 @@ import slider2 from "../../assets/images/slider-2.jpg";
import HomeBannerOffersCard from "../Cards/HomeBannerOffersCard"; import HomeBannerOffersCard from "../Cards/HomeBannerOffersCard";
export default function HomeSliders(props) { export default function HomeSliders(props) {
// console.log("BANNER LIST IN HomeSliders->", props.bannerList);
// debugger; // debugger;
return ( return (
<> <>
<div className="hero-slider relative 2xl:w-[600px] xl:w-[500px] lg:w-[420px] w-full mb-2 lg:mb-0 "> <div className="hero-slider relative 2xl:w-[600px] xl:w-[400px] lg:w-[420px] w-full mb-2 lg:mb-0 ">
<div className="w-full"> <div className="w-full">
<SliderCom settings={props.settings}> <SliderCom settings={props.settings}>
{props.bannerList?.length <= 0 && ( {props.bannerList?.length <= 0 && (
+2 -2
View File
@@ -8,7 +8,7 @@ import { PriceFormatter } from "../Helpers/PriceFormatter";
const noTasksBg = require("../../assets/images/no-task-background.jpg"); const noTasksBg = require("../../assets/images/no-task-background.jpg");
export default function MyJobTable({ className, ActiveJobList }) { export default function MyJobTable({ className, ActiveJobList, Account }) {
let navigate = useNavigate(); let navigate = useNavigate();
let { pathname } = useLocation(); let { pathname } = useLocation();
@@ -30,7 +30,7 @@ export default function MyJobTable({ className, ActiveJobList }) {
const navigateMarket = () => { const navigateMarket = () => {
setBtnLoader(true); setBtnLoader(true);
setTimeout(() => { setTimeout(() => {
navigate("/market", { replace: true }); navigate(Account == "FULL" ? "/market" : "/", { replace: true });
setBtnLoader(false); setBtnLoader(false);
}, 2500); }, 2500);
}; };
+7 -3
View File
@@ -1,16 +1,20 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { Link } from "react-router-dom";
import Layout from "../Partials/Layout"; import Layout from "../Partials/Layout";
import MyJobTable from "./MyJobTable"; import MyJobTable from "./MyJobTable";
import CommonHead from "../UserHeader/CommonHead"; import CommonHead from "../UserHeader/CommonHead";
import TopSellerTopBuyerSliderSection from "../Home/TopSellerTopBuyerSliderSection"; // import TopSellerTopBuyerSliderSection from "../Home/TopSellerTopBuyerSliderSection";
import MyOffersTable from "./MyOffersTable"; import MyOffersTable from "./MyOffersTable";
import { useSelector } from "react-redux";
export default function MyTasks({ export default function MyTasks({
MyActiveOffersList, MyActiveOffersList,
ActiveJobList, ActiveJobList,
commonHeadData, commonHeadData,
}) { }) {
const { userDetails: account_type } = useSelector(
(state) => state?.userDetails
);
const [selectTab, setValue] = useState("today"); const [selectTab, setValue] = useState("today");
const filterHandler = (value) => { const filterHandler = (value) => {
setValue(value); setValue(value);
@@ -45,7 +49,7 @@ export default function MyTasks({
className="mb-10" className="mb-10"
/> />
)} )}
<MyJobTable ActiveJobList={ActiveJobList} /> <MyJobTable ActiveJobList={ActiveJobList} Account={account_type} />
</div> </div>
</div> </div>
</Layout> </Layout>
+13
View File
@@ -787,6 +787,19 @@ class usersService {
}; };
return this.postAuxEnd("/offerinterestlistmsg", postData); return this.postAuxEnd("/offerinterestlistmsg", postData);
} }
// FUNCTION TO ASSIGN TASK TO FAMILY MEMBER
assignFamilyTask(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 13025,
...reqData
};
return this.postAuxEnd("/assigntask", postData);
}
/* /*
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username) - 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username)
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(password) - 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(password)