Compare commits

..

10 Commits

9 changed files with 157 additions and 58 deletions
+1 -1
View File
@@ -77,7 +77,7 @@ export default function FamilyTable({
> >
<td className="py-4"> <td className="py-4">
<div className="flex space-x-2 items-center w-full"> <div className="flex space-x-2 items-center w-full">
<div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center flex-[0.1]"> <div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center">
<img <img
// src={profile_picture} // src={profile_picture}
src={image || profile_picture || localImgLoad(`images/icons/${banner}`)} src={image || profile_picture || localImgLoad(`images/icons/${banner}`)}
+1 -1
View File
@@ -16,7 +16,7 @@ export default function ModalCom({ action, children, situation, isOpen, classNam
onClick={action || isOpen} onClick={action || isOpen}
className="fixed top-0 left-0 w-full lg:h-[100vh] h-full bg-black bg-opacity-40 backdrop-filter backdrop-blur-sm z-50" className="fixed top-0 left-0 w-full lg:h-[100vh] h-full bg-black bg-opacity-40 backdrop-filter backdrop-blur-sm z-50"
></div> ></div>
<div className={`children-element fixed lg:h-100vh h-full z-[99999999999999] w-full lg:w-auto ${className}`}> <div className={`fixed lg:h-100vh h-full z-[99999999999999] w-full lg:w-auto inset-0 flex flex-col justify-center items-center ${className}`}>
{children && children} {children && children}
</div> </div>
</div> </div>
+10 -5
View File
@@ -20,7 +20,7 @@ export default function JobGroups() {
members: [] members: []
}) })
const [selectedGroup, setSelectedGroup] = useState({id:'', data: []}) const [selectedGroup, setSelectedGroup] = useState({id:'', name:'', data: []})
const changeSelectedGroup = (e) => { const changeSelectedGroup = (e) => {
let groupID = e.target.value let groupID = e.target.value
@@ -42,10 +42,15 @@ export default function JobGroups() {
return return
} }
setGroupList({loading: false, groups: data.result_list, members: data.result_list_member}) setGroupList({loading: false, groups: data.result_list, members: data.result_list_member})
let activeGroupId = data.result_list[0].group_id if(selectedGroup.id == ''){
let activeGroup = data.result_list[0].group_name let activeGroupId = data.result_list[0].group_id
let activeMembers = data.result_list_member?.filter(item => item.group_id == activeGroupId) let activeGroup = data.result_list[0].group_name
setSelectedGroup({id: activeGroupId, name:activeGroup, data:activeMembers}) let activeMembers = data.result_list_member?.filter(item => item.group_id == activeGroupId)
setSelectedGroup({id: activeGroupId, name:activeGroup, data:activeMembers})
}else{
let activeMembers = data.result_list_member?.filter(item => item.group_id == selectedGroup?.id)
setSelectedGroup({id: selectedGroup?.id, name:selectedGroup?.name, data:activeMembers})
}
}).catch(error => { }).catch(error => {
setGroupList({loading: false, groups: [], members: []}) setGroupList({loading: false, groups: [], members: []})
console.log(error) console.log(error)
+1 -1
View File
@@ -87,7 +87,7 @@ export default function Layout({ children }) {
</div> </div>
{logoutModal && ( {logoutModal && (
<ModalCom action={logoutModalHandler} situation={logoutModal}> <ModalCom action={logoutModalHandler} situation={logoutModal}>
<div className="logout-modal-wrapper lg:w-[460px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl"> <div className="logout-modal-wrapper w-11/12 sm:w-[460px] bg-white dark:bg-dark-white lg:rounded-2xl">
<div className="logout-modal-header 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 dark:border-[#5356fb29] "> <div className="logout-modal-header 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 dark:border-[#5356fb29] ">
<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">
Confirm Confirm
+1 -1
View File
@@ -63,7 +63,7 @@ function DeleteJobPopout({ details, onClose, situation }) {
return ( return (
<ModalCom action={onClose} situation={situation}> <ModalCom action={onClose} situation={situation}>
<div className="logout-modal-wrapper lg:w-[600px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl"> <div className="logout-modal-wrapper lg:w-[600px] bg-white dark:bg-dark-white lg:rounded-2xl">
<div className="logout-modal-header w-full flex items-center justify-between lg:px-10 lg:py-8 px-[30px] py-[23px] border-b border-light-purple dark:border-[#5356fb29] "> <div className="logout-modal-header w-full flex items-center justify-between lg:px-10 lg:py-8 px-[30px] py-[23px] border-b border-light-purple dark:border-[#5356fb29] ">
<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">
Delete Job Delete Job
+2 -2
View File
@@ -215,8 +215,8 @@ const EditJobPopOut = ({
const isWindows = /Windows/.test(navigator.userAgent); const isWindows = /Windows/.test(navigator.userAgent);
return ( return (
<ModalCom action={onClose} situation={situation} className="edit-popup"> <ModalCom action={onClose} situation={situation}>
<div className="logout-modal-wrapper lg:w-[600px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl"> <div className="logout-modal-wrapper w-11/12 lg:w-[600px] bg-white dark:bg-dark-white lg:rounded-2xl">
<div className="logout-modal-header w-full flex items-center justify-between lg:px-10 lg:py-8 px-[30px] py-[23px] border-b border-light-purple dark:border-[#5356fb29] "> <div className="logout-modal-header w-full flex items-center justify-between lg:px-10 lg:py-8 px-[30px] py-[23px] border-b border-light-purple dark:border-[#5356fb29] ">
<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">
Edit Job Edit Job
+137 -43
View File
@@ -23,8 +23,14 @@ const validationSchema = Yup.object().shape({
}); });
function JobListPopout({ details, onClose, situation }) { function JobListPopout({ details, onClose, situation }) {
const [selectedTab, setSelectedTab] = useState('public')
const tabs = ['public', 'individual', 'group']
const dispatch = useDispatch() const dispatch = useDispatch()
const [requestStatus, setRequestStatus] = useState({message:'', status:false})
const [familyList, setFamilyList] = useState([]); const [familyList, setFamilyList] = useState([]);
let [loader, setLoader] = useState({ let [loader, setLoader] = useState({
member: false, member: false,
@@ -96,7 +102,7 @@ const dispatch = useDispatch()
else if (name === "individual") else if (name === "individual")
setErrMsg({ jobFields: { individual: "please enter email" } }); setErrMsg({ jobFields: { individual: "please enter email" } });
else if (name === "group") else if (name === "group")
setErrMsg({ jobFields: { group: "please select a family member" } }); setErrMsg({ jobFields: { group: "please select a group" } });
} finally { } finally {
setTimeout(() => { setTimeout(() => {
setErrMsg({ jobFields: "" }); setErrMsg({ jobFields: "" });
@@ -150,9 +156,12 @@ const dispatch = useDispatch()
// for group input // for group input
reqData = { reqData = {
...jobReq, ...jobReq,
email: values?.individual, email: '',
group_id: values?.group,
action: 13025, action: 13025,
assign_mode: 110033, assign_mode: 110044,
duration: details?.timeline_days,
// duration: 0,
}; };
setLoader({ jobFields: { group: true } }); setLoader({ jobFields: { group: true } });
} else { } else {
@@ -161,21 +170,56 @@ const dispatch = useDispatch()
try { try {
const res = await apiCall.assignJobTask(reqData); const res = await apiCall.assignJobTask(reqData);
let { data } = await res; let { status, data } = await res;
setLoader({ jobFields: false }); if(status != 200 || data.internal_return < 0){
setRequestStatus({message:'Unable to complete', status:false})
return setTimeout(()=>{
setLoader({ jobFields: false });
setRequestStatus({message:'', status:false})
},3000)
}
dispatch(tableReload({ type: "JOBTABLE" })); dispatch(tableReload({ type: "JOBTABLE" }));
onClose(); setRequestStatus({message:'Successful', status:true})
throw new Response(data); setTimeout(()=>{
setLoader({ jobFields: false });
onClose();
throw new Response(data);
},3000)
} catch (error) { } catch (error) {
setLoader({ jobFields: false }); setRequestStatus({message:'Unable to complete', status:false})
throw new Error(error); setTimeout(()=>{
setRequestStatus({message:'', status:false})
setLoader({ jobFields: false });
throw new Error(error);
},3000)
} }
}; };
const [groupList, setGroupList] = useState({loading: true, groups: [], members: []})
// FUNCTION TO POPULATE USER GROUP LIST
useEffect(()=>{
// setGroupList({loading: true, groups: [], members: []})
apiCall.jobGroupList({}).then(res => {
const {status, data} = res
if(status != 200 || data?.internal_return < 0){
setGroupList({loading: false, groups: [], members: []})
return
}
if(data.result_list.length < 0){
setGroupList({loading: false, groups: [], members: []})
return
}
setGroupList({loading: false, groups: data.result_list, members: data.result_list_member})
}).catch(error => {
setGroupList({loading: false, groups: [], members: []})
})
},[])
// console.log("Job List P >> ", details) // console.log("Job List P >> ", details)
return ( return (
<ModalCom action={onClose} situation={situation} className="job-popup"> <ModalCom action={onClose} situation={situation} className="">
<div className="logout-modal-wrapper lw-[90%] md:w-[768px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto"> <div className="logout-modal-wrapper w-[90%] md:w-[768px] bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto">
<div className="logout-modal-header w-full flex items-center justify-between lg:p-6 px-[30px] py-[23px] border-b dark:border-[#5356fb29] border-light-purple"> <div className="logout-modal-header w-full flex items-center justify-between lg:p-6 px-[30px] py-[23px] border-b dark:border-[#5356fb29] border-light-purple">
<h1 className="text-base md:text-lg font-bold text-dark-gray dark:text-white tracking-wide"> <h1 className="text-base md:text-lg font-bold text-dark-gray dark:text-white tracking-wide">
{details.title} {details.title}
@@ -250,6 +294,20 @@ const dispatch = useDispatch()
{/* ACTION SECTION */} {/* ACTION SECTION */}
<div className="p-4 w-full md:w-2/4 h-full"> <div className="p-4 w-full md:w-2/4 h-full">
<div className="grid grid-cols-3 my-4 border-b-2">
{tabs.map(item => (
<button
className={`px-4 py-1 rounded-t-2xl ${selectedTab == item ? 'btn-gradient border-[2px] text-white' : 'bg-white text-[#000] border-t-[2px]'}`}
value={item}
name={item}
onClick={()=>setSelectedTab(item)}
>
{item[0].toUpperCase() + item.slice(1)}
</button>
))}
</div>
{selectedTab == 'family' &&
<Formik <Formik
initialValues={initialValues} initialValues={initialValues}
validationSchema={validationSchema.fields.family} validationSchema={validationSchema.fields.family}
@@ -267,20 +325,22 @@ const dispatch = useDispatch()
data={familyList} data={familyList}
btnText="Assign to family" btnText="Assign to family"
optionText="Select Family" optionText="Select Family"
loader={loader?.jobFields.family} loader={loader?.jobFields?.family}
errorHandler={errorHandler} errorHandler={errorHandler}
/> />
<p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide"> <p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide">
{" "} {" "}
{props?.values.family === "" && ( {props?.values?.family === "" && (
<span>{errMsg.jobFields.family}</span> <span>{errMsg?.jobFields?.family}</span>
)} )}
</p>{" "} </p>{" "}
</Form> </Form>
); );
}} }}
</Formik> </Formik>
}
{selectedTab == 'public' &&
<Formik <Formik
initialValues={initialValues} initialValues={initialValues}
validationSchema={validationSchema.fields.public} validationSchema={validationSchema.fields.public}
@@ -298,20 +358,22 @@ const dispatch = useDispatch()
data={publicArray} data={publicArray}
btnText="Show Task to Public" btnText="Show Task to Public"
optionText="Select Duration" optionText="Select Duration"
loader={loader?.jobFields.public} loader={loader?.jobFields?.public}
errorHandler={errorHandler} errorHandler={errorHandler}
/> />
<p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide"> <p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide">
{" "} {" "}
{props?.values.public === "" && ( {props?.values.public === "" && (
<span>{errMsg.jobFields.public}</span> <span>{errMsg?.jobFields?.public}</span>
)} )}
</p>{" "} </p>{" "}
</Form> </Form>
); );
}} }}
</Formik> </Formik>
}
{selectedTab == 'individual' &&
<Formik <Formik
initialValues={initialValues} initialValues={initialValues}
validationSchema={validationSchema.fields.individual} validationSchema={validationSchema.fields.individual}
@@ -329,21 +391,23 @@ const dispatch = useDispatch()
placeholder="Enter email of individual" placeholder="Enter email of individual"
inputHandler={props?.handleChange} inputHandler={props?.handleChange}
btnText="Send Offer to Individual" btnText="Send Offer to Individual"
loader={loader?.jobFields.individual} loader={loader?.jobFields?.individual}
errorHandler={errorHandler} errorHandler={errorHandler}
/> />
<p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide"> <p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide">
{" "} {" "}
{props?.values.individual === "" && ( {props?.values.individual === "" && (
<span>{errMsg.jobFields.individual}</span> <span>{errMsg?.jobFields?.individual}</span>
)} )}
</p>{" "} </p>{" "}
</Form> </Form>
); );
}} }}
</Formik> </Formik>
}
{ process.env.REACT_APP_SHOW_OFFER_GROUP_JOB != 0 && {/* { process.env.REACT_APP_SHOW_OFFER_GROUP_JOB != 0 && } */}
{selectedTab == 'group' &&
<Formik <Formik
initialValues={initialValues} initialValues={initialValues}
validationSchema={validationSchema.fields.group} validationSchema={validationSchema.fields.group}
@@ -359,14 +423,15 @@ const dispatch = useDispatch()
inputName="group" inputName="group"
value={props?.values.group} value={props?.values.group}
btnText="Send Order to Group" btnText="Send Order to Group"
optionText="Group" optionText="Select Group"
loader={loader?.jobFields.group} loader={loader?.jobFields?.group}
errorHandler={errorHandler} errorHandler={errorHandler}
data={groupList}
/> />
<p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide"> <p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide">
{" "} {" "}
{props?.values.group === "" && ( {props?.values.group === "" && (
<span>{errMsg.jobFields.group}</span> <span>{errMsg?.jobFields?.group}</span>
)} )}
</p> </p>
</Form> </Form>
@@ -374,6 +439,10 @@ const dispatch = useDispatch()
}} }}
</Formik> </Formik>
} }
{requestStatus.message &&
<p className={`mt-4 w-full text-lg ${requestStatus.status ? 'text-emerald-600' : 'text-red-600'}`}>{requestStatus.message}</p>
}
</div> </div>
{/* END OF ACTION SECTION */} {/* END OF ACTION SECTION */}
</div> </div>
@@ -427,27 +496,52 @@ const JobFieldInput = ({
className={`input-field placeholder:text-base text-dark-gray w-full h-full bg-white outline-none px-2`} className={`input-field placeholder:text-base text-dark-gray w-full h-full bg-white outline-none px-2`}
value={value} value={value}
> >
<option value="">{optionText}</option> {/* <option value="">{optionText}</option> */}
{Array.isArray(data) && {(inputName == 'family' || inputName == 'public') &&
data?.map((item, idx) => ( Array.isArray(data) &&
<React.Fragment key={idx}> <>
{inputName === "family" && item?.last_login !== "" && ( <option value="">{optionText}</option>
<option value={item?.family_uid} key={idx}> { data?.map((item, idx) => (
{`${item?.firstname} ${item?.lastname}`} <React.Fragment key={idx}>
{inputName === "family" && item?.last_login !== "" && (
<option value={item?.family_uid} key={idx}>
{`${item?.firstname} ${item?.lastname}`}
</option>
)}
{inputName === "public" && (
<option value={item?.duration} key={idx}>
{item?.name}
</option>
)}
{/* {inputName === "group" && (
<option value={item?.group_id} key={idx}>
{item?.group_name}
</option>
)} */}
</React.Fragment>
))}
</>
}
{(inputName == 'group') &&
<>
{data.loading ?
<option value={''}>
Loading...
</option>
: data?.groups?.length > 0 ?
<>
<option value="">{optionText}</option>
{ data?.groups?.map((item, index)=>(
<option value={item?.group_id} key={index}>
{item?.group_name}
</option> </option>
)} ))}
{inputName === "public" && ( </>
<option value={item?.duration} key={idx}> :
{item?.name} <option value="">No Group Found</option>
</option> }
)} </>
{inputName === "group" && ( }
<option value={item?.family_uid} key={idx}>
{item?.firstname}
</option>
)}
</React.Fragment>
))}
</Field> </Field>
</div> </div>
</div> </div>
@@ -133,8 +133,8 @@ function PendingJobsPopout({ details, onClose, situation }) {
}; };
return ( return (
<ModalCom action={onClose} situation={situation} className="edit-popup"> <ModalCom action={onClose} situation={situation}>
<div className="logout-modal-wrapper lw-[90%] md:w-[768px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto"> <div className="logout-modal-wrapper w-[90%] md:w-[768px] bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto">
<div className="logout-modal-header w-full flex items-center justify-between lg:p-6 px-[30px] py-[23px] border-b dark:border-[#5356fb29] border-light-purple"> <div className="logout-modal-header w-full flex items-center justify-between lg:p-6 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">
Manage Pending Item Manage Pending Item
+2 -2
View File
@@ -4,8 +4,8 @@ import ModalCom from "../components/Helpers/ModalCom";
function AddJobPage({ action, situation, categories }) { function AddJobPage({ action, situation, categories }) {
return ( return (
<ModalCom action={action} situation={situation} className="edit-popup"> <ModalCom action={action} situation={situation}>
<div className="lg:w-[600px] w-full lg:overflow-hidden lg:rounded-2xl bg-white dark:bg-dark-white dark:text-white"> <div className="lg:w-[600px] w-11/12 lg:overflow-hidden lg:rounded-2xl bg-white dark:bg-dark-white dark:text-white">
<div className="heading flex justify-between items-center py-6 md:px-[30px] px-[23px] border-b border-light-purple dark:border-[#5356fb29] "> <div className="heading flex justify-between items-center py-6 md:px-[30px] px-[23px] border-b border-light-purple dark:border-[#5356fb29] ">
<p className="text-26 font-bold text-dark-gray dark:text-white tracking-wide"> <p className="text-26 font-bold text-dark-gray dark:text-white tracking-wide">
Create New Job Create New Job